From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.20; helo=mga02.intel.com; envelope-from=shenglei.zhang@intel.com; receiver=edk2-devel@lists.01.org Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 75CD4211C384F for ; Wed, 30 Jan 2019 23:08:24 -0800 (PST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga002.jf.intel.com ([10.7.209.21]) by orsmga101.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 30 Jan 2019 23:08:24 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.56,543,1539673200"; d="scan'208";a="130369505" Received: from fmsmsx108.amr.corp.intel.com ([10.18.124.206]) by orsmga002.jf.intel.com with ESMTP; 30 Jan 2019 23:08:23 -0800 Received: from shsmsx153.ccr.corp.intel.com (10.239.6.53) by FMSMSX108.amr.corp.intel.com (10.18.124.206) with Microsoft SMTP Server (TLS) id 14.3.408.0; Wed, 30 Jan 2019 23:08:23 -0800 Received: from shsmsx102.ccr.corp.intel.com ([169.254.2.207]) by SHSMSX153.ccr.corp.intel.com ([169.254.12.190]) with mapi id 14.03.0415.000; Thu, 31 Jan 2019 15:08:21 +0800 From: "Zhang, Shenglei" To: "Ni, Ray" , "edk2-devel@lists.01.org" CC: "Kinney, Michael D" , Mike Turner , "Gao, Liming" Thread-Topic: [edk2] [PATCH v4] MdePkg/BaseLib: Add Base64Encode() and Base64Decode() Thread-Index: AQHUuGUKwIsMFozG2Ee/ggfS+dATU6XHCyeAgAHpjvA= Date: Thu, 31 Jan 2019 07:08:20 +0000 Message-ID: References: <20190130062807.2412-1-shenglei.zhang@intel.com> <6af6f6c9-5293-ceea-2cc4-537078c31690@Intel.com> In-Reply-To: <6af6f6c9-5293-ceea-2cc4-537078c31690@Intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Subject: Re: [PATCH v4] MdePkg/BaseLib: Add Base64Encode() and Base64Decode() X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 31 Jan 2019 07:08:24 -0000 Content-Language: en-US Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 DQo+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tDQo+IEZyb206IE5pLCBSYXkNCj4gU2VudDog V2VkbmVzZGF5LCBKYW51YXJ5IDMwLCAyMDE5IDU6NDkgUE0NCj4gVG86IFpoYW5nLCBTaGVuZ2xl aSA8c2hlbmdsZWkuemhhbmdAaW50ZWwuY29tPjsgZWRrMi1kZXZlbEBsaXN0cy4wMS5vcmcNCj4g Q2M6IEtpbm5leSwgTWljaGFlbCBEIDxtaWNoYWVsLmQua2lubmV5QGludGVsLmNvbT47IE1pa2Ug VHVybmVyDQo+IDxtaWtldHVyQG1pY3Jvc29mdC5jb20+OyBHYW8sIExpbWluZyA8bGltaW5nLmdh b0BpbnRlbC5jb20+DQo+IFN1YmplY3Q6IFJlOiBbZWRrMl0gW1BBVENIIHY0XSBNZGVQa2cvQmFz ZUxpYjogQWRkIEJhc2U2NEVuY29kZSgpIGFuZA0KPiBCYXNlNjREZWNvZGUoKQ0KPiANCj4gQ29t bWVudHMgaW4gYmVsb3cuDQo+IA0KPiBPbiAxLzMwLzIwMTkgMjoyOCBQTSwgU2hlbmdsZWkgWmhh bmcgd3JvdGU6DQo+ID4gRnJvbTogTWlrZSBUdXJuZXIgPG1pa2V0dXJAbWljcm9zb2Z0LmNvbT4N Cj4gPg0KPiA+IEludHJvZHVjZSBwdWJsaWMgZnVuY3Rpb25zIEJhc2U2NEVuY29kZSBhbmQgQmFz ZTY0RGVjb2RlLg0KPiA+IGh0dHBzOi8vYnVnemlsbGEudGlhbm9jb3JlLm9yZy9zaG93X2J1Zy5j Z2k/aWQ9MTM3MA0KPiA+DQo+ID4gdjI6MS5SZW1vdmUgc29tZSB3aGl0ZSBzcGFjZS4NCj4gPiAg ICAgMi5BZGQgdW5pdCB0ZXN0IHdpdGggdGVzdCB2ZWN0b3JzIGluIFJGQyA0NjQ4Lg0KPiA+ICAg ICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9zaGVuZ2xlaTEwL2VkazIvdHJlZS9lbmNvZGVfdGVzdA0K PiA+ICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9zaGVuZ2xlaTEwL2VkazIvdHJlZS9kZWNvZGVf dGVzdA0KPiA+DQo+ID4gdjM6MS5BbGlnbiB3aGl0ZSBzcGFjZS4NCj4gPiAgICAgMi5VcGRhdGUg Y29tbWVudHMgb2YgQmFzZTY0RW5jb2RlIGFuZCBCYXNlNjREZWNvZGUuDQo+ID4gICAgIDMuQ2hh bmdlIHRoZSB1c2Ugb2YgbWFjcm8gUkVUVVJOX0RFVklDRV9FUlJPUiB0bw0KPiA+ICAgICAgIFJF VFVSTl9JTlZBTElEX1BBUkFNRVRFUiBpbiBzdHJpbmcuYy4NCj4gPg0KPiA+IHY0OkNoYW5nZSBw YXJhbWV0ZXJzJyBuYW1lcy4NCj4gPg0KPiA+IENjOiBNaWNoYWVsIEQgS2lubmV5IDxtaWNoYWVs LmQua2lubmV5QGludGVsLmNvbT4NCj4gPiBDYzogTGltaW5nIEdhbyA8bGltaW5nLmdhb0BpbnRl bC5jb20+DQo+ID4gQ29udHJpYnV0ZWQtdW5kZXI6IFRpYW5vQ29yZSBDb250cmlidXRpb24gQWdy ZWVtZW50IDEuMQ0KPiA+IFNpZ25lZC1vZmYtYnk6IFNoZW5nbGVpIFpoYW5nIDxzaGVuZ2xlaS56 aGFuZ0BpbnRlbC5jb20+DQo+ID4gLS0tDQo+ID4gICBNZGVQa2cvSW5jbHVkZS9MaWJyYXJ5L0Jh c2VMaWIuaCB8ICA1NiArKysrKw0KPiA+ICAgTWRlUGtnL0xpYnJhcnkvQmFzZUxpYi9TdHJpbmcu YyAgfCAzNDQNCj4gKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKw0KPiA+ICAgMiBmaWxl cyBjaGFuZ2VkLCA0MDAgaW5zZXJ0aW9ucygrKQ0KPiA+DQo+ID4gZGlmZiAtLWdpdCBhL01kZVBr Zy9JbmNsdWRlL0xpYnJhcnkvQmFzZUxpYi5oDQo+IGIvTWRlUGtnL0luY2x1ZGUvTGlicmFyeS9C YXNlTGliLmgNCj4gPiBpbmRleCAxZWI4NDIzODRlLi4wMzE3M2RlZjU4IDEwMDY0NA0KPiA+IC0t LSBhL01kZVBrZy9JbmNsdWRlL0xpYnJhcnkvQmFzZUxpYi5oDQo+ID4gKysrIGIvTWRlUGtnL0lu Y2x1ZGUvTGlicmFyeS9CYXNlTGliLmgNCj4gPiBAQCAtMjcyMCw2ICsyNzIwLDYyIEBAIEFzY2lp U3RyblRvVW5pY29kZVN0clMgKA0KPiA+ICAgICBPVVQgICAgIFVJTlROICAgICAgICAgICAgICAg ICAgICAgKkRlc3RpbmF0aW9uTGVuZ3RoDQo+ID4gICAgICk7DQo+ID4NCj4gPiArLyoqDQo+ID4g KyAgQ29udmVydCBiaW5hcnkgZGF0YSB0byBhIEJhc2U2NCBlbmNvZGVkIGFzY2lpIHN0cmluZyBi YXNlZCBvbiBSRkM0NjQ4Lg0KPiA+ICsNCj4gPiArICBQcm9kdWNlIGEgTnVsbC10ZXJtaW5hdGVk IEFzY2lpIHN0cmluZyBpbiB0aGUgb3V0cHV0IGJ1ZmZlciBzcGVjaWZpZWQgYnkNCj4gRGVzdGlu YXRpb24gYW5kIERlc3RpbmF0aW9uU2l6ZS4NCj4gPiArICBUaGUgQXNjaWkgc3RyaW5nIGlzIHBy b2R1Y2VkIGJ5IGNvbnZlcnRpbmcgdGhlIGRhdGEgc3RyaW5nIHNwZWNpZmllZCBieQ0KPiBTb3Vy Y2UgYW5kIFNvdXJjZUxlbmd0aC4NCj4gPiArDQo+ID4gKyAgQHBhcmFtIFNvdXJjZSAgICAgICAg ICAgSW5wdXQgVUlOVDggZGF0YQ0KPiA+ICsgIEBwYXJhbSBTb3VyY2VMZW5ndGggICAgIE51bWJl ciBvZiBVSU5UOCBieXRlcyBvZiBkYXRhDQo+ID4gKyAgQHBhcmFtIERlc3RpbmF0aW9uICAgICAg UG9pbnRlciB0byBvdXRwdXQgc3RyaW5nIGJ1ZmZlcg0KPiA+ICsgIEBwYXJhbSBEZXN0aW5hdGlv blNpemUgIFNpemUgb2YgYXNjaWkgYnVmZmVyLiBTZXQgdG8gMCB0byBnZXQgdGhlIHNpemUNCj4g bmVlZGVkLg0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxlciBpcyByZXNwb25z aWJsZSBmb3IgcGFzc2luZyBpbiBidWZmZXIgb2YgRGVzdGluYXRpb25TaXplDQo+ID4gKw0KPiA+ ICsgIEByZXR2YWwgUkVUVVJOX1NVQ0NFU1MgICAgICAgICAgICAgV2hlbiBhc2NpaSBidWZmZXIg aXMgZmlsbGVkIGluLg0KPiA+ICsgIEByZXR2YWwgUkVUVVJOX0lOVkFMSURfUEFSQU1FVEVSICAg SWYgU291cmNlIGlzIE5VTEwgb3INCj4gRGVzdGluYXRpb25TaXplIGlzIE5VTEwuDQo+ID4gKyAg QHJldHZhbCBSRVRVUk5fSU5WQUxJRF9QQVJBTUVURVIgICBJZiBTb3VyY2VMZW5ndGggb3INCj4g RGVzdGluYXRpb25TaXplIGlzIGJpZ2dlciB0aGFuIChNQVhfQUREUkVTUyAtIChVSU5UTilEZXN0 aW5hdGlvbikuDQo+ID4gKyAgQHJldHZhbCBSRVRVUk5fQlVGRkVSX1RPT19TTUFMTCAgICBJZiBT b3VyY2VMZW5ndGggaXMgMCBhbmQNCj4gRGVzdGluYXRpb25TaXplIGlzIDwxLg0KPiA+ICsgIEBy ZXR2YWwgUkVUVVJOX0JVRkZFUl9UT09fU01BTEwgICAgSWYgRGVzdGluYXRpb24gaXMgTlVMTCBv cg0KPiBEZXN0aW5hdGlvblNpemUgaXMgc21hbGxlciB0aGFuIHJlcXVpcmVkIGJ1ZmZlcnNpemUu DQo+ID4gKw0KPiA+ICsqKi8NCj4gPiArUkVUVVJOX1NUQVRVUw0KPiA+ICtFRklBUEkNCj4gPiAr QmFzZTY0RW5jb2RlICgNCj4gPiArICBJTiAgQ09OU1QgVUlOVDggICpTb3VyY2UsDQo+ID4gKyAg SU4gICAgICAgIFVJTlROICAgU291cmNlTGVuZ3RoLA0KPiA+ICsgIE9VVCAgICAgICBDSEFSOCAg KkRlc3RpbmF0aW9uICBPUFRJT05BTCwNCj4gPiArICBJTiBPVVQgICAgVUlOVE4gICpEZXN0aW5h dGlvblNpemUNCj4gPiArICApOw0KPiA+ICsNCj4gPiArLyoqDQo+ID4gKyAgQ29udmVydCBCYXNl NjQgYXNjaWkgc3RyaW5nIHRvIGJpbmFyeSBkYXRhIGJhc2VkIG9uIFJGQzQ2NDguDQo+ID4gKw0K PiA+ICsgIFByb2R1Y2UgTnVsbC10ZXJtaW5hdGVkIGJpbmFyeSBkYXRhIGluIHRoZSBvdXRwdXQg YnVmZmVyIHNwZWNpZmllZCBieQ0KPiBEZXN0aW5hdGlvbiBhbmQgRGVzdGluYXRpb25TaXplLg0K PiA+ICsgIFRoZSBiaW5hcnkgZGF0YSBpcyBwcm9kdWNlZCBieSBjb252ZXJ0aW5nIHRoZSBCYXNl NjQgYXNjaWkgc3RyaW5nDQo+IHNwZWNpZmllZCBieSBTb3VyY2UgYW5kIFNvdXJjZUxlbmd0aC4N Cj4gPiArDQo+ID4gKyAgQHBhcmFtIFNvdXJjZSAgICAgICAgICBJbnB1dCBBU0NJSSBjaGFyYWN0 ZXJzDQo+ID4gKyAgQHBhcmFtIFNvdXJjZUxlbmd0aCAgICBOdW1iZXIgb2YgQVNDSUkgY2hhcmFj dGVycw0KPiA+ICsgIEBwYXJhbSBEZXN0aW5hdGlvbiAgICAgUG9pbnRlciB0byBvdXRwdXQgYnVm ZmVyDQo+ID4gKyAgQHBhcmFtIERlc3RpbmF0aW9uU2l6ZSBDYWxsZXIgaXMgcmVzcG9uc2libGUg Zm9yIHBhc3NpbmcgaW4gYnVmZmVyIG9mIGF0DQo+IGxlYXN0IERlc3RpbmF0aW9uU2l6ZS4NCj4g PiArICAgICAgICAgICAgICAgICAgICAgICAgIFNldCAwIHRvIGdldCB0aGUgc2l6ZSBuZWVkZWQu IFNldCB0byBieXRlcyBzdG9yZWQgb24gcmV0dXJuLg0KPiA+ICsNCj4gPiArICBAcmV0dmFsIFJF VFVSTl9TVUNDRVNTICAgICAgICAgICAgIFdoZW4gYmluYXJ5IGJ1ZmZlciBpcyBmaWxsZWQgaW4u DQo+ID4gKyAgQHJldHZhbCBSRVRVUk5fSU5WQUxJRF9QQVJBTUVURVIgICBJZiBTb3VyY2UgaXMg TlVMTCBvcg0KPiBEZXN0aW5hdGlvblNpemUgaXMgTlVMTC4NCj4gPiArICBAcmV0dmFsIFJFVFVS Tl9JTlZBTElEX1BBUkFNRVRFUiAgIElmIFNvdXJjZUxlbmd0aCBvcg0KPiBEZXN0aW5hdGlvblNp emUgaXMgYmlnZ2VyIHRoYW4gKE1BWF9BRERSRVNTIC0oVUlOVE4pRGVzdGluYXRpb24gKS4NCj4g PiArICBAcmV0dmFsIFJFVFVSTl9JTlZBTElEX1BBUkFNRVRFUiAgIElmIHRoZXJlIGlzIGFueSBp bnZhbGlkIGNoYXJhY3Rlcg0KPiBpbiBpbnB1dCBzdHJlYW0uDQo+ID4gKyAgQHJldHZhbCBSRVRV Uk5fQlVGRkVSX1RPT19TTUFMTCAgICBJZiBidWZmZXIgbGVuZ3RoIGlzIHNtYWxsZXIgdGhhbg0K PiByZXF1aXJlZCBidWZmZXIgc2l6ZS4NCj4gPiArDQo+ID4gKyAqKi8NCj4gPiArUkVUVVJOX1NU QVRVUw0KPiA+ICtFRklBUEkNCj4gPiArQmFzZTY0RGVjb2RlICgNCj4gPiArICBJTiAgQ09OU1Qg Q0hBUjggICpTb3VyY2UsDQo+ID4gKyAgSU4gICAgICAgIFVJTlROICAgU291cmNlTGVuZ3RoLA0K PiA+ICsgIE9VVCAgICAgICBVSU5UOCAgKkRlc3RpbmF0aW9uICBPUFRJT05BTCwNCj4gPiArICBJ TiBPVVQgICAgVUlOVE4gICpEZXN0aW5hdGlvblNpemUNCj4gPiArICApOw0KPiA+ICsNCj4gPiAg IC8qKg0KPiA+ICAgICBDb252ZXJ0cyBhbiA4LWJpdCB2YWx1ZSB0byBhbiA4LWJpdCBCQ0QgdmFs dWUuDQo+ID4NCj4gPiBkaWZmIC0tZ2l0IGEvTWRlUGtnL0xpYnJhcnkvQmFzZUxpYi9TdHJpbmcu Yw0KPiBiL01kZVBrZy9MaWJyYXJ5L0Jhc2VMaWIvU3RyaW5nLmMNCj4gPiBpbmRleCBlNmRmMTI3 OTdkLi5lNGFhNWE1N2U0IDEwMDY0NA0KPiA+IC0tLSBhL01kZVBrZy9MaWJyYXJ5L0Jhc2VMaWIv U3RyaW5nLmMNCj4gPiArKysgYi9NZGVQa2cvTGlicmFyeS9CYXNlTGliL1N0cmluZy5jDQo+ID4g QEAgLTE3NjMsNiArMTc2MywzNTAgQEAgQXNjaWlTdHJUb1VuaWNvZGVTdHIgKA0KPiA+DQo+ID4g ICAjZW5kaWYNCj4gPg0KPiA+ICsvLw0KPiA+ICsvLyBUaGUgYmFzaXMgZm9yIEJhc2U2NCBlbmNv ZGluZyBpcyBSRkMgNDY4Ng0KPiBodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDY0OA0K PiA+ICsvLw0KPiA+ICsvLyBSRkMgNDY4NiBoYXMgYSBudW1iZXIgb2YgTUFZIGFuZCBTSE9VTEQg Y2FzZXMuICBUaGlzDQo+IGltcGxlbWVudGF0aW9uIGNob29zZXMNCj4gPiArLy8gdGhlIG1vcmUg cmVzdHJpY3RpdmUgdmVyc2lvbnMgZm9yIHNlY3VyaXR5IGNvbmNlcm5zIChzZWUgUkZDIDQ2ODYN Cj4gc2VjdGlvbiAzLjMpLg0KPiA+ICsvLw0KPiA+ICsvLyBBIGludmFsaWQgY2hhcmFjdGVyLCBp ZiBlbmNvdW50ZXJlZCBkdXJpbmcgdGhlIGRlY29kZSBvcGVyYXRpb24sIGNhdXNlcw0KPiB0aGUg ZGF0YQ0KPiA+ICsvLyB0byBiZSByZWplY3RlZC4gSW4gYWRkaXRpb24sIHRoZSAnPScgcGFkZGlu ZyBjaGFyYWN0ZXIgaXMgb25seSBhbGxvd2VkIGF0DQo+IHRoZSBlbmQNCj4gPiArLy8gb2YgdGhl IEJhc2U2NCBlbmNvZGVkIHN0cmluZy4NCj4gPiArLy8NCj4gPiArI2RlZmluZSBCQURfViAgOTkN Cj4gPiArDQo+ID4gK1NUQVRJQyBDSEFSOCBFbmNvZGluZ190YWJsZVtdID0gIkFCQ0RFRkdISUpL TE1OT1BRUlNUVVZXWFlaIg0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJh YmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiINCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAiMDEyMzQ1Njc4OSsvIjsNCj4gPiArDQo+ID4gK1NUQVRJQyBVSU5UOCBEZWNvZGlu Z190YWJsZVtdID0gew0KPiANCj4gMS4gQ2FuIHRoZSBFbmNvZGluZ190YWJsZS9EZWNvZGluZ190 YWJsZSBwYXNzIEVDQyBjaGVjaz8NCj4gDQo+ID4gKyAgLy8NCj4gPiArICAvLyBWYWxpZCBjaGFy YWN0ZXJzDQo+IEFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1 dnd4eXowMTIzNDU2Nzg5DQo+ICsvDQo+ID4gKyAgLy8gQWxzbywgc2V0ICc9JyBhcyBhIHplcm8g Zm9yIGRlY29kaW5nDQo+ID4gKyAgLy8gMCAgLCAgICAgICAgICAgIDEsICAgICAgICAgICAyLCAg ICAgICAgICAgMywgICAgICAgICAgICA0LCAgICAgICAgICAgNSwgICAgICAgICAgICA2LCAgICAg ICAgICAgNywgICAgICAgICAgIDgsICAgICAgICAgICAgOSwNCj4gYSwgICAgICAgICAgICBiLCAg ICAgICAgICAgIGMsICAgICAgICAgICBkLCAgICAgICAgICAgIGUsICAgICAgICAgICAgZg0KPiA+ ICsgIEJBRF9WLCAgQkFEX1YsICBCQURfViwgIEJBRF9WLCAgQkFEX1YsICBCQURfViwgIEJBRF9W LCAgQkFEX1YsDQo+IEJBRF9WLCAgQkFEX1YsICBCQURfViwgIEJBRF9WLCAgQkFEX1YsICBCQURf ViwgIEJBRF9WLCAgQkFEX1YsICAgLy8gICAwDQo+ID4gKyAgQkFEX1YsICBCQURfViwgIEJBRF9W LCAgQkFEX1YsICBCQURfViwgIEJBRF9WLCAgQkFEX1YsICBCQURfViwNCj4gQkFEX1YsICBCQURf ViwgIEJBRF9WLCAgQkFEX1YsICBCQURfViwgIEJBRF9WLCAgQkFEX1YsICBCQURfViwgICAvLyAg MTANCj4gPiArICBCQURfViwgIEJBRF9WLCAgQkFEX1YsICBCQURfViwgIEJBRF9WLCAgQkFEX1Ys ICBCQURfViwgIEJBRF9WLA0KPiBCQURfViwgIEJBRF9WLCAgQkFEX1YsICAgICA2MiwgIEJBRF9W LCAgQkFEX1YsICBCQURfViwgICAgIDYzLCAgIC8vICAyMA0KPiA+ICsgICAgIDUyLCAgICAgNTMs ICAgICA1NCwgICAgIDU1LCAgICAgNTYsICAgICA1NywgICAgIDU4LCAgICAgNTksICAgICA2MCwg ICAgIDYxLCAgQkFEX1YsICBCQURfViwNCj4gQkFEX1YsICAgICAgMCwgIEJBRF9WLCAgQkFEX1Ys ICAgLy8gIDMwDQo+ID4gKyAgQkFEX1YsICAgICAgMCwgICAgICAxLCAgICAgIDIsICAgICAgMywg ICAgICA0LCAgICAgIDUsICAgICAgNiwgICAgICA3LCAgICAgIDgsICAgICAgOSwgICAgIDEwLCAg ICAgMTEsICAgICAxMiwNCj4gMTMsICAgICAxNCwgICAvLyAgNDANCj4gPiArICAgICAxNSwgICAg IDE2LCAgICAgMTcsICAgICAxOCwgICAgIDE5LCAgICAgMjAsICAgICAyMSwgICAgIDIyLCAgICAg MjMsICAgICAyNCwgICAgIDI1LCAgQkFEX1YsDQo+IEJBRF9WLCAgQkFEX1YsICBCQURfViwgIEJB RF9WLCAgIC8vICA1MA0KPiA+ICsgIEJBRF9WLCAgICAgMjYsICAgICAyNywgICAgIDI4LCAgICAg MjksICAgICAzMCwgICAgIDMxLCAgICAgMzIsICAgICAzMywgICAgIDM0LCAgICAgMzUsICAgICAz NiwgICAgIDM3LA0KPiAzOCwgICAgIDM5LCAgICAgNDAsICAgLy8gIDYwDQo+ID4gKyAgICAgNDEs ICAgICA0MiwgICAgIDQzLCAgICAgNDQsICAgICA0NSwgICAgIDQ2LCAgICAgNDcsICAgICA0OCwg ICAgIDQ5LCAgICAgNTAsICAgICA1MSwgIEJBRF9WLA0KPiBCQURfViwgIEJBRF9WLCAgQkFEX1Ys ICBCQURfViwgICAvLyAgNzANCj4gPiArICBCQURfViwgIEJBRF9WLCAgQkFEX1YsICBCQURfViwg IEJBRF9WLCAgQkFEX1YsICBCQURfViwgIEJBRF9WLA0KPiBCQURfViwgIEJBRF9WLCAgQkFEX1Ys ICBCQURfViwgIEJBRF9WLCAgQkFEX1YsICBCQURfViwgIEJBRF9WLCAgIC8vICA4MA0KPiA+ICsg IEJBRF9WLCAgQkFEX1YsICBCQURfViwgIEJBRF9WLCAgQkFEX1YsICBCQURfViwgIEJBRF9WLCAg QkFEX1YsDQo+IEJBRF9WLCAgQkFEX1YsICBCQURfViwgIEJBRF9WLCAgQkFEX1YsICBCQURfViwg IEJBRF9WLCAgQkFEX1YsICAgLy8gIDkwDQo+ID4gKyAgQkFEX1YsICBCQURfViwgIEJBRF9WLCAg QkFEX1YsICBCQURfViwgIEJBRF9WLCAgQkFEX1YsICBCQURfViwNCj4gQkFEX1YsICBCQURfViwg IEJBRF9WLCAgQkFEX1YsICBCQURfViwgIEJBRF9WLCAgQkFEX1YsICBCQURfViwgICAvLyAgYTAN Cj4gPiArICBCQURfViwgIEJBRF9WLCAgQkFEX1YsICBCQURfViwgIEJBRF9WLCAgQkFEX1YsICBC QURfViwgIEJBRF9WLA0KPiBCQURfViwgIEJBRF9WLCAgQkFEX1YsICBCQURfViwgIEJBRF9WLCAg QkFEX1YsICBCQURfViwgIEJBRF9WLCAgIC8vICBiMA0KPiA+ICsgIEJBRF9WLCAgQkFEX1YsICBC QURfViwgIEJBRF9WLCAgQkFEX1YsICBCQURfViwgIEJBRF9WLCAgQkFEX1YsDQo+IEJBRF9WLCAg QkFEX1YsICBCQURfViwgIEJBRF9WLCAgQkFEX1YsICBCQURfViwgIEJBRF9WLCAgQkFEX1YsICAg Ly8gIGMwDQo+ID4gKyAgQkFEX1YsICBCQURfViwgIEJBRF9WLCAgQkFEX1YsICBCQURfViwgIEJB RF9WLCAgQkFEX1YsICBCQURfViwNCj4gQkFEX1YsICBCQURfViwgIEJBRF9WLCAgQkFEX1YsICBC QURfViwgIEJBRF9WLCAgQkFEX1YsICBCQURfViwgICAvLyAgZDANCj4gPiArICBCQURfViwgIEJB RF9WLCAgQkFEX1YsICBCQURfViwgIEJBRF9WLCAgQkFEX1YsICBCQURfViwgIEJBRF9WLA0KPiBC QURfViwgIEJBRF9WLCAgQkFEX1YsICBCQURfViwgIEJBRF9WLCAgQkFEX1YsICBCQURfViwgIEJB RF9WLCAgIC8vICBkMA0KPiA+ICsgIEJBRF9WLCAgQkFEX1YsICBCQURfViwgIEJBRF9WLCAgQkFE X1YsICBCQURfViwgIEJBRF9WLCAgQkFEX1YsDQo+IEJBRF9WLCAgQkFEX1YsICBCQURfViwgIEJB RF9WLCAgQkFEX1YsICBCQURfViwgIEJBRF9WLCAgQkFEX1YgICAgLy8gIGYwDQo+ID4gK307DQo+ ID4gKw0KPiA+ICsvKioNCj4gPiArICBDb252ZXJ0IGJpbmFyeSBkYXRhIHRvIGEgQmFzZTY0IGVu Y29kZWQgYXNjaWkgc3RyaW5nIGJhc2VkIG9uIFJGQzQ2NDguDQo+ID4gKw0KPiA+ICsgIFByb2R1 Y2UgYSBOdWxsLXRlcm1pbmF0ZWQgQXNjaWkgc3RyaW5nIGluIHRoZSBvdXRwdXQgYnVmZmVyIHNw ZWNpZmllZCBieQ0KPiBEZXN0aW5hdGlvbiBhbmQgRGVzdGluYXRpb25TaXplLg0KPiA+ICsgIFRo ZSBBc2NpaSBzdHJpbmcgaXMgcHJvZHVjZWQgYnkgY29udmVydGluZyB0aGUgZGF0YSBzdHJpbmcg c3BlY2lmaWVkIGJ5DQo+IFNvdXJjZSBhbmQgU291cmNlTGVuZ3RoLg0KPiA+ICsNCj4gPiArICBA cGFyYW0gU291cmNlICAgICAgICAgICAgSW5wdXQgVUlOVDggZGF0YQ0KPiA+ICsgIEBwYXJhbSBT b3VyY2VMZW5ndGggICAgICBOdW1iZXIgb2YgVUlOVDggYnl0ZXMgb2YgZGF0YQ0KPiA+ICsgIEBw YXJhbSBEZXN0aW5hdGlvbiAgICAgICBQb2ludGVyIHRvIG91dHB1dCBzdHJpbmcgYnVmZmVyDQo+ ID4gKyAgQHBhcmFtIERlc3RpbmF0aW9uU2l6ZSAgIFNpemUgb2YgYXNjaWkgYnVmZmVyLiBTZXQg dG8gMCB0byBnZXQgdGhlIHNpemUNCj4gbmVlZGVkLg0KPiA+ICsgICAgICAgICAgICAgICAgICAg ICAgICAgICBDYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIHBhc3NpbmcgaW4gYnVmZmVyIG9mIERl c3RpbmF0aW9uU2l6ZQ0KPiA+ICsNCj4gPiArICBAcmV0dmFsIFJFVFVSTl9TVUNDRVNTICAgICAg ICAgICAgIFdoZW4gYXNjaWkgYnVmZmVyIGlzIGZpbGxlZCBpbi4NCj4gPiArICBAcmV0dmFsIFJF VFVSTl9JTlZBTElEX1BBUkFNRVRFUiAgIElmIFNvdXJjZSBpcyBOVUxMIG9yDQo+IERlc3RpbmF0 aW9uU2l6ZSBpcyBOVUxMLg0KPiA+ICsgIEByZXR2YWwgUkVUVVJOX0lOVkFMSURfUEFSQU1FVEVS ICAgSWYgU291cmNlTGVuZ3RoIG9yDQo+IERlc3RpbmF0aW9uU2l6ZSBpcyBiaWdnZXIgdGhhbiAo TUFYX0FERFJFU1MgLSAoVUlOVE4pRGVzdGluYXRpb24pLg0KPiA+ICsgIEByZXR2YWwgUkVUVVJO X0JVRkZFUl9UT09fU01BTEwgICAgSWYgU291cmNlTGVuZ3RoIGlzIDAgYW5kDQo+IERlc3RpbmF0 aW9uU2l6ZSBpcyA8MS4NCj4gPiArICBAcmV0dmFsIFJFVFVSTl9CVUZGRVJfVE9PX1NNQUxMICAg IElmIERlc3RpbmF0aW9uIGlzIE5VTEwgb3INCj4gRGVzdGluYXRpb25TaXplIGlzIHNtYWxsZXIg dGhhbiByZXF1aXJlZCBidWZmZXJzaXplLg0KPiA+ICsNCj4gPiArKiovDQo+ID4gK1JFVFVSTl9T VEFUVVMNCj4gPiArRUZJQVBJDQo+ID4gK0Jhc2U2NEVuY29kZSAoDQo+ID4gKyAgSU4gIENPTlNU IFVJTlQ4ICAqU291cmNlLA0KPiA+ICsgIElOICAgICAgICBVSU5UTiAgIFNvdXJjZUxlbmd0aCwN Cj4gPiArICBPVVQgICAgICAgQ0hBUjggICpEZXN0aW5hdGlvbiAgIE9QVElPTkFMLA0KPiA+ICsg IElOIE9VVCAgICBVSU5UTiAgKkRlc3RpbmF0aW9uU2l6ZQ0KPiA+ICsgICkNCj4gPiArew0KPiA+ ICsNCj4gPiArICBVSU5UTiAgICAgICAgICBSZXF1aXJlZFNpemU7DQo+ID4gKyAgVUlOVE4gICAg ICAgICAgTGVmdDsNCj4gPiArICBDT05TVCBVSU5UOCAgICpJbnB0cjsNCj4gPiArICBDSEFSOCAg ICAgICAgICpPdXRwdHI7DQo+IDIuIElucHRyIGFuZCBPdXRwdHIgbWlnaHQgYmUgYWJsZSB0byBi ZSByZW1vdmVkLiBwbGVhc2UgY2hlY2suDQo+ID4gKw0KPiA+ICsgIC8vDQo+ID4gKyAgLy8gQ2hl Y2sgcG9pbnRlcnMsIGFuZCBTb3VyY2VMZW5ndGggaXMgdmFsaWQNCj4gPiArICAvLw0KPiA+ICsg IGlmICgoU291cmNlID09IE5VTEwpIHx8IChEZXN0aW5hdGlvblNpemUgPT0gTlVMTCkpIHsNCj4g PiArICAgIHJldHVybiBSRVRVUk5fSU5WQUxJRF9QQVJBTUVURVI7DQo+ID4gKyAgfQ0KPiA+ICsN Cj4gPiArICAvLw0KPiA+ICsgIC8vIEFsbG93IGZvciBSRkMgNDY0OCB0ZXN0IHZlY3RvciAxDQo+ ID4gKyAgLy8NCj4gPiArICBpZiAoU291cmNlTGVuZ3RoID09IDApIHsNCj4gPiArICAgIGlmICgq RGVzdGluYXRpb25TaXplIDwgMSkgew0KPiA+ICsgICAgICAqRGVzdGluYXRpb25TaXplID0gMTsN Cj4gPiArICAgICAgcmV0dXJuIFJFVFVSTl9CVUZGRVJfVE9PX1NNQUxMOw0KPiA+ICsgICAgfQ0K PiA+ICsgICAgKkRlc3RpbmF0aW9uU2l6ZSA9IDE7DQo+ID4gKyAgICAqRGVzdGluYXRpb24gPSAn XDAnOw0KPiA+ICsgICAgcmV0dXJuIFJFVFVSTl9TVUNDRVNTOw0KPiA+ICsgIH0NCj4gPiArDQo+ ID4gKyAgLy8NCj4gPiArICAvLyBDaGVjayBpZiBTb3VyY2VMZW5ndGggb3IgIERlc3RpbmF0aW9u U2l6ZSBpcyB2YWxpZA0KPiA+ICsgIC8vDQo+ID4gKyAgaWYgKChTb3VyY2VMZW5ndGggPj0gKE1B WF9BRERSRVNTIC0gKFVJTlROKVNvdXJjZSkpIHx8DQo+ICgqRGVzdGluYXRpb25TaXplID49IChN QVhfQUREUkVTUyAtIChVSU5UTilEZXN0aW5hdGlvbikpKXsNCj4gPiArICAgIHJldHVybiBSRVRV Uk5fSU5WQUxJRF9QQVJBTUVURVI7DQo+ID4gKyAgfQ0KPiA+ICsNCj4gPiArICAvLw0KPiA+ICsg IC8vIDQgYXNjaWkgcGVyIDMgYnl0ZXMgKyBOVUxMDQo+ID4gKyAgLy8NCj4gPiArICBSZXF1aXJl ZFNpemUgPSAoKFNvdXJjZUxlbmd0aCArIDIpIC8gMykgKiA0ICsgMTsNCj4gPiArICBpZiAoKERl c3RpbmF0aW9uID09IE5VTEwpIHx8ICpEZXN0aW5hdGlvblNpemUgPCBSZXF1aXJlZFNpemUpIHsN Cj4gPiArICAgICpEZXN0aW5hdGlvblNpemUgPSBSZXF1aXJlZFNpemU7DQo+ID4gKyAgICByZXR1 cm4gUkVUVVJOX0JVRkZFUl9UT09fU01BTEw7ID4gKyAgfQ0KPiA+ICsNCj4gPiArICBMZWZ0ID0g U291cmNlTGVuZ3RoOw0KPiA+ICsgIE91dHB0ciA9IERlc3RpbmF0aW9uOw0KPiA+ICsgIElucHRy ICA9IFNvdXJjZTsNCj4gPiArDQo+ID4gKyAgLy8NCj4gPiArICAvLyBFbmNvZGUgMjQgYml0cyAo dGhyZWUgYnl0ZXMpIGludG8gNCBhc2NpaSBjaGFyYWN0ZXJzDQo+ID4gKyAgLy8NCj4gPiArICB3 aGlsZSAoTGVmdCA+PSAzKSB7DQo+ID4gKw0KPiA+ICsgICAgKk91dHB0cisrID0gRW5jb2Rpbmdf dGFibGVbKCBJbnB0clswXSAmIDB4ZmMpID4+IDIgXTsNCj4gPiArICAgICpPdXRwdHIrKyA9IEVu Y29kaW5nX3RhYmxlWygoSW5wdHJbMF0gJiAweDAzKSA8PCA0KSArICgoSW5wdHJbMV0gJg0KPiAw eGYwKSA+PiA0KV07DQo+ID4gKyAgICAqT3V0cHRyKysgPSBFbmNvZGluZ190YWJsZVsoKElucHRy WzFdICYgMHgwZikgPDwgMikgKyAoKElucHRyWzJdICYNCj4gMHhjMCkgPj4gNildOw0KPiA+ICsg ICAgKk91dHB0cisrID0gRW5jb2RpbmdfdGFibGVbKCBJbnB0clsyXSAmIDB4M2YpXTsNCj4gPiAr ICAgIExlZnQgLT0gMzsNCj4gPiArICAgIElucHRyICs9IDM7DQo+ID4gKyAgfQ0KPiA+ICsNCj4g PiArICAvLw0KPiA+ICsgIC8vIEhhbmRsZSB0aGUgcmVtYWluZGVyLCBhbmQgYWRkIHBhZGRpbmcg Jz0nIGNoYXJhY3RlcnMgYXMgbmVjZXNzYXJ5Lg0KPiA+ICsgIC8vDQo+ID4gKyAgc3dpdGNoIChM ZWZ0KSB7DQo+ID4gKyAgICBjYXNlIDA6DQo+ID4gKw0KPiA+ICsgICAgICAvLw0KPiA+ICsgICAg ICAvLyBObyBieXRlcyBMZWZ0LCBkb25lLg0KPiA+ICsgICAgICAvLw0KPiA+ICsgICAgICBicmVh azsNCj4gPiArICAgIGNhc2UgMToNCj4gPiArDQo+ID4gKyAgICAgIC8vDQo+ID4gKyAgICAgIC8v IE9uZSBtb3JlIGRhdGEgYnl0ZSwgdHdvIHBhZCBjaGFyYWN0ZXJzDQo+ID4gKyAgICAgIC8vDQo+ ID4gKyAgICAgICpPdXRwdHIrKyA9IEVuY29kaW5nX3RhYmxlWyggSW5wdHJbMF0gJiAweGZjKSA+ PiAyXTsNCj4gPiArICAgICAgKk91dHB0cisrID0gRW5jb2RpbmdfdGFibGVbKChJbnB0clswXSAm IDB4MDMpIDw8IDQpXTsNCj4gPiArICAgICAgKk91dHB0cisrID0gJz0nOw0KPiA+ICsgICAgICAq T3V0cHRyKysgPSAnPSc7DQo+ID4gKyAgICAgIGJyZWFrOw0KPiA+ICsgICAgY2FzZSAyOg0KPiA+ ICsNCj4gPiArICAgICAgLy8NCj4gPiArICAgICAgLy8gVHdvIG1vcmUgZGF0YSBieXRlcywgYW5k IG9uZSBwYWQgY2hhcmFjdGVyDQo+ID4gKyAgICAgIC8vDQo+ID4gKyAgICAgICpPdXRwdHIrKyA9 IEVuY29kaW5nX3RhYmxlWyggSW5wdHJbMF0gJiAweGZjKSA+PiAyXTsNCj4gPiArICAgICAgKk91 dHB0cisrID0gRW5jb2RpbmdfdGFibGVbKChJbnB0clswXSAmIDB4MDMpIDw8IDQpICsgKChJbnB0 clsxXSAmDQo+IDB4ZjApID4+IDQpXTsNCj4gPiArICAgICAgKk91dHB0cisrID0gRW5jb2Rpbmdf dGFibGVbKChJbnB0clsxXSAmIDB4MGYpIDw8IDIpXTsNCj4gPiArICAgICAgKk91dHB0cisrID0g Jz0nOw0KPiA+ICsgICAgICBicmVhazsNCj4gPiArICAgIH0NCj4gPiArICAvLw0KPiA+ICsgIC8v IEFkZCB0ZXJtaW5hdGluZyBOVUxMDQo+ID4gKyAgLy8NCj4gPiArICAqT3V0cHRyID0gJ1wwJzsN Cj4gPiArICByZXR1cm4gUkVUVVJOX1NVQ0NFU1M7DQo+ID4gK30NCj4gPiArDQo+ID4gKy8qKg0K PiA+ICsgIENvbnZlcnQgQmFzZTY0IGFzY2lpIHN0cmluZyB0byBiaW5hcnkgZGF0YSBiYXNlZCBv biBSRkM0NjQ4Lg0KPiA+ICsNCj4gPiArICBQcm9kdWNlIE51bGwtdGVybWluYXRlZCBiaW5hcnkg ZGF0YSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciBzcGVjaWZpZWQgYnkNCj4gRGVzdGluYXRpb24gYW5k IERlc3RpbmF0aW9uU2l6ZS4NCj4gPiArICBUaGUgYmluYXJ5IGRhdGEgaXMgcHJvZHVjZWQgYnkg Y29udmVydGluZyB0aGUgQmFzZTY0IGFzY2lpIHN0cmluZw0KPiBzcGVjaWZpZWQgYnkgU291cmNl IGFuZCBTb3VyY2VMZW5ndGguDQo+ID4gKw0KPiA+ICsgIEBwYXJhbSBTb3VyY2UgICAgICAgICAg ICBJbnB1dCBBU0NJSSBjaGFyYWN0ZXJzDQo+ID4gKyAgQHBhcmFtIFNvdXJjZUxlbmd0aCAgICAg IE51bWJlciBvZiBBU0NJSSBjaGFyYWN0ZXJzDQo+ID4gKyAgQHBhcmFtIERlc3RpbmF0aW9uICAg ICAgIFBvaW50ZXIgdG8gb3V0cHV0IGJ1ZmZlcg0KPiA+ICsgIEBwYXJhbSBEZXN0aW5hdGlvblNp emUgICBDYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIHBhc3NpbmcgaW4gYnVmZmVyIG9mIGF0DQo+ IGxlYXN0IERlc3RpbmF0aW9uU2l6ZS4NCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg U2V0IDAgdG8gZ2V0IHRoZSBzaXplIG5lZWRlZC4gU2V0IHRvIGJ5dGVzIHN0b3JlZCBvbiByZXR1 cm4uDQo+ID4gKw0KPiA+ICsgIEByZXR2YWwgUkVUVVJOX1NVQ0NFU1MgICAgICAgICAgICAgV2hl biBiaW5hcnkgYnVmZmVyIGlzIGZpbGxlZCBpbi4NCj4gPiArICBAcmV0dmFsIFJFVFVSTl9JTlZB TElEX1BBUkFNRVRFUiAgIElmIFNvdXJjZSBpcyBOVUxMIG9yDQo+IERlc3RpbmF0aW9uU2l6ZSBp cyBOVUxMLg0KPiA+ICsgIEByZXR2YWwgUkVUVVJOX0lOVkFMSURfUEFSQU1FVEVSICAgSWYgU291 cmNlTGVuZ3RoIG9yDQo+IERlc3RpbmF0aW9uU2l6ZSBpcyBiaWdnZXIgdGhhbiAoTUFYX0FERFJF U1MgLShVSU5UTilEZXN0aW5hdGlvbiApLg0KPiA+ICsgIEByZXR2YWwgUkVUVVJOX0lOVkFMSURf UEFSQU1FVEVSICAgSWYgdGhlcmUgaXMgYW55IGludmFsaWQgY2hhcmFjdGVyDQo+IGluIGlucHV0 IHN0cmVhbS4NCj4gPiArICBAcmV0dmFsIFJFVFVSTl9CVUZGRVJfVE9PX1NNQUxMICAgIElmIGJ1 ZmZlciBsZW5ndGggaXMgc21hbGxlciB0aGFuDQo+IHJlcXVpcmVkIGJ1ZmZlciBzaXplLg0KPiA+ ICsgKiovDQo+ID4gK1JFVFVSTl9TVEFUVVMNCj4gPiArRUZJQVBJDQo+ID4gK0Jhc2U2NERlY29k ZSAoDQo+ID4gKyAgSU4gIENPTlNUIENIQVI4ICAqU291cmNlLA0KPiA+ICsgIElOICAgICAgICBV SU5UTiAgIFNvdXJjZUxlbmd0aCwNCj4gPiArICBPVVQgICAgICAgVUlOVDggICpEZXN0aW5hdGlv biAgIE9QVElPTkFMLA0KPiA+ICsgIElOIE9VVCAgICBVSU5UTiAgKkRlc3RpbmF0aW9uU2l6ZQ0K PiA+ICsgICkNCj4gPiArew0KPiA+ICsNCj4gPiArICBVSU5UOCAgICpCaW5EYXRhOw0KPiAzLiBD b3VsZCBiZSByZW1vdmVkLiBzZWUgY29tbWVudHMgYmVsb3cuDQo+ID4gKyAgVUlOVDMyICAgVmFs dWU7DQo+ID4gKyAgQ0hBUjggICAgQ2hyOw0KPiA+ICsgIElOVE4gICAgIEJ1ZmZlclNpemU7DQo+ ID4gKyAgVUlOVE4gICAgSW5keDsNCj4gPiArICBVSU5UTiAgICBPbmR4OyA+ICsgIFVJTlROICAg IEljbnQ7DQo+IDQuIFdoeSBub3QganVzdCB1c2UgU291cmNlSW5kZXgvRGVzdGluYXRpb25JbmRl eC9JbmRleCBmb3IgYWJvdmUgMyBsb2NhbA0KPiB2YXJpYWJsZXM/DQo+ID4gKyAgVUlOVE4gICAg QWN0dWFsU291cmNlTGVuZ3RoOw0KPiA+ICsNCj4gPiArICAvLw0KPiA+ICsgIC8vIENoZWNrIHBv aW50ZXJzIGFyZSBub3QgTlVMTA0KPiA+ICsgIC8vDQo+ID4gKyAgaWYgKChTb3VyY2UgPT0gTlVM TCkgfHwgKERlc3RpbmF0aW9uU2l6ZSA9PSBOVUxMKSkgew0KPiA+ICsgICAgREVCVUcoKERFQlVH X0VSUk9SLCAiU291cmNlPSVwLCBEZXN0aW5hdGlvblNpemU9JVxuIiwgU291cmNlLA0KPiBEZXN0 aW5hdGlvblNpemUpKTsNCj4gDQo+IDUuIFBsZWFzZSByZW1vdmUgdGhpcyBkZWJ1ZyBtZXNzYWdl LiBJdCdzIG5vdCBwcm9wZXIgZm9yIGEgQmFzZUxpYiBBUEkNCj4gdG8gcHJpbnQgZGVidWcgbWVz c2FnZS4NCj4gDQo+ID4gKyAgICByZXR1cm4gUkVUVVJOX0lOVkFMSURfUEFSQU1FVEVSOw0KPiA+ ICsgIH0NCj4gPiArDQo+ID4gKyAgLy8NCj4gPiArICAvLyBDaGVjayBpZiBTb3VyY2VMZW5ndGgg b3IgIERlc3RpbmF0aW9uU2l6ZSBpcyB2YWxpZA0KPiA+ICsgIC8vDQo+ID4gKyAgaWYgKChTb3Vy Y2VMZW5ndGggPj0gKE1BWF9BRERSRVNTIC0gKFVJTlROKVNvdXJjZSkpIHx8DQo+ICgqRGVzdGlu YXRpb25TaXplID49IChNQVhfQUREUkVTUyAtIChVSU5UTilEZXN0aW5hdGlvbikpKXsNCj4gPiAr ICAgIHJldHVybiBSRVRVUk5fSU5WQUxJRF9QQVJBTUVURVI7DQo+ID4gKyAgfQ0KPiA+ICsNCj4g PiArICBBY3R1YWxTb3VyY2VMZW5ndGggPSAwOw0KPiA+ICsgIEJ1ZmZlclNpemUgPSAwOw0KPiA+ ICsNCj4gPiArICAvLw0KPiA+ICsgIC8vIERldGVybWluZSB0aGUgYWN0dWFsIG51bWJlciBvZiB2 YWxpZCBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcuDQo+ID4gKyAgLy8gQWxsIGludmFsaWQgY2hh cmFjdGVycyBleGNlcHQgc2VsZWN0ZWQgd2hpdGUgc3BhY2UgY2hhcmFjdGVycywNCj4gPiArICAv LyB3aWxsIGNhdXNlIHRoZSBCYXNlNjQgc3RyaW5nIHRvIGJlIHJlamVjdGVkLiBXaGl0ZSBzcGFj ZSB0byBhbGxvdw0KPiA+ICsgIC8vIHByb3Blcmx5IGZvcm1hdHRlZCBYTUwgd2lsbCBiZSBpZ25v cmVkLg0KPiA+ICsgIC8vDQo+ID4gKyAgLy8gU2VlIHNlY3Rpb24gMy4zIG9mIFJGQyA0NjQ4Lg0K PiA+ICsgIC8vDQo+ID4gKyAgZm9yIChJbmR4ID0gMDsgSW5keCA8IFNvdXJjZUxlbmd0aDsgSW5k eCsrKSB7DQo+ID4gKw0KPiA+ICsgICAgLy8NCj4gPiArICAgIC8vICc9JyBpcyBwYXJ0IG9mIHRo ZSBxdWFudHVtDQo+ID4gKyAgICAvLw0KPiA+ICsgICAgaWYgKFNvdXJjZVtJbmR4XSA9PSAnPScp IHsNCj4gPiArICAgICAgQWN0dWFsU291cmNlTGVuZ3RoKys7DQo+ID4gKyAgICAgIEJ1ZmZlclNp emUtLTsNCj4gPiArDQo+ID4gKyAgICAgIC8vDQo+ID4gKyAgICAgIC8vIE9ubHkgdHdvICc9JyBj aGFyYWN0ZXJzIGNhbiBiZSB2YWxpZC4NCj4gPiArICAgICAgLy8NCj4gPiArICAgICAgaWYgKEJ1 ZmZlclNpemUgPCAtMikgew0KPiA+ICsgICAgICAgIERFQlVHKChERUJVR19FUlJPUiwgIlNvdXJj ZT0lcCwgSW52YWxpZCA9IGF0ICVkXG4iLCBTb3VyY2UsDQo+IEluZHgpKTsNCj4gPiArICAgICAg ICByZXR1cm4gUkVUVVJOX0lOVkFMSURfUEFSQU1FVEVSOw0KPiA+ICsgICAgICB9DQo+ID4gKyAg ICB9DQo+ID4gKyAgICBlbHNlIHsNCj4gPiArICAgICAgQ2hyID0gU291cmNlW0luZHhdOw0KPiA+ ICsgICAgICBpZiAoQkFEX1YgIT0gRGVjb2RpbmdfdGFibGVbKFVJTlQ4KSBDaHJdKSB7DQo+ID4g Kw0KPiA+ICsgICAgICAgIC8vDQo+ID4gKyAgICAgICAgLy8gVGhlICc9JyBjaGFyYWN0ZXJzIGFy ZSBvbmx5IHZhbGlkIGF0IHRoZSBlbmQsIHNvIGFueQ0KPiA+ICsgICAgICAgIC8vIHZhbGlkIGNo YXJhY3RlciBhZnRlciBhbiAnPScsIHdpbGwgYmUgZmxhZ2dlZCBhcyBhbiBlcnJvci4NCj4gPiAr ICAgICAgICAvLw0KPiA+ICsgICAgICAgIGlmIChCdWZmZXJTaXplIDwgMCkgew0KPiA+ICsgICAg ICAgICAgREVCVUcoKERFQlVHX0VSUk9SLCAiU291cmNlPSVwLCBJbnZhbGlkIGNoYXJhY3RlciAl YyBhdCAlZFxuIiwNCj4gU291cmNlLCBDaHIsIEluZHgpKTsNCj4gPiArICAgICAgICAgIHJldHVy biBSRVRVUk5fSU5WQUxJRF9QQVJBTUVURVI7DQo+ID4gKyAgICAgICAgfQ0KPiA+ICsgICAgICAg ICAgQWN0dWFsU291cmNlTGVuZ3RoKys7DQo+ID4gKyAgICAgIH0NCj4gPiArICAgICAgICBlbHNl IHsNCj4gPiArDQo+ID4gKyAgICAgICAgLy8NCj4gPiArICAgICAgICAvLyBUaGUgcmVzZXQgb2Yg dGhlIGRlY29kZXIgd2lsbCBpZ25vcmUgYWxsIGludmFsaWQgY2hhcmFjdGVycyBhbGxvd2VkDQo+ IGhlcmUuDQo+ID4gKyAgICAgICAgLy8gSWdub3Jpbmcgc2VsZWN0ZWQgd2hpdGUgc3BhY2UgaXMg dXNlZnVsLiAgSW4gdGhpcyBjYXNlLCB0aGUgZGVjb2Rlcg0KPiB3aWxsDQo+ID4gKyAgICAgICAg Ly8gaWdub3JlICcgJywgJ1x0JywgJ1xuJywgYW5kICdccicuDQo+ID4gKyAgICAgICAgLy8NCj4g PiArICAgICAgICBpZiAoKENociAhPSAnICcpICYmKENociAhPSAnXHQnKSAmJihDaHIgIT0gJ1xu JykgJiYoQ2hyICE9ICdccicpKSB7DQo+ID4gKyAgICAgICAgICBERUJVRygoREVCVUdfRVJST1Is ICJTb3VyY2U9JXAsIEludmFsaWQgY2hhcmFjdGVyICVjIGF0ICVkXG4iLA0KPiBTb3VyY2UsIENo ciwgSW5keCkpOw0KPiA+ICsgICAgICAgICAgcmV0dXJuIFJFVFVSTl9JTlZBTElEX1BBUkFNRVRF UjsNCj4gPiArICAgICAgICB9DQo+ID4gKyAgICAgIH0NCj4gPiArICAgIH0NCj4gPiArICB9DQo+ ID4gKw0KPiA+ICsgIC8vDQo+ID4gKyAgLy8gVGhlIEJhc2U2NCBjaGFyYWN0ZXIgc3RyaW5nIG11 c3QgYmUgYSBtdWx0aXBsZSBvZiA0IGNoYXJhY3Rlcg0KPiBxdWFudHVtcy4NCj4gPiArICAvLw0K PiA+ICsgIGlmIChBY3R1YWxTb3VyY2VMZW5ndGggJSA0ICE9IDApIHsNCj4gPiArICAgIERFQlVH KChERUJVR19FUlJPUiwiU291cmNlPSVwLCBJbnZhbGlkIGRhdGEgbGVuZ3RoICVkXG4iLCBTb3Vy Y2UsDQo+IEFjdHVhbFNvdXJjZUxlbmd0aCkpOw0KPiA+ICsgICAgcmV0dXJuIFJFVFVSTl9JTlZB TElEX1BBUkFNRVRFUjsNCj4gPiArICB9DQo+ID4gKw0KPiA+ICsgIEJ1ZmZlclNpemUgKz0gQWN0 dWFsU291cmNlTGVuZ3RoIC8gNCAqIDM7DQo+ID4gKyAgICBpZiAoQnVmZmVyU2l6ZSA8IDApIHsN Cj4gPiArICAgICAgREVCVUcoKERFQlVHX0VSUk9SLCJCdWZmZXJTaXplKCVkKSBpcyB3cm9uZyBi ZWNhdXNlIG9mIGJhZA0KPiBpbnB1dC5cbiIsIEJ1ZmZlclNpemUpKTsNCj4gPiArICAgICAgcmV0 dXJuIFJFVFVSTl9JTlZBTElEX1BBUkFNRVRFUjsNCj4gPiArICB9DQo+ID4gKw0KPiA+ICsgIC8v DQo+ID4gKyAgLy8gQnVmZmVyU2l6ZSBpcyA+PSAwDQo+ID4gKyAgLy8NCj4gPiArICBpZiAoKERl c3RpbmF0aW9uID09IE5VTEwpIHx8ICgqRGVzdGluYXRpb25TaXplIDwgKFVJTlROKSBCdWZmZXJT aXplKSkgew0KPiA+ICsgICAgKkRlc3RpbmF0aW9uU2l6ZSA9IEJ1ZmZlclNpemU7DQo+ID4gKyAg ICByZXR1cm4gUkVUVVJOX0JVRkZFUl9UT09fU01BTEw7DQo+ID4gKyAgfQ0KPiA+ICsNCj4gPiAr ICAvLw0KPiA+ICsgIC8vIElmIG5vIGRlY29kYWJsZSBjaGFyYWN0ZXJzLCByZXR1cm4gYSBzaXpl IG9mIHplcm8uIFJGQyA0Njg2IHRlc3QgdmVjdG9yIDEuDQo+ID4gKyAgLy8NCj4gPiArICBpZiAo QWN0dWFsU291cmNlTGVuZ3RoID09IDApIHsNCj4gPiArICAgICpEZXN0aW5hdGlvblNpemUgPSAw Ow0KPiA+ICsgICAgcmV0dXJuIFJFVFVSTl9TVUNDRVNTOw0KPiA+ICsgIH0NCj4gPiArDQo+ID4g KyAgQmluRGF0YSA9IERlc3RpbmF0aW9uOw0KPiA2LiBDYW4geW91IGRpcmVjdGx5IHVzZSBEZXN0 aW5hdGlvbiBhbmQgcmVtb3ZlIEJpbkRhdGEgbG9jYWwgdmFyaWFibGU/DQo+IEkgZG9uJ3QgZmlu ZCBhbnkgZnVydGhlciB1c2FnZSBvZiBEZXN0aW5hdGlvbiBpbiBiZWxvdyBjb2RlLg0KPiA+ICsN Cj4gPiArICAvLw0KPiA+ICsgIC8vIElucHV0IGRhdGEgaXMgdmVyaWZpZWQgdG8gYmUgYSBtdWx0 aXBsZSBvZiA0IHZhbGlkIGNoYXJjdGVycy4gIFByb2Nlc3MgZm91cg0KPiA+ICsgIC8vIGNoYXJh Y3RlcnMgYXQgYSB0aW1lLiBVbmNvdW50ZWQgKGllLiBpbnZhbGlkKSAgY2hhcmFjdGVycyB3aWxs IGJlIGlnbm9yZWQuDQo+ID4gKyAgLy8NCj4gPiArICBmb3IgKEluZHggPSAwLCBPbmR4ID0gMDsg KEluZHggPCBTb3VyY2VMZW5ndGgpICYmIChPbmR4IDwNCj4gKkRlc3RpbmF0aW9uU2l6ZSk7ICkg ew0KPiA+ICsgICAgVmFsdWUgPSAwOw0KPiA+ICsNCj4gPiArICAgIC8vDQo+ID4gKyAgICAvLyBH ZXQgMjQgYml0cyBvZiBkYXRhIGZyb20gNCBpbnB1dCBjaGFyYWN0ZXJzLCBlYWNoIGNoYXJhY3Rl cg0KPiByZXByZXNlbnRpbmcgNiBiaXRzDQo+ID4gKyAgICAvLw0KPiA+ICsgICAgZm9yIChJY250 ID0gMDsgSWNudCA8IDQ7IEljbnQrKykgew0KPiA+ICsgICAgICBkbyB7DQo+ID4gKyAgICAgIENo ciA9IERlY29kaW5nX3RhYmxlWyhVSU5UOCkgU291cmNlW0luZHgrK11dOw0KPiA+ICsgICAgICB9 IHdoaWxlIChDaHIgPT0gQkFEX1YpOw0KPiA+ICsgICAgICBWYWx1ZSA8PD0gNjsNCj4gPiArICAg ICAgVmFsdWUgfD0gQ2hyOw0KPiA+ICsgICAgfQ0KPiA+ICsNCj4gPiArICAgIC8vDQo+ID4gKyAg ICAvLyBTdG9yZSAzIGJ5dGVzIG9mIGJpbmFyeSBkYXRhICgyNCBiaXRzKQ0KPiA+ICsgICAgLy8N Cj4gPiArICAgICpCaW5EYXRhKysgPSAoVUlOVDgpIChWYWx1ZSA+PiAxNik7DQo+ID4gKyAgICBP bmR4Kys7DQo+ID4gKw0KPiA+ICsgICAgLy8NCj4gPiArICAgIC8vIER1ZSB0byB0aGUgJz0nIHNw ZWNpYWwgY2FzZXMgZm9yIHRoZSB0d28gYnl0ZXMgYXQgdGhlIGVuZCwNCj4gPiArICAgIC8vIHdl IGhhdmUgdG8gY2hlY2sgdGhlIGxlbmd0aCBhbmQgbm90IHN0b3JlIHRoZSBwYWRkaW5nIGRhdGEN Cj4gPiArICAgIC8vDQo+ID4gKyAgICBpZiAoT25keCsrIDwgKkRlc3RpbmF0aW9uU2l6ZSkgew0K PiA+ICsgICAgICAqQmluRGF0YSsrID0gKFVJTlQ4KSAoVmFsdWUgPj4gIDgpOw0KPiA+ICsgICAg fQ0KPiA+ICsgICAgaWYgKE9uZHgrKyA8ICpEZXN0aW5hdGlvblNpemUpIHsNCj4gPiArICAgICAg KkJpbkRhdGErKyA9IChVSU5UOCkgVmFsdWU7DQo+ID4gKyAgICB9DQo+ID4gKyAgfQ0KPiA+ICsN Cj4gPiArICByZXR1cm4gUkVUVVJOX1NVQ0NFU1M7DQo+ID4gK30NCj4gPiArDQo+ID4gICAvKioN Cj4gPiAgICAgQ29udmVydHMgYW4gOC1iaXQgdmFsdWUgdG8gYW4gOC1iaXQgQkNEIHZhbHVlLg0K PiA+DQo+ID4NCj4gDQo+IA0KPiAtLQ0KPiBUaGFua3MsDQo+IFJheQ0KDQpGb3IgRUNDIGNoZWNr LCB0aGUgRUNDIGNoZWNraW5nIHRvb2wgc2VlbXMgbm90IHRvIHRha2UgaXQgYXMgZXJyb3IgY29k ZS4NCkZvciBvdGhlciBjb21tZW50cywgSSAnZCBsaWtlIHRvIGdlbmVyYXRlIGEgbmV3IHBhdGNo IGFjY29yZGluZyB0byB5b3VyIG9waW5pb25zIGFuZCBzZW50IGl0IG91dC4NCg0KVGhhbmtzLA0K U2hlbmdsZWkNCg==