From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: <pdm-devel-bounces@lists.proxmox.com> Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id D94F31FF1C6 for <inbox@lore.proxmox.com>; Fri, 18 Apr 2025 10:32:55 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 07384383DC; Fri, 18 Apr 2025 10:32:53 +0200 (CEST) From: Lukas Wagner <l.wagner@proxmox.com> To: pdm-devel@lists.proxmox.com Date: Fri, 18 Apr 2025 10:32:05 +0200 Message-Id: <20250418083210.74982-2-l.wagner@proxmox.com> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250418083210.74982-1-l.wagner@proxmox.com> References: <20250418083210.74982-1-l.wagner@proxmox.com> MIME-Version: 1.0 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.017 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 v4 1/6] 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 <pdm-devel.lists.proxmox.com> List-Unsubscribe: <https://lists.proxmox.com/cgi-bin/mailman/options/pdm-devel>, <mailto:pdm-devel-request@lists.proxmox.com?subject=unsubscribe> List-Archive: <http://lists.proxmox.com/pipermail/pdm-devel/> List-Post: <mailto:pdm-devel@lists.proxmox.com> List-Help: <mailto:pdm-devel-request@lists.proxmox.com?subject=help> List-Subscribe: <https://lists.proxmox.com/cgi-bin/mailman/listinfo/pdm-devel>, <mailto:pdm-devel-request@lists.proxmox.com?subject=subscribe> Reply-To: Proxmox Datacenter Manager development discussion <pdm-devel@lists.proxmox.com> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: pdm-devel-bounces@lists.proxmox.com Sender: "pdm-devel" <pdm-devel-bounces@lists.proxmox.com> VGhpcyBjb21taXQgYWRkcyBhIG5ldyBpbXBsZW1lbnRhdGlvbiBmb3IgYSBjYWNoZSBmb3IgcmVt b3RlIHRhc2tzLCBvbmUKdGhhdCBzaG91bGQgaW1wcm92ZSBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJp c3RpY3MgaW4gZm9yIHByZXR0eSBtdWNoIGFsbAp1c2UgY2FzZXMuCgpJbiBnZW5lcmFsIHN0b3Jh Z2Ugd29ya3MgcHJldHR5IHNpbWlsYXIgdG8gdGhlIHRhc2sgYXJjaGl2ZSB3ZSBhbHJlYWR5Cmhh dmUgZm9yIChsb2NhbCkgUERNIHRhc2tzLgoKcm9vdEBwZG0tZGV2Oi92YXIvY2FjaGUvcHJveG1v eC1kYXRhY2VudGVyLW1hbmFnZXIvcmVtb3RlLXRhc2tzIyBscyAtbAp0b3RhbCA0MAotcnctci0t ci0tIDEgd3d3LWRhdGEgd3d3LWRhdGEgICAgIDAgTWFyIDEzIDEzOjE4IGFjdGl2ZQotcnctci0t ci0tIDEgd3d3LWRhdGEgd3d3LWRhdGEgIDE2NzYgTWFyIDExIDE0OjUxIGFyY2hpdmUuMTc0MTM1 NTQ2Mgotcnctci0tci0tIDEgd3d3LWRhdGEgd3d3LWRhdGEgICAgIDAgTWFyIDExIDE0OjUxIGFy Y2hpdmUuMTc0MTQ0MTg2Mgotcnctci0tci0tIDEgd3d3LWRhdGEgd3d3LWRhdGEgIDI1MzggTWFy IDExIDE0OjUxIGFyY2hpdmUuMTc0MTUyODI2Mgotcnctci0tci0tIDEgd3d3LWRhdGEgd3d3LWRh dGEgIDg0MjggTWFyIDExIDE1OjA3IGFyY2hpdmUuMTc0MTYxNDY2Mgotcnctci0tci0tIDEgd3d3 LWRhdGEgd3d3LWRhdGEgMTE3NDAgTWFyIDEzIDEwOjE4IGFyY2hpdmUuMTc0MTcwMTA2Mgotcnct ci0tci0tIDEgd3d3LWRhdGEgd3d3LWRhdGEgIDMzNjQgTWFyIDEzIDEzOjE4IGFyY2hpdmUuMTc0 MTc4ODI3MAotcnctci0tci0tIDEgd3d3LWRhdGEgd3d3LWRhdGEgICAyODcgTWFyIDEzIDEzOjE4 IHN0YXRlCgpUYXNrcyBhcmUgc3RvcmVkIGluIHRoZSAnYWN0aXZlJyBhbmQgbXVsdGlwbGUgJ2Fy Y2hpdmUnIGZpbGVzLiBSdW5uaW5nCnRhc2tzIGFyZSBwbGFjZWQgaW50byB0aGUgJ2FjdGl2ZScg ZmlsZSwgdGFza3MgdGhhdCBhcmUgZmluaXNoZWQgYXJlCnBlcnNpc3RlZCBpbnRvIG9uZSBvZiB0 aGUgYXJjaGl2ZSBmaWxlcy4gVGhlIGFyY2hpdmUgZmlsZXMgYXJlIHN1ZmZpeGVkCndpdGggYSBV TklYIHRpbWVzdGFtcCB3aGljaCBzZXJ2ZXMgYXMgYSBsb3dlci1ib3VuZCBmb3Igc3RhcnQgdGlt ZXMgZm9yCnRhc2tzIHN0b3JlZCBpbiB0aGlzIGZpbGUuIEVuY29kaW5nIHRoaXMgbG93ZXItYm91 bmQgaW4gdGhlIGZpbGUgbmFtZQppbnN0ZWFkIG9mIHVzaW5nIGEgbW9yZSB0cmFkaXRpb25hbCBp bmNyZWFzaW5nIGZpbGUgaW5kZXggKC4xLCAuMiwgLjMpCmdpdmVzIHVzIHRoZSBiZW5lZml0IHRo YXQgd2UgY2FuIGRlY2lkZSBpbiB3aGljaCBmaWxlIGEgbmV3bHkgYXJyaXZlZAp0YXNrcyBiZWxv bmdzIGZyb20gYSBzaW5nbGUgcmVhZGRpciBjYWxsLCB3aXRob3V0IGV2ZW4gcmVhZGluZyB0aGUg ZmlsZQppdHNlbGYuCgpUaGUgc2l6ZSBvZiB0aGUgZW50aXJlIGFyY2hpdmUgY2FuIGJlIGNvbnRy b2xsZWQgYnkgZG9pbmcgZmlsZQoncm90YXRpb24nLCB3aGVyZSB0aGUgYXJjaGl2ZSBmaWxlIHdp dGggdGhlIG9sZGVzdCB0aW1lc3RhbXAgaXMgZGVsZXRlZAphbmQgYSBuZXcgZmlsZSB3aXRoIHRo ZSBjdXJyZW50IHRpbWVzdGFtcCBpcyBhZGRlZC4gSWYgJ3JvdGF0aW9uJwpoYXBwZW5zIGF0IGZp eGVkIGludGVydmFscyAoZS5nLiBvbmNlIGRhaWx5KSwgdGhpcyBnaXZlcyB1cyBhCmNvbmZpZ3Vy YWJsZSBudW1iZXIgb2YgZGF5cyBvZiB0YXNrIGhpc3RvcnkuIFRoZXJlIGlzIG5vIGRpcmVjdCBj YXAgZm9yCnRoZSB0b3RhbCBudW1iZXIgb2YgdGFza3MsIGJ1dCB0aGlzIGNvdWxkIGJlIGVhc2ls eSBhZGRlZCBieSBjaGVja2luZwp0aGUgc2l6ZSBvZiB0aGUgbW9zdCByZWNlbnQgYXJjaGl2ZSBm aWxlIGFuZCBieSByb3RhdGluZyBlYXJseSBpZiBhCnRocmVzaG9sZCBpcyBleGNlZWRlZC4KClRo ZSBmb3JtYXQgaW5zaWRlIHRoZSBmaWxlcyBpcyBhbHNvIHNpbWlsYXIgdG8gdGhlIGxvY2FsIHRh c2sgYXJjaGl2ZSwKd2l0aCBvbmUgdGFzayBjb3JyZXNwb25kaW5nIHRvIG9uZSBsaW5lIGluIHRo ZSBmaWxlLiBPbmUga2V5IGRpZmZlcmVuY2UKaXMgdGhhdCBoZXJlIGVhY2ggbGluZSBpcyBhIEpT T04gb2JqZWN0LCB0aGF0IGlzIHRvIG1ha2UgaXQgZWFzaWVyIHRvCmFkZCBhZGRpdGlvbmFsIGRh dGEgbGF0ZXIsIGlmIG5lZWRlZC4gVGhlIEpTT04gb2JqZWN0IGNvbnRhaW5zIHRoZSB0YXNrcwpV UElELCBzdGF0dXMsIGVuZHRpbWUgYW5kIHN0YXJ0dGltZSAodGhlIHN0YXJ0dGltZSBpcyB0ZWNo bmljYWxseSBhbHNvCmVuY29kZWQgaW4gdGhlIFVQSUQsIGJ1dCBoYXZpbmcgaXQgYXMgYSBzZXBh cmF0ZSB2YWx1ZSBzaW1wbGlmaWVkIGEKY291cGxlIG9mIHRoaW5ncykgRWFjaCBmaWxlIGlzIHNv cnRlZCBieSB0aGUgdGFzaydzIHN0YXJ0IHRpbWUsIHRoZQp5b3VuZ2VzdCB0YXNrIGNvbWluZyBm aXJzdC4KCk9uZSBrZXkgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgdGFzayBjYWNoZSBhbmQgdGhl IGxvY2FsIHRhc2sgYXJjaGl2ZSBpcwp0aGF0IHdlIG5lZWQgdG8gaGFuZGxlIHRhc2tzIGNvbWlu ZyBpbiBvdXQtb2Ytb3JkZXIsIGUuZy4gaWYgcmVtb3Rlcwp3ZXJlIG5vdCByZWFjaGFibGUgZm9y IGEgY2VydGFpbiB0aW1lLiBUbyBtYWludGFpbiB0aGUgb3JkZXJpbmcgaW4gdGhlCmZpbGUsIHdl IGhhdmUgdG8gbWVyZ2UgdGhlIG5ld2x5IGFycml2ZWQgdGFza3MgaW50byB0aGUgZXhpc3Rpbmcg dGFzawpmaWxlLiBUaGlzIHdhcyBpbXBsZW1lbnRlZCBpbiBhIHdheSB0aGF0IGF2b2lkcyByZWFk aW5nIHRoZSBlbnRpcmUgZmlsZQppbnRvIG1lbW9yeSBhdCBvbmNlLCBleHBsb2l0aW5nIHRoZSBm YWN0IHRoYXQgdGhlIGNvbnRlbnRzIG9mIHRoZQpleGlzdGluZyBmaWxlIGFyZSBhbHJlYWR5IHNv cnRlZC4gVGhpcyBhbGxvd3MgdG8gZG8gYSB6aXBwZXIvbWVyZ2Utc29ydApsaWtlIGFwcHJvYWNo IChzZWUgTWVyZ2VUYXNrSXRlcmF0b3IgZm9yIGRldGFpbHMpLiBUaGUgZXhpc3RpbmcgZmlsZSBp cwpvbmx5IHJlYWQgbGluZS1ieS1saW5lIGFuZCBmaW5hbGx5IHJlcGxhY2VkIGF0b21pY2FsbHku CgpUaGUgY2FjaGUgYWxzbyBoYXMgYSBzZXBhcmF0ZSBzdGF0ZSBmaWxlLCBjb250YWluaW5nIGFk ZGl0aW9uYWwKaW5mb3JtYXRpb24sIGUuZy4gY3V0LW9mZiB0aW1lc3RhbXBzIGZvciB0aGUgcG9s bGluZyB0YXNrLiBTb21lIG9mIHRoZQpkYXRhIGluIHRoZSBzdGF0ZWZpbGUgaXMgdGVjaG5pY2Fs bHkgYWxzbyBjb250YWluZWQgaW4gdGhlIGFyY2hpdmUKZmlsZXMsIGJ1dCByZWFkaW5nIHRoZSBz dGF0ZSBmaWxlIGlzIG11Y2ggZmFzdGVyLgoKVGhpcyBjb21taXQgYWxzbyBhZGRzIGFuIGVsYWJv cmF0ZSBzdWl0ZSBvZiB1bml0IHRlc3RzIGZvciB0aGlzIG5ldwpjYWNoZS4gV2hpbGUgYWRkaW5n IHNvbWUgYWRkaXRpb25hbCB3b3JrIHVwIGZyb250LCB0aGV5IHBhaWQgb2ZmCnRoZW1zZWx2ZXMg ZHVyaW5nIGRldmVsb3BtZW50IHF1aXRlIHF1aWNrbHksIHNpbmNlIHRoZSBvdmVyYWxsIGFwcHJv YWNoCmZvciB0aGUgY2FjaGUgY2hhbmdlZCBhIGNvdXBsZSBvZiB0aW1lcy4gVGhlIHRlc3Qgc3Vp dGUgZ2F2ZSBtZQpjb25maWRlbmNlIHRoYXQgdGhlIGRlc2lnbiBjaGFuZ2VzIGRpZG4ndCBzY3Jl dyBhbnl0aGluZyB1cCwgY2F0Y2hpbmcgYQpjb3VwbGUgb2YgYnVncyBpbiB0aGUgcHJvY2Vzcy4K CkZpbmFsbHksIHNvbWUgY29uY3JldGUgbnVtYmVycyBhYm91dCB0aGUgcGVyZm9ybWFuY2UgaW1w cm92bWVudHMuCkJlbmNobWFya2luZyB3YXMgZG9uZSB1c2luZyB0aGUgJ2Zha2UtcmVtb3RlJyBm ZWF0dXJlLiBUaGVyZSB3ZXJlIDEwMApyZW1vdGVzLCAxMCBQVkUgbm9kZXMgcGVyIHJlbW90ZS4g VGhlIHRhc2sgY2FjaGUgY29udGFpbmVkCmFib3V0IDEuNSBtaWxsaW9uIHRhc2tzLgogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlICAgICAgICAgYWZ0 ZXIKbGlzdCBvZiBhY3RpdmUgdGFza3MgKCopOiAgICAgICAgICAgICAgICAgICAgIH4xLjNzICAg ICAgICAgfjMwMMK1cwpsaXN0IG9mIDUwMCB0YXNrcywgb2Zmc2V0IDAgKCoqKTogICAgICAgICAg ICAgfjEuM3MgICAgICAgIH4xNDUwwrVzCmxpc3Qgb2YgNTAwIHRhc2tzLCBvZmZzZXQgMSBtaWxs aW9uICgqKiopOiAgICB+MS4zcyAgICAgICAgIH4xNzVtcwpTaXplIG9uIGRpc2s6ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgfjUwME1CICAgICAgICB+MjAwTUIKCigqKTogIFJlcXVl c3RlZCBieSB0aGUgVUkgZXZlcnkgM3MKKCoqKTogUmVxdWVzdGVkIGJ5IHRoZSBVSSB3aGVuIHZp c2l0aW5nIFJlbW90ZXMgPiBUYXNrcwooKioqKTogRS5nLiB3aGVuIHNjcm9sbGluZyB0b3dhcmRz IHRoZSBib3R0b20gb2YgJ1JlbW90ZXMgPiBUYXNrcycKCkluIHRoZSBvbGQgaW1wbGVtZW50YXRp b24sIHRoZSBhcmNoaXZlIGZpbGUgd2FzICphbHdheXMqIGZ1bGx5CmRlc2VyaWFsaXplZCBhbmQg bG9hZGVkIGludG8gUkFNLCB0aGlzIGlzIHRoZSByZWFzb24gd2h5IHRoZSB0aW1lIG5lZWRlZApp cyBwcmV0dHkgaWRlbnRpYWwgZm9yIGFsbCBzY2VuYXJpb3MuIFRoZSBuZXcgaW1wbGVtZW50YXRp b24gcmVhZHMgdGhlCmFyY2hpdmUgZmlsZXMgb25seSBsaW5lIGJ5IGxpbmUsIGFuZCBvbmx5IDUw MCB0YXNrcyB3ZXJlIGxvYWRlZCBpbnRvIFJBTQphdCB0aGUgc2FtZSB0aW1lLiBUaGUgaGlnaGVy IHRoZSBvZmZzZXQsIHRoZSBtb3JlIGFyY2hpdmUgbGluZXMvZmlsZXMgd2UKaGF2ZSB0byBzY2Fu LCB3aGljaCBpbmNyZWFzZXMgdGhlIHRpbWUgbmVlZGVkIHRvIGFjY2VzcyB0aGUgZGF0YS4gVGhl CnRhc2tzIGFyZSBzb3J0ZWQgZGVzY2VuZGluZyBieSBzdGFydHRpbWUsIGFzIGEgcmVzdWx0IHRo ZSByZXF1ZXN0cyBnZXQKc2xvd2VyIHRoZSBmdXJ0aGVyIHlvdSBnbyBiYWNrIGluIGhpc3Rvcnku CgpTaWduZWQtb2ZmLWJ5OiBMdWthcyBXYWduZXIgPGwud2FnbmVyQHByb3htb3guY29tPgotLS0K Ck5vdGVzOgogICAgQ2hhbmdlcyBzaW5jZSB2MzoKICAgICAgLSBJbmNsdWRlZCBiZW5jaG1hcmsg cmVzdWx0cyBpbiB0aGUgY29tbWl0IG1lc3NhZ2UKICAgICAgLSBEcm9wIGBwdWJgIGZvciBUYXNr Q2FjaGU6OndyaXRlX3N0YXRlCiAgICAKICAgIENoYW5nZXMgc2luY2UgdjI6CiAgICAgIC0gSW5j b3Jwb3JhdGUgZmVlZGJhY2sgZnJvbSBXb2xmYW5nICh0aHghKQogICAgICAgICAtIGVsaW1pbmF0 ZSBvbmUgLmNsb25lKCkKICAgICAgICAgLSBnZXRfdGFza3Nfd2l0aF9sb2NrOiBkaXJlY3RseSBj cmVhdGUgaXRlcmF0b3Igb3ZlciBQYXRoQnVmCiAgICAgICAgICAgaW5zdGVhZCBvZiBmaXJzdCBj cmVhdGluZyBBcmNoaXZlRmlsZSB2ZWMgYW5kIHRoZSBtYXBwaW5nCiAgICAgICAgIC0gRml4ZWQg VE9DVE9VIHJhY2UgY29uZGl0aW9uIChjaGVja2VkIFBhdGg6OmV4aXN0cyBpbnN0ZWFkIG9mCiAg ICAgICAgICAgdHJ5aW5nIHRoZSBhY3R1YWwgb3BlcmF0aW9uIGFuZCByZWFjdGluZyB0byBFcnJv cktpbmQ6Ok5vdEZvdW5kKQogICAgICAgICAtIGhhbmRsZSBlcnJvciB3aGVuIHJlcGxhY2luZyAn YWN0aXZlJyBmaWxlCiAgICAgICAgIC0gdW5saW5rIHRlbXAgZmlsZSB3aGVuIHJlcGxhY2luZyB0 aGUgYXJjaGl2ZSBmaWxlIGRpZCBub3Qgd29yawogICAgICAgICAtIGF2b2lkIFVURjggZGVjb2Rp bmcgd2hlcmUgbm90IHJlYWxseSBuZWNlc3NhcnkKICAgICAgLSBBZGRlZCBhIGNvdXBsZSBvZiAu Y29udGV4dCgpLy53aXRoX2NvbnRleHQoKSBmb3IgYmV0dGVyIGVycm9yCiAgICAgICAgbWVzc2Fn ZXMKICAgICAgLSBFeHRyYWN0ZWQgdGhlIGZpbGUgbmFtZXMgaW50byBjb25zdHMKICAgICAgLSBG aXhlZCBzb21lIGNsaXBweSBpc3N1ZXMgKC5jbG9uZSgpIGZvciBDcmVhdGVPcHRpb25zIC0gd2hl bgogICAgICAgIHRoaXMgc2VyaWVzIHdhcyB3cml0dGVuLCBDcmVhdGVPcHRpb25zIHdlcmUgbm90 IENvcHkgeWV0KQoKIHNlcnZlci9zcmMvcmVtb3RlX3Rhc2tzL21vZC5ycyAgICAgICAgfCAgICAy ICsKIHNlcnZlci9zcmMvcmVtb3RlX3Rhc2tzL3Rhc2tfY2FjaGUucnMgfCAxMDIyICsrKysrKysr KysrKysrKysrKysrKysrKysKIDIgZmlsZXMgY2hhbmdlZCwgMTAyNCBpbnNlcnRpb25zKCspCiBj cmVhdGUgbW9kZSAxMDA2NDQgc2VydmVyL3NyYy9yZW1vdGVfdGFza3MvdGFza19jYWNoZS5ycwoK ZGlmZiAtLWdpdCBhL3NlcnZlci9zcmMvcmVtb3RlX3Rhc2tzL21vZC5ycyBiL3NlcnZlci9zcmMv cmVtb3RlX3Rhc2tzL21vZC5ycwppbmRleCA3ZGVkNTQwOC4uMjA2MmYyYjcgMTAwNjQ0Ci0tLSBh L3NlcnZlci9zcmMvcmVtb3RlX3Rhc2tzL21vZC5ycworKysgYi9zZXJ2ZXIvc3JjL3JlbW90ZV90 YXNrcy9tb2QucnMKQEAgLTE4LDYgKzE4LDggQEAgdXNlIHRva2lvOjp0YXNrOjpKb2luSGFuZGxl OwogCiB1c2UgY3JhdGU6OnthcGk6OnB2ZSwgdGFza191dGlsc307CiAKK21vZCB0YXNrX2NhY2hl OworCiAvLy8gR2V0IHRhc2tzIGZvciBhbGwgcmVtb3RlcwogLy8gRklYTUU6IGZpbHRlciBmb3Ig cHJpdmlsZWdlcwogcHViIGFzeW5jIGZuIGdldF90YXNrcyhtYXhfYWdlOiBpNjQsIGZpbHRlcnM6 IFRhc2tGaWx0ZXJzKSAtPiBSZXN1bHQ8VmVjPFRhc2tMaXN0SXRlbT4sIEVycm9yPiB7CmRpZmYg LS1naXQgYS9zZXJ2ZXIvc3JjL3JlbW90ZV90YXNrcy90YXNrX2NhY2hlLnJzIGIvc2VydmVyL3Ny Yy9yZW1vdGVfdGFza3MvdGFza19jYWNoZS5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwMC4uZjhkZDgyMWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2ZXIvc3JjL3JlbW90ZV90 YXNrcy90YXNrX2NhY2hlLnJzCkBAIC0wLDAgKzEsMTAyMiBAQAorLy8hIFRhc2sgY2FjaGUgaW1w bGVtZW50YXRpb24sIGJhc2VkIG9uIHJvdGF0aW5nIGZpbGVzLgorCit1c2Ugc3RkOjp7CisgICAg Y21wOjpPcmRlcmluZywKKyAgICBjb2xsZWN0aW9uczo6e0hhc2hNYXAsIEhhc2hTZXR9LAorICAg IGZzOjpGaWxlLAorICAgIGlvOjp7QnVmUmVhZCwgQnVmUmVhZGVyLCBCdWZXcml0ZXIsIEVycm9y S2luZCwgTGluZXMsIFdyaXRlfSwKKyAgICBpdGVyOjpQZWVrYWJsZSwKKyAgICBwYXRoOjp7UGF0 aCwgUGF0aEJ1Zn0sCisgICAgdGltZTo6RHVyYXRpb24sCit9OworCit1c2UgYW55aG93Ojp7Q29u dGV4dCwgRXJyb3J9OwordXNlIHByb3htb3hfc3lzOjpmczo6Q3JlYXRlT3B0aW9uczsKK3VzZSBz ZXJkZTo6e0Rlc2VyaWFsaXplLCBTZXJpYWxpemV9OworCit1c2UgcGRtX2FwaV90eXBlczo6UmVt b3RlVXBpZDsKKworLy8vIEZpbGVuYW1lIGZvciB0aGUgZmlsZSBjb250YWluaW5nIHJ1bm5pbmcg dGFza3MuCitjb25zdCBBQ1RJVkVfRklMRU5BTUU6ICZzdHIgPSAiYWN0aXZlIjsKKy8vLyBGaWxl bmFtZSBwcmVmaXggZm9yIGFyY2hpdmUgZmlsZXMuCitjb25zdCBBUkNISVZFX0ZJTEVOQU1FX1BS RUZJWDogJnN0ciA9ICJhcmNoaXZlLiI7CisvLy8gRmlsZW5hbWUgZm9yIHRoZSBzdGF0ZSBmaWxl LgorY29uc3QgU1RBVEVfRklMRU5BTUU6ICZzdHIgPSAic3RhdGUiOworLy8vIEZpbGVuYW1lIG9m IHRoZSBhcmNoaXZlIGxvY2tmaWxlLgorY29uc3QgTE9DS0ZJTEVfRklMRU5BTUU6ICZzdHIgPSAi LmxvY2siOworCisvLy8gSXRlbSB3aGljaCBjYW4gYmUgcHV0IGludG8gdGhlIHRhc2sgY2FjaGUu CisjW2Rlcml2ZShDbG9uZSwgRGVidWcsIFNlcmlhbGl6ZSwgRGVzZXJpYWxpemUsIEhhc2gsIFBh cnRpYWxFcSwgRXEpXQorcHViIHN0cnVjdCBUYXNrQ2FjaGVJdGVtIHsKKyAgICAvLy8gVGhlIHRh c2sncyBVUElECisgICAgcHViIHVwaWQ6IFJlbW90ZVVwaWQsCisgICAgLy8vIFRoZSB0aW1lIGF0 IHdoaWNoIHRoZSB0YXNrIHdhcyBzdGFydGVkIChzZWNvbmRzIHNpbmNlIHRoZSBVTklYIGVwb2No KS4KKyAgICAvLy8gVGVjaG5pY2FsbHkgdGhpcyBpcyBhbHNvIGNvbnRhaW5lZCB3aXRoaW4gdGhl IFVQSUQsIGR1cGxpY2F0aW5nIGl0IGhlcmUKKyAgICAvLy8gYWxsb3dzIHVzIHRvIGRpcmVjdGx5 IGFjY2VzcyBpdCB3aGVuIHNvcnRpbmcgaW4gbmV3IHRhc2tzLCB3aXRob3V0IGhhdmluZworICAg IC8vLyB0byBwYXJzZSB0aGUgVVBJRC4KKyAgICBwdWIgc3RhcnR0aW1lOiBpNjQsCisgICAgI1tz ZXJkZShza2lwX3NlcmlhbGl6aW5nX2lmID0gIk9wdGlvbjo6aXNfbm9uZSIpXQorICAgIC8vLyBU aGUgdGFzaydzIHN0YXR1cy4KKyAgICBwdWIgc3RhdHVzOiBPcHRpb248U3RyaW5nPiwKKyAgICAj W3NlcmRlKHNraXBfc2VyaWFsaXppbmdfaWYgPSAiT3B0aW9uOjppc19ub25lIildCisgICAgLy8v IFRoZSB0YXNrJ3MgZW5kdGltZSAoc2Vjb25kcyBzaW5jZSB0aGUgVU5JWCBlcG9jaCkuCisgICAg cHViIGVuZHRpbWU6IE9wdGlvbjxpNjQ+LAorfQorCisvLy8gU3RhdGUgbmVlZGVkIGZvciB0YXNr IHBvbGxpbmcuCisjW2Rlcml2ZShTZXJpYWxpemUsIERlc2VyaWFsaXplLCBEZWZhdWx0KV0KKyNb c2VyZGUocmVuYW1lX2FsbCA9ICJrZWJhYi1jYXNlIildCitwdWIgc3RydWN0IFN0YXRlIHsKKyAg ICAvLy8gTWFwIG9mIHJlbW90ZSAtPiBtb3N0IHJlY2VudCB0YXNrIHN0YXJ0dGltZSAoVU5JWCBl cG9jaCkgaW4gdGhlIGFyY2hpdmUuCisgICAgLy8vIFRoaXMgY2FuIGJlIHVzZWQgYXMgYSBjdXQt b2ZmIHdoZW4gcmVxdWVzdGluZyBuZXcgdGFzayBkYXRhLgorICAgIHB1YiBtb3N0X3JlY2VudF9h cmNoaXZlX3N0YXJ0dGltZTogSGFzaE1hcDxTdHJpbmcsIGk2ND4sCisgICAgLy8vIE9sZGVzdCBy dW5uaW5nIHRhc2suIFVzZWZ1bCBhcyBhbm90aGVyIGN1dC1vZmYgZm9yIGZldGNoaW5nIHRhc2tz LgorICAgIC8vLyBUaGUgdGltZXN0YW1wIGlzIGJhc2VkIG9uIHNlY29uZHMgc2luY2UgdGhlIFVO SVggZXBvY2guCisgICAgcHViIG9sZGVzdF9hY3RpdmVfdGFzazogSGFzaE1hcDxTdHJpbmcsIGk2 ND4sCisgICAgLy8vIFRyYWNrZWQgdGFza3MgcGVyIHJlbW90ZS4KKyAgICBwdWIgdHJhY2tlZF90 YXNrczogSGFzaE1hcDxTdHJpbmcsIEhhc2hTZXQ8UmVtb3RlVXBpZD4+LAorfQorCisvLy8gQ2Fj aGUgZm9yIHJlbW90ZSB0YXNrcy4KKyNbZGVyaXZlKENsb25lKV0KK3B1YiBzdHJ1Y3QgVGFza0Nh Y2hlIHsKKyAgICAvLy8gUGF0aCB3aGVyZSB0aGUgY2FjaGUncyBmaWxlcyBzaG91bGQgYmUgcGxh Y2VkLgorICAgIGJhc2VfcGF0aDogUGF0aEJ1ZiwKKyAgICAvLy8gRmlsZSBwZXJtaXNzaW9ucyBm b3IgdGhlIGNhY2hlJ3MgZmlsZXMuCisgICAgY3JlYXRlX29wdGlvbnM6IENyZWF0ZU9wdGlvbnMs Cit9CisKKy8vLyBUYXNrcyB0aGF0IHNob3VsZCBiZSBhZGRlZCB0byB0aGUgY2FjaGUgdmlhIFtg VGFza0NhY2hlOjphZGRfdGFza3NgXS4KK3B1YiBzdHJ1Y3QgQWRkVGFza3MgeworICAgIC8vLyBV cGRhdGUgdGhlIHJlbW90ZSdzIGVudHJ5IGluIHRoZSBzdGF0ZWZpbGUgd2hpY2ggY29udGFpbnMg dGhlCisgICAgLy8vIHRpbWVzdGFtcCBvZiB0aGUgbW9zdCByZWNlbnQgKmZpbmlzaGVkKiB0YXNr IGZyb20gdGhlIHRhc2sgYXJjaGl2ZS4KKyAgICBwdWIgdXBkYXRlX21vc3RfcmVjZW50X2FyY2hp dmVfdGltZXN0YW1wOiBib29sLAorICAgIC8vLyBUaGUgdGFza3MgdG8gYWRkLgorICAgIHB1YiB0 YXNrczogVmVjPFRhc2tDYWNoZUl0ZW0+LAorfQorCisvLy8gTG9jayBmb3IgdGhlIGNhY2hlLgor I1thbGxvdyhkZWFkX2NvZGUpXQorcHViIHN0cnVjdCBUYXNrQ2FjaGVMb2NrKEZpbGUpOworCisv Ly8gV2hpY2ggdGFza3MgdG8gZmV0Y2ggZnJvbSB0aGUgYXJjaGl2ZS4KK3B1YiBlbnVtIEdldFRh c2tzIHsKKyAgICAvLy8gR2V0IGFsbCB0YXNrcywgZmluaXNoZWQgYW5kIHJ1bm5pbmcuCisgICAg QWxsLAorICAgIC8vLyBPbmx5IGdldCBydW5uaW5nIChhY3RpdmUpIHRhc2tzLgorICAgIEFjdGl2 ZSwKKyAgICAjW2NmZyh0ZXN0KV0gLy8gVXNlZCBieSB0ZXN0cywgbWlnaHQgYmUgdXNlZCBieSBw cm9kdWN0aW9uIGNvZGUgaW4gdGhlIGZ1dHVyZQorICAgIC8vLyBPbmx5IGdldCBmaW5pc2hlZCAo YXJjaGl2ZWQpIHRhc2tzLgorICAgIEFyY2hpdmVkLAorfQorCitpbXBsIFRhc2tDYWNoZSB7Cisg ICAgLy8vIENyZWF0ZSBhIG5ldyB0YXNrIGNhY2hlIGluc3RhbmNlLgorICAgIC8vLworICAgIC8v LyBSZW1lbWJlciB0byBjYWxsIGBpbml0YCBvciBgbmV3X2ZpbGVgIHRvIGNyZWF0ZSBpbml0aWFs IGFyY2hpdmUgZmlsZXMgYmVmb3JlCisgICAgLy8vIGFkZGluZyBhbnkgdGFza3MuCisgICAgcHVi IGZuIG5ldzxQOiBBc1JlZjxQYXRoPj4ocGF0aDogUCwgY3JlYXRlX29wdGlvbnM6IENyZWF0ZU9w dGlvbnMpIC0+IFJlc3VsdDxTZWxmLCBFcnJvcj4geworICAgICAgICBPayhTZWxmIHsKKyAgICAg ICAgICAgIGJhc2VfcGF0aDogcGF0aC5hc19yZWYoKS5pbnRvKCksCisgICAgICAgICAgICBjcmVh dGVfb3B0aW9ucywKKyAgICAgICAgfSkKKyAgICB9CisKKyAgICAvLy8gQ3JlYXRlIGluaXRpYWwg dGFzayBhcmNoaXZlcyB0aGF0IGNhbiBiZSBiYWNrZmlsbGVkIHdpdGggdGhlCisgICAgLy8vIHJl Y2VudCB0YXNrIGhpc3RvcnkgZnJvbSBhIHJlbW90ZS4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBm dW5jdGlvbiBvbmx5IGhhcyBhbiBlZmZlY3QgaWYgdGhlcmUgYXJlIG5vIGFyY2hpdmUgZmlsZXMg eWV0LgorICAgIHB1YiBmbiBpbml0KCZzZWxmLCBub3c6IGk2NCwgbnVtYmVyX29mX2ZpbGVzOiB1 NjQsIHBlcmlvZF9wZXJfZmlsZTogdTY0KSAtPiBSZXN1bHQ8KCksIEVycm9yPiB7CisgICAgICAg IGxldCBfbG9jayA9IHNlbGYubG9jayh0cnVlKS5jb250ZXh0KCJmYWlsZWQgdG8gbG9jayBhcmNo aXZlIik/OworCisgICAgICAgIGlmIHNlbGYuYXJjaGl2ZV9maWxlcygpPy5pc19lbXB0eSgpIHsK KyAgICAgICAgICAgIGZvciBpIGluIDAuLm51bWJlcl9vZl9maWxlcyB7CisgICAgICAgICAgICAg ICAgc2VsZi5uZXdfZmlsZShub3cgLSAoaSAqIHBlcmlvZF9wZXJfZmlsZSkgYXMgaTY0KT87Cisg ICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICAv Ly8gU3RhcnQgYSBuZXcgYXJjaGl2ZSBmaWxlIHdpdGggYSBnaXZlbiB0aW1lc3RhbXAuCisgICAg Ly8vIGBub3dgIGlzIHN1cHBvc2VkIHRvIGJlIGEgVU5JWCB0aW1lc3RhbXAgKHNlY29uZHMpLgor ICAgIGZuIG5ld19maWxlKCZzZWxmLCBub3c6IGk2NCkgLT4gUmVzdWx0PCgpLCBFcnJvcj4gewor ICAgICAgICBsZXQgbmV3X3BhdGggPSBzZWxmCisgICAgICAgICAgICAuYmFzZV9wYXRoCisgICAg ICAgICAgICAuam9pbihmb3JtYXQhKCJ7QVJDSElWRV9GSUxFTkFNRV9QUkVGSVh9e25vd30iKSk7 CisgICAgICAgIGxldCBtdXQgZmlsZSA9IEZpbGU6OmNyZWF0ZSgmbmV3X3BhdGgpPzsKKyAgICAg ICAgc2VsZi5jcmVhdGVfb3B0aW9ucy5hcHBseV90bygmbXV0IGZpbGUsICZuZXdfcGF0aCk/Owor CisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIC8vLyBMb2NrIHRoZSBjYWNoZS4KKyAgICBm biBsb2NrKCZzZWxmLCBleGNsdXNpdmU6IGJvb2wpIC0+IFJlc3VsdDxUYXNrQ2FjaGVMb2NrLCBF cnJvcj4geworICAgICAgICBsZXQgbG9ja2ZpbGUgPSBzZWxmLmJhc2VfcGF0aC5qb2luKExPQ0tG SUxFX0ZJTEVOQU1FKTsKKworICAgICAgICBsZXQgZmQgPSBwcm94bW94X3N5czo6ZnM6Om9wZW5f ZmlsZV9sb2NrZWQoCisgICAgICAgICAgICBsb2NrZmlsZSwKKyAgICAgICAgICAgIER1cmF0aW9u Ojpmcm9tX3NlY3MoMTUpLAorICAgICAgICAgICAgZXhjbHVzaXZlLAorICAgICAgICAgICAgc2Vs Zi5jcmVhdGVfb3B0aW9ucywKKyAgICAgICAgKT87CisKKyAgICAgICAgT2soVGFza0NhY2hlTG9j ayhmZCkpCisgICAgfQorCisgICAgLy8vIFJvdGF0ZSB0YXNrIGFyY2hpdmUgaWYgdGhlIHRoZSBu ZXdlc3QgYXJjaGl2ZSBmaWxlIGlzIG9sZGVyIHRoYW4gYHJvdGF0ZV9hZnRlcmAuCisgICAgLy8v CisgICAgLy8vIFRoZSBvbGRlc3QgYXJjaGl2ZSBmaWxlcyBhcmUgcmVtb3ZlZCBpZiB0aGUgdG90 YWwgbnVtYmVyIG9mIGFyY2hpdmUgZmlsZXMgZXhjZWVkcworICAgIC8vLyBgbWF4X2ZpbGVzYC4g YG5vd2AgaXMgc3VwcG9zZWQgdG8gYmUgYSBVTklYIHRpbWVzdGFtcCAoc2Vjb25kcykuCisgICAg Ly8vCisgICAgLy8vIFRoaXMgZnVuY3Rpb24gcmVxdWVzdHMgYW4gZXhjbHVzaXZlIGxvY2ssIGRv bid0IGNhbGwgaWYgeW91IGFscmVhZHkgaG9sZCBhIGxvY2suCisgICAgcHViIGZuIHJvdGF0ZSgm c2VsZiwgbm93OiBpNjQsIHJvdGF0ZV9hZnRlcjogdTY0LCBtYXhfZmlsZXM6IHU2NCkgLT4gUmVz dWx0PGJvb2wsIEVycm9yPiB7CisgICAgICAgIGxldCBfbG9jayA9IHNlbGYubG9jayh0cnVlKS5j b250ZXh0KCJmYWlsZWQgdG8gbG9jayBhcmNoaXZlIik/OworICAgICAgICBsZXQgbXV0IGRpZF9y b3RhdGUgPSBmYWxzZTsKKworICAgICAgICBsZXQgbXV0IGJvdW5kcyA9IHNlbGYuYXJjaGl2ZV9m aWxlcygpPzsKKworICAgICAgICBtYXRjaCBib3VuZHMuZmlyc3QoKSB7CisgICAgICAgICAgICBT b21lKGJvdW5kKSA9PiB7CisgICAgICAgICAgICAgICAgaWYgbm93ID4gYm91bmQuc3RhcnR0aW1l ICYmIG5vdyAtIGJvdW5kLnN0YXJ0dGltZSA+IHJvdGF0ZV9hZnRlciBhcyBpNjQgeworICAgICAg ICAgICAgICAgICAgICBzZWxmLm5ld19maWxlKG5vdyk/OworICAgICAgICAgICAgICAgICAgICBk aWRfcm90YXRlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAg ICAgICAgICBOb25lID0+IHsKKyAgICAgICAgICAgICAgICBzZWxmLm5ld19maWxlKG5vdyk/Owor ICAgICAgICAgICAgICAgIGRpZF9yb3RhdGUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAg ICB9CisKKyAgICAgICAgd2hpbGUgYm91bmRzLmxlbigpID49IG1heF9maWxlcyBhcyB1c2l6ZSB7 CisgICAgICAgICAgICAvLyBVbndyYXAgaXMgc2FmZSBiZWNhdXNlIG9mIHRoZSBsZW5ndGggY2hl Y2sgYWJvdmUKKyAgICAgICAgICAgIGxldCB0b19yZW1vdmUgPSBib3VuZHMucG9wKCkudW53cmFw KCk7CisgICAgICAgICAgICBzdGQ6OmZzOjpyZW1vdmVfZmlsZSgmdG9fcmVtb3ZlLmZpbGUpCisg ICAgICAgICAgICAgICAgLndpdGhfY29udGV4dCh8fCBmb3JtYXQhKCJmYWlsZWQgdG8gcmVtb3Zl IHt9IiwgdG9fcmVtb3ZlLmZpbGUuZGlzcGxheSgpKSk/OworICAgICAgICB9CisKKyAgICAgICAg T2soZGlkX3JvdGF0ZSkKKyAgICB9CisKKyAgICAvLy8gQWRkIG5ldyB0YXNrcyB0byB0aGUgdGFz ayBhcmNoaXZlLgorICAgIC8vLworICAgIC8vLyBSdW5uaW5nIHRhc2tzICh0YXNrcyB3aXRob3V0 IGFuIGVuZHRpbWUpIGFyZSBwbGFjZWQgaW50byB0aGUgJ2FjdGl2ZScgZmlsZSBpbiB0aGUKKyAg ICAvLy8gdGFzayBjYWNoZSBiYXNlIGRpcmVjdG9yeS4gRmluaXNoZWQgdGFza3MgYXJlIHNvcnRl ZCBpbnRvIGBhcmNoaXZlLjxzdGFydGltZT5gIGFyY2hpdmUKKyAgICAvLy8gZmlsZXMsIHdoZXJl IGA8c3RhcnR0aW1lcz5gIGRlbm90ZXMgdGhlIGxvd2VzdCBwZXJtaXR0ZWQgc3RhcnQgdGltZSB0 aW1lc3RhbXAgZm9yIGEgZ2l2ZW4KKyAgICAvLy8gYXJjaGl2ZSBmaWxlLiBJZiBhIHRhc2sgd2hp Y2ggd2FzIGFkZGVkIGFzIHJ1bm5pbmcgcHJldmlvdXNseSBpcyBhZGRlZCBhZ2FpbiwgdGhpcyB0 aW1lIGluCisgICAgLy8vIGEgZmluaXNoZWQgc3RhdGUsIGl0IHdpbGwgYmUgcmVtb3ZlZCBmcm9t IHRoZSBgYWN0aXZlYCBmaWxlIGFuZCBhbHNvIHNvcnRlZCBpbnRvCisgICAgLy8vIG9uZSBvZiB0 aGUgYXJjaGl2ZSBmaWxlcy4KKyAgICAvLy8gU2FtZSBnb2VzIGZvciB0aGUgbGlzdCBvZiB0cmFj a2VkIHRhc2tzOyB0aGUgZW50cnkgaW4gdGhlIHN0YXRlIGZpbGUgd2lsbCBiZSByZW1vdmVkLgor ICAgIC8vLworICAgIC8vLyBDcmFzaCBjb25zaXN0ZW5jeToKKyAgICAvLy8KKyAgICAvLy8gVGhl IHN0YXRlIGZpbGUsIHdoaWNoIGNvbnRhaW5zIHRoZSBjdXQtb2ZmIHRpbWVzdGFtcHMgZm9yIGZ1 dHVyZSB0YXNrIGZldGNoaW5nLCBpcyB1cGRhdGVkIGF0IHRoZQorICAgIC8vLyBlbmQgYWZ0ZXIg YWxsIHRhc2tzIGhhdmUgYmVlbiBhZGRlZCBpbnRvIHRoZSBhcmNoaXZlLiBBZGRpbmcgdGFza3Mg aXMgYW4gaWRlbXBvdGVudAorICAgIC8vLyBvcGVyYXRpb247IGFkZGluZyB0aGUgKnNhbWUqIHRh c2sgbXVsdGlwbGUgdGltZXMgZG9lcyBub3QgbGVhZCB0byBkdXBsaWNhdGVkIGVudHJpZXMgaW4g dGhlCisgICAgLy8vIHRhc2sgYXJjaGl2ZS4gSW5kaXZpZHVhbCBhcmNoaXZlIGZpbGVzIGFyZSB1 cGRhdGVkIGF0b21pY2FsbHksIGJ1dCBzaW5jZQorICAgIC8vLyBhZGRpbmcgdGFza3MgY2FuIGlu dm9sdmUgdXBkYXRpbmcgbXVsdGlwbGUgYXJjaGl2ZSBmaWxlcywgdGhlIGFyY2hpdmUgY291bGQg ZW5kIHVwCisgICAgLy8vIGluIGEgcGFydGlhbGx5LXVwZGF0ZWQsIGluY29uc2lzdGVudCBzdGF0 ZSBpbiBjYXNlIG9mIGEgY3Jhc2guCisgICAgLy8vIEhvd2V2ZXIsIHNpbmNlIHRoZSBzdGF0ZSBm aWxlIHdpdGggdGhlIGN1dC1vZmYgdGltZXN0YW1wcyBpcyB1cGRhdGVkIGxhc3QsCisgICAgLy8v IHRoZSBjb25zaXN0ZW5jeSBvZiB0aGUgYXJjaGl2ZSBzaG91bGQgYmUgcmVzdG9yZWQgYXQgdGhl IG5leHQgdXBkYXRlIGN5Y2xlIG9mIHRoZSBhcmNoaXZlLgorICAgIHB1YiBmbiBhZGRfdGFza3Mo JnNlbGYsIG11dCBhZGRlZDogSGFzaE1hcDxTdHJpbmcsIEFkZFRhc2tzPikgLT4gUmVzdWx0PCgp LCBFcnJvcj4geworICAgICAgICBsZXQgbG9jayA9IHNlbGYubG9jayh0cnVlKS5jb250ZXh0KCJm YWlsZWQgdG8gbG9jayBhcmNoaXZlIik/OworCisgICAgICAgIC8vIEdldCBhIGZsYXQgYFZlY2Ag b2YgYWxsIG5ldyB0YXNrcworICAgICAgICBsZXQgdGFza3M6IFZlYzxfPiA9IGFkZGVkCisgICAg ICAgICAgICAuaXRlcl9tdXQoKQorICAgICAgICAgICAgLmZsYXRfbWFwKHwoXywgdGFza3MpfCBz dGQ6Om1lbTo6dGFrZSgmbXV0IHRhc2tzLnRhc2tzKSkKKyAgICAgICAgICAgIC5jb2xsZWN0KCk7 CisKKyAgICAgICAgbGV0IHVwZGF0ZV9zdGF0ZV9mb3JfcmVtb3RlOiBIYXNoTWFwPFN0cmluZywg Ym9vbD4gPSBhZGRlZAorICAgICAgICAgICAgLmludG9faXRlcigpCisgICAgICAgICAgICAubWFw KHwocmVtb3RlLCBhZGRfdGFza3MpfCAocmVtb3RlLCBhZGRfdGFza3MudXBkYXRlX21vc3RfcmVj ZW50X2FyY2hpdmVfdGltZXN0YW1wKSkKKyAgICAgICAgICAgIC5jb2xsZWN0KCk7CisKKyAgICAg ICAgbGV0IG11dCB0YXNrX2l0ZXIgPSBzZWxmCisgICAgICAgICAgICAuZ2V0X3Rhc2tzX3dpdGhf bG9jayhHZXRUYXNrczo6QWN0aXZlLCBsb2NrKQorICAgICAgICAgICAgLmNvbnRleHQoImZhaWxl ZCB0byBjcmVhdGUgYXJjaGl2ZSBpdGVyYXRvciBmb3IgYWN0aXZlIHRhc2tzIik/OworCisgICAg ICAgIGxldCBtdXQgYWN0aXZlX3Rhc2tzID0KKyAgICAgICAgICAgIEhhc2hTZXQ6OmZyb21faXRl cih0YXNrX2l0ZXIuZmxhdF9tYXAofGFjdGl2ZV90YXNrfCBtYXRjaCBhY3RpdmVfdGFzayB7Cisg ICAgICAgICAgICAgICAgT2sodGFzaykgPT4gU29tZSgodGFzay51cGlkLCB0YXNrLnN0YXJ0dGlt ZSkpLAorICAgICAgICAgICAgICAgIEVycihlcnIpID0+IHsKKyAgICAgICAgICAgICAgICAgICAg bG9nOjplcnJvciEoImZhaWxlZCB0byByZWFkIHRhc2sgY2FjaGUgZW50cnkgZnJvbSBhY3RpdmUg ZmlsZToge2Vycn0iKTsKKyAgICAgICAgICAgICAgICAgICAgTm9uZQorICAgICAgICAgICAgICAg IH0KKyAgICAgICAgICAgIH0pKTsKKworICAgICAgICAvLyBDb25zdW1lIHRoZSBpdGVyYXRvciB0 byBnZXQgYmFjayB0aGUgbG9jay4gVGhlIGxvY2sgaXMgaGVsZAorICAgICAgICAvLyB1bnRpbCBf bG9jayBpcyBmaW5hbGx5IGRyb3BwZWQgYXQgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24uCisgICAg ICAgIGxldCBfbG9jayA9IHRhc2tfaXRlci5pbnRvX2xvY2soKTsKKworICAgICAgICBsZXQgbXV0 IG5ld19maW5pc2hlZF90YXNrcyA9IFZlYzo6bmV3KCk7CisKKyAgICAgICAgZm9yIHRhc2sgaW4g dGFza3MgeworICAgICAgICAgICAgaWYgdGFzay5lbmR0aW1lLmlzX25vbmUoKSB7CisgICAgICAg ICAgICAgICAgYWN0aXZlX3Rhc2tzLmluc2VydCgodGFzay51cGlkLCB0YXNrLnN0YXJ0dGltZSkp OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBuZXdfZmluaXNoZWRfdGFz a3MucHVzaCh0YXNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGxldCBt dXQgc3RhdGUgPSBzZWxmLnJlYWRfc3RhdGUoKTsKKworICAgICAgICBuZXdfZmluaXNoZWRfdGFz a3Muc29ydF9ieShjb21wYXJlX3Rhc2tzX3JldmVyc2UpOworICAgICAgICBzZWxmLm1lcmdlX3Rh c2tzX2ludG9fYXJjaGl2ZSgKKyAgICAgICAgICAgIG5ld19maW5pc2hlZF90YXNrcywKKyAgICAg ICAgICAgICZtdXQgYWN0aXZlX3Rhc2tzLAorICAgICAgICAgICAgdXBkYXRlX3N0YXRlX2Zvcl9y ZW1vdGUsCisgICAgICAgICAgICAmbXV0IHN0YXRlLAorICAgICAgICApPzsKKyAgICAgICAgc2Vs Zi51cGRhdGVfb2xkZXN0X2FjdGl2ZSgmYWN0aXZlX3Rhc2tzLCAmbXV0IHN0YXRlKTsKKworICAg ICAgICBsZXQgbXV0IGFjdGl2ZTogVmVjPFRhc2tDYWNoZUl0ZW0+ID0gYWN0aXZlX3Rhc2tzCisg ICAgICAgICAgICAuaW50b19pdGVyKCkKKyAgICAgICAgICAgIC5tYXAofCh1cGlkLCBzdGFydHRp bWUpfCBUYXNrQ2FjaGVJdGVtIHsKKyAgICAgICAgICAgICAgICB1cGlkLAorICAgICAgICAgICAg ICAgIHN0YXJ0dGltZSwKKyAgICAgICAgICAgICAgICBzdGF0dXM6IE5vbmUsCisgICAgICAgICAg ICAgICAgZW5kdGltZTogTm9uZSwKKyAgICAgICAgICAgIH0pCisgICAgICAgICAgICAuY29sbGVj dCgpOworCisgICAgICAgIGFjdGl2ZS5zb3J0X2J5KGNvbXBhcmVfdGFza3NfcmV2ZXJzZSk7Cisg ICAgICAgIHNlbGYud3JpdGVfYWN0aXZlX3Rhc2tzKGFjdGl2ZS5pbnRvX2l0ZXIoKSkKKyAgICAg ICAgICAgIC5jb250ZXh0KCJmYWlsZWQgdG8gd3JpdGUgYWN0aXZlIHRhc2sgZmlsZSB3aGVuIGFk ZGluZyB0YXNrcyIpPzsKKyAgICAgICAgc2VsZi53cml0ZV9zdGF0ZShzdGF0ZSkKKyAgICAgICAg ICAgIC5jb250ZXh0KCJmYWlsZWQgdG8gdXBkYXRlIHRhc2sgYXJjaGl2ZSBzdGF0ZSBmaWxlIHdo ZW4gYWRkaW5nIHRhc2tzIik/OworCisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgIC8vLyBV cGRhdGUgdGhlIHRpbWVzdGFtcCBvZiB0aGUgb2xkZXN0IHJ1bm5pbmcgdGFzayBpbiBgc3RhdGVg LgorICAgIGZuIHVwZGF0ZV9vbGRlc3RfYWN0aXZlKCZzZWxmLCBhY3RpdmVfdGFza3M6ICZIYXNo U2V0PChSZW1vdGVVcGlkLCBpNjQpPiwgc3RhdGU6ICZtdXQgU3RhdGUpIHsKKyAgICAgICAgLy8g VXBkYXRlIHRoZSBzdGF0ZSB3aXRoIHRpbWVzdGFtcCBvZiB0aGUgb2xkZXN0IHJ1bm5pbmcgdGFz aywKKyAgICAgICAgLy8gd2UgYWxzbyB1c2UgdGhpcyBhcyBjdXQtb2ZmIHdoZW4gZmV0Y2hpbmcg dGFza3MsIHNvIHdlCisgICAgICAgIC8vIGZvciBzdXJlIGtub3cgd2hlbiBhIHRhc2sgZmluaXNo ZXMuCisgICAgICAgIGxldCBtdXQgb2xkZXN0X2FjdGl2ZV90YXNrX3Blcl9yZW1vdGUgPSBIYXNo TWFwOjpuZXcoKTsKKyAgICAgICAgZm9yICh1cGlkLCBzdGFydGltZSkgaW4gYWN0aXZlX3Rhc2tz Lml0ZXIoKSB7CisgICAgICAgICAgICBvbGRlc3RfYWN0aXZlX3Rhc2tfcGVyX3JlbW90ZQorICAg ICAgICAgICAgICAgIC5lbnRyeSh1cGlkLnJlbW90ZSgpLnRvX293bmVkKCkpCisgICAgICAgICAg ICAgICAgLmFuZF9tb2RpZnkofHRpbWV8ICp0aW1lID0gKCpzdGFydGltZSkubWluKCp0aW1lKSkK KyAgICAgICAgICAgICAgICAub3JfaW5zZXJ0KCpzdGFydGltZSk7CisgICAgICAgIH0KKyAgICAg ICAgc3RhdGUub2xkZXN0X2FjdGl2ZV90YXNrID0gb2xkZXN0X2FjdGl2ZV90YXNrX3Blcl9yZW1v dGU7CisgICAgfQorCisgICAgLy8vIE1lcmdlIGEgbGlzdCBvZiAqZmluaXNoZWQqIHRhc2tzIGlu dG8gdGhlIHJlbW90ZSB0YXNrIGFyY2hpdmUgZmlsZXMuCisgICAgLy8vIFRoZSBsaXN0IG9mIHRh c2sgaW4gYHRhc2tzYCAqbXVzdCogYmUgc29ydGVkIGJ5IHRoZWlyIHRpbWVzdGFtcCBhbmQgVVBJ RCAoZGVzY2VuZGluZyBieQorICAgIC8vLyB0aW1lc3RhbXAsIGFzY2VuZGluZyBieSBVUElEKS4K KyAgICAvLy8KKyAgICAvLy8gVGhlIHRhc2sgYXJjaGl2ZSBzaG91bGQgYmUgbG9ja2VkIHdoZW4g Y2FsbGluZyB0aGlzLgorICAgIGZuIG1lcmdlX3Rhc2tzX2ludG9fYXJjaGl2ZSgKKyAgICAgICAg JnNlbGYsCisgICAgICAgIHRhc2tzOiBWZWM8VGFza0NhY2hlSXRlbT4sCisgICAgICAgIGFjdGl2 ZV90YXNrczogJm11dCBIYXNoU2V0PChSZW1vdGVVcGlkLCBpNjQpPiwKKyAgICAgICAgdXBkYXRl X3N0YXRlX2Zvcl9yZW1vdGU6IEhhc2hNYXA8U3RyaW5nLCBib29sPiwKKyAgICAgICAgc3RhdGU6 ICZtdXQgU3RhdGUsCisgICAgKSAtPiBSZXN1bHQ8KCksIEVycm9yPiB7CisgICAgICAgIGRlYnVn X2Fzc2VydCEodGFza3MKKyAgICAgICAgICAgIC5pdGVyKCkKKyAgICAgICAgICAgIC5pc19zb3J0 ZWRfYnkofGEsIGJ8IGNvbXBhcmVfdGFza3MoYSwgYikuaXNfZ2UoKSkpOworCisgICAgICAgIGxl dCBmaWxlcyA9IHNlbGYKKyAgICAgICAgICAgIC5hcmNoaXZlX2ZpbGVzKCkKKyAgICAgICAgICAg IC5jb250ZXh0KCJmYWlsZWQgdG8gcmVhZCBhY2hpdmUgZmlsZXMiKT87CisKKyAgICAgICAgbGV0 IG11dCBmaWxlcyA9IGZpbGVzLml0ZXIoKS5wZWVrYWJsZSgpOworCisgICAgICAgIGxldCBtdXQg Y3VycmVudCA9IGZpbGVzLm5leHQoKTsKKyAgICAgICAgbGV0IG11dCBuZXh0ID0gZmlsZXMucGVl aygpOworCisgICAgICAgIGxldCBtdXQgdGFza3NfZm9yX2N1cnJlbnRfZmlsZSA9IFZlYzo6bmV3 KCk7CisKKyAgICAgICAgLy8gVGFza3MgYXJlIHNvcnRlZCB5b3VuZ2VzdCB0byBvbGRlc3QgKGJp Z2dlc3Qgc3RhcnR0aW1lIGZpcnN0KQorICAgICAgICBmb3IgbXV0IHRhc2sgaW4gdGFza3Mgewor ICAgICAgICAgICAgLy8gVXNpbmcgYSBwYXJ0aWFsIG1vdmUgdG8gYXZvaWQgaGF2aW5nIHRvIGNs b25lIHRhc2sudXBpZAorICAgICAgICAgICAgbGV0IHVwaWRfYW5kX3N0YXJ0dGltZSA9ICh0YXNr LnVwaWQsIHRhc2suc3RhcnR0aW1lKTsKKyAgICAgICAgICAgIGFjdGl2ZV90YXNrcy5yZW1vdmUo JnVwaWRfYW5kX3N0YXJ0dGltZSk7CisgICAgICAgICAgICB0YXNrLnVwaWQgPSB1cGlkX2FuZF9z dGFydHRpbWUuMDsKKworICAgICAgICAgICAgaWYgbGV0IFNvbWUodHJhY2tlZF90YXNrcykgPSBz dGF0ZS50cmFja2VkX3Rhc2tzLmdldF9tdXQodGFzay51cGlkLnJlbW90ZSgpKSB7CisgICAgICAg ICAgICAgICAgdHJhY2tlZF90YXNrcy5yZW1vdmUoJnRhc2sudXBpZCk7CisgICAgICAgICAgICB9 CisKKyAgICAgICAgICAgIGlmIGxldCBTb21lKHRydWUpID0gdXBkYXRlX3N0YXRlX2Zvcl9yZW1v dGUuZ2V0KHRhc2sudXBpZC5yZW1vdGUoKSkgeworICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0 aGUgbW9zdCByZWNlbnQgc3RhcnRpbWUgcGVyIHJlbW90ZSwgdGhlIHRhc2sgcG9sbGluZyBsb2dp YyB1c2VzIGl0IGFzIGEKKyAgICAgICAgICAgICAgICAvLyBjdXQtb2ZmLgorICAgICAgICAgICAg ICAgIHN0YXRlCisgICAgICAgICAgICAgICAgICAgIC5tb3N0X3JlY2VudF9hcmNoaXZlX3N0YXJ0 dGltZQorICAgICAgICAgICAgICAgICAgICAuZW50cnkodGFzay51cGlkLnJlbW90ZSgpLnRvX293 bmVkKCkpCisgICAgICAgICAgICAgICAgICAgIC5hbmRfbW9kaWZ5KHx0aW1lfCAqdGltZSA9ICh0 YXNrLnN0YXJ0dGltZSkubWF4KCp0aW1lKSkKKyAgICAgICAgICAgICAgICAgICAgLm9yX2luc2Vy dCh0YXNrLnN0YXJ0dGltZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFNraXAg YWhlYWQgdW50aWwgd2UgaGF2ZSBmb3VuZCB0aGUgY29ycmVjdCBmaWxlLgorICAgICAgICAgICAg d2hpbGUgbmV4dC5pc19zb21lKCkgeworICAgICAgICAgICAgICAgIGlmIGxldCBTb21lKGN1cnJl bnQpID0gY3VycmVudCB7CisgICAgICAgICAgICAgICAgICAgIGlmIHRhc2suc3RhcnR0aW1lID49 IGN1cnJlbnQuc3RhcnR0aW1lIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAg ICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBuZXh0IGVudHJ5 J3MgY3V0LW9mZiBpcyBsYXJnZXIgdGhlbiB0aGUgdGFzaydzIHN0YXJ0IHRpbWUsIHRoYXQgbWVh bnMKKyAgICAgICAgICAgICAgICAgICAgLy8gd2Ugd2FudCB0byBmaW5hbGl6ZWQgdGhlIGN1cnJl bnQgZmlsZSBieSBtZXJnaW5nIGFsbCB0YXNrcyB0aGF0CisgICAgICAgICAgICAgICAgICAgIC8v IHNob3VsZCBiZSBzdG9yZWQgaW4gaXQuLi4KKyAgICAgICAgICAgICAgICAgICAgc2VsZi5tZXJn ZV9zaW5nbGVfYXJjaGl2ZV9maWxlKAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptZW06 OnRha2UoJm11dCB0YXNrc19mb3JfY3VycmVudF9maWxlKSwKKyAgICAgICAgICAgICAgICAgICAg ICAgICZjdXJyZW50LmZpbGUsCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAg ICAgICAgLndpdGhfY29udGV4dCh8fCB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQh KCJmYWlsZWQgdG8gbWVyZ2UgYXJjaGl2ZSBmaWxlIHt9IiwgY3VycmVudC5maWxlLmRpc3BsYXko KSkKKyAgICAgICAgICAgICAgICAgICAgfSk/OworICAgICAgICAgICAgICAgIH0KKworICAgICAg ICAgICAgICAgIC8vIC4uLiBhbmQgdGhlIHRoZSBgY3VycmVudGAgZmlsZSB0byB0aGUgbmV4dCBl bnRyeS4KKyAgICAgICAgICAgICAgICBjdXJyZW50ID0gZmlsZXMubmV4dCgpOworICAgICAgICAg ICAgICAgIG5leHQgPSBmaWxlcy5wZWVrKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAg IGlmIGxldCBTb21lKGN1cnJlbnQpID0gY3VycmVudCB7CisgICAgICAgICAgICAgICAgaWYgdGFz ay5zdGFydHRpbWUgPCBjdXJyZW50LnN0YXJ0dGltZSB7CisgICAgICAgICAgICAgICAgICAgIGNv bnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRh c2tzX2Zvcl9jdXJyZW50X2ZpbGUucHVzaCh0YXNrKTsKKyAgICAgICAgfQorCisgICAgICAgIC8v IE1lcmdlIHRhc2tzIGZvciB0aGUgbGFzdCBmaWxlLgorICAgICAgICBpZiBsZXQgU29tZShjdXJy ZW50KSA9IGN1cnJlbnQgeworICAgICAgICAgICAgc2VsZi5tZXJnZV9zaW5nbGVfYXJjaGl2ZV9m aWxlKHRhc2tzX2Zvcl9jdXJyZW50X2ZpbGUsICZjdXJyZW50LmZpbGUpCisgICAgICAgICAgICAg ICAgLndpdGhfY29udGV4dCh8fCB7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCEoImZhaWxl ZCB0byBtZXJnZSBhcmNoaXZlIGZpbGUge30iLCBjdXJyZW50LmZpbGUuZGlzcGxheSgpKQorICAg ICAgICAgICAgICAgIH0pPzsKKyAgICAgICAgfQorCisgICAgICAgIE9rKCgpKQorICAgIH0KKwor ICAgIC8vLyBBZGQgYSBuZXcgdHJhY2tlZCB0YXNrLgorICAgIC8vLworICAgIC8vLyBUaGlzIHdp bGwgaW5zZXJ0IHRoZSB0YXNrIGluIHRoZSBsaXN0IG9mIHRyYWNrZWQgdGFza3MgaW4gdGhlIHN0 YXRlIGZpbGUsCisgICAgLy8vIGFzIHdlbGwgYXMgY3JlYXRlIGFuIGVudHJ5IGluIHRoZSBgYWN0 aXZlYCBmaWxlLgorICAgIC8vLworICAgIC8vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgcmVxdWVzdCBh biBleGNsdXNpdmUgbG9jayBmb3IgdGhlIHRhc2sgY2FjaGUsCisgICAgLy8vIGRvIG5vdCBjYWxs IGlmIHlvdSBhcmUgYWxyZWFkeSBob2xkaW5nIGEgbG9jay4KKyAgICBwdWIgZm4gYWRkX3RyYWNr ZWRfdGFzaygmc2VsZiwgdGFzazogVGFza0NhY2hlSXRlbSkgLT4gUmVzdWx0PCgpLCBFcnJvcj4g eworICAgICAgICBsZXQgbG9jayA9IHNlbGYubG9jayh0cnVlKS5jb250ZXh0KCJmYWlsZWQgdG8g bG9jayBhcmNoaXZlIik/OworCisgICAgICAgIGxldCBtdXQgdGFza3MgPSBWZWM6Om5ldygpOwor ICAgICAgICBsZXQgbXV0IHRhc2tfaXRlciA9IHNlbGYKKyAgICAgICAgICAgIC5nZXRfdGFza3Nf d2l0aF9sb2NrKEdldFRhc2tzOjpBY3RpdmUsIGxvY2spCisgICAgICAgICAgICAuY29udGV4dCgi ZmFpbGVkIHRvIGNyZWF0ZSBhY3RpdmUgdGFzayBpdGVyYXRvciIpPzsKKworICAgICAgICBmb3Ig dGFzayBpbiAmbXV0IHRhc2tfaXRlciB7CisgICAgICAgICAgICBtYXRjaCB0YXNrIHsKKyAgICAg ICAgICAgICAgICBPayh0YXNrKSA9PiB0YXNrcy5wdXNoKHRhc2spLAorICAgICAgICAgICAgICAg IEVycihlcnIpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgbG9nOjplcnJvciEoCisgICAgICAg ICAgICAgICAgICAgICAgICAiY291bGQgbm90IHJlYWQgZXhpc3RpbmcgdGFzayBjYWNoZSBlbnRy eSBmcm9tICdhY3RpdmUnIGZpbGU6IHtlcnJ9IgorICAgICAgICAgICAgICAgICAgICApOworICAg ICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRhc2tz LnB1c2godGFzay5jbG9uZSgpKTsKKyAgICAgICAgdGFza3Muc29ydF9ieShjb21wYXJlX3Rhc2tz X3JldmVyc2UpOworCisgICAgICAgIGxldCBfbG9jayA9IHRhc2tfaXRlci5pbnRvX2xvY2soKTsK KworICAgICAgICBsZXQgbXV0IHN0YXRlID0gc2VsZi5yZWFkX3N0YXRlKCk7CisKKyAgICAgICAg c3RhdGUKKyAgICAgICAgICAgIC5vbGRlc3RfYWN0aXZlX3Rhc2sKKyAgICAgICAgICAgIC5lbnRy eSh0YXNrLnVwaWQucmVtb3RlKCkudG9fb3duZWQoKSkKKyAgICAgICAgICAgIC5hbmRfbW9kaWZ5 KHxhfCAqYSA9ICgqYSkubWluKHRhc2suc3RhcnR0aW1lKSkKKyAgICAgICAgICAgIC5vcl9pbnNl cnQodGFzay5zdGFydHRpbWUpOworCisgICAgICAgIGxldCB0cmFja2VkX3Blcl9yZW1vdGUgPSBz dGF0ZQorICAgICAgICAgICAgLnRyYWNrZWRfdGFza3MKKyAgICAgICAgICAgIC5lbnRyeSh0YXNr LnVwaWQucmVtb3RlKCkudG9fb3duZWQoKSkKKyAgICAgICAgICAgIC5vcl9kZWZhdWx0KCk7Cisg ICAgICAgIHRyYWNrZWRfcGVyX3JlbW90ZS5pbnNlcnQodGFzay51cGlkKTsKKworICAgICAgICBz ZWxmLndyaXRlX2FjdGl2ZV90YXNrcyh0YXNrcy5pbnRvX2l0ZXIoKSkKKyAgICAgICAgICAgIC5j b250ZXh0KCJmYWlsZWQgdG8gd3JpdGUgYWN0aXZlIHRhc2tzIGZpbGUgd2hlbiBhZGRpbmcgdHJh Y2tlZCB0YXNrIik/OworICAgICAgICBzZWxmLndyaXRlX3N0YXRlKHN0YXRlKQorICAgICAgICAg ICAgLmNvbnRleHQoImZhaWxlZCB0byB3cml0ZSBzdGF0ZSBmaWxlIHdoZW4gYWRkaW5nIHRyYWNr ZWQgdGFza3MiKT87CisKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgLy8vIEl0ZXJhdGUg b3ZlciBjYWNoZWQgdGFza3MuCisgICAgLy8vCisgICAgLy8vIFRoaXMgZnVuY3Rpb24gd2lsbCBy ZXF1ZXN0IGEgbm9uLWV4Y2x1c2l2ZSByZWFkLWxvY2ssIGRvbid0IGNhbGwgaWYKKyAgICAvLy8g eW91IGFscmVhZHkgaG9sZCBhIGxvY2sgZm9yIHRoaXMgY2FjaGUuIFNlZSBbYFNlbGY6OmdldF90 YXNrc193aXRoX2xvY2tgXS4KKyAgICBwdWIgZm4gZ2V0X3Rhc2tzKCZzZWxmLCBtb2RlOiBHZXRU YXNrcykgLT4gUmVzdWx0PFRhc2tBcmNoaXZlSXRlcmF0b3IsIEVycm9yPiB7CisgICAgICAgIGxl dCBsb2NrID0gc2VsZgorICAgICAgICAgICAgLmxvY2soZmFsc2UpCisgICAgICAgICAgICAuY29u dGV4dCgiZ2V0X3Rhc2tzOiBmYWlsZWQgdG8gYWNxdWlyZSBsb2NrIik/OworICAgICAgICBzZWxm LmdldF90YXNrc193aXRoX2xvY2sobW9kZSwgbG9jaykKKyAgICAgICAgICAgIC5jb250ZXh0KCJm YWlsZWQgdG8gY3JlYXRlIHRhc2sgYXJjaGl2ZSBpdGVyYXRvciIpCisgICAgfQorCisgICAgLy8v IEl0ZXJhdGUgb3ZlciBjYWNoZWQgdGFza3MuCisgICAgLy8vCisgICAgLy8vIFRoaXMgZnVuY3Rp b24gcmVxdWlyZXMgeW91IHRvIHBhc3MgYSBsb2NrLiBJZiB5b3Ugd2FudCB0byBjb250aW51ZSB0 byBob2xkIHRoZSBsb2NrCisgICAgLy8vIGFmdGVyIGl0ZXJhdGluZywgeW91IGNhbiBjb25zdW1l IHRoZSBpdGVyYXRvciBieSBjYWxsaW5nCisgICAgLy8vIFtgVGFza0FyY2hpdmVJdGVyYXRvcjo6 aW50b19sb2NrYF0sIHlpZWxkaW5nIHRoZSBvcmlnaW5hbCBsb2NrLgorICAgIHB1YiBmbiBnZXRf dGFza3Nfd2l0aF9sb2NrKAorICAgICAgICAmc2VsZiwKKyAgICAgICAgbW9kZTogR2V0VGFza3Ms CisgICAgICAgIGxvY2s6IFRhc2tDYWNoZUxvY2ssCisgICAgKSAtPiBSZXN1bHQ8VGFza0FyY2hp dmVJdGVyYXRvciwgRXJyb3I+IHsKKyAgICAgICAgbWF0Y2ggbW9kZSB7CisgICAgICAgICAgICBH ZXRUYXNrczo6QWxsID0+IHsKKyAgICAgICAgICAgICAgICBsZXQgYXJjaGl2ZV9maWxlcyA9IHNl bGYuYXJjaGl2ZV9maWxlcygpPy5pbnRvX2l0ZXIoKS5tYXAofHBhaXJ8IHBhaXIuZmlsZSk7Cisg ICAgICAgICAgICAgICAgbGV0IGFsbF9maWxlcyA9IFtzZWxmLmJhc2VfcGF0aC5qb2luKEFDVElW RV9GSUxFTkFNRSldCisgICAgICAgICAgICAgICAgICAgIC5pbnRvX2l0ZXIoKQorICAgICAgICAg ICAgICAgICAgICAuY2hhaW4oYXJjaGl2ZV9maWxlcyk7CisKKyAgICAgICAgICAgICAgICBPayhU YXNrQXJjaGl2ZUl0ZXJhdG9yOjpuZXcoQm94OjpuZXcoYWxsX2ZpbGVzKSwgbG9jaykpCisgICAg ICAgICAgICB9CisgICAgICAgICAgICBHZXRUYXNrczo6QWN0aXZlID0+IHsKKyAgICAgICAgICAg ICAgICBsZXQgZmlsZXMgPSBbc2VsZi5iYXNlX3BhdGguam9pbihBQ1RJVkVfRklMRU5BTUUpXTsK KyAgICAgICAgICAgICAgICBPayhUYXNrQXJjaGl2ZUl0ZXJhdG9yOjpuZXcoQm94OjpuZXcoZmls ZXMuaW50b19pdGVyKCkpLCBsb2NrKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNbY2Zn KHRlc3QpXQorICAgICAgICAgICAgR2V0VGFza3M6OkFyY2hpdmVkID0+IHsKKyAgICAgICAgICAg ICAgICBsZXQgZmlsZXMgPSBzZWxmLmFyY2hpdmVfZmlsZXMoKT87CisKKyAgICAgICAgICAgICAg ICBPayhUYXNrQXJjaGl2ZUl0ZXJhdG9yOjpuZXcoCisgICAgICAgICAgICAgICAgICAgIEJveDo6 bmV3KGZpbGVzLmludG9faXRlcigpLm1hcCh8cGFpcnwgcGFpci5maWxlKSksCisgICAgICAgICAg ICAgICAgICAgIGxvY2ssCisgICAgICAgICAgICAgICAgKSkKKyAgICAgICAgICAgIH0KKyAgICAg ICAgfQorICAgIH0KKworICAgIC8vLyBXcml0ZSB0aGUgcHJvdmlkZWQgdGFza3MgdG8gdGhlICdh Y3RpdmUnIGZpbGUuCisgICAgLy8vCisgICAgLy8vIFRoZSB0YXNrcyBhcmUgZmlyc3Qgd3JpdHRl biB0byBhIHRlbXBvcmFyeSBmaWxlLCB3aGljaCBpcyB0aGVuIHVzZWQKKyAgICAvLy8gdG8gYXRv bWljYWxseSByZXBsYWNlIHRoZSBvcmlnaW5hbC4KKyAgICBmbiB3cml0ZV9hY3RpdmVfdGFza3Mo JnNlbGYsIHRhc2tzOiBpbXBsIEl0ZXJhdG9yPEl0ZW0gPSBUYXNrQ2FjaGVJdGVtPikgLT4gUmVz dWx0PCgpLCBFcnJvcj4geworICAgICAgICBsZXQgKGZkLCBwYXRoKSA9IHByb3htb3hfc3lzOjpm czo6bWFrZV90bXBfZmlsZSgKKyAgICAgICAgICAgIHNlbGYuYmFzZV9wYXRoLmpvaW4oQUNUSVZF X0ZJTEVOQU1FKSwKKyAgICAgICAgICAgIHNlbGYuY3JlYXRlX29wdGlvbnMsCisgICAgICAgICk/ OworICAgICAgICBsZXQgbXV0IGZkID0gQnVmV3JpdGVyOjpuZXcoZmQpOworCisgICAgICAgIFNl bGY6OndyaXRlX3Rhc2tzKCZtdXQgZmQsIHRhc2tzKT87CisKKyAgICAgICAgaWYgbGV0IEVycihl cnIpID0gZmQuZmx1c2goKSB7CisgICAgICAgICAgICBsb2c6OmVycm9yISgiY291bGQgbm90IGZs dXNoICdhY3RpdmUnIGZpbGU6IHtlcnJ9Iik7CisgICAgICAgIH0KKyAgICAgICAgZHJvcChmZCk7 CisKKyAgICAgICAgbGV0IHRhcmdldCA9IHNlbGYuYmFzZV9wYXRoLmpvaW4oQUNUSVZFX0ZJTEVO QU1FKTsKKworICAgICAgICBsZXQgcmVzID0gc3RkOjpmczo6cmVuYW1lKCZwYXRoLCAmdGFyZ2V0 KS53aXRoX2NvbnRleHQofHwgeworICAgICAgICAgICAgZm9ybWF0ISgKKyAgICAgICAgICAgICAg ICAiZmFpbGVkIHRvIHJlcGxhY2Uge30gd2l0aCB7fSIsCisgICAgICAgICAgICAgICAgdGFyZ2V0 LmRpc3BsYXkoKSwKKyAgICAgICAgICAgICAgICBwYXRoLmRpc3BsYXkoKSwKKyAgICAgICAgICAg ICkKKyAgICAgICAgfSk7CisKKyAgICAgICAgaWYgbGV0IEVycihlcnIpID0gcmVzIHsKKyAgICAg ICAgICAgIGlmIGxldCBFcnIoZXJyKSA9IHN0ZDo6ZnM6OnJlbW92ZV9maWxlKCZwYXRoKSB7Cisg ICAgICAgICAgICAgICAgbG9nOjplcnJvciEoImZhaWxlZCB0byBjbGVhbnVwIHRlbXBvcmFyeSBm aWxlIHt9OiB7ZXJyfSIsIHBhdGguZGlzcGxheSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAg ICAgICAgcmV0dXJuIEVycihlcnIpOworICAgICAgICB9CisKKyAgICAgICAgT2soKCkpCisgICAg fQorCisgICAgLy8vIFJlYWQgdGhlIHN0YXRlIGZpbGUuCisgICAgLy8vIElmIHRoZSBzdGF0ZSBm aWxlIGNvdWxkIG5vdCBiZSByZWFkIG9yIGRvZXMgbm90IGV4aXN0LCB0aGUgZGVmYXVsdCAoZW1w dHkpIHN0YXRlCisgICAgLy8vIGlzIHJldHVybmVkLgorICAgIC8vLyBBIGxvY2sgaXMgb25seSBu ZWNlc3NhcnkgaWYgdGhlIHJldHVybmVkIHN0YXRlIGlzIG1vZGlmaWVkIGFuZCBsYXRlciBwYXNz ZWQKKyAgICAvLy8gdG8gW2BTZWxmOjp3cml0ZV9zdGF0ZWBdLiBJbiBjYXNlIG9mIGEgcmVhZC1v bmx5IGFjY2VzcyBubyBsb2NrIGlzIG5lY2Vzc2FyeSwgYXMKKyAgICAvLy8gdGhlIHN0YXRlIGZp bGUgaXMgYWx3YXlzIHJlcGxhY2VkIGF0b21pY2FsbHkuCisgICAgcHViIGZuIHJlYWRfc3RhdGUo JnNlbGYpIC0+IFN0YXRlIHsKKyAgICAgICAgZm4gZG9fcmVhZF9zdGF0ZShwYXRoOiAmUGF0aCkg LT4gUmVzdWx0PFN0YXRlLCBFcnJvcj4geworICAgICAgICAgICAgbWF0Y2ggc3RkOjpmczo6cmVh ZChwYXRoKSB7CisgICAgICAgICAgICAgICAgT2soY29udGVudCkgPT4gc2VyZGVfanNvbjo6ZnJv bV9zbGljZSgmY29udGVudCkubWFwX2Vycih8ZXJyfCBlcnIuaW50bygpKSwKKyAgICAgICAgICAg ICAgICBFcnIoZXJyKSBpZiBlcnIua2luZCgpID09IEVycm9yS2luZDo6Tm90Rm91bmQgPT4gT2so RGVmYXVsdDo6ZGVmYXVsdCgpKSwKKyAgICAgICAgICAgICAgICBFcnIoZXJyKSA9PiBFcnIoZXJy LmludG8oKSksCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBsZXQgcGF0aCA9 IHNlbGYuYmFzZV9wYXRoLmpvaW4oU1RBVEVfRklMRU5BTUUpOworICAgICAgICBkb19yZWFkX3N0 YXRlKCZwYXRoKS51bndyYXBfb3JfZWxzZSh8ZXJyfCB7CisgICAgICAgICAgICBsb2c6OmVycm9y ISgiY291bGQgbm90IHJlYWQgc3RhdGUgZmlsZToge2Vycn0iKTsKKyAgICAgICAgICAgIERlZmF1 bHQ6OmRlZmF1bHQoKQorICAgICAgICB9KQorICAgIH0KKworICAgIC8vLyBXcml0ZSB0aGUgc3Rh dGUgZmlsZS4KKyAgICAvLy8gVGhlIHRhc2sgYXJjaGl2ZSBzaG91bGQgYmUgbG9ja2VkIGZvciB3 cml0aW5nIHdoZW4gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICAgIGZuIHdyaXRlX3N0YXRlKCZz ZWxmLCBzdGF0ZTogU3RhdGUpIC0+IFJlc3VsdDwoKSwgRXJyb3I+IHsKKyAgICAgICAgbGV0IHBh dGggPSBzZWxmLmJhc2VfcGF0aC5qb2luKFNUQVRFX0ZJTEVOQU1FKTsKKworICAgICAgICBsZXQg ZGF0YSA9IHNlcmRlX2pzb246OnRvX3ZlY19wcmV0dHkoJnN0YXRlKT87CisKKyAgICAgICAgcHJv eG1veF9zeXM6OmZzOjpyZXBsYWNlX2ZpbGUocGF0aCwgJmRhdGEsIHNlbGYuY3JlYXRlX29wdGlv bnMsIHRydWUpPzsKKworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyBh IGxpc3Qgb2YgZXhpc3RpbmcgYXJjaGl2ZSBmaWxlcywgdG9nZXRoZXIgd2l0aCB0aGVpciByZXNw ZWN0aXZlCisgICAgLy8vIGN1dC1vZmYgdGltZXN0YW1wLiBUaGUgcmVzdWx0IGlzIHNvcnRlZCBh c2NlbmRpbmcgYnkgY3V0LW9mZiB0aW1lc3RhbXAgKG1vc3QgcmVjZW50IG9uZQorICAgIC8vLyBm aXJzdCkuCisgICAgLy8vIFRoZSB0YXNrIGFyY2hpdmUgc2hvdWxkIGJlIGxvY2tlZCBmb3IgcmVh ZGluZyB3aGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAgICBmbiBhcmNoaXZlX2ZpbGVzKCZz ZWxmKSAtPiBSZXN1bHQ8VmVjPEFyY2hpdmVGaWxlPiwgRXJyb3I+IHsKKyAgICAgICAgbGV0IG11 dCBuYW1lcyA9IFZlYzo6bmV3KCk7CisKKyAgICAgICAgZm9yIGVudHJ5IGluIHN0ZDo6ZnM6OnJl YWRfZGlyKCZzZWxmLmJhc2VfcGF0aCk/IHsKKyAgICAgICAgICAgIGxldCBlbnRyeSA9IGVudHJ5 PzsKKworICAgICAgICAgICAgaWYgbGV0IFNvbWUoZW5kdGltZSkgPSBlbnRyeQorICAgICAgICAg ICAgICAgIC5wYXRoKCkKKyAgICAgICAgICAgICAgICAuZmlsZV9uYW1lKCkKKyAgICAgICAgICAg ICAgICAuYW5kX3RoZW4ofHN8IHMudG9fc3RyKCkpCisgICAgICAgICAgICAgICAgLmFuZF90aGVu KHxzfCBzLnN0cmlwX3ByZWZpeChBUkNISVZFX0ZJTEVOQU1FX1BSRUZJWCkpCisgICAgICAgICAg ICB7CisgICAgICAgICAgICAgICAgbWF0Y2ggZW5kdGltZS5wYXJzZSgpIHsKKyAgICAgICAgICAg ICAgICAgICAgT2soc3RhcnR0aW1lKSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICBuYW1l cy5wdXNoKEFyY2hpdmVGaWxlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydHRp bWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZW50cnkucGF0aCgpLAorICAg ICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAg ICAgICAgICAgICAgRXJyKGVycikgPT4gbG9nOjplcnJvciEoCisgICAgICAgICAgICAgICAgICAg ICAgICAiY291bGQgbm90IHBhcnNlIGFyY2hpdmUgdGltZXN0YW1wIGZvciBmaWxlIHt9OiB7ZXJy fSIsCisgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS5wYXRoKCkuZGlzcGxheSgpCisgICAg ICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAg ICAgICB9CisKKyAgICAgICAgbmFtZXMuc29ydF9ieV9rZXkofGV8IC1lLnN0YXJ0dGltZSk7CisK KyAgICAgICAgT2sobmFtZXMpCisgICAgfQorCisgICAgLy8vIE1lcmdlIGB0YXNrc2Agd2l0aCBh biBleGlzdGluZyBhcmNoaXZlIGZpbGUuCisgICAgLy8vIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0 aGF0IGB0YXNrc2AgYW5kIHRoZSBwcmUtZXhpc3RpbmcgY29udGVudHMgb2YgdGhlIGFyY2hpdmUK KyAgICAvLy8gZmlsZSBhcmUgYm90aCBzb3J0ZWQgZGVzY2VuZGluZyBieSBzdGFydGltZSAobW9z dCByZWNlbnQgdGFza3MgY29tZSBmaXJzdCkuCisgICAgLy8vIFRoZSB0YXNrIGFyY2hpdmUgbXVz dCBiZSBsb2NrZWQgd2hlbiBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgICAgZm4gbWVyZ2Vfc2lu Z2xlX2FyY2hpdmVfZmlsZSgKKyAgICAgICAgJnNlbGYsCisgICAgICAgIHRhc2tzOiBWZWM8VGFz a0NhY2hlSXRlbT4sCisgICAgICAgIGZpbGU6ICZQYXRoLAorICAgICkgLT4gUmVzdWx0PCgpLCBF cnJvcj4geworICAgICAgICBpZiB0YXNrcy5pc19lbXB0eSgpIHsKKyAgICAgICAgICAgIHJldHVy biBPaygoKSk7CisgICAgICAgIH0KKworICAgICAgICBsZXQgKGZkLCBuZXdfcGF0aCkgPSBwcm94 bW94X3N5czo6ZnM6Om1ha2VfdG1wX2ZpbGUoZmlsZSwgc2VsZi5jcmVhdGVfb3B0aW9ucyk/Owor ICAgICAgICBsZXQgbXV0IHdyaXRlciA9IEJ1ZldyaXRlcjo6bmV3KGZkKTsKKworICAgICAgICBt YXRjaCBGaWxlOjpvcGVuKGZpbGUpIHsKKyAgICAgICAgICAgIE9rKGZpbGUpID0+IHsKKyAgICAg ICAgICAgICAgICBsZXQgYXJjaGl2ZV9yZWFkZXIgPSBCdWZSZWFkZXI6Om5ldyhmaWxlKTsKKyAg ICAgICAgICAgICAgICBsZXQgYXJjaGl2ZV9pdGVyID0gQXJjaGl2ZUl0ZXJhdG9yOjpuZXcoYXJj aGl2ZV9yZWFkZXIpCisgICAgICAgICAgICAgICAgICAgIC5mbGF0X21hcCh8aXRlbXwgbWF0Y2gg aXRlbSB7CisgICAgICAgICAgICAgICAgICAgICAgICBPayhpdGVtKSA9PiBTb21lKGl0ZW0pLAor ICAgICAgICAgICAgICAgICAgICAgICAgRXJyKGVycikgPT4geworICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGxvZzo6ZXJyb3IhKCJjb3VsZCBub3QgcmVhZCB0YXNrIGNhY2hlIGl0ZW0gd2hp bGUgbWVyZ2luZzoge2Vycn0iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lCisg ICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAg ICAgICAgICAgICAgIC5wZWVrYWJsZSgpOworICAgICAgICAgICAgICAgIGxldCB0YXNrX2l0ZXIg PSB0YXNrcy5pbnRvX2l0ZXIoKS5wZWVrYWJsZSgpOworCisgICAgICAgICAgICAgICAgU2VsZjo6 d3JpdGVfdGFza3MoJm11dCB3cml0ZXIsIE1lcmdlVGFza0l0ZXJhdG9yOjpuZXcoYXJjaGl2ZV9p dGVyLCB0YXNrX2l0ZXIpKT87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFcnIoZXJyKSBp ZiBlcnIua2luZCgpID09IEVycm9yS2luZDo6Tm90Rm91bmQgPT4geworICAgICAgICAgICAgICAg IFNlbGY6OndyaXRlX3Rhc2tzKCZtdXQgd3JpdGVyLCB0YXNrcy5pbnRvX2l0ZXIoKSk/OworICAg ICAgICAgICAgfQorICAgICAgICAgICAgRXJyKGVycikgPT4gcmV0dXJuIEVycihlcnIuaW50bygp KSwKKyAgICAgICAgfQorCisgICAgICAgIGlmIGxldCBFcnIoZXJyKSA9IHdyaXRlci5mbHVzaCgp IHsKKyAgICAgICAgICAgIGxvZzo6ZXJyb3IhKCJjb3VsZCBub3QgZmx1c2ggQnVmV3JpdGVyIGZv ciB7ZmlsZTo/fToge2Vycn0iKTsKKyAgICAgICAgfQorICAgICAgICBkcm9wKHdyaXRlcik7CisK KyAgICAgICAgaWYgbGV0IEVycihlcnIpID0gc3RkOjpmczo6cmVuYW1lKCZuZXdfcGF0aCwgZmls ZSkud2l0aF9jb250ZXh0KHx8IHsKKyAgICAgICAgICAgIGZvcm1hdCEoCisgICAgICAgICAgICAg ICAgImZhaWxlZCB0byByZXBsYWNlIHt9IHdpdGgge30iLAorICAgICAgICAgICAgICAgIGZpbGUu ZGlzcGxheSgpLAorICAgICAgICAgICAgICAgIG5ld19wYXRoLmRpc3BsYXkoKQorICAgICAgICAg ICAgKQorICAgICAgICB9KSB7CisgICAgICAgICAgICBpZiBsZXQgRXJyKGVycikgPSBzdGQ6OmZz OjpyZW1vdmVfZmlsZSgmbmV3X3BhdGgpIHsKKyAgICAgICAgICAgICAgICBsb2c6OmVycm9yISgK KyAgICAgICAgICAgICAgICAgICAgImZhaWxlZCB0byBjbGVhbiB1cCB0ZW1wb3JhcnkgZmlsZSB7 fToge2Vycn0iLAorICAgICAgICAgICAgICAgICAgICBuZXdfcGF0aC5kaXNwbGF5KCkKKyAgICAg ICAgICAgICAgICApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gRXJyKGVy cik7CisgICAgICAgIH0KKworICAgICAgICBPaygoKSkKKyAgICB9CisKKyAgICAvLy8gV3JpdGUg YW4gaXRlcmF0b3Igb2YgW2BUYXNrQ2FjaGVJdGVtYF0gdG8gYSBzb21ldGhpbmcgdGhhdCBpbXBs ZW1lbnRzIFtgV3JpdGVgXS4KKyAgICAvLy8gVGhlIGluZGl2aWR1YWwgaXRlbXMgYXJlIGVuY29k ZWQgYXMgSlNPTiBmb2xsb3dlZCBieSBhIG5ld2xpbmUuCisgICAgLy8vIFRoZSB0YXNrIGFyY2hp dmUgc2hvdWxkIGJlIGxvY2tlZCB3aGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAgICBmbiB3 cml0ZV90YXNrcygKKyAgICAgICAgd3JpdGVyOiAmbXV0IGltcGwgV3JpdGUsCisgICAgICAgIHRh c2tzOiBpbXBsIEl0ZXJhdG9yPEl0ZW0gPSBUYXNrQ2FjaGVJdGVtPiwKKyAgICApIC0+IFJlc3Vs dDwoKSwgRXJyb3I+IHsKKyAgICAgICAgZm9yIHRhc2sgaW4gdGFza3MgeworICAgICAgICAgICAg c2VyZGVfanNvbjo6dG9fd3JpdGVyKCZtdXQgKndyaXRlciwgJnRhc2spPzsKKyAgICAgICAgICAg IHdyaXRlbG4hKHdyaXRlcik/OworICAgICAgICB9CisKKyAgICAgICAgT2soKCkpCisgICAgfQor fQorCisvLy8gQ29tcGFyaXNvbiBmdW5jdGlvbiBmb3Igc29ydGluZyB0YXNrcy4KKy8vLyBUaGUg dGFza3MgYXJlIGNvbXBhcmVkIGJhc2VkIG9uIHRoZSB0YXNrJ3Mgc3RhcnQgdGltZSwgZmFsbGlu ZworLy8vIGJhY2sgdG8gdGhlIHRhc2sncyBVUElEIGFzIGEgc2Vjb25kYXJ5IGNyaXRlcmlvbiBp biBjYXNlIHRoZQorLy8vIHN0YXJ0IHRpbWVzIGFyZSBlcXVhbC4KK3B1YiBmbiBjb21wYXJlX3Rh c2tzKGE6ICZUYXNrQ2FjaGVJdGVtLCBiOiAmVGFza0NhY2hlSXRlbSkgLT4gT3JkZXJpbmcgewor ICAgIGEuc3RhcnR0aW1lCisgICAgICAgIC5jbXAoJmIuc3RhcnR0aW1lKQorICAgICAgICAudGhl bl93aXRoKHx8IGIudXBpZC50b19zdHJpbmcoKS5jbXAoJmEudXBpZC50b19zdHJpbmcoKSkpCit9 CisKKy8vLyBDb21wYXJpc29uIGZ1bmN0aW9uIGZvciBzb3J0aW5nIHRhc2tzLCByZXZlcnNlZAor Ly8vIFRoZSB0YXNrcyBhcmUgY29tcGFyZWQgYmFzZWQgb24gdGhlIHRhc2sncyBzdGFydCB0aW1l LCBmYWxsaW5nCisvLy8gYmFjayB0byB0aGUgdGFzaydzIFVQSUQgYXMgYSBzZWNvbmRhcnkgY3Jp dGVyaW9uIGluIGNhc2UgdGhlCisvLy8gc3RhcnQgdGltZXMgYXJlIGVxdWFsLgorcHViIGZuIGNv bXBhcmVfdGFza3NfcmV2ZXJzZShhOiAmVGFza0NhY2hlSXRlbSwgYjogJlRhc2tDYWNoZUl0ZW0p IC0+IE9yZGVyaW5nIHsKKyAgICBjb21wYXJlX3Rhc2tzKGEsIGIpLnJldmVyc2UoKQorfQorCisv Ly8gSXRlcmF0b3Igb3ZlciB0aGUgdGFzayBhcmNoaXZlLgorcHViIHN0cnVjdCBUYXNrQXJjaGl2 ZUl0ZXJhdG9yIHsKKyAgICAvLy8gQXJjaGl2ZSBmaWxlcyB0byByZWFkLgorICAgIGZpbGVzOiBC b3g8ZHluIEl0ZXJhdG9yPEl0ZW0gPSBQYXRoQnVmPj4sCisgICAgLy8vIEFyY2hpdmUgaXRlcmF0 b3Igd2UgYXJlIGN1cnJlbnRseSB1c2luZywgaWYgYW55CisgICAgY3VycmVudDogT3B0aW9uPEFy Y2hpdmVJdGVyYXRvcjxCdWZSZWFkZXI8RmlsZT4+PiwKKyAgICAvLy8gTG9jayBmb3IgdGhpcyBh cmNoaXZlLgorICAgIGxvY2s6IFRhc2tDYWNoZUxvY2ssCit9CisKK2ltcGwgVGFza0FyY2hpdmVJ dGVyYXRvciB7CisgICAgLy8vIENyZWF0ZSBhIG5ldyB0YXNrIGFyY2hpdmUgaXRlcmF0b3IuCisg ICAgcHViIGZuIG5ldyhmaWxlczogQm94PGR5biBJdGVyYXRvcjxJdGVtID0gUGF0aEJ1Zj4+LCBs b2NrOiBUYXNrQ2FjaGVMb2NrKSAtPiBTZWxmIHsKKyAgICAgICAgU2VsZiB7CisgICAgICAgICAg ICBmaWxlcywKKyAgICAgICAgICAgIGN1cnJlbnQ6IE5vbmUsCisgICAgICAgICAgICBsb2NrLAor ICAgICAgICB9CisgICAgfQorCisgICAgLy8vIFJldHVybiB0aGUgdGFzayBhcmNoaXZlIGxvY2ss IGNvbnN1bWluZyBgc2VsZmAuCisgICAgcHViIGZuIGludG9fbG9jayhzZWxmKSAtPiBUYXNrQ2Fj aGVMb2NrIHsKKyAgICAgICAgc2VsZi5sb2NrCisgICAgfQorfQorCitpbXBsIEl0ZXJhdG9yIGZv ciAmbXV0IFRhc2tBcmNoaXZlSXRlcmF0b3IgeworICAgIHR5cGUgSXRlbSA9IFJlc3VsdDxUYXNr Q2FjaGVJdGVtLCBFcnJvcj47CisKKyAgICBmbiBuZXh0KCZtdXQgc2VsZikgLT4gT3B0aW9uPFNl bGY6Okl0ZW0+IHsKKyAgICAgICAgbG9vcCB7CisgICAgICAgICAgICBtYXRjaCAmbXV0IHNlbGYu Y3VycmVudCB7CisgICAgICAgICAgICAgICAgU29tZShjdXJyZW50KSA9PiB7CisgICAgICAgICAg ICAgICAgICAgIGxldCBuZXh0ID0gY3VycmVudC5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAg IGlmIG5leHQuaXNfc29tZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXh0 OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAg c2VsZi5jdXJyZW50ID0gTm9uZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAg ICAgIH0KKyAgICAgICAgICAgICAgICBOb25lID0+ICdpbm5lcjogbG9vcCB7CisgICAgICAgICAg ICAgICAgICAgIC8vIFJldHVybnMgYE5vbmVgIGlmIG5vIG1vcmUgZmlsZXMgYXJlIGF2YWlsYWJs ZSwgc3RvcHBpbmcgaXRlcmF0aW9uLgorICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dF9maWxl ID0gc2VsZi5maWxlcy5uZXh0KCk/OworCisgICAgICAgICAgICAgICAgICAgIG1hdGNoIEZpbGU6 Om9wZW4oJm5leHRfZmlsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgT2soZmlsZSkgPT4g eworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhcmNoaXZlX3JlYWRlciA9IEJ1ZlJl YWRlcjo6bmV3KGZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhcmNoaXZl X2l0ZXIgPSBBcmNoaXZlSXRlcmF0b3I6Om5ldyhhcmNoaXZlX3JlYWRlcik7CisgICAgICAgICAg ICAgICAgICAgICAgICAgICAgc2VsZi5jdXJyZW50ID0gU29tZShhcmNoaXZlX2l0ZXIpOworICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrICdpbm5lcjsKKyAgICAgICAgICAgICAgICAg ICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIEVycihlcnIpID0+IHsKKyAgICAgICAg ICAgICAgICAgICAgICAgICAgICBsb2c6OmVycm9yISgiY291bGQgbm90IG9wZW4ge25leHRfZmls ZTo/fSB3aGlsZSBpdGVyYXRpb24gb3ZlciB0YXNrIGFyY2hpdmUgZmlsZXMsIHNraXBwaW5nOiB7 ZXJyfSIpCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0K KyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQor CisvLy8gQXJjaGl2ZSBmaWxlLgorI1tkZXJpdmUoQ2xvbmUsIERlYnVnKV0KK3N0cnVjdCBBcmNo aXZlRmlsZSB7CisgICAgLy8vIFRoZSBwYXRoIHRvIHRoZSBhcmNoaXZlIGZpbGUuCisgICAgZmls ZTogUGF0aEJ1ZiwKKyAgICAvLy8gVGhlIGFyY2hpdmUncyBsb3dlc3QgcGVybWl0dGVkIHN0YXJ0 dGltZSAoc2Vjb25kcyBzaW5jZSBVTklYIGVwb2NoKS4KKyAgICBzdGFydHRpbWU6IGk2NCwKK30K KworLy8vIEl0ZXJhdG9yIHRoYXQgbWVyZ2VzIHR3byBfc29ydGVkXyBgSXRlcmF0b3I8SXRlbSA9 IFRhc2tDYWNoZUl0ZW0+YCwgcmV0dXJuaW5nIHRoZSBpdGVtcworLy8vIGZyb20gYm90aCBpdGVy YXRvcnMgc29ydGVkLgorLy8vIFRoZSB0d28gaXRlcmF0b3JzIGFyZSBleHBlY3RlZCB0byBiZSBz b3J0ZWQgZGVzY2VuZGluZ2x5IGJhc2VkIG9uIHRoZSB0YXNrJ3Mgc3RhcnR0aW1lIGFuZAorLy8v IGFzY2VuZGluZ2x5IGJhc2VkIG9uIHRoZSB0YXNrJ3MgVVBJRCdzIHN0cmluZyByZXByZXNlbnRh dGlvbi4gVGhpcyBjYW4gYmUKKy8vLyBhY2hpZXZlZCBieSB1c2luZyB0aGUgW2Bjb21wYXJlX3Rh c2tzX3JldmVyc2VgXSBmdW5jdGlvbiB3aGVuIHNvcnRpbmcgYW4gYXJyYXkgb2YgdGFza3MuCitw dWIgc3RydWN0IE1lcmdlVGFza0l0ZXJhdG9yPFQ6IEl0ZXJhdG9yPEl0ZW0gPSBUYXNrQ2FjaGVJ dGVtPiwgVTogSXRlcmF0b3I8SXRlbSA9IFRhc2tDYWNoZUl0ZW0+PiB7CisgICAgbGVmdDogUGVl a2FibGU8VD4sCisgICAgcmlnaHQ6IFBlZWthYmxlPFU+LAorfQorCitpbXBsPFQsIFU+IE1lcmdl VGFza0l0ZXJhdG9yPFQsIFU+Cit3aGVyZQorICAgIFQ6IEl0ZXJhdG9yPEl0ZW0gPSBUYXNrQ2Fj aGVJdGVtPiwKKyAgICBVOiBJdGVyYXRvcjxJdGVtID0gVGFza0NhY2hlSXRlbT4sCit7CisgICAg Ly8vIENyZWF0ZSBhIG5ldyBtZXJnaW5nIGl0ZXJhdG9yLgorICAgIHB1YiBmbiBuZXcobGVmdDog UGVla2FibGU8VD4sIHJpZ2h0OiBQZWVrYWJsZTxVPikgLT4gU2VsZiB7CisgICAgICAgIFNlbGYg eyBsZWZ0LCByaWdodCB9CisgICAgfQorfQorCitpbXBsPFQsIFU+IEl0ZXJhdG9yIGZvciBNZXJn ZVRhc2tJdGVyYXRvcjxULCBVPgord2hlcmUKKyAgICBUOiBJdGVyYXRvcjxJdGVtID0gVGFza0Nh Y2hlSXRlbT4sCisgICAgVTogSXRlcmF0b3I8SXRlbSA9IFRhc2tDYWNoZUl0ZW0+LAoreworICAg IHR5cGUgSXRlbSA9IFQ6Okl0ZW07CisKKyAgICBmbiBuZXh0KCZtdXQgc2VsZikgLT4gT3B0aW9u PFQ6Okl0ZW0+IHsKKyAgICAgICAgbGV0IG9yZGVyID0gbWF0Y2ggKHNlbGYubGVmdC5wZWVrKCks IHNlbGYucmlnaHQucGVlaygpKSB7CisgICAgICAgICAgICAoU29tZShsKSwgU29tZShyKSkgPT4g U29tZShjb21wYXJlX3Rhc2tzKGwsIHIpKSwKKyAgICAgICAgICAgIChTb21lKF8pLCBOb25lKSA9 PiBTb21lKE9yZGVyaW5nOjpHcmVhdGVyKSwKKyAgICAgICAgICAgIChOb25lLCBTb21lKF8pKSA9 PiBTb21lKE9yZGVyaW5nOjpMZXNzKSwKKyAgICAgICAgICAgIChOb25lLCBOb25lKSA9PiBOb25l LAorICAgICAgICB9OworCisgICAgICAgIG1hdGNoIG9yZGVyIHsKKyAgICAgICAgICAgIFNvbWUo T3JkZXJpbmc6OkdyZWF0ZXIpID0+IHNlbGYubGVmdC5uZXh0KCksCisgICAgICAgICAgICBTb21l KE9yZGVyaW5nOjpMZXNzKSA9PiBzZWxmLnJpZ2h0Lm5leHQoKSwKKyAgICAgICAgICAgIFNvbWUo T3JkZXJpbmc6OkVxdWFsKSA9PiB7CisgICAgICAgICAgICAgICAgLy8gRGVkdXAgYnkgY29uc3Vt aW5nIHRoZSBvdGhlciBpdGVyYXRvciBhcyB3ZWxsCisgICAgICAgICAgICAgICAgbGV0IF8gPSBz ZWxmLnJpZ2h0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICBzZWxmLmxlZnQubmV4dCgpCisgICAg ICAgICAgICB9CisgICAgICAgICAgICBOb25lID0+IE5vbmUsCisgICAgICAgIH0KKyAgICB9Cit9 CisKKy8vLyBJdGVyYXRvciBmb3IgYSBzaW5nbGUgdGFzayBhcmNoaXZlIGZpbGUuCisvLy8KKy8v LyBUaGlzIGl0ZXJhdG9yIGltcGxlbWVudHMgYEl0ZXJhdG9yPEl0ZW0gPSBSZXN1bHQ8VGFza0Nh Y2hlSXRlbSwgRXJyb3I+YC4gV2hlbiBpdGVyYXRpbmcsCisvLy8gdGFza3MgYXJlIHJlYWQgbGlu ZSBieSBsaW5lLCB3aXRob3V0IGxlYWRpbmcgdGhlIGVudGlyZSBhcmNoaXZlIGZpbGUgaW50byBt ZW1vcnkuCitwdWIgc3RydWN0IEFyY2hpdmVJdGVyYXRvcjxUPiB7CisgICAgaXRlcjogTGluZXM8 VD4sCit9CisKK2ltcGw8VDogQnVmUmVhZD4gQXJjaGl2ZUl0ZXJhdG9yPFQ+IHsKKyAgICAvLy8g Q3JlYXRlIGEgbmV3IGl0ZXJhdG9yLgorICAgIHB1YiBmbiBuZXcoZmlsZTogVCkgLT4gU2VsZiB7 CisgICAgICAgIGxldCByZWFkZXIgPSBmaWxlLmxpbmVzKCk7CisKKyAgICAgICAgU2VsZiB7IGl0 ZXI6IHJlYWRlciB9CisgICAgfQorfQorCitpbXBsPFQ6IEJ1ZlJlYWQ+IEl0ZXJhdG9yIGZvciBB cmNoaXZlSXRlcmF0b3I8VD4geworICAgIHR5cGUgSXRlbSA9IFJlc3VsdDxUYXNrQ2FjaGVJdGVt LCBFcnJvcj47CisKKyAgICBmbiBuZXh0KCZtdXQgc2VsZikgLT4gT3B0aW9uPFNlbGY6Okl0ZW0+ IHsKKyAgICAgICAgc2VsZi5pdGVyLm5leHQoKS5tYXAofHJlc3VsdHwgeworICAgICAgICAgICAg cmVzdWx0CisgICAgICAgICAgICAgICAgLmFuZF90aGVuKHxsaW5lfCBPayhzZXJkZV9qc29uOjpm cm9tX3N0cigmbGluZSk/KSkKKyAgICAgICAgICAgICAgICAubWFwX2VycihJbnRvOjppbnRvKQor ICAgICAgICB9KQorICAgIH0KK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVz ZSBzdGQ6OmlvOjpDdXJzb3I7CisKKyAgICB1c2UgY3JhdGU6OnRlc3Rfc3VwcG9ydDo6dGVtcDo6 TmFtZWRUZW1wRGlyOworCisgICAgdXNlIHN1cGVyOjoqOworCisgICAgI1t0ZXN0XQorICAgIGZu IGFyY2hpdmVfaXRlcmF0b3IoKSAtPiBSZXN1bHQ8KCksIEVycm9yPiB7CisgICAgICAgIGxldCBm aWxlID0gciMiCisgICAgICAgICAgICB7InVwaWQiOiJwdmUtcmVtb3RlIVVQSUQ6cHZlOjAwMDM5 RTREOjAwMjYzOEI4OjY3QjRBOUQxOnN0b3BhbGw6OnJvb3RAcGFtOiIsInN0YXR1cyI6Ik9LIiwi ZW5kdGltZSI6MTIzNDUsICJzdGFydHRpbWUiOiAxMjM0fQorICAgICAgICAgICAgeyJ1cGlkIjoi cGJzLXJlbW90ZSFVUElEOnBiczowMDAwMDJCMjowMDAwMDE1ODowMDAwMDAwMDo2NzREODI4Qzps b2dyb3RhdGU6OnJvb3RAcGFtOiIsInN0YXR1cyI6Ik9LIiwiZW5kdGltZSI6MTIzNDUsICJzdGFy dHRpbWUiOiAxMjM0fQorICAgICAgICAgICAgaW52YWxpZCIjCisgICAgICAgICAgICAudHJpbV9z dGFydCgpOworCisgICAgICAgIGxldCBjdXJzb3IgPSBDdXJzb3I6Om5ldyhmaWxlLmFzX2J5dGVz KCkpOworICAgICAgICBsZXQgbXV0IGl0ZXIgPSBBcmNoaXZlSXRlcmF0b3I6Om5ldyhjdXJzb3Ip OworCisgICAgICAgIGFzc2VydF9lcSEoaXRlci5uZXh0KCkudW53cmFwKCkudW53cmFwKCkudXBp ZC5yZW1vdGUoKSwgInB2ZS1yZW1vdGUiKTsKKyAgICAgICAgYXNzZXJ0X2VxIShpdGVyLm5leHQo KS51bndyYXAoKS51bndyYXAoKS51cGlkLnJlbW90ZSgpLCAicGJzLXJlbW90ZSIpOworICAgICAg ICBhc3NlcnQhKGl0ZXIubmV4dCgpLnVud3JhcCgpLmlzX2VycigpKTsKKyAgICAgICAgYXNzZXJ0 IShpdGVyLm5leHQoKS5pc19ub25lKCkpOworCisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAg IGZuIHRhc2soc3RhcnR0aW1lOiBpNjQsIGVuZGVkOiBib29sKSAtPiBUYXNrQ2FjaGVJdGVtIHsK KyAgICAgICAgbGV0IChzdGF0dXMsIGVuZHRpbWUpID0gaWYgZW5kZWQgeworICAgICAgICAgICAg KFNvbWUoIk9LIi5pbnRvKCkpLCBTb21lKHN0YXJ0dGltZSArIDEwKSkKKyAgICAgICAgfSBlbHNl IHsKKyAgICAgICAgICAgIChOb25lLCBOb25lKQorICAgICAgICB9OworCisgICAgICAgIFRhc2tD YWNoZUl0ZW0geworICAgICAgICAgICAgdXBpZDogZm9ybWF0ISgKKyAgICAgICAgICAgICAgICAi cHZlLXJlbW90ZSFVUElEOnB2ZTowMDAzOUU0RDowMDI2MzhCODp7c3RhcnR0aW1lOjA4WH06c3Rv cGFsbDo6cm9vdEBwYW06IgorICAgICAgICAgICAgKQorICAgICAgICAgICAgLnBhcnNlKCkKKyAg ICAgICAgICAgIC51bndyYXAoKSwKKyAgICAgICAgICAgIHN0YXJ0dGltZSwKKyAgICAgICAgICAg IHN0YXR1cywKKyAgICAgICAgICAgIGVuZHRpbWUsCisgICAgICAgIH0KKyAgICB9CisKKyAgICBm biBhc3NlcnRfc3RhcnR0aW1lcyhjYWNoZTogJlRhc2tDYWNoZSwgc3RhcnR0aW1lczogJltpNjRd KSB7CisgICAgICAgIGxldCB0YXNrczogVmVjPGk2ND4gPSBjYWNoZQorICAgICAgICAgICAgLmdl dF90YXNrcyhHZXRUYXNrczo6QWxsKQorICAgICAgICAgICAgLnVud3JhcCgpCisgICAgICAgICAg ICAubWFwKHx0YXNrfCB0YXNrLnVud3JhcCgpLnN0YXJ0dGltZSkKKyAgICAgICAgICAgIC5jb2xs ZWN0KCk7CisKKyAgICAgICAgYXNzZXJ0X2VxISgmdGFza3MsIHN0YXJ0dGltZXMpOworICAgIH0K KworICAgIGZuIGFkZF90YXNrcyhjYWNoZTogJlRhc2tDYWNoZSwgdGFza3M6IFZlYzxUYXNrQ2Fj aGVJdGVtPikgLT4gUmVzdWx0PCgpLCBFcnJvcj4geworICAgICAgICBsZXQgcGFyYW0gPSBBZGRU YXNrcyB7CisgICAgICAgICAgICB1cGRhdGVfbW9zdF9yZWNlbnRfYXJjaGl2ZV90aW1lc3RhbXA6 IHRydWUsCisgICAgICAgICAgICB0YXNrcywKKyAgICAgICAgfTsKKyAgICAgICAgbGV0IG11dCBh ID0gSGFzaE1hcDo6bmV3KCk7CisgICAgICAgIGEuaW5zZXJ0KCJwdmUtcmVtb3RlIi5pbnRvKCks IHBhcmFtKTsKKworICAgICAgICBjYWNoZS5hZGRfdGFza3MoYSkKKyAgICB9CisKKyAgICAjW3Rl c3RdCisgICAgZm4gdGVzdF9hZGRfdGFza3MoKSAtPiBSZXN1bHQ8KCksIEVycm9yPiB7CisgICAg ICAgIGxldCB0bXBfZGlyID0gTmFtZWRUZW1wRGlyOjpuZXcoKT87CisgICAgICAgIGxldCBjYWNo ZSA9IFRhc2tDYWNoZTo6bmV3KHRtcF9kaXIucGF0aCgpLCBDcmVhdGVPcHRpb25zOjpuZXcoKSku dW53cmFwKCk7CisKKyAgICAgICAgY2FjaGUubmV3X2ZpbGUoMTAwMCk/OworICAgICAgICBhc3Nl cnRfZXEhKGNhY2hlLmFyY2hpdmVfZmlsZXMoKT8ubGVuKCksIDEpOworCisgICAgICAgIGFkZF90 YXNrcygmY2FjaGUsIHZlYyFbdGFzaygxMDAwLCB0cnVlKSwgdGFzaygxMDAxLCB0cnVlKV0pPzsK KworICAgICAgICBjYWNoZS5yb3RhdGUoMTUwMCwgMCwgMyk/OworICAgICAgICBhc3NlcnRfZXEh KGNhY2hlLmFyY2hpdmVfZmlsZXMoKT8ubGVuKCksIDIpOworCisgICAgICAgIGFkZF90YXNrcygm Y2FjaGUsIHZlYyFbdGFzaygxNTAwLCB0cnVlKSwgdGFzaygxNTAxLCB0cnVlKV0pPzsKKyAgICAg ICAgYWRkX3Rhc2tzKCZjYWNoZSwgdmVjIVt0YXNrKDEyMDAsIHRydWUpLCB0YXNrKDEzMDAsIHRy dWUpXSk/OworCisgICAgICAgIGNhY2hlLnJvdGF0ZSgyMDAwLCAwLCAzKT87CisgICAgICAgIGFz c2VydF9lcSEoY2FjaGUuYXJjaGl2ZV9maWxlcygpPy5sZW4oKSwgMyk7CisKKyAgICAgICAgYWRk X3Rhc2tzKCZjYWNoZSwgdmVjIVt0YXNrKDIwMDAsIHRydWUpXSk/OworICAgICAgICBhZGRfdGFz a3MoJmNhY2hlLCB2ZWMhW3Rhc2soMTUwMiwgdHJ1ZSldKT87CisgICAgICAgIGFkZF90YXNrcygm Y2FjaGUsIHZlYyFbdGFzaygxMDAyLCB0cnVlKV0pPzsKKworICAgICAgICAvLyBUaGVzZSBhcmUg YmVmb3JlIHRoZSBjdXQtb2ZmIG9mIDEwMDAsIHNvIHRoZXkgd2lsbCBiZSBkaXNjYXJkZWQuCisg ICAgICAgIGFkZF90YXNrcygmY2FjaGUsIHZlYyFbdGFzayg4MDAsIHRydWUpLCB0YXNrKDkwMCwg dHJ1ZSldKT87CisKKyAgICAgICAgLy8gVGhpcyBvbmUgc2hvdWxkIGJlIGRlZHVwZWQKKyAgICAg ICAgYWRkX3Rhc2tzKCZjYWNoZSwgdmVjIVt0YXNrKDEwMDAsIHRydWUpXSk/OworCisgICAgICAg IGFzc2VydF9zdGFydHRpbWVzKAorICAgICAgICAgICAgJmNhY2hlLAorICAgICAgICAgICAgJlsy MDAwLCAxNTAyLCAxNTAxLCAxNTAwLCAxMzAwLCAxMjAwLCAxMDAyLCAxMDAxLCAxMDAwXSwKKyAg ICAgICAgKTsKKworICAgICAgICBjYWNoZS5yb3RhdGUoMjUwMCwgMCwgMyk/OworCisgICAgICAg IGFzc2VydF9lcSEoY2FjaGUuYXJjaGl2ZV9maWxlcygpPy5sZW4oKSwgMyk7CisKKyAgICAgICAg YXNzZXJ0X3N0YXJ0dGltZXMoJmNhY2hlLCAmWzIwMDAsIDE1MDIsIDE1MDEsIDE1MDBdKTsKKwor ICAgICAgICBjYWNoZS5yb3RhdGUoMzAwMCwgMCwgMyk/OworICAgICAgICBhc3NlcnRfZXEhKGNh Y2hlLmFyY2hpdmVfZmlsZXMoKT8ubGVuKCksIDMpOworCisgICAgICAgIGFzc2VydF9zdGFydHRp bWVzKCZjYWNoZSwgJlsyMDAwXSk7CisKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgI1t0 ZXN0XQorICAgIGZuIHRlc3RfYWN0aXZlX3Rhc2tzX2FyZV9taWdyYXRlZF90b19hcmNoaXZlKCkg LT4gUmVzdWx0PCgpLCBFcnJvcj4geworICAgICAgICBsZXQgdG1wX2RpciA9IE5hbWVkVGVtcERp cjo6bmV3KCk/OworICAgICAgICBsZXQgY2FjaGUgPSBUYXNrQ2FjaGU6Om5ldyh0bXBfZGlyLnBh dGgoKSwgQ3JlYXRlT3B0aW9uczo6bmV3KCkpLnVud3JhcCgpOworCisgICAgICAgIGNhY2hlLm5l d19maWxlKDEwMDApPzsKKyAgICAgICAgYWRkX3Rhc2tzKCZjYWNoZSwgdmVjIVt0YXNrKDEwMDAs IGZhbHNlKSwgdGFzaygxMDAxLCBmYWxzZSldKT87CisgICAgICAgIGFzc2VydF9lcSEoY2FjaGUu Z2V0X3Rhc2tzKEdldFRhc2tzOjpBY3RpdmUpPy5jb3VudCgpLCAyKTsKKworICAgICAgICBsZXQg c3RhdGUgPSBjYWNoZS5yZWFkX3N0YXRlKCk7CisgICAgICAgIGFzc2VydF9lcSEoKnN0YXRlLm9s ZGVzdF9hY3RpdmVfdGFzay5nZXQoInB2ZS1yZW1vdGUiKS51bndyYXAoKSwgMTAwMCk7CisKKyAg ICAgICAgYWRkX3Rhc2tzKCZjYWNoZSwgdmVjIVt0YXNrKDEwMDAsIHRydWUpLCB0YXNrKDEwMDEs IHRydWUpXSk/OworCisgICAgICAgIGFzc2VydF9zdGFydHRpbWVzKCZjYWNoZSwgJlsxMDAxLCAx MDAwXSk7CisKKyAgICAgICAgYXNzZXJ0X2VxIShjYWNoZS5nZXRfdGFza3MoR2V0VGFza3M6OkFj dGl2ZSk/LmNvdW50KCksIDApOworCisgICAgICAgIE9rKCgpKQorICAgIH0KKworICAgICNbdGVz dF0KKyAgICBmbiB0ZXN0X2luaXQoKSAtPiBSZXN1bHQ8KCksIEVycm9yPiB7CisgICAgICAgIGxl dCB0bXBfZGlyID0gTmFtZWRUZW1wRGlyOjpuZXcoKT87CisgICAgICAgIGxldCBjYWNoZSA9IFRh c2tDYWNoZTo6bmV3KHRtcF9kaXIucGF0aCgpLCBDcmVhdGVPcHRpb25zOjpuZXcoKSkudW53cmFw KCk7CisKKyAgICAgICAgY2FjaGUuaW5pdCgxMDAwLCAzLCAxMDApPzsKKyAgICAgICAgYXNzZXJ0 X2VxIShjYWNoZS5hcmNoaXZlX2ZpbGVzKCk/LmxlbigpLCAzKTsKKworICAgICAgICBhZGRfdGFz a3MoCisgICAgICAgICAgICAmY2FjaGUsCisgICAgICAgICAgICB2ZWMhWworICAgICAgICAgICAg ICAgIHRhc2soMTA1MCwgdHJ1ZSksCisgICAgICAgICAgICAgICAgdGFzayg5NTAsIHRydWUpLAor ICAgICAgICAgICAgICAgIHRhc2soODUwLCB0cnVlKSwKKyAgICAgICAgICAgICAgICB0YXNrKDc1 MCwgdHJ1ZSksIC8vIFRoaXMgb25lIGlzIGRpc2NhcmRlZAorICAgICAgICAgICAgXSwKKyAgICAg ICAgKT87CisKKyAgICAgICAgYXNzZXJ0X2VxIShjYWNoZS5nZXRfdGFza3MoR2V0VGFza3M6OkFy Y2hpdmVkKT8uY291bnQoKSwgMyk7CisKKyAgICAgICAgT2soKCkpCisgICAgfQorCisgICAgI1t0 ZXN0XQorICAgIGZuIHRlc3RfdHJhY2tpbmdfdGFza3MoKSAtPiBSZXN1bHQ8KCksIEVycm9yPiB7 CisgICAgICAgIGxldCB0bXBfZGlyID0gTmFtZWRUZW1wRGlyOjpuZXcoKT87CisgICAgICAgIGxl dCBjYWNoZSA9IFRhc2tDYWNoZTo6bmV3KHRtcF9kaXIucGF0aCgpLCBDcmVhdGVPcHRpb25zOjpu ZXcoKSkudW53cmFwKCk7CisKKyAgICAgICAgY2FjaGUuaW5pdCgxMDAwLCAzLCAxMDApPzsKKwor ICAgICAgICBjYWNoZS5hZGRfdHJhY2tlZF90YXNrKHRhc2soMTA1MCwgZmFsc2UpKT87CisKKyAg ICAgICAgYXNzZXJ0X2VxIShjYWNoZS5nZXRfdGFza3MoR2V0VGFza3M6OkFjdGl2ZSk/LmNvdW50 KCksIDEpOworICAgICAgICBjYWNoZS5hZGRfdHJhY2tlZF90YXNrKHRhc2soMTA2MCwgZmFsc2Up KT87CisgICAgICAgIGFzc2VydF9lcSEoY2FjaGUuZ2V0X3Rhc2tzKEdldFRhc2tzOjpBY3RpdmUp Py5jb3VudCgpLCAyKTsKKworICAgICAgICBsZXQgc3RhdGUgPSBjYWNoZS5yZWFkX3N0YXRlKCk7 CisgICAgICAgIGFzc2VydF9lcSEoc3RhdGUudHJhY2tlZF90YXNrcy5nZXQoInB2ZS1yZW1vdGUi KS51bndyYXAoKS5sZW4oKSwgMik7CisgICAgICAgIGFzc2VydF9lcSEoKnN0YXRlLm9sZGVzdF9h Y3RpdmVfdGFzay5nZXQoInB2ZS1yZW1vdGUiKS51bndyYXAoKSwgMTA1MCk7CisKKyAgICAgICAg Ly8gTWFyayBmaXJzdCB0YXNrIGFzIGZpbmlzaGVkCisgICAgICAgIGFkZF90YXNrcygmY2FjaGUs IHZlYyFbdGFzaygxMDUwLCB0cnVlKV0pPzsKKworICAgICAgICBhc3NlcnRfZXEhKGNhY2hlLmdl dF90YXNrcyhHZXRUYXNrczo6QWN0aXZlKT8uY291bnQoKSwgMSk7CisgICAgICAgIGFzc2VydF9l cSEoY2FjaGUuZ2V0X3Rhc2tzKEdldFRhc2tzOjpBcmNoaXZlZCk/LmNvdW50KCksIDEpOworCisg ICAgICAgIC8vIE1hcmsgc2Vjb25kIHRhc2sgYXMgZmluaXNoZWQKKyAgICAgICAgYWRkX3Rhc2tz KCZjYWNoZSwgdmVjIVt0YXNrKDEwNjAsIHRydWUpXSk/OworCisgICAgICAgIGFzc2VydF9lcSEo Y2FjaGUuZ2V0X3Rhc2tzKEdldFRhc2tzOjpBY3RpdmUpPy5jb3VudCgpLCAwKTsKKyAgICAgICAg YXNzZXJ0X2VxIShjYWNoZS5nZXRfdGFza3MoR2V0VGFza3M6OkFyY2hpdmVkKT8uY291bnQoKSwg Mik7CisKKyAgICAgICAgT2soKCkpCisgICAgfQorfQotLSAKMi4zOS41CgoKCl9fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCnBkbS1kZXZlbCBtYWlsaW5nIGxp c3QKcGRtLWRldmVsQGxpc3RzLnByb3htb3guY29tCmh0dHBzOi8vbGlzdHMucHJveG1veC5jb20v Y2dpLWJpbi9tYWlsbWFuL2xpc3RpbmZvL3BkbS1kZXZlbAo=