From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jonathan Leech-Pepin Subject: Export to Texinfo Date: Thu, 19 Jul 2012 20:29:00 -0400 Message-ID: Mime-Version: 1.0 Content-Type: multipart/mixed; boundary=e0cb4e6ffa3588ed0104c537fbb4 Return-path: Received: from eggs.gnu.org ([208.118.235.92]:54237) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Ss15c-0003aL-24 for emacs-orgmode@gnu.org; Thu, 19 Jul 2012 20:29:05 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Ss15a-0002sV-MN for emacs-orgmode@gnu.org; Thu, 19 Jul 2012 20:29:03 -0400 Received: from mail-we0-f169.google.com ([74.125.82.169]:55327) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Ss15a-0002sE-2w for emacs-orgmode@gnu.org; Thu, 19 Jul 2012 20:29:02 -0400 Received: by weys10 with SMTP id s10so2677643wey.0 for ; Thu, 19 Jul 2012 17:29:00 -0700 (PDT) List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org To: Org Mode Mailing List --e0cb4e6ffa3588ed0104c537fbb4 Content-Type: text/plain; charset=ISO-8859-1 Hello all, Over the last few days I've been working on implementing an Org -> Texinfo exporter based on the new e-latex exporter. It is not yet able to generate all the expected contents for export towards an Info file, however it does create enough to successfully export and read through Info. Current it can do the following: - Create the initial preamble. - Create the menu and detailed menus in the =@top= node. - Create the menus within each node for child menus. - Descriptions for menus are pulled from the :DESCRIPTION: property of the headline. - Convert *bold*, /italic/, ~verbatim~ and =code= markup to @strong{}, @emph{}, @verb{} and @code{} respectively. - Convert lisp code blocks to @lisp and other code blocks to @example. - Create ordered and unordered lists. - Turn descriptive lists into @table. - Export verbatim tables to @verbatim blocks. - Export standard tables as @multitable, using the largest cell in each column to define the output (outputs a string of a's equal to the lengths). - Exports comments and comment blocks - Exports Quote and example blocks, including labels for quotes. - Footnotes are generated inline using @footnote{}. - The copyright (@copying) section can be created by generating a headline with the property :copying: set to t (or any non-nil value). It will be exported at the correct place in the .texi file and will not be duplicated in the tree. Children of this headline will export within the block, so I would recommend not including any (it will likely result in a very odd section and errors in makeinfo). - Export to .texi (org-e-texinfo-export-to-texinfo) and compile to info (org-e-texinfo-export-to-info). It will not however provide an error buffer if it fails. That is also on the list of additions. It will not do the following: - Export table.el tables, they are currently being exported using the e-latex code, so they will cause issues with makeinfo. I do plan to look at that in the future - There is no provision for indices, limiting usefulness in cross-referencing. - Additionally descriptive lists cannot be exported to @ftable or @vtable - Sub and super-scripts are still being exported via latex processing. This likely will also fail in makeinfo. - There is no #+attr_texinfo or #+TEXINFO: for arbitrary snippets or for passing features to tables/blocks. I'm not sure exactly how to hook these in and would need a pointer in the right direction to do so. - While looking over the reference document for the new exporter I realized I could likely use pre- and post- processing hooks to simplify some of the export process. I have to look into this as well. - The largest issue perhaps: There is no method to create @kbd{} and @key{} commands on export. If anyone has any suggestions how these might be achieved (perhaps looking for a prefix in =code=?) I would greatly appreciate it. There are a few limitations to what will successfully be exported: - Headlines cannot contain any of the following symbols: periods, commas, colons or parentheses. This is a limitation of texinfo and will result in errors when running makeinfo. Semi-colons will export however. - Headlines cannot contain markup or links. Once again these are forbidden in texinfo and will cause failures. - I've currently only been looking at creating valid info output, output to PDF or HTML via makeinfo may fail. It can also be found at https://github.com/jleechpe/org-mode/blob/texinfo/contrib/lisp/org-e-texinfo.el Regards, Jon --e0cb4e6ffa3588ed0104c537fbb4 Content-Type: application/octet-stream; name="org-e-texinfo.el" Content-Disposition: attachment; filename="org-e-texinfo.el" Content-Transfer-Encoding: base64 X-Attachment-Id: f_h4uiyo630 Ozs7IG9yZy1lLXRleGluZm8uZWwgLS0tIFRleGluZm8gQmFjay1FbmQgRm9yIE9yZyBFeHBvcnQg RW5naW5lCgo7OyBBdXRob3I6IEpvbmF0aGFuIExlZWNoLVBlcGluIDxqb25hdGhhbi5sZWVjaHBl cGluIGF0IGdtYWlsIGRvdCBjb20KOzsgS2V5d29yZHM6IG91dGxpbmVzLCBoeXBlcm1lZGlhLCBj YWxlbmRhciwgd3AKCjs7IFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJl ZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cjs7IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5Cjs7IHRoZSBGcmVlIFNv ZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yCjs7 IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgo7OyBUaGlzIHByb2dyYW0gaXMg ZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKOzsgYnV0IFdJ VEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YK OzsgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAg U2VlIHRoZQo7OyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoK OzsgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UKOzsgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0 cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCgo7OzsgQ29tbWVudGFyeToKOzsKOzsgVGhpcyBs aWJyYXJ5IGltcGxlbWVudHMgYSBUZXhpbmZvIGJhY2stZW5kIGZvciBPcmcgZ2VuZXJpYyBleHBv cnRlci4KOzsKOzsgVG8gdGVzdCBpdCwgcnVuCjs7Cjs7ICAgTS06IChvcmctZXhwb3J0LXRvLWJ1 ZmZlciAnZS10ZXhpbmZvICIqVGVzdCBlLXRleGluZm8qIikgUkVUCjs7Cjs7IGluIGFuIG9yZy1t b2RlIGJ1ZmZlciB0aGVuIHN3aXRjaCB0byB0aGUgYnVmZmVyIHRvIHNlZSB0aGUgVGV4aW5mbwo7 OyBleHBvcnQuICBTZWUgY29udHJpYi9saXNwL29yZy1leHBvcnQuZWwgZm9yIG1vcmUgZGV0YWls cyBvbiBob3cKOzsgdGhpcyBleHBvcnRlciB3b3Jrcy4KOzsKOzsgSXQgaW50cm9kdWNlcyBmaXZl IG5ldyBidWZmZXIga2V5d29yZHM6ICJURVhJTkZPX0NMQVNTIiwKOzsgIlRFWElORk9fRklMRU5B TUUiLCAiVEVYSU5GT19IRUFERVIiLCAiU1VCVElUTEUiIGFuZCAiU1VCQVVUSE9SIi4KCjs7OyBD b2RlOgoKKGV2YWwtd2hlbi1jb21waWxlIChyZXF1aXJlICdjbCkpCihyZXF1aXJlICdvcmctZXhw b3J0KQoKKGRlZnZhciBvcmd0YmwtZXhwLXJlZ2V4cCkKCgwKOzs7IERlZmluZSBCYWNrLUVuZAoK KGRlZnZhciBvcmctZS10ZXhpbmZvLXRyYW5zbGF0ZS1hbGlzdAogICcoKGJhYmVsLWNhbGwgLiBv cmctZS10ZXhpbmZvLWJhYmVsLWNhbGwpCiAgICAoYm9sZCAuIG9yZy1lLXRleGluZm8tYm9sZCkK ICAgIChjZW50ZXItYmxvY2sgLiBvcmctZS10ZXhpbmZvLWNlbnRlci1ibG9jaykKICAgIChjbG9j ayAuIG9yZy1lLXRleGluZm8tY2xvY2spCiAgICAoY29kZSAuIG9yZy1lLXRleGluZm8tY29kZSkK ICAgIChjb21tZW50IC4gb3JnLWUtdGV4aW5mby1jb21tZW50KQogICAgKGNvbW1lbnQtYmxvY2sg LiBvcmctZS10ZXhpbmZvLWNvbW1lbnQtYmxvY2spCiAgICAoZHJhd2VyIC4gb3JnLWUtdGV4aW5m by1kcmF3ZXIpCiAgICAoZHluYW1pYy1ibG9jayAuIG9yZy1lLXRleGluZm8tZHluYW1pYy1ibG9j aykKICAgIChlbnRpdHkgLiBvcmctZS10ZXhpbmZvLWVudGl0eSkKICAgIChleGFtcGxlLWJsb2Nr IC4gb3JnLWUtdGV4aW5mby1leGFtcGxlLWJsb2NrKQogICAgKGV4cG9ydC1ibG9jayAuIG9yZy1l LXRleGluZm8tZXhwb3J0LWJsb2NrKQogICAgKGV4cG9ydC1zbmlwcGV0IC4gb3JnLWUtdGV4aW5m by1leHBvcnQtc25pcHBldCkKICAgIChmaXhlZC13aWR0aCAuIG9yZy1lLXRleGluZm8tZml4ZWQt d2lkdGgpCiAgICAoZm9vdG5vdGUtZGVmaW5pdGlvbiAuIG9yZy1lLXRleGluZm8tZm9vdG5vdGUt ZGVmaW5pdGlvbikKICAgIChmb290bm90ZS1yZWZlcmVuY2UgLiBvcmctZS10ZXhpbmZvLWZvb3Ru b3RlLXJlZmVyZW5jZSkKICAgIChoZWFkbGluZSAuIG9yZy1lLXRleGluZm8taGVhZGxpbmUpCiAg ICAoaG9yaXpvbnRhbC1ydWxlIC4gb3JnLWUtdGV4aW5mby1ob3Jpem9udGFsLXJ1bGUpCiAgICAo aW5saW5lLWJhYmVsLWNhbGwgLiBvcmctZS10ZXhpbmZvLWlubGluZS1iYWJlbC1jYWxsKQogICAg KGlubGluZS1zcmMtYmxvY2sgLiBvcmctZS10ZXhpbmZvLWlubGluZS1zcmMtYmxvY2spCiAgICAo aW5saW5ldGFzayAuIG9yZy1lLXRleGluZm8taW5saW5ldGFzaykKICAgIChpdGFsaWMgLiBvcmct ZS10ZXhpbmZvLWl0YWxpYykKICAgIChpdGVtIC4gb3JnLWUtdGV4aW5mby1pdGVtKQogICAgKGtl eXdvcmQgLiBvcmctZS10ZXhpbmZvLWtleXdvcmQpCiAgICAobGF0ZXgtZW52aXJvbm1lbnQgLiBv cmctZS10ZXhpbmZvLWxhdGV4LWVudmlyb25tZW50KQogICAgKGxhdGV4LWZyYWdtZW50IC4gb3Jn LWUtdGV4aW5mby1sYXRleC1mcmFnbWVudCkKICAgIChsaW5lLWJyZWFrIC4gb3JnLWUtdGV4aW5m by1saW5lLWJyZWFrKQogICAgKGxpbmsgLiBvcmctZS10ZXhpbmZvLWxpbmspCiAgICAobWFjcm8g LiBvcmctZS10ZXhpbmZvLW1hY3JvKQogICAgKHBhcmFncmFwaCAuIG9yZy1lLXRleGluZm8tcGFy YWdyYXBoKQogICAgKHBsYWluLWxpc3QgLiBvcmctZS10ZXhpbmZvLXBsYWluLWxpc3QpCiAgICAo cGxhaW4tdGV4dCAuIG9yZy1lLXRleGluZm8tcGxhaW4tdGV4dCkKICAgIChwbGFubmluZyAuIG9y Zy1lLXRleGluZm8tcGxhbm5pbmcpCiAgICAocHJvcGVydHktZHJhd2VyIC4gb3JnLWUtdGV4aW5m by1wcm9wZXJ0eS1kcmF3ZXIpCiAgICAocXVvdGUtYmxvY2sgLiBvcmctZS10ZXhpbmZvLXF1b3Rl LWJsb2NrKQogICAgKHF1b3RlLXNlY3Rpb24gLiBvcmctZS10ZXhpbmZvLXF1b3RlLXNlY3Rpb24p CiAgICAocmFkaW8tdGFyZ2V0IC4gb3JnLWUtdGV4aW5mby1yYWRpby10YXJnZXQpCiAgICAoc2Vj dGlvbiAuIG9yZy1lLXRleGluZm8tc2VjdGlvbikKICAgIChzcGVjaWFsLWJsb2NrIC4gb3JnLWUt dGV4aW5mby1zcGVjaWFsLWJsb2NrKQogICAgKHNyYy1ibG9jayAuIG9yZy1lLXRleGluZm8tc3Jj LWJsb2NrKQogICAgKHN0YXRpc3RpY3MtY29va2llIC4gb3JnLWUtdGV4aW5mby1zdGF0aXN0aWNz LWNvb2tpZSkKICAgIChzdHJpa2UtdGhyb3VnaCAuIG9yZy1lLXRleGluZm8tc3RyaWtlLXRocm91 Z2gpCiAgICAoc3Vic2NyaXB0IC4gb3JnLWUtdGV4aW5mby1zdWJzY3JpcHQpCiAgICAoc3VwZXJz Y3JpcHQgLiBvcmctZS10ZXhpbmZvLXN1cGVyc2NyaXB0KQogICAgKHRhYmxlIC4gb3JnLWUtdGV4 aW5mby10YWJsZSkKICAgICh0YWJsZS1jZWxsIC4gb3JnLWUtdGV4aW5mby10YWJsZS1jZWxsKQog ICAgKHRhYmxlLXJvdyAuIG9yZy1lLXRleGluZm8tdGFibGUtcm93KQogICAgKHRhcmdldCAuIG9y Zy1lLXRleGluZm8tdGFyZ2V0KQogICAgKHRlbXBsYXRlIC4gb3JnLWUtdGV4aW5mby10ZW1wbGF0 ZSkKICAgICh0aW1lc3RhbXAgLiBvcmctZS10ZXhpbmZvLXRpbWVzdGFtcCkKICAgICh1bmRlcmxp bmUgLiBvcmctZS10ZXhpbmZvLXVuZGVybGluZSkKICAgICh2ZXJiYXRpbSAuIG9yZy1lLXRleGlu Zm8tdmVyYmF0aW0pCiAgICAodmVyc2UtYmxvY2sgLiBvcmctZS10ZXhpbmZvLXZlcnNlLWJsb2Nr KSkKICAiQWxpc3QgYmV0d2VlbiBlbGVtZW50IG9yIG9iamVjdCB0eXBlcyBhbmQgdHJhbnNsYXRv cnMuIikKCihkZWZjb25zdCBvcmctZS10ZXhpbmZvLW9wdGlvbnMtYWxpc3QKICAnKCg6dGV4aW5m by1maWxlbmFtZSAiVEVYSU5GT19GSUxFTkFNRSIgbmlsIG9yZy1lLXRleGluZm8tZmlsZW5hbWUg dCkKICAgICg6dGV4aW5mby1jbGFzcyAiVEVYSU5GT19DTEFTUyIgbmlsIG9yZy1lLXRleGluZm8t ZGVmYXVsdC1jbGFzcyB0KQogICAgKDp0ZXhpbmZvLWhlYWRlciAiVEVYSU5GT19IRUFERVIiIG5p bCBuaWwgbmV3bGluZSkKICAgICg6c3VidGl0bGUgIlNVQlRJVExFIiBuaWwgbmlsIG5ld2xpbmUp CiAgICAoOnN1YmF1dGhvciAiU1VCQVVUSE9SIiBuaWwgbmlsIG5ld2xpbmUpKQogICJBbGlzdCBi ZXR3ZWVuIFRleGluZm8gZXhwb3J0IHByb3BlcnRpZXMgYW5kIHdheXMgdG8gc2V0IHRoZW0uClNl ZSBgb3JnLWV4cG9ydC1vcHRpb25zLWFsaXN0JyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUK c3RydWN0dXJlIG9mIHRoZSB2YWx1ZXMuCgpTVUJBVVRIT1IgYW5kIFNVQlRJVExFIGFyZSBmb3Ig dGhlIGluY2x1c2lvbiBvZiBhZGRpdGlvbmFsIGF1dGhvcgphbmQgdGl0bGUgaW5mb3JtYXRpb24g YmV5b25kIHRoZSBpbml0aWFsIHZhcmlhYmxlLiIpCgoKDAo7OzsgSW50ZXJuYWwgVmFyaWFibGVz CgoMCjs7OyBVc2VyIENvbmZpZ3VyYWJsZSBWYXJpYWJsZXMKCihkZWZncm91cCBvcmctZXhwb3J0 LWUtdGV4aW5mbyBuaWwKICAiT3B0aW9ucyBmb3IgZXhwb3J0aW5nIE9yZyBtb2RlIGZpbGVzIHRv IFRleGluZm8uIgogIDp0YWcgIk9yZyBFeHBvcnQgVGV4aW5mbyIKICA6Z3JvdXAgJ29yZy1leHBv cnQpCgoKOzs7OyBQcmVhbWJsZQoKKGRlZmN1c3RvbSBvcmctZS10ZXhpbmZvLWZpbGVuYW1lIG5p bAogICJEZWZhdWx0IGZpbGVuYW1lIGZvciB0ZXhpbmZvIG91dHB1dC4iCiAgOmdyb3VwICdvcmct ZXhwb3J0LWUtdGV4aW5mbwogIDp0eXBlICcoc3RyaW5nIDp0YWcgIkV4cG9ydCBGaWxlbmFtZSIp KQoKKGRlZmN1c3RvbSBvcmctZS10ZXhpbmZvLWRlZmF1bHQtY2xhc3MgImluZm8iCiAgIlRoZSBk ZWZhdWx0IFRleGluZm8gY2xhc3MuIgogIDpncm91cCAnb3JnLWV4cG9ydC1lLXRleGluZm8KICA6 dHlwZSAnKHN0cmluZyA6dGFnICJUZXhpbmZvIGNsYXNzIikpCgooZGVmY3VzdG9tIG9yZy1lLXRl eGluZm8tY2xhc3NlcwogICcoKCJpbmZvIgogICAgICJcXGlucHV0IHRleGluZm8gICAgQGMgLSot IHRleGluZm8gLSotIgogICAgICgiQGNoYXB0ZXIgJXMiIC4gIkB1bm51bWJlcmVkICVzIikKICAg ICAoIkBzZWN0aW9uICVzIiAuICJAdW5udW1iZXJlZHNlYyAlcyIpCiAgICAgKCJAc3Vic2VjdGlv biAlcyIgLiAiQHVubnVtYmVyZWRzdWJzZWMgJXMiKQogICAgICgiQHN1YnN1YnNlY3Rpb24gJXMi IC4gIkB1bm51bWJlcmVkc3Vic3Vic2VjICVzIikpKQogICJBbGlzdCBvZiBUZXhpbmZvIGNsYXNz ZXMgYW5kIGFzc29jaWF0ZWQgaGVhZGVyIGFuZCBzdHJ1Y3R1cmUuCklmICMrVGV4aW5mb19DTEFT UyBpcyBzZXQgaW4gdGhlIGJ1ZmZlciwgdXNlIGl0cyB2YWx1ZSBhbmQgdGhlCmFzc29jaWF0ZWQg aW5mb3JtYXRpb24uICBIZXJlIGlzIHRoZSBzdHJ1Y3R1cmUgb2YgZWFjaCBjZWxsOgoKICBcKGNs YXNzLW5hbWUKICAgIGhlYWRlci1zdHJpbmcKICAgIFwobnVtYmVyZWQtc2VjdGlvbiAuIHVubnVt YmVyZWQtc2VjdGlvblwpCiAgICAuLi5cKQoKVGhlIHNlY3Rpb25pbmcgc3RydWN0dXJlCi0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLQoKVGhlIHNlY3Rpb25pbmcgc3RydWN0dXJlIG9mIHRoZSBjbGFz cyBpcyBnaXZlbiBieSB0aGUgZWxlbWVudHMKZm9sbG93aW5nIHRoZSBoZWFkZXIgc3RyaW5nLiAg Rm9yIGVhY2ggc2VjdGlvbmluZyBsZXZlbCwgYSBudW1iZXIKb2Ygc3RyaW5ncyBpcyBzcGVjaWZp ZWQuICBBICVzIGZvcm1hdHRlciBpcyBtYW5kYXRvcnkgaW4gZWFjaApzZWN0aW9uIHN0cmluZyBh bmQgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgdGl0bGUgb2YgdGhlIHNlY3Rpb24uCgpJbnN0ZWFk IG9mIGEgY29ucyBjZWxsIFwobnVtYmVyZWQgLiB1bm51bWJlcmVkXCksIHlvdSBjYW4gYWxzbwpw cm92aWRlIGEgbGlzdCBvZiAyIG9yIDQgZWxlbWVudHMsCgogIFwobnVtYmVyZWQtb3BlbiBudW1i ZXJlZC1jbG9zZVwpCgpvcgoKICBcKG51bWJlcmVkLW9wZW4gbnVtYmVyZWQtY2xvc2UgdW5udW1i ZXJlZC1vcGVuIHVubnVtYmVyZWQtY2xvc2VcKQoKcHJvdmlkaW5nIG9wZW5pbmcgYW5kIGNsb3Np bmcgc3RyaW5ncyBmb3IgYSBUZXhpbmZvIGVudmlyb25tZW50CnRoYXQgc2hvdWxkIHJlcHJlc2Vu dCB0aGUgZG9jdW1lbnQgc2VjdGlvbi4gIFRoZSBvcGVuaW5nIGNsYXVzZQpzaG91bGQgaGF2ZSBh ICVzIHRvIHJlcHJlc2VudCB0aGUgc2VjdGlvbiB0aXRsZS4KCkluc3RlYWQgb2YgYSBsaXN0IG9m IHNlY3Rpb25pbmcgY29tbWFuZHMsIHlvdSBjYW4gYWxzbyBzcGVjaWZ5CmEgZnVuY3Rpb24gbmFt ZS4gIFRoYXQgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2l0aCB0d28KcGFyYW1ldGVycywgdGhl IFwocmVkdWNlZCkgbGV2ZWwgb2YgdGhlIGhlYWRsaW5lLCBhbmQgYSBwcmVkaWNhdGUKbm9uLW5p bCB3aGVuIHRoZSBoZWFkbGluZSBzaG91bGQgYmUgbnVtYmVyZWQuICBJdCBtdXN0IHJldHVybgph IGZvcm1hdCBzdHJpbmcgaW4gd2hpY2ggdGhlIHNlY3Rpb24gdGl0bGUgd2lsbCBiZSBhZGRlZC4i CiAgOmdyb3VwICdvcmctZXhwb3J0LWUtdGV4aW5mbwogIDp0eXBlICcocmVwZWF0CgkgIChsaXN0 IChzdHJpbmcgOnRhZyAiVGV4aW5mbyBjbGFzcyIpCgkJKHN0cmluZyA6dGFnICJUZXhpbmZvIGhl YWRlciIpCgkJKHJlcGVhdCA6dGFnICJMZXZlbHMiIDppbmxpbmUgdAoJCQkoY2hvaWNlCgkJCSAo Y29ucyA6dGFnICJIZWFkaW5nIgoJCQkgICAgICAgKHN0cmluZyA6dGFnICIgIG51bWJlcmVkIikK CQkJICAgICAgIChzdHJpbmcgOnRhZyAidW5udW1iZXJlZCIpKQoJCQkgKGxpc3QgOnRhZyAiRW52 aXJvbm1lbnQiCgkJCSAgICAgICAoc3RyaW5nIDp0YWcgIk9wZW5pbmcgICAobnVtYmVyZWQpIikK CQkJICAgICAgIChzdHJpbmcgOnRhZyAiQ2xvc2luZyAgIChudW1iZXJlZCkiKQoJCQkgICAgICAg KHN0cmluZyA6dGFnICJPcGVuaW5nICh1bm51bWJlcmVkKSIpCgkJCSAgICAgICAoc3RyaW5nIDp0 YWcgIkNsb3NpbmcgKHVubnVtYmVyZWQpIikpCgkJCSAoZnVuY3Rpb24gOnRhZyAiSG9vayBjb21w dXRpbmcgc2VjdGlvbmluZyIpKSkpKSkKCgo7Ozs7IEhlYWRsaW5lCgooZGVmY3VzdG9tIG9yZy1l LXRleGluZm8tZm9ybWF0LWhlYWRsaW5lLWZ1bmN0aW9uIG5pbAogICJGdW5jdGlvbiB0byBmb3Jt YXQgaGVhZGxpbmUgdGV4dC4KClRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2l0aCA1IGFy Z3VtZW50czoKVE9ETyAgICAgIHRoZSB0b2RvIGtleXdvcmQgKHN0cmluZyBvciBuaWwpLgpUT0RP LVRZUEUgdGhlIHR5cGUgb2YgdG9kbyAoc3ltYm9sOiBgdG9kbycsIGBkb25lJywgbmlsKQpQUklP UklUWSAgdGhlIHByaW9yaXR5IG9mIHRoZSBoZWFkbGluZSAoaW50ZWdlciBvciBuaWwpClRFWFQg ICAgICB0aGUgbWFpbiBoZWFkbGluZSB0ZXh0IChzdHJpbmcpLgpUQUdTICAgICAgdGhlIHRhZ3Mg YXMgYSBsaXN0IG9mIHN0cmluZ3MgKGxpc3Qgb2Ygc3RyaW5ncyBvciBuaWwpLgoKVGhlIGZ1bmN0 aW9uIHJlc3VsdCB3aWxsIGJlIHVzZWQgaW4gdGhlIHNlY3Rpb24gZm9ybWF0IHN0cmluZy4KCkFz IGFuIGV4YW1wbGUsIG9uZSBjb3VsZCBzZXQgdGhlIHZhcmlhYmxlIHRvIHRoZSBmb2xsb3dpbmcs IGluCm9yZGVyIHRvIHJlcHJvZHVjZSB0aGUgZGVmYXVsdCBzZXQtdXA6CgpcKGRlZnVuIG9yZy1l LXRleGluZm8tZm9ybWF0LWhlYWRsaW5lICh0b2RvIHRvZG8tdHlwZSBwcmlvcml0eSB0ZXh0IHRh Z3MpCiAgXCJEZWZhdWx0IGZvcm1hdCBmdW5jdGlvbiBmb3IgYW4gaGVhZGxpbmUuXCIKICBcKGNv bmNhdCAod2hlbiB0b2RvCiAgICAgICAgICAgIFwoZm9ybWF0IFwiXFxcXHRleHRiZntcXFxcdGV4 dHNje1xcXFx0ZXh0c2Z7JXN9fX0gXCIgdG9kbykpCgkgIFwod2hlbiBwcmlvcml0eQogICAgICAg ICAgICBcKGZvcm1hdCBcIlxcXFxmcmFtZWJveHtcXFxcIyVjfSBcIiBwcmlvcml0eSkpCgkgIHRl eHQKCSAgXCh3aGVuIHRhZ3MKICAgICAgICAgICAgXChmb3JtYXQgXCJcXFxcaGZpbGx7fVxcXFx0 ZXh0c2N7JXN9XCIKICAgICAgICAgICAgICBcKG1hcGNvbmNhdCAnaWRlbnRpdHkgdGFncyBcIjpc IikpKSkiCiAgOmdyb3VwICdvcmctZXhwb3J0LWUtdGV4aW5mbwogIDp0eXBlICdmdW5jdGlvbikK Cgo7Ozs7IEZvb3Rub3Rlcwo7Owo7OyBGb290bm90ZXMgYXJlIGluc2VydGVkIGRpcmVjdGx5Cgo7 Ozs7IFRpbWVzdGFtcHMKCihkZWZjdXN0b20gb3JnLWUtdGV4aW5mby1hY3RpdmUtdGltZXN0YW1w LWZvcm1hdCAiQGVtcGh7JXN9IgogICJBIHByaW50ZiBmb3JtYXQgc3RyaW5nIHRvIGJlIGFwcGxp ZWQgdG8gYWN0aXZlIHRpbWVzdGFtcHMuIgogIDpncm91cCAnb3JnLWV4cG9ydC1lLXRleGluZm8K ICA6dHlwZSAnc3RyaW5nKQoKKGRlZmN1c3RvbSBvcmctZS10ZXhpbmZvLWluYWN0aXZlLXRpbWVz dGFtcC1mb3JtYXQgIkBlbXBoeyVzfSIKICAiQSBwcmludGYgZm9ybWF0IHN0cmluZyB0byBiZSBh cHBsaWVkIHRvIGluYWN0aXZlIHRpbWVzdGFtcHMuIgogIDpncm91cCAnb3JnLWV4cG9ydC1lLXRl eGluZm8KICA6dHlwZSAnc3RyaW5nKQoKKGRlZmN1c3RvbSBvcmctZS10ZXhpbmZvLWRpYXJ5LXRp bWVzdGFtcC1mb3JtYXQgIkBlbXBoeyVzfSIKICAiQSBwcmludGYgZm9ybWF0IHN0cmluZyB0byBi ZSBhcHBsaWVkIHRvIGRpYXJ5IHRpbWVzdGFtcHMuIgogIDpncm91cCAnb3JnLWV4cG9ydC1lLXRl eGluZm8KICA6dHlwZSAnc3RyaW5nKQoKOzs7OyBMaW5rcwoKKGRlZmN1c3RvbSBvcmctZS10ZXhp bmZvLWxpbmstd2l0aC11bmtub3duLXBhdGgtZm9ybWF0ICJAaW5kaWNhdGV1cmx7JXN9IgogICJG b3JtYXQgc3RyaW5nIGZvciBsaW5rcyB3aXRoIHVua25vd24gcGF0aCB0eXBlLiIKICA6Z3JvdXAg J29yZy1leHBvcnQtZS10ZXhpbmZvCiAgOnR5cGUgJ3N0cmluZykKCgo7Ozs7IFRhYmxlcwoKKGRl ZmN1c3RvbSBvcmctZS10ZXhpbmZvLXRhYmxlcy12ZXJiYXRpbSBuaWwKICAiV2hlbiBub24tbmls LCB0YWJsZXMgYXJlIGV4cG9ydGVkIHZlcmJhdGltLiIKICA6Z3JvdXAgJ29yZy1leHBvcnQtZS10 ZXhpbmZvCiAgOnR5cGUgJ2Jvb2xlYW4pCgooZGVmY3VzdG9tIG9yZy1lLXRleGluZm8tdGFibGUt c2NpZW50aWZpYy1ub3RhdGlvbiAiJXNcXCwoJXMpIgogICJGb3JtYXQgc3RyaW5nIHRvIGRpc3Bs YXkgbnVtYmVycyBpbiBzY2llbnRpZmljIG5vdGF0aW9uLgpUaGUgZm9ybWF0IHNob3VsZCBoYXZl IFwiJXNcIiB0d2ljZSwgZm9yIG1hbnRpc3NhIGFuZCBleHBvbmVudApcKGkuZS4gXCIlc1xcXFx0 aW1lczEwXnslc31cIikuCgpXaGVuIG5pbCwgbm8gdHJhbnNmb3JtYXRpb24gaXMgbWFkZS4iCiAg Omdyb3VwICdvcmctZXhwb3J0LWUtdGV4aW5mbwogIDp0eXBlICcoY2hvaWNlCgkgIChzdHJpbmcg OnRhZyAiRm9ybWF0IHN0cmluZyIpCgkgIChjb25zdCA6dGFnICJObyBmb3JtYXR0aW5nIikpKQoK KGRlZmN1c3RvbSBvcmctZS10ZXhpbmZvLWRlZi10YWJsZS1tYXJrdXAgIkBzYW1wIgogICJEZWZh dWx0IHNldHRpbmcgZm9yIEB0YWJsZSBlbnZpcm9ubWVudHMuIikKCjs7OzsgVGV4dCBtYXJrdXAK CihkZWZjdXN0b20gb3JnLWUtdGV4aW5mby10ZXh0LW1hcmt1cC1hbGlzdCAnKChib2xkIC4gIkBz dHJvbmd7JXN9IikKCQkJCQkgICAoY29kZSAuIGNvZGUpCgkJCQkJICAgKGl0YWxpYyAuICJAZW1w aHslc30iKQoJCQkJCSAgICh2ZXJiYXRpbSAuIHZlcmIpCgkJCQkJICAgKGNvbW1lbnQgLiAiQGMg JXMiKSkKICAiQWxpc3Qgb2YgVGV4aW5mbyBleHByZXNzaW9ucyB0byBjb252ZXJ0IHRleHQgbWFy a3VwLgoKVGhlIGtleSBtdXN0IGJlIGEgc3ltYm9sIGFtb25nIGBib2xkJywgYGNvZGUnLCBgaXRh bGljJywKYHN0cmlrZS10aHJvdWdoJywgYHVuZGVybGluZScgYW5kIGB2ZXJiYXRpbScuICBUaGUg dmFsdWUgaXMKYSBmb3JtYXR0aW5nIHN0cmluZyB0byB3cmFwIGZvbnRpZmllZCB0ZXh0IHdpdGgu CgpWYWx1ZSBjYW4gYWxzbyBiZSBzZXQgdG8gdGhlIGZvbGxvd2luZyBzeW1ib2xzOiBgdmVyYicg YW5kCmBwcm90ZWN0ZWR0ZXh0dHQnLiAgRm9yIHRoZSBmb3JtZXIsIE9yZyB3aWxsIHVzZSBcIlxc dmVyYlwiIHRvCmNyZWF0ZSBhIGZvcm1hdCBzdHJpbmcgYW5kIHNlbGVjdCBhIGRlbGltaXRlciBj aGFyYWN0ZXIgdGhhdAppc24ndCBpbiB0aGUgc3RyaW5nLiAgRm9yIHRoZSBsYXR0ZXIsIE9yZyB3 aWxsIHVzZSBcIlxcdGV4dHR0XCIKdG8gdHlwZXNldCBhbmQgdHJ5IHRvIHByb3RlY3Qgc3BlY2lh bCBjaGFyYWN0ZXJzLgoKSWYgbm8gYXNzb2NpYXRpb24gY2FuIGJlIGZvdW5kIGZvciBhIGdpdmVu IG1hcmt1cCwgdGV4dCB3aWxsIGJlCnJldHVybmVkIGFzLWlzLiIKICA6Z3JvdXAgJ29yZy1leHBv cnQtZS10ZXhpbmZvCiAgOnR5cGUgJ2FsaXN0CiAgOm9wdGlvbnMgJyhib2xkIGNvZGUgaXRhbGlj IHZlcmJhdGltIGNvbW1lbnQpKQoKCjs7OzsgRHJhd2VycwoKKGRlZmN1c3RvbSBvcmctZS10ZXhp bmZvLWZvcm1hdC1kcmF3ZXItZnVuY3Rpb24gbmlsCiAgIkZ1bmN0aW9uIGNhbGxlZCB0byBmb3Jt YXQgYSBkcmF3ZXIgaW4gVGV4aW5mbyBjb2RlLgoKVGhlIGZ1bmN0aW9uIG11c3QgYWNjZXB0IHR3 byBwYXJhbWV0ZXJzOgogIE5BTUUgICAgICB0aGUgZHJhd2VyIG5hbWUsIGxpa2UgXCJMT0dCT09L XCIKICBDT05URU5UUyAgdGhlIGNvbnRlbnRzIG9mIHRoZSBkcmF3ZXIuCgpUaGUgZnVuY3Rpb24g c2hvdWxkIHJldHVybiB0aGUgc3RyaW5nIHRvIGJlIGV4cG9ydGVkLgoKRm9yIGV4YW1wbGUsIHRo ZSB2YXJpYWJsZSBjb3VsZCBiZSBzZXQgdG8gdGhlIGZvbGxvd2luZyBmdW5jdGlvbgppbiBvcmRl ciB0byBtaW1pYyBkZWZhdWx0IGJlaGF2aW91cjoKClwoZGVmdW4gb3JnLWUtdGV4aW5mby1mb3Jt YXQtZHJhd2VyLWRlZmF1bHQgXChuYW1lIGNvbnRlbnRzXCkKICBcIkZvcm1hdCBhIGRyYXdlciBl bGVtZW50IGZvciBUZXhpbmZvIGV4cG9ydC5cIgogIGNvbnRlbnRzXCkiCiAgOmdyb3VwICdvcmct ZXhwb3J0LWUtdGV4aW5mbwogIDp0eXBlICdmdW5jdGlvbikKCgo7Ozs7IElubGluZXRhc2tzCgoo ZGVmY3VzdG9tIG9yZy1lLXRleGluZm8tZm9ybWF0LWlubGluZXRhc2stZnVuY3Rpb24gbmlsCiAg IkZ1bmN0aW9uIGNhbGxlZCB0byBmb3JtYXQgYW4gaW5saW5ldGFzayBpbiBUZXhpbmZvIGNvZGUu CgpUaGUgZnVuY3Rpb24gbXVzdCBhY2NlcHQgc2l4IHBhcmFtZXRlcnM6CiAgVE9ETyAgICAgIHRo ZSB0b2RvIGtleXdvcmQsIGFzIGEgc3RyaW5nCiAgVE9ETy1UWVBFIHRoZSB0b2RvIHR5cGUsIGEg c3ltYm9sIGFtb25nIGB0b2RvJywgYGRvbmUnIGFuZCBuaWwuCiAgUFJJT1JJVFkgIHRoZSBpbmxp bmV0YXNrIHByaW9yaXR5LCBhcyBhIHN0cmluZwogIE5BTUUgICAgICB0aGUgaW5saW5ldGFzayBu YW1lLCBhcyBhIHN0cmluZy4KICBUQUdTICAgICAgdGhlIGlubGluZXRhc2sgdGFncywgYXMgYSBs aXN0IG9mIHN0cmluZ3MuCiAgQ09OVEVOVFMgIHRoZSBjb250ZW50cyBvZiB0aGUgaW5saW5ldGFz aywgYXMgYSBzdHJpbmcuCgpUaGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0aGUgc3RyaW5nIHRv IGJlIGV4cG9ydGVkLgoKRm9yIGV4YW1wbGUsIHRoZSB2YXJpYWJsZSBjb3VsZCBiZSBzZXQgdG8g dGhlIGZvbGxvd2luZyBmdW5jdGlvbgppbiBvcmRlciB0byBtaW1pYyBkZWZhdWx0IGJlaGF2aW91 cjoKClwoZGVmdW4gb3JnLWUtdGV4aW5mby1mb3JtYXQtaW5saW5ldGFzayBcKHRvZG8gdHlwZSBw cmlvcml0eSBuYW1lIHRhZ3MgY29udGVudHNcKQpcIkZvcm1hdCBhbiBpbmxpbmUgdGFzayBlbGVt ZW50IGZvciBUZXhpbmZvIGV4cG9ydC5cIgogIFwobGV0ICgoZnVsbC10aXRsZQoJIFwoY29uY2F0 CgkgIFwod2hlbiB0b2RvCiAgICAgICAgICAgIFwoZm9ybWF0IFwiXFxcXHRleHRiZntcXFxcdGV4 dHNme1xcXFx0ZXh0c2N7JXN9fX0gXCIgdG9kbykpCgkgIFwod2hlbiBwcmlvcml0eSAoZm9ybWF0 IFwiXFxcXGZyYW1lYm94e1xcXFwjJWN9IFwiIHByaW9yaXR5KSkKCSAgdGl0bGUKCSAgXCh3aGVu IHRhZ3MKICAgICAgICAgICAgXChmb3JtYXQgXCJcXFxcaGZpbGx7fVxcXFx0ZXh0c2N7OiVzOn1c IgogICAgICAgICAgICAgICAgICAgIFwobWFwY29uY2F0ICdpZGVudGl0eSB0YWdzIFwiOlwiKSkp KSkKICAgIFwoZm9ybWF0IChjb25jYXQgXCJcXFxcYmVnaW57Y2VudGVyfVxcblwiCgkJICAgIFwi XFxcXGZib3h7XFxuXCIKCQkgICAgXCJcXFxcYmVnaW57bWluaXBhZ2V9W2Ndey42XFxcXHRleHR3 aWR0aH1cXG5cIgoJCSAgICBcIiVzXFxuXFxuXCIKCQkgICAgXCJcXFxccnVsZVsuOGVtXXtcXFxc dGV4dHdpZHRofXsycHR9XFxuXFxuXCIKCQkgICAgXCIlc1wiCgkJICAgIFwiXFxcXGVuZHttaW5p cGFnZX19XCIKCQkgICAgXCJcXFxcZW5ke2NlbnRlcn1cIikKCSAgICBmdWxsLXRpdGxlIGNvbnRl bnRzKSkiCiAgOmdyb3VwICdvcmctZXhwb3J0LWUtdGV4aW5mbwogIDp0eXBlICdmdW5jdGlvbikK Cgo7Ozs7IFNyYyBibG9ja3MKOzsKOzsgU3JjIEJsb2NrcyBhcmUgZXhhbXBsZSBibG9ja3MsIGV4 Y2VwdCBmb3IgTElTUAoKOzs7OyBQbGFpbiB0ZXh0CgooZGVmY3VzdG9tIG9yZy1lLXRleGluZm8t cXVvdGVzCiAgJygoInF1b3RlcyIKICAgICAoIlxcKFxccy1cXHxbWyhdXFx8XlxcKVwiIiAuICJg YCIpCiAgICAgKCJcXChcXFMtXFwpXCIiIC4gIicnIikKICAgICAoIlxcKFxccy1cXHwoXFx8Xlxc KSciIC4gImAiKSkpCiAgIkFsaXN0IGZvciBxdW90ZXMgdG8gdXNlIHdoZW4gY29udmVydGluZyBl bmdsaXNoIGRvdWJsZS1xdW90ZXMuCgpUaGUgQ0FSIG9mIGVhY2ggaXRlbSBpbiB0aGlzIGFsaXN0 IGlzIHRoZSBsYW5ndWFnZSBjb2RlLgpUaGUgQ0RSIG9mIGVhY2ggaXRlbSBpbiB0aGlzIGFsaXN0 IGlzIGEgbGlzdCBvZiB0aHJlZSBDT05TOgotIHRoZSBmaXJzdCBDT05TIGRlZmluZXMgdGhlIG9w ZW5pbmcgcXVvdGU7Ci0gdGhlIHNlY29uZCBDT05TIGRlZmluZXMgdGhlIGNsb3NpbmcgcXVvdGU7 Ci0gdGhlIGxhc3QgQ09OUyBkZWZpbmVzIHNpbmdsZSBxdW90ZXMuCgpGb3IgZWFjaCBpdGVtIGlu IGEgQ09OUywgdGhlIGZpcnN0IHN0cmluZyBpcyBhIHJlZ2V4cApmb3IgYWxsb3dlZCBjaGFyYWN0 ZXJzIGJlZm9yZS9hZnRlciB0aGUgcXVvdGUsIHRoZSBzZWNvbmQKc3RyaW5nIGRlZmluZXMgdGhl IHJlcGxhY2VtZW50IHN0cmluZyBmb3IgdGhpcyBxdW90ZS4iCiAgOmdyb3VwICdvcmctZXhwb3J0 LWUtdGV4aW5mbwogIDp0eXBlICcobGlzdAoJICAoY29ucyA6dGFnICJPcGVuaW5nIHF1b3RlIgoJ CShzdHJpbmcgOnRhZyAiUmVnZXhwIGZvciBjaGFyIGJlZm9yZSIpCgkJKHN0cmluZyA6dGFnICJS ZXBsYWNlbWVudCBxdW90ZSAgICAgIikpCgkgIChjb25zIDp0YWcgIkNsb3NpbmcgcXVvdGUiCgkJ KHN0cmluZyA6dGFnICJSZWdleHAgZm9yIGNoYXIgYWZ0ZXIgIikKCQkoc3RyaW5nIDp0YWcgIlJl cGxhY2VtZW50IHF1b3RlICAgICAiKSkKCSAgKGNvbnMgOnRhZyAiU2luZ2xlIHF1b3RlIgoJCShz dHJpbmcgOnRhZyAiUmVnZXhwIGZvciBjaGFyIGJlZm9yZSIpCgkJKHN0cmluZyA6dGFnICJSZXBs YWNlbWVudCBxdW90ZSAgICAgIikpKSkKCgo7Ozs7IENvbXBpbGF0aW9uCgooZGVmY3VzdG9tIG9y Zy1lLXRleGluZm8taW5mby1wcm9jZXNzCiAgJygibWFrZWluZm8gJWYiKQogICJDb21tYW5kcyB0 byBwcm9jZXNzIGEgdGV4aW5mbyBmaWxlIHRvIGFuIElORk8gZmlsZS4KVGhpcyBpcyBsaXN0IG9m IHN0cmluZ3MsIGVhY2ggb2YgdGhlbSB3aWxsIGJlIGdpdmVuIHRvIHRoZSBzaGVsbAphcyBhIGNv bW1hbmQuICAlZiBpbiB0aGUgY29tbWFuZCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBmdWxsCmZp bGUgbmFtZSwgJWIgYnkgdGhlIGZpbGUgYmFzZSBuYW1lIFwoaS5lIHdpdGhvdXQgZXh0ZW5zaW9u KSBhbmQKJW8gYnkgdGhlIGJhc2UgZGlyZWN0b3J5IG9mIHRoZSBmaWxlLiIKICA6Z3JvdXAgJ29y Zy1leHBvcnQtdGV4aW5mbwogIDp0eXBlICcocmVwZWF0IDp0YWcgIlNoZWxsIGNvbW1hbmQgc2Vx dWVuY2UiCgkJIChzdHJpbmcgOnRhZyAiU2hlbGwgY29tbWFuZCIpKSkKCgwKOzs7IEludGVybmFs IEZ1bmN0aW9ucwoKKGRlZnVuIG9yZy1lLXRleGluZm8tLWZpbmQtY29weWluZyAoaW5mbykKICAi IgogIChsZXQgKGNvcHlpbmcpCiAgICAob3JnLWVsZW1lbnQtbWFwIChwbGlzdC1nZXQgaW5mbyA6 cGFyc2UtdHJlZSkgJ2hlYWRsaW5lCgkJICAgICAobGFtYmRhIChyZWYpCgkJICAgICAgICh3aGVu IChvcmctZWxlbWVudC1wcm9wZXJ0eSA6Y29weWluZyByZWYpCgkJCSAocHVzaCByZWYgY29weWlu ZykpKSBpbmZvICd0KQogICAgOzsgUmV0cmlldmUgdGhlIHNpbmdsZSBlbnRyeQogICAgKGNhciBj b3B5aW5nKSkpCgooZGVmdW4gb3JnLWUtdGV4aW5mby0tZmluZC12ZXJiLXNlcGFyYXRvciAocykK ICAiUmV0dXJuIGEgY2hhcmFjdGVyIG5vdCB1c2VkIGluIHN0cmluZyBTLgpUaGlzIGlzIHVzZWQg dG8gY2hvb3NlIGEgc2VwYXJhdG9yIGZvciBjb25zdHJ1Y3RzIGxpa2UgXFx2ZXJiLiIKICAobGV0 ICgobGwgIn4sLi8/Oyc6XCJ8IUAjJV4mLV89K2FiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6QUJD REVGR0hJSktMTU5PUFFSU1RVVldYWVo8PigpW117fSIpKQogICAgKGxvb3AgZm9yIGMgYWNyb3Nz IGxsCgkgIHdoZW4gKG5vdCAoc3RyaW5nLW1hdGNoIChyZWdleHAtcXVvdGUgKGNoYXItdG8tc3Ry aW5nIGMpKSBzKSkKCSAgcmV0dXJuIChjaGFyLXRvLXN0cmluZyBjKSkpKQoKKGRlZnVuIG9yZy1l LXRleGluZm8tLW1ha2Utb3B0aW9uLXN0cmluZyAob3B0aW9ucykKICAiUmV0dXJuIGEgY29tbWEg c2VwYXJhdGVkIHN0cmluZyBvZiBrZXl3b3JkcyBhbmQgdmFsdWVzLgpPUFRJT05TIGlzIGFuIGFs aXN0IHdoZXJlIHRoZSBrZXkgaXMgdGhlIG9wdGlvbnMga2V5d29yZCBhcwphIHN0cmluZywgYW5k IHRoZSB2YWx1ZSBhIGxpc3QgY29udGFpbmluZyB0aGUga2V5d29yZCB2YWx1ZSwgb3IKbmlsLiIK ICAobWFwY29uY2F0IChsYW1iZGEgKHBhaXIpCgkgICAgICAgKGNvbmNhdCAoZmlyc3QgcGFpcikK CQkgICAgICAgKHdoZW4gKD4gKGxlbmd0aCAoc2Vjb25kIHBhaXIpKSAwKQoJCQkgKGNvbmNhdCAi PSIgKHNlY29uZCBwYWlyKSkpKSkKCSAgICAgb3B0aW9ucwoJICAgICAiLCIpKQoKKGRlZnVuIG9y Zy1lLXRleGluZm8tLXF1b3RhdGlvbi1tYXJrcyAodGV4dCBpbmZvKQogICJFeHBvcnQgcXVvdGF0 aW9uIG1hcmtzIHVzaW5nIGAgYW5kICcgYXMgdGhlIG1hcmtlcnMuClRFWFQgaXMgYSBzdHJpbmcg Y29udGFpbmluZyBxdW90YXRpb24gbWFya3MgdG8gYmUgcmVwbGFjZWQuICBJTkZPCmlzIGEgcGxp c3QgdXNlZCBhcyBhIGNvbW11bmljYXRpb24gY2hhbm5lbC4iCiAgKG1hcGMgKGxhbWJkYShsKQoJ ICAobGV0ICgoc3RhcnQgMCkpCgkgICAgKHdoaWxlIChzZXRxIHN0YXJ0IChzdHJpbmctbWF0Y2gg KGNhciBsKSB0ZXh0IHN0YXJ0KSkKCSAgICAgIChsZXQgKChuZXctcXVvdGUgKGNvbmNhdCAobWF0 Y2gtc3RyaW5nIDEgdGV4dCkgKGNkciBsKSkpKQoJCShzZXRxIHRleHQgKHJlcGxhY2UtbWF0Y2gg bmV3LXF1b3RlICB0IHQgdGV4dCkpKSkpKQoJKGNkciBvcmctZS10ZXhpbmZvLXF1b3RlcykpCiAg dGV4dCkKCihkZWZ1biBvcmctZS10ZXhpbmZvLS10ZXh0LW1hcmt1cCAodGV4dCBtYXJrdXApCiAg IkZvcm1hdCBURVhUIGRlcGVuZGluZyBvbiBNQVJLVVAgdGV4dCBtYXJrdXAuClNlZSBgb3JnLWUt dGV4aW5mby10ZXh0LW1hcmt1cC1hbGlzdCcgZm9yIGRldGFpbHMuIgogIChsZXQgKChmbXQgKGNk ciAoYXNzcSBtYXJrdXAgb3JnLWUtdGV4aW5mby10ZXh0LW1hcmt1cC1hbGlzdCkpKSkKICAgIChj b25kCiAgICAgOzsgTm8gZm9ybWF0IHN0cmluZzogUmV0dXJuIHJhdyB0ZXh0LgogICAgICgobm90 IGZtdCkgdGV4dCkKICAgICAoKGVxICd2ZXJiIGZtdCkKICAgICAgKGxldCAoKHNlcGFyYXRvciAo b3JnLWUtdGV4aW5mby0tZmluZC12ZXJiLXNlcGFyYXRvciB0ZXh0KSkpCgkoY29uY2F0ICJAdmVy YnsiIHNlcGFyYXRvciB0ZXh0IHNlcGFyYXRvciAifSIpKSkKICAgICAoKGVxICdjb2RlIGZtdCkK ICAgICAgKGxldCAoKHN0YXJ0IDApCgkgICAgKHJ0biAiIikKCSAgICBjaGFyKQoJKHdoaWxlIChz dHJpbmctbWF0Y2ggIltAe31dIiB0ZXh0KQoJICAoc2V0cSBjaGFyIChtYXRjaC1zdHJpbmcgMCB0 ZXh0KSkKCSAgKGlmICg+IChtYXRjaC1iZWdpbm5pbmcgMCkgMCkKCSAgICAgIChzZXRxIHJ0biAo Y29uY2F0IHJ0biAoc3Vic3RyaW5nIHRleHQgMCAobWF0Y2gtYmVnaW5uaW5nIDApKSkpKQoJICAo c2V0cSB0ZXh0IChzdWJzdHJpbmcgdGV4dCAoMSsgKG1hdGNoLWJlZ2lubmluZyAwKSkpKQoJICAo c2V0cSBjaGFyIChjb25jYXQgIkAiIGNoYXIpCgkJcnRuIChjb25jYXQgcnRuIGNoYXIpKSkKCShz ZXRxIHRleHQgKGNvbmNhdCBydG4gdGV4dCkKCSAgICAgIGZtdCAiQGNvZGV7JXN9IikKCShmb3Jt YXQgZm10IHRleHQpKSkKICAgICA7OyBFbHNlIHVzZSBmb3JtYXQgc3RyaW5nLgogICAgICh0IChm b3JtYXQgZm10IHRleHQpKSkpKQoKOzs7OyBNZW51IGNyZWF0aW9uCgooZGVmdW4gb3JnLWUtdGV4 aW5mby0tYnVpbGQtbWVudSAodHJlZSBsZXZlbCBpbmZvICZvcHRpb25hbCBkZXRhaWxlZCkKICAi IgogIChsZXQgKChtZW51IChvcmctZS10ZXhpbmZvLS1nZW5lcmF0ZS1tZW51LWxpc3QgdHJlZSBs ZXZlbCBpbmZvKSkpCiAgICAoY29uZAogICAgIChkZXRhaWxlZAogICAgICA7OyBMb29waW5nIGlz IGRvbmUgc2VwYXJhdGVseQogICAgICAoc2V0cSB0ZXh0LW1lbnUgKG9yZy1lLXRleGluZm8tLWdl bmVyYXRlLWRldGFpbGVkIG1lbnUgbGV2ZWwgaW5mbykpKQogICAgICh0CiAgICAgIChzZXRxIHRl eHQtbWVudSAob3JnLWUtdGV4aW5mby0tZ2VuZXJhdGUtbWVudS1pdGVtcyBtZW51IGluZm8pKSkp CiAgICAod2hlbiB0ZXh0LW1lbnUKICAgICAgKHNldHEgb3V0cHV0IChvcmctZS10ZXhpbmZvLS1m b3JtYXQtbWVudSB0ZXh0LW1lbnUpKQogICAgICAobWFwY29uY2F0ICdpZGVudGl0eSBvdXRwdXQg IlxuIikpKSkKCihkZWZ1biBvcmctZS10ZXhpbmZvLS1nZW5lcmF0ZS1kZXRhaWxlZCAobWVudSBs ZXZlbCBpbmZvKQogICIiCiAgOzsgRXhwb3J0IGNsYXNzIGRlZmluaXRpb24gaGFzIDIgZGVzY3Jp cHRpdmUgbGluZXMsIHRoaXMgb21pdHMgdGhlbQogIDs7IHRoZW4gY2FsY3VsYXRlcyBob3cgbWFu eSBsZXZlbHMgb2YgaGVhZGxpbmVzIGFyZSB1c2VkIGZvciBUT0MvTWVudS4KICAoc2V0cSBtYXgt ZGVwdGggKHBsaXN0LWdldCBpbmZvIDpoZWFkbGluZS1sZXZlbHMpKQogICh3aGVuICg+IG1heC1k ZXB0aCBsZXZlbCkKICAgIChsb29wIGZvciBoZWFkbGluZSBpbiBtZW51IGFwcGVuZAoJICAobGV0 KiAoKHRpdGxlIChvcmctZS10ZXhpbmZvLS1tZW51LWhlYWRsaW5lcyBoZWFkbGluZSBpbmZvKSkK CQkgKHN1Ymxpc3QgKG9yZy1lLXRleGluZm8tLWdlbmVyYXRlLW1lbnUtbGlzdAoJCQkgICBoZWFk bGluZSAoMSsgbGV2ZWwpIGluZm8pKQoJCSAoc3VibWVudSAoaWYgKG9yZy1lLXRleGluZm8tLWdl bmVyYXRlLW1lbnUtaXRlbXMgc3VibGlzdCBpbmZvKQoJCQkgICAgICAoYXBwZW5kIChsaXN0IHRp dGxlKQoJCQkJICAgICAgKG9yZy1lLXRleGluZm8tLWdlbmVyYXRlLW1lbnUtaXRlbXMgc3VibGlz dCBpbmZvKSkKCQkJICAgICduaWwpKQoJCSA7OyBSZWN1cnNpb24KCQkgKHJlY3Vyc2lvbiAob3Jn LWUtdGV4aW5mby0tZ2VuZXJhdGUtZGV0YWlsZWQgc3VibGlzdCAoMSsgbGV2ZWwpIGluZm8pKQoJ CSApCgkgICAgKHNldHEgcmVjdXJzaW9uIChhcHBlbmQgc3VibWVudSByZWN1cnNpb24pKQoJICAg IHJlY3Vyc2lvbikpKSkKCihkZWZ1biBvcmctZS10ZXhpbmZvLS1nZW5lcmF0ZS1tZW51LWxpc3Qg KHRyZWUgbGV2ZWwgaW5mbykKICAiR2VuZXJhdGUgdGhlIGxpc3Qgb2YgaGVhZGxpbmVzIHRoYXQg YXJlIHdpdGhpbiBhIGdpdmVuIGxldmVsCm9mIHRoZSB0cmVlIGZvciBmdXJ0aGVyIGZvcm1hdHRp bmcuCgpUUkVFIGlzIHRoZSBwYXJzZS10cmVlIGNvbnRhaW5pbmcgdGhlIGhlYWRsaW5lcy4gIExF VkVMIGlzIHRoZQpoZWFkbGluZSBsZXZlbCB0byBnZW5lcmF0ZSBhIGxpc3Qgb2YuICBJTkZPIGlz IGEgcGxpc3QgaG9sZGluZwpjb250ZXh0dWFsIGluZm9ybWF0aW9uLiIKICAobGV0IChzZXEpCiAg ICAob3JnLWVsZW1lbnQtbWFwCiAgICAgdHJlZSAnaGVhZGxpbmUKICAgICAobGFtYmRhIChyZWYp CiAgICAgICAod2hlbiAob3JnLWVsZW1lbnQtcHJvcGVydHkgOmxldmVsIHJlZikKCSAoaWYgKGFu ZCAoZXEgbGV2ZWwgKG9yZy1lbGVtZW50LXByb3BlcnR5IDpsZXZlbCByZWYpKQoJCSAgOzsgRG8g bm90IHRha2Ugbm90ZSBvZiBmb290bm90ZXMgb3IgY29weWluZyBoZWFkbGluZXMKCQkgIChub3Qg KG9yZy1lbGVtZW50LXByb3BlcnR5IDpjb3B5aW5nIHJlZikpCgkJICAobm90IChvcmctZWxlbWVu dC1wcm9wZXJ0eSA6Zm9vdG5vdGUtc2VjdGlvbi1wIHJlZikpKQoJICAgICAocHVzaCByZWYgc2Vx KSkpKSkKICAgIDs7IFJldHVybiB0aGUgbGlzdCBvZiBoZWFkbGluZXMgKHJldmVyc2UgdG8gaGF2 ZSBpbiBhY3R1YWwgb3JkZXIpCiAgICAocmV2ZXJzZSBzZXEpKSkKCihkZWZ1biBvcmctZS10ZXhp bmZvLS1nZW5lcmF0ZS1tZW51LWl0ZW1zIChtZW51IGluZm8pCiAgIiIKICAKICAobG9vcCBmb3Ig aGVhZGxpbmUgaW4gbWVudSBjb2xsZWN0CgkobGV0KiAoKHRpdGxlIChvcmctZXhwb3J0LWRhdGEK CQkgICAgICAgKG9yZy1lbGVtZW50LXByb3BlcnR5IDp0aXRsZSBoZWFkbGluZSkgaW5mbykpCgkg ICAgICAgKGRlc2NyIChvcmctZXhwb3J0LWRhdGEKCQkgICAgICAgKG9yZy1lbGVtZW50LXByb3Bl cnR5IDpkZXNjcmlwdGlvbiBoZWFkbGluZSkgaW5mbykpCgkgICAgICAgKGxlbiAobGVuZ3RoIHRp dGxlKSkKCSAgICAgICAob3V0cHV0IChsaXN0IGxlbiB0aXRsZSBkZXNjcikpKQoJICBvdXRwdXQp KSkKCihkZWZ1biBvcmctZS10ZXhpbmZvLS1tZW51LWhlYWRsaW5lcyAobWVudSBpbmZvKQogICIi CiAgKHNldHEgdGl0bGUgKG9yZy1leHBvcnQtZGF0YQogICAgICAgICAgICAgICAob3JnLWVsZW1l bnQtcHJvcGVydHkgOnRpdGxlIGhlYWRsaW5lKSBpbmZvKSkKICAobGlzdCAwIHRpdGxlICduaWwp KQoKKGRlZnVuIG9yZy1lLXRleGluZm8tLWZvcm1hdC1tZW51ICh0ZXh0LW1lbnUpCiAgIiIKICA7 OyBGb3JtYXQgc2hvdWxkIGJlIGEgbGlzdCBvZiBtZW51IGVudHJpZXMKICA7OyAobGVuZ3RoIHRp dGxlIGRlc2NyaXB0aW9uKS4gIEZvciBoZWFkbGluZXMgdGhleSBzaG91bGQgYmUKICA7OyAobmls IHRpdGxlIG5pbCkuICBUaGlzIHBlcm1pdHMgcHJvcGVyIHNwYWNpbmcgc2V0dGluZ3MKICAobGV0 KiAoKGxlbmd0aHMgKG1hcGNhciAnY2FyIHRleHQtbWVudSkpCiAgICAgICAgIChtYXgtbGVuZ3Ro IChhcHBseSAnbWF4IGxlbmd0aHMpKSkKICAgIChzZXRxIG91dHB1dAogICAgICAgICAgKG1hcGNh ciAobGFtYmRhIChuYW1lKQogICAgICAgICAgICAgICAgICAgIChsZXQqICgodGl0bGUgKG50aCAx IG5hbWUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVzYyAobnRoIDIgbmFtZSkpCiAg ICAgICAgICAgICAgICAgICAgICAgICAgIChsZW5ndGggKG50aCAwIG5hbWUpKSkKICAgICAgICAg ICAgICAgICAgICAgIChpZiAoPiBsZW5ndGggMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAo Y29uY2F0ICIqICIgdGl0bGUgIjo6ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IChtYWtlLXN0cmluZyAoLSAoKyAzIG1heC1sZW5ndGgpIGxlbmd0aCkKICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/XHMpCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAoaWYgZGVzYwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIChjb25jYXQgZGVzYykpKQogICAgICAgICAgICAgICAgICAgICAgICAoY29uY2F0ICJcbiIg dGl0bGUgIlxuIikpKSkKCQkgIHRleHQtbWVudSkpCiAgICBvdXRwdXQpKQoKCgo7OzsgVGVtcGxh dGUKCihkZWZ1biBvcmctZS10ZXhpbmZvLXRlbXBsYXRlIChjb250ZW50cyBpbmZvKQogICJSZXR1 cm4gY29tcGxldGUgZG9jdW1lbnQgc3RyaW5nIGFmdGVyIFRleGluZm8gY29udmVyc2lvbi4KQ09O VEVOVFMgaXMgdGhlIHRyYW5zY29kZWQgY29udGVudHMgc3RyaW5nLiAgSU5GTyBpcyBhIHBsaXN0 CmhvbGRpbmcgZXhwb3J0IG9wdGlvbnMuIgogIChsZXQqICgodGl0bGUgKG9yZy1leHBvcnQtZGF0 YSAocGxpc3QtZ2V0IGluZm8gOnRpdGxlKSBpbmZvKSkKCSAoaW5mby1maWxlbmFtZSAob3IgKHBs aXN0LWdldCBpbmZvIDp0ZXhpbmZvLWZpbGVuYW1lKQoJCQkgICAgKGZpbGUtbmFtZS1ub25kaXJl Y3RvcnkKCQkJICAgICAob3JnLWV4cG9ydC1vdXRwdXQtZmlsZS1uYW1lICIuaW5mbyIpKSkpCgkg KGF1dGhvciAob3JnLWV4cG9ydC1kYXRhIChwbGlzdC1nZXQgaW5mbyA6YXV0aG9yKSBpbmZvKSkK CSAodGV4aW5mby1oZWFkZXIgKHBsaXN0LWdldCBpbmZvIDp0ZXhpbmZvLWhlYWRlcikpCgkgKHN1 YnRpdGxlIChwbGlzdC1nZXQgaW5mbyA6c3VidGl0bGUpKQoJIChzdWJhdXRob3IgKHBsaXN0LWdl dCBpbmZvIDpzdWJhdXRob3IpKQoJIChjbGFzcyAocGxpc3QtZ2V0IGluZm8gOnRleGluZm8tY2xh c3MpKQoJIChoZWFkZXIgKG50aCAxIChhc3NvYyBjbGFzcyBvcmctZS10ZXhpbmZvLWNsYXNzZXMp KSkKCSAoY29weWluZyAob3JnLWUtdGV4aW5mby0tZmluZC1jb3B5aW5nIGluZm8pKSkKICAgIChj b25jYXQKICAgICA7OyBIZWFkZXIKICAgICBoZWFkZXIgIlxuIgogICAgICJAYyAlKipzdGFydCBv ZiBoZWFkZXJcbiIKICAgICA7OyBGaWxlbmFtZSBhbmQgVGl0bGUKICAgICAiQHNldGZpbGVuYW1l ICIgaW5mby1maWxlbmFtZSAiXG4iCiAgICAgIkBzZXR0aXRsZSAiIHRpdGxlICJcbiIKICAgICAi XG5cbiIKICAgICAiQGMgVmVyc2lvbiBhbmQgQ29udGFjdCBJbmZvXG4iCiAgICAgIkBzZXQgQVVU SE9SICIgYXV0aG9yICJcbiIKCiAgICAgOzsgQWRkaXRpb25hbCBIZWFkZXIgT3B0aW9ucyBzZXQg YnkgYCMrVEVYSU5GT19IRUFERVIKICAgICAoaWYgdGV4aW5mby1oZWFkZXIKCSAoY29uY2F0ICJc biIKCQkgdGV4aW5mby1oZWFkZXIKCQkgIlxuIikpCiAgICAgCiAgICAgIkBjICUqKmVuZCBvZiBo ZWFkZXJcbiIKICAgICAiQGZpbmFsb3V0XG4iCiAgICAgIlxuXG4iCgogICAgIDs7IENvcHlpbmcK ICAgICAiQGNvcHlpbmdcbiIKICAgICA7OyBPbmx5IGV4cG9ydCB0aGUgY29udGVudCBvZiB0aGUg aGVhZGxpbmUsIGRvIG5vdCBuZWVkIHRoZQogICAgIDs7IGluaXRpYWwgaGVhZGxpbmUuCiAgICAg KG9yZy1leHBvcnQtZGF0YSAobnRoIDIgY29weWluZykgaW5mbykKICAgICAiQGVuZCBjb3B5aW5n XG4iCiAgICAgIlxuXG4iCgogICAgIDs7IFRpdGxlCiAgICAgIkB0aXRsZXBhZ2VcbiIKICAgICAi QHRpdGxlICIgdGl0bGUgIlxuXG4iCiAgICAgKGlmIHN1YnRpdGxlCgkgKGNvbmNhdCAiQHN1YnRp dGxlICIgc3VidGl0bGUgIlxuIikpCiAgICAgIkBhdXRob3IgIiBhdXRob3IgIlxuIgogICAgIChp ZiBzdWJhdXRob3IKCSAoY29uY2F0IHN1YmF1dGhvciAiXG4iKSkKICAgICAiXG4iCiAgICAgIkBj IFRoZSBmb2xsb3dpbmcgdHdvIGNvbW1hbmRzIHN0YXJ0IHRoZSBjb3B5cmlnaHQgcGFnZS5cbiIK ICAgICAiQHBhZ2VcbiIKICAgICAiQHZza2lwIDBwdCBwbHVzIDFmaWxsbFxuIgogICAgICJAaW5z ZXJ0Y29weWluZ1xuIgogICAgICJAZW5kIHRpdGxlcGFnZVxuXG4iCiAgICAgIkBjIE91dHB1dCB0 aGUgdGFibGUgb2YgY29udGVudHMgYXQgdGhlIGJlZ2lubmluZy5cbiIKICAgICAiQGNvbnRlbnRz XG5cbiIKCiAgICAgOzsgQ29uZmlndXJlIFRvcCBOb2RlIHdoZW4gbm90IGZvciBUZXgKICAgICAi QGlmbm90dGV4XG4iCiAgICAgIkBub2RlIFRvcFxuIgogICAgICJAdG9wICIgdGl0bGUgIiBNYW51 YWxcbiIKICAgICAiQGluc2VydGNvcHlpbmdcbiIKICAgICAiQGVuZCBpZm5vdHRleFxuXG4iCiAg ICAgCiAgICAgOzsgTWVudQogICAgICJAbWVudVxuIgogICAgIChvcmctZS10ZXhpbmZvLW1ha2Ut bWVudSBpbmZvICdtYWluKQogICAgICJcblxuIgogICAgIDs7IERldGFpbGVkIE1lbnUKICAgICAi QGRldGFpbG1lbnVcbiIKICAgICAiIC0tLSBUaGUgRGV0YWlsZWQgTm9kZSBMaXN0aW5nIC0tLVxu IgogICAgIChvcmctZS10ZXhpbmZvLW1ha2UtbWVudSBpbmZvICdkZXRhaWxlZCkKICAgICAiXG5c biIKICAgICAiQGVuZCBkZXRhaWxtZW51XG4iCiAgICAgIkBlbmQgbWVudVxuIgogICAgICJcblxu IgogICAgIAogICAgIDs7IERvY3VtZW50J3MgYm9keS4KICAgICBjb250ZW50cwogICAgICJcbiIK ICAgICA7OyBDcmVhdG9yLgogICAgIChsZXQgKChjcmVhdG9yLWluZm8gKHBsaXN0LWdldCBpbmZv IDp3aXRoLWNyZWF0b3IpKSkKICAgICAgIChjb25kCgkoKG5vdCBjcmVhdG9yLWluZm8pICIiKQoJ KChlcSBjcmVhdG9yLWluZm8gJ2NvbW1lbnQpCgkgKGZvcm1hdCAiQGMgJXNcbiIgKHBsaXN0LWdl dCBpbmZvIDpjcmVhdG9yKSkpCgkodCAoY29uY2F0IChwbGlzdC1nZXQgaW5mbyA6Y3JlYXRvcikg IlxuIikpKSkKICAgICA7OyBEb2N1bWVudCBlbmQuCiAgICAgIlxuQGJ5ZSIpKSkKCgoMCjs7OyBU cmFuc2NvZGUgRnVuY3Rpb25zCgo7Ozs7IEJhYmVsIENhbGwKOzsKOzsgQmFiZWwgQ2FsbHMgYXJl IGlnbm9yZWQuCgoKOzs7OyBCb2xkCgooZGVmdW4gb3JnLWUtdGV4aW5mby1ib2xkIChib2xkIGNv bnRlbnRzIGluZm8pCiAgIlRyYW5zY29kZSBCT0xEIGZyb20gT3JnIHRvIFRleGluZm8uCkNPTlRF TlRTIGlzIHRoZSB0ZXh0IHdpdGggYm9sZCBtYXJrdXAuICBJTkZPIGlzIGEgcGxpc3QgaG9sZGlu Zwpjb250ZXh0dWFsIGluZm9ybWF0aW9uLiIKICAob3JnLWUtdGV4aW5mby0tdGV4dC1tYXJrdXAg Y29udGVudHMgJ2JvbGQpKQoKCjs7OzsgQ2VudGVyIEJsb2NrCjs7Cjs7IENlbnRlciBibG9ja3Mg YXJlIGlnbm9yZWQKCgo7Ozs7IENsb2NrCgooZGVmdW4gb3JnLWUtdGV4aW5mby1jbG9jayAoY2xv Y2sgY29udGVudHMgaW5mbykKICAiVHJhbnNjb2RlIGEgQ0xPQ0sgZWxlbWVudCBmcm9tIE9yZyB0 byBUZXhpbmZvLgpDT05URU5UUyBpcyBuaWwuICBJTkZPIGlzIGEgcGxpc3QgaG9sZGluZyBjb250 ZXh0dWFsCmluZm9ybWF0aW9uLiIKICAoY29uY2F0CiAgICJAbm9pbmRlbnQiCiAgIChmb3JtYXQg IkBzdHJvbmd7JXN9ICIgb3JnLWNsb2NrLXN0cmluZykKICAgKGZvcm1hdCBvcmctZS10ZXhpbmZv LWluYWN0aXZlLXRpbWVzdGFtcC1mb3JtYXQKCSAgIChjb25jYXQgKG9yZy10cmFuc2xhdGUtdGlt ZSAob3JnLWVsZW1lbnQtcHJvcGVydHkgOnZhbHVlIGNsb2NrKSkKCQkgICAobGV0ICgodGltZSAo b3JnLWVsZW1lbnQtcHJvcGVydHkgOnRpbWUgY2xvY2spKSkKCQkgICAgIChhbmQgdGltZSAoZm9y bWF0ICIgKCVzKSIgdGltZSkpKSkpCiAgICJAKiIpKQoKCjs7OzsgQ29kZQoKKGRlZnVuIG9yZy1l LXRleGluZm8tY29kZSAoY29kZSBjb250ZW50cyBpbmZvKQogICJUcmFuc2NvZGUgYSBDT0RFIG9i amVjdCBmcm9tIE9yZyB0byBUZXhpbmZvLgpDT05URU5UUyBpcyBuaWwuICBJTkZPIGlzIGEgcGxp c3QgdXNlZCBhcyBhIGNvbW11bmljYXRpb24KY2hhbm5lbC4iCiAgKG9yZy1lLXRleGluZm8tLXRl eHQtbWFya3VwIChvcmctZWxlbWVudC1wcm9wZXJ0eSA6dmFsdWUgY29kZSkgJ2NvZGUpKQoKOzs7 OyBDb21tZW50CgooZGVmdW4gb3JnLWUtdGV4aW5mby1jb21tZW50IChjb21tZW50IGNvbnRlbnRz IGluZm8pCiAgIlRyYW5zY29kZSBhIENPTU1FTlQgb2JqZWN0IGZyb20gT3JnIHRvIFRleGluZm8u CkNPTlRFTlRTIGlzIHRoZSB0ZXh0IGluIHRoZSBjb21tZW50LiAgSU5GTyBpcyBhIHBsaXN0IGhv bGRpbmcKY29udGV4dHVhbCBpbmZvcm1hdGlvbi4iCiAgKG9yZy1lLXRleGluZm8tLXRleHQtbWFy a3VwIChvcmctZWxlbWVudC1wcm9wZXJ0eSA6dmFsdWUgY29tbWVudCkgJ2NvbW1lbnQpKQoKOzs7 OyBDb21tZW50IEJsb2NrCgooZGVmdW4gb3JnLWUtdGV4aW5mby1jb21tZW50LWJsb2NrIChjb21t ZW50LWJsb2NrIGNvbnRlbnRzIGluZm8pCiAgIlRyYW5zY29kZSBhIENPTU1FTlQtQkxPQ0sgb2Jq ZWN0IGZyb20gT3JnIHRvIFRleGluZm8uCkNPTlRFTlRTIGlzIHRoZSB0ZXh0IHdpdGhpbiB0aGUg YmxvY2suICBJTkZPIGlzIGEgcGxpc3QgaG9sZGluZwpjb250ZXh0dWFsIGluZm9ybWF0aW9uLiIK ICAoZm9ybWF0ICJAaWdub3JlXG4lc0BlbmQgaWdub3JlIiAob3JnLWVsZW1lbnQtcHJvcGVydHkg OnZhbHVlIGNvbW1lbnQtYmxvY2spKSkKCjs7OzsgRHJhd2VyCgooZGVmdW4gb3JnLWUtdGV4aW5m by1kcmF3ZXIgKGRyYXdlciBjb250ZW50cyBpbmZvKQogICJUcmFuc2NvZGUgYSBEUkFXRVIgZWxl bWVudCBmcm9tIE9yZyB0byBUZXhpbmZvLgpDT05URU5UUyBob2xkcyB0aGUgY29udGVudHMgb2Yg dGhlIGJsb2NrLiAgSU5GTyBpcyBhIHBsaXN0CmhvbGRpbmcgY29udGV4dHVhbCBpbmZvcm1hdGlv bi4iCiAgKGxldCogKChuYW1lIChvcmctZWxlbWVudC1wcm9wZXJ0eSA6ZHJhd2VyLW5hbWUgZHJh d2VyKSkKCSAob3V0cHV0IChpZiAoZnVuY3Rpb25wIG9yZy1lLXRleGluZm8tZm9ybWF0LWRyYXdl ci1mdW5jdGlvbikKCQkgICAgIChmdW5jYWxsIG9yZy1lLXRleGluZm8tZm9ybWF0LWRyYXdlci1m dW5jdGlvbgoJCQkgICAgICBuYW1lIGNvbnRlbnRzKQoJCSAgIDs7IElmIHRoZXJlJ3Mgbm8gdXNl ciBkZWZpbmVkIGZ1bmN0aW9uOiBzaW1wbHkKCQkgICA7OyBkaXNwbGF5IGNvbnRlbnRzIG9mIHRo ZSBkcmF3ZXIuCgkJICAgY29udGVudHMpKSkKICAgIG91dHB1dCkpCgoKOzs7OyBEeW5hbWljIEJs b2NrCgooZGVmdW4gb3JnLWUtdGV4aW5mby1keW5hbWljLWJsb2NrIChkeW5hbWljLWJsb2NrIGNv bnRlbnRzIGluZm8pCiAgIlRyYW5zY29kZSBhIERZTkFNSUMtQkxPQ0sgZWxlbWVudCBmcm9tIE9y ZyB0byBUZXhpbmZvLgpDT05URU5UUyBob2xkcyB0aGUgY29udGVudHMgb2YgdGhlIGJsb2NrLiAg SU5GTyBpcyBhIHBsaXN0CmhvbGRpbmcgY29udGV4dHVhbCBpbmZvcm1hdGlvbi4gIFNlZSBgb3Jn LWV4cG9ydC1kYXRhJy4iCiAgY29udGVudHMpCgoKOzs7OyBFbnRpdHkKCihkZWZ1biBvcmctZS10 ZXhpbmZvLWVudGl0eSAoZW50aXR5IGNvbnRlbnRzIGluZm8pCiAgIlRyYW5zY29kZSBhbiBFTlRJ VFkgb2JqZWN0IGZyb20gT3JnIHRvIFRleGluZm8uCkNPTlRFTlRTIGFyZSB0aGUgZGVmaW5pdGlv biBpdHNlbGYuICBJTkZPIGlzIGEgcGxpc3QgaG9sZGluZwpjb250ZXh0dWFsIGluZm9ybWF0aW9u LiIKICAobGV0ICgoZW50IChvcmctZWxlbWVudC1wcm9wZXJ0eSA6bGF0ZXggZW50aXR5KSkpCiAg ICAoaWYgKG9yZy1lbGVtZW50LXByb3BlcnR5IDpsYXRleC1tYXRoLXAgZW50aXR5KSAoZm9ybWF0 ICJAbWF0aHslc30iIGVudCkgZW50KSkpCgoKOzs7OyBFeGFtcGxlIEJsb2NrCgooZGVmdW4gb3Jn LWUtdGV4aW5mby1leGFtcGxlLWJsb2NrIChleGFtcGxlLWJsb2NrIGNvbnRlbnRzIGluZm8pCiAg IlRyYW5zY29kZSBhbiBFWEFNUExFLUJMT0NLIGVsZW1lbnQgZnJvbSBPcmcgdG8gVGV4aW5mby4K Q09OVEVOVFMgaXMgbmlsLiAgSU5GTyBpcyBhIHBsaXN0IGhvbGRpbmcgY29udGV4dHVhbAppbmZv cm1hdGlvbi4iCiAgKGZvcm1hdCAiQHZlcmJhdGltXG4lc0BlbmQgdmVyYmF0aW0iCgkgIChvcmct ZXhwb3J0LWZvcm1hdC1jb2RlLWRlZmF1bHQgZXhhbXBsZS1ibG9jayBpbmZvKSkpCgoKOzs7OyBF eHBvcnQgQmxvY2sKCihkZWZ1biBvcmctZS10ZXhpbmZvLWV4cG9ydC1ibG9jayAoZXhwb3J0LWJs b2NrIGNvbnRlbnRzIGluZm8pCiAgIlRyYW5zY29kZSBhIEVYUE9SVC1CTE9DSyBlbGVtZW50IGZy b20gT3JnIHRvIFRleGluZm8uCkNPTlRFTlRTIGlzIG5pbC4gIElORk8gaXMgYSBwbGlzdCBob2xk aW5nIGNvbnRleHR1YWwgaW5mb3JtYXRpb24uIgogICh3aGVuIChzdHJpbmc9IChvcmctZWxlbWVu dC1wcm9wZXJ0eSA6dHlwZSBleHBvcnQtYmxvY2spICJMQVRFWCIpCiAgICAob3JnLXJlbW92ZS1p bmRlbnRhdGlvbiAob3JnLWVsZW1lbnQtcHJvcGVydHkgOnZhbHVlIGV4cG9ydC1ibG9jaykpKSkK Cgo7Ozs7IEV4cG9ydCBTbmlwcGV0CgooZGVmdW4gb3JnLWUtdGV4aW5mby1leHBvcnQtc25pcHBl dCAoZXhwb3J0LXNuaXBwZXQgY29udGVudHMgaW5mbykKICAiVHJhbnNjb2RlIGEgRVhQT1JULVNO SVBQRVQgb2JqZWN0IGZyb20gT3JnIHRvIFRleGluZm8uCkNPTlRFTlRTIGlzIG5pbC4gIElORk8g aXMgYSBwbGlzdCBob2xkaW5nIGNvbnRleHR1YWwgaW5mb3JtYXRpb24uIgogICh3aGVuIChlcSAo b3JnLWV4cG9ydC1zbmlwcGV0LWJhY2tlbmQgZXhwb3J0LXNuaXBwZXQpICdlLXRleGluZm8pCiAg ICAob3JnLWVsZW1lbnQtcHJvcGVydHkgOnZhbHVlIGV4cG9ydC1zbmlwcGV0KSkpCgoKOzs7OyBG aXhlZCBXaWR0aAoKKGRlZnVuIG9yZy1lLXRleGluZm8tZml4ZWQtd2lkdGggKGZpeGVkLXdpZHRo IGNvbnRlbnRzIGluZm8pCiAgIlRyYW5zY29kZSBhIEZJWEVELVdJRFRIIGVsZW1lbnQgZnJvbSBP cmcgdG8gVGV4aW5mby4KQ09OVEVOVFMgaXMgbmlsLiAgSU5GTyBpcyBhIHBsaXN0IGhvbGRpbmcg Y29udGV4dHVhbCBpbmZvcm1hdGlvbi4iCiAgKGZvcm1hdCAiQGV4YW1wbGVcbiVzXG5AZW5kIGV4 YW1wbGUiCgkgIChvcmctcmVtb3ZlLWluZGVudGF0aW9uCgkgICAob3JnLWVsZW1lbnQtcHJvcGVy dHkgOnZhbHVlIGZpeGVkLXdpZHRoKSkpKQoKCjs7OzsgRm9vdG5vdGUgRGVmaW5pdGlvbgo7Owo7 OyBGb290bm90ZSBEZWZpbml0aW9ucyBhcmUgaWdub3JlZC4KCgo7Ozs7IEZvb3Rub3RlIFJlZmVy ZW5jZQo7OwoKKGRlZnVuIG9yZy1lLXRleGluZm8tZm9vdG5vdGUtcmVmZXJlbmNlIChmb290bm90 ZSBjb250ZW50cyBpbmZvKQogICIiCiAgKGxldCAoKGRlZiAob3JnLWV4cG9ydC1nZXQtZm9vdG5v dGUtZGVmaW5pdGlvbiBmb290bm90ZSBpbmZvKSkpCiAgICAoZm9ybWF0ICJAZm9vdG5vdGV7JXN9 IgoJICAgIChvcmctdHJpbSAob3JnLWV4cG9ydC1kYXRhIGRlZiBpbmZvKSkpKSkKCjs7OzsgSGVh ZGxpbmUKCihkZWZ1biBvcmctZS10ZXhpbmZvLWhlYWRsaW5lIChoZWFkbGluZSBjb250ZW50cyBp bmZvKQogICJUcmFuc2NvZGUgYW4gSEVBRExJTkUgZWxlbWVudCBmcm9tIE9yZyB0byBUZXhpbmZv LgpDT05URU5UUyBob2xkcyB0aGUgY29udGVudHMgb2YgdGhlIGhlYWRsaW5lLiAgSU5GTyBpcyBh IHBsaXN0CmhvbGRpbmcgY29udGV4dHVhbCBpbmZvcm1hdGlvbi4iCiAgKGxldCogKChjbGFzcyAo cGxpc3QtZ2V0IGluZm8gOnRleGluZm8tY2xhc3MpKQoJIChsZXZlbCAob3JnLWV4cG9ydC1nZXQt cmVsYXRpdmUtbGV2ZWwgaGVhZGxpbmUgaW5mbykpCgkgKG51bWJlcmVkcCAob3JnLWV4cG9ydC1u dW1iZXJlZC1oZWFkbGluZS1wIGhlYWRsaW5lIGluZm8pKQoJIChjbGFzcy1zZWN0aW9ubmluZyAo YXNzb2MgY2xhc3Mgb3JnLWUtdGV4aW5mby1jbGFzc2VzKSkKCSA7OyBDcmVhdGUgbm9kZSBpbmZv LCB0byBpbnNlcnQgaXQgYmVmb3JlIHNlY3Rpb24gZm9ybWF0dGluZy4KCSAobm9kZSAoZm9ybWF0 ICJAbm9kZSAlc1xuIgoJCSAgICAgICAob3JnLWV4cG9ydC1kYXRhIChvcmctZWxlbWVudC1wcm9w ZXJ0eSA6dGl0bGUgaGVhZGxpbmUpIGluZm8pKSkKCSA7OyBNZW51cyBtdXN0IGJlIGdlbmVyYXRl ZCB3aXRoIGZpcnN0IGNoaWxkLCBvdGhlcndpc2UgdGhleQoJIDs7IHdpbGwgbm90IG5lc3QgcHJv cGVybHkKCSAobWVudSAobGV0KiAoKGZpcnN0IChvcmctZXhwb3J0LWZpcnN0LXNpYmxpbmctcCBo ZWFkbGluZSkpCgkJICAgICAgKHBhcmVudCAob3JnLWV4cG9ydC1nZXQtcGFyZW50LWhlYWRsaW5l IGhlYWRsaW5lKSkKCQkgICAgICAodGl0bGUgKG9yZy1leHBvcnQtZGF0YSAob3JnLWVsZW1lbnQt cHJvcGVydHkgOnRpdGxlIHBhcmVudCkgaW5mbykpCgkJICAgICAgaGVhZGluZwoJCSAgICAgICh0 cmVlIChwbGlzdC1nZXQgaW5mbyA6cGFyc2UtdHJlZSkpKQoJCSAoaWYgZmlyc3QKCQkgICAgIChv cmctZWxlbWVudC1tYXAKCQkgICAgICAocGxpc3QtZ2V0IGluZm8gOnBhcnNlLXRyZWUpICdoZWFk bGluZQoJCSAgICAgIChsYW1iZGEgKHJlZikKCQkJKGlmIChtZW1iZXIgdGl0bGUgKG9yZy1lbGVt ZW50LXByb3BlcnR5IDp0aXRsZSByZWYpKQoJCQkgICAgKHB1c2ggcmVmIGhlYWRpbmcpKSkKCQkg ICAgICBpbmZvICd0KSkKCQkgKHNldHEgbGlzdGluZyAob3JnLWUtdGV4aW5mby0tYnVpbGQtbWVu dSAoY2FyIGhlYWRpbmcpIGxldmVsIGluZm8pKQoJIAkgKGlmIGxpc3RpbmcKCSAJICAgICAoc2V0 cSBsaXN0aW5nIChmb3JtYXQgIlxuQG1lbnVcbiVzXG5AZW5kIG1lbnVcblxuIiBsaXN0aW5nKSkK CSAJICAgJ25pbCkKCQkgKSkKCSA7OyBTZWN0aW9uIGZvcm1hdHRpbmcgd2lsbCBzZXQgdHdvIHBs YWNlaG9sZGVyczogb25lIGZvciB0aGUKCSA7OyB0aXRsZSBhbmQgdGhlIG90aGVyIGZvciB0aGUg Y29udGVudHMuCgkgKHNlY3Rpb24tZm10CgkgIChsZXQgKChzZWMgKGlmIChhbmQgKHN5bWJvbHAg KG50aCAyIGNsYXNzLXNlY3Rpb25uaW5nKSkKCQkJICAgICAgKGZib3VuZHAgKG50aCAyIGNsYXNz LXNlY3Rpb25uaW5nKSkpCgkJCSAoZnVuY2FsbCAobnRoIDIgY2xhc3Mtc2VjdGlvbm5pbmcpIGxl dmVsIG51bWJlcmVkcCkKCQkgICAgICAgKG50aCAoMSsgbGV2ZWwpIGNsYXNzLXNlY3Rpb25uaW5n KSkpKQoJICAgIChjb25kCgkgICAgIDs7IE5vIHNlY3Rpb24gYXZhaWxhYmxlIGZvciB0aGF0IExF VkVMLgoJICAgICAoKG5vdCBzZWMpIG5pbCkKCSAgICAgOzsgU2VjdGlvbiBmb3JtYXQgZGlyZWN0 bHkgcmV0dXJuZWQgYnkgYSBmdW5jdGlvbi4KCSAgICAgKChzdHJpbmdwIHNlYykgc2VjKQoJICAg ICA7OyAobnVtYmVyZWQtc2VjdGlvbiAuIHVubnVtYmVyZWQtc2VjdGlvbikKCSAgICAgKChub3Qg KGNvbnNwIChjZHIgc2VjKSkpCgkgICAgICAoY29uY2F0IG1lbnUgbm9kZSAoZnVuY2FsbCAoaWYg bnVtYmVyZWRwICMnY2FyICMnY2RyKSBzZWMpICJcbiVzIikpCgkgICAgIDs7IChudW1iZXJlZC1v cGVuIG51bWJlcmVkLWNsb3NlKQoJICAgICAoKD0gKGxlbmd0aCBzZWMpIDIpCgkgICAgICAod2hl biBudW1iZXJlZHAgKGNvbmNhdCBtZW51IG5vZGUgKGNhciBzZWMpICJcbiVzIiAobnRoIDEgc2Vj KSkpKQoJICAgICA7OyAobnVtLWluIG51bS1vdXQgbm8tbnVtLWluIG5vLW51bS1vdXQpCgkgICAg ICgoPSAobGVuZ3RoIHNlYykgNCkKCSAgICAgIChpZiBudW1iZXJlZHAgKGNvbmNhdCAoY2FyIHNl YykgIlxuJXMiIChudGggMSBzZWMpKQoJCShjb25jYXQgbWVudSBub2RlIChudGggMiBzZWMpICJc biVzIiAobnRoIDMgc2VjKSkpKSkpKQoJICh0ZXh0IChvcmctZXhwb3J0LWRhdGEgKG9yZy1lbGVt ZW50LXByb3BlcnR5IDp0aXRsZSBoZWFkbGluZSkgaW5mbykpCgkgKHRvZG8KCSAgKGFuZCAocGxp c3QtZ2V0IGluZm8gOndpdGgtdG9kby1rZXl3b3JkcykKCSAgICAgICAobGV0ICgodG9kbyAob3Jn LWVsZW1lbnQtcHJvcGVydHkgOnRvZG8ta2V5d29yZCBoZWFkbGluZSkpKQoJCSAoYW5kIHRvZG8g KG9yZy1leHBvcnQtZGF0YSB0b2RvIGluZm8pKSkpKQoJICh0b2RvLXR5cGUgKGFuZCB0b2RvIChv cmctZWxlbWVudC1wcm9wZXJ0eSA6dG9kby10eXBlIGhlYWRsaW5lKSkpCgkgKHRhZ3MgKGFuZCAo cGxpc3QtZ2V0IGluZm8gOndpdGgtdGFncykKCQkgICAgKG9yZy1leHBvcnQtZ2V0LXRhZ3MgaGVh ZGxpbmUgaW5mbykpKQoJIChwcmlvcml0eSAoYW5kIChwbGlzdC1nZXQgaW5mbyA6d2l0aC1wcmlv cml0eSkKCQkJKG9yZy1lbGVtZW50LXByb3BlcnR5IDpwcmlvcml0eSBoZWFkbGluZSkpKQoJIDs7 IENyZWF0ZSB0aGUgaGVhZGxpbmUgdGV4dCBhbG9uZyB3aXRoIGEgbm8tdGFnIHZlcnNpb24uICBU aGUKCSA7OyBsYXR0ZXIgaXMgcmVxdWlyZWQgdG8gcmVtb3ZlIHRhZ3MgZnJvbSB0YWJsZSBvZiBj b250ZW50cy4KCSAoZnVsbC10ZXh0IChpZiAoZnVuY3Rpb25wIG9yZy1lLXRleGluZm8tZm9ybWF0 LWhlYWRsaW5lLWZ1bmN0aW9uKQoJCQk7OyBVc2VyLWRlZmluZWQgZm9ybWF0dGluZyBmdW5jdGlv bi4KCQkJKGZ1bmNhbGwgb3JnLWUtdGV4aW5mby1mb3JtYXQtaGVhZGxpbmUtZnVuY3Rpb24KCQkJ CSB0b2RvIHRvZG8tdHlwZSBwcmlvcml0eSB0ZXh0IHRhZ3MpCgkJICAgICAgOzsgRGVmYXVsdCBm b3JtYXR0aW5nLgoJCSAgICAgIChjb25jYXQKCQkgICAgICAgKHdoZW4gdG9kbwoJCQkgKGZvcm1h dCAiQHN0cm9uZ3slc30gIiB0b2RvKSkKCQkgICAgICAgKHdoZW4gcHJpb3JpdHkgKGZvcm1hdCAi QGVtcGh7IyVzfSAiIHByaW9yaXR5KSkKCQkgICAgICAgdGV4dAoJCSAgICAgICAod2hlbiB0YWdz CgkJCSAoZm9ybWF0ICI6JXM6IgoJCQkJIChtYXBjb25jYXQgJ2lkZW50aXR5IHRhZ3MgIjoiKSkp KSkpCgkgKGZ1bGwtdGV4dC1uby10YWcKCSAgKGlmIChmdW5jdGlvbnAgb3JnLWUtdGV4aW5mby1m b3JtYXQtaGVhZGxpbmUtZnVuY3Rpb24pCgkgICAgICA7OyBVc2VyLWRlZmluZWQgZm9ybWF0dGlu ZyBmdW5jdGlvbi4KCSAgICAgIChmdW5jYWxsIG9yZy1lLXRleGluZm8tZm9ybWF0LWhlYWRsaW5l LWZ1bmN0aW9uCgkJICAgICAgIHRvZG8gdG9kby10eXBlIHByaW9yaXR5IHRleHQgbmlsKQoJICAg IDs7IERlZmF1bHQgZm9ybWF0dGluZy4KCSAgICAoY29uY2F0CgkgICAgICh3aGVuIHRvZG8gKGZv cm1hdCAiQHN0cm9uZ3slc30gIiB0b2RvKSkKCSAgICAgKHdoZW4gcHJpb3JpdHkgKGZvcm1hdCAi QGVtcGh7IyVjfSAiIHByaW9yaXR5KSkKCSAgICAgdGV4dCkpKQoJIChwcmUtYmxhbmtzCgkgICht YWtlLXN0cmluZyAob3JnLWVsZW1lbnQtcHJvcGVydHkgOnByZS1ibGFuayBoZWFkbGluZSkgMTAp KQoJICkKICAgIChjb25kCiAgICAgOzsgQ2FzZSAxOiBUaGlzIGlzIGEgZm9vdG5vdGUgc2VjdGlv bjogaWdub3JlIGl0LgogICAgICgob3JnLWVsZW1lbnQtcHJvcGVydHkgOmZvb3Rub3RlLXNlY3Rp b24tcCBoZWFkbGluZSkgbmlsKQogICAgIDs7IENhc2UgMjogVGhpcyBpcyB0aGUgYGNvcHlpbmcn IHNlY3Rpb246IGlnbm9yZSBpdAogICAgIDs7ICAgICAgICAgVGhpcyBpcyB1c2VkIGVsc2V3aGVy ZS4KICAgICAoKG9yZy1lbGVtZW50LXByb3BlcnR5IDpjb3B5aW5nIGhlYWRsaW5lKSBuaWwpCiAg ICAgOzsgQ2FzZSAzOiBUaGlzIGlzIGEgZGVlcCBzdWItdHJlZTogZXhwb3J0IGl0IGFzIGEgbGlz dCBpdGVtLgogICAgIDs7ICAgICAgICAgQWxzbyBleHBvcnQgYXMgaXRlbXMgaGVhZGxpbmVzIGZv ciB3aGljaCBubyBzZWN0aW9uCiAgICAgOzsgICAgICAgICBmb3JtYXQgaGFzIGJlZW4gZm91bmQu CiAgICAgKChvciAobm90IHNlY3Rpb24tZm10KSAob3JnLWV4cG9ydC1sb3ctbGV2ZWwtcCBoZWFk bGluZSBpbmZvKSkKICAgICAgOzsgQnVpbGQgdGhlIHJlYWwgY29udGVudHMgb2YgdGhlIHN1Yi10 cmVlLgogICAgICAobGV0ICgobG93LWxldmVsLWJvZHkKCSAgICAgKGNvbmNhdAoJICAgICAgOzsg SWYgdGhlIGhlYWRsaW5lIGlzIHRoZSBmaXJzdCBzaWJsaW5nLCBzdGFydCBhIGxpc3QuCgkgICAg ICAod2hlbiAob3JnLWV4cG9ydC1maXJzdC1zaWJsaW5nLXAgaGVhZGxpbmUpCgkJKGZvcm1hdCAi QCVzXG4iIChpZiBudW1iZXJlZHAgJ2VudW1lcmF0ZSAnaXRlbWl6ZSkpKQoJICAgICAgOzsgSXRl bWl6ZSBoZWFkbGluZQoJICAgICAgIkBpdGVtXG4iIGZ1bGwtdGV4dCAiXG4iIHByZS1ibGFua3Mg Y29udGVudHMpKSkKCTs7IElmIGhlYWRsaW5lIGlzIG5vdCB0aGUgbGFzdCBzaWJsaW5nIHNpbXBs eSByZXR1cm4KCTs7IExPVy1MRVZFTC1CT0RZLiAgT3RoZXJ3aXNlLCBhbHNvIGNsb3NlIHRoZSBs aXN0LCBiZWZvcmUgYW55Cgk7OyBibGFuayBsaW5lLgoJKGlmIChub3QgKG9yZy1leHBvcnQtbGFz dC1zaWJsaW5nLXAgaGVhZGxpbmUpKSBsb3ctbGV2ZWwtYm9keQoJICAocmVwbGFjZS1yZWdleHAt aW4tc3RyaW5nCgkgICAiWyBcdFxuXSpcXCciCgkgICAoZm9ybWF0ICJcbkBlbmQgJXMiIChpZiBu dW1iZXJlZHAgJ2VudW1lcmF0ZSAnaXRlbWl6ZSkpCgkgICBsb3ctbGV2ZWwtYm9keSkpKSkKICAg ICA7OyBDYXNlIDQ6IFN0YW5kYXJkIGhlYWRsaW5lLiAgRXhwb3J0IGl0IGFzIGEgc2VjdGlvbi4K ICAgICAodAogICAgICAoY29uZAogICAgICAgKChub3QgKGFuZCB0YWdzIChlcSAocGxpc3QtZ2V0 IGluZm8gOndpdGgtdGFncykgJ25vdC1pbi10b2MpKSkKCTs7IFJlZ3VsYXIgc2VjdGlvbi4gIFVz ZSBzcGVjaWZpZWQgZm9ybWF0IHN0cmluZy4KCShmb3JtYXQgKHJlcGxhY2UtcmVnZXhwLWluLXN0 cmluZyAiJV0iICIlJV0iIHNlY3Rpb24tZm10KSBmdWxsLXRleHQKCQkoY29uY2F0IHByZS1ibGFu a3MgY29udGVudHMgIlxuIikpKQogICAgICAgKChzdHJpbmctbWF0Y2ggIlxcYEBcXCguKj9cXCl7 IiBzZWN0aW9uLWZtdCkKCTs7IElmIHRhZ3Mgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSB0YWJsZSBv ZiBjb250ZW50cywgaW5zZXJ0Cgk7OyB0aXRsZSB3aXRob3V0IHRhZ3MgYXMgYW4gYWx0ZXJuYXRp dmUgaGVhZGluZyBpbiBzZWN0aW9uaW5nCgk7OyBjb21tYW5kLgoJKGZvcm1hdCAocmVwbGFjZS1t YXRjaCAoY29uY2F0IChtYXRjaC1zdHJpbmcgMSBzZWN0aW9uLWZtdCkgIlslc10iKQoJCQkgICAg ICAgbmlsIG5pbCBzZWN0aW9uLWZtdCAxKQoJCTs7IFJlcGxhY2Ugc3F1YXJlIGJyYWNrZXRzIHdp dGggcGFyZW50aGVzaXMgc2luY2UKCQk7OyBzcXVhcmUgYnJhY2tldHMgYXJlIG5vdCBzdXBwb3J0 ZWQgaW4gb3B0aW9uYWwKCQk7OyBhcmd1bWVudHMuCgkJKHJlcGxhY2UtcmVnZXhwLWluLXN0cmlu ZwoJCSAiXFxbIiAiKCIKCQkgKHJlcGxhY2UtcmVnZXhwLWluLXN0cmluZwoJCSAgIlxcXSIgIiki CgkJICBmdWxsLXRleHQtbm8tdGFnKSkKCQlmdWxsLXRleHQKCQkoY29uY2F0IHByZS1ibGFua3Mg Y29udGVudHMgIlxuIikpKQogICAgICAgKHQKCTs7IEltcG9zc2libGUgdG8gYWRkIGFuIGFsdGVy bmF0aXZlIGhlYWRpbmcuICBGYWxsYmFjayB0bwoJOzsgcmVndWxhciBzZWN0aW9uaW5nIGZvcm1h dCBzdHJpbmcuCgkoZm9ybWF0IChyZXBsYWNlLXJlZ2V4cC1pbi1zdHJpbmcgIiVdIiAiJSVdIiBz ZWN0aW9uLWZtdCkgZnVsbC10ZXh0CgkJKGNvbmNhdCBwcmUtYmxhbmtzIGNvbnRlbnRzICJcbiIp KSkpKSkpKQoKCjs7OzsgSG9yaXpvbnRhbCBSdWxlCjs7Cjs7IEhvcml6b250YWwgcnVsZXMgYXJl IGlnbm9yZWQKCjs7OzsgSW5saW5lIEJhYmVsIENhbGwKOzsKOzsgSW5saW5lIEJhYmVsIENhbGxz IGFyZSBpZ25vcmVkLgoKCjs7OzsgSW5saW5lIFNyYyBCbG9jawoKKGRlZnVuIG9yZy1lLXRleGlu Zm8taW5saW5lLXNyYy1ibG9jayAoaW5saW5lLXNyYy1ibG9jayBjb250ZW50cyBpbmZvKQogICJU cmFuc2NvZGUgYW4gSU5MSU5FLVNSQy1CTE9DSyBlbGVtZW50IGZyb20gT3JnIHRvIFRleGluZm8u CkNPTlRFTlRTIGhvbGRzIHRoZSBjb250ZW50cyBvZiB0aGUgaXRlbS4gIElORk8gaXMgYSBwbGlz dCBob2xkaW5nCmNvbnRleHR1YWwgaW5mb3JtYXRpb24uIgogIChsZXQqICgoY29kZSAob3JnLWVs ZW1lbnQtcHJvcGVydHkgOnZhbHVlIGlubGluZS1zcmMtYmxvY2spKQoJIChzZXBhcmF0b3IgKG9y Zy1lLXRleGluZm8tLWZpbmQtdmVyYi1zZXBhcmF0b3IgY29kZSkpKQogICAgKGNvbmQKICAgICA7 OyBEbyBub3QgdXNlIGEgc3BlY2lhbCBwYWNrYWdlOiB0cmFuc2NvZGUgaXQgdmVyYmF0aW0uCiAg ICAgKChub3Qgb3JnLWUtdGV4aW5mby1saXN0aW5ncykKICAgICAgKGNvbmNhdCAiXFx2ZXJiIiBz ZXBhcmF0b3IgY29kZSBzZXBhcmF0b3IpKQogICAgIDs7IFVzZSBtaW50ZWQgcGFja2FnZS4KICAg ICAoKGVxIG9yZy1lLXRleGluZm8tbGlzdGluZ3MgJ21pbnRlZCkKICAgICAgKGxldCogKChvcmct bGFuZyAob3JnLWVsZW1lbnQtcHJvcGVydHkgOmxhbmd1YWdlIGlubGluZS1zcmMtYmxvY2spKQoJ ICAgICAobWludC1sYW5nIChvciAoY2FkciAoYXNzcSAoaW50ZXJuIG9yZy1sYW5nKQoJCQkJCW9y Zy1lLXRleGluZm8tbWludGVkLWxhbmdzKSkKCQkJICAgIG9yZy1sYW5nKSkKCSAgICAgKG9wdGlv bnMgKG9yZy1lLXRleGluZm8tLW1ha2Utb3B0aW9uLXN0cmluZwoJCSAgICAgICBvcmctZS10ZXhp bmZvLW1pbnRlZC1vcHRpb25zKSkpCgkoY29uY2F0IChmb3JtYXQgIlxcbWludCVzeyVzfSIKCQkJ KGlmIChzdHJpbmc9IG9wdGlvbnMgIiIpICIiIChmb3JtYXQgIlslc10iIG9wdGlvbnMpKQoJCQlt aW50LWxhbmcpCgkJc2VwYXJhdG9yIGNvZGUgc2VwYXJhdG9yKSkpCiAgICAgOzsgVXNlIGxpc3Rp bmdzIHBhY2thZ2UuCiAgICAgKHQKICAgICAgOzsgTWF5YmUgdHJhbnNsYXRlIGxhbmd1YWdlJ3Mg bmFtZS4KICAgICAgKGxldCogKChvcmctbGFuZyAob3JnLWVsZW1lbnQtcHJvcGVydHkgOmxhbmd1 YWdlIGlubGluZS1zcmMtYmxvY2spKQoJICAgICAobHN0LWxhbmcgKG9yIChjYWRyIChhc3NxIChp bnRlcm4gb3JnLWxhbmcpCgkJCQkgICAgICAgb3JnLWUtdGV4aW5mby1saXN0aW5ncy1sYW5ncykp CgkJCSAgIG9yZy1sYW5nKSkKCSAgICAgKG9wdGlvbnMgKG9yZy1lLXRleGluZm8tLW1ha2Utb3B0 aW9uLXN0cmluZwoJCSAgICAgICAoYXBwZW5kIG9yZy1lLXRleGluZm8tbGlzdGluZ3Mtb3B0aW9u cwoJCQkgICAgICAgYCgoImxhbmd1YWdlIiAsbHN0LWxhbmcpKSkpKSkKCShjb25jYXQgKGZvcm1h dCAiXFxsc3RpbmxpbmVbJXNdIiBvcHRpb25zKQoJCXNlcGFyYXRvciBjb2RlIHNlcGFyYXRvcikp KSkpKQoKCjs7OzsgSW5saW5ldGFzawoKKGRlZnVuIG9yZy1lLXRleGluZm8taW5saW5ldGFzayAo aW5saW5ldGFzayBjb250ZW50cyBpbmZvKQogICJUcmFuc2NvZGUgYW4gSU5MSU5FVEFTSyBlbGVt ZW50IGZyb20gT3JnIHRvIFRleGluZm8uCkNPTlRFTlRTIGhvbGRzIHRoZSBjb250ZW50cyBvZiB0 aGUgYmxvY2suICBJTkZPIGlzIGEgcGxpc3QKaG9sZGluZyBjb250ZXh0dWFsIGluZm9ybWF0aW9u LiIKICAobGV0ICgodGl0bGUgKG9yZy1leHBvcnQtZGF0YSAob3JnLWVsZW1lbnQtcHJvcGVydHkg OnRpdGxlIGlubGluZXRhc2spIGluZm8pKQoJKHRvZG8gKGFuZCAocGxpc3QtZ2V0IGluZm8gOndp dGgtdG9kby1rZXl3b3JkcykKCQkgICAobGV0ICgodG9kbyAob3JnLWVsZW1lbnQtcHJvcGVydHkg OnRvZG8ta2V5d29yZCBpbmxpbmV0YXNrKSkpCgkJICAgICAoYW5kIHRvZG8gKG9yZy1leHBvcnQt ZGF0YSB0b2RvIGluZm8pKSkpKQoJKHRvZG8tdHlwZSAob3JnLWVsZW1lbnQtcHJvcGVydHkgOnRv ZG8tdHlwZSBpbmxpbmV0YXNrKSkKCSh0YWdzIChhbmQgKHBsaXN0LWdldCBpbmZvIDp3aXRoLXRh Z3MpCgkJICAgKG9yZy1leHBvcnQtZ2V0LXRhZ3MgaW5saW5ldGFzayBpbmZvKSkpCgkocHJpb3Jp dHkgKGFuZCAocGxpc3QtZ2V0IGluZm8gOndpdGgtcHJpb3JpdHkpCgkJICAgICAgIChvcmctZWxl bWVudC1wcm9wZXJ0eSA6cHJpb3JpdHkgaW5saW5ldGFzaykpKSkKICAgIDs7IElmIGBvcmctZS10 ZXhpbmZvLWZvcm1hdC1pbmxpbmV0YXNrLWZ1bmN0aW9uJyBpcyBwcm92aWRlZCwgY2FsbCBpdAog ICAgOzsgd2l0aCBhcHByb3ByaWF0ZSBhcmd1bWVudHMuCiAgICAoaWYgKGZ1bmN0aW9ucCBvcmct ZS10ZXhpbmZvLWZvcm1hdC1pbmxpbmV0YXNrLWZ1bmN0aW9uKQoJKGZ1bmNhbGwgb3JnLWUtdGV4 aW5mby1mb3JtYXQtaW5saW5ldGFzay1mdW5jdGlvbgoJCSB0b2RvIHRvZG8tdHlwZSBwcmlvcml0 eSB0aXRsZSB0YWdzIGNvbnRlbnRzKQogICAgICA7OyBPdGhlcndpc2UsIHVzZSBhIGRlZmF1bHQg dGVtcGxhdGUuCiAgICAgIChsZXQgKChmdWxsLXRpdGxlCgkgICAgIChjb25jYXQKCSAgICAgICh3 aGVuIHRvZG8gKGZvcm1hdCAiQHN0cm9uZ3slc30gIiB0b2RvKSkKCSAgICAgICh3aGVuIHByaW9y aXR5IChmb3JtYXQgIiVjICIgcHJpb3JpdHkpKQoJICAgICAgdGl0bGUKCSAgICAgICh3aGVuIHRh Z3MgKGZvcm1hdCAiOiVzOiIKCQkJCSAobWFwY29uY2F0ICdpZGVudGl0eSB0YWdzICI6IikpKSkp KQoJKGZvcm1hdCAoY29uY2F0ICJAY2VudGVyICVzXG5cbiIKCQkJIiVzIgoJCQkiXG4iKQoJCWZ1 bGwtdGl0bGUgY29udGVudHMpKSkpKQoKCjs7OzsgSXRhbGljCgooZGVmdW4gb3JnLWUtdGV4aW5m by1pdGFsaWMgKGl0YWxpYyBjb250ZW50cyBpbmZvKQogICJUcmFuc2NvZGUgSVRBTElDIGZyb20g T3JnIHRvIFRleGluZm8uCkNPTlRFTlRTIGlzIHRoZSB0ZXh0IHdpdGggaXRhbGljIG1hcmt1cC4g IElORk8gaXMgYSBwbGlzdCBob2xkaW5nCmNvbnRleHR1YWwgaW5mb3JtYXRpb24uIgogIChvcmct ZS10ZXhpbmZvLS10ZXh0LW1hcmt1cCBjb250ZW50cyAnaXRhbGljKSkKCjs7OzsgSXRlbQoKKGRl ZnVuIG9yZy1lLXRleGluZm8taXRlbSAoaXRlbSBjb250ZW50cyBpbmZvKQogICJUcmFuc2NvZGUg YW4gSVRFTSBlbGVtZW50IGZyb20gT3JnIHRvIFRleGluZm8uCkNPTlRFTlRTIGhvbGRzIHRoZSBj b250ZW50cyBvZiB0aGUgaXRlbS4gIElORk8gaXMgYSBwbGlzdCBob2xkaW5nCmNvbnRleHR1YWwg aW5mb3JtYXRpb24uIgogIChjb25jYXQgIlxuQGl0ZW1cbiIKCSAgICAob3JnLXRyaW0gY29udGVu dHMpICJcbiIpKQoKCjs7OzsgS2V5d29yZAoKKGRlZnVuIG9yZy1lLXRleGluZm8ta2V5d29yZCAo a2V5d29yZCBjb250ZW50cyBpbmZvKQogICJUcmFuc2NvZGUgYSBLRVlXT1JEIGVsZW1lbnQgZnJv bSBPcmcgdG8gVGV4aW5mby4KQ09OVEVOVFMgaXMgbmlsLiAgSU5GTyBpcyBhIHBsaXN0IGhvbGRp bmcgY29udGV4dHVhbCBpbmZvcm1hdGlvbi4iCiAgKGxldCAoKGtleSAob3JnLWVsZW1lbnQtcHJv cGVydHkgOmtleSBrZXl3b3JkKSkKCSh2YWx1ZSAob3JnLWVsZW1lbnQtcHJvcGVydHkgOnZhbHVl IGtleXdvcmQpKSkKICAgIChjb25kCiAgICAgKChzdHJpbmc9IGtleSAiTEFURVgiKSB2YWx1ZSkK ICAgICAoKHN0cmluZz0ga2V5ICJJTkRFWCIpIChmb3JtYXQgIlxcaW5kZXh7JXN9IiB2YWx1ZSkp CiAgICAgOzsgSW52aXNpYmxlIHRhcmdldHMuCiAgICAgKChzdHJpbmc9IGtleSAiVEFSR0VUIikg bmlsKQogICAgICgoc3RyaW5nPSBrZXkgIlRPQyIpCiAgICAgIChsZXQgKCh2YWx1ZSAoZG93bmNh c2UgdmFsdWUpKSkKCShjb25kCgkgKChzdHJpbmctbWF0Y2ggIlxcPGhlYWRsaW5lc1xcPiIgdmFs dWUpCgkgIChsZXQgKChkZXB0aCAob3IgKGFuZCAoc3RyaW5nLW1hdGNoICJbMC05XSsiIHZhbHVl KQoJCQkJKHN0cmluZy10by1udW1iZXIgKG1hdGNoLXN0cmluZyAwIHZhbHVlKSkpCgkJCSAgIChw bGlzdC1nZXQgaW5mbyA6d2l0aC10b2MpKSkpCgkgICAgKGNvbmNhdAoJICAgICAod2hlbiAod2hv bGVudW1wIGRlcHRoKQoJICAgICAgIChmb3JtYXQgIlxcc2V0Y291bnRlcnt0b2NkZXB0aH17JXN9 XG4iIGRlcHRoKSkKCSAgICAgIlxcdGFibGVvZmNvbnRlbnRzIikpKQoJICgoc3RyaW5nPSAidGFi bGVzIiB2YWx1ZSkgIlxcbGlzdG9mdGFibGVzIikKCSAoKHN0cmluZz0gImZpZ3VyZXMiIHZhbHVl KSAiXFxsaXN0b2ZmaWd1cmVzIikKCSAoKHN0cmluZz0gImxpc3RpbmdzIiB2YWx1ZSkKCSAgKGNv bmQKCSAgICgoZXEgb3JnLWUtdGV4aW5mby1saXN0aW5ncyAnbWludGVkKSAiXFxsaXN0b2ZsaXN0 aW5ncyIpCgkgICAob3JnLWUtdGV4aW5mby1saXN0aW5ncyAiXFxsc3RsaXN0b2ZsaXN0aW5ncyIp CgkgICA7OyBBdCB0aGUgbW9tZW50LCBzcmMgYmxvY2tzIHdpdGggYSBjYXB0aW9uIGFyZSB3cmFw cGVkCgkgICA7OyBpbnRvIGEgZmlndXJlIGVudmlyb25tZW50LgoJICAgKHQgIlxcbGlzdG9mZmln dXJlcyIpKSkpKSkpKSkKCgo7Ozs7IExhdGV4IEVudmlyb25tZW50CgooZGVmdW4gb3JnLWUtdGV4 aW5mby1sYXRleC1lbnZpcm9ubWVudCAobGF0ZXgtZW52aXJvbm1lbnQgY29udGVudHMgaW5mbykK ICAiVHJhbnNjb2RlIGEgTEFURVgtRU5WSVJPTk1FTlQgZWxlbWVudCBmcm9tIE9yZyB0byBUZXhp bmZvLgpDT05URU5UUyBpcyBuaWwuICBJTkZPIGlzIGEgcGxpc3QgaG9sZGluZyBjb250ZXh0dWFs IGluZm9ybWF0aW9uLiIKICAobGV0ICgobGFiZWwgKG9yZy1lbGVtZW50LXByb3BlcnR5IDpuYW1l IGxhdGV4LWVudmlyb25tZW50KSkKCSh2YWx1ZSAob3JnLXJlbW92ZS1pbmRlbnRhdGlvbgoJCShv cmctZWxlbWVudC1wcm9wZXJ0eSA6dmFsdWUgbGF0ZXgtZW52aXJvbm1lbnQpKSkpCiAgICAoaWYg KG5vdCAob3JnLXN0cmluZy1udy1wIGxhYmVsKSkgdmFsdWUKICAgICAgOzsgRW52aXJvbm1lbnQg aXMgbGFiZWxsZWQ6IGxhYmVsIG11c3QgYmUgd2l0aGluIHRoZSBlbnZpcm9ubWVudAogICAgICA7 OyAob3RoZXJ3aXNlLCBhIHJlZmVyZW5jZSBwb2ludGluZyB0byB0aGF0IGVsZW1lbnQgd2lsbCBj b3VudAogICAgICA7OyB0aGUgc2VjdGlvbiBpbnN0ZWFkKS4KICAgICAgKHdpdGgtdGVtcC1idWZm ZXIKCShpbnNlcnQgdmFsdWUpCgkoZ290by1jaGFyIChwb2ludC1taW4pKQoJKGZvcndhcmQtbGlu ZSkKCShpbnNlcnQgKGZvcm1hdCAiXFxsYWJlbHslc31cbiIgbGFiZWwpKQoJKGJ1ZmZlci1zdHJp bmcpKSkpKQoKCjs7OzsgTGF0ZXggRnJhZ21lbnQKCihkZWZ1biBvcmctZS10ZXhpbmZvLWxhdGV4 LWZyYWdtZW50IChsYXRleC1mcmFnbWVudCBjb250ZW50cyBpbmZvKQogICJUcmFuc2NvZGUgYSBM QVRFWC1GUkFHTUVOVCBvYmplY3QgZnJvbSBPcmcgdG8gVGV4aW5mby4KQ09OVEVOVFMgaXMgbmls LiAgSU5GTyBpcyBhIHBsaXN0IGhvbGRpbmcgY29udGV4dHVhbCBpbmZvcm1hdGlvbi4iCiAgKG9y Zy1lbGVtZW50LXByb3BlcnR5IDp2YWx1ZSBsYXRleC1mcmFnbWVudCkpCgoKOzs7OyBMaW5lIEJy ZWFrCgooZGVmdW4gb3JnLWUtdGV4aW5mby1saW5lLWJyZWFrIChsaW5lLWJyZWFrIGNvbnRlbnRz IGluZm8pCiAgIlRyYW5zY29kZSBhIExJTkUtQlJFQUsgb2JqZWN0IGZyb20gT3JnIHRvIFRleGlu Zm8uCkNPTlRFTlRTIGlzIG5pbC4gIElORk8gaXMgYSBwbGlzdCBob2xkaW5nIGNvbnRleHR1YWwg aW5mb3JtYXRpb24uIgogICJAKiIpCgoKOzs7OyBMaW5rCgooZGVmdW4gb3JnLWUtdGV4aW5mby1s aW5rIChsaW5rIGRlc2MgaW5mbykKICAiVHJhbnNjb2RlIGEgTElOSyBvYmplY3QgZnJvbSBPcmcg dG8gVGV4aW5mby4KCkRFU0MgaXMgdGhlIGRlc2NyaXB0aW9uIHBhcnQgb2YgdGhlIGxpbmssIG9y IHRoZSBlbXB0eSBzdHJpbmcuCklORk8gaXMgYSBwbGlzdCBob2xkaW5nIGNvbnRleHR1YWwgaW5m b3JtYXRpb24uICBTZWUKYG9yZy1leHBvcnQtZGF0YScuIgogIChsZXQqICgodHlwZSAob3JnLWVs ZW1lbnQtcHJvcGVydHkgOnR5cGUgbGluaykpCgkgKHJhdy1wYXRoIChvcmctZWxlbWVudC1wcm9w ZXJ0eSA6cGF0aCBsaW5rKSkKCSA7OyBFbnN1cmUgREVTQyByZWFsbHkgZXhpc3RzLCBvciBzZXQg aXQgdG8gbmlsLgoJIChkZXNjIChhbmQgKG5vdCAoc3RyaW5nPSBkZXNjICIiKSkgZGVzYykpCgkg KHBhdGggKGNvbmQKCQkoKG1lbWJlciB0eXBlICcoImh0dHAiICJodHRwcyIgImZ0cCIpKQoJCSAo Y29uY2F0IHR5cGUgIjoiIHJhdy1wYXRoKSkKCQkoKHN0cmluZz0gdHlwZSAiZmlsZSIpCgkJICh3 aGVuIChzdHJpbmctbWF0Y2ggIlxcKC4rXFwpOjouKyIgcmF3LXBhdGgpCgkJICAgKHNldHEgcmF3 LXBhdGggKG1hdGNoLXN0cmluZyAxIHJhdy1wYXRoKSkpCgkJIChpZiAoZmlsZS1uYW1lLWFic29s dXRlLXAgcmF3LXBhdGgpCgkJICAgICAoY29uY2F0ICJmaWxlOi8vIiAoZXhwYW5kLWZpbGUtbmFt ZSByYXctcGF0aCkpCgkJICAgKGNvbmNhdCAiZmlsZTovLyIgcmF3LXBhdGgpKSkKCQkodCByYXct cGF0aCkpKQoJIChlbWFpbCAoaWYgKHN0cmluZz0gdHlwZSAibWFpbHRvIikKCQkgICAgKGxldCAo KHRleHQgKHJlcGxhY2UtcmVnZXhwLWluLXN0cmluZwoJCQkJICJAIiAiQEAiIHJhdy1wYXRoKSkp CgkJICAgICAoY29uY2F0IHRleHQgKGlmIGRlc2MgKGNvbmNhdCAiLCIgZGVzYykpKSkpKQoJIHBy b3RvY29sKQogICAgKGNvbmQKICAgICA7OyBMaW5rcyBwb2ludGluZyB0byBhbiBoZWFkbGluZTog RmluZCBkZXN0aW5hdGlvbiBhbmQgYnVpbGQKICAgICA7OyBhcHByb3ByaWF0ZSByZWZlcmVuY2lu ZyBjb21tYW5kLgogICAgICgobWVtYmVyIHR5cGUgJygiY3VzdG9tLWlkIiAiZnV6enkiICJpZCIp KQogICAgICAobGV0ICgoZGVzdGluYXRpb24gKG9yZy1leHBvcnQtcmVzb2x2ZS1pZC1saW5rIGxp bmsgaW5mbykpKQoJKGNhc2UgKG9yZy1lbGVtZW50LXR5cGUgZGVzdGluYXRpb24pCgkgIDs7IElk IGxpbmsgcG9pbnRzIHRvIGFuIGV4dGVybmFsIGZpbGUuCgkgIChwbGFpbi10ZXh0CgkgICAoaWYg ZGVzYyAoZm9ybWF0ICJAdXJlZntmaWxlOi8vJXMsJXN9IiBkZXN0aW5hdGlvbiBkZXNjKQoJICAg ICAoZm9ybWF0ICJAdXJlZntmaWxlOi8vJXN9IiBkZXN0aW5hdGlvbikpKQoJICA7OyBMSU5LIHBv aW50cyB0byBhbiBoZWFkbGluZS4gIFVzZSB0aGUgaGVhZGxpbmUgYXMgdGhlIE5PREUgdGFyZ2V0 CgkgIChoZWFkbGluZQoJICAgKGZvcm1hdCAiQHJlZnslc30iCgkJICAgKG9yZy1leHBvcnQtZGF0 YQoJCSAgICAob3JnLWVsZW1lbnQtcHJvcGVydHkgOnRpdGxlIGRlc3RpbmF0aW9uKSBpbmZvKSkp CgkgICh0KSkpKQogICAgIDs7IFNwZWNpYWwgY2FzZSBmb3IgZW1haWwgYWRkcmVzc2VzCiAgICAg KGVtYWlsCiAgICAgIChmb3JtYXQgIkBlbWFpbHslc30iIGVtYWlsKSkKICAgICA7OyBFeHRlcm5h bCBsaW5rIHdpdGggYSBkZXNjcmlwdGlvbiBwYXJ0LgogICAgICgoYW5kIHBhdGggZGVzYykgKGZv cm1hdCAiQHVyZWZ7JXMsJXN9IiBwYXRoIGRlc2MpKQogICAgIDs7IEV4dGVybmFsIGxpbmsgd2l0 aG91dCBhIGRlc2NyaXB0aW9uIHBhcnQuCiAgICAgKHBhdGggKGZvcm1hdCAiQHVyZWZ7JXN9IiBw YXRoKSkKICAgICA7OyBObyBwYXRoLCBvbmx5IGRlc2NyaXB0aW9uLiAgVHJ5IHRvIGRvIHNvbWV0 aGluZyB1c2VmdWwuCiAgICAgKHQgKGZvcm1hdCBvcmctZS10ZXhpbmZvLWxpbmstd2l0aC11bmtu b3duLXBhdGgtZm9ybWF0IGRlc2MpKSkpKQoKCjs7OzsgTWFjcm8KCihkZWZ1biBvcmctZS10ZXhp bmZvLW1hY3JvIChtYWNybyBjb250ZW50cyBpbmZvKQogICJUcmFuc2NvZGUgYSBNQUNSTyBlbGVt ZW50IGZyb20gT3JnIHRvIFRleGluZm8uCkNPTlRFTlRTIGlzIG5pbC4gIElORk8gaXMgYSBwbGlz dCBob2xkaW5nIGNvbnRleHR1YWwgaW5mb3JtYXRpb24uIgogIDs7IFVzZSBhdmFpbGFibGUgdG9v bHMuCiAgKG9yZy1leHBvcnQtZXhwYW5kLW1hY3JvIG1hY3JvIGluZm8pKQoKCjs7OzsgTWVudQoK KGRlZnVuIG9yZy1lLXRleGluZm8tbWFrZS1tZW51ICh0cmVlIGxldmVsICZvcHRpb25hbCBpbmZv KQogICJDcmVhdGUgdGhlIG1lbnUgZm9yIGluY2x1c2lvbiBpbiB0aGUgdGV4aWZvIGRvY3VtZW50 LgpJTkZPIGlzIHRoZSBwYXJzZWQgYnVmZmVyIHRoYXQgY29udGFpbnMgdGhlIGhlYWRsaW5lcy4g IExFVkVMCmRldGVybWluZXMgd2hldGhlciB0byBtYWtlIHRoZSBtYWluIG1lbnUsIG9yIHRoZSBk ZXRhaWxlZCBtZW51LiIKICAobGV0KiAoKGluZm8gKGlmIGluZm8KCQkgICBpbmZvCgkJIHRyZWUp KQoJIChwYXJzZSAocGxpc3QtZ2V0IHRyZWUgOnBhcnNlLXRyZWUpKQoJIDs7IFRvcCBkZXRlcm1p bmVzIGxldmVsIHRvIGJ1aWxkIG1lbnUgZnJvbSwgaXQgZmluZHMgdGhlCgkgOzsgbGV2ZWwgb2Yg dGhlIGZpcnN0IGhlYWRsaW5lIGluIHRoZSBleHBvcnQuCgkgKHRvcCAob3JnLWVsZW1lbnQtbWFw CgkgICAgICAgcGFyc2UgJ2hlYWRsaW5lCgkgICAgICAgKGxhbWJkYSAoaGVhZGxpbmUpCgkJIChv cmctZWxlbWVudC1wcm9wZXJ0eSA6bGV2ZWwgaGVhZGxpbmUpKSBpbmZvICd0KSkKCSBtZW51IG1l bnUtdGl0bGUpCiAgICAoY29uZAogICAgIDs7IEdlbmVyYXRlIHRoZSBtYWluIG1lbnUKICAgICAo KGVxIGxldmVsICdtYWluKQogICAgICAob3JnLWUtdGV4aW5mby0tYnVpbGQtbWVudSBwYXJzZSB0 b3AgaW5mbykpCiAgICAgOzsgR2VuZXJhdGUgdGhlIGRldGFpbGVkIChyZWN1cnNpdmUpIG1lbnUK ICAgICAoKGVxIGxldmVsICdkZXRhaWxlZCkKICAgICAgOzsgUmVxdWlyZXMgcmVjdXJzaW9uCiAg ICAgIDs7KG9yZy1lLXRleGluZm8tLWJ1aWxkLWRldGFpbGVkLW1lbnUgcGFyc2UgdG9wIGluZm8p CiAgICAgIChvciAob3JnLWUtdGV4aW5mby0tYnVpbGQtbWVudSBwYXJzZSB0b3AgaW5mbyAnZGV0 YWlsZWQpCgkgICJkZXRhaWxlZCIpCiAgICAgICkKICAgICA7OyBJZiBhbiBpbnRlZ2VyLCBjcmVh dGUgc3BlY2lmaWMgbWVudSBmb3IgdGhhdCBsZXZlbAogICAgICgoaW50ZWdlcnAgbGV2ZWwpCiAg ICAgIChvcmctZS10ZXhpbmZvLS1idWlsZC1tZW51IHBhcnNlIGxldmVsIGluZm8pKQogICAgIDs7 IE90aGVyd2lzZSBkbyBub3RoaW5nCiAgICAgKHQKICAgICAgKSkpKQoKCjs7OzsgUGFyYWdyYXBo CgooZGVmdW4gb3JnLWUtdGV4aW5mby1wYXJhZ3JhcGggKHBhcmFncmFwaCBjb250ZW50cyBpbmZv KQogICJUcmFuc2NvZGUgYSBQQVJBR1JBUEggZWxlbWVudCBmcm9tIE9yZyB0byBUZXhpbmZvLgpD T05URU5UUyBpcyB0aGUgY29udGVudHMgb2YgdGhlIHBhcmFncmFwaCwgYXMgYSBzdHJpbmcuICBJ TkZPIGlzCnRoZSBwbGlzdCB1c2VkIGFzIGEgY29tbXVuaWNhdGlvbiBjaGFubmVsLiIKICBjb250 ZW50cykKCgo7Ozs7IFBsYWluIExpc3QKCihkZWZ1biBvcmctZS10ZXhpbmZvLXBsYWluLWxpc3Qg KHBsYWluLWxpc3QgY29udGVudHMgaW5mbykKICAiVHJhbnNjb2RlIGEgUExBSU4tTElTVCBlbGVt ZW50IGZyb20gT3JnIHRvIFRleGluZm8uCkNPTlRFTlRTIGlzIHRoZSBjb250ZW50cyBvZiB0aGUg bGlzdC4gIElORk8gaXMgYSBwbGlzdCBob2xkaW5nCmNvbnRleHR1YWwgaW5mb3JtYXRpb24uIgog IChsZXQqICgodHlwZSAob3JnLWVsZW1lbnQtcHJvcGVydHkgOnR5cGUgcGxhaW4tbGlzdCkpCgkg KGxpc3QtdHlwZSAoY29uZAoJCSAgICAgKChlcSB0eXBlICdvcmRlcmVkKSAiZW51bWVyYXRlIikK CQkgICAgICgoZXEgdHlwZSAndW5vcmRlcmVkKSAiaXRlbWl6ZSIpCgkJICAgICAoKGVxIHR5cGUg J2Rlc2NyaXB0aXZlKSAidGFibGUiKSkpKQogICAgKGZvcm1hdCAiQCVzJXNcbkBlbmQgJXMiCgkg ICAgKGlmIChlcSB0eXBlICdkZXNjcmlwdGl2ZSkKCQkoY29uY2F0IGxpc3QtdHlwZSAiICIgb3Jn LWUtdGV4aW5mby1kZWYtdGFibGUtbWFya3VwKQoJICAgICBsaXN0LXR5cGUpCgkgICAgY29udGVu dHMKCSAgICBsaXN0LXR5cGUpKSkKCgo7Ozs7IFBsYWluIFRleHQKCihkZWZ1biBvcmctZS10ZXhp bmZvLXBsYWluLXRleHQgKHRleHQgaW5mbykKICAiVHJhbnNjb2RlIGEgVEVYVCBzdHJpbmcgZnJv bSBPcmcgdG8gVGV4aW5mby4KVEVYVCBpcyB0aGUgc3RyaW5nIHRvIHRyYW5zY29kZS4gIElORk8g aXMgYSBwbGlzdCBob2xkaW5nCmNvbnRleHR1YWwgaW5mb3JtYXRpb24uIgogIDs7IFByb3RlY3Qg QCB7IGFuZCB9LgogICh3aGlsZSAoc3RyaW5nLW1hdGNoICJcXChbXlxcXVxcfF5cXClcXChbQHt9 XVxcKSIgdGV4dCkKICAgIChzZXRxIHRleHQKCSAgKHJlcGxhY2UtbWF0Y2ggKGZvcm1hdCAiXFwl cyIgKG1hdGNoLXN0cmluZyAyIHRleHQpKSBuaWwgdCB0ZXh0IDIpKSkKICA7OyBIYW5kbGUgcXVv dGF0aW9uIG1hcmtzCiAgKHNldHEgdGV4dCAob3JnLWUtdGV4aW5mby0tcXVvdGF0aW9uLW1hcmtz IHRleHQgaW5mbykpCiAgOzsgQ29udmVydCBzcGVjaWFsIHN0cmluZ3MuCiAgKHdoZW4gKHBsaXN0 LWdldCBpbmZvIDp3aXRoLXNwZWNpYWwtc3RyaW5ncykKICAgICh3aGlsZSAoc3RyaW5nLW1hdGNo IChyZWdleHAtcXVvdGUgIi4uLiIpIHRleHQpCiAgICAgIChzZXRxIHRleHQgKHJlcGxhY2UtbWF0 Y2ggIkBkb3Rze30iIG5pbCB0IHRleHQpKSkpCiAgOzsgSGFuZGxlIGJyZWFrIHByZXNlcnZhdGlv biBpZiByZXF1aXJlZC4KICAod2hlbiAocGxpc3QtZ2V0IGluZm8gOnByZXNlcnZlLWJyZWFrcykK ICAgIChzZXRxIHRleHQgKHJlcGxhY2UtcmVnZXhwLWluLXN0cmluZyAiXFwoXFxcXFxcXFxcXCk/ WyBcdF0qXG4iICIgQCpcbiIKCQkJCQkgdGV4dCkpKQogIDs7IFJldHVybiB2YWx1ZS4KICB0ZXh0 KQoKCjs7OzsgUGxhbm5pbmcKCihkZWZ1biBvcmctZS10ZXhpbmZvLXBsYW5uaW5nIChwbGFubmlu ZyBjb250ZW50cyBpbmZvKQogICJUcmFuc2NvZGUgYSBQTEFOTklORyBlbGVtZW50IGZyb20gT3Jn IHRvIFRleGluZm8uCkNPTlRFTlRTIGlzIG5pbC4gIElORk8gaXMgYSBwbGlzdCBob2xkaW5nIGNv bnRleHR1YWwKaW5mb3JtYXRpb24uIgogIChjb25jYXQKICAgIkBub2luZGVudCIKICAgKG1hcGNv bmNhdAogICAgJ2lkZW50aXR5CiAgICAoZGVscSBuaWwKCSAgKGxpc3QKCSAgIChsZXQgKChjbG9z ZWQgKG9yZy1lbGVtZW50LXByb3BlcnR5IDpjbG9zZWQgcGxhbm5pbmcpKSkKCSAgICAgKHdoZW4g Y2xvc2VkCgkgICAgICAgKGNvbmNhdAoJCShmb3JtYXQgIkBzdHJvbmclc30gIiBvcmctY2xvc2Vk LXN0cmluZykKCQkoZm9ybWF0IG9yZy1lLXRleGluZm8taW5hY3RpdmUtdGltZXN0YW1wLWZvcm1h dAoJCQkob3JnLXRyYW5zbGF0ZS10aW1lIGNsb3NlZCkpKSkpCgkgICAobGV0ICgoZGVhZGxpbmUg KG9yZy1lbGVtZW50LXByb3BlcnR5IDpkZWFkbGluZSBwbGFubmluZykpKQoJICAgICAod2hlbiBk ZWFkbGluZQoJICAgICAgIChjb25jYXQKCQkoZm9ybWF0ICJAc3Ryb25neyVzfSAiIG9yZy1kZWFk bGluZS1zdHJpbmcpCgkJKGZvcm1hdCBvcmctZS10ZXhpbmZvLWFjdGl2ZS10aW1lc3RhbXAtZm9y bWF0CgkJCShvcmctdHJhbnNsYXRlLXRpbWUgZGVhZGxpbmUpKSkpKQoJICAgKGxldCAoKHNjaGVk dWxlZCAob3JnLWVsZW1lbnQtcHJvcGVydHkgOnNjaGVkdWxlZCBwbGFubmluZykpKQoJICAgICAo d2hlbiBzY2hlZHVsZWQKCSAgICAgICAoY29uY2F0CgkJKGZvcm1hdCAiQHN0cm9uZ3slc30gIiBv cmctc2NoZWR1bGVkLXN0cmluZykKCQkoZm9ybWF0IG9yZy1lLXRleGluZm8tYWN0aXZlLXRpbWVz dGFtcC1mb3JtYXQKCQkJKG9yZy10cmFuc2xhdGUtdGltZSBzY2hlZHVsZWQpKSkpKSkpCiAgICAi ICIpCiAgICJAKiIpKQoKCjs7OzsgUHJvcGVydHkgRHJhd2VyCgooZGVmdW4gb3JnLWUtdGV4aW5m by1wcm9wZXJ0eS1kcmF3ZXIgKHByb3BlcnR5LWRyYXdlciBjb250ZW50cyBpbmZvKQogICJUcmFu c2NvZGUgYSBQUk9QRVJUWS1EUkFXRVIgZWxlbWVudCBmcm9tIE9yZyB0byBUZXhpbmZvLgpDT05U RU5UUyBpcyBuaWwuICBJTkZPIGlzIGEgcGxpc3QgaG9sZGluZyBjb250ZXh0dWFsCmluZm9ybWF0 aW9uLiIKICA7OyBUaGUgcHJvcGVydHkgZHJhd2VyIGlzbid0IGV4cG9ydGVkIGJ1dCB3ZSB3YW50 IHNlcGFyYXRpbmcgYmxhbmsKICA7OyBsaW5lcyBub25ldGhlbGVzcy4KICAiIikKCgo7Ozs7IFF1 b3RlIEJsb2NrCgoKCihkZWZ1biBvcmctZS10ZXhpbmZvLXF1b3RlLWJsb2NrIChxdW90ZS1ibG9j ayBjb250ZW50cyBpbmZvKQogICJUcmFuc2NvZGUgYSBRVU9URS1CTE9DSyBlbGVtZW50IGZyb20g T3JnIHRvIFRleGluZm8uCkNPTlRFTlRTIGhvbGRzIHRoZSBjb250ZW50cyBvZiB0aGUgYmxvY2su ICBJTkZPIGlzIGEgcGxpc3QKaG9sZGluZyBjb250ZXh0dWFsIGluZm9ybWF0aW9uLiIKICAKICAo bGV0KiAoKHRpdGxlIChvcmctZWxlbWVudC1wcm9wZXJ0eSA6bmFtZSBxdW90ZS1ibG9jaykpCgkg KHN0YXJ0LXF1b3RlIChjb25jYXQgIkBxdW90YXRpb24iCgoJCQkgICAgICAoaWYgdGl0bGUKCQkJ CSAoZm9ybWF0ICIgJXMiIHRpdGxlKSkpKSkKICAgIAogICAgKGZvcm1hdCAiJXNcbiVzQGVuZCBx dW90YXRpb24iIHN0YXJ0LXF1b3RlIGNvbnRlbnRzKSkpCgoKCjs7OzsgUXVvdGUgU2VjdGlvbgoK KGRlZnVuIG9yZy1lLXRleGluZm8tcXVvdGUtc2VjdGlvbiAocXVvdGUtc2VjdGlvbiBjb250ZW50 cyBpbmZvKQogICJUcmFuc2NvZGUgYSBRVU9URS1TRUNUSU9OIGVsZW1lbnQgZnJvbSBPcmcgdG8g VGV4aW5mby4KQ09OVEVOVFMgaXMgbmlsLiAgSU5GTyBpcyBhIHBsaXN0IGhvbGRpbmcgY29udGV4 dHVhbCBpbmZvcm1hdGlvbi4iCiAgKGxldCAoKHZhbHVlIChvcmctcmVtb3ZlLWluZGVudGF0aW9u CgkJKG9yZy1lbGVtZW50LXByb3BlcnR5IDp2YWx1ZSBxdW90ZS1zZWN0aW9uKSkpKQogICAgKHdo ZW4gdmFsdWUgKGZvcm1hdCAiQHZlcmJhdGltXG4lc0BlbmQgdmVyYmF0aW0iIHZhbHVlKSkpKQoK Cjs7OzsgUmFkaW8gVGFyZ2V0Cjs7Cjs7IFJhZGlvIHRhcmdldHMgYXJlIG5vdCBleHBvcnRlZCBh dCB0aGUgbW9tZW50CgoKOzs7OyBTZWN0aW9uCgooZGVmdW4gb3JnLWUtdGV4aW5mby1zZWN0aW9u IChzZWN0aW9uIGNvbnRlbnRzIGluZm8pCiAgIlRyYW5zY29kZSBhIFNFQ1RJT04gZWxlbWVudCBm cm9tIE9yZyB0byBUZXhpbmZvLgpDT05URU5UUyBob2xkcyB0aGUgY29udGVudHMgb2YgdGhlIHNl Y3Rpb24uICBJTkZPIGlzIGEgcGxpc3QKaG9sZGluZyBjb250ZXh0dWFsIGluZm9ybWF0aW9uLiIK ICBjb250ZW50cykKCgo7Ozs7IFNwZWNpYWwgQmxvY2sKOzsKOzsgQXJlIGlnbm9yZWQgYXQgdGhl IG1vbWVudAoKOzs7OyBTcmMgQmxvY2sKCihkZWZ1biBvcmctZS10ZXhpbmZvLXNyYy1ibG9jayAo c3JjLWJsb2NrIGNvbnRlbnRzIGluZm8pCiAgIlRyYW5zY29kZSBhIFNSQy1CTE9DSyBlbGVtZW50 IGZyb20gT3JnIHRvIFRleGluZm8uCkNPTlRFTlRTIGhvbGRzIHRoZSBjb250ZW50cyBvZiB0aGUg aXRlbS4gIElORk8gaXMgYSBwbGlzdCBob2xkaW5nCmNvbnRleHR1YWwgaW5mb3JtYXRpb24uIgog IChsZXQqICgobGFuZyAob3JnLWVsZW1lbnQtcHJvcGVydHkgOmxhbmd1YWdlIHNyYy1ibG9jaykp CgkgKGxpc3AtcCAoc3RyaW5nLW1hdGNoLXAgImxpc3AiIGxhbmcpKSkKICAgIChjb25kCiAgICAg OzsgQ2FzZSAxLiAgTGlzcCBCbG9jawogICAgIChsaXNwLXAKICAgICAgKGZvcm1hdCAiQGxpc3Bc biVzXG5AZW5kIGxpc3AiIGNvbnRlbnRzKSkKICAgICA7OyBDYXNlIDIuICBPdGhlciBibG9ja3MK ICAgICAodAogICAgICAoZm9ybWF0ICJAZXhhbXBsZVxuJXNcbkBlbmQgZXhhbXBsZSIgY29udGVu dHMpKSkpKQoKCjs7OzsgU3RhdGlzdGljcyBDb29raWUKCihkZWZ1biBvcmctZS10ZXhpbmZvLXN0 YXRpc3RpY3MtY29va2llIChzdGF0aXN0aWNzLWNvb2tpZSBjb250ZW50cyBpbmZvKQogICJUcmFu c2NvZGUgYSBTVEFUSVNUSUNTLUNPT0tJRSBvYmplY3QgZnJvbSBPcmcgdG8gVGV4aW5mby4KQ09O VEVOVFMgaXMgbmlsLiAgSU5GTyBpcyBhIHBsaXN0IGhvbGRpbmcgY29udGV4dHVhbCBpbmZvcm1h dGlvbi4iCiAgKG9yZy1lbGVtZW50LXByb3BlcnR5IDp2YWx1ZSBzdGF0aXN0aWNzLWNvb2tpZSkp CgoKOzs7OyBTdHJpa2UtVGhyb3VnaAo7Owo7OyBTdHJpa2V0aHJvdWdoIGlzIGlnbm9yZWQKCgo7 Ozs7IFN1YnNjcmlwdAoKKGRlZnVuIG9yZy1lLXRleGluZm8tc3Vic2NyaXB0IChzdWJzY3JpcHQg Y29udGVudHMgaW5mbykKICAiVHJhbnNjb2RlIGEgU1VCU0NSSVBUIG9iamVjdCBmcm9tIE9yZyB0 byBUZXhpbmZvLgpDT05URU5UUyBpcyB0aGUgY29udGVudHMgb2YgdGhlIG9iamVjdC4gIElORk8g aXMgYSBwbGlzdCBob2xkaW5nCmNvbnRleHR1YWwgaW5mb3JtYXRpb24uIgogIChmb3JtYXQgKGlm ICg9IChsZW5ndGggY29udGVudHMpIDEpICIkXyVzJCIgIiRfe1xcbWF0aHJteyVzfX0kIikgY29u dGVudHMpKQoKCjs7OzsgU3VwZXJzY3JpcHQKCihkZWZ1biBvcmctZS10ZXhpbmZvLXN1cGVyc2Ny aXB0IChzdXBlcnNjcmlwdCBjb250ZW50cyBpbmZvKQogICJUcmFuc2NvZGUgYSBTVVBFUlNDUklQ VCBvYmplY3QgZnJvbSBPcmcgdG8gVGV4aW5mby4KQ09OVEVOVFMgaXMgdGhlIGNvbnRlbnRzIG9m IHRoZSBvYmplY3QuICBJTkZPIGlzIGEgcGxpc3QgaG9sZGluZwpjb250ZXh0dWFsIGluZm9ybWF0 aW9uLiIKICAoZm9ybWF0IChpZiAoPSAobGVuZ3RoIGNvbnRlbnRzKSAxKSAiJF4lcyQiICIkXntc XG1hdGhybXslc319JCIpIGNvbnRlbnRzKSkKCgo7Ozs7IFRhYmxlCjs7Cjs7IGBvcmctZS10ZXhp bmZvLXRhYmxlJyBpcyB0aGUgZW50cnkgcG9pbnQgZm9yIHRhYmxlIHRyYW5zY29kaW5nLiAgSXQK OzsgdGFrZXMgY2FyZSBvZiB0YWJsZXMgd2l0aCBhICJ2ZXJiYXRpbSIgYXR0cmlidXRlLiAgT3Ro ZXJ3aXNlLCBpdAo7OyBkZWxlZ2F0ZXMgdGhlIGpvYiB0byBlaXRoZXIgYG9yZy1lLXRleGluZm8t dGFibGUtLXRhYmxlLmVsLXRhYmxlJyBvcgo7OyBgb3JnLWUtdGV4aW5mby10YWJsZS0tb3JnLXRh YmxlJyBmdW5jdGlvbnMsIGRlcGVuZGluZyBvZiB0aGUgdHlwZSBvZgo7OyB0aGUgdGFibGUuCjs7 Cjs7IGBvcmctZS10ZXhpbmZvLXRhYmxlLS1hbGlnbi1zdHJpbmcnIGlzIGEgc3Vicm91dGluZSB1 c2VkIHRvIGJ1aWxkCjs7IGFsaWdubWVudCBzdHJpbmcgZm9yIE9yZyB0YWJsZXMuCgooZGVmdW4g b3JnLWUtdGV4aW5mby10YWJsZSAodGFibGUgY29udGVudHMgaW5mbykKICAiVHJhbnNjb2RlIGEg VEFCTEUgZWxlbWVudCBmcm9tIE9yZyB0byBUZXhpbmZvLgpDT05URU5UUyBpcyB0aGUgY29udGVu dHMgb2YgdGhlIHRhYmxlLiAgSU5GTyBpcyBhIHBsaXN0IGhvbGRpbmcKY29udGV4dHVhbCBpbmZv cm1hdGlvbi4iCiAgKGNvbmQKICAgOzsgQ2FzZSAxOiB2ZXJiYXRpbSB0YWJsZS4KICAgKChvciBv cmctZS10ZXhpbmZvLXRhYmxlcy12ZXJiYXRpbQoJKGxldCAoKGF0dHIgKG1hcGNvbmNhdCAnaWRl bnRpdHkKCQkJICAgICAgIChvcmctZWxlbWVudC1wcm9wZXJ0eSA6YXR0cl9sYXRleCB0YWJsZSkK CQkJICAgICAgICIgIikpKQoJICAoYW5kIGF0dHIgKHN0cmluZy1tYXRjaCAiXFw8dmVyYmF0aW1c XD4iIGF0dHIpKSkpCiAgICAoZm9ybWF0ICJAdmVyYmF0aW0gXG4lc1xuQGVuZCB2ZXJiYXRpbSIK CSAgICA7OyBSZS1jcmVhdGUgdGFibGUsIHdpdGhvdXQgYWZmaWxpYXRlZCBrZXl3b3Jkcy4KCSAg ICAob3JnLXRyaW0KCSAgICAgKG9yZy1lbGVtZW50LWludGVycHJldC1kYXRhCgkgICAgICBgKHRh YmxlIG5pbCAsQChvcmctZWxlbWVudC1jb250ZW50cyB0YWJsZSkpKSkpKQogICA7OyBDYXNlIDI6 IHRhYmxlLmVsIHRhYmxlLiAgQ29udmVydCBpdCB1c2luZyBhcHByb3ByaWF0ZSB0b29scy4KICAg KChlcSAob3JnLWVsZW1lbnQtcHJvcGVydHkgOnR5cGUgdGFibGUpICd0YWJsZS5lbCkKICAgIChv cmctZS10ZXhpbmZvLXRhYmxlLS10YWJsZS5lbC10YWJsZSB0YWJsZSBjb250ZW50cyBpbmZvKSkK ICAgOzsgQ2FzZSAzOiBTdGFuZGFyZCB0YWJsZS4KICAgKHQgKG9yZy1lLXRleGluZm8tdGFibGUt LW9yZy10YWJsZSB0YWJsZSBjb250ZW50cyBpbmZvKSkpKQoKKGRlZnVuIG9yZy1lLXRleGluZm8t dGFibGUtY29sdW1uLXdpZHRocyAodGFibGUgaW5mbykKICAiRGV0ZXJtaW5lIHRoZSBsYXJnZXN0 IHRhYmxlIGNlbGwgaW4gZWFjaCBjb2x1bW4gdG8gcHJvY2VzcyBhbGlnbm1lbnQuCgpUQUJMRSBp cyB0aGUgdGFibGUgZWxlbWVudCB0byB0cmFuc2NvZGUuICBJTkZPIGlzIGEgcGxpc3QgdXNlZCBh cwphIGNvbW11bmljYXRpb24gY2hhbm5lbC4iCiAgKGxldCogKChyb3dzIChvcmctZWxlbWVudC1t YXAgdGFibGUgJ3RhYmxlLXJvdyAnaWRlbnRpdHkgaW5mbykpCgkgKGNvbGxlY3RlZCAobG9vcCBm b3Igcm93IGluIHJvd3MgY29sbGVjdAoJCQkgIChvcmctZWxlbWVudC1tYXAKCQkJICAgcm93ICd0 YWJsZS1jZWxsICdpZGVudGl0eSBpbmZvKSkpCgkgKG51bWJlci1jZWxscyAobGVuZ3RoIChjYXIg Y29sbGVjdGVkKSkpCgkgY2VsbHMgY291bnRzKQogICAgKGxvb3AgZm9yIHJvdyBpbiBjb2xsZWN0 ZWQgZG8KCSAgKHB1c2ggKG1hcGNhciAobGFtYmRhIChyZWYpCgkJICAgICAobGV0KiAoKHN0YXJ0 IChvcmctZWxlbWVudC1wcm9wZXJ0eSA6Y29udGVudHMtYmVnaW4gcmVmKSkKCQkJICAgIChlbmQg KG9yZy1lbGVtZW50LXByb3BlcnR5IDpjb250ZW50cy1lbmQgcmVmKSkKCQkJICAgIChsZW5ndGgg KC0gZW5kIHN0YXJ0KSkpCgkJICAgICAgIGxlbmd0aCkpIHJvdykgY2VsbHMpKQogICAgKHNldHEg Y2VsbHMgKHJlbW92ZS1pZiAjJ251bGwgY2VsbHMpKQogICAgKHB1c2ggKGxvb3AgZm9yIGNvdW50 IGZyb20gMCB0byAoLSBudW1iZXItY2VsbHMgMSkgY29sbGVjdAoJCSAgIChsb29wIGZvciBpdGVt IGluIGNlbGxzIGNvbGxlY3QKCQkJIChudGggY291bnQgaXRlbSkpKSBjb3VudHMpCiAgICAobWFw Y29uY2F0ICcobGFtYmRhIChzaXplKQoJCSAgKG1ha2Utc3RyaW5nIHNpemUgP2EpKSAobWFwY2Fy IChsYW1iZGEgKHJlZikKCQkJCSAgIChhcHBseSAnbWF4IGAsQHJlZikpIChjYXIgY291bnRzKSkK CSAgICAgICAifSB7IikKICApKQoKKGRlZnVuIG9yZy1lLXRleGluZm8tdGFibGUtLW9yZy10YWJs ZSAodGFibGUgY29udGVudHMgaW5mbykKICAiUmV0dXJuIGFwcHJvcHJpYXRlIFRleGluZm8gY29k ZSBmb3IgYW4gT3JnIHRhYmxlLgoKVEFCTEUgaXMgdGhlIHRhYmxlIHR5cGUgZWxlbWVudCB0byB0 cmFuc2NvZGUuICBDT05URU5UUyBpcyBpdHMKY29udGVudHMsIGFzIGEgc3RyaW5nLiAgSU5GTyBp cyBhIHBsaXN0IHVzZWQgYXMgYSBjb21tdW5pY2F0aW9uCmNoYW5uZWwuCgpUaGlzIGZ1bmN0aW9u IGFzc3VtZXMgVEFCTEUgaGFzIGBvcmcnIGFzIGl0cyBgOnR5cGUnIGF0dHJpYnV0ZS4iCiAgKGxl dCogKAoJIChjb2x1bW5zIChvcmctZS10ZXhpbmZvLXRhYmxlLWNvbHVtbi13aWR0aHMgdGFibGUg aW5mbykpCgkgKQogICAgOzsgUHJlcGFyZSB0aGUgZmluYWwgZm9ybWF0IHN0cmluZyBmb3IgdGhl IHRhYmxlLgogICAgKGNvbmQKICAgICA7OyBMb25ndGFibGUuCiAgICAgOzsgT3RoZXJzLgogICAg ICh0IChjb25jYXQKCSAoZm9ybWF0ICJAbXVsdGl0YWJsZSB7JXN9XG4lc0BlbmQgbXVsdGl0YWJs ZSIKCQkgY29sdW1ucwoJCSBjb250ZW50cykpKSkpKQoKKGRlZnVuIG9yZy1lLXRleGluZm8tdGFi bGUtLXRhYmxlLmVsLXRhYmxlICh0YWJsZSBjb250ZW50cyBpbmZvKQogICJSZXR1cm4gYXBwcm9w cmlhdGUgVGV4aW5mbyBjb2RlIGZvciBhIHRhYmxlLmVsIHRhYmxlLgoKVEFCTEUgaXMgdGhlIHRh YmxlIHR5cGUgZWxlbWVudCB0byB0cmFuc2NvZGUuICBDT05URU5UUyBpcyBpdHMKY29udGVudHMs IGFzIGEgc3RyaW5nLiAgSU5GTyBpcyBhIHBsaXN0IHVzZWQgYXMgYSBjb21tdW5pY2F0aW9uCmNo YW5uZWwuCgpUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgVEFCTEUgaGFzIGB0YWJsZS5lbCcgYXMgaXRz IGA6dHlwZScKYXR0cmlidXRlLiIKICAocmVxdWlyZSAndGFibGUpCiAgOzsgRW5zdXJlICIqb3Jn LWV4cG9ydC10YWJsZSoiIGJ1ZmZlciBpcyBlbXB0eS4KICAod2l0aC1jdXJyZW50LWJ1ZmZlciAo Z2V0LWJ1ZmZlci1jcmVhdGUgIipvcmctZXhwb3J0LXRhYmxlKiIpCiAgICAoZXJhc2UtYnVmZmVy KSkKICAobGV0ICgob3V0cHV0ICh3aXRoLXRlbXAtYnVmZmVyCgkJICAoaW5zZXJ0IChvcmctZWxl bWVudC1wcm9wZXJ0eSA6dmFsdWUgdGFibGUpKQoJCSAgKGdvdG8tY2hhciAxKQoJCSAgKHJlLXNl YXJjaC1mb3J3YXJkICJeWyBcdF0qfFtefF0iIG5pbCB0KQoJCSAgKHRhYmxlLWdlbmVyYXRlLXNv dXJjZSAnbGF0ZXggIipvcmctZXhwb3J0LXRhYmxlKiIpCgkJICAod2l0aC1jdXJyZW50LWJ1ZmZl ciAiKm9yZy1leHBvcnQtdGFibGUqIgoJCSAgICAob3JnLXRyaW0gKGJ1ZmZlci1zdHJpbmcpKSkp KSkKICAgIChraWxsLWJ1ZmZlciAoZ2V0LWJ1ZmZlciAiKm9yZy1leHBvcnQtdGFibGUqIikpCiAg ICA7OyBSZW1vdmUgbGVmdCBvdXQgY29tbWVudHMuCiAgICAod2hpbGUgKHN0cmluZy1tYXRjaCAi XiUuKlxuIiBvdXRwdXQpCiAgICAgIChzZXRxIG91dHB1dCAocmVwbGFjZS1tYXRjaCAiIiB0IHQg b3V0cHV0KSkpCiAgICA7OyBXaGVuIHRoZSAicm1saW5lcyIgYXR0cmlidXRlIGlzIHByb3ZpZGVk LCByZW1vdmUgYWxsIGhsaW5lcyBidXQKICAgIDs7IHRoZSB0aGUgb25lIHNlcGFyYXRpbmcgaGVh ZGluZyBmcm9tIHRoZSB0YWJsZSBib2R5LgogICAgKGxldCAoKGF0dHIgKG1hcGNvbmNhdCAnaWRl bnRpdHkKCQkJICAgKG9yZy1lbGVtZW50LXByb3BlcnR5IDphdHRyX2xhdGV4IHRhYmxlKQoJCQkg ICAiICIpKSkKICAgICAgKHdoZW4gKGFuZCBhdHRyIChzdHJpbmctbWF0Y2ggIlxcPHJtbGluZXNc XD4iIGF0dHIpKQoJKGxldCAoKG4gMCkgKHBvcyAwKSkKCSAgKHdoaWxlIChhbmQgKDwgKGxlbmd0 aCBvdXRwdXQpIHBvcykKCQkgICAgICAoc2V0cSBwb3MgKHN0cmluZy1tYXRjaCAiXlxcXFxobGlu ZVxuPyIgb3V0cHV0IHBvcykpKQoJICAgIChpbmNmIG4pCgkgICAgKHVubGVzcyAoPSBuIDIpCgkg ICAgICAoc2V0cSBvdXRwdXQgKHJlcGxhY2UtbWF0Y2ggIiIgbmlsIG5pbCBvdXRwdXQpKSkpKSkp CiAgICAoaWYgKG5vdCBvcmctZS10ZXhpbmZvLXRhYmxlcy1jZW50ZXJlZCkgb3V0cHV0CiAgICAg IChmb3JtYXQgIlxcYmVnaW57Y2VudGVyfVxuJXNcblxcZW5ke2NlbnRlcn0iIG91dHB1dCkpKSkK Cgo7Ozs7IFRhYmxlIENlbGwKCihkZWZ1biBvcmctZS10ZXhpbmZvLXRhYmxlLWNlbGwgKHRhYmxl LWNlbGwgY29udGVudHMgaW5mbykKICAiVHJhbnNjb2RlIGEgVEFCTEUtQ0VMTCBlbGVtZW50IGZy b20gT3JnIHRvIFRleGluZm8uCkNPTlRFTlRTIGlzIHRoZSBjZWxsIGNvbnRlbnRzLiAgSU5GTyBp cyBhIHBsaXN0IHVzZWQgYXMKYSBjb21tdW5pY2F0aW9uIGNoYW5uZWwuIgogIChjb25jYXQgKGlm IChhbmQgY29udGVudHMKCQkgICBvcmctZS10ZXhpbmZvLXRhYmxlLXNjaWVudGlmaWMtbm90YXRp b24KCQkgICAoc3RyaW5nLW1hdGNoIG9yZ3RibC1leHAtcmVnZXhwIGNvbnRlbnRzKSkKCSAgICAg IDs7IFVzZSBhcHByb3ByaWF0ZSBmb3JtYXQgc3RyaW5nIGZvciBzY2llbnRpZmljCgkgICAgICA7 OyBub3RhdGlvbi4KCSAgICAgIChmb3JtYXQgb3JnLWUtdGV4aW5mby10YWJsZS1zY2llbnRpZmlj LW5vdGF0aW9uCgkJICAgICAgKG1hdGNoLXN0cmluZyAxIGNvbnRlbnRzKQoJCSAgICAgIChtYXRj aC1zdHJpbmcgMiBjb250ZW50cykpCgkgICAgY29udGVudHMpCgkgICh3aGVuIChvcmctZXhwb3J0 LWdldC1uZXh0LWVsZW1lbnQgdGFibGUtY2VsbCkgIlxuQHRhYiAiKSkpCgoKOzs7OyBUYWJsZSBS b3cKCihkZWZ1biBvcmctZS10ZXhpbmZvLXRhYmxlLXJvdyAodGFibGUtcm93IGNvbnRlbnRzIGlu Zm8pCiAgIlRyYW5zY29kZSBhIFRBQkxFLVJPVyBlbGVtZW50IGZyb20gT3JnIHRvIFRleGluZm8u CkNPTlRFTlRTIGlzIHRoZSBjb250ZW50cyBvZiB0aGUgcm93LiAgSU5GTyBpcyBhIHBsaXN0IHVz ZWQgYXMKYSBjb21tdW5pY2F0aW9uIGNoYW5uZWwuIgogIDs7IFJ1bGVzIGFyZSBpZ25vcmVkIHNp bmNlIHRhYmxlIHNlcGFyYXRvcnMgYXJlIGRlZHVjZWQgZnJvbQogIDs7IGJvcmRlcnMgb2YgdGhl IGN1cnJlbnQgcm93LgogICh3aGVuIChlcSAob3JnLWVsZW1lbnQtcHJvcGVydHkgOnR5cGUgdGFi bGUtcm93KSAnc3RhbmRhcmQpIAogICAgKGNvbmNhdCAiQGl0ZW0gIiBjb250ZW50cyAiXG4iKSkp CgoKOzs7OyBUYXJnZXQKCihkZWZ1biBvcmctZS10ZXhpbmZvLXRhcmdldCAodGFyZ2V0IGNvbnRl bnRzIGluZm8pCiAgIlRyYW5zY29kZSBhIFRBUkdFVCBvYmplY3QgZnJvbSBPcmcgdG8gVGV4aW5m by4KQ09OVEVOVFMgaXMgbmlsLiAgSU5GTyBpcyBhIHBsaXN0IGhvbGRpbmcgY29udGV4dHVhbApp bmZvcm1hdGlvbi4iCiAgKGZvcm1hdCAiXFxsYWJlbHslc30iCgkgIChvcmctZXhwb3J0LXNvbGlk aWZ5LWxpbmstdGV4dCAob3JnLWVsZW1lbnQtcHJvcGVydHkgOnZhbHVlIHRhcmdldCkpKSkKCgo7 Ozs7IFRpbWVzdGFtcAoKKGRlZnVuIG9yZy1lLXRleGluZm8tdGltZXN0YW1wICh0aW1lc3RhbXAg Y29udGVudHMgaW5mbykKICAiVHJhbnNjb2RlIGEgVElNRVNUQU1QIG9iamVjdCBmcm9tIE9yZyB0 byBUZXhpbmZvLgpDT05URU5UUyBpcyBuaWwuICBJTkZPIGlzIGEgcGxpc3QgaG9sZGluZyBjb250 ZXh0dWFsCmluZm9ybWF0aW9uLiIKICAobGV0ICgodmFsdWUgKG9yZy10cmFuc2xhdGUtdGltZSAo b3JnLWVsZW1lbnQtcHJvcGVydHkgOnZhbHVlIHRpbWVzdGFtcCkpKQoJKHR5cGUgKG9yZy1lbGVt ZW50LXByb3BlcnR5IDp0eXBlIHRpbWVzdGFtcCkpKQogICAgKGNvbmQgKChtZW1xIHR5cGUgJyhh Y3RpdmUgYWN0aXZlLXJhbmdlKSkKCSAgIChmb3JtYXQgb3JnLWUtdGV4aW5mby1hY3RpdmUtdGlt ZXN0YW1wLWZvcm1hdCB2YWx1ZSkpCgkgICgobWVtcSB0eXBlICcoaW5hY3RpdmUgaW5hY3RpdmUt cmFuZ2UpKQoJICAgKGZvcm1hdCBvcmctZS10ZXhpbmZvLWluYWN0aXZlLXRpbWVzdGFtcC1mb3Jt YXQgdmFsdWUpKQoJICAodCAoZm9ybWF0IG9yZy1lLXRleGluZm8tZGlhcnktdGltZXN0YW1wLWZv cm1hdCB2YWx1ZSkpKSkpCgoKOzs7OyBVbmRlcmxpbmUKOzsKOzsgVW5kZXJsaW5lIGlzIGlnbm9y ZWQKCgo7Ozs7IFZlcmJhdGltCgooZGVmdW4gb3JnLWUtdGV4aW5mby12ZXJiYXRpbSAodmVyYmF0 aW0gY29udGVudHMgaW5mbykKICAiVHJhbnNjb2RlIGEgVkVSQkFUSU0gb2JqZWN0IGZyb20gT3Jn IHRvIFRleGluZm8uCkNPTlRFTlRTIGlzIG5pbC4gIElORk8gaXMgYSBwbGlzdCB1c2VkIGFzIGEg Y29tbXVuaWNhdGlvbgpjaGFubmVsLiIKICAob3JnLWUtdGV4aW5mby0tdGV4dC1tYXJrdXAgKG9y Zy1lbGVtZW50LXByb3BlcnR5IDp2YWx1ZSB2ZXJiYXRpbSkgJ3ZlcmJhdGltKSkKCgo7Ozs7IFZl cnNlIEJsb2NrCgooZGVmdW4gb3JnLWUtdGV4aW5mby12ZXJzZS1ibG9jayAodmVyc2UtYmxvY2sg Y29udGVudHMgaW5mbykKICAiVHJhbnNjb2RlIGEgVkVSU0UtQkxPQ0sgZWxlbWVudCBmcm9tIE9y ZyB0byBUZXhpbmZvLgpDT05URU5UUyBpcyB2ZXJzZSBibG9jayBjb250ZW50cy4gSU5GTyBpcyBh IHBsaXN0IGhvbGRpbmcKY29udGV4dHVhbCBpbmZvcm1hdGlvbi4iCiAgOzsgSW4gYSB2ZXJzZSBl bnZpcm9ubWVudCwgYWRkIGEgbGluZSBicmVhayB0byBlYWNoIG5ld2xpbmUKICA7OyBjaGFyYWN0 ZXIgYW5kIGNoYW5nZSBlYWNoIHdoaXRlIHNwYWNlIGF0IGJlZ2lubmluZyBvZiBhIGxpbmUKICA7 OyBpbnRvIGEgc3BhY2Ugb2YgMSBlbS4gIEFsc28gY2hhbmdlIGVhY2ggYmxhbmsgbGluZSB3aXRo CiAgOzsgYSB2ZXJ0aWNhbCBzcGFjZSBvZiAxIGVtLgogIChwcm9nbgogICAgKHNldHEgY29udGVu dHMgKHJlcGxhY2UtcmVnZXhwLWluLXN0cmluZwoJCSAgICAiXiAqXFxcXFxcXFwkIiAiXFxcXHZz cGFjZSp7MWVtfSIKCQkgICAgKHJlcGxhY2UtcmVnZXhwLWluLXN0cmluZwoJCSAgICAgIlxcKFxc XFxcXFxcXFwpP1sgXHRdKlxuIiAiIFxcXFxcXFxcXG4iIGNvbnRlbnRzKSkpCiAgICAod2hpbGUg KHN0cmluZy1tYXRjaCAiXlsgXHRdKyIgY29udGVudHMpCiAgICAgIChsZXQgKChuZXctc3RyIChm b3JtYXQgIlxcaHNwYWNlKnslZGVtfSIKCQkJICAgICAobGVuZ3RoIChtYXRjaC1zdHJpbmcgMCBj b250ZW50cykpKSkpCgkoc2V0cSBjb250ZW50cyAocmVwbGFjZS1tYXRjaCBuZXctc3RyIG5pbCB0 IGNvbnRlbnRzKSkpKQogICAgKGZvcm1hdCAiXFxiZWdpbnt2ZXJzZX1cbiVzXFxlbmR7dmVyc2V9 IiBjb250ZW50cykpKQoKCgwKOzs7IEludGVyYWN0aXZlIGZ1bmN0aW9ucwoKKGRlZnVuIG9yZy1l LXRleGluZm8tZXhwb3J0LXRvLXRleGluZm8KICAoJm9wdGlvbmFsIHN1YnRyZWVwIHZpc2libGUt b25seSBib2R5LW9ubHkgZXh0LXBsaXN0IHB1Yi1kaXIpCiAgIkV4cG9ydCBjdXJyZW50IGJ1ZmZl ciB0byBhIFRleGluZm8gZmlsZS4KCklmIG5hcnJvd2luZyBpcyBhY3RpdmUgaW4gdGhlIGN1cnJl bnQgYnVmZmVyLCBvbmx5IGV4cG9ydCBpdHMKbmFycm93ZWQgcGFydC4KCklmIGEgcmVnaW9uIGlz IGFjdGl2ZSwgZXhwb3J0IHRoYXQgcmVnaW9uLgoKV2hlbiBvcHRpb25hbCBhcmd1bWVudCBTVUJU UkVFUCBpcyBub24tbmlsLCBleHBvcnQgdGhlIHN1Yi10cmVlCmF0IHBvaW50LCBleHRyYWN0aW5n IGluZm9ybWF0aW9uIGZyb20gdGhlIGhlYWRsaW5lIHByb3BlcnRpZXMKZmlyc3QuCgpXaGVuIG9w dGlvbmFsIGFyZ3VtZW50IFZJU0lCTEUtT05MWSBpcyBub24tbmlsLCBkb24ndCBleHBvcnQKY29u dGVudHMgb2YgaGlkZGVuIGVsZW1lbnRzLgoKV2hlbiBvcHRpb25hbCBhcmd1bWVudCBCT0RZLU9O TFkgaXMgbm9uLW5pbCwgb25seSB3cml0ZSBjb2RlCmJldHdlZW4gXCJcXGJlZ2lue2RvY3VtZW50 fVwiIGFuZCBcIlxcZW5ke2RvY3VtZW50fVwiLgoKRVhULVBMSVNULCB3aGVuIHByb3ZpZGVkLCBp cyBhIHByb3BlcnR5IGxpc3Qgd2l0aCBleHRlcm5hbApwYXJhbWV0ZXJzIG92ZXJyaWRpbmcgT3Jn IGRlZmF1bHQgc2V0dGluZ3MsIGJ1dCBzdGlsbCBpbmZlcmlvciB0bwpmaWxlLWxvY2FsIHNldHRp bmdzLgoKV2hlbiBvcHRpb25hbCBhcmd1bWVudCBQVUItRElSIGlzIHNldCwgdXNlIGl0IGFzIHRo ZSBwdWJsaXNoaW5nCmRpcmVjdG9yeS4KClJldHVybiBvdXRwdXQgZmlsZSdzIG5hbWUuIgogIChp bnRlcmFjdGl2ZSkKICAobGV0ICgob3V0ZmlsZSAob3JnLWV4cG9ydC1vdXRwdXQtZmlsZS1uYW1l ICIudGV4aSIgc3VidHJlZXAgcHViLWRpcikpKQogICAgKG9yZy1leHBvcnQtdG8tZmlsZQogICAg ICdlLXRleGluZm8gb3V0ZmlsZSBzdWJ0cmVlcCB2aXNpYmxlLW9ubHkgYm9keS1vbmx5IGV4dC1w bGlzdCkpKQoKKGRlZnVuIG9yZy1lLXRleGluZm8tZXhwb3J0LXRvLWluZm8KICAoJm9wdGlvbmFs IHN1YnRyZWVwIHZpc2libGUtb25seSBib2R5LW9ubHkgZXh0LXBsaXN0IHB1Yi1kaXIpCiAgIkV4 cG9ydCBjdXJyZW50IGJ1ZmZlciB0byBUZXhpbmZvIHRoZW4gcHJvY2VzcyB0aHJvdWdoIHRvIElO Rk8uCgpJZiBuYXJyb3dpbmcgaXMgYWN0aXZlIGluIHRoZSBjdXJyZW50IGJ1ZmZlciwgb25seSBl eHBvcnQgaXRzCm5hcnJvd2VkIHBhcnQuCgpJZiBhIHJlZ2lvbiBpcyBhY3RpdmUsIGV4cG9ydCB0 aGF0IHJlZ2lvbi4KCldoZW4gb3B0aW9uYWwgYXJndW1lbnQgU1VCVFJFRVAgaXMgbm9uLW5pbCwg ZXhwb3J0IHRoZSBzdWItdHJlZQphdCBwb2ludCwgZXh0cmFjdGluZyBpbmZvcm1hdGlvbiBmcm9t IHRoZSBoZWFkbGluZSBwcm9wZXJ0aWVzCmZpcnN0LgoKV2hlbiBvcHRpb25hbCBhcmd1bWVudCBW SVNJQkxFLU9OTFkgaXMgbm9uLW5pbCwgZG9uJ3QgZXhwb3J0CmNvbnRlbnRzIG9mIGhpZGRlbiBl bGVtZW50cy4KCldoZW4gb3B0aW9uYWwgYXJndW1lbnQgQk9EWS1PTkxZIGlzIG5vbi1uaWwsIG9u bHkgd3JpdGUgY29kZQpiZXR3ZWVuIFwiXFxiZWdpbntkb2N1bWVudH1cIiBhbmQgXCJcXGVuZHtk b2N1bWVudH1cIi4KCkVYVC1QTElTVCwgd2hlbiBwcm92aWRlZCwgaXMgYSBwcm9wZXJ0eSBsaXN0 IHdpdGggZXh0ZXJuYWwKcGFyYW1ldGVycyBvdmVycmlkaW5nIE9yZyBkZWZhdWx0IHNldHRpbmdz LCBidXQgc3RpbGwgaW5mZXJpb3IgdG8KZmlsZS1sb2NhbCBzZXR0aW5ncy4KCldoZW4gb3B0aW9u YWwgYXJndW1lbnQgUFVCLURJUiBpcyBzZXQsIHVzZSBpdCBhcyB0aGUgcHVibGlzaGluZwpkaXJl Y3RvcnkuCgpSZXR1cm4gSU5GTyBmaWxlJ3MgbmFtZS4iCiAgKGludGVyYWN0aXZlKQogIChvcmct ZS10ZXhpbmZvLWNvbXBpbGUKICAgKG9yZy1lLXRleGluZm8tZXhwb3J0LXRvLXRleGluZm8KICAg IHN1YnRyZWVwIHZpc2libGUtb25seSBib2R5LW9ubHkgZXh0LXBsaXN0IHB1Yi1kaXIpKSkKCihk ZWZ1biBvcmctZS10ZXhpbmZvLWNvbXBpbGUgKHRleGlmaWxlKQogICJDb21waWxlIGEgdGV4aW5m byBmaWxlLgoKVEVYSUZJTEUgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgYmVpbmcgY29tcGlsZWQu ICBQcm9jZXNzaW5nIGlzCmRvbmUgdGhyb3VnaCB0aGUgY29tbWFuZCBzcGVjaWZpZWQgaW4gYG9y Zy1lLXRleGluZm8taW5mby1wcm9jZXNzJy4KClJldHVybiBJTkZPIGZpbGUgbmFtZSBvciBhbiBl cnJvciBpZiBpdCBjb3VsZG4ndCBiZSBwcm9kdWNlZC4iCiAgKGxldCogKCh3Y29uZmlnIChjdXJy ZW50LXdpbmRvdy1jb25maWd1cmF0aW9uKSkKCSAodGV4aWZpbGUgKGZpbGUtdHJ1ZW5hbWUgdGV4 aWZpbGUpKQoJIChiYXNlIChmaWxlLW5hbWUtc2Fucy1leHRlbnNpb24gdGV4aWZpbGUpKQoJIGVy cm9ycykKICAgIChtZXNzYWdlIChmb3JtYXQgIlByb2Nlc3NpbmcgVGV4aW5mbyBmaWxlICVzIC4u LiIgdGV4aWZpbGUpKQogICAgKHVud2luZC1wcm90ZWN0CgkocHJvZ24KCSAgKGNvbmQKCSAgIDs7 IEEgZnVuY3Rpb24gaXMgcHJvdmlkZWQ6IEFwcGx5IGl0LgoJICAgKChmdW5jdGlvbnAgb3JnLWUt dGV4aW5mby1pbmZvLXByb2Nlc3MpCgkgICAgKGZ1bmNhbGwgb3JnLWUtdGV4aW5mby1pbmZvLXBy b2Nlc3MgKHNoZWxsLXF1b3RlLWFyZ3VtZW50IHRleGlmaWxlKSkpCgkgICA7OyBBIGxpc3QgaXMg cHJvdmlkZWQ6IFJlcGxhY2UgJWIsICVmIGFuZCAlbyB3aXRoIGFwcHJvcHJpYXRlCgkgICA7OyB2 YWx1ZXMgaW4gZWFjaCBjb21tYW5kIGJlZm9yZSBhcHBseWluZyBpdC4gIE91dHB1dCBpcwoJICAg OzsgcmVkaXJlY3RlZCB0byAiKk9yZyBJTkZPIFRleGluZm8gT3V0cHV0KiIgYnVmZmVyLgoJICAg KChjb25zcCBvcmctZS10ZXhpbmZvLWluZm8tcHJvY2VzcykKCSAgICAobGV0KiAoKG91dC1kaXIg KG9yIChmaWxlLW5hbWUtZGlyZWN0b3J5IHRleGlmaWxlKSAiLi8iKSkKCQkgICAob3V0YnVmIChn ZXQtYnVmZmVyLWNyZWF0ZSAiKk9yZyBJbmZvIFRleGluZm8gT3V0cHV0KiIpKSkKCSAgICAgICht YXBjCgkgICAgICAgKGxhbWJkYSAoY29tbWFuZCkKCQkgKHNoZWxsLWNvbW1hbmQKCQkgIChyZXBs YWNlLXJlZ2V4cC1pbi1zdHJpbmcKCQkgICAiJWIiIChzaGVsbC1xdW90ZS1hcmd1bWVudCBiYXNl KQoJCSAgIChyZXBsYWNlLXJlZ2V4cC1pbi1zdHJpbmcKCQkgICAgIiVmIiAoc2hlbGwtcXVvdGUt YXJndW1lbnQgdGV4aWZpbGUpCgkJICAgIChyZXBsYWNlLXJlZ2V4cC1pbi1zdHJpbmcKCQkgICAg ICIlbyIgKHNoZWxsLXF1b3RlLWFyZ3VtZW50IG91dC1kaXIpIGNvbW1hbmQgdCB0KSB0IHQpIHQg dCkKCQkgIG91dGJ1ZikpCgkgICAgICAgb3JnLWUtdGV4aW5mby1pbmZvLXByb2Nlc3MpCgkgICAg ICA7OyBDb2xsZWN0IHN0YW5kYXJkIGVycm9ycyBmcm9tIG91dHB1dCBidWZmZXIuCgkgICAgICAo c2V0cSBlcnJvcnMgKG9yZy1lLXRleGluZm8tY29sbGVjdC1lcnJvcnMgb3V0YnVmKSkpKQoJICAg KHQgKGVycm9yICJObyB2YWxpZCBjb21tYW5kIHRvIHByb2Nlc3MgdG8gSW5mbyIpKSkKCSAgKGxl dCAoKGluZm9maWxlIChjb25jYXQgYmFzZSAiLmluZm8iKSkpCgkgICAgOzsgQ2hlY2sgZm9yIHBy b2Nlc3MgZmFpbHVyZS4gIFByb3ZpZGUgY29sbGVjdGVkIGVycm9ycyBpZgoJICAgIDs7IHBvc3Np YmxlLgoJICAgIChpZiAobm90IChmaWxlLWV4aXN0cy1wIGluZm9maWxlKSkKCQkoZXJyb3IgKGNv bmNhdCAoZm9ybWF0ICJJTkZPIGZpbGUgJXMgd2Fzbid0IHByb2R1Y2VkIiBpbmZvZmlsZSkKCQkJ ICAgICAgICh3aGVuIGVycm9ycyAoY29uY2F0ICI6ICIgZXJyb3JzKSkpKQoJICAgICAgOzsgRWxz ZSByZW1vdmUgbG9nIGZpbGVzLCB3aGVuIHNwZWNpZmllZCwgYW5kIHNpZ25hbCBlbmQgb2YKCSAg ICAgIDs7IHByb2Nlc3MgdG8gdXNlciwgYWxvbmcgd2l0aCBhbnkgZXJyb3IgZW5jb3VudGVyZWQu CgkgICAgICAobWVzc2FnZSAoY29uY2F0ICJQcm9jZXNzIGNvbXBsZXRlZCIKCQkJICAgICAgIChp ZiAobm90IGVycm9ycykgIi4iCgkJCQkgKGNvbmNhdCAiIHdpdGggZXJyb3JzOiAiIGVycm9ycykp KSkpCgkgICAgOzsgUmV0dXJuIG91dHB1dCBmaWxlIG5hbWUuCgkgICAgaW5mb2ZpbGUpKQogICAg ICAoc2V0LXdpbmRvdy1jb25maWd1cmF0aW9uIHdjb25maWcpKSkpCgooZGVmdW4gb3JnLWUtdGV4 aW5mby1jb2xsZWN0LWVycm9ycyAoYnVmZmVyKQogICJDb2xsZWN0IHNvbWUga2luZCBvZiBlcnJv cnMgZnJvbSBcInBkZmxhdGV4XCIgY29tbWFuZCBvdXRwdXQuCgpCVUZGRVIgaXMgdGhlIGJ1ZmZl ciBjb250YWluaW5nIG91dHB1dC4KClJldHVybiBjb2xsZWN0ZWQgZXJyb3IgdHlwZXMgYXMgYSBz dHJpbmcsIG9yIG5pbCBpZiB0aGVyZSB3YXMKbm9uZS4iCiAgKHdpdGgtY3VycmVudC1idWZmZXIg YnVmZmVyCiAgICAoc2F2ZS1leGN1cnNpb24KICAgICAgKGdvdG8tY2hhciAocG9pbnQtbWF4KSkK ICAgICAgOzsgRmluZCBmaW5hbCAibWFrZWluZm8iIHJ1bi4KICAgICAgKHdoZW4gKHJlLXNlYXJj aC1iYWNrd2FyZCAiXlsgXHRdKlRoaXMgaXMgcGRmLio/VGVYLio/VmVyc2lvbiIgbmlsIHQpCgko bGV0ICgoY2FzZS1mb2xkLXNlYXJjaCB0KQoJICAgICAgKGVycm9ycyAiIikpCgkgICh3aGVuIChz YXZlLWV4Y3Vyc2lvbgoJCSAgKHJlLXNlYXJjaC1mb3J3YXJkICJSZWZlcmVuY2UuKj91bmRlZmlu ZWQiIG5pbCB0KSkKCSAgICAoc2V0cSBlcnJvcnMgKGNvbmNhdCBlcnJvcnMgIiBbdW5kZWZpbmVk IHJlZmVyZW5jZV0iKSkpCgkgICh3aGVuIChzYXZlLWV4Y3Vyc2lvbgoJCSAgKHJlLXNlYXJjaC1m b3J3YXJkICJDaXRhdGlvbi4qP3VuZGVmaW5lZCIgbmlsIHQpKQoJICAgIChzZXRxIGVycm9ycyAo Y29uY2F0IGVycm9ycyAiIFt1bmRlZmluZWQgY2l0YXRpb25dIikpKQoJICAod2hlbiAoc2F2ZS1l eGN1cnNpb24KCQkgIChyZS1zZWFyY2gtZm9yd2FyZCAiVW5kZWZpbmVkIGNvbnRyb2wgc2VxdWVu Y2UiIG5pbCB0KSkKCSAgICAoc2V0cSBlcnJvcnMgKGNvbmNhdCBlcnJvcnMgIiBbdW5kZWZpbmVk IGNvbnRyb2wgc2VxdWVuY2VdIikpKQoJICAod2hlbiAoc2F2ZS1leGN1cnNpb24KCQkgIChyZS1z ZWFyY2gtZm9yd2FyZCAiXiEgTGFUZVguKj9FcnJvciIgbmlsIHQpKQoJICAgIChzZXRxIGVycm9y cyAoY29uY2F0IGVycm9ycyAiIFtMYVRlWCBlcnJvcl0iKSkpCgkgICh3aGVuIChzYXZlLWV4Y3Vy c2lvbgoJCSAgKHJlLXNlYXJjaC1mb3J3YXJkICJeISBQYWNrYWdlLio/RXJyb3IiIG5pbCB0KSkK CSAgICAoc2V0cSBlcnJvcnMgKGNvbmNhdCBlcnJvcnMgIiBbcGFja2FnZSBlcnJvcl0iKSkpCgkg IChhbmQgKG9yZy1zdHJpbmctbnctcCBlcnJvcnMpIChvcmctdHJpbSBlcnJvcnMpKSkpKSkpCgoK KHByb3ZpZGUgJ29yZy1lLXRleGluZm8pCjs7OyBvcmctZS10ZXhpbmZvLmVsIGVuZHMgaGVyZQo= --e0cb4e6ffa3588ed0104c537fbb4--