From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id CCA611FF17C for ; Wed, 20 Aug 2025 14:42:39 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 040CEA8E2; Wed, 20 Aug 2025 14:44:26 +0200 (CEST) From: Lukas Wagner To: pdm-devel@lists.proxmox.com Date: Wed, 20 Aug 2025 14:43:23 +0200 Message-ID: <20250820124329.220124-2-l.wagner@proxmox.com> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250820124329.220124-1-l.wagner@proxmox.com> References: <20250820124329.220124-1-l.wagner@proxmox.com> MIME-Version: 1.0 X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1755693780184 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.023 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pdm-devel] [PATCH proxmox-datacenter-manager v7 1/7] remote tasks: implement improved cache for remote tasks X-BeenThere: pdm-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Datacenter Manager development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Proxmox Datacenter Manager development discussion Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: pdm-devel-bounces@lists.proxmox.com Sender: "pdm-devel" VGhpcyBjb21taXQgYWRkcyBhIG5ldyBpbXBsZW1lbnRhdGlvbiBmb3IgYSBjYWNoZSBmb3IgcmVt b3RlIHRhc2tzLCBvbmUKdGhhdCBzaG91bGQgaW1wcm92ZSBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJp c3RpY3MgaW4gZm9yIHByZXR0eSBtdWNoIGFsbAp1c2UgY2FzZXMuCgpJbiBnZW5lcmFsIHN0b3Jh Z2Ugd29ya3MgcHJldHR5IHNpbWlsYXIgdG8gdGhlIHRhc2sgYXJjaGl2ZSB3ZSBhbHJlYWR5Cmhh dmUgZm9yIChsb2NhbCkgUERNIHRhc2tzLgoKcm9vdEBwZG0tZGV2Oi92YXIvY2FjaGUvcHJveG1v eC1kYXRhY2VudGVyLW1hbmFnZXIvcmVtb3RlLXRhc2tzIyBscyAtbAp0b3RhbCA0MAotcnctci0t ci0tIDEgd3d3LWRhdGEgd3d3LWRhdGEgICAgIDAgTWFyIDEzIDEzOjE4IGFjdGl2ZQotcnctci0t ci0tIDEgd3d3LWRhdGEgd3d3LWRhdGEgIDE2NzYgTWFyIDExIDE0OjUxIGFyY2hpdmUuMTc0MTM1 NTQ2Mi56c3QKLXJ3LXItLXItLSAxIHd3dy1kYXRhIHd3dy1kYXRhICAgICAwIE1hciAxMSAxNDo1 MSBhcmNoaXZlLjE3NDE0NDE4NjIuenN0Ci1ydy1yLS1yLS0gMSB3d3ctZGF0YSB3d3ctZGF0YSAg MjUzOCBNYXIgMTEgMTQ6NTEgYXJjaGl2ZS4xNzQxNTI4MjYyLnpzdAotcnctci0tci0tIDEgd3d3 LWRhdGEgd3d3LWRhdGEgIDg0MjggTWFyIDExIDE1OjA3IGFyY2hpdmUuMTc0MTYxNDY2Mi56c3QK LXJ3LXItLXItLSAxIHd3dy1kYXRhIHd3dy1kYXRhIDExNzQwIE1hciAxMyAxMDoxOCBhcmNoaXZl LjE3NDE3MDEwNjIKLXJ3LXItLXItLSAxIHd3dy1kYXRhIHd3dy1kYXRhICAzMzY0IE1hciAxMyAx MzoxOCBhcmNoaXZlLjE3NDE3ODgyNzAKLXJ3LXItLXItLSAxIHd3dy1kYXRhIHd3dy1kYXRhICAg ICAwIE1hciAxMyAxMzoxOCBqb3VybmFsCi1ydy1yLS1yLS0gMSB3d3ctZGF0YSB3d3ctZGF0YSAg IDI4NyBNYXIgMTMgMTM6MTggc3RhdGUKClRhc2tzIGFyZSBzdG9yZWQgaW4gdGhlICdhY3RpdmUn IGFuZCBtdWx0aXBsZSAnYXJjaGl2ZScgZmlsZXMuIFJ1bm5pbmcKdGFza3MgYXJlIHBsYWNlZCBp bnRvIHRoZSAnYWN0aXZlJyBmaWxlLCB0YXNrcyB0aGF0IGFyZSBmaW5pc2hlZCBhcmUKcGVyc2lz dGVkIGludG8gb25lIG9mIHRoZSBhcmNoaXZlIGZpbGVzLiBUaGUgYXJjaGl2ZSBmaWxlcyBhcmUg c3VmZml4ZWQKd2l0aCBhIFVOSVggdGltZXN0YW1wIHdoaWNoIHNlcnZlcyBhcyBhIGxvd2VyLWJv dW5kIGZvciBzdGFydCB0aW1lcyBmb3IKdGFza3Mgc3RvcmVkIGluIHRoaXMgZmlsZS4gRW5jb2Rp bmcgdGhpcyBsb3dlci1ib3VuZCBpbiB0aGUgZmlsZSBuYW1lCmluc3RlYWQgb2YgdXNpbmcgYSBt b3JlIHRyYWRpdGlvbmFsIGluY3JlYXNpbmcgZmlsZSBpbmRleCAoLjEsIC4yLCAuMykKZ2l2ZXMg dXMgdGhlIGJlbmVmaXQgdGhhdCB3ZSBjYW4gZGVjaWRlIGluIHdoaWNoIGZpbGUgYSBuZXdseSBh cnJpdmVkCnRhc2tzIGJlbG9uZ3MgZnJvbSBhIHNpbmdsZSByZWFkZGlyIGNhbGwsIHdpdGhvdXQg ZXZlbiByZWFkaW5nIHRoZSBmaWxlCml0c2VsZi4KCk9sZGVyIGFyY2hpdmUgZmlsZXMgYXJlIGFk ZGl0aW9uYWxseSBjb21wcmVzc2VkIHVzaW5nIHpzdGQuCgpUaGUgc2l6ZSBvZiB0aGUgZW50aXJl IGFyY2hpdmUgY2FuIGJlIGNvbnRyb2xsZWQgYnkgZG9pbmcgZmlsZQoncm90YXRpb24nLCB3aGVy ZSB0aGUgYXJjaGl2ZSBmaWxlIHdpdGggdGhlIG9sZGVzdCB0aW1lc3RhbXAgaXMgZGVsZXRlZAph bmQgYSBuZXcgZmlsZSB3aXRoIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBpcyBhZGRlZC4gSWYgJ3Jv dGF0aW9uJwpoYXBwZW5zIGF0IGZpeGVkIGludGVydmFscyAoZS5nLiBvbmNlIGRhaWx5KSwgdGhp cyBnaXZlcyB1cyBhCmNvbmZpZ3VyYWJsZSBudW1iZXIgb2YgZGF5cyBvZiB0YXNrIGhpc3Rvcnku IFRoZXJlIGlzIG5vIGRpcmVjdCBjYXAgZm9yCnRoZSB0b3RhbCBudW1iZXIgb2YgdGFza3MsIGJ1 dCB0aGlzIGNvdWxkIGJlIGVhc2lseSBhZGRlZCBieSBjaGVja2luZwp0aGUgc2l6ZSBvZiB0aGUg bW9zdCByZWNlbnQgYXJjaGl2ZSBmaWxlIGFuZCBieSByb3RhdGluZyBlYXJseSBpZiBhCnRocmVz aG9sZCBpcyBleGNlZWRlZC4KClRoZSBmb3JtYXQgaW5zaWRlIHRoZSBmaWxlcyBpcyBhbHNvIHNp bWlsYXIgdG8gdGhlIGxvY2FsIHRhc2sgYXJjaGl2ZSwKd2l0aCBvbmUgdGFzayBjb3JyZXNwb25k aW5nIHRvIG9uZSBsaW5lIGluIHRoZSBmaWxlLiBPbmUga2V5IGRpZmZlcmVuY2UKaXMgdGhhdCBo ZXJlIGVhY2ggbGluZSBpcyBhIEpTT04gb2JqZWN0LCB0aGF0IGlzIHRvIG1ha2UgaXQgZWFzaWVy IHRvCmFkZCBhZGRpdGlvbmFsIGRhdGEgbGF0ZXIsIGlmIG5lZWRlZC4gVGhlIEpTT04gb2JqZWN0 IGNvbnRhaW5zIHRoZSB0YXNrcwpVUElELCBzdGF0dXMsIGVuZHRpbWUgYW5kIHN0YXJ0dGltZSAo dGhlIHN0YXJ0dGltZSBpcyB0ZWNobmljYWxseSBhbHNvCmVuY29kZWQgaW4gdGhlIFVQSUQsIGJ1 dCBoYXZpbmcgaXQgYXMgYSBzZXBhcmF0ZSB2YWx1ZSBzaW1wbGlmaWVkIGEKY291cGxlIG9mIHRo aW5ncykgRWFjaCBmaWxlIGlzIHNvcnRlZCBieSB0aGUgdGFzaydzIHN0YXJ0IHRpbWUsIHRoZQp5 b3VuZ2VzdCB0YXNrIGNvbWluZyBmaXJzdC4KCk9uZSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIHRo aXMgdGFzayBjYWNoZSBhbmQgdGhlIGxvY2FsIHRhc2sgYXJjaGl2ZSBpcwp0aGF0IHdlIG5lZWQg dG8gaGFuZGxlIHRhc2tzIGNvbWluZyBpbiBvdXQtb2Ytb3JkZXIsIGUuZy4gaWYgcmVtb3Rlcwp3 ZXJlIG5vdCByZWFjaGFibGUgZm9yIGEgY2VydGFpbiB0aW1lLiBUbyBtYWludGFpbiB0aGUgb3Jk ZXJpbmcgaW4gdGhlCmZpbGUsIHdlIGhhdmUgdG8gbWVyZ2UgdGhlIG5ld2x5IGFycml2ZWQgdGFz a3MgaW50byB0aGUgZXhpc3RpbmcgdGFzawpmaWxlLiBUaGlzIHdhcyBpbXBsZW1lbnRlZCBpbiBh IHdheSB0aGF0IGF2b2lkcyByZWFkaW5nIHRoZSBlbnRpcmUgZmlsZQppbnRvIG1lbW9yeSBhdCBv bmNlLCBleHBsb2l0aW5nIHRoZSBmYWN0IHRoYXQgdGhlIGNvbnRlbnRzIG9mIHRoZQpleGlzdGlu ZyBmaWxlIGFyZSBhbHJlYWR5IHNvcnRlZC4gVGhpcyBhbGxvd3MgdG8gZG8gYSB6aXBwZXIvbWVy Z2Utc29ydApsaWtlIGFwcHJvYWNoIChzZWUgTWVyZ2VUYXNrSXRlcmF0b3IgZm9yIGRldGFpbHMp LiBUaGUgZXhpc3RpbmcgZmlsZSBpcwpvbmx5IHJlYWQgbGluZS1ieS1saW5lIGFuZCBmaW5hbGx5 IHJlcGxhY2VkIGF0b21pY2FsbHkuCgpTaW5jZSB3ZSBhbHdheXMgbmVlZCB0byByZXdyaXRlIHRo ZSBlbnRpcmUgYXJjaGl2ZSBmaWxlLCBldmVuIGlmIHRoZXJlCmlzIG9ubHkgYSBzaW5nbGUgbmV3 IHRhc2sgYWRkZWQsIHRoZXJlIGlzIGFsc28gYSBqb3VybmFsL1dBTCBmaWxlLgpXaGVuIGFkZGlu ZyBuZXcgdGFza3MsIHRoZXkgd2lsbCBiZSBmaXJzdCBhcHBlbmRlZCB0byB0aGUgam91cm5hbCBm aWxlCmFuZCB0aGVuIGxhdGVyIGFwcGxpZWQgdG8gdGhlIGFjdHVhbCBhcmNoaXZlIGZpbGVzLiBU aGUgam91cm5hbCBpcwphcHBsaWVkIGFmdGVyIGEgY2VydGFpbiB0aW1lIG9yIGlmIHRoZSBqb3Vy bmFsIGZpbGUgaXRzZWxmIGdyb3dzIHRvbwpsYXJnZS4KClRoZSBjYWNoZSBhbHNvIGhhcyBhIHNl cGFyYXRlIHN0YXRlIGZpbGUsIGNvbnRhaW5pbmcgYWRkaXRpb25hbAppbmZvcm1hdGlvbiwgZS5n LiBjdXQtb2ZmIHRpbWVzdGFtcHMgZm9yIHRoZSBwb2xsaW5nIHRhc2suIFNvbWUgb2YgdGhlCmRh dGEgaW4gdGhlIHN0YXRlZmlsZSBpcyB0ZWNobmljYWxseSBhbHNvIGNvbnRhaW5lZCBpbiB0aGUg YXJjaGl2ZQpmaWxlcywgYnV0IHJlYWRpbmcgdGhlIHN0YXRlIGZpbGUgaXMgbXVjaCBmYXN0ZXIu CgpUaGlzIGNvbW1pdCBhbHNvIGFkZHMgYW4gZWxhYm9yYXRlIHN1aXRlIG9mIHVuaXQgdGVzdHMg Zm9yIHRoaXMgbmV3CmNhY2hlLiBXaGlsZSBhZGRpbmcgc29tZSBhZGRpdGlvbmFsIHdvcmsgdXAg ZnJvbnQsIHRoZXkgcGFpZCBvZmYKdGhlbXNlbHZlcyBkdXJpbmcgZGV2ZWxvcG1lbnQgcXVpdGUg cXVpY2tseSwgc2luY2UgdGhlIG92ZXJhbGwgYXBwcm9hY2gKZm9yIHRoZSBjYWNoZSBjaGFuZ2Vk IGEgY291cGxlIG9mIHRpbWVzLiBUaGUgdGVzdCBzdWl0ZSBnYXZlIG1lCmNvbmZpZGVuY2UgdGhh dCB0aGUgZGVzaWduIGNoYW5nZXMgZGlkbid0IHNjcmV3IGFueXRoaW5nIHVwLCBjYXRjaGluZyBh CmNvdXBsZSBvZiBidWdzIGluIHRoZSBwcm9jZXNzLgoKRmluYWxseSwgc29tZSBjb25jcmV0ZSBu dW1iZXJzIGFib3V0IHRoZSBwZXJmb3JtYW5jZSBpbXByb3ZtZW50cy4KQmVuY2htYXJraW5nIHdh cyBkb25lIHVzaW5nIHRoZSAnZmFrZS1yZW1vdGUnIGZlYXR1cmUuIFRoZXJlIHdlcmUgMTAwCnJl bW90ZXMsIDEwIFBWRSBub2RlcyBwZXIgcmVtb3RlLiBUaGUgdGFzayBjYWNoZSBjb250YWluZWQK YWJvdXQgMS41IG1pbGxpb24gdGFza3MuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBiZWZvcmUgICAgICAgICBhZnRlcgpsaXN0IG9mIGFjdGl2ZSB0YXNrcyAo Kik6ICAgICAgICAgICAgICAgICAgICAgfjEuM3MgICAgICAgICB+MzAwwrVzCmxpc3Qgb2YgNTAw IHRhc2tzLCBvZmZzZXQgMCAoKiopOiAgICAgICAgICAgICB+MS4zcyAgICAgICAgIH4xLjVtcwps aXN0IG9mIDUwMCB0YXNrcywgb2Zmc2V0IDEgbWlsbGlvbiAoKioqKTogICAgfjEuM3MgICAgICAg ICB+MjAwbXMKbGlzdCBvZiA1MDAgdGFza3MsIG9mZnNldCAwLAogICAgMjAwMCB0YXNrcyBpbiBq b3VybmFsICgqKioqKTogICAgICAgICAgICAgICAgICAgICAgICAgICB+NC41bXMKU2l6ZSBvbiBk aXNrOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH41MDBNQiAgICAgICAgfjQwTUIK CigqKTogIFJlcXVlc3RlZCBieSB0aGUgVUkgZXZlcnkgM3MKKCoqKTogUmVxdWVzdGVkIGJ5IHRo ZSBVSSB3aGVuIHZpc2l0aW5nIFJlbW90ZXMgPiBUYXNrcwooKioqKTogRS5nLiB3aGVuIHNjcm9s bGluZyB0b3dhcmRzIHRoZSBib3R0b20gb2YgJ1JlbW90ZXMgPiBUYXNrcycKKCoqKiopOiBlLmcu IHdoZW4gdGhlIGpvdXJuYWwgaGFzIG5vdCBiZWVuIGFwcGxpZWQgZm9yIGEgd2hpbGUuIFJlYWRp bmcgdGFza3MKICAgICAgIGZyb20gdGhlIGpvdXJuYWwgaXMgYSBiaXQgbGVzcyBlZmZpY2llbnQg dGhhbiBmcm9tIHRoZSB0YXNrIGFyY2hpdmUsIHNpbmNlCiAgICAgICB3ZSBoYXZlIHRvIGZ1bGx5 IGxvYWQgaXQgaW50byBtZW1vcnkgc28gdGhhdCB3ZSBjYW4gc29ydCB0aGUgdGFza3MgYW5kCiAg ICAgICBhbHNvICByZW1vdmUgcG90ZW50aWFsIGR1cGxpY2F0ZXMKCkluIHRoZSBvbGQgaW1wbGVt ZW50YXRpb24sIHRoZSBhcmNoaXZlIGZpbGUgd2FzICphbHdheXMqIGZ1bGx5CmRlc2VyaWFsaXpl ZCBhbmQgbG9hZGVkIGludG8gUkFNLCB0aGlzIGlzIHRoZSByZWFzb24gd2h5IHRoZSB0aW1lIG5l ZWRlZAppcyBwcmV0dHkgaWRlbnRpYWwgZm9yIGFsbCBzY2VuYXJpb3MuIFRoZSBuZXcgaW1wbGVt ZW50YXRpb24gcmVhZHMgdGhlCmFyY2hpdmUgZmlsZXMgb25seSBsaW5lIGJ5IGxpbmUsIGFuZCBv bmx5IDUwMCB0YXNrcyB3ZXJlIGxvYWRlZCBpbnRvIFJBTQphdCB0aGUgc2FtZSB0aW1lLiBUaGUg aGlnaGVyIHRoZSBvZmZzZXQsIHRoZSBtb3JlIGFyY2hpdmUgbGluZXMvZmlsZXMgd2UKaGF2ZSB0 byBzY2FuLCB3aGljaCBpbmNyZWFzZXMgdGhlIHRpbWUgbmVlZGVkIHRvIGFjY2VzcyB0aGUgZGF0 YS4gVGhlCnRhc2tzIGFyZSBzb3J0ZWQgZGVzY2VuZGluZyBieSBzdGFydHRpbWUsIGFzIGEgcmVz dWx0IHRoZSByZXF1ZXN0cyBnZXQKc2xvd2VyIHRoZSBmdXJ0aGVyIHlvdSBnbyBiYWNrIGluIGhp c3RvcnkuCgpTaWduZWQtb2ZmLWJ5OiBMdWthcyBXYWduZXIgPGwud2FnbmVyQHByb3htb3guY29t PgpSZXZpZXdlZC1ieTogRG9taW5payBDc2FwYWsgPGQuY3NhcGFrQHByb3htb3guY29tPgotLS0K Ck5vdGVzOgogICAgQ2hhbmdlcyBzaW5jZSB2NjoKICAgICAgLSBSZW1vdmUgc3VwZXJmbG91cyBa U1REX0VYVEVOU0lPTiBjb25zdAogICAgICAtIFJlZmFjdG9yIGNvbW1vbiBjb2RlIGludG8gc3Rh cnRfbmV3X2ZpbGUKICAgICAgLSBNYWtlIGNvbXBhcmVfdGFza3NfcmV2ZXJzZSAobWF5YmUpIChz bGlnaHRseSkgbW9yZSBlZmZpY2llbnQgYnkKICAgICAgbm90IHVzaW5nIC5yZXZlcnNlLCBidXQg anVzdCBzd2l0Y2hpbmcgYm90aCBwYXJhbXMKICAgIAogICAgQ2hhbmdlcyBzaW5jZSB2NToKICAg ICAgLSBDaGFuZ2UgZm9ybWF0IG9mIHN0YXRlIGZpbGUsIGluY2x1ZGUgYSBwZXItbm9kZSBjdXRv ZmYgdGltZQogICAgICAtIENoYW5nZSBsb2NraW5nIGFwcHJvYWNoLCB1c2luZyBzZXBhcmF0ZSB0 eXBlcyB0byByZXByZXNlbnQKICAgICAgICBhIGxvY2tlZCBjYWNoZWQgKFJlYWRhYmxlVGFza0Nh Y2hlLCBXcml0YWJsZVRhc2tDYWNoZSkKICAgICAgICAoYXMgc3VnZ2VzdGVkIGJ5IFdvbGZnYW5n IGFuZCBEb21pbmlrIGluZGVwZW5kZW50bHkpCiAgICAgIC0gUmVuYW1lICdhZGRfdGFza3MnIHRv ICd1cGRhdGUnLCBzaW5jZSBpdCBhbHNvIGRyb3BzCiAgICAgICAgdHJhY2tlZCB0YXNrcyBmcm9t IHRoZSBzdGF0ZSBmaWxlLCBtb3ZlcyB0YXNrcyBmcm9tCiAgICAgICAgdGhlIGFjdGl2ZSBmaWxl IHRvIHRoZSBhcmNoaXZlLCBldGMuCiAgICAKICAgICAgLSBJbnN0ZWFkIG9mIGFkZGluZyBuZXcg dGFza3MgZGlyZWN0bHkgdG8gdGhlIGFyY2hpdmUsIHRoZXkKICAgICAgICBhcmUgYWRkZWQgdG8g YW4gYXBwZW5kLW9ubHkgam91cm5hbCBhdCBmaXJzdC4gVGhpcyBhbGxvd3MgdXMgdG8KICAgICAg ICBiZXR0ZXIgcmVjb3ZlciBmcm9tIGEgY3Jhc2gvc2h1dGRvd24gd2hpbGUgd2UgYXJlIGFkZGlu ZyB0YXNrcywKICAgICAgICBhcyB3ZWxsIGFzIHJlZHVjZSBkaXNrIHdyaXRlcy4gVGhlIGxhdHRl ciBpcyBkdWUgdG8gdGhlIGZhY3QgdGhhdAogICAgICAgIHdlIGhhdmUgdG8gcmV3cml0ZSB0aGUg YXJjaGl2ZSBmaWxlIGluIGl0cyBlbnRpcmV0eSwgZXZlbiBpZgogICAgICAgIG9ubHkgYSBzaW5n bGUgdGFzayBpcyBhZGRlZC4KICAgIAogICAgICAtIFVzZSB6c3RkIGNvbXByZXNzaW9uIGZvciBv bGRlciBhcmNoaXZlIGZpbGVzLCBncmVhdGx5IHJlZHVjaW5nCiAgICAgICAgc3BhY2UgY29uc3Vt cHRpb24KICAgIAogICAgICAtIFNvbWUgZ2VuZXJhbCByZWZhY3RvcmluZyB0byBtYWtlIHRoZSBj b2RlIGEgYml0IG5pY2VyCiAgICAKICAgIENoYW5nZXMgc2luY2UgdjQ6CiAgICAgIC0gUmViYXNl ZAogICAgCiAgICBDaGFuZ2VzIHNpbmNlIHYzOgogICAgICAtIEluY2x1ZGVkIGJlbmNobWFyayBy ZXN1bHRzIGluIHRoZSBjb21taXQgbWVzc2FnZQogICAgICAtIERyb3AgYHB1YmAgZm9yIFRhc2tD YWNoZTo6d3JpdGVfc3RhdGUKICAgIAogICAgQ2hhbmdlcyBzaW5jZSB2MjoKICAgICAgLSBJbmNv cnBvcmF0ZSBmZWVkYmFjayBmcm9tIFdvbGZhbmcgKHRoeCEpCiAgICAgICAgIC0gZWxpbWluYXRl IG9uZSAuY2xvbmUoKQogICAgICAgICAtIGdldF90YXNrc193aXRoX2xvY2s6IGRpcmVjdGx5IGNy ZWF0ZSBpdGVyYXRvciBvdmVyIFBhdGhCdWYKICAgICAgICAgICBpbnN0ZWFkIG9mIGZpcnN0IGNy ZWF0aW5nIEFyY2hpdmVGaWxlIHZlYyBhbmQgdGhlIG1hcHBpbmcKICAgICAgICAgLSBGaXhlZCBU T0NUT1UgcmFjZSBjb25kaXRpb24gKGNoZWNrZWQgUGF0aDo6ZXhpc3RzIGluc3RlYWQgb2YKICAg ICAgICAgICB0cnlpbmcgdGhlIGFjdHVhbCBvcGVyYXRpb24gYW5kIHJlYWN0aW5nIHRvIEVycm9y S2luZDo6Tm90Rm91bmQpCiAgICAgICAgIC0gaGFuZGxlIGVycm9yIHdoZW4gcmVwbGFjaW5nICdh Y3RpdmUnIGZpbGUKICAgICAgICAgLSB1bmxpbmsgdGVtcCBmaWxlIHdoZW4gcmVwbGFjaW5nIHRo ZSBhcmNoaXZlIGZpbGUgZGlkIG5vdCB3b3JrCiAgICAgICAgIC0gYXZvaWQgVVRGOCBkZWNvZGlu ZyB3aGVyZSBub3QgcmVhbGx5IG5lY2Vzc2FyeQogICAgICAtIEFkZGVkIGEgY291cGxlIG9mIC5j b250ZXh0KCkvLndpdGhfY29udGV4dCgpIGZvciBiZXR0ZXIgZXJyb3IKICAgICAgICBtZXNzYWdl cwogICAgICAtIEV4dHJhY3RlZCB0aGUgZmlsZSBuYW1lcyBpbnRvIGNvbnN0cwogICAgICAtIEZp eGVkIHNvbWUgY2xpcHB5IGlzc3VlcyAoLmNsb25lKCkgZm9yIENyZWF0ZU9wdGlvbnMgLSB3aGVu CiAgICAgICAgdGhpcyBzZXJpZXMgd2FzIHdyaXR0ZW4sIENyZWF0ZU9wdGlvbnMgd2VyZSBub3Qg Q29weSB5ZXQpCgogQ2FyZ28udG9tbCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIDIg Ky0KIHNlcnZlci9DYXJnby50b21sICAgICAgICAgICAgICAgICAgICAgfCAgICAxICsKIHNlcnZl ci9zcmMvcmVtb3RlX3Rhc2tzL21vZC5ycyAgICAgICAgfCAgICAyICsKIHNlcnZlci9zcmMvcmVt b3RlX3Rhc2tzL3Rhc2tfY2FjaGUucnMgfCAxNDgzICsrKysrKysrKysrKysrKysrKysrKysrKysK IDQgZmlsZXMgY2hhbmdlZCwgMTQ4NyBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9uKC0pCiBjcmVh dGUgbW9kZSAxMDA2NDQgc2VydmVyL3NyYy9yZW1vdGVfdGFza3MvdGFza19jYWNoZS5ycwoKZGlm ZiAtLWdpdCBhL0NhcmdvLnRvbWwgYi9DYXJnby50b21sCmluZGV4IDY1OGM1M2E3Li4wOGI5Mzcz NyAxMDA2NDQKLS0tIGEvQ2FyZ28udG9tbAorKysgYi9DYXJnby50b21sCkBAIC0xMjgsNyArMTI4 LDcgQEAgdXJsID0gIjIuMSIKIHdhbGtkaXIgPSAiMiIKIHdlYmF1dGhuLXJzLWNvcmUgPSAiMC41 IgogeGRnID0gIjIuMiIKLXpzdGQgPSB7IHZlcnNpb24gPSAiMC4xMiIsIGZlYXR1cmVzID0gWyAi YmluZGdlbiIgXSB9Cit6c3RkID0geyB2ZXJzaW9uID0gIjAuMTMiIH0KIAogIyBMb2NhbCBwYXRo IG92ZXJyaWRlcwogIyBOT1RFOiBZb3UgbXVzdCBydW4gYGNhcmdvIHVwZGF0ZWAgYWZ0ZXIgY2hh bmdpbmcgdGhpcyBmb3IgaXQgdG8gdGFrZSBlZmZlY3QhCmRpZmYgLS1naXQgYS9zZXJ2ZXIvQ2Fy Z28udG9tbCBiL3NlcnZlci9DYXJnby50b21sCmluZGV4IDJkMWZhNWQyLi4yNGEyZTQwYyAxMDA2 NDQKLS0tIGEvc2VydmVyL0NhcmdvLnRvbWwKKysrIGIvc2VydmVyL0NhcmdvLnRvbWwKQEAgLTMy LDYgKzMyLDcgQEAgdG9raW8gPSB7IHdvcmtzcGFjZSA9IHRydWUsIGZlYXR1cmVzID0gWyAiZnMi LCAiaW8tdXRpbCIsICJpby1zdGQiLCAibWFjcm9zIiwgIm4KIHRva2lvLXN0cmVhbS53b3Jrc3Bh Y2UgPSB0cnVlCiB0cmFjaW5nLndvcmtzcGFjZSA9IHRydWUKIHVybC53b3Jrc3BhY2UgPSB0cnVl Cit6c3RkLndvcmtzcGFjZSA9IHRydWUKIAogcHJveG1veC1hY2Nlc3MtY29udHJvbCA9IHsgd29y a3NwYWNlID0gdHJ1ZSwgZmVhdHVyZXMgPSBbICJpbXBsIiBdIH0KIHByb3htb3gtYXN5bmMud29y a3NwYWNlID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvc2VydmVyL3NyYy9yZW1vdGVfdGFza3MvbW9kLnJz IGIvc2VydmVyL3NyYy9yZW1vdGVfdGFza3MvbW9kLnJzCmluZGV4IDIzNGZmYTc2Li43YzhlMzFl ZiAxMDA2NDQKLS0tIGEvc2VydmVyL3NyYy9yZW1vdGVfdGFza3MvbW9kLnJzCisrKyBiL3NlcnZl ci9zcmMvcmVtb3RlX3Rhc2tzL21vZC5ycwpAQCAtMTgsNiArMTgsOCBAQCB1c2UgdG9raW86OnRh c2s6OkpvaW5IYW5kbGU7CiAKIHVzZSBjcmF0ZTo6e2FwaTo6cHZlLCB0YXNrX3V0aWxzfTsKIAor bW9kIHRhc2tfY2FjaGU7CisKIC8vLyBHZXQgdGFza3MgZm9yIGFsbCByZW1vdGVzCiAvLyBGSVhN RTogZmlsdGVyIGZvciBwcml2aWxlZ2VzCiBwdWIgYXN5bmMgZm4gZ2V0X3Rhc2tzKG1heF9hZ2U6 IGk2NCwgZmlsdGVyczogVGFza0ZpbHRlcnMpIC0+IFJlc3VsdDxWZWM8VGFza0xpc3RJdGVtPiwg RXJyb3I+IHsKZGlmZiAtLWdpdCBhL3NlcnZlci9zcmMvcmVtb3RlX3Rhc2tzL3Rhc2tfY2FjaGUu cnMgYi9zZXJ2ZXIvc3JjL3JlbW90ZV90YXNrcy90YXNrX2NhY2hlLnJzCm5ldyBmaWxlIG1vZGUg MTAwNjQ0CmluZGV4IDAwMDAwMDAwLi45ZTZhNjVjZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZl ci9zcmMvcmVtb3RlX3Rhc2tzL3Rhc2tfY2FjaGUucnMKQEAgLTAsMCArMSwxNDgzIEBACisvLyEg VGFzayBjYWNoZSBpbXBsZW1lbnRhdGlvbiwgYmFzZWQgb24gcm90YXRpbmcgZmlsZXMuCit1c2Ug c3RkOjp7CisgICAgY21wOjpPcmRlcmluZywKKyAgICBjb2xsZWN0aW9uczo6e0hhc2hNYXAsIEhh c2hTZXR9LAorICAgIGZzOjp7RmlsZSwgT3Blbk9wdGlvbnN9LAorICAgIGlvOjp7QnVmUmVhZCwg QnVmUmVhZGVyLCBCdWZXcml0ZXIsIEVycm9yS2luZCwgTGluZXMsIFdyaXRlfSwKKyAgICBpdGVy OjpQZWVrYWJsZSwKKyAgICBvczo6dW5peDo6ZnM6Ok1ldGFkYXRhRXh0LAorICAgIHBhdGg6OntQ YXRoLCBQYXRoQnVmfSwKKyAgICB0aW1lOjp7RHVyYXRpb24sIEluc3RhbnR9LAorfTsKKwordXNl IGFueWhvdzo6e0NvbnRleHQsIEVycm9yfTsKK3VzZSBzZXJkZTo6e0Rlc2VyaWFsaXplLCBTZXJp YWxpemV9OworCit1c2UgcHJveG1veF9zeXM6OmZzOjpDcmVhdGVPcHRpb25zOworCit1c2UgcGRt X2FwaV90eXBlczo6UmVtb3RlVXBpZDsKK3VzZSBwdmVfYXBpX3R5cGVzOjpQdmVVcGlkOworCisv Ly8gRmlsZW5hbWUgZm9yIHRoZSBmaWxlIGNvbnRhaW5pbmcgcnVubmluZyB0YXNrcy4KK2NvbnN0 IEFDVElWRV9GSUxFTkFNRTogJnN0ciA9ICJhY3RpdmUiOworLy8vIEZpbGVuYW1lIHByZWZpeCBm b3IgYXJjaGl2ZSBmaWxlcy4KK2NvbnN0IEFSQ0hJVkVfRklMRU5BTUVfUFJFRklYOiAmc3RyID0g ImFyY2hpdmUuIjsKKy8vLyBGaWxlbmFtZSBmb3IgdGhlIHN0YXRlIGZpbGUuCitjb25zdCBTVEFU RV9GSUxFTkFNRTogJnN0ciA9ICJzdGF0ZSI7CisvLy8gRmlsZW5hbWUgb2YgdGhlIGFyY2hpdmUg bG9ja2ZpbGUuCitjb25zdCBMT0NLRklMRV9GSUxFTkFNRTogJnN0ciA9ICIubG9jayI7CisvLy8g V3JpdGUtYWhlYWQgbG9nLgorY29uc3QgV0FMX0ZJTEVOQU1FOiAmc3RyID0gImpvdXJuYWwiOwor CisvLy8gRmlsZSBuYW1lIGV4dGVuc2lvbiBmb3IgenN0ZCBjb21wcmVzc2VkIGFyY2hpdmUgZmls ZXMKK2NvbnN0IFpTVERfRVhURU5TSU9OX1dJVEhfRE9UOiAmc3RyID0gIi56c3QiOworCisvLy8g SXRlbSB3aGljaCBjYW4gYmUgcHV0IGludG8gdGhlIHRhc2sgY2FjaGUuCisjW2Rlcml2ZShDbG9u ZSwgRGVidWcsIFNlcmlhbGl6ZSwgRGVzZXJpYWxpemUsIEhhc2gsIFBhcnRpYWxFcSwgRXEpXQor I1tzZXJkZShyZW5hbWVfYWxsID0gImtlYmFiLWNhc2UiKV0KK3B1YiBzdHJ1Y3QgVGFza0NhY2hl SXRlbSB7CisgICAgLy8vIFRoZSB0YXNrJ3MgVVBJRAorICAgIHB1YiB1cGlkOiBSZW1vdGVVcGlk LAorICAgIC8vLyBUaGUgdGltZSBhdCB3aGljaCB0aGUgdGFzayB3YXMgc3RhcnRlZCAoc2Vjb25k cyBzaW5jZSB0aGUgVU5JWCBlcG9jaCkuCisgICAgLy8vIFRlY2huaWNhbGx5IHRoaXMgaXMgYWxz byBjb250YWluZWQgd2l0aGluIHRoZSBVUElELCBkdXBsaWNhdGluZyBpdCBoZXJlCisgICAgLy8v IGFsbG93cyB1cyB0byBkaXJlY3RseSBhY2Nlc3MgaXQgd2hlbiBzb3J0aW5nIGluIG5ldyB0YXNr cywgd2l0aG91dCBoYXZpbmcKKyAgICAvLy8gdG8gcGFyc2UgdGhlIFVQSUQuCisgICAgcHViIHN0 YXJ0dGltZTogaTY0LAorICAgICNbc2VyZGUoc2tpcF9zZXJpYWxpemluZ19pZiA9ICJPcHRpb246 OmlzX25vbmUiKV0KKyAgICAvLy8gVGhlIHRhc2sncyBzdGF0dXMuCisgICAgcHViIHN0YXR1czog T3B0aW9uPFN0cmluZz4sCisgICAgI1tzZXJkZShza2lwX3NlcmlhbGl6aW5nX2lmID0gIk9wdGlv bjo6aXNfbm9uZSIpXQorICAgIC8vLyBUaGUgdGFzaydzIGVuZHRpbWUgKHNlY29uZHMgc2luY2Ug dGhlIFVOSVggZXBvY2gpLgorICAgIHB1YiBlbmR0aW1lOiBPcHRpb248aTY0PiwKK30KKworI1tk ZXJpdmUoU2VyaWFsaXplLCBEZXNlcmlhbGl6ZSwgRGVmYXVsdCldCisjW3NlcmRlKHJlbmFtZV9h bGwgPSAia2ViYWItY2FzZSIpXQorLy8vIFBlciByZW1vdGUgc3RhdGUuCitzdHJ1Y3QgUmVtb3Rl U3RhdGUgeworICAgIC8vLyBQZXItbm9kZSBzdGF0ZSBmb3IgdGhpcyByZW1vdGUuCisgICAgbm9k ZV9zdGF0ZTogSGFzaE1hcDxTdHJpbmcsIE5vZGVTdGF0ZT4sCit9CisKKyNbZGVyaXZlKFNlcmlh bGl6ZSwgRGVzZXJpYWxpemUsIERlZmF1bHQpXQorI1tzZXJkZShyZW5hbWVfYWxsID0gImtlYmFi LWNhc2UiKV0KK3N0cnVjdCBOb2RlU3RhdGUgeworICAgIC8vLyBDdXRvZmYgdGltZXN0YW1wIGZv ciB0aGlzIG5vZGUgd2hlbiBmZXRjaGluZyBhcmNoaXZlZCB0YXNrcy4KKyAgICBjdXRvZmY6IGk2 NCwKK30KKworLy8vIFN0YXRlIG5lZWRlZCBmb3IgdGFzayBwb2xsaW5nLgorI1tkZXJpdmUoU2Vy aWFsaXplLCBEZXNlcmlhbGl6ZSwgRGVmYXVsdCldCisjW3NlcmRlKHJlbmFtZV9hbGwgPSAia2Vi YWItY2FzZSIpXQorcHViIHN0cnVjdCBTdGF0ZSB7CisgICAgLy8vIE1hcCBvZiByZW1vdGUgLT4g bW9zdCByZWNlbnQgdGFzayBzdGFydHRpbWUgKFVOSVggZXBvY2gpIGluIHRoZSBhcmNoaXZlLgor ICAgIC8vLyBUaGlzIGNhbiBiZSB1c2VkIGFzIGEgY3V0LW9mZiB3aGVuIHJlcXVlc3RpbmcgbmV3 IHRhc2sgZGF0YS4KKyAgICAjW3NlcmRlKGRlZmF1bHQpXQorICAgIHJlbW90ZV9zdGF0ZTogSGFz aE1hcDxTdHJpbmcsIFJlbW90ZVN0YXRlPiwKKyAgICAvLy8gVHJhY2tlZCB0YXNrcyB3aGljaCBh cmUgcG9sbGVkIGluIHNob3J0IGludGVydmFscy4KKyAgICAjW3NlcmRlKGRlZmF1bHQpXQorICAg IHRyYWNrZWRfdGFza3M6IEhhc2hTZXQ8UmVtb3RlVXBpZD4sCit9CisKK2ltcGwgU3RhdGUgewor ICAgIC8vLyBHZXQgdHJhY2tlZCB0YXNrcy4KKyAgICBwdWIgZm4gdHJhY2tlZF90YXNrcygmc2Vs ZikgLT4gaW1wbCBJdGVyYXRvcjxJdGVtID0gJlJlbW90ZVVwaWQ+IHsKKyAgICAgICAgc2VsZi50 cmFja2VkX3Rhc2tzLml0ZXIoKQorICAgIH0KKworICAgIC8vLyBHZXQgdGhlIGN1dG9mZiB0aW1l c3RhbXAgZm9yIGEgbm9kZSBvZiBhIHJlbW90ZS4KKyAgICBwdWIgZm4gY3V0b2ZmX3RpbWVzdGFt cCgmc2VsZiwgcmVtb3RlX2lkOiAmc3RyLCBub2RlOiAmc3RyKSAtPiBPcHRpb248aTY0PiB7Cisg ICAgICAgIHNlbGYucmVtb3RlX3N0YXRlCisgICAgICAgICAgICAuZ2V0KHJlbW90ZV9pZCkKKyAg ICAgICAgICAgIC5hbmRfdGhlbih8cmVtb3RlX3N0YXRlfCByZW1vdGVfc3RhdGUubm9kZV9zdGF0 ZS5nZXQobm9kZSkpCisgICAgICAgICAgICAubWFwKHxzdGF0ZXwgc3RhdGUuY3V0b2ZmKQorICAg IH0KKworICAgIC8vLyBBZGQgYSBuZXcgdHJhY2tlZCB0YXNrLgorICAgIGZuIGFkZF90cmFja2Vk X3Rhc2soJm11dCBzZWxmLCB1cGlkOiBSZW1vdGVVcGlkKSB7CisgICAgICAgIHNlbGYudHJhY2tl ZF90YXNrcy5pbnNlcnQodXBpZCk7CisgICAgfQorCisgICAgLy8vIFJlbW92ZSBhIHRyYWNrZWQg dGFzay4KKyAgICBmbiByZW1vdmVfdHJhY2tlZF90YXNrKCZtdXQgc2VsZiwgdXBpZDogJlJlbW90 ZVVwaWQpIHsKKyAgICAgICAgc2VsZi50cmFja2VkX3Rhc2tzLnJlbW92ZSh1cGlkKTsKKyAgICB9 CisKKyAgICAvLy8gVXBkYXRlIHRoZSBwZXItbm9kZSBjdXRvZmYgdGltZXN0YW1wIGlmIGl0IGlz IGhpZ2hlciB0aGFuIHRoZSBjdXJyZW50IG9uZS4KKyAgICBmbiB1cGRhdGVfY3V0b2ZmX3RpbWVz dGFtcCgmbXV0IHNlbGYsIHJlbW90ZV9pZDogJnN0ciwgbm9kZTogJnN0ciwgc3RhcnR0aW1lOiBp NjQpIHsKKyAgICAgICAgbWF0Y2ggc2VsZi5yZW1vdGVfc3RhdGUuZ2V0X211dChyZW1vdGVfaWQp IHsKKyAgICAgICAgICAgIFNvbWUocmVtb3RlX3N0YXRlKSA9PiBtYXRjaCByZW1vdGVfc3RhdGUu bm9kZV9zdGF0ZS5nZXRfbXV0KG5vZGUpIHsKKyAgICAgICAgICAgICAgICBTb21lKG5vZGVfc3Rh dGUpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgbm9kZV9zdGF0ZS5jdXRvZmYgPSBub2RlX3N0 YXRlLmN1dG9mZi5tYXgoc3RhcnR0aW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAg ICAgICAgTm9uZSA9PiB7CisgICAgICAgICAgICAgICAgICAgIHJlbW90ZV9zdGF0ZQorICAgICAg ICAgICAgICAgICAgICAgICAgLm5vZGVfc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC5p bnNlcnQobm9kZS50b19zdHJpbmcoKSwgTm9kZVN0YXRlIHsgY3V0b2ZmOiBzdGFydHRpbWUgfSk7 CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIE5vbmUgPT4g eworICAgICAgICAgICAgICAgIGxldCBub2RlX3N0YXRlID0KKyAgICAgICAgICAgICAgICAgICAg SGFzaE1hcDo6ZnJvbV9pdGVyKFsobm9kZS50b19zdHJpbmcoKSwgTm9kZVN0YXRlIHsgY3V0b2Zm OiBzdGFydHRpbWUgfSldKTsKKworICAgICAgICAgICAgICAgIHNlbGYucmVtb3RlX3N0YXRlCisg ICAgICAgICAgICAgICAgICAgIC5pbnNlcnQocmVtb3RlX2lkLnRvX3N0cmluZygpLCBSZW1vdGVT dGF0ZSB7IG5vZGVfc3RhdGUgfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9 CisKKy8vLyBDYWNoZSBmb3IgcmVtb3RlIHRhc2tzLgorI1tkZXJpdmUoQ2xvbmUpXQorcHViIHN0 cnVjdCBUYXNrQ2FjaGUgeworICAgIC8vLyBQYXRoIHdoZXJlIHRoZSBjYWNoZSdzIGZpbGVzIHNo b3VsZCBiZSBwbGFjZWQuCisgICAgYmFzZV9wYXRoOiBQYXRoQnVmLAorICAgIC8vLyBGaWxlIHBl cm1pc3Npb25zIGZvciB0aGUgY2FjaGUncyBmaWxlcy4KKyAgICBjcmVhdGVfb3B0aW9uczogQ3Jl YXRlT3B0aW9ucywKKworICAgIC8vLyBNYXhpbXVtIHNpemUgb2YgdGhlIGpvdXJuYWwuIElmIGl0 IGdyb3dzIGxhcmdlciB0aGFuIHNpemUgYWZ0ZXIKKyAgICAvLy8gdGFza3MgaGF2ZSBiZWVuIGFk ZGVkLCBpdCB3aWxsIGJlIGFwcGxpZWQgaW1tZWRpYXRlbHkuCisgICAgam91cm5hbF9tYXhfc2l6 ZTogdTY0LAorCisgICAgLy8vIE1heGltdW0gbnVtYmVyIG9mIGFyY2hpdmUgZmlsZXMuIElmIHRo ZSBhcmNoaXZlIGlzIHJvdGF0ZWQgYW5kIGBtYXhfZmlsZXNgIGlzIGV4Y2VlZGVkLCB0aGUKKyAg ICAvLy8gb2xkZXN0IGZpbGwgd2UgZHJvcHBlZAorICAgIG1heF9maWxlczogdTMyLAorCisgICAg Ly8vIE51bWJlciBvZiB1bmNvbXByZXNzZWQgYXJjaGl2ZSBmaWxlcyB0byBrZWVwLiBUaGVzZSB3 aWxsIGJlIHRoZSBtb3N0IHJlY2VudCBvbmVzLgorICAgIHVuY29tcHJlc3NlZF9maWxlczogdTMy LAorCisgICAgLy8vIFJvdGF0ZSBhcmNoaXZlIGZpbGUgaWYgaXQgaXMgb2xkZXIgdGhhbiB0aGlz IG51bWJlciBvZiBzZWNvbmRzLgorICAgIHJvdGF0ZV9hZnRlcjogdTY0LAorfQorCisvLy8gQSBb YFRhc2tDYWNoZWBdIGxvY2tlZCBmb3Igd3JpdGluZy4KK3B1YiBzdHJ1Y3QgV3JpdGFibGVUYXNr Q2FjaGUgeworICAgIGNhY2hlOiBUYXNrQ2FjaGUsCisgICAgbG9jazogVGFza0NhY2hlTG9jaywK K30KKworLy8vIEEgW2BUYXNrQ2FjaGVgXSBsb2NrZWQgZm9yIHJlYWRpbmcuCitwdWIgc3RydWN0 IFJlYWRhYmxlVGFza0NhY2hlIHsKKyAgICBjYWNoZTogVGFza0NhY2hlLAorICAgIGxvY2s6IFRh c2tDYWNoZUxvY2ssCit9CisKKy8vLyBMb2NrIGZvciB0aGUgY2FjaGUuCisjW2FsbG93KGRlYWRf Y29kZSldCitzdHJ1Y3QgVGFza0NhY2hlTG9jayhGaWxlKTsKKworLy8vIFdoaWNoIHRhc2tzIHRv IGZldGNoIGZyb20gdGhlIGFyY2hpdmUuCitwdWIgZW51bSBHZXRUYXNrcyB7CisgICAgLy8vIEdl dCBhbGwgdGFza3MsIGZpbmlzaGVkIGFuZCBydW5uaW5nLgorICAgIEFsbCwKKyAgICAvLy8gT25s eSBnZXQgcnVubmluZyAoYWN0aXZlKSB0YXNrcy4KKyAgICBBY3RpdmUsCisgICAgI1tjZmcodGVz dCldIC8vIFVzZWQgYnkgdGVzdHMsIG1pZ2h0IGJlIHVzZWQgYnkgcHJvZHVjdGlvbiBjb2RlIGlu IHRoZSBmdXR1cmUKKyAgICAvLy8gT25seSBnZXQgZmluaXNoZWQgKGFyY2hpdmVkKSB0YXNrcy4K KyAgICBBcmNoaXZlZCwKK30KKworLy8vIE1hcCB0aGF0IHN0b3JlcyB3aGV0aGVyIGEgcmVtb3Rl IG5vZGUncyB0YXNrcyB3ZXJlIHN1Y2Nlc3NmdWxseQorLy8vIGZldGNoZWQuCisjW2Rlcml2ZShE ZWZhdWx0KV0KK3B1YiBzdHJ1Y3QgTm9kZUZldGNoU3VjY2Vzc01hcChIYXNoTWFwPChTdHJpbmcs IFN0cmluZyksIGJvb2w+KTsKKworaW1wbCBOb2RlRmV0Y2hTdWNjZXNzTWFwIHsKKyAgICAvLy8g TWFyayBhIG5vZGUgb2YgYSBnaXZlbiByZW1vdGUgYXMgc3VjY2Vzc2Z1bC4KKyAgICBwdWIgZm4g c2V0X25vZGVfc3VjY2VzcygmbXV0IHNlbGYsIHJlbW90ZTogU3RyaW5nLCBub2RlOiBTdHJpbmcp IHsKKyAgICAgICAgc2VsZi4wLmluc2VydCgocmVtb3RlLCBub2RlKSwgdHJ1ZSk7CisgICAgfQor CisgICAgLy8vIE1hcmsgYSBub2RlIG9mIGEgZ2l2ZW4gcmVtb3RlIGFzIGZhaWxlZC4KKyAgICBw dWIgZm4gc2V0X25vZGVfZmFpbHVyZSgmbXV0IHNlbGYsIHJlbW90ZTogU3RyaW5nLCBub2RlOiBT dHJpbmcpIHsKKyAgICAgICAgc2VsZi4wLmluc2VydCgocmVtb3RlLCBub2RlKSwgZmFsc2UpOwor ICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHdoZXRoZXIgdGFza3MgZnJvbSBhIGdpdmVuIG5vZGUg b2YgYSByZW1vdGUgd2VyZSBzdWNjZXNzZnVsbHkgZmV0Y2hlZC4KKyAgICBwdWIgZm4gbm9kZV9z dWNjZXNzZnVsKCZzZWxmLCByZW1vdGU6ICZzdHIsIG5vZGU6ICZzdHIpIC0+IGJvb2wgeworICAg ICAgICBtYXRjaGVzIShzZWxmLjAuZ2V0KCYocmVtb3RlLmludG8oKSwgbm9kZS5pbnRvKCkpKSwg U29tZSh0cnVlKSkKKyAgICB9CisKKyAgICAvLy8gTWVyZ2UgdGhpcyBtYXAgd2l0aCBhbm90aGVy LgorICAgIHB1YiBmbiBtZXJnZSgmbXV0IHNlbGYsIG90aGVyOiBTZWxmKSB7CisgICAgICAgIHNl bGYuMC5leHRlbmQob3RoZXIuMCk7CisgICAgfQorfQorCitpbXBsIFJlYWRhYmxlVGFza0NhY2hl IHsKKyAgICAvLy8gSXRlcmF0ZSBvdmVyIGNhY2hlZCB0YXNrcy4KKyAgICBwdWIgZm4gZ2V0X3Rh c2tzKCZzZWxmLCBtb2RlOiBHZXRUYXNrcykgLT4gUmVzdWx0PFRhc2tBcmNoaXZlSXRlcmF0b3I8 J18+LCBFcnJvcj4geworICAgICAgICBzZWxmLmNhY2hlCisgICAgICAgICAgICAuZ2V0X3Rhc2tz X2ltcGwobW9kZSwgJnNlbGYubG9jaykKKyAgICAgICAgICAgIC5jb250ZXh0KCJmYWlsZWQgdG8g Y3JlYXRlIHRhc2sgYXJjaGl2ZSBpdGVyYXRvciIpCisgICAgfQorfQorCitpbXBsIFdyaXRhYmxl VGFza0NhY2hlIHsKKyAgICAvLy8gQ3JlYXRlIGluaXRpYWwgdGFzayBhcmNoaXZlcyB0aGF0IGNh biBiZSBiYWNrZmlsbGVkIHdpdGggdGhlCisgICAgLy8vIHJlY2VudCB0YXNrIGhpc3RvcnkgZnJv bSBhIHJlbW90ZS4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBmdW5jdGlvbiBvbmx5IGhhcyBhbiBl ZmZlY3QgaWYgdGhlcmUgYXJlIG5vIGFyY2hpdmUgZmlsZXMgeWV0LgorICAgIHB1YiBmbiBpbml0 KCZzZWxmLCBub3c6IGk2NCkgLT4gUmVzdWx0PCgpLCBFcnJvcj4geworICAgICAgICBpZiBzZWxm LmNhY2hlLmFyY2hpdmVfZmlsZXMoJnNlbGYubG9jayk/LmlzX2VtcHR5KCkgeworICAgICAgICAg ICAgZm9yIGkgaW4gMC4uc2VsZi5jYWNoZS5tYXhfZmlsZXMgeworICAgICAgICAgICAgICAgIHNl bGYubmV3X2ZpbGUoCisgICAgICAgICAgICAgICAgICAgIG5vdyAtIChpIGFzIHU2NCAqIHNlbGYu Y2FjaGUucm90YXRlX2FmdGVyKSBhcyBpNjQsCisgICAgICAgICAgICAgICAgICAgIGkgPj0gc2Vs Zi5jYWNoZS51bmNvbXByZXNzZWRfZmlsZXMsCisgICAgICAgICAgICAgICAgKT87CisgICAgICAg ICAgICB9CisgICAgICAgIH0KKworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICAvLy8gU3Rh cnQgYSBuZXcgYXJjaGl2ZSBmaWxlIHdpdGggYSBnaXZlbiB0aW1lc3RhbXAuCisgICAgLy8vIGBu b3dgIGlzIHN1cHBvc2VkIHRvIGJlIGEgVU5JWCB0aW1lc3RhbXAgKHNlY29uZHMpLgorICAgIGZu IG5ld19maWxlKCZzZWxmLCBub3c6IGk2NCwgY29tcHJlc3M6IGJvb2wpIC0+IFJlc3VsdDxBcmNo aXZlRmlsZSwgRXJyb3I+IHsKKyAgICAgICAgbGV0IHN1ZmZpeCA9IGlmIGNvbXByZXNzIHsKKyAg ICAgICAgICAgIFpTVERfRVhURU5TSU9OX1dJVEhfRE9UCisgICAgICAgIH0gZWxzZSB7CisgICAg ICAgICAgICAiIgorICAgICAgICB9OworCisgICAgICAgIGxldCBuZXdfcGF0aCA9IHNlbGYKKyAg ICAgICAgICAgIC5jYWNoZQorICAgICAgICAgICAgLmJhc2VfcGF0aAorICAgICAgICAgICAgLmpv aW4oZm9ybWF0ISgie0FSQ0hJVkVfRklMRU5BTUVfUFJFRklYfXtub3d9e3N1ZmZpeH0iKSk7CisK KyAgICAgICAgbGV0IG11dCBmaWxlID0gRmlsZTo6Y3JlYXRlKCZuZXdfcGF0aCk/OworICAgICAg ICBzZWxmLmNhY2hlLmNyZWF0ZV9vcHRpb25zLmFwcGx5X3RvKCZtdXQgZmlsZSwgJm5ld19wYXRo KT87CisKKyAgICAgICAgaWYgY29tcHJlc3MgeworICAgICAgICAgICAgbGV0IGVuY29kZXIgPSB6 c3RkOjpzdHJlYW06OndyaXRlOjpFbmNvZGVyOjpuZXcoZmlsZSwgenN0ZDo6REVGQVVMVF9DT01Q UkVTU0lPTl9MRVZFTCk/OworICAgICAgICAgICAgZW5jb2Rlci5maW5pc2goKT87CisgICAgICAg IH0KKworICAgICAgICBPayhBcmNoaXZlRmlsZSB7CisgICAgICAgICAgICBwYXRoOiBuZXdfcGF0 aCwKKyAgICAgICAgICAgIGNvbXByZXNzZWQ6IGNvbXByZXNzLAorICAgICAgICAgICAgc3RhcnR0 aW1lOiBub3csCisgICAgICAgIH0pCisgICAgfQorCisgICAgLy8vIFJvdGF0ZSB0YXNrIGFyY2hp dmUgaWYgdGhlIHRoZSBuZXdlc3QgYXJjaGl2ZSBmaWxlIGlzIG9sZGVyIHRoYW4gYHJvdGF0ZV9h ZnRlcmAuCisgICAgLy8vCisgICAgLy8vIFRoZSBvbGRlc3QgYXJjaGl2ZSBmaWxlcyBhcmUgcmVt b3ZlZCBpZiB0aGUgdG90YWwgbnVtYmVyIG9mIGFyY2hpdmUgZmlsZXMgZXhjZWVkcworICAgIC8v LyBgbWF4X2ZpbGVzYC4gYG5vd2AgaXMgc3VwcG9zZWQgdG8gYmUgYSBVTklYIHRpbWVzdGFtcCAo c2Vjb25kcykuCisgICAgcHViIGZuIHJvdGF0ZSgmc2VsZiwgbm93OiBpNjQpIC0+IFJlc3VsdDxi b29sLCBFcnJvcj4geworICAgICAgICBsZXQgbXV0IGRpZF9yb3RhdGUgPSBmYWxzZTsKKyAgICAg ICAgbGV0IG11dCBhcmNoaXZlX2ZpbGVzID0gc2VsZi5jYWNoZS5hcmNoaXZlX2ZpbGVzKCZzZWxm LmxvY2spPzsKKworICAgICAgICBsZXQgbXV0IHN0YXJ0X25ld19maWxlID0gfGZpbGVzOiAmbXV0 IFZlYzxBcmNoaXZlRmlsZT58IC0+IFJlc3VsdDwoKSwgRXJyb3I+IHsKKyAgICAgICAgICAgIGxl dCBuZXdfZmlsZSA9IHNlbGYubmV3X2ZpbGUobm93LCBzZWxmLmNhY2hlLnVuY29tcHJlc3NlZF9m aWxlcyA9PSAwKT87CisgICAgICAgICAgICBmaWxlcy5pbnNlcnQoMCwgbmV3X2ZpbGUpOworICAg ICAgICAgICAgc2VsZi5hcHBseV9qb3VybmFsKCk/OworCisgICAgICAgICAgICBkaWRfcm90YXRl ID0gdHJ1ZTsKKyAgICAgICAgICAgIE9rKCgpKQorICAgICAgICB9OworCisgICAgICAgIG1hdGNo IGFyY2hpdmVfZmlsZXMuZmlyc3QoKSB7CisgICAgICAgICAgICBTb21lKGJvdW5kKSA9PiB7Cisg ICAgICAgICAgICAgICAgaWYgbm93ID4gYm91bmQuc3RhcnR0aW1lICYmIG5vdyAtIGJvdW5kLnN0 YXJ0dGltZSA+IHNlbGYuY2FjaGUucm90YXRlX2FmdGVyIGFzIGk2NCB7CisgICAgICAgICAgICAg ICAgICAgIHN0YXJ0X25ld19maWxlKCZtdXQgYXJjaGl2ZV9maWxlcyk/OworICAgICAgICAgICAg ICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIE5vbmUgPT4gc3RhcnRfbmV3X2ZpbGUo Jm11dCBhcmNoaXZlX2ZpbGVzKT8sCisgICAgICAgIH0KKworICAgICAgICB3aGlsZSBhcmNoaXZl X2ZpbGVzLmxlbigpID4gc2VsZi5jYWNoZS5tYXhfZmlsZXMgYXMgdXNpemUgeworICAgICAgICAg ICAgLy8gVW53cmFwIGlzIHNhZmUgYmVjYXVzZSBvZiB0aGUgbGVuZ3RoIGNoZWNrIGFib3ZlCisg ICAgICAgICAgICBsZXQgdG9fcmVtb3ZlID0gYXJjaGl2ZV9maWxlcy5wb3AoKS51bndyYXAoKTsK KyAgICAgICAgICAgIHN0ZDo6ZnM6OnJlbW92ZV9maWxlKCZ0b19yZW1vdmUucGF0aCkKKyAgICAg ICAgICAgICAgICAud2l0aF9jb250ZXh0KHx8IGZvcm1hdCEoImZhaWxlZCB0byByZW1vdmUge30i LCB0b19yZW1vdmUucGF0aC5kaXNwbGF5KCkpKT87CisgICAgICAgIH0KKworICAgICAgICBmb3Ig ZmlsZSBpbiBhcmNoaXZlX2ZpbGVzCisgICAgICAgICAgICAuaXRlcl9tdXQoKQorICAgICAgICAg ICAgLnNraXAoc2VsZi5jYWNoZS51bmNvbXByZXNzZWRfZmlsZXMgYXMgdXNpemUpCisgICAgICAg IHsKKyAgICAgICAgICAgIGlmICFmaWxlLmNvbXByZXNzZWQgeworICAgICAgICAgICAgICAgIGZp bGUuY29tcHJlc3Moc2VsZi5jYWNoZS5jcmVhdGVfb3B0aW9ucykKKyAgICAgICAgICAgICAgICAg ICAgLndpdGhfY29udGV4dCh8fCBmb3JtYXQhKCJmYWlsZWQgdG8gY29tcHJlc3Mge30iLCBmaWxl LnBhdGguZGlzcGxheSgpKSk/OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAg T2soZGlkX3JvdGF0ZSkKKyAgICB9CisKKyAgICAvLy8gSXRlcmF0ZSBvdmVyIGNhY2hlZCB0YXNr cy4KKyAgICBwdWIgZm4gZ2V0X3Rhc2tzKCZzZWxmLCBtb2RlOiBHZXRUYXNrcykgLT4gUmVzdWx0 PFRhc2tBcmNoaXZlSXRlcmF0b3I8J18+LCBFcnJvcj4geworICAgICAgICBzZWxmLmNhY2hlCisg ICAgICAgICAgICAuZ2V0X3Rhc2tzX2ltcGwobW9kZSwgJnNlbGYubG9jaykKKyAgICAgICAgICAg IC5jb250ZXh0KCJmYWlsZWQgdG8gY3JlYXRlIHRhc2sgYXJjaGl2ZSBpdGVyYXRvciIpCisgICAg fQorCisgICAgLy8vIFVwZGF0ZSB0YXNrIGNhY2hlIGNvbnRlbnRzLgorICAgIC8vLworICAgIC8v LyBUaGlzIGlzIG1vc3RseSB1c2VkIGZvciBhZGRpbmcgbmV3IHRhc2tzIHRvIHRhc2tzIHRvIHRo ZSBjYWNoZSwgYnV0CisgICAgLy8vIHdpbGwgYWxzbyBoYW5kbGUgZHJvcHBpbmcgZmluaXNoZWQv ZmFpbGVkIHRyYWNrZWQgdGFza3MgZnJvbSB0aGUKKyAgICAvLy8gc3RhdGUgZmlsZSBhbmQgYWN0 aXZlIGZpbGUuIFRoaXMgaXMgZG9uZSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gdXBkYXRlCisg ICAgLy8vIHRoZXNlIGZpbGVzIG11bHRpcGxlIHRpbWVzLgorICAgIC8vLworICAgIC8vLyBSdW5u aW5nIHRhc2tzICh0YXNrcyB3aXRob3V0IGFuIGVuZHRpbWUpIGFyZSBwbGFjZWQgaW50byB0aGUg J2FjdGl2ZScgZmlsZSBpbiB0aGUKKyAgICAvLy8gdGFzayBjYWNoZSBiYXNlIGRpcmVjdG9yeS4g RmluaXNoZWQgdGFza3MgYXJlIHNvcnRlZCBpbnRvIGBhcmNoaXZlLjxzdGFydGltZT5gIGFyY2hp dmUKKyAgICAvLy8gZmlsZXMsIHdoZXJlIGA8c3RhcnR0aW1lcz5gIGRlbm90ZXMgdGhlIGxvd2Vz dCBwZXJtaXR0ZWQgc3RhcnQgdGltZSB0aW1lc3RhbXAgZm9yIGEgZ2l2ZW4KKyAgICAvLy8gYXJj aGl2ZSBmaWxlLiBJZiBhIHRhc2sgd2hpY2ggd2FzIGFkZGVkIGFzIHJ1bm5pbmcgcHJldmlvdXNs eSBpcyBhZGRlZCBhZ2FpbiwgdGhpcyB0aW1lIGluCisgICAgLy8vIGEgZmluaXNoZWQgc3RhdGUs IGl0IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBgYWN0aXZlYCBmaWxlIGFuZCBhbHNvIHNvcnRl ZCBpbnRvCisgICAgLy8vIG9uZSBvZiB0aGUgYXJjaGl2ZSBmaWxlcy4KKyAgICAvLy8gU2FtZSBn b2VzIGZvciB0aGUgbGlzdCBvZiB0cmFja2VkIHRhc2tzOyB0aGUgZW50cnkgaW4gdGhlIHN0YXRl IGZpbGUgd2lsbCBiZSByZW1vdmVkLgorICAgIC8vLworICAgIC8vLyBDcmFzaCBjb25zaXN0ZW5j eToKKyAgICAvLy8KKyAgICAvLy8gVGhlIHN0YXRlIGZpbGUsIHdoaWNoIGNvbnRhaW5zIHRoZSBj dXQtb2ZmIHRpbWVzdGFtcHMgZm9yIGZ1dHVyZSB0YXNrIGZldGNoaW5nLCBpcyB1cGRhdGVkIGF0 IHRoZQorICAgIC8vLyBlbmQgYWZ0ZXIgYWxsIHRhc2tzIGhhdmUgYmVlbiBhZGRlZCBpbnRvIHRo ZSBhcmNoaXZlLiBBZGRpbmcgdGFza3MgaXMgYW4gaWRlbXBvdGVudAorICAgIC8vLyBvcGVyYXRp b247IGFkZGluZyB0aGUgKnNhbWUqIHRhc2sgbXVsdGlwbGUgdGltZXMgZG9lcyBub3QgbGVhZCB0 byBkdXBsaWNhdGVkIGVudHJpZXMgaW4gdGhlCisgICAgLy8vIHRhc2sgYXJjaGl2ZS4gSW5kaXZp ZHVhbCBhcmNoaXZlIGZpbGVzIGFyZSB1cGRhdGVkIGF0b21pY2FsbHksIGJ1dCBzaW5jZQorICAg IC8vLyBhZGRpbmcgdGFza3MgY2FuIGludm9sdmUgdXBkYXRpbmcgbXVsdGlwbGUgYXJjaGl2ZSBm aWxlcywgdGhlIGFyY2hpdmUgY291bGQgZW5kIHVwCisgICAgLy8vIGluIGEgcGFydGlhbGx5LXVw ZGF0ZWQsIGluY29uc2lzdGVudCBzdGF0ZSBpbiBjYXNlIG9mIGEgY3Jhc2guCisgICAgLy8vIEhv d2V2ZXIsIHNpbmNlIHRoZSBzdGF0ZSBmaWxlIHdpdGggdGhlIGN1dC1vZmYgdGltZXN0YW1wcyBp cyB1cGRhdGVkIGxhc3QsCisgICAgLy8vIHRoZSBjb25zaXN0ZW5jeSBvZiB0aGUgYXJjaGl2ZSBz aG91bGQgYmUgcmVzdG9yZWQgYXQgdGhlIG5leHQgdXBkYXRlIGN5Y2xlIG9mIHRoZSBhcmNoaXZl LgorICAgIHB1YiBmbiB1cGRhdGUoCisgICAgICAgICZzZWxmLAorICAgICAgICBuZXdfdGFza3M6 IFZlYzxUYXNrQ2FjaGVJdGVtPiwKKyAgICAgICAgdXBkYXRlX3N0YXRlX2Zvcl9yZW1vdGU6ICZO b2RlRmV0Y2hTdWNjZXNzTWFwLAorICAgICAgICBkcm9wX3RyYWNrZWQ6IEhhc2hTZXQ8UmVtb3Rl VXBpZD4sCisgICAgKSAtPiBSZXN1bHQ8KCksIEVycm9yPiB7CisgICAgICAgIGxldCB0YXNrX2l0 ZXIgPSBzZWxmCisgICAgICAgICAgICAuZ2V0X3Rhc2tzKEdldFRhc2tzOjpBY3RpdmUpCisgICAg ICAgICAgICAuY29udGV4dCgiZmFpbGVkIHRvIGNyZWF0ZSBhcmNoaXZlIGl0ZXJhdG9yIGZvciBh Y3RpdmUgdGFza3MiKT87CisKKyAgICAgICAgbGV0IG11dCBhY3RpdmVfdGFza3MgPSBIYXNoTWFw Ojpmcm9tX2l0ZXIodGFza19pdGVyLmZpbHRlcl9tYXAofHRhc2t8IHsKKyAgICAgICAgICAgIGlm ICFkcm9wX3RyYWNrZWQuY29udGFpbnMoJnRhc2sudXBpZCkgeworICAgICAgICAgICAgICAgIFNv bWUoKHRhc2sudXBpZC5jbG9uZSgpLCB0YXNrKSkKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAg ICAgICAgICAgICAgTm9uZQorICAgICAgICAgICAgfQorICAgICAgICB9KSk7CisKKyAgICAgICAg bGV0IG11dCBuZXdfZmluaXNoZWRfdGFza3MgPSBWZWM6Om5ldygpOworCisgICAgICAgIGZvciB0 YXNrIGluIG5ld190YXNrcyB7CisgICAgICAgICAgICBpZiB0YXNrLmVuZHRpbWUuaXNfbm9uZSgp IHsKKyAgICAgICAgICAgICAgICBhY3RpdmVfdGFza3MuaW5zZXJ0KHRhc2sudXBpZC5jbG9uZSgp LCB0YXNrKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbmV3X2Zpbmlz aGVkX3Rhc2tzLnB1c2godGFzayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAg ICBsZXQgbXV0IHN0YXRlID0gc2VsZi5yZWFkX3N0YXRlKCk7CisKKyAgICAgICAgZm9yIHVwaWQg aW4gZHJvcF90cmFja2VkIHsKKyAgICAgICAgICAgIHN0YXRlLnJlbW92ZV90cmFja2VkX3Rhc2so JnVwaWQpOworICAgICAgICB9CisKKyAgICAgICAgc2VsZi53cml0ZV90YXNrc190b19qb3VybmFs KAorICAgICAgICAgICAgbmV3X2ZpbmlzaGVkX3Rhc2tzLAorICAgICAgICAgICAgJm11dCBhY3Rp dmVfdGFza3MsCisgICAgICAgICAgICB1cGRhdGVfc3RhdGVfZm9yX3JlbW90ZSwKKyAgICAgICAg ICAgICZtdXQgc3RhdGUsCisgICAgICAgICk/OworCisgICAgICAgIGxldCBtdXQgYWN0aXZlOiBW ZWM8VGFza0NhY2hlSXRlbT4gPSBhY3RpdmVfdGFza3MuaW50b192YWx1ZXMoKS5jb2xsZWN0KCk7 CisKKyAgICAgICAgYWN0aXZlLnNvcnRfYnkoY29tcGFyZV90YXNrc19yZXZlcnNlKTsKKyAgICAg ICAgc2VsZi53cml0ZV9hY3RpdmVfdGFza3MoYWN0aXZlLmludG9faXRlcigpKQorICAgICAgICAg ICAgLmNvbnRleHQoImZhaWxlZCB0byB3cml0ZSBhY3RpdmUgdGFzayBmaWxlIHdoZW4gYWRkaW5n IHRhc2tzIik/OworICAgICAgICBzZWxmLndyaXRlX3N0YXRlKHN0YXRlKQorICAgICAgICAgICAg LmNvbnRleHQoImZhaWxlZCB0byB1cGRhdGUgdGFzayBhcmNoaXZlIHN0YXRlIGZpbGUgd2hlbiBh ZGRpbmcgdGFza3MiKT87CisKKyAgICAgICAgc2VsZi5hcHBseV9qb3VybmFsX2lmX3Rvb19sYXJn ZSgpCisgICAgICAgICAgICAuY29udGV4dCgiY291bGQgbm90IGFwcGx5IGpvdXJuYWwgZWFybHki KT87CisKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gd3JpdGVfdGFza3NfdG9fam91 cm5hbCgKKyAgICAgICAgJnNlbGYsCisgICAgICAgIHRhc2tzOiBWZWM8VGFza0NhY2hlSXRlbT4s CisgICAgICAgIGFjdGl2ZV90YXNrczogJm11dCBIYXNoTWFwPFJlbW90ZVVwaWQsIFRhc2tDYWNo ZUl0ZW0+LAorICAgICAgICBub2RlX3N1Y2Nlc3NfbWFwOiAmTm9kZUZldGNoU3VjY2Vzc01hcCwK KyAgICAgICAgc3RhdGU6ICZtdXQgU3RhdGUsCisgICAgKSAtPiBSZXN1bHQ8KCksIEVycm9yPiB7 CisgICAgICAgIGxldCBmaWxlbmFtZSA9IHNlbGYuY2FjaGUuYmFzZV9wYXRoLmpvaW4oV0FMX0ZJ TEVOQU1FKTsKKyAgICAgICAgbGV0IG11dCBmaWxlID0gT3Blbk9wdGlvbnM6Om5ldygpCisgICAg ICAgICAgICAuYXBwZW5kKHRydWUpCisgICAgICAgICAgICAuY3JlYXRlKHRydWUpCisgICAgICAg ICAgICAub3BlbihmaWxlbmFtZSk/OworCisgICAgICAgIGZvciB0YXNrIGluIHRhc2tzIHsKKyAg ICAgICAgICAgIC8vIFJlbW92ZSB0aGlzIGZpbmlzaGVkIHRhc2sgZnJvbSBvdXIgc2V0IG9mIGFj dGl2ZSB0YXNrcy4KKyAgICAgICAgICAgIGFjdGl2ZV90YXNrcy5yZW1vdmUoJnRhc2sudXBpZCk7 CisKKyAgICAgICAgICAgIC8vIFRPRE86OiBIYW5kbGUgUEJTIHRhc2tzIGNvcnJlY3RseS4KKyAg ICAgICAgICAgIC8vIFRPRE86IFRoaXMgaXMgYXdrd2FyZCwgbWF5YmUgb3ZlcmhhdWwgUmVtb3Rl VXBpZCB0eXBlIHRvIG1ha2UgdGhpcyBlYXNpZXIKKyAgICAgICAgICAgIG1hdGNoIHRhc2sudXBp ZC51cGlkLnBhcnNlOjo8UHZlVXBpZD4oKSB7CisgICAgICAgICAgICAgICAgT2sodXBpZCkgPT4g eworICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZSA9ICZ1cGlkLm5vZGU7CisgICAgICAgICAg ICAgICAgICAgIGxldCByZW1vdGUgPSB0YXNrLnVwaWQucmVtb3RlKCk7CisKKyAgICAgICAgICAg ICAgICAgICAgaWYgbm9kZV9zdWNjZXNzX21hcC5ub2RlX3N1Y2Nlc3NmdWwocmVtb3RlLCBub2Rl KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS51cGRhdGVfY3V0b2ZmX3RpbWVzdGFt cCh0YXNrLnVwaWQucmVtb3RlKCksIG5vZGUsIHRhc2suc3RhcnR0aW1lKTsKKyAgICAgICAgICAg ICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBFcnIoZXJyb3Ip ID0+IHsKKyAgICAgICAgICAgICAgICAgICAgbG9nOjplcnJvciEoImNvdWxkIG5vdCBwYXJzZSBQ VkUgVVBJRCAtIG5vdCBzYXZpbmcgdG8gdGFzayBjYWNoZToge2Vycm9yOiN9Iik7CisgICAgICAg ICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0K KworICAgICAgICAgICAgc2VyZGVfanNvbjo6dG9fd3JpdGVyKCZtdXQgZmlsZSwgJnRhc2spPzsK KyAgICAgICAgICAgIHdyaXRlbG4hKCZmaWxlKT87CisgICAgICAgIH0KKworICAgICAgICBmaWxl LnN5bmNfYWxsKCk/OworCisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIC8vLyBSZXR1cm5z IHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGpvdXJuYWwgZmlsZS4KKyAgICBmbiBqb3VybmFsX3Np emUoJnNlbGYpIC0+IFJlc3VsdDx1NjQsIEVycm9yPiB7CisgICAgICAgIGxldCBtZXRhZGF0YSA9 IHNlbGYKKyAgICAgICAgICAgIC5jYWNoZQorICAgICAgICAgICAgLmJhc2VfcGF0aAorICAgICAg ICAgICAgLmpvaW4oV0FMX0ZJTEVOQU1FKQorICAgICAgICAgICAgLm1ldGFkYXRhKCkKKyAgICAg ICAgICAgIC5jb250ZXh0KCJmYWlsZWQgdG8gcmVhZCBtZXRhZGF0YSBvZiBqb3VybmFsIGZpbGUi KT87CisKKyAgICAgICAgT2sobWV0YWRhdGEuc2l6ZSgpKQorICAgIH0KKworICAgIC8vLyBBcHBs eSB0aGUgam91cm5hbCBlYXJseSBpZiBpdCBoYXMgZ3Jvd24gbGFyZ2VyIHRoYW4gdGhlIG1heGlt dW0gYWxsb3dlZCBzaXplLgorICAgIGZuIGFwcGx5X2pvdXJuYWxfaWZfdG9vX2xhcmdlKCZzZWxm KSAtPiBSZXN1bHQ8KCksIEVycm9yPiB7CisgICAgICAgIGxldCBzaXplID0gc2VsZi5qb3VybmFs X3NpemUoKT87CisKKyAgICAgICAgaWYgc2l6ZSA+IHNlbGYuY2FjaGUuam91cm5hbF9tYXhfc2l6 ZSB7CisgICAgICAgICAgICBsb2c6OmluZm8hKCJ0YXNrIGNhY2hlIGpvdXJuYWwgc2l6ZSB7c2l6 ZX0gYnl0ZXMsIGFwcGx5aW5nIGVhcmx5Iik7CisgICAgICAgICAgICBzZWxmLmFwcGx5X2pvdXJu YWwoKT87CisgICAgICAgIH0KKworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICAvLy8gQXBw bHkgdGhlIHRhc2sgam91cm5hbC4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyB3aWxsIG1lcmdlIGFs bCB0YXNrcyBpbiB0aGUgam91cm5hbCBmaWxlIGludG8gdGhlIHRhc2sgYXJjaGl2ZS4KKyAgICBw dWIgZm4gYXBwbHlfam91cm5hbCgmc2VsZikgLT4gUmVzdWx0PCgpLCBFcnJvcj4geworICAgICAg ICBsZXQgc3RhcnQgPSBJbnN0YW50Ojpub3coKTsKKyAgICAgICAgbGV0IGZpbGVuYW1lID0gc2Vs Zi5jYWNoZS5iYXNlX3BhdGguam9pbihXQUxfRklMRU5BTUUpOworCisgICAgICAgIGxldCBmaWxl ID0gbWF0Y2ggRmlsZTo6b3BlbigmZmlsZW5hbWUpIHsKKyAgICAgICAgICAgIE9rKGZpbGUpID0+ IEJveDo6bmV3KEJ1ZlJlYWRlcjo6bmV3KGZpbGUpKSwKKyAgICAgICAgICAgIEVycihlcnIpIGlm IGVyci5raW5kKCkgPT0gRXJyb3JLaW5kOjpOb3RGb3VuZCA9PiByZXR1cm4gT2soKCkpLAorICAg ICAgICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEVycihlcnIuaW50bygpKSwKKyAgICAgICAgfTsK KworICAgICAgICBsb2c6OmluZm8hKCJhcHBseWluZyB0YXNrIGNhY2hlIGpvdXJuYWwiKTsKKyAg ICAgICAgbGV0IGl0ZXJhdG9yID0gQXJjaGl2ZUl0ZXJhdG9yOjpuZXcoZmlsZSk7CisKKyAgICAg ICAgbGV0IG11dCB0YXNrczogVmVjPFRhc2tDYWNoZUl0ZW0+ID0gaXRlcmF0b3IKKyAgICAgICAg ICAgIC5maWx0ZXJfbWFwKHx0YXNrfCBtYXRjaCB0YXNrIHsKKyAgICAgICAgICAgICAgICBPayh0 YXNrKSA9PiBTb21lKHRhc2spLAorICAgICAgICAgICAgICAgIEVycihlcnIpID0+IHsKKyAgICAg ICAgICAgICAgICAgICAgbG9nOjplcnJvciEoImNvdWxkIG5vdCByZWFkIHRhc2sgZnJvbSBqb3Vy bmFsIGZpbGU6IHtlcnI6I30iKTsKKyAgICAgICAgICAgICAgICAgICAgTm9uZQorICAgICAgICAg ICAgICAgIH0KKyAgICAgICAgICAgIH0pCisgICAgICAgICAgICAuY29sbGVjdCgpOworCisgICAg ICAgIC8vIFRoZSBXQUwgY29udGFpbnMgdGFza3MgaW4gYXJiaXRyYXJ5IG9yZGVyIHNpbmNlIHdl IGFsd2F5cyBhcHBlbmQuCisgICAgICAgIHRhc2tzLnNvcnRfYnkoY29tcGFyZV90YXNrc19yZXZl cnNlKTsKKyAgICAgICAgdGFza3MuZGVkdXAoKTsKKworICAgICAgICBsZXQgY291bnQgPSB0YXNr cy5sZW4oKTsKKworICAgICAgICBzZWxmLm1lcmdlX3Rhc2tzX2ludG9fYXJjaGl2ZSh0YXNrcyk/ OworCisgICAgICAgIC8vIHRydW5jYXRlIHRoZSBqb3VybmFsIGZpbGUKKyAgICAgICAgT3Blbk9w dGlvbnM6Om5ldygpCisgICAgICAgICAgICAud3JpdGUodHJ1ZSkKKyAgICAgICAgICAgIC50cnVu Y2F0ZSh0cnVlKQorICAgICAgICAgICAgLm9wZW4oZmlsZW5hbWUpCisgICAgICAgICAgICAuY29u dGV4dCgiZmFpbGVkIHRvIHRydW5jYXRlIGpvdXJuYWwgZmlsZSIpPzsKKworICAgICAgICBsb2c6 OmluZm8hKAorICAgICAgICAgICAgImNvbW1pdGVkIHtjb3VudH0gdGFza3MgaW4gezouM30ucyB0 byB0YXNrIGNhY2hlIGFyY2hpdmUiLAorICAgICAgICAgICAgc3RhcnQuZWxhcHNlZCgpLmFzX3Nl Y3NfZjMyKCkKKyAgICAgICAgKTsKKworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICAvLy8g TWVyZ2UgYSBsaXN0IG9mICpmaW5pc2hlZCogdGFza3MgaW50byB0aGUgcmVtb3RlIHRhc2sgYXJj aGl2ZSBmaWxlcy4KKyAgICAvLy8gVGhlIGxpc3Qgb2YgdGFzayBpbiBgdGFza3NgICptdXN0KiBi ZSBzb3J0ZWQgYnkgdGhlaXIgdGltZXN0YW1wIGFuZCBVUElEIChkZXNjZW5kaW5nIGJ5CisgICAg Ly8vIHRpbWVzdGFtcCwgYXNjZW5kaW5nIGJ5IFVQSUQpLgorICAgIGZuIG1lcmdlX3Rhc2tzX2lu dG9fYXJjaGl2ZSgmc2VsZiwgdGFza3M6IFZlYzxUYXNrQ2FjaGVJdGVtPikgLT4gUmVzdWx0PCgp LCBFcnJvcj4geworICAgICAgICBkZWJ1Z19hc3NlcnQhKHRhc2tzCisgICAgICAgICAgICAuaXRl cigpCisgICAgICAgICAgICAuaXNfc29ydGVkX2J5KHxhLCBifCBjb21wYXJlX3Rhc2tzKGEsIGIp LmlzX2dlKCkpKTsKKworICAgICAgICBsZXQgZmlsZXMgPSBzZWxmCisgICAgICAgICAgICAuY2Fj aGUKKyAgICAgICAgICAgIC5hcmNoaXZlX2ZpbGVzKCZzZWxmLmxvY2spCisgICAgICAgICAgICAu Y29udGV4dCgiZmFpbGVkIHRvIHJlYWQgYWNoaXZlIGZpbGVzIik/OworCisgICAgICAgIGxldCBt dXQgZmlsZXMgPSBmaWxlcy5pdGVyKCkucGVla2FibGUoKTsKKworICAgICAgICBsZXQgbXV0IGN1 cnJlbnQgPSBmaWxlcy5uZXh0KCk7CisgICAgICAgIGxldCBtdXQgbmV4dCA9IGZpbGVzLnBlZWso KTsKKworICAgICAgICBsZXQgbXV0IHRhc2tzX2Zvcl9jdXJyZW50X2ZpbGUgPSBWZWM6Om5ldygp OworCisgICAgICAgIC8vIFRhc2tzIGFyZSBzb3J0ZWQgeW91bmdlc3QgdG8gb2xkZXN0IChiaWdn ZXN0IHN0YXJ0IHRpbWUgZmlyc3QpCisgICAgICAgIGZvciB0YXNrIGluIHRhc2tzIHsKKyAgICAg ICAgICAgIC8vIFNraXAgYWhlYWQgdW50aWwgd2UgaGF2ZSBmb3VuZCB0aGUgY29ycmVjdCBmaWxl LgorICAgICAgICAgICAgd2hpbGUgbmV4dC5pc19zb21lKCkgeworICAgICAgICAgICAgICAgIGlm IGxldCBTb21lKGN1cnJlbnQpID0gY3VycmVudCB7CisgICAgICAgICAgICAgICAgICAgIGlmIHRh c2suc3RhcnR0aW1lID49IGN1cnJlbnQuc3RhcnR0aW1lIHsKKyAgICAgICAgICAgICAgICAgICAg ICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8v IFRoZSBuZXh0IGVudHJ5J3MgY3V0LW9mZiBpcyBsYXJnZXIgdGhlbiB0aGUgdGFzaydzIHN0YXJ0 IHRpbWUsIHRoYXQgbWVhbnMKKyAgICAgICAgICAgICAgICAgICAgLy8gd2Ugd2FudCB0byBmaW5h bGl6ZWQgdGhlIGN1cnJlbnQgZmlsZSBieSBtZXJnaW5nIGFsbCB0YXNrcyB0aGF0CisgICAgICAg ICAgICAgICAgICAgIC8vIHNob3VsZCBiZSBzdG9yZWQgaW4gaXQuLi4KKyAgICAgICAgICAgICAg ICAgICAgc2VsZi5tZXJnZV9zaW5nbGVfYXJjaGl2ZV9maWxlKAorICAgICAgICAgICAgICAgICAg ICAgICAgc3RkOjptZW06OnRha2UoJm11dCB0YXNrc19mb3JfY3VycmVudF9maWxlKSwKKyAgICAg ICAgICAgICAgICAgICAgICAgIGN1cnJlbnQsCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAg ICAgICAgICAgICAgICAgLndpdGhfY29udGV4dCh8fCB7CisgICAgICAgICAgICAgICAgICAgICAg ICBmb3JtYXQhKCJmYWlsZWQgdG8gbWVyZ2UgYXJjaGl2ZSBmaWxlIHt9IiwgY3VycmVudC5wYXRo LmRpc3BsYXkoKSkKKyAgICAgICAgICAgICAgICAgICAgfSk/OworICAgICAgICAgICAgICAgIH0K KworICAgICAgICAgICAgICAgIC8vIC4uLiBhbmQgdGhlIGBjdXJyZW50YCBmaWxlIHRvIHRoZSBu ZXh0IGVudHJ5LgorICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBmaWxlcy5uZXh0KCk7CisgICAg ICAgICAgICAgICAgbmV4dCA9IGZpbGVzLnBlZWsoKTsKKyAgICAgICAgICAgIH0KKworICAgICAg ICAgICAgaWYgbGV0IFNvbWUoY3VycmVudCkgPSBjdXJyZW50IHsKKyAgICAgICAgICAgICAgICBp ZiB0YXNrLnN0YXJ0dGltZSA8IGN1cnJlbnQuc3RhcnR0aW1lIHsKKyAgICAgICAgICAgICAgICAg ICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAg ICAgdGFza3NfZm9yX2N1cnJlbnRfZmlsZS5wdXNoKHRhc2spOworICAgICAgICB9CisKKyAgICAg ICAgLy8gTWVyZ2UgdGFza3MgZm9yIHRoZSBsYXN0IGZpbGUuCisgICAgICAgIGlmIGxldCBTb21l KGN1cnJlbnQpID0gY3VycmVudCB7CisgICAgICAgICAgICBzZWxmLm1lcmdlX3NpbmdsZV9hcmNo aXZlX2ZpbGUodGFza3NfZm9yX2N1cnJlbnRfZmlsZSwgY3VycmVudCkKKyAgICAgICAgICAgICAg ICAud2l0aF9jb250ZXh0KHx8IHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ISgiZmFpbGVk IHRvIG1lcmdlIGFyY2hpdmUgZmlsZSB7fSIsIGN1cnJlbnQucGF0aC5kaXNwbGF5KCkpCisgICAg ICAgICAgICAgICAgfSk/OworICAgICAgICB9CisKKyAgICAgICAgT2soKCkpCisgICAgfQorCisg ICAgLy8vIEFkZCBhIG5ldyB0cmFja2VkIHRhc2suCisgICAgLy8vCisgICAgLy8vIFRoaXMgd2ls bCBpbnNlcnQgdGhlIHRhc2sgaW4gdGhlIGxpc3Qgb2YgdHJhY2tlZCB0YXNrcyBpbiB0aGUgc3Rh dGUgZmlsZSwKKyAgICAvLy8gYXMgd2VsbCBhcyBjcmVhdGUgYW4gZW50cnkgaW4gdGhlIGBhY3Rp dmVgIGZpbGUuCisgICAgcHViIGZuIGFkZF90cmFja2VkX3Rhc2soJnNlbGYsIHRhc2s6IFRhc2tD YWNoZUl0ZW0pIC0+IFJlc3VsdDwoKSwgRXJyb3I+IHsKKyAgICAgICAgbGV0IG11dCBzdGF0ZSA9 IHNlbGYucmVhZF9zdGF0ZSgpOworCisgICAgICAgIGxldCBtdXQgdGFza3M6IFZlYzxUYXNrQ2Fj aGVJdGVtPiA9IHNlbGYKKyAgICAgICAgICAgIC5nZXRfdGFza3MoR2V0VGFza3M6OkFjdGl2ZSkK KyAgICAgICAgICAgIC5jb250ZXh0KCJmYWlsZWQgdG8gY3JlYXRlIGFjdGl2ZSB0YXNrIGl0ZXJh dG9yIik/CisgICAgICAgICAgICAuY29sbGVjdCgpOworCisgICAgICAgIHRhc2tzLnB1c2godGFz ay5jbG9uZSgpKTsKKyAgICAgICAgdGFza3Muc29ydF9ieShjb21wYXJlX3Rhc2tzX3JldmVyc2Up OworCisgICAgICAgIHN0YXRlLmFkZF90cmFja2VkX3Rhc2sodGFzay51cGlkKTsKKworICAgICAg ICBzZWxmLndyaXRlX2FjdGl2ZV90YXNrcyh0YXNrcy5pbnRvX2l0ZXIoKSkKKyAgICAgICAgICAg IC5jb250ZXh0KCJmYWlsZWQgdG8gd3JpdGUgYWN0aXZlIHRhc2tzIGZpbGUgd2hlbiBhZGRpbmcg dHJhY2tlZCB0YXNrIik/OworCisgICAgICAgIHNlbGYud3JpdGVfc3RhdGUoc3RhdGUpCisgICAg ICAgICAgICAuY29udGV4dCgiZmFpbGVkIHRvIHdyaXRlIHN0YXRlIHdoZW4gYWRkaW5nIHRyYWNr ZWQgdGFzayIpPzsKKworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICAvLy8gUmVhZCB0aGUg c3RhdGUgZmlsZS4KKyAgICAvLy8gSWYgdGhlIHN0YXRlIGZpbGUgY291bGQgbm90IGJlIHJlYWQg b3IgZG9lcyBub3QgZXhpc3QsIHRoZSBkZWZhdWx0IChlbXB0eSkgc3RhdGUKKyAgICAvLy8gaXMg cmV0dXJuZWQuCisgICAgcHViIGZuIHJlYWRfc3RhdGUoJnNlbGYpIC0+IFN0YXRlIHsKKyAgICAg ICAgc2VsZi5jYWNoZS5yZWFkX3N0YXRlKCkKKyAgICB9CisKKyAgICAvLy8gV3JpdGUgdGhlIHN0 YXRlIGZpbGUuCisgICAgZm4gd3JpdGVfc3RhdGUoJnNlbGYsIHN0YXRlOiBTdGF0ZSkgLT4gUmVz dWx0PCgpLCBFcnJvcj4geworICAgICAgICBsZXQgcGF0aCA9IHNlbGYuY2FjaGUuYmFzZV9wYXRo LmpvaW4oU1RBVEVfRklMRU5BTUUpOworCisgICAgICAgIGxldCBkYXRhID0gc2VyZGVfanNvbjo6 dG9fdmVjX3ByZXR0eSgmc3RhdGUpPzsKKworICAgICAgICBwcm94bW94X3N5czo6ZnM6OnJlcGxh Y2VfZmlsZShwYXRoLCAmZGF0YSwgc2VsZi5jYWNoZS5jcmVhdGVfb3B0aW9ucywgdHJ1ZSk/Owor CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIC8vLyBXcml0ZSB0aGUgcHJvdmlkZWQgdGFz a3MgdG8gdGhlICdhY3RpdmUnIGZpbGUuCisgICAgLy8vCisgICAgLy8vIFRoZSB0YXNrcyBhcmUg Zmlyc3Qgd3JpdHRlbiB0byBhIHRlbXBvcmFyeSBmaWxlLCB3aGljaCBpcyB0aGVuIHVzZWQKKyAg ICAvLy8gdG8gYXRvbWljYWxseSByZXBsYWNlIHRoZSBvcmlnaW5hbC4KKyAgICBmbiB3cml0ZV9h Y3RpdmVfdGFza3MoJnNlbGYsIHRhc2tzOiBpbXBsIEl0ZXJhdG9yPEl0ZW0gPSBUYXNrQ2FjaGVJ dGVtPikgLT4gUmVzdWx0PCgpLCBFcnJvcj4geworICAgICAgICBsZXQgKGZkLCBwYXRoKSA9IHBy b3htb3hfc3lzOjpmczo6bWFrZV90bXBfZmlsZSgKKyAgICAgICAgICAgIHNlbGYuY2FjaGUuYmFz ZV9wYXRoLmpvaW4oQUNUSVZFX0ZJTEVOQU1FKSwKKyAgICAgICAgICAgIHNlbGYuY2FjaGUuY3Jl YXRlX29wdGlvbnMsCisgICAgICAgICk/OworICAgICAgICBsZXQgbXV0IGZkID0gQnVmV3JpdGVy OjpuZXcoZmQpOworCisgICAgICAgIFNlbGY6OndyaXRlX3Rhc2tzKCZtdXQgZmQsIHRhc2tzKT87 CisKKyAgICAgICAgaWYgbGV0IEVycihlcnIpID0gZmQuZmx1c2goKSB7CisgICAgICAgICAgICBs b2c6OmVycm9yISgiY291bGQgbm90IGZsdXNoICdhY3RpdmUnIGZpbGU6IHtlcnI6I30iKTsKKyAg ICAgICAgfQorICAgICAgICBkcm9wKGZkKTsKKworICAgICAgICBsZXQgdGFyZ2V0ID0gc2VsZi5j YWNoZS5iYXNlX3BhdGguam9pbihBQ1RJVkVfRklMRU5BTUUpOworCisgICAgICAgIGxldCByZXMg PSBzdGQ6OmZzOjpyZW5hbWUoJnBhdGgsICZ0YXJnZXQpLndpdGhfY29udGV4dCh8fCB7CisgICAg ICAgICAgICBmb3JtYXQhKAorICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gcmVwbGFjZSB7fSB3 aXRoIHt9IiwKKyAgICAgICAgICAgICAgICB0YXJnZXQuZGlzcGxheSgpLAorICAgICAgICAgICAg ICAgIHBhdGguZGlzcGxheSgpLAorICAgICAgICAgICAgKQorICAgICAgICB9KTsKKworICAgICAg ICBpZiBsZXQgRXJyKGVycikgPSByZXMgeworICAgICAgICAgICAgaWYgbGV0IEVycihlcnIpID0g c3RkOjpmczo6cmVtb3ZlX2ZpbGUoJnBhdGgpIHsKKyAgICAgICAgICAgICAgICBsb2c6OmVycm9y ISgKKyAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBjbGVhbnVwIHRlbXBvcmFyeSBmaWxl IHt9OiB7ZXJyOiN9IiwKKyAgICAgICAgICAgICAgICAgICAgcGF0aC5kaXNwbGF5KCkKKyAgICAg ICAgICAgICAgICApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gRXJyKGVy cik7CisgICAgICAgIH0KKworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICAvLy8gTWVyZ2Ug YHRhc2tzYCB3aXRoIGFuIGV4aXN0aW5nIGFyY2hpdmUgZmlsZS4KKyAgICAvLy8gVGhpcyBmdW5j dGlvbiBhc3N1bWVzIHRoYXQgYHRhc2tzYCBhbmQgdGhlIHByZS1leGlzdGluZyBjb250ZW50cyBv ZiB0aGUgYXJjaGl2ZQorICAgIC8vLyBmaWxlIGFyZSBib3RoIHNvcnRlZCBkZXNjZW5kaW5nIGJ5 IHN0YXJ0dGltZSAobW9zdCByZWNlbnQgdGFza3MgY29tZSBmaXJzdCkuCisgICAgLy8vIFRoZSB0 YXNrIGFyY2hpdmUgbXVzdCBiZSBsb2NrZWQgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisg ICAgZm4gbWVyZ2Vfc2luZ2xlX2FyY2hpdmVfZmlsZSgKKyAgICAgICAgJnNlbGYsCisgICAgICAg IHRhc2tzOiBWZWM8VGFza0NhY2hlSXRlbT4sCisgICAgICAgIGZpbGU6ICZBcmNoaXZlRmlsZSwK KyAgICApIC0+IFJlc3VsdDwoKSwgRXJyb3I+IHsKKyAgICAgICAgaWYgdGFza3MuaXNfZW1wdHko KSB7CisgICAgICAgICAgICByZXR1cm4gT2soKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8g VE9ETzogTWlnaHQgYmUgbmljZSB0byBhbHNvIG1vdmUgdGhpcyB0byBBcmNoaXZlRmlsZQorICAg ICAgICBsZXQgKHRlbXBfZmlsZSwgdGVtcF9maWxlX3BhdGgpID0KKyAgICAgICAgICAgIHByb3ht b3hfc3lzOjpmczo6bWFrZV90bXBfZmlsZSgmZmlsZS5wYXRoLCBzZWxmLmNhY2hlLmNyZWF0ZV9v cHRpb25zKT87CisgICAgICAgIGxldCBtdXQgd3JpdGVyID0gaWYgZmlsZS5jb21wcmVzc2VkIHsK KyAgICAgICAgICAgIGxldCBlbmNvZGVyID0KKyAgICAgICAgICAgICAgICB6c3RkOjpzdHJlYW06 OndyaXRlOjpFbmNvZGVyOjpuZXcodGVtcF9maWxlLCB6c3RkOjpERUZBVUxUX0NPTVBSRVNTSU9O X0xFVkVMKT8KKyAgICAgICAgICAgICAgICAgICAgLmF1dG9fZmluaXNoKCk7CisgICAgICAgICAg ICBCb3g6Om5ldyhCdWZXcml0ZXI6Om5ldyhlbmNvZGVyKSkgYXMgQm94PGR5biBXcml0ZT4KKyAg ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEJveDo6bmV3KEJ1ZldyaXRlcjo6bmV3KHRlbXBf ZmlsZSkpIGFzIEJveDxkeW4gV3JpdGU+CisgICAgICAgIH07CisKKyAgICAgICAgbGV0IGFyY2hp dmVfaXRlciA9IGZpbGUKKyAgICAgICAgICAgIC5pdGVyKCk/CisgICAgICAgICAgICAuZmxhdF9t YXAofGl0ZW18IG1hdGNoIGl0ZW0geworICAgICAgICAgICAgICAgIE9rKGl0ZW0pID0+IFNvbWUo aXRlbSksCisgICAgICAgICAgICAgICAgRXJyKGVycikgPT4geworICAgICAgICAgICAgICAgICAg ICBsb2c6OmVycm9yISgiY291bGQgbm90IHJlYWQgdGFzayBjYWNoZSBpdGVtIHdoaWxlIG1lcmdp bmc6IHtlcnI6I30iKTsKKyAgICAgICAgICAgICAgICAgICAgTm9uZQorICAgICAgICAgICAgICAg IH0KKyAgICAgICAgICAgIH0pCisgICAgICAgICAgICAucGVla2FibGUoKTsKKyAgICAgICAgbGV0 IHRhc2tfaXRlciA9IHRhc2tzLmludG9faXRlcigpLnBlZWthYmxlKCk7CisKKyAgICAgICAgU2Vs Zjo6d3JpdGVfdGFza3MoJm11dCB3cml0ZXIsIE1lcmdlVGFza0l0ZXJhdG9yOjpuZXcoYXJjaGl2 ZV9pdGVyLCB0YXNrX2l0ZXIpKT87CisKKyAgICAgICAgaWYgbGV0IEVycihlcnIpID0gd3JpdGVy LmZsdXNoKCkgeworICAgICAgICAgICAgbG9nOjplcnJvciEoImNvdWxkIG5vdCBmbHVzaCBCdWZX cml0ZXIgZm9yIHtmaWxlOj99OiB7ZXJyOiN9Iik7CisgICAgICAgIH0KKyAgICAgICAgZHJvcCh3 cml0ZXIpOworCisgICAgICAgIGlmIGxldCBFcnIoZXJyKSA9IHN0ZDo6ZnM6OnJlbmFtZSgmdGVt cF9maWxlX3BhdGgsICZmaWxlLnBhdGgpLndpdGhfY29udGV4dCh8fCB7CisgICAgICAgICAgICBm b3JtYXQhKAorICAgICAgICAgICAgICAgICJmYWlsZWQgdG8gcmVwbGFjZSB7fSB3aXRoIHt9IiwK KyAgICAgICAgICAgICAgICBmaWxlLnBhdGguZGlzcGxheSgpLAorICAgICAgICAgICAgICAgIHRl bXBfZmlsZV9wYXRoLmRpc3BsYXkoKQorICAgICAgICAgICAgKQorICAgICAgICB9KSB7CisgICAg ICAgICAgICBpZiBsZXQgRXJyKGVycikgPSBzdGQ6OmZzOjpyZW1vdmVfZmlsZSgmdGVtcF9maWxl X3BhdGgpIHsKKyAgICAgICAgICAgICAgICBsb2c6OmVycm9yISgKKyAgICAgICAgICAgICAgICAg ICAgImZhaWxlZCB0byBjbGVhbiB1cCB0ZW1wb3JhcnkgZmlsZSB7fToge2VycjojfSIsCisgICAg ICAgICAgICAgICAgICAgIHRlbXBfZmlsZV9wYXRoLmRpc3BsYXkoKQorICAgICAgICAgICAgICAg ICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBFcnIoZXJyKTsKKyAgICAg ICAgfQorCisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIC8vLyBXcml0ZSBhbiBpdGVyYXRv ciBvZiBbYFRhc2tDYWNoZUl0ZW1gXSB0byBhIHNvbWV0aGluZyB0aGF0IGltcGxlbWVudHMgW2BX cml0ZWBdLgorICAgIC8vLyBUaGUgaW5kaXZpZHVhbCBpdGVtcyBhcmUgZW5jb2RlZCBhcyBKU09O IGZvbGxvd2VkIGJ5IGEgbmV3bGluZS4KKyAgICBmbiB3cml0ZV90YXNrcygKKyAgICAgICAgd3Jp dGVyOiAmbXV0IGltcGwgV3JpdGUsCisgICAgICAgIHRhc2tzOiBpbXBsIEl0ZXJhdG9yPEl0ZW0g PSBUYXNrQ2FjaGVJdGVtPiwKKyAgICApIC0+IFJlc3VsdDwoKSwgRXJyb3I+IHsKKyAgICAgICAg Zm9yIHRhc2sgaW4gdGFza3MgeworICAgICAgICAgICAgc2VyZGVfanNvbjo6dG9fd3JpdGVyKCZt dXQgKndyaXRlciwgJnRhc2spPzsKKyAgICAgICAgICAgIHdyaXRlbG4hKHdyaXRlcik/OworICAg ICAgICB9CisKKyAgICAgICAgT2soKCkpCisgICAgfQorfQorCitpbXBsIFRhc2tDYWNoZSB7Cisg ICAgLy8vIENyZWF0ZSBhIG5ldyB0YXNrIGNhY2hlIGluc3RhbmNlLgorICAgIC8vLworICAgIC8v LyBSZW1lbWJlciB0byBjYWxsIGBpbml0YCBvciBgbmV3X2ZpbGVgIG9uIGEgbG9ja2VkLCB3cml0 YWJsZSBUYXNrQ2FjaGUKKyAgICAvLy8gdG8gY3JlYXRlIHRoZSBpbml0aWFsIGFyY2hpdmUgZmls ZXMuCisgICAgcHViIGZuIG5ldzxQOiBBc1JlZjxQYXRoPj4oCisgICAgICAgIHBhdGg6IFAsCisg ICAgICAgIGNyZWF0ZV9vcHRpb25zOiBDcmVhdGVPcHRpb25zLAorICAgICAgICBtYXhfZmlsZXM6 IHUzMiwKKyAgICAgICAgdW5jb21wcmVzc2VkOiB1MzIsCisgICAgICAgIHJvdGF0ZV9hZnRlcjog dTY0LAorICAgICAgICBqb3VybmFsX21heF9zaXplOiB1NjQsCisgICAgKSAtPiBSZXN1bHQ8U2Vs ZiwgRXJyb3I+IHsKKyAgICAgICAgT2soU2VsZiB7CisgICAgICAgICAgICBiYXNlX3BhdGg6IHBh dGguYXNfcmVmKCkuaW50bygpLAorICAgICAgICAgICAgY3JlYXRlX29wdGlvbnMsCisgICAgICAg ICAgICBqb3VybmFsX21heF9zaXplLAorICAgICAgICAgICAgbWF4X2ZpbGVzLAorICAgICAgICAg ICAgcm90YXRlX2FmdGVyLAorICAgICAgICAgICAgdW5jb21wcmVzc2VkX2ZpbGVzOiB1bmNvbXBy ZXNzZWQsCisgICAgICAgIH0pCisgICAgfQorCisgICAgLy8vIExvY2sgdGhlIGNhY2hlIGZvciBy ZWFkaW5nLgorICAgIHB1YiBmbiByZWFkKHNlbGYpIC0+IFJlc3VsdDxSZWFkYWJsZVRhc2tDYWNo ZSwgRXJyb3I+IHsKKyAgICAgICAgbGV0IGxvY2sgPSBzZWxmLmxvY2tfaW1wbChmYWxzZSk/Owor CisgICAgICAgIE9rKFJlYWRhYmxlVGFza0NhY2hlIHsgY2FjaGU6IHNlbGYsIGxvY2sgfSkKKyAg ICB9CisKKyAgICAvLy8gTG9jayB0aGUgY2FjaGUgZm9yIHdyaXRpbmcuCisgICAgcHViIGZuIHdy aXRlKHNlbGYpIC0+IFJlc3VsdDxXcml0YWJsZVRhc2tDYWNoZSwgRXJyb3I+IHsKKyAgICAgICAg bGV0IGxvY2sgPSBzZWxmLmxvY2tfaW1wbCh0cnVlKT87CisKKyAgICAgICAgT2soV3JpdGFibGVU YXNrQ2FjaGUgeyBjYWNoZTogc2VsZiwgbG9jayB9KQorICAgIH0KKworICAgIGZuIGxvY2tfaW1w bCgmc2VsZiwgZXhjbHVzaXZlOiBib29sKSAtPiBSZXN1bHQ8VGFza0NhY2hlTG9jaywgRXJyb3I+ IHsKKyAgICAgICAgbGV0IGxvY2tmaWxlID0gc2VsZi5iYXNlX3BhdGguam9pbihMT0NLRklMRV9G SUxFTkFNRSk7CisKKyAgICAgICAgT2soVGFza0NhY2hlTG9jayhwcm94bW94X3N5czo6ZnM6Om9w ZW5fZmlsZV9sb2NrZWQoCisgICAgICAgICAgICBsb2NrZmlsZSwKKyAgICAgICAgICAgIER1cmF0 aW9uOjpmcm9tX3NlY3MoMTApLAorICAgICAgICAgICAgZXhjbHVzaXZlLAorICAgICAgICAgICAg c2VsZi5jcmVhdGVfb3B0aW9ucywKKyAgICAgICAgKT8pKQorICAgIH0KKworICAgIC8vLyBSZWFk IHRoZSBzdGF0ZSBmaWxlLgorICAgIC8vLyBJZiB0aGUgc3RhdGUgZmlsZSBjb3VsZCBub3QgYmUg cmVhZCBvciBkb2VzIG5vdCBleGlzdCwgdGhlIGRlZmF1bHQgKGVtcHR5KSBzdGF0ZQorICAgIC8v LyBpcyByZXR1cm5lZC4KKyAgICBwdWIgZm4gcmVhZF9zdGF0ZSgmc2VsZikgLT4gU3RhdGUgewor ICAgICAgICBmbiBkb19yZWFkX3N0YXRlKHBhdGg6ICZQYXRoKSAtPiBSZXN1bHQ8U3RhdGUsIEVy cm9yPiB7CisgICAgICAgICAgICBtYXRjaCBzdGQ6OmZzOjpyZWFkKHBhdGgpIHsKKyAgICAgICAg ICAgICAgICBPayhjb250ZW50KSA9PiBzZXJkZV9qc29uOjpmcm9tX3NsaWNlKCZjb250ZW50KS5t YXBfZXJyKHxlcnJ8IGVyci5pbnRvKCkpLAorICAgICAgICAgICAgICAgIEVycihlcnIpIGlmIGVy ci5raW5kKCkgPT0gRXJyb3JLaW5kOjpOb3RGb3VuZCA9PiBPayhEZWZhdWx0OjpkZWZhdWx0KCkp LAorICAgICAgICAgICAgICAgIEVycihlcnIpID0+IEVycihlcnIuaW50bygpKSwKKyAgICAgICAg ICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGxldCBwYXRoID0gc2VsZi5iYXNlX3BhdGguam9p bihTVEFURV9GSUxFTkFNRSk7CisgICAgICAgIGRvX3JlYWRfc3RhdGUoJnBhdGgpLnVud3JhcF9v cl9lbHNlKHxlcnJ8IHsKKyAgICAgICAgICAgIGxvZzo6ZXJyb3IhKCJjb3VsZCBub3QgcmVhZCBz dGF0ZSBmaWxlOiB7ZXJyOiN9Iik7CisgICAgICAgICAgICBEZWZhdWx0OjpkZWZhdWx0KCkKKyAg ICAgICAgfSkKKyAgICB9CisKKyAgICBmbiBnZXRfdGFza3NfaW1wbDwnYT4oCisgICAgICAgICZz ZWxmLAorICAgICAgICBtb2RlOiBHZXRUYXNrcywKKyAgICAgICAgbG9jazogJidhIFRhc2tDYWNo ZUxvY2ssCisgICAgKSAtPiBSZXN1bHQ8VGFza0FyY2hpdmVJdGVyYXRvcjwnYT4sIEVycm9yPiB7 CisgICAgICAgIGxldCBqb3VybmFsX2ZpbGUgPSBzZWxmLmJhc2VfcGF0aC5qb2luKFdBTF9GSUxF TkFNRSk7CisgICAgICAgIGxldCBhY3RpdmVfcGF0aCA9IHNlbGYuYmFzZV9wYXRoLmpvaW4oQUNU SVZFX0ZJTEVOQU1FKTsKKworICAgICAgICBtYXRjaCBtb2RlIHsKKyAgICAgICAgICAgIEdldFRh c2tzOjpBbGwgPT4geworICAgICAgICAgICAgICAgIGxldCBtdXQgYXJjaGl2ZV9maWxlcyA9IHNl bGYuYXJjaGl2ZV9maWxlcyhsb2NrKT87CisgICAgICAgICAgICAgICAgYXJjaGl2ZV9maWxlcy5y ZXZlcnNlKCk7CisKKyAgICAgICAgICAgICAgICBpZiBhY3RpdmVfcGF0aC5leGlzdHMoKSB7Cisg ICAgICAgICAgICAgICAgICAgIGFyY2hpdmVfZmlsZXMucHVzaChBcmNoaXZlRmlsZSB7CisgICAg ICAgICAgICAgICAgICAgICAgICBwYXRoOiBzZWxmLmJhc2VfcGF0aC5qb2luKEFDVElWRV9GSUxF TkFNRSksCisgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2VkOiBmYWxzZSwKKyAgICAg ICAgICAgICAgICAgICAgICAgIHN0YXJ0dGltZTogMCwKKyAgICAgICAgICAgICAgICAgICAgfSk7 CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgVGFza0FyY2hpdmVJdGVyYXRv cjo6bmV3KFNvbWUoam91cm5hbF9maWxlKSwgYXJjaGl2ZV9maWxlcywgbG9jaykKKyAgICAgICAg ICAgIH0KKyAgICAgICAgICAgIEdldFRhc2tzOjpBY3RpdmUgPT4geworICAgICAgICAgICAgICAg IGxldCBtdXQgYXJjaGl2ZV9maWxlcyA9IFZlYzo6bmV3KCk7CisKKyAgICAgICAgICAgICAgICBp ZiBhY3RpdmVfcGF0aC5leGlzdHMoKSB7CisgICAgICAgICAgICAgICAgICAgIGFyY2hpdmVfZmls ZXMucHVzaChBcmNoaXZlRmlsZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBzZWxm LmJhc2VfcGF0aC5qb2luKEFDVElWRV9GSUxFTkFNRSksCisgICAgICAgICAgICAgICAgICAgICAg ICBjb21wcmVzc2VkOiBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0dGltZTog MCwKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAg ICAgICAgICAgVGFza0FyY2hpdmVJdGVyYXRvcjo6bmV3KE5vbmUsIGFyY2hpdmVfZmlsZXMsIGxv Y2spCisgICAgICAgICAgICB9CisgICAgICAgICAgICAjW2NmZyh0ZXN0KV0KKyAgICAgICAgICAg IEdldFRhc2tzOjpBcmNoaXZlZCA9PiB7CisgICAgICAgICAgICAgICAgbGV0IG11dCBmaWxlcyA9 IHNlbGYuYXJjaGl2ZV9maWxlcyhsb2NrKT87CisgICAgICAgICAgICAgICAgZmlsZXMucmV2ZXJz ZSgpOworCisgICAgICAgICAgICAgICAgVGFza0FyY2hpdmVJdGVyYXRvcjo6bmV3KFNvbWUoam91 cm5hbF9maWxlKSwgZmlsZXMsIGxvY2spCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9 CisKKyAgICAvLy8gUmV0dXJucyBhIGxpc3Qgb2YgZXhpc3RpbmcgYXJjaGl2ZSBmaWxlcywgdG9n ZXRoZXIgd2l0aCB0aGVpciByZXNwZWN0aXZlCisgICAgLy8vIGN1dC1vZmYgdGltZXN0YW1wLiBU aGUgcmVzdWx0IGlzIHNvcnRlZCBhc2NlbmRpbmcgYnkgY3V0LW9mZiB0aW1lc3RhbXAgKG1vc3Qg cmVjZW50IG9uZQorICAgIC8vLyBmaXJzdCkuCisgICAgLy8vIFRoZSB0YXNrIGFyY2hpdmUgc2hv dWxkIGJlIGxvY2tlZCBmb3IgcmVhZGluZyB3aGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAg ICBmbiBhcmNoaXZlX2ZpbGVzKCZzZWxmLCBfbG9jazogJlRhc2tDYWNoZUxvY2spIC0+IFJlc3Vs dDxWZWM8QXJjaGl2ZUZpbGU+LCBFcnJvcj4geworICAgICAgICBsZXQgbXV0IG5hbWVzID0gVmVj OjpuZXcoKTsKKworICAgICAgICBmb3IgZW50cnkgaW4gc3RkOjpmczo6cmVhZF9kaXIoJnNlbGYu YmFzZV9wYXRoKT8geworICAgICAgICAgICAgbGV0IGVudHJ5ID0gZW50cnk/OworCisgICAgICAg ICAgICBsZXQgcGF0aCA9IGVudHJ5LnBhdGgoKTsKKworICAgICAgICAgICAgaWYgbGV0IFNvbWUo ZmlsZSkgPSBTZWxmOjpwYXJzZV9hcmNoaXZlX2ZpbGVuYW1lKCZwYXRoKSB7CisgICAgICAgICAg ICAgICAgbmFtZXMucHVzaChmaWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAg ICAgIG5hbWVzLnNvcnRfYnlfa2V5KHxlfCAtZS5zdGFydHRpbWUpOworCisgICAgICAgIE9rKG5h bWVzKQorICAgIH0KKworICAgIGZuIHBhcnNlX2FyY2hpdmVfZmlsZW5hbWUocGF0aDogJlBhdGgp IC0+IE9wdGlvbjxBcmNoaXZlRmlsZT4geworICAgICAgICBsZXQgZmlsZW5hbWUgPSBwYXRoLmZp bGVfbmFtZSgpPy50b19zdHIoKT87CisgICAgICAgIGxldCBmaWxlbmFtZSA9IGZpbGVuYW1lLnN0 cmlwX3ByZWZpeChBUkNISVZFX0ZJTEVOQU1FX1BSRUZJWCk/OworCisgICAgICAgIGlmIGxldCBT b21lKHN0YXJ0dGltZSkgPSBmaWxlbmFtZS5zdHJpcF9zdWZmaXgoWlNURF9FWFRFTlNJT05fV0lU SF9ET1QpIHsKKyAgICAgICAgICAgIGxldCBzdGFydHRpbWU6IGk2NCA9IHN0YXJ0dGltZS5wYXJz ZSgpLm9rKCk/OworCisgICAgICAgICAgICBTb21lKEFyY2hpdmVGaWxlIHsKKyAgICAgICAgICAg ICAgICBwYXRoOiBwYXRoLnRvX3BhdGhfYnVmKCksCisgICAgICAgICAgICAgICAgY29tcHJlc3Nl ZDogdHJ1ZSwKKyAgICAgICAgICAgICAgICBzdGFydHRpbWUsCisgICAgICAgICAgICB9KQorICAg ICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGV0IHN0YXJ0dGltZTogaTY0ID0gZmlsZW5hbWUu cGFyc2UoKS5vaygpPzsKKworICAgICAgICAgICAgU29tZShBcmNoaXZlRmlsZSB7CisgICAgICAg ICAgICAgICAgcGF0aDogcGF0aC50b19wYXRoX2J1ZigpLAorICAgICAgICAgICAgICAgIGNvbXBy ZXNzZWQ6IGZhbHNlLAorICAgICAgICAgICAgICAgIHN0YXJ0dGltZSwKKyAgICAgICAgICAgIH0p CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLyBDb21wYXJpc29uIGZ1bmN0aW9uIGZvciBzb3J0 aW5nIHRhc2tzLgorLy8vIFRoZSB0YXNrcyBhcmUgY29tcGFyZWQgYmFzZWQgb24gdGhlIHRhc2sn cyBzdGFydCB0aW1lLCBmYWxsaW5nCisvLy8gYmFjayB0byB0aGUgdGFzaydzIFVQSUQgYXMgYSBz ZWNvbmRhcnkgY3JpdGVyaW9uIGluIGNhc2UgdGhlCisvLy8gc3RhcnQgdGltZXMgYXJlIGVxdWFs LgorZm4gY29tcGFyZV90YXNrcyhhOiAmVGFza0NhY2hlSXRlbSwgYjogJlRhc2tDYWNoZUl0ZW0p IC0+IE9yZGVyaW5nIHsKKyAgICBhLnN0YXJ0dGltZQorICAgICAgICAuY21wKCZiLnN0YXJ0dGlt ZSkKKyAgICAgICAgLnRoZW5fd2l0aCh8fCBiLnVwaWQudG9fc3RyaW5nKCkuY21wKCZhLnVwaWQu dG9fc3RyaW5nKCkpKQorfQorCisvLy8gQ29tcGFyaXNvbiBmdW5jdGlvbiBmb3Igc29ydGluZyB0 YXNrcywgcmV2ZXJzZWQKKy8vLyBUaGUgdGFza3MgYXJlIGNvbXBhcmVkIGJhc2VkIG9uIHRoZSB0 YXNrJ3Mgc3RhcnQgdGltZSwgZmFsbGluZworLy8vIGJhY2sgdG8gdGhlIHRhc2sncyBVUElEIGFz IGEgc2Vjb25kYXJ5IGNyaXRlcmlvbiBpbiBjYXNlIHRoZQorLy8vIHN0YXJ0IHRpbWVzIGFyZSBl cXVhbC4KK2ZuIGNvbXBhcmVfdGFza3NfcmV2ZXJzZShhOiAmVGFza0NhY2hlSXRlbSwgYjogJlRh c2tDYWNoZUl0ZW0pIC0+IE9yZGVyaW5nIHsKKyAgICBjb21wYXJlX3Rhc2tzKGIsIGEpCit9CisK Ky8vLyBJdGVyYXRvciBvdmVyIHRoZSB0YXNrIGFyY2hpdmUuCitwdWIgc3RydWN0IFRhc2tBcmNo aXZlSXRlcmF0b3I8J2E+IHsKKyAgICBpbm5lcjogQm94PGR5biBJdGVyYXRvcjxJdGVtID0gVGFz a0NhY2hlSXRlbT4+LAorCisgICAgLy8vIExvY2sgZm9yIHRoaXMgYXJjaGl2ZS4gVGhpcyBjb250 YWlucyB0aGUgbG9jayBpbiBjYXNlIHdlCisgICAgLy8vIG5lZWQgdG8ga2VlcCB0aGUgYXJjaGl2 ZSBsb2NrZWQgd2hpbGUgaXRlcmF0aW5nIG92ZXIgaXQuCisgICAgX2xvY2s6ICYnYSBUYXNrQ2Fj aGVMb2NrLAorfQorCitpbXBsPCdhPiBUYXNrQXJjaGl2ZUl0ZXJhdG9yPCdhPiB7CisgICAgLy8v IENyZWF0ZSBhIG5ldyB0YXNrIGFyY2hpdmUgaXRlcmF0b3IuCisgICAgLy8vCisgICAgLy8vIGBm aWxlc2Agc2hvdWxkIGJlIHNvcnRlZCB3aXRoIHRoZSBtb3N0IHJlY2VudCBhcmNoaXZlIGZpbGUg Kmxhc3QqLgorICAgIGZuIG5ldygKKyAgICAgICAgam91cm5hbDogT3B0aW9uPFBhdGhCdWY+LAor ICAgICAgICBmaWxlczogVmVjPEFyY2hpdmVGaWxlPiwKKyAgICAgICAgbG9jazogJidhIFRhc2tD YWNoZUxvY2ssCisgICAgKSAtPiBSZXN1bHQ8U2VsZiwgRXJyb3I+IHsKKyAgICAgICAgbGV0IGlu bmVyID0gSW5uZXJUYXNrQXJjaGl2ZUl0ZXJhdG9yOjpuZXcoZmlsZXMpCisgICAgICAgICAgICAu ZmlsdGVyX21hcCh8cmVzfCBtYXRjaCByZXMgeworICAgICAgICAgICAgICAgIE9rKHRhc2spID0+ IFNvbWUodGFzayksCisgICAgICAgICAgICAgICAgRXJyKGVycikgPT4geworICAgICAgICAgICAg ICAgICAgICBsb2c6OmVycm9yISgiY291bGQgbm90IHJlYWQgdGFzayBmcm9tIGFyY2hpdmUgZmls ZToge2VycjojfSIpOworICAgICAgICAgICAgICAgICAgICBOb25lCisgICAgICAgICAgICAgICAg fQorICAgICAgICAgICAgfSkKKyAgICAgICAgICAgIC5wZWVrYWJsZSgpOworCisgICAgICAgIGlm IGxldCBTb21lKGpvdXJuYWwpID0gam91cm5hbCB7CisgICAgICAgICAgICBsZXQgam91cm5hbF9y ZWFkZXIgPSBCb3g6Om5ldyhCdWZSZWFkZXI6Om5ldyhGaWxlOjpvcGVuKGpvdXJuYWwpPykpOwor ICAgICAgICAgICAgbGV0IGpvdXJuYWxfdGFza19pdGVyYXRvciA9IEpvdXJuYWxJdGVyYXRvcjo6 bmV3KGpvdXJuYWxfcmVhZGVyKS5wZWVrYWJsZSgpOworICAgICAgICAgICAgbGV0IG1lcmdlX3Rh c2tfaXRlciA9IE1lcmdlVGFza0l0ZXJhdG9yOjpuZXcoam91cm5hbF90YXNrX2l0ZXJhdG9yLCBp bm5lcik7CisKKyAgICAgICAgICAgIE9rKFNlbGYgeworICAgICAgICAgICAgICAgIGlubmVyOiBC b3g6Om5ldyhtZXJnZV90YXNrX2l0ZXIpLAorICAgICAgICAgICAgICAgIF9sb2NrOiBsb2NrLAor ICAgICAgICAgICAgfSkKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE9rKFNlbGYgewor ICAgICAgICAgICAgICAgIGlubmVyOiBCb3g6Om5ldyhpbm5lciksCisgICAgICAgICAgICAgICAg X2xvY2s6IGxvY2ssCisgICAgICAgICAgICB9KQorICAgICAgICB9CisgICAgfQorfQorCitpbXBs IEl0ZXJhdG9yIGZvciBUYXNrQXJjaGl2ZUl0ZXJhdG9yPCdfPiB7CisgICAgdHlwZSBJdGVtID0g VGFza0NhY2hlSXRlbTsKKworICAgIGZuIG5leHQoJm11dCBzZWxmKSAtPiBPcHRpb248U2VsZjo6 SXRlbT4geworICAgICAgICBzZWxmLmlubmVyLm5leHQoKQorICAgIH0KK30KKworc3RydWN0IElu bmVyVGFza0FyY2hpdmVJdGVyYXRvciB7CisgICAgLy8vIEFyY2hpdmUgZmlsZXMgdG8gcmVhZC4K KyAgICBmaWxlczogVmVjPEFyY2hpdmVGaWxlPiwKKyAgICAvLy8gQXJjaGl2ZSBpdGVyYXRvciB3 ZSBhcmUgY3VycmVudGx5IHVzaW5nLCBpZiBhbnkKKyAgICBjdXJyZW50OiBPcHRpb248QXJjaGl2 ZUl0ZXJhdG9yPiwKK30KKworaW1wbCBJbm5lclRhc2tBcmNoaXZlSXRlcmF0b3IgeworICAgIC8v LyBDcmVhdGUgYSBuZXcgdGFzayBhcmNoaXZlIGl0ZXJhdG9yLgorICAgIHB1YiBmbiBuZXcoZmls ZXM6IFZlYzxBcmNoaXZlRmlsZT4pIC0+IFNlbGYgeworICAgICAgICBTZWxmIHsKKyAgICAgICAg ICAgIGZpbGVzLAorICAgICAgICAgICAgY3VycmVudDogTm9uZSwKKyAgICAgICAgfQorICAgIH0K K30KKworaW1wbCBJdGVyYXRvciBmb3IgSW5uZXJUYXNrQXJjaGl2ZUl0ZXJhdG9yIHsKKyAgICB0 eXBlIEl0ZW0gPSBSZXN1bHQ8VGFza0NhY2hlSXRlbSwgRXJyb3I+OworCisgICAgZm4gbmV4dCgm bXV0IHNlbGYpIC0+IE9wdGlvbjxTZWxmOjpJdGVtPiB7CisgICAgICAgIGxvb3AgeworICAgICAg ICAgICAgbWF0Y2ggJm11dCBzZWxmLmN1cnJlbnQgeworICAgICAgICAgICAgICAgIFNvbWUoY3Vy cmVudCkgPT4geworICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dCA9IGN1cnJlbnQubmV4dCgp OworICAgICAgICAgICAgICAgICAgICBpZiBuZXh0LmlzX3NvbWUoKSB7CisgICAgICAgICAgICAg ICAgICAgICAgICByZXR1cm4gbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAg ICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudCA9IE5vbmU7CisgICAgICAgICAgICAg ICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTm9uZSA9PiAnaW5u ZXI6IGxvb3AgeworICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm5zIGBOb25lYCBpZiBubyBt b3JlIGZpbGVzIGFyZSBhdmFpbGFibGUsIHN0b3BwaW5nIGl0ZXJhdGlvbi4KKyAgICAgICAgICAg ICAgICAgICAgbGV0IG5leHRfZmlsZSA9IHNlbGYuZmlsZXMucG9wKCk/OworCisgICAgICAgICAg ICAgICAgICAgIG1hdGNoIG5leHRfZmlsZS5pdGVyKCkgeworICAgICAgICAgICAgICAgICAgICAg ICAgT2soaXRlcikgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VycmVu dCA9IFNvbWUoaXRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgJ2lubmVy OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgRXJy KGVycikgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZzo6ZXJyb3IhKCJjb3Vs ZCBub3QgY3JlYXRlIGFyY2hpdmUgaXRlcmF0b3Igd2hpbGUgaXRlcmF0aW9uIG92ZXIgdGFzayBh cmNoaXZlIGZpbGVzLCBza2lwcGluZzoge2VycjojfSIpCisgICAgICAgICAgICAgICAgICAgICAg ICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAg ICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvLy8gQXJjaGl2ZSBmaWxlLgorI1tkZXJpdmUo Q2xvbmUsIERlYnVnKV0KK3N0cnVjdCBBcmNoaXZlRmlsZSB7CisgICAgLy8vIFRoZSBwYXRoIHRv IHRoZSBhcmNoaXZlIGZpbGUuCisgICAgcGF0aDogUGF0aEJ1ZiwKKyAgICAvLy8gVGhpcyBhcmNo aXZlIGZpbGUgaXMgY29tcHJlc3NlZCB1c2luZyB6c3RkLgorICAgIGNvbXByZXNzZWQ6IGJvb2ws CisgICAgLy8vIFRoZSBhcmNoaXZlJ3MgbG93ZXN0IHBlcm1pdHRlZCBzdGFydHRpbWUgKHNlY29u ZHMgc2luY2UgVU5JWCBlcG9jaCkuCisgICAgc3RhcnR0aW1lOiBpNjQsCit9CisKK2ltcGwgQXJj aGl2ZUZpbGUgeworICAgIC8vLyBDcmVhdGUgYW4gW2BBcmNoaXZlSXRlcmF0b3JgXSBmb3IgdGhp cyBmaWxlLgorICAgIGZuIGl0ZXIoJnNlbGYpIC0+IFJlc3VsdDxBcmNoaXZlSXRlcmF0b3IsIEVy cm9yPiB7CisgICAgICAgIGxldCBmZCA9IEZpbGU6Om9wZW4oJnNlbGYucGF0aCkKKyAgICAgICAg ICAgIC53aXRoX2NvbnRleHQofHwgZm9ybWF0ISgiZmFpbGVkIHRvIG9wZW4gYXJjaGl2ZSBmaWxl IHt9Iiwgc2VsZi5wYXRoLmRpc3BsYXkoKSkpPzsKKworICAgICAgICBsZXQgaXRlciA9IGlmIHNl bGYuY29tcHJlc3NlZCB7CisgICAgICAgICAgICBsZXQgcmVhZGVyID0genN0ZDo6c3RyZWFtOjpy ZWFkOjpEZWNvZGVyOjpuZXcoZmQpLndpdGhfY29udGV4dCh8fCB7CisgICAgICAgICAgICAgICAg Zm9ybWF0ISgKKyAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBjcmVhdGUgenN0ZCBkZWNv ZGVyIGZvciBhcmNoaXZlIGZpbGUge30iLAorICAgICAgICAgICAgICAgICAgICBzZWxmLnBhdGgu ZGlzcGxheSgpCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgfSk/OworICAgICAgICAg ICAgQXJjaGl2ZUl0ZXJhdG9yOjpuZXcoQm94OjpuZXcoQnVmUmVhZGVyOjpuZXcocmVhZGVyKSkp CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBcmNoaXZlSXRlcmF0b3I6Om5ldyhCb3g6 Om5ldyhCdWZSZWFkZXI6Om5ldyhmZCkpKQorICAgICAgICB9OworCisgICAgICAgIE9rKGl0ZXIp CisgICAgfQorCisgICAgZm4gY29tcHJlc3MoJm11dCBzZWxmLCBvcHRpb25zOiBDcmVhdGVPcHRp b25zKSAtPiBSZXN1bHQ8KCksIEVycm9yPiB7CisgICAgICAgIGxldCB1bmNvbXByZXNzZWRfZmls ZV9wYXRoID0gJnNlbGYucGF0aDsKKworICAgICAgICBsZXQgKHRlbXBfZmlsZSwgdGVtcF9maWxl X3BhdGgpID0KKyAgICAgICAgICAgIHByb3htb3hfc3lzOjpmczo6bWFrZV90bXBfZmlsZSh1bmNv bXByZXNzZWRfZmlsZV9wYXRoLCBvcHRpb25zKQorICAgICAgICAgICAgICAgIC5jb250ZXh0KCJm YWlsZWQgdG8gY3JlYXRlIHRlbXBvcmFyeSBmaWxlIik/OworCisgICAgICAgIGxldCB1bmNvbXBy ZXNzZWRfZmlsZSA9CisgICAgICAgICAgICBGaWxlOjpvcGVuKHVuY29tcHJlc3NlZF9maWxlX3Bh dGgpLmNvbnRleHQoImZhaWxlZCB0byBvcGVuIHVuY29tcHJlc3NlZCBmaWxlIik/OworCisgICAg ICAgIHpzdGQ6OnN0cmVhbTo6Y29weV9lbmNvZGUoCisgICAgICAgICAgICB1bmNvbXByZXNzZWRf ZmlsZSwKKyAgICAgICAgICAgIHRlbXBfZmlsZSwKKyAgICAgICAgICAgIHpzdGQ6OkRFRkFVTFRf Q09NUFJFU1NJT05fTEVWRUwsCisgICAgICAgICkKKyAgICAgICAgLmNvbnRleHQoInpzdGQ6OnN0 cmVhbTo6Y29weV9lbmNvZGUgZmFpbGVkIik/OworCisgICAgICAgIGxldCBtdXQgbmV3X3BhdGhf Zm9yX2NvbXByZXNzZWQgPSB1bmNvbXByZXNzZWRfZmlsZV9wYXRoLmNsb25lKCk7CisgICAgICAg IG5ld19wYXRoX2Zvcl9jb21wcmVzc2VkCisgICAgICAgICAgICAuc2V0X2V4dGVuc2lvbihmb3Jt YXQhKCJ7fXtaU1REX0VYVEVOU0lPTl9XSVRIX0RPVH0iLCBzZWxmLnN0YXJ0dGltZSkpOworCisg ICAgICAgIHN0ZDo6ZnM6OnJlbmFtZSgmdGVtcF9maWxlX3BhdGgsICZuZXdfcGF0aF9mb3JfY29t cHJlc3NlZCkKKyAgICAgICAgICAgIC5jb250ZXh0KCJmYWlsZWQgdG8gbW92ZSBjb21wcmVzc2Vk IHRhc2sgYWNoaXZlIGZpbGUiKT87CisgICAgICAgIHN0ZDo6ZnM6OnJlbW92ZV9maWxlKHVuY29t cHJlc3NlZF9maWxlX3BhdGgpCisgICAgICAgICAgICAuY29udGV4dCgiZmFpbGVkIHRvIHJlbW92 ZSB1bmNvbXByZXNzZWQgYXJjaGl2ZSBmaWxlIik/OworCisgICAgICAgIHNlbGYucGF0aCA9IG5l d19wYXRoX2Zvcl9jb21wcmVzc2VkOworICAgICAgICBzZWxmLmNvbXByZXNzZWQgPSB0cnVlOwor CisgICAgICAgIE9rKCgpKQorICAgIH0KK30KKworLy8vIEl0ZXJhdG9yIHRoYXQgbWVyZ2VzIHR3 byBfc29ydGVkXyBgSXRlcmF0b3I8SXRlbSA9IFRhc2tDYWNoZUl0ZW0+YCwgcmV0dXJuaW5nIHRo ZSBpdGVtcworLy8vIGZyb20gYm90aCBpdGVyYXRvcnMgc29ydGVkLgorLy8vIFRoZSB0d28gaXRl cmF0b3JzIGFyZSBleHBlY3RlZCB0byBiZSBzb3J0ZWQgZGVzY2VuZGluZ2x5IGJhc2VkIG9uIHRo ZSB0YXNrJ3Mgc3RhcnR0aW1lIGFuZAorLy8vIGFzY2VuZGluZ2x5IGJhc2VkIG9uIHRoZSB0YXNr J3MgVVBJRCdzIHN0cmluZyByZXByZXNlbnRhdGlvbi4gVGhpcyBjYW4gYmUKKy8vLyBhY2hpZXZl ZCBieSB1c2luZyB0aGUgW2Bjb21wYXJlX3Rhc2tzX3JldmVyc2VgXSBmdW5jdGlvbiB3aGVuIHNv cnRpbmcgYW4gYXJyYXkgb2YgdGFza3MuCitzdHJ1Y3QgTWVyZ2VUYXNrSXRlcmF0b3I8VDogSXRl cmF0b3I8SXRlbSA9IFRhc2tDYWNoZUl0ZW0+LCBVOiBJdGVyYXRvcjxJdGVtID0gVGFza0NhY2hl SXRlbT4+IHsKKyAgICBsZWZ0OiBQZWVrYWJsZTxUPiwKKyAgICByaWdodDogUGVla2FibGU8VT4s Cit9CisKK2ltcGw8VCwgVT4gTWVyZ2VUYXNrSXRlcmF0b3I8VCwgVT4KK3doZXJlCisgICAgVDog SXRlcmF0b3I8SXRlbSA9IFRhc2tDYWNoZUl0ZW0+LAorICAgIFU6IEl0ZXJhdG9yPEl0ZW0gPSBU YXNrQ2FjaGVJdGVtPiwKK3sKKyAgICAvLy8gQ3JlYXRlIGEgbmV3IG1lcmdpbmcgaXRlcmF0b3Iu CisgICAgZm4gbmV3KGxlZnQ6IFBlZWthYmxlPFQ+LCByaWdodDogUGVla2FibGU8VT4pIC0+IFNl bGYgeworICAgICAgICBTZWxmIHsgbGVmdCwgcmlnaHQgfQorICAgIH0KK30KKworaW1wbDxULCBV PiBJdGVyYXRvciBmb3IgTWVyZ2VUYXNrSXRlcmF0b3I8VCwgVT4KK3doZXJlCisgICAgVDogSXRl cmF0b3I8SXRlbSA9IFRhc2tDYWNoZUl0ZW0+LAorICAgIFU6IEl0ZXJhdG9yPEl0ZW0gPSBUYXNr Q2FjaGVJdGVtPiwKK3sKKyAgICB0eXBlIEl0ZW0gPSBUOjpJdGVtOworCisgICAgZm4gbmV4dCgm bXV0IHNlbGYpIC0+IE9wdGlvbjxUOjpJdGVtPiB7CisgICAgICAgIGxldCBvcmRlciA9IG1hdGNo IChzZWxmLmxlZnQucGVlaygpLCBzZWxmLnJpZ2h0LnBlZWsoKSkgeworICAgICAgICAgICAgKFNv bWUobCksIFNvbWUocikpID0+IFNvbWUoY29tcGFyZV90YXNrcyhsLCByKSksCisgICAgICAgICAg ICAoU29tZShfKSwgTm9uZSkgPT4gU29tZShPcmRlcmluZzo6R3JlYXRlciksCisgICAgICAgICAg ICAoTm9uZSwgU29tZShfKSkgPT4gU29tZShPcmRlcmluZzo6TGVzcyksCisgICAgICAgICAgICAo Tm9uZSwgTm9uZSkgPT4gTm9uZSwKKyAgICAgICAgfTsKKworICAgICAgICBtYXRjaCBvcmRlciB7 CisgICAgICAgICAgICBTb21lKE9yZGVyaW5nOjpHcmVhdGVyKSA9PiBzZWxmLmxlZnQubmV4dCgp LAorICAgICAgICAgICAgU29tZShPcmRlcmluZzo6TGVzcykgPT4gc2VsZi5yaWdodC5uZXh0KCks CisgICAgICAgICAgICBTb21lKE9yZGVyaW5nOjpFcXVhbCkgPT4geworICAgICAgICAgICAgICAg IC8vIERlZHVwIGJ5IGNvbnN1bWluZyB0aGUgb3RoZXIgaXRlcmF0b3IgYXMgd2VsbAorICAgICAg ICAgICAgICAgIGxldCBfID0gc2VsZi5yaWdodC5uZXh0KCk7CisgICAgICAgICAgICAgICAgc2Vs Zi5sZWZ0Lm5leHQoKQorICAgICAgICAgICAgfQorICAgICAgICAgICAgTm9uZSA9PiBOb25lLAor ICAgICAgICB9CisgICAgfQorfQorCisvLy8gSXRlcmF0b3IgZm9yIGEgc2luZ2xlIHRhc2sgYXJj aGl2ZSBmaWxlLgorLy8vCisvLy8gVGhpcyBpdGVyYXRvciBpbXBsZW1lbnRzIGBJdGVyYXRvcjxJ dGVtID0gUmVzdWx0PFRhc2tDYWNoZUl0ZW0sIEVycm9yPmAuIFdoZW4gaXRlcmF0aW5nLAorLy8v IHRhc2tzIGFyZSByZWFkIGxpbmUgYnkgbGluZSwgd2l0aG91dCBsZWFkaW5nIHRoZSBlbnRpcmUg YXJjaGl2ZSBmaWxlIGludG8gbWVtb3J5Lgorc3RydWN0IEFyY2hpdmVJdGVyYXRvciB7CisgICAg aXRlcjogTGluZXM8Qm94PGR5biBCdWZSZWFkPj4sCit9CisKK2ltcGwgQXJjaGl2ZUl0ZXJhdG9y IHsKKyAgICAvLy8gQ3JlYXRlIGEgbmV3IGl0ZXJhdG9yLgorICAgIHB1YiBmbiBuZXcocmVhZGVy OiBCb3g8ZHluIEJ1ZlJlYWQ+KSAtPiBTZWxmIHsKKyAgICAgICAgbGV0IGxpbmVzID0gcmVhZGVy LmxpbmVzKCk7CisKKyAgICAgICAgU2VsZiB7IGl0ZXI6IGxpbmVzIH0KKyAgICB9Cit9CisKK2lt cGwgSXRlcmF0b3IgZm9yIEFyY2hpdmVJdGVyYXRvciB7CisgICAgdHlwZSBJdGVtID0gUmVzdWx0 PFRhc2tDYWNoZUl0ZW0sIEVycm9yPjsKKworICAgIGZuIG5leHQoJm11dCBzZWxmKSAtPiBPcHRp b248U2VsZjo6SXRlbT4geworICAgICAgICBzZWxmLml0ZXIubmV4dCgpLm1hcCh8cmVzdWx0fCB7 CisgICAgICAgICAgICByZXN1bHQKKyAgICAgICAgICAgICAgICAuYW5kX3RoZW4ofGxpbmV8IE9r KHNlcmRlX2pzb246OmZyb21fc3RyKCZsaW5lKT8pKQorICAgICAgICAgICAgICAgIC5tYXBfZXJy KEludG86OmludG8pCisgICAgICAgIH0pCisgICAgfQorfQorCisvLy8gSXRlcmF0b3IgZm9yIGpv dXJuYWwgZmlsZXMuIFRoaXMgaXRlcmF0b3IgdXNlcyBbYEFyY2hpdmVJdGVyYXRvcmBdIGludGVy bmFsbHksIGJ1dCB3aWxsIGVhZ2VybHkKKy8vLyBsb2FkIGFsbCB0YXNrcyBpbnRvIG1lbW9yeSB0 byBzb3J0IGFuZCBkZWR1cGxpY2F0ZSB0aGVtLgorc3RydWN0IEpvdXJuYWxJdGVyYXRvciB7Cisg ICAgaW5uZXI6IEJveDxkeW4gSXRlcmF0b3I8SXRlbSA9IFRhc2tDYWNoZUl0ZW0+PiwKK30KKwor aW1wbCBKb3VybmFsSXRlcmF0b3IgeworICAgIGZuIG5ldyhmaWxlOiBCb3g8ZHluIEJ1ZlJlYWQ+ KSAtPiBTZWxmIHsKKyAgICAgICAgbGV0IGl0ZXIgPSBBcmNoaXZlSXRlcmF0b3I6Om5ldyhmaWxl KTsKKworICAgICAgICBsZXQgbXV0IHRhc2tzOiBWZWM8VGFza0NhY2hlSXRlbT4gPSBpdGVyCisg ICAgICAgICAgICAuZmxhdF9tYXAofHRhc2t8IG1hdGNoIHRhc2sgeworICAgICAgICAgICAgICAg IE9rKHRhc2spID0+IFNvbWUodGFzayksCisgICAgICAgICAgICAgICAgRXJyKGVycikgPT4gewor ICAgICAgICAgICAgICAgICAgICBsb2c6OmVycm9yISgiY291bGQgbm90IHJlYWQgdGFzayB3aGls ZSBpdGVyYXRpbmcgb3ZlciBhcmNoaXZlIGZpbGU6IHtlcnI6I30iKTsKKyAgICAgICAgICAgICAg ICAgICAgTm9uZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pCisgICAgICAgICAg ICAuY29sbGVjdCgpOworCisgICAgICAgIHRhc2tzLnNvcnRfYnkoY29tcGFyZV90YXNrc19yZXZl cnNlKTsKKyAgICAgICAgdGFza3MuZGVkdXAoKTsKKworICAgICAgICBTZWxmIHsKKyAgICAgICAg ICAgIGlubmVyOiBCb3g6Om5ldyh0YXNrcy5pbnRvX2l0ZXIoKSksCisgICAgICAgIH0KKyAgICB9 Cit9CisKK2ltcGwgSXRlcmF0b3IgZm9yIEpvdXJuYWxJdGVyYXRvciB7CisgICAgdHlwZSBJdGVt ID0gVGFza0NhY2hlSXRlbTsKKworICAgIGZuIG5leHQoJm11dCBzZWxmKSAtPiBPcHRpb248U2Vs Zjo6SXRlbT4geworICAgICAgICBzZWxmLmlubmVyLm5leHQoKQorICAgIH0KK30KKworI1tjZmco dGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdGQ6OmlvOjpDdXJzb3I7CisKKyAgICB1c2Ug Y3JhdGU6OnRlc3Rfc3VwcG9ydDo6dGVtcDo6TmFtZWRUZW1wRGlyOworCisgICAgdXNlIHN1cGVy OjoqOworCisgICAgI1t0ZXN0XQorICAgIGZuIGFyY2hpdmVfZmlsZW5hbWUoKSB7CisgICAgICAg IGxldCBhID0gVGFza0NhY2hlOjpwYXJzZV9hcmNoaXZlX2ZpbGVuYW1lKCZQYXRoQnVmOjpmcm9t KCIvdG1wL2FyY2hpdmUuMTAwMDAiKSkudW53cmFwKCk7CisKKyAgICAgICAgYXNzZXJ0X2VxIShh LnBhdGgsIFBhdGhCdWY6OmZyb20oIi90bXAvYXJjaGl2ZS4xMDAwMCIpKTsKKyAgICAgICAgYXNz ZXJ0X2VxIShhLnN0YXJ0dGltZSwgMTAwMDApOworICAgICAgICBhc3NlcnQhKCFhLmNvbXByZXNz ZWQpOworCisgICAgICAgIGxldCBhID0gVGFza0NhY2hlOjpwYXJzZV9hcmNoaXZlX2ZpbGVuYW1l KCZQYXRoQnVmOjpmcm9tKCIvdG1wL2FyY2hpdmUuMTIzNC56c3QiKSkudW53cmFwKCk7CisKKyAg ICAgICAgYXNzZXJ0X2VxIShhLnBhdGgsIFBhdGhCdWY6OmZyb20oIi90bXAvYXJjaGl2ZS4xMjM0 LnpzdCIpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShhLnN0YXJ0dGltZSwgMTIzNCk7CisgICAgICAg IGFzc2VydCEoYS5jb21wcmVzc2VkKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gYXJj aGl2ZV9pdGVyYXRvcigpIC0+IFJlc3VsdDwoKSwgRXJyb3I+IHsKKyAgICAgICAgbGV0IGZpbGUg PSByIyIKKyAgICAgICAgICAgIHsidXBpZCI6InB2ZS1yZW1vdGUhVVBJRDpwdmU6MDAwMzlFNEQ6 MDAyNjM4Qjg6NjdCNEE5RDE6c3RvcGFsbDo6cm9vdEBwYW06Iiwic3RhdHVzIjoiT0siLCJlbmR0 aW1lIjoxMjM0NSwgInN0YXJ0dGltZSI6IDEyMzR9CisgICAgICAgICAgICB7InVwaWQiOiJwYnMt cmVtb3RlIVVQSUQ6cGJzOjAwMDAwMkIyOjAwMDAwMTU4OjAwMDAwMDAwOjY3NEQ4MjhDOmxvZ3Jv dGF0ZTo6cm9vdEBwYW06Iiwic3RhdHVzIjoiT0siLCJlbmR0aW1lIjoxMjM0NSwgInN0YXJ0dGlt ZSI6IDEyMzR9CisgICAgICAgICAgICBpbnZhbGlkIiMKKyAgICAgICAgICAgIC50cmltX3N0YXJ0 KCk7CisKKyAgICAgICAgbGV0IGN1cnNvciA9IEJveDo6bmV3KEN1cnNvcjo6bmV3KGZpbGUuYXNf Ynl0ZXMoKSkpOworICAgICAgICBsZXQgbXV0IGl0ZXIgPSBBcmNoaXZlSXRlcmF0b3I6Om5ldyhj dXJzb3IpOworCisgICAgICAgIGFzc2VydF9lcSEoaXRlci5uZXh0KCkudW53cmFwKCkudW53cmFw KCkudXBpZC5yZW1vdGUoKSwgInB2ZS1yZW1vdGUiKTsKKyAgICAgICAgYXNzZXJ0X2VxIShpdGVy Lm5leHQoKS51bndyYXAoKS51bndyYXAoKS51cGlkLnJlbW90ZSgpLCAicGJzLXJlbW90ZSIpOwor ICAgICAgICBhc3NlcnQhKGl0ZXIubmV4dCgpLnVud3JhcCgpLmlzX2VycigpKTsKKyAgICAgICAg YXNzZXJ0IShpdGVyLm5leHQoKS5pc19ub25lKCkpOworCisgICAgICAgIE9rKCgpKQorICAgIH0K KworICAgIGZuIHRhc2soc3RhcnR0aW1lOiBpNjQsIGVuZGVkOiBib29sKSAtPiBUYXNrQ2FjaGVJ dGVtIHsKKyAgICAgICAgbGV0IChzdGF0dXMsIGVuZHRpbWUpID0gaWYgZW5kZWQgeworICAgICAg ICAgICAgKFNvbWUoIk9LIi5pbnRvKCkpLCBTb21lKHN0YXJ0dGltZSArIDEwKSkKKyAgICAgICAg fSBlbHNlIHsKKyAgICAgICAgICAgIChOb25lLCBOb25lKQorICAgICAgICB9OworCisgICAgICAg IFRhc2tDYWNoZUl0ZW0geworICAgICAgICAgICAgdXBpZDogZm9ybWF0ISgKKyAgICAgICAgICAg ICAgICAicHZlLXJlbW90ZSFVUElEOnB2ZTowMDAzOUU0RDowMDI2MzhCODp7c3RhcnR0aW1lOjA4 WH06c3RvcGFsbDo6cm9vdEBwYW06IgorICAgICAgICAgICAgKQorICAgICAgICAgICAgLnBhcnNl KCkKKyAgICAgICAgICAgIC51bndyYXAoKSwKKyAgICAgICAgICAgIHN0YXJ0dGltZSwKKyAgICAg ICAgICAgIHN0YXR1cywKKyAgICAgICAgICAgIGVuZHRpbWUsCisgICAgICAgIH0KKyAgICB9CisK KyAgICBmbiBhc3NlcnRfc3RhcnR0aW1lcyhjYWNoZTogJldyaXRhYmxlVGFza0NhY2hlLCBzdGFy dHRpbWVzOiAmW2k2NF0pIHsKKyAgICAgICAgbGV0IHRhc2tzOiBWZWM8aTY0PiA9IGNhY2hlCisg ICAgICAgICAgICAuZ2V0X3Rhc2tzKEdldFRhc2tzOjpBbGwpCisgICAgICAgICAgICAudW53cmFw KCkKKyAgICAgICAgICAgIC5tYXAofHRhc2t8IHRhc2suc3RhcnR0aW1lKQorICAgICAgICAgICAg LmNvbGxlY3QoKTsKKworICAgICAgICBhc3NlcnRfZXEhKCZ0YXNrcywgc3RhcnR0aW1lcyk7Cisg ICAgfQorCisgICAgZm4gYWRkX3Rhc2tzKGNhY2hlOiAmV3JpdGFibGVUYXNrQ2FjaGUsIHRhc2tz OiBWZWM8VGFza0NhY2hlSXRlbT4pIC0+IFJlc3VsdDwoKSwgRXJyb3I+IHsKKyAgICAgICAgbGV0 IG11dCBub2RlX21hcCA9IE5vZGVGZXRjaFN1Y2Nlc3NNYXA6OmRlZmF1bHQoKTsKKyAgICAgICAg bm9kZV9tYXAuc2V0X25vZGVfc3VjY2VzcygicHZlLXJlbW90ZSIudG9fc3RyaW5nKCksICJwdmUi LnRvX3N0cmluZygpKTsKKworICAgICAgICBjYWNoZS51cGRhdGUodGFza3MsICZub2RlX21hcCwg SGFzaFNldDo6bmV3KCkpCisgICAgfQorCisgICAgY29uc3QgREVGQVVMVF9NQVhfU0laRTogdTY0 ID0gMTAwMDA7CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9hZGRfdGFza3MoKSAtPiBSZXN1 bHQ8KCksIEVycm9yPiB7CisgICAgICAgIGxldCB0bXBfZGlyID0gTmFtZWRUZW1wRGlyOjpuZXco KT87CisgICAgICAgIGxldCBjYWNoZSA9IFRhc2tDYWNoZTo6bmV3KAorICAgICAgICAgICAgdG1w X2Rpci5wYXRoKCksCisgICAgICAgICAgICBDcmVhdGVPcHRpb25zOjpuZXcoKSwKKyAgICAgICAg ICAgIDMsCisgICAgICAgICAgICAxLAorICAgICAgICAgICAgMCwKKyAgICAgICAgICAgIERFRkFV TFRfTUFYX1NJWkUsCisgICAgICAgICkKKyAgICAgICAgLnVud3JhcCgpCisgICAgICAgIC53cml0 ZSgpPzsKKworICAgICAgICBjYWNoZS5uZXdfZmlsZSgxMDAwLCBmYWxzZSk/OworICAgICAgICBh c3NlcnRfZXEhKGNhY2hlLmNhY2hlLmFyY2hpdmVfZmlsZXMoJmNhY2hlLmxvY2spPy5sZW4oKSwg MSk7CisKKyAgICAgICAgYWRkX3Rhc2tzKCZjYWNoZSwgdmVjIVt0YXNrKDEwMDAsIHRydWUpLCB0 YXNrKDEwMDEsIHRydWUpXSk/OworCisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICBj YWNoZS5yZWFkX3N0YXRlKCkuY3V0b2ZmX3RpbWVzdGFtcCgicHZlLXJlbW90ZSIsICJwdmUiKSwK KyAgICAgICAgICAgIFNvbWUoMTAwMSkKKyAgICAgICAgKTsKKworICAgICAgICBjYWNoZS5yb3Rh dGUoMTUwMCk/OworCisgICAgICAgIGFzc2VydF9lcSEoY2FjaGUuY2FjaGUuYXJjaGl2ZV9maWxl cygmY2FjaGUubG9jayk/LmxlbigpLCAyKTsKKworICAgICAgICBhZGRfdGFza3MoJmNhY2hlLCB2 ZWMhW3Rhc2soMTUwMCwgdHJ1ZSksIHRhc2soMTUwMSwgdHJ1ZSldKT87CisgICAgICAgIGFkZF90 YXNrcygmY2FjaGUsIHZlYyFbdGFzaygxMjAwLCB0cnVlKSwgdGFzaygxMzAwLCB0cnVlKV0pPzsK KworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgY2FjaGUucmVhZF9zdGF0ZSgpLmN1 dG9mZl90aW1lc3RhbXAoInB2ZS1yZW1vdGUiLCAicHZlIiksCisgICAgICAgICAgICBTb21lKDE1 MDEpLAorICAgICAgICApOworCisgICAgICAgIGNhY2hlLnJvdGF0ZSgyMDAwKT87CisgICAgICAg IGFzc2VydF9lcSEoY2FjaGUuY2FjaGUuYXJjaGl2ZV9maWxlcygmY2FjaGUubG9jayk/Lmxlbigp LCAzKTsKKworICAgICAgICBhZGRfdGFza3MoJmNhY2hlLCB2ZWMhW3Rhc2soMjAwMCwgdHJ1ZSld KT87CisgICAgICAgIGFkZF90YXNrcygmY2FjaGUsIHZlYyFbdGFzaygxNTAyLCB0cnVlKV0pPzsK KyAgICAgICAgYWRkX3Rhc2tzKCZjYWNoZSwgdmVjIVt0YXNrKDEwMDIsIHRydWUpXSk/OworCisg ICAgICAgIC8vIFRoZXNlIGFyZSBiZWZvcmUgdGhlIGN1dC1vZmYgb2YgMTAwMCwgc28gdGhleSB3 aWxsIGJlIGRpc2NhcmRlZC4KKyAgICAgICAgLy8gYWRkX3Rhc2tzKCZjYWNoZSwgdmVjIVt0YXNr KDgwMCwgdHJ1ZSksIHRhc2soOTAwLCB0cnVlKV0pPzsKKworICAgICAgICAvLyBUaGlzIG9uZSBz aG91bGQgYmUgZGVkdXBlZAorICAgICAgICBhZGRfdGFza3MoJmNhY2hlLCB2ZWMhW3Rhc2soMTAw MCwgdHJ1ZSldKT87CisKKyAgICAgICAgYXNzZXJ0X3N0YXJ0dGltZXMoCisgICAgICAgICAgICAm Y2FjaGUsCisgICAgICAgICAgICAmWzIwMDAsIDE1MDIsIDE1MDEsIDE1MDAsIDEzMDAsIDEyMDAs IDEwMDIsIDEwMDEsIDEwMDBdLAorICAgICAgICApOworCisgICAgICAgIGNhY2hlLnJvdGF0ZSgy NTAwKT87CisKKyAgICAgICAgYXNzZXJ0X2VxIShjYWNoZS5jYWNoZS5hcmNoaXZlX2ZpbGVzKCZj YWNoZS5sb2NrKT8ubGVuKCksIDMpOworCisgICAgICAgIGFzc2VydF9zdGFydHRpbWVzKCZjYWNo ZSwgJlsyMDAwLCAxNTAyLCAxNTAxLCAxNTAwXSk7CisKKyAgICAgICAgY2FjaGUucm90YXRlKDMw MDApPzsKKyAgICAgICAgYXNzZXJ0X2VxIShjYWNoZS5jYWNoZS5hcmNoaXZlX2ZpbGVzKCZjYWNo ZS5sb2NrKT8ubGVuKCksIDMpOworCisgICAgICAgIGFzc2VydF9zdGFydHRpbWVzKCZjYWNoZSwg JlsyMDAwXSk7CisKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZu IHRlc3RfYWN0aXZlX3Rhc2tzX2FyZV9taWdyYXRlZF90b19hcmNoaXZlKCkgLT4gUmVzdWx0PCgp LCBFcnJvcj4geworICAgICAgICBsZXQgdG1wX2RpciA9IE5hbWVkVGVtcERpcjo6bmV3KCk/Owor ICAgICAgICBsZXQgY2FjaGUgPSBUYXNrQ2FjaGU6Om5ldygKKyAgICAgICAgICAgIHRtcF9kaXIu cGF0aCgpLAorICAgICAgICAgICAgQ3JlYXRlT3B0aW9uczo6bmV3KCksCisgICAgICAgICAgICAz LAorICAgICAgICAgICAgMSwKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICBERUZBVUxUX01B WF9TSVpFLAorICAgICAgICApCisgICAgICAgIC51bndyYXAoKQorICAgICAgICAud3JpdGUoKT87 CisKKyAgICAgICAgY2FjaGUubmV3X2ZpbGUoMTAwMCwgZmFsc2UpPzsKKyAgICAgICAgYWRkX3Rh c2tzKCZjYWNoZSwgdmVjIVt0YXNrKDEwMDAsIGZhbHNlKSwgdGFzaygxMDAxLCBmYWxzZSldKT87 CisgICAgICAgIGFzc2VydF9lcSEoY2FjaGUuZ2V0X3Rhc2tzKEdldFRhc2tzOjpBY3RpdmUpPy5j b3VudCgpLCAyKTsKKworICAgICAgICBhZGRfdGFza3MoJmNhY2hlLCB2ZWMhW3Rhc2soMTAwMCwg dHJ1ZSksIHRhc2soMTAwMSwgdHJ1ZSldKT87CisKKyAgICAgICAgYXNzZXJ0X3N0YXJ0dGltZXMo JmNhY2hlLCAmWzEwMDEsIDEwMDBdKTsKKworICAgICAgICBhc3NlcnRfZXEhKGNhY2hlLmdldF90 YXNrcyhHZXRUYXNrczo6QWN0aXZlKT8uY291bnQoKSwgMCk7CisKKyAgICAgICAgT2soKCkpCisg ICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfaW5pdCgpIC0+IFJlc3VsdDwoKSwgRXJy b3I+IHsKKyAgICAgICAgbGV0IHRtcF9kaXIgPSBOYW1lZFRlbXBEaXI6Om5ldygpPzsKKyAgICAg ICAgbGV0IGNhY2hlID0gVGFza0NhY2hlOjpuZXcoCisgICAgICAgICAgICB0bXBfZGlyLnBhdGgo KSwKKyAgICAgICAgICAgIENyZWF0ZU9wdGlvbnM6Om5ldygpLAorICAgICAgICAgICAgMywKKyAg ICAgICAgICAgIDEsCisgICAgICAgICAgICAxMDAsCisgICAgICAgICAgICBERUZBVUxUX01BWF9T SVpFLAorICAgICAgICApCisgICAgICAgIC51bndyYXAoKQorICAgICAgICAud3JpdGUoKT87CisK KyAgICAgICAgY2FjaGUuaW5pdCgxMDAwKT87CisgICAgICAgIGFzc2VydF9lcSEoY2FjaGUuY2Fj aGUuYXJjaGl2ZV9maWxlcygmY2FjaGUubG9jayk/LmxlbigpLCAzKTsKKworICAgICAgICBhZGRf dGFza3MoCisgICAgICAgICAgICAmY2FjaGUsCisgICAgICAgICAgICB2ZWMhW3Rhc2soMTA1MCwg dHJ1ZSksIHRhc2soOTUwLCB0cnVlKSwgdGFzayg4NTAsIHRydWUpXSwKKyAgICAgICAgKT87CisK KyAgICAgICAgYXNzZXJ0X2VxIShjYWNoZS5nZXRfdGFza3MoR2V0VGFza3M6OkFyY2hpdmVkKT8u Y291bnQoKSwgMyk7CisKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgZm4gYWRkX2Zpbmlz aGVkX3RyYWNrZWQoY2FjaGU6ICZXcml0YWJsZVRhc2tDYWNoZSwgc3RhcnR0aW1lOiBpNjQpIC0+ IFJlc3VsdDwoKSwgRXJyb3I+IHsKKyAgICAgICAgbGV0IHQgPSB0YXNrKHN0YXJ0dGltZSwgdHJ1 ZSk7CisgICAgICAgIGxldCB1cGlkID0gdC51cGlkLmNsb25lKCk7CisKKyAgICAgICAgbGV0IG11 dCBub2RlX21hcCA9IE5vZGVGZXRjaFN1Y2Nlc3NNYXA6OmRlZmF1bHQoKTsKKyAgICAgICAgbm9k ZV9tYXAuc2V0X25vZGVfc3VjY2VzcygicHZlLXJlbW90ZSIudG9fc3RyaW5nKCksICJwdmUiLnRv X3N0cmluZygpKTsKKworICAgICAgICBjYWNoZS51cGRhdGUodmVjIVt0XSwgJm5vZGVfbWFwLCBI YXNoU2V0Ojpmcm9tX2l0ZXIoW3VwaWRdKSkKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4g dGVzdF90cmFja2luZ190YXNrcygpIC0+IFJlc3VsdDwoKSwgRXJyb3I+IHsKKyAgICAgICAgbGV0 IHRtcF9kaXIgPSBOYW1lZFRlbXBEaXI6Om5ldygpPzsKKyAgICAgICAgbGV0IGNhY2hlID0gVGFz a0NhY2hlOjpuZXcoCisgICAgICAgICAgICB0bXBfZGlyLnBhdGgoKSwKKyAgICAgICAgICAgIENy ZWF0ZU9wdGlvbnM6Om5ldygpLAorICAgICAgICAgICAgMywKKyAgICAgICAgICAgIDEsCisgICAg ICAgICAgICAxMDAsCisgICAgICAgICAgICBERUZBVUxUX01BWF9TSVpFLAorICAgICAgICApCisg ICAgICAgIC51bndyYXAoKQorICAgICAgICAud3JpdGUoKT87CisKKyAgICAgICAgY2FjaGUuaW5p dCgxMDAwKT87CisKKyAgICAgICAgY2FjaGUuYWRkX3RyYWNrZWRfdGFzayh0YXNrKDEwNTAsIGZh bHNlKSk/OworCisgICAgICAgIGFzc2VydF9lcSEoY2FjaGUuZ2V0X3Rhc2tzKEdldFRhc2tzOjpB Y3RpdmUpPy5jb3VudCgpLCAxKTsKKyAgICAgICAgY2FjaGUuYWRkX3RyYWNrZWRfdGFzayh0YXNr KDEwNjAsIGZhbHNlKSk/OworICAgICAgICBhc3NlcnRfZXEhKGNhY2hlLmdldF90YXNrcyhHZXRU YXNrczo6QWN0aXZlKT8uY291bnQoKSwgMik7CisKKyAgICAgICAgYXNzZXJ0X2VxIShjYWNoZS5y ZWFkX3N0YXRlKCkudHJhY2tlZF90YXNrcygpLmNvdW50KCksIDIpOworCisgICAgICAgIC8vIE1h cmsgZmlyc3QgdGFzayBhcyBmaW5pc2hlZAorICAgICAgICBhZGRfZmluaXNoZWRfdHJhY2tlZCgm Y2FjaGUsIDEwNTApPzsKKworICAgICAgICBhc3NlcnRfZXEhKGNhY2hlLmdldF90YXNrcyhHZXRU YXNrczo6QWN0aXZlKT8uY291bnQoKSwgMSk7CisgICAgICAgIGFzc2VydF9lcSEoY2FjaGUuZ2V0 X3Rhc2tzKEdldFRhc2tzOjpBcmNoaXZlZCk/LmNvdW50KCksIDEpOworICAgICAgICBhc3NlcnRf ZXEhKGNhY2hlLnJlYWRfc3RhdGUoKS50cmFja2VkX3Rhc2tzKCkuY291bnQoKSwgMSk7CisKKyAg ICAgICAgLy8gTWFyayBzZWNvbmQgdGFzayBhcyBmaW5pc2hlZAorICAgICAgICBhZGRfZmluaXNo ZWRfdHJhY2tlZCgmY2FjaGUsIDEwNjApPzsKKworICAgICAgICBhc3NlcnRfZXEhKGNhY2hlLmdl dF90YXNrcyhHZXRUYXNrczo6QWN0aXZlKT8uY291bnQoKSwgMCk7CisgICAgICAgIGFzc2VydF9l cSEoY2FjaGUuZ2V0X3Rhc2tzKEdldFRhc2tzOjpBcmNoaXZlZCk/LmNvdW50KCksIDIpOworICAg ICAgICBhc3NlcnRfZXEhKGNhY2hlLnJlYWRfc3RhdGUoKS50cmFja2VkX3Rhc2tzKCkuY291bnQo KSwgMCk7CisKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIGpv dXJuYWxfaXNfYXBwbGllZF9pZl9tYXhfc2l6ZV9leGNlZWRlZCgpIC0+IFJlc3VsdDwoKSwgRXJy b3I+IHsKKyAgICAgICAgbGV0IHRtcF9kaXIgPSBOYW1lZFRlbXBEaXI6Om5ldygpPzsKKworICAg ICAgICAvLyBTaG91bGQgYmUgKmp1c3QqIGVub3VnaCB0byBmaXQgYSBzaW5nbGUgdGFzaywgd2hp Y2ggbWVhbnMgdGhhdCB3ZSBhcHBseSB0aGUgam91cm5hbAorICAgICAgICAvLyBhZnRlciBhZGRp bmcgYSBzZWNvbmQgb25lLgorICAgICAgICBjb25zdCBFTk9VR0hfRk9SX1NJTkdMRV9UQVNLOiB1 NjQgPSAyMDA7CisKKyAgICAgICAgbGV0IGNhY2hlID0gVGFza0NhY2hlOjpuZXcoCisgICAgICAg ICAgICB0bXBfZGlyLnBhdGgoKSwKKyAgICAgICAgICAgIENyZWF0ZU9wdGlvbnM6Om5ldygpLAor ICAgICAgICAgICAgMywKKyAgICAgICAgICAgIDEsCisgICAgICAgICAgICAxMDAsCisgICAgICAg ICAgICBFTk9VR0hfRk9SX1NJTkdMRV9UQVNLLAorICAgICAgICApCisgICAgICAgIC51bndyYXAo KQorICAgICAgICAud3JpdGUoKT87CisKKyAgICAgICAgYWRkX3Rhc2tzKCZjYWNoZSwgdmVjIVt0 YXNrKDEwMDAsIHRydWUpXSk/OworICAgICAgICBhc3NlcnQhKGNhY2hlLmpvdXJuYWxfc2l6ZSgp PyA+IDApOworCisgICAgICAgIGFkZF90YXNrcygmY2FjaGUsIHZlYyFbdGFzaygxMDAwLCB0cnVl KV0pPzsKKworICAgICAgICBhc3NlcnRfZXEhKGNhY2hlLmpvdXJuYWxfc2l6ZSgpPywgMCk7CisK KyAgICAgICAgT2soKCkpCisgICAgfQorfQotLSAKMi40Ny4yCgoKCl9fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCnBkbS1kZXZlbCBtYWlsaW5nIGxpc3QKcGRt LWRldmVsQGxpc3RzLnByb3htb3guY29tCmh0dHBzOi8vbGlzdHMucHJveG1veC5jb20vY2dpLWJp bi9tYWlsbWFuL2xpc3RpbmZvL3BkbS1kZXZlbAo=