[ruby-core:110752] [Ruby master Bug#19119] Add an interface for out-of-process profiling tools to access Ruby information
From:
"mame (Yusuke Endoh)" <noreply@...>
Date:
2022-11-14 10:28:17 UTC
List:
ruby-core #110752
SXNzdWUgIzE5MTE5IGhhcyBiZWVuIHVwZGF0ZWQgYnkgbWFtZSAoWXVzdWtlIEVuZG9oKS4KCgpU aGFua3MgZm9yIHRoZSBtb3RpdmF0aW9uIGFuZCBwcm9wb3NhbC4gSSB0aGluayBpdCdzIGEgZ29v ZCBpZGVhIGZvciBSdWJ5IHRvIHByb3ZpZGUgYSBtZWNoYW5pc20gZm9yIG1vbml0b3JpbmcuCgpJ IHVuZGVyc3Rvb2QgdGhpcyB0aWNrZXQgYXMgZm9sbG93cy4KCi0tLQoKV2hhdCB3ZSB3YW50IHRv IGRvOiBnZXQgUnVieSBzdGFjayB0cmFjZSBmcm9tIGFuIGV4dGVybmFsIHByb2Nlc3MgaW4gYSBm YXN0IGFuIHN0YWJsZSB3YXkKCkN1cnJlbnQgb3B0aW9ucyAoYW5kIHByb2JsZW1zKToKCiogVXNp bmcgcmJfcHJvZmlsZV9mcmFtZXMgKGhhcmQgdG8gY2FsbCBpdCBmcm9tIG91dHNpZGUgb2YgdGhl IGludGVycHJldGVyIHByb2Nlc3MpCiogQW5hbHl6aW5nIGByYl9jb250cm9sX2ZyYW1lX3RgLCB0 aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN0YWNrIGZyYW1lcyAoaGFyZCB0byBz dXBwb3J0IG11bHRpcGxlIFJ1YnkgdmVyc2lvbnMpCgpQcm9wb3NhbDogbWFuYWdlIGNsZWFuIGRh dGEgc3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgc3RhY2sgZnJhbWVzIHNlcGFyYXRlbHkgZnJv bSBgcmJfY29udHJvbF9mcmFtZV90YCwgYW5kIHJlYWQgaXQgZnJvbSBhbiBleHRlcm5hbCBwcm9j ZXNzLgoKLS0tCgpJIHRoaW5rIHRoZSBwcm9wb3NhbCBoYXMgdHdvIG1ham9yIGNvbmNlcm5zLgoK T25lIGlzIG92ZXJoZWFkLiBJdCBzZWVtcyB2ZXJ5IHdhc3RlZnVsIHRvIGFsd2F5cyBtYW5hZ2Ug dHdvIGRhdGEgc3RydWN0dXJlcyByZXByZXNlbnRpbmcgdGhlIHN0YWNrIGZyYW1lcy4KClRoZSBv dGhlciBpcyBkYXRhIHN5bmNocm9uaXphdGlvbi4gQW4gZXh0ZXJuYWwgcHJvY2VzcyBtYXkgZ2V0 IGNvcnJ1cHRlZCBkYXRhIGlmIGl0IGF0dGVtcHRzIHRvIHJlYWQgZHVyaW5nIGEgbWV0aG9kIGNh bGwgKGkuZS4sIHdoZW4gdGhlIGRhdGEgb2YgdGhlIHN0YWNrIGZyYW1lcyBpcyBiZWluZyB1cGRh dGVkKS4gVG8gcHJldmVudCB0aGlzLCB0aGUgUnVieSBpbnRlcnByZXRlciBzaG91bGQgYmUgc3Vz cGVuZGVkIGF0IGEgc2FmZSBwbGFjZSBiZWZvcmUgcmVhZGluZy4gSG93ZXZlciwgc3VjaCBhIHN5 bmNocm9uaXphdGlvbiBtYXkgaW5jcmVhc2UgdGhlIG92ZXJoZWFkIGV2ZW4gbW9yZS4KCgpTbywg SSB1bmRlcnN0YW5kIHRoZSBtb3RpdmF0aW9uLCBidXQgaXQgc2VlbXMgbGlrZSBhIGJldHRlciBB UEkgZGVzaWduIGlzIG5lZWRlZCAoQGtvMSBzZWVtcyB0byBoYXZlIHNvbWUgaWRlYXMpLiBJdCBt aWdodCBiZSBhIGdvb2QgaWRlYSB0byBpbnZlc3RpZ2F0ZSB3aGV0aGVyIGFuZCBob3cgb3RoZXIg aW50ZXJwcmV0ZXJzIGhhdmUgc29sdmVkIHRoaXMgcHJvYmxlbS4KCi0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQnVnICMxOTExOTogQWRkIGFuIGludGVyZmFjZSBmb3Ig b3V0LW9mLXByb2Nlc3MgcHJvZmlsaW5nIHRvb2xzIHRvIGFjY2VzcyBSdWJ5IGluZm9ybWF0aW9u Cmh0dHBzOi8vYnVncy5ydWJ5LWxhbmcub3JnL2lzc3Vlcy8xOTExOSNjaGFuZ2UtMTAwMDkwCgoq IEF1dGhvcjoga2p0c2FuYWt0c2lkaXMgKEtKIFRzYW5ha3RzaWRpcykKKiBTdGF0dXM6IE9wZW4K KiBQcmlvcml0eTogTm9ybWFsCiogQmFja3BvcnQ6IDIuNzogVU5LTk9XTiwgMy4wOiBVTktOT1dO LCAzLjE6IFVOS05PV04KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoK V2FybmluZzogdGhpcyBpcyBhIHZlcnkgbG9uZyBwcm9wb3NhbCA6KCBJIGRvbid0IHJlYWxseSBr bm93IHdoYXQgdGhlIG1vc3QgcHJvZHVjdGl2ZSB3YXkgdG8gZW5nYWdlIHdpdGggdGhlIFJ1Ynkg Y29tbXVuaXR5IGFib3V0IHRoaXMgaXMgLSBpZiB0aGVyZSdzIGEgYmV0dGVyIHBsYWNlIHRvIHRh a2UgdGhpcywgcGxlYXNlIGxldCBtZSBrbm93IQoKSSBhbHNvIHdhbnQgdG8gYWNrbm93bGVkZ2Ug QGl2b2Fuam8gZm9yIGNvbnRyaWJ1dGluZyB0byB0aGlzIHByb3Bvc2FsIC0gSSBib3VuY2VkIG1h bnkgaWRlYXMgYWJvdXQgcHJvZmlsaW5nIG9mZiBoaW0gYW5kIHRoZSBpbXByb3ZlZC1iYWNrdHJh Y2Ugc3R1ZmYgaXMgYWxsIGJhc2VkIG9uIGhpcyBbYmFja3RyYWNpZV0oaHR0cHM6Ly9naXRodWIu Y29tL2l2b2Fuam8vYmFja3RyYWNpZSkgZ2VtLgoKIyMgTW90aXZhdGlvbgoKV2hlbiBkZWFsaW5n IHdpdGggbGFyZ2UgYW5kIG9sZCBSdWJ5IGFwcHMsIHRoZXJlIGlzIG9mdGVuIGJvdGggYSBuZWVk IHRvIGltcHJvdmUgdGhlIHBlcmZvcm1hbmNlIG9mIHNvbWUgb3BlcmF0aW9ucywgYXMgd2VsbCBh cyBhIGxhY2sgb2YgdW5kZXJzdGFuZGluZyBhcyB0byBob3csIHByZWNpc2VseSwgdGhlIGNvZGUg d29ya3MsIGFuZCB3aGF0IGFzcGVjdCBvZiBpdCBpcyBhY3R1YWxseSBzbG93LiBGdXJ0aGVybW9y ZSwgdGhlIHBlcmZvcm1hbmNlIGlzc3VlcyBpbiBxdWVzdGlvbiBvZnRlbiBvbmx5IGFwcGVhciBp biBhIGxpdmUsIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQsIHdoZXJlIHRoZXJlIGlzIHNvbWUgdHJh ZmZpYyBwYXR0ZXJuIG9yIHVzZXIgZGF0YSBjYXVzaW5nIHRoZSBwcm9ibGVtLiBJbiBzaXR1YXRp b25zIGxpa2UgdGhpcywgcHJvZmlsaW5nIHRvb2xzIGNhbiBwcm92ZSBpbnZhbHVhYmxlIGluIGhl bHBpbmcgdG8gdW5kZXJzdGFuZCBhcHBsaWNhdGlvbiBwZXJmb3JtYW5jZSBpbi1zaXR1IGluIHBy b2R1Y3Rpb24uCgpUaGUgdGhpbmdzIHdoaWNoIGFuIGVuZ2luZWVyIG1pZ2h0IHVzZSBhIHByb2Zp bGVyIHRvIG1lYXN1cmUgaW5jbHVkZToKICAqIFdhbGwgY2xvY2sgdGltZTsgaG93IGxvbmcgZG8g cGFydGljdWxhciBtZXRob2QgY2FsbHMgdGFrZT8KICAqIENQVSB0aW1lOyBvZiB0aGUgdGltZSBh IG1ldGhvZCB0YWtlcywgaG93IGxvbmcgaXMgc3BlbnQgYWN0dWFsbHkgX3J1bm5pbmdfIG9uIHRo ZSBDUFUsIGFuZCBob3cgbXVjaCBpcyBzcGVudCBibG9ja2VkIHdhaXRpbmcgZm9yIGUuZy4gYSBu ZXR3b3JrIHJlc3BvbnNlPwogICogR1ZMIGNvbnRlbnRpb247IGlzIGFuIGFwcGxpY2F0aW9uIHVz aW5nIGxvdHMgb2YgdGhyZWFkcyBqdXN0IHdhaXRpbmcgZm9yIHRoZSBHVkwgdG8gYmVjb21lIGF2 YWlsYWJsZT8KICAqIEdDIHRpbWU7IGlzIGEgcGFydGljdWxhciBwaWVjZSBvZiBjb2RlIF9hY3R1 YWxseV8gc2xvdywgb3IgaXMgaXRzIHNsb3duZXNzIGp1c3QgYSByZXN1bHQgb2YgX290aGVyXyBj b2RlIGNhdXNpbmcgdGhlIEdDIHRvIGJlIGludm9rZWQ/CiAgKiBBbGxvY2F0aW9uczsgaG93IG1h bnkgb2JqZWN0cyBpcyBhIHBhcnRpY3VsYXIgcGllY2Ugb2YgY29kZSBhbGxvY2F0aW5nLCBhbmQg d2hhdCBpbXBhY3QgaXMgdGhpcyBoYXZpbmcgb24gR0M/CiAgKiBIZWFwOyBvZiB0aGUgb2JqZWN0 cyBhIHBhcnRpY3VsYXIgcGllY2Ugb2YgY29kZSBhbGxvY2F0ZWQsIGhvdyBtYW55IG9mIHRoZW0g YXJlIHN0aWxsIGxpdmU/IElzIHRoZXJlIHNvbWUga2luZCBvZiBsZWFrPwoKR2VuZXJhbGx5LCBp biBvcmRlciB0byBjb2xsZWN0IHRoaXMgaW5mb3JtYXRpb24gZnJvbSBwcm9kdWN0aW9uIGluIGEg bWluaW1hbGx5LWltcGFjdGZ1bCB3YXksIGEgc2FtcGxpbmcgYXBwcm9hY2ggaXMgdXNlZC4gQSBw cm9maWxpbmcgdG9vbCBwZXJpb2RpY2FsbHkgdGFrZXMgYSBzbmFwc2hvdCBvZiB0aGUgY3VycmVu dCBjYWxsLXN0YWNrIG9mIGEgUnVieSBwcm9ncmFtOyBkZXBlbmRpbmcgb24gd2hhdCBpcyBiZWlu ZyBtZWFzdXJlZCwgdGhpcyBwZXJpb2RpY2l0eSBtaWdodCBiZSBlLmcuIHNpbXBseSBldmVyeSBO IG1zIChmb3Igd2FsbC1jbG9jayBwcm9maWxpbmcpLCBldmVyeSBOIGFsbG9jYXRpb25zIChmb3Ig YWxsb2NhdGlvbiBwcm9maWxpbmcpLCBldGMuIFRoZW4sIHRoZSBkYXRhIHdpbGwgZ2VuZXJhbGx5 IGJlIGNvbWJpbmVkIGFjcm9zcyBtYW55IGluc3RhbmNlcyBvZiBhIHByb2dyYW0gdG8gZ2V0IGFu IGFnZ3JlZ2F0ZSB2aWV3ICh0aHJvdWdoIGUuZy4gYSBmbGFtZSBncmFwaCkuCgpJbiBhZGRpdGlv biB0byB0aGlzIGZsZWV0LXdpZGUgYWdncmVnYXRpb24sIGl0J3Mgc29tZXRpbWVzIHVzZWZ1bCB0 byBwcm9maWxlIGEgcGFydGljdWxhciBwcm9jZXNzIHdoaWNoIGhhcyBzdWRkZW5seSBzdGFydGVk IGRpc3BsYXlpbmcgc29tZSBwYXRob2xvZ3kgb2YgaW50ZXJlc3QuIEZvciBleGFtcGxlLCBpZiB5 b3UgaGFkIGEgd2Vic2VydmVyIHByb2Nlc3MgdGhhdCBoYWQgc3VkZGVubHkgYmVjb21lIHN0dWNr LCB5b3UgbWlnaHQgd2FudCB0byBhdHRhY2ggYSBwcm9maWxlciB0byBmaW5kIG91dCBfd2h5Xy4g SW4gc2NlbmFyaW9zIGxpa2UgdGhpcywgaXQncyBvZnRlbiBpbXBvc3NpYmxlIHRvIG1ha2Ugc29t ZSBhZGp1c3RtZW50IHRvIHRoZSBwcm9ncmFtIHRvIGVuYWJsZSBwcm9maWxpbmcgYW5kIHJlc3Rh cnQgaXQ7IHRoZSBhY3Qgb2YgcmVzdGFydGluZyBpdCB3b3VsZCBtYWtlIHRoZSBwcm9ibGVtIGdv IGF3YXkgKGZvciBub3chKS4KCiMjIEN1cnJlbnQgc3RhdGUgb2YgdGhlIGFydAoKVGhpcyByZXBy ZXNlbnRzIG15IGJlc3QgdW5kZXJzdGFuZGluZyBvZiB0aGUgd2F5cyBpbiB3aGljaCBtb3N0IFJ1 YnkgcHJvZmlsaW5nIHRvb2xzIHdvcmsgdG9kYXkuIEknbSBzdXJlIEkndmUgbWlzc2VkIHNvbWUg aW1wb3J0YW50IGRldGFpbHMgYW5kIG90aGVyIHRvb2xzLCBmb3Igd2hpY2ggSSdtIGRlZXBseSBz b3JyeS4KCiMjIyBTaWduYWwtYmFzZWQgcHJvZmlsaW5nCgpTaWduYWwtYmFzZWQgcHJvZmlsZXJz IGNhbiBiZSB1c2VkIHRvIG1lYXN1cmUgQ1BVIGFuZCB3YWxsIGNsb2NrIHRpbWUuIEluIHRoaXMg c2NoZW1lLCBhIHByb2ZpbGVyIChpbiB0aGUgZm9ybSBvZiBhbiBleHRlbnNpb24gZ2VtKSBzZXRz IHVwIGEgc2lnbmFsIGhhbmRsZXIgZm9yIFNJR1BST0YgaW4gQywgYW5kIHRoZW4gYXJyYW5nZXMg Zm9yIFNJR1BST0YgdG8gYmUgZGVsaXZlcmVkIHRvIHRoZSBwcm9jZXNzIHJlcGVhdGVkbHkgaW4g c29tZSBraW5kIG9mIGxvb3AuIFRoZSBzaWduYWwgaGFuZGxlciB0aGVuIGNhcHR1cmVzIGEgc3Rh Y2sgdHJhY2UgdXNpbmcgdGhlIGByYl9wcm9maWxlX2ZyYW1lc2AgQVBJIGZyb20gdGhlIEMgZXh0 ZW5zaW9uIGFuZCByZWNvcmRzIHRoaXMgYXMgYSBzaW5nbGUgc2FtcGxlLgoKVGhpcyBpcyB0aGUg bWVjaGFuaXNtIHVzZWQgZm9yIENQVS93YWxsIGNsb2NrIHByb2ZpbGluZyBpbiBbU3RhY2twcm9m XShodHRwczovL2dpdGh1Yi5jb20vdG1tMS9zdGFja3Byb2YpLCB0aGUgW0RhdGFkb2cgY29udGlu dW91cyBwcm9maWxlcl0oaHR0cHM6Ly9naXRodWIuY29tL0RhdGFEb2cvZGQtdHJhY2UtcmIpLCBh bmQgSSdtIHN1cmUgb3RoZXJzLiBJdCdzIGFsc28gYSB3ZWxsLWtub3duIG1lY2hhbmlzbSB1c2Vk IGluIG90aGVyIG5vbi1SdWJ5IHRvb2xzIGxpa2UgW2dwZXJmdG9vbHNdKGh0dHBzOi8vZ3BlcmZ0 b29scy5naXRodWIuaW8vZ3BlcmZ0b29scy9jcHVwcm9maWxlLmh0bWwpCgpPbmUgYmVuZWZpdCBv ZiB0aGlzIG1lY2hhbmlzbSBpcyB0aGF0IGl0IHNob3VsZCBiZSBxdWl0ZSBmYXN0LiBUcmlnZ2Vy aW5nIHRoZSBzaWduYWwgY2F1c2VzIGEgY29udGV4dCBzd2l0Y2ggaW50byB0aGUga2VybmVsICYg YmFjayBpbnRvIHRoZSBoYW5kbGVyLCBidXQgZXhlY3V0aW9uIHN0YXlzIGluc2lkZSB0aGUgY3Vy cmVudCBwcm9ncmFtOyB0aGVyZSdzIG5vIG5lZWQgZm9yIHRoZSBleGVjdXRpb24gdG8gc3dpdGNo IHRvIGFub3RoZXIgcHJvZ3JhbSAoYW5kIGNvbnNlcXVlbnRseSBjaGFuZ2UgYWRkcmVzcyBzcGFj ZSkuCgpUaGUgZG93bnNpZGUgb2YgdGhpcyBhcHByb2FjaCBpcyB0aGF0IGl0IHJlcXVpcmVzIHNv bWUgbGV2ZWwgb2YgY29vcGVyYXRpb24gZnJvbSB0aGUgcHJvZ3JhbSBiZWluZyBwcm9maWxlZC4g U29tZXRoaW5nIGluc2lkZSB0aGUgcHJvY2VzcyBtdXN0IGluc3RhbGwgdGhlIFNJR1BST0YgaGFu ZGxlcjsgaWYgeW91IGhhdmUgc29tZSBleGlzdGluZywgcnVubmluZyBSdWJ5IHByb2Nlc3MgZm9y IHdoaWNoIGEgcHJvZmlsZXIgaXMgbm90IGxvYWRlZCwgeW91IGNhbm5vdCBiZWdpbiBwcm9maWxp bmcgaXQgd2l0aG91dCByZXN0YXJ0aW5nIGl0IChhbmQgdXNpbmcgc29tZSBtZWNoYW5pc20gbGlr ZSBhIGAtcm15X3Byb2ZpbGVyL2F1dG9sb2FkYCBmbGFnKS4KCkFub3RoZXIgcHJvYmxlbSB3aXRo IHRoaXMgYXBwcm9hY2ggaXMgdGhlIGVmZmVjdCB0aGVzZSBTSUdQUk9GIHNpZ25hbHMgaGF2ZSBv biB0aGUgYXBwbGljYXRpb24uIE5vcm1hbGx5LCB0aGUgcHJvZmlsZXIgaW5zdGFsbHMgdGhlIHNp Z25hbCBoYW5kbGVyIHdpdGggdGhlIFNBX1JFU1RBUlQgZmxhZzsgdGhpcyBfc2hvdWxkXyBtZWFu IHRoYXQgYW55IGluLXByb2dyZXNzIHN5c3RlbSBjYWxsIHRoZSBhcHBsaWNhdGlvbiBpcyBkb2lu ZyB3aGVuIHRoZSBTSUdQUk9GIGFycml2ZXMgZ2V0cyB0cmFuc3BhcmVudGx5IHJlc3RhcnRlZCB3 aGVuIHRoZSBoYW5kbGVyIGZpbmlzaGVzIGNvbGxlY3RpbmcgaXRzIHNhbXBsZS4gSG93ZXZlciwg b24gTGludXggYXQgbGVhc3QsIHRoZXJlIGFyZSBzb21lIHN5c3RlbSBjYWxscyB3aGljaCBhcmUg X05PVF8gcmVzdGFydGVkIHdoZW4gU0FfUkVTVEFSVCBoYXBwZW5zIC0gbm90YWJseSBzb21lIG5l dHdvcmsgcmVsYXRlZCBvbmVzIGxpa2UgcG9sbCwgZXBvbGwsIGFuZCBzZW5kL3JlY3Ygd2hlbiBh IHNvY2tldCB0aW1lb3V0IGlzIHNldC4gVGhlc2Ugc3lzdGVtIGNhbGxzIHdpbGwgaW5zdGVhZCBm YWlsIHdpdGggRUlOVFI7IHdlbGwgYmVoYXZlZCBwcm9ncmFtcyBhbmQgbGlicmFyaWVzIF9TSE9V TERfIHJldHJ5IHRoaXMuCgpTYWRseSwgaG93ZXZlciwgdGhlIHJlcGVhdGVkIGRlbGl2ZXJ5IG9m IFNJR1BST0YgdGVucyBvciBodW5kcmVkcyBvZiB0aW1lcyBwZXIgc2Vjb25kIGRvZXMgaGF2ZSBh IHdheSBvZiBzaGFraW5nIG91dCBjb3JuZXItY2FzZXMgaW4gbGlicmFyaWVzIHdoZXJlIHRoaXMg aXNuJ3QgYmVpbmcgZG9uZSBwcm9wZXJseS4gRm9yIGV4YW1wbGUsIEkgaGF2ZSBwZXJzb25hbGx5 IGRpc2NvdmVyZWQgdGhlIGhhcmQgd2F5IHRoYXQgbGlibXlzcWxjbGllbnQgdmVyc2lvbiA1Ljcg ZG9lcyB0aGlzIHdyb25nIGluIG9uZSBwbGFjZSwgc28gZW5hYmxpbmcgYSBTSUdQUk9GLWJhc2Vk IHByb2ZpbGVyIGNhbiBjYXVzZSBsaWJteXNxbGNsaWVudCB0byBlcnJvbmVvdXNseSB0aGluayB0 aGF0IGRhdGFiYXNlIGNvbm5lY3Rpb25zIHdlcmUgY2xvc2VkLiBUaGlzIGlzIHVuZG91YnRlZGx5 IGEgYnVnIGluIGxpYm15c3FsY2xpZW50ICh3aGljaCwgYnkgdGhlIHdheSwgc2VlbXMgdG8gYmUg Zml4ZWQgaW4gdmVyc2lvbiA4KSwgdGhhdCBfY291bGRfIGJlIHRyaWdnZXJlZCBieSBhbnkgb3Ro ZXIgc2lnbmFsLiBUaGVyZSdzIG5vIGRlbnlpbmcgdGhvdWdoIHRoYXQgU0lHUFJPRi1iYXNlZCBw cm9maWxpbmcgaXMgYSByZWFsIHRvcnR1cmUtdGVzdCBmb3IgRUlOVFIgaGFuZGxpbmcsIGFuZCB0 aGVyZSB1bmRvdWJ0ZWRseSBfYXJlXyBidWdneSBsaWJyYXJpZXMgb3V0IHRoZXJlIGluIHRoZSB3 aWxkIHRoYXQgcGVvcGxlIGFyZSB1c2luZyBpbiB0aGVpciBhcHBsaWNhdGlvbnMuIEl0IHdvdWxk IGJlIG5pY2UgaWYgUnVieSBwcm9maWxlcnMgY291bGQgd29yayBhcm91bmQgdGhpcyBwcm9ibGVt LgoKIyMjIFJVQllfSU5URVJOQUxfRVZFTlRfTkVXT0JKIHByb2ZpbGluZwoKQ29sbGVjdGlvbiBv ZiBzdGFja3MgZnJvbSBTSUdQUk9GIHdvcmtzIGZvciBDUFUvd2FsbCB0aW1lIHByb2ZpbGluZywg YnV0IGEgZGlmZmVyZW50IGFwcHJvYWNoIGlzIG5lZWRlZCBmb3IgaW4tcHJvY2VzcyBwcm9maWxl cnMgdG8gY29sbGVjdCBhbGxvY2F0aW9uIHByb2ZpbGVzLiBUaGlzIGlzIG5vcm1hbGx5IGRvbmUg YnkgcmVnaXN0ZXJpbmcgYSB0cmFjZXBvaW50IGhhbmRsZXIgZm9yIFJVQllfSU5URVJOQUxfRVZF TlRfTkVXT0JKIGluIHRoZSBwcm9maWxlciBleHRlbnNpb24gZ2VtOyB0aGlzIGlzIGNhbGxlZCBl dmVyeSB0aW1lIGEgUnVieSBvYmplY3QgaXMgYWxsb2NhdGVkLiBGcm9tIHRoaXMgaGFuZGxlciwg dGhlIHByb2ZpbGVyIGNhbiB1c2UgYHJiX3Byb2ZpbGVfZnJhbWVzYCBhZ2FpbiB0byBjb2xsZWN0 IGEgUnVieSBiYWNrdHJhY2Ugb2YgdGhlIGNvZGUgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcg dGhpcyBvYmplY3QuCgojIyMgUHRyYWNlLWJhc2VkIHByb2ZpbGluZwoKQW5vdGhlciBhcHByb2Fj aCB0aGF0IGhhcyBiZWVuIHVzZWQgaXMgdG8gY29udHJvbCB0aGUgUnVieSBwcm9ncmFtIHRvIGJl IHByb2ZpbGVkIHdpdGggYW5vdGhlciwgc2VwYXJhdGUgcHJvY2VzcywgdXNpbmcgYW4gYXBwcm9w cmlhdGUgcGxhdGZvcm0gQVBJIChlLmcuIHB0cmFjZSBvbiBMaW51eCkuIFBlcmlvZGljYWxseSwg dGhlIHByb2ZpbGVyIHByb2Nlc3MgY2FuIHVzZSBwdHJhY2UgdG8gc3VzcGVuZCBleGVjdXRpb24g b2YgdGhlIHRhcmdldCBSdWJ5IHByb2dyYW0sIGFuZCBjb2xsZWN0IGEgc3RhY2sgdHJhY2Ugb2Yg aXQuIFRoaXMgaXMgdGhlIGFwcHJvYWNoIHVzZWQgYnkgdGhlIFtyYnNweV0oaHR0cHM6Ly9naXRo dWIuY29tL3Jic3B5L3Jic3B5KSBwcm9maWxlciwgd2hpY2ggaXMgaXRzZWxmIGFjdHVhbGx5IGEg UnVzdCBwcm9ncmFtLgoKVGhlIG1haW4gc3RyZW5ndGggb2YgdGhpcyBhcHByb2FjaCBpcyB0aGF0 IGl0IGFsbG93cyBvbmUgdG8gYmVnaW4gdHJhY2luZyBhIFJ1YnkgcHJvZ3JhbSB3aGljaCBpcyBh bHJlYWR5IHJ1bm5pbmcsIF93aXRob3V0IHJlc3RhcnRpbmcgaXRfOyByYnNweSBjYW4gcHRyYWNl LWF0dGFjaCB0byBhIHJ1bm5pbmcgcHJvY2VzcyBhbmQgYmVnaW4gY29sbGVjdGluZyBzYW1wbGVz IHN0cmFpZ2h0IGF3YXkuIFRoaXMgYWxsb3dzIG9uZSB0byBnYWluIGluc2lnaHQgaW50byBpbnRl cm1pdHRlbnQgcHJvYmxlbXMgb25jZSB0aGV5IHN0YXJ0IGhhcHBlbmluZyEKClVuZm9ydHVuYXRl bHksICJjb2xsZWN0IGEgc3RhY2sgdHJhY2UiIGlzIHF1aXRlIHRyaWNreSB0byBkbyBmcm9tIG91 dHNpZGUgdGhlIHByb2Nlc3M7IHdlIHdhbnQgdGhlIF9SdWJ5XyBsZXZlbCBzdGFjayB0cmFjZSwg bm90IChvciBhdCBsZWFzdCwgYXMgd2VsbCBhcykgdGhlIG1hY2hpbmUgc3RhY2sgdHJhY2UgKHdo aWNoIGNvdWxkIGJlIGNvbGxlY3RlZCBlLmcuIHZpYSBEV0FSRiB1bndpbmRpbmcgb3IgZnJhbWUt cG9pbnRlciBjaGFzaW5nKS4gVG8gZ2V0IHRoZSBSdWJ5IHN0YWNrIHRyYWNlIHJlcXVpcmVzIHJ1 bW1hZ2luZyBhcm91bmQgaW5zaWRlIHRoZSBtZW1vcnkgb2YgdGhlIHRhcmdldCBwcm9jZXNzIChl LmcuIHdpdGggYC9wcm9jL3twaWR9L21lbWAgb24gTGludXgpLCB0byBmaW5kIHRoZSByZWxldmFu dCBgcmJfY29udHJvbF9mcmFtZV90YCBzdHJ1Y3R1cmVzLiBSYnNweSBjb250YWlucyBhIGh1Z2Ug bGlzdCBvZiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgZm9yIHZhcmlvdXMgdmVyc2lvbnMgb2YgUnVi eSB0byBtYWtlIHRoaXMgcG9zc2libGUsIGJ1dCBhbnkgdGltZSBhIG5ldyB2ZXJzaW9uIG9mIFJ1 YnkgaXMgcmVsZWFzZWQsIGEgbmV3IHZlcnNpb24gb2YgUmJzcHkgbXVzdCBhbHNvIGJlIHJlbGVh c2VkIHRvIGFjY291bnQgZm9yIGFueSBjaGFuZ2VzIHRvIHRoZSBsYXlvdXQgb2YgUnVieSdzIGlu dGVybmFsIHN0cnVjdHVyZXMuCgpJbiB0aGVvcnksIHRoZSBwdHJhY2UgYXBwcm9hY2ggaXMgYWxz byB3b3JzZSBmcm9tIGEgcGVyZm9ybWFuY2UgcGVyc3BlY3RpdmU7IHRvIGNvbGxlY3QgYSBzYW1w bGUsIGV4ZWN1dGlvbiBtdXN0IHN3aXRjaCBmcm9tIHRoZSBwcm9jZXNzIHRvIGJlIHByb2ZpbGVk IHRvIHRoZSBwcm9maWxlciBwcm9jZXNzLCB3aGljaCByZXF1aXJlcyBzd2l0Y2hpbmcgbWVtb3J5 IG1hcHBpbmdzLiBSZWNhbGwgdGhhdCB3aXRoIGluLXByb2Nlc3MgU0lHUFJPRiBwcm9maWxpbmcs IHRoZSBwcm9maWxlciB3b3JrIGlzIGRvbmUgaW4gdGhlIHNhbWUgcHJvY2VzcyB3aXRoIHRoZSBz YW1lIG1lbW9yeSBtYXBwaW5ncy4gSG93ZXZlciwgdGhpcyBjb25jZXJuIHNlZW1zIHRvIGJlIGxh cmdlbHkgdGhlb3JldGljYWw7IEkgaGF2ZSBub3QgX2FjdHVhbGx5XyBzZWVuIG9yIGhlYXJkIG9m IGFueWJvZHkgc2F5aW5nIHRoYXQgdGhpcyBpcyBtYWtpbmcgcmJzcHkgdG9vIHNsb3cgZm9yIHRo ZWlyIHVzZWNhc2UuCgpGaW5hbGx5LCBhbHRob3VnaCBwdHJhY2UtYmFzZWQgcHJvZmlsaW5nIGdl dHMgdXMgX2Nsb3NlXyB0byB0aGUgaWRlYWwgb2Ygbm90IHJlcXVpcmluZyBhbnkgZm9yZXNpZ2h0 IHRvIGJlZ2luIHByb2ZpbGluZyBhIHJ1bm5pbmcgcHJvZ3JhbSwgdGhlcmUgaXMgX29uZV8gc21h bGwgcmVxdWlyZW1lbnQgd2hpY2ggbXVzdCBiZSBzYXRpc2ZpZWQgYWhlYWQgb2YgdGltZSAtIHRo ZSBSdWJ5IGludGVycHJldGVyIG5lZWRzIHRvIGhhdmUgbm90IGhhZCBpdHMgc3ltYm9scyBzdHJp cHBlZCBzbyB0aGF0IHJic3B5IGNhbiBmaW5kIHRoZSBgcnVieV9jdXJyZW50X3ZtX3B0cmAgZ2xv YmFsLiBJIGJlbGlldmUgcmJzcHkgbWFrZXMgYW4gX2F0dGVtcHRfIHRvIGZpbmQgaXQgd2l0aG91 dCB0aGUgc3ltYm9sIGJ1dCBpdCBkb2VzIG5vdCBjbGFpbSB0byBiZSByZWxpYWJsZS4KCiMjIyBB bGxvY2F0aW9uIHNhbXBsaW5nIGZyb20gcHRyYWNlLWJhc2VkIHByb2ZpbGluZwoKVG8gcGVyZm9y bSBhbGxvY2F0aW9uIHByb2ZpbGluZyBmcm9tIG91dHNpZGUgdGhlIFJ1YnkgcHJvY2Vzcywgd2Ug d291bGQgbmVlZCBzb21lIGFuYWxvZ3VlIHRvIFJVQllfSU5URVJOQUxfRVZFTlRfTkVXT0JKLiBJ IGJlbGlldmUgdGhpcyBfY291bGRfIGJlIGFjaGlldmVkIGJ5IGNvbXBpbGluZyBSdWJ5IHdpdGgg ZHRyYWNlL3N5c3RlbXRhcC9VU0RUIHByb2JlcyBlbmFibGVkLCBhbmQgaGF2aW5nIHRoZSBwcm9m aWxlciBwcm9jZXNzIHdyaXRlIGEgdHJhcCBpbnN0cnVjdGlvbiBvdmVyIHRoZSB0b3Agb2YgdGhl IHByb2JlICh3aGljaCBpcyBob3cgZS5nLiBkZWJ1Z2dlcnMgd29yaykuIEkgZG9uJ3QgYmVsaWV2 ZSByYnNweSBvciBhbnkgb3RoZXIgcHJvZmlsZXIgdGhhdCBJIGZvdW5kIGFjdHVhbGx5IGRvZXMg dGhpcyB0aG91Z2guCgojIyMgUGVyZi1iYXNlZCBwcm9maWxpbmcKCkxpbnV4IGhhcyBhIGRlZGlj YXRlZCBzdWJzeXN0ZW0gY2FsbGVkIHBlcmYgd2hpY2ggKGFtb25nc3QgbWFueSBvdGhlciB0aGlu Z3MpIGNhbiBkbyBsb3ctb3ZlcmhlYWQgcHJvZmlsaW5nIG9mIGFyYml0cmFyeSBwcm9jZXNzZXMu IFRoZSBzYW1wbGluZyBpcyBkb25lIGluc2lkZSB0aGUga2VybmVsLCBzbyBsaWtlIFNJR1BST0Yg KGFuZCB1bmxpa2UgcHRyYWNlKSBjb2xsZWN0aW5nIGEgc2FtcGxlIHJlcXVpcmVzIG5vIHN3aXRj aCBvZiBhZGRyZXNzIHNwYWNlLiBIb3dldmVyLCBvZiBjb3Vyc2UsIHBlcmYgb25seSB1bmRlcnN0 YW5kcyB0aGUgbWFjaGluZSBzdGFjaywgbm90IHRoZSBSdWJ5IHN0YWNrLCBzbyB1c2luZyBwZXJm IHRvIHByb2ZpbGUgYSBSdWJ5IHByb2dyYW0gaXMgbm90IGN1cnJlbnRseSBleHRyYW9yZGluYXJp bHkgdXNlZnVsICh1bmxlc3MgeW91J3JlIHByb2ZpbGluZyB0aGUgUnVieSBWTSBpdHNlbGYgb3Ig YSBDIGV4dGVuc2lvbikuCgpQZXJmIGFjdHVhbGx5IGhhcyBhIFttZWNoYW5pc21dKGh0dHBzOi8v d3d3LmJyZW5kYW5ncmVnZy5jb20vcGVyZi5odG1sI0pJVF9TeW1ib2xzKSB0byBoZWxwIGdpdmUg bWVhbmluZ2Z1bCBzdGFjayB0cmFjZXMgZm9yIGxhbmd1YWdlcyB3aXRoIEpJVHM7IHRoZSBhcHBs aWNhdGlvbiBpcyBleHBlY3RlZCB0byB3cml0ZSBvdXQgYSBtYXBwaW5nIG9mIGZ1bmN0aW9uIGFk ZHJlc3MgLT4gbmFtZSB0byBhIGZpbGUgYC90bXAvcGVyZi0kUElELm1hcGA7IHBlcmYgd2lsbCB1 c2UgdGhpcyBmaWxlIHRvIHN5bWJvbGljYXRlIHN0YWNrcy4gUHl0aG9uIFtyZWNlbnRseSBhZGRl ZF0oaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvZGV2L2hvd3RvL3BlcmZfcHJvZmlsaW5nLmh0bWwp IHN1cHBvcnQgZm9yIHRoaXMgbWVjaGFuaXNtIGFzIHdlbGw7IGhvd2V2ZXIsIGJlY2F1c2UgQ1B5 dGhvbiBkb2VzIG5vdCBoYXZlIGEgSklULCBpdCB3b3JrcyBieSBnZW5lcmF0aW5nIGEgbmF0aXZl IHRyYW1wb2xpbmUgZm9yIGVhY2ggZnVuY3Rpb24gKHdpdGggYSB1bmlxdWUgYWRkcmVzcyksIGFu ZCBjYWxsaW5nIHRoZSBhcHByb3ByaWF0ZSB0cmFtcG9saW5lcyBkdXJpbmcgUHl0aG9uIG1ldGhv ZCBleGVjdXRpb24gdG8gbWFrZSB0aGUgbWFjaGluZSBzdGFjayBtaXJyb3IgdGhlIFZNIG9uZS4g VGhpcyBtZWNoYW5pc20gaXMgbm90IGltcGxlbWVudGVkIGluIENSdWJ5IGN1cnJlbnRseS4KCiMj IFRoZSBwcm9wb3NhbDogcHJvdmlkZSBhbiAiZXh0ZXJuYWwgZGVidWcgc2VjdGlvbiIKCldlIGlk ZWFsbHkgd291bGQgbGlrZSB0byBoYXZlIGEgd2F5IHRvIHByb2ZpbGUgUnVieSBhcHBsaWNhdGlv bnMgd2hpY2ggY29tYmluZXMgdGhlIGJlbmVmaXRzIG9mIHRoZSBTSUdQUk9GIG1lY2hhbmlzbSAo ZWFzeSwgZG9jdW1lbnRlZCBhY2Nlc3MgdG8gUnVieSBjYWxsIHN0YWNrcyksIHRoZSBwdHJhY2Ug bWVjaGFuaXNtICh0aGUgYWJpbGl0eSB0byBhdHRhY2ggdG8gcnVubmluZyBwcm9jZXNzZXMgd2l0 aCBhIG1pbmltdW0gb2YgZm9yZXNpZ2h0IHJlcXVpcmVkKSwgYW5kIHRoZSBwZXJmIG1lY2hhbmlz bSAobG93IG92ZXJoZWFkIHNhbXBsZSBjb2xsZWN0aW9uIHdpdGhvdXQgcmVxdWlyaW5nIGEgcHJv Y2VzcyBhZGRyZXNzIHNwYWNlIHN3aXRjaCkuIFRoaXMgcHJvcG9zYWwgYWltcyB0byBwcm92aWRl IGV4YWN0bHkgdGhhdC4KClRoZSBSdWJ5IGludGVycHJldGVyIHdvdWxkIGhhdmUgYSBuZXcgZ2xv YmFsIHZhcmlhYmxlIGByYl9kZWJ1Z19leHRfc2VjdGlvbmAsIHdoaWNoIGlzIGRlZmluZWQgd2l0 aCBgX19hdHRyaWJ1dGVfXygoc2VjdGlvbigicmJfZGVidWdfZXh0IikpKWAgc28gdGhhdCBpdCBh cHBlYXJlZCBpbiBhIHNlcGFyYXRlIHNlY3Rpb24gaW4gdGhlIEVMRiBiaW5hcnkuIFRoaXMgdmFy aWFibGUgd291bGQgYmUgY29uc3RhbnRseSBrZXB0IHBvcHVsYXRlZCB3aXRoIHVwLXRvLWRhdGUg aW5mb3JtYXRpb24gYWJvdXQgYWxsIHRoZSBjYWxsLXN0YWNrcyBvZiBhbGwgdGhyZWFkcy9maWJl cnMgaW4gdGhlIHByb2dyYW0uIEFuIGV4dGVybmFsIGRlYnVnZ2luZyB0b29sIGNvdWxkIGVhc2ls eSAoImVhc2lseSIpIHB0cmFjZSBhIHJ1bm5pbmcgUnVieSBwcm9ncmFtLCBhbmQgZmluZCB0aGUg YWRkcmVzcyBvZiB0aGlzIHNlY3Rpb24gaW4gaXRzIHJ1bm5pbmcgbWVtb3J5LCBldmVuIGlmIHN5 bWJvbHMgaGF2ZSBiZWVuIHN0cmlwcGVkLiBPbmNlIGFuIGV4dGVybmFsIHRvb2wgaGFzIGZvdW5k IHRoaXMgdmFyaWFibGUsIGl0IG5lZWRzIHRvIG1ha2Ugc2Vuc2Ugb2YgaXQuIFJ1Ynkgd291bGQg cHJvdmlkZSBhIG5ldyBoZWFkZXIgZmlsZSBgaW5jbHVkZS9ydWJ5L2RlYnVnX2V4dGVybmFsLmhg IHdoaWNoIGRlc2NyaWJlZCB0aGUgbGF5b3V0IG9mIHRoaXMgc3RydWN0dXJlLgoKVGhlIHNpbXBs ZSwgc2xvdyB2ZXJzaW9uIG9mIGFuIGV4dGVybmFsIHByb2ZpbGVyIHVzaW5nIHRoaXMgaW50ZXJm YWNlIHdvdWxkIGJlIGEgbG90IGxpa2UgcmJzcHk7IGl0IHdvdWxkIHVzZSBwdHJhY2UgdG8gcGVy aW9kaWNhbGx5IHN0b3AgdGhlIFJ1YnkgcHJvY2VzcywgYW5kIHRoZW4gdXNlIHRoZSBjb250ZW50 cyBvZiBgcmJfZGVidWdfZXh0X3NlY3Rpb25gIHRvIGNvbGxlY3QgUnVieSBiYWNrdHJhY2VzIGZv ciBDUFUvd2FsbC1jbG9jayBwcm9maWxpbmcuIFRoZSBiZW5lZml0LCBvZiBjb3Vyc2UsIGlzIHRo YXQgaXQncyB1c2luZyBhIGRvY3VtZW50ZWQgaW50ZXJmYWNlIHRoYXQgY2FuIGJlIHZlcnNpb25l ZCBhbmQga2VwdCBiYWNrd2FyZHMgY29tcGF0aWJsZSwgcmF0aGVyIHRoYW4gaGF2aW5nIHRvIGNv bnN0YW50bHkgY2hhc2UgYnJlYWtpbmcgY2hhbmdlcyB0byBpbnRlcm5hbCBSdWJ5IFZNIHN0cnVj dHVyZXMuCgpIb3dldmVyLCB0aGUgYmVuZWZpdCBvZiB0aGlzIGFwcHJvYWNoIGlzIHRoYXQgd2Ug Y2FuIGRvIGJldHRlciEgVGhlIHBlcmYgc3Vic3lzdGVtIG9uIExpbnV4IGlzIGFibGUgdG8gaW52 b2tlIGFuIGVCUEYgcHJvZ3JhbSB0byBhY3R1YWxseSBjb2xsZWN0IHNhbXBsZXMgKHVzaW5nLCBJ IHRoaW5rLCBgUEVSRl9FVkVOVF9JT0NfU0VUX0JQRmAgYnV0IEknbSBub3QgMTAwJSBzdXJlKSBh bmQgd3JpdGUgdGhlbSB0byBhIHJpbmctYnVmZmVyLiBUaGUgZUJQRiBwcm9ncmFtIGNhbiBhY3R1 YWxseSB1c2UgdGhlIGBkZWJ1Z19leHRlcm5hbC5oYCBoZWFkZXIgZmlsZSB0byBmaWd1cmUgb3V0 IHRoZSBjdXJyZW50IFJ1Ynkgc3RhY2sgdHJhY2UocykgaXRzZWxmLCB3aXRob3V0IG5lZWRpbmcg dG8gc3dpdGNoIGJhY2sgaW50byB0aGUgcHJvZmlsZXIgYWRkcmVzcyBzcGFjZSEgVGhlIHByb2Zp bGVyIHByb2dyYW0gb25seSBuZWVkcyB0byBydW4gcGVyaW9kaWNhbGx5IHRvIGVtcHR5IHRoZSBy aW5nLWJ1ZmZlciBhbmQgd3JpdGUgc2FtcGxlcyB0byBkaXNrLgoKIyMgVGhlIHJpZGVyOiBiZXR0 ZXIgc3RhY2sgdHJhY2Ugb3V0cHV0CgpTbyBmYXIsIHdlJ3ZlIG1lbnRpb25lZCB0aGF0IHRoZSBw cm9maWxlciBwcm9jZXNzIHdpbGwgZXh0cmFjdCBhIHN0YWNrIHRyYWNlIG91dCBvZiBgcmJfZGVi dWdfZXh0X3NlY3Rpb25gLiBMZXQncyB0dXJuIG91ciBhdHRlbnRpb24gdG8gd2hhdCB0aGF0IHN0 YWNrIHRyYWNlIHdvdWxkIGFjdHVhbGx5IF9iZV8uCgpUcmFkaXRpb25hbCBwcm9maWxpbmcgdG9v bHMgZm9yIG5vbi1keW5hbWljIGxhbmd1YWdlcyB1c3VhbGx5IHdvcmsgYnkgY2FwdHVyaW5nIG1l bW9yeSBhZGRyZXNzZXMgZm9yIGZ1bmN0aW9ucywgYW5kIHRoZW4gZGVmZXJyaW5nIHRoZSB0cmFu c2xhdGlvbiBvZiBhZGRyZXNzZXMgLT4gbmFtZXMgdW50aWwgbGF0ZXIgKHBvc3NpYmx5IGV2ZW4g b24gYSBkaWZmZXJlbnQgbWFjaGluZSkuIFJ1YnksIGhvd2V2ZXIsIGlzIEkgYmVsaWV2ZSBtdWNo IHRvbyBkeW5hbWljIGZvciBhIHNpbWlsYXIgYXBwcm9hY2guIE1ldGhvZHMgYW5kIGNsYXNzZXMg Y2FuIGJlIGRlZmluZWQgYW5kIHVuZGVmaW5lZCBkeW5hbWljYWxseSBvdmVyIHRoZSBsaWZldGlt ZSBvZiB0aGUgcHJvZ3JhbS4gSW5zdHJ1Y3Rpb24gc2VxdWVuY2VzIGNhbiBiZSBjcmVhdGVkIGFu ZCBHQydkIGFzIGEgcmVzdWx0IG9mIHVzaW5nIHRoaW5ncyBsaWtlIGBldmFsYC4gQSBtZW1vcnkg YWRkcmVzcyBvY2N1cGllZCBieSBvbmUgY2xhc3Mgb3IgaXNlcSBtaWdodCBsYXRlciBiZSBvY2N1 cGllZCBieSBhIGRpZmZlcmVudCBvbmUgLSBlc3BlY2lhbGx5IGJlY2F1c2Ugd2Ugbm93IGhhdmUg R0MgY29tcGFjdGlvbi4KClRodXMsIEkgdGhpbmsgdGhlIG9ubHkgc2Vuc2libGUgdGhpbmcgdG8g ZG8gaXMgdG8gc3RvcmUgc3RyaW5ncyBpbiB0aGUgYHJiX2RlYnVnX2V4dF9zZWN0aW9uYCBzdHJ1 Y3R1cmUuIFRoZXNlIHN0cmluZ3MgbmVlZCB0byBiZSB2YWxpZCwgZXNzZW50aWFsbHksIHdoaWxz dCB0aGUgY2FsbGVkIG1ldGhvZC9pc2VxIGlzIHN0aWxsIG9uIHRoZSBzdGFjayAtIHRoZXJlJ3Mg bm8gcmVxdWlyZW1lbnQgdG8gcmV0YWluIHRoZW0gdW50aWwgbGF0ZXIuIFRoZSBleHRlcm5hbCB0 b29sIHdvdWxkIG5lZWQgdG8gY29weSB0aGVzZSBzdHJpbmdzIGludG8gaXRzIG93biBwcm9jZXNz LgoKV2hhdCBzaG91bGQgdGhvc2UgYWN0dWFsbHkgX2NvbnRhaW5fPyBBIHRyYWRpdGlvbmFsIFJ1 YnkgYmFja3RyYWNlIGNvbnRhaW5zIGEgZmlsZSwgbGluZSBudW1iZXIsIGEgbWV0aG9kIG5hbWUg KGlmIGF2YWlsYWJsZSksIGFuZCBzb21lIG90aGVyIGRldGFpbHMgYWJvdXQgdGhlIGlzZXEgaWYg cHJlc2VudCAoZS5nLiB3aGV0aGVyIGl0J3MgYSBibG9jayBvciBldmFsLCB3aGV0aGVyIGl0J3Mg PG1haW4+LCBldGMpLgoKYGBgcnVieQppcmIjMShtYWluKTowMDM6MD4gZGVmIGZvbzsgcmFpc2Ug Im9oIG5vIjsgZW5kOwo9PiA6Zm9vCmlyYiMxKG1haW4pOjAwNDowPiBmb28KKGlyYiMxKTozOmlu IGBmb28nOiBvaCBubyAoUnVudGltZUVycm9yKQoJZnJvbSAoaXJiIzEpOjQ6aW4gYDxtYWluPicK YGBgCgpJIGRvIG5vdCBiZWxpZXZlIHRoaXMgaXMgdGhlIG1vc3QgdXNlZnVsIHdheSB0byBwcmVz ZW50IHRoaXMgaW5mb3JtYXRpb24gZnJvbSBhIHByb2ZpbGluZyBwZXJzcGVjdGl2ZSwgaG93ZXZl ci4gV2hlbiBkZWFsaW5nIHdpdGggYSBsYXJnZSBtb25vbGl0aGljIGFwcGxpY2F0aW9uLCBwcm9m aWxlcyB3aWxsIGJlIGNvbGxlY3RlZCBwcm9jZXNzLXdpZGUgYW5kIGFnZ3JlZ2F0ZWQgb24gc29t ZSBraW5kIG9mIGNlbnRyYWwgZGFzaGJvYXJkOyB0aGVyZSBjb3VsZCBiZSBtYW55IG1ldGhvZHMg Y2FsbGVkIHRoZSBzYW1lIHRoaW5nICh0aGluayBgZGVmIGNyZWF0ZWAgaW4gYSBSYWlscyBjb250 cm9sbGVyLCBmb3IgZXhhbXBsZSkuIFRoZSBmaWxlbmFtZSBjYW4gaGVscCBkaXNhbWJpZ3VhdGUg aW4gY2lyY3Vtc3RhbmNlcyBsaWtlIHRoaXMsIGJ1dCBDIGZ1bmN0aW9ucyBkb24ndCBldmVuIF9o YXZlXyBhIGZpbGVuYW1lLCBzbyBqdXN0IHByaW50IHRoZSBmaWxlbmFtZSBvZiB0aGUgdGhpbmcg dGhhdCBjYWxsZWQgdGhlbToKCmBgYHJ1YnkKaXJiIzEobWFpbik6MDA1OjA+IDEudGltZXMgeyBy YWlzZSAib2ggbm8iIH0KKGlyYiMxKTo1OmluIGBibG9jayBpbiA8bWFpbj4nOiBvaCBubyAoUnVu dGltZUVycm9yKQoJZnJvbSAoaXJiIzEpOjU6aW4gYHRpbWVzJyAjIEkgZGlkIG5vdCBkZWZpbmUg SW50ZWdlciN0aW1lcyBpbiBJUkIhCglmcm9tIChpcmIjMSk6NTppbiBgPG1haW4+JwpgYGAKCkFs bCBvZiB0aGlzIGNhbiBiZSBnZW5lcmFsbHkgZmlndXJlZCBvdXQgYnkgbG9va2luZyBhdCB0aGUg Y29kZSwgYnV0IG9mdGVuIHdoZW4gd2UncmUgbG9va2luZyBhdCBlLmcuIGEgcHJvZmlsaW5nIGRh c2hib2FyZCwgaGF2aW5nIHRvIGtlZXAgbG9va2luZyBiZXR3ZWVuIHRoZSBmbGFtZSBncmFwaCBh bmQgdGhlIGNvZGUgY2FuIGJlIHJhdGhlciBhbm5veWluZy4KCkl0IHdvdWxkIGJlIG5pY2UgaWYg aW5zdGVhZCwgb3VyIHByb2ZpbGVzIGNvbnRhaW5lZCB0aGUgbmFtZSBvZiB0aGUgY2xhc3Mgb24g d2hpY2ggYSBtZXRob2QgaXMgZGVmaW5lZDsgc29tZXRoaW5nIGxpa2UgYEZvb0NsYXNzI3RoZV9t ZXRob2RgLiBSdWJ5IGhhcyBhIG1ldGhvZCBgcmJfcHJvZmlsZV9mcmFtZV9xdWFsaWZpZWRfbWV0 aG9kX25hbWVgIHdoaWNoIGNhbiBnaXZlIHVzZWZ1bCBvdXRwdXQgbGlrZSB0aGlzIGluIG1hbnkg Y2FzZXMuIEhvd2V2ZXIsIGluIG1hbnkgY29tbW9uIGNhc2VzIGxpa2UgZS5nLiBhbm9ueW1vdXMg Y2xhc3NlcywgaXQgd2lsbCBwcmVzZW50IHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBhcyBzb21ldGhp bmcgbGlrZSAiIzxDbGFzczoweDAwMDAwMDAwMDBkYjQ4ZTA+Ii4gVGhpcyBpcyB3b3JzZSB0aGFu IHVzZWxlc3MgZm9yIHByb2ZpbGluZzsgdGhhdCBhZGRyZXNzIHdpbGwgYmUgZGlmZmVyZW50IGFt b25nc3QgZGlmZmVyZW50IHByb2Nlc3NlcyBiZWluZyBwcm9maWxlZCwgc28gbXVsdGlwbGUgcHJv ZmlsZXMgY2FuJ3QgYmUgYWdncmVnYXRlZCB0b2dldGhlci4gSW4gZmFjdCwgdGhhdCBhZGRyZXNz IGlzbid0IGV2ZW4gZ3VhcmFudGVlZCB0byBiZSBjb25zdGFudCB3aXRoaW4gdGhlIHNhbWUgcHJv Y2VzcyBhbnltb3JlLCBiZWNhdXNlIG9mIGNvbXBhY3Rpb24uCgpJIHdvdWxkIHByb3Bvc2UgdGhh dCB3ZSBoYXZlIGEgbmV3IHdheSBvZiBuYW1pbmcgbWV0aG9kcyB3aGljaCBwcm9kdWNlcyB1c2Vm dWwgc3RyaW5ncyBpbiBhbGwgY2FzZXMsIHdpdGhvdXQgYW55IGFkZHJlc3NlcyBpbiB0aGVtLiBU aGUgcnVsZXMgSSBoYXZlIGNvbWUgdXAgd2l0aCBzbyBmYXIgYXJlOgoKKiBgIiM8cmVmaW5lbWVu dCBGb28gb2YgQmFyPiJgIGZvciBhIHJlZmluZW1lbnQgbW9kdWxlIGFkZGluZyBtZXRob2RzIHRv CiAgQmFyCiogYCIjPGluc3RhbmNlIG9mIEZvbz4iYCBmb3IgYSBwYXJ0aWN1bGFyIGluc3RhbmNl IG9mIEZvbwoqIGAiIzxzaW5nbGV0b24gb2YgRm9vPiJgIGZvciBGb28ncyBzaW5nbGV0b24gY2xh c3MuCiogYCIjPGFub255bW91cyBzdWJjbGFzcyBvZiBGb28+ImAgZm9yIGFuIGFub255bW91cyBz dWJjbGFzcwoqIFRoZSB1c3VhbCBjbGFzc3BhdGggc3RyaW5nIG90aGVyd2lzZQoKTm90ZSB0aGF0 IG5lc3RpbmcgaXMgT0sgdG9vIC0gc28gYSBtZXRob2QgZGVmaW5lZCBvbiB0aGUgc2luZ2xldG9u IGNsYXNzIG9mIGEgcGFydGljdWxhciBGb28gb2JqZWN0IHdvdWxkIGJlICIjPHNpbmdsZXRvbiBv ZiAjPGluc3RhbmNlIG9mIEZvbz4+I3RoZV9tZXRob2QiLgoKU28sIG15IHByb3Bvc2FsIGlzIHRo YXQgdGhpcyBpcyB0aGUgZm9ybWF0IG9mIHRoZSBtZXRob2QgbmFtZSB0aGF0IGFwcGVhcnMgaW4g dGhlIGByYl9kZWJ1Z19leHRfc2VjdGlvbmAgc3RydWN0dXJlLgoKIyMgV2hlcmUgaGF2ZSBJIGdv dCB0byBzbyBmYXI/CgpPSywgc28gSSBoYXZlIGEgZHJhZnQgUFIgdXAgd2hpY2ggc2hvdWxkIGhv cGVmdWxseSBoZWxwIG1ha2Ugc29tZSBvZiB0aGlzIGNsZWFyZXI6IGh0dHBzOi8vZ2l0aHViLmNv bS9ydWJ5L3J1YnkvcHVsbC82NzA2LiBJdCBpcyBvZiBjb3Vyc2UgaW4gbm8gd2F5IGV2ZW4gY2xv c2UgdG8gbWVyZ2UgcmVhZHksIGJ1dCBJJ20gaG9waW5nIGl0IGhlbHBzIGlsbHVzdHJhdGUgc29t ZSBvZiBteSBpZGVhcyBoZXJlOgoKKiBbVGhlIGRlYnVnX2V4dGVybmFsLmggZmlsZV0oaHR0cHM6 Ly9naXRodWIuY29tL3J1YnkvcnVieS9wdWxsLzY3MDYvZmlsZXMjZGlmZi02NjFmOTI2OTAwOWVj ODI3MTg1ZWFmYTVlZTA1YmQ3MjUxYmJlMGE1NWRlYzM2MWM5YzVjMjViYjJhNDNhMDk4KSB0aGF0 IGRlZmluZXMgdGhlIGV4dGVybmFsbHktdmlzaWJsZSBzdHJ1Y3R1cmVzCiogV2hlcmUgdGhyZWFk cyBhcmUgW2FkZGVkXShodHRwczovL2dpdGh1Yi5jb20vcnVieS9ydWJ5L3B1bGwvNjcwNi9maWxl cyNkaWZmLWFhMmFkZGI5Mjk3NDlhNGEwMzMwYjkzY2VlY2VjNWJjNTQ4NTc1MWEzNjI1MjRmNWNi MzdiZjIyZGZmMTkzNmVSNjUpIGFuZCBbcmVtb3ZlZF0oaHR0cHM6Ly9naXRodWIuY29tL3J1Ynkv cnVieS9wdWxsLzY3MDYvZmlsZXMjZGlmZi1hYTJhZGRiOTI5NzQ5YTRhMDMzMGI5M2NlZWNlYzVi YzU0ODU3NTFhMzYyNTI0ZjVjYjM3YmYyMmRmZjE5MzZlUjExMCkgZnJvbSB0aGUgYHJiX2RlYnVn X2V4dF9zZWN0aW9uYCBzdHJ1Y3R1cmUKKiBXaGVyZSBmcmFtZXMgYXJlIFtwdXNoZWRdKGh0dHBz Oi8vZ2l0aHViLmNvbS9ydWJ5L3J1YnkvcHVsbC82NzA2L2ZpbGVzI2RpZmYtZjhjMTc0MzQ3ZTZl YTg4ODliNTAzNjA2NGExZmY0ZmU1ZTdjNTNhODIxYmVmYTliZGM1Y2NiZjE3ODAwYTY0OVI0MDcp IGFuZCBbcG9wcGVkXShodHRwczovL2dpdGh1Yi5jb20vcnVieS9ydWJ5L3B1bGwvNjcwNi9maWxl cyNkaWZmLWY4YzE3NDM0N2U2ZWE4ODg5YjUwMzYwNjRhMWZmNGZlNWU3YzUzYTgyMWJlZmE5YmRj NWNjYmYxNzgwMGE2NDlSNDM3KSBmcm9tIHRoZSBgcmJfZGVidWdfZXh0X3NlY3Rpb25gIHN0cnVj dHVyZQoqIFRoZSBbdGVzdHNdKGh0dHBzOi8vZ2l0aHViLmNvbS9ydWJ5L3J1YnkvcHVsbC82NzA2 L2ZpbGVzI2RpZmYtODlhNjdhNGQ1YjM0OGFjNmY5Y2FiZTU2ZDI4NDc1NDViZTY3ODA5YjAxZDg1 NmIzNTQxZTk2NDcxMDE0YmQ5OVI1NzMpIGlsbHVzdHJhdGUgd2hhdCB0aGUgbmV3IHF1YWxpZmll ZCBtZXRob2QgbmFtZSBvdXRwdXQgbG9va3MgbGlrZS4KCiMjIFdoYXQgZG8gSSB3YW50IGZlZWRi YWNrIG9uPwoKVGhpcyB3aG9sZSBwcm9qZWN0IGlzIG9idmlvdXNseSBzdGlsbCBhYm91dCAyMCUg Y29va2VkLCBzbywgYW55dGhpbmcgYW5kIGV2ZXJ5dGhpbmcuIEJ1dCBtb3JlIHNwZWNpZmljYWxs eSwgdGhlc2UgYXJlIHRoZSBxdWVzdGlvbnMgSSB3b3VsZCByZWFsbHkgbGlrZSBzb21lIGhlbHAg d2l0aCA6KQoKKiBEb2VzIHRoaXMgX2FwcHJvYWNoXyBzZWVtIHNlbnNpYmxlPyBJcyB0aGUgYmFz aWMgX2lkZWFfIG9mICJleHBvc2Ugc29tZSBkb2N1bWVudGVkIGRhdGEgc3RydWN0dXJlIHRvIG90 aGVyIHByb2Nlc3NlcyB0aGF0IGFyZSBhYmxlIHRvIHJlYWQgbXkgbWVtb3J5IiBhIHNvdW5kIG9u ZT8KKiBXaGF0IHNob3VsZCBJIGRvIHdpdGggdGhlIHF1YWxpZmllZC1tZXRob2QtbmFtZS13aXRo b3V0LWFkZHJlc3NlcyB3b3JrPyBBdCB0aGUgbW9tZW50IEkgZXhwb3NlZCB0aGF0IGxvZ2ljIGJl aGluZCBuZXcgbWV0aG9kcyBgTWV0aG9kI2RlYnVnX25hbWVgIGFuZCBgVGhyZWFkOjpCYWNrdHJh Y2U6OkV4dGVybmFsI2RlYnVnX2xhYmVsYC4gSXMgdGhlcmUgc29tZSBhcHBldGl0ZSB0byBvcGVu IGEgcHJvcG9zYWwgdG8gaGF2ZSB0aGF0IGluIENSdWJ5PwoqIFNob3VsZCB3ZSBldmVuIGNvbnNp ZGVyIF9jaGFuZ2luZyB0aGUgZGVmYXVsdCBvdXRwdXRfIG9mIHRocmVhZCBiYWNrdHJhY2VzIHRv IHByaW50IHRoZXNlIHF1YWxpZmllZCBuYW1lcz8KKiBUaGVyZSBhcmUgc29tZSAnaW5mcmFzdHJ1 Y3R1cmFsJyBjb21taXRzIG9uIHRoYXQgYnJhbmNoIG9mIG1pbmUgLSBvbmUgdG8gW2ZpbmQgc29t ZSBleHRyYSBzcGFjZSBpbiBgcmJfbWV0aG9kX2VudHJ5X3RgXShodHRwczovL2dpdGh1Yi5jb20v cnVieS9ydWJ5L3B1bGwvNjcwNi9jb21taXRzL2Y0NDZmNTI4MWY1OGU4NzYxZDE4MjZiNmIxYzRh OThmYWNkMDQ3MmUpIGFuZCBvbmUgdG8gW2FkZCBzb21lIG5ldyBhdG9taWMgaGVscGVyc10oYGh0 dHBzOi8vZ2l0aHViLmNvbS9ydWJ5L3J1YnkvcHVsbC82NzA2L2NvbW1pdHMvMTdkNGIxNTZjZmU4 ZjBjMzI5MTA5MDg4NTNjMThjN2ZjODAxMjFlY2ApLiBJcyB0aGlzIHRoZSBzb3J0IG9mIHRoaW5n IHRoYXQgd291bGQgbWFrZSBzZW5zZSB0byB0cnkgYW5kIGxhbmQgbm93IG9yIG9ubHkgd2hlbiB0 aGlzIGlzIGFsbCBjbG9zZXIgdG8gZG9uZT8KKiBJIGhhdmVuJ3QgeWV0IGFjdHVhbGx5IGltcGxl bWVudGVkIGFueXRoaW5nIHRvIHRyeSBhbmQgX3JlYWRfIHRoaXMgZXh0ZXJuYWwgZGVidWcgc2Vj dGlvbi4gU2hvdWxkIGl0IGJlCiAgMSkgc29tZSBleHRlcm5hbCByZXBvLCBpbiBhIG5vbi1SdWJ5 IGxhbmd1YWdlIGUuZy4gUnVzdCBvciBzb21ldGhpbmc/CiAgMikgQSBSdWJ5IGdlbSwgd2l0aCBh IEMgZXh0ZW5zaW9uIHRvIGhhbmRsZSBhbGwgdGhlIHB0cmFjZS9icGYneSBiaXRzPwogIDMpIFRo ZSBnZW0sIGJ1dCBpbnNpZGUgdGhlIENSdWJ5IHNvdXJjZSB0cmVlPwogIEknbSBsZWFuaW5nIHRv d2FyZHMgMiwgYnV0IG5vdCByZWFsbHkgc3VyZS4KClRoYW5rIHlvdSwgdG8gYW55Ym9keSB3aG8g YWN0dWFsbHkgZ290IHRvIHRoZSBib3R0b20gb2YgdGhpcyB3YWxsIG9mIHRleHQsIGFuZCB0aGFu a3MgZG91Ymx5IHRvIGFueWJvZHkgd2hvIHByb3ZpZGVzIGZlZWRiYWNrIQoKCgotLSAKaHR0cHM6 Ly9idWdzLnJ1YnktbGFuZy5vcmcvCgpVbnN1YnNjcmliZTogPG1haWx0bzpydWJ5LWNvcmUtcmVx dWVzdEBydWJ5LWxhbmcub3JnP3N1YmplY3Q9dW5zdWJzY3JpYmU+CjxodHRwOi8vbGlzdHMucnVi eS1sYW5nLm9yZy9jZ2ktYmluL21haWxtYW4vb3B0aW9ucy9ydWJ5LWNvcmU+Cg==