Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:111290 Return-Path: Delivered-To: mailing list internals@lists.php.net Received: (qmail 8380 invoked from network); 3 Aug 2020 04:34:49 -0000 Received: from unknown (HELO php-smtp4.php.net) (45.112.84.5) by pb1.pair.com with SMTP; 3 Aug 2020 04:34:49 -0000 Received: from php-smtp4.php.net (localhost [127.0.0.1]) by php-smtp4.php.net (Postfix) with ESMTP id 3AD6C180511 for ; Sun, 2 Aug 2020 20:32:08 -0700 (PDT) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on php-smtp4.php.net X-Spam-Level: X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,HTML_MESSAGE, RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_PASS autolearn=no autolearn_force=no version=3.4.2 X-Spam-Virus: No X-Envelope-From: Received: from mail-lf1-f42.google.com (mail-lf1-f42.google.com [209.85.167.42]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange ECDHE (P-256) server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by php-smtp4.php.net (Postfix) with ESMTPS for ; Sun, 2 Aug 2020 20:32:07 -0700 (PDT) Received: by mail-lf1-f42.google.com with SMTP id b30so19706477lfj.12 for ; Sun, 02 Aug 2020 20:32:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=87DI1a5OLIWuBTqrdHdNtKwN2yg8ID4L2b7i+nXa0jw=; b=P1x8f3x08zV74GUYbLSEwbol9o1QbOgMyMZ57VgUpc9IvIZ/r3bb5ZVM867uIzdwMZ hTjfXnVihGSxnko6BkihJHCZxIPVyxsbDiDejCI6oYE3S+gioXvxbfc9ga/7A4HMEU0Q o/jH/emJ7SGSmq96Jq5jsAZ3oJP1iqqFfHkPOOyXhbJNjq9hjrKvTC1fIuuD1qONpzS/ ADu8ktIUJKrIjqLGxu7m8nT7z7C604nJSwRNjrzeAKDtXoYEc93EWjqN3KCnmvTzWw6w iOL6SpIMYd8N9kNrqaQ+r5nAcjWBjUmD6Chpe3cXOi91+9KuhCCb2a4sTf+8QXkMQ3F5 WNKg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=87DI1a5OLIWuBTqrdHdNtKwN2yg8ID4L2b7i+nXa0jw=; b=XSAmtb/1k2FtoVKdduVp/4N32D9gbCTjDhM1l11foAxZxHIfLDL8625CnKsy+68iVs dc+9VBoqG86ooA3Et/kLbMtrb3cuCplEvRRzbz5/G8ZbXzy/KoxKenwEZJR5NxeGjQPC Hg5M8UdLyWUbcbxXkMGa5BcmTsHwsvcD4kxker5Z+bxieC1GfmMK8RqARG/vV9Q+8zOC USZPNwWSc5xUvdBWReBxJKI352BpjNVFSRm2eLBQ3Dz363A25CUh0Es5+zrGjyuyasoB hdLsON3H2fME8RQswT8JHGzIhmBvoacL7/nTGj9+Pl6ArXGOtAmM5iSz/iRoMiW9DPsD ve5g== X-Gm-Message-State: AOAM532n7EOxdxlF9wbcxVG/EttFZmqTxeDF8lQ4WRBgaPcCRVinLBp3 yumcK4CZThNjB+IUh5vcblqvYSopaktik5PUsiA= X-Google-Smtp-Source: ABdhPJyib0eF9WrIZOpxsMklWfH2xGWxbOZVqWSgpgc61qT0GmTW8Nobz1RA3dlNbsUM+ikerLdRfZfhsE2Cr+dtENQ= X-Received: by 2002:ac2:5e3a:: with SMTP id o26mr7514790lfg.78.1596425521493; Sun, 02 Aug 2020 20:32:01 -0700 (PDT) MIME-Version: 1.0 Date: Mon, 3 Aug 2020 06:31:50 +0300 Message-ID: To: tandre@php.net, kriscraig@php.net, danielc@php.net, derick@php.net, nikic@php.net, joe@joeferguson.me, internals@lists.php.net Content-Type: multipart/mixed; boundary="0000000000001e8ffe05abf0c870" Subject: Feature Request: dependencies container From: zsidelnik@gmail.com (3u93n3) --0000000000001e8ffe05abf0c870 Content-Type: multipart/alternative; boundary="0000000000001e8ffd05abf0c86e" --0000000000001e8ffd05abf0c86e Content-Type: text/plain; charset="UTF-8" The main idea is to take control over objects creation and injecting dependencies. 1. Some of them are provided through constructor (those, which could only be retrieved right before instantiating our object). 2. Others are provided through `__inject` and PHP will inject all those dependencies automatically. Configuration we define in separate class, and pass it's instance into function-helper. More verbose explanation in attached file: --0000000000001e8ffd05abf0c86e Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
The main idea is to take control over objects creatio= n and injecting dependencies.

1. Some of them are = provided through constructor (those, which could only be retrieved right be= fore instantiating our object).
2. Others are provided through `_= _inject` and PHP will inject all those dependencies automatically. Configur= ation we define in separate class, and pass it's instance into function= -helper.

More verbose explanation in attached file= :

--0000000000001e8ffd05abf0c86e-- --0000000000001e8ffe05abf0c870 Content-Type: text/markdown; charset="US-ASCII"; name="rfc.md" Content-Disposition: attachment; filename="rfc.md" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_kddyj0lh0 CiMgTmF0aXZlIERlcGVuZGVuY2llcyBIYW5kbGVyIChgX19pbmplY3RgKQoKIyMgSW50cm9kdWN0 aW9uCkN1cnJlbnRseSB0aGVyZSBhcmUgYSBsb3Qgb2YgdGhpcmQtcGFydHkgbGlicmFyaWVzIGZv ciBoYW5kbGluZyBjbGFzcyBkZXBlbmRlbmNpZXMuIEJ1dCB0aGUgcHJvYmxlbSB3aXRoIHRoZW0g aXMgdGhleSBhcmUgbm90IGdvaW5nIHRvIHdvcmsgaWYgeW91IGluc3RhbnRpYXRlIG9iamVjdCB3 aXRoIGBuZXdgIGtleXdvcmQuIFRvIGFjdHVhbGx5IHVzZSBkZXBlbmRlbmNpZXMgY29udGFpbmVy LCB3ZSBuZWVkIGNyZWF0ZSBvYmplY3RzIHdpdGggaGVscGVyIGZ1bmN0aW9uLiBUaGVyZWJ5LCB3 aGVuIHJlcXVpcmVtZW50cyBhcmUgY2hhbmdlZCBhbmQgY2xhc3MgbmVlZCBhZGRpdGlvbmFsIGRl cGVuZGVuY3ksIHdlIHdpbGwgbmVlZCB0byB3YWRlIHRocm91Z2ggYWxsIHBsYWNlcyB3aGVyZSBv YmplY3RzIG9mIHRoYXQgY2xhc3MgYXJlIGNyZWF0ZWQgaW4gbmF0aXZlIHdheSAod2UgY291bGRu J3QgZW5mb3JjZSB1c2luZyBoZWxwZXIgZnVuY3Rpb24gdG8gbWFrZSBvdXIgb2JqZWN0cykuCgoj IyMgSW4gZ2VuZXJhbCwgd2UgY2FuIHNwb3QgdHdvIG1haW4gdHlwZXMgb2YgZGVwZW5kZW5jaWVz OgoxLiBDbGFzcy1iYXNlZCAtIGluZGVwZW5kZW50IG9mIHN1cnJvdW5kaW5ncywgYnV0IGRlcGVu ZHMgcmF0aGVyIG9uIF9jbGFzcyBuYW1lXyAtIGZvciBlYWNoICBvYmplY3QgYmVpbmcgaW5zdGFu dGlhdGVkIHdlIHdhbnQgdG8gdXNlIHRoZSBzYW1lIHN0cmF0ZWd5IG9mIGNyZWF0aW5nIHRob3Nl IGRlcGVuZGVuY2llczsKMi4gUnVudGltZS1iYXNlZCAtIGNhbiBvbmx5IGJlIHByb3ZpZGVkIGFj Y29yZGluZ2x5IHRvIHNvbWUgX2V4dGVybmFsIGNvbmRpdGlvbnNfIGtub3duIG9ubHkgcmlnaHQg YmVmb3JlIG9iamVjdCBpcyBjcmVhdGVkLgoKIyMgUHJvcG9zYWwKIyMjIEluIGEgbnV0c2hlbGw6 CkJlc2lkZXMgdGhlIGNvbnN0cnVjdG9yLCB3ZSBpbnRyb2R1Y2UgbmV3IG1hZ2ljIG1ldGhvZCBg X19pbmplY3RgIHRvIGluamVjdCBbcnVudGltZS1pbmRlcGVuZGVudCAoY2xhc3MtYmFzZWQpXSgj aW4tZ2VuZXJhbC13ZS1jYW4tc3BvdC10d28tbWFpbi10eXBlcy1vZi1kZXBlbmRlbmNpZXMpIGRl cGVuZGVuY2llcyBpbiBhY2NvcmRpbmcgdG8gdGhlIHJlZ2lzdGVyZWQgY29uZmlndXJhdGlvbi4K CkV2ZXJ5IHRpbWUgYG5ld2Aga2V5d29yZCBpcyB1c2VkLCByaWdodCBiZWZvcmUgYF9fY29uc3Ry dWN0YCBpcyBpbnZva2VkLCBkZXBlbmRlbmNpZXMgd2lsbCBiZSByZXNvbHZlZCBhbmQgZ2l2ZW4g dG8gYF9faW5qZWN0YCBtZXRob2QuIENvbnN0cnVjdG9yIGxpa2UgYmVmb3JlIGFjY2VwdHMgYXJn dW1lbnRzIGdpdmVuIGluIGJyYWNrZXRzIG5lYXIgYG5ld2Aga2V5d29yZC4KCiMjIyBNb3JlIHZl cmJvc2UgZXhwbGFuYXRpb246Ckl0IHdhcyBjb25zaWRlcmVkIHRvIHJlZ2lzdGVyIGRlcGVuZGVu Y2llcyBkaXJlY3RseSBmb3IgY29uc3RydWN0b3IgYW5kIG1peCBydW50aW1lLSBhbmQgY2xhc3Mt ZGVwZW5kZW50IHBhcmFtZXRlcnMgaW4gYF9fY29uc3RydWN0YCwgYnV0IGl0IHNlZW1zIHRoYXQg Y29kZSB3aWxsIGJlY29tZSB2ZXJ5IHRhbmdsZWQgYW5kIGNvbmZ1c2luZyBiZWNhdXNlIHlvdSBk b24ndCBjZXJ0YWlubHkga25vdyB3aGVyZSB3aGljaCBwYXJhbWV0ZXIgY2FtZSBmcm9tLiBBbmQg YWxzbyBJREUgd291bGQgbm90IGJlIGFibGUgdG8gc3BvdCB3aGljaCBwYXJhbWV0ZXIgd2hlcmUg Z29lcy4KClRoZSBiZXR0ZXIgYXBwcm9hY2ggaXMganVzdCBsZWZ0IGBfX2NvbnN0cnVjdGAgYXMg aXQgYWx3YXlzIHdhcyB1c2VkIChmb3IgcnVudGltZS1kZXBlbmRlbnQgdmFsdWVzKS4gQW5kIGZv ciBhbGwgZGVwZW5kZW5jaWVzIHdoaWNoIGhhdmUgbm90aGluZyB0byBkbyB3aXRoIHJ1bnRpbWUg Y29udGV4dCwgdXNlIHNlcGFyYXRlIG1hZ2ljIG1ldGhvZCAgYF9faW5qZWN0YC4gCgojIyMjIExl dCdzIGxvb2sgYXQgc2ltcGxlIGV4YW1wbGUgd2hlbiBkZXBlbmRlbmNpZXMgZ3JvdzoKMS4gQXQg dGhlIHN0YXJ0IHdlIGhhdmUgcGFzc3dvcmQsIHJlcHJlc2VudGVkIGJ5IGl0J3MgcmF3IHZhbHVl OgpgYGBwaHAKY2xhc3MgVXNlclBhc3N3b3JkCnsKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0 cnVjdCgKICAgICAgICBwcml2YXRlIHN0cmluZyAkdmFsdWUKICAgICl7fQogICAgLy8gLi4uCn0K Ly8gYSBsb3Qgb2YgcGxhY2VzIHdoZXJlIGl0IGlzIGNyZWF0ZWQKJHBhc3N3b3JkID0gbmV3IFVz ZXJQYXNzd29yZCgncXdlcnR5Jyk7CmBgYAoyLiBUaGVuLCBmb3Igc2VjdXJpdHkgcmVhc29ucyB3 ZSBkZWNpZGVkIHRvIGhhc2ggcGFzc3dvcmRzLCB0aHVzIG5ldyBgSGFzaGVySW50ZXJmYWNlYCBk ZXBlbmRlbmN5IGlzIHJlcXVpcmVkLiBXZSBrbm93IHRoYXQgZm9yIGV2ZXJ5IG9iamVjdCBvZiBg VXNlclBhc3N3b3JkYCB3ZSB3YW50IHVzZSB0aGUgc2FtZSB0eXBlIG9mIGhhc2hlciAtIG9yIGV2 ZW4gc2FtZSBvYmplY3QgKGRlcGVuZGVuY3kgaXMgY2xhc3MtYmFzZWQpLiBTbyB3ZSBhZGQgZGVw ZW5kZW5jeSBpbnRvIGBfX2luamVjdGAgbWV0aG9kOgpgYGBwaHAKY2xhc3MgVXNlclBhc3N3b3Jk CnsKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2luamVjdCgKICAgICAgICBwcml2YXRlIEhhc2hlcklu dGVyZmFjZSAkaGFzaGVyCiAgICApeyB9CiAgICAKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0 cnVjdCgKICAgICAgICBwcml2YXRlIHN0cmluZyAkdmFsdWUsCiAgICAgICAgYm9vbCAkYWxyZWFk eUhhc2hlZCA9IGZhbHNlCiAgICApewogICAgICAgIGlmICghJGFscmVhZHlIYXNoZWQpIHsKICAg ICAgICAgICAgJHRoaXMtPnZhbHVlID0gJHRoaXMtPmhhc2hlci0+bWFrZSgkdmFsdWUpOwogICAg ICAgIH0KICAgIH0KCiAgICAvLyAuLi4KfQpgYGAKPiBOb3RlIGFib3V0IHRoZSBtb21lbnQgd2hl biBgX19pbmplY3RgIGlzIGNhbGxlZC4gQXMgaXQgaXMgdXNlZCBmb3IgcnVudGltZS1pbmRlcGVu ZGVudCB2YWx1ZXMsIGl0IGhhcyB0byBiZSBjYWxsZWQgcmlnaHQgYmVmb3JlIGBfX2NvbnN0cnVj dGAgc28gdGhhdCBpbiBjb25zdHJ1Y3RvciB3ZSBjYW4gdXNlIGFsbCBnaXZlbiBkZXBlbmRlbmNp ZXMuCjMuIE9uY2Ugd2UgZGVjbGFyZWQgYF9faW5qZWN0YCBtZXRob2QsIHdlIG5lZWQgdG8gY29u ZmlndXJlIGNvbnRhaW5lci4gVG8gcmVnaXN0ZXIgZGVwZW5kZW5jaWVzIGNvbmZpZ3VyYXRpb24s IHdlIGltcGxlbWVudCBgRGVwZW5kZW5jaWVzUHJvdmlkZXJgIGFuZCBwbGFjZSBhbGwgcmVnaXN0 cmF0aW9ucyBpbnRvIGByZWdpc3RlckJpbmRpbmdzVG9gIG1ldGhvZDoKYGBgcGhwCmNsYXNzIEFw cGxpY2F0aW9uRGVwZW5kZW5jaWVzUHJvdmlkZXIgaW1wbGVtZW50cyBEZXBlbmRlbmNpZXNQcm92 aWRlciAgCnsKICBwdWJsaWMgZnVuY3Rpb24gcmVnaXN0ZXJCaW5kaW5nc1RvKERlcGVuZGVuY2ll c1JlY29yZGVyICRyZWNvcmRlcik6IHZvaWQgIAogIHsKICAgICAgICAkcmVjb3JkZXItPndoZW4o VXNlclBhc3N3b3JkOjpjbGFzcykKICAgICAgICAgICAgLT5uZWVkcyhIYXNoZXJJbnRlcmZhY2U6 OmNsYXNzKQogICAgICAgICAgICAtPnByb3ZpZGUoU2hhMjU2SGFzaGVyOjpjbGFzcyk7CiAgICAg ICAgCiAgICAgICAgJHJlY29yZGVyLT5zaW5nbGV0b24oU2hhMjU2SGFzaGVyOjpjbGFzcyk7CiAg ICB9Cn0KYGBgCj4gRm9yIG1vcmUgY29uZmlndXJhdGlvbiBleGFtcGxlcywgc2VlIFtEZXBlbmRl bmN5IGJpbmRpbmdzXSgjcG9zc2libGUtZGVwZW5kZW5jeS1iaW5kaW5ncykKCkFuZCB0aGVuLCB3 ZSBwYXNzIGluc3RhbmNlIG9mIGNyZWF0ZWQgcHJvdmlkZXIgaW50byBzcGVjaWFsIGZ1bmN0aW9u OgpgYGBwaHAKcmVnaXN0ZXJfZGVwZW5kZW5jeV9iaW5kaW5ncyhuZXcgQXBwbGljYXRpb25EZXBl bmRlbmNpZXNQcm92aWRlcigpKTsKYGBgCjQuIEFzIHJlc3VsdCwgYWxsIHByZXZpb3VzIGNvZGUg aXMgbm90IGJyb2tlbiBhbmQgd2UgZG9uJ3QgaGF2ZSB0byBtb2RpZnkgaXQuCmBgYHBocAovLyBb b2xkIGNvZGVdIGluIGEgbG90IG9mIHBsYWNlcyAobm93IGhhc2hlciBpcyBhdXRvbWF0aWNhbGx5 IGluamVjdGVkKQokcGFzc3dvcmQgPSBuZXcgVXNlclBhc3N3b3JkKCd0aGlzIHN0cmluZyB3aWxs IGJlIGhhc2hlZCcpOwoKLy8gbm8gdHJvdWJsZXMgd2l0aCBwcm92aWRpbmcgY2xhc3MtYmFzZWQg ZGVwZW5kZW5jaWVzCiRwYXNzd29yZEZyb21EQiA9IG5ldyBVc2VyUGFzc3dvcmQoCiAgICAnU0dW c2JHOHNJR1p5YVdWdVpDNGdWMmg1SUdGeVpTQjViM1VnYUdWeVpUOGdRSEpsYkdFMU9EbHUnLAog ICAgYWxyZWFkeUhhc2hlZDogdHJ1ZQopOwpgYGAKSWYgZm9yIHNvbWUgb2RkIHJlYXNvbiAob3Ig Zm9yIHVuaXQgdGVzdGluZykgd2UgbmVlZCBjdXN0b21pemUgZGVwZW5kZW5jaWVzIGluIGBfX2lu amVjdGAgbWV0aG9kIGF0IHJ1bnRpbWUsIGl0IGNvdWxkIGJlIGRvbmUgYnkgbWVhbnMgb2YgbmFt ZWQgYXJndW1lbnRzLiAKYGBgcGhwCiRwYXNzd29yZCA9IG5ldyBVc2VyUGFzc3dvcmQoIAogICAg J3NvbWUgdGV4dCBoZXJlJywKICAgIGhhc2hlcjogbmV3IEFyZ29uMklkSGFzaGVyKCkKKTsKYGBg Cj4gX05vdGU6XyBXaGVuIHlvdSBmaW5kIHlvdXJzZWxmIGN1c3RvbWl6aW5nIGRlcGVuZGVuY2ll cyBpbiBgX19pbmplY3RgLCByZWNvbnNpZGVyIGlmIHRoZXkgcmVhbGx5IGNhbid0IHJlc2lkZSBp biBjb25zdHJ1Y3Rvci4KCkF0IGZpcnN0LCBQSFAgdHJpZXMgdG8gbG9jYXRlIG5hbWVkIHBhcmFt ZXRlciBpbiBfY29uc3RydWN0b3JfIGJ1dCBpZiBub3QgZm91bmQsIGxvb2tzIGZvciBpdCBpbiBf aW5qZWN0IG1ldGhvZF8uICBJZiBtYXRjaCBlc3RhYmxpc2hlZCwgdmFsdWUgd2lsbCBiZSBwYXNz ZWQgaW50byBfaW5qZWN0b3JfIGFuZCB0aHVzIG92ZXJyaWRlIHJlZ2lzdGVyZWQgYmluZGluZyBm b3IgdGhpcyBwYXJhbWV0ZXIuCgojIyMjIEhvdyBkb2VzIGFjdHVhbCBjcmVhdGluZyB3b3JrcwpM ZXQncyBjb25zaWRlciBwcmV2aW91cyBjb2RlIHNuaXBwZXQuCgpBcyB1c3VhbCwgUEhQIHByZXBh cmUgYWxsIHByb3ZpZGVkIHBhcmFtZXRlcnMgKHN0cmluZyBgJ3NvbWUgdGV4dCBoZXJlJ2Agd2ls bCBiZSBjb25zaWRlcmVkIGFzIGAkdmFsdWVgIGFuZCBkZWZhdWx0IHZhbHVlIGBmYWxzZWAgd2ls bCBiZSB1c2VkIGZvciBgJGFscmVhZHlIYXNoZWRgKS4gCgpXaGVuIHBocCBmYWNlIG5hbWVkIGFy Z3VtZW50IHdoaWNoIGlzIG5vdCBib3VuZCB0byBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIsIGl0IHRy aWVzIHRvIGxvY2F0ZSBjb3JyZXNwb25kaW5nIGFyZ3VtZW50IG1hdGNoIGluIHNpZ25hdHVyZSBv ZiBfaW5qZWN0XyBtZXRob2QuIElmIGl0IHdhcyBmb3VuZCwgdGhhdCBleHRyYSBhcmd1bWVudCB3 aWxsIGJlIHVzZWQgdG8gc2F0aXNmeSBkZXBlbmRlbmN5LiBUaG9zZSBleHRyYSB2YWx1ZXMgYXJl IHN0b3JlZCBzb21ld2hlcmUgKHByb2JhYmx5IGBIYXNoTWFwYCkgdW50aWwgYWN0dWFsbHkgaW52 b2tpbmcgX2luamVjdG9yXy4KClNvLCBhbGwgYXJndW1lbnRzIGZvciBjb25zdHJ1Y3RvciBhcmUg cHJlcGFyZWQgYW5kIHN0b3JlZC4gQW5kIGFsc28gd2UgaGF2ZSBleHRyYSBkZXBlbmRlbmNpZXMg d2hpY2ggb3ZlcnJpZGUgY29uZmlndXJhdGlvbiBvZiBwcm92aWRpbmcgZGVmaW5lZCBpbiBfRGVw ZW5kZW5jaWVzUHJvdmlkZXJfLiAKQXQgdGhpcyBwb2ludCwgYF9faW5qZWN0YCB3aWxsIGJlIGNh bGxlZCBpbiB0aGUgZm9sbG93aW5nIHdheS4gR28gdGhyb3VnaCBhbGwgZXhwZWN0ZWQgcGFyYW1l dGVycyBhbmQgaWYgZm9yIGN1cnJlbnQgZXhwZWN0ZWQgYXJndW1lbnQgZXhpc3RzIGV4dHJhIHZh bHVlIGluIGBIYXNoTWFwYCwgdGhlbiBnaXZlIHRoYXQgdmFsdWUgYW5kIHJlbW92ZSBpdCBmcm9t IG1hcC4gRWxzZSByZXNvbHZlIGRlcGVuZGVuY3kgaW4gYWNjb3JkYW5jZSB3aXRoIHJlZ2lzdGVy ZWQgYmluZGluZ3MgaWYgc3VjaCBhcmUgcHJvdmlkZWQuIAoKSWYgdGhlcmUgaXMgbm8gY29uZmln dXJhdGlvbiBwcm92aWRlZCBmb3IgY2xhc3MsIFBIUCB3aWxsIHRyeSB0byBjcmVhdGUgb2JqZWN0 IGFzIGl0IGlzIChhbmQgaWYgbmVlZGVkLCBhbmFseXplIGFuZCByZXNvbHZlIGl0J3Mgb3duIGRl cGVuZGVuY2llcywgZGVwZW5kZW5jaWVzIG9mIGRlcGVuZGVuY2llcyBhbmQgc28gZm9ydGgpLiBJ ZiBvYmplY3Qgb3Igc29tZSBvZiBpdCdzIGRlcGVuZGVuY2llcyBjb3VsZCBub3QgYmUgaW5zdGFu dGlhdGVkLCBzb21lIGtpbmQgb2YgRXhjZXB0aW9uIHdpbGwgYmUgZ2VuZXJhdGVkLgo+IEZvciBt b3JlIGluZm9ybWF0aW9uIHNlZSBbaW5qZWN0aW5nXSgjaG93LXBocC13aWxsLWluamVjdC1kZXBl bmRlbmNpZXMpLgoKIyMjIFBvc3NpYmxlIGRlcGVuZGVuY3kgYmluZGluZ3M6CgoxLiBHbG9iYWwg YmluZGluZyBJbnRlcmZhY2UgKG9yIEFic3RyYWN0IGNsYXNzKSB0byBpbXBsZW1lbnRhdGlvbjoK YGBgcGhwCiRyZWNvcmRlci0+YmluZCgKICAgIEFydGljbGVzUmVwb3NpdG9yeTo6Y2xhc3MsCiAg ICBDYWNoZWRBcnRpY2xlc1JlcG9zaXRvcnlEZWNvcmF0b3I6OmNsYXNzCik7CmBgYApXaGVyZXZl ciBgQXJ0aWNsZXNSZXBvc2l0b3J5YCBpcyByZXF1aXJlZCwgYENhY2hlZEFydGljbGVzUmVwb3Np dG9yeURlY29yYXRvcmAgd2lsbCBiZSB1c2VkICh1bmxlc3Mgd2UgZGVmaW5lZCBtb3JlIHNwZWNp ZmljIGJpbmRpbmcgLSBzZWUgaXRlbSA0KS4gV2hlbiBpdCBpcyB0aW1lIHRvIHBhc3MgZGVwZW5k ZW5jaWVzLCBQSFAgd2lsbCB0cnkgdG8gYnVpbGQgYGNvbmNyZXRpb25gIChjYWNoZSBkZWNvcmF0 b3IgaW4gZXhhbXBsZSkgYnkgaGltc2VsZiAoYW5hbHl6aW5nIGl0J3MgZGVwZW5kZW5jaWVzIGFu ZCBzbyBvbikuIFRvIHNwZWNpZnkgb3duIHN0cmF0ZWd5IG9mIGNyZWF0aW5nLCBjb25zaWRlciBg ZGVmaW5lQ3JlYXRpbmdTdHJhdGVneWAgbWV0aG9kIChzZWUgYmVsb3cpLgoKMi4gRGVmaW5pbmcg Z2xvYmFsIHN0cmF0ZWd5IGhvdyB0byBjcmVhdGUgb2JqZWN0IG9mIHBhcnRpY3VsYXIgY2xhc3Mg KGJ5IGRlZmF1bHQsIHBocCB3aWxsIHRyeSB0byBjcmVhdGUgb2JqZWN0IGJ5IFthbmFseXppbmdd KCNob3ctcGhwLXdpbGwtaW5qZWN0LWRlcGVuZGVuY2llcykgYWxsIGRlcGVuZGVuY2llcyBhbmQg cHJvdmlkaW5nIHRoZW0pOgpgYGBwaHAKJHJlY29yZGVyLT5kZWZpbmVDcmVhdGluZ1N0cmF0ZWd5 KAogICAgQXJnb24ySWRIYXNoZXI6OmNsYXNzLAogICAgZm4gKCkgPT4gbmV3IEFyZ29uMklkSGFz aGVyKFsKICAgICAgICAndmVyaWZ5JyA9PiB0cnVlCiAgICBdKS8vIEFyZ29uMkhhc2hlciBkZXBl bmRlbmNpZXMgZGVzY3JpYmVkIGluIF9faW5qZWN0IHdpbGwgYmUgYWxzbyBwcm92aWRlZAopOwpg YGAKMy4gRGVmaW5pbmcgYSBzaW5nbGV0b24uIE9iamVjdCB3aWxsIGJlIGNyZWF0ZWQgb25jZSwg bmV4dCB0aW1lcyB0aGUgc2FtZSB3aWxsIGJlIHVzZWQuIEl0IGRvZXNuJ3QgYXBwbHkgZm9yIHRo b3NlIGJpbmRpbmdzIHdoZXJlIGByZXNvbHZlYCBpcyB1c2VkLCBiZWNhdXNlIGluIGZ1bmN0aW9u IHdlIGhhdmUgZnVsbCBjb250cm9sIG92ZXIgIHN1cHBseWluZyBvYmplY3QuCmBgYHBocAokcmVj b3JkZXItPnNpbmdsZXRvbihEYXRhYmFzZUNvbm5lY3Rpb246OmNsYXNzKTsKYGBgCj4gVG8gZGVm aW5lIG93biBzdHJhdGVneSBmb3IgY3JlYXRpbmcgc2luZ2xldG9uIG9iamVjdCwgdXNlIGBkZWZp bmVDcmVhdGluZ1N0cmF0ZWd5YC4KNC4gQ29udGV4dHVhbCBiaW5kaW5nLiBVc2UgYHdoZW4gLSBu ZWVkcyAtIHByb3ZpZGVgIG5vdGF0aW9uIHRvIGRlZmluZSB3aGljaCBpbXBsZW1lbnRhdGlvbiBz aG91bGQgYmUgdXNlZC4gUEhQIHdpbGwgdHJ5IHRvIGJ1aWxkIGJvdW5kIG9iamVjdCBieSBbYW5h bHl6aW5nXSgjaG93LXBocC13aWxsLWluamVjdC1kZXBlbmRlbmNpZXMpIGl0J3MgYF9faW5qZWN0 YCBtZXRob2QuCmBgYHBocAokcmVjb3JkZXItPndoZW4oVXNlclBhc3N3b3JkOjpjbGFzcykKICAg IC0+bmVlZHMoSGFzaGVySW50ZXJmYWNlOjpjbGFzcykKICAgIC0+cHJvdmlkZShTaGEyNTZIYXNo ZXI6OmNsYXNzKTsKYGBgCj5Ob3RlIHRoYXQgc3RyYXRlZ3kgb2YgY3JlYXRpbmcgYFNoYTI1Nkhh c2hlcmAgY2FuIGJlIGRlZmluZWQgd2l0aCBgZGVmaW5lUmVzb2x2ZVN0cmF0ZWd5YCBtZXRob2Qg ZGVzY3JpYmVkIGFib3ZlLiBPciBlbHNlLCB5b3UgY2FuIHVzZSBgcmVzb2x2ZWAgaW5zdGVhZCBv ZiBgcHJvdmlkZWAuIAoKSW5zdGVhZCBvZiBgcHJvdmlkZWAsIHlvdSBjYW4gdXNlYGdpdmVgIG1l dGhvZCwgd2hlcmUgeW91IHBhc3MgaW5zdGFudGlhdGVkIG9iamVjdApgYGBwaHAKJHJlY29yZGVy LT53aGVuKFN0b3JlRmlsZVJlcXVlc3Q6OmNsYXNzKQogICAgLT5uZWVkcyhGaWxlRGVzY3JpcHRp b25SdWxlczo6Y2xhc3MpCiAgICAtPmdpdmUoJGxvYWRlZEZyb21DYWNoZUZpbGVEZXNjcmlwdGlv blJ1bGVzKQpgYGAKPiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd291bGQgbGlrZSBlYWdlciBsb2Fk IHlvdXIgb2JqZWN0cyBvciB1c2UgY2FjaGluZyBmb3Igc29tZSBjb25maWd1cmF0aW9uIG9iamVj dHMgd2hpY2ggdGFrZSBhIGxvdCBvZiB0aW1lIHRvIGJ1aWxkLgo1LiBDb250ZXh0dWFsIGJpbmRp bmcgd2l0aCBjdXN0b20gYHJlc29sdmVgIHN0cmF0ZWd5IChzaW5nbGV0b25zIGRvbid0IGFwcGx5 IGZvciBzdWNoIGJpbmRpbmcsIGN1eiB3ZSBoYXZlIGZ1bGwgY29udHJvbCBvdmVyIG1ldGhvZCk6 CmBgYHBocAokcmVjb3JkZXItPndoZW4oUGxheVdpdGhFdmVudHM6OmNsYXNzLCBFdmVudE1vY2tl cjo6Y2xhc3MpCiAgICAtPm5lZWRzKEV2ZW50c0Rpc3BhdGNoZXI6OmNsYXNzKQogICAgLT5yZXNv bHZlKGZuKCkgPT4gbmV3IEV2ZW50RmFrZShldmVudHNUb0Zha2U6ICcqJykpOwpgYGAKVGFrZSBh IGxvb2sgYXQgYHdoZW5gIG1ldGhvZCwgd2hpY2ggYWNjZXB0cyB2YXJpYWRpYyBhcnJheSBvZiBj bGFzc2VzIGRlcGVuZGVudCBvZiBgRXZlbnRzRGlzcGF0Y2hlcmAuIFRodXMsIHdoZW4gYFBsYXlX aXRoRXZlbnRzYCBhbmQgb3RoZXIgY2xhc3NlcyB3aWxsIGJlIGNyZWF0ZWQsIHRoZXkgd2lsbCBi ZSBwcm92aWRlZCB3aXRoIGBFdmVudEZha2VgIGltcGxlbWVudGF0aW9uIG9mIGBFdmVudHNEaXNw YXRjaGVyYCBpbnRlcmZhY2UgdW5sZXNzIGJpbmRpbmcgaXMgb3ZlcnJpZGRlbiBieSBmdXJ0aGVy IG9uZSAoZm9yIGV4YW1wbGUsIHNpbXBsZSBgd2hlbiAtIG5lZWRzIC0gcmVzb2x2ZWAgZm9yIHNv bWUgcGFydGljdWxhciBjbGFzcykuCgo2LiBDb250ZXh0dWFsIHBhcmFtZXRlcnMgYmluZGluZ3Mu IFdlIGNhbiBiaW5kIGNvbmNyZXRlIHZhbHVlcyAob3Igc3RyYXRlZ2llcyBvZiBhY3F1aXJpbmcg dGhlbSkgdG8gdmFyaWFibGUgbmFtZXMgb2YgIGBfX2luamVjdGAgbWV0aG9kLgpgYGBwaHAKJHJl Y29yZGVyLT53aGVuKFJlZ2lzdGVyVXNlckNvbW1hbmQ6OmNsYXNzKQogICAgLT5hc2tzR2l2ZShz ZW5kRW1haWw6ICAgIHRydWUsIAogICAgICAgICAgICAgICBzdGFydFNlc3Npb246IHRydWUpCiAg ICAtPmFza3NHaXZlKG5vdGlmeUFkbWluOiBBZG1pbk5vdGlmaWVyOjpJRl9OT1RfTklHSFQpCiAg ICAtPmFza3NSZXNvbHZlKGVtYWlsRHJpdmVyOiBmbigpID0+IG5ldyBTd2lmdEVtYWlsRHJpdmVy KCkpOwpgYGAKQXMgeW91IGNhbiBzZWUsIGBhc2tzR2l2ZWAgbWV0aG9kIGFjY2VwdHMgdmFyaWFk aWMgYXJyYXkgd2l0aCBuYW1lZCBwYXJhbWV0ZXJzLCB2YWx1ZXMgb2Ygd2hpY2ggd2lsbCBiZSBn aXZlbiB0byBgUmVnaXN0ZXJVc2VyQ29tbWFuZGAuCkFsc28sIHdlIGNhbiB1c2UgYGFza3NSZXNv bHZlYCwgd2hlcmUgZWFjaCB2YWx1ZSBtdXN0IGJlIGNhbGxiYWNrIHJldHVybmluZyBkZXNpcmFi bGUgcGFyYW1ldGVyIHZhbHVlLiBJdCBpcyB1c2VmdWwgd2hlbiB3ZSB3YW50IHRvIGNyZWF0ZSBv YmplY3RzIChjYWxsYmFjayB3aWxsIGJlIGludm9rZWQgYXQgcnVudGltZSwgdGhlcmVmb3JlIGFs bCBiaW5kaW5ncyBhcmUgcmVnaXN0ZXJlZCkuCgo3LiBCaW5kaW5nIHR5cGVkIHZhcmlhZGljcy4g Q29uc2lkZXIgbmV4dCBleGFtcGxlOgpgYGBwaHAKY2xhc3MgRmlyZXdhbGwKewogICAgcHJpdmF0 ZSBhcnJheSAkZmlsdGVyczsKICAgIAogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KAoJ cHJpdmF0ZSBMb2dnZXIgJGxvZ2dlciwgCiAgICAgICAgICAgICAgICBGaWx0ZXIgLi4uJGZpbHRl cnMpCiAgICB7IAogICAgCSR0aGlzLT5maWx0ZXJzID0gJGZpbHRlcnM7CiAgICB9Cn0KYGBgClRv IHJlZ2lzdGVyIHZhcmlhZGljIGJpbmRpbmcsIHdlIGhhdmUgcGxlYXNhbnQgYG5lZWRzVmFyaWFk aWNgIG1ldGhvZDoKYGBgcGhwCiR0aGlzLT53aGVuKEZpcmV3YWxsOjpjbGFzcykKICAgIC0+bmVl ZHNWYXJpYWRpYyhGaWx0ZXI6OmNsYXNzKQogICAgLT5yZXNvbHZlKGZuKCkgPT4gWwogICAgICAg IG5ldyBCYW5uZWRVc2Vyc0ZpbHRlcigpLAogICAgICAgIG5ldyBCYW5uZWRCeUlwRmlsdGVyKEJh bm5lZEJ5SXBGaWx0ZXI6OldFQUtfU1RSQVRFR1kpCiAgICBdKTsKYGBgCldlIGNhbiB1c2UgZWl0 aGVyIGByZXNvbHZlYCBvciBgZ2l2ZWAgbWV0aG9kLiBEaWZmZXJlbmNlIGlzIHRoYXQgYHJlc29s dmVgIGFsd2F5cyBhY2NlcHRzIGNhbGxiYWNrLCB0aHVzIGFsbCBvYmplY3RzIHdpbGwgYmUgY3Jl YXRlZCBqdXN0IGJlZm9yZSBpbmplY3RpbmcuIEZyb20gb3RoZXIgaGFuZCwgYGdpdmVgIG1ldGhv ZCBfZ2l2ZXNfIGFjdHVhbCB2YWx1ZXMsIHRoZXJlZm9yZSBhbGwgb2JqZWN0cyB3aWxsIGJlIGNy ZWF0ZWQgcmlnaHQgYXdheSBkdXJpbmcgY29uZmlndXJhdGlvbiBsb25nIGJlZm9yZSB0aGV5IGFj dHVhbGx5IG5lZWRlZC4gRm9yIG9iamVjdHMsIGl0IGlzIGJldHRlciB0byB1c2UgYHJlc29sdmVg IG1ldGhvZCBpbmFzbXVjaCBhcyBhbGwgYmluZGluZ3Mgd2lsbCBiZSByZWdpc3RlcmVkIHdoZW4g aXQncyB0aW1lIHRvIGNyZWF0ZS4KClZhcmlhZGljIHByaW1pdGl2ZXMgZXhhbXBsZToKYGBgcGhw CiR0aGlzLT53aGVuKFJlZnJpZ2VyYXRvcjo6Y2xhc3MpCiAgICAtPm5lZWRzVmFyaWFkaWMoJ2lu dCcpCiAgICAtPmdpdmUoWwogICAgICAgIDg5LAogICAgICAgIDk3LAogICAgXSk7CmBgYAo+IE5v dGU6IGFub3RoZXIgKGFuZCBtYXliZSBiZXR0ZXIgZm9yIHByaW1pdGl2ZXMpIG9wdGlvbiB0byBp bmplY3QgdmFyaWFkaWMgcGFyYW1ldGVyIGlzIHRvIHVzZSBiaW5kaW5nIGJ5IHBhcmFtZXRlciBu YW1lcyAoc2VlIGl0ZW0gNikKOC4gRXh0ZW5kaW5nIGJpbmRpbmdzLiBUaGUgYGV4dGVuZGAgbWV0 aG9kIGFsbG93cyB0aGUgbXV0YXRpb24gb2YgcmVzb2x2ZWQgc2VydmljZXMuIEZvciBleGFtcGxl LCB3aGVuIGEgc2VydmljZSBpcyByZXNvbHZlZCwgeW91IG1heSBydW4gYWRkaXRpb25hbCBjb2Rl IHRvIGRlY29yYXRlIG9yIGNvbmZpZ3VyZSB0aGUgc2VydmljZS4gTWV0aG9kIGFjY2VwdHMgYENs b3N1cmVgLCB3aGljaCB3aGljaCB3aWxsIGJlIGdpdmVuIHdpdGggY3JlYXRlZCBvYmplY3QgYW5k IG11c3QgcmV0dXJuIG9uZSBvZiBpdCdzIGluc3RhbmNlLiBUaGUgcmV0dXJuZWQgdmFsdWUgd2ls bCBiZSBhY3R1YWxseSB1c2VkLgpgYGBwaHAKJHRoaXMtPmV4dGVuZCgKICAgIEV4dGVybmFsU2Vy dmljZTo6Y2xhc3MsCiAgICBmdW5jdGlvbiAoRXh0ZXJuYWxTZXJ2aWNlICRzZXJ2aWNlKTogRXh0 ZXJuYWxTZXJ2aWNlIHsKICAgICAgICAkc2VydmljZS0+c2V0U29tZURlcGVuZGVuY3kobmV3IFNv bWVEZXBlbmRlbmN5KCkpOwoKICAgICAgICByZXR1cm4gbmV3IERlY29yYXRlZFNlcnZpY2UoJHNl cnZpY2UpOwogICAgfQp9KTsKYGBgCj4gTm90ZSB0aGF0IGV2ZXJ5IHRpbWUgYEV4dGVybmFsU2Vy dmljZWAgaXMgaW5zdGFudGlhdGVkLCB3aWxsIGJlIHVzZWQgb3VyIG93biBpbXBsZW1lbnRhdGlv bi4gSXQgZ2l2ZXMgdXMgYSBiaXQgY29udHJvbCBvdmVyIHRoaXJkLXBhcnR5IGxpYnJhcmllcyB3 aGljaCB3aWxsIHVzZSBgX19pbmplY3RgIG1ldGhvZCBzbyB0aGF0IHdlIGNhbiBzdWJzdGl0dXRl IG9iamVjdHMgd2l0aCBvdXIgb3duIGltcGxlbWVudGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24uIFdl IHNob3VsZCBiZSBjYXJlZnVsIGFuZCBkb24ndCBvdmVydXNlIHRoaXMuCgojIyMgUmVzb2x2aW5n IGRlcGVuZGVuY2llcwpXaGVuIG5lZWQgdG8gcHJvdmlkZSBkZXBlbmRlbmN5IGluIG9iZWRpZW5j ZSB0byBiaW5kaW5nLCBuZWVkIHRvIGZvbGxvdyBuZXh0IG9yZGVyIG9mIGNoZWNraW5nOgoxLiBD b250ZXh0dWFsIGJpbmRpbmcgYnkgcGFyYW1ldGVyIG5hbWUgKGBhc2tzR2l2ZWAsIGBhc2tzUmVz b2x2ZWApOwoyLiBDb250ZXh0dWFsIHZhcmlhZGljIGJpbmRpbmcgKGBnaXZlYCwgYHJlc29sdmVg KTsKMy4gQ29udGV4dHVhbCBiaW5kaW5nIGJ5IGNsYXNzIG5hbWUgKGBnaXZlYCwgYHByb3ZpZGVg LCBgcmVzb2x2ZWApOwo0LiBHbG9iYWwgYmluZGluZyBhYnN0cmFjdGlvbiB0byBpbXBsZW1lbnRh dGlvbiAoYGJpbmRgLCBgZGVmaW5lQ3JlYXRpbmdTdHJhdGVneWApLgoKIyMjIyBIb3cgcGhwIHdp bGwgaW5qZWN0IGRlcGVuZGVuY2llcwpGb3IgZXhhbXBsZSwgaWYgd2UgaGFkIGNvZGUgc25pcHBl dDoKYGBgcGhwCmNsYXNzIFVzZXJQYXNzd29yZAp7CiAgICBwdWJsaWMgZnVuY3Rpb24gX19wcm92 aWRlKAogICAgICAgIHByaXZhdGUgSGFzaGVySW50ZXJmYWNlICRoYXNoZXIKICAgICl7IH0KCiAg ICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoCiAgICAgICAgcHJpdmF0ZSBzdHJpbmcgJHZh bHVlLAogICAgICAgIGJvb2wgJGFscmVhZHlIYXNoZWQgPSBmYWxzZQogICAgKSB7CiAgICAgICAg aWYgKCEkYWxyZWFkeUhhc2hlZCkgewogICAgICAgICAgICAkdGhpcy0+dmFsdWUgPSAkdGhpcy0+ aGFzaGVyLT5tYWtlKCR2YWx1ZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8vIC4uLgp9CmBgYApJ biB0aGUgbWFpbiBjb2RlLCB3ZSBpbnN0YW50aWF0ZSBgVXNlclBhc3N3b3JkYCBsaWtlIHRoaXM6 CmBgYHBocAokcGFzc3dvcmQgPSBuZXcgVXNlclBhc3N3b3JkKCdoZWxsbywgd29ybGQhJyk7CmBg YApJZiBydW4gY29kZSBsaWtlIHRoaXMsIEV4Y2VwdGlvbiB3aWxsIGJlIGdlbmVyYXRlZCwgYmVj YXVzZSB3ZSBkaWRuJ3QgcmVnaXN0ZXIgYmluZGluZyBmb3IgaGFzaGVyLiBJdCBjb3VsZCBiZSBk b25lIGluIG11bHRpcGxlIHdheXMsIGxpa2Ugc2hvd24gW2Fib3ZlXSgjcG9zc2libGUtZGVwZW5k ZW5jeS1iaW5kaW5ncykuCkxldCdzIHVzZSBjb250ZXh0dWFsIGJpbmRpbmcgYnkgY2xhc3MgbmFt ZToKYGBgcGhwCiRyZWNvcmRlci0+d2hlbihVc2VyUGFzc3dvcmQ6OmNsYXNzKSAgCiAgICAtPm5l ZWRzKEhhc2hlckludGVyZmFjZTo6Y2xhc3MpICAKICAgIC0+cHJvdmlkZShTaGEyNTZIYXNoZXI6 OmNsYXNzKTsKYGBgCldoZW4gcGhwIGNyZWF0ZXMgb2JqZWN0LCB0aGVyZSBhcmUgdHdvIHBvc3Np YmxlIG9wdGlvbnMgZm9yIGhhc2hlciBkZXBlbmRlbmN5OgoxLiBJZiB3ZSBkZWZpbmVkIHN0cmF0 ZWd5IG9mIHJlc29sdmluZyBgU2hhMjU2SGFzaGVyYCwgdGhlbiBpdCB3aWxsIGJlIHVzZWQuCjIu IElmIG5vdCwgZXZlcnl0aGluZyBpcyBhIGxpdHRsZSBtb3JlIGNvbXBsaWNhdGVkLgpQSFAgc2Vl cyB0aGF0IHRoZXJlIGlzIG5vIHN0cmF0ZWd5IGZvciByZXNvbHZpbmcgYFNoYTI1Nkhhc2hlcmAs IHRodXMgd2lsbCBvcHRpbWlzdGljYWxseSB0cnkgdG8gaW5zdGFudGlhdGUgaXQgYW5kIHNhdGlz ZnkgaXQncyBkZXBlbmRlbmNpZXMuIAoyLjEgSWYgY2xhc3MgaXMgYWJzdHJhY3Qgb3IgYW4gaW50 ZXJmYWNlLCB3aWxsIGJlIHRocm93biBlcnJvcjsKMi4yIElmIGNvbnN0cnVjdG9yIGhhcyByZXF1 aXJlZCBwYXJhbWV0ZXIsIHRoZW4gd2UgY291bGQgbm90IHNhdGlzZnkgaXQgYW5kICBlcnJvciB3 aWxsIGJlIHRocm93bjsKMi4zIEVsc2UgcGhwIHdpbGwgdHJhdmVyc2UgYWxsIGV4cGVjdGVkIHBh cmFtZXRlcnMgb2YgYF9faW5qZWN0YCBhbmQgdHJ5IHRvIGZpbmQgYmluZGluZ3MgZm9yIHRoaXMg cGFyYW1ldGVyLiBJZiBpdCBmb3VuZCwgUEhQIGNyZWF0ZSBkZXBlbmRlbmN5IGFjY29yZGluZ2x5 IHRvIGl0LiBFbHNlIHJlcGVhdHMgdGhlIHNhbWUgYWxnb3JpdGhtIGRlc2NyaWJlZCBoZXJlLgoK Q29uc2lkZXIgc2lnbmF0dXJlcyBvZiBgX19pbmplY3RgIGFuZCBgX19jb25zdHJ1Y3RgIG9mIGBT aGEyNTZIYXNoZXJgOgpgYGBwaHAKY2xhc3MgU2hhMjU2SGFzaGVyCnsKICAgIHB1YmxpYyBmdW5j dGlvbiBfX2luamVjdCgKICAgICAgICBwcml2YXRlIE51bWJlcnNTaGlmdGVyICRudW1iZXJzU2hp ZnRlcgogICAgKSB7fQoKICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdChpbnQgJHRpbWVz ID0gMSkKICAgIHsKICAgICAgICAvLwogICAgfQp9CmBgYApXZSBjYW4gdHJ5IHRvIGJ1aWxkIGl0 LCBiZWNhdXNlIGNvbnN0cnVjdG9yIGhhcyBhbGwgcGFyYW1ldGVycyBhcyBvcHRpb25hbC4KYE51 bWJlcnNTaGlmdGVyYCAtIHJlYWwgY2xhc3MsIHdoaWNoIGNvdWxkIGJlIGluc3RhbnRpYXRlZCBh bmQgYnVpbHQsIHNvIGl0ICB3aWxsIGJlIGRvbmUgYW5kIFBIUCB3aWxsIGluamVjdCBpdCBpbnRv IG91ciBoYXNoZXIuCgojIyBCYWNrd2FyZCBJbmNvbXBhdGlibGUgQ2hhbmdlcwpDb2RlIHdpbGwg Z2V0IGJyb2tlbiBpZjoKMS4gQ2xhc3MgaGFkIGBfX2luamVjdGAgbWV0aG9kOwoyLiBGdW5jdGlv biBgcmVnaXN0ZXJfZGVwZW5kZW5jeV9iaW5kaW5nc2Agd2FzIGRlY2xhcmVkOwozLiBBbnkgb2Yg dGhlIGNsYXNzZXMgdXNlZCBieSBDb250YWluZXIgd2VyZSBkZWNsYXJlZC4KCiMjIEltcGFjdCBP biBQZXJmb3JtYW5jZQotIEZvciBhbHJlYWR5IHdvcmtpbmcgY29kZSBpbiBmYWN0IHRoZXJlIGlz IG5vIGltcGFjdC4gRXZlcnkgdGltZSBgX19jb25zdHJ1Y3RgIGNhbGxlZCwgIGVtcHR5IGBfX2lu amVjdGAgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIHJpZ2h0IGJlZm9yZS4gVGh1cywgaXQgaXMgaW5z aWduaWZpY2FudC4KLSBGb3IgbmV3IGNvZGUsIHdoaWNoIHdvdWxkIHVzZSBkZXBlbmRlbmNpZXMg aGFuZGxlciBhdCBmdWxsIHBvd2VyLCBjcmVhdGluZyBvYmplY3RzIHdpbGwgc2xvdyBkb3duIGEg bGl0dGxlIGJpdCAgKHRpbWUgdG8gZmluZCBvdXQgYmluZGluZ3MgYW5kIHJlc29sdmluZyBzdHJh dGVnaWVzKS4gSW4gZWl0aGVyIHdheSwgc3BlZWQgZGVwZW5kcyBvbiBpbXBsZW1lbnRhdGlvbi4K IyMgUHJvcG9zZWQgUEhQIFZlcnNpb24ocykKUEhQIDgKIyMgSW1wbGVtZW50YXRpb24gYmx1ZXBy aW50ClNpZ25hdHVyZSBvZiBgcmVnaXN0ZXJfZGVwZW5kZW5jeV9iaW5kaW5nc2AgZnVuY3Rpb246 CmBgYHBocApmdW5jdGlvbiByZWdpc3Rlcl9kZXBlbmRlbmN5X2JpbmRpbmdzKERlcGVuZGVuY2ll c1Byb3ZpZGVyICRwcm92aWRlcikgIAp7ICAKICAvLyAuLiAgCn0KYGBgCk5vdGUgdGhhdCB3ZSBz aG91bGQgYmUgYWJsZSB0byByZWdpc3RlciBkZXBlbmRlbmNpZXMgZnJvbSBtdWx0aXBsZSBwcm92 aWRlcnMuIEZvciBleGFtcGxlLCB0aGlyZCBwYXJ0eSBsaWJyYXJpZXMgbWlnaHQgYWxzbyB3YW50 IHRvIHVzZSBkZXBlbmRlbmNpZXMgY29udGFpbmVyIGZvciB0aGVpciB3b3JrLiBUaHVzLCBhbGwg ZGVwZW5kZW5jeSByZWNvcmRlcnMgc2hvdWxkIHdvcmsgd2l0aCB0aGUgc2FtZSBzdG9yYWdlIG9m IGRlcGVuZGVuY2llcy4KCmBEZXBlbmRlbmNpZXNQcm92aWRlcmAgbXVzdCBiZSBhbiBpbnRlcmZh Y2UgY2xhc3MgbGlrZSBzbzoKYGBgcGhwCmludGVyZmFjZSBEZXBlbmRlbmNpZXNQcm92aWRlciAg CnsgIAogICAgcHVibGljIGZ1bmN0aW9uIHJlZ2lzdGVyQmluZGluZ3NUbyhEZXBlbmRlbmNpZXNS ZWNvcmRlciAkcmVjb3JkZXIpOiB2b2lkOyAgCn0KYGBgCkRlcGVuZGVuY2llcyBSZWNvcmRlcjoK YGBgcGhwCmNsYXNzIERlcGVuZGVuY2llc1JlY29yZGVyIGltcGxlbWVudHMgUmVnaXN0ZXJzQ29u dGFpbmVyRGVwZW5kZW5jaWVzCnsKICAgIHByaXZhdGUgRGVwZW5kZW5jaWVzQ29udGFpbmVyICRj b250YWluZXI7CgogICAgLy8gZGVsZWdhdGUgYWxsIHJlZ2lzdHJhdGlvbnMgdG8gY29udGFpbmVy Cn0KYGBgCkludGVyZmFjZXMgZm9yIHJlZ2lzdGVyaW5nIGJpbmRpbmdzOgpgYGBwaHAKaW50ZXJm YWNlIFJlZ2lzdGVyc0NvbnRhaW5lckRlcGVuZGVuY2llcyBleHRlbmRzIFJlZ2lzdGVyc0NvbnRl eHR1YWxCaW5kaW5ncywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBSZWdpc3RlcnNHbG9iYWxEZXBlbmRlbmN5QmluZGluZ3MsCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlcnNEZXBlbmRlbmN5RXh0 ZW5zaW9ucywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBSZWdpc3RlckRlcGVuZGVuY2llc0FzTGltaXRlZAp7Cgp9CgppbnRlcmZhY2UgUmVnaXN0ZXJz Q29udGV4dHVhbEJpbmRpbmdzICAKeyAgCiAgICBwdWJsaWMgZnVuY3Rpb24gd2hlbihzdHJpbmcg Li4uJGNvbmNyZXRlcyk6IENvbnRleHR1YWxCaW5kaW5nQnVpbGRlcjsgIAp9CgppbnRlcmZhY2Ug UmVnaXN0ZXJzR2xvYmFsRGVwZW5kZW5jeUJpbmRpbmdzICAKeyAgCiAgICBwdWJsaWMgZnVuY3Rp b24gYmluZChzdHJpbmcgJGFic3RyYWN0LCBzdHJpbmcgJGNvbmNyZXRlKTogdm9pZDsgIAogIAog ICAgcHVibGljIGZ1bmN0aW9uIGRlZmluZUNyZWF0aW5nU3RyYXRlZ3koc3RyaW5nICRjbGFzc05h bWUsIFxDbG9zdXJlICRob3cpOiB2b2lkOyAgCn0KCmludGVyZmFjZSBSZWdpc3RlcnNEZXBlbmRl bmN5RXh0ZW5zaW9ucyAgCnsgIAogICAgcHVibGljIGZ1bmN0aW9uIGV4dGVuZChzdHJpbmcgJGNv bmNyZXRlLCBcQ2xvc3VyZSAkaG93KTogdm9pZDsgIAp9CgppbnRlcmZhY2UgUmVnaXN0ZXJEZXBl bmRlbmNpZXNBc0xpbWl0ZWQgIAp7ICAKICAgIHB1YmxpYyBmdW5jdGlvbiBzaW5nbGV0b24oc3Ry aW5nLi4uICRjb25jcmV0ZSk6IHZvaWQ7ICAKfQpgYGAKTWFpbiBEZXBlbmRlbmNpZXMgQ29udGFp bmVyOgpgYGBwaHAKY2xhc3MgRGVwZW5kZW5jaWVzQ29udGFpbmVyIGltcGxlbWVudHMgUmVnaXN0 ZXJzQ29udGFpbmVyRGVwZW5kZW5jaWVzICAKeyAgCiAgcHJpdmF0ZSBDb250ZXh0dWFsRGVwZW5k ZW5jeUJpbmRpbmdzQ29udGFpbmVyICRjb250ZXh0dWFsQmluZGluZ3NDb250YWluZXI7ICAKICBw cml2YXRlIEdsb2JhbERlcGVuZGVuY3lCaW5kaW5nc0NvbnRhaW5lciAkZ2xvYmFsQmluZGluZ3ND b250YWluZXI7ICAKICBwcml2YXRlIERlcGVuZGVuY3lFeHRlbnNpb25zQ29udGFpbmVyICRkZXBl bmRlbmN5RXh0ZW5zaW9uc0NvbnRhaW5lcjsgIAogIHByaXZhdGUgTGltaXRlZERlcGVuZGVuY2ll c0luc3BlY3RvciAkbGltaXRlZERlcGVuZGVuY2llc0NvbnRhaW5lcjsgIAogIAogIC8vIHdvcmsg d2l0aCBzbWFsbGVyIGNvbnRhaW5lcnMsIHJlc29sdmUgZGVwZW5kZW5jaWVzIGZvciBjbGFzc2Vz LCAuLi4KfQpgYGAKU21hbGxlciBjb250YWluZXJzOgpgYGBwaHAKZmluYWwgY2xhc3MgQ29udGV4 dHVhbERlcGVuZGVuY3lCaW5kaW5nc0NvbnRhaW5lciBpbXBsZW1lbnRzIFJlZ2lzdGVyc0NvbnRl eHR1YWxCaW5kaW5ncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIFxQc3JcQ29udGFpbmVyXENvbnRhaW5lckludGVyZmFjZQp7CiAg ICAvLwp9CgpmaW5hbCBjbGFzcyBHbG9iYWxEZXBlbmRlbmN5QmluZGluZ3NDb250YWluZXIgaW1w bGVtZW50cyBSZWdpc3RlcnNHbG9iYWxEZXBlbmRlbmN5QmluZGluZ3MsCiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxQc3JcQ29udGFpbmVy XENvbnRhaW5lckludGVyZmFjZQp7Cgp9CgoKZmluYWwgY2xhc3MgRGVwZW5kZW5jeUV4dGVuc2lv bnNDb250YWluZXIgaW1wbGVtZW50cyBSZWdpc3RlcnNEZXBlbmRlbmN5RXh0ZW5zaW9ucywgCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXFBzclxD b250YWluZXJcQ29udGFpbmVySW50ZXJmYWNlCnsKICAgIC8vCn0KCmZpbmFsIGNsYXNzIExpbWl0 ZWREZXBlbmRlbmNpZXNJbnNwZWN0b3IgaW1wbGVtZW50cyBSZWdpc3RlckRlcGVuZGVuY2llc0Fz TGltaXRlZAp7CiAgICBwdWJsaWMgZnVuY3Rpb24gaXNTaW5nbGV0b24oc3RyaW5nICRjb25jcmV0 ZSkKICAgIHsKICAgIAogICAgfQogICAgLy8KfQpgYGAKQ29udGV4dHVhbCBCaW5kaW5nIEJ1aWxk ZXI6CmBgYHBocAppbnRlcmZhY2UgQ29udGV4dHVhbEJpbmRpbmdCdWlsZGVyICAKeyAgCiAgcHVi bGljIGZ1bmN0aW9uIG5lZWRzKHN0cmluZyAkYWJzdHJhY3QpOiBDb250ZXh0dWFsQ2xhc3NCaW5k aW5nQnVpbGRlcjsgIAogIAogIHB1YmxpYyBmdW5jdGlvbiBuZWVkc1ZhcmlhZGljKHN0cmluZyAk dHlwZU5hbWUpOiBDb250ZXh0dWFsVmFyaWFkaWNUeXBlQmluZGluZ0J1aWxkZXI7ICAKICAKICBw dWJsaWMgZnVuY3Rpb24gYXNrc0dpdmUoLi4uJGtleXNWYWx1ZXMpOiBzdGF0aWM7ICAKICAKICBw dWJsaWMgZnVuY3Rpb24gYXNrc1Jlc29sdmUoXENsb3N1cmUgLi4uJHJlc29sdmVycyk6IHN0YXRp YzsgIAp9CmBgYApDb250ZXh0dWFsIENsYXNzIEJpbmRpbmcgQnVpbGRlcjoKYGBgcGhwCmludGVy ZmFjZSBDb250ZXh0dWFsQ2xhc3NCaW5kaW5nQnVpbGRlciAgCnsgIAogICAgcHVibGljIGZ1bmN0 aW9uIHByb3ZpZGUoc3RyaW5nICRjb25jcmV0ZSk6IHZvaWQ7ICAKCiAgICBwdWJsaWMgZnVuY3Rp b24gZ2l2ZSgkdmFsdWUpOiB2b2lkOwoKICAgIHB1YmxpYyBmdW5jdGlvbiByZXNvbHZlKFxDbG9z dXJlICRzdHJhdGVneSk6IHZvaWQ7ICAKfQpgYGAKQ29udGV4dHVhbCBWYXJpYWRpYyBUeXBlIEJp bmRpbmcgQnVpbGRlcjoKYGBgcGhwCmludGVyZmFjZSBDb250ZXh0dWFsVmFyaWFkaWNUeXBlQmlu ZGluZ0J1aWxkZXIKewogICAgcHVibGljIGZ1bmN0aW9uIGdpdmUoYXJyYXkgJHZhbHVlcyk6IHZv aWQ7CgogICAgcHVibGljIGZ1bmN0aW9uIHJlc29sdmUoXENsb3N1cmUgJHN0cmF0ZWd5KTogdm9p ZDsKfQpgYGAKIyMgUmVxdWlyZW1lbnRzClRvIGltcGxlbWVudCBzdWNoIGZ1bmN0aW9uYWxpdHks IHRoZSBuZXh0IGZlYXR1cmVzIGFyZSByZXF1aXJlZDoKLSBOYW1lZCBhcmd1bWVudHMgKFtSRkNd KGh0dHBzOi8vd2lraS5waHAubmV0L3JmYy9uYW1lZF9wYXJhbXMpKTsKCgo= --0000000000001e8ffe05abf0c870--