Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.0 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A82CBC43381 for ; Mon, 11 Mar 2019 22:20:54 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 54163214AE for ; Mon, 11 Mar 2019 22:20:54 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727605AbfCKWUy (ORCPT ); Mon, 11 Mar 2019 18:20:54 -0400 Received: from mga12.intel.com ([192.55.52.136]:51355 "EHLO mga12.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727008AbfCKWUx (ORCPT ); Mon, 11 Mar 2019 18:20:53 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga106.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 11 Mar 2019 15:20:52 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.58,468,1544515200"; d="scan'208";a="124604156" Received: from orsmsx101.amr.corp.intel.com ([10.22.225.128]) by orsmga008.jf.intel.com with ESMTP; 11 Mar 2019 15:20:52 -0700 Received: from orsmsx156.amr.corp.intel.com (10.22.240.22) by ORSMSX101.amr.corp.intel.com (10.22.225.128) with Microsoft SMTP Server (TLS) id 14.3.408.0; Mon, 11 Mar 2019 15:20:51 -0700 Received: from orsmsx103.amr.corp.intel.com ([169.254.5.129]) by ORSMSX156.amr.corp.intel.com ([169.254.8.82]) with mapi id 14.03.0415.000; Mon, 11 Mar 2019 15:20:51 -0700 From: "Gix, Brian" To: "linux-bluetooth@vger.kernel.org" , "Stotland, Inga" CC: "luiz.dentz@gmail.com" , "johan.hedberg@gmail.com" Subject: Re: [PATCH BlueZ v3] test: Add unified test for mesh node example app Thread-Topic: [PATCH BlueZ v3] test: Add unified test for mesh node example app Thread-Index: AQHU1xZT1KzS6wanlUmCN5WfbAWzH6YHeIcA Date: Mon, 11 Mar 2019 22:20:50 +0000 Message-ID: <1552342848.29289.3.camel@intel.com> References: <20190310075313.13914-1-inga.stotland@intel.com> In-Reply-To: <20190310075313.13914-1-inga.stotland@intel.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.251.149.88] Content-Type: text/plain; charset="utf-8" Content-ID: <97F757CD481ECC49ABA1C6911DF418D7@intel.com> Content-Transfer-Encoding: base64 MIME-Version: 1.0 Sender: linux-bluetooth-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org QXBwbGllZA0KDQpPbiBTYXQsIDIwMTktMDMtMDkgYXQgMjM6NTMgLTA4MDAsIEluZ2EgU3RvdGxh bmQgd3JvdGU6DQo+IFRoaXMgYWRkcyBvbmUgc2NyaXB0LCB0ZXN0LW1lc2gsIHRvIHJlcGxhY2Ug dGhyZWUgdGVzdC1qb2luLA0KPiBleGFtcGxlLW9ub2ZmLXNlcnZlciBhbmQgZXhhbXBsZS1vbm9m Zi1jbGllbnQuDQo+IFRoaXMgaXMgbWVudSBkcml2ZW4gdGVzdCB0aGF0IGFsbG93cyBwcm92aXNp b25pbmcgKGpvaW4pIGFuZC9vcg0KPiBjb25uZWN0aW5nIGV4aXN0aW5nIChhdHRhY2gpIG5vZGVz Lg0KPiAtLS0NCj4gIE1ha2VmaWxlLnRvb2xzICAgICAgICAgICAgfCAgIDIgKy0NCj4gIHRlc3Qv YWdlbnQucHkgICAgICAgICAgICAgfCAgMTQgKy0NCj4gIHRlc3QvZXhhbXBsZS1vbm9mZi1jbGll bnQgfCAyODggLS0tLS0tLS0tLS0tLQ0KPiAgdGVzdC9leGFtcGxlLW9ub2ZmLXNlcnZlciB8IDM2 NSAtLS0tLS0tLS0tLS0tLS0tLQ0KPiAgdGVzdC90ZXN0LW1lc2ggICAgICAgICAgICB8IDg0MiAr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKw0KPiAgNSBmaWxlcyBjaGFuZ2Vk LCA4NTQgaW5zZXJ0aW9ucygrKSwgNjU3IGRlbGV0aW9ucygtKQ0KPiAgZGVsZXRlIG1vZGUgMTAw NjQ0IHRlc3QvZXhhbXBsZS1vbm9mZi1jbGllbnQNCj4gIGRlbGV0ZSBtb2RlIDEwMDY0NCB0ZXN0 L2V4YW1wbGUtb25vZmYtc2VydmVyDQo+ICBjcmVhdGUgbW9kZSAxMDA3NTUgdGVzdC90ZXN0LW1l c2gNCj4gDQo+IGRpZmYgLS1naXQgYS9NYWtlZmlsZS50b29scyBiL01ha2VmaWxlLnRvb2xzDQo+ IGluZGV4IDBmOTRiYmJlNy4uMzc5ZTEyN2I2IDEwMDY0NA0KPiAtLS0gYS9NYWtlZmlsZS50b29s cw0KPiArKysgYi9NYWtlZmlsZS50b29scw0KPiBAQCAtNDYzLDcgKzQ2Myw3IEBAIHRlc3Rfc2Ny aXB0cyArPSB0ZXN0L3NhcF9jbGllbnQucHkgdGVzdC9ibHVlenV0aWxzLnB5IFwNCj4gIAkJdGVz dC90ZXN0LWhmcCB0ZXN0L29wcC1jbGllbnQgdGVzdC9mdHAtY2xpZW50IFwNCj4gIAkJdGVzdC9w YmFwLWNsaWVudCB0ZXN0L21hcC1jbGllbnQgdGVzdC9leGFtcGxlLWFkdmVydGlzZW1lbnQgXA0K PiAgCQl0ZXN0L2V4YW1wbGUtZ2F0dC1zZXJ2ZXIgdGVzdC9leGFtcGxlLWdhdHQtY2xpZW50IFwN Cj4gLQkJdGVzdC90ZXN0LWdhdHQtcHJvZmlsZQ0KPiArCQl0ZXN0L3Rlc3QtZ2F0dC1wcm9maWxl IHRlc3QvdGVzdC1tZXNoIHRlc3QvYWdlbnQucHkNCj4gIA0KPiAgaWYgQlRQQ0xJRU5UDQo+ICBu b2luc3RfUFJPR1JBTVMgKz0gdG9vbHMvYnRwY2xpZW50DQo+IGRpZmYgLS1naXQgYS90ZXN0L2Fn ZW50LnB5IGIvdGVzdC9hZ2VudC5weQ0KPiBpbmRleCAyMmM5MmY5NTIuLjc3OGRiZTA5MiAxMDA3 NTUNCj4gLS0tIGEvdGVzdC9hZ2VudC5weQ0KPiArKysgYi90ZXN0L2FnZW50LnB5DQo+IEBAIC0x LDkgKzEsMTYgQEANCj4gLSMhL3Vzci9iaW4vcHl0aG9uDQo+ICsjIS91c3IvYmluL3B5dGhvbjMN Cj4gIA0KPiAgaW1wb3J0IHN5cw0KPiAgaW1wb3J0IGRidXMNCj4gIGltcG9ydCBkYnVzLnNlcnZp Y2UNCj4gLWltcG9ydCBkYnVzLm1haW5sb29wLmdsaWINCj4gKw0KPiArdHJ5Og0KPiArICBmcm9t IHRlcm1jb2xvciBpbXBvcnQgY29sb3JlZCwgY3ByaW50DQo+ICsgIHNldF9ncmVlbiA9IGxhbWJk YSB4OiBjb2xvcmVkKHgsICdncmVlbicsIGF0dHJzPVsnYm9sZCddKQ0KPiArICBzZXRfY3lhbiA9 IGxhbWJkYSB4OiBjb2xvcmVkKHgsICdjeWFuJywgYXR0cnM9Wydib2xkJ10pDQo+ICtleGNlcHQg SW1wb3J0RXJyb3I6DQo+ICsgIHNldF9ncmVlbiA9IGxhbWJkYSB4OiB4DQo+ICsgIHNldF9jeWFu ID0gbGFtYmRhIHg6IHgNCj4gIA0KPiAgQUdFTlRfSUZBQ0UgPSAnb3JnLmJsdWV6Lm1lc2guUHJv dmlzaW9uQWdlbnQxJw0KPiAgQUdFTlRfUEFUSCA9ICIvbWVzaC90ZXN0L2FnZW50Ig0KPiBAQCAt MzcsNCArNDQsNSBAQCBjbGFzcyBBZ2VudChkYnVzLnNlcnZpY2UuT2JqZWN0KToNCj4gIA0KPiAg CUBkYnVzLnNlcnZpY2UubWV0aG9kKEFHRU5UX0lGQUNFLCBpbl9zaWduYXR1cmU9InN1Iiwgb3V0 X3NpZ25hdHVyZT0iIikNCj4gIAlkZWYgRGlzcGxheU51bWVyaWMoc2VsZiwgdHlwZSwgdmFsdWUp Og0KPiAtCQlwcmludCgiRGlzcGxheU51bWVyaWMgdHlwZT0iLCB0eXBlLCAiIG51bWJlcj0iLCB2 YWx1ZSkNCj4gKwkJcHJpbnQoc2V0X2N5YW4oJ0Rpc3BsYXlOdW1lcmljICgnKSwgdHlwZSwNCj4g KwkJCQlzZXRfY3lhbignKSBudW1iZXIgPScpLCBzZXRfZ3JlZW4odmFsdWUpKQ0KPiBkaWZmIC0t Z2l0IGEvdGVzdC9leGFtcGxlLW9ub2ZmLWNsaWVudCBiL3Rlc3QvZXhhbXBsZS1vbm9mZi1jbGll bnQNCj4gZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0DQo+IGluZGV4IGU0YTg3ZWIxMi4uMDAwMDAw MDAwDQo+IC0tLSBhL3Rlc3QvZXhhbXBsZS1vbm9mZi1jbGllbnQNCj4gKysrIC9kZXYvbnVsbA0K PiBAQCAtMSwyODggKzAsMCBAQA0KPiAtIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMw0KPiAtDQo+IC1p bXBvcnQgc3lzDQo+IC1pbXBvcnQgc3RydWN0DQo+IC1pbXBvcnQgbnVtcHkNCj4gLWltcG9ydCBk YnVzDQo+IC1pbXBvcnQgZGJ1cy5zZXJ2aWNlDQo+IC1pbXBvcnQgZGJ1cy5leGNlcHRpb25zDQo+ IC0NCj4gLXRyeToNCj4gLSAgZnJvbSBnaS5yZXBvc2l0b3J5IGltcG9ydCBHT2JqZWN0DQo+IC1l eGNlcHQgSW1wb3J0RXJyb3I6DQo+IC0gIGltcG9ydCBnb2JqZWN0IGFzIEdPYmplY3QNCj4gLWZy b20gZGJ1cy5tYWlubG9vcC5nbGliIGltcG9ydCBEQnVzR01haW5Mb29wDQo+IC0NCj4gLU1FU0hf U0VSVklDRV9OQU1FID0gJ29yZy5ibHVlei5tZXNoJw0KPiAtREJVU19QUk9QX0lGQUNFID0gJ29y Zy5mcmVlZGVza3RvcC5EQnVzLlByb3BlcnRpZXMnDQo+IC1EQlVTX09NX0lGQUNFID0gJ29yZy5m cmVlZGVza3RvcC5EQnVzLk9iamVjdE1hbmFnZXInDQo+IC0NCj4gLU1FU0hfTkVUV09SS19JRkFD RSA9ICdvcmcuYmx1ZXoubWVzaC5OZXR3b3JrMScNCj4gLU1FU0hfTk9ERV9JRkFDRSA9ICdvcmcu Ymx1ZXoubWVzaC5Ob2RlMScNCj4gLU1FU0hfRUxFTUVOVF9JRkFDRSA9ICdvcmcuYmx1ZXoubWVz aC5FbGVtZW50MScNCj4gLQ0KPiAtVkVORE9SX0lEX05PTkUgPSAweGZmZmYNCj4gLQ0KPiAtYXBw ID0gTm9uZQ0KPiAtYnVzID0gTm9uZQ0KPiAtbWFpbmxvb3AgPSBOb25lDQo+IC1ub2RlID0gTm9u ZQ0KPiAtdG9rZW4gPSBudW1weS51aW50NjQoMHg3NmJkNGYyMzcyNDc3NjAwKQ0KPiAtDQo+IC1k ZWYgdW53cmFwKGl0ZW0pOg0KPiAtCWlmIGlzaW5zdGFuY2UoaXRlbSwgZGJ1cy5Cb29sZWFuKToN Cj4gLQkJcmV0dXJuIGJvb2woaXRlbSkNCj4gLQlpZiBpc2luc3RhbmNlKGl0ZW0sIChkYnVzLlVJ bnQxNiwgZGJ1cy5JbnQxNiwgZGJ1cy5VSW50MzIsIGRidXMuSW50MzIsDQo+IC0JCQkJCQlkYnVz LlVJbnQ2NCwgZGJ1cy5JbnQ2NCkpOg0KPiAtCQlyZXR1cm4gaW50KGl0ZW0pDQo+IC0JaWYgaXNp bnN0YW5jZShpdGVtLCBkYnVzLkJ5dGUpOg0KPiAtCQlyZXR1cm4gYnl0ZXMoW2ludChpdGVtKV0p DQo+IC0JaWYgaXNpbnN0YW5jZShpdGVtLCBkYnVzLlN0cmluZyk6DQo+IC0JCQlyZXR1cm4gaXRl bQ0KPiAtCWlmIGlzaW5zdGFuY2UoaXRlbSwgKGRidXMuQXJyYXksIGxpc3QsIHR1cGxlKSk6DQo+ IC0JCXJldHVybiBbdW53cmFwKHgpIGZvciB4IGluIGl0ZW1dDQo+IC0JaWYgaXNpbnN0YW5jZShp dGVtLCAoZGJ1cy5EaWN0aW9uYXJ5LCBkaWN0KSk6DQo+IC0JCXJldHVybiBkaWN0KFsodW53cmFw KHgpLCB1bndyYXAoeSkpIGZvciB4LCB5IGluIGl0ZW0uaXRlbXMoKV0pDQo+IC0NCj4gLQlwcmlu dCgnRGljdGlvbmFyeSBpdGVtIG5vdCBoYW5kbGVkJykNCj4gLQlwcmludCh0eXBlKGl0ZW0pKQ0K PiAtCXJldHVybiBpdGVtDQo+IC0NCj4gLWRlZiBhdHRhY2hfYXBwX2NiKG5vZGVfcGF0aCwgZGlj dF9hcnJheSk6DQo+IC0JcHJpbnQoJ01lc2ggYXBwbGljYXRpb24gcmVnaXN0ZXJlZCAnLCBub2Rl X3BhdGgpDQo+IC0JcHJpbnQodHlwZShub2RlX3BhdGgpKQ0KPiAtCXByaW50KHR5cGUoZGljdF9h cnJheSkpDQo+IC0JcHJpbnQoZGljdF9hcnJheSkNCj4gLQ0KPiAtCWVscyA9IHVud3JhcChkaWN0 X2FycmF5KQ0KPiAtCXByaW50KCJHZXQgRWxlbWVudHMiKQ0KPiAtCWZvciBlbCBpbiBlbHM6DQo+ IC0JCXByaW50KGVsKQ0KPiAtCQlpZHggPSBzdHJ1Y3QudW5wYWNrKCdiJywgZWxbMF0pWzBdDQo+ IC0JCXByaW50KCdDb25maWd1cmF0aW9uIGZvciBFbGVtZW50ICcsIGVuZD0nJykNCj4gLQkJcHJp bnQoaWR4KQ0KPiAtCQltb2RlbHMgPSBlbFsxXQ0KPiAtDQo+IC0JCWVsZW1lbnQgPSBhcHAuZ2V0 X2VsZW1lbnQoaWR4KQ0KPiAtCQllbGVtZW50LnNldF9tb2RlbF9jb25maWcobW9kZWxzKQ0KPiAt DQo+IC0Jb2JqID0gYnVzLmdldF9vYmplY3QoTUVTSF9TRVJWSUNFX05BTUUsIG5vZGVfcGF0aCkN Cj4gLQlnbG9iYWwgbm9kZQ0KPiAtCW5vZGUgPSBkYnVzLkludGVyZmFjZShvYmosIE1FU0hfTk9E RV9JRkFDRSkNCj4gLQ0KPiAtZGVmIGVycm9yX2NiKGVycm9yKToNCj4gLQlwcmludCgnRC1CdXMg Y2FsbCBmYWlsZWQ6ICcgKyBzdHIoZXJyb3IpKQ0KPiAtDQo+IC1kZWYgZ2VuZXJpY19yZXBseV9j YigpOg0KPiAtCXByaW50KCdELUJ1cyBjYWxsIGRvbmUnKQ0KPiAtDQo+IC1kZWYgaW50ZXJmYWNl c19yZW1vdmVkX2NiKG9iamVjdF9wYXRoLCBpbnRlcmZhY2VzKToNCj4gLQlpZiBub3QgbWVzaF9u ZXQ6DQo+IC0JCXJldHVybg0KPiAtDQo+IC0JaWYgb2JqZWN0X3BhdGggPT0gbWVzaF9uZXRbMl06 DQo+IC0JCXByaW50KCdTZXJ2aWNlIHdhcyByZW1vdmVkJykNCj4gLQkJbWFpbmxvb3AucXVpdCgp DQo+IC0NCj4gLWNsYXNzIEFwcGxpY2F0aW9uKGRidXMuc2VydmljZS5PYmplY3QpOg0KPiAtDQo+ IC0JZGVmIF9faW5pdF9fKHNlbGYsIGJ1cyk6DQo+IC0JCXNlbGYucGF0aCA9ICcvZXhhbXBsZScN Cj4gLQkJc2VsZi5lbGVtZW50cyA9IFtdDQo+IC0JCWRidXMuc2VydmljZS5PYmplY3QuX19pbml0 X18oc2VsZiwgYnVzLCBzZWxmLnBhdGgpDQo+IC0NCj4gLQlkZWYgZ2V0X3BhdGgoc2VsZik6DQo+ IC0JCXJldHVybiBkYnVzLk9iamVjdFBhdGgoc2VsZi5wYXRoKQ0KPiAtDQo+IC0JZGVmIGFkZF9l bGVtZW50KHNlbGYsIGVsZW1lbnQpOg0KPiAtCQlzZWxmLmVsZW1lbnRzLmFwcGVuZChlbGVtZW50 KQ0KPiAtDQo+IC0JZGVmIGdldF9lbGVtZW50KHNlbGYsIGlkeCk6DQo+IC0JCWZvciBlbGUgaW4g c2VsZi5lbGVtZW50czoNCj4gLQkJCWlmIGVsZS5nZXRfaW5kZXgoKSA9PSBpZHg6DQo+IC0JCQkJ cmV0dXJuIGVsZQ0KPiAtDQo+IC0JQGRidXMuc2VydmljZS5tZXRob2QoREJVU19PTV9JRkFDRSwg b3V0X3NpZ25hdHVyZT0nYXtvYXtzYXtzdn19fScpDQo+IC0JZGVmIEdldE1hbmFnZWRPYmplY3Rz KHNlbGYpOg0KPiAtCQlyZXNwb25zZSA9IHt9DQo+IC0JCXByaW50KCdHZXRNYW5hZ2VkT2JqZWN0 cycpDQo+IC0JCWZvciBlbGVtZW50IGluIHNlbGYuZWxlbWVudHM6DQo+IC0JCQlyZXNwb25zZVtl bGVtZW50LmdldF9wYXRoKCldID0gZWxlbWVudC5nZXRfcHJvcGVydGllcygpDQo+IC0JCXJldHVy biByZXNwb25zZQ0KPiAtDQo+IC1jbGFzcyBFbGVtZW50KGRidXMuc2VydmljZS5PYmplY3QpOg0K PiAtCVBBVEhfQkFTRSA9ICcvZXhhbXBsZS9lbGUnDQo+IC0NCj4gLQlkZWYgX19pbml0X18oc2Vs ZiwgYnVzLCBpbmRleCk6DQo+IC0JCXNlbGYucGF0aCA9IHNlbGYuUEFUSF9CQVNFICsgZm9ybWF0 KGluZGV4LCAnMDJ4JykNCj4gLQkJcHJpbnQoc2VsZi5wYXRoKQ0KPiAtCQlzZWxmLm1vZGVscyA9 IFtdDQo+IC0JCXNlbGYuYnVzID0gYnVzDQo+IC0JCXNlbGYuaW5kZXggPSBpbmRleA0KPiAtCQlk YnVzLnNlcnZpY2UuT2JqZWN0Ll9faW5pdF9fKHNlbGYsIGJ1cywgc2VsZi5wYXRoKQ0KPiAtDQo+ IC0JZGVmIF9nZXRfc2lnX21vZGVscyhzZWxmKToNCj4gLQkJaWRzID0gW10NCj4gLQkJZm9yIG1v ZGVsIGluIHNlbGYubW9kZWxzOg0KPiAtCQkJaWQgPSBtb2RlbC5nZXRfaWQoKQ0KPiAtCQkJdmVu ZG9yID0gbW9kZWwuZ2V0X3ZlbmRvcigpDQo+IC0JCQlpZiB2ZW5kb3IgPT0gVkVORE9SX0lEX05P TkU6DQo+IC0JCQkJaWRzLmFwcGVuZChpZCkNCj4gLQkJcmV0dXJuIGlkcw0KPiAtDQo+IC0JZGVm IGdldF9wcm9wZXJ0aWVzKHNlbGYpOg0KPiAtCQlyZXR1cm4gew0KPiAtCQkJCU1FU0hfRUxFTUVO VF9JRkFDRTogew0KPiAtCQkJCSdJbmRleCc6IGRidXMuQnl0ZShzZWxmLmluZGV4KSwNCj4gLQkJ CQknTW9kZWxzJzogZGJ1cy5BcnJheSgNCj4gLQkJCQkJc2VsZi5fZ2V0X3NpZ19tb2RlbHMoKSwg c2lnbmF0dXJlPSdxJykNCj4gLQkJCQl9DQo+IC0JCX0NCj4gLQ0KPiAtCWRlZiBhZGRfbW9kZWwo c2VsZiwgbW9kZWwpOg0KPiAtCQltb2RlbC5zZXRfcGF0aChzZWxmLnBhdGgpDQo+IC0JCXNlbGYu bW9kZWxzLmFwcGVuZChtb2RlbCkNCj4gLQ0KPiAtCWRlZiBnZXRfaW5kZXgoc2VsZik6DQo+IC0J CXJldHVybiBzZWxmLmluZGV4DQo+IC0NCj4gLQlkZWYgc2V0X21vZGVsX2NvbmZpZyhzZWxmLCBj b25maWcpOg0KPiAtCQlwcmludCgnU2V0IGVsZW1lbnQgbW9kZWxzIGNvbmZpZycpDQo+IC0NCj4g LQlAZGJ1cy5zZXJ2aWNlLm1ldGhvZChNRVNIX0VMRU1FTlRfSUZBQ0UsDQo+IC0JCQkJCWluX3Np Z25hdHVyZT0icXFiYXkiLCBvdXRfc2lnbmF0dXJlPSIiKQ0KPiAtCWRlZiBNZXNzYWdlUmVjZWl2 ZWQoc2VsZiwgc291cmNlLCBrZXksIGlzX3N1YiwgZGF0YSk6DQo+IC0JCXByaW50KCdNZXNzYWdl IFJlY2VpdmVkIG9uIEVsZW1lbnQgJywgZW5kPScnKQ0KPiAtCQlwcmludChzZWxmLmluZGV4KQ0K PiAtCQlmb3IgbW9kZWwgaW4gc2VsZi5tb2RlbHM6DQo+IC0JCQltb2RlbC5wcm9jZXNzX21lc3Nh Z2Uoc291cmNlLCBrZXksIGRhdGEpDQo+IC0NCj4gLQlAZGJ1cy5zZXJ2aWNlLm1ldGhvZChNRVNI X0VMRU1FTlRfSUZBQ0UsDQo+IC0JCQkJCWluX3NpZ25hdHVyZT0icWF7c3Z9Iiwgb3V0X3NpZ25h dHVyZT0iIikNCj4gLQ0KPiAtCWRlZiBVcGRhdGVNb2RlbENvbmZpZ3VyYXRpb24oc2VsZiwgbW9k ZWxfaWQsIGNvbmZpZyk6DQo+IC0JCXByaW50KCdVcGRhdGVNb2RlbENvbmZpZyAnLCBlbmQ9Jycp DQo+IC0JCXByaW50KGhleChtb2RlbF9pZCkpDQo+IC0JCWZvciBtb2RlbCBpbiBzZWxmLm1vZGVs czoNCj4gLQkJCWlmIG1vZGVsX2lkID09IG1vZGVsLmdldF9pZCgpOg0KPiAtCQkJCW1vZGVsLnNl dF9jb25maWcoY29uZmlnKQ0KPiAtCQkJCXJldHVybg0KPiAtDQo+IC0JQGRidXMuc2VydmljZS5t ZXRob2QoTUVTSF9FTEVNRU5UX0lGQUNFLA0KPiAtCQkJCQlpbl9zaWduYXR1cmU9IiIsIG91dF9z aWduYXR1cmU9IiIpDQo+IC0JZGVmIGdldF9wYXRoKHNlbGYpOg0KPiAtCQlyZXR1cm4gZGJ1cy5P YmplY3RQYXRoKHNlbGYucGF0aCkNCj4gLQ0KPiAtY2xhc3MgTW9kZWwoKToNCj4gLQlkZWYgX19p bml0X18oc2VsZiwgbW9kZWxfaWQpOg0KPiAtCQlzZWxmLmNtZF9vcHMgPSBbXQ0KPiAtCQlzZWxm Lm1vZGVsX2lkID0gbW9kZWxfaWQNCj4gLQkJc2VsZi52ZW5kb3IgPSBWRU5ET1JfSURfTk9ORQ0K PiAtCQlzZWxmLnBhdGggPSBOb25lDQo+IC0NCj4gLQlkZWYgc2V0X3BhdGgoc2VsZiwgcGF0aCk6 DQo+IC0JCXNlbGYucGF0aCA9IHBhdGgNCj4gLQ0KPiAtCWRlZiBnZXRfaWQoc2VsZik6DQo+IC0J CXJldHVybiBzZWxmLm1vZGVsX2lkDQo+IC0NCj4gLQlkZWYgZ2V0X3ZlbmRvcihzZWxmKToNCj4g LQkJcmV0dXJuIHNlbGYudmVuZG9yDQo+IC0NCj4gLQlkZWYgcHJvY2Vzc19tZXNzYWdlKHNlbGYs IHNvdXJjZSwga2V5LCBkYXRhKToNCj4gLQkJcHJpbnQoJ01vZGVsIHByb2Nlc3MgbWVzc2FnZScp DQo+IC0NCj4gLQlkZWYgc2V0X3B1YmxpY2F0aW9uKHNlbGYsIHBlcmlvZCk6DQo+IC0JCXNlbGYu cGVyaW9kID0gcGVyaW9kDQo+IC0NCj4gLQlkZWYgc2V0X2JpbmRpbmdzKHNlbGYsIGJpbmRpbmdz KToNCj4gLQkJc2VsZi5iaW5kaW5ncyA9IGJpbmRpbmdzDQo+IC0NCj4gLQlkZWYgc2V0X2NvbmZp ZyhzZWxmLCBjb25maWcpOg0KPiAtCQlpZiAnQmluZGluZ3MnIGluIGNvbmZpZzoNCj4gLQkJCXNl bGYuYmluZGluZ3MgPSBjb25maWcuZ2V0KCdCaW5kaW5ncycpDQo+IC0JCQlwcmludCgnQmluZGlu Z3M6ICcsIGVuZD0nJykNCj4gLQkJCXByaW50KHNlbGYuYmluZGluZ3MpDQo+IC0JCWlmICdQdWJs aWNhdGlvblBlcmlvZCcgaW4gY29uZmlnOg0KPiAtCQkJc2VsZi5zZXRfcHVibGljYXRpb24oY29u ZmlnLmdldCgnUHVibGljYXRpb25QZXJpb2QnKSkNCj4gLQkJCXByaW50KCdNb2RlbCBwdWJsaWNh dGlvbiBwZXJpb2QgJywgZW5kPScnKQ0KPiAtCQkJcHJpbnQoc2VsZi5wdWJfcGVyaW9kLCBlbmQ9 JycpDQo+IC0JCQlwcmludCgnIG1zJykNCj4gLQ0KPiAtY2xhc3MgT25PZmZDbGllbnQoTW9kZWwp Og0KPiAtCWRlZiBfX2luaXRfXyhzZWxmLCBtb2RlbF9pZCk6DQo+IC0JCU1vZGVsLl9faW5pdF9f KHNlbGYsIG1vZGVsX2lkKQ0KPiAtCQlzZWxmLmNtZF9vcHMgPSB7IDB4ODIwMSwgIyBnZXQNCj4g LQkJCQkJCSAweDgyMDIsICMgc2V0DQo+IC0JCQkJCQkgMHg4MjAzIH0gIyBzZXQgdW5hY2tub3ds ZWRnZWQNCj4gLQkJcHJpbnQoJ09uT2ZmIENsaWVudCcpDQo+IC0NCj4gLQlkZWYgX3JlcGx5X2Ni KHN0YXRlKToNCj4gLQkJcHJpbnQoJ1N0YXRlICcsIGVuZD0nJyk7DQo+IC0JCXByaW50KHN0YXRl KQ0KPiAtDQo+IC0JZGVmIF9zZW5kX21lc3NhZ2Uoc2VsZiwgZGVzdCwga2V5LCBkYXRhLCByZXBs eV9jYik6DQo+IC0JCXByaW50KCdPbk9mZkNsaWVudCBzZW5kIGRhdGEnKQ0KPiAtCQlub2RlLlNl bmQoc2VsZi5wYXRoLCBkZXN0LCBrZXksIGRhdGEsIHJlcGx5X2hhbmRsZXI9cmVwbHlfY2IsDQo+ IC0JCQkJICBlcnJvcl9oYW5kbGVyPWVycm9yX2NiKQ0KPiAtDQo+IC0JZGVmIGdldF9zdGF0ZShz ZWxmLCBkZXN0LCBrZXkpOg0KPiAtCQlvcGNvZGUgPSAweDgyMDENCj4gLQkJZGF0YSA9IHN0cnVj dC5wYWNrKCc8SCcsIG9wY29kZSkNCj4gLQkJc2VsZi5fc2VuZF9tZXNzYWdlKGRlc3QsIGtleSwg ZGF0YSwgc2VsZi5fcmVwbHlfY2IpDQo+IC0NCj4gLQlkZWYgc2V0X3N0YXRlKHNlbGYsIGRlc3Qs IGtleSwgc3RhdGUpOg0KPiAtCQlvcGNvZGUgPSAweDgyMDINCj4gLQkJZGF0YSA9IHN0cnVjdC5w YWNrKCc8SEInLCBvcGNvZGUsIHN0YXRlKQ0KPiAtCQlzZWxmLl9zZW5kX21lc3NhZ2UoZGVzdCwg a2V5LCBkYXRhLCBzZWxmLl9yZXBseV9jYikNCj4gLQ0KPiAtCWRlZiBwcm9jZXNzX21lc3NhZ2Uo c2VsZiwgc291cmNlLCBrZXksIGRhdGEpOg0KPiAtCQlwcmludCgnT25PZmZDbGllbnQgcHJvY2Vz cyBtZXNzYWdlIGxlbiAnLCBlbmQgPSAnJykNCj4gLQkJZGF0YWxlbiA9IGxlbihkYXRhKQ0KPiAt CQlwcmludChkYXRhbGVuKQ0KPiAtDQo+IC0JCWlmIGRhdGFsZW4hPTM6DQo+IC0JCQlyZXR1cm4N Cj4gLQ0KPiAtCQlvcGNvZGUsIHN0YXRlPXN0cnVjdC51bnBhY2soJzxIQicsYnl0ZXMoZGF0YSkp DQo+IC0JCWlmIG9wY29kZSAhPSAweDgyMDIgOg0KPiAtCQkJcHJpbnQoJ0JhZCBvcGNvZGUgJywg ZW5kPScnKQ0KPiAtCQkJcHJpbnQoaGV4KG9wY29kZSkpDQo+IC0JCQlyZXR1cm4NCj4gLQ0KPiAt CQlwcmludCgnR290IHN0YXRlICcsIGVuZCA9ICcnKQ0KPiAtCQlwcmludChoZXgoc3RhdGUpKQ0K PiAtDQo+IC1kZWYgYXR0YWNoX2FwcF9lcnJvcl9jYihlcnJvcik6DQo+IC0JcHJpbnQoJ0ZhaWxl ZCB0byByZWdpc3RlciBhcHBsaWNhdGlvbjogJyArIHN0cihlcnJvcikpDQo+IC0JbWFpbmxvb3Au cXVpdCgpDQo+IC0NCj4gLWRlZiBtYWluKCk6DQo+IC0NCj4gLQlEQnVzR01haW5Mb29wKHNldF9h c19kZWZhdWx0PVRydWUpDQo+IC0NCj4gLQlnbG9iYWwgYnVzDQo+IC0JYnVzID0gZGJ1cy5TeXN0 ZW1CdXMoKQ0KPiAtCWdsb2JhbCBtYWlubG9vcA0KPiAtCWdsb2JhbCBhcHANCj4gLQ0KPiAtCW1l c2hfbmV0ID0gZGJ1cy5JbnRlcmZhY2UoYnVzLmdldF9vYmplY3QoTUVTSF9TRVJWSUNFX05BTUUs DQo+IC0JCQkJCQkJIi9vcmcvYmx1ZXovbWVzaCIpLA0KPiAtCQkJCQkJCU1FU0hfTkVUV09SS19J RkFDRSkNCj4gLQltZXNoX25ldC5jb25uZWN0X3RvX3NpZ25hbCgnSW50ZXJmYWNlc1JlbW92ZWQn LCBpbnRlcmZhY2VzX3JlbW92ZWRfY2IpDQo+IC0NCj4gLQlhcHAgPSBBcHBsaWNhdGlvbihidXMp DQo+IC0JZmlyc3RfZWxlID0gRWxlbWVudChidXMsIDB4MDApDQo+IC0JZmlyc3RfZWxlLmFkZF9t b2RlbChPbk9mZkNsaWVudCgweDEwMDEpKQ0KPiAtCWFwcC5hZGRfZWxlbWVudChmaXJzdF9lbGUp DQo+IC0NCj4gLQltYWlubG9vcCA9IEdPYmplY3QuTWFpbkxvb3AoKQ0KPiAtDQo+IC0JcHJpbnQo J0F0dGFjaCcpDQo+IC0JbWVzaF9uZXQuQXR0YWNoKGFwcC5nZXRfcGF0aCgpLCB0b2tlbiwNCj4g LQkJCQkJcmVwbHlfaGFuZGxlcj1hdHRhY2hfYXBwX2NiLA0KPiAtCQkJCQllcnJvcl9oYW5kbGVy PWF0dGFjaF9hcHBfZXJyb3JfY2IpDQo+IC0JbWFpbmxvb3AucnVuKCkNCj4gLQ0KPiAtaWYgX19u YW1lX18gPT0gJ19fbWFpbl9fJzoNCj4gLQltYWluKCkNCj4gZGlmZiAtLWdpdCBhL3Rlc3QvZXhh bXBsZS1vbm9mZi1zZXJ2ZXIgYi90ZXN0L2V4YW1wbGUtb25vZmYtc2VydmVyDQo+IGRlbGV0ZWQg ZmlsZSBtb2RlIDEwMDY0NA0KPiBpbmRleCAxMzFiNjQxNWMuLjAwMDAwMDAwMA0KPiAtLS0gYS90 ZXN0L2V4YW1wbGUtb25vZmYtc2VydmVyDQo+ICsrKyAvZGV2L251bGwNCj4gQEAgLTEsMzY1ICsw LDAgQEANCj4gLSMhL3Vzci9iaW4vZW52IHB5dGhvbjMNCj4gLQ0KPiAtaW1wb3J0IHN5cw0KPiAt aW1wb3J0IHN0cnVjdA0KPiAtaW1wb3J0IG51bXB5DQo+IC1pbXBvcnQgZGJ1cw0KPiAtaW1wb3J0 IGRidXMuc2VydmljZQ0KPiAtaW1wb3J0IGRidXMuZXhjZXB0aW9ucw0KPiAtDQo+IC1mcm9tIHRo cmVhZGluZyBpbXBvcnQgVGltZXINCj4gLWltcG9ydCB0aW1lDQo+IC0NCj4gLQ0KPiAtdHJ5Og0K PiAtICBmcm9tIGdpLnJlcG9zaXRvcnkgaW1wb3J0IEdPYmplY3QNCj4gLWV4Y2VwdCBJbXBvcnRF cnJvcjoNCj4gLSAgaW1wb3J0IGdvYmplY3QgYXMgR09iamVjdA0KPiAtZnJvbSBkYnVzLm1haW5s b29wLmdsaWIgaW1wb3J0IERCdXNHTWFpbkxvb3ANCj4gLQ0KPiAtTUVTSF9TRVJWSUNFX05BTUUg PSAnb3JnLmJsdWV6Lm1lc2gnDQo+IC1EQlVTX1BST1BfSUZBQ0UgPSAnb3JnLmZyZWVkZXNrdG9w LkRCdXMuUHJvcGVydGllcycNCj4gLURCVVNfT01fSUZBQ0UgPSAnb3JnLmZyZWVkZXNrdG9wLkRC dXMuT2JqZWN0TWFuYWdlcicNCj4gLQ0KPiAtTUVTSF9ORVRXT1JLX0lGQUNFID0gJ29yZy5ibHVl ei5tZXNoLk5ldHdvcmsxJw0KPiAtTUVTSF9OT0RFX0lGQUNFID0gJ29yZy5ibHVlei5tZXNoLk5v ZGUxJw0KPiAtTUVTSF9BUFBMSUNBVElPTl9JRkFDRSA9ICdvcmcuYmx1ZXoubWVzaC5BcHBsaWNh dGlvbjEnDQo+IC1NRVNIX0VMRU1FTlRfSUZBQ0UgPSAnb3JnLmJsdWV6Lm1lc2guRWxlbWVudDEn DQo+IC0NCj4gLUFQUF9DT01QQU5ZX0lEID0gMHgwNWYxDQo+IC1BUFBfUFJPRFVDVF9JRCA9IDB4 MDAwMQ0KPiAtQVBQX1ZFUlNJT05fSUQgPSAweDAwMDENCj4gLQ0KPiAtVkVORE9SX0lEX05PTkUg PSAweGZmZmYNCj4gLQ0KPiAtYXBwID0gTm9uZQ0KPiAtYnVzID0gTm9uZQ0KPiAtbWFpbmxvb3Ag PSBOb25lDQo+IC1ub2RlID0gTm9uZQ0KPiAtDQo+IC10b2tlbiA9IG51bXB5LnVpbnQ2NCgweDc2 YmQ0ZjIzNzI0NzY1NzgpDQo+IC0NCj4gLWRlZiBnZW5lcmljX2Vycm9yX2NiKGVycm9yKToNCj4g LQlwcmludCgnRC1CdXMgY2FsbCBmYWlsZWQ6ICcgKyBzdHIoZXJyb3IpKQ0KPiAtDQo+IC1kZWYg Z2VuZXJpY19yZXBseV9jYigpOg0KPiAtCXByaW50KCdELUJ1cyBjYWxsIGRvbmUnKQ0KPiAtDQo+ IC1kZWYgdW53cmFwKGl0ZW0pOg0KPiAtCWlmIGlzaW5zdGFuY2UoaXRlbSwgZGJ1cy5Cb29sZWFu KToNCj4gLQkJcmV0dXJuIGJvb2woaXRlbSkNCj4gLQlpZiBpc2luc3RhbmNlKGl0ZW0sIChkYnVz LlVJbnQxNiwgZGJ1cy5JbnQxNiwgZGJ1cy5VSW50MzIsIGRidXMuSW50MzIsDQo+IC0JCQkJCQlk YnVzLlVJbnQ2NCwgZGJ1cy5JbnQ2NCkpOg0KPiAtCQlyZXR1cm4gaW50KGl0ZW0pDQo+IC0JaWYg aXNpbnN0YW5jZShpdGVtLCBkYnVzLkJ5dGUpOg0KPiAtCQlyZXR1cm4gYnl0ZXMoW2ludChpdGVt KV0pDQo+IC0JaWYgaXNpbnN0YW5jZShpdGVtLCBkYnVzLlN0cmluZyk6DQo+IC0JCQlyZXR1cm4g aXRlbQ0KPiAtCWlmIGlzaW5zdGFuY2UoaXRlbSwgKGRidXMuQXJyYXksIGxpc3QsIHR1cGxlKSk6 DQo+IC0JCXJldHVybiBbdW53cmFwKHgpIGZvciB4IGluIGl0ZW1dDQo+IC0JaWYgaXNpbnN0YW5j ZShpdGVtLCAoZGJ1cy5EaWN0aW9uYXJ5LCBkaWN0KSk6DQo+IC0JCXJldHVybiBkaWN0KFsodW53 cmFwKHgpLCB1bndyYXAoeSkpIGZvciB4LCB5IGluIGl0ZW0uaXRlbXMoKV0pDQo+IC0NCj4gLQlw cmludCgnRGljdGlvbmFyeSBpdGVtIG5vdCBoYW5kbGVkJykNCj4gLQlwcmludCh0eXBlKGl0ZW0p KQ0KPiAtCXJldHVybiBpdGVtDQo+IC0NCj4gLWRlZiBhdHRhY2hfYXBwX2NiKG5vZGVfcGF0aCwg ZGljdF9hcnJheSk6DQo+IC0JcHJpbnQoJ01lc2ggYXBwbGljYXRpb24gcmVnaXN0ZXJlZCAnLCBu b2RlX3BhdGgpDQo+IC0NCj4gLQlvYmogPSBidXMuZ2V0X29iamVjdChNRVNIX1NFUlZJQ0VfTkFN RSwgbm9kZV9wYXRoKQ0KPiAtDQo+IC0JZ2xvYmFsIG5vZGUNCj4gLQlub2RlID0gZGJ1cy5JbnRl cmZhY2Uob2JqLCBNRVNIX05PREVfSUZBQ0UpDQo+IC0NCj4gLQllbHMgPSB1bndyYXAoZGljdF9h cnJheSkNCj4gLQlwcmludCgiR2V0IEVsZW1lbnRzIikNCj4gLQ0KPiAtCWZvciBlbCBpbiBlbHM6 DQo+IC0JCWlkeCA9IHN0cnVjdC51bnBhY2soJ2InLCBlbFswXSlbMF0NCj4gLQkJcHJpbnQoJ0Nv bmZpZ3VyYXRpb24gZm9yIEVsZW1lbnQgJywgZW5kPScnKQ0KPiAtCQlwcmludChpZHgpDQo+IC0N Cj4gLQkJbW9kZWxzID0gZWxbMV0NCj4gLQkJZWxlbWVudCA9IGFwcC5nZXRfZWxlbWVudChpZHgp DQo+IC0JCWVsZW1lbnQuc2V0X21vZGVsX2NvbmZpZyhtb2RlbHMpDQo+IC0NCj4gLWRlZiBpbnRl cmZhY2VzX3JlbW92ZWRfY2Iob2JqZWN0X3BhdGgsIGludGVyZmFjZXMpOg0KPiAtCWlmIG5vdCBt ZXNoX25ldDoNCj4gLQkJcmV0dXJuDQo+IC0NCj4gLQlpZiBvYmplY3RfcGF0aCA9PSBtZXNoX25l dFsyXToNCj4gLQkJcHJpbnQoJ1NlcnZpY2Ugd2FzIHJlbW92ZWQnKQ0KPiAtCQltYWlubG9vcC5x dWl0KCkNCj4gLQ0KPiAtZGVmIHNlbmRfcmVzcG9uc2UocGF0aCwgZGVzdCwga2V5LCBkYXRhKToN Cj4gLQkJcHJpbnQoJ3NlbmQgcmVzcG9uc2UgJywgZW5kPScnKQ0KPiAtCQlwcmludChkYXRhKQ0K PiAtCQlub2RlLlNlbmQocGF0aCwgZGVzdCwga2V5LCBkYXRhLCByZXBseV9oYW5kbGVyPWdlbmVy aWNfcmVwbHlfY2IsDQo+IC0JCQkJCQllcnJvcl9oYW5kbGVyPWdlbmVyaWNfZXJyb3JfY2IpDQo+ IC0NCj4gLWRlZiBzZW5kX3B1YmxpY2F0aW9uKHBhdGgsIG1vZGVsX2lkLCBkYXRhKToNCj4gLQkJ cHJpbnQoJ3NlbmQgcHVibGljYXRpb24gJywgZW5kPScnKQ0KPiAtCQlwcmludChkYXRhKQ0KPiAt CQlub2RlLlB1Ymxpc2gocGF0aCwgbW9kZWxfaWQsIGRhdGEsDQo+IC0JCQkJCQlyZXBseV9oYW5k bGVyPWdlbmVyaWNfcmVwbHlfY2IsDQo+IC0JCQkJCQllcnJvcl9oYW5kbGVyPWdlbmVyaWNfZXJy b3JfY2IpDQo+IC0NCj4gLWNsYXNzIFB1YlRpbWVyKCk6DQo+IC0JZGVmIF9faW5pdF9fKHNlbGYp Og0KPiAtCQlzZWxmLnNlY29uZHMgPSBOb25lDQo+IC0JCXNlbGYuZnVuYyA9IE5vbmUNCj4gLQkJ c2VsZi50aHJlYWQgPSBOb25lDQo+IC0JCXNlbGYuYnVzeSA9IEZhbHNlDQo+IC0NCj4gLQlkZWYg X3RpbWVvdXRfY2Ioc2VsZik6DQo+IC0JCXNlbGYuZnVuYygpDQo+IC0JCXNlbGYuYnVzeSA9IFRy dWUNCj4gLQkJc2VsZi5fc2NoZWR1bGVfdGltZXIoKQ0KPiAtCQlzZWxmLmJ1c3kgPUZhbHNlDQo+ IC0NCj4gLQlkZWYgX3NjaGVkdWxlX3RpbWVyKHNlbGYpOg0KPiAtCQlzZWxmLnRocmVhZCA9IFRp bWVyKHNlbGYuc2Vjb25kcywgc2VsZi5fdGltZW91dF9jYikNCj4gLQkJc2VsZi50aHJlYWQuc3Rh cnQoKQ0KPiAtDQo+IC0JZGVmIHN0YXJ0KHNlbGYsIHNlY29uZHMsIGZ1bmMpOg0KPiAtCQlzZWxm LmZ1bmMgPSBmdW5jDQo+IC0JCXNlbGYuc2Vjb25kcyA9IHNlY29uZHMNCj4gLQkJaWYgbm90IHNl bGYuYnVzeToNCj4gLQkJCXNlbGYuX3NjaGVkdWxlX3RpbWVyKCkNCj4gLQ0KPiAtCWRlZiBjYW5j ZWwoc2VsZik6DQo+IC0JCXByaW50KCdDYW5jZWwgdGltZXInKQ0KPiAtCQlpZiBzZWxmLnRocmVh ZCBpcyBub3QgTm9uZToNCj4gLQkJCXByaW50KCdDYW5jZWwgdGhyZWFkJykNCj4gLQkJCXNlbGYu dGhyZWFkLmNhbmNlbCgpDQo+IC0JCQlzZWxmLnRocmVhZCA9IE5vbmUNCj4gLQ0KPiAtY2xhc3Mg QXBwbGljYXRpb24oZGJ1cy5zZXJ2aWNlLk9iamVjdCk6DQo+IC0NCj4gLQlkZWYgX19pbml0X18o c2VsZiwgYnVzKToNCj4gLQkJc2VsZi5wYXRoID0gJy9leGFtcGxlJw0KPiAtCQlzZWxmLmVsZW1l bnRzID0gW10NCj4gLQkJZGJ1cy5zZXJ2aWNlLk9iamVjdC5fX2luaXRfXyhzZWxmLCBidXMsIHNl bGYucGF0aCkNCj4gLQ0KPiAtCWRlZiBnZXRfcGF0aChzZWxmKToNCj4gLQkJcmV0dXJuIGRidXMu T2JqZWN0UGF0aChzZWxmLnBhdGgpDQo+IC0NCj4gLQlkZWYgYWRkX2VsZW1lbnQoc2VsZiwgZWxl bWVudCk6DQo+IC0JCXNlbGYuZWxlbWVudHMuYXBwZW5kKGVsZW1lbnQpDQo+IC0NCj4gLQlkZWYg Z2V0X2VsZW1lbnQoc2VsZiwgaWR4KToNCj4gLQkJZm9yIGVsZSBpbiBzZWxmLmVsZW1lbnRzOg0K PiAtCQkJaWYgZWxlLmdldF9pbmRleCgpID09IGlkeDoNCj4gLQkJCQlyZXR1cm4gZWxlDQo+IC0N Cj4gLQlkZWYgZ2V0X3Byb3BlcnRpZXMoc2VsZik6DQo+IC0JCXJldHVybiB7DQo+IC0JCQlNRVNI X0FQUExJQ0FUSU9OX0lGQUNFOiB7DQo+IC0JCQkJJ0NvbXBhbnlJRCc6IGRidXMuVUludDE2KEFQ UF9DT01QQU5ZX0lEKSwNCj4gLQkJCQknUHJvZHVjdElEJzogZGJ1cy5VSW50MTYoQVBQX1BST0RV Q1RfSUQpLA0KPiAtCQkJCSdWZXJzaW9uSUQnOiBkYnVzLlVJbnQxNihBUFBfVkVSU0lPTl9JRCkN Cj4gLQkJCX0NCj4gLQkJfQ0KPiAtDQo+IC0JQGRidXMuc2VydmljZS5tZXRob2QoREJVU19PTV9J RkFDRSwgb3V0X3NpZ25hdHVyZT0nYXtvYXtzYXtzdn19fScpDQo+IC0JZGVmIEdldE1hbmFnZWRP YmplY3RzKHNlbGYpOg0KPiAtCQlyZXNwb25zZSA9IHt9DQo+IC0JCXByaW50KCdHZXRNYW5hZ2Vk T2JqZWN0cycpDQo+IC0JCXJlc3BvbnNlW3NlbGYucGF0aF0gPSBzZWxmLmdldF9wcm9wZXJ0aWVz KCkNCj4gLQkJZm9yIGVsZW1lbnQgaW4gc2VsZi5lbGVtZW50czoNCj4gLQkJCXJlc3BvbnNlW2Vs ZW1lbnQuZ2V0X3BhdGgoKV0gPSBlbGVtZW50LmdldF9wcm9wZXJ0aWVzKCkNCj4gLQkJcmV0dXJu IHJlc3BvbnNlDQo+IC0NCj4gLWNsYXNzIEVsZW1lbnQoZGJ1cy5zZXJ2aWNlLk9iamVjdCk6DQo+ IC0JUEFUSF9CQVNFID0gJy9leGFtcGxlL2VsZScNCj4gLQ0KPiAtCWRlZiBfX2luaXRfXyhzZWxm LCBidXMsIGluZGV4KToNCj4gLQkJc2VsZi5wYXRoID0gc2VsZi5QQVRIX0JBU0UgKyBmb3JtYXQo aW5kZXgsICcwMngnKQ0KPiAtCQlwcmludChzZWxmLnBhdGgpDQo+IC0JCXNlbGYubW9kZWxzID0g W10NCj4gLQkJc2VsZi5idXMgPSBidXMNCj4gLQkJc2VsZi5pbmRleCA9IGluZGV4DQo+IC0JCWRi dXMuc2VydmljZS5PYmplY3QuX19pbml0X18oc2VsZiwgYnVzLCBzZWxmLnBhdGgpDQo+IC0NCj4g LQlkZWYgX2dldF9zaWdfbW9kZWxzKHNlbGYpOg0KPiAtCQlpZHMgPSBbXQ0KPiAtCQlmb3IgbW9k ZWwgaW4gc2VsZi5tb2RlbHM6DQo+IC0JCQlpZCA9IG1vZGVsLmdldF9pZCgpDQo+IC0JCQl2ZW5k b3IgPSBtb2RlbC5nZXRfdmVuZG9yKCkNCj4gLQkJCWlmIHZlbmRvciA9PSBWRU5ET1JfSURfTk9O RToNCj4gLQkJCQlpZHMuYXBwZW5kKGlkKQ0KPiAtCQlyZXR1cm4gaWRzDQo+IC0NCj4gLQlkZWYg Z2V0X3Byb3BlcnRpZXMoc2VsZik6DQo+IC0JCXJldHVybiB7DQo+IC0JCQlNRVNIX0VMRU1FTlRf SUZBQ0U6IHsNCj4gLQkJCQknSW5kZXgnOiBkYnVzLkJ5dGUoc2VsZi5pbmRleCksDQo+IC0JCQkJ J01vZGVscyc6IGRidXMuQXJyYXkoDQo+IC0JCQkJCXNlbGYuX2dldF9zaWdfbW9kZWxzKCksIHNp Z25hdHVyZT0ncScpDQo+IC0JCQl9DQo+IC0JCX0NCj4gLQ0KPiAtCWRlZiBhZGRfbW9kZWwoc2Vs ZiwgbW9kZWwpOg0KPiAtCQltb2RlbC5zZXRfcGF0aChzZWxmLnBhdGgpDQo+IC0JCXNlbGYubW9k ZWxzLmFwcGVuZChtb2RlbCkNCj4gLQ0KPiAtCWRlZiBnZXRfaW5kZXgoc2VsZik6DQo+IC0JCXJl dHVybiBzZWxmLmluZGV4DQo+IC0NCj4gLQlkZWYgc2V0X21vZGVsX2NvbmZpZyhzZWxmLCBjb25m aWdzKToNCj4gLQkJcHJpbnQoJ1NldCBlbGVtZW50IG1vZGVscyBjb25maWcnKQ0KPiAtCQlmb3Ig Y29uZmlnIGluIGNvbmZpZ3M6DQo+IC0JCQltb2RfaWQgPSBjb25maWdbMF0NCj4gLQkJCXNlbGYu VXBkYXRlTW9kZWxDb25maWd1cmF0aW9uKG1vZF9pZCwgY29uZmlnWzFdKQ0KPiAtDQo+IC0JQGRi dXMuc2VydmljZS5tZXRob2QoTUVTSF9FTEVNRU5UX0lGQUNFLA0KPiAtCQkJCQlpbl9zaWduYXR1 cmU9InFxYmF5Iiwgb3V0X3NpZ25hdHVyZT0iIikNCj4gLQlkZWYgTWVzc2FnZVJlY2VpdmVkKHNl bGYsIHNvdXJjZSwga2V5LCBpc19zdWIsIGRhdGEpOg0KPiAtCQlwcmludCgnTWVzc2FnZSBSZWNl aXZlZCBvbiBFbGVtZW50ICcsIGVuZD0nJykNCj4gLQkJcHJpbnQoc2VsZi5pbmRleCkNCj4gLQkJ Zm9yIG1vZGVsIGluIHNlbGYubW9kZWxzOg0KPiAtCQkJbW9kZWwucHJvY2Vzc19tZXNzYWdlKHNv dXJjZSwga2V5LCBkYXRhKQ0KPiAtDQo+IC0JQGRidXMuc2VydmljZS5tZXRob2QoTUVTSF9FTEVN RU5UX0lGQUNFLA0KPiAtCQkJCQlpbl9zaWduYXR1cmU9InFhe3N2fSIsIG91dF9zaWduYXR1cmU9 IiIpDQo+IC0NCj4gLQlkZWYgVXBkYXRlTW9kZWxDb25maWd1cmF0aW9uKHNlbGYsIG1vZGVsX2lk LCBjb25maWcpOg0KPiAtCQlwcmludCgnVXBkYXRlTW9kZWxDb25maWcgJywgZW5kPScnKQ0KPiAt CQlwcmludChoZXgobW9kZWxfaWQpKQ0KPiAtCQlmb3IgbW9kZWwgaW4gc2VsZi5tb2RlbHM6DQo+ IC0JCQlpZiBtb2RlbF9pZCA9PSBtb2RlbC5nZXRfaWQoKToNCj4gLQkJCQltb2RlbC5zZXRfY29u ZmlnKGNvbmZpZykNCj4gLQkJCQlyZXR1cm4NCj4gLQ0KPiAtCUBkYnVzLnNlcnZpY2UubWV0aG9k KE1FU0hfRUxFTUVOVF9JRkFDRSwNCj4gLQkJCQkJaW5fc2lnbmF0dXJlPSIiLCBvdXRfc2lnbmF0 dXJlPSIiKQ0KPiAtDQo+IC0JZGVmIGdldF9wYXRoKHNlbGYpOg0KPiAtCQlyZXR1cm4gZGJ1cy5P YmplY3RQYXRoKHNlbGYucGF0aCkNCj4gLQ0KPiAtY2xhc3MgTW9kZWwoKToNCj4gLQlkZWYgX19p bml0X18oc2VsZiwgbW9kZWxfaWQpOg0KPiAtCQlzZWxmLmNtZF9vcHMgPSBbXQ0KPiAtCQlzZWxm Lm1vZGVsX2lkID0gbW9kZWxfaWQNCj4gLQkJc2VsZi52ZW5kb3IgPSBWRU5ET1JfSURfTk9ORQ0K PiAtCQlzZWxmLmJpbmRpbmdzID0gW10NCj4gLQkJc2VsZi5wdWJfcGVyaW9kID0gMA0KPiAtCQlz ZWxmLnB1Yl9pZCA9IDANCj4gLQkJc2VsZi5wYXRoID0gTm9uZQ0KPiAtDQo+IC0JZGVmIHNldF9w YXRoKHNlbGYsIHBhdGgpOg0KPiAtCQlzZWxmLnBhdGggPSBwYXRoDQo+IC0NCj4gLQlkZWYgZ2V0 X2lkKHNlbGYpOg0KPiAtCQlyZXR1cm4gc2VsZi5tb2RlbF9pZA0KPiAtDQo+IC0JZGVmIGdldF92 ZW5kb3Ioc2VsZik6DQo+IC0JCXJldHVybiBzZWxmLnZlbmRvcg0KPiAtDQo+IC0JZGVmIHByb2Nl c3NfbWVzc2FnZShzZWxmLCBzb3VyY2UsIGtleSwgZGF0YSk6DQo+IC0JCXByaW50KCdNb2RlbCBw cm9jZXNzIG1lc3NhZ2UnKQ0KPiAtDQo+IC0JZGVmIHNldF9wdWJsaWNhdGlvbihzZWxmLCBwZXJp b2QpOg0KPiAtCQlzZWxmLnB1Yl9wZXJpb2QgPSBwZXJpb2QNCj4gLQ0KPiAtCWRlZiBzZXRfY29u ZmlnKHNlbGYsIGNvbmZpZyk6DQo+IC0JCWlmICdCaW5kaW5ncycgaW4gY29uZmlnOg0KPiAtCQkJ c2VsZi5iaW5kaW5ncyA9IGNvbmZpZy5nZXQoJ0JpbmRpbmdzJykNCj4gLQkJCXByaW50KCdCaW5k aW5nczogJywgZW5kPScnKQ0KPiAtCQkJcHJpbnQoc2VsZi5iaW5kaW5ncykNCj4gLQkJaWYgJ1B1 YmxpY2F0aW9uUGVyaW9kJyBpbiBjb25maWc6DQo+IC0JCQlzZWxmLnNldF9wdWJsaWNhdGlvbihj b25maWcuZ2V0KCdQdWJsaWNhdGlvblBlcmlvZCcpKQ0KPiAtCQkJcHJpbnQoJ01vZGVsIHB1Ymxp Y2F0aW9uIHBlcmlvZCAnLCBlbmQ9JycpDQo+IC0JCQlwcmludChzZWxmLnB1Yl9wZXJpb2QsIGVu ZD0nJykNCj4gLQkJCXByaW50KCcgbXMnKQ0KPiAtDQo+IC1jbGFzcyBPbk9mZlNlcnZlcihNb2Rl bCk6DQo+IC0JZGVmIF9faW5pdF9fKHNlbGYsIG1vZGVsX2lkKToNCj4gLQkJTW9kZWwuX19pbml0 X18oc2VsZiwgbW9kZWxfaWQpDQo+IC0JCXNlbGYuY21kX29wcyA9IHsgMHg4MjAxLCAjIGdldA0K PiAtCQkJCQkJIDB4ODIwMiwgIyBzZXQNCj4gLQkJCQkJCSAweDgyMDMgfSAjIHNldCB1bmFja25v d2xlZGdlZA0KPiAtDQo+IC0JCXByaW50KCJPbk9mZiBTZXJ2ZXIgIiwgZW5kPSIiKQ0KPiAtCQlz ZWxmLnN0YXRlID0gMA0KPiAtCQlwcmludCgnU3RhdGUgJywgZW5kPScnKQ0KPiAtCQlzZWxmLnRp bWVyID0gUHViVGltZXIoKQ0KPiAtDQo+IC0JZGVmIHByb2Nlc3NfbWVzc2FnZShzZWxmLCBzb3Vy Y2UsIGtleSwgZGF0YSk6DQo+IC0JCWRhdGFsZW4gPSBsZW4oZGF0YSkNCj4gLQkJcHJpbnQoJ09u T2ZmIFNlcnZlciBwcm9jZXNzIG1lc3NhZ2UgbGVuICcsIGRhdGFsZW4pDQo+IC0NCj4gLQkJaWYg ZGF0YWxlbiE9MiBhbmQgZGF0YWxlbiE9MzoNCj4gLQkJCXJldHVybg0KPiAtDQo+IC0JCWlmIGRh dGFsZW49PTI6DQo+IC0JCQlvcF90dXBsZT1zdHJ1Y3QudW5wYWNrKCc8SCcsYnl0ZXMoZGF0YSkp DQo+IC0JCQlvcGNvZGUgPSBvcF90dXBsZVswXQ0KPiAtCQkJaWYgb3Bjb2RlICE9IDB4ODIwMToN Cj4gLQkJCQlwcmludChoZXgob3Bjb2RlKSkNCj4gLQkJCQlyZXR1cm4NCj4gLQkJCXByaW50KCdH ZXQgc3RhdGUnKQ0KPiAtCQllbGlmIGRhdGFsZW49PTM6DQo+IC0JCQlvcGNvZGUsc2VsZi5zdGF0 ZT1zdHJ1Y3QudW5wYWNrKCc8SEInLGJ5dGVzKGRhdGEpKQ0KPiAtCQkJaWYgb3Bjb2RlICE9IDB4 ODIwMiBhbmQgb3Bjb2RlICE9IDB4ODIwMzoNCj4gLQkJCQlwcmludChoZXgob3Bjb2RlKSkNCj4g LQkJCQlyZXR1cm4NCj4gLQkJCXByaW50KCdTZXQgc3RhdGU6ICcsIGVuZD0nJykNCj4gLQkJCXBy aW50KHNlbGYuc3RhdGUpDQo+IC0NCj4gLQkJcnNwX2RhdGEgPSBzdHJ1Y3QucGFjaygnPEhCJywg MHg4MjA0LCBzZWxmLnN0YXRlKQ0KPiAtCQlzZW5kX3Jlc3BvbnNlKHNlbGYucGF0aCwgc291cmNl LCBrZXksIHJzcF9kYXRhKQ0KPiAtDQo+IC0JZGVmIHB1Ymxpc2goc2VsZik6DQo+IC0JCXByaW50 KCdQdWJsaXNoJykNCj4gLQkJZGF0YSA9IHN0cnVjdC5wYWNrKCdCJywgc2VsZi5zdGF0ZSkNCj4g LQkJc2VuZF9wdWJsaWNhdGlvbihzZWxmLnBhdGgsIHNlbGYubW9kZWxfaWQsIGRhdGEpDQo+IC0N Cj4gLQlkZWYgc2V0X3B1YmxpY2F0aW9uKHNlbGYsIHBlcmlvZCk6DQo+IC0JCWlmIHBlcmlvZCA9 PSAwOg0KPiAtCQkJc2VsZi5wdWJfcGVyaW9kID0gMA0KPiAtCQkJc2VsZi50aW1lci5jYW5jZWwo KQ0KPiAtCQkJcmV0dXJuDQo+IC0NCj4gLQkJIyBXZSBkbyBub3QgaGFuZGxlIG1zIGluIHRoaXMg ZXhhbXBsZQ0KPiAtCQlpZiBwZXJpb2QgPCAxMDAwOg0KPiAtCQkJcmV0dXJuDQo+IC0NCj4gLQkJ c2VsZi5wdWJfcGVyaW9kID0gcGVyaW9kDQo+IC0JCXNlbGYudGltZXIuc3RhcnQocGVyaW9kLzEw MDAsIHNlbGYucHVibGlzaCkNCj4gLQ0KPiAtZGVmIGF0dGFjaF9hcHBfZXJyb3JfY2IoZXJyb3Ip Og0KPiAtCXByaW50KCdGYWlsZWQgdG8gcmVnaXN0ZXIgYXBwbGljYXRpb246ICcgKyBzdHIoZXJy b3IpKQ0KPiAtCW1haW5sb29wLnF1aXQoKQ0KPiAtDQo+IC1kZWYgbWFpbigpOg0KPiAtDQo+IC0J REJ1c0dNYWluTG9vcChzZXRfYXNfZGVmYXVsdD1UcnVlKQ0KPiAtDQo+IC0JZ2xvYmFsIGJ1cw0K PiAtCWJ1cyA9IGRidXMuU3lzdGVtQnVzKCkNCj4gLQlnbG9iYWwgbWFpbmxvb3ANCj4gLQlnbG9i YWwgYXBwDQo+IC0NCj4gLQltZXNoX25ldCA9IGRidXMuSW50ZXJmYWNlKGJ1cy5nZXRfb2JqZWN0 KE1FU0hfU0VSVklDRV9OQU1FLA0KPiAtCQkJCQkJIi9vcmcvYmx1ZXovbWVzaCIpLA0KPiAtCQkJ CQkJTUVTSF9ORVRXT1JLX0lGQUNFKQ0KPiAtCW1lc2hfbmV0LmNvbm5lY3RfdG9fc2lnbmFsKCdJ bnRlcmZhY2VzUmVtb3ZlZCcsIGludGVyZmFjZXNfcmVtb3ZlZF9jYikNCj4gLQ0KPiAtCWFwcCA9 IEFwcGxpY2F0aW9uKGJ1cykNCj4gLQlmaXJzdF9lbGUgPSBFbGVtZW50KGJ1cywgMHgwMCkNCj4g LQlmaXJzdF9lbGUuYWRkX21vZGVsKE9uT2ZmU2VydmVyKDB4MTAwMCkpDQo+IC0JYXBwLmFkZF9l bGVtZW50KGZpcnN0X2VsZSkNCj4gLQ0KPiAtCW1haW5sb29wID0gR09iamVjdC5NYWluTG9vcCgp DQo+IC0NCj4gLQlwcmludCgnQXR0YWNoJykNCj4gLQltZXNoX25ldC5BdHRhY2goYXBwLmdldF9w YXRoKCksIHRva2VuLA0KPiAtCQkJCQlyZXBseV9oYW5kbGVyPWF0dGFjaF9hcHBfY2IsDQo+IC0J CQkJCWVycm9yX2hhbmRsZXI9YXR0YWNoX2FwcF9lcnJvcl9jYikNCj4gLQ0KPiAtCW1haW5sb29w LnJ1bigpDQo+IC0NCj4gLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6DQo+IC0JbWFpbigpDQo+ IGRpZmYgLS1naXQgYS90ZXN0L3Rlc3QtbWVzaCBiL3Rlc3QvdGVzdC1tZXNoDQo+IG5ldyBmaWxl IG1vZGUgMTAwNzU1DQo+IGluZGV4IDAwMDAwMDAwMC4uZmQwMjIwN2JjDQo+IC0tLSAvZGV2L251 bGwNCj4gKysrIGIvdGVzdC90ZXN0LW1lc2gNCj4gQEAgLTAsMCArMSw4NDIgQEANCj4gKyMhL3Vz ci9iaW4vZW52IHB5dGhvbjMNCj4gKw0KPiArIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KPiArIw0KPiArIyBUaGlzIGlz IGEgdW5pZmllZCB0ZXN0IHNhbXBsZSBmb3IgQlQgTWVzaA0KPiArIw0KPiArIyBUbyBydW4gdGhl IHRlc3Q6DQo+ICsjICAgICB0ZXN0LW1lc2ggW3Rva2VuXQ0KPiArIw0KPiArIyAgICAgICAgICAg ICd0b2tlbicgaXMgYW4gb3B0aW9uYWwgYXJndW1lbnQuIEl0IG11c3QgYmUgYSAxNi1kaWdpdA0K PiArIyAgICAgICAgICAgIGhleGFkZWNpbWFsIG51bWJlci4gVGhlIHRva2VuIG11c3QgYmUgYXNz b2NpYXRlZCB3aXRoDQo+ICsjICAgICAgICAgICAgYW4gZXhpc3Rpbmcgbm9kZS4gVGhlIHRva2Vu IGlzIGdlbmVyYXRlZCBhbmQgYXNzaWduZWQNCj4gKyMgICAgICAgICAgICB0byBhIG5vZGUgYXMg YSByZXN1bHQgb2Ygc3VjY2Vzc2Z1bCBwcm92aXNpb25pbmcgKHNlZQ0KPiArIyAgICAgICAgICAg IGV4cGxhbmF0aW9uIG9mICJqb2luIiBvcHRpb24pLg0KPiArIyAgICAgICAgICAgIFdoZW4gdGhl IHRva2VuIGlzIHNldCwgdGhlIG1lbnUgb3BlcmF0aW9ucyAiYXR0YWNoIg0KPiArIyAgICAgICAg ICAgIGFuZCAicmVtb3ZlIiBtYXkgYmUgcGVyZm9ybWVkIG9uIGEgbm9kZSBzcGVjaWZpZWQNCj4g KyMgICAgICAgICAgICBieSB0aGlzIHRva2VuLg0KPiArIw0KPiArIyAgICAgIFRoZSB0ZXN0IGlt aXRhdGVzIGEgZGV2aWNlIHdpdGggMiBlbGVtZW50czoNCj4gKyMgICAgICAgICAgICBlbGVtZW50 IDA6IE9uT2ZmIFNlcnZlciBtb2RlbA0KPiArIyAgICAgICAgICAgIGVsZW1lbnQgMTogT25PZmYg Q2xpZW50IG1vZGVsDQo+ICsjDQo+ICsjIFRoZSBtYWluIG1lbnU6DQo+ICsjICAgICAgIDEgLSBz ZXQgbm9kZSBJRCAodG9rZW4pDQo+ICsjICAgICAgIDIgLSBqb2luIG1lc2ggbmV0d29yaw0KPiAr IyAgICAgICAzIC0gYXR0YWNoIG1lc2ggbm9kZQ0KPiArIyAgICAgICA0IC0gcmVtb3ZlIG5vZGUN Cj4gKyMgICAgICAgNSAtIGNsaWVudCBtZW51DQo+ICsjICAgICAgIDYgLSBleGl0DQo+ICsjDQo+ ICsjIFRoZSBtYWluIG1lbnUgb3B0aW9ucyBleHBsYWluZWQ6DQo+ICsjICAgICAxIC0gc2V0IHRv a2VuDQo+ICsjICAgICAgICAgICAgU2V0IHRoZSB1bmlxdWUgbm9kZSB0b2tlbi4NCj4gKyMgICAg ICAgICAgICBUaGUgdG9rZW4gY2FuIGJlIHNldCBmcm9tIGNvbW1hbmQgbGluZSBhcmd1bWVudHMg YXMNCj4gKyMgICAgICAgICAgICB3ZWxsLg0KPiArIw0KPiArIyAgICAgMiAtIGpvaW4NCj4gKyMg ICAgICAgICAgICBSZXF1ZXN0IHByb3Zpc2lvbmluZyBvZiBhIGRldmljZSB0byBiZWNvbWUgYSBu b2RlDQo+ICsjICAgICAgICAgICAgb24gYSBtZXNoIG5ldHdvcmsuIFRoZSB0ZXN0IGdlbmVyYXRl cyBkZXZpY2UgVVVJRA0KPiArIyAgICAgICAgICAgIHdoaWNoIGlzIGRpc3BsYXllZCBhbmQgd2ls bCBuZWVkIHRvIGJlIHByb3ZpZGVkIHRvDQo+ICsjICAgICAgICAgICAgYW4gb3V0c2lkZSBlbnRp dHkgdGhhdCBhY3RzIGFzIGEgUHJvdmlzaW9uZXIuIEFsc28sDQo+ICsjICAgICAgICAgICAgZHVy aW5nIHRoZSBwcm92aXNpb25pbmcgcHJvY2VzcywgYW4gYWdlbnQgdGhhdCBpcw0KPiArIyAgICAg ICAgICAgIHBhcnQgb2YgdGhlIHRlc3QsIHdpbGwgcmVxdWVzdCAob3Igd2lsbCBiZSByZXF1ZXN0 ZWQpDQo+ICsjICAgICAgICAgICAgdG8gcGVyZm9ybSBhIHNwZWNpZmllZCBvcGVyYXRpb24sIGUu Zy4sIGEgbnVtYmVyIHdpbGwNCj4gKyMgICAgICAgICAgICBiZSBkaXNwbGF5ZWQgYW5kIHRoaXMg bnVtYmVyIHdpbGwgbmVlZCB0byBiZSAgZW50ZXJlZA0KPiArIyAgICAgICAgICAgIG9uIHRoZSBQ cm92aXNpb25lcidzIHNpZGUuDQo+ICsjICAgICAgICAgICAgSW4gY2FzZSBvZiBzdWNjZXNzZnVs IHByb3Zpc2lvbmluZywgdGhlIGFwcGxpY2F0aW9uDQo+ICsjICAgICAgICAgICAgYXV0b21hdGlj YWxseSBhdHRhY2hlcyBhcyBhIG5vZGUgdG8gdGhlIGRhZW1vbi4gQSBub2RlDQo+ICsjICAgICAg ICAgICAgJ3Rva2VuJyBpcyByZXR1cm5lZCB0byB0aGUgYXBwbGljYXRpb24gYW5kIGlzIHVzZWQN Cj4gKyMgICAgICAgICAgICBmb3IgdGhlIHJ1bnRpbWUgb2YgdGhlIHRlc3QuDQo+ICsjDQo+ICsj ICAgICAzIC0gYXR0YWNoDQo+ICsjICAgICAgICAgICAgQXR0YWNoIHRoZSBhcHBsaWNhdGlvbiB0 byBibHVldG9vdGhkLWRhZW1vbiBhcyBhIG5vZGUuDQo+ICsjICAgICAgICAgICAgRm9yIHRoZSBj YWxsIHRvIGJlIHN1Y2Nlc3NmdWwsIHRoZSB2YWxpZCBub2RlIHRva2VuIG11c3QNCj4gKyMgICAg ICAgICAgICBiZSBhbHJlYWR5IHNldCwgZWl0aGVyIGZyb20gY29tbWFuZCBhcmd1bWVudHMgb3Ig YnkNCj4gKyMgICAgICAgICAgICBleGVjdXRpbmcgInNldCB0b2tlbiIgb3BlcmF0aW9uIG9yIGF1 dG9tYXRpY2FsbHkgYWZ0ZXINCj4gKyMgICAgICAgICAgICBzdWNjZXNzZnVsbHkgZXhlY3V0aW5n ICJqb2luIiBvcGVyYXRpb24gaW4gdGhlIHNhbWUgdGVzdA0KPiArIyAgICAgICAgICAgIHJ1bi4N Cj4gKyMNCj4gKyMgICAgIDQgLSByZW1vdmUNCj4gKyMgICAgICAgICAgIFBlcm1hbmVudGx5IHJl bW92ZXMgYW55IG5vZGUgY29uZmlndXJhdGlvbiBmcm9tIGRhZW1vbg0KPiArIyAgICAgICAgICAg YW5kIHBlcnNpc3RlbnQgc3RvcmFnZS4gQWZ0ZXIgdGhpcyBvcGVyYXRpb24sIHRoZSBub2RlDQo+ ICsjICAgICAgICAgICBpcyBwZXJtYW5lbnRseSBmb3Jnb3R0ZW4gYnkgdGhlIGRhZW1vbiBhbmQg dGhlIGFzc29jaWF0ZWQNCj4gKyMgICAgICAgICAgIG5vZGUgdG9rZW4gaXMgbm8gbG9uZ2VyIHZh bGlkLg0KPiArIw0KPiArIyAgICAgNSAtIGNsaWVudCBtZW51DQo+ICsjICAgICAgICAgICBFbnRl ciBPbi9PZmYgY2xpZW50IHN1Ym1lbnUuDQo+ICsjDQo+ICsjICAgICA2IC0gZXhpdA0KPiArIw0K PiArIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIw0KPiAraW1wb3J0IHN5cw0KPiAraW1wb3J0IHN0cnVjdA0KPiAraW1wb3J0 IGZjbnRsDQo+ICtpbXBvcnQgb3MNCj4gK2ltcG9ydCBudW1weQ0KPiAraW1wb3J0IHJhbmRvbQ0K PiAraW1wb3J0IGRidXMNCj4gK2ltcG9ydCBkYnVzLnNlcnZpY2UNCj4gK2ltcG9ydCBkYnVzLmV4 Y2VwdGlvbnMNCj4gKw0KPiArZnJvbSB0aHJlYWRpbmcgaW1wb3J0IFRpbWVyDQo+ICtpbXBvcnQg dGltZQ0KPiArDQo+ICt0cnk6DQo+ICsgIGZyb20gZ2kucmVwb3NpdG9yeSBpbXBvcnQgR0xpYg0K PiArZXhjZXB0IEltcG9ydEVycm9yOg0KPiArICBpbXBvcnQgZ2xpYiBhcyBHTGliDQo+ICtmcm9t IGRidXMubWFpbmxvb3AuZ2xpYiBpbXBvcnQgREJ1c0dNYWluTG9vcA0KPiArDQo+ICt0cnk6DQo+ ICsgIGZyb20gdGVybWNvbG9yIGltcG9ydCBjb2xvcmVkLCBjcHJpbnQNCj4gKyAgc2V0X2Vycm9y ID0gbGFtYmRhIHg6IGNvbG9yZWQoJyEnICsgeCwgJ3JlZCcsIGF0dHJzPVsnYm9sZCddKQ0KPiAr ICBzZXRfY3lhbiA9IGxhbWJkYSB4OiBjb2xvcmVkKHgsICdjeWFuJywgYXR0cnM9Wydib2xkJ10p DQo+ICsgIHNldF9ncmVlbiA9IGxhbWJkYSB4OiBjb2xvcmVkKHgsICdncmVlbicsIGF0dHJzPVsn Ym9sZCddKQ0KPiArICBzZXRfeWVsbG93ID0gbGFtYmRhIHg6IGNvbG9yZWQoeCwgJ3llbGxvdycs IGF0dHJzPVsnYm9sZCddKQ0KPiArZXhjZXB0IEltcG9ydEVycm9yOg0KPiArICBwcmludCgnISEh IEluc3RhbGwgdGVybWNvbG9yIG1vZHVsZSBmb3IgYmV0dGVyIGV4cGVyaWVuY2UgISEhJykNCj4g KyAgc2V0X2Vycm9yID0gbGFtYmRhIHg6IHgNCj4gKyAgc2V0X2N5YW4gPSBsYW1iZGEgeDogeA0K PiArICBzZXRfZ3JlZW4gPSBsYW1iZGEgeDogeA0KPiArICBzZXRfeWVsbG93ID0gbGFtYmRhIHg6 IHgNCj4gKw0KPiArIyBQcm92aXNpb25pbmcgYWdlbnQNCj4gK3RyeToNCj4gKyAgaW1wb3J0IGFn ZW50DQo+ICtleGNlcHQgSW1wb3J0RXJyb3I6DQo+ICsgIGFnZW50ID0gTm9uZQ0KPiArDQo+ICtN RVNIX1NFUlZJQ0VfTkFNRSA9ICdvcmcuYmx1ZXoubWVzaCcNCj4gK0RCVVNfUFJPUF9JRkFDRSA9 ICdvcmcuZnJlZWRlc2t0b3AuREJ1cy5Qcm9wZXJ0aWVzJw0KPiArREJVU19PTV9JRkFDRSA9ICdv cmcuZnJlZWRlc2t0b3AuREJ1cy5PYmplY3RNYW5hZ2VyJw0KPiArDQo+ICtNRVNIX05FVFdPUktf SUZBQ0UgPSAnb3JnLmJsdWV6Lm1lc2guTmV0d29yazEnDQo+ICtNRVNIX05PREVfSUZBQ0UgPSAn b3JnLmJsdWV6Lm1lc2guTm9kZTEnDQo+ICtNRVNIX0FQUExJQ0FUSU9OX0lGQUNFID0gJ29yZy5i bHVlei5tZXNoLkFwcGxpY2F0aW9uMScNCj4gK01FU0hfRUxFTUVOVF9JRkFDRSA9ICdvcmcuYmx1 ZXoubWVzaC5FbGVtZW50MScNCj4gKw0KPiArQVBQX0NPTVBBTllfSUQgPSAweDA1ZjENCj4gK0FQ UF9QUk9EVUNUX0lEID0gMHgwMDAxDQo+ICtBUFBfVkVSU0lPTl9JRCA9IDB4MDAwMQ0KPiArDQo+ ICtWRU5ET1JfSURfTk9ORSA9IDB4ZmZmZg0KPiArDQo+ICthcHAgPSBOb25lDQo+ICtidXMgPSBO b25lDQo+ICttYWlubG9vcCA9IE5vbmUNCj4gK25vZGUgPSBOb25lDQo+ICttZXNoX25ldCA9IE5v bmUNCj4gKw0KPiArbWVudV9sZXZlbCA9IDANCj4gK2RzdF9hZGRyID0gMHgwMDAwDQo+ICthcHBf aWR4ID0gMA0KPiArDQo+ICsjIE5vZGUgdG9rZW4gaG91c2VrZWVwaW5nDQo+ICt0b2tlbiA9IE5v bmUNCj4gK2hhdmVfdG9rZW4gPSBGYWxzZQ0KPiArDQo+ICt1c2VyX2lucHV0ID0gMA0KPiArDQo+ ICsNCj4gK2RlZiBhcHBfZXhpdCgpOg0KPiArCWdsb2JhbCBtYWlubG9vcA0KPiArCWdsb2JhbCBh cHANCj4gKw0KPiArCWZvciBlbCBpbiBhcHAuZWxlbWVudHM6DQo+ICsJCWZvciBtb2RlbCBpbiBl bC5tb2RlbHM6DQo+ICsJCQlpZiBtb2RlbC50aW1lciAhPSBOb25lOg0KPiArCQkJCW1vZGVsLnRp bWVyLmNhbmNlbCgpDQo+ICsJbWFpbmxvb3AucXVpdCgpDQo+ICsNCj4gK2RlZiBhcnJheV90b19z dHJpbmcoYl9hcnJheSk6DQo+ICsJc3RyID0gIiINCj4gKwlmb3IgYiBpbiBiX2FycmF5Og0KPiAr CQlzdHIgKz0gIiUwMngiICUgYg0KPiArCXJldHVybiBzdHINCj4gKw0KPiArZGVmIGdlbmVyaWNf ZXJyb3JfY2IoZXJyb3IpOg0KPiArCXByaW50KHNldF9lcnJvcignRC1CdXMgY2FsbCBmYWlsZWQ6 ICcpICsgc3RyKGVycm9yKSkNCj4gKw0KPiArZGVmIGdlbmVyaWNfcmVwbHlfY2IoKToNCj4gKwly ZXR1cm4NCj4gKw0KPiArZGVmIGF0dGFjaF9hcHBfZXJyb3JfY2IoZXJyb3IpOg0KPiArCXByaW50 KHNldF9lcnJvcignRmFpbGVkIHRvIHJlZ2lzdGVyIGFwcGxpY2F0aW9uOiAnKSArIHN0cihlcnJv cikpDQo+ICsNCj4gK2RlZiBhdHRhY2godG9rZW4pOg0KPiArCXByaW50KCdBdHRhY2ggbWVzaCBu b2RlIHRvIGJsdWV0b290aC1tZXNoZCBkYWVtb24nKQ0KPiArDQo+ICsJbWVzaF9uZXQuQXR0YWNo KGFwcC5nZXRfcGF0aCgpLCB0b2tlbiwNCj4gKwkJCQkJcmVwbHlfaGFuZGxlcj1hdHRhY2hfYXBw X2NiLA0KPiArCQkJCQllcnJvcl9oYW5kbGVyPWF0dGFjaF9hcHBfZXJyb3JfY2IpDQo+ICsNCj4g K2RlZiBqb2luX2NiKCk6DQo+ICsJcHJpbnQoJ0pvaW4gcHJvY2VkdXJlIHN0YXJ0ZWQnKQ0KPiAr DQo+ICtkZWYgam9pbl9lcnJvcl9jYihyZWFzb24pOg0KPiArCXByaW50KCdKb2luIHByb2NlZHVy ZSBmYWlsZWQ6ICcsIHJlYXNvbikNCj4gKw0KPiArZGVmIHVud3JhcChpdGVtKToNCj4gKwlpZiBp c2luc3RhbmNlKGl0ZW0sIGRidXMuQm9vbGVhbik6DQo+ICsJCXJldHVybiBib29sKGl0ZW0pDQo+ ICsJaWYgaXNpbnN0YW5jZShpdGVtLCAoZGJ1cy5VSW50MTYsIGRidXMuSW50MTYsIGRidXMuVUlu dDMyLCBkYnVzLkludDMyLA0KPiArCQkJCQkJZGJ1cy5VSW50NjQsIGRidXMuSW50NjQpKToNCj4g KwkJcmV0dXJuIGludChpdGVtKQ0KPiArCWlmIGlzaW5zdGFuY2UoaXRlbSwgZGJ1cy5CeXRlKToN Cj4gKwkJcmV0dXJuIGJ5dGVzKFtpbnQoaXRlbSldKQ0KPiArCWlmIGlzaW5zdGFuY2UoaXRlbSwg ZGJ1cy5TdHJpbmcpOg0KPiArCQkJcmV0dXJuIGl0ZW0NCj4gKwlpZiBpc2luc3RhbmNlKGl0ZW0s IChkYnVzLkFycmF5LCBsaXN0LCB0dXBsZSkpOg0KPiArCQlyZXR1cm4gW3Vud3JhcCh4KSBmb3Ig eCBpbiBpdGVtXQ0KPiArCWlmIGlzaW5zdGFuY2UoaXRlbSwgKGRidXMuRGljdGlvbmFyeSwgZGlj dCkpOg0KPiArCQlyZXR1cm4gZGljdChbKHVud3JhcCh4KSwgdW53cmFwKHkpKSBmb3IgeCwgeSBp biBpdGVtLml0ZW1zKCldKQ0KPiArDQo+ICsJcHJpbnQoc2V0X2Vycm9yKCdEaWN0aW9uYXJ5IGl0 ZW0gbm90IGhhbmRsZWQ6ICcpICsgdHlwZShpdGVtKSkNCj4gKw0KPiArCXJldHVybiBpdGVtDQo+ ICsNCj4gK2RlZiBhdHRhY2hfYXBwX2NiKG5vZGVfcGF0aCwgZGljdF9hcnJheSk6DQo+ICsJcHJp bnQoJ01lc2ggYXBwbGljYXRpb24gcmVnaXN0ZXJlZCAnLCBub2RlX3BhdGgpDQo+ICsNCj4gKwlv YmogPSBidXMuZ2V0X29iamVjdChNRVNIX1NFUlZJQ0VfTkFNRSwgbm9kZV9wYXRoKQ0KPiArDQo+ ICsJZ2xvYmFsIG5vZGUNCj4gKwlub2RlID0gZGJ1cy5JbnRlcmZhY2Uob2JqLCBNRVNIX05PREVf SUZBQ0UpDQo+ICsNCj4gKwllbHMgPSB1bndyYXAoZGljdF9hcnJheSkNCj4gKw0KPiArCWZvciBl bCBpbiBlbHM6DQo+ICsJCWlkeCA9IHN0cnVjdC51bnBhY2soJ2InLCBlbFswXSlbMF0NCj4gKw0K PiArCQltb2RlbHMgPSBlbFsxXQ0KPiArCQllbGVtZW50ID0gYXBwLmdldF9lbGVtZW50KGlkeCkN Cj4gKwkJZWxlbWVudC5zZXRfbW9kZWxfY29uZmlnKG1vZGVscykNCj4gKw0KPiArZGVmIGludGVy ZmFjZXNfcmVtb3ZlZF9jYihvYmplY3RfcGF0aCwgaW50ZXJmYWNlcyk6DQo+ICsJcHJpbnQoJ1Jl bW92ZWQnKQ0KPiArCWlmIG5vdCBtZXNoX25ldDoNCj4gKwkJcmV0dXJuDQo+ICsNCj4gKwlwcmlu dChvYmplY3RfcGF0aCkNCj4gKwlpZiBvYmplY3RfcGF0aCA9PSBtZXNoX25ldFsyXToNCj4gKwkJ cHJpbnQoJ1NlcnZpY2Ugd2FzIHJlbW92ZWQnKQ0KPiArCQlhcHBfZXhpdCgpDQo+ICsNCj4gK2Rl ZiBzZW5kX3Jlc3BvbnNlKHBhdGgsIGRlc3QsIGtleSwgZGF0YSk6DQo+ICsJCW5vZGUuU2VuZChw YXRoLCBkZXN0LCBrZXksIGRhdGEsIHJlcGx5X2hhbmRsZXI9Z2VuZXJpY19yZXBseV9jYiwNCj4g KwkJCQkJCWVycm9yX2hhbmRsZXI9Z2VuZXJpY19lcnJvcl9jYikNCj4gKw0KPiArZGVmIHNlbmRf cHVibGljYXRpb24ocGF0aCwgbW9kZWxfaWQsIGRhdGEpOg0KPiArCQlwcmludCgnU2VuZCBwdWJs aWNhdGlvbiAnLCBlbmQ9JycpDQo+ICsJCXByaW50KGRhdGEpDQo+ICsJCW5vZGUuUHVibGlzaChw YXRoLCBtb2RlbF9pZCwgZGF0YSwNCj4gKwkJCQkJCXJlcGx5X2hhbmRsZXI9Z2VuZXJpY19yZXBs eV9jYiwNCj4gKwkJCQkJCWVycm9yX2hhbmRsZXI9Z2VuZXJpY19lcnJvcl9jYikNCj4gKw0KPiAr ZGVmIHByaW50X3N0YXRlKHN0YXRlKToNCj4gKwlwcmludCgnU3RhdGUgaXMgJywgZW5kPScnKQ0K PiArCWlmIHN0YXRlID09IDA6DQo+ICsJCXByaW50KCdPRkYnKQ0KPiArCWVsaWYgc3RhdGUgPT0g MToNCj4gKwkJcHJpbnQoJ09OJykNCj4gKwllbHNlOg0KPiArCQlwcmludCgnVU5LTk9XTicpDQo+ ICtjbGFzcyBQdWJUaW1lcigpOg0KPiArCWRlZiBfX2luaXRfXyhzZWxmKToNCj4gKwkJc2VsZi5z ZWNvbmRzID0gTm9uZQ0KPiArCQlzZWxmLmZ1bmMgPSBOb25lDQo+ICsJCXNlbGYudGhyZWFkID0g Tm9uZQ0KPiArCQlzZWxmLmJ1c3kgPSBGYWxzZQ0KPiArDQo+ICsJZGVmIF90aW1lb3V0X2NiKHNl bGYpOg0KPiArCQlzZWxmLmZ1bmMoKQ0KPiArCQlzZWxmLmJ1c3kgPSBUcnVlDQo+ICsJCXNlbGYu X3NjaGVkdWxlX3RpbWVyKCkNCj4gKwkJc2VsZi5idXN5ID1GYWxzZQ0KPiArDQo+ICsJZGVmIF9z Y2hlZHVsZV90aW1lcihzZWxmKToNCj4gKwkJc2VsZi50aHJlYWQgPSBUaW1lcihzZWxmLnNlY29u ZHMsIHNlbGYuX3RpbWVvdXRfY2IpDQo+ICsJCXNlbGYudGhyZWFkLnN0YXJ0KCkNCj4gKw0KPiAr CWRlZiBzdGFydChzZWxmLCBzZWNvbmRzLCBmdW5jKToNCj4gKwkJc2VsZi5mdW5jID0gZnVuYw0K PiArCQlzZWxmLnNlY29uZHMgPSBzZWNvbmRzDQo+ICsJCWlmIG5vdCBzZWxmLmJ1c3k6DQo+ICsJ CQlzZWxmLl9zY2hlZHVsZV90aW1lcigpDQo+ICsNCj4gKwlkZWYgY2FuY2VsKHNlbGYpOg0KPiAr CQlpZiBzZWxmLnRocmVhZCBpcyBub3QgTm9uZToNCj4gKwkJCXNlbGYudGhyZWFkLmNhbmNlbCgp DQo+ICsJCQlzZWxmLnRocmVhZCA9IE5vbmUNCj4gKw0KPiArY2xhc3MgQXBwbGljYXRpb24oZGJ1 cy5zZXJ2aWNlLk9iamVjdCk6DQo+ICsNCj4gKwlkZWYgX19pbml0X18oc2VsZiwgYnVzKToNCj4g KwkJc2VsZi5wYXRoID0gJy9leGFtcGxlJw0KPiArCQlzZWxmLmFnZW50ID0gTm9uZQ0KPiArCQlz ZWxmLmVsZW1lbnRzID0gW10NCj4gKwkJZGJ1cy5zZXJ2aWNlLk9iamVjdC5fX2luaXRfXyhzZWxm LCBidXMsIHNlbGYucGF0aCkNCj4gKw0KPiArCWRlZiBzZXRfYWdlbnQoc2VsZiwgYWdlbnQpOg0K PiArCQlzZWxmLmFnZW50ID0gYWdlbnQNCj4gKw0KPiArCWRlZiBnZXRfcGF0aChzZWxmKToNCj4g KwkJcmV0dXJuIGRidXMuT2JqZWN0UGF0aChzZWxmLnBhdGgpDQo+ICsNCj4gKwlkZWYgYWRkX2Vs ZW1lbnQoc2VsZiwgZWxlbWVudCk6DQo+ICsJCXNlbGYuZWxlbWVudHMuYXBwZW5kKGVsZW1lbnQp DQo+ICsNCj4gKwlkZWYgZ2V0X2VsZW1lbnQoc2VsZiwgaWR4KToNCj4gKwkJZm9yIGVsZSBpbiBz ZWxmLmVsZW1lbnRzOg0KPiArCQkJaWYgZWxlLmdldF9pbmRleCgpID09IGlkeDoNCj4gKwkJCQly ZXR1cm4gZWxlDQo+ICsNCj4gKwlkZWYgZ2V0X3Byb3BlcnRpZXMoc2VsZik6DQo+ICsJCXJldHVy biB7DQo+ICsJCQlNRVNIX0FQUExJQ0FUSU9OX0lGQUNFOiB7DQo+ICsJCQkJJ0NvbXBhbnlJRCc6 IGRidXMuVUludDE2KEFQUF9DT01QQU5ZX0lEKSwNCj4gKwkJCQknUHJvZHVjdElEJzogZGJ1cy5V SW50MTYoQVBQX1BST0RVQ1RfSUQpLA0KPiArCQkJCSdWZXJzaW9uSUQnOiBkYnVzLlVJbnQxNihB UFBfVkVSU0lPTl9JRCkNCj4gKwkJCX0NCj4gKwkJfQ0KPiArDQo+ICsJQGRidXMuc2VydmljZS5t ZXRob2QoREJVU19PTV9JRkFDRSwgb3V0X3NpZ25hdHVyZT0nYXtvYXtzYXtzdn19fScpDQo+ICsJ ZGVmIEdldE1hbmFnZWRPYmplY3RzKHNlbGYpOg0KPiArCQlyZXNwb25zZSA9IHt9DQo+ICsJCXJl c3BvbnNlW3NlbGYucGF0aF0gPSBzZWxmLmdldF9wcm9wZXJ0aWVzKCkNCj4gKwkJcmVzcG9uc2Vb c2VsZi5hZ2VudC5nZXRfcGF0aCgpXSA9IHNlbGYuYWdlbnQuZ2V0X3Byb3BlcnRpZXMoKQ0KPiAr CQlmb3IgZWxlbWVudCBpbiBzZWxmLmVsZW1lbnRzOg0KPiArCQkJcmVzcG9uc2VbZWxlbWVudC5n ZXRfcGF0aCgpXSA9IGVsZW1lbnQuZ2V0X3Byb3BlcnRpZXMoKQ0KPiArCQlyZXR1cm4gcmVzcG9u c2UNCj4gKw0KPiArCUBkYnVzLnNlcnZpY2UubWV0aG9kKE1FU0hfQVBQTElDQVRJT05fSUZBQ0Us DQo+ICsJCQkJCWluX3NpZ25hdHVyZT0idCIsIG91dF9zaWduYXR1cmU9IiIpDQo+ICsJZGVmIEpv aW5Db21wbGV0ZShzZWxmLCB2YWx1ZSk6DQo+ICsJCWdsb2JhbCB0b2tlbg0KPiArCQlnbG9iYWwg aGF2ZV90b2tlbg0KPiArDQo+ICsJCXByaW50KCdKb2luQ29tcGxldGUgd2l0aCB0b2tlbiAnICsg c2V0X2dyZWVuKGhleCh2YWx1ZSkpKQ0KPiArDQo+ICsJCXRva2VuID0gdmFsdWUNCj4gKwkJaGF2 ZV90b2tlbiA9IFRydWUNCj4gKw0KPiArCQlhdHRhY2godG9rZW4pDQo+ICsNCj4gKwlAZGJ1cy5z ZXJ2aWNlLm1ldGhvZChNRVNIX0FQUExJQ0FUSU9OX0lGQUNFLA0KPiArCQkJCQlpbl9zaWduYXR1 cmU9InMiLCBvdXRfc2lnbmF0dXJlPSIiKQ0KPiArCWRlZiBKb2luRmFpbGVkKHNlbGYsIHZhbHVl KToNCj4gKwkJcHJpbnQoc2V0X2Vycm9yKCdKb2luRmFpbGVkICcpLCB2YWx1ZSkNCj4gKw0KPiAr DQo+ICtjbGFzcyBFbGVtZW50KGRidXMuc2VydmljZS5PYmplY3QpOg0KPiArCVBBVEhfQkFTRSA9 ICcvZXhhbXBsZS9lbGUnDQo+ICsNCj4gKwlkZWYgX19pbml0X18oc2VsZiwgYnVzLCBpbmRleCk6 DQo+ICsJCXNlbGYucGF0aCA9IHNlbGYuUEFUSF9CQVNFICsgZm9ybWF0KGluZGV4LCAnMDJ4JykN Cj4gKwkJc2VsZi5tb2RlbHMgPSBbXQ0KPiArCQlzZWxmLmJ1cyA9IGJ1cw0KPiArCQlzZWxmLmlu ZGV4ID0gaW5kZXgNCj4gKwkJZGJ1cy5zZXJ2aWNlLk9iamVjdC5fX2luaXRfXyhzZWxmLCBidXMs IHNlbGYucGF0aCkNCj4gKw0KPiArCWRlZiBfZ2V0X3NpZ19tb2RlbHMoc2VsZik6DQo+ICsJCWlk cyA9IFtdDQo+ICsJCWZvciBtb2RlbCBpbiBzZWxmLm1vZGVsczoNCj4gKwkJCWlkID0gbW9kZWwu Z2V0X2lkKCkNCj4gKwkJCXZlbmRvciA9IG1vZGVsLmdldF92ZW5kb3IoKQ0KPiArCQkJaWYgdmVu ZG9yID09IFZFTkRPUl9JRF9OT05FOg0KPiArCQkJCWlkcy5hcHBlbmQoaWQpDQo+ICsJCXJldHVy biBpZHMNCj4gKw0KPiArCWRlZiBnZXRfcHJvcGVydGllcyhzZWxmKToNCj4gKwkJcmV0dXJuIHsN Cj4gKwkJCU1FU0hfRUxFTUVOVF9JRkFDRTogew0KPiArCQkJCSdJbmRleCc6IGRidXMuQnl0ZShz ZWxmLmluZGV4KSwNCj4gKwkJCQknTW9kZWxzJzogZGJ1cy5BcnJheSgNCj4gKwkJCQkJc2VsZi5f Z2V0X3NpZ19tb2RlbHMoKSwgc2lnbmF0dXJlPSdxJykNCj4gKwkJCX0NCj4gKwkJfQ0KPiArDQo+ ICsJZGVmIGFkZF9tb2RlbChzZWxmLCBtb2RlbCk6DQo+ICsJCW1vZGVsLnNldF9wYXRoKHNlbGYu cGF0aCkNCj4gKwkJc2VsZi5tb2RlbHMuYXBwZW5kKG1vZGVsKQ0KPiArDQo+ICsJZGVmIGdldF9p bmRleChzZWxmKToNCj4gKwkJcmV0dXJuIHNlbGYuaW5kZXgNCj4gKw0KPiArCWRlZiBzZXRfbW9k ZWxfY29uZmlnKHNlbGYsIGNvbmZpZ3MpOg0KPiArCQlmb3IgY29uZmlnIGluIGNvbmZpZ3M6DQo+ ICsJCQltb2RfaWQgPSBjb25maWdbMF0NCj4gKwkJCXNlbGYuVXBkYXRlTW9kZWxDb25maWd1cmF0 aW9uKG1vZF9pZCwgY29uZmlnWzFdKQ0KPiArDQo+ICsJQGRidXMuc2VydmljZS5tZXRob2QoTUVT SF9FTEVNRU5UX0lGQUNFLA0KPiArCQkJCQlpbl9zaWduYXR1cmU9InFxYmF5Iiwgb3V0X3NpZ25h dHVyZT0iIikNCj4gKwlkZWYgTWVzc2FnZVJlY2VpdmVkKHNlbGYsIHNvdXJjZSwga2V5LCBpc19z dWIsIGRhdGEpOg0KPiArCQlwcmludCgnTWVzc2FnZSBSZWNlaXZlZCBvbiBFbGVtZW50ICcsIGVu ZD0nJykNCj4gKwkJcHJpbnQoc2VsZi5pbmRleCkNCj4gKwkJZm9yIG1vZGVsIGluIHNlbGYubW9k ZWxzOg0KPiArCQkJbW9kZWwucHJvY2Vzc19tZXNzYWdlKHNvdXJjZSwga2V5LCBkYXRhKQ0KPiAr DQo+ICsJQGRidXMuc2VydmljZS5tZXRob2QoTUVTSF9FTEVNRU5UX0lGQUNFLA0KPiArCQkJCQlp bl9zaWduYXR1cmU9InFhe3N2fSIsIG91dF9zaWduYXR1cmU9IiIpDQo+ICsNCj4gKwlkZWYgVXBk YXRlTW9kZWxDb25maWd1cmF0aW9uKHNlbGYsIG1vZGVsX2lkLCBjb25maWcpOg0KPiArCQlwcmlu dCgnVXBkYXRlTW9kZWxDb25maWcgJywgZW5kPScnKQ0KPiArCQlwcmludChoZXgobW9kZWxfaWQp KQ0KPiArCQlmb3IgbW9kZWwgaW4gc2VsZi5tb2RlbHM6DQo+ICsJCQlpZiBtb2RlbF9pZCA9PSBt b2RlbC5nZXRfaWQoKToNCj4gKwkJCQltb2RlbC5zZXRfY29uZmlnKGNvbmZpZykNCj4gKwkJCQly ZXR1cm4NCj4gKw0KPiArCUBkYnVzLnNlcnZpY2UubWV0aG9kKE1FU0hfRUxFTUVOVF9JRkFDRSwN Cj4gKwkJCQkJaW5fc2lnbmF0dXJlPSIiLCBvdXRfc2lnbmF0dXJlPSIiKQ0KPiArDQo+ICsJZGVm IGdldF9wYXRoKHNlbGYpOg0KPiArCQlyZXR1cm4gZGJ1cy5PYmplY3RQYXRoKHNlbGYucGF0aCkN Cj4gKw0KPiArY2xhc3MgTW9kZWwoKToNCj4gKwlkZWYgX19pbml0X18oc2VsZiwgbW9kZWxfaWQp Og0KPiArCQlzZWxmLmNtZF9vcHMgPSBbXQ0KPiArCQlzZWxmLm1vZGVsX2lkID0gbW9kZWxfaWQN Cj4gKwkJc2VsZi52ZW5kb3IgPSBWRU5ET1JfSURfTk9ORQ0KPiArCQlzZWxmLmJpbmRpbmdzID0g W10NCj4gKwkJc2VsZi5wdWJfcGVyaW9kID0gMA0KPiArCQlzZWxmLnB1Yl9pZCA9IDANCj4gKwkJ c2VsZi5wYXRoID0gTm9uZQ0KPiArCQlzZWxmLnRpbWVyID0gTm9uZQ0KPiArDQo+ICsJZGVmIHNl dF9wYXRoKHNlbGYsIHBhdGgpOg0KPiArCQlzZWxmLnBhdGggPSBwYXRoDQo+ICsNCj4gKwlkZWYg Z2V0X2lkKHNlbGYpOg0KPiArCQlyZXR1cm4gc2VsZi5tb2RlbF9pZA0KPiArDQo+ICsJZGVmIGdl dF92ZW5kb3Ioc2VsZik6DQo+ICsJCXJldHVybiBzZWxmLnZlbmRvcg0KPiArDQo+ICsJZGVmIHBy b2Nlc3NfbWVzc2FnZShzZWxmLCBzb3VyY2UsIGtleSwgZGF0YSk6DQo+ICsJCXJldHVybg0KPiAr DQo+ICsJZGVmIHNldF9wdWJsaWNhdGlvbihzZWxmLCBwZXJpb2QpOg0KPiArCQlzZWxmLnB1Yl9w ZXJpb2QgPSBwZXJpb2QNCj4gKw0KPiArCWRlZiBzZXRfY29uZmlnKHNlbGYsIGNvbmZpZyk6DQo+ ICsJCWlmICdCaW5kaW5ncycgaW4gY29uZmlnOg0KPiArCQkJc2VsZi5iaW5kaW5ncyA9IGNvbmZp Zy5nZXQoJ0JpbmRpbmdzJykNCj4gKwkJCXByaW50KCdCaW5kaW5nczogJywgZW5kPScnKQ0KPiAr CQkJcHJpbnQoc2VsZi5iaW5kaW5ncykNCj4gKwkJaWYgJ1B1YmxpY2F0aW9uUGVyaW9kJyBpbiBj b25maWc6DQo+ICsJCQlzZWxmLnNldF9wdWJsaWNhdGlvbihjb25maWcuZ2V0KCdQdWJsaWNhdGlv blBlcmlvZCcpKQ0KPiArCQkJcHJpbnQoJ01vZGVsIHB1YmxpY2F0aW9uIHBlcmlvZCAnLCBlbmQ9 JycpDQo+ICsJCQlwcmludChzZWxmLnB1Yl9wZXJpb2QsIGVuZD0nJykNCj4gKwkJCXByaW50KCcg bXMnKQ0KPiArDQo+ICsJZGVmIHByaW50X2JpbmRpbmdzKHNlbGYpOg0KPiArCQlwcmludChzZXRf Y3lhbignTW9kZWwnKSwgc2V0X2N5YW4oJyUwNHgnICUgc2VsZi5tb2RlbF9pZCksDQo+ICsJCQlz ZXRfY3lhbignaXMgYm91bmQgdG8gYXBwbGljYXRpb24ga2V5KHMpOiAnKSwgZW5kID0gJycpDQo+ ICsNCj4gKwkJaWYgbGVuKHNlbGYuYmluZGluZ3MpID09IDA6DQo+ICsJCQlwcmludChzZXRfY3lh bignKiogTm9uZSAqKicpKQ0KPiArCQlmb3IgYiBpbiBzZWxmLmJpbmRpbmdzOg0KPiArCQkJcHJp bnQoc2V0X2N5YW4oJyUwNHgnICUgYiksIHNldF9jeWFuKCcsICcpKQ0KPiArDQo+ICsjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMNCj4gKyMgT24gT2ZmIFNlcnZlciBNb2RlbA0KPiArIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjDQo+ICtjbGFzcyBPbk9mZlNlcnZlcihNb2RlbCk6DQo+ICsJZGVmIF9f aW5pdF9fKHNlbGYsIG1vZGVsX2lkKToNCj4gKwkJTW9kZWwuX19pbml0X18oc2VsZiwgbW9kZWxf aWQpDQo+ICsJCXNlbGYuY21kX29wcyA9IHsgMHg4MjAxLCAgIyBnZXQNCj4gKwkJCQkgMHg4MjAy LCAgIyBzZXQNCj4gKwkJCQkgMHg4MjAzLCAgIyBzZXQgdW5hY2tub3dsZWRnZWQNCj4gKwkJCQkg MHg4MjA0IH0gIyBzdGF0dXMNCj4gKw0KPiArCQlwcmludCgiT25PZmYgU2VydmVyICIpDQo+ICsJ CXNlbGYuc3RhdGUgPSAwDQo+ICsJCXByaW50X3N0YXRlKHNlbGYuc3RhdGUpDQo+ICsJCXNlbGYu dGltZXIgPSBQdWJUaW1lcigpDQo+ICsNCj4gKwlkZWYgcHJvY2Vzc19tZXNzYWdlKHNlbGYsIHNv dXJjZSwga2V5LCBkYXRhKToNCj4gKwkJZGF0YWxlbiA9IGxlbihkYXRhKQ0KPiArCQlwcmludCgn T25PZmYgU2VydmVyIHByb2Nlc3MgbWVzc2FnZSBsZW46ICcsIGRhdGFsZW4pDQo+ICsNCj4gKwkJ aWYgZGF0YWxlbiAhPSAyIGFuZCBkYXRhbGVuICE9IDM6DQo+ICsJCQkjIFRoZSBvcGNvZGUgaXMg bm90IHJlY29nbml6ZWQgYnkgdGhpcyBtb2RlbA0KPiArCQkJcmV0dXJuDQo+ICsNCj4gKwkJaWYg ZGF0YWxlbiA9PSAyOg0KPiArCQkJb3BfdHVwbGU9c3RydWN0LnVucGFjaygnPEgnLGJ5dGVzKGRh dGEpKQ0KPiArCQkJb3Bjb2RlID0gb3BfdHVwbGVbMF0NCj4gKwkJCWlmIG9wY29kZSAhPSAweDgy MDE6DQo+ICsJCQkJIyBUaGUgb3Bjb2RlIGlzIG5vdCByZWNvZ25pemVkIGJ5IHRoaXMgbW9kZWwN Cj4gKwkJCQlyZXR1cm4NCj4gKwkJCXByaW50KCdHZXQgc3RhdGUnKQ0KPiArCQllbGlmIGRhdGFs ZW4gPT0gMzoNCj4gKwkJCW9wY29kZSxzZWxmLnN0YXRlPXN0cnVjdC51bnBhY2soJzxIQicsYnl0 ZXMoZGF0YSkpDQo+ICsJCQlpZiBvcGNvZGUgIT0gMHg4MjAyIGFuZCBvcGNvZGUgIT0gMHg4MjAz Og0KPiArCQkJCSMgVGhlIG9wY29kZSBpcyBub3QgcmVjb2duaXplZCBieSB0aGlzIG1vZGVsDQo+ ICsJCQkJcmV0dXJuDQo+ICsJCQlwcmludF9zdGF0ZShzZWxmLnN0YXRlKQ0KPiArDQo+ICsJCXJz cF9kYXRhID0gc3RydWN0LnBhY2soJzxIQicsIDB4ODIwNCwgc2VsZi5zdGF0ZSkNCj4gKwkJc2Vu ZF9yZXNwb25zZShzZWxmLnBhdGgsIHNvdXJjZSwga2V5LCByc3BfZGF0YSkNCj4gKw0KPiArCWRl ZiBzZXRfcHVibGljYXRpb24oc2VsZiwgcGVyaW9kKToNCj4gKw0KPiArCQkjIFdlIGRvIG5vdCBo YW5kbGUgbXMgaW4gdGhpcyBleGFtcGxlDQo+ICsJCWlmIHBlcmlvZCA8IDEwMDA6DQo+ICsJCQly ZXR1cm4NCj4gKw0KPiArCQlzZWxmLnB1Yl9wZXJpb2QgPSBwZXJpb2QNCj4gKwkJaWYgcGVyaW9k ID09IDA6DQo+ICsJCQlzZWxmLnRpbWVyLmNhbmNlbCgpDQo+ICsJCQlyZXR1cm4NCj4gKw0KPiAr CQlzZWxmLnRpbWVyLnN0YXJ0KHBlcmlvZC8xMDAwLCBzZWxmLnB1Ymxpc2gpDQo+ICsNCj4gKw0K PiArCWRlZiBwdWJsaXNoKHNlbGYpOg0KPiArCQlwcmludCgnUHVibGlzaCcpDQo+ICsJCWRhdGEg PSBzdHJ1Y3QucGFjaygnPEhCJywgMHg4MjA0LCBzZWxmLnN0YXRlKQ0KPiArCQlzZW5kX3B1Ymxp Y2F0aW9uKHNlbGYucGF0aCwgc2VsZi5tb2RlbF9pZCwgZGF0YSkNCj4gKw0KPiArIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjDQo+ICsjIE9uIE9mZiBDbGllbnQgTW9kZWwNCj4gKyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIw0KPiArY2xhc3MgT25PZmZDbGllbnQoTW9kZWwpOg0KPiArCWRlZiBfX2lu aXRfXyhzZWxmLCBtb2RlbF9pZCk6DQo+ICsJCU1vZGVsLl9faW5pdF9fKHNlbGYsIG1vZGVsX2lk KQ0KPiArCQlzZWxmLmNtZF9vcHMgPSB7IDB4ODIwMSwgICMgZ2V0DQo+ICsJCQkJIDB4ODIwMiwg ICMgc2V0DQo+ICsJCQkJIDB4ODIwMywgICMgc2V0IHVuYWNrbm93bGVkZ2VkDQo+ICsJCQkJIDB4 ODIwNCB9ICMgc3RhdHVzDQo+ICsJCXByaW50KCdPbk9mZiBDbGllbnQnKQ0KPiArDQo+ICsJZGVm IF9yZXBseV9jYihzdGF0ZSk6DQo+ICsJCXByaW50KCdTdGF0ZSAnLCBlbmQ9JycpOw0KPiArCQlw cmludChzdGF0ZSkNCj4gKw0KPiArCWRlZiBfc2VuZF9tZXNzYWdlKHNlbGYsIGRlc3QsIGtleSwg ZGF0YSwgcmVwbHlfY2IpOg0KPiArCQlwcmludCgnT25PZmZDbGllbnQgc2VuZCBkYXRhJykNCj4g KwkJbm9kZS5TZW5kKHNlbGYucGF0aCwgZGVzdCwga2V5LCBkYXRhLCByZXBseV9oYW5kbGVyPXJl cGx5X2NiLA0KPiArCQkJCSAgZXJyb3JfaGFuZGxlcj1nZW5lcmljX2Vycm9yX2NiKQ0KPiArDQo+ ICsJZGVmIGdldF9zdGF0ZShzZWxmLCBkZXN0LCBrZXkpOg0KPiArCQlvcGNvZGUgPSAweDgyMDEN Cj4gKwkJZGF0YSA9IHN0cnVjdC5wYWNrKCc8SCcsIG9wY29kZSkNCj4gKwkJc2VsZi5fc2VuZF9t ZXNzYWdlKGRlc3QsIGtleSwgZGF0YSwgc2VsZi5fcmVwbHlfY2IpDQo+ICsNCj4gKwlkZWYgc2V0 X3N0YXRlKHNlbGYsIGRlc3QsIGtleSwgc3RhdGUpOg0KPiArCQlvcGNvZGUgPSAweDgyMDINCj4g KwkJcHJpbnQoJ1N0YXRlOicsIHN0YXRlKQ0KPiArCQlkYXRhID0gc3RydWN0LnBhY2soJzxIQics IG9wY29kZSwgc3RhdGUpDQo+ICsJCXNlbGYuX3NlbmRfbWVzc2FnZShkZXN0LCBrZXksIGRhdGEs IHNlbGYuX3JlcGx5X2NiKQ0KPiArDQo+ICsJZGVmIHByb2Nlc3NfbWVzc2FnZShzZWxmLCBzb3Vy Y2UsIGtleSwgZGF0YSk6DQo+ICsJCXByaW50KCdPbk9mZkNsaWVudCBwcm9jZXNzIG1lc3NhZ2Ug bGVuID0gJywgZW5kID0gJycpDQo+ICsJCWRhdGFsZW4gPSBsZW4oZGF0YSkNCj4gKwkJcHJpbnQo ZGF0YWxlbikNCj4gKw0KPiArCQlpZiBkYXRhbGVuICE9IDM6DQo+ICsJCQkjIFRoZSBvcGNvZGUg aXMgbm90IHJlY29nbml6ZWQgYnkgdGhpcyBtb2RlbA0KPiArCQkJcmV0dXJuDQo+ICsNCj4gKwkJ b3Bjb2RlLCBzdGF0ZT1zdHJ1Y3QudW5wYWNrKCc8SEInLGJ5dGVzKGRhdGEpKQ0KPiArDQo+ICsJ CWlmIG9wY29kZSAhPSAweDgyMDQgOg0KPiArCQkJIyBUaGUgb3Bjb2RlIGlzIG5vdCByZWNvZ25p emVkIGJ5IHRoaXMgbW9kZWwNCj4gKwkJCXJldHVybg0KPiArDQo+ICsJCXByaW50KHNldF95ZWxs b3coJ0dvdCBzdGF0ZSAnKSwgZW5kID0gJycpDQo+ICsNCj4gKwkJc3RhdGVfc3RyID0gIk9OIg0K PiArCQlpZiBzdGF0ZSA9PSAwOg0KPiArCQkJc3RhdGVfc3RyID0gIk9GRiINCj4gKw0KPiArCQlw cmludChzZXRfZ3JlZW4oc3RhdGVfc3RyKSwgc2V0X3llbGxvdygnZnJvbScpLA0KPiArCQkJCQkJ c2V0X2dyZWVuKCclMDR4JyAlIHNvdXJjZSkpDQo+ICsNCj4gKyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIw0KPiArIyBNZW51IGZ1bmN0aW9ucw0KPiArIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQo+ ICtjbGFzcyBNZW51SGFuZGxlcihvYmplY3QpOg0KPiArCWRlZiBfX2luaXRfXyhzZWxmLCBjYWxs YmFjayk6DQo+ICsJCXNlbGYuY2IgPSBjYWxsYmFjaw0KPiArCQlmbGFncyA9IGZjbnRsLmZjbnRs KHN5cy5zdGRpbi5maWxlbm8oKSwgZmNudGwuRl9HRVRGTCkNCj4gKwkJZmxhZ3MgfD0gb3MuT19O T05CTE9DSw0KPiArCQlmY250bC5mY250bChzeXMuc3RkaW4uZmlsZW5vKCksIGZjbnRsLkZfU0VU RkwsIGZsYWdzKQ0KPiArCQlzeXMuc3RkaW4uZmx1c2goKQ0KPiArCQlHTGliLmlvX2FkZF93YXRj aChzeXMuc3RkaW4sIEdMaWIuSU9fSU4sIHNlbGYuaW5wdXRfY2FsbGJhY2spDQo+ICsNCj4gKwlk ZWYgaW5wdXRfY2FsbGJhY2soc2VsZiwgZmQsIGNvbmRpdGlvbik6DQo+ICsJCWNodW5rID0gZmQu cmVhZCgpDQo+ICsJCWJ1ZmZlciA9ICcnDQo+ICsJCWZvciBjaGFyIGluIGNodW5rOg0KPiArCQkJ YnVmZmVyICs9IGNoYXINCj4gKwkJCWlmIGNoYXIgPT0gJ1xuJzoNCj4gKwkJCQlzZWxmLmNiKGJ1 ZmZlcikNCj4gKw0KPiArCQlyZXR1cm4gVHJ1ZQ0KPiArDQo+ICtkZWYgcHJvY2Vzc19pbnB1dChp bnB1dF9zdHIpOg0KPiArCWlmIG1lbnVfbGV2ZWwgPT0gMDoNCj4gKwkJcHJvY2Vzc19tYWluX21l bnUoaW5wdXRfc3RyKQ0KPiArCWVsaWYgbWVudV9sZXZlbCA9PSAxOg0KPiArCQlwcm9jZXNzX2Ns aWVudF9tZW51KGlucHV0X3N0cikNCj4gKwllbHNlOg0KPiArCQlwcmludChzZXRfZXJyb3IoJ0JV RzogYmFkIG1lbnUgbGV2ZWwnKSkNCj4gKw0KPiArZGVmIHN3aXRjaF9tZW51KGxldmVsKToNCj4g KwlnbG9iYWwgbWVudV9sZXZlbA0KPiArDQo+ICsJaWYgbGV2ZWwgPiAxOg0KPiArCQlyZXR1cm4N Cj4gKw0KPiArCWlmIGxldmVsID09IDA6DQo+ICsJCW1haW5fbWVudSgpDQo+ICsJZWxpZiBsZXZl bCA9PSAxOg0KPiArCQljbGllbnRfbWVudSgpDQo+ICsNCj4gKwltZW51X2xldmVsID0gbGV2ZWwN Cj4gKw0KPiArIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQo+ICsjIE1haW4gbWVudSBmdW5jdGlv bnMNCj4gKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KPiArZGVmIHByb2Nlc3NfbWFpbl9tZW51 KGlucHV0X3N0cik6DQo+ICsJZ2xvYmFsIHRva2VuDQo+ICsJZ2xvYmFsIHVzZXJfaW5wdXQNCj4g KwlnbG9iYWwgaGF2ZV90b2tlbg0KPiArDQo+ICsJc3RyID0gaW5wdXRfc3RyLnN0cmlwKCkNCj4g Kw0KPiArCWlmIHVzZXJfaW5wdXQgPT0gMToNCj4gKwkJcmVzID0gc2V0X3Rva2VuKHN0cikNCj4g KwkJdXNlcl9pbnB1dCA9IDANCj4gKw0KPiArCQlpZiByZXMgPT0gRmFsc2U6DQo+ICsJCQltYWlu X21lbnUoKQ0KPiArDQo+ICsJCXJldHVybg0KPiArDQo+ICsJIyBBbGxvdyBlbnRlcmluZyBlbXB0 eSBsaW5lcyBmb3IgYmV0dGVyIG91dHB1dCB2aXNpYmlsaXR5DQo+ICsJaWYgbGVuKHN0cikgPT0g MDoNCj4gKwkJcmV0dXJuDQo+ICsNCj4gKwlpZiBzdHIuaXNkaWdpdCgpID09IEZhbHNlOg0KPiAr CQltYWluX21lbnUoKQ0KPiArCQlyZXR1cm4NCj4gKw0KPiArCW9wdCA9IGludChzdHIpDQo+ICsN Cj4gKwlpZiBvcHQgPiA2Og0KPiArCQlwcmludChzZXRfZXJyb3IoJ1Vua25vd24gbWVudSBvcHRp b246ICcpLCBvcHQpDQo+ICsJCW1haW5fbWVudSgpDQo+ICsJZWxpZiBvcHQgPT0gMToNCj4gKwkJ aWYgaGF2ZV90b2tlbjoNCj4gKwkJCXByaW50KCdUb2tlbiBhbHJlYWR5IHNldCcpDQo+ICsJCQly ZXR1cm4NCj4gKw0KPiArCQl1c2VyX2lucHV0ID0gMTsNCj4gKwkJcHJpbnQoc2V0X2N5YW4oJ0Vu dGVyIDE2LWRpZ2l0IGhleCBub2RlIElEOicpKQ0KPiArCWVsaWYgb3B0ID09IDI6DQo+ICsJCWlm IGFnZW50ID09IE5vbmU6DQo+ICsJCQlwcmludChzZXRfZXJyb3IoJ1Byb3Zpc2lvbmluZyBhZ2Vu dCBub3QgZm91bmQnKSkNCj4gKwkJCXJldHVybg0KPiArDQo+ICsJCWpvaW5fbWVzaCgpDQo+ICsJ ZWxpZiBvcHQgPT0gMzoNCj4gKwkJaWYgaGF2ZV90b2tlbiA9PSBGYWxzZToNCj4gKwkJCXByaW50 KHNldF9lcnJvcignVG9rZW4gaXMgbm90IHNldCcpKQ0KPiArCQkJbWFpbl9tZW51KCkNCj4gKwkJ CXJldHVybg0KPiArDQo+ICsJCWF0dGFjaCh0b2tlbikNCj4gKwllbGlmIG9wdCA9PSA0Og0KPiAr CQlpZiBoYXZlX3Rva2VuID09IEZhbHNlOg0KPiArCQkJcHJpbnQoc2V0X2Vycm9yKCdUb2tlbiBp cyBub3Qgc2V0JykpDQo+ICsJCQltYWluX21lbnUoKQ0KPiArCQkJcmV0dXJuDQo+ICsNCj4gKwkJ cHJpbnQoJ1JlbW92ZSBtZXNoIG5vZGUnKQ0KPiArCQltZXNoX25ldC5MZWF2ZSh0b2tlbiwgcmVw bHlfaGFuZGxlcj1nZW5lcmljX3JlcGx5X2NiLA0KPiArCQkJCQllcnJvcl9oYW5kbGVyPWdlbmVy aWNfZXJyb3JfY2IpDQo+ICsJCWhhdmVfdG9rZW4gPSBGYWxzZQ0KPiArCWVsaWYgb3B0ID09IDU6 DQo+ICsJCXN3aXRjaF9tZW51KDEpDQo+ICsJZWxpZiBvcHQgPT0gNjoNCj4gKwkJYXBwX2V4aXQo KQ0KPiArDQo+ICsNCj4gK2RlZiBtYWluX21lbnUoKToNCj4gKwlwcmludChzZXRfY3lhbignKioq IE1BSU4gTUVOVSAqKionKSkNCj4gKwlwcmludChzZXRfY3lhbignMSAtIHNldCBub2RlIElEICh0 b2tlbiknKSkNCj4gKwlwcmludChzZXRfY3lhbignMiAtIGpvaW4gbWVzaCBuZXR3b3JrJykpDQo+ ICsJcHJpbnQoc2V0X2N5YW4oJzMgLSBhdHRhY2ggbWVzaCBub2RlJykpDQo+ICsJcHJpbnQoc2V0 X2N5YW4oJzQgLSByZW1vdmUgbm9kZScpKQ0KPiArCXByaW50KHNldF9jeWFuKCc1IC0gY2xpZW50 IG1lbnUnKSkNCj4gKwlwcmludChzZXRfY3lhbignNiAtIGV4aXQnKSkNCj4gKw0KPiArZGVmIHNl dF90b2tlbihzdHIpOg0KPiArCWdsb2JhbCB0b2tlbg0KPiArCWdsb2JhbCBoYXZlX3Rva2VuDQo+ ICsNCj4gKwlpZiBsZW4oc3RyKSAhPSAxNjoNCj4gKwkJcHJpbnQoc2V0X2Vycm9yKCdFeHBlY3Rl ZCAxNiBkaWdpdHMnKSkNCj4gKwkJcmV0dXJuIEZhbHNlDQo+ICsNCj4gKwl0cnk6DQo+ICsJCWlu cHV0X251bWJlciA9IGludChzdHIsIDE2KQ0KPiArCWV4Y2VwdCBWYWx1ZUVycm9yOg0KPiArCQlw cmludChzZXRfZXJyb3IoJ05vdCBhIHZhbGlkIGhleGFkZWNpbWFsIG51bWJlcicpKQ0KPiArCQly ZXR1cm4gRmFsc2UNCj4gKw0KPiArCXRva2VuID0gbnVtcHkudWludDY0KGlucHV0X251bWJlcikN Cj4gKwloYXZlX3Rva2VuID0gVHJ1ZQ0KPiArDQo+ICsJcmV0dXJuIFRydWUNCj4gKw0KPiArZGVm IGpvaW5fbWVzaCgpOg0KPiArCXV1aWQgPSBieXRlYXJyYXkuZnJvbWhleCgiMGEwMTAyMDMwNDA1 MDYwNzA4MDkwQTBCMEMwRDBFMEYiKQ0KPiArDQo+ICsJY2FwcyA9IFsib3V0LW51bWVyaWMiXQ0K PiArCW9vYiA9IFsib3RoZXIiXQ0KPiArDQo+ICsJcmFuZG9tLnNodWZmbGUodXVpZCkNCj4gKwl1 dWlkX3N0ciA9IGFycmF5X3RvX3N0cmluZyh1dWlkKQ0KPiArCXByaW50KCdKb2luaW5nIHdpdGgg VVVJRCAnICsgc2V0X2dyZWVuKHV1aWRfc3RyKSkNCj4gKw0KPiArCW1lc2hfbmV0LkpvaW4oYXBw LmdldF9wYXRoKCksIHV1aWQsDQo+ICsJCQlyZXBseV9oYW5kbGVyPWpvaW5fY2IsDQo+ICsJCQll cnJvcl9oYW5kbGVyPWpvaW5fZXJyb3JfY2IpDQo+ICsNCj4gKyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIw0KPiArIyBPbi9PZmYgQ2xpZW50IG1lbnUgZnVuY3Rpb25zDQo+ICsjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCj4gK2RlZiBwcm9jZXNzX2NsaWVudF9tZW51KGlucHV0 X3N0cik6DQo+ICsJZ2xvYmFsIHVzZXJfaW5wdXQNCj4gKwlnbG9iYWwgZHN0X2FkZHINCj4gKwln bG9iYWwgYXBwX2lkeA0KPiArDQo+ICsJcmVzID0gLTENCj4gKwlzdHIgPSBpbnB1dF9zdHIuc3Ry aXAoKQ0KPiArDQo+ICsJaWYgdXNlcl9pbnB1dCA9PSAxOg0KPiArCQlyZXMgPSBzZXRfdmFsdWUo c3RyKQ0KPiArCQlpZiByZXMgIT0gLTE6DQo+ICsJCQlkc3RfYWRkciA9IHJlcw0KPiArCWVsaWYg dXNlcl9pbnB1dCA9PSAyOg0KPiArCQlyZXMgPSBzZXRfdmFsdWUoc3RyKQ0KPiArCQlpZiByZXMg IT0gLTE6DQo+ICsJCQlhcHBfaWR4ID0gcmVzDQo+ICsNCj4gKwlpZiB1c2VyX2lucHV0ICE9IDA6 DQo+ICsJCXVzZXJfaW5wdXQgPSAwDQo+ICsJCWlmIHJlcyA9PSAtMToNCj4gKwkJCWNsaWVudF9t ZW51KCkNCj4gKwkJcmV0dXJuDQo+ICsNCj4gKwkjIEFsbG93IGVudGVyaW5nIGVtcHR5IGxpbmVz IGZvciBiZXR0ZXIgb3V0cHV0IHZpc2liaWxpdHkNCj4gKwlpZiBsZW4oc3RyKSA9PSAwOg0KPiAr CQlyZXR1cm4NCj4gKw0KPiArCWlmIHN0ci5pc2RpZ2l0KCkgPT0gRmFsc2U6DQo+ICsJCWNsaWVu dF9tZW51KCkNCj4gKwkJcmV0dXJuDQo+ICsNCj4gKwlvcHQgPSBpbnQoc3RyKQ0KPiArDQo+ICsJ aWYgb3B0ID4gNzoNCj4gKwkJcHJpbnQoc2V0X2Vycm9yKCdVbmtub3duIG1lbnUgb3B0aW9uOiAn KSwgb3B0KQ0KPiArCQljbGllbnRfbWVudSgpDQo+ICsJCXJldHVybg0KPiArDQo+ICsJaWYgb3B0 ID49IDMgYW5kIG9wdCA8PSA1IGFuZCBkc3RfYWRkciA9PSAweDAwMDA6DQo+ICsJCXByaW50KHNl dF9lcnJvcignRGVzdGluYXRpb24gYWRkcmVzcyBub3Qgc2V0IScpKQ0KPiArCQlyZXR1cm4NCj4g Kw0KPiArCWlmIG9wdCA9PSAxOg0KPiArCQl1c2VyX2lucHV0ID0gMTsNCj4gKwkJcHJpbnQoc2V0 X2N5YW4oJ0VudGVyIDQtZGlnaXQgaGV4IGRlc3RpbmF0aW9uIGFkZHJlc3M6JykpDQo+ICsJZWxp ZiBvcHQgPT0gMjoNCj4gKwkJdXNlcl9pbnB1dCA9IDI7DQo+ICsJCWFwcC5lbGVtZW50c1sxXS5t b2RlbHNbMF0ucHJpbnRfYmluZGluZ3MoKQ0KPiArCQlwcmludChzZXRfY3lhbignQ2hvb3NlIGFw cGxpY2F0aW9uIGtleSBpbmRleDonKSkNCj4gKwllbGlmIG9wdCA9PSAzOg0KPiArCQlhcHAuZWxl bWVudHNbMV0ubW9kZWxzWzBdLmdldF9zdGF0ZShkc3RfYWRkciwgYXBwX2lkeCkNCj4gKwllbGlm IG9wdCA9PSA0IG9yIG9wdCA9PSA1Og0KPiArCQlhcHAuZWxlbWVudHNbMV0ubW9kZWxzWzBdLnNl dF9zdGF0ZShkc3RfYWRkciwgYXBwX2lkeCwgb3B0IC0gNCkNCj4gKwllbGlmIG9wdCA9PSA2Og0K PiArCQlzd2l0Y2hfbWVudSgwKQ0KPiArCWVsaWYgb3B0ID09IDc6DQo+ICsJCWFwcF9leGl0KCkN Cj4gKw0KPiArZGVmIGNsaWVudF9tZW51KCk6DQo+ICsJcHJpbnQoc2V0X2N5YW4oJyoqKiBPTi9P RkYgQ0xJRU5UIE1FTlUgKioqJykpDQo+ICsJcHJpbnQoc2V0X2N5YW4oJzEgLSBzZXQgZGVzdGlu YXRpb24gYWRkcmVzcycpKQ0KPiArCXByaW50KHNldF9jeWFuKCcyIC0gc2V0IGFwcGxpY2F0aW9u IGtleSBpbmRleCcpKQ0KPiArCXByaW50KHNldF9jeWFuKCczIC0gZ2V0IHN0YXRlJykpDQo+ICsJ cHJpbnQoc2V0X2N5YW4oJzQgLSBzZXQgc3RhdGUgT0ZGJykpDQo+ICsJcHJpbnQoc2V0X2N5YW4o JzUgLSBzZXQgc3RhdGUgT04nKSkNCj4gKwlwcmludChzZXRfY3lhbignNiAtIGJhY2sgdG8gbWFp biBtZW51JykpDQo+ICsJcHJpbnQoc2V0X2N5YW4oJzcgLSBleGl0JykpDQo+ICsNCj4gK2RlZiBz ZXRfdmFsdWUoc3RyKToNCj4gKw0KPiArCWlmIGxlbihzdHIpICE9IDQ6DQo+ICsJCXByaW50KHNl dF9lcnJvcignRXhwZWN0ZWQgNCBkaWdpdHMnKSkNCj4gKwkJcmV0dXJuIC0xDQo+ICsNCj4gKwl0 cnk6DQo+ICsJCXZhbHVlID0gaW50KHN0ciwgMTYpDQo+ICsJZXhjZXB0IFZhbHVlRXJyb3I6DQo+ ICsJCXByaW50KHNldF9lcnJvcignTm90IGEgdmFsaWQgaGV4YWRlY2ltYWwgbnVtYmVyJykpDQo+ ICsJCXJldHVybiAtMQ0KPiArDQo+ICsJcmV0dXJuIHZhbHVlDQo+ICsNCj4gKyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIw0KPiArIyBNYWluIGVudHJ5DQo+ICsjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMNCj4gK2RlZiBtYWluKCk6DQo+ICsNCj4gKwlEQnVzR01haW5Mb29wKHNldF9hc19kZWZhdWx0 PVRydWUpDQo+ICsNCj4gKwlnbG9iYWwgYnVzDQo+ICsJYnVzID0gZGJ1cy5TeXN0ZW1CdXMoKQ0K PiArCWdsb2JhbCBtYWlubG9vcA0KPiArCWdsb2JhbCBhcHANCj4gKwlnbG9iYWwgbWVzaF9uZXQN Cj4gKw0KPiArCWlmIGxlbihzeXMuYXJndikgPiAxIDoNCj4gKwkJc2V0X3Rva2VuKHN5cy5hcmd2 WzFdKQ0KPiArDQo+ICsJbWVzaF9uZXQgPSBkYnVzLkludGVyZmFjZShidXMuZ2V0X29iamVjdChN RVNIX1NFUlZJQ0VfTkFNRSwNCj4gKwkJCQkJCSIvb3JnL2JsdWV6L21lc2giKSwNCj4gKwkJCQkJ CU1FU0hfTkVUV09SS19JRkFDRSkNCj4gKwltZXNoX25ldC5jb25uZWN0X3RvX3NpZ25hbCgnSW50 ZXJmYWNlc1JlbW92ZWQnLCBpbnRlcmZhY2VzX3JlbW92ZWRfY2IpDQo+ICsNCj4gKwlhcHAgPSBB cHBsaWNhdGlvbihidXMpDQo+ICsNCj4gKwkjIFByb3Zpc2lvbmluZyBhZ2VudA0KPiArCWlmIGFn ZW50ICE9IE5vbmU6DQo+ICsJCWFwcC5zZXRfYWdlbnQoYWdlbnQuQWdlbnQoYnVzKSkNCj4gKw0K PiArCWZpcnN0X2VsZSA9IEVsZW1lbnQoYnVzLCAweDAwKQ0KPiArCXNlY29uZF9lbGUgPSBFbGVt ZW50KGJ1cywgMHgwMSkNCj4gKw0KPiArCXByaW50KHNldF95ZWxsb3coJ1JlZ2lzdGVyIE9uT2Zm IFNlcnZlciBtb2RlbCBvbiBlbGVtZW50IDAnKSkNCj4gKwlmaXJzdF9lbGUuYWRkX21vZGVsKE9u T2ZmU2VydmVyKDB4MTAwMCkpDQo+ICsNCj4gKwlwcmludChzZXRfeWVsbG93KCdSZWdpc3RlciBP bk9mZiBDbGllbnQgbW9kZWwgb24gZWxlbWVudCAxJykpDQo+ICsJc2Vjb25kX2VsZS5hZGRfbW9k ZWwoT25PZmZDbGllbnQoMHgxMDAxKSkNCj4gKwlhcHAuYWRkX2VsZW1lbnQoZmlyc3RfZWxlKQ0K PiArCWFwcC5hZGRfZWxlbWVudChzZWNvbmRfZWxlKQ0KPiArDQo+ICsJbWFpbmxvb3AgPSBHTGli Lk1haW5Mb29wKCkNCj4gKw0KPiArCW1haW5fbWVudSgpDQo+ICsJZXZlbnRfY2F0Y2hlciA9IE1l bnVIYW5kbGVyKHByb2Nlc3NfaW5wdXQpOw0KPiArCW1haW5sb29wLnJ1bigpDQo+ICsNCj4gK2lm IF9fbmFtZV9fID09ICdfX21haW5fXyc6DQo+ICsJbWFpbigp