[
  {
    "path": "README.md",
    "content": "# WindTerm\nA Quicker and better SSH/Telnet/Serial/Shell/Sftp client for DevOps.\n\n_Hello WindTerm :rose:, hello world!_\n\n**We're just beginning! If you want a high performance text editor, you can try [WindEdit](https://www.github.com/kingToolbox/WindEdit/).**\n\n# License\n**Completely FREE for commercial and non-commercial use without limitations.**\n**All released source codes (except thirdparty directory) are provided under the terms of Apache-2.0 license.**\n\n# Introduction\n\nSee [Intro Videos](https://kingtoolbox.github.io)\n\n# Download\n\n**Linux binary**, **MacOS binary** and **Windows binary**: https://github.com/kingToolbox/WindTerm/releases\n\n# Source Code\n\nWindTerm is a **partial** open source project, and the source will be gradually opened.\n\nOpen source code includes, but is not limited to, the classes that can be used independently, such as functional, algorithms, gui widgets, etc., as well as functional libraries, such as network, protocols, etc., as well as all types that require open source according to the license.\n\n# Issues and feature requests\n\nAny issues and feature requests are welcome.\n\nPlease click [issues](https://github.com/kingToolbox/WindTerm/issues) to commit an issue or a feature request.\n\nPlease click [Discussion](https://github.com/kingToolbox/WindTerm/discussions) to discuss anything about SSH, SFtp, Shell(Linux shell, Windows cmd and powershell), Telnet, Serial and WindTerm.\n\n# Screenshots\n\nMain Window (zsh):\n\n![MainWindow](https://github.com/kingToolbox/WindTerm/blob/master/images/screenshots/WindTerm.png)\n\nSplit views:\n\n![SplitView](https://github.com/kingToolbox/WindTerm/blob/master/images/screenshots/SplitView.png)\n\nDigeWhite Theme:\n\n![DigeWhite Theme](https://github.com/kingToolbox/WindTerm/blob/master/images/screenshots/WindTerm_DigeWhite_Theme.png)\n\n# Features\n\n### SSH, Telnet, Tcp, Shell, Serial, Tmux\n- SSH v2, Telnet, Raw Tcp, Serial, Shell protocols implemented. [Intro Video](https://kingtoolbox.github.io/2020/01/22/new-session/)\n- Supports SSH auto execution when session authenticated.\n- Supports SSH ControlMaster.\n- Supports SSH ProxyCommand or ProxyJump. [Intro Video](https://kingtoolbox.github.io/2021/03/11/proxycommand/)\n- Supports SSH agent. [Intro Video](https://kingtoolbox.github.io/2020/08/22/ssh_agent/)\n- Supports SSH agent forwarding.\n- Supports SSH auto login with password, public-key, keyboard-interactive, gssapi-with-mic. [Intro Video](https://kingtoolbox.github.io/2020/01/23/auto-login/)\n- Supports X11 forwarding. [Intro Video](https://kingtoolbox.github.io/2020/07/21/x11_forwarding/)\n- Supports direct/local port forwarding, reverse/remote port forwarding and dynamic port forwarding. [Intro Video](https://kingtoolbox.github.io/2020/07/21/port_forwarding/)\n- Supports XModem, YModem and ZModem. [Intro Video](https://kingtoolbox.github.io/tags/modem/)\n- Integrated sftp, scp client, supports download, upload, remove, rename, make new file/directory and so on. [Intro Video](https://kingtoolbox.github.io/tags/transfer/)\n- Integrated local file manager, supports move to, copy to, copy from, remove, rename, make new file/directory and so on.\n- Supports Windows Cmd, PowerShell and Cmd, PowerShell as administrator.\n- Supports Linux bash, zsh, powershell core and so on.\n- Supports MacOS bash, zsh, powershell core and so on.\n- **Supports `tmux integration`**. [Intro Video](https://kingtoolbox.github.io/2025/01/05/tmux-integration/)\n### GUI\n- **Supports Windows, MacOS and Linux.**\n- **Supports Multilingual User Interface.**\n- Supports Unicode 13.\n- Session dialog and session tree. [Intro Video](https://kingtoolbox.github.io/2020/01/22/manage-sessions/)\n- **Auto Completion.** [Intro Video](https://kingtoolbox.github.io/tags/auto-completion/)\n- **Free Type Mode.** [Intro Video](https://kingtoolbox.github.io/2022/04/12/free_type_mode/)\n- **Focus Mode.** [Intro Video](https://kingtoolbox.github.io/2021/06/28/ui_focus_mode/)\n- **Sync Input.** [Intro Video](https://kingtoolbox.github.io/2021/05/27/sync-input/)\n- **Enhanced protection of the session username and password.** [Intro Video](https://kingtoolbox.github.io/2021/03/11/protection-username-password/)\n- **Command palette.** [Intro Video](https://kingtoolbox.github.io/tags/command-palette/)\n- **Command sender.** [Intro Video](https://kingtoolbox.github.io/tags/sender/)\n- **Explorer Pane.** [Intro Video](https://kingtoolbox.github.io/2021/05/27/explorer/)\n- **Shell Pane.**\n- **Quick Bar.** [Intro Video](https://kingtoolbox.github.io/2020/08/22/quickbar/)\n- **Paste Dialog.** [Intro Video](https://kingtoolbox.github.io/2020/08/22/paste_dialog/)\n- **Local and remote modes with vim keybindings. (Using Shift+Enter key to switch between remote and local mode**) [Intro Video](https://kingtoolbox.github.io/2020/06/21/keyboard-modes/)\n- Supports time stamp, folding, outlining, split views.\n- **Supports powerline in Linux and PowerShell, e.g. Oh-My-Zsh, Oh-My-Posh.** [Intro Image](https://github.com/kingToolbox/WindTerm#screenshots)\n- Supports color schemes like vscode. [Intro Video](https://kingtoolbox.github.io/2020/01/23/highlight/)\n- Supports searching and previewing. [Intro Video](https://kingtoolbox.github.io/2020/01/22/search-and-mark/)\n- Supports highlighting the opening and closing delimiter, such as (), [], {} and the customed delimiters. [Intro Video](https://kingtoolbox.github.io/2020/06/28/pair/)\n- Supports changing the UI theme. [Intro Video](https://kingtoolbox.github.io/2020/09/18/theme/)\n- Supports setting the tab color. [Intro Video](https://kingtoolbox.github.io/2020/09/18/tabbar-change-tabcolor/)\n- Supports searching over the opened tabs. [Intro Video](https://kingtoolbox.github.io/2021/03/11/tabbar-search-tab/)\n- Supports closing tabs to the right.\n- Supports setting the windows transparency. [Intro video](https://kingtoolbox.github.io/2020/11/13/windows-opacity/)\n- Supports select-to-copy, right-click-to-paste or middle-click-to-paste.\n- Supports searching text online with Google, Bing, Github, Stackoverflow, Wikipedia and DuckDuckGo. [Intro video](https://kingtoolbox.github.io/2020/11/13/search-online/)\n- Supports hiding mouse cursor while typing.\n- **Supports locking screen.** [Intro video](https://kingtoolbox.github.io/2021/04/23/lock-screen/)\n### Term\n- Supports vt100, vt220, vt340, vt420, vt520, xterm, xterm-256-colors.\n- Supports unicode, emojis, true-color, mouse protocol, etc.\n- Supports auto wrap mode. [Intro Video](https://kingtoolbox.github.io/2020/01/22/auto-wrap/)\n- Protocols and terms can be customed.\n- All vttest tests have passed except Tektronix 4014.\n### Session\n- **Supports HTTP and SOCKS5 proxy.** [Intro Video](https://kingtoolbox.github.io/2021/03/11/proxy-http-socks5/)\n- **Supports Jump Server proxy.** [Intro Video](https://kingtoolbox.github.io/2021/03/11/proxy-jump-server/)\n- Supports manual and automated session logging. [Intro Video](https://kingtoolbox.github.io/tags/logging/)\n- Rename and duplicate session. [Intro Video](https://kingtoolbox.github.io/tags/tabbar/)\n- Restore last sessions and layouts when restart. [Intro Video](https://kingtoolbox.github.io/2020/01/22/restore-sessions/)\n- Supports opening a specific session or set of sessions on startup.\n### Performance\n- Dynamic memory compression, typically `20%` to `90%` of the working memory load can be reduced.\n- High performance, low memory, low latency. [Intro Video](https://kingtoolbox.github.io/2020/01/23/windterm-putty-performance/)\n\n# Sftp Performance\n\nThe hardware used for generating the data in these benchmarks was\n\n    windows 10 - 2.3 GHz Intel Core i5 and 8GB memory.\n\n**WindTerm1.72, WindTerm 1.2, FileZilla 3.48.1, WinSCP 5.17.2 (Build 10278)** tests are performed on WSL(Ubuntu 18.04.2). \n\nThe version of clients:\n\n| Application | Version | Release Date |\n| --- | --- | --- |\n| windterm | v1.72 | 2020-10-25 |\n| windterm | v1.2 | 2020-06-15 |\n| FileZilla | v3.48.1 | 2020-05-19 |\n| WinScp | v5.17.2 (Build 10278) | 2020-03-09 |\n\n**All test data is for reference only.**\n\n### 5GB huge file (5,154,830 KB), generated by random data\n\n| | Download Time | Download Rate | Upload Time | Upload Rate |\n| --- | --- | --- | --- | --- |\n| WindTerm 1.72 (Use high speed transfer) | **23s** | **216.3 MB/s** | **20s** | **247.0 MB/s** |\n| WindTerm 1.72 | **23s** | **214.7 MB/s** | **20s** | **244.0 MB/s** |\n| WindTerm 1.2 | 37s | 139.3 MB/s | 43s | 119.9 MB/s |\n| FileZilla | 32s | 161.1 MB/s | 30s | 171.8 MB/s |\n| WinSCP | 81s | 63.7 MB/s | 91s | 56.7 MB/s |\n\n### 4400 files, 16 folders (107,042 KB), unzipped from [vim-7.4.1049.zip](https://github.com/vim/vim/archive/v7.4.1049.zip)\n\n| | Download Time | Download Rate | Upload Time | Upload Rate |\n| --- | --- | --- | --- | --- |\n| WindTerm 1.7 | **26s** | **3.9 MB/s** | 13s | 8.1 MB/s |\n| WindTerm 1.2 | 32s | 3.4 MB/s | **10s** | **10.7 MB/s** |\n| FileZilla | 48s | 2.2 MB/s | 35s | 3.1 MB/s |\n| WinSCP | 42s | 2.6 MB/s | 12s | 8.9 MB/s |\n\n# Terminal Performance\n\nThe hardware used for generating the data in these benchmarks was\n\n    windows 10 - 2.3 GHz Intel Core i5 and 8GB memory.\n    MacOs 10.13 - 2.3 GHz Intel Core i5 and 8GB memory.\n\n**WindTerm 1.72, rxvt, putty, xterm, Windows Terminal** tests are performed on WSL(Ubuntu 18.04.2). \n\n**Iterm2, kitty, Alacritty** tests are performed on MacOS shell, \n\n    For WindTerm: No color scheme used in windterm. Color scheme will result in approximately 2% loss and more memory usage.\n\n    For Alacritty: Only supports up to 100,000 scrollback lines, so every test use \"history: 100000\" setting and no memory usage measured.\n\n    For Windows Terminal: Only supports up to 65,535 scrollback lines, so every test use \"historySize: 65535\" setting and no memory usage measured. \n\nThe version of terminals:\n\n| Application | Version | Release Date |\n| --- | --- | --- |\n| windterm | v1.72 | 2020-10-25 |\n| rxvt-unicode | v9.2.2 | 2016-05-14 |\n| putty | v0.71 | 2019-03-16 |\n| xterm | v3.30 | 2017-06-20 |\n| iterm2 | v3.3.6 | 2019-10-09 |\n| alacritty | v0.5.0 | 2020-07-21 |\n| kitty | v0.14.6 | 2019-09-25 |\n| Windows Terminal | v1.3.2651.0 | 2020-09-22 |\n\n**All test data is for reference only.**\n\n## Test Command: \"cat ./benchmark_randomdata\"\n\nThe benchmark_randomdata contains 97.6MB random text (102,401,504 bytes, 1,329,878 lines, generated and tested by [random_test.sh](https://github.com/kingToolbox/WindTerm/blob/master/benchmark/urandom_test.sh))\n\nIn all cases, three runs were made to warm system caches. The reported numbers are the median of five runs. \n\n1. Telnet:\n\n| | Lines of scrollback | Data Rate(MB/sec) | Memory Usage(MB) |\n| --- | --- | --- | --- |\n| WindTerm | unlimited | **52.1** | **106.6** |\n| rxvt | 1,350,000 | 37.8 | 842.2 | \n| Putty | 1,350,000 | 4.9 | 733.4 |\n| xterm | 1,350,000 | 2.2 | 3328.4 |\n| Windows Terminal + telnet.exe | 65,535 | 0.1 | Not measured, use 65,535 scrollback lines setting |\n\n2. SSH:\n\n| | Lines of scrollback | Data Rate(MB/sec) | Memory Usage(MB) |\n| --- | --- | --- | --- |\n| WindTerm | unlimited | **41.8** | **108.5** |\n| rxvt | 1,350,000 | 40.2 | 842.2 | \n| Putty | 1,350,000 | 4.8 | 734.9 |\n| xterm | 1,350,000 | 2.3 | 3328.4 |\n| Windows Terminal + ssh.exe | 65,535 | 2.1 | Not measured, use 65,535 scrollback lines setting |\n\n3. Shell:\n\n| | Lines of scrollback | Data Rate(MB/sec) | Memory Usage(MB) |\n| --- | --- | --- | --- |\n| iterm2 | unlimited | - (Take too long time) | more than 1300 |\n| kitty | unlimited | 17.2 | 2655 |\n| Alacritty | 100,000 | 41.3 | - |\n\n## Test command: \"time seq 1 n\" (n = [1000000, 2000000, 5000000, 10000000], scrollback lines: unlimited)\n\n### n = 1,000,000\n\n| | Time(sec) | Memory Usage(MB) |\n| --- | --- | --- |\n| WindTerm | 1.236 | **16.1** |\n| rxvt | 5.082 | 633.3 |\n| putty | 4.161 | 551.1 |\n| xterm | 40.421 | 2500.7 |\n| iterm2 | 2.116 | 146.3 |\n| Kitty | 2.535 | 2376.5 |\n| Alacritty | **1.162** | Not measured, use 100,000 scrollback lines setting |\n| Windows Terminal + ssh.exe | 23.246 | Not measured, use 65,535 scrollback lines setting |\n\n### n = 2,000,000\n\n| | Time(sec) | Memory Usage(MB) |\n| --- | --- | --- |\n| WindTerm | **2.287** | **24.1** |\n| rxvt | 10.896 | 1266.6 |\n| putty | 16.045 | 1102.6 |\n| xterm | 68.154 | 5005.5 |\n| iterm2 | 4.181 | 383.2 |\n| Kitty | 5.620 | 4749.9 |\n| Alacritty | 2.322 | Not measured, use 100,000 scrollback lines setting |\n| Windows Terminal + ssh.exe | 50.381 | Not measured, use 65,535 scrollback lines setting |\n\n### n = 5,000,000\n\n| | Time(sec) | Memory Usage(MB) |\n| --- | --- | --- |\n| WindTerm | **5.520** | **68.2** |\n| rxvt | 27.533 | 3166.2 |\n| putty | 45.911 | 2757.1 |\n| xterm | - | Out of memory |\n| iterm2 | 10.805 | 1048.3 |\n| Kitty | - | Out of memory |\n| Alacritty | 5.799 | Not measured, use 100,000 scrollback lines setting |\n| Windows Terminal + ssh.exe | 130.371 | Not measured, use 65,535 scrollback lines setting |\n\n### n = 10,000,000\n\n| | Time(sec) | Memory Usage(MB) |\n| --- | --- | --- |\n| WindTerm | **10.674** | **133.3** |\n| rxvt | - | Out of memory |\n| putty | - | Out of memory |\n| xterm | - | Out of memory |\n| iterm2 | 20.468 | 2231.3 |\n| Kitty | - | Out of memory |\n| Alacritty | 11.598 | Not measured, use 100,000 scrollback lines setting |\n| Windows Terminal + ssh.exe | 264.739 | Not measured, use 65,535 scrollback lines setting |\n\n### n = 10,000,000 scrollback = 30 Lines\n\n| | Time(sec) | Memory Usage(MB) |\n| --- | --- | --- |\n| WindTerm | 10.167 | 0.7 |\n| rxvt | **9.687** | **0.1** |\n| putty | 95.382 | 0.4 |\n| xterm | 286.510 | **0.1** |\n| iterm2 | 25.448 | 7.4 |\n| Kitty | 16.104 | 0.5 |\n| Alacritty | 11.798 | Not measured, use zero scrollback lines setting |\n| Windows Terminal + ssh.exe | 261.096 | Not measured, use zero scrollback lines setting |\n\n# Linux Terminal Performance\n\nThe hardware used for generating the data in these benchmarks was\n\n    Debian 10 Vm - 4cpu and 4GB memory.\n\n    For WindTerm: No color scheme used in windterm. Color scheme will result in approximately 2% loss and more memory usage.\n\n    For other terminals: No memory usage measured because most of them write the history to disk or only support a limited number of lines in memory..\n\nThe version of terminals:\n\n| Application | Version | Release Date |\n| --- | --- | --- |\n| Windterm | v1.9 | 2020-12-22 |\n| Gnome | v3.30.2 | 2018-10-22 |\n| Mate Terminal | v1.20.2 | 2019-02-11 |\n| Konsole | v18.04.0 | 2019-04-12 |\n| Xfce4 Terminal | v0.8.7.4 | 2018-5-15 |\n| QTerminal | v0.14.1 | 2019-01-26 |\n\n**All test data is for reference only.**\n\n## Test Command: \"cat ./benchmark_randomdata\"\n\nThe benchmark_randomdata contains 97.6MB random text (102,401,504 bytes, 1,329,878 lines, generated and tested by [random_test.sh](https://github.com/kingToolbox/WindTerm/blob/master/benchmark/urandom_test.sh))\n\nIn all cases, three runs were made to warm system caches. The reported numbers are the median of five runs. \n\n| | Cost Time |\n| --- | --- |\n| WindTerm | **1.976s** |\n| Gnome Terminal  | 9.781s |\n| Mate Terminal  | 9.841s |\n| Konsole | 25.050s |\n| xfce4 Terminal | 10.520s |\n| QTerminal | 20.763s |\n\n## Test command: \"time seq 1 n\" (n = [1000000, 2000000, 5000000, 10000000], scrollback lines: unlimited)\n\n| n | 1,000,000 | 2,000,000 | 5,000,000 | 10,000,000 | 10,000,000<br>(scrollback lines: 100) |\n| --- | --- | --- | --- | --- | --- |\n| WindTerm | 0.846s (18.6MB) | **1.574s** (26.6MB) | **4.046s** (56.4MB) | **8.232s** (102.2MB) | **7.748s** (3.4MB) | \n| Gnome Terminal  | 0.920s | 2.152s | 5.271s | 11.111s | 13.109s |\n| Mate Terminal  | **0.822s** | 1.698s | 5.943s | 10.920s | 12.290s |\n| Konsole | 1.612s | 3.199s | 8.157s | 16.029s | 15.650s |\n| xfce4 Terminal | 0.870s | 2.160s | 5.866s | 12.089s | 13.304s |\n| QTerminal | 9.272s | 18.391s | 45.999s | 104.277s | 17.208s |\n\n# Latency\n\nConsidering the network influence on the latency, the following data is from [WindEdit](https://github.com/kingToolbox/digedit).\nDIGEdit is the text component of WindTerm.\n\n|   | Min | Max | Avg | SD |\n| --- | --- | --- | --- | --- |\n|WindEdit| 1.9 | 7.6 | 2.9 | 0.8 |\n|Windows Notepad | 0.9 | 16.5 | 7.8 | 1.8 |\n|GVim | 0.9 | 10.4 | 2.8 | 1.2 |\n\n# Shortcuts\n\n[Shortcut Keys List](https://kingtoolbox.github.io/tags/keyboard/)\n\n# Roadmap\n\n**Release cycle:**\n\n  2-3 months.\n  \n**Prerelease cycle:**\n\n  4~6 weeks\n\n# Roadmap of v2.7 (February 2025, for reference only)\n- **Resolve issues as much as possible**\n- SSH Agent Forwaring\n- Tmux integration\n- Command Snippet [Description](https://github.com/kingToolbox/WindTerm/issues/239#issuecomment-951934488)  (Postponed to a later version )\n- SSH GSSAPI Authentication (Postponed to a later version )\n- Search in sessions (Postponed to a later version )\n\nDownload: [WindTerm 2.7.0 Prerelease 3](https://github.com/kingToolbox/WindTerm/releases/tag/2.7-prerelease-3) (2025-2-10)\n\n**Roadmap of version 2.x:**\n- External tools\n- Protocols:\n  - Mosh\n  - Rlogin\n- Session:\n  - Auto Complete\n  - Chat mode\n  - Log viewer\n- File transfer:\n  - ftp, ftps\n- Script, macro and plugin stystem\n- More ...\n\n**Release Schedule:**\nVersion | Level | Target | Status | Timeline\n------------ | ------------- | -------------- | ---------- | -----------\nv0.x | Basic | Basic framework and basic features, but complete a high-performance text editor ([WindEdit](https://github.com/kingToolbox/WindEdit))  as the base, and be able to use them normally.  | Finished | Long long ago ~ Sprint of 2020\nv1.x | Manual | Perfect features and can be used by most developers in their daily work | Finished | Spring of 2020 ~ Winter of 2020 \n**v2.x** | **Semi automatic** | **Through triggers, macros, events, notifications and so on, developers can be assisted to complete some operations.** | **Developing** | **Spring of 2021 ~ Summer of 2022**\nv3.x | Fully automatic | Through plugins, scripts, machine learning and so on, automatically operating with achieving non-attended | Planning | Summer of 2022 ~ Winter of 2023\n\n# Acknowledgement\n|            | Contribution  |\n| ---------- | ------------- |\n| [EvoWebFrance](https://github.com/EvoWebFrance) | French translation |\n| [kvnklk](https://github.com/kvnklk) | German translation |\n| [Lemonawa](https://github.com/Lemonawa) | Simplified Chinese translation |\n| [LuxNegra](https://github.com/LuxNegra) | French translation |\n| [MosamXu](https://github.com/MosamXu) | Simplified Chinese translation |\n"
  },
  {
    "path": "benchmark/urandom_test.sh",
    "content": "# Generate 100MB data.\nif [ ! -f \"./benchmark_randomdata\" ];then\ncat /dev/urandom | base64 | dd of=./benchmark_randomdata bs=1024 count=100KB\nfi\necho \"Benchmark Result:\"\n{ time dd if=./benchmark_randomdata bs=10240; }\n"
  },
  {
    "path": "images/screenshots/readme.md",
    "content": "Screenshots of WSL and SplitView.\n"
  },
  {
    "path": "src/LICENSE",
    "content": "                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "src/Onigmo/.editorconfig",
    "content": "; see: http://editorconfig.org/\n\nroot = true\n\n[*]\nend_of_line = lf\ninsert_final_newline = true\ntrim_trailing_whitespace = true\n\n[**.[ch]]\nindent_style = tab\nindent_size = 2\ntab_width = 8\n\n[**.py]\nindent_style = space\nindent_size = 4\n\n[**.rb]\nindent_style = space\nindent_size = 2\ntab_width = 8\n\n[win32/*]\nend_of_line = crlf\n\n[win32/*.py]\nend_of_line = lf\n"
  },
  {
    "path": "src/Onigmo/.gitignore",
    "content": "# ignore dot-files, binary files and backup files\n.*\n*.o\n*.lo\n*.so\n*.a\n*.la\n*.obj\n*.def\n*.dll\n*.exe\n*.exp\n*.lib\n*.pyc\n*.bak\n*.BAK\n*~\n*.swp\n*.orig\n*.rej\n*.RES\n*.res\n\n# don't want to ignore\n!.gitignore\n!.editorconfig\n\n# working dirs\n.deps\n.libs\n\n# autotools generated files\n/autom4te.cache\n/config.h\n/config.log\n/config.status\n/libtool\n/onig-config\n/oniguruma.pc\n/Makefile\n/sample/Makefile\n/stamp-h1\n\n# generated executable files\n/enc/mktable\n/sample/crnl\n/sample/encode\n/sample/listcap\n/sample/names\n/sample/posix\n/sample/simple\n/sample/sql\n/sample/syntax\n/testc\n/testcu\n/testp\n\n# tag files\ntags\nTAGS\n\n# GNU global files\nGPATH\nGRTAGS\nGSYMS\nGTAGS\n"
  },
  {
    "path": "src/Onigmo/AUTHORS",
    "content": "kentkt AT csc DOT jp (K.Takata)\nsndgk393 AT ybb DOT ne DOT jp (K.Kosako)\n"
  },
  {
    "path": "src/Onigmo/COPYING",
    "content": "Onigmo (Oniguruma-mod) LICENSE\n------------------------------\n\n/*-\n * Copyright (c) 2002-2009  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * Copyright (c) 2011-2013  K.Takata  <kentkt AT csc DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n\n\nOniguruma LICENSE\n-----------------\n\n/*-\n * Copyright (c) 2002-2009  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n\n\nRuby BSDL\n---------\nCopyright (C) 1993-2013 Yukihiro Matsumoto. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n1. Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n2. Redistributions in binary form must reproduce the above copyright\nnotice, this list of conditions and the following disclaimer in the\ndocumentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\nOR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\nHOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\nLIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\nOUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGE.\n"
  },
  {
    "path": "src/Onigmo/HISTORY",
    "content": "History of Onigmo (Oniguruma-mod)\n\n2013/07/03: Version 5.13.5\n\n2013/07/03: [dist] update LTVERSION to \"5:0:5\".\n2013/07/02: [bug]  (thanks Akinori MUSHA and Ippei Obayashi)\n                   Fix a renumbering bug in condition regexp with a named\n\t\t   capture.\n\t\t   see: https://bugs.ruby-lang.org/issues/8583\n2013/05/30: [dist] Merge Oniguruma 5.9.3 and 5.9.4.\n                   Also change the version of autotools.\n                   (automake 1.11.1, autoconf 2.65, libtool 2.2.6b)\n2013/05/29: [spec] (thanks Akinori MUSHA)\n                   Allow ENCLOSE_OPTION in look-behind.\n2013/04/10: [bug]  fix problem with optimization of \\z.\n                   see: http://bugs.ruby-lang.org/issues/8210\n\n2013/03/17: Version 5.13.4\n\n2013/03/17: [dist] update LTVERSION to \"5:0:4\".\n2013/03/10: [bug]  fix lookbehind assertion fails with /m mode enabled.\n                   see: http://bugs.ruby-lang.org/issues/8023\n2013/03/05: [bug]  fix \\Z matches where it shouldn't.\n                   see: http://bugs.ruby-lang.org/issues/8001\n2013/03/02: [dist] add .editorconfig (see: http://editorconfig.org/)\n2013/03/01: [bug]  fix character class with ASCII flag.\n                   see: http://bugs.ruby-lang.org/issues/7972\n2013/02/27: [bug]  fix case-insensitive group.\n                   see: http://bugs.ruby-lang.org/issues/7974\n\n2012/11/03: Version 5.13.3\n\n2012/11/03: [dist] update LTVERSION to \"5:0:1\".\n2012/10/18: [dist] Win32: add batch-mode inference rules.\n2012/10/17: [bug]  merge Ruby r37175.\n                   should match with a hyphen after a range in a character\n                   class.\n2012/09/02: [impl] merge Ruby r36440.\n                   remove \"found\" indirect flag to suppress warnings by\n                   gcc 4.7.\n2012/07/11: [dist] tool/enc-unicode.rb: suppress warning of Hash#index on\n                   Ruby 1.9.\n2012/07/10: [dist] testpy.py: return the result of test.\n2012/07/10: [dist] testpy.py: simplify the method of setting output encoding.\n2012/07/03: [dist] testpy.py: error messages are not displayed.\n2012/06/16: [impl] merge Ruby r36072 partially.\n                   regparse.c (is_onechar_cclass): restructured to clarify\n                   that c is used if found == 1.\n2012/06/16: [dist] merge Ruby r36070.\n                   tool/enc-unicode.rb: add comment why it uses Hash#index.\n2012/05/22: [impl] merge Ruby r35724.\n                   enc/sjis.c (code_to_mbclen): return\n                   ONIGERR_INVALID_CODE_POINT_VALUE if the code is invalid.\n2012/05/11: [dist] update .gitignore.\n2012/04/30: [dist] configure.in: add 'foreign' option in AM_INIT_AUTOMAKE.\n2012/04/18: [dist] fix samples to support x64.\n                   NOTE: This is a preliminary fix. It is needed that\n                   additional support for the LLP64 data model such as\n                   Visual C++ x64.\n2012/04/14: [dist] update Makefile.{am,in}.\n                   Add new files.\n                   Enable making test[cu].c from test*.rb.\n2012/04/14: [dist] update tests. (testc.c, testu.c, etc.)\n\n2012/03/29: Version 5.13.2\n\n2012/03/24: [impl] suppress warnings.\n2012/03/24: [impl] remove unnecessary casts.\n2012/03/23: [impl] merge Ruby r35107.\n                   suppress warnings.\n2012/03/21: [bug]  memory leak occurs when char class contains only one char.\n2012/03/21: [impl] use actual type to get the size.\n                   see: http://bugs.ruby-lang.org/issues/6144\n2012/03/15: [impl] check the return code of add_ctype_to_cc().\n                   see: http://bugs.ruby-lang.org/issues/6145\n2012/03/15: [impl] fix error message.\n2012/03/15: [bug]  broken conditional expressions are allowed.\n                   see: http://bugs.ruby-lang.org/issues/6143\n2012/03/15: [impl] merge Ruby r35027.\n                   adjust style.\n2012/03/06: [impl] merge Ruby r34905.\n                   Remove unused variables.\n2012/02/29: [bug]  unexpected match occurs when a char class contains no char.\n2012/02/25: [impl] CaseFolding.py: fix regexp.\n2012/02/25: [impl] define the sizes of case folding tables in casefold.h.\n2012/02/24: [dist] fix samples to support x64.\n                   NOTE: This is a preliminary fix.\n2012/02/23: [impl] merge Ruby r34730.\n                   don't use // comment.\n2012/02/20: [impl] merge Ruby r34684, r34688 and r34692.\n                   fix-up warnings.\n2012/02/17: [dist] (thanks NARUSE, Yui)\n                   tool/enc-unicode.rb: Don't use \\h to work with Ruby 1.8.\n2012/02/14: [spec] relative group reference in back reference with nest level\n                   is allowed.\n\n2012/02/05: Version 5.13.1\n\n2012/02/04: [spec] allow \\b and \\B in look-behind.\n2012/02/01: [new]  support for Unicode 6.1.\n\n2012/01/20: Version 5.13.0\n\n2012/01/20: [dist] update LTVERSION to \"5:0:0\".\n2012/01/17: [bug]  memory leak occurs when xrealloc fails.\n2012/01/15: [bug]  Calling function \"add_code_range\" without checking return\n                   value.\n2012/01/12: [bug]  testpy.py: error messages are not displayed when Python 2.x\n                   is used.\n2012/01/11: [bug]  memory leak occurs when history_tree_add_child fails.\n2012/01/11: [bug]  (thanks Masashi Tsuji)\n                   OnigCaptureTreeNode memory leak.\n2012/01/09: [spec] ONIG_OPTION_ASCII_RANGE should be enabled in\n                   ONIG_SYNTAX_JAVA.\n2012/01/09: [new]  support for Ruby 1.9.3 compatible \\b, \\B and POSIX brackets.\n                   add ONIG_OPTION_WORD_BOUND_ALL_RANGE and\n                   ONIG_OPTION_POSIX_BRACKET_ALL_RANGE.\n                   remove ONIG_SYN_POSIX_BRACKET_ALWAYS_ALL_RANGE.\n2011/12/31: [bug]  /^ss$/i doesn't match \"\\x{DF}\".\n2011/12/30: [new]  add ONIG_SYN_POSIX_BRACKET_ALWAYS_ALL_RANGE option.\n2011/12/29: [bug]  (thanks Nobuyoshi Nakada)\n                   C standard requires va_end() to be placed before return.\n                   quote macro expansions.\n\n2011/12/28: Version 5.12.1\n\n2011/12/24: [new]  merge Ruby r23714, r28980 and r34050.\n                   add onig_memsize() and onig_region_memsize().\n2011/12/24: [new]  support for Python 3.x. (onig.py and testpy.py)\n2011/12/14: [bug]  testpy.py doesn't work on Ubuntu.\n\n2011/12/12: Version 5.12.0\n\n2011/12/12: [dist] update LTVERSION to \"4:0:0\".\n2011/12/11: [impl] use ONIGENC_IS_UNICODE to check if the encoding is Unicode\n                   encoding.\n2011/12/10: [new]  support for Unicode 6.0.\n                   new scripts, ages, blocks (\\p{In_XXX}) and case foldings.\n                   tool/enc-unicode.rb is imported from Ruby 1.9.3.\n2011/12/10: [spec] \\p{Print} shouldn't include newlines.\n                   \\p{Print} = \\p{Graph} + \\p{Space_Separator}\n2011/12/10: [bug]  \\p{NEWLINE} should not be allowed.\n2011/12/05: [new]  support for PyPy 1.7. (onig.py and testpy.py)\n2011/12/01: [bug]  /a{2}/i doesn't match 'AA'.\n2011/11/21: [impl] use ONIG_LAST_CODE_POINT instead of ~((OnigCodePoint )0).\n2011/11/17: [bug]  code ranges are not merged properly.\n2011/11/17: [bug]  /[\\x{0}-X]/i doesn't match properly when UTF-16/32 is used.\n\n2011/10/16: Version 5.11.4\n\n2011/10/16: [dist] update LTVERSION to \"3:0:2\".\n2011/10/15: [tune] optimize Sunday's quick search.\n2011/10/07: [API]  add ONIG_OPTION_DOTALL option as an alias of\n                   ONIG_OPTION_MULTILINE.\n2011/10/04: [impl] add Sunday's quick search.\n                   add config USE_SUNDAY_QUICK_SEARCH.\n2011/10/04: [impl] add case-insensitive Boyer-Moore-Horspool search.\n2011/10/03: [spec] check minimum digits of hexadecimal numbers.\n                   \\uHHHH should be exactly four digits.\n2011/10/03: [API]  rename ONIG_SYN_OP2_QMARK_BAR_BRANCH_RESET to\n                   ONIG_SYN_OP2_QMARK_VBAR_BRANCH_RESET.\n\n2011/09/18: Version 5.11.3\n\n2011/09/18: [dist] update LTVERSION to \"3:0:1\".\n2011/09/18: [spec] \\R matches \\x85, \\x2028 and \\x2029 in Unicode encodings.\n2011/09/18: [new]  add ONIG_OPTION_NEWLINE_CRLF.\n2011/09/18: [tune] optimize \\x{}.\n2011/09/17: [tune] expand a{n,m} to 'a...a' + a{0,m-n}.\n2011/09/12: [bug]  /.*\\Z/ doesn't match properly.\n\n2011/09/10: Version 5.11.2\n\n2011/09/09: [bug]  merge Ruby r24546.\n                   fix the first character bigger than sb_out was dropped.\n2011/09/09: [bug]  merge Ruby r19864.\n                   CCV_SB is only for single byte.\n2011/09/09: [bug]  merge Ruby r24550.\n                   fix memory leaks.\n\n2011/09/08: Version 5.11.1\n\n2011/09/08: [impl] merge some part of Ruby r29928. (update debug log.)\n2011/09/08: [impl] merge Ruby r32544.\n                   Power PC does not allow unaligned word access.\n2011/09/07: [bug]  \\g<0> doesn't work when USE_PERL_SUBEXP_CALL isn't defined.\n2011/09/07: [tune] optimize character class.\n2011/09/06: [tune] optimize (?a).\n2011/09/06: [tune] optimize \\R.\n\n2011/09/03: Version 5.11.0\n\n2011/09/03: [dist] update LTVERSION to \"3:0:0\".\n2011/09/01: [new]  add OnigPosition.\n2011/09/01: [new]  (thanks h-tom)\n                   support for x64.\n2011/09/01: [new]  add ONIG_SYNTAX_PYTHON (onig.py).\n2011/08/30: [dist] check _MSC_VER instead of _NMAKE_VER when LTCG is used.\n2011/08/25: [tune] reduce conditional branches.\n                   use ONIGENC_IS_IN_RANGE macro to check the code range.\n2011/08/18: [dist] add a resource script for onig.dll (win32/onig.rc).\n\n2011/08/09: Version 5.10.6\n\n2011/08/09: [dist] a .def file can be used to export APIs.\n2011/08/08: [dist] update win32/Makefile to support LTCG optimization.\n2011/08/07: [new]  add new test scripts: testpy.py and onig.py\n2011/08/07: [new]  add a new syntax: ONIG_SYNTAX_PYTHON\n\n2011/08/03: Version 5.10.5\n\n2011/08/03: [dist] update win32/Makefile.\n2011/08/03: [dist] update tests to support ONIG_OPTION_ASCII_RANGE option.\n2011/07/30: [new]  EUC-JP: support for JIS X 0212 (Supplemental Kanji).\n2011/07/30: [impl] not to use ONIG_ENCODING_SJIS inside ONIG_ENCODING_CP932.\n2011/07/29: [new]  Add support for EUC-JIS-2004.\n                   (This feature is not enabled by default.)\n2011/07/29: [impl] EUC-JP: check the length more strictly.\n2011/07/29: [dist] translate Japanese comments to English.\n2011/07/29: [bug]  \\p{Katakana} doesn't match JIS X 0201 Katakana when EUC-JP\n                   is used.\n2011/07/28: [dist] change the encoding of Japanese documents to UTF-8.\n2011/07/26: [bug]  [^x]*x causes invalid pointer access.\n2011/07/19: [spec] allow (?au) in Ruby syntax mode.\n2011/07/16: [new]  add \\g<0> and \\g<+n>.\n\n2011/07/11: Version 5.10.4\n\n2011/07/11: [dist] update autotools.\n                   use automake 1.10.3, autoconf 2.68 and libtool 2.4.\n2011/07/11: [impl] add typedefs of intptr_t/uintptr_t for old VC++ compilers.\n2011/07/11: [impl] include stdint.h and stddef.h for intptr_t/uintptr_t.\n2011/07/04: [tune] implicit-anchor optimization\n2011/07/04: [bug]  onig_search_gpos() may return wrong OnigRegion.\n2011/07/04: [bug]  fix typo in debug log.\n2011/07/04: [tune] enable optimization for .* except look-behind.\n2011/07/04: [bug]  Revert \"enable optimization for .* except look-behind\"\n\n2011/07/03: Version 5.10.3\n\n2011/07/01: [tune] implicit-anchor optimization\n2011/06/30: [bug]  Revert \"[tune] implicit-anchor optimization\"\n2011/06/30: [bug]  (?a) doesn't work properly\n\n2011/06/29: Version 5.10.2\n\n2011/06/29: [tune] implicit-anchor optimization\n2011/06/28: [impl] remove duplicated debug log.\n2011/06/28: [bug]  (?a) doesn't work for \\d, \\h and \\s.\n2011/06/28: [bug]  should not backtrack in \\X.\n\n2011/06/24: Version 5.10.1\n\n2011/06/24: [new]  add (?(cond)yes) and (?(cond)yes|no).\n2011/06/24: [bug]  double free in \\R and \\X.\n2011/06/24: [tune] enable optimization for .* except look-behind.\n2011/06/21: [spec] number is not allowed in (?&name) and (?P>name).\n\n2011/06/18: Version 5.10.0\n\n2011/06/18: [impl] export onig_new_without_alloc() API.\n2011/06/15: [spec] change Ruby syntax options.\n                   add \\K, \\R and \\X.\n2011/06/15: [spec] change Perl syntax options.\n                   Rename ONIG_SYNTAX_PERL to ONIG_SYNTAX_PERL58.\n                   Rename ONIG_SYNTAX_PERL_NG to ONIG_SYNTAX_PERL58_NG.\n                   Add ONIG_SYNTAX_PERL as Perl 5.10+ compatible syntax.\n2011/06/14: [new]  add (?R), (?0) and (?+n).\n2011/06/14: [new]  add new character properties in EUC-JP:\n                   Han, Latin, Greek and Cyrillic.\n2011/06/14: [new]  add new encoding: CP932.\n2011/06/14: [new]  add new character properties in Shift_JIS:\n                   Han, Latin, Greek and Cyrillic.\n2011/06/13: [bug]  (?-n) doesn't work\n2011/06/13: [new]  add ONIG_SYN_ALLOW_MULTIPLEX_DEFINITION_NAME_CALL\n2011/06/13: [impl] remove unused ONIG_SYN_CAPTURE_LEFT_MOST_NAMED_GROUP flag.\n2011/06/13: [bug]  (?a) doesn't work with Unicode encodings.\n2011/06/12: [new]  add EUC-JP case folding.\n2011/06/12: [new]  add Shift_JIS case folding.\n2011/06/12: [spec] add ONIG_OPTION_ASCII_RANGE option to OnigSyntaxRuby.\n2011/06/12: [new]  add Python/PCRE compatible named group:\n                   (?P<name>...), (?P=name) and (?P>name).\n2011/06/11: [new]  add \\g{n}, \\g{-n} and \\g{name}.\n2011/06/10: [bug]  char class may cause memory leak\n                   http://redmine.ruby-lang.org/issues/show/4061\n2011/06/10: [bug]  invalid backref number/name\n                   http://redmine.ruby-lang.org/issues/show/2759\n2011/06/10: [bug]  /(?<=a).*b/ =~ \"aab\" doesn't match\n                   http://redmine.ruby-lang.org/issues/show/3568\n2011/06/10: [bug]  Case Sensitivity in Regular Expressions with Lookbehind\n                   http://redmine.ruby-lang.org/issues/show/4088\n2011/06/10: [spec] allow any target for quantifiers.\n                   add USE_NO_INVALID_QUANTIFIER.\n2011/06/10: [new]  add Perl 5.14 compatible character set modifier:\n                   (?adlu) and (?^alu).\n2011/06/10: [new]  add (?&name), (?n) and (?-n).\n                   add USE_PERL_SUBEXP_CALL.\n2011/06/10: [new]  add \\R, \\X and \\K.\n2011/06/10: [spec] allow negative look behind in look behind.\n2011/06/10: [new]  add: onig_search_gpos().\n\n2011/06/10: fork from Oniguruma 5.9.2.\n\n\n======================================================================\nHistory of Oniguruma\n\n2013/04/04: Version 5.9.4\n\n2013/04/04: [dev]  remove Makefile.in from git repository.\n2013/04/04: [dist] add oniguruma.pc.in file. (for pkg-config)\n                   (thanks Giulio Paci)\n\n2012/10/26: Version 5.9.3\n\n2012/10/15: remove warnings \"test: =: unary operator expected\" in ./configure.\n            (thanks t_okazaki)\n2012/10/15: fix print_tree ENCLOSE_OPTION bug. (thanks Suraj N. Kurapati)\n\n2010/01/09: Version 5.9.2\n\n2010/01/05: [bug]  fix utf16be_code_to_mbc() and utf16le_code_to_mbc().\n2008/09/16: [bug]  fix memory leaks in parse_exp().\n2008/08/01: [bug]  fix memory leaks.\n2008/06/17: [bug]  invalid type of argument was used\n                   in onig_st_lookup_strend().\n2008/06/16: [bug]  invalid CaseFoldMap entry in ISO-8859-5. 0xdf -> 0xde\n2008/02/19: [new]  add: onig_reg_init().\n2008/02/19: [new]  add: onig_free_body().\n2008/02/19: [new]  add: onig_new_without_alloc().\n2008/02/19: [API]  rename onig_alloc_init() to onig_reg_init(),\n                   and argument type changed.\n2008/01/31: [impl] move UTF16_IS_SURROGATE_XXX() to regenc.h.\n2008/01/30: [bug]  (thanks akr)\n                   fix euctw_islead().\n2008/01/23: [bug]  update enc/koi8.c.\n\n2007/12/22: Version 5.9.1\n\n2007/12/21: [impl] add sprint_byte().\n2007/11/28: [bug]  (thanks Andy Armstrong)\n                   don't overwrite error code in fetch_name().\n2007/11/12: [bug]  utf8 mbc length of code 0xfe, 0xff are not 1,\n2007/10/23: [spec] onig_enc_len() takes three arguments. (not used)\n2007/10/15: [impl] (thanks Rui Hirokawa)\n                   add check HAVE_STDARG_H.\n2007/09/07: [API]  rename enc_len() to onig_enc_len() in oniguruma.h.\n2007/09/04: [API]  remove ONIGENC_ERR_XXXXX.\n2007/09/03: [API]  add error ONIGERR_INVALID_CODE_POINT_VALUE.\n2007/09/03: [impl] change error message to \"invaid code point value\"\n                   for ONIGERR_INVALID_WIDE_CHAR_VALUE.\n2007/09/03: [bug]  xxx_code_to_mbclen() should return\n                   ONIGERR_INVALID_WIDE_CHAR_VALUE for invalid code point.\n                   ex. /[\\x{7fffffff}]/ for ASCII encoding.\n2007/08/28: [impl] remove \"warning: no previous declaration ...\".\n2007/08/21: [impl] remove warnings in enc/mktable.c.\n2007/08/20: [impl] remove \"warning: unused parameter\"\n2007/08/20: [impl] remove \"warning: comparison between signed and unsigned\".\n2007/08/06: [impl] remove clear_not_flag_cclass().\n2007/08/03: [bug]  fix the case of undefined USE_NAMED_GROUP.\n2007/08/02: [spec] add backref by number.\n2007/08/01: [API]  add OnigCtype.\n2007/07/27: [spec] add USE_CASE_FOLD_IS_APPLIED_INSIDE_NEGATIVE_CCLASS.\n2007/07/24: [impl] define PLATFORM_UNALIGNED_WORD_ACCESS.\n2007/07/23: [dist] fix doc/FAQ.ja.\n\n2007/07/14: Version 5.9.0\n\n2007/07/13: [bug]  add check into onig_reduce_nested_quantifier().\n2007/06/26: [spec] (thanks K.Takata)\n                   ONIG_OPTION_SINGLELINE: '$' -> '\\Z'  (as Perl)\n2007/06/26: [dist] (thanks K.Takata)\n                   fix documents API and API.ja.\n2007/06/19: [impl] remove IS_NOT_NULL() check before onig_node_free().\n2007/06/18: [bug]  (thanks KUBO Takehiro)\n                   WORD_ALIGNMENT_SIZE must be sizeof(OnigCodePoint).\n2007/06/18: [impl] rename CClassNode flags.\n2007/06/18: [bug]  initialization miss.\n2007/06/13: [impl] change node type reference NXXXX.\n2007/06/11: [impl] add node type bit.\n2007/06/11: [spec] allow anchor in enclosed repeater. /(\\z)*/\n2007/06/11: [impl] rename node types.\n2007/06/08: [impl] remove OP_SET_OPTION_PUSH and OP_SET_OPTION from match_at().\n2007/06/07: [impl] use xvsnprintf().\n2007/06/06: [tune] don't set qn->next_head_exact for string first byte is zero.\n2007/06/06: [impl] remove unused variables.\n\n2007/06/04: Version 5.8.0\n\n2007/06/04: [impl] add #ifndef vsnprintf into regint.h.\n2007/05/31: [dist] add configure option '--enable-crnl-as-line-terminator'.\n2007/05/30: [dist] add sample/crnl.c.\n2007/05/30: [bug]  should check USE_CRNL_AS_LINE_TERMINATOR case\n                   in onig_search().\n2007/05/29: [impl] move USE_CRNL_AS_LINE_TERMINATOR into regenc.h.\n2007/05/29: [impl] should check USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE\n                   in forward_search_range() and backward_search_range().\n\n2007/04/27: Version 5.7.0\n\n2007/04/20: [spec] add config USE_MATCH_RANGE_IS_COMPLETE_RANGE.\n2007/04/20: [impl] refactoring in match_at().\n\n2007/04/12: Version 5.6.1\n\n2007/04/12: [bug]  must not use UChar in oniguruma.h.\n2007/04/09: [impl] change STATE_CHECK_BUFF_MAX_SIZE value from 0x8000\n                   to 0x4000. [ruby-core:10883]\n\n2007/04/04: Version 5.6.0  (mourning for Hideo Takamatsu)\n\n2007/04/03: [spec] add new notation (?'name'), \\k'name', \\g'name'.\n2007/04/03: [impl] remove unused variable.\n2007/03/26: [impl] add 'void' to function declarations.\n\n2007/03/06: Version 5.5.3\n\n2007/03/06: [bug]  add #include <malloc.h> for bcc32.\n                   (In bcc32, alloca() is declared in malloc.h.)\n2007/03/02: [bug]  invalid optimization for semi-end-buf in onig_search().\n                   ex. /\\n\\Z/.match(\"aaaaaaaaaa\\n\")\n2007/03/02: [impl] move range > start check position in end_buf process.\n\n2007/01/09: Version 5.5.2\n\n2007/01/09: [impl] rename USE_EXTERNAL_LOWER_CASE_CONV_TABLE.\n2007/01/05: [tune] select_opt_exact_info() didn't work for empty info.\n                   ex. /.a/ make MAP info instead of EXACT info.\n2006/12/28: [impl] add print_enc_string() for ONIG_DEBUG mode.\n\n2006/12/22: Version 5.5.1\n\n2006/12/22: [impl] rename ADD_PAD_TO_SHORT_BYTE_STRING\n                 . to USE_PAD_TO_SHORT_BYTE_CHAR.\n2006/12/21: [spec] should check too short multibyte char in parse_exp().\n                   add ADD_PAD_TO_SHORT_BYTE_STRING.\n                   ex. /\\x00/ in UTF16 should be error.\n\n2006/12/06: Version 5.5.0\n\n2006/12/05: [bug]  should add unfold-1 codes from folded code into\n                   onigenc_unicode_get_case_fold_codes_by_str().\n                   (ex. \"S\" -> \"s\" -> 0x017f)\n2006/12/05: [new]  add flag ONIGENC_CASE_FOLD_TURKISH_AZERI and\n                   USE_UNICODE_CASE_FOLD_TURKISH_AZERI. (disabled in default)\n2006/12/04: [spec] remove ONIGENC_CASE_FOLD_FULL.\n2006/11/30: [impl] remove unnecessary check in xxx_mbc_case_fold().\n\n2006/11/29: Version 5.4.0\n\n2006/11/28: [spec] INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR is enabled in\n                   default case fold status.\n2006/11/28: [spec] rename ONIGENC_CASE_FOLD_MULTI_CHAR to\n                   INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR.\n2006/11/28: [impl] remove USE_UNICODE_CASE_FOLD_MULTI_CHAR.\n2006/11/28: [impl] remove Fold[123]Table and add FoldTable.\n2006/11/27: [impl] change tool/unicode_fc.rb to see CaseFolding.txt.\n2006/11/24: [bug]  should call callback for to[j] <-> to[k] in\n                   onigenc_unicode_apply_all_case_fold().\n\n2006/11/22: Version 5.3.0\n\n2006/11/22: [dist] add index_ja.html.\n2006/11/22: [impl] undef ONIG_ESCAPE_UCHAR_COLLISION in regint.h and regenc.h.\n2006/11/21: [bug]  invalid array access.\n2006/11/21: [impl] escape UChar collision from config.h.\n2006/11/20: [new]  add Hiragana/Katakana properties into Shift_JIS.\n2006/11/20: [impl] fix CR_Katakana[] values in EUC-JP.\n2006/11/17: [impl] declare strend hash table functions in regint.h.\n2006/11/17: [impl] move property list functions to regenc.c.\n2006/11/17: [new]  add Hiragana/Katakana properties into EUC-JP.\n2006/11/15: [impl] remove NOT_RUBY from AM_CFLAGS.\n\n2006/11/14: Version 5.2.0\n\n2006/11/14: [impl] remove program codes for Ruby.\n2006/11/14: [impl] reduce program codes for Ruby.\n2006/11/10: [bug]  0x24, 0x2b, 0x3c, 0x3d, 0x3e, 0x5e, 0x60, 0x7c, 0x7e\n                   should be [:punct:].\n2006/11/09: [new]  (thanks Byte)\n                   add new character encoding CP1251.\n2006/11/08: [impl] rename QUALIFIER -> QUANTIFIER.\n\n2006/11/07: Version 5.1.0\n\n2006/11/07: [dist] remove test.rb, testconv.rb and testconvu.rb.\n2006/11/07: [bug]  get_case_fold_codes_by_str() should handle 'Ss' and 'sS'\n                   combination for ess-tsett.\n2006/11/07: [impl] apply_all_case_fold() doesn't need to return all\n                   case character combination for multi-character folding.\n                   (ONIGENC_CASE_FOLD_MULTI_CHAR)\n2006/11/07: [bug]  (thanks Byte)\n                   add { 0xa3, 0xb3 } to CaseFoldMap[] for KOI8-R.\n2006/11/06: [spec] change ONIG_OPTION_FIND_LONGEST to search all of\n                   the string range.\n                   add USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE.\n2006/11/02: [impl] re-implement expand_case_fold_string() for\n                   ONIGENC_CASE_FOLD_MULTI_CHAR.\n2006/10/30: [impl] add NSTR_DONT_GET_OPTINFO flag.\n2006/10/30: [impl] (thanks K.Takata)\n                   add THREAD_SYSTEM_INIT and THREAD_SYSTEM_END.\n2006/10/30: [bug]  (thanks Wolfgang Nadasi-Donner)\n                   invalid offset value was used in STATE_CHECK_BUFF_INIT().\n2006/10/27: [tune] speed up ONIGENC_MBC_CASE_FOLD() for UTF-16, UTF-32.\n                   (ASCII code check)\n2006/10/27: [tune] (thanks Kornelius Kalnbach)\n                   String#scan for long string needs long time compare with\n                   old Ruby\n                   by initialization time for combination explosion check\n                   ex. (\"test \" * 100_000).scan(/\\w*\\s?/)\n                   change STATE_CHECK_BUFF_MAX_SIZE from 0x8000000 to 0x8000.\n                   reduce initialization area of state_check_buff.\n2006/10/25: [impl] add DISABLE_CASE_FOLD_MULTI_CHAR().\n\n2006/10/23: Version 5.0.1\n\n2006/10/23: [bug]  should fold string in expand_case_fold_string().\n2006/10/23: [bug]  (thanks Km)\n                   too many case fold/unfold expansion problem.\n                   don't expand and set ambig flag to the string node.\n                   (except ONIGENC_CASE_FOLD_MULTI_CHAR).\n2006/10/23: [bug]  (thanks K.Takata)\n                   invalid \\p{Alnum}, \\p{ASCII}, [:alnum:], [:ascii:].\n                   fix OnigEncAsciiCtypeTable[] etc...\n2006/10/23: [spec] (thanks K.Takata)\n                   add [:word:] POSIX bracket.\n2006/10/23: [bug]  (thanks K.Takata)\n                   \\p{Word} doesn't work.\n2006/10/20: [impl] don't expand for AMBIG_FLAG string in\n                   expand_case_fold_string().\n\n2006/10/19: Version 5.0.0\n\n2006/10/18: [bug]  ONIGENC_GET_CASE_FOLD_CODES_MAX_NUM should be 13.\n2006/10/18: [impl] remove unused functions.\n2006/10/18: [dist] update documents.\n2006/10/18: [API]  move OnigMetaCharTableType to OnigSyntaxType.\n2006/10/18: [dev]  add too/unicode_fc.rb, unicode_pc.rb.\n2006/10/18: [dist] remove MANIFEST-RUBY from distribution.\n2006/10/18: [bug]  return duplicated code in\n                   onigenc_unicode_get_case_fold_codes_by_str().\n2006/10/18  [API]  remove ONIG_SYN_OP2_CHAR_PROPERTY_PREFIX_IS.\n2006/10/18: [dev]  add tool/19.\n2006/10/18: [dist] remove target 19 from Makefile.am.\n2006/10/17: [dist] add enc/unicode.c to target 19 of win32/Makefile.\n2006/10/17: [impl] change type for escape VC++ warning.\n2006/10/17: [API]  rename ONIGENC_CASE_FOLD_NONE to ONIGENC_CASE_FOLD_MIN.\n2006/10/17: [dist] remove INSTALL-RUBY from distribution.\n2006/10/17: [dist] update LTVERSION to \"2:0:0\".\n2006/10/17: [impl] remove warnings for [make CFLAGS=\"-g -O2 -Wall\"]\n                   in the case USE_UNICODE_PROPERTIES and\n                   USE_UNICODE_CASE_FOLD_MULTI_CHAR are undefined.\n2006/10/17: [impl] remove warnings for [make CFLAGS=\"-g -O2 -Wall\"].\n2006/10/17: [impl] re-implement onigenc_unicode_apply_all_case_fold().\n                   multi-char by case folded char-class is treated as\n                   caseless-string (ambig flag on).\n                   enable OP_EXACT1_IC and OP_EXACTN_IC.\n2006/10/16: [bug]  unfold expand for 1->2, 1->3 folding in\n                   onigenc_unicode_apply_all_case_fold().\n                   add CaseFoldExpand_12[], CaseFoldExpand_13[].\n2006/10/16: [bug]  (thanks Akinori Musha)\n                   first argument of rb_warn() should be format string.\n2006/10/16: [impl] add msa.state_check_buff_size initialization\n                   in onig_search().\n2006/10/16: [spec] re-implement Unicode Caseless Match codes.\n2006/10/10: [bug]  should call onig_st_free_table() in\n                   onig_free_shared_cclass_table().\n2006/10/10: [impl] remove OnigCompCaseFoldCodes.\n2006/10/10: [impl] remove onigenc_ascii_is_mbc_ambiguous() and\n                   onigenc_mbn_is_mbc_ambiguous().\n2006/10/10: [API]  remove is_mbc_ambiguous() member from OnigEncodingType.\n2006/10/10: [API]  rename onig_set_default_ambig_flag() to\n                   onig_set_default_case_fold_flag(),\n                   onig_get_default_ambig_flag() to\n                   onig_get_default_case_fold_flag(),\n                   onig_get_ambig_flag() to onig_get_case_fold_flag().\n2006/10/10: [API]  rename ambig_flag to case_fold_flag.\n2006/10/10: [API]  rename OnigAmbigType to OnigCaseFoldType.\n2006/10/10: [impl] rename ONIGENC_IS_CODE_SB_WORD() to IS_CODE_SB_WORD()\n                   and move to regint.h.\n2006/10/10: [impl] remove OP_WORD_SB and OP_WORD_MB.\n2006/10/10: [impl] remove OP_EXACT1_IC and OP_EXACTN_IC from match_at().\n2006/10/10: [impl] should free new_str in expand_case_fold_string().\n2006/10/06: [dist] add test entries to sample/encode.c.\n2006/10/06: [impl] re-implement caseless match (case-fold).\n2006/10/06: [impl] expand string node by case fold variations.\n                   add expand_case_fold_string().\n2006/10/05: [spec] rename OnigCompAmbigCodeItem to OnigCaseFoldCodeItem.\n2006/10/05: [spec] add apply_all_case_fold() and get_case_fold_codes_by_str()\n                   to OnigEncodingType.\n2006/10/05: [spec] remove ambig_flag, get_all_pair_ambig_codes() and\n                   get_all_comp_ambig_codes() member from OnigEncodingType.\n2006/10/03: [impl] rename mbc_to_normalize() to mbc_case_fold().\n2006/10/03: [spec] rename ONIGENC_AMBIGUOUS_MATCH_XXX\n                   to ONIGENC_CASE_FOLD_XXX.\n                   rename ONIGENC_CASE_FOLD_COMPOUND\n                   to ONIGENC_CASE_FOLD_MULTI_CHAR.\n2006/10/02: [impl] remove all ONIG_RUBY_M17N part.\n2006/09/29: [impl] initialize state_check_buff_size in STATE_CHECK_BUFF_INIT().\n                   make valgrind happy.\n2006/09/22: [impl] remove parse time ctype values (CTYPE_WORD etc...)\n2006/09/22: [ruby] enable USE_BACKREF_AT_LEVEL for Ruby mode.\n2006/09/22: [spec] (thanks Allan Odgaard)\n                   allow upper case letter as the first character\n                   of group name.\n                   fetch_name() and fetch_name_with_level()\n2006/09/21: [impl] convert to ascii for parameter string in\n                   onig_error_code_to_str().\n                   add enc member into OnigErrorInfo.\n2006/09/21: [dist] update documents for Unicode Property.\n2006/09/21: [new]  add Unicode Properties. (enc/unicode.c)\n                   Any, Assigned, C, Cc, L, Lm, Arabic, Greek etc...\n2006/09/21: [impl] add USE_UNICODE_PROPERTIES into regenc.h.\n2006/09/21: [impl] remove USE_UNICODE_FULL_RANGE_CTYPE.\n2006/09/20: [impl] change ONIGENC_CTYPE_XXXX to sequencial values.\n                   add BIT_CTYPE_XXXX bit flags to regenc.h.\n                   update XXXX_CtypeTable[] for BIT_CTYPE_ALNUM.\n2006/09/19: [memo] move from CVS to Subversion (1.3.2).\n2006/09/19: [impl] (thanks KOYAMA Tetsuji)\n                   HAVE_STDARG_PROTOTYPES was not defined in Mac OS X\n                   by Xcode 2.4(gcc 4.0.1) problem. [php-dev 1312] etc...\n2006/09/15: [bug]  (thanks Allan Odgaard)\n                   out of range access in bm_search_notrev().\n                   (p < s)\n2006/09/13: [impl] add ONIGENC_CTYPE_ENC_EXT flag.\n2006/09/13: [spec] remove 'Is' prefix check for property name\n                   from fetch_char_property_to_ctype().\n2006/09/13: [API]  add property_name_to_ctype member to OnigEncodingType.\n2006/09/12: [spec][ruby] add ONIG_SYN_OP2_ESC_P_BRACE_CHAR_PROPERTY and\n                   ONIG_SYN_OP2_ESC_P_BRACE_CIRCUMFLEX_NOT to OnigSyntaxRuby.\n\n2006/09/08: Version 4.4.2\n\n2006/09/08: [test] success in ruby 1.9.0 (2006-08-22) [i686-linux].\n2006/09/08: [bug]  (thanks K.Takata)\n                   out of range access in bm_search_notrev().\n2006/09/04: [spec] (thanks K.Takata)\n                   allow look-behind in negative look-behind.\n                   ex. /(?<!(?<=a)b|c)d/\n\n2006/08/29: Version 4.4.1\n\n2006/08/29: [test] success in ruby 1.9.0 (2006-08-22) [i686-linux].\n2006/08/29: [dist] (thanks Seiji Masugata)\n                    add configure option --enable-combination-explosion-check\n\n2006/08/25: Version 4.4.0\n\n2006/08/25: [test] success in ruby 1.9.0 (2006-08-22) [i686-linux].\n2006/08/25: [impl] add_state_check_num() should be enclosed in\n                   ifdef USE_COMBINATION_EXPLOSION_CHECK.\n2006/08/23: [spec] config USE_COMBINATION_EXPLOSION_CHECK is enabled\n                   in Ruby mode only.\n2006/08/22: [impl] remove last line comma in enum OpCode.\n2006/08/22: [impl] remove OP_STATE_CHECK_ANYCHAR_STAR_PEEK_NEXT and\n                   OP_STATE_CHECK_ANYCHAR_ML_STAR_PEEK_NEXT.\n2006/08/22: [impl] remove OP_BACKREF3.\n\n2006/08/21: Version 4.3.1\n\n2006/08/21: [test] success in ruby 1.9.0 (2006-07-28) [i686-linux].\n2006/08/21: [impl] change stack type values\n                   and re-define STK_MASK_TO_VOID_TARGET etc...\n2006/08/21: [impl] set repeat_range[].upper to 0x7fffffff as infinite.\n2006/08/21: [impl] add STATE_CHECK_BUFF_MALLOC_THRESHOLD_SIZE.\n2006/08/21: [impl] reduce (?:a*){n,m}, (?:a+){n,m} => (?:a*){n,n}, (?:a+){n,n}\n2006/09/21: [impl] reduce (a*){n,m}, (a+){n,m} => (a*){n,n}, (a+){n,n}\n                   if backreference is not used.\n2006/08/17: [bug]  should check scan_env.num_call > 0 for backrefed pattern\n                   in combination explosion check.\n\n2006/08/17: Version 4.3.0\n\n2006/08/17: [test] success in ruby 1.9.0 (2006-07-28) [i686-linux].\n2006/08/17: [new]  add config USE_COMBINATION_EXPLOSION_CHECK.\n                   check /(.+)*/, /(\\s*foo\\s*)*/ etc...\n            [API]  add num_comb_exp_check member in regex_t.\n            [dist] change LTVERSION value to \"1:0:0\" in configure.in.\n2006/08/15: [bug]  OP_REPEAT_INC process in match_at().\n                   should check repeat-count >= range-upper and\n                   range-upper may be infinite.\n\n2006/08/11: Version 4.2.3\n\n2006/08/11: [test] success in ruby 1.9.0 (2006-07-28) [i686-linux].\n2006/08/10: [impl] remove double call in set_qualifier().\n2006/08/10: [impl] remove by_number member in QualifierNode.\n2006/08/09: [impl] remove a comma at the end of enum ReduceType\n                   for escape warning on Mac OS X.\n2006/08/07: [impl] remove warning in regcomp.c.\n2006/08/07: [spec] move definition of USE_BACKREF_AT_LEVEL into NOT_RUBY.\n\n2006/08/03: Version 4.2.2\n\n2006/08/03: [test] success in ruby 1.9.0 (2006-07-28) [i686-linux].\n2006/08/03: [bug]  (thanks Hiroyuki Yamamoto)\n                   segmentation fault in regexec(). (POSIX API)\n2006/08/02: [bug]  combination of \\G in look-ahead/look-behind and other\n                   anchors(\\A, \\z, \\Z) cause invalid result.\n                   ex. /(?!\\G)a\\z/.match(\"ba\")\n                   start arg. of MATCH_ARG_INIT() should be original\n                   arg. of onig_search().\n\n2006/07/31: Version 4.2.1\n\n2006/07/31: [test] success in ruby 1.9.0 (2006-07-28) [i686-linux].\n2006/07/31: [bug] (thanks Kimura Minoru)\n                   re-implement bm_search_notrev().\n2006/07/31: [impl] bm_search_notrev() refactoring.\n2006/07/31: [bug]  (thanks Kimura Minoru)\n                   fix incomplete multibyte string in exact info.\n2006/07/31: [impl] (thanks Seiji Masugata)\n                   remove cast in va_init_list() for Intel C Compiler.\n\n2006/07/18: Version 4.2.0\n\n2006/07/18: [test] success in ruby 1.9.0 (2006-03-01) [i686-linux].\n2006/07/18: [new]  (thanks Wolfgang Nadasi-Donner)\n                   add back reference with nest level.\n                   \\k<name+n>, \\k<name-n>\n2006/07/11: [impl] change long to unsigned long for ONIG_OPTION_XXX\n                   and ONIG_SYN_XXX number literals.\n\n2006/07/03: Version 4.1.2\n\n2006/07/03: [test] success in ruby 1.9.0 (2006-03-01) [i686-linux].\n2006/07/03: [spec] (thanks Wolfgang Nadasi-Donner)\n                   allow \\G in look-behind.\n                   add ANCHOR_BEGIN_POSITION flag in setup_tree().\n2006/06/12: [impl] (thanks matz)\n                    fix cast from char* to const char*\n                    in onig_snprintf_with_pattern().\n                    fix cast from char* to const char*\n                    for PopularQStr[] and ReduceQStr[].\n\n2006/05/22: Version 4.1.1\n\n2006/05/22: [test] success in ruby 1.9.0 (2006-03-01) [i686-linux].\n2006/05/22: [impl] add position string argument to STACK_BASE_CHECK().\n2006/05/22: [bug]  (thanks NARUSE, Yui)\n                   add STK_NULL_CHECK_END to IS_TO_VOID_TARGET().\n                   ex. core dump in\n                   /(?<pare>\\(([^\\(\\)]++|\\g<pare>)*+\\))/.match('((a))')\n\n2006/05/15: Version 4.1.0\n\n2006/05/15: [test] success in ruby 1.9.0 (2006-03-01) [i686-linux].\n2006/05/15: [impl] thread atomic changes for onig_end() and\n                   onig_free_node_list().\n2006/05/15: [test] success in ruby 1.9.0 (2006-03-01) [i686-linux].\n2005/05/15: [dist] update API, API.ja, FAQ, FAQ.ja.\n2006/05/15: [spec] remove onig_recompile(), onig_recompile_deluxe()\n                   and re_recompile_pattern().\n                   add config USE_RECOMPILE_API.\n2006/05/15: [impl] improved thread safe implementation of onig_search()\n                   and onig_match().\n\n2006/05/11: Version 4.0.4\n\n2006/05/11: [test] success in ruby 1.9.0 (2006-03-01) [i686-linux].\n2006/05/11: [bug]  (thanks Yuji Kaneda)\n                   dead-lock in onig_end().\n2006/05/11: [dist] update index.html.\n\n2006/05/08: Version 4.0.3\n\n2006/05/08: [test] success in ruby 1.9.0 (2006-03-01) [i686-linux].\n2006/05/08: [bug]  (thanks Allan Odgaard)\n                   Segmentation fault in backward search.\n                   ex. /^\\t.*$/\n2006/04/18: [dist] update index.html.\n2006/04/05: [dist] update index.html.\n2006/03/24: [dist] update doc/RE, doc/RE.ja.\n\n2006/03/23: Version 4.0.2\n\n2006/03/22: [test] success in ruby 1.9.0 (2006-03-01) [i686-linux].\n2006/03/22: [impl] add both of ONIG_OPTION_DONT_CAPTURE_GROUP\n                   and ONIG_OPTION_CAPTURE_GROUP check.\n2006/03/22: [spec] add error code ONIGERR_INVALID_COMBINATION_OF_OPTIONS.\n2006/03/22: [impl] remove USE_NAMED_GROUP condition from\n                   ONIG_OPTION_DONT_CAPTURE_GROUP check in parse_effect().\n2006/03/22: [new]  add API onig_noname_group_capture_is_active().\n2006/03/01: [spec] rename regex object type from regex_t to OnigRegexType.\n                   add typedef OnigRegexType regex_t\n                   unless ONIG_ESCAPE_REGEX_T_COLLISION is defined.\n2006/02/27: [spec] change ONIG_MAX_MULTI_BYTE_RANGES_NUM from 1000\n                   to 10000.  (for docdiff program)\n2006/02/17: [dist] change COPYING year 2005 -> 2006.\n\n2006/02/07: Version 4.0.1\n\n2006/02/07: [test] success in ruby 1.9.0 (2005-11-28) [i686-linux].\n2006/02/07: [bug]  memory leaks in onig_free_shared_cclass_table().\n2006/02/03: [ruby] add -m 0644 option to install command in \"make 19\".\n2006/02/03: [impl] rename ANCHOR_ANYCHAR_STAR_PL to ANCHOR_ANYCHAR_STAR_ML.\n                   change from IS_POSIXLINE() to IS_MULTILINE()\n                   for ANCHOR_ANYCHAR_START/_ML decision\n                   in optimize_node_left().\n2006/01/26: [dist] update index.html for Oniguruma 2.5.3.\n2006/01/25: [dist] update URL in index.html.\n\n2006/01/24: Version 4.0.0\n\n2006/01/24: [test] success in ruby 1.9.0 (2005-11-28) [i386-cygwin].\n2006/01/24: [test] success in ruby 1.9.0 (2005-11-28) [i686-linux].\n2006/01/24: [dist] remove warnings from sample/encode.c.\n2006/01/24: [dist] change install description in README(.ja).\n2006/01/24: [dist] remove re.c.XXX.patch from distribution and CVS.\n2006/01/24: [dist] --- support shared library ---\n                   use GNU libtool/automake.\n                   change configure.in and add Makefile.am, sample/Makefile.am.\n                   add AUTHORS file.\n2006/01/24: [dist] test programs return exit code -1 when test fails.\n2006/01/24: [bug] (thanks KIMURA Koichi)\n                   invalid syntax definition in ONIG_SYNTAX_GREP.\n                   ONIG_SYN_OP_BRACE_INTERVAL\n                   -> ONIG_SYN_OP_ESC_BRACE_INTERVAL\n2006/01/23: [dist] fix configure.in for onig-config.\n2006/01/19: [new]  add new config USE_UNICODE_ALL_LINE_TERMINATORS.\n                   (U+000d, U+0085, U+2028, U+2029)\n2005/12/29: [dist] change pmatch array size to 25 in testconv.rb.\n2005/12/26: [dist] fix name in test.rb.\n2005/12/26: [dist] update index.html for 2.5.1.\n\n2005/11/29: Version 3.9.1\n\n2005/11/29: [test] success in ruby 1.9.0 (2005-11-28) [i686-linux].\n2005/11/24: [test] success in ruby 1.9.0 (2005-08-09) [i686-linux].\n2005/11/21: [test] success in ruby 1.9.0 (2005-11-20) [i386-cygwin].\n2005/11/21: [bug]  (thanks Allan Odgaard)\n                   utf-8 character comments in extended mode leads\n                   invalid result.\n                   ex. /(?x)(?<= # <any-utf-8 multibyte char>o\\n~) /\n                   fix onigenc_unicode_is_code_ctype() and\n                   utf8_is_code_ctype().\n2005/11/20: [bug]  (thanks MATSUMOTO Satoshi) (thanks Isao Sonobe)\n                   begin-line anchor and BM search optimization leads\n                   invalid result in UTF-16/32.\n                   fix in set_optimize_exact_info().\n\n2005/11/20: Version 3.9.0\n\n2005/11/20: [test] success in ruby 1.9.0 (2005-11-20) [i386-cygwin].\n2005/11/20: [test] success in ruby 1.9.0 (2005-10-18) [i386-cygwin].\n2005/11/20: [new]  add new config USE_CRNL_AS_LINE_TERMINATOR.\n                   (!!! NO SUPPORT experimental option !!!)\n2005/11/15: [bug]  (thanks Allan Odgaard)\n                   tok->escape was not cleared in fetch_token_in_cc().\n                   ex. [\\s&&[^\\n]] makes wrong result.\n2005/10/18: [impl] (thanks nobu)\n                   change sjis_mbc_enc_len()\n                   and node_new_cclass_by_codepoint_range() scope to static.\n2005/09/05: [dist] remove link to MultiFind.\n2005/09/01: [dist] add link to yagrep.\n\n2005/08/23: Version 3.8.9\n\n2005/08/23: [test] success in ruby 1.9.0 (2005-08-09) [i686-linux].\n2005/08/23: [inst] fix Makefile.in for make ctest/ptest.\n\n2005/08/23: Version 3.8.8\n\n2005/08/23: [test] success in ruby 1.9.0 (2005-08-09) [i686-linux].\n2005/08/23: [impl] split is_code_in_cc() from onig_is_code_in_cc().\n2005/08/23: [impl] should check DATA_ENSURE() at OP_CCLASS_NODE in match_at().\n2005/08/23: [impl] (thanks akr)\n                   add ONIG_OPTION_MAXBIT for escape conflict with\n                   Ruby's option.\n2005/08/22: [impl] escape GCC 4.0 warnings for testc.c.\n2005/08/22: [bug]  (thanks nobu, matz) [ruby-dev:26840]\n                   UTF-8 0xFE, 0xFF handling bug in code_is_in_cclass_node().\n                   abort on /\\S*/ =~ \"\\xfe\"\n2005/08/22: [impl] escape GCC 4.0 warnings for sample/*.c.\n2005/08/22: [impl] fix testconvu.rb.\n2005/08/22: [impl] escape GCC 4.0 warnings.\n\n2005/08/09: Version 3.8.7\n\n2005/08/09: [test] success in ruby 1.9.0 (2005-08-09) [i686-linux].\n2005/08/09: [bug]  (thanks Allan Odgaard)\n                   should not call enc_len() for s == range\n                   in onig_search().\n2005/08/01: [dist] add mkdir $prefix, mkdir $exec_prefix to make install.\n\n2005/07/27: Version 3.8.6\n\n2005/07/27: [test] success in ruby 1.9.0 (2005-07-26) [i686-linux].\n2005/07/27: [impl] update onig-config.in.\n2005/07/26: [new]  (thanks Yen-Ju Chen)\n                   add Oniguruma configuration check program.\n                   (onig-config.in)\n\n2005/07/14: Version 3.8.5\n\n2005/07/14: [test] success in ruby 1.9.0 (2005-07-14) [i686-linux].\n2005/07/11: [test] success in ruby 1.9.0 (2005-07-04) [i686-linux].\n2005/07/11: [bug]  (thanks nobu) [ruby-dev:26505]\n                   invalid handling for /\\c\\x/ and /\\C-\\x/.\n                   fix fetch_escaped_value().\n2005/07/05: [impl] (thanks Alexey Zakhlestine)\n                   escape GCC 4.0 warnings.\n\n2005/07/01: Version 3.8.4\n\n2005/07/01: [test] success in ruby 1.9.0 (2005-07-01) [i686-linux].\n2005/06/30: [test] success in ruby 1.9.0 (2005-06-28) [i686-linux].\n2005/06/30: [dist] add GB 18030 test to sample/encode.c.\n2005/06/30: [impl] escape warning of gb18030_left_adjust_char_head().\n2005/06/30: [new]  (contributed by KUBO Takehiro)\n                   add new character encoding ONIG_ENCODING_GB18030.\n2005/06/30: [bug]  invalid ctype check for multibyte encodings.\n                   (\"graph\", \"print\")\n                   fix onigenc_mb2/4_is_code_ctype(),\n                   eucjp_is_code_ctype() and sjis_is_code_ctype().\n2005/06/30: [bug]  invalid conversion from code point to mbc in\n                   onigenc_mb4_code_to_mbc().\n\n2005/06/28: Version 3.8.3\n\n2005/06/28: [test] success in ruby 1.9.0 (2005-06-28) [i686-linux].\n2005/06/27: [test] success in ruby 1.9.0 (2005-05-31) [i686-linux].\n2005/06/27: [bug]  (thanks Wolfgang Nadasi-Donner)\n                   invalid check for never ending recursion.\n                   lower zero quantifier should be treated as\n                   a non-recursive call alternative.\n                   ex. /(?<bal>[^()]*(\\(\\g<bal>\\)[^()]*)*)/\n2005/06/15: [impl] add divide_ambig_string_node_sub().\n2005/06/15: [dist] add a test to sample/encode.c.\n2005/06/10: [new]  add ONIG_SYNTAX_PERL_NG. (Perl + named group)\n\n2005/06/01: Version 3.8.2\n\n2005/06/01: [test] success in ruby 1.9.0 (2005-05-31) [i686-linux].\n2005/05/31: [dist] add doc/FAQ and doc/FAQ.ja.\n2005/05/31: [impl] minor change in node_new().\n2005/05/30: [test] success in ruby 1.9.0 (2005-05-11) [i686-linux].\n2005/05/30: [bug]  (thanks Allan Odgaard)\n                   FreeNodeList null check should be on thread-atomic\n                   in node_new().\n\n2005/05/11: Version 3.8.1\n\n2005/05/11: [test] success in ruby 1.9.0 (2005-05-11) [i386-mswin32].\n2005/05/11: [dist] update win32/Makefile (make 19).\n2005/05/11: [test] success in ruby 1.9.0 (2005-05-11) [i686-linux].\n2005/05/06: [test] success in ruby 1.9.0 (2005-05-06) [i686-linux].\n2005/05/06: [impl] (thanks nobu) [ruby-core:4815]\n                   add #ifdef USE_VARIABLE_META_CHARS to goto label.\n2005/04/25: [test] success in ruby 1.9.0 (2005-04-25) [i686-linux].\n2005/04/25: [impl] change DEFAULT_WARN_FUNCTION and DEFAULT_VERB_WARN_FUNCTION\n                   to onig_rb_warn() and onig_rb_warning().\n\n2005/04/15: Version 3.8.0\n\n2005/04/15: [test] success in ruby 1.9.0 (2005-04-14) [i686-linux].\n2005/04/01: [test] success in ruby 1.9.0 (2005-03-24) [i686-linux].\n2005/04/01: [impl] (thanks Joe Orton)\n                   (thanks Moriyoshi Koizumi)\n                   many const-ification to many *.[ch] files.\n\n2005/03/25: Version 3.7.2\n\n2005/03/25: [test] success in ruby 1.9.0 (2005-03-24) [i686-linux].\n2005/03/23: [test] success in ruby 1.9.0 (2005-03-20) [i686-linux].\n2005/03/23: [test] success in ruby 1.9.0 (2005-03-08) [i686-linux].\n2005/03/23: [new]  add ONIG_SYNTAX_ASIS.\n2005/03/23: [new]  add ONIG_SYN_OP2_INEFFECTIVE_ESCAPE.\n2005/03/09: [spec] rename MBCTYPE_XXX to RE_MBCTYPE_XXX. (GNU API)\n2005/03/08: [test] success in ruby 1.9.0 (2005-03-08) [i686-linux].\n2005/03/08: [impl] (thanks matz) [ruby-dev:25783]\n                   should not allocate memory for key data in st.c.\n                   move st_*_strend() functions from st.c. fixed some\n                   potential memory leaks.\n                   (imported from Ruby 1.9 2005-03-08)\n\n2005/03/07: Version 3.7.1\n\n2005/03/07: [test] success in ruby 1.9.0 (2005-03-07) [i686-linux].\n2005/03/07: [impl] (thanks Rui Hirokawa)\n                   add ONIG_ESCAPE_UCHAR_COLLISION.\n                   rename UChar to OnigUChar in oniguruma.h.\n2005/03/07: [impl] remove declarations for Ruby in oniggnu.h.\n2005/03/05: [bug]  ANCHOR_ANYCHAR_STAR didn't work in onig_search().\n2005/03/01: [dist] remove oniggnu.h from MANIFEST-RUBY.\n                   remove oniggnu.h from make 19.\n2005/03/01: [bug]  (thanks matz) [ruby-dev:25778]\n                   uninitialized member (OptEnv.backrefed_status)\n                   was used.\n\n2005/02/19: Version 3.7.0\n\n2005/02/19: [test] success in ruby 1.9.0 (2005-02-19) [i386-cygwin].\n2005/02/19: [new]  (thanks Minero Aoki)\n                   add onig_region_set().\n2005/02/19: [API]  change onig_region_init() to extern.\n2005/02/19: [dist] remove reggnu.c from MANIFEST-RUBY.\n                   remove reggnu.c from make 19.\n2005/02/19: [dist] update doc/API and doc/API.ja.\n2005/02/19: [test] success in ruby 1.9.0 (2005-02-19) [i386-cygwin].\n2005/02/19: [impl] (thanks Alexey Zakhlestine)\n                   change UChar* to const UChar* in oniguruma.h,\n                   regenc.h and regparse.h.\n2005/02/13: [impl] change UChar* to const UChar* in oniguruma.h and\n                   onigposix.h and st.h.\n2005/02/12: [test] success in ruby 1.9.0 (2005-02-11) [i386-cygwin].\n2005/02/12: [bug]  (thanks nobu) [ruby-dev:25676]\n                   type_cclass_hash() fix overrun.\n2005/02/09: [test] success in ruby 1.9.0 (2005-02-09) [i686-linux].\n2005/02/09: [spec] add RE_OPTION_FIND_NOT_EMPTY etc.. to oniggnu.h.\n2005/02/09: [dist] remove hash.c.patch.\n2005/02/07: [impl] remove re_mbctab, mbctab_ascii etc...\n                   (USE_COMPATIBILITY_FOR_RUBY_EXTENSION_LIBRARY)\n\n2005/02/04: Version 3.6.0\n\n2005/02/04: [test] success in ruby 1.9.0 (2005-02-04) [i686-linux].\n2005/02/01: [bug]  add key_free() call to st_free_table().\n2005/02/01: [new]  add onig_get_default_ambig_flag() and\n                   onig_set_default_ambig_flag().\n2005/02/01: [dist] update MANIFEST-RUBY.\n2005/01/31: [test] success in ruby 1.9.0 (2005-01-29) [i686-linux].\n2005/01/31: [spec] remove ONIGENC_AMBIGUOUS_MATCH_COMPOUND\n                   from ONIGENC_AMBIGUOUS_MATCH_DEFAULT.\n2005/01/31: [dist] update Makefile.in (make 19).\n2005/01/29: [memo] (thanks Kazuo Saito)\n                   Oniguruma 3.5.4 was merged to Ruby 1.9.0.\n2005/01/28: [impl] (thanks UK-taniyama)\n                   add extern \"C\" { } directive to oniguruma.h, oniggnu.h\n                   and onigposix.h for C++.\n2005/01/25: [impl] remove nested function call for xxx_code_to_mbclen().\n                   (euc_kr.c, euc_tw.c, big5.c)\n\n2005/01/19: Version 3.5.4\n\n2005/01/19: [test] success in ruby 1.9.0 (2005-01-05) [i686-linux].\n2005/01/19: [bug]  (thanks Isao Sonobe)\n                   callback function argument name_end of onig_foreach_name()\n                   was wrong.\n                   name key of name table should be null terminated for\n                   character encoding length.\n                   add strdup_with_null(), rename onig_strdup() to k_strdup().\n                   use e->name_len in i_names().\n2005/01/17: [impl] (thanks UK-taniyama)\n                   add HAVE_SYS_TYPES_H to config.h.in.\n\n2005/01/13: Version 3.5.3\n\n2005/01/13: [test] success in ruby 1.9.0 (2005-01-05) [i686-linux].\n2005/01/13: [bug]  ignore case match bug.\n                   ex. /s+/iu.match(\"SSSSS\") ==> [4..5]\n                   fix OP_EXACT1_IC, OP_EXACTN_IC process.\n2005/01/13: [bug]  (thanks Isao Sonobe)\n                   ignore case match bug.\n                   ex. /is/iu.match(\"ss\") fail.\n                   fix str_lower_case_match() etc.\n\n2005/01/05: Version 3.5.2\n\n2005/01/05: [test] success in ruby 1.9.0 (2005-01-05) [i686-linux].\n2005/01/05: [test] success in ruby 1.9.0 (2004-12-16) [i686-linux].\n2005/01/05: [bug]  (thanks Isao Sonobe)\n                   ignore case match bug.\n                   ex. /s+/iu.match(\"sssss\") ==> [4..5]\n                   fix OP_EXACT1_IC, OP_EXACTN_IC process.\n2005/01/05: [bug]  (thanks Isao Sonobe)\n                   group name table should be renumbered.\n                   add onig_renumber_name_table().\n2004/12/24: [dist] remove file onigcmpt200.h.\n\n2004/12/17: Version 3.5.1\n\n2004/12/17: [dist] add INSTALL-RUBY to archive.\n2004/12/16: [test] success in ruby 1.9.0 (2004-12-16) [i686-linux].\n2004/12/16: [dist] update hash.c.patch.\n2004/12/15: [bug]  (thanks matz)\n                   char > 127 should be casted to unsigned char. (utf8.c)\n2004/12/13: [impl] add HAVE_PROTOTYPES and HAVE_STDARG_PROTOTYPES definition\n                   to oniguruma.h in the case __cplusplus.\n2004/12/06: [dist] update doc/RE and doc/RE.ja.\n2004/12/03: [impl] (thanks nobu)\n                   st.h fix prototype for C++.\n\n2004/12/03: Version 3.5.0\n\n2004/12/02: [test] success in ruby 1.9.0 (2004-12-02) [i686-linux].\n2004/12/01: [test] success in ruby 1.9.0 (2004-12-01) [i386-mswin32].\n2004/12/01: [dist] add make targets 19 and 19up to win32/Makefile.\n2004/12/01: [test] success in ruby 1.9.0 (2004-12-01) [i386-cygwin].\n2004/12/01: [test] success in ruby 1.9.0 (2004-12-01) [i686-linux].\n2004/12/01: [impl] double cast for escape warning in Cygwin.\n                  (HashDataType* )((void* )(&e)) in regparse.c\n2004/12/01: [test] success in ruby 1.9.0 (2004-11-30) [i686-linux].\n2004/12/01: [tune] change implementation of clear_opt_map_info().\n                   (which was 10-16% cost in gprof result for my test program)\n2004/12/01: [dist] remove regex.c from distribution files.\n2004/11/30: [memo] remove targets 16 and 18 from Makefile.in.\n2004/11/30: [test] success in ruby 1.9.0 (2004-11-30) [i686-linux].\n2004/11/30: [inst] add \"cp -p st.[ch] st.[ch].ruby_orig\" to \"make 19\".\n2004/11/30: [tune] map_position_value() return 20 if code is 0\n                   and minimum enclen > 1.\n2004/11/30: [test] success in ruby 1.9.0 (2004-11-29) [i686-linux].\n2004/11/30: [impl] minor changes for multi-thread in regexec.c and regcomp.c.\n2004/11/30: [impl] change THREAD_PASS_LIMIT_COUNT value from 10 to 8.\n2004/11/30: [impl] add THREAD_ATOMIC_XXX to FreeNodeList access in regparse.c\n2004/11/29: [impl] add USE_MULTI_THREAD_SYSTEM.\n2004/11/29: [memo] add hash.c.patch to CVS.\n2004/11/29: [dist] change mail address to 'sndgk393 AT ...'\n2004/11/29: [dist] add -s option (silent mode) to test.rb.\n2004/11/29: [tune] change THRESHOLD_RANGE_NUM_FOR_SHARE_CCLASS value\n                   from 20 to 8.\n2004/11/29: [inst] add make target \"19up\".\n2004/11/29: [dist] change Oniguruma Home Page URL.\n2004/11/29: [impl] remove onig_is_in_code_range_array().\n2004/11/29: [dist] fix doc/RE and RE.ja (character types).\n2004/11/26: [dist] fix win32/Makefile.\n2004/11/26: [dist] fix doc/RE and RE.ja (multibyte character types).\n2004/11/26: [impl] add onig_free_shared_cclass_table().\n2004/11/26: [impl] move definition USE_UNICODE_FULL_RANGE_CTYPE to regenc.h.\n2004/11/26: [impl] add opcode OP_CCLASS_NODE.\n2004/11/26: [impl] move definition of CClassNode to regint.h.\n2004/11/26: [impl] add type PointerType in regint.h.\n2004/11/25: [impl] remove ONIGENC_CTYPE_MOD_NOT.\n2004/11/25: [impl] rename onig_node_new_cclass_by_codepoint_range to\n                   node_new_cclass_by_codepoint_range.\n2004/11/25: [impl] remove get_type_cc_node method from OnigEncodingType.\n2004/11/25: [impl] move implementation of shared char-class from enc/*.c\n                   to regparse.c.\n2004/11/25: [dist] add hash.c.patch for Ruby 1.9 hash.c change.\n2004/11/22: [impl] change utf8_get_type_node().\n2004/11/22: [impl] add ONIGENC_CTYPE_MOD_NOT.\n2004/11/22: [bug]  (thanks MIYAMUKO Katsuyuki)\n                   ruby make test fail in HP-UX B.11.23 ia64.\n                   should use tok->u.code instead of tok->u.c in\n                   the case of TK_CODE_POINT.\n2004/11/19: [bug]  (thanks Yoshida Masato)\n                   invalid multibyte code causes segmentation fault.\n                   ex.  /[\\xFF-\\xFF]/u\n2004/11/19: [bug]  (thanks Yoshida Masato)\n                   illegal check in char-class range in UTF-8.\n                   ex.  s = \"[\\xC2\\xA0-\\xC3\\xBE]\"\n                        p(Regexp.new(s, nil, \"u\") =~ \"\\xC3\\xBE\")\n2004/11/18: [impl] add onig_node_new_cclass_by_codepoint_range().\n2004/11/18: [impl] remove OnigCodePointRange type. (use OnigCodePoint[].)\n2004/11/17: [bug]  (thanks nobu)\n                   abort in \"a\".gsub(/a\\Z/, \"\")\n                   fix ONIGENC_STEP_BACK() argument in onig_search().\n2004/11/16: [impl] add key2 member to st_table_entry in st.[ch].\n                   change API of st for non-null terminated string key.\n2004/11/16: [impl] add get_type_cc_node method to OnigEncodingType.\n2004/11/15: [impl] add st.h and st.c from Ruby 1.9.\n                   use st-hash always.\n2004/11/12: [impl] change member 'not' of CClassNode to 'flags'.\n                   add flags FLAG_CCLASS_NOT and FLAG_CCLASS_SHARE.\n2004/11/12: [impl] add onig_is_in_code_range_array() to enc/unicode.c.\n2004/11/12: [impl] fix CRWord in enc/unicode.c and MBWord in enc/utf8.c.\n2004/11/11: [bug]  fix enc/utf8.c.\n                   size 0 array initializer was compile error in VC++.\n2004/11/09: [inst] (thanks Hiroki YAGITA)\n                   change installed file mode to 0644.\n2004/11/09: [bug]  (thanks UK-taniyama)\n                   wrong definitions GET_RELADDR_INC(), GET_ABSADDR_INC()\n                   etc... (NOT PLATFORM_UNALIGNED_WORD_ACCESS)\n2004/11/09: [impl] type cast in regexec() for remove compile time warning.\n                   (WIN32, regposix.c)\n2004/11/08: [spec] fix Unicode character types.\n                   0x00ad (soft hyphen) should be [:cntrl:] and [:space:] type.\n                   [0x0009..0x000d], 0x0085 should be [:print:] type.\n                   0x00ad should not be [:punct:] type.\n2004/11/08: [inst] fix Makefile.in. (for make ctest/ptest/testcu)\n2004/11/06: [impl] (thanks Kazuo Saito)\n                   too many alternatives pattern causes core dump.\n                   change implementation of onig_node_free().\n2004/11/05: [spec] rename ONIGERR_END_PATTERN_AT_BACKSLASH to\n                   ONIGERR_END_PATTERN_AT_ESCAPE.\n2004/11/05: [impl] (thanks matz)\n                   escape compile time warnings for x86-64 Linux.\n                   StackIndex type int -> long\n2004/11/05: [memo] (thanks Kazuo Saito)\n                   Oniguruma 3.4.0 was merged to Ruby 1.9.0.\n\n2004/10/30: Version 3.4.0\n\n2004/10/30: [test] success in ruby 1.9.0 (2004-09-24) [i686-linux].\n2004/10/30: [new]  add hexadecimal digit char type. (\\h, \\H)\n                   syntax: ONIG_SYN_OP2_ESC_H_XDIGIT\n2004/10/30: [bug]  (thanks Guy Decoux)\n                   reluctant infinite repeat bug.\n                   ex. /^[a-z]{2,}?$/.match(\"aaa\") fail.\n                   fix OP_REPEAT_INC_NG process in match_at().\n\n2004/10/18: Version 3.3.1\n\n2004/10/18: [test] success in ruby 1.9.0 (2004-09-24) [i686-linux].\n2004/10/18: [impl] (thanks Imai Yasumasa)\n                   enclose #include <sys/types.h> by #ifndef __BORLANDC__.\n2004/10/18: [bug]  (thanks Imai Yasumasa)\n                   memory access violation in select_opt_exact_info().\n2004/09/25: [dist] fix doc/API and doc/API.ja.\n2004/09/25: [bug]  fix OP_SEMI_END_BUF process in match_at() for\n                   the case USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE\n                   is not defined.\n\n2004/09/17: Version 3.3.0\n\n2004/09/17: [dist] add COPYING to program source files.\n2004/09/17: [test] success in ruby 1.9.0 (2004-07-23) [i686-linux].\n2004/09/17: [bug]  (thanks Isao Sonobe)\n                   memory access violations in xxx_mbc_enc_len(),\n                   and xxx_mbc_to_normalize() and\n                   xxx_left_adjust_char_head().\n                   add string range check in match_at() and onig_search().\n2004/09/08: [dist] change mail address format.(kosako AT sofnec ...)\n\n2004/09/04: Version 3.2.9\n\n2004/09/04: [test] success in ruby 1.9.0 (2004-07-23) [i686-linux].\n2004/09/04: [bug]  (thanks Bob Kerstetter and Richard Koch)\n                   search fail in ignore case mode.\n                   fix str_lower_case_match().\n2004/09/04: [inst] (thanks Isao Sonobe)\n                   clear sample directory in 'make clean'.\n2004/09/04: [bug]  fix ONIGENC_AMBIGUOUS_MATCH_COMPOUND/ASCII/NONASCII\n                   meanings in XXXXX_mbc_to_normalize() and\n                   XXXXX_is_mbc_ambiguous().\n2004/08/28: [bug]  fix ONIGENC_AMBIGUOUS_MATCH_COMPOUND/ASCII/NONASCII\n                   meanings in iso_8859_XX_mbc_to_normalize() and\n                   iso_8859_XX_is_mbc_ambiguous().\n\n2004/08/24: Version 3.2.8\n\n2004/08/24: [test] success in ruby 1.9.0 (2004-07-23) [i686-linux].\n2004/08/24: [spec] add ONIG_SYN_FIXED_INTERVAL_IS_GREEDY_ONLY.\n                   /a{n}?/ == /(?:a{n})?/\n2004/08/24: [dist] fix doc/RE and doc/RE.ja.\n2004/08/24: [bug]  (thanks starfish)\n                   memory leak in set_optimize_exact_info().\n\n2004/08/21: Version 3.2.7\n\n2004/08/21: [test] success in ruby 1.8.2 (2004-07-28) [i686-linux].\n                   (1.8.2 preview2)\n2004/08/21: [test] success in ruby 1.9.0 (2004-07-23) [i686-linux].\n2004/08/21: [bug]  (thanks Isao Sonobe) (thanks kage)\n                   memory access violation in bm_search_notrev().\n                   (forgotten to merge from 2.X)\n\n2004/07/24: Version 3.2.6\n\n2004/07/24: [test] success in ruby 1.9.0 (2004-07-23) [i686-linux].\n2004/07/24: [test] success in ruby 1.8.2 (2004-07-16) [i686-linux].\n2004/07/24: [bug]  fix warnings for regexec.c. (gcc 2.91.66)\n2004/07/24: [memo] change version control system from Subversion\n                   to CVS 1.11.17.\n2004/07/20: [bug]  (thanks Isao Sonobe)\n                   illegal result in negative character class in ignore case\n                   mode. fix pair-ambig-codes process in parse_exp().\n                   ex. /[^a]/i.match(\"A\")\n2004/07/20: [bug]  (thanks Isao Sonobe)\n                   undefined bytecode error happens in UTF-16BE etc..\n                   compile_length_cclass_node() was not consistent with\n                   compile_cclass_node().\n\n2004/07/01: Version 3.2.5\n\n2004/07/01: [test] success in ruby 1.8.2 (2004-06-23) [i686-linux].\n2004/07/01: [new]  add onig_get_syntax_{op,op2,behavior,options}.\n2004/07/01: [bug]  (thanks Isao Sonobe)\n                   invalid result in onig_capture_tree_traverse().\n                   fix make_capture_history_tree().\n\n2004/06/29: Version 3.2.4\n\n2004/06/29: [test] success in ruby 1.8.2 (2004-06-23) [i686-linux].\n2004/06/29: [new]  (thanks Isao Sonobe)\n                   add onig_number_of_captures().\n\n2004/06/25: Version 3.2.3\n\n2004/06/25: [test] success in ruby 1.8.2 (2004-06-23) [i686-linux].\n2004/06/25: [bug]  (thanks Isao Sonobe)\n                   invalid result in onig_capture_tree_traverse().\n                   fix make_capture_history_tree().\n\n2004/06/24: Version 3.2.2\n\n2004/06/24: [test] success in ruby 1.8.0 (2003-08-08) [i386-cygwin].\n2004/06/24: [test] success in ruby 1.8.0 (2003-08-08) [i386-mswin32].\n2004/06/24: [test] success in ruby 1.8.2 (2004-06-23) [i686-linux].\n2004/06/24: [new]  (thanks Isao Sonobe)\n                   add onig_number_of_capture_histories().\n2004/06/24: [bug]  (thanks Isao Sonobe)\n                   invalid char position match in UTF-16 and UTF-32.\n                   add onigenc_always_false_is_allowed_reverse_match().\n\n2004/06/17: Version 3.2.1\n\n2004/06/17: [test] success in ruby 1.8.0 (2003-08-08) [i386-cygwin].\n2004/06/17: [test] success in ruby 1.8.0 (2003-08-08) [i386-mswin32].\n2004/06/17: [test] success in ruby 1.8.2 (2004-05-18) [i686-linux].\n2004/06/17: [impl] should not use OP_REPEAT for (...)? even if target size\n                   is long.\n2004/06/17: [bug]  (thanks nobu) [ruby-dev:23703]\n                   should use STACK_AT() instead of stkp in OP_REPEAT_INC.\n                   add IN_VAR_REPEAT flag in setup_tree().\n2004/06/16: [impl] change select_opt_exact_info() to use ByteValTable[].\n2004/06/16: [impl] change map_position_value() table values.\n2004/06/14: [impl] (thanks John Carter)\n                   RelAddrType, AbsAddrType and LengthType change\n                   from short int to int type for the very long string match.\n2004/06/14: [bug]  (thanks Greg A. Woods)\n                   fix nmatch argument of regexec() is smaller than\n                   reg->num_mem + 1 case. (POSIX API)\n2004/06/14: [spec] (thanks Greg A. Woods)\n                   set pmatch to NULL if nmatch is 0 in regexec(). (POSIX API)\n\n2004/06/10: Version 3.2.0\n\n2004/06/10: [test] success in ruby 1.8.0 (2003-08-08) [i386-cygwin].\n2004/06/10: [test] success in ruby 1.9.0 (2004-05-27) [i386-mswin32].\n2004/06/10: [test] success in ruby 1.8.2 (2004-05-18) [i686-linux].\n2004/06/10: [dist] add README.ja.\n2004/06/10: [new]  add onig_copy_encoding().\n2004/06/10: [API]  add encoding argument to onig_set_meta_char().\n                   add meta_char_table member to OnigEncodingType.\n2004/06/08: [dist] add doc/API.ja.\n2004/06/07: [API]  add num_of_elements member to OnigCompileInfo.\n2004/05/29: [memo] (thanks Kazuo Saito)\n                   Oniguruma 3.1.0 was merged to Ruby 1.9.0.\n2004/05/26: [impl] rename NST_SIMPLE_REPEAT to NST_STOP_BT_SIMPLE_REPEAT.\n2004/05/26: [impl] doesn't need to check that target's simple repeat-ness\n                   for EFFECT_MEMORY type node in setup_tree().\n\n2004/05/25: Version 3.1.0\n\n2004/05/25: [test] success in ruby 1.8.0 (2003-08-08) [i386-mswin32].\n2004/05/25: [test] success in ruby 1.8.0 (2003-08-08) [i386-cygwin].\n2004/05/25: [test] success in ruby 1.9.0 (2004-05-23) [i686-linux].\n2004/05/25: [test] success in ruby 1.8.2 (2004-05-18) [i686-linux].\n2004/05/25: [bug]  (thanks Masahiro Sakai) [ruby-dev:23560]\n                   ruby -ruri -ve 'URI::ABS_URI =~\n                                    \"http://example.org/Andr\\xC3\\xA9\"'\n                   nested STK_REPEAT type stack can't backtrack repeat_stk[].\n                   add OP_REPEAT_INC_SG and OP_REPEAT_INC_NG_SG.\n2004/05/25: [new]  support UTF-32LE. (ONIG_ENCODING_UTF32_LE)\n2004/05/25: [new]  support UTF-32BE. (ONIG_ENCODING_UTF32_BE)\n2004/05/24: [impl] divide enc/utf16.c to utf16_be.c and utf16_le.c.\n2004/05/24: [impl] add enc/unicode.c.\n2004/05/24: [API]  change calling sequences of onig_new_deluxe() and\n                   onig_recompile_deluxe().\n                   define OnigCompileInfo type.\n2004/05/21: [impl] perform ensure process for rb_trap_exec() in match_at().\n                   add onig_exec_trap() and CHECK_INTERRUPT_IN_MATCH_AT.\n2004/05/21: [impl] add regex status check to onig_match().\n2004/05/21: [new]  add onig_get_capture_tree() and\n                   onig_capture_tree_traverse().\n2004/05/20: [spec] (thanks Isao Sonobe)\n                   capture history return capture data tree.\n                   (see sample/listcap.c)\n2004/05/19: [bug]  (thanks Simon Strandgaard)\n                   Control-C does not work in matching process on Ruby.\n                   add calling of CHECK_INTERRUPT into match_at().\n                   ex. /<(?:[^\">]+|\"[^\"]*\")+>/.match('<META http-equiv= \\\n                       \"Content-Type content=\"text/html; charset=iso-8859-1\">')\n2004/05/19: [bug]  (thanks Simon Strandgaard)\n                   define virtual codepoint values for invalid encoding\n                   byte 0xfe and 0xff in UTF-8.\n                   ex. /\\w+/u.match(\"%a\\xffb\\xfec%\") ==> \"a\"\n2004/05/19: [spec] (thanks Simon Strandgaard)\n                   too big backref number should be treated as a sequence of\n                   an octal char and number digits.\n                   ex. /b\\3777\\c/.match(\"b\\3777\\c\")\n2004/05/17: [spec] rename encoding names \"UTF-16 BE\" and \"UTF-16 LE\"\n                   to \"UTF-16BE\" and \"UTF-16LE\".\n2004/05/17: [impl] move ismbchar() and mbclen() from oniguruma.h to oniggnu.h.\n2004/05/17: [impl] rename onigenc_single_byte_is_allowed_reverse_match() to\n                   onigenc_always_true_is_allowed_reverse_match().\n\n2004/05/14: Version 3.0.0\n\n2004/05/14: [test] success in ruby 1.8.0 (2003-08-08) [i386-cygwin].\n2004/05/14: [test] success in ruby 1.9.0 (2004-05-14) [i686-linux].\n2004/05/14: [test] success in ruby 1.8.0 (2003-08-08) [i386-mswin32].\n                   (* need to edit parse.y:\n                       register int c; ---> int c; in yylex())\n2004/05/14: [impl] add regext.c.\n2004/05/14: [spec] KOI8 is not included in library archive by default setup.\n2004/05/14: [impl] implementation changes are completed for all encoding files.\n2004/05/12: [impl] add divide_ambig_string_node().\n                   ambiguous string is divided and normalized before\n                   optimization and compilation process.\n2004/05/11: [dist] remove INSTALL-RUBY from distribution.\n2004/04/28: [memo] (thanks Kazuo Saito)\n                   Oniguruma 2.2.8 was merged to Ruby 1.9.0.\n2004/04/26: [spec] change value DEFAULT_MATCH_STACK_LIMIT_SIZE = 0 : unlimited\n2004/04/26: [new]  add onig_get_match_stack_limit_size() and\n                   onig_set_match_stack_limit_size().\n2004/04/26: [bug]  add error check to re.c.181.patch and re.c.168.patch.\n2004/04/23: [impl] remove ctype_support_level from OnigEncodingType.\n2004/04/22: [spec] allow the range from single byte char to multibyte char in\n                   character class for implementation reason.\n                   ex. /[a-\\xbb\\xcc]/ in EUC-JP encoding.\n2004/04/21: [impl] remove max_enc_len_by_first_byte() from OnigEncodingType.\n2004/04/20: [new]  add onig_copyright().\n2004/04/20: [impl] add regversion.c.\n2004/04/15: [new]  add onig_get_ambig_flag().\n2004/04/14: [bug]  (thanks Isao Sonobe)\n                   undefined bytecode error happens if ONIG_OPTION_FIND_LONGEST\n                   is set.\n                   should finish matching process if find-condition\n                   is fail at OP_END in match_at().\n2004/04/12: [impl] add ambig_flag to regex_t.\n2004/04/09: [impl] move onig_set_meta_char() to regsyntax.c.\n2004/04/09: [bug]  (thanks HIROSE Masaaki) fix onig_version().\n2004/04/08: [impl] add regsyntax.c.\n2004/04/07: [new]  support UTF-16 LE. (ONIG_ENCODING_UTF16_LE)\n2004/04/05: [impl] add ONIGENC_CTYPE_NEWLINE.\n2004/04/05: [memo] (thanks Kazuo Saito)\n                   Oniguruma 2.2.6 was merged to Ruby 1.9.0.\n2004/04/02: [memo] Version 2.2.6 was released.\n2004/03/26: [new]  support UTF-16 BE. (ONIG_ENCODING_UTF16_BE)\n2004/03/25: [spec] support non 8-bit encodings.\n2004/03/16: [memo] 2.X branch for 8-bit encodings only.\n\n2004/03/16: Version 2.2.5\n\n2004/03/16: [test] success in ruby 1.8.0 (2003-08-08) [i386-mswin32].\n2004/03/16: [test] success in ruby 1.9.0 (2004-02-24) [i686-linux].\n2004/03/16: [impl] add property name to error message of\n                   ONIGERR_INVALID_CHAR_PROPERTY_NAME.\n2004/03/16: [spec] allow prefix 'Is' for \\p{...} in ONIG_SYNTAX_PERL.\n                   add syntax op. ONIG_SYN_OP2_CHAR_PROPERTY_PREFIX_IS.\n2004/03/15: [dist] add sample/syntax.c.\n2004/03/15: [spec] support NOT op. in char property. \\p{^...}, \\P{^...}.\n                   add syntax op. ONIG_SYN_OP2_ESC_P_BRACE_CIRCUMFLEX_NOT.\n2004/03/15: [spec] rename ONIG_SYN_OP2_ESC_P_CHAR_PROPERTY to\n                   ONIG_SYN_OP2_ESC_P_BRACE_CHAR_PROPERTY.\n2004/03/10: [impl] move ONIGERR_XXX from regenc.h to oniguruma.h,\n                   rename ONIGERR_XXX to ONIGENCERR_XXX in regenc.h.\n2004/03/08: [impl] (thanks eban)\n                   replace defined(__CYGWIN__) to defined(__GNUC__).\n2004/03/08: [bug]  (thanks eban) [ruby-dev:23172]\n                   need to separate initialization for bcc32.\n2004/03/06: [memo] (thanks Kazuo Saito)\n                   Oniguruma 2.2.4 was merged to Ruby 1.9.0.\n2004/03/05: [API]  change second argument type of onig_set_meta_char()\n                   from unsigned int to OnigCodePoint.\n2004/03/05: [dist] (thanks Kazuo Saito)\n                   add MANIFEST-RUBY.\n\n2004/03/04: Version 2.2.4\n\n2004/03/04: [impl] (thanks Moriyoshi Koizumi)\n                   fix many warnings in Win32 VC++ with /W3 option.\n\n2004/03/02: Version 2.2.3\n\n2004/03/02: [bug]  (thanks Isao Sonobe)\n                   return invalid capture region value if capture history\n                   is used. (OP_MEMORY_END_PUSH_REC bug)\n                   ex. /\\g<p>(?@<p>\\(\\g<s>\\)){0}(?<s>(?:\\g<p>)*|){0}/\n                       .match(\"((())())\")\n2004/03/02: [impl] (thanks Kazuo Saito)\n                   add :nodoc: to onig_stat_print() for RDoc.\n2004/03/02: [impl] don't use ONIG_SOURCE_IS_WRAPPED.\n\n2004/02/27: Version 2.2.2\n\n2004/02/27: [impl] fix the position of onig_stat_print().\n2004/02/27: [impl] define ONIG_RUBY_DEFINE_GLOBAL_FUNCTION() in regint.h\n                   for ignored by RDoc.\n\n2004/02/26: Version 2.2.1\n\n2004/02/26: [bug]  [bugs.php.net:#26677] (thanks behrens)\n                   invalid definition at onig_error_code_to_str()\n                   in the case of NOT HAVE_STDARG_PROTOTYPES.\n\n2004/02/25: Version 2.2.0\n\n2004/02/25: [test] success in ruby 1.8.0 (2003-08-08) [i386-mswin32].\n2004/02/24: [test] success in ruby 1.9.0 (2004-02-24) [i686-linux].\n2004/02/24: [bug]  undefined IS_BLANK() and IS_GRAPH() was used in\n                   onigenc_is_code_ctype() in the case of Ruby M17N.\n2004/02/24: [new]  support ISO-8859-16. (ONIG_ENCODING_ISO_8859_16)\n2004/02/24: [bug]  should not fold match for 0xdf in iso8859_6.c.\n2004/02/24: [new]  support ISO-8859-14. (ONIG_ENCODING_ISO_8859_14)\n2004/02/23: [new]  support ISO-8859-13. (ONIG_ENCODING_ISO_8859_13)\n2004/02/23: [new]  support ISO-8859-10. (ONIG_ENCODING_ISO_8859_10)\n2004/02/20: [bug]  fix iso_8859_4_mbc_is_case_ambig().\n2004/02/20: [new]  support ISO-8859-9. (ONIG_ENCODING_ISO_8859_9)\n2004/02/19: [bug]  correct ctype tables for ISO-8859-3, ISO-8859-4,\n                   ISO-8859-6, ISO-8859-7, ISO-8859-8, KOI8_R.\n2004/02/18: [bug]  wrong replaced name OnigSyntaxGnuOnigex.\n2004/02/17: [spec] check capture status for empty infinite loop.\n                   [ruby-dev:20224] etc...\n                   ex. /(?:\\1a|())*/.match(\"a\"),\n                       /(?:()|()|()|(x)|()|())*\\2b\\5/.match(\"b\")\n                   add USE_INFINITE_REPEAT_MONOMANIAC_MEM_STATUS_CHECK.\n                   add OP_NULL_CHECK_END_MEMST, OP_NULL_CHECK_END_MEMST_PUSH.\n                   add stack type STK_NULL_CHECK_END.\n2004/02/13: [impl] add OnigEncodingEUC_CN to enc/euc_kr.c.\n2004/02/13: [bug]  (thanks Simon Strandgaard)\n                   parsing of nested repeat was invalid.\n                   ex. /ab{2,3}*/ was /(?:a(?:b{2,3}))*/,\n                       should be /a(?:b{2,3}*)/\n2004/02/12: [bug]  (thanks Simon Strandgaard)\n                   OP_REPEAT_INC_NG process in match_at() is wrong.\n                   ex. bad match /a.{0,2}?a/ =~ \"0aXXXa0\"\n2004/02/12: [bug]  (thanks Simon Strandgaard)\n                   wrong fetch after (?x) option.  ex. \"(?x)\\ta .\\n+b\"\n2004/02/12: [bug]  (thanks Simon Strandgaard)\n                   [\\^] is not a empty char class.\n2004/02/09: [new]  add onig_set_syntax_op(), onig_set_syntax_op2(),\n                   onig_set_syntax_behavior(), onig_set_syntax_options().\n2004/02/06: [dist] add a new target 'site' to Makefile.in.\n2004/02/06: [dist] add index.html.\n2004/02/03: [bug]  oniggnu.h was not installed by 'make install'.\n\n2004/02/02: Version 2.1.0\n\n2004/02/02: [test] success in ruby 1.9.0 (2004-02-02) [i686-linux].\n2004/02/02: [test] success in ruby 1.8.0 (2003-08-08) [i386-cygwin].\n2004/02/02: [test] success in ruby 1.8.0 (2003-08-08) [i386-mswin32].\n2004/02/02: [new]  support ISO-8859-11. (ONIG_ENCODING_ISO_8859_11)\n2004/02/02: [new]  support ISO-8859-5. (ONIG_ENCODING_ISO_8859_5)\n2004/02/02: [impl] should check single byte encoding or not in and_cclass()\n                   and or_cclass().\n2004/01/30: [dist] add oniggnu.h.\n2004/01/30: [bug]  ISO-8859-7 0xb7 (middle dot) is Punct type.\n2004/01/30: [new]  support ISO-8859-8. (ONIG_ENCODING_ISO_8859_8)\n2004/01/29: [new]  support ISO-8859-7. (ONIG_ENCODING_ISO_8859_7)\n2004/01/29: [new]  support ISO-8859-6. (ONIG_ENCODING_ISO_8859_6)\n2004/01/28: [new]  support KOI8-R. (ONIG_ENCODING_KOI8_R)\n2004/01/28: [new]  support KOI8. (ONIG_ENCODING_KOI8)\n2004/01/27: [dist] rename enc/isotable.c to enc/mktable.c.\n2004/01/27: [new]  support ISO-8859-4. (ONIG_ENCODING_ISO_8859_4)\n2004/01/26: [new]  support ISO-8859-3. (ONIG_ENCODING_ISO_8859_3)\n2004/01/26: [bug]  EncISO_8859_{1,15}_CtypeTable[256] was wrong.\n                   (0x80 - 0xff is not ASCII)\n2004/01/23: [new]  support ISO-8859-2. (ONIG_ENCODING_ISO_8859_2)\n2004/01/23: [dist] add enc/isotable.c.\n2004/01/22: [new]  support EUC-TW. (ONIG_ENCODING_EUC_TW)\n2004/01/22: [bug]  definition of GET_ALIGNMENT_PAD_SIZE() and\n                   ALIGNMENT_RIGHT() was wrong.\n                   type casting should be unsigned int, not int.\n2004/01/22: [impl] add defined(__x86_64) || defined(__x86_64__)\n                   to unaligned word access condition. (AMD64 ?)\n2004/01/21: [dist] rename enc/eucjp.c to enc/euc_jp.c.\n2004/01/21: [new]  support EUC-KR. (ONIG_ENCODING_EUC_KR)\n2004/01/20: [test] success in ruby 1.8.0 (2003-08-08) [i386-cygwin].\n2004/01/20: [dist] change Makefile.in.\n2004/01/20: [spec] add \\p{...}, \\P{...} in char class.\n2004/01/20: [new]  character property operators \\p{...}, \\P{...}.\n                   supported in ONIG_SYNTAX_JAVA and ONIG_SYNTAX_PERL.\n2004/01/19: [spec] allow /a{,n}/ as /a{0,n}/. (but don't allow /a{,}/)\n2004/01/19: [dist] rename onigcomp200.h to onigcmpt200.h.\n2004/01/19: [dist] update re.c.168.patch. svn add re.c.181.patch.\n2004/01/16: [dist] update sample/*.c for new API.\n2004/01/16: [dist] add onigcomp200.h. (for old API compatibility)\n2004/01/16: [dist] update documents API, RE and RE.ja.\n2004/01/16: [spec] change prefix REG_ -> ONIG_, regex_ onig_,\n                   ENC_ -> ONIGENC, enc_ -> onigenc_.\n2004/01/15: [impl] rename ENC_IS_MBC_E_WORD() to ENC_IS_MBC_WORD().\n                   rename ENC_CTYPE_SUPPORT_LEVEL_SB_ONLY to\n                   ENC_CTYPE_SUPPORT_LEVEL_SB.\n2004/01/14: [impl] rename UNALIGNED_WORD_ACCESS to\n                   PLATFORM_UNALIGNED_WORD_ACCESS.\n2004/01/14: [impl] change MATCH_STACK_LIMIT_SIZE value from 200000 to 500000.\n2004/01/13: [impl] remove ENC_CODE_TO_MBC_FIRST(enc,code) in regenc.h.\n                   remove code_to_mbc_first member in RegCharEncodingType.\n2004/01/13: [impl] remove head byte bitset information in cclass->mbuf.\n2003/12/26: [impl] change macro name ismb_xxxx() in enc/*.c for\n                   escape conflict.\n\n2003/12/24: Version 2.0.0\n\n2003/12/24: [spec] ignore case option is effective to numbered char.\n                   ex. /\\x61/i =~ \"A\"\n2003/12/24: [test] success in ruby 1.8.1 (2003-12-24) [i686-linux].\n2003/12/24: [test] success in ruby 1.8.0 (2003-08-08) [i386-cygwin].\n2003/12/24: [test] success in ruby 1.8.0 (2003-08-08) [i386-mswin32].\n2003/12/24: [test] success in regex.c compile test on ruby-m17n.\n                   (but can't make miniruby because re.c patch fail.)\n2003/12/24: [bug]  (thanks H.Miyamoto) /[\\W]/ was wrong in 1.9.5.\n2003/12/22: [spec] implement fold match on UTF-8 encoding.\n2003/12/19: [impl] add ctype_support_level and ctype_add_codes() member to\n                   RegCharEncoding type.\n2003/12/19: [impl] add add_ctype_to_cc() in regparse.c.\n2003/12/19: [impl] add enc_is_code_ctype() in REG_RUBY_M17N case.\n2003/12/19: [impl] change ENC_CODE_TO_MBC() interface.\n2003/12/18: [new]  implement fold match. (variable number of char\n                   match in ignore case mode.)\n                   ex. German alphabet ess-tsett(U+00DF) match \"SS\" and \"ss\".\n2003/12/17: [impl] refactoring of encoding system.\n2003/12/17: [impl] add enc_init() in regenc.c.\n2003/12/17: [new]  support Big5. (REG_ENCODING_BIG5)\n2003/12/16: [impl] change CodePoint from unsigned int to unsigned long.\n2003/12/16: [new]  support ISO 8859-15. (REG_ENCODING_ISO_8859_15)\n2003/12/16: [impl] change P_() macro definition condition for Win32.\n2003/12/16: [dist] add sample/encode.c\n2003/12/16: [new]  support ISO 8859-1. (REG_ENCODING_ISO_8859_1)\n2003/12/15: [impl] rename IS_ENC_XXXX to ENC_IS_XXXX.\n2003/12/15: [impl] rename RegDefaultCharEncoding to EncDefaultCharEncoding.\n2003/12/15: [impl] divide encoding files. (enc/ascii.c, enc/utf8.c etc...)\n2003/12/15: [bug]  unexpected infinite loop in regex_snprintf_with_pattern().\n                   change local var. type char* to UChar*.\n2003/12/15: [impl] remove REG_MBLEN_TABLE[].\n2003/12/15: [spec] rename function prefix regex_get_prev_char_head(),\n                   regex_get_left_adjust_char_head() and\n                   regex_get_right_adjust_char_head() to enc_xxxxxx().\n2003/12/15: [impl] rename function prefixes in regenc.h from regex_ to enc_.\n2003/12/12: [impl] remove USE_SBMB_CLASS.\n2003/12/12: [impl] rename mb -> mbc, mblen() to enc_len().\n2003/12/12: [impl] rename WCINT to CodePoint.\n2003/12/11: [impl] delete IS_XXXX() ctype macros from regint.h.\n2003/12/11: [impl] add enc->wc_is_ctype() and RegAsciiCtypeTable[256].\n2003/12/11: [impl] remove RegAsciiCaseAmbigTable.\n2003/12/10: [impl] use ENC_TO_LOWER() for ignore case comparison.\n2003/12/08: [impl] *** re-defined RegCharEncoding in oniguruma.h. ***\n2003/12/08: [impl] add USE_POSIX_REGION_OPTION to regint.h.\n2003/12/08: [impl] add IS_ENC_WORD() to regenc.h.\n2003/12/05: [impl] rename IS_CODE_XXXX() to IS_ENC_XXXX().\n2003/12/05: [impl] delete IS_CODE_WORD() from regenc.h.\n2003/12/04: [spec] rename REG_SYN_OP_BACK_REF to REG_SYN_OP_DECIMAL_BACKREF.\n2003/12/04: [spec] add (REG_SYN_OP_ESC_W_WORD | REG_SYN_OP_ESC_B_WORD_BOUND |\n                   REG_SYN_OP_ESC_LTGT_WORD_BEGIN_END | REG_SYN_OP_BACK_REF)\n                   to RegSyntaxGrep.\n2003/12/04: [spec] remove REG_ENCODING_DEFAULT and REGCODE_DEFAULT.\n2003/12/04: [spec] move declarations of regex_get_default_encoding() and\n                   regex_set_default_encoding() from oniguruma.h to regenc.h.\n2003/12/03: [new]  add regex_get_default_encoding() and\n                   regex_set_default_encoding().\n2003/12/03: [spec] REG_ENCODING_DEFAULT meaning is changed.\n                   (current default value, not initial default value.)\n2003/12/03: [spec] REGCODE_XXX is obsoleted. use REG_ENCODING_XXX.\n2003/12/02: [memo] alias svnst='svn status | grep -v \"^\\?\"'\n2003/12/02: [spec] move regex_set_default_trans_table() declaration\n                   from oniguruma.h to regenc.h. (obsoleted API)\n2003/12/02: [impl] move variables RegDefaultCharEncoding, DefaultTransTable and\n                   AmbiguityTable to regenc.c.\n2003/12/01: [impl] add regex_continuous_sbmb() to regenc.c.\n2003/12/01: [dist] add regenc.h and regenc.c.\n2003/11/18: [dist] change testconv.rb.\n2003/11/18: [bug]  (thanks Masaru Tsuda)\n                   memory leak in parse_subexp().\n2003/11/18: [bug]  (thanks Masaru Tsuda)\n                   memory leak in names_clear() and parse_char_class().\n2003/11/17: [bug]  memory leak in parse_char_class().\n2003/11/17: [bug]  (thanks Masaru Tsuda)\n                   OptExactInfo length should not over OPT_EXACT_MAXLEN.\n                   (concat_opt_exact_info_str())\n\n2003/11/12: Version 1.9.5\n\n2003/11/12: [test] success in ruby 1.8.0 (2003-08-08) [i386-cygwin].\n2003/11/12: [test] success in ruby 1.8.1 (2003-11-11) [i686-linux].\n2003/11/12: [spec] add definition of REG_INEFFECTIVE_META_CHAR.\n2003/11/11: [dist] add a sample program sample/sql.c.\n2003/11/11: [new]  add variable meta character.\n                   regex_set_meta_char()\n2003/11/11: [spec] add syntax op. REG_SYN_OP_VARIABLE_META_CHARS.\n2003/11/11: [spec] rename REG_SYN_OP_ESC_CAPITAL_Q_QUOTE to\n                   REG_SYN_OP2_ESC_CAPITAL_Q_QUOTE,\n                   REG_SYN_OP_QMARK_GROUP_EFFECT to\n                   REG_SYN_OP2_QMARK_GROUP_EFFECT.\n2003/11/06: [impl] define THREAD_PASS as rb_thread_schedule() in Ruby mode.\n2003/11/05: [spec] add syntax behavior REG_SYN_WARN_REDUNDANT_NESTED_REPEAT.\n2003/11/05: [spec] rename REG_SYN_WARN_FOR_CC_OP_NOT_ESCAPED to\n                   REG_SYN_WARN_CC_OP_NOT_ESCAPED.\n2003/11/04: [new]  add regex_set_warn_func() and regex_set_verb_warn_func().\n2003/10/30: [new]  add regex_name_to_backref_number().\n                   (for multiplex definition name, see sample/names.c)\n2003/10/30: [spec] add name_end and reg argument to callback function of\n                   regex_foreach_name().  (see sample/names.c)\n2003/10/29: [spec] add syntax behavior REG_SYN_ALLOW_MULTIPLEX_DEFINITION_NAME.\n                   add error code REGERR_MULTIPLEX_DEFINED_NAME.\n2003/10/14: [dist] modify sample/simple.c.\n2003/10/03: [bug]  (thanks nobu)  [ruby-dev:21472]\n                   sub-anchor of optimization map info was wrong\n                   in concat_left_node_opt_info().\n                   ex. /^(x?y)/ = \"xy\" fail.\n\n2003/09/17: Version 1.9.4\n\n2003/09/17: [spec] change specification of char-class range in ignore case mode\n                   follows with Ruby 1.8(2003-09-17).\n                   ex. /[H-c]/i ==> (H-Z, 0x5b-0x60, a-c)/i\n                                ==> H-Z, h-z, 0x5b-0x60, a-c, A-C\n2003/09/16: [bug]  (thanks Guy Decoux)\n                   remove env->option == option check in parse_effect().\n                   change env->option for dynamic option in parse_exp().\n                   (ex. bad match /(?i)(?-i)a/ =~ \"A\")\n2003/09/12: [spec] rename REG_SYN_ALLOW_RANGE_OP_IN_CC to\n                   REG_SYN_ALLOW_DOUBLE_RANGE_OP_IN_CC,\n                   REG_SYN_ESCAPE_IN_CC to REG_SYN_BACKSLASH_ESCAPE_IN_CC.\n2003/09/11: [bug]  change to IS_SYNTAX_OP2 at REG_SYN_OP2_ESC_GNU_BUF_ANCHOR.\n2003/09/09: [spec] rename REG_SYN_OP2_ESC_M_BAR_META to\n                   REG_SYN_OP2_ESC_CAPITAL_M_BAR_META,\n                   REG_SYN_OP_ESC_Q_QUOTE to REG_SYN_OP_ESC_CAPITAL_Q_QUOTE,\n                   REG_SYN_OP_ESC_SUBEXP to REG_SYN_OP_ESC_LPAREN_SUBEXP,\n                   REG_SYN_OP_ESC_BUF_ANCHOR to REG_SYN_OP_ESC_AZ_BUF_ANCHOR,\n                   REG_SYN_OP_ESC_GNU_BUF_ANCHOR to\n                   REG_SYN_OP2_ESC_GNU_BUF_ANCHOR,\n                   REG_SYN_OP_ESC_CONTROL_CHAR to REG_SYN_OP_ESC_CONTROL_CHARS,\n                   REG_SYN_OP_ESC_WORD to REG_SYN_OP_ESC_W_WORD,\n                   REG_SYN_OP_ESC_WORD_BEGIN_END to\n                   REG_SYN_OP_ESC_LTGT_WORD_BEGIN_END,\n                   REG_SYN_OP_ESC_WORD_BOUND to REG_SYN_OP_ESC_B_WORD_BOUND,\n                   REG_SYN_OP_ESC_WHITE_SPACE to REG_SYN_OP_ESC_S_WHITE_SPACE,\n                   REG_SYN_OP_ESC_DIGIT to REG_SYN_OP_ESC_D_DIGIT,\n                   REG_SYN_OP_CC to REG_SYN_OP_BRACKET_CC,\n                   REG_SYN_OP2_CCLASS_SET to REG_SYN_OP2_CCLASS_SET_OP,\n                   REG_SYN_CONTEXT_INDEP_OPS to\n                   REG_SYN_CONTEXT_INDEP_REPEAT_OPS,\n                   REG_SYN_CONTEXT_INVALID_REPEAT_OPS to\n                   REG_SYN_CONTEXT_INVALID_REPEAT_OPS.\n                   add REG_SYN_OP_ESC_CAPITAL_G_BEGIN_ANCHOR.\n2003/09/08: [spec] rename REG_SYN_OP_ANYCHAR to REG_SYN_OP_DOT_ANYCHAR,\n                   REG_SYN_OP_0INF to REG_SYN_OP_ASTERISK_ZERO_INF,\n                   REG_SYN_OP_ESC_0INF to REG_SYN_OP_ESC_ASTERISK_ZERO_INF,\n                   REG_SYN_OP_1INF to REG_SYN_OP_PLUS_ONE_INF,\n                   REG_SYN_OP_ESC_1INF to REG_SYN_OP_ESC_PLUS_ONE_INF,\n                   REG_SYN_OP_0INF to REG_SYN_OP_QMARK_ZERO_ONE,\n                   REG_SYN_OP_ESC_0INF to REG_SYN_OP_ESC_QMARK_ZERO_ONE,\n                   REG_SYN_OP_INTERVAL to REG_SYN_OP_BRACE_INTERVAL,\n                   REG_SYN_OP_ESC_INTERVAL to REG_SYN_OP_ESC_BRACE_INTERVAL,\n                   REG_SYN_OP_SUBEXP to REG_SYN_OP_LPAREN_SUBEXP,\n                   REG_SYN_OP_ALT to REG_SYN_OP_VBAR_ALT,\n                   REG_SYN_OP_ESC_ALT to REG_SYN_OP_ESC_VBAR_ALT,\n                   REG_SYN_OP_NON_GREEDY to REG_SYN_OP_QMARK_NON_GREEDY,\n                   REG_SYN_OP_SUBEXP_EFFECT to REG_SYN_OP_QMARK_GROUP_EFFECT,\n                   REG_SYN_OP2_POSSESSIVE_{REPEAT,INTERVAL} to\n                   REG_SYN_OP2_PLUS_POSSESSIVE_{REPEAT,INTERVAL},\n                   REG_SYN_OP2_SUBEXP_CALL to REG_SYN_OP2_ESC_G_SUBEXP_CALL,\n                   REG_SYN_OP2_NAMED_GROUP to REG_SYN_OP2_QMARK_LT_NAMED_GROUP\n                   and REG_SYN_OP2_ESC_K_NAMED_BACKREF.\n2003/09/02: [tune] call reduce_nested_qualifier() after disabling capture for\n                   no-name group in noname_disable_map().\n                   ex. /(a+)*(?<name>...)/\n2003/09/02: [impl] include <stdio.h> is forgotten to erase in regcomp.c.\n2003/09/01: [dist] update doc/RE and doc/RE.ja.\n2003/08/26: [bug]  (thanks Guy Decoux)\n                   should not double free node at the case TK_CC_CC_OPEN\n                   in parse_char_class().\n\n2003/08/19: Version 1.9.3\n\n2003/08/19: [inst] change re.c.180.patch.\n2003/08/19: [impl] rename 'list of captures' to 'capture history'.\n2003/08/19: [dist] add doc/RE.ja. (Japanese)\n2003/08/19: [new]  add regex_copy_syntax().\n2003/08/19: [spec] rename REG_SYN_OP2_ATMARK_LIST_OF_CAPTURES to\n                   REG_SYN_OP2_ATMARK_CAPTURE_HISTORY.\n2003/08/18: [spec] (thanks nobu)\n                   don't use IMPORT in oniguruma.h and onigposix.h.\n2003/08/18: [impl] (thanks nobu) change error output to stdout in testconv.rb.\n2003/08/18: [inst] (thanks nobu) lacked $(srcdir) in Makefile.in.\n2003/08/18: [bug]  REG_MBLEN_TABLE[SJIS][0xFD-0xFF] should be 1.\n2003/08/18: [bug]  (thanks nobu) mbctab_sjis[0x80] should be 0.\n2003/08/18: [bug]  (thanks nobu)\n                   single/multi-byte decision was wrong in parse_char_class().\n                   add regex_wc2mblen().\n                   should not set fetched to 1 in TK_RAW_BYTE case.\n2003/08/18: [bug]  should update BitSet in the case inc_n >= 0\n                   in add_wc_range_to_buf().\n2003/08/13: [bug]  change re.c.180.patch for fix rb_reg_to_s() in re.c.\n2003/08/11: [bug]  should clear region->list in regex_region_resize().\n\n2003/08/08: Version 1.9.2\n\n2003/08/08: [test] success in ruby 1.8.0 (2003-08-08) on Windows 2000\n                   VC++ 6.0 and Cygwin.\n2003/08/08: [impl] don't define macro vsnprintf for WIN32 platform,\n                   because definition is added in win32\\win32.h.\n2003/08/08: [test] success in ruby 1.8.0 and ruby 1.6.8(2003-08-03) on Linux.\n2003/08/08: [dist] change re.c.180.patch and re.c.168.patch.\n2003/08/08: [new]  (thanks akr)\n                   implemented list of captures. (?@...), (?@<name>...)\n2003/08/07: [dist] add sample/listcap.c.\n2003/08/06: [bug]  OP_MEMORY_END_PUSH_REC case in match_at().\n                   renewal of mem_start_stk[] should be after\n                   STACK_PUSH_MEM_END() call.\n2003/07/29: [new]  add regex_get_encoding(), regex_get_options() and\n                   regex_get_syntax().\n2003/07/25: [spec] (thanks akr)\n                   change group(...) to shy-group(?:...) if named group is\n                   used in the pattern.\n                   add REG_SYN_CAPTURE_ONLY_NAMED_GROUP.\n2003/07/24: [spec] rename REG_OPTION_CAPTURE_ONLY_NAMED_GROUP to\n                   REG_OPTION_DONT_CAPTURE_GROUP.\n                   add REG_OPTION_CAPTURE_GROUP.\n2003/07/17: [spec] rename REG_SYN_OP2_NAMED_SUBEXP to REG_SYN_OP2_NAMED_GROUP.\n2003/07/17: [spec] add REGERR_EMPTY_GROUP_NAME.\n2003/07/17: [spec] rename REGERR_INVALID_SUBEXP_NAME\n                       to REGERR_INVALID_CHAR_IN_GROUP_NAME.\n2003/07/17: [spec] restrict usable chars of group name to alphabet, digit,\n                   '_' or multibyte-char in fetch_name(). [ruby-dev:20706]\n2003/07/16: [impl] minor change of sample/names.c.\n2003/07/14: [impl] rename USE_NAMED_SUBEXP to USE_NAMED_GROUP.\n2003/07/14: [bug]  add fetch_name() for USE_NAMED_SUBEXP off case.\n2003/07/14: [API]  add regex_number_of_names().\n2003/07/08: [impl] change error message for undefined group number call.\n                       'undefined group reference: /(a)\\g<2>/'\n                   --> 'undefined group <2> reference: /(a)\\g<2>/'\n2003/07/08: [dist] modify doc/RE.\n2003/07/07: [impl] OP_SET_OPTION is not needed in compiled code.\n                   add IS_DYNAMIC_OPTION() to regint.h.\n2003/07/07: [spec] called group should not ignore outside option (?i:...).\n                   ex. /(?i:(?<n>(a)\\2)){0}\\g<n>/.match(\"aA\")\n                   add opcode OP_BACKREFN_IC and OP_BACKREF_MULTI_IC.\n                   set option status to effect memory in optimize_node_left().\n2003/07/07: [impl] add opcode OP_ANYCHAR_ML, OP_ANYCHAR_ML_STAR and\n                   OP_ANYCHAR_ML_START_PEEK_NEXT.\n2003/07/07: [bug]  (thanks nobu) REG_MBLEN_TABLE[SJIS][0x80] should be 1.\n2003/07/07: [spec] rename REG_SYN_OP_QUOTE to REG_SYN_OP_ESC_Q_QUOTE.\n\n2003/07/04: Version 1.9.1\n\n2003/07/04: [new]  add REG_OPTION_CAPTURE_ONLY_NAMED_GROUP. (thanks .NET)\n2003/07/04: [spec] check mbuf member in the case of\n                   REG_SYN_NOT_NEWLINE_IN_NEGATIVE_CC in parse_char_class().\n2003/07/04: [spec] typo REG_SYN_WARN_FOR_CC_OP_NOT_ESCAPEED.\n                   should be REG_SYN_WARN_FOR_CC_OP_NOT_ESCAPED.\n2003/07/04: [bug]  conflict values on REG_SYN_WARN_FOR_CC_OP_NOT_ESCAPEED and\n                   REG_SYN_NOT_NEWLINE_IN_NEGATIVE_CC.  (thanks nobu)\n2003/07/03: [spec] add REG_SYN_OP_ESC_CONTROL_CHAR flag.\n2003/07/03: [spec] remove REG_SYN_OP_ESC_OCTAL3 and REG_SYN_OP_ESC_X_HEX2\n                   flag from RegSyntaxGnuRegex.\n2003/07/03: [spec] remove REG_SYN_OP_NON_GREEDY flag from RegSyntaxGnuRegex.\n2003/07/02: [dist] fix doc/RE.\n2003/07/01: [impl] add config flag USE_VARIABLE_SYNTAX.\n                   (turn off variable syntax on Ruby)\n2003/07/01: [spec] add syntax behavior REG_SYN_DIFFERENT_LEN_ALT_LOOK_BEHIND.\n2003/06/30: [spec] allow different length top-level alternatives\n                   in look-behind.    ex. (?<=abc|abcd), (?<!a|bc)\n2003/06/26: [spec] add option REG_OPTION_NEGATE_SINGLELINE.\n2003/06/26: [spec] should default on REG_OPTION_SINGLELINE\n                   for REG_SYNTAX_PERL and REG_SYNTAX_JAVA.\n2003/06/26: [impl] add options member to RegStntaxType.\n2003/06/26: [spec] don't change the meaning of '\\Z' for REG_OPTION_SINGLELINE.\n2003/06/25: [dist] don't use option REG_NEWLINE for sample/posix.c.\n2003/06/25: [dist] modify testconv.rb.\n                   should match and convert double quoted string data.\n                   ex. x(/\\ca/, \"\\001\", 0, 1)\n2003/06/25: [impl] add REG_SYN_OP2_ESC_CAPITAL_C_BAR_CONTROL and\n                   REG_SYN_OP2_ESC_M_BAR_META.\n2003/06/25: [impl] add REG_SYN_OP_ESC_OCTAL3 and REG_SYN_OP_ESC_X_HEX2.\n2003/06/24: [impl] add REG_SYN_OP2_ESC_V_VTAB. (\\v is VTAB)\n2003/06/24: [bug]  should invert REG_OPTION_SINGLELINE flag\n                   in REG_SYN_OP2_OPTION_PERL.\n2003/06/24: [impl] add REG_SYN_OP2_OPTION_PERL and REG_SYN_OP2_OPTION_RUBY.\n                   meaning of (?m) and (?s) are depend on syntax.\n\n2003/06/20: Version 1.9.0\n\n2003/06/20: [spec] \\Q...\\E is not effective on REG_SYNTAX_RUBY. (thanks akr)\n2003/06/19: [inst] rename regex.h to oniguruma.h.\n2003/06/18: [impl] change REG_EXTERN setting condition. (__CYGWIN__)\n2003/06/18: [bug]  return wrong result UTF-8 case in regex_mb2wc().\n2003/06/18: [impl] add REG_SYN_OP2_POSSESSIVE_INTERVAL.  a{n,m}+\n2003/06/18: [new]  add REG_SYNTAX_JAVA.\n2003/06/18: [spec] add REG_SYN_OP_QUOTE.\n2003/06/18: [spec] add op2 member to RegSyntaxType.\n                   rename some REG_SYN_OP_XXX to REG_SYN_OP2.\n2003/06/16: [new]  Perl-like quotation operator \\Q, \\E.\n2003/06/16: [spec] should not control ignore case mode by escaped char.\n                   ex. /\\J/i =~ \"j\", /[\\J]/i =~ \"j\"    (same as Perl)\n2003/06/13: [bug]  modify onigposix.h.\n2003/06/13: [bug]  should use -DIMPORT for link with DLL in win32/Makefile.\n2003/06/13: [dist] add sample/names.c\n2003/06/12: [bug]  range should be from - 1 in not_wc_range_buf().\n2003/06/12: [spec] should warn for '-' before '&&' operator in char-class.\n2003/06/12: [new]  add REG_SYNTAX_PERL.\n2003/06/12: [spec] add syntax behavior REG_SYN_WARN_FOR_CC_OP_NOT_ESCAPEED.\n2003/06/12: [spec] invalid POSIX bracket should be error.   ex. [[:upper :]]\n2003/06/11: [new]  char-class in char-class (as Java(TM)).\n2003/06/11: [spec] change AND operator in char-class from &&[..] to &&.\n2003/06/04: [spec] {n,m}+ should not be possessive operator.\n                   ex. a{3}+ should be (?:a{3})+\n2003/06/03: [bug]  should compare strings with min-length in is_not_included().\n2003/06/03: [impl] automatic possessivate optimization.  a*b ==> (?>a*)b\n                   (thanks Jeffrey E. F. Friedl)\n2003/06/02: [impl] remove multibyte-BitSet for OP_CCLASS_MB/OP_CCLASS_MB_NOT.\n2003/05/30: [new]  char class intersection operator &&[...] like Java(TM).\n                   (thanks akr)\n2003/05/30: [bug]  should use bbuf_free() for CClassNode in regex_node_free().\n2003/05/29: [bug]  wrong usage of syntax REG_SYN_ALLOW_EMPTY_RANGE_IN_CC.\n                   /[d-a]/ should be error.\n2003/05/28: [impl] optimize stop-backtrack compiled code.\n                   (/(?>a*)/, /(?>\\w+)/ etc...)\n                   add OP_POP opcode.\n2003/05/28: [new]  possessive repeat operator. (?+, *+, ++, {n,m}+)\n2003/05/27: [spec] '-' at beginning of char-class should be warn only if\n                   it is start of range.  (ex. /[--a]/)\n2003/05/27: [spec] should not warn for right bracket at beginning of pattern.\n                   ex. /]aaa/\n2003/05/27: [spec] change CCEND_ESC_WARN() from VERB_WARNING() to WARNING().\n2003/05/27: [spec] /[]aaa/ should be empty char-class error.\n                   /[]aaa]/ should be warn for 'without backslash'.\n                   (add char_exist_check() in regparse.c)\n2003/05/26: [bug]  OP_REPEAT in recursive subexp call.\n                   ex. /(?<n>(a|b\\g<n>c){3,5})/.match(\"baaaaca\") => \"baaaaca\"\n                       was wrong result. (should be \"aaaa\")\n2003/05/26: [impl] add num_call member to regex_t.\n2003/05/26: [impl] add repeat_range member to regex_t.\n                   (for delete upper,lower members from StackType.u.repeat)\n2003/05/26: [bug]  change print_names() to external regex_print_names().\n2003/05/26: [tune] change OP_NULL_CHECK_END process in match_at().\n2003/05/26: [spec] change CCEND_ESC_WARN() from WARNING() to VERB_WARNING().\n2003/05/26: [spec] remove POSIXLINE option. (?p:...)\n                   (be made the same as Ruby.)\n2003/05/22: [spec] use OP_NULL_CHECK_XXX only if repeat is infinite.\n                   prev. /(?:()|()){0,10}\\1\\2/ =~ \"\"  ==> FAIL\n                   now   /(?:()|()){0,10}\\1\\2/ =~ \"\"  ==> MATCH\n\n2003/05/22: [impl] change target_empty setting condition in setup_tree().\n2003/05/19: [impl] avoid zero length repeat optimization.  (thanks matz)\n                   /()*/ ==> /()?/, /()+/ ==> /()/ etc...\n2003/05/19: [impl] minor changes for gcc -Wall. (-DREG_DEBUG_STATISTICS case)\n2003/05/19: [spec] rename regex_foreach_names() to regex_foreach_name().\n2003/05/16: [new]  add --with-statistics option to configure.\n2003/05/16: [bug]  move RegOpInfo[] definition to regint.h.\n2003/05/16: [new]  add regex_version().\n\n2003/05/14: Version 1.8.6\n\n2003/05/14: [bug]  use _vsnprintf() on Win32.\n2003/05/14: [spec] define USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE.\n                   (/\\n$/ =~ \"\\n\", /\\n\\Z/ =~ \"\\n\") [ruby-dev:20125]\n2003/05/14: [impl] minor changes for gcc -Wall.\n2003/05/14: [impl] add string.h check in AC_CHECK_HEADERS().\n2003/05/13: [impl] minor changes for gcc -Wall.\n2003/05/13: [impl] add regex_snprintf_with_pattern().\n2003/05/13: [spec] add warning for char class meta character without escape\n                   in Ruby mode ('[', '-', ']').\n2003/05/13: [impl] define WARNING() and VERB_WARNING() in regint.h.\n2003/05/13: [bug]  correct is_code_ascii() for /[[:ascii:]]/.\n2003/05/12: [dist] add regular expression document (doc/RE).\n2003/05/12: [spec] specification of $(END_LINE) was made the same as Ruby 1.8.\n                   [ruby-dev:20130]     (thanks matz)\n2003/05/12: [memo] shifted to Subversion(version 0.21.0) from CVS.\n\n2003/03/19: Version 1.8.5\n\n2003/03/19: [impl] change REG_EXTERN definition.   (thanks nobu)\n2003/03/19: [impl] abbreviation for long error_par in regex_error_code_to_str().\n2003/03/18: [dist] change re.c.XXX.patch for GNU regex API changes.\n2003/03/18: [spec] change API regex_new(), regex_recompile() and\n                   regex_error_code_to_str().\n                   change API re_compile_pattern() and re_recompile_pattern().\n2003/03/18: [spec] replace REGERR_END_PATTERN_AT_GROUP_{COMMENT|OPTION} to\n                   REGERR_END_PATTERN_IN_GROUP.\n2003/03/17: [impl] should free err_arg.\n2003/03/17: [bug]  mistake(high -> to) in add_wc_range_to_buf().\n2003/03/17: [spec] add err_arg argument to regex_new() and regex_recompile().\n                   for detail error message.  (thanks akr)\n\n2003/03/12: Version 1.8.4\n\n2003/03/12: [tune] use cached value of effect node in get_min_match_length().\n2003/03/12: [bug]  escaped alphabet should be TK_RAW_BYTE\n                   in fetch_token() and fetch_token_in_cc().\n2003/03/12: [spec] change named backref and subexp call format.\n                   backref: \\k<name>, call: \\g<name>     (thanks akr)\n2003/03/11: [inst] add regparse.[ch] in win32/Makefile.\n2003/03/11: [bug]  if UNALIGNED_WORD_ACCESS isn't set\n                   then compile error in unset_addr_list_fix().  (thanks knu)\n2003/03/10: [impl] divide regcomp.c to regcomp.c, regparse.c and regparse.h.\n2003/03/10: [bug]  should handle multi-byte code name in fetch_name().\n2003/03/10: [spec] remove REGERR_TABLE_FOR_IGNORE_CASE_IS_NOT_SETTED.\n2003/03/10: [spec] support POSIX API option REG_NOSUB.\n                   add comp_options member to POSIX API regex_t.\n\n2003/03/10: Version 1.8.3\n\n2003/03/10: [bug]  can not compile with Ruby 1.6.8.\n                   (inconsistent st.h with 1.6 and 1.8)\n                   use hash table on Ruby 1.8 only.\n2003/03/10: [spec] forbid to use '\\' in group name.\n2003/03/08: [impl] remove check_backref_number().\n2003/03/08: [bug]  called group in 0-repeat should not be eliminated from\n                   compile code.  ex. /(?*n)(?<n>){0}/   (thanks akr)\n                   add is_refered member to QualifierNode.\n2003/03/07: [impl] use hash table(st.[ch]) for implementation of name table.\n                   (enable on Ruby in default)\n2003/03/07: [new]  add regex_foreach_names().\n2003/03/06: [impl] add member reg->stack_pop_level.\n2003/03/06: [impl] add operator OP_MEMORY_START and member reg->backtrack_mem.\n2003/03/06: [bug]  if REG_OPTION_FIND_LONGEST or REG_OPTION_NOT_EMPTY,\n                   should handle backtrack of MEM_END.\n                   add OP_MEMORY_END_PUSH and OP_MEMORY_END_PUSH_REC.\n2003/03/06: [impl] rename OP_MEMORY_END_PUSH to OP_MEMORY_END_MARK.\n2003/03/06: [spec] change error messages.\n2003/03/06: [tune] add tiny_pop check in STACK_POP.\n\n2003/03/05: Version 1.8.2\n\n2003/03/05: [impl] use cache info in EFFECT_MEMORY case\n                   in optimize_node_info().\n2003/03/05: [impl] add EFFECT_MEMORY node reference count check\n                   in optimize_node_left().\n2003/03/05: [impl] add min-len, max-len, char-len cache in EffectNode.\n2003/03/05: [spec] allow to call in look behind. ex. /(?<=(?*a))/\n2003/03/05: [bug]  forgotten N_ANCHOR case in check_backref_number(),\n                   subexp_inf_recursive_check_trav() etc...\n2003/03/05: [impl] rename USE_ONIGURUMA_EXTENSION to USE_SBMB_CLASS.\n2003/03/04: [impl] add CALL-node info in optimize_node_left().\n2003/03/04: [spec] prohibit left recursion of subexp call.   ex. (?<n>|(?*n)a)\n                   add subexp_inf_recursive_check_trav().\n2003/03/04: [spec] rename REG_SYN_STRICT_CHECK_BACKREF_NUMBER\n                   to REG_SYN_STRICT_CHECK_BACKREF\n2003/03/03: [bug]  /(?<n>a(?*n)|)/ isn't infinite recursion.\n                   fix N_LIST case in subexp_recursive_check(). (thanks akr)\n2003/03/03: [bug]  /(?<n>|(?*n))+/ segmentation fault.\n                   should re-allocate in unset_addr_list_add(). (thanks akr)\n\n2003/03/01: Version 1.8.1\n\n2003/03/01: [bug]  change STACK_GET_MEM_START() and STACK_PUSH_MEM_END().\n2003/03/01: [new]  add reg_name_to_group_numbers() to POSIX API.\n2003/03/01: [impl] use OP_MEMORY_END_PUSH in callable subexp compiled code\n                   only if subexp is recursive.\n2003/03/01: [spec] rename regex_name_to_backrefs() to\n                   regex_name_to_group_numbers().\n2003/02/28: [impl] use function stack_double() instead of macro.\n2003/02/28: [new]  subexp call. (?*name)    (thanks akr)\n2003/02/28: [spec] add match stack limit check. (MATCH_STACK_LIMIT_SIZE)\n2003/02/28: [impl] check recursive subexp call.\n2003/02/28: [impl] add opcode OP_MEMORY_END_PUSH for callable subexp.\n2003/02/28: [impl] add opcode OP_CALL, OP_RETURN.\n                   add stack type STK_CALL_FRAME, STK_RETURN, STK_MEM_END.\n2003/02/26: [spec] add new syntax behavior REG_SYN_STRICT_CHECK_BACKREF_NUMBER.\n                   if it is set, then error /(\\1)/, /\\1(..)/ etc...\n2003/02/26: [spec] if backref number is greater than max group number,\n                   then return compile error. (REGERR_INVALID_BACKREF_NUMBER)\n2003/02/26: [tune] bad implemented N_ALT case in get_min_match_length().\n2003/02/26: [dist] auto update testc.c and win32/testc.c in dist target.\n2003/02/26: [impl] add -win option to testconv.rb.\n2003/02/25: [spec] allow to assign same name to different group.\n                   add OP_BACKREF_MULTI.\n2003/02/24: [impl] reduce redundant repeat of empty target.\n                   ex. /()*/ ==> /()?/, /()+/ ==> /()/, /(?:)+/ ==> //\n2003/02/24: [impl] change condition in regex_is_allow_reverse_match().\n2003/02/24: [impl] convert i(/../, ...) functions in testconv.rb.\n2003/02/24: [impl] change name table struct.\n\n2003/02/22: Version 1.8.0\n\n2003/02/22: [new]  named subexp, named back reference.  (thanks akr)\n                   define: (?<name>...), back-ref: \\g<name>\n2003/02/22: [impl] use str_node_can_be_split().\n2003/02/21: [dist] add sample/posix.c\n2003/02/21: [spec] rename some error code symbols.\n2003/02/21: [spec] max number of multibyte ranges(255) is small.\n                   255 --> 1000.   (thanks MoonWolf)\n2003/02/20: [new]  supported Basic Regular Expression(BRE) in POSIX API.\n                   (REG_EXTENDED option: Extended RE)\n2003/02/20: [new]  variable syntax.\n\n2003/02/12: Version 1.7.2\n\n2003/02/12: [bug]  mismatch /\\?a/i.match('?A').\n                   check raw value in scan_make_node() and scan_backslash().\n                   (thanks Nobu)\n2003/02/12: [impl] rename 'max_mem' to 'num_mem' in regex_t.\n2003/02/12: [impl] rename 'code' to 'enc' in regex_t.\n2003/02/12: [spec] remove transtable argument in regex_new and regex_recompile.\n                   remove transtable member in regex_t.\n2003/02/10: [inst] change backup file suffix name from '.orig' to '.ruby_orig'.\n                   (win32/Makefile)\n2003/02/10: [spec] number check in scan_char_class() ignore-case mode.\n                   ex. /[\\x58-\\x64]/i\n2003/02/10: [impl] don't use OP_MEMORY_END_PUSH (and STK_MEM_END).\n2003/02/10: [impl] lift up head_exact value from child qualifier node to parent.\n2003/02/10: [tune] change stack type values.\n2003/02/10: [dist] add HISTORY.\n2003/02/08: [tune] change stack type values.\n2003/02/08: [tune] add STACK_BASE_CHECK().\n2003/02/08: [tune] add STACK_PUSH_ENSURED().\n2003/02/08: [dist] change contents of doc/API.\n2003/02/07: [inst] change backup file suffix name from '.orig' to '.ruby_orig'.\n2003/02/07: [spec] range in char-class should be same spec. with Ruby\n                   in ignore-case mode. (ex. /[A-c]/i == /[a-c]/i)\n                   (thanks MoonWolf)\n2003/02/07: [spec] [!--] should be allowed.    (thanks MoonWolf)\n2003/02/07: [dist] refresh re.c.180.patch for re.c (2003-02-06).\n\n2003/02/07: Version 1.7.1\n\n2003/02/07: [impl] check first byte of string in ignore-case mode.\n                   (get_head_exact_node())\n2003/02/07: [impl] remove redundant statements in setup_tree().\n2003/02/06: [new]  create Win32 DLL.\n2003/02/06: [impl] use P_() macro for function prototype.\n2003/02/06: [impl] add HAVE_PROTOTYPE, HAVE_STDARG_PROTOTYPES in\n                   configure.in and config.h.in.\n2003/02/06: [spec] /[0-9-a]/ is allowed as usual char '-' and 'a' in Ruby.\n                   add USE_BETTER_COMPATIBILITY_FOR_ORIGINAL_REGEX in\n                   regint.h.   (thanks MoonWolf)\n2003/02/06: [spec] rename REG_MBCTYPE_XXXX to REG_ENCODING_XXXX in onigposix.h.\n2003/02/05: [spec] rename MBCTYPE_XXXX to REG_MBCTYPE_XXXX in onigposix.h.\n2003/02/05: [spec] add POSIX API error REG_EONIG_THREAD to onigposix.h.\n2003/02/05: [dist] add .cvsignore file.\n\n2003/02/04: Version 1.7\n\n2003/02/04: [bug]  typo miss in regex_region_copy().\n2003/02/04: [impl] change THREAD_PASS macro. (regint.h)\n2003/02/04: [dist] add API document file doc/API.\n2003/02/04: [tune] if sub_anchor has ANCHOR_BEGIN_LINE then\n                   set REG_OPTIMIZE_EXACT_BM in set_optimize_exact_info().\n2003/02/04: [spec] reimplement regex_clone() and it is obsoleted.\n2003/02/04: [bug]  add REGERR_OVER_THREAD_PASS_LIMIT_COUNT\n                   to regerror.c regposix.c.\n2003/02/03: [bug]  Hankaku-Kana may be second byte in Shift_JIS\n                   regex_is_allow_reverse_match().\n2003/02/03: [impl] add optimization type REG_OPTIMIZE_EXACT_BM_NOT_REV.\n                   remove exact_allow_reverse_match member in regex_t.\n2003/02/03: [impl] add exact_allow_reverse_match member in regex_t.\n2003/02/03: [impl] compile-search conflict in regex_search() is handled.\n2003/02/01: [tune] decrease regex_region_clear() calling from regex_search().\n2003/02/01: [tune] remove region argument from match_at().\n2003/01/31: [tune] don't use strlen() in regexec() and regcomp().\n2003/01/31: [tune] decrease regex_reduce_chain() calling in regex_search().\n2003/01/31: [bug]  STRING_CMP() in regexec.c was wrong in ignore-case.\n2003/01/31: [impl] convert to lower-case char at string compile time.\n                   change SBTRANSCMP() in regexec.c.\n2003/01/31: [impl] rename TTRANS() to TOLOWER().\n2003/01/30: [bug]  .c.o --> .c.obj in win32\\Makefile.\n2003/01/30: [impl] add -DNOT_RUBY to Makefile.in.\n                   NOT_RUBY is refered in regint.h for escape double\n                   including config.h.\n2003/01/30: [impl] when string hasn't case ambiguity, don't compile\n                   to ignore case opcode.\n2003/01/29: [impl] add SJIS, UTF-8 test_sb() test.\n2003/01/29: [dist] add INSTALL-RUBY file.\n2003/01/28: [test] success in Cygwin, Ruby 1.8.0 (2003-01-27).\n2003/01/24: [inst] add rback target to Makefile.in.\n2003/01/24: [impl] change SBCMP() -> IS_NEWLINE() in match_at().\n2003/01/23: [impl] add encoding arg to scan_xxxx_number().\n2003/01/23: [impl] rename WCInt to WCINT.\n2003/01/22: [bug]  POSIX API regexec() was not thread safe.\n                   remove region member from POSIX regex_t.\n            [new]  add search time option REG_OPTION_POSIX_REGION.\n                   (region argument is treated as regmatch_t[] type)\n                   speed up regexec().\n2003/01/22: [memo] start CVS entry in my box.\n\n2003/01/21: Version 1.6\n\n2003/01/21: [test] Mac OS X 10.1, Ruby 1.8.0 (2003-01-20)\n2003/01/20: [impl] add UTF-8 check to test.rb.   (thanks UENO Katsuhiro)\n2003/01/18: [impl] change REGION_NOTPOS to REG_REGION_NOTPOS in regex.h.\n2003/01/17: [dist] add sample/simple.c.\n2003/01/17: [inst] add configure option --with-rubydir.\n2003/01/17: [bug]  bad implemeted POSIX API options.\n                   default:     /./ not match \"\\n\", anchor not match \"\\n\"\n                   REG_NEWLINE: /./ not match \"\\n\", anchor match \"\\n\"\n2003/01/16: [impl] rewrite POSIX API regexec() for speed up.\n2003/01/16: [impl] add region member to POSIX regex_t struct.\n2003/01/16: [inst] rename library file from 'libregex.a' to 'libonig.a'.\n2003/01/15: [dist] add testc.c to distribution file.\n2003/01/15: [test] success in 'make rtest/ctest/ptest' on Windows 2000.\n2003/01/15: [bug]  change '/' to \\' in win32/Makefile.\n2003/01/14: [test] success in Ruby make test on Windows 2000.\n                   VC++6.0, Ruby 1.6.8 (2003-01-12)\n2003/01/14: [inst] change Makefile.in and win32/Makefile.\n2003/01/11: [inst] changes for Win32 platform. (regint.h, reggnu.c, regcomp.c)\n2003/01/11: [dist] add win32 directory. (config.h, Makefile, testc.c)\n2003/01/10: [inst] add onigposix.h to install target. (Makefile.in)\n2003/01/10: [bug]  lacked a comma in ESTRING[]. (regposerr.c)\n2003/01/10: [bug]  local variable name was wrong. buf -> tbuf (regerror())\n2003/01/10: [spec] remove REG_RUBY_M17N case from onigposix.h and regposix.c.\n\n2003/01/09: Version 1.5\n\n2003/01/09: [inst] replace Ruby re.c.XXX.patch files. (166 -> 168, 172 -> 180)\n2003/01/09: [new]  implement POSIX API.   (thanks knu)\n                   (onigposix.h, regposix.c, regposerr.c)\n2003/01/08: [spec] remove REGERR_END_PATTERN_AFTER_BACKSLASH in regex.h.\n2003/01/08: [spec] region arg can be NULL in regex_search() and regex_match().\n\n2003/01/08: Version 1.4\n\n2003/01/08: [inst] add test program converter (test.rb -> testc.c).\n2003/01/08: [bug]  move GET_WCINT() from regcomp.c to regint.h.\n2003/01/07: [inst] add new test script (test.rb).\n2002/12/30: [bug]  wrong merge in multibyte mode (alt_merge_opt_exact_info()).\n2002/12/28: [inst] add rtest target to Makefile.in.\n2002/12/28: [bug]  /\\xfe/.match(\"\\xfe\") mismatch in multibyte mode.\n                   add \"raw\" flag arg to concat_opt_exact_info_str().\n2002/12/25: [bug]  check condition was wrong in alt_merge_opt_map_info().\n2002/12/25: [impl] add threshold_len check in regex_search().\n2002/12/23: [bug]  prec-read in alternative (/a|(?=z).f/.match(\"zf\") => nil)\n2002/12/23: [bug]  \\G in alternative (/a|\\Gz/.match(\"bza\") => \"z\").\n                   add start member in MatchArg. (regexec.c)\n2002/12/21: [impl] **** rewrite all optimization process. ****\n2002/12/16: [impl] remove node subtype EFFECT_EMPTY.\n2002/12/12: [impl] reconstruct node types. (regcomp.c)\n2002/12/11: [impl] add regerror.c\n2002/12/10: [bug]  [ruby-dev:19042] (thanks Nobu)\n                   anchor(\\G etc...) influenced outside of \"|\". (/a|\\Gb/)\n2002/11/30: [bug]  [ruby-dev:18966] (thanks Nobu)\n                   char-class(\\S, [^\\s] etc...) optimize map-info was wrong.\n2002/11/29: [bug]  infinite loop on NULL-pointer str search (regex_search()).\n                   (thanks matz)\n2002/11/29: [bug]  change static -> extern (regex_chain_reduce()).\n2002/11/29: [bug]  change encoding to RegDefaultCharEncoding\n                   in re_recompile_pattern(). (adapt to re.c)\n2002/04/24: [spec] USE_ONIGURUMA_EXTENSION is disabled in default.\n2002/04/24: [new]  add searching time option: REG_OPTION_NOTBOL/NOTEOL.\n                   add searching time option argument to regex_search() and\n                   regex_match(). (prepare for POSIX API)\n2002/04/20: [impl] divide regex.c file into regcomp.c, regexec.c, reggnu.c\n                   and regint.h.\n2002/04/09: [impl] move IS_MULTILINE() to outside of loop in OP_ANYCHAR_STAR.\n2002/04/08: [impl] don't use OP_REPEAT operator for '??'.\n2002/04/06: [impl] reduce redundant nested repeat operators(?,*,+,??,*?,+?).\n                   ex. (?:a*)?, (?:a??)* etc..\n2002/04/06: [spec] should not warn for /(?:a?)+?/.\n2002/04/04: [spec] should allow fixed length alternative and repeat pattern\n                   in look-behind. ex. /(?<=(a|b){3})/  (thanks Guy Decoux)\n2002/04/02: [spec] should warn for /(?:a+)?/ and /(?:a*)??/.  (thanks akr)\n\n2002/04/01: Version 1.3\n\n2002/04/01: [dist] add COPYING.\n2002/03/30: [spec] warn redundant nested repeat operator\n                   in Ruby verbose mode.  ex. (?:a*)?\n2002/03/30: [spec] nested repeat operator error check should be\n                   same with GNU regex.             (thanks Guy Decoux)\n2002/03/30: [new]  add \\x{hexadecimal-wide-char}.   (thanks matz)\n2002/03/27: [bug]  MBCTYPE_XXX symbol values should be same with GNU regex.\n2002/03/27: [impl] add THREAD_ATOMIC to regex_clone(), regex_init(), regex_end().\n2002/03/25: [spec] if encoding is utf-8, allow combination of singlebyte and\n                   multibyte code range in char class.\n                   (cancelled 2002/04/01: for M17N compatibility)\n2002/03/25: [dist] description of the license condition is added to README.\n2002/03/23: [bug]  should set all bits of reg->mem_stats,\n                   if REG_OPTION_FIND_LONGEST or REG_OPTION_NOT_EMPTY.\n2002/03/23: [new]  add a new option REG_OPTION_NOT_EMPTY.\n2002/03/20: [spec] allow incompleted left brace as an usual char.\n                   ex. /{/, /({)/, /a{2,3/ etc...\n2002/03/20: [impl] serialize integer in bytecode.\n                   (switch by UNALIGNED_WORD_ACCESS in regex.c)\n2002/03/20: [impl] change re_mbcinit() for REG_RUBY_M17N.\n2002/03/19: [impl] word alignment of char class multi-byte code ranges.\n2002/03/19: [impl] replace OP_EXACTMB4N with OP_EXACTMB3N.\n2002/03/19: [bug]  OP_CCLASS_MB_NOT process in matchAt() is wrong.\n2002/03/19: [new]  add re_mbctab[] for Ruby extension library compatibility.\n2002/03/19: [spec] allow nested repeat operator, if operator is {n,m} type.\n2002/03/19: [new]  add REG_IS_PATTERN_ERROR(ecode) in regex.h\n2002/03/18: [spec] /[a-b-c]/ should be error.\n2002/03/18: [bug]  /[\\w-a]/ should be error.        (thanks Guy Decoux)\n2002/03/18: [bug]  /[\\]/ should be error.           (thanks Guy Decoux)\n2002/03/18: [bug]  /()*/ etc.. should not be error. (thanks Guy Decoux)\n2002/03/18: [spec] /a{1}*/ should not be error.     (thanks Guy Decoux)\n2002/03/18: [bug]  ab{2}{3} was interpreded to (?:a(?:b{2})){3}\n                   (thanks Guy Decoux)\n2002/03/18: [bug]  abort /(?i)*a/ etc...            (thanks Guy Decoux)\n2002/03/18: [bug]  abort /a|*/,/a|{1}/ etc...       (thanks Guy Decoux)\n\n2002/03/13: Version 1.2\n\n2002/03/13: [test] success in rubicon/builtin/AllBuiltinTests.rb.\n                   (thanks rubicon)\n2002/03/13: [bug]  OP_EXACTMBN process in matchAt() is wrong.\n2002/03/13: [bug]  start argument of BackwardSearchRange() is wrong.\n2002/03/12: [spec] change function name style from CamelCase\n                   to underline_separation. (includes API)\n2002/03/12: [bug]  if pattern has nested null-check, cause infinite loop.\n                   correct STACK_NULL_CHECK() macro. (thanks Guy Decoux)\n2002/03/11: [bug]  it is wrong that four numbers to continue as\n                   an octal value in scanBackSlash(). ex. /\\0111/\n                   (thanks matz)\n2002/03/11: [new]  \\k (single-byte word char), \\K (multi-byte char).\n2002/03/09: [inst] add two targets to Makefile.in (166 and 172).\n2002/03/09: [spec] decrease REG_MAX_BACKREF_NUM, REG_MAX_REPEAT_NUM\n                   values.\n2002/03/08: [spec] allow use of \"\\A\"(begin-buf) in look-behind.\n2002/03/08: [impl] add a new opcode OP_PUSH_IF_PEEK_NEXT.\n2002/03/08: [impl] add a new opcode OP_ANYCHAR_STAR_PEEK_NEXT.\n2002/03/07: [spec] prohibit use of capture group \"(...)\"\n                   in negative look-behind.\n2002/03/07: [inst] add configure.in, config.h.in, Makefile.in.\n2002/03/07: [impl] call Init_REGEX_STAT() in RegexInit().\n2002/03/07: [spec] less length string match with negative look-behind.\n                   ex. /(?<!XXX)a/.match(\"Xa\").    (thanks Nobu)\n2002/03/06: [impl] expand repeated string, if expanded length <= 100.\n                   ex. /(?:abc){10}/\n2002/03/06: [new]  add a symbol REG_TRANSTABLE_USE_DEFAULT in regex.h.\n2002/03/06: [impl] rename RegDefaultCharCode to RegDefaultCharEncoding.\n2002/03/06: [bug]  if pattern has NULL(\\000) char, infinite loop happens\n                   in ScanMakeNode(). (beware of strchr(). thanks Nobu)\n2002/03/06: [bug]  range argument of ForwardSearchRange() is wrong.\n                   ex. /\\A.a/, /\\G.a/ mismatched with \"aa\". (thanks Nobu)\n2002/03/05: [new]  add RegexMatch() API. rename regexMatch() to matchAt().\n2002/03/05: [impl] change function definition style.\n2002/03/05: [impl] abolish use of macro symbol which name begin with underline.\n2002/03/04: [bug]  make up a break-statement in compileTree().\n                   (compile error on Mac OS X 10.1.3)\n\n2002/03/04: Version 1.1\n\n2002/03/04: [impl] replace STK_BOTTOM with STK_ALT.\n2002/03/02: [impl] add new opcode OP_FINISH and new stack type\n                   STK_BOTTOM for (little bit) speed up STACK_POP.\n2002/03/02: [impl] add new opcode OP_EXACT1_IC, OP_EXACTN_IC\n                   for compile time ignore case check.\n                   remove opcode OP_EXACT1_RAW, OP_EXACTN_RAW.\n2002/03/02: [impl] add OpTime info to statistical data.\n2002/02/28: [bug]  sub_anchor($) in ForwardSearch() and BackwardSearch().\n                   ex. /$\\x0az/.match(\"\\nz\")\n2002/02/28: [new]  look-behind (?<=pattern), (?<!pattern).\n2002/02/27: [bug]  use StackIndex instead of StackType* for realloc problem.\n2002/02/27: [impl] use m17n_codepoint() as mb2wc() in REG_RUBY_M17N.\n2002/02/27: [spec] undefined POSIX bracket /[[:xyz:]]/ should be syntax error.\n2002/02/26: [bug]  ex. /$*/, /[a-]/, /((?i)a)b/   (thanks matz)\n\n2002/02/25: Version 1.0 (first release)\n\n--\n[bug:  bug fix]\n[API:  API change/new/delete]\n[new:  new feature]\n[spec: specification change]\n[impl: implementation change]\n[tune: tune for speed up]\n[inst: changes for installation]\n[dist: distribution change]\n[test: test]\n[dev:  development]\n[memo: memo]\n--\n<create tag>\nsvn copy file:///home/kosako/svnreps/svnrep_onig/trunk file:///home/kosako/svnreps/svnrep_onig/tags/5.0.0 -m \"ADD TAG: 5.0.0\"\n\n<set ignore files by .cvsignore>\nsvn propset svn:ignore -F .cvsignore .\nsvn commit -m \"...\"\n\n\n<CVS: show all tags>\ncvs history -T\n\n<CVS: add tag>\ncvs rtag \"VERSION_X_X_X\" oniguruma\n\n\n<GNU Autotools: bootstrap>\n* write Makefile.am and configure.in.\n> aclocal\n> libtoolize   or   glibtoolize\n> automake --foreign --add-missing\n> autoconf\n> configure --with-rubydir=... CFLAGS=\"-O2 -Wall\"\n\n\n<GNU libtool: version management>\n\n  VERSION = current:revision:age\n\n  current:  interface number (from 0)\n  revision: implementation number of same interface (from 0)\n  age:      number of supported previous interfaces\n            (if current only supported then age == 0)\n\n//END\n"
  },
  {
    "path": "src/Onigmo/INSTALL",
    "content": "Installation Instructions\n*************************\n\nCopyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,\n2006, 2007, 2008, 2009 Free Software Foundation, Inc.\n\n   Copying and distribution of this file, with or without modification,\nare permitted in any medium without royalty provided the copyright\nnotice and this notice are preserved.  This file is offered as-is,\nwithout warranty of any kind.\n\nBasic Installation\n==================\n\n   Briefly, the shell commands `./configure; make; make install' should\nconfigure, build, and install this package.  The following\nmore-detailed instructions are generic; see the `README' file for\ninstructions specific to this package.  Some packages provide this\n`INSTALL' file but do not implement all of the features documented\nbelow.  The lack of an optional feature in a given package is not\nnecessarily a bug.  More recommendations for GNU packages can be found\nin *note Makefile Conventions: (standards)Makefile Conventions.\n\n   The `configure' shell script attempts to guess correct values for\nvarious system-dependent variables used during compilation.  It uses\nthose values to create a `Makefile' in each directory of the package.\nIt may also create one or more `.h' files containing system-dependent\ndefinitions.  Finally, it creates a shell script `config.status' that\nyou can run in the future to recreate the current configuration, and a\nfile `config.log' containing compiler output (useful mainly for\ndebugging `configure').\n\n   It can also use an optional file (typically called `config.cache'\nand enabled with `--cache-file=config.cache' or simply `-C') that saves\nthe results of its tests to speed up reconfiguring.  Caching is\ndisabled by default to prevent problems with accidental use of stale\ncache files.\n\n   If you need to do unusual things to compile the package, please try\nto figure out how `configure' could check whether to do them, and mail\ndiffs or instructions to the address given in the `README' so they can\nbe considered for the next release.  If you are using the cache, and at\nsome point `config.cache' contains results you don't want to keep, you\nmay remove or edit it.\n\n   The file `configure.ac' (or `configure.in') is used to create\n`configure' by a program called `autoconf'.  You need `configure.ac' if\nyou want to change it or regenerate `configure' using a newer version\nof `autoconf'.\n\n   The simplest way to compile this package is:\n\n  1. `cd' to the directory containing the package's source code and type\n     `./configure' to configure the package for your system.\n\n     Running `configure' might take a while.  While running, it prints\n     some messages telling which features it is checking for.\n\n  2. Type `make' to compile the package.\n\n  3. Optionally, type `make check' to run any self-tests that come with\n     the package, generally using the just-built uninstalled binaries.\n\n  4. Type `make install' to install the programs and any data files and\n     documentation.  When installing into a prefix owned by root, it is\n     recommended that the package be configured and built as a regular\n     user, and only the `make install' phase executed with root\n     privileges.\n\n  5. Optionally, type `make installcheck' to repeat any self-tests, but\n     this time using the binaries in their final installed location.\n     This target does not install anything.  Running this target as a\n     regular user, particularly if the prior `make install' required\n     root privileges, verifies that the installation completed\n     correctly.\n\n  6. You can remove the program binaries and object files from the\n     source code directory by typing `make clean'.  To also remove the\n     files that `configure' created (so you can compile the package for\n     a different kind of computer), type `make distclean'.  There is\n     also a `make maintainer-clean' target, but that is intended mainly\n     for the package's developers.  If you use it, you may have to get\n     all sorts of other programs in order to regenerate files that came\n     with the distribution.\n\n  7. Often, you can also type `make uninstall' to remove the installed\n     files again.  In practice, not all packages have tested that\n     uninstallation works correctly, even though it is required by the\n     GNU Coding Standards.\n\n  8. Some packages, particularly those that use Automake, provide `make\n     distcheck', which can by used by developers to test that all other\n     targets like `make install' and `make uninstall' work correctly.\n     This target is generally not run by end users.\n\nCompilers and Options\n=====================\n\n   Some systems require unusual options for compilation or linking that\nthe `configure' script does not know about.  Run `./configure --help'\nfor details on some of the pertinent environment variables.\n\n   You can give `configure' initial values for configuration parameters\nby setting variables in the command line or in the environment.  Here\nis an example:\n\n     ./configure CC=c99 CFLAGS=-g LIBS=-lposix\n\n   *Note Defining Variables::, for more details.\n\nCompiling For Multiple Architectures\n====================================\n\n   You can compile the package for more than one kind of computer at the\nsame time, by placing the object files for each architecture in their\nown directory.  To do this, you can use GNU `make'.  `cd' to the\ndirectory where you want the object files and executables to go and run\nthe `configure' script.  `configure' automatically checks for the\nsource code in the directory that `configure' is in and in `..'.  This\nis known as a \"VPATH\" build.\n\n   With a non-GNU `make', it is safer to compile the package for one\narchitecture at a time in the source code directory.  After you have\ninstalled the package for one architecture, use `make distclean' before\nreconfiguring for another architecture.\n\n   On MacOS X 10.5 and later systems, you can create libraries and\nexecutables that work on multiple system types--known as \"fat\" or\n\"universal\" binaries--by specifying multiple `-arch' options to the\ncompiler but only a single `-arch' option to the preprocessor.  Like\nthis:\n\n     ./configure CC=\"gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64\" \\\n                 CXX=\"g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64\" \\\n                 CPP=\"gcc -E\" CXXCPP=\"g++ -E\"\n\n   This is not guaranteed to produce working output in all cases, you\nmay have to build one architecture at a time and combine the results\nusing the `lipo' tool if you have problems.\n\nInstallation Names\n==================\n\n   By default, `make install' installs the package's commands under\n`/usr/local/bin', include files under `/usr/local/include', etc.  You\ncan specify an installation prefix other than `/usr/local' by giving\n`configure' the option `--prefix=PREFIX', where PREFIX must be an\nabsolute file name.\n\n   You can specify separate installation prefixes for\narchitecture-specific files and architecture-independent files.  If you\npass the option `--exec-prefix=PREFIX' to `configure', the package uses\nPREFIX as the prefix for installing programs and libraries.\nDocumentation and other data files still use the regular prefix.\n\n   In addition, if you use an unusual directory layout you can give\noptions like `--bindir=DIR' to specify different values for particular\nkinds of files.  Run `configure --help' for a list of the directories\nyou can set and what kinds of files go in them.  In general, the\ndefault for these options is expressed in terms of `${prefix}', so that\nspecifying just `--prefix' will affect all of the other directory\nspecifications that were not explicitly provided.\n\n   The most portable way to affect installation locations is to pass the\ncorrect locations to `configure'; however, many packages provide one or\nboth of the following shortcuts of passing variable assignments to the\n`make install' command line to change installation locations without\nhaving to reconfigure or recompile.\n\n   The first method involves providing an override variable for each\naffected directory.  For example, `make install\nprefix=/alternate/directory' will choose an alternate location for all\ndirectory configuration variables that were expressed in terms of\n`${prefix}'.  Any directories that were specified during `configure',\nbut not in terms of `${prefix}', must each be overridden at install\ntime for the entire installation to be relocated.  The approach of\nmakefile variable overrides for each directory variable is required by\nthe GNU Coding Standards, and ideally causes no recompilation.\nHowever, some platforms have known limitations with the semantics of\nshared libraries that end up requiring recompilation when using this\nmethod, particularly noticeable in packages that use GNU Libtool.\n\n   The second method involves providing the `DESTDIR' variable.  For\nexample, `make install DESTDIR=/alternate/directory' will prepend\n`/alternate/directory' before all installation names.  The approach of\n`DESTDIR' overrides is not required by the GNU Coding Standards, and\ndoes not work on platforms that have drive letters.  On the other hand,\nit does better at avoiding recompilation issues, and works well even\nwhen some directory options were not specified in terms of `${prefix}'\nat `configure' time.\n\nOptional Features\n=================\n\n   If the package supports it, you can cause programs to be installed\nwith an extra prefix or suffix on their names by giving `configure' the\noption `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.\n\n   Some packages pay attention to `--enable-FEATURE' options to\n`configure', where FEATURE indicates an optional part of the package.\nThey may also pay attention to `--with-PACKAGE' options, where PACKAGE\nis something like `gnu-as' or `x' (for the X Window System).  The\n`README' should mention any `--enable-' and `--with-' options that the\npackage recognizes.\n\n   For packages that use the X Window System, `configure' can usually\nfind the X include and library files automatically, but if it doesn't,\nyou can use the `configure' options `--x-includes=DIR' and\n`--x-libraries=DIR' to specify their locations.\n\n   Some packages offer the ability to configure how verbose the\nexecution of `make' will be.  For these packages, running `./configure\n--enable-silent-rules' sets the default to minimal output, which can be\noverridden with `make V=1'; while running `./configure\n--disable-silent-rules' sets the default to verbose, which can be\noverridden with `make V=0'.\n\nParticular systems\n==================\n\n   On HP-UX, the default C compiler is not ANSI C compatible.  If GNU\nCC is not installed, it is recommended to use the following options in\norder to use an ANSI C compiler:\n\n     ./configure CC=\"cc -Ae -D_XOPEN_SOURCE=500\"\n\nand if that doesn't work, install pre-built binaries of GCC for HP-UX.\n\n   On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot\nparse its `<wchar.h>' header file.  The option `-nodtk' can be used as\na workaround.  If GNU CC is not installed, it is therefore recommended\nto try\n\n     ./configure CC=\"cc\"\n\nand if that doesn't work, try\n\n     ./configure CC=\"cc -nodtk\"\n\n   On Solaris, don't put `/usr/ucb' early in your `PATH'.  This\ndirectory contains several dysfunctional programs; working variants of\nthese programs are available in `/usr/bin'.  So, if you need `/usr/ucb'\nin your `PATH', put it _after_ `/usr/bin'.\n\n   On Haiku, software installed for all users goes in `/boot/common',\nnot `/usr/local'.  It is recommended to use the following options:\n\n     ./configure --prefix=/boot/common\n\nSpecifying the System Type\n==========================\n\n   There may be some features `configure' cannot figure out\nautomatically, but needs to determine by the type of machine the package\nwill run on.  Usually, assuming the package is built to be run on the\n_same_ architectures, `configure' can figure that out, but if it prints\na message saying it cannot guess the machine type, give it the\n`--build=TYPE' option.  TYPE can either be a short name for the system\ntype, such as `sun4', or a canonical name which has the form:\n\n     CPU-COMPANY-SYSTEM\n\nwhere SYSTEM can have one of these forms:\n\n     OS\n     KERNEL-OS\n\n   See the file `config.sub' for the possible values of each field.  If\n`config.sub' isn't included in this package, then this package doesn't\nneed to know the machine type.\n\n   If you are _building_ compiler tools for cross-compiling, you should\nuse the option `--target=TYPE' to select the type of system they will\nproduce code for.\n\n   If you want to _use_ a cross compiler, that generates code for a\nplatform different from the build platform, you should specify the\n\"host\" platform (i.e., that on which the generated programs will\neventually be run) with `--host=TYPE'.\n\nSharing Defaults\n================\n\n   If you want to set default values for `configure' scripts to share,\nyou can create a site shell script called `config.site' that gives\ndefault values for variables like `CC', `cache_file', and `prefix'.\n`configure' looks for `PREFIX/share/config.site' if it exists, then\n`PREFIX/etc/config.site' if it exists.  Or, you can set the\n`CONFIG_SITE' environment variable to the location of the site script.\nA warning: not all `configure' scripts look for a site script.\n\nDefining Variables\n==================\n\n   Variables not defined in a site shell script can be set in the\nenvironment passed to `configure'.  However, some packages may run\nconfigure again during the build, and the customized values of these\nvariables may be lost.  In order to avoid this problem, you should set\nthem in the `configure' command line, using `VAR=value'.  For example:\n\n     ./configure CC=/usr/local2/bin/gcc\n\ncauses the specified `gcc' to be used as the C compiler (unless it is\noverridden in the site shell script).\n\nUnfortunately, this technique does not work for `CONFIG_SHELL' due to\nan Autoconf bug.  Until the bug is fixed you can use this workaround:\n\n     CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash\n\n`configure' Invocation\n======================\n\n   `configure' recognizes the following options to control how it\noperates.\n\n`--help'\n`-h'\n     Print a summary of all of the options to `configure', and exit.\n\n`--help=short'\n`--help=recursive'\n     Print a summary of the options unique to this package's\n     `configure', and exit.  The `short' variant lists options used\n     only in the top level, while the `recursive' variant lists options\n     also present in any nested packages.\n\n`--version'\n`-V'\n     Print the version of Autoconf used to generate the `configure'\n     script, and exit.\n\n`--cache-file=FILE'\n     Enable the cache: use and save the results of the tests in FILE,\n     traditionally `config.cache'.  FILE defaults to `/dev/null' to\n     disable caching.\n\n`--config-cache'\n`-C'\n     Alias for `--cache-file=config.cache'.\n\n`--quiet'\n`--silent'\n`-q'\n     Do not print messages saying which checks are being made.  To\n     suppress all normal output, redirect it to `/dev/null' (any error\n     messages will still be shown).\n\n`--srcdir=DIR'\n     Look for the package's source code in directory DIR.  Usually\n     `configure' can determine that directory automatically.\n\n`--prefix=DIR'\n     Use DIR as the installation prefix.  *note Installation Names::\n     for more details, including other options available for fine-tuning\n     the installation locations.\n\n`--no-create'\n`-n'\n     Run the configure checks, but stop before creating any output\n     files.\n\n`configure' also accepts some other, not widely useful, options.  Run\n`configure --help' for more details.\n\n"
  },
  {
    "path": "src/Onigmo/Makefile.am",
    "content": "## Makefile.am for Oniguruma\nencdir    = $(top_srcdir)/enc\nsampledir = $(top_srcdir)/sample\nlibname = libonig.la\n\nACLOCAL_AMFLAGS = -I m4\n#AM_CFLAGS = -DNOT_RUBY\nAM_CFLAGS =\nINCLUDES  = -I$(top_srcdir) -I$(includedir)\n\nSUBDIRS = . sample\n\ninclude_HEADERS = oniguruma.h oniggnu.h onigposix.h\nlib_LTLIBRARIES = $(libname)\n\nlibonig_la_SOURCES = regint.h regparse.h regenc.h st.h \\\n\tregerror.c regparse.c regext.c regcomp.c regexec.c reggnu.c \\\n\tregenc.c regsyntax.c regtrav.c regversion.c st.c \\\n\tregposix.c regposerr.c \\\n\t$(encdir)/unicode.c $(encdir)/ascii.c $(encdir)/utf8.c \\\n\t$(encdir)/utf16_be.c $(encdir)/utf16_le.c \\\n\t$(encdir)/utf32_be.c $(encdir)/utf32_le.c \\\n\t$(encdir)/unicode/casefold.h $(encdir)/unicode/name2ctype.h \\\n\t$(encdir)/euc_jp.c $(encdir)/sjis.c $(encdir)/cp932.c \\\n\t$(encdir)/iso8859_1.c \\\n\t$(encdir)/iso8859_2.c  $(encdir)/iso8859_3.c \\\n\t$(encdir)/iso8859_4.c  $(encdir)/iso8859_5.c \\\n\t$(encdir)/iso8859_6.c  $(encdir)/iso8859_7.c \\\n\t$(encdir)/iso8859_8.c  $(encdir)/iso8859_9.c \\\n\t$(encdir)/iso8859_10.c $(encdir)/iso8859_11.c \\\n\t$(encdir)/iso8859_13.c $(encdir)/iso8859_14.c \\\n\t$(encdir)/iso8859_15.c $(encdir)/iso8859_16.c \\\n\t$(encdir)/euc_tw.c $(encdir)/euc_kr.c $(encdir)/big5.c \\\n\t$(encdir)/gb18030.c $(encdir)/koi8_r.c $(encdir)/cp1251.c\n\nlibonig_la_LDFLAGS = -version-info $(LTVERSION)\n\nEXTRA_DIST = .gitignore oniguruma.pc.in HISTORY README.ja index.html \\\n\tindex_ja.html doc/API doc/API.ja doc/RE doc/RE.ja doc/FAQ doc/FAQ.ja \\\n\tdoc/UnicodeProps.txt \\\n\ttool/.gitignore tool/CaseFolding.py tool/convert-name2ctype.sh \\\n\ttool/enc-unicode.rb \\\n\twin32/Makefile win32/config.h win32/testc.c \\\n\twin32/makedef.py win32/onig.rc \\\n\t$(encdir)/koi8.c $(encdir)/mktable.c \\\n\t$(sampledir)/encode.c $(sampledir)/listcap.c $(sampledir)/names.c \\\n\t$(sampledir)/posix.c $(sampledir)/simple.c $(sampledir)/sql.c \\\n\t$(sampledir)/syntax.c $(sampledir)/crnl.c \\\n\ttest.rb testconv.rb testconvu.rb \\\n\tonig.py testpy.py\n\nbin_SCRIPTS = onig-config\n\nonig-config: onig-config.in\n\ndo_subst = sed                                          \\\n      -e 's,[@]datadir[@],$(datadir),g'                 \\\n      -e 's,[@]datarootdir[@],$(datarootdir),g'         \\\n      -e 's,[@]PACKAGE_VERSION[@],$(PACKAGE_VERSION),g' \\\n      -e 's,[@]prefix[@],$(prefix),g'                   \\\n      -e 's,[@]exec_prefix[@],$(exec_prefix),g'         \\\n      -e 's,[@]libdir[@],$(libdir),g'                   \\\n      -e 's,[@]includedir[@],$(includedir),g'\n\noniguruma.pc: $(srcdir)/oniguruma.pc.in Makefile\n\t$(do_subst) < $(<) > $(@)\n\npkgconfigdir   = $(libdir)/pkgconfig\npkgconfig_DATA = oniguruma.pc\n\ndll:\n\t$(CXX) -shared -Wl,--output-def,libonig.def -o libonig.dll *.o \\\n\t$(LIBS)\n\tstrip libonig.dll\n\n# Ruby TEST\nrtest:\n\t$(RUBYDIR)/ruby -w -Ke $(srcdir)/test.rb\n\n# character-types-table source generator\nmktable: $(encdir)/mktable.c $(srcdir)/regenc.h\n\t$(CC) -I$(top_srcdir) -o mktable $(encdir)/mktable.c\n\n\n# TEST\nTESTS = testc testp testcu\n\ncheck_PROGRAMS = testc testp testcu\n\natest: testc testp testcu\n\t@echo \"[Oniguruma API, ASCII/EUC-JP check]\"\n\t@$(top_builddir)/testc  | grep RESULT\n\t@echo \"[POSIX API, ASCII/EUC-JP check]\"\n\t@$(top_builddir)/testp  | grep RESULT\n\t@echo \"[Oniguruma API, UTF-16 check]\"\n\t@$(top_builddir)/testcu | grep RESULT\n\ntestc_SOURCES = testc.c\ntestc_LDADD = libonig.la\n\ntestp_SOURCES = testc.c\ntestp_LDADD = libonig.la\ntestp_CFLAGS = -DPOSIX_TEST\n\ntestcu_SOURCES = testu.c\ntestcu_LDADD = libonig.la\n\n\ntestc.c: $(srcdir)/test.rb $(srcdir)/testconv.rb\n\truby -Ke $(srcdir)/testconv.rb < $(srcdir)/test.rb > $@\n\ntestu.c: $(srcdir)/test.rb $(srcdir)/testconvu.rb\n\truby -Ke $(srcdir)/testconvu.rb $(srcdir)/test.rb > $@\n\nwin32/testc.c: $(srcdir)/test.rb $(srcdir)/testconv.rb\n\truby -Ke $(srcdir)/testconv.rb -win < $(srcdir)/test.rb | nkf -cs > $@\n\n## END OF FILE\n"
  },
  {
    "path": "src/Onigmo/Makefile.in",
    "content": "# Makefile.in generated by automake 1.11.1 from Makefile.am.\n# @configure_input@\n\n# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,\n# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,\n# Inc.\n# This Makefile.in is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\n@SET_MAKE@\n\n\n\n\nVPATH = @srcdir@\npkgdatadir = $(datadir)/@PACKAGE@\npkgincludedir = $(includedir)/@PACKAGE@\npkglibdir = $(libdir)/@PACKAGE@\npkglibexecdir = $(libexecdir)/@PACKAGE@\nam__cd = CDPATH=\"$${ZSH_VERSION+.}$(PATH_SEPARATOR)\" && cd\ninstall_sh_DATA = $(install_sh) -c -m 644\ninstall_sh_PROGRAM = $(install_sh) -c\ninstall_sh_SCRIPT = $(install_sh) -c\nINSTALL_HEADER = $(INSTALL_DATA)\ntransform = $(program_transform_name)\nNORMAL_INSTALL = :\nPRE_INSTALL = :\nPOST_INSTALL = :\nNORMAL_UNINSTALL = :\nPRE_UNINSTALL = :\nPOST_UNINSTALL = :\nbuild_triplet = @build@\nhost_triplet = @host@\nTESTS = testc$(EXEEXT) testp$(EXEEXT) testcu$(EXEEXT)\ncheck_PROGRAMS = testc$(EXEEXT) testp$(EXEEXT) testcu$(EXEEXT)\nsubdir = .\nDIST_COMMON = README $(am__configure_deps) $(include_HEADERS) \\\n\t$(srcdir)/Makefile.am $(srcdir)/Makefile.in \\\n\t$(srcdir)/config.h.in $(srcdir)/onig-config.in \\\n\t$(top_srcdir)/configure AUTHORS COPYING INSTALL compile \\\n\tconfig.guess config.sub depcomp install-sh ltmain.sh missing\nACLOCAL_M4 = $(top_srcdir)/aclocal.m4\nam__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \\\n\t$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \\\n\t$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \\\n\t$(top_srcdir)/configure.in\nam__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \\\n\t$(ACLOCAL_M4)\nam__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \\\n configure.lineno config.status.lineno\nmkinstalldirs = $(install_sh) -d\nCONFIG_HEADER = config.h\nCONFIG_CLEAN_FILES = onig-config\nCONFIG_CLEAN_VPATH_FILES =\nam__vpath_adj_setup = srcdirstrip=`echo \"$(srcdir)\" | sed 's|.|.|g'`;\nam__vpath_adj = case $$p in \\\n    $(srcdir)/*) f=`echo \"$$p\" | sed \"s|^$$srcdirstrip/||\"`;; \\\n    *) f=$$p;; \\\n  esac;\nam__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;\nam__install_max = 40\nam__nobase_strip_setup = \\\n  srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*|]/\\\\\\\\&/g'`\nam__nobase_strip = \\\n  for p in $$list; do echo \"$$p\"; done | sed -e \"s|$$srcdirstrip/||\"\nam__nobase_list = $(am__nobase_strip_setup); \\\n  for p in $$list; do echo \"$$p $$p\"; done | \\\n  sed \"s| $$srcdirstrip/| |;\"' / .*\\//!s/ .*/ ./; s,\\( .*\\)/[^/]*$$,\\1,' | \\\n  $(AWK) 'BEGIN { files[\".\"] = \"\" } { files[$$2] = files[$$2] \" \" $$1; \\\n    if (++n[$$2] == $(am__install_max)) \\\n      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = \"\" } } \\\n    END { for (dir in files) print dir, files[dir] }'\nam__base_list = \\\n  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\\n/ /g' | \\\n  sed '$$!N;$$!N;$$!N;$$!N;s/\\n/ /g'\nam__installdirs = \"$(DESTDIR)$(libdir)\" \"$(DESTDIR)$(bindir)\" \\\n\t\"$(DESTDIR)$(pkgconfigdir)\" \"$(DESTDIR)$(includedir)\"\nLTLIBRARIES = $(lib_LTLIBRARIES)\nlibonig_la_LIBADD =\nam_libonig_la_OBJECTS = regerror.lo regparse.lo regext.lo regcomp.lo \\\n\tregexec.lo reggnu.lo regenc.lo regsyntax.lo regtrav.lo \\\n\tregversion.lo st.lo regposix.lo regposerr.lo unicode.lo \\\n\tascii.lo utf8.lo utf16_be.lo utf16_le.lo utf32_be.lo \\\n\tutf32_le.lo euc_jp.lo sjis.lo cp932.lo iso8859_1.lo \\\n\tiso8859_2.lo iso8859_3.lo iso8859_4.lo iso8859_5.lo \\\n\tiso8859_6.lo iso8859_7.lo iso8859_8.lo iso8859_9.lo \\\n\tiso8859_10.lo iso8859_11.lo iso8859_13.lo iso8859_14.lo \\\n\tiso8859_15.lo iso8859_16.lo euc_tw.lo euc_kr.lo big5.lo \\\n\tgb18030.lo koi8_r.lo cp1251.lo\nlibonig_la_OBJECTS = $(am_libonig_la_OBJECTS)\nlibonig_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \\\n\t$(libonig_la_LDFLAGS) $(LDFLAGS) -o $@\nam_testc_OBJECTS = testc.$(OBJEXT)\ntestc_OBJECTS = $(am_testc_OBJECTS)\ntestc_DEPENDENCIES = libonig.la\nam_testcu_OBJECTS = testu.$(OBJEXT)\ntestcu_OBJECTS = $(am_testcu_OBJECTS)\ntestcu_DEPENDENCIES = libonig.la\nam_testp_OBJECTS = testp-testc.$(OBJEXT)\ntestp_OBJECTS = $(am_testp_OBJECTS)\ntestp_DEPENDENCIES = libonig.la\ntestp_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \\\n\t--mode=link $(CCLD) $(testp_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \\\n\t$(LDFLAGS) -o $@\nSCRIPTS = $(bin_SCRIPTS)\nDEFAULT_INCLUDES = -I.@am__isrc@\ndepcomp = $(SHELL) $(top_srcdir)/depcomp\nam__depfiles_maybe = depfiles\nam__mv = mv -f\nCOMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \\\n\t$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)\nLTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \\\n\t--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \\\n\t$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)\nCCLD = $(CC)\nLINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \\\n\t--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \\\n\t$(LDFLAGS) -o $@\nSOURCES = $(libonig_la_SOURCES) $(testc_SOURCES) $(testcu_SOURCES) \\\n\t$(testp_SOURCES)\nDIST_SOURCES = $(libonig_la_SOURCES) $(testc_SOURCES) \\\n\t$(testcu_SOURCES) $(testp_SOURCES)\nRECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \\\n\thtml-recursive info-recursive install-data-recursive \\\n\tinstall-dvi-recursive install-exec-recursive \\\n\tinstall-html-recursive install-info-recursive \\\n\tinstall-pdf-recursive install-ps-recursive install-recursive \\\n\tinstallcheck-recursive installdirs-recursive pdf-recursive \\\n\tps-recursive uninstall-recursive\nDATA = $(pkgconfig_DATA)\nHEADERS = $(include_HEADERS)\nRECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive\t\\\n  distclean-recursive maintainer-clean-recursive\nAM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \\\n\t$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \\\n\tdistdir dist dist-all distcheck\nETAGS = etags\nCTAGS = ctags\nam__tty_colors = \\\nred=; grn=; lgn=; blu=; std=\nDIST_SUBDIRS = $(SUBDIRS)\nDISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)\ndistdir = $(PACKAGE)-$(VERSION)\ntop_distdir = $(distdir)\nam__remove_distdir = \\\n  { test ! -d \"$(distdir)\" \\\n    || { find \"$(distdir)\" -type d ! -perm -200 -exec chmod u+w {} ';' \\\n         && rm -fr \"$(distdir)\"; }; }\nam__relativize = \\\n  dir0=`pwd`; \\\n  sed_first='s,^\\([^/]*\\)/.*$$,\\1,'; \\\n  sed_rest='s,^[^/]*/*,,'; \\\n  sed_last='s,^.*/\\([^/]*\\)$$,\\1,'; \\\n  sed_butlast='s,/*[^/]*$$,,'; \\\n  while test -n \"$$dir1\"; do \\\n    first=`echo \"$$dir1\" | sed -e \"$$sed_first\"`; \\\n    if test \"$$first\" != \".\"; then \\\n      if test \"$$first\" = \"..\"; then \\\n        dir2=`echo \"$$dir0\" | sed -e \"$$sed_last\"`/\"$$dir2\"; \\\n        dir0=`echo \"$$dir0\" | sed -e \"$$sed_butlast\"`; \\\n      else \\\n        first2=`echo \"$$dir2\" | sed -e \"$$sed_first\"`; \\\n        if test \"$$first2\" = \"$$first\"; then \\\n          dir2=`echo \"$$dir2\" | sed -e \"$$sed_rest\"`; \\\n        else \\\n          dir2=\"../$$dir2\"; \\\n        fi; \\\n        dir0=\"$$dir0\"/\"$$first\"; \\\n      fi; \\\n    fi; \\\n    dir1=`echo \"$$dir1\" | sed -e \"$$sed_rest\"`; \\\n  done; \\\n  reldir=\"$$dir2\"\nDIST_ARCHIVES = $(distdir).tar.gz\nGZIP_ENV = --best\ndistuninstallcheck_listfiles = find . -type f -print\ndistcleancheck_listfiles = find . -type f -print\nACLOCAL = @ACLOCAL@\nALLOCA = @ALLOCA@\nAMTAR = @AMTAR@\nAR = @AR@\nAUTOCONF = @AUTOCONF@\nAUTOHEADER = @AUTOHEADER@\nAUTOMAKE = @AUTOMAKE@\nAWK = @AWK@\nCC = @CC@\nCCDEPMODE = @CCDEPMODE@\nCFLAGS = @CFLAGS@\nCPP = @CPP@\nCPPFLAGS = @CPPFLAGS@\nCYGPATH_W = @CYGPATH_W@\nDEFS = @DEFS@\nDEPDIR = @DEPDIR@\nDSYMUTIL = @DSYMUTIL@\nDUMPBIN = @DUMPBIN@\nECHO_C = @ECHO_C@\nECHO_N = @ECHO_N@\nECHO_T = @ECHO_T@\nEGREP = @EGREP@\nEXEEXT = @EXEEXT@\nFGREP = @FGREP@\nGREP = @GREP@\nINSTALL = @INSTALL@\nINSTALL_DATA = @INSTALL_DATA@\nINSTALL_PROGRAM = @INSTALL_PROGRAM@\nINSTALL_SCRIPT = @INSTALL_SCRIPT@\nINSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@\nLD = @LD@\nLDFLAGS = @LDFLAGS@\nLIBOBJS = @LIBOBJS@\nLIBS = @LIBS@\nLIBTOOL = @LIBTOOL@\nLIPO = @LIPO@\nLN_S = @LN_S@\nLTLIBOBJS = @LTLIBOBJS@\nLTVERSION = @LTVERSION@\nMAKEINFO = @MAKEINFO@\nMKDIR_P = @MKDIR_P@\nNM = @NM@\nNMEDIT = @NMEDIT@\nOBJDUMP = @OBJDUMP@\nOBJEXT = @OBJEXT@\nOTOOL = @OTOOL@\nOTOOL64 = @OTOOL64@\nPACKAGE = @PACKAGE@\nPACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@\nPACKAGE_NAME = @PACKAGE_NAME@\nPACKAGE_STRING = @PACKAGE_STRING@\nPACKAGE_TARNAME = @PACKAGE_TARNAME@\nPACKAGE_URL = @PACKAGE_URL@\nPACKAGE_VERSION = @PACKAGE_VERSION@\nPATH_SEPARATOR = @PATH_SEPARATOR@\nRANLIB = @RANLIB@\nRUBYDIR = @RUBYDIR@\nSED = @SED@\nSET_MAKE = @SET_MAKE@\nSHELL = @SHELL@\nSTATISTICS = @STATISTICS@\nSTRIP = @STRIP@\nVERSION = @VERSION@\nabs_builddir = @abs_builddir@\nabs_srcdir = @abs_srcdir@\nabs_top_builddir = @abs_top_builddir@\nabs_top_srcdir = @abs_top_srcdir@\nac_ct_CC = @ac_ct_CC@\nac_ct_DUMPBIN = @ac_ct_DUMPBIN@\nam__include = @am__include@\nam__leading_dot = @am__leading_dot@\nam__quote = @am__quote@\nam__tar = @am__tar@\nam__untar = @am__untar@\nbindir = @bindir@\nbuild = @build@\nbuild_alias = @build_alias@\nbuild_cpu = @build_cpu@\nbuild_os = @build_os@\nbuild_vendor = @build_vendor@\nbuilddir = @builddir@\ndatadir = @datadir@\ndatarootdir = @datarootdir@\ndocdir = @docdir@\ndvidir = @dvidir@\nexec_prefix = @exec_prefix@\nhost = @host@\nhost_alias = @host_alias@\nhost_cpu = @host_cpu@\nhost_os = @host_os@\nhost_vendor = @host_vendor@\nhtmldir = @htmldir@\nincludedir = @includedir@\ninfodir = @infodir@\ninstall_sh = @install_sh@\nlibdir = @libdir@\nlibexecdir = @libexecdir@\nlocaledir = @localedir@\nlocalstatedir = @localstatedir@\nlt_ECHO = @lt_ECHO@\nmandir = @mandir@\nmkdir_p = @mkdir_p@\noldincludedir = @oldincludedir@\npdfdir = @pdfdir@\nprefix = @prefix@\nprogram_transform_name = @program_transform_name@\npsdir = @psdir@\nsbindir = @sbindir@\nsharedstatedir = @sharedstatedir@\nsrcdir = @srcdir@\nsysconfdir = @sysconfdir@\ntarget_alias = @target_alias@\ntop_build_prefix = @top_build_prefix@\ntop_builddir = @top_builddir@\ntop_srcdir = @top_srcdir@\nencdir = $(top_srcdir)/enc\nsampledir = $(top_srcdir)/sample\nlibname = libonig.la\nACLOCAL_AMFLAGS = -I m4\n#AM_CFLAGS = -DNOT_RUBY\nAM_CFLAGS = \nINCLUDES = -I$(top_srcdir) -I$(includedir)\nSUBDIRS = . sample\ninclude_HEADERS = oniguruma.h oniggnu.h onigposix.h\nlib_LTLIBRARIES = $(libname)\nlibonig_la_SOURCES = regint.h regparse.h regenc.h st.h \\\n\tregerror.c regparse.c regext.c regcomp.c regexec.c reggnu.c \\\n\tregenc.c regsyntax.c regtrav.c regversion.c st.c \\\n\tregposix.c regposerr.c \\\n\t$(encdir)/unicode.c $(encdir)/ascii.c $(encdir)/utf8.c \\\n\t$(encdir)/utf16_be.c $(encdir)/utf16_le.c \\\n\t$(encdir)/utf32_be.c $(encdir)/utf32_le.c \\\n\t$(encdir)/unicode/casefold.h $(encdir)/unicode/name2ctype.h \\\n\t$(encdir)/euc_jp.c $(encdir)/sjis.c $(encdir)/cp932.c \\\n\t$(encdir)/iso8859_1.c \\\n\t$(encdir)/iso8859_2.c  $(encdir)/iso8859_3.c \\\n\t$(encdir)/iso8859_4.c  $(encdir)/iso8859_5.c \\\n\t$(encdir)/iso8859_6.c  $(encdir)/iso8859_7.c \\\n\t$(encdir)/iso8859_8.c  $(encdir)/iso8859_9.c \\\n\t$(encdir)/iso8859_10.c $(encdir)/iso8859_11.c \\\n\t$(encdir)/iso8859_13.c $(encdir)/iso8859_14.c \\\n\t$(encdir)/iso8859_15.c $(encdir)/iso8859_16.c \\\n\t$(encdir)/euc_tw.c $(encdir)/euc_kr.c $(encdir)/big5.c \\\n\t$(encdir)/gb18030.c $(encdir)/koi8_r.c $(encdir)/cp1251.c\n\nlibonig_la_LDFLAGS = -version-info $(LTVERSION)\nEXTRA_DIST = .gitignore oniguruma.pc.in HISTORY README.ja index.html \\\n\tindex_ja.html doc/API doc/API.ja doc/RE doc/RE.ja doc/FAQ doc/FAQ.ja \\\n\tdoc/UnicodeProps.txt \\\n\ttool/.gitignore tool/CaseFolding.py tool/convert-name2ctype.sh \\\n\ttool/enc-unicode.rb \\\n\twin32/Makefile win32/config.h win32/testc.c \\\n\twin32/makedef.py win32/onig.rc \\\n\t$(encdir)/koi8.c $(encdir)/mktable.c \\\n\t$(sampledir)/encode.c $(sampledir)/listcap.c $(sampledir)/names.c \\\n\t$(sampledir)/posix.c $(sampledir)/simple.c $(sampledir)/sql.c \\\n\t$(sampledir)/syntax.c $(sampledir)/crnl.c \\\n\ttest.rb testconv.rb testconvu.rb \\\n\tonig.py testpy.py\n\nbin_SCRIPTS = onig-config\ndo_subst = sed                                          \\\n      -e 's,[@]datadir[@],$(datadir),g'                 \\\n      -e 's,[@]datarootdir[@],$(datarootdir),g'         \\\n      -e 's,[@]PACKAGE_VERSION[@],$(PACKAGE_VERSION),g' \\\n      -e 's,[@]prefix[@],$(prefix),g'                   \\\n      -e 's,[@]exec_prefix[@],$(exec_prefix),g'         \\\n      -e 's,[@]libdir[@],$(libdir),g'                   \\\n      -e 's,[@]includedir[@],$(includedir),g'\n\npkgconfigdir = $(libdir)/pkgconfig\npkgconfig_DATA = oniguruma.pc\ntestc_SOURCES = testc.c\ntestc_LDADD = libonig.la\ntestp_SOURCES = testc.c\ntestp_LDADD = libonig.la\ntestp_CFLAGS = -DPOSIX_TEST\ntestcu_SOURCES = testu.c\ntestcu_LDADD = libonig.la\nall: config.h\n\t$(MAKE) $(AM_MAKEFLAGS) all-recursive\n\n.SUFFIXES:\n.SUFFIXES: .c .lo .o .obj\nam--refresh:\n\t@:\n$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)\n\t@for dep in $?; do \\\n\t  case '$(am__configure_deps)' in \\\n\t    *$$dep*) \\\n\t      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \\\n\t      $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \\\n\t\t&& exit 0; \\\n\t      exit 1;; \\\n\t  esac; \\\n\tdone; \\\n\techo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \\\n\t$(am__cd) $(top_srcdir) && \\\n\t  $(AUTOMAKE) --foreign Makefile\n.PRECIOUS: Makefile\nMakefile: $(srcdir)/Makefile.in $(top_builddir)/config.status\n\t@case '$?' in \\\n\t  *config.status*) \\\n\t    echo ' $(SHELL) ./config.status'; \\\n\t    $(SHELL) ./config.status;; \\\n\t  *) \\\n\t    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \\\n\t    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \\\n\tesac;\n\n$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)\n\t$(SHELL) ./config.status --recheck\n\n$(top_srcdir)/configure:  $(am__configure_deps)\n\t$(am__cd) $(srcdir) && $(AUTOCONF)\n$(ACLOCAL_M4):  $(am__aclocal_m4_deps)\n\t$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)\n$(am__aclocal_m4_deps):\n\nconfig.h: stamp-h1\n\t@if test ! -f $@; then \\\n\t  rm -f stamp-h1; \\\n\t  $(MAKE) $(AM_MAKEFLAGS) stamp-h1; \\\n\telse :; fi\n\nstamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status\n\t@rm -f stamp-h1\n\tcd $(top_builddir) && $(SHELL) ./config.status config.h\n$(srcdir)/config.h.in:  $(am__configure_deps) \n\t($(am__cd) $(top_srcdir) && $(AUTOHEADER))\n\trm -f stamp-h1\n\ttouch $@\n\ndistclean-hdr:\n\t-rm -f config.h stamp-h1\nonig-config: $(top_builddir)/config.status $(srcdir)/onig-config.in\n\tcd $(top_builddir) && $(SHELL) ./config.status $@\ninstall-libLTLIBRARIES: $(lib_LTLIBRARIES)\n\t@$(NORMAL_INSTALL)\n\ttest -z \"$(libdir)\" || $(MKDIR_P) \"$(DESTDIR)$(libdir)\"\n\t@list='$(lib_LTLIBRARIES)'; test -n \"$(libdir)\" || list=; \\\n\tlist2=; for p in $$list; do \\\n\t  if test -f $$p; then \\\n\t    list2=\"$$list2 $$p\"; \\\n\t  else :; fi; \\\n\tdone; \\\n\ttest -z \"$$list2\" || { \\\n\t  echo \" $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'\"; \\\n\t  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 \"$(DESTDIR)$(libdir)\"; \\\n\t}\n\nuninstall-libLTLIBRARIES:\n\t@$(NORMAL_UNINSTALL)\n\t@list='$(lib_LTLIBRARIES)'; test -n \"$(libdir)\" || list=; \\\n\tfor p in $$list; do \\\n\t  $(am__strip_dir) \\\n\t  echo \" $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'\"; \\\n\t  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f \"$(DESTDIR)$(libdir)/$$f\"; \\\n\tdone\n\nclean-libLTLIBRARIES:\n\t-test -z \"$(lib_LTLIBRARIES)\" || rm -f $(lib_LTLIBRARIES)\n\t@list='$(lib_LTLIBRARIES)'; for p in $$list; do \\\n\t  dir=\"`echo $$p | sed -e 's|/[^/]*$$||'`\"; \\\n\t  test \"$$dir\" != \"$$p\" || dir=.; \\\n\t  echo \"rm -f \\\"$${dir}/so_locations\\\"\"; \\\n\t  rm -f \"$${dir}/so_locations\"; \\\n\tdone\nlibonig.la: $(libonig_la_OBJECTS) $(libonig_la_DEPENDENCIES) \n\t$(libonig_la_LINK) -rpath $(libdir) $(libonig_la_OBJECTS) $(libonig_la_LIBADD) $(LIBS)\n\nclean-checkPROGRAMS:\n\t@list='$(check_PROGRAMS)'; test -n \"$$list\" || exit 0; \\\n\techo \" rm -f\" $$list; \\\n\trm -f $$list || exit $$?; \\\n\ttest -n \"$(EXEEXT)\" || exit 0; \\\n\tlist=`for p in $$list; do echo \"$$p\"; done | sed 's/$(EXEEXT)$$//'`; \\\n\techo \" rm -f\" $$list; \\\n\trm -f $$list\ntestc$(EXEEXT): $(testc_OBJECTS) $(testc_DEPENDENCIES) \n\t@rm -f testc$(EXEEXT)\n\t$(LINK) $(testc_OBJECTS) $(testc_LDADD) $(LIBS)\ntestcu$(EXEEXT): $(testcu_OBJECTS) $(testcu_DEPENDENCIES) \n\t@rm -f testcu$(EXEEXT)\n\t$(LINK) $(testcu_OBJECTS) $(testcu_LDADD) $(LIBS)\ntestp$(EXEEXT): $(testp_OBJECTS) $(testp_DEPENDENCIES) \n\t@rm -f testp$(EXEEXT)\n\t$(testp_LINK) $(testp_OBJECTS) $(testp_LDADD) $(LIBS)\ninstall-binSCRIPTS: $(bin_SCRIPTS)\n\t@$(NORMAL_INSTALL)\n\ttest -z \"$(bindir)\" || $(MKDIR_P) \"$(DESTDIR)$(bindir)\"\n\t@list='$(bin_SCRIPTS)'; test -n \"$(bindir)\" || list=; \\\n\tfor p in $$list; do \\\n\t  if test -f \"$$p\"; then d=; else d=\"$(srcdir)/\"; fi; \\\n\t  if test -f \"$$d$$p\"; then echo \"$$d$$p\"; echo \"$$p\"; else :; fi; \\\n\tdone | \\\n\tsed -e 'p;s,.*/,,;n' \\\n\t    -e 'h;s|.*|.|' \\\n\t    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\\n, ,g' | \\\n\t$(AWK) 'BEGIN { files[\".\"] = \"\"; dirs[\".\"] = 1; } \\\n\t  { d=$$3; if (dirs[d] != 1) { print \"d\", d; dirs[d] = 1 } \\\n\t    if ($$2 == $$4) { files[d] = files[d] \" \" $$1; \\\n\t      if (++n[d] == $(am__install_max)) { \\\n\t\tprint \"f\", d, files[d]; n[d] = 0; files[d] = \"\" } } \\\n\t    else { print \"f\", d \"/\" $$4, $$1 } } \\\n\t  END { for (d in files) print \"f\", d, files[d] }' | \\\n\twhile read type dir files; do \\\n\t     if test \"$$dir\" = .; then dir=; else dir=/$$dir; fi; \\\n\t     test -z \"$$files\" || { \\\n\t       echo \" $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'\"; \\\n\t       $(INSTALL_SCRIPT) $$files \"$(DESTDIR)$(bindir)$$dir\" || exit $$?; \\\n\t     } \\\n\t; done\n\nuninstall-binSCRIPTS:\n\t@$(NORMAL_UNINSTALL)\n\t@list='$(bin_SCRIPTS)'; test -n \"$(bindir)\" || exit 0; \\\n\tfiles=`for p in $$list; do echo \"$$p\"; done | \\\n\t       sed -e 's,.*/,,;$(transform)'`; \\\n\ttest -n \"$$list\" || exit 0; \\\n\techo \" ( cd '$(DESTDIR)$(bindir)' && rm -f\" $$files \")\"; \\\n\tcd \"$(DESTDIR)$(bindir)\" && rm -f $$files\n\nmostlyclean-compile:\n\t-rm -f *.$(OBJEXT)\n\ndistclean-compile:\n\t-rm -f *.tab.c\n\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ascii.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/big5.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cp1251.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cp932.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/euc_jp.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/euc_kr.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/euc_tw.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gb18030.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iso8859_1.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iso8859_10.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iso8859_11.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iso8859_13.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iso8859_14.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iso8859_15.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iso8859_16.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iso8859_2.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iso8859_3.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iso8859_4.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iso8859_5.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iso8859_6.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iso8859_7.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iso8859_8.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iso8859_9.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/koi8_r.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regcomp.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regenc.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regerror.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regexec.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regext.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reggnu.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regparse.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regposerr.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regposix.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regsyntax.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regtrav.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/regversion.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sjis.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/st.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testc.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testp-testc.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/testu.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unicode.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utf16_be.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utf16_le.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utf32_be.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utf32_le.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utf8.Plo@am__quote@\n\n.c.o:\n@am__fastdepCC_TRUE@\t$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(COMPILE) -c $<\n\n.c.obj:\n@am__fastdepCC_TRUE@\t$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(COMPILE) -c `$(CYGPATH_W) '$<'`\n\n.c.lo:\n@am__fastdepCC_TRUE@\t$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$<' object='$@' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(LTCOMPILE) -c -o $@ $<\n\nunicode.lo: $(encdir)/unicode.c\n@am__fastdepCC_TRUE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT unicode.lo -MD -MP -MF $(DEPDIR)/unicode.Tpo -c -o unicode.lo `test -f '$(encdir)/unicode.c' || echo '$(srcdir)/'`$(encdir)/unicode.c\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/unicode.Tpo $(DEPDIR)/unicode.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$(encdir)/unicode.c' object='unicode.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o unicode.lo `test -f '$(encdir)/unicode.c' || echo '$(srcdir)/'`$(encdir)/unicode.c\n\nascii.lo: $(encdir)/ascii.c\n@am__fastdepCC_TRUE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT ascii.lo -MD -MP -MF $(DEPDIR)/ascii.Tpo -c -o ascii.lo `test -f '$(encdir)/ascii.c' || echo '$(srcdir)/'`$(encdir)/ascii.c\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/ascii.Tpo $(DEPDIR)/ascii.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$(encdir)/ascii.c' object='ascii.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o ascii.lo `test -f '$(encdir)/ascii.c' || echo '$(srcdir)/'`$(encdir)/ascii.c\n\nutf8.lo: $(encdir)/utf8.c\n@am__fastdepCC_TRUE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT utf8.lo -MD -MP -MF $(DEPDIR)/utf8.Tpo -c -o utf8.lo `test -f '$(encdir)/utf8.c' || echo '$(srcdir)/'`$(encdir)/utf8.c\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/utf8.Tpo $(DEPDIR)/utf8.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$(encdir)/utf8.c' object='utf8.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o utf8.lo `test -f '$(encdir)/utf8.c' || echo '$(srcdir)/'`$(encdir)/utf8.c\n\nutf16_be.lo: $(encdir)/utf16_be.c\n@am__fastdepCC_TRUE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT utf16_be.lo -MD -MP -MF $(DEPDIR)/utf16_be.Tpo -c -o utf16_be.lo `test -f '$(encdir)/utf16_be.c' || echo '$(srcdir)/'`$(encdir)/utf16_be.c\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/utf16_be.Tpo $(DEPDIR)/utf16_be.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$(encdir)/utf16_be.c' object='utf16_be.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o utf16_be.lo `test -f '$(encdir)/utf16_be.c' || echo '$(srcdir)/'`$(encdir)/utf16_be.c\n\nutf16_le.lo: $(encdir)/utf16_le.c\n@am__fastdepCC_TRUE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT utf16_le.lo -MD -MP -MF $(DEPDIR)/utf16_le.Tpo -c -o utf16_le.lo `test -f '$(encdir)/utf16_le.c' || echo '$(srcdir)/'`$(encdir)/utf16_le.c\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/utf16_le.Tpo $(DEPDIR)/utf16_le.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$(encdir)/utf16_le.c' object='utf16_le.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o utf16_le.lo `test -f '$(encdir)/utf16_le.c' || echo '$(srcdir)/'`$(encdir)/utf16_le.c\n\nutf32_be.lo: $(encdir)/utf32_be.c\n@am__fastdepCC_TRUE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT utf32_be.lo -MD -MP -MF $(DEPDIR)/utf32_be.Tpo -c -o utf32_be.lo `test -f '$(encdir)/utf32_be.c' || echo '$(srcdir)/'`$(encdir)/utf32_be.c\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/utf32_be.Tpo $(DEPDIR)/utf32_be.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$(encdir)/utf32_be.c' object='utf32_be.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o utf32_be.lo `test -f '$(encdir)/utf32_be.c' || echo '$(srcdir)/'`$(encdir)/utf32_be.c\n\nutf32_le.lo: $(encdir)/utf32_le.c\n@am__fastdepCC_TRUE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT utf32_le.lo -MD -MP -MF $(DEPDIR)/utf32_le.Tpo -c -o utf32_le.lo `test -f '$(encdir)/utf32_le.c' || echo '$(srcdir)/'`$(encdir)/utf32_le.c\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/utf32_le.Tpo $(DEPDIR)/utf32_le.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$(encdir)/utf32_le.c' object='utf32_le.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o utf32_le.lo `test -f '$(encdir)/utf32_le.c' || echo '$(srcdir)/'`$(encdir)/utf32_le.c\n\neuc_jp.lo: $(encdir)/euc_jp.c\n@am__fastdepCC_TRUE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT euc_jp.lo -MD -MP -MF $(DEPDIR)/euc_jp.Tpo -c -o euc_jp.lo `test -f '$(encdir)/euc_jp.c' || echo '$(srcdir)/'`$(encdir)/euc_jp.c\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/euc_jp.Tpo $(DEPDIR)/euc_jp.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$(encdir)/euc_jp.c' object='euc_jp.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o euc_jp.lo `test -f '$(encdir)/euc_jp.c' || echo '$(srcdir)/'`$(encdir)/euc_jp.c\n\nsjis.lo: $(encdir)/sjis.c\n@am__fastdepCC_TRUE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sjis.lo -MD -MP -MF $(DEPDIR)/sjis.Tpo -c -o sjis.lo `test -f '$(encdir)/sjis.c' || echo '$(srcdir)/'`$(encdir)/sjis.c\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/sjis.Tpo $(DEPDIR)/sjis.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$(encdir)/sjis.c' object='sjis.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sjis.lo `test -f '$(encdir)/sjis.c' || echo '$(srcdir)/'`$(encdir)/sjis.c\n\ncp932.lo: $(encdir)/cp932.c\n@am__fastdepCC_TRUE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cp932.lo -MD -MP -MF $(DEPDIR)/cp932.Tpo -c -o cp932.lo `test -f '$(encdir)/cp932.c' || echo '$(srcdir)/'`$(encdir)/cp932.c\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/cp932.Tpo $(DEPDIR)/cp932.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$(encdir)/cp932.c' object='cp932.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cp932.lo `test -f '$(encdir)/cp932.c' || echo '$(srcdir)/'`$(encdir)/cp932.c\n\niso8859_1.lo: $(encdir)/iso8859_1.c\n@am__fastdepCC_TRUE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT iso8859_1.lo -MD -MP -MF $(DEPDIR)/iso8859_1.Tpo -c -o iso8859_1.lo `test -f '$(encdir)/iso8859_1.c' || echo '$(srcdir)/'`$(encdir)/iso8859_1.c\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/iso8859_1.Tpo $(DEPDIR)/iso8859_1.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$(encdir)/iso8859_1.c' object='iso8859_1.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o iso8859_1.lo `test -f '$(encdir)/iso8859_1.c' || echo '$(srcdir)/'`$(encdir)/iso8859_1.c\n\niso8859_2.lo: $(encdir)/iso8859_2.c\n@am__fastdepCC_TRUE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT iso8859_2.lo -MD -MP -MF $(DEPDIR)/iso8859_2.Tpo -c -o iso8859_2.lo `test -f '$(encdir)/iso8859_2.c' || echo '$(srcdir)/'`$(encdir)/iso8859_2.c\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/iso8859_2.Tpo $(DEPDIR)/iso8859_2.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$(encdir)/iso8859_2.c' object='iso8859_2.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o iso8859_2.lo `test -f '$(encdir)/iso8859_2.c' || echo '$(srcdir)/'`$(encdir)/iso8859_2.c\n\niso8859_3.lo: $(encdir)/iso8859_3.c\n@am__fastdepCC_TRUE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT iso8859_3.lo -MD -MP -MF $(DEPDIR)/iso8859_3.Tpo -c -o iso8859_3.lo `test -f '$(encdir)/iso8859_3.c' || echo '$(srcdir)/'`$(encdir)/iso8859_3.c\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/iso8859_3.Tpo $(DEPDIR)/iso8859_3.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$(encdir)/iso8859_3.c' object='iso8859_3.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o iso8859_3.lo `test -f '$(encdir)/iso8859_3.c' || echo '$(srcdir)/'`$(encdir)/iso8859_3.c\n\niso8859_4.lo: $(encdir)/iso8859_4.c\n@am__fastdepCC_TRUE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT iso8859_4.lo -MD -MP -MF $(DEPDIR)/iso8859_4.Tpo -c -o iso8859_4.lo `test -f '$(encdir)/iso8859_4.c' || echo '$(srcdir)/'`$(encdir)/iso8859_4.c\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/iso8859_4.Tpo $(DEPDIR)/iso8859_4.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$(encdir)/iso8859_4.c' object='iso8859_4.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o iso8859_4.lo `test -f '$(encdir)/iso8859_4.c' || echo '$(srcdir)/'`$(encdir)/iso8859_4.c\n\niso8859_5.lo: $(encdir)/iso8859_5.c\n@am__fastdepCC_TRUE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT iso8859_5.lo -MD -MP -MF $(DEPDIR)/iso8859_5.Tpo -c -o iso8859_5.lo `test -f '$(encdir)/iso8859_5.c' || echo '$(srcdir)/'`$(encdir)/iso8859_5.c\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/iso8859_5.Tpo $(DEPDIR)/iso8859_5.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$(encdir)/iso8859_5.c' object='iso8859_5.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o iso8859_5.lo `test -f '$(encdir)/iso8859_5.c' || echo '$(srcdir)/'`$(encdir)/iso8859_5.c\n\niso8859_6.lo: $(encdir)/iso8859_6.c\n@am__fastdepCC_TRUE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT iso8859_6.lo -MD -MP -MF $(DEPDIR)/iso8859_6.Tpo -c -o iso8859_6.lo `test -f '$(encdir)/iso8859_6.c' || echo '$(srcdir)/'`$(encdir)/iso8859_6.c\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/iso8859_6.Tpo $(DEPDIR)/iso8859_6.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$(encdir)/iso8859_6.c' object='iso8859_6.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o iso8859_6.lo `test -f '$(encdir)/iso8859_6.c' || echo '$(srcdir)/'`$(encdir)/iso8859_6.c\n\niso8859_7.lo: $(encdir)/iso8859_7.c\n@am__fastdepCC_TRUE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT iso8859_7.lo -MD -MP -MF $(DEPDIR)/iso8859_7.Tpo -c -o iso8859_7.lo `test -f '$(encdir)/iso8859_7.c' || echo '$(srcdir)/'`$(encdir)/iso8859_7.c\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/iso8859_7.Tpo $(DEPDIR)/iso8859_7.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$(encdir)/iso8859_7.c' object='iso8859_7.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o iso8859_7.lo `test -f '$(encdir)/iso8859_7.c' || echo '$(srcdir)/'`$(encdir)/iso8859_7.c\n\niso8859_8.lo: $(encdir)/iso8859_8.c\n@am__fastdepCC_TRUE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT iso8859_8.lo -MD -MP -MF $(DEPDIR)/iso8859_8.Tpo -c -o iso8859_8.lo `test -f '$(encdir)/iso8859_8.c' || echo '$(srcdir)/'`$(encdir)/iso8859_8.c\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/iso8859_8.Tpo $(DEPDIR)/iso8859_8.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$(encdir)/iso8859_8.c' object='iso8859_8.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o iso8859_8.lo `test -f '$(encdir)/iso8859_8.c' || echo '$(srcdir)/'`$(encdir)/iso8859_8.c\n\niso8859_9.lo: $(encdir)/iso8859_9.c\n@am__fastdepCC_TRUE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT iso8859_9.lo -MD -MP -MF $(DEPDIR)/iso8859_9.Tpo -c -o iso8859_9.lo `test -f '$(encdir)/iso8859_9.c' || echo '$(srcdir)/'`$(encdir)/iso8859_9.c\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/iso8859_9.Tpo $(DEPDIR)/iso8859_9.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$(encdir)/iso8859_9.c' object='iso8859_9.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o iso8859_9.lo `test -f '$(encdir)/iso8859_9.c' || echo '$(srcdir)/'`$(encdir)/iso8859_9.c\n\niso8859_10.lo: $(encdir)/iso8859_10.c\n@am__fastdepCC_TRUE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT iso8859_10.lo -MD -MP -MF $(DEPDIR)/iso8859_10.Tpo -c -o iso8859_10.lo `test -f '$(encdir)/iso8859_10.c' || echo '$(srcdir)/'`$(encdir)/iso8859_10.c\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/iso8859_10.Tpo $(DEPDIR)/iso8859_10.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$(encdir)/iso8859_10.c' object='iso8859_10.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o iso8859_10.lo `test -f '$(encdir)/iso8859_10.c' || echo '$(srcdir)/'`$(encdir)/iso8859_10.c\n\niso8859_11.lo: $(encdir)/iso8859_11.c\n@am__fastdepCC_TRUE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT iso8859_11.lo -MD -MP -MF $(DEPDIR)/iso8859_11.Tpo -c -o iso8859_11.lo `test -f '$(encdir)/iso8859_11.c' || echo '$(srcdir)/'`$(encdir)/iso8859_11.c\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/iso8859_11.Tpo $(DEPDIR)/iso8859_11.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$(encdir)/iso8859_11.c' object='iso8859_11.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o iso8859_11.lo `test -f '$(encdir)/iso8859_11.c' || echo '$(srcdir)/'`$(encdir)/iso8859_11.c\n\niso8859_13.lo: $(encdir)/iso8859_13.c\n@am__fastdepCC_TRUE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT iso8859_13.lo -MD -MP -MF $(DEPDIR)/iso8859_13.Tpo -c -o iso8859_13.lo `test -f '$(encdir)/iso8859_13.c' || echo '$(srcdir)/'`$(encdir)/iso8859_13.c\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/iso8859_13.Tpo $(DEPDIR)/iso8859_13.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$(encdir)/iso8859_13.c' object='iso8859_13.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o iso8859_13.lo `test -f '$(encdir)/iso8859_13.c' || echo '$(srcdir)/'`$(encdir)/iso8859_13.c\n\niso8859_14.lo: $(encdir)/iso8859_14.c\n@am__fastdepCC_TRUE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT iso8859_14.lo -MD -MP -MF $(DEPDIR)/iso8859_14.Tpo -c -o iso8859_14.lo `test -f '$(encdir)/iso8859_14.c' || echo '$(srcdir)/'`$(encdir)/iso8859_14.c\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/iso8859_14.Tpo $(DEPDIR)/iso8859_14.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$(encdir)/iso8859_14.c' object='iso8859_14.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o iso8859_14.lo `test -f '$(encdir)/iso8859_14.c' || echo '$(srcdir)/'`$(encdir)/iso8859_14.c\n\niso8859_15.lo: $(encdir)/iso8859_15.c\n@am__fastdepCC_TRUE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT iso8859_15.lo -MD -MP -MF $(DEPDIR)/iso8859_15.Tpo -c -o iso8859_15.lo `test -f '$(encdir)/iso8859_15.c' || echo '$(srcdir)/'`$(encdir)/iso8859_15.c\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/iso8859_15.Tpo $(DEPDIR)/iso8859_15.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$(encdir)/iso8859_15.c' object='iso8859_15.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o iso8859_15.lo `test -f '$(encdir)/iso8859_15.c' || echo '$(srcdir)/'`$(encdir)/iso8859_15.c\n\niso8859_16.lo: $(encdir)/iso8859_16.c\n@am__fastdepCC_TRUE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT iso8859_16.lo -MD -MP -MF $(DEPDIR)/iso8859_16.Tpo -c -o iso8859_16.lo `test -f '$(encdir)/iso8859_16.c' || echo '$(srcdir)/'`$(encdir)/iso8859_16.c\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/iso8859_16.Tpo $(DEPDIR)/iso8859_16.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$(encdir)/iso8859_16.c' object='iso8859_16.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o iso8859_16.lo `test -f '$(encdir)/iso8859_16.c' || echo '$(srcdir)/'`$(encdir)/iso8859_16.c\n\neuc_tw.lo: $(encdir)/euc_tw.c\n@am__fastdepCC_TRUE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT euc_tw.lo -MD -MP -MF $(DEPDIR)/euc_tw.Tpo -c -o euc_tw.lo `test -f '$(encdir)/euc_tw.c' || echo '$(srcdir)/'`$(encdir)/euc_tw.c\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/euc_tw.Tpo $(DEPDIR)/euc_tw.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$(encdir)/euc_tw.c' object='euc_tw.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o euc_tw.lo `test -f '$(encdir)/euc_tw.c' || echo '$(srcdir)/'`$(encdir)/euc_tw.c\n\neuc_kr.lo: $(encdir)/euc_kr.c\n@am__fastdepCC_TRUE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT euc_kr.lo -MD -MP -MF $(DEPDIR)/euc_kr.Tpo -c -o euc_kr.lo `test -f '$(encdir)/euc_kr.c' || echo '$(srcdir)/'`$(encdir)/euc_kr.c\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/euc_kr.Tpo $(DEPDIR)/euc_kr.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$(encdir)/euc_kr.c' object='euc_kr.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o euc_kr.lo `test -f '$(encdir)/euc_kr.c' || echo '$(srcdir)/'`$(encdir)/euc_kr.c\n\nbig5.lo: $(encdir)/big5.c\n@am__fastdepCC_TRUE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT big5.lo -MD -MP -MF $(DEPDIR)/big5.Tpo -c -o big5.lo `test -f '$(encdir)/big5.c' || echo '$(srcdir)/'`$(encdir)/big5.c\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/big5.Tpo $(DEPDIR)/big5.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$(encdir)/big5.c' object='big5.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o big5.lo `test -f '$(encdir)/big5.c' || echo '$(srcdir)/'`$(encdir)/big5.c\n\ngb18030.lo: $(encdir)/gb18030.c\n@am__fastdepCC_TRUE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT gb18030.lo -MD -MP -MF $(DEPDIR)/gb18030.Tpo -c -o gb18030.lo `test -f '$(encdir)/gb18030.c' || echo '$(srcdir)/'`$(encdir)/gb18030.c\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/gb18030.Tpo $(DEPDIR)/gb18030.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$(encdir)/gb18030.c' object='gb18030.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o gb18030.lo `test -f '$(encdir)/gb18030.c' || echo '$(srcdir)/'`$(encdir)/gb18030.c\n\nkoi8_r.lo: $(encdir)/koi8_r.c\n@am__fastdepCC_TRUE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT koi8_r.lo -MD -MP -MF $(DEPDIR)/koi8_r.Tpo -c -o koi8_r.lo `test -f '$(encdir)/koi8_r.c' || echo '$(srcdir)/'`$(encdir)/koi8_r.c\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/koi8_r.Tpo $(DEPDIR)/koi8_r.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$(encdir)/koi8_r.c' object='koi8_r.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o koi8_r.lo `test -f '$(encdir)/koi8_r.c' || echo '$(srcdir)/'`$(encdir)/koi8_r.c\n\ncp1251.lo: $(encdir)/cp1251.c\n@am__fastdepCC_TRUE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT cp1251.lo -MD -MP -MF $(DEPDIR)/cp1251.Tpo -c -o cp1251.lo `test -f '$(encdir)/cp1251.c' || echo '$(srcdir)/'`$(encdir)/cp1251.c\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/cp1251.Tpo $(DEPDIR)/cp1251.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$(encdir)/cp1251.c' object='cp1251.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(LIBTOOL)  --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o cp1251.lo `test -f '$(encdir)/cp1251.c' || echo '$(srcdir)/'`$(encdir)/cp1251.c\n\ntestp-testc.o: testc.c\n@am__fastdepCC_TRUE@\t$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(testp_CFLAGS) $(CFLAGS) -MT testp-testc.o -MD -MP -MF $(DEPDIR)/testp-testc.Tpo -c -o testp-testc.o `test -f 'testc.c' || echo '$(srcdir)/'`testc.c\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/testp-testc.Tpo $(DEPDIR)/testp-testc.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='testc.c' object='testp-testc.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(testp_CFLAGS) $(CFLAGS) -c -o testp-testc.o `test -f 'testc.c' || echo '$(srcdir)/'`testc.c\n\ntestp-testc.obj: testc.c\n@am__fastdepCC_TRUE@\t$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(testp_CFLAGS) $(CFLAGS) -MT testp-testc.obj -MD -MP -MF $(DEPDIR)/testp-testc.Tpo -c -o testp-testc.obj `if test -f 'testc.c'; then $(CYGPATH_W) 'testc.c'; else $(CYGPATH_W) '$(srcdir)/testc.c'; fi`\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/testp-testc.Tpo $(DEPDIR)/testp-testc.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='testc.c' object='testp-testc.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(testp_CFLAGS) $(CFLAGS) -c -o testp-testc.obj `if test -f 'testc.c'; then $(CYGPATH_W) 'testc.c'; else $(CYGPATH_W) '$(srcdir)/testc.c'; fi`\n\nmostlyclean-libtool:\n\t-rm -f *.lo\n\nclean-libtool:\n\t-rm -rf .libs _libs\n\ndistclean-libtool:\n\t-rm -f libtool config.lt\ninstall-pkgconfigDATA: $(pkgconfig_DATA)\n\t@$(NORMAL_INSTALL)\n\ttest -z \"$(pkgconfigdir)\" || $(MKDIR_P) \"$(DESTDIR)$(pkgconfigdir)\"\n\t@list='$(pkgconfig_DATA)'; test -n \"$(pkgconfigdir)\" || list=; \\\n\tfor p in $$list; do \\\n\t  if test -f \"$$p\"; then d=; else d=\"$(srcdir)/\"; fi; \\\n\t  echo \"$$d$$p\"; \\\n\tdone | $(am__base_list) | \\\n\twhile read files; do \\\n\t  echo \" $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfigdir)'\"; \\\n\t  $(INSTALL_DATA) $$files \"$(DESTDIR)$(pkgconfigdir)\" || exit $$?; \\\n\tdone\n\nuninstall-pkgconfigDATA:\n\t@$(NORMAL_UNINSTALL)\n\t@list='$(pkgconfig_DATA)'; test -n \"$(pkgconfigdir)\" || list=; \\\n\tfiles=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \\\n\ttest -n \"$$files\" || exit 0; \\\n\techo \" ( cd '$(DESTDIR)$(pkgconfigdir)' && rm -f\" $$files \")\"; \\\n\tcd \"$(DESTDIR)$(pkgconfigdir)\" && rm -f $$files\ninstall-includeHEADERS: $(include_HEADERS)\n\t@$(NORMAL_INSTALL)\n\ttest -z \"$(includedir)\" || $(MKDIR_P) \"$(DESTDIR)$(includedir)\"\n\t@list='$(include_HEADERS)'; test -n \"$(includedir)\" || list=; \\\n\tfor p in $$list; do \\\n\t  if test -f \"$$p\"; then d=; else d=\"$(srcdir)/\"; fi; \\\n\t  echo \"$$d$$p\"; \\\n\tdone | $(am__base_list) | \\\n\twhile read files; do \\\n\t  echo \" $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'\"; \\\n\t  $(INSTALL_HEADER) $$files \"$(DESTDIR)$(includedir)\" || exit $$?; \\\n\tdone\n\nuninstall-includeHEADERS:\n\t@$(NORMAL_UNINSTALL)\n\t@list='$(include_HEADERS)'; test -n \"$(includedir)\" || list=; \\\n\tfiles=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \\\n\ttest -n \"$$files\" || exit 0; \\\n\techo \" ( cd '$(DESTDIR)$(includedir)' && rm -f\" $$files \")\"; \\\n\tcd \"$(DESTDIR)$(includedir)\" && rm -f $$files\n\n# This directory's subdirectories are mostly independent; you can cd\n# into them and run `make' without going through this Makefile.\n# To change the values of `make' variables: instead of editing Makefiles,\n# (1) if the variable is set in `config.status', edit `config.status'\n#     (which will cause the Makefiles to be regenerated when you run `make');\n# (2) otherwise, pass the desired values on the `make' command line.\n$(RECURSIVE_TARGETS):\n\t@fail= failcom='exit 1'; \\\n\tfor f in x $$MAKEFLAGS; do \\\n\t  case $$f in \\\n\t    *=* | --[!k]*);; \\\n\t    *k*) failcom='fail=yes';; \\\n\t  esac; \\\n\tdone; \\\n\tdot_seen=no; \\\n\ttarget=`echo $@ | sed s/-recursive//`; \\\n\tlist='$(SUBDIRS)'; for subdir in $$list; do \\\n\t  echo \"Making $$target in $$subdir\"; \\\n\t  if test \"$$subdir\" = \".\"; then \\\n\t    dot_seen=yes; \\\n\t    local_target=\"$$target-am\"; \\\n\t  else \\\n\t    local_target=\"$$target\"; \\\n\t  fi; \\\n\t  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \\\n\t  || eval $$failcom; \\\n\tdone; \\\n\tif test \"$$dot_seen\" = \"no\"; then \\\n\t  $(MAKE) $(AM_MAKEFLAGS) \"$$target-am\" || exit 1; \\\n\tfi; test -z \"$$fail\"\n\n$(RECURSIVE_CLEAN_TARGETS):\n\t@fail= failcom='exit 1'; \\\n\tfor f in x $$MAKEFLAGS; do \\\n\t  case $$f in \\\n\t    *=* | --[!k]*);; \\\n\t    *k*) failcom='fail=yes';; \\\n\t  esac; \\\n\tdone; \\\n\tdot_seen=no; \\\n\tcase \"$@\" in \\\n\t  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \\\n\t  *) list='$(SUBDIRS)' ;; \\\n\tesac; \\\n\trev=''; for subdir in $$list; do \\\n\t  if test \"$$subdir\" = \".\"; then :; else \\\n\t    rev=\"$$subdir $$rev\"; \\\n\t  fi; \\\n\tdone; \\\n\trev=\"$$rev .\"; \\\n\ttarget=`echo $@ | sed s/-recursive//`; \\\n\tfor subdir in $$rev; do \\\n\t  echo \"Making $$target in $$subdir\"; \\\n\t  if test \"$$subdir\" = \".\"; then \\\n\t    local_target=\"$$target-am\"; \\\n\t  else \\\n\t    local_target=\"$$target\"; \\\n\t  fi; \\\n\t  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \\\n\t  || eval $$failcom; \\\n\tdone && test -z \"$$fail\"\ntags-recursive:\n\tlist='$(SUBDIRS)'; for subdir in $$list; do \\\n\t  test \"$$subdir\" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \\\n\tdone\nctags-recursive:\n\tlist='$(SUBDIRS)'; for subdir in $$list; do \\\n\t  test \"$$subdir\" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \\\n\tdone\n\nID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)\n\tlist='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \\\n\tunique=`for i in $$list; do \\\n\t    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n\t  done | \\\n\t  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \\\n\t      END { if (nonempty) { for (i in files) print i; }; }'`; \\\n\tmkid -fID $$unique\ntags: TAGS\n\nTAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \\\n\t\t$(TAGS_FILES) $(LISP)\n\tset x; \\\n\there=`pwd`; \\\n\tif ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \\\n\t  include_option=--etags-include; \\\n\t  empty_fix=.; \\\n\telse \\\n\t  include_option=--include; \\\n\t  empty_fix=; \\\n\tfi; \\\n\tlist='$(SUBDIRS)'; for subdir in $$list; do \\\n\t  if test \"$$subdir\" = .; then :; else \\\n\t    test ! -f $$subdir/TAGS || \\\n\t      set \"$$@\" \"$$include_option=$$here/$$subdir/TAGS\"; \\\n\t  fi; \\\n\tdone; \\\n\tlist='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \\\n\tunique=`for i in $$list; do \\\n\t    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n\t  done | \\\n\t  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \\\n\t      END { if (nonempty) { for (i in files) print i; }; }'`; \\\n\tshift; \\\n\tif test -z \"$(ETAGS_ARGS)$$*$$unique\"; then :; else \\\n\t  test -n \"$$unique\" || unique=$$empty_fix; \\\n\t  if test $$# -gt 0; then \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      \"$$@\" $$unique; \\\n\t  else \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      $$unique; \\\n\t  fi; \\\n\tfi\nctags: CTAGS\nCTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) \\\n\t\t$(TAGS_FILES) $(LISP)\n\tlist='$(SOURCES) $(HEADERS) config.h.in $(LISP) $(TAGS_FILES)'; \\\n\tunique=`for i in $$list; do \\\n\t    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n\t  done | \\\n\t  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \\\n\t      END { if (nonempty) { for (i in files) print i; }; }'`; \\\n\ttest -z \"$(CTAGS_ARGS)$$unique\" \\\n\t  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \\\n\t     $$unique\n\nGTAGS:\n\there=`$(am__cd) $(top_builddir) && pwd` \\\n\t  && $(am__cd) $(top_srcdir) \\\n\t  && gtags -i $(GTAGS_ARGS) \"$$here\"\n\ndistclean-tags:\n\t-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags\n\ncheck-TESTS: $(TESTS)\n\t@failed=0; all=0; xfail=0; xpass=0; skip=0; \\\n\tsrcdir=$(srcdir); export srcdir; \\\n\tlist=' $(TESTS) '; \\\n\t$(am__tty_colors); \\\n\tif test -n \"$$list\"; then \\\n\t  for tst in $$list; do \\\n\t    if test -f ./$$tst; then dir=./; \\\n\t    elif test -f $$tst; then dir=; \\\n\t    else dir=\"$(srcdir)/\"; fi; \\\n\t    if $(TESTS_ENVIRONMENT) $${dir}$$tst; then \\\n\t      all=`expr $$all + 1`; \\\n\t      case \" $(XFAIL_TESTS) \" in \\\n\t      *[\\ \\\t]$$tst[\\ \\\t]*) \\\n\t\txpass=`expr $$xpass + 1`; \\\n\t\tfailed=`expr $$failed + 1`; \\\n\t\tcol=$$red; res=XPASS; \\\n\t      ;; \\\n\t      *) \\\n\t\tcol=$$grn; res=PASS; \\\n\t      ;; \\\n\t      esac; \\\n\t    elif test $$? -ne 77; then \\\n\t      all=`expr $$all + 1`; \\\n\t      case \" $(XFAIL_TESTS) \" in \\\n\t      *[\\ \\\t]$$tst[\\ \\\t]*) \\\n\t\txfail=`expr $$xfail + 1`; \\\n\t\tcol=$$lgn; res=XFAIL; \\\n\t      ;; \\\n\t      *) \\\n\t\tfailed=`expr $$failed + 1`; \\\n\t\tcol=$$red; res=FAIL; \\\n\t      ;; \\\n\t      esac; \\\n\t    else \\\n\t      skip=`expr $$skip + 1`; \\\n\t      col=$$blu; res=SKIP; \\\n\t    fi; \\\n\t    echo \"$${col}$$res$${std}: $$tst\"; \\\n\t  done; \\\n\t  if test \"$$all\" -eq 1; then \\\n\t    tests=\"test\"; \\\n\t    All=\"\"; \\\n\t  else \\\n\t    tests=\"tests\"; \\\n\t    All=\"All \"; \\\n\t  fi; \\\n\t  if test \"$$failed\" -eq 0; then \\\n\t    if test \"$$xfail\" -eq 0; then \\\n\t      banner=\"$$All$$all $$tests passed\"; \\\n\t    else \\\n\t      if test \"$$xfail\" -eq 1; then failures=failure; else failures=failures; fi; \\\n\t      banner=\"$$All$$all $$tests behaved as expected ($$xfail expected $$failures)\"; \\\n\t    fi; \\\n\t  else \\\n\t    if test \"$$xpass\" -eq 0; then \\\n\t      banner=\"$$failed of $$all $$tests failed\"; \\\n\t    else \\\n\t      if test \"$$xpass\" -eq 1; then passes=pass; else passes=passes; fi; \\\n\t      banner=\"$$failed of $$all $$tests did not behave as expected ($$xpass unexpected $$passes)\"; \\\n\t    fi; \\\n\t  fi; \\\n\t  dashes=\"$$banner\"; \\\n\t  skipped=\"\"; \\\n\t  if test \"$$skip\" -ne 0; then \\\n\t    if test \"$$skip\" -eq 1; then \\\n\t      skipped=\"($$skip test was not run)\"; \\\n\t    else \\\n\t      skipped=\"($$skip tests were not run)\"; \\\n\t    fi; \\\n\t    test `echo \"$$skipped\" | wc -c` -le `echo \"$$banner\" | wc -c` || \\\n\t      dashes=\"$$skipped\"; \\\n\t  fi; \\\n\t  report=\"\"; \\\n\t  if test \"$$failed\" -ne 0 && test -n \"$(PACKAGE_BUGREPORT)\"; then \\\n\t    report=\"Please report to $(PACKAGE_BUGREPORT)\"; \\\n\t    test `echo \"$$report\" | wc -c` -le `echo \"$$banner\" | wc -c` || \\\n\t      dashes=\"$$report\"; \\\n\t  fi; \\\n\t  dashes=`echo \"$$dashes\" | sed s/./=/g`; \\\n\t  if test \"$$failed\" -eq 0; then \\\n\t    echo \"$$grn$$dashes\"; \\\n\t  else \\\n\t    echo \"$$red$$dashes\"; \\\n\t  fi; \\\n\t  echo \"$$banner\"; \\\n\t  test -z \"$$skipped\" || echo \"$$skipped\"; \\\n\t  test -z \"$$report\" || echo \"$$report\"; \\\n\t  echo \"$$dashes$$std\"; \\\n\t  test \"$$failed\" -eq 0; \\\n\telse :; fi\n\ndistdir: $(DISTFILES)\n\t$(am__remove_distdir)\n\ttest -d \"$(distdir)\" || mkdir \"$(distdir)\"\n\t@srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\ttopsrcdirstrip=`echo \"$(top_srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\tlist='$(DISTFILES)'; \\\n\t  dist_files=`for file in $$list; do echo $$file; done | \\\n\t  sed -e \"s|^$$srcdirstrip/||;t\" \\\n\t      -e \"s|^$$topsrcdirstrip/|$(top_builddir)/|;t\"`; \\\n\tcase $$dist_files in \\\n\t  */*) $(MKDIR_P) `echo \"$$dist_files\" | \\\n\t\t\t   sed '/\\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \\\n\t\t\t   sort -u` ;; \\\n\tesac; \\\n\tfor file in $$dist_files; do \\\n\t  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \\\n\t  if test -d $$d/$$file; then \\\n\t    dir=`echo \"/$$file\" | sed -e 's,/[^/]*$$,,'`; \\\n\t    if test -d \"$(distdir)/$$file\"; then \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \\\n\t      cp -fpR $(srcdir)/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    cp -fpR $$d/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t  else \\\n\t    test -f \"$(distdir)/$$file\" \\\n\t    || cp -p $$d/$$file \"$(distdir)/$$file\" \\\n\t    || exit 1; \\\n\t  fi; \\\n\tdone\n\t@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \\\n\t  if test \"$$subdir\" = .; then :; else \\\n\t    test -d \"$(distdir)/$$subdir\" \\\n\t    || $(MKDIR_P) \"$(distdir)/$$subdir\" \\\n\t    || exit 1; \\\n\t  fi; \\\n\tdone\n\t@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \\\n\t  if test \"$$subdir\" = .; then :; else \\\n\t    dir1=$$subdir; dir2=\"$(distdir)/$$subdir\"; \\\n\t    $(am__relativize); \\\n\t    new_distdir=$$reldir; \\\n\t    dir1=$$subdir; dir2=\"$(top_distdir)\"; \\\n\t    $(am__relativize); \\\n\t    new_top_distdir=$$reldir; \\\n\t    echo \" (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=\"$$new_top_distdir\" distdir=\"$$new_distdir\" \\\\\"; \\\n\t    echo \"     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)\"; \\\n\t    ($(am__cd) $$subdir && \\\n\t      $(MAKE) $(AM_MAKEFLAGS) \\\n\t        top_distdir=\"$$new_top_distdir\" \\\n\t        distdir=\"$$new_distdir\" \\\n\t\tam__remove_distdir=: \\\n\t\tam__skip_length_check=: \\\n\t\tam__skip_mode_fix=: \\\n\t        distdir) \\\n\t      || exit 1; \\\n\t  fi; \\\n\tdone\n\t-test -n \"$(am__skip_mode_fix)\" \\\n\t|| find \"$(distdir)\" -type d ! -perm -755 \\\n\t\t-exec chmod u+rwx,go+rx {} \\; -o \\\n\t  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \\; -o \\\n\t  ! -type d ! -perm -400 -exec chmod a+r {} \\; -o \\\n\t  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \\; \\\n\t|| chmod -R a+r \"$(distdir)\"\ndist-gzip: distdir\n\ttardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz\n\t$(am__remove_distdir)\n\ndist-bzip2: distdir\n\ttardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2\n\t$(am__remove_distdir)\n\ndist-lzma: distdir\n\ttardir=$(distdir) && $(am__tar) | lzma -9 -c >$(distdir).tar.lzma\n\t$(am__remove_distdir)\n\ndist-xz: distdir\n\ttardir=$(distdir) && $(am__tar) | xz -c >$(distdir).tar.xz\n\t$(am__remove_distdir)\n\ndist-tarZ: distdir\n\ttardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z\n\t$(am__remove_distdir)\n\ndist-shar: distdir\n\tshar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz\n\t$(am__remove_distdir)\n\ndist-zip: distdir\n\t-rm -f $(distdir).zip\n\tzip -rq $(distdir).zip $(distdir)\n\t$(am__remove_distdir)\n\ndist dist-all: distdir\n\ttardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz\n\t$(am__remove_distdir)\n\n# This target untars the dist file and tries a VPATH configuration.  Then\n# it guarantees that the distribution is self-contained by making another\n# tarfile.\ndistcheck: dist\n\tcase '$(DIST_ARCHIVES)' in \\\n\t*.tar.gz*) \\\n\t  GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\\\n\t*.tar.bz2*) \\\n\t  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\\\n\t*.tar.lzma*) \\\n\t  lzma -dc $(distdir).tar.lzma | $(am__untar) ;;\\\n\t*.tar.xz*) \\\n\t  xz -dc $(distdir).tar.xz | $(am__untar) ;;\\\n\t*.tar.Z*) \\\n\t  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\\\n\t*.shar.gz*) \\\n\t  GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\\\n\t*.zip*) \\\n\t  unzip $(distdir).zip ;;\\\n\tesac\n\tchmod -R a-w $(distdir); chmod a+w $(distdir)\n\tmkdir $(distdir)/_build\n\tmkdir $(distdir)/_inst\n\tchmod a-w $(distdir)\n\ttest -d $(distdir)/_build || exit 0; \\\n\tdc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\\\/]:[\\\\/],/,'` \\\n\t  && dc_destdir=\"$${TMPDIR-/tmp}/am-dc-$$$$/\" \\\n\t  && am__cwd=`pwd` \\\n\t  && $(am__cd) $(distdir)/_build \\\n\t  && ../configure --srcdir=.. --prefix=\"$$dc_install_base\" \\\n\t    $(DISTCHECK_CONFIGURE_FLAGS) \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) dvi \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) check \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) install \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) installcheck \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) uninstall \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir=\"$$dc_install_base\" \\\n\t        distuninstallcheck \\\n\t  && chmod -R a-w \"$$dc_install_base\" \\\n\t  && ({ \\\n\t       (cd ../.. && umask 077 && mkdir \"$$dc_destdir\") \\\n\t       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR=\"$$dc_destdir\" install \\\n\t       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR=\"$$dc_destdir\" uninstall \\\n\t       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR=\"$$dc_destdir\" \\\n\t            distuninstallcheck_dir=\"$$dc_destdir\" distuninstallcheck; \\\n\t      } || { rm -rf \"$$dc_destdir\"; exit 1; }) \\\n\t  && rm -rf \"$$dc_destdir\" \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) dist \\\n\t  && rm -rf $(DIST_ARCHIVES) \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \\\n\t  && cd \"$$am__cwd\" \\\n\t  || exit 1\n\t$(am__remove_distdir)\n\t@(echo \"$(distdir) archives ready for distribution: \"; \\\n\t  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \\\n\t  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'\ndistuninstallcheck:\n\t@$(am__cd) '$(distuninstallcheck_dir)' \\\n\t&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \\\n\t   || { echo \"ERROR: files left after uninstall:\" ; \\\n\t        if test -n \"$(DESTDIR)\"; then \\\n\t          echo \"  (check DESTDIR support)\"; \\\n\t        fi ; \\\n\t        $(distuninstallcheck_listfiles) ; \\\n\t        exit 1; } >&2\ndistcleancheck: distclean\n\t@if test '$(srcdir)' = . ; then \\\n\t  echo \"ERROR: distcleancheck can only run from a VPATH build\" ; \\\n\t  exit 1 ; \\\n\tfi\n\t@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \\\n\t  || { echo \"ERROR: files left in build directory after distclean:\" ; \\\n\t       $(distcleancheck_listfiles) ; \\\n\t       exit 1; } >&2\ncheck-am: all-am\n\t$(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS)\n\t$(MAKE) $(AM_MAKEFLAGS) check-TESTS\ncheck: check-recursive\nall-am: Makefile $(LTLIBRARIES) $(SCRIPTS) $(DATA) $(HEADERS) config.h\ninstalldirs: installdirs-recursive\ninstalldirs-am:\n\tfor dir in \"$(DESTDIR)$(libdir)\" \"$(DESTDIR)$(bindir)\" \"$(DESTDIR)$(pkgconfigdir)\" \"$(DESTDIR)$(includedir)\"; do \\\n\t  test -z \"$$dir\" || $(MKDIR_P) \"$$dir\"; \\\n\tdone\ninstall: install-recursive\ninstall-exec: install-exec-recursive\ninstall-data: install-data-recursive\nuninstall: uninstall-recursive\n\ninstall-am: all-am\n\t@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am\n\ninstallcheck: installcheck-recursive\ninstall-strip:\n\t$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t  install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t  `test -z '$(STRIP)' || \\\n\t    echo \"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'\"` install\nmostlyclean-generic:\n\nclean-generic:\n\ndistclean-generic:\n\t-test -z \"$(CONFIG_CLEAN_FILES)\" || rm -f $(CONFIG_CLEAN_FILES)\n\t-test . = \"$(srcdir)\" || test -z \"$(CONFIG_CLEAN_VPATH_FILES)\" || rm -f $(CONFIG_CLEAN_VPATH_FILES)\n\nmaintainer-clean-generic:\n\t@echo \"This command is intended for maintainers to use\"\n\t@echo \"it deletes files that may require special tools to rebuild.\"\nclean: clean-recursive\n\nclean-am: clean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \\\n\tclean-libtool mostlyclean-am\n\ndistclean: distclean-recursive\n\t-rm -f $(am__CONFIG_DISTCLEAN_FILES)\n\t-rm -rf ./$(DEPDIR)\n\t-rm -f Makefile\ndistclean-am: clean-am distclean-compile distclean-generic \\\n\tdistclean-hdr distclean-libtool distclean-tags\n\ndvi: dvi-recursive\n\ndvi-am:\n\nhtml: html-recursive\n\nhtml-am:\n\ninfo: info-recursive\n\ninfo-am:\n\ninstall-data-am: install-includeHEADERS install-pkgconfigDATA\n\ninstall-dvi: install-dvi-recursive\n\ninstall-dvi-am:\n\ninstall-exec-am: install-binSCRIPTS install-libLTLIBRARIES\n\ninstall-html: install-html-recursive\n\ninstall-html-am:\n\ninstall-info: install-info-recursive\n\ninstall-info-am:\n\ninstall-man:\n\ninstall-pdf: install-pdf-recursive\n\ninstall-pdf-am:\n\ninstall-ps: install-ps-recursive\n\ninstall-ps-am:\n\ninstallcheck-am:\n\nmaintainer-clean: maintainer-clean-recursive\n\t-rm -f $(am__CONFIG_DISTCLEAN_FILES)\n\t-rm -rf $(top_srcdir)/autom4te.cache\n\t-rm -rf ./$(DEPDIR)\n\t-rm -f Makefile\nmaintainer-clean-am: distclean-am maintainer-clean-generic\n\nmostlyclean: mostlyclean-recursive\n\nmostlyclean-am: mostlyclean-compile mostlyclean-generic \\\n\tmostlyclean-libtool\n\npdf: pdf-recursive\n\npdf-am:\n\nps: ps-recursive\n\nps-am:\n\nuninstall-am: uninstall-binSCRIPTS uninstall-includeHEADERS \\\n\tuninstall-libLTLIBRARIES uninstall-pkgconfigDATA\n\n.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) all check-am \\\n\tctags-recursive install-am install-strip tags-recursive\n\n.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \\\n\tall all-am am--refresh check check-TESTS check-am clean \\\n\tclean-checkPROGRAMS clean-generic clean-libLTLIBRARIES \\\n\tclean-libtool ctags ctags-recursive dist dist-all dist-bzip2 \\\n\tdist-gzip dist-lzma dist-shar dist-tarZ dist-xz dist-zip \\\n\tdistcheck distclean distclean-compile distclean-generic \\\n\tdistclean-hdr distclean-libtool distclean-tags distcleancheck \\\n\tdistdir distuninstallcheck dvi dvi-am html html-am info \\\n\tinfo-am install install-am install-binSCRIPTS install-data \\\n\tinstall-data-am install-dvi install-dvi-am install-exec \\\n\tinstall-exec-am install-html install-html-am \\\n\tinstall-includeHEADERS install-info install-info-am \\\n\tinstall-libLTLIBRARIES install-man install-pdf install-pdf-am \\\n\tinstall-pkgconfigDATA install-ps install-ps-am install-strip \\\n\tinstallcheck installcheck-am installdirs installdirs-am \\\n\tmaintainer-clean maintainer-clean-generic mostlyclean \\\n\tmostlyclean-compile mostlyclean-generic mostlyclean-libtool \\\n\tpdf pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \\\n\tuninstall-binSCRIPTS uninstall-includeHEADERS \\\n\tuninstall-libLTLIBRARIES uninstall-pkgconfigDATA\n\n\nonig-config: onig-config.in\n\noniguruma.pc: $(srcdir)/oniguruma.pc.in Makefile\n\t$(do_subst) < $(<) > $(@)\n\ndll:\n\t$(CXX) -shared -Wl,--output-def,libonig.def -o libonig.dll *.o \\\n\t$(LIBS)\n\tstrip libonig.dll\n\n# Ruby TEST\nrtest:\n\t$(RUBYDIR)/ruby -w -Ke $(srcdir)/test.rb\n\n# character-types-table source generator\nmktable: $(encdir)/mktable.c $(srcdir)/regenc.h\n\t$(CC) -I$(top_srcdir) -o mktable $(encdir)/mktable.c\n\natest: testc testp testcu\n\t@echo \"[Oniguruma API, ASCII/EUC-JP check]\"\n\t@$(top_builddir)/testc  | grep RESULT\n\t@echo \"[POSIX API, ASCII/EUC-JP check]\"\n\t@$(top_builddir)/testp  | grep RESULT\n\t@echo \"[Oniguruma API, UTF-16 check]\"\n\t@$(top_builddir)/testcu | grep RESULT\n\ntestc.c: $(srcdir)/test.rb $(srcdir)/testconv.rb\n\truby -Ke $(srcdir)/testconv.rb < $(srcdir)/test.rb > $@\n\ntestu.c: $(srcdir)/test.rb $(srcdir)/testconvu.rb\n\truby -Ke $(srcdir)/testconvu.rb $(srcdir)/test.rb > $@\n\nwin32/testc.c: $(srcdir)/test.rb $(srcdir)/testconv.rb\n\truby -Ke $(srcdir)/testconv.rb -win < $(srcdir)/test.rb | nkf -cs > $@\n\n# Tell versions [3.59,3.63) of GNU make to not export all variables.\n# Otherwise a system limit (for SysV at least) may be exceeded.\n.NOEXPORT:\n"
  },
  {
    "path": "src/Onigmo/README",
    "content": "README  2013/03/21\n\nOnigmo (Oniguruma-mod)  --  (C) K.Takata <kentkt AT csc DOT jp>\n\nhttps://github.com/k-takata/Onigmo\n\nOnigmo is a regular expressions library forked from Oniguruma.\nSome of new features introduced in Perl 5.10+ can be used.\n\nSome patches are merged from Ruby 2.0.0.\n\n\nMain New features:\n  Regular Expressions (depends on the syntax):\n    \\K, \\R, \\X, (?(cond)yes|no)\n    (?adlu), \\g{name}, \\g{n}, (?&name), (?n), (?R), (?0)\n    (?P<name>...), (?P=name), (?P>name)\n\n  API:\n    onig_search_gpos (for Perl-compatible \\G)\n\n  Encoding:\n    CP932\n\n  Syntax:\n    Python\n\n\nNew Source Files:\n  enc/cp932.c                   CP932 encoding.\n  enc/unicode/casefold.h        Unicode case folding data.\n  enc/unicode/name2ctype.h      Unicode properties data.\n\n  onig.py                       onig.dll/libonig.so loader.\n  testpy.py                     test program.\n\n  tool/CaseFolding.py           generates casefold.h.\n  tool/convert-name2ctype.sh    converts name2ctype.kwd to name2ctypes.h.\n  tool/enc-unicode.rb           generates name2ctype.kwd.\n\n  win32/makedef.py              creates onig.def.\n  win32/onig.rc                 resource file for onig.dll.\n\n\nToDo:\n  * Reduce the size of Unicode Character Data.\n  * (?|...)\n  * Improve (?(cond)yes|no). (support look-ahead/behind assertions.)\n\n\nOniguruma's README follows:\n======================================================================\nREADME  2007/05/31\n\nOniguruma  ----   (C) K.Kosako <sndgk393 AT ybb DOT ne DOT jp>\n\nhttp://www.geocities.jp/kosako3/oniguruma/\n\nOniguruma is a regular expressions library.\nThe characteristics of this library is that different character encoding\nfor every regular expression object can be specified.\n\nSupported character encodings:\n\n  ASCII, UTF-8, UTF-16BE, UTF-16LE, UTF-32BE, UTF-32LE,\n  EUC-JP, EUC-TW, EUC-KR, EUC-CN,\n  Shift_JIS, Big5, GB18030, KOI8-R, CP1251,\n  ISO-8859-1, ISO-8859-2, ISO-8859-3, ISO-8859-4, ISO-8859-5,\n  ISO-8859-6, ISO-8859-7, ISO-8859-8, ISO-8859-9, ISO-8859-10,\n  ISO-8859-11, ISO-8859-13, ISO-8859-14, ISO-8859-15, ISO-8859-16\n\n* GB18030: contributed by KUBO Takehiro\n* CP1251:  contributed by Byte\n------------------------------------------------------------\n\nLicense\n\n   BSD license.\n\n\nInstall\n\n Case 1: Unix and Cygwin platform\n\n   1. ./configure\n   2. make\n   3. make install\n\n   * uninstall\n\n     make uninstall\n\n   * test (ASCII/EUC-JP)\n\n     make atest\n\n   * configuration check\n\n     onig-config --cflags\n     onig-config --libs\n     onig-config --prefix\n     onig-config --exec-prefix\n\n\n\n Case 2: Win32 platform (VC++)\n\n   1. copy win32\\Makefile Makefile\n   2. copy win32\\config.h config.h\n   3. nmake\n\n      onig_s.lib:  static link library\n      onig.dll:    dynamic link library\n\n  * test (ASCII/Shift_JIS)\n   4. copy win32\\testc.c testc.c\n   5. nmake ctest\n\n\n\nRegular Expressions\n\n  See doc/RE (or doc/RE.ja for Japanese).\n\n\nUsage\n\n  Include oniguruma.h in your program. (Oniguruma API)\n  See doc/API for Oniguruma API.\n\n  If you want to disable UChar type (== unsigned char) definition\n  in oniguruma.h, define ONIG_ESCAPE_UCHAR_COLLISION and then\n  include oniguruma.h.\n\n  If you want to disable regex_t type definition in oniguruma.h,\n  define ONIG_ESCAPE_REGEX_T_COLLISION and then include oniguruma.h.\n\n  Example of the compiling/linking command line in Unix or Cygwin,\n  (prefix == /usr/local case)\n\n    cc sample.c -L/usr/local/lib -lonig\n\n\n  If you want to use static link library(onig_s.lib) in Win32,\n  add option -DONIG_EXTERN=extern to C compiler.\n\n\n\nSample Programs\n\n  sample/simple.c    example of the minimum (Oniguruma API)\n  sample/names.c     example of the named group callback.\n  sample/encode.c    example of some encodings.\n  sample/listcap.c   example of the capture history.\n  sample/posix.c     POSIX API sample.\n  sample/sql.c       example of the variable meta characters.\n                     (SQL-like pattern matching)\n\nTest Programs\n  sample/syntax.c    Perl, Java and ASIS syntax test.\n  sample/crnl.c      --enable-crnl-as-line-terminator test\n\n\nSource Files\n\n  oniguruma.h        Oniguruma API header file. (public)\n  onig-config.in     configuration check program template.\n\n  regenc.h           character encodings framework header file.\n  regint.h           internal definitions\n  regparse.h         internal definitions for regparse.c and regcomp.c\n  regcomp.c          compiling and optimization functions\n  regenc.c           character encodings framework.\n  regerror.c         error message function\n  regext.c           extended API functions. (deluxe version API)\n  regexec.c          search and match functions\n  regparse.c         parsing functions.\n  regsyntax.c        pattern syntax functions and built-in syntax definitions.\n  regtrav.c          capture history tree data traverse functions.\n  regversion.c       version info function.\n  st.h               hash table functions header file\n  st.c               hash table functions\n\n  oniggnu.h          GNU regex API header file. (public)\n  reggnu.c           GNU regex API functions\n\n  onigposix.h        POSIX API header file. (public)\n  regposerr.c        POSIX error message function.\n  regposix.c         POSIX API functions.\n\n  enc/mktable.c      character type table generator.\n  enc/ascii.c        ASCII encoding.\n  enc/euc_jp.c       EUC-JP encoding.\n  enc/euc_tw.c       EUC-TW encoding.\n  enc/euc_kr.c       EUC-KR, EUC-CN encoding.\n  enc/sjis.c         Shift_JIS encoding.\n  enc/big5.c         Big5      encoding.\n  enc/gb18030.c      GB18030   encoding.\n  enc/koi8.c         KOI8      encoding.\n  enc/koi8_r.c       KOI8-R    encoding.\n  enc/cp1251.c       CP1251    encoding.\n  enc/iso8859_1.c    ISO-8859-1  encoding. (Latin-1)\n  enc/iso8859_2.c    ISO-8859-2  encoding. (Latin-2)\n  enc/iso8859_3.c    ISO-8859-3  encoding. (Latin-3)\n  enc/iso8859_4.c    ISO-8859-4  encoding. (Latin-4)\n  enc/iso8859_5.c    ISO-8859-5  encoding. (Cyrillic)\n  enc/iso8859_6.c    ISO-8859-6  encoding. (Arabic)\n  enc/iso8859_7.c    ISO-8859-7  encoding. (Greek)\n  enc/iso8859_8.c    ISO-8859-8  encoding. (Hebrew)\n  enc/iso8859_9.c    ISO-8859-9  encoding. (Latin-5 or Turkish)\n  enc/iso8859_10.c   ISO-8859-10 encoding. (Latin-6 or Nordic)\n  enc/iso8859_11.c   ISO-8859-11 encoding. (Thai)\n  enc/iso8859_13.c   ISO-8859-13 encoding. (Latin-7 or Baltic Rim)\n  enc/iso8859_14.c   ISO-8859-14 encoding. (Latin-8 or Celtic)\n  enc/iso8859_15.c   ISO-8859-15 encoding. (Latin-9 or West European with Euro)\n  enc/iso8859_16.c   ISO-8859-16 encoding.\n                     (Latin-10 or South-Eastern European with Euro)\n  enc/utf8.c         UTF-8    encoding.\n  enc/utf16_be.c     UTF-16BE encoding.\n  enc/utf16_le.c     UTF-16LE encoding.\n  enc/utf32_be.c     UTF-32BE encoding.\n  enc/utf32_le.c     UTF-32LE encoding.\n  enc/unicode.c      Unicode information data.\n\n  win32/Makefile     Makefile for Win32 (VC++)\n  win32/config.h     config.h for Win32\n\n\n\nToDo\n\n  ? case fold flag: Katakana <-> Hiragana.\n  ? add ONIG_OPTION_NOTBOS/NOTEOS. (\\A, \\z, \\Z)\n ?? \\X (== \\PM\\pM*)\n ?? implement syntax behavior ONIG_SYN_CONTEXT_INDEP_ANCHORS.\n ?? transmission stopper. (return ONIG_STOP from match_at())\n\nand I'm thankful to Akinori MUSHA.\n\n\nMail Address: K.Kosako <sndgk393 AT ybb DOT ne DOT jp>\n"
  },
  {
    "path": "src/Onigmo/README.ja",
    "content": "README.ja  2013/03/21\n\n鬼雲 (鬼車改)  --  (C) K.Takata <kentkt AT csc DOT jp>\n\nhttps://github.com/k-takata/Onigmo\n\n鬼雲は、鬼車から派生した正規表現ライブラリである。\nPerl 5.10以降で新たに導入された正規表現の一部が使用可能になっている。\n\n一部のパッチは Ruby 2.0.0 からマージしている。\n\n\n主な新機能:\n  正規表現 (文法依存):\n    \\K, \\R, \\X, (?(cond)yes|no)\n    (?adlu), \\g{name}, \\g{n}, (?&name), (?n), (?R), (?0)\n    (?P<name>...), (?P=name), (?P>name)\n\n  API:\n    onig_search_gpos (Perl互換の \\G 用)\n\n  エンコーディング:\n    CP932\n\n  文法:\n    Python\n\n\n新規ソースファイル:\n  enc/cp932.c                   CP932 エンコーディング\n  enc/unicode/casefold.h        Unicodeケースフォールドデータ\n  enc/unicode/name2ctype.h      Unicodeプロパティデータ\n\n  onig.py                       onig.dll/libonig.so ローダ\n  testpy.py                     テストプログラム\n\n  tool/CaseFolding.py           casefold.hを生成\n  tool/convert-name2ctype.sh    name2ctype.kwdをname2ctypes.hに変換\n  tool/enc-unicode.rb           name2ctype.kwdを生成\n\n  win32/makedef.py              onig.defを作成\n  win32/onig.rc                 onig.dll用リソースファイル\n\n\nToDo:\n  * Unicode Character Data のサイズ削減。\n  * (?|...)\n  * (?(cond)yes|no) の改善。（先読み・戻り読みの対応）\n\n\n以下、鬼車の README.ja:\n======================================================================\nREADME.ja  2007/05/31\n\n鬼車  ----   (C) K.Kosako <sndgk393 AT ybb DOT ne DOT jp>\n\nhttp://www.geocities.jp/kosako3/oniguruma/\n\n鬼車は正規表現ライブラリである。\nこのライブラリの特長は、それぞれの正規表現オブジェクトごとに\n文字エンコーディングを指定できることである。\n\nサポートしている文字エンコーディング:\n\n  ASCII, UTF-8, UTF-16BE, UTF-16LE, UTF-32BE, UTF-32LE,\n  EUC-JP, EUC-TW, EUC-KR, EUC-CN,\n  Shift_JIS, Big5, GB18030, KOI8-R, CP1251,\n  ISO-8859-1, ISO-8859-2, ISO-8859-3, ISO-8859-4, ISO-8859-5,\n  ISO-8859-6, ISO-8859-7, ISO-8859-8, ISO-8859-9, ISO-8859-10,\n  ISO-8859-11, ISO-8859-13, ISO-8859-14, ISO-8859-15, ISO-8859-16\n\n* GB18030: 久保健洋氏提供\n* CP1251:  Byte氏提供\n------------------------------------------------------------\n\nライセンス\n\n  BSDライセンスに従う。\n\n\nインストール\n\n ケース１: UnixとCygwin環境\n\n   1. ./configure\n   2. make\n   3. make install\n\n   アンインストール\n\n     make uninstall\n\n   動作テスト (ASCII/EUC-JP)\n\n     make atest\n\n\n   構成確認\n\n     onig-config --cflags\n     onig-config --libs\n     onig-config --prefix\n     onig-config --exec-prefix\n\n\n\n ケース２: Win32(VC++)環境\n\n   1. copy win32\\Makefile Makefile\n   2. copy win32\\config.h config.h\n   3. nmake\n\n      onig_s.lib:  static link library\n      onig.dll:    dynamic link library\n\n  * 動作テスト (ASCII/Shift_JIS)\n   4. copy win32\\testc.c testc.c\n   5. nmake ctest\n\n\n\n正規表現\n\n  doc/RE.jaを参照\n\n\n使用方法\n\n  使用するプログラムで、oniguruma.hをインクルードする(Oniguruma APIの場合)。\n  Oniguruma APIについては、doc/API.jaを参照。\n\n  oniguruma.hで定義されている型名UChar(== unsigned char)を無効にしたい場合\n  には、ONIG_ESCAPE_UCHAR_COLLISIONをdefineしてからoniguruma.hをインクルード\n  すること。このときにはUCharは定義されず、OnigUCharという名前の定義のみが\n  有効になる。\n\n  oniguruma.hで定義されている型名regex_tを無効にしたい場合には、\n  ONIG_ESCAPE_REGEX_T_COLLISIONをdefineしてからoniguruma.hをインクルード\n  すること。このときにはregex_tは定義されず、OnigRegexType, OnigRegexという\n  名前の定義のみが有効になる。\n\n  Unix/Cygwin上でコンパイル、リンクする場合の例：\n  (prefixが/usr/localのとき)\n  cc sample.c -L/usr/local/lib -lonig\n\n  GNU libtoolを使用しているので、プラットフォームが共有ライブラリをサポートして\n  いれば、使用できるようになっている。\n  静的ライブラリと共有ライブラリのどちらを使用するかを指定する方法、実行時点での\n  環境設定方法については、自分で調べて下さい。\n\n\n  Win32でスタティックリンクライブラリ(onig_s.lib)をリンクする場合には、\n  コンパイルするときに -DONIG_EXTERN=extern をコンパイル引数に追加すること。\n\n\n使用例プログラム\n\n  sample/simple.c    最小例 (Oniguruma API)\n  sample/names.c     名前付きグループコールバック使用例\n  sample/encode.c    幾つかの文字エンコーディング使用例\n  sample/listcap.c   捕獲履歴機能の使用例\n  sample/posix.c     POSIX API使用例\n  sample/sql.c       可変メタ文字機能使用例 (SQL-like パターン)\n\nテストプログラム\n  sample/syntax.c    Perl、Java、ASIS文法のテスト\n  sample/crnl.c      --enable-crnl-as-line-terminator テスト\n\n\nソースファイル\n\n  oniguruma.h        鬼車APIヘッダ (公開)\n  onig-config.in     onig-configプログラム テンプレート\n\n  regenc.h           文字エンコーディング枠組みヘッダ\n  regint.h           内部宣言\n  regparse.h         regparse.cとregcomp.cのための内部宣言\n  regcomp.c          コンパイル、最適化関数\n  regenc.c           文字エンコーディング枠組み\n  regerror.c         エラーメッセージ関数\n  regext.c           拡張API関数\n  regexec.c          検索、照合関数\n  regparse.c         正規表現パターン解析関数\n  regsyntax.c        正規表現パターン文法関数、組込み文法定義\n  regtrav.c          捕獲履歴木巡回関数\n  regversion.c       版情報関数\n  st.h               ハッシュテーブル関数宣言\n  st.c               ハッシュテーブル関数\n\n  oniggnu.h          GNU regex APIヘッダ (公開)\n  reggnu.c           GNU regex API関数\n\n  onigposix.h        POSIX APIヘッダ (公開)\n  regposerr.c        POSIX APIエラーメッセージ関数\n  regposix.c         POSIX API関数\n\n  enc/mktable.c      文字タイプテーブル生成プログラム\n  enc/ascii.c        ASCII エンコーディング\n  enc/euc_jp.c       EUC-JP エンコーディング\n  enc/euc_tw.c       EUC-TW エンコーディング\n  enc/euc_kr.c       EUC-KR, EUC-CN エンコーディング\n  enc/sjis.c         Shift_JIS エンコーディング\n  enc/big5.c         Big5 エンコーディング\n  enc/gb18030.c      GB18030 エンコーディング\n  enc/koi8.c         KOI8 エンコーディング\n  enc/koi8_r.c       KOI8-R エンコーディング\n  enc/cp1251.c       CP1251 エンコーディング\n  enc/iso8859_1.c    ISO-8859-1  (Latin-1)\n  enc/iso8859_2.c    ISO-8859-2  (Latin-2)\n  enc/iso8859_3.c    ISO-8859-3  (Latin-3)\n  enc/iso8859_4.c    ISO-8859-4  (Latin-4)\n  enc/iso8859_5.c    ISO-8859-5  (Cyrillic)\n  enc/iso8859_6.c    ISO-8859-6  (Arabic)\n  enc/iso8859_7.c    ISO-8859-7  (Greek)\n  enc/iso8859_8.c    ISO-8859-8  (Hebrew)\n  enc/iso8859_9.c    ISO-8859-9  (Latin-5 または Turkish)\n  enc/iso8859_10.c   ISO-8859-10 (Latin-6 または Nordic)\n  enc/iso8859_11.c   ISO-8859-11 (Thai)\n  enc/iso8859_13.c   ISO-8859-13 (Latin-7 または Baltic Rim)\n  enc/iso8859_14.c   ISO-8859-14 (Latin-8 または Celtic)\n  enc/iso8859_15.c   ISO-8859-15 (Latin-9 または West European with Euro)\n  enc/iso8859_16.c   ISO-8859-16\n                     (Latin-10 または South-Eastern European with Euro)\n  enc/utf8.c         UTF-8    エンコーディング\n  enc/utf16_be.c     UTF-16BE エンコーディング\n  enc/utf16_le.c     UTF-16LE エンコーディング\n  enc/utf32_be.c     UTF-32BE エンコーディング\n  enc/utf32_le.c     UTF-32LE エンコーディング\n  enc/unicode.c      Unicode情報\n\n  win32/Makefile     Win32用 Makefile (for VC++)\n  win32/config.h     Win32用 config.h\n\n\n\n残件\n\n  ? case fold flag: Katakana <-> Hiragana\n  ? ONIG_OPTION_NOTBOS/NOTEOS追加 (\\A, \\z, \\Z)\n ?? \\X (== \\PM\\pM*)\n ?? 文法要素 ONIG_SYN_CONTEXT_INDEP_ANCHORSの実装\n ?? 検索位置移動停止演算子 (match_at()からONIG_STOPを返す)\n\nand I'm thankful to Akinori MUSHA.\n\n\nアドレス: K.Kosako <sndgk393 AT ybb DOT ne DOT jp>\n"
  },
  {
    "path": "src/Onigmo/aclocal.m4",
    "content": "# generated automatically by aclocal 1.11.1 -*- Autoconf -*-\n\n# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,\n# 2005, 2006, 2007, 2008, 2009  Free Software Foundation, Inc.\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\nm4_ifndef([AC_AUTOCONF_VERSION],\n  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl\nm4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.65],,\n[m4_warning([this file was generated for autoconf 2.65.\nYou have another version of autoconf.  It may work, but is not guaranteed to.\nIf you have problems, you may need to regenerate the build system entirely.\nTo do so, use the procedure documented by the package, typically `autoreconf'.])])\n\n# Copyright (C) 2002, 2003, 2005, 2006, 2007, 2008  Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_AUTOMAKE_VERSION(VERSION)\n# ----------------------------\n# Automake X.Y traces this macro to ensure aclocal.m4 has been\n# generated from the m4 files accompanying Automake X.Y.\n# (This private macro should not be called outside this file.)\nAC_DEFUN([AM_AUTOMAKE_VERSION],\n[am__api_version='1.11'\ndnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to\ndnl require some minimum version.  Point them to the right macro.\nm4_if([$1], [1.11.1], [],\n      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl\n])\n\n# _AM_AUTOCONF_VERSION(VERSION)\n# -----------------------------\n# aclocal traces this macro to find the Autoconf version.\n# This is a private macro too.  Using m4_define simplifies\n# the logic in aclocal, which can simply ignore this definition.\nm4_define([_AM_AUTOCONF_VERSION], [])\n\n# AM_SET_CURRENT_AUTOMAKE_VERSION\n# -------------------------------\n# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.\n# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.\nAC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],\n[AM_AUTOMAKE_VERSION([1.11.1])dnl\nm4_ifndef([AC_AUTOCONF_VERSION],\n  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl\n_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])\n\n# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-\n\n# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets\n# $ac_aux_dir to `$srcdir/foo'.  In other projects, it is set to\n# `$srcdir', `$srcdir/..', or `$srcdir/../..'.\n#\n# Of course, Automake must honor this variable whenever it calls a\n# tool from the auxiliary directory.  The problem is that $srcdir (and\n# therefore $ac_aux_dir as well) can be either absolute or relative,\n# depending on how configure is run.  This is pretty annoying, since\n# it makes $ac_aux_dir quite unusable in subdirectories: in the top\n# source directory, any form will work fine, but in subdirectories a\n# relative path needs to be adjusted first.\n#\n# $ac_aux_dir/missing\n#    fails when called from a subdirectory if $ac_aux_dir is relative\n# $top_srcdir/$ac_aux_dir/missing\n#    fails if $ac_aux_dir is absolute,\n#    fails when called from a subdirectory in a VPATH build with\n#          a relative $ac_aux_dir\n#\n# The reason of the latter failure is that $top_srcdir and $ac_aux_dir\n# are both prefixed by $srcdir.  In an in-source build this is usually\n# harmless because $srcdir is `.', but things will broke when you\n# start a VPATH build or use an absolute $srcdir.\n#\n# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,\n# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:\n#   am_aux_dir='\\$(top_srcdir)/'`expr \"$ac_aux_dir\" : \"$srcdir//*\\(.*\\)\"`\n# and then we would define $MISSING as\n#   MISSING=\"\\${SHELL} $am_aux_dir/missing\"\n# This will work as long as MISSING is not called from configure, because\n# unfortunately $(top_srcdir) has no meaning in configure.\n# However there are other variables, like CC, which are often used in\n# configure, and could therefore not use this \"fixed\" $ac_aux_dir.\n#\n# Another solution, used here, is to always expand $ac_aux_dir to an\n# absolute PATH.  The drawback is that using absolute paths prevent a\n# configured tree to be moved without reconfiguration.\n\nAC_DEFUN([AM_AUX_DIR_EXPAND],\n[dnl Rely on autoconf to set up CDPATH properly.\nAC_PREREQ([2.50])dnl\n# expand $ac_aux_dir to an absolute path\nam_aux_dir=`cd $ac_aux_dir && pwd`\n])\n\n# AM_CONDITIONAL                                            -*- Autoconf -*-\n\n# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005, 2006, 2008\n# Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 9\n\n# AM_CONDITIONAL(NAME, SHELL-CONDITION)\n# -------------------------------------\n# Define a conditional.\nAC_DEFUN([AM_CONDITIONAL],\n[AC_PREREQ(2.52)dnl\n ifelse([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],\n\t[$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl\nAC_SUBST([$1_TRUE])dnl\nAC_SUBST([$1_FALSE])dnl\n_AM_SUBST_NOTMAKE([$1_TRUE])dnl\n_AM_SUBST_NOTMAKE([$1_FALSE])dnl\nm4_define([_AM_COND_VALUE_$1], [$2])dnl\nif $2; then\n  $1_TRUE=\n  $1_FALSE='#'\nelse\n  $1_TRUE='#'\n  $1_FALSE=\nfi\nAC_CONFIG_COMMANDS_PRE(\n[if test -z \"${$1_TRUE}\" && test -z \"${$1_FALSE}\"; then\n  AC_MSG_ERROR([[conditional \"$1\" was never defined.\nUsually this means the macro was only invoked conditionally.]])\nfi])])\n\n# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2009\n# Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 10\n\n# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be\n# written in clear, in which case automake, when reading aclocal.m4,\n# will think it sees a *use*, and therefore will trigger all it's\n# C support machinery.  Also note that it means that autoscan, seeing\n# CC etc. in the Makefile, will ask for an AC_PROG_CC use...\n\n\n# _AM_DEPENDENCIES(NAME)\n# ----------------------\n# See how the compiler implements dependency checking.\n# NAME is \"CC\", \"CXX\", \"GCJ\", or \"OBJC\".\n# We try a few techniques and use that to set a single cache variable.\n#\n# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was\n# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular\n# dependency, and given that the user is not expected to run this macro,\n# just rely on AC_PROG_CC.\nAC_DEFUN([_AM_DEPENDENCIES],\n[AC_REQUIRE([AM_SET_DEPDIR])dnl\nAC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl\nAC_REQUIRE([AM_MAKE_INCLUDE])dnl\nAC_REQUIRE([AM_DEP_TRACK])dnl\n\nifelse([$1], CC,   [depcc=\"$CC\"   am_compiler_list=],\n       [$1], CXX,  [depcc=\"$CXX\"  am_compiler_list=],\n       [$1], OBJC, [depcc=\"$OBJC\" am_compiler_list='gcc3 gcc'],\n       [$1], UPC,  [depcc=\"$UPC\"  am_compiler_list=],\n       [$1], GCJ,  [depcc=\"$GCJ\"  am_compiler_list='gcc3 gcc'],\n                   [depcc=\"$$1\"   am_compiler_list=])\n\nAC_CACHE_CHECK([dependency style of $depcc],\n               [am_cv_$1_dependencies_compiler_type],\n[if test -z \"$AMDEP_TRUE\" && test -f \"$am_depcomp\"; then\n  # We make a subdir and do the tests there.  Otherwise we can end up\n  # making bogus files that we don't know about and never remove.  For\n  # instance it was reported that on HP-UX the gcc test will end up\n  # making a dummy file named `D' -- because `-MD' means `put the output\n  # in D'.\n  mkdir conftest.dir\n  # Copy depcomp to subdir because otherwise we won't find it if we're\n  # using a relative directory.\n  cp \"$am_depcomp\" conftest.dir\n  cd conftest.dir\n  # We will build objects and dependencies in a subdirectory because\n  # it helps to detect inapplicable dependency modes.  For instance\n  # both Tru64's cc and ICC support -MD to output dependencies as a\n  # side effect of compilation, but ICC will put the dependencies in\n  # the current directory while Tru64 will put them in the object\n  # directory.\n  mkdir sub\n\n  am_cv_$1_dependencies_compiler_type=none\n  if test \"$am_compiler_list\" = \"\"; then\n     am_compiler_list=`sed -n ['s/^#*\\([a-zA-Z0-9]*\\))$/\\1/p'] < ./depcomp`\n  fi\n  am__universal=false\n  m4_case([$1], [CC],\n    [case \" $depcc \" in #(\n     *\\ -arch\\ *\\ -arch\\ *) am__universal=true ;;\n     esac],\n    [CXX],\n    [case \" $depcc \" in #(\n     *\\ -arch\\ *\\ -arch\\ *) am__universal=true ;;\n     esac])\n\n  for depmode in $am_compiler_list; do\n    # Setup a source with many dependencies, because some compilers\n    # like to wrap large dependency lists on column 80 (with \\), and\n    # we should not choose a depcomp mode which is confused by this.\n    #\n    # We need to recreate these files for each test, as the compiler may\n    # overwrite some of them when testing with obscure command lines.\n    # This happens at least with the AIX C compiler.\n    : > sub/conftest.c\n    for i in 1 2 3 4 5 6; do\n      echo '#include \"conftst'$i'.h\"' >> sub/conftest.c\n      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with\n      # Solaris 8's {/usr,}/bin/sh.\n      touch sub/conftst$i.h\n    done\n    echo \"${am__include} ${am__quote}sub/conftest.Po${am__quote}\" > confmf\n\n    # We check with `-c' and `-o' for the sake of the \"dashmstdout\"\n    # mode.  It turns out that the SunPro C++ compiler does not properly\n    # handle `-M -o', and we need to detect this.  Also, some Intel\n    # versions had trouble with output in subdirs\n    am__obj=sub/conftest.${OBJEXT-o}\n    am__minus_obj=\"-o $am__obj\"\n    case $depmode in\n    gcc)\n      # This depmode causes a compiler race in universal mode.\n      test \"$am__universal\" = false || continue\n      ;;\n    nosideeffect)\n      # after this tag, mechanisms are not by side-effect, so they'll\n      # only be used when explicitly requested\n      if test \"x$enable_dependency_tracking\" = xyes; then\n\tcontinue\n      else\n\tbreak\n      fi\n      ;;\n    msvisualcpp | msvcmsys)\n      # This compiler won't grok `-c -o', but also, the minuso test has\n      # not run yet.  These depmodes are late enough in the game, and\n      # so weak that their functioning should not be impacted.\n      am__obj=conftest.${OBJEXT-o}\n      am__minus_obj=\n      ;;\n    none) break ;;\n    esac\n    if depmode=$depmode \\\n       source=sub/conftest.c object=$am__obj \\\n       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \\\n       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \\\n         >/dev/null 2>conftest.err &&\n       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&\n       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then\n      # icc doesn't choke on unknown options, it will just issue warnings\n      # or remarks (even with -Werror).  So we grep stderr for any message\n      # that says an option was ignored or not supported.\n      # When given -MP, icc 7.0 and 7.1 complain thusly:\n      #   icc: Command line warning: ignoring option '-M'; no argument required\n      # The diagnosis changed in icc 8.0:\n      #   icc: Command line remark: option '-MP' not supported\n      if (grep 'ignoring option' conftest.err ||\n          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else\n        am_cv_$1_dependencies_compiler_type=$depmode\n        break\n      fi\n    fi\n  done\n\n  cd ..\n  rm -rf conftest.dir\nelse\n  am_cv_$1_dependencies_compiler_type=none\nfi\n])\nAC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])\nAM_CONDITIONAL([am__fastdep$1], [\n  test \"x$enable_dependency_tracking\" != xno \\\n  && test \"$am_cv_$1_dependencies_compiler_type\" = gcc3])\n])\n\n\n# AM_SET_DEPDIR\n# -------------\n# Choose a directory name for dependency files.\n# This macro is AC_REQUIREd in _AM_DEPENDENCIES\nAC_DEFUN([AM_SET_DEPDIR],\n[AC_REQUIRE([AM_SET_LEADING_DOT])dnl\nAC_SUBST([DEPDIR], [\"${am__leading_dot}deps\"])dnl\n])\n\n\n# AM_DEP_TRACK\n# ------------\nAC_DEFUN([AM_DEP_TRACK],\n[AC_ARG_ENABLE(dependency-tracking,\n[  --disable-dependency-tracking  speeds up one-time build\n  --enable-dependency-tracking   do not reject slow dependency extractors])\nif test \"x$enable_dependency_tracking\" != xno; then\n  am_depcomp=\"$ac_aux_dir/depcomp\"\n  AMDEPBACKSLASH='\\'\nfi\nAM_CONDITIONAL([AMDEP], [test \"x$enable_dependency_tracking\" != xno])\nAC_SUBST([AMDEPBACKSLASH])dnl\n_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl\n])\n\n# Generate code to set up dependency tracking.              -*- Autoconf -*-\n\n# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2008\n# Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n#serial 5\n\n# _AM_OUTPUT_DEPENDENCY_COMMANDS\n# ------------------------------\nAC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],\n[{\n  # Autoconf 2.62 quotes --file arguments for eval, but not when files\n  # are listed without --file.  Let's play safe and only enable the eval\n  # if we detect the quoting.\n  case $CONFIG_FILES in\n  *\\'*) eval set x \"$CONFIG_FILES\" ;;\n  *)   set x $CONFIG_FILES ;;\n  esac\n  shift\n  for mf\n  do\n    # Strip MF so we end up with the name of the file.\n    mf=`echo \"$mf\" | sed -e 's/:.*$//'`\n    # Check whether this is an Automake generated Makefile or not.\n    # We used to match only the files named `Makefile.in', but\n    # some people rename them; so instead we look at the file content.\n    # Grep'ing the first line is not enough: some people post-process\n    # each Makefile.in and add a new line on top of each file to say so.\n    # Grep'ing the whole file is not good either: AIX grep has a line\n    # limit of 2048, but all sed's we know have understand at least 4000.\n    if sed -n 's,^#.*generated by automake.*,X,p' \"$mf\" | grep X >/dev/null 2>&1; then\n      dirpart=`AS_DIRNAME(\"$mf\")`\n    else\n      continue\n    fi\n    # Extract the definition of DEPDIR, am__include, and am__quote\n    # from the Makefile without running `make'.\n    DEPDIR=`sed -n 's/^DEPDIR = //p' < \"$mf\"`\n    test -z \"$DEPDIR\" && continue\n    am__include=`sed -n 's/^am__include = //p' < \"$mf\"`\n    test -z \"am__include\" && continue\n    am__quote=`sed -n 's/^am__quote = //p' < \"$mf\"`\n    # When using ansi2knr, U may be empty or an underscore; expand it\n    U=`sed -n 's/^U = //p' < \"$mf\"`\n    # Find all dependency output files, they are included files with\n    # $(DEPDIR) in their names.  We invoke sed twice because it is the\n    # simplest approach to changing $(DEPDIR) to its actual value in the\n    # expansion.\n    for file in `sed -n \"\n      s/^$am__include $am__quote\\(.*(DEPDIR).*\\)$am__quote\"'$/\\1/p' <\"$mf\" | \\\n\t sed -e 's/\\$(DEPDIR)/'\"$DEPDIR\"'/g' -e 's/\\$U/'\"$U\"'/g'`; do\n      # Make sure the directory exists.\n      test -f \"$dirpart/$file\" && continue\n      fdir=`AS_DIRNAME([\"$file\"])`\n      AS_MKDIR_P([$dirpart/$fdir])\n      # echo \"creating $dirpart/$file\"\n      echo '# dummy' > \"$dirpart/$file\"\n    done\n  done\n}\n])# _AM_OUTPUT_DEPENDENCY_COMMANDS\n\n\n# AM_OUTPUT_DEPENDENCY_COMMANDS\n# -----------------------------\n# This macro should only be invoked once -- use via AC_REQUIRE.\n#\n# This code is only required when automatic dependency tracking\n# is enabled.  FIXME.  This creates each `.P' file that we will\n# need in order to bootstrap the dependency handling code.\nAC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],\n[AC_CONFIG_COMMANDS([depfiles],\n     [test x\"$AMDEP_TRUE\" != x\"\" || _AM_OUTPUT_DEPENDENCY_COMMANDS],\n     [AMDEP_TRUE=\"$AMDEP_TRUE\" ac_aux_dir=\"$ac_aux_dir\"])\n])\n\n# Do all the work for Automake.                             -*- Autoconf -*-\n\n# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,\n# 2005, 2006, 2008, 2009 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 16\n\n# This macro actually does too much.  Some checks are only needed if\n# your package does certain things.  But this isn't really a big deal.\n\n# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])\n# AM_INIT_AUTOMAKE([OPTIONS])\n# -----------------------------------------------\n# The call with PACKAGE and VERSION arguments is the old style\n# call (pre autoconf-2.50), which is being phased out.  PACKAGE\n# and VERSION should now be passed to AC_INIT and removed from\n# the call to AM_INIT_AUTOMAKE.\n# We support both call styles for the transition.  After\n# the next Automake release, Autoconf can make the AC_INIT\n# arguments mandatory, and then we can depend on a new Autoconf\n# release and drop the old call support.\nAC_DEFUN([AM_INIT_AUTOMAKE],\n[AC_PREREQ([2.62])dnl\ndnl Autoconf wants to disallow AM_ names.  We explicitly allow\ndnl the ones we care about.\nm4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl\nAC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl\nAC_REQUIRE([AC_PROG_INSTALL])dnl\nif test \"`cd $srcdir && pwd`\" != \"`pwd`\"; then\n  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output\n  # is not polluted with repeated \"-I.\"\n  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl\n  # test to see if srcdir already configured\n  if test -f $srcdir/config.status; then\n    AC_MSG_ERROR([source directory already configured; run \"make distclean\" there first])\n  fi\nfi\n\n# test whether we have cygpath\nif test -z \"$CYGPATH_W\"; then\n  if (cygpath --version) >/dev/null 2>/dev/null; then\n    CYGPATH_W='cygpath -w'\n  else\n    CYGPATH_W=echo\n  fi\nfi\nAC_SUBST([CYGPATH_W])\n\n# Define the identity of the package.\ndnl Distinguish between old-style and new-style calls.\nm4_ifval([$2],\n[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl\n AC_SUBST([PACKAGE], [$1])dnl\n AC_SUBST([VERSION], [$2])],\n[_AM_SET_OPTIONS([$1])dnl\ndnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.\nm4_if(m4_ifdef([AC_PACKAGE_NAME], 1)m4_ifdef([AC_PACKAGE_VERSION], 1), 11,,\n  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl\n AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl\n AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl\n\n_AM_IF_OPTION([no-define],,\n[AC_DEFINE_UNQUOTED(PACKAGE, \"$PACKAGE\", [Name of package])\n AC_DEFINE_UNQUOTED(VERSION, \"$VERSION\", [Version number of package])])dnl\n\n# Some tools Automake needs.\nAC_REQUIRE([AM_SANITY_CHECK])dnl\nAC_REQUIRE([AC_ARG_PROGRAM])dnl\nAM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})\nAM_MISSING_PROG(AUTOCONF, autoconf)\nAM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})\nAM_MISSING_PROG(AUTOHEADER, autoheader)\nAM_MISSING_PROG(MAKEINFO, makeinfo)\nAC_REQUIRE([AM_PROG_INSTALL_SH])dnl\nAC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl\nAC_REQUIRE([AM_PROG_MKDIR_P])dnl\n# We need awk for the \"check\" target.  The system \"awk\" is bad on\n# some platforms.\nAC_REQUIRE([AC_PROG_AWK])dnl\nAC_REQUIRE([AC_PROG_MAKE_SET])dnl\nAC_REQUIRE([AM_SET_LEADING_DOT])dnl\n_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],\n\t      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],\n\t\t\t     [_AM_PROG_TAR([v7])])])\n_AM_IF_OPTION([no-dependencies],,\n[AC_PROVIDE_IFELSE([AC_PROG_CC],\n\t\t  [_AM_DEPENDENCIES(CC)],\n\t\t  [define([AC_PROG_CC],\n\t\t\t  defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl\nAC_PROVIDE_IFELSE([AC_PROG_CXX],\n\t\t  [_AM_DEPENDENCIES(CXX)],\n\t\t  [define([AC_PROG_CXX],\n\t\t\t  defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl\nAC_PROVIDE_IFELSE([AC_PROG_OBJC],\n\t\t  [_AM_DEPENDENCIES(OBJC)],\n\t\t  [define([AC_PROG_OBJC],\n\t\t\t  defn([AC_PROG_OBJC])[_AM_DEPENDENCIES(OBJC)])])dnl\n])\n_AM_IF_OPTION([silent-rules], [AC_REQUIRE([AM_SILENT_RULES])])dnl\ndnl The `parallel-tests' driver may need to know about EXEEXT, so add the\ndnl `am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This macro\ndnl is hooked onto _AC_COMPILER_EXEEXT early, see below.\nAC_CONFIG_COMMANDS_PRE(dnl\n[m4_provide_if([_AM_COMPILER_EXEEXT],\n  [AM_CONDITIONAL([am__EXEEXT], [test -n \"$EXEEXT\"])])])dnl\n])\n\ndnl Hook into `_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not\ndnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further\ndnl mangled by Autoconf and run in a shell conditional statement.\nm4_define([_AC_COMPILER_EXEEXT],\nm4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])\n\n\n# When config.status generates a header, we must update the stamp-h file.\n# This file resides in the same directory as the config header\n# that is generated.  The stamp files are numbered to have different names.\n\n# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the\n# loop where config.status creates the headers, so we can generate\n# our stamp files there.\nAC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],\n[# Compute $1's index in $config_headers.\n_am_arg=$1\n_am_stamp_count=1\nfor _am_header in $config_headers :; do\n  case $_am_header in\n    $_am_arg | $_am_arg:* )\n      break ;;\n    * )\n      _am_stamp_count=`expr $_am_stamp_count + 1` ;;\n  esac\ndone\necho \"timestamp for $_am_arg\" >`AS_DIRNAME([\"$_am_arg\"])`/stamp-h[]$_am_stamp_count])\n\n# Copyright (C) 2001, 2003, 2005, 2008  Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_PROG_INSTALL_SH\n# ------------------\n# Define $install_sh.\nAC_DEFUN([AM_PROG_INSTALL_SH],\n[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl\nif test x\"${install_sh}\" != xset; then\n  case $am_aux_dir in\n  *\\ * | *\\\t*)\n    install_sh=\"\\${SHELL} '$am_aux_dir/install-sh'\" ;;\n  *)\n    install_sh=\"\\${SHELL} $am_aux_dir/install-sh\"\n  esac\nfi\nAC_SUBST(install_sh)])\n\n# Copyright (C) 2003, 2005  Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 2\n\n# Check whether the underlying file-system supports filenames\n# with a leading dot.  For instance MS-DOS doesn't.\nAC_DEFUN([AM_SET_LEADING_DOT],\n[rm -rf .tst 2>/dev/null\nmkdir .tst 2>/dev/null\nif test -d .tst; then\n  am__leading_dot=.\nelse\n  am__leading_dot=_\nfi\nrmdir .tst 2>/dev/null\nAC_SUBST([am__leading_dot])])\n\n# Check to see how 'make' treats includes.\t            -*- Autoconf -*-\n\n# Copyright (C) 2001, 2002, 2003, 2005, 2009  Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 4\n\n# AM_MAKE_INCLUDE()\n# -----------------\n# Check to see how make treats includes.\nAC_DEFUN([AM_MAKE_INCLUDE],\n[am_make=${MAKE-make}\ncat > confinc << 'END'\nam__doit:\n\t@echo this is the am__doit target\n.PHONY: am__doit\nEND\n# If we don't find an include directive, just comment out the code.\nAC_MSG_CHECKING([for style of include used by $am_make])\nam__include=\"#\"\nam__quote=\n_am_result=none\n# First try GNU make style include.\necho \"include confinc\" > confmf\n# Ignore all kinds of additional output from `make'.\ncase `$am_make -s -f confmf 2> /dev/null` in #(\n*the\\ am__doit\\ target*)\n  am__include=include\n  am__quote=\n  _am_result=GNU\n  ;;\nesac\n# Now try BSD make style include.\nif test \"$am__include\" = \"#\"; then\n   echo '.include \"confinc\"' > confmf\n   case `$am_make -s -f confmf 2> /dev/null` in #(\n   *the\\ am__doit\\ target*)\n     am__include=.include\n     am__quote=\"\\\"\"\n     _am_result=BSD\n     ;;\n   esac\nfi\nAC_SUBST([am__include])\nAC_SUBST([am__quote])\nAC_MSG_RESULT([$_am_result])\nrm -f confinc confmf\n])\n\n# Copyright (C) 1999, 2000, 2001, 2003, 2004, 2005, 2008\n# Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 6\n\n# AM_PROG_CC_C_O\n# --------------\n# Like AC_PROG_CC_C_O, but changed for automake.\nAC_DEFUN([AM_PROG_CC_C_O],\n[AC_REQUIRE([AC_PROG_CC_C_O])dnl\nAC_REQUIRE([AM_AUX_DIR_EXPAND])dnl\nAC_REQUIRE_AUX_FILE([compile])dnl\n# FIXME: we rely on the cache variable name because\n# there is no other way.\nset dummy $CC\nam_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']`\neval am_t=\\$ac_cv_prog_cc_${am_cc}_c_o\nif test \"$am_t\" != yes; then\n   # Losing compiler, so override with the script.\n   # FIXME: It is wrong to rewrite CC.\n   # But if we don't then we get into trouble of one sort or another.\n   # A longer-term fix would be to have automake use am__CC in this case,\n   # and then we could set am__CC=\"\\$(top_srcdir)/compile \\$(CC)\"\n   CC=\"$am_aux_dir/compile $CC\"\nfi\ndnl Make sure AC_PROG_CC is never called again, or it will override our\ndnl setting of CC.\nm4_define([AC_PROG_CC],\n          [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])])\n])\n\n# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-\n\n# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2004, 2005, 2008\n# Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 6\n\n# AM_MISSING_PROG(NAME, PROGRAM)\n# ------------------------------\nAC_DEFUN([AM_MISSING_PROG],\n[AC_REQUIRE([AM_MISSING_HAS_RUN])\n$1=${$1-\"${am_missing_run}$2\"}\nAC_SUBST($1)])\n\n\n# AM_MISSING_HAS_RUN\n# ------------------\n# Define MISSING if not defined so far and test if it supports --run.\n# If it does, set am_missing_run to use it, otherwise, to nothing.\nAC_DEFUN([AM_MISSING_HAS_RUN],\n[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl\nAC_REQUIRE_AUX_FILE([missing])dnl\nif test x\"${MISSING+set}\" != xset; then\n  case $am_aux_dir in\n  *\\ * | *\\\t*)\n    MISSING=\"\\${SHELL} \\\"$am_aux_dir/missing\\\"\" ;;\n  *)\n    MISSING=\"\\${SHELL} $am_aux_dir/missing\" ;;\n  esac\nfi\n# Use eval to expand $SHELL\nif eval \"$MISSING --run true\"; then\n  am_missing_run=\"$MISSING --run \"\nelse\n  am_missing_run=\n  AC_MSG_WARN([`missing' script is too old or missing])\nfi\n])\n\n# Copyright (C) 2003, 2004, 2005, 2006  Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_PROG_MKDIR_P\n# ---------------\n# Check for `mkdir -p'.\nAC_DEFUN([AM_PROG_MKDIR_P],\n[AC_PREREQ([2.60])dnl\nAC_REQUIRE([AC_PROG_MKDIR_P])dnl\ndnl Automake 1.8 to 1.9.6 used to define mkdir_p.  We now use MKDIR_P,\ndnl while keeping a definition of mkdir_p for backward compatibility.\ndnl @MKDIR_P@ is magic: AC_OUTPUT adjusts its value for each Makefile.\ndnl However we cannot define mkdir_p as $(MKDIR_P) for the sake of\ndnl Makefile.ins that do not define MKDIR_P, so we do our own\ndnl adjustment using top_builddir (which is defined more often than\ndnl MKDIR_P).\nAC_SUBST([mkdir_p], [\"$MKDIR_P\"])dnl\ncase $mkdir_p in\n  [[\\\\/$]]* | ?:[[\\\\/]]*) ;;\n  */*) mkdir_p=\"\\$(top_builddir)/$mkdir_p\" ;;\nesac\n])\n\n# Helper functions for option handling.                     -*- Autoconf -*-\n\n# Copyright (C) 2001, 2002, 2003, 2005, 2008  Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 4\n\n# _AM_MANGLE_OPTION(NAME)\n# -----------------------\nAC_DEFUN([_AM_MANGLE_OPTION],\n[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])\n\n# _AM_SET_OPTION(NAME)\n# ------------------------------\n# Set option NAME.  Presently that only means defining a flag for this option.\nAC_DEFUN([_AM_SET_OPTION],\n[m4_define(_AM_MANGLE_OPTION([$1]), 1)])\n\n# _AM_SET_OPTIONS(OPTIONS)\n# ----------------------------------\n# OPTIONS is a space-separated list of Automake options.\nAC_DEFUN([_AM_SET_OPTIONS],\n[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])\n\n# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])\n# -------------------------------------------\n# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.\nAC_DEFUN([_AM_IF_OPTION],\n[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])\n\n# Check to make sure that the build environment is sane.    -*- Autoconf -*-\n\n# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005, 2008\n# Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 5\n\n# AM_SANITY_CHECK\n# ---------------\nAC_DEFUN([AM_SANITY_CHECK],\n[AC_MSG_CHECKING([whether build environment is sane])\n# Just in case\nsleep 1\necho timestamp > conftest.file\n# Reject unsafe characters in $srcdir or the absolute working directory\n# name.  Accept space and tab only in the latter.\nam_lf='\n'\ncase `pwd` in\n  *[[\\\\\\\"\\#\\$\\&\\'\\`$am_lf]]*)\n    AC_MSG_ERROR([unsafe absolute working directory name]);;\nesac\ncase $srcdir in\n  *[[\\\\\\\"\\#\\$\\&\\'\\`$am_lf\\ \\\t]]*)\n    AC_MSG_ERROR([unsafe srcdir value: `$srcdir']);;\nesac\n\n# Do `set' in a subshell so we don't clobber the current shell's\n# arguments.  Must try -L first in case configure is actually a\n# symlink; some systems play weird games with the mod time of symlinks\n# (eg FreeBSD returns the mod time of the symlink's containing\n# directory).\nif (\n   set X `ls -Lt \"$srcdir/configure\" conftest.file 2> /dev/null`\n   if test \"$[*]\" = \"X\"; then\n      # -L didn't work.\n      set X `ls -t \"$srcdir/configure\" conftest.file`\n   fi\n   rm -f conftest.file\n   if test \"$[*]\" != \"X $srcdir/configure conftest.file\" \\\n      && test \"$[*]\" != \"X conftest.file $srcdir/configure\"; then\n\n      # If neither matched, then we have a broken ls.  This can happen\n      # if, for instance, CONFIG_SHELL is bash and it inherits a\n      # broken ls alias from the environment.  This has actually\n      # happened.  Such a system could not be considered \"sane\".\n      AC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken\nalias in your environment])\n   fi\n\n   test \"$[2]\" = conftest.file\n   )\nthen\n   # Ok.\n   :\nelse\n   AC_MSG_ERROR([newly created file is older than distributed files!\nCheck your system clock])\nfi\nAC_MSG_RESULT(yes)])\n\n# Copyright (C) 2001, 2003, 2005  Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_PROG_INSTALL_STRIP\n# ---------------------\n# One issue with vendor `install' (even GNU) is that you can't\n# specify the program used to strip binaries.  This is especially\n# annoying in cross-compiling environments, where the build's strip\n# is unlikely to handle the host's binaries.\n# Fortunately install-sh will honor a STRIPPROG variable, so we\n# always use install-sh in `make install-strip', and initialize\n# STRIPPROG with the value of the STRIP variable (set by the user).\nAC_DEFUN([AM_PROG_INSTALL_STRIP],\n[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl\n# Installed binaries are usually stripped using `strip' when the user\n# run `make install-strip'.  However `strip' might not be the right\n# tool to use in cross-compilation environments, therefore Automake\n# will honor the `STRIP' environment variable to overrule this program.\ndnl Don't test for $cross_compiling = yes, because it might be `maybe'.\nif test \"$cross_compiling\" != no; then\n  AC_CHECK_TOOL([STRIP], [strip], :)\nfi\nINSTALL_STRIP_PROGRAM=\"\\$(install_sh) -c -s\"\nAC_SUBST([INSTALL_STRIP_PROGRAM])])\n\n# Copyright (C) 2006, 2008  Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 2\n\n# _AM_SUBST_NOTMAKE(VARIABLE)\n# ---------------------------\n# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.\n# This macro is traced by Automake.\nAC_DEFUN([_AM_SUBST_NOTMAKE])\n\n# AM_SUBST_NOTMAKE(VARIABLE)\n# ---------------------------\n# Public sister of _AM_SUBST_NOTMAKE.\nAC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])\n\n# Check how to create a tarball.                            -*- Autoconf -*-\n\n# Copyright (C) 2004, 2005  Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# serial 2\n\n# _AM_PROG_TAR(FORMAT)\n# --------------------\n# Check how to create a tarball in format FORMAT.\n# FORMAT should be one of `v7', `ustar', or `pax'.\n#\n# Substitute a variable $(am__tar) that is a command\n# writing to stdout a FORMAT-tarball containing the directory\n# $tardir.\n#     tardir=directory && $(am__tar) > result.tar\n#\n# Substitute a variable $(am__untar) that extract such\n# a tarball read from stdin.\n#     $(am__untar) < result.tar\nAC_DEFUN([_AM_PROG_TAR],\n[# Always define AMTAR for backward compatibility.\nAM_MISSING_PROG([AMTAR], [tar])\nm4_if([$1], [v7],\n     [am__tar='${AMTAR} chof - \"$$tardir\"'; am__untar='${AMTAR} xf -'],\n     [m4_case([$1], [ustar],, [pax],,\n              [m4_fatal([Unknown tar format])])\nAC_MSG_CHECKING([how to create a $1 tar archive])\n# Loop over all known methods to create a tar archive until one works.\n_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'\n_am_tools=${am_cv_prog_tar_$1-$_am_tools}\n# Do not fold the above two line into one, because Tru64 sh and\n# Solaris sh will not grok spaces in the rhs of `-'.\nfor _am_tool in $_am_tools\ndo\n  case $_am_tool in\n  gnutar)\n    for _am_tar in tar gnutar gtar;\n    do\n      AM_RUN_LOG([$_am_tar --version]) && break\n    done\n    am__tar=\"$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - \"'\"$$tardir\"'\n    am__tar_=\"$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - \"'\"$tardir\"'\n    am__untar=\"$_am_tar -xf -\"\n    ;;\n  plaintar)\n    # Must skip GNU tar: if it does not support --format= it doesn't create\n    # ustar tarball either.\n    (tar --version) >/dev/null 2>&1 && continue\n    am__tar='tar chf - \"$$tardir\"'\n    am__tar_='tar chf - \"$tardir\"'\n    am__untar='tar xf -'\n    ;;\n  pax)\n    am__tar='pax -L -x $1 -w \"$$tardir\"'\n    am__tar_='pax -L -x $1 -w \"$tardir\"'\n    am__untar='pax -r'\n    ;;\n  cpio)\n    am__tar='find \"$$tardir\" -print | cpio -o -H $1 -L'\n    am__tar_='find \"$tardir\" -print | cpio -o -H $1 -L'\n    am__untar='cpio -i -H $1 -d'\n    ;;\n  none)\n    am__tar=false\n    am__tar_=false\n    am__untar=false\n    ;;\n  esac\n\n  # If the value was cached, stop now.  We just wanted to have am__tar\n  # and am__untar set.\n  test -n \"${am_cv_prog_tar_$1}\" && break\n\n  # tar/untar a dummy directory, and stop if the command works\n  rm -rf conftest.dir\n  mkdir conftest.dir\n  echo GrepMe > conftest.dir/file\n  AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])\n  rm -rf conftest.dir\n  if test -s conftest.tar; then\n    AM_RUN_LOG([$am__untar <conftest.tar])\n    grep GrepMe conftest.dir/file >/dev/null 2>&1 && break\n  fi\ndone\nrm -rf conftest.dir\n\nAC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])\nAC_MSG_RESULT([$am_cv_prog_tar_$1])])\nAC_SUBST([am__tar])\nAC_SUBST([am__untar])\n]) # _AM_PROG_TAR\n\nm4_include([m4/libtool.m4])\nm4_include([m4/ltoptions.m4])\nm4_include([m4/ltsugar.m4])\nm4_include([m4/ltversion.m4])\nm4_include([m4/lt~obsolete.m4])\n"
  },
  {
    "path": "src/Onigmo/compile",
    "content": "#! /bin/sh\n# Wrapper for compilers which do not understand `-c -o'.\n\nscriptversion=2009-10-06.20; # UTC\n\n# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2009  Free Software\n# Foundation, Inc.\n# Written by Tom Tromey <tromey@cygnus.com>.\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2, or (at your option)\n# any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n# This file is maintained in Automake, please report\n# bugs to <bug-automake@gnu.org> or send patches to\n# <automake-patches@gnu.org>.\n\ncase $1 in\n  '')\n     echo \"$0: No command.  Try \\`$0 --help' for more information.\" 1>&2\n     exit 1;\n     ;;\n  -h | --h*)\n    cat <<\\EOF\nUsage: compile [--help] [--version] PROGRAM [ARGS]\n\nWrapper for compilers which do not understand `-c -o'.\nRemove `-o dest.o' from ARGS, run PROGRAM with the remaining\narguments, and rename the output as expected.\n\nIf you are trying to build a whole package this is not the\nright script to run: please start by reading the file `INSTALL'.\n\nReport bugs to <bug-automake@gnu.org>.\nEOF\n    exit $?\n    ;;\n  -v | --v*)\n    echo \"compile $scriptversion\"\n    exit $?\n    ;;\nesac\n\nofile=\ncfile=\neat=\n\nfor arg\ndo\n  if test -n \"$eat\"; then\n    eat=\n  else\n    case $1 in\n      -o)\n\t# configure might choose to run compile as `compile cc -o foo foo.c'.\n\t# So we strip `-o arg' only if arg is an object.\n\teat=1\n\tcase $2 in\n\t  *.o | *.obj)\n\t    ofile=$2\n\t    ;;\n\t  *)\n\t    set x \"$@\" -o \"$2\"\n\t    shift\n\t    ;;\n\tesac\n\t;;\n      *.c)\n\tcfile=$1\n\tset x \"$@\" \"$1\"\n\tshift\n\t;;\n      *)\n\tset x \"$@\" \"$1\"\n\tshift\n\t;;\n    esac\n  fi\n  shift\ndone\n\nif test -z \"$ofile\" || test -z \"$cfile\"; then\n  # If no `-o' option was seen then we might have been invoked from a\n  # pattern rule where we don't need one.  That is ok -- this is a\n  # normal compilation that the losing compiler can handle.  If no\n  # `.c' file was seen then we are probably linking.  That is also\n  # ok.\n  exec \"$@\"\nfi\n\n# Name of file we expect compiler to create.\ncofile=`echo \"$cfile\" | sed 's|^.*[\\\\/]||; s|^[a-zA-Z]:||; s/\\.c$/.o/'`\n\n# Create the lock directory.\n# Note: use `[/\\\\:.-]' here to ensure that we don't use the same name\n# that we are using for the .o file.  Also, base the name on the expected\n# object file name, since that is what matters with a parallel build.\nlockdir=`echo \"$cofile\" | sed -e 's|[/\\\\:.-]|_|g'`.d\nwhile true; do\n  if mkdir \"$lockdir\" >/dev/null 2>&1; then\n    break\n  fi\n  sleep 1\ndone\n# FIXME: race condition here if user kills between mkdir and trap.\ntrap \"rmdir '$lockdir'; exit 1\" 1 2 15\n\n# Run the compile.\n\"$@\"\nret=$?\n\nif test -f \"$cofile\"; then\n  test \"$cofile\" = \"$ofile\" || mv \"$cofile\" \"$ofile\"\nelif test -f \"${cofile}bj\"; then\n  test \"${cofile}bj\" = \"$ofile\" || mv \"${cofile}bj\" \"$ofile\"\nfi\n\nrmdir \"$lockdir\"\nexit $ret\n\n# Local Variables:\n# mode: shell-script\n# sh-indentation: 2\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"scriptversion=\"\n# time-stamp-format: \"%:y-%02m-%02d.%02H\"\n# time-stamp-time-zone: \"UTC\"\n# time-stamp-end: \"; # UTC\"\n# End:\n"
  },
  {
    "path": "src/Onigmo/config.guess",
    "content": "#! /bin/sh\n# Attempt to guess a canonical system name.\n#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,\n#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010\n#   Free Software Foundation, Inc.\n\ntimestamp='2009-12-30'\n\n# This file is free software; you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA\n# 02110-1301, USA.\n#\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n\n# Originally written by Per Bothner.  Please send patches (context\n# diff format) to <config-patches@gnu.org> and include a ChangeLog\n# entry.\n#\n# This script attempts to guess a canonical system name similar to\n# config.sub.  If it succeeds, it prints the system name on stdout, and\n# exits with 0.  Otherwise, it exits with 1.\n#\n# You can get the latest version of this script from:\n# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD\n\nme=`echo \"$0\" | sed -e 's,.*/,,'`\n\nusage=\"\\\nUsage: $0 [OPTION]\n\nOutput the configuration name of the system \\`$me' is run on.\n\nOperation modes:\n  -h, --help         print this help, then exit\n  -t, --time-stamp   print date of last modification, then exit\n  -v, --version      print version number, then exit\n\nReport bugs and patches to <config-patches@gnu.org>.\"\n\nversion=\"\\\nGNU config.guess ($timestamp)\n\nOriginally written by Per Bothner.\nCopyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,\n2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free\nSoftware Foundation, Inc.\n\nThis is free software; see the source for copying conditions.  There is NO\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\"\n\nhelp=\"\nTry \\`$me --help' for more information.\"\n\n# Parse command line\nwhile test $# -gt 0 ; do\n  case $1 in\n    --time-stamp | --time* | -t )\n       echo \"$timestamp\" ; exit ;;\n    --version | -v )\n       echo \"$version\" ; exit ;;\n    --help | --h* | -h )\n       echo \"$usage\"; exit ;;\n    -- )     # Stop option processing\n       shift; break ;;\n    - )\t# Use stdin as input.\n       break ;;\n    -* )\n       echo \"$me: invalid option $1$help\" >&2\n       exit 1 ;;\n    * )\n       break ;;\n  esac\ndone\n\nif test $# != 0; then\n  echo \"$me: too many arguments$help\" >&2\n  exit 1\nfi\n\ntrap 'exit 1' 1 2 15\n\n# CC_FOR_BUILD -- compiler used by this script. Note that the use of a\n# compiler to aid in system detection is discouraged as it requires\n# temporary files to be created and, as you can see below, it is a\n# headache to deal with in a portable fashion.\n\n# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still\n# use `HOST_CC' if defined, but it is deprecated.\n\n# Portable tmp directory creation inspired by the Autoconf team.\n\nset_cc_for_build='\ntrap \"exitcode=\\$?; (rm -f \\$tmpfiles 2>/dev/null; rmdir \\$tmp 2>/dev/null) && exit \\$exitcode\" 0 ;\ntrap \"rm -f \\$tmpfiles 2>/dev/null; rmdir \\$tmp 2>/dev/null; exit 1\" 1 2 13 15 ;\n: ${TMPDIR=/tmp} ;\n { tmp=`(umask 077 && mktemp -d \"$TMPDIR/cgXXXXXX\") 2>/dev/null` && test -n \"$tmp\" && test -d \"$tmp\" ; } ||\n { test -n \"$RANDOM\" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||\n { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo \"Warning: creating insecure temp directory\" >&2 ; } ||\n { echo \"$me: cannot create a temporary directory in $TMPDIR\" >&2 ; exit 1 ; } ;\ndummy=$tmp/dummy ;\ntmpfiles=\"$dummy.c $dummy.o $dummy.rel $dummy\" ;\ncase $CC_FOR_BUILD,$HOST_CC,$CC in\n ,,)    echo \"int x;\" > $dummy.c ;\n\tfor c in cc gcc c89 c99 ; do\n\t  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then\n\t     CC_FOR_BUILD=\"$c\"; break ;\n\t  fi ;\n\tdone ;\n\tif test x\"$CC_FOR_BUILD\" = x ; then\n\t  CC_FOR_BUILD=no_compiler_found ;\n\tfi\n\t;;\n ,,*)   CC_FOR_BUILD=$CC ;;\n ,*,*)  CC_FOR_BUILD=$HOST_CC ;;\nesac ; set_cc_for_build= ;'\n\n# This is needed to find uname on a Pyramid OSx when run in the BSD universe.\n# (ghazi@noc.rutgers.edu 1994-08-24)\nif (test -f /.attbin/uname) >/dev/null 2>&1 ; then\n\tPATH=$PATH:/.attbin ; export PATH\nfi\n\nUNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown\nUNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown\nUNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown\nUNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown\n\n# Note: order is significant - the case branches are not exclusive.\n\ncase \"${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}\" in\n    *:NetBSD:*:*)\n\t# NetBSD (nbsd) targets should (where applicable) match one or\n\t# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,\n\t# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently\n\t# switched to ELF, *-*-netbsd* would select the old\n\t# object file format.  This provides both forward\n\t# compatibility and a consistent mechanism for selecting the\n\t# object file format.\n\t#\n\t# Note: NetBSD doesn't particularly care about the vendor\n\t# portion of the name.  We always set it to \"unknown\".\n\tsysctl=\"sysctl -n hw.machine_arch\"\n\tUNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \\\n\t    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`\n\tcase \"${UNAME_MACHINE_ARCH}\" in\n\t    armeb) machine=armeb-unknown ;;\n\t    arm*) machine=arm-unknown ;;\n\t    sh3el) machine=shl-unknown ;;\n\t    sh3eb) machine=sh-unknown ;;\n\t    sh5el) machine=sh5le-unknown ;;\n\t    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;\n\tesac\n\t# The Operating System including object format, if it has switched\n\t# to ELF recently, or will in the future.\n\tcase \"${UNAME_MACHINE_ARCH}\" in\n\t    arm*|i386|m68k|ns32k|sh3*|sparc|vax)\n\t\teval $set_cc_for_build\n\t\tif echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \\\n\t\t\t| grep -q __ELF__\n\t\tthen\n\t\t    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).\n\t\t    # Return netbsd for either.  FIX?\n\t\t    os=netbsd\n\t\telse\n\t\t    os=netbsdelf\n\t\tfi\n\t\t;;\n\t    *)\n\t        os=netbsd\n\t\t;;\n\tesac\n\t# The OS release\n\t# Debian GNU/NetBSD machines have a different userland, and\n\t# thus, need a distinct triplet. However, they do not need\n\t# kernel version information, so it can be replaced with a\n\t# suitable tag, in the style of linux-gnu.\n\tcase \"${UNAME_VERSION}\" in\n\t    Debian*)\n\t\trelease='-gnu'\n\t\t;;\n\t    *)\n\t\trelease=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\\./'`\n\t\t;;\n\tesac\n\t# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:\n\t# contains redundant information, the shorter form:\n\t# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.\n\techo \"${machine}-${os}${release}\"\n\texit ;;\n    *:OpenBSD:*:*)\n\tUNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`\n\techo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}\n\texit ;;\n    *:ekkoBSD:*:*)\n\techo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}\n\texit ;;\n    *:SolidBSD:*:*)\n\techo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}\n\texit ;;\n    macppc:MirBSD:*:*)\n\techo powerpc-unknown-mirbsd${UNAME_RELEASE}\n\texit ;;\n    *:MirBSD:*:*)\n\techo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}\n\texit ;;\n    alpha:OSF1:*:*)\n\tcase $UNAME_RELEASE in\n\t*4.0)\n\t\tUNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`\n\t\t;;\n\t*5.*)\n\t        UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`\n\t\t;;\n\tesac\n\t# According to Compaq, /usr/sbin/psrinfo has been available on\n\t# OSF/1 and Tru64 systems produced since 1995.  I hope that\n\t# covers most systems running today.  This code pipes the CPU\n\t# types through head -n 1, so we only detect the type of CPU 0.\n\tALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \\(.*\\) processor.*$/\\1/p' | head -n 1`\n\tcase \"$ALPHA_CPU_TYPE\" in\n\t    \"EV4 (21064)\")\n\t\tUNAME_MACHINE=\"alpha\" ;;\n\t    \"EV4.5 (21064)\")\n\t\tUNAME_MACHINE=\"alpha\" ;;\n\t    \"LCA4 (21066/21068)\")\n\t\tUNAME_MACHINE=\"alpha\" ;;\n\t    \"EV5 (21164)\")\n\t\tUNAME_MACHINE=\"alphaev5\" ;;\n\t    \"EV5.6 (21164A)\")\n\t\tUNAME_MACHINE=\"alphaev56\" ;;\n\t    \"EV5.6 (21164PC)\")\n\t\tUNAME_MACHINE=\"alphapca56\" ;;\n\t    \"EV5.7 (21164PC)\")\n\t\tUNAME_MACHINE=\"alphapca57\" ;;\n\t    \"EV6 (21264)\")\n\t\tUNAME_MACHINE=\"alphaev6\" ;;\n\t    \"EV6.7 (21264A)\")\n\t\tUNAME_MACHINE=\"alphaev67\" ;;\n\t    \"EV6.8CB (21264C)\")\n\t\tUNAME_MACHINE=\"alphaev68\" ;;\n\t    \"EV6.8AL (21264B)\")\n\t\tUNAME_MACHINE=\"alphaev68\" ;;\n\t    \"EV6.8CX (21264D)\")\n\t\tUNAME_MACHINE=\"alphaev68\" ;;\n\t    \"EV6.9A (21264/EV69A)\")\n\t\tUNAME_MACHINE=\"alphaev69\" ;;\n\t    \"EV7 (21364)\")\n\t\tUNAME_MACHINE=\"alphaev7\" ;;\n\t    \"EV7.9 (21364A)\")\n\t\tUNAME_MACHINE=\"alphaev79\" ;;\n\tesac\n\t# A Pn.n version is a patched version.\n\t# A Vn.n version is a released version.\n\t# A Tn.n version is a released field test version.\n\t# A Xn.n version is an unreleased experimental baselevel.\n\t# 1.2 uses \"1.2\" for uname -r.\n\techo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`\n\texit ;;\n    Alpha\\ *:Windows_NT*:*)\n\t# How do we know it's Interix rather than the generic POSIX subsystem?\n\t# Should we change UNAME_MACHINE based on the output of uname instead\n\t# of the specific Alpha model?\n\techo alpha-pc-interix\n\texit ;;\n    21064:Windows_NT:50:3)\n\techo alpha-dec-winnt3.5\n\texit ;;\n    Amiga*:UNIX_System_V:4.0:*)\n\techo m68k-unknown-sysv4\n\texit ;;\n    *:[Aa]miga[Oo][Ss]:*:*)\n\techo ${UNAME_MACHINE}-unknown-amigaos\n\texit ;;\n    *:[Mm]orph[Oo][Ss]:*:*)\n\techo ${UNAME_MACHINE}-unknown-morphos\n\texit ;;\n    *:OS/390:*:*)\n\techo i370-ibm-openedition\n\texit ;;\n    *:z/VM:*:*)\n\techo s390-ibm-zvmoe\n\texit ;;\n    *:OS400:*:*)\n        echo powerpc-ibm-os400\n\texit ;;\n    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)\n\techo arm-acorn-riscix${UNAME_RELEASE}\n\texit ;;\n    arm:riscos:*:*|arm:RISCOS:*:*)\n\techo arm-unknown-riscos\n\texit ;;\n    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)\n\techo hppa1.1-hitachi-hiuxmpp\n\texit ;;\n    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)\n\t# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.\n\tif test \"`(/bin/universe) 2>/dev/null`\" = att ; then\n\t\techo pyramid-pyramid-sysv3\n\telse\n\t\techo pyramid-pyramid-bsd\n\tfi\n\texit ;;\n    NILE*:*:*:dcosx)\n\techo pyramid-pyramid-svr4\n\texit ;;\n    DRS?6000:unix:4.0:6*)\n\techo sparc-icl-nx6\n\texit ;;\n    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)\n\tcase `/usr/bin/uname -p` in\n\t    sparc) echo sparc-icl-nx7; exit ;;\n\tesac ;;\n    s390x:SunOS:*:*)\n\techo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    sun4H:SunOS:5.*:*)\n\techo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)\n\techo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)\n\techo i386-pc-auroraux${UNAME_RELEASE}\n\texit ;;\n    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)\n\teval $set_cc_for_build\n\tSUN_ARCH=\"i386\"\n\t# If there is a compiler, see if it is configured for 64-bit objects.\n\t# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.\n\t# This test works for both compilers.\n\tif [ \"$CC_FOR_BUILD\" != 'no_compiler_found' ]; then\n\t    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \\\n\t\t(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \\\n\t\tgrep IS_64BIT_ARCH >/dev/null\n\t    then\n\t\tSUN_ARCH=\"x86_64\"\n\t    fi\n\tfi\n\techo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    sun4*:SunOS:6*:*)\n\t# According to config.sub, this is the proper way to canonicalize\n\t# SunOS6.  Hard to guess exactly what SunOS6 will be like, but\n\t# it's likely to be more like Solaris than SunOS4.\n\techo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    sun4*:SunOS:*:*)\n\tcase \"`/usr/bin/arch -k`\" in\n\t    Series*|S4*)\n\t\tUNAME_RELEASE=`uname -v`\n\t\t;;\n\tesac\n\t# Japanese Language versions have a version number like `4.1.3-JL'.\n\techo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`\n\texit ;;\n    sun3*:SunOS:*:*)\n\techo m68k-sun-sunos${UNAME_RELEASE}\n\texit ;;\n    sun*:*:4.2BSD:*)\n\tUNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`\n\ttest \"x${UNAME_RELEASE}\" = \"x\" && UNAME_RELEASE=3\n\tcase \"`/bin/arch`\" in\n\t    sun3)\n\t\techo m68k-sun-sunos${UNAME_RELEASE}\n\t\t;;\n\t    sun4)\n\t\techo sparc-sun-sunos${UNAME_RELEASE}\n\t\t;;\n\tesac\n\texit ;;\n    aushp:SunOS:*:*)\n\techo sparc-auspex-sunos${UNAME_RELEASE}\n\texit ;;\n    # The situation for MiNT is a little confusing.  The machine name\n    # can be virtually everything (everything which is not\n    # \"atarist\" or \"atariste\" at least should have a processor\n    # > m68000).  The system name ranges from \"MiNT\" over \"FreeMiNT\"\n    # to the lowercase version \"mint\" (or \"freemint\").  Finally\n    # the system name \"TOS\" denotes a system which is actually not\n    # MiNT.  But MiNT is downward compatible to TOS, so this should\n    # be no problem.\n    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)\n        echo m68k-atari-mint${UNAME_RELEASE}\n\texit ;;\n    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)\n\techo m68k-atari-mint${UNAME_RELEASE}\n        exit ;;\n    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)\n        echo m68k-atari-mint${UNAME_RELEASE}\n\texit ;;\n    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)\n        echo m68k-milan-mint${UNAME_RELEASE}\n        exit ;;\n    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)\n        echo m68k-hades-mint${UNAME_RELEASE}\n        exit ;;\n    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)\n        echo m68k-unknown-mint${UNAME_RELEASE}\n        exit ;;\n    m68k:machten:*:*)\n\techo m68k-apple-machten${UNAME_RELEASE}\n\texit ;;\n    powerpc:machten:*:*)\n\techo powerpc-apple-machten${UNAME_RELEASE}\n\texit ;;\n    RISC*:Mach:*:*)\n\techo mips-dec-mach_bsd4.3\n\texit ;;\n    RISC*:ULTRIX:*:*)\n\techo mips-dec-ultrix${UNAME_RELEASE}\n\texit ;;\n    VAX*:ULTRIX*:*:*)\n\techo vax-dec-ultrix${UNAME_RELEASE}\n\texit ;;\n    2020:CLIX:*:* | 2430:CLIX:*:*)\n\techo clipper-intergraph-clix${UNAME_RELEASE}\n\texit ;;\n    mips:*:*:UMIPS | mips:*:*:RISCos)\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n#ifdef __cplusplus\n#include <stdio.h>  /* for printf() prototype */\n\tint main (int argc, char *argv[]) {\n#else\n\tint main (argc, argv) int argc; char *argv[]; {\n#endif\n\t#if defined (host_mips) && defined (MIPSEB)\n\t#if defined (SYSTYPE_SYSV)\n\t  printf (\"mips-mips-riscos%ssysv\\n\", argv[1]); exit (0);\n\t#endif\n\t#if defined (SYSTYPE_SVR4)\n\t  printf (\"mips-mips-riscos%ssvr4\\n\", argv[1]); exit (0);\n\t#endif\n\t#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)\n\t  printf (\"mips-mips-riscos%sbsd\\n\", argv[1]); exit (0);\n\t#endif\n\t#endif\n\t  exit (-1);\n\t}\nEOF\n\t$CC_FOR_BUILD -o $dummy $dummy.c &&\n\t  dummyarg=`echo \"${UNAME_RELEASE}\" | sed -n 's/\\([0-9]*\\).*/\\1/p'` &&\n\t  SYSTEM_NAME=`$dummy $dummyarg` &&\n\t    { echo \"$SYSTEM_NAME\"; exit; }\n\techo mips-mips-riscos${UNAME_RELEASE}\n\texit ;;\n    Motorola:PowerMAX_OS:*:*)\n\techo powerpc-motorola-powermax\n\texit ;;\n    Motorola:*:4.3:PL8-*)\n\techo powerpc-harris-powermax\n\texit ;;\n    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)\n\techo powerpc-harris-powermax\n\texit ;;\n    Night_Hawk:Power_UNIX:*:*)\n\techo powerpc-harris-powerunix\n\texit ;;\n    m88k:CX/UX:7*:*)\n\techo m88k-harris-cxux7\n\texit ;;\n    m88k:*:4*:R4*)\n\techo m88k-motorola-sysv4\n\texit ;;\n    m88k:*:3*:R3*)\n\techo m88k-motorola-sysv3\n\texit ;;\n    AViiON:dgux:*:*)\n        # DG/UX returns AViiON for all architectures\n        UNAME_PROCESSOR=`/usr/bin/uname -p`\n\tif [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]\n\tthen\n\t    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \\\n\t       [ ${TARGET_BINARY_INTERFACE}x = x ]\n\t    then\n\t\techo m88k-dg-dgux${UNAME_RELEASE}\n\t    else\n\t\techo m88k-dg-dguxbcs${UNAME_RELEASE}\n\t    fi\n\telse\n\t    echo i586-dg-dgux${UNAME_RELEASE}\n\tfi\n \texit ;;\n    M88*:DolphinOS:*:*)\t# DolphinOS (SVR3)\n\techo m88k-dolphin-sysv3\n\texit ;;\n    M88*:*:R3*:*)\n\t# Delta 88k system running SVR3\n\techo m88k-motorola-sysv3\n\texit ;;\n    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)\n\techo m88k-tektronix-sysv3\n\texit ;;\n    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)\n\techo m68k-tektronix-bsd\n\texit ;;\n    *:IRIX*:*:*)\n\techo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`\n\texit ;;\n    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.\n\techo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id\n\texit ;;               # Note that: echo \"'`uname -s`'\" gives 'AIX '\n    i*86:AIX:*:*)\n\techo i386-ibm-aix\n\texit ;;\n    ia64:AIX:*:*)\n\tif [ -x /usr/bin/oslevel ] ; then\n\t\tIBM_REV=`/usr/bin/oslevel`\n\telse\n\t\tIBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}\n\tfi\n\techo ${UNAME_MACHINE}-ibm-aix${IBM_REV}\n\texit ;;\n    *:AIX:2:3)\n\tif grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then\n\t\teval $set_cc_for_build\n\t\tsed 's/^\t\t//' << EOF >$dummy.c\n\t\t#include <sys/systemcfg.h>\n\n\t\tmain()\n\t\t\t{\n\t\t\tif (!__power_pc())\n\t\t\t\texit(1);\n\t\t\tputs(\"powerpc-ibm-aix3.2.5\");\n\t\t\texit(0);\n\t\t\t}\nEOF\n\t\tif $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`\n\t\tthen\n\t\t\techo \"$SYSTEM_NAME\"\n\t\telse\n\t\t\techo rs6000-ibm-aix3.2.5\n\t\tfi\n\telif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then\n\t\techo rs6000-ibm-aix3.2.4\n\telse\n\t\techo rs6000-ibm-aix3.2\n\tfi\n\texit ;;\n    *:AIX:*:[456])\n\tIBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`\n\tif /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then\n\t\tIBM_ARCH=rs6000\n\telse\n\t\tIBM_ARCH=powerpc\n\tfi\n\tif [ -x /usr/bin/oslevel ] ; then\n\t\tIBM_REV=`/usr/bin/oslevel`\n\telse\n\t\tIBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}\n\tfi\n\techo ${IBM_ARCH}-ibm-aix${IBM_REV}\n\texit ;;\n    *:AIX:*:*)\n\techo rs6000-ibm-aix\n\texit ;;\n    ibmrt:4.4BSD:*|romp-ibm:BSD:*)\n\techo romp-ibm-bsd4.4\n\texit ;;\n    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and\n\techo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to\n\texit ;;                             # report: romp-ibm BSD 4.3\n    *:BOSX:*:*)\n\techo rs6000-bull-bosx\n\texit ;;\n    DPX/2?00:B.O.S.:*:*)\n\techo m68k-bull-sysv3\n\texit ;;\n    9000/[34]??:4.3bsd:1.*:*)\n\techo m68k-hp-bsd\n\texit ;;\n    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)\n\techo m68k-hp-bsd4.4\n\texit ;;\n    9000/[34678]??:HP-UX:*:*)\n\tHPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`\n\tcase \"${UNAME_MACHINE}\" in\n\t    9000/31? )            HP_ARCH=m68000 ;;\n\t    9000/[34]?? )         HP_ARCH=m68k ;;\n\t    9000/[678][0-9][0-9])\n\t\tif [ -x /usr/bin/getconf ]; then\n\t\t    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`\n                    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`\n                    case \"${sc_cpu_version}\" in\n                      523) HP_ARCH=\"hppa1.0\" ;; # CPU_PA_RISC1_0\n                      528) HP_ARCH=\"hppa1.1\" ;; # CPU_PA_RISC1_1\n                      532)                      # CPU_PA_RISC2_0\n                        case \"${sc_kernel_bits}\" in\n                          32) HP_ARCH=\"hppa2.0n\" ;;\n                          64) HP_ARCH=\"hppa2.0w\" ;;\n\t\t\t  '') HP_ARCH=\"hppa2.0\" ;;   # HP-UX 10.20\n                        esac ;;\n                    esac\n\t\tfi\n\t\tif [ \"${HP_ARCH}\" = \"\" ]; then\n\t\t    eval $set_cc_for_build\n\t\t    sed 's/^              //' << EOF >$dummy.c\n\n              #define _HPUX_SOURCE\n              #include <stdlib.h>\n              #include <unistd.h>\n\n              int main ()\n              {\n              #if defined(_SC_KERNEL_BITS)\n                  long bits = sysconf(_SC_KERNEL_BITS);\n              #endif\n                  long cpu  = sysconf (_SC_CPU_VERSION);\n\n                  switch (cpu)\n              \t{\n              \tcase CPU_PA_RISC1_0: puts (\"hppa1.0\"); break;\n              \tcase CPU_PA_RISC1_1: puts (\"hppa1.1\"); break;\n              \tcase CPU_PA_RISC2_0:\n              #if defined(_SC_KERNEL_BITS)\n              \t    switch (bits)\n              \t\t{\n              \t\tcase 64: puts (\"hppa2.0w\"); break;\n              \t\tcase 32: puts (\"hppa2.0n\"); break;\n              \t\tdefault: puts (\"hppa2.0\"); break;\n              \t\t} break;\n              #else  /* !defined(_SC_KERNEL_BITS) */\n              \t    puts (\"hppa2.0\"); break;\n              #endif\n              \tdefault: puts (\"hppa1.0\"); break;\n              \t}\n                  exit (0);\n              }\nEOF\n\t\t    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`\n\t\t    test -z \"$HP_ARCH\" && HP_ARCH=hppa\n\t\tfi ;;\n\tesac\n\tif [ ${HP_ARCH} = \"hppa2.0w\" ]\n\tthen\n\t    eval $set_cc_for_build\n\n\t    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating\n\t    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler\n\t    # generating 64-bit code.  GNU and HP use different nomenclature:\n\t    #\n\t    # $ CC_FOR_BUILD=cc ./config.guess\n\t    # => hppa2.0w-hp-hpux11.23\n\t    # $ CC_FOR_BUILD=\"cc +DA2.0w\" ./config.guess\n\t    # => hppa64-hp-hpux11.23\n\n\t    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |\n\t\tgrep -q __LP64__\n\t    then\n\t\tHP_ARCH=\"hppa2.0w\"\n\t    else\n\t\tHP_ARCH=\"hppa64\"\n\t    fi\n\tfi\n\techo ${HP_ARCH}-hp-hpux${HPUX_REV}\n\texit ;;\n    ia64:HP-UX:*:*)\n\tHPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`\n\techo ia64-hp-hpux${HPUX_REV}\n\texit ;;\n    3050*:HI-UX:*:*)\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n\t#include <unistd.h>\n\tint\n\tmain ()\n\t{\n\t  long cpu = sysconf (_SC_CPU_VERSION);\n\t  /* The order matters, because CPU_IS_HP_MC68K erroneously returns\n\t     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct\n\t     results, however.  */\n\t  if (CPU_IS_PA_RISC (cpu))\n\t    {\n\t      switch (cpu)\n\t\t{\n\t\t  case CPU_PA_RISC1_0: puts (\"hppa1.0-hitachi-hiuxwe2\"); break;\n\t\t  case CPU_PA_RISC1_1: puts (\"hppa1.1-hitachi-hiuxwe2\"); break;\n\t\t  case CPU_PA_RISC2_0: puts (\"hppa2.0-hitachi-hiuxwe2\"); break;\n\t\t  default: puts (\"hppa-hitachi-hiuxwe2\"); break;\n\t\t}\n\t    }\n\t  else if (CPU_IS_HP_MC68K (cpu))\n\t    puts (\"m68k-hitachi-hiuxwe2\");\n\t  else puts (\"unknown-hitachi-hiuxwe2\");\n\t  exit (0);\n\t}\nEOF\n\t$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&\n\t\t{ echo \"$SYSTEM_NAME\"; exit; }\n\techo unknown-hitachi-hiuxwe2\n\texit ;;\n    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )\n\techo hppa1.1-hp-bsd\n\texit ;;\n    9000/8??:4.3bsd:*:*)\n\techo hppa1.0-hp-bsd\n\texit ;;\n    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)\n\techo hppa1.0-hp-mpeix\n\texit ;;\n    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )\n\techo hppa1.1-hp-osf\n\texit ;;\n    hp8??:OSF1:*:*)\n\techo hppa1.0-hp-osf\n\texit ;;\n    i*86:OSF1:*:*)\n\tif [ -x /usr/sbin/sysversion ] ; then\n\t    echo ${UNAME_MACHINE}-unknown-osf1mk\n\telse\n\t    echo ${UNAME_MACHINE}-unknown-osf1\n\tfi\n\texit ;;\n    parisc*:Lites*:*:*)\n\techo hppa1.1-hp-lites\n\texit ;;\n    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)\n\techo c1-convex-bsd\n        exit ;;\n    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)\n\tif getsysinfo -f scalar_acc\n\tthen echo c32-convex-bsd\n\telse echo c2-convex-bsd\n\tfi\n        exit ;;\n    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)\n\techo c34-convex-bsd\n        exit ;;\n    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)\n\techo c38-convex-bsd\n        exit ;;\n    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)\n\techo c4-convex-bsd\n        exit ;;\n    CRAY*Y-MP:*:*:*)\n\techo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    CRAY*[A-Z]90:*:*:*)\n\techo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \\\n\t| sed -e 's/CRAY.*\\([A-Z]90\\)/\\1/' \\\n\t      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \\\n\t      -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    CRAY*TS:*:*:*)\n\techo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    CRAY*T3E:*:*:*)\n\techo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    CRAY*SV1:*:*:*)\n\techo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    *:UNICOS/mp:*:*)\n\techo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)\n\tFUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`\n        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\\///'`\n        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`\n        echo \"${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}\"\n        exit ;;\n    5000:UNIX_System_V:4.*:*)\n        FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\\///'`\n        FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`\n        echo \"sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}\"\n\texit ;;\n    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\\ Embedded/OS:*:*)\n\techo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}\n\texit ;;\n    sparc*:BSD/OS:*:*)\n\techo sparc-unknown-bsdi${UNAME_RELEASE}\n\texit ;;\n    *:BSD/OS:*:*)\n\techo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}\n\texit ;;\n    *:FreeBSD:*:*)\n\tcase ${UNAME_MACHINE} in\n\t    pc98)\n\t\techo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;\n\t    amd64)\n\t\techo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;\n\t    *)\n\t\techo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;\n\tesac\n\texit ;;\n    i*:CYGWIN*:*)\n\techo ${UNAME_MACHINE}-pc-cygwin\n\texit ;;\n    *:MINGW*:*)\n\techo ${UNAME_MACHINE}-pc-mingw32\n\texit ;;\n    i*:windows32*:*)\n    \t# uname -m includes \"-pc\" on this system.\n    \techo ${UNAME_MACHINE}-mingw32\n\texit ;;\n    i*:PW*:*)\n\techo ${UNAME_MACHINE}-pc-pw32\n\texit ;;\n    *:Interix*:*)\n    \tcase ${UNAME_MACHINE} in\n\t    x86)\n\t\techo i586-pc-interix${UNAME_RELEASE}\n\t\texit ;;\n\t    authenticamd | genuineintel | EM64T)\n\t\techo x86_64-unknown-interix${UNAME_RELEASE}\n\t\texit ;;\n\t    IA64)\n\t\techo ia64-unknown-interix${UNAME_RELEASE}\n\t\texit ;;\n\tesac ;;\n    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)\n\techo i${UNAME_MACHINE}-pc-mks\n\texit ;;\n    8664:Windows_NT:*)\n\techo x86_64-pc-mks\n\texit ;;\n    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)\n\t# How do we know it's Interix rather than the generic POSIX subsystem?\n\t# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we\n\t# UNAME_MACHINE based on the output of uname instead of i386?\n\techo i586-pc-interix\n\texit ;;\n    i*:UWIN*:*)\n\techo ${UNAME_MACHINE}-pc-uwin\n\texit ;;\n    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)\n\techo x86_64-unknown-cygwin\n\texit ;;\n    p*:CYGWIN*:*)\n\techo powerpcle-unknown-cygwin\n\texit ;;\n    prep*:SunOS:5.*:*)\n\techo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    *:GNU:*:*)\n\t# the GNU system\n\techo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`\n\texit ;;\n    *:GNU/*:*:*)\n\t# other systems with GNU libc and userland\n\techo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu\n\texit ;;\n    i*86:Minix:*:*)\n\techo ${UNAME_MACHINE}-pc-minix\n\texit ;;\n    alpha:Linux:*:*)\n\tcase `sed -n '/^cpu model/s/^.*: \\(.*\\)/\\1/p' < /proc/cpuinfo` in\n\t  EV5)   UNAME_MACHINE=alphaev5 ;;\n\t  EV56)  UNAME_MACHINE=alphaev56 ;;\n\t  PCA56) UNAME_MACHINE=alphapca56 ;;\n\t  PCA57) UNAME_MACHINE=alphapca56 ;;\n\t  EV6)   UNAME_MACHINE=alphaev6 ;;\n\t  EV67)  UNAME_MACHINE=alphaev67 ;;\n\t  EV68*) UNAME_MACHINE=alphaev68 ;;\n        esac\n\tobjdump --private-headers /bin/sh | grep -q ld.so.1\n\tif test \"$?\" = 0 ; then LIBC=\"libc1\" ; else LIBC=\"\" ; fi\n\techo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}\n\texit ;;\n    arm*:Linux:*:*)\n\teval $set_cc_for_build\n\tif echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \\\n\t    | grep -q __ARM_EABI__\n\tthen\n\t    echo ${UNAME_MACHINE}-unknown-linux-gnu\n\telse\n\t    echo ${UNAME_MACHINE}-unknown-linux-gnueabi\n\tfi\n\texit ;;\n    avr32*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    cris:Linux:*:*)\n\techo cris-axis-linux-gnu\n\texit ;;\n    crisv32:Linux:*:*)\n\techo crisv32-axis-linux-gnu\n\texit ;;\n    frv:Linux:*:*)\n    \techo frv-unknown-linux-gnu\n\texit ;;\n    i*86:Linux:*:*)\n\tLIBC=gnu\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n\t#ifdef __dietlibc__\n\tLIBC=dietlibc\n\t#endif\nEOF\n\teval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`\n\techo \"${UNAME_MACHINE}-pc-linux-${LIBC}\"\n\texit ;;\n    ia64:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    m32r*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    m68*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    mips:Linux:*:* | mips64:Linux:*:*)\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n\t#undef CPU\n\t#undef ${UNAME_MACHINE}\n\t#undef ${UNAME_MACHINE}el\n\t#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)\n\tCPU=${UNAME_MACHINE}el\n\t#else\n\t#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)\n\tCPU=${UNAME_MACHINE}\n\t#else\n\tCPU=\n\t#endif\n\t#endif\nEOF\n\teval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`\n\ttest x\"${CPU}\" != x && { echo \"${CPU}-unknown-linux-gnu\"; exit; }\n\t;;\n    or32:Linux:*:*)\n\techo or32-unknown-linux-gnu\n\texit ;;\n    padre:Linux:*:*)\n\techo sparc-unknown-linux-gnu\n\texit ;;\n    parisc64:Linux:*:* | hppa64:Linux:*:*)\n\techo hppa64-unknown-linux-gnu\n\texit ;;\n    parisc:Linux:*:* | hppa:Linux:*:*)\n\t# Look for CPU level\n\tcase `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in\n\t  PA7*) echo hppa1.1-unknown-linux-gnu ;;\n\t  PA8*) echo hppa2.0-unknown-linux-gnu ;;\n\t  *)    echo hppa-unknown-linux-gnu ;;\n\tesac\n\texit ;;\n    ppc64:Linux:*:*)\n\techo powerpc64-unknown-linux-gnu\n\texit ;;\n    ppc:Linux:*:*)\n\techo powerpc-unknown-linux-gnu\n\texit ;;\n    s390:Linux:*:* | s390x:Linux:*:*)\n\techo ${UNAME_MACHINE}-ibm-linux\n\texit ;;\n    sh64*:Linux:*:*)\n    \techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    sh*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    sparc:Linux:*:* | sparc64:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    vax:Linux:*:*)\n\techo ${UNAME_MACHINE}-dec-linux-gnu\n\texit ;;\n    x86_64:Linux:*:*)\n\techo x86_64-unknown-linux-gnu\n\texit ;;\n    xtensa*:Linux:*:*)\n    \techo ${UNAME_MACHINE}-unknown-linux-gnu\n\texit ;;\n    i*86:DYNIX/ptx:4*:*)\n\t# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.\n\t# earlier versions are messed up and put the nodename in both\n\t# sysname and nodename.\n\techo i386-sequent-sysv4\n\texit ;;\n    i*86:UNIX_SV:4.2MP:2.*)\n        # Unixware is an offshoot of SVR4, but it has its own version\n        # number series starting with 2...\n        # I am not positive that other SVR4 systems won't match this,\n\t# I just have to hope.  -- rms.\n        # Use sysv4.2uw... so that sysv4* matches it.\n\techo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}\n\texit ;;\n    i*86:OS/2:*:*)\n\t# If we were able to find `uname', then EMX Unix compatibility\n\t# is probably installed.\n\techo ${UNAME_MACHINE}-pc-os2-emx\n\texit ;;\n    i*86:XTS-300:*:STOP)\n\techo ${UNAME_MACHINE}-unknown-stop\n\texit ;;\n    i*86:atheos:*:*)\n\techo ${UNAME_MACHINE}-unknown-atheos\n\texit ;;\n    i*86:syllable:*:*)\n\techo ${UNAME_MACHINE}-pc-syllable\n\texit ;;\n    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)\n\techo i386-unknown-lynxos${UNAME_RELEASE}\n\texit ;;\n    i*86:*DOS:*:*)\n\techo ${UNAME_MACHINE}-pc-msdosdjgpp\n\texit ;;\n    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)\n\tUNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\\/MP$//'`\n\tif grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then\n\t\techo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}\n\telse\n\t\techo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}\n\tfi\n\texit ;;\n    i*86:*:5:[678]*)\n    \t# UnixWare 7.x, OpenUNIX and OpenServer 6.\n\tcase `/bin/uname -X | grep \"^Machine\"` in\n\t    *486*)\t     UNAME_MACHINE=i486 ;;\n\t    *Pentium)\t     UNAME_MACHINE=i586 ;;\n\t    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;\n\tesac\n\techo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}\n\texit ;;\n    i*86:*:3.2:*)\n\tif test -f /usr/options/cb.name; then\n\t\tUNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`\n\t\techo ${UNAME_MACHINE}-pc-isc$UNAME_REL\n\telif /bin/uname -X 2>/dev/null >/dev/null ; then\n\t\tUNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`\n\t\t(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486\n\t\t(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \\\n\t\t\t&& UNAME_MACHINE=i586\n\t\t(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \\\n\t\t\t&& UNAME_MACHINE=i686\n\t\t(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \\\n\t\t\t&& UNAME_MACHINE=i686\n\t\techo ${UNAME_MACHINE}-pc-sco$UNAME_REL\n\telse\n\t\techo ${UNAME_MACHINE}-pc-sysv32\n\tfi\n\texit ;;\n    pc:*:*:*)\n\t# Left here for compatibility:\n        # uname -m prints for DJGPP always 'pc', but it prints nothing about\n        # the processor, so we play safe by assuming i586.\n\t# Note: whatever this is, it MUST be the same as what config.sub\n\t# prints for the \"djgpp\" host, or else GDB configury will decide that\n\t# this is a cross-build.\n\techo i586-pc-msdosdjgpp\n        exit ;;\n    Intel:Mach:3*:*)\n\techo i386-pc-mach3\n\texit ;;\n    paragon:*:*:*)\n\techo i860-intel-osf1\n\texit ;;\n    i860:*:4.*:*) # i860-SVR4\n\tif grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then\n\t  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4\n\telse # Add other i860-SVR4 vendors below as they are discovered.\n\t  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4\n\tfi\n\texit ;;\n    mini*:CTIX:SYS*5:*)\n\t# \"miniframe\"\n\techo m68010-convergent-sysv\n\texit ;;\n    mc68k:UNIX:SYSTEM5:3.51m)\n\techo m68k-convergent-sysv\n\texit ;;\n    M680?0:D-NIX:5.3:*)\n\techo m68k-diab-dnix\n\texit ;;\n    M68*:*:R3V[5678]*:*)\n\ttest -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;\n    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)\n\tOS_REL=''\n\ttest -r /etc/.relid \\\n\t&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \\([0-9][0-9]\\).*/\\1/p' < /etc/.relid`\n\t/bin/uname -p 2>/dev/null | grep 86 >/dev/null \\\n\t  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }\n\t/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \\\n\t  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;\n    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)\n        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \\\n          && { echo i486-ncr-sysv4; exit; } ;;\n    NCR*:*:4.2:* | MPRAS*:*:4.2:*)\n\tOS_REL='.3'\n\ttest -r /etc/.relid \\\n\t    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \\([0-9][0-9]\\).*/\\1/p' < /etc/.relid`\n\t/bin/uname -p 2>/dev/null | grep 86 >/dev/null \\\n\t    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }\n\t/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \\\n\t    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }\n\t/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \\\n\t    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;\n    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)\n\techo m68k-unknown-lynxos${UNAME_RELEASE}\n\texit ;;\n    mc68030:UNIX_System_V:4.*:*)\n\techo m68k-atari-sysv4\n\texit ;;\n    TSUNAMI:LynxOS:2.*:*)\n\techo sparc-unknown-lynxos${UNAME_RELEASE}\n\texit ;;\n    rs6000:LynxOS:2.*:*)\n\techo rs6000-unknown-lynxos${UNAME_RELEASE}\n\texit ;;\n    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)\n\techo powerpc-unknown-lynxos${UNAME_RELEASE}\n\texit ;;\n    SM[BE]S:UNIX_SV:*:*)\n\techo mips-dde-sysv${UNAME_RELEASE}\n\texit ;;\n    RM*:ReliantUNIX-*:*:*)\n\techo mips-sni-sysv4\n\texit ;;\n    RM*:SINIX-*:*:*)\n\techo mips-sni-sysv4\n\texit ;;\n    *:SINIX-*:*:*)\n\tif uname -p 2>/dev/null >/dev/null ; then\n\t\tUNAME_MACHINE=`(uname -p) 2>/dev/null`\n\t\techo ${UNAME_MACHINE}-sni-sysv4\n\telse\n\t\techo ns32k-sni-sysv\n\tfi\n\texit ;;\n    PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort\n                      # says <Richard.M.Bartel@ccMail.Census.GOV>\n        echo i586-unisys-sysv4\n        exit ;;\n    *:UNIX_System_V:4*:FTX*)\n\t# From Gerald Hewes <hewes@openmarket.com>.\n\t# How about differentiating between stratus architectures? -djm\n\techo hppa1.1-stratus-sysv4\n\texit ;;\n    *:*:*:FTX*)\n\t# From seanf@swdc.stratus.com.\n\techo i860-stratus-sysv4\n\texit ;;\n    i*86:VOS:*:*)\n\t# From Paul.Green@stratus.com.\n\techo ${UNAME_MACHINE}-stratus-vos\n\texit ;;\n    *:VOS:*:*)\n\t# From Paul.Green@stratus.com.\n\techo hppa1.1-stratus-vos\n\texit ;;\n    mc68*:A/UX:*:*)\n\techo m68k-apple-aux${UNAME_RELEASE}\n\texit ;;\n    news*:NEWS-OS:6*:*)\n\techo mips-sony-newsos6\n\texit ;;\n    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)\n\tif [ -d /usr/nec ]; then\n\t        echo mips-nec-sysv${UNAME_RELEASE}\n\telse\n\t        echo mips-unknown-sysv${UNAME_RELEASE}\n\tfi\n        exit ;;\n    BeBox:BeOS:*:*)\t# BeOS running on hardware made by Be, PPC only.\n\techo powerpc-be-beos\n\texit ;;\n    BeMac:BeOS:*:*)\t# BeOS running on Mac or Mac clone, PPC only.\n\techo powerpc-apple-beos\n\texit ;;\n    BePC:BeOS:*:*)\t# BeOS running on Intel PC compatible.\n\techo i586-pc-beos\n\texit ;;\n    BePC:Haiku:*:*)\t# Haiku running on Intel PC compatible.\n\techo i586-pc-haiku\n\texit ;;\n    SX-4:SUPER-UX:*:*)\n\techo sx4-nec-superux${UNAME_RELEASE}\n\texit ;;\n    SX-5:SUPER-UX:*:*)\n\techo sx5-nec-superux${UNAME_RELEASE}\n\texit ;;\n    SX-6:SUPER-UX:*:*)\n\techo sx6-nec-superux${UNAME_RELEASE}\n\texit ;;\n    SX-7:SUPER-UX:*:*)\n\techo sx7-nec-superux${UNAME_RELEASE}\n\texit ;;\n    SX-8:SUPER-UX:*:*)\n\techo sx8-nec-superux${UNAME_RELEASE}\n\texit ;;\n    SX-8R:SUPER-UX:*:*)\n\techo sx8r-nec-superux${UNAME_RELEASE}\n\texit ;;\n    Power*:Rhapsody:*:*)\n\techo powerpc-apple-rhapsody${UNAME_RELEASE}\n\texit ;;\n    *:Rhapsody:*:*)\n\techo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}\n\texit ;;\n    *:Darwin:*:*)\n\tUNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown\n\tcase $UNAME_PROCESSOR in\n\t    i386)\n\t\teval $set_cc_for_build\n\t\tif [ \"$CC_FOR_BUILD\" != 'no_compiler_found' ]; then\n\t\t  if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \\\n\t\t      (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \\\n\t\t      grep IS_64BIT_ARCH >/dev/null\n\t\t  then\n\t\t      UNAME_PROCESSOR=\"x86_64\"\n\t\t  fi\n\t\tfi ;;\n\t    unknown) UNAME_PROCESSOR=powerpc ;;\n\tesac\n\techo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}\n\texit ;;\n    *:procnto*:*:* | *:QNX:[0123456789]*:*)\n\tUNAME_PROCESSOR=`uname -p`\n\tif test \"$UNAME_PROCESSOR\" = \"x86\"; then\n\t\tUNAME_PROCESSOR=i386\n\t\tUNAME_MACHINE=pc\n\tfi\n\techo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}\n\texit ;;\n    *:QNX:*:4*)\n\techo i386-pc-qnx\n\texit ;;\n    NSE-?:NONSTOP_KERNEL:*:*)\n\techo nse-tandem-nsk${UNAME_RELEASE}\n\texit ;;\n    NSR-?:NONSTOP_KERNEL:*:*)\n\techo nsr-tandem-nsk${UNAME_RELEASE}\n\texit ;;\n    *:NonStop-UX:*:*)\n\techo mips-compaq-nonstopux\n\texit ;;\n    BS2000:POSIX*:*:*)\n\techo bs2000-siemens-sysv\n\texit ;;\n    DS/*:UNIX_System_V:*:*)\n\techo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}\n\texit ;;\n    *:Plan9:*:*)\n\t# \"uname -m\" is not consistent, so use $cputype instead. 386\n\t# is converted to i386 for consistency with other x86\n\t# operating systems.\n\tif test \"$cputype\" = \"386\"; then\n\t    UNAME_MACHINE=i386\n\telse\n\t    UNAME_MACHINE=\"$cputype\"\n\tfi\n\techo ${UNAME_MACHINE}-unknown-plan9\n\texit ;;\n    *:TOPS-10:*:*)\n\techo pdp10-unknown-tops10\n\texit ;;\n    *:TENEX:*:*)\n\techo pdp10-unknown-tenex\n\texit ;;\n    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)\n\techo pdp10-dec-tops20\n\texit ;;\n    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)\n\techo pdp10-xkl-tops20\n\texit ;;\n    *:TOPS-20:*:*)\n\techo pdp10-unknown-tops20\n\texit ;;\n    *:ITS:*:*)\n\techo pdp10-unknown-its\n\texit ;;\n    SEI:*:*:SEIUX)\n        echo mips-sei-seiux${UNAME_RELEASE}\n\texit ;;\n    *:DragonFly:*:*)\n\techo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`\n\texit ;;\n    *:*VMS:*:*)\n    \tUNAME_MACHINE=`(uname -p) 2>/dev/null`\n\tcase \"${UNAME_MACHINE}\" in\n\t    A*) echo alpha-dec-vms ; exit ;;\n\t    I*) echo ia64-dec-vms ; exit ;;\n\t    V*) echo vax-dec-vms ; exit ;;\n\tesac ;;\n    *:XENIX:*:SysV)\n\techo i386-pc-xenix\n\texit ;;\n    i*86:skyos:*:*)\n\techo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'\n\texit ;;\n    i*86:rdos:*:*)\n\techo ${UNAME_MACHINE}-pc-rdos\n\texit ;;\n    i*86:AROS:*:*)\n\techo ${UNAME_MACHINE}-pc-aros\n\texit ;;\nesac\n\n#echo '(No uname command or uname output not recognized.)' 1>&2\n#echo \"${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}\" 1>&2\n\neval $set_cc_for_build\ncat >$dummy.c <<EOF\n#ifdef _SEQUENT_\n# include <sys/types.h>\n# include <sys/utsname.h>\n#endif\nmain ()\n{\n#if defined (sony)\n#if defined (MIPSEB)\n  /* BFD wants \"bsd\" instead of \"newsos\".  Perhaps BFD should be changed,\n     I don't know....  */\n  printf (\"mips-sony-bsd\\n\"); exit (0);\n#else\n#include <sys/param.h>\n  printf (\"m68k-sony-newsos%s\\n\",\n#ifdef NEWSOS4\n          \"4\"\n#else\n\t  \"\"\n#endif\n         ); exit (0);\n#endif\n#endif\n\n#if defined (__arm) && defined (__acorn) && defined (__unix)\n  printf (\"arm-acorn-riscix\\n\"); exit (0);\n#endif\n\n#if defined (hp300) && !defined (hpux)\n  printf (\"m68k-hp-bsd\\n\"); exit (0);\n#endif\n\n#if defined (NeXT)\n#if !defined (__ARCHITECTURE__)\n#define __ARCHITECTURE__ \"m68k\"\n#endif\n  int version;\n  version=`(hostinfo | sed -n 's/.*NeXT Mach \\([0-9]*\\).*/\\1/p') 2>/dev/null`;\n  if (version < 4)\n    printf (\"%s-next-nextstep%d\\n\", __ARCHITECTURE__, version);\n  else\n    printf (\"%s-next-openstep%d\\n\", __ARCHITECTURE__, version);\n  exit (0);\n#endif\n\n#if defined (MULTIMAX) || defined (n16)\n#if defined (UMAXV)\n  printf (\"ns32k-encore-sysv\\n\"); exit (0);\n#else\n#if defined (CMU)\n  printf (\"ns32k-encore-mach\\n\"); exit (0);\n#else\n  printf (\"ns32k-encore-bsd\\n\"); exit (0);\n#endif\n#endif\n#endif\n\n#if defined (__386BSD__)\n  printf (\"i386-pc-bsd\\n\"); exit (0);\n#endif\n\n#if defined (sequent)\n#if defined (i386)\n  printf (\"i386-sequent-dynix\\n\"); exit (0);\n#endif\n#if defined (ns32000)\n  printf (\"ns32k-sequent-dynix\\n\"); exit (0);\n#endif\n#endif\n\n#if defined (_SEQUENT_)\n    struct utsname un;\n\n    uname(&un);\n\n    if (strncmp(un.version, \"V2\", 2) == 0) {\n\tprintf (\"i386-sequent-ptx2\\n\"); exit (0);\n    }\n    if (strncmp(un.version, \"V1\", 2) == 0) { /* XXX is V1 correct? */\n\tprintf (\"i386-sequent-ptx1\\n\"); exit (0);\n    }\n    printf (\"i386-sequent-ptx\\n\"); exit (0);\n\n#endif\n\n#if defined (vax)\n# if !defined (ultrix)\n#  include <sys/param.h>\n#  if defined (BSD)\n#   if BSD == 43\n      printf (\"vax-dec-bsd4.3\\n\"); exit (0);\n#   else\n#    if BSD == 199006\n      printf (\"vax-dec-bsd4.3reno\\n\"); exit (0);\n#    else\n      printf (\"vax-dec-bsd\\n\"); exit (0);\n#    endif\n#   endif\n#  else\n    printf (\"vax-dec-bsd\\n\"); exit (0);\n#  endif\n# else\n    printf (\"vax-dec-ultrix\\n\"); exit (0);\n# endif\n#endif\n\n#if defined (alliant) && defined (i860)\n  printf (\"i860-alliant-bsd\\n\"); exit (0);\n#endif\n\n  exit (1);\n}\nEOF\n\n$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&\n\t{ echo \"$SYSTEM_NAME\"; exit; }\n\n# Apollos put the system type in the environment.\n\ntest -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }\n\n# Convex versions that predate uname can use getsysinfo(1)\n\nif [ -x /usr/convex/getsysinfo ]\nthen\n    case `getsysinfo -f cpu_type` in\n    c1*)\n\techo c1-convex-bsd\n\texit ;;\n    c2*)\n\tif getsysinfo -f scalar_acc\n\tthen echo c32-convex-bsd\n\telse echo c2-convex-bsd\n\tfi\n\texit ;;\n    c34*)\n\techo c34-convex-bsd\n\texit ;;\n    c38*)\n\techo c38-convex-bsd\n\texit ;;\n    c4*)\n\techo c4-convex-bsd\n\texit ;;\n    esac\nfi\n\ncat >&2 <<EOF\n$0: unable to guess system type\n\nThis script, last modified $timestamp, has failed to recognize\nthe operating system you are using. It is advised that you\ndownload the most up to date version of the config scripts from\n\n  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD\nand\n  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD\n\nIf the version you run ($0) is already up to date, please\nsend the following data and any information you think might be\npertinent to <config-patches@gnu.org> in order to provide the needed\ninformation to handle your system.\n\nconfig.guess timestamp = $timestamp\n\nuname -m = `(uname -m) 2>/dev/null || echo unknown`\nuname -r = `(uname -r) 2>/dev/null || echo unknown`\nuname -s = `(uname -s) 2>/dev/null || echo unknown`\nuname -v = `(uname -v) 2>/dev/null || echo unknown`\n\n/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`\n/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`\n\nhostinfo               = `(hostinfo) 2>/dev/null`\n/bin/universe          = `(/bin/universe) 2>/dev/null`\n/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`\n/bin/arch              = `(/bin/arch) 2>/dev/null`\n/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`\n/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`\n\nUNAME_MACHINE = ${UNAME_MACHINE}\nUNAME_RELEASE = ${UNAME_RELEASE}\nUNAME_SYSTEM  = ${UNAME_SYSTEM}\nUNAME_VERSION = ${UNAME_VERSION}\nEOF\n\nexit 1\n\n# Local variables:\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"timestamp='\"\n# time-stamp-format: \"%:y-%02m-%02d\"\n# time-stamp-end: \"'\"\n# End:\n"
  },
  {
    "path": "src/Onigmo/config.h.in",
    "content": "/* config.h.in.  Generated from configure.in by autoheader.  */\n\n/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP\n   systems. This function is required for `alloca.c' support on those systems.\n   */\n#undef CRAY_STACKSEG_END\n\n/* Define to 1 if using `alloca.c'. */\n#undef C_ALLOCA\n\n/* Define to 1 if you have `alloca', as a function or macro. */\n#undef HAVE_ALLOCA\n\n/* Define to 1 if you have <alloca.h> and it should be used (not on Ultrix).\n   */\n#undef HAVE_ALLOCA_H\n\n/* Define to 1 if you have the <dlfcn.h> header file. */\n#undef HAVE_DLFCN_H\n\n/* Define to 1 if you have the <inttypes.h> header file. */\n#undef HAVE_INTTYPES_H\n\n/* Define to 1 if you have the <memory.h> header file. */\n#undef HAVE_MEMORY_H\n\n/* Define if compilerr supports prototypes */\n#undef HAVE_PROTOTYPES\n\n/* Define if compiler supports stdarg prototypes */\n#undef HAVE_STDARG_PROTOTYPES\n\n/* Define to 1 if you have the <stdint.h> header file. */\n#undef HAVE_STDINT_H\n\n/* Define to 1 if you have the <stdlib.h> header file. */\n#undef HAVE_STDLIB_H\n\n/* Define to 1 if you have the <strings.h> header file. */\n#undef HAVE_STRINGS_H\n\n/* Define to 1 if you have the <string.h> header file. */\n#undef HAVE_STRING_H\n\n/* Define to 1 if you have the <sys/stat.h> header file. */\n#undef HAVE_SYS_STAT_H\n\n/* Define to 1 if you have the <sys/times.h> header file. */\n#undef HAVE_SYS_TIMES_H\n\n/* Define to 1 if you have the <sys/time.h> header file. */\n#undef HAVE_SYS_TIME_H\n\n/* Define to 1 if you have the <sys/types.h> header file. */\n#undef HAVE_SYS_TYPES_H\n\n/* Define to 1 if you have the <unistd.h> header file. */\n#undef HAVE_UNISTD_H\n\n/* Define to the sub-directory in which libtool stores uninstalled libraries.\n   */\n#undef LT_OBJDIR\n\n/* Define to 1 if your C compiler doesn't accept -c and -o together. */\n#undef NO_MINUS_C_MINUS_O\n\n/* Name of package */\n#undef PACKAGE\n\n/* Define to the address where bug reports for this package should be sent. */\n#undef PACKAGE_BUGREPORT\n\n/* Define to the full name of this package. */\n#undef PACKAGE_NAME\n\n/* Define to the full name and version of this package. */\n#undef PACKAGE_STRING\n\n/* Define to the one symbol short name of this package. */\n#undef PACKAGE_TARNAME\n\n/* Define to the home page for this package. */\n#undef PACKAGE_URL\n\n/* Define to the version of this package. */\n#undef PACKAGE_VERSION\n\n/* The size of `int', as computed by sizeof. */\n#undef SIZEOF_INT\n\n/* The size of `long', as computed by sizeof. */\n#undef SIZEOF_LONG\n\n/* The size of `short', as computed by sizeof. */\n#undef SIZEOF_SHORT\n\n/* If using the C implementation of alloca, define if you know the\n   direction of stack growth for your system; otherwise it will be\n   automatically deduced at runtime.\n\tSTACK_DIRECTION > 0 => grows toward higher addresses\n\tSTACK_DIRECTION < 0 => grows toward lower addresses\n\tSTACK_DIRECTION = 0 => direction of growth unknown */\n#undef STACK_DIRECTION\n\n/* Define to 1 if you have the ANSI C header files. */\n#undef STDC_HEADERS\n\n/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */\n#undef TIME_WITH_SYS_TIME\n\n/* Define if combination explosion check */\n#undef USE_COMBINATION_EXPLOSION_CHECK\n\n/* Define if enable CR+NL as line terminator */\n#undef USE_CRNL_AS_LINE_TERMINATOR\n\n/* Version number of package */\n#undef VERSION\n\n/* Define to empty if `const' does not conform to ANSI C. */\n#undef const\n"
  },
  {
    "path": "src/Onigmo/config.sub",
    "content": "#! /bin/sh\n# Configuration validation subroutine script.\n#   Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,\n#   2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010\n#   Free Software Foundation, Inc.\n\ntimestamp='2010-01-22'\n\n# This file is (in principle) common to ALL GNU software.\n# The presence of a machine in this file suggests that SOME GNU software\n# can handle that machine.  It does not imply ALL GNU software can.\n#\n# This file is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA\n# 02110-1301, USA.\n#\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n\n# Please send patches to <config-patches@gnu.org>.  Submit a context\n# diff and a properly formatted GNU ChangeLog entry.\n#\n# Configuration subroutine to validate and canonicalize a configuration type.\n# Supply the specified configuration type as an argument.\n# If it is invalid, we print an error message on stderr and exit with code 1.\n# Otherwise, we print the canonical config type on stdout and succeed.\n\n# You can get the latest version of this script from:\n# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD\n\n# This file is supposed to be the same for all GNU packages\n# and recognize all the CPU types, system types and aliases\n# that are meaningful with *any* GNU software.\n# Each package is responsible for reporting which valid configurations\n# it does not support.  The user should be able to distinguish\n# a failure to support a valid configuration from a meaningless\n# configuration.\n\n# The goal of this file is to map all the various variations of a given\n# machine specification into a single specification in the form:\n#\tCPU_TYPE-MANUFACTURER-OPERATING_SYSTEM\n# or in some cases, the newer four-part form:\n#\tCPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM\n# It is wrong to echo any other type of specification.\n\nme=`echo \"$0\" | sed -e 's,.*/,,'`\n\nusage=\"\\\nUsage: $0 [OPTION] CPU-MFR-OPSYS\n       $0 [OPTION] ALIAS\n\nCanonicalize a configuration name.\n\nOperation modes:\n  -h, --help         print this help, then exit\n  -t, --time-stamp   print date of last modification, then exit\n  -v, --version      print version number, then exit\n\nReport bugs and patches to <config-patches@gnu.org>.\"\n\nversion=\"\\\nGNU config.sub ($timestamp)\n\nCopyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,\n2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free\nSoftware Foundation, Inc.\n\nThis is free software; see the source for copying conditions.  There is NO\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\"\n\nhelp=\"\nTry \\`$me --help' for more information.\"\n\n# Parse command line\nwhile test $# -gt 0 ; do\n  case $1 in\n    --time-stamp | --time* | -t )\n       echo \"$timestamp\" ; exit ;;\n    --version | -v )\n       echo \"$version\" ; exit ;;\n    --help | --h* | -h )\n       echo \"$usage\"; exit ;;\n    -- )     # Stop option processing\n       shift; break ;;\n    - )\t# Use stdin as input.\n       break ;;\n    -* )\n       echo \"$me: invalid option $1$help\"\n       exit 1 ;;\n\n    *local*)\n       # First pass through any local machine types.\n       echo $1\n       exit ;;\n\n    * )\n       break ;;\n  esac\ndone\n\ncase $# in\n 0) echo \"$me: missing argument$help\" >&2\n    exit 1;;\n 1) ;;\n *) echo \"$me: too many arguments$help\" >&2\n    exit 1;;\nesac\n\n# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).\n# Here we must recognize all the valid KERNEL-OS combinations.\nmaybe_os=`echo $1 | sed 's/^\\(.*\\)-\\([^-]*-[^-]*\\)$/\\2/'`\ncase $maybe_os in\n  nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \\\n  uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \\\n  kopensolaris*-gnu* | \\\n  storm-chaos* | os2-emx* | rtmk-nova*)\n    os=-$maybe_os\n    basic_machine=`echo $1 | sed 's/^\\(.*\\)-\\([^-]*-[^-]*\\)$/\\1/'`\n    ;;\n  *)\n    basic_machine=`echo $1 | sed 's/-[^-]*$//'`\n    if [ $basic_machine != $1 ]\n    then os=`echo $1 | sed 's/.*-/-/'`\n    else os=; fi\n    ;;\nesac\n\n### Let's recognize common machines as not being operating systems so\n### that things like config.sub decstation-3100 work.  We also\n### recognize some manufacturers as not being operating systems, so we\n### can provide default operating systems below.\ncase $os in\n\t-sun*os*)\n\t\t# Prevent following clause from handling this invalid input.\n\t\t;;\n\t-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \\\n\t-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \\\n\t-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \\\n\t-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\\\n\t-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \\\n\t-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \\\n\t-apple | -axis | -knuth | -cray | -microblaze)\n\t\tos=\n\t\tbasic_machine=$1\n\t\t;;\n        -bluegene*)\n\t        os=-cnk\n\t\t;;\n\t-sim | -cisco | -oki | -wec | -winbond)\n\t\tos=\n\t\tbasic_machine=$1\n\t\t;;\n\t-scout)\n\t\t;;\n\t-wrs)\n\t\tos=-vxworks\n\t\tbasic_machine=$1\n\t\t;;\n\t-chorusos*)\n\t\tos=-chorusos\n\t\tbasic_machine=$1\n\t\t;;\n \t-chorusrdb)\n \t\tos=-chorusrdb\n\t\tbasic_machine=$1\n \t\t;;\n\t-hiux*)\n\t\tos=-hiuxwe2\n\t\t;;\n\t-sco6)\n\t\tos=-sco5v6\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco5)\n\t\tos=-sco3.2v5\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco4)\n\t\tos=-sco3.2v4\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco3.2.[4-9]*)\n\t\tos=`echo $os | sed -e 's/sco3.2./sco3.2v/'`\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco3.2v[4-9]*)\n\t\t# Don't forget version if it is 3.2v4 or newer.\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco5v6*)\n\t\t# Don't forget version if it is 3.2v4 or newer.\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco*)\n\t\tos=-sco3.2v2\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-udk*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-isc)\n\t\tos=-isc2.2\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-clix*)\n\t\tbasic_machine=clipper-intergraph\n\t\t;;\n\t-isc*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-lynx*)\n\t\tos=-lynxos\n\t\t;;\n\t-ptx*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`\n\t\t;;\n\t-windowsnt*)\n\t\tos=`echo $os | sed -e 's/windowsnt/winnt/'`\n\t\t;;\n\t-psos*)\n\t\tos=-psos\n\t\t;;\n\t-mint | -mint[0-9]*)\n\t\tbasic_machine=m68k-atari\n\t\tos=-mint\n\t\t;;\nesac\n\n# Decode aliases for certain CPU-COMPANY combinations.\ncase $basic_machine in\n\t# Recognize the basic CPU types without company name.\n\t# Some are omitted here because they have special meanings below.\n\t1750a | 580 \\\n\t| a29k \\\n\t| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \\\n\t| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \\\n\t| am33_2.0 \\\n\t| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \\\n\t| bfin \\\n\t| c4x | clipper \\\n\t| d10v | d30v | dlx | dsp16xx \\\n\t| fido | fr30 | frv \\\n\t| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \\\n\t| i370 | i860 | i960 | ia64 \\\n\t| ip2k | iq2000 \\\n\t| lm32 \\\n\t| m32c | m32r | m32rle | m68000 | m68k | m88k \\\n\t| maxq | mb | microblaze | mcore | mep | metag \\\n\t| mips | mipsbe | mipseb | mipsel | mipsle \\\n\t| mips16 \\\n\t| mips64 | mips64el \\\n\t| mips64octeon | mips64octeonel \\\n\t| mips64orion | mips64orionel \\\n\t| mips64r5900 | mips64r5900el \\\n\t| mips64vr | mips64vrel \\\n\t| mips64vr4100 | mips64vr4100el \\\n\t| mips64vr4300 | mips64vr4300el \\\n\t| mips64vr5000 | mips64vr5000el \\\n\t| mips64vr5900 | mips64vr5900el \\\n\t| mipsisa32 | mipsisa32el \\\n\t| mipsisa32r2 | mipsisa32r2el \\\n\t| mipsisa64 | mipsisa64el \\\n\t| mipsisa64r2 | mipsisa64r2el \\\n\t| mipsisa64sb1 | mipsisa64sb1el \\\n\t| mipsisa64sr71k | mipsisa64sr71kel \\\n\t| mipstx39 | mipstx39el \\\n\t| mn10200 | mn10300 \\\n\t| moxie \\\n\t| mt \\\n\t| msp430 \\\n\t| nios | nios2 \\\n\t| ns16k | ns32k \\\n\t| or32 \\\n\t| pdp10 | pdp11 | pj | pjl \\\n\t| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \\\n\t| pyramid \\\n\t| rx \\\n\t| score \\\n\t| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \\\n\t| sh64 | sh64le \\\n\t| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \\\n\t| sparcv8 | sparcv9 | sparcv9b | sparcv9v \\\n\t| spu | strongarm \\\n\t| tahoe | thumb | tic4x | tic80 | tron \\\n\t| ubicom32 \\\n\t| v850 | v850e \\\n\t| we32k \\\n\t| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \\\n\t| z8k | z80)\n\t\tbasic_machine=$basic_machine-unknown\n\t\t;;\n\tm6811 | m68hc11 | m6812 | m68hc12 | picochip)\n\t\t# Motorola 68HC11/12.\n\t\tbasic_machine=$basic_machine-unknown\n\t\tos=-none\n\t\t;;\n\tm88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)\n\t\t;;\n\tms1)\n\t\tbasic_machine=mt-unknown\n\t\t;;\n\n\t# We use `pc' rather than `unknown'\n\t# because (1) that's what they normally are, and\n\t# (2) the word \"unknown\" tends to confuse beginning users.\n\ti*86 | x86_64)\n\t  basic_machine=$basic_machine-pc\n\t  ;;\n\t# Object if more than one company name word.\n\t*-*-*)\n\t\techo Invalid configuration \\`$1\\': machine \\`$basic_machine\\' not recognized 1>&2\n\t\texit 1\n\t\t;;\n\t# Recognize the basic CPU types with company name.\n\t580-* \\\n\t| a29k-* \\\n\t| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \\\n\t| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \\\n\t| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \\\n\t| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \\\n\t| avr-* | avr32-* \\\n\t| bfin-* | bs2000-* \\\n\t| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \\\n\t| clipper-* | craynv-* | cydra-* \\\n\t| d10v-* | d30v-* | dlx-* \\\n\t| elxsi-* \\\n\t| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \\\n\t| h8300-* | h8500-* \\\n\t| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \\\n\t| i*86-* | i860-* | i960-* | ia64-* \\\n\t| ip2k-* | iq2000-* \\\n\t| lm32-* \\\n\t| m32c-* | m32r-* | m32rle-* \\\n\t| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \\\n\t| m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \\\n\t| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \\\n\t| mips16-* \\\n\t| mips64-* | mips64el-* \\\n\t| mips64octeon-* | mips64octeonel-* \\\n\t| mips64orion-* | mips64orionel-* \\\n\t| mips64r5900-* | mips64r5900el-* \\\n\t| mips64vr-* | mips64vrel-* \\\n\t| mips64vr4100-* | mips64vr4100el-* \\\n\t| mips64vr4300-* | mips64vr4300el-* \\\n\t| mips64vr5000-* | mips64vr5000el-* \\\n\t| mips64vr5900-* | mips64vr5900el-* \\\n\t| mipsisa32-* | mipsisa32el-* \\\n\t| mipsisa32r2-* | mipsisa32r2el-* \\\n\t| mipsisa64-* | mipsisa64el-* \\\n\t| mipsisa64r2-* | mipsisa64r2el-* \\\n\t| mipsisa64sb1-* | mipsisa64sb1el-* \\\n\t| mipsisa64sr71k-* | mipsisa64sr71kel-* \\\n\t| mipstx39-* | mipstx39el-* \\\n\t| mmix-* \\\n\t| mt-* \\\n\t| msp430-* \\\n\t| nios-* | nios2-* \\\n\t| none-* | np1-* | ns16k-* | ns32k-* \\\n\t| orion-* \\\n\t| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \\\n\t| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \\\n\t| pyramid-* \\\n\t| romp-* | rs6000-* | rx-* \\\n\t| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \\\n\t| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \\\n\t| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \\\n\t| sparclite-* \\\n\t| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \\\n\t| tahoe-* | thumb-* \\\n\t| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \\\n\t| tile-* | tilegx-* \\\n\t| tron-* \\\n\t| ubicom32-* \\\n\t| v850-* | v850e-* | vax-* \\\n\t| we32k-* \\\n\t| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \\\n\t| xstormy16-* | xtensa*-* \\\n\t| ymp-* \\\n\t| z8k-* | z80-*)\n\t\t;;\n\t# Recognize the basic CPU types without company name, with glob match.\n\txtensa*)\n\t\tbasic_machine=$basic_machine-unknown\n\t\t;;\n\t# Recognize the various machine names and aliases which stand\n\t# for a CPU type and a company and sometimes even an OS.\n\t386bsd)\n\t\tbasic_machine=i386-unknown\n\t\tos=-bsd\n\t\t;;\n\t3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)\n\t\tbasic_machine=m68000-att\n\t\t;;\n\t3b*)\n\t\tbasic_machine=we32k-att\n\t\t;;\n\ta29khif)\n\t\tbasic_machine=a29k-amd\n\t\tos=-udi\n\t\t;;\n    \tabacus)\n\t\tbasic_machine=abacus-unknown\n\t\t;;\n\tadobe68k)\n\t\tbasic_machine=m68010-adobe\n\t\tos=-scout\n\t\t;;\n\talliant | fx80)\n\t\tbasic_machine=fx80-alliant\n\t\t;;\n\taltos | altos3068)\n\t\tbasic_machine=m68k-altos\n\t\t;;\n\tam29k)\n\t\tbasic_machine=a29k-none\n\t\tos=-bsd\n\t\t;;\n\tamd64)\n\t\tbasic_machine=x86_64-pc\n\t\t;;\n\tamd64-*)\n\t\tbasic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tamdahl)\n\t\tbasic_machine=580-amdahl\n\t\tos=-sysv\n\t\t;;\n\tamiga | amiga-*)\n\t\tbasic_machine=m68k-unknown\n\t\t;;\n\tamigaos | amigados)\n\t\tbasic_machine=m68k-unknown\n\t\tos=-amigaos\n\t\t;;\n\tamigaunix | amix)\n\t\tbasic_machine=m68k-unknown\n\t\tos=-sysv4\n\t\t;;\n\tapollo68)\n\t\tbasic_machine=m68k-apollo\n\t\tos=-sysv\n\t\t;;\n\tapollo68bsd)\n\t\tbasic_machine=m68k-apollo\n\t\tos=-bsd\n\t\t;;\n\taros)\n\t\tbasic_machine=i386-pc\n\t\tos=-aros\n\t\t;;\n\taux)\n\t\tbasic_machine=m68k-apple\n\t\tos=-aux\n\t\t;;\n\tbalance)\n\t\tbasic_machine=ns32k-sequent\n\t\tos=-dynix\n\t\t;;\n\tblackfin)\n\t\tbasic_machine=bfin-unknown\n\t\tos=-linux\n\t\t;;\n\tblackfin-*)\n\t\tbasic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\tos=-linux\n\t\t;;\n\tbluegene*)\n\t\tbasic_machine=powerpc-ibm\n\t\tos=-cnk\n\t\t;;\n\tc90)\n\t\tbasic_machine=c90-cray\n\t\tos=-unicos\n\t\t;;\n        cegcc)\n\t\tbasic_machine=arm-unknown\n\t\tos=-cegcc\n\t\t;;\n\tconvex-c1)\n\t\tbasic_machine=c1-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c2)\n\t\tbasic_machine=c2-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c32)\n\t\tbasic_machine=c32-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c34)\n\t\tbasic_machine=c34-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c38)\n\t\tbasic_machine=c38-convex\n\t\tos=-bsd\n\t\t;;\n\tcray | j90)\n\t\tbasic_machine=j90-cray\n\t\tos=-unicos\n\t\t;;\n\tcraynv)\n\t\tbasic_machine=craynv-cray\n\t\tos=-unicosmp\n\t\t;;\n\tcr16)\n\t\tbasic_machine=cr16-unknown\n\t\tos=-elf\n\t\t;;\n\tcrds | unos)\n\t\tbasic_machine=m68k-crds\n\t\t;;\n\tcrisv32 | crisv32-* | etraxfs*)\n\t\tbasic_machine=crisv32-axis\n\t\t;;\n\tcris | cris-* | etrax*)\n\t\tbasic_machine=cris-axis\n\t\t;;\n\tcrx)\n\t\tbasic_machine=crx-unknown\n\t\tos=-elf\n\t\t;;\n\tda30 | da30-*)\n\t\tbasic_machine=m68k-da30\n\t\t;;\n\tdecstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)\n\t\tbasic_machine=mips-dec\n\t\t;;\n\tdecsystem10* | dec10*)\n\t\tbasic_machine=pdp10-dec\n\t\tos=-tops10\n\t\t;;\n\tdecsystem20* | dec20*)\n\t\tbasic_machine=pdp10-dec\n\t\tos=-tops20\n\t\t;;\n\tdelta | 3300 | motorola-3300 | motorola-delta \\\n\t      | 3300-motorola | delta-motorola)\n\t\tbasic_machine=m68k-motorola\n\t\t;;\n\tdelta88)\n\t\tbasic_machine=m88k-motorola\n\t\tos=-sysv3\n\t\t;;\n\tdicos)\n\t\tbasic_machine=i686-pc\n\t\tos=-dicos\n\t\t;;\n\tdjgpp)\n\t\tbasic_machine=i586-pc\n\t\tos=-msdosdjgpp\n\t\t;;\n\tdpx20 | dpx20-*)\n\t\tbasic_machine=rs6000-bull\n\t\tos=-bosx\n\t\t;;\n\tdpx2* | dpx2*-bull)\n\t\tbasic_machine=m68k-bull\n\t\tos=-sysv3\n\t\t;;\n\tebmon29k)\n\t\tbasic_machine=a29k-amd\n\t\tos=-ebmon\n\t\t;;\n\telxsi)\n\t\tbasic_machine=elxsi-elxsi\n\t\tos=-bsd\n\t\t;;\n\tencore | umax | mmax)\n\t\tbasic_machine=ns32k-encore\n\t\t;;\n\tes1800 | OSE68k | ose68k | ose | OSE)\n\t\tbasic_machine=m68k-ericsson\n\t\tos=-ose\n\t\t;;\n\tfx2800)\n\t\tbasic_machine=i860-alliant\n\t\t;;\n\tgenix)\n\t\tbasic_machine=ns32k-ns\n\t\t;;\n\tgmicro)\n\t\tbasic_machine=tron-gmicro\n\t\tos=-sysv\n\t\t;;\n\tgo32)\n\t\tbasic_machine=i386-pc\n\t\tos=-go32\n\t\t;;\n\th3050r* | hiux*)\n\t\tbasic_machine=hppa1.1-hitachi\n\t\tos=-hiuxwe2\n\t\t;;\n\th8300hms)\n\t\tbasic_machine=h8300-hitachi\n\t\tos=-hms\n\t\t;;\n\th8300xray)\n\t\tbasic_machine=h8300-hitachi\n\t\tos=-xray\n\t\t;;\n\th8500hms)\n\t\tbasic_machine=h8500-hitachi\n\t\tos=-hms\n\t\t;;\n\tharris)\n\t\tbasic_machine=m88k-harris\n\t\tos=-sysv3\n\t\t;;\n\thp300-*)\n\t\tbasic_machine=m68k-hp\n\t\t;;\n\thp300bsd)\n\t\tbasic_machine=m68k-hp\n\t\tos=-bsd\n\t\t;;\n\thp300hpux)\n\t\tbasic_machine=m68k-hp\n\t\tos=-hpux\n\t\t;;\n\thp3k9[0-9][0-9] | hp9[0-9][0-9])\n\t\tbasic_machine=hppa1.0-hp\n\t\t;;\n\thp9k2[0-9][0-9] | hp9k31[0-9])\n\t\tbasic_machine=m68000-hp\n\t\t;;\n\thp9k3[2-9][0-9])\n\t\tbasic_machine=m68k-hp\n\t\t;;\n\thp9k6[0-9][0-9] | hp6[0-9][0-9])\n\t\tbasic_machine=hppa1.0-hp\n\t\t;;\n\thp9k7[0-79][0-9] | hp7[0-79][0-9])\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k78[0-9] | hp78[0-9])\n\t\t# FIXME: really hppa2.0-hp\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)\n\t\t# FIXME: really hppa2.0-hp\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k8[0-9][13679] | hp8[0-9][13679])\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k8[0-9][0-9] | hp8[0-9][0-9])\n\t\tbasic_machine=hppa1.0-hp\n\t\t;;\n\thppa-next)\n\t\tos=-nextstep3\n\t\t;;\n\thppaosf)\n\t\tbasic_machine=hppa1.1-hp\n\t\tos=-osf\n\t\t;;\n\thppro)\n\t\tbasic_machine=hppa1.1-hp\n\t\tos=-proelf\n\t\t;;\n\ti370-ibm* | ibm*)\n\t\tbasic_machine=i370-ibm\n\t\t;;\n# I'm not sure what \"Sysv32\" means.  Should this be sysv3.2?\n\ti*86v32)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-sysv32\n\t\t;;\n\ti*86v4*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-sysv4\n\t\t;;\n\ti*86v)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-sysv\n\t\t;;\n\ti*86sol2)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-solaris2\n\t\t;;\n\ti386mach)\n\t\tbasic_machine=i386-mach\n\t\tos=-mach\n\t\t;;\n\ti386-vsta | vsta)\n\t\tbasic_machine=i386-unknown\n\t\tos=-vsta\n\t\t;;\n\tiris | iris4d)\n\t\tbasic_machine=mips-sgi\n\t\tcase $os in\n\t\t    -irix*)\n\t\t\t;;\n\t\t    *)\n\t\t\tos=-irix4\n\t\t\t;;\n\t\tesac\n\t\t;;\n\tisi68 | isi)\n\t\tbasic_machine=m68k-isi\n\t\tos=-sysv\n\t\t;;\n\tm68knommu)\n\t\tbasic_machine=m68k-unknown\n\t\tos=-linux\n\t\t;;\n\tm68knommu-*)\n\t\tbasic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\tos=-linux\n\t\t;;\n\tm88k-omron*)\n\t\tbasic_machine=m88k-omron\n\t\t;;\n\tmagnum | m3230)\n\t\tbasic_machine=mips-mips\n\t\tos=-sysv\n\t\t;;\n\tmerlin)\n\t\tbasic_machine=ns32k-utek\n\t\tos=-sysv\n\t\t;;\n        microblaze)\n\t\tbasic_machine=microblaze-xilinx\n\t\t;;\n\tmingw32)\n\t\tbasic_machine=i386-pc\n\t\tos=-mingw32\n\t\t;;\n\tmingw32ce)\n\t\tbasic_machine=arm-unknown\n\t\tos=-mingw32ce\n\t\t;;\n\tminiframe)\n\t\tbasic_machine=m68000-convergent\n\t\t;;\n\t*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)\n\t\tbasic_machine=m68k-atari\n\t\tos=-mint\n\t\t;;\n\tmips3*-*)\n\t\tbasic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`\n\t\t;;\n\tmips3*)\n\t\tbasic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown\n\t\t;;\n\tmonitor)\n\t\tbasic_machine=m68k-rom68k\n\t\tos=-coff\n\t\t;;\n\tmorphos)\n\t\tbasic_machine=powerpc-unknown\n\t\tos=-morphos\n\t\t;;\n\tmsdos)\n\t\tbasic_machine=i386-pc\n\t\tos=-msdos\n\t\t;;\n\tms1-*)\n\t\tbasic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`\n\t\t;;\n\tmvs)\n\t\tbasic_machine=i370-ibm\n\t\tos=-mvs\n\t\t;;\n\tncr3000)\n\t\tbasic_machine=i486-ncr\n\t\tos=-sysv4\n\t\t;;\n\tnetbsd386)\n\t\tbasic_machine=i386-unknown\n\t\tos=-netbsd\n\t\t;;\n\tnetwinder)\n\t\tbasic_machine=armv4l-rebel\n\t\tos=-linux\n\t\t;;\n\tnews | news700 | news800 | news900)\n\t\tbasic_machine=m68k-sony\n\t\tos=-newsos\n\t\t;;\n\tnews1000)\n\t\tbasic_machine=m68030-sony\n\t\tos=-newsos\n\t\t;;\n\tnews-3600 | risc-news)\n\t\tbasic_machine=mips-sony\n\t\tos=-newsos\n\t\t;;\n\tnecv70)\n\t\tbasic_machine=v70-nec\n\t\tos=-sysv\n\t\t;;\n\tnext | m*-next )\n\t\tbasic_machine=m68k-next\n\t\tcase $os in\n\t\t    -nextstep* )\n\t\t\t;;\n\t\t    -ns2*)\n\t\t      os=-nextstep2\n\t\t\t;;\n\t\t    *)\n\t\t      os=-nextstep3\n\t\t\t;;\n\t\tesac\n\t\t;;\n\tnh3000)\n\t\tbasic_machine=m68k-harris\n\t\tos=-cxux\n\t\t;;\n\tnh[45]000)\n\t\tbasic_machine=m88k-harris\n\t\tos=-cxux\n\t\t;;\n\tnindy960)\n\t\tbasic_machine=i960-intel\n\t\tos=-nindy\n\t\t;;\n\tmon960)\n\t\tbasic_machine=i960-intel\n\t\tos=-mon960\n\t\t;;\n\tnonstopux)\n\t\tbasic_machine=mips-compaq\n\t\tos=-nonstopux\n\t\t;;\n\tnp1)\n\t\tbasic_machine=np1-gould\n\t\t;;\n\tnsr-tandem)\n\t\tbasic_machine=nsr-tandem\n\t\t;;\n\top50n-* | op60c-*)\n\t\tbasic_machine=hppa1.1-oki\n\t\tos=-proelf\n\t\t;;\n\topenrisc | openrisc-*)\n\t\tbasic_machine=or32-unknown\n\t\t;;\n\tos400)\n\t\tbasic_machine=powerpc-ibm\n\t\tos=-os400\n\t\t;;\n\tOSE68000 | ose68000)\n\t\tbasic_machine=m68000-ericsson\n\t\tos=-ose\n\t\t;;\n\tos68k)\n\t\tbasic_machine=m68k-none\n\t\tos=-os68k\n\t\t;;\n\tpa-hitachi)\n\t\tbasic_machine=hppa1.1-hitachi\n\t\tos=-hiuxwe2\n\t\t;;\n\tparagon)\n\t\tbasic_machine=i860-intel\n\t\tos=-osf\n\t\t;;\n\tparisc)\n\t\tbasic_machine=hppa-unknown\n\t\tos=-linux\n\t\t;;\n\tparisc-*)\n\t\tbasic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\tos=-linux\n\t\t;;\n\tpbd)\n\t\tbasic_machine=sparc-tti\n\t\t;;\n\tpbb)\n\t\tbasic_machine=m68k-tti\n\t\t;;\n\tpc532 | pc532-*)\n\t\tbasic_machine=ns32k-pc532\n\t\t;;\n\tpc98)\n\t\tbasic_machine=i386-pc\n\t\t;;\n\tpc98-*)\n\t\tbasic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpentium | p5 | k5 | k6 | nexgen | viac3)\n\t\tbasic_machine=i586-pc\n\t\t;;\n\tpentiumpro | p6 | 6x86 | athlon | athlon_*)\n\t\tbasic_machine=i686-pc\n\t\t;;\n\tpentiumii | pentium2 | pentiumiii | pentium3)\n\t\tbasic_machine=i686-pc\n\t\t;;\n\tpentium4)\n\t\tbasic_machine=i786-pc\n\t\t;;\n\tpentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)\n\t\tbasic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpentiumpro-* | p6-* | 6x86-* | athlon-*)\n\t\tbasic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)\n\t\tbasic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpentium4-*)\n\t\tbasic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpn)\n\t\tbasic_machine=pn-gould\n\t\t;;\n\tpower)\tbasic_machine=power-ibm\n\t\t;;\n\tppc)\tbasic_machine=powerpc-unknown\n\t\t;;\n\tppc-*)\tbasic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tppcle | powerpclittle | ppc-le | powerpc-little)\n\t\tbasic_machine=powerpcle-unknown\n\t\t;;\n\tppcle-* | powerpclittle-*)\n\t\tbasic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tppc64)\tbasic_machine=powerpc64-unknown\n\t\t;;\n\tppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tppc64le | powerpc64little | ppc64-le | powerpc64-little)\n\t\tbasic_machine=powerpc64le-unknown\n\t\t;;\n\tppc64le-* | powerpc64little-*)\n\t\tbasic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tps2)\n\t\tbasic_machine=i386-ibm\n\t\t;;\n\tpw32)\n\t\tbasic_machine=i586-unknown\n\t\tos=-pw32\n\t\t;;\n\trdos)\n\t\tbasic_machine=i386-pc\n\t\tos=-rdos\n\t\t;;\n\trom68k)\n\t\tbasic_machine=m68k-rom68k\n\t\tos=-coff\n\t\t;;\n\trm[46]00)\n\t\tbasic_machine=mips-siemens\n\t\t;;\n\trtpc | rtpc-*)\n\t\tbasic_machine=romp-ibm\n\t\t;;\n\ts390 | s390-*)\n\t\tbasic_machine=s390-ibm\n\t\t;;\n\ts390x | s390x-*)\n\t\tbasic_machine=s390x-ibm\n\t\t;;\n\tsa29200)\n\t\tbasic_machine=a29k-amd\n\t\tos=-udi\n\t\t;;\n\tsb1)\n\t\tbasic_machine=mipsisa64sb1-unknown\n\t\t;;\n\tsb1el)\n\t\tbasic_machine=mipsisa64sb1el-unknown\n\t\t;;\n\tsde)\n\t\tbasic_machine=mipsisa32-sde\n\t\tos=-elf\n\t\t;;\n\tsei)\n\t\tbasic_machine=mips-sei\n\t\tos=-seiux\n\t\t;;\n\tsequent)\n\t\tbasic_machine=i386-sequent\n\t\t;;\n\tsh)\n\t\tbasic_machine=sh-hitachi\n\t\tos=-hms\n\t\t;;\n\tsh5el)\n\t\tbasic_machine=sh5le-unknown\n\t\t;;\n\tsh64)\n\t\tbasic_machine=sh64-unknown\n\t\t;;\n\tsparclite-wrs | simso-wrs)\n\t\tbasic_machine=sparclite-wrs\n\t\tos=-vxworks\n\t\t;;\n\tsps7)\n\t\tbasic_machine=m68k-bull\n\t\tos=-sysv2\n\t\t;;\n\tspur)\n\t\tbasic_machine=spur-unknown\n\t\t;;\n\tst2000)\n\t\tbasic_machine=m68k-tandem\n\t\t;;\n\tstratus)\n\t\tbasic_machine=i860-stratus\n\t\tos=-sysv4\n\t\t;;\n\tsun2)\n\t\tbasic_machine=m68000-sun\n\t\t;;\n\tsun2os3)\n\t\tbasic_machine=m68000-sun\n\t\tos=-sunos3\n\t\t;;\n\tsun2os4)\n\t\tbasic_machine=m68000-sun\n\t\tos=-sunos4\n\t\t;;\n\tsun3os3)\n\t\tbasic_machine=m68k-sun\n\t\tos=-sunos3\n\t\t;;\n\tsun3os4)\n\t\tbasic_machine=m68k-sun\n\t\tos=-sunos4\n\t\t;;\n\tsun4os3)\n\t\tbasic_machine=sparc-sun\n\t\tos=-sunos3\n\t\t;;\n\tsun4os4)\n\t\tbasic_machine=sparc-sun\n\t\tos=-sunos4\n\t\t;;\n\tsun4sol2)\n\t\tbasic_machine=sparc-sun\n\t\tos=-solaris2\n\t\t;;\n\tsun3 | sun3-*)\n\t\tbasic_machine=m68k-sun\n\t\t;;\n\tsun4)\n\t\tbasic_machine=sparc-sun\n\t\t;;\n\tsun386 | sun386i | roadrunner)\n\t\tbasic_machine=i386-sun\n\t\t;;\n\tsv1)\n\t\tbasic_machine=sv1-cray\n\t\tos=-unicos\n\t\t;;\n\tsymmetry)\n\t\tbasic_machine=i386-sequent\n\t\tos=-dynix\n\t\t;;\n\tt3e)\n\t\tbasic_machine=alphaev5-cray\n\t\tos=-unicos\n\t\t;;\n\tt90)\n\t\tbasic_machine=t90-cray\n\t\tos=-unicos\n\t\t;;\n\ttic54x | c54x*)\n\t\tbasic_machine=tic54x-unknown\n\t\tos=-coff\n\t\t;;\n\ttic55x | c55x*)\n\t\tbasic_machine=tic55x-unknown\n\t\tos=-coff\n\t\t;;\n\ttic6x | c6x*)\n\t\tbasic_machine=tic6x-unknown\n\t\tos=-coff\n\t\t;;\n        # This must be matched before tile*.\n        tilegx*)\n\t\tbasic_machine=tilegx-unknown\n\t\tos=-linux-gnu\n\t\t;;\n\ttile*)\n\t\tbasic_machine=tile-unknown\n\t\tos=-linux-gnu\n\t\t;;\n\ttx39)\n\t\tbasic_machine=mipstx39-unknown\n\t\t;;\n\ttx39el)\n\t\tbasic_machine=mipstx39el-unknown\n\t\t;;\n\ttoad1)\n\t\tbasic_machine=pdp10-xkl\n\t\tos=-tops20\n\t\t;;\n\ttower | tower-32)\n\t\tbasic_machine=m68k-ncr\n\t\t;;\n\ttpf)\n\t\tbasic_machine=s390x-ibm\n\t\tos=-tpf\n\t\t;;\n\tudi29k)\n\t\tbasic_machine=a29k-amd\n\t\tos=-udi\n\t\t;;\n\tultra3)\n\t\tbasic_machine=a29k-nyu\n\t\tos=-sym1\n\t\t;;\n\tv810 | necv810)\n\t\tbasic_machine=v810-nec\n\t\tos=-none\n\t\t;;\n\tvaxv)\n\t\tbasic_machine=vax-dec\n\t\tos=-sysv\n\t\t;;\n\tvms)\n\t\tbasic_machine=vax-dec\n\t\tos=-vms\n\t\t;;\n\tvpp*|vx|vx-*)\n\t\tbasic_machine=f301-fujitsu\n\t\t;;\n\tvxworks960)\n\t\tbasic_machine=i960-wrs\n\t\tos=-vxworks\n\t\t;;\n\tvxworks68)\n\t\tbasic_machine=m68k-wrs\n\t\tos=-vxworks\n\t\t;;\n\tvxworks29k)\n\t\tbasic_machine=a29k-wrs\n\t\tos=-vxworks\n\t\t;;\n\tw65*)\n\t\tbasic_machine=w65-wdc\n\t\tos=-none\n\t\t;;\n\tw89k-*)\n\t\tbasic_machine=hppa1.1-winbond\n\t\tos=-proelf\n\t\t;;\n\txbox)\n\t\tbasic_machine=i686-pc\n\t\tos=-mingw32\n\t\t;;\n\txps | xps100)\n\t\tbasic_machine=xps100-honeywell\n\t\t;;\n\tymp)\n\t\tbasic_machine=ymp-cray\n\t\tos=-unicos\n\t\t;;\n\tz8k-*-coff)\n\t\tbasic_machine=z8k-unknown\n\t\tos=-sim\n\t\t;;\n\tz80-*-coff)\n\t\tbasic_machine=z80-unknown\n\t\tos=-sim\n\t\t;;\n\tnone)\n\t\tbasic_machine=none-none\n\t\tos=-none\n\t\t;;\n\n# Here we handle the default manufacturer of certain CPU types.  It is in\n# some cases the only manufacturer, in others, it is the most popular.\n\tw89k)\n\t\tbasic_machine=hppa1.1-winbond\n\t\t;;\n\top50n)\n\t\tbasic_machine=hppa1.1-oki\n\t\t;;\n\top60c)\n\t\tbasic_machine=hppa1.1-oki\n\t\t;;\n\tromp)\n\t\tbasic_machine=romp-ibm\n\t\t;;\n\tmmix)\n\t\tbasic_machine=mmix-knuth\n\t\t;;\n\trs6000)\n\t\tbasic_machine=rs6000-ibm\n\t\t;;\n\tvax)\n\t\tbasic_machine=vax-dec\n\t\t;;\n\tpdp10)\n\t\t# there are many clones, so DEC is not a safe bet\n\t\tbasic_machine=pdp10-unknown\n\t\t;;\n\tpdp11)\n\t\tbasic_machine=pdp11-dec\n\t\t;;\n\twe32k)\n\t\tbasic_machine=we32k-att\n\t\t;;\n\tsh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)\n\t\tbasic_machine=sh-unknown\n\t\t;;\n\tsparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)\n\t\tbasic_machine=sparc-sun\n\t\t;;\n\tcydra)\n\t\tbasic_machine=cydra-cydrome\n\t\t;;\n\torion)\n\t\tbasic_machine=orion-highlevel\n\t\t;;\n\torion105)\n\t\tbasic_machine=clipper-highlevel\n\t\t;;\n\tmac | mpw | mac-mpw)\n\t\tbasic_machine=m68k-apple\n\t\t;;\n\tpmac | pmac-mpw)\n\t\tbasic_machine=powerpc-apple\n\t\t;;\n\t*-unknown)\n\t\t# Make sure to match an already-canonicalized machine name.\n\t\t;;\n\t*)\n\t\techo Invalid configuration \\`$1\\': machine \\`$basic_machine\\' not recognized 1>&2\n\t\texit 1\n\t\t;;\nesac\n\n# Here we canonicalize certain aliases for manufacturers.\ncase $basic_machine in\n\t*-digital*)\n\t\tbasic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`\n\t\t;;\n\t*-commodore*)\n\t\tbasic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`\n\t\t;;\n\t*)\n\t\t;;\nesac\n\n# Decode manufacturer-specific aliases for certain operating systems.\n\nif [ x\"$os\" != x\"\" ]\nthen\ncase $os in\n        # First match some system type aliases\n        # that might get confused with valid system types.\n\t# -solaris* is a basic system type, with this one exception.\n        -auroraux)\n\t        os=-auroraux\n\t\t;;\n\t-solaris1 | -solaris1.*)\n\t\tos=`echo $os | sed -e 's|solaris1|sunos4|'`\n\t\t;;\n\t-solaris)\n\t\tos=-solaris2\n\t\t;;\n\t-svr4*)\n\t\tos=-sysv4\n\t\t;;\n\t-unixware*)\n\t\tos=-sysv4.2uw\n\t\t;;\n\t-gnu/linux*)\n\t\tos=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`\n\t\t;;\n\t# First accept the basic system types.\n\t# The portable systems comes first.\n\t# Each alternative MUST END IN A *, to match a version number.\n\t# -sysv* is not here because it comes later, after sysvr4.\n\t-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \\\n\t      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\\\n\t      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \\\n\t      | -sym* | -kopensolaris* \\\n\t      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \\\n\t      | -aos* | -aros* \\\n\t      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \\\n\t      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \\\n\t      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \\\n\t      | -openbsd* | -solidbsd* \\\n\t      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \\\n\t      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \\\n\t      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \\\n\t      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \\\n\t      | -chorusos* | -chorusrdb* | -cegcc* \\\n\t      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \\\n\t      | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \\\n\t      | -uxpv* | -beos* | -mpeix* | -udk* \\\n\t      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \\\n\t      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \\\n\t      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \\\n\t      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \\\n\t      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \\\n\t      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \\\n\t      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)\n\t# Remember, each alternative MUST END IN *, to match a version number.\n\t\t;;\n\t-qnx*)\n\t\tcase $basic_machine in\n\t\t    x86-* | i*86-*)\n\t\t\t;;\n\t\t    *)\n\t\t\tos=-nto$os\n\t\t\t;;\n\t\tesac\n\t\t;;\n\t-nto-qnx*)\n\t\t;;\n\t-nto*)\n\t\tos=`echo $os | sed -e 's|nto|nto-qnx|'`\n\t\t;;\n\t-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \\\n\t      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \\\n\t      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)\n\t\t;;\n\t-mac*)\n\t\tos=`echo $os | sed -e 's|mac|macos|'`\n\t\t;;\n\t-linux-dietlibc)\n\t\tos=-linux-dietlibc\n\t\t;;\n\t-linux*)\n\t\tos=`echo $os | sed -e 's|linux|linux-gnu|'`\n\t\t;;\n\t-sunos5*)\n\t\tos=`echo $os | sed -e 's|sunos5|solaris2|'`\n\t\t;;\n\t-sunos6*)\n\t\tos=`echo $os | sed -e 's|sunos6|solaris3|'`\n\t\t;;\n\t-opened*)\n\t\tos=-openedition\n\t\t;;\n        -os400*)\n\t\tos=-os400\n\t\t;;\n\t-wince*)\n\t\tos=-wince\n\t\t;;\n\t-osfrose*)\n\t\tos=-osfrose\n\t\t;;\n\t-osf*)\n\t\tos=-osf\n\t\t;;\n\t-utek*)\n\t\tos=-bsd\n\t\t;;\n\t-dynix*)\n\t\tos=-bsd\n\t\t;;\n\t-acis*)\n\t\tos=-aos\n\t\t;;\n\t-atheos*)\n\t\tos=-atheos\n\t\t;;\n\t-syllable*)\n\t\tos=-syllable\n\t\t;;\n\t-386bsd)\n\t\tos=-bsd\n\t\t;;\n\t-ctix* | -uts*)\n\t\tos=-sysv\n\t\t;;\n\t-nova*)\n\t\tos=-rtmk-nova\n\t\t;;\n\t-ns2 )\n\t\tos=-nextstep2\n\t\t;;\n\t-nsk*)\n\t\tos=-nsk\n\t\t;;\n\t# Preserve the version number of sinix5.\n\t-sinix5.*)\n\t\tos=`echo $os | sed -e 's|sinix|sysv|'`\n\t\t;;\n\t-sinix*)\n\t\tos=-sysv4\n\t\t;;\n        -tpf*)\n\t\tos=-tpf\n\t\t;;\n\t-triton*)\n\t\tos=-sysv3\n\t\t;;\n\t-oss*)\n\t\tos=-sysv3\n\t\t;;\n\t-svr4)\n\t\tos=-sysv4\n\t\t;;\n\t-svr3)\n\t\tos=-sysv3\n\t\t;;\n\t-sysvr4)\n\t\tos=-sysv4\n\t\t;;\n\t# This must come after -sysvr4.\n\t-sysv*)\n\t\t;;\n\t-ose*)\n\t\tos=-ose\n\t\t;;\n\t-es1800*)\n\t\tos=-ose\n\t\t;;\n\t-xenix)\n\t\tos=-xenix\n\t\t;;\n\t-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)\n\t\tos=-mint\n\t\t;;\n\t-aros*)\n\t\tos=-aros\n\t\t;;\n\t-kaos*)\n\t\tos=-kaos\n\t\t;;\n\t-zvmoe)\n\t\tos=-zvmoe\n\t\t;;\n\t-dicos*)\n\t\tos=-dicos\n\t\t;;\n        -nacl*)\n\t        ;;\n\t-none)\n\t\t;;\n\t*)\n\t\t# Get rid of the `-' at the beginning of $os.\n\t\tos=`echo $os | sed 's/[^-]*-//'`\n\t\techo Invalid configuration \\`$1\\': system \\`$os\\' not recognized 1>&2\n\t\texit 1\n\t\t;;\nesac\nelse\n\n# Here we handle the default operating systems that come with various machines.\n# The value should be what the vendor currently ships out the door with their\n# machine or put another way, the most popular os provided with the machine.\n\n# Note that if you're going to try to match \"-MANUFACTURER\" here (say,\n# \"-sun\"), then you have to tell the case statement up towards the top\n# that MANUFACTURER isn't an operating system.  Otherwise, code above\n# will signal an error saying that MANUFACTURER isn't an operating\n# system, and we'll never get to this point.\n\ncase $basic_machine in\n        score-*)\n\t\tos=-elf\n\t\t;;\n        spu-*)\n\t\tos=-elf\n\t\t;;\n\t*-acorn)\n\t\tos=-riscix1.2\n\t\t;;\n\tarm*-rebel)\n\t\tos=-linux\n\t\t;;\n\tarm*-semi)\n\t\tos=-aout\n\t\t;;\n        c4x-* | tic4x-*)\n        \tos=-coff\n\t\t;;\n\t# This must come before the *-dec entry.\n\tpdp10-*)\n\t\tos=-tops20\n\t\t;;\n\tpdp11-*)\n\t\tos=-none\n\t\t;;\n\t*-dec | vax-*)\n\t\tos=-ultrix4.2\n\t\t;;\n\tm68*-apollo)\n\t\tos=-domain\n\t\t;;\n\ti386-sun)\n\t\tos=-sunos4.0.2\n\t\t;;\n\tm68000-sun)\n\t\tos=-sunos3\n\t\t# This also exists in the configure program, but was not the\n\t\t# default.\n\t\t# os=-sunos4\n\t\t;;\n\tm68*-cisco)\n\t\tos=-aout\n\t\t;;\n        mep-*)\n\t\tos=-elf\n\t\t;;\n\tmips*-cisco)\n\t\tos=-elf\n\t\t;;\n\tmips*-*)\n\t\tos=-elf\n\t\t;;\n\tor32-*)\n\t\tos=-coff\n\t\t;;\n\t*-tti)\t# must be before sparc entry or we get the wrong os.\n\t\tos=-sysv3\n\t\t;;\n\tsparc-* | *-sun)\n\t\tos=-sunos4.1.1\n\t\t;;\n\t*-be)\n\t\tos=-beos\n\t\t;;\n\t*-haiku)\n\t\tos=-haiku\n\t\t;;\n\t*-ibm)\n\t\tos=-aix\n\t\t;;\n    \t*-knuth)\n\t\tos=-mmixware\n\t\t;;\n\t*-wec)\n\t\tos=-proelf\n\t\t;;\n\t*-winbond)\n\t\tos=-proelf\n\t\t;;\n\t*-oki)\n\t\tos=-proelf\n\t\t;;\n\t*-hp)\n\t\tos=-hpux\n\t\t;;\n\t*-hitachi)\n\t\tos=-hiux\n\t\t;;\n\ti860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)\n\t\tos=-sysv\n\t\t;;\n\t*-cbm)\n\t\tos=-amigaos\n\t\t;;\n\t*-dg)\n\t\tos=-dgux\n\t\t;;\n\t*-dolphin)\n\t\tos=-sysv3\n\t\t;;\n\tm68k-ccur)\n\t\tos=-rtu\n\t\t;;\n\tm88k-omron*)\n\t\tos=-luna\n\t\t;;\n\t*-next )\n\t\tos=-nextstep\n\t\t;;\n\t*-sequent)\n\t\tos=-ptx\n\t\t;;\n\t*-crds)\n\t\tos=-unos\n\t\t;;\n\t*-ns)\n\t\tos=-genix\n\t\t;;\n\ti370-*)\n\t\tos=-mvs\n\t\t;;\n\t*-next)\n\t\tos=-nextstep3\n\t\t;;\n\t*-gould)\n\t\tos=-sysv\n\t\t;;\n\t*-highlevel)\n\t\tos=-bsd\n\t\t;;\n\t*-encore)\n\t\tos=-bsd\n\t\t;;\n\t*-sgi)\n\t\tos=-irix\n\t\t;;\n\t*-siemens)\n\t\tos=-sysv4\n\t\t;;\n\t*-masscomp)\n\t\tos=-rtu\n\t\t;;\n\tf30[01]-fujitsu | f700-fujitsu)\n\t\tos=-uxpv\n\t\t;;\n\t*-rom68k)\n\t\tos=-coff\n\t\t;;\n\t*-*bug)\n\t\tos=-coff\n\t\t;;\n\t*-apple)\n\t\tos=-macos\n\t\t;;\n\t*-atari*)\n\t\tos=-mint\n\t\t;;\n\t*)\n\t\tos=-none\n\t\t;;\nesac\nfi\n\n# Here we handle the case where we know the os, and the CPU type, but not the\n# manufacturer.  We pick the logical manufacturer.\nvendor=unknown\ncase $basic_machine in\n\t*-unknown)\n\t\tcase $os in\n\t\t\t-riscix*)\n\t\t\t\tvendor=acorn\n\t\t\t\t;;\n\t\t\t-sunos*)\n\t\t\t\tvendor=sun\n\t\t\t\t;;\n\t\t\t-cnk*|-aix*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t-beos*)\n\t\t\t\tvendor=be\n\t\t\t\t;;\n\t\t\t-hpux*)\n\t\t\t\tvendor=hp\n\t\t\t\t;;\n\t\t\t-mpeix*)\n\t\t\t\tvendor=hp\n\t\t\t\t;;\n\t\t\t-hiux*)\n\t\t\t\tvendor=hitachi\n\t\t\t\t;;\n\t\t\t-unos*)\n\t\t\t\tvendor=crds\n\t\t\t\t;;\n\t\t\t-dgux*)\n\t\t\t\tvendor=dg\n\t\t\t\t;;\n\t\t\t-luna*)\n\t\t\t\tvendor=omron\n\t\t\t\t;;\n\t\t\t-genix*)\n\t\t\t\tvendor=ns\n\t\t\t\t;;\n\t\t\t-mvs* | -opened*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t-os400*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t-ptx*)\n\t\t\t\tvendor=sequent\n\t\t\t\t;;\n\t\t\t-tpf*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t-vxsim* | -vxworks* | -windiss*)\n\t\t\t\tvendor=wrs\n\t\t\t\t;;\n\t\t\t-aux*)\n\t\t\t\tvendor=apple\n\t\t\t\t;;\n\t\t\t-hms*)\n\t\t\t\tvendor=hitachi\n\t\t\t\t;;\n\t\t\t-mpw* | -macos*)\n\t\t\t\tvendor=apple\n\t\t\t\t;;\n\t\t\t-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)\n\t\t\t\tvendor=atari\n\t\t\t\t;;\n\t\t\t-vos*)\n\t\t\t\tvendor=stratus\n\t\t\t\t;;\n\t\tesac\n\t\tbasic_machine=`echo $basic_machine | sed \"s/unknown/$vendor/\"`\n\t\t;;\nesac\n\necho $basic_machine$os\nexit\n\n# Local variables:\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"timestamp='\"\n# time-stamp-format: \"%:y-%02m-%02d\"\n# time-stamp-end: \"'\"\n# End:\n"
  },
  {
    "path": "src/Onigmo/configure",
    "content": "#! /bin/sh\n# Guess values for system-dependent variables and create Makefiles.\n# Generated by GNU Autoconf 2.65 for onig 5.13.5.\n#\n#\n# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,\n# 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,\n# Inc.\n#\n#\n# This configure script is free software; the Free Software Foundation\n# gives unlimited permission to copy, distribute and modify it.\n## -------------------- ##\n## M4sh Initialization. ##\n## -------------------- ##\n\n# Be more Bourne compatible\nDUALCASE=1; export DUALCASE # for MKS sh\nif test -n \"${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\n  setopt NO_GLOB_SUBST\nelse\n  case `(set -o) 2>/dev/null` in #(\n  *posix*) :\n    set -o posix ;; #(\n  *) :\n     ;;\nesac\nfi\n\n\nas_nl='\n'\nexport as_nl\n# Printing a long string crashes Solaris 7 /usr/bin/printf.\nas_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo\n# Prefer a ksh shell builtin over an external printf program on Solaris,\n# but without wasting forks for bash or zsh.\nif test -z \"$BASH_VERSION$ZSH_VERSION\" \\\n    && (test \"X`print -r -- $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='print -r --'\n  as_echo_n='print -rn --'\nelif (test \"X`printf %s $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='printf %s\\n'\n  as_echo_n='printf %s'\nelse\n  if test \"X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`\" = \"X-n $as_echo\"; then\n    as_echo_body='eval /usr/ucb/echo -n \"$1$as_nl\"'\n    as_echo_n='/usr/ucb/echo -n'\n  else\n    as_echo_body='eval expr \"X$1\" : \"X\\\\(.*\\\\)\"'\n    as_echo_n_body='eval\n      arg=$1;\n      case $arg in #(\n      *\"$as_nl\"*)\n\texpr \"X$arg\" : \"X\\\\(.*\\\\)$as_nl\";\n\targ=`expr \"X$arg\" : \".*$as_nl\\\\(.*\\\\)\"`;;\n      esac;\n      expr \"X$arg\" : \"X\\\\(.*\\\\)\" | tr -d \"$as_nl\"\n    '\n    export as_echo_n_body\n    as_echo_n='sh -c $as_echo_n_body as_echo'\n  fi\n  export as_echo_body\n  as_echo='sh -c $as_echo_body as_echo'\nfi\n\n# The user is always right.\nif test \"${PATH_SEPARATOR+set}\" != set; then\n  PATH_SEPARATOR=:\n  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {\n    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||\n      PATH_SEPARATOR=';'\n  }\nfi\n\n\n# IFS\n# We need space, tab and new line, in precisely that order.  Quoting is\n# there to prevent editors from complaining about space-tab.\n# (If _AS_PATH_WALK were called with IFS unset, it would disable word\n# splitting by setting IFS to empty value.)\nIFS=\" \"\"\t$as_nl\"\n\n# Find who we are.  Look in the path if we contain no directory separator.\ncase $0 in #((\n  *[\\\\/]* ) as_myself=$0 ;;\n  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    test -r \"$as_dir/$0\" && as_myself=$as_dir/$0 && break\n  done\nIFS=$as_save_IFS\n\n     ;;\nesac\n# We did not find ourselves, most probably we were run as `sh COMMAND'\n# in which case we are not to be found in the path.\nif test \"x$as_myself\" = x; then\n  as_myself=$0\nfi\nif test ! -f \"$as_myself\"; then\n  $as_echo \"$as_myself: error: cannot find myself; rerun with an absolute file name\" >&2\n  exit 1\nfi\n\n# Unset variables that we do not need and which cause bugs (e.g. in\n# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the \"|| exit 1\"\n# suppresses any \"Segmentation fault\" message there.  '((' could\n# trigger a bug in pdksh 5.2.14.\nfor as_var in BASH_ENV ENV MAIL MAILPATH\ndo eval test x\\${$as_var+set} = xset \\\n  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :\ndone\nPS1='$ '\nPS2='> '\nPS4='+ '\n\n# NLS nuisances.\nLC_ALL=C\nexport LC_ALL\nLANGUAGE=C\nexport LANGUAGE\n\n# CDPATH.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\nif test \"x$CONFIG_SHELL\" = x; then\n  as_bourne_compatible=\"if test -n \\\"\\${ZSH_VERSION+set}\\\" && (emulate sh) >/dev/null 2>&1; then :\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on \\${1+\\\"\\$@\\\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '\\${1+\\\"\\$@\\\"}'='\\\"\\$@\\\"'\n  setopt NO_GLOB_SUBST\nelse\n  case \\`(set -o) 2>/dev/null\\` in #(\n  *posix*) :\n    set -o posix ;; #(\n  *) :\n     ;;\nesac\nfi\n\"\n  as_required=\"as_fn_return () { (exit \\$1); }\nas_fn_success () { as_fn_return 0; }\nas_fn_failure () { as_fn_return 1; }\nas_fn_ret_success () { return 0; }\nas_fn_ret_failure () { return 1; }\n\nexitcode=0\nas_fn_success || { exitcode=1; echo as_fn_success failed.; }\nas_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }\nas_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }\nas_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }\nif ( set x; as_fn_ret_success y && test x = \\\"\\$1\\\" ); then :\n\nelse\n  exitcode=1; echo positional parameters were not saved.\nfi\ntest x\\$exitcode = x0 || exit 1\"\n  as_suggested=\"  as_lineno_1=\";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested\" as_lineno_1a=\\$LINENO\n  as_lineno_2=\";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested\" as_lineno_2a=\\$LINENO\n  eval 'test \\\"x\\$as_lineno_1'\\$as_run'\\\" != \\\"x\\$as_lineno_2'\\$as_run'\\\" &&\n  test \\\"x\\`expr \\$as_lineno_1'\\$as_run' + 1\\`\\\" = \\\"x\\$as_lineno_2'\\$as_run'\\\"' || exit 1\ntest \\$(( 1 + 1 )) = 2 || exit 1\"\n  if (eval \"$as_required\") 2>/dev/null; then :\n  as_have_required=yes\nelse\n  as_have_required=no\nfi\n  if test x$as_have_required = xyes && (eval \"$as_suggested\") 2>/dev/null; then :\n\nelse\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nas_found=false\nfor as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  as_found=:\n  case $as_dir in #(\n\t /*)\n\t   for as_base in sh bash ksh sh5; do\n\t     # Try only shells that exist, to save several forks.\n\t     as_shell=$as_dir/$as_base\n\t     if { test -f \"$as_shell\" || test -f \"$as_shell.exe\"; } &&\n\t\t    { $as_echo \"$as_bourne_compatible\"\"$as_required\" | as_run=a \"$as_shell\"; } 2>/dev/null; then :\n  CONFIG_SHELL=$as_shell as_have_required=yes\n\t\t   if { $as_echo \"$as_bourne_compatible\"\"$as_suggested\" | as_run=a \"$as_shell\"; } 2>/dev/null; then :\n  break 2\nfi\nfi\n\t   done;;\n       esac\n  as_found=false\ndone\n$as_found || { if { test -f \"$SHELL\" || test -f \"$SHELL.exe\"; } &&\n\t      { $as_echo \"$as_bourne_compatible\"\"$as_required\" | as_run=a \"$SHELL\"; } 2>/dev/null; then :\n  CONFIG_SHELL=$SHELL as_have_required=yes\nfi; }\nIFS=$as_save_IFS\n\n\n      if test \"x$CONFIG_SHELL\" != x; then :\n  # We cannot yet assume a decent shell, so we have to provide a\n\t# neutralization value for shells without unset; and this also\n\t# works around shells that cannot unset nonexistent variables.\n\tBASH_ENV=/dev/null\n\tENV=/dev/null\n\t(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV\n\texport CONFIG_SHELL\n\texec \"$CONFIG_SHELL\" \"$as_myself\" ${1+\"$@\"}\nfi\n\n    if test x$as_have_required = xno; then :\n  $as_echo \"$0: This script requires a shell more modern than all\"\n  $as_echo \"$0: the shells that I found on your system.\"\n  if test x${ZSH_VERSION+set} = xset ; then\n    $as_echo \"$0: In particular, zsh $ZSH_VERSION has bugs and should\"\n    $as_echo \"$0: be upgraded to zsh 4.3.4 or later.\"\n  else\n    $as_echo \"$0: Please tell bug-autoconf@gnu.org about your system,\n$0: including any error possibly output before this\n$0: message. Then install a modern shell, or manually run\n$0: the script under such a shell if you do have one.\"\n  fi\n  exit 1\nfi\nfi\nfi\nSHELL=${CONFIG_SHELL-/bin/sh}\nexport SHELL\n# Unset more variables known to interfere with behavior of common tools.\nCLICOLOR_FORCE= GREP_OPTIONS=\nunset CLICOLOR_FORCE GREP_OPTIONS\n\n## --------------------- ##\n## M4sh Shell Functions. ##\n## --------------------- ##\n# as_fn_unset VAR\n# ---------------\n# Portably unset VAR.\nas_fn_unset ()\n{\n  { eval $1=; unset $1;}\n}\nas_unset=as_fn_unset\n\n# as_fn_set_status STATUS\n# -----------------------\n# Set $? to STATUS, without forking.\nas_fn_set_status ()\n{\n  return $1\n} # as_fn_set_status\n\n# as_fn_exit STATUS\n# -----------------\n# Exit the shell with STATUS, even in a \"trap 0\" or \"set -e\" context.\nas_fn_exit ()\n{\n  set +e\n  as_fn_set_status $1\n  exit $1\n} # as_fn_exit\n\n# as_fn_mkdir_p\n# -------------\n# Create \"$as_dir\" as a directory, including parents if necessary.\nas_fn_mkdir_p ()\n{\n\n  case $as_dir in #(\n  -*) as_dir=./$as_dir;;\n  esac\n  test -d \"$as_dir\" || eval $as_mkdir_p || {\n    as_dirs=\n    while :; do\n      case $as_dir in #(\n      *\\'*) as_qdir=`$as_echo \"$as_dir\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; #'(\n      *) as_qdir=$as_dir;;\n      esac\n      as_dirs=\"'$as_qdir' $as_dirs\"\n      as_dir=`$as_dirname -- \"$as_dir\" ||\n$as_expr X\"$as_dir\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_dir\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$as_dir\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n      test -d \"$as_dir\" && break\n    done\n    test -z \"$as_dirs\" || eval \"mkdir $as_dirs\"\n  } || test -d \"$as_dir\" || as_fn_error \"cannot create directory $as_dir\"\n\n\n} # as_fn_mkdir_p\n# as_fn_append VAR VALUE\n# ----------------------\n# Append the text in VALUE to the end of the definition contained in VAR. Take\n# advantage of any shell optimizations that allow amortized linear growth over\n# repeated appends, instead of the typical quadratic growth present in naive\n# implementations.\nif (eval \"as_var=1; as_var+=2; test x\\$as_var = x12\") 2>/dev/null; then :\n  eval 'as_fn_append ()\n  {\n    eval $1+=\\$2\n  }'\nelse\n  as_fn_append ()\n  {\n    eval $1=\\$$1\\$2\n  }\nfi # as_fn_append\n\n# as_fn_arith ARG...\n# ------------------\n# Perform arithmetic evaluation on the ARGs, and store the result in the\n# global $as_val. Take advantage of shells that can avoid forks. The arguments\n# must be portable across $(()) and expr.\nif (eval \"test \\$(( 1 + 1 )) = 2\") 2>/dev/null; then :\n  eval 'as_fn_arith ()\n  {\n    as_val=$(( $* ))\n  }'\nelse\n  as_fn_arith ()\n  {\n    as_val=`expr \"$@\" || test $? -eq 1`\n  }\nfi # as_fn_arith\n\n\n# as_fn_error ERROR [LINENO LOG_FD]\n# ---------------------------------\n# Output \"`basename $0`: error: ERROR\" to stderr. If LINENO and LOG_FD are\n# provided, also output the error to LOG_FD, referencing LINENO. Then exit the\n# script with status $?, using 1 if that was 0.\nas_fn_error ()\n{\n  as_status=$?; test $as_status -eq 0 && as_status=1\n  if test \"$3\"; then\n    as_lineno=${as_lineno-\"$2\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n    $as_echo \"$as_me:${as_lineno-$LINENO}: error: $1\" >&$3\n  fi\n  $as_echo \"$as_me: error: $1\" >&2\n  as_fn_exit $as_status\n} # as_fn_error\n\nif expr a : '\\(a\\)' >/dev/null 2>&1 &&\n   test \"X`expr 00001 : '.*\\(...\\)'`\" = X001; then\n  as_expr=expr\nelse\n  as_expr=false\nfi\n\nif (basename -- /) >/dev/null 2>&1 && test \"X`basename -- / 2>&1`\" = \"X/\"; then\n  as_basename=basename\nelse\n  as_basename=false\nfi\n\nif (as_dir=`dirname -- /` && test \"X$as_dir\" = X/) >/dev/null 2>&1; then\n  as_dirname=dirname\nelse\n  as_dirname=false\nfi\n\nas_me=`$as_basename -- \"$0\" ||\n$as_expr X/\"$0\" : '.*/\\([^/][^/]*\\)/*$' \\| \\\n\t X\"$0\" : 'X\\(//\\)$' \\| \\\n\t X\"$0\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X/\"$0\" |\n    sed '/^.*\\/\\([^/][^/]*\\)\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n\n# Avoid depending upon Character Ranges.\nas_cr_letters='abcdefghijklmnopqrstuvwxyz'\nas_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'\nas_cr_Letters=$as_cr_letters$as_cr_LETTERS\nas_cr_digits='0123456789'\nas_cr_alnum=$as_cr_Letters$as_cr_digits\n\n\n  as_lineno_1=$LINENO as_lineno_1a=$LINENO\n  as_lineno_2=$LINENO as_lineno_2a=$LINENO\n  eval 'test \"x$as_lineno_1'$as_run'\" != \"x$as_lineno_2'$as_run'\" &&\n  test \"x`expr $as_lineno_1'$as_run' + 1`\" = \"x$as_lineno_2'$as_run'\"' || {\n  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)\n  sed -n '\n    p\n    /[$]LINENO/=\n  ' <$as_myself |\n    sed '\n      s/[$]LINENO.*/&-/\n      t lineno\n      b\n      :lineno\n      N\n      :loop\n      s/[$]LINENO\\([^'$as_cr_alnum'_].*\\n\\)\\(.*\\)/\\2\\1\\2/\n      t loop\n      s/-\\n.*//\n    ' >$as_me.lineno &&\n  chmod +x \"$as_me.lineno\" ||\n    { $as_echo \"$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell\" >&2; as_fn_exit 1; }\n\n  # Don't try to exec as it changes $[0], causing all sort of problems\n  # (the dirname of $[0] is not the place where we might find the\n  # original and so on.  Autoconf is especially sensitive to this).\n  . \"./$as_me.lineno\"\n  # Exit status is that of the last command.\n  exit\n}\n\nECHO_C= ECHO_N= ECHO_T=\ncase `echo -n x` in #(((((\n-n*)\n  case `echo 'xy\\c'` in\n  *c*) ECHO_T='\t';;\t# ECHO_T is single tab character.\n  xy)  ECHO_C='\\c';;\n  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null\n       ECHO_T='\t';;\n  esac;;\n*)\n  ECHO_N='-n';;\nesac\n\nrm -f conf$$ conf$$.exe conf$$.file\nif test -d conf$$.dir; then\n  rm -f conf$$.dir/conf$$.file\nelse\n  rm -f conf$$.dir\n  mkdir conf$$.dir 2>/dev/null\nfi\nif (echo >conf$$.file) 2>/dev/null; then\n  if ln -s conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s='ln -s'\n    # ... but there are two gotchas:\n    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.\n    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.\n    # In both cases, we have to default to `cp -p'.\n    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||\n      as_ln_s='cp -p'\n  elif ln conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s=ln\n  else\n    as_ln_s='cp -p'\n  fi\nelse\n  as_ln_s='cp -p'\nfi\nrm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file\nrmdir conf$$.dir 2>/dev/null\n\nif mkdir -p . 2>/dev/null; then\n  as_mkdir_p='mkdir -p \"$as_dir\"'\nelse\n  test -d ./-p && rmdir ./-p\n  as_mkdir_p=false\nfi\n\nif test -x / >/dev/null 2>&1; then\n  as_test_x='test -x'\nelse\n  if ls -dL / >/dev/null 2>&1; then\n    as_ls_L_option=L\n  else\n    as_ls_L_option=\n  fi\n  as_test_x='\n    eval sh -c '\\''\n      if test -d \"$1\"; then\n\ttest -d \"$1/.\";\n      else\n\tcase $1 in #(\n\t-*)set \"./$1\";;\n\tesac;\n\tcase `ls -ld'$as_ls_L_option' \"$1\" 2>/dev/null` in #((\n\t???[sx]*):;;*)false;;esac;fi\n    '\\'' sh\n  '\nfi\nas_executable_p=$as_test_x\n\n# Sed expression to map a string onto a valid CPP name.\nas_tr_cpp=\"eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'\"\n\n# Sed expression to map a string onto a valid variable name.\nas_tr_sh=\"eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'\"\n\n\n\n# Check that we are running under the correct shell.\nSHELL=${CONFIG_SHELL-/bin/sh}\n\ncase X$lt_ECHO in\nX*--fallback-echo)\n  # Remove one level of quotation (which was required for Make).\n  ECHO=`echo \"$lt_ECHO\" | sed 's,\\\\\\\\\\$\\\\$0,'$0','`\n  ;;\nesac\n\nECHO=${lt_ECHO-echo}\nif test \"X$1\" = X--no-reexec; then\n  # Discard the --no-reexec flag, and continue.\n  shift\nelif test \"X$1\" = X--fallback-echo; then\n  # Avoid inline document here, it may be left over\n  :\nelif test \"X`{ $ECHO '\\t'; } 2>/dev/null`\" = 'X\\t' ; then\n  # Yippee, $ECHO works!\n  :\nelse\n  # Restart under the correct shell.\n  exec $SHELL \"$0\" --no-reexec ${1+\"$@\"}\nfi\n\nif test \"X$1\" = X--fallback-echo; then\n  # used as fallback echo\n  shift\n  cat <<_LT_EOF\n$*\n_LT_EOF\n  exit 0\nfi\n\n# The HP-UX ksh and POSIX shell print the target directory to stdout\n# if CDPATH is set.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\nif test -z \"$lt_ECHO\"; then\n  if test \"X${echo_test_string+set}\" != Xset; then\n    # find a string as large as possible, as long as the shell can cope with it\n    for cmd in 'sed 50q \"$0\"' 'sed 20q \"$0\"' 'sed 10q \"$0\"' 'sed 2q \"$0\"' 'echo test'; do\n      # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...\n      if { echo_test_string=`eval $cmd`; } 2>/dev/null &&\n\t { test \"X$echo_test_string\" = \"X$echo_test_string\"; } 2>/dev/null\n      then\n        break\n      fi\n    done\n  fi\n\n  if test \"X`{ $ECHO '\\t'; } 2>/dev/null`\" = 'X\\t' &&\n     echo_testing_string=`{ $ECHO \"$echo_test_string\"; } 2>/dev/null` &&\n     test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n    :\n  else\n    # The Solaris, AIX, and Digital Unix default echo programs unquote\n    # backslashes.  This makes it impossible to quote backslashes using\n    #   echo \"$something\" | sed 's/\\\\/\\\\\\\\/g'\n    #\n    # So, first we look for a working echo in the user's PATH.\n\n    lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n    for dir in $PATH /usr/ucb; do\n      IFS=\"$lt_save_ifs\"\n      if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&\n         test \"X`($dir/echo '\\t') 2>/dev/null`\" = 'X\\t' &&\n         echo_testing_string=`($dir/echo \"$echo_test_string\") 2>/dev/null` &&\n         test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n        ECHO=\"$dir/echo\"\n        break\n      fi\n    done\n    IFS=\"$lt_save_ifs\"\n\n    if test \"X$ECHO\" = Xecho; then\n      # We didn't find a better echo, so look for alternatives.\n      if test \"X`{ print -r '\\t'; } 2>/dev/null`\" = 'X\\t' &&\n         echo_testing_string=`{ print -r \"$echo_test_string\"; } 2>/dev/null` &&\n         test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n        # This shell has a builtin print -r that does the trick.\n        ECHO='print -r'\n      elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } &&\n\t   test \"X$CONFIG_SHELL\" != X/bin/ksh; then\n        # If we have ksh, try running configure again with it.\n        ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}\n        export ORIGINAL_CONFIG_SHELL\n        CONFIG_SHELL=/bin/ksh\n        export CONFIG_SHELL\n        exec $CONFIG_SHELL \"$0\" --no-reexec ${1+\"$@\"}\n      else\n        # Try using printf.\n        ECHO='printf %s\\n'\n        if test \"X`{ $ECHO '\\t'; } 2>/dev/null`\" = 'X\\t' &&\n\t   echo_testing_string=`{ $ECHO \"$echo_test_string\"; } 2>/dev/null` &&\n\t   test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n\t  # Cool, printf works\n\t  :\n        elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL \"$0\" --fallback-echo '\\t') 2>/dev/null` &&\n\t     test \"X$echo_testing_string\" = 'X\\t' &&\n\t     echo_testing_string=`($ORIGINAL_CONFIG_SHELL \"$0\" --fallback-echo \"$echo_test_string\") 2>/dev/null` &&\n\t     test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n\t  CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL\n\t  export CONFIG_SHELL\n\t  SHELL=\"$CONFIG_SHELL\"\n\t  export SHELL\n\t  ECHO=\"$CONFIG_SHELL $0 --fallback-echo\"\n        elif echo_testing_string=`($CONFIG_SHELL \"$0\" --fallback-echo '\\t') 2>/dev/null` &&\n\t     test \"X$echo_testing_string\" = 'X\\t' &&\n\t     echo_testing_string=`($CONFIG_SHELL \"$0\" --fallback-echo \"$echo_test_string\") 2>/dev/null` &&\n\t     test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n\t  ECHO=\"$CONFIG_SHELL $0 --fallback-echo\"\n        else\n\t  # maybe with a smaller string...\n\t  prev=:\n\n\t  for cmd in 'echo test' 'sed 2q \"$0\"' 'sed 10q \"$0\"' 'sed 20q \"$0\"' 'sed 50q \"$0\"'; do\n\t    if { test \"X$echo_test_string\" = \"X`eval $cmd`\"; } 2>/dev/null\n\t    then\n\t      break\n\t    fi\n\t    prev=\"$cmd\"\n\t  done\n\n\t  if test \"$prev\" != 'sed 50q \"$0\"'; then\n\t    echo_test_string=`eval $prev`\n\t    export echo_test_string\n\t    exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} \"$0\" ${1+\"$@\"}\n\t  else\n\t    # Oops.  We lost completely, so just stick with echo.\n\t    ECHO=echo\n\t  fi\n        fi\n      fi\n    fi\n  fi\nfi\n\n# Copy echo and quote the copy suitably for passing to libtool from\n# the Makefile, instead of quoting the original, which is used later.\nlt_ECHO=$ECHO\nif test \"X$lt_ECHO\" = \"X$CONFIG_SHELL $0 --fallback-echo\"; then\n   lt_ECHO=\"$CONFIG_SHELL \\\\\\$\\$0 --fallback-echo\"\nfi\n\n\n\n\ntest -n \"$DJDIR\" || exec 7<&0 </dev/null\nexec 6>&1\n\n# Name of the host.\n# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,\n# so uname gets run too.\nac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`\n\n#\n# Initializations.\n#\nac_default_prefix=/usr/local\nac_clean_files=\nac_config_libobj_dir=.\nLIBOBJS=\ncross_compiling=no\nsubdirs=\nMFLAGS=\nMAKEFLAGS=\n\n# Identity of this package.\nPACKAGE_NAME='onig'\nPACKAGE_TARNAME='onig'\nPACKAGE_VERSION='5.13.5'\nPACKAGE_STRING='onig 5.13.5'\nPACKAGE_BUGREPORT=''\nPACKAGE_URL=''\n\n# Factoring default headers for most tests.\nac_includes_default=\"\\\n#include <stdio.h>\n#ifdef HAVE_SYS_TYPES_H\n# include <sys/types.h>\n#endif\n#ifdef HAVE_SYS_STAT_H\n# include <sys/stat.h>\n#endif\n#ifdef STDC_HEADERS\n# include <stdlib.h>\n# include <stddef.h>\n#else\n# ifdef HAVE_STDLIB_H\n#  include <stdlib.h>\n# endif\n#endif\n#ifdef HAVE_STRING_H\n# if !defined STDC_HEADERS && defined HAVE_MEMORY_H\n#  include <memory.h>\n# endif\n# include <string.h>\n#endif\n#ifdef HAVE_STRINGS_H\n# include <strings.h>\n#endif\n#ifdef HAVE_INTTYPES_H\n# include <inttypes.h>\n#endif\n#ifdef HAVE_STDINT_H\n# include <stdint.h>\n#endif\n#ifdef HAVE_UNISTD_H\n# include <unistd.h>\n#endif\"\n\nac_subst_vars='am__EXEEXT_FALSE\nam__EXEEXT_TRUE\nLTLIBOBJS\nLIBOBJS\nALLOCA\nLTVERSION\nCPP\nOTOOL64\nOTOOL\nLIPO\nNMEDIT\nDSYMUTIL\nlt_ECHO\nRANLIB\nAR\nOBJDUMP\nLN_S\nNM\nac_ct_DUMPBIN\nDUMPBIN\nLD\nFGREP\nEGREP\nGREP\nSED\nhost_os\nhost_vendor\nhost_cpu\nhost\nbuild_os\nbuild_vendor\nbuild_cpu\nbuild\nLIBTOOL\nam__fastdepCC_FALSE\nam__fastdepCC_TRUE\nCCDEPMODE\nAMDEPBACKSLASH\nAMDEP_FALSE\nAMDEP_TRUE\nam__quote\nam__include\nDEPDIR\nOBJEXT\nEXEEXT\nac_ct_CC\nCPPFLAGS\nLDFLAGS\nCFLAGS\nCC\nSTATISTICS\nRUBYDIR\nam__untar\nam__tar\nAMTAR\nam__leading_dot\nSET_MAKE\nAWK\nmkdir_p\nMKDIR_P\nINSTALL_STRIP_PROGRAM\nSTRIP\ninstall_sh\nMAKEINFO\nAUTOHEADER\nAUTOMAKE\nAUTOCONF\nACLOCAL\nVERSION\nPACKAGE\nCYGPATH_W\nam__isrc\nINSTALL_DATA\nINSTALL_SCRIPT\nINSTALL_PROGRAM\ntarget_alias\nhost_alias\nbuild_alias\nLIBS\nECHO_T\nECHO_N\nECHO_C\nDEFS\nmandir\nlocaledir\nlibdir\npsdir\npdfdir\ndvidir\nhtmldir\ninfodir\ndocdir\noldincludedir\nincludedir\nlocalstatedir\nsharedstatedir\nsysconfdir\ndatadir\ndatarootdir\nlibexecdir\nsbindir\nbindir\nprogram_transform_name\nprefix\nexec_prefix\nPACKAGE_URL\nPACKAGE_BUGREPORT\nPACKAGE_STRING\nPACKAGE_VERSION\nPACKAGE_TARNAME\nPACKAGE_NAME\nPATH_SEPARATOR\nSHELL'\nac_subst_files=''\nac_user_opts='\nenable_option_checking\nwith_rubydir\nwith_statistics\nenable_combination_explosion_check\nenable_crnl_as_line_terminator\nenable_dependency_tracking\nenable_shared\nenable_static\nwith_pic\nenable_fast_install\nwith_gnu_ld\nenable_libtool_lock\n'\n      ac_precious_vars='build_alias\nhost_alias\ntarget_alias\nCC\nCFLAGS\nLDFLAGS\nLIBS\nCPPFLAGS\nCPP'\n\n\n# Initialize some variables set by options.\nac_init_help=\nac_init_version=false\nac_unrecognized_opts=\nac_unrecognized_sep=\n# The variables have the same names as the options, with\n# dashes changed to underlines.\ncache_file=/dev/null\nexec_prefix=NONE\nno_create=\nno_recursion=\nprefix=NONE\nprogram_prefix=NONE\nprogram_suffix=NONE\nprogram_transform_name=s,x,x,\nsilent=\nsite=\nsrcdir=\nverbose=\nx_includes=NONE\nx_libraries=NONE\n\n# Installation directory options.\n# These are left unexpanded so users can \"make install exec_prefix=/foo\"\n# and all the variables that are supposed to be based on exec_prefix\n# by default will actually change.\n# Use braces instead of parens because sh, perl, etc. also accept them.\n# (The list follows the same order as the GNU Coding Standards.)\nbindir='${exec_prefix}/bin'\nsbindir='${exec_prefix}/sbin'\nlibexecdir='${exec_prefix}/libexec'\ndatarootdir='${prefix}/share'\ndatadir='${datarootdir}'\nsysconfdir='${prefix}/etc'\nsharedstatedir='${prefix}/com'\nlocalstatedir='${prefix}/var'\nincludedir='${prefix}/include'\noldincludedir='/usr/include'\ndocdir='${datarootdir}/doc/${PACKAGE_TARNAME}'\ninfodir='${datarootdir}/info'\nhtmldir='${docdir}'\ndvidir='${docdir}'\npdfdir='${docdir}'\npsdir='${docdir}'\nlibdir='${exec_prefix}/lib'\nlocaledir='${datarootdir}/locale'\nmandir='${datarootdir}/man'\n\nac_prev=\nac_dashdash=\nfor ac_option\ndo\n  # If the previous option needs an argument, assign it.\n  if test -n \"$ac_prev\"; then\n    eval $ac_prev=\\$ac_option\n    ac_prev=\n    continue\n  fi\n\n  case $ac_option in\n  *=*)\tac_optarg=`expr \"X$ac_option\" : '[^=]*=\\(.*\\)'` ;;\n  *)\tac_optarg=yes ;;\n  esac\n\n  # Accept the important Cygnus configure options, so we can diagnose typos.\n\n  case $ac_dashdash$ac_option in\n  --)\n    ac_dashdash=yes ;;\n\n  -bindir | --bindir | --bindi | --bind | --bin | --bi)\n    ac_prev=bindir ;;\n  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)\n    bindir=$ac_optarg ;;\n\n  -build | --build | --buil | --bui | --bu)\n    ac_prev=build_alias ;;\n  -build=* | --build=* | --buil=* | --bui=* | --bu=*)\n    build_alias=$ac_optarg ;;\n\n  -cache-file | --cache-file | --cache-fil | --cache-fi \\\n  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)\n    ac_prev=cache_file ;;\n  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \\\n  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)\n    cache_file=$ac_optarg ;;\n\n  --config-cache | -C)\n    cache_file=config.cache ;;\n\n  -datadir | --datadir | --datadi | --datad)\n    ac_prev=datadir ;;\n  -datadir=* | --datadir=* | --datadi=* | --datad=*)\n    datadir=$ac_optarg ;;\n\n  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \\\n  | --dataroo | --dataro | --datar)\n    ac_prev=datarootdir ;;\n  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \\\n  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)\n    datarootdir=$ac_optarg ;;\n\n  -disable-* | --disable-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*disable-\\(.*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error \"invalid feature name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"enable_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval enable_$ac_useropt=no ;;\n\n  -docdir | --docdir | --docdi | --doc | --do)\n    ac_prev=docdir ;;\n  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)\n    docdir=$ac_optarg ;;\n\n  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)\n    ac_prev=dvidir ;;\n  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)\n    dvidir=$ac_optarg ;;\n\n  -enable-* | --enable-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*enable-\\([^=]*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error \"invalid feature name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"enable_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval enable_$ac_useropt=\\$ac_optarg ;;\n\n  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \\\n  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \\\n  | --exec | --exe | --ex)\n    ac_prev=exec_prefix ;;\n  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \\\n  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \\\n  | --exec=* | --exe=* | --ex=*)\n    exec_prefix=$ac_optarg ;;\n\n  -gas | --gas | --ga | --g)\n    # Obsolete; use --with-gas.\n    with_gas=yes ;;\n\n  -help | --help | --hel | --he | -h)\n    ac_init_help=long ;;\n  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)\n    ac_init_help=recursive ;;\n  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)\n    ac_init_help=short ;;\n\n  -host | --host | --hos | --ho)\n    ac_prev=host_alias ;;\n  -host=* | --host=* | --hos=* | --ho=*)\n    host_alias=$ac_optarg ;;\n\n  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)\n    ac_prev=htmldir ;;\n  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \\\n  | --ht=*)\n    htmldir=$ac_optarg ;;\n\n  -includedir | --includedir | --includedi | --included | --include \\\n  | --includ | --inclu | --incl | --inc)\n    ac_prev=includedir ;;\n  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \\\n  | --includ=* | --inclu=* | --incl=* | --inc=*)\n    includedir=$ac_optarg ;;\n\n  -infodir | --infodir | --infodi | --infod | --info | --inf)\n    ac_prev=infodir ;;\n  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)\n    infodir=$ac_optarg ;;\n\n  -libdir | --libdir | --libdi | --libd)\n    ac_prev=libdir ;;\n  -libdir=* | --libdir=* | --libdi=* | --libd=*)\n    libdir=$ac_optarg ;;\n\n  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \\\n  | --libexe | --libex | --libe)\n    ac_prev=libexecdir ;;\n  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \\\n  | --libexe=* | --libex=* | --libe=*)\n    libexecdir=$ac_optarg ;;\n\n  -localedir | --localedir | --localedi | --localed | --locale)\n    ac_prev=localedir ;;\n  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)\n    localedir=$ac_optarg ;;\n\n  -localstatedir | --localstatedir | --localstatedi | --localstated \\\n  | --localstate | --localstat | --localsta | --localst | --locals)\n    ac_prev=localstatedir ;;\n  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \\\n  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)\n    localstatedir=$ac_optarg ;;\n\n  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)\n    ac_prev=mandir ;;\n  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)\n    mandir=$ac_optarg ;;\n\n  -nfp | --nfp | --nf)\n    # Obsolete; use --without-fp.\n    with_fp=no ;;\n\n  -no-create | --no-create | --no-creat | --no-crea | --no-cre \\\n  | --no-cr | --no-c | -n)\n    no_create=yes ;;\n\n  -no-recursion | --no-recursion | --no-recursio | --no-recursi \\\n  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)\n    no_recursion=yes ;;\n\n  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \\\n  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \\\n  | --oldin | --oldi | --old | --ol | --o)\n    ac_prev=oldincludedir ;;\n  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \\\n  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \\\n  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)\n    oldincludedir=$ac_optarg ;;\n\n  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)\n    ac_prev=prefix ;;\n  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)\n    prefix=$ac_optarg ;;\n\n  -program-prefix | --program-prefix | --program-prefi | --program-pref \\\n  | --program-pre | --program-pr | --program-p)\n    ac_prev=program_prefix ;;\n  -program-prefix=* | --program-prefix=* | --program-prefi=* \\\n  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)\n    program_prefix=$ac_optarg ;;\n\n  -program-suffix | --program-suffix | --program-suffi | --program-suff \\\n  | --program-suf | --program-su | --program-s)\n    ac_prev=program_suffix ;;\n  -program-suffix=* | --program-suffix=* | --program-suffi=* \\\n  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)\n    program_suffix=$ac_optarg ;;\n\n  -program-transform-name | --program-transform-name \\\n  | --program-transform-nam | --program-transform-na \\\n  | --program-transform-n | --program-transform- \\\n  | --program-transform | --program-transfor \\\n  | --program-transfo | --program-transf \\\n  | --program-trans | --program-tran \\\n  | --progr-tra | --program-tr | --program-t)\n    ac_prev=program_transform_name ;;\n  -program-transform-name=* | --program-transform-name=* \\\n  | --program-transform-nam=* | --program-transform-na=* \\\n  | --program-transform-n=* | --program-transform-=* \\\n  | --program-transform=* | --program-transfor=* \\\n  | --program-transfo=* | --program-transf=* \\\n  | --program-trans=* | --program-tran=* \\\n  | --progr-tra=* | --program-tr=* | --program-t=*)\n    program_transform_name=$ac_optarg ;;\n\n  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)\n    ac_prev=pdfdir ;;\n  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)\n    pdfdir=$ac_optarg ;;\n\n  -psdir | --psdir | --psdi | --psd | --ps)\n    ac_prev=psdir ;;\n  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)\n    psdir=$ac_optarg ;;\n\n  -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n  | -silent | --silent | --silen | --sile | --sil)\n    silent=yes ;;\n\n  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)\n    ac_prev=sbindir ;;\n  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \\\n  | --sbi=* | --sb=*)\n    sbindir=$ac_optarg ;;\n\n  -sharedstatedir | --sharedstatedir | --sharedstatedi \\\n  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \\\n  | --sharedst | --shareds | --shared | --share | --shar \\\n  | --sha | --sh)\n    ac_prev=sharedstatedir ;;\n  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \\\n  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \\\n  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \\\n  | --sha=* | --sh=*)\n    sharedstatedir=$ac_optarg ;;\n\n  -site | --site | --sit)\n    ac_prev=site ;;\n  -site=* | --site=* | --sit=*)\n    site=$ac_optarg ;;\n\n  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)\n    ac_prev=srcdir ;;\n  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)\n    srcdir=$ac_optarg ;;\n\n  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \\\n  | --syscon | --sysco | --sysc | --sys | --sy)\n    ac_prev=sysconfdir ;;\n  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \\\n  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)\n    sysconfdir=$ac_optarg ;;\n\n  -target | --target | --targe | --targ | --tar | --ta | --t)\n    ac_prev=target_alias ;;\n  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)\n    target_alias=$ac_optarg ;;\n\n  -v | -verbose | --verbose | --verbos | --verbo | --verb)\n    verbose=yes ;;\n\n  -version | --version | --versio | --versi | --vers | -V)\n    ac_init_version=: ;;\n\n  -with-* | --with-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*with-\\([^=]*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error \"invalid package name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"with_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval with_$ac_useropt=\\$ac_optarg ;;\n\n  -without-* | --without-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*without-\\(.*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error \"invalid package name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"with_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval with_$ac_useropt=no ;;\n\n  --x)\n    # Obsolete; use --with-x.\n    with_x=yes ;;\n\n  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \\\n  | --x-incl | --x-inc | --x-in | --x-i)\n    ac_prev=x_includes ;;\n  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \\\n  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)\n    x_includes=$ac_optarg ;;\n\n  -x-libraries | --x-libraries | --x-librarie | --x-librari \\\n  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)\n    ac_prev=x_libraries ;;\n  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \\\n  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)\n    x_libraries=$ac_optarg ;;\n\n  -*) as_fn_error \"unrecognized option: \\`$ac_option'\nTry \\`$0 --help' for more information.\"\n    ;;\n\n  *=*)\n    ac_envvar=`expr \"x$ac_option\" : 'x\\([^=]*\\)='`\n    # Reject names that are not valid shell variable names.\n    case $ac_envvar in #(\n      '' | [0-9]* | *[!_$as_cr_alnum]* )\n      as_fn_error \"invalid variable name: \\`$ac_envvar'\" ;;\n    esac\n    eval $ac_envvar=\\$ac_optarg\n    export $ac_envvar ;;\n\n  *)\n    # FIXME: should be removed in autoconf 3.0.\n    $as_echo \"$as_me: WARNING: you should use --build, --host, --target\" >&2\n    expr \"x$ac_option\" : \".*[^-._$as_cr_alnum]\" >/dev/null &&\n      $as_echo \"$as_me: WARNING: invalid host type: $ac_option\" >&2\n    : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}\n    ;;\n\n  esac\ndone\n\nif test -n \"$ac_prev\"; then\n  ac_option=--`echo $ac_prev | sed 's/_/-/g'`\n  as_fn_error \"missing argument to $ac_option\"\nfi\n\nif test -n \"$ac_unrecognized_opts\"; then\n  case $enable_option_checking in\n    no) ;;\n    fatal) as_fn_error \"unrecognized options: $ac_unrecognized_opts\" ;;\n    *)     $as_echo \"$as_me: WARNING: unrecognized options: $ac_unrecognized_opts\" >&2 ;;\n  esac\nfi\n\n# Check all directory arguments for consistency.\nfor ac_var in\texec_prefix prefix bindir sbindir libexecdir datarootdir \\\n\t\tdatadir sysconfdir sharedstatedir localstatedir includedir \\\n\t\toldincludedir docdir infodir htmldir dvidir pdfdir psdir \\\n\t\tlibdir localedir mandir\ndo\n  eval ac_val=\\$$ac_var\n  # Remove trailing slashes.\n  case $ac_val in\n    */ )\n      ac_val=`expr \"X$ac_val\" : 'X\\(.*[^/]\\)' \\| \"X$ac_val\" : 'X\\(.*\\)'`\n      eval $ac_var=\\$ac_val;;\n  esac\n  # Be sure to have absolute directory names.\n  case $ac_val in\n    [\\\\/$]* | ?:[\\\\/]* )  continue;;\n    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;\n  esac\n  as_fn_error \"expected an absolute directory name for --$ac_var: $ac_val\"\ndone\n\n# There might be people who depend on the old broken behavior: `$host'\n# used to hold the argument of --host etc.\n# FIXME: To remove some day.\nbuild=$build_alias\nhost=$host_alias\ntarget=$target_alias\n\n# FIXME: To remove some day.\nif test \"x$host_alias\" != x; then\n  if test \"x$build_alias\" = x; then\n    cross_compiling=maybe\n    $as_echo \"$as_me: WARNING: If you wanted to set the --build type, don't use --host.\n    If a cross compiler is detected then cross compile mode will be used.\" >&2\n  elif test \"x$build_alias\" != \"x$host_alias\"; then\n    cross_compiling=yes\n  fi\nfi\n\nac_tool_prefix=\ntest -n \"$host_alias\" && ac_tool_prefix=$host_alias-\n\ntest \"$silent\" = yes && exec 6>/dev/null\n\n\nac_pwd=`pwd` && test -n \"$ac_pwd\" &&\nac_ls_di=`ls -di .` &&\nac_pwd_ls_di=`cd \"$ac_pwd\" && ls -di .` ||\n  as_fn_error \"working directory cannot be determined\"\ntest \"X$ac_ls_di\" = \"X$ac_pwd_ls_di\" ||\n  as_fn_error \"pwd does not report name of working directory\"\n\n\n# Find the source files, if location was not specified.\nif test -z \"$srcdir\"; then\n  ac_srcdir_defaulted=yes\n  # Try the directory containing this script, then the parent directory.\n  ac_confdir=`$as_dirname -- \"$as_myself\" ||\n$as_expr X\"$as_myself\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_myself\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_myself\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_myself\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$as_myself\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n  srcdir=$ac_confdir\n  if test ! -r \"$srcdir/$ac_unique_file\"; then\n    srcdir=..\n  fi\nelse\n  ac_srcdir_defaulted=no\nfi\nif test ! -r \"$srcdir/$ac_unique_file\"; then\n  test \"$ac_srcdir_defaulted\" = yes && srcdir=\"$ac_confdir or ..\"\n  as_fn_error \"cannot find sources ($ac_unique_file) in $srcdir\"\nfi\nac_msg=\"sources are in $srcdir, but \\`cd $srcdir' does not work\"\nac_abs_confdir=`(\n\tcd \"$srcdir\" && test -r \"./$ac_unique_file\" || as_fn_error \"$ac_msg\"\n\tpwd)`\n# When building in place, set srcdir=.\nif test \"$ac_abs_confdir\" = \"$ac_pwd\"; then\n  srcdir=.\nfi\n# Remove unnecessary trailing slashes from srcdir.\n# Double slashes in file names in object file debugging info\n# mess up M-x gdb in Emacs.\ncase $srcdir in\n*/) srcdir=`expr \"X$srcdir\" : 'X\\(.*[^/]\\)' \\| \"X$srcdir\" : 'X\\(.*\\)'`;;\nesac\nfor ac_var in $ac_precious_vars; do\n  eval ac_env_${ac_var}_set=\\${${ac_var}+set}\n  eval ac_env_${ac_var}_value=\\$${ac_var}\n  eval ac_cv_env_${ac_var}_set=\\${${ac_var}+set}\n  eval ac_cv_env_${ac_var}_value=\\$${ac_var}\ndone\n\n#\n# Report the --help message.\n#\nif test \"$ac_init_help\" = \"long\"; then\n  # Omit some internal or obsolete options to make the list less imposing.\n  # This message is too long to be a string in the A/UX 3.1 sh.\n  cat <<_ACEOF\n\\`configure' configures onig 5.13.5 to adapt to many kinds of systems.\n\nUsage: $0 [OPTION]... [VAR=VALUE]...\n\nTo assign environment variables (e.g., CC, CFLAGS...), specify them as\nVAR=VALUE.  See below for descriptions of some of the useful variables.\n\nDefaults for the options are specified in brackets.\n\nConfiguration:\n  -h, --help              display this help and exit\n      --help=short        display options specific to this package\n      --help=recursive    display the short help of all the included packages\n  -V, --version           display version information and exit\n  -q, --quiet, --silent   do not print \\`checking...' messages\n      --cache-file=FILE   cache test results in FILE [disabled]\n  -C, --config-cache      alias for \\`--cache-file=config.cache'\n  -n, --no-create         do not create output files\n      --srcdir=DIR        find the sources in DIR [configure dir or \\`..']\n\nInstallation directories:\n  --prefix=PREFIX         install architecture-independent files in PREFIX\n                          [$ac_default_prefix]\n  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX\n                          [PREFIX]\n\nBy default, \\`make install' will install all the files in\n\\`$ac_default_prefix/bin', \\`$ac_default_prefix/lib' etc.  You can specify\nan installation prefix other than \\`$ac_default_prefix' using \\`--prefix',\nfor instance \\`--prefix=\\$HOME'.\n\nFor better control, use the options below.\n\nFine tuning of the installation directories:\n  --bindir=DIR            user executables [EPREFIX/bin]\n  --sbindir=DIR           system admin executables [EPREFIX/sbin]\n  --libexecdir=DIR        program executables [EPREFIX/libexec]\n  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]\n  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]\n  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]\n  --libdir=DIR            object code libraries [EPREFIX/lib]\n  --includedir=DIR        C header files [PREFIX/include]\n  --oldincludedir=DIR     C header files for non-gcc [/usr/include]\n  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]\n  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]\n  --infodir=DIR           info documentation [DATAROOTDIR/info]\n  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]\n  --mandir=DIR            man documentation [DATAROOTDIR/man]\n  --docdir=DIR            documentation root [DATAROOTDIR/doc/onig]\n  --htmldir=DIR           html documentation [DOCDIR]\n  --dvidir=DIR            dvi documentation [DOCDIR]\n  --pdfdir=DIR            pdf documentation [DOCDIR]\n  --psdir=DIR             ps documentation [DOCDIR]\n_ACEOF\n\n  cat <<\\_ACEOF\n\nProgram names:\n  --program-prefix=PREFIX            prepend PREFIX to installed program names\n  --program-suffix=SUFFIX            append SUFFIX to installed program names\n  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names\n\nSystem types:\n  --build=BUILD     configure for building on BUILD [guessed]\n  --host=HOST       cross-compile to build programs to run on HOST [BUILD]\n_ACEOF\nfi\n\nif test -n \"$ac_init_help\"; then\n  case $ac_init_help in\n     short | recursive ) echo \"Configuration of onig 5.13.5:\";;\n   esac\n  cat <<\\_ACEOF\n\nOptional Features:\n  --disable-option-checking  ignore unrecognized --enable/--with options\n  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)\n  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]\n  --enable-combination-explosion-check   enable combination explosion check\n  --enable-crnl-as-line-terminator   enable CR+NL as line terminator\n  --disable-dependency-tracking  speeds up one-time build\n  --enable-dependency-tracking   do not reject slow dependency extractors\n  --enable-shared[=PKGS]  build shared libraries [default=yes]\n  --enable-static[=PKGS]  build static libraries [default=yes]\n  --enable-fast-install[=PKGS]\n                          optimize for fast installation [default=yes]\n  --disable-libtool-lock  avoid locking (might break parallel builds)\n\nOptional Packages:\n  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]\n  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)\n  --with-rubydir=RUBYDIR  specify value for RUBYDIR (default ..)\n  --with-statistics       take matching time statistical data\n  --with-pic              try to use only PIC/non-PIC objects [default=use\n                          both]\n  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]\n\nSome influential environment variables:\n  CC          C compiler command\n  CFLAGS      C compiler flags\n  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a\n              nonstandard directory <lib dir>\n  LIBS        libraries to pass to the linker, e.g. -l<library>\n  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if\n              you have headers in a nonstandard directory <include dir>\n  CPP         C preprocessor\n\nUse these variables to override the choices made by `configure' or to help\nit to find libraries and programs with nonstandard names/locations.\n\nReport bugs to the package provider.\n_ACEOF\nac_status=$?\nfi\n\nif test \"$ac_init_help\" = \"recursive\"; then\n  # If there are subdirs, report their specific --help.\n  for ac_dir in : $ac_subdirs_all; do test \"x$ac_dir\" = x: && continue\n    test -d \"$ac_dir\" ||\n      { cd \"$srcdir\" && ac_pwd=`pwd` && srcdir=. && test -d \"$ac_dir\"; } ||\n      continue\n    ac_builddir=.\n\ncase \"$ac_dir\" in\n.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;\n*)\n  ac_dir_suffix=/`$as_echo \"$ac_dir\" | sed 's|^\\.[\\\\/]||'`\n  # A \"..\" for each directory in $ac_dir_suffix.\n  ac_top_builddir_sub=`$as_echo \"$ac_dir_suffix\" | sed 's|/[^\\\\/]*|/..|g;s|/||'`\n  case $ac_top_builddir_sub in\n  \"\") ac_top_builddir_sub=. ac_top_build_prefix= ;;\n  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;\n  esac ;;\nesac\nac_abs_top_builddir=$ac_pwd\nac_abs_builddir=$ac_pwd$ac_dir_suffix\n# for backward compatibility:\nac_top_builddir=$ac_top_build_prefix\n\ncase $srcdir in\n  .)  # We are building in place.\n    ac_srcdir=.\n    ac_top_srcdir=$ac_top_builddir_sub\n    ac_abs_top_srcdir=$ac_pwd ;;\n  [\\\\/]* | ?:[\\\\/]* )  # Absolute name.\n    ac_srcdir=$srcdir$ac_dir_suffix;\n    ac_top_srcdir=$srcdir\n    ac_abs_top_srcdir=$srcdir ;;\n  *) # Relative name.\n    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix\n    ac_top_srcdir=$ac_top_build_prefix$srcdir\n    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;\nesac\nac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix\n\n    cd \"$ac_dir\" || { ac_status=$?; continue; }\n    # Check for guested configure.\n    if test -f \"$ac_srcdir/configure.gnu\"; then\n      echo &&\n      $SHELL \"$ac_srcdir/configure.gnu\" --help=recursive\n    elif test -f \"$ac_srcdir/configure\"; then\n      echo &&\n      $SHELL \"$ac_srcdir/configure\" --help=recursive\n    else\n      $as_echo \"$as_me: WARNING: no configuration information is in $ac_dir\" >&2\n    fi || ac_status=$?\n    cd \"$ac_pwd\" || { ac_status=$?; break; }\n  done\nfi\n\ntest -n \"$ac_init_help\" && exit $ac_status\nif $ac_init_version; then\n  cat <<\\_ACEOF\nonig configure 5.13.5\ngenerated by GNU Autoconf 2.65\n\nCopyright (C) 2009 Free Software Foundation, Inc.\nThis configure script is free software; the Free Software Foundation\ngives unlimited permission to copy, distribute and modify it.\n_ACEOF\n  exit\nfi\n\n## ------------------------ ##\n## Autoconf initialization. ##\n## ------------------------ ##\n\n# ac_fn_c_try_compile LINENO\n# --------------------------\n# Try to compile conftest.$ac_ext, and return whether this succeeded.\nac_fn_c_try_compile ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  rm -f conftest.$ac_objext\n  if { { ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compile\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && {\n\t test -z \"$ac_c_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest.$ac_objext; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_retval=1\nfi\n  eval $as_lineno_stack; test \"x$as_lineno_stack\" = x && { as_lineno=; unset as_lineno;}\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_compile\n\n# ac_fn_c_try_link LINENO\n# -----------------------\n# Try to link conftest.$ac_ext, and return whether this succeeded.\nac_fn_c_try_link ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  rm -f conftest.$ac_objext conftest$ac_exeext\n  if { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && {\n\t test -z \"$ac_c_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest$ac_exeext && {\n\t test \"$cross_compiling\" = yes ||\n\t $as_test_x conftest$ac_exeext\n       }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_retval=1\nfi\n  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information\n  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would\n  # interfere with the next link command; also delete a directory that is\n  # left behind by Apple's compiler.  We do this before executing the actions.\n  rm -rf conftest.dSYM conftest_ipa8_conftest.oo\n  eval $as_lineno_stack; test \"x$as_lineno_stack\" = x && { as_lineno=; unset as_lineno;}\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_link\n\n# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES\n# -------------------------------------------------------\n# Tests whether HEADER exists and can be compiled using the include files in\n# INCLUDES, setting the cache variable VAR accordingly.\nac_fn_c_check_header_compile ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif { as_var=$3; eval \"test \\\"\\${$as_var+set}\\\" = set\"; }; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\n#include <$2>\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  eval \"$3=yes\"\nelse\n  eval \"$3=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\n  eval $as_lineno_stack; test \"x$as_lineno_stack\" = x && { as_lineno=; unset as_lineno;}\n\n} # ac_fn_c_check_header_compile\n\n# ac_fn_c_try_cpp LINENO\n# ----------------------\n# Try to preprocess conftest.$ac_ext, and return whether this succeeded.\nac_fn_c_try_cpp ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if { { ac_try=\"$ac_cpp conftest.$ac_ext\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_cpp conftest.$ac_ext\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } >/dev/null && {\n\t test -z \"$ac_c_preproc_warn_flag$ac_c_werror_flag\" ||\n\t test ! -s conftest.err\n       }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n    ac_retval=1\nfi\n  eval $as_lineno_stack; test \"x$as_lineno_stack\" = x && { as_lineno=; unset as_lineno;}\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_cpp\n\n# ac_fn_c_try_run LINENO\n# ----------------------\n# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes\n# that executables *can* be run.\nac_fn_c_try_run ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'\n  { { case \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_try\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: program exited with status $ac_status\" >&5\n       $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n       ac_retval=$ac_status\nfi\n  rm -rf conftest.dSYM conftest_ipa8_conftest.oo\n  eval $as_lineno_stack; test \"x$as_lineno_stack\" = x && { as_lineno=; unset as_lineno;}\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_run\n\n# ac_fn_c_check_func LINENO FUNC VAR\n# ----------------------------------\n# Tests whether FUNC exists, setting the cache variable VAR accordingly\nac_fn_c_check_func ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif { as_var=$3; eval \"test \\\"\\${$as_var+set}\\\" = set\"; }; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n/* Define $2 to an innocuous variant, in case <limits.h> declares $2.\n   For example, HP-UX 11i <limits.h> declares gettimeofday.  */\n#define $2 innocuous_$2\n\n/* System header to define __stub macros and hopefully few prototypes,\n    which can conflict with char $2 (); below.\n    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n    <limits.h> exists even on freestanding compilers.  */\n\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\n#undef $2\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar $2 ();\n/* The GNU C library defines this for functions which it implements\n    to always fail with ENOSYS.  Some functions are actually named\n    something starting with __ and the normal name is an alias.  */\n#if defined __stub_$2 || defined __stub___$2\nchoke me\n#endif\n\nint\nmain ()\n{\nreturn $2 ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  eval \"$3=yes\"\nelse\n  eval \"$3=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\n  eval $as_lineno_stack; test \"x$as_lineno_stack\" = x && { as_lineno=; unset as_lineno;}\n\n} # ac_fn_c_check_func\n\n# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES\n# -------------------------------------------------------\n# Tests whether HEADER exists, giving a warning if it cannot be compiled using\n# the include files in INCLUDES and setting the cache variable VAR\n# accordingly.\nac_fn_c_check_header_mongrel ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if { as_var=$3; eval \"test \\\"\\${$as_var+set}\\\" = set\"; }; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif { as_var=$3; eval \"test \\\"\\${$as_var+set}\\\" = set\"; }; then :\n  $as_echo_n \"(cached) \" >&6\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nelse\n  # Is the header compilable?\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking $2 usability\" >&5\n$as_echo_n \"checking $2 usability... \" >&6; }\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\n#include <$2>\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_header_compiler=yes\nelse\n  ac_header_compiler=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler\" >&5\n$as_echo \"$ac_header_compiler\" >&6; }\n\n# Is the header present?\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking $2 presence\" >&5\n$as_echo_n \"checking $2 presence... \" >&6; }\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <$2>\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n  ac_header_preproc=yes\nelse\n  ac_header_preproc=no\nfi\nrm -f conftest.err conftest.$ac_ext\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc\" >&5\n$as_echo \"$ac_header_preproc\" >&6; }\n\n# So?  What about this header?\ncase $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((\n  yes:no: )\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!\" >&5\n$as_echo \"$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result\" >&5\n$as_echo \"$as_me: WARNING: $2: proceeding with the compiler's result\" >&2;}\n    ;;\n  no:yes:* )\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled\" >&5\n$as_echo \"$as_me: WARNING: $2: present but cannot be compiled\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?\" >&5\n$as_echo \"$as_me: WARNING: $2:     check for missing prerequisite headers?\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation\" >&5\n$as_echo \"$as_me: WARNING: $2: see the Autoconf documentation\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \\\"Present But Cannot Be Compiled\\\"\" >&5\n$as_echo \"$as_me: WARNING: $2:     section \\\"Present But Cannot Be Compiled\\\"\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result\" >&5\n$as_echo \"$as_me: WARNING: $2: proceeding with the compiler's result\" >&2;}\n    ;;\nesac\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif { as_var=$3; eval \"test \\\"\\${$as_var+set}\\\" = set\"; }; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  eval \"$3=\\$ac_header_compiler\"\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nfi\n  eval $as_lineno_stack; test \"x$as_lineno_stack\" = x && { as_lineno=; unset as_lineno;}\n\n} # ac_fn_c_check_header_mongrel\n\n# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES\n# --------------------------------------------\n# Tries to find the compile-time value of EXPR in a program that includes\n# INCLUDES, setting VAR accordingly. Returns whether the value could be\n# computed\nac_fn_c_compute_int ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if test \"$cross_compiling\" = yes; then\n    # Depending upon the size, compute the lo and hi bounds.\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\nint\nmain ()\n{\nstatic int test_array [1 - 2 * !(($2) >= 0)];\ntest_array [0] = 0\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_lo=0 ac_mid=0\n  while :; do\n    cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\nint\nmain ()\n{\nstatic int test_array [1 - 2 * !(($2) <= $ac_mid)];\ntest_array [0] = 0\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_hi=$ac_mid; break\nelse\n  as_fn_arith $ac_mid + 1 && ac_lo=$as_val\n\t\t\tif test $ac_lo -le $ac_mid; then\n\t\t\t  ac_lo= ac_hi=\n\t\t\t  break\n\t\t\tfi\n\t\t\tas_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  done\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\nint\nmain ()\n{\nstatic int test_array [1 - 2 * !(($2) < 0)];\ntest_array [0] = 0\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_hi=-1 ac_mid=-1\n  while :; do\n    cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\nint\nmain ()\n{\nstatic int test_array [1 - 2 * !(($2) >= $ac_mid)];\ntest_array [0] = 0\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_lo=$ac_mid; break\nelse\n  as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val\n\t\t\tif test $ac_mid -le $ac_hi; then\n\t\t\t  ac_lo= ac_hi=\n\t\t\t  break\n\t\t\tfi\n\t\t\tas_fn_arith 2 '*' $ac_mid && ac_mid=$as_val\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  done\nelse\n  ac_lo= ac_hi=\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n# Binary search between lo and hi bounds.\nwhile test \"x$ac_lo\" != \"x$ac_hi\"; do\n  as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\nint\nmain ()\n{\nstatic int test_array [1 - 2 * !(($2) <= $ac_mid)];\ntest_array [0] = 0\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_hi=$ac_mid\nelse\n  as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\ndone\ncase $ac_lo in #((\n?*) eval \"$3=\\$ac_lo\"; ac_retval=0 ;;\n'') ac_retval=1 ;;\nesac\n  else\n    cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\nstatic long int longval () { return $2; }\nstatic unsigned long int ulongval () { return $2; }\n#include <stdio.h>\n#include <stdlib.h>\nint\nmain ()\n{\n\n  FILE *f = fopen (\"conftest.val\", \"w\");\n  if (! f)\n    return 1;\n  if (($2) < 0)\n    {\n      long int i = longval ();\n      if (i != ($2))\n\treturn 1;\n      fprintf (f, \"%ld\", i);\n    }\n  else\n    {\n      unsigned long int i = ulongval ();\n      if (i != ($2))\n\treturn 1;\n      fprintf (f, \"%lu\", i);\n    }\n  /* Do not output a trailing newline, as this causes \\r\\n confusion\n     on some platforms.  */\n  return ferror (f) || fclose (f) != 0;\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_run \"$LINENO\"; then :\n  echo >>conftest.val; read $3 <conftest.val; ac_retval=0\nelse\n  ac_retval=1\nfi\nrm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \\\n  conftest.$ac_objext conftest.beam conftest.$ac_ext\nrm -f conftest.val\n\n  fi\n  eval $as_lineno_stack; test \"x$as_lineno_stack\" = x && { as_lineno=; unset as_lineno;}\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_compute_int\ncat >config.log <<_ACEOF\nThis file contains any messages produced by compilers while\nrunning configure, to aid debugging if configure makes a mistake.\n\nIt was created by onig $as_me 5.13.5, which was\ngenerated by GNU Autoconf 2.65.  Invocation command line was\n\n  $ $0 $@\n\n_ACEOF\nexec 5>>config.log\n{\ncat <<_ASUNAME\n## --------- ##\n## Platform. ##\n## --------- ##\n\nhostname = `(hostname || uname -n) 2>/dev/null | sed 1q`\nuname -m = `(uname -m) 2>/dev/null || echo unknown`\nuname -r = `(uname -r) 2>/dev/null || echo unknown`\nuname -s = `(uname -s) 2>/dev/null || echo unknown`\nuname -v = `(uname -v) 2>/dev/null || echo unknown`\n\n/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`\n/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`\n\n/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`\n/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`\n/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`\n/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`\n/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`\n/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`\n/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`\n\n_ASUNAME\n\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    $as_echo \"PATH: $as_dir\"\n  done\nIFS=$as_save_IFS\n\n} >&5\n\ncat >&5 <<_ACEOF\n\n\n## ----------- ##\n## Core tests. ##\n## ----------- ##\n\n_ACEOF\n\n\n# Keep a trace of the command line.\n# Strip out --no-create and --no-recursion so they do not pile up.\n# Strip out --silent because we don't want to record it for future runs.\n# Also quote any args containing shell meta-characters.\n# Make two passes to allow for proper duplicate-argument suppression.\nac_configure_args=\nac_configure_args0=\nac_configure_args1=\nac_must_keep_next=false\nfor ac_pass in 1 2\ndo\n  for ac_arg\n  do\n    case $ac_arg in\n    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;\n    -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n    | -silent | --silent | --silen | --sile | --sil)\n      continue ;;\n    *\\'*)\n      ac_arg=`$as_echo \"$ac_arg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    esac\n    case $ac_pass in\n    1) as_fn_append ac_configure_args0 \" '$ac_arg'\" ;;\n    2)\n      as_fn_append ac_configure_args1 \" '$ac_arg'\"\n      if test $ac_must_keep_next = true; then\n\tac_must_keep_next=false # Got value, back to normal.\n      else\n\tcase $ac_arg in\n\t  *=* | --config-cache | -C | -disable-* | --disable-* \\\n\t  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \\\n\t  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \\\n\t  | -with-* | --with-* | -without-* | --without-* | --x)\n\t    case \"$ac_configure_args0 \" in\n\t      \"$ac_configure_args1\"*\" '$ac_arg' \"* ) continue ;;\n\t    esac\n\t    ;;\n\t  -* ) ac_must_keep_next=true ;;\n\tesac\n      fi\n      as_fn_append ac_configure_args \" '$ac_arg'\"\n      ;;\n    esac\n  done\ndone\n{ ac_configure_args0=; unset ac_configure_args0;}\n{ ac_configure_args1=; unset ac_configure_args1;}\n\n# When interrupted or exit'd, cleanup temporary files, and complete\n# config.log.  We remove comments because anyway the quotes in there\n# would cause problems or look ugly.\n# WARNING: Use '\\'' to represent an apostrophe within the trap.\n# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.\ntrap 'exit_status=$?\n  # Save into config.log some information that might help in debugging.\n  {\n    echo\n\n    cat <<\\_ASBOX\n## ---------------- ##\n## Cache variables. ##\n## ---------------- ##\n_ASBOX\n    echo\n    # The following way of writing the cache mishandles newlines in values,\n(\n  for ac_var in `(set) 2>&1 | sed -n '\\''s/^\\([a-zA-Z_][a-zA-Z0-9_]*\\)=.*/\\1/p'\\''`; do\n    eval ac_val=\\$$ac_var\n    case $ac_val in #(\n    *${as_nl}*)\n      case $ac_var in #(\n      *_cv_*) { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline\" >&5\n$as_echo \"$as_me: WARNING: cache variable $ac_var contains a newline\" >&2;} ;;\n      esac\n      case $ac_var in #(\n      _ | IFS | as_nl) ;; #(\n      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(\n      *) { eval $ac_var=; unset $ac_var;} ;;\n      esac ;;\n    esac\n  done\n  (set) 2>&1 |\n    case $as_nl`(ac_space='\\'' '\\''; set) 2>&1` in #(\n    *${as_nl}ac_space=\\ *)\n      sed -n \\\n\t\"s/'\\''/'\\''\\\\\\\\'\\'''\\''/g;\n\t  s/^\\\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\\\)=\\\\(.*\\\\)/\\\\1='\\''\\\\2'\\''/p\"\n      ;; #(\n    *)\n      sed -n \"/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p\"\n      ;;\n    esac |\n    sort\n)\n    echo\n\n    cat <<\\_ASBOX\n## ----------------- ##\n## Output variables. ##\n## ----------------- ##\n_ASBOX\n    echo\n    for ac_var in $ac_subst_vars\n    do\n      eval ac_val=\\$$ac_var\n      case $ac_val in\n      *\\'\\''*) ac_val=`$as_echo \"$ac_val\" | sed \"s/'\\''/'\\''\\\\\\\\\\\\\\\\'\\'''\\''/g\"`;;\n      esac\n      $as_echo \"$ac_var='\\''$ac_val'\\''\"\n    done | sort\n    echo\n\n    if test -n \"$ac_subst_files\"; then\n      cat <<\\_ASBOX\n## ------------------- ##\n## File substitutions. ##\n## ------------------- ##\n_ASBOX\n      echo\n      for ac_var in $ac_subst_files\n      do\n\teval ac_val=\\$$ac_var\n\tcase $ac_val in\n\t*\\'\\''*) ac_val=`$as_echo \"$ac_val\" | sed \"s/'\\''/'\\''\\\\\\\\\\\\\\\\'\\'''\\''/g\"`;;\n\tesac\n\t$as_echo \"$ac_var='\\''$ac_val'\\''\"\n      done | sort\n      echo\n    fi\n\n    if test -s confdefs.h; then\n      cat <<\\_ASBOX\n## ----------- ##\n## confdefs.h. ##\n## ----------- ##\n_ASBOX\n      echo\n      cat confdefs.h\n      echo\n    fi\n    test \"$ac_signal\" != 0 &&\n      $as_echo \"$as_me: caught signal $ac_signal\"\n    $as_echo \"$as_me: exit $exit_status\"\n  } >&5\n  rm -f core *.core core.conftest.* &&\n    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&\n    exit $exit_status\n' 0\nfor ac_signal in 1 2 13 15; do\n  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal\ndone\nac_signal=0\n\n# confdefs.h avoids OS command line length limits that DEFS can exceed.\nrm -f -r conftest* confdefs.h\n\n$as_echo \"/* confdefs.h */\" > confdefs.h\n\n# Predefined preprocessor variables.\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_NAME \"$PACKAGE_NAME\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_VERSION \"$PACKAGE_VERSION\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_STRING \"$PACKAGE_STRING\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_URL \"$PACKAGE_URL\"\n_ACEOF\n\n\n# Let the site file select an alternate cache file if it wants to.\n# Prefer an explicitly selected file to automatically selected ones.\nac_site_file1=NONE\nac_site_file2=NONE\nif test -n \"$CONFIG_SITE\"; then\n  ac_site_file1=$CONFIG_SITE\nelif test \"x$prefix\" != xNONE; then\n  ac_site_file1=$prefix/share/config.site\n  ac_site_file2=$prefix/etc/config.site\nelse\n  ac_site_file1=$ac_default_prefix/share/config.site\n  ac_site_file2=$ac_default_prefix/etc/config.site\nfi\nfor ac_site_file in \"$ac_site_file1\" \"$ac_site_file2\"\ndo\n  test \"x$ac_site_file\" = xNONE && continue\n  if test /dev/null != \"$ac_site_file\" && test -r \"$ac_site_file\"; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file\" >&5\n$as_echo \"$as_me: loading site script $ac_site_file\" >&6;}\n    sed 's/^/| /' \"$ac_site_file\" >&5\n    . \"$ac_site_file\"\n  fi\ndone\n\nif test -r \"$cache_file\"; then\n  # Some versions of bash will fail to source /dev/null (special files\n  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.\n  if test /dev/null != \"$cache_file\" && test -f \"$cache_file\"; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: loading cache $cache_file\" >&5\n$as_echo \"$as_me: loading cache $cache_file\" >&6;}\n    case $cache_file in\n      [\\\\/]* | ?:[\\\\/]* ) . \"$cache_file\";;\n      *)                      . \"./$cache_file\";;\n    esac\n  fi\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: creating cache $cache_file\" >&5\n$as_echo \"$as_me: creating cache $cache_file\" >&6;}\n  >$cache_file\nfi\n\n# Check that the precious variables saved in the cache have kept the same\n# value.\nac_cache_corrupted=false\nfor ac_var in $ac_precious_vars; do\n  eval ac_old_set=\\$ac_cv_env_${ac_var}_set\n  eval ac_new_set=\\$ac_env_${ac_var}_set\n  eval ac_old_val=\\$ac_cv_env_${ac_var}_value\n  eval ac_new_val=\\$ac_env_${ac_var}_value\n  case $ac_old_set,$ac_new_set in\n    set,)\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: error: \\`$ac_var' was set to \\`$ac_old_val' in the previous run\" >&5\n$as_echo \"$as_me: error: \\`$ac_var' was set to \\`$ac_old_val' in the previous run\" >&2;}\n      ac_cache_corrupted=: ;;\n    ,set)\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: error: \\`$ac_var' was not set in the previous run\" >&5\n$as_echo \"$as_me: error: \\`$ac_var' was not set in the previous run\" >&2;}\n      ac_cache_corrupted=: ;;\n    ,);;\n    *)\n      if test \"x$ac_old_val\" != \"x$ac_new_val\"; then\n\t# differences in whitespace do not lead to failure.\n\tac_old_val_w=`echo x $ac_old_val`\n\tac_new_val_w=`echo x $ac_new_val`\n\tif test \"$ac_old_val_w\" != \"$ac_new_val_w\"; then\n\t  { $as_echo \"$as_me:${as_lineno-$LINENO}: error: \\`$ac_var' has changed since the previous run:\" >&5\n$as_echo \"$as_me: error: \\`$ac_var' has changed since the previous run:\" >&2;}\n\t  ac_cache_corrupted=:\n\telse\n\t  { $as_echo \"$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \\`$ac_var' since the previous run:\" >&5\n$as_echo \"$as_me: warning: ignoring whitespace changes in \\`$ac_var' since the previous run:\" >&2;}\n\t  eval $ac_var=\\$ac_old_val\n\tfi\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}:   former value:  \\`$ac_old_val'\" >&5\n$as_echo \"$as_me:   former value:  \\`$ac_old_val'\" >&2;}\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}:   current value: \\`$ac_new_val'\" >&5\n$as_echo \"$as_me:   current value: \\`$ac_new_val'\" >&2;}\n      fi;;\n  esac\n  # Pass precious variables to config.status.\n  if test \"$ac_new_set\" = set; then\n    case $ac_new_val in\n    *\\'*) ac_arg=$ac_var=`$as_echo \"$ac_new_val\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    *) ac_arg=$ac_var=$ac_new_val ;;\n    esac\n    case \" $ac_configure_args \" in\n      *\" '$ac_arg' \"*) ;; # Avoid dups.  Use of quotes ensures accuracy.\n      *) as_fn_append ac_configure_args \" '$ac_arg'\" ;;\n    esac\n  fi\ndone\nif $ac_cache_corrupted; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build\" >&5\n$as_echo \"$as_me: error: changes in the environment can compromise the build\" >&2;}\n  as_fn_error \"run \\`make distclean' and/or \\`rm $cache_file' and start over\" \"$LINENO\" 5\nfi\n## -------------------- ##\n## Main body of script. ##\n## -------------------- ##\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\n\n\n\nam__api_version='1.11'\n\nac_aux_dir=\nfor ac_dir in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"; do\n  for ac_t in install-sh install.sh shtool; do\n    if test -f \"$ac_dir/$ac_t\"; then\n      ac_aux_dir=$ac_dir\n      ac_install_sh=\"$ac_aux_dir/$ac_t -c\"\n      break 2\n    fi\n  done\ndone\nif test -z \"$ac_aux_dir\"; then\n  as_fn_error \"cannot find install-sh, install.sh, or shtool in \\\"$srcdir\\\" \\\"$srcdir/..\\\" \\\"$srcdir/../..\\\"\" \"$LINENO\" 5\nfi\n\n# These three variables are undocumented and unsupported,\n# and are intended to be withdrawn in a future Autoconf release.\n# They can cause serious problems if a builder's source tree is in a directory\n# whose full name contains unusual characters.\nac_config_guess=\"$SHELL $ac_aux_dir/config.guess\"  # Please don't use this var.\nac_config_sub=\"$SHELL $ac_aux_dir/config.sub\"  # Please don't use this var.\nac_configure=\"$SHELL $ac_aux_dir/configure\"  # Please don't use this var.\n\n\n# Find a good install program.  We prefer a C program (faster),\n# so one script is as good as another.  But avoid the broken or\n# incompatible versions:\n# SysV /etc/install, /usr/sbin/install\n# SunOS /usr/etc/install\n# IRIX /sbin/install\n# AIX /bin/install\n# AmigaOS /C/install, which installs bootblocks on floppy discs\n# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag\n# AFS /usr/afsws/bin/install, which mishandles nonexistent args\n# SVR4 /usr/ucb/install, which tries to use the nonexistent group \"staff\"\n# OS/2's system install, which has a completely different semantic\n# ./install, which can be erroneously created by make from ./install.sh.\n# Reject install programs that cannot install multiple files.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install\" >&5\n$as_echo_n \"checking for a BSD-compatible install... \" >&6; }\nif test -z \"$INSTALL\"; then\nif test \"${ac_cv_path_install+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    # Account for people who put trailing slashes in PATH elements.\ncase $as_dir/ in #((\n  ./ | .// | /[cC]/* | \\\n  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \\\n  ?:[\\\\/]os2[\\\\/]install[\\\\/]* | ?:[\\\\/]OS2[\\\\/]INSTALL[\\\\/]* | \\\n  /usr/ucb/* ) ;;\n  *)\n    # OSF1 and SCO ODT 3.0 have their own names for install.\n    # Don't use installbsd from OSF since it installs stuff as root\n    # by default.\n    for ac_prog in ginstall scoinst install; do\n      for ac_exec_ext in '' $ac_executable_extensions; do\n\tif { test -f \"$as_dir/$ac_prog$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_prog$ac_exec_ext\"; }; then\n\t  if test $ac_prog = install &&\n\t    grep dspmsg \"$as_dir/$ac_prog$ac_exec_ext\" >/dev/null 2>&1; then\n\t    # AIX install.  It has an incompatible calling convention.\n\t    :\n\t  elif test $ac_prog = install &&\n\t    grep pwplus \"$as_dir/$ac_prog$ac_exec_ext\" >/dev/null 2>&1; then\n\t    # program-specific install script used by HP pwplus--don't use.\n\t    :\n\t  else\n\t    rm -rf conftest.one conftest.two conftest.dir\n\t    echo one > conftest.one\n\t    echo two > conftest.two\n\t    mkdir conftest.dir\n\t    if \"$as_dir/$ac_prog$ac_exec_ext\" -c conftest.one conftest.two \"`pwd`/conftest.dir\" &&\n\t      test -s conftest.one && test -s conftest.two &&\n\t      test -s conftest.dir/conftest.one &&\n\t      test -s conftest.dir/conftest.two\n\t    then\n\t      ac_cv_path_install=\"$as_dir/$ac_prog$ac_exec_ext -c\"\n\t      break 3\n\t    fi\n\t  fi\n\tfi\n      done\n    done\n    ;;\nesac\n\n  done\nIFS=$as_save_IFS\n\nrm -rf conftest.one conftest.two conftest.dir\n\nfi\n  if test \"${ac_cv_path_install+set}\" = set; then\n    INSTALL=$ac_cv_path_install\n  else\n    # As a last resort, use the slow shell script.  Don't cache a\n    # value for INSTALL within a source directory, because that will\n    # break other packages using the cache if that directory is\n    # removed, or if the value is a relative name.\n    INSTALL=$ac_install_sh\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $INSTALL\" >&5\n$as_echo \"$INSTALL\" >&6; }\n\n# Use test -z because SunOS4 sh mishandles braces in ${var-val}.\n# It thinks the first close brace ends the variable substitution.\ntest -z \"$INSTALL_PROGRAM\" && INSTALL_PROGRAM='${INSTALL}'\n\ntest -z \"$INSTALL_SCRIPT\" && INSTALL_SCRIPT='${INSTALL}'\n\ntest -z \"$INSTALL_DATA\" && INSTALL_DATA='${INSTALL} -m 644'\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether build environment is sane\" >&5\n$as_echo_n \"checking whether build environment is sane... \" >&6; }\n# Just in case\nsleep 1\necho timestamp > conftest.file\n# Reject unsafe characters in $srcdir or the absolute working directory\n# name.  Accept space and tab only in the latter.\nam_lf='\n'\ncase `pwd` in\n  *[\\\\\\\"\\#\\$\\&\\'\\`$am_lf]*)\n    as_fn_error \"unsafe absolute working directory name\" \"$LINENO\" 5;;\nesac\ncase $srcdir in\n  *[\\\\\\\"\\#\\$\\&\\'\\`$am_lf\\ \\\t]*)\n    as_fn_error \"unsafe srcdir value: \\`$srcdir'\" \"$LINENO\" 5;;\nesac\n\n# Do `set' in a subshell so we don't clobber the current shell's\n# arguments.  Must try -L first in case configure is actually a\n# symlink; some systems play weird games with the mod time of symlinks\n# (eg FreeBSD returns the mod time of the symlink's containing\n# directory).\nif (\n   set X `ls -Lt \"$srcdir/configure\" conftest.file 2> /dev/null`\n   if test \"$*\" = \"X\"; then\n      # -L didn't work.\n      set X `ls -t \"$srcdir/configure\" conftest.file`\n   fi\n   rm -f conftest.file\n   if test \"$*\" != \"X $srcdir/configure conftest.file\" \\\n      && test \"$*\" != \"X conftest.file $srcdir/configure\"; then\n\n      # If neither matched, then we have a broken ls.  This can happen\n      # if, for instance, CONFIG_SHELL is bash and it inherits a\n      # broken ls alias from the environment.  This has actually\n      # happened.  Such a system could not be considered \"sane\".\n      as_fn_error \"ls -t appears to fail.  Make sure there is not a broken\nalias in your environment\" \"$LINENO\" 5\n   fi\n\n   test \"$2\" = conftest.file\n   )\nthen\n   # Ok.\n   :\nelse\n   as_fn_error \"newly created file is older than distributed files!\nCheck your system clock\" \"$LINENO\" 5\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\ntest \"$program_prefix\" != NONE &&\n  program_transform_name=\"s&^&$program_prefix&;$program_transform_name\"\n# Use a double $ so make ignores it.\ntest \"$program_suffix\" != NONE &&\n  program_transform_name=\"s&\\$&$program_suffix&;$program_transform_name\"\n# Double any \\ or $.\n# By default was `s,x,x', remove it if useless.\nac_script='s/[\\\\$]/&&/g;s/;s,x,x,$//'\nprogram_transform_name=`$as_echo \"$program_transform_name\" | sed \"$ac_script\"`\n\n# expand $ac_aux_dir to an absolute path\nam_aux_dir=`cd $ac_aux_dir && pwd`\n\nif test x\"${MISSING+set}\" != xset; then\n  case $am_aux_dir in\n  *\\ * | *\\\t*)\n    MISSING=\"\\${SHELL} \\\"$am_aux_dir/missing\\\"\" ;;\n  *)\n    MISSING=\"\\${SHELL} $am_aux_dir/missing\" ;;\n  esac\nfi\n# Use eval to expand $SHELL\nif eval \"$MISSING --run true\"; then\n  am_missing_run=\"$MISSING --run \"\nelse\n  am_missing_run=\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: \\`missing' script is too old or missing\" >&5\n$as_echo \"$as_me: WARNING: \\`missing' script is too old or missing\" >&2;}\nfi\n\nif test x\"${install_sh}\" != xset; then\n  case $am_aux_dir in\n  *\\ * | *\\\t*)\n    install_sh=\"\\${SHELL} '$am_aux_dir/install-sh'\" ;;\n  *)\n    install_sh=\"\\${SHELL} $am_aux_dir/install-sh\"\n  esac\nfi\n\n# Installed binaries are usually stripped using `strip' when the user\n# run `make install-strip'.  However `strip' might not be the right\n# tool to use in cross-compilation environments, therefore Automake\n# will honor the `STRIP' environment variable to overrule this program.\nif test \"$cross_compiling\" != no; then\n  if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}strip\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}strip; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_STRIP+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$STRIP\"; then\n  ac_cv_prog_STRIP=\"$STRIP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_STRIP=\"${ac_tool_prefix}strip\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nSTRIP=$ac_cv_prog_STRIP\nif test -n \"$STRIP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $STRIP\" >&5\n$as_echo \"$STRIP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_STRIP\"; then\n  ac_ct_STRIP=$STRIP\n  # Extract the first word of \"strip\", so it can be a program name with args.\nset dummy strip; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_ac_ct_STRIP+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_STRIP\"; then\n  ac_cv_prog_ac_ct_STRIP=\"$ac_ct_STRIP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_STRIP=\"strip\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP\nif test -n \"$ac_ct_STRIP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP\" >&5\n$as_echo \"$ac_ct_STRIP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_STRIP\" = x; then\n    STRIP=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    STRIP=$ac_ct_STRIP\n  fi\nelse\n  STRIP=\"$ac_cv_prog_STRIP\"\nfi\n\nfi\nINSTALL_STRIP_PROGRAM=\"\\$(install_sh) -c -s\"\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p\" >&5\n$as_echo_n \"checking for a thread-safe mkdir -p... \" >&6; }\nif test -z \"$MKDIR_P\"; then\n  if test \"${ac_cv_path_mkdir+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in mkdir gmkdir; do\n\t for ac_exec_ext in '' $ac_executable_extensions; do\n\t   { test -f \"$as_dir/$ac_prog$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_prog$ac_exec_ext\"; } || continue\n\t   case `\"$as_dir/$ac_prog$ac_exec_ext\" --version 2>&1` in #(\n\t     'mkdir (GNU coreutils) '* | \\\n\t     'mkdir (coreutils) '* | \\\n\t     'mkdir (fileutils) '4.1*)\n\t       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext\n\t       break 3;;\n\t   esac\n\t done\n       done\n  done\nIFS=$as_save_IFS\n\nfi\n\n  test -d ./--version && rmdir ./--version\n  if test \"${ac_cv_path_mkdir+set}\" = set; then\n    MKDIR_P=\"$ac_cv_path_mkdir -p\"\n  else\n    # As a last resort, use the slow shell script.  Don't cache a\n    # value for MKDIR_P within a source directory, because that will\n    # break other packages using the cache if that directory is\n    # removed, or if the value is a relative name.\n    MKDIR_P=\"$ac_install_sh -d\"\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $MKDIR_P\" >&5\n$as_echo \"$MKDIR_P\" >&6; }\n\nmkdir_p=\"$MKDIR_P\"\ncase $mkdir_p in\n  [\\\\/$]* | ?:[\\\\/]*) ;;\n  */*) mkdir_p=\"\\$(top_builddir)/$mkdir_p\" ;;\nesac\n\nfor ac_prog in gawk mawk nawk awk\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_AWK+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$AWK\"; then\n  ac_cv_prog_AWK=\"$AWK\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_AWK=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nAWK=$ac_cv_prog_AWK\nif test -n \"$AWK\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $AWK\" >&5\n$as_echo \"$AWK\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$AWK\" && break\ndone\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \\$(MAKE)\" >&5\n$as_echo_n \"checking whether ${MAKE-make} sets \\$(MAKE)... \" >&6; }\nset x ${MAKE-make}\nac_make=`$as_echo \"$2\" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`\nif { as_var=ac_cv_prog_make_${ac_make}_set; eval \"test \\\"\\${$as_var+set}\\\" = set\"; }; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat >conftest.make <<\\_ACEOF\nSHELL = /bin/sh\nall:\n\t@echo '@@@%%%=$(MAKE)=@@@%%%'\n_ACEOF\n# GNU make sometimes prints \"make[1]: Entering...\", which would confuse us.\ncase `${MAKE-make} -f conftest.make 2>/dev/null` in\n  *@@@%%%=?*=@@@%%%*)\n    eval ac_cv_prog_make_${ac_make}_set=yes;;\n  *)\n    eval ac_cv_prog_make_${ac_make}_set=no;;\nesac\nrm -f conftest.make\nfi\nif eval test \\$ac_cv_prog_make_${ac_make}_set = yes; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n  SET_MAKE=\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n  SET_MAKE=\"MAKE=${MAKE-make}\"\nfi\n\nrm -rf .tst 2>/dev/null\nmkdir .tst 2>/dev/null\nif test -d .tst; then\n  am__leading_dot=.\nelse\n  am__leading_dot=_\nfi\nrmdir .tst 2>/dev/null\n\nif test \"`cd $srcdir && pwd`\" != \"`pwd`\"; then\n  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output\n  # is not polluted with repeated \"-I.\"\n  am__isrc=' -I$(srcdir)'\n  # test to see if srcdir already configured\n  if test -f $srcdir/config.status; then\n    as_fn_error \"source directory already configured; run \\\"make distclean\\\" there first\" \"$LINENO\" 5\n  fi\nfi\n\n# test whether we have cygpath\nif test -z \"$CYGPATH_W\"; then\n  if (cygpath --version) >/dev/null 2>/dev/null; then\n    CYGPATH_W='cygpath -w'\n  else\n    CYGPATH_W=echo\n  fi\nfi\n\n\n# Define the identity of the package.\n PACKAGE='onig'\n VERSION='5.13.5'\n\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE \"$PACKAGE\"\n_ACEOF\n\n\ncat >>confdefs.h <<_ACEOF\n#define VERSION \"$VERSION\"\n_ACEOF\n\n# Some tools Automake needs.\n\nACLOCAL=${ACLOCAL-\"${am_missing_run}aclocal-${am__api_version}\"}\n\n\nAUTOCONF=${AUTOCONF-\"${am_missing_run}autoconf\"}\n\n\nAUTOMAKE=${AUTOMAKE-\"${am_missing_run}automake-${am__api_version}\"}\n\n\nAUTOHEADER=${AUTOHEADER-\"${am_missing_run}autoheader\"}\n\n\nMAKEINFO=${MAKEINFO-\"${am_missing_run}makeinfo\"}\n\n# We need awk for the \"check\" target.  The system \"awk\" is bad on\n# some platforms.\n# Always define AMTAR for backward compatibility.\n\nAMTAR=${AMTAR-\"${am_missing_run}tar\"}\n\nam__tar='${AMTAR} chof - \"$$tardir\"'; am__untar='${AMTAR} xf -'\n\n\n\n\n\nac_config_headers=\"$ac_config_headers config.h\"\n\n\n\nRUBYDIR=\"..\"\n\n# Check whether --with-rubydir was given.\nif test \"${with_rubydir+set}\" = set; then :\n  withval=$with_rubydir;  RUBYDIR=$withval\nfi\n\n\n\nSTATISTICS=\"\"\n\n# Check whether --with-statistics was given.\nif test \"${with_statistics+set}\" = set; then :\n  withval=$with_statistics;  STATISTICS=-DONIG_DEBUG_STATISTICS\nfi\n\n\n\n# Check whether --enable-combination-explosion-check was given.\nif test \"${enable_combination_explosion_check+set}\" = set; then :\n  enableval=$enable_combination_explosion_check; comb_expl_check=$enableval\nfi\n\nif test \"${comb_expl_check}\" = yes; then\n\n$as_echo \"#define USE_COMBINATION_EXPLOSION_CHECK 1\" >>confdefs.h\n\nfi\n\n# Check whether --enable-crnl-as-line-terminator was given.\nif test \"${enable_crnl_as_line_terminator+set}\" = set; then :\n  enableval=$enable_crnl_as_line_terminator; crnl_as_line_terminator=$enableval\nfi\n\nif test \"${crnl_as_line_terminator}\" = yes; then\n\n$as_echo \"#define USE_CRNL_AS_LINE_TERMINATOR 1\" >>confdefs.h\n\nfi\n\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}gcc\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}gcc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_CC+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}gcc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_CC\"; then\n  ac_ct_CC=$CC\n  # Extract the first word of \"gcc\", so it can be a program name with args.\nset dummy gcc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_ac_ct_CC+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_CC=\"gcc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC\" >&5\n$as_echo \"$ac_ct_CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_CC\" = x; then\n    CC=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CC=$ac_ct_CC\n  fi\nelse\n  CC=\"$ac_cv_prog_CC\"\nfi\n\nif test -z \"$CC\"; then\n          if test -n \"$ac_tool_prefix\"; then\n    # Extract the first word of \"${ac_tool_prefix}cc\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}cc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_CC+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}cc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  fi\nfi\nif test -z \"$CC\"; then\n  # Extract the first word of \"cc\", so it can be a program name with args.\nset dummy cc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_CC+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\n  ac_prog_rejected=no\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    if test \"$as_dir/$ac_word$ac_exec_ext\" = \"/usr/ucb/cc\"; then\n       ac_prog_rejected=yes\n       continue\n     fi\n    ac_cv_prog_CC=\"cc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nif test $ac_prog_rejected = yes; then\n  # We found a bogon in the path, so make sure we never use it.\n  set dummy $ac_cv_prog_CC\n  shift\n  if test $# != 0; then\n    # We chose a different compiler from the bogus one.\n    # However, it has the same basename, so the bogon will be chosen\n    # first if we set CC to just the basename; use the full file name.\n    shift\n    ac_cv_prog_CC=\"$as_dir/$ac_word${1+' '}$@\"\n  fi\nfi\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$CC\"; then\n  if test -n \"$ac_tool_prefix\"; then\n  for ac_prog in cl.exe\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_CC+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_CC=\"$ac_tool_prefix$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n    test -n \"$CC\" && break\n  done\nfi\nif test -z \"$CC\"; then\n  ac_ct_CC=$CC\n  for ac_prog in cl.exe\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_ac_ct_CC+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_CC=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC\" >&5\n$as_echo \"$ac_ct_CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$ac_ct_CC\" && break\ndone\n\n  if test \"x$ac_ct_CC\" = x; then\n    CC=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CC=$ac_ct_CC\n  fi\nfi\n\nfi\n\n\ntest -z \"$CC\" && { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error \"no acceptable C compiler found in \\$PATH\nSee \\`config.log' for more details.\" \"$LINENO\" 5; }\n\n# Provide some information about the compiler.\n$as_echo \"$as_me:${as_lineno-$LINENO}: checking for C compiler version\" >&5\nset X $ac_compile\nac_compiler=$2\nfor ac_option in --version -v -V -qversion; do\n  { { ac_try=\"$ac_compiler $ac_option >&5\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compiler $ac_option >&5\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    sed '10a\\\n... rest of stderr output deleted ...\n         10q' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n  fi\n  rm -f conftest.er1 conftest.err\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\ndone\n\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nac_clean_files_save=$ac_clean_files\nac_clean_files=\"$ac_clean_files a.out a.out.dSYM a.exe b.out\"\n# Try to create an executable without -o first, disregard a.out.\n# It will help us diagnose broken compilers, and finding out an intuition\n# of exeext.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the C compiler works\" >&5\n$as_echo_n \"checking whether the C compiler works... \" >&6; }\nac_link_default=`$as_echo \"$ac_link\" | sed 's/ -o *conftest[^ ]*//'`\n\n# The possible output files:\nac_files=\"a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*\"\n\nac_rmfiles=\nfor ac_file in $ac_files\ndo\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;\n    * ) ac_rmfiles=\"$ac_rmfiles $ac_file\";;\n  esac\ndone\nrm -f $ac_rmfiles\n\nif { { ac_try=\"$ac_link_default\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link_default\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then :\n  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.\n# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'\n# in a Makefile.  We should not override ac_cv_exeext if it was cached,\n# so that the user can short-circuit this test for compilers unknown to\n# Autoconf.\nfor ac_file in $ac_files ''\ndo\n  test -f \"$ac_file\" || continue\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )\n\t;;\n    [ab].out )\n\t# We found the default executable, but exeext='' is most\n\t# certainly right.\n\tbreak;;\n    *.* )\n\tif test \"${ac_cv_exeext+set}\" = set && test \"$ac_cv_exeext\" != no;\n\tthen :; else\n\t   ac_cv_exeext=`expr \"$ac_file\" : '[^.]*\\(\\..*\\)'`\n\tfi\n\t# We set ac_cv_exeext here because the later test for it is not\n\t# safe: cross compilers may not add the suffix if given an `-o'\n\t# argument, so we may need to know it at that point already.\n\t# Even if this section looks crufty: it has the advantage of\n\t# actually working.\n\tbreak;;\n    * )\n\tbreak;;\n  esac\ndone\ntest \"$ac_cv_exeext\" = no && ac_cv_exeext=\n\nelse\n  ac_file=''\nfi\nif test -z \"$ac_file\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n$as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n{ { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\n{ as_fn_set_status 77\nas_fn_error \"C compiler cannot create executables\nSee \\`config.log' for more details.\" \"$LINENO\" 5; }; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name\" >&5\n$as_echo_n \"checking for C compiler default output file name... \" >&6; }\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_file\" >&5\n$as_echo \"$ac_file\" >&6; }\nac_exeext=$ac_cv_exeext\n\nrm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out\nac_clean_files=$ac_clean_files_save\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for suffix of executables\" >&5\n$as_echo_n \"checking for suffix of executables... \" >&6; }\nif { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then :\n  # If both `conftest.exe' and `conftest' are `present' (well, observable)\n# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will\n# work properly (i.e., refer to `conftest.exe'), while it won't with\n# `rm'.\nfor ac_file in conftest.exe conftest conftest.*; do\n  test -f \"$ac_file\" || continue\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;\n    *.* ) ac_cv_exeext=`expr \"$ac_file\" : '[^.]*\\(\\..*\\)'`\n\t  break;;\n    * ) break;;\n  esac\ndone\nelse\n  { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error \"cannot compute suffix of executables: cannot compile and link\nSee \\`config.log' for more details.\" \"$LINENO\" 5; }\nfi\nrm -f conftest conftest$ac_cv_exeext\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext\" >&5\n$as_echo \"$ac_cv_exeext\" >&6; }\n\nrm -f conftest.$ac_ext\nEXEEXT=$ac_cv_exeext\nac_exeext=$EXEEXT\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nFILE *f = fopen (\"conftest.out\", \"w\");\n return ferror (f) || fclose (f) != 0;\n\n  ;\n  return 0;\n}\n_ACEOF\nac_clean_files=\"$ac_clean_files conftest.out\"\n# Check that the compiler produces executables we can run.  If not, either\n# the compiler is broken, or we cross compile.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling\" >&5\n$as_echo_n \"checking whether we are cross compiling... \" >&6; }\nif test \"$cross_compiling\" != yes; then\n  { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\n  if { ac_try='./conftest$ac_cv_exeext'\n  { { case \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_try\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; }; then\n    cross_compiling=no\n  else\n    if test \"$cross_compiling\" = maybe; then\n\tcross_compiling=yes\n    else\n\t{ { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error \"cannot run C compiled programs.\nIf you meant to cross compile, use \\`--host'.\nSee \\`config.log' for more details.\" \"$LINENO\" 5; }\n    fi\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $cross_compiling\" >&5\n$as_echo \"$cross_compiling\" >&6; }\n\nrm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out\nac_clean_files=$ac_clean_files_save\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for suffix of object files\" >&5\n$as_echo_n \"checking for suffix of object files... \" >&6; }\nif test \"${ac_cv_objext+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.o conftest.obj\nif { { ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compile\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then :\n  for ac_file in conftest.o conftest.obj conftest.*; do\n  test -f \"$ac_file\" || continue;\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;\n    *) ac_cv_objext=`expr \"$ac_file\" : '.*\\.\\(.*\\)'`\n       break;;\n  esac\ndone\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n{ { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error \"cannot compute suffix of object files: cannot compile\nSee \\`config.log' for more details.\" \"$LINENO\" 5; }\nfi\nrm -f conftest.$ac_cv_objext conftest.$ac_ext\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext\" >&5\n$as_echo \"$ac_cv_objext\" >&6; }\nOBJEXT=$ac_cv_objext\nac_objext=$OBJEXT\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler\" >&5\n$as_echo_n \"checking whether we are using the GNU C compiler... \" >&6; }\nif test \"${ac_cv_c_compiler_gnu+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n#ifndef __GNUC__\n       choke me\n#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_compiler_gnu=yes\nelse\n  ac_compiler_gnu=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nac_cv_c_compiler_gnu=$ac_compiler_gnu\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu\" >&5\n$as_echo \"$ac_cv_c_compiler_gnu\" >&6; }\nif test $ac_compiler_gnu = yes; then\n  GCC=yes\nelse\n  GCC=\nfi\nac_test_CFLAGS=${CFLAGS+set}\nac_save_CFLAGS=$CFLAGS\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g\" >&5\n$as_echo_n \"checking whether $CC accepts -g... \" >&6; }\nif test \"${ac_cv_prog_cc_g+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_save_c_werror_flag=$ac_c_werror_flag\n   ac_c_werror_flag=yes\n   ac_cv_prog_cc_g=no\n   CFLAGS=\"-g\"\n   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_g=yes\nelse\n  CFLAGS=\"\"\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n\nelse\n  ac_c_werror_flag=$ac_save_c_werror_flag\n\t CFLAGS=\"-g\"\n\t cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_g=yes\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n   ac_c_werror_flag=$ac_save_c_werror_flag\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g\" >&5\n$as_echo \"$ac_cv_prog_cc_g\" >&6; }\nif test \"$ac_test_CFLAGS\" = set; then\n  CFLAGS=$ac_save_CFLAGS\nelif test $ac_cv_prog_cc_g = yes; then\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-g -O2\"\n  else\n    CFLAGS=\"-g\"\n  fi\nelse\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-O2\"\n  else\n    CFLAGS=\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89\" >&5\n$as_echo_n \"checking for $CC option to accept ISO C89... \" >&6; }\nif test \"${ac_cv_prog_cc_c89+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_cv_prog_cc_c89=no\nac_save_CC=$CC\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdarg.h>\n#include <stdio.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */\nstruct buf { int x; };\nFILE * (*rcsopen) (struct buf *, struct stat *, int);\nstatic char *e (p, i)\n     char **p;\n     int i;\n{\n  return p[i];\n}\nstatic char *f (char * (*g) (char **, int), char **p, ...)\n{\n  char *s;\n  va_list v;\n  va_start (v,p);\n  s = g (p, va_arg (v,int));\n  va_end (v);\n  return s;\n}\n\n/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has\n   function prototypes and stuff, but not '\\xHH' hex character constants.\n   These don't provoke an error unfortunately, instead are silently treated\n   as 'x'.  The following induces an error, until -std is added to get\n   proper ANSI mode.  Curiously '\\x00'!='x' always comes out true, for an\n   array size at least.  It's necessary to write '\\x00'==0 to get something\n   that's true only with -std.  */\nint osf4_cc_array ['\\x00' == 0 ? 1 : -1];\n\n/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters\n   inside strings and character constants.  */\n#define FOO(x) 'x'\nint xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];\n\nint test (int i, double x);\nstruct s1 {int (*f) (int a);};\nstruct s2 {int (*f) (double a);};\nint pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);\nint argc;\nchar **argv;\nint\nmain ()\n{\nreturn f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];\n  ;\n  return 0;\n}\n_ACEOF\nfor ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \\\n\t-Ae \"-Aa -D_HPUX_SOURCE\" \"-Xc -D__EXTENSIONS__\"\ndo\n  CC=\"$ac_save_CC $ac_arg\"\n  if ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_c89=$ac_arg\nfi\nrm -f core conftest.err conftest.$ac_objext\n  test \"x$ac_cv_prog_cc_c89\" != \"xno\" && break\ndone\nrm -f conftest.$ac_ext\nCC=$ac_save_CC\n\nfi\n# AC_CACHE_VAL\ncase \"x$ac_cv_prog_cc_c89\" in\n  x)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: none needed\" >&5\n$as_echo \"none needed\" >&6; } ;;\n  xno)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: unsupported\" >&5\n$as_echo \"unsupported\" >&6; } ;;\n  *)\n    CC=\"$CC $ac_cv_prog_cc_c89\"\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89\" >&5\n$as_echo \"$ac_cv_prog_cc_c89\" >&6; } ;;\nesac\nif test \"x$ac_cv_prog_cc_c89\" != xno; then :\n\nfi\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\nDEPDIR=\"${am__leading_dot}deps\"\n\nac_config_commands=\"$ac_config_commands depfiles\"\n\n\nam_make=${MAKE-make}\ncat > confinc << 'END'\nam__doit:\n\t@echo this is the am__doit target\n.PHONY: am__doit\nEND\n# If we don't find an include directive, just comment out the code.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make\" >&5\n$as_echo_n \"checking for style of include used by $am_make... \" >&6; }\nam__include=\"#\"\nam__quote=\n_am_result=none\n# First try GNU make style include.\necho \"include confinc\" > confmf\n# Ignore all kinds of additional output from `make'.\ncase `$am_make -s -f confmf 2> /dev/null` in #(\n*the\\ am__doit\\ target*)\n  am__include=include\n  am__quote=\n  _am_result=GNU\n  ;;\nesac\n# Now try BSD make style include.\nif test \"$am__include\" = \"#\"; then\n   echo '.include \"confinc\"' > confmf\n   case `$am_make -s -f confmf 2> /dev/null` in #(\n   *the\\ am__doit\\ target*)\n     am__include=.include\n     am__quote=\"\\\"\"\n     _am_result=BSD\n     ;;\n   esac\nfi\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $_am_result\" >&5\n$as_echo \"$_am_result\" >&6; }\nrm -f confinc confmf\n\n# Check whether --enable-dependency-tracking was given.\nif test \"${enable_dependency_tracking+set}\" = set; then :\n  enableval=$enable_dependency_tracking;\nfi\n\nif test \"x$enable_dependency_tracking\" != xno; then\n  am_depcomp=\"$ac_aux_dir/depcomp\"\n  AMDEPBACKSLASH='\\'\nfi\n if test \"x$enable_dependency_tracking\" != xno; then\n  AMDEP_TRUE=\n  AMDEP_FALSE='#'\nelse\n  AMDEP_TRUE='#'\n  AMDEP_FALSE=\nfi\n\n\n\ndepcc=\"$CC\"   am_compiler_list=\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc\" >&5\n$as_echo_n \"checking dependency style of $depcc... \" >&6; }\nif test \"${am_cv_CC_dependencies_compiler_type+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$AMDEP_TRUE\" && test -f \"$am_depcomp\"; then\n  # We make a subdir and do the tests there.  Otherwise we can end up\n  # making bogus files that we don't know about and never remove.  For\n  # instance it was reported that on HP-UX the gcc test will end up\n  # making a dummy file named `D' -- because `-MD' means `put the output\n  # in D'.\n  mkdir conftest.dir\n  # Copy depcomp to subdir because otherwise we won't find it if we're\n  # using a relative directory.\n  cp \"$am_depcomp\" conftest.dir\n  cd conftest.dir\n  # We will build objects and dependencies in a subdirectory because\n  # it helps to detect inapplicable dependency modes.  For instance\n  # both Tru64's cc and ICC support -MD to output dependencies as a\n  # side effect of compilation, but ICC will put the dependencies in\n  # the current directory while Tru64 will put them in the object\n  # directory.\n  mkdir sub\n\n  am_cv_CC_dependencies_compiler_type=none\n  if test \"$am_compiler_list\" = \"\"; then\n     am_compiler_list=`sed -n 's/^#*\\([a-zA-Z0-9]*\\))$/\\1/p' < ./depcomp`\n  fi\n  am__universal=false\n  case \" $depcc \" in #(\n     *\\ -arch\\ *\\ -arch\\ *) am__universal=true ;;\n     esac\n\n  for depmode in $am_compiler_list; do\n    # Setup a source with many dependencies, because some compilers\n    # like to wrap large dependency lists on column 80 (with \\), and\n    # we should not choose a depcomp mode which is confused by this.\n    #\n    # We need to recreate these files for each test, as the compiler may\n    # overwrite some of them when testing with obscure command lines.\n    # This happens at least with the AIX C compiler.\n    : > sub/conftest.c\n    for i in 1 2 3 4 5 6; do\n      echo '#include \"conftst'$i'.h\"' >> sub/conftest.c\n      # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with\n      # Solaris 8's {/usr,}/bin/sh.\n      touch sub/conftst$i.h\n    done\n    echo \"${am__include} ${am__quote}sub/conftest.Po${am__quote}\" > confmf\n\n    # We check with `-c' and `-o' for the sake of the \"dashmstdout\"\n    # mode.  It turns out that the SunPro C++ compiler does not properly\n    # handle `-M -o', and we need to detect this.  Also, some Intel\n    # versions had trouble with output in subdirs\n    am__obj=sub/conftest.${OBJEXT-o}\n    am__minus_obj=\"-o $am__obj\"\n    case $depmode in\n    gcc)\n      # This depmode causes a compiler race in universal mode.\n      test \"$am__universal\" = false || continue\n      ;;\n    nosideeffect)\n      # after this tag, mechanisms are not by side-effect, so they'll\n      # only be used when explicitly requested\n      if test \"x$enable_dependency_tracking\" = xyes; then\n\tcontinue\n      else\n\tbreak\n      fi\n      ;;\n    msvisualcpp | msvcmsys)\n      # This compiler won't grok `-c -o', but also, the minuso test has\n      # not run yet.  These depmodes are late enough in the game, and\n      # so weak that their functioning should not be impacted.\n      am__obj=conftest.${OBJEXT-o}\n      am__minus_obj=\n      ;;\n    none) break ;;\n    esac\n    if depmode=$depmode \\\n       source=sub/conftest.c object=$am__obj \\\n       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \\\n       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \\\n         >/dev/null 2>conftest.err &&\n       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&\n       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then\n      # icc doesn't choke on unknown options, it will just issue warnings\n      # or remarks (even with -Werror).  So we grep stderr for any message\n      # that says an option was ignored or not supported.\n      # When given -MP, icc 7.0 and 7.1 complain thusly:\n      #   icc: Command line warning: ignoring option '-M'; no argument required\n      # The diagnosis changed in icc 8.0:\n      #   icc: Command line remark: option '-MP' not supported\n      if (grep 'ignoring option' conftest.err ||\n          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else\n        am_cv_CC_dependencies_compiler_type=$depmode\n        break\n      fi\n    fi\n  done\n\n  cd ..\n  rm -rf conftest.dir\nelse\n  am_cv_CC_dependencies_compiler_type=none\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type\" >&5\n$as_echo \"$am_cv_CC_dependencies_compiler_type\" >&6; }\nCCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type\n\n if\n  test \"x$enable_dependency_tracking\" != xno \\\n  && test \"$am_cv_CC_dependencies_compiler_type\" = gcc3; then\n  am__fastdepCC_TRUE=\n  am__fastdepCC_FALSE='#'\nelse\n  am__fastdepCC_TRUE='#'\n  am__fastdepCC_FALSE=\nfi\n\n\ncase `pwd` in\n  *\\ * | *\\\t*)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \\`pwd\\`\" >&5\n$as_echo \"$as_me: WARNING: Libtool does not cope well with whitespace in \\`pwd\\`\" >&2;} ;;\nesac\n\n\n\nmacro_version='2.2.6b'\nmacro_revision='1.3017'\n\n\n\n\n\n\n\n\n\n\n\n\n\nltmain=\"$ac_aux_dir/ltmain.sh\"\n\n# Make sure we can run config.sub.\n$SHELL \"$ac_aux_dir/config.sub\" sun4 >/dev/null 2>&1 ||\n  as_fn_error \"cannot run $SHELL $ac_aux_dir/config.sub\" \"$LINENO\" 5\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking build system type\" >&5\n$as_echo_n \"checking build system type... \" >&6; }\nif test \"${ac_cv_build+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_build_alias=$build_alias\ntest \"x$ac_build_alias\" = x &&\n  ac_build_alias=`$SHELL \"$ac_aux_dir/config.guess\"`\ntest \"x$ac_build_alias\" = x &&\n  as_fn_error \"cannot guess build type; you must specify one\" \"$LINENO\" 5\nac_cv_build=`$SHELL \"$ac_aux_dir/config.sub\" $ac_build_alias` ||\n  as_fn_error \"$SHELL $ac_aux_dir/config.sub $ac_build_alias failed\" \"$LINENO\" 5\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_build\" >&5\n$as_echo \"$ac_cv_build\" >&6; }\ncase $ac_cv_build in\n*-*-*) ;;\n*) as_fn_error \"invalid value of canonical build\" \"$LINENO\" 5;;\nesac\nbuild=$ac_cv_build\nac_save_IFS=$IFS; IFS='-'\nset x $ac_cv_build\nshift\nbuild_cpu=$1\nbuild_vendor=$2\nshift; shift\n# Remember, the first character of IFS is used to create $*,\n# except with old shells:\nbuild_os=$*\nIFS=$ac_save_IFS\ncase $build_os in *\\ *) build_os=`echo \"$build_os\" | sed 's/ /-/g'`;; esac\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking host system type\" >&5\n$as_echo_n \"checking host system type... \" >&6; }\nif test \"${ac_cv_host+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test \"x$host_alias\" = x; then\n  ac_cv_host=$ac_cv_build\nelse\n  ac_cv_host=`$SHELL \"$ac_aux_dir/config.sub\" $host_alias` ||\n    as_fn_error \"$SHELL $ac_aux_dir/config.sub $host_alias failed\" \"$LINENO\" 5\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_host\" >&5\n$as_echo \"$ac_cv_host\" >&6; }\ncase $ac_cv_host in\n*-*-*) ;;\n*) as_fn_error \"invalid value of canonical host\" \"$LINENO\" 5;;\nesac\nhost=$ac_cv_host\nac_save_IFS=$IFS; IFS='-'\nset x $ac_cv_host\nshift\nhost_cpu=$1\nhost_vendor=$2\nshift; shift\n# Remember, the first character of IFS is used to create $*,\n# except with old shells:\nhost_os=$*\nIFS=$ac_save_IFS\ncase $host_os in *\\ *) host_os=`echo \"$host_os\" | sed 's/ /-/g'`;; esac\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output\" >&5\n$as_echo_n \"checking for a sed that does not truncate output... \" >&6; }\nif test \"${ac_cv_path_SED+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/\n     for ac_i in 1 2 3 4 5 6 7; do\n       ac_script=\"$ac_script$as_nl$ac_script\"\n     done\n     echo \"$ac_script\" 2>/dev/null | sed 99q >conftest.sed\n     { ac_script=; unset ac_script;}\n     if test -z \"$SED\"; then\n  ac_path_SED_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in sed gsed; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_SED=\"$as_dir/$ac_prog$ac_exec_ext\"\n      { test -f \"$ac_path_SED\" && $as_test_x \"$ac_path_SED\"; } || continue\n# Check for GNU ac_path_SED and select it if it is found.\n  # Check for GNU $ac_path_SED\ncase `\"$ac_path_SED\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_SED=\"$ac_path_SED\" ac_path_SED_found=:;;\n*)\n  ac_count=0\n  $as_echo_n 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    $as_echo '' >> \"conftest.nl\"\n    \"$ac_path_SED\" -f conftest.sed < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    as_fn_arith $ac_count + 1 && ac_count=$as_val\n    if test $ac_count -gt ${ac_path_SED_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_SED=\"$ac_path_SED\"\n      ac_path_SED_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_SED_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_SED\"; then\n    as_fn_error \"no acceptable sed could be found in \\$PATH\" \"$LINENO\" 5\n  fi\nelse\n  ac_cv_path_SED=$SED\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED\" >&5\n$as_echo \"$ac_cv_path_SED\" >&6; }\n SED=\"$ac_cv_path_SED\"\n  rm -f conftest.sed\n\ntest -z \"$SED\" && SED=sed\nXsed=\"$SED -e 1s/^X//\"\n\n\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e\" >&5\n$as_echo_n \"checking for grep that handles long lines and -e... \" >&6; }\nif test \"${ac_cv_path_GREP+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$GREP\"; then\n  ac_path_GREP_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in grep ggrep; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_GREP=\"$as_dir/$ac_prog$ac_exec_ext\"\n      { test -f \"$ac_path_GREP\" && $as_test_x \"$ac_path_GREP\"; } || continue\n# Check for GNU ac_path_GREP and select it if it is found.\n  # Check for GNU $ac_path_GREP\ncase `\"$ac_path_GREP\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_GREP=\"$ac_path_GREP\" ac_path_GREP_found=:;;\n*)\n  ac_count=0\n  $as_echo_n 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    $as_echo 'GREP' >> \"conftest.nl\"\n    \"$ac_path_GREP\" -e 'GREP$' -e '-(cannot match)-' < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    as_fn_arith $ac_count + 1 && ac_count=$as_val\n    if test $ac_count -gt ${ac_path_GREP_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_GREP=\"$ac_path_GREP\"\n      ac_path_GREP_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_GREP_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_GREP\"; then\n    as_fn_error \"no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin\" \"$LINENO\" 5\n  fi\nelse\n  ac_cv_path_GREP=$GREP\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP\" >&5\n$as_echo \"$ac_cv_path_GREP\" >&6; }\n GREP=\"$ac_cv_path_GREP\"\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for egrep\" >&5\n$as_echo_n \"checking for egrep... \" >&6; }\nif test \"${ac_cv_path_EGREP+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1\n   then ac_cv_path_EGREP=\"$GREP -E\"\n   else\n     if test -z \"$EGREP\"; then\n  ac_path_EGREP_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in egrep; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_EGREP=\"$as_dir/$ac_prog$ac_exec_ext\"\n      { test -f \"$ac_path_EGREP\" && $as_test_x \"$ac_path_EGREP\"; } || continue\n# Check for GNU ac_path_EGREP and select it if it is found.\n  # Check for GNU $ac_path_EGREP\ncase `\"$ac_path_EGREP\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_EGREP=\"$ac_path_EGREP\" ac_path_EGREP_found=:;;\n*)\n  ac_count=0\n  $as_echo_n 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    $as_echo 'EGREP' >> \"conftest.nl\"\n    \"$ac_path_EGREP\" 'EGREP$' < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    as_fn_arith $ac_count + 1 && ac_count=$as_val\n    if test $ac_count -gt ${ac_path_EGREP_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_EGREP=\"$ac_path_EGREP\"\n      ac_path_EGREP_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_EGREP_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_EGREP\"; then\n    as_fn_error \"no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin\" \"$LINENO\" 5\n  fi\nelse\n  ac_cv_path_EGREP=$EGREP\nfi\n\n   fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP\" >&5\n$as_echo \"$ac_cv_path_EGREP\" >&6; }\n EGREP=\"$ac_cv_path_EGREP\"\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for fgrep\" >&5\n$as_echo_n \"checking for fgrep... \" >&6; }\nif test \"${ac_cv_path_FGREP+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1\n   then ac_cv_path_FGREP=\"$GREP -F\"\n   else\n     if test -z \"$FGREP\"; then\n  ac_path_FGREP_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in fgrep; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_FGREP=\"$as_dir/$ac_prog$ac_exec_ext\"\n      { test -f \"$ac_path_FGREP\" && $as_test_x \"$ac_path_FGREP\"; } || continue\n# Check for GNU ac_path_FGREP and select it if it is found.\n  # Check for GNU $ac_path_FGREP\ncase `\"$ac_path_FGREP\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_FGREP=\"$ac_path_FGREP\" ac_path_FGREP_found=:;;\n*)\n  ac_count=0\n  $as_echo_n 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    $as_echo 'FGREP' >> \"conftest.nl\"\n    \"$ac_path_FGREP\" FGREP < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    as_fn_arith $ac_count + 1 && ac_count=$as_val\n    if test $ac_count -gt ${ac_path_FGREP_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_FGREP=\"$ac_path_FGREP\"\n      ac_path_FGREP_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_FGREP_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_FGREP\"; then\n    as_fn_error \"no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin\" \"$LINENO\" 5\n  fi\nelse\n  ac_cv_path_FGREP=$FGREP\nfi\n\n   fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP\" >&5\n$as_echo \"$ac_cv_path_FGREP\" >&6; }\n FGREP=\"$ac_cv_path_FGREP\"\n\n\ntest -z \"$GREP\" && GREP=grep\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n# Check whether --with-gnu-ld was given.\nif test \"${with_gnu_ld+set}\" = set; then :\n  withval=$with_gnu_ld; test \"$withval\" = no || with_gnu_ld=yes\nelse\n  with_gnu_ld=no\nfi\n\nac_prog=ld\nif test \"$GCC\" = yes; then\n  # Check if gcc -print-prog-name=ld gives a path.\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for ld used by $CC\" >&5\n$as_echo_n \"checking for ld used by $CC... \" >&6; }\n  case $host in\n  *-*-mingw*)\n    # gcc leaves a trailing carriage return which upsets mingw\n    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\\015'` ;;\n  *)\n    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;\n  esac\n  case $ac_prog in\n    # Accept absolute paths.\n    [\\\\/]* | ?:[\\\\/]*)\n      re_direlt='/[^/][^/]*/\\.\\./'\n      # Canonicalize the pathname of ld\n      ac_prog=`$ECHO \"$ac_prog\"| $SED 's%\\\\\\\\%/%g'`\n      while $ECHO \"$ac_prog\" | $GREP \"$re_direlt\" > /dev/null 2>&1; do\n\tac_prog=`$ECHO $ac_prog| $SED \"s%$re_direlt%/%\"`\n      done\n      test -z \"$LD\" && LD=\"$ac_prog\"\n      ;;\n  \"\")\n    # If it fails, then pretend we aren't using GCC.\n    ac_prog=ld\n    ;;\n  *)\n    # If it is relative, then search for the first ld in PATH.\n    with_gnu_ld=unknown\n    ;;\n  esac\nelif test \"$with_gnu_ld\" = yes; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for GNU ld\" >&5\n$as_echo_n \"checking for GNU ld... \" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for non-GNU ld\" >&5\n$as_echo_n \"checking for non-GNU ld... \" >&6; }\nfi\nif test \"${lt_cv_path_LD+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$LD\"; then\n  lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n  for ac_dir in $PATH; do\n    IFS=\"$lt_save_ifs\"\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f \"$ac_dir/$ac_prog\" || test -f \"$ac_dir/$ac_prog$ac_exeext\"; then\n      lt_cv_path_LD=\"$ac_dir/$ac_prog\"\n      # Check to see if the program is GNU ld.  I'd rather use --version,\n      # but apparently some variants of GNU ld only accept -v.\n      # Break only if it was the GNU/non-GNU ld that we prefer.\n      case `\"$lt_cv_path_LD\" -v 2>&1 </dev/null` in\n      *GNU* | *'with BFD'*)\n\ttest \"$with_gnu_ld\" != no && break\n\t;;\n      *)\n\ttest \"$with_gnu_ld\" != yes && break\n\t;;\n      esac\n    fi\n  done\n  IFS=\"$lt_save_ifs\"\nelse\n  lt_cv_path_LD=\"$LD\" # Let the user override the test with a path.\nfi\nfi\n\nLD=\"$lt_cv_path_LD\"\nif test -n \"$LD\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $LD\" >&5\n$as_echo \"$LD\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\ntest -z \"$LD\" && as_fn_error \"no acceptable ld found in \\$PATH\" \"$LINENO\" 5\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld\" >&5\n$as_echo_n \"checking if the linker ($LD) is GNU ld... \" >&6; }\nif test \"${lt_cv_prog_gnu_ld+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  # I'd rather use --version here, but apparently some GNU lds only accept -v.\ncase `$LD -v 2>&1 </dev/null` in\n*GNU* | *'with BFD'*)\n  lt_cv_prog_gnu_ld=yes\n  ;;\n*)\n  lt_cv_prog_gnu_ld=no\n  ;;\nesac\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld\" >&5\n$as_echo \"$lt_cv_prog_gnu_ld\" >&6; }\nwith_gnu_ld=$lt_cv_prog_gnu_ld\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)\" >&5\n$as_echo_n \"checking for BSD- or MS-compatible name lister (nm)... \" >&6; }\nif test \"${lt_cv_path_NM+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$NM\"; then\n  # Let the user override the test.\n  lt_cv_path_NM=\"$NM\"\nelse\n  lt_nm_to_check=\"${ac_tool_prefix}nm\"\n  if test -n \"$ac_tool_prefix\" && test \"$build\" = \"$host\"; then\n    lt_nm_to_check=\"$lt_nm_to_check nm\"\n  fi\n  for lt_tmp_nm in $lt_nm_to_check; do\n    lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do\n      IFS=\"$lt_save_ifs\"\n      test -z \"$ac_dir\" && ac_dir=.\n      tmp_nm=\"$ac_dir/$lt_tmp_nm\"\n      if test -f \"$tmp_nm\" || test -f \"$tmp_nm$ac_exeext\" ; then\n\t# Check to see if the nm accepts a BSD-compat flag.\n\t# Adding the `sed 1q' prevents false positives on HP-UX, which says:\n\t#   nm: unknown option \"B\" ignored\n\t# Tru64's nm complains that /dev/null is an invalid object file\n\tcase `\"$tmp_nm\" -B /dev/null 2>&1 | sed '1q'` in\n\t*/dev/null* | *'Invalid file or object type'*)\n\t  lt_cv_path_NM=\"$tmp_nm -B\"\n\t  break\n\t  ;;\n\t*)\n\t  case `\"$tmp_nm\" -p /dev/null 2>&1 | sed '1q'` in\n\t  */dev/null*)\n\t    lt_cv_path_NM=\"$tmp_nm -p\"\n\t    break\n\t    ;;\n\t  *)\n\t    lt_cv_path_NM=${lt_cv_path_NM=\"$tmp_nm\"} # keep the first match, but\n\t    continue # so that we can try to find one that supports BSD flags\n\t    ;;\n\t  esac\n\t  ;;\n\tesac\n      fi\n    done\n    IFS=\"$lt_save_ifs\"\n  done\n  : ${lt_cv_path_NM=no}\nfi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM\" >&5\n$as_echo \"$lt_cv_path_NM\" >&6; }\nif test \"$lt_cv_path_NM\" != \"no\"; then\n  NM=\"$lt_cv_path_NM\"\nelse\n  # Didn't find any BSD compatible name lister, look for dumpbin.\n  if test -n \"$ac_tool_prefix\"; then\n  for ac_prog in \"dumpbin -symbols\" \"link -dump -symbols\"\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_DUMPBIN+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$DUMPBIN\"; then\n  ac_cv_prog_DUMPBIN=\"$DUMPBIN\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_DUMPBIN=\"$ac_tool_prefix$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nDUMPBIN=$ac_cv_prog_DUMPBIN\nif test -n \"$DUMPBIN\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $DUMPBIN\" >&5\n$as_echo \"$DUMPBIN\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n    test -n \"$DUMPBIN\" && break\n  done\nfi\nif test -z \"$DUMPBIN\"; then\n  ac_ct_DUMPBIN=$DUMPBIN\n  for ac_prog in \"dumpbin -symbols\" \"link -dump -symbols\"\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_ac_ct_DUMPBIN+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_DUMPBIN\"; then\n  ac_cv_prog_ac_ct_DUMPBIN=\"$ac_ct_DUMPBIN\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_DUMPBIN=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN\nif test -n \"$ac_ct_DUMPBIN\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN\" >&5\n$as_echo \"$ac_ct_DUMPBIN\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$ac_ct_DUMPBIN\" && break\ndone\n\n  if test \"x$ac_ct_DUMPBIN\" = x; then\n    DUMPBIN=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    DUMPBIN=$ac_ct_DUMPBIN\n  fi\nfi\n\n\n  if test \"$DUMPBIN\" != \":\"; then\n    NM=\"$DUMPBIN\"\n  fi\nfi\ntest -z \"$NM\" && NM=nm\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface\" >&5\n$as_echo_n \"checking the name lister ($NM) interface... \" >&6; }\nif test \"${lt_cv_nm_interface+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_nm_interface=\"BSD nm\"\n  echo \"int some_variable = 0;\" > conftest.$ac_ext\n  (eval echo \"\\\"\\$as_me:4692: $ac_compile\\\"\" >&5)\n  (eval \"$ac_compile\" 2>conftest.err)\n  cat conftest.err >&5\n  (eval echo \"\\\"\\$as_me:4695: $NM \\\\\\\"conftest.$ac_objext\\\\\\\"\\\"\" >&5)\n  (eval \"$NM \\\"conftest.$ac_objext\\\"\" 2>conftest.err > conftest.out)\n  cat conftest.err >&5\n  (eval echo \"\\\"\\$as_me:4698: output\\\"\" >&5)\n  cat conftest.out >&5\n  if $GREP 'External.*some_variable' conftest.out > /dev/null; then\n    lt_cv_nm_interface=\"MS dumpbin\"\n  fi\n  rm -f conftest*\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface\" >&5\n$as_echo \"$lt_cv_nm_interface\" >&6; }\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether ln -s works\" >&5\n$as_echo_n \"checking whether ln -s works... \" >&6; }\nLN_S=$as_ln_s\nif test \"$LN_S\" = \"ln -s\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no, using $LN_S\" >&5\n$as_echo \"no, using $LN_S\" >&6; }\nfi\n\n# find the maximum length of command line arguments\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments\" >&5\n$as_echo_n \"checking the maximum length of command line arguments... \" >&6; }\nif test \"${lt_cv_sys_max_cmd_len+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n    i=0\n  teststring=\"ABCD\"\n\n  case $build_os in\n  msdosdjgpp*)\n    # On DJGPP, this test can blow up pretty badly due to problems in libc\n    # (any single argument exceeding 2000 bytes causes a buffer overrun\n    # during glob expansion).  Even if it were fixed, the result of this\n    # check would be larger than it should be.\n    lt_cv_sys_max_cmd_len=12288;    # 12K is about right\n    ;;\n\n  gnu*)\n    # Under GNU Hurd, this test is not required because there is\n    # no limit to the length of command line arguments.\n    # Libtool will interpret -1 as no limit whatsoever\n    lt_cv_sys_max_cmd_len=-1;\n    ;;\n\n  cygwin* | mingw* | cegcc*)\n    # On Win9x/ME, this test blows up -- it succeeds, but takes\n    # about 5 minutes as the teststring grows exponentially.\n    # Worse, since 9x/ME are not pre-emptively multitasking,\n    # you end up with a \"frozen\" computer, even though with patience\n    # the test eventually succeeds (with a max line length of 256k).\n    # Instead, let's just punt: use the minimum linelength reported by\n    # all of the supported platforms: 8192 (on NT/2K/XP).\n    lt_cv_sys_max_cmd_len=8192;\n    ;;\n\n  amigaos*)\n    # On AmigaOS with pdksh, this test takes hours, literally.\n    # So we just punt and use a minimum line length of 8192.\n    lt_cv_sys_max_cmd_len=8192;\n    ;;\n\n  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)\n    # This has been around since 386BSD, at least.  Likely further.\n    if test -x /sbin/sysctl; then\n      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`\n    elif test -x /usr/sbin/sysctl; then\n      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`\n    else\n      lt_cv_sys_max_cmd_len=65536\t# usable default for all BSDs\n    fi\n    # And add a safety zone\n    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 4`\n    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\* 3`\n    ;;\n\n  interix*)\n    # We know the value 262144 and hardcode it with a safety zone (like BSD)\n    lt_cv_sys_max_cmd_len=196608\n    ;;\n\n  osf*)\n    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure\n    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not\n    # nice to cause kernel panics so lets avoid the loop below.\n    # First set a reasonable default.\n    lt_cv_sys_max_cmd_len=16384\n    #\n    if test -x /sbin/sysconfig; then\n      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in\n        *1*) lt_cv_sys_max_cmd_len=-1 ;;\n      esac\n    fi\n    ;;\n  sco3.2v5*)\n    lt_cv_sys_max_cmd_len=102400\n    ;;\n  sysv5* | sco5v6* | sysv4.2uw2*)\n    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`\n    if test -n \"$kargmax\"; then\n      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[\t ]//'`\n    else\n      lt_cv_sys_max_cmd_len=32768\n    fi\n    ;;\n  *)\n    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`\n    if test -n \"$lt_cv_sys_max_cmd_len\"; then\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 4`\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\* 3`\n    else\n      # Make teststring a little bigger before we do anything with it.\n      # a 1K string should be a reasonable start.\n      for i in 1 2 3 4 5 6 7 8 ; do\n        teststring=$teststring$teststring\n      done\n      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}\n      # If test is not a shell built-in, we'll probably end up computing a\n      # maximum length that is only half of the actual maximum length, but\n      # we can't tell.\n      while { test \"X\"`$SHELL $0 --fallback-echo \"X$teststring$teststring\" 2>/dev/null` \\\n\t         = \"XX$teststring$teststring\"; } >/dev/null 2>&1 &&\n\t      test $i != 17 # 1/2 MB should be enough\n      do\n        i=`expr $i + 1`\n        teststring=$teststring$teststring\n      done\n      # Only check the string length outside the loop.\n      lt_cv_sys_max_cmd_len=`expr \"X$teststring\" : \".*\" 2>&1`\n      teststring=\n      # Add a significant safety factor because C++ compilers can tack on\n      # massive amounts of additional arguments before passing them to the\n      # linker.  It appears as though 1/2 is a usable value.\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 2`\n    fi\n    ;;\n  esac\n\nfi\n\nif test -n $lt_cv_sys_max_cmd_len ; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len\" >&5\n$as_echo \"$lt_cv_sys_max_cmd_len\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: none\" >&5\n$as_echo \"none\" >&6; }\nfi\nmax_cmd_len=$lt_cv_sys_max_cmd_len\n\n\n\n\n\n\n: ${CP=\"cp -f\"}\n: ${MV=\"mv -f\"}\n: ${RM=\"rm -f\"}\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs\" >&5\n$as_echo_n \"checking whether the shell understands some XSI constructs... \" >&6; }\n# Try some XSI features\nxsi_shell=no\n( _lt_dummy=\"a/b/c\"\n  test \"${_lt_dummy##*/},${_lt_dummy%/*},\"${_lt_dummy%\"$_lt_dummy\"}, \\\n      = c,a/b,, \\\n    && eval 'test $(( 1 + 1 )) -eq 2 \\\n    && test \"${#_lt_dummy}\" -eq 5' ) >/dev/null 2>&1 \\\n  && xsi_shell=yes\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $xsi_shell\" >&5\n$as_echo \"$xsi_shell\" >&6; }\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the shell understands \\\"+=\\\"\" >&5\n$as_echo_n \"checking whether the shell understands \\\"+=\\\"... \" >&6; }\nlt_shell_append=no\n( foo=bar; set foo baz; eval \"$1+=\\$2\" && test \"$foo\" = barbaz ) \\\n    >/dev/null 2>&1 \\\n  && lt_shell_append=yes\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_shell_append\" >&5\n$as_echo \"$lt_shell_append\" >&6; }\n\n\nif ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then\n  lt_unset=unset\nelse\n  lt_unset=false\nfi\n\n\n\n\n\n# test EBCDIC or ASCII\ncase `echo X|tr X '\\101'` in\n A) # ASCII based system\n    # \\n is not interpreted correctly by Solaris 8 /usr/ucb/tr\n  lt_SP2NL='tr \\040 \\012'\n  lt_NL2SP='tr \\015\\012 \\040\\040'\n  ;;\n *) # EBCDIC based system\n  lt_SP2NL='tr \\100 \\n'\n  lt_NL2SP='tr \\r\\n \\100\\100'\n  ;;\nesac\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files\" >&5\n$as_echo_n \"checking for $LD option to reload object files... \" >&6; }\nif test \"${lt_cv_ld_reload_flag+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_ld_reload_flag='-r'\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag\" >&5\n$as_echo \"$lt_cv_ld_reload_flag\" >&6; }\nreload_flag=$lt_cv_ld_reload_flag\ncase $reload_flag in\n\"\" | \" \"*) ;;\n*) reload_flag=\" $reload_flag\" ;;\nesac\nreload_cmds='$LD$reload_flag -o $output$reload_objs'\ncase $host_os in\n  darwin*)\n    if test \"$GCC\" = yes; then\n      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'\n    else\n      reload_cmds='$LD$reload_flag -o $output$reload_objs'\n    fi\n    ;;\nesac\n\n\n\n\n\n\n\n\n\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}objdump\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}objdump; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_OBJDUMP+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$OBJDUMP\"; then\n  ac_cv_prog_OBJDUMP=\"$OBJDUMP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_OBJDUMP=\"${ac_tool_prefix}objdump\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nOBJDUMP=$ac_cv_prog_OBJDUMP\nif test -n \"$OBJDUMP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $OBJDUMP\" >&5\n$as_echo \"$OBJDUMP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_OBJDUMP\"; then\n  ac_ct_OBJDUMP=$OBJDUMP\n  # Extract the first word of \"objdump\", so it can be a program name with args.\nset dummy objdump; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_ac_ct_OBJDUMP+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_OBJDUMP\"; then\n  ac_cv_prog_ac_ct_OBJDUMP=\"$ac_ct_OBJDUMP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_OBJDUMP=\"objdump\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP\nif test -n \"$ac_ct_OBJDUMP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP\" >&5\n$as_echo \"$ac_ct_OBJDUMP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_OBJDUMP\" = x; then\n    OBJDUMP=\"false\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    OBJDUMP=$ac_ct_OBJDUMP\n  fi\nelse\n  OBJDUMP=\"$ac_cv_prog_OBJDUMP\"\nfi\n\ntest -z \"$OBJDUMP\" && OBJDUMP=objdump\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries\" >&5\n$as_echo_n \"checking how to recognize dependent libraries... \" >&6; }\nif test \"${lt_cv_deplibs_check_method+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_file_magic_cmd='$MAGIC_CMD'\nlt_cv_file_magic_test_file=\nlt_cv_deplibs_check_method='unknown'\n# Need to set the preceding variable on all platforms that support\n# interlibrary dependencies.\n# 'none' -- dependencies not supported.\n# `unknown' -- same as none, but documents that we really don't know.\n# 'pass_all' -- all dependencies passed with no checks.\n# 'test_compile' -- check by making test program.\n# 'file_magic [[regex]]' -- check by looking for files in library path\n# which responds to the $file_magic_cmd with a given extended regex.\n# If you have `file' or equivalent on your system and you're not sure\n# whether `pass_all' will *always* work, you probably want this one.\n\ncase $host_os in\naix[4-9]*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nbeos*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nbsdi[45]*)\n  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'\n  lt_cv_file_magic_cmd='/usr/bin/file -L'\n  lt_cv_file_magic_test_file=/shlib/libc.so\n  ;;\n\ncygwin*)\n  # func_win32_libid is a shell function defined in ltmain.sh\n  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'\n  lt_cv_file_magic_cmd='func_win32_libid'\n  ;;\n\nmingw* | pw32*)\n  # Base MSYS/MinGW do not provide the 'file' command needed by\n  # func_win32_libid shell function, so use a weaker test based on 'objdump',\n  # unless we find 'file', for example because we are cross-compiling.\n  if ( file / ) >/dev/null 2>&1; then\n    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'\n    lt_cv_file_magic_cmd='func_win32_libid'\n  else\n    lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'\n    lt_cv_file_magic_cmd='$OBJDUMP -f'\n  fi\n  ;;\n\ncegcc)\n  # use the weaker test based on 'objdump'. See mingw*.\n  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'\n  lt_cv_file_magic_cmd='$OBJDUMP -f'\n  ;;\n\ndarwin* | rhapsody*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nfreebsd* | dragonfly*)\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then\n    case $host_cpu in\n    i*86 )\n      # Not sure whether the presence of OpenBSD here was a mistake.\n      # Let's accept both of them until this is cleared up.\n      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'\n      lt_cv_file_magic_cmd=/usr/bin/file\n      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`\n      ;;\n    esac\n  else\n    lt_cv_deplibs_check_method=pass_all\n  fi\n  ;;\n\ngnu*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nhpux10.20* | hpux11*)\n  lt_cv_file_magic_cmd=/usr/bin/file\n  case $host_cpu in\n  ia64*)\n    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'\n    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so\n    ;;\n  hppa*64*)\n    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]'\n    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl\n    ;;\n  *)\n    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9].[0-9]) shared library'\n    lt_cv_file_magic_test_file=/usr/lib/libc.sl\n    ;;\n  esac\n  ;;\n\ninterix[3-9]*)\n  # PIC code is broken on Interix 3.x, that's why |\\.a not |_pic\\.a here\n  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\\.so|\\.a)$'\n  ;;\n\nirix5* | irix6* | nonstopux*)\n  case $LD in\n  *-32|*\"-32 \") libmagic=32-bit;;\n  *-n32|*\"-n32 \") libmagic=N32;;\n  *-64|*\"-64 \") libmagic=64-bit;;\n  *) libmagic=never-match;;\n  esac\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\n# This must be Linux ELF.\nlinux* | k*bsd*-gnu | kopensolaris*-gnu)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nnetbsd* | netbsdelf*-gnu)\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then\n    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\\.so\\.[0-9]+\\.[0-9]+|_pic\\.a)$'\n  else\n    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\\.so|_pic\\.a)$'\n  fi\n  ;;\n\nnewos6*)\n  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'\n  lt_cv_file_magic_cmd=/usr/bin/file\n  lt_cv_file_magic_test_file=/usr/lib/libnls.so\n  ;;\n\n*nto* | *qnx*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nopenbsd*)\n  if test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\\.so\\.[0-9]+\\.[0-9]+|\\.so|_pic\\.a)$'\n  else\n    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\\.so\\.[0-9]+\\.[0-9]+|_pic\\.a)$'\n  fi\n  ;;\n\nosf3* | osf4* | osf5*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nrdos*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsolaris*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsysv4 | sysv4.3*)\n  case $host_vendor in\n  motorola)\n    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'\n    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`\n    ;;\n  ncr)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  sequent)\n    lt_cv_file_magic_cmd='/bin/file'\n    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'\n    ;;\n  sni)\n    lt_cv_file_magic_cmd='/bin/file'\n    lt_cv_deplibs_check_method=\"file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib\"\n    lt_cv_file_magic_test_file=/lib/libc.so\n    ;;\n  siemens)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  pc)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  esac\n  ;;\n\ntpf*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\nesac\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method\" >&5\n$as_echo \"$lt_cv_deplibs_check_method\" >&6; }\nfile_magic_cmd=$lt_cv_file_magic_cmd\ndeplibs_check_method=$lt_cv_deplibs_check_method\ntest -z \"$deplibs_check_method\" && deplibs_check_method=unknown\n\n\n\n\n\n\n\n\n\n\n\n\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}ar\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}ar; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_AR+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$AR\"; then\n  ac_cv_prog_AR=\"$AR\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_AR=\"${ac_tool_prefix}ar\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nAR=$ac_cv_prog_AR\nif test -n \"$AR\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $AR\" >&5\n$as_echo \"$AR\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_AR\"; then\n  ac_ct_AR=$AR\n  # Extract the first word of \"ar\", so it can be a program name with args.\nset dummy ar; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_ac_ct_AR+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_AR\"; then\n  ac_cv_prog_ac_ct_AR=\"$ac_ct_AR\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_AR=\"ar\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_AR=$ac_cv_prog_ac_ct_AR\nif test -n \"$ac_ct_AR\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR\" >&5\n$as_echo \"$ac_ct_AR\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_AR\" = x; then\n    AR=\"false\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    AR=$ac_ct_AR\n  fi\nelse\n  AR=\"$ac_cv_prog_AR\"\nfi\n\ntest -z \"$AR\" && AR=ar\ntest -z \"$AR_FLAGS\" && AR_FLAGS=cru\n\n\n\n\n\n\n\n\n\n\n\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}strip\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}strip; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_STRIP+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$STRIP\"; then\n  ac_cv_prog_STRIP=\"$STRIP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_STRIP=\"${ac_tool_prefix}strip\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nSTRIP=$ac_cv_prog_STRIP\nif test -n \"$STRIP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $STRIP\" >&5\n$as_echo \"$STRIP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_STRIP\"; then\n  ac_ct_STRIP=$STRIP\n  # Extract the first word of \"strip\", so it can be a program name with args.\nset dummy strip; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_ac_ct_STRIP+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_STRIP\"; then\n  ac_cv_prog_ac_ct_STRIP=\"$ac_ct_STRIP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_STRIP=\"strip\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP\nif test -n \"$ac_ct_STRIP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP\" >&5\n$as_echo \"$ac_ct_STRIP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_STRIP\" = x; then\n    STRIP=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    STRIP=$ac_ct_STRIP\n  fi\nelse\n  STRIP=\"$ac_cv_prog_STRIP\"\nfi\n\ntest -z \"$STRIP\" && STRIP=:\n\n\n\n\n\n\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}ranlib\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}ranlib; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_RANLIB+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$RANLIB\"; then\n  ac_cv_prog_RANLIB=\"$RANLIB\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_RANLIB=\"${ac_tool_prefix}ranlib\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nRANLIB=$ac_cv_prog_RANLIB\nif test -n \"$RANLIB\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $RANLIB\" >&5\n$as_echo \"$RANLIB\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_RANLIB\"; then\n  ac_ct_RANLIB=$RANLIB\n  # Extract the first word of \"ranlib\", so it can be a program name with args.\nset dummy ranlib; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_ac_ct_RANLIB+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_RANLIB\"; then\n  ac_cv_prog_ac_ct_RANLIB=\"$ac_ct_RANLIB\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_RANLIB=\"ranlib\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB\nif test -n \"$ac_ct_RANLIB\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB\" >&5\n$as_echo \"$ac_ct_RANLIB\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_RANLIB\" = x; then\n    RANLIB=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    RANLIB=$ac_ct_RANLIB\n  fi\nelse\n  RANLIB=\"$ac_cv_prog_RANLIB\"\nfi\n\ntest -z \"$RANLIB\" && RANLIB=:\n\n\n\n\n\n\n# Determine commands to create old-style static archives.\nold_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'\nold_postinstall_cmds='chmod 644 $oldlib'\nold_postuninstall_cmds=\n\nif test -n \"$RANLIB\"; then\n  case $host_os in\n  openbsd*)\n    old_postinstall_cmds=\"$old_postinstall_cmds~\\$RANLIB -t \\$oldlib\"\n    ;;\n  *)\n    old_postinstall_cmds=\"$old_postinstall_cmds~\\$RANLIB \\$oldlib\"\n    ;;\n  esac\n  old_archive_cmds=\"$old_archive_cmds~\\$RANLIB \\$oldlib\"\nfi\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n# If no C compiler was specified, use CC.\nLTCC=${LTCC-\"$CC\"}\n\n# If no C compiler flags were specified, use CFLAGS.\nLTCFLAGS=${LTCFLAGS-\"$CFLAGS\"}\n\n# Allow CC to be a program name with arguments.\ncompiler=$CC\n\n\n# Check for command to grab the raw symbol name followed by C symbol from nm.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object\" >&5\n$as_echo_n \"checking command to parse $NM output from $compiler object... \" >&6; }\nif test \"${lt_cv_sys_global_symbol_pipe+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n# These are sane defaults that work on at least a few old systems.\n# [They come from Ultrix.  What could be older than Ultrix?!! ;)]\n\n# Character class describing NM global symbol codes.\nsymcode='[BCDEGRST]'\n\n# Regexp to match symbols that can be accessed directly from C.\nsympat='\\([_A-Za-z][_A-Za-z0-9]*\\)'\n\n# Define system-specific variables.\ncase $host_os in\naix*)\n  symcode='[BCDT]'\n  ;;\ncygwin* | mingw* | pw32* | cegcc*)\n  symcode='[ABCDGISTW]'\n  ;;\nhpux*)\n  if test \"$host_cpu\" = ia64; then\n    symcode='[ABCDEGRST]'\n  fi\n  ;;\nirix* | nonstopux*)\n  symcode='[BCDEGRST]'\n  ;;\nosf*)\n  symcode='[BCDEGQRST]'\n  ;;\nsolaris*)\n  symcode='[BDRT]'\n  ;;\nsco3.2v5*)\n  symcode='[DT]'\n  ;;\nsysv4.2uw2*)\n  symcode='[DT]'\n  ;;\nsysv5* | sco5v6* | unixware* | OpenUNIX*)\n  symcode='[ABDT]'\n  ;;\nsysv4)\n  symcode='[DFNSTU]'\n  ;;\nesac\n\n# If we're using GNU nm, then use its standard symbol codes.\ncase `$NM -V 2>&1` in\n*GNU* | *'with BFD'*)\n  symcode='[ABCDGIRSTW]' ;;\nesac\n\n# Transform an extracted symbol line into a proper C declaration.\n# Some systems (esp. on ia64) link data and code symbols differently,\n# so use this general approach.\nlt_cv_sys_global_symbol_to_cdecl=\"sed -n -e 's/^T .* \\(.*\\)$/extern int \\1();/p' -e 's/^$symcode* .* \\(.*\\)$/extern char \\1;/p'\"\n\n# Transform an extracted symbol line into symbol name and symbol address\nlt_cv_sys_global_symbol_to_c_name_address=\"sed -n -e 's/^: \\([^ ]*\\) $/  {\\\\\\\"\\1\\\\\\\", (void *) 0},/p' -e 's/^$symcode* \\([^ ]*\\) \\([^ ]*\\)$/  {\\\"\\2\\\", (void *) \\&\\2},/p'\"\nlt_cv_sys_global_symbol_to_c_name_address_lib_prefix=\"sed -n -e 's/^: \\([^ ]*\\) $/  {\\\\\\\"\\1\\\\\\\", (void *) 0},/p' -e 's/^$symcode* \\([^ ]*\\) \\(lib[^ ]*\\)$/  {\\\"\\2\\\", (void *) \\&\\2},/p' -e 's/^$symcode* \\([^ ]*\\) \\([^ ]*\\)$/  {\\\"lib\\2\\\", (void *) \\&\\2},/p'\"\n\n# Handle CRLF in mingw tool chain\nopt_cr=\ncase $build_os in\nmingw*)\n  opt_cr=`$ECHO 'x\\{0,1\\}' | tr x '\\015'` # option cr in regexp\n  ;;\nesac\n\n# Try without a prefix underscore, then with it.\nfor ac_symprfx in \"\" \"_\"; do\n\n  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.\n  symxfrm=\"\\\\1 $ac_symprfx\\\\2 \\\\2\"\n\n  # Write the raw and C identifiers.\n  if test \"$lt_cv_nm_interface\" = \"MS dumpbin\"; then\n    # Fake it for dumpbin and say T for any non-static function\n    # and D for any global variable.\n    # Also find C++ and __fastcall symbols from MSVC++,\n    # which start with @ or ?.\n    lt_cv_sys_global_symbol_pipe=\"$AWK '\"\\\n\"     {last_section=section; section=\\$ 3};\"\\\n\"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};\"\\\n\"     \\$ 0!~/External *\\|/{next};\"\\\n\"     / 0+ UNDEF /{next}; / UNDEF \\([^|]\\)*()/{next};\"\\\n\"     {if(hide[section]) next};\"\\\n\"     {f=0}; \\$ 0~/\\(\\).*\\|/{f=1}; {printf f ? \\\"T \\\" : \\\"D \\\"};\"\\\n\"     {split(\\$ 0, a, /\\||\\r/); split(a[2], s)};\"\\\n\"     s[1]~/^[@?]/{print s[1], s[1]; next};\"\\\n\"     s[1]~prfx {split(s[1],t,\\\"@\\\"); print t[1], substr(t[1],length(prfx))}\"\\\n\"     ' prfx=^$ac_symprfx\"\n  else\n    lt_cv_sys_global_symbol_pipe=\"sed -n -e 's/^.*[\t ]\\($symcode$symcode*\\)[\t ][\t ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'\"\n  fi\n\n  # Check to see that the pipe works correctly.\n  pipe_works=no\n\n  rm -f conftest*\n  cat > conftest.$ac_ext <<_LT_EOF\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nchar nm_test_var;\nvoid nm_test_func(void);\nvoid nm_test_func(void){}\n#ifdef __cplusplus\n}\n#endif\nint main(){nm_test_var='a';nm_test_func();return(0);}\n_LT_EOF\n\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n    # Now try to grab the symbols.\n    nlist=conftest.nm\n    if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$NM conftest.$ac_objext \\| $lt_cv_sys_global_symbol_pipe \\> $nlist\\\"\"; } >&5\n  (eval $NM conftest.$ac_objext \\| $lt_cv_sys_global_symbol_pipe \\> $nlist) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && test -s \"$nlist\"; then\n      # Try sorting and uniquifying the output.\n      if sort \"$nlist\" | uniq > \"$nlist\"T; then\n\tmv -f \"$nlist\"T \"$nlist\"\n      else\n\trm -f \"$nlist\"T\n      fi\n\n      # Make sure that we snagged all the symbols we need.\n      if $GREP ' nm_test_var$' \"$nlist\" >/dev/null; then\n\tif $GREP ' nm_test_func$' \"$nlist\" >/dev/null; then\n\t  cat <<_LT_EOF > conftest.$ac_ext\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n_LT_EOF\n\t  # Now generate the symbol file.\n\t  eval \"$lt_cv_sys_global_symbol_to_cdecl\"' < \"$nlist\" | $GREP -v main >> conftest.$ac_ext'\n\n\t  cat <<_LT_EOF >> conftest.$ac_ext\n\n/* The mapping between symbol names and symbols.  */\nconst struct {\n  const char *name;\n  void       *address;\n}\nlt__PROGRAM__LTX_preloaded_symbols[] =\n{\n  { \"@PROGRAM@\", (void *) 0 },\n_LT_EOF\n\t  $SED \"s/^$symcode$symcode* \\(.*\\) \\(.*\\)$/  {\\\"\\2\\\", (void *) \\&\\2},/\" < \"$nlist\" | $GREP -v main >> conftest.$ac_ext\n\t  cat <<\\_LT_EOF >> conftest.$ac_ext\n  {0, (void *) 0}\n};\n\n/* This works around a problem in FreeBSD linker */\n#ifdef FREEBSD_WORKAROUND\nstatic const void *lt_preloaded_setup() {\n  return lt__PROGRAM__LTX_preloaded_symbols;\n}\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n_LT_EOF\n\t  # Now try linking the two files.\n\t  mv conftest.$ac_objext conftstm.$ac_objext\n\t  lt_save_LIBS=\"$LIBS\"\n\t  lt_save_CFLAGS=\"$CFLAGS\"\n\t  LIBS=\"conftstm.$ac_objext\"\n\t  CFLAGS=\"$CFLAGS$lt_prog_compiler_no_builtin_flag\"\n\t  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_link\\\"\"; } >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && test -s conftest${ac_exeext}; then\n\t    pipe_works=yes\n\t  fi\n\t  LIBS=\"$lt_save_LIBS\"\n\t  CFLAGS=\"$lt_save_CFLAGS\"\n\telse\n\t  echo \"cannot find nm_test_func in $nlist\" >&5\n\tfi\n      else\n\techo \"cannot find nm_test_var in $nlist\" >&5\n      fi\n    else\n      echo \"cannot run $lt_cv_sys_global_symbol_pipe\" >&5\n    fi\n  else\n    echo \"$progname: failed program was:\" >&5\n    cat conftest.$ac_ext >&5\n  fi\n  rm -rf conftest* conftst*\n\n  # Do not use the global_symbol_pipe unless it works.\n  if test \"$pipe_works\" = yes; then\n    break\n  else\n    lt_cv_sys_global_symbol_pipe=\n  fi\ndone\n\nfi\n\nif test -z \"$lt_cv_sys_global_symbol_pipe\"; then\n  lt_cv_sys_global_symbol_to_cdecl=\nfi\nif test -z \"$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: failed\" >&5\n$as_echo \"failed\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: ok\" >&5\n$as_echo \"ok\" >&6; }\nfi\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n# Check whether --enable-libtool-lock was given.\nif test \"${enable_libtool_lock+set}\" = set; then :\n  enableval=$enable_libtool_lock;\nfi\n\ntest \"x$enable_libtool_lock\" != xno && enable_libtool_lock=yes\n\n# Some flags need to be propagated to the compiler or linker for good\n# libtool support.\ncase $host in\nia64-*-hpux*)\n  # Find out which ABI we are using.\n  echo 'int i;' > conftest.$ac_ext\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n    case `/usr/bin/file conftest.$ac_objext` in\n      *ELF-32*)\n\tHPUX_IA64_MODE=\"32\"\n\t;;\n      *ELF-64*)\n\tHPUX_IA64_MODE=\"64\"\n\t;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\n*-*-irix6*)\n  # Find out which ABI we are using.\n  echo '#line 5904 \"configure\"' > conftest.$ac_ext\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n    if test \"$lt_cv_prog_gnu_ld\" = yes; then\n      case `/usr/bin/file conftest.$ac_objext` in\n\t*32-bit*)\n\t  LD=\"${LD-ld} -melf32bsmip\"\n\t  ;;\n\t*N32*)\n\t  LD=\"${LD-ld} -melf32bmipn32\"\n\t  ;;\n\t*64-bit*)\n\t  LD=\"${LD-ld} -melf64bmip\"\n\t;;\n      esac\n    else\n      case `/usr/bin/file conftest.$ac_objext` in\n\t*32-bit*)\n\t  LD=\"${LD-ld} -32\"\n\t  ;;\n\t*N32*)\n\t  LD=\"${LD-ld} -n32\"\n\t  ;;\n\t*64-bit*)\n\t  LD=\"${LD-ld} -64\"\n\t  ;;\n      esac\n    fi\n  fi\n  rm -rf conftest*\n  ;;\n\nx86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \\\ns390*-*linux*|s390*-*tpf*|sparc*-*linux*)\n  # Find out which ABI we are using.\n  echo 'int i;' > conftest.$ac_ext\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n    case `/usr/bin/file conftest.o` in\n      *32-bit*)\n\tcase $host in\n\t  x86_64-*kfreebsd*-gnu)\n\t    LD=\"${LD-ld} -m elf_i386_fbsd\"\n\t    ;;\n\t  x86_64-*linux*)\n\t    LD=\"${LD-ld} -m elf_i386\"\n\t    ;;\n\t  ppc64-*linux*|powerpc64-*linux*)\n\t    LD=\"${LD-ld} -m elf32ppclinux\"\n\t    ;;\n\t  s390x-*linux*)\n\t    LD=\"${LD-ld} -m elf_s390\"\n\t    ;;\n\t  sparc64-*linux*)\n\t    LD=\"${LD-ld} -m elf32_sparc\"\n\t    ;;\n\tesac\n\t;;\n      *64-bit*)\n\tcase $host in\n\t  x86_64-*kfreebsd*-gnu)\n\t    LD=\"${LD-ld} -m elf_x86_64_fbsd\"\n\t    ;;\n\t  x86_64-*linux*)\n\t    LD=\"${LD-ld} -m elf_x86_64\"\n\t    ;;\n\t  ppc*-*linux*|powerpc*-*linux*)\n\t    LD=\"${LD-ld} -m elf64ppc\"\n\t    ;;\n\t  s390*-*linux*|s390*-*tpf*)\n\t    LD=\"${LD-ld} -m elf64_s390\"\n\t    ;;\n\t  sparc*-*linux*)\n\t    LD=\"${LD-ld} -m elf64_sparc\"\n\t    ;;\n\tesac\n\t;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\n\n*-*-sco3.2v5*)\n  # On SCO OpenServer 5, we need -belf to get full-featured binaries.\n  SAVE_CFLAGS=\"$CFLAGS\"\n  CFLAGS=\"$CFLAGS -belf\"\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf\" >&5\n$as_echo_n \"checking whether the C compiler needs -belf... \" >&6; }\nif test \"${lt_cv_cc_needs_belf+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n     cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  lt_cv_cc_needs_belf=yes\nelse\n  lt_cv_cc_needs_belf=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n     ac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf\" >&5\n$as_echo \"$lt_cv_cc_needs_belf\" >&6; }\n  if test x\"$lt_cv_cc_needs_belf\" != x\"yes\"; then\n    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf\n    CFLAGS=\"$SAVE_CFLAGS\"\n  fi\n  ;;\nsparc*-*solaris*)\n  # Find out which ABI we are using.\n  echo 'int i;' > conftest.$ac_ext\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n    case `/usr/bin/file conftest.o` in\n    *64-bit*)\n      case $lt_cv_prog_gnu_ld in\n      yes*) LD=\"${LD-ld} -m elf64_sparc\" ;;\n      *)\n\tif ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then\n\t  LD=\"${LD-ld} -64\"\n\tfi\n\t;;\n      esac\n      ;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\nesac\n\nneed_locks=\"$enable_libtool_lock\"\n\n\n  case $host_os in\n    rhapsody* | darwin*)\n    if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}dsymutil\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}dsymutil; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_DSYMUTIL+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$DSYMUTIL\"; then\n  ac_cv_prog_DSYMUTIL=\"$DSYMUTIL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_DSYMUTIL=\"${ac_tool_prefix}dsymutil\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nDSYMUTIL=$ac_cv_prog_DSYMUTIL\nif test -n \"$DSYMUTIL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL\" >&5\n$as_echo \"$DSYMUTIL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_DSYMUTIL\"; then\n  ac_ct_DSYMUTIL=$DSYMUTIL\n  # Extract the first word of \"dsymutil\", so it can be a program name with args.\nset dummy dsymutil; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_ac_ct_DSYMUTIL+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_DSYMUTIL\"; then\n  ac_cv_prog_ac_ct_DSYMUTIL=\"$ac_ct_DSYMUTIL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_DSYMUTIL=\"dsymutil\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL\nif test -n \"$ac_ct_DSYMUTIL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL\" >&5\n$as_echo \"$ac_ct_DSYMUTIL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_DSYMUTIL\" = x; then\n    DSYMUTIL=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    DSYMUTIL=$ac_ct_DSYMUTIL\n  fi\nelse\n  DSYMUTIL=\"$ac_cv_prog_DSYMUTIL\"\nfi\n\n    if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}nmedit\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}nmedit; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_NMEDIT+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$NMEDIT\"; then\n  ac_cv_prog_NMEDIT=\"$NMEDIT\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_NMEDIT=\"${ac_tool_prefix}nmedit\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nNMEDIT=$ac_cv_prog_NMEDIT\nif test -n \"$NMEDIT\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $NMEDIT\" >&5\n$as_echo \"$NMEDIT\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_NMEDIT\"; then\n  ac_ct_NMEDIT=$NMEDIT\n  # Extract the first word of \"nmedit\", so it can be a program name with args.\nset dummy nmedit; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_ac_ct_NMEDIT+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_NMEDIT\"; then\n  ac_cv_prog_ac_ct_NMEDIT=\"$ac_ct_NMEDIT\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_NMEDIT=\"nmedit\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT\nif test -n \"$ac_ct_NMEDIT\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT\" >&5\n$as_echo \"$ac_ct_NMEDIT\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_NMEDIT\" = x; then\n    NMEDIT=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    NMEDIT=$ac_ct_NMEDIT\n  fi\nelse\n  NMEDIT=\"$ac_cv_prog_NMEDIT\"\nfi\n\n    if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}lipo\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}lipo; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_LIPO+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$LIPO\"; then\n  ac_cv_prog_LIPO=\"$LIPO\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_LIPO=\"${ac_tool_prefix}lipo\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nLIPO=$ac_cv_prog_LIPO\nif test -n \"$LIPO\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $LIPO\" >&5\n$as_echo \"$LIPO\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_LIPO\"; then\n  ac_ct_LIPO=$LIPO\n  # Extract the first word of \"lipo\", so it can be a program name with args.\nset dummy lipo; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_ac_ct_LIPO+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_LIPO\"; then\n  ac_cv_prog_ac_ct_LIPO=\"$ac_ct_LIPO\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_LIPO=\"lipo\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO\nif test -n \"$ac_ct_LIPO\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO\" >&5\n$as_echo \"$ac_ct_LIPO\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_LIPO\" = x; then\n    LIPO=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    LIPO=$ac_ct_LIPO\n  fi\nelse\n  LIPO=\"$ac_cv_prog_LIPO\"\nfi\n\n    if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}otool\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}otool; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_OTOOL+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$OTOOL\"; then\n  ac_cv_prog_OTOOL=\"$OTOOL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_OTOOL=\"${ac_tool_prefix}otool\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nOTOOL=$ac_cv_prog_OTOOL\nif test -n \"$OTOOL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $OTOOL\" >&5\n$as_echo \"$OTOOL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_OTOOL\"; then\n  ac_ct_OTOOL=$OTOOL\n  # Extract the first word of \"otool\", so it can be a program name with args.\nset dummy otool; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_ac_ct_OTOOL+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_OTOOL\"; then\n  ac_cv_prog_ac_ct_OTOOL=\"$ac_ct_OTOOL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_OTOOL=\"otool\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL\nif test -n \"$ac_ct_OTOOL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL\" >&5\n$as_echo \"$ac_ct_OTOOL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_OTOOL\" = x; then\n    OTOOL=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    OTOOL=$ac_ct_OTOOL\n  fi\nelse\n  OTOOL=\"$ac_cv_prog_OTOOL\"\nfi\n\n    if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}otool64\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}otool64; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_OTOOL64+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$OTOOL64\"; then\n  ac_cv_prog_OTOOL64=\"$OTOOL64\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_OTOOL64=\"${ac_tool_prefix}otool64\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nOTOOL64=$ac_cv_prog_OTOOL64\nif test -n \"$OTOOL64\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $OTOOL64\" >&5\n$as_echo \"$OTOOL64\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_OTOOL64\"; then\n  ac_ct_OTOOL64=$OTOOL64\n  # Extract the first word of \"otool64\", so it can be a program name with args.\nset dummy otool64; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif test \"${ac_cv_prog_ac_ct_OTOOL64+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_OTOOL64\"; then\n  ac_cv_prog_ac_ct_OTOOL64=\"$ac_ct_OTOOL64\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if { test -f \"$as_dir/$ac_word$ac_exec_ext\" && $as_test_x \"$as_dir/$ac_word$ac_exec_ext\"; }; then\n    ac_cv_prog_ac_ct_OTOOL64=\"otool64\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64\nif test -n \"$ac_ct_OTOOL64\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64\" >&5\n$as_echo \"$ac_ct_OTOOL64\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_OTOOL64\" = x; then\n    OTOOL64=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    OTOOL64=$ac_ct_OTOOL64\n  fi\nelse\n  OTOOL64=\"$ac_cv_prog_OTOOL64\"\nfi\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag\" >&5\n$as_echo_n \"checking for -single_module linker flag... \" >&6; }\nif test \"${lt_cv_apple_cc_single_mod+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_apple_cc_single_mod=no\n      if test -z \"${LT_MULTI_MODULE}\"; then\n\t# By default we will add the -single_module flag. You can override\n\t# by either setting the environment variable LT_MULTI_MODULE\n\t# non-empty at configure time, or by adding -multi_module to the\n\t# link flags.\n\trm -rf libconftest.dylib*\n\techo \"int foo(void){return 1;}\" > conftest.c\n\techo \"$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \\\n-dynamiclib -Wl,-single_module conftest.c\" >&5\n\t$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \\\n\t  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err\n        _lt_result=$?\n\tif test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then\n\t  lt_cv_apple_cc_single_mod=yes\n\telse\n\t  cat conftest.err >&5\n\tfi\n\trm -rf libconftest.dylib*\n\trm -f conftest.*\n      fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod\" >&5\n$as_echo \"$lt_cv_apple_cc_single_mod\" >&6; }\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag\" >&5\n$as_echo_n \"checking for -exported_symbols_list linker flag... \" >&6; }\nif test \"${lt_cv_ld_exported_symbols_list+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_ld_exported_symbols_list=no\n      save_LDFLAGS=$LDFLAGS\n      echo \"_main\" > conftest.sym\n      LDFLAGS=\"$LDFLAGS -Wl,-exported_symbols_list,conftest.sym\"\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  lt_cv_ld_exported_symbols_list=yes\nelse\n  lt_cv_ld_exported_symbols_list=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n\tLDFLAGS=\"$save_LDFLAGS\"\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list\" >&5\n$as_echo \"$lt_cv_ld_exported_symbols_list\" >&6; }\n    case $host_os in\n    rhapsody* | darwin1.[012])\n      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;\n    darwin1.*)\n      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;\n    darwin*) # darwin 5.x on\n      # if running on 10.5 or later, the deployment target defaults\n      # to the OS version, if on x86, and 10.4, the deployment\n      # target defaults to 10.4. Don't you love it?\n      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in\n\t10.0,*86*-darwin8*|10.0,*-darwin[91]*)\n\t  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;\n\t10.[012]*)\n\t  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;\n\t10.*)\n\t  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;\n      esac\n    ;;\n  esac\n    if test \"$lt_cv_apple_cc_single_mod\" = \"yes\"; then\n      _lt_dar_single_mod='$single_module'\n    fi\n    if test \"$lt_cv_ld_exported_symbols_list\" = \"yes\"; then\n      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'\n    else\n      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'\n    fi\n    if test \"$DSYMUTIL\" != \":\"; then\n      _lt_dsymutil='~$DSYMUTIL $lib || :'\n    else\n      _lt_dsymutil=\n    fi\n    ;;\n  esac\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor\" >&5\n$as_echo_n \"checking how to run the C preprocessor... \" >&6; }\n# On Suns, sometimes $CPP names a directory.\nif test -n \"$CPP\" && test -d \"$CPP\"; then\n  CPP=\nfi\nif test -z \"$CPP\"; then\n  if test \"${ac_cv_prog_CPP+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n      # Double quotes because CPP needs to be expanded\n    for CPP in \"$CC -E\" \"$CC -E -traditional-cpp\" \"/lib/cpp\"\n    do\n      ac_preproc_ok=false\nfor ac_c_preproc_warn_flag in '' yes\ndo\n  # Use a header file that comes with gcc, so configuring glibc\n  # with a fresh cross-compiler works.\n  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n  # <limits.h> exists even on freestanding compilers.\n  # On the NeXT, cc -E runs the code through the compiler's parser,\n  # not just through cpp. \"Syntax error\" is here to catch this case.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\t\t     Syntax error\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n\nelse\n  # Broken: fails on valid input.\ncontinue\nfi\nrm -f conftest.err conftest.$ac_ext\n\n  # OK, works on sane cases.  Now check whether nonexistent headers\n  # can be detected and how.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ac_nonexistent.h>\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n  # Broken: success on invalid input.\ncontinue\nelse\n  # Passes both tests.\nac_preproc_ok=:\nbreak\nfi\nrm -f conftest.err conftest.$ac_ext\n\ndone\n# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.\nrm -f conftest.err conftest.$ac_ext\nif $ac_preproc_ok; then :\n  break\nfi\n\n    done\n    ac_cv_prog_CPP=$CPP\n\nfi\n  CPP=$ac_cv_prog_CPP\nelse\n  ac_cv_prog_CPP=$CPP\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CPP\" >&5\n$as_echo \"$CPP\" >&6; }\nac_preproc_ok=false\nfor ac_c_preproc_warn_flag in '' yes\ndo\n  # Use a header file that comes with gcc, so configuring glibc\n  # with a fresh cross-compiler works.\n  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n  # <limits.h> exists even on freestanding compilers.\n  # On the NeXT, cc -E runs the code through the compiler's parser,\n  # not just through cpp. \"Syntax error\" is here to catch this case.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\t\t     Syntax error\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n\nelse\n  # Broken: fails on valid input.\ncontinue\nfi\nrm -f conftest.err conftest.$ac_ext\n\n  # OK, works on sane cases.  Now check whether nonexistent headers\n  # can be detected and how.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ac_nonexistent.h>\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n  # Broken: success on invalid input.\ncontinue\nelse\n  # Passes both tests.\nac_preproc_ok=:\nbreak\nfi\nrm -f conftest.err conftest.$ac_ext\n\ndone\n# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.\nrm -f conftest.err conftest.$ac_ext\nif $ac_preproc_ok; then :\n\nelse\n  { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error \"C preprocessor \\\"$CPP\\\" fails sanity check\nSee \\`config.log' for more details.\" \"$LINENO\" 5; }\nfi\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for ANSI C header files\" >&5\n$as_echo_n \"checking for ANSI C header files... \" >&6; }\nif test \"${ac_cv_header_stdc+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdlib.h>\n#include <stdarg.h>\n#include <string.h>\n#include <float.h>\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_header_stdc=yes\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\nif test $ac_cv_header_stdc = yes; then\n  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <string.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"memchr\" >/dev/null 2>&1; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f conftest*\n\nfi\n\nif test $ac_cv_header_stdc = yes; then\n  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdlib.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"free\" >/dev/null 2>&1; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f conftest*\n\nfi\n\nif test $ac_cv_header_stdc = yes; then\n  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.\n  if test \"$cross_compiling\" = yes; then :\n  :\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ctype.h>\n#include <stdlib.h>\n#if ((' ' & 0x0FF) == 0x020)\n# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')\n# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))\n#else\n# define ISLOWER(c) \\\n\t\t   (('a' <= (c) && (c) <= 'i') \\\n\t\t     || ('j' <= (c) && (c) <= 'r') \\\n\t\t     || ('s' <= (c) && (c) <= 'z'))\n# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))\n#endif\n\n#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))\nint\nmain ()\n{\n  int i;\n  for (i = 0; i < 256; i++)\n    if (XOR (islower (i), ISLOWER (i))\n\t|| toupper (i) != TOUPPER (i))\n      return 2;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_run \"$LINENO\"; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \\\n  conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\n\nfi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc\" >&5\n$as_echo \"$ac_cv_header_stdc\" >&6; }\nif test $ac_cv_header_stdc = yes; then\n\n$as_echo \"#define STDC_HEADERS 1\" >>confdefs.h\n\nfi\n\n# On IRIX 5.3, sys/types and inttypes.h are conflicting.\nfor ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \\\n\t\t  inttypes.h stdint.h unistd.h\ndo :\n  as_ac_Header=`$as_echo \"ac_cv_header_$ac_header\" | $as_tr_sh`\nac_fn_c_check_header_compile \"$LINENO\" \"$ac_header\" \"$as_ac_Header\" \"$ac_includes_default\n\"\neval as_val=\\$$as_ac_Header\n   if test \"x$as_val\" = x\"\"yes; then :\n  cat >>confdefs.h <<_ACEOF\n#define `$as_echo \"HAVE_$ac_header\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\n\ndone\n\n\nfor ac_header in dlfcn.h\ndo :\n  ac_fn_c_check_header_compile \"$LINENO\" \"dlfcn.h\" \"ac_cv_header_dlfcn_h\" \"$ac_includes_default\n\"\nif test \"x$ac_cv_header_dlfcn_h\" = x\"\"yes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_DLFCN_H 1\n_ACEOF\n\nfi\n\ndone\n\n\n\n# Set options\n\n\n\n        enable_dlopen=no\n\n\n  enable_win32_dll=no\n\n\n            # Check whether --enable-shared was given.\nif test \"${enable_shared+set}\" = set; then :\n  enableval=$enable_shared; p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_shared=yes ;;\n    no) enable_shared=no ;;\n    *)\n      enable_shared=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for pkg in $enableval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_shared=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac\nelse\n  enable_shared=yes\nfi\n\n\n\n\n\n\n\n\n\n  # Check whether --enable-static was given.\nif test \"${enable_static+set}\" = set; then :\n  enableval=$enable_static; p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_static=yes ;;\n    no) enable_static=no ;;\n    *)\n     enable_static=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for pkg in $enableval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_static=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac\nelse\n  enable_static=yes\nfi\n\n\n\n\n\n\n\n\n\n\n# Check whether --with-pic was given.\nif test \"${with_pic+set}\" = set; then :\n  withval=$with_pic; pic_mode=\"$withval\"\nelse\n  pic_mode=default\nfi\n\n\ntest -z \"$pic_mode\" && pic_mode=default\n\n\n\n\n\n\n\n  # Check whether --enable-fast-install was given.\nif test \"${enable_fast_install+set}\" = set; then :\n  enableval=$enable_fast_install; p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_fast_install=yes ;;\n    no) enable_fast_install=no ;;\n    *)\n      enable_fast_install=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for pkg in $enableval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_fast_install=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac\nelse\n  enable_fast_install=yes\nfi\n\n\n\n\n\n\n\n\n\n\n\n# This can be used to rebuild libtool when needed\nLIBTOOL_DEPS=\"$ltmain\"\n\n# Always use our own libtool.\nLIBTOOL='$(SHELL) $(top_builddir)/libtool'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\ntest -z \"$LN_S\" && LN_S=\"ln -s\"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nif test -n \"${ZSH_VERSION+set}\" ; then\n   setopt NO_GLOB_SUBST\nfi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for objdir\" >&5\n$as_echo_n \"checking for objdir... \" >&6; }\nif test \"${lt_cv_objdir+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  rm -f .libs 2>/dev/null\nmkdir .libs 2>/dev/null\nif test -d .libs; then\n  lt_cv_objdir=.libs\nelse\n  # MS-DOS does not allow filenames that begin with a dot.\n  lt_cv_objdir=_libs\nfi\nrmdir .libs 2>/dev/null\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir\" >&5\n$as_echo \"$lt_cv_objdir\" >&6; }\nobjdir=$lt_cv_objdir\n\n\n\n\n\ncat >>confdefs.h <<_ACEOF\n#define LT_OBJDIR \"$lt_cv_objdir/\"\n_ACEOF\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\ncase $host_os in\naix3*)\n  # AIX sometimes has problems with the GCC collect2 program.  For some\n  # reason, if we set the COLLECT_NAMES environment variable, the problems\n  # vanish in a puff of smoke.\n  if test \"X${COLLECT_NAMES+set}\" != Xset; then\n    COLLECT_NAMES=\n    export COLLECT_NAMES\n  fi\n  ;;\nesac\n\n# Sed substitution that helps us do robust quoting.  It backslashifies\n# metacharacters that are still active within double-quoted strings.\nsed_quote_subst='s/\\([\"`$\\\\]\\)/\\\\\\1/g'\n\n# Same as above, but do not quote variable references.\ndouble_quote_subst='s/\\([\"`\\\\]\\)/\\\\\\1/g'\n\n# Sed substitution to delay expansion of an escaped shell variable in a\n# double_quote_subst'ed string.\ndelay_variable_subst='s/\\\\\\\\\\\\\\\\\\\\\\$/\\\\\\\\\\\\$/g'\n\n# Sed substitution to delay expansion of an escaped single quote.\ndelay_single_quote_subst='s/'\\''/'\\'\\\\\\\\\\\\\\'\\''/g'\n\n# Sed substitution to avoid accidental globbing in evaled expressions\nno_glob_subst='s/\\*/\\\\\\*/g'\n\n# Global variables:\nofile=libtool\ncan_build_shared=yes\n\n# All known linkers require a `.a' archive for static linking (except MSVC,\n# which needs '.lib').\nlibext=a\n\nwith_gnu_ld=\"$lt_cv_prog_gnu_ld\"\n\nold_CC=\"$CC\"\nold_CFLAGS=\"$CFLAGS\"\n\n# Set sane defaults for various variables\ntest -z \"$CC\" && CC=cc\ntest -z \"$LTCC\" && LTCC=$CC\ntest -z \"$LTCFLAGS\" && LTCFLAGS=$CFLAGS\ntest -z \"$LD\" && LD=ld\ntest -z \"$ac_objext\" && ac_objext=o\n\nfor cc_temp in $compiler\"\"; do\n  case $cc_temp in\n    compile | *[\\\\/]compile | ccache | *[\\\\/]ccache ) ;;\n    distcc | *[\\\\/]distcc | purify | *[\\\\/]purify ) ;;\n    \\-*) ;;\n    *) break;;\n  esac\ndone\ncc_basename=`$ECHO \"X$cc_temp\" | $Xsed -e 's%.*/%%' -e \"s%^$host_alias-%%\"`\n\n\n# Only perform the check for file, if the check method requires it\ntest -z \"$MAGIC_CMD\" && MAGIC_CMD=file\ncase $deplibs_check_method in\nfile_magic*)\n  if test \"$file_magic_cmd\" = '$MAGIC_CMD'; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file\" >&5\n$as_echo_n \"checking for ${ac_tool_prefix}file... \" >&6; }\nif test \"${lt_cv_path_MAGIC_CMD+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $MAGIC_CMD in\n[\\\\/*] |  ?:[\\\\/]*)\n  lt_cv_path_MAGIC_CMD=\"$MAGIC_CMD\" # Let the user override the test with a path.\n  ;;\n*)\n  lt_save_MAGIC_CMD=\"$MAGIC_CMD\"\n  lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n  ac_dummy=\"/usr/bin$PATH_SEPARATOR$PATH\"\n  for ac_dir in $ac_dummy; do\n    IFS=\"$lt_save_ifs\"\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f $ac_dir/${ac_tool_prefix}file; then\n      lt_cv_path_MAGIC_CMD=\"$ac_dir/${ac_tool_prefix}file\"\n      if test -n \"$file_magic_test_file\"; then\n\tcase $deplibs_check_method in\n\t\"file_magic \"*)\n\t  file_magic_regex=`expr \"$deplibs_check_method\" : \"file_magic \\(.*\\)\"`\n\t  MAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\n\t  if eval $file_magic_cmd \\$file_magic_test_file 2> /dev/null |\n\t    $EGREP \"$file_magic_regex\" > /dev/null; then\n\t    :\n\t  else\n\t    cat <<_LT_EOF 1>&2\n\n*** Warning: the command libtool uses to detect shared libraries,\n*** $file_magic_cmd, produces output that libtool cannot recognize.\n*** The result is that libtool may fail to recognize shared libraries\n*** as such.  This will affect the creation of libtool libraries that\n*** depend on shared libraries, but programs linked with such libtool\n*** libraries will work regardless of this problem.  Nevertheless, you\n*** may want to report the problem to your system manager and/or to\n*** bug-libtool@gnu.org\n\n_LT_EOF\n\t  fi ;;\n\tesac\n      fi\n      break\n    fi\n  done\n  IFS=\"$lt_save_ifs\"\n  MAGIC_CMD=\"$lt_save_MAGIC_CMD\"\n  ;;\nesac\nfi\n\nMAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\nif test -n \"$MAGIC_CMD\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD\" >&5\n$as_echo \"$MAGIC_CMD\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n\n\n\nif test -z \"$lt_cv_path_MAGIC_CMD\"; then\n  if test -n \"$ac_tool_prefix\"; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for file\" >&5\n$as_echo_n \"checking for file... \" >&6; }\nif test \"${lt_cv_path_MAGIC_CMD+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $MAGIC_CMD in\n[\\\\/*] |  ?:[\\\\/]*)\n  lt_cv_path_MAGIC_CMD=\"$MAGIC_CMD\" # Let the user override the test with a path.\n  ;;\n*)\n  lt_save_MAGIC_CMD=\"$MAGIC_CMD\"\n  lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n  ac_dummy=\"/usr/bin$PATH_SEPARATOR$PATH\"\n  for ac_dir in $ac_dummy; do\n    IFS=\"$lt_save_ifs\"\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f $ac_dir/file; then\n      lt_cv_path_MAGIC_CMD=\"$ac_dir/file\"\n      if test -n \"$file_magic_test_file\"; then\n\tcase $deplibs_check_method in\n\t\"file_magic \"*)\n\t  file_magic_regex=`expr \"$deplibs_check_method\" : \"file_magic \\(.*\\)\"`\n\t  MAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\n\t  if eval $file_magic_cmd \\$file_magic_test_file 2> /dev/null |\n\t    $EGREP \"$file_magic_regex\" > /dev/null; then\n\t    :\n\t  else\n\t    cat <<_LT_EOF 1>&2\n\n*** Warning: the command libtool uses to detect shared libraries,\n*** $file_magic_cmd, produces output that libtool cannot recognize.\n*** The result is that libtool may fail to recognize shared libraries\n*** as such.  This will affect the creation of libtool libraries that\n*** depend on shared libraries, but programs linked with such libtool\n*** libraries will work regardless of this problem.  Nevertheless, you\n*** may want to report the problem to your system manager and/or to\n*** bug-libtool@gnu.org\n\n_LT_EOF\n\t  fi ;;\n\tesac\n      fi\n      break\n    fi\n  done\n  IFS=\"$lt_save_ifs\"\n  MAGIC_CMD=\"$lt_save_MAGIC_CMD\"\n  ;;\nesac\nfi\n\nMAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\nif test -n \"$MAGIC_CMD\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD\" >&5\n$as_echo \"$MAGIC_CMD\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  else\n    MAGIC_CMD=:\n  fi\nfi\n\n  fi\n  ;;\nesac\n\n# Use C for the default configuration in the libtool script\n\nlt_save_CC=\"$CC\"\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\n# Source file extension for C test sources.\nac_ext=c\n\n# Object file extension for compiled C test sources.\nobjext=o\nobjext=$objext\n\n# Code to be used in simple compile tests\nlt_simple_compile_test_code=\"int some_variable = 0;\"\n\n# Code to be used in simple link tests\nlt_simple_link_test_code='int main(){return(0);}'\n\n\n\n\n\n\n\n# If no C compiler was specified, use CC.\nLTCC=${LTCC-\"$CC\"}\n\n# If no C compiler flags were specified, use CFLAGS.\nLTCFLAGS=${LTCFLAGS-\"$CFLAGS\"}\n\n# Allow CC to be a program name with arguments.\ncompiler=$CC\n\n# Save the default compiler, since it gets overwritten when the other\n# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.\ncompiler_DEFAULT=$CC\n\n# save warnings/boilerplate of simple test code\nac_outfile=conftest.$ac_objext\necho \"$lt_simple_compile_test_code\" >conftest.$ac_ext\neval \"$ac_compile\" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err\n_lt_compiler_boilerplate=`cat conftest.err`\n$RM conftest*\n\nac_outfile=conftest.$ac_objext\necho \"$lt_simple_link_test_code\" >conftest.$ac_ext\neval \"$ac_link\" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err\n_lt_linker_boilerplate=`cat conftest.err`\n$RM -r conftest*\n\n\n## CAVEAT EMPTOR:\n## There is no encapsulation within the following macros, do not change\n## the running order or otherwise move them around unless you know exactly\n## what you are doing...\nif test -n \"$compiler\"; then\n\nlt_prog_compiler_no_builtin_flag=\n\nif test \"$GCC\" = yes; then\n  lt_prog_compiler_no_builtin_flag=' -fno-builtin'\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions\" >&5\n$as_echo_n \"checking if $compiler supports -fno-rtti -fno-exceptions... \" >&6; }\nif test \"${lt_cv_prog_compiler_rtti_exceptions+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_rtti_exceptions=no\n   ac_outfile=conftest.$ac_objext\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n   lt_compiler_flag=\"-fno-rtti -fno-exceptions\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   # The option is referenced via a variable to avoid confusing sed.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [^ ]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:7434: $lt_compile\\\"\" >&5)\n   (eval \"$lt_compile\" 2>conftest.err)\n   ac_status=$?\n   cat conftest.err >&5\n   echo \"$as_me:7438: \\$? = $ac_status\" >&5\n   if (exit $ac_status) && test -s \"$ac_outfile\"; then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings other than the usual output.\n     $ECHO \"X$_lt_compiler_boilerplate\" | $Xsed -e '/^$/d' >conftest.exp\n     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then\n       lt_cv_prog_compiler_rtti_exceptions=yes\n     fi\n   fi\n   $RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions\" >&5\n$as_echo \"$lt_cv_prog_compiler_rtti_exceptions\" >&6; }\n\nif test x\"$lt_cv_prog_compiler_rtti_exceptions\" = xyes; then\n    lt_prog_compiler_no_builtin_flag=\"$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions\"\nelse\n    :\nfi\n\nfi\n\n\n\n\n\n\n  lt_prog_compiler_wl=\nlt_prog_compiler_pic=\nlt_prog_compiler_static=\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC\" >&5\n$as_echo_n \"checking for $compiler option to produce PIC... \" >&6; }\n\n  if test \"$GCC\" = yes; then\n    lt_prog_compiler_wl='-Wl,'\n    lt_prog_compiler_static='-static'\n\n    case $host_os in\n      aix*)\n      # All AIX code is PIC.\n      if test \"$host_cpu\" = ia64; then\n\t# AIX 5 now supports IA64 processor\n\tlt_prog_compiler_static='-Bstatic'\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            lt_prog_compiler_pic='-fPIC'\n        ;;\n      m68k)\n            # FIXME: we need at least 68020 code to build shared libraries, but\n            # adding the `-m68020' flag to GCC prevents building anything better,\n            # like `-m68040'.\n            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'\n        ;;\n      esac\n      ;;\n\n    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)\n      # PIC is the default for these OSes.\n      ;;\n\n    mingw* | cygwin* | pw32* | os2* | cegcc*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      # Although the cygwin gcc ignores -fPIC, still need this for old-style\n      # (--disable-auto-import) libraries\n      lt_prog_compiler_pic='-DDLL_EXPORT'\n      ;;\n\n    darwin* | rhapsody*)\n      # PIC is the default on this platform\n      # Common symbols not allowed in MH_DYLIB files\n      lt_prog_compiler_pic='-fno-common'\n      ;;\n\n    hpux*)\n      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit\n      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag\n      # sets the default TLS model and affects inlining.\n      case $host_cpu in\n      hppa*64*)\n\t# +Z the default\n\t;;\n      *)\n\tlt_prog_compiler_pic='-fPIC'\n\t;;\n      esac\n      ;;\n\n    interix[3-9]*)\n      # Interix 3.x gcc -fpic/-fPIC options generate broken code.\n      # Instead, we relocate shared libraries at runtime.\n      ;;\n\n    msdosdjgpp*)\n      # Just because we use GCC doesn't mean we suddenly get shared libraries\n      # on systems that don't support them.\n      lt_prog_compiler_can_build_shared=no\n      enable_shared=no\n      ;;\n\n    *nto* | *qnx*)\n      # QNX uses GNU C++, but need to define -shared option too, otherwise\n      # it will coredump.\n      lt_prog_compiler_pic='-fPIC -shared'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\tlt_prog_compiler_pic=-Kconform_pic\n      fi\n      ;;\n\n    *)\n      lt_prog_compiler_pic='-fPIC'\n      ;;\n    esac\n  else\n    # PORTME Check for flag to pass linker flags through the system compiler.\n    case $host_os in\n    aix*)\n      lt_prog_compiler_wl='-Wl,'\n      if test \"$host_cpu\" = ia64; then\n\t# AIX 5 now supports IA64 processor\n\tlt_prog_compiler_static='-Bstatic'\n      else\n\tlt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'\n      fi\n      ;;\n\n    mingw* | cygwin* | pw32* | os2* | cegcc*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      lt_prog_compiler_pic='-DDLL_EXPORT'\n      ;;\n\n    hpux9* | hpux10* | hpux11*)\n      lt_prog_compiler_wl='-Wl,'\n      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but\n      # not for PA HP-UX.\n      case $host_cpu in\n      hppa*64*|ia64*)\n\t# +Z the default\n\t;;\n      *)\n\tlt_prog_compiler_pic='+Z'\n\t;;\n      esac\n      # Is there a better lt_prog_compiler_static that works with the bundled CC?\n      lt_prog_compiler_static='${wl}-a ${wl}archive'\n      ;;\n\n    irix5* | irix6* | nonstopux*)\n      lt_prog_compiler_wl='-Wl,'\n      # PIC (with -KPIC) is the default.\n      lt_prog_compiler_static='-non_shared'\n      ;;\n\n    linux* | k*bsd*-gnu | kopensolaris*-gnu)\n      case $cc_basename in\n      # old Intel for x86_64 which still supported -KPIC.\n      ecc*)\n\tlt_prog_compiler_wl='-Wl,'\n\tlt_prog_compiler_pic='-KPIC'\n\tlt_prog_compiler_static='-static'\n        ;;\n      # icc used to be incompatible with GCC.\n      # ICC 10 doesn't accept -KPIC any more.\n      icc* | ifort*)\n\tlt_prog_compiler_wl='-Wl,'\n\tlt_prog_compiler_pic='-fPIC'\n\tlt_prog_compiler_static='-static'\n        ;;\n      # Lahey Fortran 8.1.\n      lf95*)\n\tlt_prog_compiler_wl='-Wl,'\n\tlt_prog_compiler_pic='--shared'\n\tlt_prog_compiler_static='--static'\n\t;;\n      pgcc* | pgf77* | pgf90* | pgf95*)\n        # Portland Group compilers (*not* the Pentium gcc compiler,\n\t# which looks to be a dead project)\n\tlt_prog_compiler_wl='-Wl,'\n\tlt_prog_compiler_pic='-fpic'\n\tlt_prog_compiler_static='-Bstatic'\n        ;;\n      ccc*)\n        lt_prog_compiler_wl='-Wl,'\n        # All Alpha code is PIC.\n        lt_prog_compiler_static='-non_shared'\n        ;;\n      xl*)\n\t# IBM XL C 8.0/Fortran 10.1 on PPC\n\tlt_prog_compiler_wl='-Wl,'\n\tlt_prog_compiler_pic='-qpic'\n\tlt_prog_compiler_static='-qstaticlink'\n\t;;\n      *)\n\tcase `$CC -V 2>&1 | sed 5q` in\n\t*Sun\\ C*)\n\t  # Sun C 5.9\n\t  lt_prog_compiler_pic='-KPIC'\n\t  lt_prog_compiler_static='-Bstatic'\n\t  lt_prog_compiler_wl='-Wl,'\n\t  ;;\n\t*Sun\\ F*)\n\t  # Sun Fortran 8.3 passes all unrecognized flags to the linker\n\t  lt_prog_compiler_pic='-KPIC'\n\t  lt_prog_compiler_static='-Bstatic'\n\t  lt_prog_compiler_wl=''\n\t  ;;\n\tesac\n\t;;\n      esac\n      ;;\n\n    newsos6)\n      lt_prog_compiler_pic='-KPIC'\n      lt_prog_compiler_static='-Bstatic'\n      ;;\n\n    *nto* | *qnx*)\n      # QNX uses GNU C++, but need to define -shared option too, otherwise\n      # it will coredump.\n      lt_prog_compiler_pic='-fPIC -shared'\n      ;;\n\n    osf3* | osf4* | osf5*)\n      lt_prog_compiler_wl='-Wl,'\n      # All OSF/1 code is PIC.\n      lt_prog_compiler_static='-non_shared'\n      ;;\n\n    rdos*)\n      lt_prog_compiler_static='-non_shared'\n      ;;\n\n    solaris*)\n      lt_prog_compiler_pic='-KPIC'\n      lt_prog_compiler_static='-Bstatic'\n      case $cc_basename in\n      f77* | f90* | f95*)\n\tlt_prog_compiler_wl='-Qoption ld ';;\n      *)\n\tlt_prog_compiler_wl='-Wl,';;\n      esac\n      ;;\n\n    sunos4*)\n      lt_prog_compiler_wl='-Qoption ld '\n      lt_prog_compiler_pic='-PIC'\n      lt_prog_compiler_static='-Bstatic'\n      ;;\n\n    sysv4 | sysv4.2uw2* | sysv4.3*)\n      lt_prog_compiler_wl='-Wl,'\n      lt_prog_compiler_pic='-KPIC'\n      lt_prog_compiler_static='-Bstatic'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec ;then\n\tlt_prog_compiler_pic='-Kconform_pic'\n\tlt_prog_compiler_static='-Bstatic'\n      fi\n      ;;\n\n    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)\n      lt_prog_compiler_wl='-Wl,'\n      lt_prog_compiler_pic='-KPIC'\n      lt_prog_compiler_static='-Bstatic'\n      ;;\n\n    unicos*)\n      lt_prog_compiler_wl='-Wl,'\n      lt_prog_compiler_can_build_shared=no\n      ;;\n\n    uts4*)\n      lt_prog_compiler_pic='-pic'\n      lt_prog_compiler_static='-Bstatic'\n      ;;\n\n    *)\n      lt_prog_compiler_can_build_shared=no\n      ;;\n    esac\n  fi\n\ncase $host_os in\n  # For platforms which do not support PIC, -DPIC is meaningless:\n  *djgpp*)\n    lt_prog_compiler_pic=\n    ;;\n  *)\n    lt_prog_compiler_pic=\"$lt_prog_compiler_pic -DPIC\"\n    ;;\nesac\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_prog_compiler_pic\" >&5\n$as_echo \"$lt_prog_compiler_pic\" >&6; }\n\n\n\n\n\n\n#\n# Check to make sure the PIC flag actually works.\n#\nif test -n \"$lt_prog_compiler_pic\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works\" >&5\n$as_echo_n \"checking if $compiler PIC flag $lt_prog_compiler_pic works... \" >&6; }\nif test \"${lt_cv_prog_compiler_pic_works+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_pic_works=no\n   ac_outfile=conftest.$ac_objext\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n   lt_compiler_flag=\"$lt_prog_compiler_pic -DPIC\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   # The option is referenced via a variable to avoid confusing sed.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [^ ]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:7773: $lt_compile\\\"\" >&5)\n   (eval \"$lt_compile\" 2>conftest.err)\n   ac_status=$?\n   cat conftest.err >&5\n   echo \"$as_me:7777: \\$? = $ac_status\" >&5\n   if (exit $ac_status) && test -s \"$ac_outfile\"; then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings other than the usual output.\n     $ECHO \"X$_lt_compiler_boilerplate\" | $Xsed -e '/^$/d' >conftest.exp\n     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then\n       lt_cv_prog_compiler_pic_works=yes\n     fi\n   fi\n   $RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works\" >&5\n$as_echo \"$lt_cv_prog_compiler_pic_works\" >&6; }\n\nif test x\"$lt_cv_prog_compiler_pic_works\" = xyes; then\n    case $lt_prog_compiler_pic in\n     \"\" | \" \"*) ;;\n     *) lt_prog_compiler_pic=\" $lt_prog_compiler_pic\" ;;\n     esac\nelse\n    lt_prog_compiler_pic=\n     lt_prog_compiler_can_build_shared=no\nfi\n\nfi\n\n\n\n\n\n\n#\n# Check to make sure the static flag actually works.\n#\nwl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\\\"$lt_prog_compiler_static\\\"\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works\" >&5\n$as_echo_n \"checking if $compiler static flag $lt_tmp_static_flag works... \" >&6; }\nif test \"${lt_cv_prog_compiler_static_works+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_static_works=no\n   save_LDFLAGS=\"$LDFLAGS\"\n   LDFLAGS=\"$LDFLAGS $lt_tmp_static_flag\"\n   echo \"$lt_simple_link_test_code\" > conftest.$ac_ext\n   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then\n     # The linker can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     if test -s conftest.err; then\n       # Append any errors to the config.log.\n       cat conftest.err 1>&5\n       $ECHO \"X$_lt_linker_boilerplate\" | $Xsed -e '/^$/d' > conftest.exp\n       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n       if diff conftest.exp conftest.er2 >/dev/null; then\n         lt_cv_prog_compiler_static_works=yes\n       fi\n     else\n       lt_cv_prog_compiler_static_works=yes\n     fi\n   fi\n   $RM -r conftest*\n   LDFLAGS=\"$save_LDFLAGS\"\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works\" >&5\n$as_echo \"$lt_cv_prog_compiler_static_works\" >&6; }\n\nif test x\"$lt_cv_prog_compiler_static_works\" = xyes; then\n    :\nelse\n    lt_prog_compiler_static=\nfi\n\n\n\n\n\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext\" >&5\n$as_echo_n \"checking if $compiler supports -c -o file.$ac_objext... \" >&6; }\nif test \"${lt_cv_prog_compiler_c_o+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_c_o=no\n   $RM -r conftest 2>/dev/null\n   mkdir conftest\n   cd conftest\n   mkdir out\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n   lt_compiler_flag=\"-o out/conftest2.$ac_objext\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [^ ]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:7878: $lt_compile\\\"\" >&5)\n   (eval \"$lt_compile\" 2>out/conftest.err)\n   ac_status=$?\n   cat out/conftest.err >&5\n   echo \"$as_me:7882: \\$? = $ac_status\" >&5\n   if (exit $ac_status) && test -s out/conftest2.$ac_objext\n   then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     $ECHO \"X$_lt_compiler_boilerplate\" | $Xsed -e '/^$/d' > out/conftest.exp\n     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2\n     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then\n       lt_cv_prog_compiler_c_o=yes\n     fi\n   fi\n   chmod u+w . 2>&5\n   $RM conftest*\n   # SGI C++ compiler will create directory out/ii_files/ for\n   # template instantiation\n   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files\n   $RM out/* && rmdir out\n   cd ..\n   $RM -r conftest\n   $RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o\" >&5\n$as_echo \"$lt_cv_prog_compiler_c_o\" >&6; }\n\n\n\n\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext\" >&5\n$as_echo_n \"checking if $compiler supports -c -o file.$ac_objext... \" >&6; }\nif test \"${lt_cv_prog_compiler_c_o+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_c_o=no\n   $RM -r conftest 2>/dev/null\n   mkdir conftest\n   cd conftest\n   mkdir out\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n   lt_compiler_flag=\"-o out/conftest2.$ac_objext\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [^ ]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:7933: $lt_compile\\\"\" >&5)\n   (eval \"$lt_compile\" 2>out/conftest.err)\n   ac_status=$?\n   cat out/conftest.err >&5\n   echo \"$as_me:7937: \\$? = $ac_status\" >&5\n   if (exit $ac_status) && test -s out/conftest2.$ac_objext\n   then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     $ECHO \"X$_lt_compiler_boilerplate\" | $Xsed -e '/^$/d' > out/conftest.exp\n     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2\n     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then\n       lt_cv_prog_compiler_c_o=yes\n     fi\n   fi\n   chmod u+w . 2>&5\n   $RM conftest*\n   # SGI C++ compiler will create directory out/ii_files/ for\n   # template instantiation\n   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files\n   $RM out/* && rmdir out\n   cd ..\n   $RM -r conftest\n   $RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o\" >&5\n$as_echo \"$lt_cv_prog_compiler_c_o\" >&6; }\n\n\n\n\nhard_links=\"nottested\"\nif test \"$lt_cv_prog_compiler_c_o\" = no && test \"$need_locks\" != no; then\n  # do not overwrite the value of need_locks provided by the user\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links\" >&5\n$as_echo_n \"checking if we can lock with hard links... \" >&6; }\n  hard_links=yes\n  $RM conftest*\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  touch conftest.a\n  ln conftest.a conftest.b 2>&5 || hard_links=no\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $hard_links\" >&5\n$as_echo \"$hard_links\" >&6; }\n  if test \"$hard_links\" = no; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: \\`$CC' does not support \\`-c -o', so \\`make -j' may be unsafe\" >&5\n$as_echo \"$as_me: WARNING: \\`$CC' does not support \\`-c -o', so \\`make -j' may be unsafe\" >&2;}\n    need_locks=warn\n  fi\nelse\n  need_locks=no\nfi\n\n\n\n\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries\" >&5\n$as_echo_n \"checking whether the $compiler linker ($LD) supports shared libraries... \" >&6; }\n\n  runpath_var=\n  allow_undefined_flag=\n  always_export_symbols=no\n  archive_cmds=\n  archive_expsym_cmds=\n  compiler_needs_object=no\n  enable_shared_with_static_runtimes=no\n  export_dynamic_flag_spec=\n  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\\''s/.* //'\\'' | sort | uniq > $export_symbols'\n  hardcode_automatic=no\n  hardcode_direct=no\n  hardcode_direct_absolute=no\n  hardcode_libdir_flag_spec=\n  hardcode_libdir_flag_spec_ld=\n  hardcode_libdir_separator=\n  hardcode_minus_L=no\n  hardcode_shlibpath_var=unsupported\n  inherit_rpath=no\n  link_all_deplibs=unknown\n  module_cmds=\n  module_expsym_cmds=\n  old_archive_from_new_cmds=\n  old_archive_from_expsyms_cmds=\n  thread_safe_flag_spec=\n  whole_archive_flag_spec=\n  # include_expsyms should be a list of space-separated symbols to be *always*\n  # included in the symbol list\n  include_expsyms=\n  # exclude_expsyms can be an extended regexp of symbols to exclude\n  # it will be wrapped by ` (' and `)$', so one must not match beginning or\n  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',\n  # as well as any symbol that contains `d'.\n  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'\n  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out\n  # platforms (ab)use it in PIC code, but their linkers get confused if\n  # the symbol is explicitly referenced.  Since portable code cannot\n  # rely on this symbol name, it's probably fine to never include it in\n  # preloaded symbol tables.\n  # Exclude shared library initialization/finalization symbols.\n  extract_expsyms_cmds=\n\n  case $host_os in\n  cygwin* | mingw* | pw32* | cegcc*)\n    # FIXME: the MSVC++ port hasn't been tested in a loooong time\n    # When not using gcc, we currently assume that we are using\n    # Microsoft Visual C++.\n    if test \"$GCC\" != yes; then\n      with_gnu_ld=no\n    fi\n    ;;\n  interix*)\n    # we just hope/assume this is gcc and not c89 (= MSVC++)\n    with_gnu_ld=yes\n    ;;\n  openbsd*)\n    with_gnu_ld=no\n    ;;\n  linux* | k*bsd*-gnu)\n    link_all_deplibs=no\n    ;;\n  esac\n\n  ld_shlibs=yes\n  if test \"$with_gnu_ld\" = yes; then\n    # If archive_cmds runs LD, not CC, wlarc should be empty\n    wlarc='${wl}'\n\n    # Set some defaults for GNU ld with shared library support. These\n    # are reset later if shared libraries are not supported. Putting them\n    # here allows them to be overridden if necessary.\n    runpath_var=LD_RUN_PATH\n    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n    export_dynamic_flag_spec='${wl}--export-dynamic'\n    # ancient GNU ld didn't support --whole-archive et. al.\n    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then\n      whole_archive_flag_spec=\"$wlarc\"'--whole-archive$convenience '\"$wlarc\"'--no-whole-archive'\n    else\n      whole_archive_flag_spec=\n    fi\n    supports_anon_versioning=no\n    case `$LD -v 2>&1` in\n      *GNU\\ gold*) supports_anon_versioning=yes ;;\n      *\\ [01].* | *\\ 2.[0-9].* | *\\ 2.10.*) ;; # catch versions < 2.11\n      *\\ 2.11.93.0.2\\ *) supports_anon_versioning=yes ;; # RH7.3 ...\n      *\\ 2.11.92.0.12\\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...\n      *\\ 2.11.*) ;; # other 2.11 versions\n      *) supports_anon_versioning=yes ;;\n    esac\n\n    # See if GNU ld supports shared libraries.\n    case $host_os in\n    aix[3-9]*)\n      # On AIX/PPC, the GNU linker is very broken\n      if test \"$host_cpu\" != ia64; then\n\tld_shlibs=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: the GNU linker, at least up to release 2.9.1, is reported\n*** to be unable to reliably create shared libraries on AIX.\n*** Therefore, libtool is disabling shared libraries support.  If you\n*** really care for shared libraries, you may want to modify your PATH\n*** so that a non-GNU linker is found, and then restart.\n\n_LT_EOF\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n            archive_expsym_cmds=''\n        ;;\n      m68k)\n            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO \"#define NAME $libname\" > $output_objdir/a2ixlibrary.data~$ECHO \"#define LIBRARY_ID 1\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define VERSION $major\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define REVISION $revision\" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'\n            hardcode_libdir_flag_spec='-L$libdir'\n            hardcode_minus_L=yes\n        ;;\n      esac\n      ;;\n\n    beos*)\n      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\tallow_undefined_flag=unsupported\n\t# Joseph Beckenbach <jrb3@best.com> says some releases of gcc\n\t# support --undefined.  This deserves some investigation.  FIXME\n\tarchive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n      else\n\tld_shlibs=no\n      fi\n      ;;\n\n    cygwin* | mingw* | pw32* | cegcc*)\n      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,\n      # as there is no search path for DLLs.\n      hardcode_libdir_flag_spec='-L$libdir'\n      allow_undefined_flag=unsupported\n      always_export_symbols=no\n      enable_shared_with_static_runtimes=yes\n      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\\''/^[BCDGRS][ ]/s/.*[ ]\\([^ ]*\\)/\\1 DATA/'\\'' | $SED -e '\\''/^[AITW][ ]/s/.*[ ]//'\\'' | sort | uniq > $export_symbols'\n\n      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then\n        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n\t# If the export-symbols file already is a .def file (1st line\n\t# is EXPORTS), use it as is; otherwise, prepend...\n\tarchive_expsym_cmds='if test \"x`$SED 1q $export_symbols`\" = xEXPORTS; then\n\t  cp $export_symbols $output_objdir/$soname.def;\n\telse\n\t  echo EXPORTS > $output_objdir/$soname.def;\n\t  cat $export_symbols >> $output_objdir/$soname.def;\n\tfi~\n\t$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n      else\n\tld_shlibs=no\n      fi\n      ;;\n\n    interix[3-9]*)\n      hardcode_direct=no\n      hardcode_shlibpath_var=no\n      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'\n      export_dynamic_flag_spec='${wl}-E'\n      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.\n      # Instead, shared libraries are loaded at an image base (0x10000000 by\n      # default) and relocated if they conflict, which is a slow very memory\n      # consuming and fragmenting process.  To avoid this, we pick a random,\n      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link\n      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.\n      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n      archive_expsym_cmds='sed \"s,^,_,\" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n      ;;\n\n    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)\n      tmp_diet=no\n      if test \"$host_os\" = linux-dietlibc; then\n\tcase $cc_basename in\n\t  diet\\ *) tmp_diet=yes;;\t# linux-dietlibc with static linking (!diet-dyn)\n\tesac\n      fi\n      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \\\n\t && test \"$tmp_diet\" = no\n      then\n\ttmp_addflag=\n\ttmp_sharedflag='-shared'\n\tcase $cc_basename,$host_cpu in\n        pgcc*)\t\t\t\t# Portland Group C compiler\n\t  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; $ECHO \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  tmp_addflag=' $pic_flag'\n\t  ;;\n\tpgf77* | pgf90* | pgf95*)\t# Portland Group f77 and f90 compilers\n\t  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; $ECHO \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  tmp_addflag=' $pic_flag -Mnomain' ;;\n\tecc*,ia64* | icc*,ia64*)\t# Intel C compiler on ia64\n\t  tmp_addflag=' -i_dynamic' ;;\n\tefc*,ia64* | ifort*,ia64*)\t# Intel Fortran compiler on ia64\n\t  tmp_addflag=' -i_dynamic -nofor_main' ;;\n\tifc* | ifort*)\t\t\t# Intel Fortran compiler\n\t  tmp_addflag=' -nofor_main' ;;\n\tlf95*)\t\t\t\t# Lahey Fortran 8.1\n\t  whole_archive_flag_spec=\n\t  tmp_sharedflag='--shared' ;;\n\txl[cC]*)\t\t\t# IBM XL C 8.0 on PPC (deal with xlf below)\n\t  tmp_sharedflag='-qmkshrobj'\n\t  tmp_addflag= ;;\n\tesac\n\tcase `$CC -V 2>&1 | sed 5q` in\n\t*Sun\\ C*)\t\t\t# Sun C 5.9\n\t  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\\\"\\\"; do test -z \\\"$conv\\\" || new_convenience=\\\"$new_convenience,$conv\\\"; done; $ECHO \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  compiler_needs_object=yes\n\t  tmp_sharedflag='-G' ;;\n\t*Sun\\ F*)\t\t\t# Sun Fortran 8.3\n\t  tmp_sharedflag='-G' ;;\n\tesac\n\tarchive_cmds='$CC '\"$tmp_sharedflag\"\"$tmp_addflag\"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\n        if test \"x$supports_anon_versioning\" = xyes; then\n          archive_expsym_cmds='echo \"{ global:\" > $output_objdir/$libname.ver~\n\t    cat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $output_objdir/$libname.ver~\n\t    echo \"local: *; };\" >> $output_objdir/$libname.ver~\n\t    $CC '\"$tmp_sharedflag\"\"$tmp_addflag\"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'\n        fi\n\n\tcase $cc_basename in\n\txlf*)\n\t  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself\n\t  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'\n\t  hardcode_libdir_flag_spec=\n\t  hardcode_libdir_flag_spec_ld='-rpath $libdir'\n\t  archive_cmds='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib'\n\t  if test \"x$supports_anon_versioning\" = xyes; then\n\t    archive_expsym_cmds='echo \"{ global:\" > $output_objdir/$libname.ver~\n\t      cat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $output_objdir/$libname.ver~\n\t      echo \"local: *; };\" >> $output_objdir/$libname.ver~\n\t      $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'\n\t  fi\n\t  ;;\n\tesac\n      else\n        ld_shlibs=no\n      fi\n      ;;\n\n    netbsd* | netbsdelf*-gnu)\n      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n\tarchive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'\n\twlarc=\n      else\n\tarchive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\tarchive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n      fi\n      ;;\n\n    solaris*)\n      if $LD -v 2>&1 | $GREP 'BFD 2\\.8' > /dev/null; then\n\tld_shlibs=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: The releases 2.8.* of the GNU linker cannot reliably\n*** create shared libraries on Solaris systems.  Therefore, libtool\n*** is disabling shared libraries support.  We urge you to upgrade GNU\n*** binutils to release 2.9.1 or newer.  Another option is to modify\n*** your PATH or compiler configuration so that the native linker is\n*** used, and then restart.\n\n_LT_EOF\n      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\tarchive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\tarchive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n      else\n\tld_shlibs=no\n      fi\n      ;;\n\n    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)\n      case `$LD -v 2>&1` in\n        *\\ [01].* | *\\ 2.[0-9].* | *\\ 2.1[0-5].*)\n\tld_shlibs=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not\n*** reliably create shared libraries on SCO systems.  Therefore, libtool\n*** is disabling shared libraries support.  We urge you to upgrade GNU\n*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify\n*** your PATH or compiler configuration so that the native linker is\n*** used, and then restart.\n\n_LT_EOF\n\t;;\n\t*)\n\t  # For security reasons, it is highly recommended that you always\n\t  # use absolute paths for naming shared libraries, and exclude the\n\t  # DT_RUNPATH tag from executables and libraries.  But doing so\n\t  # requires that you compile everything twice, which is a pain.\n\t  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n\t    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n\t  else\n\t    ld_shlibs=no\n\t  fi\n\t;;\n      esac\n      ;;\n\n    sunos4*)\n      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n      wlarc=\n      hardcode_direct=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    *)\n      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\tarchive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\tarchive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n      else\n\tld_shlibs=no\n      fi\n      ;;\n    esac\n\n    if test \"$ld_shlibs\" = no; then\n      runpath_var=\n      hardcode_libdir_flag_spec=\n      export_dynamic_flag_spec=\n      whole_archive_flag_spec=\n    fi\n  else\n    # PORTME fill in a description of your system's linker (not GNU ld)\n    case $host_os in\n    aix3*)\n      allow_undefined_flag=unsupported\n      always_export_symbols=yes\n      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'\n      # Note: this linker hardcodes the directories in LIBPATH if there\n      # are no directories specified by -L.\n      hardcode_minus_L=yes\n      if test \"$GCC\" = yes && test -z \"$lt_prog_compiler_static\"; then\n\t# Neither direct hardcoding nor static linking is supported with a\n\t# broken collect2.\n\thardcode_direct=unsupported\n      fi\n      ;;\n\n    aix[4-9]*)\n      if test \"$host_cpu\" = ia64; then\n\t# On IA64, the linker does run time linking by default, so we don't\n\t# have to do anything special.\n\taix_use_runtimelinking=no\n\texp_sym_flag='-Bexport'\n\tno_entry_flag=\"\"\n      else\n\t# If we're using GNU nm, then we don't want the \"-C\" option.\n\t# -C means demangle to AIX nm, but means don't demangle with GNU nm\n\tif $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then\n\t  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\")) && (substr(\\$ 3,1,1) != \".\")) { print \\$ 3 } }'\\'' | sort -u > $export_symbols'\n\telse\n\t  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\")) && (substr(\\$ 3,1,1) != \".\")) { print \\$ 3 } }'\\'' | sort -u > $export_symbols'\n\tfi\n\taix_use_runtimelinking=no\n\n\t# Test if we are trying to use run time linking or normal\n\t# AIX style linking. If -brtl is somewhere in LDFLAGS, we\n\t# need to do runtime linking.\n\tcase $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)\n\t  for ld_flag in $LDFLAGS; do\n\t  if (test $ld_flag = \"-brtl\" || test $ld_flag = \"-Wl,-brtl\"); then\n\t    aix_use_runtimelinking=yes\n\t    break\n\t  fi\n\t  done\n\t  ;;\n\tesac\n\n\texp_sym_flag='-bexport'\n\tno_entry_flag='-bnoentry'\n      fi\n\n      # When large executables or shared objects are built, AIX ld can\n      # have problems creating the table of contents.  If linking a library\n      # or program results in \"error TOC overflow\" add -mminimal-toc to\n      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not\n      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.\n\n      archive_cmds=''\n      hardcode_direct=yes\n      hardcode_direct_absolute=yes\n      hardcode_libdir_separator=':'\n      link_all_deplibs=yes\n      file_list_spec='${wl}-f,'\n\n      if test \"$GCC\" = yes; then\n\tcase $host_os in aix4.[012]|aix4.[012].*)\n\t# We only want to do this on AIX 4.2 and lower, the check\n\t# below for broken collect2 doesn't work under 4.3+\n\t  collect2name=`${CC} -print-prog-name=collect2`\n\t  if test -f \"$collect2name\" &&\n\t   strings \"$collect2name\" | $GREP resolve_lib_name >/dev/null\n\t  then\n\t  # We have reworked collect2\n\t  :\n\t  else\n\t  # We have old collect2\n\t  hardcode_direct=unsupported\n\t  # It fails to find uninstalled libraries when the uninstalled\n\t  # path is not listed in the libpath.  Setting hardcode_minus_L\n\t  # to unsupported forces relinking\n\t  hardcode_minus_L=yes\n\t  hardcode_libdir_flag_spec='-L$libdir'\n\t  hardcode_libdir_separator=\n\t  fi\n\t  ;;\n\tesac\n\tshared_flag='-shared'\n\tif test \"$aix_use_runtimelinking\" = yes; then\n\t  shared_flag=\"$shared_flag \"'${wl}-G'\n\tfi\n\tlink_all_deplibs=no\n      else\n\t# not using gcc\n\tif test \"$host_cpu\" = ia64; then\n\t# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release\n\t# chokes on -Wl,-G. The following line is correct:\n\t  shared_flag='-G'\n\telse\n\t  if test \"$aix_use_runtimelinking\" = yes; then\n\t    shared_flag='${wl}-G'\n\t  else\n\t    shared_flag='${wl}-bM:SRE'\n\t  fi\n\tfi\n      fi\n\n      export_dynamic_flag_spec='${wl}-bexpall'\n      # It seems that -bexpall does not export symbols beginning with\n      # underscore (_), so it is better to generate a list of symbols to export.\n      always_export_symbols=yes\n      if test \"$aix_use_runtimelinking\" = yes; then\n\t# Warning - without using the other runtime loading flags (-brtl),\n\t# -berok will link without error, but may produce a broken library.\n\tallow_undefined_flag='-berok'\n        # Determine the default libpath from the value encoded in an\n        # empty executable.\n        cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n\nlt_aix_libpath_sed='\n    /Import File Strings/,/^$/ {\n\t/^0/ {\n\t    s/^0  *\\(.*\\)$/\\1/\n\t    p\n\t}\n    }'\naix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n# Check for a 64-bit object if we didn't find anything.\nif test -z \"$aix_libpath\"; then\n  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\nfi\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nif test -z \"$aix_libpath\"; then aix_libpath=\"/usr/lib:/lib\"; fi\n\n        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '\"\\${wl}$no_entry_flag\"' $compiler_flags `if test \"x${allow_undefined_flag}\" != \"x\"; then $ECHO \"X${wl}${allow_undefined_flag}\" | $Xsed; else :; fi` '\"\\${wl}$exp_sym_flag:\\$export_symbols $shared_flag\"\n      else\n\tif test \"$host_cpu\" = ia64; then\n\t  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'\n\t  allow_undefined_flag=\"-z nodefs\"\n\t  archive_expsym_cmds=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs '\"\\${wl}$no_entry_flag\"' $compiler_flags ${wl}${allow_undefined_flag} '\"\\${wl}$exp_sym_flag:\\$export_symbols\"\n\telse\n\t # Determine the default libpath from the value encoded in an\n\t # empty executable.\n\t cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n\nlt_aix_libpath_sed='\n    /Import File Strings/,/^$/ {\n\t/^0/ {\n\t    s/^0  *\\(.*\\)$/\\1/\n\t    p\n\t}\n    }'\naix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n# Check for a 64-bit object if we didn't find anything.\nif test -z \"$aix_libpath\"; then\n  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\nfi\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nif test -z \"$aix_libpath\"; then aix_libpath=\"/usr/lib:/lib\"; fi\n\n\t hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n\t  # Warning - without using the other run time loading flags,\n\t  # -berok will link without error, but may produce a broken library.\n\t  no_undefined_flag=' ${wl}-bernotok'\n\t  allow_undefined_flag=' ${wl}-berok'\n\t  # Exported symbols can be pulled into shared objects from archives\n\t  whole_archive_flag_spec='$convenience'\n\t  archive_cmds_need_lc=yes\n\t  # This is similar to how AIX traditionally builds its shared libraries.\n\t  archive_expsym_cmds=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'\n\tfi\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n            archive_expsym_cmds=''\n        ;;\n      m68k)\n            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO \"#define NAME $libname\" > $output_objdir/a2ixlibrary.data~$ECHO \"#define LIBRARY_ID 1\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define VERSION $major\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define REVISION $revision\" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'\n            hardcode_libdir_flag_spec='-L$libdir'\n            hardcode_minus_L=yes\n        ;;\n      esac\n      ;;\n\n    bsdi[45]*)\n      export_dynamic_flag_spec=-rdynamic\n      ;;\n\n    cygwin* | mingw* | pw32* | cegcc*)\n      # When not using gcc, we currently assume that we are using\n      # Microsoft Visual C++.\n      # hardcode_libdir_flag_spec is actually meaningless, as there is\n      # no search path for DLLs.\n      hardcode_libdir_flag_spec=' '\n      allow_undefined_flag=unsupported\n      # Tell ltmain to make .lib files, not .a files.\n      libext=lib\n      # Tell ltmain to make .dll files, not .so files.\n      shrext_cmds=\".dll\"\n      # FIXME: Setting linknames here is a bad hack.\n      archive_cmds='$CC -o $lib $libobjs $compiler_flags `$ECHO \"X$deplibs\" | $Xsed -e '\\''s/ -lc$//'\\''` -link -dll~linknames='\n      # The linker will automatically build a .lib file if we build a DLL.\n      old_archive_from_new_cmds='true'\n      # FIXME: Should let the user specify the lib program.\n      old_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'\n      fix_srcfile_path='`cygpath -w \"$srcfile\"`'\n      enable_shared_with_static_runtimes=yes\n      ;;\n\n    darwin* | rhapsody*)\n\n\n  archive_cmds_need_lc=no\n  hardcode_direct=no\n  hardcode_automatic=yes\n  hardcode_shlibpath_var=unsupported\n  whole_archive_flag_spec=''\n  link_all_deplibs=yes\n  allow_undefined_flag=\"$_lt_dar_allow_undefined\"\n  case $cc_basename in\n     ifort*) _lt_dar_can_shared=yes ;;\n     *) _lt_dar_can_shared=$GCC ;;\n  esac\n  if test \"$_lt_dar_can_shared\" = \"yes\"; then\n    output_verbose_link_cmd=echo\n    archive_cmds=\"\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\$libobjs \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring $_lt_dar_single_mod${_lt_dsymutil}\"\n    module_cmds=\"\\$CC \\$allow_undefined_flag -o \\$lib -bundle \\$libobjs \\$deplibs \\$compiler_flags${_lt_dsymutil}\"\n    archive_expsym_cmds=\"sed 's,^,_,' < \\$export_symbols > \\$output_objdir/\\${libname}-symbols.expsym~\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\$libobjs \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}\"\n    module_expsym_cmds=\"sed -e 's,^,_,' < \\$export_symbols > \\$output_objdir/\\${libname}-symbols.expsym~\\$CC \\$allow_undefined_flag -o \\$lib -bundle \\$libobjs \\$deplibs \\$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}\"\n\n  else\n  ld_shlibs=no\n  fi\n\n      ;;\n\n    dgux*)\n      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_libdir_flag_spec='-L$libdir'\n      hardcode_shlibpath_var=no\n      ;;\n\n    freebsd1*)\n      ld_shlibs=no\n      ;;\n\n    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor\n    # support.  Future versions do this automatically, but an explicit c++rt0.o\n    # does not break anything, and helps significantly (at the cost of a little\n    # extra space).\n    freebsd2.2*)\n      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'\n      hardcode_libdir_flag_spec='-R$libdir'\n      hardcode_direct=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    # Unfortunately, older versions of FreeBSD 2 do not have this feature.\n    freebsd2*)\n      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_direct=yes\n      hardcode_minus_L=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.\n    freebsd* | dragonfly*)\n      archive_cmds='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'\n      hardcode_libdir_flag_spec='-R$libdir'\n      hardcode_direct=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    hpux9*)\n      if test \"$GCC\" = yes; then\n\tarchive_cmds='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'\n      else\n\tarchive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'\n      fi\n      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'\n      hardcode_libdir_separator=:\n      hardcode_direct=yes\n\n      # hardcode_minus_L: Not really in the search PATH,\n      # but as the default location of the library.\n      hardcode_minus_L=yes\n      export_dynamic_flag_spec='${wl}-E'\n      ;;\n\n    hpux10*)\n      if test \"$GCC\" = yes -a \"$with_gnu_ld\" = no; then\n\tarchive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\tarchive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'\n      fi\n      if test \"$with_gnu_ld\" = no; then\n\thardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'\n\thardcode_libdir_flag_spec_ld='+b $libdir'\n\thardcode_libdir_separator=:\n\thardcode_direct=yes\n\thardcode_direct_absolute=yes\n\texport_dynamic_flag_spec='${wl}-E'\n\t# hardcode_minus_L: Not really in the search PATH,\n\t# but as the default location of the library.\n\thardcode_minus_L=yes\n      fi\n      ;;\n\n    hpux11*)\n      if test \"$GCC\" = yes -a \"$with_gnu_ld\" = no; then\n\tcase $host_cpu in\n\thppa*64*)\n\t  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tia64*)\n\t  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\t*)\n\t  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tesac\n      else\n\tcase $host_cpu in\n\thppa*64*)\n\t  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tia64*)\n\t  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\t*)\n\t  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tesac\n      fi\n      if test \"$with_gnu_ld\" = no; then\n\thardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'\n\thardcode_libdir_separator=:\n\n\tcase $host_cpu in\n\thppa*64*|ia64*)\n\t  hardcode_direct=no\n\t  hardcode_shlibpath_var=no\n\t  ;;\n\t*)\n\t  hardcode_direct=yes\n\t  hardcode_direct_absolute=yes\n\t  export_dynamic_flag_spec='${wl}-E'\n\n\t  # hardcode_minus_L: Not really in the search PATH,\n\t  # but as the default location of the library.\n\t  hardcode_minus_L=yes\n\t  ;;\n\tesac\n      fi\n      ;;\n\n    irix5* | irix6* | nonstopux*)\n      if test \"$GCC\" = yes; then\n\tarchive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && $ECHO \"X${wl}-set_version ${wl}$verstring\" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t# Try to use the -exported_symbol ld option, if it does not\n\t# work, assume that -exports_file does not work either and\n\t# implicitly export all symbols.\n        save_LDFLAGS=\"$LDFLAGS\"\n        LDFLAGS=\"$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null\"\n        cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\nint foo(void) {}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && $ECHO \"X${wl}-set_version ${wl}$verstring\" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'\n\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n        LDFLAGS=\"$save_LDFLAGS\"\n      else\n\tarchive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && $ECHO \"X-set_version $verstring\" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'\n\tarchive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && $ECHO \"X-set_version $verstring\" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'\n      fi\n      archive_cmds_need_lc='no'\n      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n      hardcode_libdir_separator=:\n      inherit_rpath=yes\n      link_all_deplibs=yes\n      ;;\n\n    netbsd* | netbsdelf*-gnu)\n      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n\tarchive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out\n      else\n\tarchive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF\n      fi\n      hardcode_libdir_flag_spec='-R$libdir'\n      hardcode_direct=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    newsos6)\n      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_direct=yes\n      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n      hardcode_libdir_separator=:\n      hardcode_shlibpath_var=no\n      ;;\n\n    *nto* | *qnx*)\n      ;;\n\n    openbsd*)\n      if test -f /usr/libexec/ld.so; then\n\thardcode_direct=yes\n\thardcode_shlibpath_var=no\n\thardcode_direct_absolute=yes\n\tif test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n\t  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'\n\t  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'\n\t  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'\n\t  export_dynamic_flag_spec='${wl}-E'\n\telse\n\t  case $host_os in\n\t   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)\n\t     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n\t     hardcode_libdir_flag_spec='-R$libdir'\n\t     ;;\n\t   *)\n\t     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'\n\t     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'\n\t     ;;\n\t  esac\n\tfi\n      else\n\tld_shlibs=no\n      fi\n      ;;\n\n    os2*)\n      hardcode_libdir_flag_spec='-L$libdir'\n      hardcode_minus_L=yes\n      allow_undefined_flag=unsupported\n      archive_cmds='$ECHO \"LIBRARY $libname INITINSTANCE\" > $output_objdir/$libname.def~$ECHO \"DESCRIPTION \\\"$libname\\\"\" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO \" SINGLE NONSHARED\" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'\n      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'\n      ;;\n\n    osf3*)\n      if test \"$GCC\" = yes; then\n\tallow_undefined_flag=' ${wl}-expect_unresolved ${wl}\\*'\n\tarchive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && $ECHO \"X${wl}-set_version ${wl}$verstring\" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n      else\n\tallow_undefined_flag=' -expect_unresolved \\*'\n\tarchive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && $ECHO \"X-set_version $verstring\" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'\n      fi\n      archive_cmds_need_lc='no'\n      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n      hardcode_libdir_separator=:\n      ;;\n\n    osf4* | osf5*)\t# as osf3* with the addition of -msym flag\n      if test \"$GCC\" = yes; then\n\tallow_undefined_flag=' ${wl}-expect_unresolved ${wl}\\*'\n\tarchive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n \"$verstring\" && $ECHO \"X${wl}-set_version ${wl}$verstring\" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\thardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n      else\n\tallow_undefined_flag=' -expect_unresolved \\*'\n\tarchive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n \"$verstring\" && $ECHO \"X-set_version $verstring\" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'\n\tarchive_expsym_cmds='for i in `cat $export_symbols`; do printf \"%s %s\\\\n\" -exported_symbol \"\\$i\" >> $lib.exp; done; printf \"%s\\\\n\" \"-hidden\">> $lib.exp~\n\t$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n \"$verstring\" && $ECHO \"X-set_version $verstring\" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'\n\n\t# Both c and cxx compiler support -rpath directly\n\thardcode_libdir_flag_spec='-rpath $libdir'\n      fi\n      archive_cmds_need_lc='no'\n      hardcode_libdir_separator=:\n      ;;\n\n    solaris*)\n      no_undefined_flag=' -z defs'\n      if test \"$GCC\" = yes; then\n\twlarc='${wl}'\n\tarchive_cmds='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'\n\tarchive_expsym_cmds='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t  $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'\n      else\n\tcase `$CC -V 2>&1` in\n\t*\"Compilers 5.0\"*)\n\t  wlarc=''\n\t  archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  archive_expsym_cmds='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'\n\t  ;;\n\t*)\n\t  wlarc='${wl}'\n\t  archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  archive_expsym_cmds='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'\n\t  ;;\n\tesac\n      fi\n      hardcode_libdir_flag_spec='-R$libdir'\n      hardcode_shlibpath_var=no\n      case $host_os in\n      solaris2.[0-5] | solaris2.[0-5].*) ;;\n      *)\n\t# The compiler driver will combine and reorder linker options,\n\t# but understands `-z linker_flag'.  GCC discards it without `$wl',\n\t# but is careful enough not to reorder.\n\t# Supported since Solaris 2.6 (maybe 2.5.1?)\n\tif test \"$GCC\" = yes; then\n\t  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'\n\telse\n\t  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'\n\tfi\n\t;;\n      esac\n      link_all_deplibs=yes\n      ;;\n\n    sunos4*)\n      if test \"x$host_vendor\" = xsequent; then\n\t# Use $CC to link under sequent, because it throws in some extra .o\n\t# files that make .init and .fini sections work.\n\tarchive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\tarchive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'\n      fi\n      hardcode_libdir_flag_spec='-L$libdir'\n      hardcode_direct=yes\n      hardcode_minus_L=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    sysv4)\n      case $host_vendor in\n\tsni)\n\t  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  hardcode_direct=yes # is this really true???\n\t;;\n\tsiemens)\n\t  ## LD is ld it makes a PLAMLIB\n\t  ## CC just makes a GrossModule.\n\t  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'\n\t  reload_cmds='$CC -r -o $output$reload_objs'\n\t  hardcode_direct=no\n        ;;\n\tmotorola)\n\t  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  hardcode_direct=no #Motorola manual says yes, but my tests say they lie\n\t;;\n      esac\n      runpath_var='LD_RUN_PATH'\n      hardcode_shlibpath_var=no\n      ;;\n\n    sysv4.3*)\n      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_shlibpath_var=no\n      export_dynamic_flag_spec='-Bexport'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\tarchive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\thardcode_shlibpath_var=no\n\trunpath_var=LD_RUN_PATH\n\thardcode_runpath_var=yes\n\tld_shlibs=yes\n      fi\n      ;;\n\n    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)\n      no_undefined_flag='${wl}-z,text'\n      archive_cmds_need_lc=no\n      hardcode_shlibpath_var=no\n      runpath_var='LD_RUN_PATH'\n\n      if test \"$GCC\" = yes; then\n\tarchive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\tarchive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\tarchive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\tarchive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      fi\n      ;;\n\n    sysv5* | sco3.2v5* | sco5v6*)\n      # Note: We can NOT use -z defs as we might desire, because we do not\n      # link with -lc, and that would cause any symbols used from libc to\n      # always be unresolved, which means just about no library would\n      # ever link correctly.  If we're not using GNU ld we use -z text\n      # though, which does catch some bad symbols but isn't as heavy-handed\n      # as -z defs.\n      no_undefined_flag='${wl}-z,text'\n      allow_undefined_flag='${wl}-z,nodefs'\n      archive_cmds_need_lc=no\n      hardcode_shlibpath_var=no\n      hardcode_libdir_flag_spec='${wl}-R,$libdir'\n      hardcode_libdir_separator=':'\n      link_all_deplibs=yes\n      export_dynamic_flag_spec='${wl}-Bexport'\n      runpath_var='LD_RUN_PATH'\n\n      if test \"$GCC\" = yes; then\n\tarchive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\tarchive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\tarchive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\tarchive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      fi\n      ;;\n\n    uts4*)\n      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_libdir_flag_spec='-L$libdir'\n      hardcode_shlibpath_var=no\n      ;;\n\n    *)\n      ld_shlibs=no\n      ;;\n    esac\n\n    if test x$host_vendor = xsni; then\n      case $host in\n      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)\n\texport_dynamic_flag_spec='${wl}-Blargedynsym'\n\t;;\n      esac\n    fi\n  fi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ld_shlibs\" >&5\n$as_echo \"$ld_shlibs\" >&6; }\ntest \"$ld_shlibs\" = no && can_build_shared=no\n\nwith_gnu_ld=$with_gnu_ld\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n#\n# Do we need to explicitly link libc?\n#\ncase \"x$archive_cmds_need_lc\" in\nx|xyes)\n  # Assume -lc should be added\n  archive_cmds_need_lc=yes\n\n  if test \"$enable_shared\" = yes && test \"$GCC\" = yes; then\n    case $archive_cmds in\n    *'~'*)\n      # FIXME: we may have to deal with multi-command sequences.\n      ;;\n    '$CC '*)\n      # Test whether the compiler implicitly links with -lc since on some\n      # systems, -lgcc has to come before -lc. If gcc already passes -lc\n      # to ld, don't add -lc before -lgcc.\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in\" >&5\n$as_echo_n \"checking whether -lc should be explicitly linked in... \" >&6; }\n      $RM conftest*\n      echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n      if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } 2>conftest.err; then\n        soname=conftest\n        lib=conftest\n        libobjs=conftest.$ac_objext\n        deplibs=\n        wl=$lt_prog_compiler_wl\n\tpic_flag=$lt_prog_compiler_pic\n        compiler_flags=-v\n        linker_flags=-v\n        verstring=\n        output_objdir=.\n        libname=conftest\n        lt_save_allow_undefined_flag=$allow_undefined_flag\n        allow_undefined_flag=\n        if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$archive_cmds 2\\>\\&1 \\| $GREP \\\" -lc \\\" \\>/dev/null 2\\>\\&1\\\"\"; } >&5\n  (eval $archive_cmds 2\\>\\&1 \\| $GREP \\\" -lc \\\" \\>/dev/null 2\\>\\&1) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\n        then\n\t  archive_cmds_need_lc=no\n        else\n\t  archive_cmds_need_lc=yes\n        fi\n        allow_undefined_flag=$lt_save_allow_undefined_flag\n      else\n        cat conftest.err 1>&5\n      fi\n      $RM conftest*\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $archive_cmds_need_lc\" >&5\n$as_echo \"$archive_cmds_need_lc\" >&6; }\n      ;;\n    esac\n  fi\n  ;;\nesac\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics\" >&5\n$as_echo_n \"checking dynamic linker characteristics... \" >&6; }\n\nif test \"$GCC\" = yes; then\n  case $host_os in\n    darwin*) lt_awk_arg=\"/^libraries:/,/LR/\" ;;\n    *) lt_awk_arg=\"/^libraries:/\" ;;\n  esac\n  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e \"s/^libraries://\" -e \"s,=/,/,g\"`\n  if $ECHO \"$lt_search_path_spec\" | $GREP ';' >/dev/null ; then\n    # if the path contains \";\" then we assume it to be the separator\n    # otherwise default to the standard path separator (i.e. \":\") - it is\n    # assumed that no part of a normal pathname contains \";\" but that should\n    # okay in the real world where \";\" in dirpaths is itself problematic.\n    lt_search_path_spec=`$ECHO \"$lt_search_path_spec\" | $SED -e 's/;/ /g'`\n  else\n    lt_search_path_spec=`$ECHO \"$lt_search_path_spec\" | $SED  -e \"s/$PATH_SEPARATOR/ /g\"`\n  fi\n  # Ok, now we have the path, separated by spaces, we can step through it\n  # and add multilib dir if necessary.\n  lt_tmp_lt_search_path_spec=\n  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`\n  for lt_sys_path in $lt_search_path_spec; do\n    if test -d \"$lt_sys_path/$lt_multi_os_dir\"; then\n      lt_tmp_lt_search_path_spec=\"$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir\"\n    else\n      test -d \"$lt_sys_path\" && \\\n\tlt_tmp_lt_search_path_spec=\"$lt_tmp_lt_search_path_spec $lt_sys_path\"\n    fi\n  done\n  lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk '\nBEGIN {RS=\" \"; FS=\"/|\\n\";} {\n  lt_foo=\"\";\n  lt_count=0;\n  for (lt_i = NF; lt_i > 0; lt_i--) {\n    if ($lt_i != \"\" && $lt_i != \".\") {\n      if ($lt_i == \"..\") {\n        lt_count++;\n      } else {\n        if (lt_count == 0) {\n          lt_foo=\"/\" $lt_i lt_foo;\n        } else {\n          lt_count--;\n        }\n      }\n    }\n  }\n  if (lt_foo != \"\") { lt_freq[lt_foo]++; }\n  if (lt_freq[lt_foo] == 1) { print lt_foo; }\n}'`\n  sys_lib_search_path_spec=`$ECHO $lt_search_path_spec`\nelse\n  sys_lib_search_path_spec=\"/lib /usr/lib /usr/local/lib\"\nfi\nlibrary_names_spec=\nlibname_spec='lib$name'\nsoname_spec=\nshrext_cmds=\".so\"\npostinstall_cmds=\npostuninstall_cmds=\nfinish_cmds=\nfinish_eval=\nshlibpath_var=\nshlibpath_overrides_runpath=unknown\nversion_type=none\ndynamic_linker=\"$host_os ld.so\"\nsys_lib_dlsearch_path_spec=\"/lib /usr/lib\"\nneed_lib_prefix=unknown\nhardcode_into_libs=no\n\n# when you set need_version to no, make sure it does not cause -set_version\n# flags to be left without arguments\nneed_version=unknown\n\ncase $host_os in\naix3*)\n  version_type=linux\n  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'\n  shlibpath_var=LIBPATH\n\n  # AIX 3 has no versioning support, so we append a major version to the name.\n  soname_spec='${libname}${release}${shared_ext}$major'\n  ;;\n\naix[4-9]*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  hardcode_into_libs=yes\n  if test \"$host_cpu\" = ia64; then\n    # AIX 5 supports IA64\n    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'\n    shlibpath_var=LD_LIBRARY_PATH\n  else\n    # With GCC up to 2.95.x, collect2 would create an import file\n    # for dependence libraries.  The import file would start with\n    # the line `#! .'.  This would cause the generated library to\n    # depend on `.', always an invalid library.  This was fixed in\n    # development snapshots of GCC prior to 3.0.\n    case $host_os in\n      aix4 | aix4.[01] | aix4.[01].*)\n      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'\n\t   echo ' yes '\n\t   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then\n\t:\n      else\n\tcan_build_shared=no\n      fi\n      ;;\n    esac\n    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct\n    # soname into executable. Probably we can add versioning support to\n    # collect2, so additional links can be useful in future.\n    if test \"$aix_use_runtimelinking\" = yes; then\n      # If using run time linking (on AIX 4.2 or later) use lib<name>.so\n      # instead of lib<name>.a to let people know that these are not\n      # typical AIX shared libraries.\n      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    else\n      # We preserve .a as extension for shared libraries through AIX4.2\n      # and later when we are not doing run time linking.\n      library_names_spec='${libname}${release}.a $libname.a'\n      soname_spec='${libname}${release}${shared_ext}$major'\n    fi\n    shlibpath_var=LIBPATH\n  fi\n  ;;\n\namigaos*)\n  case $host_cpu in\n  powerpc)\n    # Since July 2007 AmigaOS4 officially supports .so libraries.\n    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    ;;\n  m68k)\n    library_names_spec='$libname.ixlibrary $libname.a'\n    # Create ${libname}_ixlibrary.a entries in /sys/libs.\n    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO \"X$lib\" | $Xsed -e '\\''s%^.*/\\([^/]*\\)\\.ixlibrary$%\\1%'\\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show \"cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a\"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'\n    ;;\n  esac\n  ;;\n\nbeos*)\n  library_names_spec='${libname}${shared_ext}'\n  dynamic_linker=\"$host_os ld.so\"\n  shlibpath_var=LIBRARY_PATH\n  ;;\n\nbsdi[45]*)\n  version_type=linux\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  sys_lib_search_path_spec=\"/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib\"\n  sys_lib_dlsearch_path_spec=\"/shlib /usr/lib /usr/local/lib\"\n  # the default ld.so.conf also contains /usr/contrib/lib and\n  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow\n  # libtool to hard-code these into programs\n  ;;\n\ncygwin* | mingw* | pw32* | cegcc*)\n  version_type=windows\n  shrext_cmds=\".dll\"\n  need_version=no\n  need_lib_prefix=no\n\n  case $GCC,$host_os in\n  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)\n    library_names_spec='$libname.dll.a'\n    # DLL is installed to $(libdir)/../bin by postinstall_cmds\n    postinstall_cmds='base_file=`basename \\${file}`~\n      dlpath=`$SHELL 2>&1 -c '\\''. $dir/'\\''\\${base_file}'\\''i; echo \\$dlname'\\''`~\n      dldir=$destdir/`dirname \\$dlpath`~\n      test -d \\$dldir || mkdir -p \\$dldir~\n      $install_prog $dir/$dlname \\$dldir/$dlname~\n      chmod a+x \\$dldir/$dlname~\n      if test -n '\\''$stripme'\\'' && test -n '\\''$striplib'\\''; then\n        eval '\\''$striplib \\$dldir/$dlname'\\'' || exit \\$?;\n      fi'\n    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\\''. $file; echo \\$dlname'\\''`~\n      dlpath=$dir/\\$dldll~\n       $RM \\$dlpath'\n    shlibpath_overrides_runpath=yes\n\n    case $host_os in\n    cygwin*)\n      # Cygwin DLLs use 'cyg' prefix rather than 'lib'\n      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'\n      sys_lib_search_path_spec=\"/usr/lib /lib/w32api /lib /usr/local/lib\"\n      ;;\n    mingw* | cegcc*)\n      # MinGW DLLs use traditional 'lib' prefix\n      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'\n      sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP \"^libraries:\" | $SED -e \"s/^libraries://\" -e \"s,=/,/,g\"`\n      if $ECHO \"$sys_lib_search_path_spec\" | $GREP ';[c-zC-Z]:/' >/dev/null; then\n        # It is most probably a Windows format PATH printed by\n        # mingw gcc, but we are running on Cygwin. Gcc prints its search\n        # path with ; separators, and with drive letters. We can handle the\n        # drive letters (cygwin fileutils understands them), so leave them,\n        # especially as we might pass files found there to a mingw objdump,\n        # which wouldn't understand a cygwinified path. Ahh.\n        sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | $SED -e 's/;/ /g'`\n      else\n        sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | $SED  -e \"s/$PATH_SEPARATOR/ /g\"`\n      fi\n      ;;\n    pw32*)\n      # pw32 DLLs use 'pw' prefix rather than 'lib'\n      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'\n      ;;\n    esac\n    ;;\n\n  *)\n    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'\n    ;;\n  esac\n  dynamic_linker='Win32 ld.exe'\n  # FIXME: first we should search . and the directory the executable is in\n  shlibpath_var=PATH\n  ;;\n\ndarwin* | rhapsody*)\n  dynamic_linker=\"$host_os dyld\"\n  version_type=darwin\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'\n  soname_spec='${libname}${release}${major}$shared_ext'\n  shlibpath_overrides_runpath=yes\n  shlibpath_var=DYLD_LIBRARY_PATH\n  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'\n\n  sys_lib_search_path_spec=\"$sys_lib_search_path_spec /usr/local/lib\"\n  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'\n  ;;\n\ndgux*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\nfreebsd1*)\n  dynamic_linker=no\n  ;;\n\nfreebsd* | dragonfly*)\n  # DragonFly does not have aout.  When/if they implement a new\n  # versioning mechanism, adjust this.\n  if test -x /usr/bin/objformat; then\n    objformat=`/usr/bin/objformat`\n  else\n    case $host_os in\n    freebsd[123]*) objformat=aout ;;\n    *) objformat=elf ;;\n    esac\n  fi\n  version_type=freebsd-$objformat\n  case $version_type in\n    freebsd-elf*)\n      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'\n      need_version=no\n      need_lib_prefix=no\n      ;;\n    freebsd-*)\n      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'\n      need_version=yes\n      ;;\n  esac\n  shlibpath_var=LD_LIBRARY_PATH\n  case $host_os in\n  freebsd2*)\n    shlibpath_overrides_runpath=yes\n    ;;\n  freebsd3.[01]* | freebsdelf3.[01]*)\n    shlibpath_overrides_runpath=yes\n    hardcode_into_libs=yes\n    ;;\n  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \\\n  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)\n    shlibpath_overrides_runpath=no\n    hardcode_into_libs=yes\n    ;;\n  *) # from 4.6 on, and DragonFly\n    shlibpath_overrides_runpath=yes\n    hardcode_into_libs=yes\n    ;;\n  esac\n  ;;\n\ngnu*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  hardcode_into_libs=yes\n  ;;\n\nhpux9* | hpux10* | hpux11*)\n  # Give a soname corresponding to the major version so that dld.sl refuses to\n  # link against other versions.\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  case $host_cpu in\n  ia64*)\n    shrext_cmds='.so'\n    hardcode_into_libs=yes\n    dynamic_linker=\"$host_os dld.so\"\n    shlibpath_var=LD_LIBRARY_PATH\n    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    if test \"X$HPUX_IA64_MODE\" = X32; then\n      sys_lib_search_path_spec=\"/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib\"\n    else\n      sys_lib_search_path_spec=\"/usr/lib/hpux64 /usr/local/lib/hpux64\"\n    fi\n    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec\n    ;;\n  hppa*64*)\n    shrext_cmds='.sl'\n    hardcode_into_libs=yes\n    dynamic_linker=\"$host_os dld.sl\"\n    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH\n    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    sys_lib_search_path_spec=\"/usr/lib/pa20_64 /usr/ccs/lib/pa20_64\"\n    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec\n    ;;\n  *)\n    shrext_cmds='.sl'\n    dynamic_linker=\"$host_os dld.sl\"\n    shlibpath_var=SHLIB_PATH\n    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    ;;\n  esac\n  # HP-UX runs *really* slowly unless shared libraries are mode 555.\n  postinstall_cmds='chmod 555 $lib'\n  ;;\n\ninterix[3-9]*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  ;;\n\nirix5* | irix6* | nonstopux*)\n  case $host_os in\n    nonstopux*) version_type=nonstopux ;;\n    *)\n\tif test \"$lt_cv_prog_gnu_ld\" = yes; then\n\t\tversion_type=linux\n\telse\n\t\tversion_type=irix\n\tfi ;;\n  esac\n  need_lib_prefix=no\n  need_version=no\n  soname_spec='${libname}${release}${shared_ext}$major'\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'\n  case $host_os in\n  irix5* | nonstopux*)\n    libsuff= shlibsuff=\n    ;;\n  *)\n    case $LD in # libtool.m4 will add one of these switches to LD\n    *-32|*\"-32 \"|*-melf32bsmip|*\"-melf32bsmip \")\n      libsuff= shlibsuff= libmagic=32-bit;;\n    *-n32|*\"-n32 \"|*-melf32bmipn32|*\"-melf32bmipn32 \")\n      libsuff=32 shlibsuff=N32 libmagic=N32;;\n    *-64|*\"-64 \"|*-melf64bmip|*\"-melf64bmip \")\n      libsuff=64 shlibsuff=64 libmagic=64-bit;;\n    *) libsuff= shlibsuff= libmagic=never-match;;\n    esac\n    ;;\n  esac\n  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH\n  shlibpath_overrides_runpath=no\n  sys_lib_search_path_spec=\"/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}\"\n  sys_lib_dlsearch_path_spec=\"/usr/lib${libsuff} /lib${libsuff}\"\n  hardcode_into_libs=yes\n  ;;\n\n# No shared lib support for Linux oldld, aout, or coff.\nlinux*oldld* | linux*aout* | linux*coff*)\n  dynamic_linker=no\n  ;;\n\n# This must be Linux ELF.\nlinux* | k*bsd*-gnu | kopensolaris*-gnu)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -n $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  # Some binutils ld are patched to set DT_RUNPATH\n  save_LDFLAGS=$LDFLAGS\n  save_libdir=$libdir\n  eval \"libdir=/foo; wl=\\\"$lt_prog_compiler_wl\\\"; \\\n       LDFLAGS=\\\"\\$LDFLAGS $hardcode_libdir_flag_spec\\\"\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep \"RUNPATH.*$libdir\" >/dev/null; then :\n  shlibpath_overrides_runpath=yes\nfi\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n  LDFLAGS=$save_LDFLAGS\n  libdir=$save_libdir\n\n  # This implies no fast_install, which is unacceptable.\n  # Some rework will be needed to allow for fast_install\n  # before this can be enabled.\n  hardcode_into_libs=yes\n\n  # Append ld.so.conf contents to the search path\n  if test -f /etc/ld.so.conf; then\n    lt_ld_extra=`awk '/^include / { system(sprintf(\"cd /etc; cat %s 2>/dev/null\", \\$2)); skip = 1; } { if (!skip) print \\$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[\t ]*hwcap[\t ]/d;s/[:,\t]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\\n' ' '`\n    sys_lib_dlsearch_path_spec=\"/lib /usr/lib $lt_ld_extra\"\n  fi\n\n  # We used to test for /lib/ld.so.1 and disable shared libraries on\n  # powerpc, because MkLinux only supported shared libraries with the\n  # GNU dynamic linker.  Since this was broken with cross compilers,\n  # most powerpc-linux boxes support dynamic linking these days and\n  # people can always --disable-shared, the test was removed, and we\n  # assume the GNU/Linux dynamic linker is in use.\n  dynamic_linker='GNU/Linux ld.so'\n  ;;\n\nnetbsdelf*-gnu)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  dynamic_linker='NetBSD ld.elf_so'\n  ;;\n\nnetbsd*)\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n    finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n    dynamic_linker='NetBSD (a.out) ld.so'\n  else\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    dynamic_linker='NetBSD ld.elf_so'\n  fi\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  ;;\n\nnewsos6)\n  version_type=linux\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  ;;\n\n*nto* | *qnx*)\n  version_type=qnx\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  dynamic_linker='ldqnx.so'\n  ;;\n\nopenbsd*)\n  version_type=sunos\n  sys_lib_dlsearch_path_spec=\"/usr/lib\"\n  need_lib_prefix=no\n  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.\n  case $host_os in\n    openbsd3.3 | openbsd3.3.*)\tneed_version=yes ;;\n    *)\t\t\t\tneed_version=no  ;;\n  esac\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  if test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n    case $host_os in\n      openbsd2.[89] | openbsd2.[89].*)\n\tshlibpath_overrides_runpath=no\n\t;;\n      *)\n\tshlibpath_overrides_runpath=yes\n\t;;\n      esac\n  else\n    shlibpath_overrides_runpath=yes\n  fi\n  ;;\n\nos2*)\n  libname_spec='$name'\n  shrext_cmds=\".dll\"\n  need_lib_prefix=no\n  library_names_spec='$libname${shared_ext} $libname.a'\n  dynamic_linker='OS/2 ld.exe'\n  shlibpath_var=LIBPATH\n  ;;\n\nosf3* | osf4* | osf5*)\n  version_type=osf\n  need_lib_prefix=no\n  need_version=no\n  soname_spec='${libname}${release}${shared_ext}$major'\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  sys_lib_search_path_spec=\"/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib\"\n  sys_lib_dlsearch_path_spec=\"$sys_lib_search_path_spec\"\n  ;;\n\nrdos*)\n  dynamic_linker=no\n  ;;\n\nsolaris*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  # ldd complains unless libraries are executable\n  postinstall_cmds='chmod +x $lib'\n  ;;\n\nsunos4*)\n  version_type=sunos\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/usr/etc\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  if test \"$with_gnu_ld\" = yes; then\n    need_lib_prefix=no\n  fi\n  need_version=yes\n  ;;\n\nsysv4 | sysv4.3*)\n  version_type=linux\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  case $host_vendor in\n    sni)\n      shlibpath_overrides_runpath=no\n      need_lib_prefix=no\n      runpath_var=LD_RUN_PATH\n      ;;\n    siemens)\n      need_lib_prefix=no\n      ;;\n    motorola)\n      need_lib_prefix=no\n      need_version=no\n      shlibpath_overrides_runpath=no\n      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'\n      ;;\n  esac\n  ;;\n\nsysv4*MP*)\n  if test -d /usr/nec ;then\n    version_type=linux\n    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'\n    soname_spec='$libname${shared_ext}.$major'\n    shlibpath_var=LD_LIBRARY_PATH\n  fi\n  ;;\n\nsysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)\n  version_type=freebsd-elf\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  if test \"$with_gnu_ld\" = yes; then\n    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'\n  else\n    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'\n    case $host_os in\n      sco3.2v5*)\n        sys_lib_search_path_spec=\"$sys_lib_search_path_spec /lib\"\n\t;;\n    esac\n  fi\n  sys_lib_dlsearch_path_spec='/usr/lib'\n  ;;\n\ntpf*)\n  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  ;;\n\nuts4*)\n  version_type=linux\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\n*)\n  dynamic_linker=no\n  ;;\nesac\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $dynamic_linker\" >&5\n$as_echo \"$dynamic_linker\" >&6; }\ntest \"$dynamic_linker\" = no && can_build_shared=no\n\nvariables_saved_for_relink=\"PATH $shlibpath_var $runpath_var\"\nif test \"$GCC\" = yes; then\n  variables_saved_for_relink=\"$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH\"\nfi\n\nif test \"${lt_cv_sys_lib_search_path_spec+set}\" = set; then\n  sys_lib_search_path_spec=\"$lt_cv_sys_lib_search_path_spec\"\nfi\nif test \"${lt_cv_sys_lib_dlsearch_path_spec+set}\" = set; then\n  sys_lib_dlsearch_path_spec=\"$lt_cv_sys_lib_dlsearch_path_spec\"\nfi\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs\" >&5\n$as_echo_n \"checking how to hardcode library paths into programs... \" >&6; }\nhardcode_action=\nif test -n \"$hardcode_libdir_flag_spec\" ||\n   test -n \"$runpath_var\" ||\n   test \"X$hardcode_automatic\" = \"Xyes\" ; then\n\n  # We can hardcode non-existent directories.\n  if test \"$hardcode_direct\" != no &&\n     # If the only mechanism to avoid hardcoding is shlibpath_var, we\n     # have to relink, otherwise we might link with an installed library\n     # when we should be linking with a yet-to-be-installed one\n     ## test \"$_LT_TAGVAR(hardcode_shlibpath_var, )\" != no &&\n     test \"$hardcode_minus_L\" != no; then\n    # Linking always hardcodes the temporary library directory.\n    hardcode_action=relink\n  else\n    # We can link without hardcoding, and we can hardcode nonexisting dirs.\n    hardcode_action=immediate\n  fi\nelse\n  # We cannot hardcode anything, or else we can only hardcode existing\n  # directories.\n  hardcode_action=unsupported\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $hardcode_action\" >&5\n$as_echo \"$hardcode_action\" >&6; }\n\nif test \"$hardcode_action\" = relink ||\n   test \"$inherit_rpath\" = yes; then\n  # Fast installation is not supported\n  enable_fast_install=no\nelif test \"$shlibpath_overrides_runpath\" = yes ||\n     test \"$enable_shared\" = no; then\n  # Fast installation is not necessary\n  enable_fast_install=needless\nfi\n\n\n\n\n\n\n  if test \"x$enable_dlopen\" != xyes; then\n  enable_dlopen=unknown\n  enable_dlopen_self=unknown\n  enable_dlopen_self_static=unknown\nelse\n  lt_cv_dlopen=no\n  lt_cv_dlopen_libs=\n\n  case $host_os in\n  beos*)\n    lt_cv_dlopen=\"load_add_on\"\n    lt_cv_dlopen_libs=\n    lt_cv_dlopen_self=yes\n    ;;\n\n  mingw* | pw32* | cegcc*)\n    lt_cv_dlopen=\"LoadLibrary\"\n    lt_cv_dlopen_libs=\n    ;;\n\n  cygwin*)\n    lt_cv_dlopen=\"dlopen\"\n    lt_cv_dlopen_libs=\n    ;;\n\n  darwin*)\n  # if libdl is installed we need to link against it\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl\" >&5\n$as_echo_n \"checking for dlopen in -ldl... \" >&6; }\nif test \"${ac_cv_lib_dl_dlopen+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-ldl  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar dlopen ();\nint\nmain ()\n{\nreturn dlopen ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_dl_dlopen=yes\nelse\n  ac_cv_lib_dl_dlopen=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen\" >&5\n$as_echo \"$ac_cv_lib_dl_dlopen\" >&6; }\nif test \"x$ac_cv_lib_dl_dlopen\" = x\"\"yes; then :\n  lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-ldl\"\nelse\n\n    lt_cv_dlopen=\"dyld\"\n    lt_cv_dlopen_libs=\n    lt_cv_dlopen_self=yes\n\nfi\n\n    ;;\n\n  *)\n    ac_fn_c_check_func \"$LINENO\" \"shl_load\" \"ac_cv_func_shl_load\"\nif test \"x$ac_cv_func_shl_load\" = x\"\"yes; then :\n  lt_cv_dlopen=\"shl_load\"\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld\" >&5\n$as_echo_n \"checking for shl_load in -ldld... \" >&6; }\nif test \"${ac_cv_lib_dld_shl_load+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-ldld  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar shl_load ();\nint\nmain ()\n{\nreturn shl_load ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_dld_shl_load=yes\nelse\n  ac_cv_lib_dld_shl_load=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load\" >&5\n$as_echo \"$ac_cv_lib_dld_shl_load\" >&6; }\nif test \"x$ac_cv_lib_dld_shl_load\" = x\"\"yes; then :\n  lt_cv_dlopen=\"shl_load\" lt_cv_dlopen_libs=\"-ldld\"\nelse\n  ac_fn_c_check_func \"$LINENO\" \"dlopen\" \"ac_cv_func_dlopen\"\nif test \"x$ac_cv_func_dlopen\" = x\"\"yes; then :\n  lt_cv_dlopen=\"dlopen\"\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl\" >&5\n$as_echo_n \"checking for dlopen in -ldl... \" >&6; }\nif test \"${ac_cv_lib_dl_dlopen+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-ldl  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar dlopen ();\nint\nmain ()\n{\nreturn dlopen ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_dl_dlopen=yes\nelse\n  ac_cv_lib_dl_dlopen=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen\" >&5\n$as_echo \"$ac_cv_lib_dl_dlopen\" >&6; }\nif test \"x$ac_cv_lib_dl_dlopen\" = x\"\"yes; then :\n  lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-ldl\"\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld\" >&5\n$as_echo_n \"checking for dlopen in -lsvld... \" >&6; }\nif test \"${ac_cv_lib_svld_dlopen+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lsvld  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar dlopen ();\nint\nmain ()\n{\nreturn dlopen ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_svld_dlopen=yes\nelse\n  ac_cv_lib_svld_dlopen=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen\" >&5\n$as_echo \"$ac_cv_lib_svld_dlopen\" >&6; }\nif test \"x$ac_cv_lib_svld_dlopen\" = x\"\"yes; then :\n  lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-lsvld\"\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld\" >&5\n$as_echo_n \"checking for dld_link in -ldld... \" >&6; }\nif test \"${ac_cv_lib_dld_dld_link+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-ldld  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar dld_link ();\nint\nmain ()\n{\nreturn dld_link ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_dld_dld_link=yes\nelse\n  ac_cv_lib_dld_dld_link=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link\" >&5\n$as_echo \"$ac_cv_lib_dld_dld_link\" >&6; }\nif test \"x$ac_cv_lib_dld_dld_link\" = x\"\"yes; then :\n  lt_cv_dlopen=\"dld_link\" lt_cv_dlopen_libs=\"-ldld\"\nfi\n\n\nfi\n\n\nfi\n\n\nfi\n\n\nfi\n\n\nfi\n\n    ;;\n  esac\n\n  if test \"x$lt_cv_dlopen\" != xno; then\n    enable_dlopen=yes\n  else\n    enable_dlopen=no\n  fi\n\n  case $lt_cv_dlopen in\n  dlopen)\n    save_CPPFLAGS=\"$CPPFLAGS\"\n    test \"x$ac_cv_header_dlfcn_h\" = xyes && CPPFLAGS=\"$CPPFLAGS -DHAVE_DLFCN_H\"\n\n    save_LDFLAGS=\"$LDFLAGS\"\n    wl=$lt_prog_compiler_wl eval LDFLAGS=\\\"\\$LDFLAGS $export_dynamic_flag_spec\\\"\n\n    save_LIBS=\"$LIBS\"\n    LIBS=\"$lt_cv_dlopen_libs $LIBS\"\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself\" >&5\n$as_echo_n \"checking whether a program can dlopen itself... \" >&6; }\nif test \"${lt_cv_dlopen_self+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  \t  if test \"$cross_compiling\" = yes; then :\n  lt_cv_dlopen_self=cross\nelse\n  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2\n  lt_status=$lt_dlunknown\n  cat > conftest.$ac_ext <<_LT_EOF\n#line 10317 \"configure\"\n#include \"confdefs.h\"\n\n#if HAVE_DLFCN_H\n#include <dlfcn.h>\n#endif\n\n#include <stdio.h>\n\n#ifdef RTLD_GLOBAL\n#  define LT_DLGLOBAL\t\tRTLD_GLOBAL\n#else\n#  ifdef DL_GLOBAL\n#    define LT_DLGLOBAL\t\tDL_GLOBAL\n#  else\n#    define LT_DLGLOBAL\t\t0\n#  endif\n#endif\n\n/* We may have to define LT_DLLAZY_OR_NOW in the command line if we\n   find out it does not work in some platform. */\n#ifndef LT_DLLAZY_OR_NOW\n#  ifdef RTLD_LAZY\n#    define LT_DLLAZY_OR_NOW\t\tRTLD_LAZY\n#  else\n#    ifdef DL_LAZY\n#      define LT_DLLAZY_OR_NOW\t\tDL_LAZY\n#    else\n#      ifdef RTLD_NOW\n#        define LT_DLLAZY_OR_NOW\tRTLD_NOW\n#      else\n#        ifdef DL_NOW\n#          define LT_DLLAZY_OR_NOW\tDL_NOW\n#        else\n#          define LT_DLLAZY_OR_NOW\t0\n#        endif\n#      endif\n#    endif\n#  endif\n#endif\n\nvoid fnord() { int i=42;}\nint main ()\n{\n  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);\n  int status = $lt_dlunknown;\n\n  if (self)\n    {\n      if (dlsym (self,\"fnord\"))       status = $lt_dlno_uscore;\n      else if (dlsym( self,\"_fnord\")) status = $lt_dlneed_uscore;\n      /* dlclose (self); */\n    }\n  else\n    puts (dlerror ());\n\n  return status;\n}\n_LT_EOF\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_link\\\"\"; } >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then\n    (./conftest; exit; ) >&5 2>/dev/null\n    lt_status=$?\n    case x$lt_status in\n      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;\n      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;\n      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;\n    esac\n  else :\n    # compilation failed\n    lt_cv_dlopen_self=no\n  fi\nfi\nrm -fr conftest*\n\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self\" >&5\n$as_echo \"$lt_cv_dlopen_self\" >&6; }\n\n    if test \"x$lt_cv_dlopen_self\" = xyes; then\n      wl=$lt_prog_compiler_wl eval LDFLAGS=\\\"\\$LDFLAGS $lt_prog_compiler_static\\\"\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself\" >&5\n$as_echo_n \"checking whether a statically linked program can dlopen itself... \" >&6; }\nif test \"${lt_cv_dlopen_self_static+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  \t  if test \"$cross_compiling\" = yes; then :\n  lt_cv_dlopen_self_static=cross\nelse\n  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2\n  lt_status=$lt_dlunknown\n  cat > conftest.$ac_ext <<_LT_EOF\n#line 10413 \"configure\"\n#include \"confdefs.h\"\n\n#if HAVE_DLFCN_H\n#include <dlfcn.h>\n#endif\n\n#include <stdio.h>\n\n#ifdef RTLD_GLOBAL\n#  define LT_DLGLOBAL\t\tRTLD_GLOBAL\n#else\n#  ifdef DL_GLOBAL\n#    define LT_DLGLOBAL\t\tDL_GLOBAL\n#  else\n#    define LT_DLGLOBAL\t\t0\n#  endif\n#endif\n\n/* We may have to define LT_DLLAZY_OR_NOW in the command line if we\n   find out it does not work in some platform. */\n#ifndef LT_DLLAZY_OR_NOW\n#  ifdef RTLD_LAZY\n#    define LT_DLLAZY_OR_NOW\t\tRTLD_LAZY\n#  else\n#    ifdef DL_LAZY\n#      define LT_DLLAZY_OR_NOW\t\tDL_LAZY\n#    else\n#      ifdef RTLD_NOW\n#        define LT_DLLAZY_OR_NOW\tRTLD_NOW\n#      else\n#        ifdef DL_NOW\n#          define LT_DLLAZY_OR_NOW\tDL_NOW\n#        else\n#          define LT_DLLAZY_OR_NOW\t0\n#        endif\n#      endif\n#    endif\n#  endif\n#endif\n\nvoid fnord() { int i=42;}\nint main ()\n{\n  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);\n  int status = $lt_dlunknown;\n\n  if (self)\n    {\n      if (dlsym (self,\"fnord\"))       status = $lt_dlno_uscore;\n      else if (dlsym( self,\"_fnord\")) status = $lt_dlneed_uscore;\n      /* dlclose (self); */\n    }\n  else\n    puts (dlerror ());\n\n  return status;\n}\n_LT_EOF\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_link\\\"\"; } >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then\n    (./conftest; exit; ) >&5 2>/dev/null\n    lt_status=$?\n    case x$lt_status in\n      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;\n      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;\n      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;\n    esac\n  else :\n    # compilation failed\n    lt_cv_dlopen_self_static=no\n  fi\nfi\nrm -fr conftest*\n\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static\" >&5\n$as_echo \"$lt_cv_dlopen_self_static\" >&6; }\n    fi\n\n    CPPFLAGS=\"$save_CPPFLAGS\"\n    LDFLAGS=\"$save_LDFLAGS\"\n    LIBS=\"$save_LIBS\"\n    ;;\n  esac\n\n  case $lt_cv_dlopen_self in\n  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;\n  *) enable_dlopen_self=unknown ;;\n  esac\n\n  case $lt_cv_dlopen_self_static in\n  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;\n  *) enable_dlopen_self_static=unknown ;;\n  esac\nfi\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nstriplib=\nold_striplib=\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible\" >&5\n$as_echo_n \"checking whether stripping libraries is possible... \" >&6; }\nif test -n \"$STRIP\" && $STRIP -V 2>&1 | $GREP \"GNU strip\" >/dev/null; then\n  test -z \"$old_striplib\" && old_striplib=\"$STRIP --strip-debug\"\n  test -z \"$striplib\" && striplib=\"$STRIP --strip-unneeded\"\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nelse\n# FIXME - insert some real tests, host_os isn't really good enough\n  case $host_os in\n  darwin*)\n    if test -n \"$STRIP\" ; then\n      striplib=\"$STRIP -x\"\n      old_striplib=\"$STRIP -S\"\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n    else\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n    fi\n    ;;\n  *)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n    ;;\n  esac\nfi\n\n\n\n\n\n\n\n\n\n\n\n\n  # Report which library types will actually be built\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries\" >&5\n$as_echo_n \"checking if libtool supports shared libraries... \" >&6; }\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $can_build_shared\" >&5\n$as_echo \"$can_build_shared\" >&6; }\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries\" >&5\n$as_echo_n \"checking whether to build shared libraries... \" >&6; }\n  test \"$can_build_shared\" = \"no\" && enable_shared=no\n\n  # On AIX, shared libraries and static libraries use the same namespace, and\n  # are all built from PIC.\n  case $host_os in\n  aix3*)\n    test \"$enable_shared\" = yes && enable_static=no\n    if test -n \"$RANLIB\"; then\n      archive_cmds=\"$archive_cmds~\\$RANLIB \\$lib\"\n      postinstall_cmds='$RANLIB $lib'\n    fi\n    ;;\n\n  aix[4-9]*)\n    if test \"$host_cpu\" != ia64 && test \"$aix_use_runtimelinking\" = no ; then\n      test \"$enable_shared\" = yes && enable_static=no\n    fi\n    ;;\n  esac\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $enable_shared\" >&5\n$as_echo \"$enable_shared\" >&6; }\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether to build static libraries\" >&5\n$as_echo_n \"checking whether to build static libraries... \" >&6; }\n  # Make sure either enable_shared or enable_static is yes.\n  test \"$enable_shared\" = yes || enable_static=yes\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $enable_static\" >&5\n$as_echo \"$enable_static\" >&6; }\n\n\n\n\nfi\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\nCC=\"$lt_save_CC\"\n\n\n\n\n\n\n\n\n\n\n\n\n\n        ac_config_commands=\"$ac_config_commands libtool\"\n\n\n\n\n# Only expand once:\n\n\nif test \"x$CC\" != xcc; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together\" >&5\n$as_echo_n \"checking whether $CC and cc understand -c and -o together... \" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together\" >&5\n$as_echo_n \"checking whether cc understands -c and -o together... \" >&6; }\nfi\nset dummy $CC; ac_cc=`$as_echo \"$2\" |\n\t\t      sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'`\nif { as_var=ac_cv_prog_cc_${ac_cc}_c_o; eval \"test \\\"\\${$as_var+set}\\\" = set\"; }; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\n# Make sure it works both with $CC and with simple cc.\n# We do the test twice because some compilers refuse to overwrite an\n# existing .o file with -o, though they will create one.\nac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5'\nrm -f conftest2.*\nif { { case \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_try\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } &&\n   test -f conftest2.$ac_objext && { { case \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_try\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; };\nthen\n  eval ac_cv_prog_cc_${ac_cc}_c_o=yes\n  if test \"x$CC\" != xcc; then\n    # Test first that cc exists at all.\n    if { ac_try='cc -c conftest.$ac_ext >&5'\n  { { case \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_try\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; }; then\n      ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5'\n      rm -f conftest2.*\n      if { { case \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_try\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } &&\n\t test -f conftest2.$ac_objext && { { case \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_try\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; };\n      then\n\t# cc works too.\n\t:\n      else\n\t# cc exists but doesn't like -o.\n\teval ac_cv_prog_cc_${ac_cc}_c_o=no\n      fi\n    fi\n  fi\nelse\n  eval ac_cv_prog_cc_${ac_cc}_c_o=no\nfi\nrm -f core conftest*\n\nfi\nif eval test \\$ac_cv_prog_cc_${ac_cc}_c_o = yes; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n\n$as_echo \"#define NO_MINUS_C_MINUS_O 1\" >>confdefs.h\n\nfi\n\n# FIXME: we rely on the cache variable name because\n# there is no other way.\nset dummy $CC\nam_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'`\neval am_t=\\$ac_cv_prog_cc_${am_cc}_c_o\nif test \"$am_t\" != yes; then\n   # Losing compiler, so override with the script.\n   # FIXME: It is wrong to rewrite CC.\n   # But if we don't then we get into trouble of one sort or another.\n   # A longer-term fix would be to have automake use am__CC in this case,\n   # and then we could set am__CC=\"\\$(top_srcdir)/compile \\$(CC)\"\n   CC=\"$am_aux_dir/compile $CC\"\nfi\n\n\nLTVERSION=\"5:0:5\"\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \\$(MAKE)\" >&5\n$as_echo_n \"checking whether ${MAKE-make} sets \\$(MAKE)... \" >&6; }\nset x ${MAKE-make}\nac_make=`$as_echo \"$2\" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`\nif { as_var=ac_cv_prog_make_${ac_make}_set; eval \"test \\\"\\${$as_var+set}\\\" = set\"; }; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat >conftest.make <<\\_ACEOF\nSHELL = /bin/sh\nall:\n\t@echo '@@@%%%=$(MAKE)=@@@%%%'\n_ACEOF\n# GNU make sometimes prints \"make[1]: Entering...\", which would confuse us.\ncase `${MAKE-make} -f conftest.make 2>/dev/null` in\n  *@@@%%%=?*=@@@%%%*)\n    eval ac_cv_prog_make_${ac_make}_set=yes;;\n  *)\n    eval ac_cv_prog_make_${ac_make}_set=no;;\nesac\nrm -f conftest.make\nfi\nif eval test \\$ac_cv_prog_make_${ac_make}_set = yes; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n  SET_MAKE=\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n  SET_MAKE=\"MAKE=${MAKE-make}\"\nfi\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for ANSI C header files\" >&5\n$as_echo_n \"checking for ANSI C header files... \" >&6; }\nif test \"${ac_cv_header_stdc+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdlib.h>\n#include <stdarg.h>\n#include <string.h>\n#include <float.h>\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_header_stdc=yes\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\nif test $ac_cv_header_stdc = yes; then\n  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <string.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"memchr\" >/dev/null 2>&1; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f conftest*\n\nfi\n\nif test $ac_cv_header_stdc = yes; then\n  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdlib.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"free\" >/dev/null 2>&1; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f conftest*\n\nfi\n\nif test $ac_cv_header_stdc = yes; then\n  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.\n  if test \"$cross_compiling\" = yes; then :\n  :\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ctype.h>\n#include <stdlib.h>\n#if ((' ' & 0x0FF) == 0x020)\n# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')\n# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))\n#else\n# define ISLOWER(c) \\\n\t\t   (('a' <= (c) && (c) <= 'i') \\\n\t\t     || ('j' <= (c) && (c) <= 'r') \\\n\t\t     || ('s' <= (c) && (c) <= 'z'))\n# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))\n#endif\n\n#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))\nint\nmain ()\n{\n  int i;\n  for (i = 0; i < 256; i++)\n    if (XOR (islower (i), ISLOWER (i))\n\t|| toupper (i) != TOUPPER (i))\n      return 2;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_run \"$LINENO\"; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \\\n  conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\n\nfi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc\" >&5\n$as_echo \"$ac_cv_header_stdc\" >&6; }\nif test $ac_cv_header_stdc = yes; then\n\n$as_echo \"#define STDC_HEADERS 1\" >>confdefs.h\n\nfi\n\nfor ac_header in stdlib.h string.h strings.h sys/time.h unistd.h sys/times.h stdint.h\ndo :\n  as_ac_Header=`$as_echo \"ac_cv_header_$ac_header\" | $as_tr_sh`\nac_fn_c_check_header_mongrel \"$LINENO\" \"$ac_header\" \"$as_ac_Header\" \"$ac_includes_default\"\neval as_val=\\$$as_ac_Header\n   if test \"x$as_val\" = x\"\"yes; then :\n  cat >>confdefs.h <<_ACEOF\n#define `$as_echo \"HAVE_$ac_header\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\n\ndone\n\n\n# The cast to long int works around a bug in the HP C Compiler\n# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects\n# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.\n# This bug is HP SR number 8606223364.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking size of int\" >&5\n$as_echo_n \"checking size of int... \" >&6; }\nif test \"${ac_cv_sizeof_int+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if ac_fn_c_compute_int \"$LINENO\" \"(long int) (sizeof (int))\" \"ac_cv_sizeof_int\"        \"$ac_includes_default\"; then :\n\nelse\n  if test \"$ac_cv_type_int\" = yes; then\n     { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\n{ as_fn_set_status 77\nas_fn_error \"cannot compute sizeof (int)\nSee \\`config.log' for more details.\" \"$LINENO\" 5; }; }\n   else\n     ac_cv_sizeof_int=0\n   fi\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int\" >&5\n$as_echo \"$ac_cv_sizeof_int\" >&6; }\n\n\n\ncat >>confdefs.h <<_ACEOF\n#define SIZEOF_INT $ac_cv_sizeof_int\n_ACEOF\n\n\n# The cast to long int works around a bug in the HP C Compiler\n# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects\n# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.\n# This bug is HP SR number 8606223364.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking size of short\" >&5\n$as_echo_n \"checking size of short... \" >&6; }\nif test \"${ac_cv_sizeof_short+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if ac_fn_c_compute_int \"$LINENO\" \"(long int) (sizeof (short))\" \"ac_cv_sizeof_short\"        \"$ac_includes_default\"; then :\n\nelse\n  if test \"$ac_cv_type_short\" = yes; then\n     { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\n{ as_fn_set_status 77\nas_fn_error \"cannot compute sizeof (short)\nSee \\`config.log' for more details.\" \"$LINENO\" 5; }; }\n   else\n     ac_cv_sizeof_short=0\n   fi\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short\" >&5\n$as_echo \"$ac_cv_sizeof_short\" >&6; }\n\n\n\ncat >>confdefs.h <<_ACEOF\n#define SIZEOF_SHORT $ac_cv_sizeof_short\n_ACEOF\n\n\n# The cast to long int works around a bug in the HP C Compiler\n# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects\n# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'.\n# This bug is HP SR number 8606223364.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking size of long\" >&5\n$as_echo_n \"checking size of long... \" >&6; }\nif test \"${ac_cv_sizeof_long+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if ac_fn_c_compute_int \"$LINENO\" \"(long int) (sizeof (long))\" \"ac_cv_sizeof_long\"        \"$ac_includes_default\"; then :\n\nelse\n  if test \"$ac_cv_type_long\" = yes; then\n     { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\n{ as_fn_set_status 77\nas_fn_error \"cannot compute sizeof (long)\nSee \\`config.log' for more details.\" \"$LINENO\" 5; }; }\n   else\n     ac_cv_sizeof_long=0\n   fi\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long\" >&5\n$as_echo \"$ac_cv_sizeof_long\" >&6; }\n\n\n\ncat >>confdefs.h <<_ACEOF\n#define SIZEOF_LONG $ac_cv_sizeof_long\n_ACEOF\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const\" >&5\n$as_echo_n \"checking for an ANSI C-conforming const... \" >&6; }\nif test \"${ac_cv_c_const+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n/* FIXME: Include the comments suggested by Paul. */\n#ifndef __cplusplus\n  /* Ultrix mips cc rejects this.  */\n  typedef int charset[2];\n  const charset cs;\n  /* SunOS 4.1.1 cc rejects this.  */\n  char const *const *pcpcc;\n  char **ppc;\n  /* NEC SVR4.0.2 mips cc rejects this.  */\n  struct point {int x, y;};\n  static struct point const zero = {0,0};\n  /* AIX XL C 1.02.0.0 rejects this.\n     It does not let you subtract one const X* pointer from another in\n     an arm of an if-expression whose if-part is not a constant\n     expression */\n  const char *g = \"string\";\n  pcpcc = &g + (g ? g-g : 0);\n  /* HPUX 7.0 cc rejects these. */\n  ++pcpcc;\n  ppc = (char**) pcpcc;\n  pcpcc = (char const *const *) ppc;\n  { /* SCO 3.2v4 cc rejects this.  */\n    char *t;\n    char const *s = 0 ? (char *) 0 : (char const *) 0;\n\n    *t++ = 0;\n    if (s) return 0;\n  }\n  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */\n    int x[] = {25, 17};\n    const int *foo = &x[0];\n    ++foo;\n  }\n  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */\n    typedef const int *iptr;\n    iptr p = 0;\n    ++p;\n  }\n  { /* AIX XL C 1.02.0.0 rejects this saying\n       \"k.c\", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */\n    struct s { int j; const int *ap[3]; };\n    struct s *b; b->j = 5;\n  }\n  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */\n    const int foo = 10;\n    if (!foo) return 0;\n  }\n  return !cs[0] && !zero.x;\n#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_c_const=yes\nelse\n  ac_cv_c_const=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const\" >&5\n$as_echo \"$ac_cv_c_const\" >&6; }\nif test $ac_cv_c_const = no; then\n\n$as_echo \"#define const /**/\" >>confdefs.h\n\nfi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included\" >&5\n$as_echo_n \"checking whether time.h and sys/time.h may both be included... \" >&6; }\nif test \"${ac_cv_header_time+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <sys/types.h>\n#include <sys/time.h>\n#include <time.h>\n\nint\nmain ()\n{\nif ((struct tm *) 0)\nreturn 0;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_header_time=yes\nelse\n  ac_cv_header_time=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time\" >&5\n$as_echo \"$ac_cv_header_time\" >&6; }\nif test $ac_cv_header_time = yes; then\n\n$as_echo \"#define TIME_WITH_SYS_TIME 1\" >>confdefs.h\n\nfi\n\n\n# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works\n# for constant arguments.  Useless!\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for working alloca.h\" >&5\n$as_echo_n \"checking for working alloca.h... \" >&6; }\nif test \"${ac_cv_working_alloca_h+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <alloca.h>\nint\nmain ()\n{\nchar *p = (char *) alloca (2 * sizeof (int));\n\t\t\t  if (p) return 0;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_working_alloca_h=yes\nelse\n  ac_cv_working_alloca_h=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h\" >&5\n$as_echo \"$ac_cv_working_alloca_h\" >&6; }\nif test $ac_cv_working_alloca_h = yes; then\n\n$as_echo \"#define HAVE_ALLOCA_H 1\" >>confdefs.h\n\nfi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for alloca\" >&5\n$as_echo_n \"checking for alloca... \" >&6; }\nif test \"${ac_cv_func_alloca_works+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifdef __GNUC__\n# define alloca __builtin_alloca\n#else\n# ifdef _MSC_VER\n#  include <malloc.h>\n#  define alloca _alloca\n# else\n#  ifdef HAVE_ALLOCA_H\n#   include <alloca.h>\n#  else\n#   ifdef _AIX\n #pragma alloca\n#   else\n#    ifndef alloca /* predefined by HP cc +Olibcalls */\nchar *alloca ();\n#    endif\n#   endif\n#  endif\n# endif\n#endif\n\nint\nmain ()\n{\nchar *p = (char *) alloca (1);\n\t\t\t\t    if (p) return 0;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_func_alloca_works=yes\nelse\n  ac_cv_func_alloca_works=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works\" >&5\n$as_echo \"$ac_cv_func_alloca_works\" >&6; }\n\nif test $ac_cv_func_alloca_works = yes; then\n\n$as_echo \"#define HAVE_ALLOCA 1\" >>confdefs.h\n\nelse\n  # The SVR3 libPW and SVR4 libucb both contain incompatible functions\n# that cause trouble.  Some versions do not even contain alloca or\n# contain a buggy version.  If you still want to use their alloca,\n# use ar to extract alloca.o from them instead of compiling alloca.c.\n\nALLOCA=\\${LIBOBJDIR}alloca.$ac_objext\n\n$as_echo \"#define C_ALLOCA 1\" >>confdefs.h\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether \\`alloca.c' needs Cray hooks\" >&5\n$as_echo_n \"checking whether \\`alloca.c' needs Cray hooks... \" >&6; }\nif test \"${ac_cv_os_cray+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#if defined CRAY && ! defined CRAY2\nwebecray\n#else\nwenotbecray\n#endif\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"webecray\" >/dev/null 2>&1; then :\n  ac_cv_os_cray=yes\nelse\n  ac_cv_os_cray=no\nfi\nrm -f conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray\" >&5\n$as_echo \"$ac_cv_os_cray\" >&6; }\nif test $ac_cv_os_cray = yes; then\n  for ac_func in _getb67 GETB67 getb67; do\n    as_ac_var=`$as_echo \"ac_cv_func_$ac_func\" | $as_tr_sh`\nac_fn_c_check_func \"$LINENO\" \"$ac_func\" \"$as_ac_var\"\neval as_val=\\$$as_ac_var\n   if test \"x$as_val\" = x\"\"yes; then :\n\ncat >>confdefs.h <<_ACEOF\n#define CRAY_STACKSEG_END $ac_func\n_ACEOF\n\n    break\nfi\n\n  done\nfi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca\" >&5\n$as_echo_n \"checking stack direction for C alloca... \" >&6; }\nif test \"${ac_cv_c_stack_direction+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test \"$cross_compiling\" = yes; then :\n  ac_cv_c_stack_direction=0\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nfind_stack_direction ()\n{\n  static char *addr = 0;\n  auto char dummy;\n  if (addr == 0)\n    {\n      addr = &dummy;\n      return find_stack_direction ();\n    }\n  else\n    return (&dummy > addr) ? 1 : -1;\n}\n\nint\nmain ()\n{\n  return find_stack_direction () < 0;\n}\n_ACEOF\nif ac_fn_c_try_run \"$LINENO\"; then :\n  ac_cv_c_stack_direction=1\nelse\n  ac_cv_c_stack_direction=-1\nfi\nrm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \\\n  conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction\" >&5\n$as_echo \"$ac_cv_c_stack_direction\" >&6; }\ncat >>confdefs.h <<_ACEOF\n#define STACK_DIRECTION $ac_cv_c_stack_direction\n_ACEOF\n\n\nfi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for working memcmp\" >&5\n$as_echo_n \"checking for working memcmp... \" >&6; }\nif test \"${ac_cv_func_memcmp_working+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test \"$cross_compiling\" = yes; then :\n  ac_cv_func_memcmp_working=no\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain ()\n{\n\n  /* Some versions of memcmp are not 8-bit clean.  */\n  char c0 = '\\100', c1 = '\\200', c2 = '\\201';\n  if (memcmp(&c0, &c2, 1) >= 0 || memcmp(&c1, &c2, 1) >= 0)\n    return 1;\n\n  /* The Next x86 OpenStep bug shows up only when comparing 16 bytes\n     or more and with at least one buffer not starting on a 4-byte boundary.\n     William Lewis provided this test program.   */\n  {\n    char foo[21];\n    char bar[21];\n    int i;\n    for (i = 0; i < 4; i++)\n      {\n\tchar *a = foo + i;\n\tchar *b = bar + i;\n\tstrcpy (a, \"--------01111111\");\n\tstrcpy (b, \"--------10000000\");\n\tif (memcmp (a, b, 16) >= 0)\n\t  return 1;\n      }\n    return 0;\n  }\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_run \"$LINENO\"; then :\n  ac_cv_func_memcmp_working=yes\nelse\n  ac_cv_func_memcmp_working=no\nfi\nrm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \\\n  conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_memcmp_working\" >&5\n$as_echo \"$ac_cv_func_memcmp_working\" >&6; }\ntest $ac_cv_func_memcmp_working = no && case \" $LIBOBJS \" in\n  *\" memcmp.$ac_objext \"* ) ;;\n  *) LIBOBJS=\"$LIBOBJS memcmp.$ac_objext\"\n ;;\nesac\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for prototypes\" >&5\n$as_echo_n \"checking for prototypes... \" >&6; }\nif test \"${_cv_have_prototypes+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\nint foo(int x) { return 0; }\nint\nmain ()\n{\nreturn foo(10);\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  _cv_have_prototypes=yes\nelse\n  _cv_have_prototypes=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $_cv_have_prototypes\" >&5\n$as_echo \"$_cv_have_prototypes\" >&6; }\nif test \"$_cv_have_prototypes\" = yes; then\n\n$as_echo \"#define HAVE_PROTOTYPES 1\" >>confdefs.h\n\nfi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for variable length prototypes and stdarg.h\" >&5\n$as_echo_n \"checking for variable length prototypes and stdarg.h... \" >&6; }\nif test \"${_cv_stdarg+set}\" = set; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n#include <stdarg.h>\nint foo(int x, ...) {\n\tva_list va;\n\tva_start(va, x);\n\tva_arg(va, int);\n\tva_arg(va, char *);\n\tva_arg(va, double);\n\tva_end(va);\n\treturn 0;\n}\n\nint\nmain ()\n{\nreturn foo(10, \"\", 3.14);\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  _cv_stdarg=yes\nelse\n  _cv_stdarg=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $_cv_stdarg\" >&5\n$as_echo \"$_cv_stdarg\" >&6; }\nif test \"$_cv_stdarg\" = yes; then\n\n$as_echo \"#define HAVE_STDARG_PROTOTYPES 1\" >>confdefs.h\n\nfi\n\n\nac_config_files=\"$ac_config_files Makefile onig-config sample/Makefile\"\n\nac_config_commands=\"$ac_config_commands default\"\n\ncat >confcache <<\\_ACEOF\n# This file is a shell script that caches the results of configure\n# tests run on this system so they can be shared between configure\n# scripts and configure runs, see configure's option --config-cache.\n# It is not useful on other systems.  If it contains results you don't\n# want to keep, you may remove or edit it.\n#\n# config.status only pays attention to the cache file if you give it\n# the --recheck option to rerun configure.\n#\n# `ac_cv_env_foo' variables (set or unset) will be overridden when\n# loading this file, other *unset* `ac_cv_foo' will be assigned the\n# following values.\n\n_ACEOF\n\n# The following way of writing the cache mishandles newlines in values,\n# but we know of no workaround that is simple, portable, and efficient.\n# So, we kill variables containing newlines.\n# Ultrix sh set writes to stderr and can't be redirected directly,\n# and sets the high bit in the cache file unless we assign to the vars.\n(\n  for ac_var in `(set) 2>&1 | sed -n 's/^\\([a-zA-Z_][a-zA-Z0-9_]*\\)=.*/\\1/p'`; do\n    eval ac_val=\\$$ac_var\n    case $ac_val in #(\n    *${as_nl}*)\n      case $ac_var in #(\n      *_cv_*) { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline\" >&5\n$as_echo \"$as_me: WARNING: cache variable $ac_var contains a newline\" >&2;} ;;\n      esac\n      case $ac_var in #(\n      _ | IFS | as_nl) ;; #(\n      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(\n      *) { eval $ac_var=; unset $ac_var;} ;;\n      esac ;;\n    esac\n  done\n\n  (set) 2>&1 |\n    case $as_nl`(ac_space=' '; set) 2>&1` in #(\n    *${as_nl}ac_space=\\ *)\n      # `set' does not quote correctly, so add quotes: double-quote\n      # substitution turns \\\\\\\\ into \\\\, and sed turns \\\\ into \\.\n      sed -n \\\n\t\"s/'/'\\\\\\\\''/g;\n\t  s/^\\\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\\\)=\\\\(.*\\\\)/\\\\1='\\\\2'/p\"\n      ;; #(\n    *)\n      # `set' quotes correctly as required by POSIX, so do not add quotes.\n      sed -n \"/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p\"\n      ;;\n    esac |\n    sort\n) |\n  sed '\n     /^ac_cv_env_/b end\n     t clear\n     :clear\n     s/^\\([^=]*\\)=\\(.*[{}].*\\)$/test \"${\\1+set}\" = set || &/\n     t end\n     s/^\\([^=]*\\)=\\(.*\\)$/\\1=${\\1=\\2}/\n     :end' >>confcache\nif diff \"$cache_file\" confcache >/dev/null 2>&1; then :; else\n  if test -w \"$cache_file\"; then\n    test \"x$cache_file\" != \"x/dev/null\" &&\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: updating cache $cache_file\" >&5\n$as_echo \"$as_me: updating cache $cache_file\" >&6;}\n    cat confcache >$cache_file\n  else\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file\" >&5\n$as_echo \"$as_me: not updating unwritable cache $cache_file\" >&6;}\n  fi\nfi\nrm -f confcache\n\ntest \"x$prefix\" = xNONE && prefix=$ac_default_prefix\n# Let make expand exec_prefix.\ntest \"x$exec_prefix\" = xNONE && exec_prefix='${prefix}'\n\nDEFS=-DHAVE_CONFIG_H\n\nac_libobjs=\nac_ltlibobjs=\nfor ac_i in : $LIBOBJS; do test \"x$ac_i\" = x: && continue\n  # 1. Remove the extension, and $U if already installed.\n  ac_script='s/\\$U\\././;s/\\.o$//;s/\\.obj$//'\n  ac_i=`$as_echo \"$ac_i\" | sed \"$ac_script\"`\n  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR\n  #    will be set to the directory where LIBOBJS objects are built.\n  as_fn_append ac_libobjs \" \\${LIBOBJDIR}$ac_i\\$U.$ac_objext\"\n  as_fn_append ac_ltlibobjs \" \\${LIBOBJDIR}$ac_i\"'$U.lo'\ndone\nLIBOBJS=$ac_libobjs\n\nLTLIBOBJS=$ac_ltlibobjs\n\n\n if test -n \"$EXEEXT\"; then\n  am__EXEEXT_TRUE=\n  am__EXEEXT_FALSE='#'\nelse\n  am__EXEEXT_TRUE='#'\n  am__EXEEXT_FALSE=\nfi\n\nif test -z \"${AMDEP_TRUE}\" && test -z \"${AMDEP_FALSE}\"; then\n  as_fn_error \"conditional \\\"AMDEP\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${am__fastdepCC_TRUE}\" && test -z \"${am__fastdepCC_FALSE}\"; then\n  as_fn_error \"conditional \\\"am__fastdepCC\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\n\n: ${CONFIG_STATUS=./config.status}\nac_write_fail=0\nac_clean_files_save=$ac_clean_files\nac_clean_files=\"$ac_clean_files $CONFIG_STATUS\"\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS\" >&5\n$as_echo \"$as_me: creating $CONFIG_STATUS\" >&6;}\nas_write_fail=0\ncat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1\n#! $SHELL\n# Generated by $as_me.\n# Run this file to recreate the current configuration.\n# Compiler output produced by configure, useful for debugging\n# configure, is in config.log if it exists.\n\ndebug=false\nac_cs_recheck=false\nac_cs_silent=false\n\nSHELL=\\${CONFIG_SHELL-$SHELL}\nexport SHELL\n_ASEOF\ncat >>$CONFIG_STATUS <<\\_ASEOF || as_write_fail=1\n## -------------------- ##\n## M4sh Initialization. ##\n## -------------------- ##\n\n# Be more Bourne compatible\nDUALCASE=1; export DUALCASE # for MKS sh\nif test -n \"${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\n  setopt NO_GLOB_SUBST\nelse\n  case `(set -o) 2>/dev/null` in #(\n  *posix*) :\n    set -o posix ;; #(\n  *) :\n     ;;\nesac\nfi\n\n\nas_nl='\n'\nexport as_nl\n# Printing a long string crashes Solaris 7 /usr/bin/printf.\nas_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo\n# Prefer a ksh shell builtin over an external printf program on Solaris,\n# but without wasting forks for bash or zsh.\nif test -z \"$BASH_VERSION$ZSH_VERSION\" \\\n    && (test \"X`print -r -- $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='print -r --'\n  as_echo_n='print -rn --'\nelif (test \"X`printf %s $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='printf %s\\n'\n  as_echo_n='printf %s'\nelse\n  if test \"X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`\" = \"X-n $as_echo\"; then\n    as_echo_body='eval /usr/ucb/echo -n \"$1$as_nl\"'\n    as_echo_n='/usr/ucb/echo -n'\n  else\n    as_echo_body='eval expr \"X$1\" : \"X\\\\(.*\\\\)\"'\n    as_echo_n_body='eval\n      arg=$1;\n      case $arg in #(\n      *\"$as_nl\"*)\n\texpr \"X$arg\" : \"X\\\\(.*\\\\)$as_nl\";\n\targ=`expr \"X$arg\" : \".*$as_nl\\\\(.*\\\\)\"`;;\n      esac;\n      expr \"X$arg\" : \"X\\\\(.*\\\\)\" | tr -d \"$as_nl\"\n    '\n    export as_echo_n_body\n    as_echo_n='sh -c $as_echo_n_body as_echo'\n  fi\n  export as_echo_body\n  as_echo='sh -c $as_echo_body as_echo'\nfi\n\n# The user is always right.\nif test \"${PATH_SEPARATOR+set}\" != set; then\n  PATH_SEPARATOR=:\n  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {\n    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||\n      PATH_SEPARATOR=';'\n  }\nfi\n\n\n# IFS\n# We need space, tab and new line, in precisely that order.  Quoting is\n# there to prevent editors from complaining about space-tab.\n# (If _AS_PATH_WALK were called with IFS unset, it would disable word\n# splitting by setting IFS to empty value.)\nIFS=\" \"\"\t$as_nl\"\n\n# Find who we are.  Look in the path if we contain no directory separator.\ncase $0 in #((\n  *[\\\\/]* ) as_myself=$0 ;;\n  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    test -r \"$as_dir/$0\" && as_myself=$as_dir/$0 && break\n  done\nIFS=$as_save_IFS\n\n     ;;\nesac\n# We did not find ourselves, most probably we were run as `sh COMMAND'\n# in which case we are not to be found in the path.\nif test \"x$as_myself\" = x; then\n  as_myself=$0\nfi\nif test ! -f \"$as_myself\"; then\n  $as_echo \"$as_myself: error: cannot find myself; rerun with an absolute file name\" >&2\n  exit 1\nfi\n\n# Unset variables that we do not need and which cause bugs (e.g. in\n# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the \"|| exit 1\"\n# suppresses any \"Segmentation fault\" message there.  '((' could\n# trigger a bug in pdksh 5.2.14.\nfor as_var in BASH_ENV ENV MAIL MAILPATH\ndo eval test x\\${$as_var+set} = xset \\\n  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :\ndone\nPS1='$ '\nPS2='> '\nPS4='+ '\n\n# NLS nuisances.\nLC_ALL=C\nexport LC_ALL\nLANGUAGE=C\nexport LANGUAGE\n\n# CDPATH.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\n\n# as_fn_error ERROR [LINENO LOG_FD]\n# ---------------------------------\n# Output \"`basename $0`: error: ERROR\" to stderr. If LINENO and LOG_FD are\n# provided, also output the error to LOG_FD, referencing LINENO. Then exit the\n# script with status $?, using 1 if that was 0.\nas_fn_error ()\n{\n  as_status=$?; test $as_status -eq 0 && as_status=1\n  if test \"$3\"; then\n    as_lineno=${as_lineno-\"$2\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n    $as_echo \"$as_me:${as_lineno-$LINENO}: error: $1\" >&$3\n  fi\n  $as_echo \"$as_me: error: $1\" >&2\n  as_fn_exit $as_status\n} # as_fn_error\n\n\n# as_fn_set_status STATUS\n# -----------------------\n# Set $? to STATUS, without forking.\nas_fn_set_status ()\n{\n  return $1\n} # as_fn_set_status\n\n# as_fn_exit STATUS\n# -----------------\n# Exit the shell with STATUS, even in a \"trap 0\" or \"set -e\" context.\nas_fn_exit ()\n{\n  set +e\n  as_fn_set_status $1\n  exit $1\n} # as_fn_exit\n\n# as_fn_unset VAR\n# ---------------\n# Portably unset VAR.\nas_fn_unset ()\n{\n  { eval $1=; unset $1;}\n}\nas_unset=as_fn_unset\n# as_fn_append VAR VALUE\n# ----------------------\n# Append the text in VALUE to the end of the definition contained in VAR. Take\n# advantage of any shell optimizations that allow amortized linear growth over\n# repeated appends, instead of the typical quadratic growth present in naive\n# implementations.\nif (eval \"as_var=1; as_var+=2; test x\\$as_var = x12\") 2>/dev/null; then :\n  eval 'as_fn_append ()\n  {\n    eval $1+=\\$2\n  }'\nelse\n  as_fn_append ()\n  {\n    eval $1=\\$$1\\$2\n  }\nfi # as_fn_append\n\n# as_fn_arith ARG...\n# ------------------\n# Perform arithmetic evaluation on the ARGs, and store the result in the\n# global $as_val. Take advantage of shells that can avoid forks. The arguments\n# must be portable across $(()) and expr.\nif (eval \"test \\$(( 1 + 1 )) = 2\") 2>/dev/null; then :\n  eval 'as_fn_arith ()\n  {\n    as_val=$(( $* ))\n  }'\nelse\n  as_fn_arith ()\n  {\n    as_val=`expr \"$@\" || test $? -eq 1`\n  }\nfi # as_fn_arith\n\n\nif expr a : '\\(a\\)' >/dev/null 2>&1 &&\n   test \"X`expr 00001 : '.*\\(...\\)'`\" = X001; then\n  as_expr=expr\nelse\n  as_expr=false\nfi\n\nif (basename -- /) >/dev/null 2>&1 && test \"X`basename -- / 2>&1`\" = \"X/\"; then\n  as_basename=basename\nelse\n  as_basename=false\nfi\n\nif (as_dir=`dirname -- /` && test \"X$as_dir\" = X/) >/dev/null 2>&1; then\n  as_dirname=dirname\nelse\n  as_dirname=false\nfi\n\nas_me=`$as_basename -- \"$0\" ||\n$as_expr X/\"$0\" : '.*/\\([^/][^/]*\\)/*$' \\| \\\n\t X\"$0\" : 'X\\(//\\)$' \\| \\\n\t X\"$0\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X/\"$0\" |\n    sed '/^.*\\/\\([^/][^/]*\\)\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n\n# Avoid depending upon Character Ranges.\nas_cr_letters='abcdefghijklmnopqrstuvwxyz'\nas_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'\nas_cr_Letters=$as_cr_letters$as_cr_LETTERS\nas_cr_digits='0123456789'\nas_cr_alnum=$as_cr_Letters$as_cr_digits\n\nECHO_C= ECHO_N= ECHO_T=\ncase `echo -n x` in #(((((\n-n*)\n  case `echo 'xy\\c'` in\n  *c*) ECHO_T='\t';;\t# ECHO_T is single tab character.\n  xy)  ECHO_C='\\c';;\n  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null\n       ECHO_T='\t';;\n  esac;;\n*)\n  ECHO_N='-n';;\nesac\n\nrm -f conf$$ conf$$.exe conf$$.file\nif test -d conf$$.dir; then\n  rm -f conf$$.dir/conf$$.file\nelse\n  rm -f conf$$.dir\n  mkdir conf$$.dir 2>/dev/null\nfi\nif (echo >conf$$.file) 2>/dev/null; then\n  if ln -s conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s='ln -s'\n    # ... but there are two gotchas:\n    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.\n    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.\n    # In both cases, we have to default to `cp -p'.\n    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||\n      as_ln_s='cp -p'\n  elif ln conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s=ln\n  else\n    as_ln_s='cp -p'\n  fi\nelse\n  as_ln_s='cp -p'\nfi\nrm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file\nrmdir conf$$.dir 2>/dev/null\n\n\n# as_fn_mkdir_p\n# -------------\n# Create \"$as_dir\" as a directory, including parents if necessary.\nas_fn_mkdir_p ()\n{\n\n  case $as_dir in #(\n  -*) as_dir=./$as_dir;;\n  esac\n  test -d \"$as_dir\" || eval $as_mkdir_p || {\n    as_dirs=\n    while :; do\n      case $as_dir in #(\n      *\\'*) as_qdir=`$as_echo \"$as_dir\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; #'(\n      *) as_qdir=$as_dir;;\n      esac\n      as_dirs=\"'$as_qdir' $as_dirs\"\n      as_dir=`$as_dirname -- \"$as_dir\" ||\n$as_expr X\"$as_dir\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_dir\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$as_dir\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n      test -d \"$as_dir\" && break\n    done\n    test -z \"$as_dirs\" || eval \"mkdir $as_dirs\"\n  } || test -d \"$as_dir\" || as_fn_error \"cannot create directory $as_dir\"\n\n\n} # as_fn_mkdir_p\nif mkdir -p . 2>/dev/null; then\n  as_mkdir_p='mkdir -p \"$as_dir\"'\nelse\n  test -d ./-p && rmdir ./-p\n  as_mkdir_p=false\nfi\n\nif test -x / >/dev/null 2>&1; then\n  as_test_x='test -x'\nelse\n  if ls -dL / >/dev/null 2>&1; then\n    as_ls_L_option=L\n  else\n    as_ls_L_option=\n  fi\n  as_test_x='\n    eval sh -c '\\''\n      if test -d \"$1\"; then\n\ttest -d \"$1/.\";\n      else\n\tcase $1 in #(\n\t-*)set \"./$1\";;\n\tesac;\n\tcase `ls -ld'$as_ls_L_option' \"$1\" 2>/dev/null` in #((\n\t???[sx]*):;;*)false;;esac;fi\n    '\\'' sh\n  '\nfi\nas_executable_p=$as_test_x\n\n# Sed expression to map a string onto a valid CPP name.\nas_tr_cpp=\"eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'\"\n\n# Sed expression to map a string onto a valid variable name.\nas_tr_sh=\"eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'\"\n\n\nexec 6>&1\n## ----------------------------------- ##\n## Main body of $CONFIG_STATUS script. ##\n## ----------------------------------- ##\n_ASEOF\ntest $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# Save the log message, to keep $0 and so on meaningful, and to\n# report actual input values of CONFIG_FILES etc. instead of their\n# values after options handling.\nac_log=\"\nThis file was extended by onig $as_me 5.13.5, which was\ngenerated by GNU Autoconf 2.65.  Invocation command line was\n\n  CONFIG_FILES    = $CONFIG_FILES\n  CONFIG_HEADERS  = $CONFIG_HEADERS\n  CONFIG_LINKS    = $CONFIG_LINKS\n  CONFIG_COMMANDS = $CONFIG_COMMANDS\n  $ $0 $@\n\non `(hostname || uname -n) 2>/dev/null | sed 1q`\n\"\n\n_ACEOF\n\ncase $ac_config_files in *\"\n\"*) set x $ac_config_files; shift; ac_config_files=$*;;\nesac\n\ncase $ac_config_headers in *\"\n\"*) set x $ac_config_headers; shift; ac_config_headers=$*;;\nesac\n\n\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n# Files that config.status was made for.\nconfig_files=\"$ac_config_files\"\nconfig_headers=\"$ac_config_headers\"\nconfig_commands=\"$ac_config_commands\"\n\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nac_cs_usage=\"\\\n\\`$as_me' instantiates files and other configuration actions\nfrom templates according to the current configuration.  Unless the files\nand actions are specified as TAGs, all are instantiated by default.\n\nUsage: $0 [OPTION]... [TAG]...\n\n  -h, --help       print this help, then exit\n  -V, --version    print version number and configuration settings, then exit\n      --config     print configuration, then exit\n  -q, --quiet, --silent\n                   do not print progress messages\n  -d, --debug      don't remove temporary files\n      --recheck    update $as_me by reconfiguring in the same conditions\n      --file=FILE[:TEMPLATE]\n                   instantiate the configuration file FILE\n      --header=FILE[:TEMPLATE]\n                   instantiate the configuration header FILE\n\nConfiguration files:\n$config_files\n\nConfiguration headers:\n$config_headers\n\nConfiguration commands:\n$config_commands\n\nReport bugs to the package provider.\"\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nac_cs_config=\"`$as_echo \"$ac_configure_args\" | sed 's/^ //; s/[\\\\\"\"\\`\\$]/\\\\\\\\&/g'`\"\nac_cs_version=\"\\\\\nonig config.status 5.13.5\nconfigured by $0, generated by GNU Autoconf 2.65,\n  with options \\\\\"\\$ac_cs_config\\\\\"\n\nCopyright (C) 2009 Free Software Foundation, Inc.\nThis config.status script is free software; the Free Software Foundation\ngives unlimited permission to copy, distribute and modify it.\"\n\nac_pwd='$ac_pwd'\nsrcdir='$srcdir'\nINSTALL='$INSTALL'\nMKDIR_P='$MKDIR_P'\nAWK='$AWK'\ntest -n \"\\$AWK\" || AWK=awk\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# The default lists apply if the user does not specify any file.\nac_need_defaults=:\nwhile test $# != 0\ndo\n  case $1 in\n  --*=*)\n    ac_option=`expr \"X$1\" : 'X\\([^=]*\\)='`\n    ac_optarg=`expr \"X$1\" : 'X[^=]*=\\(.*\\)'`\n    ac_shift=:\n    ;;\n  *)\n    ac_option=$1\n    ac_optarg=$2\n    ac_shift=shift\n    ;;\n  esac\n\n  case $ac_option in\n  # Handling of the options.\n  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)\n    ac_cs_recheck=: ;;\n  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )\n    $as_echo \"$ac_cs_version\"; exit ;;\n  --config | --confi | --conf | --con | --co | --c )\n    $as_echo \"$ac_cs_config\"; exit ;;\n  --debug | --debu | --deb | --de | --d | -d )\n    debug=: ;;\n  --file | --fil | --fi | --f )\n    $ac_shift\n    case $ac_optarg in\n    *\\'*) ac_optarg=`$as_echo \"$ac_optarg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    esac\n    as_fn_append CONFIG_FILES \" '$ac_optarg'\"\n    ac_need_defaults=false;;\n  --header | --heade | --head | --hea )\n    $ac_shift\n    case $ac_optarg in\n    *\\'*) ac_optarg=`$as_echo \"$ac_optarg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    esac\n    as_fn_append CONFIG_HEADERS \" '$ac_optarg'\"\n    ac_need_defaults=false;;\n  --he | --h)\n    # Conflict between --help and --header\n    as_fn_error \"ambiguous option: \\`$1'\nTry \\`$0 --help' for more information.\";;\n  --help | --hel | -h )\n    $as_echo \"$ac_cs_usage\"; exit ;;\n  -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n  | -silent | --silent | --silen | --sile | --sil | --si | --s)\n    ac_cs_silent=: ;;\n\n  # This is an error.\n  -*) as_fn_error \"unrecognized option: \\`$1'\nTry \\`$0 --help' for more information.\" ;;\n\n  *) as_fn_append ac_config_targets \" $1\"\n     ac_need_defaults=false ;;\n\n  esac\n  shift\ndone\n\nac_configure_extra_args=\n\nif $ac_cs_silent; then\n  exec 6>/dev/null\n  ac_configure_extra_args=\"$ac_configure_extra_args --silent\"\nfi\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nif \\$ac_cs_recheck; then\n  set X '$SHELL' '$0' $ac_configure_args \\$ac_configure_extra_args --no-create --no-recursion\n  shift\n  \\$as_echo \"running CONFIG_SHELL=$SHELL \\$*\" >&6\n  CONFIG_SHELL='$SHELL'\n  export CONFIG_SHELL\n  exec \"\\$@\"\nfi\n\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nexec 5>>config.log\n{\n  echo\n  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX\n## Running $as_me. ##\n_ASBOX\n  $as_echo \"$ac_log\"\n} >&5\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n#\n# INIT-COMMANDS\n#\nAMDEP_TRUE=\"$AMDEP_TRUE\" ac_aux_dir=\"$ac_aux_dir\"\n\n\n# The HP-UX ksh and POSIX shell print the target directory to stdout\n# if CDPATH is set.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\nsed_quote_subst='$sed_quote_subst'\ndouble_quote_subst='$double_quote_subst'\ndelay_variable_subst='$delay_variable_subst'\nmacro_version='`$ECHO \"X$macro_version\" | $Xsed -e \"$delay_single_quote_subst\"`'\nmacro_revision='`$ECHO \"X$macro_revision\" | $Xsed -e \"$delay_single_quote_subst\"`'\nenable_shared='`$ECHO \"X$enable_shared\" | $Xsed -e \"$delay_single_quote_subst\"`'\nenable_static='`$ECHO \"X$enable_static\" | $Xsed -e \"$delay_single_quote_subst\"`'\npic_mode='`$ECHO \"X$pic_mode\" | $Xsed -e \"$delay_single_quote_subst\"`'\nenable_fast_install='`$ECHO \"X$enable_fast_install\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhost_alias='`$ECHO \"X$host_alias\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhost='`$ECHO \"X$host\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhost_os='`$ECHO \"X$host_os\" | $Xsed -e \"$delay_single_quote_subst\"`'\nbuild_alias='`$ECHO \"X$build_alias\" | $Xsed -e \"$delay_single_quote_subst\"`'\nbuild='`$ECHO \"X$build\" | $Xsed -e \"$delay_single_quote_subst\"`'\nbuild_os='`$ECHO \"X$build_os\" | $Xsed -e \"$delay_single_quote_subst\"`'\nSED='`$ECHO \"X$SED\" | $Xsed -e \"$delay_single_quote_subst\"`'\nXsed='`$ECHO \"X$Xsed\" | $Xsed -e \"$delay_single_quote_subst\"`'\nGREP='`$ECHO \"X$GREP\" | $Xsed -e \"$delay_single_quote_subst\"`'\nEGREP='`$ECHO \"X$EGREP\" | $Xsed -e \"$delay_single_quote_subst\"`'\nFGREP='`$ECHO \"X$FGREP\" | $Xsed -e \"$delay_single_quote_subst\"`'\nLD='`$ECHO \"X$LD\" | $Xsed -e \"$delay_single_quote_subst\"`'\nNM='`$ECHO \"X$NM\" | $Xsed -e \"$delay_single_quote_subst\"`'\nLN_S='`$ECHO \"X$LN_S\" | $Xsed -e \"$delay_single_quote_subst\"`'\nmax_cmd_len='`$ECHO \"X$max_cmd_len\" | $Xsed -e \"$delay_single_quote_subst\"`'\nac_objext='`$ECHO \"X$ac_objext\" | $Xsed -e \"$delay_single_quote_subst\"`'\nexeext='`$ECHO \"X$exeext\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlt_unset='`$ECHO \"X$lt_unset\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlt_SP2NL='`$ECHO \"X$lt_SP2NL\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlt_NL2SP='`$ECHO \"X$lt_NL2SP\" | $Xsed -e \"$delay_single_quote_subst\"`'\nreload_flag='`$ECHO \"X$reload_flag\" | $Xsed -e \"$delay_single_quote_subst\"`'\nreload_cmds='`$ECHO \"X$reload_cmds\" | $Xsed -e \"$delay_single_quote_subst\"`'\nOBJDUMP='`$ECHO \"X$OBJDUMP\" | $Xsed -e \"$delay_single_quote_subst\"`'\ndeplibs_check_method='`$ECHO \"X$deplibs_check_method\" | $Xsed -e \"$delay_single_quote_subst\"`'\nfile_magic_cmd='`$ECHO \"X$file_magic_cmd\" | $Xsed -e \"$delay_single_quote_subst\"`'\nAR='`$ECHO \"X$AR\" | $Xsed -e \"$delay_single_quote_subst\"`'\nAR_FLAGS='`$ECHO \"X$AR_FLAGS\" | $Xsed -e \"$delay_single_quote_subst\"`'\nSTRIP='`$ECHO \"X$STRIP\" | $Xsed -e \"$delay_single_quote_subst\"`'\nRANLIB='`$ECHO \"X$RANLIB\" | $Xsed -e \"$delay_single_quote_subst\"`'\nold_postinstall_cmds='`$ECHO \"X$old_postinstall_cmds\" | $Xsed -e \"$delay_single_quote_subst\"`'\nold_postuninstall_cmds='`$ECHO \"X$old_postuninstall_cmds\" | $Xsed -e \"$delay_single_quote_subst\"`'\nold_archive_cmds='`$ECHO \"X$old_archive_cmds\" | $Xsed -e \"$delay_single_quote_subst\"`'\nCC='`$ECHO \"X$CC\" | $Xsed -e \"$delay_single_quote_subst\"`'\nCFLAGS='`$ECHO \"X$CFLAGS\" | $Xsed -e \"$delay_single_quote_subst\"`'\ncompiler='`$ECHO \"X$compiler\" | $Xsed -e \"$delay_single_quote_subst\"`'\nGCC='`$ECHO \"X$GCC\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlt_cv_sys_global_symbol_pipe='`$ECHO \"X$lt_cv_sys_global_symbol_pipe\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlt_cv_sys_global_symbol_to_cdecl='`$ECHO \"X$lt_cv_sys_global_symbol_to_cdecl\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlt_cv_sys_global_symbol_to_c_name_address='`$ECHO \"X$lt_cv_sys_global_symbol_to_c_name_address\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO \"X$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix\" | $Xsed -e \"$delay_single_quote_subst\"`'\nobjdir='`$ECHO \"X$objdir\" | $Xsed -e \"$delay_single_quote_subst\"`'\nSHELL='`$ECHO \"X$SHELL\" | $Xsed -e \"$delay_single_quote_subst\"`'\nECHO='`$ECHO \"X$ECHO\" | $Xsed -e \"$delay_single_quote_subst\"`'\nMAGIC_CMD='`$ECHO \"X$MAGIC_CMD\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlt_prog_compiler_no_builtin_flag='`$ECHO \"X$lt_prog_compiler_no_builtin_flag\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlt_prog_compiler_wl='`$ECHO \"X$lt_prog_compiler_wl\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlt_prog_compiler_pic='`$ECHO \"X$lt_prog_compiler_pic\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlt_prog_compiler_static='`$ECHO \"X$lt_prog_compiler_static\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlt_cv_prog_compiler_c_o='`$ECHO \"X$lt_cv_prog_compiler_c_o\" | $Xsed -e \"$delay_single_quote_subst\"`'\nneed_locks='`$ECHO \"X$need_locks\" | $Xsed -e \"$delay_single_quote_subst\"`'\nDSYMUTIL='`$ECHO \"X$DSYMUTIL\" | $Xsed -e \"$delay_single_quote_subst\"`'\nNMEDIT='`$ECHO \"X$NMEDIT\" | $Xsed -e \"$delay_single_quote_subst\"`'\nLIPO='`$ECHO \"X$LIPO\" | $Xsed -e \"$delay_single_quote_subst\"`'\nOTOOL='`$ECHO \"X$OTOOL\" | $Xsed -e \"$delay_single_quote_subst\"`'\nOTOOL64='`$ECHO \"X$OTOOL64\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlibext='`$ECHO \"X$libext\" | $Xsed -e \"$delay_single_quote_subst\"`'\nshrext_cmds='`$ECHO \"X$shrext_cmds\" | $Xsed -e \"$delay_single_quote_subst\"`'\nextract_expsyms_cmds='`$ECHO \"X$extract_expsyms_cmds\" | $Xsed -e \"$delay_single_quote_subst\"`'\narchive_cmds_need_lc='`$ECHO \"X$archive_cmds_need_lc\" | $Xsed -e \"$delay_single_quote_subst\"`'\nenable_shared_with_static_runtimes='`$ECHO \"X$enable_shared_with_static_runtimes\" | $Xsed -e \"$delay_single_quote_subst\"`'\nexport_dynamic_flag_spec='`$ECHO \"X$export_dynamic_flag_spec\" | $Xsed -e \"$delay_single_quote_subst\"`'\nwhole_archive_flag_spec='`$ECHO \"X$whole_archive_flag_spec\" | $Xsed -e \"$delay_single_quote_subst\"`'\ncompiler_needs_object='`$ECHO \"X$compiler_needs_object\" | $Xsed -e \"$delay_single_quote_subst\"`'\nold_archive_from_new_cmds='`$ECHO \"X$old_archive_from_new_cmds\" | $Xsed -e \"$delay_single_quote_subst\"`'\nold_archive_from_expsyms_cmds='`$ECHO \"X$old_archive_from_expsyms_cmds\" | $Xsed -e \"$delay_single_quote_subst\"`'\narchive_cmds='`$ECHO \"X$archive_cmds\" | $Xsed -e \"$delay_single_quote_subst\"`'\narchive_expsym_cmds='`$ECHO \"X$archive_expsym_cmds\" | $Xsed -e \"$delay_single_quote_subst\"`'\nmodule_cmds='`$ECHO \"X$module_cmds\" | $Xsed -e \"$delay_single_quote_subst\"`'\nmodule_expsym_cmds='`$ECHO \"X$module_expsym_cmds\" | $Xsed -e \"$delay_single_quote_subst\"`'\nwith_gnu_ld='`$ECHO \"X$with_gnu_ld\" | $Xsed -e \"$delay_single_quote_subst\"`'\nallow_undefined_flag='`$ECHO \"X$allow_undefined_flag\" | $Xsed -e \"$delay_single_quote_subst\"`'\nno_undefined_flag='`$ECHO \"X$no_undefined_flag\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhardcode_libdir_flag_spec='`$ECHO \"X$hardcode_libdir_flag_spec\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhardcode_libdir_flag_spec_ld='`$ECHO \"X$hardcode_libdir_flag_spec_ld\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhardcode_libdir_separator='`$ECHO \"X$hardcode_libdir_separator\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhardcode_direct='`$ECHO \"X$hardcode_direct\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhardcode_direct_absolute='`$ECHO \"X$hardcode_direct_absolute\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhardcode_minus_L='`$ECHO \"X$hardcode_minus_L\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhardcode_shlibpath_var='`$ECHO \"X$hardcode_shlibpath_var\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhardcode_automatic='`$ECHO \"X$hardcode_automatic\" | $Xsed -e \"$delay_single_quote_subst\"`'\ninherit_rpath='`$ECHO \"X$inherit_rpath\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlink_all_deplibs='`$ECHO \"X$link_all_deplibs\" | $Xsed -e \"$delay_single_quote_subst\"`'\nfix_srcfile_path='`$ECHO \"X$fix_srcfile_path\" | $Xsed -e \"$delay_single_quote_subst\"`'\nalways_export_symbols='`$ECHO \"X$always_export_symbols\" | $Xsed -e \"$delay_single_quote_subst\"`'\nexport_symbols_cmds='`$ECHO \"X$export_symbols_cmds\" | $Xsed -e \"$delay_single_quote_subst\"`'\nexclude_expsyms='`$ECHO \"X$exclude_expsyms\" | $Xsed -e \"$delay_single_quote_subst\"`'\ninclude_expsyms='`$ECHO \"X$include_expsyms\" | $Xsed -e \"$delay_single_quote_subst\"`'\nprelink_cmds='`$ECHO \"X$prelink_cmds\" | $Xsed -e \"$delay_single_quote_subst\"`'\nfile_list_spec='`$ECHO \"X$file_list_spec\" | $Xsed -e \"$delay_single_quote_subst\"`'\nvariables_saved_for_relink='`$ECHO \"X$variables_saved_for_relink\" | $Xsed -e \"$delay_single_quote_subst\"`'\nneed_lib_prefix='`$ECHO \"X$need_lib_prefix\" | $Xsed -e \"$delay_single_quote_subst\"`'\nneed_version='`$ECHO \"X$need_version\" | $Xsed -e \"$delay_single_quote_subst\"`'\nversion_type='`$ECHO \"X$version_type\" | $Xsed -e \"$delay_single_quote_subst\"`'\nrunpath_var='`$ECHO \"X$runpath_var\" | $Xsed -e \"$delay_single_quote_subst\"`'\nshlibpath_var='`$ECHO \"X$shlibpath_var\" | $Xsed -e \"$delay_single_quote_subst\"`'\nshlibpath_overrides_runpath='`$ECHO \"X$shlibpath_overrides_runpath\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlibname_spec='`$ECHO \"X$libname_spec\" | $Xsed -e \"$delay_single_quote_subst\"`'\nlibrary_names_spec='`$ECHO \"X$library_names_spec\" | $Xsed -e \"$delay_single_quote_subst\"`'\nsoname_spec='`$ECHO \"X$soname_spec\" | $Xsed -e \"$delay_single_quote_subst\"`'\npostinstall_cmds='`$ECHO \"X$postinstall_cmds\" | $Xsed -e \"$delay_single_quote_subst\"`'\npostuninstall_cmds='`$ECHO \"X$postuninstall_cmds\" | $Xsed -e \"$delay_single_quote_subst\"`'\nfinish_cmds='`$ECHO \"X$finish_cmds\" | $Xsed -e \"$delay_single_quote_subst\"`'\nfinish_eval='`$ECHO \"X$finish_eval\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhardcode_into_libs='`$ECHO \"X$hardcode_into_libs\" | $Xsed -e \"$delay_single_quote_subst\"`'\nsys_lib_search_path_spec='`$ECHO \"X$sys_lib_search_path_spec\" | $Xsed -e \"$delay_single_quote_subst\"`'\nsys_lib_dlsearch_path_spec='`$ECHO \"X$sys_lib_dlsearch_path_spec\" | $Xsed -e \"$delay_single_quote_subst\"`'\nhardcode_action='`$ECHO \"X$hardcode_action\" | $Xsed -e \"$delay_single_quote_subst\"`'\nenable_dlopen='`$ECHO \"X$enable_dlopen\" | $Xsed -e \"$delay_single_quote_subst\"`'\nenable_dlopen_self='`$ECHO \"X$enable_dlopen_self\" | $Xsed -e \"$delay_single_quote_subst\"`'\nenable_dlopen_self_static='`$ECHO \"X$enable_dlopen_self_static\" | $Xsed -e \"$delay_single_quote_subst\"`'\nold_striplib='`$ECHO \"X$old_striplib\" | $Xsed -e \"$delay_single_quote_subst\"`'\nstriplib='`$ECHO \"X$striplib\" | $Xsed -e \"$delay_single_quote_subst\"`'\n\nLTCC='$LTCC'\nLTCFLAGS='$LTCFLAGS'\ncompiler='$compiler_DEFAULT'\n\n# Quote evaled strings.\nfor var in SED \\\nGREP \\\nEGREP \\\nFGREP \\\nLD \\\nNM \\\nLN_S \\\nlt_SP2NL \\\nlt_NL2SP \\\nreload_flag \\\nOBJDUMP \\\ndeplibs_check_method \\\nfile_magic_cmd \\\nAR \\\nAR_FLAGS \\\nSTRIP \\\nRANLIB \\\nCC \\\nCFLAGS \\\ncompiler \\\nlt_cv_sys_global_symbol_pipe \\\nlt_cv_sys_global_symbol_to_cdecl \\\nlt_cv_sys_global_symbol_to_c_name_address \\\nlt_cv_sys_global_symbol_to_c_name_address_lib_prefix \\\nSHELL \\\nECHO \\\nlt_prog_compiler_no_builtin_flag \\\nlt_prog_compiler_wl \\\nlt_prog_compiler_pic \\\nlt_prog_compiler_static \\\nlt_cv_prog_compiler_c_o \\\nneed_locks \\\nDSYMUTIL \\\nNMEDIT \\\nLIPO \\\nOTOOL \\\nOTOOL64 \\\nshrext_cmds \\\nexport_dynamic_flag_spec \\\nwhole_archive_flag_spec \\\ncompiler_needs_object \\\nwith_gnu_ld \\\nallow_undefined_flag \\\nno_undefined_flag \\\nhardcode_libdir_flag_spec \\\nhardcode_libdir_flag_spec_ld \\\nhardcode_libdir_separator \\\nfix_srcfile_path \\\nexclude_expsyms \\\ninclude_expsyms \\\nfile_list_spec \\\nvariables_saved_for_relink \\\nlibname_spec \\\nlibrary_names_spec \\\nsoname_spec \\\nfinish_eval \\\nold_striplib \\\nstriplib; do\n    case \\`eval \\\\\\\\\\$ECHO \"X\\\\\\\\\\$\\$var\"\\` in\n    *[\\\\\\\\\\\\\\`\\\\\"\\\\\\$]*)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\`\\\\\\$ECHO \\\\\"X\\\\\\$\\$var\\\\\" | \\\\\\$Xsed -e \\\\\"\\\\\\$sed_quote_subst\\\\\"\\\\\\`\\\\\\\\\\\\\"\"\n      ;;\n    *)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\$\\$var\\\\\\\\\\\\\"\"\n      ;;\n    esac\ndone\n\n# Double-quote double-evaled strings.\nfor var in reload_cmds \\\nold_postinstall_cmds \\\nold_postuninstall_cmds \\\nold_archive_cmds \\\nextract_expsyms_cmds \\\nold_archive_from_new_cmds \\\nold_archive_from_expsyms_cmds \\\narchive_cmds \\\narchive_expsym_cmds \\\nmodule_cmds \\\nmodule_expsym_cmds \\\nexport_symbols_cmds \\\nprelink_cmds \\\npostinstall_cmds \\\npostuninstall_cmds \\\nfinish_cmds \\\nsys_lib_search_path_spec \\\nsys_lib_dlsearch_path_spec; do\n    case \\`eval \\\\\\\\\\$ECHO \"X\\\\\\\\\\$\\$var\"\\` in\n    *[\\\\\\\\\\\\\\`\\\\\"\\\\\\$]*)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\`\\\\\\$ECHO \\\\\"X\\\\\\$\\$var\\\\\" | \\\\\\$Xsed -e \\\\\"\\\\\\$double_quote_subst\\\\\" -e \\\\\"\\\\\\$sed_quote_subst\\\\\" -e \\\\\"\\\\\\$delay_variable_subst\\\\\"\\\\\\`\\\\\\\\\\\\\"\"\n      ;;\n    *)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\$\\$var\\\\\\\\\\\\\"\"\n      ;;\n    esac\ndone\n\n# Fix-up fallback echo if it was mangled by the above quoting rules.\ncase \\$lt_ECHO in\n*'\\\\\\$0 --fallback-echo\"')  lt_ECHO=\\`\\$ECHO \"X\\$lt_ECHO\" | \\$Xsed -e 's/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\$0 --fallback-echo\"\\$/\\$0 --fallback-echo\"/'\\`\n  ;;\nesac\n\nac_aux_dir='$ac_aux_dir'\nxsi_shell='$xsi_shell'\nlt_shell_append='$lt_shell_append'\n\n# See if we are running on zsh, and set the options which allow our\n# commands through without removal of \\ escapes INIT.\nif test -n \"\\${ZSH_VERSION+set}\" ; then\n   setopt NO_GLOB_SUBST\nfi\n\n\n    PACKAGE='$PACKAGE'\n    VERSION='$VERSION'\n    TIMESTAMP='$TIMESTAMP'\n    RM='$RM'\n    ofile='$ofile'\n\n\n\n\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n\n# Handling of arguments.\nfor ac_config_target in $ac_config_targets\ndo\n  case $ac_config_target in\n    \"config.h\") CONFIG_HEADERS=\"$CONFIG_HEADERS config.h\" ;;\n    \"depfiles\") CONFIG_COMMANDS=\"$CONFIG_COMMANDS depfiles\" ;;\n    \"libtool\") CONFIG_COMMANDS=\"$CONFIG_COMMANDS libtool\" ;;\n    \"Makefile\") CONFIG_FILES=\"$CONFIG_FILES Makefile\" ;;\n    \"onig-config\") CONFIG_FILES=\"$CONFIG_FILES onig-config\" ;;\n    \"sample/Makefile\") CONFIG_FILES=\"$CONFIG_FILES sample/Makefile\" ;;\n    \"default\") CONFIG_COMMANDS=\"$CONFIG_COMMANDS default\" ;;\n\n  *) as_fn_error \"invalid argument: \\`$ac_config_target'\" \"$LINENO\" 5;;\n  esac\ndone\n\n\n# If the user did not use the arguments to specify the items to instantiate,\n# then the envvar interface is used.  Set only those that are not.\n# We use the long form for the default assignment because of an extremely\n# bizarre bug on SunOS 4.1.3.\nif $ac_need_defaults; then\n  test \"${CONFIG_FILES+set}\" = set || CONFIG_FILES=$config_files\n  test \"${CONFIG_HEADERS+set}\" = set || CONFIG_HEADERS=$config_headers\n  test \"${CONFIG_COMMANDS+set}\" = set || CONFIG_COMMANDS=$config_commands\nfi\n\n# Have a temporary directory for convenience.  Make it in the build tree\n# simply because there is no reason against having it here, and in addition,\n# creating and moving files from /tmp can sometimes cause problems.\n# Hook for its removal unless debugging.\n# Note that there is a small window in which the directory will not be cleaned:\n# after its creation but before its name has been assigned to `$tmp'.\n$debug ||\n{\n  tmp=\n  trap 'exit_status=$?\n  { test -z \"$tmp\" || test ! -d \"$tmp\" || rm -fr \"$tmp\"; } && exit $exit_status\n' 0\n  trap 'as_fn_exit 1' 1 2 13 15\n}\n# Create a (secure) tmp directory for tmp files.\n\n{\n  tmp=`(umask 077 && mktemp -d \"./confXXXXXX\") 2>/dev/null` &&\n  test -n \"$tmp\" && test -d \"$tmp\"\n}  ||\n{\n  tmp=./conf$$-$RANDOM\n  (umask 077 && mkdir \"$tmp\")\n} || as_fn_error \"cannot create a temporary directory in .\" \"$LINENO\" 5\n\n# Set up the scripts for CONFIG_FILES section.\n# No need to generate them if there are no CONFIG_FILES.\n# This happens for instance with `./config.status config.h'.\nif test -n \"$CONFIG_FILES\"; then\n\n\nac_cr=`echo X | tr X '\\015'`\n# On cygwin, bash can eat \\r inside `` if the user requested igncr.\n# But we know of no other shell where ac_cr would be empty at this\n# point, so we can use a bashism as a fallback.\nif test \"x$ac_cr\" = x; then\n  eval ac_cr=\\$\\'\\\\r\\'\nfi\nac_cs_awk_cr=`$AWK 'BEGIN { print \"a\\rb\" }' </dev/null 2>/dev/null`\nif test \"$ac_cs_awk_cr\" = \"a${ac_cr}b\"; then\n  ac_cs_awk_cr='\\r'\nelse\n  ac_cs_awk_cr=$ac_cr\nfi\n\necho 'BEGIN {' >\"$tmp/subs1.awk\" &&\n_ACEOF\n\n\n{\n  echo \"cat >conf$$subs.awk <<_ACEOF\" &&\n  echo \"$ac_subst_vars\" | sed 's/.*/&!$&$ac_delim/' &&\n  echo \"_ACEOF\"\n} >conf$$subs.sh ||\n  as_fn_error \"could not make $CONFIG_STATUS\" \"$LINENO\" 5\nac_delim_num=`echo \"$ac_subst_vars\" | grep -c '$'`\nac_delim='%!_!# '\nfor ac_last_try in false false false false false :; do\n  . ./conf$$subs.sh ||\n    as_fn_error \"could not make $CONFIG_STATUS\" \"$LINENO\" 5\n\n  ac_delim_n=`sed -n \"s/.*$ac_delim\\$/X/p\" conf$$subs.awk | grep -c X`\n  if test $ac_delim_n = $ac_delim_num; then\n    break\n  elif $ac_last_try; then\n    as_fn_error \"could not make $CONFIG_STATUS\" \"$LINENO\" 5\n  else\n    ac_delim=\"$ac_delim!$ac_delim _$ac_delim!! \"\n  fi\ndone\nrm -f conf$$subs.sh\n\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\ncat >>\"\\$tmp/subs1.awk\" <<\\\\_ACAWK &&\n_ACEOF\nsed -n '\nh\ns/^/S[\"/; s/!.*/\"]=/\np\ng\ns/^[^!]*!//\n:repl\nt repl\ns/'\"$ac_delim\"'$//\nt delim\n:nl\nh\ns/\\(.\\{148\\}\\)..*/\\1/\nt more1\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\\\\n\"\\\\/\np\nn\nb repl\n:more1\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"\\\\/\np\ng\ns/.\\{148\\}//\nt nl\n:delim\nh\ns/\\(.\\{148\\}\\)..*/\\1/\nt more2\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"/\np\nb\n:more2\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"\\\\/\np\ng\ns/.\\{148\\}//\nt delim\n' <conf$$subs.awk | sed '\n/^[^\"\"]/{\n  N\n  s/\\n//\n}\n' >>$CONFIG_STATUS || ac_write_fail=1\nrm -f conf$$subs.awk\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n_ACAWK\ncat >>\"\\$tmp/subs1.awk\" <<_ACAWK &&\n  for (key in S) S_is_set[key] = 1\n  FS = \"\u0007\"\n\n}\n{\n  line = $ 0\n  nfields = split(line, field, \"@\")\n  substed = 0\n  len = length(field[1])\n  for (i = 2; i < nfields; i++) {\n    key = field[i]\n    keylen = length(key)\n    if (S_is_set[key]) {\n      value = S[key]\n      line = substr(line, 1, len) \"\" value \"\" substr(line, len + keylen + 3)\n      len += length(value) + length(field[++i])\n      substed = 1\n    } else\n      len += 1 + keylen\n  }\n\n  print line\n}\n\n_ACAWK\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nif sed \"s/$ac_cr//\" < /dev/null > /dev/null 2>&1; then\n  sed \"s/$ac_cr\\$//; s/$ac_cr/$ac_cs_awk_cr/g\"\nelse\n  cat\nfi < \"$tmp/subs1.awk\" > \"$tmp/subs.awk\" \\\n  || as_fn_error \"could not setup config files machinery\" \"$LINENO\" 5\n_ACEOF\n\n# VPATH may cause trouble with some makes, so we remove $(srcdir),\n# ${srcdir} and @srcdir@ from VPATH if srcdir is \".\", strip leading and\n# trailing colons and then remove the whole line if VPATH becomes empty\n# (actually we leave an empty line to preserve line numbers).\nif test \"x$srcdir\" = x.; then\n  ac_vpsub='/^[\t ]*VPATH[\t ]*=/{\ns/:*\\$(srcdir):*/:/\ns/:*\\${srcdir}:*/:/\ns/:*@srcdir@:*/:/\ns/^\\([^=]*=[\t ]*\\):*/\\1/\ns/:*$//\ns/^[^=]*=[\t ]*$//\n}'\nfi\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nfi # test -n \"$CONFIG_FILES\"\n\n# Set up the scripts for CONFIG_HEADERS section.\n# No need to generate them if there are no CONFIG_HEADERS.\n# This happens for instance with `./config.status Makefile'.\nif test -n \"$CONFIG_HEADERS\"; then\ncat >\"$tmp/defines.awk\" <<\\_ACAWK ||\nBEGIN {\n_ACEOF\n\n# Transform confdefs.h into an awk script `defines.awk', embedded as\n# here-document in config.status, that substitutes the proper values into\n# config.h.in to produce config.h.\n\n# Create a delimiter string that does not exist in confdefs.h, to ease\n# handling of long lines.\nac_delim='%!_!# '\nfor ac_last_try in false false :; do\n  ac_t=`sed -n \"/$ac_delim/p\" confdefs.h`\n  if test -z \"$ac_t\"; then\n    break\n  elif $ac_last_try; then\n    as_fn_error \"could not make $CONFIG_HEADERS\" \"$LINENO\" 5\n  else\n    ac_delim=\"$ac_delim!$ac_delim _$ac_delim!! \"\n  fi\ndone\n\n# For the awk script, D is an array of macro values keyed by name,\n# likewise P contains macro parameters if any.  Preserve backslash\n# newline sequences.\n\nac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*\nsed -n '\ns/.\\{148\\}/&'\"$ac_delim\"'/g\nt rset\n:rset\ns/^[\t ]*#[\t ]*define[\t ][\t ]*/ /\nt def\nd\n:def\ns/\\\\$//\nt bsnl\ns/[\"\\\\]/\\\\&/g\ns/^ \\('\"$ac_word_re\"'\\)\\(([^()]*)\\)[\t ]*\\(.*\\)/P[\"\\1\"]=\"\\2\"\\\nD[\"\\1\"]=\" \\3\"/p\ns/^ \\('\"$ac_word_re\"'\\)[\t ]*\\(.*\\)/D[\"\\1\"]=\" \\2\"/p\nd\n:bsnl\ns/[\"\\\\]/\\\\&/g\ns/^ \\('\"$ac_word_re\"'\\)\\(([^()]*)\\)[\t ]*\\(.*\\)/P[\"\\1\"]=\"\\2\"\\\nD[\"\\1\"]=\" \\3\\\\\\\\\\\\n\"\\\\/p\nt cont\ns/^ \\('\"$ac_word_re\"'\\)[\t ]*\\(.*\\)/D[\"\\1\"]=\" \\2\\\\\\\\\\\\n\"\\\\/p\nt cont\nd\n:cont\nn\ns/.\\{148\\}/&'\"$ac_delim\"'/g\nt clear\n:clear\ns/\\\\$//\nt bsnlc\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"/p\nd\n:bsnlc\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\\\\\\\\\\\\n\"\\\\/p\nb cont\n' <confdefs.h | sed '\ns/'\"$ac_delim\"'/\"\\\\\\\n\"/g' >>$CONFIG_STATUS || ac_write_fail=1\n\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n  for (key in D) D_is_set[key] = 1\n  FS = \"\u0007\"\n}\n/^[\\t ]*#[\\t ]*(define|undef)[\\t ]+$ac_word_re([\\t (]|\\$)/ {\n  line = \\$ 0\n  split(line, arg, \" \")\n  if (arg[1] == \"#\") {\n    defundef = arg[2]\n    mac1 = arg[3]\n  } else {\n    defundef = substr(arg[1], 2)\n    mac1 = arg[2]\n  }\n  split(mac1, mac2, \"(\") #)\n  macro = mac2[1]\n  prefix = substr(line, 1, index(line, defundef) - 1)\n  if (D_is_set[macro]) {\n    # Preserve the white space surrounding the \"#\".\n    print prefix \"define\", macro P[macro] D[macro]\n    next\n  } else {\n    # Replace #undef with comments.  This is necessary, for example,\n    # in the case of _POSIX_SOURCE, which is predefined and required\n    # on some systems where configure will not decide to define it.\n    if (defundef == \"undef\") {\n      print \"/*\", prefix defundef, macro, \"*/\"\n      next\n    }\n  }\n}\n{ print }\n_ACAWK\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n  as_fn_error \"could not setup config headers machinery\" \"$LINENO\" 5\nfi # test -n \"$CONFIG_HEADERS\"\n\n\neval set X \"  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS\"\nshift\nfor ac_tag\ndo\n  case $ac_tag in\n  :[FHLC]) ac_mode=$ac_tag; continue;;\n  esac\n  case $ac_mode$ac_tag in\n  :[FHL]*:*);;\n  :L* | :C*:*) as_fn_error \"invalid tag \\`$ac_tag'\" \"$LINENO\" 5;;\n  :[FH]-) ac_tag=-:-;;\n  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;\n  esac\n  ac_save_IFS=$IFS\n  IFS=:\n  set x $ac_tag\n  IFS=$ac_save_IFS\n  shift\n  ac_file=$1\n  shift\n\n  case $ac_mode in\n  :L) ac_source=$1;;\n  :[FH])\n    ac_file_inputs=\n    for ac_f\n    do\n      case $ac_f in\n      -) ac_f=\"$tmp/stdin\";;\n      *) # Look for the file first in the build tree, then in the source tree\n\t # (if the path is not absolute).  The absolute path cannot be DOS-style,\n\t # because $ac_f cannot contain `:'.\n\t test -f \"$ac_f\" ||\n\t   case $ac_f in\n\t   [\\\\/$]*) false;;\n\t   *) test -f \"$srcdir/$ac_f\" && ac_f=\"$srcdir/$ac_f\";;\n\t   esac ||\n\t   as_fn_error \"cannot find input file: \\`$ac_f'\" \"$LINENO\" 5;;\n      esac\n      case $ac_f in *\\'*) ac_f=`$as_echo \"$ac_f\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; esac\n      as_fn_append ac_file_inputs \" '$ac_f'\"\n    done\n\n    # Let's still pretend it is `configure' which instantiates (i.e., don't\n    # use $as_me), people would be surprised to read:\n    #    /* config.h.  Generated by config.status.  */\n    configure_input='Generated from '`\n\t  $as_echo \"$*\" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'\n\t`' by configure.'\n    if test x\"$ac_file\" != x-; then\n      configure_input=\"$ac_file.  $configure_input\"\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: creating $ac_file\" >&5\n$as_echo \"$as_me: creating $ac_file\" >&6;}\n    fi\n    # Neutralize special characters interpreted by sed in replacement strings.\n    case $configure_input in #(\n    *\\&* | *\\|* | *\\\\* )\n       ac_sed_conf_input=`$as_echo \"$configure_input\" |\n       sed 's/[\\\\\\\\&|]/\\\\\\\\&/g'`;; #(\n    *) ac_sed_conf_input=$configure_input;;\n    esac\n\n    case $ac_tag in\n    *:-:* | *:-) cat >\"$tmp/stdin\" \\\n      || as_fn_error \"could not create $ac_file\" \"$LINENO\" 5 ;;\n    esac\n    ;;\n  esac\n\n  ac_dir=`$as_dirname -- \"$ac_file\" ||\n$as_expr X\"$ac_file\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$ac_file\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$ac_file\" : 'X\\(//\\)$' \\| \\\n\t X\"$ac_file\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$ac_file\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n  as_dir=\"$ac_dir\"; as_fn_mkdir_p\n  ac_builddir=.\n\ncase \"$ac_dir\" in\n.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;\n*)\n  ac_dir_suffix=/`$as_echo \"$ac_dir\" | sed 's|^\\.[\\\\/]||'`\n  # A \"..\" for each directory in $ac_dir_suffix.\n  ac_top_builddir_sub=`$as_echo \"$ac_dir_suffix\" | sed 's|/[^\\\\/]*|/..|g;s|/||'`\n  case $ac_top_builddir_sub in\n  \"\") ac_top_builddir_sub=. ac_top_build_prefix= ;;\n  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;\n  esac ;;\nesac\nac_abs_top_builddir=$ac_pwd\nac_abs_builddir=$ac_pwd$ac_dir_suffix\n# for backward compatibility:\nac_top_builddir=$ac_top_build_prefix\n\ncase $srcdir in\n  .)  # We are building in place.\n    ac_srcdir=.\n    ac_top_srcdir=$ac_top_builddir_sub\n    ac_abs_top_srcdir=$ac_pwd ;;\n  [\\\\/]* | ?:[\\\\/]* )  # Absolute name.\n    ac_srcdir=$srcdir$ac_dir_suffix;\n    ac_top_srcdir=$srcdir\n    ac_abs_top_srcdir=$srcdir ;;\n  *) # Relative name.\n    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix\n    ac_top_srcdir=$ac_top_build_prefix$srcdir\n    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;\nesac\nac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix\n\n\n  case $ac_mode in\n  :F)\n  #\n  # CONFIG_FILE\n  #\n\n  case $INSTALL in\n  [\\\\/$]* | ?:[\\\\/]* ) ac_INSTALL=$INSTALL ;;\n  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;\n  esac\n  ac_MKDIR_P=$MKDIR_P\n  case $MKDIR_P in\n  [\\\\/$]* | ?:[\\\\/]* ) ;;\n  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;\n  esac\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# If the template does not know about datarootdir, expand it.\n# FIXME: This hack should be removed a few years after 2.60.\nac_datarootdir_hack=; ac_datarootdir_seen=\nac_sed_dataroot='\n/datarootdir/ {\n  p\n  q\n}\n/@datadir@/p\n/@docdir@/p\n/@infodir@/p\n/@localedir@/p\n/@mandir@/p'\ncase `eval \"sed -n \\\"\\$ac_sed_dataroot\\\" $ac_file_inputs\"` in\n*datarootdir*) ac_datarootdir_seen=yes;;\n*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting\" >&5\n$as_echo \"$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting\" >&2;}\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n  ac_datarootdir_hack='\n  s&@datadir@&$datadir&g\n  s&@docdir@&$docdir&g\n  s&@infodir@&$infodir&g\n  s&@localedir@&$localedir&g\n  s&@mandir@&$mandir&g\n  s&\\\\\\${datarootdir}&$datarootdir&g' ;;\nesac\n_ACEOF\n\n# Neutralize VPATH when `$srcdir' = `.'.\n# Shell code in configure.ac might set extrasub.\n# FIXME: do we really want to maintain this feature?\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nac_sed_extra=\"$ac_vpsub\n$extrasub\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n:t\n/@[a-zA-Z_][a-zA-Z_0-9]*@/!b\ns|@configure_input@|$ac_sed_conf_input|;t t\ns&@top_builddir@&$ac_top_builddir_sub&;t t\ns&@top_build_prefix@&$ac_top_build_prefix&;t t\ns&@srcdir@&$ac_srcdir&;t t\ns&@abs_srcdir@&$ac_abs_srcdir&;t t\ns&@top_srcdir@&$ac_top_srcdir&;t t\ns&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t\ns&@builddir@&$ac_builddir&;t t\ns&@abs_builddir@&$ac_abs_builddir&;t t\ns&@abs_top_builddir@&$ac_abs_top_builddir&;t t\ns&@INSTALL@&$ac_INSTALL&;t t\ns&@MKDIR_P@&$ac_MKDIR_P&;t t\n$ac_datarootdir_hack\n\"\neval sed \\\"\\$ac_sed_extra\\\" \"$ac_file_inputs\" | $AWK -f \"$tmp/subs.awk\" >$tmp/out \\\n  || as_fn_error \"could not create $ac_file\" \"$LINENO\" 5\n\ntest -z \"$ac_datarootdir_hack$ac_datarootdir_seen\" &&\n  { ac_out=`sed -n '/\\${datarootdir}/p' \"$tmp/out\"`; test -n \"$ac_out\"; } &&\n  { ac_out=`sed -n '/^[\t ]*datarootdir[\t ]*:*=/p' \"$tmp/out\"`; test -z \"$ac_out\"; } &&\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \\`datarootdir'\nwhich seems to be undefined.  Please make sure it is defined.\" >&5\n$as_echo \"$as_me: WARNING: $ac_file contains a reference to the variable \\`datarootdir'\nwhich seems to be undefined.  Please make sure it is defined.\" >&2;}\n\n  rm -f \"$tmp/stdin\"\n  case $ac_file in\n  -) cat \"$tmp/out\" && rm -f \"$tmp/out\";;\n  *) rm -f \"$ac_file\" && mv \"$tmp/out\" \"$ac_file\";;\n  esac \\\n  || as_fn_error \"could not create $ac_file\" \"$LINENO\" 5\n ;;\n  :H)\n  #\n  # CONFIG_HEADER\n  #\n  if test x\"$ac_file\" != x-; then\n    {\n      $as_echo \"/* $configure_input  */\" \\\n      && eval '$AWK -f \"$tmp/defines.awk\"' \"$ac_file_inputs\"\n    } >\"$tmp/config.h\" \\\n      || as_fn_error \"could not create $ac_file\" \"$LINENO\" 5\n    if diff \"$ac_file\" \"$tmp/config.h\" >/dev/null 2>&1; then\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: $ac_file is unchanged\" >&5\n$as_echo \"$as_me: $ac_file is unchanged\" >&6;}\n    else\n      rm -f \"$ac_file\"\n      mv \"$tmp/config.h\" \"$ac_file\" \\\n\t|| as_fn_error \"could not create $ac_file\" \"$LINENO\" 5\n    fi\n  else\n    $as_echo \"/* $configure_input  */\" \\\n      && eval '$AWK -f \"$tmp/defines.awk\"' \"$ac_file_inputs\" \\\n      || as_fn_error \"could not create -\" \"$LINENO\" 5\n  fi\n# Compute \"$ac_file\"'s index in $config_headers.\n_am_arg=\"$ac_file\"\n_am_stamp_count=1\nfor _am_header in $config_headers :; do\n  case $_am_header in\n    $_am_arg | $_am_arg:* )\n      break ;;\n    * )\n      _am_stamp_count=`expr $_am_stamp_count + 1` ;;\n  esac\ndone\necho \"timestamp for $_am_arg\" >`$as_dirname -- \"$_am_arg\" ||\n$as_expr X\"$_am_arg\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$_am_arg\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$_am_arg\" : 'X\\(//\\)$' \\| \\\n\t X\"$_am_arg\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$_am_arg\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`/stamp-h$_am_stamp_count\n ;;\n\n  :C)  { $as_echo \"$as_me:${as_lineno-$LINENO}: executing $ac_file commands\" >&5\n$as_echo \"$as_me: executing $ac_file commands\" >&6;}\n ;;\n  esac\n\n\n  case $ac_file$ac_mode in\n    \"depfiles\":C) test x\"$AMDEP_TRUE\" != x\"\" || {\n  # Autoconf 2.62 quotes --file arguments for eval, but not when files\n  # are listed without --file.  Let's play safe and only enable the eval\n  # if we detect the quoting.\n  case $CONFIG_FILES in\n  *\\'*) eval set x \"$CONFIG_FILES\" ;;\n  *)   set x $CONFIG_FILES ;;\n  esac\n  shift\n  for mf\n  do\n    # Strip MF so we end up with the name of the file.\n    mf=`echo \"$mf\" | sed -e 's/:.*$//'`\n    # Check whether this is an Automake generated Makefile or not.\n    # We used to match only the files named `Makefile.in', but\n    # some people rename them; so instead we look at the file content.\n    # Grep'ing the first line is not enough: some people post-process\n    # each Makefile.in and add a new line on top of each file to say so.\n    # Grep'ing the whole file is not good either: AIX grep has a line\n    # limit of 2048, but all sed's we know have understand at least 4000.\n    if sed -n 's,^#.*generated by automake.*,X,p' \"$mf\" | grep X >/dev/null 2>&1; then\n      dirpart=`$as_dirname -- \"$mf\" ||\n$as_expr X\"$mf\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$mf\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$mf\" : 'X\\(//\\)$' \\| \\\n\t X\"$mf\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$mf\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n    else\n      continue\n    fi\n    # Extract the definition of DEPDIR, am__include, and am__quote\n    # from the Makefile without running `make'.\n    DEPDIR=`sed -n 's/^DEPDIR = //p' < \"$mf\"`\n    test -z \"$DEPDIR\" && continue\n    am__include=`sed -n 's/^am__include = //p' < \"$mf\"`\n    test -z \"am__include\" && continue\n    am__quote=`sed -n 's/^am__quote = //p' < \"$mf\"`\n    # When using ansi2knr, U may be empty or an underscore; expand it\n    U=`sed -n 's/^U = //p' < \"$mf\"`\n    # Find all dependency output files, they are included files with\n    # $(DEPDIR) in their names.  We invoke sed twice because it is the\n    # simplest approach to changing $(DEPDIR) to its actual value in the\n    # expansion.\n    for file in `sed -n \"\n      s/^$am__include $am__quote\\(.*(DEPDIR).*\\)$am__quote\"'$/\\1/p' <\"$mf\" | \\\n\t sed -e 's/\\$(DEPDIR)/'\"$DEPDIR\"'/g' -e 's/\\$U/'\"$U\"'/g'`; do\n      # Make sure the directory exists.\n      test -f \"$dirpart/$file\" && continue\n      fdir=`$as_dirname -- \"$file\" ||\n$as_expr X\"$file\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$file\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$file\" : 'X\\(//\\)$' \\| \\\n\t X\"$file\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$file\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n      as_dir=$dirpart/$fdir; as_fn_mkdir_p\n      # echo \"creating $dirpart/$file\"\n      echo '# dummy' > \"$dirpart/$file\"\n    done\n  done\n}\n ;;\n    \"libtool\":C)\n\n    # See if we are running on zsh, and set the options which allow our\n    # commands through without removal of \\ escapes.\n    if test -n \"${ZSH_VERSION+set}\" ; then\n      setopt NO_GLOB_SUBST\n    fi\n\n    cfgfile=\"${ofile}T\"\n    trap \"$RM \\\"$cfgfile\\\"; exit 1\" 1 2 15\n    $RM \"$cfgfile\"\n\n    cat <<_LT_EOF >> \"$cfgfile\"\n#! $SHELL\n\n# `$ECHO \"$ofile\" | sed 's%^.*/%%'` - Provide generalized library-building support services.\n# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION\n# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:\n# NOTE: Changes made to this file will be lost: look at ltmain.sh.\n#\n#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,\n#                 2006, 2007, 2008 Free Software Foundation, Inc.\n#   Written by Gordon Matzigkeit, 1996\n#\n#   This file is part of GNU Libtool.\n#\n# GNU Libtool is free software; you can redistribute it and/or\n# modify it under the terms of the GNU General Public License as\n# published by the Free Software Foundation; either version 2 of\n# the License, or (at your option) any later version.\n#\n# As a special exception to the GNU General Public License,\n# if you distribute this file as part of a program or library that\n# is built using GNU Libtool, you may include this file under the\n# same distribution terms that you use for the rest of that program.\n#\n# GNU Libtool is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with GNU Libtool; see the file COPYING.  If not, a copy\n# can be downloaded from http://www.gnu.org/licenses/gpl.html, or\n# obtained by writing to the Free Software Foundation, Inc.,\n# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n\n\n# The names of the tagged configurations supported by this script.\navailable_tags=\"\"\n\n# ### BEGIN LIBTOOL CONFIG\n\n# Which release of libtool.m4 was used?\nmacro_version=$macro_version\nmacro_revision=$macro_revision\n\n# Whether or not to build shared libraries.\nbuild_libtool_libs=$enable_shared\n\n# Whether or not to build static libraries.\nbuild_old_libs=$enable_static\n\n# What type of objects to build.\npic_mode=$pic_mode\n\n# Whether or not to optimize for fast installation.\nfast_install=$enable_fast_install\n\n# The host system.\nhost_alias=$host_alias\nhost=$host\nhost_os=$host_os\n\n# The build system.\nbuild_alias=$build_alias\nbuild=$build\nbuild_os=$build_os\n\n# A sed program that does not truncate output.\nSED=$lt_SED\n\n# Sed that helps us avoid accidentally triggering echo(1) options like -n.\nXsed=\"\\$SED -e 1s/^X//\"\n\n# A grep program that handles long lines.\nGREP=$lt_GREP\n\n# An ERE matcher.\nEGREP=$lt_EGREP\n\n# A literal string matcher.\nFGREP=$lt_FGREP\n\n# A BSD- or MS-compatible name lister.\nNM=$lt_NM\n\n# Whether we need soft or hard links.\nLN_S=$lt_LN_S\n\n# What is the maximum length of a command?\nmax_cmd_len=$max_cmd_len\n\n# Object file suffix (normally \"o\").\nobjext=$ac_objext\n\n# Executable file suffix (normally \"\").\nexeext=$exeext\n\n# whether the shell understands \"unset\".\nlt_unset=$lt_unset\n\n# turn spaces into newlines.\nSP2NL=$lt_lt_SP2NL\n\n# turn newlines into spaces.\nNL2SP=$lt_lt_NL2SP\n\n# How to create reloadable object files.\nreload_flag=$lt_reload_flag\nreload_cmds=$lt_reload_cmds\n\n# An object symbol dumper.\nOBJDUMP=$lt_OBJDUMP\n\n# Method to check whether dependent libraries are shared objects.\ndeplibs_check_method=$lt_deplibs_check_method\n\n# Command to use when deplibs_check_method == \"file_magic\".\nfile_magic_cmd=$lt_file_magic_cmd\n\n# The archiver.\nAR=$lt_AR\nAR_FLAGS=$lt_AR_FLAGS\n\n# A symbol stripping program.\nSTRIP=$lt_STRIP\n\n# Commands used to install an old-style archive.\nRANLIB=$lt_RANLIB\nold_postinstall_cmds=$lt_old_postinstall_cmds\nold_postuninstall_cmds=$lt_old_postuninstall_cmds\n\n# A C compiler.\nLTCC=$lt_CC\n\n# LTCC compiler flags.\nLTCFLAGS=$lt_CFLAGS\n\n# Take the output of nm and produce a listing of raw symbols and C names.\nglobal_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe\n\n# Transform the output of nm in a proper C declaration.\nglobal_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl\n\n# Transform the output of nm in a C name address pair.\nglobal_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address\n\n# Transform the output of nm in a C name address pair when lib prefix is needed.\nglobal_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix\n\n# The name of the directory that contains temporary libtool files.\nobjdir=$objdir\n\n# Shell to use when invoking shell scripts.\nSHELL=$lt_SHELL\n\n# An echo program that does not interpret backslashes.\nECHO=$lt_ECHO\n\n# Used to examine libraries when file_magic_cmd begins with \"file\".\nMAGIC_CMD=$MAGIC_CMD\n\n# Must we lock files when doing compilation?\nneed_locks=$lt_need_locks\n\n# Tool to manipulate archived DWARF debug symbol files on Mac OS X.\nDSYMUTIL=$lt_DSYMUTIL\n\n# Tool to change global to local symbols on Mac OS X.\nNMEDIT=$lt_NMEDIT\n\n# Tool to manipulate fat objects and archives on Mac OS X.\nLIPO=$lt_LIPO\n\n# ldd/readelf like tool for Mach-O binaries on Mac OS X.\nOTOOL=$lt_OTOOL\n\n# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.\nOTOOL64=$lt_OTOOL64\n\n# Old archive suffix (normally \"a\").\nlibext=$libext\n\n# Shared library suffix (normally \".so\").\nshrext_cmds=$lt_shrext_cmds\n\n# The commands to extract the exported symbol list from a shared archive.\nextract_expsyms_cmds=$lt_extract_expsyms_cmds\n\n# Variables whose values should be saved in libtool wrapper scripts and\n# restored at link time.\nvariables_saved_for_relink=$lt_variables_saved_for_relink\n\n# Do we need the \"lib\" prefix for modules?\nneed_lib_prefix=$need_lib_prefix\n\n# Do we need a version for libraries?\nneed_version=$need_version\n\n# Library versioning type.\nversion_type=$version_type\n\n# Shared library runtime path variable.\nrunpath_var=$runpath_var\n\n# Shared library path variable.\nshlibpath_var=$shlibpath_var\n\n# Is shlibpath searched before the hard-coded library search path?\nshlibpath_overrides_runpath=$shlibpath_overrides_runpath\n\n# Format of library name prefix.\nlibname_spec=$lt_libname_spec\n\n# List of archive names.  First name is the real one, the rest are links.\n# The last name is the one that the linker finds with -lNAME\nlibrary_names_spec=$lt_library_names_spec\n\n# The coded name of the library, if different from the real name.\nsoname_spec=$lt_soname_spec\n\n# Command to use after installation of a shared archive.\npostinstall_cmds=$lt_postinstall_cmds\n\n# Command to use after uninstallation of a shared archive.\npostuninstall_cmds=$lt_postuninstall_cmds\n\n# Commands used to finish a libtool library installation in a directory.\nfinish_cmds=$lt_finish_cmds\n\n# As \"finish_cmds\", except a single script fragment to be evaled but\n# not shown.\nfinish_eval=$lt_finish_eval\n\n# Whether we should hardcode library paths into libraries.\nhardcode_into_libs=$hardcode_into_libs\n\n# Compile-time system search path for libraries.\nsys_lib_search_path_spec=$lt_sys_lib_search_path_spec\n\n# Run-time system search path for libraries.\nsys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec\n\n# Whether dlopen is supported.\ndlopen_support=$enable_dlopen\n\n# Whether dlopen of programs is supported.\ndlopen_self=$enable_dlopen_self\n\n# Whether dlopen of statically linked programs is supported.\ndlopen_self_static=$enable_dlopen_self_static\n\n# Commands to strip libraries.\nold_striplib=$lt_old_striplib\nstriplib=$lt_striplib\n\n\n# The linker used to build libraries.\nLD=$lt_LD\n\n# Commands used to build an old-style archive.\nold_archive_cmds=$lt_old_archive_cmds\n\n# A language specific compiler.\nCC=$lt_compiler\n\n# Is the compiler the GNU compiler?\nwith_gcc=$GCC\n\n# Compiler flag to turn off builtin functions.\nno_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag\n\n# How to pass a linker flag through the compiler.\nwl=$lt_lt_prog_compiler_wl\n\n# Additional compiler flags for building library objects.\npic_flag=$lt_lt_prog_compiler_pic\n\n# Compiler flag to prevent dynamic linking.\nlink_static_flag=$lt_lt_prog_compiler_static\n\n# Does compiler simultaneously support -c and -o options?\ncompiler_c_o=$lt_lt_cv_prog_compiler_c_o\n\n# Whether or not to add -lc for building shared libraries.\nbuild_libtool_need_lc=$archive_cmds_need_lc\n\n# Whether or not to disallow shared libs when runtime libs are static.\nallow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes\n\n# Compiler flag to allow reflexive dlopens.\nexport_dynamic_flag_spec=$lt_export_dynamic_flag_spec\n\n# Compiler flag to generate shared objects directly from archives.\nwhole_archive_flag_spec=$lt_whole_archive_flag_spec\n\n# Whether the compiler copes with passing no objects directly.\ncompiler_needs_object=$lt_compiler_needs_object\n\n# Create an old-style archive from a shared archive.\nold_archive_from_new_cmds=$lt_old_archive_from_new_cmds\n\n# Create a temporary old-style archive to link instead of a shared archive.\nold_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds\n\n# Commands used to build a shared archive.\narchive_cmds=$lt_archive_cmds\narchive_expsym_cmds=$lt_archive_expsym_cmds\n\n# Commands used to build a loadable module if different from building\n# a shared archive.\nmodule_cmds=$lt_module_cmds\nmodule_expsym_cmds=$lt_module_expsym_cmds\n\n# Whether we are building with GNU ld or not.\nwith_gnu_ld=$lt_with_gnu_ld\n\n# Flag that allows shared libraries with undefined symbols to be built.\nallow_undefined_flag=$lt_allow_undefined_flag\n\n# Flag that enforces no undefined symbols.\nno_undefined_flag=$lt_no_undefined_flag\n\n# Flag to hardcode \\$libdir into a binary during linking.\n# This must work even if \\$libdir does not exist\nhardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec\n\n# If ld is used when linking, flag to hardcode \\$libdir into a binary\n# during linking.  This must work even if \\$libdir does not exist.\nhardcode_libdir_flag_spec_ld=$lt_hardcode_libdir_flag_spec_ld\n\n# Whether we need a single \"-rpath\" flag with a separated argument.\nhardcode_libdir_separator=$lt_hardcode_libdir_separator\n\n# Set to \"yes\" if using DIR/libNAME\\${shared_ext} during linking hardcodes\n# DIR into the resulting binary.\nhardcode_direct=$hardcode_direct\n\n# Set to \"yes\" if using DIR/libNAME\\${shared_ext} during linking hardcodes\n# DIR into the resulting binary and the resulting library dependency is\n# \"absolute\",i.e impossible to change by setting \\${shlibpath_var} if the\n# library is relocated.\nhardcode_direct_absolute=$hardcode_direct_absolute\n\n# Set to \"yes\" if using the -LDIR flag during linking hardcodes DIR\n# into the resulting binary.\nhardcode_minus_L=$hardcode_minus_L\n\n# Set to \"yes\" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR\n# into the resulting binary.\nhardcode_shlibpath_var=$hardcode_shlibpath_var\n\n# Set to \"yes\" if building a shared library automatically hardcodes DIR\n# into the library and all subsequent libraries and executables linked\n# against it.\nhardcode_automatic=$hardcode_automatic\n\n# Set to yes if linker adds runtime paths of dependent libraries\n# to runtime path list.\ninherit_rpath=$inherit_rpath\n\n# Whether libtool must link a program against all its dependency libraries.\nlink_all_deplibs=$link_all_deplibs\n\n# Fix the shell variable \\$srcfile for the compiler.\nfix_srcfile_path=$lt_fix_srcfile_path\n\n# Set to \"yes\" if exported symbols are required.\nalways_export_symbols=$always_export_symbols\n\n# The commands to list exported symbols.\nexport_symbols_cmds=$lt_export_symbols_cmds\n\n# Symbols that should not be listed in the preloaded symbols.\nexclude_expsyms=$lt_exclude_expsyms\n\n# Symbols that must always be exported.\ninclude_expsyms=$lt_include_expsyms\n\n# Commands necessary for linking programs (against libraries) with templates.\nprelink_cmds=$lt_prelink_cmds\n\n# Specify filename containing input files.\nfile_list_spec=$lt_file_list_spec\n\n# How to hardcode a shared library path into an executable.\nhardcode_action=$hardcode_action\n\n# ### END LIBTOOL CONFIG\n\n_LT_EOF\n\n  case $host_os in\n  aix3*)\n    cat <<\\_LT_EOF >> \"$cfgfile\"\n# AIX sometimes has problems with the GCC collect2 program.  For some\n# reason, if we set the COLLECT_NAMES environment variable, the problems\n# vanish in a puff of smoke.\nif test \"X${COLLECT_NAMES+set}\" != Xset; then\n  COLLECT_NAMES=\n  export COLLECT_NAMES\nfi\n_LT_EOF\n    ;;\n  esac\n\n\nltmain=\"$ac_aux_dir/ltmain.sh\"\n\n\n  # We use sed instead of cat because bash on DJGPP gets confused if\n  # if finds mixed CR/LF and LF-only lines.  Since sed operates in\n  # text mode, it properly converts lines to CR/LF.  This bash problem\n  # is reportedly fixed, but why not run on old versions too?\n  sed '/^# Generated shell functions inserted here/q' \"$ltmain\" >> \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\"; exit 1)\n\n  case $xsi_shell in\n  yes)\n    cat << \\_LT_EOF >> \"$cfgfile\"\n\n# func_dirname file append nondir_replacement\n# Compute the dirname of FILE.  If nonempty, add APPEND to the result,\n# otherwise set result to NONDIR_REPLACEMENT.\nfunc_dirname ()\n{\n  case ${1} in\n    */*) func_dirname_result=\"${1%/*}${2}\" ;;\n    *  ) func_dirname_result=\"${3}\" ;;\n  esac\n}\n\n# func_basename file\nfunc_basename ()\n{\n  func_basename_result=\"${1##*/}\"\n}\n\n# func_dirname_and_basename file append nondir_replacement\n# perform func_basename and func_dirname in a single function\n# call:\n#   dirname:  Compute the dirname of FILE.  If nonempty,\n#             add APPEND to the result, otherwise set result\n#             to NONDIR_REPLACEMENT.\n#             value returned in \"$func_dirname_result\"\n#   basename: Compute filename of FILE.\n#             value retuned in \"$func_basename_result\"\n# Implementation must be kept synchronized with func_dirname\n# and func_basename. For efficiency, we do not delegate to\n# those functions but instead duplicate the functionality here.\nfunc_dirname_and_basename ()\n{\n  case ${1} in\n    */*) func_dirname_result=\"${1%/*}${2}\" ;;\n    *  ) func_dirname_result=\"${3}\" ;;\n  esac\n  func_basename_result=\"${1##*/}\"\n}\n\n# func_stripname prefix suffix name\n# strip PREFIX and SUFFIX off of NAME.\n# PREFIX and SUFFIX must not contain globbing or regex special\n# characters, hashes, percent signs, but SUFFIX may contain a leading\n# dot (in which case that matches only a dot).\nfunc_stripname ()\n{\n  # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\n  # positional parameters, so assign one to ordinary parameter first.\n  func_stripname_result=${3}\n  func_stripname_result=${func_stripname_result#\"${1}\"}\n  func_stripname_result=${func_stripname_result%\"${2}\"}\n}\n\n# func_opt_split\nfunc_opt_split ()\n{\n  func_opt_split_opt=${1%%=*}\n  func_opt_split_arg=${1#*=}\n}\n\n# func_lo2o object\nfunc_lo2o ()\n{\n  case ${1} in\n    *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\n    *)    func_lo2o_result=${1} ;;\n  esac\n}\n\n# func_xform libobj-or-source\nfunc_xform ()\n{\n  func_xform_result=${1%.*}.lo\n}\n\n# func_arith arithmetic-term...\nfunc_arith ()\n{\n  func_arith_result=$(( $* ))\n}\n\n# func_len string\n# STRING may not start with a hyphen.\nfunc_len ()\n{\n  func_len_result=${#1}\n}\n\n_LT_EOF\n    ;;\n  *) # Bourne compatible functions.\n    cat << \\_LT_EOF >> \"$cfgfile\"\n\n# func_dirname file append nondir_replacement\n# Compute the dirname of FILE.  If nonempty, add APPEND to the result,\n# otherwise set result to NONDIR_REPLACEMENT.\nfunc_dirname ()\n{\n  # Extract subdirectory from the argument.\n  func_dirname_result=`$ECHO \"X${1}\" | $Xsed -e \"$dirname\"`\n  if test \"X$func_dirname_result\" = \"X${1}\"; then\n    func_dirname_result=\"${3}\"\n  else\n    func_dirname_result=\"$func_dirname_result${2}\"\n  fi\n}\n\n# func_basename file\nfunc_basename ()\n{\n  func_basename_result=`$ECHO \"X${1}\" | $Xsed -e \"$basename\"`\n}\n\n\n# func_stripname prefix suffix name\n# strip PREFIX and SUFFIX off of NAME.\n# PREFIX and SUFFIX must not contain globbing or regex special\n# characters, hashes, percent signs, but SUFFIX may contain a leading\n# dot (in which case that matches only a dot).\n# func_strip_suffix prefix name\nfunc_stripname ()\n{\n  case ${2} in\n    .*) func_stripname_result=`$ECHO \"X${3}\" \\\n           | $Xsed -e \"s%^${1}%%\" -e \"s%\\\\\\\\${2}\\$%%\"`;;\n    *)  func_stripname_result=`$ECHO \"X${3}\" \\\n           | $Xsed -e \"s%^${1}%%\" -e \"s%${2}\\$%%\"`;;\n  esac\n}\n\n# sed scripts:\nmy_sed_long_opt='1s/^\\(-[^=]*\\)=.*/\\1/;q'\nmy_sed_long_arg='1s/^-[^=]*=//'\n\n# func_opt_split\nfunc_opt_split ()\n{\n  func_opt_split_opt=`$ECHO \"X${1}\" | $Xsed -e \"$my_sed_long_opt\"`\n  func_opt_split_arg=`$ECHO \"X${1}\" | $Xsed -e \"$my_sed_long_arg\"`\n}\n\n# func_lo2o object\nfunc_lo2o ()\n{\n  func_lo2o_result=`$ECHO \"X${1}\" | $Xsed -e \"$lo2o\"`\n}\n\n# func_xform libobj-or-source\nfunc_xform ()\n{\n  func_xform_result=`$ECHO \"X${1}\" | $Xsed -e 's/\\.[^.]*$/.lo/'`\n}\n\n# func_arith arithmetic-term...\nfunc_arith ()\n{\n  func_arith_result=`expr \"$@\"`\n}\n\n# func_len string\n# STRING may not start with a hyphen.\nfunc_len ()\n{\n  func_len_result=`expr \"$1\" : \".*\" 2>/dev/null || echo $max_cmd_len`\n}\n\n_LT_EOF\nesac\n\ncase $lt_shell_append in\n  yes)\n    cat << \\_LT_EOF >> \"$cfgfile\"\n\n# func_append var value\n# Append VALUE to the end of shell variable VAR.\nfunc_append ()\n{\n  eval \"$1+=\\$2\"\n}\n_LT_EOF\n    ;;\n  *)\n    cat << \\_LT_EOF >> \"$cfgfile\"\n\n# func_append var value\n# Append VALUE to the end of shell variable VAR.\nfunc_append ()\n{\n  eval \"$1=\\$$1\\$2\"\n}\n\n_LT_EOF\n    ;;\n  esac\n\n\n  sed -n '/^# Generated shell functions inserted here/,$p' \"$ltmain\" >> \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\"; exit 1)\n\n  mv -f \"$cfgfile\" \"$ofile\" ||\n    (rm -f \"$ofile\" && cp \"$cfgfile\" \"$ofile\" && rm -f \"$cfgfile\")\n  chmod +x \"$ofile\"\n\n ;;\n    \"default\":C) chmod +x onig-config ;;\n\n  esac\ndone # for ac_tag\n\n\nas_fn_exit 0\n_ACEOF\nac_clean_files=$ac_clean_files_save\n\ntest $ac_write_fail = 0 ||\n  as_fn_error \"write failure creating $CONFIG_STATUS\" \"$LINENO\" 5\n\n\n# configure is writing to config.log, and then calls config.status.\n# config.status does its own redirection, appending to config.log.\n# Unfortunately, on DOS this fails, as config.log is still kept open\n# by configure, so config.status won't be able to write to it; its\n# output is simply discarded.  So we exec the FD to /dev/null,\n# effectively closing config.log, so it can be properly (re)opened and\n# appended to by config.status.  When coming back to configure, we\n# need to make the FD available again.\nif test \"$no_create\" != yes; then\n  ac_cs_success=:\n  ac_config_status_args=\n  test \"$silent\" = yes &&\n    ac_config_status_args=\"$ac_config_status_args --quiet\"\n  exec 5>/dev/null\n  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false\n  exec 5>>config.log\n  # Use ||, not &&, to avoid exiting from the if with $? = 1, which\n  # would make configure fail if this is the last instruction.\n  $ac_cs_success || as_fn_exit $?\nfi\nif test -n \"$ac_unrecognized_opts\" && test \"$enable_option_checking\" != no; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts\" >&5\n$as_echo \"$as_me: WARNING: unrecognized options: $ac_unrecognized_opts\" >&2;}\nfi\n\n"
  },
  {
    "path": "src/Onigmo/configure.in",
    "content": "dnl Process this file with autoconf to produce a configure script.\nAC_INIT(onig, 5.13.5)\n\nAC_CONFIG_MACRO_DIR([m4])\n\nAM_INIT_AUTOMAKE(foreign)\nAC_CONFIG_HEADER(config.h)\n\n\ndnl default value for RUBYDIR\nRUBYDIR=\"..\"\nAC_ARG_WITH(rubydir,\n\t[  --with-rubydir=RUBYDIR  specify value for RUBYDIR (default ..)],\n\t[ RUBYDIR=$withval ])\nAC_SUBST(RUBYDIR)\n\ndnl default value for STATISTICS\nSTATISTICS=\"\"\nAC_ARG_WITH(statistics,\n\t[  --with-statistics       take matching time statistical data],\n\t[ STATISTICS=-DONIG_DEBUG_STATISTICS ])\nAC_SUBST(STATISTICS)\n\ndnl check for COMBINATION_EXPLOSION\nAC_ARG_ENABLE(combination-explosion-check,\n\t[  --enable-combination-explosion-check   enable combination explosion check],\n\t[comb_expl_check=$enableval])\nif test \"${comb_expl_check}\" = yes; then\n  AC_DEFINE(USE_COMBINATION_EXPLOSION_CHECK,1,[Define if combination explosion check])\nfi\n\ndnl check for CRNL_AS_LINE_TERMINATOR\nAC_ARG_ENABLE(crnl-as-line-terminator,\n\t[  --enable-crnl-as-line-terminator   enable CR+NL as line terminator],\n\t[crnl_as_line_terminator=$enableval])\nif test \"${crnl_as_line_terminator}\" = yes; then\n  AC_DEFINE(USE_CRNL_AS_LINE_TERMINATOR,1,[Define if enable CR+NL as line terminator])\nfi\n\n\ndnl Checks for programs.\nAC_PROG_CC\nAC_PROG_LIBTOOL\nAM_PROG_CC_C_O\nLTVERSION=\"5:0:5\"\nAC_SUBST(LTVERSION)\n\nAC_PROG_INSTALL\nAC_PROG_MAKE_SET\n\ndnl Checks for libraries.\n\ndnl Checks for header files.\nAC_HEADER_STDC\nAC_CHECK_HEADERS(stdlib.h string.h strings.h sys/time.h unistd.h sys/times.h stdint.h)\n\ndnl Checks for typedefs, structures, and compiler characteristics.\nAC_CHECK_SIZEOF(int, 4)\nAC_CHECK_SIZEOF(short, 2)\nAC_CHECK_SIZEOF(long, 4)\nAC_C_CONST\nAC_HEADER_TIME\n\ndnl Checks for library functions.\nAC_FUNC_ALLOCA\nAC_FUNC_MEMCMP\n\nAC_CACHE_CHECK(for prototypes, _cv_have_prototypes,\n  [AC_TRY_COMPILE([int foo(int x) { return 0; }], [return foo(10);],\n\t_cv_have_prototypes=yes,\n\t_cv_have_prototypes=no)])\nif test \"$_cv_have_prototypes\" = yes; then\n  AC_DEFINE(HAVE_PROTOTYPES,1,[Define if compilerr supports prototypes])\nfi\n\nAC_CACHE_CHECK(for variable length prototypes and stdarg.h, _cv_stdarg,\n  [AC_TRY_COMPILE([\n#include <stdarg.h>\nint foo(int x, ...) {\n\tva_list va;\n\tva_start(va, x);\n\tva_arg(va, int);\n\tva_arg(va, char *);\n\tva_arg(va, double);\n\tva_end(va);\n\treturn 0;\n}\n], [return foo(10, \"\", 3.14);],\n\t_cv_stdarg=yes,\n\t_cv_stdarg=no)])\nif test \"$_cv_stdarg\" = yes; then\n  AC_DEFINE(HAVE_STDARG_PROTOTYPES,1,[Define if compiler supports stdarg prototypes])\nfi\n\n\nAC_OUTPUT([Makefile onig-config sample/Makefile], [chmod +x onig-config])\n"
  },
  {
    "path": "src/Onigmo/depcomp",
    "content": "#! /bin/sh\n# depcomp - compile a program generating dependencies as side-effects\n\nscriptversion=2009-04-28.21; # UTC\n\n# Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007, 2009 Free\n# Software Foundation, Inc.\n\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2, or (at your option)\n# any later version.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n\n# You should have received a copy of the GNU General Public License\n# along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.\n\ncase $1 in\n  '')\n     echo \"$0: No command.  Try \\`$0 --help' for more information.\" 1>&2\n     exit 1;\n     ;;\n  -h | --h*)\n    cat <<\\EOF\nUsage: depcomp [--help] [--version] PROGRAM [ARGS]\n\nRun PROGRAMS ARGS to compile a file, generating dependencies\nas side-effects.\n\nEnvironment variables:\n  depmode     Dependency tracking mode.\n  source      Source file read by `PROGRAMS ARGS'.\n  object      Object file output by `PROGRAMS ARGS'.\n  DEPDIR      directory where to store dependencies.\n  depfile     Dependency file to output.\n  tmpdepfile  Temporary file to use when outputing dependencies.\n  libtool     Whether libtool is used (yes/no).\n\nReport bugs to <bug-automake@gnu.org>.\nEOF\n    exit $?\n    ;;\n  -v | --v*)\n    echo \"depcomp $scriptversion\"\n    exit $?\n    ;;\nesac\n\nif test -z \"$depmode\" || test -z \"$source\" || test -z \"$object\"; then\n  echo \"depcomp: Variables source, object and depmode must be set\" 1>&2\n  exit 1\nfi\n\n# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.\ndepfile=${depfile-`echo \"$object\" |\n  sed 's|[^\\\\/]*$|'${DEPDIR-.deps}'/&|;s|\\.\\([^.]*\\)$|.P\\1|;s|Pobj$|Po|'`}\ntmpdepfile=${tmpdepfile-`echo \"$depfile\" | sed 's/\\.\\([^.]*\\)$/.T\\1/'`}\n\nrm -f \"$tmpdepfile\"\n\n# Some modes work just like other modes, but use different flags.  We\n# parameterize here, but still list the modes in the big case below,\n# to make depend.m4 easier to write.  Note that we *cannot* use a case\n# here, because this file can only contain one case statement.\nif test \"$depmode\" = hp; then\n  # HP compiler uses -M and no extra arg.\n  gccflag=-M\n  depmode=gcc\nfi\n\nif test \"$depmode\" = dashXmstdout; then\n   # This is just like dashmstdout with a different argument.\n   dashmflag=-xM\n   depmode=dashmstdout\nfi\n\ncygpath_u=\"cygpath -u -f -\"\nif test \"$depmode\" = msvcmsys; then\n   # This is just like msvisualcpp but w/o cygpath translation.\n   # Just convert the backslash-escaped backslashes to single forward\n   # slashes to satisfy depend.m4\n   cygpath_u=\"sed s,\\\\\\\\\\\\\\\\,/,g\"\n   depmode=msvisualcpp\nfi\n\ncase \"$depmode\" in\ngcc3)\n## gcc 3 implements dependency tracking that does exactly what\n## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like\n## it if -MD -MP comes after the -MF stuff.  Hmm.\n## Unfortunately, FreeBSD c89 acceptance of flags depends upon\n## the command line argument order; so add the flags where they\n## appear in depend2.am.  Note that the slowdown incurred here\n## affects only configure: in makefiles, %FASTDEP% shortcuts this.\n  for arg\n  do\n    case $arg in\n    -c) set fnord \"$@\" -MT \"$object\" -MD -MP -MF \"$tmpdepfile\" \"$arg\" ;;\n    *)  set fnord \"$@\" \"$arg\" ;;\n    esac\n    shift # fnord\n    shift # $arg\n  done\n  \"$@\"\n  stat=$?\n  if test $stat -eq 0; then :\n  else\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  mv \"$tmpdepfile\" \"$depfile\"\n  ;;\n\ngcc)\n## There are various ways to get dependency output from gcc.  Here's\n## why we pick this rather obscure method:\n## - Don't want to use -MD because we'd like the dependencies to end\n##   up in a subdir.  Having to rename by hand is ugly.\n##   (We might end up doing this anyway to support other compilers.)\n## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like\n##   -MM, not -M (despite what the docs say).\n## - Using -M directly means running the compiler twice (even worse\n##   than renaming).\n  if test -z \"$gccflag\"; then\n    gccflag=-MD,\n  fi\n  \"$@\" -Wp,\"$gccflag$tmpdepfile\"\n  stat=$?\n  if test $stat -eq 0; then :\n  else\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  rm -f \"$depfile\"\n  echo \"$object : \\\\\" > \"$depfile\"\n  alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\n## The second -e expression handles DOS-style file names with drive letters.\n  sed -e 's/^[^:]*: / /' \\\n      -e 's/^['$alpha']:\\/[^:]*: / /' < \"$tmpdepfile\" >> \"$depfile\"\n## This next piece of magic avoids the `deleted header file' problem.\n## The problem is that when a header file which appears in a .P file\n## is deleted, the dependency causes make to die (because there is\n## typically no way to rebuild the header).  We avoid this by adding\n## dummy dependencies for each header file.  Too bad gcc doesn't do\n## this for us directly.\n  tr ' ' '\n' < \"$tmpdepfile\" |\n## Some versions of gcc put a space before the `:'.  On the theory\n## that the space means something, we add a space to the output as\n## well.\n## Some versions of the HPUX 10.20 sed can't process this invocation\n## correctly.  Breaking it into two sed invocations is a workaround.\n    sed -e 's/^\\\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\nhp)\n  # This case exists only to let depend.m4 do its work.  It works by\n  # looking at the text of this script.  This case will never be run,\n  # since it is checked for above.\n  exit 1\n  ;;\n\nsgi)\n  if test \"$libtool\" = yes; then\n    \"$@\" \"-Wp,-MDupdate,$tmpdepfile\"\n  else\n    \"$@\" -MDupdate \"$tmpdepfile\"\n  fi\n  stat=$?\n  if test $stat -eq 0; then :\n  else\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  rm -f \"$depfile\"\n\n  if test -f \"$tmpdepfile\"; then  # yes, the sourcefile depend on other files\n    echo \"$object : \\\\\" > \"$depfile\"\n\n    # Clip off the initial element (the dependent).  Don't try to be\n    # clever and replace this with sed code, as IRIX sed won't handle\n    # lines with more than a fixed number of characters (4096 in\n    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;\n    # the IRIX cc adds comments like `#:fec' to the end of the\n    # dependency line.\n    tr ' ' '\n' < \"$tmpdepfile\" \\\n    | sed -e 's/^.*\\.o://' -e 's/#.*$//' -e '/^$/ d' | \\\n    tr '\n' ' ' >> \"$depfile\"\n    echo >> \"$depfile\"\n\n    # The second pass generates a dummy entry for each header file.\n    tr ' ' '\n' < \"$tmpdepfile\" \\\n   | sed -e 's/^.*\\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \\\n   >> \"$depfile\"\n  else\n    # The sourcefile does not contain any dependencies, so just\n    # store a dummy comment line, to avoid errors with the Makefile\n    # \"include basename.Plo\" scheme.\n    echo \"#dummy\" > \"$depfile\"\n  fi\n  rm -f \"$tmpdepfile\"\n  ;;\n\naix)\n  # The C for AIX Compiler uses -M and outputs the dependencies\n  # in a .u file.  In older versions, this file always lives in the\n  # current directory.  Also, the AIX compiler puts `$object:' at the\n  # start of each line; $object doesn't have directory information.\n  # Version 6 uses the directory in both cases.\n  dir=`echo \"$object\" | sed -e 's|/[^/]*$|/|'`\n  test \"x$dir\" = \"x$object\" && dir=\n  base=`echo \"$object\" | sed -e 's|^.*/||' -e 's/\\.o$//' -e 's/\\.lo$//'`\n  if test \"$libtool\" = yes; then\n    tmpdepfile1=$dir$base.u\n    tmpdepfile2=$base.u\n    tmpdepfile3=$dir.libs/$base.u\n    \"$@\" -Wc,-M\n  else\n    tmpdepfile1=$dir$base.u\n    tmpdepfile2=$dir$base.u\n    tmpdepfile3=$dir$base.u\n    \"$@\" -M\n  fi\n  stat=$?\n\n  if test $stat -eq 0; then :\n  else\n    rm -f \"$tmpdepfile1\" \"$tmpdepfile2\" \"$tmpdepfile3\"\n    exit $stat\n  fi\n\n  for tmpdepfile in \"$tmpdepfile1\" \"$tmpdepfile2\" \"$tmpdepfile3\"\n  do\n    test -f \"$tmpdepfile\" && break\n  done\n  if test -f \"$tmpdepfile\"; then\n    # Each line is of the form `foo.o: dependent.h'.\n    # Do two passes, one to just change these to\n    # `$object: dependent.h' and one to simply `dependent.h:'.\n    sed -e \"s,^.*\\.[a-z]*:,$object:,\" < \"$tmpdepfile\" > \"$depfile\"\n    # That's a tab and a space in the [].\n    sed -e 's,^.*\\.[a-z]*:[\t ]*,,' -e 's,$,:,' < \"$tmpdepfile\" >> \"$depfile\"\n  else\n    # The sourcefile does not contain any dependencies, so just\n    # store a dummy comment line, to avoid errors with the Makefile\n    # \"include basename.Plo\" scheme.\n    echo \"#dummy\" > \"$depfile\"\n  fi\n  rm -f \"$tmpdepfile\"\n  ;;\n\nicc)\n  # Intel's C compiler understands `-MD -MF file'.  However on\n  #    icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c\n  # ICC 7.0 will fill foo.d with something like\n  #    foo.o: sub/foo.c\n  #    foo.o: sub/foo.h\n  # which is wrong.  We want:\n  #    sub/foo.o: sub/foo.c\n  #    sub/foo.o: sub/foo.h\n  #    sub/foo.c:\n  #    sub/foo.h:\n  # ICC 7.1 will output\n  #    foo.o: sub/foo.c sub/foo.h\n  # and will wrap long lines using \\ :\n  #    foo.o: sub/foo.c ... \\\n  #     sub/foo.h ... \\\n  #     ...\n\n  \"$@\" -MD -MF \"$tmpdepfile\"\n  stat=$?\n  if test $stat -eq 0; then :\n  else\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  rm -f \"$depfile\"\n  # Each line is of the form `foo.o: dependent.h',\n  # or `foo.o: dep1.h dep2.h \\', or ` dep3.h dep4.h \\'.\n  # Do two passes, one to just change these to\n  # `$object: dependent.h' and one to simply `dependent.h:'.\n  sed \"s,^[^:]*:,$object :,\" < \"$tmpdepfile\" > \"$depfile\"\n  # Some versions of the HPUX 10.20 sed can't process this invocation\n  # correctly.  Breaking it into two sed invocations is a workaround.\n  sed 's,^[^:]*: \\(.*\\)$,\\1,;s/^\\\\$//;/^$/d;/:$/d' < \"$tmpdepfile\" |\n    sed -e 's/$/ :/' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\nhp2)\n  # The \"hp\" stanza above does not work with aCC (C++) and HP's ia64\n  # compilers, which have integrated preprocessors.  The correct option\n  # to use with these is +Maked; it writes dependencies to a file named\n  # 'foo.d', which lands next to the object file, wherever that\n  # happens to be.\n  # Much of this is similar to the tru64 case; see comments there.\n  dir=`echo \"$object\" | sed -e 's|/[^/]*$|/|'`\n  test \"x$dir\" = \"x$object\" && dir=\n  base=`echo \"$object\" | sed -e 's|^.*/||' -e 's/\\.o$//' -e 's/\\.lo$//'`\n  if test \"$libtool\" = yes; then\n    tmpdepfile1=$dir$base.d\n    tmpdepfile2=$dir.libs/$base.d\n    \"$@\" -Wc,+Maked\n  else\n    tmpdepfile1=$dir$base.d\n    tmpdepfile2=$dir$base.d\n    \"$@\" +Maked\n  fi\n  stat=$?\n  if test $stat -eq 0; then :\n  else\n     rm -f \"$tmpdepfile1\" \"$tmpdepfile2\"\n     exit $stat\n  fi\n\n  for tmpdepfile in \"$tmpdepfile1\" \"$tmpdepfile2\"\n  do\n    test -f \"$tmpdepfile\" && break\n  done\n  if test -f \"$tmpdepfile\"; then\n    sed -e \"s,^.*\\.[a-z]*:,$object:,\" \"$tmpdepfile\" > \"$depfile\"\n    # Add `dependent.h:' lines.\n    sed -ne '2,${\n\t       s/^ *//\n\t       s/ \\\\*$//\n\t       s/$/:/\n\t       p\n\t     }' \"$tmpdepfile\" >> \"$depfile\"\n  else\n    echo \"#dummy\" > \"$depfile\"\n  fi\n  rm -f \"$tmpdepfile\" \"$tmpdepfile2\"\n  ;;\n\ntru64)\n   # The Tru64 compiler uses -MD to generate dependencies as a side\n   # effect.  `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.\n   # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put\n   # dependencies in `foo.d' instead, so we check for that too.\n   # Subdirectories are respected.\n   dir=`echo \"$object\" | sed -e 's|/[^/]*$|/|'`\n   test \"x$dir\" = \"x$object\" && dir=\n   base=`echo \"$object\" | sed -e 's|^.*/||' -e 's/\\.o$//' -e 's/\\.lo$//'`\n\n   if test \"$libtool\" = yes; then\n      # With Tru64 cc, shared objects can also be used to make a\n      # static library.  This mechanism is used in libtool 1.4 series to\n      # handle both shared and static libraries in a single compilation.\n      # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.\n      #\n      # With libtool 1.5 this exception was removed, and libtool now\n      # generates 2 separate objects for the 2 libraries.  These two\n      # compilations output dependencies in $dir.libs/$base.o.d and\n      # in $dir$base.o.d.  We have to check for both files, because\n      # one of the two compilations can be disabled.  We should prefer\n      # $dir$base.o.d over $dir.libs/$base.o.d because the latter is\n      # automatically cleaned when .libs/ is deleted, while ignoring\n      # the former would cause a distcleancheck panic.\n      tmpdepfile1=$dir.libs/$base.lo.d   # libtool 1.4\n      tmpdepfile2=$dir$base.o.d          # libtool 1.5\n      tmpdepfile3=$dir.libs/$base.o.d    # libtool 1.5\n      tmpdepfile4=$dir.libs/$base.d      # Compaq CCC V6.2-504\n      \"$@\" -Wc,-MD\n   else\n      tmpdepfile1=$dir$base.o.d\n      tmpdepfile2=$dir$base.d\n      tmpdepfile3=$dir$base.d\n      tmpdepfile4=$dir$base.d\n      \"$@\" -MD\n   fi\n\n   stat=$?\n   if test $stat -eq 0; then :\n   else\n      rm -f \"$tmpdepfile1\" \"$tmpdepfile2\" \"$tmpdepfile3\" \"$tmpdepfile4\"\n      exit $stat\n   fi\n\n   for tmpdepfile in \"$tmpdepfile1\" \"$tmpdepfile2\" \"$tmpdepfile3\" \"$tmpdepfile4\"\n   do\n     test -f \"$tmpdepfile\" && break\n   done\n   if test -f \"$tmpdepfile\"; then\n      sed -e \"s,^.*\\.[a-z]*:,$object:,\" < \"$tmpdepfile\" > \"$depfile\"\n      # That's a tab and a space in the [].\n      sed -e 's,^.*\\.[a-z]*:[\t ]*,,' -e 's,$,:,' < \"$tmpdepfile\" >> \"$depfile\"\n   else\n      echo \"#dummy\" > \"$depfile\"\n   fi\n   rm -f \"$tmpdepfile\"\n   ;;\n\n#nosideeffect)\n  # This comment above is used by automake to tell side-effect\n  # dependency tracking mechanisms from slower ones.\n\ndashmstdout)\n  # Important note: in order to support this mode, a compiler *must*\n  # always write the preprocessed file to stdout, regardless of -o.\n  \"$@\" || exit $?\n\n  # Remove the call to Libtool.\n  if test \"$libtool\" = yes; then\n    while test \"X$1\" != 'X--mode=compile'; do\n      shift\n    done\n    shift\n  fi\n\n  # Remove `-o $object'.\n  IFS=\" \"\n  for arg\n  do\n    case $arg in\n    -o)\n      shift\n      ;;\n    $object)\n      shift\n      ;;\n    *)\n      set fnord \"$@\" \"$arg\"\n      shift # fnord\n      shift # $arg\n      ;;\n    esac\n  done\n\n  test -z \"$dashmflag\" && dashmflag=-M\n  # Require at least two characters before searching for `:'\n  # in the target name.  This is to cope with DOS-style filenames:\n  # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.\n  \"$@\" $dashmflag |\n    sed 's:^[  ]*[^: ][^:][^:]*\\:[    ]*:'\"$object\"'\\: :' > \"$tmpdepfile\"\n  rm -f \"$depfile\"\n  cat < \"$tmpdepfile\" > \"$depfile\"\n  tr ' ' '\n' < \"$tmpdepfile\" | \\\n## Some versions of the HPUX 10.20 sed can't process this invocation\n## correctly.  Breaking it into two sed invocations is a workaround.\n    sed -e 's/^\\\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\ndashXmstdout)\n  # This case only exists to satisfy depend.m4.  It is never actually\n  # run, as this mode is specially recognized in the preamble.\n  exit 1\n  ;;\n\nmakedepend)\n  \"$@\" || exit $?\n  # Remove any Libtool call\n  if test \"$libtool\" = yes; then\n    while test \"X$1\" != 'X--mode=compile'; do\n      shift\n    done\n    shift\n  fi\n  # X makedepend\n  shift\n  cleared=no eat=no\n  for arg\n  do\n    case $cleared in\n    no)\n      set \"\"; shift\n      cleared=yes ;;\n    esac\n    if test $eat = yes; then\n      eat=no\n      continue\n    fi\n    case \"$arg\" in\n    -D*|-I*)\n      set fnord \"$@\" \"$arg\"; shift ;;\n    # Strip any option that makedepend may not understand.  Remove\n    # the object too, otherwise makedepend will parse it as a source file.\n    -arch)\n      eat=yes ;;\n    -*|$object)\n      ;;\n    *)\n      set fnord \"$@\" \"$arg\"; shift ;;\n    esac\n  done\n  obj_suffix=`echo \"$object\" | sed 's/^.*\\././'`\n  touch \"$tmpdepfile\"\n  ${MAKEDEPEND-makedepend} -o\"$obj_suffix\" -f\"$tmpdepfile\" \"$@\"\n  rm -f \"$depfile\"\n  cat < \"$tmpdepfile\" > \"$depfile\"\n  sed '1,2d' \"$tmpdepfile\" | tr ' ' '\n' | \\\n## Some versions of the HPUX 10.20 sed can't process this invocation\n## correctly.  Breaking it into two sed invocations is a workaround.\n    sed -e 's/^\\\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> \"$depfile\"\n  rm -f \"$tmpdepfile\" \"$tmpdepfile\".bak\n  ;;\n\ncpp)\n  # Important note: in order to support this mode, a compiler *must*\n  # always write the preprocessed file to stdout.\n  \"$@\" || exit $?\n\n  # Remove the call to Libtool.\n  if test \"$libtool\" = yes; then\n    while test \"X$1\" != 'X--mode=compile'; do\n      shift\n    done\n    shift\n  fi\n\n  # Remove `-o $object'.\n  IFS=\" \"\n  for arg\n  do\n    case $arg in\n    -o)\n      shift\n      ;;\n    $object)\n      shift\n      ;;\n    *)\n      set fnord \"$@\" \"$arg\"\n      shift # fnord\n      shift # $arg\n      ;;\n    esac\n  done\n\n  \"$@\" -E |\n    sed -n -e '/^# [0-9][0-9]* \"\\([^\"]*\\)\".*/ s:: \\1 \\\\:p' \\\n       -e '/^#line [0-9][0-9]* \"\\([^\"]*\\)\".*/ s:: \\1 \\\\:p' |\n    sed '$ s: \\\\$::' > \"$tmpdepfile\"\n  rm -f \"$depfile\"\n  echo \"$object : \\\\\" > \"$depfile\"\n  cat < \"$tmpdepfile\" >> \"$depfile\"\n  sed < \"$tmpdepfile\" '/^$/d;s/^ //;s/ \\\\$//;s/$/ :/' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\nmsvisualcpp)\n  # Important note: in order to support this mode, a compiler *must*\n  # always write the preprocessed file to stdout.\n  \"$@\" || exit $?\n\n  # Remove the call to Libtool.\n  if test \"$libtool\" = yes; then\n    while test \"X$1\" != 'X--mode=compile'; do\n      shift\n    done\n    shift\n  fi\n\n  IFS=\" \"\n  for arg\n  do\n    case \"$arg\" in\n    -o)\n      shift\n      ;;\n    $object)\n      shift\n      ;;\n    \"-Gm\"|\"/Gm\"|\"-Gi\"|\"/Gi\"|\"-ZI\"|\"/ZI\")\n\tset fnord \"$@\"\n\tshift\n\tshift\n\t;;\n    *)\n\tset fnord \"$@\" \"$arg\"\n\tshift\n\tshift\n\t;;\n    esac\n  done\n  \"$@\" -E 2>/dev/null |\n  sed -n '/^#line [0-9][0-9]* \"\\([^\"]*\\)\"/ s::\\1:p' | $cygpath_u | sort -u > \"$tmpdepfile\"\n  rm -f \"$depfile\"\n  echo \"$object : \\\\\" > \"$depfile\"\n  sed < \"$tmpdepfile\" -n -e 's% %\\\\ %g' -e '/^\\(.*\\)$/ s::\t\\1 \\\\:p' >> \"$depfile\"\n  echo \"\t\" >> \"$depfile\"\n  sed < \"$tmpdepfile\" -n -e 's% %\\\\ %g' -e '/^\\(.*\\)$/ s::\\1\\::p' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\nmsvcmsys)\n  # This case exists only to let depend.m4 do its work.  It works by\n  # looking at the text of this script.  This case will never be run,\n  # since it is checked for above.\n  exit 1\n  ;;\n\nnone)\n  exec \"$@\"\n  ;;\n\n*)\n  echo \"Unknown depmode $depmode\" 1>&2\n  exit 1\n  ;;\nesac\n\nexit 0\n\n# Local Variables:\n# mode: shell-script\n# sh-indentation: 2\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"scriptversion=\"\n# time-stamp-format: \"%:y-%02m-%02d.%02H\"\n# time-stamp-time-zone: \"UTC\"\n# time-stamp-end: \"; # UTC\"\n# End:\n"
  },
  {
    "path": "src/Onigmo/doc/API",
    "content": "Onigmo (Oniguruma-mod) API  Version 5.11.4  2011/10/08\n\n#include <oniguruma.h>\n\n\n# int onig_init(void)\n\n  Initialize library.\n\n  You don't have to call it explicitly, because it is called in onig_new().\n\n\n# int onig_error_code_to_str(UChar* err_buf, OnigPosition err_code, ...)\n\n  Get error message string.\n  If this function is used for onig_new(),\n  don't call this after the pattern argument of onig_new() is freed.\n\n  normal return: error message string length\n\n  arguments\n  1 err_buf:              error message string buffer.\n                          (required size: ONIG_MAX_ERROR_MESSAGE_LEN)\n  2 err_code:             error code returned by other API functions.\n  3 err_info (optional):  error info returned by onig_new().\n\n\n# void onig_set_warn_func(OnigWarnFunc func)\n\n  Set warning function.\n\n  WARNING:\n    '[', '-', ']' in character class without escape.\n    ']' in pattern without escape.\n\n  arguments\n  1 func:     function pointer.    void (*func)(char* warning_message)\n\n\n# void onig_set_verb_warn_func(OnigWarnFunc func)\n\n  Set verbose warning function.\n\n  WARNING:\n    redundant nested repeat operator.\n\n  arguments\n  1 func:     function pointer.    void (*func)(char* warning_message)\n\n\n# int onig_new(regex_t** reg, const UChar* pattern, const UChar* pattern_end,\n            OnigOptionType option, OnigEncoding enc, OnigSyntaxType* syntax,\n            OnigErrorInfo* err_info)\n\n  Create a regex object.\n\n  normal return: ONIG_NORMAL\n\n  arguments\n  1 reg:         return regex object's address.\n  2 pattern:     regex pattern string.\n  3 pattern_end: terminate address of pattern. (pattern + pattern length)\n  4 option:      compile time options.\n\n      ONIG_OPTION_NONE               no option\n      ONIG_OPTION_SINGLELINE         '^' -> '\\A', '$' -> '\\Z'\n      ONIG_OPTION_DOTALL             '.' match with newline\n      ONIG_OPTION_MULTILINE          same as ONIG_OPTION_DOTALL\n      ONIG_OPTION_IGNORECASE         ambiguity match on\n      ONIG_OPTION_EXTEND             extended pattern form\n      ONIG_OPTION_FIND_LONGEST       find longest match\n      ONIG_OPTION_FIND_NOT_EMPTY     ignore empty match\n      ONIG_OPTION_NEGATE_SINGLELINE\n            clear ONIG_OPTION_SINGLELINE which is enabled on\n            ONIG_SYNTAX_POSIX_BASIC, ONIG_SYNTAX_POSIX_EXTENDED,\n            ONIG_SYNTAX_PERL, ONIG_SYNTAX_PERL58, ONIG_SYNTAX_PERL58_NG,\n            ONIG_SYNTAX_JAVA, ONIG_SYNTAX_PYTHON\n\n      ONIG_OPTION_DONT_CAPTURE_GROUP only named group captured.\n      ONIG_OPTION_CAPTURE_GROUP      named and no-named group captured.\n\n      ONIG_OPTION_NEWLINE_CRLF\n            Treat CR+LF as a newline too. (default: LF only)\n            To use this option, you must enable the following line in regenc.h.\n\n            /* #define USE_CRNL_AS_LINE_TERMINATOR */\n\n  5 enc:        character encoding.\n\n      ONIG_ENCODING_ASCII         ASCII\n      ONIG_ENCODING_ISO_8859_1    ISO 8859-1\n      ONIG_ENCODING_ISO_8859_2    ISO 8859-2\n      ONIG_ENCODING_ISO_8859_3    ISO 8859-3\n      ONIG_ENCODING_ISO_8859_4    ISO 8859-4\n      ONIG_ENCODING_ISO_8859_5    ISO 8859-5\n      ONIG_ENCODING_ISO_8859_6    ISO 8859-6\n      ONIG_ENCODING_ISO_8859_7    ISO 8859-7\n      ONIG_ENCODING_ISO_8859_8    ISO 8859-8\n      ONIG_ENCODING_ISO_8859_9    ISO 8859-9\n      ONIG_ENCODING_ISO_8859_10   ISO 8859-10\n      ONIG_ENCODING_ISO_8859_11   ISO 8859-11\n      ONIG_ENCODING_ISO_8859_13   ISO 8859-13\n      ONIG_ENCODING_ISO_8859_14   ISO 8859-14\n      ONIG_ENCODING_ISO_8859_15   ISO 8859-15\n      ONIG_ENCODING_ISO_8859_16   ISO 8859-16\n      ONIG_ENCODING_UTF8          UTF-8\n      ONIG_ENCODING_UTF16_BE      UTF-16BE\n      ONIG_ENCODING_UTF16_LE      UTF-16LE\n      ONIG_ENCODING_UTF32_BE      UTF-32BE\n      ONIG_ENCODING_UTF32_LE      UTF-32LE\n      ONIG_ENCODING_EUC_JP        EUC-JP\n      ONIG_ENCODING_EUC_TW        EUC-TW\n      ONIG_ENCODING_EUC_KR        EUC-KR\n      ONIG_ENCODING_EUC_CN        EUC-CN\n      ONIG_ENCODING_SJIS          Shift_JIS\n      ONIG_ENCODING_KOI8_R        KOI8-R\n      ONIG_ENCODING_CP1251        CP1251\n      ONIG_ENCODING_BIG5          Big5\n      ONIG_ENCODING_GB18030       GB18030\n\n      or any OnigEncodingType data address defined by user.\n\n  6 syntax:     address of pattern syntax definition.\n\n      ONIG_SYNTAX_ASIS              plain text\n      ONIG_SYNTAX_POSIX_BASIC       POSIX Basic RE\n      ONIG_SYNTAX_POSIX_EXTENDED    POSIX Extended RE\n      ONIG_SYNTAX_EMACS             Emacs\n      ONIG_SYNTAX_GREP              grep\n      ONIG_SYNTAX_GNU_REGEX         GNU regex\n      ONIG_SYNTAX_JAVA              Java (Sun java.util.regex)\n      ONIG_SYNTAX_PERL58            Perl 5.8\n      ONIG_SYNTAX_PERL58_NG         Perl 5.8 + named group\n      ONIG_SYNTAX_PERL              Perl 5.10+\n      ONIG_SYNTAX_PYTHON            Python\n      ONIG_SYNTAX_RUBY              Ruby\n      ONIG_SYNTAX_DEFAULT           default (== Ruby)\n                                   onig_set_default_syntax()\n\n      or any OnigSyntaxType data address defined by user.\n\n  7 err_info: address for return optional error info.\n              Use this value as 3rd argument of onig_error_code_to_str().\n\n\n\n# int onig_new_without_alloc(regex_t* reg, const UChar* pattern,\n            const UChar* pattern_end,\n            OnigOptionType option, OnigEncoding enc, OnigSyntaxType* syntax,\n            OnigErrorInfo* err_info)\n\n  Create a regex object.\n  reg object area is not allocated in this function.\n\n  normal return: ONIG_NORMAL\n\n\n\n# int onig_new_deluxe(regex_t** reg, const UChar* pattern, const UChar* pattern_end,\n                      OnigCompileInfo* ci, OnigErrorInfo* einfo)\n\n  Create a regex object.\n  This function is deluxe version of onig_new().\n\n  normal return: ONIG_NORMAL\n\n  arguments\n  1 reg:         return address of regex object.\n  2 pattern:     regex pattern string.\n  3 pattern_end: terminate address of pattern. (pattern + pattern length)\n  4 ci:          compile time info.\n\n    ci->num_of_elements: number of elements in ci. (current version: 5)\n    ci->pattern_enc:     pattern string character encoding.\n    ci->target_enc:      target string character encoding.\n    ci->syntax:          address of pattern syntax definition.\n    ci->option:          compile time option.\n    ci->case_fold_flag:  character matching case fold bit flag for\n                         ONIG_OPTION_IGNORECASE mode.\n\n       ONIGENC_CASE_FOLD_MIN:           minimum\n       ONIGENC_CASE_FOLD_DEFAULT:       minimum\n                                        onig_set_default_case_fold_flag()\n\n  5 err_info:    address for return optional error info.\n                 Use this value as 3rd argument of onig_error_code_to_str().\n\n\n  Different character encoding combination is allowed for\n  the following cases only.\n\n    pattern_enc: ASCII, ISO_8859_1\n    target_enc:  UTF16_BE, UTF16_LE, UTF32_BE, UTF32_LE\n\n    pattern_enc: UTF16_BE/LE\n    target_enc:  UTF16_LE/BE\n\n    pattern_enc: UTF32_BE/LE\n    target_enc:  UTF32_LE/BE\n\n\n# void onig_free(regex_t* reg)\n\n  Free memory used by regex object.\n\n  arguments\n  1 reg: regex object.\n\n\n# void onig_free_body(regex_t* reg)\n\n  Free memory used by regex object. (Except reg oneself.)\n\n  arguments\n  1 reg: regex object.\n\n\n# OnigPosition onig_search(regex_t* reg, const UChar* str, const UChar* end,\n                   const UChar* start, const UChar* range, OnigRegion* region,\n                   OnigOptionType option)\n# OnigPosition onig_search_gpos(regex_t* reg, const UChar* str, const UChar* end,\n                   const UChar* global_pos,\n                   const UChar* start, const UChar* range, OnigRegion* region,\n                   OnigOptionType option)\n\n  Search string and return search result and matching region.\n\n  normal return: match position offset (i.e.  p - str >= 0)\n  not found:     ONIG_MISMATCH (< 0)\n\n  arguments\n  1 reg:        regex object\n  2 str:        target string\n  3 end:        terminate address of target string\n  4 global_pos: position of \\G\n                if not need, set same value as str.\n  5 start:      search start address of target string\n  6 range:      search terminate address of target string\n    in forward search  (start <= searched string < range)\n    in backward search (range <= searched string <= start)\n  7 region:     address for return group match range info (NULL is allowed)\n  8 option:     search time option\n\n    ONIG_OPTION_NOTBOL        string head(str) isn't considered as begin of line\n    ONIG_OPTION_NOTEOL        string end (end) isn't considered as end of line\n    ONIG_OPTION_POSIX_REGION  region argument is regmatch_t[] of POSIX API.\n\n\n# OnigPosition onig_match(regex_t* reg, const UChar* str, const UChar* end,\n\t\t const UChar* at, OnigRegion* region, OnigOptionType option)\n\n  Match string and return result and matching region.\n\n  normal return: match length  (>= 0)\n  not match:     ONIG_MISMATCH ( < 0)\n\n  arguments\n  1 reg:    regex object\n  2 str:    target string\n  3 end:    terminate address of target string\n  4 at:     match address of target string\n  5 region: address for return group match range info (NULL is allowed)\n  6 option: search time option\n\n    ONIG_OPTION_NOTBOL       string head(str) isn't considered as begin of line\n    ONIG_OPTION_NOTEOL       string end (end) isn't considered as end of line\n    ONIG_OPTION_POSIX_REGION region argument is regmatch_t[] type of POSIX API.\n\n\n# OnigRegion* onig_region_new(void)\n\n  Create a region.\n\n\n# void onig_region_free(OnigRegion* region, int free_self)\n\n  Free memory used by region.\n\n  arguments\n  1 region:    target region\n  2 free_self: [1: free all, 0: free memory used in region but not self]\n\n\n# void onig_region_copy(OnigRegion* to, OnigRegion* from)\n\n  Copy contents of region.\n\n  arguments\n  1 to:   target region\n  2 from: source region\n\n\n# void onig_region_clear(OnigRegion* region)\n\n  Clear contents of region.\n\n  arguments\n  1 region: target region\n\n\n# int onig_region_resize(OnigRegion* region, int n)\n\n  Resize group range area of region.\n\n  normal return: ONIG_NORMAL\n\n  arguments\n  1 region: target region\n  2 n:      new size\n\n\n# int onig_name_to_group_numbers(regex_t* reg, const UChar* name, const UChar* name_end,\n                                  int** num_list)\n\n  Return the group number list of the name.\n  Named subexp is defined by (?<name>....).\n\n  normal return:  number of groups for the name.\n                  (ex. /(?<x>..)(?<x>..)/  ==>  2)\n  name not found: -1\n\n  arguments\n  1 reg:       regex object.\n  2 name:      group name.\n  3 name_end:  terminate address of group name.\n  4 num_list:  return list of group number.\n\n\n# int onig_name_to_backref_number(regex_t* reg, const UChar* name, const UChar* name_end,\n                                  OnigRegion *region)\n\n  Return the group number corresponding to the named backref (\\k<name>).\n  If two or more regions for the groups of the name are effective,\n  the greatest number in it is obtained.\n\n  normal return: group number.\n\n  arguments\n  1 reg:      regex object.\n  2 name:     group name.\n  3 name_end: terminate address of group name.\n  4 region:   search/match result region.\n\n\n# int onig_foreach_name(regex_t* reg,\n                        int (*func)(const UChar*, const UChar*, int,int*,regex_t*,void*),\n                        void* arg)\n\n  Iterate function call for all names.\n\n  normal return: 0\n  error:         func's return value.\n\n  arguments\n  1 reg:     regex object.\n  2 func:    callback function.\n             func(name, name_end, <number of groups>, <group number's list>,\n                  reg, arg);\n             if func does not return 0, then iteration is stopped.\n  3 arg:     argument for func.\n\n\n# int onig_number_of_names(regex_t* reg)\n\n  Return the number of names defined in the pattern.\n  Multiple definitions of one name is counted as one.\n\n  arguments\n  1 reg:     regex object.\n\n\n# OnigEncoding     onig_get_encoding(regex_t* reg)\n# OnigOptionType   onig_get_options(regex_t* reg)\n# OnigCaseFoldType onig_get_case_fold_flag(regex_t* reg)\n# OnigSyntaxType*  onig_get_syntax(regex_t* reg)\n\n  Return a value of the regex object.\n\n  arguments\n  1 reg:     regex object.\n\n\n# int onig_number_of_captures(regex_t* reg)\n\n  Return the number of capture group in the pattern.\n\n  arguments\n  1 reg:     regex object.\n\n\n# int onig_number_of_capture_histories(regex_t* reg)\n\n  Return the number of capture history defined in the pattern.\n\n  You can't use capture history if ONIG_SYN_OP2_ATMARK_CAPTURE_HISTORY\n  is disabled in the pattern syntax.(disabled in the default syntax)\n\n  arguments\n  1 reg:     regex object.\n\n\n\n# OnigCaptureTreeNode* onig_get_capture_tree(OnigRegion* region)\n\n  Return the root node of capture history data tree.\n\n  This value is undefined if matching has faild.\n\n  arguments\n  1 region: matching result.\n\n\n# int onig_capture_tree_traverse(OnigRegion* region, int at,\n                  int(*func)(int,OnigPosition,OnigPosition,int,int,void*),\n                  void* arg)\n\n Traverse and callback in capture history data tree.\n\n  normal return: 0\n  error:         callback func's return value.\n\n  arguments\n  1 region:  match region data.\n  2 at:      callback position.\n\n    ONIG_TRAVERSE_CALLBACK_AT_FIRST: callback first, then traverse children.\n    ONIG_TRAVERSE_CALLBACK_AT_LAST:  traverse children first, then callback.\n    ONIG_TRAVERSE_CALLBACK_AT_BOTH:  callback first, then traverse children,\n                                     and at last callback again.\n\n  3 func:    callback function.\n             if func does not return 0, then traverse is stopped.\n\n             int func(int group, OnigPosition beg, OnigPosition end,\n                      int level, int at, void* arg)\n\n               group: group number\n               beg:   capture start position\n               end:   capture end position\n               level: nest level (from 0)\n               at:    callback position\n                      ONIG_TRAVERSE_CALLBACK_AT_FIRST\n                      ONIG_TRAVERSE_CALLBACK_AT_LAST\n               arg:   optional callback argument\n\n  4 arg;     optional callback argument.\n\n\n# int onig_noname_group_capture_is_active(regex_t* reg)\n\n  Return noname group capture activity.\n\n  active:   1\n  inactive: 0\n\n  arguments\n  1 reg:     regex object.\n\n  if option ONIG_OPTION_DONT_CAPTURE_GROUP == ON\n    --> inactive\n\n  if the regex pattern have named group\n     and syntax ONIG_SYN_CAPTURE_ONLY_NAMED_GROUP == ON\n     and option ONIG_OPTION_CAPTURE_GROUP == OFF\n    --> inactive\n\n  else --> active\n\n\n# UChar* onigenc_get_prev_char_head(OnigEncoding enc, const UChar* start, const UChar* s)\n\n  Return previous character head address.\n\n  arguments\n  1 enc:   character encoding\n  2 start: string address\n  3 s:     target address of string\n\n\n# UChar* onigenc_get_left_adjust_char_head(OnigEncoding enc,\n                                           const UChar* start, const UChar* s)\n\n  Return left-adjusted head address of a character.\n\n  arguments\n  1 enc:   character encoding\n  2 start: string address\n  3 s:     target address of string\n\n\n# UChar* onigenc_get_right_adjust_char_head(OnigEncoding enc,\n                                            const UChar* start, const UChar* s)\n\n  Return right-adjusted head address of a character.\n\n  arguments\n  1 enc:   character encoding\n  2 start: string address\n  3 s:     target address of string\n\n\n# int onigenc_strlen(OnigEncoding enc, const UChar* s, const UChar* end)\n# int onigenc_strlen_null(OnigEncoding enc, const UChar* s)\n\n  Return number of characters in the string.\n\n\n# int onigenc_str_bytelen_null(OnigEncoding enc, const UChar* s)\n\n  Return number of bytes in the string.\n\n\n# int onig_set_default_syntax(OnigSyntaxType* syntax)\n\n  Set default syntax.\n\n  arguments\n  1 syntax: address of pattern syntax definition.\n\n\n# void onig_copy_syntax(OnigSyntaxType* to, const OnigSyntaxType* from)\n\n  Copy syntax.\n\n  arguments\n  1 to:   destination address.\n  2 from: source address.\n\n\n# unsigned int onig_get_syntax_op(OnigSyntaxType* syntax)\n# unsigned int onig_get_syntax_op2(OnigSyntaxType* syntax)\n# unsigned int onig_get_syntax_behavior(OnigSyntaxType* syntax)\n# OnigOptionType onig_get_syntax_options(OnigSyntaxType* syntax)\n\n# void onig_set_syntax_op(OnigSyntaxType* syntax, unsigned int op)\n# void onig_set_syntax_op2(OnigSyntaxType* syntax, unsigned int op2)\n# void onig_set_syntax_behavior(OnigSyntaxType* syntax, unsigned int behavior)\n# void onig_set_syntax_options(OnigSyntaxType* syntax, OnigOptionType options)\n\n Get/Set elements of the syntax.\n\n  arguments\n  1 syntax:  syntax\n  2 op, op2, behavior, options: value of element.\n\n\n# void onig_copy_encoding(OnigEncoding to, OnigOnigEncoding from)\n\n  Copy encoding.\n\n  arguments\n  1 to:   destination address.\n  2 from: source address.\n\n\n# int onig_set_meta_char(OnigSyntaxType* syntax, unsigned int what,\n                         OnigCodePoint code)\n\n  Set a variable meta character to the code point value.\n  Except for an escape character, this meta characters specification\n  is not work, if ONIG_SYN_OP_VARIABLE_META_CHARACTERS is not effective\n  by the syntax. (Build-in syntaxes are not effective.)\n\n  normal return: ONIG_NORMAL\n\n  arguments\n  1 syntax: target syntax\n  2 what:   specifies which meta character it is.\n\n          ONIG_META_CHAR_ESCAPE\n          ONIG_META_CHAR_ANYCHAR\n          ONIG_META_CHAR_ANYTIME\n          ONIG_META_CHAR_ZERO_OR_ONE_TIME\n          ONIG_META_CHAR_ONE_OR_MORE_TIME\n          ONIG_META_CHAR_ANYCHAR_ANYTIME\n\n  3 code: meta character or ONIG_INEFFECTIVE_META_CHAR.\n\n\n# OnigCaseFoldType onig_get_default_case_fold_flag()\n\n  Get default case fold flag.\n\n\n# int onig_set_default_case_fold_flag(OnigCaseFoldType case_fold_flag)\n\n  Set default case fold flag.\n\n  1 case_fold_flag: case fold flag\n\n\n# unsigned int onig_get_match_stack_limit_size(void)\n\n  Return the maximum number of stack size.\n  (default: 0 == unlimited)\n\n\n# int onig_set_match_stack_limit_size(unsigned int size)\n\n  Set the maximum number of stack size.\n  (size = 0: unlimited)\n\n  normal return: ONIG_NORMAL\n\n\n# int onig_end(void)\n\n  The use of this library is finished.\n\n  normal return: ONIG_NORMAL\n\n  It is not allowed to use regex objects which created\n  before onig_end() call.\n\n\n# const char* onig_version(void)\n\n  Return version string.  (ex. \"5.0.3\")\n\n// END\n"
  },
  {
    "path": "src/Onigmo/doc/API.ja",
    "content": "Onigmo インターフェース Version 5.11.4   2011/10/08\n\n#include <oniguruma.h>\n\n\n# int onig_init(void)\n\n  ライブラリの初期化\n\n  onig_new()の中で呼び出されるので、この関数を明示的に呼び出さなくてもよい。\n\n\n# int onig_error_code_to_str(UChar* err_buf, OnigPosition err_code, ...)\n\n  エラーメッセージを取得する。\n\n  この関数を、onig_new()の結果に対して呼び出す場合には、onig_new()のpattern引数を\n  メモリ解放するよりも前に呼び出さなければならない。\n\n  正常終了戻り値: エラーメッセージ文字列のバイト長\n\n  引数\n  1 err_buf:              エラーメッセージを格納する領域\n                          (必要なサイズ: ONIG_MAX_ERROR_MESSAGE_LEN)\n  2 err_code:             エラーコード\n  3 err_info (optional):  onig_new()のerr_info\n\n\n# void onig_set_warn_func(OnigWarnFunc func)\n\n  警告通知関数をセットする。\n\n  警告:\n    '[', '-', ']' in character class without escape.\n    ']' in pattern without escape.\n\n  引数\n  1 func:    警告関数    void (*func)(char* warning_message)\n\n\n# void onig_set_verb_warn_func(OnigWarnFunc func)\n\n  詳細警告通知関数をセットする。\n\n  詳細警告:\n    redundant nested repeat operator.\n\n  引数\n  1 func:    詳細警告関数    void (*func)(char* warning_message)\n\n\n# int onig_new(regex_t** reg, const UChar* pattern, const UChar* pattern_end,\n            OnigOptionType option, OnigEncoding enc, OnigSyntaxType* syntax,\n            OnigErrorInfo* err_info)\n\n  正規表現オブジェクト(regex)を作成する。\n\n  正常終了戻り値: ONIG_NORMAL\n\n  引数\n  1 reg:         作成された正規表現オブジェクトを返すアドレス\n  2 pattern:     正規表現パターン文字列\n  3 pattern_end: 正規表現パターン文字列の終端アドレス(pattern + pattern length)\n  4 option:      正規表現コンパイル時オプション\n\n      ONIG_OPTION_NONE               オプションなし\n      ONIG_OPTION_SINGLELINE         '^' -> '\\A', '$' -> '\\Z'\n      ONIG_OPTION_DOTALL             '.'が改行にマッチする\n      ONIG_OPTION_MULTILINE          ONIG_OPTION_DOTALLと同じ\n      ONIG_OPTION_IGNORECASE         曖昧マッチ オン\n      ONIG_OPTION_EXTEND             パターン拡張形式\n      ONIG_OPTION_FIND_LONGEST       最長マッチ\n      ONIG_OPTION_FIND_NOT_EMPTY     空マッチを無視\n      ONIG_OPTION_NEGATE_SINGLELINE\n            ONIG_SYNTAX_POSIX_BASIC, ONIG_SYNTAX_POSIX_EXTENDED,\n            ONIG_SYNTAX_PERL, ONIG_SYNTAX_PERL58, ONIG_SYNTAX_PERL58_NG,\n            ONIG_SYNTAX_JAVA, ONIG_SYNTAX_PYTHONで\n            デフォルトで有効なONIG_OPTION_SINGLELINEをクリアする。\n\n      ONIG_OPTION_DONT_CAPTURE_GROUP 名前付き捕獲式集合のみ捕獲\n      ONIG_OPTION_CAPTURE_GROUP      名前無し捕獲式集合も捕獲\n\n      ONIG_OPTION_NEWLINE_CRLF\n            CR+LFも改行として扱う。(デフォルトではLFのみ。)\n            この機能を使うには、regenc.hの以下の行を有効にする必要がある。\n\n            /* #define USE_CRNL_AS_LINE_TERMINATOR */\n\n  5 enc:        文字エンコーディング\n\n      ONIG_ENCODING_ASCII         ASCII\n      ONIG_ENCODING_ISO_8859_1    ISO 8859-1\n      ONIG_ENCODING_ISO_8859_2    ISO 8859-2\n      ONIG_ENCODING_ISO_8859_3    ISO 8859-3\n      ONIG_ENCODING_ISO_8859_4    ISO 8859-4\n      ONIG_ENCODING_ISO_8859_5    ISO 8859-5\n      ONIG_ENCODING_ISO_8859_6    ISO 8859-6\n      ONIG_ENCODING_ISO_8859_7    ISO 8859-7\n      ONIG_ENCODING_ISO_8859_8    ISO 8859-8\n      ONIG_ENCODING_ISO_8859_9    ISO 8859-9\n      ONIG_ENCODING_ISO_8859_10   ISO 8859-10\n      ONIG_ENCODING_ISO_8859_11   ISO 8859-11\n      ONIG_ENCODING_ISO_8859_13   ISO 8859-13\n      ONIG_ENCODING_ISO_8859_14   ISO 8859-14\n      ONIG_ENCODING_ISO_8859_15   ISO 8859-15\n      ONIG_ENCODING_ISO_8859_16   ISO 8859-16\n      ONIG_ENCODING_UTF8          UTF-8\n      ONIG_ENCODING_UTF16_BE      UTF-16BE\n      ONIG_ENCODING_UTF16_LE      UTF-16LE\n      ONIG_ENCODING_UTF32_BE      UTF-32BE\n      ONIG_ENCODING_UTF32_LE      UTF-32LE\n      ONIG_ENCODING_EUC_JP        EUC-JP\n      ONIG_ENCODING_EUC_TW        EUC-TW\n      ONIG_ENCODING_EUC_KR        EUC-KR\n      ONIG_ENCODING_EUC_CN        EUC-CN\n      ONIG_ENCODING_SJIS          Shift_JIS\n      ONIG_ENCODING_KOI8_R        KOI8-R\n      ONIG_ENCODING_CP1251        CP1251\n      ONIG_ENCODING_BIG5          Big5\n      ONIG_ENCODING_GB18030       GB18030\n\n      または、ユーザが定義したOnigEncodingTypeデータのアドレス\n\n  6 syntax:     正規表現パターン文法定義\n\n      ONIG_SYNTAX_ASIS              plain text\n      ONIG_SYNTAX_POSIX_BASIC       POSIX Basic RE\n      ONIG_SYNTAX_POSIX_EXTENDED    POSIX Extended RE\n      ONIG_SYNTAX_EMACS             Emacs\n      ONIG_SYNTAX_GREP              grep\n      ONIG_SYNTAX_GNU_REGEX         GNU regex\n      ONIG_SYNTAX_JAVA              Java (Sun java.util.regex)\n      ONIG_SYNTAX_PERL58            Perl 5.8\n      ONIG_SYNTAX_PERL58_NG         Perl 5.8 + 名前付き捕獲式集合\n      ONIG_SYNTAX_PERL              Perl 5.10以降\n      ONIG_SYNTAX_PYTHON            Python\n      ONIG_SYNTAX_RUBY              Ruby\n      ONIG_SYNTAX_DEFAULT           default (== Ruby)\n                                    onig_set_default_syntax()\n\n      または、ユーザが定義したOnigSyntaxTypeデータのアドレス\n\n  7 err_info: エラー情報を返すためのアドレス\n              onig_error_code_to_str()の三番目の引数として使用する\n\n\n\n# int onig_new_without_alloc(regex_t* reg, const UChar* pattern,\n            const UChar* pattern_end,\n            OnigOptionType option, OnigEncoding enc, OnigSyntaxType* syntax,\n            OnigErrorInfo* err_info)\n\n  正規表現オブジェクト(regex)を作成する。\n  regの領域を内部で割り当てない。\n\n  正常終了戻り値: ONIG_NORMAL\n\n\n\n# int onig_new_deluxe(regex_t** reg, const UChar* pattern, const UChar* pattern_end,\n                      OnigCompileInfo* ci, OnigErrorInfo* einfo)\n\n  正規表現オブジェクト(regex)を作成する。\n  この関数は、onig_new()のデラックス版。\n\n  正常終了戻り値: ONIG_NORMAL\n\n  引数\n  1 reg:         作成された正規表現オブジェクトを返すアドレス\n  2 pattern:     正規表現パターン文字列\n  3 pattern_end: 正規表現パターン文字列の終端アドレス(pattern + pattern length)\n  4 ci:          コンパイル情報\n\n    ci->num_of_elements: ciの要素数 (現在の版では: 5)\n    ci->pattern_enc:     パターン文字列の文字エンコーディング\n    ci->target_enc:      対象文字列の文字エンコーディング\n    ci->syntax:          正規表現パターン文法定義\n    ci->option:          正規表現コンパイル時オプション\n    ci->case_fold_flag:  ONIG_OPTION_IGNORECASEモードでの\n                         文字曖昧マッチ指定ビットフラグ\n\n       ONIGENC_CASE_FOLD_MIN:           最小\n       ONIGENC_CASE_FOLD_DEFAULT:       最小\n                                        onig_set_default_case_fold_flag()\n\n  5 err_info:    エラー情報を返すためのアドレス\n                 onig_error_code_to_str()の三番目の引数として使用する\n\n\n  異なる文字エンコーディングの組み合わせは、以下の場合にのみ許される。\n\n    pattern_enc: ASCII, ISO_8859_1\n    target_enc:  UTF16_BE, UTF16_LE, UTF32_BE, UTF32_LE\n\n    pattern_enc: UTF16_BE/LE\n    target_enc:  UTF16_LE/BE\n\n    pattern_enc: UTF32_BE/LE\n    target_enc:  UTF32_LE/BE\n\n\n# void onig_free(regex_t* reg)\n\n  正規表現オブジェクトのメモリを解放する。\n\n  引数\n  1 reg: 正規表現オブジェクト\n\n\n# void onig_free_body(regex_t* reg)\n\n  正規表現オブジェクトのメモリを解放する。(reg自身の領域を除いて)\n\n  引数\n  1 reg: 正規表現オブジェクト\n\n\n\n# OnigPosition onig_search(regex_t* reg, const UChar* str, const UChar* end,\n                   const UChar* start, const UChar* range, OnigRegion* region,\n                   OnigOptionType option)\n# OnigPosition onig_search_gpos(regex_t* reg, const UChar* str, const UChar* end,\n                   const UChar* global_pos,\n                   const UChar* start, const UChar* range, OnigRegion* region,\n                   OnigOptionType option)\n\n  正規表現で文字列を検索し、検索結果とマッチ領域を返す。\n\n  正常終了戻り値: マッチ位置 (p - str >= 0)\n  検索失敗:       ONIG_MISMATCH (< 0)\n\n  引数\n  1 reg:        正規表現オブジェクト\n  2 str:        検索対象文字列\n  3 end:        検索対象文字列の終端アドレス\n  4 global_pos: \\Gのアドレス\n                不要時はstrと同じ値を設定すること\n  5 start:      検索対象文字列の検索先頭位置アドレス\n  6 range:      検索対象文字列の検索終了位置アドレス\n    前方探索  (start <= 探索される文字列 < range)\n    後方探索  (range <= 探索される文字列 <= start)\n  7 region:     マッチ領域情報(region)  (NULLも許される)\n  8 option:     検索時オプション\n\n    ONIG_OPTION_NOTBOL        文字列の先頭(str)を行頭と看做さない\n    ONIG_OPTION_NOTEOL        文字列の終端(end)を行末と看做さない\n    ONIG_OPTION_POSIX_REGION  region引数をPOSIX APIのregmatch_t[]にする\n\n\n# OnigPosition onig_match(regex_t* reg, const UChar* str, const UChar* end,\n\t\t const UChar* at, OnigRegion* region, OnigOptionType option)\n\n  文字列の指定位置でマッチングを行い、結果とマッチ領域を返す。\n\n  正常終了戻り値: マッチしたバイト長 (>= 0)\n  not match:      ONIG_MISMATCH      ( < 0)\n\n  引数\n  1 reg:    正規表現オブジェクト\n  2 str:    検索対象文字列\n  3 end:    検索対象文字列の終端アドレス\n  4 at:     検索対象文字列の検索アドレス\n  5 region: マッチ領域情報(region)  (NULLも許される)\n  6 option: 検索時オプション\n\n    ONIG_OPTION_NOTBOL        文字列の先頭(str)を行頭と看做さない\n    ONIG_OPTION_NOTEOL        文字列の終端(end)を行末と看做さない\n    ONIG_OPTION_POSIX_REGION  region引数をPOSIX APIのregmatch_t[]にする\n\n\n# OnigRegion* onig_region_new(void)\n\n  マッチ領域情報(region)を作成する。\n\n\n# void onig_region_free(OnigRegion* region, int free_self)\n\n  マッチ領域情報(region)で使用されているメモリを解放する。\n\n  引数\n  1 region:    マッチ領域情報オブジェクト\n  2 free_self:  [1: region自身を含めて全て解放, 0: region自身は解放しない]\n\n\n# void onig_region_copy(OnigRegion* to, OnigRegion* from)\n\n  マッチ領域情報(region)を複製する。\n\n  引数\n  1 to:   対象領域\n  2 from: 元領域\n\n\n# void onig_region_clear(OnigRegion* region)\n\n  マッチ領域情報(region)の中味をクリアする。\n\n  引数\n  1 region: 対象領域\n\n\n# int onig_region_resize(OnigRegion* region, int n)\n\n  マッチ領域情報(region)の捕獲式集合(グループ)数を変更する。\n\n  正常終了戻り値: ONIG_NORMAL\n\n  引数\n  1 region: 対象領域\n  2 n:      新しいサイズ\n\n\n# int onig_name_to_group_numbers(regex_t* reg, const UChar* name, const UChar* name_end,\n                                  int** num_list)\n\n  指定した名前に対する名前付き捕獲式集合(グループ)の\n  グループ番号リストを返す。\n  名前付き捕獲式集合は、(?<name>....)によって定義できる。\n\n  正常終了戻り値:  指定された名前に対するグループ数\n                   (例 /(?<x>..)(?<x>..)/  ==>  2)\n  名前に対するグループが存在しない: -1\n\n  引数\n  1 reg:       正規表現オブジェクト\n  2 name:      捕獲式集合(グループ)名\n  3 name_end:  捕獲式集合(グループ)名の終端アドレス\n  4 num_list:  番号リストを返すアドレス\n\n\n# int onig_name_to_backref_number(regex_t* reg, const UChar* name, const UChar* name_end,\n                                  OnigRegion *region)\n\n  指定された名前の後方参照(\\k<name>)に対する捕獲式集合(グループ)の番号を返す。\n  名前に対して、複数のマッチ領域が有効であれば、その中の最大の番号を返す。\n  名前に対する捕獲式集合が一個しかないときには、対応するマッチ領域が有効か\n  どうかに関係なく、その番号を返す。(従って、regionにはNULLを渡してもよい。)\n\n  正常終了戻り値: 番号\n\n  引数\n  1 reg:       正規表現オブジェクト\n  2 name:      捕獲式集合(グループ)名\n  3 name_end:  捕獲式集合(グループ)名の終端アドレス\n  4 region:    search/match結果のマッチ領域\n\n\n# int onig_foreach_name(regex_t* reg,\n                        int (*func)(const UChar*, const UChar*, int,int*,regex_t*,void*),\n                        void* arg)\n\n  全ての名前に対してコールバック関数呼び出しを実行する。\n\n  正常終了戻り値: 0\n  エラー:         コールバック関数の戻り値\n\n  引数\n  1 reg:     正規表現オブジェクト\n  2 func:    コールバック関数\n             func(name, name_end, <number of groups>, <group number's list>,\n                  reg, arg);\n\n             funcが0以外の値を返すと、それ以降のコールバックは行なわずに\n             終了する。\n\n  3 arg:     funcに対する追加引数\n\n\n# int onig_number_of_names(regex_t* reg)\n\n  パターン中で定義された名前の数を返す。\n  一個の名前の多重定義は一個と看做す。\n\n  引数\n  1 reg:    正規表現オブジェクト\n\n\n# OnigEncoding     onig_get_encoding(regex_t* reg)\n# OnigOptionType   onig_get_options(regex_t* reg)\n# OnigCaseFoldType onig_get_case_fold_flag(regex_t* reg)\n# OnigSyntaxType*  onig_get_syntax(regex_t* reg)\n\n  正規表現オブジェクトに対して、対応する値を返す。\n\n  引数\n  1 reg:    正規表現オブジェクト\n\n\n# int onig_number_of_captures(regex_t* reg)\n\n  パターン中で定義された捕獲グループの数を返す。\n\n  引数\n  1 reg:    正規表現オブジェクト\n\n\n# int onig_number_of_capture_histories(regex_t* reg)\n\n  パターン中で定義された捕獲履歴(?@...)の数を返す。\n\n  使用する文法で捕獲履歴機能が有効(ONIG_SYN_OP2_ATMARK_CAPTURE_HISTORY)\n  でなければ、捕獲履歴機能は使用できない。\n\n  引数\n  1 reg:    正規表現オブジェクト\n\n\n# OnigCaptureTreeNode* onig_get_capture_tree(OnigRegion* region)\n\n  捕獲履歴データのルートノードを返す。\n\n  マッチが失敗している場合には、この値は不定である。\n\n  引数\n  1 region: マッチ領域\n\n\n# int onig_capture_tree_traverse(OnigRegion* region, int at,\n                  int(*func)(int,OnigPosition,OnigPosition,int,int,void*),\n                  void* arg)\n\n  捕獲履歴データ木を巡回してコールバックする。\n\n  正常終了戻り値: 0\n  エラー:         コールバック関数の戻り値\n\n  引数\n  1 region:  マッチ領域\n  2 at:      コールバックを行なうタイミング\n\n    ONIG_TRAVERSE_CALLBACK_AT_FIRST:\n        最初にコールバックして、子ノードを巡回\n    ONIG_TRAVERSE_CALLBACK_AT_LAST:\n        子ノードを巡回して、コールバック\n    ONIG_TRAVERSE_CALLBACK_AT_BOTH:\n        最初にコールバックして、子ノードを巡回、最後にもう一度コールバック\n\n  3 func:    コールバック関数\n             funcが0以外の値を返すと、それ以降の巡回は行なわずに\n             終了する。\n\n             int func(int group, OnigPosition beg, OnigPosition end,\n                      int level, int at, void* arg)\n               group: グループ番号\n               beg:   マッチ開始位置\n               end    マッチ終了位置\n               level: ネストレベル (0から)\n               at:    コールバックが呼び出されたタイミング\n                      ONIG_TRAVERSE_CALLBACK_AT_FIRST\n                      ONIG_TRAVERSE_CALLBACK_AT_LAST\n               arg:   追加引数\n\n  4 arg;     funcに対する追加引数\n\n\n# int onig_noname_group_capture_is_active(regex_t* reg)\n\n  名前なし式集合の捕獲機能が有効かどうかを返す。\n\n  有効: 1\n  無効: 0\n\n  引数\n  1 reg:    正規表現オブジェクト\n\n\n  オプションのONIG_OPTION_DONT_CAPTURE_GROUPがON --> 無効\n\n  パターンが名前つき式集合を使用している\n  AND 使用文法で、ONIG_SYN_CAPTURE_ONLY_NAMED_GROUPがON\n  AND オプションのONIG_OPTION_CAPTURE_GROUPがOFF\n  --> 無効\n\n  上記以外の場合 --> 有効\n\n\n# UChar* onigenc_get_prev_char_head(OnigEncoding enc, const UChar* start, const UChar* s)\n\n  文字一個分前の文字列位置を返す。\n\n  引数\n  1 enc:   文字エンコーディング\n  2 start: 文字列の先頭アドレス\n  3 s:     文字列中の位置\n\n\n# UChar* onigenc_get_left_adjust_char_head(OnigEncoding enc,\n                                           const UChar* start, const UChar* s)\n\n  文字の先頭バイト位置になるように左側に調整したアドレスを返す。\n\n  引数\n  1 enc:   文字エンコーディング\n  2 start: 文字列の先頭アドレス\n  3 s:     文字列中の位置\n\n\n# UChar* onigenc_get_right_adjust_char_head(OnigEncoding enc,\n                                            const UChar* start, const UChar* s)\n\n  文字の先頭バイト位置になるように右側に調整したアドレスを返す。\n\n  引数\n  1 enc:   文字エンコーディング\n  2 start: 文字列の先頭アドレス\n  3 s:     文字列中の位置\n\n\n# int onigenc_strlen(OnigEncoding enc, const UChar* s, const UChar* end)\n# int onigenc_strlen_null(OnigEncoding enc, const UChar* s)\n\n  文字列の文字数を返す。\n\n\n# int onigenc_str_bytelen_null(OnigEncoding enc, const UChar* s)\n\n  文字列のバイト数を返す。\n\n\n# int onig_set_default_syntax(OnigSyntaxType* syntax)\n\n  デフォルトの正規表現パターン文法をセットする。\n\n  引数\n  1 syntax: 正規表現パターン文法\n\n\n# void onig_copy_syntax(OnigSyntaxType* to, const OnigSyntaxType* from)\n\n  正規表現パターン文法をコピーする。\n\n  引数\n  1 to:   対象\n  2 from: 元\n\n\n# unsigned int onig_get_syntax_op(OnigSyntaxType* syntax)\n# unsigned int onig_get_syntax_op2(OnigSyntaxType* syntax)\n# unsigned int onig_get_syntax_behavior(OnigSyntaxType* syntax)\n# OnigOptionType onig_get_syntax_options(OnigSyntaxType* syntax)\n\n# void onig_set_syntax_op(OnigSyntaxType* syntax, unsigned int op)\n# void onig_set_syntax_op2(OnigSyntaxType* syntax, unsigned int op2)\n# void onig_set_syntax_behavior(OnigSyntaxType* syntax, unsigned int behavior)\n# void onig_set_syntax_options(OnigSyntaxType* syntax, OnigOptionType options)\n\n  正規表現パターン文法の要素を参照/取得する。\n\n  引数\n  1 syntax:                     正規表現パターン文法\n  2 op, op2, behavior, options: 要素の値\n\n\n# void onig_copy_encoding(OnigEncoding to, OnigOnigEncoding from)\n\n  文字エンコーディングをコピーする。\n\n  引数\n  1 to:   対象\n  2 from: 元\n\n\n# int onig_set_meta_char(OnigSyntaxType* syntax, unsigned int what,\n                         OnigCodePoint code)\n\n  メタ文字を指定したコードポイント値にセットする。\n  ONIG_SYN_OP_VARIABLE_META_CHARACTERSが正規表現パターン文法で有効に\n  なっていない場合には、エスケープ文字を除いて、ここで指定したメタ文字は\n  機能しない。(組込みの文法では有効にしていない。)\n\n  正常終了戻り値: ONIG_NORMAL\n\n  引数\n  1 syntax: 対象文法\n  2 what:   メタ文字機能の指定\n\n          ONIG_META_CHAR_ESCAPE\n          ONIG_META_CHAR_ANYCHAR\n          ONIG_META_CHAR_ANYTIME\n          ONIG_META_CHAR_ZERO_OR_ONE_TIME\n          ONIG_META_CHAR_ONE_OR_MORE_TIME\n          ONIG_META_CHAR_ANYCHAR_ANYTIME\n\n  3 code: メタ文字のコードポイント または ONIG_INEFFECTIVE_META_CHAR.\n\n\n# OnigCaseFoldType onig_get_default_case_fold_flag()\n\n  デフォルトのcase foldフラグを取得する。\n\n\n# int onig_set_default_case_fold_flag(OnigCaseFoldType case_fold_flag)\n\n  デフォルトのcase foldフラグをセットする。\n\n  引数\n  1 case_fold_flag: case foldフラグ\n\n\n# unsigned int onig_get_match_stack_limit_size(void)\n\n  マッチスタックサイズの最大値を返す。\n  (デフォルト: 0 == 無制限)\n\n\n# int onig_set_match_stack_limit_size(unsigned int size)\n\n  マッチスタックサイズの最大値を指定する。\n  (size = 0: 無制限)\n\n  正常終了戻り値: ONIG_NORMAL\n\n\n# int onig_end(void)\n\n  ライブラリの使用を終了する。\n\n  正常終了戻り値: ONIG_NORMAL\n\n  onig_init()を再度呼び出しても、以前に作成した正規表現オブジェクト\n  を使用することはできない。\n\n\n# const char* onig_version(void)\n\n  バージョン文字列を返す。(例 \"5.0.3\")\n\n// END\n"
  },
  {
    "path": "src/Onigmo/doc/FAQ",
    "content": "FAQ    2011/09/18\n\n1. Longest match\n\n   You can execute longest match by using ONIG_OPTION_FIND_LONGEST option\n   in onig_new().\n\n\n2. Thread safe\n\n   In order to make thread safe, which of (A) or (B) must be done.\n\n   (A) Onigmo Layer\n\n       Define the macro below in oniguruma/regint.h.\n\n       USE_MULTI_THREAD_SYSTEM\n       THREAD_ATOMIC_START\n       THREAD_ATOMIC_END\n       THREAD_PASS\n\n       THREAD_SYSTEM_INIT\n       THREAD_SYSTEM_END\n\n\n   (B) Application Layer\n\n       The plural threads should not do simultaneously that making\n       new regexp objects or re-compiling objects or freeing objects,\n       even if these objects are differ.\n\n\n3. CR + LF\n\n   DOS newline (CR (0x0c) + LF (0x0a) sequence)\n\n   Enable the following line in regenc.h, and use ONIG_OPTION_NEWLINE_CRLF\n   option in onig_new().\n\n     /* #define USE_CRNL_AS_LINE_TERMINATOR */\n\n\n4. Mailing list\n\n   There is no mailing list about Onigmo/Oniguruma.\n\n// END\n"
  },
  {
    "path": "src/Onigmo/doc/FAQ.ja",
    "content": "FAQ    2011/09/18\n\n1. 最長マッチ\n\n   onig_new()の中で、ONIG_OPTION_FIND_LONGESTオプション\n   を使用すれば最長マッチになる。\n\n\n2. スレッドセーフ\n\n   スレッドセーフにするには、以下の(A)と(B)のどちらかを行なえば\n   よい。\n\n   (A) Onigmo Layer\n\n       oniguruma/regint.hの中の以下のマクロを定義する。\n\n       USE_MULTI_THREAD_SYSTEM\n       THREAD_ATOMIC_START\n       THREAD_ATOMIC_END\n       THREAD_PASS\n\n       何らかの初期化/終了処理が必要であれば、以下のマクロに定義する。\n       THREAD_SYSTEM_INIT\n       THREAD_SYSTEM_END\n\n\n   (B) Application Layer\n\n       同時に複数のスレッドが、正規表現オブジェクトを作成する、\n       または解放する、ことを行なってはならない。\n       それらのオブジェクトが全く別のものであっても。\n\n   もう少し詳しい説明は、このドキュメントの中の\n   \"スレッドセーフに関する補足\"に書いておいた。\n\n\n3. CR + LF\n\n   DOSの改行(CR(0x0c) + LF(0x0a)の連続)\n\n   regenc.hの中の、以下の部分を有効にし、onig_new()で\n   ONIG_OPTION_NEWLINE_CRLFオプションを使用する。\n\n     /* #define USE_CRNL_AS_LINE_TERMINATOR */\n\n\n4. メーリングリスト\n\n   鬼雲/鬼車に関するメーリングリストは存在しない。\n\n//END\n\n\n\nスレッドセーフに関する補足\n\nスレッドセーフにするには、個別のアプリケーションの中で行うか、\nOnigurumaライブラリの中で行うか、どちらかを選ぶことができます。\n(Onigurumaを使用する側で対処するか、Onigurumaに対処させるか\nどちらか片方で行う必要があるということです。)\n\nこれらの方法について、以下(A)と(B)で説明します。\n\nマルチスレッドAPIは、それぞれのプラットフォームによっても\n異なりますので、以下の説明の中で具体的に何を呼ぶのかを\n書くことは無理です。実際に使用されるマルチスレッドAPIで、\n対応する機能のものを指定してください。\n\n(A) Onigurumaの中で対応する場合\n\noniguruma/regint.hの中で以下のマクロを定義して再コンパイルしてください。\n\nUSE_MULTI_THREAD_SYSTEM\n\n  単に有効にすればよいです。\n\nTHREAD_ATOMIC_START\nTHREAD_ATOMIC_END\n\n  THREAD_ATOMIC_STARTからTHREAD_ATOMIC_ENDで囲まれた\n  プログラムのコード部分をあるスレッドが実行中に、他の\n  スレッドに実行権が移動しないことを保障するものに定義\n  してください。\n  (名前の通り、囲まれたコード部分をスレッドアトミックに\n   するという意味)\n\nTHREAD_PASS\n\n  これを実行したスレッドから、他のスレッドに実行権を委譲\n  するものに定義をしてください。(再スケジュールを呼び出す\n  という意味)\n  対応する機能が全くなければ、空定義にしてください。\n\n(参考例)\nRubyの場合を例にすると、\nRubyは自分自身で独自のスレッド機能を実装しています。\nその機能を使用すると、以下のように定義すればよいことに\nなります。\n\n#define USE_MULTI_THREAD_SYSTEM\n#define THREAD_SYSTEM_INIT\n#define THREAD_SYSTEM_END\n#define THREAD_ATOMIC_START       DEFER_INTS\n#define THREAD_ATOMIC_END         ENABLE_INTS\n#define THREAD_PASS               rb_thread_schedule()\n\nRubyの場合、タイマ割り込みを使用して、スレッドの切り替えを\n行っています。DEFER_INTSは割り込みハンドラの実行を一時的に\n止めるためのマクロです。ENABLE_INTSマクロで割り込みハンドラ\nの実行を許可します。\nこれによって、THREAD_ATOMIC_STARTからTHREAD_ATOMIC_END\nで囲まれた部分の実行中に、他のスレッドに実行権が移動しません。\n\n\n(B) アプリケーションの中で対応する場合\n\n以下を保障するように、スレッドの実行を制御してください。\n\n同時に複数のスレッドが、正規表現オブジェクトを作成する、または解放する、ことを\n行なってはならない。それらのオブジェクトが全く別のものであっても。\n\nonig_new(), onig_new_deluxe(), onig_free()のどれかの呼び出しを、\n複数のスレッドが同時に実行することを避けてください。同時でなければ別にかまいません。\n\nこれは何故必要なのかというと、正規表現オブジェクトを作成する\n過程で、内部で共通に参照するテーブルがあります。\nこのテーブルに対してのデータ登録処理が複数のスレッドで衝突して\n異常な状態にならないために必要です。\n\n// END\n"
  },
  {
    "path": "src/Onigmo/doc/RE",
    "content": "Onigmo (Oniguruma-mod) Regular Expressions Version 5.13.0    2012/01/19\n\nsyntax: ONIG_SYNTAX_RUBY (default)\n\n\n1. Syntax elements\n\n  \\       escape (enable or disable meta character meaning)\n  |       alternation\n  (...)   group\n  [...]   character class\n\n\n2. Characters\n\n  \\t           horizontal tab (0x09)\n  \\v           vertical tab   (0x0B)\n  \\n           newline        (0x0A)\n  \\r           return         (0x0D)\n  \\b           back space     (0x08)\n  \\f           form feed      (0x0C)\n  \\a           bell           (0x07)\n  \\e           escape         (0x1B)\n  \\nnn         octal char            (encoded byte value)\n  \\xHH         hexadecimal char      (encoded byte value)\n  \\x{7HHHHHHH} wide hexadecimal char (character code point value)\n  \\cx          control char          (character code point value)\n  \\C-x         control char          (character code point value)\n  \\M-x         meta  (x|0x80)        (character code point value)\n  \\M-\\C-x      meta control char     (character code point value)\n\n (* \\b is effective in character class [...] only)\n\n\n3. Character types\n\n  .        any character (except newline)\n\n  \\w       word character\n\n           Not Unicode:\n             alphanumeric and \"_\".\n\n           Unicode:\n             General_Category -- (Letter|Mark|Number|Connector_Punctuation)\n\n           It depends on ONIG_OPTION_ASCII_RANGE option that non-ASCII char\n           includes or not.\n\n  \\W       non word char\n\n  \\s       whitespace char\n\n           Not Unicode:\n             \\t, \\n, \\v, \\f, \\r, \\x20\n\n           Unicode:\n             0009, 000A, 000B, 000C, 000D, 0085(NEL),\n             General_Category -- Line_Separator\n                              -- Paragraph_Separator\n                              -- Space_Separator\n\n           It depends on ONIG_OPTION_ASCII_RANGE option that non-ASCII char\n           includes or not.\n\n  \\S       non whitespace char\n\n  \\d       decimal digit char\n\n           Unicode: General_Category -- Decimal_Number\n\n           It depends on ONIG_OPTION_ASCII_RANGE option that non-ASCII char\n           includes or not.\n\n  \\D       non decimal digit char\n\n  \\h       hexadecimal digit char   [0-9a-fA-F]\n\n  \\H       non hexadecimal digit char\n\n\n  Character Property\n\n    * \\p{property-name}\n    * \\p{^property-name}    (negative)\n    * \\P{property-name}     (negative)\n\n    property-name:\n\n     + works on all encodings\n       Alnum, Alpha, Blank, Cntrl, Digit, Graph, Lower,\n       Print, Punct, Space, Upper, XDigit, Word, ASCII,\n\n     + works on EUC_JP, Shift_JIS, CP932\n       Hiragana, Katakana, Han, Latin, Greek, Cyrillic\n\n     + works on UTF8, UTF16, UTF32\n       see UnicodeProps.txt\n\n\n  \\R       Linebreak\n\n           Unicode:\n             (?>\\x0D\\x0A|[\\x0A-\\x0D\\x{85}\\x{2028}\\x{2029}])\n\n           Not Unicode:\n             (?>\\x0D\\x0A|[\\x0A-\\x0D])\n\n  \\X       eXtended grapheme cluster\n\n           Unicode:\n             (?>\\P{M}\\p{M}*)\n\n           Not Unicode:\n             (?m:.)\n\n\n\n4. Quantifier\n\n  greedy\n\n    ?       1 or 0 times\n    *       0 or more times\n    +       1 or more times\n    {n,m}   at least n but not more than m times\n    {n,}    at least n times\n    {,n}    at least 0 but not more than n times ({0,n})\n    {n}     n times\n\n  reluctant\n\n    ??      1 or 0 times\n    *?      0 or more times\n    +?      1 or more times\n    {n,m}?  at least n but not more than m times\n    {n,}?   at least n times\n    {,n}?   at least 0 but not more than n times (== {0,n}?)\n\n  possessive (greedy and does not backtrack after repeated)\n\n    ?+      1 or 0 times\n    *+      0 or more times\n    ++      1 or more times\n\n    ({n,m}+, {n,}+, {n}+ are possessive op. in ONIG_SYNTAX_JAVA and\n    ONIG_SYNTAX_PERL only)\n\n    ex. /a*+/ === /(?>a*)/\n\n\n5. Anchors\n\n  ^       beginning of the line\n  $       end of the line\n  \\b      word boundary\n  \\B      not word boundary\n  \\A      beginning of string\n  \\Z      end of string, or before newline at the end\n  \\z      end of string\n  \\G      matching start position\n\n\n6. Character class\n\n  ^...    negative class (lowest precedence operator)\n  x-y     range from x to y\n  [...]   set (character class in character class)\n  ..&&..  intersection (low precedence at the next of ^)\n\n    ex. [a-w&&[^c-g]z] ==> ([a-w] AND ([^c-g] OR z)) ==> [abh-w]\n\n  * If you want to use '[', '-', ']' as a normal character\n    in a character class, you should escape these characters by '\\'.\n\n\n  POSIX bracket ([:xxxxx:], negate [:^xxxxx:])\n\n    Not Unicode Case:\n\n      alnum    alphabet or digit char\n      alpha    alphabet\n      ascii    code value: [0 - 127]\n      blank    \\t, \\x20\n      cntrl\n      digit    0-9\n      graph    \\x21-\\x7E and all of multibyte encoded characters\n      lower\n      print    \\x20-\\x7E and all of multibyte encoded characters\n      punct\n      space    \\t, \\n, \\v, \\f, \\r, \\x20\n      upper\n      xdigit   0-9, a-f, A-F\n      word     alphanumeric, \"_\" and multibyte characters\n\n\n    Unicode Case:\n\n      alnum    Letter | Mark | Decimal_Number\n      alpha    Letter | Mark\n      ascii    0000 - 007F\n      blank    Space_Separator | 0009\n      cntrl    Control | Format | Unassigned | Private_Use | Surrogate\n      digit    Decimal_Number\n      graph    [[:^space:]] && ^Control && ^Unassigned && ^Surrogate\n      lower    Lowercase_Letter\n      print    [[:graph:]] | Space_Separator\n      punct    Connector_Punctuation | Dash_Punctuation | Close_Punctuation |\n               Final_Punctuation | Initial_Punctuation | Other_Punctuation |\n               Open_Punctuation\n      space    Space_Separator | Line_Separator | Paragraph_Separator |\n               0009 | 000A | 000B | 000C | 000D | 0085\n      upper    Uppercase_Letter\n      xdigit   0030 - 0039 | 0041 - 0046 | 0061 - 0066\n               (0-9, a-f, A-F)\n      word     Letter | Mark | Decimal_Number | Connector_Punctuation\n\n\n    It depends on ONIG_OPTION_ASCII_RANGE option and\n    ONIG_OPTION_POSIX_BRACKET_ALL_RANGE option that POSIX brackets\n    match non-ASCII char or not.\n\n\n\n7. Extended groups\n\n  (?#...)            comment\n\n  (?imxdau-imx)      option on/off\n                         i: ignore case\n                         m: multi-line (dot(.) match newline)\n                         x: extended form\n\n                       character set option (character range option)\n                         d: Default (compatible with Ruby 1.9.3)\n                            \\w, \\d and \\s doesn't match non-ASCII characters.\n                            \\b, \\B and POSIX brackets use the each encoding's\n                            rules.\n                         a: ASCII\n                            ONIG_OPTION_ASCII_RANGE option is turned on.\n                            \\w, \\d, \\s and POSIX brackets doesn't match\n                            non-ASCII characters.\n                            \\b and \\B use the ASCII rules.\n                         u: Unicode\n                            ONIG_OPTION_ASCII_RANGE option is turned off.\n                            \\w (\\W), \\d (\\D), \\s (\\S), \\b (\\B) and POSIX\n                            brackets use the each encoding's rules.\n\n  (?imxdau-imx:subexp)\n                     option on/off for subexp\n\n  (?:subexp)         not captured group\n  (subexp)           captured group\n\n  (?=subexp)         look-ahead\n  (?!subexp)         negative look-ahead\n  (?<=subexp)        look-behind\n  (?<!subexp)        negative look-behind\n\n                     Subexp of look-behind must be fixed character length.\n                     But different character length is allowed in top level\n                     alternatives only.\n                     ex. (?<=a|bc) is OK. (?<=aaa(?:b|cd)) is not allowed.\n\n                     In negative-look-behind, captured group isn't allowed,\n                     but shy group(?:) is allowed.\n\n  \\K                 keep\n                     Another expression of look-behind. Keep the stuff left\n                     of the \\K, don't include it in the result.\n\n  (?>subexp)         atomic group\n                     don't backtrack in subexp.\n\n  (?<name>subexp), (?'name'subexp)\n                     define named group\n                     (All characters of the name must be a word character.)\n\n                     Not only a name but a number is assigned like a captured\n                     group.\n\n                     Assigning the same name as two or more subexps is allowed.\n                     In this case, a subexp call can not be performed although\n                     the back reference is possible.\n                     (ONIG_SYNTAX_PERL: a subexp call is allowed in this case.)\n\n  (?(cond)yes-subexp), (?(cond)yes-subexp|no-subexp)\n                    conditional expression\n                    Matches yes-subexp if (cond) yields a true value, matches\n                    no-subexp otherwise.\n                    Following (cond) can be used:\n\n                    (n)  (n >= 1)\n                        Checks if the numbered capturing group has matched\n                        something.\n\n                    (<name>), ('name')\n                        Checks if a group with the given name has matched\n                        something.\n\n\n8. Back reference\n\n  \\n          back reference by group number (n >= 1)\n  \\k<n>       back reference by group number (n >= 1)\n  \\k'n'       back reference by group number (n >= 1)\n  \\k<-n>      back reference by relative group number (n >= 1)\n  \\k'-n'      back reference by relative group number (n >= 1)\n  \\k<name>    back reference by group name\n  \\k'name'    back reference by group name\n\n  In the back reference by the multiplex definition name,\n  a subexp with a large number is referred to preferentially.\n  (When not matched, a group of the small number is referred to.)\n\n  * Back reference by group number is forbidden if named group is defined\n    in the pattern and ONIG_OPTION_CAPTURE_GROUP is not set.\n\n  * ONIG_SYNTAX_PERL: \\g{n}, \\g{-n} and \\g{name} can also be used.\n\n\n  back reference with nest level\n\n    level: 0, 1, 2, ...\n\n    \\k<n+level>     (n >= 1)\n    \\k<n-level>     (n >= 1)\n    \\k'n+level'     (n >= 1)\n    \\k'n-level'     (n >= 1)\n    \\k<-n+level>    (n >= 1)\n    \\k<-n-level>    (n >= 1)\n    \\k'-n+level'    (n >= 1)\n    \\k'-n-level'    (n >= 1)\n\n    \\k<name+level>\n    \\k<name-level>\n    \\k'name+level'\n    \\k'name-level'\n\n    Destinate relative nest level from back reference position.\n\n    ex 1.\n\n      /\\A(?<a>|.|(?:(?<b>.)\\g<a>\\k<b+0>))\\z/.match(\"reer\")\n\n    ex 2.\n\n      r = Regexp.compile(<<'__REGEXP__'.strip, Regexp::EXTENDED)\n      (?<element> \\g<stag> \\g<content>* \\g<etag> ){0}\n      (?<stag> < \\g<name> \\s* > ){0}\n      (?<name> [a-zA-Z_:]+ ){0}\n      (?<content> [^<&]+ (\\g<element> | [^<&]+)* ){0}\n      (?<etag> </ \\k<name+1> >){0}\n      \\g<element>\n      __REGEXP__\n\n      p r.match('<foo>f<bar>bbb</bar>f</foo>').captures\n\n\n\n9. Subexp call (\"Tanaka Akira special\")\n\n  \\g<name>    call by group name\n  \\g'name'    call by group name\n  \\g<n>       call by group number (n >= 1)\n  \\g'n'       call by group number (n >= 1)\n  \\g<0>       call the whole pattern recursively\n  \\g'0'       call the whole pattern recursively\n  \\g<-n>      call by relative group number (n >= 1)\n  \\g'-n'      call by relative group number (n >= 1)\n  \\g<+n>      call by relative group number (n >= 1)\n  \\g'+n'      call by relative group number (n >= 1)\n\n  * left-most recursive call is not allowed.\n     ex. (?<name>a|\\g<name>b)   => error\n         (?<name>a|b\\g<name>c)  => OK\n\n  * Call by group number is forbidden if named group is defined in the pattern\n    and ONIG_OPTION_CAPTURE_GROUP is not set.\n\n  * If the option status of called group is different from calling position\n    then the group's option is effective.\n\n    ex. (?-i:\\g<name>)(?i:(?<name>a)){0}  match to \"A\"\n\n  * ONIG_SYNTAX_PERL: use (?&name), (?n), (?-n), (?+n), (?R) or (?0) instead.\n\n\n10. Captured group\n\n  Behavior of the no-named group (...) changes with the following conditions.\n  (But named group is not changed.)\n\n  case 1. /.../     (named group is not used, no option)\n\n     (...) is treated as a captured group.\n\n  case 2. /.../g    (named group is not used, 'g' option)\n\n     (...) is treated as a no-captured group (?:...).\n\n  case 3. /..(?<name>..)../   (named group is used, no option)\n\n     (...) is treated as a no-captured group (?:...).\n     numbered-backref/call is not allowed.\n\n  case 4. /..(?<name>..)../G  (named group is used, 'G' option)\n\n     (...) is treated as a captured group.\n     numbered-backref/call is allowed.\n\n  where\n    g: ONIG_OPTION_DONT_CAPTURE_GROUP\n    G: ONIG_OPTION_CAPTURE_GROUP\n\n  ('g' and 'G' options are argued in ruby-dev ML)\n\n\n\n-----------------------------\nA-1. Syntax depend options\n\n   + ONIG_SYNTAX_RUBY\n     (?m): dot(.) match newline\n\n   + ONIG_SYNTAX_PERL, ONIG_SYNTAX_JAVA and ONIG_SYNTAX_PYTHON\n     (?s): dot(.) match newline\n     (?m): ^ match after newline, $ match before newline\n\n   + ONIG_SYNTAX_PERL\n     (?d), (?l): same as (?u)\n\n\nA-2. Original extensions\n\n   + hexadecimal digit char type  \\h, \\H\n   + named group                  (?<name>...), (?'name'...)\n   + named backref                \\k<name>\n   + subexp call                  \\g<name>, \\g<group-num>\n\n\nA-3. Lacked features compare with perl 5.14.0\n\n   + \\N{name}, \\N{U+xxxx}, \\N\n   + \\l,\\u,\\L,\\U, \\C\n   + \\v, \\V, \\h, \\H, \\o{xxx}\n   + (?{code})\n   + (??{code})\n   + (?|...)\n   + (*VERB:ARG)\n\n   * \\Q...\\E\n     This is effective on ONIG_SYNTAX_PERL and ONIG_SYNTAX_JAVA.\n\n\nA-4. Differences with Japanized GNU regex(version 0.12) of Ruby 1.8\n\n   + add character property (\\p{property}, \\P{property})\n   + add hexadecimal digit char type (\\h, \\H)\n   + add look-behind\n     (?<=fixed-char-length-pattern), (?<!fixed-char-length-pattern)\n   + add possessive quantifier. ?+, *+, ++\n   + add operations in character class. [], &&\n     ('[' must be escaped as an usual char in character class.)\n   + add named group and subexp call.\n   + octal or hexadecimal number sequence can be treated as\n     a multibyte code char in character class if multibyte encoding\n     is specified.\n     (ex. [\\xa1\\xa2], [\\xa1\\xa7-\\xa4\\xa1])\n   + allow the range of single byte char and multibyte char in character\n     class.\n     ex. /[a-<<any EUC-JP character>>]/ in EUC-JP encoding.\n   + effect range of isolated option is to next ')'.\n     ex. (?:(?i)a|b) is interpreted as (?:(?i:a|b)), not (?:(?i:a)|b).\n   + isolated option is not transparent to previous pattern.\n     ex. a(?i)* is a syntax error pattern.\n   + allowed incomplete left brace as an usual string.\n     ex. /{/, /({)/, /a{2,3/ etc...\n   + negative POSIX bracket [:^xxxx:] is supported.\n   + POSIX bracket [:ascii:] is added.\n   + repeat of look-ahead is not allowed.\n     ex. /(?=a)*/, /(?!b){5}/\n   + Ignore case option is effective to numbered character.\n     ex. /\\x61/i =~ \"A\"\n   + In the range quantifier, the number of the minimum is omissible.\n     /a{,n}/ == /a{0,n}/\n     The simultaneous abbreviation of the number of times of the minimum\n     and the maximum is not allowed. (/a{,}/)\n   + /a{n}?/ is not a non-greedy operator.\n     /a{n}?/ == /(?:a{n})?/\n   + invalid back reference is checked and cause error.\n     /\\1/, /(a)\\2/\n   + Zero-length match in infinite repeat stops the repeat,\n     then changes of the capture group status are checked as stop condition.\n     /(?:()|())*\\1\\2/ =~ \"\"\n     /(?:\\1a|())*/ =~ \"a\"\n\n\nA-5. Disabled functions by default syntax\n\n   + capture history\n\n     (?@...) and (?@<name>...)\n\n     ex. /(?@a)*/.match(\"aaa\") ==> [<0-1>, <1-2>, <2-3>]\n\n     see sample/listcap.c file.\n\n\nA-6. Problems\n\n   + Invalid encoding byte sequence is not checked.\n\n     ex. UTF-8\n\n     * Invalid first byte is treated as a character.\n       /./u =~ \"\\xa3\"\n\n     * Incomplete byte sequence is not checked.\n       /\\w+/ =~ \"a\\xf3\\x8ec\"\n\n// END\n"
  },
  {
    "path": "src/Onigmo/doc/RE.ja",
    "content": "鬼雲 (鬼車改) 正規表現 Version 5.13.0    2012/01/19\n\n使用文法: ONIG_SYNTAX_RUBY (既定値)\n\n\n1. 基本要素\n\n  \\       退避修飾 (エスケープ)  正規表現記号の有効/無効の制御\n  |       選択子\n  (...)   式集合   (グループ)\n  [...]   文字集合 (文字クラス)\n\n\n2. 文字\n\n  \\t           水平タブ         (0x09)\n  \\v           垂直タブ         (0x0B)\n  \\n           改行             (0x0A)\n  \\r           復帰             (0x0D)\n  \\b           後退空白         (0x08)\n  \\f           改頁             (0x0C)\n  \\a           鐘               (0x07)\n  \\e           退避修飾         (0x1B)\n  \\nnn         八進数表現        符号化バイト値(の一部)\n  \\xHH         十六進数表現      符号化バイト値(の一部)\n  \\x{7HHHHHHH} 拡張十六進数表現  コードポイント値\n  \\cx          制御文字表現      コードポイント値\n  \\C-x         制御文字表現      コードポイント値\n  \\M-x         超  (x|0x80)      コードポイント値\n  \\M-\\C-x      超 + 制御文字表現 コードポイント値\n\n  ※ \\bは、文字集合内でのみ有効\n\n\n3. 文字種\n\n  .        任意文字 (改行を除く)\n\n  \\w       単語構成文字\n\n           Unicode以外の場合:\n             英数字 および \"_\"。\n\n           Unicodeの場合:\n             General_Category -- (Letter|Mark|Number|Connector_Punctuation)\n\n           ASCII外の文字を含むかどうかは ONIG_OPTION_ASCII_RANGE オプションに\n           依存する。\n\n  \\W       非単語構成文字\n\n  \\s       空白文字\n\n           Unicode以外の場合:\n             \\t, \\n, \\v, \\f, \\r, \\x20\n\n           Unicodeの場合:\n             0009, 000A, 000B, 000C, 000D, 0085(NEL),\n             General_Category -- Line_Separator\n                              -- Paragraph_Separator\n                              -- Space_Separator\n\n           ASCII外の文字を含むかどうかは ONIG_OPTION_ASCII_RANGE オプションに\n           依存する。\n\n  \\S       非空白文字\n\n  \\d       10進数字\n\n           Unicodeの場合: General_Category -- Decimal_Number\n\n           ASCII外の文字を含むかどうかは ONIG_OPTION_ASCII_RANGE オプションに\n           依存する。\n\n  \\D       非10進数字\n\n  \\h       16進数字    [0-9a-fA-F]\n\n  \\H       非16進数字\n\n\n  Character Property\n\n    * \\p{property-name}\n    * \\p{^property-name}    (negative)\n    * \\P{property-name}     (negative)\n\n    property-name:\n\n     + 全てのエンコーディングで有効\n       Alnum, Alpha, Blank, Cntrl, Digit, Graph, Lower,\n       Print, Punct, Space, Upper, XDigit, Word, ASCII,\n\n     + EUC-JP, Shift_JIS, CP932で有効\n       Hiragana, Katakana, Han, Latin, Greek, Cyrillic\n\n     + UTF8, UTF16, UTF32で有効\n       UnicodeProps.txt 参照\n\n\n  \\R       改行文字 (Linebreak)\n\n           Unicodeの場合:\n             (?>\\x0D\\x0A|[\\x0A-\\x0D\\x{85}\\x{2028}\\x{2029}])\n\n           Unicode以外の場合:\n             (?>\\x0D\\x0A|[\\x0A-\\x0D])\n\n  \\X       eXtended grapheme cluster\n\n           Unicodeの場合:\n             (?>\\P{M}\\p{M}*)\n\n           Unicode以外の場合:\n             (?m:.)\n\n\n\n4. 量指定子\n\n  欲張り\n\n    ?       一回または零回\n    *       零回以上\n    +       一回以上\n    {n,m}   n回以上m回以下\n    {n,}    n回以上\n    {,n}    零回以上n回以下 ({0,n})\n    {n}     n回\n\n  無欲\n\n    ??      一回または零回\n    *?      零回以上\n    +?      一回以上\n    {n,m}?  n回以上m回以下\n    {n,}?   n回以上\n    {,n}?   零回以上n回以下 (== {0,n}?)\n\n  強欲 (欲張りで、繰り返しに成功した後は回数を減らすような後退再試行をしない)\n\n    ?+      一回または零回\n    *+      零回以上\n    ++      一回以上\n\n    ({n,m}+, {n,}+, {n}+ は、ONIG_SYNTAX_JAVAとONIG_SYNTAX_PERLでのみ強欲な\n    指定子)\n\n    例. /a*+/ === /(?>a*)/\n\n\n5. 錨\n\n  ^       行頭\n  $       行末\n  \\b      単語境界\n  \\B      非単語境界\n  \\A      文字列先頭\n  \\Z      文字列末尾、または文字列末尾の改行の直前\n  \\z      文字列末尾\n  \\G      照合開始位置\n\n\n6. 文字集合\n\n  ^...    否定   (最低優先度演算子)\n  x-y     範囲   (xからyまで)\n  [...]   集合   (文字集合内文字集合)\n  ..&&..  積演算 (^の次に優先度が低い演算子)\n\n     例. [a-w&&[^c-g]z] ==> ([a-w] and ([^c-g] or z)) ==> [abh-w]\n\n  ※ '[', '-', ']'を、文字集合内で通常文字の意味で使用したい場合には、\n     これらの文字を'\\'で退避修飾しなければならない。\n\n\n  POSIXブラケット ([:xxxxx:], 否定 [:^xxxxx:])\n\n    Unicode以外の場合:\n\n      alnum    英数字\n      alpha    英字\n      ascii    0 - 127\n      blank    \\t, \\x20\n      cntrl\n      digit    0-9\n      graph    \\x21-\\x7E および 多バイト文字全部を含む\n      lower\n      print    \\x20-\\x7E および 多バイト文字全部を含む\n      punct\n      space    \\t, \\n, \\v, \\f, \\r, \\x20\n      upper\n      xdigit   0-9, a-f, A-F\n      word     英数字, \"_\" および 多バイト文字\n\n    Unicodeの場合:\n\n      alnum    Letter | Mark | Decimal_Number\n      alpha    Letter | Mark\n      ascii    0000 - 007F\n      blank    Space_Separator | 0009\n      cntrl    Control | Format | Unassigned | Private_Use | Surrogate\n      digit    Decimal_Number\n      graph    [[:^space:]] && ^Control && ^Unassigned && ^Surrogate\n      lower    Lowercase_Letter\n      print    [[:graph:]] | Space_Separator\n      punct    Connector_Punctuation | Dash_Punctuation | Close_Punctuation |\n               Final_Punctuation | Initial_Punctuation | Other_Punctuation |\n               Open_Punctuation\n      space    Space_Separator | Line_Separator | Paragraph_Separator |\n               0009 | 000A | 000B | 000C | 000D | 0085\n      upper    Uppercase_Letter\n      xdigit   0030 - 0039 | 0041 - 0046 | 0061 - 0066\n               (0-9, a-f, A-F)\n      word     Letter | Mark | Decimal_Number | Connector_Punctuation\n\n\n    POSIXブラケットがASCII外の文字にマッチするかどうかは\n    ONIG_OPTION_ASCII_RANGEオプションとONIG_OPTION_POSIX_BRACKET_ALL_RANGE\n    オプションに依存する。\n\n\n\n7. 拡張式集合\n\n  (?#...)           注釈\n  (?imxdau-imx)     孤立オプション\n                      i: 大文字小文字照合\n                      m: 複数行\n                      x: 拡張形式\n\n                     文字集合オプション (文字範囲オプション)\n                      d: デフォルト (Ruby 1.9.3 互換)\n                         \\w, \\d, \\s は、非ASCII文字にマッチしない。\n                         \\b, \\B, POSIXブラケットは、各エンコーディングの\n                         ルールに従う。\n                      a: ASCII\n                         ONIG_OPTION_ASCII_RANGEオプションがオンになる。\n                         \\w, \\d, \\s, POSIXブラケットは、非ASCII文字に\n                         マッチしない。\n                         \\b, \\B は、ASCIIのルールに従う。\n                      u: Unicode\n                         ONIG_OPTION_ASCII_RANGEオプションがオフになる。\n                         \\w (\\W), \\d (\\D), \\s (\\S), \\b (\\B), POSIXブラケット\n                         は、各エンコーディングのルールに従う。\n\n  (?imxdau-imx:式)  式オプション\n\n  (式)              捕獲式集合\n  (?:式)            非捕獲式集合\n\n  (?=式)            先読み\n  (?!式)            否定先読み\n  (?<=式)           戻り読み\n  (?<!式)           否定戻り読み\n\n                    戻り読みの式は固定文字長でなければならない。\n                    しかし、最上位の選択子だけは異なった文字長が許される。\n                    例. (?<=a|bc) は許可. (?<=aaa(?:b|cd)) は不許可\n\n                    否定戻り読みでは、捕獲式集合は許されないが、\n                    非捕獲式集合は許される。\n\n  \\K                保持\n                    戻り読みの別表記。\\K の左側を保持し、検索結果に含まない。\n\n  (?>式)            原子的式集合\n                    式全体を通過したとき、式の中での後退再試行を行なわない\n\n  (?<name>式), (?'name'式)\n                    名前付き捕獲式集合\n                    式集合に名前を割り当てる(定義する)。\n                    (名前は単語構成文字でなければならない。)\n\n                    名前だけでなく、捕獲式集合と同様に番号も割り当てられる。\n                    番号指定が禁止されていない状態 (10. 捕獲式集合 を参照)\n                    のときは、名前を使わないで番号でも参照できる。\n\n                    複数の式集合に同じ名前を与えることは許されている。\n                    この場合には、この名前を使用した後方参照は可能であるが、\n                    部分式呼出しはできない。\n                    (ONIG_SYNTAX_PERLでは部分式呼出しも可能。)\n\n  (?(条件)真の式), (?(条件)真の式|偽の式)\n                    条件式\n                    (条件)が真であれば真の式がマッチし、偽であれば偽の式が\n                    マッチする。\n                    (条件)には以下のものが使用できる。\n\n                    (n)  (n >= 1)\n                        番号指定の後方参照が何かにマッチしていれば真、\n                        マッチしていなければ偽\n\n                    (<name>), ('name')\n                        名前指定の後方参照が何かにマッチしていれば真、\n                        マッチしていなければ偽\n\n\n8. 後方参照\n\n  \\n          番号指定参照     (n >= 1)\n  \\k<n>       番号指定参照     (n >= 1)\n  \\k'n'       番号指定参照     (n >= 1)\n  \\k<-n>      相対番号指定参照 (n >= 1)\n  \\k'-n'      相対番号指定参照 (n >= 1)\n  \\k<name>    名前指定参照\n  \\k'name'    名前指定参照\n\n  名前指定参照で、その名前が複数の式集合で多重定義されている場合には、\n  番号の大きい式集合から優先的に参照される。\n  (マッチしないときには番号の小さい式集合が参照される)\n\n  ※ 番号指定参照は、名前付き捕獲式集合が定義され、\n     かつ ONIG_OPTION_CAPTURE_GROUPが指定されていない場合には、\n     禁止される。(10. 捕獲式集合 を参照)\n\n  ※ ONIG_SYNTAX_PERLでは、\\g{n}, \\g{-n}, \\g{name} も使用可能。\n\n\n  ネストレベル付き後方参照\n\n    level: 0, 1, 2, ...\n\n    \\k<n+level>     (n >= 1)\n    \\k<n-level>     (n >= 1)\n    \\k'n+level'     (n >= 1)\n    \\k'n-level'     (n >= 1)\n    \\k<-n+level>    (n >= 1)\n    \\k<-n-level>    (n >= 1)\n    \\k'-n+level'    (n >= 1)\n    \\k'-n-level'    (n >= 1)\n\n    \\k<name+level>\n    \\k<name-level>\n    \\k'name+level'\n    \\k'name-level'\n\n    後方参照の位置から相対的な部分式呼出しネストレベルを指定して、そのレベルでの\n    捕獲値を参照する。\n\n    例-1.\n\n      /\\A(?<a>|.|(?:(?<b>.)\\g<a>\\k<b+0>))\\z/.match(\"reer\")\n\n    例-2.\n\n      r = Regexp.compile(<<'__REGEXP__'.strip, Regexp::EXTENDED)\n      (?<element> \\g<stag> \\g<content>* \\g<etag> ){0}\n      (?<stag> < \\g<name> \\s* > ){0}\n      (?<name> [a-zA-Z_:]+ ){0}\n      (?<content> [^<&]+ (\\g<element> | [^<&]+)* ){0}\n      (?<etag> </ \\k<name+1> >){0}\n      \\g<element>\n      __REGEXP__\n\n      p r.match('<foo>f<bar>bbb</bar>f</foo>').captures\n\n\n\n9. 部分式呼出し (\"田中哲スペシャル\")\n\n  \\g<name>    名前指定呼出し\n  \\g'name'    名前指定呼出し\n  \\g<n>       番号指定呼出し (n >= 1)\n  \\g'n'       番号指定呼出し (n >= 1)\n  \\g<0>       パターン全体の再帰呼び出し\n  \\g'0'       パターン全体の再帰呼び出し\n  \\g<-n>      相対番号指定呼出し (n >= 1)\n  \\g'-n'      相対番号指定呼出し (n >= 1)\n  \\g<+n>      相対番号指定呼出し (n >= 1)\n  \\g'+n'      相対番号指定呼出し (n >= 1)\n\n  ※ 最左位置での再帰呼出しは禁止される。\n     例. (?<name>a|\\g<name>b)   => error\n         (?<name>a|b\\g<name>c)  => OK\n\n  ※ 番号指定呼出しは、名前付き捕獲式集合が定義され、\n     かつ ONIG_OPTION_CAPTURE_GROUPが指定されていない場合には、\n     禁止される。 (10. 捕獲式集合 を参照)\n\n  ※ 呼び出された式集合のオプション状態が呼出し側のオプション状態と異なっている\n     とき、呼び出された側のオプション状態が有効である。\n\n     例. (?-i:\\g<name>)(?i:(?<name>a)){0} は \"A\" に照合成功する。\n\n  ※ ONIG_SYNTAX_PERLでは代わりに (?&name), (?n), (?-n), (?+n), (?R), (?0) を\n     使用する。\n\n\n10. 捕獲式集合\n\n  捕獲式集合(...)は、以下の条件に応じて振舞が変化する。\n  (名前付き捕獲式集合は変化しない)\n\n  case 1. /.../     (名前付き捕獲式集合は不使用、オプションなし)\n\n     (...) は、捕獲式集合として扱われる。\n\n  case 2. /.../g    (名前付き捕獲式集合は不使用、オプション 'g'を指定)\n\n     (...) は、非捕獲式集合として扱われる。\n\n  case 3. /..(?<name>..)../   (名前付き捕獲式集合は使用、オプションなし)\n\n     (...) は、非捕獲式集合として扱われる。\n     番号指定参照/呼び出しは不許可。\n\n  case 4. /..(?<name>..)../G  (名前付き捕獲式集合は使用、オプション 'G'を指定)\n\n     (...) は、捕獲式集合として扱われる。\n     番号指定参照/呼び出しは許可。\n\n  但し\n    g: ONIG_OPTION_DONT_CAPTURE_GROUP\n    G: ONIG_OPTION_CAPTURE_GROUP\n    ('g'と'G'オプションは、ruby-dev MLで議論された。)\n\n  これらの振舞の意味は、\n  名前付き捕獲と名前無し捕獲を同時に使用する必然性のある場面は少ないであろう\n  という理由から考えられたものである。\n\n\n-----------------------------\n補記 1. 文法依存オプション\n\n   + ONIG_SYNTAX_RUBY\n     (?m): 終止符記号(.)は改行と照合成功\n\n   + ONIG_SYNTAX_PERL、ONIG_SYNTAX_JAVA、ONIG_SYNTAX_PYTHON\n     (?s): 終止符記号(.)は改行と照合成功\n     (?m): ^ は改行の直後に照合する、$ は改行の直前に照合する\n\n   + ONIG_SYNTAX_PERL\n     (?d), (?l): (?u)と同じ\n\n\n補記 2. 独自拡張機能\n\n   + 16進数数字、非16進数字  \\h, \\H\n   + 名前付き捕獲式集合      (?<name>...), (?'name'...)\n   + 名前指定後方参照        \\k<name>\n   + 部分式呼出し            \\g<name>, \\g<group-num>\n\n\n補記 3. Perl 5.14.0と比較して存在しない機能\n\n   + \\N{name}, \\N{U+xxxx}, \\N\n   + \\l,\\u,\\L,\\U, \\C\n   + \\v, \\V, \\h, \\H, \\o{xxx}\n   + (?{code})\n   + (??{code})\n   + (?|...)\n   + (*VERB:ARG)\n\n   * \\Q...\\E\n     但しONIG_SYNTAX_PERLとONIG_SYNTAX_JAVAでは有効\n\n\n補記 4. Ruby 1.8 の日本語化 GNU regex(version 0.12)との違い\n\n   + 文字Property機能追加 (\\p{property}, \\P{Property})\n   + 16進数字タイプ追加 (\\h, \\H)\n   + 戻り読み機能を追加\n   + 強欲な繰り返し指定子を追加 (?+, *+, ++)\n   + 文字集合の中の演算子を追加 ([...], &&)\n     ('[' は、文字集合の中で通常の文字として使用するときには\n      退避修飾しなければならない)\n   + 名前付き捕獲式集合と、部分式呼出し機能追加\n   + 多バイト文字コードが指定されているとき、\n     文字集合の中で八進数または十六進数表現の連続は、多バイト符合で表現された\n     一個の文字と解釈される\n     (例. [\\xa1\\xa2], [\\xa1\\xa7-\\xa4\\xa1])\n   + 文字集合の中で、一バイト文字と多バイト文字の範囲指定は許される。\n     ex. /[a-あ]/\n   + 孤立オプションの有効範囲は、その孤立オプションを含んでいる式集合の\n     終わりまでである\n     例. (?:(?i)a|b) は (?:(?i:a|b)) と解釈される、(?:(?i:a)|b)ではない\n   + 孤立オプションはその前の式に対して透過的ではない\n     例. /a(?i)*/ は文法エラーとなる\n   + 不完全な繰り返し範囲指定子は通常の文字列として許可される\n     例. /{/, /({)/, /a{2,3/\n   + 否定的POSIXブラケット [:^xxxx:] を追加\n   + POSIXブラケット [:ascii:] を追加\n   + 先読みの繰り返しは不許可\n     例. /(?=a)*/, /(?!b){5}/\n   + 数値で指定された文字に対しても、大文字小文字照合オプションは有効\n     例. /\\x61/i =~ \"A\"\n   + 繰り返し回数指定で、最低回数の省略(0回)ができる\n     /a{,n}/ == /a{0,n}/\n     最低回数と最大回数の同時省略は許されない。(/a{,}/)\n   + /a{n}?/は無欲な演算子ではない。\n     /a{n}?/ == /(?:a{n})?/\n   + 無効な後方参照をチェックしてエラーにする。\n     /\\1/, /(a)\\2/\n   + 無限繰り返しの中で、長さ零での照合成功は繰り返しを中断させるが、\n     このとき、中断すべきかどうかの判定として、捕獲式集合の捕獲状態の\n     変化まで考慮している\n     /(?:()|())*\\1\\2/ =~ \"\"\n     /(?:\\1a|())*/ =~ \"a\"\n\n\n\n補記 5. 実装されているが、既定値では有効にしていない機能\n\n   + 捕獲履歴参照\n\n     (?@...) と (?@<name>...)\n\n     例. /(?@a)*/.match(\"aaa\") ==> [<0-1>, <1-2>, <2-3>]\n\n     使用方法は、sample/listcap.cを参照\n\n     有効にしていない理由は、どの程度役に立つかはっきりしないため。\n\n\n補記 6. 問題点\n\n   + エンコーディングバイト値が適正な価かどうかのチェックは行なっていない。\n\n     例: UTF-8\n\n     * 先頭バイトとして不正なバイトを一文字とみなす\n       /./u =~ \"\\xa3\"\n\n     * 不完全なバイトシーケンスのチェックをしない\n      /\\w+/u =~ \"a\\xf3\\x8ec\"\n\n     これを調べることは可能ではあるが、遅くなるので行なわない。\n\n     文字列として、そのようなバイト列を指定した場合の動作は保証しない。\n\n終り\n"
  },
  {
    "path": "src/Onigmo/doc/UnicodeProps.txt",
    "content": "Onigmo (Oniguruma-mod) Unicode Properties  Version 5.13.1    2012/02/01\n\n* POSIX brackets\n    Alpha\n    Blank\n    Cntrl\n    Digit\n    Graph\n    Lower\n    Print\n    Punct\n    Space\n    Upper\n    XDigit\n    Word\n    Alnum\n    ASCII\n\n* Special\n    Any\n    Assigned\n\n* Major and General Categories\n    C\n    Cc\n    Cf\n    Cn\n    Co\n    Cs\n    L\n    LC\n    Ll\n    Lm\n    Lo\n    Lt\n    Lu\n    M\n    Mc\n    Me\n    Mn\n    N\n    Nd\n    Nl\n    No\n    P\n    Pc\n    Pd\n    Pe\n    Pf\n    Pi\n    Po\n    Ps\n    S\n    Sc\n    Sk\n    Sm\n    So\n    Z\n    Zl\n    Zp\n    Zs\n\n* Scripts\n    Arabic\n    Armenian\n    Avestan\n    Balinese\n    Bamum\n    Batak\n    Bengali\n    Bopomofo\n    Brahmi\n    Braille\n    Buginese\n    Buhid\n    Canadian_Aboriginal\n    Carian\n    Chakma\n    Cham\n    Cherokee\n    Common\n    Coptic\n    Cuneiform\n    Cypriot\n    Cyrillic\n    Deseret\n    Devanagari\n    Egyptian_Hieroglyphs\n    Ethiopic\n    Georgian\n    Glagolitic\n    Gothic\n    Greek\n    Gujarati\n    Gurmukhi\n    Han\n    Hangul\n    Hanunoo\n    Hebrew\n    Hiragana\n    Imperial_Aramaic\n    Inherited\n    Inscriptional_Pahlavi\n    Inscriptional_Parthian\n    Javanese\n    Kaithi\n    Kannada\n    Katakana\n    Kayah_Li\n    Kharoshthi\n    Khmer\n    Lao\n    Latin\n    Lepcha\n    Limbu\n    Linear_B\n    Lisu\n    Lycian\n    Lydian\n    Malayalam\n    Mandaic\n    Meetei_Mayek\n    Meroitic_Cursive\n    Meroitic_Hieroglyphs\n    Miao\n    Mongolian\n    Myanmar\n    New_Tai_Lue\n    Nko\n    Ogham\n    Ol_Chiki\n    Old_Italic\n    Old_Persian\n    Old_South_Arabian\n    Old_Turkic\n    Oriya\n    Osmanya\n    Phags_Pa\n    Phoenician\n    Rejang\n    Runic\n    Samaritan\n    Saurashtra\n    Sharada\n    Shavian\n    Sinhala\n    Sora_Sompeng\n    Sundanese\n    Syloti_Nagri\n    Syriac\n    Tagalog\n    Tagbanwa\n    Tai_Le\n    Tai_Tham\n    Tai_Viet\n    Takri\n    Tamil\n    Telugu\n    Thaana\n    Thai\n    Tibetan\n    Tifinagh\n    Ugaritic\n    Unknown\n    Vai\n    Yi\n\n* DerivedCoreProperties\n    Alphabetic\n    Case_Ignorable\n    Cased\n    Changes_When_Casefolded\n    Changes_When_Casemapped\n    Changes_When_Lowercased\n    Changes_When_Titlecased\n    Changes_When_Uppercased\n    Default_Ignorable_Code_Point\n    Grapheme_Base\n    Grapheme_Extend\n    Grapheme_Link\n    ID_Continue\n    ID_Start\n    Lowercase\n    Math\n    Uppercase\n    XID_Continue\n    XID_Start\n\n* PropList\n    ASCII_Hex_Digit\n    Bidi_Control\n    Dash\n    Deprecated\n    Diacritic\n    Extender\n    Hex_Digit\n    Hyphen\n    IDS_Binary_Operator\n    IDS_Trinary_Operator\n    Ideographic\n    Join_Control\n    Logical_Order_Exception\n    Noncharacter_Code_Point\n    Other_Alphabetic\n    Other_Default_Ignorable_Code_Point\n    Other_Grapheme_Extend\n    Other_ID_Continue\n    Other_ID_Start\n    Other_Lowercase\n    Other_Math\n    Other_Uppercase\n    Pattern_Syntax\n    Pattern_White_Space\n    Quotation_Mark\n    Radical\n    STerm\n    Soft_Dotted\n    Terminal_Punctuation\n    Unified_Ideograph\n    Variation_Selector\n    White_Space\n\n* PropertyAliases\n    AHex\n    Bidi_C\n    CI\n    CWCF\n    CWCM\n    CWL\n    CWT\n    CWU\n    Dep\n    DI\n    Dia\n    Ext\n    Gr_Base\n    Gr_Ext\n    Gr_Link\n    Hex\n    IDC\n    Ideo\n    IDS\n    IDSB\n    IDST\n    Join_C\n    LOE\n    NChar\n    OAlpha\n    ODI\n    OGr_Ext\n    OIDC\n    OIDS\n    OLower\n    OMath\n    OUpper\n    Pat_Syn\n    Pat_WS\n    QMark\n    SD\n    Term\n    UIdeo\n    VS\n    WSpace\n    XIDC\n    XIDS\n\n* PropertyValueAliases (General_Category)\n    Other\n    Control\n    Format\n    Unassigned\n    Private_Use\n    Surrogate\n    Letter\n    Cased_Letter\n    Lowercase_Letter\n    Modifier_Letter\n    Other_Letter\n    Titlecase_Letter\n    Uppercase_Letter\n    Mark\n    Spacing_Mark\n    Enclosing_Mark\n    Nonspacing_Mark\n    Number\n    Decimal_Number\n    Letter_Number\n    Other_Number\n    Punctuation\n    Connector_Punctation\n    Dash_Punctation\n    Close_Punctation\n    Final_Punctation\n    Initial_Punctation\n    Other_Punctation\n    Open_Punctation\n    Symbol\n    Currency_Symbol\n    Modifier_Symbol\n    Math_Symbol\n    Other_Symbol\n    Separator\n    Line_Separator\n    Paragraph_Separator\n    Space_Separator\n\n* PropertyValueAliases (Script)\n    Arab\n    Armi\n    Armn\n    Avst\n    Bali\n    Bamu\n    Batk\n    Beng\n    Bopo\n    Brah\n    Brai\n    Bugi\n    Buhd\n    Cans\n    Cari\n    Cher\n    Copt\n    Qaac\n    Cprt\n    Cyrl\n    Deva\n    Dsrt\n    Egyp\n    Ethi\n    Geor\n    Glag\n    Goth\n    Grek\n    Gujr\n    Guru\n    Hang\n    Hani\n    Hano\n    Hebr\n    Hira\n    Ital\n    Java\n    Kali\n    Kana\n    Khar\n    Khmr\n    Knda\n    Kthi\n    Lana\n    Laoo\n    Latn\n    Lepc\n    Limb\n    Linb\n    Lyci\n    Lydi\n    Mand\n    Mlym\n    Mong\n    Mtei\n    Mymr\n    Nkoo\n    Ogam\n    Olck\n    Orkh\n    Orya\n    Osma\n    Phag\n    Phli\n    Phnx\n    Prti\n    Rjng\n    Runr\n    Samr\n    Sarb\n    Saur\n    Shaw\n    Sinh\n    Sund\n    Sylo\n    Syrc\n    Tagb\n    Tale\n    Talu\n    Taml\n    Tavt\n    Telu\n    Tfng\n    Tglg\n    Thaa\n    Tibt\n    Ugar\n    Vaii\n    Xpeo\n    Xsux\n    Yiii\n    Zinh\n    Qaai\n    Zyyy\n    Zzzz\n\n* DerivedAges\n    Age=1.1\n    Age=2.0\n    Age=2.1\n    Age=3.0\n    Age=3.1\n    Age=3.2\n    Age=4.0\n    Age=4.1\n    Age=5.0\n    Age=5.1\n    Age=5.2\n    Age=6.0\n    Age=6.1\n\n* Blocks\n    In_Basic_Latin\n    In_Latin_1_Supplement\n    In_Latin_Extended_A\n    In_Latin_Extended_B\n    In_IPA_Extensions\n    In_Spacing_Modifier_Letters\n    In_Combining_Diacritical_Marks\n    In_Greek_and_Coptic\n    In_Cyrillic\n    In_Cyrillic_Supplement\n    In_Armenian\n    In_Hebrew\n    In_Arabic\n    In_Syriac\n    In_Arabic_Supplement\n    In_Thaana\n    In_NKo\n    In_Samaritan\n    In_Mandaic\n    In_Arabic_Extended_A\n    In_Devanagari\n    In_Bengali\n    In_Gurmukhi\n    In_Gujarati\n    In_Oriya\n    In_Tamil\n    In_Telugu\n    In_Kannada\n    In_Malayalam\n    In_Sinhala\n    In_Thai\n    In_Lao\n    In_Tibetan\n    In_Myanmar\n    In_Georgian\n    In_Hangul_Jamo\n    In_Ethiopic\n    In_Ethiopic_Supplement\n    In_Cherokee\n    In_Unified_Canadian_Aboriginal_Syllabics\n    In_Ogham\n    In_Runic\n    In_Tagalog\n    In_Hanunoo\n    In_Buhid\n    In_Tagbanwa\n    In_Khmer\n    In_Mongolian\n    In_Unified_Canadian_Aboriginal_Syllabics_Extended\n    In_Limbu\n    In_Tai_Le\n    In_New_Tai_Lue\n    In_Khmer_Symbols\n    In_Buginese\n    In_Tai_Tham\n    In_Balinese\n    In_Sundanese\n    In_Batak\n    In_Lepcha\n    In_Ol_Chiki\n    In_Sundanese_Supplement\n    In_Vedic_Extensions\n    In_Phonetic_Extensions\n    In_Phonetic_Extensions_Supplement\n    In_Combining_Diacritical_Marks_Supplement\n    In_Latin_Extended_Additional\n    In_Greek_Extended\n    In_General_Punctuation\n    In_Superscripts_and_Subscripts\n    In_Currency_Symbols\n    In_Combining_Diacritical_Marks_for_Symbols\n    In_Letterlike_Symbols\n    In_Number_Forms\n    In_Arrows\n    In_Mathematical_Operators\n    In_Miscellaneous_Technical\n    In_Control_Pictures\n    In_Optical_Character_Recognition\n    In_Enclosed_Alphanumerics\n    In_Box_Drawing\n    In_Block_Elements\n    In_Geometric_Shapes\n    In_Miscellaneous_Symbols\n    In_Dingbats\n    In_Miscellaneous_Mathematical_Symbols_A\n    In_Supplemental_Arrows_A\n    In_Braille_Patterns\n    In_Supplemental_Arrows_B\n    In_Miscellaneous_Mathematical_Symbols_B\n    In_Supplemental_Mathematical_Operators\n    In_Miscellaneous_Symbols_and_Arrows\n    In_Glagolitic\n    In_Latin_Extended_C\n    In_Coptic\n    In_Georgian_Supplement\n    In_Tifinagh\n    In_Ethiopic_Extended\n    In_Cyrillic_Extended_A\n    In_Supplemental_Punctuation\n    In_CJK_Radicals_Supplement\n    In_Kangxi_Radicals\n    In_Ideographic_Description_Characters\n    In_CJK_Symbols_and_Punctuation\n    In_Hiragana\n    In_Katakana\n    In_Bopomofo\n    In_Hangul_Compatibility_Jamo\n    In_Kanbun\n    In_Bopomofo_Extended\n    In_CJK_Strokes\n    In_Katakana_Phonetic_Extensions\n    In_Enclosed_CJK_Letters_and_Months\n    In_CJK_Compatibility\n    In_CJK_Unified_Ideographs_Extension_A\n    In_Yijing_Hexagram_Symbols\n    In_CJK_Unified_Ideographs\n    In_Yi_Syllables\n    In_Yi_Radicals\n    In_Lisu\n    In_Vai\n    In_Cyrillic_Extended_B\n    In_Bamum\n    In_Modifier_Tone_Letters\n    In_Latin_Extended_D\n    In_Syloti_Nagri\n    In_Common_Indic_Number_Forms\n    In_Phags_pa\n    In_Saurashtra\n    In_Devanagari_Extended\n    In_Kayah_Li\n    In_Rejang\n    In_Hangul_Jamo_Extended_A\n    In_Javanese\n    In_Cham\n    In_Myanmar_Extended_A\n    In_Tai_Viet\n    In_Meetei_Mayek_Extensions\n    In_Ethiopic_Extended_A\n    In_Meetei_Mayek\n    In_Hangul_Syllables\n    In_Hangul_Jamo_Extended_B\n    In_High_Surrogates\n    In_High_Private_Use_Surrogates\n    In_Low_Surrogates\n    In_Private_Use_Area\n    In_CJK_Compatibility_Ideographs\n    In_Alphabetic_Presentation_Forms\n    In_Arabic_Presentation_Forms_A\n    In_Variation_Selectors\n    In_Vertical_Forms\n    In_Combining_Half_Marks\n    In_CJK_Compatibility_Forms\n    In_Small_Form_Variants\n    In_Arabic_Presentation_Forms_B\n    In_Halfwidth_and_Fullwidth_Forms\n    In_Specials\n    In_Linear_B_Syllabary\n    In_Linear_B_Ideograms\n    In_Aegean_Numbers\n    In_Ancient_Greek_Numbers\n    In_Ancient_Symbols\n    In_Phaistos_Disc\n    In_Lycian\n    In_Carian\n    In_Old_Italic\n    In_Gothic\n    In_Ugaritic\n    In_Old_Persian\n    In_Deseret\n    In_Shavian\n    In_Osmanya\n    In_Cypriot_Syllabary\n    In_Imperial_Aramaic\n    In_Phoenician\n    In_Lydian\n    In_Meroitic_Hieroglyphs\n    In_Meroitic_Cursive\n    In_Kharoshthi\n    In_Old_South_Arabian\n    In_Avestan\n    In_Inscriptional_Parthian\n    In_Inscriptional_Pahlavi\n    In_Old_Turkic\n    In_Rumi_Numeral_Symbols\n    In_Brahmi\n    In_Kaithi\n    In_Sora_Sompeng\n    In_Chakma\n    In_Sharada\n    In_Takri\n    In_Cuneiform\n    In_Cuneiform_Numbers_and_Punctuation\n    In_Egyptian_Hieroglyphs\n    In_Bamum_Supplement\n    In_Miao\n    In_Kana_Supplement\n    In_Byzantine_Musical_Symbols\n    In_Musical_Symbols\n    In_Ancient_Greek_Musical_Notation\n    In_Tai_Xuan_Jing_Symbols\n    In_Counting_Rod_Numerals\n    In_Mathematical_Alphanumeric_Symbols\n    In_Arabic_Mathematical_Alphabetic_Symbols\n    In_Mahjong_Tiles\n    In_Domino_Tiles\n    In_Playing_Cards\n    In_Enclosed_Alphanumeric_Supplement\n    In_Enclosed_Ideographic_Supplement\n    In_Miscellaneous_Symbols_And_Pictographs\n    In_Emoticons\n    In_Transport_And_Map_Symbols\n    In_Alchemical_Symbols\n    In_CJK_Unified_Ideographs_Extension_B\n    In_CJK_Unified_Ideographs_Extension_C\n    In_CJK_Unified_Ideographs_Extension_D\n    In_CJK_Compatibility_Ideographs_Supplement\n    In_Tags\n    In_Variation_Selectors_Supplement\n    In_Supplementary_Private_Use_Area_A\n    In_Supplementary_Private_Use_Area_B\n    In_No_Block\n"
  },
  {
    "path": "src/Onigmo/enc/ascii.c",
    "content": "/**********************************************************************\n  ascii.c -  Onigmo (Oniguruma-mod) (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2006  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * Copyright (c) 2011       K.Takata  <kentkt AT csc DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regenc.h\"\n\nOnigEncodingType OnigEncodingASCII = {\n  onigenc_single_byte_mbc_enc_len,\n  onigenc_single_byte_mbc_enc_len_se,\n  \"US-ASCII\",  /* name */\n  1,           /* max byte length */\n  1,           /* min byte length */\n  onigenc_is_mbc_newline_0x0a,\n  onigenc_is_mbc_newline_0x0a_se,\n  onigenc_single_byte_mbc_to_code,\n  onigenc_single_byte_mbc_to_code_se,\n  onigenc_single_byte_code_to_mbclen,\n  onigenc_single_byte_code_to_mbc,\n  onigenc_ascii_mbc_case_fold,\n  onigenc_ascii_mbc_case_fold_se,\n  onigenc_ascii_apply_all_case_fold,\n  onigenc_ascii_get_case_fold_codes_by_str,\n  onigenc_minimum_property_name_to_ctype,\n  onigenc_ascii_is_code_ctype,\n  onigenc_not_support_get_ctype_code_range,\n  onigenc_single_byte_left_adjust_char_head,\n  onigenc_single_byte_left_adjust_char_head_se,\n  onigenc_always_true_is_allowed_reverse_match,\n  ONIGENC_FLAG_NONE,\n};\n"
  },
  {
    "path": "src/Onigmo/enc/big5.c",
    "content": "/**********************************************************************\n  big5.c -  Oniguruma (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2007  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regenc.h\"\n\nstatic const int EncLen_BIG5[] = {\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1\n};\n\nstatic int\nbig5_mbc_enc_len(const UChar* p)\n{\n  return EncLen_BIG5[*p];\n}\n\nstatic int\nbig5_mbc_enc_len_se(OnigIterator* it, OnigPosition p)\n{\n  return EncLen_BIG5[ONIG_CHARAT(p)];\n}\n\nstatic OnigCodePoint\nbig5_mbc_to_code(const UChar* p, const UChar* end)\n{\n  return onigenc_mbn_mbc_to_code(ONIG_ENCODING_BIG5, p, end);\n}\n\nstatic OnigCodePoint\nbig5_mbc_to_code_se(OnigIterator* it, OnigPosition p, OnigPosition end)\n{\n\treturn onigenc_mbn_mbc_to_code_se(it, ONIG_ENCODING_BIG5, p, end);\n}\n\nstatic int\nbig5_code_to_mbc(OnigCodePoint code, UChar *buf)\n{\n  return onigenc_mb2_code_to_mbc(ONIG_ENCODING_BIG5, code, buf);\n}\n\nstatic int\nbig5_mbc_case_fold(OnigCaseFoldType flag, const UChar** pp, const UChar* end,\n                   UChar* lower)\n{\n  return onigenc_mbn_mbc_case_fold(ONIG_ENCODING_BIG5, flag,\n                                   pp, end, lower);\n}\n\nstatic int\nbig5_mbc_case_fold_se(OnigIterator* it, OnigCaseFoldType flag, OnigPosition* pp, OnigPosition end,\n                   UChar* lower)\n{\n  return onigenc_mbn_mbc_case_fold_se(it, ONIG_ENCODING_BIG5, flag,\n                                   pp, end, lower);\n}\n\n#if 0\nstatic int\nbig5_is_mbc_ambiguous(OnigCaseFoldType flag,\n\t\t      const UChar** pp, const UChar* end)\n{\n  return onigenc_mbn_is_mbc_ambiguous(ONIG_ENCODING_BIG5, flag, pp, end);\n}\n#endif\n\nstatic int\nbig5_is_code_ctype(OnigCodePoint code, unsigned int ctype)\n{\n  return onigenc_mb2_is_code_ctype(ONIG_ENCODING_BIG5, code, ctype);\n}\n\nstatic const char BIG5_CAN_BE_TRAIL_TABLE[256] = {\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0\n};\n\n#define BIG5_ISMB_FIRST(byte)  (EncLen_BIG5[byte] > 1)\n#define BIG5_ISMB_TRAIL(byte)  BIG5_CAN_BE_TRAIL_TABLE[(byte)]\n\nstatic UChar*\nbig5_left_adjust_char_head(const UChar* start, const UChar* s)\n{\n  const UChar *p;\n  int len;\n\n  if (s <= start) return (UChar* )s;\n  p = s;\n\n  if (BIG5_ISMB_TRAIL(*p)) {\n    while (p > start) {\n      if (! BIG5_ISMB_FIRST(*--p)) {\n\tp++;\n\tbreak;\n      }\n    }\n  }\n  len = enclen(ONIG_ENCODING_BIG5, p);\n  if (p + len > s) return (UChar* )p;\n  p += len;\n  return (UChar* )(p + ((s - p) & ~1));\n}\n\nstatic OnigPosition\nbig5_left_adjust_char_head_se(OnigIterator* it, OnigPosition start, OnigPosition s)\n{\n  OnigPosition p;\n  int len;\n\n  if (s <= start) return s;\n  p = s;\n\n  if (BIG5_ISMB_TRAIL(ONIG_CHARAT(p))) {\n    while (p > start) {\n      if (! BIG5_ISMB_FIRST(ONIG_CHARAT(--p))) {\n\tp++;\n\tbreak;\n      }\n    }\n  }\n  len = enclen_se(it, ONIG_ENCODING_BIG5, p);\n  if (p + len > s) return p;\n  p += len;\n  return (p + ((s - p) & ~1));\n}\n\nstatic int\nbig5_is_allowed_reverse_match(const UChar* s, const UChar* end ARG_UNUSED)\n{\n  const UChar c = *s;\n\n  return (BIG5_ISMB_TRAIL(c) ? FALSE : TRUE);\n}\n\nOnigEncodingType OnigEncodingBIG5 = {\n  big5_mbc_enc_len,\n  big5_mbc_enc_len_se,\n  \"Big5\",     /* name */\n  2,          /* max enc length */\n  1,          /* min enc length */\n  onigenc_is_mbc_newline_0x0a,\n  onigenc_is_mbc_newline_0x0a_se,\n  big5_mbc_to_code,\n  big5_mbc_to_code_se,\n  onigenc_mb2_code_to_mbclen,\n  big5_code_to_mbc,\n  big5_mbc_case_fold,\n  big5_mbc_case_fold_se,\n  onigenc_ascii_apply_all_case_fold,\n  onigenc_ascii_get_case_fold_codes_by_str,\n  onigenc_minimum_property_name_to_ctype,\n  big5_is_code_ctype,\n  onigenc_not_support_get_ctype_code_range,\n  big5_left_adjust_char_head,\n  big5_left_adjust_char_head_se,\n  big5_is_allowed_reverse_match,\n  ONIGENC_FLAG_NONE,\n};\n"
  },
  {
    "path": "src/Onigmo/enc/cp1251.c",
    "content": "/**********************************************************************\n  cp1251.c -  Oniguruma (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2006-2007  Byte      <byte AT mail DOT kna DOT ru>\n *                          K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regenc.h\"\n\n#define ENC_CP1251_TO_LOWER_CASE(c) EncCP1251_ToLowerCaseTable[c]\n#define ENC_IS_CP1251_CTYPE(code,ctype) \\\n  ((EncCP1251_CtypeTable[code] & CTYPE_TO_BIT(ctype)) != 0)\n\nstatic const UChar EncCP1251_ToLowerCaseTable[256] = {\n  '\\000', '\\001', '\\002', '\\003', '\\004', '\\005', '\\006', '\\007',\n  '\\010', '\\011', '\\012', '\\013', '\\014', '\\015', '\\016', '\\017',\n  '\\020', '\\021', '\\022', '\\023', '\\024', '\\025', '\\026', '\\027',\n  '\\030', '\\031', '\\032', '\\033', '\\034', '\\035', '\\036', '\\037',\n  '\\040', '\\041', '\\042', '\\043', '\\044', '\\045', '\\046', '\\047',\n  '\\050', '\\051', '\\052', '\\053', '\\054', '\\055', '\\056', '\\057',\n  '\\060', '\\061', '\\062', '\\063', '\\064', '\\065', '\\066', '\\067',\n  '\\070', '\\071', '\\072', '\\073', '\\074', '\\075', '\\076', '\\077',\n  '\\100', '\\141', '\\142', '\\143', '\\144', '\\145', '\\146', '\\147',\n  '\\150', '\\151', '\\152', '\\153', '\\154', '\\155', '\\156', '\\157',\n  '\\160', '\\161', '\\162', '\\163', '\\164', '\\165', '\\166', '\\167',\n  '\\170', '\\171', '\\172', '\\133', '\\134', '\\135', '\\136', '\\137',\n  '\\140', '\\141', '\\142', '\\143', '\\144', '\\145', '\\146', '\\147',\n  '\\150', '\\151', '\\152', '\\153', '\\154', '\\155', '\\156', '\\157',\n  '\\160', '\\161', '\\162', '\\163', '\\164', '\\165', '\\166', '\\167',\n  '\\170', '\\171', '\\172', '\\173', '\\174', '\\175', '\\176', '\\177',\n  '\\220', '\\203', '\\202', '\\203', '\\204', '\\205', '\\206', '\\207',\n  '\\210', '\\211', '\\232', '\\213', '\\234', '\\235', '\\236', '\\237',\n  '\\220', '\\221', '\\222', '\\223', '\\224', '\\225', '\\226', '\\227',\n  '\\230', '\\231', '\\232', '\\233', '\\234', '\\235', '\\236', '\\237',\n  '\\240', '\\242', '\\242', '\\274', '\\244', '\\264', '\\246', '\\247',\n  '\\270', '\\251', '\\272', '\\253', '\\254', '\\255', '\\256', '\\277',\n  '\\260', '\\261', '\\263', '\\263', '\\264', '\\265', '\\266', '\\267',\n  '\\270', '\\271', '\\272', '\\273', '\\274', '\\276', '\\276', '\\277',\n  '\\340', '\\341', '\\342', '\\343', '\\344', '\\345', '\\346', '\\347',\n  '\\350', '\\351', '\\352', '\\353', '\\354', '\\355', '\\356', '\\357',\n  '\\360', '\\361', '\\362', '\\363', '\\364', '\\365', '\\366', '\\367',\n  '\\370', '\\371', '\\372', '\\373', '\\374', '\\375', '\\376', '\\377',\n  '\\340', '\\341', '\\342', '\\343', '\\344', '\\345', '\\346', '\\347',\n  '\\350', '\\351', '\\352', '\\353', '\\354', '\\355', '\\356', '\\357',\n  '\\360', '\\361', '\\362', '\\363', '\\364', '\\365', '\\366', '\\367',\n  '\\370', '\\371', '\\372', '\\373', '\\374', '\\375', '\\376', '\\377'\n};\n\nstatic const unsigned short EncCP1251_CtypeTable[256] = {\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x428c, 0x4209, 0x4208, 0x4208, 0x4208, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4284, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0,\n  0x78b0, 0x78b0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x51a0,\n  0x41a0, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x4008,\n  0x34a2, 0x34a2, 0x01a0, 0x30e2, 0x01a0, 0x01a0, 0x01a0, 0x01a0,\n  0x0000, 0x01a0, 0x34a2, 0x01a0, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x30e2, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x01a0,\n  0x0008, 0x0000, 0x30e2, 0x01a0, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x0280, 0x34a2, 0x30e2, 0x34a2, 0x01a0, 0x34a2, 0x01a0, 0x01a0,\n  0x34a2, 0x01a0, 0x34a2, 0x01a0, 0x01a0, 0x01a0, 0x01a0, 0x34a2,\n  0x01a0, 0x01a0, 0x34a2, 0x30e2, 0x30e2, 0x31e2, 0x01a0, 0x01a0,\n  0x30e2, 0x0000, 0x30e2, 0x01a0, 0x30e2, 0x34a2, 0x30e2, 0x30e2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2\n};\n\nstatic int\ncp1251_mbc_case_fold(OnigCaseFoldType flag ARG_UNUSED,\n             const UChar** pp, const UChar* end ARG_UNUSED, UChar* lower)\n{\n  const UChar* p = *pp;\n\n  *lower = ENC_CP1251_TO_LOWER_CASE(*p);\n  (*pp)++;\n  return 1;\n}\n\nstatic int\ncp1251_mbc_case_fold_se(OnigIterator* it, OnigCaseFoldType flag ARG_UNUSED,\n             OnigPosition* pp, OnigPosition end ARG_UNUSED, UChar* lower)\n{\n  const UChar c = ONIG_CHARAT(*pp);\n\n  *lower = ENC_CP1251_TO_LOWER_CASE(c);\n  (*pp)++;\n  return 1;\n}\n\nstatic int\ncp1251_is_code_ctype(OnigCodePoint code, unsigned int ctype)\n{\n  if (code < 256)\n    return ENC_IS_CP1251_CTYPE(code, ctype);\n  else\n    return FALSE;\n}\n\nstatic const OnigPairCaseFoldCodes CaseFoldMap[] = {\n  { 0xb8, 0xa8 },\n\n  { 0xe0, 0xc0 },\n  { 0xe1, 0xc1 },\n  { 0xe2, 0xc2 },\n  { 0xe3, 0xc3 },\n  { 0xe4, 0xc4 },\n  { 0xe5, 0xc5 },\n  { 0xe6, 0xc6 },\n  { 0xe7, 0xc7 },\n  { 0xe8, 0xc8 },\n  { 0xe9, 0xc9 },\n  { 0xea, 0xca },\n  { 0xeb, 0xcb },\n  { 0xec, 0xcc },\n  { 0xed, 0xcd },\n  { 0xee, 0xce },\n  { 0xef, 0xcf },\n\n  { 0xf0, 0xd0 },\n  { 0xf1, 0xd1 },\n  { 0xf2, 0xd2 },\n  { 0xf3, 0xd3 },\n  { 0xf4, 0xd4 },\n  { 0xf5, 0xd5 },\n  { 0xf6, 0xd6 },\n  { 0xf7, 0xd7 },\n  { 0xf8, 0xd8 },\n  { 0xf9, 0xd9 },\n  { 0xfa, 0xda },\n  { 0xfb, 0xdb },\n  { 0xfc, 0xdc },\n  { 0xfd, 0xdd },\n  { 0xfe, 0xde },\n  { 0xff, 0xdf }\n};\n\nstatic int\ncp1251_apply_all_case_fold(OnigCaseFoldType flag,\n\t\t\t       OnigApplyAllCaseFoldFunc f, void* arg)\n{\n  return onigenc_apply_all_case_fold_with_map(\n             sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 0,\n             flag, f, arg);\n}\n\nstatic int\ncp1251_get_case_fold_codes_by_str(OnigCaseFoldType flag,\n    const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem items[])\n{\n  return onigenc_get_case_fold_codes_by_str_with_map(\n\t     sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 0,\n\t     flag, p, end, items);\n}\n\nOnigEncodingType OnigEncodingCP1251 = {\n  onigenc_single_byte_mbc_enc_len,\n  onigenc_single_byte_mbc_enc_len_se,\n  \"CP1251\",      /* name */\n  1,             /* max enc length */\n  1,             /* min enc length */\n  onigenc_is_mbc_newline_0x0a,\n  onigenc_is_mbc_newline_0x0a_se,\n  onigenc_single_byte_mbc_to_code,\n  onigenc_single_byte_mbc_to_code_se,\n  onigenc_single_byte_code_to_mbclen,\n  onigenc_single_byte_code_to_mbc,\n  cp1251_mbc_case_fold,\n  cp1251_mbc_case_fold_se,\n  cp1251_apply_all_case_fold,\n  cp1251_get_case_fold_codes_by_str,\n  onigenc_minimum_property_name_to_ctype,\n  cp1251_is_code_ctype,\n  onigenc_not_support_get_ctype_code_range,\n  onigenc_single_byte_left_adjust_char_head,\n  onigenc_single_byte_left_adjust_char_head_se,\n  onigenc_always_true_is_allowed_reverse_match,\n  ONIGENC_FLAG_NONE,\n};\n"
  },
  {
    "path": "src/Onigmo/enc/cp932.c",
    "content": "/**********************************************************************\n  cp932.c -  Onigmo (Oniguruma-mod) (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2009  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * Copyright (c) 2011       K.Takata  <kentkt AT csc DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#define ENC_CP932\n#include \"sjis.c\"\n"
  },
  {
    "path": "src/Onigmo/enc/euc_jp.c",
    "content": "/**********************************************************************\n  euc_jp.c -  Onigmo (Oniguruma-mod) (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2008  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * Copyright (c) 2011       K.Takata  <kentkt AT csc DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regint.h\"\n\n#define eucjp_islead(c)    ((UChar )((c) - 0xa1) > 0xfe - 0xa1)\n\nstatic const int EncLen_EUCJP[] = {\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1\n};\n\nstatic const OnigPairCaseFoldCodes CaseFoldMap[] = {\n  /* Fullwidth Alphabet */\n  { 0xa3c1, 0xa3e1 },\n  { 0xa3c2, 0xa3e2 },\n  { 0xa3c3, 0xa3e3 },\n  { 0xa3c4, 0xa3e4 },\n  { 0xa3c5, 0xa3e5 },\n  { 0xa3c6, 0xa3e6 },\n  { 0xa3c7, 0xa3e7 },\n  { 0xa3c8, 0xa3e8 },\n  { 0xa3c9, 0xa3e9 },\n  { 0xa3ca, 0xa3ea },\n  { 0xa3cb, 0xa3eb },\n  { 0xa3cc, 0xa3ec },\n  { 0xa3cd, 0xa3ed },\n  { 0xa3ce, 0xa3ee },\n  { 0xa3cf, 0xa3ef },\n  { 0xa3d0, 0xa3f0 },\n  { 0xa3d1, 0xa3f1 },\n  { 0xa3d2, 0xa3f2 },\n  { 0xa3d3, 0xa3f3 },\n  { 0xa3d4, 0xa3f4 },\n  { 0xa3d5, 0xa3f5 },\n  { 0xa3d6, 0xa3f6 },\n  { 0xa3d7, 0xa3f7 },\n  { 0xa3d8, 0xa3f8 },\n  { 0xa3d9, 0xa3f9 },\n  { 0xa3da, 0xa3fa },\n\n  /* Greek */\n  { 0xa6a1, 0xa6c1 },\n  { 0xa6a2, 0xa6c2 },\n  { 0xa6a3, 0xa6c3 },\n  { 0xa6a4, 0xa6c4 },\n  { 0xa6a5, 0xa6c5 },\n  { 0xa6a6, 0xa6c6 },\n  { 0xa6a7, 0xa6c7 },\n  { 0xa6a8, 0xa6c8 },\n  { 0xa6a9, 0xa6c9 },\n  { 0xa6aa, 0xa6ca },\n  { 0xa6ab, 0xa6cb },\n  { 0xa6ac, 0xa6cc },\n  { 0xa6ad, 0xa6cd },\n  { 0xa6ae, 0xa6ce },\n  { 0xa6af, 0xa6cf },\n  { 0xa6b0, 0xa6d0 },\n  { 0xa6b1, 0xa6d1 },\n  { 0xa6b2, 0xa6d2 },\n  { 0xa6b3, 0xa6d3 },\n  { 0xa6b4, 0xa6d4 },\n  { 0xa6b5, 0xa6d5 },\n  { 0xa6b6, 0xa6d6 },\n  { 0xa6b7, 0xa6d7 },\n  { 0xa6b8, 0xa6d8 },\n\n  /* Cyrillic */\n  { 0xa7a1, 0xa7d1 },\n  { 0xa7a2, 0xa7d2 },\n  { 0xa7a3, 0xa7d3 },\n  { 0xa7a4, 0xa7d4 },\n  { 0xa7a5, 0xa7d5 },\n  { 0xa7a6, 0xa7d6 },\n  { 0xa7a7, 0xa7d7 },\n  { 0xa7a8, 0xa7d8 },\n  { 0xa7a9, 0xa7d9 },\n  { 0xa7aa, 0xa7da },\n  { 0xa7ab, 0xa7db },\n  { 0xa7ac, 0xa7dc },\n  { 0xa7ad, 0xa7dd },\n  { 0xa7ae, 0xa7de },\n  { 0xa7af, 0xa7df },\n  { 0xa7b0, 0xa7e0 },\n  { 0xa7b1, 0xa7e1 },\n  { 0xa7b2, 0xa7e2 },\n  { 0xa7b3, 0xa7e3 },\n  { 0xa7b4, 0xa7e4 },\n  { 0xa7b5, 0xa7e5 },\n  { 0xa7b6, 0xa7e6 },\n  { 0xa7b7, 0xa7e7 },\n  { 0xa7b8, 0xa7e8 },\n  { 0xa7b9, 0xa7e9 },\n  { 0xa7ba, 0xa7ea },\n  { 0xa7bb, 0xa7eb },\n  { 0xa7bc, 0xa7ec },\n  { 0xa7bd, 0xa7ed },\n  { 0xa7be, 0xa7ee },\n  { 0xa7bf, 0xa7ef },\n  { 0xa7c0, 0xa7f0 },\n  { 0xa7c1, 0xa7f1 },\n};\n\nstatic int\nmbc_enc_len(const UChar* p)\n{\n  return EncLen_EUCJP[*p];\n}\n\nstatic int\nmbc_enc_len_se(OnigIterator* it, OnigPosition p)\n{\n  return EncLen_EUCJP[ONIG_CHARAT(p)];\n}\n\nstatic OnigCodePoint\nmbc_to_code(const UChar* p, const UChar* end)\n{\n  int c, i, len;\n  OnigCodePoint n;\n\n  len = mbc_enc_len(p);\n  n = (OnigCodePoint )*p++;\n  if (len == 1) return n;\n\n  for (i = 1; i < len; i++) {\n    if (p >= end) break;\n    c = *p++;\n    n <<= 8;  n += c;\n  }\n  return n;\n}\n\nstatic OnigCodePoint\nmbc_to_code_se(OnigIterator* it, OnigPosition p, OnigPosition end)\n{\n  int c, i, len;\n  OnigCodePoint n;\n\n  len = mbc_enc_len_se(it, p);\n  n = (OnigCodePoint )ONIG_CHARAT(p++);\n  if (len == 1) return n;\n\n  for (i = 1; i < len; i++) {\n    if (p >= end) break;\n    c = ONIG_CHARAT(p++);\n    n <<= 8;  n += c;\n  }\n  return n;\n}\n\nstatic int\ncode_to_mbclen(OnigCodePoint code)\n{\n  if (ONIGENC_IS_CODE_ASCII(code)) return 1;\n  else if ((code & 0xff808080) == 0x00808080) return 3;\n  else if ((code & 0xffff8080) == 0x00008080) return 2;\n  else\n    return ONIGERR_INVALID_CODE_POINT_VALUE;\n}\n\n#if 0\nstatic int\ncode_to_mbc_first(OnigCodePoint code)\n{\n  int first;\n\n  if ((code & 0xff0000) != 0) {\n    first = (code >> 16) & 0xff;\n  }\n  else if ((code & 0xff00) != 0) {\n    first = (code >> 8) & 0xff;\n  }\n  else {\n    return (int )code;\n  }\n  return first;\n}\n#endif\n\nstatic int\ncode_to_mbc(OnigCodePoint code, UChar *buf)\n{\n  UChar *p = buf;\n\n  if ((code & 0xff0000) != 0) *p++ = (UChar )(((code >> 16) & 0xff));\n  if ((code &   0xff00) != 0) *p++ = (UChar )(((code >>  8) & 0xff));\n  *p++ = (UChar )(code & 0xff);\n\n#if 1\n  if (mbc_enc_len(buf) != (p - buf))\n    return ONIGERR_INVALID_CODE_POINT_VALUE;\n#endif\n  return (int )(p - buf);\n}\n\nstatic int\napply_all_case_fold(OnigCaseFoldType flag,\n\t\t    OnigApplyAllCaseFoldFunc f, void* arg)\n{\n  return onigenc_apply_all_case_fold_with_map(\n            sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 0,\n            flag, f, arg);\n}\n\nstatic OnigCodePoint\nget_lower_case(OnigCodePoint code)\n{\n  if (ONIGENC_IS_IN_RANGE(code, 0xa3c1, 0xa3da)) {\n    /* Fullwidth Alphabet */\n    return (OnigCodePoint )(code + 0x0020);\n  }\n  else if (ONIGENC_IS_IN_RANGE(code, 0xa6a1, 0xa6b8)) {\n    /* Greek */\n    return (OnigCodePoint )(code + 0x0020);\n  }\n  else if (ONIGENC_IS_IN_RANGE(code, 0xa7a1, 0xa7c1)) {\n    /* Cyrillic */\n    return (OnigCodePoint )(code + 0x0030);\n  }\n  return code;\n}\n\nstatic OnigCodePoint\nget_upper_case(OnigCodePoint code)\n{\n  if (ONIGENC_IS_IN_RANGE(code, 0xa3e1, 0xa3fa)) {\n    /* Fullwidth Alphabet */\n    return (OnigCodePoint )(code - 0x0020);\n  }\n  else if (ONIGENC_IS_IN_RANGE(code, 0xa6c1, 0xa6d8)) {\n    /* Greek */\n    return (OnigCodePoint )(code - 0x0020);\n  }\n  else if (ONIGENC_IS_IN_RANGE(code, 0xa7d1, 0xa7f1)) {\n    /* Cyrillic */\n    return (OnigCodePoint )(code - 0x0030);\n  }\n  return code;\n}\n\nstatic int\nget_case_fold_codes_by_str(OnigCaseFoldType flag,\n\t\t\t   const OnigUChar* p, const OnigUChar* end,\n\t\t\t   OnigCaseFoldCodeItem items[])\n{\n  int len;\n  OnigCodePoint code, code_lo, code_up;\n\n  code = mbc_to_code(p, end);\n  if (ONIGENC_IS_ASCII_CODE(code))\n    return onigenc_ascii_get_case_fold_codes_by_str(flag, p, end, items);\n\n  len = mbc_enc_len(p);\n  code_lo = get_lower_case(code);\n  code_up = get_upper_case(code);\n\n  if (code != code_lo) {\n    items[0].byte_len = len;\n    items[0].code_len = 1;\n    items[0].code[0] = code_lo;\n    return 1;\n  }\n  else if (code != code_up) {\n    items[0].byte_len = len;\n    items[0].code_len = 1;\n    items[0].code[0] = code_up;\n    return 1;\n  }\n\n  return 0;\n}\n\nstatic int\nmbc_case_fold(OnigCaseFoldType flag ARG_UNUSED,\n\t      const UChar** pp, const UChar* end ARG_UNUSED, UChar* lower)\n{\n  const UChar* p = *pp;\n\n  if (ONIGENC_IS_MBC_ASCII(p)) {\n    *lower = ONIGENC_ASCII_CODE_TO_LOWER_CASE(*p);\n    (*pp)++;\n    return 1;\n  }\n  else {\n    OnigCodePoint code;\n    int len;\n\n    code = get_lower_case(mbc_to_code(p, end));\n    len = code_to_mbc(code, lower);\n    (*pp) += len;\n    return len; /* return byte length of converted char to lower */\n  }\n}\n\nstatic int\nmbc_case_fold_se(OnigIterator* it, OnigCaseFoldType flag ARG_UNUSED,\n\t      OnigPosition* pp, OnigPosition end ARG_UNUSED, UChar* lower)\n{\n  const UChar c = ONIG_CHARAT(*pp);\n\n  if (ONIGENC_IS_MBC_ASCII_SE(c)) {\n    *lower = ONIGENC_ASCII_CODE_TO_LOWER_CASE(c);\n    (*pp)++;\n    return 1;\n  }\n  else {\n    OnigCodePoint code;\n    int len;\n\n    code = get_lower_case(mbc_to_code_se(it, *pp, end));\n    len = code_to_mbc(code, lower);\n    (*pp) += len;\n    return len; /* return byte length of converted char to lower */\n  }\n}\n\nstatic UChar*\nleft_adjust_char_head(const UChar* start, const UChar* s)\n{\n  /* In this encoding\n     mb-trail bytes doesn't mix with single bytes.\n  */\n  const UChar *p;\n  int len;\n\n  if (s <= start) return (UChar* )s;\n  p = s;\n\n  while (!eucjp_islead(*p) && p > start) p--;\n  len = mbc_enc_len(p);\n  if (p + len > s) return (UChar* )p;\n  p += len;\n  return (UChar* )(p + ((s - p) & ~1));\n}\n\nstatic OnigPosition\nleft_adjust_char_head_se(OnigIterator* it, OnigPosition start, OnigPosition s)\n{\n  /* In this encoding\n     mb-trail bytes doesn't mix with single bytes.\n  */\n  OnigPosition p;\n  int len;\n\n  if (s <= start) return s;\n  p = s;\n\n  while (!eucjp_islead(ONIG_CHARAT(p)) && p > start) p--;\n  len = mbc_enc_len_se(it, p);\n  if (p + len > s) return p;\n  p += len;\n  return (p + ((s - p) & ~1));\n}\n\nstatic int\nis_allowed_reverse_match(const UChar* s, const UChar* end ARG_UNUSED)\n{\n  const UChar c = *s;\n  if (c <= 0x7e || c == 0x8e || c == 0x8f)\n    return TRUE;\n  else\n    return FALSE;\n}\n\n\nstatic int PropertyInited = 0;\nstatic const OnigCodePoint** PropertyList;\nstatic int PropertyListNum;\nstatic int PropertyListSize;\nstatic hash_table_type* PropertyNameTable;\n\nstatic const OnigCodePoint CR_Hiragana[] = {\n  1,\n#ifdef ENC_EUC_JIS_2004\n  0xa4a1, 0xa4fb\n#else\n  0xa4a1, 0xa4f3\n#endif\n}; /* CR_Hiragana */\n\n#ifdef ENC_EUC_JIS_2004\nstatic const OnigCodePoint CR_Katakana[] = {\n  5,\n  0x8ea6, 0x8eaf,\t/* JIS X 0201 Katakana */\n  0x8eb1, 0x8edd,\t/* JIS X 0201 Katakana */\n  0xa5a1, 0xa5fe,\n  0xa6ee, 0xa6fe,\n  0xa7f2, 0xa7f5,\n}; /* CR_Katakana */\n#else\nstatic const OnigCodePoint CR_Katakana[] = {\n  3,\n  0x8ea6, 0x8eaf,\t/* JIS X 0201 Katakana */\n  0x8eb1, 0x8edd,\t/* JIS X 0201 Katakana */\n  0xa5a1, 0xa5f6,\n}; /* CR_Katakana */\n#endif\n\n#ifdef ENC_EUC_JIS_2004\nstatic const OnigCodePoint CR_Han[] = {\n  /* EUC-JIS-2004 (JIS X 0213:2004) */\n  7,\n  /* plane 1 */\n  0xa1b8, 0xa1b8,\n  0xaea1, 0xfefe,\t/* Kanji level 1, 2 and 3 */\n  /* plane 2 */\n  0x8fa1a1, 0x8fa1fe,\t/* row 1 */\n  0x8fa3a1, 0x8fa5fe,\t/* row 3 .. 5 */\n  0x8fa8a1, 0x8fa8fe,\t/* row 8 */\n  0x8faca1, 0x8faffe,\t/* row 12 .. 15 */\n  0x8feea1, 0x8ffef6,\t/* row 78 .. 94 */\n}; /* CR_Han */\n#else\nstatic const OnigCodePoint CR_Han[] = {\n  /* EUC-JP (JIS X 0208 based) */\n  4,\n  0xa1b8, 0xa1b8,\n  0xb0a1, 0xcfd3,\t/* Kanji level 1 */\n  0xd0a1, 0xf4a6,\t/* Kanji level 2 */\n  0x8fb0a1, 0x8fedf3\t/* JIS X 0212 Supplemental Kanji (row 16 .. 77) */\n}; /* CR_Han */\n#endif\n\nstatic const OnigCodePoint CR_Latin[] = {\n  4,\n  0x0041, 0x005a,\n  0x0061, 0x007a,\n  0xa3c1, 0xa3da,\n  0xa3e1, 0xa3fa,\n  /* TODO: add raw 8 .. 11 to support EUC-JIS-2004 */\n  /* TODO: add JIS X 0212 row 9 .. 11 */\n}; /* CR_Latin */\n\nstatic const OnigCodePoint CR_Greek[] = {\n  2,\n  0xa6a1, 0xa6b8,\n#ifdef ENC_EUC_JIS_2004\n  0xa6c1, 0xa6d9,\n#else\n  0xa6c1, 0xa6d8,\n  /* TODO: add JIS X 0212 row 6 */\n#endif\n}; /* CR_Greek */\n\nstatic const OnigCodePoint CR_Cyrillic[] = {\n  2,\n  0xa7a1, 0xa7c1,\n  0xa7d1, 0xa7f1,\n  /* TODO: add JIS X 0212 row 7 */\n}; /* CR_Cyrillic */\n\nstatic int\ninit_property_list(void)\n{\n  int r;\n\n  PROPERTY_LIST_ADD_PROP(\"hiragana\", CR_Hiragana);\n  PROPERTY_LIST_ADD_PROP(\"katakana\", CR_Katakana);\n  PROPERTY_LIST_ADD_PROP(\"han\", CR_Han);\n  PROPERTY_LIST_ADD_PROP(\"latin\", CR_Latin);\n  PROPERTY_LIST_ADD_PROP(\"greek\", CR_Greek);\n  PROPERTY_LIST_ADD_PROP(\"cyrillic\", CR_Cyrillic);\n  PropertyInited = 1;\n\n end:\n  return r;\n}\n\nstatic int\nproperty_name_to_ctype(OnigEncoding enc, UChar* p, UChar* end)\n{\n  hash_data_type ctype;\n  UChar *s, *e;\n\n  PROPERTY_LIST_INIT_CHECK;\n\n  s = e = xalloca(end - p + 1);\n  for (; p < end; p++) {\n    *e++ = ONIGENC_ASCII_CODE_TO_LOWER_CASE(*p);\n  }\n\n  if (onig_st_lookup_strend(PropertyNameTable, s, e, &ctype) == 0) {\n    return onigenc_minimum_property_name_to_ctype(enc, s, e);\n  }\n\n  return (int )ctype;\n}\n\nstatic int\nis_code_ctype(OnigCodePoint code, unsigned int ctype)\n{\n  if (ctype <= ONIGENC_MAX_STD_CTYPE) {\n    if (code < 128)\n      return ONIGENC_IS_ASCII_CODE_CTYPE(code, ctype);\n    else {\n      if (CTYPE_IS_WORD_GRAPH_PRINT(ctype)) {\n\treturn (code_to_mbclen(code) > 1 ? TRUE : FALSE);\n      }\n    }\n  }\n  else {\n    PROPERTY_LIST_INIT_CHECK;\n\n    ctype -= (ONIGENC_MAX_STD_CTYPE + 1);\n    if (ctype >= (unsigned int )PropertyListNum)\n      return ONIGERR_TYPE_BUG;\n\n    return onig_is_in_code_range((UChar* )PropertyList[ctype], code);\n  }\n\n  return FALSE;\n}\n\nstatic int\nget_ctype_code_range(OnigCtype ctype, OnigCodePoint* sb_out,\n\t\t     const OnigCodePoint* ranges[])\n{\n  if (ctype <= ONIGENC_MAX_STD_CTYPE) {\n    return ONIG_NO_SUPPORT_CONFIG;\n  }\n  else {\n    *sb_out = 0x80;\n\n    PROPERTY_LIST_INIT_CHECK;\n\n    ctype -= (ONIGENC_MAX_STD_CTYPE + 1);\n    if (ctype >= (OnigCtype )PropertyListNum)\n      return ONIGERR_TYPE_BUG;\n\n    *ranges = PropertyList[ctype];\n    return 0;\n  }\n}\n\n\nOnigEncodingType OnigEncodingEUC_JP = {\n  mbc_enc_len,\n  mbc_enc_len_se,\n  \"EUC-JP\",   /* name */\n  3,          /* max enc length */\n  1,          /* min enc length */\n  onigenc_is_mbc_newline_0x0a,\n  onigenc_is_mbc_newline_0x0a_se,\n  mbc_to_code,\n  mbc_to_code_se,\n  code_to_mbclen,\n  code_to_mbc,\n  mbc_case_fold,\n  mbc_case_fold_se,\n  apply_all_case_fold,\n  get_case_fold_codes_by_str,\n  property_name_to_ctype,\n  is_code_ctype,\n  get_ctype_code_range,\n  left_adjust_char_head,\n  left_adjust_char_head_se,\n  is_allowed_reverse_match,\n  ONIGENC_FLAG_NONE,\n};\n"
  },
  {
    "path": "src/Onigmo/enc/euc_kr.c",
    "content": "/**********************************************************************\n  euc_kr.c -  Oniguruma (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2007  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regenc.h\"\n\nstatic const int EncLen_EUCKR[] = {\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1\n};\n\nstatic int\neuckr_mbc_enc_len(const UChar* p)\n{\n  return EncLen_EUCKR[*p];\n}\n\nstatic int\neuckr_mbc_enc_len_se(OnigIterator* it, OnigPosition p)\n{\n  return EncLen_EUCKR[ONIG_CHARAT(p)];\n}\n\nstatic OnigCodePoint\neuckr_mbc_to_code(const UChar* p, const UChar* end)\n{\n  return onigenc_mbn_mbc_to_code(ONIG_ENCODING_EUC_KR, p, end);\n}\n\nstatic OnigCodePoint\neuckr_mbc_to_code_se(OnigIterator* it, OnigPosition p, OnigPosition end)\n{\n  return onigenc_mbn_mbc_to_code_se(it, ONIG_ENCODING_EUC_KR, p, end);\n}\n\nstatic int\neuckr_code_to_mbc(OnigCodePoint code, UChar *buf)\n{\n  return onigenc_mb2_code_to_mbc(ONIG_ENCODING_EUC_KR, code, buf);\n}\n\nstatic int\neuckr_mbc_case_fold(OnigCaseFoldType flag, const UChar** pp, const UChar* end,\n                    UChar* lower)\n{\n  return onigenc_mbn_mbc_case_fold(ONIG_ENCODING_EUC_KR, flag,\n                                   pp, end, lower);\n}\n\nstatic int\neuckr_mbc_case_fold_se(OnigIterator* it, OnigCaseFoldType flag, OnigPosition* pp, OnigPosition end,\n                    UChar* lower)\n{\n  return onigenc_mbn_mbc_case_fold_se(it, ONIG_ENCODING_EUC_KR, flag,\n                                   pp, end, lower);\n}\n\n#if 0\nstatic int\neuckr_is_mbc_ambiguous(OnigCaseFoldType flag,\n\t\t       const UChar** pp, const UChar* end)\n{\n  return onigenc_mbn_is_mbc_ambiguous(ONIG_ENCODING_EUC_KR, flag, pp, end);\n}\n#endif\n\nstatic int\neuckr_is_code_ctype(OnigCodePoint code, unsigned int ctype)\n{\n  return onigenc_mb2_is_code_ctype(ONIG_ENCODING_EUC_KR, code, ctype);\n}\n\n#define euckr_islead(c)    ((c) < 0xa1 || (c) == 0xff)\n\nstatic UChar*\neuckr_left_adjust_char_head(const UChar* start, const UChar* s)\n{\n  /* Assumed in this encoding,\n     mb-trail bytes don't mix with single bytes.\n  */\n  const UChar *p;\n  int len;\n\n  if (s <= start) return (UChar* )s;\n  p = s;\n\n  while (!euckr_islead(*p) && p > start) p--;\n  len = enclen(ONIG_ENCODING_EUC_KR, p);\n  if (p + len > s) return (UChar* )p;\n  p += len;\n  return (UChar* )(p + ((s - p) & ~1));\n}\n\nstatic OnigPosition\neuckr_left_adjust_char_head_se(OnigIterator* it, OnigPosition start, OnigPosition s)\n{\n  /* Assumed in this encoding,\n     mb-trail bytes don't mix with single bytes.\n  */\n  OnigPosition p;\n  int len;\n\n  if (s <= start) return s;\n  p = s;\n\n  while (!euckr_islead(ONIG_CHARAT(p)) && p > start) p--;\n  len = enclen_se(it, ONIG_ENCODING_EUC_KR, p);\n  if (p + len > s) return p;\n  p += len;\n  return (p + ((s - p) & ~1));\n}\n\nstatic int\neuckr_is_allowed_reverse_match(const UChar* s, const UChar* end ARG_UNUSED)\n{\n  const UChar c = *s;\n  if (c <= 0x7e) return TRUE;\n  else           return FALSE;\n}\n\nOnigEncodingType OnigEncodingEUC_KR = {\n  euckr_mbc_enc_len,\n  euckr_mbc_enc_len_se,\n  \"EUC-KR\",   /* name */\n  2,          /* max enc length */\n  1,          /* min enc length */\n  onigenc_is_mbc_newline_0x0a,\n  onigenc_is_mbc_newline_0x0a_se,\n  euckr_mbc_to_code,\n  euckr_mbc_to_code_se,\n  onigenc_mb2_code_to_mbclen,\n  euckr_code_to_mbc,\n  euckr_mbc_case_fold,\n  euckr_mbc_case_fold_se,\n  onigenc_ascii_apply_all_case_fold,\n  onigenc_ascii_get_case_fold_codes_by_str,\n  onigenc_minimum_property_name_to_ctype,\n  euckr_is_code_ctype,\n  onigenc_not_support_get_ctype_code_range,\n  euckr_left_adjust_char_head,\n  euckr_left_adjust_char_head_se,\n  euckr_is_allowed_reverse_match,\n  ONIGENC_FLAG_NONE,\n};\n\n/* Same with OnigEncodingEUC_KR except the name */\nOnigEncodingType OnigEncodingEUC_CN = {\n  euckr_mbc_enc_len,\n  euckr_mbc_enc_len_se,\n  \"EUC-CN\",   /* name */\n  2,          /* max enc length */\n  1,          /* min enc length */\n  onigenc_is_mbc_newline_0x0a,\n  onigenc_is_mbc_newline_0x0a_se,\n  euckr_mbc_to_code,\n  euckr_mbc_to_code_se,\n  onigenc_mb2_code_to_mbclen,\n  euckr_code_to_mbc,\n  euckr_mbc_case_fold,\n  euckr_mbc_case_fold_se,\n  onigenc_ascii_apply_all_case_fold,\n  onigenc_ascii_get_case_fold_codes_by_str,\n  onigenc_minimum_property_name_to_ctype,\n  euckr_is_code_ctype,\n  onigenc_not_support_get_ctype_code_range,\n  euckr_left_adjust_char_head,\n  euckr_left_adjust_char_head_se,\n  euckr_is_allowed_reverse_match,\n  ONIGENC_FLAG_NONE,\n};\n"
  },
  {
    "path": "src/Onigmo/enc/euc_tw.c",
    "content": "/**********************************************************************\n  euc_tw.c -  Oniguruma (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2008  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regenc.h\"\n\nstatic const int EncLen_EUCTW[] = {\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1\n};\n\nstatic int\neuctw_mbc_enc_len(const UChar* p)\n{\n  return EncLen_EUCTW[*p];\n}\n\nstatic int\neuctw_mbc_enc_len_se(OnigIterator* it, OnigPosition p)\n{\n  return EncLen_EUCTW[ONIG_CHARAT(p)];\n}\n\nstatic OnigCodePoint\neuctw_mbc_to_code(const UChar* p, const UChar* end)\n{\n  return onigenc_mbn_mbc_to_code(ONIG_ENCODING_EUC_TW, p, end);\n}\n\nstatic OnigCodePoint\neuctw_mbc_to_code_se(OnigIterator* it, OnigPosition p, OnigPosition end)\n{\n  return onigenc_mbn_mbc_to_code_se(it, ONIG_ENCODING_EUC_TW, p, end);\n}\n\nstatic int\neuctw_code_to_mbc(OnigCodePoint code, UChar *buf)\n{\n  return onigenc_mb4_code_to_mbc(ONIG_ENCODING_EUC_TW, code, buf);\n}\n\nstatic int\neuctw_mbc_case_fold(OnigCaseFoldType flag, const UChar** pp, const UChar* end,\n                    UChar* lower)\n{\n  return onigenc_mbn_mbc_case_fold(ONIG_ENCODING_EUC_TW, flag,\n                                   pp, end, lower);\n}\n\nstatic int\neuctw_mbc_case_fold_se(OnigIterator* it, OnigCaseFoldType flag, OnigPosition* pp, OnigPosition end,\n                    UChar* lower)\n{\n  return onigenc_mbn_mbc_case_fold_se(it, ONIG_ENCODING_EUC_TW, flag,\n                                   pp, end, lower);\n}\n\nstatic int\neuctw_is_code_ctype(OnigCodePoint code, unsigned int ctype)\n{\n  return onigenc_mb4_is_code_ctype(ONIG_ENCODING_EUC_TW, code, ctype);\n}\n\n#define euctw_islead(c)    ((UChar )((c) - 0xa1) > 0xfe - 0xa1)\n\nstatic UChar*\neuctw_left_adjust_char_head(const UChar* start, const UChar* s)\n{\n  /* Assumed in this encoding,\n     mb-trail bytes don't mix with single bytes.\n  */\n  const UChar *p;\n  int len;\n\n  if (s <= start) return (UChar* )s;\n  p = s;\n\n  while (!euctw_islead(*p) && p > start) p--;\n  len = enclen(ONIG_ENCODING_EUC_TW, p);\n  if (p + len > s) return (UChar* )p;\n  p += len;\n  return (UChar* )(p + ((s - p) & ~1));\n}\n\nstatic OnigPosition\neuctw_left_adjust_char_head_se(OnigIterator* it, OnigPosition start, OnigPosition s)\n{\n  /* Assumed in this encoding,\n     mb-trail bytes don't mix with single bytes.\n  */\n  OnigPosition p;\n  int len;\n\n  if (s <= start) return s;\n  p = s;\n\n  while (!euctw_islead(ONIG_CHARAT(p)) && p > start) p--;\n  len = enclen_se(it, ONIG_ENCODING_EUC_TW, p);\n  if (p + len > s) return p;\n  p += len;\n  return (p + ((s - p) & ~1));\n}\n\nstatic int\neuctw_is_allowed_reverse_match(const UChar* s, const UChar* end ARG_UNUSED)\n{\n  const UChar c = *s;\n  if (c <= 0x7e) return TRUE;\n  else           return FALSE;\n}\n\nOnigEncodingType OnigEncodingEUC_TW = {\n  euctw_mbc_enc_len,\n  euctw_mbc_enc_len_se,\n  \"EUC-TW\",   /* name */\n  4,          /* max enc length */\n  1,          /* min enc length */\n  onigenc_is_mbc_newline_0x0a,\n  onigenc_is_mbc_newline_0x0a_se,\n  euctw_mbc_to_code,\n  euctw_mbc_to_code_se,\n  onigenc_mb4_code_to_mbclen,\n  euctw_code_to_mbc,\n  euctw_mbc_case_fold,\n  euctw_mbc_case_fold_se,\n  onigenc_ascii_apply_all_case_fold,\n  onigenc_ascii_get_case_fold_codes_by_str,\n  onigenc_minimum_property_name_to_ctype,\n  euctw_is_code_ctype,\n  onigenc_not_support_get_ctype_code_range,\n  euctw_left_adjust_char_head,\n  euctw_left_adjust_char_head_se,\n  euctw_is_allowed_reverse_match,\n  ONIGENC_FLAG_NONE,\n};\n"
  },
  {
    "path": "src/Onigmo/enc/gb18030.c",
    "content": "/**********************************************************************\n  gb18030.c -  Oniguruma (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2005-2007  KUBO Takehiro <kubo AT jiubao DOT org>\n *                          K.Kosako <sndgk393 AT ybb DOT ne DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regenc.h\"\n\n#if 1\n#define DEBUG_GB18030(arg)\n#else\n#define DEBUG_GB18030(arg) printf arg\n#endif\n\nenum {\n  C1, /* one-byte char */\n  C2, /* one-byte or second of two-byte char */\n  C4, /* one-byte or second or fourth of four-byte char */\n  CM  /* first of two- or four-byte char or second of two-byte char */\n};\n\nstatic const char GB18030_MAP[] = {\n  C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1,\n  C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1,\n  C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1,\n  C4, C4, C4, C4, C4, C4, C4, C4, C4, C4, C1, C1, C1, C1, C1, C1,\n  C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2,\n  C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2,\n  C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2,\n  C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C2, C1,\n  C2, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM,\n  CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM,\n  CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM,\n  CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM,\n  CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM,\n  CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM,\n  CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM,\n  CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, CM, C1\n};\n\nstatic int\ngb18030_mbc_enc_len(const UChar* p)\n{\n  if (GB18030_MAP[*p] != CM)\n    return 1;\n  p++;\n  if (GB18030_MAP[*p] == C4)\n    return 4;\n  if (GB18030_MAP[*p] == C1)\n    return 1; /* illegal sequence */\n  return 2;\n}\n\nstatic int\ngb18030_mbc_enc_len_se(OnigIterator* it, OnigPosition p)\n{\n  UChar c0, c1;\n\n  c0 = ONIG_CHARAT(p);\n  if (GB18030_MAP[c0] != CM)\n    return 1;\n  c1 = ONIG_CHARAT(p+1);\n  if (GB18030_MAP[c1] == C4)\n    return 4;\n  if (GB18030_MAP[c1] == C1)\n    return 1; /* illegal sequence */\n  return 2;\n}\n\nstatic OnigCodePoint\ngb18030_mbc_to_code(const UChar* p, const UChar* end)\n{\n  return onigenc_mbn_mbc_to_code(ONIG_ENCODING_GB18030, p, end);\n}\n\nstatic OnigCodePoint\ngb18030_mbc_to_code_se(OnigIterator* it, OnigPosition p, OnigPosition end)\n{\n  return onigenc_mbn_mbc_to_code_se(it, ONIG_ENCODING_GB18030, p, end);\n}\n\nstatic int\ngb18030_code_to_mbc(OnigCodePoint code, UChar *buf)\n{\n  return onigenc_mb4_code_to_mbc(ONIG_ENCODING_GB18030, code, buf);\n}\n\nstatic int\ngb18030_mbc_case_fold(OnigCaseFoldType flag, const UChar** pp, const UChar* end,\n                      UChar* lower)\n{\n  return onigenc_mbn_mbc_case_fold(ONIG_ENCODING_GB18030, flag,\n                                   pp, end, lower);\n}\n\nstatic int\ngb18030_mbc_case_fold_se(OnigIterator* it, OnigCaseFoldType flag, OnigPosition* pp, OnigPosition end,\n                      UChar* lower)\n{\n  return onigenc_mbn_mbc_case_fold_se(it, ONIG_ENCODING_GB18030, flag,\n                                   pp, end, lower);\n}\n\n#if 0\nstatic int\ngb18030_is_mbc_ambiguous(OnigCaseFoldType flag,\n\t\t\t const UChar** pp, const UChar* end)\n{\n  return onigenc_mbn_is_mbc_ambiguous(ONIG_ENCODING_GB18030, flag, pp, end);\n}\n#endif\n\nstatic int\ngb18030_is_code_ctype(OnigCodePoint code, unsigned int ctype)\n{\n  return onigenc_mb4_is_code_ctype(ONIG_ENCODING_GB18030, code, ctype);\n}\n\nenum state {\n  S_START,\n  S_one_C2,\n  S_one_C4,\n  S_one_CM,\n\n  S_odd_CM_one_CX,\n  S_even_CM_one_CX,\n\n  /* CMC4 : pair of \"CM C4\" */\n  S_one_CMC4,\n  S_odd_CMC4,\n  S_one_C4_odd_CMC4,\n  S_even_CMC4,\n  S_one_C4_even_CMC4,\n\n  S_odd_CM_odd_CMC4,\n  S_even_CM_odd_CMC4,\n\n  S_odd_CM_even_CMC4,\n  S_even_CM_even_CMC4,\n\n  /* C4CM : pair of \"C4 CM\" */\n  S_odd_C4CM,\n  S_one_CM_odd_C4CM,\n  S_even_C4CM,\n  S_one_CM_even_C4CM,\n\n  S_even_CM_odd_C4CM,\n  S_odd_CM_odd_C4CM,\n  S_even_CM_even_C4CM,\n  S_odd_CM_even_C4CM,\n};\n\nstatic UChar*\ngb18030_left_adjust_char_head(const UChar* start, const UChar* s)\n{\n  const UChar *p;\n  enum state state = S_START;\n\n  DEBUG_GB18030((\"----------------\\n\"));\n  for (p = s; p >= start; p--) {\n    DEBUG_GB18030((\"state %d --(%02x)-->\\n\", state, *p));\n    switch (state) {\n    case S_START:\n      switch (GB18030_MAP[*p]) {\n      case C1:\n\treturn (UChar *)s;\n      case C2:\n\tstate = S_one_C2; /* C2 */\n\tbreak;\n      case C4:\n\tstate = S_one_C4; /* C4 */\n\tbreak;\n      case CM:\n\tstate = S_one_CM; /* CM */\n\tbreak;\n      }\n      break;\n    case S_one_C2: /* C2 */\n      switch (GB18030_MAP[*p]) {\n      case C1:\n      case C2:\n      case C4:\n\treturn (UChar *)s;\n      case CM:\n\tstate = S_odd_CM_one_CX; /* CM C2 */\n\tbreak;\n      }\n      break;\n    case S_one_C4: /* C4 */\n      switch (GB18030_MAP[*p]) {\n      case C1:\n      case C2:\n      case C4:\n\treturn (UChar *)s;\n      case CM:\n\tstate = S_one_CMC4;\n\tbreak;\n      }\n      break;\n    case S_one_CM: /* CM */\n      switch (GB18030_MAP[*p]) {\n      case C1:\n      case C2:\n\treturn (UChar *)s;\n      case C4:\n\tstate = S_odd_C4CM;\n\tbreak;\n      case CM:\n\tstate = S_odd_CM_one_CX; /* CM CM */\n\tbreak;\n      }\n      break;\n\n    case S_odd_CM_one_CX: /* CM C2 */ /* CM CM */ /* CM CM CM C4 */\n      switch (GB18030_MAP[*p]) {\n      case C1:\n      case C2:\n      case C4:\n\treturn (UChar *)(s - 1);\n      case CM:\n\tstate = S_even_CM_one_CX;\n\tbreak;\n      }\n      break;\n    case S_even_CM_one_CX: /* CM CM C2 */ /* CM CM CM */ /* CM CM C4 */\n      switch (GB18030_MAP[*p]) {\n      case C1:\n      case C2:\n      case C4:\n\treturn (UChar *)s;\n      case CM:\n\tstate = S_odd_CM_one_CX;\n\tbreak;\n      }\n      break;\n\n    case S_one_CMC4: /* CM C4 */\n      switch (GB18030_MAP[*p]) {\n      case C1:\n      case C2:\n\treturn (UChar *)(s - 1);\n      case C4:\n\tstate = S_one_C4_odd_CMC4; /* C4 CM C4 */\n\tbreak;\n      case CM:\n\tstate = S_even_CM_one_CX; /* CM CM C4 */\n\tbreak;\n      }\n      break;\n    case S_odd_CMC4: /* CM C4 CM C4 CM C4 */\n      switch (GB18030_MAP[*p]) {\n      case C1:\n      case C2:\n\treturn (UChar *)(s - 1);\n      case C4:\n\tstate = S_one_C4_odd_CMC4;\n\tbreak;\n      case CM:\n\tstate = S_odd_CM_odd_CMC4;\n\tbreak;\n      }\n      break;\n    case S_one_C4_odd_CMC4: /* C4 CM C4 */\n      switch (GB18030_MAP[*p]) {\n      case C1:\n      case C2:\n      case C4:\n\treturn (UChar *)(s - 1);\n      case CM:\n\tstate = S_even_CMC4; /* CM C4 CM C4 */\n\tbreak;\n      }\n      break;\n    case S_even_CMC4: /* CM C4 CM C4 */\n      switch (GB18030_MAP[*p]) {\n      case C1:\n      case C2:\n\treturn (UChar *)(s - 3);\n      case C4:\n\tstate = S_one_C4_even_CMC4;\n\tbreak;\n      case CM:\n\tstate = S_odd_CM_even_CMC4;\n\tbreak;\n      }\n      break;\n    case S_one_C4_even_CMC4: /* C4 CM C4 CM C4 */\n      switch (GB18030_MAP[*p]) {\n      case C1:\n      case C2:\n      case C4:\n\treturn (UChar *)(s - 3);\n      case CM:\n\tstate = S_odd_CMC4;\n\tbreak;\n      }\n      break;\n\n    case S_odd_CM_odd_CMC4: /* CM CM C4 CM C4 CM C4 */\n      switch (GB18030_MAP[*p]) {\n      case C1:\n      case C2:\n      case C4:\n\treturn (UChar *)(s - 3);\n      case CM:\n\tstate = S_even_CM_odd_CMC4;\n\tbreak;\n      }\n      break;\n    case S_even_CM_odd_CMC4: /* CM CM CM C4 CM C4 CM C4 */\n      switch (GB18030_MAP[*p]) {\n      case C1:\n      case C2:\n      case C4:\n\treturn (UChar *)(s - 1);\n      case CM:\n\tstate = S_odd_CM_odd_CMC4;\n\tbreak;\n      }\n      break;\n\n    case S_odd_CM_even_CMC4: /* CM CM C4 CM C4 */\n      switch (GB18030_MAP[*p]) {\n      case C1:\n      case C2:\n      case C4:\n\treturn (UChar *)(s - 1);\n      case CM:\n\tstate = S_even_CM_even_CMC4;\n\tbreak;\n      }\n      break;\n    case S_even_CM_even_CMC4: /* CM CM CM C4 CM C4 */\n      switch (GB18030_MAP[*p]) {\n      case C1:\n      case C2:\n      case C4:\n\treturn (UChar *)(s - 3);\n      case CM:\n\tstate = S_odd_CM_even_CMC4;\n\tbreak;\n      }\n      break;\n\n    case S_odd_C4CM: /* C4 CM */  /* C4 CM C4 CM C4 CM*/\n      switch (GB18030_MAP[*p]) {\n      case C1:\n      case C2:\n      case C4:\n\treturn (UChar *)s;\n      case CM:\n\tstate = S_one_CM_odd_C4CM; /* CM C4 CM */\n\tbreak;\n      }\n      break;\n    case S_one_CM_odd_C4CM: /* CM C4 CM */ /* CM C4 CM C4 CM C4 CM */\n      switch (GB18030_MAP[*p]) {\n      case C1:\n      case C2:\n\treturn (UChar *)(s - 2); /* |CM C4 CM */\n      case C4:\n\tstate = S_even_C4CM;\n\tbreak;\n      case CM:\n\tstate = S_even_CM_odd_C4CM;\n\tbreak;\n      }\n      break;\n    case S_even_C4CM: /* C4 CM C4 CM */\n      switch (GB18030_MAP[*p]) {\n      case C1:\n      case C2:\n      case C4:\n\treturn (UChar *)(s - 2);  /* C4|CM C4 CM */\n      case CM:\n\tstate = S_one_CM_even_C4CM;\n\tbreak;\n      }\n      break;\n    case S_one_CM_even_C4CM: /* CM C4 CM C4 CM */\n      switch (GB18030_MAP[*p]) {\n      case C1:\n      case C2:\n\treturn (UChar *)(s - 0);  /*|CM C4 CM C4|CM */\n      case C4:\n\tstate = S_odd_C4CM;\n\tbreak;\n      case CM:\n\tstate = S_even_CM_even_C4CM;\n\tbreak;\n      }\n      break;\n\n    case S_even_CM_odd_C4CM: /* CM CM C4 CM */\n      switch (GB18030_MAP[*p]) {\n      case C1:\n      case C2:\n      case C4:\n\treturn (UChar *)(s - 0); /* |CM CM|C4|CM */\n      case CM:\n\tstate = S_odd_CM_odd_C4CM;\n\tbreak;\n      }\n      break;\n    case S_odd_CM_odd_C4CM: /* CM CM CM C4 CM */\n      switch (GB18030_MAP[*p]) {\n      case C1:\n      case C2:\n      case C4:\n\treturn (UChar *)(s - 2); /* |CM CM|CM C4 CM */\n      case CM:\n\tstate = S_even_CM_odd_C4CM;\n\tbreak;\n      }\n      break;\n\n    case S_even_CM_even_C4CM: /* CM CM C4 CM C4 CM */\n      switch (GB18030_MAP[*p]) {\n      case C1:\n      case C2:\n      case C4:\n\treturn (UChar *)(s - 2); /* |CM CM|C4|CM C4 CM */\n      case CM:\n\tstate = S_odd_CM_even_C4CM;\n\tbreak;\n      }\n      break;\n    case S_odd_CM_even_C4CM: /* CM CM CM C4 CM C4 CM */\n      switch (GB18030_MAP[*p]) {\n      case C1:\n      case C2:\n      case C4:\n\treturn (UChar *)(s - 0);  /* |CM CM|CM C4 CM C4|CM */\n      case CM:\n\tstate = S_even_CM_even_C4CM;\n\tbreak;\n      }\n      break;\n    }\n  }\n\n  DEBUG_GB18030((\"state %d\\n\", state));\n  switch (state) {\n  case S_START:             return (UChar *)(s - 0);\n  case S_one_C2:            return (UChar *)(s - 0);\n  case S_one_C4:            return (UChar *)(s - 0);\n  case S_one_CM:            return (UChar *)(s - 0);\n\n  case S_odd_CM_one_CX:     return (UChar *)(s - 1);\n  case S_even_CM_one_CX:    return (UChar *)(s - 0);\n\n  case S_one_CMC4:          return (UChar *)(s - 1);\n  case S_odd_CMC4:          return (UChar *)(s - 1);\n  case S_one_C4_odd_CMC4:   return (UChar *)(s - 1);\n  case S_even_CMC4:         return (UChar *)(s - 3);\n  case S_one_C4_even_CMC4:  return (UChar *)(s - 3);\n\n  case S_odd_CM_odd_CMC4:   return (UChar *)(s - 3);\n  case S_even_CM_odd_CMC4:  return (UChar *)(s - 1);\n\n  case S_odd_CM_even_CMC4:  return (UChar *)(s - 1);\n  case S_even_CM_even_CMC4: return (UChar *)(s - 3);\n\n  case S_odd_C4CM:          return (UChar *)(s - 0);\n  case S_one_CM_odd_C4CM:   return (UChar *)(s - 2);\n  case S_even_C4CM:         return (UChar *)(s - 2);\n  case S_one_CM_even_C4CM:  return (UChar *)(s - 0);\n\n  case S_even_CM_odd_C4CM:  return (UChar *)(s - 0);\n  case S_odd_CM_odd_C4CM:   return (UChar *)(s - 2);\n  case S_even_CM_even_C4CM: return (UChar *)(s - 2);\n  case S_odd_CM_even_C4CM:  return (UChar *)(s - 0);\n  }\n\n  return (UChar* )s;  /* never come here. (escape warning) */\n}\n\nstatic OnigPosition\ngb18030_left_adjust_char_head_se(OnigIterator* it, OnigPosition start, OnigPosition s)\n{\n  OnigPosition p;\n  UChar c;\n  enum state state = S_START;\n\n  DEBUG_GB18030((\"----------------\\n\"));\n  for (p = s; p >= start; p--) {\n    c = ONIG_CHARAT(p);\n    DEBUG_GB18030((\"state %d --(%02x)-->\\n\", state, c));\n    switch (state) {\n    case S_START:\n      switch (GB18030_MAP[c]) {\n      case C1:\n\treturn s;\n      case C2:\n\tstate = S_one_C2; /* C2 */\n\tbreak;\n      case C4:\n\tstate = S_one_C4; /* C4 */\n\tbreak;\n      case CM:\n\tstate = S_one_CM; /* CM */\n\tbreak;\n      }\n      break;\n    case S_one_C2: /* C2 */\n      switch (GB18030_MAP[c]) {\n      case C1:\n      case C2:\n      case C4:\n\treturn s;\n      case CM:\n\tstate = S_odd_CM_one_CX; /* CM C2 */\n\tbreak;\n      }\n      break;\n    case S_one_C4: /* C4 */\n      switch (GB18030_MAP[c]) {\n      case C1:\n      case C2:\n      case C4:\n\treturn s;\n      case CM:\n\tstate = S_one_CMC4;\n\tbreak;\n      }\n      break;\n    case S_one_CM: /* CM */\n      switch (GB18030_MAP[c]) {\n      case C1:\n      case C2:\n\treturn s;\n      case C4:\n\tstate = S_odd_C4CM;\n\tbreak;\n      case CM:\n\tstate = S_odd_CM_one_CX; /* CM CM */\n\tbreak;\n      }\n      break;\n\n    case S_odd_CM_one_CX: /* CM C2 */ /* CM CM */ /* CM CM CM C4 */\n      switch (GB18030_MAP[c]) {\n      case C1:\n      case C2:\n      case C4:\n\treturn (s - 1);\n      case CM:\n\tstate = S_even_CM_one_CX;\n\tbreak;\n      }\n      break;\n    case S_even_CM_one_CX: /* CM CM C2 */ /* CM CM CM */ /* CM CM C4 */\n      switch (GB18030_MAP[c]) {\n      case C1:\n      case C2:\n      case C4:\n\treturn s;\n      case CM:\n\tstate = S_odd_CM_one_CX;\n\tbreak;\n      }\n      break;\n\n    case S_one_CMC4: /* CM C4 */\n      switch (GB18030_MAP[c]) {\n      case C1:\n      case C2:\n\treturn (s - 1);\n      case C4:\n\tstate = S_one_C4_odd_CMC4; /* C4 CM C4 */\n\tbreak;\n      case CM:\n\tstate = S_even_CM_one_CX; /* CM CM C4 */\n\tbreak;\n      }\n      break;\n    case S_odd_CMC4: /* CM C4 CM C4 CM C4 */\n      switch (GB18030_MAP[c]) {\n      case C1:\n      case C2:\n\treturn (s - 1);\n      case C4:\n\tstate = S_one_C4_odd_CMC4;\n\tbreak;\n      case CM:\n\tstate = S_odd_CM_odd_CMC4;\n\tbreak;\n      }\n      break;\n    case S_one_C4_odd_CMC4: /* C4 CM C4 */\n      switch (GB18030_MAP[c]) {\n      case C1:\n      case C2:\n      case C4:\n\treturn (s - 1);\n      case CM:\n\tstate = S_even_CMC4; /* CM C4 CM C4 */\n\tbreak;\n      }\n      break;\n    case S_even_CMC4: /* CM C4 CM C4 */\n      switch (GB18030_MAP[c]) {\n      case C1:\n      case C2:\n\treturn (s - 3);\n      case C4:\n\tstate = S_one_C4_even_CMC4;\n\tbreak;\n      case CM:\n\tstate = S_odd_CM_even_CMC4;\n\tbreak;\n      }\n      break;\n    case S_one_C4_even_CMC4: /* C4 CM C4 CM C4 */\n      switch (GB18030_MAP[c]) {\n      case C1:\n      case C2:\n      case C4:\n\treturn (s - 3);\n      case CM:\n\tstate = S_odd_CMC4;\n\tbreak;\n      }\n      break;\n\n    case S_odd_CM_odd_CMC4: /* CM CM C4 CM C4 CM C4 */\n      switch (GB18030_MAP[c]) {\n      case C1:\n      case C2:\n      case C4:\n\treturn (s - 3);\n      case CM:\n\tstate = S_even_CM_odd_CMC4;\n\tbreak;\n      }\n      break;\n    case S_even_CM_odd_CMC4: /* CM CM CM C4 CM C4 CM C4 */\n      switch (GB18030_MAP[c]) {\n      case C1:\n      case C2:\n      case C4:\n\treturn (s - 1);\n      case CM:\n\tstate = S_odd_CM_odd_CMC4;\n\tbreak;\n      }\n      break;\n\n    case S_odd_CM_even_CMC4: /* CM CM C4 CM C4 */\n      switch (GB18030_MAP[c]) {\n      case C1:\n      case C2:\n      case C4:\n\treturn (s - 1);\n      case CM:\n\tstate = S_even_CM_even_CMC4;\n\tbreak;\n      }\n      break;\n    case S_even_CM_even_CMC4: /* CM CM CM C4 CM C4 */\n      switch (GB18030_MAP[c]) {\n      case C1:\n      case C2:\n      case C4:\n\treturn (s - 3);\n      case CM:\n\tstate = S_odd_CM_even_CMC4;\n\tbreak;\n      }\n      break;\n\n    case S_odd_C4CM: /* C4 CM */  /* C4 CM C4 CM C4 CM*/\n      switch (GB18030_MAP[c]) {\n      case C1:\n      case C2:\n      case C4:\n\treturn s;\n      case CM:\n\tstate = S_one_CM_odd_C4CM; /* CM C4 CM */\n\tbreak;\n      }\n      break;\n    case S_one_CM_odd_C4CM: /* CM C4 CM */ /* CM C4 CM C4 CM C4 CM */\n      switch (GB18030_MAP[c]) {\n      case C1:\n      case C2:\n\treturn (s - 2); /* |CM C4 CM */\n      case C4:\n\tstate = S_even_C4CM;\n\tbreak;\n      case CM:\n\tstate = S_even_CM_odd_C4CM;\n\tbreak;\n      }\n      break;\n    case S_even_C4CM: /* C4 CM C4 CM */\n      switch (GB18030_MAP[c]) {\n      case C1:\n      case C2:\n      case C4:\n\treturn (s - 2);  /* C4|CM C4 CM */\n      case CM:\n\tstate = S_one_CM_even_C4CM;\n\tbreak;\n      }\n      break;\n    case S_one_CM_even_C4CM: /* CM C4 CM C4 CM */\n      switch (GB18030_MAP[c]) {\n      case C1:\n      case C2:\n\treturn (s - 0);  /*|CM C4 CM C4|CM */\n      case C4:\n\tstate = S_odd_C4CM;\n\tbreak;\n      case CM:\n\tstate = S_even_CM_even_C4CM;\n\tbreak;\n      }\n      break;\n\n    case S_even_CM_odd_C4CM: /* CM CM C4 CM */\n      switch (GB18030_MAP[c]) {\n      case C1:\n      case C2:\n      case C4:\n\treturn (s - 0); /* |CM CM|C4|CM */\n      case CM:\n\tstate = S_odd_CM_odd_C4CM;\n\tbreak;\n      }\n      break;\n    case S_odd_CM_odd_C4CM: /* CM CM CM C4 CM */\n      switch (GB18030_MAP[c]) {\n      case C1:\n      case C2:\n      case C4:\n\treturn (s - 2); /* |CM CM|CM C4 CM */\n      case CM:\n\tstate = S_even_CM_odd_C4CM;\n\tbreak;\n      }\n      break;\n\n    case S_even_CM_even_C4CM: /* CM CM C4 CM C4 CM */\n      switch (GB18030_MAP[c]) {\n      case C1:\n      case C2:\n      case C4:\n\treturn (s - 2); /* |CM CM|C4|CM C4 CM */\n      case CM:\n\tstate = S_odd_CM_even_C4CM;\n\tbreak;\n      }\n      break;\n    case S_odd_CM_even_C4CM: /* CM CM CM C4 CM C4 CM */\n      switch (GB18030_MAP[c]) {\n      case C1:\n      case C2:\n      case C4:\n\treturn (s - 0);  /* |CM CM|CM C4 CM C4|CM */\n      case CM:\n\tstate = S_even_CM_even_C4CM;\n\tbreak;\n      }\n      break;\n    }\n  }\n\n  DEBUG_GB18030((\"state %d\\n\", state));\n  switch (state) {\n  case S_START:             return (s - 0);\n  case S_one_C2:            return (s - 0);\n  case S_one_C4:            return (s - 0);\n  case S_one_CM:            return (s - 0);\n\n  case S_odd_CM_one_CX:     return (s - 1);\n  case S_even_CM_one_CX:    return (s - 0);\n\n  case S_one_CMC4:          return (s - 1);\n  case S_odd_CMC4:          return (s - 1);\n  case S_one_C4_odd_CMC4:   return (s - 1);\n  case S_even_CMC4:         return (s - 3);\n  case S_one_C4_even_CMC4:  return (s - 3);\n\n  case S_odd_CM_odd_CMC4:   return (s - 3);\n  case S_even_CM_odd_CMC4:  return (s - 1);\n\n  case S_odd_CM_even_CMC4:  return (s - 1);\n  case S_even_CM_even_CMC4: return (s - 3);\n\n  case S_odd_C4CM:          return (s - 0);\n  case S_one_CM_odd_C4CM:   return (s - 2);\n  case S_even_C4CM:         return (s - 2);\n  case S_one_CM_even_C4CM:  return (s - 0);\n\n  case S_even_CM_odd_C4CM:  return (s - 0);\n  case S_odd_CM_odd_C4CM:   return (s - 2);\n  case S_even_CM_even_C4CM: return (s - 2);\n  case S_odd_CM_even_C4CM:  return (s - 0);\n  }\n\n  return s;  /* never come here. (escape warning) */\n}\n\nstatic int\ngb18030_is_allowed_reverse_match(const UChar* s, const UChar* end ARG_UNUSED)\n{\n  return GB18030_MAP[*s] == C1 ? TRUE : FALSE;\n}\n\nOnigEncodingType OnigEncodingGB18030 = {\n  gb18030_mbc_enc_len,\n  gb18030_mbc_enc_len_se,\n  \"GB18030\",   /* name */\n  4,          /* max enc length */\n  1,          /* min enc length */\n  onigenc_is_mbc_newline_0x0a,\n  onigenc_is_mbc_newline_0x0a_se,\n  gb18030_mbc_to_code,\n  gb18030_mbc_to_code_se,\n  onigenc_mb4_code_to_mbclen,\n  gb18030_code_to_mbc,\n  gb18030_mbc_case_fold,\n  gb18030_mbc_case_fold_se,\n  onigenc_ascii_apply_all_case_fold,\n  onigenc_ascii_get_case_fold_codes_by_str,\n  onigenc_minimum_property_name_to_ctype,\n  gb18030_is_code_ctype,\n  onigenc_not_support_get_ctype_code_range,\n  gb18030_left_adjust_char_head,\n  gb18030_left_adjust_char_head_se,\n  gb18030_is_allowed_reverse_match,\n  ONIGENC_FLAG_NONE,\n};\n"
  },
  {
    "path": "src/Onigmo/enc/iso8859_1.c",
    "content": "/**********************************************************************\n  iso8859_1.c -  Oniguruma (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2007  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regenc.h\"\n\n#define ENC_IS_ISO_8859_1_CTYPE(code,ctype) \\\n  ((EncISO_8859_1_CtypeTable[code] & CTYPE_TO_BIT(ctype)) != 0)\n\nstatic const unsigned short EncISO_8859_1_CtypeTable[256] = {\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x420c, 0x4209, 0x4208, 0x4208, 0x4208, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4284, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0,\n  0x78b0, 0x78b0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x51a0,\n  0x41a0, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x4008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0284, 0x01a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0,\n  0x00a0, 0x00a0, 0x30e2, 0x01a0, 0x00a0, 0x01a0, 0x00a0, 0x00a0,\n  0x00a0, 0x00a0, 0x10a0, 0x10a0, 0x00a0, 0x30e2, 0x00a0, 0x01a0,\n  0x00a0, 0x10a0, 0x30e2, 0x01a0, 0x10a0, 0x10a0, 0x10a0, 0x01a0,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x00a0,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x00a0,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2\n};\n\nstatic const OnigPairCaseFoldCodes CaseFoldMap[] = {\n  { 0xc0, 0xe0 },\n  { 0xc1, 0xe1 },\n  { 0xc2, 0xe2 },\n  { 0xc3, 0xe3 },\n  { 0xc4, 0xe4 },\n  { 0xc5, 0xe5 },\n  { 0xc6, 0xe6 },\n  { 0xc7, 0xe7 },\n  { 0xc8, 0xe8 },\n  { 0xc9, 0xe9 },\n  { 0xca, 0xea },\n  { 0xcb, 0xeb },\n  { 0xcc, 0xec },\n  { 0xcd, 0xed },\n  { 0xce, 0xee },\n  { 0xcf, 0xef },\n\n  { 0xd0, 0xf0 },\n  { 0xd1, 0xf1 },\n  { 0xd2, 0xf2 },\n  { 0xd3, 0xf3 },\n  { 0xd4, 0xf4 },\n  { 0xd5, 0xf5 },\n  { 0xd6, 0xf6 },\n  { 0xd8, 0xf8 },\n  { 0xd9, 0xf9 },\n  { 0xda, 0xfa },\n  { 0xdb, 0xfb },\n  { 0xdc, 0xfc },\n  { 0xdd, 0xfd },\n  { 0xde, 0xfe }\n};\n\nstatic int\napply_all_case_fold(OnigCaseFoldType flag,\n\t\t    OnigApplyAllCaseFoldFunc f, void* arg)\n{\n  return onigenc_apply_all_case_fold_with_map(\n            sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,\n            flag, f, arg);\n}\n\nstatic int\nget_case_fold_codes_by_str(OnigCaseFoldType flag ARG_UNUSED,\n\t\t\t   const OnigUChar* p, const OnigUChar* end,\n\t\t\t   OnigCaseFoldCodeItem items[])\n{\n  if (0x41 <= *p && *p <= 0x5a) {\n    items[0].byte_len = 1;\n    items[0].code_len = 1;\n    items[0].code[0] = (OnigCodePoint )(*p + 0x20);\n    if (*p == 0x53 && end > p + 1\n\t&& (*(p+1) == 0x53 || *(p+1) == 0x73)) { /* SS */\n      items[1].byte_len = 2;\n      items[1].code_len = 1;\n      items[1].code[0] = (OnigCodePoint )0xdf;\n      return 2;\n    }\n    else\n      return 1;\n  }\n  else if (0x61 <= *p && *p <= 0x7a) {\n    items[0].byte_len = 1;\n    items[0].code_len = 1;\n    items[0].code[0] = (OnigCodePoint )(*p - 0x20);\n    if (*p == 0x73 && end > p + 1\n\t&& (*(p+1) == 0x73 || *(p+1) == 0x53)) { /* ss */\n      items[1].byte_len = 2;\n      items[1].code_len = 1;\n      items[1].code[0] = (OnigCodePoint )0xdf;\n      return 2;\n    }\n    else\n      return 1;\n  }\n  else if (0xc0 <= *p && *p <= 0xcf) {\n    items[0].byte_len = 1;\n    items[0].code_len = 1;\n    items[0].code[0] = (OnigCodePoint )(*p + 0x20);\n    return 1;\n  }\n  else if (0xd0 <= *p && *p <= 0xdf) {\n    if (*p == 0xdf) {\n      items[0].byte_len = 1;\n      items[0].code_len = 2;\n      items[0].code[0] = (OnigCodePoint )'s';\n      items[0].code[1] = (OnigCodePoint )'s';\n\n      items[1].byte_len = 1;\n      items[1].code_len = 2;\n      items[1].code[0] = (OnigCodePoint )'S';\n      items[1].code[1] = (OnigCodePoint )'S';\n\n      items[2].byte_len = 1;\n      items[2].code_len = 2;\n      items[2].code[0] = (OnigCodePoint )'s';\n      items[2].code[1] = (OnigCodePoint )'S';\n\n      items[3].byte_len = 1;\n      items[3].code_len = 2;\n      items[3].code[0] = (OnigCodePoint )'S';\n      items[3].code[1] = (OnigCodePoint )'s';\n\n      return 4;\n    }\n    else if (*p != 0xd7) {\n      items[0].byte_len = 1;\n      items[0].code_len = 1;\n      items[0].code[0] = (OnigCodePoint )(*p + 0x20);\n      return 1;\n    }\n  }\n  else if (0xe0 <= *p && *p <= 0xef) {\n    items[0].byte_len = 1;\n    items[0].code_len = 1;\n    items[0].code[0] = (OnigCodePoint )(*p - 0x20);\n    return 1;\n  }\n  else if (0xf0 <= *p && *p <= 0xfe) {\n    if (*p != 0xf7) {\n      items[0].byte_len = 1;\n      items[0].code_len = 1;\n      items[0].code[0] = (OnigCodePoint )(*p - 0x20);\n      return 1;\n    }\n  }\n\n  return 0;\n}\n\nstatic int\nmbc_case_fold(OnigCaseFoldType flag, const UChar** pp,\n\t      const UChar* end ARG_UNUSED, UChar* lower)\n{\n  const UChar* p = *pp;\n\n  if (*p == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n    *lower++ = 's';\n    *lower   = 's';\n    (*pp)++;\n    return 2;\n  }\n\n  *lower = ONIGENC_ISO_8859_1_TO_LOWER_CASE(*p);\n  (*pp)++;\n  return 1;\n}\n\nstatic int\nmbc_case_fold_se(OnigIterator* it, OnigCaseFoldType flag, OnigPosition* pp,\n\t      OnigPosition end ARG_UNUSED, UChar* lower)\n{\n  const UChar c = ONIG_CHARAT(*pp);\n\n  if (c == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n    *lower++ = 's';\n    *lower   = 's';\n    (*pp)++;\n    return 2;\n  }\n\n  *lower = ONIGENC_ISO_8859_1_TO_LOWER_CASE(c);\n  (*pp)++;\n  return 1;\n}\n\n#if 0\nstatic int\nis_mbc_ambiguous(OnigCaseFoldType flag,\n\t\t const UChar** pp, const UChar* end)\n{\n  int v;\n  const UChar* p = *pp;\n\n  if (*p == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n    (*pp)++;\n    return TRUE;\n  }\n\n  (*pp)++;\n  v = (EncISO_8859_1_CtypeTable[*p] & (BIT_CTYPE_UPPER | BIT_CTYPE_LOWER));\n  if ((v | BIT_CTYPE_LOWER) != 0) {\n    /* 0xdf, 0xaa, 0xb5, 0xba are lower case letter, but can't convert. */\n    if (*p >= 0xaa && *p <= 0xba)\n      return FALSE;\n    else\n      return TRUE;\n  }\n\n  return (v != 0 ? TRUE : FALSE);\n}\n#endif\n\nstatic int\nis_code_ctype(OnigCodePoint code, unsigned int ctype)\n{\n  if (code < 256)\n    return ENC_IS_ISO_8859_1_CTYPE(code, ctype);\n  else\n    return FALSE;\n}\n\nOnigEncodingType OnigEncodingISO_8859_1 = {\n  onigenc_single_byte_mbc_enc_len,\n  onigenc_single_byte_mbc_enc_len_se,\n  \"ISO-8859-1\",  /* name */\n  1,             /* max enc length */\n  1,             /* min enc length */\n  onigenc_is_mbc_newline_0x0a,\n  onigenc_is_mbc_newline_0x0a_se,\n  onigenc_single_byte_mbc_to_code,\n  onigenc_single_byte_mbc_to_code_se,\n  onigenc_single_byte_code_to_mbclen,\n  onigenc_single_byte_code_to_mbc,\n  mbc_case_fold,\n  mbc_case_fold_se,\n  apply_all_case_fold,\n  get_case_fold_codes_by_str,\n  onigenc_minimum_property_name_to_ctype,\n  is_code_ctype,\n  onigenc_not_support_get_ctype_code_range,\n  onigenc_single_byte_left_adjust_char_head,\n  onigenc_single_byte_left_adjust_char_head_se,\n  onigenc_always_true_is_allowed_reverse_match,\n  ONIGENC_FLAG_NONE,\n};\n"
  },
  {
    "path": "src/Onigmo/enc/iso8859_10.c",
    "content": "/**********************************************************************\n  iso8859_10.c -  Oniguruma (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2007  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regenc.h\"\n\n#define ENC_ISO_8859_10_TO_LOWER_CASE(c) EncISO_8859_10_ToLowerCaseTable[c]\n#define ENC_IS_ISO_8859_10_CTYPE(code,ctype) \\\n  ((EncISO_8859_10_CtypeTable[code] & CTYPE_TO_BIT(ctype)) != 0)\n\nstatic const UChar EncISO_8859_10_ToLowerCaseTable[256] = {\n  '\\000', '\\001', '\\002', '\\003', '\\004', '\\005', '\\006', '\\007',\n  '\\010', '\\011', '\\012', '\\013', '\\014', '\\015', '\\016', '\\017',\n  '\\020', '\\021', '\\022', '\\023', '\\024', '\\025', '\\026', '\\027',\n  '\\030', '\\031', '\\032', '\\033', '\\034', '\\035', '\\036', '\\037',\n  '\\040', '\\041', '\\042', '\\043', '\\044', '\\045', '\\046', '\\047',\n  '\\050', '\\051', '\\052', '\\053', '\\054', '\\055', '\\056', '\\057',\n  '\\060', '\\061', '\\062', '\\063', '\\064', '\\065', '\\066', '\\067',\n  '\\070', '\\071', '\\072', '\\073', '\\074', '\\075', '\\076', '\\077',\n  '\\100', '\\141', '\\142', '\\143', '\\144', '\\145', '\\146', '\\147',\n  '\\150', '\\151', '\\152', '\\153', '\\154', '\\155', '\\156', '\\157',\n  '\\160', '\\161', '\\162', '\\163', '\\164', '\\165', '\\166', '\\167',\n  '\\170', '\\171', '\\172', '\\133', '\\134', '\\135', '\\136', '\\137',\n  '\\140', '\\141', '\\142', '\\143', '\\144', '\\145', '\\146', '\\147',\n  '\\150', '\\151', '\\152', '\\153', '\\154', '\\155', '\\156', '\\157',\n  '\\160', '\\161', '\\162', '\\163', '\\164', '\\165', '\\166', '\\167',\n  '\\170', '\\171', '\\172', '\\173', '\\174', '\\175', '\\176', '\\177',\n  '\\200', '\\201', '\\202', '\\203', '\\204', '\\205', '\\206', '\\207',\n  '\\210', '\\211', '\\212', '\\213', '\\214', '\\215', '\\216', '\\217',\n  '\\220', '\\221', '\\222', '\\223', '\\224', '\\225', '\\226', '\\227',\n  '\\230', '\\231', '\\232', '\\233', '\\234', '\\235', '\\236', '\\237',\n  '\\240', '\\261', '\\262', '\\263', '\\264', '\\265', '\\266', '\\247',\n  '\\270', '\\271', '\\272', '\\273', '\\274', '\\255', '\\276', '\\277',\n  '\\260', '\\261', '\\262', '\\263', '\\264', '\\265', '\\266', '\\267',\n  '\\270', '\\271', '\\272', '\\273', '\\274', '\\275', '\\276', '\\277',\n  '\\340', '\\341', '\\342', '\\343', '\\344', '\\345', '\\346', '\\347',\n  '\\350', '\\351', '\\352', '\\353', '\\354', '\\355', '\\356', '\\357',\n  '\\360', '\\361', '\\362', '\\363', '\\364', '\\365', '\\366', '\\367',\n  '\\370', '\\371', '\\372', '\\373', '\\374', '\\375', '\\376', '\\337',\n  '\\340', '\\341', '\\342', '\\343', '\\344', '\\345', '\\346', '\\347',\n  '\\350', '\\351', '\\352', '\\353', '\\354', '\\355', '\\356', '\\357',\n  '\\360', '\\361', '\\362', '\\363', '\\364', '\\365', '\\366', '\\367',\n  '\\370', '\\371', '\\372', '\\373', '\\374', '\\375', '\\376', '\\377'\n};\n\nstatic const unsigned short EncISO_8859_10_CtypeTable[256] = {\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x420c, 0x4209, 0x4208, 0x4208, 0x4208, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4284, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0,\n  0x78b0, 0x78b0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x51a0,\n  0x41a0, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x4008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0284, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x00a0,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x01a0, 0x34a2, 0x34a2,\n  0x00a0, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x01a0,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x01a0, 0x30e2, 0x30e2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2\n};\n\nstatic int\nmbc_case_fold(OnigCaseFoldType flag,\n\t      const UChar** pp, const UChar* end ARG_UNUSED, UChar* lower)\n{\n  const UChar* p = *pp;\n\n  if (*p == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n    *lower++ = 's';\n    *lower   = 's';\n    (*pp)++;\n    return 2;\n  }\n\n  *lower = ENC_ISO_8859_10_TO_LOWER_CASE(*p);\n  (*pp)++;\n  return 1;\n}\n\nstatic int\nmbc_case_fold_se(OnigIterator* it, OnigCaseFoldType flag,\n\t      OnigPosition* pp, OnigPosition end ARG_UNUSED, UChar* lower)\n{\n  const UChar c = ONIG_CHARAT(*pp);\n\n  if (c == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n    *lower++ = 's';\n    *lower   = 's';\n    (*pp)++;\n    return 2;\n  }\n\n  *lower = ENC_ISO_8859_10_TO_LOWER_CASE(c);\n  (*pp)++;\n  return 1;\n}\n\n#if 0\nstatic int\nis_mbc_ambiguous(OnigCaseFoldType flag, const UChar** pp, const UChar* end)\n{\n  int v;\n  const UChar* p = *pp;\n\n  if (*p == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n    (*pp)++;\n    return TRUE;\n  }\n\n  (*pp)++;\n  v = (EncISO_8859_10_CtypeTable[*p] & (BIT_CTYPE_UPPER | BIT_CTYPE_LOWER));\n  if ((v | BIT_CTYPE_LOWER) != 0) {\n    return TRUE;\n  }\n\n  return (v != 0 ? TRUE : FALSE);\n}\n#endif\n\nstatic int\nis_code_ctype(OnigCodePoint code, unsigned int ctype)\n{\n  if (code < 256)\n    return ENC_IS_ISO_8859_10_CTYPE(code, ctype);\n  else\n    return FALSE;\n}\n\nstatic const OnigPairCaseFoldCodes CaseFoldMap[] = {\n { 0xa1, 0xb1 },\n { 0xa2, 0xb2 },\n { 0xa3, 0xb3 },\n { 0xa4, 0xb4 },\n { 0xa5, 0xb5 },\n { 0xa6, 0xb6 },\n { 0xa8, 0xb8 },\n { 0xa9, 0xb9 },\n { 0xaa, 0xba },\n { 0xab, 0xbb },\n { 0xac, 0xbc },\n { 0xae, 0xbe },\n { 0xaf, 0xbf },\n\n { 0xc0, 0xe0 },\n { 0xc1, 0xe1 },\n { 0xc2, 0xe2 },\n { 0xc3, 0xe3 },\n { 0xc4, 0xe4 },\n { 0xc5, 0xe5 },\n { 0xc6, 0xe6 },\n { 0xc7, 0xe7 },\n { 0xc8, 0xe8 },\n { 0xc9, 0xe9 },\n { 0xca, 0xea },\n { 0xcb, 0xeb },\n { 0xcc, 0xec },\n { 0xcd, 0xed },\n { 0xce, 0xee },\n { 0xcf, 0xef },\n\n { 0xd0, 0xf0 },\n { 0xd1, 0xf1 },\n { 0xd2, 0xf2 },\n { 0xd3, 0xf3 },\n { 0xd4, 0xf4 },\n { 0xd5, 0xf5 },\n { 0xd6, 0xf6 },\n { 0xd7, 0xf7 },\n { 0xd8, 0xf8 },\n { 0xd9, 0xf9 },\n { 0xda, 0xfa },\n { 0xdb, 0xfb },\n { 0xdc, 0xfc },\n { 0xdd, 0xfd },\n { 0xde, 0xfe }\n};\n\nstatic int\napply_all_case_fold(OnigCaseFoldType flag,\n\t\t    OnigApplyAllCaseFoldFunc f, void* arg)\n{\n  return onigenc_apply_all_case_fold_with_map(\n             sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,\n             flag, f, arg);\n}\n\nstatic int\nget_case_fold_codes_by_str(OnigCaseFoldType flag,\n    const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem items[])\n{\n  return onigenc_get_case_fold_codes_by_str_with_map(\n\t     sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,\n\t     flag, p, end, items);\n}\n\nOnigEncodingType OnigEncodingISO_8859_10 = {\n  onigenc_single_byte_mbc_enc_len,\n  onigenc_single_byte_mbc_enc_len_se,\n  \"ISO-8859-10\", /* name */\n  1,             /* max enc length */\n  1,             /* min enc length */\n  onigenc_is_mbc_newline_0x0a,\n  onigenc_is_mbc_newline_0x0a_se,\n  onigenc_single_byte_mbc_to_code,\n  onigenc_single_byte_mbc_to_code_se,\n  onigenc_single_byte_code_to_mbclen,\n  onigenc_single_byte_code_to_mbc,\n  mbc_case_fold,\n  mbc_case_fold_se,\n  apply_all_case_fold,\n  get_case_fold_codes_by_str,\n  onigenc_minimum_property_name_to_ctype,\n  is_code_ctype,\n  onigenc_not_support_get_ctype_code_range,\n  onigenc_single_byte_left_adjust_char_head,\n  onigenc_single_byte_left_adjust_char_head_se,\n  onigenc_always_true_is_allowed_reverse_match,\n  ONIGENC_FLAG_NONE,\n};\n"
  },
  {
    "path": "src/Onigmo/enc/iso8859_11.c",
    "content": "/**********************************************************************\n  iso8859_11.c -  Oniguruma (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2007  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regenc.h\"\n\n#define ENC_IS_ISO_8859_11_CTYPE(code,ctype) \\\n  ((EncISO_8859_11_CtypeTable[code] & CTYPE_TO_BIT(ctype)) != 0)\n\nstatic const unsigned short EncISO_8859_11_CtypeTable[256] = {\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x420c, 0x4209, 0x4208, 0x4208, 0x4208, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4284, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0,\n  0x78b0, 0x78b0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x51a0,\n  0x41a0, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x4008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0284, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2,\n  0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2,\n  0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2,\n  0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2,\n  0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2,\n  0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2,\n  0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2,\n  0x30a2, 0x30a2, 0x30a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x30a2,\n  0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2,\n  0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2,\n  0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2,\n  0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x0000, 0x0000, 0x0000, 0x0000\n};\n\nstatic int\nis_code_ctype(OnigCodePoint code, unsigned int ctype)\n{\n  if (code < 256)\n    return ENC_IS_ISO_8859_11_CTYPE(code, ctype);\n  else\n    return FALSE;\n}\n\nOnigEncodingType OnigEncodingISO_8859_11 = {\n  onigenc_single_byte_mbc_enc_len,\n  onigenc_single_byte_mbc_enc_len_se,\n  \"ISO-8859-11\",  /* name */\n  1,             /* max enc length */\n  1,             /* min enc length */\n  onigenc_is_mbc_newline_0x0a,\n  onigenc_is_mbc_newline_0x0a_se,\n  onigenc_single_byte_mbc_to_code,\n  onigenc_single_byte_mbc_to_code_se,\n  onigenc_single_byte_code_to_mbclen,\n  onigenc_single_byte_code_to_mbc,\n  onigenc_ascii_mbc_case_fold,\n  onigenc_ascii_mbc_case_fold_se,\n  onigenc_ascii_apply_all_case_fold,\n  onigenc_ascii_get_case_fold_codes_by_str,\n  onigenc_minimum_property_name_to_ctype,\n  is_code_ctype,\n  onigenc_not_support_get_ctype_code_range,\n  onigenc_single_byte_left_adjust_char_head,\n  onigenc_single_byte_left_adjust_char_head_se,\n  onigenc_always_true_is_allowed_reverse_match,\n  ONIGENC_FLAG_NONE,\n};\n"
  },
  {
    "path": "src/Onigmo/enc/iso8859_13.c",
    "content": "/**********************************************************************\n  iso8859_13.c -  Oniguruma (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2007  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regenc.h\"\n\n#define ENC_ISO_8859_13_TO_LOWER_CASE(c) EncISO_8859_13_ToLowerCaseTable[c]\n#define ENC_IS_ISO_8859_13_CTYPE(code,ctype) \\\n  ((EncISO_8859_13_CtypeTable[code] & CTYPE_TO_BIT(ctype)) != 0)\n\nstatic const UChar EncISO_8859_13_ToLowerCaseTable[256] = {\n  '\\000', '\\001', '\\002', '\\003', '\\004', '\\005', '\\006', '\\007',\n  '\\010', '\\011', '\\012', '\\013', '\\014', '\\015', '\\016', '\\017',\n  '\\020', '\\021', '\\022', '\\023', '\\024', '\\025', '\\026', '\\027',\n  '\\030', '\\031', '\\032', '\\033', '\\034', '\\035', '\\036', '\\037',\n  '\\040', '\\041', '\\042', '\\043', '\\044', '\\045', '\\046', '\\047',\n  '\\050', '\\051', '\\052', '\\053', '\\054', '\\055', '\\056', '\\057',\n  '\\060', '\\061', '\\062', '\\063', '\\064', '\\065', '\\066', '\\067',\n  '\\070', '\\071', '\\072', '\\073', '\\074', '\\075', '\\076', '\\077',\n  '\\100', '\\141', '\\142', '\\143', '\\144', '\\145', '\\146', '\\147',\n  '\\150', '\\151', '\\152', '\\153', '\\154', '\\155', '\\156', '\\157',\n  '\\160', '\\161', '\\162', '\\163', '\\164', '\\165', '\\166', '\\167',\n  '\\170', '\\171', '\\172', '\\133', '\\134', '\\135', '\\136', '\\137',\n  '\\140', '\\141', '\\142', '\\143', '\\144', '\\145', '\\146', '\\147',\n  '\\150', '\\151', '\\152', '\\153', '\\154', '\\155', '\\156', '\\157',\n  '\\160', '\\161', '\\162', '\\163', '\\164', '\\165', '\\166', '\\167',\n  '\\170', '\\171', '\\172', '\\173', '\\174', '\\175', '\\176', '\\177',\n  '\\200', '\\201', '\\202', '\\203', '\\204', '\\205', '\\206', '\\207',\n  '\\210', '\\211', '\\212', '\\213', '\\214', '\\215', '\\216', '\\217',\n  '\\220', '\\221', '\\222', '\\223', '\\224', '\\225', '\\226', '\\227',\n  '\\230', '\\231', '\\232', '\\233', '\\234', '\\235', '\\236', '\\237',\n  '\\240', '\\241', '\\242', '\\243', '\\244', '\\245', '\\246', '\\247',\n  '\\270', '\\251', '\\272', '\\253', '\\254', '\\255', '\\256', '\\277',\n  '\\260', '\\261', '\\262', '\\263', '\\264', '\\265', '\\266', '\\267',\n  '\\270', '\\271', '\\272', '\\273', '\\274', '\\275', '\\276', '\\277',\n  '\\340', '\\341', '\\342', '\\343', '\\344', '\\345', '\\346', '\\347',\n  '\\350', '\\351', '\\352', '\\353', '\\354', '\\355', '\\356', '\\357',\n  '\\360', '\\361', '\\362', '\\363', '\\364', '\\365', '\\366', '\\327',\n  '\\370', '\\371', '\\372', '\\373', '\\374', '\\375', '\\376', '\\337',\n  '\\340', '\\341', '\\342', '\\343', '\\344', '\\345', '\\346', '\\347',\n  '\\350', '\\351', '\\352', '\\353', '\\354', '\\355', '\\356', '\\357',\n  '\\360', '\\361', '\\362', '\\363', '\\364', '\\365', '\\366', '\\367',\n  '\\370', '\\371', '\\372', '\\373', '\\374', '\\375', '\\376', '\\377'\n};\n\nstatic const unsigned short EncISO_8859_13_CtypeTable[256] = {\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x420c, 0x4209, 0x4208, 0x4208, 0x4208, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4284, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0,\n  0x78b0, 0x78b0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x51a0,\n  0x41a0, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x4008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0284, 0x01a0, 0x00a0, 0x00a0, 0x00a0, 0x01a0, 0x00a0, 0x00a0,\n  0x34a2, 0x00a0, 0x34a2, 0x01a0, 0x00a0, 0x01a0, 0x00a0, 0x34a2,\n  0x00a0, 0x00a0, 0x10a0, 0x10a0, 0x01a0, 0x30e2, 0x00a0, 0x01a0,\n  0x30e2, 0x10a0, 0x30e2, 0x01a0, 0x10a0, 0x10a0, 0x10a0, 0x30e2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x00a0,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x00a0,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x01a0\n};\n\nstatic int\nmbc_case_fold(OnigCaseFoldType flag,\n\t      const UChar** pp, const UChar* end ARG_UNUSED, UChar* lower)\n{\n  const UChar* p = *pp;\n\n  if (*p == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n    *lower++ = 's';\n    *lower   = 's';\n    (*pp)++;\n    return 2;\n  }\n\n  *lower = ENC_ISO_8859_13_TO_LOWER_CASE(*p);\n  (*pp)++;\n  return 1;\n}\n\nstatic int\nmbc_case_fold_se(OnigIterator* it, OnigCaseFoldType flag,\n\t      OnigPosition* pp, OnigPosition end ARG_UNUSED, UChar* lower)\n{\n  const UChar c = ONIG_CHARAT(*pp);\n\n  if (c == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n    *lower++ = 's';\n    *lower   = 's';\n    (*pp)++;\n    return 2;\n  }\n\n  *lower = ENC_ISO_8859_13_TO_LOWER_CASE(c);\n  (*pp)++;\n  return 1;\n}\n\n#if 0\nstatic int\nis_mbc_ambiguous(OnigCaseFoldType flag, const UChar** pp, const UChar* end)\n{\n  int v;\n  const UChar* p = *pp;\n\n  if (*p == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n    (*pp)++;\n    return TRUE;\n  }\n\n  (*pp)++;\n  v = (EncISO_8859_13_CtypeTable[*p] & (BIT_CTYPE_UPPER | BIT_CTYPE_LOWER));\n  if ((v | BIT_CTYPE_LOWER) != 0) {\n    /* 0xdf, 0xb5 are lower case letter, but can't convert. */\n    if (*p == 0xb5)\n      return FALSE;\n    else\n      return TRUE;\n  }\n\n  return (v != 0 ? TRUE : FALSE);\n}\n#endif\n\nstatic int\nis_code_ctype(OnigCodePoint code, unsigned int ctype)\n{\n  if (code < 256)\n    return ENC_IS_ISO_8859_13_CTYPE(code, ctype);\n  else\n    return FALSE;\n}\n\nstatic const OnigPairCaseFoldCodes CaseFoldMap[] = {\n { 0xc0, 0xe0 },\n { 0xc1, 0xe1 },\n { 0xc2, 0xe2 },\n { 0xc3, 0xe3 },\n { 0xc4, 0xe4 },\n { 0xc5, 0xe5 },\n { 0xc6, 0xe6 },\n { 0xc7, 0xe7 },\n { 0xc8, 0xe8 },\n { 0xc9, 0xe9 },\n { 0xca, 0xea },\n { 0xcb, 0xeb },\n { 0xcc, 0xec },\n { 0xcd, 0xed },\n { 0xce, 0xee },\n { 0xcf, 0xef },\n\n { 0xd0, 0xf0 },\n { 0xd1, 0xf1 },\n { 0xd2, 0xf2 },\n { 0xd3, 0xf3 },\n { 0xd4, 0xf4 },\n { 0xd5, 0xf5 },\n { 0xd6, 0xf6 },\n { 0xd8, 0xf8 },\n { 0xd9, 0xf9 },\n { 0xda, 0xfa },\n { 0xdb, 0xfb },\n { 0xdc, 0xfc },\n { 0xdd, 0xfd },\n { 0xde, 0xfe }\n};\n\nstatic int\napply_all_case_fold(OnigCaseFoldType flag,\n\t\t    OnigApplyAllCaseFoldFunc f, void* arg)\n{\n  return onigenc_apply_all_case_fold_with_map(\n             sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,\n             flag, f, arg);\n}\n\nstatic int\nget_case_fold_codes_by_str(OnigCaseFoldType flag,\n   const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem items[])\n{\n  return onigenc_get_case_fold_codes_by_str_with_map(\n\t     sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,\n\t     flag, p, end, items);\n}\n\nOnigEncodingType OnigEncodingISO_8859_13 = {\n  onigenc_single_byte_mbc_enc_len,\n  onigenc_single_byte_mbc_enc_len_se,\n  \"ISO-8859-13\",  /* name */\n  1,             /* max enc length */\n  1,             /* min enc length */\n  onigenc_is_mbc_newline_0x0a,\n  onigenc_is_mbc_newline_0x0a_se,\n  onigenc_single_byte_mbc_to_code,\n  onigenc_single_byte_mbc_to_code_se,\n  onigenc_single_byte_code_to_mbclen,\n  onigenc_single_byte_code_to_mbc,\n  mbc_case_fold,\n  mbc_case_fold_se,\n  apply_all_case_fold,\n  get_case_fold_codes_by_str,\n  onigenc_minimum_property_name_to_ctype,\n  is_code_ctype,\n  onigenc_not_support_get_ctype_code_range,\n  onigenc_single_byte_left_adjust_char_head,\n  onigenc_single_byte_left_adjust_char_head_se,\n  onigenc_always_true_is_allowed_reverse_match,\n  ONIGENC_FLAG_NONE,\n};\n"
  },
  {
    "path": "src/Onigmo/enc/iso8859_14.c",
    "content": "/**********************************************************************\n  iso8859_14.c -  Oniguruma (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2007  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regenc.h\"\n\n#define ENC_ISO_8859_14_TO_LOWER_CASE(c) EncISO_8859_14_ToLowerCaseTable[c]\n#define ENC_IS_ISO_8859_14_CTYPE(code,ctype) \\\n  ((EncISO_8859_14_CtypeTable[code] & CTYPE_TO_BIT(ctype)) != 0)\n\nstatic const UChar EncISO_8859_14_ToLowerCaseTable[256] = {\n  '\\000', '\\001', '\\002', '\\003', '\\004', '\\005', '\\006', '\\007',\n  '\\010', '\\011', '\\012', '\\013', '\\014', '\\015', '\\016', '\\017',\n  '\\020', '\\021', '\\022', '\\023', '\\024', '\\025', '\\026', '\\027',\n  '\\030', '\\031', '\\032', '\\033', '\\034', '\\035', '\\036', '\\037',\n  '\\040', '\\041', '\\042', '\\043', '\\044', '\\045', '\\046', '\\047',\n  '\\050', '\\051', '\\052', '\\053', '\\054', '\\055', '\\056', '\\057',\n  '\\060', '\\061', '\\062', '\\063', '\\064', '\\065', '\\066', '\\067',\n  '\\070', '\\071', '\\072', '\\073', '\\074', '\\075', '\\076', '\\077',\n  '\\100', '\\141', '\\142', '\\143', '\\144', '\\145', '\\146', '\\147',\n  '\\150', '\\151', '\\152', '\\153', '\\154', '\\155', '\\156', '\\157',\n  '\\160', '\\161', '\\162', '\\163', '\\164', '\\165', '\\166', '\\167',\n  '\\170', '\\171', '\\172', '\\133', '\\134', '\\135', '\\136', '\\137',\n  '\\140', '\\141', '\\142', '\\143', '\\144', '\\145', '\\146', '\\147',\n  '\\150', '\\151', '\\152', '\\153', '\\154', '\\155', '\\156', '\\157',\n  '\\160', '\\161', '\\162', '\\163', '\\164', '\\165', '\\166', '\\167',\n  '\\170', '\\171', '\\172', '\\173', '\\174', '\\175', '\\176', '\\177',\n  '\\200', '\\201', '\\202', '\\203', '\\204', '\\205', '\\206', '\\207',\n  '\\210', '\\211', '\\212', '\\213', '\\214', '\\215', '\\216', '\\217',\n  '\\220', '\\221', '\\222', '\\223', '\\224', '\\225', '\\226', '\\227',\n  '\\230', '\\231', '\\232', '\\233', '\\234', '\\235', '\\236', '\\237',\n  '\\240', '\\242', '\\242', '\\243', '\\245', '\\245', '\\253', '\\247',\n  '\\270', '\\251', '\\272', '\\253', '\\274', '\\255', '\\256', '\\377',\n  '\\261', '\\261', '\\263', '\\263', '\\265', '\\265', '\\266', '\\271',\n  '\\270', '\\271', '\\272', '\\277', '\\274', '\\276', '\\276', '\\277',\n  '\\340', '\\341', '\\342', '\\343', '\\344', '\\345', '\\346', '\\347',\n  '\\350', '\\351', '\\352', '\\353', '\\354', '\\355', '\\356', '\\357',\n  '\\360', '\\361', '\\362', '\\363', '\\364', '\\365', '\\366', '\\367',\n  '\\370', '\\371', '\\372', '\\373', '\\374', '\\375', '\\376', '\\337',\n  '\\340', '\\341', '\\342', '\\343', '\\344', '\\345', '\\346', '\\347',\n  '\\350', '\\351', '\\352', '\\353', '\\354', '\\355', '\\356', '\\357',\n  '\\360', '\\361', '\\362', '\\363', '\\364', '\\365', '\\366', '\\367',\n  '\\370', '\\371', '\\372', '\\373', '\\374', '\\375', '\\376', '\\377'\n};\n\nstatic const unsigned short EncISO_8859_14_CtypeTable[256] = {\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x420c, 0x4209, 0x4208, 0x4208, 0x4208, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4284, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0,\n  0x78b0, 0x78b0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x51a0,\n  0x41a0, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x4008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0284, 0x34a2, 0x30e2, 0x00a0, 0x34a2, 0x30e2, 0x34a2, 0x00a0,\n  0x34a2, 0x00a0, 0x34a2, 0x30e2, 0x34a2, 0x01a0, 0x00a0, 0x34a2,\n  0x34a2, 0x30e2, 0x34a2, 0x30e2, 0x34a2, 0x30e2, 0x00a0, 0x34a2,\n  0x30e2, 0x30e2, 0x30e2, 0x34a2, 0x30e2, 0x34a2, 0x30e2, 0x30e2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2\n};\n\nstatic int\nmbc_case_fold(OnigCaseFoldType flag,\n\t      const UChar** pp, const UChar* end ARG_UNUSED, UChar* lower)\n{\n  const UChar* p = *pp;\n\n  if (*p == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n    *lower++ = 's';\n    *lower   = 's';\n    (*pp)++;\n    return 2;\n  }\n\n  *lower = ENC_ISO_8859_14_TO_LOWER_CASE(*p);\n  (*pp)++;\n  return 1; /* return byte length of converted char to lower */\n}\n\nstatic int\nmbc_case_fold_se(OnigIterator* it, OnigCaseFoldType flag,\n\t      OnigPosition* pp, OnigPosition end ARG_UNUSED, UChar* lower)\n{\n  const UChar c = ONIG_CHARAT(*pp);\n\n  if (c == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n    *lower++ = 's';\n    *lower   = 's';\n    (*pp)++;\n    return 2;\n  }\n\n  *lower = ENC_ISO_8859_14_TO_LOWER_CASE(c);\n  (*pp)++;\n  return 1; /* return byte length of converted char to lower */\n}\n\n#if 0\nstatic int\nis_mbc_ambiguous(OnigCaseFoldType flag,\n\t\t const UChar** pp, const UChar* end)\n{\n  int v;\n  const UChar* p = *pp;\n\n  if (*p == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n    (*pp)++;\n    return TRUE;\n  }\n\n  (*pp)++;\n  v = (EncISO_8859_14_CtypeTable[*p] & (BIT_CTYPE_UPPER | BIT_CTYPE_LOWER));\n  if ((v | BIT_CTYPE_LOWER) != 0) {\n    return TRUE;\n  }\n\n  return (v != 0 ? TRUE : FALSE);\n}\n#endif\n\nstatic int\nis_code_ctype(OnigCodePoint code, unsigned int ctype)\n{\n  if (code < 256)\n    return ENC_IS_ISO_8859_14_CTYPE(code, ctype);\n  else\n    return FALSE;\n}\n\nstatic const OnigPairCaseFoldCodes CaseFoldMap[] = {\n { 0xa1, 0xa2 },\n { 0xa4, 0xa5 },\n { 0xa6, 0xab },\n { 0xa8, 0xb8 },\n { 0xaa, 0xba },\n { 0xac, 0xbc },\n { 0xaf, 0xff },\n\n { 0xb0, 0xb1 },\n { 0xb2, 0xb3 },\n { 0xb4, 0xb5 },\n { 0xb7, 0xb9 },\n { 0xbb, 0xbf },\n { 0xbd, 0xbe },\n\n { 0xc0, 0xe0 },\n { 0xc1, 0xe1 },\n { 0xc2, 0xe2 },\n { 0xc3, 0xe3 },\n { 0xc4, 0xe4 },\n { 0xc5, 0xe5 },\n { 0xc6, 0xe6 },\n { 0xc7, 0xe7 },\n { 0xc8, 0xe8 },\n { 0xc9, 0xe9 },\n { 0xca, 0xea },\n { 0xcb, 0xeb },\n { 0xcc, 0xec },\n { 0xcd, 0xed },\n { 0xce, 0xee },\n { 0xcf, 0xef },\n\n { 0xd0, 0xf0 },\n { 0xd1, 0xf1 },\n { 0xd2, 0xf2 },\n { 0xd3, 0xf3 },\n { 0xd4, 0xf4 },\n { 0xd5, 0xf5 },\n { 0xd6, 0xf6 },\n { 0xd7, 0xf7 },\n { 0xd8, 0xf8 },\n { 0xd9, 0xf9 },\n { 0xda, 0xfa },\n { 0xdb, 0xfb },\n { 0xdc, 0xfc },\n { 0xdd, 0xfd },\n { 0xde, 0xfe }\n};\n\nstatic int\napply_all_case_fold(OnigCaseFoldType flag,\n\t\t    OnigApplyAllCaseFoldFunc f, void* arg)\n{\n  return onigenc_apply_all_case_fold_with_map(\n             sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,\n             flag, f, arg);\n}\n\nstatic int\nget_case_fold_codes_by_str(OnigCaseFoldType flag,\n    const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem items[])\n{\n  return onigenc_get_case_fold_codes_by_str_with_map(\n\t     sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,\n\t     flag, p, end, items);\n}\n\nOnigEncodingType OnigEncodingISO_8859_14 = {\n  onigenc_single_byte_mbc_enc_len,\n  onigenc_single_byte_mbc_enc_len_se,\n  \"ISO-8859-14\",  /* name */\n  1,             /* max enc length */\n  1,             /* min enc length */\n  onigenc_is_mbc_newline_0x0a,\n  onigenc_is_mbc_newline_0x0a_se,\n  onigenc_single_byte_mbc_to_code,\n  onigenc_single_byte_mbc_to_code_se,\n  onigenc_single_byte_code_to_mbclen,\n  onigenc_single_byte_code_to_mbc,\n  mbc_case_fold,\n  mbc_case_fold_se,\n  apply_all_case_fold,\n  get_case_fold_codes_by_str,\n  onigenc_minimum_property_name_to_ctype,\n  is_code_ctype,\n  onigenc_not_support_get_ctype_code_range,\n  onigenc_single_byte_left_adjust_char_head,\n  onigenc_single_byte_left_adjust_char_head_se,\n  onigenc_always_true_is_allowed_reverse_match,\n  ONIGENC_FLAG_NONE,\n};\n"
  },
  {
    "path": "src/Onigmo/enc/iso8859_15.c",
    "content": "/**********************************************************************\n  iso8859_15.c -  Oniguruma (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2007  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regenc.h\"\n\n#define ENC_ISO_8859_15_TO_LOWER_CASE(c) EncISO_8859_15_ToLowerCaseTable[c]\n#define ENC_IS_ISO_8859_15_CTYPE(code,ctype) \\\n  ((EncISO_8859_15_CtypeTable[code] & CTYPE_TO_BIT(ctype)) != 0)\n\nstatic const UChar EncISO_8859_15_ToLowerCaseTable[256] = {\n  '\\000', '\\001', '\\002', '\\003', '\\004', '\\005', '\\006', '\\007',\n  '\\010', '\\011', '\\012', '\\013', '\\014', '\\015', '\\016', '\\017',\n  '\\020', '\\021', '\\022', '\\023', '\\024', '\\025', '\\026', '\\027',\n  '\\030', '\\031', '\\032', '\\033', '\\034', '\\035', '\\036', '\\037',\n  '\\040', '\\041', '\\042', '\\043', '\\044', '\\045', '\\046', '\\047',\n  '\\050', '\\051', '\\052', '\\053', '\\054', '\\055', '\\056', '\\057',\n  '\\060', '\\061', '\\062', '\\063', '\\064', '\\065', '\\066', '\\067',\n  '\\070', '\\071', '\\072', '\\073', '\\074', '\\075', '\\076', '\\077',\n  '\\100', '\\141', '\\142', '\\143', '\\144', '\\145', '\\146', '\\147',\n  '\\150', '\\151', '\\152', '\\153', '\\154', '\\155', '\\156', '\\157',\n  '\\160', '\\161', '\\162', '\\163', '\\164', '\\165', '\\166', '\\167',\n  '\\170', '\\171', '\\172', '\\133', '\\134', '\\135', '\\136', '\\137',\n  '\\140', '\\141', '\\142', '\\143', '\\144', '\\145', '\\146', '\\147',\n  '\\150', '\\151', '\\152', '\\153', '\\154', '\\155', '\\156', '\\157',\n  '\\160', '\\161', '\\162', '\\163', '\\164', '\\165', '\\166', '\\167',\n  '\\170', '\\171', '\\172', '\\173', '\\174', '\\175', '\\176', '\\177',\n  '\\200', '\\201', '\\202', '\\203', '\\204', '\\205', '\\206', '\\207',\n  '\\210', '\\211', '\\212', '\\213', '\\214', '\\215', '\\216', '\\217',\n  '\\220', '\\221', '\\222', '\\223', '\\224', '\\225', '\\226', '\\227',\n  '\\230', '\\231', '\\232', '\\233', '\\234', '\\235', '\\236', '\\237',\n  '\\240', '\\241', '\\242', '\\243', '\\244', '\\245', '\\250', '\\247',\n  '\\250', '\\251', '\\252', '\\253', '\\254', '\\255', '\\256', '\\257',\n  '\\260', '\\261', '\\262', '\\263', '\\270', '\\265', '\\266', '\\267',\n  '\\270', '\\271', '\\272', '\\273', '\\275', '\\275', '\\377', '\\277',\n  '\\340', '\\341', '\\342', '\\343', '\\344', '\\345', '\\346', '\\347',\n  '\\350', '\\351', '\\352', '\\353', '\\354', '\\355', '\\356', '\\357',\n  '\\360', '\\361', '\\362', '\\363', '\\364', '\\365', '\\366', '\\327',\n  '\\370', '\\371', '\\372', '\\373', '\\374', '\\375', '\\376', '\\337',\n  '\\340', '\\341', '\\342', '\\343', '\\344', '\\345', '\\346', '\\347',\n  '\\350', '\\351', '\\352', '\\353', '\\354', '\\355', '\\356', '\\357',\n  '\\360', '\\361', '\\362', '\\363', '\\364', '\\365', '\\366', '\\367',\n  '\\370', '\\371', '\\372', '\\373', '\\374', '\\375', '\\376', '\\377'\n};\n\nstatic const unsigned short EncISO_8859_15_CtypeTable[256] = {\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x420c, 0x4209, 0x4208, 0x4208, 0x4208, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4284, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0,\n  0x78b0, 0x78b0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x51a0,\n  0x41a0, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x4008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0284, 0x01a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x34a2, 0x00a0,\n  0x30e2, 0x00a0, 0x30e2, 0x01a0, 0x00a0, 0x01a0, 0x00a0, 0x00a0,\n  0x00a0, 0x00a0, 0x10a0, 0x10a0, 0x34a2, 0x30e2, 0x00a0, 0x01a0,\n  0x30e2, 0x10a0, 0x30e2, 0x01a0, 0x34a2, 0x30e2, 0x34a2, 0x01a0,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x00a0,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x00a0,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2\n};\n\nstatic int\nmbc_case_fold(OnigCaseFoldType flag,\n\t      const UChar** pp, const UChar* end ARG_UNUSED, UChar* lower)\n{\n  const UChar* p = *pp;\n\n  if (*p == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n    *lower++ = 's';\n    *lower   = 's';\n    (*pp)++;\n    return 2;\n  }\n\n  *lower = ENC_ISO_8859_15_TO_LOWER_CASE(*p);\n  (*pp)++;\n  return 1; /* return byte length of converted char to lower */\n}\n\nstatic int\nmbc_case_fold_se(OnigIterator* it, OnigCaseFoldType flag,\n\t      OnigPosition* pp, OnigPosition end ARG_UNUSED, UChar* lower)\n{\n  const UChar c = ONIG_CHARAT(*pp);\n\n  if (c == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n    *lower++ = 's';\n    *lower   = 's';\n    (*pp)++;\n    return 2;\n  }\n\n  *lower = ENC_ISO_8859_15_TO_LOWER_CASE(c);\n  (*pp)++;\n  return 1; /* return byte length of converted char to lower */\n}\n\n#if 0\nstatic int\nis_mbc_ambiguous(OnigCaseFoldType flag,\n\t\t const UChar** pp, const UChar* end)\n{\n  int v;\n  const UChar* p = *pp;\n\n  if (*p == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n    (*pp)++;\n    return TRUE;\n  }\n\n  (*pp)++;\n  v = (EncISO_8859_15_CtypeTable[*p] & (BIT_CTYPE_UPPER | BIT_CTYPE_LOWER));\n  if ((v | BIT_CTYPE_LOWER) != 0) {\n    /* 0xdf etc.. are lower case letter, but can't convert. */\n    if (*p == 0xaa || *p == 0xb5 || *p == 0xba)\n      return FALSE;\n    else\n      return TRUE;\n  }\n\n  return (v != 0 ? TRUE : FALSE);\n}\n#endif\n\nstatic int\nis_code_ctype(OnigCodePoint code, unsigned int ctype)\n{\n  if (code < 256)\n    return ENC_IS_ISO_8859_15_CTYPE(code, ctype);\n  else\n    return FALSE;\n}\n\nstatic const OnigPairCaseFoldCodes CaseFoldMap[] = {\n { 0xa6, 0xa8 },\n\n { 0xb4, 0xb8 },\n { 0xbc, 0xbd },\n { 0xbe, 0xff },\n\n { 0xc0, 0xe0 },\n { 0xc1, 0xe1 },\n { 0xc2, 0xe2 },\n { 0xc3, 0xe3 },\n { 0xc4, 0xe4 },\n { 0xc5, 0xe5 },\n { 0xc6, 0xe6 },\n { 0xc7, 0xe7 },\n { 0xc8, 0xe8 },\n { 0xc9, 0xe9 },\n { 0xca, 0xea },\n { 0xcb, 0xeb },\n { 0xcc, 0xec },\n { 0xcd, 0xed },\n { 0xce, 0xee },\n { 0xcf, 0xef },\n\n { 0xd0, 0xf0 },\n { 0xd1, 0xf1 },\n { 0xd2, 0xf2 },\n { 0xd3, 0xf3 },\n { 0xd4, 0xf4 },\n { 0xd5, 0xf5 },\n { 0xd6, 0xf6 },\n { 0xd8, 0xf8 },\n { 0xd9, 0xf9 },\n { 0xda, 0xfa },\n { 0xdb, 0xfb },\n { 0xdc, 0xfc },\n { 0xdd, 0xfd },\n { 0xde, 0xfe }\n};\n\nstatic int\napply_all_case_fold(OnigCaseFoldType flag,\n\t\t    OnigApplyAllCaseFoldFunc f, void* arg)\n{\n  return onigenc_apply_all_case_fold_with_map(\n             sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,\n             flag, f, arg);\n}\n\nstatic int\nget_case_fold_codes_by_str(OnigCaseFoldType flag,\n    const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem items[])\n{\n  return onigenc_get_case_fold_codes_by_str_with_map(\n\t     sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,\n\t     flag, p, end, items);\n}\n\nOnigEncodingType OnigEncodingISO_8859_15 = {\n  onigenc_single_byte_mbc_enc_len,\n  onigenc_single_byte_mbc_enc_len_se,\n  \"ISO-8859-15\",  /* name */\n  1,             /* max enc length */\n  1,             /* min enc length */\n  onigenc_is_mbc_newline_0x0a,\n  onigenc_is_mbc_newline_0x0a_se,\n  onigenc_single_byte_mbc_to_code,\n  onigenc_single_byte_mbc_to_code_se,\n  onigenc_single_byte_code_to_mbclen,\n  onigenc_single_byte_code_to_mbc,\n  mbc_case_fold,\n  mbc_case_fold_se,\n  apply_all_case_fold,\n  get_case_fold_codes_by_str,\n  onigenc_minimum_property_name_to_ctype,\n  is_code_ctype,\n  onigenc_not_support_get_ctype_code_range,\n  onigenc_single_byte_left_adjust_char_head,\n  onigenc_single_byte_left_adjust_char_head_se,\n  onigenc_always_true_is_allowed_reverse_match,\n  ONIGENC_FLAG_NONE,\n};\n"
  },
  {
    "path": "src/Onigmo/enc/iso8859_16.c",
    "content": "/**********************************************************************\n  iso8859_16.c -  Oniguruma (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2007  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regenc.h\"\n\n#define ENC_ISO_8859_16_TO_LOWER_CASE(c) EncISO_8859_16_ToLowerCaseTable[c]\n#define ENC_IS_ISO_8859_16_CTYPE(code,ctype) \\\n  ((EncISO_8859_16_CtypeTable[code] & CTYPE_TO_BIT(ctype)) != 0)\n\nstatic const UChar EncISO_8859_16_ToLowerCaseTable[256] = {\n  '\\000', '\\001', '\\002', '\\003', '\\004', '\\005', '\\006', '\\007',\n  '\\010', '\\011', '\\012', '\\013', '\\014', '\\015', '\\016', '\\017',\n  '\\020', '\\021', '\\022', '\\023', '\\024', '\\025', '\\026', '\\027',\n  '\\030', '\\031', '\\032', '\\033', '\\034', '\\035', '\\036', '\\037',\n  '\\040', '\\041', '\\042', '\\043', '\\044', '\\045', '\\046', '\\047',\n  '\\050', '\\051', '\\052', '\\053', '\\054', '\\055', '\\056', '\\057',\n  '\\060', '\\061', '\\062', '\\063', '\\064', '\\065', '\\066', '\\067',\n  '\\070', '\\071', '\\072', '\\073', '\\074', '\\075', '\\076', '\\077',\n  '\\100', '\\141', '\\142', '\\143', '\\144', '\\145', '\\146', '\\147',\n  '\\150', '\\151', '\\152', '\\153', '\\154', '\\155', '\\156', '\\157',\n  '\\160', '\\161', '\\162', '\\163', '\\164', '\\165', '\\166', '\\167',\n  '\\170', '\\171', '\\172', '\\133', '\\134', '\\135', '\\136', '\\137',\n  '\\140', '\\141', '\\142', '\\143', '\\144', '\\145', '\\146', '\\147',\n  '\\150', '\\151', '\\152', '\\153', '\\154', '\\155', '\\156', '\\157',\n  '\\160', '\\161', '\\162', '\\163', '\\164', '\\165', '\\166', '\\167',\n  '\\170', '\\171', '\\172', '\\173', '\\174', '\\175', '\\176', '\\177',\n  '\\200', '\\201', '\\202', '\\203', '\\204', '\\205', '\\206', '\\207',\n  '\\210', '\\211', '\\212', '\\213', '\\214', '\\215', '\\216', '\\217',\n  '\\220', '\\221', '\\222', '\\223', '\\224', '\\225', '\\226', '\\227',\n  '\\230', '\\231', '\\232', '\\233', '\\234', '\\235', '\\236', '\\237',\n  '\\240', '\\242', '\\242', '\\263', '\\245', '\\245', '\\250', '\\247',\n  '\\250', '\\251', '\\272', '\\253', '\\256', '\\255', '\\256', '\\277',\n  '\\260', '\\261', '\\271', '\\263', '\\270', '\\265', '\\266', '\\267',\n  '\\270', '\\271', '\\272', '\\273', '\\275', '\\275', '\\377', '\\277',\n  '\\340', '\\341', '\\342', '\\343', '\\344', '\\345', '\\346', '\\347',\n  '\\350', '\\351', '\\352', '\\353', '\\354', '\\355', '\\356', '\\357',\n  '\\360', '\\361', '\\362', '\\363', '\\364', '\\365', '\\366', '\\367',\n  '\\370', '\\371', '\\372', '\\373', '\\374', '\\375', '\\376', '\\337',\n  '\\340', '\\341', '\\342', '\\343', '\\344', '\\345', '\\346', '\\347',\n  '\\350', '\\351', '\\352', '\\353', '\\354', '\\355', '\\356', '\\357',\n  '\\360', '\\361', '\\362', '\\363', '\\364', '\\365', '\\366', '\\367',\n  '\\370', '\\371', '\\372', '\\373', '\\374', '\\375', '\\376', '\\377'\n};\n\nstatic const unsigned short EncISO_8859_16_CtypeTable[256] = {\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x420c, 0x4209, 0x4208, 0x4208, 0x4208, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4284, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0,\n  0x78b0, 0x78b0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x51a0,\n  0x41a0, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x4008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0284, 0x34a2, 0x30e2, 0x34a2, 0x00a0, 0x01a0, 0x34a2, 0x00a0,\n  0x30e2, 0x00a0, 0x34a2, 0x01a0, 0x34a2, 0x01a0, 0x30e2, 0x34a2,\n  0x00a0, 0x00a0, 0x34a2, 0x30e2, 0x34a2, 0x01a0, 0x00a0, 0x01a0,\n  0x30e2, 0x30e2, 0x30e2, 0x01a0, 0x34a2, 0x30e2, 0x34a2, 0x30e2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2\n};\n\nstatic int\nmbc_case_fold(OnigCaseFoldType flag,\n\t      const UChar** pp, const UChar* end ARG_UNUSED, UChar* lower)\n{\n  const UChar* p = *pp;\n\n  if (*p == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n    *lower++ = 's';\n    *lower   = 's';\n    (*pp)++;\n    return 2;\n  }\n\n  *lower = ENC_ISO_8859_16_TO_LOWER_CASE(*p);\n  (*pp)++;\n  return 1; /* return byte length of converted char to lower */\n}\n\nstatic int\nmbc_case_fold_se(OnigIterator* it, OnigCaseFoldType flag,\n\t      OnigPosition* pp, OnigPosition end ARG_UNUSED, UChar* lower)\n{\n  const UChar c = ONIG_CHARAT(*pp);\n\n  if (c == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n    *lower++ = 's';\n    *lower   = 's';\n    (*pp)++;\n    return 2;\n  }\n\n  *lower = ENC_ISO_8859_16_TO_LOWER_CASE(c);\n  (*pp)++;\n  return 1; /* return byte length of converted char to lower */\n}\n\n#if 0\nstatic int\nis_mbc_ambiguous(OnigCaseFoldType flag, const UChar** pp, const UChar* end)\n{\n  int v;\n  const UChar* p = *pp;\n\n  if (*p == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n    (*pp)++;\n    return TRUE;\n  }\n\n  (*pp)++;\n  v = (EncISO_8859_16_CtypeTable[*p] & (BIT_CTYPE_UPPER | BIT_CTYPE_LOWER));\n  if ((v | BIT_CTYPE_LOWER) != 0) {\n    return TRUE;\n  }\n\n  return (v != 0 ? TRUE : FALSE);\n}\n#endif\n\nstatic int\nis_code_ctype(OnigCodePoint code, unsigned int ctype)\n{\n  if (code < 256)\n    return ENC_IS_ISO_8859_16_CTYPE(code, ctype);\n  else\n    return FALSE;\n}\n\nstatic const OnigPairCaseFoldCodes CaseFoldMap[] = {\n { 0xa1, 0xa2 },\n { 0xa3, 0xb3 },\n { 0xa6, 0xa8 },\n { 0xaa, 0xba },\n { 0xac, 0xae },\n { 0xaf, 0xbf },\n\n { 0xb2, 0xb9 },\n { 0xb4, 0xb8 },\n { 0xbc, 0xbd },\n { 0xbe, 0xff },\n\n { 0xc0, 0xe0 },\n { 0xc1, 0xe1 },\n { 0xc2, 0xe2 },\n { 0xc3, 0xe3 },\n { 0xc4, 0xe4 },\n { 0xc5, 0xe5 },\n { 0xc6, 0xe6 },\n { 0xc7, 0xe7 },\n { 0xc8, 0xe8 },\n { 0xc9, 0xe9 },\n { 0xca, 0xea },\n { 0xcb, 0xeb },\n { 0xcc, 0xec },\n { 0xcd, 0xed },\n { 0xce, 0xee },\n { 0xcf, 0xef },\n\n { 0xd0, 0xf0 },\n { 0xd1, 0xf1 },\n { 0xd2, 0xf2 },\n { 0xd3, 0xf3 },\n { 0xd4, 0xf4 },\n { 0xd5, 0xf5 },\n { 0xd6, 0xf6 },\n { 0xd7, 0xf7 },\n { 0xd8, 0xf8 },\n { 0xd9, 0xf9 },\n { 0xda, 0xfa },\n { 0xdb, 0xfb },\n { 0xdc, 0xfc },\n { 0xdd, 0xfd },\n { 0xde, 0xfe }\n};\n\nstatic int\napply_all_case_fold(OnigCaseFoldType flag,\n\t\t    OnigApplyAllCaseFoldFunc f, void* arg)\n{\n  return onigenc_apply_all_case_fold_with_map(\n             sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,\n             flag, f, arg);\n}\n\nstatic int\nget_case_fold_codes_by_str(OnigCaseFoldType flag,\n    const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem items[])\n{\n  return onigenc_get_case_fold_codes_by_str_with_map(\n\t     sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,\n\t     flag, p, end, items);\n}\n\nOnigEncodingType OnigEncodingISO_8859_16 = {\n  onigenc_single_byte_mbc_enc_len,\n  onigenc_single_byte_mbc_enc_len_se,\n  \"ISO-8859-16\",  /* name */\n  1,             /* max enc length */\n  1,             /* min enc length */\n  onigenc_is_mbc_newline_0x0a,\n  onigenc_is_mbc_newline_0x0a_se,\n  onigenc_single_byte_mbc_to_code,\n  onigenc_single_byte_mbc_to_code_se,\n  onigenc_single_byte_code_to_mbclen,\n  onigenc_single_byte_code_to_mbc,\n  mbc_case_fold,\n  mbc_case_fold_se,\n  apply_all_case_fold,\n  get_case_fold_codes_by_str,\n  onigenc_minimum_property_name_to_ctype,\n  is_code_ctype,\n  onigenc_not_support_get_ctype_code_range,\n  onigenc_single_byte_left_adjust_char_head,\n  onigenc_single_byte_left_adjust_char_head_se,\n  onigenc_always_true_is_allowed_reverse_match,\n  ONIGENC_FLAG_NONE,\n};\n"
  },
  {
    "path": "src/Onigmo/enc/iso8859_2.c",
    "content": "/**********************************************************************\n  iso8859_2.c -  Oniguruma (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2007  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regenc.h\"\n\n#define ENC_ISO_8859_2_TO_LOWER_CASE(c) EncISO_8859_2_ToLowerCaseTable[c]\n#define ENC_IS_ISO_8859_2_CTYPE(code,ctype) \\\n  ((EncISO_8859_2_CtypeTable[code] & CTYPE_TO_BIT(ctype)) != 0)\n\nstatic const UChar EncISO_8859_2_ToLowerCaseTable[256] = {\n  '\\000', '\\001', '\\002', '\\003', '\\004', '\\005', '\\006', '\\007',\n  '\\010', '\\011', '\\012', '\\013', '\\014', '\\015', '\\016', '\\017',\n  '\\020', '\\021', '\\022', '\\023', '\\024', '\\025', '\\026', '\\027',\n  '\\030', '\\031', '\\032', '\\033', '\\034', '\\035', '\\036', '\\037',\n  '\\040', '\\041', '\\042', '\\043', '\\044', '\\045', '\\046', '\\047',\n  '\\050', '\\051', '\\052', '\\053', '\\054', '\\055', '\\056', '\\057',\n  '\\060', '\\061', '\\062', '\\063', '\\064', '\\065', '\\066', '\\067',\n  '\\070', '\\071', '\\072', '\\073', '\\074', '\\075', '\\076', '\\077',\n  '\\100', '\\141', '\\142', '\\143', '\\144', '\\145', '\\146', '\\147',\n  '\\150', '\\151', '\\152', '\\153', '\\154', '\\155', '\\156', '\\157',\n  '\\160', '\\161', '\\162', '\\163', '\\164', '\\165', '\\166', '\\167',\n  '\\170', '\\171', '\\172', '\\133', '\\134', '\\135', '\\136', '\\137',\n  '\\140', '\\141', '\\142', '\\143', '\\144', '\\145', '\\146', '\\147',\n  '\\150', '\\151', '\\152', '\\153', '\\154', '\\155', '\\156', '\\157',\n  '\\160', '\\161', '\\162', '\\163', '\\164', '\\165', '\\166', '\\167',\n  '\\170', '\\171', '\\172', '\\173', '\\174', '\\175', '\\176', '\\177',\n  '\\200', '\\201', '\\202', '\\203', '\\204', '\\205', '\\206', '\\207',\n  '\\210', '\\211', '\\212', '\\213', '\\214', '\\215', '\\216', '\\217',\n  '\\220', '\\221', '\\222', '\\223', '\\224', '\\225', '\\226', '\\227',\n  '\\230', '\\231', '\\232', '\\233', '\\234', '\\235', '\\236', '\\237',\n  '\\240', '\\261', '\\242', '\\263', '\\244', '\\265', '\\266', '\\247',\n  '\\250', '\\271', '\\272', '\\273', '\\274', '\\255', '\\276', '\\277',\n  '\\260', '\\261', '\\262', '\\263', '\\264', '\\265', '\\266', '\\267',\n  '\\270', '\\271', '\\272', '\\273', '\\274', '\\275', '\\276', '\\277',\n  '\\340', '\\341', '\\342', '\\343', '\\344', '\\345', '\\346', '\\347',\n  '\\350', '\\351', '\\352', '\\353', '\\354', '\\355', '\\356', '\\357',\n  '\\360', '\\361', '\\362', '\\363', '\\364', '\\365', '\\366', '\\327',\n  '\\370', '\\371', '\\372', '\\373', '\\374', '\\375', '\\376', '\\337',\n  '\\340', '\\341', '\\342', '\\343', '\\344', '\\345', '\\346', '\\347',\n  '\\350', '\\351', '\\352', '\\353', '\\354', '\\355', '\\356', '\\357',\n  '\\360', '\\361', '\\362', '\\363', '\\364', '\\365', '\\366', '\\367',\n  '\\370', '\\371', '\\372', '\\373', '\\374', '\\375', '\\376', '\\377'\n};\n\nstatic const unsigned short EncISO_8859_2_CtypeTable[256] = {\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x420c, 0x4209, 0x4208, 0x4208, 0x4208, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4284, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0,\n  0x78b0, 0x78b0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x51a0,\n  0x41a0, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x4008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0284, 0x34a2, 0x00a0, 0x34a2, 0x00a0, 0x34a2, 0x34a2, 0x00a0,\n  0x00a0, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x01a0, 0x34a2, 0x34a2,\n  0x00a0, 0x30e2, 0x00a0, 0x30e2, 0x00a0, 0x30e2, 0x30e2, 0x00a0,\n  0x00a0, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x00a0, 0x30e2, 0x30e2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x00a0,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x00a0,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x00a0\n};\n\nstatic int\nmbc_case_fold(OnigCaseFoldType flag,\n\t      const UChar** pp, const UChar* end ARG_UNUSED, UChar* lower)\n{\n  const UChar* p = *pp;\n\n  if (*p == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n    *lower++ = 's';\n    *lower   = 's';\n    (*pp)++;\n    return 2;\n  }\n\n  *lower = ENC_ISO_8859_2_TO_LOWER_CASE(*p);\n  (*pp)++;\n  return 1; /* return byte length of converted char to lower */\n}\n\nstatic int\nmbc_case_fold_se(OnigIterator* it, OnigCaseFoldType flag,\n\t      OnigPosition* pp, OnigPosition end ARG_UNUSED, UChar* lower)\n{\n  const UChar c = ONIG_CHARAT(*pp);\n\n  if (c == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n    *lower++ = 's';\n    *lower   = 's';\n    (*pp)++;\n    return 2;\n  }\n\n  *lower = ENC_ISO_8859_2_TO_LOWER_CASE(c);\n  (*pp)++;\n  return 1; /* return byte length of converted char to lower */\n}\n\n#if 0\nstatic int\nis_mbc_ambiguous(OnigCaseFoldType flag, const UChar** pp, const UChar* end)\n{\n  int v;\n  const UChar* p = *pp;\n\n  if (*p == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n    (*pp)++;\n    return TRUE;\n  }\n\n  (*pp)++;\n  v = (EncISO_8859_2_CtypeTable[*p] & (BIT_CTYPE_UPPER | BIT_CTYPE_LOWER));\n  if ((v | BIT_CTYPE_LOWER) != 0) {\n    return TRUE;\n  }\n\n  return (v != 0 ? TRUE : FALSE);\n}\n#endif\n\nstatic const OnigPairCaseFoldCodes CaseFoldMap[] = {\n { 0xa1, 0xb1 },\n { 0xa3, 0xb3 },\n { 0xa5, 0xb5 },\n { 0xa6, 0xb6 },\n { 0xa9, 0xb9 },\n { 0xaa, 0xba },\n { 0xab, 0xbb },\n { 0xac, 0xbc },\n { 0xae, 0xbe },\n { 0xaf, 0xbf },\n\n { 0xc0, 0xe0 },\n { 0xc1, 0xe1 },\n { 0xc2, 0xe2 },\n { 0xc3, 0xe3 },\n { 0xc4, 0xe4 },\n { 0xc5, 0xe5 },\n { 0xc6, 0xe6 },\n { 0xc7, 0xe7 },\n { 0xc8, 0xe8 },\n { 0xc9, 0xe9 },\n { 0xca, 0xea },\n { 0xcb, 0xeb },\n { 0xcc, 0xec },\n { 0xcd, 0xed },\n { 0xce, 0xee },\n { 0xcf, 0xef },\n\n { 0xd0, 0xf0 },\n { 0xd1, 0xf1 },\n { 0xd2, 0xf2 },\n { 0xd3, 0xf3 },\n { 0xd4, 0xf4 },\n { 0xd5, 0xf5 },\n { 0xd6, 0xf6 },\n { 0xd8, 0xf8 },\n { 0xd9, 0xf9 },\n { 0xda, 0xfa },\n { 0xdb, 0xfb },\n { 0xdc, 0xfc },\n { 0xdd, 0xfd },\n { 0xde, 0xfe }\n};\n\nstatic int\napply_all_case_fold(OnigCaseFoldType flag,\n\t\t    OnigApplyAllCaseFoldFunc f, void* arg)\n{\n  return onigenc_apply_all_case_fold_with_map(\n            sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,\n            flag, f, arg);\n}\n\nstatic int\nget_case_fold_codes_by_str(OnigCaseFoldType flag,\n    const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem items[])\n{\n  return onigenc_get_case_fold_codes_by_str_with_map(\n\t     sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,\n\t     flag, p, end, items);\n}\n\nstatic int\nis_code_ctype(OnigCodePoint code, unsigned int ctype)\n{\n  if (code < 256)\n    return ENC_IS_ISO_8859_2_CTYPE(code, ctype);\n  else\n    return FALSE;\n}\n\nOnigEncodingType OnigEncodingISO_8859_2 = {\n  onigenc_single_byte_mbc_enc_len,\n  onigenc_single_byte_mbc_enc_len_se,\n  \"ISO-8859-2\",  /* name */\n  1,             /* max enc length */\n  1,             /* min enc length */\n  onigenc_is_mbc_newline_0x0a,\n  onigenc_is_mbc_newline_0x0a_se,\n  onigenc_single_byte_mbc_to_code,\n  onigenc_single_byte_mbc_to_code_se,\n  onigenc_single_byte_code_to_mbclen,\n  onigenc_single_byte_code_to_mbc,\n  mbc_case_fold,\n  mbc_case_fold_se,\n  apply_all_case_fold,\n  get_case_fold_codes_by_str,\n  onigenc_minimum_property_name_to_ctype,\n  is_code_ctype,\n  onigenc_not_support_get_ctype_code_range,\n  onigenc_single_byte_left_adjust_char_head,\n  onigenc_single_byte_left_adjust_char_head_se,\n  onigenc_always_true_is_allowed_reverse_match,\n  ONIGENC_FLAG_NONE,\n};\n"
  },
  {
    "path": "src/Onigmo/enc/iso8859_3.c",
    "content": "/**********************************************************************\n  iso8859_3.c -  Oniguruma (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2007  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regenc.h\"\n\n#define ENC_ISO_8859_3_TO_LOWER_CASE(c) EncISO_8859_3_ToLowerCaseTable[c]\n#define ENC_IS_ISO_8859_3_CTYPE(code,ctype) \\\n  ((EncISO_8859_3_CtypeTable[code] & CTYPE_TO_BIT(ctype)) != 0)\n\nstatic const UChar EncISO_8859_3_ToLowerCaseTable[256] = {\n  '\\000', '\\001', '\\002', '\\003', '\\004', '\\005', '\\006', '\\007',\n  '\\010', '\\011', '\\012', '\\013', '\\014', '\\015', '\\016', '\\017',\n  '\\020', '\\021', '\\022', '\\023', '\\024', '\\025', '\\026', '\\027',\n  '\\030', '\\031', '\\032', '\\033', '\\034', '\\035', '\\036', '\\037',\n  '\\040', '\\041', '\\042', '\\043', '\\044', '\\045', '\\046', '\\047',\n  '\\050', '\\051', '\\052', '\\053', '\\054', '\\055', '\\056', '\\057',\n  '\\060', '\\061', '\\062', '\\063', '\\064', '\\065', '\\066', '\\067',\n  '\\070', '\\071', '\\072', '\\073', '\\074', '\\075', '\\076', '\\077',\n  '\\100', '\\141', '\\142', '\\143', '\\144', '\\145', '\\146', '\\147',\n  '\\150', '\\151', '\\152', '\\153', '\\154', '\\155', '\\156', '\\157',\n  '\\160', '\\161', '\\162', '\\163', '\\164', '\\165', '\\166', '\\167',\n  '\\170', '\\171', '\\172', '\\133', '\\134', '\\135', '\\136', '\\137',\n  '\\140', '\\141', '\\142', '\\143', '\\144', '\\145', '\\146', '\\147',\n  '\\150', '\\151', '\\152', '\\153', '\\154', '\\155', '\\156', '\\157',\n  '\\160', '\\161', '\\162', '\\163', '\\164', '\\165', '\\166', '\\167',\n  '\\170', '\\171', '\\172', '\\173', '\\174', '\\175', '\\176', '\\177',\n  '\\200', '\\201', '\\202', '\\203', '\\204', '\\205', '\\206', '\\207',\n  '\\210', '\\211', '\\212', '\\213', '\\214', '\\215', '\\216', '\\217',\n  '\\220', '\\221', '\\222', '\\223', '\\224', '\\225', '\\226', '\\227',\n  '\\230', '\\231', '\\232', '\\233', '\\234', '\\235', '\\236', '\\237',\n  '\\240', '\\261', '\\242', '\\243', '\\244', '\\245', '\\266', '\\247',\n  '\\250', '\\271', '\\272', '\\273', '\\274', '\\255', '\\256', '\\277',\n  '\\260', '\\261', '\\262', '\\263', '\\264', '\\265', '\\266', '\\267',\n  '\\270', '\\271', '\\272', '\\273', '\\274', '\\275', '\\276', '\\277',\n  '\\340', '\\341', '\\342', '\\303', '\\344', '\\345', '\\346', '\\347',\n  '\\350', '\\351', '\\352', '\\353', '\\354', '\\355', '\\356', '\\357',\n  '\\320', '\\361', '\\362', '\\363', '\\364', '\\365', '\\366', '\\327',\n  '\\370', '\\371', '\\372', '\\373', '\\374', '\\375', '\\376', '\\337',\n  '\\340', '\\341', '\\342', '\\343', '\\344', '\\345', '\\346', '\\347',\n  '\\350', '\\351', '\\352', '\\353', '\\354', '\\355', '\\356', '\\357',\n  '\\360', '\\361', '\\362', '\\363', '\\364', '\\365', '\\366', '\\367',\n  '\\370', '\\371', '\\372', '\\373', '\\374', '\\375', '\\376', '\\377'\n};\n\nstatic const unsigned short EncISO_8859_3_CtypeTable[256] = {\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x420c, 0x4209, 0x4208, 0x4208, 0x4208, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4284, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0,\n  0x78b0, 0x78b0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x51a0,\n  0x41a0, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x4008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0284, 0x34a2, 0x00a0, 0x00a0, 0x00a0, 0x0000, 0x34a2, 0x00a0,\n  0x00a0, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x01a0, 0x0000, 0x34a2,\n  0x00a0, 0x30e2, 0x10a0, 0x10a0, 0x00a0, 0x30e2, 0x30e2, 0x01a0,\n  0x00a0, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x11a0, 0x0000, 0x30e2,\n  0x34a2, 0x34a2, 0x34a2, 0x0000, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x0000, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x00a0,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x0000, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x0000, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x00a0,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x00a0\n};\n\nstatic int\nmbc_case_fold(OnigCaseFoldType flag, const UChar** pp,\n\t      const UChar* end ARG_UNUSED, UChar* lower)\n{\n  const UChar* p = *pp;\n\n  if (*p == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n    *lower++ = 's';\n    *lower   = 's';\n    (*pp)++;\n    return 2;\n  }\n\n  *lower = ENC_ISO_8859_3_TO_LOWER_CASE(*p);\n  (*pp)++;\n  return 1;\n}\n\nstatic int\nmbc_case_fold_se(OnigIterator* it, OnigCaseFoldType flag, OnigPosition* pp,\n\t      OnigPosition end ARG_UNUSED, UChar* lower)\n{\n  const UChar c = ONIG_CHARAT(*pp);\n\n  if (c == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n    *lower++ = 's';\n    *lower   = 's';\n    (*pp)++;\n    return 2;\n  }\n\n  *lower = ENC_ISO_8859_3_TO_LOWER_CASE(c);\n  (*pp)++;\n  return 1;\n}\n\n#if 0\nstatic int\nis_mbc_ambiguous(OnigCaseFoldType flag, const UChar** pp, const UChar* end)\n{\n  int v;\n  const UChar* p = *pp;\n\n  if (*p == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n    (*pp)++;\n    return TRUE;\n  }\n\n  (*pp)++;\n  v = (EncISO_8859_3_CtypeTable[*p] & (BIT_CTYPE_UPPER | BIT_CTYPE_LOWER));\n  if ((v | BIT_CTYPE_LOWER) != 0) {\n    /* 0xaa, 0xb5, 0xba are lower case letter, but can't convert. */\n    if (*p == 0xb5)\n      return FALSE;\n    else\n      return TRUE;\n  }\n\n  return (v != 0 ? TRUE : FALSE);\n}\n#endif\n\nstatic int\nis_code_ctype(OnigCodePoint code, unsigned int ctype)\n{\n  if (code < 256)\n    return ENC_IS_ISO_8859_3_CTYPE(code, ctype);\n  else\n    return FALSE;\n}\n\nstatic const OnigPairCaseFoldCodes CaseFoldMap[] = {\n { 0xa1, 0xb1 },\n { 0xa6, 0xb6 },\n { 0xa9, 0xb9 },\n { 0xaa, 0xba },\n { 0xab, 0xbb },\n { 0xac, 0xbc },\n { 0xaf, 0xbf },\n\n { 0xc0, 0xe0 },\n { 0xc1, 0xe1 },\n { 0xc2, 0xe2 },\n { 0xc4, 0xe4 },\n { 0xc5, 0xe5 },\n { 0xc6, 0xe6 },\n { 0xc7, 0xe7 },\n { 0xc8, 0xe8 },\n { 0xc9, 0xe9 },\n { 0xca, 0xea },\n { 0xcb, 0xeb },\n { 0xcc, 0xec },\n { 0xcd, 0xed },\n { 0xce, 0xee },\n { 0xcf, 0xef },\n\n { 0xd1, 0xf1 },\n { 0xd2, 0xf2 },\n { 0xd3, 0xf3 },\n { 0xd4, 0xf4 },\n { 0xd5, 0xf5 },\n { 0xd6, 0xf6 },\n { 0xd8, 0xf8 },\n { 0xd9, 0xf9 },\n { 0xda, 0xfa },\n { 0xdb, 0xfb },\n { 0xdc, 0xfc },\n { 0xdd, 0xfd },\n { 0xde, 0xfe }\n};\n\n\nstatic int\napply_all_case_fold(OnigCaseFoldType flag,\n\t\t    OnigApplyAllCaseFoldFunc f, void* arg)\n{\n  return onigenc_apply_all_case_fold_with_map(\n             sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,\n             flag, f, arg);\n}\n\nstatic int\nget_case_fold_codes_by_str(OnigCaseFoldType flag,\n   const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem items[])\n{\n  return onigenc_get_case_fold_codes_by_str_with_map(\n\t     sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,\n\t     flag, p, end, items);\n}\n\nOnigEncodingType OnigEncodingISO_8859_3 = {\n  onigenc_single_byte_mbc_enc_len,\n  onigenc_single_byte_mbc_enc_len_se,\n  \"ISO-8859-3\",  /* name */\n  1,             /* max enc length */\n  1,             /* min enc length */\n  onigenc_is_mbc_newline_0x0a,\n  onigenc_is_mbc_newline_0x0a_se,\n  onigenc_single_byte_mbc_to_code,\n  onigenc_single_byte_mbc_to_code_se,\n  onigenc_single_byte_code_to_mbclen,\n  onigenc_single_byte_code_to_mbc,\n  mbc_case_fold,\n  mbc_case_fold_se,\n  apply_all_case_fold,\n  get_case_fold_codes_by_str,\n  onigenc_minimum_property_name_to_ctype,\n  is_code_ctype,\n  onigenc_not_support_get_ctype_code_range,\n  onigenc_single_byte_left_adjust_char_head,\n  onigenc_single_byte_left_adjust_char_head_se,\n  onigenc_always_true_is_allowed_reverse_match,\n  ONIGENC_FLAG_NONE,\n};\n"
  },
  {
    "path": "src/Onigmo/enc/iso8859_4.c",
    "content": "/**********************************************************************\n  iso8859_4.c -  Oniguruma (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2007  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regenc.h\"\n\n#define ENC_ISO_8859_4_TO_LOWER_CASE(c) EncISO_8859_4_ToLowerCaseTable[c]\n#define ENC_IS_ISO_8859_4_CTYPE(code,ctype) \\\n  ((EncISO_8859_4_CtypeTable[code] & CTYPE_TO_BIT(ctype)) != 0)\n\nstatic const UChar EncISO_8859_4_ToLowerCaseTable[256] = {\n  '\\000', '\\001', '\\002', '\\003', '\\004', '\\005', '\\006', '\\007',\n  '\\010', '\\011', '\\012', '\\013', '\\014', '\\015', '\\016', '\\017',\n  '\\020', '\\021', '\\022', '\\023', '\\024', '\\025', '\\026', '\\027',\n  '\\030', '\\031', '\\032', '\\033', '\\034', '\\035', '\\036', '\\037',\n  '\\040', '\\041', '\\042', '\\043', '\\044', '\\045', '\\046', '\\047',\n  '\\050', '\\051', '\\052', '\\053', '\\054', '\\055', '\\056', '\\057',\n  '\\060', '\\061', '\\062', '\\063', '\\064', '\\065', '\\066', '\\067',\n  '\\070', '\\071', '\\072', '\\073', '\\074', '\\075', '\\076', '\\077',\n  '\\100', '\\141', '\\142', '\\143', '\\144', '\\145', '\\146', '\\147',\n  '\\150', '\\151', '\\152', '\\153', '\\154', '\\155', '\\156', '\\157',\n  '\\160', '\\161', '\\162', '\\163', '\\164', '\\165', '\\166', '\\167',\n  '\\170', '\\171', '\\172', '\\133', '\\134', '\\135', '\\136', '\\137',\n  '\\140', '\\141', '\\142', '\\143', '\\144', '\\145', '\\146', '\\147',\n  '\\150', '\\151', '\\152', '\\153', '\\154', '\\155', '\\156', '\\157',\n  '\\160', '\\161', '\\162', '\\163', '\\164', '\\165', '\\166', '\\167',\n  '\\170', '\\171', '\\172', '\\173', '\\174', '\\175', '\\176', '\\177',\n  '\\200', '\\201', '\\202', '\\203', '\\204', '\\205', '\\206', '\\207',\n  '\\210', '\\211', '\\212', '\\213', '\\214', '\\215', '\\216', '\\217',\n  '\\220', '\\221', '\\222', '\\223', '\\224', '\\225', '\\226', '\\227',\n  '\\230', '\\231', '\\232', '\\233', '\\234', '\\235', '\\236', '\\237',\n  '\\240', '\\261', '\\242', '\\263', '\\244', '\\265', '\\266', '\\247',\n  '\\250', '\\271', '\\272', '\\273', '\\274', '\\255', '\\276', '\\257',\n  '\\260', '\\261', '\\262', '\\263', '\\264', '\\265', '\\266', '\\267',\n  '\\270', '\\271', '\\272', '\\273', '\\274', '\\277', '\\276', '\\277',\n  '\\340', '\\341', '\\342', '\\343', '\\344', '\\345', '\\346', '\\347',\n  '\\350', '\\351', '\\352', '\\353', '\\354', '\\355', '\\356', '\\357',\n  '\\360', '\\361', '\\362', '\\363', '\\364', '\\365', '\\366', '\\327',\n  '\\370', '\\371', '\\372', '\\373', '\\374', '\\375', '\\376', '\\337',\n  '\\340', '\\341', '\\342', '\\343', '\\344', '\\345', '\\346', '\\347',\n  '\\350', '\\351', '\\352', '\\353', '\\354', '\\355', '\\356', '\\357',\n  '\\360', '\\361', '\\362', '\\363', '\\364', '\\365', '\\366', '\\367',\n  '\\370', '\\371', '\\372', '\\373', '\\374', '\\375', '\\376', '\\377'\n};\n\nstatic const unsigned short EncISO_8859_4_CtypeTable[256] = {\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x420c, 0x4209, 0x4208, 0x4208, 0x4208, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4284, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0,\n  0x78b0, 0x78b0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x51a0,\n  0x41a0, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x4008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0284, 0x34a2, 0x30e2, 0x34a2, 0x00a0, 0x34a2, 0x34a2, 0x00a0,\n  0x00a0, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x01a0, 0x34a2, 0x00a0,\n  0x00a0, 0x30e2, 0x00a0, 0x30e2, 0x00a0, 0x30e2, 0x30e2, 0x00a0,\n  0x00a0, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x34a2, 0x30e2, 0x30e2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x00a0,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x00a0,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x00a0\n};\n\nstatic int\nmbc_case_fold(OnigCaseFoldType flag,\n\t      const UChar** pp, const UChar* end ARG_UNUSED, UChar* lower)\n{\n  const UChar* p = *pp;\n\n  if (*p == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n    *lower++ = 's';\n    *lower   = 's';\n    (*pp)++;\n    return 2;\n  }\n\n  *lower = ENC_ISO_8859_4_TO_LOWER_CASE(*p);\n  (*pp)++;\n  return 1; /* return byte length of converted char to lower */\n}\n\nstatic int\nmbc_case_fold_se(OnigIterator* it, OnigCaseFoldType flag,\n\t      OnigPosition* pp, OnigPosition end ARG_UNUSED, UChar* lower)\n{\n  const UChar c = ONIG_CHARAT(*pp);\n\n  if (c == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n    *lower++ = 's';\n    *lower   = 's';\n    (*pp)++;\n    return 2;\n  }\n\n  *lower = ENC_ISO_8859_4_TO_LOWER_CASE(c);\n  (*pp)++;\n  return 1; /* return byte length of converted char to lower */\n}\n\n#if 0\nstatic int\nis_mbc_ambiguous(OnigCaseFoldType flag, const UChar** pp, const UChar* end)\n{\n  int v;\n  const UChar* p = *pp;\n\n  if (*p == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n    (*pp)++;\n    return TRUE;\n  }\n\n  (*pp)++;\n  v = (EncISO_8859_4_CtypeTable[*p] & (BIT_CTYPE_UPPER | BIT_CTYPE_LOWER));\n  if ((v | BIT_CTYPE_LOWER) != 0) {\n    if (*p == 0xa2)\n      return FALSE;\n    else\n      return TRUE;\n  }\n\n  return (v != 0 ? TRUE : FALSE);\n}\n#endif\n\nstatic int\nis_code_ctype(OnigCodePoint code, unsigned int ctype)\n{\n  if (code < 256)\n    return ENC_IS_ISO_8859_4_CTYPE(code, ctype);\n  else\n    return FALSE;\n}\n\nstatic const OnigPairCaseFoldCodes CaseFoldMap[] = {\n { 0xa1, 0xb1 },\n { 0xa3, 0xb3 },\n { 0xa5, 0xb5 },\n { 0xa6, 0xb6 },\n { 0xa9, 0xb9 },\n { 0xaa, 0xba },\n { 0xab, 0xbb },\n { 0xac, 0xbc },\n { 0xae, 0xbe },\n\n { 0xc0, 0xe0 },\n { 0xc1, 0xe1 },\n { 0xc2, 0xe2 },\n { 0xc3, 0xe3 },\n { 0xc4, 0xe4 },\n { 0xc5, 0xe5 },\n { 0xc6, 0xe6 },\n { 0xc7, 0xe7 },\n { 0xc8, 0xe8 },\n { 0xc9, 0xe9 },\n { 0xca, 0xea },\n { 0xcb, 0xeb },\n { 0xcc, 0xec },\n { 0xcd, 0xed },\n { 0xce, 0xee },\n { 0xcf, 0xef },\n\n { 0xd0, 0xf0 },\n { 0xd1, 0xf1 },\n { 0xd2, 0xf2 },\n { 0xd3, 0xf3 },\n { 0xd4, 0xf4 },\n { 0xd5, 0xf5 },\n { 0xd6, 0xf6 },\n { 0xd8, 0xf8 },\n { 0xd9, 0xf9 },\n { 0xda, 0xfa },\n { 0xdb, 0xfb },\n { 0xdc, 0xfc },\n { 0xdd, 0xfd },\n { 0xde, 0xfe }\n};\n\nstatic int\napply_all_case_fold(OnigCaseFoldType flag,\n\t\t    OnigApplyAllCaseFoldFunc f, void* arg)\n{\n  return onigenc_apply_all_case_fold_with_map(\n             sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,\n             flag, f, arg);\n}\n\nstatic int\nget_case_fold_codes_by_str(OnigCaseFoldType flag,\n    const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem items[])\n{\n  return onigenc_get_case_fold_codes_by_str_with_map(\n\t     sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,\n\t     flag, p, end, items);\n}\n\nOnigEncodingType OnigEncodingISO_8859_4 = {\n  onigenc_single_byte_mbc_enc_len,\n  onigenc_single_byte_mbc_enc_len_se,\n  \"ISO-8859-4\",  /* name */\n  1,             /* max enc length */\n  1,             /* min enc length */\n  onigenc_is_mbc_newline_0x0a,\n  onigenc_is_mbc_newline_0x0a_se,\n  onigenc_single_byte_mbc_to_code,\n  onigenc_single_byte_mbc_to_code_se,\n  onigenc_single_byte_code_to_mbclen,\n  onigenc_single_byte_code_to_mbc,\n  mbc_case_fold,\n  mbc_case_fold_se,\n  apply_all_case_fold,\n  get_case_fold_codes_by_str,\n  onigenc_minimum_property_name_to_ctype,\n  is_code_ctype,\n  onigenc_not_support_get_ctype_code_range,\n  onigenc_single_byte_left_adjust_char_head,\n  onigenc_single_byte_left_adjust_char_head_se,\n  onigenc_always_true_is_allowed_reverse_match,\n  ONIGENC_FLAG_NONE,\n};\n"
  },
  {
    "path": "src/Onigmo/enc/iso8859_5.c",
    "content": "/**********************************************************************\n  iso8859_5.c -  Oniguruma (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2008  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regenc.h\"\n\n#define ENC_ISO_8859_5_TO_LOWER_CASE(c) EncISO_8859_5_ToLowerCaseTable[c]\n#define ENC_IS_ISO_8859_5_CTYPE(code,ctype) \\\n  ((EncISO_8859_5_CtypeTable[code] & CTYPE_TO_BIT(ctype)) != 0)\n\nstatic const UChar EncISO_8859_5_ToLowerCaseTable[256] = {\n  '\\000', '\\001', '\\002', '\\003', '\\004', '\\005', '\\006', '\\007',\n  '\\010', '\\011', '\\012', '\\013', '\\014', '\\015', '\\016', '\\017',\n  '\\020', '\\021', '\\022', '\\023', '\\024', '\\025', '\\026', '\\027',\n  '\\030', '\\031', '\\032', '\\033', '\\034', '\\035', '\\036', '\\037',\n  '\\040', '\\041', '\\042', '\\043', '\\044', '\\045', '\\046', '\\047',\n  '\\050', '\\051', '\\052', '\\053', '\\054', '\\055', '\\056', '\\057',\n  '\\060', '\\061', '\\062', '\\063', '\\064', '\\065', '\\066', '\\067',\n  '\\070', '\\071', '\\072', '\\073', '\\074', '\\075', '\\076', '\\077',\n  '\\100', '\\141', '\\142', '\\143', '\\144', '\\145', '\\146', '\\147',\n  '\\150', '\\151', '\\152', '\\153', '\\154', '\\155', '\\156', '\\157',\n  '\\160', '\\161', '\\162', '\\163', '\\164', '\\165', '\\166', '\\167',\n  '\\170', '\\171', '\\172', '\\133', '\\134', '\\135', '\\136', '\\137',\n  '\\140', '\\141', '\\142', '\\143', '\\144', '\\145', '\\146', '\\147',\n  '\\150', '\\151', '\\152', '\\153', '\\154', '\\155', '\\156', '\\157',\n  '\\160', '\\161', '\\162', '\\163', '\\164', '\\165', '\\166', '\\167',\n  '\\170', '\\171', '\\172', '\\173', '\\174', '\\175', '\\176', '\\177',\n  '\\200', '\\201', '\\202', '\\203', '\\204', '\\205', '\\206', '\\207',\n  '\\210', '\\211', '\\212', '\\213', '\\214', '\\215', '\\216', '\\217',\n  '\\220', '\\221', '\\222', '\\223', '\\224', '\\225', '\\226', '\\227',\n  '\\230', '\\231', '\\232', '\\233', '\\234', '\\235', '\\236', '\\237',\n  '\\240', '\\361', '\\362', '\\363', '\\364', '\\365', '\\366', '\\367',\n  '\\370', '\\371', '\\372', '\\373', '\\374', '\\255', '\\376', '\\377',\n  '\\320', '\\321', '\\322', '\\323', '\\324', '\\325', '\\326', '\\327',\n  '\\330', '\\331', '\\332', '\\333', '\\334', '\\335', '\\336', '\\337',\n  '\\340', '\\341', '\\342', '\\343', '\\344', '\\345', '\\346', '\\347',\n  '\\350', '\\351', '\\352', '\\353', '\\354', '\\355', '\\356', '\\357',\n  '\\320', '\\321', '\\322', '\\323', '\\324', '\\325', '\\326', '\\327',\n  '\\330', '\\331', '\\332', '\\333', '\\334', '\\335', '\\336', '\\337',\n  '\\340', '\\341', '\\342', '\\343', '\\344', '\\345', '\\346', '\\347',\n  '\\350', '\\351', '\\352', '\\353', '\\354', '\\355', '\\356', '\\357',\n  '\\360', '\\361', '\\362', '\\363', '\\364', '\\365', '\\366', '\\367',\n  '\\370', '\\371', '\\372', '\\373', '\\374', '\\375', '\\376', '\\377'\n};\n\nstatic const unsigned short EncISO_8859_5_CtypeTable[256] = {\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x420c, 0x4209, 0x4208, 0x4208, 0x4208, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4284, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0,\n  0x78b0, 0x78b0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x51a0,\n  0x41a0, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x4008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0284, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x01a0, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x00a0, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x00a0, 0x30e2, 0x30e2\n};\n\nstatic int\nmbc_case_fold(OnigCaseFoldType flag ARG_UNUSED,\n\t      const UChar** pp, const UChar* end ARG_UNUSED, UChar* lower)\n{\n  const UChar* p = *pp;\n\n  *lower = ENC_ISO_8859_5_TO_LOWER_CASE(*p);\n  (*pp)++;\n  return 1;\n}\n\nstatic int\nmbc_case_fold_se(OnigIterator* it, OnigCaseFoldType flag ARG_UNUSED,\n\t      OnigPosition* pp, OnigPosition end ARG_UNUSED, UChar* lower)\n{\n  const UChar c = ONIG_CHARAT(*pp);\n\n  *lower = ENC_ISO_8859_5_TO_LOWER_CASE(c);\n  (*pp)++;\n  return 1;\n}\n\n#if 0\nstatic int\nis_mbc_ambiguous(OnigCaseFoldType flag, const UChar** pp, const UChar* end)\n{\n  int v;\n  const UChar* p = *pp;\n\n  (*pp)++;\n  v = (EncISO_8859_5_CtypeTable[*p] & (BIT_CTYPE_UPPER | BIT_CTYPE_LOWER));\n  return (v != 0 ? TRUE : FALSE);\n}\n#endif\n\nstatic int\nis_code_ctype(OnigCodePoint code, unsigned int ctype)\n{\n  if (code < 256)\n    return ENC_IS_ISO_8859_5_CTYPE(code, ctype);\n  else\n    return FALSE;\n}\n\nstatic const OnigPairCaseFoldCodes CaseFoldMap[] = {\n { 0xa1, 0xf1 },\n { 0xa2, 0xf2 },\n { 0xa3, 0xf3 },\n { 0xa4, 0xf4 },\n { 0xa5, 0xf5 },\n { 0xa6, 0xf6 },\n { 0xa7, 0xf7 },\n { 0xa8, 0xf8 },\n { 0xa9, 0xf9 },\n { 0xaa, 0xfa },\n { 0xab, 0xfb },\n { 0xac, 0xfc },\n { 0xae, 0xfe },\n { 0xaf, 0xff },\n\n { 0xb0, 0xd0 },\n { 0xb1, 0xd1 },\n { 0xb2, 0xd2 },\n { 0xb3, 0xd3 },\n { 0xb4, 0xd4 },\n { 0xb5, 0xd5 },\n { 0xb6, 0xd6 },\n { 0xb7, 0xd7 },\n { 0xb8, 0xd8 },\n { 0xb9, 0xd9 },\n { 0xba, 0xda },\n { 0xbb, 0xdb },\n { 0xbc, 0xdc },\n { 0xbd, 0xdd },\n { 0xbe, 0xde },\n { 0xbf, 0xdf },\n\n { 0xc0, 0xe0 },\n { 0xc1, 0xe1 },\n { 0xc2, 0xe2 },\n { 0xc3, 0xe3 },\n { 0xc4, 0xe4 },\n { 0xc5, 0xe5 },\n { 0xc6, 0xe6 },\n { 0xc7, 0xe7 },\n { 0xc8, 0xe8 },\n { 0xc9, 0xe9 },\n { 0xca, 0xea },\n { 0xcb, 0xeb },\n { 0xcc, 0xec },\n { 0xcd, 0xed },\n { 0xce, 0xee },\n { 0xcf, 0xef }\n};\n\nstatic int\napply_all_case_fold(OnigCaseFoldType flag,\n\t\t    OnigApplyAllCaseFoldFunc f, void* arg)\n{\n  return onigenc_apply_all_case_fold_with_map(\n             sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 0,\n             flag, f, arg);\n}\n\nstatic int\nget_case_fold_codes_by_str(OnigCaseFoldType flag,\n\t\t\t   const OnigUChar* p, const OnigUChar* end,\n\t\t\t   OnigCaseFoldCodeItem items[])\n{\n  return onigenc_get_case_fold_codes_by_str_with_map(\n\t     sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 0,\n\t     flag, p, end, items);\n}\n\nOnigEncodingType OnigEncodingISO_8859_5 = {\n  onigenc_single_byte_mbc_enc_len,\n  onigenc_single_byte_mbc_enc_len_se,\n  \"ISO-8859-5\",  /* name */\n  1,             /* max enc length */\n  1,             /* min enc length */\n  onigenc_is_mbc_newline_0x0a,\n  onigenc_is_mbc_newline_0x0a_se,\n  onigenc_single_byte_mbc_to_code,\n  onigenc_single_byte_mbc_to_code_se,\n  onigenc_single_byte_code_to_mbclen,\n  onigenc_single_byte_code_to_mbc,\n  mbc_case_fold,\n  mbc_case_fold_se,\n  apply_all_case_fold,\n  get_case_fold_codes_by_str,\n  onigenc_minimum_property_name_to_ctype,\n  is_code_ctype,\n  onigenc_not_support_get_ctype_code_range,\n  onigenc_single_byte_left_adjust_char_head,\n  onigenc_single_byte_left_adjust_char_head_se,\n  onigenc_always_true_is_allowed_reverse_match,\n  ONIGENC_FLAG_NONE,\n};\n"
  },
  {
    "path": "src/Onigmo/enc/iso8859_6.c",
    "content": "/**********************************************************************\n  iso8859_6.c -  Oniguruma (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2007  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regenc.h\"\n\n#define ENC_IS_ISO_8859_6_CTYPE(code,ctype) \\\n  ((EncISO_8859_6_CtypeTable[code] & CTYPE_TO_BIT(ctype)) != 0)\n\nstatic const unsigned short EncISO_8859_6_CtypeTable[256] = {\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x420c, 0x4209, 0x4208, 0x4208, 0x4208, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4284, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0,\n  0x78b0, 0x78b0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x51a0,\n  0x41a0, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x4008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0284, 0x0000, 0x0000, 0x0000, 0x00a0, 0x0000, 0x0000, 0x0000,\n  0x0000, 0x0000, 0x0000, 0x0000, 0x01a0, 0x01a0, 0x0000, 0x0000,\n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n  0x0000, 0x0000, 0x0000, 0x01a0, 0x0000, 0x0000, 0x0000, 0x01a0,\n  0x0000, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2,\n  0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2,\n  0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2,\n  0x30a2, 0x30a2, 0x30a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n  0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2,\n  0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2,\n  0x30a2, 0x30a2, 0x30a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000\n};\n\nstatic int\nis_code_ctype(OnigCodePoint code, unsigned int ctype)\n{\n  if (code < 256)\n    return ENC_IS_ISO_8859_6_CTYPE(code, ctype);\n  else\n    return FALSE;\n}\n\nOnigEncodingType OnigEncodingISO_8859_6 = {\n  onigenc_single_byte_mbc_enc_len,\n  onigenc_single_byte_mbc_enc_len_se,\n  \"ISO-8859-6\",  /* name */\n  1,             /* max enc length */\n  1,             /* min enc length */\n  onigenc_is_mbc_newline_0x0a,\n  onigenc_is_mbc_newline_0x0a_se,\n  onigenc_single_byte_mbc_to_code,\n  onigenc_single_byte_mbc_to_code_se,\n  onigenc_single_byte_code_to_mbclen,\n  onigenc_single_byte_code_to_mbc,\n  onigenc_ascii_mbc_case_fold,\n  onigenc_ascii_mbc_case_fold_se,\n  onigenc_ascii_apply_all_case_fold,\n  onigenc_ascii_get_case_fold_codes_by_str,\n  onigenc_minimum_property_name_to_ctype,\n  is_code_ctype,\n  onigenc_not_support_get_ctype_code_range,\n  onigenc_single_byte_left_adjust_char_head,\n  onigenc_single_byte_left_adjust_char_head_se,\n  onigenc_always_true_is_allowed_reverse_match,\n  ONIGENC_FLAG_NONE,\n};\n"
  },
  {
    "path": "src/Onigmo/enc/iso8859_7.c",
    "content": "/**********************************************************************\n  iso8859_7.c -  Oniguruma (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2007  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regenc.h\"\n\n#define ENC_ISO_8859_7_TO_LOWER_CASE(c) EncISO_8859_7_ToLowerCaseTable[c]\n#define ENC_IS_ISO_8859_7_CTYPE(code,ctype) \\\n  ((EncISO_8859_7_CtypeTable[code] & CTYPE_TO_BIT(ctype)) != 0)\n\nstatic const UChar EncISO_8859_7_ToLowerCaseTable[256] = {\n  '\\000', '\\001', '\\002', '\\003', '\\004', '\\005', '\\006', '\\007',\n  '\\010', '\\011', '\\012', '\\013', '\\014', '\\015', '\\016', '\\017',\n  '\\020', '\\021', '\\022', '\\023', '\\024', '\\025', '\\026', '\\027',\n  '\\030', '\\031', '\\032', '\\033', '\\034', '\\035', '\\036', '\\037',\n  '\\040', '\\041', '\\042', '\\043', '\\044', '\\045', '\\046', '\\047',\n  '\\050', '\\051', '\\052', '\\053', '\\054', '\\055', '\\056', '\\057',\n  '\\060', '\\061', '\\062', '\\063', '\\064', '\\065', '\\066', '\\067',\n  '\\070', '\\071', '\\072', '\\073', '\\074', '\\075', '\\076', '\\077',\n  '\\100', '\\141', '\\142', '\\143', '\\144', '\\145', '\\146', '\\147',\n  '\\150', '\\151', '\\152', '\\153', '\\154', '\\155', '\\156', '\\157',\n  '\\160', '\\161', '\\162', '\\163', '\\164', '\\165', '\\166', '\\167',\n  '\\170', '\\171', '\\172', '\\133', '\\134', '\\135', '\\136', '\\137',\n  '\\140', '\\141', '\\142', '\\143', '\\144', '\\145', '\\146', '\\147',\n  '\\150', '\\151', '\\152', '\\153', '\\154', '\\155', '\\156', '\\157',\n  '\\160', '\\161', '\\162', '\\163', '\\164', '\\165', '\\166', '\\167',\n  '\\170', '\\171', '\\172', '\\173', '\\174', '\\175', '\\176', '\\177',\n  '\\200', '\\201', '\\202', '\\203', '\\204', '\\205', '\\206', '\\207',\n  '\\210', '\\211', '\\212', '\\213', '\\214', '\\215', '\\216', '\\217',\n  '\\220', '\\221', '\\222', '\\223', '\\224', '\\225', '\\226', '\\227',\n  '\\230', '\\231', '\\232', '\\233', '\\234', '\\235', '\\236', '\\237',\n  '\\240', '\\241', '\\242', '\\243', '\\244', '\\245', '\\246', '\\247',\n  '\\250', '\\251', '\\252', '\\253', '\\254', '\\255', '\\256', '\\257',\n  '\\260', '\\261', '\\262', '\\263', '\\264', '\\265', '\\334', '\\267',\n  '\\335', '\\336', '\\337', '\\273', '\\374', '\\275', '\\375', '\\376',\n  '\\300', '\\341', '\\342', '\\343', '\\344', '\\345', '\\346', '\\347',\n  '\\350', '\\351', '\\352', '\\353', '\\354', '\\355', '\\356', '\\357',\n  '\\360', '\\361', '\\322', '\\363', '\\364', '\\365', '\\366', '\\367',\n  '\\370', '\\371', '\\372', '\\373', '\\334', '\\335', '\\336', '\\337',\n  '\\340', '\\341', '\\342', '\\343', '\\344', '\\345', '\\346', '\\347',\n  '\\350', '\\351', '\\352', '\\353', '\\354', '\\355', '\\356', '\\357',\n  '\\360', '\\361', '\\362', '\\363', '\\364', '\\365', '\\366', '\\367',\n  '\\370', '\\371', '\\372', '\\373', '\\374', '\\375', '\\376', '\\377'\n};\n\nstatic const unsigned short EncISO_8859_7_CtypeTable[256] = {\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x420c, 0x4209, 0x4208, 0x4208, 0x4208, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4284, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0,\n  0x78b0, 0x78b0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x51a0,\n  0x41a0, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x4008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0284, 0x01a0, 0x01a0, 0x00a0, 0x0000, 0x0000, 0x00a0, 0x00a0,\n  0x00a0, 0x00a0, 0x0000, 0x01a0, 0x00a0, 0x01a0, 0x0000, 0x01a0,\n  0x00a0, 0x00a0, 0x10a0, 0x10a0, 0x00a0, 0x00a0, 0x34a2, 0x01a0,\n  0x34a2, 0x34a2, 0x34a2, 0x01a0, 0x34a2, 0x10a0, 0x34a2, 0x34a2,\n  0x30e2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x0000, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x0000\n};\n\nstatic int\nmbc_case_fold(OnigCaseFoldType flag ARG_UNUSED,\n\t      const UChar** pp, const UChar* end ARG_UNUSED, UChar* lower)\n{\n  const UChar* p = *pp;\n\n  *lower = ENC_ISO_8859_7_TO_LOWER_CASE(*p);\n  (*pp)++;\n  return 1;\n}\n\nstatic int\nmbc_case_fold_se(OnigIterator* it, OnigCaseFoldType flag ARG_UNUSED,\n\t      OnigPosition* pp, OnigPosition end ARG_UNUSED, UChar* lower)\n{\n  const UChar c = ONIG_CHARAT(*pp);\n\n  *lower = ENC_ISO_8859_7_TO_LOWER_CASE(c);\n  (*pp)++;\n  return 1;\n}\n\n#if 0\nstatic int\nis_mbc_ambiguous(OnigCaseFoldType flag,\n\t\t const UChar** pp, const UChar* end)\n{\n  int v;\n  const UChar* p = *pp;\n\n  (*pp)++;\n  v = (EncISO_8859_7_CtypeTable[*p] & (BIT_CTYPE_UPPER | BIT_CTYPE_LOWER));\n  if ((v | BIT_CTYPE_LOWER) != 0) {\n    if (*p == 0xc0 || *p == 0xe0)\n      return FALSE;\n    else\n      return TRUE;\n  }\n\n  return (v != 0 ? TRUE : FALSE);\n}\n#endif\n\nstatic int\nis_code_ctype(OnigCodePoint code, unsigned int ctype)\n{\n  if (code < 256)\n    return ENC_IS_ISO_8859_7_CTYPE(code, ctype);\n  else\n    return FALSE;\n}\n\nstatic const OnigPairCaseFoldCodes CaseFoldMap[] = {\n { 0xb6, 0xdc },\n { 0xb8, 0xdd },\n { 0xb9, 0xde },\n { 0xba, 0xdf },\n { 0xbc, 0xfc },\n { 0xbe, 0xfd },\n { 0xbf, 0xfe },\n\n { 0xc1, 0xe1 },\n { 0xc2, 0xe2 },\n { 0xc3, 0xe3 },\n { 0xc4, 0xe4 },\n { 0xc5, 0xe5 },\n { 0xc6, 0xe6 },\n { 0xc7, 0xe7 },\n { 0xc8, 0xe8 },\n { 0xc9, 0xe9 },\n { 0xca, 0xea },\n { 0xcb, 0xeb },\n { 0xcc, 0xec },\n { 0xcd, 0xed },\n { 0xce, 0xee },\n { 0xcf, 0xef },\n\n { 0xd0, 0xf0 },\n { 0xd1, 0xf1 },\n { 0xd2, 0xf2 },\n { 0xd3, 0xf3 },\n { 0xd4, 0xf4 },\n { 0xd5, 0xf5 },\n { 0xd6, 0xf6 },\n { 0xd7, 0xf7 },\n { 0xd8, 0xf8 },\n { 0xd9, 0xf9 },\n { 0xda, 0xfa },\n { 0xdb, 0xfb }\n};\n\nstatic int\napply_all_case_fold(OnigCaseFoldType flag,\n\t\t    OnigApplyAllCaseFoldFunc f, void* arg)\n{\n  return onigenc_apply_all_case_fold_with_map(\n             sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 0,\n             flag, f, arg);\n}\n\nstatic int\nget_case_fold_codes_by_str(OnigCaseFoldType flag,\n   const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem items[])\n{\n  return onigenc_get_case_fold_codes_by_str_with_map(\n\t     sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 0,\n\t     flag, p, end, items);\n}\n\n\nOnigEncodingType OnigEncodingISO_8859_7 = {\n  onigenc_single_byte_mbc_enc_len,\n  onigenc_single_byte_mbc_enc_len_se,\n  \"ISO-8859-7\",  /* name */\n  1,             /* max enc length */\n  1,             /* min enc length */\n  onigenc_is_mbc_newline_0x0a,\n  onigenc_is_mbc_newline_0x0a_se,\n  onigenc_single_byte_mbc_to_code,\n  onigenc_single_byte_mbc_to_code_se,\n  onigenc_single_byte_code_to_mbclen,\n  onigenc_single_byte_code_to_mbc,\n  mbc_case_fold,\n  mbc_case_fold_se,\n  apply_all_case_fold,\n  get_case_fold_codes_by_str,\n  onigenc_minimum_property_name_to_ctype,\n  is_code_ctype,\n  onigenc_not_support_get_ctype_code_range,\n  onigenc_single_byte_left_adjust_char_head,\n  onigenc_single_byte_left_adjust_char_head_se,\n  onigenc_always_true_is_allowed_reverse_match,\n  ONIGENC_FLAG_NONE,\n};\n"
  },
  {
    "path": "src/Onigmo/enc/iso8859_8.c",
    "content": "/**********************************************************************\n  iso8859_8.c -  Oniguruma (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2007  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regenc.h\"\n\n#define ENC_IS_ISO_8859_8_CTYPE(code,ctype) \\\n  ((EncISO_8859_8_CtypeTable[code] & CTYPE_TO_BIT(ctype)) != 0)\n\nstatic const unsigned short EncISO_8859_8_CtypeTable[256] = {\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x420c, 0x4209, 0x4208, 0x4208, 0x4208, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4284, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0,\n  0x78b0, 0x78b0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x51a0,\n  0x41a0, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x4008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0284, 0x0000, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0,\n  0x00a0, 0x00a0, 0x00a0, 0x01a0, 0x00a0, 0x01a0, 0x00a0, 0x00a0,\n  0x00a0, 0x00a0, 0x10a0, 0x10a0, 0x00a0, 0x30e2, 0x00a0, 0x01a0,\n  0x00a0, 0x10a0, 0x00a0, 0x01a0, 0x10a0, 0x10a0, 0x10a0, 0x0000,\n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x01a0,\n  0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2,\n  0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2,\n  0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2, 0x30a2,\n  0x30a2, 0x30a2, 0x30a2, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000\n};\n\nstatic int\nis_code_ctype(OnigCodePoint code, unsigned int ctype)\n{\n  if (code < 256)\n    return ENC_IS_ISO_8859_8_CTYPE(code, ctype);\n  else\n    return FALSE;\n}\n\nOnigEncodingType OnigEncodingISO_8859_8 = {\n  onigenc_single_byte_mbc_enc_len,\n  onigenc_single_byte_mbc_enc_len_se,\n  \"ISO-8859-8\",  /* name */\n  1,             /* max enc length */\n  1,             /* min enc length */\n  onigenc_is_mbc_newline_0x0a,\n  onigenc_is_mbc_newline_0x0a_se,\n  onigenc_single_byte_mbc_to_code,\n  onigenc_single_byte_mbc_to_code_se,\n  onigenc_single_byte_code_to_mbclen,\n  onigenc_single_byte_code_to_mbc,\n  onigenc_ascii_mbc_case_fold,\n  onigenc_ascii_mbc_case_fold_se,\n  onigenc_ascii_apply_all_case_fold,\n  onigenc_ascii_get_case_fold_codes_by_str,\n  onigenc_minimum_property_name_to_ctype,\n  is_code_ctype,\n  onigenc_not_support_get_ctype_code_range,\n  onigenc_single_byte_left_adjust_char_head,\n  onigenc_single_byte_left_adjust_char_head_se,\n  onigenc_always_true_is_allowed_reverse_match,\n  ONIGENC_FLAG_NONE,\n};\n"
  },
  {
    "path": "src/Onigmo/enc/iso8859_9.c",
    "content": "/**********************************************************************\n  iso8859_9.c -  Oniguruma (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2007  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regenc.h\"\n\n#define ENC_ISO_8859_9_TO_LOWER_CASE(c) EncISO_8859_9_ToLowerCaseTable[c]\n#define ENC_IS_ISO_8859_9_CTYPE(code,ctype) \\\n  ((EncISO_8859_9_CtypeTable[code] & CTYPE_TO_BIT(ctype)) != 0)\n\nstatic const UChar EncISO_8859_9_ToLowerCaseTable[256] = {\n  '\\000', '\\001', '\\002', '\\003', '\\004', '\\005', '\\006', '\\007',\n  '\\010', '\\011', '\\012', '\\013', '\\014', '\\015', '\\016', '\\017',\n  '\\020', '\\021', '\\022', '\\023', '\\024', '\\025', '\\026', '\\027',\n  '\\030', '\\031', '\\032', '\\033', '\\034', '\\035', '\\036', '\\037',\n  '\\040', '\\041', '\\042', '\\043', '\\044', '\\045', '\\046', '\\047',\n  '\\050', '\\051', '\\052', '\\053', '\\054', '\\055', '\\056', '\\057',\n  '\\060', '\\061', '\\062', '\\063', '\\064', '\\065', '\\066', '\\067',\n  '\\070', '\\071', '\\072', '\\073', '\\074', '\\075', '\\076', '\\077',\n  '\\100', '\\141', '\\142', '\\143', '\\144', '\\145', '\\146', '\\147',\n  '\\150', '\\151', '\\152', '\\153', '\\154', '\\155', '\\156', '\\157',\n  '\\160', '\\161', '\\162', '\\163', '\\164', '\\165', '\\166', '\\167',\n  '\\170', '\\171', '\\172', '\\133', '\\134', '\\135', '\\136', '\\137',\n  '\\140', '\\141', '\\142', '\\143', '\\144', '\\145', '\\146', '\\147',\n  '\\150', '\\151', '\\152', '\\153', '\\154', '\\155', '\\156', '\\157',\n  '\\160', '\\161', '\\162', '\\163', '\\164', '\\165', '\\166', '\\167',\n  '\\170', '\\171', '\\172', '\\173', '\\174', '\\175', '\\176', '\\177',\n  '\\200', '\\201', '\\202', '\\203', '\\204', '\\205', '\\206', '\\207',\n  '\\210', '\\211', '\\212', '\\213', '\\214', '\\215', '\\216', '\\217',\n  '\\220', '\\221', '\\222', '\\223', '\\224', '\\225', '\\226', '\\227',\n  '\\230', '\\231', '\\232', '\\233', '\\234', '\\235', '\\236', '\\237',\n  '\\240', '\\241', '\\242', '\\243', '\\244', '\\245', '\\246', '\\247',\n  '\\250', '\\251', '\\252', '\\253', '\\254', '\\255', '\\256', '\\257',\n  '\\260', '\\261', '\\262', '\\263', '\\264', '\\265', '\\266', '\\267',\n  '\\270', '\\271', '\\272', '\\273', '\\274', '\\275', '\\276', '\\277',\n  '\\340', '\\341', '\\342', '\\343', '\\344', '\\345', '\\346', '\\347',\n  '\\350', '\\351', '\\352', '\\353', '\\354', '\\355', '\\356', '\\357',\n  '\\360', '\\361', '\\362', '\\363', '\\364', '\\365', '\\366', '\\327',\n  '\\370', '\\371', '\\372', '\\373', '\\374', '\\335', '\\376', '\\337',\n  '\\340', '\\341', '\\342', '\\343', '\\344', '\\345', '\\346', '\\347',\n  '\\350', '\\351', '\\352', '\\353', '\\354', '\\355', '\\356', '\\357',\n  '\\360', '\\361', '\\362', '\\363', '\\364', '\\365', '\\366', '\\367',\n  '\\370', '\\371', '\\372', '\\373', '\\374', '\\375', '\\376', '\\377'\n};\n\nstatic const unsigned short EncISO_8859_9_CtypeTable[256] = {\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x420c, 0x4209, 0x4208, 0x4208, 0x4208, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4284, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0,\n  0x78b0, 0x78b0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x51a0,\n  0x41a0, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x4008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0284, 0x01a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0,\n  0x00a0, 0x00a0, 0x30e2, 0x01a0, 0x00a0, 0x01a0, 0x00a0, 0x00a0,\n  0x00a0, 0x00a0, 0x10a0, 0x10a0, 0x00a0, 0x30e2, 0x00a0, 0x01a0,\n  0x00a0, 0x10a0, 0x30e2, 0x01a0, 0x10a0, 0x10a0, 0x10a0, 0x01a0,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x00a0,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x00a0,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2\n};\n\nstatic int\nmbc_case_fold(OnigCaseFoldType flag,\n\t      const UChar** pp, const UChar* end ARG_UNUSED, UChar* lower)\n{\n  const UChar* p = *pp;\n\n  if (*p == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n    *lower++ = 's';\n    *lower   = 's';\n    (*pp)++;\n    return 2;\n  }\n\n  *lower = ENC_ISO_8859_9_TO_LOWER_CASE(*p);\n  (*pp)++;\n  return 1;\n}\n\nstatic int\nmbc_case_fold_se(OnigIterator* it, OnigCaseFoldType flag,\n\t      OnigPosition* pp, OnigPosition end ARG_UNUSED, UChar* lower)\n{\n  const UChar c = ONIG_CHARAT(*pp);\n\n  if (c == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n    *lower++ = 's';\n    *lower   = 's';\n    (*pp)++;\n    return 2;\n  }\n\n  *lower = ENC_ISO_8859_9_TO_LOWER_CASE(c);\n  (*pp)++;\n  return 1;\n}\n\n#if 0\nstatic int\nis_mbc_ambiguous(OnigCaseFoldType flag, const UChar** pp, const UChar* end)\n{\n  int v;\n  const UChar* p = *pp;\n\n  if (*p == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n    (*pp)++;\n    return TRUE;\n  }\n\n  (*pp)++;\n  v = (EncISO_8859_9_CtypeTable[*p] & (BIT_CTYPE_UPPER | BIT_CTYPE_LOWER));\n  if ((v | BIT_CTYPE_LOWER) != 0) {\n    /* 0xdf etc..  are lower case letter, but can't convert. */\n    if (*p >= 0xaa && *p <= 0xba)\n      return FALSE;\n    else\n      return TRUE;\n  }\n\n  return (v != 0 ? TRUE : FALSE);\n}\n#endif\n\nstatic int\nis_code_ctype(OnigCodePoint code, unsigned int ctype)\n{\n  if (code < 256)\n    return ENC_IS_ISO_8859_9_CTYPE(code, ctype);\n  else\n    return FALSE;\n}\n\nstatic const OnigPairCaseFoldCodes CaseFoldMap[] = {\n  { 0xc0, 0xe0 },\n  { 0xc1, 0xe1 },\n  { 0xc2, 0xe2 },\n  { 0xc3, 0xe3 },\n  { 0xc4, 0xe4 },\n  { 0xc5, 0xe5 },\n  { 0xc6, 0xe6 },\n  { 0xc7, 0xe7 },\n  { 0xc8, 0xe8 },\n  { 0xc9, 0xe9 },\n  { 0xca, 0xea },\n  { 0xcb, 0xeb },\n  { 0xcc, 0xec },\n  { 0xcd, 0xed },\n  { 0xce, 0xee },\n  { 0xcf, 0xef },\n\n  { 0xd0, 0xf0 },\n  { 0xd1, 0xf1 },\n  { 0xd2, 0xf2 },\n  { 0xd3, 0xf3 },\n  { 0xd4, 0xf4 },\n  { 0xd5, 0xf5 },\n  { 0xd6, 0xf6 },\n  { 0xd8, 0xf8 },\n  { 0xd9, 0xf9 },\n  { 0xda, 0xfa },\n  { 0xdb, 0xfb },\n  { 0xdc, 0xfc },\n  { 0xdd, 0xfd },\n  { 0xde, 0xfe }\n};\n\nstatic int\napply_all_case_fold(OnigCaseFoldType flag,\n\t\t    OnigApplyAllCaseFoldFunc f, void* arg)\n{\n  return onigenc_apply_all_case_fold_with_map(\n             sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,\n             flag, f, arg);\n}\n\nstatic int\nget_case_fold_codes_by_str(OnigCaseFoldType flag,\n    const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem items[])\n{\n  return onigenc_get_case_fold_codes_by_str_with_map(\n\t     sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 1,\n\t     flag, p, end, items);\n}\n\nOnigEncodingType OnigEncodingISO_8859_9 = {\n  onigenc_single_byte_mbc_enc_len,\n  onigenc_single_byte_mbc_enc_len_se,\n  \"ISO-8859-9\",  /* name */\n  1,             /* max enc length */\n  1,             /* min enc length */\n  onigenc_is_mbc_newline_0x0a,\n  onigenc_is_mbc_newline_0x0a_se,\n  onigenc_single_byte_mbc_to_code,\n  onigenc_single_byte_mbc_to_code_se,\n  onigenc_single_byte_code_to_mbclen,\n  onigenc_single_byte_code_to_mbc,\n  mbc_case_fold,\n  mbc_case_fold_se,\n  apply_all_case_fold,\n  get_case_fold_codes_by_str,\n  onigenc_minimum_property_name_to_ctype,\n  is_code_ctype,\n  onigenc_not_support_get_ctype_code_range,\n  onigenc_single_byte_left_adjust_char_head,\n  onigenc_single_byte_left_adjust_char_head_se,\n  onigenc_always_true_is_allowed_reverse_match,\n  ONIGENC_FLAG_NONE,\n};\n"
  },
  {
    "path": "src/Onigmo/enc/koi8.c",
    "content": "/**********************************************************************\n  koi8.c -  Oniguruma (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2008  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regenc.h\"\n\n#define ENC_KOI8_TO_LOWER_CASE(c) EncKOI8_ToLowerCaseTable[c]\n#define ENC_IS_KOI8_CTYPE(code,ctype) \\\n  ((EncKOI8_CtypeTable[code] & CTYPE_TO_BIT(ctype)) != 0)\n\nstatic const UChar EncKOI8_ToLowerCaseTable[256] = {\n  '\\000', '\\001', '\\002', '\\003', '\\004', '\\005', '\\006', '\\007',\n  '\\010', '\\011', '\\012', '\\013', '\\014', '\\015', '\\016', '\\017',\n  '\\020', '\\021', '\\022', '\\023', '\\024', '\\025', '\\026', '\\027',\n  '\\030', '\\031', '\\032', '\\033', '\\034', '\\035', '\\036', '\\037',\n  '\\040', '\\041', '\\042', '\\043', '\\044', '\\045', '\\046', '\\047',\n  '\\050', '\\051', '\\052', '\\053', '\\054', '\\055', '\\056', '\\057',\n  '\\060', '\\061', '\\062', '\\063', '\\064', '\\065', '\\066', '\\067',\n  '\\070', '\\071', '\\072', '\\073', '\\074', '\\075', '\\076', '\\077',\n  '\\100', '\\141', '\\142', '\\143', '\\144', '\\145', '\\146', '\\147',\n  '\\150', '\\151', '\\152', '\\153', '\\154', '\\155', '\\156', '\\157',\n  '\\160', '\\161', '\\162', '\\163', '\\164', '\\165', '\\166', '\\167',\n  '\\170', '\\171', '\\172', '\\133', '\\134', '\\135', '\\136', '\\137',\n  '\\140', '\\141', '\\142', '\\143', '\\144', '\\145', '\\146', '\\147',\n  '\\150', '\\151', '\\152', '\\153', '\\154', '\\155', '\\156', '\\157',\n  '\\160', '\\161', '\\162', '\\163', '\\164', '\\165', '\\166', '\\167',\n  '\\170', '\\171', '\\172', '\\173', '\\174', '\\175', '\\176', '\\177',\n  '\\200', '\\201', '\\202', '\\203', '\\204', '\\205', '\\206', '\\207',\n  '\\210', '\\211', '\\212', '\\213', '\\214', '\\215', '\\216', '\\217',\n  '\\220', '\\221', '\\222', '\\223', '\\224', '\\225', '\\226', '\\227',\n  '\\230', '\\231', '\\232', '\\233', '\\234', '\\235', '\\236', '\\237',\n  '\\240', '\\241', '\\242', '\\243', '\\244', '\\245', '\\246', '\\247',\n  '\\250', '\\251', '\\252', '\\253', '\\254', '\\255', '\\256', '\\257',\n  '\\260', '\\261', '\\262', '\\263', '\\264', '\\265', '\\266', '\\267',\n  '\\270', '\\271', '\\272', '\\273', '\\274', '\\275', '\\276', '\\277',\n  '\\300', '\\301', '\\302', '\\303', '\\304', '\\305', '\\306', '\\307',\n  '\\310', '\\311', '\\312', '\\313', '\\314', '\\315', '\\316', '\\317',\n  '\\320', '\\321', '\\322', '\\323', '\\324', '\\325', '\\326', '\\327',\n  '\\330', '\\331', '\\332', '\\333', '\\334', '\\335', '\\336', '\\337',\n  '\\300', '\\301', '\\302', '\\303', '\\304', '\\305', '\\306', '\\307',\n  '\\310', '\\311', '\\312', '\\313', '\\314', '\\315', '\\316', '\\317',\n  '\\320', '\\321', '\\322', '\\323', '\\324', '\\325', '\\326', '\\327',\n  '\\330', '\\331', '\\332', '\\333', '\\334', '\\335', '\\336', '\\337'\n};\n\nstatic const unsigned short EncKOI8_CtypeTable[256] = {\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x420c, 0x4209, 0x4208, 0x4208, 0x4208, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4284, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0,\n  0x78b0, 0x78b0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x51a0,\n  0x41a0, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x4008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0284, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2\n};\n\n\nstatic int\nkoi8_mbc_case_fold(OnigCaseFoldType flag ARG_UNUSED,\n\t   const UChar** pp, const UChar* end ARG_UNUSED, UChar* lower)\n{\n  const UChar* p = *pp;\n\n  *lower = ENC_KOI8_TO_LOWER_CASE(*p);\n  (*pp)++;\n  return 1;\n}\n\nstatic int\nkoi8_mbc_case_fold_se(OnigIterator* it, OnigCaseFoldType flag ARG_UNUSED,\n\t   OnigPosition* pp, OnigPosition end ARG_UNUSED, UChar* lower)\n{\n  const UChar c = ONIG_CHARAT(*pp);\n\n  *lower = ENC_KOI8_TO_LOWER_CASE(c);\n  (*pp)++;\n  return 1;\n}\n\n#if 0\nstatic int\nkoi8_is_mbc_ambiguous(OnigAmbigType flag, const OnigUChar** pp, const OnigUChar* end)\n{\n  const OnigUChar* p = *pp;\n\n  (*pp)++;\n  if (((flag & ONIGENC_CASE_FOLD_ASCII_CASE) != 0 &&\n       ONIGENC_IS_MBC_ASCII(p)) ||\n      ((flag & ONIGENC_CASE_FOLD_NONASCII_CASE) != 0 &&\n       !ONIGENC_IS_MBC_ASCII(p))) {\n    int v = (EncKOI8_CtypeTable[*p] &\n             (BIT_CTYPE_UPPER | BIT_CTYPE_LOWER));\n    return (v != 0 ? TRUE : FALSE);\n  }\n  return FALSE;\n}\n#endif\n\nstatic int\nkoi8_is_code_ctype(OnigCodePoint code, unsigned int ctype)\n{\n  if (code < 256)\n    return ENC_IS_KOI8_CTYPE(code, ctype);\n  else\n    return FALSE;\n}\n\nstatic const OnigPairCaseFoldCodes CaseFoldMap[] = {\n { 0xc0, 0xe0 },\n { 0xc1, 0xe1 },\n { 0xc2, 0xe2 },\n { 0xc3, 0xe3 },\n { 0xc4, 0xe4 },\n { 0xc5, 0xe5 },\n { 0xc6, 0xe6 },\n { 0xc7, 0xe7 },\n { 0xc8, 0xe8 },\n { 0xc9, 0xe9 },\n { 0xca, 0xea },\n { 0xcb, 0xeb },\n { 0xcc, 0xec },\n { 0xcd, 0xed },\n { 0xce, 0xee },\n { 0xcf, 0xef },\n\n { 0xd0, 0xf0 },\n { 0xd1, 0xf1 },\n { 0xd2, 0xf2 },\n { 0xd3, 0xf3 },\n { 0xd4, 0xf4 },\n { 0xd5, 0xf5 },\n { 0xd6, 0xf6 },\n { 0xd7, 0xf7 },\n { 0xd8, 0xf8 },\n { 0xd9, 0xf9 },\n { 0xda, 0xfa },\n { 0xdb, 0xfb },\n { 0xdc, 0xfc },\n { 0xdd, 0xfd },\n { 0xde, 0xfe },\n { 0xdf, 0xff },\n\n { 0xe0, 0xc0 },\n { 0xe1, 0xc1 },\n { 0xe2, 0xc2 },\n { 0xe3, 0xc3 },\n { 0xe4, 0xc4 },\n { 0xe5, 0xc5 },\n { 0xe6, 0xc6 },\n { 0xe7, 0xc7 },\n { 0xe8, 0xc8 },\n { 0xe9, 0xc9 },\n { 0xea, 0xca },\n { 0xeb, 0xcb },\n { 0xec, 0xcc },\n { 0xed, 0xcd },\n { 0xee, 0xce },\n { 0xef, 0xcf },\n\n { 0xf0, 0xd0 },\n { 0xf1, 0xd1 },\n { 0xf2, 0xd2 },\n { 0xf3, 0xd3 },\n { 0xf4, 0xd4 },\n { 0xf5, 0xd5 },\n { 0xf6, 0xd6 },\n { 0xf7, 0xd7 },\n { 0xf8, 0xd8 },\n { 0xf9, 0xd9 },\n { 0xfa, 0xda },\n { 0xfb, 0xdb },\n { 0xfc, 0xdc },\n { 0xfe, 0xde },\n { 0xff, 0xdf }\n};\n\nstatic int\nkoi8_apply_all_case_fold(OnigCaseFoldType flag,\n\t\t\t OnigApplyAllCaseFoldFunc f, void* arg)\n{\n  return onigenc_apply_all_case_fold_with_map(\n             sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 0,\n             flag, f, arg);\n}\n\nstatic int\nkoi8_get_case_fold_codes_by_str(OnigCaseFoldType flag,\n    const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem items[])\n{\n  return onigenc_get_case_fold_codes_by_str_with_map(\n\t     sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 0,\n\t     flag, p, end, items);\n}\n\nOnigEncodingType OnigEncodingKOI8 = {\n  onigenc_single_byte_mbc_enc_len,\n  onigenc_single_byte_mbc_enc_len_se,\n  \"KOI8\",        /* name */\n  1,             /* max enc length */\n  1,             /* min enc length */\n  onigenc_is_mbc_newline_0x0a,\n  onigenc_is_mbc_newline_0x0a_se,\n  onigenc_single_byte_mbc_to_code,\n  onigenc_single_byte_mbc_to_code_se,\n  onigenc_single_byte_code_to_mbclen,\n  onigenc_single_byte_code_to_mbc,\n  koi8_mbc_case_fold,\n  koi8_mbc_case_fold_se,\n  koi8_apply_all_case_fold,\n  koi8_get_case_fold_codes_by_str,\n  onigenc_minimum_property_name_to_ctype,\n  koi8_is_code_ctype,\n  onigenc_not_support_get_ctype_code_range,\n  onigenc_single_byte_left_adjust_char_head,\n  onigenc_single_byte_left_adjust_char_head_se,\n  onigenc_always_true_is_allowed_reverse_match,\n  ONIGENC_FLAG_NONE,\n};\n"
  },
  {
    "path": "src/Onigmo/enc/koi8_r.c",
    "content": "/**********************************************************************\n  koi8_r.c -  Oniguruma (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2007  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regenc.h\"\n\n#define ENC_KOI8_R_TO_LOWER_CASE(c) EncKOI8_R_ToLowerCaseTable[c]\n#define ENC_IS_KOI8_R_CTYPE(code,ctype) \\\n  ((EncKOI8_R_CtypeTable[code] & CTYPE_TO_BIT(ctype)) != 0)\n\nstatic const UChar EncKOI8_R_ToLowerCaseTable[256] = {\n  '\\000', '\\001', '\\002', '\\003', '\\004', '\\005', '\\006', '\\007',\n  '\\010', '\\011', '\\012', '\\013', '\\014', '\\015', '\\016', '\\017',\n  '\\020', '\\021', '\\022', '\\023', '\\024', '\\025', '\\026', '\\027',\n  '\\030', '\\031', '\\032', '\\033', '\\034', '\\035', '\\036', '\\037',\n  '\\040', '\\041', '\\042', '\\043', '\\044', '\\045', '\\046', '\\047',\n  '\\050', '\\051', '\\052', '\\053', '\\054', '\\055', '\\056', '\\057',\n  '\\060', '\\061', '\\062', '\\063', '\\064', '\\065', '\\066', '\\067',\n  '\\070', '\\071', '\\072', '\\073', '\\074', '\\075', '\\076', '\\077',\n  '\\100', '\\141', '\\142', '\\143', '\\144', '\\145', '\\146', '\\147',\n  '\\150', '\\151', '\\152', '\\153', '\\154', '\\155', '\\156', '\\157',\n  '\\160', '\\161', '\\162', '\\163', '\\164', '\\165', '\\166', '\\167',\n  '\\170', '\\171', '\\172', '\\133', '\\134', '\\135', '\\136', '\\137',\n  '\\140', '\\141', '\\142', '\\143', '\\144', '\\145', '\\146', '\\147',\n  '\\150', '\\151', '\\152', '\\153', '\\154', '\\155', '\\156', '\\157',\n  '\\160', '\\161', '\\162', '\\163', '\\164', '\\165', '\\166', '\\167',\n  '\\170', '\\171', '\\172', '\\173', '\\174', '\\175', '\\176', '\\177',\n  '\\200', '\\201', '\\202', '\\203', '\\204', '\\205', '\\206', '\\207',\n  '\\210', '\\211', '\\212', '\\213', '\\214', '\\215', '\\216', '\\217',\n  '\\220', '\\221', '\\222', '\\223', '\\224', '\\225', '\\226', '\\227',\n  '\\230', '\\231', '\\232', '\\233', '\\234', '\\235', '\\236', '\\237',\n  '\\240', '\\241', '\\242', '\\243', '\\244', '\\245', '\\246', '\\247',\n  '\\250', '\\251', '\\252', '\\253', '\\254', '\\255', '\\256', '\\257',\n  '\\260', '\\261', '\\262', '\\243', '\\264', '\\265', '\\266', '\\267',\n  '\\270', '\\271', '\\272', '\\273', '\\274', '\\275', '\\276', '\\277',\n  '\\300', '\\301', '\\302', '\\303', '\\304', '\\305', '\\306', '\\307',\n  '\\310', '\\311', '\\312', '\\313', '\\314', '\\315', '\\316', '\\317',\n  '\\320', '\\321', '\\322', '\\323', '\\324', '\\325', '\\326', '\\327',\n  '\\330', '\\331', '\\332', '\\333', '\\334', '\\335', '\\336', '\\337',\n  '\\300', '\\301', '\\302', '\\303', '\\304', '\\305', '\\306', '\\307',\n  '\\310', '\\311', '\\312', '\\313', '\\314', '\\315', '\\316', '\\317',\n  '\\320', '\\321', '\\322', '\\323', '\\324', '\\325', '\\326', '\\327',\n  '\\330', '\\331', '\\332', '\\333', '\\334', '\\335', '\\336', '\\337'\n};\n\nstatic const unsigned short EncKOI8_R_CtypeTable[256] = {\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x420c, 0x4209, 0x4208, 0x4208, 0x4208, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4284, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0,\n  0x78b0, 0x78b0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x51a0,\n  0x41a0, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x4008,\n  0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0,\n  0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0,\n  0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0,\n  0x00a0, 0x00a0, 0x0284, 0x00a0, 0x00a0, 0x10a0, 0x01a0, 0x00a0,\n  0x00a0, 0x00a0, 0x00a0, 0x30e2, 0x00a0, 0x00a0, 0x00a0, 0x00a0,\n  0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0,\n  0x00a0, 0x00a0, 0x00a0, 0x34a2, 0x00a0, 0x00a0, 0x00a0, 0x00a0,\n  0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2\n};\n\nstatic int\nkoi8_r_mbc_case_fold(OnigCaseFoldType flag ARG_UNUSED,\n             const UChar** pp, const UChar* end ARG_UNUSED, UChar* lower)\n{\n  const UChar* p = *pp;\n\n  *lower = ENC_KOI8_R_TO_LOWER_CASE(*p);\n  (*pp)++;\n  return 1;\n}\n\nstatic int\nkoi8_r_mbc_case_fold_se(OnigIterator* it, OnigCaseFoldType flag ARG_UNUSED,\n             OnigPosition* pp, OnigPosition end ARG_UNUSED, UChar* lower)\n{\n  const UChar c = ONIG_CHARAT(*pp);\n\n  *lower = ENC_KOI8_R_TO_LOWER_CASE(c);\n  (*pp)++;\n  return 1;\n}\n\n#if 0\nstatic int\nkoi8_r_is_mbc_ambiguous(OnigCaseFoldType flag, const UChar** pp, const UChar* end)\n{\n  int v;\n  const UChar* p = *pp;\n\n  (*pp)++;\n  v = (EncKOI8_R_CtypeTable[*p] & (BIT_CTYPE_UPPER | BIT_CTYPE_LOWER));\n  return (v != 0 ? TRUE : FALSE);\n}\n#endif\n\nstatic int\nkoi8_r_is_code_ctype(OnigCodePoint code, unsigned int ctype)\n{\n  if (code < 256)\n    return ENC_IS_KOI8_R_CTYPE(code, ctype);\n  else\n    return FALSE;\n}\n\nstatic const OnigPairCaseFoldCodes CaseFoldMap[] = {\n  { 0xa3, 0xb3 },\n\n  { 0xc0, 0xe0 },\n  { 0xc1, 0xe1 },\n  { 0xc2, 0xe2 },\n  { 0xc3, 0xe3 },\n  { 0xc4, 0xe4 },\n  { 0xc5, 0xe5 },\n  { 0xc6, 0xe6 },\n  { 0xc7, 0xe7 },\n  { 0xc8, 0xe8 },\n  { 0xc9, 0xe9 },\n  { 0xca, 0xea },\n  { 0xcb, 0xeb },\n  { 0xcc, 0xec },\n  { 0xcd, 0xed },\n  { 0xce, 0xee },\n  { 0xcf, 0xef },\n\n  { 0xd0, 0xf0 },\n  { 0xd1, 0xf1 },\n  { 0xd2, 0xf2 },\n  { 0xd3, 0xf3 },\n  { 0xd4, 0xf4 },\n  { 0xd5, 0xf5 },\n  { 0xd6, 0xf6 },\n  { 0xd7, 0xf7 },\n  { 0xd8, 0xf8 },\n  { 0xd9, 0xf9 },\n  { 0xda, 0xfa },\n  { 0xdb, 0xfb },\n  { 0xdc, 0xfc },\n  { 0xdd, 0xfd },\n  { 0xde, 0xfe },\n  { 0xdf, 0xff }\n};\n\nstatic int\nkoi8_r_apply_all_case_fold(OnigCaseFoldType flag,\n\t\t\t       OnigApplyAllCaseFoldFunc f, void* arg)\n{\n  return onigenc_apply_all_case_fold_with_map(\n             sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 0,\n             flag, f, arg);\n}\n\nstatic int\nkoi8_r_get_case_fold_codes_by_str(OnigCaseFoldType flag,\n    const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem items[])\n{\n  return onigenc_get_case_fold_codes_by_str_with_map(\n\t     sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 0,\n\t     flag, p, end, items);\n}\n\nOnigEncodingType OnigEncodingKOI8_R = {\n  onigenc_single_byte_mbc_enc_len,\n  onigenc_single_byte_mbc_enc_len_se,\n  \"KOI8-R\",       /* name */\n  1,             /* max enc length */\n  1,             /* min enc length */\n  onigenc_is_mbc_newline_0x0a,\n  onigenc_is_mbc_newline_0x0a_se,\n  onigenc_single_byte_mbc_to_code,\n  onigenc_single_byte_mbc_to_code_se,\n  onigenc_single_byte_code_to_mbclen,\n  onigenc_single_byte_code_to_mbc,\n  koi8_r_mbc_case_fold,\n  koi8_r_mbc_case_fold_se,\n  koi8_r_apply_all_case_fold,\n  koi8_r_get_case_fold_codes_by_str,\n  onigenc_minimum_property_name_to_ctype,\n  koi8_r_is_code_ctype,\n  onigenc_not_support_get_ctype_code_range,\n  onigenc_single_byte_left_adjust_char_head,\n  onigenc_single_byte_left_adjust_char_head_se,\n  onigenc_always_true_is_allowed_reverse_match,\n  ONIGENC_FLAG_NONE,\n};\n"
  },
  {
    "path": "src/Onigmo/enc/mktable.c",
    "content": "/**********************************************************************\n  mktable.c\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2007  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <locale.h>\n\n#define __USE_ISOC99\n#include <ctype.h>\n\n#include \"regenc.h\"\n\n#define ASCII                0\n#define UNICODE_ISO_8859_1   1\n#define ISO_8859_1           2\n#define ISO_8859_2           3\n#define ISO_8859_3           4\n#define ISO_8859_4           5\n#define ISO_8859_5           6\n#define ISO_8859_6           7\n#define ISO_8859_7           8\n#define ISO_8859_8           9\n#define ISO_8859_9          10\n#define ISO_8859_10         11\n#define ISO_8859_11         12\n#define ISO_8859_13         13\n#define ISO_8859_14         14\n#define ISO_8859_15         15\n#define ISO_8859_16         16\n#define KOI8                17\n#define KOI8_R              18\n\ntypedef struct {\n  int   num;\n  const char* name;\n} ENC_INFO;\n\nstatic ENC_INFO Info[] = {\n  { ASCII,               \"ASCII\" },\n  { UNICODE_ISO_8859_1,  \"UNICODE_ISO_8859_1\"  },\n  { ISO_8859_1,  \"ISO_8859_1\"  },\n  { ISO_8859_2,  \"ISO_8859_2\"  },\n  { ISO_8859_3,  \"ISO_8859_3\"  },\n  { ISO_8859_4,  \"ISO_8859_4\"  },\n  { ISO_8859_5,  \"ISO_8859_5\"  },\n  { ISO_8859_6,  \"ISO_8859_6\"  },\n  { ISO_8859_7,  \"ISO_8859_7\"  },\n  { ISO_8859_8,  \"ISO_8859_8\"  },\n  { ISO_8859_9,  \"ISO_8859_9\"  },\n  { ISO_8859_10, \"ISO_8859_10\" },\n  { ISO_8859_11, \"ISO_8859_11\" },\n  { ISO_8859_13, \"ISO_8859_13\" },\n  { ISO_8859_14, \"ISO_8859_14\" },\n  { ISO_8859_15, \"ISO_8859_15\" },\n  { ISO_8859_16, \"ISO_8859_16\" },\n  { KOI8,        \"KOI8\" },\n  { KOI8_R,      \"KOI8_R\" }\n};\n\n\nstatic int IsAlpha(int enc, int c)\n{\n  if (enc == ASCII)\n    return isalpha(c);\n\n  if (c >= 0x41 && c <= 0x5a) return 1;\n  if (c >= 0x61 && c <= 0x7a) return 1;\n\n  switch (enc) {\n  case UNICODE_ISO_8859_1:\n  case ISO_8859_1:\n  case ISO_8859_9:\n    if (c == 0xaa) return 1;\n    if (c == 0xb5) return 1;\n    if (c == 0xba) return 1;\n    if (c >= 0xc0 && c <= 0xd6) return 1;\n    if (c >= 0xd8 && c <= 0xf6) return 1;\n    if (c >= 0xf8 && c <= 0xff) return 1;\n    break;\n\n  case ISO_8859_2:\n    if (c == 0xa1 || c == 0xa3) return 1;\n    if (c == 0xa5 || c == 0xa6) return 1;\n    if (c >= 0xa9 && c <= 0xac) return 1;\n    if (c >= 0xae && c <= 0xaf) return 1;\n    if (c == 0xb1 || c == 0xb3) return 1;\n    if (c == 0xb5 || c == 0xb6) return 1;\n    if (c >= 0xb9 && c <= 0xbc) return 1;\n    if (c >= 0xbe && c <= 0xbf) return 1;\n    if (c >= 0xc0 && c <= 0xd6) return 1;\n    if (c >= 0xd8 && c <= 0xf6) return 1;\n    if (c >= 0xf8 && c <= 0xfe) return 1;\n    break;\n\n  case ISO_8859_3:\n    if (c == 0xa1) return 1;\n    if (c == 0xa6) return 1;\n    if (c >= 0xa9 && c <= 0xac) return 1;\n    if (c == 0xaf) return 1;\n    if (c == 0xb1) return 1;\n    if (c == 0xb5 || c == 0xb6) return 1;\n    if (c >= 0xb9 && c <= 0xbc) return 1;\n    if (c == 0xbf) return 1;\n    if (c >= 0xc0 && c <= 0xc2) return 1;\n    if (c >= 0xc4 && c <= 0xcf) return 1;\n    if (c >= 0xd1 && c <= 0xd6) return 1;\n    if (c >= 0xd8 && c <= 0xe2) return 1;\n    if (c >= 0xe4 && c <= 0xef) return 1;\n    if (c >= 0xf1 && c <= 0xf6) return 1;\n    if (c >= 0xf8 && c <= 0xfe) return 1;\n    break;\n\n  case ISO_8859_4:\n    if (c >= 0xa1 && c <= 0xa3) return 1;\n    if (c == 0xa5 || c == 0xa6) return 1;\n    if (c >= 0xa9 && c <= 0xac) return 1;\n    if (c == 0xae) return 1;\n    if (c == 0xb1 || c == 0xb3) return 1;\n    if (c == 0xb5 || c == 0xb6) return 1;\n    if (c >= 0xb9 && c <= 0xbf) return 1;\n    if (c >= 0xc0 && c <= 0xd6) return 1;\n    if (c >= 0xd8 && c <= 0xf6) return 1;\n    if (c >= 0xf8 && c <= 0xfe) return 1;\n    break;\n\n  case ISO_8859_5:\n    if (c >= 0xa1 && c <= 0xcf && c != 0xad) return 1;\n    if (c >= 0xd0 && c <= 0xff && c != 0xf0 && c != 0xfd) return 1;\n    break;\n\n  case ISO_8859_6:\n    if (c >= 0xc1 && c <= 0xda) return 1;\n    if (c >= 0xe0 && c <= 0xf2) return 1;\n    break;\n\n  case ISO_8859_7:\n    if (c == 0xb6) return 1;\n    if (c >= 0xb8 && c <= 0xba) return 1;\n    if (c == 0xbc) return 1;\n    if (c >= 0xbe && c <= 0xbf) return 1;\n    if (c == 0xc0) return 1;\n    if (c >= 0xc1 && c <= 0xdb && c != 0xd2) return 1;\n    if (c >= 0xdc && c <= 0xfe) return 1;\n    break;\n\n  case ISO_8859_8:\n    if (c == 0xb5) return 1;\n    if (c >= 0xe0 && c <= 0xfa) return 1;\n    break;\n\n  case ISO_8859_10:\n    if (c >= 0xa1 && c <= 0xa6) return 1;\n    if (c >= 0xa8 && c <= 0xac) return 1;\n    if (c == 0xae || c == 0xaf) return 1;\n    if (c >= 0xb1 && c <= 0xb6) return 1;\n    if (c >= 0xb8 && c <= 0xbc) return 1;\n    if (c >= 0xbe && c <= 0xff) return 1;\n    break;\n\n  case ISO_8859_11:\n    if (c >= 0xa1 && c <= 0xda) return 1;\n    if (c >= 0xdf && c <= 0xfb) return 1;\n    break;\n\n  case ISO_8859_13:\n    if (c == 0xa8) return 1;\n    if (c == 0xaa) return 1;\n    if (c == 0xaf) return 1;\n    if (c == 0xb5) return 1;\n    if (c == 0xb8) return 1;\n    if (c == 0xba) return 1;\n    if (c >= 0xbf && c <= 0xd6) return 1;\n    if (c >= 0xd8 && c <= 0xf6) return 1;\n    if (c >= 0xf8 && c <= 0xfe) return 1;\n    break;\n\n  case ISO_8859_14:\n    if (c == 0xa1 || c == 0xa2) return 1;\n    if (c == 0xa4 || c == 0xa5) return 1;\n    if (c == 0xa6 || c == 0xa8) return 1;\n    if (c >= 0xaa && c <= 0xac) return 1;\n    if (c >= 0xaf && c <= 0xb5) return 1;\n    if (c >= 0xb7 && c <= 0xff) return 1;\n    break;\n\n  case ISO_8859_15:\n    if (c == 0xaa) return 1;\n    if (c == 0xb5) return 1;\n    if (c == 0xba) return 1;\n    if (c >= 0xc0 && c <= 0xd6) return 1;\n    if (c >= 0xd8 && c <= 0xf6) return 1;\n    if (c >= 0xf8 && c <= 0xff) return 1;\n    if (c == 0xa6) return 1;\n    if (c == 0xa8) return 1;\n    if (c == 0xb4) return 1;\n    if (c == 0xb8) return 1;\n    if (c == 0xbc) return 1;\n    if (c == 0xbd) return 1;\n    if (c == 0xbe) return 1;\n    break;\n\n  case ISO_8859_16:\n    if (c == 0xa1) return 1;\n    if (c == 0xa2) return 1;\n    if (c == 0xa3) return 1;\n    if (c == 0xa6) return 1;\n    if (c == 0xa8) return 1;\n    if (c == 0xaa) return 1;\n    if (c == 0xac) return 1;\n    if (c == 0xae) return 1;\n    if (c == 0xaf) return 1;\n    if (c == 0xb2) return 1;\n    if (c == 0xb3) return 1;\n    if (c == 0xb4) return 1;\n    if (c >= 0xb8 && c <= 0xba) return 1;\n    if (c == 0xbc) return 1;\n    if (c == 0xbd) return 1;\n    if (c == 0xbe) return 1;\n    if (c == 0xbf) return 1;\n    if (c >= 0xc0 && c <= 0xde) return 1;\n    if (c >= 0xdf && c <= 0xff) return 1;\n    break;\n\n  case KOI8_R:\n    if (c == 0xa3 || c == 0xb3) return 1;\n    /* fall */\n  case KOI8:\n    if (c >= 0xc0 && c <= 0xff) return 1;\n    break;\n\n  default:\n    exit(-1);\n  }\n\n  return 0;\n}\n\nstatic int IsBlank(int enc, int c)\n{\n  if (enc == ASCII)\n    return isblank(c);\n\n  if (c == 0x09\t|| c == 0x20) return 1;\n\n  switch (enc) {\n  case UNICODE_ISO_8859_1:\n  case ISO_8859_1:\n  case ISO_8859_2:\n  case ISO_8859_3:\n  case ISO_8859_4:\n  case ISO_8859_5:\n  case ISO_8859_6:\n  case ISO_8859_7:\n  case ISO_8859_8:\n  case ISO_8859_9:\n  case ISO_8859_10:\n  case ISO_8859_11:\n  case ISO_8859_13:\n  case ISO_8859_14:\n  case ISO_8859_15:\n  case ISO_8859_16:\n  case KOI8:\n    if (c == 0xa0) return 1;\n    break;\n\n  case KOI8_R:\n    if (c == 0x9a) return 1;\n    break;\n\n  default:\n    exit(-1);\n  }\n\n  return 0;\n}\n\nstatic int IsCntrl(int enc, int c)\n{\n  if (enc == ASCII)\n    return iscntrl(c);\n\n  if (c >= 0x00\t&& c <= 0x1F) return 1;\n\n  switch (enc) {\n  case UNICODE_ISO_8859_1:\n    if (c == 0xad) return 1;\n    /* fall */\n  case ISO_8859_1:\n  case ISO_8859_2:\n  case ISO_8859_3:\n  case ISO_8859_4:\n  case ISO_8859_5:\n  case ISO_8859_6:\n  case ISO_8859_7:\n  case ISO_8859_8:\n  case ISO_8859_9:\n  case ISO_8859_10:\n  case ISO_8859_11:\n  case ISO_8859_13:\n  case ISO_8859_14:\n  case ISO_8859_15:\n  case ISO_8859_16:\n  case KOI8:\n    if (c >= 0x7f && c <= 0x9F) return 1;\n    break;\n\n\n  case KOI8_R:\n    if (c == 0x7f) return 1;\n    break;\n\n  default:\n    exit(-1);\n  }\n\n  return 0;\n}\n\nstatic int IsDigit(int enc ARG_UNUSED, int c)\n{\n  if (c >= 0x30 && c <= 0x39) return 1;\n  return 0;\n}\n\nstatic int IsGraph(int enc, int c)\n{\n  if (enc == ASCII)\n    return isgraph(c);\n\n  if (c >= 0x21 && c <= 0x7e) return 1;\n\n  switch (enc) {\n  case UNICODE_ISO_8859_1:\n  case ISO_8859_1:\n  case ISO_8859_2:\n  case ISO_8859_4:\n  case ISO_8859_5:\n  case ISO_8859_9:\n  case ISO_8859_10:\n  case ISO_8859_13:\n  case ISO_8859_14:\n  case ISO_8859_15:\n  case ISO_8859_16:\n    if (c >= 0xa1 && c <= 0xff) return 1;\n    break;\n\n  case ISO_8859_3:\n    if (c >= 0xa1) {\n      if (c == 0xa5 || c == 0xae || c == 0xbe || c == 0xc3 || c == 0xd0 ||\n\t  c == 0xe3 || c == 0xf0)\n\treturn 0;\n      else\n\treturn 1;\n    }\n    break;\n\n  case ISO_8859_6:\n    if (c == 0xa4 || c == 0xac || c == 0xad || c == 0xbb || c == 0xbf)\n      return 1;\n    if (c >= 0xc1 && c <= 0xda) return 1;\n    if (c >= 0xe0 && c <= 0xf2) return 1;\n    break;\n\n  case ISO_8859_7:\n    if (c >= 0xa1 && c <= 0xfe &&\n\tc != 0xa4 && c != 0xa5 && c != 0xaa &&\n\tc != 0xae && c != 0xd2) return 1;\n    break;\n\n  case ISO_8859_8:\n    if (c >= 0xa2 && c <= 0xfa) {\n      if (c >= 0xbf && c <= 0xde) return 0;\n      return 1;\n    }\n    break;\n\n  case ISO_8859_11:\n    if (c >= 0xa1 && c <= 0xda) return 1;\n    if (c >= 0xdf && c <= 0xfb) return 1;\n    break;\n\n  case KOI8:\n    if (c >= 0xc0 && c <= 0xff) return 1;\n    break;\n\n  case KOI8_R:\n    if (c >= 0x80 && c <= 0xff && c != 0x9a) return 1;\n    break;\n\n  default:\n    exit(-1);\n  }\n\n  return 0;\n}\n\nstatic int IsLower(int enc, int c)\n{\n  if (enc == ASCII)\n    return islower(c);\n\n  if (c >= 0x61 && c <= 0x7a) return 1;\n\n  switch (enc) {\n  case UNICODE_ISO_8859_1:\n  case ISO_8859_1:\n  case ISO_8859_9:\n    if (c == 0xaa) return 1;\n    if (c == 0xb5) return 1;\n    if (c == 0xba) return 1;\n    if (c >= 0xdf && c <= 0xf6) return 1;\n    if (c >= 0xf8 && c <= 0xff) return 1;\n    break;\n\n  case ISO_8859_2:\n    if (c == 0xb1 || c == 0xb3) return 1;\n    if (c == 0xb5 || c == 0xb6) return 1;\n    if (c >= 0xb9 && c <= 0xbc) return 1;\n    if (c >= 0xbe && c <= 0xbf) return 1;\n    if (c >= 0xdf && c <= 0xf6) return 1;\n    if (c >= 0xf8 && c <= 0xfe) return 1;\n    break;\n\n  case ISO_8859_3:\n    if (c == 0xb1) return 1;\n    if (c == 0xb5 || c == 0xb6) return 1;\n    if (c >= 0xb9 && c <= 0xbc) return 1;\n    if (c == 0xbf) return 1;\n    if (c == 0xdf) return 1;\n    if (c >= 0xe0 && c <= 0xe2) return 1;\n    if (c >= 0xe4 && c <= 0xef) return 1;\n    if (c >= 0xf1 && c <= 0xf6) return 1;\n    if (c >= 0xf8 && c <= 0xfe) return 1;\n    break;\n\n  case ISO_8859_4:\n    if (c == 0xa2) return 1;\n    if (c == 0xb1 || c == 0xb3) return 1;\n    if (c == 0xb5 || c == 0xb6) return 1;\n    if (c >= 0xb9 && c <= 0xbc) return 1;\n    if (c >= 0xbe && c <= 0xbf) return 1;\n    if (c == 0xdf) return 1;\n    if (c >= 0xe0 && c <= 0xf6) return 1;\n    if (c >= 0xf8 && c <= 0xfe) return 1;\n    break;\n\n  case ISO_8859_5:\n    if (c >= 0xd0 && c <= 0xff && c != 0xf0 && c != 0xfd) return 1;\n    break;\n\n  case ISO_8859_6:\n    break;\n\n  case ISO_8859_7:\n    if (c == 0xc0) return 1;\n    if (c >= 0xdc && c <= 0xfe) return 1;\n    break;\n\n  case ISO_8859_8:\n    if (c == 0xb5) return 1;\n    break;\n\n  case ISO_8859_10:\n    if (c >= 0xb1 && c <= 0xb6) return 1;\n    if (c >= 0xb8 && c <= 0xbc) return 1;\n    if (c == 0xbe || c == 0xbf) return 1;\n    if (c >= 0xdf && c <= 0xff) return 1;\n    break;\n\n  case ISO_8859_11:\n    break;\n\n  case ISO_8859_13:\n    if (c == 0xb5) return 1;\n    if (c == 0xb8) return 1;\n    if (c == 0xba) return 1;\n    if (c == 0xbf) return 1;\n    if (c >= 0xdf && c <= 0xf6) return 1;\n    if (c >= 0xf8 && c <= 0xfe) return 1;\n    break;\n\n  case ISO_8859_14:\n    if (c == 0xa2) return 1;\n    if (c == 0xa5) return 1;\n    if (c == 0xab) return 1;\n    if (c == 0xb1 || c == 0xb3 || c == 0xb5) return 1;\n    if (c >= 0xb8 && c <= 0xba) return 1;\n    if (c == 0xbc) return 1;\n    if (c == 0xbe || c == 0xbf) return 1;\n    if (c >= 0xdf && c <= 0xff) return 1;\n    break;\n\n  case ISO_8859_15:\n    if (c == 0xaa) return 1;\n    if (c == 0xb5) return 1;\n    if (c == 0xba) return 1;\n    if (c >= 0xdf && c <= 0xf6) return 1;\n    if (c >= 0xf8 && c <= 0xff) return 1;\n    if (c == 0xa8) return 1;\n    if (c == 0xb8) return 1;\n    if (c == 0xbd) return 1;\n    break;\n\n  case ISO_8859_16:\n    if (c == 0xa2) return 1;\n    if (c == 0xa8) return 1;\n    if (c == 0xae) return 1;\n    if (c == 0xb3) return 1;\n    if (c >= 0xb8 && c <= 0xba) return 1;\n    if (c == 0xbd) return 1;\n    if (c == 0xbf) return 1;\n    if (c >= 0xdf && c <= 0xff) return 1;\n    break;\n\n  case KOI8_R:\n    if (c == 0xa3) return 1;\n    /* fall */\n  case KOI8:\n    if (c >= 0xc0 && c <= 0xdf) return 1;\n    break;\n\n  default:\n    exit(-1);\n  }\n\n  return 0;\n}\n\nstatic int IsPrint(int enc, int c)\n{\n  if (enc == ASCII)\n    return isprint(c);\n\n  if (c >= 0x20 && c <= 0x7e) return 1;\n\n  switch (enc) {\n  case UNICODE_ISO_8859_1:\n    /* if (c >= 0x09 && c <= 0x0d) return 1; */\n    if (c == 0x85) return 1;\n    /* fall */\n  case ISO_8859_1:\n  case ISO_8859_2:\n  case ISO_8859_4:\n  case ISO_8859_5:\n  case ISO_8859_9:\n  case ISO_8859_10:\n  case ISO_8859_13:\n  case ISO_8859_14:\n  case ISO_8859_15:\n  case ISO_8859_16:\n    if (c >= 0xa0 && c <= 0xff) return 1;\n    break;\n\n  case ISO_8859_3:\n    if (c >= 0xa0) {\n      if (c == 0xa5 || c == 0xae || c == 0xbe || c == 0xc3 || c == 0xd0 ||\n\t  c == 0xe3 || c == 0xf0)\n\treturn 0;\n      else\n\treturn 1;\n    }\n    break;\n\n  case ISO_8859_6:\n    if (c == 0xa0) return 1;\n    if (c == 0xa4 || c == 0xac || c == 0xad || c == 0xbb || c == 0xbf)\n      return 1;\n    if (c >= 0xc1 && c <= 0xda) return 1;\n    if (c >= 0xe0 && c <= 0xf2) return 1;\n    break;\n\n  case ISO_8859_7:\n    if (c >= 0xa0 && c <= 0xfe &&\n\tc != 0xa4 && c != 0xa5 && c != 0xaa &&\n\tc != 0xae && c != 0xd2) return 1;\n    break;\n\n  case ISO_8859_8:\n    if (c >= 0xa0 && c <= 0xfa) {\n      if (c >= 0xbf && c <= 0xde) return 0;\n      if (c == 0xa1) return 0;\n      return 1;\n    }\n    break;\n\n  case ISO_8859_11:\n    if (c >= 0xa0 && c <= 0xda) return 1;\n    if (c >= 0xdf && c <= 0xfb) return 1;\n    break;\n\n  case KOI8:\n    if (c == 0xa0) return 1;\n    if (c >= 0xc0 && c <= 0xff) return 1;\n    break;\n\n  case KOI8_R:\n    if (c >= 0x80 && c <= 0xff) return 1;\n    break;\n\n  default:\n    exit(-1);\n  }\n\n  return 0;\n}\n\nstatic int IsPunct(int enc, int c)\n{\n  if (enc == ASCII)\n    return ispunct(c);\n\n  if (enc == UNICODE_ISO_8859_1) {\n    if (c == 0x24 || c == 0x2b || c == 0x5e || c == 0x60 ||\n        c == 0x7c || c == 0x7e) return 1;\n    if (c >= 0x3c && c <= 0x3e) return 1;\n  }\n\n  if (c >= 0x21 && c <= 0x2f) return 1;\n  if (c >= 0x3a && c <= 0x40) return 1;\n  if (c >= 0x5b && c <= 0x60) return 1;\n  if (c >= 0x7b && c <= 0x7e) return 1;\n\n  switch (enc) {\n  case ISO_8859_1:\n  case ISO_8859_9:\n  case ISO_8859_15:\n    if (c == 0xad) return 1;\n    /* fall */\n  case UNICODE_ISO_8859_1:\n    if (c == 0xa1) return 1;\n    if (c == 0xab) return 1;\n    if (c == 0xb7) return 1;\n    if (c == 0xbb) return 1;\n    if (c == 0xbf) return 1;\n    break;\n\n  case ISO_8859_2:\n  case ISO_8859_4:\n  case ISO_8859_5:\n  case ISO_8859_14:\n    if (c == 0xad) return 1;\n    break;\n\n  case ISO_8859_3:\n  case ISO_8859_10:\n    if (c == 0xad) return 1;\n    if (c == 0xb7) return 1;\n    if (c == 0xbd) return 1;\n    break;\n\n  case ISO_8859_6:\n    if (c == 0xac) return 1;\n    if (c == 0xad) return 1;\n    if (c == 0xbb) return 1;\n    if (c == 0xbf) return 1;\n    break;\n\n  case ISO_8859_7:\n    if (c == 0xa1 || c == 0xa2) return 1;\n    if (c == 0xab) return 1;\n    if (c == 0xaf) return 1;\n    if (c == 0xad) return 1;\n    if (c == 0xb7 || c == 0xbb) return 1;\n    break;\n\n  case ISO_8859_8:\n    if (c == 0xab) return 1;\n    if (c == 0xad) return 1;\n    if (c == 0xb7) return 1;\n    if (c == 0xbb) return 1;\n    if (c == 0xdf) return 1;\n    break;\n\n  case ISO_8859_13:\n    if (c == 0xa1 || c == 0xa5) return 1;\n    if (c == 0xab || c == 0xad) return 1;\n    if (c == 0xb4 || c == 0xb7) return 1;\n    if (c == 0xbb) return 1;\n    if (c == 0xff) return 1;\n    break;\n\n  case ISO_8859_16:\n    if (c == 0xa5) return 1;\n    if (c == 0xab) return 1;\n    if (c == 0xad) return 1;\n    if (c == 0xb5) return 1;\n    if (c == 0xb7) return 1;\n    if (c == 0xbb) return 1;\n    break;\n\n  case KOI8_R:\n    if (c == 0x9e) return 1;\n    break;\n\n  case ISO_8859_11:\n  case KOI8:\n    break;\n\n  default:\n    exit(-1);\n  }\n\n  return 0;\n}\n\nstatic int IsSpace(int enc, int c)\n{\n  if (enc == ASCII)\n    return isspace(c);\n\n  if (c >= 0x09 && c <= 0x0d) return 1;\n  if (c == 0x20) return 1;\n\n  switch (enc) {\n  case UNICODE_ISO_8859_1:\n    if (c == 0x85) return 1;\n    /* fall */\n  case ISO_8859_1:\n  case ISO_8859_2:\n  case ISO_8859_3:\n  case ISO_8859_4:\n  case ISO_8859_5:\n  case ISO_8859_6:\n  case ISO_8859_7:\n  case ISO_8859_8:\n  case ISO_8859_9:\n  case ISO_8859_10:\n  case ISO_8859_11:\n  case ISO_8859_13:\n  case ISO_8859_14:\n  case ISO_8859_15:\n  case ISO_8859_16:\n  case KOI8:\n    if (c == 0xa0) return 1;\n    break;\n\n  case KOI8_R:\n    if (c == 0x9a) return 1;\n    break;\n\n  default:\n    exit(-1);\n  }\n\n  return 0;\n}\n\nstatic int IsUpper(int enc, int c)\n{\n  if (enc == ASCII)\n    return isupper(c);\n\n  if (c >= 0x41 && c <= 0x5a) return 1;\n\n  switch (enc) {\n  case UNICODE_ISO_8859_1:\n  case ISO_8859_1:\n  case ISO_8859_9:\n    if (c >= 0xc0 && c <= 0xd6) return 1;\n    if (c >= 0xd8 && c <= 0xde) return 1;\n    break;\n\n  case ISO_8859_2:\n    if (c == 0xa1 || c == 0xa3) return 1;\n    if (c == 0xa5 || c == 0xa6) return 1;\n    if (c >= 0xa9 && c <= 0xac) return 1;\n    if (c >= 0xae && c <= 0xaf) return 1;\n    if (c >= 0xc0 && c <= 0xd6) return 1;\n    if (c >= 0xd8 && c <= 0xde) return 1;\n    break;\n\n  case ISO_8859_3:\n    if (c == 0xa1) return 1;\n    if (c == 0xa6) return 1;\n    if (c >= 0xa9 && c <= 0xac) return 1;\n    if (c == 0xaf) return 1;\n    if (c >= 0xc0 && c <= 0xc2) return 1;\n    if (c >= 0xc4 && c <= 0xcf) return 1;\n    if (c >= 0xd1 && c <= 0xd6) return 1;\n    if (c >= 0xd8 && c <= 0xde) return 1;\n    break;\n\n  case ISO_8859_4:\n    if (c == 0xa1 || c == 0xa3) return 1;\n    if (c == 0xa5 || c == 0xa6) return 1;\n    if (c >= 0xa9 && c <= 0xac) return 1;\n    if (c == 0xae) return 1;\n    if (c == 0xbd) return 1;\n    if (c >= 0xc0 && c <= 0xd6) return 1;\n    if (c >= 0xd8 && c <= 0xde) return 1;\n    break;\n\n  case ISO_8859_5:\n    if (c >= 0xa1 && c <= 0xcf && c != 0xad) return 1;\n    break;\n\n  case ISO_8859_6:\n    break;\n\n  case ISO_8859_7:\n    if (c == 0xb6) return 1;\n    if (c >= 0xb8 && c <= 0xba) return 1;\n    if (c == 0xbc) return 1;\n    if (c >= 0xbe && c <= 0xbf) return 1;\n    if (c >= 0xc1 && c <= 0xdb && c != 0xd2) return 1;\n    break;\n\n  case ISO_8859_8:\n  case ISO_8859_11:\n    break;\n\n  case ISO_8859_10:\n    if (c >= 0xa1 && c <= 0xa6) return 1;\n    if (c >= 0xa8 && c <= 0xac) return 1;\n    if (c == 0xae || c == 0xaf) return 1;\n    if (c >= 0xc0 && c <= 0xde) return 1;\n    break;\n\n  case ISO_8859_13:\n    if (c == 0xa8) return 1;\n    if (c == 0xaa) return 1;\n    if (c == 0xaf) return 1;\n    if (c >= 0xc0 && c <= 0xd6) return 1;\n    if (c >= 0xd8 && c <= 0xde) return 1;\n    break;\n\n  case ISO_8859_14:\n    if (c == 0xa1) return 1;\n    if (c == 0xa4 || c == 0xa6) return 1;\n    if (c == 0xa8) return 1;\n    if (c == 0xaa || c == 0xac) return 1;\n    if (c == 0xaf || c == 0xb0) return 1;\n    if (c == 0xb2 || c == 0xb4 || c == 0xb7) return 1;\n    if (c == 0xbb || c == 0xbd) return 1;\n    if (c >= 0xc0 && c <= 0xde) return 1;\n    break;\n\n  case ISO_8859_15:\n    if (c >= 0xc0 && c <= 0xd6) return 1;\n    if (c >= 0xd8 && c <= 0xde) return 1;\n    if (c == 0xa6) return 1;\n    if (c == 0xb4) return 1;\n    if (c == 0xbc) return 1;\n    if (c == 0xbe) return 1;\n    break;\n\n  case ISO_8859_16:\n    if (c == 0xa1) return 1;\n    if (c == 0xa3) return 1;\n    if (c == 0xa6) return 1;\n    if (c == 0xaa) return 1;\n    if (c == 0xac) return 1;\n    if (c == 0xaf) return 1;\n    if (c == 0xb2) return 1;\n    if (c == 0xb4) return 1;\n    if (c == 0xbc) return 1;\n    if (c == 0xbe) return 1;\n    if (c >= 0xc0 && c <= 0xde) return 1;\n    break;\n\n  case KOI8_R:\n    if (c == 0xb3) return 1;\n    /* fall */\n  case KOI8:\n    if (c >= 0xe0 && c <= 0xff) return 1;\n    break;\n\n  default:\n    exit(-1);\n  }\n\n  return 0;\n}\n\nstatic int IsXDigit(int enc, int c)\n{\n  if (enc == ASCII)\n    return isxdigit(c);\n\n  if (c >= 0x30 && c <= 0x39) return 1;\n  if (c >= 0x41 && c <= 0x46) return 1;\n  if (c >= 0x61 && c <= 0x66) return 1;\n  return 0;\n}\n\nstatic int IsWord(int enc, int c)\n{\n  if (enc == ASCII) {\n    return (isalpha(c) || isdigit(c) || c == 0x5f);\n  }\n\n  if (c >= 0x30 && c <= 0x39) return 1;\n  if (c >= 0x41 && c <= 0x5a) return 1;\n  if (c == 0x5f) return 1;\n  if (c >= 0x61 && c <= 0x7a) return 1;\n\n  switch (enc) {\n  case UNICODE_ISO_8859_1:\n  case ISO_8859_1:\n  case ISO_8859_9:\n    if (c == 0xaa) return 1;\n    if (c >= 0xb2 && c <= 0xb3) return 1;\n    if (c == 0xb5) return 1;\n    if (c >= 0xb9 && c <= 0xba) return 1;\n    if (c >= 0xbc && c <= 0xbe) return 1;\n    if (c >= 0xc0 && c <= 0xd6) return 1;\n    if (c >= 0xd8 && c <= 0xf6) return 1;\n    if (c >= 0xf8 && c <= 0xff) return 1;\n    break;\n\n  case ISO_8859_2:\n    if (c == 0xa1 || c == 0xa3) return 1;\n    if (c == 0xa5 || c == 0xa6) return 1;\n    if (c >= 0xa9 && c <= 0xac) return 1;\n    if (c >= 0xae && c <= 0xaf) return 1;\n    if (c == 0xb1 || c == 0xb3) return 1;\n    if (c == 0xb5 || c == 0xb6) return 1;\n    if (c >= 0xb9 && c <= 0xbc) return 1;\n    if (c >= 0xbe && c <= 0xbf) return 1;\n    if (c >= 0xc0 && c <= 0xd6) return 1;\n    if (c >= 0xd8 && c <= 0xf6) return 1;\n    if (c >= 0xf8 && c <= 0xfe) return 1;\n    break;\n\n  case ISO_8859_3:\n    if (c == 0xa1) return 1;\n    if (c == 0xa6) return 1;\n    if (c >= 0xa9 && c <= 0xac) return 1;\n    if (c == 0xaf) return 1;\n    if (c >= 0xb1 && c <= 0xb3) return 1;\n    if (c == 0xb5 || c == 0xb6) return 1;\n    if (c >= 0xb9 && c <= 0xbd) return 1;\n    if (c == 0xbf) return 1;\n    if (c >= 0xc0 && c <= 0xc2) return 1;\n    if (c >= 0xc4 && c <= 0xcf) return 1;\n    if (c >= 0xd1 && c <= 0xd6) return 1;\n    if (c >= 0xd8 && c <= 0xe2) return 1;\n    if (c >= 0xe4 && c <= 0xef) return 1;\n    if (c >= 0xf1 && c <= 0xf6) return 1;\n    if (c >= 0xf8 && c <= 0xfe) return 1;\n    break;\n\n  case ISO_8859_4:\n    if (c >= 0xa1 && c <= 0xa3) return 1;\n    if (c == 0xa5 || c == 0xa6) return 1;\n    if (c >= 0xa9 && c <= 0xac) return 1;\n    if (c == 0xae) return 1;\n    if (c == 0xb1 || c == 0xb3) return 1;\n    if (c == 0xb5 || c == 0xb6) return 1;\n    if (c >= 0xb9 && c <= 0xbf) return 1;\n    if (c >= 0xc0 && c <= 0xd6) return 1;\n    if (c >= 0xd8 && c <= 0xf6) return 1;\n    if (c >= 0xf8 && c <= 0xfe) return 1;\n    break;\n\n  case ISO_8859_5:\n    if (c >= 0xa1 && c <= 0xcf && c != 0xad) return 1;\n    if (c >= 0xd0 && c <= 0xff && c != 0xf0 && c != 0xfd) return 1;\n    break;\n\n  case ISO_8859_6:\n    if (c >= 0xc1 && c <= 0xda) return 1;\n    if (c >= 0xe0 && c <= 0xea) return 1;\n    if (c >= 0xeb && c <= 0xf2) return 1;\n    break;\n\n  case ISO_8859_7:\n    if (c == 0xb2 || c == 0xb3) return 1;\n    if (c == 0xb6) return 1;\n    if (c >= 0xb8 && c <= 0xba) return 1;\n    if (c >= 0xbc && c <= 0xbf) return 1;\n    if (c == 0xc0) return 1;\n    if (c >= 0xc1 && c <= 0xdb && c != 0xd2) return 1;\n    if (c >= 0xdc && c <= 0xfe) return 1;\n    break;\n\n  case ISO_8859_8:\n    if (c == 0xb2 || c == 0xb3 || c == 0xb5 || c == 0xb9) return 1;\n    if (c >= 0xbc && c <= 0xbe) return 1;\n    if (c >= 0xe0 && c <= 0xfa) return 1;\n    break;\n\n  case ISO_8859_10:\n    if (c >= 0xa1 && c <= 0xff) {\n      if (c != 0xa7 && c != 0xad && c != 0xb0 && c != 0xb7 && c != 0xbd)\n\treturn 1;\n    }\n    break;\n\n  case ISO_8859_11:\n    if (c >= 0xa1 && c <= 0xda) return 1;\n    if (c >= 0xdf && c <= 0xfb) return 1;\n    break;\n\n  case ISO_8859_13:\n    if (c == 0xa8) return 1;\n    if (c == 0xaa) return 1;\n    if (c == 0xaf) return 1;\n    if (c == 0xb2 || c == 0xb3 || c == 0xb5 || c == 0xb9) return 1;\n    if (c >= 0xbc && c <= 0xbe) return 1;\n    if (c == 0xb8) return 1;\n    if (c == 0xba) return 1;\n    if (c >= 0xbf && c <= 0xd6) return 1;\n    if (c >= 0xd8 && c <= 0xf6) return 1;\n    if (c >= 0xf8 && c <= 0xfe) return 1;\n    break;\n\n  case ISO_8859_14:\n    if (c >= 0xa1 && c <= 0xff) {\n      if (c == 0xa3 || c == 0xa7 || c == 0xa9 || c == 0xad || c == 0xae ||\n\t  c == 0xb6) return 0;\n      return 1;\n    }\n    break;\n\n  case ISO_8859_15:\n    if (c == 0xaa) return 1;\n    if (c >= 0xb2 && c <= 0xb3) return 1;\n    if (c == 0xb5) return 1;\n    if (c >= 0xb9 && c <= 0xba) return 1;\n    if (c >= 0xbc && c <= 0xbe) return 1;\n    if (c >= 0xc0 && c <= 0xd6) return 1;\n    if (c >= 0xd8 && c <= 0xf6) return 1;\n    if (c >= 0xf8 && c <= 0xff) return 1;\n    if (c == 0xa6) return 1;\n    if (c == 0xa8) return 1;\n    if (c == 0xb4) return 1;\n    if (c == 0xb8) return 1;\n    break;\n\n  case ISO_8859_16:\n    if (c == 0xa1) return 1;\n    if (c == 0xa2) return 1;\n    if (c == 0xa3) return 1;\n    if (c == 0xa6) return 1;\n    if (c == 0xa8) return 1;\n    if (c == 0xaa) return 1;\n    if (c == 0xac) return 1;\n    if (c == 0xae) return 1;\n    if (c == 0xaf) return 1;\n    if (c == 0xb2) return 1;\n    if (c == 0xb3) return 1;\n    if (c == 0xb4) return 1;\n    if (c >= 0xb8 && c <= 0xba) return 1;\n    if (c == 0xbc) return 1;\n    if (c == 0xbd) return 1;\n    if (c == 0xbe) return 1;\n    if (c == 0xbf) return 1;\n    if (c >= 0xc0 && c <= 0xde) return 1;\n    if (c >= 0xdf && c <= 0xff) return 1;\n    break;\n\n  case KOI8_R:\n    if (c == 0x9d) return 1;\n    if (c == 0xa3 || c == 0xb3) return 1;\n    /* fall */\n  case KOI8:\n    if (c >= 0xc0 && c <= 0xff) return 1;\n    break;\n\n  default:\n    exit(-1);\n  }\n\n  return 0;\n}\n\nstatic int IsAscii(int enc ARG_UNUSED, int c)\n{\n  if (c >= 0x00 && c <= 0x7f) return 1;\n  return 0;\n}\n\nstatic int IsNewline(int enc ARG_UNUSED, int c)\n{\n  if (c == 0x0a) return 1;\n  return 0;\n}\n\nstatic int exec(FILE* fp, ENC_INFO* einfo)\n{\n#define NCOL  8\n\n  int c, val, enc;\n\n  enc = einfo->num;\n\n  fprintf(fp, \"static const unsigned short Enc%s_CtypeTable[256] = {\\n\",\n\t  einfo->name);\n\n  for (c = 0; c < 256; c++) {\n    val = 0;\n    if (IsNewline(enc, c))  val |= BIT_CTYPE_NEWLINE;\n    if (IsAlpha (enc, c))   val |= (BIT_CTYPE_ALPHA | BIT_CTYPE_ALNUM);\n    if (IsBlank (enc, c))   val |= BIT_CTYPE_BLANK;\n    if (IsCntrl (enc, c))   val |= BIT_CTYPE_CNTRL;\n    if (IsDigit (enc, c))   val |= (BIT_CTYPE_DIGIT | BIT_CTYPE_ALNUM);\n    if (IsGraph (enc, c))   val |= BIT_CTYPE_GRAPH;\n    if (IsLower (enc, c))   val |= BIT_CTYPE_LOWER;\n    if (IsPrint (enc, c))   val |= BIT_CTYPE_PRINT;\n    if (IsPunct (enc, c))   val |= BIT_CTYPE_PUNCT;\n    if (IsSpace (enc, c))   val |= BIT_CTYPE_SPACE;\n    if (IsUpper (enc, c))   val |= BIT_CTYPE_UPPER;\n    if (IsXDigit(enc, c))   val |= BIT_CTYPE_XDIGIT;\n    if (IsWord  (enc, c))   val |= BIT_CTYPE_WORD;\n    if (IsAscii (enc, c))   val |= BIT_CTYPE_ASCII;\n\n    if (c % NCOL == 0) fputs(\"  \", fp);\n    fprintf(fp, \"0x%04x\", val);\n    if (c != 255) fputs(\",\", fp);\n    if (c != 0 && c % NCOL == (NCOL-1))\n      fputs(\"\\n\", fp);\n    else\n      fputs(\" \", fp);\n  }\n  fprintf(fp, \"};\\n\");\n  return 0;\n}\n\nextern int main(int argc ARG_UNUSED, char* argv[] ARG_UNUSED)\n{\n  int i;\n  FILE* fp = stdout;\n\n  setlocale(LC_ALL, \"C\");\n  /* setlocale(LC_ALL, \"POSIX\"); */\n  /* setlocale(LC_ALL, \"en_GB.iso88591\"); */\n  /* setlocale(LC_ALL, \"de_BE.iso88591\"); */\n  /* setlocale(LC_ALL, \"fr_FR.iso88591\"); */\n\n  for (i = 0; i < (int )(sizeof(Info)/sizeof(ENC_INFO)); i++) {\n    exec(fp, &Info[i]);\n  }\n\n  return 0;\n}\n"
  },
  {
    "path": "src/Onigmo/enc/sjis.c",
    "content": "/**********************************************************************\n  sjis.c -  Onigmo (Oniguruma-mod) (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2008  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * Copyright (c) 2011       K.Takata  <kentkt AT csc DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regint.h\"\n\n#ifdef ENC_CP932\n#define ONIG_ENCODING_SELF\tONIG_ENCODING_CP932\n#else\n#define ONIG_ENCODING_SELF\tONIG_ENCODING_SJIS\n#endif\n\nstatic const int EncLen_SJIS[] = {\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1\n};\n\nstatic const char SJIS_CAN_BE_TRAIL_TABLE[256] = {\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0\n};\n\nstatic const OnigPairCaseFoldCodes CaseFoldMap[] = {\n  /* Fullwidth Alphabet */\n  { 0x8260, 0x8281 },\n  { 0x8261, 0x8282 },\n  { 0x8262, 0x8283 },\n  { 0x8263, 0x8284 },\n  { 0x8264, 0x8285 },\n  { 0x8265, 0x8286 },\n  { 0x8266, 0x8287 },\n  { 0x8267, 0x8288 },\n  { 0x8268, 0x8289 },\n  { 0x8269, 0x828a },\n  { 0x826a, 0x828b },\n  { 0x826b, 0x828c },\n  { 0x826c, 0x828d },\n  { 0x826d, 0x828e },\n  { 0x826e, 0x828f },\n  { 0x826f, 0x8290 },\n  { 0x8270, 0x8291 },\n  { 0x8271, 0x8292 },\n  { 0x8272, 0x8293 },\n  { 0x8273, 0x8294 },\n  { 0x8274, 0x8295 },\n  { 0x8275, 0x8296 },\n  { 0x8276, 0x8297 },\n  { 0x8277, 0x8298 },\n  { 0x8278, 0x8299 },\n  { 0x8279, 0x829a },\n\n  /* Greek */\n  { 0x839f, 0x83bf },\n  { 0x83a0, 0x83c0 },\n  { 0x83a1, 0x83c1 },\n  { 0x83a2, 0x83c2 },\n  { 0x83a3, 0x83c3 },\n  { 0x83a4, 0x83c4 },\n  { 0x83a5, 0x83c5 },\n  { 0x83a6, 0x83c6 },\n  { 0x83a7, 0x83c7 },\n  { 0x83a8, 0x83c8 },\n  { 0x83a9, 0x83c9 },\n  { 0x83aa, 0x83ca },\n  { 0x83ab, 0x83cb },\n  { 0x83ac, 0x83cc },\n  { 0x83ad, 0x83cd },\n  { 0x83ae, 0x83ce },\n  { 0x83af, 0x83cf },\n  { 0x83b0, 0x83d0 },\n  { 0x83b1, 0x83d1 },\n  { 0x83b2, 0x83d2 },\n  { 0x83b3, 0x83d3 },\n  { 0x83b4, 0x83d4 },\n  { 0x83b5, 0x83d5 },\n  { 0x83b6, 0x83d6 },\n\n  /* Cyrillic */\n  { 0x8440, 0x8470 },\n  { 0x8441, 0x8471 },\n  { 0x8442, 0x8472 },\n  { 0x8443, 0x8473 },\n  { 0x8444, 0x8474 },\n  { 0x8445, 0x8475 },\n  { 0x8446, 0x8476 },\n  { 0x8447, 0x8477 },\n  { 0x8448, 0x8478 },\n  { 0x8449, 0x8479 },\n  { 0x844a, 0x847a },\n  { 0x844b, 0x847b },\n  { 0x844c, 0x847c },\n  { 0x844d, 0x847d },\n  { 0x844e, 0x847e },\n  { 0x844f, 0x8480 },\n  { 0x8450, 0x8481 },\n  { 0x8451, 0x8482 },\n  { 0x8452, 0x8483 },\n  { 0x8453, 0x8484 },\n  { 0x8454, 0x8485 },\n  { 0x8455, 0x8486 },\n  { 0x8456, 0x8487 },\n  { 0x8457, 0x8488 },\n  { 0x8458, 0x8489 },\n  { 0x8459, 0x848a },\n  { 0x845a, 0x848b },\n  { 0x845b, 0x848c },\n  { 0x845c, 0x848d },\n  { 0x845d, 0x848e },\n  { 0x845e, 0x848f },\n  { 0x845f, 0x8490 },\n  { 0x8460, 0x8491 },\n};\n\n#define SJIS_ISMB_FIRST(byte)  (EncLen_SJIS[byte] > 1)\n#define SJIS_ISMB_TRAIL(byte)  SJIS_CAN_BE_TRAIL_TABLE[(byte)]\n\nstatic int\nmbc_enc_len(const UChar* p)\n{\n  return EncLen_SJIS[*p];\n}\n\nstatic int\nmbc_enc_len_se(OnigIterator* it, OnigPosition p)\n{\n  return EncLen_SJIS[ONIG_CHARAT(p)];\n}\n\nstatic int\ncode_to_mbclen(OnigCodePoint code)\n{\n  if (code < 256) {\n    if (EncLen_SJIS[(int )code] == 1)\n      return 1;\n    else\n      return 0;\n  }\n  else if (code <= 0xffff) {\n    int low = code & 0xff;\n    if (! SJIS_ISMB_TRAIL(low))\n      return ONIGERR_INVALID_CODE_POINT_VALUE;\n    return 2;\n  }\n  else\n    return ONIGERR_INVALID_CODE_POINT_VALUE;\n}\n\nstatic OnigCodePoint\nmbc_to_code(const UChar* p, const UChar* end)\n{\n  int c, i, len;\n  OnigCodePoint n;\n\n  len = mbc_enc_len(p);\n  c = *p++;\n  n = c;\n  if (len == 1) return n;\n\n  for (i = 1; i < len; i++) {\n    if (p >= end) break;\n    c = *p++;\n    n <<= 8;  n += c;\n  }\n  return n;\n}\n\nstatic OnigCodePoint\nmbc_to_code_se(OnigIterator* it, OnigPosition p, OnigPosition end)\n{\n  int c, i, len;\n  OnigCodePoint n;\n\n  len = mbc_enc_len_se(it, p);\n  c = ONIG_CHARAT(p++);\n  n = c;\n  if (len == 1) return n;\n\n  for (i = 1; i < len; i++) {\n    if (p >= end) break;\n    c = ONIG_CHARAT(p++);\n    n <<= 8;  n += c;\n  }\n  return n;\n}\n\nstatic int\ncode_to_mbc(OnigCodePoint code, UChar *buf)\n{\n  UChar *p = buf;\n\n  if ((code & 0xff00) != 0) *p++ = (UChar )(((code >>  8) & 0xff));\n  *p++ = (UChar )(code & 0xff);\n\n#if 0\n  if (mbc_enc_len(buf) != (p - buf))\n    return REGERR_INVALID_CODE_POINT_VALUE;\n#endif\n  return (int )(p - buf);\n}\n\nstatic int\napply_all_case_fold(OnigCaseFoldType flag,\n\t\t    OnigApplyAllCaseFoldFunc f, void* arg)\n{\n  return onigenc_apply_all_case_fold_with_map(\n            sizeof(CaseFoldMap)/sizeof(OnigPairCaseFoldCodes), CaseFoldMap, 0,\n            flag, f, arg);\n}\n\nstatic OnigCodePoint\nget_lower_case(OnigCodePoint code)\n{\n  if (ONIGENC_IS_IN_RANGE(code, 0x8260, 0x8279)) {\n    /* Fullwidth Alphabet */\n    return (OnigCodePoint )(code + 0x0021);\n  }\n  else if (ONIGENC_IS_IN_RANGE(code, 0x839f, 0x83b6)) {\n    /* Greek */\n    return (OnigCodePoint )(code + 0x0020);\n  }\n  else if (ONIGENC_IS_IN_RANGE(code, 0x8440, 0x8460)) {\n    /* Cyrillic */\n    int d = (code >= 0x844f) ? 1 : 0;\n    return (OnigCodePoint )(code + (0x0030 + d));\n  }\n  return code;\n}\n\nstatic OnigCodePoint\nget_upper_case(OnigCodePoint code)\n{\n  if (ONIGENC_IS_IN_RANGE(code, 0x8281, 0x829a)) {\n    /* Fullwidth Alphabet */\n    return (OnigCodePoint )(code - 0x0021);\n  }\n  else if (ONIGENC_IS_IN_RANGE(code, 0x83bf, 0x83d6)) {\n    /* Greek */\n    return (OnigCodePoint )(code - 0x0020);\n  }\n  else if (ONIGENC_IS_IN_RANGE(code, 0x8470, 0x847e) ||\n\t   ONIGENC_IS_IN_RANGE(code, 0x8480, 0x8491)) {\n    /* Cyrillic */\n    int d = (code >= 0x8480) ? 1 : 0;\n    return (OnigCodePoint )(code - (0x0030 - d));\n  }\n  return code;\n}\n\nstatic int\nget_case_fold_codes_by_str(OnigCaseFoldType flag,\n\t\t\t   const OnigUChar* p, const OnigUChar* end,\n\t\t\t   OnigCaseFoldCodeItem items[])\n{\n  int len;\n  OnigCodePoint code, code_lo, code_up;\n\n  code = mbc_to_code(p, end);\n  if (ONIGENC_IS_ASCII_CODE(code))\n    return onigenc_ascii_get_case_fold_codes_by_str(flag, p, end, items);\n\n  len = mbc_enc_len(p);\n  code_lo = get_lower_case(code);\n  code_up = get_upper_case(code);\n\n  if (code != code_lo) {\n    items[0].byte_len = len;\n    items[0].code_len = 1;\n    items[0].code[0] = code_lo;\n    return 1;\n  }\n  else if (code != code_up) {\n    items[0].byte_len = len;\n    items[0].code_len = 1;\n    items[0].code[0] = code_up;\n    return 1;\n  }\n\n  return 0;\n}\n\nstatic int\nmbc_case_fold(OnigCaseFoldType flag ARG_UNUSED,\n\t      const UChar** pp, const UChar* end, UChar* lower)\n{\n  const UChar* p = *pp;\n\n  if (ONIGENC_IS_MBC_ASCII(p)) {\n    *lower = ONIGENC_ASCII_CODE_TO_LOWER_CASE(*p);\n    (*pp)++;\n    return 1;\n  }\n  else {\n    OnigCodePoint code;\n    int len;\n\n    code = get_lower_case(mbc_to_code(p, end));\n    len = code_to_mbc(code, lower);\n    (*pp) += len;\n    return len; /* return byte length of converted char to lower */\n  }\n}\n\nstatic int\nmbc_case_fold_se(OnigIterator* it, OnigCaseFoldType flag ARG_UNUSED,\n\t      OnigPosition* pp, OnigPosition end, UChar* lower)\n{\n  const UChar c = ONIG_CHARAT(*pp);\n\n  if (ONIGENC_IS_MBC_ASCII_SE(c)) {\n    *lower = ONIGENC_ASCII_CODE_TO_LOWER_CASE(c);\n    (*pp)++;\n    return 1;\n  }\n  else {\n    OnigCodePoint code;\n    int len;\n\n    code = get_lower_case(mbc_to_code_se(it, *pp, end));\n    len = code_to_mbc(code, lower);\n    (*pp) += len;\n    return len; /* return byte length of converted char to lower */\n  }\n}\n\n#if 0\nstatic int\nis_mbc_ambiguous(OnigCaseFoldType flag,\n\t\t const UChar** pp, const UChar* end)\n{\n  return onigenc_mbn_is_mbc_ambiguous(ONIG_ENCODING_SELF, flag, pp, end);\n}\n#endif\n\n#if 0\nstatic int\nis_code_ctype(OnigCodePoint code, unsigned int ctype)\n{\n  if (code < 128)\n    return ONIGENC_IS_ASCII_CODE_CTYPE(code, ctype);\n  else {\n    if (CTYPE_IS_WORD_GRAPH_PRINT(ctype)) {\n      return (code_to_mbclen(code) > 1 ? TRUE : FALSE);\n    }\n  }\n\n  return FALSE;\n}\n#endif\n\nstatic UChar*\nleft_adjust_char_head(const UChar* start, const UChar* s)\n{\n  const UChar *p;\n  int len;\n\n  if (s <= start) return (UChar* )s;\n  p = s;\n\n  if (SJIS_ISMB_TRAIL(*p)) {\n    while (p > start) {\n      if (! SJIS_ISMB_FIRST(*--p)) {\n\tp++;\n\tbreak;\n      }\n    }\n  }\n  len = mbc_enc_len(p);\n  if (p + len > s) return (UChar* )p;\n  p += len;\n  return (UChar* )(p + ((s - p) & ~1));\n}\n\nstatic OnigPosition\nleft_adjust_char_head_se(OnigIterator* it, OnigPosition start, OnigPosition s)\n{\n  OnigPosition p;\n  int len;\n\n  if (s <= start) return s;\n  p = s;\n\n  if (SJIS_ISMB_TRAIL(ONIG_CHARAT(p))) {\n    while (p > start) {\n      if (! SJIS_ISMB_FIRST(ONIG_CHARAT(--p))) {\n\tp++;\n\tbreak;\n      }\n    }\n  }\n  len = mbc_enc_len_se(it, p);\n  if (p + len > s) return p;\n  p += len;\n  return (p + ((s - p) & ~1));\n}\n\nstatic int\nis_allowed_reverse_match(const UChar* s, const UChar* end ARG_UNUSED)\n{\n  const UChar c = *s;\n  return (SJIS_ISMB_TRAIL(c) ? FALSE : TRUE);\n}\n\n\nstatic int PropertyInited = 0;\nstatic const OnigCodePoint** PropertyList;\nstatic int PropertyListNum;\nstatic int PropertyListSize;\nstatic hash_table_type* PropertyNameTable;\n\nstatic const OnigCodePoint CR_Hiragana[] = {\n  1,\n  0x829f, 0x82f1\n}; /* CR_Hiragana */\n\nstatic const OnigCodePoint CR_Katakana[] = {\n  4,\n  0x00a6, 0x00af,\n  0x00b1, 0x00dd,\n  0x8340, 0x837e,\n  0x8380, 0x8396,\n}; /* CR_Katakana */\n\n#ifdef ENC_CP932\nstatic const OnigCodePoint CR_Han[] = {\n  6,\n  0x8157, 0x8157,\n  0x889f, 0x9872,\t/* Kanji level 1 */\n  0x989f, 0x9ffc,\t/* Kanji level 2 */\n  0xe040, 0xeaa4,\t/* Kanji level 2 */\n  0xed40, 0xeeec,\t/* NEC-selected IBM extended characters (without symbols) */\n  0xfa5c, 0xfc4b,\t/* IBM extended characters (without symbols) */\n}; /* CR_Han */\n#else\nstatic const OnigCodePoint CR_Han[] = {\n  4,\n  0x8157, 0x8157,\n  0x889f, 0x9872,\t/* Kanji level 1 */\n  0x989f, 0x9ffc,\t/* Kanji level 2 */\n  0xe040, 0xeaa4,\t/* Kanji level 2 */\n}; /* CR_Han */\n#endif\n\nstatic const OnigCodePoint CR_Latin[] = {\n  4,\n  0x0041, 0x005a,\n  0x0061, 0x007a,\n  0x8260, 0x8279,\n  0x8281, 0x829a,\n}; /* CR_Latin */\n\nstatic const OnigCodePoint CR_Greek[] = {\n  2,\n  0x839f, 0x83b6,\n  0x83bf, 0x83d6,\n}; /* CR_Greek */\n\nstatic const OnigCodePoint CR_Cyrillic[] = {\n  3,\n  0x8440, 0x8460,\n  0x8470, 0x847f,\n  0x8480, 0x8491,\n}; /* CR_Cyrillic */\n\nstatic int\ninit_property_list(void)\n{\n  int r;\n\n  PROPERTY_LIST_ADD_PROP(\"hiragana\", CR_Hiragana);\n  PROPERTY_LIST_ADD_PROP(\"katakana\", CR_Katakana);\n  PROPERTY_LIST_ADD_PROP(\"han\", CR_Han);\n  PROPERTY_LIST_ADD_PROP(\"latin\", CR_Latin);\n  PROPERTY_LIST_ADD_PROP(\"greek\", CR_Greek);\n  PROPERTY_LIST_ADD_PROP(\"cyrillic\", CR_Cyrillic);\n  PropertyInited = 1;\n\n end:\n  return r;\n}\n\nstatic int\nproperty_name_to_ctype(OnigEncoding enc, UChar* p, UChar* end)\n{\n  hash_data_type ctype;\n  UChar *s, *e;\n\n  PROPERTY_LIST_INIT_CHECK;\n\n  s = e = xalloca(end - p + 1);\n  for (; p < end; p++) {\n    *e++ = ONIGENC_ASCII_CODE_TO_LOWER_CASE(*p);\n  }\n\n  if (onig_st_lookup_strend(PropertyNameTable, s, e, &ctype) == 0) {\n    return onigenc_minimum_property_name_to_ctype(enc, s, e);\n  }\n\n  return (int )ctype;\n}\n\nstatic int\nis_code_ctype(OnigCodePoint code, unsigned int ctype)\n{\n  if (ctype <= ONIGENC_MAX_STD_CTYPE) {\n    if (code < 128)\n      return ONIGENC_IS_ASCII_CODE_CTYPE(code, ctype);\n    else {\n      if (CTYPE_IS_WORD_GRAPH_PRINT(ctype)) {\n\treturn (code_to_mbclen(code) > 1 ? TRUE : FALSE);\n      }\n    }\n  }\n  else {\n    PROPERTY_LIST_INIT_CHECK;\n\n    ctype -= (ONIGENC_MAX_STD_CTYPE + 1);\n    if (ctype >= (unsigned int )PropertyListNum)\n      return ONIGERR_TYPE_BUG;\n\n    return onig_is_in_code_range((UChar* )PropertyList[ctype], code);\n  }\n\n  return FALSE;\n}\n\nstatic int\nget_ctype_code_range(OnigCtype ctype, OnigCodePoint* sb_out,\n\t\t     const OnigCodePoint* ranges[])\n{\n  if (ctype <= ONIGENC_MAX_STD_CTYPE) {\n    return ONIG_NO_SUPPORT_CONFIG;\n  }\n  else {\n    *sb_out = 0x80;\n\n    PROPERTY_LIST_INIT_CHECK;\n\n    ctype -= (ONIGENC_MAX_STD_CTYPE + 1);\n    if (ctype >= (OnigCtype )PropertyListNum)\n      return ONIGERR_TYPE_BUG;\n\n    *ranges = PropertyList[ctype];\n    return 0;\n  }\n}\n\n#ifdef ENC_CP932\nOnigEncodingType OnigEncodingCP932 = {\n  mbc_enc_len,\n  mbc_enc_len_se,\n  \"CP932\",       /* name */\n  2,             /* max byte length */\n  1,             /* min byte length */\n  onigenc_is_mbc_newline_0x0a,\n  onigenc_is_mbc_newline_0x0a_se,\n  mbc_to_code,\n  mbc_to_code_se,\n  code_to_mbclen,\n  code_to_mbc,\n  mbc_case_fold,\n  mbc_case_fold_se,\n  apply_all_case_fold,\n  get_case_fold_codes_by_str,\n  property_name_to_ctype,\n  is_code_ctype,\n  get_ctype_code_range,\n  left_adjust_char_head,\n  left_adjust_char_head_se,\n  is_allowed_reverse_match,\n  ONIGENC_FLAG_NONE,\n};\n#else\nOnigEncodingType OnigEncodingSJIS = {\n  mbc_enc_len,\n  mbc_enc_len_se,\n  \"Shift_JIS\",   /* name */\n  2,             /* max byte length */\n  1,             /* min byte length */\n  onigenc_is_mbc_newline_0x0a,\n  onigenc_is_mbc_newline_0x0a_se,\n  mbc_to_code,\n  mbc_to_code_se,\n  code_to_mbclen,\n  code_to_mbc,\n  mbc_case_fold,\n  mbc_case_fold_se,\n  apply_all_case_fold,\n  get_case_fold_codes_by_str,\n  property_name_to_ctype,\n  is_code_ctype,\n  get_ctype_code_range,\n  left_adjust_char_head,\n  left_adjust_char_head_se,\n  is_allowed_reverse_match,\n  ONIGENC_FLAG_NONE,\n};\n#endif\n"
  },
  {
    "path": "src/Onigmo/enc/unicode/casefold.h",
    "content": "/* DO NOT EDIT THIS FILE. */\n/* Generated by tool/CaseFolding.py */\n\nstatic const CaseFold_11_Type CaseFold[] = {\n { 0x0041, {1, {0x0061}}},\n { 0x0042, {1, {0x0062}}},\n { 0x0043, {1, {0x0063}}},\n { 0x0044, {1, {0x0064}}},\n { 0x0045, {1, {0x0065}}},\n { 0x0046, {1, {0x0066}}},\n { 0x0047, {1, {0x0067}}},\n { 0x0048, {1, {0x0068}}},\n { 0x004a, {1, {0x006a}}},\n { 0x004b, {1, {0x006b}}},\n { 0x004c, {1, {0x006c}}},\n { 0x004d, {1, {0x006d}}},\n { 0x004e, {1, {0x006e}}},\n { 0x004f, {1, {0x006f}}},\n { 0x0050, {1, {0x0070}}},\n { 0x0051, {1, {0x0071}}},\n { 0x0052, {1, {0x0072}}},\n { 0x0053, {1, {0x0073}}},\n { 0x0054, {1, {0x0074}}},\n { 0x0055, {1, {0x0075}}},\n { 0x0056, {1, {0x0076}}},\n { 0x0057, {1, {0x0077}}},\n { 0x0058, {1, {0x0078}}},\n { 0x0059, {1, {0x0079}}},\n { 0x005a, {1, {0x007a}}},\n { 0x00b5, {1, {0x03bc}}},\n { 0x00c0, {1, {0x00e0}}},\n { 0x00c1, {1, {0x00e1}}},\n { 0x00c2, {1, {0x00e2}}},\n { 0x00c3, {1, {0x00e3}}},\n { 0x00c4, {1, {0x00e4}}},\n { 0x00c5, {1, {0x00e5}}},\n { 0x00c6, {1, {0x00e6}}},\n { 0x00c7, {1, {0x00e7}}},\n { 0x00c8, {1, {0x00e8}}},\n { 0x00c9, {1, {0x00e9}}},\n { 0x00ca, {1, {0x00ea}}},\n { 0x00cb, {1, {0x00eb}}},\n { 0x00cc, {1, {0x00ec}}},\n { 0x00cd, {1, {0x00ed}}},\n { 0x00ce, {1, {0x00ee}}},\n { 0x00cf, {1, {0x00ef}}},\n { 0x00d0, {1, {0x00f0}}},\n { 0x00d1, {1, {0x00f1}}},\n { 0x00d2, {1, {0x00f2}}},\n { 0x00d3, {1, {0x00f3}}},\n { 0x00d4, {1, {0x00f4}}},\n { 0x00d5, {1, {0x00f5}}},\n { 0x00d6, {1, {0x00f6}}},\n { 0x00d8, {1, {0x00f8}}},\n { 0x00d9, {1, {0x00f9}}},\n { 0x00da, {1, {0x00fa}}},\n { 0x00db, {1, {0x00fb}}},\n { 0x00dc, {1, {0x00fc}}},\n { 0x00dd, {1, {0x00fd}}},\n { 0x00de, {1, {0x00fe}}},\n { 0x00df, {2, {0x0073, 0x0073}}},\n { 0x0100, {1, {0x0101}}},\n { 0x0102, {1, {0x0103}}},\n { 0x0104, {1, {0x0105}}},\n { 0x0106, {1, {0x0107}}},\n { 0x0108, {1, {0x0109}}},\n { 0x010a, {1, {0x010b}}},\n { 0x010c, {1, {0x010d}}},\n { 0x010e, {1, {0x010f}}},\n { 0x0110, {1, {0x0111}}},\n { 0x0112, {1, {0x0113}}},\n { 0x0114, {1, {0x0115}}},\n { 0x0116, {1, {0x0117}}},\n { 0x0118, {1, {0x0119}}},\n { 0x011a, {1, {0x011b}}},\n { 0x011c, {1, {0x011d}}},\n { 0x011e, {1, {0x011f}}},\n { 0x0120, {1, {0x0121}}},\n { 0x0122, {1, {0x0123}}},\n { 0x0124, {1, {0x0125}}},\n { 0x0126, {1, {0x0127}}},\n { 0x0128, {1, {0x0129}}},\n { 0x012a, {1, {0x012b}}},\n { 0x012c, {1, {0x012d}}},\n { 0x012e, {1, {0x012f}}},\n { 0x0132, {1, {0x0133}}},\n { 0x0134, {1, {0x0135}}},\n { 0x0136, {1, {0x0137}}},\n { 0x0139, {1, {0x013a}}},\n { 0x013b, {1, {0x013c}}},\n { 0x013d, {1, {0x013e}}},\n { 0x013f, {1, {0x0140}}},\n { 0x0141, {1, {0x0142}}},\n { 0x0143, {1, {0x0144}}},\n { 0x0145, {1, {0x0146}}},\n { 0x0147, {1, {0x0148}}},\n { 0x0149, {2, {0x02bc, 0x006e}}},\n { 0x014a, {1, {0x014b}}},\n { 0x014c, {1, {0x014d}}},\n { 0x014e, {1, {0x014f}}},\n { 0x0150, {1, {0x0151}}},\n { 0x0152, {1, {0x0153}}},\n { 0x0154, {1, {0x0155}}},\n { 0x0156, {1, {0x0157}}},\n { 0x0158, {1, {0x0159}}},\n { 0x015a, {1, {0x015b}}},\n { 0x015c, {1, {0x015d}}},\n { 0x015e, {1, {0x015f}}},\n { 0x0160, {1, {0x0161}}},\n { 0x0162, {1, {0x0163}}},\n { 0x0164, {1, {0x0165}}},\n { 0x0166, {1, {0x0167}}},\n { 0x0168, {1, {0x0169}}},\n { 0x016a, {1, {0x016b}}},\n { 0x016c, {1, {0x016d}}},\n { 0x016e, {1, {0x016f}}},\n { 0x0170, {1, {0x0171}}},\n { 0x0172, {1, {0x0173}}},\n { 0x0174, {1, {0x0175}}},\n { 0x0176, {1, {0x0177}}},\n { 0x0178, {1, {0x00ff}}},\n { 0x0179, {1, {0x017a}}},\n { 0x017b, {1, {0x017c}}},\n { 0x017d, {1, {0x017e}}},\n { 0x017f, {1, {0x0073}}},\n { 0x0181, {1, {0x0253}}},\n { 0x0182, {1, {0x0183}}},\n { 0x0184, {1, {0x0185}}},\n { 0x0186, {1, {0x0254}}},\n { 0x0187, {1, {0x0188}}},\n { 0x0189, {1, {0x0256}}},\n { 0x018a, {1, {0x0257}}},\n { 0x018b, {1, {0x018c}}},\n { 0x018e, {1, {0x01dd}}},\n { 0x018f, {1, {0x0259}}},\n { 0x0190, {1, {0x025b}}},\n { 0x0191, {1, {0x0192}}},\n { 0x0193, {1, {0x0260}}},\n { 0x0194, {1, {0x0263}}},\n { 0x0196, {1, {0x0269}}},\n { 0x0197, {1, {0x0268}}},\n { 0x0198, {1, {0x0199}}},\n { 0x019c, {1, {0x026f}}},\n { 0x019d, {1, {0x0272}}},\n { 0x019f, {1, {0x0275}}},\n { 0x01a0, {1, {0x01a1}}},\n { 0x01a2, {1, {0x01a3}}},\n { 0x01a4, {1, {0x01a5}}},\n { 0x01a6, {1, {0x0280}}},\n { 0x01a7, {1, {0x01a8}}},\n { 0x01a9, {1, {0x0283}}},\n { 0x01ac, {1, {0x01ad}}},\n { 0x01ae, {1, {0x0288}}},\n { 0x01af, {1, {0x01b0}}},\n { 0x01b1, {1, {0x028a}}},\n { 0x01b2, {1, {0x028b}}},\n { 0x01b3, {1, {0x01b4}}},\n { 0x01b5, {1, {0x01b6}}},\n { 0x01b7, {1, {0x0292}}},\n { 0x01b8, {1, {0x01b9}}},\n { 0x01bc, {1, {0x01bd}}},\n { 0x01c4, {1, {0x01c6}}},\n { 0x01c5, {1, {0x01c6}}},\n { 0x01c7, {1, {0x01c9}}},\n { 0x01c8, {1, {0x01c9}}},\n { 0x01ca, {1, {0x01cc}}},\n { 0x01cb, {1, {0x01cc}}},\n { 0x01cd, {1, {0x01ce}}},\n { 0x01cf, {1, {0x01d0}}},\n { 0x01d1, {1, {0x01d2}}},\n { 0x01d3, {1, {0x01d4}}},\n { 0x01d5, {1, {0x01d6}}},\n { 0x01d7, {1, {0x01d8}}},\n { 0x01d9, {1, {0x01da}}},\n { 0x01db, {1, {0x01dc}}},\n { 0x01de, {1, {0x01df}}},\n { 0x01e0, {1, {0x01e1}}},\n { 0x01e2, {1, {0x01e3}}},\n { 0x01e4, {1, {0x01e5}}},\n { 0x01e6, {1, {0x01e7}}},\n { 0x01e8, {1, {0x01e9}}},\n { 0x01ea, {1, {0x01eb}}},\n { 0x01ec, {1, {0x01ed}}},\n { 0x01ee, {1, {0x01ef}}},\n { 0x01f0, {2, {0x006a, 0x030c}}},\n { 0x01f1, {1, {0x01f3}}},\n { 0x01f2, {1, {0x01f3}}},\n { 0x01f4, {1, {0x01f5}}},\n { 0x01f6, {1, {0x0195}}},\n { 0x01f7, {1, {0x01bf}}},\n { 0x01f8, {1, {0x01f9}}},\n { 0x01fa, {1, {0x01fb}}},\n { 0x01fc, {1, {0x01fd}}},\n { 0x01fe, {1, {0x01ff}}},\n { 0x0200, {1, {0x0201}}},\n { 0x0202, {1, {0x0203}}},\n { 0x0204, {1, {0x0205}}},\n { 0x0206, {1, {0x0207}}},\n { 0x0208, {1, {0x0209}}},\n { 0x020a, {1, {0x020b}}},\n { 0x020c, {1, {0x020d}}},\n { 0x020e, {1, {0x020f}}},\n { 0x0210, {1, {0x0211}}},\n { 0x0212, {1, {0x0213}}},\n { 0x0214, {1, {0x0215}}},\n { 0x0216, {1, {0x0217}}},\n { 0x0218, {1, {0x0219}}},\n { 0x021a, {1, {0x021b}}},\n { 0x021c, {1, {0x021d}}},\n { 0x021e, {1, {0x021f}}},\n { 0x0220, {1, {0x019e}}},\n { 0x0222, {1, {0x0223}}},\n { 0x0224, {1, {0x0225}}},\n { 0x0226, {1, {0x0227}}},\n { 0x0228, {1, {0x0229}}},\n { 0x022a, {1, {0x022b}}},\n { 0x022c, {1, {0x022d}}},\n { 0x022e, {1, {0x022f}}},\n { 0x0230, {1, {0x0231}}},\n { 0x0232, {1, {0x0233}}},\n { 0x023a, {1, {0x2c65}}},\n { 0x023b, {1, {0x023c}}},\n { 0x023d, {1, {0x019a}}},\n { 0x023e, {1, {0x2c66}}},\n { 0x0241, {1, {0x0242}}},\n { 0x0243, {1, {0x0180}}},\n { 0x0244, {1, {0x0289}}},\n { 0x0245, {1, {0x028c}}},\n { 0x0246, {1, {0x0247}}},\n { 0x0248, {1, {0x0249}}},\n { 0x024a, {1, {0x024b}}},\n { 0x024c, {1, {0x024d}}},\n { 0x024e, {1, {0x024f}}},\n { 0x0345, {1, {0x03b9}}},\n { 0x0370, {1, {0x0371}}},\n { 0x0372, {1, {0x0373}}},\n { 0x0376, {1, {0x0377}}},\n { 0x0386, {1, {0x03ac}}},\n { 0x0388, {1, {0x03ad}}},\n { 0x0389, {1, {0x03ae}}},\n { 0x038a, {1, {0x03af}}},\n { 0x038c, {1, {0x03cc}}},\n { 0x038e, {1, {0x03cd}}},\n { 0x038f, {1, {0x03ce}}},\n { 0x0390, {3, {0x03b9, 0x0308, 0x0301}}},\n { 0x0391, {1, {0x03b1}}},\n { 0x0392, {1, {0x03b2}}},\n { 0x0393, {1, {0x03b3}}},\n { 0x0394, {1, {0x03b4}}},\n { 0x0395, {1, {0x03b5}}},\n { 0x0396, {1, {0x03b6}}},\n { 0x0397, {1, {0x03b7}}},\n { 0x0398, {1, {0x03b8}}},\n { 0x0399, {1, {0x03b9}}},\n { 0x039a, {1, {0x03ba}}},\n { 0x039b, {1, {0x03bb}}},\n { 0x039c, {1, {0x03bc}}},\n { 0x039d, {1, {0x03bd}}},\n { 0x039e, {1, {0x03be}}},\n { 0x039f, {1, {0x03bf}}},\n { 0x03a0, {1, {0x03c0}}},\n { 0x03a1, {1, {0x03c1}}},\n { 0x03a3, {1, {0x03c3}}},\n { 0x03a4, {1, {0x03c4}}},\n { 0x03a5, {1, {0x03c5}}},\n { 0x03a6, {1, {0x03c6}}},\n { 0x03a7, {1, {0x03c7}}},\n { 0x03a8, {1, {0x03c8}}},\n { 0x03a9, {1, {0x03c9}}},\n { 0x03aa, {1, {0x03ca}}},\n { 0x03ab, {1, {0x03cb}}},\n { 0x03b0, {3, {0x03c5, 0x0308, 0x0301}}},\n { 0x03c2, {1, {0x03c3}}},\n { 0x03cf, {1, {0x03d7}}},\n { 0x03d0, {1, {0x03b2}}},\n { 0x03d1, {1, {0x03b8}}},\n { 0x03d5, {1, {0x03c6}}},\n { 0x03d6, {1, {0x03c0}}},\n { 0x03d8, {1, {0x03d9}}},\n { 0x03da, {1, {0x03db}}},\n { 0x03dc, {1, {0x03dd}}},\n { 0x03de, {1, {0x03df}}},\n { 0x03e0, {1, {0x03e1}}},\n { 0x03e2, {1, {0x03e3}}},\n { 0x03e4, {1, {0x03e5}}},\n { 0x03e6, {1, {0x03e7}}},\n { 0x03e8, {1, {0x03e9}}},\n { 0x03ea, {1, {0x03eb}}},\n { 0x03ec, {1, {0x03ed}}},\n { 0x03ee, {1, {0x03ef}}},\n { 0x03f0, {1, {0x03ba}}},\n { 0x03f1, {1, {0x03c1}}},\n { 0x03f4, {1, {0x03b8}}},\n { 0x03f5, {1, {0x03b5}}},\n { 0x03f7, {1, {0x03f8}}},\n { 0x03f9, {1, {0x03f2}}},\n { 0x03fa, {1, {0x03fb}}},\n { 0x03fd, {1, {0x037b}}},\n { 0x03fe, {1, {0x037c}}},\n { 0x03ff, {1, {0x037d}}},\n { 0x0400, {1, {0x0450}}},\n { 0x0401, {1, {0x0451}}},\n { 0x0402, {1, {0x0452}}},\n { 0x0403, {1, {0x0453}}},\n { 0x0404, {1, {0x0454}}},\n { 0x0405, {1, {0x0455}}},\n { 0x0406, {1, {0x0456}}},\n { 0x0407, {1, {0x0457}}},\n { 0x0408, {1, {0x0458}}},\n { 0x0409, {1, {0x0459}}},\n { 0x040a, {1, {0x045a}}},\n { 0x040b, {1, {0x045b}}},\n { 0x040c, {1, {0x045c}}},\n { 0x040d, {1, {0x045d}}},\n { 0x040e, {1, {0x045e}}},\n { 0x040f, {1, {0x045f}}},\n { 0x0410, {1, {0x0430}}},\n { 0x0411, {1, {0x0431}}},\n { 0x0412, {1, {0x0432}}},\n { 0x0413, {1, {0x0433}}},\n { 0x0414, {1, {0x0434}}},\n { 0x0415, {1, {0x0435}}},\n { 0x0416, {1, {0x0436}}},\n { 0x0417, {1, {0x0437}}},\n { 0x0418, {1, {0x0438}}},\n { 0x0419, {1, {0x0439}}},\n { 0x041a, {1, {0x043a}}},\n { 0x041b, {1, {0x043b}}},\n { 0x041c, {1, {0x043c}}},\n { 0x041d, {1, {0x043d}}},\n { 0x041e, {1, {0x043e}}},\n { 0x041f, {1, {0x043f}}},\n { 0x0420, {1, {0x0440}}},\n { 0x0421, {1, {0x0441}}},\n { 0x0422, {1, {0x0442}}},\n { 0x0423, {1, {0x0443}}},\n { 0x0424, {1, {0x0444}}},\n { 0x0425, {1, {0x0445}}},\n { 0x0426, {1, {0x0446}}},\n { 0x0427, {1, {0x0447}}},\n { 0x0428, {1, {0x0448}}},\n { 0x0429, {1, {0x0449}}},\n { 0x042a, {1, {0x044a}}},\n { 0x042b, {1, {0x044b}}},\n { 0x042c, {1, {0x044c}}},\n { 0x042d, {1, {0x044d}}},\n { 0x042e, {1, {0x044e}}},\n { 0x042f, {1, {0x044f}}},\n { 0x0460, {1, {0x0461}}},\n { 0x0462, {1, {0x0463}}},\n { 0x0464, {1, {0x0465}}},\n { 0x0466, {1, {0x0467}}},\n { 0x0468, {1, {0x0469}}},\n { 0x046a, {1, {0x046b}}},\n { 0x046c, {1, {0x046d}}},\n { 0x046e, {1, {0x046f}}},\n { 0x0470, {1, {0x0471}}},\n { 0x0472, {1, {0x0473}}},\n { 0x0474, {1, {0x0475}}},\n { 0x0476, {1, {0x0477}}},\n { 0x0478, {1, {0x0479}}},\n { 0x047a, {1, {0x047b}}},\n { 0x047c, {1, {0x047d}}},\n { 0x047e, {1, {0x047f}}},\n { 0x0480, {1, {0x0481}}},\n { 0x048a, {1, {0x048b}}},\n { 0x048c, {1, {0x048d}}},\n { 0x048e, {1, {0x048f}}},\n { 0x0490, {1, {0x0491}}},\n { 0x0492, {1, {0x0493}}},\n { 0x0494, {1, {0x0495}}},\n { 0x0496, {1, {0x0497}}},\n { 0x0498, {1, {0x0499}}},\n { 0x049a, {1, {0x049b}}},\n { 0x049c, {1, {0x049d}}},\n { 0x049e, {1, {0x049f}}},\n { 0x04a0, {1, {0x04a1}}},\n { 0x04a2, {1, {0x04a3}}},\n { 0x04a4, {1, {0x04a5}}},\n { 0x04a6, {1, {0x04a7}}},\n { 0x04a8, {1, {0x04a9}}},\n { 0x04aa, {1, {0x04ab}}},\n { 0x04ac, {1, {0x04ad}}},\n { 0x04ae, {1, {0x04af}}},\n { 0x04b0, {1, {0x04b1}}},\n { 0x04b2, {1, {0x04b3}}},\n { 0x04b4, {1, {0x04b5}}},\n { 0x04b6, {1, {0x04b7}}},\n { 0x04b8, {1, {0x04b9}}},\n { 0x04ba, {1, {0x04bb}}},\n { 0x04bc, {1, {0x04bd}}},\n { 0x04be, {1, {0x04bf}}},\n { 0x04c0, {1, {0x04cf}}},\n { 0x04c1, {1, {0x04c2}}},\n { 0x04c3, {1, {0x04c4}}},\n { 0x04c5, {1, {0x04c6}}},\n { 0x04c7, {1, {0x04c8}}},\n { 0x04c9, {1, {0x04ca}}},\n { 0x04cb, {1, {0x04cc}}},\n { 0x04cd, {1, {0x04ce}}},\n { 0x04d0, {1, {0x04d1}}},\n { 0x04d2, {1, {0x04d3}}},\n { 0x04d4, {1, {0x04d5}}},\n { 0x04d6, {1, {0x04d7}}},\n { 0x04d8, {1, {0x04d9}}},\n { 0x04da, {1, {0x04db}}},\n { 0x04dc, {1, {0x04dd}}},\n { 0x04de, {1, {0x04df}}},\n { 0x04e0, {1, {0x04e1}}},\n { 0x04e2, {1, {0x04e3}}},\n { 0x04e4, {1, {0x04e5}}},\n { 0x04e6, {1, {0x04e7}}},\n { 0x04e8, {1, {0x04e9}}},\n { 0x04ea, {1, {0x04eb}}},\n { 0x04ec, {1, {0x04ed}}},\n { 0x04ee, {1, {0x04ef}}},\n { 0x04f0, {1, {0x04f1}}},\n { 0x04f2, {1, {0x04f3}}},\n { 0x04f4, {1, {0x04f5}}},\n { 0x04f6, {1, {0x04f7}}},\n { 0x04f8, {1, {0x04f9}}},\n { 0x04fa, {1, {0x04fb}}},\n { 0x04fc, {1, {0x04fd}}},\n { 0x04fe, {1, {0x04ff}}},\n { 0x0500, {1, {0x0501}}},\n { 0x0502, {1, {0x0503}}},\n { 0x0504, {1, {0x0505}}},\n { 0x0506, {1, {0x0507}}},\n { 0x0508, {1, {0x0509}}},\n { 0x050a, {1, {0x050b}}},\n { 0x050c, {1, {0x050d}}},\n { 0x050e, {1, {0x050f}}},\n { 0x0510, {1, {0x0511}}},\n { 0x0512, {1, {0x0513}}},\n { 0x0514, {1, {0x0515}}},\n { 0x0516, {1, {0x0517}}},\n { 0x0518, {1, {0x0519}}},\n { 0x051a, {1, {0x051b}}},\n { 0x051c, {1, {0x051d}}},\n { 0x051e, {1, {0x051f}}},\n { 0x0520, {1, {0x0521}}},\n { 0x0522, {1, {0x0523}}},\n { 0x0524, {1, {0x0525}}},\n { 0x0526, {1, {0x0527}}},\n { 0x0531, {1, {0x0561}}},\n { 0x0532, {1, {0x0562}}},\n { 0x0533, {1, {0x0563}}},\n { 0x0534, {1, {0x0564}}},\n { 0x0535, {1, {0x0565}}},\n { 0x0536, {1, {0x0566}}},\n { 0x0537, {1, {0x0567}}},\n { 0x0538, {1, {0x0568}}},\n { 0x0539, {1, {0x0569}}},\n { 0x053a, {1, {0x056a}}},\n { 0x053b, {1, {0x056b}}},\n { 0x053c, {1, {0x056c}}},\n { 0x053d, {1, {0x056d}}},\n { 0x053e, {1, {0x056e}}},\n { 0x053f, {1, {0x056f}}},\n { 0x0540, {1, {0x0570}}},\n { 0x0541, {1, {0x0571}}},\n { 0x0542, {1, {0x0572}}},\n { 0x0543, {1, {0x0573}}},\n { 0x0544, {1, {0x0574}}},\n { 0x0545, {1, {0x0575}}},\n { 0x0546, {1, {0x0576}}},\n { 0x0547, {1, {0x0577}}},\n { 0x0548, {1, {0x0578}}},\n { 0x0549, {1, {0x0579}}},\n { 0x054a, {1, {0x057a}}},\n { 0x054b, {1, {0x057b}}},\n { 0x054c, {1, {0x057c}}},\n { 0x054d, {1, {0x057d}}},\n { 0x054e, {1, {0x057e}}},\n { 0x054f, {1, {0x057f}}},\n { 0x0550, {1, {0x0580}}},\n { 0x0551, {1, {0x0581}}},\n { 0x0552, {1, {0x0582}}},\n { 0x0553, {1, {0x0583}}},\n { 0x0554, {1, {0x0584}}},\n { 0x0555, {1, {0x0585}}},\n { 0x0556, {1, {0x0586}}},\n { 0x0587, {2, {0x0565, 0x0582}}},\n { 0x10a0, {1, {0x2d00}}},\n { 0x10a1, {1, {0x2d01}}},\n { 0x10a2, {1, {0x2d02}}},\n { 0x10a3, {1, {0x2d03}}},\n { 0x10a4, {1, {0x2d04}}},\n { 0x10a5, {1, {0x2d05}}},\n { 0x10a6, {1, {0x2d06}}},\n { 0x10a7, {1, {0x2d07}}},\n { 0x10a8, {1, {0x2d08}}},\n { 0x10a9, {1, {0x2d09}}},\n { 0x10aa, {1, {0x2d0a}}},\n { 0x10ab, {1, {0x2d0b}}},\n { 0x10ac, {1, {0x2d0c}}},\n { 0x10ad, {1, {0x2d0d}}},\n { 0x10ae, {1, {0x2d0e}}},\n { 0x10af, {1, {0x2d0f}}},\n { 0x10b0, {1, {0x2d10}}},\n { 0x10b1, {1, {0x2d11}}},\n { 0x10b2, {1, {0x2d12}}},\n { 0x10b3, {1, {0x2d13}}},\n { 0x10b4, {1, {0x2d14}}},\n { 0x10b5, {1, {0x2d15}}},\n { 0x10b6, {1, {0x2d16}}},\n { 0x10b7, {1, {0x2d17}}},\n { 0x10b8, {1, {0x2d18}}},\n { 0x10b9, {1, {0x2d19}}},\n { 0x10ba, {1, {0x2d1a}}},\n { 0x10bb, {1, {0x2d1b}}},\n { 0x10bc, {1, {0x2d1c}}},\n { 0x10bd, {1, {0x2d1d}}},\n { 0x10be, {1, {0x2d1e}}},\n { 0x10bf, {1, {0x2d1f}}},\n { 0x10c0, {1, {0x2d20}}},\n { 0x10c1, {1, {0x2d21}}},\n { 0x10c2, {1, {0x2d22}}},\n { 0x10c3, {1, {0x2d23}}},\n { 0x10c4, {1, {0x2d24}}},\n { 0x10c5, {1, {0x2d25}}},\n { 0x10c7, {1, {0x2d27}}},\n { 0x10cd, {1, {0x2d2d}}},\n { 0x1e00, {1, {0x1e01}}},\n { 0x1e02, {1, {0x1e03}}},\n { 0x1e04, {1, {0x1e05}}},\n { 0x1e06, {1, {0x1e07}}},\n { 0x1e08, {1, {0x1e09}}},\n { 0x1e0a, {1, {0x1e0b}}},\n { 0x1e0c, {1, {0x1e0d}}},\n { 0x1e0e, {1, {0x1e0f}}},\n { 0x1e10, {1, {0x1e11}}},\n { 0x1e12, {1, {0x1e13}}},\n { 0x1e14, {1, {0x1e15}}},\n { 0x1e16, {1, {0x1e17}}},\n { 0x1e18, {1, {0x1e19}}},\n { 0x1e1a, {1, {0x1e1b}}},\n { 0x1e1c, {1, {0x1e1d}}},\n { 0x1e1e, {1, {0x1e1f}}},\n { 0x1e20, {1, {0x1e21}}},\n { 0x1e22, {1, {0x1e23}}},\n { 0x1e24, {1, {0x1e25}}},\n { 0x1e26, {1, {0x1e27}}},\n { 0x1e28, {1, {0x1e29}}},\n { 0x1e2a, {1, {0x1e2b}}},\n { 0x1e2c, {1, {0x1e2d}}},\n { 0x1e2e, {1, {0x1e2f}}},\n { 0x1e30, {1, {0x1e31}}},\n { 0x1e32, {1, {0x1e33}}},\n { 0x1e34, {1, {0x1e35}}},\n { 0x1e36, {1, {0x1e37}}},\n { 0x1e38, {1, {0x1e39}}},\n { 0x1e3a, {1, {0x1e3b}}},\n { 0x1e3c, {1, {0x1e3d}}},\n { 0x1e3e, {1, {0x1e3f}}},\n { 0x1e40, {1, {0x1e41}}},\n { 0x1e42, {1, {0x1e43}}},\n { 0x1e44, {1, {0x1e45}}},\n { 0x1e46, {1, {0x1e47}}},\n { 0x1e48, {1, {0x1e49}}},\n { 0x1e4a, {1, {0x1e4b}}},\n { 0x1e4c, {1, {0x1e4d}}},\n { 0x1e4e, {1, {0x1e4f}}},\n { 0x1e50, {1, {0x1e51}}},\n { 0x1e52, {1, {0x1e53}}},\n { 0x1e54, {1, {0x1e55}}},\n { 0x1e56, {1, {0x1e57}}},\n { 0x1e58, {1, {0x1e59}}},\n { 0x1e5a, {1, {0x1e5b}}},\n { 0x1e5c, {1, {0x1e5d}}},\n { 0x1e5e, {1, {0x1e5f}}},\n { 0x1e60, {1, {0x1e61}}},\n { 0x1e62, {1, {0x1e63}}},\n { 0x1e64, {1, {0x1e65}}},\n { 0x1e66, {1, {0x1e67}}},\n { 0x1e68, {1, {0x1e69}}},\n { 0x1e6a, {1, {0x1e6b}}},\n { 0x1e6c, {1, {0x1e6d}}},\n { 0x1e6e, {1, {0x1e6f}}},\n { 0x1e70, {1, {0x1e71}}},\n { 0x1e72, {1, {0x1e73}}},\n { 0x1e74, {1, {0x1e75}}},\n { 0x1e76, {1, {0x1e77}}},\n { 0x1e78, {1, {0x1e79}}},\n { 0x1e7a, {1, {0x1e7b}}},\n { 0x1e7c, {1, {0x1e7d}}},\n { 0x1e7e, {1, {0x1e7f}}},\n { 0x1e80, {1, {0x1e81}}},\n { 0x1e82, {1, {0x1e83}}},\n { 0x1e84, {1, {0x1e85}}},\n { 0x1e86, {1, {0x1e87}}},\n { 0x1e88, {1, {0x1e89}}},\n { 0x1e8a, {1, {0x1e8b}}},\n { 0x1e8c, {1, {0x1e8d}}},\n { 0x1e8e, {1, {0x1e8f}}},\n { 0x1e90, {1, {0x1e91}}},\n { 0x1e92, {1, {0x1e93}}},\n { 0x1e94, {1, {0x1e95}}},\n { 0x1e96, {2, {0x0068, 0x0331}}},\n { 0x1e97, {2, {0x0074, 0x0308}}},\n { 0x1e98, {2, {0x0077, 0x030a}}},\n { 0x1e99, {2, {0x0079, 0x030a}}},\n { 0x1e9a, {2, {0x0061, 0x02be}}},\n { 0x1e9b, {1, {0x1e61}}},\n { 0x1e9e, {2, {0x0073, 0x0073}}},\n { 0x1ea0, {1, {0x1ea1}}},\n { 0x1ea2, {1, {0x1ea3}}},\n { 0x1ea4, {1, {0x1ea5}}},\n { 0x1ea6, {1, {0x1ea7}}},\n { 0x1ea8, {1, {0x1ea9}}},\n { 0x1eaa, {1, {0x1eab}}},\n { 0x1eac, {1, {0x1ead}}},\n { 0x1eae, {1, {0x1eaf}}},\n { 0x1eb0, {1, {0x1eb1}}},\n { 0x1eb2, {1, {0x1eb3}}},\n { 0x1eb4, {1, {0x1eb5}}},\n { 0x1eb6, {1, {0x1eb7}}},\n { 0x1eb8, {1, {0x1eb9}}},\n { 0x1eba, {1, {0x1ebb}}},\n { 0x1ebc, {1, {0x1ebd}}},\n { 0x1ebe, {1, {0x1ebf}}},\n { 0x1ec0, {1, {0x1ec1}}},\n { 0x1ec2, {1, {0x1ec3}}},\n { 0x1ec4, {1, {0x1ec5}}},\n { 0x1ec6, {1, {0x1ec7}}},\n { 0x1ec8, {1, {0x1ec9}}},\n { 0x1eca, {1, {0x1ecb}}},\n { 0x1ecc, {1, {0x1ecd}}},\n { 0x1ece, {1, {0x1ecf}}},\n { 0x1ed0, {1, {0x1ed1}}},\n { 0x1ed2, {1, {0x1ed3}}},\n { 0x1ed4, {1, {0x1ed5}}},\n { 0x1ed6, {1, {0x1ed7}}},\n { 0x1ed8, {1, {0x1ed9}}},\n { 0x1eda, {1, {0x1edb}}},\n { 0x1edc, {1, {0x1edd}}},\n { 0x1ede, {1, {0x1edf}}},\n { 0x1ee0, {1, {0x1ee1}}},\n { 0x1ee2, {1, {0x1ee3}}},\n { 0x1ee4, {1, {0x1ee5}}},\n { 0x1ee6, {1, {0x1ee7}}},\n { 0x1ee8, {1, {0x1ee9}}},\n { 0x1eea, {1, {0x1eeb}}},\n { 0x1eec, {1, {0x1eed}}},\n { 0x1eee, {1, {0x1eef}}},\n { 0x1ef0, {1, {0x1ef1}}},\n { 0x1ef2, {1, {0x1ef3}}},\n { 0x1ef4, {1, {0x1ef5}}},\n { 0x1ef6, {1, {0x1ef7}}},\n { 0x1ef8, {1, {0x1ef9}}},\n { 0x1efa, {1, {0x1efb}}},\n { 0x1efc, {1, {0x1efd}}},\n { 0x1efe, {1, {0x1eff}}},\n { 0x1f08, {1, {0x1f00}}},\n { 0x1f09, {1, {0x1f01}}},\n { 0x1f0a, {1, {0x1f02}}},\n { 0x1f0b, {1, {0x1f03}}},\n { 0x1f0c, {1, {0x1f04}}},\n { 0x1f0d, {1, {0x1f05}}},\n { 0x1f0e, {1, {0x1f06}}},\n { 0x1f0f, {1, {0x1f07}}},\n { 0x1f18, {1, {0x1f10}}},\n { 0x1f19, {1, {0x1f11}}},\n { 0x1f1a, {1, {0x1f12}}},\n { 0x1f1b, {1, {0x1f13}}},\n { 0x1f1c, {1, {0x1f14}}},\n { 0x1f1d, {1, {0x1f15}}},\n { 0x1f28, {1, {0x1f20}}},\n { 0x1f29, {1, {0x1f21}}},\n { 0x1f2a, {1, {0x1f22}}},\n { 0x1f2b, {1, {0x1f23}}},\n { 0x1f2c, {1, {0x1f24}}},\n { 0x1f2d, {1, {0x1f25}}},\n { 0x1f2e, {1, {0x1f26}}},\n { 0x1f2f, {1, {0x1f27}}},\n { 0x1f38, {1, {0x1f30}}},\n { 0x1f39, {1, {0x1f31}}},\n { 0x1f3a, {1, {0x1f32}}},\n { 0x1f3b, {1, {0x1f33}}},\n { 0x1f3c, {1, {0x1f34}}},\n { 0x1f3d, {1, {0x1f35}}},\n { 0x1f3e, {1, {0x1f36}}},\n { 0x1f3f, {1, {0x1f37}}},\n { 0x1f48, {1, {0x1f40}}},\n { 0x1f49, {1, {0x1f41}}},\n { 0x1f4a, {1, {0x1f42}}},\n { 0x1f4b, {1, {0x1f43}}},\n { 0x1f4c, {1, {0x1f44}}},\n { 0x1f4d, {1, {0x1f45}}},\n { 0x1f50, {2, {0x03c5, 0x0313}}},\n { 0x1f52, {3, {0x03c5, 0x0313, 0x0300}}},\n { 0x1f54, {3, {0x03c5, 0x0313, 0x0301}}},\n { 0x1f56, {3, {0x03c5, 0x0313, 0x0342}}},\n { 0x1f59, {1, {0x1f51}}},\n { 0x1f5b, {1, {0x1f53}}},\n { 0x1f5d, {1, {0x1f55}}},\n { 0x1f5f, {1, {0x1f57}}},\n { 0x1f68, {1, {0x1f60}}},\n { 0x1f69, {1, {0x1f61}}},\n { 0x1f6a, {1, {0x1f62}}},\n { 0x1f6b, {1, {0x1f63}}},\n { 0x1f6c, {1, {0x1f64}}},\n { 0x1f6d, {1, {0x1f65}}},\n { 0x1f6e, {1, {0x1f66}}},\n { 0x1f6f, {1, {0x1f67}}},\n { 0x1f80, {2, {0x1f00, 0x03b9}}},\n { 0x1f81, {2, {0x1f01, 0x03b9}}},\n { 0x1f82, {2, {0x1f02, 0x03b9}}},\n { 0x1f83, {2, {0x1f03, 0x03b9}}},\n { 0x1f84, {2, {0x1f04, 0x03b9}}},\n { 0x1f85, {2, {0x1f05, 0x03b9}}},\n { 0x1f86, {2, {0x1f06, 0x03b9}}},\n { 0x1f87, {2, {0x1f07, 0x03b9}}},\n { 0x1f88, {2, {0x1f00, 0x03b9}}},\n { 0x1f89, {2, {0x1f01, 0x03b9}}},\n { 0x1f8a, {2, {0x1f02, 0x03b9}}},\n { 0x1f8b, {2, {0x1f03, 0x03b9}}},\n { 0x1f8c, {2, {0x1f04, 0x03b9}}},\n { 0x1f8d, {2, {0x1f05, 0x03b9}}},\n { 0x1f8e, {2, {0x1f06, 0x03b9}}},\n { 0x1f8f, {2, {0x1f07, 0x03b9}}},\n { 0x1f90, {2, {0x1f20, 0x03b9}}},\n { 0x1f91, {2, {0x1f21, 0x03b9}}},\n { 0x1f92, {2, {0x1f22, 0x03b9}}},\n { 0x1f93, {2, {0x1f23, 0x03b9}}},\n { 0x1f94, {2, {0x1f24, 0x03b9}}},\n { 0x1f95, {2, {0x1f25, 0x03b9}}},\n { 0x1f96, {2, {0x1f26, 0x03b9}}},\n { 0x1f97, {2, {0x1f27, 0x03b9}}},\n { 0x1f98, {2, {0x1f20, 0x03b9}}},\n { 0x1f99, {2, {0x1f21, 0x03b9}}},\n { 0x1f9a, {2, {0x1f22, 0x03b9}}},\n { 0x1f9b, {2, {0x1f23, 0x03b9}}},\n { 0x1f9c, {2, {0x1f24, 0x03b9}}},\n { 0x1f9d, {2, {0x1f25, 0x03b9}}},\n { 0x1f9e, {2, {0x1f26, 0x03b9}}},\n { 0x1f9f, {2, {0x1f27, 0x03b9}}},\n { 0x1fa0, {2, {0x1f60, 0x03b9}}},\n { 0x1fa1, {2, {0x1f61, 0x03b9}}},\n { 0x1fa2, {2, {0x1f62, 0x03b9}}},\n { 0x1fa3, {2, {0x1f63, 0x03b9}}},\n { 0x1fa4, {2, {0x1f64, 0x03b9}}},\n { 0x1fa5, {2, {0x1f65, 0x03b9}}},\n { 0x1fa6, {2, {0x1f66, 0x03b9}}},\n { 0x1fa7, {2, {0x1f67, 0x03b9}}},\n { 0x1fa8, {2, {0x1f60, 0x03b9}}},\n { 0x1fa9, {2, {0x1f61, 0x03b9}}},\n { 0x1faa, {2, {0x1f62, 0x03b9}}},\n { 0x1fab, {2, {0x1f63, 0x03b9}}},\n { 0x1fac, {2, {0x1f64, 0x03b9}}},\n { 0x1fad, {2, {0x1f65, 0x03b9}}},\n { 0x1fae, {2, {0x1f66, 0x03b9}}},\n { 0x1faf, {2, {0x1f67, 0x03b9}}},\n { 0x1fb2, {2, {0x1f70, 0x03b9}}},\n { 0x1fb3, {2, {0x03b1, 0x03b9}}},\n { 0x1fb4, {2, {0x03ac, 0x03b9}}},\n { 0x1fb6, {2, {0x03b1, 0x0342}}},\n { 0x1fb7, {3, {0x03b1, 0x0342, 0x03b9}}},\n { 0x1fb8, {1, {0x1fb0}}},\n { 0x1fb9, {1, {0x1fb1}}},\n { 0x1fba, {1, {0x1f70}}},\n { 0x1fbb, {1, {0x1f71}}},\n { 0x1fbc, {2, {0x03b1, 0x03b9}}},\n { 0x1fbe, {1, {0x03b9}}},\n { 0x1fc2, {2, {0x1f74, 0x03b9}}},\n { 0x1fc3, {2, {0x03b7, 0x03b9}}},\n { 0x1fc4, {2, {0x03ae, 0x03b9}}},\n { 0x1fc6, {2, {0x03b7, 0x0342}}},\n { 0x1fc7, {3, {0x03b7, 0x0342, 0x03b9}}},\n { 0x1fc8, {1, {0x1f72}}},\n { 0x1fc9, {1, {0x1f73}}},\n { 0x1fca, {1, {0x1f74}}},\n { 0x1fcb, {1, {0x1f75}}},\n { 0x1fcc, {2, {0x03b7, 0x03b9}}},\n { 0x1fd2, {3, {0x03b9, 0x0308, 0x0300}}},\n { 0x1fd3, {3, {0x03b9, 0x0308, 0x0301}}},\n { 0x1fd6, {2, {0x03b9, 0x0342}}},\n { 0x1fd7, {3, {0x03b9, 0x0308, 0x0342}}},\n { 0x1fd8, {1, {0x1fd0}}},\n { 0x1fd9, {1, {0x1fd1}}},\n { 0x1fda, {1, {0x1f76}}},\n { 0x1fdb, {1, {0x1f77}}},\n { 0x1fe2, {3, {0x03c5, 0x0308, 0x0300}}},\n { 0x1fe3, {3, {0x03c5, 0x0308, 0x0301}}},\n { 0x1fe4, {2, {0x03c1, 0x0313}}},\n { 0x1fe6, {2, {0x03c5, 0x0342}}},\n { 0x1fe7, {3, {0x03c5, 0x0308, 0x0342}}},\n { 0x1fe8, {1, {0x1fe0}}},\n { 0x1fe9, {1, {0x1fe1}}},\n { 0x1fea, {1, {0x1f7a}}},\n { 0x1feb, {1, {0x1f7b}}},\n { 0x1fec, {1, {0x1fe5}}},\n { 0x1ff2, {2, {0x1f7c, 0x03b9}}},\n { 0x1ff3, {2, {0x03c9, 0x03b9}}},\n { 0x1ff4, {2, {0x03ce, 0x03b9}}},\n { 0x1ff6, {2, {0x03c9, 0x0342}}},\n { 0x1ff7, {3, {0x03c9, 0x0342, 0x03b9}}},\n { 0x1ff8, {1, {0x1f78}}},\n { 0x1ff9, {1, {0x1f79}}},\n { 0x1ffa, {1, {0x1f7c}}},\n { 0x1ffb, {1, {0x1f7d}}},\n { 0x1ffc, {2, {0x03c9, 0x03b9}}},\n { 0x2126, {1, {0x03c9}}},\n { 0x212a, {1, {0x006b}}},\n { 0x212b, {1, {0x00e5}}},\n { 0x2132, {1, {0x214e}}},\n { 0x2160, {1, {0x2170}}},\n { 0x2161, {1, {0x2171}}},\n { 0x2162, {1, {0x2172}}},\n { 0x2163, {1, {0x2173}}},\n { 0x2164, {1, {0x2174}}},\n { 0x2165, {1, {0x2175}}},\n { 0x2166, {1, {0x2176}}},\n { 0x2167, {1, {0x2177}}},\n { 0x2168, {1, {0x2178}}},\n { 0x2169, {1, {0x2179}}},\n { 0x216a, {1, {0x217a}}},\n { 0x216b, {1, {0x217b}}},\n { 0x216c, {1, {0x217c}}},\n { 0x216d, {1, {0x217d}}},\n { 0x216e, {1, {0x217e}}},\n { 0x216f, {1, {0x217f}}},\n { 0x2183, {1, {0x2184}}},\n { 0x24b6, {1, {0x24d0}}},\n { 0x24b7, {1, {0x24d1}}},\n { 0x24b8, {1, {0x24d2}}},\n { 0x24b9, {1, {0x24d3}}},\n { 0x24ba, {1, {0x24d4}}},\n { 0x24bb, {1, {0x24d5}}},\n { 0x24bc, {1, {0x24d6}}},\n { 0x24bd, {1, {0x24d7}}},\n { 0x24be, {1, {0x24d8}}},\n { 0x24bf, {1, {0x24d9}}},\n { 0x24c0, {1, {0x24da}}},\n { 0x24c1, {1, {0x24db}}},\n { 0x24c2, {1, {0x24dc}}},\n { 0x24c3, {1, {0x24dd}}},\n { 0x24c4, {1, {0x24de}}},\n { 0x24c5, {1, {0x24df}}},\n { 0x24c6, {1, {0x24e0}}},\n { 0x24c7, {1, {0x24e1}}},\n { 0x24c8, {1, {0x24e2}}},\n { 0x24c9, {1, {0x24e3}}},\n { 0x24ca, {1, {0x24e4}}},\n { 0x24cb, {1, {0x24e5}}},\n { 0x24cc, {1, {0x24e6}}},\n { 0x24cd, {1, {0x24e7}}},\n { 0x24ce, {1, {0x24e8}}},\n { 0x24cf, {1, {0x24e9}}},\n { 0x2c00, {1, {0x2c30}}},\n { 0x2c01, {1, {0x2c31}}},\n { 0x2c02, {1, {0x2c32}}},\n { 0x2c03, {1, {0x2c33}}},\n { 0x2c04, {1, {0x2c34}}},\n { 0x2c05, {1, {0x2c35}}},\n { 0x2c06, {1, {0x2c36}}},\n { 0x2c07, {1, {0x2c37}}},\n { 0x2c08, {1, {0x2c38}}},\n { 0x2c09, {1, {0x2c39}}},\n { 0x2c0a, {1, {0x2c3a}}},\n { 0x2c0b, {1, {0x2c3b}}},\n { 0x2c0c, {1, {0x2c3c}}},\n { 0x2c0d, {1, {0x2c3d}}},\n { 0x2c0e, {1, {0x2c3e}}},\n { 0x2c0f, {1, {0x2c3f}}},\n { 0x2c10, {1, {0x2c40}}},\n { 0x2c11, {1, {0x2c41}}},\n { 0x2c12, {1, {0x2c42}}},\n { 0x2c13, {1, {0x2c43}}},\n { 0x2c14, {1, {0x2c44}}},\n { 0x2c15, {1, {0x2c45}}},\n { 0x2c16, {1, {0x2c46}}},\n { 0x2c17, {1, {0x2c47}}},\n { 0x2c18, {1, {0x2c48}}},\n { 0x2c19, {1, {0x2c49}}},\n { 0x2c1a, {1, {0x2c4a}}},\n { 0x2c1b, {1, {0x2c4b}}},\n { 0x2c1c, {1, {0x2c4c}}},\n { 0x2c1d, {1, {0x2c4d}}},\n { 0x2c1e, {1, {0x2c4e}}},\n { 0x2c1f, {1, {0x2c4f}}},\n { 0x2c20, {1, {0x2c50}}},\n { 0x2c21, {1, {0x2c51}}},\n { 0x2c22, {1, {0x2c52}}},\n { 0x2c23, {1, {0x2c53}}},\n { 0x2c24, {1, {0x2c54}}},\n { 0x2c25, {1, {0x2c55}}},\n { 0x2c26, {1, {0x2c56}}},\n { 0x2c27, {1, {0x2c57}}},\n { 0x2c28, {1, {0x2c58}}},\n { 0x2c29, {1, {0x2c59}}},\n { 0x2c2a, {1, {0x2c5a}}},\n { 0x2c2b, {1, {0x2c5b}}},\n { 0x2c2c, {1, {0x2c5c}}},\n { 0x2c2d, {1, {0x2c5d}}},\n { 0x2c2e, {1, {0x2c5e}}},\n { 0x2c60, {1, {0x2c61}}},\n { 0x2c62, {1, {0x026b}}},\n { 0x2c63, {1, {0x1d7d}}},\n { 0x2c64, {1, {0x027d}}},\n { 0x2c67, {1, {0x2c68}}},\n { 0x2c69, {1, {0x2c6a}}},\n { 0x2c6b, {1, {0x2c6c}}},\n { 0x2c6d, {1, {0x0251}}},\n { 0x2c6e, {1, {0x0271}}},\n { 0x2c6f, {1, {0x0250}}},\n { 0x2c70, {1, {0x0252}}},\n { 0x2c72, {1, {0x2c73}}},\n { 0x2c75, {1, {0x2c76}}},\n { 0x2c7e, {1, {0x023f}}},\n { 0x2c7f, {1, {0x0240}}},\n { 0x2c80, {1, {0x2c81}}},\n { 0x2c82, {1, {0x2c83}}},\n { 0x2c84, {1, {0x2c85}}},\n { 0x2c86, {1, {0x2c87}}},\n { 0x2c88, {1, {0x2c89}}},\n { 0x2c8a, {1, {0x2c8b}}},\n { 0x2c8c, {1, {0x2c8d}}},\n { 0x2c8e, {1, {0x2c8f}}},\n { 0x2c90, {1, {0x2c91}}},\n { 0x2c92, {1, {0x2c93}}},\n { 0x2c94, {1, {0x2c95}}},\n { 0x2c96, {1, {0x2c97}}},\n { 0x2c98, {1, {0x2c99}}},\n { 0x2c9a, {1, {0x2c9b}}},\n { 0x2c9c, {1, {0x2c9d}}},\n { 0x2c9e, {1, {0x2c9f}}},\n { 0x2ca0, {1, {0x2ca1}}},\n { 0x2ca2, {1, {0x2ca3}}},\n { 0x2ca4, {1, {0x2ca5}}},\n { 0x2ca6, {1, {0x2ca7}}},\n { 0x2ca8, {1, {0x2ca9}}},\n { 0x2caa, {1, {0x2cab}}},\n { 0x2cac, {1, {0x2cad}}},\n { 0x2cae, {1, {0x2caf}}},\n { 0x2cb0, {1, {0x2cb1}}},\n { 0x2cb2, {1, {0x2cb3}}},\n { 0x2cb4, {1, {0x2cb5}}},\n { 0x2cb6, {1, {0x2cb7}}},\n { 0x2cb8, {1, {0x2cb9}}},\n { 0x2cba, {1, {0x2cbb}}},\n { 0x2cbc, {1, {0x2cbd}}},\n { 0x2cbe, {1, {0x2cbf}}},\n { 0x2cc0, {1, {0x2cc1}}},\n { 0x2cc2, {1, {0x2cc3}}},\n { 0x2cc4, {1, {0x2cc5}}},\n { 0x2cc6, {1, {0x2cc7}}},\n { 0x2cc8, {1, {0x2cc9}}},\n { 0x2cca, {1, {0x2ccb}}},\n { 0x2ccc, {1, {0x2ccd}}},\n { 0x2cce, {1, {0x2ccf}}},\n { 0x2cd0, {1, {0x2cd1}}},\n { 0x2cd2, {1, {0x2cd3}}},\n { 0x2cd4, {1, {0x2cd5}}},\n { 0x2cd6, {1, {0x2cd7}}},\n { 0x2cd8, {1, {0x2cd9}}},\n { 0x2cda, {1, {0x2cdb}}},\n { 0x2cdc, {1, {0x2cdd}}},\n { 0x2cde, {1, {0x2cdf}}},\n { 0x2ce0, {1, {0x2ce1}}},\n { 0x2ce2, {1, {0x2ce3}}},\n { 0x2ceb, {1, {0x2cec}}},\n { 0x2ced, {1, {0x2cee}}},\n { 0x2cf2, {1, {0x2cf3}}},\n { 0xa640, {1, {0xa641}}},\n { 0xa642, {1, {0xa643}}},\n { 0xa644, {1, {0xa645}}},\n { 0xa646, {1, {0xa647}}},\n { 0xa648, {1, {0xa649}}},\n { 0xa64a, {1, {0xa64b}}},\n { 0xa64c, {1, {0xa64d}}},\n { 0xa64e, {1, {0xa64f}}},\n { 0xa650, {1, {0xa651}}},\n { 0xa652, {1, {0xa653}}},\n { 0xa654, {1, {0xa655}}},\n { 0xa656, {1, {0xa657}}},\n { 0xa658, {1, {0xa659}}},\n { 0xa65a, {1, {0xa65b}}},\n { 0xa65c, {1, {0xa65d}}},\n { 0xa65e, {1, {0xa65f}}},\n { 0xa660, {1, {0xa661}}},\n { 0xa662, {1, {0xa663}}},\n { 0xa664, {1, {0xa665}}},\n { 0xa666, {1, {0xa667}}},\n { 0xa668, {1, {0xa669}}},\n { 0xa66a, {1, {0xa66b}}},\n { 0xa66c, {1, {0xa66d}}},\n { 0xa680, {1, {0xa681}}},\n { 0xa682, {1, {0xa683}}},\n { 0xa684, {1, {0xa685}}},\n { 0xa686, {1, {0xa687}}},\n { 0xa688, {1, {0xa689}}},\n { 0xa68a, {1, {0xa68b}}},\n { 0xa68c, {1, {0xa68d}}},\n { 0xa68e, {1, {0xa68f}}},\n { 0xa690, {1, {0xa691}}},\n { 0xa692, {1, {0xa693}}},\n { 0xa694, {1, {0xa695}}},\n { 0xa696, {1, {0xa697}}},\n { 0xa722, {1, {0xa723}}},\n { 0xa724, {1, {0xa725}}},\n { 0xa726, {1, {0xa727}}},\n { 0xa728, {1, {0xa729}}},\n { 0xa72a, {1, {0xa72b}}},\n { 0xa72c, {1, {0xa72d}}},\n { 0xa72e, {1, {0xa72f}}},\n { 0xa732, {1, {0xa733}}},\n { 0xa734, {1, {0xa735}}},\n { 0xa736, {1, {0xa737}}},\n { 0xa738, {1, {0xa739}}},\n { 0xa73a, {1, {0xa73b}}},\n { 0xa73c, {1, {0xa73d}}},\n { 0xa73e, {1, {0xa73f}}},\n { 0xa740, {1, {0xa741}}},\n { 0xa742, {1, {0xa743}}},\n { 0xa744, {1, {0xa745}}},\n { 0xa746, {1, {0xa747}}},\n { 0xa748, {1, {0xa749}}},\n { 0xa74a, {1, {0xa74b}}},\n { 0xa74c, {1, {0xa74d}}},\n { 0xa74e, {1, {0xa74f}}},\n { 0xa750, {1, {0xa751}}},\n { 0xa752, {1, {0xa753}}},\n { 0xa754, {1, {0xa755}}},\n { 0xa756, {1, {0xa757}}},\n { 0xa758, {1, {0xa759}}},\n { 0xa75a, {1, {0xa75b}}},\n { 0xa75c, {1, {0xa75d}}},\n { 0xa75e, {1, {0xa75f}}},\n { 0xa760, {1, {0xa761}}},\n { 0xa762, {1, {0xa763}}},\n { 0xa764, {1, {0xa765}}},\n { 0xa766, {1, {0xa767}}},\n { 0xa768, {1, {0xa769}}},\n { 0xa76a, {1, {0xa76b}}},\n { 0xa76c, {1, {0xa76d}}},\n { 0xa76e, {1, {0xa76f}}},\n { 0xa779, {1, {0xa77a}}},\n { 0xa77b, {1, {0xa77c}}},\n { 0xa77d, {1, {0x1d79}}},\n { 0xa77e, {1, {0xa77f}}},\n { 0xa780, {1, {0xa781}}},\n { 0xa782, {1, {0xa783}}},\n { 0xa784, {1, {0xa785}}},\n { 0xa786, {1, {0xa787}}},\n { 0xa78b, {1, {0xa78c}}},\n { 0xa78d, {1, {0x0265}}},\n { 0xa790, {1, {0xa791}}},\n { 0xa792, {1, {0xa793}}},\n { 0xa7a0, {1, {0xa7a1}}},\n { 0xa7a2, {1, {0xa7a3}}},\n { 0xa7a4, {1, {0xa7a5}}},\n { 0xa7a6, {1, {0xa7a7}}},\n { 0xa7a8, {1, {0xa7a9}}},\n { 0xa7aa, {1, {0x0266}}},\n { 0xfb00, {2, {0x0066, 0x0066}}},\n { 0xfb01, {2, {0x0066, 0x0069}}},\n { 0xfb02, {2, {0x0066, 0x006c}}},\n { 0xfb03, {3, {0x0066, 0x0066, 0x0069}}},\n { 0xfb04, {3, {0x0066, 0x0066, 0x006c}}},\n { 0xfb05, {2, {0x0073, 0x0074}}},\n { 0xfb06, {2, {0x0073, 0x0074}}},\n { 0xfb13, {2, {0x0574, 0x0576}}},\n { 0xfb14, {2, {0x0574, 0x0565}}},\n { 0xfb15, {2, {0x0574, 0x056b}}},\n { 0xfb16, {2, {0x057e, 0x0576}}},\n { 0xfb17, {2, {0x0574, 0x056d}}},\n { 0xff21, {1, {0xff41}}},\n { 0xff22, {1, {0xff42}}},\n { 0xff23, {1, {0xff43}}},\n { 0xff24, {1, {0xff44}}},\n { 0xff25, {1, {0xff45}}},\n { 0xff26, {1, {0xff46}}},\n { 0xff27, {1, {0xff47}}},\n { 0xff28, {1, {0xff48}}},\n { 0xff29, {1, {0xff49}}},\n { 0xff2a, {1, {0xff4a}}},\n { 0xff2b, {1, {0xff4b}}},\n { 0xff2c, {1, {0xff4c}}},\n { 0xff2d, {1, {0xff4d}}},\n { 0xff2e, {1, {0xff4e}}},\n { 0xff2f, {1, {0xff4f}}},\n { 0xff30, {1, {0xff50}}},\n { 0xff31, {1, {0xff51}}},\n { 0xff32, {1, {0xff52}}},\n { 0xff33, {1, {0xff53}}},\n { 0xff34, {1, {0xff54}}},\n { 0xff35, {1, {0xff55}}},\n { 0xff36, {1, {0xff56}}},\n { 0xff37, {1, {0xff57}}},\n { 0xff38, {1, {0xff58}}},\n { 0xff39, {1, {0xff59}}},\n { 0xff3a, {1, {0xff5a}}},\n { 0x10400, {1, {0x10428}}},\n { 0x10401, {1, {0x10429}}},\n { 0x10402, {1, {0x1042a}}},\n { 0x10403, {1, {0x1042b}}},\n { 0x10404, {1, {0x1042c}}},\n { 0x10405, {1, {0x1042d}}},\n { 0x10406, {1, {0x1042e}}},\n { 0x10407, {1, {0x1042f}}},\n { 0x10408, {1, {0x10430}}},\n { 0x10409, {1, {0x10431}}},\n { 0x1040a, {1, {0x10432}}},\n { 0x1040b, {1, {0x10433}}},\n { 0x1040c, {1, {0x10434}}},\n { 0x1040d, {1, {0x10435}}},\n { 0x1040e, {1, {0x10436}}},\n { 0x1040f, {1, {0x10437}}},\n { 0x10410, {1, {0x10438}}},\n { 0x10411, {1, {0x10439}}},\n { 0x10412, {1, {0x1043a}}},\n { 0x10413, {1, {0x1043b}}},\n { 0x10414, {1, {0x1043c}}},\n { 0x10415, {1, {0x1043d}}},\n { 0x10416, {1, {0x1043e}}},\n { 0x10417, {1, {0x1043f}}},\n { 0x10418, {1, {0x10440}}},\n { 0x10419, {1, {0x10441}}},\n { 0x1041a, {1, {0x10442}}},\n { 0x1041b, {1, {0x10443}}},\n { 0x1041c, {1, {0x10444}}},\n { 0x1041d, {1, {0x10445}}},\n { 0x1041e, {1, {0x10446}}},\n { 0x1041f, {1, {0x10447}}},\n { 0x10420, {1, {0x10448}}},\n { 0x10421, {1, {0x10449}}},\n { 0x10422, {1, {0x1044a}}},\n { 0x10423, {1, {0x1044b}}},\n { 0x10424, {1, {0x1044c}}},\n { 0x10425, {1, {0x1044d}}},\n { 0x10426, {1, {0x1044e}}},\n { 0x10427, {1, {0x1044f}}},\n};\n\nstatic const CaseFold_11_Type CaseFold_Locale[] = {\n { 0x0049, {1, {0x0069}}},\n { 0x0130, {2, {0x0069, 0x0307}}},\n};\n\nstatic const CaseUnfold_11_Type CaseUnfold_11[] = {\n { 0x0061, {1, {0x0041 }}},\n { 0x0062, {1, {0x0042 }}},\n { 0x0063, {1, {0x0043 }}},\n { 0x0064, {1, {0x0044 }}},\n { 0x0065, {1, {0x0045 }}},\n { 0x0066, {1, {0x0046 }}},\n { 0x0067, {1, {0x0047 }}},\n { 0x0068, {1, {0x0048 }}},\n { 0x006a, {1, {0x004a }}},\n { 0x006b, {2, {0x004b, 0x212a }}},\n { 0x006c, {1, {0x004c }}},\n { 0x006d, {1, {0x004d }}},\n { 0x006e, {1, {0x004e }}},\n { 0x006f, {1, {0x004f }}},\n { 0x0070, {1, {0x0050 }}},\n { 0x0071, {1, {0x0051 }}},\n { 0x0072, {1, {0x0052 }}},\n { 0x0073, {2, {0x0053, 0x017f }}},\n { 0x0074, {1, {0x0054 }}},\n { 0x0075, {1, {0x0055 }}},\n { 0x0076, {1, {0x0056 }}},\n { 0x0077, {1, {0x0057 }}},\n { 0x0078, {1, {0x0058 }}},\n { 0x0079, {1, {0x0059 }}},\n { 0x007a, {1, {0x005a }}},\n { 0x00e0, {1, {0x00c0 }}},\n { 0x00e1, {1, {0x00c1 }}},\n { 0x00e2, {1, {0x00c2 }}},\n { 0x00e3, {1, {0x00c3 }}},\n { 0x00e4, {1, {0x00c4 }}},\n { 0x00e5, {2, {0x00c5, 0x212b }}},\n { 0x00e6, {1, {0x00c6 }}},\n { 0x00e7, {1, {0x00c7 }}},\n { 0x00e8, {1, {0x00c8 }}},\n { 0x00e9, {1, {0x00c9 }}},\n { 0x00ea, {1, {0x00ca }}},\n { 0x00eb, {1, {0x00cb }}},\n { 0x00ec, {1, {0x00cc }}},\n { 0x00ed, {1, {0x00cd }}},\n { 0x00ee, {1, {0x00ce }}},\n { 0x00ef, {1, {0x00cf }}},\n { 0x00f0, {1, {0x00d0 }}},\n { 0x00f1, {1, {0x00d1 }}},\n { 0x00f2, {1, {0x00d2 }}},\n { 0x00f3, {1, {0x00d3 }}},\n { 0x00f4, {1, {0x00d4 }}},\n { 0x00f5, {1, {0x00d5 }}},\n { 0x00f6, {1, {0x00d6 }}},\n { 0x00f8, {1, {0x00d8 }}},\n { 0x00f9, {1, {0x00d9 }}},\n { 0x00fa, {1, {0x00da }}},\n { 0x00fb, {1, {0x00db }}},\n { 0x00fc, {1, {0x00dc }}},\n { 0x00fd, {1, {0x00dd }}},\n { 0x00fe, {1, {0x00de }}},\n { 0x00ff, {1, {0x0178 }}},\n { 0x0101, {1, {0x0100 }}},\n { 0x0103, {1, {0x0102 }}},\n { 0x0105, {1, {0x0104 }}},\n { 0x0107, {1, {0x0106 }}},\n { 0x0109, {1, {0x0108 }}},\n { 0x010b, {1, {0x010a }}},\n { 0x010d, {1, {0x010c }}},\n { 0x010f, {1, {0x010e }}},\n { 0x0111, {1, {0x0110 }}},\n { 0x0113, {1, {0x0112 }}},\n { 0x0115, {1, {0x0114 }}},\n { 0x0117, {1, {0x0116 }}},\n { 0x0119, {1, {0x0118 }}},\n { 0x011b, {1, {0x011a }}},\n { 0x011d, {1, {0x011c }}},\n { 0x011f, {1, {0x011e }}},\n { 0x0121, {1, {0x0120 }}},\n { 0x0123, {1, {0x0122 }}},\n { 0x0125, {1, {0x0124 }}},\n { 0x0127, {1, {0x0126 }}},\n { 0x0129, {1, {0x0128 }}},\n { 0x012b, {1, {0x012a }}},\n { 0x012d, {1, {0x012c }}},\n { 0x012f, {1, {0x012e }}},\n { 0x0133, {1, {0x0132 }}},\n { 0x0135, {1, {0x0134 }}},\n { 0x0137, {1, {0x0136 }}},\n { 0x013a, {1, {0x0139 }}},\n { 0x013c, {1, {0x013b }}},\n { 0x013e, {1, {0x013d }}},\n { 0x0140, {1, {0x013f }}},\n { 0x0142, {1, {0x0141 }}},\n { 0x0144, {1, {0x0143 }}},\n { 0x0146, {1, {0x0145 }}},\n { 0x0148, {1, {0x0147 }}},\n { 0x014b, {1, {0x014a }}},\n { 0x014d, {1, {0x014c }}},\n { 0x014f, {1, {0x014e }}},\n { 0x0151, {1, {0x0150 }}},\n { 0x0153, {1, {0x0152 }}},\n { 0x0155, {1, {0x0154 }}},\n { 0x0157, {1, {0x0156 }}},\n { 0x0159, {1, {0x0158 }}},\n { 0x015b, {1, {0x015a }}},\n { 0x015d, {1, {0x015c }}},\n { 0x015f, {1, {0x015e }}},\n { 0x0161, {1, {0x0160 }}},\n { 0x0163, {1, {0x0162 }}},\n { 0x0165, {1, {0x0164 }}},\n { 0x0167, {1, {0x0166 }}},\n { 0x0169, {1, {0x0168 }}},\n { 0x016b, {1, {0x016a }}},\n { 0x016d, {1, {0x016c }}},\n { 0x016f, {1, {0x016e }}},\n { 0x0171, {1, {0x0170 }}},\n { 0x0173, {1, {0x0172 }}},\n { 0x0175, {1, {0x0174 }}},\n { 0x0177, {1, {0x0176 }}},\n { 0x017a, {1, {0x0179 }}},\n { 0x017c, {1, {0x017b }}},\n { 0x017e, {1, {0x017d }}},\n { 0x0180, {1, {0x0243 }}},\n { 0x0183, {1, {0x0182 }}},\n { 0x0185, {1, {0x0184 }}},\n { 0x0188, {1, {0x0187 }}},\n { 0x018c, {1, {0x018b }}},\n { 0x0192, {1, {0x0191 }}},\n { 0x0195, {1, {0x01f6 }}},\n { 0x0199, {1, {0x0198 }}},\n { 0x019a, {1, {0x023d }}},\n { 0x019e, {1, {0x0220 }}},\n { 0x01a1, {1, {0x01a0 }}},\n { 0x01a3, {1, {0x01a2 }}},\n { 0x01a5, {1, {0x01a4 }}},\n { 0x01a8, {1, {0x01a7 }}},\n { 0x01ad, {1, {0x01ac }}},\n { 0x01b0, {1, {0x01af }}},\n { 0x01b4, {1, {0x01b3 }}},\n { 0x01b6, {1, {0x01b5 }}},\n { 0x01b9, {1, {0x01b8 }}},\n { 0x01bd, {1, {0x01bc }}},\n { 0x01bf, {1, {0x01f7 }}},\n { 0x01c6, {2, {0x01c4, 0x01c5 }}},\n { 0x01c9, {2, {0x01c7, 0x01c8 }}},\n { 0x01cc, {2, {0x01ca, 0x01cb }}},\n { 0x01ce, {1, {0x01cd }}},\n { 0x01d0, {1, {0x01cf }}},\n { 0x01d2, {1, {0x01d1 }}},\n { 0x01d4, {1, {0x01d3 }}},\n { 0x01d6, {1, {0x01d5 }}},\n { 0x01d8, {1, {0x01d7 }}},\n { 0x01da, {1, {0x01d9 }}},\n { 0x01dc, {1, {0x01db }}},\n { 0x01dd, {1, {0x018e }}},\n { 0x01df, {1, {0x01de }}},\n { 0x01e1, {1, {0x01e0 }}},\n { 0x01e3, {1, {0x01e2 }}},\n { 0x01e5, {1, {0x01e4 }}},\n { 0x01e7, {1, {0x01e6 }}},\n { 0x01e9, {1, {0x01e8 }}},\n { 0x01eb, {1, {0x01ea }}},\n { 0x01ed, {1, {0x01ec }}},\n { 0x01ef, {1, {0x01ee }}},\n { 0x01f3, {2, {0x01f1, 0x01f2 }}},\n { 0x01f5, {1, {0x01f4 }}},\n { 0x01f9, {1, {0x01f8 }}},\n { 0x01fb, {1, {0x01fa }}},\n { 0x01fd, {1, {0x01fc }}},\n { 0x01ff, {1, {0x01fe }}},\n { 0x0201, {1, {0x0200 }}},\n { 0x0203, {1, {0x0202 }}},\n { 0x0205, {1, {0x0204 }}},\n { 0x0207, {1, {0x0206 }}},\n { 0x0209, {1, {0x0208 }}},\n { 0x020b, {1, {0x020a }}},\n { 0x020d, {1, {0x020c }}},\n { 0x020f, {1, {0x020e }}},\n { 0x0211, {1, {0x0210 }}},\n { 0x0213, {1, {0x0212 }}},\n { 0x0215, {1, {0x0214 }}},\n { 0x0217, {1, {0x0216 }}},\n { 0x0219, {1, {0x0218 }}},\n { 0x021b, {1, {0x021a }}},\n { 0x021d, {1, {0x021c }}},\n { 0x021f, {1, {0x021e }}},\n { 0x0223, {1, {0x0222 }}},\n { 0x0225, {1, {0x0224 }}},\n { 0x0227, {1, {0x0226 }}},\n { 0x0229, {1, {0x0228 }}},\n { 0x022b, {1, {0x022a }}},\n { 0x022d, {1, {0x022c }}},\n { 0x022f, {1, {0x022e }}},\n { 0x0231, {1, {0x0230 }}},\n { 0x0233, {1, {0x0232 }}},\n { 0x023c, {1, {0x023b }}},\n { 0x023f, {1, {0x2c7e }}},\n { 0x0240, {1, {0x2c7f }}},\n { 0x0242, {1, {0x0241 }}},\n { 0x0247, {1, {0x0246 }}},\n { 0x0249, {1, {0x0248 }}},\n { 0x024b, {1, {0x024a }}},\n { 0x024d, {1, {0x024c }}},\n { 0x024f, {1, {0x024e }}},\n { 0x0250, {1, {0x2c6f }}},\n { 0x0251, {1, {0x2c6d }}},\n { 0x0252, {1, {0x2c70 }}},\n { 0x0253, {1, {0x0181 }}},\n { 0x0254, {1, {0x0186 }}},\n { 0x0256, {1, {0x0189 }}},\n { 0x0257, {1, {0x018a }}},\n { 0x0259, {1, {0x018f }}},\n { 0x025b, {1, {0x0190 }}},\n { 0x0260, {1, {0x0193 }}},\n { 0x0263, {1, {0x0194 }}},\n { 0x0265, {1, {0xa78d }}},\n { 0x0266, {1, {0xa7aa }}},\n { 0x0268, {1, {0x0197 }}},\n { 0x0269, {1, {0x0196 }}},\n { 0x026b, {1, {0x2c62 }}},\n { 0x026f, {1, {0x019c }}},\n { 0x0271, {1, {0x2c6e }}},\n { 0x0272, {1, {0x019d }}},\n { 0x0275, {1, {0x019f }}},\n { 0x027d, {1, {0x2c64 }}},\n { 0x0280, {1, {0x01a6 }}},\n { 0x0283, {1, {0x01a9 }}},\n { 0x0288, {1, {0x01ae }}},\n { 0x0289, {1, {0x0244 }}},\n { 0x028a, {1, {0x01b1 }}},\n { 0x028b, {1, {0x01b2 }}},\n { 0x028c, {1, {0x0245 }}},\n { 0x0292, {1, {0x01b7 }}},\n { 0x0371, {1, {0x0370 }}},\n { 0x0373, {1, {0x0372 }}},\n { 0x0377, {1, {0x0376 }}},\n { 0x037b, {1, {0x03fd }}},\n { 0x037c, {1, {0x03fe }}},\n { 0x037d, {1, {0x03ff }}},\n { 0x03ac, {1, {0x0386 }}},\n { 0x03ad, {1, {0x0388 }}},\n { 0x03ae, {1, {0x0389 }}},\n { 0x03af, {1, {0x038a }}},\n { 0x03b1, {1, {0x0391 }}},\n { 0x03b2, {2, {0x0392, 0x03d0 }}},\n { 0x03b3, {1, {0x0393 }}},\n { 0x03b4, {1, {0x0394 }}},\n { 0x03b5, {2, {0x0395, 0x03f5 }}},\n { 0x03b6, {1, {0x0396 }}},\n { 0x03b7, {1, {0x0397 }}},\n { 0x03b8, {3, {0x0398, 0x03d1, 0x03f4 }}},\n { 0x03b9, {3, {0x0345, 0x0399, 0x1fbe }}},\n { 0x03ba, {2, {0x039a, 0x03f0 }}},\n { 0x03bb, {1, {0x039b }}},\n { 0x03bc, {2, {0x00b5, 0x039c }}},\n { 0x03bd, {1, {0x039d }}},\n { 0x03be, {1, {0x039e }}},\n { 0x03bf, {1, {0x039f }}},\n { 0x03c0, {2, {0x03a0, 0x03d6 }}},\n { 0x03c1, {2, {0x03a1, 0x03f1 }}},\n { 0x03c3, {2, {0x03a3, 0x03c2 }}},\n { 0x03c4, {1, {0x03a4 }}},\n { 0x03c5, {1, {0x03a5 }}},\n { 0x03c6, {2, {0x03a6, 0x03d5 }}},\n { 0x03c7, {1, {0x03a7 }}},\n { 0x03c8, {1, {0x03a8 }}},\n { 0x03c9, {2, {0x03a9, 0x2126 }}},\n { 0x03ca, {1, {0x03aa }}},\n { 0x03cb, {1, {0x03ab }}},\n { 0x03cc, {1, {0x038c }}},\n { 0x03cd, {1, {0x038e }}},\n { 0x03ce, {1, {0x038f }}},\n { 0x03d7, {1, {0x03cf }}},\n { 0x03d9, {1, {0x03d8 }}},\n { 0x03db, {1, {0x03da }}},\n { 0x03dd, {1, {0x03dc }}},\n { 0x03df, {1, {0x03de }}},\n { 0x03e1, {1, {0x03e0 }}},\n { 0x03e3, {1, {0x03e2 }}},\n { 0x03e5, {1, {0x03e4 }}},\n { 0x03e7, {1, {0x03e6 }}},\n { 0x03e9, {1, {0x03e8 }}},\n { 0x03eb, {1, {0x03ea }}},\n { 0x03ed, {1, {0x03ec }}},\n { 0x03ef, {1, {0x03ee }}},\n { 0x03f2, {1, {0x03f9 }}},\n { 0x03f8, {1, {0x03f7 }}},\n { 0x03fb, {1, {0x03fa }}},\n { 0x0430, {1, {0x0410 }}},\n { 0x0431, {1, {0x0411 }}},\n { 0x0432, {1, {0x0412 }}},\n { 0x0433, {1, {0x0413 }}},\n { 0x0434, {1, {0x0414 }}},\n { 0x0435, {1, {0x0415 }}},\n { 0x0436, {1, {0x0416 }}},\n { 0x0437, {1, {0x0417 }}},\n { 0x0438, {1, {0x0418 }}},\n { 0x0439, {1, {0x0419 }}},\n { 0x043a, {1, {0x041a }}},\n { 0x043b, {1, {0x041b }}},\n { 0x043c, {1, {0x041c }}},\n { 0x043d, {1, {0x041d }}},\n { 0x043e, {1, {0x041e }}},\n { 0x043f, {1, {0x041f }}},\n { 0x0440, {1, {0x0420 }}},\n { 0x0441, {1, {0x0421 }}},\n { 0x0442, {1, {0x0422 }}},\n { 0x0443, {1, {0x0423 }}},\n { 0x0444, {1, {0x0424 }}},\n { 0x0445, {1, {0x0425 }}},\n { 0x0446, {1, {0x0426 }}},\n { 0x0447, {1, {0x0427 }}},\n { 0x0448, {1, {0x0428 }}},\n { 0x0449, {1, {0x0429 }}},\n { 0x044a, {1, {0x042a }}},\n { 0x044b, {1, {0x042b }}},\n { 0x044c, {1, {0x042c }}},\n { 0x044d, {1, {0x042d }}},\n { 0x044e, {1, {0x042e }}},\n { 0x044f, {1, {0x042f }}},\n { 0x0450, {1, {0x0400 }}},\n { 0x0451, {1, {0x0401 }}},\n { 0x0452, {1, {0x0402 }}},\n { 0x0453, {1, {0x0403 }}},\n { 0x0454, {1, {0x0404 }}},\n { 0x0455, {1, {0x0405 }}},\n { 0x0456, {1, {0x0406 }}},\n { 0x0457, {1, {0x0407 }}},\n { 0x0458, {1, {0x0408 }}},\n { 0x0459, {1, {0x0409 }}},\n { 0x045a, {1, {0x040a }}},\n { 0x045b, {1, {0x040b }}},\n { 0x045c, {1, {0x040c }}},\n { 0x045d, {1, {0x040d }}},\n { 0x045e, {1, {0x040e }}},\n { 0x045f, {1, {0x040f }}},\n { 0x0461, {1, {0x0460 }}},\n { 0x0463, {1, {0x0462 }}},\n { 0x0465, {1, {0x0464 }}},\n { 0x0467, {1, {0x0466 }}},\n { 0x0469, {1, {0x0468 }}},\n { 0x046b, {1, {0x046a }}},\n { 0x046d, {1, {0x046c }}},\n { 0x046f, {1, {0x046e }}},\n { 0x0471, {1, {0x0470 }}},\n { 0x0473, {1, {0x0472 }}},\n { 0x0475, {1, {0x0474 }}},\n { 0x0477, {1, {0x0476 }}},\n { 0x0479, {1, {0x0478 }}},\n { 0x047b, {1, {0x047a }}},\n { 0x047d, {1, {0x047c }}},\n { 0x047f, {1, {0x047e }}},\n { 0x0481, {1, {0x0480 }}},\n { 0x048b, {1, {0x048a }}},\n { 0x048d, {1, {0x048c }}},\n { 0x048f, {1, {0x048e }}},\n { 0x0491, {1, {0x0490 }}},\n { 0x0493, {1, {0x0492 }}},\n { 0x0495, {1, {0x0494 }}},\n { 0x0497, {1, {0x0496 }}},\n { 0x0499, {1, {0x0498 }}},\n { 0x049b, {1, {0x049a }}},\n { 0x049d, {1, {0x049c }}},\n { 0x049f, {1, {0x049e }}},\n { 0x04a1, {1, {0x04a0 }}},\n { 0x04a3, {1, {0x04a2 }}},\n { 0x04a5, {1, {0x04a4 }}},\n { 0x04a7, {1, {0x04a6 }}},\n { 0x04a9, {1, {0x04a8 }}},\n { 0x04ab, {1, {0x04aa }}},\n { 0x04ad, {1, {0x04ac }}},\n { 0x04af, {1, {0x04ae }}},\n { 0x04b1, {1, {0x04b0 }}},\n { 0x04b3, {1, {0x04b2 }}},\n { 0x04b5, {1, {0x04b4 }}},\n { 0x04b7, {1, {0x04b6 }}},\n { 0x04b9, {1, {0x04b8 }}},\n { 0x04bb, {1, {0x04ba }}},\n { 0x04bd, {1, {0x04bc }}},\n { 0x04bf, {1, {0x04be }}},\n { 0x04c2, {1, {0x04c1 }}},\n { 0x04c4, {1, {0x04c3 }}},\n { 0x04c6, {1, {0x04c5 }}},\n { 0x04c8, {1, {0x04c7 }}},\n { 0x04ca, {1, {0x04c9 }}},\n { 0x04cc, {1, {0x04cb }}},\n { 0x04ce, {1, {0x04cd }}},\n { 0x04cf, {1, {0x04c0 }}},\n { 0x04d1, {1, {0x04d0 }}},\n { 0x04d3, {1, {0x04d2 }}},\n { 0x04d5, {1, {0x04d4 }}},\n { 0x04d7, {1, {0x04d6 }}},\n { 0x04d9, {1, {0x04d8 }}},\n { 0x04db, {1, {0x04da }}},\n { 0x04dd, {1, {0x04dc }}},\n { 0x04df, {1, {0x04de }}},\n { 0x04e1, {1, {0x04e0 }}},\n { 0x04e3, {1, {0x04e2 }}},\n { 0x04e5, {1, {0x04e4 }}},\n { 0x04e7, {1, {0x04e6 }}},\n { 0x04e9, {1, {0x04e8 }}},\n { 0x04eb, {1, {0x04ea }}},\n { 0x04ed, {1, {0x04ec }}},\n { 0x04ef, {1, {0x04ee }}},\n { 0x04f1, {1, {0x04f0 }}},\n { 0x04f3, {1, {0x04f2 }}},\n { 0x04f5, {1, {0x04f4 }}},\n { 0x04f7, {1, {0x04f6 }}},\n { 0x04f9, {1, {0x04f8 }}},\n { 0x04fb, {1, {0x04fa }}},\n { 0x04fd, {1, {0x04fc }}},\n { 0x04ff, {1, {0x04fe }}},\n { 0x0501, {1, {0x0500 }}},\n { 0x0503, {1, {0x0502 }}},\n { 0x0505, {1, {0x0504 }}},\n { 0x0507, {1, {0x0506 }}},\n { 0x0509, {1, {0x0508 }}},\n { 0x050b, {1, {0x050a }}},\n { 0x050d, {1, {0x050c }}},\n { 0x050f, {1, {0x050e }}},\n { 0x0511, {1, {0x0510 }}},\n { 0x0513, {1, {0x0512 }}},\n { 0x0515, {1, {0x0514 }}},\n { 0x0517, {1, {0x0516 }}},\n { 0x0519, {1, {0x0518 }}},\n { 0x051b, {1, {0x051a }}},\n { 0x051d, {1, {0x051c }}},\n { 0x051f, {1, {0x051e }}},\n { 0x0521, {1, {0x0520 }}},\n { 0x0523, {1, {0x0522 }}},\n { 0x0525, {1, {0x0524 }}},\n { 0x0527, {1, {0x0526 }}},\n { 0x0561, {1, {0x0531 }}},\n { 0x0562, {1, {0x0532 }}},\n { 0x0563, {1, {0x0533 }}},\n { 0x0564, {1, {0x0534 }}},\n { 0x0565, {1, {0x0535 }}},\n { 0x0566, {1, {0x0536 }}},\n { 0x0567, {1, {0x0537 }}},\n { 0x0568, {1, {0x0538 }}},\n { 0x0569, {1, {0x0539 }}},\n { 0x056a, {1, {0x053a }}},\n { 0x056b, {1, {0x053b }}},\n { 0x056c, {1, {0x053c }}},\n { 0x056d, {1, {0x053d }}},\n { 0x056e, {1, {0x053e }}},\n { 0x056f, {1, {0x053f }}},\n { 0x0570, {1, {0x0540 }}},\n { 0x0571, {1, {0x0541 }}},\n { 0x0572, {1, {0x0542 }}},\n { 0x0573, {1, {0x0543 }}},\n { 0x0574, {1, {0x0544 }}},\n { 0x0575, {1, {0x0545 }}},\n { 0x0576, {1, {0x0546 }}},\n { 0x0577, {1, {0x0547 }}},\n { 0x0578, {1, {0x0548 }}},\n { 0x0579, {1, {0x0549 }}},\n { 0x057a, {1, {0x054a }}},\n { 0x057b, {1, {0x054b }}},\n { 0x057c, {1, {0x054c }}},\n { 0x057d, {1, {0x054d }}},\n { 0x057e, {1, {0x054e }}},\n { 0x057f, {1, {0x054f }}},\n { 0x0580, {1, {0x0550 }}},\n { 0x0581, {1, {0x0551 }}},\n { 0x0582, {1, {0x0552 }}},\n { 0x0583, {1, {0x0553 }}},\n { 0x0584, {1, {0x0554 }}},\n { 0x0585, {1, {0x0555 }}},\n { 0x0586, {1, {0x0556 }}},\n { 0x1d79, {1, {0xa77d }}},\n { 0x1d7d, {1, {0x2c63 }}},\n { 0x1e01, {1, {0x1e00 }}},\n { 0x1e03, {1, {0x1e02 }}},\n { 0x1e05, {1, {0x1e04 }}},\n { 0x1e07, {1, {0x1e06 }}},\n { 0x1e09, {1, {0x1e08 }}},\n { 0x1e0b, {1, {0x1e0a }}},\n { 0x1e0d, {1, {0x1e0c }}},\n { 0x1e0f, {1, {0x1e0e }}},\n { 0x1e11, {1, {0x1e10 }}},\n { 0x1e13, {1, {0x1e12 }}},\n { 0x1e15, {1, {0x1e14 }}},\n { 0x1e17, {1, {0x1e16 }}},\n { 0x1e19, {1, {0x1e18 }}},\n { 0x1e1b, {1, {0x1e1a }}},\n { 0x1e1d, {1, {0x1e1c }}},\n { 0x1e1f, {1, {0x1e1e }}},\n { 0x1e21, {1, {0x1e20 }}},\n { 0x1e23, {1, {0x1e22 }}},\n { 0x1e25, {1, {0x1e24 }}},\n { 0x1e27, {1, {0x1e26 }}},\n { 0x1e29, {1, {0x1e28 }}},\n { 0x1e2b, {1, {0x1e2a }}},\n { 0x1e2d, {1, {0x1e2c }}},\n { 0x1e2f, {1, {0x1e2e }}},\n { 0x1e31, {1, {0x1e30 }}},\n { 0x1e33, {1, {0x1e32 }}},\n { 0x1e35, {1, {0x1e34 }}},\n { 0x1e37, {1, {0x1e36 }}},\n { 0x1e39, {1, {0x1e38 }}},\n { 0x1e3b, {1, {0x1e3a }}},\n { 0x1e3d, {1, {0x1e3c }}},\n { 0x1e3f, {1, {0x1e3e }}},\n { 0x1e41, {1, {0x1e40 }}},\n { 0x1e43, {1, {0x1e42 }}},\n { 0x1e45, {1, {0x1e44 }}},\n { 0x1e47, {1, {0x1e46 }}},\n { 0x1e49, {1, {0x1e48 }}},\n { 0x1e4b, {1, {0x1e4a }}},\n { 0x1e4d, {1, {0x1e4c }}},\n { 0x1e4f, {1, {0x1e4e }}},\n { 0x1e51, {1, {0x1e50 }}},\n { 0x1e53, {1, {0x1e52 }}},\n { 0x1e55, {1, {0x1e54 }}},\n { 0x1e57, {1, {0x1e56 }}},\n { 0x1e59, {1, {0x1e58 }}},\n { 0x1e5b, {1, {0x1e5a }}},\n { 0x1e5d, {1, {0x1e5c }}},\n { 0x1e5f, {1, {0x1e5e }}},\n { 0x1e61, {2, {0x1e60, 0x1e9b }}},\n { 0x1e63, {1, {0x1e62 }}},\n { 0x1e65, {1, {0x1e64 }}},\n { 0x1e67, {1, {0x1e66 }}},\n { 0x1e69, {1, {0x1e68 }}},\n { 0x1e6b, {1, {0x1e6a }}},\n { 0x1e6d, {1, {0x1e6c }}},\n { 0x1e6f, {1, {0x1e6e }}},\n { 0x1e71, {1, {0x1e70 }}},\n { 0x1e73, {1, {0x1e72 }}},\n { 0x1e75, {1, {0x1e74 }}},\n { 0x1e77, {1, {0x1e76 }}},\n { 0x1e79, {1, {0x1e78 }}},\n { 0x1e7b, {1, {0x1e7a }}},\n { 0x1e7d, {1, {0x1e7c }}},\n { 0x1e7f, {1, {0x1e7e }}},\n { 0x1e81, {1, {0x1e80 }}},\n { 0x1e83, {1, {0x1e82 }}},\n { 0x1e85, {1, {0x1e84 }}},\n { 0x1e87, {1, {0x1e86 }}},\n { 0x1e89, {1, {0x1e88 }}},\n { 0x1e8b, {1, {0x1e8a }}},\n { 0x1e8d, {1, {0x1e8c }}},\n { 0x1e8f, {1, {0x1e8e }}},\n { 0x1e91, {1, {0x1e90 }}},\n { 0x1e93, {1, {0x1e92 }}},\n { 0x1e95, {1, {0x1e94 }}},\n { 0x1ea1, {1, {0x1ea0 }}},\n { 0x1ea3, {1, {0x1ea2 }}},\n { 0x1ea5, {1, {0x1ea4 }}},\n { 0x1ea7, {1, {0x1ea6 }}},\n { 0x1ea9, {1, {0x1ea8 }}},\n { 0x1eab, {1, {0x1eaa }}},\n { 0x1ead, {1, {0x1eac }}},\n { 0x1eaf, {1, {0x1eae }}},\n { 0x1eb1, {1, {0x1eb0 }}},\n { 0x1eb3, {1, {0x1eb2 }}},\n { 0x1eb5, {1, {0x1eb4 }}},\n { 0x1eb7, {1, {0x1eb6 }}},\n { 0x1eb9, {1, {0x1eb8 }}},\n { 0x1ebb, {1, {0x1eba }}},\n { 0x1ebd, {1, {0x1ebc }}},\n { 0x1ebf, {1, {0x1ebe }}},\n { 0x1ec1, {1, {0x1ec0 }}},\n { 0x1ec3, {1, {0x1ec2 }}},\n { 0x1ec5, {1, {0x1ec4 }}},\n { 0x1ec7, {1, {0x1ec6 }}},\n { 0x1ec9, {1, {0x1ec8 }}},\n { 0x1ecb, {1, {0x1eca }}},\n { 0x1ecd, {1, {0x1ecc }}},\n { 0x1ecf, {1, {0x1ece }}},\n { 0x1ed1, {1, {0x1ed0 }}},\n { 0x1ed3, {1, {0x1ed2 }}},\n { 0x1ed5, {1, {0x1ed4 }}},\n { 0x1ed7, {1, {0x1ed6 }}},\n { 0x1ed9, {1, {0x1ed8 }}},\n { 0x1edb, {1, {0x1eda }}},\n { 0x1edd, {1, {0x1edc }}},\n { 0x1edf, {1, {0x1ede }}},\n { 0x1ee1, {1, {0x1ee0 }}},\n { 0x1ee3, {1, {0x1ee2 }}},\n { 0x1ee5, {1, {0x1ee4 }}},\n { 0x1ee7, {1, {0x1ee6 }}},\n { 0x1ee9, {1, {0x1ee8 }}},\n { 0x1eeb, {1, {0x1eea }}},\n { 0x1eed, {1, {0x1eec }}},\n { 0x1eef, {1, {0x1eee }}},\n { 0x1ef1, {1, {0x1ef0 }}},\n { 0x1ef3, {1, {0x1ef2 }}},\n { 0x1ef5, {1, {0x1ef4 }}},\n { 0x1ef7, {1, {0x1ef6 }}},\n { 0x1ef9, {1, {0x1ef8 }}},\n { 0x1efb, {1, {0x1efa }}},\n { 0x1efd, {1, {0x1efc }}},\n { 0x1eff, {1, {0x1efe }}},\n { 0x1f00, {1, {0x1f08 }}},\n { 0x1f01, {1, {0x1f09 }}},\n { 0x1f02, {1, {0x1f0a }}},\n { 0x1f03, {1, {0x1f0b }}},\n { 0x1f04, {1, {0x1f0c }}},\n { 0x1f05, {1, {0x1f0d }}},\n { 0x1f06, {1, {0x1f0e }}},\n { 0x1f07, {1, {0x1f0f }}},\n { 0x1f10, {1, {0x1f18 }}},\n { 0x1f11, {1, {0x1f19 }}},\n { 0x1f12, {1, {0x1f1a }}},\n { 0x1f13, {1, {0x1f1b }}},\n { 0x1f14, {1, {0x1f1c }}},\n { 0x1f15, {1, {0x1f1d }}},\n { 0x1f20, {1, {0x1f28 }}},\n { 0x1f21, {1, {0x1f29 }}},\n { 0x1f22, {1, {0x1f2a }}},\n { 0x1f23, {1, {0x1f2b }}},\n { 0x1f24, {1, {0x1f2c }}},\n { 0x1f25, {1, {0x1f2d }}},\n { 0x1f26, {1, {0x1f2e }}},\n { 0x1f27, {1, {0x1f2f }}},\n { 0x1f30, {1, {0x1f38 }}},\n { 0x1f31, {1, {0x1f39 }}},\n { 0x1f32, {1, {0x1f3a }}},\n { 0x1f33, {1, {0x1f3b }}},\n { 0x1f34, {1, {0x1f3c }}},\n { 0x1f35, {1, {0x1f3d }}},\n { 0x1f36, {1, {0x1f3e }}},\n { 0x1f37, {1, {0x1f3f }}},\n { 0x1f40, {1, {0x1f48 }}},\n { 0x1f41, {1, {0x1f49 }}},\n { 0x1f42, {1, {0x1f4a }}},\n { 0x1f43, {1, {0x1f4b }}},\n { 0x1f44, {1, {0x1f4c }}},\n { 0x1f45, {1, {0x1f4d }}},\n { 0x1f51, {1, {0x1f59 }}},\n { 0x1f53, {1, {0x1f5b }}},\n { 0x1f55, {1, {0x1f5d }}},\n { 0x1f57, {1, {0x1f5f }}},\n { 0x1f60, {1, {0x1f68 }}},\n { 0x1f61, {1, {0x1f69 }}},\n { 0x1f62, {1, {0x1f6a }}},\n { 0x1f63, {1, {0x1f6b }}},\n { 0x1f64, {1, {0x1f6c }}},\n { 0x1f65, {1, {0x1f6d }}},\n { 0x1f66, {1, {0x1f6e }}},\n { 0x1f67, {1, {0x1f6f }}},\n { 0x1f70, {1, {0x1fba }}},\n { 0x1f71, {1, {0x1fbb }}},\n { 0x1f72, {1, {0x1fc8 }}},\n { 0x1f73, {1, {0x1fc9 }}},\n { 0x1f74, {1, {0x1fca }}},\n { 0x1f75, {1, {0x1fcb }}},\n { 0x1f76, {1, {0x1fda }}},\n { 0x1f77, {1, {0x1fdb }}},\n { 0x1f78, {1, {0x1ff8 }}},\n { 0x1f79, {1, {0x1ff9 }}},\n { 0x1f7a, {1, {0x1fea }}},\n { 0x1f7b, {1, {0x1feb }}},\n { 0x1f7c, {1, {0x1ffa }}},\n { 0x1f7d, {1, {0x1ffb }}},\n { 0x1fb0, {1, {0x1fb8 }}},\n { 0x1fb1, {1, {0x1fb9 }}},\n { 0x1fd0, {1, {0x1fd8 }}},\n { 0x1fd1, {1, {0x1fd9 }}},\n { 0x1fe0, {1, {0x1fe8 }}},\n { 0x1fe1, {1, {0x1fe9 }}},\n { 0x1fe5, {1, {0x1fec }}},\n { 0x214e, {1, {0x2132 }}},\n { 0x2170, {1, {0x2160 }}},\n { 0x2171, {1, {0x2161 }}},\n { 0x2172, {1, {0x2162 }}},\n { 0x2173, {1, {0x2163 }}},\n { 0x2174, {1, {0x2164 }}},\n { 0x2175, {1, {0x2165 }}},\n { 0x2176, {1, {0x2166 }}},\n { 0x2177, {1, {0x2167 }}},\n { 0x2178, {1, {0x2168 }}},\n { 0x2179, {1, {0x2169 }}},\n { 0x217a, {1, {0x216a }}},\n { 0x217b, {1, {0x216b }}},\n { 0x217c, {1, {0x216c }}},\n { 0x217d, {1, {0x216d }}},\n { 0x217e, {1, {0x216e }}},\n { 0x217f, {1, {0x216f }}},\n { 0x2184, {1, {0x2183 }}},\n { 0x24d0, {1, {0x24b6 }}},\n { 0x24d1, {1, {0x24b7 }}},\n { 0x24d2, {1, {0x24b8 }}},\n { 0x24d3, {1, {0x24b9 }}},\n { 0x24d4, {1, {0x24ba }}},\n { 0x24d5, {1, {0x24bb }}},\n { 0x24d6, {1, {0x24bc }}},\n { 0x24d7, {1, {0x24bd }}},\n { 0x24d8, {1, {0x24be }}},\n { 0x24d9, {1, {0x24bf }}},\n { 0x24da, {1, {0x24c0 }}},\n { 0x24db, {1, {0x24c1 }}},\n { 0x24dc, {1, {0x24c2 }}},\n { 0x24dd, {1, {0x24c3 }}},\n { 0x24de, {1, {0x24c4 }}},\n { 0x24df, {1, {0x24c5 }}},\n { 0x24e0, {1, {0x24c6 }}},\n { 0x24e1, {1, {0x24c7 }}},\n { 0x24e2, {1, {0x24c8 }}},\n { 0x24e3, {1, {0x24c9 }}},\n { 0x24e4, {1, {0x24ca }}},\n { 0x24e5, {1, {0x24cb }}},\n { 0x24e6, {1, {0x24cc }}},\n { 0x24e7, {1, {0x24cd }}},\n { 0x24e8, {1, {0x24ce }}},\n { 0x24e9, {1, {0x24cf }}},\n { 0x2c30, {1, {0x2c00 }}},\n { 0x2c31, {1, {0x2c01 }}},\n { 0x2c32, {1, {0x2c02 }}},\n { 0x2c33, {1, {0x2c03 }}},\n { 0x2c34, {1, {0x2c04 }}},\n { 0x2c35, {1, {0x2c05 }}},\n { 0x2c36, {1, {0x2c06 }}},\n { 0x2c37, {1, {0x2c07 }}},\n { 0x2c38, {1, {0x2c08 }}},\n { 0x2c39, {1, {0x2c09 }}},\n { 0x2c3a, {1, {0x2c0a }}},\n { 0x2c3b, {1, {0x2c0b }}},\n { 0x2c3c, {1, {0x2c0c }}},\n { 0x2c3d, {1, {0x2c0d }}},\n { 0x2c3e, {1, {0x2c0e }}},\n { 0x2c3f, {1, {0x2c0f }}},\n { 0x2c40, {1, {0x2c10 }}},\n { 0x2c41, {1, {0x2c11 }}},\n { 0x2c42, {1, {0x2c12 }}},\n { 0x2c43, {1, {0x2c13 }}},\n { 0x2c44, {1, {0x2c14 }}},\n { 0x2c45, {1, {0x2c15 }}},\n { 0x2c46, {1, {0x2c16 }}},\n { 0x2c47, {1, {0x2c17 }}},\n { 0x2c48, {1, {0x2c18 }}},\n { 0x2c49, {1, {0x2c19 }}},\n { 0x2c4a, {1, {0x2c1a }}},\n { 0x2c4b, {1, {0x2c1b }}},\n { 0x2c4c, {1, {0x2c1c }}},\n { 0x2c4d, {1, {0x2c1d }}},\n { 0x2c4e, {1, {0x2c1e }}},\n { 0x2c4f, {1, {0x2c1f }}},\n { 0x2c50, {1, {0x2c20 }}},\n { 0x2c51, {1, {0x2c21 }}},\n { 0x2c52, {1, {0x2c22 }}},\n { 0x2c53, {1, {0x2c23 }}},\n { 0x2c54, {1, {0x2c24 }}},\n { 0x2c55, {1, {0x2c25 }}},\n { 0x2c56, {1, {0x2c26 }}},\n { 0x2c57, {1, {0x2c27 }}},\n { 0x2c58, {1, {0x2c28 }}},\n { 0x2c59, {1, {0x2c29 }}},\n { 0x2c5a, {1, {0x2c2a }}},\n { 0x2c5b, {1, {0x2c2b }}},\n { 0x2c5c, {1, {0x2c2c }}},\n { 0x2c5d, {1, {0x2c2d }}},\n { 0x2c5e, {1, {0x2c2e }}},\n { 0x2c61, {1, {0x2c60 }}},\n { 0x2c65, {1, {0x023a }}},\n { 0x2c66, {1, {0x023e }}},\n { 0x2c68, {1, {0x2c67 }}},\n { 0x2c6a, {1, {0x2c69 }}},\n { 0x2c6c, {1, {0x2c6b }}},\n { 0x2c73, {1, {0x2c72 }}},\n { 0x2c76, {1, {0x2c75 }}},\n { 0x2c81, {1, {0x2c80 }}},\n { 0x2c83, {1, {0x2c82 }}},\n { 0x2c85, {1, {0x2c84 }}},\n { 0x2c87, {1, {0x2c86 }}},\n { 0x2c89, {1, {0x2c88 }}},\n { 0x2c8b, {1, {0x2c8a }}},\n { 0x2c8d, {1, {0x2c8c }}},\n { 0x2c8f, {1, {0x2c8e }}},\n { 0x2c91, {1, {0x2c90 }}},\n { 0x2c93, {1, {0x2c92 }}},\n { 0x2c95, {1, {0x2c94 }}},\n { 0x2c97, {1, {0x2c96 }}},\n { 0x2c99, {1, {0x2c98 }}},\n { 0x2c9b, {1, {0x2c9a }}},\n { 0x2c9d, {1, {0x2c9c }}},\n { 0x2c9f, {1, {0x2c9e }}},\n { 0x2ca1, {1, {0x2ca0 }}},\n { 0x2ca3, {1, {0x2ca2 }}},\n { 0x2ca5, {1, {0x2ca4 }}},\n { 0x2ca7, {1, {0x2ca6 }}},\n { 0x2ca9, {1, {0x2ca8 }}},\n { 0x2cab, {1, {0x2caa }}},\n { 0x2cad, {1, {0x2cac }}},\n { 0x2caf, {1, {0x2cae }}},\n { 0x2cb1, {1, {0x2cb0 }}},\n { 0x2cb3, {1, {0x2cb2 }}},\n { 0x2cb5, {1, {0x2cb4 }}},\n { 0x2cb7, {1, {0x2cb6 }}},\n { 0x2cb9, {1, {0x2cb8 }}},\n { 0x2cbb, {1, {0x2cba }}},\n { 0x2cbd, {1, {0x2cbc }}},\n { 0x2cbf, {1, {0x2cbe }}},\n { 0x2cc1, {1, {0x2cc0 }}},\n { 0x2cc3, {1, {0x2cc2 }}},\n { 0x2cc5, {1, {0x2cc4 }}},\n { 0x2cc7, {1, {0x2cc6 }}},\n { 0x2cc9, {1, {0x2cc8 }}},\n { 0x2ccb, {1, {0x2cca }}},\n { 0x2ccd, {1, {0x2ccc }}},\n { 0x2ccf, {1, {0x2cce }}},\n { 0x2cd1, {1, {0x2cd0 }}},\n { 0x2cd3, {1, {0x2cd2 }}},\n { 0x2cd5, {1, {0x2cd4 }}},\n { 0x2cd7, {1, {0x2cd6 }}},\n { 0x2cd9, {1, {0x2cd8 }}},\n { 0x2cdb, {1, {0x2cda }}},\n { 0x2cdd, {1, {0x2cdc }}},\n { 0x2cdf, {1, {0x2cde }}},\n { 0x2ce1, {1, {0x2ce0 }}},\n { 0x2ce3, {1, {0x2ce2 }}},\n { 0x2cec, {1, {0x2ceb }}},\n { 0x2cee, {1, {0x2ced }}},\n { 0x2cf3, {1, {0x2cf2 }}},\n { 0x2d00, {1, {0x10a0 }}},\n { 0x2d01, {1, {0x10a1 }}},\n { 0x2d02, {1, {0x10a2 }}},\n { 0x2d03, {1, {0x10a3 }}},\n { 0x2d04, {1, {0x10a4 }}},\n { 0x2d05, {1, {0x10a5 }}},\n { 0x2d06, {1, {0x10a6 }}},\n { 0x2d07, {1, {0x10a7 }}},\n { 0x2d08, {1, {0x10a8 }}},\n { 0x2d09, {1, {0x10a9 }}},\n { 0x2d0a, {1, {0x10aa }}},\n { 0x2d0b, {1, {0x10ab }}},\n { 0x2d0c, {1, {0x10ac }}},\n { 0x2d0d, {1, {0x10ad }}},\n { 0x2d0e, {1, {0x10ae }}},\n { 0x2d0f, {1, {0x10af }}},\n { 0x2d10, {1, {0x10b0 }}},\n { 0x2d11, {1, {0x10b1 }}},\n { 0x2d12, {1, {0x10b2 }}},\n { 0x2d13, {1, {0x10b3 }}},\n { 0x2d14, {1, {0x10b4 }}},\n { 0x2d15, {1, {0x10b5 }}},\n { 0x2d16, {1, {0x10b6 }}},\n { 0x2d17, {1, {0x10b7 }}},\n { 0x2d18, {1, {0x10b8 }}},\n { 0x2d19, {1, {0x10b9 }}},\n { 0x2d1a, {1, {0x10ba }}},\n { 0x2d1b, {1, {0x10bb }}},\n { 0x2d1c, {1, {0x10bc }}},\n { 0x2d1d, {1, {0x10bd }}},\n { 0x2d1e, {1, {0x10be }}},\n { 0x2d1f, {1, {0x10bf }}},\n { 0x2d20, {1, {0x10c0 }}},\n { 0x2d21, {1, {0x10c1 }}},\n { 0x2d22, {1, {0x10c2 }}},\n { 0x2d23, {1, {0x10c3 }}},\n { 0x2d24, {1, {0x10c4 }}},\n { 0x2d25, {1, {0x10c5 }}},\n { 0x2d27, {1, {0x10c7 }}},\n { 0x2d2d, {1, {0x10cd }}},\n { 0xa641, {1, {0xa640 }}},\n { 0xa643, {1, {0xa642 }}},\n { 0xa645, {1, {0xa644 }}},\n { 0xa647, {1, {0xa646 }}},\n { 0xa649, {1, {0xa648 }}},\n { 0xa64b, {1, {0xa64a }}},\n { 0xa64d, {1, {0xa64c }}},\n { 0xa64f, {1, {0xa64e }}},\n { 0xa651, {1, {0xa650 }}},\n { 0xa653, {1, {0xa652 }}},\n { 0xa655, {1, {0xa654 }}},\n { 0xa657, {1, {0xa656 }}},\n { 0xa659, {1, {0xa658 }}},\n { 0xa65b, {1, {0xa65a }}},\n { 0xa65d, {1, {0xa65c }}},\n { 0xa65f, {1, {0xa65e }}},\n { 0xa661, {1, {0xa660 }}},\n { 0xa663, {1, {0xa662 }}},\n { 0xa665, {1, {0xa664 }}},\n { 0xa667, {1, {0xa666 }}},\n { 0xa669, {1, {0xa668 }}},\n { 0xa66b, {1, {0xa66a }}},\n { 0xa66d, {1, {0xa66c }}},\n { 0xa681, {1, {0xa680 }}},\n { 0xa683, {1, {0xa682 }}},\n { 0xa685, {1, {0xa684 }}},\n { 0xa687, {1, {0xa686 }}},\n { 0xa689, {1, {0xa688 }}},\n { 0xa68b, {1, {0xa68a }}},\n { 0xa68d, {1, {0xa68c }}},\n { 0xa68f, {1, {0xa68e }}},\n { 0xa691, {1, {0xa690 }}},\n { 0xa693, {1, {0xa692 }}},\n { 0xa695, {1, {0xa694 }}},\n { 0xa697, {1, {0xa696 }}},\n { 0xa723, {1, {0xa722 }}},\n { 0xa725, {1, {0xa724 }}},\n { 0xa727, {1, {0xa726 }}},\n { 0xa729, {1, {0xa728 }}},\n { 0xa72b, {1, {0xa72a }}},\n { 0xa72d, {1, {0xa72c }}},\n { 0xa72f, {1, {0xa72e }}},\n { 0xa733, {1, {0xa732 }}},\n { 0xa735, {1, {0xa734 }}},\n { 0xa737, {1, {0xa736 }}},\n { 0xa739, {1, {0xa738 }}},\n { 0xa73b, {1, {0xa73a }}},\n { 0xa73d, {1, {0xa73c }}},\n { 0xa73f, {1, {0xa73e }}},\n { 0xa741, {1, {0xa740 }}},\n { 0xa743, {1, {0xa742 }}},\n { 0xa745, {1, {0xa744 }}},\n { 0xa747, {1, {0xa746 }}},\n { 0xa749, {1, {0xa748 }}},\n { 0xa74b, {1, {0xa74a }}},\n { 0xa74d, {1, {0xa74c }}},\n { 0xa74f, {1, {0xa74e }}},\n { 0xa751, {1, {0xa750 }}},\n { 0xa753, {1, {0xa752 }}},\n { 0xa755, {1, {0xa754 }}},\n { 0xa757, {1, {0xa756 }}},\n { 0xa759, {1, {0xa758 }}},\n { 0xa75b, {1, {0xa75a }}},\n { 0xa75d, {1, {0xa75c }}},\n { 0xa75f, {1, {0xa75e }}},\n { 0xa761, {1, {0xa760 }}},\n { 0xa763, {1, {0xa762 }}},\n { 0xa765, {1, {0xa764 }}},\n { 0xa767, {1, {0xa766 }}},\n { 0xa769, {1, {0xa768 }}},\n { 0xa76b, {1, {0xa76a }}},\n { 0xa76d, {1, {0xa76c }}},\n { 0xa76f, {1, {0xa76e }}},\n { 0xa77a, {1, {0xa779 }}},\n { 0xa77c, {1, {0xa77b }}},\n { 0xa77f, {1, {0xa77e }}},\n { 0xa781, {1, {0xa780 }}},\n { 0xa783, {1, {0xa782 }}},\n { 0xa785, {1, {0xa784 }}},\n { 0xa787, {1, {0xa786 }}},\n { 0xa78c, {1, {0xa78b }}},\n { 0xa791, {1, {0xa790 }}},\n { 0xa793, {1, {0xa792 }}},\n { 0xa7a1, {1, {0xa7a0 }}},\n { 0xa7a3, {1, {0xa7a2 }}},\n { 0xa7a5, {1, {0xa7a4 }}},\n { 0xa7a7, {1, {0xa7a6 }}},\n { 0xa7a9, {1, {0xa7a8 }}},\n { 0xff41, {1, {0xff21 }}},\n { 0xff42, {1, {0xff22 }}},\n { 0xff43, {1, {0xff23 }}},\n { 0xff44, {1, {0xff24 }}},\n { 0xff45, {1, {0xff25 }}},\n { 0xff46, {1, {0xff26 }}},\n { 0xff47, {1, {0xff27 }}},\n { 0xff48, {1, {0xff28 }}},\n { 0xff49, {1, {0xff29 }}},\n { 0xff4a, {1, {0xff2a }}},\n { 0xff4b, {1, {0xff2b }}},\n { 0xff4c, {1, {0xff2c }}},\n { 0xff4d, {1, {0xff2d }}},\n { 0xff4e, {1, {0xff2e }}},\n { 0xff4f, {1, {0xff2f }}},\n { 0xff50, {1, {0xff30 }}},\n { 0xff51, {1, {0xff31 }}},\n { 0xff52, {1, {0xff32 }}},\n { 0xff53, {1, {0xff33 }}},\n { 0xff54, {1, {0xff34 }}},\n { 0xff55, {1, {0xff35 }}},\n { 0xff56, {1, {0xff36 }}},\n { 0xff57, {1, {0xff37 }}},\n { 0xff58, {1, {0xff38 }}},\n { 0xff59, {1, {0xff39 }}},\n { 0xff5a, {1, {0xff3a }}},\n { 0x10428, {1, {0x10400 }}},\n { 0x10429, {1, {0x10401 }}},\n { 0x1042a, {1, {0x10402 }}},\n { 0x1042b, {1, {0x10403 }}},\n { 0x1042c, {1, {0x10404 }}},\n { 0x1042d, {1, {0x10405 }}},\n { 0x1042e, {1, {0x10406 }}},\n { 0x1042f, {1, {0x10407 }}},\n { 0x10430, {1, {0x10408 }}},\n { 0x10431, {1, {0x10409 }}},\n { 0x10432, {1, {0x1040a }}},\n { 0x10433, {1, {0x1040b }}},\n { 0x10434, {1, {0x1040c }}},\n { 0x10435, {1, {0x1040d }}},\n { 0x10436, {1, {0x1040e }}},\n { 0x10437, {1, {0x1040f }}},\n { 0x10438, {1, {0x10410 }}},\n { 0x10439, {1, {0x10411 }}},\n { 0x1043a, {1, {0x10412 }}},\n { 0x1043b, {1, {0x10413 }}},\n { 0x1043c, {1, {0x10414 }}},\n { 0x1043d, {1, {0x10415 }}},\n { 0x1043e, {1, {0x10416 }}},\n { 0x1043f, {1, {0x10417 }}},\n { 0x10440, {1, {0x10418 }}},\n { 0x10441, {1, {0x10419 }}},\n { 0x10442, {1, {0x1041a }}},\n { 0x10443, {1, {0x1041b }}},\n { 0x10444, {1, {0x1041c }}},\n { 0x10445, {1, {0x1041d }}},\n { 0x10446, {1, {0x1041e }}},\n { 0x10447, {1, {0x1041f }}},\n { 0x10448, {1, {0x10420 }}},\n { 0x10449, {1, {0x10421 }}},\n { 0x1044a, {1, {0x10422 }}},\n { 0x1044b, {1, {0x10423 }}},\n { 0x1044c, {1, {0x10424 }}},\n { 0x1044d, {1, {0x10425 }}},\n { 0x1044e, {1, {0x10426 }}},\n { 0x1044f, {1, {0x10427 }}},\n};\n\nstatic const CaseUnfold_11_Type CaseUnfold_11_Locale[] = {\n { 0x0069, {1, {0x0049 }}},\n};\n\nstatic const CaseUnfold_12_Type CaseUnfold_12[] = {\n { {0x0061, 0x02be}, {1, {0x1e9a }}},\n { {0x0066, 0x0066}, {1, {0xfb00 }}},\n { {0x0066, 0x0069}, {1, {0xfb01 }}},\n { {0x0066, 0x006c}, {1, {0xfb02 }}},\n { {0x0068, 0x0331}, {1, {0x1e96 }}},\n { {0x006a, 0x030c}, {1, {0x01f0 }}},\n { {0x0073, 0x0073}, {2, {0x00df, 0x1e9e }}},\n { {0x0073, 0x0074}, {2, {0xfb05, 0xfb06 }}},\n { {0x0074, 0x0308}, {1, {0x1e97 }}},\n { {0x0077, 0x030a}, {1, {0x1e98 }}},\n { {0x0079, 0x030a}, {1, {0x1e99 }}},\n { {0x02bc, 0x006e}, {1, {0x0149 }}},\n { {0x03ac, 0x03b9}, {1, {0x1fb4 }}},\n { {0x03ae, 0x03b9}, {1, {0x1fc4 }}},\n { {0x03b1, 0x0342}, {1, {0x1fb6 }}},\n { {0x03b1, 0x03b9}, {2, {0x1fb3, 0x1fbc }}},\n { {0x03b7, 0x0342}, {1, {0x1fc6 }}},\n { {0x03b7, 0x03b9}, {2, {0x1fc3, 0x1fcc }}},\n { {0x03b9, 0x0342}, {1, {0x1fd6 }}},\n { {0x03c1, 0x0313}, {1, {0x1fe4 }}},\n { {0x03c5, 0x0313}, {1, {0x1f50 }}},\n { {0x03c5, 0x0342}, {1, {0x1fe6 }}},\n { {0x03c9, 0x0342}, {1, {0x1ff6 }}},\n { {0x03c9, 0x03b9}, {2, {0x1ff3, 0x1ffc }}},\n { {0x03ce, 0x03b9}, {1, {0x1ff4 }}},\n { {0x0565, 0x0582}, {1, {0x0587 }}},\n { {0x0574, 0x0565}, {1, {0xfb14 }}},\n { {0x0574, 0x056b}, {1, {0xfb15 }}},\n { {0x0574, 0x056d}, {1, {0xfb17 }}},\n { {0x0574, 0x0576}, {1, {0xfb13 }}},\n { {0x057e, 0x0576}, {1, {0xfb16 }}},\n { {0x1f00, 0x03b9}, {2, {0x1f80, 0x1f88 }}},\n { {0x1f01, 0x03b9}, {2, {0x1f81, 0x1f89 }}},\n { {0x1f02, 0x03b9}, {2, {0x1f82, 0x1f8a }}},\n { {0x1f03, 0x03b9}, {2, {0x1f83, 0x1f8b }}},\n { {0x1f04, 0x03b9}, {2, {0x1f84, 0x1f8c }}},\n { {0x1f05, 0x03b9}, {2, {0x1f85, 0x1f8d }}},\n { {0x1f06, 0x03b9}, {2, {0x1f86, 0x1f8e }}},\n { {0x1f07, 0x03b9}, {2, {0x1f87, 0x1f8f }}},\n { {0x1f20, 0x03b9}, {2, {0x1f90, 0x1f98 }}},\n { {0x1f21, 0x03b9}, {2, {0x1f91, 0x1f99 }}},\n { {0x1f22, 0x03b9}, {2, {0x1f92, 0x1f9a }}},\n { {0x1f23, 0x03b9}, {2, {0x1f93, 0x1f9b }}},\n { {0x1f24, 0x03b9}, {2, {0x1f94, 0x1f9c }}},\n { {0x1f25, 0x03b9}, {2, {0x1f95, 0x1f9d }}},\n { {0x1f26, 0x03b9}, {2, {0x1f96, 0x1f9e }}},\n { {0x1f27, 0x03b9}, {2, {0x1f97, 0x1f9f }}},\n { {0x1f60, 0x03b9}, {2, {0x1fa0, 0x1fa8 }}},\n { {0x1f61, 0x03b9}, {2, {0x1fa1, 0x1fa9 }}},\n { {0x1f62, 0x03b9}, {2, {0x1fa2, 0x1faa }}},\n { {0x1f63, 0x03b9}, {2, {0x1fa3, 0x1fab }}},\n { {0x1f64, 0x03b9}, {2, {0x1fa4, 0x1fac }}},\n { {0x1f65, 0x03b9}, {2, {0x1fa5, 0x1fad }}},\n { {0x1f66, 0x03b9}, {2, {0x1fa6, 0x1fae }}},\n { {0x1f67, 0x03b9}, {2, {0x1fa7, 0x1faf }}},\n { {0x1f70, 0x03b9}, {1, {0x1fb2 }}},\n { {0x1f74, 0x03b9}, {1, {0x1fc2 }}},\n { {0x1f7c, 0x03b9}, {1, {0x1ff2 }}},\n};\n\nstatic const CaseUnfold_12_Type CaseUnfold_12_Locale[] = {\n { {0x0069, 0x0307}, {1, {0x0130 }}},\n};\n\nstatic const CaseUnfold_13_Type CaseUnfold_13[] = {\n { {0x0066, 0x0066, 0x0069}, {1, {0xfb03 }}},\n { {0x0066, 0x0066, 0x006c}, {1, {0xfb04 }}},\n { {0x03b1, 0x0342, 0x03b9}, {1, {0x1fb7 }}},\n { {0x03b7, 0x0342, 0x03b9}, {1, {0x1fc7 }}},\n { {0x03b9, 0x0308, 0x0300}, {1, {0x1fd2 }}},\n { {0x03b9, 0x0308, 0x0301}, {2, {0x0390, 0x1fd3 }}},\n { {0x03b9, 0x0308, 0x0342}, {1, {0x1fd7 }}},\n { {0x03c5, 0x0308, 0x0300}, {1, {0x1fe2 }}},\n { {0x03c5, 0x0308, 0x0301}, {2, {0x03b0, 0x1fe3 }}},\n { {0x03c5, 0x0308, 0x0342}, {1, {0x1fe7 }}},\n { {0x03c5, 0x0313, 0x0300}, {1, {0x1f52 }}},\n { {0x03c5, 0x0313, 0x0301}, {1, {0x1f54 }}},\n { {0x03c5, 0x0313, 0x0342}, {1, {0x1f56 }}},\n { {0x03c9, 0x0342, 0x03b9}, {1, {0x1ff7 }}},\n};\n\n#define FOLD_TABLE_SIZE\t\t1357\n#define UNFOLD1_TABLE_SIZE\t1207\n#define UNFOLD2_TABLE_SIZE\t88\n#define UNFOLD3_TABLE_SIZE\t23\n"
  },
  {
    "path": "src/Onigmo/enc/unicode/name2ctype.h",
    "content": "/* C code produced by gperf version 3.0.3 */\n/* Command-line: gperf -7 -c -j1 -i1 -t -C -P -T -H uniname2ctype_hash -Q uniname2ctype_pool -N uniname2ctype_p  */\n#ifndef USE_UNICODE_PROPERTIES\n/* Computed positions: -k'1,3' */\n#else /* USE_UNICODE_PROPERTIES */\n/* Computed positions: -k'1-3,5-6,12,16,$' */\n#endif /* USE_UNICODE_PROPERTIES */\n\n#if !((' ' == 32) && ('!' == 33) && ('\"' == 34) && ('#' == 35) \\\n      && ('%' == 37) && ('&' == 38) && ('\\'' == 39) && ('(' == 40) \\\n      && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \\\n      && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \\\n      && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \\\n      && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \\\n      && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \\\n      && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \\\n      && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \\\n      && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \\\n      && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \\\n      && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \\\n      && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \\\n      && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \\\n      && ('Z' == 90) && ('[' == 91) && ('\\\\' == 92) && (']' == 93) \\\n      && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \\\n      && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \\\n      && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \\\n      && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \\\n      && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \\\n      && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \\\n      && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \\\n      && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))\n/* The character set is not based on ISO-646.  */\nerror \"gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>.\"\n#endif\n\n\n#define long size_t\n\n/* 'NEWLINE': [[:NEWLINE:]] */\nstatic const OnigCodePoint CR_NEWLINE[] = {\n\t1,\n\t0x000a, 0x000a,\n}; /* CR_NEWLINE */\n\n/* 'Alpha': [[:Alpha:]] */\nstatic const OnigCodePoint CR_Alpha[] = {\n\t540,\n\t0x0041, 0x005a,\n\t0x0061, 0x007a,\n\t0x00aa, 0x00aa,\n\t0x00b5, 0x00b5,\n\t0x00ba, 0x00ba,\n\t0x00c0, 0x00d6,\n\t0x00d8, 0x00f6,\n\t0x00f8, 0x02c1,\n\t0x02c6, 0x02d1,\n\t0x02e0, 0x02e4,\n\t0x02ec, 0x02ec,\n\t0x02ee, 0x02ee,\n\t0x0345, 0x0345,\n\t0x0370, 0x0374,\n\t0x0376, 0x0377,\n\t0x037a, 0x037d,\n\t0x0386, 0x0386,\n\t0x0388, 0x038a,\n\t0x038c, 0x038c,\n\t0x038e, 0x03a1,\n\t0x03a3, 0x03f5,\n\t0x03f7, 0x0481,\n\t0x048a, 0x0527,\n\t0x0531, 0x0556,\n\t0x0559, 0x0559,\n\t0x0561, 0x0587,\n\t0x05b0, 0x05bd,\n\t0x05bf, 0x05bf,\n\t0x05c1, 0x05c2,\n\t0x05c4, 0x05c5,\n\t0x05c7, 0x05c7,\n\t0x05d0, 0x05ea,\n\t0x05f0, 0x05f2,\n\t0x0610, 0x061a,\n\t0x0620, 0x0657,\n\t0x0659, 0x065f,\n\t0x066e, 0x06d3,\n\t0x06d5, 0x06dc,\n\t0x06e1, 0x06e8,\n\t0x06ed, 0x06ef,\n\t0x06fa, 0x06fc,\n\t0x06ff, 0x06ff,\n\t0x0710, 0x073f,\n\t0x074d, 0x07b1,\n\t0x07ca, 0x07ea,\n\t0x07f4, 0x07f5,\n\t0x07fa, 0x07fa,\n\t0x0800, 0x0817,\n\t0x081a, 0x082c,\n\t0x0840, 0x0858,\n\t0x08a0, 0x08a0,\n\t0x08a2, 0x08ac,\n\t0x08e4, 0x08e9,\n\t0x08f0, 0x08fe,\n\t0x0900, 0x093b,\n\t0x093d, 0x094c,\n\t0x094e, 0x0950,\n\t0x0955, 0x0963,\n\t0x0971, 0x0977,\n\t0x0979, 0x097f,\n\t0x0981, 0x0983,\n\t0x0985, 0x098c,\n\t0x098f, 0x0990,\n\t0x0993, 0x09a8,\n\t0x09aa, 0x09b0,\n\t0x09b2, 0x09b2,\n\t0x09b6, 0x09b9,\n\t0x09bd, 0x09c4,\n\t0x09c7, 0x09c8,\n\t0x09cb, 0x09cc,\n\t0x09ce, 0x09ce,\n\t0x09d7, 0x09d7,\n\t0x09dc, 0x09dd,\n\t0x09df, 0x09e3,\n\t0x09f0, 0x09f1,\n\t0x0a01, 0x0a03,\n\t0x0a05, 0x0a0a,\n\t0x0a0f, 0x0a10,\n\t0x0a13, 0x0a28,\n\t0x0a2a, 0x0a30,\n\t0x0a32, 0x0a33,\n\t0x0a35, 0x0a36,\n\t0x0a38, 0x0a39,\n\t0x0a3e, 0x0a42,\n\t0x0a47, 0x0a48,\n\t0x0a4b, 0x0a4c,\n\t0x0a51, 0x0a51,\n\t0x0a59, 0x0a5c,\n\t0x0a5e, 0x0a5e,\n\t0x0a70, 0x0a75,\n\t0x0a81, 0x0a83,\n\t0x0a85, 0x0a8d,\n\t0x0a8f, 0x0a91,\n\t0x0a93, 0x0aa8,\n\t0x0aaa, 0x0ab0,\n\t0x0ab2, 0x0ab3,\n\t0x0ab5, 0x0ab9,\n\t0x0abd, 0x0ac5,\n\t0x0ac7, 0x0ac9,\n\t0x0acb, 0x0acc,\n\t0x0ad0, 0x0ad0,\n\t0x0ae0, 0x0ae3,\n\t0x0b01, 0x0b03,\n\t0x0b05, 0x0b0c,\n\t0x0b0f, 0x0b10,\n\t0x0b13, 0x0b28,\n\t0x0b2a, 0x0b30,\n\t0x0b32, 0x0b33,\n\t0x0b35, 0x0b39,\n\t0x0b3d, 0x0b44,\n\t0x0b47, 0x0b48,\n\t0x0b4b, 0x0b4c,\n\t0x0b56, 0x0b57,\n\t0x0b5c, 0x0b5d,\n\t0x0b5f, 0x0b63,\n\t0x0b71, 0x0b71,\n\t0x0b82, 0x0b83,\n\t0x0b85, 0x0b8a,\n\t0x0b8e, 0x0b90,\n\t0x0b92, 0x0b95,\n\t0x0b99, 0x0b9a,\n\t0x0b9c, 0x0b9c,\n\t0x0b9e, 0x0b9f,\n\t0x0ba3, 0x0ba4,\n\t0x0ba8, 0x0baa,\n\t0x0bae, 0x0bb9,\n\t0x0bbe, 0x0bc2,\n\t0x0bc6, 0x0bc8,\n\t0x0bca, 0x0bcc,\n\t0x0bd0, 0x0bd0,\n\t0x0bd7, 0x0bd7,\n\t0x0c01, 0x0c03,\n\t0x0c05, 0x0c0c,\n\t0x0c0e, 0x0c10,\n\t0x0c12, 0x0c28,\n\t0x0c2a, 0x0c33,\n\t0x0c35, 0x0c39,\n\t0x0c3d, 0x0c44,\n\t0x0c46, 0x0c48,\n\t0x0c4a, 0x0c4c,\n\t0x0c55, 0x0c56,\n\t0x0c58, 0x0c59,\n\t0x0c60, 0x0c63,\n\t0x0c82, 0x0c83,\n\t0x0c85, 0x0c8c,\n\t0x0c8e, 0x0c90,\n\t0x0c92, 0x0ca8,\n\t0x0caa, 0x0cb3,\n\t0x0cb5, 0x0cb9,\n\t0x0cbd, 0x0cc4,\n\t0x0cc6, 0x0cc8,\n\t0x0cca, 0x0ccc,\n\t0x0cd5, 0x0cd6,\n\t0x0cde, 0x0cde,\n\t0x0ce0, 0x0ce3,\n\t0x0cf1, 0x0cf2,\n\t0x0d02, 0x0d03,\n\t0x0d05, 0x0d0c,\n\t0x0d0e, 0x0d10,\n\t0x0d12, 0x0d3a,\n\t0x0d3d, 0x0d44,\n\t0x0d46, 0x0d48,\n\t0x0d4a, 0x0d4c,\n\t0x0d4e, 0x0d4e,\n\t0x0d57, 0x0d57,\n\t0x0d60, 0x0d63,\n\t0x0d7a, 0x0d7f,\n\t0x0d82, 0x0d83,\n\t0x0d85, 0x0d96,\n\t0x0d9a, 0x0db1,\n\t0x0db3, 0x0dbb,\n\t0x0dbd, 0x0dbd,\n\t0x0dc0, 0x0dc6,\n\t0x0dcf, 0x0dd4,\n\t0x0dd6, 0x0dd6,\n\t0x0dd8, 0x0ddf,\n\t0x0df2, 0x0df3,\n\t0x0e01, 0x0e3a,\n\t0x0e40, 0x0e46,\n\t0x0e4d, 0x0e4d,\n\t0x0e81, 0x0e82,\n\t0x0e84, 0x0e84,\n\t0x0e87, 0x0e88,\n\t0x0e8a, 0x0e8a,\n\t0x0e8d, 0x0e8d,\n\t0x0e94, 0x0e97,\n\t0x0e99, 0x0e9f,\n\t0x0ea1, 0x0ea3,\n\t0x0ea5, 0x0ea5,\n\t0x0ea7, 0x0ea7,\n\t0x0eaa, 0x0eab,\n\t0x0ead, 0x0eb9,\n\t0x0ebb, 0x0ebd,\n\t0x0ec0, 0x0ec4,\n\t0x0ec6, 0x0ec6,\n\t0x0ecd, 0x0ecd,\n\t0x0edc, 0x0edf,\n\t0x0f00, 0x0f00,\n\t0x0f40, 0x0f47,\n\t0x0f49, 0x0f6c,\n\t0x0f71, 0x0f81,\n\t0x0f88, 0x0f97,\n\t0x0f99, 0x0fbc,\n\t0x1000, 0x1036,\n\t0x1038, 0x1038,\n\t0x103b, 0x103f,\n\t0x1050, 0x1062,\n\t0x1065, 0x1068,\n\t0x106e, 0x1086,\n\t0x108e, 0x108e,\n\t0x109c, 0x109d,\n\t0x10a0, 0x10c5,\n\t0x10c7, 0x10c7,\n\t0x10cd, 0x10cd,\n\t0x10d0, 0x10fa,\n\t0x10fc, 0x1248,\n\t0x124a, 0x124d,\n\t0x1250, 0x1256,\n\t0x1258, 0x1258,\n\t0x125a, 0x125d,\n\t0x1260, 0x1288,\n\t0x128a, 0x128d,\n\t0x1290, 0x12b0,\n\t0x12b2, 0x12b5,\n\t0x12b8, 0x12be,\n\t0x12c0, 0x12c0,\n\t0x12c2, 0x12c5,\n\t0x12c8, 0x12d6,\n\t0x12d8, 0x1310,\n\t0x1312, 0x1315,\n\t0x1318, 0x135a,\n\t0x135f, 0x135f,\n\t0x1380, 0x138f,\n\t0x13a0, 0x13f4,\n\t0x1401, 0x166c,\n\t0x166f, 0x167f,\n\t0x1681, 0x169a,\n\t0x16a0, 0x16ea,\n\t0x16ee, 0x16f0,\n\t0x1700, 0x170c,\n\t0x170e, 0x1713,\n\t0x1720, 0x1733,\n\t0x1740, 0x1753,\n\t0x1760, 0x176c,\n\t0x176e, 0x1770,\n\t0x1772, 0x1773,\n\t0x1780, 0x17b3,\n\t0x17b6, 0x17c8,\n\t0x17d7, 0x17d7,\n\t0x17dc, 0x17dc,\n\t0x1820, 0x1877,\n\t0x1880, 0x18aa,\n\t0x18b0, 0x18f5,\n\t0x1900, 0x191c,\n\t0x1920, 0x192b,\n\t0x1930, 0x1938,\n\t0x1950, 0x196d,\n\t0x1970, 0x1974,\n\t0x1980, 0x19ab,\n\t0x19b0, 0x19c9,\n\t0x1a00, 0x1a1b,\n\t0x1a20, 0x1a5e,\n\t0x1a61, 0x1a74,\n\t0x1aa7, 0x1aa7,\n\t0x1b00, 0x1b33,\n\t0x1b35, 0x1b43,\n\t0x1b45, 0x1b4b,\n\t0x1b80, 0x1ba9,\n\t0x1bac, 0x1baf,\n\t0x1bba, 0x1be5,\n\t0x1be7, 0x1bf1,\n\t0x1c00, 0x1c35,\n\t0x1c4d, 0x1c4f,\n\t0x1c5a, 0x1c7d,\n\t0x1ce9, 0x1cec,\n\t0x1cee, 0x1cf3,\n\t0x1cf5, 0x1cf6,\n\t0x1d00, 0x1dbf,\n\t0x1e00, 0x1f15,\n\t0x1f18, 0x1f1d,\n\t0x1f20, 0x1f45,\n\t0x1f48, 0x1f4d,\n\t0x1f50, 0x1f57,\n\t0x1f59, 0x1f59,\n\t0x1f5b, 0x1f5b,\n\t0x1f5d, 0x1f5d,\n\t0x1f5f, 0x1f7d,\n\t0x1f80, 0x1fb4,\n\t0x1fb6, 0x1fbc,\n\t0x1fbe, 0x1fbe,\n\t0x1fc2, 0x1fc4,\n\t0x1fc6, 0x1fcc,\n\t0x1fd0, 0x1fd3,\n\t0x1fd6, 0x1fdb,\n\t0x1fe0, 0x1fec,\n\t0x1ff2, 0x1ff4,\n\t0x1ff6, 0x1ffc,\n\t0x2071, 0x2071,\n\t0x207f, 0x207f,\n\t0x2090, 0x209c,\n\t0x2102, 0x2102,\n\t0x2107, 0x2107,\n\t0x210a, 0x2113,\n\t0x2115, 0x2115,\n\t0x2119, 0x211d,\n\t0x2124, 0x2124,\n\t0x2126, 0x2126,\n\t0x2128, 0x2128,\n\t0x212a, 0x212d,\n\t0x212f, 0x2139,\n\t0x213c, 0x213f,\n\t0x2145, 0x2149,\n\t0x214e, 0x214e,\n\t0x2160, 0x2188,\n\t0x24b6, 0x24e9,\n\t0x2c00, 0x2c2e,\n\t0x2c30, 0x2c5e,\n\t0x2c60, 0x2ce4,\n\t0x2ceb, 0x2cee,\n\t0x2cf2, 0x2cf3,\n\t0x2d00, 0x2d25,\n\t0x2d27, 0x2d27,\n\t0x2d2d, 0x2d2d,\n\t0x2d30, 0x2d67,\n\t0x2d6f, 0x2d6f,\n\t0x2d80, 0x2d96,\n\t0x2da0, 0x2da6,\n\t0x2da8, 0x2dae,\n\t0x2db0, 0x2db6,\n\t0x2db8, 0x2dbe,\n\t0x2dc0, 0x2dc6,\n\t0x2dc8, 0x2dce,\n\t0x2dd0, 0x2dd6,\n\t0x2dd8, 0x2dde,\n\t0x2de0, 0x2dff,\n\t0x2e2f, 0x2e2f,\n\t0x3005, 0x3007,\n\t0x3021, 0x3029,\n\t0x3031, 0x3035,\n\t0x3038, 0x303c,\n\t0x3041, 0x3096,\n\t0x309d, 0x309f,\n\t0x30a1, 0x30fa,\n\t0x30fc, 0x30ff,\n\t0x3105, 0x312d,\n\t0x3131, 0x318e,\n\t0x31a0, 0x31ba,\n\t0x31f0, 0x31ff,\n\t0x3400, 0x4db5,\n\t0x4e00, 0x9fcc,\n\t0xa000, 0xa48c,\n\t0xa4d0, 0xa4fd,\n\t0xa500, 0xa60c,\n\t0xa610, 0xa61f,\n\t0xa62a, 0xa62b,\n\t0xa640, 0xa66e,\n\t0xa674, 0xa67b,\n\t0xa67f, 0xa697,\n\t0xa69f, 0xa6ef,\n\t0xa717, 0xa71f,\n\t0xa722, 0xa788,\n\t0xa78b, 0xa78e,\n\t0xa790, 0xa793,\n\t0xa7a0, 0xa7aa,\n\t0xa7f8, 0xa801,\n\t0xa803, 0xa805,\n\t0xa807, 0xa80a,\n\t0xa80c, 0xa827,\n\t0xa840, 0xa873,\n\t0xa880, 0xa8c3,\n\t0xa8f2, 0xa8f7,\n\t0xa8fb, 0xa8fb,\n\t0xa90a, 0xa92a,\n\t0xa930, 0xa952,\n\t0xa960, 0xa97c,\n\t0xa980, 0xa9b2,\n\t0xa9b4, 0xa9bf,\n\t0xa9cf, 0xa9cf,\n\t0xaa00, 0xaa36,\n\t0xaa40, 0xaa4d,\n\t0xaa60, 0xaa76,\n\t0xaa7a, 0xaa7a,\n\t0xaa80, 0xaabe,\n\t0xaac0, 0xaac0,\n\t0xaac2, 0xaac2,\n\t0xaadb, 0xaadd,\n\t0xaae0, 0xaaef,\n\t0xaaf2, 0xaaf5,\n\t0xab01, 0xab06,\n\t0xab09, 0xab0e,\n\t0xab11, 0xab16,\n\t0xab20, 0xab26,\n\t0xab28, 0xab2e,\n\t0xabc0, 0xabea,\n\t0xac00, 0xd7a3,\n\t0xd7b0, 0xd7c6,\n\t0xd7cb, 0xd7fb,\n\t0xf900, 0xfa6d,\n\t0xfa70, 0xfad9,\n\t0xfb00, 0xfb06,\n\t0xfb13, 0xfb17,\n\t0xfb1d, 0xfb28,\n\t0xfb2a, 0xfb36,\n\t0xfb38, 0xfb3c,\n\t0xfb3e, 0xfb3e,\n\t0xfb40, 0xfb41,\n\t0xfb43, 0xfb44,\n\t0xfb46, 0xfbb1,\n\t0xfbd3, 0xfd3d,\n\t0xfd50, 0xfd8f,\n\t0xfd92, 0xfdc7,\n\t0xfdf0, 0xfdfb,\n\t0xfe70, 0xfe74,\n\t0xfe76, 0xfefc,\n\t0xff21, 0xff3a,\n\t0xff41, 0xff5a,\n\t0xff66, 0xffbe,\n\t0xffc2, 0xffc7,\n\t0xffca, 0xffcf,\n\t0xffd2, 0xffd7,\n\t0xffda, 0xffdc,\n\t0x10000, 0x1000b,\n\t0x1000d, 0x10026,\n\t0x10028, 0x1003a,\n\t0x1003c, 0x1003d,\n\t0x1003f, 0x1004d,\n\t0x10050, 0x1005d,\n\t0x10080, 0x100fa,\n\t0x10140, 0x10174,\n\t0x10280, 0x1029c,\n\t0x102a0, 0x102d0,\n\t0x10300, 0x1031e,\n\t0x10330, 0x1034a,\n\t0x10380, 0x1039d,\n\t0x103a0, 0x103c3,\n\t0x103c8, 0x103cf,\n\t0x103d1, 0x103d5,\n\t0x10400, 0x1049d,\n\t0x10800, 0x10805,\n\t0x10808, 0x10808,\n\t0x1080a, 0x10835,\n\t0x10837, 0x10838,\n\t0x1083c, 0x1083c,\n\t0x1083f, 0x10855,\n\t0x10900, 0x10915,\n\t0x10920, 0x10939,\n\t0x10980, 0x109b7,\n\t0x109be, 0x109bf,\n\t0x10a00, 0x10a03,\n\t0x10a05, 0x10a06,\n\t0x10a0c, 0x10a13,\n\t0x10a15, 0x10a17,\n\t0x10a19, 0x10a33,\n\t0x10a60, 0x10a7c,\n\t0x10b00, 0x10b35,\n\t0x10b40, 0x10b55,\n\t0x10b60, 0x10b72,\n\t0x10c00, 0x10c48,\n\t0x11000, 0x11045,\n\t0x11082, 0x110b8,\n\t0x110d0, 0x110e8,\n\t0x11100, 0x11132,\n\t0x11180, 0x111bf,\n\t0x111c1, 0x111c4,\n\t0x11680, 0x116b5,\n\t0x12000, 0x1236e,\n\t0x12400, 0x12462,\n\t0x13000, 0x1342e,\n\t0x16800, 0x16a38,\n\t0x16f00, 0x16f44,\n\t0x16f50, 0x16f7e,\n\t0x16f93, 0x16f9f,\n\t0x1b000, 0x1b001,\n\t0x1d400, 0x1d454,\n\t0x1d456, 0x1d49c,\n\t0x1d49e, 0x1d49f,\n\t0x1d4a2, 0x1d4a2,\n\t0x1d4a5, 0x1d4a6,\n\t0x1d4a9, 0x1d4ac,\n\t0x1d4ae, 0x1d4b9,\n\t0x1d4bb, 0x1d4bb,\n\t0x1d4bd, 0x1d4c3,\n\t0x1d4c5, 0x1d505,\n\t0x1d507, 0x1d50a,\n\t0x1d50d, 0x1d514,\n\t0x1d516, 0x1d51c,\n\t0x1d51e, 0x1d539,\n\t0x1d53b, 0x1d53e,\n\t0x1d540, 0x1d544,\n\t0x1d546, 0x1d546,\n\t0x1d54a, 0x1d550,\n\t0x1d552, 0x1d6a5,\n\t0x1d6a8, 0x1d6c0,\n\t0x1d6c2, 0x1d6da,\n\t0x1d6dc, 0x1d6fa,\n\t0x1d6fc, 0x1d714,\n\t0x1d716, 0x1d734,\n\t0x1d736, 0x1d74e,\n\t0x1d750, 0x1d76e,\n\t0x1d770, 0x1d788,\n\t0x1d78a, 0x1d7a8,\n\t0x1d7aa, 0x1d7c2,\n\t0x1d7c4, 0x1d7cb,\n\t0x1ee00, 0x1ee03,\n\t0x1ee05, 0x1ee1f,\n\t0x1ee21, 0x1ee22,\n\t0x1ee24, 0x1ee24,\n\t0x1ee27, 0x1ee27,\n\t0x1ee29, 0x1ee32,\n\t0x1ee34, 0x1ee37,\n\t0x1ee39, 0x1ee39,\n\t0x1ee3b, 0x1ee3b,\n\t0x1ee42, 0x1ee42,\n\t0x1ee47, 0x1ee47,\n\t0x1ee49, 0x1ee49,\n\t0x1ee4b, 0x1ee4b,\n\t0x1ee4d, 0x1ee4f,\n\t0x1ee51, 0x1ee52,\n\t0x1ee54, 0x1ee54,\n\t0x1ee57, 0x1ee57,\n\t0x1ee59, 0x1ee59,\n\t0x1ee5b, 0x1ee5b,\n\t0x1ee5d, 0x1ee5d,\n\t0x1ee5f, 0x1ee5f,\n\t0x1ee61, 0x1ee62,\n\t0x1ee64, 0x1ee64,\n\t0x1ee67, 0x1ee6a,\n\t0x1ee6c, 0x1ee72,\n\t0x1ee74, 0x1ee77,\n\t0x1ee79, 0x1ee7c,\n\t0x1ee7e, 0x1ee7e,\n\t0x1ee80, 0x1ee89,\n\t0x1ee8b, 0x1ee9b,\n\t0x1eea1, 0x1eea3,\n\t0x1eea5, 0x1eea9,\n\t0x1eeab, 0x1eebb,\n\t0x20000, 0x2a6d6,\n\t0x2a700, 0x2b734,\n\t0x2b740, 0x2b81d,\n\t0x2f800, 0x2fa1d,\n}; /* CR_Alpha */\n\n/* 'Blank': [[:Blank:]] */\nstatic const OnigCodePoint CR_Blank[] = {\n\t9,\n\t0x0009, 0x0009,\n\t0x0020, 0x0020,\n\t0x00a0, 0x00a0,\n\t0x1680, 0x1680,\n\t0x180e, 0x180e,\n\t0x2000, 0x200a,\n\t0x202f, 0x202f,\n\t0x205f, 0x205f,\n\t0x3000, 0x3000,\n}; /* CR_Blank */\n\n/* 'Cntrl': [[:Cntrl:]] */\nstatic const OnigCodePoint CR_Cntrl[] = {\n\t2,\n\t0x0000, 0x001f,\n\t0x007f, 0x009f,\n}; /* CR_Cntrl */\n\n/* 'Digit': [[:Digit:]] */\nstatic const OnigCodePoint CR_Digit[] = {\n\t42,\n\t0x0030, 0x0039,\n\t0x0660, 0x0669,\n\t0x06f0, 0x06f9,\n\t0x07c0, 0x07c9,\n\t0x0966, 0x096f,\n\t0x09e6, 0x09ef,\n\t0x0a66, 0x0a6f,\n\t0x0ae6, 0x0aef,\n\t0x0b66, 0x0b6f,\n\t0x0be6, 0x0bef,\n\t0x0c66, 0x0c6f,\n\t0x0ce6, 0x0cef,\n\t0x0d66, 0x0d6f,\n\t0x0e50, 0x0e59,\n\t0x0ed0, 0x0ed9,\n\t0x0f20, 0x0f29,\n\t0x1040, 0x1049,\n\t0x1090, 0x1099,\n\t0x17e0, 0x17e9,\n\t0x1810, 0x1819,\n\t0x1946, 0x194f,\n\t0x19d0, 0x19d9,\n\t0x1a80, 0x1a89,\n\t0x1a90, 0x1a99,\n\t0x1b50, 0x1b59,\n\t0x1bb0, 0x1bb9,\n\t0x1c40, 0x1c49,\n\t0x1c50, 0x1c59,\n\t0xa620, 0xa629,\n\t0xa8d0, 0xa8d9,\n\t0xa900, 0xa909,\n\t0xa9d0, 0xa9d9,\n\t0xaa50, 0xaa59,\n\t0xabf0, 0xabf9,\n\t0xff10, 0xff19,\n\t0x104a0, 0x104a9,\n\t0x11066, 0x1106f,\n\t0x110f0, 0x110f9,\n\t0x11136, 0x1113f,\n\t0x111d0, 0x111d9,\n\t0x116c0, 0x116c9,\n\t0x1d7ce, 0x1d7ff,\n}; /* CR_Digit */\n\n/* 'Graph': [[:Graph:]] */\nstatic const OnigCodePoint CR_Graph[] = {\n\t544,\n\t0x0021, 0x007e,\n\t0x00a1, 0x0377,\n\t0x037a, 0x037e,\n\t0x0384, 0x038a,\n\t0x038c, 0x038c,\n\t0x038e, 0x03a1,\n\t0x03a3, 0x0527,\n\t0x0531, 0x0556,\n\t0x0559, 0x055f,\n\t0x0561, 0x0587,\n\t0x0589, 0x058a,\n\t0x058f, 0x058f,\n\t0x0591, 0x05c7,\n\t0x05d0, 0x05ea,\n\t0x05f0, 0x05f4,\n\t0x0600, 0x0604,\n\t0x0606, 0x061b,\n\t0x061e, 0x070d,\n\t0x070f, 0x074a,\n\t0x074d, 0x07b1,\n\t0x07c0, 0x07fa,\n\t0x0800, 0x082d,\n\t0x0830, 0x083e,\n\t0x0840, 0x085b,\n\t0x085e, 0x085e,\n\t0x08a0, 0x08a0,\n\t0x08a2, 0x08ac,\n\t0x08e4, 0x08fe,\n\t0x0900, 0x0977,\n\t0x0979, 0x097f,\n\t0x0981, 0x0983,\n\t0x0985, 0x098c,\n\t0x098f, 0x0990,\n\t0x0993, 0x09a8,\n\t0x09aa, 0x09b0,\n\t0x09b2, 0x09b2,\n\t0x09b6, 0x09b9,\n\t0x09bc, 0x09c4,\n\t0x09c7, 0x09c8,\n\t0x09cb, 0x09ce,\n\t0x09d7, 0x09d7,\n\t0x09dc, 0x09dd,\n\t0x09df, 0x09e3,\n\t0x09e6, 0x09fb,\n\t0x0a01, 0x0a03,\n\t0x0a05, 0x0a0a,\n\t0x0a0f, 0x0a10,\n\t0x0a13, 0x0a28,\n\t0x0a2a, 0x0a30,\n\t0x0a32, 0x0a33,\n\t0x0a35, 0x0a36,\n\t0x0a38, 0x0a39,\n\t0x0a3c, 0x0a3c,\n\t0x0a3e, 0x0a42,\n\t0x0a47, 0x0a48,\n\t0x0a4b, 0x0a4d,\n\t0x0a51, 0x0a51,\n\t0x0a59, 0x0a5c,\n\t0x0a5e, 0x0a5e,\n\t0x0a66, 0x0a75,\n\t0x0a81, 0x0a83,\n\t0x0a85, 0x0a8d,\n\t0x0a8f, 0x0a91,\n\t0x0a93, 0x0aa8,\n\t0x0aaa, 0x0ab0,\n\t0x0ab2, 0x0ab3,\n\t0x0ab5, 0x0ab9,\n\t0x0abc, 0x0ac5,\n\t0x0ac7, 0x0ac9,\n\t0x0acb, 0x0acd,\n\t0x0ad0, 0x0ad0,\n\t0x0ae0, 0x0ae3,\n\t0x0ae6, 0x0af1,\n\t0x0b01, 0x0b03,\n\t0x0b05, 0x0b0c,\n\t0x0b0f, 0x0b10,\n\t0x0b13, 0x0b28,\n\t0x0b2a, 0x0b30,\n\t0x0b32, 0x0b33,\n\t0x0b35, 0x0b39,\n\t0x0b3c, 0x0b44,\n\t0x0b47, 0x0b48,\n\t0x0b4b, 0x0b4d,\n\t0x0b56, 0x0b57,\n\t0x0b5c, 0x0b5d,\n\t0x0b5f, 0x0b63,\n\t0x0b66, 0x0b77,\n\t0x0b82, 0x0b83,\n\t0x0b85, 0x0b8a,\n\t0x0b8e, 0x0b90,\n\t0x0b92, 0x0b95,\n\t0x0b99, 0x0b9a,\n\t0x0b9c, 0x0b9c,\n\t0x0b9e, 0x0b9f,\n\t0x0ba3, 0x0ba4,\n\t0x0ba8, 0x0baa,\n\t0x0bae, 0x0bb9,\n\t0x0bbe, 0x0bc2,\n\t0x0bc6, 0x0bc8,\n\t0x0bca, 0x0bcd,\n\t0x0bd0, 0x0bd0,\n\t0x0bd7, 0x0bd7,\n\t0x0be6, 0x0bfa,\n\t0x0c01, 0x0c03,\n\t0x0c05, 0x0c0c,\n\t0x0c0e, 0x0c10,\n\t0x0c12, 0x0c28,\n\t0x0c2a, 0x0c33,\n\t0x0c35, 0x0c39,\n\t0x0c3d, 0x0c44,\n\t0x0c46, 0x0c48,\n\t0x0c4a, 0x0c4d,\n\t0x0c55, 0x0c56,\n\t0x0c58, 0x0c59,\n\t0x0c60, 0x0c63,\n\t0x0c66, 0x0c6f,\n\t0x0c78, 0x0c7f,\n\t0x0c82, 0x0c83,\n\t0x0c85, 0x0c8c,\n\t0x0c8e, 0x0c90,\n\t0x0c92, 0x0ca8,\n\t0x0caa, 0x0cb3,\n\t0x0cb5, 0x0cb9,\n\t0x0cbc, 0x0cc4,\n\t0x0cc6, 0x0cc8,\n\t0x0cca, 0x0ccd,\n\t0x0cd5, 0x0cd6,\n\t0x0cde, 0x0cde,\n\t0x0ce0, 0x0ce3,\n\t0x0ce6, 0x0cef,\n\t0x0cf1, 0x0cf2,\n\t0x0d02, 0x0d03,\n\t0x0d05, 0x0d0c,\n\t0x0d0e, 0x0d10,\n\t0x0d12, 0x0d3a,\n\t0x0d3d, 0x0d44,\n\t0x0d46, 0x0d48,\n\t0x0d4a, 0x0d4e,\n\t0x0d57, 0x0d57,\n\t0x0d60, 0x0d63,\n\t0x0d66, 0x0d75,\n\t0x0d79, 0x0d7f,\n\t0x0d82, 0x0d83,\n\t0x0d85, 0x0d96,\n\t0x0d9a, 0x0db1,\n\t0x0db3, 0x0dbb,\n\t0x0dbd, 0x0dbd,\n\t0x0dc0, 0x0dc6,\n\t0x0dca, 0x0dca,\n\t0x0dcf, 0x0dd4,\n\t0x0dd6, 0x0dd6,\n\t0x0dd8, 0x0ddf,\n\t0x0df2, 0x0df4,\n\t0x0e01, 0x0e3a,\n\t0x0e3f, 0x0e5b,\n\t0x0e81, 0x0e82,\n\t0x0e84, 0x0e84,\n\t0x0e87, 0x0e88,\n\t0x0e8a, 0x0e8a,\n\t0x0e8d, 0x0e8d,\n\t0x0e94, 0x0e97,\n\t0x0e99, 0x0e9f,\n\t0x0ea1, 0x0ea3,\n\t0x0ea5, 0x0ea5,\n\t0x0ea7, 0x0ea7,\n\t0x0eaa, 0x0eab,\n\t0x0ead, 0x0eb9,\n\t0x0ebb, 0x0ebd,\n\t0x0ec0, 0x0ec4,\n\t0x0ec6, 0x0ec6,\n\t0x0ec8, 0x0ecd,\n\t0x0ed0, 0x0ed9,\n\t0x0edc, 0x0edf,\n\t0x0f00, 0x0f47,\n\t0x0f49, 0x0f6c,\n\t0x0f71, 0x0f97,\n\t0x0f99, 0x0fbc,\n\t0x0fbe, 0x0fcc,\n\t0x0fce, 0x0fda,\n\t0x1000, 0x10c5,\n\t0x10c7, 0x10c7,\n\t0x10cd, 0x10cd,\n\t0x10d0, 0x1248,\n\t0x124a, 0x124d,\n\t0x1250, 0x1256,\n\t0x1258, 0x1258,\n\t0x125a, 0x125d,\n\t0x1260, 0x1288,\n\t0x128a, 0x128d,\n\t0x1290, 0x12b0,\n\t0x12b2, 0x12b5,\n\t0x12b8, 0x12be,\n\t0x12c0, 0x12c0,\n\t0x12c2, 0x12c5,\n\t0x12c8, 0x12d6,\n\t0x12d8, 0x1310,\n\t0x1312, 0x1315,\n\t0x1318, 0x135a,\n\t0x135d, 0x137c,\n\t0x1380, 0x1399,\n\t0x13a0, 0x13f4,\n\t0x1400, 0x167f,\n\t0x1681, 0x169c,\n\t0x16a0, 0x16f0,\n\t0x1700, 0x170c,\n\t0x170e, 0x1714,\n\t0x1720, 0x1736,\n\t0x1740, 0x1753,\n\t0x1760, 0x176c,\n\t0x176e, 0x1770,\n\t0x1772, 0x1773,\n\t0x1780, 0x17dd,\n\t0x17e0, 0x17e9,\n\t0x17f0, 0x17f9,\n\t0x1800, 0x180d,\n\t0x1810, 0x1819,\n\t0x1820, 0x1877,\n\t0x1880, 0x18aa,\n\t0x18b0, 0x18f5,\n\t0x1900, 0x191c,\n\t0x1920, 0x192b,\n\t0x1930, 0x193b,\n\t0x1940, 0x1940,\n\t0x1944, 0x196d,\n\t0x1970, 0x1974,\n\t0x1980, 0x19ab,\n\t0x19b0, 0x19c9,\n\t0x19d0, 0x19da,\n\t0x19de, 0x1a1b,\n\t0x1a1e, 0x1a5e,\n\t0x1a60, 0x1a7c,\n\t0x1a7f, 0x1a89,\n\t0x1a90, 0x1a99,\n\t0x1aa0, 0x1aad,\n\t0x1b00, 0x1b4b,\n\t0x1b50, 0x1b7c,\n\t0x1b80, 0x1bf3,\n\t0x1bfc, 0x1c37,\n\t0x1c3b, 0x1c49,\n\t0x1c4d, 0x1c7f,\n\t0x1cc0, 0x1cc7,\n\t0x1cd0, 0x1cf6,\n\t0x1d00, 0x1de6,\n\t0x1dfc, 0x1f15,\n\t0x1f18, 0x1f1d,\n\t0x1f20, 0x1f45,\n\t0x1f48, 0x1f4d,\n\t0x1f50, 0x1f57,\n\t0x1f59, 0x1f59,\n\t0x1f5b, 0x1f5b,\n\t0x1f5d, 0x1f5d,\n\t0x1f5f, 0x1f7d,\n\t0x1f80, 0x1fb4,\n\t0x1fb6, 0x1fc4,\n\t0x1fc6, 0x1fd3,\n\t0x1fd6, 0x1fdb,\n\t0x1fdd, 0x1fef,\n\t0x1ff2, 0x1ff4,\n\t0x1ff6, 0x1ffe,\n\t0x200b, 0x2027,\n\t0x202a, 0x202e,\n\t0x2030, 0x205e,\n\t0x2060, 0x2064,\n\t0x206a, 0x2071,\n\t0x2074, 0x208e,\n\t0x2090, 0x209c,\n\t0x20a0, 0x20b9,\n\t0x20d0, 0x20f0,\n\t0x2100, 0x2189,\n\t0x2190, 0x23f3,\n\t0x2400, 0x2426,\n\t0x2440, 0x244a,\n\t0x2460, 0x26ff,\n\t0x2701, 0x2b4c,\n\t0x2b50, 0x2b59,\n\t0x2c00, 0x2c2e,\n\t0x2c30, 0x2c5e,\n\t0x2c60, 0x2cf3,\n\t0x2cf9, 0x2d25,\n\t0x2d27, 0x2d27,\n\t0x2d2d, 0x2d2d,\n\t0x2d30, 0x2d67,\n\t0x2d6f, 0x2d70,\n\t0x2d7f, 0x2d96,\n\t0x2da0, 0x2da6,\n\t0x2da8, 0x2dae,\n\t0x2db0, 0x2db6,\n\t0x2db8, 0x2dbe,\n\t0x2dc0, 0x2dc6,\n\t0x2dc8, 0x2dce,\n\t0x2dd0, 0x2dd6,\n\t0x2dd8, 0x2dde,\n\t0x2de0, 0x2e3b,\n\t0x2e80, 0x2e99,\n\t0x2e9b, 0x2ef3,\n\t0x2f00, 0x2fd5,\n\t0x2ff0, 0x2ffb,\n\t0x3001, 0x303f,\n\t0x3041, 0x3096,\n\t0x3099, 0x30ff,\n\t0x3105, 0x312d,\n\t0x3131, 0x318e,\n\t0x3190, 0x31ba,\n\t0x31c0, 0x31e3,\n\t0x31f0, 0x321e,\n\t0x3220, 0x32fe,\n\t0x3300, 0x4db5,\n\t0x4dc0, 0x9fcc,\n\t0xa000, 0xa48c,\n\t0xa490, 0xa4c6,\n\t0xa4d0, 0xa62b,\n\t0xa640, 0xa697,\n\t0xa69f, 0xa6f7,\n\t0xa700, 0xa78e,\n\t0xa790, 0xa793,\n\t0xa7a0, 0xa7aa,\n\t0xa7f8, 0xa82b,\n\t0xa830, 0xa839,\n\t0xa840, 0xa877,\n\t0xa880, 0xa8c4,\n\t0xa8ce, 0xa8d9,\n\t0xa8e0, 0xa8fb,\n\t0xa900, 0xa953,\n\t0xa95f, 0xa97c,\n\t0xa980, 0xa9cd,\n\t0xa9cf, 0xa9d9,\n\t0xa9de, 0xa9df,\n\t0xaa00, 0xaa36,\n\t0xaa40, 0xaa4d,\n\t0xaa50, 0xaa59,\n\t0xaa5c, 0xaa7b,\n\t0xaa80, 0xaac2,\n\t0xaadb, 0xaaf6,\n\t0xab01, 0xab06,\n\t0xab09, 0xab0e,\n\t0xab11, 0xab16,\n\t0xab20, 0xab26,\n\t0xab28, 0xab2e,\n\t0xabc0, 0xabed,\n\t0xabf0, 0xabf9,\n\t0xac00, 0xd7a3,\n\t0xd7b0, 0xd7c6,\n\t0xd7cb, 0xd7fb,\n\t0xe000, 0xfa6d,\n\t0xfa70, 0xfad9,\n\t0xfb00, 0xfb06,\n\t0xfb13, 0xfb17,\n\t0xfb1d, 0xfb36,\n\t0xfb38, 0xfb3c,\n\t0xfb3e, 0xfb3e,\n\t0xfb40, 0xfb41,\n\t0xfb43, 0xfb44,\n\t0xfb46, 0xfbc1,\n\t0xfbd3, 0xfd3f,\n\t0xfd50, 0xfd8f,\n\t0xfd92, 0xfdc7,\n\t0xfdf0, 0xfdfd,\n\t0xfe00, 0xfe19,\n\t0xfe20, 0xfe26,\n\t0xfe30, 0xfe52,\n\t0xfe54, 0xfe66,\n\t0xfe68, 0xfe6b,\n\t0xfe70, 0xfe74,\n\t0xfe76, 0xfefc,\n\t0xfeff, 0xfeff,\n\t0xff01, 0xffbe,\n\t0xffc2, 0xffc7,\n\t0xffca, 0xffcf,\n\t0xffd2, 0xffd7,\n\t0xffda, 0xffdc,\n\t0xffe0, 0xffe6,\n\t0xffe8, 0xffee,\n\t0xfff9, 0xfffd,\n\t0x10000, 0x1000b,\n\t0x1000d, 0x10026,\n\t0x10028, 0x1003a,\n\t0x1003c, 0x1003d,\n\t0x1003f, 0x1004d,\n\t0x10050, 0x1005d,\n\t0x10080, 0x100fa,\n\t0x10100, 0x10102,\n\t0x10107, 0x10133,\n\t0x10137, 0x1018a,\n\t0x10190, 0x1019b,\n\t0x101d0, 0x101fd,\n\t0x10280, 0x1029c,\n\t0x102a0, 0x102d0,\n\t0x10300, 0x1031e,\n\t0x10320, 0x10323,\n\t0x10330, 0x1034a,\n\t0x10380, 0x1039d,\n\t0x1039f, 0x103c3,\n\t0x103c8, 0x103d5,\n\t0x10400, 0x1049d,\n\t0x104a0, 0x104a9,\n\t0x10800, 0x10805,\n\t0x10808, 0x10808,\n\t0x1080a, 0x10835,\n\t0x10837, 0x10838,\n\t0x1083c, 0x1083c,\n\t0x1083f, 0x10855,\n\t0x10857, 0x1085f,\n\t0x10900, 0x1091b,\n\t0x1091f, 0x10939,\n\t0x1093f, 0x1093f,\n\t0x10980, 0x109b7,\n\t0x109be, 0x109bf,\n\t0x10a00, 0x10a03,\n\t0x10a05, 0x10a06,\n\t0x10a0c, 0x10a13,\n\t0x10a15, 0x10a17,\n\t0x10a19, 0x10a33,\n\t0x10a38, 0x10a3a,\n\t0x10a3f, 0x10a47,\n\t0x10a50, 0x10a58,\n\t0x10a60, 0x10a7f,\n\t0x10b00, 0x10b35,\n\t0x10b39, 0x10b55,\n\t0x10b58, 0x10b72,\n\t0x10b78, 0x10b7f,\n\t0x10c00, 0x10c48,\n\t0x10e60, 0x10e7e,\n\t0x11000, 0x1104d,\n\t0x11052, 0x1106f,\n\t0x11080, 0x110c1,\n\t0x110d0, 0x110e8,\n\t0x110f0, 0x110f9,\n\t0x11100, 0x11134,\n\t0x11136, 0x11143,\n\t0x11180, 0x111c8,\n\t0x111d0, 0x111d9,\n\t0x11680, 0x116b7,\n\t0x116c0, 0x116c9,\n\t0x12000, 0x1236e,\n\t0x12400, 0x12462,\n\t0x12470, 0x12473,\n\t0x13000, 0x1342e,\n\t0x16800, 0x16a38,\n\t0x16f00, 0x16f44,\n\t0x16f50, 0x16f7e,\n\t0x16f8f, 0x16f9f,\n\t0x1b000, 0x1b001,\n\t0x1d000, 0x1d0f5,\n\t0x1d100, 0x1d126,\n\t0x1d129, 0x1d1dd,\n\t0x1d200, 0x1d245,\n\t0x1d300, 0x1d356,\n\t0x1d360, 0x1d371,\n\t0x1d400, 0x1d454,\n\t0x1d456, 0x1d49c,\n\t0x1d49e, 0x1d49f,\n\t0x1d4a2, 0x1d4a2,\n\t0x1d4a5, 0x1d4a6,\n\t0x1d4a9, 0x1d4ac,\n\t0x1d4ae, 0x1d4b9,\n\t0x1d4bb, 0x1d4bb,\n\t0x1d4bd, 0x1d4c3,\n\t0x1d4c5, 0x1d505,\n\t0x1d507, 0x1d50a,\n\t0x1d50d, 0x1d514,\n\t0x1d516, 0x1d51c,\n\t0x1d51e, 0x1d539,\n\t0x1d53b, 0x1d53e,\n\t0x1d540, 0x1d544,\n\t0x1d546, 0x1d546,\n\t0x1d54a, 0x1d550,\n\t0x1d552, 0x1d6a5,\n\t0x1d6a8, 0x1d7cb,\n\t0x1d7ce, 0x1d7ff,\n\t0x1ee00, 0x1ee03,\n\t0x1ee05, 0x1ee1f,\n\t0x1ee21, 0x1ee22,\n\t0x1ee24, 0x1ee24,\n\t0x1ee27, 0x1ee27,\n\t0x1ee29, 0x1ee32,\n\t0x1ee34, 0x1ee37,\n\t0x1ee39, 0x1ee39,\n\t0x1ee3b, 0x1ee3b,\n\t0x1ee42, 0x1ee42,\n\t0x1ee47, 0x1ee47,\n\t0x1ee49, 0x1ee49,\n\t0x1ee4b, 0x1ee4b,\n\t0x1ee4d, 0x1ee4f,\n\t0x1ee51, 0x1ee52,\n\t0x1ee54, 0x1ee54,\n\t0x1ee57, 0x1ee57,\n\t0x1ee59, 0x1ee59,\n\t0x1ee5b, 0x1ee5b,\n\t0x1ee5d, 0x1ee5d,\n\t0x1ee5f, 0x1ee5f,\n\t0x1ee61, 0x1ee62,\n\t0x1ee64, 0x1ee64,\n\t0x1ee67, 0x1ee6a,\n\t0x1ee6c, 0x1ee72,\n\t0x1ee74, 0x1ee77,\n\t0x1ee79, 0x1ee7c,\n\t0x1ee7e, 0x1ee7e,\n\t0x1ee80, 0x1ee89,\n\t0x1ee8b, 0x1ee9b,\n\t0x1eea1, 0x1eea3,\n\t0x1eea5, 0x1eea9,\n\t0x1eeab, 0x1eebb,\n\t0x1eef0, 0x1eef1,\n\t0x1f000, 0x1f02b,\n\t0x1f030, 0x1f093,\n\t0x1f0a0, 0x1f0ae,\n\t0x1f0b1, 0x1f0be,\n\t0x1f0c1, 0x1f0cf,\n\t0x1f0d1, 0x1f0df,\n\t0x1f100, 0x1f10a,\n\t0x1f110, 0x1f12e,\n\t0x1f130, 0x1f16b,\n\t0x1f170, 0x1f19a,\n\t0x1f1e6, 0x1f202,\n\t0x1f210, 0x1f23a,\n\t0x1f240, 0x1f248,\n\t0x1f250, 0x1f251,\n\t0x1f300, 0x1f320,\n\t0x1f330, 0x1f335,\n\t0x1f337, 0x1f37c,\n\t0x1f380, 0x1f393,\n\t0x1f3a0, 0x1f3c4,\n\t0x1f3c6, 0x1f3ca,\n\t0x1f3e0, 0x1f3f0,\n\t0x1f400, 0x1f43e,\n\t0x1f440, 0x1f440,\n\t0x1f442, 0x1f4f7,\n\t0x1f4f9, 0x1f4fc,\n\t0x1f500, 0x1f53d,\n\t0x1f540, 0x1f543,\n\t0x1f550, 0x1f567,\n\t0x1f5fb, 0x1f640,\n\t0x1f645, 0x1f64f,\n\t0x1f680, 0x1f6c5,\n\t0x1f700, 0x1f773,\n\t0x20000, 0x2a6d6,\n\t0x2a700, 0x2b734,\n\t0x2b740, 0x2b81d,\n\t0x2f800, 0x2fa1d,\n\t0xe0001, 0xe0001,\n\t0xe0020, 0xe007f,\n\t0xe0100, 0xe01ef,\n\t0xf0000, 0xffffd,\n\t0x100000, 0x10fffd,\n}; /* CR_Graph */\n\n/* 'Lower': [[:Lower:]] */\nstatic const OnigCodePoint CR_Lower[] = {\n\t618,\n\t0x0061, 0x007a,\n\t0x00aa, 0x00aa,\n\t0x00b5, 0x00b5,\n\t0x00ba, 0x00ba,\n\t0x00df, 0x00f6,\n\t0x00f8, 0x00ff,\n\t0x0101, 0x0101,\n\t0x0103, 0x0103,\n\t0x0105, 0x0105,\n\t0x0107, 0x0107,\n\t0x0109, 0x0109,\n\t0x010b, 0x010b,\n\t0x010d, 0x010d,\n\t0x010f, 0x010f,\n\t0x0111, 0x0111,\n\t0x0113, 0x0113,\n\t0x0115, 0x0115,\n\t0x0117, 0x0117,\n\t0x0119, 0x0119,\n\t0x011b, 0x011b,\n\t0x011d, 0x011d,\n\t0x011f, 0x011f,\n\t0x0121, 0x0121,\n\t0x0123, 0x0123,\n\t0x0125, 0x0125,\n\t0x0127, 0x0127,\n\t0x0129, 0x0129,\n\t0x012b, 0x012b,\n\t0x012d, 0x012d,\n\t0x012f, 0x012f,\n\t0x0131, 0x0131,\n\t0x0133, 0x0133,\n\t0x0135, 0x0135,\n\t0x0137, 0x0138,\n\t0x013a, 0x013a,\n\t0x013c, 0x013c,\n\t0x013e, 0x013e,\n\t0x0140, 0x0140,\n\t0x0142, 0x0142,\n\t0x0144, 0x0144,\n\t0x0146, 0x0146,\n\t0x0148, 0x0149,\n\t0x014b, 0x014b,\n\t0x014d, 0x014d,\n\t0x014f, 0x014f,\n\t0x0151, 0x0151,\n\t0x0153, 0x0153,\n\t0x0155, 0x0155,\n\t0x0157, 0x0157,\n\t0x0159, 0x0159,\n\t0x015b, 0x015b,\n\t0x015d, 0x015d,\n\t0x015f, 0x015f,\n\t0x0161, 0x0161,\n\t0x0163, 0x0163,\n\t0x0165, 0x0165,\n\t0x0167, 0x0167,\n\t0x0169, 0x0169,\n\t0x016b, 0x016b,\n\t0x016d, 0x016d,\n\t0x016f, 0x016f,\n\t0x0171, 0x0171,\n\t0x0173, 0x0173,\n\t0x0175, 0x0175,\n\t0x0177, 0x0177,\n\t0x017a, 0x017a,\n\t0x017c, 0x017c,\n\t0x017e, 0x0180,\n\t0x0183, 0x0183,\n\t0x0185, 0x0185,\n\t0x0188, 0x0188,\n\t0x018c, 0x018d,\n\t0x0192, 0x0192,\n\t0x0195, 0x0195,\n\t0x0199, 0x019b,\n\t0x019e, 0x019e,\n\t0x01a1, 0x01a1,\n\t0x01a3, 0x01a3,\n\t0x01a5, 0x01a5,\n\t0x01a8, 0x01a8,\n\t0x01aa, 0x01ab,\n\t0x01ad, 0x01ad,\n\t0x01b0, 0x01b0,\n\t0x01b4, 0x01b4,\n\t0x01b6, 0x01b6,\n\t0x01b9, 0x01ba,\n\t0x01bd, 0x01bf,\n\t0x01c6, 0x01c6,\n\t0x01c9, 0x01c9,\n\t0x01cc, 0x01cc,\n\t0x01ce, 0x01ce,\n\t0x01d0, 0x01d0,\n\t0x01d2, 0x01d2,\n\t0x01d4, 0x01d4,\n\t0x01d6, 0x01d6,\n\t0x01d8, 0x01d8,\n\t0x01da, 0x01da,\n\t0x01dc, 0x01dd,\n\t0x01df, 0x01df,\n\t0x01e1, 0x01e1,\n\t0x01e3, 0x01e3,\n\t0x01e5, 0x01e5,\n\t0x01e7, 0x01e7,\n\t0x01e9, 0x01e9,\n\t0x01eb, 0x01eb,\n\t0x01ed, 0x01ed,\n\t0x01ef, 0x01f0,\n\t0x01f3, 0x01f3,\n\t0x01f5, 0x01f5,\n\t0x01f9, 0x01f9,\n\t0x01fb, 0x01fb,\n\t0x01fd, 0x01fd,\n\t0x01ff, 0x01ff,\n\t0x0201, 0x0201,\n\t0x0203, 0x0203,\n\t0x0205, 0x0205,\n\t0x0207, 0x0207,\n\t0x0209, 0x0209,\n\t0x020b, 0x020b,\n\t0x020d, 0x020d,\n\t0x020f, 0x020f,\n\t0x0211, 0x0211,\n\t0x0213, 0x0213,\n\t0x0215, 0x0215,\n\t0x0217, 0x0217,\n\t0x0219, 0x0219,\n\t0x021b, 0x021b,\n\t0x021d, 0x021d,\n\t0x021f, 0x021f,\n\t0x0221, 0x0221,\n\t0x0223, 0x0223,\n\t0x0225, 0x0225,\n\t0x0227, 0x0227,\n\t0x0229, 0x0229,\n\t0x022b, 0x022b,\n\t0x022d, 0x022d,\n\t0x022f, 0x022f,\n\t0x0231, 0x0231,\n\t0x0233, 0x0239,\n\t0x023c, 0x023c,\n\t0x023f, 0x0240,\n\t0x0242, 0x0242,\n\t0x0247, 0x0247,\n\t0x0249, 0x0249,\n\t0x024b, 0x024b,\n\t0x024d, 0x024d,\n\t0x024f, 0x0293,\n\t0x0295, 0x02b8,\n\t0x02c0, 0x02c1,\n\t0x02e0, 0x02e4,\n\t0x0345, 0x0345,\n\t0x0371, 0x0371,\n\t0x0373, 0x0373,\n\t0x0377, 0x0377,\n\t0x037a, 0x037d,\n\t0x0390, 0x0390,\n\t0x03ac, 0x03ce,\n\t0x03d0, 0x03d1,\n\t0x03d5, 0x03d7,\n\t0x03d9, 0x03d9,\n\t0x03db, 0x03db,\n\t0x03dd, 0x03dd,\n\t0x03df, 0x03df,\n\t0x03e1, 0x03e1,\n\t0x03e3, 0x03e3,\n\t0x03e5, 0x03e5,\n\t0x03e7, 0x03e7,\n\t0x03e9, 0x03e9,\n\t0x03eb, 0x03eb,\n\t0x03ed, 0x03ed,\n\t0x03ef, 0x03f3,\n\t0x03f5, 0x03f5,\n\t0x03f8, 0x03f8,\n\t0x03fb, 0x03fc,\n\t0x0430, 0x045f,\n\t0x0461, 0x0461,\n\t0x0463, 0x0463,\n\t0x0465, 0x0465,\n\t0x0467, 0x0467,\n\t0x0469, 0x0469,\n\t0x046b, 0x046b,\n\t0x046d, 0x046d,\n\t0x046f, 0x046f,\n\t0x0471, 0x0471,\n\t0x0473, 0x0473,\n\t0x0475, 0x0475,\n\t0x0477, 0x0477,\n\t0x0479, 0x0479,\n\t0x047b, 0x047b,\n\t0x047d, 0x047d,\n\t0x047f, 0x047f,\n\t0x0481, 0x0481,\n\t0x048b, 0x048b,\n\t0x048d, 0x048d,\n\t0x048f, 0x048f,\n\t0x0491, 0x0491,\n\t0x0493, 0x0493,\n\t0x0495, 0x0495,\n\t0x0497, 0x0497,\n\t0x0499, 0x0499,\n\t0x049b, 0x049b,\n\t0x049d, 0x049d,\n\t0x049f, 0x049f,\n\t0x04a1, 0x04a1,\n\t0x04a3, 0x04a3,\n\t0x04a5, 0x04a5,\n\t0x04a7, 0x04a7,\n\t0x04a9, 0x04a9,\n\t0x04ab, 0x04ab,\n\t0x04ad, 0x04ad,\n\t0x04af, 0x04af,\n\t0x04b1, 0x04b1,\n\t0x04b3, 0x04b3,\n\t0x04b5, 0x04b5,\n\t0x04b7, 0x04b7,\n\t0x04b9, 0x04b9,\n\t0x04bb, 0x04bb,\n\t0x04bd, 0x04bd,\n\t0x04bf, 0x04bf,\n\t0x04c2, 0x04c2,\n\t0x04c4, 0x04c4,\n\t0x04c6, 0x04c6,\n\t0x04c8, 0x04c8,\n\t0x04ca, 0x04ca,\n\t0x04cc, 0x04cc,\n\t0x04ce, 0x04cf,\n\t0x04d1, 0x04d1,\n\t0x04d3, 0x04d3,\n\t0x04d5, 0x04d5,\n\t0x04d7, 0x04d7,\n\t0x04d9, 0x04d9,\n\t0x04db, 0x04db,\n\t0x04dd, 0x04dd,\n\t0x04df, 0x04df,\n\t0x04e1, 0x04e1,\n\t0x04e3, 0x04e3,\n\t0x04e5, 0x04e5,\n\t0x04e7, 0x04e7,\n\t0x04e9, 0x04e9,\n\t0x04eb, 0x04eb,\n\t0x04ed, 0x04ed,\n\t0x04ef, 0x04ef,\n\t0x04f1, 0x04f1,\n\t0x04f3, 0x04f3,\n\t0x04f5, 0x04f5,\n\t0x04f7, 0x04f7,\n\t0x04f9, 0x04f9,\n\t0x04fb, 0x04fb,\n\t0x04fd, 0x04fd,\n\t0x04ff, 0x04ff,\n\t0x0501, 0x0501,\n\t0x0503, 0x0503,\n\t0x0505, 0x0505,\n\t0x0507, 0x0507,\n\t0x0509, 0x0509,\n\t0x050b, 0x050b,\n\t0x050d, 0x050d,\n\t0x050f, 0x050f,\n\t0x0511, 0x0511,\n\t0x0513, 0x0513,\n\t0x0515, 0x0515,\n\t0x0517, 0x0517,\n\t0x0519, 0x0519,\n\t0x051b, 0x051b,\n\t0x051d, 0x051d,\n\t0x051f, 0x051f,\n\t0x0521, 0x0521,\n\t0x0523, 0x0523,\n\t0x0525, 0x0525,\n\t0x0527, 0x0527,\n\t0x0561, 0x0587,\n\t0x1d00, 0x1dbf,\n\t0x1e01, 0x1e01,\n\t0x1e03, 0x1e03,\n\t0x1e05, 0x1e05,\n\t0x1e07, 0x1e07,\n\t0x1e09, 0x1e09,\n\t0x1e0b, 0x1e0b,\n\t0x1e0d, 0x1e0d,\n\t0x1e0f, 0x1e0f,\n\t0x1e11, 0x1e11,\n\t0x1e13, 0x1e13,\n\t0x1e15, 0x1e15,\n\t0x1e17, 0x1e17,\n\t0x1e19, 0x1e19,\n\t0x1e1b, 0x1e1b,\n\t0x1e1d, 0x1e1d,\n\t0x1e1f, 0x1e1f,\n\t0x1e21, 0x1e21,\n\t0x1e23, 0x1e23,\n\t0x1e25, 0x1e25,\n\t0x1e27, 0x1e27,\n\t0x1e29, 0x1e29,\n\t0x1e2b, 0x1e2b,\n\t0x1e2d, 0x1e2d,\n\t0x1e2f, 0x1e2f,\n\t0x1e31, 0x1e31,\n\t0x1e33, 0x1e33,\n\t0x1e35, 0x1e35,\n\t0x1e37, 0x1e37,\n\t0x1e39, 0x1e39,\n\t0x1e3b, 0x1e3b,\n\t0x1e3d, 0x1e3d,\n\t0x1e3f, 0x1e3f,\n\t0x1e41, 0x1e41,\n\t0x1e43, 0x1e43,\n\t0x1e45, 0x1e45,\n\t0x1e47, 0x1e47,\n\t0x1e49, 0x1e49,\n\t0x1e4b, 0x1e4b,\n\t0x1e4d, 0x1e4d,\n\t0x1e4f, 0x1e4f,\n\t0x1e51, 0x1e51,\n\t0x1e53, 0x1e53,\n\t0x1e55, 0x1e55,\n\t0x1e57, 0x1e57,\n\t0x1e59, 0x1e59,\n\t0x1e5b, 0x1e5b,\n\t0x1e5d, 0x1e5d,\n\t0x1e5f, 0x1e5f,\n\t0x1e61, 0x1e61,\n\t0x1e63, 0x1e63,\n\t0x1e65, 0x1e65,\n\t0x1e67, 0x1e67,\n\t0x1e69, 0x1e69,\n\t0x1e6b, 0x1e6b,\n\t0x1e6d, 0x1e6d,\n\t0x1e6f, 0x1e6f,\n\t0x1e71, 0x1e71,\n\t0x1e73, 0x1e73,\n\t0x1e75, 0x1e75,\n\t0x1e77, 0x1e77,\n\t0x1e79, 0x1e79,\n\t0x1e7b, 0x1e7b,\n\t0x1e7d, 0x1e7d,\n\t0x1e7f, 0x1e7f,\n\t0x1e81, 0x1e81,\n\t0x1e83, 0x1e83,\n\t0x1e85, 0x1e85,\n\t0x1e87, 0x1e87,\n\t0x1e89, 0x1e89,\n\t0x1e8b, 0x1e8b,\n\t0x1e8d, 0x1e8d,\n\t0x1e8f, 0x1e8f,\n\t0x1e91, 0x1e91,\n\t0x1e93, 0x1e93,\n\t0x1e95, 0x1e9d,\n\t0x1e9f, 0x1e9f,\n\t0x1ea1, 0x1ea1,\n\t0x1ea3, 0x1ea3,\n\t0x1ea5, 0x1ea5,\n\t0x1ea7, 0x1ea7,\n\t0x1ea9, 0x1ea9,\n\t0x1eab, 0x1eab,\n\t0x1ead, 0x1ead,\n\t0x1eaf, 0x1eaf,\n\t0x1eb1, 0x1eb1,\n\t0x1eb3, 0x1eb3,\n\t0x1eb5, 0x1eb5,\n\t0x1eb7, 0x1eb7,\n\t0x1eb9, 0x1eb9,\n\t0x1ebb, 0x1ebb,\n\t0x1ebd, 0x1ebd,\n\t0x1ebf, 0x1ebf,\n\t0x1ec1, 0x1ec1,\n\t0x1ec3, 0x1ec3,\n\t0x1ec5, 0x1ec5,\n\t0x1ec7, 0x1ec7,\n\t0x1ec9, 0x1ec9,\n\t0x1ecb, 0x1ecb,\n\t0x1ecd, 0x1ecd,\n\t0x1ecf, 0x1ecf,\n\t0x1ed1, 0x1ed1,\n\t0x1ed3, 0x1ed3,\n\t0x1ed5, 0x1ed5,\n\t0x1ed7, 0x1ed7,\n\t0x1ed9, 0x1ed9,\n\t0x1edb, 0x1edb,\n\t0x1edd, 0x1edd,\n\t0x1edf, 0x1edf,\n\t0x1ee1, 0x1ee1,\n\t0x1ee3, 0x1ee3,\n\t0x1ee5, 0x1ee5,\n\t0x1ee7, 0x1ee7,\n\t0x1ee9, 0x1ee9,\n\t0x1eeb, 0x1eeb,\n\t0x1eed, 0x1eed,\n\t0x1eef, 0x1eef,\n\t0x1ef1, 0x1ef1,\n\t0x1ef3, 0x1ef3,\n\t0x1ef5, 0x1ef5,\n\t0x1ef7, 0x1ef7,\n\t0x1ef9, 0x1ef9,\n\t0x1efb, 0x1efb,\n\t0x1efd, 0x1efd,\n\t0x1eff, 0x1f07,\n\t0x1f10, 0x1f15,\n\t0x1f20, 0x1f27,\n\t0x1f30, 0x1f37,\n\t0x1f40, 0x1f45,\n\t0x1f50, 0x1f57,\n\t0x1f60, 0x1f67,\n\t0x1f70, 0x1f7d,\n\t0x1f80, 0x1f87,\n\t0x1f90, 0x1f97,\n\t0x1fa0, 0x1fa7,\n\t0x1fb0, 0x1fb4,\n\t0x1fb6, 0x1fb7,\n\t0x1fbe, 0x1fbe,\n\t0x1fc2, 0x1fc4,\n\t0x1fc6, 0x1fc7,\n\t0x1fd0, 0x1fd3,\n\t0x1fd6, 0x1fd7,\n\t0x1fe0, 0x1fe7,\n\t0x1ff2, 0x1ff4,\n\t0x1ff6, 0x1ff7,\n\t0x2071, 0x2071,\n\t0x207f, 0x207f,\n\t0x2090, 0x209c,\n\t0x210a, 0x210a,\n\t0x210e, 0x210f,\n\t0x2113, 0x2113,\n\t0x212f, 0x212f,\n\t0x2134, 0x2134,\n\t0x2139, 0x2139,\n\t0x213c, 0x213d,\n\t0x2146, 0x2149,\n\t0x214e, 0x214e,\n\t0x2170, 0x217f,\n\t0x2184, 0x2184,\n\t0x24d0, 0x24e9,\n\t0x2c30, 0x2c5e,\n\t0x2c61, 0x2c61,\n\t0x2c65, 0x2c66,\n\t0x2c68, 0x2c68,\n\t0x2c6a, 0x2c6a,\n\t0x2c6c, 0x2c6c,\n\t0x2c71, 0x2c71,\n\t0x2c73, 0x2c74,\n\t0x2c76, 0x2c7d,\n\t0x2c81, 0x2c81,\n\t0x2c83, 0x2c83,\n\t0x2c85, 0x2c85,\n\t0x2c87, 0x2c87,\n\t0x2c89, 0x2c89,\n\t0x2c8b, 0x2c8b,\n\t0x2c8d, 0x2c8d,\n\t0x2c8f, 0x2c8f,\n\t0x2c91, 0x2c91,\n\t0x2c93, 0x2c93,\n\t0x2c95, 0x2c95,\n\t0x2c97, 0x2c97,\n\t0x2c99, 0x2c99,\n\t0x2c9b, 0x2c9b,\n\t0x2c9d, 0x2c9d,\n\t0x2c9f, 0x2c9f,\n\t0x2ca1, 0x2ca1,\n\t0x2ca3, 0x2ca3,\n\t0x2ca5, 0x2ca5,\n\t0x2ca7, 0x2ca7,\n\t0x2ca9, 0x2ca9,\n\t0x2cab, 0x2cab,\n\t0x2cad, 0x2cad,\n\t0x2caf, 0x2caf,\n\t0x2cb1, 0x2cb1,\n\t0x2cb3, 0x2cb3,\n\t0x2cb5, 0x2cb5,\n\t0x2cb7, 0x2cb7,\n\t0x2cb9, 0x2cb9,\n\t0x2cbb, 0x2cbb,\n\t0x2cbd, 0x2cbd,\n\t0x2cbf, 0x2cbf,\n\t0x2cc1, 0x2cc1,\n\t0x2cc3, 0x2cc3,\n\t0x2cc5, 0x2cc5,\n\t0x2cc7, 0x2cc7,\n\t0x2cc9, 0x2cc9,\n\t0x2ccb, 0x2ccb,\n\t0x2ccd, 0x2ccd,\n\t0x2ccf, 0x2ccf,\n\t0x2cd1, 0x2cd1,\n\t0x2cd3, 0x2cd3,\n\t0x2cd5, 0x2cd5,\n\t0x2cd7, 0x2cd7,\n\t0x2cd9, 0x2cd9,\n\t0x2cdb, 0x2cdb,\n\t0x2cdd, 0x2cdd,\n\t0x2cdf, 0x2cdf,\n\t0x2ce1, 0x2ce1,\n\t0x2ce3, 0x2ce4,\n\t0x2cec, 0x2cec,\n\t0x2cee, 0x2cee,\n\t0x2cf3, 0x2cf3,\n\t0x2d00, 0x2d25,\n\t0x2d27, 0x2d27,\n\t0x2d2d, 0x2d2d,\n\t0xa641, 0xa641,\n\t0xa643, 0xa643,\n\t0xa645, 0xa645,\n\t0xa647, 0xa647,\n\t0xa649, 0xa649,\n\t0xa64b, 0xa64b,\n\t0xa64d, 0xa64d,\n\t0xa64f, 0xa64f,\n\t0xa651, 0xa651,\n\t0xa653, 0xa653,\n\t0xa655, 0xa655,\n\t0xa657, 0xa657,\n\t0xa659, 0xa659,\n\t0xa65b, 0xa65b,\n\t0xa65d, 0xa65d,\n\t0xa65f, 0xa65f,\n\t0xa661, 0xa661,\n\t0xa663, 0xa663,\n\t0xa665, 0xa665,\n\t0xa667, 0xa667,\n\t0xa669, 0xa669,\n\t0xa66b, 0xa66b,\n\t0xa66d, 0xa66d,\n\t0xa681, 0xa681,\n\t0xa683, 0xa683,\n\t0xa685, 0xa685,\n\t0xa687, 0xa687,\n\t0xa689, 0xa689,\n\t0xa68b, 0xa68b,\n\t0xa68d, 0xa68d,\n\t0xa68f, 0xa68f,\n\t0xa691, 0xa691,\n\t0xa693, 0xa693,\n\t0xa695, 0xa695,\n\t0xa697, 0xa697,\n\t0xa723, 0xa723,\n\t0xa725, 0xa725,\n\t0xa727, 0xa727,\n\t0xa729, 0xa729,\n\t0xa72b, 0xa72b,\n\t0xa72d, 0xa72d,\n\t0xa72f, 0xa731,\n\t0xa733, 0xa733,\n\t0xa735, 0xa735,\n\t0xa737, 0xa737,\n\t0xa739, 0xa739,\n\t0xa73b, 0xa73b,\n\t0xa73d, 0xa73d,\n\t0xa73f, 0xa73f,\n\t0xa741, 0xa741,\n\t0xa743, 0xa743,\n\t0xa745, 0xa745,\n\t0xa747, 0xa747,\n\t0xa749, 0xa749,\n\t0xa74b, 0xa74b,\n\t0xa74d, 0xa74d,\n\t0xa74f, 0xa74f,\n\t0xa751, 0xa751,\n\t0xa753, 0xa753,\n\t0xa755, 0xa755,\n\t0xa757, 0xa757,\n\t0xa759, 0xa759,\n\t0xa75b, 0xa75b,\n\t0xa75d, 0xa75d,\n\t0xa75f, 0xa75f,\n\t0xa761, 0xa761,\n\t0xa763, 0xa763,\n\t0xa765, 0xa765,\n\t0xa767, 0xa767,\n\t0xa769, 0xa769,\n\t0xa76b, 0xa76b,\n\t0xa76d, 0xa76d,\n\t0xa76f, 0xa778,\n\t0xa77a, 0xa77a,\n\t0xa77c, 0xa77c,\n\t0xa77f, 0xa77f,\n\t0xa781, 0xa781,\n\t0xa783, 0xa783,\n\t0xa785, 0xa785,\n\t0xa787, 0xa787,\n\t0xa78c, 0xa78c,\n\t0xa78e, 0xa78e,\n\t0xa791, 0xa791,\n\t0xa793, 0xa793,\n\t0xa7a1, 0xa7a1,\n\t0xa7a3, 0xa7a3,\n\t0xa7a5, 0xa7a5,\n\t0xa7a7, 0xa7a7,\n\t0xa7a9, 0xa7a9,\n\t0xa7f8, 0xa7fa,\n\t0xfb00, 0xfb06,\n\t0xfb13, 0xfb17,\n\t0xff41, 0xff5a,\n\t0x10428, 0x1044f,\n\t0x1d41a, 0x1d433,\n\t0x1d44e, 0x1d454,\n\t0x1d456, 0x1d467,\n\t0x1d482, 0x1d49b,\n\t0x1d4b6, 0x1d4b9,\n\t0x1d4bb, 0x1d4bb,\n\t0x1d4bd, 0x1d4c3,\n\t0x1d4c5, 0x1d4cf,\n\t0x1d4ea, 0x1d503,\n\t0x1d51e, 0x1d537,\n\t0x1d552, 0x1d56b,\n\t0x1d586, 0x1d59f,\n\t0x1d5ba, 0x1d5d3,\n\t0x1d5ee, 0x1d607,\n\t0x1d622, 0x1d63b,\n\t0x1d656, 0x1d66f,\n\t0x1d68a, 0x1d6a5,\n\t0x1d6c2, 0x1d6da,\n\t0x1d6dc, 0x1d6e1,\n\t0x1d6fc, 0x1d714,\n\t0x1d716, 0x1d71b,\n\t0x1d736, 0x1d74e,\n\t0x1d750, 0x1d755,\n\t0x1d770, 0x1d788,\n\t0x1d78a, 0x1d78f,\n\t0x1d7aa, 0x1d7c2,\n\t0x1d7c4, 0x1d7c9,\n\t0x1d7cb, 0x1d7cb,\n}; /* CR_Lower */\n\n/* 'Print': [[:Print:]] */\nstatic const OnigCodePoint CR_Print[] = {\n\t541,\n\t0x0020, 0x007e,\n\t0x00a0, 0x0377,\n\t0x037a, 0x037e,\n\t0x0384, 0x038a,\n\t0x038c, 0x038c,\n\t0x038e, 0x03a1,\n\t0x03a3, 0x0527,\n\t0x0531, 0x0556,\n\t0x0559, 0x055f,\n\t0x0561, 0x0587,\n\t0x0589, 0x058a,\n\t0x058f, 0x058f,\n\t0x0591, 0x05c7,\n\t0x05d0, 0x05ea,\n\t0x05f0, 0x05f4,\n\t0x0600, 0x0604,\n\t0x0606, 0x061b,\n\t0x061e, 0x070d,\n\t0x070f, 0x074a,\n\t0x074d, 0x07b1,\n\t0x07c0, 0x07fa,\n\t0x0800, 0x082d,\n\t0x0830, 0x083e,\n\t0x0840, 0x085b,\n\t0x085e, 0x085e,\n\t0x08a0, 0x08a0,\n\t0x08a2, 0x08ac,\n\t0x08e4, 0x08fe,\n\t0x0900, 0x0977,\n\t0x0979, 0x097f,\n\t0x0981, 0x0983,\n\t0x0985, 0x098c,\n\t0x098f, 0x0990,\n\t0x0993, 0x09a8,\n\t0x09aa, 0x09b0,\n\t0x09b2, 0x09b2,\n\t0x09b6, 0x09b9,\n\t0x09bc, 0x09c4,\n\t0x09c7, 0x09c8,\n\t0x09cb, 0x09ce,\n\t0x09d7, 0x09d7,\n\t0x09dc, 0x09dd,\n\t0x09df, 0x09e3,\n\t0x09e6, 0x09fb,\n\t0x0a01, 0x0a03,\n\t0x0a05, 0x0a0a,\n\t0x0a0f, 0x0a10,\n\t0x0a13, 0x0a28,\n\t0x0a2a, 0x0a30,\n\t0x0a32, 0x0a33,\n\t0x0a35, 0x0a36,\n\t0x0a38, 0x0a39,\n\t0x0a3c, 0x0a3c,\n\t0x0a3e, 0x0a42,\n\t0x0a47, 0x0a48,\n\t0x0a4b, 0x0a4d,\n\t0x0a51, 0x0a51,\n\t0x0a59, 0x0a5c,\n\t0x0a5e, 0x0a5e,\n\t0x0a66, 0x0a75,\n\t0x0a81, 0x0a83,\n\t0x0a85, 0x0a8d,\n\t0x0a8f, 0x0a91,\n\t0x0a93, 0x0aa8,\n\t0x0aaa, 0x0ab0,\n\t0x0ab2, 0x0ab3,\n\t0x0ab5, 0x0ab9,\n\t0x0abc, 0x0ac5,\n\t0x0ac7, 0x0ac9,\n\t0x0acb, 0x0acd,\n\t0x0ad0, 0x0ad0,\n\t0x0ae0, 0x0ae3,\n\t0x0ae6, 0x0af1,\n\t0x0b01, 0x0b03,\n\t0x0b05, 0x0b0c,\n\t0x0b0f, 0x0b10,\n\t0x0b13, 0x0b28,\n\t0x0b2a, 0x0b30,\n\t0x0b32, 0x0b33,\n\t0x0b35, 0x0b39,\n\t0x0b3c, 0x0b44,\n\t0x0b47, 0x0b48,\n\t0x0b4b, 0x0b4d,\n\t0x0b56, 0x0b57,\n\t0x0b5c, 0x0b5d,\n\t0x0b5f, 0x0b63,\n\t0x0b66, 0x0b77,\n\t0x0b82, 0x0b83,\n\t0x0b85, 0x0b8a,\n\t0x0b8e, 0x0b90,\n\t0x0b92, 0x0b95,\n\t0x0b99, 0x0b9a,\n\t0x0b9c, 0x0b9c,\n\t0x0b9e, 0x0b9f,\n\t0x0ba3, 0x0ba4,\n\t0x0ba8, 0x0baa,\n\t0x0bae, 0x0bb9,\n\t0x0bbe, 0x0bc2,\n\t0x0bc6, 0x0bc8,\n\t0x0bca, 0x0bcd,\n\t0x0bd0, 0x0bd0,\n\t0x0bd7, 0x0bd7,\n\t0x0be6, 0x0bfa,\n\t0x0c01, 0x0c03,\n\t0x0c05, 0x0c0c,\n\t0x0c0e, 0x0c10,\n\t0x0c12, 0x0c28,\n\t0x0c2a, 0x0c33,\n\t0x0c35, 0x0c39,\n\t0x0c3d, 0x0c44,\n\t0x0c46, 0x0c48,\n\t0x0c4a, 0x0c4d,\n\t0x0c55, 0x0c56,\n\t0x0c58, 0x0c59,\n\t0x0c60, 0x0c63,\n\t0x0c66, 0x0c6f,\n\t0x0c78, 0x0c7f,\n\t0x0c82, 0x0c83,\n\t0x0c85, 0x0c8c,\n\t0x0c8e, 0x0c90,\n\t0x0c92, 0x0ca8,\n\t0x0caa, 0x0cb3,\n\t0x0cb5, 0x0cb9,\n\t0x0cbc, 0x0cc4,\n\t0x0cc6, 0x0cc8,\n\t0x0cca, 0x0ccd,\n\t0x0cd5, 0x0cd6,\n\t0x0cde, 0x0cde,\n\t0x0ce0, 0x0ce3,\n\t0x0ce6, 0x0cef,\n\t0x0cf1, 0x0cf2,\n\t0x0d02, 0x0d03,\n\t0x0d05, 0x0d0c,\n\t0x0d0e, 0x0d10,\n\t0x0d12, 0x0d3a,\n\t0x0d3d, 0x0d44,\n\t0x0d46, 0x0d48,\n\t0x0d4a, 0x0d4e,\n\t0x0d57, 0x0d57,\n\t0x0d60, 0x0d63,\n\t0x0d66, 0x0d75,\n\t0x0d79, 0x0d7f,\n\t0x0d82, 0x0d83,\n\t0x0d85, 0x0d96,\n\t0x0d9a, 0x0db1,\n\t0x0db3, 0x0dbb,\n\t0x0dbd, 0x0dbd,\n\t0x0dc0, 0x0dc6,\n\t0x0dca, 0x0dca,\n\t0x0dcf, 0x0dd4,\n\t0x0dd6, 0x0dd6,\n\t0x0dd8, 0x0ddf,\n\t0x0df2, 0x0df4,\n\t0x0e01, 0x0e3a,\n\t0x0e3f, 0x0e5b,\n\t0x0e81, 0x0e82,\n\t0x0e84, 0x0e84,\n\t0x0e87, 0x0e88,\n\t0x0e8a, 0x0e8a,\n\t0x0e8d, 0x0e8d,\n\t0x0e94, 0x0e97,\n\t0x0e99, 0x0e9f,\n\t0x0ea1, 0x0ea3,\n\t0x0ea5, 0x0ea5,\n\t0x0ea7, 0x0ea7,\n\t0x0eaa, 0x0eab,\n\t0x0ead, 0x0eb9,\n\t0x0ebb, 0x0ebd,\n\t0x0ec0, 0x0ec4,\n\t0x0ec6, 0x0ec6,\n\t0x0ec8, 0x0ecd,\n\t0x0ed0, 0x0ed9,\n\t0x0edc, 0x0edf,\n\t0x0f00, 0x0f47,\n\t0x0f49, 0x0f6c,\n\t0x0f71, 0x0f97,\n\t0x0f99, 0x0fbc,\n\t0x0fbe, 0x0fcc,\n\t0x0fce, 0x0fda,\n\t0x1000, 0x10c5,\n\t0x10c7, 0x10c7,\n\t0x10cd, 0x10cd,\n\t0x10d0, 0x1248,\n\t0x124a, 0x124d,\n\t0x1250, 0x1256,\n\t0x1258, 0x1258,\n\t0x125a, 0x125d,\n\t0x1260, 0x1288,\n\t0x128a, 0x128d,\n\t0x1290, 0x12b0,\n\t0x12b2, 0x12b5,\n\t0x12b8, 0x12be,\n\t0x12c0, 0x12c0,\n\t0x12c2, 0x12c5,\n\t0x12c8, 0x12d6,\n\t0x12d8, 0x1310,\n\t0x1312, 0x1315,\n\t0x1318, 0x135a,\n\t0x135d, 0x137c,\n\t0x1380, 0x1399,\n\t0x13a0, 0x13f4,\n\t0x1400, 0x169c,\n\t0x16a0, 0x16f0,\n\t0x1700, 0x170c,\n\t0x170e, 0x1714,\n\t0x1720, 0x1736,\n\t0x1740, 0x1753,\n\t0x1760, 0x176c,\n\t0x176e, 0x1770,\n\t0x1772, 0x1773,\n\t0x1780, 0x17dd,\n\t0x17e0, 0x17e9,\n\t0x17f0, 0x17f9,\n\t0x1800, 0x180e,\n\t0x1810, 0x1819,\n\t0x1820, 0x1877,\n\t0x1880, 0x18aa,\n\t0x18b0, 0x18f5,\n\t0x1900, 0x191c,\n\t0x1920, 0x192b,\n\t0x1930, 0x193b,\n\t0x1940, 0x1940,\n\t0x1944, 0x196d,\n\t0x1970, 0x1974,\n\t0x1980, 0x19ab,\n\t0x19b0, 0x19c9,\n\t0x19d0, 0x19da,\n\t0x19de, 0x1a1b,\n\t0x1a1e, 0x1a5e,\n\t0x1a60, 0x1a7c,\n\t0x1a7f, 0x1a89,\n\t0x1a90, 0x1a99,\n\t0x1aa0, 0x1aad,\n\t0x1b00, 0x1b4b,\n\t0x1b50, 0x1b7c,\n\t0x1b80, 0x1bf3,\n\t0x1bfc, 0x1c37,\n\t0x1c3b, 0x1c49,\n\t0x1c4d, 0x1c7f,\n\t0x1cc0, 0x1cc7,\n\t0x1cd0, 0x1cf6,\n\t0x1d00, 0x1de6,\n\t0x1dfc, 0x1f15,\n\t0x1f18, 0x1f1d,\n\t0x1f20, 0x1f45,\n\t0x1f48, 0x1f4d,\n\t0x1f50, 0x1f57,\n\t0x1f59, 0x1f59,\n\t0x1f5b, 0x1f5b,\n\t0x1f5d, 0x1f5d,\n\t0x1f5f, 0x1f7d,\n\t0x1f80, 0x1fb4,\n\t0x1fb6, 0x1fc4,\n\t0x1fc6, 0x1fd3,\n\t0x1fd6, 0x1fdb,\n\t0x1fdd, 0x1fef,\n\t0x1ff2, 0x1ff4,\n\t0x1ff6, 0x1ffe,\n\t0x2000, 0x2027,\n\t0x202a, 0x2064,\n\t0x206a, 0x2071,\n\t0x2074, 0x208e,\n\t0x2090, 0x209c,\n\t0x20a0, 0x20b9,\n\t0x20d0, 0x20f0,\n\t0x2100, 0x2189,\n\t0x2190, 0x23f3,\n\t0x2400, 0x2426,\n\t0x2440, 0x244a,\n\t0x2460, 0x26ff,\n\t0x2701, 0x2b4c,\n\t0x2b50, 0x2b59,\n\t0x2c00, 0x2c2e,\n\t0x2c30, 0x2c5e,\n\t0x2c60, 0x2cf3,\n\t0x2cf9, 0x2d25,\n\t0x2d27, 0x2d27,\n\t0x2d2d, 0x2d2d,\n\t0x2d30, 0x2d67,\n\t0x2d6f, 0x2d70,\n\t0x2d7f, 0x2d96,\n\t0x2da0, 0x2da6,\n\t0x2da8, 0x2dae,\n\t0x2db0, 0x2db6,\n\t0x2db8, 0x2dbe,\n\t0x2dc0, 0x2dc6,\n\t0x2dc8, 0x2dce,\n\t0x2dd0, 0x2dd6,\n\t0x2dd8, 0x2dde,\n\t0x2de0, 0x2e3b,\n\t0x2e80, 0x2e99,\n\t0x2e9b, 0x2ef3,\n\t0x2f00, 0x2fd5,\n\t0x2ff0, 0x2ffb,\n\t0x3000, 0x303f,\n\t0x3041, 0x3096,\n\t0x3099, 0x30ff,\n\t0x3105, 0x312d,\n\t0x3131, 0x318e,\n\t0x3190, 0x31ba,\n\t0x31c0, 0x31e3,\n\t0x31f0, 0x321e,\n\t0x3220, 0x32fe,\n\t0x3300, 0x4db5,\n\t0x4dc0, 0x9fcc,\n\t0xa000, 0xa48c,\n\t0xa490, 0xa4c6,\n\t0xa4d0, 0xa62b,\n\t0xa640, 0xa697,\n\t0xa69f, 0xa6f7,\n\t0xa700, 0xa78e,\n\t0xa790, 0xa793,\n\t0xa7a0, 0xa7aa,\n\t0xa7f8, 0xa82b,\n\t0xa830, 0xa839,\n\t0xa840, 0xa877,\n\t0xa880, 0xa8c4,\n\t0xa8ce, 0xa8d9,\n\t0xa8e0, 0xa8fb,\n\t0xa900, 0xa953,\n\t0xa95f, 0xa97c,\n\t0xa980, 0xa9cd,\n\t0xa9cf, 0xa9d9,\n\t0xa9de, 0xa9df,\n\t0xaa00, 0xaa36,\n\t0xaa40, 0xaa4d,\n\t0xaa50, 0xaa59,\n\t0xaa5c, 0xaa7b,\n\t0xaa80, 0xaac2,\n\t0xaadb, 0xaaf6,\n\t0xab01, 0xab06,\n\t0xab09, 0xab0e,\n\t0xab11, 0xab16,\n\t0xab20, 0xab26,\n\t0xab28, 0xab2e,\n\t0xabc0, 0xabed,\n\t0xabf0, 0xabf9,\n\t0xac00, 0xd7a3,\n\t0xd7b0, 0xd7c6,\n\t0xd7cb, 0xd7fb,\n\t0xe000, 0xfa6d,\n\t0xfa70, 0xfad9,\n\t0xfb00, 0xfb06,\n\t0xfb13, 0xfb17,\n\t0xfb1d, 0xfb36,\n\t0xfb38, 0xfb3c,\n\t0xfb3e, 0xfb3e,\n\t0xfb40, 0xfb41,\n\t0xfb43, 0xfb44,\n\t0xfb46, 0xfbc1,\n\t0xfbd3, 0xfd3f,\n\t0xfd50, 0xfd8f,\n\t0xfd92, 0xfdc7,\n\t0xfdf0, 0xfdfd,\n\t0xfe00, 0xfe19,\n\t0xfe20, 0xfe26,\n\t0xfe30, 0xfe52,\n\t0xfe54, 0xfe66,\n\t0xfe68, 0xfe6b,\n\t0xfe70, 0xfe74,\n\t0xfe76, 0xfefc,\n\t0xfeff, 0xfeff,\n\t0xff01, 0xffbe,\n\t0xffc2, 0xffc7,\n\t0xffca, 0xffcf,\n\t0xffd2, 0xffd7,\n\t0xffda, 0xffdc,\n\t0xffe0, 0xffe6,\n\t0xffe8, 0xffee,\n\t0xfff9, 0xfffd,\n\t0x10000, 0x1000b,\n\t0x1000d, 0x10026,\n\t0x10028, 0x1003a,\n\t0x1003c, 0x1003d,\n\t0x1003f, 0x1004d,\n\t0x10050, 0x1005d,\n\t0x10080, 0x100fa,\n\t0x10100, 0x10102,\n\t0x10107, 0x10133,\n\t0x10137, 0x1018a,\n\t0x10190, 0x1019b,\n\t0x101d0, 0x101fd,\n\t0x10280, 0x1029c,\n\t0x102a0, 0x102d0,\n\t0x10300, 0x1031e,\n\t0x10320, 0x10323,\n\t0x10330, 0x1034a,\n\t0x10380, 0x1039d,\n\t0x1039f, 0x103c3,\n\t0x103c8, 0x103d5,\n\t0x10400, 0x1049d,\n\t0x104a0, 0x104a9,\n\t0x10800, 0x10805,\n\t0x10808, 0x10808,\n\t0x1080a, 0x10835,\n\t0x10837, 0x10838,\n\t0x1083c, 0x1083c,\n\t0x1083f, 0x10855,\n\t0x10857, 0x1085f,\n\t0x10900, 0x1091b,\n\t0x1091f, 0x10939,\n\t0x1093f, 0x1093f,\n\t0x10980, 0x109b7,\n\t0x109be, 0x109bf,\n\t0x10a00, 0x10a03,\n\t0x10a05, 0x10a06,\n\t0x10a0c, 0x10a13,\n\t0x10a15, 0x10a17,\n\t0x10a19, 0x10a33,\n\t0x10a38, 0x10a3a,\n\t0x10a3f, 0x10a47,\n\t0x10a50, 0x10a58,\n\t0x10a60, 0x10a7f,\n\t0x10b00, 0x10b35,\n\t0x10b39, 0x10b55,\n\t0x10b58, 0x10b72,\n\t0x10b78, 0x10b7f,\n\t0x10c00, 0x10c48,\n\t0x10e60, 0x10e7e,\n\t0x11000, 0x1104d,\n\t0x11052, 0x1106f,\n\t0x11080, 0x110c1,\n\t0x110d0, 0x110e8,\n\t0x110f0, 0x110f9,\n\t0x11100, 0x11134,\n\t0x11136, 0x11143,\n\t0x11180, 0x111c8,\n\t0x111d0, 0x111d9,\n\t0x11680, 0x116b7,\n\t0x116c0, 0x116c9,\n\t0x12000, 0x1236e,\n\t0x12400, 0x12462,\n\t0x12470, 0x12473,\n\t0x13000, 0x1342e,\n\t0x16800, 0x16a38,\n\t0x16f00, 0x16f44,\n\t0x16f50, 0x16f7e,\n\t0x16f8f, 0x16f9f,\n\t0x1b000, 0x1b001,\n\t0x1d000, 0x1d0f5,\n\t0x1d100, 0x1d126,\n\t0x1d129, 0x1d1dd,\n\t0x1d200, 0x1d245,\n\t0x1d300, 0x1d356,\n\t0x1d360, 0x1d371,\n\t0x1d400, 0x1d454,\n\t0x1d456, 0x1d49c,\n\t0x1d49e, 0x1d49f,\n\t0x1d4a2, 0x1d4a2,\n\t0x1d4a5, 0x1d4a6,\n\t0x1d4a9, 0x1d4ac,\n\t0x1d4ae, 0x1d4b9,\n\t0x1d4bb, 0x1d4bb,\n\t0x1d4bd, 0x1d4c3,\n\t0x1d4c5, 0x1d505,\n\t0x1d507, 0x1d50a,\n\t0x1d50d, 0x1d514,\n\t0x1d516, 0x1d51c,\n\t0x1d51e, 0x1d539,\n\t0x1d53b, 0x1d53e,\n\t0x1d540, 0x1d544,\n\t0x1d546, 0x1d546,\n\t0x1d54a, 0x1d550,\n\t0x1d552, 0x1d6a5,\n\t0x1d6a8, 0x1d7cb,\n\t0x1d7ce, 0x1d7ff,\n\t0x1ee00, 0x1ee03,\n\t0x1ee05, 0x1ee1f,\n\t0x1ee21, 0x1ee22,\n\t0x1ee24, 0x1ee24,\n\t0x1ee27, 0x1ee27,\n\t0x1ee29, 0x1ee32,\n\t0x1ee34, 0x1ee37,\n\t0x1ee39, 0x1ee39,\n\t0x1ee3b, 0x1ee3b,\n\t0x1ee42, 0x1ee42,\n\t0x1ee47, 0x1ee47,\n\t0x1ee49, 0x1ee49,\n\t0x1ee4b, 0x1ee4b,\n\t0x1ee4d, 0x1ee4f,\n\t0x1ee51, 0x1ee52,\n\t0x1ee54, 0x1ee54,\n\t0x1ee57, 0x1ee57,\n\t0x1ee59, 0x1ee59,\n\t0x1ee5b, 0x1ee5b,\n\t0x1ee5d, 0x1ee5d,\n\t0x1ee5f, 0x1ee5f,\n\t0x1ee61, 0x1ee62,\n\t0x1ee64, 0x1ee64,\n\t0x1ee67, 0x1ee6a,\n\t0x1ee6c, 0x1ee72,\n\t0x1ee74, 0x1ee77,\n\t0x1ee79, 0x1ee7c,\n\t0x1ee7e, 0x1ee7e,\n\t0x1ee80, 0x1ee89,\n\t0x1ee8b, 0x1ee9b,\n\t0x1eea1, 0x1eea3,\n\t0x1eea5, 0x1eea9,\n\t0x1eeab, 0x1eebb,\n\t0x1eef0, 0x1eef1,\n\t0x1f000, 0x1f02b,\n\t0x1f030, 0x1f093,\n\t0x1f0a0, 0x1f0ae,\n\t0x1f0b1, 0x1f0be,\n\t0x1f0c1, 0x1f0cf,\n\t0x1f0d1, 0x1f0df,\n\t0x1f100, 0x1f10a,\n\t0x1f110, 0x1f12e,\n\t0x1f130, 0x1f16b,\n\t0x1f170, 0x1f19a,\n\t0x1f1e6, 0x1f202,\n\t0x1f210, 0x1f23a,\n\t0x1f240, 0x1f248,\n\t0x1f250, 0x1f251,\n\t0x1f300, 0x1f320,\n\t0x1f330, 0x1f335,\n\t0x1f337, 0x1f37c,\n\t0x1f380, 0x1f393,\n\t0x1f3a0, 0x1f3c4,\n\t0x1f3c6, 0x1f3ca,\n\t0x1f3e0, 0x1f3f0,\n\t0x1f400, 0x1f43e,\n\t0x1f440, 0x1f440,\n\t0x1f442, 0x1f4f7,\n\t0x1f4f9, 0x1f4fc,\n\t0x1f500, 0x1f53d,\n\t0x1f540, 0x1f543,\n\t0x1f550, 0x1f567,\n\t0x1f5fb, 0x1f640,\n\t0x1f645, 0x1f64f,\n\t0x1f680, 0x1f6c5,\n\t0x1f700, 0x1f773,\n\t0x20000, 0x2a6d6,\n\t0x2a700, 0x2b734,\n\t0x2b740, 0x2b81d,\n\t0x2f800, 0x2fa1d,\n\t0xe0001, 0xe0001,\n\t0xe0020, 0xe007f,\n\t0xe0100, 0xe01ef,\n\t0xf0000, 0xffffd,\n\t0x100000, 0x10fffd,\n}; /* CR_Print */\n\n/* 'Punct': [[:Punct:]] */\nstatic const OnigCodePoint CR_Punct[] = {\n\t140,\n\t0x0021, 0x0023,\n\t0x0025, 0x002a,\n\t0x002c, 0x002f,\n\t0x003a, 0x003b,\n\t0x003f, 0x0040,\n\t0x005b, 0x005d,\n\t0x005f, 0x005f,\n\t0x007b, 0x007b,\n\t0x007d, 0x007d,\n\t0x00a1, 0x00a1,\n\t0x00a7, 0x00a7,\n\t0x00ab, 0x00ab,\n\t0x00b6, 0x00b7,\n\t0x00bb, 0x00bb,\n\t0x00bf, 0x00bf,\n\t0x037e, 0x037e,\n\t0x0387, 0x0387,\n\t0x055a, 0x055f,\n\t0x0589, 0x058a,\n\t0x05be, 0x05be,\n\t0x05c0, 0x05c0,\n\t0x05c3, 0x05c3,\n\t0x05c6, 0x05c6,\n\t0x05f3, 0x05f4,\n\t0x0609, 0x060a,\n\t0x060c, 0x060d,\n\t0x061b, 0x061b,\n\t0x061e, 0x061f,\n\t0x066a, 0x066d,\n\t0x06d4, 0x06d4,\n\t0x0700, 0x070d,\n\t0x07f7, 0x07f9,\n\t0x0830, 0x083e,\n\t0x085e, 0x085e,\n\t0x0964, 0x0965,\n\t0x0970, 0x0970,\n\t0x0af0, 0x0af0,\n\t0x0df4, 0x0df4,\n\t0x0e4f, 0x0e4f,\n\t0x0e5a, 0x0e5b,\n\t0x0f04, 0x0f12,\n\t0x0f14, 0x0f14,\n\t0x0f3a, 0x0f3d,\n\t0x0f85, 0x0f85,\n\t0x0fd0, 0x0fd4,\n\t0x0fd9, 0x0fda,\n\t0x104a, 0x104f,\n\t0x10fb, 0x10fb,\n\t0x1360, 0x1368,\n\t0x1400, 0x1400,\n\t0x166d, 0x166e,\n\t0x169b, 0x169c,\n\t0x16eb, 0x16ed,\n\t0x1735, 0x1736,\n\t0x17d4, 0x17d6,\n\t0x17d8, 0x17da,\n\t0x1800, 0x180a,\n\t0x1944, 0x1945,\n\t0x1a1e, 0x1a1f,\n\t0x1aa0, 0x1aa6,\n\t0x1aa8, 0x1aad,\n\t0x1b5a, 0x1b60,\n\t0x1bfc, 0x1bff,\n\t0x1c3b, 0x1c3f,\n\t0x1c7e, 0x1c7f,\n\t0x1cc0, 0x1cc7,\n\t0x1cd3, 0x1cd3,\n\t0x2010, 0x2027,\n\t0x2030, 0x2043,\n\t0x2045, 0x2051,\n\t0x2053, 0x205e,\n\t0x207d, 0x207e,\n\t0x208d, 0x208e,\n\t0x2329, 0x232a,\n\t0x2768, 0x2775,\n\t0x27c5, 0x27c6,\n\t0x27e6, 0x27ef,\n\t0x2983, 0x2998,\n\t0x29d8, 0x29db,\n\t0x29fc, 0x29fd,\n\t0x2cf9, 0x2cfc,\n\t0x2cfe, 0x2cff,\n\t0x2d70, 0x2d70,\n\t0x2e00, 0x2e2e,\n\t0x2e30, 0x2e3b,\n\t0x3001, 0x3003,\n\t0x3008, 0x3011,\n\t0x3014, 0x301f,\n\t0x3030, 0x3030,\n\t0x303d, 0x303d,\n\t0x30a0, 0x30a0,\n\t0x30fb, 0x30fb,\n\t0xa4fe, 0xa4ff,\n\t0xa60d, 0xa60f,\n\t0xa673, 0xa673,\n\t0xa67e, 0xa67e,\n\t0xa6f2, 0xa6f7,\n\t0xa874, 0xa877,\n\t0xa8ce, 0xa8cf,\n\t0xa8f8, 0xa8fa,\n\t0xa92e, 0xa92f,\n\t0xa95f, 0xa95f,\n\t0xa9c1, 0xa9cd,\n\t0xa9de, 0xa9df,\n\t0xaa5c, 0xaa5f,\n\t0xaade, 0xaadf,\n\t0xaaf0, 0xaaf1,\n\t0xabeb, 0xabeb,\n\t0xfd3e, 0xfd3f,\n\t0xfe10, 0xfe19,\n\t0xfe30, 0xfe52,\n\t0xfe54, 0xfe61,\n\t0xfe63, 0xfe63,\n\t0xfe68, 0xfe68,\n\t0xfe6a, 0xfe6b,\n\t0xff01, 0xff03,\n\t0xff05, 0xff0a,\n\t0xff0c, 0xff0f,\n\t0xff1a, 0xff1b,\n\t0xff1f, 0xff20,\n\t0xff3b, 0xff3d,\n\t0xff3f, 0xff3f,\n\t0xff5b, 0xff5b,\n\t0xff5d, 0xff5d,\n\t0xff5f, 0xff65,\n\t0x10100, 0x10102,\n\t0x1039f, 0x1039f,\n\t0x103d0, 0x103d0,\n\t0x10857, 0x10857,\n\t0x1091f, 0x1091f,\n\t0x1093f, 0x1093f,\n\t0x10a50, 0x10a58,\n\t0x10a7f, 0x10a7f,\n\t0x10b39, 0x10b3f,\n\t0x11047, 0x1104d,\n\t0x110bb, 0x110bc,\n\t0x110be, 0x110c1,\n\t0x11140, 0x11143,\n\t0x111c5, 0x111c8,\n\t0x12470, 0x12473,\n}; /* CR_Punct */\n\n/* 'Space': [[:Space:]] */\nstatic const OnigCodePoint CR_Space[] = {\n\t11,\n\t0x0009, 0x000d,\n\t0x0020, 0x0020,\n\t0x0085, 0x0085,\n\t0x00a0, 0x00a0,\n\t0x1680, 0x1680,\n\t0x180e, 0x180e,\n\t0x2000, 0x200a,\n\t0x2028, 0x2029,\n\t0x202f, 0x202f,\n\t0x205f, 0x205f,\n\t0x3000, 0x3000,\n}; /* CR_Space */\n\n/* 'Upper': [[:Upper:]] */\nstatic const OnigCodePoint CR_Upper[] = {\n\t610,\n\t0x0041, 0x005a,\n\t0x00c0, 0x00d6,\n\t0x00d8, 0x00de,\n\t0x0100, 0x0100,\n\t0x0102, 0x0102,\n\t0x0104, 0x0104,\n\t0x0106, 0x0106,\n\t0x0108, 0x0108,\n\t0x010a, 0x010a,\n\t0x010c, 0x010c,\n\t0x010e, 0x010e,\n\t0x0110, 0x0110,\n\t0x0112, 0x0112,\n\t0x0114, 0x0114,\n\t0x0116, 0x0116,\n\t0x0118, 0x0118,\n\t0x011a, 0x011a,\n\t0x011c, 0x011c,\n\t0x011e, 0x011e,\n\t0x0120, 0x0120,\n\t0x0122, 0x0122,\n\t0x0124, 0x0124,\n\t0x0126, 0x0126,\n\t0x0128, 0x0128,\n\t0x012a, 0x012a,\n\t0x012c, 0x012c,\n\t0x012e, 0x012e,\n\t0x0130, 0x0130,\n\t0x0132, 0x0132,\n\t0x0134, 0x0134,\n\t0x0136, 0x0136,\n\t0x0139, 0x0139,\n\t0x013b, 0x013b,\n\t0x013d, 0x013d,\n\t0x013f, 0x013f,\n\t0x0141, 0x0141,\n\t0x0143, 0x0143,\n\t0x0145, 0x0145,\n\t0x0147, 0x0147,\n\t0x014a, 0x014a,\n\t0x014c, 0x014c,\n\t0x014e, 0x014e,\n\t0x0150, 0x0150,\n\t0x0152, 0x0152,\n\t0x0154, 0x0154,\n\t0x0156, 0x0156,\n\t0x0158, 0x0158,\n\t0x015a, 0x015a,\n\t0x015c, 0x015c,\n\t0x015e, 0x015e,\n\t0x0160, 0x0160,\n\t0x0162, 0x0162,\n\t0x0164, 0x0164,\n\t0x0166, 0x0166,\n\t0x0168, 0x0168,\n\t0x016a, 0x016a,\n\t0x016c, 0x016c,\n\t0x016e, 0x016e,\n\t0x0170, 0x0170,\n\t0x0172, 0x0172,\n\t0x0174, 0x0174,\n\t0x0176, 0x0176,\n\t0x0178, 0x0179,\n\t0x017b, 0x017b,\n\t0x017d, 0x017d,\n\t0x0181, 0x0182,\n\t0x0184, 0x0184,\n\t0x0186, 0x0187,\n\t0x0189, 0x018b,\n\t0x018e, 0x0191,\n\t0x0193, 0x0194,\n\t0x0196, 0x0198,\n\t0x019c, 0x019d,\n\t0x019f, 0x01a0,\n\t0x01a2, 0x01a2,\n\t0x01a4, 0x01a4,\n\t0x01a6, 0x01a7,\n\t0x01a9, 0x01a9,\n\t0x01ac, 0x01ac,\n\t0x01ae, 0x01af,\n\t0x01b1, 0x01b3,\n\t0x01b5, 0x01b5,\n\t0x01b7, 0x01b8,\n\t0x01bc, 0x01bc,\n\t0x01c4, 0x01c4,\n\t0x01c7, 0x01c7,\n\t0x01ca, 0x01ca,\n\t0x01cd, 0x01cd,\n\t0x01cf, 0x01cf,\n\t0x01d1, 0x01d1,\n\t0x01d3, 0x01d3,\n\t0x01d5, 0x01d5,\n\t0x01d7, 0x01d7,\n\t0x01d9, 0x01d9,\n\t0x01db, 0x01db,\n\t0x01de, 0x01de,\n\t0x01e0, 0x01e0,\n\t0x01e2, 0x01e2,\n\t0x01e4, 0x01e4,\n\t0x01e6, 0x01e6,\n\t0x01e8, 0x01e8,\n\t0x01ea, 0x01ea,\n\t0x01ec, 0x01ec,\n\t0x01ee, 0x01ee,\n\t0x01f1, 0x01f1,\n\t0x01f4, 0x01f4,\n\t0x01f6, 0x01f8,\n\t0x01fa, 0x01fa,\n\t0x01fc, 0x01fc,\n\t0x01fe, 0x01fe,\n\t0x0200, 0x0200,\n\t0x0202, 0x0202,\n\t0x0204, 0x0204,\n\t0x0206, 0x0206,\n\t0x0208, 0x0208,\n\t0x020a, 0x020a,\n\t0x020c, 0x020c,\n\t0x020e, 0x020e,\n\t0x0210, 0x0210,\n\t0x0212, 0x0212,\n\t0x0214, 0x0214,\n\t0x0216, 0x0216,\n\t0x0218, 0x0218,\n\t0x021a, 0x021a,\n\t0x021c, 0x021c,\n\t0x021e, 0x021e,\n\t0x0220, 0x0220,\n\t0x0222, 0x0222,\n\t0x0224, 0x0224,\n\t0x0226, 0x0226,\n\t0x0228, 0x0228,\n\t0x022a, 0x022a,\n\t0x022c, 0x022c,\n\t0x022e, 0x022e,\n\t0x0230, 0x0230,\n\t0x0232, 0x0232,\n\t0x023a, 0x023b,\n\t0x023d, 0x023e,\n\t0x0241, 0x0241,\n\t0x0243, 0x0246,\n\t0x0248, 0x0248,\n\t0x024a, 0x024a,\n\t0x024c, 0x024c,\n\t0x024e, 0x024e,\n\t0x0370, 0x0370,\n\t0x0372, 0x0372,\n\t0x0376, 0x0376,\n\t0x0386, 0x0386,\n\t0x0388, 0x038a,\n\t0x038c, 0x038c,\n\t0x038e, 0x038f,\n\t0x0391, 0x03a1,\n\t0x03a3, 0x03ab,\n\t0x03cf, 0x03cf,\n\t0x03d2, 0x03d4,\n\t0x03d8, 0x03d8,\n\t0x03da, 0x03da,\n\t0x03dc, 0x03dc,\n\t0x03de, 0x03de,\n\t0x03e0, 0x03e0,\n\t0x03e2, 0x03e2,\n\t0x03e4, 0x03e4,\n\t0x03e6, 0x03e6,\n\t0x03e8, 0x03e8,\n\t0x03ea, 0x03ea,\n\t0x03ec, 0x03ec,\n\t0x03ee, 0x03ee,\n\t0x03f4, 0x03f4,\n\t0x03f7, 0x03f7,\n\t0x03f9, 0x03fa,\n\t0x03fd, 0x042f,\n\t0x0460, 0x0460,\n\t0x0462, 0x0462,\n\t0x0464, 0x0464,\n\t0x0466, 0x0466,\n\t0x0468, 0x0468,\n\t0x046a, 0x046a,\n\t0x046c, 0x046c,\n\t0x046e, 0x046e,\n\t0x0470, 0x0470,\n\t0x0472, 0x0472,\n\t0x0474, 0x0474,\n\t0x0476, 0x0476,\n\t0x0478, 0x0478,\n\t0x047a, 0x047a,\n\t0x047c, 0x047c,\n\t0x047e, 0x047e,\n\t0x0480, 0x0480,\n\t0x048a, 0x048a,\n\t0x048c, 0x048c,\n\t0x048e, 0x048e,\n\t0x0490, 0x0490,\n\t0x0492, 0x0492,\n\t0x0494, 0x0494,\n\t0x0496, 0x0496,\n\t0x0498, 0x0498,\n\t0x049a, 0x049a,\n\t0x049c, 0x049c,\n\t0x049e, 0x049e,\n\t0x04a0, 0x04a0,\n\t0x04a2, 0x04a2,\n\t0x04a4, 0x04a4,\n\t0x04a6, 0x04a6,\n\t0x04a8, 0x04a8,\n\t0x04aa, 0x04aa,\n\t0x04ac, 0x04ac,\n\t0x04ae, 0x04ae,\n\t0x04b0, 0x04b0,\n\t0x04b2, 0x04b2,\n\t0x04b4, 0x04b4,\n\t0x04b6, 0x04b6,\n\t0x04b8, 0x04b8,\n\t0x04ba, 0x04ba,\n\t0x04bc, 0x04bc,\n\t0x04be, 0x04be,\n\t0x04c0, 0x04c1,\n\t0x04c3, 0x04c3,\n\t0x04c5, 0x04c5,\n\t0x04c7, 0x04c7,\n\t0x04c9, 0x04c9,\n\t0x04cb, 0x04cb,\n\t0x04cd, 0x04cd,\n\t0x04d0, 0x04d0,\n\t0x04d2, 0x04d2,\n\t0x04d4, 0x04d4,\n\t0x04d6, 0x04d6,\n\t0x04d8, 0x04d8,\n\t0x04da, 0x04da,\n\t0x04dc, 0x04dc,\n\t0x04de, 0x04de,\n\t0x04e0, 0x04e0,\n\t0x04e2, 0x04e2,\n\t0x04e4, 0x04e4,\n\t0x04e6, 0x04e6,\n\t0x04e8, 0x04e8,\n\t0x04ea, 0x04ea,\n\t0x04ec, 0x04ec,\n\t0x04ee, 0x04ee,\n\t0x04f0, 0x04f0,\n\t0x04f2, 0x04f2,\n\t0x04f4, 0x04f4,\n\t0x04f6, 0x04f6,\n\t0x04f8, 0x04f8,\n\t0x04fa, 0x04fa,\n\t0x04fc, 0x04fc,\n\t0x04fe, 0x04fe,\n\t0x0500, 0x0500,\n\t0x0502, 0x0502,\n\t0x0504, 0x0504,\n\t0x0506, 0x0506,\n\t0x0508, 0x0508,\n\t0x050a, 0x050a,\n\t0x050c, 0x050c,\n\t0x050e, 0x050e,\n\t0x0510, 0x0510,\n\t0x0512, 0x0512,\n\t0x0514, 0x0514,\n\t0x0516, 0x0516,\n\t0x0518, 0x0518,\n\t0x051a, 0x051a,\n\t0x051c, 0x051c,\n\t0x051e, 0x051e,\n\t0x0520, 0x0520,\n\t0x0522, 0x0522,\n\t0x0524, 0x0524,\n\t0x0526, 0x0526,\n\t0x0531, 0x0556,\n\t0x10a0, 0x10c5,\n\t0x10c7, 0x10c7,\n\t0x10cd, 0x10cd,\n\t0x1e00, 0x1e00,\n\t0x1e02, 0x1e02,\n\t0x1e04, 0x1e04,\n\t0x1e06, 0x1e06,\n\t0x1e08, 0x1e08,\n\t0x1e0a, 0x1e0a,\n\t0x1e0c, 0x1e0c,\n\t0x1e0e, 0x1e0e,\n\t0x1e10, 0x1e10,\n\t0x1e12, 0x1e12,\n\t0x1e14, 0x1e14,\n\t0x1e16, 0x1e16,\n\t0x1e18, 0x1e18,\n\t0x1e1a, 0x1e1a,\n\t0x1e1c, 0x1e1c,\n\t0x1e1e, 0x1e1e,\n\t0x1e20, 0x1e20,\n\t0x1e22, 0x1e22,\n\t0x1e24, 0x1e24,\n\t0x1e26, 0x1e26,\n\t0x1e28, 0x1e28,\n\t0x1e2a, 0x1e2a,\n\t0x1e2c, 0x1e2c,\n\t0x1e2e, 0x1e2e,\n\t0x1e30, 0x1e30,\n\t0x1e32, 0x1e32,\n\t0x1e34, 0x1e34,\n\t0x1e36, 0x1e36,\n\t0x1e38, 0x1e38,\n\t0x1e3a, 0x1e3a,\n\t0x1e3c, 0x1e3c,\n\t0x1e3e, 0x1e3e,\n\t0x1e40, 0x1e40,\n\t0x1e42, 0x1e42,\n\t0x1e44, 0x1e44,\n\t0x1e46, 0x1e46,\n\t0x1e48, 0x1e48,\n\t0x1e4a, 0x1e4a,\n\t0x1e4c, 0x1e4c,\n\t0x1e4e, 0x1e4e,\n\t0x1e50, 0x1e50,\n\t0x1e52, 0x1e52,\n\t0x1e54, 0x1e54,\n\t0x1e56, 0x1e56,\n\t0x1e58, 0x1e58,\n\t0x1e5a, 0x1e5a,\n\t0x1e5c, 0x1e5c,\n\t0x1e5e, 0x1e5e,\n\t0x1e60, 0x1e60,\n\t0x1e62, 0x1e62,\n\t0x1e64, 0x1e64,\n\t0x1e66, 0x1e66,\n\t0x1e68, 0x1e68,\n\t0x1e6a, 0x1e6a,\n\t0x1e6c, 0x1e6c,\n\t0x1e6e, 0x1e6e,\n\t0x1e70, 0x1e70,\n\t0x1e72, 0x1e72,\n\t0x1e74, 0x1e74,\n\t0x1e76, 0x1e76,\n\t0x1e78, 0x1e78,\n\t0x1e7a, 0x1e7a,\n\t0x1e7c, 0x1e7c,\n\t0x1e7e, 0x1e7e,\n\t0x1e80, 0x1e80,\n\t0x1e82, 0x1e82,\n\t0x1e84, 0x1e84,\n\t0x1e86, 0x1e86,\n\t0x1e88, 0x1e88,\n\t0x1e8a, 0x1e8a,\n\t0x1e8c, 0x1e8c,\n\t0x1e8e, 0x1e8e,\n\t0x1e90, 0x1e90,\n\t0x1e92, 0x1e92,\n\t0x1e94, 0x1e94,\n\t0x1e9e, 0x1e9e,\n\t0x1ea0, 0x1ea0,\n\t0x1ea2, 0x1ea2,\n\t0x1ea4, 0x1ea4,\n\t0x1ea6, 0x1ea6,\n\t0x1ea8, 0x1ea8,\n\t0x1eaa, 0x1eaa,\n\t0x1eac, 0x1eac,\n\t0x1eae, 0x1eae,\n\t0x1eb0, 0x1eb0,\n\t0x1eb2, 0x1eb2,\n\t0x1eb4, 0x1eb4,\n\t0x1eb6, 0x1eb6,\n\t0x1eb8, 0x1eb8,\n\t0x1eba, 0x1eba,\n\t0x1ebc, 0x1ebc,\n\t0x1ebe, 0x1ebe,\n\t0x1ec0, 0x1ec0,\n\t0x1ec2, 0x1ec2,\n\t0x1ec4, 0x1ec4,\n\t0x1ec6, 0x1ec6,\n\t0x1ec8, 0x1ec8,\n\t0x1eca, 0x1eca,\n\t0x1ecc, 0x1ecc,\n\t0x1ece, 0x1ece,\n\t0x1ed0, 0x1ed0,\n\t0x1ed2, 0x1ed2,\n\t0x1ed4, 0x1ed4,\n\t0x1ed6, 0x1ed6,\n\t0x1ed8, 0x1ed8,\n\t0x1eda, 0x1eda,\n\t0x1edc, 0x1edc,\n\t0x1ede, 0x1ede,\n\t0x1ee0, 0x1ee0,\n\t0x1ee2, 0x1ee2,\n\t0x1ee4, 0x1ee4,\n\t0x1ee6, 0x1ee6,\n\t0x1ee8, 0x1ee8,\n\t0x1eea, 0x1eea,\n\t0x1eec, 0x1eec,\n\t0x1eee, 0x1eee,\n\t0x1ef0, 0x1ef0,\n\t0x1ef2, 0x1ef2,\n\t0x1ef4, 0x1ef4,\n\t0x1ef6, 0x1ef6,\n\t0x1ef8, 0x1ef8,\n\t0x1efa, 0x1efa,\n\t0x1efc, 0x1efc,\n\t0x1efe, 0x1efe,\n\t0x1f08, 0x1f0f,\n\t0x1f18, 0x1f1d,\n\t0x1f28, 0x1f2f,\n\t0x1f38, 0x1f3f,\n\t0x1f48, 0x1f4d,\n\t0x1f59, 0x1f59,\n\t0x1f5b, 0x1f5b,\n\t0x1f5d, 0x1f5d,\n\t0x1f5f, 0x1f5f,\n\t0x1f68, 0x1f6f,\n\t0x1fb8, 0x1fbb,\n\t0x1fc8, 0x1fcb,\n\t0x1fd8, 0x1fdb,\n\t0x1fe8, 0x1fec,\n\t0x1ff8, 0x1ffb,\n\t0x2102, 0x2102,\n\t0x2107, 0x2107,\n\t0x210b, 0x210d,\n\t0x2110, 0x2112,\n\t0x2115, 0x2115,\n\t0x2119, 0x211d,\n\t0x2124, 0x2124,\n\t0x2126, 0x2126,\n\t0x2128, 0x2128,\n\t0x212a, 0x212d,\n\t0x2130, 0x2133,\n\t0x213e, 0x213f,\n\t0x2145, 0x2145,\n\t0x2160, 0x216f,\n\t0x2183, 0x2183,\n\t0x24b6, 0x24cf,\n\t0x2c00, 0x2c2e,\n\t0x2c60, 0x2c60,\n\t0x2c62, 0x2c64,\n\t0x2c67, 0x2c67,\n\t0x2c69, 0x2c69,\n\t0x2c6b, 0x2c6b,\n\t0x2c6d, 0x2c70,\n\t0x2c72, 0x2c72,\n\t0x2c75, 0x2c75,\n\t0x2c7e, 0x2c80,\n\t0x2c82, 0x2c82,\n\t0x2c84, 0x2c84,\n\t0x2c86, 0x2c86,\n\t0x2c88, 0x2c88,\n\t0x2c8a, 0x2c8a,\n\t0x2c8c, 0x2c8c,\n\t0x2c8e, 0x2c8e,\n\t0x2c90, 0x2c90,\n\t0x2c92, 0x2c92,\n\t0x2c94, 0x2c94,\n\t0x2c96, 0x2c96,\n\t0x2c98, 0x2c98,\n\t0x2c9a, 0x2c9a,\n\t0x2c9c, 0x2c9c,\n\t0x2c9e, 0x2c9e,\n\t0x2ca0, 0x2ca0,\n\t0x2ca2, 0x2ca2,\n\t0x2ca4, 0x2ca4,\n\t0x2ca6, 0x2ca6,\n\t0x2ca8, 0x2ca8,\n\t0x2caa, 0x2caa,\n\t0x2cac, 0x2cac,\n\t0x2cae, 0x2cae,\n\t0x2cb0, 0x2cb0,\n\t0x2cb2, 0x2cb2,\n\t0x2cb4, 0x2cb4,\n\t0x2cb6, 0x2cb6,\n\t0x2cb8, 0x2cb8,\n\t0x2cba, 0x2cba,\n\t0x2cbc, 0x2cbc,\n\t0x2cbe, 0x2cbe,\n\t0x2cc0, 0x2cc0,\n\t0x2cc2, 0x2cc2,\n\t0x2cc4, 0x2cc4,\n\t0x2cc6, 0x2cc6,\n\t0x2cc8, 0x2cc8,\n\t0x2cca, 0x2cca,\n\t0x2ccc, 0x2ccc,\n\t0x2cce, 0x2cce,\n\t0x2cd0, 0x2cd0,\n\t0x2cd2, 0x2cd2,\n\t0x2cd4, 0x2cd4,\n\t0x2cd6, 0x2cd6,\n\t0x2cd8, 0x2cd8,\n\t0x2cda, 0x2cda,\n\t0x2cdc, 0x2cdc,\n\t0x2cde, 0x2cde,\n\t0x2ce0, 0x2ce0,\n\t0x2ce2, 0x2ce2,\n\t0x2ceb, 0x2ceb,\n\t0x2ced, 0x2ced,\n\t0x2cf2, 0x2cf2,\n\t0xa640, 0xa640,\n\t0xa642, 0xa642,\n\t0xa644, 0xa644,\n\t0xa646, 0xa646,\n\t0xa648, 0xa648,\n\t0xa64a, 0xa64a,\n\t0xa64c, 0xa64c,\n\t0xa64e, 0xa64e,\n\t0xa650, 0xa650,\n\t0xa652, 0xa652,\n\t0xa654, 0xa654,\n\t0xa656, 0xa656,\n\t0xa658, 0xa658,\n\t0xa65a, 0xa65a,\n\t0xa65c, 0xa65c,\n\t0xa65e, 0xa65e,\n\t0xa660, 0xa660,\n\t0xa662, 0xa662,\n\t0xa664, 0xa664,\n\t0xa666, 0xa666,\n\t0xa668, 0xa668,\n\t0xa66a, 0xa66a,\n\t0xa66c, 0xa66c,\n\t0xa680, 0xa680,\n\t0xa682, 0xa682,\n\t0xa684, 0xa684,\n\t0xa686, 0xa686,\n\t0xa688, 0xa688,\n\t0xa68a, 0xa68a,\n\t0xa68c, 0xa68c,\n\t0xa68e, 0xa68e,\n\t0xa690, 0xa690,\n\t0xa692, 0xa692,\n\t0xa694, 0xa694,\n\t0xa696, 0xa696,\n\t0xa722, 0xa722,\n\t0xa724, 0xa724,\n\t0xa726, 0xa726,\n\t0xa728, 0xa728,\n\t0xa72a, 0xa72a,\n\t0xa72c, 0xa72c,\n\t0xa72e, 0xa72e,\n\t0xa732, 0xa732,\n\t0xa734, 0xa734,\n\t0xa736, 0xa736,\n\t0xa738, 0xa738,\n\t0xa73a, 0xa73a,\n\t0xa73c, 0xa73c,\n\t0xa73e, 0xa73e,\n\t0xa740, 0xa740,\n\t0xa742, 0xa742,\n\t0xa744, 0xa744,\n\t0xa746, 0xa746,\n\t0xa748, 0xa748,\n\t0xa74a, 0xa74a,\n\t0xa74c, 0xa74c,\n\t0xa74e, 0xa74e,\n\t0xa750, 0xa750,\n\t0xa752, 0xa752,\n\t0xa754, 0xa754,\n\t0xa756, 0xa756,\n\t0xa758, 0xa758,\n\t0xa75a, 0xa75a,\n\t0xa75c, 0xa75c,\n\t0xa75e, 0xa75e,\n\t0xa760, 0xa760,\n\t0xa762, 0xa762,\n\t0xa764, 0xa764,\n\t0xa766, 0xa766,\n\t0xa768, 0xa768,\n\t0xa76a, 0xa76a,\n\t0xa76c, 0xa76c,\n\t0xa76e, 0xa76e,\n\t0xa779, 0xa779,\n\t0xa77b, 0xa77b,\n\t0xa77d, 0xa77e,\n\t0xa780, 0xa780,\n\t0xa782, 0xa782,\n\t0xa784, 0xa784,\n\t0xa786, 0xa786,\n\t0xa78b, 0xa78b,\n\t0xa78d, 0xa78d,\n\t0xa790, 0xa790,\n\t0xa792, 0xa792,\n\t0xa7a0, 0xa7a0,\n\t0xa7a2, 0xa7a2,\n\t0xa7a4, 0xa7a4,\n\t0xa7a6, 0xa7a6,\n\t0xa7a8, 0xa7a8,\n\t0xa7aa, 0xa7aa,\n\t0xff21, 0xff3a,\n\t0x10400, 0x10427,\n\t0x1d400, 0x1d419,\n\t0x1d434, 0x1d44d,\n\t0x1d468, 0x1d481,\n\t0x1d49c, 0x1d49c,\n\t0x1d49e, 0x1d49f,\n\t0x1d4a2, 0x1d4a2,\n\t0x1d4a5, 0x1d4a6,\n\t0x1d4a9, 0x1d4ac,\n\t0x1d4ae, 0x1d4b5,\n\t0x1d4d0, 0x1d4e9,\n\t0x1d504, 0x1d505,\n\t0x1d507, 0x1d50a,\n\t0x1d50d, 0x1d514,\n\t0x1d516, 0x1d51c,\n\t0x1d538, 0x1d539,\n\t0x1d53b, 0x1d53e,\n\t0x1d540, 0x1d544,\n\t0x1d546, 0x1d546,\n\t0x1d54a, 0x1d550,\n\t0x1d56c, 0x1d585,\n\t0x1d5a0, 0x1d5b9,\n\t0x1d5d4, 0x1d5ed,\n\t0x1d608, 0x1d621,\n\t0x1d63c, 0x1d655,\n\t0x1d670, 0x1d689,\n\t0x1d6a8, 0x1d6c0,\n\t0x1d6e2, 0x1d6fa,\n\t0x1d71c, 0x1d734,\n\t0x1d756, 0x1d76e,\n\t0x1d790, 0x1d7a8,\n\t0x1d7ca, 0x1d7ca,\n}; /* CR_Upper */\n\n/* 'XDigit': [[:XDigit:]] */\nstatic const OnigCodePoint CR_XDigit[] = {\n\t3,\n\t0x0030, 0x0039,\n\t0x0041, 0x0046,\n\t0x0061, 0x0066,\n}; /* CR_XDigit */\n\n/* 'Word': [[:Word:]] */\nstatic const OnigCodePoint CR_Word[] = {\n\t564,\n\t0x0030, 0x0039,\n\t0x0041, 0x005a,\n\t0x005f, 0x005f,\n\t0x0061, 0x007a,\n\t0x00aa, 0x00aa,\n\t0x00b5, 0x00b5,\n\t0x00ba, 0x00ba,\n\t0x00c0, 0x00d6,\n\t0x00d8, 0x00f6,\n\t0x00f8, 0x02c1,\n\t0x02c6, 0x02d1,\n\t0x02e0, 0x02e4,\n\t0x02ec, 0x02ec,\n\t0x02ee, 0x02ee,\n\t0x0300, 0x0374,\n\t0x0376, 0x0377,\n\t0x037a, 0x037d,\n\t0x0386, 0x0386,\n\t0x0388, 0x038a,\n\t0x038c, 0x038c,\n\t0x038e, 0x03a1,\n\t0x03a3, 0x03f5,\n\t0x03f7, 0x0481,\n\t0x0483, 0x0527,\n\t0x0531, 0x0556,\n\t0x0559, 0x0559,\n\t0x0561, 0x0587,\n\t0x0591, 0x05bd,\n\t0x05bf, 0x05bf,\n\t0x05c1, 0x05c2,\n\t0x05c4, 0x05c5,\n\t0x05c7, 0x05c7,\n\t0x05d0, 0x05ea,\n\t0x05f0, 0x05f2,\n\t0x0610, 0x061a,\n\t0x0620, 0x0669,\n\t0x066e, 0x06d3,\n\t0x06d5, 0x06dc,\n\t0x06df, 0x06e8,\n\t0x06ea, 0x06fc,\n\t0x06ff, 0x06ff,\n\t0x0710, 0x074a,\n\t0x074d, 0x07b1,\n\t0x07c0, 0x07f5,\n\t0x07fa, 0x07fa,\n\t0x0800, 0x082d,\n\t0x0840, 0x085b,\n\t0x08a0, 0x08a0,\n\t0x08a2, 0x08ac,\n\t0x08e4, 0x08fe,\n\t0x0900, 0x0963,\n\t0x0966, 0x096f,\n\t0x0971, 0x0977,\n\t0x0979, 0x097f,\n\t0x0981, 0x0983,\n\t0x0985, 0x098c,\n\t0x098f, 0x0990,\n\t0x0993, 0x09a8,\n\t0x09aa, 0x09b0,\n\t0x09b2, 0x09b2,\n\t0x09b6, 0x09b9,\n\t0x09bc, 0x09c4,\n\t0x09c7, 0x09c8,\n\t0x09cb, 0x09ce,\n\t0x09d7, 0x09d7,\n\t0x09dc, 0x09dd,\n\t0x09df, 0x09e3,\n\t0x09e6, 0x09f1,\n\t0x0a01, 0x0a03,\n\t0x0a05, 0x0a0a,\n\t0x0a0f, 0x0a10,\n\t0x0a13, 0x0a28,\n\t0x0a2a, 0x0a30,\n\t0x0a32, 0x0a33,\n\t0x0a35, 0x0a36,\n\t0x0a38, 0x0a39,\n\t0x0a3c, 0x0a3c,\n\t0x0a3e, 0x0a42,\n\t0x0a47, 0x0a48,\n\t0x0a4b, 0x0a4d,\n\t0x0a51, 0x0a51,\n\t0x0a59, 0x0a5c,\n\t0x0a5e, 0x0a5e,\n\t0x0a66, 0x0a75,\n\t0x0a81, 0x0a83,\n\t0x0a85, 0x0a8d,\n\t0x0a8f, 0x0a91,\n\t0x0a93, 0x0aa8,\n\t0x0aaa, 0x0ab0,\n\t0x0ab2, 0x0ab3,\n\t0x0ab5, 0x0ab9,\n\t0x0abc, 0x0ac5,\n\t0x0ac7, 0x0ac9,\n\t0x0acb, 0x0acd,\n\t0x0ad0, 0x0ad0,\n\t0x0ae0, 0x0ae3,\n\t0x0ae6, 0x0aef,\n\t0x0b01, 0x0b03,\n\t0x0b05, 0x0b0c,\n\t0x0b0f, 0x0b10,\n\t0x0b13, 0x0b28,\n\t0x0b2a, 0x0b30,\n\t0x0b32, 0x0b33,\n\t0x0b35, 0x0b39,\n\t0x0b3c, 0x0b44,\n\t0x0b47, 0x0b48,\n\t0x0b4b, 0x0b4d,\n\t0x0b56, 0x0b57,\n\t0x0b5c, 0x0b5d,\n\t0x0b5f, 0x0b63,\n\t0x0b66, 0x0b6f,\n\t0x0b71, 0x0b71,\n\t0x0b82, 0x0b83,\n\t0x0b85, 0x0b8a,\n\t0x0b8e, 0x0b90,\n\t0x0b92, 0x0b95,\n\t0x0b99, 0x0b9a,\n\t0x0b9c, 0x0b9c,\n\t0x0b9e, 0x0b9f,\n\t0x0ba3, 0x0ba4,\n\t0x0ba8, 0x0baa,\n\t0x0bae, 0x0bb9,\n\t0x0bbe, 0x0bc2,\n\t0x0bc6, 0x0bc8,\n\t0x0bca, 0x0bcd,\n\t0x0bd0, 0x0bd0,\n\t0x0bd7, 0x0bd7,\n\t0x0be6, 0x0bef,\n\t0x0c01, 0x0c03,\n\t0x0c05, 0x0c0c,\n\t0x0c0e, 0x0c10,\n\t0x0c12, 0x0c28,\n\t0x0c2a, 0x0c33,\n\t0x0c35, 0x0c39,\n\t0x0c3d, 0x0c44,\n\t0x0c46, 0x0c48,\n\t0x0c4a, 0x0c4d,\n\t0x0c55, 0x0c56,\n\t0x0c58, 0x0c59,\n\t0x0c60, 0x0c63,\n\t0x0c66, 0x0c6f,\n\t0x0c82, 0x0c83,\n\t0x0c85, 0x0c8c,\n\t0x0c8e, 0x0c90,\n\t0x0c92, 0x0ca8,\n\t0x0caa, 0x0cb3,\n\t0x0cb5, 0x0cb9,\n\t0x0cbc, 0x0cc4,\n\t0x0cc6, 0x0cc8,\n\t0x0cca, 0x0ccd,\n\t0x0cd5, 0x0cd6,\n\t0x0cde, 0x0cde,\n\t0x0ce0, 0x0ce3,\n\t0x0ce6, 0x0cef,\n\t0x0cf1, 0x0cf2,\n\t0x0d02, 0x0d03,\n\t0x0d05, 0x0d0c,\n\t0x0d0e, 0x0d10,\n\t0x0d12, 0x0d3a,\n\t0x0d3d, 0x0d44,\n\t0x0d46, 0x0d48,\n\t0x0d4a, 0x0d4e,\n\t0x0d57, 0x0d57,\n\t0x0d60, 0x0d63,\n\t0x0d66, 0x0d6f,\n\t0x0d7a, 0x0d7f,\n\t0x0d82, 0x0d83,\n\t0x0d85, 0x0d96,\n\t0x0d9a, 0x0db1,\n\t0x0db3, 0x0dbb,\n\t0x0dbd, 0x0dbd,\n\t0x0dc0, 0x0dc6,\n\t0x0dca, 0x0dca,\n\t0x0dcf, 0x0dd4,\n\t0x0dd6, 0x0dd6,\n\t0x0dd8, 0x0ddf,\n\t0x0df2, 0x0df3,\n\t0x0e01, 0x0e3a,\n\t0x0e40, 0x0e4e,\n\t0x0e50, 0x0e59,\n\t0x0e81, 0x0e82,\n\t0x0e84, 0x0e84,\n\t0x0e87, 0x0e88,\n\t0x0e8a, 0x0e8a,\n\t0x0e8d, 0x0e8d,\n\t0x0e94, 0x0e97,\n\t0x0e99, 0x0e9f,\n\t0x0ea1, 0x0ea3,\n\t0x0ea5, 0x0ea5,\n\t0x0ea7, 0x0ea7,\n\t0x0eaa, 0x0eab,\n\t0x0ead, 0x0eb9,\n\t0x0ebb, 0x0ebd,\n\t0x0ec0, 0x0ec4,\n\t0x0ec6, 0x0ec6,\n\t0x0ec8, 0x0ecd,\n\t0x0ed0, 0x0ed9,\n\t0x0edc, 0x0edf,\n\t0x0f00, 0x0f00,\n\t0x0f18, 0x0f19,\n\t0x0f20, 0x0f29,\n\t0x0f35, 0x0f35,\n\t0x0f37, 0x0f37,\n\t0x0f39, 0x0f39,\n\t0x0f3e, 0x0f47,\n\t0x0f49, 0x0f6c,\n\t0x0f71, 0x0f84,\n\t0x0f86, 0x0f97,\n\t0x0f99, 0x0fbc,\n\t0x0fc6, 0x0fc6,\n\t0x1000, 0x1049,\n\t0x1050, 0x109d,\n\t0x10a0, 0x10c5,\n\t0x10c7, 0x10c7,\n\t0x10cd, 0x10cd,\n\t0x10d0, 0x10fa,\n\t0x10fc, 0x1248,\n\t0x124a, 0x124d,\n\t0x1250, 0x1256,\n\t0x1258, 0x1258,\n\t0x125a, 0x125d,\n\t0x1260, 0x1288,\n\t0x128a, 0x128d,\n\t0x1290, 0x12b0,\n\t0x12b2, 0x12b5,\n\t0x12b8, 0x12be,\n\t0x12c0, 0x12c0,\n\t0x12c2, 0x12c5,\n\t0x12c8, 0x12d6,\n\t0x12d8, 0x1310,\n\t0x1312, 0x1315,\n\t0x1318, 0x135a,\n\t0x135d, 0x135f,\n\t0x1380, 0x138f,\n\t0x13a0, 0x13f4,\n\t0x1401, 0x166c,\n\t0x166f, 0x167f,\n\t0x1681, 0x169a,\n\t0x16a0, 0x16ea,\n\t0x16ee, 0x16f0,\n\t0x1700, 0x170c,\n\t0x170e, 0x1714,\n\t0x1720, 0x1734,\n\t0x1740, 0x1753,\n\t0x1760, 0x176c,\n\t0x176e, 0x1770,\n\t0x1772, 0x1773,\n\t0x1780, 0x17d3,\n\t0x17d7, 0x17d7,\n\t0x17dc, 0x17dd,\n\t0x17e0, 0x17e9,\n\t0x180b, 0x180d,\n\t0x1810, 0x1819,\n\t0x1820, 0x1877,\n\t0x1880, 0x18aa,\n\t0x18b0, 0x18f5,\n\t0x1900, 0x191c,\n\t0x1920, 0x192b,\n\t0x1930, 0x193b,\n\t0x1946, 0x196d,\n\t0x1970, 0x1974,\n\t0x1980, 0x19ab,\n\t0x19b0, 0x19c9,\n\t0x19d0, 0x19d9,\n\t0x1a00, 0x1a1b,\n\t0x1a20, 0x1a5e,\n\t0x1a60, 0x1a7c,\n\t0x1a7f, 0x1a89,\n\t0x1a90, 0x1a99,\n\t0x1aa7, 0x1aa7,\n\t0x1b00, 0x1b4b,\n\t0x1b50, 0x1b59,\n\t0x1b6b, 0x1b73,\n\t0x1b80, 0x1bf3,\n\t0x1c00, 0x1c37,\n\t0x1c40, 0x1c49,\n\t0x1c4d, 0x1c7d,\n\t0x1cd0, 0x1cd2,\n\t0x1cd4, 0x1cf6,\n\t0x1d00, 0x1de6,\n\t0x1dfc, 0x1f15,\n\t0x1f18, 0x1f1d,\n\t0x1f20, 0x1f45,\n\t0x1f48, 0x1f4d,\n\t0x1f50, 0x1f57,\n\t0x1f59, 0x1f59,\n\t0x1f5b, 0x1f5b,\n\t0x1f5d, 0x1f5d,\n\t0x1f5f, 0x1f7d,\n\t0x1f80, 0x1fb4,\n\t0x1fb6, 0x1fbc,\n\t0x1fbe, 0x1fbe,\n\t0x1fc2, 0x1fc4,\n\t0x1fc6, 0x1fcc,\n\t0x1fd0, 0x1fd3,\n\t0x1fd6, 0x1fdb,\n\t0x1fe0, 0x1fec,\n\t0x1ff2, 0x1ff4,\n\t0x1ff6, 0x1ffc,\n\t0x203f, 0x2040,\n\t0x2054, 0x2054,\n\t0x2071, 0x2071,\n\t0x207f, 0x207f,\n\t0x2090, 0x209c,\n\t0x20d0, 0x20f0,\n\t0x2102, 0x2102,\n\t0x2107, 0x2107,\n\t0x210a, 0x2113,\n\t0x2115, 0x2115,\n\t0x2119, 0x211d,\n\t0x2124, 0x2124,\n\t0x2126, 0x2126,\n\t0x2128, 0x2128,\n\t0x212a, 0x212d,\n\t0x212f, 0x2139,\n\t0x213c, 0x213f,\n\t0x2145, 0x2149,\n\t0x214e, 0x214e,\n\t0x2160, 0x2188,\n\t0x24b6, 0x24e9,\n\t0x2c00, 0x2c2e,\n\t0x2c30, 0x2c5e,\n\t0x2c60, 0x2ce4,\n\t0x2ceb, 0x2cf3,\n\t0x2d00, 0x2d25,\n\t0x2d27, 0x2d27,\n\t0x2d2d, 0x2d2d,\n\t0x2d30, 0x2d67,\n\t0x2d6f, 0x2d6f,\n\t0x2d7f, 0x2d96,\n\t0x2da0, 0x2da6,\n\t0x2da8, 0x2dae,\n\t0x2db0, 0x2db6,\n\t0x2db8, 0x2dbe,\n\t0x2dc0, 0x2dc6,\n\t0x2dc8, 0x2dce,\n\t0x2dd0, 0x2dd6,\n\t0x2dd8, 0x2dde,\n\t0x2de0, 0x2dff,\n\t0x2e2f, 0x2e2f,\n\t0x3005, 0x3007,\n\t0x3021, 0x302f,\n\t0x3031, 0x3035,\n\t0x3038, 0x303c,\n\t0x3041, 0x3096,\n\t0x3099, 0x309a,\n\t0x309d, 0x309f,\n\t0x30a1, 0x30fa,\n\t0x30fc, 0x30ff,\n\t0x3105, 0x312d,\n\t0x3131, 0x318e,\n\t0x31a0, 0x31ba,\n\t0x31f0, 0x31ff,\n\t0x3400, 0x4db5,\n\t0x4e00, 0x9fcc,\n\t0xa000, 0xa48c,\n\t0xa4d0, 0xa4fd,\n\t0xa500, 0xa60c,\n\t0xa610, 0xa62b,\n\t0xa640, 0xa672,\n\t0xa674, 0xa67d,\n\t0xa67f, 0xa697,\n\t0xa69f, 0xa6f1,\n\t0xa717, 0xa71f,\n\t0xa722, 0xa788,\n\t0xa78b, 0xa78e,\n\t0xa790, 0xa793,\n\t0xa7a0, 0xa7aa,\n\t0xa7f8, 0xa827,\n\t0xa840, 0xa873,\n\t0xa880, 0xa8c4,\n\t0xa8d0, 0xa8d9,\n\t0xa8e0, 0xa8f7,\n\t0xa8fb, 0xa8fb,\n\t0xa900, 0xa92d,\n\t0xa930, 0xa953,\n\t0xa960, 0xa97c,\n\t0xa980, 0xa9c0,\n\t0xa9cf, 0xa9d9,\n\t0xaa00, 0xaa36,\n\t0xaa40, 0xaa4d,\n\t0xaa50, 0xaa59,\n\t0xaa60, 0xaa76,\n\t0xaa7a, 0xaa7b,\n\t0xaa80, 0xaac2,\n\t0xaadb, 0xaadd,\n\t0xaae0, 0xaaef,\n\t0xaaf2, 0xaaf6,\n\t0xab01, 0xab06,\n\t0xab09, 0xab0e,\n\t0xab11, 0xab16,\n\t0xab20, 0xab26,\n\t0xab28, 0xab2e,\n\t0xabc0, 0xabea,\n\t0xabec, 0xabed,\n\t0xabf0, 0xabf9,\n\t0xac00, 0xd7a3,\n\t0xd7b0, 0xd7c6,\n\t0xd7cb, 0xd7fb,\n\t0xf900, 0xfa6d,\n\t0xfa70, 0xfad9,\n\t0xfb00, 0xfb06,\n\t0xfb13, 0xfb17,\n\t0xfb1d, 0xfb28,\n\t0xfb2a, 0xfb36,\n\t0xfb38, 0xfb3c,\n\t0xfb3e, 0xfb3e,\n\t0xfb40, 0xfb41,\n\t0xfb43, 0xfb44,\n\t0xfb46, 0xfbb1,\n\t0xfbd3, 0xfd3d,\n\t0xfd50, 0xfd8f,\n\t0xfd92, 0xfdc7,\n\t0xfdf0, 0xfdfb,\n\t0xfe00, 0xfe0f,\n\t0xfe20, 0xfe26,\n\t0xfe33, 0xfe34,\n\t0xfe4d, 0xfe4f,\n\t0xfe70, 0xfe74,\n\t0xfe76, 0xfefc,\n\t0xff10, 0xff19,\n\t0xff21, 0xff3a,\n\t0xff3f, 0xff3f,\n\t0xff41, 0xff5a,\n\t0xff66, 0xffbe,\n\t0xffc2, 0xffc7,\n\t0xffca, 0xffcf,\n\t0xffd2, 0xffd7,\n\t0xffda, 0xffdc,\n\t0x10000, 0x1000b,\n\t0x1000d, 0x10026,\n\t0x10028, 0x1003a,\n\t0x1003c, 0x1003d,\n\t0x1003f, 0x1004d,\n\t0x10050, 0x1005d,\n\t0x10080, 0x100fa,\n\t0x10140, 0x10174,\n\t0x101fd, 0x101fd,\n\t0x10280, 0x1029c,\n\t0x102a0, 0x102d0,\n\t0x10300, 0x1031e,\n\t0x10330, 0x1034a,\n\t0x10380, 0x1039d,\n\t0x103a0, 0x103c3,\n\t0x103c8, 0x103cf,\n\t0x103d1, 0x103d5,\n\t0x10400, 0x1049d,\n\t0x104a0, 0x104a9,\n\t0x10800, 0x10805,\n\t0x10808, 0x10808,\n\t0x1080a, 0x10835,\n\t0x10837, 0x10838,\n\t0x1083c, 0x1083c,\n\t0x1083f, 0x10855,\n\t0x10900, 0x10915,\n\t0x10920, 0x10939,\n\t0x10980, 0x109b7,\n\t0x109be, 0x109bf,\n\t0x10a00, 0x10a03,\n\t0x10a05, 0x10a06,\n\t0x10a0c, 0x10a13,\n\t0x10a15, 0x10a17,\n\t0x10a19, 0x10a33,\n\t0x10a38, 0x10a3a,\n\t0x10a3f, 0x10a3f,\n\t0x10a60, 0x10a7c,\n\t0x10b00, 0x10b35,\n\t0x10b40, 0x10b55,\n\t0x10b60, 0x10b72,\n\t0x10c00, 0x10c48,\n\t0x11000, 0x11046,\n\t0x11066, 0x1106f,\n\t0x11080, 0x110ba,\n\t0x110d0, 0x110e8,\n\t0x110f0, 0x110f9,\n\t0x11100, 0x11134,\n\t0x11136, 0x1113f,\n\t0x11180, 0x111c4,\n\t0x111d0, 0x111d9,\n\t0x11680, 0x116b7,\n\t0x116c0, 0x116c9,\n\t0x12000, 0x1236e,\n\t0x12400, 0x12462,\n\t0x13000, 0x1342e,\n\t0x16800, 0x16a38,\n\t0x16f00, 0x16f44,\n\t0x16f50, 0x16f7e,\n\t0x16f8f, 0x16f9f,\n\t0x1b000, 0x1b001,\n\t0x1d165, 0x1d169,\n\t0x1d16d, 0x1d172,\n\t0x1d17b, 0x1d182,\n\t0x1d185, 0x1d18b,\n\t0x1d1aa, 0x1d1ad,\n\t0x1d242, 0x1d244,\n\t0x1d400, 0x1d454,\n\t0x1d456, 0x1d49c,\n\t0x1d49e, 0x1d49f,\n\t0x1d4a2, 0x1d4a2,\n\t0x1d4a5, 0x1d4a6,\n\t0x1d4a9, 0x1d4ac,\n\t0x1d4ae, 0x1d4b9,\n\t0x1d4bb, 0x1d4bb,\n\t0x1d4bd, 0x1d4c3,\n\t0x1d4c5, 0x1d505,\n\t0x1d507, 0x1d50a,\n\t0x1d50d, 0x1d514,\n\t0x1d516, 0x1d51c,\n\t0x1d51e, 0x1d539,\n\t0x1d53b, 0x1d53e,\n\t0x1d540, 0x1d544,\n\t0x1d546, 0x1d546,\n\t0x1d54a, 0x1d550,\n\t0x1d552, 0x1d6a5,\n\t0x1d6a8, 0x1d6c0,\n\t0x1d6c2, 0x1d6da,\n\t0x1d6dc, 0x1d6fa,\n\t0x1d6fc, 0x1d714,\n\t0x1d716, 0x1d734,\n\t0x1d736, 0x1d74e,\n\t0x1d750, 0x1d76e,\n\t0x1d770, 0x1d788,\n\t0x1d78a, 0x1d7a8,\n\t0x1d7aa, 0x1d7c2,\n\t0x1d7c4, 0x1d7cb,\n\t0x1d7ce, 0x1d7ff,\n\t0x1ee00, 0x1ee03,\n\t0x1ee05, 0x1ee1f,\n\t0x1ee21, 0x1ee22,\n\t0x1ee24, 0x1ee24,\n\t0x1ee27, 0x1ee27,\n\t0x1ee29, 0x1ee32,\n\t0x1ee34, 0x1ee37,\n\t0x1ee39, 0x1ee39,\n\t0x1ee3b, 0x1ee3b,\n\t0x1ee42, 0x1ee42,\n\t0x1ee47, 0x1ee47,\n\t0x1ee49, 0x1ee49,\n\t0x1ee4b, 0x1ee4b,\n\t0x1ee4d, 0x1ee4f,\n\t0x1ee51, 0x1ee52,\n\t0x1ee54, 0x1ee54,\n\t0x1ee57, 0x1ee57,\n\t0x1ee59, 0x1ee59,\n\t0x1ee5b, 0x1ee5b,\n\t0x1ee5d, 0x1ee5d,\n\t0x1ee5f, 0x1ee5f,\n\t0x1ee61, 0x1ee62,\n\t0x1ee64, 0x1ee64,\n\t0x1ee67, 0x1ee6a,\n\t0x1ee6c, 0x1ee72,\n\t0x1ee74, 0x1ee77,\n\t0x1ee79, 0x1ee7c,\n\t0x1ee7e, 0x1ee7e,\n\t0x1ee80, 0x1ee89,\n\t0x1ee8b, 0x1ee9b,\n\t0x1eea1, 0x1eea3,\n\t0x1eea5, 0x1eea9,\n\t0x1eeab, 0x1eebb,\n\t0x20000, 0x2a6d6,\n\t0x2a700, 0x2b734,\n\t0x2b740, 0x2b81d,\n\t0x2f800, 0x2fa1d,\n\t0xe0100, 0xe01ef,\n}; /* CR_Word */\n\n/* 'Alnum': [[:Alnum:]] */\nstatic const OnigCodePoint CR_Alnum[] = {\n\t566,\n\t0x0030, 0x0039,\n\t0x0041, 0x005a,\n\t0x0061, 0x007a,\n\t0x00aa, 0x00aa,\n\t0x00b5, 0x00b5,\n\t0x00ba, 0x00ba,\n\t0x00c0, 0x00d6,\n\t0x00d8, 0x00f6,\n\t0x00f8, 0x02c1,\n\t0x02c6, 0x02d1,\n\t0x02e0, 0x02e4,\n\t0x02ec, 0x02ec,\n\t0x02ee, 0x02ee,\n\t0x0345, 0x0345,\n\t0x0370, 0x0374,\n\t0x0376, 0x0377,\n\t0x037a, 0x037d,\n\t0x0386, 0x0386,\n\t0x0388, 0x038a,\n\t0x038c, 0x038c,\n\t0x038e, 0x03a1,\n\t0x03a3, 0x03f5,\n\t0x03f7, 0x0481,\n\t0x048a, 0x0527,\n\t0x0531, 0x0556,\n\t0x0559, 0x0559,\n\t0x0561, 0x0587,\n\t0x05b0, 0x05bd,\n\t0x05bf, 0x05bf,\n\t0x05c1, 0x05c2,\n\t0x05c4, 0x05c5,\n\t0x05c7, 0x05c7,\n\t0x05d0, 0x05ea,\n\t0x05f0, 0x05f2,\n\t0x0610, 0x061a,\n\t0x0620, 0x0657,\n\t0x0659, 0x0669,\n\t0x066e, 0x06d3,\n\t0x06d5, 0x06dc,\n\t0x06e1, 0x06e8,\n\t0x06ed, 0x06fc,\n\t0x06ff, 0x06ff,\n\t0x0710, 0x073f,\n\t0x074d, 0x07b1,\n\t0x07c0, 0x07ea,\n\t0x07f4, 0x07f5,\n\t0x07fa, 0x07fa,\n\t0x0800, 0x0817,\n\t0x081a, 0x082c,\n\t0x0840, 0x0858,\n\t0x08a0, 0x08a0,\n\t0x08a2, 0x08ac,\n\t0x08e4, 0x08e9,\n\t0x08f0, 0x08fe,\n\t0x0900, 0x093b,\n\t0x093d, 0x094c,\n\t0x094e, 0x0950,\n\t0x0955, 0x0963,\n\t0x0966, 0x096f,\n\t0x0971, 0x0977,\n\t0x0979, 0x097f,\n\t0x0981, 0x0983,\n\t0x0985, 0x098c,\n\t0x098f, 0x0990,\n\t0x0993, 0x09a8,\n\t0x09aa, 0x09b0,\n\t0x09b2, 0x09b2,\n\t0x09b6, 0x09b9,\n\t0x09bd, 0x09c4,\n\t0x09c7, 0x09c8,\n\t0x09cb, 0x09cc,\n\t0x09ce, 0x09ce,\n\t0x09d7, 0x09d7,\n\t0x09dc, 0x09dd,\n\t0x09df, 0x09e3,\n\t0x09e6, 0x09f1,\n\t0x0a01, 0x0a03,\n\t0x0a05, 0x0a0a,\n\t0x0a0f, 0x0a10,\n\t0x0a13, 0x0a28,\n\t0x0a2a, 0x0a30,\n\t0x0a32, 0x0a33,\n\t0x0a35, 0x0a36,\n\t0x0a38, 0x0a39,\n\t0x0a3e, 0x0a42,\n\t0x0a47, 0x0a48,\n\t0x0a4b, 0x0a4c,\n\t0x0a51, 0x0a51,\n\t0x0a59, 0x0a5c,\n\t0x0a5e, 0x0a5e,\n\t0x0a66, 0x0a75,\n\t0x0a81, 0x0a83,\n\t0x0a85, 0x0a8d,\n\t0x0a8f, 0x0a91,\n\t0x0a93, 0x0aa8,\n\t0x0aaa, 0x0ab0,\n\t0x0ab2, 0x0ab3,\n\t0x0ab5, 0x0ab9,\n\t0x0abd, 0x0ac5,\n\t0x0ac7, 0x0ac9,\n\t0x0acb, 0x0acc,\n\t0x0ad0, 0x0ad0,\n\t0x0ae0, 0x0ae3,\n\t0x0ae6, 0x0aef,\n\t0x0b01, 0x0b03,\n\t0x0b05, 0x0b0c,\n\t0x0b0f, 0x0b10,\n\t0x0b13, 0x0b28,\n\t0x0b2a, 0x0b30,\n\t0x0b32, 0x0b33,\n\t0x0b35, 0x0b39,\n\t0x0b3d, 0x0b44,\n\t0x0b47, 0x0b48,\n\t0x0b4b, 0x0b4c,\n\t0x0b56, 0x0b57,\n\t0x0b5c, 0x0b5d,\n\t0x0b5f, 0x0b63,\n\t0x0b66, 0x0b6f,\n\t0x0b71, 0x0b71,\n\t0x0b82, 0x0b83,\n\t0x0b85, 0x0b8a,\n\t0x0b8e, 0x0b90,\n\t0x0b92, 0x0b95,\n\t0x0b99, 0x0b9a,\n\t0x0b9c, 0x0b9c,\n\t0x0b9e, 0x0b9f,\n\t0x0ba3, 0x0ba4,\n\t0x0ba8, 0x0baa,\n\t0x0bae, 0x0bb9,\n\t0x0bbe, 0x0bc2,\n\t0x0bc6, 0x0bc8,\n\t0x0bca, 0x0bcc,\n\t0x0bd0, 0x0bd0,\n\t0x0bd7, 0x0bd7,\n\t0x0be6, 0x0bef,\n\t0x0c01, 0x0c03,\n\t0x0c05, 0x0c0c,\n\t0x0c0e, 0x0c10,\n\t0x0c12, 0x0c28,\n\t0x0c2a, 0x0c33,\n\t0x0c35, 0x0c39,\n\t0x0c3d, 0x0c44,\n\t0x0c46, 0x0c48,\n\t0x0c4a, 0x0c4c,\n\t0x0c55, 0x0c56,\n\t0x0c58, 0x0c59,\n\t0x0c60, 0x0c63,\n\t0x0c66, 0x0c6f,\n\t0x0c82, 0x0c83,\n\t0x0c85, 0x0c8c,\n\t0x0c8e, 0x0c90,\n\t0x0c92, 0x0ca8,\n\t0x0caa, 0x0cb3,\n\t0x0cb5, 0x0cb9,\n\t0x0cbd, 0x0cc4,\n\t0x0cc6, 0x0cc8,\n\t0x0cca, 0x0ccc,\n\t0x0cd5, 0x0cd6,\n\t0x0cde, 0x0cde,\n\t0x0ce0, 0x0ce3,\n\t0x0ce6, 0x0cef,\n\t0x0cf1, 0x0cf2,\n\t0x0d02, 0x0d03,\n\t0x0d05, 0x0d0c,\n\t0x0d0e, 0x0d10,\n\t0x0d12, 0x0d3a,\n\t0x0d3d, 0x0d44,\n\t0x0d46, 0x0d48,\n\t0x0d4a, 0x0d4c,\n\t0x0d4e, 0x0d4e,\n\t0x0d57, 0x0d57,\n\t0x0d60, 0x0d63,\n\t0x0d66, 0x0d6f,\n\t0x0d7a, 0x0d7f,\n\t0x0d82, 0x0d83,\n\t0x0d85, 0x0d96,\n\t0x0d9a, 0x0db1,\n\t0x0db3, 0x0dbb,\n\t0x0dbd, 0x0dbd,\n\t0x0dc0, 0x0dc6,\n\t0x0dcf, 0x0dd4,\n\t0x0dd6, 0x0dd6,\n\t0x0dd8, 0x0ddf,\n\t0x0df2, 0x0df3,\n\t0x0e01, 0x0e3a,\n\t0x0e40, 0x0e46,\n\t0x0e4d, 0x0e4d,\n\t0x0e50, 0x0e59,\n\t0x0e81, 0x0e82,\n\t0x0e84, 0x0e84,\n\t0x0e87, 0x0e88,\n\t0x0e8a, 0x0e8a,\n\t0x0e8d, 0x0e8d,\n\t0x0e94, 0x0e97,\n\t0x0e99, 0x0e9f,\n\t0x0ea1, 0x0ea3,\n\t0x0ea5, 0x0ea5,\n\t0x0ea7, 0x0ea7,\n\t0x0eaa, 0x0eab,\n\t0x0ead, 0x0eb9,\n\t0x0ebb, 0x0ebd,\n\t0x0ec0, 0x0ec4,\n\t0x0ec6, 0x0ec6,\n\t0x0ecd, 0x0ecd,\n\t0x0ed0, 0x0ed9,\n\t0x0edc, 0x0edf,\n\t0x0f00, 0x0f00,\n\t0x0f20, 0x0f29,\n\t0x0f40, 0x0f47,\n\t0x0f49, 0x0f6c,\n\t0x0f71, 0x0f81,\n\t0x0f88, 0x0f97,\n\t0x0f99, 0x0fbc,\n\t0x1000, 0x1036,\n\t0x1038, 0x1038,\n\t0x103b, 0x1049,\n\t0x1050, 0x1062,\n\t0x1065, 0x1068,\n\t0x106e, 0x1086,\n\t0x108e, 0x108e,\n\t0x1090, 0x1099,\n\t0x109c, 0x109d,\n\t0x10a0, 0x10c5,\n\t0x10c7, 0x10c7,\n\t0x10cd, 0x10cd,\n\t0x10d0, 0x10fa,\n\t0x10fc, 0x1248,\n\t0x124a, 0x124d,\n\t0x1250, 0x1256,\n\t0x1258, 0x1258,\n\t0x125a, 0x125d,\n\t0x1260, 0x1288,\n\t0x128a, 0x128d,\n\t0x1290, 0x12b0,\n\t0x12b2, 0x12b5,\n\t0x12b8, 0x12be,\n\t0x12c0, 0x12c0,\n\t0x12c2, 0x12c5,\n\t0x12c8, 0x12d6,\n\t0x12d8, 0x1310,\n\t0x1312, 0x1315,\n\t0x1318, 0x135a,\n\t0x135f, 0x135f,\n\t0x1380, 0x138f,\n\t0x13a0, 0x13f4,\n\t0x1401, 0x166c,\n\t0x166f, 0x167f,\n\t0x1681, 0x169a,\n\t0x16a0, 0x16ea,\n\t0x16ee, 0x16f0,\n\t0x1700, 0x170c,\n\t0x170e, 0x1713,\n\t0x1720, 0x1733,\n\t0x1740, 0x1753,\n\t0x1760, 0x176c,\n\t0x176e, 0x1770,\n\t0x1772, 0x1773,\n\t0x1780, 0x17b3,\n\t0x17b6, 0x17c8,\n\t0x17d7, 0x17d7,\n\t0x17dc, 0x17dc,\n\t0x17e0, 0x17e9,\n\t0x1810, 0x1819,\n\t0x1820, 0x1877,\n\t0x1880, 0x18aa,\n\t0x18b0, 0x18f5,\n\t0x1900, 0x191c,\n\t0x1920, 0x192b,\n\t0x1930, 0x1938,\n\t0x1946, 0x196d,\n\t0x1970, 0x1974,\n\t0x1980, 0x19ab,\n\t0x19b0, 0x19c9,\n\t0x19d0, 0x19d9,\n\t0x1a00, 0x1a1b,\n\t0x1a20, 0x1a5e,\n\t0x1a61, 0x1a74,\n\t0x1a80, 0x1a89,\n\t0x1a90, 0x1a99,\n\t0x1aa7, 0x1aa7,\n\t0x1b00, 0x1b33,\n\t0x1b35, 0x1b43,\n\t0x1b45, 0x1b4b,\n\t0x1b50, 0x1b59,\n\t0x1b80, 0x1ba9,\n\t0x1bac, 0x1be5,\n\t0x1be7, 0x1bf1,\n\t0x1c00, 0x1c35,\n\t0x1c40, 0x1c49,\n\t0x1c4d, 0x1c7d,\n\t0x1ce9, 0x1cec,\n\t0x1cee, 0x1cf3,\n\t0x1cf5, 0x1cf6,\n\t0x1d00, 0x1dbf,\n\t0x1e00, 0x1f15,\n\t0x1f18, 0x1f1d,\n\t0x1f20, 0x1f45,\n\t0x1f48, 0x1f4d,\n\t0x1f50, 0x1f57,\n\t0x1f59, 0x1f59,\n\t0x1f5b, 0x1f5b,\n\t0x1f5d, 0x1f5d,\n\t0x1f5f, 0x1f7d,\n\t0x1f80, 0x1fb4,\n\t0x1fb6, 0x1fbc,\n\t0x1fbe, 0x1fbe,\n\t0x1fc2, 0x1fc4,\n\t0x1fc6, 0x1fcc,\n\t0x1fd0, 0x1fd3,\n\t0x1fd6, 0x1fdb,\n\t0x1fe0, 0x1fec,\n\t0x1ff2, 0x1ff4,\n\t0x1ff6, 0x1ffc,\n\t0x2071, 0x2071,\n\t0x207f, 0x207f,\n\t0x2090, 0x209c,\n\t0x2102, 0x2102,\n\t0x2107, 0x2107,\n\t0x210a, 0x2113,\n\t0x2115, 0x2115,\n\t0x2119, 0x211d,\n\t0x2124, 0x2124,\n\t0x2126, 0x2126,\n\t0x2128, 0x2128,\n\t0x212a, 0x212d,\n\t0x212f, 0x2139,\n\t0x213c, 0x213f,\n\t0x2145, 0x2149,\n\t0x214e, 0x214e,\n\t0x2160, 0x2188,\n\t0x24b6, 0x24e9,\n\t0x2c00, 0x2c2e,\n\t0x2c30, 0x2c5e,\n\t0x2c60, 0x2ce4,\n\t0x2ceb, 0x2cee,\n\t0x2cf2, 0x2cf3,\n\t0x2d00, 0x2d25,\n\t0x2d27, 0x2d27,\n\t0x2d2d, 0x2d2d,\n\t0x2d30, 0x2d67,\n\t0x2d6f, 0x2d6f,\n\t0x2d80, 0x2d96,\n\t0x2da0, 0x2da6,\n\t0x2da8, 0x2dae,\n\t0x2db0, 0x2db6,\n\t0x2db8, 0x2dbe,\n\t0x2dc0, 0x2dc6,\n\t0x2dc8, 0x2dce,\n\t0x2dd0, 0x2dd6,\n\t0x2dd8, 0x2dde,\n\t0x2de0, 0x2dff,\n\t0x2e2f, 0x2e2f,\n\t0x3005, 0x3007,\n\t0x3021, 0x3029,\n\t0x3031, 0x3035,\n\t0x3038, 0x303c,\n\t0x3041, 0x3096,\n\t0x309d, 0x309f,\n\t0x30a1, 0x30fa,\n\t0x30fc, 0x30ff,\n\t0x3105, 0x312d,\n\t0x3131, 0x318e,\n\t0x31a0, 0x31ba,\n\t0x31f0, 0x31ff,\n\t0x3400, 0x4db5,\n\t0x4e00, 0x9fcc,\n\t0xa000, 0xa48c,\n\t0xa4d0, 0xa4fd,\n\t0xa500, 0xa60c,\n\t0xa610, 0xa62b,\n\t0xa640, 0xa66e,\n\t0xa674, 0xa67b,\n\t0xa67f, 0xa697,\n\t0xa69f, 0xa6ef,\n\t0xa717, 0xa71f,\n\t0xa722, 0xa788,\n\t0xa78b, 0xa78e,\n\t0xa790, 0xa793,\n\t0xa7a0, 0xa7aa,\n\t0xa7f8, 0xa801,\n\t0xa803, 0xa805,\n\t0xa807, 0xa80a,\n\t0xa80c, 0xa827,\n\t0xa840, 0xa873,\n\t0xa880, 0xa8c3,\n\t0xa8d0, 0xa8d9,\n\t0xa8f2, 0xa8f7,\n\t0xa8fb, 0xa8fb,\n\t0xa900, 0xa92a,\n\t0xa930, 0xa952,\n\t0xa960, 0xa97c,\n\t0xa980, 0xa9b2,\n\t0xa9b4, 0xa9bf,\n\t0xa9cf, 0xa9d9,\n\t0xaa00, 0xaa36,\n\t0xaa40, 0xaa4d,\n\t0xaa50, 0xaa59,\n\t0xaa60, 0xaa76,\n\t0xaa7a, 0xaa7a,\n\t0xaa80, 0xaabe,\n\t0xaac0, 0xaac0,\n\t0xaac2, 0xaac2,\n\t0xaadb, 0xaadd,\n\t0xaae0, 0xaaef,\n\t0xaaf2, 0xaaf5,\n\t0xab01, 0xab06,\n\t0xab09, 0xab0e,\n\t0xab11, 0xab16,\n\t0xab20, 0xab26,\n\t0xab28, 0xab2e,\n\t0xabc0, 0xabea,\n\t0xabf0, 0xabf9,\n\t0xac00, 0xd7a3,\n\t0xd7b0, 0xd7c6,\n\t0xd7cb, 0xd7fb,\n\t0xf900, 0xfa6d,\n\t0xfa70, 0xfad9,\n\t0xfb00, 0xfb06,\n\t0xfb13, 0xfb17,\n\t0xfb1d, 0xfb28,\n\t0xfb2a, 0xfb36,\n\t0xfb38, 0xfb3c,\n\t0xfb3e, 0xfb3e,\n\t0xfb40, 0xfb41,\n\t0xfb43, 0xfb44,\n\t0xfb46, 0xfbb1,\n\t0xfbd3, 0xfd3d,\n\t0xfd50, 0xfd8f,\n\t0xfd92, 0xfdc7,\n\t0xfdf0, 0xfdfb,\n\t0xfe70, 0xfe74,\n\t0xfe76, 0xfefc,\n\t0xff10, 0xff19,\n\t0xff21, 0xff3a,\n\t0xff41, 0xff5a,\n\t0xff66, 0xffbe,\n\t0xffc2, 0xffc7,\n\t0xffca, 0xffcf,\n\t0xffd2, 0xffd7,\n\t0xffda, 0xffdc,\n\t0x10000, 0x1000b,\n\t0x1000d, 0x10026,\n\t0x10028, 0x1003a,\n\t0x1003c, 0x1003d,\n\t0x1003f, 0x1004d,\n\t0x10050, 0x1005d,\n\t0x10080, 0x100fa,\n\t0x10140, 0x10174,\n\t0x10280, 0x1029c,\n\t0x102a0, 0x102d0,\n\t0x10300, 0x1031e,\n\t0x10330, 0x1034a,\n\t0x10380, 0x1039d,\n\t0x103a0, 0x103c3,\n\t0x103c8, 0x103cf,\n\t0x103d1, 0x103d5,\n\t0x10400, 0x1049d,\n\t0x104a0, 0x104a9,\n\t0x10800, 0x10805,\n\t0x10808, 0x10808,\n\t0x1080a, 0x10835,\n\t0x10837, 0x10838,\n\t0x1083c, 0x1083c,\n\t0x1083f, 0x10855,\n\t0x10900, 0x10915,\n\t0x10920, 0x10939,\n\t0x10980, 0x109b7,\n\t0x109be, 0x109bf,\n\t0x10a00, 0x10a03,\n\t0x10a05, 0x10a06,\n\t0x10a0c, 0x10a13,\n\t0x10a15, 0x10a17,\n\t0x10a19, 0x10a33,\n\t0x10a60, 0x10a7c,\n\t0x10b00, 0x10b35,\n\t0x10b40, 0x10b55,\n\t0x10b60, 0x10b72,\n\t0x10c00, 0x10c48,\n\t0x11000, 0x11045,\n\t0x11066, 0x1106f,\n\t0x11082, 0x110b8,\n\t0x110d0, 0x110e8,\n\t0x110f0, 0x110f9,\n\t0x11100, 0x11132,\n\t0x11136, 0x1113f,\n\t0x11180, 0x111bf,\n\t0x111c1, 0x111c4,\n\t0x111d0, 0x111d9,\n\t0x11680, 0x116b5,\n\t0x116c0, 0x116c9,\n\t0x12000, 0x1236e,\n\t0x12400, 0x12462,\n\t0x13000, 0x1342e,\n\t0x16800, 0x16a38,\n\t0x16f00, 0x16f44,\n\t0x16f50, 0x16f7e,\n\t0x16f93, 0x16f9f,\n\t0x1b000, 0x1b001,\n\t0x1d400, 0x1d454,\n\t0x1d456, 0x1d49c,\n\t0x1d49e, 0x1d49f,\n\t0x1d4a2, 0x1d4a2,\n\t0x1d4a5, 0x1d4a6,\n\t0x1d4a9, 0x1d4ac,\n\t0x1d4ae, 0x1d4b9,\n\t0x1d4bb, 0x1d4bb,\n\t0x1d4bd, 0x1d4c3,\n\t0x1d4c5, 0x1d505,\n\t0x1d507, 0x1d50a,\n\t0x1d50d, 0x1d514,\n\t0x1d516, 0x1d51c,\n\t0x1d51e, 0x1d539,\n\t0x1d53b, 0x1d53e,\n\t0x1d540, 0x1d544,\n\t0x1d546, 0x1d546,\n\t0x1d54a, 0x1d550,\n\t0x1d552, 0x1d6a5,\n\t0x1d6a8, 0x1d6c0,\n\t0x1d6c2, 0x1d6da,\n\t0x1d6dc, 0x1d6fa,\n\t0x1d6fc, 0x1d714,\n\t0x1d716, 0x1d734,\n\t0x1d736, 0x1d74e,\n\t0x1d750, 0x1d76e,\n\t0x1d770, 0x1d788,\n\t0x1d78a, 0x1d7a8,\n\t0x1d7aa, 0x1d7c2,\n\t0x1d7c4, 0x1d7cb,\n\t0x1d7ce, 0x1d7ff,\n\t0x1ee00, 0x1ee03,\n\t0x1ee05, 0x1ee1f,\n\t0x1ee21, 0x1ee22,\n\t0x1ee24, 0x1ee24,\n\t0x1ee27, 0x1ee27,\n\t0x1ee29, 0x1ee32,\n\t0x1ee34, 0x1ee37,\n\t0x1ee39, 0x1ee39,\n\t0x1ee3b, 0x1ee3b,\n\t0x1ee42, 0x1ee42,\n\t0x1ee47, 0x1ee47,\n\t0x1ee49, 0x1ee49,\n\t0x1ee4b, 0x1ee4b,\n\t0x1ee4d, 0x1ee4f,\n\t0x1ee51, 0x1ee52,\n\t0x1ee54, 0x1ee54,\n\t0x1ee57, 0x1ee57,\n\t0x1ee59, 0x1ee59,\n\t0x1ee5b, 0x1ee5b,\n\t0x1ee5d, 0x1ee5d,\n\t0x1ee5f, 0x1ee5f,\n\t0x1ee61, 0x1ee62,\n\t0x1ee64, 0x1ee64,\n\t0x1ee67, 0x1ee6a,\n\t0x1ee6c, 0x1ee72,\n\t0x1ee74, 0x1ee77,\n\t0x1ee79, 0x1ee7c,\n\t0x1ee7e, 0x1ee7e,\n\t0x1ee80, 0x1ee89,\n\t0x1ee8b, 0x1ee9b,\n\t0x1eea1, 0x1eea3,\n\t0x1eea5, 0x1eea9,\n\t0x1eeab, 0x1eebb,\n\t0x20000, 0x2a6d6,\n\t0x2a700, 0x2b734,\n\t0x2b740, 0x2b81d,\n\t0x2f800, 0x2fa1d,\n}; /* CR_Alnum */\n\n/* 'ASCII': [[:ASCII:]] */\nstatic const OnigCodePoint CR_ASCII[] = {\n\t1,\n\t0x0000, 0x007f,\n}; /* CR_ASCII */\n\n#ifdef USE_UNICODE_PROPERTIES\n/* 'Any': - */\nstatic const OnigCodePoint CR_Any[] = {\n\t1,\n\t0x0000, 0x10ffff,\n}; /* CR_Any */\n\n/* 'Assigned': - */\nstatic const OnigCodePoint CR_Assigned[] = {\n\t539,\n\t0x0000, 0x0377,\n\t0x037a, 0x037e,\n\t0x0384, 0x038a,\n\t0x038c, 0x038c,\n\t0x038e, 0x03a1,\n\t0x03a3, 0x0527,\n\t0x0531, 0x0556,\n\t0x0559, 0x055f,\n\t0x0561, 0x0587,\n\t0x0589, 0x058a,\n\t0x058f, 0x058f,\n\t0x0591, 0x05c7,\n\t0x05d0, 0x05ea,\n\t0x05f0, 0x05f4,\n\t0x0600, 0x0604,\n\t0x0606, 0x061b,\n\t0x061e, 0x070d,\n\t0x070f, 0x074a,\n\t0x074d, 0x07b1,\n\t0x07c0, 0x07fa,\n\t0x0800, 0x082d,\n\t0x0830, 0x083e,\n\t0x0840, 0x085b,\n\t0x085e, 0x085e,\n\t0x08a0, 0x08a0,\n\t0x08a2, 0x08ac,\n\t0x08e4, 0x08fe,\n\t0x0900, 0x0977,\n\t0x0979, 0x097f,\n\t0x0981, 0x0983,\n\t0x0985, 0x098c,\n\t0x098f, 0x0990,\n\t0x0993, 0x09a8,\n\t0x09aa, 0x09b0,\n\t0x09b2, 0x09b2,\n\t0x09b6, 0x09b9,\n\t0x09bc, 0x09c4,\n\t0x09c7, 0x09c8,\n\t0x09cb, 0x09ce,\n\t0x09d7, 0x09d7,\n\t0x09dc, 0x09dd,\n\t0x09df, 0x09e3,\n\t0x09e6, 0x09fb,\n\t0x0a01, 0x0a03,\n\t0x0a05, 0x0a0a,\n\t0x0a0f, 0x0a10,\n\t0x0a13, 0x0a28,\n\t0x0a2a, 0x0a30,\n\t0x0a32, 0x0a33,\n\t0x0a35, 0x0a36,\n\t0x0a38, 0x0a39,\n\t0x0a3c, 0x0a3c,\n\t0x0a3e, 0x0a42,\n\t0x0a47, 0x0a48,\n\t0x0a4b, 0x0a4d,\n\t0x0a51, 0x0a51,\n\t0x0a59, 0x0a5c,\n\t0x0a5e, 0x0a5e,\n\t0x0a66, 0x0a75,\n\t0x0a81, 0x0a83,\n\t0x0a85, 0x0a8d,\n\t0x0a8f, 0x0a91,\n\t0x0a93, 0x0aa8,\n\t0x0aaa, 0x0ab0,\n\t0x0ab2, 0x0ab3,\n\t0x0ab5, 0x0ab9,\n\t0x0abc, 0x0ac5,\n\t0x0ac7, 0x0ac9,\n\t0x0acb, 0x0acd,\n\t0x0ad0, 0x0ad0,\n\t0x0ae0, 0x0ae3,\n\t0x0ae6, 0x0af1,\n\t0x0b01, 0x0b03,\n\t0x0b05, 0x0b0c,\n\t0x0b0f, 0x0b10,\n\t0x0b13, 0x0b28,\n\t0x0b2a, 0x0b30,\n\t0x0b32, 0x0b33,\n\t0x0b35, 0x0b39,\n\t0x0b3c, 0x0b44,\n\t0x0b47, 0x0b48,\n\t0x0b4b, 0x0b4d,\n\t0x0b56, 0x0b57,\n\t0x0b5c, 0x0b5d,\n\t0x0b5f, 0x0b63,\n\t0x0b66, 0x0b77,\n\t0x0b82, 0x0b83,\n\t0x0b85, 0x0b8a,\n\t0x0b8e, 0x0b90,\n\t0x0b92, 0x0b95,\n\t0x0b99, 0x0b9a,\n\t0x0b9c, 0x0b9c,\n\t0x0b9e, 0x0b9f,\n\t0x0ba3, 0x0ba4,\n\t0x0ba8, 0x0baa,\n\t0x0bae, 0x0bb9,\n\t0x0bbe, 0x0bc2,\n\t0x0bc6, 0x0bc8,\n\t0x0bca, 0x0bcd,\n\t0x0bd0, 0x0bd0,\n\t0x0bd7, 0x0bd7,\n\t0x0be6, 0x0bfa,\n\t0x0c01, 0x0c03,\n\t0x0c05, 0x0c0c,\n\t0x0c0e, 0x0c10,\n\t0x0c12, 0x0c28,\n\t0x0c2a, 0x0c33,\n\t0x0c35, 0x0c39,\n\t0x0c3d, 0x0c44,\n\t0x0c46, 0x0c48,\n\t0x0c4a, 0x0c4d,\n\t0x0c55, 0x0c56,\n\t0x0c58, 0x0c59,\n\t0x0c60, 0x0c63,\n\t0x0c66, 0x0c6f,\n\t0x0c78, 0x0c7f,\n\t0x0c82, 0x0c83,\n\t0x0c85, 0x0c8c,\n\t0x0c8e, 0x0c90,\n\t0x0c92, 0x0ca8,\n\t0x0caa, 0x0cb3,\n\t0x0cb5, 0x0cb9,\n\t0x0cbc, 0x0cc4,\n\t0x0cc6, 0x0cc8,\n\t0x0cca, 0x0ccd,\n\t0x0cd5, 0x0cd6,\n\t0x0cde, 0x0cde,\n\t0x0ce0, 0x0ce3,\n\t0x0ce6, 0x0cef,\n\t0x0cf1, 0x0cf2,\n\t0x0d02, 0x0d03,\n\t0x0d05, 0x0d0c,\n\t0x0d0e, 0x0d10,\n\t0x0d12, 0x0d3a,\n\t0x0d3d, 0x0d44,\n\t0x0d46, 0x0d48,\n\t0x0d4a, 0x0d4e,\n\t0x0d57, 0x0d57,\n\t0x0d60, 0x0d63,\n\t0x0d66, 0x0d75,\n\t0x0d79, 0x0d7f,\n\t0x0d82, 0x0d83,\n\t0x0d85, 0x0d96,\n\t0x0d9a, 0x0db1,\n\t0x0db3, 0x0dbb,\n\t0x0dbd, 0x0dbd,\n\t0x0dc0, 0x0dc6,\n\t0x0dca, 0x0dca,\n\t0x0dcf, 0x0dd4,\n\t0x0dd6, 0x0dd6,\n\t0x0dd8, 0x0ddf,\n\t0x0df2, 0x0df4,\n\t0x0e01, 0x0e3a,\n\t0x0e3f, 0x0e5b,\n\t0x0e81, 0x0e82,\n\t0x0e84, 0x0e84,\n\t0x0e87, 0x0e88,\n\t0x0e8a, 0x0e8a,\n\t0x0e8d, 0x0e8d,\n\t0x0e94, 0x0e97,\n\t0x0e99, 0x0e9f,\n\t0x0ea1, 0x0ea3,\n\t0x0ea5, 0x0ea5,\n\t0x0ea7, 0x0ea7,\n\t0x0eaa, 0x0eab,\n\t0x0ead, 0x0eb9,\n\t0x0ebb, 0x0ebd,\n\t0x0ec0, 0x0ec4,\n\t0x0ec6, 0x0ec6,\n\t0x0ec8, 0x0ecd,\n\t0x0ed0, 0x0ed9,\n\t0x0edc, 0x0edf,\n\t0x0f00, 0x0f47,\n\t0x0f49, 0x0f6c,\n\t0x0f71, 0x0f97,\n\t0x0f99, 0x0fbc,\n\t0x0fbe, 0x0fcc,\n\t0x0fce, 0x0fda,\n\t0x1000, 0x10c5,\n\t0x10c7, 0x10c7,\n\t0x10cd, 0x10cd,\n\t0x10d0, 0x1248,\n\t0x124a, 0x124d,\n\t0x1250, 0x1256,\n\t0x1258, 0x1258,\n\t0x125a, 0x125d,\n\t0x1260, 0x1288,\n\t0x128a, 0x128d,\n\t0x1290, 0x12b0,\n\t0x12b2, 0x12b5,\n\t0x12b8, 0x12be,\n\t0x12c0, 0x12c0,\n\t0x12c2, 0x12c5,\n\t0x12c8, 0x12d6,\n\t0x12d8, 0x1310,\n\t0x1312, 0x1315,\n\t0x1318, 0x135a,\n\t0x135d, 0x137c,\n\t0x1380, 0x1399,\n\t0x13a0, 0x13f4,\n\t0x1400, 0x169c,\n\t0x16a0, 0x16f0,\n\t0x1700, 0x170c,\n\t0x170e, 0x1714,\n\t0x1720, 0x1736,\n\t0x1740, 0x1753,\n\t0x1760, 0x176c,\n\t0x176e, 0x1770,\n\t0x1772, 0x1773,\n\t0x1780, 0x17dd,\n\t0x17e0, 0x17e9,\n\t0x17f0, 0x17f9,\n\t0x1800, 0x180e,\n\t0x1810, 0x1819,\n\t0x1820, 0x1877,\n\t0x1880, 0x18aa,\n\t0x18b0, 0x18f5,\n\t0x1900, 0x191c,\n\t0x1920, 0x192b,\n\t0x1930, 0x193b,\n\t0x1940, 0x1940,\n\t0x1944, 0x196d,\n\t0x1970, 0x1974,\n\t0x1980, 0x19ab,\n\t0x19b0, 0x19c9,\n\t0x19d0, 0x19da,\n\t0x19de, 0x1a1b,\n\t0x1a1e, 0x1a5e,\n\t0x1a60, 0x1a7c,\n\t0x1a7f, 0x1a89,\n\t0x1a90, 0x1a99,\n\t0x1aa0, 0x1aad,\n\t0x1b00, 0x1b4b,\n\t0x1b50, 0x1b7c,\n\t0x1b80, 0x1bf3,\n\t0x1bfc, 0x1c37,\n\t0x1c3b, 0x1c49,\n\t0x1c4d, 0x1c7f,\n\t0x1cc0, 0x1cc7,\n\t0x1cd0, 0x1cf6,\n\t0x1d00, 0x1de6,\n\t0x1dfc, 0x1f15,\n\t0x1f18, 0x1f1d,\n\t0x1f20, 0x1f45,\n\t0x1f48, 0x1f4d,\n\t0x1f50, 0x1f57,\n\t0x1f59, 0x1f59,\n\t0x1f5b, 0x1f5b,\n\t0x1f5d, 0x1f5d,\n\t0x1f5f, 0x1f7d,\n\t0x1f80, 0x1fb4,\n\t0x1fb6, 0x1fc4,\n\t0x1fc6, 0x1fd3,\n\t0x1fd6, 0x1fdb,\n\t0x1fdd, 0x1fef,\n\t0x1ff2, 0x1ff4,\n\t0x1ff6, 0x1ffe,\n\t0x2000, 0x2064,\n\t0x206a, 0x2071,\n\t0x2074, 0x208e,\n\t0x2090, 0x209c,\n\t0x20a0, 0x20b9,\n\t0x20d0, 0x20f0,\n\t0x2100, 0x2189,\n\t0x2190, 0x23f3,\n\t0x2400, 0x2426,\n\t0x2440, 0x244a,\n\t0x2460, 0x26ff,\n\t0x2701, 0x2b4c,\n\t0x2b50, 0x2b59,\n\t0x2c00, 0x2c2e,\n\t0x2c30, 0x2c5e,\n\t0x2c60, 0x2cf3,\n\t0x2cf9, 0x2d25,\n\t0x2d27, 0x2d27,\n\t0x2d2d, 0x2d2d,\n\t0x2d30, 0x2d67,\n\t0x2d6f, 0x2d70,\n\t0x2d7f, 0x2d96,\n\t0x2da0, 0x2da6,\n\t0x2da8, 0x2dae,\n\t0x2db0, 0x2db6,\n\t0x2db8, 0x2dbe,\n\t0x2dc0, 0x2dc6,\n\t0x2dc8, 0x2dce,\n\t0x2dd0, 0x2dd6,\n\t0x2dd8, 0x2dde,\n\t0x2de0, 0x2e3b,\n\t0x2e80, 0x2e99,\n\t0x2e9b, 0x2ef3,\n\t0x2f00, 0x2fd5,\n\t0x2ff0, 0x2ffb,\n\t0x3000, 0x303f,\n\t0x3041, 0x3096,\n\t0x3099, 0x30ff,\n\t0x3105, 0x312d,\n\t0x3131, 0x318e,\n\t0x3190, 0x31ba,\n\t0x31c0, 0x31e3,\n\t0x31f0, 0x321e,\n\t0x3220, 0x32fe,\n\t0x3300, 0x4db5,\n\t0x4dc0, 0x9fcc,\n\t0xa000, 0xa48c,\n\t0xa490, 0xa4c6,\n\t0xa4d0, 0xa62b,\n\t0xa640, 0xa697,\n\t0xa69f, 0xa6f7,\n\t0xa700, 0xa78e,\n\t0xa790, 0xa793,\n\t0xa7a0, 0xa7aa,\n\t0xa7f8, 0xa82b,\n\t0xa830, 0xa839,\n\t0xa840, 0xa877,\n\t0xa880, 0xa8c4,\n\t0xa8ce, 0xa8d9,\n\t0xa8e0, 0xa8fb,\n\t0xa900, 0xa953,\n\t0xa95f, 0xa97c,\n\t0xa980, 0xa9cd,\n\t0xa9cf, 0xa9d9,\n\t0xa9de, 0xa9df,\n\t0xaa00, 0xaa36,\n\t0xaa40, 0xaa4d,\n\t0xaa50, 0xaa59,\n\t0xaa5c, 0xaa7b,\n\t0xaa80, 0xaac2,\n\t0xaadb, 0xaaf6,\n\t0xab01, 0xab06,\n\t0xab09, 0xab0e,\n\t0xab11, 0xab16,\n\t0xab20, 0xab26,\n\t0xab28, 0xab2e,\n\t0xabc0, 0xabed,\n\t0xabf0, 0xabf9,\n\t0xac00, 0xd7a3,\n\t0xd7b0, 0xd7c6,\n\t0xd7cb, 0xd7fb,\n\t0xd800, 0xfa6d,\n\t0xfa70, 0xfad9,\n\t0xfb00, 0xfb06,\n\t0xfb13, 0xfb17,\n\t0xfb1d, 0xfb36,\n\t0xfb38, 0xfb3c,\n\t0xfb3e, 0xfb3e,\n\t0xfb40, 0xfb41,\n\t0xfb43, 0xfb44,\n\t0xfb46, 0xfbc1,\n\t0xfbd3, 0xfd3f,\n\t0xfd50, 0xfd8f,\n\t0xfd92, 0xfdc7,\n\t0xfdf0, 0xfdfd,\n\t0xfe00, 0xfe19,\n\t0xfe20, 0xfe26,\n\t0xfe30, 0xfe52,\n\t0xfe54, 0xfe66,\n\t0xfe68, 0xfe6b,\n\t0xfe70, 0xfe74,\n\t0xfe76, 0xfefc,\n\t0xfeff, 0xfeff,\n\t0xff01, 0xffbe,\n\t0xffc2, 0xffc7,\n\t0xffca, 0xffcf,\n\t0xffd2, 0xffd7,\n\t0xffda, 0xffdc,\n\t0xffe0, 0xffe6,\n\t0xffe8, 0xffee,\n\t0xfff9, 0xfffd,\n\t0x10000, 0x1000b,\n\t0x1000d, 0x10026,\n\t0x10028, 0x1003a,\n\t0x1003c, 0x1003d,\n\t0x1003f, 0x1004d,\n\t0x10050, 0x1005d,\n\t0x10080, 0x100fa,\n\t0x10100, 0x10102,\n\t0x10107, 0x10133,\n\t0x10137, 0x1018a,\n\t0x10190, 0x1019b,\n\t0x101d0, 0x101fd,\n\t0x10280, 0x1029c,\n\t0x102a0, 0x102d0,\n\t0x10300, 0x1031e,\n\t0x10320, 0x10323,\n\t0x10330, 0x1034a,\n\t0x10380, 0x1039d,\n\t0x1039f, 0x103c3,\n\t0x103c8, 0x103d5,\n\t0x10400, 0x1049d,\n\t0x104a0, 0x104a9,\n\t0x10800, 0x10805,\n\t0x10808, 0x10808,\n\t0x1080a, 0x10835,\n\t0x10837, 0x10838,\n\t0x1083c, 0x1083c,\n\t0x1083f, 0x10855,\n\t0x10857, 0x1085f,\n\t0x10900, 0x1091b,\n\t0x1091f, 0x10939,\n\t0x1093f, 0x1093f,\n\t0x10980, 0x109b7,\n\t0x109be, 0x109bf,\n\t0x10a00, 0x10a03,\n\t0x10a05, 0x10a06,\n\t0x10a0c, 0x10a13,\n\t0x10a15, 0x10a17,\n\t0x10a19, 0x10a33,\n\t0x10a38, 0x10a3a,\n\t0x10a3f, 0x10a47,\n\t0x10a50, 0x10a58,\n\t0x10a60, 0x10a7f,\n\t0x10b00, 0x10b35,\n\t0x10b39, 0x10b55,\n\t0x10b58, 0x10b72,\n\t0x10b78, 0x10b7f,\n\t0x10c00, 0x10c48,\n\t0x10e60, 0x10e7e,\n\t0x11000, 0x1104d,\n\t0x11052, 0x1106f,\n\t0x11080, 0x110c1,\n\t0x110d0, 0x110e8,\n\t0x110f0, 0x110f9,\n\t0x11100, 0x11134,\n\t0x11136, 0x11143,\n\t0x11180, 0x111c8,\n\t0x111d0, 0x111d9,\n\t0x11680, 0x116b7,\n\t0x116c0, 0x116c9,\n\t0x12000, 0x1236e,\n\t0x12400, 0x12462,\n\t0x12470, 0x12473,\n\t0x13000, 0x1342e,\n\t0x16800, 0x16a38,\n\t0x16f00, 0x16f44,\n\t0x16f50, 0x16f7e,\n\t0x16f8f, 0x16f9f,\n\t0x1b000, 0x1b001,\n\t0x1d000, 0x1d0f5,\n\t0x1d100, 0x1d126,\n\t0x1d129, 0x1d1dd,\n\t0x1d200, 0x1d245,\n\t0x1d300, 0x1d356,\n\t0x1d360, 0x1d371,\n\t0x1d400, 0x1d454,\n\t0x1d456, 0x1d49c,\n\t0x1d49e, 0x1d49f,\n\t0x1d4a2, 0x1d4a2,\n\t0x1d4a5, 0x1d4a6,\n\t0x1d4a9, 0x1d4ac,\n\t0x1d4ae, 0x1d4b9,\n\t0x1d4bb, 0x1d4bb,\n\t0x1d4bd, 0x1d4c3,\n\t0x1d4c5, 0x1d505,\n\t0x1d507, 0x1d50a,\n\t0x1d50d, 0x1d514,\n\t0x1d516, 0x1d51c,\n\t0x1d51e, 0x1d539,\n\t0x1d53b, 0x1d53e,\n\t0x1d540, 0x1d544,\n\t0x1d546, 0x1d546,\n\t0x1d54a, 0x1d550,\n\t0x1d552, 0x1d6a5,\n\t0x1d6a8, 0x1d7cb,\n\t0x1d7ce, 0x1d7ff,\n\t0x1ee00, 0x1ee03,\n\t0x1ee05, 0x1ee1f,\n\t0x1ee21, 0x1ee22,\n\t0x1ee24, 0x1ee24,\n\t0x1ee27, 0x1ee27,\n\t0x1ee29, 0x1ee32,\n\t0x1ee34, 0x1ee37,\n\t0x1ee39, 0x1ee39,\n\t0x1ee3b, 0x1ee3b,\n\t0x1ee42, 0x1ee42,\n\t0x1ee47, 0x1ee47,\n\t0x1ee49, 0x1ee49,\n\t0x1ee4b, 0x1ee4b,\n\t0x1ee4d, 0x1ee4f,\n\t0x1ee51, 0x1ee52,\n\t0x1ee54, 0x1ee54,\n\t0x1ee57, 0x1ee57,\n\t0x1ee59, 0x1ee59,\n\t0x1ee5b, 0x1ee5b,\n\t0x1ee5d, 0x1ee5d,\n\t0x1ee5f, 0x1ee5f,\n\t0x1ee61, 0x1ee62,\n\t0x1ee64, 0x1ee64,\n\t0x1ee67, 0x1ee6a,\n\t0x1ee6c, 0x1ee72,\n\t0x1ee74, 0x1ee77,\n\t0x1ee79, 0x1ee7c,\n\t0x1ee7e, 0x1ee7e,\n\t0x1ee80, 0x1ee89,\n\t0x1ee8b, 0x1ee9b,\n\t0x1eea1, 0x1eea3,\n\t0x1eea5, 0x1eea9,\n\t0x1eeab, 0x1eebb,\n\t0x1eef0, 0x1eef1,\n\t0x1f000, 0x1f02b,\n\t0x1f030, 0x1f093,\n\t0x1f0a0, 0x1f0ae,\n\t0x1f0b1, 0x1f0be,\n\t0x1f0c1, 0x1f0cf,\n\t0x1f0d1, 0x1f0df,\n\t0x1f100, 0x1f10a,\n\t0x1f110, 0x1f12e,\n\t0x1f130, 0x1f16b,\n\t0x1f170, 0x1f19a,\n\t0x1f1e6, 0x1f202,\n\t0x1f210, 0x1f23a,\n\t0x1f240, 0x1f248,\n\t0x1f250, 0x1f251,\n\t0x1f300, 0x1f320,\n\t0x1f330, 0x1f335,\n\t0x1f337, 0x1f37c,\n\t0x1f380, 0x1f393,\n\t0x1f3a0, 0x1f3c4,\n\t0x1f3c6, 0x1f3ca,\n\t0x1f3e0, 0x1f3f0,\n\t0x1f400, 0x1f43e,\n\t0x1f440, 0x1f440,\n\t0x1f442, 0x1f4f7,\n\t0x1f4f9, 0x1f4fc,\n\t0x1f500, 0x1f53d,\n\t0x1f540, 0x1f543,\n\t0x1f550, 0x1f567,\n\t0x1f5fb, 0x1f640,\n\t0x1f645, 0x1f64f,\n\t0x1f680, 0x1f6c5,\n\t0x1f700, 0x1f773,\n\t0x20000, 0x2a6d6,\n\t0x2a700, 0x2b734,\n\t0x2b740, 0x2b81d,\n\t0x2f800, 0x2fa1d,\n\t0xe0001, 0xe0001,\n\t0xe0020, 0xe007f,\n\t0xe0100, 0xe01ef,\n\t0xf0000, 0xffffd,\n\t0x100000, 0x10fffd,\n}; /* CR_Assigned */\n\n/* 'C': Major Category */\nstatic const OnigCodePoint CR_C[] = {\n\t541,\n\t0x0000, 0x001f,\n\t0x007f, 0x009f,\n\t0x00ad, 0x00ad,\n\t0x0378, 0x0379,\n\t0x037f, 0x0383,\n\t0x038b, 0x038b,\n\t0x038d, 0x038d,\n\t0x03a2, 0x03a2,\n\t0x0528, 0x0530,\n\t0x0557, 0x0558,\n\t0x0560, 0x0560,\n\t0x0588, 0x0588,\n\t0x058b, 0x058e,\n\t0x0590, 0x0590,\n\t0x05c8, 0x05cf,\n\t0x05eb, 0x05ef,\n\t0x05f5, 0x0605,\n\t0x061c, 0x061d,\n\t0x06dd, 0x06dd,\n\t0x070e, 0x070f,\n\t0x074b, 0x074c,\n\t0x07b2, 0x07bf,\n\t0x07fb, 0x07ff,\n\t0x082e, 0x082f,\n\t0x083f, 0x083f,\n\t0x085c, 0x085d,\n\t0x085f, 0x089f,\n\t0x08a1, 0x08a1,\n\t0x08ad, 0x08e3,\n\t0x08ff, 0x08ff,\n\t0x0978, 0x0978,\n\t0x0980, 0x0980,\n\t0x0984, 0x0984,\n\t0x098d, 0x098e,\n\t0x0991, 0x0992,\n\t0x09a9, 0x09a9,\n\t0x09b1, 0x09b1,\n\t0x09b3, 0x09b5,\n\t0x09ba, 0x09bb,\n\t0x09c5, 0x09c6,\n\t0x09c9, 0x09ca,\n\t0x09cf, 0x09d6,\n\t0x09d8, 0x09db,\n\t0x09de, 0x09de,\n\t0x09e4, 0x09e5,\n\t0x09fc, 0x0a00,\n\t0x0a04, 0x0a04,\n\t0x0a0b, 0x0a0e,\n\t0x0a11, 0x0a12,\n\t0x0a29, 0x0a29,\n\t0x0a31, 0x0a31,\n\t0x0a34, 0x0a34,\n\t0x0a37, 0x0a37,\n\t0x0a3a, 0x0a3b,\n\t0x0a3d, 0x0a3d,\n\t0x0a43, 0x0a46,\n\t0x0a49, 0x0a4a,\n\t0x0a4e, 0x0a50,\n\t0x0a52, 0x0a58,\n\t0x0a5d, 0x0a5d,\n\t0x0a5f, 0x0a65,\n\t0x0a76, 0x0a80,\n\t0x0a84, 0x0a84,\n\t0x0a8e, 0x0a8e,\n\t0x0a92, 0x0a92,\n\t0x0aa9, 0x0aa9,\n\t0x0ab1, 0x0ab1,\n\t0x0ab4, 0x0ab4,\n\t0x0aba, 0x0abb,\n\t0x0ac6, 0x0ac6,\n\t0x0aca, 0x0aca,\n\t0x0ace, 0x0acf,\n\t0x0ad1, 0x0adf,\n\t0x0ae4, 0x0ae5,\n\t0x0af2, 0x0b00,\n\t0x0b04, 0x0b04,\n\t0x0b0d, 0x0b0e,\n\t0x0b11, 0x0b12,\n\t0x0b29, 0x0b29,\n\t0x0b31, 0x0b31,\n\t0x0b34, 0x0b34,\n\t0x0b3a, 0x0b3b,\n\t0x0b45, 0x0b46,\n\t0x0b49, 0x0b4a,\n\t0x0b4e, 0x0b55,\n\t0x0b58, 0x0b5b,\n\t0x0b5e, 0x0b5e,\n\t0x0b64, 0x0b65,\n\t0x0b78, 0x0b81,\n\t0x0b84, 0x0b84,\n\t0x0b8b, 0x0b8d,\n\t0x0b91, 0x0b91,\n\t0x0b96, 0x0b98,\n\t0x0b9b, 0x0b9b,\n\t0x0b9d, 0x0b9d,\n\t0x0ba0, 0x0ba2,\n\t0x0ba5, 0x0ba7,\n\t0x0bab, 0x0bad,\n\t0x0bba, 0x0bbd,\n\t0x0bc3, 0x0bc5,\n\t0x0bc9, 0x0bc9,\n\t0x0bce, 0x0bcf,\n\t0x0bd1, 0x0bd6,\n\t0x0bd8, 0x0be5,\n\t0x0bfb, 0x0c00,\n\t0x0c04, 0x0c04,\n\t0x0c0d, 0x0c0d,\n\t0x0c11, 0x0c11,\n\t0x0c29, 0x0c29,\n\t0x0c34, 0x0c34,\n\t0x0c3a, 0x0c3c,\n\t0x0c45, 0x0c45,\n\t0x0c49, 0x0c49,\n\t0x0c4e, 0x0c54,\n\t0x0c57, 0x0c57,\n\t0x0c5a, 0x0c5f,\n\t0x0c64, 0x0c65,\n\t0x0c70, 0x0c77,\n\t0x0c80, 0x0c81,\n\t0x0c84, 0x0c84,\n\t0x0c8d, 0x0c8d,\n\t0x0c91, 0x0c91,\n\t0x0ca9, 0x0ca9,\n\t0x0cb4, 0x0cb4,\n\t0x0cba, 0x0cbb,\n\t0x0cc5, 0x0cc5,\n\t0x0cc9, 0x0cc9,\n\t0x0cce, 0x0cd4,\n\t0x0cd7, 0x0cdd,\n\t0x0cdf, 0x0cdf,\n\t0x0ce4, 0x0ce5,\n\t0x0cf0, 0x0cf0,\n\t0x0cf3, 0x0d01,\n\t0x0d04, 0x0d04,\n\t0x0d0d, 0x0d0d,\n\t0x0d11, 0x0d11,\n\t0x0d3b, 0x0d3c,\n\t0x0d45, 0x0d45,\n\t0x0d49, 0x0d49,\n\t0x0d4f, 0x0d56,\n\t0x0d58, 0x0d5f,\n\t0x0d64, 0x0d65,\n\t0x0d76, 0x0d78,\n\t0x0d80, 0x0d81,\n\t0x0d84, 0x0d84,\n\t0x0d97, 0x0d99,\n\t0x0db2, 0x0db2,\n\t0x0dbc, 0x0dbc,\n\t0x0dbe, 0x0dbf,\n\t0x0dc7, 0x0dc9,\n\t0x0dcb, 0x0dce,\n\t0x0dd5, 0x0dd5,\n\t0x0dd7, 0x0dd7,\n\t0x0de0, 0x0df1,\n\t0x0df5, 0x0e00,\n\t0x0e3b, 0x0e3e,\n\t0x0e5c, 0x0e80,\n\t0x0e83, 0x0e83,\n\t0x0e85, 0x0e86,\n\t0x0e89, 0x0e89,\n\t0x0e8b, 0x0e8c,\n\t0x0e8e, 0x0e93,\n\t0x0e98, 0x0e98,\n\t0x0ea0, 0x0ea0,\n\t0x0ea4, 0x0ea4,\n\t0x0ea6, 0x0ea6,\n\t0x0ea8, 0x0ea9,\n\t0x0eac, 0x0eac,\n\t0x0eba, 0x0eba,\n\t0x0ebe, 0x0ebf,\n\t0x0ec5, 0x0ec5,\n\t0x0ec7, 0x0ec7,\n\t0x0ece, 0x0ecf,\n\t0x0eda, 0x0edb,\n\t0x0ee0, 0x0eff,\n\t0x0f48, 0x0f48,\n\t0x0f6d, 0x0f70,\n\t0x0f98, 0x0f98,\n\t0x0fbd, 0x0fbd,\n\t0x0fcd, 0x0fcd,\n\t0x0fdb, 0x0fff,\n\t0x10c6, 0x10c6,\n\t0x10c8, 0x10cc,\n\t0x10ce, 0x10cf,\n\t0x1249, 0x1249,\n\t0x124e, 0x124f,\n\t0x1257, 0x1257,\n\t0x1259, 0x1259,\n\t0x125e, 0x125f,\n\t0x1289, 0x1289,\n\t0x128e, 0x128f,\n\t0x12b1, 0x12b1,\n\t0x12b6, 0x12b7,\n\t0x12bf, 0x12bf,\n\t0x12c1, 0x12c1,\n\t0x12c6, 0x12c7,\n\t0x12d7, 0x12d7,\n\t0x1311, 0x1311,\n\t0x1316, 0x1317,\n\t0x135b, 0x135c,\n\t0x137d, 0x137f,\n\t0x139a, 0x139f,\n\t0x13f5, 0x13ff,\n\t0x169d, 0x169f,\n\t0x16f1, 0x16ff,\n\t0x170d, 0x170d,\n\t0x1715, 0x171f,\n\t0x1737, 0x173f,\n\t0x1754, 0x175f,\n\t0x176d, 0x176d,\n\t0x1771, 0x1771,\n\t0x1774, 0x177f,\n\t0x17de, 0x17df,\n\t0x17ea, 0x17ef,\n\t0x17fa, 0x17ff,\n\t0x180f, 0x180f,\n\t0x181a, 0x181f,\n\t0x1878, 0x187f,\n\t0x18ab, 0x18af,\n\t0x18f6, 0x18ff,\n\t0x191d, 0x191f,\n\t0x192c, 0x192f,\n\t0x193c, 0x193f,\n\t0x1941, 0x1943,\n\t0x196e, 0x196f,\n\t0x1975, 0x197f,\n\t0x19ac, 0x19af,\n\t0x19ca, 0x19cf,\n\t0x19db, 0x19dd,\n\t0x1a1c, 0x1a1d,\n\t0x1a5f, 0x1a5f,\n\t0x1a7d, 0x1a7e,\n\t0x1a8a, 0x1a8f,\n\t0x1a9a, 0x1a9f,\n\t0x1aae, 0x1aff,\n\t0x1b4c, 0x1b4f,\n\t0x1b7d, 0x1b7f,\n\t0x1bf4, 0x1bfb,\n\t0x1c38, 0x1c3a,\n\t0x1c4a, 0x1c4c,\n\t0x1c80, 0x1cbf,\n\t0x1cc8, 0x1ccf,\n\t0x1cf7, 0x1cff,\n\t0x1de7, 0x1dfb,\n\t0x1f16, 0x1f17,\n\t0x1f1e, 0x1f1f,\n\t0x1f46, 0x1f47,\n\t0x1f4e, 0x1f4f,\n\t0x1f58, 0x1f58,\n\t0x1f5a, 0x1f5a,\n\t0x1f5c, 0x1f5c,\n\t0x1f5e, 0x1f5e,\n\t0x1f7e, 0x1f7f,\n\t0x1fb5, 0x1fb5,\n\t0x1fc5, 0x1fc5,\n\t0x1fd4, 0x1fd5,\n\t0x1fdc, 0x1fdc,\n\t0x1ff0, 0x1ff1,\n\t0x1ff5, 0x1ff5,\n\t0x1fff, 0x1fff,\n\t0x200b, 0x200f,\n\t0x202a, 0x202e,\n\t0x2060, 0x206f,\n\t0x2072, 0x2073,\n\t0x208f, 0x208f,\n\t0x209d, 0x209f,\n\t0x20ba, 0x20cf,\n\t0x20f1, 0x20ff,\n\t0x218a, 0x218f,\n\t0x23f4, 0x23ff,\n\t0x2427, 0x243f,\n\t0x244b, 0x245f,\n\t0x2700, 0x2700,\n\t0x2b4d, 0x2b4f,\n\t0x2b5a, 0x2bff,\n\t0x2c2f, 0x2c2f,\n\t0x2c5f, 0x2c5f,\n\t0x2cf4, 0x2cf8,\n\t0x2d26, 0x2d26,\n\t0x2d28, 0x2d2c,\n\t0x2d2e, 0x2d2f,\n\t0x2d68, 0x2d6e,\n\t0x2d71, 0x2d7e,\n\t0x2d97, 0x2d9f,\n\t0x2da7, 0x2da7,\n\t0x2daf, 0x2daf,\n\t0x2db7, 0x2db7,\n\t0x2dbf, 0x2dbf,\n\t0x2dc7, 0x2dc7,\n\t0x2dcf, 0x2dcf,\n\t0x2dd7, 0x2dd7,\n\t0x2ddf, 0x2ddf,\n\t0x2e3c, 0x2e7f,\n\t0x2e9a, 0x2e9a,\n\t0x2ef4, 0x2eff,\n\t0x2fd6, 0x2fef,\n\t0x2ffc, 0x2fff,\n\t0x3040, 0x3040,\n\t0x3097, 0x3098,\n\t0x3100, 0x3104,\n\t0x312e, 0x3130,\n\t0x318f, 0x318f,\n\t0x31bb, 0x31bf,\n\t0x31e4, 0x31ef,\n\t0x321f, 0x321f,\n\t0x32ff, 0x32ff,\n\t0x4db6, 0x4dbf,\n\t0x9fcd, 0x9fff,\n\t0xa48d, 0xa48f,\n\t0xa4c7, 0xa4cf,\n\t0xa62c, 0xa63f,\n\t0xa698, 0xa69e,\n\t0xa6f8, 0xa6ff,\n\t0xa78f, 0xa78f,\n\t0xa794, 0xa79f,\n\t0xa7ab, 0xa7f7,\n\t0xa82c, 0xa82f,\n\t0xa83a, 0xa83f,\n\t0xa878, 0xa87f,\n\t0xa8c5, 0xa8cd,\n\t0xa8da, 0xa8df,\n\t0xa8fc, 0xa8ff,\n\t0xa954, 0xa95e,\n\t0xa97d, 0xa97f,\n\t0xa9ce, 0xa9ce,\n\t0xa9da, 0xa9dd,\n\t0xa9e0, 0xa9ff,\n\t0xaa37, 0xaa3f,\n\t0xaa4e, 0xaa4f,\n\t0xaa5a, 0xaa5b,\n\t0xaa7c, 0xaa7f,\n\t0xaac3, 0xaada,\n\t0xaaf7, 0xab00,\n\t0xab07, 0xab08,\n\t0xab0f, 0xab10,\n\t0xab17, 0xab1f,\n\t0xab27, 0xab27,\n\t0xab2f, 0xabbf,\n\t0xabee, 0xabef,\n\t0xabfa, 0xabff,\n\t0xd7a4, 0xd7af,\n\t0xd7c7, 0xd7ca,\n\t0xd7fc, 0xf8ff,\n\t0xfa6e, 0xfa6f,\n\t0xfada, 0xfaff,\n\t0xfb07, 0xfb12,\n\t0xfb18, 0xfb1c,\n\t0xfb37, 0xfb37,\n\t0xfb3d, 0xfb3d,\n\t0xfb3f, 0xfb3f,\n\t0xfb42, 0xfb42,\n\t0xfb45, 0xfb45,\n\t0xfbc2, 0xfbd2,\n\t0xfd40, 0xfd4f,\n\t0xfd90, 0xfd91,\n\t0xfdc8, 0xfdef,\n\t0xfdfe, 0xfdff,\n\t0xfe1a, 0xfe1f,\n\t0xfe27, 0xfe2f,\n\t0xfe53, 0xfe53,\n\t0xfe67, 0xfe67,\n\t0xfe6c, 0xfe6f,\n\t0xfe75, 0xfe75,\n\t0xfefd, 0xff00,\n\t0xffbf, 0xffc1,\n\t0xffc8, 0xffc9,\n\t0xffd0, 0xffd1,\n\t0xffd8, 0xffd9,\n\t0xffdd, 0xffdf,\n\t0xffe7, 0xffe7,\n\t0xffef, 0xfffb,\n\t0xfffe, 0xffff,\n\t0x1000c, 0x1000c,\n\t0x10027, 0x10027,\n\t0x1003b, 0x1003b,\n\t0x1003e, 0x1003e,\n\t0x1004e, 0x1004f,\n\t0x1005e, 0x1007f,\n\t0x100fb, 0x100ff,\n\t0x10103, 0x10106,\n\t0x10134, 0x10136,\n\t0x1018b, 0x1018f,\n\t0x1019c, 0x101cf,\n\t0x101fe, 0x1027f,\n\t0x1029d, 0x1029f,\n\t0x102d1, 0x102ff,\n\t0x1031f, 0x1031f,\n\t0x10324, 0x1032f,\n\t0x1034b, 0x1037f,\n\t0x1039e, 0x1039e,\n\t0x103c4, 0x103c7,\n\t0x103d6, 0x103ff,\n\t0x1049e, 0x1049f,\n\t0x104aa, 0x107ff,\n\t0x10806, 0x10807,\n\t0x10809, 0x10809,\n\t0x10836, 0x10836,\n\t0x10839, 0x1083b,\n\t0x1083d, 0x1083e,\n\t0x10856, 0x10856,\n\t0x10860, 0x108ff,\n\t0x1091c, 0x1091e,\n\t0x1093a, 0x1093e,\n\t0x10940, 0x1097f,\n\t0x109b8, 0x109bd,\n\t0x109c0, 0x109ff,\n\t0x10a04, 0x10a04,\n\t0x10a07, 0x10a0b,\n\t0x10a14, 0x10a14,\n\t0x10a18, 0x10a18,\n\t0x10a34, 0x10a37,\n\t0x10a3b, 0x10a3e,\n\t0x10a48, 0x10a4f,\n\t0x10a59, 0x10a5f,\n\t0x10a80, 0x10aff,\n\t0x10b36, 0x10b38,\n\t0x10b56, 0x10b57,\n\t0x10b73, 0x10b77,\n\t0x10b80, 0x10bff,\n\t0x10c49, 0x10e5f,\n\t0x10e7f, 0x10fff,\n\t0x1104e, 0x11051,\n\t0x11070, 0x1107f,\n\t0x110bd, 0x110bd,\n\t0x110c2, 0x110cf,\n\t0x110e9, 0x110ef,\n\t0x110fa, 0x110ff,\n\t0x11135, 0x11135,\n\t0x11144, 0x1117f,\n\t0x111c9, 0x111cf,\n\t0x111da, 0x1167f,\n\t0x116b8, 0x116bf,\n\t0x116ca, 0x11fff,\n\t0x1236f, 0x123ff,\n\t0x12463, 0x1246f,\n\t0x12474, 0x12fff,\n\t0x1342f, 0x167ff,\n\t0x16a39, 0x16eff,\n\t0x16f45, 0x16f4f,\n\t0x16f7f, 0x16f8e,\n\t0x16fa0, 0x1afff,\n\t0x1b002, 0x1cfff,\n\t0x1d0f6, 0x1d0ff,\n\t0x1d127, 0x1d128,\n\t0x1d173, 0x1d17a,\n\t0x1d1de, 0x1d1ff,\n\t0x1d246, 0x1d2ff,\n\t0x1d357, 0x1d35f,\n\t0x1d372, 0x1d3ff,\n\t0x1d455, 0x1d455,\n\t0x1d49d, 0x1d49d,\n\t0x1d4a0, 0x1d4a1,\n\t0x1d4a3, 0x1d4a4,\n\t0x1d4a7, 0x1d4a8,\n\t0x1d4ad, 0x1d4ad,\n\t0x1d4ba, 0x1d4ba,\n\t0x1d4bc, 0x1d4bc,\n\t0x1d4c4, 0x1d4c4,\n\t0x1d506, 0x1d506,\n\t0x1d50b, 0x1d50c,\n\t0x1d515, 0x1d515,\n\t0x1d51d, 0x1d51d,\n\t0x1d53a, 0x1d53a,\n\t0x1d53f, 0x1d53f,\n\t0x1d545, 0x1d545,\n\t0x1d547, 0x1d549,\n\t0x1d551, 0x1d551,\n\t0x1d6a6, 0x1d6a7,\n\t0x1d7cc, 0x1d7cd,\n\t0x1d800, 0x1edff,\n\t0x1ee04, 0x1ee04,\n\t0x1ee20, 0x1ee20,\n\t0x1ee23, 0x1ee23,\n\t0x1ee25, 0x1ee26,\n\t0x1ee28, 0x1ee28,\n\t0x1ee33, 0x1ee33,\n\t0x1ee38, 0x1ee38,\n\t0x1ee3a, 0x1ee3a,\n\t0x1ee3c, 0x1ee41,\n\t0x1ee43, 0x1ee46,\n\t0x1ee48, 0x1ee48,\n\t0x1ee4a, 0x1ee4a,\n\t0x1ee4c, 0x1ee4c,\n\t0x1ee50, 0x1ee50,\n\t0x1ee53, 0x1ee53,\n\t0x1ee55, 0x1ee56,\n\t0x1ee58, 0x1ee58,\n\t0x1ee5a, 0x1ee5a,\n\t0x1ee5c, 0x1ee5c,\n\t0x1ee5e, 0x1ee5e,\n\t0x1ee60, 0x1ee60,\n\t0x1ee63, 0x1ee63,\n\t0x1ee65, 0x1ee66,\n\t0x1ee6b, 0x1ee6b,\n\t0x1ee73, 0x1ee73,\n\t0x1ee78, 0x1ee78,\n\t0x1ee7d, 0x1ee7d,\n\t0x1ee7f, 0x1ee7f,\n\t0x1ee8a, 0x1ee8a,\n\t0x1ee9c, 0x1eea0,\n\t0x1eea4, 0x1eea4,\n\t0x1eeaa, 0x1eeaa,\n\t0x1eebc, 0x1eeef,\n\t0x1eef2, 0x1efff,\n\t0x1f02c, 0x1f02f,\n\t0x1f094, 0x1f09f,\n\t0x1f0af, 0x1f0b0,\n\t0x1f0bf, 0x1f0c0,\n\t0x1f0d0, 0x1f0d0,\n\t0x1f0e0, 0x1f0ff,\n\t0x1f10b, 0x1f10f,\n\t0x1f12f, 0x1f12f,\n\t0x1f16c, 0x1f16f,\n\t0x1f19b, 0x1f1e5,\n\t0x1f203, 0x1f20f,\n\t0x1f23b, 0x1f23f,\n\t0x1f249, 0x1f24f,\n\t0x1f252, 0x1f2ff,\n\t0x1f321, 0x1f32f,\n\t0x1f336, 0x1f336,\n\t0x1f37d, 0x1f37f,\n\t0x1f394, 0x1f39f,\n\t0x1f3c5, 0x1f3c5,\n\t0x1f3cb, 0x1f3df,\n\t0x1f3f1, 0x1f3ff,\n\t0x1f43f, 0x1f43f,\n\t0x1f441, 0x1f441,\n\t0x1f4f8, 0x1f4f8,\n\t0x1f4fd, 0x1f4ff,\n\t0x1f53e, 0x1f53f,\n\t0x1f544, 0x1f54f,\n\t0x1f568, 0x1f5fa,\n\t0x1f641, 0x1f644,\n\t0x1f650, 0x1f67f,\n\t0x1f6c6, 0x1f6ff,\n\t0x1f774, 0x1ffff,\n\t0x2a6d7, 0x2a6ff,\n\t0x2b735, 0x2b73f,\n\t0x2b81e, 0x2f7ff,\n\t0x2fa1e, 0xe00ff,\n\t0xe01f0, 0x10ffff,\n}; /* CR_C */\n\n/* 'Cc': General Category */\n#define CR_Cc CR_Cntrl\n\n/* 'Cf': General Category */\nstatic const OnigCodePoint CR_Cf[] = {\n\t14,\n\t0x00ad, 0x00ad,\n\t0x0600, 0x0604,\n\t0x06dd, 0x06dd,\n\t0x070f, 0x070f,\n\t0x200b, 0x200f,\n\t0x202a, 0x202e,\n\t0x2060, 0x2064,\n\t0x206a, 0x206f,\n\t0xfeff, 0xfeff,\n\t0xfff9, 0xfffb,\n\t0x110bd, 0x110bd,\n\t0x1d173, 0x1d17a,\n\t0xe0001, 0xe0001,\n\t0xe0020, 0xe007f,\n}; /* CR_Cf */\n\n/* 'Cn': General Category */\nstatic const OnigCodePoint CR_Cn[] = {\n\t539,\n\t0x0378, 0x0379,\n\t0x037f, 0x0383,\n\t0x038b, 0x038b,\n\t0x038d, 0x038d,\n\t0x03a2, 0x03a2,\n\t0x0528, 0x0530,\n\t0x0557, 0x0558,\n\t0x0560, 0x0560,\n\t0x0588, 0x0588,\n\t0x058b, 0x058e,\n\t0x0590, 0x0590,\n\t0x05c8, 0x05cf,\n\t0x05eb, 0x05ef,\n\t0x05f5, 0x05ff,\n\t0x0605, 0x0605,\n\t0x061c, 0x061d,\n\t0x070e, 0x070e,\n\t0x074b, 0x074c,\n\t0x07b2, 0x07bf,\n\t0x07fb, 0x07ff,\n\t0x082e, 0x082f,\n\t0x083f, 0x083f,\n\t0x085c, 0x085d,\n\t0x085f, 0x089f,\n\t0x08a1, 0x08a1,\n\t0x08ad, 0x08e3,\n\t0x08ff, 0x08ff,\n\t0x0978, 0x0978,\n\t0x0980, 0x0980,\n\t0x0984, 0x0984,\n\t0x098d, 0x098e,\n\t0x0991, 0x0992,\n\t0x09a9, 0x09a9,\n\t0x09b1, 0x09b1,\n\t0x09b3, 0x09b5,\n\t0x09ba, 0x09bb,\n\t0x09c5, 0x09c6,\n\t0x09c9, 0x09ca,\n\t0x09cf, 0x09d6,\n\t0x09d8, 0x09db,\n\t0x09de, 0x09de,\n\t0x09e4, 0x09e5,\n\t0x09fc, 0x0a00,\n\t0x0a04, 0x0a04,\n\t0x0a0b, 0x0a0e,\n\t0x0a11, 0x0a12,\n\t0x0a29, 0x0a29,\n\t0x0a31, 0x0a31,\n\t0x0a34, 0x0a34,\n\t0x0a37, 0x0a37,\n\t0x0a3a, 0x0a3b,\n\t0x0a3d, 0x0a3d,\n\t0x0a43, 0x0a46,\n\t0x0a49, 0x0a4a,\n\t0x0a4e, 0x0a50,\n\t0x0a52, 0x0a58,\n\t0x0a5d, 0x0a5d,\n\t0x0a5f, 0x0a65,\n\t0x0a76, 0x0a80,\n\t0x0a84, 0x0a84,\n\t0x0a8e, 0x0a8e,\n\t0x0a92, 0x0a92,\n\t0x0aa9, 0x0aa9,\n\t0x0ab1, 0x0ab1,\n\t0x0ab4, 0x0ab4,\n\t0x0aba, 0x0abb,\n\t0x0ac6, 0x0ac6,\n\t0x0aca, 0x0aca,\n\t0x0ace, 0x0acf,\n\t0x0ad1, 0x0adf,\n\t0x0ae4, 0x0ae5,\n\t0x0af2, 0x0b00,\n\t0x0b04, 0x0b04,\n\t0x0b0d, 0x0b0e,\n\t0x0b11, 0x0b12,\n\t0x0b29, 0x0b29,\n\t0x0b31, 0x0b31,\n\t0x0b34, 0x0b34,\n\t0x0b3a, 0x0b3b,\n\t0x0b45, 0x0b46,\n\t0x0b49, 0x0b4a,\n\t0x0b4e, 0x0b55,\n\t0x0b58, 0x0b5b,\n\t0x0b5e, 0x0b5e,\n\t0x0b64, 0x0b65,\n\t0x0b78, 0x0b81,\n\t0x0b84, 0x0b84,\n\t0x0b8b, 0x0b8d,\n\t0x0b91, 0x0b91,\n\t0x0b96, 0x0b98,\n\t0x0b9b, 0x0b9b,\n\t0x0b9d, 0x0b9d,\n\t0x0ba0, 0x0ba2,\n\t0x0ba5, 0x0ba7,\n\t0x0bab, 0x0bad,\n\t0x0bba, 0x0bbd,\n\t0x0bc3, 0x0bc5,\n\t0x0bc9, 0x0bc9,\n\t0x0bce, 0x0bcf,\n\t0x0bd1, 0x0bd6,\n\t0x0bd8, 0x0be5,\n\t0x0bfb, 0x0c00,\n\t0x0c04, 0x0c04,\n\t0x0c0d, 0x0c0d,\n\t0x0c11, 0x0c11,\n\t0x0c29, 0x0c29,\n\t0x0c34, 0x0c34,\n\t0x0c3a, 0x0c3c,\n\t0x0c45, 0x0c45,\n\t0x0c49, 0x0c49,\n\t0x0c4e, 0x0c54,\n\t0x0c57, 0x0c57,\n\t0x0c5a, 0x0c5f,\n\t0x0c64, 0x0c65,\n\t0x0c70, 0x0c77,\n\t0x0c80, 0x0c81,\n\t0x0c84, 0x0c84,\n\t0x0c8d, 0x0c8d,\n\t0x0c91, 0x0c91,\n\t0x0ca9, 0x0ca9,\n\t0x0cb4, 0x0cb4,\n\t0x0cba, 0x0cbb,\n\t0x0cc5, 0x0cc5,\n\t0x0cc9, 0x0cc9,\n\t0x0cce, 0x0cd4,\n\t0x0cd7, 0x0cdd,\n\t0x0cdf, 0x0cdf,\n\t0x0ce4, 0x0ce5,\n\t0x0cf0, 0x0cf0,\n\t0x0cf3, 0x0d01,\n\t0x0d04, 0x0d04,\n\t0x0d0d, 0x0d0d,\n\t0x0d11, 0x0d11,\n\t0x0d3b, 0x0d3c,\n\t0x0d45, 0x0d45,\n\t0x0d49, 0x0d49,\n\t0x0d4f, 0x0d56,\n\t0x0d58, 0x0d5f,\n\t0x0d64, 0x0d65,\n\t0x0d76, 0x0d78,\n\t0x0d80, 0x0d81,\n\t0x0d84, 0x0d84,\n\t0x0d97, 0x0d99,\n\t0x0db2, 0x0db2,\n\t0x0dbc, 0x0dbc,\n\t0x0dbe, 0x0dbf,\n\t0x0dc7, 0x0dc9,\n\t0x0dcb, 0x0dce,\n\t0x0dd5, 0x0dd5,\n\t0x0dd7, 0x0dd7,\n\t0x0de0, 0x0df1,\n\t0x0df5, 0x0e00,\n\t0x0e3b, 0x0e3e,\n\t0x0e5c, 0x0e80,\n\t0x0e83, 0x0e83,\n\t0x0e85, 0x0e86,\n\t0x0e89, 0x0e89,\n\t0x0e8b, 0x0e8c,\n\t0x0e8e, 0x0e93,\n\t0x0e98, 0x0e98,\n\t0x0ea0, 0x0ea0,\n\t0x0ea4, 0x0ea4,\n\t0x0ea6, 0x0ea6,\n\t0x0ea8, 0x0ea9,\n\t0x0eac, 0x0eac,\n\t0x0eba, 0x0eba,\n\t0x0ebe, 0x0ebf,\n\t0x0ec5, 0x0ec5,\n\t0x0ec7, 0x0ec7,\n\t0x0ece, 0x0ecf,\n\t0x0eda, 0x0edb,\n\t0x0ee0, 0x0eff,\n\t0x0f48, 0x0f48,\n\t0x0f6d, 0x0f70,\n\t0x0f98, 0x0f98,\n\t0x0fbd, 0x0fbd,\n\t0x0fcd, 0x0fcd,\n\t0x0fdb, 0x0fff,\n\t0x10c6, 0x10c6,\n\t0x10c8, 0x10cc,\n\t0x10ce, 0x10cf,\n\t0x1249, 0x1249,\n\t0x124e, 0x124f,\n\t0x1257, 0x1257,\n\t0x1259, 0x1259,\n\t0x125e, 0x125f,\n\t0x1289, 0x1289,\n\t0x128e, 0x128f,\n\t0x12b1, 0x12b1,\n\t0x12b6, 0x12b7,\n\t0x12bf, 0x12bf,\n\t0x12c1, 0x12c1,\n\t0x12c6, 0x12c7,\n\t0x12d7, 0x12d7,\n\t0x1311, 0x1311,\n\t0x1316, 0x1317,\n\t0x135b, 0x135c,\n\t0x137d, 0x137f,\n\t0x139a, 0x139f,\n\t0x13f5, 0x13ff,\n\t0x169d, 0x169f,\n\t0x16f1, 0x16ff,\n\t0x170d, 0x170d,\n\t0x1715, 0x171f,\n\t0x1737, 0x173f,\n\t0x1754, 0x175f,\n\t0x176d, 0x176d,\n\t0x1771, 0x1771,\n\t0x1774, 0x177f,\n\t0x17de, 0x17df,\n\t0x17ea, 0x17ef,\n\t0x17fa, 0x17ff,\n\t0x180f, 0x180f,\n\t0x181a, 0x181f,\n\t0x1878, 0x187f,\n\t0x18ab, 0x18af,\n\t0x18f6, 0x18ff,\n\t0x191d, 0x191f,\n\t0x192c, 0x192f,\n\t0x193c, 0x193f,\n\t0x1941, 0x1943,\n\t0x196e, 0x196f,\n\t0x1975, 0x197f,\n\t0x19ac, 0x19af,\n\t0x19ca, 0x19cf,\n\t0x19db, 0x19dd,\n\t0x1a1c, 0x1a1d,\n\t0x1a5f, 0x1a5f,\n\t0x1a7d, 0x1a7e,\n\t0x1a8a, 0x1a8f,\n\t0x1a9a, 0x1a9f,\n\t0x1aae, 0x1aff,\n\t0x1b4c, 0x1b4f,\n\t0x1b7d, 0x1b7f,\n\t0x1bf4, 0x1bfb,\n\t0x1c38, 0x1c3a,\n\t0x1c4a, 0x1c4c,\n\t0x1c80, 0x1cbf,\n\t0x1cc8, 0x1ccf,\n\t0x1cf7, 0x1cff,\n\t0x1de7, 0x1dfb,\n\t0x1f16, 0x1f17,\n\t0x1f1e, 0x1f1f,\n\t0x1f46, 0x1f47,\n\t0x1f4e, 0x1f4f,\n\t0x1f58, 0x1f58,\n\t0x1f5a, 0x1f5a,\n\t0x1f5c, 0x1f5c,\n\t0x1f5e, 0x1f5e,\n\t0x1f7e, 0x1f7f,\n\t0x1fb5, 0x1fb5,\n\t0x1fc5, 0x1fc5,\n\t0x1fd4, 0x1fd5,\n\t0x1fdc, 0x1fdc,\n\t0x1ff0, 0x1ff1,\n\t0x1ff5, 0x1ff5,\n\t0x1fff, 0x1fff,\n\t0x2065, 0x2069,\n\t0x2072, 0x2073,\n\t0x208f, 0x208f,\n\t0x209d, 0x209f,\n\t0x20ba, 0x20cf,\n\t0x20f1, 0x20ff,\n\t0x218a, 0x218f,\n\t0x23f4, 0x23ff,\n\t0x2427, 0x243f,\n\t0x244b, 0x245f,\n\t0x2700, 0x2700,\n\t0x2b4d, 0x2b4f,\n\t0x2b5a, 0x2bff,\n\t0x2c2f, 0x2c2f,\n\t0x2c5f, 0x2c5f,\n\t0x2cf4, 0x2cf8,\n\t0x2d26, 0x2d26,\n\t0x2d28, 0x2d2c,\n\t0x2d2e, 0x2d2f,\n\t0x2d68, 0x2d6e,\n\t0x2d71, 0x2d7e,\n\t0x2d97, 0x2d9f,\n\t0x2da7, 0x2da7,\n\t0x2daf, 0x2daf,\n\t0x2db7, 0x2db7,\n\t0x2dbf, 0x2dbf,\n\t0x2dc7, 0x2dc7,\n\t0x2dcf, 0x2dcf,\n\t0x2dd7, 0x2dd7,\n\t0x2ddf, 0x2ddf,\n\t0x2e3c, 0x2e7f,\n\t0x2e9a, 0x2e9a,\n\t0x2ef4, 0x2eff,\n\t0x2fd6, 0x2fef,\n\t0x2ffc, 0x2fff,\n\t0x3040, 0x3040,\n\t0x3097, 0x3098,\n\t0x3100, 0x3104,\n\t0x312e, 0x3130,\n\t0x318f, 0x318f,\n\t0x31bb, 0x31bf,\n\t0x31e4, 0x31ef,\n\t0x321f, 0x321f,\n\t0x32ff, 0x32ff,\n\t0x4db6, 0x4dbf,\n\t0x9fcd, 0x9fff,\n\t0xa48d, 0xa48f,\n\t0xa4c7, 0xa4cf,\n\t0xa62c, 0xa63f,\n\t0xa698, 0xa69e,\n\t0xa6f8, 0xa6ff,\n\t0xa78f, 0xa78f,\n\t0xa794, 0xa79f,\n\t0xa7ab, 0xa7f7,\n\t0xa82c, 0xa82f,\n\t0xa83a, 0xa83f,\n\t0xa878, 0xa87f,\n\t0xa8c5, 0xa8cd,\n\t0xa8da, 0xa8df,\n\t0xa8fc, 0xa8ff,\n\t0xa954, 0xa95e,\n\t0xa97d, 0xa97f,\n\t0xa9ce, 0xa9ce,\n\t0xa9da, 0xa9dd,\n\t0xa9e0, 0xa9ff,\n\t0xaa37, 0xaa3f,\n\t0xaa4e, 0xaa4f,\n\t0xaa5a, 0xaa5b,\n\t0xaa7c, 0xaa7f,\n\t0xaac3, 0xaada,\n\t0xaaf7, 0xab00,\n\t0xab07, 0xab08,\n\t0xab0f, 0xab10,\n\t0xab17, 0xab1f,\n\t0xab27, 0xab27,\n\t0xab2f, 0xabbf,\n\t0xabee, 0xabef,\n\t0xabfa, 0xabff,\n\t0xd7a4, 0xd7af,\n\t0xd7c7, 0xd7ca,\n\t0xd7fc, 0xd7ff,\n\t0xfa6e, 0xfa6f,\n\t0xfada, 0xfaff,\n\t0xfb07, 0xfb12,\n\t0xfb18, 0xfb1c,\n\t0xfb37, 0xfb37,\n\t0xfb3d, 0xfb3d,\n\t0xfb3f, 0xfb3f,\n\t0xfb42, 0xfb42,\n\t0xfb45, 0xfb45,\n\t0xfbc2, 0xfbd2,\n\t0xfd40, 0xfd4f,\n\t0xfd90, 0xfd91,\n\t0xfdc8, 0xfdef,\n\t0xfdfe, 0xfdff,\n\t0xfe1a, 0xfe1f,\n\t0xfe27, 0xfe2f,\n\t0xfe53, 0xfe53,\n\t0xfe67, 0xfe67,\n\t0xfe6c, 0xfe6f,\n\t0xfe75, 0xfe75,\n\t0xfefd, 0xfefe,\n\t0xff00, 0xff00,\n\t0xffbf, 0xffc1,\n\t0xffc8, 0xffc9,\n\t0xffd0, 0xffd1,\n\t0xffd8, 0xffd9,\n\t0xffdd, 0xffdf,\n\t0xffe7, 0xffe7,\n\t0xffef, 0xfff8,\n\t0xfffe, 0xffff,\n\t0x1000c, 0x1000c,\n\t0x10027, 0x10027,\n\t0x1003b, 0x1003b,\n\t0x1003e, 0x1003e,\n\t0x1004e, 0x1004f,\n\t0x1005e, 0x1007f,\n\t0x100fb, 0x100ff,\n\t0x10103, 0x10106,\n\t0x10134, 0x10136,\n\t0x1018b, 0x1018f,\n\t0x1019c, 0x101cf,\n\t0x101fe, 0x1027f,\n\t0x1029d, 0x1029f,\n\t0x102d1, 0x102ff,\n\t0x1031f, 0x1031f,\n\t0x10324, 0x1032f,\n\t0x1034b, 0x1037f,\n\t0x1039e, 0x1039e,\n\t0x103c4, 0x103c7,\n\t0x103d6, 0x103ff,\n\t0x1049e, 0x1049f,\n\t0x104aa, 0x107ff,\n\t0x10806, 0x10807,\n\t0x10809, 0x10809,\n\t0x10836, 0x10836,\n\t0x10839, 0x1083b,\n\t0x1083d, 0x1083e,\n\t0x10856, 0x10856,\n\t0x10860, 0x108ff,\n\t0x1091c, 0x1091e,\n\t0x1093a, 0x1093e,\n\t0x10940, 0x1097f,\n\t0x109b8, 0x109bd,\n\t0x109c0, 0x109ff,\n\t0x10a04, 0x10a04,\n\t0x10a07, 0x10a0b,\n\t0x10a14, 0x10a14,\n\t0x10a18, 0x10a18,\n\t0x10a34, 0x10a37,\n\t0x10a3b, 0x10a3e,\n\t0x10a48, 0x10a4f,\n\t0x10a59, 0x10a5f,\n\t0x10a80, 0x10aff,\n\t0x10b36, 0x10b38,\n\t0x10b56, 0x10b57,\n\t0x10b73, 0x10b77,\n\t0x10b80, 0x10bff,\n\t0x10c49, 0x10e5f,\n\t0x10e7f, 0x10fff,\n\t0x1104e, 0x11051,\n\t0x11070, 0x1107f,\n\t0x110c2, 0x110cf,\n\t0x110e9, 0x110ef,\n\t0x110fa, 0x110ff,\n\t0x11135, 0x11135,\n\t0x11144, 0x1117f,\n\t0x111c9, 0x111cf,\n\t0x111da, 0x1167f,\n\t0x116b8, 0x116bf,\n\t0x116ca, 0x11fff,\n\t0x1236f, 0x123ff,\n\t0x12463, 0x1246f,\n\t0x12474, 0x12fff,\n\t0x1342f, 0x167ff,\n\t0x16a39, 0x16eff,\n\t0x16f45, 0x16f4f,\n\t0x16f7f, 0x16f8e,\n\t0x16fa0, 0x1afff,\n\t0x1b002, 0x1cfff,\n\t0x1d0f6, 0x1d0ff,\n\t0x1d127, 0x1d128,\n\t0x1d1de, 0x1d1ff,\n\t0x1d246, 0x1d2ff,\n\t0x1d357, 0x1d35f,\n\t0x1d372, 0x1d3ff,\n\t0x1d455, 0x1d455,\n\t0x1d49d, 0x1d49d,\n\t0x1d4a0, 0x1d4a1,\n\t0x1d4a3, 0x1d4a4,\n\t0x1d4a7, 0x1d4a8,\n\t0x1d4ad, 0x1d4ad,\n\t0x1d4ba, 0x1d4ba,\n\t0x1d4bc, 0x1d4bc,\n\t0x1d4c4, 0x1d4c4,\n\t0x1d506, 0x1d506,\n\t0x1d50b, 0x1d50c,\n\t0x1d515, 0x1d515,\n\t0x1d51d, 0x1d51d,\n\t0x1d53a, 0x1d53a,\n\t0x1d53f, 0x1d53f,\n\t0x1d545, 0x1d545,\n\t0x1d547, 0x1d549,\n\t0x1d551, 0x1d551,\n\t0x1d6a6, 0x1d6a7,\n\t0x1d7cc, 0x1d7cd,\n\t0x1d800, 0x1edff,\n\t0x1ee04, 0x1ee04,\n\t0x1ee20, 0x1ee20,\n\t0x1ee23, 0x1ee23,\n\t0x1ee25, 0x1ee26,\n\t0x1ee28, 0x1ee28,\n\t0x1ee33, 0x1ee33,\n\t0x1ee38, 0x1ee38,\n\t0x1ee3a, 0x1ee3a,\n\t0x1ee3c, 0x1ee41,\n\t0x1ee43, 0x1ee46,\n\t0x1ee48, 0x1ee48,\n\t0x1ee4a, 0x1ee4a,\n\t0x1ee4c, 0x1ee4c,\n\t0x1ee50, 0x1ee50,\n\t0x1ee53, 0x1ee53,\n\t0x1ee55, 0x1ee56,\n\t0x1ee58, 0x1ee58,\n\t0x1ee5a, 0x1ee5a,\n\t0x1ee5c, 0x1ee5c,\n\t0x1ee5e, 0x1ee5e,\n\t0x1ee60, 0x1ee60,\n\t0x1ee63, 0x1ee63,\n\t0x1ee65, 0x1ee66,\n\t0x1ee6b, 0x1ee6b,\n\t0x1ee73, 0x1ee73,\n\t0x1ee78, 0x1ee78,\n\t0x1ee7d, 0x1ee7d,\n\t0x1ee7f, 0x1ee7f,\n\t0x1ee8a, 0x1ee8a,\n\t0x1ee9c, 0x1eea0,\n\t0x1eea4, 0x1eea4,\n\t0x1eeaa, 0x1eeaa,\n\t0x1eebc, 0x1eeef,\n\t0x1eef2, 0x1efff,\n\t0x1f02c, 0x1f02f,\n\t0x1f094, 0x1f09f,\n\t0x1f0af, 0x1f0b0,\n\t0x1f0bf, 0x1f0c0,\n\t0x1f0d0, 0x1f0d0,\n\t0x1f0e0, 0x1f0ff,\n\t0x1f10b, 0x1f10f,\n\t0x1f12f, 0x1f12f,\n\t0x1f16c, 0x1f16f,\n\t0x1f19b, 0x1f1e5,\n\t0x1f203, 0x1f20f,\n\t0x1f23b, 0x1f23f,\n\t0x1f249, 0x1f24f,\n\t0x1f252, 0x1f2ff,\n\t0x1f321, 0x1f32f,\n\t0x1f336, 0x1f336,\n\t0x1f37d, 0x1f37f,\n\t0x1f394, 0x1f39f,\n\t0x1f3c5, 0x1f3c5,\n\t0x1f3cb, 0x1f3df,\n\t0x1f3f1, 0x1f3ff,\n\t0x1f43f, 0x1f43f,\n\t0x1f441, 0x1f441,\n\t0x1f4f8, 0x1f4f8,\n\t0x1f4fd, 0x1f4ff,\n\t0x1f53e, 0x1f53f,\n\t0x1f544, 0x1f54f,\n\t0x1f568, 0x1f5fa,\n\t0x1f641, 0x1f644,\n\t0x1f650, 0x1f67f,\n\t0x1f6c6, 0x1f6ff,\n\t0x1f774, 0x1ffff,\n\t0x2a6d7, 0x2a6ff,\n\t0x2b735, 0x2b73f,\n\t0x2b81e, 0x2f7ff,\n\t0x2fa1e, 0xe0000,\n\t0xe0002, 0xe001f,\n\t0xe0080, 0xe00ff,\n\t0xe01f0, 0xeffff,\n\t0xffffe, 0xfffff,\n\t0x10fffe, 0x10ffff,\n}; /* CR_Cn */\n\n/* 'Co': General Category */\nstatic const OnigCodePoint CR_Co[] = {\n\t3,\n\t0xe000, 0xf8ff,\n\t0xf0000, 0xffffd,\n\t0x100000, 0x10fffd,\n}; /* CR_Co */\n\n/* 'Cs': General Category */\nstatic const OnigCodePoint CR_Cs[] = {\n\t1,\n\t0xd800, 0xdfff,\n}; /* CR_Cs */\n\n/* 'L': Major Category */\nstatic const OnigCodePoint CR_L[] = {\n\t486,\n\t0x0041, 0x005a,\n\t0x0061, 0x007a,\n\t0x00aa, 0x00aa,\n\t0x00b5, 0x00b5,\n\t0x00ba, 0x00ba,\n\t0x00c0, 0x00d6,\n\t0x00d8, 0x00f6,\n\t0x00f8, 0x02c1,\n\t0x02c6, 0x02d1,\n\t0x02e0, 0x02e4,\n\t0x02ec, 0x02ec,\n\t0x02ee, 0x02ee,\n\t0x0370, 0x0374,\n\t0x0376, 0x0377,\n\t0x037a, 0x037d,\n\t0x0386, 0x0386,\n\t0x0388, 0x038a,\n\t0x038c, 0x038c,\n\t0x038e, 0x03a1,\n\t0x03a3, 0x03f5,\n\t0x03f7, 0x0481,\n\t0x048a, 0x0527,\n\t0x0531, 0x0556,\n\t0x0559, 0x0559,\n\t0x0561, 0x0587,\n\t0x05d0, 0x05ea,\n\t0x05f0, 0x05f2,\n\t0x0620, 0x064a,\n\t0x066e, 0x066f,\n\t0x0671, 0x06d3,\n\t0x06d5, 0x06d5,\n\t0x06e5, 0x06e6,\n\t0x06ee, 0x06ef,\n\t0x06fa, 0x06fc,\n\t0x06ff, 0x06ff,\n\t0x0710, 0x0710,\n\t0x0712, 0x072f,\n\t0x074d, 0x07a5,\n\t0x07b1, 0x07b1,\n\t0x07ca, 0x07ea,\n\t0x07f4, 0x07f5,\n\t0x07fa, 0x07fa,\n\t0x0800, 0x0815,\n\t0x081a, 0x081a,\n\t0x0824, 0x0824,\n\t0x0828, 0x0828,\n\t0x0840, 0x0858,\n\t0x08a0, 0x08a0,\n\t0x08a2, 0x08ac,\n\t0x0904, 0x0939,\n\t0x093d, 0x093d,\n\t0x0950, 0x0950,\n\t0x0958, 0x0961,\n\t0x0971, 0x0977,\n\t0x0979, 0x097f,\n\t0x0985, 0x098c,\n\t0x098f, 0x0990,\n\t0x0993, 0x09a8,\n\t0x09aa, 0x09b0,\n\t0x09b2, 0x09b2,\n\t0x09b6, 0x09b9,\n\t0x09bd, 0x09bd,\n\t0x09ce, 0x09ce,\n\t0x09dc, 0x09dd,\n\t0x09df, 0x09e1,\n\t0x09f0, 0x09f1,\n\t0x0a05, 0x0a0a,\n\t0x0a0f, 0x0a10,\n\t0x0a13, 0x0a28,\n\t0x0a2a, 0x0a30,\n\t0x0a32, 0x0a33,\n\t0x0a35, 0x0a36,\n\t0x0a38, 0x0a39,\n\t0x0a59, 0x0a5c,\n\t0x0a5e, 0x0a5e,\n\t0x0a72, 0x0a74,\n\t0x0a85, 0x0a8d,\n\t0x0a8f, 0x0a91,\n\t0x0a93, 0x0aa8,\n\t0x0aaa, 0x0ab0,\n\t0x0ab2, 0x0ab3,\n\t0x0ab5, 0x0ab9,\n\t0x0abd, 0x0abd,\n\t0x0ad0, 0x0ad0,\n\t0x0ae0, 0x0ae1,\n\t0x0b05, 0x0b0c,\n\t0x0b0f, 0x0b10,\n\t0x0b13, 0x0b28,\n\t0x0b2a, 0x0b30,\n\t0x0b32, 0x0b33,\n\t0x0b35, 0x0b39,\n\t0x0b3d, 0x0b3d,\n\t0x0b5c, 0x0b5d,\n\t0x0b5f, 0x0b61,\n\t0x0b71, 0x0b71,\n\t0x0b83, 0x0b83,\n\t0x0b85, 0x0b8a,\n\t0x0b8e, 0x0b90,\n\t0x0b92, 0x0b95,\n\t0x0b99, 0x0b9a,\n\t0x0b9c, 0x0b9c,\n\t0x0b9e, 0x0b9f,\n\t0x0ba3, 0x0ba4,\n\t0x0ba8, 0x0baa,\n\t0x0bae, 0x0bb9,\n\t0x0bd0, 0x0bd0,\n\t0x0c05, 0x0c0c,\n\t0x0c0e, 0x0c10,\n\t0x0c12, 0x0c28,\n\t0x0c2a, 0x0c33,\n\t0x0c35, 0x0c39,\n\t0x0c3d, 0x0c3d,\n\t0x0c58, 0x0c59,\n\t0x0c60, 0x0c61,\n\t0x0c85, 0x0c8c,\n\t0x0c8e, 0x0c90,\n\t0x0c92, 0x0ca8,\n\t0x0caa, 0x0cb3,\n\t0x0cb5, 0x0cb9,\n\t0x0cbd, 0x0cbd,\n\t0x0cde, 0x0cde,\n\t0x0ce0, 0x0ce1,\n\t0x0cf1, 0x0cf2,\n\t0x0d05, 0x0d0c,\n\t0x0d0e, 0x0d10,\n\t0x0d12, 0x0d3a,\n\t0x0d3d, 0x0d3d,\n\t0x0d4e, 0x0d4e,\n\t0x0d60, 0x0d61,\n\t0x0d7a, 0x0d7f,\n\t0x0d85, 0x0d96,\n\t0x0d9a, 0x0db1,\n\t0x0db3, 0x0dbb,\n\t0x0dbd, 0x0dbd,\n\t0x0dc0, 0x0dc6,\n\t0x0e01, 0x0e30,\n\t0x0e32, 0x0e33,\n\t0x0e40, 0x0e46,\n\t0x0e81, 0x0e82,\n\t0x0e84, 0x0e84,\n\t0x0e87, 0x0e88,\n\t0x0e8a, 0x0e8a,\n\t0x0e8d, 0x0e8d,\n\t0x0e94, 0x0e97,\n\t0x0e99, 0x0e9f,\n\t0x0ea1, 0x0ea3,\n\t0x0ea5, 0x0ea5,\n\t0x0ea7, 0x0ea7,\n\t0x0eaa, 0x0eab,\n\t0x0ead, 0x0eb0,\n\t0x0eb2, 0x0eb3,\n\t0x0ebd, 0x0ebd,\n\t0x0ec0, 0x0ec4,\n\t0x0ec6, 0x0ec6,\n\t0x0edc, 0x0edf,\n\t0x0f00, 0x0f00,\n\t0x0f40, 0x0f47,\n\t0x0f49, 0x0f6c,\n\t0x0f88, 0x0f8c,\n\t0x1000, 0x102a,\n\t0x103f, 0x103f,\n\t0x1050, 0x1055,\n\t0x105a, 0x105d,\n\t0x1061, 0x1061,\n\t0x1065, 0x1066,\n\t0x106e, 0x1070,\n\t0x1075, 0x1081,\n\t0x108e, 0x108e,\n\t0x10a0, 0x10c5,\n\t0x10c7, 0x10c7,\n\t0x10cd, 0x10cd,\n\t0x10d0, 0x10fa,\n\t0x10fc, 0x1248,\n\t0x124a, 0x124d,\n\t0x1250, 0x1256,\n\t0x1258, 0x1258,\n\t0x125a, 0x125d,\n\t0x1260, 0x1288,\n\t0x128a, 0x128d,\n\t0x1290, 0x12b0,\n\t0x12b2, 0x12b5,\n\t0x12b8, 0x12be,\n\t0x12c0, 0x12c0,\n\t0x12c2, 0x12c5,\n\t0x12c8, 0x12d6,\n\t0x12d8, 0x1310,\n\t0x1312, 0x1315,\n\t0x1318, 0x135a,\n\t0x1380, 0x138f,\n\t0x13a0, 0x13f4,\n\t0x1401, 0x166c,\n\t0x166f, 0x167f,\n\t0x1681, 0x169a,\n\t0x16a0, 0x16ea,\n\t0x1700, 0x170c,\n\t0x170e, 0x1711,\n\t0x1720, 0x1731,\n\t0x1740, 0x1751,\n\t0x1760, 0x176c,\n\t0x176e, 0x1770,\n\t0x1780, 0x17b3,\n\t0x17d7, 0x17d7,\n\t0x17dc, 0x17dc,\n\t0x1820, 0x1877,\n\t0x1880, 0x18a8,\n\t0x18aa, 0x18aa,\n\t0x18b0, 0x18f5,\n\t0x1900, 0x191c,\n\t0x1950, 0x196d,\n\t0x1970, 0x1974,\n\t0x1980, 0x19ab,\n\t0x19c1, 0x19c7,\n\t0x1a00, 0x1a16,\n\t0x1a20, 0x1a54,\n\t0x1aa7, 0x1aa7,\n\t0x1b05, 0x1b33,\n\t0x1b45, 0x1b4b,\n\t0x1b83, 0x1ba0,\n\t0x1bae, 0x1baf,\n\t0x1bba, 0x1be5,\n\t0x1c00, 0x1c23,\n\t0x1c4d, 0x1c4f,\n\t0x1c5a, 0x1c7d,\n\t0x1ce9, 0x1cec,\n\t0x1cee, 0x1cf1,\n\t0x1cf5, 0x1cf6,\n\t0x1d00, 0x1dbf,\n\t0x1e00, 0x1f15,\n\t0x1f18, 0x1f1d,\n\t0x1f20, 0x1f45,\n\t0x1f48, 0x1f4d,\n\t0x1f50, 0x1f57,\n\t0x1f59, 0x1f59,\n\t0x1f5b, 0x1f5b,\n\t0x1f5d, 0x1f5d,\n\t0x1f5f, 0x1f7d,\n\t0x1f80, 0x1fb4,\n\t0x1fb6, 0x1fbc,\n\t0x1fbe, 0x1fbe,\n\t0x1fc2, 0x1fc4,\n\t0x1fc6, 0x1fcc,\n\t0x1fd0, 0x1fd3,\n\t0x1fd6, 0x1fdb,\n\t0x1fe0, 0x1fec,\n\t0x1ff2, 0x1ff4,\n\t0x1ff6, 0x1ffc,\n\t0x2071, 0x2071,\n\t0x207f, 0x207f,\n\t0x2090, 0x209c,\n\t0x2102, 0x2102,\n\t0x2107, 0x2107,\n\t0x210a, 0x2113,\n\t0x2115, 0x2115,\n\t0x2119, 0x211d,\n\t0x2124, 0x2124,\n\t0x2126, 0x2126,\n\t0x2128, 0x2128,\n\t0x212a, 0x212d,\n\t0x212f, 0x2139,\n\t0x213c, 0x213f,\n\t0x2145, 0x2149,\n\t0x214e, 0x214e,\n\t0x2183, 0x2184,\n\t0x2c00, 0x2c2e,\n\t0x2c30, 0x2c5e,\n\t0x2c60, 0x2ce4,\n\t0x2ceb, 0x2cee,\n\t0x2cf2, 0x2cf3,\n\t0x2d00, 0x2d25,\n\t0x2d27, 0x2d27,\n\t0x2d2d, 0x2d2d,\n\t0x2d30, 0x2d67,\n\t0x2d6f, 0x2d6f,\n\t0x2d80, 0x2d96,\n\t0x2da0, 0x2da6,\n\t0x2da8, 0x2dae,\n\t0x2db0, 0x2db6,\n\t0x2db8, 0x2dbe,\n\t0x2dc0, 0x2dc6,\n\t0x2dc8, 0x2dce,\n\t0x2dd0, 0x2dd6,\n\t0x2dd8, 0x2dde,\n\t0x2e2f, 0x2e2f,\n\t0x3005, 0x3006,\n\t0x3031, 0x3035,\n\t0x303b, 0x303c,\n\t0x3041, 0x3096,\n\t0x309d, 0x309f,\n\t0x30a1, 0x30fa,\n\t0x30fc, 0x30ff,\n\t0x3105, 0x312d,\n\t0x3131, 0x318e,\n\t0x31a0, 0x31ba,\n\t0x31f0, 0x31ff,\n\t0x3400, 0x4db5,\n\t0x4e00, 0x9fcc,\n\t0xa000, 0xa48c,\n\t0xa4d0, 0xa4fd,\n\t0xa500, 0xa60c,\n\t0xa610, 0xa61f,\n\t0xa62a, 0xa62b,\n\t0xa640, 0xa66e,\n\t0xa67f, 0xa697,\n\t0xa6a0, 0xa6e5,\n\t0xa717, 0xa71f,\n\t0xa722, 0xa788,\n\t0xa78b, 0xa78e,\n\t0xa790, 0xa793,\n\t0xa7a0, 0xa7aa,\n\t0xa7f8, 0xa801,\n\t0xa803, 0xa805,\n\t0xa807, 0xa80a,\n\t0xa80c, 0xa822,\n\t0xa840, 0xa873,\n\t0xa882, 0xa8b3,\n\t0xa8f2, 0xa8f7,\n\t0xa8fb, 0xa8fb,\n\t0xa90a, 0xa925,\n\t0xa930, 0xa946,\n\t0xa960, 0xa97c,\n\t0xa984, 0xa9b2,\n\t0xa9cf, 0xa9cf,\n\t0xaa00, 0xaa28,\n\t0xaa40, 0xaa42,\n\t0xaa44, 0xaa4b,\n\t0xaa60, 0xaa76,\n\t0xaa7a, 0xaa7a,\n\t0xaa80, 0xaaaf,\n\t0xaab1, 0xaab1,\n\t0xaab5, 0xaab6,\n\t0xaab9, 0xaabd,\n\t0xaac0, 0xaac0,\n\t0xaac2, 0xaac2,\n\t0xaadb, 0xaadd,\n\t0xaae0, 0xaaea,\n\t0xaaf2, 0xaaf4,\n\t0xab01, 0xab06,\n\t0xab09, 0xab0e,\n\t0xab11, 0xab16,\n\t0xab20, 0xab26,\n\t0xab28, 0xab2e,\n\t0xabc0, 0xabe2,\n\t0xac00, 0xd7a3,\n\t0xd7b0, 0xd7c6,\n\t0xd7cb, 0xd7fb,\n\t0xf900, 0xfa6d,\n\t0xfa70, 0xfad9,\n\t0xfb00, 0xfb06,\n\t0xfb13, 0xfb17,\n\t0xfb1d, 0xfb1d,\n\t0xfb1f, 0xfb28,\n\t0xfb2a, 0xfb36,\n\t0xfb38, 0xfb3c,\n\t0xfb3e, 0xfb3e,\n\t0xfb40, 0xfb41,\n\t0xfb43, 0xfb44,\n\t0xfb46, 0xfbb1,\n\t0xfbd3, 0xfd3d,\n\t0xfd50, 0xfd8f,\n\t0xfd92, 0xfdc7,\n\t0xfdf0, 0xfdfb,\n\t0xfe70, 0xfe74,\n\t0xfe76, 0xfefc,\n\t0xff21, 0xff3a,\n\t0xff41, 0xff5a,\n\t0xff66, 0xffbe,\n\t0xffc2, 0xffc7,\n\t0xffca, 0xffcf,\n\t0xffd2, 0xffd7,\n\t0xffda, 0xffdc,\n\t0x10000, 0x1000b,\n\t0x1000d, 0x10026,\n\t0x10028, 0x1003a,\n\t0x1003c, 0x1003d,\n\t0x1003f, 0x1004d,\n\t0x10050, 0x1005d,\n\t0x10080, 0x100fa,\n\t0x10280, 0x1029c,\n\t0x102a0, 0x102d0,\n\t0x10300, 0x1031e,\n\t0x10330, 0x10340,\n\t0x10342, 0x10349,\n\t0x10380, 0x1039d,\n\t0x103a0, 0x103c3,\n\t0x103c8, 0x103cf,\n\t0x10400, 0x1049d,\n\t0x10800, 0x10805,\n\t0x10808, 0x10808,\n\t0x1080a, 0x10835,\n\t0x10837, 0x10838,\n\t0x1083c, 0x1083c,\n\t0x1083f, 0x10855,\n\t0x10900, 0x10915,\n\t0x10920, 0x10939,\n\t0x10980, 0x109b7,\n\t0x109be, 0x109bf,\n\t0x10a00, 0x10a00,\n\t0x10a10, 0x10a13,\n\t0x10a15, 0x10a17,\n\t0x10a19, 0x10a33,\n\t0x10a60, 0x10a7c,\n\t0x10b00, 0x10b35,\n\t0x10b40, 0x10b55,\n\t0x10b60, 0x10b72,\n\t0x10c00, 0x10c48,\n\t0x11003, 0x11037,\n\t0x11083, 0x110af,\n\t0x110d0, 0x110e8,\n\t0x11103, 0x11126,\n\t0x11183, 0x111b2,\n\t0x111c1, 0x111c4,\n\t0x11680, 0x116aa,\n\t0x12000, 0x1236e,\n\t0x13000, 0x1342e,\n\t0x16800, 0x16a38,\n\t0x16f00, 0x16f44,\n\t0x16f50, 0x16f50,\n\t0x16f93, 0x16f9f,\n\t0x1b000, 0x1b001,\n\t0x1d400, 0x1d454,\n\t0x1d456, 0x1d49c,\n\t0x1d49e, 0x1d49f,\n\t0x1d4a2, 0x1d4a2,\n\t0x1d4a5, 0x1d4a6,\n\t0x1d4a9, 0x1d4ac,\n\t0x1d4ae, 0x1d4b9,\n\t0x1d4bb, 0x1d4bb,\n\t0x1d4bd, 0x1d4c3,\n\t0x1d4c5, 0x1d505,\n\t0x1d507, 0x1d50a,\n\t0x1d50d, 0x1d514,\n\t0x1d516, 0x1d51c,\n\t0x1d51e, 0x1d539,\n\t0x1d53b, 0x1d53e,\n\t0x1d540, 0x1d544,\n\t0x1d546, 0x1d546,\n\t0x1d54a, 0x1d550,\n\t0x1d552, 0x1d6a5,\n\t0x1d6a8, 0x1d6c0,\n\t0x1d6c2, 0x1d6da,\n\t0x1d6dc, 0x1d6fa,\n\t0x1d6fc, 0x1d714,\n\t0x1d716, 0x1d734,\n\t0x1d736, 0x1d74e,\n\t0x1d750, 0x1d76e,\n\t0x1d770, 0x1d788,\n\t0x1d78a, 0x1d7a8,\n\t0x1d7aa, 0x1d7c2,\n\t0x1d7c4, 0x1d7cb,\n\t0x1ee00, 0x1ee03,\n\t0x1ee05, 0x1ee1f,\n\t0x1ee21, 0x1ee22,\n\t0x1ee24, 0x1ee24,\n\t0x1ee27, 0x1ee27,\n\t0x1ee29, 0x1ee32,\n\t0x1ee34, 0x1ee37,\n\t0x1ee39, 0x1ee39,\n\t0x1ee3b, 0x1ee3b,\n\t0x1ee42, 0x1ee42,\n\t0x1ee47, 0x1ee47,\n\t0x1ee49, 0x1ee49,\n\t0x1ee4b, 0x1ee4b,\n\t0x1ee4d, 0x1ee4f,\n\t0x1ee51, 0x1ee52,\n\t0x1ee54, 0x1ee54,\n\t0x1ee57, 0x1ee57,\n\t0x1ee59, 0x1ee59,\n\t0x1ee5b, 0x1ee5b,\n\t0x1ee5d, 0x1ee5d,\n\t0x1ee5f, 0x1ee5f,\n\t0x1ee61, 0x1ee62,\n\t0x1ee64, 0x1ee64,\n\t0x1ee67, 0x1ee6a,\n\t0x1ee6c, 0x1ee72,\n\t0x1ee74, 0x1ee77,\n\t0x1ee79, 0x1ee7c,\n\t0x1ee7e, 0x1ee7e,\n\t0x1ee80, 0x1ee89,\n\t0x1ee8b, 0x1ee9b,\n\t0x1eea1, 0x1eea3,\n\t0x1eea5, 0x1eea9,\n\t0x1eeab, 0x1eebb,\n\t0x20000, 0x2a6d6,\n\t0x2a700, 0x2b734,\n\t0x2b740, 0x2b81d,\n\t0x2f800, 0x2fa1d,\n}; /* CR_L */\n\n/* 'LC': General Category */\nstatic const OnigCodePoint CR_LC[] = {\n\t113,\n\t0x0041, 0x005a,\n\t0x0061, 0x007a,\n\t0x00b5, 0x00b5,\n\t0x00c0, 0x00d6,\n\t0x00d8, 0x00f6,\n\t0x00f8, 0x01ba,\n\t0x01bc, 0x01bf,\n\t0x01c4, 0x0293,\n\t0x0295, 0x02af,\n\t0x0370, 0x0373,\n\t0x0376, 0x0377,\n\t0x037b, 0x037d,\n\t0x0386, 0x0386,\n\t0x0388, 0x038a,\n\t0x038c, 0x038c,\n\t0x038e, 0x03a1,\n\t0x03a3, 0x03f5,\n\t0x03f7, 0x0481,\n\t0x048a, 0x0527,\n\t0x0531, 0x0556,\n\t0x0561, 0x0587,\n\t0x10a0, 0x10c5,\n\t0x10c7, 0x10c7,\n\t0x10cd, 0x10cd,\n\t0x1d00, 0x1d2b,\n\t0x1d6b, 0x1d77,\n\t0x1d79, 0x1d9a,\n\t0x1e00, 0x1f15,\n\t0x1f18, 0x1f1d,\n\t0x1f20, 0x1f45,\n\t0x1f48, 0x1f4d,\n\t0x1f50, 0x1f57,\n\t0x1f59, 0x1f59,\n\t0x1f5b, 0x1f5b,\n\t0x1f5d, 0x1f5d,\n\t0x1f5f, 0x1f7d,\n\t0x1f80, 0x1fb4,\n\t0x1fb6, 0x1fbc,\n\t0x1fbe, 0x1fbe,\n\t0x1fc2, 0x1fc4,\n\t0x1fc6, 0x1fcc,\n\t0x1fd0, 0x1fd3,\n\t0x1fd6, 0x1fdb,\n\t0x1fe0, 0x1fec,\n\t0x1ff2, 0x1ff4,\n\t0x1ff6, 0x1ffc,\n\t0x2102, 0x2102,\n\t0x2107, 0x2107,\n\t0x210a, 0x2113,\n\t0x2115, 0x2115,\n\t0x2119, 0x211d,\n\t0x2124, 0x2124,\n\t0x2126, 0x2126,\n\t0x2128, 0x2128,\n\t0x212a, 0x212d,\n\t0x212f, 0x2134,\n\t0x2139, 0x2139,\n\t0x213c, 0x213f,\n\t0x2145, 0x2149,\n\t0x214e, 0x214e,\n\t0x2183, 0x2184,\n\t0x2c00, 0x2c2e,\n\t0x2c30, 0x2c5e,\n\t0x2c60, 0x2c7b,\n\t0x2c7e, 0x2ce4,\n\t0x2ceb, 0x2cee,\n\t0x2cf2, 0x2cf3,\n\t0x2d00, 0x2d25,\n\t0x2d27, 0x2d27,\n\t0x2d2d, 0x2d2d,\n\t0xa640, 0xa66d,\n\t0xa680, 0xa697,\n\t0xa722, 0xa76f,\n\t0xa771, 0xa787,\n\t0xa78b, 0xa78e,\n\t0xa790, 0xa793,\n\t0xa7a0, 0xa7aa,\n\t0xa7fa, 0xa7fa,\n\t0xfb00, 0xfb06,\n\t0xfb13, 0xfb17,\n\t0xff21, 0xff3a,\n\t0xff41, 0xff5a,\n\t0x10400, 0x1044f,\n\t0x1d400, 0x1d454,\n\t0x1d456, 0x1d49c,\n\t0x1d49e, 0x1d49f,\n\t0x1d4a2, 0x1d4a2,\n\t0x1d4a5, 0x1d4a6,\n\t0x1d4a9, 0x1d4ac,\n\t0x1d4ae, 0x1d4b9,\n\t0x1d4bb, 0x1d4bb,\n\t0x1d4bd, 0x1d4c3,\n\t0x1d4c5, 0x1d505,\n\t0x1d507, 0x1d50a,\n\t0x1d50d, 0x1d514,\n\t0x1d516, 0x1d51c,\n\t0x1d51e, 0x1d539,\n\t0x1d53b, 0x1d53e,\n\t0x1d540, 0x1d544,\n\t0x1d546, 0x1d546,\n\t0x1d54a, 0x1d550,\n\t0x1d552, 0x1d6a5,\n\t0x1d6a8, 0x1d6c0,\n\t0x1d6c2, 0x1d6da,\n\t0x1d6dc, 0x1d6fa,\n\t0x1d6fc, 0x1d714,\n\t0x1d716, 0x1d734,\n\t0x1d736, 0x1d74e,\n\t0x1d750, 0x1d76e,\n\t0x1d770, 0x1d788,\n\t0x1d78a, 0x1d7a8,\n\t0x1d7aa, 0x1d7c2,\n\t0x1d7c4, 0x1d7cb,\n}; /* CR_LC */\n\n/* 'Ll': General Category */\nstatic const OnigCodePoint CR_Ll[] = {\n\t611,\n\t0x0061, 0x007a,\n\t0x00b5, 0x00b5,\n\t0x00df, 0x00f6,\n\t0x00f8, 0x00ff,\n\t0x0101, 0x0101,\n\t0x0103, 0x0103,\n\t0x0105, 0x0105,\n\t0x0107, 0x0107,\n\t0x0109, 0x0109,\n\t0x010b, 0x010b,\n\t0x010d, 0x010d,\n\t0x010f, 0x010f,\n\t0x0111, 0x0111,\n\t0x0113, 0x0113,\n\t0x0115, 0x0115,\n\t0x0117, 0x0117,\n\t0x0119, 0x0119,\n\t0x011b, 0x011b,\n\t0x011d, 0x011d,\n\t0x011f, 0x011f,\n\t0x0121, 0x0121,\n\t0x0123, 0x0123,\n\t0x0125, 0x0125,\n\t0x0127, 0x0127,\n\t0x0129, 0x0129,\n\t0x012b, 0x012b,\n\t0x012d, 0x012d,\n\t0x012f, 0x012f,\n\t0x0131, 0x0131,\n\t0x0133, 0x0133,\n\t0x0135, 0x0135,\n\t0x0137, 0x0138,\n\t0x013a, 0x013a,\n\t0x013c, 0x013c,\n\t0x013e, 0x013e,\n\t0x0140, 0x0140,\n\t0x0142, 0x0142,\n\t0x0144, 0x0144,\n\t0x0146, 0x0146,\n\t0x0148, 0x0149,\n\t0x014b, 0x014b,\n\t0x014d, 0x014d,\n\t0x014f, 0x014f,\n\t0x0151, 0x0151,\n\t0x0153, 0x0153,\n\t0x0155, 0x0155,\n\t0x0157, 0x0157,\n\t0x0159, 0x0159,\n\t0x015b, 0x015b,\n\t0x015d, 0x015d,\n\t0x015f, 0x015f,\n\t0x0161, 0x0161,\n\t0x0163, 0x0163,\n\t0x0165, 0x0165,\n\t0x0167, 0x0167,\n\t0x0169, 0x0169,\n\t0x016b, 0x016b,\n\t0x016d, 0x016d,\n\t0x016f, 0x016f,\n\t0x0171, 0x0171,\n\t0x0173, 0x0173,\n\t0x0175, 0x0175,\n\t0x0177, 0x0177,\n\t0x017a, 0x017a,\n\t0x017c, 0x017c,\n\t0x017e, 0x0180,\n\t0x0183, 0x0183,\n\t0x0185, 0x0185,\n\t0x0188, 0x0188,\n\t0x018c, 0x018d,\n\t0x0192, 0x0192,\n\t0x0195, 0x0195,\n\t0x0199, 0x019b,\n\t0x019e, 0x019e,\n\t0x01a1, 0x01a1,\n\t0x01a3, 0x01a3,\n\t0x01a5, 0x01a5,\n\t0x01a8, 0x01a8,\n\t0x01aa, 0x01ab,\n\t0x01ad, 0x01ad,\n\t0x01b0, 0x01b0,\n\t0x01b4, 0x01b4,\n\t0x01b6, 0x01b6,\n\t0x01b9, 0x01ba,\n\t0x01bd, 0x01bf,\n\t0x01c6, 0x01c6,\n\t0x01c9, 0x01c9,\n\t0x01cc, 0x01cc,\n\t0x01ce, 0x01ce,\n\t0x01d0, 0x01d0,\n\t0x01d2, 0x01d2,\n\t0x01d4, 0x01d4,\n\t0x01d6, 0x01d6,\n\t0x01d8, 0x01d8,\n\t0x01da, 0x01da,\n\t0x01dc, 0x01dd,\n\t0x01df, 0x01df,\n\t0x01e1, 0x01e1,\n\t0x01e3, 0x01e3,\n\t0x01e5, 0x01e5,\n\t0x01e7, 0x01e7,\n\t0x01e9, 0x01e9,\n\t0x01eb, 0x01eb,\n\t0x01ed, 0x01ed,\n\t0x01ef, 0x01f0,\n\t0x01f3, 0x01f3,\n\t0x01f5, 0x01f5,\n\t0x01f9, 0x01f9,\n\t0x01fb, 0x01fb,\n\t0x01fd, 0x01fd,\n\t0x01ff, 0x01ff,\n\t0x0201, 0x0201,\n\t0x0203, 0x0203,\n\t0x0205, 0x0205,\n\t0x0207, 0x0207,\n\t0x0209, 0x0209,\n\t0x020b, 0x020b,\n\t0x020d, 0x020d,\n\t0x020f, 0x020f,\n\t0x0211, 0x0211,\n\t0x0213, 0x0213,\n\t0x0215, 0x0215,\n\t0x0217, 0x0217,\n\t0x0219, 0x0219,\n\t0x021b, 0x021b,\n\t0x021d, 0x021d,\n\t0x021f, 0x021f,\n\t0x0221, 0x0221,\n\t0x0223, 0x0223,\n\t0x0225, 0x0225,\n\t0x0227, 0x0227,\n\t0x0229, 0x0229,\n\t0x022b, 0x022b,\n\t0x022d, 0x022d,\n\t0x022f, 0x022f,\n\t0x0231, 0x0231,\n\t0x0233, 0x0239,\n\t0x023c, 0x023c,\n\t0x023f, 0x0240,\n\t0x0242, 0x0242,\n\t0x0247, 0x0247,\n\t0x0249, 0x0249,\n\t0x024b, 0x024b,\n\t0x024d, 0x024d,\n\t0x024f, 0x0293,\n\t0x0295, 0x02af,\n\t0x0371, 0x0371,\n\t0x0373, 0x0373,\n\t0x0377, 0x0377,\n\t0x037b, 0x037d,\n\t0x0390, 0x0390,\n\t0x03ac, 0x03ce,\n\t0x03d0, 0x03d1,\n\t0x03d5, 0x03d7,\n\t0x03d9, 0x03d9,\n\t0x03db, 0x03db,\n\t0x03dd, 0x03dd,\n\t0x03df, 0x03df,\n\t0x03e1, 0x03e1,\n\t0x03e3, 0x03e3,\n\t0x03e5, 0x03e5,\n\t0x03e7, 0x03e7,\n\t0x03e9, 0x03e9,\n\t0x03eb, 0x03eb,\n\t0x03ed, 0x03ed,\n\t0x03ef, 0x03f3,\n\t0x03f5, 0x03f5,\n\t0x03f8, 0x03f8,\n\t0x03fb, 0x03fc,\n\t0x0430, 0x045f,\n\t0x0461, 0x0461,\n\t0x0463, 0x0463,\n\t0x0465, 0x0465,\n\t0x0467, 0x0467,\n\t0x0469, 0x0469,\n\t0x046b, 0x046b,\n\t0x046d, 0x046d,\n\t0x046f, 0x046f,\n\t0x0471, 0x0471,\n\t0x0473, 0x0473,\n\t0x0475, 0x0475,\n\t0x0477, 0x0477,\n\t0x0479, 0x0479,\n\t0x047b, 0x047b,\n\t0x047d, 0x047d,\n\t0x047f, 0x047f,\n\t0x0481, 0x0481,\n\t0x048b, 0x048b,\n\t0x048d, 0x048d,\n\t0x048f, 0x048f,\n\t0x0491, 0x0491,\n\t0x0493, 0x0493,\n\t0x0495, 0x0495,\n\t0x0497, 0x0497,\n\t0x0499, 0x0499,\n\t0x049b, 0x049b,\n\t0x049d, 0x049d,\n\t0x049f, 0x049f,\n\t0x04a1, 0x04a1,\n\t0x04a3, 0x04a3,\n\t0x04a5, 0x04a5,\n\t0x04a7, 0x04a7,\n\t0x04a9, 0x04a9,\n\t0x04ab, 0x04ab,\n\t0x04ad, 0x04ad,\n\t0x04af, 0x04af,\n\t0x04b1, 0x04b1,\n\t0x04b3, 0x04b3,\n\t0x04b5, 0x04b5,\n\t0x04b7, 0x04b7,\n\t0x04b9, 0x04b9,\n\t0x04bb, 0x04bb,\n\t0x04bd, 0x04bd,\n\t0x04bf, 0x04bf,\n\t0x04c2, 0x04c2,\n\t0x04c4, 0x04c4,\n\t0x04c6, 0x04c6,\n\t0x04c8, 0x04c8,\n\t0x04ca, 0x04ca,\n\t0x04cc, 0x04cc,\n\t0x04ce, 0x04cf,\n\t0x04d1, 0x04d1,\n\t0x04d3, 0x04d3,\n\t0x04d5, 0x04d5,\n\t0x04d7, 0x04d7,\n\t0x04d9, 0x04d9,\n\t0x04db, 0x04db,\n\t0x04dd, 0x04dd,\n\t0x04df, 0x04df,\n\t0x04e1, 0x04e1,\n\t0x04e3, 0x04e3,\n\t0x04e5, 0x04e5,\n\t0x04e7, 0x04e7,\n\t0x04e9, 0x04e9,\n\t0x04eb, 0x04eb,\n\t0x04ed, 0x04ed,\n\t0x04ef, 0x04ef,\n\t0x04f1, 0x04f1,\n\t0x04f3, 0x04f3,\n\t0x04f5, 0x04f5,\n\t0x04f7, 0x04f7,\n\t0x04f9, 0x04f9,\n\t0x04fb, 0x04fb,\n\t0x04fd, 0x04fd,\n\t0x04ff, 0x04ff,\n\t0x0501, 0x0501,\n\t0x0503, 0x0503,\n\t0x0505, 0x0505,\n\t0x0507, 0x0507,\n\t0x0509, 0x0509,\n\t0x050b, 0x050b,\n\t0x050d, 0x050d,\n\t0x050f, 0x050f,\n\t0x0511, 0x0511,\n\t0x0513, 0x0513,\n\t0x0515, 0x0515,\n\t0x0517, 0x0517,\n\t0x0519, 0x0519,\n\t0x051b, 0x051b,\n\t0x051d, 0x051d,\n\t0x051f, 0x051f,\n\t0x0521, 0x0521,\n\t0x0523, 0x0523,\n\t0x0525, 0x0525,\n\t0x0527, 0x0527,\n\t0x0561, 0x0587,\n\t0x1d00, 0x1d2b,\n\t0x1d6b, 0x1d77,\n\t0x1d79, 0x1d9a,\n\t0x1e01, 0x1e01,\n\t0x1e03, 0x1e03,\n\t0x1e05, 0x1e05,\n\t0x1e07, 0x1e07,\n\t0x1e09, 0x1e09,\n\t0x1e0b, 0x1e0b,\n\t0x1e0d, 0x1e0d,\n\t0x1e0f, 0x1e0f,\n\t0x1e11, 0x1e11,\n\t0x1e13, 0x1e13,\n\t0x1e15, 0x1e15,\n\t0x1e17, 0x1e17,\n\t0x1e19, 0x1e19,\n\t0x1e1b, 0x1e1b,\n\t0x1e1d, 0x1e1d,\n\t0x1e1f, 0x1e1f,\n\t0x1e21, 0x1e21,\n\t0x1e23, 0x1e23,\n\t0x1e25, 0x1e25,\n\t0x1e27, 0x1e27,\n\t0x1e29, 0x1e29,\n\t0x1e2b, 0x1e2b,\n\t0x1e2d, 0x1e2d,\n\t0x1e2f, 0x1e2f,\n\t0x1e31, 0x1e31,\n\t0x1e33, 0x1e33,\n\t0x1e35, 0x1e35,\n\t0x1e37, 0x1e37,\n\t0x1e39, 0x1e39,\n\t0x1e3b, 0x1e3b,\n\t0x1e3d, 0x1e3d,\n\t0x1e3f, 0x1e3f,\n\t0x1e41, 0x1e41,\n\t0x1e43, 0x1e43,\n\t0x1e45, 0x1e45,\n\t0x1e47, 0x1e47,\n\t0x1e49, 0x1e49,\n\t0x1e4b, 0x1e4b,\n\t0x1e4d, 0x1e4d,\n\t0x1e4f, 0x1e4f,\n\t0x1e51, 0x1e51,\n\t0x1e53, 0x1e53,\n\t0x1e55, 0x1e55,\n\t0x1e57, 0x1e57,\n\t0x1e59, 0x1e59,\n\t0x1e5b, 0x1e5b,\n\t0x1e5d, 0x1e5d,\n\t0x1e5f, 0x1e5f,\n\t0x1e61, 0x1e61,\n\t0x1e63, 0x1e63,\n\t0x1e65, 0x1e65,\n\t0x1e67, 0x1e67,\n\t0x1e69, 0x1e69,\n\t0x1e6b, 0x1e6b,\n\t0x1e6d, 0x1e6d,\n\t0x1e6f, 0x1e6f,\n\t0x1e71, 0x1e71,\n\t0x1e73, 0x1e73,\n\t0x1e75, 0x1e75,\n\t0x1e77, 0x1e77,\n\t0x1e79, 0x1e79,\n\t0x1e7b, 0x1e7b,\n\t0x1e7d, 0x1e7d,\n\t0x1e7f, 0x1e7f,\n\t0x1e81, 0x1e81,\n\t0x1e83, 0x1e83,\n\t0x1e85, 0x1e85,\n\t0x1e87, 0x1e87,\n\t0x1e89, 0x1e89,\n\t0x1e8b, 0x1e8b,\n\t0x1e8d, 0x1e8d,\n\t0x1e8f, 0x1e8f,\n\t0x1e91, 0x1e91,\n\t0x1e93, 0x1e93,\n\t0x1e95, 0x1e9d,\n\t0x1e9f, 0x1e9f,\n\t0x1ea1, 0x1ea1,\n\t0x1ea3, 0x1ea3,\n\t0x1ea5, 0x1ea5,\n\t0x1ea7, 0x1ea7,\n\t0x1ea9, 0x1ea9,\n\t0x1eab, 0x1eab,\n\t0x1ead, 0x1ead,\n\t0x1eaf, 0x1eaf,\n\t0x1eb1, 0x1eb1,\n\t0x1eb3, 0x1eb3,\n\t0x1eb5, 0x1eb5,\n\t0x1eb7, 0x1eb7,\n\t0x1eb9, 0x1eb9,\n\t0x1ebb, 0x1ebb,\n\t0x1ebd, 0x1ebd,\n\t0x1ebf, 0x1ebf,\n\t0x1ec1, 0x1ec1,\n\t0x1ec3, 0x1ec3,\n\t0x1ec5, 0x1ec5,\n\t0x1ec7, 0x1ec7,\n\t0x1ec9, 0x1ec9,\n\t0x1ecb, 0x1ecb,\n\t0x1ecd, 0x1ecd,\n\t0x1ecf, 0x1ecf,\n\t0x1ed1, 0x1ed1,\n\t0x1ed3, 0x1ed3,\n\t0x1ed5, 0x1ed5,\n\t0x1ed7, 0x1ed7,\n\t0x1ed9, 0x1ed9,\n\t0x1edb, 0x1edb,\n\t0x1edd, 0x1edd,\n\t0x1edf, 0x1edf,\n\t0x1ee1, 0x1ee1,\n\t0x1ee3, 0x1ee3,\n\t0x1ee5, 0x1ee5,\n\t0x1ee7, 0x1ee7,\n\t0x1ee9, 0x1ee9,\n\t0x1eeb, 0x1eeb,\n\t0x1eed, 0x1eed,\n\t0x1eef, 0x1eef,\n\t0x1ef1, 0x1ef1,\n\t0x1ef3, 0x1ef3,\n\t0x1ef5, 0x1ef5,\n\t0x1ef7, 0x1ef7,\n\t0x1ef9, 0x1ef9,\n\t0x1efb, 0x1efb,\n\t0x1efd, 0x1efd,\n\t0x1eff, 0x1f07,\n\t0x1f10, 0x1f15,\n\t0x1f20, 0x1f27,\n\t0x1f30, 0x1f37,\n\t0x1f40, 0x1f45,\n\t0x1f50, 0x1f57,\n\t0x1f60, 0x1f67,\n\t0x1f70, 0x1f7d,\n\t0x1f80, 0x1f87,\n\t0x1f90, 0x1f97,\n\t0x1fa0, 0x1fa7,\n\t0x1fb0, 0x1fb4,\n\t0x1fb6, 0x1fb7,\n\t0x1fbe, 0x1fbe,\n\t0x1fc2, 0x1fc4,\n\t0x1fc6, 0x1fc7,\n\t0x1fd0, 0x1fd3,\n\t0x1fd6, 0x1fd7,\n\t0x1fe0, 0x1fe7,\n\t0x1ff2, 0x1ff4,\n\t0x1ff6, 0x1ff7,\n\t0x210a, 0x210a,\n\t0x210e, 0x210f,\n\t0x2113, 0x2113,\n\t0x212f, 0x212f,\n\t0x2134, 0x2134,\n\t0x2139, 0x2139,\n\t0x213c, 0x213d,\n\t0x2146, 0x2149,\n\t0x214e, 0x214e,\n\t0x2184, 0x2184,\n\t0x2c30, 0x2c5e,\n\t0x2c61, 0x2c61,\n\t0x2c65, 0x2c66,\n\t0x2c68, 0x2c68,\n\t0x2c6a, 0x2c6a,\n\t0x2c6c, 0x2c6c,\n\t0x2c71, 0x2c71,\n\t0x2c73, 0x2c74,\n\t0x2c76, 0x2c7b,\n\t0x2c81, 0x2c81,\n\t0x2c83, 0x2c83,\n\t0x2c85, 0x2c85,\n\t0x2c87, 0x2c87,\n\t0x2c89, 0x2c89,\n\t0x2c8b, 0x2c8b,\n\t0x2c8d, 0x2c8d,\n\t0x2c8f, 0x2c8f,\n\t0x2c91, 0x2c91,\n\t0x2c93, 0x2c93,\n\t0x2c95, 0x2c95,\n\t0x2c97, 0x2c97,\n\t0x2c99, 0x2c99,\n\t0x2c9b, 0x2c9b,\n\t0x2c9d, 0x2c9d,\n\t0x2c9f, 0x2c9f,\n\t0x2ca1, 0x2ca1,\n\t0x2ca3, 0x2ca3,\n\t0x2ca5, 0x2ca5,\n\t0x2ca7, 0x2ca7,\n\t0x2ca9, 0x2ca9,\n\t0x2cab, 0x2cab,\n\t0x2cad, 0x2cad,\n\t0x2caf, 0x2caf,\n\t0x2cb1, 0x2cb1,\n\t0x2cb3, 0x2cb3,\n\t0x2cb5, 0x2cb5,\n\t0x2cb7, 0x2cb7,\n\t0x2cb9, 0x2cb9,\n\t0x2cbb, 0x2cbb,\n\t0x2cbd, 0x2cbd,\n\t0x2cbf, 0x2cbf,\n\t0x2cc1, 0x2cc1,\n\t0x2cc3, 0x2cc3,\n\t0x2cc5, 0x2cc5,\n\t0x2cc7, 0x2cc7,\n\t0x2cc9, 0x2cc9,\n\t0x2ccb, 0x2ccb,\n\t0x2ccd, 0x2ccd,\n\t0x2ccf, 0x2ccf,\n\t0x2cd1, 0x2cd1,\n\t0x2cd3, 0x2cd3,\n\t0x2cd5, 0x2cd5,\n\t0x2cd7, 0x2cd7,\n\t0x2cd9, 0x2cd9,\n\t0x2cdb, 0x2cdb,\n\t0x2cdd, 0x2cdd,\n\t0x2cdf, 0x2cdf,\n\t0x2ce1, 0x2ce1,\n\t0x2ce3, 0x2ce4,\n\t0x2cec, 0x2cec,\n\t0x2cee, 0x2cee,\n\t0x2cf3, 0x2cf3,\n\t0x2d00, 0x2d25,\n\t0x2d27, 0x2d27,\n\t0x2d2d, 0x2d2d,\n\t0xa641, 0xa641,\n\t0xa643, 0xa643,\n\t0xa645, 0xa645,\n\t0xa647, 0xa647,\n\t0xa649, 0xa649,\n\t0xa64b, 0xa64b,\n\t0xa64d, 0xa64d,\n\t0xa64f, 0xa64f,\n\t0xa651, 0xa651,\n\t0xa653, 0xa653,\n\t0xa655, 0xa655,\n\t0xa657, 0xa657,\n\t0xa659, 0xa659,\n\t0xa65b, 0xa65b,\n\t0xa65d, 0xa65d,\n\t0xa65f, 0xa65f,\n\t0xa661, 0xa661,\n\t0xa663, 0xa663,\n\t0xa665, 0xa665,\n\t0xa667, 0xa667,\n\t0xa669, 0xa669,\n\t0xa66b, 0xa66b,\n\t0xa66d, 0xa66d,\n\t0xa681, 0xa681,\n\t0xa683, 0xa683,\n\t0xa685, 0xa685,\n\t0xa687, 0xa687,\n\t0xa689, 0xa689,\n\t0xa68b, 0xa68b,\n\t0xa68d, 0xa68d,\n\t0xa68f, 0xa68f,\n\t0xa691, 0xa691,\n\t0xa693, 0xa693,\n\t0xa695, 0xa695,\n\t0xa697, 0xa697,\n\t0xa723, 0xa723,\n\t0xa725, 0xa725,\n\t0xa727, 0xa727,\n\t0xa729, 0xa729,\n\t0xa72b, 0xa72b,\n\t0xa72d, 0xa72d,\n\t0xa72f, 0xa731,\n\t0xa733, 0xa733,\n\t0xa735, 0xa735,\n\t0xa737, 0xa737,\n\t0xa739, 0xa739,\n\t0xa73b, 0xa73b,\n\t0xa73d, 0xa73d,\n\t0xa73f, 0xa73f,\n\t0xa741, 0xa741,\n\t0xa743, 0xa743,\n\t0xa745, 0xa745,\n\t0xa747, 0xa747,\n\t0xa749, 0xa749,\n\t0xa74b, 0xa74b,\n\t0xa74d, 0xa74d,\n\t0xa74f, 0xa74f,\n\t0xa751, 0xa751,\n\t0xa753, 0xa753,\n\t0xa755, 0xa755,\n\t0xa757, 0xa757,\n\t0xa759, 0xa759,\n\t0xa75b, 0xa75b,\n\t0xa75d, 0xa75d,\n\t0xa75f, 0xa75f,\n\t0xa761, 0xa761,\n\t0xa763, 0xa763,\n\t0xa765, 0xa765,\n\t0xa767, 0xa767,\n\t0xa769, 0xa769,\n\t0xa76b, 0xa76b,\n\t0xa76d, 0xa76d,\n\t0xa76f, 0xa76f,\n\t0xa771, 0xa778,\n\t0xa77a, 0xa77a,\n\t0xa77c, 0xa77c,\n\t0xa77f, 0xa77f,\n\t0xa781, 0xa781,\n\t0xa783, 0xa783,\n\t0xa785, 0xa785,\n\t0xa787, 0xa787,\n\t0xa78c, 0xa78c,\n\t0xa78e, 0xa78e,\n\t0xa791, 0xa791,\n\t0xa793, 0xa793,\n\t0xa7a1, 0xa7a1,\n\t0xa7a3, 0xa7a3,\n\t0xa7a5, 0xa7a5,\n\t0xa7a7, 0xa7a7,\n\t0xa7a9, 0xa7a9,\n\t0xa7fa, 0xa7fa,\n\t0xfb00, 0xfb06,\n\t0xfb13, 0xfb17,\n\t0xff41, 0xff5a,\n\t0x10428, 0x1044f,\n\t0x1d41a, 0x1d433,\n\t0x1d44e, 0x1d454,\n\t0x1d456, 0x1d467,\n\t0x1d482, 0x1d49b,\n\t0x1d4b6, 0x1d4b9,\n\t0x1d4bb, 0x1d4bb,\n\t0x1d4bd, 0x1d4c3,\n\t0x1d4c5, 0x1d4cf,\n\t0x1d4ea, 0x1d503,\n\t0x1d51e, 0x1d537,\n\t0x1d552, 0x1d56b,\n\t0x1d586, 0x1d59f,\n\t0x1d5ba, 0x1d5d3,\n\t0x1d5ee, 0x1d607,\n\t0x1d622, 0x1d63b,\n\t0x1d656, 0x1d66f,\n\t0x1d68a, 0x1d6a5,\n\t0x1d6c2, 0x1d6da,\n\t0x1d6dc, 0x1d6e1,\n\t0x1d6fc, 0x1d714,\n\t0x1d716, 0x1d71b,\n\t0x1d736, 0x1d74e,\n\t0x1d750, 0x1d755,\n\t0x1d770, 0x1d788,\n\t0x1d78a, 0x1d78f,\n\t0x1d7aa, 0x1d7c2,\n\t0x1d7c4, 0x1d7c9,\n\t0x1d7cb, 0x1d7cb,\n}; /* CR_Ll */\n\n/* 'Lm': General Category */\nstatic const OnigCodePoint CR_Lm[] = {\n\t52,\n\t0x02b0, 0x02c1,\n\t0x02c6, 0x02d1,\n\t0x02e0, 0x02e4,\n\t0x02ec, 0x02ec,\n\t0x02ee, 0x02ee,\n\t0x0374, 0x0374,\n\t0x037a, 0x037a,\n\t0x0559, 0x0559,\n\t0x0640, 0x0640,\n\t0x06e5, 0x06e6,\n\t0x07f4, 0x07f5,\n\t0x07fa, 0x07fa,\n\t0x081a, 0x081a,\n\t0x0824, 0x0824,\n\t0x0828, 0x0828,\n\t0x0971, 0x0971,\n\t0x0e46, 0x0e46,\n\t0x0ec6, 0x0ec6,\n\t0x10fc, 0x10fc,\n\t0x17d7, 0x17d7,\n\t0x1843, 0x1843,\n\t0x1aa7, 0x1aa7,\n\t0x1c78, 0x1c7d,\n\t0x1d2c, 0x1d6a,\n\t0x1d78, 0x1d78,\n\t0x1d9b, 0x1dbf,\n\t0x2071, 0x2071,\n\t0x207f, 0x207f,\n\t0x2090, 0x209c,\n\t0x2c7c, 0x2c7d,\n\t0x2d6f, 0x2d6f,\n\t0x2e2f, 0x2e2f,\n\t0x3005, 0x3005,\n\t0x3031, 0x3035,\n\t0x303b, 0x303b,\n\t0x309d, 0x309e,\n\t0x30fc, 0x30fe,\n\t0xa015, 0xa015,\n\t0xa4f8, 0xa4fd,\n\t0xa60c, 0xa60c,\n\t0xa67f, 0xa67f,\n\t0xa717, 0xa71f,\n\t0xa770, 0xa770,\n\t0xa788, 0xa788,\n\t0xa7f8, 0xa7f9,\n\t0xa9cf, 0xa9cf,\n\t0xaa70, 0xaa70,\n\t0xaadd, 0xaadd,\n\t0xaaf3, 0xaaf4,\n\t0xff70, 0xff70,\n\t0xff9e, 0xff9f,\n\t0x16f93, 0x16f9f,\n}; /* CR_Lm */\n\n/* 'Lo': General Category */\nstatic const OnigCodePoint CR_Lo[] = {\n\t371,\n\t0x00aa, 0x00aa,\n\t0x00ba, 0x00ba,\n\t0x01bb, 0x01bb,\n\t0x01c0, 0x01c3,\n\t0x0294, 0x0294,\n\t0x05d0, 0x05ea,\n\t0x05f0, 0x05f2,\n\t0x0620, 0x063f,\n\t0x0641, 0x064a,\n\t0x066e, 0x066f,\n\t0x0671, 0x06d3,\n\t0x06d5, 0x06d5,\n\t0x06ee, 0x06ef,\n\t0x06fa, 0x06fc,\n\t0x06ff, 0x06ff,\n\t0x0710, 0x0710,\n\t0x0712, 0x072f,\n\t0x074d, 0x07a5,\n\t0x07b1, 0x07b1,\n\t0x07ca, 0x07ea,\n\t0x0800, 0x0815,\n\t0x0840, 0x0858,\n\t0x08a0, 0x08a0,\n\t0x08a2, 0x08ac,\n\t0x0904, 0x0939,\n\t0x093d, 0x093d,\n\t0x0950, 0x0950,\n\t0x0958, 0x0961,\n\t0x0972, 0x0977,\n\t0x0979, 0x097f,\n\t0x0985, 0x098c,\n\t0x098f, 0x0990,\n\t0x0993, 0x09a8,\n\t0x09aa, 0x09b0,\n\t0x09b2, 0x09b2,\n\t0x09b6, 0x09b9,\n\t0x09bd, 0x09bd,\n\t0x09ce, 0x09ce,\n\t0x09dc, 0x09dd,\n\t0x09df, 0x09e1,\n\t0x09f0, 0x09f1,\n\t0x0a05, 0x0a0a,\n\t0x0a0f, 0x0a10,\n\t0x0a13, 0x0a28,\n\t0x0a2a, 0x0a30,\n\t0x0a32, 0x0a33,\n\t0x0a35, 0x0a36,\n\t0x0a38, 0x0a39,\n\t0x0a59, 0x0a5c,\n\t0x0a5e, 0x0a5e,\n\t0x0a72, 0x0a74,\n\t0x0a85, 0x0a8d,\n\t0x0a8f, 0x0a91,\n\t0x0a93, 0x0aa8,\n\t0x0aaa, 0x0ab0,\n\t0x0ab2, 0x0ab3,\n\t0x0ab5, 0x0ab9,\n\t0x0abd, 0x0abd,\n\t0x0ad0, 0x0ad0,\n\t0x0ae0, 0x0ae1,\n\t0x0b05, 0x0b0c,\n\t0x0b0f, 0x0b10,\n\t0x0b13, 0x0b28,\n\t0x0b2a, 0x0b30,\n\t0x0b32, 0x0b33,\n\t0x0b35, 0x0b39,\n\t0x0b3d, 0x0b3d,\n\t0x0b5c, 0x0b5d,\n\t0x0b5f, 0x0b61,\n\t0x0b71, 0x0b71,\n\t0x0b83, 0x0b83,\n\t0x0b85, 0x0b8a,\n\t0x0b8e, 0x0b90,\n\t0x0b92, 0x0b95,\n\t0x0b99, 0x0b9a,\n\t0x0b9c, 0x0b9c,\n\t0x0b9e, 0x0b9f,\n\t0x0ba3, 0x0ba4,\n\t0x0ba8, 0x0baa,\n\t0x0bae, 0x0bb9,\n\t0x0bd0, 0x0bd0,\n\t0x0c05, 0x0c0c,\n\t0x0c0e, 0x0c10,\n\t0x0c12, 0x0c28,\n\t0x0c2a, 0x0c33,\n\t0x0c35, 0x0c39,\n\t0x0c3d, 0x0c3d,\n\t0x0c58, 0x0c59,\n\t0x0c60, 0x0c61,\n\t0x0c85, 0x0c8c,\n\t0x0c8e, 0x0c90,\n\t0x0c92, 0x0ca8,\n\t0x0caa, 0x0cb3,\n\t0x0cb5, 0x0cb9,\n\t0x0cbd, 0x0cbd,\n\t0x0cde, 0x0cde,\n\t0x0ce0, 0x0ce1,\n\t0x0cf1, 0x0cf2,\n\t0x0d05, 0x0d0c,\n\t0x0d0e, 0x0d10,\n\t0x0d12, 0x0d3a,\n\t0x0d3d, 0x0d3d,\n\t0x0d4e, 0x0d4e,\n\t0x0d60, 0x0d61,\n\t0x0d7a, 0x0d7f,\n\t0x0d85, 0x0d96,\n\t0x0d9a, 0x0db1,\n\t0x0db3, 0x0dbb,\n\t0x0dbd, 0x0dbd,\n\t0x0dc0, 0x0dc6,\n\t0x0e01, 0x0e30,\n\t0x0e32, 0x0e33,\n\t0x0e40, 0x0e45,\n\t0x0e81, 0x0e82,\n\t0x0e84, 0x0e84,\n\t0x0e87, 0x0e88,\n\t0x0e8a, 0x0e8a,\n\t0x0e8d, 0x0e8d,\n\t0x0e94, 0x0e97,\n\t0x0e99, 0x0e9f,\n\t0x0ea1, 0x0ea3,\n\t0x0ea5, 0x0ea5,\n\t0x0ea7, 0x0ea7,\n\t0x0eaa, 0x0eab,\n\t0x0ead, 0x0eb0,\n\t0x0eb2, 0x0eb3,\n\t0x0ebd, 0x0ebd,\n\t0x0ec0, 0x0ec4,\n\t0x0edc, 0x0edf,\n\t0x0f00, 0x0f00,\n\t0x0f40, 0x0f47,\n\t0x0f49, 0x0f6c,\n\t0x0f88, 0x0f8c,\n\t0x1000, 0x102a,\n\t0x103f, 0x103f,\n\t0x1050, 0x1055,\n\t0x105a, 0x105d,\n\t0x1061, 0x1061,\n\t0x1065, 0x1066,\n\t0x106e, 0x1070,\n\t0x1075, 0x1081,\n\t0x108e, 0x108e,\n\t0x10d0, 0x10fa,\n\t0x10fd, 0x1248,\n\t0x124a, 0x124d,\n\t0x1250, 0x1256,\n\t0x1258, 0x1258,\n\t0x125a, 0x125d,\n\t0x1260, 0x1288,\n\t0x128a, 0x128d,\n\t0x1290, 0x12b0,\n\t0x12b2, 0x12b5,\n\t0x12b8, 0x12be,\n\t0x12c0, 0x12c0,\n\t0x12c2, 0x12c5,\n\t0x12c8, 0x12d6,\n\t0x12d8, 0x1310,\n\t0x1312, 0x1315,\n\t0x1318, 0x135a,\n\t0x1380, 0x138f,\n\t0x13a0, 0x13f4,\n\t0x1401, 0x166c,\n\t0x166f, 0x167f,\n\t0x1681, 0x169a,\n\t0x16a0, 0x16ea,\n\t0x1700, 0x170c,\n\t0x170e, 0x1711,\n\t0x1720, 0x1731,\n\t0x1740, 0x1751,\n\t0x1760, 0x176c,\n\t0x176e, 0x1770,\n\t0x1780, 0x17b3,\n\t0x17dc, 0x17dc,\n\t0x1820, 0x1842,\n\t0x1844, 0x1877,\n\t0x1880, 0x18a8,\n\t0x18aa, 0x18aa,\n\t0x18b0, 0x18f5,\n\t0x1900, 0x191c,\n\t0x1950, 0x196d,\n\t0x1970, 0x1974,\n\t0x1980, 0x19ab,\n\t0x19c1, 0x19c7,\n\t0x1a00, 0x1a16,\n\t0x1a20, 0x1a54,\n\t0x1b05, 0x1b33,\n\t0x1b45, 0x1b4b,\n\t0x1b83, 0x1ba0,\n\t0x1bae, 0x1baf,\n\t0x1bba, 0x1be5,\n\t0x1c00, 0x1c23,\n\t0x1c4d, 0x1c4f,\n\t0x1c5a, 0x1c77,\n\t0x1ce9, 0x1cec,\n\t0x1cee, 0x1cf1,\n\t0x1cf5, 0x1cf6,\n\t0x2135, 0x2138,\n\t0x2d30, 0x2d67,\n\t0x2d80, 0x2d96,\n\t0x2da0, 0x2da6,\n\t0x2da8, 0x2dae,\n\t0x2db0, 0x2db6,\n\t0x2db8, 0x2dbe,\n\t0x2dc0, 0x2dc6,\n\t0x2dc8, 0x2dce,\n\t0x2dd0, 0x2dd6,\n\t0x2dd8, 0x2dde,\n\t0x3006, 0x3006,\n\t0x303c, 0x303c,\n\t0x3041, 0x3096,\n\t0x309f, 0x309f,\n\t0x30a1, 0x30fa,\n\t0x30ff, 0x30ff,\n\t0x3105, 0x312d,\n\t0x3131, 0x318e,\n\t0x31a0, 0x31ba,\n\t0x31f0, 0x31ff,\n\t0x3400, 0x4db5,\n\t0x4e00, 0x9fcc,\n\t0xa000, 0xa014,\n\t0xa016, 0xa48c,\n\t0xa4d0, 0xa4f7,\n\t0xa500, 0xa60b,\n\t0xa610, 0xa61f,\n\t0xa62a, 0xa62b,\n\t0xa66e, 0xa66e,\n\t0xa6a0, 0xa6e5,\n\t0xa7fb, 0xa801,\n\t0xa803, 0xa805,\n\t0xa807, 0xa80a,\n\t0xa80c, 0xa822,\n\t0xa840, 0xa873,\n\t0xa882, 0xa8b3,\n\t0xa8f2, 0xa8f7,\n\t0xa8fb, 0xa8fb,\n\t0xa90a, 0xa925,\n\t0xa930, 0xa946,\n\t0xa960, 0xa97c,\n\t0xa984, 0xa9b2,\n\t0xaa00, 0xaa28,\n\t0xaa40, 0xaa42,\n\t0xaa44, 0xaa4b,\n\t0xaa60, 0xaa6f,\n\t0xaa71, 0xaa76,\n\t0xaa7a, 0xaa7a,\n\t0xaa80, 0xaaaf,\n\t0xaab1, 0xaab1,\n\t0xaab5, 0xaab6,\n\t0xaab9, 0xaabd,\n\t0xaac0, 0xaac0,\n\t0xaac2, 0xaac2,\n\t0xaadb, 0xaadc,\n\t0xaae0, 0xaaea,\n\t0xaaf2, 0xaaf2,\n\t0xab01, 0xab06,\n\t0xab09, 0xab0e,\n\t0xab11, 0xab16,\n\t0xab20, 0xab26,\n\t0xab28, 0xab2e,\n\t0xabc0, 0xabe2,\n\t0xac00, 0xd7a3,\n\t0xd7b0, 0xd7c6,\n\t0xd7cb, 0xd7fb,\n\t0xf900, 0xfa6d,\n\t0xfa70, 0xfad9,\n\t0xfb1d, 0xfb1d,\n\t0xfb1f, 0xfb28,\n\t0xfb2a, 0xfb36,\n\t0xfb38, 0xfb3c,\n\t0xfb3e, 0xfb3e,\n\t0xfb40, 0xfb41,\n\t0xfb43, 0xfb44,\n\t0xfb46, 0xfbb1,\n\t0xfbd3, 0xfd3d,\n\t0xfd50, 0xfd8f,\n\t0xfd92, 0xfdc7,\n\t0xfdf0, 0xfdfb,\n\t0xfe70, 0xfe74,\n\t0xfe76, 0xfefc,\n\t0xff66, 0xff6f,\n\t0xff71, 0xff9d,\n\t0xffa0, 0xffbe,\n\t0xffc2, 0xffc7,\n\t0xffca, 0xffcf,\n\t0xffd2, 0xffd7,\n\t0xffda, 0xffdc,\n\t0x10000, 0x1000b,\n\t0x1000d, 0x10026,\n\t0x10028, 0x1003a,\n\t0x1003c, 0x1003d,\n\t0x1003f, 0x1004d,\n\t0x10050, 0x1005d,\n\t0x10080, 0x100fa,\n\t0x10280, 0x1029c,\n\t0x102a0, 0x102d0,\n\t0x10300, 0x1031e,\n\t0x10330, 0x10340,\n\t0x10342, 0x10349,\n\t0x10380, 0x1039d,\n\t0x103a0, 0x103c3,\n\t0x103c8, 0x103cf,\n\t0x10450, 0x1049d,\n\t0x10800, 0x10805,\n\t0x10808, 0x10808,\n\t0x1080a, 0x10835,\n\t0x10837, 0x10838,\n\t0x1083c, 0x1083c,\n\t0x1083f, 0x10855,\n\t0x10900, 0x10915,\n\t0x10920, 0x10939,\n\t0x10980, 0x109b7,\n\t0x109be, 0x109bf,\n\t0x10a00, 0x10a00,\n\t0x10a10, 0x10a13,\n\t0x10a15, 0x10a17,\n\t0x10a19, 0x10a33,\n\t0x10a60, 0x10a7c,\n\t0x10b00, 0x10b35,\n\t0x10b40, 0x10b55,\n\t0x10b60, 0x10b72,\n\t0x10c00, 0x10c48,\n\t0x11003, 0x11037,\n\t0x11083, 0x110af,\n\t0x110d0, 0x110e8,\n\t0x11103, 0x11126,\n\t0x11183, 0x111b2,\n\t0x111c1, 0x111c4,\n\t0x11680, 0x116aa,\n\t0x12000, 0x1236e,\n\t0x13000, 0x1342e,\n\t0x16800, 0x16a38,\n\t0x16f00, 0x16f44,\n\t0x16f50, 0x16f50,\n\t0x1b000, 0x1b001,\n\t0x1ee00, 0x1ee03,\n\t0x1ee05, 0x1ee1f,\n\t0x1ee21, 0x1ee22,\n\t0x1ee24, 0x1ee24,\n\t0x1ee27, 0x1ee27,\n\t0x1ee29, 0x1ee32,\n\t0x1ee34, 0x1ee37,\n\t0x1ee39, 0x1ee39,\n\t0x1ee3b, 0x1ee3b,\n\t0x1ee42, 0x1ee42,\n\t0x1ee47, 0x1ee47,\n\t0x1ee49, 0x1ee49,\n\t0x1ee4b, 0x1ee4b,\n\t0x1ee4d, 0x1ee4f,\n\t0x1ee51, 0x1ee52,\n\t0x1ee54, 0x1ee54,\n\t0x1ee57, 0x1ee57,\n\t0x1ee59, 0x1ee59,\n\t0x1ee5b, 0x1ee5b,\n\t0x1ee5d, 0x1ee5d,\n\t0x1ee5f, 0x1ee5f,\n\t0x1ee61, 0x1ee62,\n\t0x1ee64, 0x1ee64,\n\t0x1ee67, 0x1ee6a,\n\t0x1ee6c, 0x1ee72,\n\t0x1ee74, 0x1ee77,\n\t0x1ee79, 0x1ee7c,\n\t0x1ee7e, 0x1ee7e,\n\t0x1ee80, 0x1ee89,\n\t0x1ee8b, 0x1ee9b,\n\t0x1eea1, 0x1eea3,\n\t0x1eea5, 0x1eea9,\n\t0x1eeab, 0x1eebb,\n\t0x20000, 0x2a6d6,\n\t0x2a700, 0x2b734,\n\t0x2b740, 0x2b81d,\n\t0x2f800, 0x2fa1d,\n}; /* CR_Lo */\n\n/* 'Lt': General Category */\nstatic const OnigCodePoint CR_Lt[] = {\n\t10,\n\t0x01c5, 0x01c5,\n\t0x01c8, 0x01c8,\n\t0x01cb, 0x01cb,\n\t0x01f2, 0x01f2,\n\t0x1f88, 0x1f8f,\n\t0x1f98, 0x1f9f,\n\t0x1fa8, 0x1faf,\n\t0x1fbc, 0x1fbc,\n\t0x1fcc, 0x1fcc,\n\t0x1ffc, 0x1ffc,\n}; /* CR_Lt */\n\n/* 'Lu': General Category */\nstatic const OnigCodePoint CR_Lu[] = {\n\t608,\n\t0x0041, 0x005a,\n\t0x00c0, 0x00d6,\n\t0x00d8, 0x00de,\n\t0x0100, 0x0100,\n\t0x0102, 0x0102,\n\t0x0104, 0x0104,\n\t0x0106, 0x0106,\n\t0x0108, 0x0108,\n\t0x010a, 0x010a,\n\t0x010c, 0x010c,\n\t0x010e, 0x010e,\n\t0x0110, 0x0110,\n\t0x0112, 0x0112,\n\t0x0114, 0x0114,\n\t0x0116, 0x0116,\n\t0x0118, 0x0118,\n\t0x011a, 0x011a,\n\t0x011c, 0x011c,\n\t0x011e, 0x011e,\n\t0x0120, 0x0120,\n\t0x0122, 0x0122,\n\t0x0124, 0x0124,\n\t0x0126, 0x0126,\n\t0x0128, 0x0128,\n\t0x012a, 0x012a,\n\t0x012c, 0x012c,\n\t0x012e, 0x012e,\n\t0x0130, 0x0130,\n\t0x0132, 0x0132,\n\t0x0134, 0x0134,\n\t0x0136, 0x0136,\n\t0x0139, 0x0139,\n\t0x013b, 0x013b,\n\t0x013d, 0x013d,\n\t0x013f, 0x013f,\n\t0x0141, 0x0141,\n\t0x0143, 0x0143,\n\t0x0145, 0x0145,\n\t0x0147, 0x0147,\n\t0x014a, 0x014a,\n\t0x014c, 0x014c,\n\t0x014e, 0x014e,\n\t0x0150, 0x0150,\n\t0x0152, 0x0152,\n\t0x0154, 0x0154,\n\t0x0156, 0x0156,\n\t0x0158, 0x0158,\n\t0x015a, 0x015a,\n\t0x015c, 0x015c,\n\t0x015e, 0x015e,\n\t0x0160, 0x0160,\n\t0x0162, 0x0162,\n\t0x0164, 0x0164,\n\t0x0166, 0x0166,\n\t0x0168, 0x0168,\n\t0x016a, 0x016a,\n\t0x016c, 0x016c,\n\t0x016e, 0x016e,\n\t0x0170, 0x0170,\n\t0x0172, 0x0172,\n\t0x0174, 0x0174,\n\t0x0176, 0x0176,\n\t0x0178, 0x0179,\n\t0x017b, 0x017b,\n\t0x017d, 0x017d,\n\t0x0181, 0x0182,\n\t0x0184, 0x0184,\n\t0x0186, 0x0187,\n\t0x0189, 0x018b,\n\t0x018e, 0x0191,\n\t0x0193, 0x0194,\n\t0x0196, 0x0198,\n\t0x019c, 0x019d,\n\t0x019f, 0x01a0,\n\t0x01a2, 0x01a2,\n\t0x01a4, 0x01a4,\n\t0x01a6, 0x01a7,\n\t0x01a9, 0x01a9,\n\t0x01ac, 0x01ac,\n\t0x01ae, 0x01af,\n\t0x01b1, 0x01b3,\n\t0x01b5, 0x01b5,\n\t0x01b7, 0x01b8,\n\t0x01bc, 0x01bc,\n\t0x01c4, 0x01c4,\n\t0x01c7, 0x01c7,\n\t0x01ca, 0x01ca,\n\t0x01cd, 0x01cd,\n\t0x01cf, 0x01cf,\n\t0x01d1, 0x01d1,\n\t0x01d3, 0x01d3,\n\t0x01d5, 0x01d5,\n\t0x01d7, 0x01d7,\n\t0x01d9, 0x01d9,\n\t0x01db, 0x01db,\n\t0x01de, 0x01de,\n\t0x01e0, 0x01e0,\n\t0x01e2, 0x01e2,\n\t0x01e4, 0x01e4,\n\t0x01e6, 0x01e6,\n\t0x01e8, 0x01e8,\n\t0x01ea, 0x01ea,\n\t0x01ec, 0x01ec,\n\t0x01ee, 0x01ee,\n\t0x01f1, 0x01f1,\n\t0x01f4, 0x01f4,\n\t0x01f6, 0x01f8,\n\t0x01fa, 0x01fa,\n\t0x01fc, 0x01fc,\n\t0x01fe, 0x01fe,\n\t0x0200, 0x0200,\n\t0x0202, 0x0202,\n\t0x0204, 0x0204,\n\t0x0206, 0x0206,\n\t0x0208, 0x0208,\n\t0x020a, 0x020a,\n\t0x020c, 0x020c,\n\t0x020e, 0x020e,\n\t0x0210, 0x0210,\n\t0x0212, 0x0212,\n\t0x0214, 0x0214,\n\t0x0216, 0x0216,\n\t0x0218, 0x0218,\n\t0x021a, 0x021a,\n\t0x021c, 0x021c,\n\t0x021e, 0x021e,\n\t0x0220, 0x0220,\n\t0x0222, 0x0222,\n\t0x0224, 0x0224,\n\t0x0226, 0x0226,\n\t0x0228, 0x0228,\n\t0x022a, 0x022a,\n\t0x022c, 0x022c,\n\t0x022e, 0x022e,\n\t0x0230, 0x0230,\n\t0x0232, 0x0232,\n\t0x023a, 0x023b,\n\t0x023d, 0x023e,\n\t0x0241, 0x0241,\n\t0x0243, 0x0246,\n\t0x0248, 0x0248,\n\t0x024a, 0x024a,\n\t0x024c, 0x024c,\n\t0x024e, 0x024e,\n\t0x0370, 0x0370,\n\t0x0372, 0x0372,\n\t0x0376, 0x0376,\n\t0x0386, 0x0386,\n\t0x0388, 0x038a,\n\t0x038c, 0x038c,\n\t0x038e, 0x038f,\n\t0x0391, 0x03a1,\n\t0x03a3, 0x03ab,\n\t0x03cf, 0x03cf,\n\t0x03d2, 0x03d4,\n\t0x03d8, 0x03d8,\n\t0x03da, 0x03da,\n\t0x03dc, 0x03dc,\n\t0x03de, 0x03de,\n\t0x03e0, 0x03e0,\n\t0x03e2, 0x03e2,\n\t0x03e4, 0x03e4,\n\t0x03e6, 0x03e6,\n\t0x03e8, 0x03e8,\n\t0x03ea, 0x03ea,\n\t0x03ec, 0x03ec,\n\t0x03ee, 0x03ee,\n\t0x03f4, 0x03f4,\n\t0x03f7, 0x03f7,\n\t0x03f9, 0x03fa,\n\t0x03fd, 0x042f,\n\t0x0460, 0x0460,\n\t0x0462, 0x0462,\n\t0x0464, 0x0464,\n\t0x0466, 0x0466,\n\t0x0468, 0x0468,\n\t0x046a, 0x046a,\n\t0x046c, 0x046c,\n\t0x046e, 0x046e,\n\t0x0470, 0x0470,\n\t0x0472, 0x0472,\n\t0x0474, 0x0474,\n\t0x0476, 0x0476,\n\t0x0478, 0x0478,\n\t0x047a, 0x047a,\n\t0x047c, 0x047c,\n\t0x047e, 0x047e,\n\t0x0480, 0x0480,\n\t0x048a, 0x048a,\n\t0x048c, 0x048c,\n\t0x048e, 0x048e,\n\t0x0490, 0x0490,\n\t0x0492, 0x0492,\n\t0x0494, 0x0494,\n\t0x0496, 0x0496,\n\t0x0498, 0x0498,\n\t0x049a, 0x049a,\n\t0x049c, 0x049c,\n\t0x049e, 0x049e,\n\t0x04a0, 0x04a0,\n\t0x04a2, 0x04a2,\n\t0x04a4, 0x04a4,\n\t0x04a6, 0x04a6,\n\t0x04a8, 0x04a8,\n\t0x04aa, 0x04aa,\n\t0x04ac, 0x04ac,\n\t0x04ae, 0x04ae,\n\t0x04b0, 0x04b0,\n\t0x04b2, 0x04b2,\n\t0x04b4, 0x04b4,\n\t0x04b6, 0x04b6,\n\t0x04b8, 0x04b8,\n\t0x04ba, 0x04ba,\n\t0x04bc, 0x04bc,\n\t0x04be, 0x04be,\n\t0x04c0, 0x04c1,\n\t0x04c3, 0x04c3,\n\t0x04c5, 0x04c5,\n\t0x04c7, 0x04c7,\n\t0x04c9, 0x04c9,\n\t0x04cb, 0x04cb,\n\t0x04cd, 0x04cd,\n\t0x04d0, 0x04d0,\n\t0x04d2, 0x04d2,\n\t0x04d4, 0x04d4,\n\t0x04d6, 0x04d6,\n\t0x04d8, 0x04d8,\n\t0x04da, 0x04da,\n\t0x04dc, 0x04dc,\n\t0x04de, 0x04de,\n\t0x04e0, 0x04e0,\n\t0x04e2, 0x04e2,\n\t0x04e4, 0x04e4,\n\t0x04e6, 0x04e6,\n\t0x04e8, 0x04e8,\n\t0x04ea, 0x04ea,\n\t0x04ec, 0x04ec,\n\t0x04ee, 0x04ee,\n\t0x04f0, 0x04f0,\n\t0x04f2, 0x04f2,\n\t0x04f4, 0x04f4,\n\t0x04f6, 0x04f6,\n\t0x04f8, 0x04f8,\n\t0x04fa, 0x04fa,\n\t0x04fc, 0x04fc,\n\t0x04fe, 0x04fe,\n\t0x0500, 0x0500,\n\t0x0502, 0x0502,\n\t0x0504, 0x0504,\n\t0x0506, 0x0506,\n\t0x0508, 0x0508,\n\t0x050a, 0x050a,\n\t0x050c, 0x050c,\n\t0x050e, 0x050e,\n\t0x0510, 0x0510,\n\t0x0512, 0x0512,\n\t0x0514, 0x0514,\n\t0x0516, 0x0516,\n\t0x0518, 0x0518,\n\t0x051a, 0x051a,\n\t0x051c, 0x051c,\n\t0x051e, 0x051e,\n\t0x0520, 0x0520,\n\t0x0522, 0x0522,\n\t0x0524, 0x0524,\n\t0x0526, 0x0526,\n\t0x0531, 0x0556,\n\t0x10a0, 0x10c5,\n\t0x10c7, 0x10c7,\n\t0x10cd, 0x10cd,\n\t0x1e00, 0x1e00,\n\t0x1e02, 0x1e02,\n\t0x1e04, 0x1e04,\n\t0x1e06, 0x1e06,\n\t0x1e08, 0x1e08,\n\t0x1e0a, 0x1e0a,\n\t0x1e0c, 0x1e0c,\n\t0x1e0e, 0x1e0e,\n\t0x1e10, 0x1e10,\n\t0x1e12, 0x1e12,\n\t0x1e14, 0x1e14,\n\t0x1e16, 0x1e16,\n\t0x1e18, 0x1e18,\n\t0x1e1a, 0x1e1a,\n\t0x1e1c, 0x1e1c,\n\t0x1e1e, 0x1e1e,\n\t0x1e20, 0x1e20,\n\t0x1e22, 0x1e22,\n\t0x1e24, 0x1e24,\n\t0x1e26, 0x1e26,\n\t0x1e28, 0x1e28,\n\t0x1e2a, 0x1e2a,\n\t0x1e2c, 0x1e2c,\n\t0x1e2e, 0x1e2e,\n\t0x1e30, 0x1e30,\n\t0x1e32, 0x1e32,\n\t0x1e34, 0x1e34,\n\t0x1e36, 0x1e36,\n\t0x1e38, 0x1e38,\n\t0x1e3a, 0x1e3a,\n\t0x1e3c, 0x1e3c,\n\t0x1e3e, 0x1e3e,\n\t0x1e40, 0x1e40,\n\t0x1e42, 0x1e42,\n\t0x1e44, 0x1e44,\n\t0x1e46, 0x1e46,\n\t0x1e48, 0x1e48,\n\t0x1e4a, 0x1e4a,\n\t0x1e4c, 0x1e4c,\n\t0x1e4e, 0x1e4e,\n\t0x1e50, 0x1e50,\n\t0x1e52, 0x1e52,\n\t0x1e54, 0x1e54,\n\t0x1e56, 0x1e56,\n\t0x1e58, 0x1e58,\n\t0x1e5a, 0x1e5a,\n\t0x1e5c, 0x1e5c,\n\t0x1e5e, 0x1e5e,\n\t0x1e60, 0x1e60,\n\t0x1e62, 0x1e62,\n\t0x1e64, 0x1e64,\n\t0x1e66, 0x1e66,\n\t0x1e68, 0x1e68,\n\t0x1e6a, 0x1e6a,\n\t0x1e6c, 0x1e6c,\n\t0x1e6e, 0x1e6e,\n\t0x1e70, 0x1e70,\n\t0x1e72, 0x1e72,\n\t0x1e74, 0x1e74,\n\t0x1e76, 0x1e76,\n\t0x1e78, 0x1e78,\n\t0x1e7a, 0x1e7a,\n\t0x1e7c, 0x1e7c,\n\t0x1e7e, 0x1e7e,\n\t0x1e80, 0x1e80,\n\t0x1e82, 0x1e82,\n\t0x1e84, 0x1e84,\n\t0x1e86, 0x1e86,\n\t0x1e88, 0x1e88,\n\t0x1e8a, 0x1e8a,\n\t0x1e8c, 0x1e8c,\n\t0x1e8e, 0x1e8e,\n\t0x1e90, 0x1e90,\n\t0x1e92, 0x1e92,\n\t0x1e94, 0x1e94,\n\t0x1e9e, 0x1e9e,\n\t0x1ea0, 0x1ea0,\n\t0x1ea2, 0x1ea2,\n\t0x1ea4, 0x1ea4,\n\t0x1ea6, 0x1ea6,\n\t0x1ea8, 0x1ea8,\n\t0x1eaa, 0x1eaa,\n\t0x1eac, 0x1eac,\n\t0x1eae, 0x1eae,\n\t0x1eb0, 0x1eb0,\n\t0x1eb2, 0x1eb2,\n\t0x1eb4, 0x1eb4,\n\t0x1eb6, 0x1eb6,\n\t0x1eb8, 0x1eb8,\n\t0x1eba, 0x1eba,\n\t0x1ebc, 0x1ebc,\n\t0x1ebe, 0x1ebe,\n\t0x1ec0, 0x1ec0,\n\t0x1ec2, 0x1ec2,\n\t0x1ec4, 0x1ec4,\n\t0x1ec6, 0x1ec6,\n\t0x1ec8, 0x1ec8,\n\t0x1eca, 0x1eca,\n\t0x1ecc, 0x1ecc,\n\t0x1ece, 0x1ece,\n\t0x1ed0, 0x1ed0,\n\t0x1ed2, 0x1ed2,\n\t0x1ed4, 0x1ed4,\n\t0x1ed6, 0x1ed6,\n\t0x1ed8, 0x1ed8,\n\t0x1eda, 0x1eda,\n\t0x1edc, 0x1edc,\n\t0x1ede, 0x1ede,\n\t0x1ee0, 0x1ee0,\n\t0x1ee2, 0x1ee2,\n\t0x1ee4, 0x1ee4,\n\t0x1ee6, 0x1ee6,\n\t0x1ee8, 0x1ee8,\n\t0x1eea, 0x1eea,\n\t0x1eec, 0x1eec,\n\t0x1eee, 0x1eee,\n\t0x1ef0, 0x1ef0,\n\t0x1ef2, 0x1ef2,\n\t0x1ef4, 0x1ef4,\n\t0x1ef6, 0x1ef6,\n\t0x1ef8, 0x1ef8,\n\t0x1efa, 0x1efa,\n\t0x1efc, 0x1efc,\n\t0x1efe, 0x1efe,\n\t0x1f08, 0x1f0f,\n\t0x1f18, 0x1f1d,\n\t0x1f28, 0x1f2f,\n\t0x1f38, 0x1f3f,\n\t0x1f48, 0x1f4d,\n\t0x1f59, 0x1f59,\n\t0x1f5b, 0x1f5b,\n\t0x1f5d, 0x1f5d,\n\t0x1f5f, 0x1f5f,\n\t0x1f68, 0x1f6f,\n\t0x1fb8, 0x1fbb,\n\t0x1fc8, 0x1fcb,\n\t0x1fd8, 0x1fdb,\n\t0x1fe8, 0x1fec,\n\t0x1ff8, 0x1ffb,\n\t0x2102, 0x2102,\n\t0x2107, 0x2107,\n\t0x210b, 0x210d,\n\t0x2110, 0x2112,\n\t0x2115, 0x2115,\n\t0x2119, 0x211d,\n\t0x2124, 0x2124,\n\t0x2126, 0x2126,\n\t0x2128, 0x2128,\n\t0x212a, 0x212d,\n\t0x2130, 0x2133,\n\t0x213e, 0x213f,\n\t0x2145, 0x2145,\n\t0x2183, 0x2183,\n\t0x2c00, 0x2c2e,\n\t0x2c60, 0x2c60,\n\t0x2c62, 0x2c64,\n\t0x2c67, 0x2c67,\n\t0x2c69, 0x2c69,\n\t0x2c6b, 0x2c6b,\n\t0x2c6d, 0x2c70,\n\t0x2c72, 0x2c72,\n\t0x2c75, 0x2c75,\n\t0x2c7e, 0x2c80,\n\t0x2c82, 0x2c82,\n\t0x2c84, 0x2c84,\n\t0x2c86, 0x2c86,\n\t0x2c88, 0x2c88,\n\t0x2c8a, 0x2c8a,\n\t0x2c8c, 0x2c8c,\n\t0x2c8e, 0x2c8e,\n\t0x2c90, 0x2c90,\n\t0x2c92, 0x2c92,\n\t0x2c94, 0x2c94,\n\t0x2c96, 0x2c96,\n\t0x2c98, 0x2c98,\n\t0x2c9a, 0x2c9a,\n\t0x2c9c, 0x2c9c,\n\t0x2c9e, 0x2c9e,\n\t0x2ca0, 0x2ca0,\n\t0x2ca2, 0x2ca2,\n\t0x2ca4, 0x2ca4,\n\t0x2ca6, 0x2ca6,\n\t0x2ca8, 0x2ca8,\n\t0x2caa, 0x2caa,\n\t0x2cac, 0x2cac,\n\t0x2cae, 0x2cae,\n\t0x2cb0, 0x2cb0,\n\t0x2cb2, 0x2cb2,\n\t0x2cb4, 0x2cb4,\n\t0x2cb6, 0x2cb6,\n\t0x2cb8, 0x2cb8,\n\t0x2cba, 0x2cba,\n\t0x2cbc, 0x2cbc,\n\t0x2cbe, 0x2cbe,\n\t0x2cc0, 0x2cc0,\n\t0x2cc2, 0x2cc2,\n\t0x2cc4, 0x2cc4,\n\t0x2cc6, 0x2cc6,\n\t0x2cc8, 0x2cc8,\n\t0x2cca, 0x2cca,\n\t0x2ccc, 0x2ccc,\n\t0x2cce, 0x2cce,\n\t0x2cd0, 0x2cd0,\n\t0x2cd2, 0x2cd2,\n\t0x2cd4, 0x2cd4,\n\t0x2cd6, 0x2cd6,\n\t0x2cd8, 0x2cd8,\n\t0x2cda, 0x2cda,\n\t0x2cdc, 0x2cdc,\n\t0x2cde, 0x2cde,\n\t0x2ce0, 0x2ce0,\n\t0x2ce2, 0x2ce2,\n\t0x2ceb, 0x2ceb,\n\t0x2ced, 0x2ced,\n\t0x2cf2, 0x2cf2,\n\t0xa640, 0xa640,\n\t0xa642, 0xa642,\n\t0xa644, 0xa644,\n\t0xa646, 0xa646,\n\t0xa648, 0xa648,\n\t0xa64a, 0xa64a,\n\t0xa64c, 0xa64c,\n\t0xa64e, 0xa64e,\n\t0xa650, 0xa650,\n\t0xa652, 0xa652,\n\t0xa654, 0xa654,\n\t0xa656, 0xa656,\n\t0xa658, 0xa658,\n\t0xa65a, 0xa65a,\n\t0xa65c, 0xa65c,\n\t0xa65e, 0xa65e,\n\t0xa660, 0xa660,\n\t0xa662, 0xa662,\n\t0xa664, 0xa664,\n\t0xa666, 0xa666,\n\t0xa668, 0xa668,\n\t0xa66a, 0xa66a,\n\t0xa66c, 0xa66c,\n\t0xa680, 0xa680,\n\t0xa682, 0xa682,\n\t0xa684, 0xa684,\n\t0xa686, 0xa686,\n\t0xa688, 0xa688,\n\t0xa68a, 0xa68a,\n\t0xa68c, 0xa68c,\n\t0xa68e, 0xa68e,\n\t0xa690, 0xa690,\n\t0xa692, 0xa692,\n\t0xa694, 0xa694,\n\t0xa696, 0xa696,\n\t0xa722, 0xa722,\n\t0xa724, 0xa724,\n\t0xa726, 0xa726,\n\t0xa728, 0xa728,\n\t0xa72a, 0xa72a,\n\t0xa72c, 0xa72c,\n\t0xa72e, 0xa72e,\n\t0xa732, 0xa732,\n\t0xa734, 0xa734,\n\t0xa736, 0xa736,\n\t0xa738, 0xa738,\n\t0xa73a, 0xa73a,\n\t0xa73c, 0xa73c,\n\t0xa73e, 0xa73e,\n\t0xa740, 0xa740,\n\t0xa742, 0xa742,\n\t0xa744, 0xa744,\n\t0xa746, 0xa746,\n\t0xa748, 0xa748,\n\t0xa74a, 0xa74a,\n\t0xa74c, 0xa74c,\n\t0xa74e, 0xa74e,\n\t0xa750, 0xa750,\n\t0xa752, 0xa752,\n\t0xa754, 0xa754,\n\t0xa756, 0xa756,\n\t0xa758, 0xa758,\n\t0xa75a, 0xa75a,\n\t0xa75c, 0xa75c,\n\t0xa75e, 0xa75e,\n\t0xa760, 0xa760,\n\t0xa762, 0xa762,\n\t0xa764, 0xa764,\n\t0xa766, 0xa766,\n\t0xa768, 0xa768,\n\t0xa76a, 0xa76a,\n\t0xa76c, 0xa76c,\n\t0xa76e, 0xa76e,\n\t0xa779, 0xa779,\n\t0xa77b, 0xa77b,\n\t0xa77d, 0xa77e,\n\t0xa780, 0xa780,\n\t0xa782, 0xa782,\n\t0xa784, 0xa784,\n\t0xa786, 0xa786,\n\t0xa78b, 0xa78b,\n\t0xa78d, 0xa78d,\n\t0xa790, 0xa790,\n\t0xa792, 0xa792,\n\t0xa7a0, 0xa7a0,\n\t0xa7a2, 0xa7a2,\n\t0xa7a4, 0xa7a4,\n\t0xa7a6, 0xa7a6,\n\t0xa7a8, 0xa7a8,\n\t0xa7aa, 0xa7aa,\n\t0xff21, 0xff3a,\n\t0x10400, 0x10427,\n\t0x1d400, 0x1d419,\n\t0x1d434, 0x1d44d,\n\t0x1d468, 0x1d481,\n\t0x1d49c, 0x1d49c,\n\t0x1d49e, 0x1d49f,\n\t0x1d4a2, 0x1d4a2,\n\t0x1d4a5, 0x1d4a6,\n\t0x1d4a9, 0x1d4ac,\n\t0x1d4ae, 0x1d4b5,\n\t0x1d4d0, 0x1d4e9,\n\t0x1d504, 0x1d505,\n\t0x1d507, 0x1d50a,\n\t0x1d50d, 0x1d514,\n\t0x1d516, 0x1d51c,\n\t0x1d538, 0x1d539,\n\t0x1d53b, 0x1d53e,\n\t0x1d540, 0x1d544,\n\t0x1d546, 0x1d546,\n\t0x1d54a, 0x1d550,\n\t0x1d56c, 0x1d585,\n\t0x1d5a0, 0x1d5b9,\n\t0x1d5d4, 0x1d5ed,\n\t0x1d608, 0x1d621,\n\t0x1d63c, 0x1d655,\n\t0x1d670, 0x1d689,\n\t0x1d6a8, 0x1d6c0,\n\t0x1d6e2, 0x1d6fa,\n\t0x1d71c, 0x1d734,\n\t0x1d756, 0x1d76e,\n\t0x1d790, 0x1d7a8,\n\t0x1d7ca, 0x1d7ca,\n}; /* CR_Lu */\n\n/* 'M': Major Category */\nstatic const OnigCodePoint CR_M[] = {\n\t204,\n\t0x0300, 0x036f,\n\t0x0483, 0x0489,\n\t0x0591, 0x05bd,\n\t0x05bf, 0x05bf,\n\t0x05c1, 0x05c2,\n\t0x05c4, 0x05c5,\n\t0x05c7, 0x05c7,\n\t0x0610, 0x061a,\n\t0x064b, 0x065f,\n\t0x0670, 0x0670,\n\t0x06d6, 0x06dc,\n\t0x06df, 0x06e4,\n\t0x06e7, 0x06e8,\n\t0x06ea, 0x06ed,\n\t0x0711, 0x0711,\n\t0x0730, 0x074a,\n\t0x07a6, 0x07b0,\n\t0x07eb, 0x07f3,\n\t0x0816, 0x0819,\n\t0x081b, 0x0823,\n\t0x0825, 0x0827,\n\t0x0829, 0x082d,\n\t0x0859, 0x085b,\n\t0x08e4, 0x08fe,\n\t0x0900, 0x0903,\n\t0x093a, 0x093c,\n\t0x093e, 0x094f,\n\t0x0951, 0x0957,\n\t0x0962, 0x0963,\n\t0x0981, 0x0983,\n\t0x09bc, 0x09bc,\n\t0x09be, 0x09c4,\n\t0x09c7, 0x09c8,\n\t0x09cb, 0x09cd,\n\t0x09d7, 0x09d7,\n\t0x09e2, 0x09e3,\n\t0x0a01, 0x0a03,\n\t0x0a3c, 0x0a3c,\n\t0x0a3e, 0x0a42,\n\t0x0a47, 0x0a48,\n\t0x0a4b, 0x0a4d,\n\t0x0a51, 0x0a51,\n\t0x0a70, 0x0a71,\n\t0x0a75, 0x0a75,\n\t0x0a81, 0x0a83,\n\t0x0abc, 0x0abc,\n\t0x0abe, 0x0ac5,\n\t0x0ac7, 0x0ac9,\n\t0x0acb, 0x0acd,\n\t0x0ae2, 0x0ae3,\n\t0x0b01, 0x0b03,\n\t0x0b3c, 0x0b3c,\n\t0x0b3e, 0x0b44,\n\t0x0b47, 0x0b48,\n\t0x0b4b, 0x0b4d,\n\t0x0b56, 0x0b57,\n\t0x0b62, 0x0b63,\n\t0x0b82, 0x0b82,\n\t0x0bbe, 0x0bc2,\n\t0x0bc6, 0x0bc8,\n\t0x0bca, 0x0bcd,\n\t0x0bd7, 0x0bd7,\n\t0x0c01, 0x0c03,\n\t0x0c3e, 0x0c44,\n\t0x0c46, 0x0c48,\n\t0x0c4a, 0x0c4d,\n\t0x0c55, 0x0c56,\n\t0x0c62, 0x0c63,\n\t0x0c82, 0x0c83,\n\t0x0cbc, 0x0cbc,\n\t0x0cbe, 0x0cc4,\n\t0x0cc6, 0x0cc8,\n\t0x0cca, 0x0ccd,\n\t0x0cd5, 0x0cd6,\n\t0x0ce2, 0x0ce3,\n\t0x0d02, 0x0d03,\n\t0x0d3e, 0x0d44,\n\t0x0d46, 0x0d48,\n\t0x0d4a, 0x0d4d,\n\t0x0d57, 0x0d57,\n\t0x0d62, 0x0d63,\n\t0x0d82, 0x0d83,\n\t0x0dca, 0x0dca,\n\t0x0dcf, 0x0dd4,\n\t0x0dd6, 0x0dd6,\n\t0x0dd8, 0x0ddf,\n\t0x0df2, 0x0df3,\n\t0x0e31, 0x0e31,\n\t0x0e34, 0x0e3a,\n\t0x0e47, 0x0e4e,\n\t0x0eb1, 0x0eb1,\n\t0x0eb4, 0x0eb9,\n\t0x0ebb, 0x0ebc,\n\t0x0ec8, 0x0ecd,\n\t0x0f18, 0x0f19,\n\t0x0f35, 0x0f35,\n\t0x0f37, 0x0f37,\n\t0x0f39, 0x0f39,\n\t0x0f3e, 0x0f3f,\n\t0x0f71, 0x0f84,\n\t0x0f86, 0x0f87,\n\t0x0f8d, 0x0f97,\n\t0x0f99, 0x0fbc,\n\t0x0fc6, 0x0fc6,\n\t0x102b, 0x103e,\n\t0x1056, 0x1059,\n\t0x105e, 0x1060,\n\t0x1062, 0x1064,\n\t0x1067, 0x106d,\n\t0x1071, 0x1074,\n\t0x1082, 0x108d,\n\t0x108f, 0x108f,\n\t0x109a, 0x109d,\n\t0x135d, 0x135f,\n\t0x1712, 0x1714,\n\t0x1732, 0x1734,\n\t0x1752, 0x1753,\n\t0x1772, 0x1773,\n\t0x17b4, 0x17d3,\n\t0x17dd, 0x17dd,\n\t0x180b, 0x180d,\n\t0x18a9, 0x18a9,\n\t0x1920, 0x192b,\n\t0x1930, 0x193b,\n\t0x19b0, 0x19c0,\n\t0x19c8, 0x19c9,\n\t0x1a17, 0x1a1b,\n\t0x1a55, 0x1a5e,\n\t0x1a60, 0x1a7c,\n\t0x1a7f, 0x1a7f,\n\t0x1b00, 0x1b04,\n\t0x1b34, 0x1b44,\n\t0x1b6b, 0x1b73,\n\t0x1b80, 0x1b82,\n\t0x1ba1, 0x1bad,\n\t0x1be6, 0x1bf3,\n\t0x1c24, 0x1c37,\n\t0x1cd0, 0x1cd2,\n\t0x1cd4, 0x1ce8,\n\t0x1ced, 0x1ced,\n\t0x1cf2, 0x1cf4,\n\t0x1dc0, 0x1de6,\n\t0x1dfc, 0x1dff,\n\t0x20d0, 0x20f0,\n\t0x2cef, 0x2cf1,\n\t0x2d7f, 0x2d7f,\n\t0x2de0, 0x2dff,\n\t0x302a, 0x302f,\n\t0x3099, 0x309a,\n\t0xa66f, 0xa672,\n\t0xa674, 0xa67d,\n\t0xa69f, 0xa69f,\n\t0xa6f0, 0xa6f1,\n\t0xa802, 0xa802,\n\t0xa806, 0xa806,\n\t0xa80b, 0xa80b,\n\t0xa823, 0xa827,\n\t0xa880, 0xa881,\n\t0xa8b4, 0xa8c4,\n\t0xa8e0, 0xa8f1,\n\t0xa926, 0xa92d,\n\t0xa947, 0xa953,\n\t0xa980, 0xa983,\n\t0xa9b3, 0xa9c0,\n\t0xaa29, 0xaa36,\n\t0xaa43, 0xaa43,\n\t0xaa4c, 0xaa4d,\n\t0xaa7b, 0xaa7b,\n\t0xaab0, 0xaab0,\n\t0xaab2, 0xaab4,\n\t0xaab7, 0xaab8,\n\t0xaabe, 0xaabf,\n\t0xaac1, 0xaac1,\n\t0xaaeb, 0xaaef,\n\t0xaaf5, 0xaaf6,\n\t0xabe3, 0xabea,\n\t0xabec, 0xabed,\n\t0xfb1e, 0xfb1e,\n\t0xfe00, 0xfe0f,\n\t0xfe20, 0xfe26,\n\t0x101fd, 0x101fd,\n\t0x10a01, 0x10a03,\n\t0x10a05, 0x10a06,\n\t0x10a0c, 0x10a0f,\n\t0x10a38, 0x10a3a,\n\t0x10a3f, 0x10a3f,\n\t0x11000, 0x11002,\n\t0x11038, 0x11046,\n\t0x11080, 0x11082,\n\t0x110b0, 0x110ba,\n\t0x11100, 0x11102,\n\t0x11127, 0x11134,\n\t0x11180, 0x11182,\n\t0x111b3, 0x111c0,\n\t0x116ab, 0x116b7,\n\t0x16f51, 0x16f7e,\n\t0x16f8f, 0x16f92,\n\t0x1d165, 0x1d169,\n\t0x1d16d, 0x1d172,\n\t0x1d17b, 0x1d182,\n\t0x1d185, 0x1d18b,\n\t0x1d1aa, 0x1d1ad,\n\t0x1d242, 0x1d244,\n\t0xe0100, 0xe01ef,\n}; /* CR_M */\n\n/* 'Mc': General Category */\nstatic const OnigCodePoint CR_Mc[] = {\n\t126,\n\t0x0903, 0x0903,\n\t0x093b, 0x093b,\n\t0x093e, 0x0940,\n\t0x0949, 0x094c,\n\t0x094e, 0x094f,\n\t0x0982, 0x0983,\n\t0x09be, 0x09c0,\n\t0x09c7, 0x09c8,\n\t0x09cb, 0x09cc,\n\t0x09d7, 0x09d7,\n\t0x0a03, 0x0a03,\n\t0x0a3e, 0x0a40,\n\t0x0a83, 0x0a83,\n\t0x0abe, 0x0ac0,\n\t0x0ac9, 0x0ac9,\n\t0x0acb, 0x0acc,\n\t0x0b02, 0x0b03,\n\t0x0b3e, 0x0b3e,\n\t0x0b40, 0x0b40,\n\t0x0b47, 0x0b48,\n\t0x0b4b, 0x0b4c,\n\t0x0b57, 0x0b57,\n\t0x0bbe, 0x0bbf,\n\t0x0bc1, 0x0bc2,\n\t0x0bc6, 0x0bc8,\n\t0x0bca, 0x0bcc,\n\t0x0bd7, 0x0bd7,\n\t0x0c01, 0x0c03,\n\t0x0c41, 0x0c44,\n\t0x0c82, 0x0c83,\n\t0x0cbe, 0x0cbe,\n\t0x0cc0, 0x0cc4,\n\t0x0cc7, 0x0cc8,\n\t0x0cca, 0x0ccb,\n\t0x0cd5, 0x0cd6,\n\t0x0d02, 0x0d03,\n\t0x0d3e, 0x0d40,\n\t0x0d46, 0x0d48,\n\t0x0d4a, 0x0d4c,\n\t0x0d57, 0x0d57,\n\t0x0d82, 0x0d83,\n\t0x0dcf, 0x0dd1,\n\t0x0dd8, 0x0ddf,\n\t0x0df2, 0x0df3,\n\t0x0f3e, 0x0f3f,\n\t0x0f7f, 0x0f7f,\n\t0x102b, 0x102c,\n\t0x1031, 0x1031,\n\t0x1038, 0x1038,\n\t0x103b, 0x103c,\n\t0x1056, 0x1057,\n\t0x1062, 0x1064,\n\t0x1067, 0x106d,\n\t0x1083, 0x1084,\n\t0x1087, 0x108c,\n\t0x108f, 0x108f,\n\t0x109a, 0x109c,\n\t0x17b6, 0x17b6,\n\t0x17be, 0x17c5,\n\t0x17c7, 0x17c8,\n\t0x1923, 0x1926,\n\t0x1929, 0x192b,\n\t0x1930, 0x1931,\n\t0x1933, 0x1938,\n\t0x19b0, 0x19c0,\n\t0x19c8, 0x19c9,\n\t0x1a19, 0x1a1b,\n\t0x1a55, 0x1a55,\n\t0x1a57, 0x1a57,\n\t0x1a61, 0x1a61,\n\t0x1a63, 0x1a64,\n\t0x1a6d, 0x1a72,\n\t0x1b04, 0x1b04,\n\t0x1b35, 0x1b35,\n\t0x1b3b, 0x1b3b,\n\t0x1b3d, 0x1b41,\n\t0x1b43, 0x1b44,\n\t0x1b82, 0x1b82,\n\t0x1ba1, 0x1ba1,\n\t0x1ba6, 0x1ba7,\n\t0x1baa, 0x1baa,\n\t0x1bac, 0x1bad,\n\t0x1be7, 0x1be7,\n\t0x1bea, 0x1bec,\n\t0x1bee, 0x1bee,\n\t0x1bf2, 0x1bf3,\n\t0x1c24, 0x1c2b,\n\t0x1c34, 0x1c35,\n\t0x1ce1, 0x1ce1,\n\t0x1cf2, 0x1cf3,\n\t0x302e, 0x302f,\n\t0xa823, 0xa824,\n\t0xa827, 0xa827,\n\t0xa880, 0xa881,\n\t0xa8b4, 0xa8c3,\n\t0xa952, 0xa953,\n\t0xa983, 0xa983,\n\t0xa9b4, 0xa9b5,\n\t0xa9ba, 0xa9bb,\n\t0xa9bd, 0xa9c0,\n\t0xaa2f, 0xaa30,\n\t0xaa33, 0xaa34,\n\t0xaa4d, 0xaa4d,\n\t0xaa7b, 0xaa7b,\n\t0xaaeb, 0xaaeb,\n\t0xaaee, 0xaaef,\n\t0xaaf5, 0xaaf5,\n\t0xabe3, 0xabe4,\n\t0xabe6, 0xabe7,\n\t0xabe9, 0xabea,\n\t0xabec, 0xabec,\n\t0x11000, 0x11000,\n\t0x11002, 0x11002,\n\t0x11082, 0x11082,\n\t0x110b0, 0x110b2,\n\t0x110b7, 0x110b8,\n\t0x1112c, 0x1112c,\n\t0x11182, 0x11182,\n\t0x111b3, 0x111b5,\n\t0x111bf, 0x111c0,\n\t0x116ac, 0x116ac,\n\t0x116ae, 0x116af,\n\t0x116b6, 0x116b6,\n\t0x16f51, 0x16f7e,\n\t0x1d165, 0x1d166,\n\t0x1d16d, 0x1d172,\n}; /* CR_Mc */\n\n/* 'Me': General Category */\nstatic const OnigCodePoint CR_Me[] = {\n\t4,\n\t0x0488, 0x0489,\n\t0x20dd, 0x20e0,\n\t0x20e2, 0x20e4,\n\t0xa670, 0xa672,\n}; /* CR_Me */\n\n/* 'Mn': General Category */\nstatic const OnigCodePoint CR_Mn[] = {\n\t220,\n\t0x0300, 0x036f,\n\t0x0483, 0x0487,\n\t0x0591, 0x05bd,\n\t0x05bf, 0x05bf,\n\t0x05c1, 0x05c2,\n\t0x05c4, 0x05c5,\n\t0x05c7, 0x05c7,\n\t0x0610, 0x061a,\n\t0x064b, 0x065f,\n\t0x0670, 0x0670,\n\t0x06d6, 0x06dc,\n\t0x06df, 0x06e4,\n\t0x06e7, 0x06e8,\n\t0x06ea, 0x06ed,\n\t0x0711, 0x0711,\n\t0x0730, 0x074a,\n\t0x07a6, 0x07b0,\n\t0x07eb, 0x07f3,\n\t0x0816, 0x0819,\n\t0x081b, 0x0823,\n\t0x0825, 0x0827,\n\t0x0829, 0x082d,\n\t0x0859, 0x085b,\n\t0x08e4, 0x08fe,\n\t0x0900, 0x0902,\n\t0x093a, 0x093a,\n\t0x093c, 0x093c,\n\t0x0941, 0x0948,\n\t0x094d, 0x094d,\n\t0x0951, 0x0957,\n\t0x0962, 0x0963,\n\t0x0981, 0x0981,\n\t0x09bc, 0x09bc,\n\t0x09c1, 0x09c4,\n\t0x09cd, 0x09cd,\n\t0x09e2, 0x09e3,\n\t0x0a01, 0x0a02,\n\t0x0a3c, 0x0a3c,\n\t0x0a41, 0x0a42,\n\t0x0a47, 0x0a48,\n\t0x0a4b, 0x0a4d,\n\t0x0a51, 0x0a51,\n\t0x0a70, 0x0a71,\n\t0x0a75, 0x0a75,\n\t0x0a81, 0x0a82,\n\t0x0abc, 0x0abc,\n\t0x0ac1, 0x0ac5,\n\t0x0ac7, 0x0ac8,\n\t0x0acd, 0x0acd,\n\t0x0ae2, 0x0ae3,\n\t0x0b01, 0x0b01,\n\t0x0b3c, 0x0b3c,\n\t0x0b3f, 0x0b3f,\n\t0x0b41, 0x0b44,\n\t0x0b4d, 0x0b4d,\n\t0x0b56, 0x0b56,\n\t0x0b62, 0x0b63,\n\t0x0b82, 0x0b82,\n\t0x0bc0, 0x0bc0,\n\t0x0bcd, 0x0bcd,\n\t0x0c3e, 0x0c40,\n\t0x0c46, 0x0c48,\n\t0x0c4a, 0x0c4d,\n\t0x0c55, 0x0c56,\n\t0x0c62, 0x0c63,\n\t0x0cbc, 0x0cbc,\n\t0x0cbf, 0x0cbf,\n\t0x0cc6, 0x0cc6,\n\t0x0ccc, 0x0ccd,\n\t0x0ce2, 0x0ce3,\n\t0x0d41, 0x0d44,\n\t0x0d4d, 0x0d4d,\n\t0x0d62, 0x0d63,\n\t0x0dca, 0x0dca,\n\t0x0dd2, 0x0dd4,\n\t0x0dd6, 0x0dd6,\n\t0x0e31, 0x0e31,\n\t0x0e34, 0x0e3a,\n\t0x0e47, 0x0e4e,\n\t0x0eb1, 0x0eb1,\n\t0x0eb4, 0x0eb9,\n\t0x0ebb, 0x0ebc,\n\t0x0ec8, 0x0ecd,\n\t0x0f18, 0x0f19,\n\t0x0f35, 0x0f35,\n\t0x0f37, 0x0f37,\n\t0x0f39, 0x0f39,\n\t0x0f71, 0x0f7e,\n\t0x0f80, 0x0f84,\n\t0x0f86, 0x0f87,\n\t0x0f8d, 0x0f97,\n\t0x0f99, 0x0fbc,\n\t0x0fc6, 0x0fc6,\n\t0x102d, 0x1030,\n\t0x1032, 0x1037,\n\t0x1039, 0x103a,\n\t0x103d, 0x103e,\n\t0x1058, 0x1059,\n\t0x105e, 0x1060,\n\t0x1071, 0x1074,\n\t0x1082, 0x1082,\n\t0x1085, 0x1086,\n\t0x108d, 0x108d,\n\t0x109d, 0x109d,\n\t0x135d, 0x135f,\n\t0x1712, 0x1714,\n\t0x1732, 0x1734,\n\t0x1752, 0x1753,\n\t0x1772, 0x1773,\n\t0x17b4, 0x17b5,\n\t0x17b7, 0x17bd,\n\t0x17c6, 0x17c6,\n\t0x17c9, 0x17d3,\n\t0x17dd, 0x17dd,\n\t0x180b, 0x180d,\n\t0x18a9, 0x18a9,\n\t0x1920, 0x1922,\n\t0x1927, 0x1928,\n\t0x1932, 0x1932,\n\t0x1939, 0x193b,\n\t0x1a17, 0x1a18,\n\t0x1a56, 0x1a56,\n\t0x1a58, 0x1a5e,\n\t0x1a60, 0x1a60,\n\t0x1a62, 0x1a62,\n\t0x1a65, 0x1a6c,\n\t0x1a73, 0x1a7c,\n\t0x1a7f, 0x1a7f,\n\t0x1b00, 0x1b03,\n\t0x1b34, 0x1b34,\n\t0x1b36, 0x1b3a,\n\t0x1b3c, 0x1b3c,\n\t0x1b42, 0x1b42,\n\t0x1b6b, 0x1b73,\n\t0x1b80, 0x1b81,\n\t0x1ba2, 0x1ba5,\n\t0x1ba8, 0x1ba9,\n\t0x1bab, 0x1bab,\n\t0x1be6, 0x1be6,\n\t0x1be8, 0x1be9,\n\t0x1bed, 0x1bed,\n\t0x1bef, 0x1bf1,\n\t0x1c2c, 0x1c33,\n\t0x1c36, 0x1c37,\n\t0x1cd0, 0x1cd2,\n\t0x1cd4, 0x1ce0,\n\t0x1ce2, 0x1ce8,\n\t0x1ced, 0x1ced,\n\t0x1cf4, 0x1cf4,\n\t0x1dc0, 0x1de6,\n\t0x1dfc, 0x1dff,\n\t0x20d0, 0x20dc,\n\t0x20e1, 0x20e1,\n\t0x20e5, 0x20f0,\n\t0x2cef, 0x2cf1,\n\t0x2d7f, 0x2d7f,\n\t0x2de0, 0x2dff,\n\t0x302a, 0x302d,\n\t0x3099, 0x309a,\n\t0xa66f, 0xa66f,\n\t0xa674, 0xa67d,\n\t0xa69f, 0xa69f,\n\t0xa6f0, 0xa6f1,\n\t0xa802, 0xa802,\n\t0xa806, 0xa806,\n\t0xa80b, 0xa80b,\n\t0xa825, 0xa826,\n\t0xa8c4, 0xa8c4,\n\t0xa8e0, 0xa8f1,\n\t0xa926, 0xa92d,\n\t0xa947, 0xa951,\n\t0xa980, 0xa982,\n\t0xa9b3, 0xa9b3,\n\t0xa9b6, 0xa9b9,\n\t0xa9bc, 0xa9bc,\n\t0xaa29, 0xaa2e,\n\t0xaa31, 0xaa32,\n\t0xaa35, 0xaa36,\n\t0xaa43, 0xaa43,\n\t0xaa4c, 0xaa4c,\n\t0xaab0, 0xaab0,\n\t0xaab2, 0xaab4,\n\t0xaab7, 0xaab8,\n\t0xaabe, 0xaabf,\n\t0xaac1, 0xaac1,\n\t0xaaec, 0xaaed,\n\t0xaaf6, 0xaaf6,\n\t0xabe5, 0xabe5,\n\t0xabe8, 0xabe8,\n\t0xabed, 0xabed,\n\t0xfb1e, 0xfb1e,\n\t0xfe00, 0xfe0f,\n\t0xfe20, 0xfe26,\n\t0x101fd, 0x101fd,\n\t0x10a01, 0x10a03,\n\t0x10a05, 0x10a06,\n\t0x10a0c, 0x10a0f,\n\t0x10a38, 0x10a3a,\n\t0x10a3f, 0x10a3f,\n\t0x11001, 0x11001,\n\t0x11038, 0x11046,\n\t0x11080, 0x11081,\n\t0x110b3, 0x110b6,\n\t0x110b9, 0x110ba,\n\t0x11100, 0x11102,\n\t0x11127, 0x1112b,\n\t0x1112d, 0x11134,\n\t0x11180, 0x11181,\n\t0x111b6, 0x111be,\n\t0x116ab, 0x116ab,\n\t0x116ad, 0x116ad,\n\t0x116b0, 0x116b5,\n\t0x116b7, 0x116b7,\n\t0x16f8f, 0x16f92,\n\t0x1d167, 0x1d169,\n\t0x1d17b, 0x1d182,\n\t0x1d185, 0x1d18b,\n\t0x1d1aa, 0x1d1ad,\n\t0x1d242, 0x1d244,\n\t0xe0100, 0xe01ef,\n}; /* CR_Mn */\n\n/* 'N': Major Category */\nstatic const OnigCodePoint CR_N[] = {\n\t88,\n\t0x0030, 0x0039,\n\t0x00b2, 0x00b3,\n\t0x00b9, 0x00b9,\n\t0x00bc, 0x00be,\n\t0x0660, 0x0669,\n\t0x06f0, 0x06f9,\n\t0x07c0, 0x07c9,\n\t0x0966, 0x096f,\n\t0x09e6, 0x09ef,\n\t0x09f4, 0x09f9,\n\t0x0a66, 0x0a6f,\n\t0x0ae6, 0x0aef,\n\t0x0b66, 0x0b6f,\n\t0x0b72, 0x0b77,\n\t0x0be6, 0x0bf2,\n\t0x0c66, 0x0c6f,\n\t0x0c78, 0x0c7e,\n\t0x0ce6, 0x0cef,\n\t0x0d66, 0x0d75,\n\t0x0e50, 0x0e59,\n\t0x0ed0, 0x0ed9,\n\t0x0f20, 0x0f33,\n\t0x1040, 0x1049,\n\t0x1090, 0x1099,\n\t0x1369, 0x137c,\n\t0x16ee, 0x16f0,\n\t0x17e0, 0x17e9,\n\t0x17f0, 0x17f9,\n\t0x1810, 0x1819,\n\t0x1946, 0x194f,\n\t0x19d0, 0x19da,\n\t0x1a80, 0x1a89,\n\t0x1a90, 0x1a99,\n\t0x1b50, 0x1b59,\n\t0x1bb0, 0x1bb9,\n\t0x1c40, 0x1c49,\n\t0x1c50, 0x1c59,\n\t0x2070, 0x2070,\n\t0x2074, 0x2079,\n\t0x2080, 0x2089,\n\t0x2150, 0x2182,\n\t0x2185, 0x2189,\n\t0x2460, 0x249b,\n\t0x24ea, 0x24ff,\n\t0x2776, 0x2793,\n\t0x2cfd, 0x2cfd,\n\t0x3007, 0x3007,\n\t0x3021, 0x3029,\n\t0x3038, 0x303a,\n\t0x3192, 0x3195,\n\t0x3220, 0x3229,\n\t0x3248, 0x324f,\n\t0x3251, 0x325f,\n\t0x3280, 0x3289,\n\t0x32b1, 0x32bf,\n\t0xa620, 0xa629,\n\t0xa6e6, 0xa6ef,\n\t0xa830, 0xa835,\n\t0xa8d0, 0xa8d9,\n\t0xa900, 0xa909,\n\t0xa9d0, 0xa9d9,\n\t0xaa50, 0xaa59,\n\t0xabf0, 0xabf9,\n\t0xff10, 0xff19,\n\t0x10107, 0x10133,\n\t0x10140, 0x10178,\n\t0x1018a, 0x1018a,\n\t0x10320, 0x10323,\n\t0x10341, 0x10341,\n\t0x1034a, 0x1034a,\n\t0x103d1, 0x103d5,\n\t0x104a0, 0x104a9,\n\t0x10858, 0x1085f,\n\t0x10916, 0x1091b,\n\t0x10a40, 0x10a47,\n\t0x10a7d, 0x10a7e,\n\t0x10b58, 0x10b5f,\n\t0x10b78, 0x10b7f,\n\t0x10e60, 0x10e7e,\n\t0x11052, 0x1106f,\n\t0x110f0, 0x110f9,\n\t0x11136, 0x1113f,\n\t0x111d0, 0x111d9,\n\t0x116c0, 0x116c9,\n\t0x12400, 0x12462,\n\t0x1d360, 0x1d371,\n\t0x1d7ce, 0x1d7ff,\n\t0x1f100, 0x1f10a,\n}; /* CR_N */\n\n/* 'Nd': General Category */\n#define CR_Nd CR_Digit\n\n/* 'Nl': General Category */\nstatic const OnigCodePoint CR_Nl[] = {\n\t12,\n\t0x16ee, 0x16f0,\n\t0x2160, 0x2182,\n\t0x2185, 0x2188,\n\t0x3007, 0x3007,\n\t0x3021, 0x3029,\n\t0x3038, 0x303a,\n\t0xa6e6, 0xa6ef,\n\t0x10140, 0x10174,\n\t0x10341, 0x10341,\n\t0x1034a, 0x1034a,\n\t0x103d1, 0x103d5,\n\t0x12400, 0x12462,\n}; /* CR_Nl */\n\n/* 'No': General Category */\nstatic const OnigCodePoint CR_No[] = {\n\t42,\n\t0x00b2, 0x00b3,\n\t0x00b9, 0x00b9,\n\t0x00bc, 0x00be,\n\t0x09f4, 0x09f9,\n\t0x0b72, 0x0b77,\n\t0x0bf0, 0x0bf2,\n\t0x0c78, 0x0c7e,\n\t0x0d70, 0x0d75,\n\t0x0f2a, 0x0f33,\n\t0x1369, 0x137c,\n\t0x17f0, 0x17f9,\n\t0x19da, 0x19da,\n\t0x2070, 0x2070,\n\t0x2074, 0x2079,\n\t0x2080, 0x2089,\n\t0x2150, 0x215f,\n\t0x2189, 0x2189,\n\t0x2460, 0x249b,\n\t0x24ea, 0x24ff,\n\t0x2776, 0x2793,\n\t0x2cfd, 0x2cfd,\n\t0x3192, 0x3195,\n\t0x3220, 0x3229,\n\t0x3248, 0x324f,\n\t0x3251, 0x325f,\n\t0x3280, 0x3289,\n\t0x32b1, 0x32bf,\n\t0xa830, 0xa835,\n\t0x10107, 0x10133,\n\t0x10175, 0x10178,\n\t0x1018a, 0x1018a,\n\t0x10320, 0x10323,\n\t0x10858, 0x1085f,\n\t0x10916, 0x1091b,\n\t0x10a40, 0x10a47,\n\t0x10a7d, 0x10a7e,\n\t0x10b58, 0x10b5f,\n\t0x10b78, 0x10b7f,\n\t0x10e60, 0x10e7e,\n\t0x11052, 0x11065,\n\t0x1d360, 0x1d371,\n\t0x1f100, 0x1f10a,\n}; /* CR_No */\n\n/* 'P': Major Category */\n#define CR_P CR_Punct\n\n/* 'Pc': General Category */\nstatic const OnigCodePoint CR_Pc[] = {\n\t6,\n\t0x005f, 0x005f,\n\t0x203f, 0x2040,\n\t0x2054, 0x2054,\n\t0xfe33, 0xfe34,\n\t0xfe4d, 0xfe4f,\n\t0xff3f, 0xff3f,\n}; /* CR_Pc */\n\n/* 'Pd': General Category */\nstatic const OnigCodePoint CR_Pd[] = {\n\t16,\n\t0x002d, 0x002d,\n\t0x058a, 0x058a,\n\t0x05be, 0x05be,\n\t0x1400, 0x1400,\n\t0x1806, 0x1806,\n\t0x2010, 0x2015,\n\t0x2e17, 0x2e17,\n\t0x2e1a, 0x2e1a,\n\t0x2e3a, 0x2e3b,\n\t0x301c, 0x301c,\n\t0x3030, 0x3030,\n\t0x30a0, 0x30a0,\n\t0xfe31, 0xfe32,\n\t0xfe58, 0xfe58,\n\t0xfe63, 0xfe63,\n\t0xff0d, 0xff0d,\n}; /* CR_Pd */\n\n/* 'Pe': General Category */\nstatic const OnigCodePoint CR_Pe[] = {\n\t70,\n\t0x0029, 0x0029,\n\t0x005d, 0x005d,\n\t0x007d, 0x007d,\n\t0x0f3b, 0x0f3b,\n\t0x0f3d, 0x0f3d,\n\t0x169c, 0x169c,\n\t0x2046, 0x2046,\n\t0x207e, 0x207e,\n\t0x208e, 0x208e,\n\t0x232a, 0x232a,\n\t0x2769, 0x2769,\n\t0x276b, 0x276b,\n\t0x276d, 0x276d,\n\t0x276f, 0x276f,\n\t0x2771, 0x2771,\n\t0x2773, 0x2773,\n\t0x2775, 0x2775,\n\t0x27c6, 0x27c6,\n\t0x27e7, 0x27e7,\n\t0x27e9, 0x27e9,\n\t0x27eb, 0x27eb,\n\t0x27ed, 0x27ed,\n\t0x27ef, 0x27ef,\n\t0x2984, 0x2984,\n\t0x2986, 0x2986,\n\t0x2988, 0x2988,\n\t0x298a, 0x298a,\n\t0x298c, 0x298c,\n\t0x298e, 0x298e,\n\t0x2990, 0x2990,\n\t0x2992, 0x2992,\n\t0x2994, 0x2994,\n\t0x2996, 0x2996,\n\t0x2998, 0x2998,\n\t0x29d9, 0x29d9,\n\t0x29db, 0x29db,\n\t0x29fd, 0x29fd,\n\t0x2e23, 0x2e23,\n\t0x2e25, 0x2e25,\n\t0x2e27, 0x2e27,\n\t0x2e29, 0x2e29,\n\t0x3009, 0x3009,\n\t0x300b, 0x300b,\n\t0x300d, 0x300d,\n\t0x300f, 0x300f,\n\t0x3011, 0x3011,\n\t0x3015, 0x3015,\n\t0x3017, 0x3017,\n\t0x3019, 0x3019,\n\t0x301b, 0x301b,\n\t0x301e, 0x301f,\n\t0xfd3f, 0xfd3f,\n\t0xfe18, 0xfe18,\n\t0xfe36, 0xfe36,\n\t0xfe38, 0xfe38,\n\t0xfe3a, 0xfe3a,\n\t0xfe3c, 0xfe3c,\n\t0xfe3e, 0xfe3e,\n\t0xfe40, 0xfe40,\n\t0xfe42, 0xfe42,\n\t0xfe44, 0xfe44,\n\t0xfe48, 0xfe48,\n\t0xfe5a, 0xfe5a,\n\t0xfe5c, 0xfe5c,\n\t0xfe5e, 0xfe5e,\n\t0xff09, 0xff09,\n\t0xff3d, 0xff3d,\n\t0xff5d, 0xff5d,\n\t0xff60, 0xff60,\n\t0xff63, 0xff63,\n}; /* CR_Pe */\n\n/* 'Pf': General Category */\nstatic const OnigCodePoint CR_Pf[] = {\n\t10,\n\t0x00bb, 0x00bb,\n\t0x2019, 0x2019,\n\t0x201d, 0x201d,\n\t0x203a, 0x203a,\n\t0x2e03, 0x2e03,\n\t0x2e05, 0x2e05,\n\t0x2e0a, 0x2e0a,\n\t0x2e0d, 0x2e0d,\n\t0x2e1d, 0x2e1d,\n\t0x2e21, 0x2e21,\n}; /* CR_Pf */\n\n/* 'Pi': General Category */\nstatic const OnigCodePoint CR_Pi[] = {\n\t11,\n\t0x00ab, 0x00ab,\n\t0x2018, 0x2018,\n\t0x201b, 0x201c,\n\t0x201f, 0x201f,\n\t0x2039, 0x2039,\n\t0x2e02, 0x2e02,\n\t0x2e04, 0x2e04,\n\t0x2e09, 0x2e09,\n\t0x2e0c, 0x2e0c,\n\t0x2e1c, 0x2e1c,\n\t0x2e20, 0x2e20,\n}; /* CR_Pi */\n\n/* 'Po': General Category */\nstatic const OnigCodePoint CR_Po[] = {\n\t135,\n\t0x0021, 0x0023,\n\t0x0025, 0x0027,\n\t0x002a, 0x002a,\n\t0x002c, 0x002c,\n\t0x002e, 0x002f,\n\t0x003a, 0x003b,\n\t0x003f, 0x0040,\n\t0x005c, 0x005c,\n\t0x00a1, 0x00a1,\n\t0x00a7, 0x00a7,\n\t0x00b6, 0x00b7,\n\t0x00bf, 0x00bf,\n\t0x037e, 0x037e,\n\t0x0387, 0x0387,\n\t0x055a, 0x055f,\n\t0x0589, 0x0589,\n\t0x05c0, 0x05c0,\n\t0x05c3, 0x05c3,\n\t0x05c6, 0x05c6,\n\t0x05f3, 0x05f4,\n\t0x0609, 0x060a,\n\t0x060c, 0x060d,\n\t0x061b, 0x061b,\n\t0x061e, 0x061f,\n\t0x066a, 0x066d,\n\t0x06d4, 0x06d4,\n\t0x0700, 0x070d,\n\t0x07f7, 0x07f9,\n\t0x0830, 0x083e,\n\t0x085e, 0x085e,\n\t0x0964, 0x0965,\n\t0x0970, 0x0970,\n\t0x0af0, 0x0af0,\n\t0x0df4, 0x0df4,\n\t0x0e4f, 0x0e4f,\n\t0x0e5a, 0x0e5b,\n\t0x0f04, 0x0f12,\n\t0x0f14, 0x0f14,\n\t0x0f85, 0x0f85,\n\t0x0fd0, 0x0fd4,\n\t0x0fd9, 0x0fda,\n\t0x104a, 0x104f,\n\t0x10fb, 0x10fb,\n\t0x1360, 0x1368,\n\t0x166d, 0x166e,\n\t0x16eb, 0x16ed,\n\t0x1735, 0x1736,\n\t0x17d4, 0x17d6,\n\t0x17d8, 0x17da,\n\t0x1800, 0x1805,\n\t0x1807, 0x180a,\n\t0x1944, 0x1945,\n\t0x1a1e, 0x1a1f,\n\t0x1aa0, 0x1aa6,\n\t0x1aa8, 0x1aad,\n\t0x1b5a, 0x1b60,\n\t0x1bfc, 0x1bff,\n\t0x1c3b, 0x1c3f,\n\t0x1c7e, 0x1c7f,\n\t0x1cc0, 0x1cc7,\n\t0x1cd3, 0x1cd3,\n\t0x2016, 0x2017,\n\t0x2020, 0x2027,\n\t0x2030, 0x2038,\n\t0x203b, 0x203e,\n\t0x2041, 0x2043,\n\t0x2047, 0x2051,\n\t0x2053, 0x2053,\n\t0x2055, 0x205e,\n\t0x2cf9, 0x2cfc,\n\t0x2cfe, 0x2cff,\n\t0x2d70, 0x2d70,\n\t0x2e00, 0x2e01,\n\t0x2e06, 0x2e08,\n\t0x2e0b, 0x2e0b,\n\t0x2e0e, 0x2e16,\n\t0x2e18, 0x2e19,\n\t0x2e1b, 0x2e1b,\n\t0x2e1e, 0x2e1f,\n\t0x2e2a, 0x2e2e,\n\t0x2e30, 0x2e39,\n\t0x3001, 0x3003,\n\t0x303d, 0x303d,\n\t0x30fb, 0x30fb,\n\t0xa4fe, 0xa4ff,\n\t0xa60d, 0xa60f,\n\t0xa673, 0xa673,\n\t0xa67e, 0xa67e,\n\t0xa6f2, 0xa6f7,\n\t0xa874, 0xa877,\n\t0xa8ce, 0xa8cf,\n\t0xa8f8, 0xa8fa,\n\t0xa92e, 0xa92f,\n\t0xa95f, 0xa95f,\n\t0xa9c1, 0xa9cd,\n\t0xa9de, 0xa9df,\n\t0xaa5c, 0xaa5f,\n\t0xaade, 0xaadf,\n\t0xaaf0, 0xaaf1,\n\t0xabeb, 0xabeb,\n\t0xfe10, 0xfe16,\n\t0xfe19, 0xfe19,\n\t0xfe30, 0xfe30,\n\t0xfe45, 0xfe46,\n\t0xfe49, 0xfe4c,\n\t0xfe50, 0xfe52,\n\t0xfe54, 0xfe57,\n\t0xfe5f, 0xfe61,\n\t0xfe68, 0xfe68,\n\t0xfe6a, 0xfe6b,\n\t0xff01, 0xff03,\n\t0xff05, 0xff07,\n\t0xff0a, 0xff0a,\n\t0xff0c, 0xff0c,\n\t0xff0e, 0xff0f,\n\t0xff1a, 0xff1b,\n\t0xff1f, 0xff20,\n\t0xff3c, 0xff3c,\n\t0xff61, 0xff61,\n\t0xff64, 0xff65,\n\t0x10100, 0x10102,\n\t0x1039f, 0x1039f,\n\t0x103d0, 0x103d0,\n\t0x10857, 0x10857,\n\t0x1091f, 0x1091f,\n\t0x1093f, 0x1093f,\n\t0x10a50, 0x10a58,\n\t0x10a7f, 0x10a7f,\n\t0x10b39, 0x10b3f,\n\t0x11047, 0x1104d,\n\t0x110bb, 0x110bc,\n\t0x110be, 0x110c1,\n\t0x11140, 0x11143,\n\t0x111c5, 0x111c8,\n\t0x12470, 0x12473,\n}; /* CR_Po */\n\n/* 'Ps': General Category */\nstatic const OnigCodePoint CR_Ps[] = {\n\t72,\n\t0x0028, 0x0028,\n\t0x005b, 0x005b,\n\t0x007b, 0x007b,\n\t0x0f3a, 0x0f3a,\n\t0x0f3c, 0x0f3c,\n\t0x169b, 0x169b,\n\t0x201a, 0x201a,\n\t0x201e, 0x201e,\n\t0x2045, 0x2045,\n\t0x207d, 0x207d,\n\t0x208d, 0x208d,\n\t0x2329, 0x2329,\n\t0x2768, 0x2768,\n\t0x276a, 0x276a,\n\t0x276c, 0x276c,\n\t0x276e, 0x276e,\n\t0x2770, 0x2770,\n\t0x2772, 0x2772,\n\t0x2774, 0x2774,\n\t0x27c5, 0x27c5,\n\t0x27e6, 0x27e6,\n\t0x27e8, 0x27e8,\n\t0x27ea, 0x27ea,\n\t0x27ec, 0x27ec,\n\t0x27ee, 0x27ee,\n\t0x2983, 0x2983,\n\t0x2985, 0x2985,\n\t0x2987, 0x2987,\n\t0x2989, 0x2989,\n\t0x298b, 0x298b,\n\t0x298d, 0x298d,\n\t0x298f, 0x298f,\n\t0x2991, 0x2991,\n\t0x2993, 0x2993,\n\t0x2995, 0x2995,\n\t0x2997, 0x2997,\n\t0x29d8, 0x29d8,\n\t0x29da, 0x29da,\n\t0x29fc, 0x29fc,\n\t0x2e22, 0x2e22,\n\t0x2e24, 0x2e24,\n\t0x2e26, 0x2e26,\n\t0x2e28, 0x2e28,\n\t0x3008, 0x3008,\n\t0x300a, 0x300a,\n\t0x300c, 0x300c,\n\t0x300e, 0x300e,\n\t0x3010, 0x3010,\n\t0x3014, 0x3014,\n\t0x3016, 0x3016,\n\t0x3018, 0x3018,\n\t0x301a, 0x301a,\n\t0x301d, 0x301d,\n\t0xfd3e, 0xfd3e,\n\t0xfe17, 0xfe17,\n\t0xfe35, 0xfe35,\n\t0xfe37, 0xfe37,\n\t0xfe39, 0xfe39,\n\t0xfe3b, 0xfe3b,\n\t0xfe3d, 0xfe3d,\n\t0xfe3f, 0xfe3f,\n\t0xfe41, 0xfe41,\n\t0xfe43, 0xfe43,\n\t0xfe47, 0xfe47,\n\t0xfe59, 0xfe59,\n\t0xfe5b, 0xfe5b,\n\t0xfe5d, 0xfe5d,\n\t0xff08, 0xff08,\n\t0xff3b, 0xff3b,\n\t0xff5b, 0xff5b,\n\t0xff5f, 0xff5f,\n\t0xff62, 0xff62,\n}; /* CR_Ps */\n\n/* 'S': Major Category */\nstatic const OnigCodePoint CR_S[] = {\n\t198,\n\t0x0024, 0x0024,\n\t0x002b, 0x002b,\n\t0x003c, 0x003e,\n\t0x005e, 0x005e,\n\t0x0060, 0x0060,\n\t0x007c, 0x007c,\n\t0x007e, 0x007e,\n\t0x00a2, 0x00a6,\n\t0x00a8, 0x00a9,\n\t0x00ac, 0x00ac,\n\t0x00ae, 0x00b1,\n\t0x00b4, 0x00b4,\n\t0x00b8, 0x00b8,\n\t0x00d7, 0x00d7,\n\t0x00f7, 0x00f7,\n\t0x02c2, 0x02c5,\n\t0x02d2, 0x02df,\n\t0x02e5, 0x02eb,\n\t0x02ed, 0x02ed,\n\t0x02ef, 0x02ff,\n\t0x0375, 0x0375,\n\t0x0384, 0x0385,\n\t0x03f6, 0x03f6,\n\t0x0482, 0x0482,\n\t0x058f, 0x058f,\n\t0x0606, 0x0608,\n\t0x060b, 0x060b,\n\t0x060e, 0x060f,\n\t0x06de, 0x06de,\n\t0x06e9, 0x06e9,\n\t0x06fd, 0x06fe,\n\t0x07f6, 0x07f6,\n\t0x09f2, 0x09f3,\n\t0x09fa, 0x09fb,\n\t0x0af1, 0x0af1,\n\t0x0b70, 0x0b70,\n\t0x0bf3, 0x0bfa,\n\t0x0c7f, 0x0c7f,\n\t0x0d79, 0x0d79,\n\t0x0e3f, 0x0e3f,\n\t0x0f01, 0x0f03,\n\t0x0f13, 0x0f13,\n\t0x0f15, 0x0f17,\n\t0x0f1a, 0x0f1f,\n\t0x0f34, 0x0f34,\n\t0x0f36, 0x0f36,\n\t0x0f38, 0x0f38,\n\t0x0fbe, 0x0fc5,\n\t0x0fc7, 0x0fcc,\n\t0x0fce, 0x0fcf,\n\t0x0fd5, 0x0fd8,\n\t0x109e, 0x109f,\n\t0x1390, 0x1399,\n\t0x17db, 0x17db,\n\t0x1940, 0x1940,\n\t0x19de, 0x19ff,\n\t0x1b61, 0x1b6a,\n\t0x1b74, 0x1b7c,\n\t0x1fbd, 0x1fbd,\n\t0x1fbf, 0x1fc1,\n\t0x1fcd, 0x1fcf,\n\t0x1fdd, 0x1fdf,\n\t0x1fed, 0x1fef,\n\t0x1ffd, 0x1ffe,\n\t0x2044, 0x2044,\n\t0x2052, 0x2052,\n\t0x207a, 0x207c,\n\t0x208a, 0x208c,\n\t0x20a0, 0x20b9,\n\t0x2100, 0x2101,\n\t0x2103, 0x2106,\n\t0x2108, 0x2109,\n\t0x2114, 0x2114,\n\t0x2116, 0x2118,\n\t0x211e, 0x2123,\n\t0x2125, 0x2125,\n\t0x2127, 0x2127,\n\t0x2129, 0x2129,\n\t0x212e, 0x212e,\n\t0x213a, 0x213b,\n\t0x2140, 0x2144,\n\t0x214a, 0x214d,\n\t0x214f, 0x214f,\n\t0x2190, 0x2328,\n\t0x232b, 0x23f3,\n\t0x2400, 0x2426,\n\t0x2440, 0x244a,\n\t0x249c, 0x24e9,\n\t0x2500, 0x26ff,\n\t0x2701, 0x2767,\n\t0x2794, 0x27c4,\n\t0x27c7, 0x27e5,\n\t0x27f0, 0x2982,\n\t0x2999, 0x29d7,\n\t0x29dc, 0x29fb,\n\t0x29fe, 0x2b4c,\n\t0x2b50, 0x2b59,\n\t0x2ce5, 0x2cea,\n\t0x2e80, 0x2e99,\n\t0x2e9b, 0x2ef3,\n\t0x2f00, 0x2fd5,\n\t0x2ff0, 0x2ffb,\n\t0x3004, 0x3004,\n\t0x3012, 0x3013,\n\t0x3020, 0x3020,\n\t0x3036, 0x3037,\n\t0x303e, 0x303f,\n\t0x309b, 0x309c,\n\t0x3190, 0x3191,\n\t0x3196, 0x319f,\n\t0x31c0, 0x31e3,\n\t0x3200, 0x321e,\n\t0x322a, 0x3247,\n\t0x3250, 0x3250,\n\t0x3260, 0x327f,\n\t0x328a, 0x32b0,\n\t0x32c0, 0x32fe,\n\t0x3300, 0x33ff,\n\t0x4dc0, 0x4dff,\n\t0xa490, 0xa4c6,\n\t0xa700, 0xa716,\n\t0xa720, 0xa721,\n\t0xa789, 0xa78a,\n\t0xa828, 0xa82b,\n\t0xa836, 0xa839,\n\t0xaa77, 0xaa79,\n\t0xfb29, 0xfb29,\n\t0xfbb2, 0xfbc1,\n\t0xfdfc, 0xfdfd,\n\t0xfe62, 0xfe62,\n\t0xfe64, 0xfe66,\n\t0xfe69, 0xfe69,\n\t0xff04, 0xff04,\n\t0xff0b, 0xff0b,\n\t0xff1c, 0xff1e,\n\t0xff3e, 0xff3e,\n\t0xff40, 0xff40,\n\t0xff5c, 0xff5c,\n\t0xff5e, 0xff5e,\n\t0xffe0, 0xffe6,\n\t0xffe8, 0xffee,\n\t0xfffc, 0xfffd,\n\t0x10137, 0x1013f,\n\t0x10179, 0x10189,\n\t0x10190, 0x1019b,\n\t0x101d0, 0x101fc,\n\t0x1d000, 0x1d0f5,\n\t0x1d100, 0x1d126,\n\t0x1d129, 0x1d164,\n\t0x1d16a, 0x1d16c,\n\t0x1d183, 0x1d184,\n\t0x1d18c, 0x1d1a9,\n\t0x1d1ae, 0x1d1dd,\n\t0x1d200, 0x1d241,\n\t0x1d245, 0x1d245,\n\t0x1d300, 0x1d356,\n\t0x1d6c1, 0x1d6c1,\n\t0x1d6db, 0x1d6db,\n\t0x1d6fb, 0x1d6fb,\n\t0x1d715, 0x1d715,\n\t0x1d735, 0x1d735,\n\t0x1d74f, 0x1d74f,\n\t0x1d76f, 0x1d76f,\n\t0x1d789, 0x1d789,\n\t0x1d7a9, 0x1d7a9,\n\t0x1d7c3, 0x1d7c3,\n\t0x1eef0, 0x1eef1,\n\t0x1f000, 0x1f02b,\n\t0x1f030, 0x1f093,\n\t0x1f0a0, 0x1f0ae,\n\t0x1f0b1, 0x1f0be,\n\t0x1f0c1, 0x1f0cf,\n\t0x1f0d1, 0x1f0df,\n\t0x1f110, 0x1f12e,\n\t0x1f130, 0x1f16b,\n\t0x1f170, 0x1f19a,\n\t0x1f1e6, 0x1f202,\n\t0x1f210, 0x1f23a,\n\t0x1f240, 0x1f248,\n\t0x1f250, 0x1f251,\n\t0x1f300, 0x1f320,\n\t0x1f330, 0x1f335,\n\t0x1f337, 0x1f37c,\n\t0x1f380, 0x1f393,\n\t0x1f3a0, 0x1f3c4,\n\t0x1f3c6, 0x1f3ca,\n\t0x1f3e0, 0x1f3f0,\n\t0x1f400, 0x1f43e,\n\t0x1f440, 0x1f440,\n\t0x1f442, 0x1f4f7,\n\t0x1f4f9, 0x1f4fc,\n\t0x1f500, 0x1f53d,\n\t0x1f540, 0x1f543,\n\t0x1f550, 0x1f567,\n\t0x1f5fb, 0x1f640,\n\t0x1f645, 0x1f64f,\n\t0x1f680, 0x1f6c5,\n\t0x1f700, 0x1f773,\n}; /* CR_S */\n\n/* 'Sc': General Category */\nstatic const OnigCodePoint CR_Sc[] = {\n\t17,\n\t0x0024, 0x0024,\n\t0x00a2, 0x00a5,\n\t0x058f, 0x058f,\n\t0x060b, 0x060b,\n\t0x09f2, 0x09f3,\n\t0x09fb, 0x09fb,\n\t0x0af1, 0x0af1,\n\t0x0bf9, 0x0bf9,\n\t0x0e3f, 0x0e3f,\n\t0x17db, 0x17db,\n\t0x20a0, 0x20b9,\n\t0xa838, 0xa838,\n\t0xfdfc, 0xfdfc,\n\t0xfe69, 0xfe69,\n\t0xff04, 0xff04,\n\t0xffe0, 0xffe1,\n\t0xffe5, 0xffe6,\n}; /* CR_Sc */\n\n/* 'Sk': General Category */\nstatic const OnigCodePoint CR_Sk[] = {\n\t27,\n\t0x005e, 0x005e,\n\t0x0060, 0x0060,\n\t0x00a8, 0x00a8,\n\t0x00af, 0x00af,\n\t0x00b4, 0x00b4,\n\t0x00b8, 0x00b8,\n\t0x02c2, 0x02c5,\n\t0x02d2, 0x02df,\n\t0x02e5, 0x02eb,\n\t0x02ed, 0x02ed,\n\t0x02ef, 0x02ff,\n\t0x0375, 0x0375,\n\t0x0384, 0x0385,\n\t0x1fbd, 0x1fbd,\n\t0x1fbf, 0x1fc1,\n\t0x1fcd, 0x1fcf,\n\t0x1fdd, 0x1fdf,\n\t0x1fed, 0x1fef,\n\t0x1ffd, 0x1ffe,\n\t0x309b, 0x309c,\n\t0xa700, 0xa716,\n\t0xa720, 0xa721,\n\t0xa789, 0xa78a,\n\t0xfbb2, 0xfbc1,\n\t0xff3e, 0xff3e,\n\t0xff40, 0xff40,\n\t0xffe3, 0xffe3,\n}; /* CR_Sk */\n\n/* 'Sm': General Category */\nstatic const OnigCodePoint CR_Sm[] = {\n\t65,\n\t0x002b, 0x002b,\n\t0x003c, 0x003e,\n\t0x007c, 0x007c,\n\t0x007e, 0x007e,\n\t0x00ac, 0x00ac,\n\t0x00b1, 0x00b1,\n\t0x00d7, 0x00d7,\n\t0x00f7, 0x00f7,\n\t0x03f6, 0x03f6,\n\t0x0606, 0x0608,\n\t0x2044, 0x2044,\n\t0x2052, 0x2052,\n\t0x207a, 0x207c,\n\t0x208a, 0x208c,\n\t0x2118, 0x2118,\n\t0x2140, 0x2144,\n\t0x214b, 0x214b,\n\t0x2190, 0x2194,\n\t0x219a, 0x219b,\n\t0x21a0, 0x21a0,\n\t0x21a3, 0x21a3,\n\t0x21a6, 0x21a6,\n\t0x21ae, 0x21ae,\n\t0x21ce, 0x21cf,\n\t0x21d2, 0x21d2,\n\t0x21d4, 0x21d4,\n\t0x21f4, 0x22ff,\n\t0x2308, 0x230b,\n\t0x2320, 0x2321,\n\t0x237c, 0x237c,\n\t0x239b, 0x23b3,\n\t0x23dc, 0x23e1,\n\t0x25b7, 0x25b7,\n\t0x25c1, 0x25c1,\n\t0x25f8, 0x25ff,\n\t0x266f, 0x266f,\n\t0x27c0, 0x27c4,\n\t0x27c7, 0x27e5,\n\t0x27f0, 0x27ff,\n\t0x2900, 0x2982,\n\t0x2999, 0x29d7,\n\t0x29dc, 0x29fb,\n\t0x29fe, 0x2aff,\n\t0x2b30, 0x2b44,\n\t0x2b47, 0x2b4c,\n\t0xfb29, 0xfb29,\n\t0xfe62, 0xfe62,\n\t0xfe64, 0xfe66,\n\t0xff0b, 0xff0b,\n\t0xff1c, 0xff1e,\n\t0xff5c, 0xff5c,\n\t0xff5e, 0xff5e,\n\t0xffe2, 0xffe2,\n\t0xffe9, 0xffec,\n\t0x1d6c1, 0x1d6c1,\n\t0x1d6db, 0x1d6db,\n\t0x1d6fb, 0x1d6fb,\n\t0x1d715, 0x1d715,\n\t0x1d735, 0x1d735,\n\t0x1d74f, 0x1d74f,\n\t0x1d76f, 0x1d76f,\n\t0x1d789, 0x1d789,\n\t0x1d7a9, 0x1d7a9,\n\t0x1d7c3, 0x1d7c3,\n\t0x1eef0, 0x1eef1,\n}; /* CR_Sm */\n\n/* 'So': General Category */\nstatic const OnigCodePoint CR_So[] = {\n\t153,\n\t0x00a6, 0x00a6,\n\t0x00a9, 0x00a9,\n\t0x00ae, 0x00ae,\n\t0x00b0, 0x00b0,\n\t0x0482, 0x0482,\n\t0x060e, 0x060f,\n\t0x06de, 0x06de,\n\t0x06e9, 0x06e9,\n\t0x06fd, 0x06fe,\n\t0x07f6, 0x07f6,\n\t0x09fa, 0x09fa,\n\t0x0b70, 0x0b70,\n\t0x0bf3, 0x0bf8,\n\t0x0bfa, 0x0bfa,\n\t0x0c7f, 0x0c7f,\n\t0x0d79, 0x0d79,\n\t0x0f01, 0x0f03,\n\t0x0f13, 0x0f13,\n\t0x0f15, 0x0f17,\n\t0x0f1a, 0x0f1f,\n\t0x0f34, 0x0f34,\n\t0x0f36, 0x0f36,\n\t0x0f38, 0x0f38,\n\t0x0fbe, 0x0fc5,\n\t0x0fc7, 0x0fcc,\n\t0x0fce, 0x0fcf,\n\t0x0fd5, 0x0fd8,\n\t0x109e, 0x109f,\n\t0x1390, 0x1399,\n\t0x1940, 0x1940,\n\t0x19de, 0x19ff,\n\t0x1b61, 0x1b6a,\n\t0x1b74, 0x1b7c,\n\t0x2100, 0x2101,\n\t0x2103, 0x2106,\n\t0x2108, 0x2109,\n\t0x2114, 0x2114,\n\t0x2116, 0x2117,\n\t0x211e, 0x2123,\n\t0x2125, 0x2125,\n\t0x2127, 0x2127,\n\t0x2129, 0x2129,\n\t0x212e, 0x212e,\n\t0x213a, 0x213b,\n\t0x214a, 0x214a,\n\t0x214c, 0x214d,\n\t0x214f, 0x214f,\n\t0x2195, 0x2199,\n\t0x219c, 0x219f,\n\t0x21a1, 0x21a2,\n\t0x21a4, 0x21a5,\n\t0x21a7, 0x21ad,\n\t0x21af, 0x21cd,\n\t0x21d0, 0x21d1,\n\t0x21d3, 0x21d3,\n\t0x21d5, 0x21f3,\n\t0x2300, 0x2307,\n\t0x230c, 0x231f,\n\t0x2322, 0x2328,\n\t0x232b, 0x237b,\n\t0x237d, 0x239a,\n\t0x23b4, 0x23db,\n\t0x23e2, 0x23f3,\n\t0x2400, 0x2426,\n\t0x2440, 0x244a,\n\t0x249c, 0x24e9,\n\t0x2500, 0x25b6,\n\t0x25b8, 0x25c0,\n\t0x25c2, 0x25f7,\n\t0x2600, 0x266e,\n\t0x2670, 0x26ff,\n\t0x2701, 0x2767,\n\t0x2794, 0x27bf,\n\t0x2800, 0x28ff,\n\t0x2b00, 0x2b2f,\n\t0x2b45, 0x2b46,\n\t0x2b50, 0x2b59,\n\t0x2ce5, 0x2cea,\n\t0x2e80, 0x2e99,\n\t0x2e9b, 0x2ef3,\n\t0x2f00, 0x2fd5,\n\t0x2ff0, 0x2ffb,\n\t0x3004, 0x3004,\n\t0x3012, 0x3013,\n\t0x3020, 0x3020,\n\t0x3036, 0x3037,\n\t0x303e, 0x303f,\n\t0x3190, 0x3191,\n\t0x3196, 0x319f,\n\t0x31c0, 0x31e3,\n\t0x3200, 0x321e,\n\t0x322a, 0x3247,\n\t0x3250, 0x3250,\n\t0x3260, 0x327f,\n\t0x328a, 0x32b0,\n\t0x32c0, 0x32fe,\n\t0x3300, 0x33ff,\n\t0x4dc0, 0x4dff,\n\t0xa490, 0xa4c6,\n\t0xa828, 0xa82b,\n\t0xa836, 0xa837,\n\t0xa839, 0xa839,\n\t0xaa77, 0xaa79,\n\t0xfdfd, 0xfdfd,\n\t0xffe4, 0xffe4,\n\t0xffe8, 0xffe8,\n\t0xffed, 0xffee,\n\t0xfffc, 0xfffd,\n\t0x10137, 0x1013f,\n\t0x10179, 0x10189,\n\t0x10190, 0x1019b,\n\t0x101d0, 0x101fc,\n\t0x1d000, 0x1d0f5,\n\t0x1d100, 0x1d126,\n\t0x1d129, 0x1d164,\n\t0x1d16a, 0x1d16c,\n\t0x1d183, 0x1d184,\n\t0x1d18c, 0x1d1a9,\n\t0x1d1ae, 0x1d1dd,\n\t0x1d200, 0x1d241,\n\t0x1d245, 0x1d245,\n\t0x1d300, 0x1d356,\n\t0x1f000, 0x1f02b,\n\t0x1f030, 0x1f093,\n\t0x1f0a0, 0x1f0ae,\n\t0x1f0b1, 0x1f0be,\n\t0x1f0c1, 0x1f0cf,\n\t0x1f0d1, 0x1f0df,\n\t0x1f110, 0x1f12e,\n\t0x1f130, 0x1f16b,\n\t0x1f170, 0x1f19a,\n\t0x1f1e6, 0x1f202,\n\t0x1f210, 0x1f23a,\n\t0x1f240, 0x1f248,\n\t0x1f250, 0x1f251,\n\t0x1f300, 0x1f320,\n\t0x1f330, 0x1f335,\n\t0x1f337, 0x1f37c,\n\t0x1f380, 0x1f393,\n\t0x1f3a0, 0x1f3c4,\n\t0x1f3c6, 0x1f3ca,\n\t0x1f3e0, 0x1f3f0,\n\t0x1f400, 0x1f43e,\n\t0x1f440, 0x1f440,\n\t0x1f442, 0x1f4f7,\n\t0x1f4f9, 0x1f4fc,\n\t0x1f500, 0x1f53d,\n\t0x1f540, 0x1f543,\n\t0x1f550, 0x1f567,\n\t0x1f5fb, 0x1f640,\n\t0x1f645, 0x1f64f,\n\t0x1f680, 0x1f6c5,\n\t0x1f700, 0x1f773,\n}; /* CR_So */\n\n/* 'Z': Major Category */\nstatic const OnigCodePoint CR_Z[] = {\n\t9,\n\t0x0020, 0x0020,\n\t0x00a0, 0x00a0,\n\t0x1680, 0x1680,\n\t0x180e, 0x180e,\n\t0x2000, 0x200a,\n\t0x2028, 0x2029,\n\t0x202f, 0x202f,\n\t0x205f, 0x205f,\n\t0x3000, 0x3000,\n}; /* CR_Z */\n\n/* 'Zl': General Category */\nstatic const OnigCodePoint CR_Zl[] = {\n\t1,\n\t0x2028, 0x2028,\n}; /* CR_Zl */\n\n/* 'Zp': General Category */\nstatic const OnigCodePoint CR_Zp[] = {\n\t1,\n\t0x2029, 0x2029,\n}; /* CR_Zp */\n\n/* 'Zs': General Category */\nstatic const OnigCodePoint CR_Zs[] = {\n\t8,\n\t0x0020, 0x0020,\n\t0x00a0, 0x00a0,\n\t0x1680, 0x1680,\n\t0x180e, 0x180e,\n\t0x2000, 0x200a,\n\t0x202f, 0x202f,\n\t0x205f, 0x205f,\n\t0x3000, 0x3000,\n}; /* CR_Zs */\n\n/* 'Math': Derived Property */\nstatic const OnigCodePoint CR_Math[] = {\n\t138,\n\t0x002b, 0x002b,\n\t0x003c, 0x003e,\n\t0x005e, 0x005e,\n\t0x007c, 0x007c,\n\t0x007e, 0x007e,\n\t0x00ac, 0x00ac,\n\t0x00b1, 0x00b1,\n\t0x00d7, 0x00d7,\n\t0x00f7, 0x00f7,\n\t0x03d0, 0x03d2,\n\t0x03d5, 0x03d5,\n\t0x03f0, 0x03f1,\n\t0x03f4, 0x03f6,\n\t0x0606, 0x0608,\n\t0x2016, 0x2016,\n\t0x2032, 0x2034,\n\t0x2040, 0x2040,\n\t0x2044, 0x2044,\n\t0x2052, 0x2052,\n\t0x2061, 0x2064,\n\t0x207a, 0x207e,\n\t0x208a, 0x208e,\n\t0x20d0, 0x20dc,\n\t0x20e1, 0x20e1,\n\t0x20e5, 0x20e6,\n\t0x20eb, 0x20ef,\n\t0x2102, 0x2102,\n\t0x2107, 0x2107,\n\t0x210a, 0x2113,\n\t0x2115, 0x2115,\n\t0x2118, 0x211d,\n\t0x2124, 0x2124,\n\t0x2128, 0x2129,\n\t0x212c, 0x212d,\n\t0x212f, 0x2131,\n\t0x2133, 0x2138,\n\t0x213c, 0x2149,\n\t0x214b, 0x214b,\n\t0x2190, 0x21a7,\n\t0x21a9, 0x21ae,\n\t0x21b0, 0x21b1,\n\t0x21b6, 0x21b7,\n\t0x21bc, 0x21db,\n\t0x21dd, 0x21dd,\n\t0x21e4, 0x21e5,\n\t0x21f4, 0x22ff,\n\t0x2308, 0x230b,\n\t0x2320, 0x2321,\n\t0x237c, 0x237c,\n\t0x239b, 0x23b5,\n\t0x23b7, 0x23b7,\n\t0x23d0, 0x23d0,\n\t0x23dc, 0x23e2,\n\t0x25a0, 0x25a1,\n\t0x25ae, 0x25b7,\n\t0x25bc, 0x25c1,\n\t0x25c6, 0x25c7,\n\t0x25ca, 0x25cb,\n\t0x25cf, 0x25d3,\n\t0x25e2, 0x25e2,\n\t0x25e4, 0x25e4,\n\t0x25e7, 0x25ec,\n\t0x25f8, 0x25ff,\n\t0x2605, 0x2606,\n\t0x2640, 0x2640,\n\t0x2642, 0x2642,\n\t0x2660, 0x2663,\n\t0x266d, 0x266f,\n\t0x27c0, 0x27ff,\n\t0x2900, 0x2aff,\n\t0x2b30, 0x2b44,\n\t0x2b47, 0x2b4c,\n\t0xfb29, 0xfb29,\n\t0xfe61, 0xfe66,\n\t0xfe68, 0xfe68,\n\t0xff0b, 0xff0b,\n\t0xff1c, 0xff1e,\n\t0xff3c, 0xff3c,\n\t0xff3e, 0xff3e,\n\t0xff5c, 0xff5c,\n\t0xff5e, 0xff5e,\n\t0xffe2, 0xffe2,\n\t0xffe9, 0xffec,\n\t0x1d400, 0x1d454,\n\t0x1d456, 0x1d49c,\n\t0x1d49e, 0x1d49f,\n\t0x1d4a2, 0x1d4a2,\n\t0x1d4a5, 0x1d4a6,\n\t0x1d4a9, 0x1d4ac,\n\t0x1d4ae, 0x1d4b9,\n\t0x1d4bb, 0x1d4bb,\n\t0x1d4bd, 0x1d4c3,\n\t0x1d4c5, 0x1d505,\n\t0x1d507, 0x1d50a,\n\t0x1d50d, 0x1d514,\n\t0x1d516, 0x1d51c,\n\t0x1d51e, 0x1d539,\n\t0x1d53b, 0x1d53e,\n\t0x1d540, 0x1d544,\n\t0x1d546, 0x1d546,\n\t0x1d54a, 0x1d550,\n\t0x1d552, 0x1d6a5,\n\t0x1d6a8, 0x1d7cb,\n\t0x1d7ce, 0x1d7ff,\n\t0x1ee00, 0x1ee03,\n\t0x1ee05, 0x1ee1f,\n\t0x1ee21, 0x1ee22,\n\t0x1ee24, 0x1ee24,\n\t0x1ee27, 0x1ee27,\n\t0x1ee29, 0x1ee32,\n\t0x1ee34, 0x1ee37,\n\t0x1ee39, 0x1ee39,\n\t0x1ee3b, 0x1ee3b,\n\t0x1ee42, 0x1ee42,\n\t0x1ee47, 0x1ee47,\n\t0x1ee49, 0x1ee49,\n\t0x1ee4b, 0x1ee4b,\n\t0x1ee4d, 0x1ee4f,\n\t0x1ee51, 0x1ee52,\n\t0x1ee54, 0x1ee54,\n\t0x1ee57, 0x1ee57,\n\t0x1ee59, 0x1ee59,\n\t0x1ee5b, 0x1ee5b,\n\t0x1ee5d, 0x1ee5d,\n\t0x1ee5f, 0x1ee5f,\n\t0x1ee61, 0x1ee62,\n\t0x1ee64, 0x1ee64,\n\t0x1ee67, 0x1ee6a,\n\t0x1ee6c, 0x1ee72,\n\t0x1ee74, 0x1ee77,\n\t0x1ee79, 0x1ee7c,\n\t0x1ee7e, 0x1ee7e,\n\t0x1ee80, 0x1ee89,\n\t0x1ee8b, 0x1ee9b,\n\t0x1eea1, 0x1eea3,\n\t0x1eea5, 0x1eea9,\n\t0x1eeab, 0x1eebb,\n\t0x1eef0, 0x1eef1,\n}; /* CR_Math */\n\n/* 'Alphabetic': Derived Property */\n#define CR_Alphabetic CR_Alpha\n\n/* 'Lowercase': Derived Property */\n#define CR_Lowercase CR_Lower\n\n/* 'Uppercase': Derived Property */\n#define CR_Uppercase CR_Upper\n\n/* 'Cased': Derived Property */\nstatic const OnigCodePoint CR_Cased[] = {\n\t119,\n\t0x0041, 0x005a,\n\t0x0061, 0x007a,\n\t0x00aa, 0x00aa,\n\t0x00b5, 0x00b5,\n\t0x00ba, 0x00ba,\n\t0x00c0, 0x00d6,\n\t0x00d8, 0x00f6,\n\t0x00f8, 0x01ba,\n\t0x01bc, 0x01bf,\n\t0x01c4, 0x0293,\n\t0x0295, 0x02b8,\n\t0x02c0, 0x02c1,\n\t0x02e0, 0x02e4,\n\t0x0345, 0x0345,\n\t0x0370, 0x0373,\n\t0x0376, 0x0377,\n\t0x037a, 0x037d,\n\t0x0386, 0x0386,\n\t0x0388, 0x038a,\n\t0x038c, 0x038c,\n\t0x038e, 0x03a1,\n\t0x03a3, 0x03f5,\n\t0x03f7, 0x0481,\n\t0x048a, 0x0527,\n\t0x0531, 0x0556,\n\t0x0561, 0x0587,\n\t0x10a0, 0x10c5,\n\t0x10c7, 0x10c7,\n\t0x10cd, 0x10cd,\n\t0x1d00, 0x1dbf,\n\t0x1e00, 0x1f15,\n\t0x1f18, 0x1f1d,\n\t0x1f20, 0x1f45,\n\t0x1f48, 0x1f4d,\n\t0x1f50, 0x1f57,\n\t0x1f59, 0x1f59,\n\t0x1f5b, 0x1f5b,\n\t0x1f5d, 0x1f5d,\n\t0x1f5f, 0x1f7d,\n\t0x1f80, 0x1fb4,\n\t0x1fb6, 0x1fbc,\n\t0x1fbe, 0x1fbe,\n\t0x1fc2, 0x1fc4,\n\t0x1fc6, 0x1fcc,\n\t0x1fd0, 0x1fd3,\n\t0x1fd6, 0x1fdb,\n\t0x1fe0, 0x1fec,\n\t0x1ff2, 0x1ff4,\n\t0x1ff6, 0x1ffc,\n\t0x2071, 0x2071,\n\t0x207f, 0x207f,\n\t0x2090, 0x209c,\n\t0x2102, 0x2102,\n\t0x2107, 0x2107,\n\t0x210a, 0x2113,\n\t0x2115, 0x2115,\n\t0x2119, 0x211d,\n\t0x2124, 0x2124,\n\t0x2126, 0x2126,\n\t0x2128, 0x2128,\n\t0x212a, 0x212d,\n\t0x212f, 0x2134,\n\t0x2139, 0x2139,\n\t0x213c, 0x213f,\n\t0x2145, 0x2149,\n\t0x214e, 0x214e,\n\t0x2160, 0x217f,\n\t0x2183, 0x2184,\n\t0x24b6, 0x24e9,\n\t0x2c00, 0x2c2e,\n\t0x2c30, 0x2c5e,\n\t0x2c60, 0x2ce4,\n\t0x2ceb, 0x2cee,\n\t0x2cf2, 0x2cf3,\n\t0x2d00, 0x2d25,\n\t0x2d27, 0x2d27,\n\t0x2d2d, 0x2d2d,\n\t0xa640, 0xa66d,\n\t0xa680, 0xa697,\n\t0xa722, 0xa787,\n\t0xa78b, 0xa78e,\n\t0xa790, 0xa793,\n\t0xa7a0, 0xa7aa,\n\t0xa7f8, 0xa7fa,\n\t0xfb00, 0xfb06,\n\t0xfb13, 0xfb17,\n\t0xff21, 0xff3a,\n\t0xff41, 0xff5a,\n\t0x10400, 0x1044f,\n\t0x1d400, 0x1d454,\n\t0x1d456, 0x1d49c,\n\t0x1d49e, 0x1d49f,\n\t0x1d4a2, 0x1d4a2,\n\t0x1d4a5, 0x1d4a6,\n\t0x1d4a9, 0x1d4ac,\n\t0x1d4ae, 0x1d4b9,\n\t0x1d4bb, 0x1d4bb,\n\t0x1d4bd, 0x1d4c3,\n\t0x1d4c5, 0x1d505,\n\t0x1d507, 0x1d50a,\n\t0x1d50d, 0x1d514,\n\t0x1d516, 0x1d51c,\n\t0x1d51e, 0x1d539,\n\t0x1d53b, 0x1d53e,\n\t0x1d540, 0x1d544,\n\t0x1d546, 0x1d546,\n\t0x1d54a, 0x1d550,\n\t0x1d552, 0x1d6a5,\n\t0x1d6a8, 0x1d6c0,\n\t0x1d6c2, 0x1d6da,\n\t0x1d6dc, 0x1d6fa,\n\t0x1d6fc, 0x1d714,\n\t0x1d716, 0x1d734,\n\t0x1d736, 0x1d74e,\n\t0x1d750, 0x1d76e,\n\t0x1d770, 0x1d788,\n\t0x1d78a, 0x1d7a8,\n\t0x1d7aa, 0x1d7c2,\n\t0x1d7c4, 0x1d7cb,\n}; /* CR_Cased */\n\n/* 'Case_Ignorable': Derived Property */\nstatic const OnigCodePoint CR_Case_Ignorable[] = {\n\t295,\n\t0x0027, 0x0027,\n\t0x002e, 0x002e,\n\t0x003a, 0x003a,\n\t0x005e, 0x005e,\n\t0x0060, 0x0060,\n\t0x00a8, 0x00a8,\n\t0x00ad, 0x00ad,\n\t0x00af, 0x00af,\n\t0x00b4, 0x00b4,\n\t0x00b7, 0x00b8,\n\t0x02b0, 0x036f,\n\t0x0374, 0x0375,\n\t0x037a, 0x037a,\n\t0x0384, 0x0385,\n\t0x0387, 0x0387,\n\t0x0483, 0x0489,\n\t0x0559, 0x0559,\n\t0x0591, 0x05bd,\n\t0x05bf, 0x05bf,\n\t0x05c1, 0x05c2,\n\t0x05c4, 0x05c5,\n\t0x05c7, 0x05c7,\n\t0x05f4, 0x05f4,\n\t0x0600, 0x0604,\n\t0x0610, 0x061a,\n\t0x0640, 0x0640,\n\t0x064b, 0x065f,\n\t0x0670, 0x0670,\n\t0x06d6, 0x06dd,\n\t0x06df, 0x06e8,\n\t0x06ea, 0x06ed,\n\t0x070f, 0x070f,\n\t0x0711, 0x0711,\n\t0x0730, 0x074a,\n\t0x07a6, 0x07b0,\n\t0x07eb, 0x07f5,\n\t0x07fa, 0x07fa,\n\t0x0816, 0x082d,\n\t0x0859, 0x085b,\n\t0x08e4, 0x08fe,\n\t0x0900, 0x0902,\n\t0x093a, 0x093a,\n\t0x093c, 0x093c,\n\t0x0941, 0x0948,\n\t0x094d, 0x094d,\n\t0x0951, 0x0957,\n\t0x0962, 0x0963,\n\t0x0971, 0x0971,\n\t0x0981, 0x0981,\n\t0x09bc, 0x09bc,\n\t0x09c1, 0x09c4,\n\t0x09cd, 0x09cd,\n\t0x09e2, 0x09e3,\n\t0x0a01, 0x0a02,\n\t0x0a3c, 0x0a3c,\n\t0x0a41, 0x0a42,\n\t0x0a47, 0x0a48,\n\t0x0a4b, 0x0a4d,\n\t0x0a51, 0x0a51,\n\t0x0a70, 0x0a71,\n\t0x0a75, 0x0a75,\n\t0x0a81, 0x0a82,\n\t0x0abc, 0x0abc,\n\t0x0ac1, 0x0ac5,\n\t0x0ac7, 0x0ac8,\n\t0x0acd, 0x0acd,\n\t0x0ae2, 0x0ae3,\n\t0x0b01, 0x0b01,\n\t0x0b3c, 0x0b3c,\n\t0x0b3f, 0x0b3f,\n\t0x0b41, 0x0b44,\n\t0x0b4d, 0x0b4d,\n\t0x0b56, 0x0b56,\n\t0x0b62, 0x0b63,\n\t0x0b82, 0x0b82,\n\t0x0bc0, 0x0bc0,\n\t0x0bcd, 0x0bcd,\n\t0x0c3e, 0x0c40,\n\t0x0c46, 0x0c48,\n\t0x0c4a, 0x0c4d,\n\t0x0c55, 0x0c56,\n\t0x0c62, 0x0c63,\n\t0x0cbc, 0x0cbc,\n\t0x0cbf, 0x0cbf,\n\t0x0cc6, 0x0cc6,\n\t0x0ccc, 0x0ccd,\n\t0x0ce2, 0x0ce3,\n\t0x0d41, 0x0d44,\n\t0x0d4d, 0x0d4d,\n\t0x0d62, 0x0d63,\n\t0x0dca, 0x0dca,\n\t0x0dd2, 0x0dd4,\n\t0x0dd6, 0x0dd6,\n\t0x0e31, 0x0e31,\n\t0x0e34, 0x0e3a,\n\t0x0e46, 0x0e4e,\n\t0x0eb1, 0x0eb1,\n\t0x0eb4, 0x0eb9,\n\t0x0ebb, 0x0ebc,\n\t0x0ec6, 0x0ec6,\n\t0x0ec8, 0x0ecd,\n\t0x0f18, 0x0f19,\n\t0x0f35, 0x0f35,\n\t0x0f37, 0x0f37,\n\t0x0f39, 0x0f39,\n\t0x0f71, 0x0f7e,\n\t0x0f80, 0x0f84,\n\t0x0f86, 0x0f87,\n\t0x0f8d, 0x0f97,\n\t0x0f99, 0x0fbc,\n\t0x0fc6, 0x0fc6,\n\t0x102d, 0x1030,\n\t0x1032, 0x1037,\n\t0x1039, 0x103a,\n\t0x103d, 0x103e,\n\t0x1058, 0x1059,\n\t0x105e, 0x1060,\n\t0x1071, 0x1074,\n\t0x1082, 0x1082,\n\t0x1085, 0x1086,\n\t0x108d, 0x108d,\n\t0x109d, 0x109d,\n\t0x10fc, 0x10fc,\n\t0x135d, 0x135f,\n\t0x1712, 0x1714,\n\t0x1732, 0x1734,\n\t0x1752, 0x1753,\n\t0x1772, 0x1773,\n\t0x17b4, 0x17b5,\n\t0x17b7, 0x17bd,\n\t0x17c6, 0x17c6,\n\t0x17c9, 0x17d3,\n\t0x17d7, 0x17d7,\n\t0x17dd, 0x17dd,\n\t0x180b, 0x180d,\n\t0x1843, 0x1843,\n\t0x18a9, 0x18a9,\n\t0x1920, 0x1922,\n\t0x1927, 0x1928,\n\t0x1932, 0x1932,\n\t0x1939, 0x193b,\n\t0x1a17, 0x1a18,\n\t0x1a56, 0x1a56,\n\t0x1a58, 0x1a5e,\n\t0x1a60, 0x1a60,\n\t0x1a62, 0x1a62,\n\t0x1a65, 0x1a6c,\n\t0x1a73, 0x1a7c,\n\t0x1a7f, 0x1a7f,\n\t0x1aa7, 0x1aa7,\n\t0x1b00, 0x1b03,\n\t0x1b34, 0x1b34,\n\t0x1b36, 0x1b3a,\n\t0x1b3c, 0x1b3c,\n\t0x1b42, 0x1b42,\n\t0x1b6b, 0x1b73,\n\t0x1b80, 0x1b81,\n\t0x1ba2, 0x1ba5,\n\t0x1ba8, 0x1ba9,\n\t0x1bab, 0x1bab,\n\t0x1be6, 0x1be6,\n\t0x1be8, 0x1be9,\n\t0x1bed, 0x1bed,\n\t0x1bef, 0x1bf1,\n\t0x1c2c, 0x1c33,\n\t0x1c36, 0x1c37,\n\t0x1c78, 0x1c7d,\n\t0x1cd0, 0x1cd2,\n\t0x1cd4, 0x1ce0,\n\t0x1ce2, 0x1ce8,\n\t0x1ced, 0x1ced,\n\t0x1cf4, 0x1cf4,\n\t0x1d2c, 0x1d6a,\n\t0x1d78, 0x1d78,\n\t0x1d9b, 0x1de6,\n\t0x1dfc, 0x1dff,\n\t0x1fbd, 0x1fbd,\n\t0x1fbf, 0x1fc1,\n\t0x1fcd, 0x1fcf,\n\t0x1fdd, 0x1fdf,\n\t0x1fed, 0x1fef,\n\t0x1ffd, 0x1ffe,\n\t0x200b, 0x200f,\n\t0x2018, 0x2019,\n\t0x2024, 0x2024,\n\t0x2027, 0x2027,\n\t0x202a, 0x202e,\n\t0x2060, 0x2064,\n\t0x206a, 0x206f,\n\t0x2071, 0x2071,\n\t0x207f, 0x207f,\n\t0x2090, 0x209c,\n\t0x20d0, 0x20f0,\n\t0x2c7c, 0x2c7d,\n\t0x2cef, 0x2cf1,\n\t0x2d6f, 0x2d6f,\n\t0x2d7f, 0x2d7f,\n\t0x2de0, 0x2dff,\n\t0x2e2f, 0x2e2f,\n\t0x3005, 0x3005,\n\t0x302a, 0x302d,\n\t0x3031, 0x3035,\n\t0x303b, 0x303b,\n\t0x3099, 0x309e,\n\t0x30fc, 0x30fe,\n\t0xa015, 0xa015,\n\t0xa4f8, 0xa4fd,\n\t0xa60c, 0xa60c,\n\t0xa66f, 0xa672,\n\t0xa674, 0xa67d,\n\t0xa67f, 0xa67f,\n\t0xa69f, 0xa69f,\n\t0xa6f0, 0xa6f1,\n\t0xa700, 0xa721,\n\t0xa770, 0xa770,\n\t0xa788, 0xa78a,\n\t0xa7f8, 0xa7f9,\n\t0xa802, 0xa802,\n\t0xa806, 0xa806,\n\t0xa80b, 0xa80b,\n\t0xa825, 0xa826,\n\t0xa8c4, 0xa8c4,\n\t0xa8e0, 0xa8f1,\n\t0xa926, 0xa92d,\n\t0xa947, 0xa951,\n\t0xa980, 0xa982,\n\t0xa9b3, 0xa9b3,\n\t0xa9b6, 0xa9b9,\n\t0xa9bc, 0xa9bc,\n\t0xa9cf, 0xa9cf,\n\t0xaa29, 0xaa2e,\n\t0xaa31, 0xaa32,\n\t0xaa35, 0xaa36,\n\t0xaa43, 0xaa43,\n\t0xaa4c, 0xaa4c,\n\t0xaa70, 0xaa70,\n\t0xaab0, 0xaab0,\n\t0xaab2, 0xaab4,\n\t0xaab7, 0xaab8,\n\t0xaabe, 0xaabf,\n\t0xaac1, 0xaac1,\n\t0xaadd, 0xaadd,\n\t0xaaec, 0xaaed,\n\t0xaaf3, 0xaaf4,\n\t0xaaf6, 0xaaf6,\n\t0xabe5, 0xabe5,\n\t0xabe8, 0xabe8,\n\t0xabed, 0xabed,\n\t0xfb1e, 0xfb1e,\n\t0xfbb2, 0xfbc1,\n\t0xfe00, 0xfe0f,\n\t0xfe13, 0xfe13,\n\t0xfe20, 0xfe26,\n\t0xfe52, 0xfe52,\n\t0xfe55, 0xfe55,\n\t0xfeff, 0xfeff,\n\t0xff07, 0xff07,\n\t0xff0e, 0xff0e,\n\t0xff1a, 0xff1a,\n\t0xff3e, 0xff3e,\n\t0xff40, 0xff40,\n\t0xff70, 0xff70,\n\t0xff9e, 0xff9f,\n\t0xffe3, 0xffe3,\n\t0xfff9, 0xfffb,\n\t0x101fd, 0x101fd,\n\t0x10a01, 0x10a03,\n\t0x10a05, 0x10a06,\n\t0x10a0c, 0x10a0f,\n\t0x10a38, 0x10a3a,\n\t0x10a3f, 0x10a3f,\n\t0x11001, 0x11001,\n\t0x11038, 0x11046,\n\t0x11080, 0x11081,\n\t0x110b3, 0x110b6,\n\t0x110b9, 0x110ba,\n\t0x110bd, 0x110bd,\n\t0x11100, 0x11102,\n\t0x11127, 0x1112b,\n\t0x1112d, 0x11134,\n\t0x11180, 0x11181,\n\t0x111b6, 0x111be,\n\t0x116ab, 0x116ab,\n\t0x116ad, 0x116ad,\n\t0x116b0, 0x116b5,\n\t0x116b7, 0x116b7,\n\t0x16f8f, 0x16f9f,\n\t0x1d167, 0x1d169,\n\t0x1d173, 0x1d182,\n\t0x1d185, 0x1d18b,\n\t0x1d1aa, 0x1d1ad,\n\t0x1d242, 0x1d244,\n\t0xe0001, 0xe0001,\n\t0xe0020, 0xe007f,\n\t0xe0100, 0xe01ef,\n}; /* CR_Case_Ignorable */\n\n/* 'Changes_When_Lowercased': Derived Property */\nstatic const OnigCodePoint CR_Changes_When_Lowercased[] = {\n\t571,\n\t0x0041, 0x005a,\n\t0x00c0, 0x00d6,\n\t0x00d8, 0x00de,\n\t0x0100, 0x0100,\n\t0x0102, 0x0102,\n\t0x0104, 0x0104,\n\t0x0106, 0x0106,\n\t0x0108, 0x0108,\n\t0x010a, 0x010a,\n\t0x010c, 0x010c,\n\t0x010e, 0x010e,\n\t0x0110, 0x0110,\n\t0x0112, 0x0112,\n\t0x0114, 0x0114,\n\t0x0116, 0x0116,\n\t0x0118, 0x0118,\n\t0x011a, 0x011a,\n\t0x011c, 0x011c,\n\t0x011e, 0x011e,\n\t0x0120, 0x0120,\n\t0x0122, 0x0122,\n\t0x0124, 0x0124,\n\t0x0126, 0x0126,\n\t0x0128, 0x0128,\n\t0x012a, 0x012a,\n\t0x012c, 0x012c,\n\t0x012e, 0x012e,\n\t0x0130, 0x0130,\n\t0x0132, 0x0132,\n\t0x0134, 0x0134,\n\t0x0136, 0x0136,\n\t0x0139, 0x0139,\n\t0x013b, 0x013b,\n\t0x013d, 0x013d,\n\t0x013f, 0x013f,\n\t0x0141, 0x0141,\n\t0x0143, 0x0143,\n\t0x0145, 0x0145,\n\t0x0147, 0x0147,\n\t0x014a, 0x014a,\n\t0x014c, 0x014c,\n\t0x014e, 0x014e,\n\t0x0150, 0x0150,\n\t0x0152, 0x0152,\n\t0x0154, 0x0154,\n\t0x0156, 0x0156,\n\t0x0158, 0x0158,\n\t0x015a, 0x015a,\n\t0x015c, 0x015c,\n\t0x015e, 0x015e,\n\t0x0160, 0x0160,\n\t0x0162, 0x0162,\n\t0x0164, 0x0164,\n\t0x0166, 0x0166,\n\t0x0168, 0x0168,\n\t0x016a, 0x016a,\n\t0x016c, 0x016c,\n\t0x016e, 0x016e,\n\t0x0170, 0x0170,\n\t0x0172, 0x0172,\n\t0x0174, 0x0174,\n\t0x0176, 0x0176,\n\t0x0178, 0x0179,\n\t0x017b, 0x017b,\n\t0x017d, 0x017d,\n\t0x0181, 0x0182,\n\t0x0184, 0x0184,\n\t0x0186, 0x0187,\n\t0x0189, 0x018b,\n\t0x018e, 0x0191,\n\t0x0193, 0x0194,\n\t0x0196, 0x0198,\n\t0x019c, 0x019d,\n\t0x019f, 0x01a0,\n\t0x01a2, 0x01a2,\n\t0x01a4, 0x01a4,\n\t0x01a6, 0x01a7,\n\t0x01a9, 0x01a9,\n\t0x01ac, 0x01ac,\n\t0x01ae, 0x01af,\n\t0x01b1, 0x01b3,\n\t0x01b5, 0x01b5,\n\t0x01b7, 0x01b8,\n\t0x01bc, 0x01bc,\n\t0x01c4, 0x01c5,\n\t0x01c7, 0x01c8,\n\t0x01ca, 0x01cb,\n\t0x01cd, 0x01cd,\n\t0x01cf, 0x01cf,\n\t0x01d1, 0x01d1,\n\t0x01d3, 0x01d3,\n\t0x01d5, 0x01d5,\n\t0x01d7, 0x01d7,\n\t0x01d9, 0x01d9,\n\t0x01db, 0x01db,\n\t0x01de, 0x01de,\n\t0x01e0, 0x01e0,\n\t0x01e2, 0x01e2,\n\t0x01e4, 0x01e4,\n\t0x01e6, 0x01e6,\n\t0x01e8, 0x01e8,\n\t0x01ea, 0x01ea,\n\t0x01ec, 0x01ec,\n\t0x01ee, 0x01ee,\n\t0x01f1, 0x01f2,\n\t0x01f4, 0x01f4,\n\t0x01f6, 0x01f8,\n\t0x01fa, 0x01fa,\n\t0x01fc, 0x01fc,\n\t0x01fe, 0x01fe,\n\t0x0200, 0x0200,\n\t0x0202, 0x0202,\n\t0x0204, 0x0204,\n\t0x0206, 0x0206,\n\t0x0208, 0x0208,\n\t0x020a, 0x020a,\n\t0x020c, 0x020c,\n\t0x020e, 0x020e,\n\t0x0210, 0x0210,\n\t0x0212, 0x0212,\n\t0x0214, 0x0214,\n\t0x0216, 0x0216,\n\t0x0218, 0x0218,\n\t0x021a, 0x021a,\n\t0x021c, 0x021c,\n\t0x021e, 0x021e,\n\t0x0220, 0x0220,\n\t0x0222, 0x0222,\n\t0x0224, 0x0224,\n\t0x0226, 0x0226,\n\t0x0228, 0x0228,\n\t0x022a, 0x022a,\n\t0x022c, 0x022c,\n\t0x022e, 0x022e,\n\t0x0230, 0x0230,\n\t0x0232, 0x0232,\n\t0x023a, 0x023b,\n\t0x023d, 0x023e,\n\t0x0241, 0x0241,\n\t0x0243, 0x0246,\n\t0x0248, 0x0248,\n\t0x024a, 0x024a,\n\t0x024c, 0x024c,\n\t0x024e, 0x024e,\n\t0x0370, 0x0370,\n\t0x0372, 0x0372,\n\t0x0376, 0x0376,\n\t0x0386, 0x0386,\n\t0x0388, 0x038a,\n\t0x038c, 0x038c,\n\t0x038e, 0x038f,\n\t0x0391, 0x03a1,\n\t0x03a3, 0x03ab,\n\t0x03cf, 0x03cf,\n\t0x03d8, 0x03d8,\n\t0x03da, 0x03da,\n\t0x03dc, 0x03dc,\n\t0x03de, 0x03de,\n\t0x03e0, 0x03e0,\n\t0x03e2, 0x03e2,\n\t0x03e4, 0x03e4,\n\t0x03e6, 0x03e6,\n\t0x03e8, 0x03e8,\n\t0x03ea, 0x03ea,\n\t0x03ec, 0x03ec,\n\t0x03ee, 0x03ee,\n\t0x03f4, 0x03f4,\n\t0x03f7, 0x03f7,\n\t0x03f9, 0x03fa,\n\t0x03fd, 0x042f,\n\t0x0460, 0x0460,\n\t0x0462, 0x0462,\n\t0x0464, 0x0464,\n\t0x0466, 0x0466,\n\t0x0468, 0x0468,\n\t0x046a, 0x046a,\n\t0x046c, 0x046c,\n\t0x046e, 0x046e,\n\t0x0470, 0x0470,\n\t0x0472, 0x0472,\n\t0x0474, 0x0474,\n\t0x0476, 0x0476,\n\t0x0478, 0x0478,\n\t0x047a, 0x047a,\n\t0x047c, 0x047c,\n\t0x047e, 0x047e,\n\t0x0480, 0x0480,\n\t0x048a, 0x048a,\n\t0x048c, 0x048c,\n\t0x048e, 0x048e,\n\t0x0490, 0x0490,\n\t0x0492, 0x0492,\n\t0x0494, 0x0494,\n\t0x0496, 0x0496,\n\t0x0498, 0x0498,\n\t0x049a, 0x049a,\n\t0x049c, 0x049c,\n\t0x049e, 0x049e,\n\t0x04a0, 0x04a0,\n\t0x04a2, 0x04a2,\n\t0x04a4, 0x04a4,\n\t0x04a6, 0x04a6,\n\t0x04a8, 0x04a8,\n\t0x04aa, 0x04aa,\n\t0x04ac, 0x04ac,\n\t0x04ae, 0x04ae,\n\t0x04b0, 0x04b0,\n\t0x04b2, 0x04b2,\n\t0x04b4, 0x04b4,\n\t0x04b6, 0x04b6,\n\t0x04b8, 0x04b8,\n\t0x04ba, 0x04ba,\n\t0x04bc, 0x04bc,\n\t0x04be, 0x04be,\n\t0x04c0, 0x04c1,\n\t0x04c3, 0x04c3,\n\t0x04c5, 0x04c5,\n\t0x04c7, 0x04c7,\n\t0x04c9, 0x04c9,\n\t0x04cb, 0x04cb,\n\t0x04cd, 0x04cd,\n\t0x04d0, 0x04d0,\n\t0x04d2, 0x04d2,\n\t0x04d4, 0x04d4,\n\t0x04d6, 0x04d6,\n\t0x04d8, 0x04d8,\n\t0x04da, 0x04da,\n\t0x04dc, 0x04dc,\n\t0x04de, 0x04de,\n\t0x04e0, 0x04e0,\n\t0x04e2, 0x04e2,\n\t0x04e4, 0x04e4,\n\t0x04e6, 0x04e6,\n\t0x04e8, 0x04e8,\n\t0x04ea, 0x04ea,\n\t0x04ec, 0x04ec,\n\t0x04ee, 0x04ee,\n\t0x04f0, 0x04f0,\n\t0x04f2, 0x04f2,\n\t0x04f4, 0x04f4,\n\t0x04f6, 0x04f6,\n\t0x04f8, 0x04f8,\n\t0x04fa, 0x04fa,\n\t0x04fc, 0x04fc,\n\t0x04fe, 0x04fe,\n\t0x0500, 0x0500,\n\t0x0502, 0x0502,\n\t0x0504, 0x0504,\n\t0x0506, 0x0506,\n\t0x0508, 0x0508,\n\t0x050a, 0x050a,\n\t0x050c, 0x050c,\n\t0x050e, 0x050e,\n\t0x0510, 0x0510,\n\t0x0512, 0x0512,\n\t0x0514, 0x0514,\n\t0x0516, 0x0516,\n\t0x0518, 0x0518,\n\t0x051a, 0x051a,\n\t0x051c, 0x051c,\n\t0x051e, 0x051e,\n\t0x0520, 0x0520,\n\t0x0522, 0x0522,\n\t0x0524, 0x0524,\n\t0x0526, 0x0526,\n\t0x0531, 0x0556,\n\t0x10a0, 0x10c5,\n\t0x10c7, 0x10c7,\n\t0x10cd, 0x10cd,\n\t0x1e00, 0x1e00,\n\t0x1e02, 0x1e02,\n\t0x1e04, 0x1e04,\n\t0x1e06, 0x1e06,\n\t0x1e08, 0x1e08,\n\t0x1e0a, 0x1e0a,\n\t0x1e0c, 0x1e0c,\n\t0x1e0e, 0x1e0e,\n\t0x1e10, 0x1e10,\n\t0x1e12, 0x1e12,\n\t0x1e14, 0x1e14,\n\t0x1e16, 0x1e16,\n\t0x1e18, 0x1e18,\n\t0x1e1a, 0x1e1a,\n\t0x1e1c, 0x1e1c,\n\t0x1e1e, 0x1e1e,\n\t0x1e20, 0x1e20,\n\t0x1e22, 0x1e22,\n\t0x1e24, 0x1e24,\n\t0x1e26, 0x1e26,\n\t0x1e28, 0x1e28,\n\t0x1e2a, 0x1e2a,\n\t0x1e2c, 0x1e2c,\n\t0x1e2e, 0x1e2e,\n\t0x1e30, 0x1e30,\n\t0x1e32, 0x1e32,\n\t0x1e34, 0x1e34,\n\t0x1e36, 0x1e36,\n\t0x1e38, 0x1e38,\n\t0x1e3a, 0x1e3a,\n\t0x1e3c, 0x1e3c,\n\t0x1e3e, 0x1e3e,\n\t0x1e40, 0x1e40,\n\t0x1e42, 0x1e42,\n\t0x1e44, 0x1e44,\n\t0x1e46, 0x1e46,\n\t0x1e48, 0x1e48,\n\t0x1e4a, 0x1e4a,\n\t0x1e4c, 0x1e4c,\n\t0x1e4e, 0x1e4e,\n\t0x1e50, 0x1e50,\n\t0x1e52, 0x1e52,\n\t0x1e54, 0x1e54,\n\t0x1e56, 0x1e56,\n\t0x1e58, 0x1e58,\n\t0x1e5a, 0x1e5a,\n\t0x1e5c, 0x1e5c,\n\t0x1e5e, 0x1e5e,\n\t0x1e60, 0x1e60,\n\t0x1e62, 0x1e62,\n\t0x1e64, 0x1e64,\n\t0x1e66, 0x1e66,\n\t0x1e68, 0x1e68,\n\t0x1e6a, 0x1e6a,\n\t0x1e6c, 0x1e6c,\n\t0x1e6e, 0x1e6e,\n\t0x1e70, 0x1e70,\n\t0x1e72, 0x1e72,\n\t0x1e74, 0x1e74,\n\t0x1e76, 0x1e76,\n\t0x1e78, 0x1e78,\n\t0x1e7a, 0x1e7a,\n\t0x1e7c, 0x1e7c,\n\t0x1e7e, 0x1e7e,\n\t0x1e80, 0x1e80,\n\t0x1e82, 0x1e82,\n\t0x1e84, 0x1e84,\n\t0x1e86, 0x1e86,\n\t0x1e88, 0x1e88,\n\t0x1e8a, 0x1e8a,\n\t0x1e8c, 0x1e8c,\n\t0x1e8e, 0x1e8e,\n\t0x1e90, 0x1e90,\n\t0x1e92, 0x1e92,\n\t0x1e94, 0x1e94,\n\t0x1e9e, 0x1e9e,\n\t0x1ea0, 0x1ea0,\n\t0x1ea2, 0x1ea2,\n\t0x1ea4, 0x1ea4,\n\t0x1ea6, 0x1ea6,\n\t0x1ea8, 0x1ea8,\n\t0x1eaa, 0x1eaa,\n\t0x1eac, 0x1eac,\n\t0x1eae, 0x1eae,\n\t0x1eb0, 0x1eb0,\n\t0x1eb2, 0x1eb2,\n\t0x1eb4, 0x1eb4,\n\t0x1eb6, 0x1eb6,\n\t0x1eb8, 0x1eb8,\n\t0x1eba, 0x1eba,\n\t0x1ebc, 0x1ebc,\n\t0x1ebe, 0x1ebe,\n\t0x1ec0, 0x1ec0,\n\t0x1ec2, 0x1ec2,\n\t0x1ec4, 0x1ec4,\n\t0x1ec6, 0x1ec6,\n\t0x1ec8, 0x1ec8,\n\t0x1eca, 0x1eca,\n\t0x1ecc, 0x1ecc,\n\t0x1ece, 0x1ece,\n\t0x1ed0, 0x1ed0,\n\t0x1ed2, 0x1ed2,\n\t0x1ed4, 0x1ed4,\n\t0x1ed6, 0x1ed6,\n\t0x1ed8, 0x1ed8,\n\t0x1eda, 0x1eda,\n\t0x1edc, 0x1edc,\n\t0x1ede, 0x1ede,\n\t0x1ee0, 0x1ee0,\n\t0x1ee2, 0x1ee2,\n\t0x1ee4, 0x1ee4,\n\t0x1ee6, 0x1ee6,\n\t0x1ee8, 0x1ee8,\n\t0x1eea, 0x1eea,\n\t0x1eec, 0x1eec,\n\t0x1eee, 0x1eee,\n\t0x1ef0, 0x1ef0,\n\t0x1ef2, 0x1ef2,\n\t0x1ef4, 0x1ef4,\n\t0x1ef6, 0x1ef6,\n\t0x1ef8, 0x1ef8,\n\t0x1efa, 0x1efa,\n\t0x1efc, 0x1efc,\n\t0x1efe, 0x1efe,\n\t0x1f08, 0x1f0f,\n\t0x1f18, 0x1f1d,\n\t0x1f28, 0x1f2f,\n\t0x1f38, 0x1f3f,\n\t0x1f48, 0x1f4d,\n\t0x1f59, 0x1f59,\n\t0x1f5b, 0x1f5b,\n\t0x1f5d, 0x1f5d,\n\t0x1f5f, 0x1f5f,\n\t0x1f68, 0x1f6f,\n\t0x1f88, 0x1f8f,\n\t0x1f98, 0x1f9f,\n\t0x1fa8, 0x1faf,\n\t0x1fb8, 0x1fbc,\n\t0x1fc8, 0x1fcc,\n\t0x1fd8, 0x1fdb,\n\t0x1fe8, 0x1fec,\n\t0x1ff8, 0x1ffc,\n\t0x2126, 0x2126,\n\t0x212a, 0x212b,\n\t0x2132, 0x2132,\n\t0x2160, 0x216f,\n\t0x2183, 0x2183,\n\t0x24b6, 0x24cf,\n\t0x2c00, 0x2c2e,\n\t0x2c60, 0x2c60,\n\t0x2c62, 0x2c64,\n\t0x2c67, 0x2c67,\n\t0x2c69, 0x2c69,\n\t0x2c6b, 0x2c6b,\n\t0x2c6d, 0x2c70,\n\t0x2c72, 0x2c72,\n\t0x2c75, 0x2c75,\n\t0x2c7e, 0x2c80,\n\t0x2c82, 0x2c82,\n\t0x2c84, 0x2c84,\n\t0x2c86, 0x2c86,\n\t0x2c88, 0x2c88,\n\t0x2c8a, 0x2c8a,\n\t0x2c8c, 0x2c8c,\n\t0x2c8e, 0x2c8e,\n\t0x2c90, 0x2c90,\n\t0x2c92, 0x2c92,\n\t0x2c94, 0x2c94,\n\t0x2c96, 0x2c96,\n\t0x2c98, 0x2c98,\n\t0x2c9a, 0x2c9a,\n\t0x2c9c, 0x2c9c,\n\t0x2c9e, 0x2c9e,\n\t0x2ca0, 0x2ca0,\n\t0x2ca2, 0x2ca2,\n\t0x2ca4, 0x2ca4,\n\t0x2ca6, 0x2ca6,\n\t0x2ca8, 0x2ca8,\n\t0x2caa, 0x2caa,\n\t0x2cac, 0x2cac,\n\t0x2cae, 0x2cae,\n\t0x2cb0, 0x2cb0,\n\t0x2cb2, 0x2cb2,\n\t0x2cb4, 0x2cb4,\n\t0x2cb6, 0x2cb6,\n\t0x2cb8, 0x2cb8,\n\t0x2cba, 0x2cba,\n\t0x2cbc, 0x2cbc,\n\t0x2cbe, 0x2cbe,\n\t0x2cc0, 0x2cc0,\n\t0x2cc2, 0x2cc2,\n\t0x2cc4, 0x2cc4,\n\t0x2cc6, 0x2cc6,\n\t0x2cc8, 0x2cc8,\n\t0x2cca, 0x2cca,\n\t0x2ccc, 0x2ccc,\n\t0x2cce, 0x2cce,\n\t0x2cd0, 0x2cd0,\n\t0x2cd2, 0x2cd2,\n\t0x2cd4, 0x2cd4,\n\t0x2cd6, 0x2cd6,\n\t0x2cd8, 0x2cd8,\n\t0x2cda, 0x2cda,\n\t0x2cdc, 0x2cdc,\n\t0x2cde, 0x2cde,\n\t0x2ce0, 0x2ce0,\n\t0x2ce2, 0x2ce2,\n\t0x2ceb, 0x2ceb,\n\t0x2ced, 0x2ced,\n\t0x2cf2, 0x2cf2,\n\t0xa640, 0xa640,\n\t0xa642, 0xa642,\n\t0xa644, 0xa644,\n\t0xa646, 0xa646,\n\t0xa648, 0xa648,\n\t0xa64a, 0xa64a,\n\t0xa64c, 0xa64c,\n\t0xa64e, 0xa64e,\n\t0xa650, 0xa650,\n\t0xa652, 0xa652,\n\t0xa654, 0xa654,\n\t0xa656, 0xa656,\n\t0xa658, 0xa658,\n\t0xa65a, 0xa65a,\n\t0xa65c, 0xa65c,\n\t0xa65e, 0xa65e,\n\t0xa660, 0xa660,\n\t0xa662, 0xa662,\n\t0xa664, 0xa664,\n\t0xa666, 0xa666,\n\t0xa668, 0xa668,\n\t0xa66a, 0xa66a,\n\t0xa66c, 0xa66c,\n\t0xa680, 0xa680,\n\t0xa682, 0xa682,\n\t0xa684, 0xa684,\n\t0xa686, 0xa686,\n\t0xa688, 0xa688,\n\t0xa68a, 0xa68a,\n\t0xa68c, 0xa68c,\n\t0xa68e, 0xa68e,\n\t0xa690, 0xa690,\n\t0xa692, 0xa692,\n\t0xa694, 0xa694,\n\t0xa696, 0xa696,\n\t0xa722, 0xa722,\n\t0xa724, 0xa724,\n\t0xa726, 0xa726,\n\t0xa728, 0xa728,\n\t0xa72a, 0xa72a,\n\t0xa72c, 0xa72c,\n\t0xa72e, 0xa72e,\n\t0xa732, 0xa732,\n\t0xa734, 0xa734,\n\t0xa736, 0xa736,\n\t0xa738, 0xa738,\n\t0xa73a, 0xa73a,\n\t0xa73c, 0xa73c,\n\t0xa73e, 0xa73e,\n\t0xa740, 0xa740,\n\t0xa742, 0xa742,\n\t0xa744, 0xa744,\n\t0xa746, 0xa746,\n\t0xa748, 0xa748,\n\t0xa74a, 0xa74a,\n\t0xa74c, 0xa74c,\n\t0xa74e, 0xa74e,\n\t0xa750, 0xa750,\n\t0xa752, 0xa752,\n\t0xa754, 0xa754,\n\t0xa756, 0xa756,\n\t0xa758, 0xa758,\n\t0xa75a, 0xa75a,\n\t0xa75c, 0xa75c,\n\t0xa75e, 0xa75e,\n\t0xa760, 0xa760,\n\t0xa762, 0xa762,\n\t0xa764, 0xa764,\n\t0xa766, 0xa766,\n\t0xa768, 0xa768,\n\t0xa76a, 0xa76a,\n\t0xa76c, 0xa76c,\n\t0xa76e, 0xa76e,\n\t0xa779, 0xa779,\n\t0xa77b, 0xa77b,\n\t0xa77d, 0xa77e,\n\t0xa780, 0xa780,\n\t0xa782, 0xa782,\n\t0xa784, 0xa784,\n\t0xa786, 0xa786,\n\t0xa78b, 0xa78b,\n\t0xa78d, 0xa78d,\n\t0xa790, 0xa790,\n\t0xa792, 0xa792,\n\t0xa7a0, 0xa7a0,\n\t0xa7a2, 0xa7a2,\n\t0xa7a4, 0xa7a4,\n\t0xa7a6, 0xa7a6,\n\t0xa7a8, 0xa7a8,\n\t0xa7aa, 0xa7aa,\n\t0xff21, 0xff3a,\n\t0x10400, 0x10427,\n}; /* CR_Changes_When_Lowercased */\n\n/* 'Changes_When_Uppercased': Derived Property */\nstatic const OnigCodePoint CR_Changes_When_Uppercased[] = {\n\t586,\n\t0x0061, 0x007a,\n\t0x00b5, 0x00b5,\n\t0x00df, 0x00f6,\n\t0x00f8, 0x00ff,\n\t0x0101, 0x0101,\n\t0x0103, 0x0103,\n\t0x0105, 0x0105,\n\t0x0107, 0x0107,\n\t0x0109, 0x0109,\n\t0x010b, 0x010b,\n\t0x010d, 0x010d,\n\t0x010f, 0x010f,\n\t0x0111, 0x0111,\n\t0x0113, 0x0113,\n\t0x0115, 0x0115,\n\t0x0117, 0x0117,\n\t0x0119, 0x0119,\n\t0x011b, 0x011b,\n\t0x011d, 0x011d,\n\t0x011f, 0x011f,\n\t0x0121, 0x0121,\n\t0x0123, 0x0123,\n\t0x0125, 0x0125,\n\t0x0127, 0x0127,\n\t0x0129, 0x0129,\n\t0x012b, 0x012b,\n\t0x012d, 0x012d,\n\t0x012f, 0x012f,\n\t0x0131, 0x0131,\n\t0x0133, 0x0133,\n\t0x0135, 0x0135,\n\t0x0137, 0x0137,\n\t0x013a, 0x013a,\n\t0x013c, 0x013c,\n\t0x013e, 0x013e,\n\t0x0140, 0x0140,\n\t0x0142, 0x0142,\n\t0x0144, 0x0144,\n\t0x0146, 0x0146,\n\t0x0148, 0x0149,\n\t0x014b, 0x014b,\n\t0x014d, 0x014d,\n\t0x014f, 0x014f,\n\t0x0151, 0x0151,\n\t0x0153, 0x0153,\n\t0x0155, 0x0155,\n\t0x0157, 0x0157,\n\t0x0159, 0x0159,\n\t0x015b, 0x015b,\n\t0x015d, 0x015d,\n\t0x015f, 0x015f,\n\t0x0161, 0x0161,\n\t0x0163, 0x0163,\n\t0x0165, 0x0165,\n\t0x0167, 0x0167,\n\t0x0169, 0x0169,\n\t0x016b, 0x016b,\n\t0x016d, 0x016d,\n\t0x016f, 0x016f,\n\t0x0171, 0x0171,\n\t0x0173, 0x0173,\n\t0x0175, 0x0175,\n\t0x0177, 0x0177,\n\t0x017a, 0x017a,\n\t0x017c, 0x017c,\n\t0x017e, 0x0180,\n\t0x0183, 0x0183,\n\t0x0185, 0x0185,\n\t0x0188, 0x0188,\n\t0x018c, 0x018c,\n\t0x0192, 0x0192,\n\t0x0195, 0x0195,\n\t0x0199, 0x019a,\n\t0x019e, 0x019e,\n\t0x01a1, 0x01a1,\n\t0x01a3, 0x01a3,\n\t0x01a5, 0x01a5,\n\t0x01a8, 0x01a8,\n\t0x01ad, 0x01ad,\n\t0x01b0, 0x01b0,\n\t0x01b4, 0x01b4,\n\t0x01b6, 0x01b6,\n\t0x01b9, 0x01b9,\n\t0x01bd, 0x01bd,\n\t0x01bf, 0x01bf,\n\t0x01c5, 0x01c6,\n\t0x01c8, 0x01c9,\n\t0x01cb, 0x01cc,\n\t0x01ce, 0x01ce,\n\t0x01d0, 0x01d0,\n\t0x01d2, 0x01d2,\n\t0x01d4, 0x01d4,\n\t0x01d6, 0x01d6,\n\t0x01d8, 0x01d8,\n\t0x01da, 0x01da,\n\t0x01dc, 0x01dd,\n\t0x01df, 0x01df,\n\t0x01e1, 0x01e1,\n\t0x01e3, 0x01e3,\n\t0x01e5, 0x01e5,\n\t0x01e7, 0x01e7,\n\t0x01e9, 0x01e9,\n\t0x01eb, 0x01eb,\n\t0x01ed, 0x01ed,\n\t0x01ef, 0x01f0,\n\t0x01f2, 0x01f3,\n\t0x01f5, 0x01f5,\n\t0x01f9, 0x01f9,\n\t0x01fb, 0x01fb,\n\t0x01fd, 0x01fd,\n\t0x01ff, 0x01ff,\n\t0x0201, 0x0201,\n\t0x0203, 0x0203,\n\t0x0205, 0x0205,\n\t0x0207, 0x0207,\n\t0x0209, 0x0209,\n\t0x020b, 0x020b,\n\t0x020d, 0x020d,\n\t0x020f, 0x020f,\n\t0x0211, 0x0211,\n\t0x0213, 0x0213,\n\t0x0215, 0x0215,\n\t0x0217, 0x0217,\n\t0x0219, 0x0219,\n\t0x021b, 0x021b,\n\t0x021d, 0x021d,\n\t0x021f, 0x021f,\n\t0x0223, 0x0223,\n\t0x0225, 0x0225,\n\t0x0227, 0x0227,\n\t0x0229, 0x0229,\n\t0x022b, 0x022b,\n\t0x022d, 0x022d,\n\t0x022f, 0x022f,\n\t0x0231, 0x0231,\n\t0x0233, 0x0233,\n\t0x023c, 0x023c,\n\t0x023f, 0x0240,\n\t0x0242, 0x0242,\n\t0x0247, 0x0247,\n\t0x0249, 0x0249,\n\t0x024b, 0x024b,\n\t0x024d, 0x024d,\n\t0x024f, 0x0254,\n\t0x0256, 0x0257,\n\t0x0259, 0x0259,\n\t0x025b, 0x025b,\n\t0x0260, 0x0260,\n\t0x0263, 0x0263,\n\t0x0265, 0x0266,\n\t0x0268, 0x0269,\n\t0x026b, 0x026b,\n\t0x026f, 0x026f,\n\t0x0271, 0x0272,\n\t0x0275, 0x0275,\n\t0x027d, 0x027d,\n\t0x0280, 0x0280,\n\t0x0283, 0x0283,\n\t0x0288, 0x028c,\n\t0x0292, 0x0292,\n\t0x0345, 0x0345,\n\t0x0371, 0x0371,\n\t0x0373, 0x0373,\n\t0x0377, 0x0377,\n\t0x037b, 0x037d,\n\t0x0390, 0x0390,\n\t0x03ac, 0x03ce,\n\t0x03d0, 0x03d1,\n\t0x03d5, 0x03d7,\n\t0x03d9, 0x03d9,\n\t0x03db, 0x03db,\n\t0x03dd, 0x03dd,\n\t0x03df, 0x03df,\n\t0x03e1, 0x03e1,\n\t0x03e3, 0x03e3,\n\t0x03e5, 0x03e5,\n\t0x03e7, 0x03e7,\n\t0x03e9, 0x03e9,\n\t0x03eb, 0x03eb,\n\t0x03ed, 0x03ed,\n\t0x03ef, 0x03f2,\n\t0x03f5, 0x03f5,\n\t0x03f8, 0x03f8,\n\t0x03fb, 0x03fb,\n\t0x0430, 0x045f,\n\t0x0461, 0x0461,\n\t0x0463, 0x0463,\n\t0x0465, 0x0465,\n\t0x0467, 0x0467,\n\t0x0469, 0x0469,\n\t0x046b, 0x046b,\n\t0x046d, 0x046d,\n\t0x046f, 0x046f,\n\t0x0471, 0x0471,\n\t0x0473, 0x0473,\n\t0x0475, 0x0475,\n\t0x0477, 0x0477,\n\t0x0479, 0x0479,\n\t0x047b, 0x047b,\n\t0x047d, 0x047d,\n\t0x047f, 0x047f,\n\t0x0481, 0x0481,\n\t0x048b, 0x048b,\n\t0x048d, 0x048d,\n\t0x048f, 0x048f,\n\t0x0491, 0x0491,\n\t0x0493, 0x0493,\n\t0x0495, 0x0495,\n\t0x0497, 0x0497,\n\t0x0499, 0x0499,\n\t0x049b, 0x049b,\n\t0x049d, 0x049d,\n\t0x049f, 0x049f,\n\t0x04a1, 0x04a1,\n\t0x04a3, 0x04a3,\n\t0x04a5, 0x04a5,\n\t0x04a7, 0x04a7,\n\t0x04a9, 0x04a9,\n\t0x04ab, 0x04ab,\n\t0x04ad, 0x04ad,\n\t0x04af, 0x04af,\n\t0x04b1, 0x04b1,\n\t0x04b3, 0x04b3,\n\t0x04b5, 0x04b5,\n\t0x04b7, 0x04b7,\n\t0x04b9, 0x04b9,\n\t0x04bb, 0x04bb,\n\t0x04bd, 0x04bd,\n\t0x04bf, 0x04bf,\n\t0x04c2, 0x04c2,\n\t0x04c4, 0x04c4,\n\t0x04c6, 0x04c6,\n\t0x04c8, 0x04c8,\n\t0x04ca, 0x04ca,\n\t0x04cc, 0x04cc,\n\t0x04ce, 0x04cf,\n\t0x04d1, 0x04d1,\n\t0x04d3, 0x04d3,\n\t0x04d5, 0x04d5,\n\t0x04d7, 0x04d7,\n\t0x04d9, 0x04d9,\n\t0x04db, 0x04db,\n\t0x04dd, 0x04dd,\n\t0x04df, 0x04df,\n\t0x04e1, 0x04e1,\n\t0x04e3, 0x04e3,\n\t0x04e5, 0x04e5,\n\t0x04e7, 0x04e7,\n\t0x04e9, 0x04e9,\n\t0x04eb, 0x04eb,\n\t0x04ed, 0x04ed,\n\t0x04ef, 0x04ef,\n\t0x04f1, 0x04f1,\n\t0x04f3, 0x04f3,\n\t0x04f5, 0x04f5,\n\t0x04f7, 0x04f7,\n\t0x04f9, 0x04f9,\n\t0x04fb, 0x04fb,\n\t0x04fd, 0x04fd,\n\t0x04ff, 0x04ff,\n\t0x0501, 0x0501,\n\t0x0503, 0x0503,\n\t0x0505, 0x0505,\n\t0x0507, 0x0507,\n\t0x0509, 0x0509,\n\t0x050b, 0x050b,\n\t0x050d, 0x050d,\n\t0x050f, 0x050f,\n\t0x0511, 0x0511,\n\t0x0513, 0x0513,\n\t0x0515, 0x0515,\n\t0x0517, 0x0517,\n\t0x0519, 0x0519,\n\t0x051b, 0x051b,\n\t0x051d, 0x051d,\n\t0x051f, 0x051f,\n\t0x0521, 0x0521,\n\t0x0523, 0x0523,\n\t0x0525, 0x0525,\n\t0x0527, 0x0527,\n\t0x0561, 0x0587,\n\t0x1d79, 0x1d79,\n\t0x1d7d, 0x1d7d,\n\t0x1e01, 0x1e01,\n\t0x1e03, 0x1e03,\n\t0x1e05, 0x1e05,\n\t0x1e07, 0x1e07,\n\t0x1e09, 0x1e09,\n\t0x1e0b, 0x1e0b,\n\t0x1e0d, 0x1e0d,\n\t0x1e0f, 0x1e0f,\n\t0x1e11, 0x1e11,\n\t0x1e13, 0x1e13,\n\t0x1e15, 0x1e15,\n\t0x1e17, 0x1e17,\n\t0x1e19, 0x1e19,\n\t0x1e1b, 0x1e1b,\n\t0x1e1d, 0x1e1d,\n\t0x1e1f, 0x1e1f,\n\t0x1e21, 0x1e21,\n\t0x1e23, 0x1e23,\n\t0x1e25, 0x1e25,\n\t0x1e27, 0x1e27,\n\t0x1e29, 0x1e29,\n\t0x1e2b, 0x1e2b,\n\t0x1e2d, 0x1e2d,\n\t0x1e2f, 0x1e2f,\n\t0x1e31, 0x1e31,\n\t0x1e33, 0x1e33,\n\t0x1e35, 0x1e35,\n\t0x1e37, 0x1e37,\n\t0x1e39, 0x1e39,\n\t0x1e3b, 0x1e3b,\n\t0x1e3d, 0x1e3d,\n\t0x1e3f, 0x1e3f,\n\t0x1e41, 0x1e41,\n\t0x1e43, 0x1e43,\n\t0x1e45, 0x1e45,\n\t0x1e47, 0x1e47,\n\t0x1e49, 0x1e49,\n\t0x1e4b, 0x1e4b,\n\t0x1e4d, 0x1e4d,\n\t0x1e4f, 0x1e4f,\n\t0x1e51, 0x1e51,\n\t0x1e53, 0x1e53,\n\t0x1e55, 0x1e55,\n\t0x1e57, 0x1e57,\n\t0x1e59, 0x1e59,\n\t0x1e5b, 0x1e5b,\n\t0x1e5d, 0x1e5d,\n\t0x1e5f, 0x1e5f,\n\t0x1e61, 0x1e61,\n\t0x1e63, 0x1e63,\n\t0x1e65, 0x1e65,\n\t0x1e67, 0x1e67,\n\t0x1e69, 0x1e69,\n\t0x1e6b, 0x1e6b,\n\t0x1e6d, 0x1e6d,\n\t0x1e6f, 0x1e6f,\n\t0x1e71, 0x1e71,\n\t0x1e73, 0x1e73,\n\t0x1e75, 0x1e75,\n\t0x1e77, 0x1e77,\n\t0x1e79, 0x1e79,\n\t0x1e7b, 0x1e7b,\n\t0x1e7d, 0x1e7d,\n\t0x1e7f, 0x1e7f,\n\t0x1e81, 0x1e81,\n\t0x1e83, 0x1e83,\n\t0x1e85, 0x1e85,\n\t0x1e87, 0x1e87,\n\t0x1e89, 0x1e89,\n\t0x1e8b, 0x1e8b,\n\t0x1e8d, 0x1e8d,\n\t0x1e8f, 0x1e8f,\n\t0x1e91, 0x1e91,\n\t0x1e93, 0x1e93,\n\t0x1e95, 0x1e9b,\n\t0x1ea1, 0x1ea1,\n\t0x1ea3, 0x1ea3,\n\t0x1ea5, 0x1ea5,\n\t0x1ea7, 0x1ea7,\n\t0x1ea9, 0x1ea9,\n\t0x1eab, 0x1eab,\n\t0x1ead, 0x1ead,\n\t0x1eaf, 0x1eaf,\n\t0x1eb1, 0x1eb1,\n\t0x1eb3, 0x1eb3,\n\t0x1eb5, 0x1eb5,\n\t0x1eb7, 0x1eb7,\n\t0x1eb9, 0x1eb9,\n\t0x1ebb, 0x1ebb,\n\t0x1ebd, 0x1ebd,\n\t0x1ebf, 0x1ebf,\n\t0x1ec1, 0x1ec1,\n\t0x1ec3, 0x1ec3,\n\t0x1ec5, 0x1ec5,\n\t0x1ec7, 0x1ec7,\n\t0x1ec9, 0x1ec9,\n\t0x1ecb, 0x1ecb,\n\t0x1ecd, 0x1ecd,\n\t0x1ecf, 0x1ecf,\n\t0x1ed1, 0x1ed1,\n\t0x1ed3, 0x1ed3,\n\t0x1ed5, 0x1ed5,\n\t0x1ed7, 0x1ed7,\n\t0x1ed9, 0x1ed9,\n\t0x1edb, 0x1edb,\n\t0x1edd, 0x1edd,\n\t0x1edf, 0x1edf,\n\t0x1ee1, 0x1ee1,\n\t0x1ee3, 0x1ee3,\n\t0x1ee5, 0x1ee5,\n\t0x1ee7, 0x1ee7,\n\t0x1ee9, 0x1ee9,\n\t0x1eeb, 0x1eeb,\n\t0x1eed, 0x1eed,\n\t0x1eef, 0x1eef,\n\t0x1ef1, 0x1ef1,\n\t0x1ef3, 0x1ef3,\n\t0x1ef5, 0x1ef5,\n\t0x1ef7, 0x1ef7,\n\t0x1ef9, 0x1ef9,\n\t0x1efb, 0x1efb,\n\t0x1efd, 0x1efd,\n\t0x1eff, 0x1f07,\n\t0x1f10, 0x1f15,\n\t0x1f20, 0x1f27,\n\t0x1f30, 0x1f37,\n\t0x1f40, 0x1f45,\n\t0x1f50, 0x1f57,\n\t0x1f60, 0x1f67,\n\t0x1f70, 0x1f7d,\n\t0x1f80, 0x1fb4,\n\t0x1fb6, 0x1fb7,\n\t0x1fbc, 0x1fbc,\n\t0x1fbe, 0x1fbe,\n\t0x1fc2, 0x1fc4,\n\t0x1fc6, 0x1fc7,\n\t0x1fcc, 0x1fcc,\n\t0x1fd0, 0x1fd3,\n\t0x1fd6, 0x1fd7,\n\t0x1fe0, 0x1fe7,\n\t0x1ff2, 0x1ff4,\n\t0x1ff6, 0x1ff7,\n\t0x1ffc, 0x1ffc,\n\t0x214e, 0x214e,\n\t0x2170, 0x217f,\n\t0x2184, 0x2184,\n\t0x24d0, 0x24e9,\n\t0x2c30, 0x2c5e,\n\t0x2c61, 0x2c61,\n\t0x2c65, 0x2c66,\n\t0x2c68, 0x2c68,\n\t0x2c6a, 0x2c6a,\n\t0x2c6c, 0x2c6c,\n\t0x2c73, 0x2c73,\n\t0x2c76, 0x2c76,\n\t0x2c81, 0x2c81,\n\t0x2c83, 0x2c83,\n\t0x2c85, 0x2c85,\n\t0x2c87, 0x2c87,\n\t0x2c89, 0x2c89,\n\t0x2c8b, 0x2c8b,\n\t0x2c8d, 0x2c8d,\n\t0x2c8f, 0x2c8f,\n\t0x2c91, 0x2c91,\n\t0x2c93, 0x2c93,\n\t0x2c95, 0x2c95,\n\t0x2c97, 0x2c97,\n\t0x2c99, 0x2c99,\n\t0x2c9b, 0x2c9b,\n\t0x2c9d, 0x2c9d,\n\t0x2c9f, 0x2c9f,\n\t0x2ca1, 0x2ca1,\n\t0x2ca3, 0x2ca3,\n\t0x2ca5, 0x2ca5,\n\t0x2ca7, 0x2ca7,\n\t0x2ca9, 0x2ca9,\n\t0x2cab, 0x2cab,\n\t0x2cad, 0x2cad,\n\t0x2caf, 0x2caf,\n\t0x2cb1, 0x2cb1,\n\t0x2cb3, 0x2cb3,\n\t0x2cb5, 0x2cb5,\n\t0x2cb7, 0x2cb7,\n\t0x2cb9, 0x2cb9,\n\t0x2cbb, 0x2cbb,\n\t0x2cbd, 0x2cbd,\n\t0x2cbf, 0x2cbf,\n\t0x2cc1, 0x2cc1,\n\t0x2cc3, 0x2cc3,\n\t0x2cc5, 0x2cc5,\n\t0x2cc7, 0x2cc7,\n\t0x2cc9, 0x2cc9,\n\t0x2ccb, 0x2ccb,\n\t0x2ccd, 0x2ccd,\n\t0x2ccf, 0x2ccf,\n\t0x2cd1, 0x2cd1,\n\t0x2cd3, 0x2cd3,\n\t0x2cd5, 0x2cd5,\n\t0x2cd7, 0x2cd7,\n\t0x2cd9, 0x2cd9,\n\t0x2cdb, 0x2cdb,\n\t0x2cdd, 0x2cdd,\n\t0x2cdf, 0x2cdf,\n\t0x2ce1, 0x2ce1,\n\t0x2ce3, 0x2ce3,\n\t0x2cec, 0x2cec,\n\t0x2cee, 0x2cee,\n\t0x2cf3, 0x2cf3,\n\t0x2d00, 0x2d25,\n\t0x2d27, 0x2d27,\n\t0x2d2d, 0x2d2d,\n\t0xa641, 0xa641,\n\t0xa643, 0xa643,\n\t0xa645, 0xa645,\n\t0xa647, 0xa647,\n\t0xa649, 0xa649,\n\t0xa64b, 0xa64b,\n\t0xa64d, 0xa64d,\n\t0xa64f, 0xa64f,\n\t0xa651, 0xa651,\n\t0xa653, 0xa653,\n\t0xa655, 0xa655,\n\t0xa657, 0xa657,\n\t0xa659, 0xa659,\n\t0xa65b, 0xa65b,\n\t0xa65d, 0xa65d,\n\t0xa65f, 0xa65f,\n\t0xa661, 0xa661,\n\t0xa663, 0xa663,\n\t0xa665, 0xa665,\n\t0xa667, 0xa667,\n\t0xa669, 0xa669,\n\t0xa66b, 0xa66b,\n\t0xa66d, 0xa66d,\n\t0xa681, 0xa681,\n\t0xa683, 0xa683,\n\t0xa685, 0xa685,\n\t0xa687, 0xa687,\n\t0xa689, 0xa689,\n\t0xa68b, 0xa68b,\n\t0xa68d, 0xa68d,\n\t0xa68f, 0xa68f,\n\t0xa691, 0xa691,\n\t0xa693, 0xa693,\n\t0xa695, 0xa695,\n\t0xa697, 0xa697,\n\t0xa723, 0xa723,\n\t0xa725, 0xa725,\n\t0xa727, 0xa727,\n\t0xa729, 0xa729,\n\t0xa72b, 0xa72b,\n\t0xa72d, 0xa72d,\n\t0xa72f, 0xa72f,\n\t0xa733, 0xa733,\n\t0xa735, 0xa735,\n\t0xa737, 0xa737,\n\t0xa739, 0xa739,\n\t0xa73b, 0xa73b,\n\t0xa73d, 0xa73d,\n\t0xa73f, 0xa73f,\n\t0xa741, 0xa741,\n\t0xa743, 0xa743,\n\t0xa745, 0xa745,\n\t0xa747, 0xa747,\n\t0xa749, 0xa749,\n\t0xa74b, 0xa74b,\n\t0xa74d, 0xa74d,\n\t0xa74f, 0xa74f,\n\t0xa751, 0xa751,\n\t0xa753, 0xa753,\n\t0xa755, 0xa755,\n\t0xa757, 0xa757,\n\t0xa759, 0xa759,\n\t0xa75b, 0xa75b,\n\t0xa75d, 0xa75d,\n\t0xa75f, 0xa75f,\n\t0xa761, 0xa761,\n\t0xa763, 0xa763,\n\t0xa765, 0xa765,\n\t0xa767, 0xa767,\n\t0xa769, 0xa769,\n\t0xa76b, 0xa76b,\n\t0xa76d, 0xa76d,\n\t0xa76f, 0xa76f,\n\t0xa77a, 0xa77a,\n\t0xa77c, 0xa77c,\n\t0xa77f, 0xa77f,\n\t0xa781, 0xa781,\n\t0xa783, 0xa783,\n\t0xa785, 0xa785,\n\t0xa787, 0xa787,\n\t0xa78c, 0xa78c,\n\t0xa791, 0xa791,\n\t0xa793, 0xa793,\n\t0xa7a1, 0xa7a1,\n\t0xa7a3, 0xa7a3,\n\t0xa7a5, 0xa7a5,\n\t0xa7a7, 0xa7a7,\n\t0xa7a9, 0xa7a9,\n\t0xfb00, 0xfb06,\n\t0xfb13, 0xfb17,\n\t0xff41, 0xff5a,\n\t0x10428, 0x1044f,\n}; /* CR_Changes_When_Uppercased */\n\n/* 'Changes_When_Titlecased': Derived Property */\nstatic const OnigCodePoint CR_Changes_When_Titlecased[] = {\n\t587,\n\t0x0061, 0x007a,\n\t0x00b5, 0x00b5,\n\t0x00df, 0x00f6,\n\t0x00f8, 0x00ff,\n\t0x0101, 0x0101,\n\t0x0103, 0x0103,\n\t0x0105, 0x0105,\n\t0x0107, 0x0107,\n\t0x0109, 0x0109,\n\t0x010b, 0x010b,\n\t0x010d, 0x010d,\n\t0x010f, 0x010f,\n\t0x0111, 0x0111,\n\t0x0113, 0x0113,\n\t0x0115, 0x0115,\n\t0x0117, 0x0117,\n\t0x0119, 0x0119,\n\t0x011b, 0x011b,\n\t0x011d, 0x011d,\n\t0x011f, 0x011f,\n\t0x0121, 0x0121,\n\t0x0123, 0x0123,\n\t0x0125, 0x0125,\n\t0x0127, 0x0127,\n\t0x0129, 0x0129,\n\t0x012b, 0x012b,\n\t0x012d, 0x012d,\n\t0x012f, 0x012f,\n\t0x0131, 0x0131,\n\t0x0133, 0x0133,\n\t0x0135, 0x0135,\n\t0x0137, 0x0137,\n\t0x013a, 0x013a,\n\t0x013c, 0x013c,\n\t0x013e, 0x013e,\n\t0x0140, 0x0140,\n\t0x0142, 0x0142,\n\t0x0144, 0x0144,\n\t0x0146, 0x0146,\n\t0x0148, 0x0149,\n\t0x014b, 0x014b,\n\t0x014d, 0x014d,\n\t0x014f, 0x014f,\n\t0x0151, 0x0151,\n\t0x0153, 0x0153,\n\t0x0155, 0x0155,\n\t0x0157, 0x0157,\n\t0x0159, 0x0159,\n\t0x015b, 0x015b,\n\t0x015d, 0x015d,\n\t0x015f, 0x015f,\n\t0x0161, 0x0161,\n\t0x0163, 0x0163,\n\t0x0165, 0x0165,\n\t0x0167, 0x0167,\n\t0x0169, 0x0169,\n\t0x016b, 0x016b,\n\t0x016d, 0x016d,\n\t0x016f, 0x016f,\n\t0x0171, 0x0171,\n\t0x0173, 0x0173,\n\t0x0175, 0x0175,\n\t0x0177, 0x0177,\n\t0x017a, 0x017a,\n\t0x017c, 0x017c,\n\t0x017e, 0x0180,\n\t0x0183, 0x0183,\n\t0x0185, 0x0185,\n\t0x0188, 0x0188,\n\t0x018c, 0x018c,\n\t0x0192, 0x0192,\n\t0x0195, 0x0195,\n\t0x0199, 0x019a,\n\t0x019e, 0x019e,\n\t0x01a1, 0x01a1,\n\t0x01a3, 0x01a3,\n\t0x01a5, 0x01a5,\n\t0x01a8, 0x01a8,\n\t0x01ad, 0x01ad,\n\t0x01b0, 0x01b0,\n\t0x01b4, 0x01b4,\n\t0x01b6, 0x01b6,\n\t0x01b9, 0x01b9,\n\t0x01bd, 0x01bd,\n\t0x01bf, 0x01bf,\n\t0x01c4, 0x01c4,\n\t0x01c6, 0x01c7,\n\t0x01c9, 0x01ca,\n\t0x01cc, 0x01cc,\n\t0x01ce, 0x01ce,\n\t0x01d0, 0x01d0,\n\t0x01d2, 0x01d2,\n\t0x01d4, 0x01d4,\n\t0x01d6, 0x01d6,\n\t0x01d8, 0x01d8,\n\t0x01da, 0x01da,\n\t0x01dc, 0x01dd,\n\t0x01df, 0x01df,\n\t0x01e1, 0x01e1,\n\t0x01e3, 0x01e3,\n\t0x01e5, 0x01e5,\n\t0x01e7, 0x01e7,\n\t0x01e9, 0x01e9,\n\t0x01eb, 0x01eb,\n\t0x01ed, 0x01ed,\n\t0x01ef, 0x01f1,\n\t0x01f3, 0x01f3,\n\t0x01f5, 0x01f5,\n\t0x01f9, 0x01f9,\n\t0x01fb, 0x01fb,\n\t0x01fd, 0x01fd,\n\t0x01ff, 0x01ff,\n\t0x0201, 0x0201,\n\t0x0203, 0x0203,\n\t0x0205, 0x0205,\n\t0x0207, 0x0207,\n\t0x0209, 0x0209,\n\t0x020b, 0x020b,\n\t0x020d, 0x020d,\n\t0x020f, 0x020f,\n\t0x0211, 0x0211,\n\t0x0213, 0x0213,\n\t0x0215, 0x0215,\n\t0x0217, 0x0217,\n\t0x0219, 0x0219,\n\t0x021b, 0x021b,\n\t0x021d, 0x021d,\n\t0x021f, 0x021f,\n\t0x0223, 0x0223,\n\t0x0225, 0x0225,\n\t0x0227, 0x0227,\n\t0x0229, 0x0229,\n\t0x022b, 0x022b,\n\t0x022d, 0x022d,\n\t0x022f, 0x022f,\n\t0x0231, 0x0231,\n\t0x0233, 0x0233,\n\t0x023c, 0x023c,\n\t0x023f, 0x0240,\n\t0x0242, 0x0242,\n\t0x0247, 0x0247,\n\t0x0249, 0x0249,\n\t0x024b, 0x024b,\n\t0x024d, 0x024d,\n\t0x024f, 0x0254,\n\t0x0256, 0x0257,\n\t0x0259, 0x0259,\n\t0x025b, 0x025b,\n\t0x0260, 0x0260,\n\t0x0263, 0x0263,\n\t0x0265, 0x0266,\n\t0x0268, 0x0269,\n\t0x026b, 0x026b,\n\t0x026f, 0x026f,\n\t0x0271, 0x0272,\n\t0x0275, 0x0275,\n\t0x027d, 0x027d,\n\t0x0280, 0x0280,\n\t0x0283, 0x0283,\n\t0x0288, 0x028c,\n\t0x0292, 0x0292,\n\t0x0345, 0x0345,\n\t0x0371, 0x0371,\n\t0x0373, 0x0373,\n\t0x0377, 0x0377,\n\t0x037b, 0x037d,\n\t0x0390, 0x0390,\n\t0x03ac, 0x03ce,\n\t0x03d0, 0x03d1,\n\t0x03d5, 0x03d7,\n\t0x03d9, 0x03d9,\n\t0x03db, 0x03db,\n\t0x03dd, 0x03dd,\n\t0x03df, 0x03df,\n\t0x03e1, 0x03e1,\n\t0x03e3, 0x03e3,\n\t0x03e5, 0x03e5,\n\t0x03e7, 0x03e7,\n\t0x03e9, 0x03e9,\n\t0x03eb, 0x03eb,\n\t0x03ed, 0x03ed,\n\t0x03ef, 0x03f2,\n\t0x03f5, 0x03f5,\n\t0x03f8, 0x03f8,\n\t0x03fb, 0x03fb,\n\t0x0430, 0x045f,\n\t0x0461, 0x0461,\n\t0x0463, 0x0463,\n\t0x0465, 0x0465,\n\t0x0467, 0x0467,\n\t0x0469, 0x0469,\n\t0x046b, 0x046b,\n\t0x046d, 0x046d,\n\t0x046f, 0x046f,\n\t0x0471, 0x0471,\n\t0x0473, 0x0473,\n\t0x0475, 0x0475,\n\t0x0477, 0x0477,\n\t0x0479, 0x0479,\n\t0x047b, 0x047b,\n\t0x047d, 0x047d,\n\t0x047f, 0x047f,\n\t0x0481, 0x0481,\n\t0x048b, 0x048b,\n\t0x048d, 0x048d,\n\t0x048f, 0x048f,\n\t0x0491, 0x0491,\n\t0x0493, 0x0493,\n\t0x0495, 0x0495,\n\t0x0497, 0x0497,\n\t0x0499, 0x0499,\n\t0x049b, 0x049b,\n\t0x049d, 0x049d,\n\t0x049f, 0x049f,\n\t0x04a1, 0x04a1,\n\t0x04a3, 0x04a3,\n\t0x04a5, 0x04a5,\n\t0x04a7, 0x04a7,\n\t0x04a9, 0x04a9,\n\t0x04ab, 0x04ab,\n\t0x04ad, 0x04ad,\n\t0x04af, 0x04af,\n\t0x04b1, 0x04b1,\n\t0x04b3, 0x04b3,\n\t0x04b5, 0x04b5,\n\t0x04b7, 0x04b7,\n\t0x04b9, 0x04b9,\n\t0x04bb, 0x04bb,\n\t0x04bd, 0x04bd,\n\t0x04bf, 0x04bf,\n\t0x04c2, 0x04c2,\n\t0x04c4, 0x04c4,\n\t0x04c6, 0x04c6,\n\t0x04c8, 0x04c8,\n\t0x04ca, 0x04ca,\n\t0x04cc, 0x04cc,\n\t0x04ce, 0x04cf,\n\t0x04d1, 0x04d1,\n\t0x04d3, 0x04d3,\n\t0x04d5, 0x04d5,\n\t0x04d7, 0x04d7,\n\t0x04d9, 0x04d9,\n\t0x04db, 0x04db,\n\t0x04dd, 0x04dd,\n\t0x04df, 0x04df,\n\t0x04e1, 0x04e1,\n\t0x04e3, 0x04e3,\n\t0x04e5, 0x04e5,\n\t0x04e7, 0x04e7,\n\t0x04e9, 0x04e9,\n\t0x04eb, 0x04eb,\n\t0x04ed, 0x04ed,\n\t0x04ef, 0x04ef,\n\t0x04f1, 0x04f1,\n\t0x04f3, 0x04f3,\n\t0x04f5, 0x04f5,\n\t0x04f7, 0x04f7,\n\t0x04f9, 0x04f9,\n\t0x04fb, 0x04fb,\n\t0x04fd, 0x04fd,\n\t0x04ff, 0x04ff,\n\t0x0501, 0x0501,\n\t0x0503, 0x0503,\n\t0x0505, 0x0505,\n\t0x0507, 0x0507,\n\t0x0509, 0x0509,\n\t0x050b, 0x050b,\n\t0x050d, 0x050d,\n\t0x050f, 0x050f,\n\t0x0511, 0x0511,\n\t0x0513, 0x0513,\n\t0x0515, 0x0515,\n\t0x0517, 0x0517,\n\t0x0519, 0x0519,\n\t0x051b, 0x051b,\n\t0x051d, 0x051d,\n\t0x051f, 0x051f,\n\t0x0521, 0x0521,\n\t0x0523, 0x0523,\n\t0x0525, 0x0525,\n\t0x0527, 0x0527,\n\t0x0561, 0x0587,\n\t0x1d79, 0x1d79,\n\t0x1d7d, 0x1d7d,\n\t0x1e01, 0x1e01,\n\t0x1e03, 0x1e03,\n\t0x1e05, 0x1e05,\n\t0x1e07, 0x1e07,\n\t0x1e09, 0x1e09,\n\t0x1e0b, 0x1e0b,\n\t0x1e0d, 0x1e0d,\n\t0x1e0f, 0x1e0f,\n\t0x1e11, 0x1e11,\n\t0x1e13, 0x1e13,\n\t0x1e15, 0x1e15,\n\t0x1e17, 0x1e17,\n\t0x1e19, 0x1e19,\n\t0x1e1b, 0x1e1b,\n\t0x1e1d, 0x1e1d,\n\t0x1e1f, 0x1e1f,\n\t0x1e21, 0x1e21,\n\t0x1e23, 0x1e23,\n\t0x1e25, 0x1e25,\n\t0x1e27, 0x1e27,\n\t0x1e29, 0x1e29,\n\t0x1e2b, 0x1e2b,\n\t0x1e2d, 0x1e2d,\n\t0x1e2f, 0x1e2f,\n\t0x1e31, 0x1e31,\n\t0x1e33, 0x1e33,\n\t0x1e35, 0x1e35,\n\t0x1e37, 0x1e37,\n\t0x1e39, 0x1e39,\n\t0x1e3b, 0x1e3b,\n\t0x1e3d, 0x1e3d,\n\t0x1e3f, 0x1e3f,\n\t0x1e41, 0x1e41,\n\t0x1e43, 0x1e43,\n\t0x1e45, 0x1e45,\n\t0x1e47, 0x1e47,\n\t0x1e49, 0x1e49,\n\t0x1e4b, 0x1e4b,\n\t0x1e4d, 0x1e4d,\n\t0x1e4f, 0x1e4f,\n\t0x1e51, 0x1e51,\n\t0x1e53, 0x1e53,\n\t0x1e55, 0x1e55,\n\t0x1e57, 0x1e57,\n\t0x1e59, 0x1e59,\n\t0x1e5b, 0x1e5b,\n\t0x1e5d, 0x1e5d,\n\t0x1e5f, 0x1e5f,\n\t0x1e61, 0x1e61,\n\t0x1e63, 0x1e63,\n\t0x1e65, 0x1e65,\n\t0x1e67, 0x1e67,\n\t0x1e69, 0x1e69,\n\t0x1e6b, 0x1e6b,\n\t0x1e6d, 0x1e6d,\n\t0x1e6f, 0x1e6f,\n\t0x1e71, 0x1e71,\n\t0x1e73, 0x1e73,\n\t0x1e75, 0x1e75,\n\t0x1e77, 0x1e77,\n\t0x1e79, 0x1e79,\n\t0x1e7b, 0x1e7b,\n\t0x1e7d, 0x1e7d,\n\t0x1e7f, 0x1e7f,\n\t0x1e81, 0x1e81,\n\t0x1e83, 0x1e83,\n\t0x1e85, 0x1e85,\n\t0x1e87, 0x1e87,\n\t0x1e89, 0x1e89,\n\t0x1e8b, 0x1e8b,\n\t0x1e8d, 0x1e8d,\n\t0x1e8f, 0x1e8f,\n\t0x1e91, 0x1e91,\n\t0x1e93, 0x1e93,\n\t0x1e95, 0x1e9b,\n\t0x1ea1, 0x1ea1,\n\t0x1ea3, 0x1ea3,\n\t0x1ea5, 0x1ea5,\n\t0x1ea7, 0x1ea7,\n\t0x1ea9, 0x1ea9,\n\t0x1eab, 0x1eab,\n\t0x1ead, 0x1ead,\n\t0x1eaf, 0x1eaf,\n\t0x1eb1, 0x1eb1,\n\t0x1eb3, 0x1eb3,\n\t0x1eb5, 0x1eb5,\n\t0x1eb7, 0x1eb7,\n\t0x1eb9, 0x1eb9,\n\t0x1ebb, 0x1ebb,\n\t0x1ebd, 0x1ebd,\n\t0x1ebf, 0x1ebf,\n\t0x1ec1, 0x1ec1,\n\t0x1ec3, 0x1ec3,\n\t0x1ec5, 0x1ec5,\n\t0x1ec7, 0x1ec7,\n\t0x1ec9, 0x1ec9,\n\t0x1ecb, 0x1ecb,\n\t0x1ecd, 0x1ecd,\n\t0x1ecf, 0x1ecf,\n\t0x1ed1, 0x1ed1,\n\t0x1ed3, 0x1ed3,\n\t0x1ed5, 0x1ed5,\n\t0x1ed7, 0x1ed7,\n\t0x1ed9, 0x1ed9,\n\t0x1edb, 0x1edb,\n\t0x1edd, 0x1edd,\n\t0x1edf, 0x1edf,\n\t0x1ee1, 0x1ee1,\n\t0x1ee3, 0x1ee3,\n\t0x1ee5, 0x1ee5,\n\t0x1ee7, 0x1ee7,\n\t0x1ee9, 0x1ee9,\n\t0x1eeb, 0x1eeb,\n\t0x1eed, 0x1eed,\n\t0x1eef, 0x1eef,\n\t0x1ef1, 0x1ef1,\n\t0x1ef3, 0x1ef3,\n\t0x1ef5, 0x1ef5,\n\t0x1ef7, 0x1ef7,\n\t0x1ef9, 0x1ef9,\n\t0x1efb, 0x1efb,\n\t0x1efd, 0x1efd,\n\t0x1eff, 0x1f07,\n\t0x1f10, 0x1f15,\n\t0x1f20, 0x1f27,\n\t0x1f30, 0x1f37,\n\t0x1f40, 0x1f45,\n\t0x1f50, 0x1f57,\n\t0x1f60, 0x1f67,\n\t0x1f70, 0x1f7d,\n\t0x1f80, 0x1f87,\n\t0x1f90, 0x1f97,\n\t0x1fa0, 0x1fa7,\n\t0x1fb0, 0x1fb4,\n\t0x1fb6, 0x1fb7,\n\t0x1fbe, 0x1fbe,\n\t0x1fc2, 0x1fc4,\n\t0x1fc6, 0x1fc7,\n\t0x1fd0, 0x1fd3,\n\t0x1fd6, 0x1fd7,\n\t0x1fe0, 0x1fe7,\n\t0x1ff2, 0x1ff4,\n\t0x1ff6, 0x1ff7,\n\t0x214e, 0x214e,\n\t0x2170, 0x217f,\n\t0x2184, 0x2184,\n\t0x24d0, 0x24e9,\n\t0x2c30, 0x2c5e,\n\t0x2c61, 0x2c61,\n\t0x2c65, 0x2c66,\n\t0x2c68, 0x2c68,\n\t0x2c6a, 0x2c6a,\n\t0x2c6c, 0x2c6c,\n\t0x2c73, 0x2c73,\n\t0x2c76, 0x2c76,\n\t0x2c81, 0x2c81,\n\t0x2c83, 0x2c83,\n\t0x2c85, 0x2c85,\n\t0x2c87, 0x2c87,\n\t0x2c89, 0x2c89,\n\t0x2c8b, 0x2c8b,\n\t0x2c8d, 0x2c8d,\n\t0x2c8f, 0x2c8f,\n\t0x2c91, 0x2c91,\n\t0x2c93, 0x2c93,\n\t0x2c95, 0x2c95,\n\t0x2c97, 0x2c97,\n\t0x2c99, 0x2c99,\n\t0x2c9b, 0x2c9b,\n\t0x2c9d, 0x2c9d,\n\t0x2c9f, 0x2c9f,\n\t0x2ca1, 0x2ca1,\n\t0x2ca3, 0x2ca3,\n\t0x2ca5, 0x2ca5,\n\t0x2ca7, 0x2ca7,\n\t0x2ca9, 0x2ca9,\n\t0x2cab, 0x2cab,\n\t0x2cad, 0x2cad,\n\t0x2caf, 0x2caf,\n\t0x2cb1, 0x2cb1,\n\t0x2cb3, 0x2cb3,\n\t0x2cb5, 0x2cb5,\n\t0x2cb7, 0x2cb7,\n\t0x2cb9, 0x2cb9,\n\t0x2cbb, 0x2cbb,\n\t0x2cbd, 0x2cbd,\n\t0x2cbf, 0x2cbf,\n\t0x2cc1, 0x2cc1,\n\t0x2cc3, 0x2cc3,\n\t0x2cc5, 0x2cc5,\n\t0x2cc7, 0x2cc7,\n\t0x2cc9, 0x2cc9,\n\t0x2ccb, 0x2ccb,\n\t0x2ccd, 0x2ccd,\n\t0x2ccf, 0x2ccf,\n\t0x2cd1, 0x2cd1,\n\t0x2cd3, 0x2cd3,\n\t0x2cd5, 0x2cd5,\n\t0x2cd7, 0x2cd7,\n\t0x2cd9, 0x2cd9,\n\t0x2cdb, 0x2cdb,\n\t0x2cdd, 0x2cdd,\n\t0x2cdf, 0x2cdf,\n\t0x2ce1, 0x2ce1,\n\t0x2ce3, 0x2ce3,\n\t0x2cec, 0x2cec,\n\t0x2cee, 0x2cee,\n\t0x2cf3, 0x2cf3,\n\t0x2d00, 0x2d25,\n\t0x2d27, 0x2d27,\n\t0x2d2d, 0x2d2d,\n\t0xa641, 0xa641,\n\t0xa643, 0xa643,\n\t0xa645, 0xa645,\n\t0xa647, 0xa647,\n\t0xa649, 0xa649,\n\t0xa64b, 0xa64b,\n\t0xa64d, 0xa64d,\n\t0xa64f, 0xa64f,\n\t0xa651, 0xa651,\n\t0xa653, 0xa653,\n\t0xa655, 0xa655,\n\t0xa657, 0xa657,\n\t0xa659, 0xa659,\n\t0xa65b, 0xa65b,\n\t0xa65d, 0xa65d,\n\t0xa65f, 0xa65f,\n\t0xa661, 0xa661,\n\t0xa663, 0xa663,\n\t0xa665, 0xa665,\n\t0xa667, 0xa667,\n\t0xa669, 0xa669,\n\t0xa66b, 0xa66b,\n\t0xa66d, 0xa66d,\n\t0xa681, 0xa681,\n\t0xa683, 0xa683,\n\t0xa685, 0xa685,\n\t0xa687, 0xa687,\n\t0xa689, 0xa689,\n\t0xa68b, 0xa68b,\n\t0xa68d, 0xa68d,\n\t0xa68f, 0xa68f,\n\t0xa691, 0xa691,\n\t0xa693, 0xa693,\n\t0xa695, 0xa695,\n\t0xa697, 0xa697,\n\t0xa723, 0xa723,\n\t0xa725, 0xa725,\n\t0xa727, 0xa727,\n\t0xa729, 0xa729,\n\t0xa72b, 0xa72b,\n\t0xa72d, 0xa72d,\n\t0xa72f, 0xa72f,\n\t0xa733, 0xa733,\n\t0xa735, 0xa735,\n\t0xa737, 0xa737,\n\t0xa739, 0xa739,\n\t0xa73b, 0xa73b,\n\t0xa73d, 0xa73d,\n\t0xa73f, 0xa73f,\n\t0xa741, 0xa741,\n\t0xa743, 0xa743,\n\t0xa745, 0xa745,\n\t0xa747, 0xa747,\n\t0xa749, 0xa749,\n\t0xa74b, 0xa74b,\n\t0xa74d, 0xa74d,\n\t0xa74f, 0xa74f,\n\t0xa751, 0xa751,\n\t0xa753, 0xa753,\n\t0xa755, 0xa755,\n\t0xa757, 0xa757,\n\t0xa759, 0xa759,\n\t0xa75b, 0xa75b,\n\t0xa75d, 0xa75d,\n\t0xa75f, 0xa75f,\n\t0xa761, 0xa761,\n\t0xa763, 0xa763,\n\t0xa765, 0xa765,\n\t0xa767, 0xa767,\n\t0xa769, 0xa769,\n\t0xa76b, 0xa76b,\n\t0xa76d, 0xa76d,\n\t0xa76f, 0xa76f,\n\t0xa77a, 0xa77a,\n\t0xa77c, 0xa77c,\n\t0xa77f, 0xa77f,\n\t0xa781, 0xa781,\n\t0xa783, 0xa783,\n\t0xa785, 0xa785,\n\t0xa787, 0xa787,\n\t0xa78c, 0xa78c,\n\t0xa791, 0xa791,\n\t0xa793, 0xa793,\n\t0xa7a1, 0xa7a1,\n\t0xa7a3, 0xa7a3,\n\t0xa7a5, 0xa7a5,\n\t0xa7a7, 0xa7a7,\n\t0xa7a9, 0xa7a9,\n\t0xfb00, 0xfb06,\n\t0xfb13, 0xfb17,\n\t0xff41, 0xff5a,\n\t0x10428, 0x1044f,\n}; /* CR_Changes_When_Titlecased */\n\n/* 'Changes_When_Casefolded': Derived Property */\nstatic const OnigCodePoint CR_Changes_When_Casefolded[] = {\n\t582,\n\t0x0041, 0x005a,\n\t0x00b5, 0x00b5,\n\t0x00c0, 0x00d6,\n\t0x00d8, 0x00df,\n\t0x0100, 0x0100,\n\t0x0102, 0x0102,\n\t0x0104, 0x0104,\n\t0x0106, 0x0106,\n\t0x0108, 0x0108,\n\t0x010a, 0x010a,\n\t0x010c, 0x010c,\n\t0x010e, 0x010e,\n\t0x0110, 0x0110,\n\t0x0112, 0x0112,\n\t0x0114, 0x0114,\n\t0x0116, 0x0116,\n\t0x0118, 0x0118,\n\t0x011a, 0x011a,\n\t0x011c, 0x011c,\n\t0x011e, 0x011e,\n\t0x0120, 0x0120,\n\t0x0122, 0x0122,\n\t0x0124, 0x0124,\n\t0x0126, 0x0126,\n\t0x0128, 0x0128,\n\t0x012a, 0x012a,\n\t0x012c, 0x012c,\n\t0x012e, 0x012e,\n\t0x0130, 0x0130,\n\t0x0132, 0x0132,\n\t0x0134, 0x0134,\n\t0x0136, 0x0136,\n\t0x0139, 0x0139,\n\t0x013b, 0x013b,\n\t0x013d, 0x013d,\n\t0x013f, 0x013f,\n\t0x0141, 0x0141,\n\t0x0143, 0x0143,\n\t0x0145, 0x0145,\n\t0x0147, 0x0147,\n\t0x0149, 0x014a,\n\t0x014c, 0x014c,\n\t0x014e, 0x014e,\n\t0x0150, 0x0150,\n\t0x0152, 0x0152,\n\t0x0154, 0x0154,\n\t0x0156, 0x0156,\n\t0x0158, 0x0158,\n\t0x015a, 0x015a,\n\t0x015c, 0x015c,\n\t0x015e, 0x015e,\n\t0x0160, 0x0160,\n\t0x0162, 0x0162,\n\t0x0164, 0x0164,\n\t0x0166, 0x0166,\n\t0x0168, 0x0168,\n\t0x016a, 0x016a,\n\t0x016c, 0x016c,\n\t0x016e, 0x016e,\n\t0x0170, 0x0170,\n\t0x0172, 0x0172,\n\t0x0174, 0x0174,\n\t0x0176, 0x0176,\n\t0x0178, 0x0179,\n\t0x017b, 0x017b,\n\t0x017d, 0x017d,\n\t0x017f, 0x017f,\n\t0x0181, 0x0182,\n\t0x0184, 0x0184,\n\t0x0186, 0x0187,\n\t0x0189, 0x018b,\n\t0x018e, 0x0191,\n\t0x0193, 0x0194,\n\t0x0196, 0x0198,\n\t0x019c, 0x019d,\n\t0x019f, 0x01a0,\n\t0x01a2, 0x01a2,\n\t0x01a4, 0x01a4,\n\t0x01a6, 0x01a7,\n\t0x01a9, 0x01a9,\n\t0x01ac, 0x01ac,\n\t0x01ae, 0x01af,\n\t0x01b1, 0x01b3,\n\t0x01b5, 0x01b5,\n\t0x01b7, 0x01b8,\n\t0x01bc, 0x01bc,\n\t0x01c4, 0x01c5,\n\t0x01c7, 0x01c8,\n\t0x01ca, 0x01cb,\n\t0x01cd, 0x01cd,\n\t0x01cf, 0x01cf,\n\t0x01d1, 0x01d1,\n\t0x01d3, 0x01d3,\n\t0x01d5, 0x01d5,\n\t0x01d7, 0x01d7,\n\t0x01d9, 0x01d9,\n\t0x01db, 0x01db,\n\t0x01de, 0x01de,\n\t0x01e0, 0x01e0,\n\t0x01e2, 0x01e2,\n\t0x01e4, 0x01e4,\n\t0x01e6, 0x01e6,\n\t0x01e8, 0x01e8,\n\t0x01ea, 0x01ea,\n\t0x01ec, 0x01ec,\n\t0x01ee, 0x01ee,\n\t0x01f1, 0x01f2,\n\t0x01f4, 0x01f4,\n\t0x01f6, 0x01f8,\n\t0x01fa, 0x01fa,\n\t0x01fc, 0x01fc,\n\t0x01fe, 0x01fe,\n\t0x0200, 0x0200,\n\t0x0202, 0x0202,\n\t0x0204, 0x0204,\n\t0x0206, 0x0206,\n\t0x0208, 0x0208,\n\t0x020a, 0x020a,\n\t0x020c, 0x020c,\n\t0x020e, 0x020e,\n\t0x0210, 0x0210,\n\t0x0212, 0x0212,\n\t0x0214, 0x0214,\n\t0x0216, 0x0216,\n\t0x0218, 0x0218,\n\t0x021a, 0x021a,\n\t0x021c, 0x021c,\n\t0x021e, 0x021e,\n\t0x0220, 0x0220,\n\t0x0222, 0x0222,\n\t0x0224, 0x0224,\n\t0x0226, 0x0226,\n\t0x0228, 0x0228,\n\t0x022a, 0x022a,\n\t0x022c, 0x022c,\n\t0x022e, 0x022e,\n\t0x0230, 0x0230,\n\t0x0232, 0x0232,\n\t0x023a, 0x023b,\n\t0x023d, 0x023e,\n\t0x0241, 0x0241,\n\t0x0243, 0x0246,\n\t0x0248, 0x0248,\n\t0x024a, 0x024a,\n\t0x024c, 0x024c,\n\t0x024e, 0x024e,\n\t0x0345, 0x0345,\n\t0x0370, 0x0370,\n\t0x0372, 0x0372,\n\t0x0376, 0x0376,\n\t0x0386, 0x0386,\n\t0x0388, 0x038a,\n\t0x038c, 0x038c,\n\t0x038e, 0x038f,\n\t0x0391, 0x03a1,\n\t0x03a3, 0x03ab,\n\t0x03c2, 0x03c2,\n\t0x03cf, 0x03d1,\n\t0x03d5, 0x03d6,\n\t0x03d8, 0x03d8,\n\t0x03da, 0x03da,\n\t0x03dc, 0x03dc,\n\t0x03de, 0x03de,\n\t0x03e0, 0x03e0,\n\t0x03e2, 0x03e2,\n\t0x03e4, 0x03e4,\n\t0x03e6, 0x03e6,\n\t0x03e8, 0x03e8,\n\t0x03ea, 0x03ea,\n\t0x03ec, 0x03ec,\n\t0x03ee, 0x03ee,\n\t0x03f0, 0x03f1,\n\t0x03f4, 0x03f5,\n\t0x03f7, 0x03f7,\n\t0x03f9, 0x03fa,\n\t0x03fd, 0x042f,\n\t0x0460, 0x0460,\n\t0x0462, 0x0462,\n\t0x0464, 0x0464,\n\t0x0466, 0x0466,\n\t0x0468, 0x0468,\n\t0x046a, 0x046a,\n\t0x046c, 0x046c,\n\t0x046e, 0x046e,\n\t0x0470, 0x0470,\n\t0x0472, 0x0472,\n\t0x0474, 0x0474,\n\t0x0476, 0x0476,\n\t0x0478, 0x0478,\n\t0x047a, 0x047a,\n\t0x047c, 0x047c,\n\t0x047e, 0x047e,\n\t0x0480, 0x0480,\n\t0x048a, 0x048a,\n\t0x048c, 0x048c,\n\t0x048e, 0x048e,\n\t0x0490, 0x0490,\n\t0x0492, 0x0492,\n\t0x0494, 0x0494,\n\t0x0496, 0x0496,\n\t0x0498, 0x0498,\n\t0x049a, 0x049a,\n\t0x049c, 0x049c,\n\t0x049e, 0x049e,\n\t0x04a0, 0x04a0,\n\t0x04a2, 0x04a2,\n\t0x04a4, 0x04a4,\n\t0x04a6, 0x04a6,\n\t0x04a8, 0x04a8,\n\t0x04aa, 0x04aa,\n\t0x04ac, 0x04ac,\n\t0x04ae, 0x04ae,\n\t0x04b0, 0x04b0,\n\t0x04b2, 0x04b2,\n\t0x04b4, 0x04b4,\n\t0x04b6, 0x04b6,\n\t0x04b8, 0x04b8,\n\t0x04ba, 0x04ba,\n\t0x04bc, 0x04bc,\n\t0x04be, 0x04be,\n\t0x04c0, 0x04c1,\n\t0x04c3, 0x04c3,\n\t0x04c5, 0x04c5,\n\t0x04c7, 0x04c7,\n\t0x04c9, 0x04c9,\n\t0x04cb, 0x04cb,\n\t0x04cd, 0x04cd,\n\t0x04d0, 0x04d0,\n\t0x04d2, 0x04d2,\n\t0x04d4, 0x04d4,\n\t0x04d6, 0x04d6,\n\t0x04d8, 0x04d8,\n\t0x04da, 0x04da,\n\t0x04dc, 0x04dc,\n\t0x04de, 0x04de,\n\t0x04e0, 0x04e0,\n\t0x04e2, 0x04e2,\n\t0x04e4, 0x04e4,\n\t0x04e6, 0x04e6,\n\t0x04e8, 0x04e8,\n\t0x04ea, 0x04ea,\n\t0x04ec, 0x04ec,\n\t0x04ee, 0x04ee,\n\t0x04f0, 0x04f0,\n\t0x04f2, 0x04f2,\n\t0x04f4, 0x04f4,\n\t0x04f6, 0x04f6,\n\t0x04f8, 0x04f8,\n\t0x04fa, 0x04fa,\n\t0x04fc, 0x04fc,\n\t0x04fe, 0x04fe,\n\t0x0500, 0x0500,\n\t0x0502, 0x0502,\n\t0x0504, 0x0504,\n\t0x0506, 0x0506,\n\t0x0508, 0x0508,\n\t0x050a, 0x050a,\n\t0x050c, 0x050c,\n\t0x050e, 0x050e,\n\t0x0510, 0x0510,\n\t0x0512, 0x0512,\n\t0x0514, 0x0514,\n\t0x0516, 0x0516,\n\t0x0518, 0x0518,\n\t0x051a, 0x051a,\n\t0x051c, 0x051c,\n\t0x051e, 0x051e,\n\t0x0520, 0x0520,\n\t0x0522, 0x0522,\n\t0x0524, 0x0524,\n\t0x0526, 0x0526,\n\t0x0531, 0x0556,\n\t0x0587, 0x0587,\n\t0x10a0, 0x10c5,\n\t0x10c7, 0x10c7,\n\t0x10cd, 0x10cd,\n\t0x1e00, 0x1e00,\n\t0x1e02, 0x1e02,\n\t0x1e04, 0x1e04,\n\t0x1e06, 0x1e06,\n\t0x1e08, 0x1e08,\n\t0x1e0a, 0x1e0a,\n\t0x1e0c, 0x1e0c,\n\t0x1e0e, 0x1e0e,\n\t0x1e10, 0x1e10,\n\t0x1e12, 0x1e12,\n\t0x1e14, 0x1e14,\n\t0x1e16, 0x1e16,\n\t0x1e18, 0x1e18,\n\t0x1e1a, 0x1e1a,\n\t0x1e1c, 0x1e1c,\n\t0x1e1e, 0x1e1e,\n\t0x1e20, 0x1e20,\n\t0x1e22, 0x1e22,\n\t0x1e24, 0x1e24,\n\t0x1e26, 0x1e26,\n\t0x1e28, 0x1e28,\n\t0x1e2a, 0x1e2a,\n\t0x1e2c, 0x1e2c,\n\t0x1e2e, 0x1e2e,\n\t0x1e30, 0x1e30,\n\t0x1e32, 0x1e32,\n\t0x1e34, 0x1e34,\n\t0x1e36, 0x1e36,\n\t0x1e38, 0x1e38,\n\t0x1e3a, 0x1e3a,\n\t0x1e3c, 0x1e3c,\n\t0x1e3e, 0x1e3e,\n\t0x1e40, 0x1e40,\n\t0x1e42, 0x1e42,\n\t0x1e44, 0x1e44,\n\t0x1e46, 0x1e46,\n\t0x1e48, 0x1e48,\n\t0x1e4a, 0x1e4a,\n\t0x1e4c, 0x1e4c,\n\t0x1e4e, 0x1e4e,\n\t0x1e50, 0x1e50,\n\t0x1e52, 0x1e52,\n\t0x1e54, 0x1e54,\n\t0x1e56, 0x1e56,\n\t0x1e58, 0x1e58,\n\t0x1e5a, 0x1e5a,\n\t0x1e5c, 0x1e5c,\n\t0x1e5e, 0x1e5e,\n\t0x1e60, 0x1e60,\n\t0x1e62, 0x1e62,\n\t0x1e64, 0x1e64,\n\t0x1e66, 0x1e66,\n\t0x1e68, 0x1e68,\n\t0x1e6a, 0x1e6a,\n\t0x1e6c, 0x1e6c,\n\t0x1e6e, 0x1e6e,\n\t0x1e70, 0x1e70,\n\t0x1e72, 0x1e72,\n\t0x1e74, 0x1e74,\n\t0x1e76, 0x1e76,\n\t0x1e78, 0x1e78,\n\t0x1e7a, 0x1e7a,\n\t0x1e7c, 0x1e7c,\n\t0x1e7e, 0x1e7e,\n\t0x1e80, 0x1e80,\n\t0x1e82, 0x1e82,\n\t0x1e84, 0x1e84,\n\t0x1e86, 0x1e86,\n\t0x1e88, 0x1e88,\n\t0x1e8a, 0x1e8a,\n\t0x1e8c, 0x1e8c,\n\t0x1e8e, 0x1e8e,\n\t0x1e90, 0x1e90,\n\t0x1e92, 0x1e92,\n\t0x1e94, 0x1e94,\n\t0x1e9a, 0x1e9b,\n\t0x1e9e, 0x1e9e,\n\t0x1ea0, 0x1ea0,\n\t0x1ea2, 0x1ea2,\n\t0x1ea4, 0x1ea4,\n\t0x1ea6, 0x1ea6,\n\t0x1ea8, 0x1ea8,\n\t0x1eaa, 0x1eaa,\n\t0x1eac, 0x1eac,\n\t0x1eae, 0x1eae,\n\t0x1eb0, 0x1eb0,\n\t0x1eb2, 0x1eb2,\n\t0x1eb4, 0x1eb4,\n\t0x1eb6, 0x1eb6,\n\t0x1eb8, 0x1eb8,\n\t0x1eba, 0x1eba,\n\t0x1ebc, 0x1ebc,\n\t0x1ebe, 0x1ebe,\n\t0x1ec0, 0x1ec0,\n\t0x1ec2, 0x1ec2,\n\t0x1ec4, 0x1ec4,\n\t0x1ec6, 0x1ec6,\n\t0x1ec8, 0x1ec8,\n\t0x1eca, 0x1eca,\n\t0x1ecc, 0x1ecc,\n\t0x1ece, 0x1ece,\n\t0x1ed0, 0x1ed0,\n\t0x1ed2, 0x1ed2,\n\t0x1ed4, 0x1ed4,\n\t0x1ed6, 0x1ed6,\n\t0x1ed8, 0x1ed8,\n\t0x1eda, 0x1eda,\n\t0x1edc, 0x1edc,\n\t0x1ede, 0x1ede,\n\t0x1ee0, 0x1ee0,\n\t0x1ee2, 0x1ee2,\n\t0x1ee4, 0x1ee4,\n\t0x1ee6, 0x1ee6,\n\t0x1ee8, 0x1ee8,\n\t0x1eea, 0x1eea,\n\t0x1eec, 0x1eec,\n\t0x1eee, 0x1eee,\n\t0x1ef0, 0x1ef0,\n\t0x1ef2, 0x1ef2,\n\t0x1ef4, 0x1ef4,\n\t0x1ef6, 0x1ef6,\n\t0x1ef8, 0x1ef8,\n\t0x1efa, 0x1efa,\n\t0x1efc, 0x1efc,\n\t0x1efe, 0x1efe,\n\t0x1f08, 0x1f0f,\n\t0x1f18, 0x1f1d,\n\t0x1f28, 0x1f2f,\n\t0x1f38, 0x1f3f,\n\t0x1f48, 0x1f4d,\n\t0x1f59, 0x1f59,\n\t0x1f5b, 0x1f5b,\n\t0x1f5d, 0x1f5d,\n\t0x1f5f, 0x1f5f,\n\t0x1f68, 0x1f6f,\n\t0x1f80, 0x1faf,\n\t0x1fb2, 0x1fb4,\n\t0x1fb7, 0x1fbc,\n\t0x1fc2, 0x1fc4,\n\t0x1fc7, 0x1fcc,\n\t0x1fd8, 0x1fdb,\n\t0x1fe8, 0x1fec,\n\t0x1ff2, 0x1ff4,\n\t0x1ff7, 0x1ffc,\n\t0x2126, 0x2126,\n\t0x212a, 0x212b,\n\t0x2132, 0x2132,\n\t0x2160, 0x216f,\n\t0x2183, 0x2183,\n\t0x24b6, 0x24cf,\n\t0x2c00, 0x2c2e,\n\t0x2c60, 0x2c60,\n\t0x2c62, 0x2c64,\n\t0x2c67, 0x2c67,\n\t0x2c69, 0x2c69,\n\t0x2c6b, 0x2c6b,\n\t0x2c6d, 0x2c70,\n\t0x2c72, 0x2c72,\n\t0x2c75, 0x2c75,\n\t0x2c7e, 0x2c80,\n\t0x2c82, 0x2c82,\n\t0x2c84, 0x2c84,\n\t0x2c86, 0x2c86,\n\t0x2c88, 0x2c88,\n\t0x2c8a, 0x2c8a,\n\t0x2c8c, 0x2c8c,\n\t0x2c8e, 0x2c8e,\n\t0x2c90, 0x2c90,\n\t0x2c92, 0x2c92,\n\t0x2c94, 0x2c94,\n\t0x2c96, 0x2c96,\n\t0x2c98, 0x2c98,\n\t0x2c9a, 0x2c9a,\n\t0x2c9c, 0x2c9c,\n\t0x2c9e, 0x2c9e,\n\t0x2ca0, 0x2ca0,\n\t0x2ca2, 0x2ca2,\n\t0x2ca4, 0x2ca4,\n\t0x2ca6, 0x2ca6,\n\t0x2ca8, 0x2ca8,\n\t0x2caa, 0x2caa,\n\t0x2cac, 0x2cac,\n\t0x2cae, 0x2cae,\n\t0x2cb0, 0x2cb0,\n\t0x2cb2, 0x2cb2,\n\t0x2cb4, 0x2cb4,\n\t0x2cb6, 0x2cb6,\n\t0x2cb8, 0x2cb8,\n\t0x2cba, 0x2cba,\n\t0x2cbc, 0x2cbc,\n\t0x2cbe, 0x2cbe,\n\t0x2cc0, 0x2cc0,\n\t0x2cc2, 0x2cc2,\n\t0x2cc4, 0x2cc4,\n\t0x2cc6, 0x2cc6,\n\t0x2cc8, 0x2cc8,\n\t0x2cca, 0x2cca,\n\t0x2ccc, 0x2ccc,\n\t0x2cce, 0x2cce,\n\t0x2cd0, 0x2cd0,\n\t0x2cd2, 0x2cd2,\n\t0x2cd4, 0x2cd4,\n\t0x2cd6, 0x2cd6,\n\t0x2cd8, 0x2cd8,\n\t0x2cda, 0x2cda,\n\t0x2cdc, 0x2cdc,\n\t0x2cde, 0x2cde,\n\t0x2ce0, 0x2ce0,\n\t0x2ce2, 0x2ce2,\n\t0x2ceb, 0x2ceb,\n\t0x2ced, 0x2ced,\n\t0x2cf2, 0x2cf2,\n\t0xa640, 0xa640,\n\t0xa642, 0xa642,\n\t0xa644, 0xa644,\n\t0xa646, 0xa646,\n\t0xa648, 0xa648,\n\t0xa64a, 0xa64a,\n\t0xa64c, 0xa64c,\n\t0xa64e, 0xa64e,\n\t0xa650, 0xa650,\n\t0xa652, 0xa652,\n\t0xa654, 0xa654,\n\t0xa656, 0xa656,\n\t0xa658, 0xa658,\n\t0xa65a, 0xa65a,\n\t0xa65c, 0xa65c,\n\t0xa65e, 0xa65e,\n\t0xa660, 0xa660,\n\t0xa662, 0xa662,\n\t0xa664, 0xa664,\n\t0xa666, 0xa666,\n\t0xa668, 0xa668,\n\t0xa66a, 0xa66a,\n\t0xa66c, 0xa66c,\n\t0xa680, 0xa680,\n\t0xa682, 0xa682,\n\t0xa684, 0xa684,\n\t0xa686, 0xa686,\n\t0xa688, 0xa688,\n\t0xa68a, 0xa68a,\n\t0xa68c, 0xa68c,\n\t0xa68e, 0xa68e,\n\t0xa690, 0xa690,\n\t0xa692, 0xa692,\n\t0xa694, 0xa694,\n\t0xa696, 0xa696,\n\t0xa722, 0xa722,\n\t0xa724, 0xa724,\n\t0xa726, 0xa726,\n\t0xa728, 0xa728,\n\t0xa72a, 0xa72a,\n\t0xa72c, 0xa72c,\n\t0xa72e, 0xa72e,\n\t0xa732, 0xa732,\n\t0xa734, 0xa734,\n\t0xa736, 0xa736,\n\t0xa738, 0xa738,\n\t0xa73a, 0xa73a,\n\t0xa73c, 0xa73c,\n\t0xa73e, 0xa73e,\n\t0xa740, 0xa740,\n\t0xa742, 0xa742,\n\t0xa744, 0xa744,\n\t0xa746, 0xa746,\n\t0xa748, 0xa748,\n\t0xa74a, 0xa74a,\n\t0xa74c, 0xa74c,\n\t0xa74e, 0xa74e,\n\t0xa750, 0xa750,\n\t0xa752, 0xa752,\n\t0xa754, 0xa754,\n\t0xa756, 0xa756,\n\t0xa758, 0xa758,\n\t0xa75a, 0xa75a,\n\t0xa75c, 0xa75c,\n\t0xa75e, 0xa75e,\n\t0xa760, 0xa760,\n\t0xa762, 0xa762,\n\t0xa764, 0xa764,\n\t0xa766, 0xa766,\n\t0xa768, 0xa768,\n\t0xa76a, 0xa76a,\n\t0xa76c, 0xa76c,\n\t0xa76e, 0xa76e,\n\t0xa779, 0xa779,\n\t0xa77b, 0xa77b,\n\t0xa77d, 0xa77e,\n\t0xa780, 0xa780,\n\t0xa782, 0xa782,\n\t0xa784, 0xa784,\n\t0xa786, 0xa786,\n\t0xa78b, 0xa78b,\n\t0xa78d, 0xa78d,\n\t0xa790, 0xa790,\n\t0xa792, 0xa792,\n\t0xa7a0, 0xa7a0,\n\t0xa7a2, 0xa7a2,\n\t0xa7a4, 0xa7a4,\n\t0xa7a6, 0xa7a6,\n\t0xa7a8, 0xa7a8,\n\t0xa7aa, 0xa7aa,\n\t0xfb00, 0xfb06,\n\t0xfb13, 0xfb17,\n\t0xff21, 0xff3a,\n\t0x10400, 0x10427,\n}; /* CR_Changes_When_Casefolded */\n\n/* 'Changes_When_Casemapped': Derived Property */\nstatic const OnigCodePoint CR_Changes_When_Casemapped[] = {\n\t104,\n\t0x0041, 0x005a,\n\t0x0061, 0x007a,\n\t0x00b5, 0x00b5,\n\t0x00c0, 0x00d6,\n\t0x00d8, 0x00f6,\n\t0x00f8, 0x0137,\n\t0x0139, 0x018c,\n\t0x018e, 0x019a,\n\t0x019c, 0x01a9,\n\t0x01ac, 0x01b9,\n\t0x01bc, 0x01bd,\n\t0x01bf, 0x01bf,\n\t0x01c4, 0x0220,\n\t0x0222, 0x0233,\n\t0x023a, 0x0254,\n\t0x0256, 0x0257,\n\t0x0259, 0x0259,\n\t0x025b, 0x025b,\n\t0x0260, 0x0260,\n\t0x0263, 0x0263,\n\t0x0265, 0x0266,\n\t0x0268, 0x0269,\n\t0x026b, 0x026b,\n\t0x026f, 0x026f,\n\t0x0271, 0x0272,\n\t0x0275, 0x0275,\n\t0x027d, 0x027d,\n\t0x0280, 0x0280,\n\t0x0283, 0x0283,\n\t0x0288, 0x028c,\n\t0x0292, 0x0292,\n\t0x0345, 0x0345,\n\t0x0370, 0x0373,\n\t0x0376, 0x0377,\n\t0x037b, 0x037d,\n\t0x0386, 0x0386,\n\t0x0388, 0x038a,\n\t0x038c, 0x038c,\n\t0x038e, 0x03a1,\n\t0x03a3, 0x03d1,\n\t0x03d5, 0x03f2,\n\t0x03f4, 0x03f5,\n\t0x03f7, 0x03fb,\n\t0x03fd, 0x0481,\n\t0x048a, 0x0527,\n\t0x0531, 0x0556,\n\t0x0561, 0x0587,\n\t0x10a0, 0x10c5,\n\t0x10c7, 0x10c7,\n\t0x10cd, 0x10cd,\n\t0x1d79, 0x1d79,\n\t0x1d7d, 0x1d7d,\n\t0x1e00, 0x1e9b,\n\t0x1e9e, 0x1e9e,\n\t0x1ea0, 0x1f15,\n\t0x1f18, 0x1f1d,\n\t0x1f20, 0x1f45,\n\t0x1f48, 0x1f4d,\n\t0x1f50, 0x1f57,\n\t0x1f59, 0x1f59,\n\t0x1f5b, 0x1f5b,\n\t0x1f5d, 0x1f5d,\n\t0x1f5f, 0x1f7d,\n\t0x1f80, 0x1fb4,\n\t0x1fb6, 0x1fbc,\n\t0x1fbe, 0x1fbe,\n\t0x1fc2, 0x1fc4,\n\t0x1fc6, 0x1fcc,\n\t0x1fd0, 0x1fd3,\n\t0x1fd6, 0x1fdb,\n\t0x1fe0, 0x1fec,\n\t0x1ff2, 0x1ff4,\n\t0x1ff6, 0x1ffc,\n\t0x2126, 0x2126,\n\t0x212a, 0x212b,\n\t0x2132, 0x2132,\n\t0x214e, 0x214e,\n\t0x2160, 0x217f,\n\t0x2183, 0x2184,\n\t0x24b6, 0x24e9,\n\t0x2c00, 0x2c2e,\n\t0x2c30, 0x2c5e,\n\t0x2c60, 0x2c70,\n\t0x2c72, 0x2c73,\n\t0x2c75, 0x2c76,\n\t0x2c7e, 0x2ce3,\n\t0x2ceb, 0x2cee,\n\t0x2cf2, 0x2cf3,\n\t0x2d00, 0x2d25,\n\t0x2d27, 0x2d27,\n\t0x2d2d, 0x2d2d,\n\t0xa640, 0xa66d,\n\t0xa680, 0xa697,\n\t0xa722, 0xa72f,\n\t0xa732, 0xa76f,\n\t0xa779, 0xa787,\n\t0xa78b, 0xa78d,\n\t0xa790, 0xa793,\n\t0xa7a0, 0xa7aa,\n\t0xfb00, 0xfb06,\n\t0xfb13, 0xfb17,\n\t0xff21, 0xff3a,\n\t0xff41, 0xff5a,\n\t0x10400, 0x1044f,\n}; /* CR_Changes_When_Casemapped */\n\n/* 'ID_Start': Derived Property */\nstatic const OnigCodePoint CR_ID_Start[] = {\n\t488,\n\t0x0041, 0x005a,\n\t0x0061, 0x007a,\n\t0x00aa, 0x00aa,\n\t0x00b5, 0x00b5,\n\t0x00ba, 0x00ba,\n\t0x00c0, 0x00d6,\n\t0x00d8, 0x00f6,\n\t0x00f8, 0x02c1,\n\t0x02c6, 0x02d1,\n\t0x02e0, 0x02e4,\n\t0x02ec, 0x02ec,\n\t0x02ee, 0x02ee,\n\t0x0370, 0x0374,\n\t0x0376, 0x0377,\n\t0x037a, 0x037d,\n\t0x0386, 0x0386,\n\t0x0388, 0x038a,\n\t0x038c, 0x038c,\n\t0x038e, 0x03a1,\n\t0x03a3, 0x03f5,\n\t0x03f7, 0x0481,\n\t0x048a, 0x0527,\n\t0x0531, 0x0556,\n\t0x0559, 0x0559,\n\t0x0561, 0x0587,\n\t0x05d0, 0x05ea,\n\t0x05f0, 0x05f2,\n\t0x0620, 0x064a,\n\t0x066e, 0x066f,\n\t0x0671, 0x06d3,\n\t0x06d5, 0x06d5,\n\t0x06e5, 0x06e6,\n\t0x06ee, 0x06ef,\n\t0x06fa, 0x06fc,\n\t0x06ff, 0x06ff,\n\t0x0710, 0x0710,\n\t0x0712, 0x072f,\n\t0x074d, 0x07a5,\n\t0x07b1, 0x07b1,\n\t0x07ca, 0x07ea,\n\t0x07f4, 0x07f5,\n\t0x07fa, 0x07fa,\n\t0x0800, 0x0815,\n\t0x081a, 0x081a,\n\t0x0824, 0x0824,\n\t0x0828, 0x0828,\n\t0x0840, 0x0858,\n\t0x08a0, 0x08a0,\n\t0x08a2, 0x08ac,\n\t0x0904, 0x0939,\n\t0x093d, 0x093d,\n\t0x0950, 0x0950,\n\t0x0958, 0x0961,\n\t0x0971, 0x0977,\n\t0x0979, 0x097f,\n\t0x0985, 0x098c,\n\t0x098f, 0x0990,\n\t0x0993, 0x09a8,\n\t0x09aa, 0x09b0,\n\t0x09b2, 0x09b2,\n\t0x09b6, 0x09b9,\n\t0x09bd, 0x09bd,\n\t0x09ce, 0x09ce,\n\t0x09dc, 0x09dd,\n\t0x09df, 0x09e1,\n\t0x09f0, 0x09f1,\n\t0x0a05, 0x0a0a,\n\t0x0a0f, 0x0a10,\n\t0x0a13, 0x0a28,\n\t0x0a2a, 0x0a30,\n\t0x0a32, 0x0a33,\n\t0x0a35, 0x0a36,\n\t0x0a38, 0x0a39,\n\t0x0a59, 0x0a5c,\n\t0x0a5e, 0x0a5e,\n\t0x0a72, 0x0a74,\n\t0x0a85, 0x0a8d,\n\t0x0a8f, 0x0a91,\n\t0x0a93, 0x0aa8,\n\t0x0aaa, 0x0ab0,\n\t0x0ab2, 0x0ab3,\n\t0x0ab5, 0x0ab9,\n\t0x0abd, 0x0abd,\n\t0x0ad0, 0x0ad0,\n\t0x0ae0, 0x0ae1,\n\t0x0b05, 0x0b0c,\n\t0x0b0f, 0x0b10,\n\t0x0b13, 0x0b28,\n\t0x0b2a, 0x0b30,\n\t0x0b32, 0x0b33,\n\t0x0b35, 0x0b39,\n\t0x0b3d, 0x0b3d,\n\t0x0b5c, 0x0b5d,\n\t0x0b5f, 0x0b61,\n\t0x0b71, 0x0b71,\n\t0x0b83, 0x0b83,\n\t0x0b85, 0x0b8a,\n\t0x0b8e, 0x0b90,\n\t0x0b92, 0x0b95,\n\t0x0b99, 0x0b9a,\n\t0x0b9c, 0x0b9c,\n\t0x0b9e, 0x0b9f,\n\t0x0ba3, 0x0ba4,\n\t0x0ba8, 0x0baa,\n\t0x0bae, 0x0bb9,\n\t0x0bd0, 0x0bd0,\n\t0x0c05, 0x0c0c,\n\t0x0c0e, 0x0c10,\n\t0x0c12, 0x0c28,\n\t0x0c2a, 0x0c33,\n\t0x0c35, 0x0c39,\n\t0x0c3d, 0x0c3d,\n\t0x0c58, 0x0c59,\n\t0x0c60, 0x0c61,\n\t0x0c85, 0x0c8c,\n\t0x0c8e, 0x0c90,\n\t0x0c92, 0x0ca8,\n\t0x0caa, 0x0cb3,\n\t0x0cb5, 0x0cb9,\n\t0x0cbd, 0x0cbd,\n\t0x0cde, 0x0cde,\n\t0x0ce0, 0x0ce1,\n\t0x0cf1, 0x0cf2,\n\t0x0d05, 0x0d0c,\n\t0x0d0e, 0x0d10,\n\t0x0d12, 0x0d3a,\n\t0x0d3d, 0x0d3d,\n\t0x0d4e, 0x0d4e,\n\t0x0d60, 0x0d61,\n\t0x0d7a, 0x0d7f,\n\t0x0d85, 0x0d96,\n\t0x0d9a, 0x0db1,\n\t0x0db3, 0x0dbb,\n\t0x0dbd, 0x0dbd,\n\t0x0dc0, 0x0dc6,\n\t0x0e01, 0x0e30,\n\t0x0e32, 0x0e33,\n\t0x0e40, 0x0e46,\n\t0x0e81, 0x0e82,\n\t0x0e84, 0x0e84,\n\t0x0e87, 0x0e88,\n\t0x0e8a, 0x0e8a,\n\t0x0e8d, 0x0e8d,\n\t0x0e94, 0x0e97,\n\t0x0e99, 0x0e9f,\n\t0x0ea1, 0x0ea3,\n\t0x0ea5, 0x0ea5,\n\t0x0ea7, 0x0ea7,\n\t0x0eaa, 0x0eab,\n\t0x0ead, 0x0eb0,\n\t0x0eb2, 0x0eb3,\n\t0x0ebd, 0x0ebd,\n\t0x0ec0, 0x0ec4,\n\t0x0ec6, 0x0ec6,\n\t0x0edc, 0x0edf,\n\t0x0f00, 0x0f00,\n\t0x0f40, 0x0f47,\n\t0x0f49, 0x0f6c,\n\t0x0f88, 0x0f8c,\n\t0x1000, 0x102a,\n\t0x103f, 0x103f,\n\t0x1050, 0x1055,\n\t0x105a, 0x105d,\n\t0x1061, 0x1061,\n\t0x1065, 0x1066,\n\t0x106e, 0x1070,\n\t0x1075, 0x1081,\n\t0x108e, 0x108e,\n\t0x10a0, 0x10c5,\n\t0x10c7, 0x10c7,\n\t0x10cd, 0x10cd,\n\t0x10d0, 0x10fa,\n\t0x10fc, 0x1248,\n\t0x124a, 0x124d,\n\t0x1250, 0x1256,\n\t0x1258, 0x1258,\n\t0x125a, 0x125d,\n\t0x1260, 0x1288,\n\t0x128a, 0x128d,\n\t0x1290, 0x12b0,\n\t0x12b2, 0x12b5,\n\t0x12b8, 0x12be,\n\t0x12c0, 0x12c0,\n\t0x12c2, 0x12c5,\n\t0x12c8, 0x12d6,\n\t0x12d8, 0x1310,\n\t0x1312, 0x1315,\n\t0x1318, 0x135a,\n\t0x1380, 0x138f,\n\t0x13a0, 0x13f4,\n\t0x1401, 0x166c,\n\t0x166f, 0x167f,\n\t0x1681, 0x169a,\n\t0x16a0, 0x16ea,\n\t0x16ee, 0x16f0,\n\t0x1700, 0x170c,\n\t0x170e, 0x1711,\n\t0x1720, 0x1731,\n\t0x1740, 0x1751,\n\t0x1760, 0x176c,\n\t0x176e, 0x1770,\n\t0x1780, 0x17b3,\n\t0x17d7, 0x17d7,\n\t0x17dc, 0x17dc,\n\t0x1820, 0x1877,\n\t0x1880, 0x18a8,\n\t0x18aa, 0x18aa,\n\t0x18b0, 0x18f5,\n\t0x1900, 0x191c,\n\t0x1950, 0x196d,\n\t0x1970, 0x1974,\n\t0x1980, 0x19ab,\n\t0x19c1, 0x19c7,\n\t0x1a00, 0x1a16,\n\t0x1a20, 0x1a54,\n\t0x1aa7, 0x1aa7,\n\t0x1b05, 0x1b33,\n\t0x1b45, 0x1b4b,\n\t0x1b83, 0x1ba0,\n\t0x1bae, 0x1baf,\n\t0x1bba, 0x1be5,\n\t0x1c00, 0x1c23,\n\t0x1c4d, 0x1c4f,\n\t0x1c5a, 0x1c7d,\n\t0x1ce9, 0x1cec,\n\t0x1cee, 0x1cf1,\n\t0x1cf5, 0x1cf6,\n\t0x1d00, 0x1dbf,\n\t0x1e00, 0x1f15,\n\t0x1f18, 0x1f1d,\n\t0x1f20, 0x1f45,\n\t0x1f48, 0x1f4d,\n\t0x1f50, 0x1f57,\n\t0x1f59, 0x1f59,\n\t0x1f5b, 0x1f5b,\n\t0x1f5d, 0x1f5d,\n\t0x1f5f, 0x1f7d,\n\t0x1f80, 0x1fb4,\n\t0x1fb6, 0x1fbc,\n\t0x1fbe, 0x1fbe,\n\t0x1fc2, 0x1fc4,\n\t0x1fc6, 0x1fcc,\n\t0x1fd0, 0x1fd3,\n\t0x1fd6, 0x1fdb,\n\t0x1fe0, 0x1fec,\n\t0x1ff2, 0x1ff4,\n\t0x1ff6, 0x1ffc,\n\t0x2071, 0x2071,\n\t0x207f, 0x207f,\n\t0x2090, 0x209c,\n\t0x2102, 0x2102,\n\t0x2107, 0x2107,\n\t0x210a, 0x2113,\n\t0x2115, 0x2115,\n\t0x2118, 0x211d,\n\t0x2124, 0x2124,\n\t0x2126, 0x2126,\n\t0x2128, 0x2128,\n\t0x212a, 0x2139,\n\t0x213c, 0x213f,\n\t0x2145, 0x2149,\n\t0x214e, 0x214e,\n\t0x2160, 0x2188,\n\t0x2c00, 0x2c2e,\n\t0x2c30, 0x2c5e,\n\t0x2c60, 0x2ce4,\n\t0x2ceb, 0x2cee,\n\t0x2cf2, 0x2cf3,\n\t0x2d00, 0x2d25,\n\t0x2d27, 0x2d27,\n\t0x2d2d, 0x2d2d,\n\t0x2d30, 0x2d67,\n\t0x2d6f, 0x2d6f,\n\t0x2d80, 0x2d96,\n\t0x2da0, 0x2da6,\n\t0x2da8, 0x2dae,\n\t0x2db0, 0x2db6,\n\t0x2db8, 0x2dbe,\n\t0x2dc0, 0x2dc6,\n\t0x2dc8, 0x2dce,\n\t0x2dd0, 0x2dd6,\n\t0x2dd8, 0x2dde,\n\t0x3005, 0x3007,\n\t0x3021, 0x3029,\n\t0x3031, 0x3035,\n\t0x3038, 0x303c,\n\t0x3041, 0x3096,\n\t0x309b, 0x309f,\n\t0x30a1, 0x30fa,\n\t0x30fc, 0x30ff,\n\t0x3105, 0x312d,\n\t0x3131, 0x318e,\n\t0x31a0, 0x31ba,\n\t0x31f0, 0x31ff,\n\t0x3400, 0x4db5,\n\t0x4e00, 0x9fcc,\n\t0xa000, 0xa48c,\n\t0xa4d0, 0xa4fd,\n\t0xa500, 0xa60c,\n\t0xa610, 0xa61f,\n\t0xa62a, 0xa62b,\n\t0xa640, 0xa66e,\n\t0xa67f, 0xa697,\n\t0xa6a0, 0xa6ef,\n\t0xa717, 0xa71f,\n\t0xa722, 0xa788,\n\t0xa78b, 0xa78e,\n\t0xa790, 0xa793,\n\t0xa7a0, 0xa7aa,\n\t0xa7f8, 0xa801,\n\t0xa803, 0xa805,\n\t0xa807, 0xa80a,\n\t0xa80c, 0xa822,\n\t0xa840, 0xa873,\n\t0xa882, 0xa8b3,\n\t0xa8f2, 0xa8f7,\n\t0xa8fb, 0xa8fb,\n\t0xa90a, 0xa925,\n\t0xa930, 0xa946,\n\t0xa960, 0xa97c,\n\t0xa984, 0xa9b2,\n\t0xa9cf, 0xa9cf,\n\t0xaa00, 0xaa28,\n\t0xaa40, 0xaa42,\n\t0xaa44, 0xaa4b,\n\t0xaa60, 0xaa76,\n\t0xaa7a, 0xaa7a,\n\t0xaa80, 0xaaaf,\n\t0xaab1, 0xaab1,\n\t0xaab5, 0xaab6,\n\t0xaab9, 0xaabd,\n\t0xaac0, 0xaac0,\n\t0xaac2, 0xaac2,\n\t0xaadb, 0xaadd,\n\t0xaae0, 0xaaea,\n\t0xaaf2, 0xaaf4,\n\t0xab01, 0xab06,\n\t0xab09, 0xab0e,\n\t0xab11, 0xab16,\n\t0xab20, 0xab26,\n\t0xab28, 0xab2e,\n\t0xabc0, 0xabe2,\n\t0xac00, 0xd7a3,\n\t0xd7b0, 0xd7c6,\n\t0xd7cb, 0xd7fb,\n\t0xf900, 0xfa6d,\n\t0xfa70, 0xfad9,\n\t0xfb00, 0xfb06,\n\t0xfb13, 0xfb17,\n\t0xfb1d, 0xfb1d,\n\t0xfb1f, 0xfb28,\n\t0xfb2a, 0xfb36,\n\t0xfb38, 0xfb3c,\n\t0xfb3e, 0xfb3e,\n\t0xfb40, 0xfb41,\n\t0xfb43, 0xfb44,\n\t0xfb46, 0xfbb1,\n\t0xfbd3, 0xfd3d,\n\t0xfd50, 0xfd8f,\n\t0xfd92, 0xfdc7,\n\t0xfdf0, 0xfdfb,\n\t0xfe70, 0xfe74,\n\t0xfe76, 0xfefc,\n\t0xff21, 0xff3a,\n\t0xff41, 0xff5a,\n\t0xff66, 0xffbe,\n\t0xffc2, 0xffc7,\n\t0xffca, 0xffcf,\n\t0xffd2, 0xffd7,\n\t0xffda, 0xffdc,\n\t0x10000, 0x1000b,\n\t0x1000d, 0x10026,\n\t0x10028, 0x1003a,\n\t0x1003c, 0x1003d,\n\t0x1003f, 0x1004d,\n\t0x10050, 0x1005d,\n\t0x10080, 0x100fa,\n\t0x10140, 0x10174,\n\t0x10280, 0x1029c,\n\t0x102a0, 0x102d0,\n\t0x10300, 0x1031e,\n\t0x10330, 0x1034a,\n\t0x10380, 0x1039d,\n\t0x103a0, 0x103c3,\n\t0x103c8, 0x103cf,\n\t0x103d1, 0x103d5,\n\t0x10400, 0x1049d,\n\t0x10800, 0x10805,\n\t0x10808, 0x10808,\n\t0x1080a, 0x10835,\n\t0x10837, 0x10838,\n\t0x1083c, 0x1083c,\n\t0x1083f, 0x10855,\n\t0x10900, 0x10915,\n\t0x10920, 0x10939,\n\t0x10980, 0x109b7,\n\t0x109be, 0x109bf,\n\t0x10a00, 0x10a00,\n\t0x10a10, 0x10a13,\n\t0x10a15, 0x10a17,\n\t0x10a19, 0x10a33,\n\t0x10a60, 0x10a7c,\n\t0x10b00, 0x10b35,\n\t0x10b40, 0x10b55,\n\t0x10b60, 0x10b72,\n\t0x10c00, 0x10c48,\n\t0x11003, 0x11037,\n\t0x11083, 0x110af,\n\t0x110d0, 0x110e8,\n\t0x11103, 0x11126,\n\t0x11183, 0x111b2,\n\t0x111c1, 0x111c4,\n\t0x11680, 0x116aa,\n\t0x12000, 0x1236e,\n\t0x12400, 0x12462,\n\t0x13000, 0x1342e,\n\t0x16800, 0x16a38,\n\t0x16f00, 0x16f44,\n\t0x16f50, 0x16f50,\n\t0x16f93, 0x16f9f,\n\t0x1b000, 0x1b001,\n\t0x1d400, 0x1d454,\n\t0x1d456, 0x1d49c,\n\t0x1d49e, 0x1d49f,\n\t0x1d4a2, 0x1d4a2,\n\t0x1d4a5, 0x1d4a6,\n\t0x1d4a9, 0x1d4ac,\n\t0x1d4ae, 0x1d4b9,\n\t0x1d4bb, 0x1d4bb,\n\t0x1d4bd, 0x1d4c3,\n\t0x1d4c5, 0x1d505,\n\t0x1d507, 0x1d50a,\n\t0x1d50d, 0x1d514,\n\t0x1d516, 0x1d51c,\n\t0x1d51e, 0x1d539,\n\t0x1d53b, 0x1d53e,\n\t0x1d540, 0x1d544,\n\t0x1d546, 0x1d546,\n\t0x1d54a, 0x1d550,\n\t0x1d552, 0x1d6a5,\n\t0x1d6a8, 0x1d6c0,\n\t0x1d6c2, 0x1d6da,\n\t0x1d6dc, 0x1d6fa,\n\t0x1d6fc, 0x1d714,\n\t0x1d716, 0x1d734,\n\t0x1d736, 0x1d74e,\n\t0x1d750, 0x1d76e,\n\t0x1d770, 0x1d788,\n\t0x1d78a, 0x1d7a8,\n\t0x1d7aa, 0x1d7c2,\n\t0x1d7c4, 0x1d7cb,\n\t0x1ee00, 0x1ee03,\n\t0x1ee05, 0x1ee1f,\n\t0x1ee21, 0x1ee22,\n\t0x1ee24, 0x1ee24,\n\t0x1ee27, 0x1ee27,\n\t0x1ee29, 0x1ee32,\n\t0x1ee34, 0x1ee37,\n\t0x1ee39, 0x1ee39,\n\t0x1ee3b, 0x1ee3b,\n\t0x1ee42, 0x1ee42,\n\t0x1ee47, 0x1ee47,\n\t0x1ee49, 0x1ee49,\n\t0x1ee4b, 0x1ee4b,\n\t0x1ee4d, 0x1ee4f,\n\t0x1ee51, 0x1ee52,\n\t0x1ee54, 0x1ee54,\n\t0x1ee57, 0x1ee57,\n\t0x1ee59, 0x1ee59,\n\t0x1ee5b, 0x1ee5b,\n\t0x1ee5d, 0x1ee5d,\n\t0x1ee5f, 0x1ee5f,\n\t0x1ee61, 0x1ee62,\n\t0x1ee64, 0x1ee64,\n\t0x1ee67, 0x1ee6a,\n\t0x1ee6c, 0x1ee72,\n\t0x1ee74, 0x1ee77,\n\t0x1ee79, 0x1ee7c,\n\t0x1ee7e, 0x1ee7e,\n\t0x1ee80, 0x1ee89,\n\t0x1ee8b, 0x1ee9b,\n\t0x1eea1, 0x1eea3,\n\t0x1eea5, 0x1eea9,\n\t0x1eeab, 0x1eebb,\n\t0x20000, 0x2a6d6,\n\t0x2a700, 0x2b734,\n\t0x2b740, 0x2b81d,\n\t0x2f800, 0x2fa1d,\n}; /* CR_ID_Start */\n\n/* 'ID_Continue': Derived Property */\nstatic const OnigCodePoint CR_ID_Continue[] = {\n\t564,\n\t0x0030, 0x0039,\n\t0x0041, 0x005a,\n\t0x005f, 0x005f,\n\t0x0061, 0x007a,\n\t0x00aa, 0x00aa,\n\t0x00b5, 0x00b5,\n\t0x00b7, 0x00b7,\n\t0x00ba, 0x00ba,\n\t0x00c0, 0x00d6,\n\t0x00d8, 0x00f6,\n\t0x00f8, 0x02c1,\n\t0x02c6, 0x02d1,\n\t0x02e0, 0x02e4,\n\t0x02ec, 0x02ec,\n\t0x02ee, 0x02ee,\n\t0x0300, 0x0374,\n\t0x0376, 0x0377,\n\t0x037a, 0x037d,\n\t0x0386, 0x038a,\n\t0x038c, 0x038c,\n\t0x038e, 0x03a1,\n\t0x03a3, 0x03f5,\n\t0x03f7, 0x0481,\n\t0x0483, 0x0487,\n\t0x048a, 0x0527,\n\t0x0531, 0x0556,\n\t0x0559, 0x0559,\n\t0x0561, 0x0587,\n\t0x0591, 0x05bd,\n\t0x05bf, 0x05bf,\n\t0x05c1, 0x05c2,\n\t0x05c4, 0x05c5,\n\t0x05c7, 0x05c7,\n\t0x05d0, 0x05ea,\n\t0x05f0, 0x05f2,\n\t0x0610, 0x061a,\n\t0x0620, 0x0669,\n\t0x066e, 0x06d3,\n\t0x06d5, 0x06dc,\n\t0x06df, 0x06e8,\n\t0x06ea, 0x06fc,\n\t0x06ff, 0x06ff,\n\t0x0710, 0x074a,\n\t0x074d, 0x07b1,\n\t0x07c0, 0x07f5,\n\t0x07fa, 0x07fa,\n\t0x0800, 0x082d,\n\t0x0840, 0x085b,\n\t0x08a0, 0x08a0,\n\t0x08a2, 0x08ac,\n\t0x08e4, 0x08fe,\n\t0x0900, 0x0963,\n\t0x0966, 0x096f,\n\t0x0971, 0x0977,\n\t0x0979, 0x097f,\n\t0x0981, 0x0983,\n\t0x0985, 0x098c,\n\t0x098f, 0x0990,\n\t0x0993, 0x09a8,\n\t0x09aa, 0x09b0,\n\t0x09b2, 0x09b2,\n\t0x09b6, 0x09b9,\n\t0x09bc, 0x09c4,\n\t0x09c7, 0x09c8,\n\t0x09cb, 0x09ce,\n\t0x09d7, 0x09d7,\n\t0x09dc, 0x09dd,\n\t0x09df, 0x09e3,\n\t0x09e6, 0x09f1,\n\t0x0a01, 0x0a03,\n\t0x0a05, 0x0a0a,\n\t0x0a0f, 0x0a10,\n\t0x0a13, 0x0a28,\n\t0x0a2a, 0x0a30,\n\t0x0a32, 0x0a33,\n\t0x0a35, 0x0a36,\n\t0x0a38, 0x0a39,\n\t0x0a3c, 0x0a3c,\n\t0x0a3e, 0x0a42,\n\t0x0a47, 0x0a48,\n\t0x0a4b, 0x0a4d,\n\t0x0a51, 0x0a51,\n\t0x0a59, 0x0a5c,\n\t0x0a5e, 0x0a5e,\n\t0x0a66, 0x0a75,\n\t0x0a81, 0x0a83,\n\t0x0a85, 0x0a8d,\n\t0x0a8f, 0x0a91,\n\t0x0a93, 0x0aa8,\n\t0x0aaa, 0x0ab0,\n\t0x0ab2, 0x0ab3,\n\t0x0ab5, 0x0ab9,\n\t0x0abc, 0x0ac5,\n\t0x0ac7, 0x0ac9,\n\t0x0acb, 0x0acd,\n\t0x0ad0, 0x0ad0,\n\t0x0ae0, 0x0ae3,\n\t0x0ae6, 0x0aef,\n\t0x0b01, 0x0b03,\n\t0x0b05, 0x0b0c,\n\t0x0b0f, 0x0b10,\n\t0x0b13, 0x0b28,\n\t0x0b2a, 0x0b30,\n\t0x0b32, 0x0b33,\n\t0x0b35, 0x0b39,\n\t0x0b3c, 0x0b44,\n\t0x0b47, 0x0b48,\n\t0x0b4b, 0x0b4d,\n\t0x0b56, 0x0b57,\n\t0x0b5c, 0x0b5d,\n\t0x0b5f, 0x0b63,\n\t0x0b66, 0x0b6f,\n\t0x0b71, 0x0b71,\n\t0x0b82, 0x0b83,\n\t0x0b85, 0x0b8a,\n\t0x0b8e, 0x0b90,\n\t0x0b92, 0x0b95,\n\t0x0b99, 0x0b9a,\n\t0x0b9c, 0x0b9c,\n\t0x0b9e, 0x0b9f,\n\t0x0ba3, 0x0ba4,\n\t0x0ba8, 0x0baa,\n\t0x0bae, 0x0bb9,\n\t0x0bbe, 0x0bc2,\n\t0x0bc6, 0x0bc8,\n\t0x0bca, 0x0bcd,\n\t0x0bd0, 0x0bd0,\n\t0x0bd7, 0x0bd7,\n\t0x0be6, 0x0bef,\n\t0x0c01, 0x0c03,\n\t0x0c05, 0x0c0c,\n\t0x0c0e, 0x0c10,\n\t0x0c12, 0x0c28,\n\t0x0c2a, 0x0c33,\n\t0x0c35, 0x0c39,\n\t0x0c3d, 0x0c44,\n\t0x0c46, 0x0c48,\n\t0x0c4a, 0x0c4d,\n\t0x0c55, 0x0c56,\n\t0x0c58, 0x0c59,\n\t0x0c60, 0x0c63,\n\t0x0c66, 0x0c6f,\n\t0x0c82, 0x0c83,\n\t0x0c85, 0x0c8c,\n\t0x0c8e, 0x0c90,\n\t0x0c92, 0x0ca8,\n\t0x0caa, 0x0cb3,\n\t0x0cb5, 0x0cb9,\n\t0x0cbc, 0x0cc4,\n\t0x0cc6, 0x0cc8,\n\t0x0cca, 0x0ccd,\n\t0x0cd5, 0x0cd6,\n\t0x0cde, 0x0cde,\n\t0x0ce0, 0x0ce3,\n\t0x0ce6, 0x0cef,\n\t0x0cf1, 0x0cf2,\n\t0x0d02, 0x0d03,\n\t0x0d05, 0x0d0c,\n\t0x0d0e, 0x0d10,\n\t0x0d12, 0x0d3a,\n\t0x0d3d, 0x0d44,\n\t0x0d46, 0x0d48,\n\t0x0d4a, 0x0d4e,\n\t0x0d57, 0x0d57,\n\t0x0d60, 0x0d63,\n\t0x0d66, 0x0d6f,\n\t0x0d7a, 0x0d7f,\n\t0x0d82, 0x0d83,\n\t0x0d85, 0x0d96,\n\t0x0d9a, 0x0db1,\n\t0x0db3, 0x0dbb,\n\t0x0dbd, 0x0dbd,\n\t0x0dc0, 0x0dc6,\n\t0x0dca, 0x0dca,\n\t0x0dcf, 0x0dd4,\n\t0x0dd6, 0x0dd6,\n\t0x0dd8, 0x0ddf,\n\t0x0df2, 0x0df3,\n\t0x0e01, 0x0e3a,\n\t0x0e40, 0x0e4e,\n\t0x0e50, 0x0e59,\n\t0x0e81, 0x0e82,\n\t0x0e84, 0x0e84,\n\t0x0e87, 0x0e88,\n\t0x0e8a, 0x0e8a,\n\t0x0e8d, 0x0e8d,\n\t0x0e94, 0x0e97,\n\t0x0e99, 0x0e9f,\n\t0x0ea1, 0x0ea3,\n\t0x0ea5, 0x0ea5,\n\t0x0ea7, 0x0ea7,\n\t0x0eaa, 0x0eab,\n\t0x0ead, 0x0eb9,\n\t0x0ebb, 0x0ebd,\n\t0x0ec0, 0x0ec4,\n\t0x0ec6, 0x0ec6,\n\t0x0ec8, 0x0ecd,\n\t0x0ed0, 0x0ed9,\n\t0x0edc, 0x0edf,\n\t0x0f00, 0x0f00,\n\t0x0f18, 0x0f19,\n\t0x0f20, 0x0f29,\n\t0x0f35, 0x0f35,\n\t0x0f37, 0x0f37,\n\t0x0f39, 0x0f39,\n\t0x0f3e, 0x0f47,\n\t0x0f49, 0x0f6c,\n\t0x0f71, 0x0f84,\n\t0x0f86, 0x0f97,\n\t0x0f99, 0x0fbc,\n\t0x0fc6, 0x0fc6,\n\t0x1000, 0x1049,\n\t0x1050, 0x109d,\n\t0x10a0, 0x10c5,\n\t0x10c7, 0x10c7,\n\t0x10cd, 0x10cd,\n\t0x10d0, 0x10fa,\n\t0x10fc, 0x1248,\n\t0x124a, 0x124d,\n\t0x1250, 0x1256,\n\t0x1258, 0x1258,\n\t0x125a, 0x125d,\n\t0x1260, 0x1288,\n\t0x128a, 0x128d,\n\t0x1290, 0x12b0,\n\t0x12b2, 0x12b5,\n\t0x12b8, 0x12be,\n\t0x12c0, 0x12c0,\n\t0x12c2, 0x12c5,\n\t0x12c8, 0x12d6,\n\t0x12d8, 0x1310,\n\t0x1312, 0x1315,\n\t0x1318, 0x135a,\n\t0x135d, 0x135f,\n\t0x1369, 0x1371,\n\t0x1380, 0x138f,\n\t0x13a0, 0x13f4,\n\t0x1401, 0x166c,\n\t0x166f, 0x167f,\n\t0x1681, 0x169a,\n\t0x16a0, 0x16ea,\n\t0x16ee, 0x16f0,\n\t0x1700, 0x170c,\n\t0x170e, 0x1714,\n\t0x1720, 0x1734,\n\t0x1740, 0x1753,\n\t0x1760, 0x176c,\n\t0x176e, 0x1770,\n\t0x1772, 0x1773,\n\t0x1780, 0x17d3,\n\t0x17d7, 0x17d7,\n\t0x17dc, 0x17dd,\n\t0x17e0, 0x17e9,\n\t0x180b, 0x180d,\n\t0x1810, 0x1819,\n\t0x1820, 0x1877,\n\t0x1880, 0x18aa,\n\t0x18b0, 0x18f5,\n\t0x1900, 0x191c,\n\t0x1920, 0x192b,\n\t0x1930, 0x193b,\n\t0x1946, 0x196d,\n\t0x1970, 0x1974,\n\t0x1980, 0x19ab,\n\t0x19b0, 0x19c9,\n\t0x19d0, 0x19da,\n\t0x1a00, 0x1a1b,\n\t0x1a20, 0x1a5e,\n\t0x1a60, 0x1a7c,\n\t0x1a7f, 0x1a89,\n\t0x1a90, 0x1a99,\n\t0x1aa7, 0x1aa7,\n\t0x1b00, 0x1b4b,\n\t0x1b50, 0x1b59,\n\t0x1b6b, 0x1b73,\n\t0x1b80, 0x1bf3,\n\t0x1c00, 0x1c37,\n\t0x1c40, 0x1c49,\n\t0x1c4d, 0x1c7d,\n\t0x1cd0, 0x1cd2,\n\t0x1cd4, 0x1cf6,\n\t0x1d00, 0x1de6,\n\t0x1dfc, 0x1f15,\n\t0x1f18, 0x1f1d,\n\t0x1f20, 0x1f45,\n\t0x1f48, 0x1f4d,\n\t0x1f50, 0x1f57,\n\t0x1f59, 0x1f59,\n\t0x1f5b, 0x1f5b,\n\t0x1f5d, 0x1f5d,\n\t0x1f5f, 0x1f7d,\n\t0x1f80, 0x1fb4,\n\t0x1fb6, 0x1fbc,\n\t0x1fbe, 0x1fbe,\n\t0x1fc2, 0x1fc4,\n\t0x1fc6, 0x1fcc,\n\t0x1fd0, 0x1fd3,\n\t0x1fd6, 0x1fdb,\n\t0x1fe0, 0x1fec,\n\t0x1ff2, 0x1ff4,\n\t0x1ff6, 0x1ffc,\n\t0x203f, 0x2040,\n\t0x2054, 0x2054,\n\t0x2071, 0x2071,\n\t0x207f, 0x207f,\n\t0x2090, 0x209c,\n\t0x20d0, 0x20dc,\n\t0x20e1, 0x20e1,\n\t0x20e5, 0x20f0,\n\t0x2102, 0x2102,\n\t0x2107, 0x2107,\n\t0x210a, 0x2113,\n\t0x2115, 0x2115,\n\t0x2118, 0x211d,\n\t0x2124, 0x2124,\n\t0x2126, 0x2126,\n\t0x2128, 0x2128,\n\t0x212a, 0x2139,\n\t0x213c, 0x213f,\n\t0x2145, 0x2149,\n\t0x214e, 0x214e,\n\t0x2160, 0x2188,\n\t0x2c00, 0x2c2e,\n\t0x2c30, 0x2c5e,\n\t0x2c60, 0x2ce4,\n\t0x2ceb, 0x2cf3,\n\t0x2d00, 0x2d25,\n\t0x2d27, 0x2d27,\n\t0x2d2d, 0x2d2d,\n\t0x2d30, 0x2d67,\n\t0x2d6f, 0x2d6f,\n\t0x2d7f, 0x2d96,\n\t0x2da0, 0x2da6,\n\t0x2da8, 0x2dae,\n\t0x2db0, 0x2db6,\n\t0x2db8, 0x2dbe,\n\t0x2dc0, 0x2dc6,\n\t0x2dc8, 0x2dce,\n\t0x2dd0, 0x2dd6,\n\t0x2dd8, 0x2dde,\n\t0x2de0, 0x2dff,\n\t0x3005, 0x3007,\n\t0x3021, 0x302f,\n\t0x3031, 0x3035,\n\t0x3038, 0x303c,\n\t0x3041, 0x3096,\n\t0x3099, 0x309f,\n\t0x30a1, 0x30fa,\n\t0x30fc, 0x30ff,\n\t0x3105, 0x312d,\n\t0x3131, 0x318e,\n\t0x31a0, 0x31ba,\n\t0x31f0, 0x31ff,\n\t0x3400, 0x4db5,\n\t0x4e00, 0x9fcc,\n\t0xa000, 0xa48c,\n\t0xa4d0, 0xa4fd,\n\t0xa500, 0xa60c,\n\t0xa610, 0xa62b,\n\t0xa640, 0xa66f,\n\t0xa674, 0xa67d,\n\t0xa67f, 0xa697,\n\t0xa69f, 0xa6f1,\n\t0xa717, 0xa71f,\n\t0xa722, 0xa788,\n\t0xa78b, 0xa78e,\n\t0xa790, 0xa793,\n\t0xa7a0, 0xa7aa,\n\t0xa7f8, 0xa827,\n\t0xa840, 0xa873,\n\t0xa880, 0xa8c4,\n\t0xa8d0, 0xa8d9,\n\t0xa8e0, 0xa8f7,\n\t0xa8fb, 0xa8fb,\n\t0xa900, 0xa92d,\n\t0xa930, 0xa953,\n\t0xa960, 0xa97c,\n\t0xa980, 0xa9c0,\n\t0xa9cf, 0xa9d9,\n\t0xaa00, 0xaa36,\n\t0xaa40, 0xaa4d,\n\t0xaa50, 0xaa59,\n\t0xaa60, 0xaa76,\n\t0xaa7a, 0xaa7b,\n\t0xaa80, 0xaac2,\n\t0xaadb, 0xaadd,\n\t0xaae0, 0xaaef,\n\t0xaaf2, 0xaaf6,\n\t0xab01, 0xab06,\n\t0xab09, 0xab0e,\n\t0xab11, 0xab16,\n\t0xab20, 0xab26,\n\t0xab28, 0xab2e,\n\t0xabc0, 0xabea,\n\t0xabec, 0xabed,\n\t0xabf0, 0xabf9,\n\t0xac00, 0xd7a3,\n\t0xd7b0, 0xd7c6,\n\t0xd7cb, 0xd7fb,\n\t0xf900, 0xfa6d,\n\t0xfa70, 0xfad9,\n\t0xfb00, 0xfb06,\n\t0xfb13, 0xfb17,\n\t0xfb1d, 0xfb28,\n\t0xfb2a, 0xfb36,\n\t0xfb38, 0xfb3c,\n\t0xfb3e, 0xfb3e,\n\t0xfb40, 0xfb41,\n\t0xfb43, 0xfb44,\n\t0xfb46, 0xfbb1,\n\t0xfbd3, 0xfd3d,\n\t0xfd50, 0xfd8f,\n\t0xfd92, 0xfdc7,\n\t0xfdf0, 0xfdfb,\n\t0xfe00, 0xfe0f,\n\t0xfe20, 0xfe26,\n\t0xfe33, 0xfe34,\n\t0xfe4d, 0xfe4f,\n\t0xfe70, 0xfe74,\n\t0xfe76, 0xfefc,\n\t0xff10, 0xff19,\n\t0xff21, 0xff3a,\n\t0xff3f, 0xff3f,\n\t0xff41, 0xff5a,\n\t0xff66, 0xffbe,\n\t0xffc2, 0xffc7,\n\t0xffca, 0xffcf,\n\t0xffd2, 0xffd7,\n\t0xffda, 0xffdc,\n\t0x10000, 0x1000b,\n\t0x1000d, 0x10026,\n\t0x10028, 0x1003a,\n\t0x1003c, 0x1003d,\n\t0x1003f, 0x1004d,\n\t0x10050, 0x1005d,\n\t0x10080, 0x100fa,\n\t0x10140, 0x10174,\n\t0x101fd, 0x101fd,\n\t0x10280, 0x1029c,\n\t0x102a0, 0x102d0,\n\t0x10300, 0x1031e,\n\t0x10330, 0x1034a,\n\t0x10380, 0x1039d,\n\t0x103a0, 0x103c3,\n\t0x103c8, 0x103cf,\n\t0x103d1, 0x103d5,\n\t0x10400, 0x1049d,\n\t0x104a0, 0x104a9,\n\t0x10800, 0x10805,\n\t0x10808, 0x10808,\n\t0x1080a, 0x10835,\n\t0x10837, 0x10838,\n\t0x1083c, 0x1083c,\n\t0x1083f, 0x10855,\n\t0x10900, 0x10915,\n\t0x10920, 0x10939,\n\t0x10980, 0x109b7,\n\t0x109be, 0x109bf,\n\t0x10a00, 0x10a03,\n\t0x10a05, 0x10a06,\n\t0x10a0c, 0x10a13,\n\t0x10a15, 0x10a17,\n\t0x10a19, 0x10a33,\n\t0x10a38, 0x10a3a,\n\t0x10a3f, 0x10a3f,\n\t0x10a60, 0x10a7c,\n\t0x10b00, 0x10b35,\n\t0x10b40, 0x10b55,\n\t0x10b60, 0x10b72,\n\t0x10c00, 0x10c48,\n\t0x11000, 0x11046,\n\t0x11066, 0x1106f,\n\t0x11080, 0x110ba,\n\t0x110d0, 0x110e8,\n\t0x110f0, 0x110f9,\n\t0x11100, 0x11134,\n\t0x11136, 0x1113f,\n\t0x11180, 0x111c4,\n\t0x111d0, 0x111d9,\n\t0x11680, 0x116b7,\n\t0x116c0, 0x116c9,\n\t0x12000, 0x1236e,\n\t0x12400, 0x12462,\n\t0x13000, 0x1342e,\n\t0x16800, 0x16a38,\n\t0x16f00, 0x16f44,\n\t0x16f50, 0x16f7e,\n\t0x16f8f, 0x16f9f,\n\t0x1b000, 0x1b001,\n\t0x1d165, 0x1d169,\n\t0x1d16d, 0x1d172,\n\t0x1d17b, 0x1d182,\n\t0x1d185, 0x1d18b,\n\t0x1d1aa, 0x1d1ad,\n\t0x1d242, 0x1d244,\n\t0x1d400, 0x1d454,\n\t0x1d456, 0x1d49c,\n\t0x1d49e, 0x1d49f,\n\t0x1d4a2, 0x1d4a2,\n\t0x1d4a5, 0x1d4a6,\n\t0x1d4a9, 0x1d4ac,\n\t0x1d4ae, 0x1d4b9,\n\t0x1d4bb, 0x1d4bb,\n\t0x1d4bd, 0x1d4c3,\n\t0x1d4c5, 0x1d505,\n\t0x1d507, 0x1d50a,\n\t0x1d50d, 0x1d514,\n\t0x1d516, 0x1d51c,\n\t0x1d51e, 0x1d539,\n\t0x1d53b, 0x1d53e,\n\t0x1d540, 0x1d544,\n\t0x1d546, 0x1d546,\n\t0x1d54a, 0x1d550,\n\t0x1d552, 0x1d6a5,\n\t0x1d6a8, 0x1d6c0,\n\t0x1d6c2, 0x1d6da,\n\t0x1d6dc, 0x1d6fa,\n\t0x1d6fc, 0x1d714,\n\t0x1d716, 0x1d734,\n\t0x1d736, 0x1d74e,\n\t0x1d750, 0x1d76e,\n\t0x1d770, 0x1d788,\n\t0x1d78a, 0x1d7a8,\n\t0x1d7aa, 0x1d7c2,\n\t0x1d7c4, 0x1d7cb,\n\t0x1d7ce, 0x1d7ff,\n\t0x1ee00, 0x1ee03,\n\t0x1ee05, 0x1ee1f,\n\t0x1ee21, 0x1ee22,\n\t0x1ee24, 0x1ee24,\n\t0x1ee27, 0x1ee27,\n\t0x1ee29, 0x1ee32,\n\t0x1ee34, 0x1ee37,\n\t0x1ee39, 0x1ee39,\n\t0x1ee3b, 0x1ee3b,\n\t0x1ee42, 0x1ee42,\n\t0x1ee47, 0x1ee47,\n\t0x1ee49, 0x1ee49,\n\t0x1ee4b, 0x1ee4b,\n\t0x1ee4d, 0x1ee4f,\n\t0x1ee51, 0x1ee52,\n\t0x1ee54, 0x1ee54,\n\t0x1ee57, 0x1ee57,\n\t0x1ee59, 0x1ee59,\n\t0x1ee5b, 0x1ee5b,\n\t0x1ee5d, 0x1ee5d,\n\t0x1ee5f, 0x1ee5f,\n\t0x1ee61, 0x1ee62,\n\t0x1ee64, 0x1ee64,\n\t0x1ee67, 0x1ee6a,\n\t0x1ee6c, 0x1ee72,\n\t0x1ee74, 0x1ee77,\n\t0x1ee79, 0x1ee7c,\n\t0x1ee7e, 0x1ee7e,\n\t0x1ee80, 0x1ee89,\n\t0x1ee8b, 0x1ee9b,\n\t0x1eea1, 0x1eea3,\n\t0x1eea5, 0x1eea9,\n\t0x1eeab, 0x1eebb,\n\t0x20000, 0x2a6d6,\n\t0x2a700, 0x2b734,\n\t0x2b740, 0x2b81d,\n\t0x2f800, 0x2fa1d,\n\t0xe0100, 0xe01ef,\n}; /* CR_ID_Continue */\n\n/* 'XID_Start': Derived Property */\nstatic const OnigCodePoint CR_XID_Start[] = {\n\t495,\n\t0x0041, 0x005a,\n\t0x0061, 0x007a,\n\t0x00aa, 0x00aa,\n\t0x00b5, 0x00b5,\n\t0x00ba, 0x00ba,\n\t0x00c0, 0x00d6,\n\t0x00d8, 0x00f6,\n\t0x00f8, 0x02c1,\n\t0x02c6, 0x02d1,\n\t0x02e0, 0x02e4,\n\t0x02ec, 0x02ec,\n\t0x02ee, 0x02ee,\n\t0x0370, 0x0374,\n\t0x0376, 0x0377,\n\t0x037b, 0x037d,\n\t0x0386, 0x0386,\n\t0x0388, 0x038a,\n\t0x038c, 0x038c,\n\t0x038e, 0x03a1,\n\t0x03a3, 0x03f5,\n\t0x03f7, 0x0481,\n\t0x048a, 0x0527,\n\t0x0531, 0x0556,\n\t0x0559, 0x0559,\n\t0x0561, 0x0587,\n\t0x05d0, 0x05ea,\n\t0x05f0, 0x05f2,\n\t0x0620, 0x064a,\n\t0x066e, 0x066f,\n\t0x0671, 0x06d3,\n\t0x06d5, 0x06d5,\n\t0x06e5, 0x06e6,\n\t0x06ee, 0x06ef,\n\t0x06fa, 0x06fc,\n\t0x06ff, 0x06ff,\n\t0x0710, 0x0710,\n\t0x0712, 0x072f,\n\t0x074d, 0x07a5,\n\t0x07b1, 0x07b1,\n\t0x07ca, 0x07ea,\n\t0x07f4, 0x07f5,\n\t0x07fa, 0x07fa,\n\t0x0800, 0x0815,\n\t0x081a, 0x081a,\n\t0x0824, 0x0824,\n\t0x0828, 0x0828,\n\t0x0840, 0x0858,\n\t0x08a0, 0x08a0,\n\t0x08a2, 0x08ac,\n\t0x0904, 0x0939,\n\t0x093d, 0x093d,\n\t0x0950, 0x0950,\n\t0x0958, 0x0961,\n\t0x0971, 0x0977,\n\t0x0979, 0x097f,\n\t0x0985, 0x098c,\n\t0x098f, 0x0990,\n\t0x0993, 0x09a8,\n\t0x09aa, 0x09b0,\n\t0x09b2, 0x09b2,\n\t0x09b6, 0x09b9,\n\t0x09bd, 0x09bd,\n\t0x09ce, 0x09ce,\n\t0x09dc, 0x09dd,\n\t0x09df, 0x09e1,\n\t0x09f0, 0x09f1,\n\t0x0a05, 0x0a0a,\n\t0x0a0f, 0x0a10,\n\t0x0a13, 0x0a28,\n\t0x0a2a, 0x0a30,\n\t0x0a32, 0x0a33,\n\t0x0a35, 0x0a36,\n\t0x0a38, 0x0a39,\n\t0x0a59, 0x0a5c,\n\t0x0a5e, 0x0a5e,\n\t0x0a72, 0x0a74,\n\t0x0a85, 0x0a8d,\n\t0x0a8f, 0x0a91,\n\t0x0a93, 0x0aa8,\n\t0x0aaa, 0x0ab0,\n\t0x0ab2, 0x0ab3,\n\t0x0ab5, 0x0ab9,\n\t0x0abd, 0x0abd,\n\t0x0ad0, 0x0ad0,\n\t0x0ae0, 0x0ae1,\n\t0x0b05, 0x0b0c,\n\t0x0b0f, 0x0b10,\n\t0x0b13, 0x0b28,\n\t0x0b2a, 0x0b30,\n\t0x0b32, 0x0b33,\n\t0x0b35, 0x0b39,\n\t0x0b3d, 0x0b3d,\n\t0x0b5c, 0x0b5d,\n\t0x0b5f, 0x0b61,\n\t0x0b71, 0x0b71,\n\t0x0b83, 0x0b83,\n\t0x0b85, 0x0b8a,\n\t0x0b8e, 0x0b90,\n\t0x0b92, 0x0b95,\n\t0x0b99, 0x0b9a,\n\t0x0b9c, 0x0b9c,\n\t0x0b9e, 0x0b9f,\n\t0x0ba3, 0x0ba4,\n\t0x0ba8, 0x0baa,\n\t0x0bae, 0x0bb9,\n\t0x0bd0, 0x0bd0,\n\t0x0c05, 0x0c0c,\n\t0x0c0e, 0x0c10,\n\t0x0c12, 0x0c28,\n\t0x0c2a, 0x0c33,\n\t0x0c35, 0x0c39,\n\t0x0c3d, 0x0c3d,\n\t0x0c58, 0x0c59,\n\t0x0c60, 0x0c61,\n\t0x0c85, 0x0c8c,\n\t0x0c8e, 0x0c90,\n\t0x0c92, 0x0ca8,\n\t0x0caa, 0x0cb3,\n\t0x0cb5, 0x0cb9,\n\t0x0cbd, 0x0cbd,\n\t0x0cde, 0x0cde,\n\t0x0ce0, 0x0ce1,\n\t0x0cf1, 0x0cf2,\n\t0x0d05, 0x0d0c,\n\t0x0d0e, 0x0d10,\n\t0x0d12, 0x0d3a,\n\t0x0d3d, 0x0d3d,\n\t0x0d4e, 0x0d4e,\n\t0x0d60, 0x0d61,\n\t0x0d7a, 0x0d7f,\n\t0x0d85, 0x0d96,\n\t0x0d9a, 0x0db1,\n\t0x0db3, 0x0dbb,\n\t0x0dbd, 0x0dbd,\n\t0x0dc0, 0x0dc6,\n\t0x0e01, 0x0e30,\n\t0x0e32, 0x0e32,\n\t0x0e40, 0x0e46,\n\t0x0e81, 0x0e82,\n\t0x0e84, 0x0e84,\n\t0x0e87, 0x0e88,\n\t0x0e8a, 0x0e8a,\n\t0x0e8d, 0x0e8d,\n\t0x0e94, 0x0e97,\n\t0x0e99, 0x0e9f,\n\t0x0ea1, 0x0ea3,\n\t0x0ea5, 0x0ea5,\n\t0x0ea7, 0x0ea7,\n\t0x0eaa, 0x0eab,\n\t0x0ead, 0x0eb0,\n\t0x0eb2, 0x0eb2,\n\t0x0ebd, 0x0ebd,\n\t0x0ec0, 0x0ec4,\n\t0x0ec6, 0x0ec6,\n\t0x0edc, 0x0edf,\n\t0x0f00, 0x0f00,\n\t0x0f40, 0x0f47,\n\t0x0f49, 0x0f6c,\n\t0x0f88, 0x0f8c,\n\t0x1000, 0x102a,\n\t0x103f, 0x103f,\n\t0x1050, 0x1055,\n\t0x105a, 0x105d,\n\t0x1061, 0x1061,\n\t0x1065, 0x1066,\n\t0x106e, 0x1070,\n\t0x1075, 0x1081,\n\t0x108e, 0x108e,\n\t0x10a0, 0x10c5,\n\t0x10c7, 0x10c7,\n\t0x10cd, 0x10cd,\n\t0x10d0, 0x10fa,\n\t0x10fc, 0x1248,\n\t0x124a, 0x124d,\n\t0x1250, 0x1256,\n\t0x1258, 0x1258,\n\t0x125a, 0x125d,\n\t0x1260, 0x1288,\n\t0x128a, 0x128d,\n\t0x1290, 0x12b0,\n\t0x12b2, 0x12b5,\n\t0x12b8, 0x12be,\n\t0x12c0, 0x12c0,\n\t0x12c2, 0x12c5,\n\t0x12c8, 0x12d6,\n\t0x12d8, 0x1310,\n\t0x1312, 0x1315,\n\t0x1318, 0x135a,\n\t0x1380, 0x138f,\n\t0x13a0, 0x13f4,\n\t0x1401, 0x166c,\n\t0x166f, 0x167f,\n\t0x1681, 0x169a,\n\t0x16a0, 0x16ea,\n\t0x16ee, 0x16f0,\n\t0x1700, 0x170c,\n\t0x170e, 0x1711,\n\t0x1720, 0x1731,\n\t0x1740, 0x1751,\n\t0x1760, 0x176c,\n\t0x176e, 0x1770,\n\t0x1780, 0x17b3,\n\t0x17d7, 0x17d7,\n\t0x17dc, 0x17dc,\n\t0x1820, 0x1877,\n\t0x1880, 0x18a8,\n\t0x18aa, 0x18aa,\n\t0x18b0, 0x18f5,\n\t0x1900, 0x191c,\n\t0x1950, 0x196d,\n\t0x1970, 0x1974,\n\t0x1980, 0x19ab,\n\t0x19c1, 0x19c7,\n\t0x1a00, 0x1a16,\n\t0x1a20, 0x1a54,\n\t0x1aa7, 0x1aa7,\n\t0x1b05, 0x1b33,\n\t0x1b45, 0x1b4b,\n\t0x1b83, 0x1ba0,\n\t0x1bae, 0x1baf,\n\t0x1bba, 0x1be5,\n\t0x1c00, 0x1c23,\n\t0x1c4d, 0x1c4f,\n\t0x1c5a, 0x1c7d,\n\t0x1ce9, 0x1cec,\n\t0x1cee, 0x1cf1,\n\t0x1cf5, 0x1cf6,\n\t0x1d00, 0x1dbf,\n\t0x1e00, 0x1f15,\n\t0x1f18, 0x1f1d,\n\t0x1f20, 0x1f45,\n\t0x1f48, 0x1f4d,\n\t0x1f50, 0x1f57,\n\t0x1f59, 0x1f59,\n\t0x1f5b, 0x1f5b,\n\t0x1f5d, 0x1f5d,\n\t0x1f5f, 0x1f7d,\n\t0x1f80, 0x1fb4,\n\t0x1fb6, 0x1fbc,\n\t0x1fbe, 0x1fbe,\n\t0x1fc2, 0x1fc4,\n\t0x1fc6, 0x1fcc,\n\t0x1fd0, 0x1fd3,\n\t0x1fd6, 0x1fdb,\n\t0x1fe0, 0x1fec,\n\t0x1ff2, 0x1ff4,\n\t0x1ff6, 0x1ffc,\n\t0x2071, 0x2071,\n\t0x207f, 0x207f,\n\t0x2090, 0x209c,\n\t0x2102, 0x2102,\n\t0x2107, 0x2107,\n\t0x210a, 0x2113,\n\t0x2115, 0x2115,\n\t0x2118, 0x211d,\n\t0x2124, 0x2124,\n\t0x2126, 0x2126,\n\t0x2128, 0x2128,\n\t0x212a, 0x2139,\n\t0x213c, 0x213f,\n\t0x2145, 0x2149,\n\t0x214e, 0x214e,\n\t0x2160, 0x2188,\n\t0x2c00, 0x2c2e,\n\t0x2c30, 0x2c5e,\n\t0x2c60, 0x2ce4,\n\t0x2ceb, 0x2cee,\n\t0x2cf2, 0x2cf3,\n\t0x2d00, 0x2d25,\n\t0x2d27, 0x2d27,\n\t0x2d2d, 0x2d2d,\n\t0x2d30, 0x2d67,\n\t0x2d6f, 0x2d6f,\n\t0x2d80, 0x2d96,\n\t0x2da0, 0x2da6,\n\t0x2da8, 0x2dae,\n\t0x2db0, 0x2db6,\n\t0x2db8, 0x2dbe,\n\t0x2dc0, 0x2dc6,\n\t0x2dc8, 0x2dce,\n\t0x2dd0, 0x2dd6,\n\t0x2dd8, 0x2dde,\n\t0x3005, 0x3007,\n\t0x3021, 0x3029,\n\t0x3031, 0x3035,\n\t0x3038, 0x303c,\n\t0x3041, 0x3096,\n\t0x309d, 0x309f,\n\t0x30a1, 0x30fa,\n\t0x30fc, 0x30ff,\n\t0x3105, 0x312d,\n\t0x3131, 0x318e,\n\t0x31a0, 0x31ba,\n\t0x31f0, 0x31ff,\n\t0x3400, 0x4db5,\n\t0x4e00, 0x9fcc,\n\t0xa000, 0xa48c,\n\t0xa4d0, 0xa4fd,\n\t0xa500, 0xa60c,\n\t0xa610, 0xa61f,\n\t0xa62a, 0xa62b,\n\t0xa640, 0xa66e,\n\t0xa67f, 0xa697,\n\t0xa6a0, 0xa6ef,\n\t0xa717, 0xa71f,\n\t0xa722, 0xa788,\n\t0xa78b, 0xa78e,\n\t0xa790, 0xa793,\n\t0xa7a0, 0xa7aa,\n\t0xa7f8, 0xa801,\n\t0xa803, 0xa805,\n\t0xa807, 0xa80a,\n\t0xa80c, 0xa822,\n\t0xa840, 0xa873,\n\t0xa882, 0xa8b3,\n\t0xa8f2, 0xa8f7,\n\t0xa8fb, 0xa8fb,\n\t0xa90a, 0xa925,\n\t0xa930, 0xa946,\n\t0xa960, 0xa97c,\n\t0xa984, 0xa9b2,\n\t0xa9cf, 0xa9cf,\n\t0xaa00, 0xaa28,\n\t0xaa40, 0xaa42,\n\t0xaa44, 0xaa4b,\n\t0xaa60, 0xaa76,\n\t0xaa7a, 0xaa7a,\n\t0xaa80, 0xaaaf,\n\t0xaab1, 0xaab1,\n\t0xaab5, 0xaab6,\n\t0xaab9, 0xaabd,\n\t0xaac0, 0xaac0,\n\t0xaac2, 0xaac2,\n\t0xaadb, 0xaadd,\n\t0xaae0, 0xaaea,\n\t0xaaf2, 0xaaf4,\n\t0xab01, 0xab06,\n\t0xab09, 0xab0e,\n\t0xab11, 0xab16,\n\t0xab20, 0xab26,\n\t0xab28, 0xab2e,\n\t0xabc0, 0xabe2,\n\t0xac00, 0xd7a3,\n\t0xd7b0, 0xd7c6,\n\t0xd7cb, 0xd7fb,\n\t0xf900, 0xfa6d,\n\t0xfa70, 0xfad9,\n\t0xfb00, 0xfb06,\n\t0xfb13, 0xfb17,\n\t0xfb1d, 0xfb1d,\n\t0xfb1f, 0xfb28,\n\t0xfb2a, 0xfb36,\n\t0xfb38, 0xfb3c,\n\t0xfb3e, 0xfb3e,\n\t0xfb40, 0xfb41,\n\t0xfb43, 0xfb44,\n\t0xfb46, 0xfbb1,\n\t0xfbd3, 0xfc5d,\n\t0xfc64, 0xfd3d,\n\t0xfd50, 0xfd8f,\n\t0xfd92, 0xfdc7,\n\t0xfdf0, 0xfdf9,\n\t0xfe71, 0xfe71,\n\t0xfe73, 0xfe73,\n\t0xfe77, 0xfe77,\n\t0xfe79, 0xfe79,\n\t0xfe7b, 0xfe7b,\n\t0xfe7d, 0xfe7d,\n\t0xfe7f, 0xfefc,\n\t0xff21, 0xff3a,\n\t0xff41, 0xff5a,\n\t0xff66, 0xff9d,\n\t0xffa0, 0xffbe,\n\t0xffc2, 0xffc7,\n\t0xffca, 0xffcf,\n\t0xffd2, 0xffd7,\n\t0xffda, 0xffdc,\n\t0x10000, 0x1000b,\n\t0x1000d, 0x10026,\n\t0x10028, 0x1003a,\n\t0x1003c, 0x1003d,\n\t0x1003f, 0x1004d,\n\t0x10050, 0x1005d,\n\t0x10080, 0x100fa,\n\t0x10140, 0x10174,\n\t0x10280, 0x1029c,\n\t0x102a0, 0x102d0,\n\t0x10300, 0x1031e,\n\t0x10330, 0x1034a,\n\t0x10380, 0x1039d,\n\t0x103a0, 0x103c3,\n\t0x103c8, 0x103cf,\n\t0x103d1, 0x103d5,\n\t0x10400, 0x1049d,\n\t0x10800, 0x10805,\n\t0x10808, 0x10808,\n\t0x1080a, 0x10835,\n\t0x10837, 0x10838,\n\t0x1083c, 0x1083c,\n\t0x1083f, 0x10855,\n\t0x10900, 0x10915,\n\t0x10920, 0x10939,\n\t0x10980, 0x109b7,\n\t0x109be, 0x109bf,\n\t0x10a00, 0x10a00,\n\t0x10a10, 0x10a13,\n\t0x10a15, 0x10a17,\n\t0x10a19, 0x10a33,\n\t0x10a60, 0x10a7c,\n\t0x10b00, 0x10b35,\n\t0x10b40, 0x10b55,\n\t0x10b60, 0x10b72,\n\t0x10c00, 0x10c48,\n\t0x11003, 0x11037,\n\t0x11083, 0x110af,\n\t0x110d0, 0x110e8,\n\t0x11103, 0x11126,\n\t0x11183, 0x111b2,\n\t0x111c1, 0x111c4,\n\t0x11680, 0x116aa,\n\t0x12000, 0x1236e,\n\t0x12400, 0x12462,\n\t0x13000, 0x1342e,\n\t0x16800, 0x16a38,\n\t0x16f00, 0x16f44,\n\t0x16f50, 0x16f50,\n\t0x16f93, 0x16f9f,\n\t0x1b000, 0x1b001,\n\t0x1d400, 0x1d454,\n\t0x1d456, 0x1d49c,\n\t0x1d49e, 0x1d49f,\n\t0x1d4a2, 0x1d4a2,\n\t0x1d4a5, 0x1d4a6,\n\t0x1d4a9, 0x1d4ac,\n\t0x1d4ae, 0x1d4b9,\n\t0x1d4bb, 0x1d4bb,\n\t0x1d4bd, 0x1d4c3,\n\t0x1d4c5, 0x1d505,\n\t0x1d507, 0x1d50a,\n\t0x1d50d, 0x1d514,\n\t0x1d516, 0x1d51c,\n\t0x1d51e, 0x1d539,\n\t0x1d53b, 0x1d53e,\n\t0x1d540, 0x1d544,\n\t0x1d546, 0x1d546,\n\t0x1d54a, 0x1d550,\n\t0x1d552, 0x1d6a5,\n\t0x1d6a8, 0x1d6c0,\n\t0x1d6c2, 0x1d6da,\n\t0x1d6dc, 0x1d6fa,\n\t0x1d6fc, 0x1d714,\n\t0x1d716, 0x1d734,\n\t0x1d736, 0x1d74e,\n\t0x1d750, 0x1d76e,\n\t0x1d770, 0x1d788,\n\t0x1d78a, 0x1d7a8,\n\t0x1d7aa, 0x1d7c2,\n\t0x1d7c4, 0x1d7cb,\n\t0x1ee00, 0x1ee03,\n\t0x1ee05, 0x1ee1f,\n\t0x1ee21, 0x1ee22,\n\t0x1ee24, 0x1ee24,\n\t0x1ee27, 0x1ee27,\n\t0x1ee29, 0x1ee32,\n\t0x1ee34, 0x1ee37,\n\t0x1ee39, 0x1ee39,\n\t0x1ee3b, 0x1ee3b,\n\t0x1ee42, 0x1ee42,\n\t0x1ee47, 0x1ee47,\n\t0x1ee49, 0x1ee49,\n\t0x1ee4b, 0x1ee4b,\n\t0x1ee4d, 0x1ee4f,\n\t0x1ee51, 0x1ee52,\n\t0x1ee54, 0x1ee54,\n\t0x1ee57, 0x1ee57,\n\t0x1ee59, 0x1ee59,\n\t0x1ee5b, 0x1ee5b,\n\t0x1ee5d, 0x1ee5d,\n\t0x1ee5f, 0x1ee5f,\n\t0x1ee61, 0x1ee62,\n\t0x1ee64, 0x1ee64,\n\t0x1ee67, 0x1ee6a,\n\t0x1ee6c, 0x1ee72,\n\t0x1ee74, 0x1ee77,\n\t0x1ee79, 0x1ee7c,\n\t0x1ee7e, 0x1ee7e,\n\t0x1ee80, 0x1ee89,\n\t0x1ee8b, 0x1ee9b,\n\t0x1eea1, 0x1eea3,\n\t0x1eea5, 0x1eea9,\n\t0x1eeab, 0x1eebb,\n\t0x20000, 0x2a6d6,\n\t0x2a700, 0x2b734,\n\t0x2b740, 0x2b81d,\n\t0x2f800, 0x2fa1d,\n}; /* CR_XID_Start */\n\n/* 'XID_Continue': Derived Property */\nstatic const OnigCodePoint CR_XID_Continue[] = {\n\t571,\n\t0x0030, 0x0039,\n\t0x0041, 0x005a,\n\t0x005f, 0x005f,\n\t0x0061, 0x007a,\n\t0x00aa, 0x00aa,\n\t0x00b5, 0x00b5,\n\t0x00b7, 0x00b7,\n\t0x00ba, 0x00ba,\n\t0x00c0, 0x00d6,\n\t0x00d8, 0x00f6,\n\t0x00f8, 0x02c1,\n\t0x02c6, 0x02d1,\n\t0x02e0, 0x02e4,\n\t0x02ec, 0x02ec,\n\t0x02ee, 0x02ee,\n\t0x0300, 0x0374,\n\t0x0376, 0x0377,\n\t0x037b, 0x037d,\n\t0x0386, 0x038a,\n\t0x038c, 0x038c,\n\t0x038e, 0x03a1,\n\t0x03a3, 0x03f5,\n\t0x03f7, 0x0481,\n\t0x0483, 0x0487,\n\t0x048a, 0x0527,\n\t0x0531, 0x0556,\n\t0x0559, 0x0559,\n\t0x0561, 0x0587,\n\t0x0591, 0x05bd,\n\t0x05bf, 0x05bf,\n\t0x05c1, 0x05c2,\n\t0x05c4, 0x05c5,\n\t0x05c7, 0x05c7,\n\t0x05d0, 0x05ea,\n\t0x05f0, 0x05f2,\n\t0x0610, 0x061a,\n\t0x0620, 0x0669,\n\t0x066e, 0x06d3,\n\t0x06d5, 0x06dc,\n\t0x06df, 0x06e8,\n\t0x06ea, 0x06fc,\n\t0x06ff, 0x06ff,\n\t0x0710, 0x074a,\n\t0x074d, 0x07b1,\n\t0x07c0, 0x07f5,\n\t0x07fa, 0x07fa,\n\t0x0800, 0x082d,\n\t0x0840, 0x085b,\n\t0x08a0, 0x08a0,\n\t0x08a2, 0x08ac,\n\t0x08e4, 0x08fe,\n\t0x0900, 0x0963,\n\t0x0966, 0x096f,\n\t0x0971, 0x0977,\n\t0x0979, 0x097f,\n\t0x0981, 0x0983,\n\t0x0985, 0x098c,\n\t0x098f, 0x0990,\n\t0x0993, 0x09a8,\n\t0x09aa, 0x09b0,\n\t0x09b2, 0x09b2,\n\t0x09b6, 0x09b9,\n\t0x09bc, 0x09c4,\n\t0x09c7, 0x09c8,\n\t0x09cb, 0x09ce,\n\t0x09d7, 0x09d7,\n\t0x09dc, 0x09dd,\n\t0x09df, 0x09e3,\n\t0x09e6, 0x09f1,\n\t0x0a01, 0x0a03,\n\t0x0a05, 0x0a0a,\n\t0x0a0f, 0x0a10,\n\t0x0a13, 0x0a28,\n\t0x0a2a, 0x0a30,\n\t0x0a32, 0x0a33,\n\t0x0a35, 0x0a36,\n\t0x0a38, 0x0a39,\n\t0x0a3c, 0x0a3c,\n\t0x0a3e, 0x0a42,\n\t0x0a47, 0x0a48,\n\t0x0a4b, 0x0a4d,\n\t0x0a51, 0x0a51,\n\t0x0a59, 0x0a5c,\n\t0x0a5e, 0x0a5e,\n\t0x0a66, 0x0a75,\n\t0x0a81, 0x0a83,\n\t0x0a85, 0x0a8d,\n\t0x0a8f, 0x0a91,\n\t0x0a93, 0x0aa8,\n\t0x0aaa, 0x0ab0,\n\t0x0ab2, 0x0ab3,\n\t0x0ab5, 0x0ab9,\n\t0x0abc, 0x0ac5,\n\t0x0ac7, 0x0ac9,\n\t0x0acb, 0x0acd,\n\t0x0ad0, 0x0ad0,\n\t0x0ae0, 0x0ae3,\n\t0x0ae6, 0x0aef,\n\t0x0b01, 0x0b03,\n\t0x0b05, 0x0b0c,\n\t0x0b0f, 0x0b10,\n\t0x0b13, 0x0b28,\n\t0x0b2a, 0x0b30,\n\t0x0b32, 0x0b33,\n\t0x0b35, 0x0b39,\n\t0x0b3c, 0x0b44,\n\t0x0b47, 0x0b48,\n\t0x0b4b, 0x0b4d,\n\t0x0b56, 0x0b57,\n\t0x0b5c, 0x0b5d,\n\t0x0b5f, 0x0b63,\n\t0x0b66, 0x0b6f,\n\t0x0b71, 0x0b71,\n\t0x0b82, 0x0b83,\n\t0x0b85, 0x0b8a,\n\t0x0b8e, 0x0b90,\n\t0x0b92, 0x0b95,\n\t0x0b99, 0x0b9a,\n\t0x0b9c, 0x0b9c,\n\t0x0b9e, 0x0b9f,\n\t0x0ba3, 0x0ba4,\n\t0x0ba8, 0x0baa,\n\t0x0bae, 0x0bb9,\n\t0x0bbe, 0x0bc2,\n\t0x0bc6, 0x0bc8,\n\t0x0bca, 0x0bcd,\n\t0x0bd0, 0x0bd0,\n\t0x0bd7, 0x0bd7,\n\t0x0be6, 0x0bef,\n\t0x0c01, 0x0c03,\n\t0x0c05, 0x0c0c,\n\t0x0c0e, 0x0c10,\n\t0x0c12, 0x0c28,\n\t0x0c2a, 0x0c33,\n\t0x0c35, 0x0c39,\n\t0x0c3d, 0x0c44,\n\t0x0c46, 0x0c48,\n\t0x0c4a, 0x0c4d,\n\t0x0c55, 0x0c56,\n\t0x0c58, 0x0c59,\n\t0x0c60, 0x0c63,\n\t0x0c66, 0x0c6f,\n\t0x0c82, 0x0c83,\n\t0x0c85, 0x0c8c,\n\t0x0c8e, 0x0c90,\n\t0x0c92, 0x0ca8,\n\t0x0caa, 0x0cb3,\n\t0x0cb5, 0x0cb9,\n\t0x0cbc, 0x0cc4,\n\t0x0cc6, 0x0cc8,\n\t0x0cca, 0x0ccd,\n\t0x0cd5, 0x0cd6,\n\t0x0cde, 0x0cde,\n\t0x0ce0, 0x0ce3,\n\t0x0ce6, 0x0cef,\n\t0x0cf1, 0x0cf2,\n\t0x0d02, 0x0d03,\n\t0x0d05, 0x0d0c,\n\t0x0d0e, 0x0d10,\n\t0x0d12, 0x0d3a,\n\t0x0d3d, 0x0d44,\n\t0x0d46, 0x0d48,\n\t0x0d4a, 0x0d4e,\n\t0x0d57, 0x0d57,\n\t0x0d60, 0x0d63,\n\t0x0d66, 0x0d6f,\n\t0x0d7a, 0x0d7f,\n\t0x0d82, 0x0d83,\n\t0x0d85, 0x0d96,\n\t0x0d9a, 0x0db1,\n\t0x0db3, 0x0dbb,\n\t0x0dbd, 0x0dbd,\n\t0x0dc0, 0x0dc6,\n\t0x0dca, 0x0dca,\n\t0x0dcf, 0x0dd4,\n\t0x0dd6, 0x0dd6,\n\t0x0dd8, 0x0ddf,\n\t0x0df2, 0x0df3,\n\t0x0e01, 0x0e3a,\n\t0x0e40, 0x0e4e,\n\t0x0e50, 0x0e59,\n\t0x0e81, 0x0e82,\n\t0x0e84, 0x0e84,\n\t0x0e87, 0x0e88,\n\t0x0e8a, 0x0e8a,\n\t0x0e8d, 0x0e8d,\n\t0x0e94, 0x0e97,\n\t0x0e99, 0x0e9f,\n\t0x0ea1, 0x0ea3,\n\t0x0ea5, 0x0ea5,\n\t0x0ea7, 0x0ea7,\n\t0x0eaa, 0x0eab,\n\t0x0ead, 0x0eb9,\n\t0x0ebb, 0x0ebd,\n\t0x0ec0, 0x0ec4,\n\t0x0ec6, 0x0ec6,\n\t0x0ec8, 0x0ecd,\n\t0x0ed0, 0x0ed9,\n\t0x0edc, 0x0edf,\n\t0x0f00, 0x0f00,\n\t0x0f18, 0x0f19,\n\t0x0f20, 0x0f29,\n\t0x0f35, 0x0f35,\n\t0x0f37, 0x0f37,\n\t0x0f39, 0x0f39,\n\t0x0f3e, 0x0f47,\n\t0x0f49, 0x0f6c,\n\t0x0f71, 0x0f84,\n\t0x0f86, 0x0f97,\n\t0x0f99, 0x0fbc,\n\t0x0fc6, 0x0fc6,\n\t0x1000, 0x1049,\n\t0x1050, 0x109d,\n\t0x10a0, 0x10c5,\n\t0x10c7, 0x10c7,\n\t0x10cd, 0x10cd,\n\t0x10d0, 0x10fa,\n\t0x10fc, 0x1248,\n\t0x124a, 0x124d,\n\t0x1250, 0x1256,\n\t0x1258, 0x1258,\n\t0x125a, 0x125d,\n\t0x1260, 0x1288,\n\t0x128a, 0x128d,\n\t0x1290, 0x12b0,\n\t0x12b2, 0x12b5,\n\t0x12b8, 0x12be,\n\t0x12c0, 0x12c0,\n\t0x12c2, 0x12c5,\n\t0x12c8, 0x12d6,\n\t0x12d8, 0x1310,\n\t0x1312, 0x1315,\n\t0x1318, 0x135a,\n\t0x135d, 0x135f,\n\t0x1369, 0x1371,\n\t0x1380, 0x138f,\n\t0x13a0, 0x13f4,\n\t0x1401, 0x166c,\n\t0x166f, 0x167f,\n\t0x1681, 0x169a,\n\t0x16a0, 0x16ea,\n\t0x16ee, 0x16f0,\n\t0x1700, 0x170c,\n\t0x170e, 0x1714,\n\t0x1720, 0x1734,\n\t0x1740, 0x1753,\n\t0x1760, 0x176c,\n\t0x176e, 0x1770,\n\t0x1772, 0x1773,\n\t0x1780, 0x17d3,\n\t0x17d7, 0x17d7,\n\t0x17dc, 0x17dd,\n\t0x17e0, 0x17e9,\n\t0x180b, 0x180d,\n\t0x1810, 0x1819,\n\t0x1820, 0x1877,\n\t0x1880, 0x18aa,\n\t0x18b0, 0x18f5,\n\t0x1900, 0x191c,\n\t0x1920, 0x192b,\n\t0x1930, 0x193b,\n\t0x1946, 0x196d,\n\t0x1970, 0x1974,\n\t0x1980, 0x19ab,\n\t0x19b0, 0x19c9,\n\t0x19d0, 0x19da,\n\t0x1a00, 0x1a1b,\n\t0x1a20, 0x1a5e,\n\t0x1a60, 0x1a7c,\n\t0x1a7f, 0x1a89,\n\t0x1a90, 0x1a99,\n\t0x1aa7, 0x1aa7,\n\t0x1b00, 0x1b4b,\n\t0x1b50, 0x1b59,\n\t0x1b6b, 0x1b73,\n\t0x1b80, 0x1bf3,\n\t0x1c00, 0x1c37,\n\t0x1c40, 0x1c49,\n\t0x1c4d, 0x1c7d,\n\t0x1cd0, 0x1cd2,\n\t0x1cd4, 0x1cf6,\n\t0x1d00, 0x1de6,\n\t0x1dfc, 0x1f15,\n\t0x1f18, 0x1f1d,\n\t0x1f20, 0x1f45,\n\t0x1f48, 0x1f4d,\n\t0x1f50, 0x1f57,\n\t0x1f59, 0x1f59,\n\t0x1f5b, 0x1f5b,\n\t0x1f5d, 0x1f5d,\n\t0x1f5f, 0x1f7d,\n\t0x1f80, 0x1fb4,\n\t0x1fb6, 0x1fbc,\n\t0x1fbe, 0x1fbe,\n\t0x1fc2, 0x1fc4,\n\t0x1fc6, 0x1fcc,\n\t0x1fd0, 0x1fd3,\n\t0x1fd6, 0x1fdb,\n\t0x1fe0, 0x1fec,\n\t0x1ff2, 0x1ff4,\n\t0x1ff6, 0x1ffc,\n\t0x203f, 0x2040,\n\t0x2054, 0x2054,\n\t0x2071, 0x2071,\n\t0x207f, 0x207f,\n\t0x2090, 0x209c,\n\t0x20d0, 0x20dc,\n\t0x20e1, 0x20e1,\n\t0x20e5, 0x20f0,\n\t0x2102, 0x2102,\n\t0x2107, 0x2107,\n\t0x210a, 0x2113,\n\t0x2115, 0x2115,\n\t0x2118, 0x211d,\n\t0x2124, 0x2124,\n\t0x2126, 0x2126,\n\t0x2128, 0x2128,\n\t0x212a, 0x2139,\n\t0x213c, 0x213f,\n\t0x2145, 0x2149,\n\t0x214e, 0x214e,\n\t0x2160, 0x2188,\n\t0x2c00, 0x2c2e,\n\t0x2c30, 0x2c5e,\n\t0x2c60, 0x2ce4,\n\t0x2ceb, 0x2cf3,\n\t0x2d00, 0x2d25,\n\t0x2d27, 0x2d27,\n\t0x2d2d, 0x2d2d,\n\t0x2d30, 0x2d67,\n\t0x2d6f, 0x2d6f,\n\t0x2d7f, 0x2d96,\n\t0x2da0, 0x2da6,\n\t0x2da8, 0x2dae,\n\t0x2db0, 0x2db6,\n\t0x2db8, 0x2dbe,\n\t0x2dc0, 0x2dc6,\n\t0x2dc8, 0x2dce,\n\t0x2dd0, 0x2dd6,\n\t0x2dd8, 0x2dde,\n\t0x2de0, 0x2dff,\n\t0x3005, 0x3007,\n\t0x3021, 0x302f,\n\t0x3031, 0x3035,\n\t0x3038, 0x303c,\n\t0x3041, 0x3096,\n\t0x3099, 0x309a,\n\t0x309d, 0x309f,\n\t0x30a1, 0x30fa,\n\t0x30fc, 0x30ff,\n\t0x3105, 0x312d,\n\t0x3131, 0x318e,\n\t0x31a0, 0x31ba,\n\t0x31f0, 0x31ff,\n\t0x3400, 0x4db5,\n\t0x4e00, 0x9fcc,\n\t0xa000, 0xa48c,\n\t0xa4d0, 0xa4fd,\n\t0xa500, 0xa60c,\n\t0xa610, 0xa62b,\n\t0xa640, 0xa66f,\n\t0xa674, 0xa67d,\n\t0xa67f, 0xa697,\n\t0xa69f, 0xa6f1,\n\t0xa717, 0xa71f,\n\t0xa722, 0xa788,\n\t0xa78b, 0xa78e,\n\t0xa790, 0xa793,\n\t0xa7a0, 0xa7aa,\n\t0xa7f8, 0xa827,\n\t0xa840, 0xa873,\n\t0xa880, 0xa8c4,\n\t0xa8d0, 0xa8d9,\n\t0xa8e0, 0xa8f7,\n\t0xa8fb, 0xa8fb,\n\t0xa900, 0xa92d,\n\t0xa930, 0xa953,\n\t0xa960, 0xa97c,\n\t0xa980, 0xa9c0,\n\t0xa9cf, 0xa9d9,\n\t0xaa00, 0xaa36,\n\t0xaa40, 0xaa4d,\n\t0xaa50, 0xaa59,\n\t0xaa60, 0xaa76,\n\t0xaa7a, 0xaa7b,\n\t0xaa80, 0xaac2,\n\t0xaadb, 0xaadd,\n\t0xaae0, 0xaaef,\n\t0xaaf2, 0xaaf6,\n\t0xab01, 0xab06,\n\t0xab09, 0xab0e,\n\t0xab11, 0xab16,\n\t0xab20, 0xab26,\n\t0xab28, 0xab2e,\n\t0xabc0, 0xabea,\n\t0xabec, 0xabed,\n\t0xabf0, 0xabf9,\n\t0xac00, 0xd7a3,\n\t0xd7b0, 0xd7c6,\n\t0xd7cb, 0xd7fb,\n\t0xf900, 0xfa6d,\n\t0xfa70, 0xfad9,\n\t0xfb00, 0xfb06,\n\t0xfb13, 0xfb17,\n\t0xfb1d, 0xfb28,\n\t0xfb2a, 0xfb36,\n\t0xfb38, 0xfb3c,\n\t0xfb3e, 0xfb3e,\n\t0xfb40, 0xfb41,\n\t0xfb43, 0xfb44,\n\t0xfb46, 0xfbb1,\n\t0xfbd3, 0xfc5d,\n\t0xfc64, 0xfd3d,\n\t0xfd50, 0xfd8f,\n\t0xfd92, 0xfdc7,\n\t0xfdf0, 0xfdf9,\n\t0xfe00, 0xfe0f,\n\t0xfe20, 0xfe26,\n\t0xfe33, 0xfe34,\n\t0xfe4d, 0xfe4f,\n\t0xfe71, 0xfe71,\n\t0xfe73, 0xfe73,\n\t0xfe77, 0xfe77,\n\t0xfe79, 0xfe79,\n\t0xfe7b, 0xfe7b,\n\t0xfe7d, 0xfe7d,\n\t0xfe7f, 0xfefc,\n\t0xff10, 0xff19,\n\t0xff21, 0xff3a,\n\t0xff3f, 0xff3f,\n\t0xff41, 0xff5a,\n\t0xff66, 0xffbe,\n\t0xffc2, 0xffc7,\n\t0xffca, 0xffcf,\n\t0xffd2, 0xffd7,\n\t0xffda, 0xffdc,\n\t0x10000, 0x1000b,\n\t0x1000d, 0x10026,\n\t0x10028, 0x1003a,\n\t0x1003c, 0x1003d,\n\t0x1003f, 0x1004d,\n\t0x10050, 0x1005d,\n\t0x10080, 0x100fa,\n\t0x10140, 0x10174,\n\t0x101fd, 0x101fd,\n\t0x10280, 0x1029c,\n\t0x102a0, 0x102d0,\n\t0x10300, 0x1031e,\n\t0x10330, 0x1034a,\n\t0x10380, 0x1039d,\n\t0x103a0, 0x103c3,\n\t0x103c8, 0x103cf,\n\t0x103d1, 0x103d5,\n\t0x10400, 0x1049d,\n\t0x104a0, 0x104a9,\n\t0x10800, 0x10805,\n\t0x10808, 0x10808,\n\t0x1080a, 0x10835,\n\t0x10837, 0x10838,\n\t0x1083c, 0x1083c,\n\t0x1083f, 0x10855,\n\t0x10900, 0x10915,\n\t0x10920, 0x10939,\n\t0x10980, 0x109b7,\n\t0x109be, 0x109bf,\n\t0x10a00, 0x10a03,\n\t0x10a05, 0x10a06,\n\t0x10a0c, 0x10a13,\n\t0x10a15, 0x10a17,\n\t0x10a19, 0x10a33,\n\t0x10a38, 0x10a3a,\n\t0x10a3f, 0x10a3f,\n\t0x10a60, 0x10a7c,\n\t0x10b00, 0x10b35,\n\t0x10b40, 0x10b55,\n\t0x10b60, 0x10b72,\n\t0x10c00, 0x10c48,\n\t0x11000, 0x11046,\n\t0x11066, 0x1106f,\n\t0x11080, 0x110ba,\n\t0x110d0, 0x110e8,\n\t0x110f0, 0x110f9,\n\t0x11100, 0x11134,\n\t0x11136, 0x1113f,\n\t0x11180, 0x111c4,\n\t0x111d0, 0x111d9,\n\t0x11680, 0x116b7,\n\t0x116c0, 0x116c9,\n\t0x12000, 0x1236e,\n\t0x12400, 0x12462,\n\t0x13000, 0x1342e,\n\t0x16800, 0x16a38,\n\t0x16f00, 0x16f44,\n\t0x16f50, 0x16f7e,\n\t0x16f8f, 0x16f9f,\n\t0x1b000, 0x1b001,\n\t0x1d165, 0x1d169,\n\t0x1d16d, 0x1d172,\n\t0x1d17b, 0x1d182,\n\t0x1d185, 0x1d18b,\n\t0x1d1aa, 0x1d1ad,\n\t0x1d242, 0x1d244,\n\t0x1d400, 0x1d454,\n\t0x1d456, 0x1d49c,\n\t0x1d49e, 0x1d49f,\n\t0x1d4a2, 0x1d4a2,\n\t0x1d4a5, 0x1d4a6,\n\t0x1d4a9, 0x1d4ac,\n\t0x1d4ae, 0x1d4b9,\n\t0x1d4bb, 0x1d4bb,\n\t0x1d4bd, 0x1d4c3,\n\t0x1d4c5, 0x1d505,\n\t0x1d507, 0x1d50a,\n\t0x1d50d, 0x1d514,\n\t0x1d516, 0x1d51c,\n\t0x1d51e, 0x1d539,\n\t0x1d53b, 0x1d53e,\n\t0x1d540, 0x1d544,\n\t0x1d546, 0x1d546,\n\t0x1d54a, 0x1d550,\n\t0x1d552, 0x1d6a5,\n\t0x1d6a8, 0x1d6c0,\n\t0x1d6c2, 0x1d6da,\n\t0x1d6dc, 0x1d6fa,\n\t0x1d6fc, 0x1d714,\n\t0x1d716, 0x1d734,\n\t0x1d736, 0x1d74e,\n\t0x1d750, 0x1d76e,\n\t0x1d770, 0x1d788,\n\t0x1d78a, 0x1d7a8,\n\t0x1d7aa, 0x1d7c2,\n\t0x1d7c4, 0x1d7cb,\n\t0x1d7ce, 0x1d7ff,\n\t0x1ee00, 0x1ee03,\n\t0x1ee05, 0x1ee1f,\n\t0x1ee21, 0x1ee22,\n\t0x1ee24, 0x1ee24,\n\t0x1ee27, 0x1ee27,\n\t0x1ee29, 0x1ee32,\n\t0x1ee34, 0x1ee37,\n\t0x1ee39, 0x1ee39,\n\t0x1ee3b, 0x1ee3b,\n\t0x1ee42, 0x1ee42,\n\t0x1ee47, 0x1ee47,\n\t0x1ee49, 0x1ee49,\n\t0x1ee4b, 0x1ee4b,\n\t0x1ee4d, 0x1ee4f,\n\t0x1ee51, 0x1ee52,\n\t0x1ee54, 0x1ee54,\n\t0x1ee57, 0x1ee57,\n\t0x1ee59, 0x1ee59,\n\t0x1ee5b, 0x1ee5b,\n\t0x1ee5d, 0x1ee5d,\n\t0x1ee5f, 0x1ee5f,\n\t0x1ee61, 0x1ee62,\n\t0x1ee64, 0x1ee64,\n\t0x1ee67, 0x1ee6a,\n\t0x1ee6c, 0x1ee72,\n\t0x1ee74, 0x1ee77,\n\t0x1ee79, 0x1ee7c,\n\t0x1ee7e, 0x1ee7e,\n\t0x1ee80, 0x1ee89,\n\t0x1ee8b, 0x1ee9b,\n\t0x1eea1, 0x1eea3,\n\t0x1eea5, 0x1eea9,\n\t0x1eeab, 0x1eebb,\n\t0x20000, 0x2a6d6,\n\t0x2a700, 0x2b734,\n\t0x2b740, 0x2b81d,\n\t0x2f800, 0x2fa1d,\n\t0xe0100, 0xe01ef,\n}; /* CR_XID_Continue */\n\n/* 'Default_Ignorable_Code_Point': Derived Property */\nstatic const OnigCodePoint CR_Default_Ignorable_Code_Point[] = {\n\t15,\n\t0x00ad, 0x00ad,\n\t0x034f, 0x034f,\n\t0x115f, 0x1160,\n\t0x17b4, 0x17b5,\n\t0x180b, 0x180d,\n\t0x200b, 0x200f,\n\t0x202a, 0x202e,\n\t0x2060, 0x206f,\n\t0x3164, 0x3164,\n\t0xfe00, 0xfe0f,\n\t0xfeff, 0xfeff,\n\t0xffa0, 0xffa0,\n\t0xfff0, 0xfff8,\n\t0x1d173, 0x1d17a,\n\t0xe0000, 0xe0fff,\n}; /* CR_Default_Ignorable_Code_Point */\n\n/* 'Grapheme_Extend': Derived Property */\nstatic const OnigCodePoint CR_Grapheme_Extend[] = {\n\t232,\n\t0x0300, 0x036f,\n\t0x0483, 0x0489,\n\t0x0591, 0x05bd,\n\t0x05bf, 0x05bf,\n\t0x05c1, 0x05c2,\n\t0x05c4, 0x05c5,\n\t0x05c7, 0x05c7,\n\t0x0610, 0x061a,\n\t0x064b, 0x065f,\n\t0x0670, 0x0670,\n\t0x06d6, 0x06dc,\n\t0x06df, 0x06e4,\n\t0x06e7, 0x06e8,\n\t0x06ea, 0x06ed,\n\t0x0711, 0x0711,\n\t0x0730, 0x074a,\n\t0x07a6, 0x07b0,\n\t0x07eb, 0x07f3,\n\t0x0816, 0x0819,\n\t0x081b, 0x0823,\n\t0x0825, 0x0827,\n\t0x0829, 0x082d,\n\t0x0859, 0x085b,\n\t0x08e4, 0x08fe,\n\t0x0900, 0x0902,\n\t0x093a, 0x093a,\n\t0x093c, 0x093c,\n\t0x0941, 0x0948,\n\t0x094d, 0x094d,\n\t0x0951, 0x0957,\n\t0x0962, 0x0963,\n\t0x0981, 0x0981,\n\t0x09bc, 0x09bc,\n\t0x09be, 0x09be,\n\t0x09c1, 0x09c4,\n\t0x09cd, 0x09cd,\n\t0x09d7, 0x09d7,\n\t0x09e2, 0x09e3,\n\t0x0a01, 0x0a02,\n\t0x0a3c, 0x0a3c,\n\t0x0a41, 0x0a42,\n\t0x0a47, 0x0a48,\n\t0x0a4b, 0x0a4d,\n\t0x0a51, 0x0a51,\n\t0x0a70, 0x0a71,\n\t0x0a75, 0x0a75,\n\t0x0a81, 0x0a82,\n\t0x0abc, 0x0abc,\n\t0x0ac1, 0x0ac5,\n\t0x0ac7, 0x0ac8,\n\t0x0acd, 0x0acd,\n\t0x0ae2, 0x0ae3,\n\t0x0b01, 0x0b01,\n\t0x0b3c, 0x0b3c,\n\t0x0b3e, 0x0b3f,\n\t0x0b41, 0x0b44,\n\t0x0b4d, 0x0b4d,\n\t0x0b56, 0x0b57,\n\t0x0b62, 0x0b63,\n\t0x0b82, 0x0b82,\n\t0x0bbe, 0x0bbe,\n\t0x0bc0, 0x0bc0,\n\t0x0bcd, 0x0bcd,\n\t0x0bd7, 0x0bd7,\n\t0x0c3e, 0x0c40,\n\t0x0c46, 0x0c48,\n\t0x0c4a, 0x0c4d,\n\t0x0c55, 0x0c56,\n\t0x0c62, 0x0c63,\n\t0x0cbc, 0x0cbc,\n\t0x0cbf, 0x0cbf,\n\t0x0cc2, 0x0cc2,\n\t0x0cc6, 0x0cc6,\n\t0x0ccc, 0x0ccd,\n\t0x0cd5, 0x0cd6,\n\t0x0ce2, 0x0ce3,\n\t0x0d3e, 0x0d3e,\n\t0x0d41, 0x0d44,\n\t0x0d4d, 0x0d4d,\n\t0x0d57, 0x0d57,\n\t0x0d62, 0x0d63,\n\t0x0dca, 0x0dca,\n\t0x0dcf, 0x0dcf,\n\t0x0dd2, 0x0dd4,\n\t0x0dd6, 0x0dd6,\n\t0x0ddf, 0x0ddf,\n\t0x0e31, 0x0e31,\n\t0x0e34, 0x0e3a,\n\t0x0e47, 0x0e4e,\n\t0x0eb1, 0x0eb1,\n\t0x0eb4, 0x0eb9,\n\t0x0ebb, 0x0ebc,\n\t0x0ec8, 0x0ecd,\n\t0x0f18, 0x0f19,\n\t0x0f35, 0x0f35,\n\t0x0f37, 0x0f37,\n\t0x0f39, 0x0f39,\n\t0x0f71, 0x0f7e,\n\t0x0f80, 0x0f84,\n\t0x0f86, 0x0f87,\n\t0x0f8d, 0x0f97,\n\t0x0f99, 0x0fbc,\n\t0x0fc6, 0x0fc6,\n\t0x102d, 0x1030,\n\t0x1032, 0x1037,\n\t0x1039, 0x103a,\n\t0x103d, 0x103e,\n\t0x1058, 0x1059,\n\t0x105e, 0x1060,\n\t0x1071, 0x1074,\n\t0x1082, 0x1082,\n\t0x1085, 0x1086,\n\t0x108d, 0x108d,\n\t0x109d, 0x109d,\n\t0x135d, 0x135f,\n\t0x1712, 0x1714,\n\t0x1732, 0x1734,\n\t0x1752, 0x1753,\n\t0x1772, 0x1773,\n\t0x17b4, 0x17b5,\n\t0x17b7, 0x17bd,\n\t0x17c6, 0x17c6,\n\t0x17c9, 0x17d3,\n\t0x17dd, 0x17dd,\n\t0x180b, 0x180d,\n\t0x18a9, 0x18a9,\n\t0x1920, 0x1922,\n\t0x1927, 0x1928,\n\t0x1932, 0x1932,\n\t0x1939, 0x193b,\n\t0x1a17, 0x1a18,\n\t0x1a56, 0x1a56,\n\t0x1a58, 0x1a5e,\n\t0x1a60, 0x1a60,\n\t0x1a62, 0x1a62,\n\t0x1a65, 0x1a6c,\n\t0x1a73, 0x1a7c,\n\t0x1a7f, 0x1a7f,\n\t0x1b00, 0x1b03,\n\t0x1b34, 0x1b34,\n\t0x1b36, 0x1b3a,\n\t0x1b3c, 0x1b3c,\n\t0x1b42, 0x1b42,\n\t0x1b6b, 0x1b73,\n\t0x1b80, 0x1b81,\n\t0x1ba2, 0x1ba5,\n\t0x1ba8, 0x1ba9,\n\t0x1bab, 0x1bab,\n\t0x1be6, 0x1be6,\n\t0x1be8, 0x1be9,\n\t0x1bed, 0x1bed,\n\t0x1bef, 0x1bf1,\n\t0x1c2c, 0x1c33,\n\t0x1c36, 0x1c37,\n\t0x1cd0, 0x1cd2,\n\t0x1cd4, 0x1ce0,\n\t0x1ce2, 0x1ce8,\n\t0x1ced, 0x1ced,\n\t0x1cf4, 0x1cf4,\n\t0x1dc0, 0x1de6,\n\t0x1dfc, 0x1dff,\n\t0x200c, 0x200d,\n\t0x20d0, 0x20f0,\n\t0x2cef, 0x2cf1,\n\t0x2d7f, 0x2d7f,\n\t0x2de0, 0x2dff,\n\t0x302a, 0x302f,\n\t0x3099, 0x309a,\n\t0xa66f, 0xa672,\n\t0xa674, 0xa67d,\n\t0xa69f, 0xa69f,\n\t0xa6f0, 0xa6f1,\n\t0xa802, 0xa802,\n\t0xa806, 0xa806,\n\t0xa80b, 0xa80b,\n\t0xa825, 0xa826,\n\t0xa8c4, 0xa8c4,\n\t0xa8e0, 0xa8f1,\n\t0xa926, 0xa92d,\n\t0xa947, 0xa951,\n\t0xa980, 0xa982,\n\t0xa9b3, 0xa9b3,\n\t0xa9b6, 0xa9b9,\n\t0xa9bc, 0xa9bc,\n\t0xaa29, 0xaa2e,\n\t0xaa31, 0xaa32,\n\t0xaa35, 0xaa36,\n\t0xaa43, 0xaa43,\n\t0xaa4c, 0xaa4c,\n\t0xaab0, 0xaab0,\n\t0xaab2, 0xaab4,\n\t0xaab7, 0xaab8,\n\t0xaabe, 0xaabf,\n\t0xaac1, 0xaac1,\n\t0xaaec, 0xaaed,\n\t0xaaf6, 0xaaf6,\n\t0xabe5, 0xabe5,\n\t0xabe8, 0xabe8,\n\t0xabed, 0xabed,\n\t0xfb1e, 0xfb1e,\n\t0xfe00, 0xfe0f,\n\t0xfe20, 0xfe26,\n\t0xff9e, 0xff9f,\n\t0x101fd, 0x101fd,\n\t0x10a01, 0x10a03,\n\t0x10a05, 0x10a06,\n\t0x10a0c, 0x10a0f,\n\t0x10a38, 0x10a3a,\n\t0x10a3f, 0x10a3f,\n\t0x11001, 0x11001,\n\t0x11038, 0x11046,\n\t0x11080, 0x11081,\n\t0x110b3, 0x110b6,\n\t0x110b9, 0x110ba,\n\t0x11100, 0x11102,\n\t0x11127, 0x1112b,\n\t0x1112d, 0x11134,\n\t0x11180, 0x11181,\n\t0x111b6, 0x111be,\n\t0x116ab, 0x116ab,\n\t0x116ad, 0x116ad,\n\t0x116b0, 0x116b5,\n\t0x116b7, 0x116b7,\n\t0x16f8f, 0x16f92,\n\t0x1d165, 0x1d165,\n\t0x1d167, 0x1d169,\n\t0x1d16e, 0x1d172,\n\t0x1d17b, 0x1d182,\n\t0x1d185, 0x1d18b,\n\t0x1d1aa, 0x1d1ad,\n\t0x1d242, 0x1d244,\n\t0xe0100, 0xe01ef,\n}; /* CR_Grapheme_Extend */\n\n/* 'Grapheme_Base': Derived Property */\nstatic const OnigCodePoint CR_Grapheme_Base[] = {\n\t643,\n\t0x0020, 0x007e,\n\t0x00a0, 0x00ac,\n\t0x00ae, 0x02ff,\n\t0x0370, 0x0377,\n\t0x037a, 0x037e,\n\t0x0384, 0x038a,\n\t0x038c, 0x038c,\n\t0x038e, 0x03a1,\n\t0x03a3, 0x0482,\n\t0x048a, 0x0527,\n\t0x0531, 0x0556,\n\t0x0559, 0x055f,\n\t0x0561, 0x0587,\n\t0x0589, 0x058a,\n\t0x058f, 0x058f,\n\t0x05be, 0x05be,\n\t0x05c0, 0x05c0,\n\t0x05c3, 0x05c3,\n\t0x05c6, 0x05c6,\n\t0x05d0, 0x05ea,\n\t0x05f0, 0x05f4,\n\t0x0606, 0x060f,\n\t0x061b, 0x061b,\n\t0x061e, 0x064a,\n\t0x0660, 0x066f,\n\t0x0671, 0x06d5,\n\t0x06de, 0x06de,\n\t0x06e5, 0x06e6,\n\t0x06e9, 0x06e9,\n\t0x06ee, 0x070d,\n\t0x0710, 0x0710,\n\t0x0712, 0x072f,\n\t0x074d, 0x07a5,\n\t0x07b1, 0x07b1,\n\t0x07c0, 0x07ea,\n\t0x07f4, 0x07fa,\n\t0x0800, 0x0815,\n\t0x081a, 0x081a,\n\t0x0824, 0x0824,\n\t0x0828, 0x0828,\n\t0x0830, 0x083e,\n\t0x0840, 0x0858,\n\t0x085e, 0x085e,\n\t0x08a0, 0x08a0,\n\t0x08a2, 0x08ac,\n\t0x0903, 0x0939,\n\t0x093b, 0x093b,\n\t0x093d, 0x0940,\n\t0x0949, 0x094c,\n\t0x094e, 0x0950,\n\t0x0958, 0x0961,\n\t0x0964, 0x0977,\n\t0x0979, 0x097f,\n\t0x0982, 0x0983,\n\t0x0985, 0x098c,\n\t0x098f, 0x0990,\n\t0x0993, 0x09a8,\n\t0x09aa, 0x09b0,\n\t0x09b2, 0x09b2,\n\t0x09b6, 0x09b9,\n\t0x09bd, 0x09bd,\n\t0x09bf, 0x09c0,\n\t0x09c7, 0x09c8,\n\t0x09cb, 0x09cc,\n\t0x09ce, 0x09ce,\n\t0x09dc, 0x09dd,\n\t0x09df, 0x09e1,\n\t0x09e6, 0x09fb,\n\t0x0a03, 0x0a03,\n\t0x0a05, 0x0a0a,\n\t0x0a0f, 0x0a10,\n\t0x0a13, 0x0a28,\n\t0x0a2a, 0x0a30,\n\t0x0a32, 0x0a33,\n\t0x0a35, 0x0a36,\n\t0x0a38, 0x0a39,\n\t0x0a3e, 0x0a40,\n\t0x0a59, 0x0a5c,\n\t0x0a5e, 0x0a5e,\n\t0x0a66, 0x0a6f,\n\t0x0a72, 0x0a74,\n\t0x0a83, 0x0a83,\n\t0x0a85, 0x0a8d,\n\t0x0a8f, 0x0a91,\n\t0x0a93, 0x0aa8,\n\t0x0aaa, 0x0ab0,\n\t0x0ab2, 0x0ab3,\n\t0x0ab5, 0x0ab9,\n\t0x0abd, 0x0ac0,\n\t0x0ac9, 0x0ac9,\n\t0x0acb, 0x0acc,\n\t0x0ad0, 0x0ad0,\n\t0x0ae0, 0x0ae1,\n\t0x0ae6, 0x0af1,\n\t0x0b02, 0x0b03,\n\t0x0b05, 0x0b0c,\n\t0x0b0f, 0x0b10,\n\t0x0b13, 0x0b28,\n\t0x0b2a, 0x0b30,\n\t0x0b32, 0x0b33,\n\t0x0b35, 0x0b39,\n\t0x0b3d, 0x0b3d,\n\t0x0b40, 0x0b40,\n\t0x0b47, 0x0b48,\n\t0x0b4b, 0x0b4c,\n\t0x0b5c, 0x0b5d,\n\t0x0b5f, 0x0b61,\n\t0x0b66, 0x0b77,\n\t0x0b83, 0x0b83,\n\t0x0b85, 0x0b8a,\n\t0x0b8e, 0x0b90,\n\t0x0b92, 0x0b95,\n\t0x0b99, 0x0b9a,\n\t0x0b9c, 0x0b9c,\n\t0x0b9e, 0x0b9f,\n\t0x0ba3, 0x0ba4,\n\t0x0ba8, 0x0baa,\n\t0x0bae, 0x0bb9,\n\t0x0bbf, 0x0bbf,\n\t0x0bc1, 0x0bc2,\n\t0x0bc6, 0x0bc8,\n\t0x0bca, 0x0bcc,\n\t0x0bd0, 0x0bd0,\n\t0x0be6, 0x0bfa,\n\t0x0c01, 0x0c03,\n\t0x0c05, 0x0c0c,\n\t0x0c0e, 0x0c10,\n\t0x0c12, 0x0c28,\n\t0x0c2a, 0x0c33,\n\t0x0c35, 0x0c39,\n\t0x0c3d, 0x0c3d,\n\t0x0c41, 0x0c44,\n\t0x0c58, 0x0c59,\n\t0x0c60, 0x0c61,\n\t0x0c66, 0x0c6f,\n\t0x0c78, 0x0c7f,\n\t0x0c82, 0x0c83,\n\t0x0c85, 0x0c8c,\n\t0x0c8e, 0x0c90,\n\t0x0c92, 0x0ca8,\n\t0x0caa, 0x0cb3,\n\t0x0cb5, 0x0cb9,\n\t0x0cbd, 0x0cbe,\n\t0x0cc0, 0x0cc1,\n\t0x0cc3, 0x0cc4,\n\t0x0cc7, 0x0cc8,\n\t0x0cca, 0x0ccb,\n\t0x0cde, 0x0cde,\n\t0x0ce0, 0x0ce1,\n\t0x0ce6, 0x0cef,\n\t0x0cf1, 0x0cf2,\n\t0x0d02, 0x0d03,\n\t0x0d05, 0x0d0c,\n\t0x0d0e, 0x0d10,\n\t0x0d12, 0x0d3a,\n\t0x0d3d, 0x0d3d,\n\t0x0d3f, 0x0d40,\n\t0x0d46, 0x0d48,\n\t0x0d4a, 0x0d4c,\n\t0x0d4e, 0x0d4e,\n\t0x0d60, 0x0d61,\n\t0x0d66, 0x0d75,\n\t0x0d79, 0x0d7f,\n\t0x0d82, 0x0d83,\n\t0x0d85, 0x0d96,\n\t0x0d9a, 0x0db1,\n\t0x0db3, 0x0dbb,\n\t0x0dbd, 0x0dbd,\n\t0x0dc0, 0x0dc6,\n\t0x0dd0, 0x0dd1,\n\t0x0dd8, 0x0dde,\n\t0x0df2, 0x0df4,\n\t0x0e01, 0x0e30,\n\t0x0e32, 0x0e33,\n\t0x0e3f, 0x0e46,\n\t0x0e4f, 0x0e5b,\n\t0x0e81, 0x0e82,\n\t0x0e84, 0x0e84,\n\t0x0e87, 0x0e88,\n\t0x0e8a, 0x0e8a,\n\t0x0e8d, 0x0e8d,\n\t0x0e94, 0x0e97,\n\t0x0e99, 0x0e9f,\n\t0x0ea1, 0x0ea3,\n\t0x0ea5, 0x0ea5,\n\t0x0ea7, 0x0ea7,\n\t0x0eaa, 0x0eab,\n\t0x0ead, 0x0eb0,\n\t0x0eb2, 0x0eb3,\n\t0x0ebd, 0x0ebd,\n\t0x0ec0, 0x0ec4,\n\t0x0ec6, 0x0ec6,\n\t0x0ed0, 0x0ed9,\n\t0x0edc, 0x0edf,\n\t0x0f00, 0x0f17,\n\t0x0f1a, 0x0f34,\n\t0x0f36, 0x0f36,\n\t0x0f38, 0x0f38,\n\t0x0f3a, 0x0f47,\n\t0x0f49, 0x0f6c,\n\t0x0f7f, 0x0f7f,\n\t0x0f85, 0x0f85,\n\t0x0f88, 0x0f8c,\n\t0x0fbe, 0x0fc5,\n\t0x0fc7, 0x0fcc,\n\t0x0fce, 0x0fda,\n\t0x1000, 0x102c,\n\t0x1031, 0x1031,\n\t0x1038, 0x1038,\n\t0x103b, 0x103c,\n\t0x103f, 0x1057,\n\t0x105a, 0x105d,\n\t0x1061, 0x1070,\n\t0x1075, 0x1081,\n\t0x1083, 0x1084,\n\t0x1087, 0x108c,\n\t0x108e, 0x109c,\n\t0x109e, 0x10c5,\n\t0x10c7, 0x10c7,\n\t0x10cd, 0x10cd,\n\t0x10d0, 0x1248,\n\t0x124a, 0x124d,\n\t0x1250, 0x1256,\n\t0x1258, 0x1258,\n\t0x125a, 0x125d,\n\t0x1260, 0x1288,\n\t0x128a, 0x128d,\n\t0x1290, 0x12b0,\n\t0x12b2, 0x12b5,\n\t0x12b8, 0x12be,\n\t0x12c0, 0x12c0,\n\t0x12c2, 0x12c5,\n\t0x12c8, 0x12d6,\n\t0x12d8, 0x1310,\n\t0x1312, 0x1315,\n\t0x1318, 0x135a,\n\t0x1360, 0x137c,\n\t0x1380, 0x1399,\n\t0x13a0, 0x13f4,\n\t0x1400, 0x169c,\n\t0x16a0, 0x16f0,\n\t0x1700, 0x170c,\n\t0x170e, 0x1711,\n\t0x1720, 0x1731,\n\t0x1735, 0x1736,\n\t0x1740, 0x1751,\n\t0x1760, 0x176c,\n\t0x176e, 0x1770,\n\t0x1780, 0x17b3,\n\t0x17b6, 0x17b6,\n\t0x17be, 0x17c5,\n\t0x17c7, 0x17c8,\n\t0x17d4, 0x17dc,\n\t0x17e0, 0x17e9,\n\t0x17f0, 0x17f9,\n\t0x1800, 0x180a,\n\t0x180e, 0x180e,\n\t0x1810, 0x1819,\n\t0x1820, 0x1877,\n\t0x1880, 0x18a8,\n\t0x18aa, 0x18aa,\n\t0x18b0, 0x18f5,\n\t0x1900, 0x191c,\n\t0x1923, 0x1926,\n\t0x1929, 0x192b,\n\t0x1930, 0x1931,\n\t0x1933, 0x1938,\n\t0x1940, 0x1940,\n\t0x1944, 0x196d,\n\t0x1970, 0x1974,\n\t0x1980, 0x19ab,\n\t0x19b0, 0x19c9,\n\t0x19d0, 0x19da,\n\t0x19de, 0x1a16,\n\t0x1a19, 0x1a1b,\n\t0x1a1e, 0x1a55,\n\t0x1a57, 0x1a57,\n\t0x1a61, 0x1a61,\n\t0x1a63, 0x1a64,\n\t0x1a6d, 0x1a72,\n\t0x1a80, 0x1a89,\n\t0x1a90, 0x1a99,\n\t0x1aa0, 0x1aad,\n\t0x1b04, 0x1b33,\n\t0x1b35, 0x1b35,\n\t0x1b3b, 0x1b3b,\n\t0x1b3d, 0x1b41,\n\t0x1b43, 0x1b4b,\n\t0x1b50, 0x1b6a,\n\t0x1b74, 0x1b7c,\n\t0x1b82, 0x1ba1,\n\t0x1ba6, 0x1ba7,\n\t0x1baa, 0x1baa,\n\t0x1bac, 0x1be5,\n\t0x1be7, 0x1be7,\n\t0x1bea, 0x1bec,\n\t0x1bee, 0x1bee,\n\t0x1bf2, 0x1bf3,\n\t0x1bfc, 0x1c2b,\n\t0x1c34, 0x1c35,\n\t0x1c3b, 0x1c49,\n\t0x1c4d, 0x1c7f,\n\t0x1cc0, 0x1cc7,\n\t0x1cd3, 0x1cd3,\n\t0x1ce1, 0x1ce1,\n\t0x1ce9, 0x1cec,\n\t0x1cee, 0x1cf3,\n\t0x1cf5, 0x1cf6,\n\t0x1d00, 0x1dbf,\n\t0x1e00, 0x1f15,\n\t0x1f18, 0x1f1d,\n\t0x1f20, 0x1f45,\n\t0x1f48, 0x1f4d,\n\t0x1f50, 0x1f57,\n\t0x1f59, 0x1f59,\n\t0x1f5b, 0x1f5b,\n\t0x1f5d, 0x1f5d,\n\t0x1f5f, 0x1f7d,\n\t0x1f80, 0x1fb4,\n\t0x1fb6, 0x1fc4,\n\t0x1fc6, 0x1fd3,\n\t0x1fd6, 0x1fdb,\n\t0x1fdd, 0x1fef,\n\t0x1ff2, 0x1ff4,\n\t0x1ff6, 0x1ffe,\n\t0x2000, 0x200a,\n\t0x2010, 0x2027,\n\t0x202f, 0x205f,\n\t0x2070, 0x2071,\n\t0x2074, 0x208e,\n\t0x2090, 0x209c,\n\t0x20a0, 0x20b9,\n\t0x2100, 0x2189,\n\t0x2190, 0x23f3,\n\t0x2400, 0x2426,\n\t0x2440, 0x244a,\n\t0x2460, 0x26ff,\n\t0x2701, 0x2b4c,\n\t0x2b50, 0x2b59,\n\t0x2c00, 0x2c2e,\n\t0x2c30, 0x2c5e,\n\t0x2c60, 0x2cee,\n\t0x2cf2, 0x2cf3,\n\t0x2cf9, 0x2d25,\n\t0x2d27, 0x2d27,\n\t0x2d2d, 0x2d2d,\n\t0x2d30, 0x2d67,\n\t0x2d6f, 0x2d70,\n\t0x2d80, 0x2d96,\n\t0x2da0, 0x2da6,\n\t0x2da8, 0x2dae,\n\t0x2db0, 0x2db6,\n\t0x2db8, 0x2dbe,\n\t0x2dc0, 0x2dc6,\n\t0x2dc8, 0x2dce,\n\t0x2dd0, 0x2dd6,\n\t0x2dd8, 0x2dde,\n\t0x2e00, 0x2e3b,\n\t0x2e80, 0x2e99,\n\t0x2e9b, 0x2ef3,\n\t0x2f00, 0x2fd5,\n\t0x2ff0, 0x2ffb,\n\t0x3000, 0x3029,\n\t0x3030, 0x303f,\n\t0x3041, 0x3096,\n\t0x309b, 0x30ff,\n\t0x3105, 0x312d,\n\t0x3131, 0x318e,\n\t0x3190, 0x31ba,\n\t0x31c0, 0x31e3,\n\t0x31f0, 0x321e,\n\t0x3220, 0x32fe,\n\t0x3300, 0x4db5,\n\t0x4dc0, 0x9fcc,\n\t0xa000, 0xa48c,\n\t0xa490, 0xa4c6,\n\t0xa4d0, 0xa62b,\n\t0xa640, 0xa66e,\n\t0xa673, 0xa673,\n\t0xa67e, 0xa697,\n\t0xa6a0, 0xa6ef,\n\t0xa6f2, 0xa6f7,\n\t0xa700, 0xa78e,\n\t0xa790, 0xa793,\n\t0xa7a0, 0xa7aa,\n\t0xa7f8, 0xa801,\n\t0xa803, 0xa805,\n\t0xa807, 0xa80a,\n\t0xa80c, 0xa824,\n\t0xa827, 0xa82b,\n\t0xa830, 0xa839,\n\t0xa840, 0xa877,\n\t0xa880, 0xa8c3,\n\t0xa8ce, 0xa8d9,\n\t0xa8f2, 0xa8fb,\n\t0xa900, 0xa925,\n\t0xa92e, 0xa946,\n\t0xa952, 0xa953,\n\t0xa95f, 0xa97c,\n\t0xa983, 0xa9b2,\n\t0xa9b4, 0xa9b5,\n\t0xa9ba, 0xa9bb,\n\t0xa9bd, 0xa9cd,\n\t0xa9cf, 0xa9d9,\n\t0xa9de, 0xa9df,\n\t0xaa00, 0xaa28,\n\t0xaa2f, 0xaa30,\n\t0xaa33, 0xaa34,\n\t0xaa40, 0xaa42,\n\t0xaa44, 0xaa4b,\n\t0xaa4d, 0xaa4d,\n\t0xaa50, 0xaa59,\n\t0xaa5c, 0xaa7b,\n\t0xaa80, 0xaaaf,\n\t0xaab1, 0xaab1,\n\t0xaab5, 0xaab6,\n\t0xaab9, 0xaabd,\n\t0xaac0, 0xaac0,\n\t0xaac2, 0xaac2,\n\t0xaadb, 0xaaeb,\n\t0xaaee, 0xaaf5,\n\t0xab01, 0xab06,\n\t0xab09, 0xab0e,\n\t0xab11, 0xab16,\n\t0xab20, 0xab26,\n\t0xab28, 0xab2e,\n\t0xabc0, 0xabe4,\n\t0xabe6, 0xabe7,\n\t0xabe9, 0xabec,\n\t0xabf0, 0xabf9,\n\t0xac00, 0xd7a3,\n\t0xd7b0, 0xd7c6,\n\t0xd7cb, 0xd7fb,\n\t0xf900, 0xfa6d,\n\t0xfa70, 0xfad9,\n\t0xfb00, 0xfb06,\n\t0xfb13, 0xfb17,\n\t0xfb1d, 0xfb1d,\n\t0xfb1f, 0xfb36,\n\t0xfb38, 0xfb3c,\n\t0xfb3e, 0xfb3e,\n\t0xfb40, 0xfb41,\n\t0xfb43, 0xfb44,\n\t0xfb46, 0xfbc1,\n\t0xfbd3, 0xfd3f,\n\t0xfd50, 0xfd8f,\n\t0xfd92, 0xfdc7,\n\t0xfdf0, 0xfdfd,\n\t0xfe10, 0xfe19,\n\t0xfe30, 0xfe52,\n\t0xfe54, 0xfe66,\n\t0xfe68, 0xfe6b,\n\t0xfe70, 0xfe74,\n\t0xfe76, 0xfefc,\n\t0xff01, 0xff9d,\n\t0xffa0, 0xffbe,\n\t0xffc2, 0xffc7,\n\t0xffca, 0xffcf,\n\t0xffd2, 0xffd7,\n\t0xffda, 0xffdc,\n\t0xffe0, 0xffe6,\n\t0xffe8, 0xffee,\n\t0xfffc, 0xfffd,\n\t0x10000, 0x1000b,\n\t0x1000d, 0x10026,\n\t0x10028, 0x1003a,\n\t0x1003c, 0x1003d,\n\t0x1003f, 0x1004d,\n\t0x10050, 0x1005d,\n\t0x10080, 0x100fa,\n\t0x10100, 0x10102,\n\t0x10107, 0x10133,\n\t0x10137, 0x1018a,\n\t0x10190, 0x1019b,\n\t0x101d0, 0x101fc,\n\t0x10280, 0x1029c,\n\t0x102a0, 0x102d0,\n\t0x10300, 0x1031e,\n\t0x10320, 0x10323,\n\t0x10330, 0x1034a,\n\t0x10380, 0x1039d,\n\t0x1039f, 0x103c3,\n\t0x103c8, 0x103d5,\n\t0x10400, 0x1049d,\n\t0x104a0, 0x104a9,\n\t0x10800, 0x10805,\n\t0x10808, 0x10808,\n\t0x1080a, 0x10835,\n\t0x10837, 0x10838,\n\t0x1083c, 0x1083c,\n\t0x1083f, 0x10855,\n\t0x10857, 0x1085f,\n\t0x10900, 0x1091b,\n\t0x1091f, 0x10939,\n\t0x1093f, 0x1093f,\n\t0x10980, 0x109b7,\n\t0x109be, 0x109bf,\n\t0x10a00, 0x10a00,\n\t0x10a10, 0x10a13,\n\t0x10a15, 0x10a17,\n\t0x10a19, 0x10a33,\n\t0x10a40, 0x10a47,\n\t0x10a50, 0x10a58,\n\t0x10a60, 0x10a7f,\n\t0x10b00, 0x10b35,\n\t0x10b39, 0x10b55,\n\t0x10b58, 0x10b72,\n\t0x10b78, 0x10b7f,\n\t0x10c00, 0x10c48,\n\t0x10e60, 0x10e7e,\n\t0x11000, 0x11000,\n\t0x11002, 0x11037,\n\t0x11047, 0x1104d,\n\t0x11052, 0x1106f,\n\t0x11082, 0x110b2,\n\t0x110b7, 0x110b8,\n\t0x110bb, 0x110bc,\n\t0x110be, 0x110c1,\n\t0x110d0, 0x110e8,\n\t0x110f0, 0x110f9,\n\t0x11103, 0x11126,\n\t0x1112c, 0x1112c,\n\t0x11136, 0x11143,\n\t0x11182, 0x111b5,\n\t0x111bf, 0x111c8,\n\t0x111d0, 0x111d9,\n\t0x11680, 0x116aa,\n\t0x116ac, 0x116ac,\n\t0x116ae, 0x116af,\n\t0x116b6, 0x116b6,\n\t0x116c0, 0x116c9,\n\t0x12000, 0x1236e,\n\t0x12400, 0x12462,\n\t0x12470, 0x12473,\n\t0x13000, 0x1342e,\n\t0x16800, 0x16a38,\n\t0x16f00, 0x16f44,\n\t0x16f50, 0x16f7e,\n\t0x16f93, 0x16f9f,\n\t0x1b000, 0x1b001,\n\t0x1d000, 0x1d0f5,\n\t0x1d100, 0x1d126,\n\t0x1d129, 0x1d164,\n\t0x1d166, 0x1d166,\n\t0x1d16a, 0x1d16d,\n\t0x1d183, 0x1d184,\n\t0x1d18c, 0x1d1a9,\n\t0x1d1ae, 0x1d1dd,\n\t0x1d200, 0x1d241,\n\t0x1d245, 0x1d245,\n\t0x1d300, 0x1d356,\n\t0x1d360, 0x1d371,\n\t0x1d400, 0x1d454,\n\t0x1d456, 0x1d49c,\n\t0x1d49e, 0x1d49f,\n\t0x1d4a2, 0x1d4a2,\n\t0x1d4a5, 0x1d4a6,\n\t0x1d4a9, 0x1d4ac,\n\t0x1d4ae, 0x1d4b9,\n\t0x1d4bb, 0x1d4bb,\n\t0x1d4bd, 0x1d4c3,\n\t0x1d4c5, 0x1d505,\n\t0x1d507, 0x1d50a,\n\t0x1d50d, 0x1d514,\n\t0x1d516, 0x1d51c,\n\t0x1d51e, 0x1d539,\n\t0x1d53b, 0x1d53e,\n\t0x1d540, 0x1d544,\n\t0x1d546, 0x1d546,\n\t0x1d54a, 0x1d550,\n\t0x1d552, 0x1d6a5,\n\t0x1d6a8, 0x1d7cb,\n\t0x1d7ce, 0x1d7ff,\n\t0x1ee00, 0x1ee03,\n\t0x1ee05, 0x1ee1f,\n\t0x1ee21, 0x1ee22,\n\t0x1ee24, 0x1ee24,\n\t0x1ee27, 0x1ee27,\n\t0x1ee29, 0x1ee32,\n\t0x1ee34, 0x1ee37,\n\t0x1ee39, 0x1ee39,\n\t0x1ee3b, 0x1ee3b,\n\t0x1ee42, 0x1ee42,\n\t0x1ee47, 0x1ee47,\n\t0x1ee49, 0x1ee49,\n\t0x1ee4b, 0x1ee4b,\n\t0x1ee4d, 0x1ee4f,\n\t0x1ee51, 0x1ee52,\n\t0x1ee54, 0x1ee54,\n\t0x1ee57, 0x1ee57,\n\t0x1ee59, 0x1ee59,\n\t0x1ee5b, 0x1ee5b,\n\t0x1ee5d, 0x1ee5d,\n\t0x1ee5f, 0x1ee5f,\n\t0x1ee61, 0x1ee62,\n\t0x1ee64, 0x1ee64,\n\t0x1ee67, 0x1ee6a,\n\t0x1ee6c, 0x1ee72,\n\t0x1ee74, 0x1ee77,\n\t0x1ee79, 0x1ee7c,\n\t0x1ee7e, 0x1ee7e,\n\t0x1ee80, 0x1ee89,\n\t0x1ee8b, 0x1ee9b,\n\t0x1eea1, 0x1eea3,\n\t0x1eea5, 0x1eea9,\n\t0x1eeab, 0x1eebb,\n\t0x1eef0, 0x1eef1,\n\t0x1f000, 0x1f02b,\n\t0x1f030, 0x1f093,\n\t0x1f0a0, 0x1f0ae,\n\t0x1f0b1, 0x1f0be,\n\t0x1f0c1, 0x1f0cf,\n\t0x1f0d1, 0x1f0df,\n\t0x1f100, 0x1f10a,\n\t0x1f110, 0x1f12e,\n\t0x1f130, 0x1f16b,\n\t0x1f170, 0x1f19a,\n\t0x1f1e6, 0x1f202,\n\t0x1f210, 0x1f23a,\n\t0x1f240, 0x1f248,\n\t0x1f250, 0x1f251,\n\t0x1f300, 0x1f320,\n\t0x1f330, 0x1f335,\n\t0x1f337, 0x1f37c,\n\t0x1f380, 0x1f393,\n\t0x1f3a0, 0x1f3c4,\n\t0x1f3c6, 0x1f3ca,\n\t0x1f3e0, 0x1f3f0,\n\t0x1f400, 0x1f43e,\n\t0x1f440, 0x1f440,\n\t0x1f442, 0x1f4f7,\n\t0x1f4f9, 0x1f4fc,\n\t0x1f500, 0x1f53d,\n\t0x1f540, 0x1f543,\n\t0x1f550, 0x1f567,\n\t0x1f5fb, 0x1f640,\n\t0x1f645, 0x1f64f,\n\t0x1f680, 0x1f6c5,\n\t0x1f700, 0x1f773,\n\t0x20000, 0x2a6d6,\n\t0x2a700, 0x2b734,\n\t0x2b740, 0x2b81d,\n\t0x2f800, 0x2fa1d,\n}; /* CR_Grapheme_Base */\n\n/* 'Grapheme_Link': Derived Property */\nstatic const OnigCodePoint CR_Grapheme_Link[] = {\n\t33,\n\t0x094d, 0x094d,\n\t0x09cd, 0x09cd,\n\t0x0a4d, 0x0a4d,\n\t0x0acd, 0x0acd,\n\t0x0b4d, 0x0b4d,\n\t0x0bcd, 0x0bcd,\n\t0x0c4d, 0x0c4d,\n\t0x0ccd, 0x0ccd,\n\t0x0d4d, 0x0d4d,\n\t0x0dca, 0x0dca,\n\t0x0e3a, 0x0e3a,\n\t0x0f84, 0x0f84,\n\t0x1039, 0x103a,\n\t0x1714, 0x1714,\n\t0x1734, 0x1734,\n\t0x17d2, 0x17d2,\n\t0x1a60, 0x1a60,\n\t0x1b44, 0x1b44,\n\t0x1baa, 0x1bab,\n\t0x1bf2, 0x1bf3,\n\t0x2d7f, 0x2d7f,\n\t0xa806, 0xa806,\n\t0xa8c4, 0xa8c4,\n\t0xa953, 0xa953,\n\t0xa9c0, 0xa9c0,\n\t0xaaf6, 0xaaf6,\n\t0xabed, 0xabed,\n\t0x10a3f, 0x10a3f,\n\t0x11046, 0x11046,\n\t0x110b9, 0x110b9,\n\t0x11133, 0x11134,\n\t0x111c0, 0x111c0,\n\t0x116b6, 0x116b6,\n}; /* CR_Grapheme_Link */\n\n/* 'Common': Script */\nstatic const OnigCodePoint CR_Common[] = {\n\t157,\n\t0x0000, 0x0040,\n\t0x005b, 0x0060,\n\t0x007b, 0x00a9,\n\t0x00ab, 0x00b9,\n\t0x00bb, 0x00bf,\n\t0x00d7, 0x00d7,\n\t0x00f7, 0x00f7,\n\t0x02b9, 0x02df,\n\t0x02e5, 0x02e9,\n\t0x02ec, 0x02ff,\n\t0x0374, 0x0374,\n\t0x037e, 0x037e,\n\t0x0385, 0x0385,\n\t0x0387, 0x0387,\n\t0x0589, 0x0589,\n\t0x060c, 0x060c,\n\t0x061b, 0x061b,\n\t0x061f, 0x061f,\n\t0x0640, 0x0640,\n\t0x0660, 0x0669,\n\t0x06dd, 0x06dd,\n\t0x0964, 0x0965,\n\t0x0e3f, 0x0e3f,\n\t0x0fd5, 0x0fd8,\n\t0x10fb, 0x10fb,\n\t0x16eb, 0x16ed,\n\t0x1735, 0x1736,\n\t0x1802, 0x1803,\n\t0x1805, 0x1805,\n\t0x1cd3, 0x1cd3,\n\t0x1ce1, 0x1ce1,\n\t0x1ce9, 0x1cec,\n\t0x1cee, 0x1cf3,\n\t0x1cf5, 0x1cf6,\n\t0x2000, 0x200b,\n\t0x200e, 0x2064,\n\t0x206a, 0x2070,\n\t0x2074, 0x207e,\n\t0x2080, 0x208e,\n\t0x20a0, 0x20b9,\n\t0x2100, 0x2125,\n\t0x2127, 0x2129,\n\t0x212c, 0x2131,\n\t0x2133, 0x214d,\n\t0x214f, 0x215f,\n\t0x2189, 0x2189,\n\t0x2190, 0x23f3,\n\t0x2400, 0x2426,\n\t0x2440, 0x244a,\n\t0x2460, 0x26ff,\n\t0x2701, 0x27ff,\n\t0x2900, 0x2b4c,\n\t0x2b50, 0x2b59,\n\t0x2e00, 0x2e3b,\n\t0x2ff0, 0x2ffb,\n\t0x3000, 0x3004,\n\t0x3006, 0x3006,\n\t0x3008, 0x3020,\n\t0x3030, 0x3037,\n\t0x303c, 0x303f,\n\t0x309b, 0x309c,\n\t0x30a0, 0x30a0,\n\t0x30fb, 0x30fc,\n\t0x3190, 0x319f,\n\t0x31c0, 0x31e3,\n\t0x3220, 0x325f,\n\t0x327f, 0x32cf,\n\t0x3358, 0x33ff,\n\t0x4dc0, 0x4dff,\n\t0xa700, 0xa721,\n\t0xa788, 0xa78a,\n\t0xa830, 0xa839,\n\t0xfd3e, 0xfd3f,\n\t0xfdfd, 0xfdfd,\n\t0xfe10, 0xfe19,\n\t0xfe30, 0xfe52,\n\t0xfe54, 0xfe66,\n\t0xfe68, 0xfe6b,\n\t0xfeff, 0xfeff,\n\t0xff01, 0xff20,\n\t0xff3b, 0xff40,\n\t0xff5b, 0xff65,\n\t0xff70, 0xff70,\n\t0xff9e, 0xff9f,\n\t0xffe0, 0xffe6,\n\t0xffe8, 0xffee,\n\t0xfff9, 0xfffd,\n\t0x10100, 0x10102,\n\t0x10107, 0x10133,\n\t0x10137, 0x1013f,\n\t0x10190, 0x1019b,\n\t0x101d0, 0x101fc,\n\t0x1d000, 0x1d0f5,\n\t0x1d100, 0x1d126,\n\t0x1d129, 0x1d166,\n\t0x1d16a, 0x1d17a,\n\t0x1d183, 0x1d184,\n\t0x1d18c, 0x1d1a9,\n\t0x1d1ae, 0x1d1dd,\n\t0x1d300, 0x1d356,\n\t0x1d360, 0x1d371,\n\t0x1d400, 0x1d454,\n\t0x1d456, 0x1d49c,\n\t0x1d49e, 0x1d49f,\n\t0x1d4a2, 0x1d4a2,\n\t0x1d4a5, 0x1d4a6,\n\t0x1d4a9, 0x1d4ac,\n\t0x1d4ae, 0x1d4b9,\n\t0x1d4bb, 0x1d4bb,\n\t0x1d4bd, 0x1d4c3,\n\t0x1d4c5, 0x1d505,\n\t0x1d507, 0x1d50a,\n\t0x1d50d, 0x1d514,\n\t0x1d516, 0x1d51c,\n\t0x1d51e, 0x1d539,\n\t0x1d53b, 0x1d53e,\n\t0x1d540, 0x1d544,\n\t0x1d546, 0x1d546,\n\t0x1d54a, 0x1d550,\n\t0x1d552, 0x1d6a5,\n\t0x1d6a8, 0x1d7cb,\n\t0x1d7ce, 0x1d7ff,\n\t0x1f000, 0x1f02b,\n\t0x1f030, 0x1f093,\n\t0x1f0a0, 0x1f0ae,\n\t0x1f0b1, 0x1f0be,\n\t0x1f0c1, 0x1f0cf,\n\t0x1f0d1, 0x1f0df,\n\t0x1f100, 0x1f10a,\n\t0x1f110, 0x1f12e,\n\t0x1f130, 0x1f16b,\n\t0x1f170, 0x1f19a,\n\t0x1f1e6, 0x1f1ff,\n\t0x1f201, 0x1f202,\n\t0x1f210, 0x1f23a,\n\t0x1f240, 0x1f248,\n\t0x1f250, 0x1f251,\n\t0x1f300, 0x1f320,\n\t0x1f330, 0x1f335,\n\t0x1f337, 0x1f37c,\n\t0x1f380, 0x1f393,\n\t0x1f3a0, 0x1f3c4,\n\t0x1f3c6, 0x1f3ca,\n\t0x1f3e0, 0x1f3f0,\n\t0x1f400, 0x1f43e,\n\t0x1f440, 0x1f440,\n\t0x1f442, 0x1f4f7,\n\t0x1f4f9, 0x1f4fc,\n\t0x1f500, 0x1f53d,\n\t0x1f540, 0x1f543,\n\t0x1f550, 0x1f567,\n\t0x1f5fb, 0x1f640,\n\t0x1f645, 0x1f64f,\n\t0x1f680, 0x1f6c5,\n\t0x1f700, 0x1f773,\n\t0xe0001, 0xe0001,\n\t0xe0020, 0xe007f,\n}; /* CR_Common */\n\n/* 'Latin': Script */\nstatic const OnigCodePoint CR_Latin[] = {\n\t30,\n\t0x0041, 0x005a,\n\t0x0061, 0x007a,\n\t0x00aa, 0x00aa,\n\t0x00ba, 0x00ba,\n\t0x00c0, 0x00d6,\n\t0x00d8, 0x00f6,\n\t0x00f8, 0x02b8,\n\t0x02e0, 0x02e4,\n\t0x1d00, 0x1d25,\n\t0x1d2c, 0x1d5c,\n\t0x1d62, 0x1d65,\n\t0x1d6b, 0x1d77,\n\t0x1d79, 0x1dbe,\n\t0x1e00, 0x1eff,\n\t0x2071, 0x2071,\n\t0x207f, 0x207f,\n\t0x2090, 0x209c,\n\t0x212a, 0x212b,\n\t0x2132, 0x2132,\n\t0x214e, 0x214e,\n\t0x2160, 0x2188,\n\t0x2c60, 0x2c7f,\n\t0xa722, 0xa787,\n\t0xa78b, 0xa78e,\n\t0xa790, 0xa793,\n\t0xa7a0, 0xa7aa,\n\t0xa7f8, 0xa7ff,\n\t0xfb00, 0xfb06,\n\t0xff21, 0xff3a,\n\t0xff41, 0xff5a,\n}; /* CR_Latin */\n\n/* 'Greek': Script */\nstatic const OnigCodePoint CR_Greek[] = {\n\t33,\n\t0x0370, 0x0373,\n\t0x0375, 0x0377,\n\t0x037a, 0x037d,\n\t0x0384, 0x0384,\n\t0x0386, 0x0386,\n\t0x0388, 0x038a,\n\t0x038c, 0x038c,\n\t0x038e, 0x03a1,\n\t0x03a3, 0x03e1,\n\t0x03f0, 0x03ff,\n\t0x1d26, 0x1d2a,\n\t0x1d5d, 0x1d61,\n\t0x1d66, 0x1d6a,\n\t0x1dbf, 0x1dbf,\n\t0x1f00, 0x1f15,\n\t0x1f18, 0x1f1d,\n\t0x1f20, 0x1f45,\n\t0x1f48, 0x1f4d,\n\t0x1f50, 0x1f57,\n\t0x1f59, 0x1f59,\n\t0x1f5b, 0x1f5b,\n\t0x1f5d, 0x1f5d,\n\t0x1f5f, 0x1f7d,\n\t0x1f80, 0x1fb4,\n\t0x1fb6, 0x1fc4,\n\t0x1fc6, 0x1fd3,\n\t0x1fd6, 0x1fdb,\n\t0x1fdd, 0x1fef,\n\t0x1ff2, 0x1ff4,\n\t0x1ff6, 0x1ffe,\n\t0x2126, 0x2126,\n\t0x10140, 0x1018a,\n\t0x1d200, 0x1d245,\n}; /* CR_Greek */\n\n/* 'Cyrillic': Script */\nstatic const OnigCodePoint CR_Cyrillic[] = {\n\t7,\n\t0x0400, 0x0484,\n\t0x0487, 0x0527,\n\t0x1d2b, 0x1d2b,\n\t0x1d78, 0x1d78,\n\t0x2de0, 0x2dff,\n\t0xa640, 0xa697,\n\t0xa69f, 0xa69f,\n}; /* CR_Cyrillic */\n\n/* 'Armenian': Script */\nstatic const OnigCodePoint CR_Armenian[] = {\n\t6,\n\t0x0531, 0x0556,\n\t0x0559, 0x055f,\n\t0x0561, 0x0587,\n\t0x058a, 0x058a,\n\t0x058f, 0x058f,\n\t0xfb13, 0xfb17,\n}; /* CR_Armenian */\n\n/* 'Hebrew': Script */\nstatic const OnigCodePoint CR_Hebrew[] = {\n\t9,\n\t0x0591, 0x05c7,\n\t0x05d0, 0x05ea,\n\t0x05f0, 0x05f4,\n\t0xfb1d, 0xfb36,\n\t0xfb38, 0xfb3c,\n\t0xfb3e, 0xfb3e,\n\t0xfb40, 0xfb41,\n\t0xfb43, 0xfb44,\n\t0xfb46, 0xfb4f,\n}; /* CR_Hebrew */\n\n/* 'Arabic': Script */\nstatic const OnigCodePoint CR_Arabic[] = {\n\t56,\n\t0x0600, 0x0604,\n\t0x0606, 0x060b,\n\t0x060d, 0x061a,\n\t0x061e, 0x061e,\n\t0x0620, 0x063f,\n\t0x0641, 0x064a,\n\t0x0656, 0x065e,\n\t0x066a, 0x066f,\n\t0x0671, 0x06dc,\n\t0x06de, 0x06ff,\n\t0x0750, 0x077f,\n\t0x08a0, 0x08a0,\n\t0x08a2, 0x08ac,\n\t0x08e4, 0x08fe,\n\t0xfb50, 0xfbc1,\n\t0xfbd3, 0xfd3d,\n\t0xfd50, 0xfd8f,\n\t0xfd92, 0xfdc7,\n\t0xfdf0, 0xfdfc,\n\t0xfe70, 0xfe74,\n\t0xfe76, 0xfefc,\n\t0x10e60, 0x10e7e,\n\t0x1ee00, 0x1ee03,\n\t0x1ee05, 0x1ee1f,\n\t0x1ee21, 0x1ee22,\n\t0x1ee24, 0x1ee24,\n\t0x1ee27, 0x1ee27,\n\t0x1ee29, 0x1ee32,\n\t0x1ee34, 0x1ee37,\n\t0x1ee39, 0x1ee39,\n\t0x1ee3b, 0x1ee3b,\n\t0x1ee42, 0x1ee42,\n\t0x1ee47, 0x1ee47,\n\t0x1ee49, 0x1ee49,\n\t0x1ee4b, 0x1ee4b,\n\t0x1ee4d, 0x1ee4f,\n\t0x1ee51, 0x1ee52,\n\t0x1ee54, 0x1ee54,\n\t0x1ee57, 0x1ee57,\n\t0x1ee59, 0x1ee59,\n\t0x1ee5b, 0x1ee5b,\n\t0x1ee5d, 0x1ee5d,\n\t0x1ee5f, 0x1ee5f,\n\t0x1ee61, 0x1ee62,\n\t0x1ee64, 0x1ee64,\n\t0x1ee67, 0x1ee6a,\n\t0x1ee6c, 0x1ee72,\n\t0x1ee74, 0x1ee77,\n\t0x1ee79, 0x1ee7c,\n\t0x1ee7e, 0x1ee7e,\n\t0x1ee80, 0x1ee89,\n\t0x1ee8b, 0x1ee9b,\n\t0x1eea1, 0x1eea3,\n\t0x1eea5, 0x1eea9,\n\t0x1eeab, 0x1eebb,\n\t0x1eef0, 0x1eef1,\n}; /* CR_Arabic */\n\n/* 'Syriac': Script */\nstatic const OnigCodePoint CR_Syriac[] = {\n\t3,\n\t0x0700, 0x070d,\n\t0x070f, 0x074a,\n\t0x074d, 0x074f,\n}; /* CR_Syriac */\n\n/* 'Thaana': Script */\nstatic const OnigCodePoint CR_Thaana[] = {\n\t1,\n\t0x0780, 0x07b1,\n}; /* CR_Thaana */\n\n/* 'Devanagari': Script */\nstatic const OnigCodePoint CR_Devanagari[] = {\n\t5,\n\t0x0900, 0x0950,\n\t0x0953, 0x0963,\n\t0x0966, 0x0977,\n\t0x0979, 0x097f,\n\t0xa8e0, 0xa8fb,\n}; /* CR_Devanagari */\n\n/* 'Bengali': Script */\nstatic const OnigCodePoint CR_Bengali[] = {\n\t14,\n\t0x0981, 0x0983,\n\t0x0985, 0x098c,\n\t0x098f, 0x0990,\n\t0x0993, 0x09a8,\n\t0x09aa, 0x09b0,\n\t0x09b2, 0x09b2,\n\t0x09b6, 0x09b9,\n\t0x09bc, 0x09c4,\n\t0x09c7, 0x09c8,\n\t0x09cb, 0x09ce,\n\t0x09d7, 0x09d7,\n\t0x09dc, 0x09dd,\n\t0x09df, 0x09e3,\n\t0x09e6, 0x09fb,\n}; /* CR_Bengali */\n\n/* 'Gurmukhi': Script */\nstatic const OnigCodePoint CR_Gurmukhi[] = {\n\t16,\n\t0x0a01, 0x0a03,\n\t0x0a05, 0x0a0a,\n\t0x0a0f, 0x0a10,\n\t0x0a13, 0x0a28,\n\t0x0a2a, 0x0a30,\n\t0x0a32, 0x0a33,\n\t0x0a35, 0x0a36,\n\t0x0a38, 0x0a39,\n\t0x0a3c, 0x0a3c,\n\t0x0a3e, 0x0a42,\n\t0x0a47, 0x0a48,\n\t0x0a4b, 0x0a4d,\n\t0x0a51, 0x0a51,\n\t0x0a59, 0x0a5c,\n\t0x0a5e, 0x0a5e,\n\t0x0a66, 0x0a75,\n}; /* CR_Gurmukhi */\n\n/* 'Gujarati': Script */\nstatic const OnigCodePoint CR_Gujarati[] = {\n\t13,\n\t0x0a81, 0x0a83,\n\t0x0a85, 0x0a8d,\n\t0x0a8f, 0x0a91,\n\t0x0a93, 0x0aa8,\n\t0x0aaa, 0x0ab0,\n\t0x0ab2, 0x0ab3,\n\t0x0ab5, 0x0ab9,\n\t0x0abc, 0x0ac5,\n\t0x0ac7, 0x0ac9,\n\t0x0acb, 0x0acd,\n\t0x0ad0, 0x0ad0,\n\t0x0ae0, 0x0ae3,\n\t0x0ae6, 0x0af1,\n}; /* CR_Gujarati */\n\n/* 'Oriya': Script */\nstatic const OnigCodePoint CR_Oriya[] = {\n\t14,\n\t0x0b01, 0x0b03,\n\t0x0b05, 0x0b0c,\n\t0x0b0f, 0x0b10,\n\t0x0b13, 0x0b28,\n\t0x0b2a, 0x0b30,\n\t0x0b32, 0x0b33,\n\t0x0b35, 0x0b39,\n\t0x0b3c, 0x0b44,\n\t0x0b47, 0x0b48,\n\t0x0b4b, 0x0b4d,\n\t0x0b56, 0x0b57,\n\t0x0b5c, 0x0b5d,\n\t0x0b5f, 0x0b63,\n\t0x0b66, 0x0b77,\n}; /* CR_Oriya */\n\n/* 'Tamil': Script */\nstatic const OnigCodePoint CR_Tamil[] = {\n\t16,\n\t0x0b82, 0x0b83,\n\t0x0b85, 0x0b8a,\n\t0x0b8e, 0x0b90,\n\t0x0b92, 0x0b95,\n\t0x0b99, 0x0b9a,\n\t0x0b9c, 0x0b9c,\n\t0x0b9e, 0x0b9f,\n\t0x0ba3, 0x0ba4,\n\t0x0ba8, 0x0baa,\n\t0x0bae, 0x0bb9,\n\t0x0bbe, 0x0bc2,\n\t0x0bc6, 0x0bc8,\n\t0x0bca, 0x0bcd,\n\t0x0bd0, 0x0bd0,\n\t0x0bd7, 0x0bd7,\n\t0x0be6, 0x0bfa,\n}; /* CR_Tamil */\n\n/* 'Telugu': Script */\nstatic const OnigCodePoint CR_Telugu[] = {\n\t14,\n\t0x0c01, 0x0c03,\n\t0x0c05, 0x0c0c,\n\t0x0c0e, 0x0c10,\n\t0x0c12, 0x0c28,\n\t0x0c2a, 0x0c33,\n\t0x0c35, 0x0c39,\n\t0x0c3d, 0x0c44,\n\t0x0c46, 0x0c48,\n\t0x0c4a, 0x0c4d,\n\t0x0c55, 0x0c56,\n\t0x0c58, 0x0c59,\n\t0x0c60, 0x0c63,\n\t0x0c66, 0x0c6f,\n\t0x0c78, 0x0c7f,\n}; /* CR_Telugu */\n\n/* 'Kannada': Script */\nstatic const OnigCodePoint CR_Kannada[] = {\n\t14,\n\t0x0c82, 0x0c83,\n\t0x0c85, 0x0c8c,\n\t0x0c8e, 0x0c90,\n\t0x0c92, 0x0ca8,\n\t0x0caa, 0x0cb3,\n\t0x0cb5, 0x0cb9,\n\t0x0cbc, 0x0cc4,\n\t0x0cc6, 0x0cc8,\n\t0x0cca, 0x0ccd,\n\t0x0cd5, 0x0cd6,\n\t0x0cde, 0x0cde,\n\t0x0ce0, 0x0ce3,\n\t0x0ce6, 0x0cef,\n\t0x0cf1, 0x0cf2,\n}; /* CR_Kannada */\n\n/* 'Malayalam': Script */\nstatic const OnigCodePoint CR_Malayalam[] = {\n\t11,\n\t0x0d02, 0x0d03,\n\t0x0d05, 0x0d0c,\n\t0x0d0e, 0x0d10,\n\t0x0d12, 0x0d3a,\n\t0x0d3d, 0x0d44,\n\t0x0d46, 0x0d48,\n\t0x0d4a, 0x0d4e,\n\t0x0d57, 0x0d57,\n\t0x0d60, 0x0d63,\n\t0x0d66, 0x0d75,\n\t0x0d79, 0x0d7f,\n}; /* CR_Malayalam */\n\n/* 'Sinhala': Script */\nstatic const OnigCodePoint CR_Sinhala[] = {\n\t11,\n\t0x0d82, 0x0d83,\n\t0x0d85, 0x0d96,\n\t0x0d9a, 0x0db1,\n\t0x0db3, 0x0dbb,\n\t0x0dbd, 0x0dbd,\n\t0x0dc0, 0x0dc6,\n\t0x0dca, 0x0dca,\n\t0x0dcf, 0x0dd4,\n\t0x0dd6, 0x0dd6,\n\t0x0dd8, 0x0ddf,\n\t0x0df2, 0x0df4,\n}; /* CR_Sinhala */\n\n/* 'Thai': Script */\nstatic const OnigCodePoint CR_Thai[] = {\n\t2,\n\t0x0e01, 0x0e3a,\n\t0x0e40, 0x0e5b,\n}; /* CR_Thai */\n\n/* 'Lao': Script */\nstatic const OnigCodePoint CR_Lao[] = {\n\t18,\n\t0x0e81, 0x0e82,\n\t0x0e84, 0x0e84,\n\t0x0e87, 0x0e88,\n\t0x0e8a, 0x0e8a,\n\t0x0e8d, 0x0e8d,\n\t0x0e94, 0x0e97,\n\t0x0e99, 0x0e9f,\n\t0x0ea1, 0x0ea3,\n\t0x0ea5, 0x0ea5,\n\t0x0ea7, 0x0ea7,\n\t0x0eaa, 0x0eab,\n\t0x0ead, 0x0eb9,\n\t0x0ebb, 0x0ebd,\n\t0x0ec0, 0x0ec4,\n\t0x0ec6, 0x0ec6,\n\t0x0ec8, 0x0ecd,\n\t0x0ed0, 0x0ed9,\n\t0x0edc, 0x0edf,\n}; /* CR_Lao */\n\n/* 'Tibetan': Script */\nstatic const OnigCodePoint CR_Tibetan[] = {\n\t7,\n\t0x0f00, 0x0f47,\n\t0x0f49, 0x0f6c,\n\t0x0f71, 0x0f97,\n\t0x0f99, 0x0fbc,\n\t0x0fbe, 0x0fcc,\n\t0x0fce, 0x0fd4,\n\t0x0fd9, 0x0fda,\n}; /* CR_Tibetan */\n\n/* 'Myanmar': Script */\nstatic const OnigCodePoint CR_Myanmar[] = {\n\t2,\n\t0x1000, 0x109f,\n\t0xaa60, 0xaa7b,\n}; /* CR_Myanmar */\n\n/* 'Georgian': Script */\nstatic const OnigCodePoint CR_Georgian[] = {\n\t8,\n\t0x10a0, 0x10c5,\n\t0x10c7, 0x10c7,\n\t0x10cd, 0x10cd,\n\t0x10d0, 0x10fa,\n\t0x10fc, 0x10ff,\n\t0x2d00, 0x2d25,\n\t0x2d27, 0x2d27,\n\t0x2d2d, 0x2d2d,\n}; /* CR_Georgian */\n\n/* 'Hangul': Script */\nstatic const OnigCodePoint CR_Hangul[] = {\n\t14,\n\t0x1100, 0x11ff,\n\t0x302e, 0x302f,\n\t0x3131, 0x318e,\n\t0x3200, 0x321e,\n\t0x3260, 0x327e,\n\t0xa960, 0xa97c,\n\t0xac00, 0xd7a3,\n\t0xd7b0, 0xd7c6,\n\t0xd7cb, 0xd7fb,\n\t0xffa0, 0xffbe,\n\t0xffc2, 0xffc7,\n\t0xffca, 0xffcf,\n\t0xffd2, 0xffd7,\n\t0xffda, 0xffdc,\n}; /* CR_Hangul */\n\n/* 'Ethiopic': Script */\nstatic const OnigCodePoint CR_Ethiopic[] = {\n\t32,\n\t0x1200, 0x1248,\n\t0x124a, 0x124d,\n\t0x1250, 0x1256,\n\t0x1258, 0x1258,\n\t0x125a, 0x125d,\n\t0x1260, 0x1288,\n\t0x128a, 0x128d,\n\t0x1290, 0x12b0,\n\t0x12b2, 0x12b5,\n\t0x12b8, 0x12be,\n\t0x12c0, 0x12c0,\n\t0x12c2, 0x12c5,\n\t0x12c8, 0x12d6,\n\t0x12d8, 0x1310,\n\t0x1312, 0x1315,\n\t0x1318, 0x135a,\n\t0x135d, 0x137c,\n\t0x1380, 0x1399,\n\t0x2d80, 0x2d96,\n\t0x2da0, 0x2da6,\n\t0x2da8, 0x2dae,\n\t0x2db0, 0x2db6,\n\t0x2db8, 0x2dbe,\n\t0x2dc0, 0x2dc6,\n\t0x2dc8, 0x2dce,\n\t0x2dd0, 0x2dd6,\n\t0x2dd8, 0x2dde,\n\t0xab01, 0xab06,\n\t0xab09, 0xab0e,\n\t0xab11, 0xab16,\n\t0xab20, 0xab26,\n\t0xab28, 0xab2e,\n}; /* CR_Ethiopic */\n\n/* 'Cherokee': Script */\nstatic const OnigCodePoint CR_Cherokee[] = {\n\t1,\n\t0x13a0, 0x13f4,\n}; /* CR_Cherokee */\n\n/* 'Canadian_Aboriginal': Script */\nstatic const OnigCodePoint CR_Canadian_Aboriginal[] = {\n\t2,\n\t0x1400, 0x167f,\n\t0x18b0, 0x18f5,\n}; /* CR_Canadian_Aboriginal */\n\n/* 'Ogham': Script */\nstatic const OnigCodePoint CR_Ogham[] = {\n\t1,\n\t0x1680, 0x169c,\n}; /* CR_Ogham */\n\n/* 'Runic': Script */\nstatic const OnigCodePoint CR_Runic[] = {\n\t2,\n\t0x16a0, 0x16ea,\n\t0x16ee, 0x16f0,\n}; /* CR_Runic */\n\n/* 'Khmer': Script */\nstatic const OnigCodePoint CR_Khmer[] = {\n\t4,\n\t0x1780, 0x17dd,\n\t0x17e0, 0x17e9,\n\t0x17f0, 0x17f9,\n\t0x19e0, 0x19ff,\n}; /* CR_Khmer */\n\n/* 'Mongolian': Script */\nstatic const OnigCodePoint CR_Mongolian[] = {\n\t6,\n\t0x1800, 0x1801,\n\t0x1804, 0x1804,\n\t0x1806, 0x180e,\n\t0x1810, 0x1819,\n\t0x1820, 0x1877,\n\t0x1880, 0x18aa,\n}; /* CR_Mongolian */\n\n/* 'Hiragana': Script */\nstatic const OnigCodePoint CR_Hiragana[] = {\n\t4,\n\t0x3041, 0x3096,\n\t0x309d, 0x309f,\n\t0x1b001, 0x1b001,\n\t0x1f200, 0x1f200,\n}; /* CR_Hiragana */\n\n/* 'Katakana': Script */\nstatic const OnigCodePoint CR_Katakana[] = {\n\t8,\n\t0x30a1, 0x30fa,\n\t0x30fd, 0x30ff,\n\t0x31f0, 0x31ff,\n\t0x32d0, 0x32fe,\n\t0x3300, 0x3357,\n\t0xff66, 0xff6f,\n\t0xff71, 0xff9d,\n\t0x1b000, 0x1b000,\n}; /* CR_Katakana */\n\n/* 'Bopomofo': Script */\nstatic const OnigCodePoint CR_Bopomofo[] = {\n\t3,\n\t0x02ea, 0x02eb,\n\t0x3105, 0x312d,\n\t0x31a0, 0x31ba,\n}; /* CR_Bopomofo */\n\n/* 'Han': Script */\nstatic const OnigCodePoint CR_Han[] = {\n\t15,\n\t0x2e80, 0x2e99,\n\t0x2e9b, 0x2ef3,\n\t0x2f00, 0x2fd5,\n\t0x3005, 0x3005,\n\t0x3007, 0x3007,\n\t0x3021, 0x3029,\n\t0x3038, 0x303b,\n\t0x3400, 0x4db5,\n\t0x4e00, 0x9fcc,\n\t0xf900, 0xfa6d,\n\t0xfa70, 0xfad9,\n\t0x20000, 0x2a6d6,\n\t0x2a700, 0x2b734,\n\t0x2b740, 0x2b81d,\n\t0x2f800, 0x2fa1d,\n}; /* CR_Han */\n\n/* 'Yi': Script */\nstatic const OnigCodePoint CR_Yi[] = {\n\t2,\n\t0xa000, 0xa48c,\n\t0xa490, 0xa4c6,\n}; /* CR_Yi */\n\n/* 'Old_Italic': Script */\nstatic const OnigCodePoint CR_Old_Italic[] = {\n\t2,\n\t0x10300, 0x1031e,\n\t0x10320, 0x10323,\n}; /* CR_Old_Italic */\n\n/* 'Gothic': Script */\nstatic const OnigCodePoint CR_Gothic[] = {\n\t1,\n\t0x10330, 0x1034a,\n}; /* CR_Gothic */\n\n/* 'Deseret': Script */\nstatic const OnigCodePoint CR_Deseret[] = {\n\t1,\n\t0x10400, 0x1044f,\n}; /* CR_Deseret */\n\n/* 'Inherited': Script */\nstatic const OnigCodePoint CR_Inherited[] = {\n\t25,\n\t0x0300, 0x036f,\n\t0x0485, 0x0486,\n\t0x064b, 0x0655,\n\t0x065f, 0x065f,\n\t0x0670, 0x0670,\n\t0x0951, 0x0952,\n\t0x1cd0, 0x1cd2,\n\t0x1cd4, 0x1ce0,\n\t0x1ce2, 0x1ce8,\n\t0x1ced, 0x1ced,\n\t0x1cf4, 0x1cf4,\n\t0x1dc0, 0x1de6,\n\t0x1dfc, 0x1dff,\n\t0x200c, 0x200d,\n\t0x20d0, 0x20f0,\n\t0x302a, 0x302d,\n\t0x3099, 0x309a,\n\t0xfe00, 0xfe0f,\n\t0xfe20, 0xfe26,\n\t0x101fd, 0x101fd,\n\t0x1d167, 0x1d169,\n\t0x1d17b, 0x1d182,\n\t0x1d185, 0x1d18b,\n\t0x1d1aa, 0x1d1ad,\n\t0xe0100, 0xe01ef,\n}; /* CR_Inherited */\n\n/* 'Tagalog': Script */\nstatic const OnigCodePoint CR_Tagalog[] = {\n\t2,\n\t0x1700, 0x170c,\n\t0x170e, 0x1714,\n}; /* CR_Tagalog */\n\n/* 'Hanunoo': Script */\nstatic const OnigCodePoint CR_Hanunoo[] = {\n\t1,\n\t0x1720, 0x1734,\n}; /* CR_Hanunoo */\n\n/* 'Buhid': Script */\nstatic const OnigCodePoint CR_Buhid[] = {\n\t1,\n\t0x1740, 0x1753,\n}; /* CR_Buhid */\n\n/* 'Tagbanwa': Script */\nstatic const OnigCodePoint CR_Tagbanwa[] = {\n\t3,\n\t0x1760, 0x176c,\n\t0x176e, 0x1770,\n\t0x1772, 0x1773,\n}; /* CR_Tagbanwa */\n\n/* 'Limbu': Script */\nstatic const OnigCodePoint CR_Limbu[] = {\n\t5,\n\t0x1900, 0x191c,\n\t0x1920, 0x192b,\n\t0x1930, 0x193b,\n\t0x1940, 0x1940,\n\t0x1944, 0x194f,\n}; /* CR_Limbu */\n\n/* 'Tai_Le': Script */\nstatic const OnigCodePoint CR_Tai_Le[] = {\n\t2,\n\t0x1950, 0x196d,\n\t0x1970, 0x1974,\n}; /* CR_Tai_Le */\n\n/* 'Linear_B': Script */\nstatic const OnigCodePoint CR_Linear_B[] = {\n\t7,\n\t0x10000, 0x1000b,\n\t0x1000d, 0x10026,\n\t0x10028, 0x1003a,\n\t0x1003c, 0x1003d,\n\t0x1003f, 0x1004d,\n\t0x10050, 0x1005d,\n\t0x10080, 0x100fa,\n}; /* CR_Linear_B */\n\n/* 'Ugaritic': Script */\nstatic const OnigCodePoint CR_Ugaritic[] = {\n\t2,\n\t0x10380, 0x1039d,\n\t0x1039f, 0x1039f,\n}; /* CR_Ugaritic */\n\n/* 'Shavian': Script */\nstatic const OnigCodePoint CR_Shavian[] = {\n\t1,\n\t0x10450, 0x1047f,\n}; /* CR_Shavian */\n\n/* 'Osmanya': Script */\nstatic const OnigCodePoint CR_Osmanya[] = {\n\t2,\n\t0x10480, 0x1049d,\n\t0x104a0, 0x104a9,\n}; /* CR_Osmanya */\n\n/* 'Cypriot': Script */\nstatic const OnigCodePoint CR_Cypriot[] = {\n\t6,\n\t0x10800, 0x10805,\n\t0x10808, 0x10808,\n\t0x1080a, 0x10835,\n\t0x10837, 0x10838,\n\t0x1083c, 0x1083c,\n\t0x1083f, 0x1083f,\n}; /* CR_Cypriot */\n\n/* 'Braille': Script */\nstatic const OnigCodePoint CR_Braille[] = {\n\t1,\n\t0x2800, 0x28ff,\n}; /* CR_Braille */\n\n/* 'Buginese': Script */\nstatic const OnigCodePoint CR_Buginese[] = {\n\t2,\n\t0x1a00, 0x1a1b,\n\t0x1a1e, 0x1a1f,\n}; /* CR_Buginese */\n\n/* 'Coptic': Script */\nstatic const OnigCodePoint CR_Coptic[] = {\n\t3,\n\t0x03e2, 0x03ef,\n\t0x2c80, 0x2cf3,\n\t0x2cf9, 0x2cff,\n}; /* CR_Coptic */\n\n/* 'New_Tai_Lue': Script */\nstatic const OnigCodePoint CR_New_Tai_Lue[] = {\n\t4,\n\t0x1980, 0x19ab,\n\t0x19b0, 0x19c9,\n\t0x19d0, 0x19da,\n\t0x19de, 0x19df,\n}; /* CR_New_Tai_Lue */\n\n/* 'Glagolitic': Script */\nstatic const OnigCodePoint CR_Glagolitic[] = {\n\t2,\n\t0x2c00, 0x2c2e,\n\t0x2c30, 0x2c5e,\n}; /* CR_Glagolitic */\n\n/* 'Tifinagh': Script */\nstatic const OnigCodePoint CR_Tifinagh[] = {\n\t3,\n\t0x2d30, 0x2d67,\n\t0x2d6f, 0x2d70,\n\t0x2d7f, 0x2d7f,\n}; /* CR_Tifinagh */\n\n/* 'Syloti_Nagri': Script */\nstatic const OnigCodePoint CR_Syloti_Nagri[] = {\n\t1,\n\t0xa800, 0xa82b,\n}; /* CR_Syloti_Nagri */\n\n/* 'Old_Persian': Script */\nstatic const OnigCodePoint CR_Old_Persian[] = {\n\t2,\n\t0x103a0, 0x103c3,\n\t0x103c8, 0x103d5,\n}; /* CR_Old_Persian */\n\n/* 'Kharoshthi': Script */\nstatic const OnigCodePoint CR_Kharoshthi[] = {\n\t8,\n\t0x10a00, 0x10a03,\n\t0x10a05, 0x10a06,\n\t0x10a0c, 0x10a13,\n\t0x10a15, 0x10a17,\n\t0x10a19, 0x10a33,\n\t0x10a38, 0x10a3a,\n\t0x10a3f, 0x10a47,\n\t0x10a50, 0x10a58,\n}; /* CR_Kharoshthi */\n\n/* 'Balinese': Script */\nstatic const OnigCodePoint CR_Balinese[] = {\n\t2,\n\t0x1b00, 0x1b4b,\n\t0x1b50, 0x1b7c,\n}; /* CR_Balinese */\n\n/* 'Cuneiform': Script */\nstatic const OnigCodePoint CR_Cuneiform[] = {\n\t3,\n\t0x12000, 0x1236e,\n\t0x12400, 0x12462,\n\t0x12470, 0x12473,\n}; /* CR_Cuneiform */\n\n/* 'Phoenician': Script */\nstatic const OnigCodePoint CR_Phoenician[] = {\n\t2,\n\t0x10900, 0x1091b,\n\t0x1091f, 0x1091f,\n}; /* CR_Phoenician */\n\n/* 'Phags_Pa': Script */\nstatic const OnigCodePoint CR_Phags_Pa[] = {\n\t1,\n\t0xa840, 0xa877,\n}; /* CR_Phags_Pa */\n\n/* 'Nko': Script */\nstatic const OnigCodePoint CR_Nko[] = {\n\t1,\n\t0x07c0, 0x07fa,\n}; /* CR_Nko */\n\n/* 'Sundanese': Script */\nstatic const OnigCodePoint CR_Sundanese[] = {\n\t2,\n\t0x1b80, 0x1bbf,\n\t0x1cc0, 0x1cc7,\n}; /* CR_Sundanese */\n\n/* 'Lepcha': Script */\nstatic const OnigCodePoint CR_Lepcha[] = {\n\t3,\n\t0x1c00, 0x1c37,\n\t0x1c3b, 0x1c49,\n\t0x1c4d, 0x1c4f,\n}; /* CR_Lepcha */\n\n/* 'Ol_Chiki': Script */\nstatic const OnigCodePoint CR_Ol_Chiki[] = {\n\t1,\n\t0x1c50, 0x1c7f,\n}; /* CR_Ol_Chiki */\n\n/* 'Vai': Script */\nstatic const OnigCodePoint CR_Vai[] = {\n\t1,\n\t0xa500, 0xa62b,\n}; /* CR_Vai */\n\n/* 'Saurashtra': Script */\nstatic const OnigCodePoint CR_Saurashtra[] = {\n\t2,\n\t0xa880, 0xa8c4,\n\t0xa8ce, 0xa8d9,\n}; /* CR_Saurashtra */\n\n/* 'Kayah_Li': Script */\nstatic const OnigCodePoint CR_Kayah_Li[] = {\n\t1,\n\t0xa900, 0xa92f,\n}; /* CR_Kayah_Li */\n\n/* 'Rejang': Script */\nstatic const OnigCodePoint CR_Rejang[] = {\n\t2,\n\t0xa930, 0xa953,\n\t0xa95f, 0xa95f,\n}; /* CR_Rejang */\n\n/* 'Lycian': Script */\nstatic const OnigCodePoint CR_Lycian[] = {\n\t1,\n\t0x10280, 0x1029c,\n}; /* CR_Lycian */\n\n/* 'Carian': Script */\nstatic const OnigCodePoint CR_Carian[] = {\n\t1,\n\t0x102a0, 0x102d0,\n}; /* CR_Carian */\n\n/* 'Lydian': Script */\nstatic const OnigCodePoint CR_Lydian[] = {\n\t2,\n\t0x10920, 0x10939,\n\t0x1093f, 0x1093f,\n}; /* CR_Lydian */\n\n/* 'Cham': Script */\nstatic const OnigCodePoint CR_Cham[] = {\n\t4,\n\t0xaa00, 0xaa36,\n\t0xaa40, 0xaa4d,\n\t0xaa50, 0xaa59,\n\t0xaa5c, 0xaa5f,\n}; /* CR_Cham */\n\n/* 'Tai_Tham': Script */\nstatic const OnigCodePoint CR_Tai_Tham[] = {\n\t5,\n\t0x1a20, 0x1a5e,\n\t0x1a60, 0x1a7c,\n\t0x1a7f, 0x1a89,\n\t0x1a90, 0x1a99,\n\t0x1aa0, 0x1aad,\n}; /* CR_Tai_Tham */\n\n/* 'Tai_Viet': Script */\nstatic const OnigCodePoint CR_Tai_Viet[] = {\n\t2,\n\t0xaa80, 0xaac2,\n\t0xaadb, 0xaadf,\n}; /* CR_Tai_Viet */\n\n/* 'Avestan': Script */\nstatic const OnigCodePoint CR_Avestan[] = {\n\t2,\n\t0x10b00, 0x10b35,\n\t0x10b39, 0x10b3f,\n}; /* CR_Avestan */\n\n/* 'Egyptian_Hieroglyphs': Script */\nstatic const OnigCodePoint CR_Egyptian_Hieroglyphs[] = {\n\t1,\n\t0x13000, 0x1342e,\n}; /* CR_Egyptian_Hieroglyphs */\n\n/* 'Samaritan': Script */\nstatic const OnigCodePoint CR_Samaritan[] = {\n\t2,\n\t0x0800, 0x082d,\n\t0x0830, 0x083e,\n}; /* CR_Samaritan */\n\n/* 'Lisu': Script */\nstatic const OnigCodePoint CR_Lisu[] = {\n\t1,\n\t0xa4d0, 0xa4ff,\n}; /* CR_Lisu */\n\n/* 'Bamum': Script */\nstatic const OnigCodePoint CR_Bamum[] = {\n\t2,\n\t0xa6a0, 0xa6f7,\n\t0x16800, 0x16a38,\n}; /* CR_Bamum */\n\n/* 'Javanese': Script */\nstatic const OnigCodePoint CR_Javanese[] = {\n\t3,\n\t0xa980, 0xa9cd,\n\t0xa9cf, 0xa9d9,\n\t0xa9de, 0xa9df,\n}; /* CR_Javanese */\n\n/* 'Meetei_Mayek': Script */\nstatic const OnigCodePoint CR_Meetei_Mayek[] = {\n\t3,\n\t0xaae0, 0xaaf6,\n\t0xabc0, 0xabed,\n\t0xabf0, 0xabf9,\n}; /* CR_Meetei_Mayek */\n\n/* 'Imperial_Aramaic': Script */\nstatic const OnigCodePoint CR_Imperial_Aramaic[] = {\n\t2,\n\t0x10840, 0x10855,\n\t0x10857, 0x1085f,\n}; /* CR_Imperial_Aramaic */\n\n/* 'Old_South_Arabian': Script */\nstatic const OnigCodePoint CR_Old_South_Arabian[] = {\n\t1,\n\t0x10a60, 0x10a7f,\n}; /* CR_Old_South_Arabian */\n\n/* 'Inscriptional_Parthian': Script */\nstatic const OnigCodePoint CR_Inscriptional_Parthian[] = {\n\t2,\n\t0x10b40, 0x10b55,\n\t0x10b58, 0x10b5f,\n}; /* CR_Inscriptional_Parthian */\n\n/* 'Inscriptional_Pahlavi': Script */\nstatic const OnigCodePoint CR_Inscriptional_Pahlavi[] = {\n\t2,\n\t0x10b60, 0x10b72,\n\t0x10b78, 0x10b7f,\n}; /* CR_Inscriptional_Pahlavi */\n\n/* 'Old_Turkic': Script */\nstatic const OnigCodePoint CR_Old_Turkic[] = {\n\t1,\n\t0x10c00, 0x10c48,\n}; /* CR_Old_Turkic */\n\n/* 'Kaithi': Script */\nstatic const OnigCodePoint CR_Kaithi[] = {\n\t1,\n\t0x11080, 0x110c1,\n}; /* CR_Kaithi */\n\n/* 'Batak': Script */\nstatic const OnigCodePoint CR_Batak[] = {\n\t2,\n\t0x1bc0, 0x1bf3,\n\t0x1bfc, 0x1bff,\n}; /* CR_Batak */\n\n/* 'Brahmi': Script */\nstatic const OnigCodePoint CR_Brahmi[] = {\n\t2,\n\t0x11000, 0x1104d,\n\t0x11052, 0x1106f,\n}; /* CR_Brahmi */\n\n/* 'Mandaic': Script */\nstatic const OnigCodePoint CR_Mandaic[] = {\n\t2,\n\t0x0840, 0x085b,\n\t0x085e, 0x085e,\n}; /* CR_Mandaic */\n\n/* 'Chakma': Script */\nstatic const OnigCodePoint CR_Chakma[] = {\n\t2,\n\t0x11100, 0x11134,\n\t0x11136, 0x11143,\n}; /* CR_Chakma */\n\n/* 'Meroitic_Cursive': Script */\nstatic const OnigCodePoint CR_Meroitic_Cursive[] = {\n\t2,\n\t0x109a0, 0x109b7,\n\t0x109be, 0x109bf,\n}; /* CR_Meroitic_Cursive */\n\n/* 'Meroitic_Hieroglyphs': Script */\nstatic const OnigCodePoint CR_Meroitic_Hieroglyphs[] = {\n\t1,\n\t0x10980, 0x1099f,\n}; /* CR_Meroitic_Hieroglyphs */\n\n/* 'Miao': Script */\nstatic const OnigCodePoint CR_Miao[] = {\n\t3,\n\t0x16f00, 0x16f44,\n\t0x16f50, 0x16f7e,\n\t0x16f8f, 0x16f9f,\n}; /* CR_Miao */\n\n/* 'Sharada': Script */\nstatic const OnigCodePoint CR_Sharada[] = {\n\t2,\n\t0x11180, 0x111c8,\n\t0x111d0, 0x111d9,\n}; /* CR_Sharada */\n\n/* 'Sora_Sompeng': Script */\nstatic const OnigCodePoint CR_Sora_Sompeng[] = {\n\t2,\n\t0x110d0, 0x110e8,\n\t0x110f0, 0x110f9,\n}; /* CR_Sora_Sompeng */\n\n/* 'Takri': Script */\nstatic const OnigCodePoint CR_Takri[] = {\n\t2,\n\t0x11680, 0x116b7,\n\t0x116c0, 0x116c9,\n}; /* CR_Takri */\n\n/* 'White_Space': Binary Property */\n#define CR_White_Space CR_Space\n\n/* 'Bidi_Control': Binary Property */\nstatic const OnigCodePoint CR_Bidi_Control[] = {\n\t2,\n\t0x200e, 0x200f,\n\t0x202a, 0x202e,\n}; /* CR_Bidi_Control */\n\n/* 'Join_Control': Binary Property */\nstatic const OnigCodePoint CR_Join_Control[] = {\n\t1,\n\t0x200c, 0x200d,\n}; /* CR_Join_Control */\n\n/* 'Dash': Binary Property */\nstatic const OnigCodePoint CR_Dash[] = {\n\t20,\n\t0x002d, 0x002d,\n\t0x058a, 0x058a,\n\t0x05be, 0x05be,\n\t0x1400, 0x1400,\n\t0x1806, 0x1806,\n\t0x2010, 0x2015,\n\t0x2053, 0x2053,\n\t0x207b, 0x207b,\n\t0x208b, 0x208b,\n\t0x2212, 0x2212,\n\t0x2e17, 0x2e17,\n\t0x2e1a, 0x2e1a,\n\t0x2e3a, 0x2e3b,\n\t0x301c, 0x301c,\n\t0x3030, 0x3030,\n\t0x30a0, 0x30a0,\n\t0xfe31, 0xfe32,\n\t0xfe58, 0xfe58,\n\t0xfe63, 0xfe63,\n\t0xff0d, 0xff0d,\n}; /* CR_Dash */\n\n/* 'Hyphen': Binary Property */\nstatic const OnigCodePoint CR_Hyphen[] = {\n\t10,\n\t0x002d, 0x002d,\n\t0x00ad, 0x00ad,\n\t0x058a, 0x058a,\n\t0x1806, 0x1806,\n\t0x2010, 0x2011,\n\t0x2e17, 0x2e17,\n\t0x30fb, 0x30fb,\n\t0xfe63, 0xfe63,\n\t0xff0d, 0xff0d,\n\t0xff65, 0xff65,\n}; /* CR_Hyphen */\n\n/* 'Quotation_Mark': Binary Property */\nstatic const OnigCodePoint CR_Quotation_Mark[] = {\n\t12,\n\t0x0022, 0x0022,\n\t0x0027, 0x0027,\n\t0x00ab, 0x00ab,\n\t0x00bb, 0x00bb,\n\t0x2018, 0x201f,\n\t0x2039, 0x203a,\n\t0x300c, 0x300f,\n\t0x301d, 0x301f,\n\t0xfe41, 0xfe44,\n\t0xff02, 0xff02,\n\t0xff07, 0xff07,\n\t0xff62, 0xff63,\n}; /* CR_Quotation_Mark */\n\n/* 'Terminal_Punctuation': Binary Property */\nstatic const OnigCodePoint CR_Terminal_Punctuation[] = {\n\t70,\n\t0x0021, 0x0021,\n\t0x002c, 0x002c,\n\t0x002e, 0x002e,\n\t0x003a, 0x003b,\n\t0x003f, 0x003f,\n\t0x037e, 0x037e,\n\t0x0387, 0x0387,\n\t0x0589, 0x0589,\n\t0x05c3, 0x05c3,\n\t0x060c, 0x060c,\n\t0x061b, 0x061b,\n\t0x061f, 0x061f,\n\t0x06d4, 0x06d4,\n\t0x0700, 0x070a,\n\t0x070c, 0x070c,\n\t0x07f8, 0x07f9,\n\t0x0830, 0x083e,\n\t0x085e, 0x085e,\n\t0x0964, 0x0965,\n\t0x0e5a, 0x0e5b,\n\t0x0f08, 0x0f08,\n\t0x0f0d, 0x0f12,\n\t0x104a, 0x104b,\n\t0x1361, 0x1368,\n\t0x166d, 0x166e,\n\t0x16eb, 0x16ed,\n\t0x17d4, 0x17d6,\n\t0x17da, 0x17da,\n\t0x1802, 0x1805,\n\t0x1808, 0x1809,\n\t0x1944, 0x1945,\n\t0x1aa8, 0x1aab,\n\t0x1b5a, 0x1b5b,\n\t0x1b5d, 0x1b5f,\n\t0x1c3b, 0x1c3f,\n\t0x1c7e, 0x1c7f,\n\t0x203c, 0x203d,\n\t0x2047, 0x2049,\n\t0x2e2e, 0x2e2e,\n\t0x3001, 0x3002,\n\t0xa4fe, 0xa4ff,\n\t0xa60d, 0xa60f,\n\t0xa6f3, 0xa6f7,\n\t0xa876, 0xa877,\n\t0xa8ce, 0xa8cf,\n\t0xa92f, 0xa92f,\n\t0xa9c7, 0xa9c9,\n\t0xaa5d, 0xaa5f,\n\t0xaadf, 0xaadf,\n\t0xaaf0, 0xaaf1,\n\t0xabeb, 0xabeb,\n\t0xfe50, 0xfe52,\n\t0xfe54, 0xfe57,\n\t0xff01, 0xff01,\n\t0xff0c, 0xff0c,\n\t0xff0e, 0xff0e,\n\t0xff1a, 0xff1b,\n\t0xff1f, 0xff1f,\n\t0xff61, 0xff61,\n\t0xff64, 0xff64,\n\t0x1039f, 0x1039f,\n\t0x103d0, 0x103d0,\n\t0x10857, 0x10857,\n\t0x1091f, 0x1091f,\n\t0x10b3a, 0x10b3f,\n\t0x11047, 0x1104d,\n\t0x110be, 0x110c1,\n\t0x11141, 0x11143,\n\t0x111c5, 0x111c6,\n\t0x12470, 0x12473,\n}; /* CR_Terminal_Punctuation */\n\n/* 'Other_Math': Binary Property */\nstatic const OnigCodePoint CR_Other_Math[] = {\n\t133,\n\t0x005e, 0x005e,\n\t0x03d0, 0x03d2,\n\t0x03d5, 0x03d5,\n\t0x03f0, 0x03f1,\n\t0x03f4, 0x03f5,\n\t0x2016, 0x2016,\n\t0x2032, 0x2034,\n\t0x2040, 0x2040,\n\t0x2061, 0x2064,\n\t0x207d, 0x207e,\n\t0x208d, 0x208e,\n\t0x20d0, 0x20dc,\n\t0x20e1, 0x20e1,\n\t0x20e5, 0x20e6,\n\t0x20eb, 0x20ef,\n\t0x2102, 0x2102,\n\t0x2107, 0x2107,\n\t0x210a, 0x2113,\n\t0x2115, 0x2115,\n\t0x2119, 0x211d,\n\t0x2124, 0x2124,\n\t0x2128, 0x2129,\n\t0x212c, 0x212d,\n\t0x212f, 0x2131,\n\t0x2133, 0x2138,\n\t0x213c, 0x213f,\n\t0x2145, 0x2149,\n\t0x2195, 0x2199,\n\t0x219c, 0x219f,\n\t0x21a1, 0x21a2,\n\t0x21a4, 0x21a5,\n\t0x21a7, 0x21a7,\n\t0x21a9, 0x21ad,\n\t0x21b0, 0x21b1,\n\t0x21b6, 0x21b7,\n\t0x21bc, 0x21cd,\n\t0x21d0, 0x21d1,\n\t0x21d3, 0x21d3,\n\t0x21d5, 0x21db,\n\t0x21dd, 0x21dd,\n\t0x21e4, 0x21e5,\n\t0x23b4, 0x23b5,\n\t0x23b7, 0x23b7,\n\t0x23d0, 0x23d0,\n\t0x23e2, 0x23e2,\n\t0x25a0, 0x25a1,\n\t0x25ae, 0x25b6,\n\t0x25bc, 0x25c0,\n\t0x25c6, 0x25c7,\n\t0x25ca, 0x25cb,\n\t0x25cf, 0x25d3,\n\t0x25e2, 0x25e2,\n\t0x25e4, 0x25e4,\n\t0x25e7, 0x25ec,\n\t0x2605, 0x2606,\n\t0x2640, 0x2640,\n\t0x2642, 0x2642,\n\t0x2660, 0x2663,\n\t0x266d, 0x266e,\n\t0x27c5, 0x27c6,\n\t0x27e6, 0x27ef,\n\t0x2983, 0x2998,\n\t0x29d8, 0x29db,\n\t0x29fc, 0x29fd,\n\t0xfe61, 0xfe61,\n\t0xfe63, 0xfe63,\n\t0xfe68, 0xfe68,\n\t0xff3c, 0xff3c,\n\t0xff3e, 0xff3e,\n\t0x1d400, 0x1d454,\n\t0x1d456, 0x1d49c,\n\t0x1d49e, 0x1d49f,\n\t0x1d4a2, 0x1d4a2,\n\t0x1d4a5, 0x1d4a6,\n\t0x1d4a9, 0x1d4ac,\n\t0x1d4ae, 0x1d4b9,\n\t0x1d4bb, 0x1d4bb,\n\t0x1d4bd, 0x1d4c3,\n\t0x1d4c5, 0x1d505,\n\t0x1d507, 0x1d50a,\n\t0x1d50d, 0x1d514,\n\t0x1d516, 0x1d51c,\n\t0x1d51e, 0x1d539,\n\t0x1d53b, 0x1d53e,\n\t0x1d540, 0x1d544,\n\t0x1d546, 0x1d546,\n\t0x1d54a, 0x1d550,\n\t0x1d552, 0x1d6a5,\n\t0x1d6a8, 0x1d6c0,\n\t0x1d6c2, 0x1d6da,\n\t0x1d6dc, 0x1d6fa,\n\t0x1d6fc, 0x1d714,\n\t0x1d716, 0x1d734,\n\t0x1d736, 0x1d74e,\n\t0x1d750, 0x1d76e,\n\t0x1d770, 0x1d788,\n\t0x1d78a, 0x1d7a8,\n\t0x1d7aa, 0x1d7c2,\n\t0x1d7c4, 0x1d7cb,\n\t0x1d7ce, 0x1d7ff,\n\t0x1ee00, 0x1ee03,\n\t0x1ee05, 0x1ee1f,\n\t0x1ee21, 0x1ee22,\n\t0x1ee24, 0x1ee24,\n\t0x1ee27, 0x1ee27,\n\t0x1ee29, 0x1ee32,\n\t0x1ee34, 0x1ee37,\n\t0x1ee39, 0x1ee39,\n\t0x1ee3b, 0x1ee3b,\n\t0x1ee42, 0x1ee42,\n\t0x1ee47, 0x1ee47,\n\t0x1ee49, 0x1ee49,\n\t0x1ee4b, 0x1ee4b,\n\t0x1ee4d, 0x1ee4f,\n\t0x1ee51, 0x1ee52,\n\t0x1ee54, 0x1ee54,\n\t0x1ee57, 0x1ee57,\n\t0x1ee59, 0x1ee59,\n\t0x1ee5b, 0x1ee5b,\n\t0x1ee5d, 0x1ee5d,\n\t0x1ee5f, 0x1ee5f,\n\t0x1ee61, 0x1ee62,\n\t0x1ee64, 0x1ee64,\n\t0x1ee67, 0x1ee6a,\n\t0x1ee6c, 0x1ee72,\n\t0x1ee74, 0x1ee77,\n\t0x1ee79, 0x1ee7c,\n\t0x1ee7e, 0x1ee7e,\n\t0x1ee80, 0x1ee89,\n\t0x1ee8b, 0x1ee9b,\n\t0x1eea1, 0x1eea3,\n\t0x1eea5, 0x1eea9,\n\t0x1eeab, 0x1eebb,\n}; /* CR_Other_Math */\n\n/* 'Hex_Digit': Binary Property */\nstatic const OnigCodePoint CR_Hex_Digit[] = {\n\t6,\n\t0x0030, 0x0039,\n\t0x0041, 0x0046,\n\t0x0061, 0x0066,\n\t0xff10, 0xff19,\n\t0xff21, 0xff26,\n\t0xff41, 0xff46,\n}; /* CR_Hex_Digit */\n\n/* 'ASCII_Hex_Digit': Binary Property */\n#define CR_ASCII_Hex_Digit CR_XDigit\n\n/* 'Other_Alphabetic': Binary Property */\nstatic const OnigCodePoint CR_Other_Alphabetic[] = {\n\t158,\n\t0x0345, 0x0345,\n\t0x05b0, 0x05bd,\n\t0x05bf, 0x05bf,\n\t0x05c1, 0x05c2,\n\t0x05c4, 0x05c5,\n\t0x05c7, 0x05c7,\n\t0x0610, 0x061a,\n\t0x064b, 0x0657,\n\t0x0659, 0x065f,\n\t0x0670, 0x0670,\n\t0x06d6, 0x06dc,\n\t0x06e1, 0x06e4,\n\t0x06e7, 0x06e8,\n\t0x06ed, 0x06ed,\n\t0x0711, 0x0711,\n\t0x0730, 0x073f,\n\t0x07a6, 0x07b0,\n\t0x0816, 0x0817,\n\t0x081b, 0x0823,\n\t0x0825, 0x0827,\n\t0x0829, 0x082c,\n\t0x08e4, 0x08e9,\n\t0x08f0, 0x08fe,\n\t0x0900, 0x0903,\n\t0x093a, 0x093b,\n\t0x093e, 0x094c,\n\t0x094e, 0x094f,\n\t0x0955, 0x0957,\n\t0x0962, 0x0963,\n\t0x0981, 0x0983,\n\t0x09be, 0x09c4,\n\t0x09c7, 0x09c8,\n\t0x09cb, 0x09cc,\n\t0x09d7, 0x09d7,\n\t0x09e2, 0x09e3,\n\t0x0a01, 0x0a03,\n\t0x0a3e, 0x0a42,\n\t0x0a47, 0x0a48,\n\t0x0a4b, 0x0a4c,\n\t0x0a51, 0x0a51,\n\t0x0a70, 0x0a71,\n\t0x0a75, 0x0a75,\n\t0x0a81, 0x0a83,\n\t0x0abe, 0x0ac5,\n\t0x0ac7, 0x0ac9,\n\t0x0acb, 0x0acc,\n\t0x0ae2, 0x0ae3,\n\t0x0b01, 0x0b03,\n\t0x0b3e, 0x0b44,\n\t0x0b47, 0x0b48,\n\t0x0b4b, 0x0b4c,\n\t0x0b56, 0x0b57,\n\t0x0b62, 0x0b63,\n\t0x0b82, 0x0b82,\n\t0x0bbe, 0x0bc2,\n\t0x0bc6, 0x0bc8,\n\t0x0bca, 0x0bcc,\n\t0x0bd7, 0x0bd7,\n\t0x0c01, 0x0c03,\n\t0x0c3e, 0x0c44,\n\t0x0c46, 0x0c48,\n\t0x0c4a, 0x0c4c,\n\t0x0c55, 0x0c56,\n\t0x0c62, 0x0c63,\n\t0x0c82, 0x0c83,\n\t0x0cbe, 0x0cc4,\n\t0x0cc6, 0x0cc8,\n\t0x0cca, 0x0ccc,\n\t0x0cd5, 0x0cd6,\n\t0x0ce2, 0x0ce3,\n\t0x0d02, 0x0d03,\n\t0x0d3e, 0x0d44,\n\t0x0d46, 0x0d48,\n\t0x0d4a, 0x0d4c,\n\t0x0d57, 0x0d57,\n\t0x0d62, 0x0d63,\n\t0x0d82, 0x0d83,\n\t0x0dcf, 0x0dd4,\n\t0x0dd6, 0x0dd6,\n\t0x0dd8, 0x0ddf,\n\t0x0df2, 0x0df3,\n\t0x0e31, 0x0e31,\n\t0x0e34, 0x0e3a,\n\t0x0e4d, 0x0e4d,\n\t0x0eb1, 0x0eb1,\n\t0x0eb4, 0x0eb9,\n\t0x0ebb, 0x0ebc,\n\t0x0ecd, 0x0ecd,\n\t0x0f71, 0x0f81,\n\t0x0f8d, 0x0f97,\n\t0x0f99, 0x0fbc,\n\t0x102b, 0x1036,\n\t0x1038, 0x1038,\n\t0x103b, 0x103e,\n\t0x1056, 0x1059,\n\t0x105e, 0x1060,\n\t0x1062, 0x1062,\n\t0x1067, 0x1068,\n\t0x1071, 0x1074,\n\t0x1082, 0x1086,\n\t0x109c, 0x109d,\n\t0x135f, 0x135f,\n\t0x1712, 0x1713,\n\t0x1732, 0x1733,\n\t0x1752, 0x1753,\n\t0x1772, 0x1773,\n\t0x17b6, 0x17c8,\n\t0x18a9, 0x18a9,\n\t0x1920, 0x192b,\n\t0x1930, 0x1938,\n\t0x19b0, 0x19c0,\n\t0x19c8, 0x19c9,\n\t0x1a17, 0x1a1b,\n\t0x1a55, 0x1a5e,\n\t0x1a61, 0x1a74,\n\t0x1b00, 0x1b04,\n\t0x1b35, 0x1b43,\n\t0x1b80, 0x1b82,\n\t0x1ba1, 0x1ba9,\n\t0x1bac, 0x1bad,\n\t0x1be7, 0x1bf1,\n\t0x1c24, 0x1c35,\n\t0x1cf2, 0x1cf3,\n\t0x24b6, 0x24e9,\n\t0x2de0, 0x2dff,\n\t0xa674, 0xa67b,\n\t0xa69f, 0xa69f,\n\t0xa823, 0xa827,\n\t0xa880, 0xa881,\n\t0xa8b4, 0xa8c3,\n\t0xa926, 0xa92a,\n\t0xa947, 0xa952,\n\t0xa980, 0xa983,\n\t0xa9b4, 0xa9bf,\n\t0xaa29, 0xaa36,\n\t0xaa43, 0xaa43,\n\t0xaa4c, 0xaa4d,\n\t0xaab0, 0xaab0,\n\t0xaab2, 0xaab4,\n\t0xaab7, 0xaab8,\n\t0xaabe, 0xaabe,\n\t0xaaeb, 0xaaef,\n\t0xaaf5, 0xaaf5,\n\t0xabe3, 0xabea,\n\t0xfb1e, 0xfb1e,\n\t0x10a01, 0x10a03,\n\t0x10a05, 0x10a06,\n\t0x10a0c, 0x10a0f,\n\t0x11000, 0x11002,\n\t0x11038, 0x11045,\n\t0x11082, 0x11082,\n\t0x110b0, 0x110b8,\n\t0x11100, 0x11102,\n\t0x11127, 0x11132,\n\t0x11180, 0x11182,\n\t0x111b3, 0x111bf,\n\t0x116ab, 0x116b5,\n\t0x16f51, 0x16f7e,\n}; /* CR_Other_Alphabetic */\n\n/* 'Ideographic': Binary Property */\nstatic const OnigCodePoint CR_Ideographic[] = {\n\t11,\n\t0x3006, 0x3007,\n\t0x3021, 0x3029,\n\t0x3038, 0x303a,\n\t0x3400, 0x4db5,\n\t0x4e00, 0x9fcc,\n\t0xf900, 0xfa6d,\n\t0xfa70, 0xfad9,\n\t0x20000, 0x2a6d6,\n\t0x2a700, 0x2b734,\n\t0x2b740, 0x2b81d,\n\t0x2f800, 0x2fa1d,\n}; /* CR_Ideographic */\n\n/* 'Diacritic': Binary Property */\nstatic const OnigCodePoint CR_Diacritic[] = {\n\t125,\n\t0x005e, 0x005e,\n\t0x0060, 0x0060,\n\t0x00a8, 0x00a8,\n\t0x00af, 0x00af,\n\t0x00b4, 0x00b4,\n\t0x00b7, 0x00b8,\n\t0x02b0, 0x034e,\n\t0x0350, 0x0357,\n\t0x035d, 0x0362,\n\t0x0374, 0x0375,\n\t0x037a, 0x037a,\n\t0x0384, 0x0385,\n\t0x0483, 0x0487,\n\t0x0559, 0x0559,\n\t0x0591, 0x05a1,\n\t0x05a3, 0x05bd,\n\t0x05bf, 0x05bf,\n\t0x05c1, 0x05c2,\n\t0x05c4, 0x05c4,\n\t0x064b, 0x0652,\n\t0x0657, 0x0658,\n\t0x06df, 0x06e0,\n\t0x06e5, 0x06e6,\n\t0x06ea, 0x06ec,\n\t0x0730, 0x074a,\n\t0x07a6, 0x07b0,\n\t0x07eb, 0x07f5,\n\t0x0818, 0x0819,\n\t0x08e4, 0x08fe,\n\t0x093c, 0x093c,\n\t0x094d, 0x094d,\n\t0x0951, 0x0954,\n\t0x0971, 0x0971,\n\t0x09bc, 0x09bc,\n\t0x09cd, 0x09cd,\n\t0x0a3c, 0x0a3c,\n\t0x0a4d, 0x0a4d,\n\t0x0abc, 0x0abc,\n\t0x0acd, 0x0acd,\n\t0x0b3c, 0x0b3c,\n\t0x0b4d, 0x0b4d,\n\t0x0bcd, 0x0bcd,\n\t0x0c4d, 0x0c4d,\n\t0x0cbc, 0x0cbc,\n\t0x0ccd, 0x0ccd,\n\t0x0d4d, 0x0d4d,\n\t0x0dca, 0x0dca,\n\t0x0e47, 0x0e4c,\n\t0x0e4e, 0x0e4e,\n\t0x0ec8, 0x0ecc,\n\t0x0f18, 0x0f19,\n\t0x0f35, 0x0f35,\n\t0x0f37, 0x0f37,\n\t0x0f39, 0x0f39,\n\t0x0f3e, 0x0f3f,\n\t0x0f82, 0x0f84,\n\t0x0f86, 0x0f87,\n\t0x0fc6, 0x0fc6,\n\t0x1037, 0x1037,\n\t0x1039, 0x103a,\n\t0x1087, 0x108d,\n\t0x108f, 0x108f,\n\t0x109a, 0x109b,\n\t0x17c9, 0x17d3,\n\t0x17dd, 0x17dd,\n\t0x1939, 0x193b,\n\t0x1a75, 0x1a7c,\n\t0x1a7f, 0x1a7f,\n\t0x1b34, 0x1b34,\n\t0x1b44, 0x1b44,\n\t0x1b6b, 0x1b73,\n\t0x1baa, 0x1bab,\n\t0x1c36, 0x1c37,\n\t0x1c78, 0x1c7d,\n\t0x1cd0, 0x1ce8,\n\t0x1ced, 0x1ced,\n\t0x1cf4, 0x1cf4,\n\t0x1d2c, 0x1d6a,\n\t0x1dc4, 0x1dcf,\n\t0x1dfd, 0x1dff,\n\t0x1fbd, 0x1fbd,\n\t0x1fbf, 0x1fc1,\n\t0x1fcd, 0x1fcf,\n\t0x1fdd, 0x1fdf,\n\t0x1fed, 0x1fef,\n\t0x1ffd, 0x1ffe,\n\t0x2cef, 0x2cf1,\n\t0x2e2f, 0x2e2f,\n\t0x302a, 0x302f,\n\t0x3099, 0x309c,\n\t0x30fc, 0x30fc,\n\t0xa66f, 0xa66f,\n\t0xa67c, 0xa67d,\n\t0xa67f, 0xa67f,\n\t0xa6f0, 0xa6f1,\n\t0xa717, 0xa721,\n\t0xa788, 0xa788,\n\t0xa7f8, 0xa7f9,\n\t0xa8c4, 0xa8c4,\n\t0xa8e0, 0xa8f1,\n\t0xa92b, 0xa92e,\n\t0xa953, 0xa953,\n\t0xa9b3, 0xa9b3,\n\t0xa9c0, 0xa9c0,\n\t0xaa7b, 0xaa7b,\n\t0xaabf, 0xaac2,\n\t0xaaf6, 0xaaf6,\n\t0xabec, 0xabed,\n\t0xfb1e, 0xfb1e,\n\t0xfe20, 0xfe26,\n\t0xff3e, 0xff3e,\n\t0xff40, 0xff40,\n\t0xff70, 0xff70,\n\t0xff9e, 0xff9f,\n\t0xffe3, 0xffe3,\n\t0x110b9, 0x110ba,\n\t0x11133, 0x11134,\n\t0x111c0, 0x111c0,\n\t0x116b6, 0x116b7,\n\t0x16f8f, 0x16f9f,\n\t0x1d167, 0x1d169,\n\t0x1d16d, 0x1d172,\n\t0x1d17b, 0x1d182,\n\t0x1d185, 0x1d18b,\n\t0x1d1aa, 0x1d1ad,\n}; /* CR_Diacritic */\n\n/* 'Extender': Binary Property */\nstatic const OnigCodePoint CR_Extender[] = {\n\t22,\n\t0x00b7, 0x00b7,\n\t0x02d0, 0x02d1,\n\t0x0640, 0x0640,\n\t0x07fa, 0x07fa,\n\t0x0e46, 0x0e46,\n\t0x0ec6, 0x0ec6,\n\t0x180a, 0x180a,\n\t0x1843, 0x1843,\n\t0x1aa7, 0x1aa7,\n\t0x1c36, 0x1c36,\n\t0x1c7b, 0x1c7b,\n\t0x3005, 0x3005,\n\t0x3031, 0x3035,\n\t0x309d, 0x309e,\n\t0x30fc, 0x30fe,\n\t0xa015, 0xa015,\n\t0xa60c, 0xa60c,\n\t0xa9cf, 0xa9cf,\n\t0xaa70, 0xaa70,\n\t0xaadd, 0xaadd,\n\t0xaaf3, 0xaaf4,\n\t0xff70, 0xff70,\n}; /* CR_Extender */\n\n/* 'Other_Lowercase': Binary Property */\nstatic const OnigCodePoint CR_Other_Lowercase[] = {\n\t18,\n\t0x00aa, 0x00aa,\n\t0x00ba, 0x00ba,\n\t0x02b0, 0x02b8,\n\t0x02c0, 0x02c1,\n\t0x02e0, 0x02e4,\n\t0x0345, 0x0345,\n\t0x037a, 0x037a,\n\t0x1d2c, 0x1d6a,\n\t0x1d78, 0x1d78,\n\t0x1d9b, 0x1dbf,\n\t0x2071, 0x2071,\n\t0x207f, 0x207f,\n\t0x2090, 0x209c,\n\t0x2170, 0x217f,\n\t0x24d0, 0x24e9,\n\t0x2c7c, 0x2c7d,\n\t0xa770, 0xa770,\n\t0xa7f8, 0xa7f9,\n}; /* CR_Other_Lowercase */\n\n/* 'Other_Uppercase': Binary Property */\nstatic const OnigCodePoint CR_Other_Uppercase[] = {\n\t2,\n\t0x2160, 0x216f,\n\t0x24b6, 0x24cf,\n}; /* CR_Other_Uppercase */\n\n/* 'Noncharacter_Code_Point': Binary Property */\nstatic const OnigCodePoint CR_Noncharacter_Code_Point[] = {\n\t18,\n\t0xfdd0, 0xfdef,\n\t0xfffe, 0xffff,\n\t0x1fffe, 0x1ffff,\n\t0x2fffe, 0x2ffff,\n\t0x3fffe, 0x3ffff,\n\t0x4fffe, 0x4ffff,\n\t0x5fffe, 0x5ffff,\n\t0x6fffe, 0x6ffff,\n\t0x7fffe, 0x7ffff,\n\t0x8fffe, 0x8ffff,\n\t0x9fffe, 0x9ffff,\n\t0xafffe, 0xaffff,\n\t0xbfffe, 0xbffff,\n\t0xcfffe, 0xcffff,\n\t0xdfffe, 0xdffff,\n\t0xefffe, 0xeffff,\n\t0xffffe, 0xfffff,\n\t0x10fffe, 0x10ffff,\n}; /* CR_Noncharacter_Code_Point */\n\n/* 'Other_Grapheme_Extend': Binary Property */\nstatic const OnigCodePoint CR_Other_Grapheme_Extend[] = {\n\t17,\n\t0x09be, 0x09be,\n\t0x09d7, 0x09d7,\n\t0x0b3e, 0x0b3e,\n\t0x0b57, 0x0b57,\n\t0x0bbe, 0x0bbe,\n\t0x0bd7, 0x0bd7,\n\t0x0cc2, 0x0cc2,\n\t0x0cd5, 0x0cd6,\n\t0x0d3e, 0x0d3e,\n\t0x0d57, 0x0d57,\n\t0x0dcf, 0x0dcf,\n\t0x0ddf, 0x0ddf,\n\t0x200c, 0x200d,\n\t0x302e, 0x302f,\n\t0xff9e, 0xff9f,\n\t0x1d165, 0x1d165,\n\t0x1d16e, 0x1d172,\n}; /* CR_Other_Grapheme_Extend */\n\n/* 'IDS_Binary_Operator': Binary Property */\nstatic const OnigCodePoint CR_IDS_Binary_Operator[] = {\n\t2,\n\t0x2ff0, 0x2ff1,\n\t0x2ff4, 0x2ffb,\n}; /* CR_IDS_Binary_Operator */\n\n/* 'IDS_Trinary_Operator': Binary Property */\nstatic const OnigCodePoint CR_IDS_Trinary_Operator[] = {\n\t1,\n\t0x2ff2, 0x2ff3,\n}; /* CR_IDS_Trinary_Operator */\n\n/* 'Radical': Binary Property */\nstatic const OnigCodePoint CR_Radical[] = {\n\t3,\n\t0x2e80, 0x2e99,\n\t0x2e9b, 0x2ef3,\n\t0x2f00, 0x2fd5,\n}; /* CR_Radical */\n\n/* 'Unified_Ideograph': Binary Property */\nstatic const OnigCodePoint CR_Unified_Ideograph[] = {\n\t12,\n\t0x3400, 0x4db5,\n\t0x4e00, 0x9fcc,\n\t0xfa0e, 0xfa0f,\n\t0xfa11, 0xfa11,\n\t0xfa13, 0xfa14,\n\t0xfa1f, 0xfa1f,\n\t0xfa21, 0xfa21,\n\t0xfa23, 0xfa24,\n\t0xfa27, 0xfa29,\n\t0x20000, 0x2a6d6,\n\t0x2a700, 0x2b734,\n\t0x2b740, 0x2b81d,\n}; /* CR_Unified_Ideograph */\n\n/* 'Other_Default_Ignorable_Code_Point': Binary Property */\nstatic const OnigCodePoint CR_Other_Default_Ignorable_Code_Point[] = {\n\t11,\n\t0x034f, 0x034f,\n\t0x115f, 0x1160,\n\t0x17b4, 0x17b5,\n\t0x2065, 0x2069,\n\t0x3164, 0x3164,\n\t0xffa0, 0xffa0,\n\t0xfff0, 0xfff8,\n\t0xe0000, 0xe0000,\n\t0xe0002, 0xe001f,\n\t0xe0080, 0xe00ff,\n\t0xe01f0, 0xe0fff,\n}; /* CR_Other_Default_Ignorable_Code_Point */\n\n/* 'Deprecated': Binary Property */\nstatic const OnigCodePoint CR_Deprecated[] = {\n\t9,\n\t0x0149, 0x0149,\n\t0x0673, 0x0673,\n\t0x0f77, 0x0f77,\n\t0x0f79, 0x0f79,\n\t0x17a3, 0x17a4,\n\t0x206a, 0x206f,\n\t0x2329, 0x232a,\n\t0xe0001, 0xe0001,\n\t0xe0020, 0xe007f,\n}; /* CR_Deprecated */\n\n/* 'Soft_Dotted': Binary Property */\nstatic const OnigCodePoint CR_Soft_Dotted[] = {\n\t31,\n\t0x0069, 0x006a,\n\t0x012f, 0x012f,\n\t0x0249, 0x0249,\n\t0x0268, 0x0268,\n\t0x029d, 0x029d,\n\t0x02b2, 0x02b2,\n\t0x03f3, 0x03f3,\n\t0x0456, 0x0456,\n\t0x0458, 0x0458,\n\t0x1d62, 0x1d62,\n\t0x1d96, 0x1d96,\n\t0x1da4, 0x1da4,\n\t0x1da8, 0x1da8,\n\t0x1e2d, 0x1e2d,\n\t0x1ecb, 0x1ecb,\n\t0x2071, 0x2071,\n\t0x2148, 0x2149,\n\t0x2c7c, 0x2c7c,\n\t0x1d422, 0x1d423,\n\t0x1d456, 0x1d457,\n\t0x1d48a, 0x1d48b,\n\t0x1d4be, 0x1d4bf,\n\t0x1d4f2, 0x1d4f3,\n\t0x1d526, 0x1d527,\n\t0x1d55a, 0x1d55b,\n\t0x1d58e, 0x1d58f,\n\t0x1d5c2, 0x1d5c3,\n\t0x1d5f6, 0x1d5f7,\n\t0x1d62a, 0x1d62b,\n\t0x1d65e, 0x1d65f,\n\t0x1d692, 0x1d693,\n}; /* CR_Soft_Dotted */\n\n/* 'Logical_Order_Exception': Binary Property */\nstatic const OnigCodePoint CR_Logical_Order_Exception[] = {\n\t5,\n\t0x0e40, 0x0e44,\n\t0x0ec0, 0x0ec4,\n\t0xaab5, 0xaab6,\n\t0xaab9, 0xaab9,\n\t0xaabb, 0xaabc,\n}; /* CR_Logical_Order_Exception */\n\n/* 'Other_ID_Start': Binary Property */\nstatic const OnigCodePoint CR_Other_ID_Start[] = {\n\t3,\n\t0x2118, 0x2118,\n\t0x212e, 0x212e,\n\t0x309b, 0x309c,\n}; /* CR_Other_ID_Start */\n\n/* 'Other_ID_Continue': Binary Property */\nstatic const OnigCodePoint CR_Other_ID_Continue[] = {\n\t4,\n\t0x00b7, 0x00b7,\n\t0x0387, 0x0387,\n\t0x1369, 0x1371,\n\t0x19da, 0x19da,\n}; /* CR_Other_ID_Continue */\n\n/* 'STerm': Binary Property */\nstatic const OnigCodePoint CR_STerm[] = {\n\t50,\n\t0x0021, 0x0021,\n\t0x002e, 0x002e,\n\t0x003f, 0x003f,\n\t0x055c, 0x055c,\n\t0x055e, 0x055e,\n\t0x0589, 0x0589,\n\t0x061f, 0x061f,\n\t0x06d4, 0x06d4,\n\t0x0700, 0x0702,\n\t0x07f9, 0x07f9,\n\t0x0964, 0x0965,\n\t0x104a, 0x104b,\n\t0x1362, 0x1362,\n\t0x1367, 0x1368,\n\t0x166e, 0x166e,\n\t0x1735, 0x1736,\n\t0x1803, 0x1803,\n\t0x1809, 0x1809,\n\t0x1944, 0x1945,\n\t0x1aa8, 0x1aab,\n\t0x1b5a, 0x1b5b,\n\t0x1b5e, 0x1b5f,\n\t0x1c3b, 0x1c3c,\n\t0x1c7e, 0x1c7f,\n\t0x203c, 0x203d,\n\t0x2047, 0x2049,\n\t0x2e2e, 0x2e2e,\n\t0x3002, 0x3002,\n\t0xa4ff, 0xa4ff,\n\t0xa60e, 0xa60f,\n\t0xa6f3, 0xa6f3,\n\t0xa6f7, 0xa6f7,\n\t0xa876, 0xa877,\n\t0xa8ce, 0xa8cf,\n\t0xa92f, 0xa92f,\n\t0xa9c8, 0xa9c9,\n\t0xaa5d, 0xaa5f,\n\t0xaaf0, 0xaaf1,\n\t0xabeb, 0xabeb,\n\t0xfe52, 0xfe52,\n\t0xfe56, 0xfe57,\n\t0xff01, 0xff01,\n\t0xff0e, 0xff0e,\n\t0xff1f, 0xff1f,\n\t0xff61, 0xff61,\n\t0x10a56, 0x10a57,\n\t0x11047, 0x11048,\n\t0x110be, 0x110c1,\n\t0x11141, 0x11143,\n\t0x111c5, 0x111c6,\n}; /* CR_STerm */\n\n/* 'Variation_Selector': Binary Property */\nstatic const OnigCodePoint CR_Variation_Selector[] = {\n\t3,\n\t0x180b, 0x180d,\n\t0xfe00, 0xfe0f,\n\t0xe0100, 0xe01ef,\n}; /* CR_Variation_Selector */\n\n/* 'Pattern_White_Space': Binary Property */\nstatic const OnigCodePoint CR_Pattern_White_Space[] = {\n\t5,\n\t0x0009, 0x000d,\n\t0x0020, 0x0020,\n\t0x0085, 0x0085,\n\t0x200e, 0x200f,\n\t0x2028, 0x2029,\n}; /* CR_Pattern_White_Space */\n\n/* 'Pattern_Syntax': Binary Property */\nstatic const OnigCodePoint CR_Pattern_Syntax[] = {\n\t28,\n\t0x0021, 0x002f,\n\t0x003a, 0x0040,\n\t0x005b, 0x005e,\n\t0x0060, 0x0060,\n\t0x007b, 0x007e,\n\t0x00a1, 0x00a7,\n\t0x00a9, 0x00a9,\n\t0x00ab, 0x00ac,\n\t0x00ae, 0x00ae,\n\t0x00b0, 0x00b1,\n\t0x00b6, 0x00b6,\n\t0x00bb, 0x00bb,\n\t0x00bf, 0x00bf,\n\t0x00d7, 0x00d7,\n\t0x00f7, 0x00f7,\n\t0x2010, 0x2027,\n\t0x2030, 0x203e,\n\t0x2041, 0x2053,\n\t0x2055, 0x205e,\n\t0x2190, 0x245f,\n\t0x2500, 0x2775,\n\t0x2794, 0x2bff,\n\t0x2e00, 0x2e7f,\n\t0x3001, 0x3003,\n\t0x3008, 0x3020,\n\t0x3030, 0x3030,\n\t0xfd3e, 0xfd3f,\n\t0xfe45, 0xfe46,\n}; /* CR_Pattern_Syntax */\n\n/* 'Unknown': Script */\nstatic const OnigCodePoint CR_Unknown[] = {\n\t537,\n\t0x0378, 0x0379,\n\t0x037f, 0x0383,\n\t0x038b, 0x038b,\n\t0x038d, 0x038d,\n\t0x03a2, 0x03a2,\n\t0x0528, 0x0530,\n\t0x0557, 0x0558,\n\t0x0560, 0x0560,\n\t0x0588, 0x0588,\n\t0x058b, 0x058e,\n\t0x0590, 0x0590,\n\t0x05c8, 0x05cf,\n\t0x05eb, 0x05ef,\n\t0x05f5, 0x05ff,\n\t0x0605, 0x0605,\n\t0x061c, 0x061d,\n\t0x070e, 0x070e,\n\t0x074b, 0x074c,\n\t0x07b2, 0x07bf,\n\t0x07fb, 0x07ff,\n\t0x082e, 0x082f,\n\t0x083f, 0x083f,\n\t0x085c, 0x085d,\n\t0x085f, 0x089f,\n\t0x08a1, 0x08a1,\n\t0x08ad, 0x08e3,\n\t0x08ff, 0x08ff,\n\t0x0978, 0x0978,\n\t0x0980, 0x0980,\n\t0x0984, 0x0984,\n\t0x098d, 0x098e,\n\t0x0991, 0x0992,\n\t0x09a9, 0x09a9,\n\t0x09b1, 0x09b1,\n\t0x09b3, 0x09b5,\n\t0x09ba, 0x09bb,\n\t0x09c5, 0x09c6,\n\t0x09c9, 0x09ca,\n\t0x09cf, 0x09d6,\n\t0x09d8, 0x09db,\n\t0x09de, 0x09de,\n\t0x09e4, 0x09e5,\n\t0x09fc, 0x0a00,\n\t0x0a04, 0x0a04,\n\t0x0a0b, 0x0a0e,\n\t0x0a11, 0x0a12,\n\t0x0a29, 0x0a29,\n\t0x0a31, 0x0a31,\n\t0x0a34, 0x0a34,\n\t0x0a37, 0x0a37,\n\t0x0a3a, 0x0a3b,\n\t0x0a3d, 0x0a3d,\n\t0x0a43, 0x0a46,\n\t0x0a49, 0x0a4a,\n\t0x0a4e, 0x0a50,\n\t0x0a52, 0x0a58,\n\t0x0a5d, 0x0a5d,\n\t0x0a5f, 0x0a65,\n\t0x0a76, 0x0a80,\n\t0x0a84, 0x0a84,\n\t0x0a8e, 0x0a8e,\n\t0x0a92, 0x0a92,\n\t0x0aa9, 0x0aa9,\n\t0x0ab1, 0x0ab1,\n\t0x0ab4, 0x0ab4,\n\t0x0aba, 0x0abb,\n\t0x0ac6, 0x0ac6,\n\t0x0aca, 0x0aca,\n\t0x0ace, 0x0acf,\n\t0x0ad1, 0x0adf,\n\t0x0ae4, 0x0ae5,\n\t0x0af2, 0x0b00,\n\t0x0b04, 0x0b04,\n\t0x0b0d, 0x0b0e,\n\t0x0b11, 0x0b12,\n\t0x0b29, 0x0b29,\n\t0x0b31, 0x0b31,\n\t0x0b34, 0x0b34,\n\t0x0b3a, 0x0b3b,\n\t0x0b45, 0x0b46,\n\t0x0b49, 0x0b4a,\n\t0x0b4e, 0x0b55,\n\t0x0b58, 0x0b5b,\n\t0x0b5e, 0x0b5e,\n\t0x0b64, 0x0b65,\n\t0x0b78, 0x0b81,\n\t0x0b84, 0x0b84,\n\t0x0b8b, 0x0b8d,\n\t0x0b91, 0x0b91,\n\t0x0b96, 0x0b98,\n\t0x0b9b, 0x0b9b,\n\t0x0b9d, 0x0b9d,\n\t0x0ba0, 0x0ba2,\n\t0x0ba5, 0x0ba7,\n\t0x0bab, 0x0bad,\n\t0x0bba, 0x0bbd,\n\t0x0bc3, 0x0bc5,\n\t0x0bc9, 0x0bc9,\n\t0x0bce, 0x0bcf,\n\t0x0bd1, 0x0bd6,\n\t0x0bd8, 0x0be5,\n\t0x0bfb, 0x0c00,\n\t0x0c04, 0x0c04,\n\t0x0c0d, 0x0c0d,\n\t0x0c11, 0x0c11,\n\t0x0c29, 0x0c29,\n\t0x0c34, 0x0c34,\n\t0x0c3a, 0x0c3c,\n\t0x0c45, 0x0c45,\n\t0x0c49, 0x0c49,\n\t0x0c4e, 0x0c54,\n\t0x0c57, 0x0c57,\n\t0x0c5a, 0x0c5f,\n\t0x0c64, 0x0c65,\n\t0x0c70, 0x0c77,\n\t0x0c80, 0x0c81,\n\t0x0c84, 0x0c84,\n\t0x0c8d, 0x0c8d,\n\t0x0c91, 0x0c91,\n\t0x0ca9, 0x0ca9,\n\t0x0cb4, 0x0cb4,\n\t0x0cba, 0x0cbb,\n\t0x0cc5, 0x0cc5,\n\t0x0cc9, 0x0cc9,\n\t0x0cce, 0x0cd4,\n\t0x0cd7, 0x0cdd,\n\t0x0cdf, 0x0cdf,\n\t0x0ce4, 0x0ce5,\n\t0x0cf0, 0x0cf0,\n\t0x0cf3, 0x0d01,\n\t0x0d04, 0x0d04,\n\t0x0d0d, 0x0d0d,\n\t0x0d11, 0x0d11,\n\t0x0d3b, 0x0d3c,\n\t0x0d45, 0x0d45,\n\t0x0d49, 0x0d49,\n\t0x0d4f, 0x0d56,\n\t0x0d58, 0x0d5f,\n\t0x0d64, 0x0d65,\n\t0x0d76, 0x0d78,\n\t0x0d80, 0x0d81,\n\t0x0d84, 0x0d84,\n\t0x0d97, 0x0d99,\n\t0x0db2, 0x0db2,\n\t0x0dbc, 0x0dbc,\n\t0x0dbe, 0x0dbf,\n\t0x0dc7, 0x0dc9,\n\t0x0dcb, 0x0dce,\n\t0x0dd5, 0x0dd5,\n\t0x0dd7, 0x0dd7,\n\t0x0de0, 0x0df1,\n\t0x0df5, 0x0e00,\n\t0x0e3b, 0x0e3e,\n\t0x0e5c, 0x0e80,\n\t0x0e83, 0x0e83,\n\t0x0e85, 0x0e86,\n\t0x0e89, 0x0e89,\n\t0x0e8b, 0x0e8c,\n\t0x0e8e, 0x0e93,\n\t0x0e98, 0x0e98,\n\t0x0ea0, 0x0ea0,\n\t0x0ea4, 0x0ea4,\n\t0x0ea6, 0x0ea6,\n\t0x0ea8, 0x0ea9,\n\t0x0eac, 0x0eac,\n\t0x0eba, 0x0eba,\n\t0x0ebe, 0x0ebf,\n\t0x0ec5, 0x0ec5,\n\t0x0ec7, 0x0ec7,\n\t0x0ece, 0x0ecf,\n\t0x0eda, 0x0edb,\n\t0x0ee0, 0x0eff,\n\t0x0f48, 0x0f48,\n\t0x0f6d, 0x0f70,\n\t0x0f98, 0x0f98,\n\t0x0fbd, 0x0fbd,\n\t0x0fcd, 0x0fcd,\n\t0x0fdb, 0x0fff,\n\t0x10c6, 0x10c6,\n\t0x10c8, 0x10cc,\n\t0x10ce, 0x10cf,\n\t0x1249, 0x1249,\n\t0x124e, 0x124f,\n\t0x1257, 0x1257,\n\t0x1259, 0x1259,\n\t0x125e, 0x125f,\n\t0x1289, 0x1289,\n\t0x128e, 0x128f,\n\t0x12b1, 0x12b1,\n\t0x12b6, 0x12b7,\n\t0x12bf, 0x12bf,\n\t0x12c1, 0x12c1,\n\t0x12c6, 0x12c7,\n\t0x12d7, 0x12d7,\n\t0x1311, 0x1311,\n\t0x1316, 0x1317,\n\t0x135b, 0x135c,\n\t0x137d, 0x137f,\n\t0x139a, 0x139f,\n\t0x13f5, 0x13ff,\n\t0x169d, 0x169f,\n\t0x16f1, 0x16ff,\n\t0x170d, 0x170d,\n\t0x1715, 0x171f,\n\t0x1737, 0x173f,\n\t0x1754, 0x175f,\n\t0x176d, 0x176d,\n\t0x1771, 0x1771,\n\t0x1774, 0x177f,\n\t0x17de, 0x17df,\n\t0x17ea, 0x17ef,\n\t0x17fa, 0x17ff,\n\t0x180f, 0x180f,\n\t0x181a, 0x181f,\n\t0x1878, 0x187f,\n\t0x18ab, 0x18af,\n\t0x18f6, 0x18ff,\n\t0x191d, 0x191f,\n\t0x192c, 0x192f,\n\t0x193c, 0x193f,\n\t0x1941, 0x1943,\n\t0x196e, 0x196f,\n\t0x1975, 0x197f,\n\t0x19ac, 0x19af,\n\t0x19ca, 0x19cf,\n\t0x19db, 0x19dd,\n\t0x1a1c, 0x1a1d,\n\t0x1a5f, 0x1a5f,\n\t0x1a7d, 0x1a7e,\n\t0x1a8a, 0x1a8f,\n\t0x1a9a, 0x1a9f,\n\t0x1aae, 0x1aff,\n\t0x1b4c, 0x1b4f,\n\t0x1b7d, 0x1b7f,\n\t0x1bf4, 0x1bfb,\n\t0x1c38, 0x1c3a,\n\t0x1c4a, 0x1c4c,\n\t0x1c80, 0x1cbf,\n\t0x1cc8, 0x1ccf,\n\t0x1cf7, 0x1cff,\n\t0x1de7, 0x1dfb,\n\t0x1f16, 0x1f17,\n\t0x1f1e, 0x1f1f,\n\t0x1f46, 0x1f47,\n\t0x1f4e, 0x1f4f,\n\t0x1f58, 0x1f58,\n\t0x1f5a, 0x1f5a,\n\t0x1f5c, 0x1f5c,\n\t0x1f5e, 0x1f5e,\n\t0x1f7e, 0x1f7f,\n\t0x1fb5, 0x1fb5,\n\t0x1fc5, 0x1fc5,\n\t0x1fd4, 0x1fd5,\n\t0x1fdc, 0x1fdc,\n\t0x1ff0, 0x1ff1,\n\t0x1ff5, 0x1ff5,\n\t0x1fff, 0x1fff,\n\t0x2065, 0x2069,\n\t0x2072, 0x2073,\n\t0x208f, 0x208f,\n\t0x209d, 0x209f,\n\t0x20ba, 0x20cf,\n\t0x20f1, 0x20ff,\n\t0x218a, 0x218f,\n\t0x23f4, 0x23ff,\n\t0x2427, 0x243f,\n\t0x244b, 0x245f,\n\t0x2700, 0x2700,\n\t0x2b4d, 0x2b4f,\n\t0x2b5a, 0x2bff,\n\t0x2c2f, 0x2c2f,\n\t0x2c5f, 0x2c5f,\n\t0x2cf4, 0x2cf8,\n\t0x2d26, 0x2d26,\n\t0x2d28, 0x2d2c,\n\t0x2d2e, 0x2d2f,\n\t0x2d68, 0x2d6e,\n\t0x2d71, 0x2d7e,\n\t0x2d97, 0x2d9f,\n\t0x2da7, 0x2da7,\n\t0x2daf, 0x2daf,\n\t0x2db7, 0x2db7,\n\t0x2dbf, 0x2dbf,\n\t0x2dc7, 0x2dc7,\n\t0x2dcf, 0x2dcf,\n\t0x2dd7, 0x2dd7,\n\t0x2ddf, 0x2ddf,\n\t0x2e3c, 0x2e7f,\n\t0x2e9a, 0x2e9a,\n\t0x2ef4, 0x2eff,\n\t0x2fd6, 0x2fef,\n\t0x2ffc, 0x2fff,\n\t0x3040, 0x3040,\n\t0x3097, 0x3098,\n\t0x3100, 0x3104,\n\t0x312e, 0x3130,\n\t0x318f, 0x318f,\n\t0x31bb, 0x31bf,\n\t0x31e4, 0x31ef,\n\t0x321f, 0x321f,\n\t0x32ff, 0x32ff,\n\t0x4db6, 0x4dbf,\n\t0x9fcd, 0x9fff,\n\t0xa48d, 0xa48f,\n\t0xa4c7, 0xa4cf,\n\t0xa62c, 0xa63f,\n\t0xa698, 0xa69e,\n\t0xa6f8, 0xa6ff,\n\t0xa78f, 0xa78f,\n\t0xa794, 0xa79f,\n\t0xa7ab, 0xa7f7,\n\t0xa82c, 0xa82f,\n\t0xa83a, 0xa83f,\n\t0xa878, 0xa87f,\n\t0xa8c5, 0xa8cd,\n\t0xa8da, 0xa8df,\n\t0xa8fc, 0xa8ff,\n\t0xa954, 0xa95e,\n\t0xa97d, 0xa97f,\n\t0xa9ce, 0xa9ce,\n\t0xa9da, 0xa9dd,\n\t0xa9e0, 0xa9ff,\n\t0xaa37, 0xaa3f,\n\t0xaa4e, 0xaa4f,\n\t0xaa5a, 0xaa5b,\n\t0xaa7c, 0xaa7f,\n\t0xaac3, 0xaada,\n\t0xaaf7, 0xab00,\n\t0xab07, 0xab08,\n\t0xab0f, 0xab10,\n\t0xab17, 0xab1f,\n\t0xab27, 0xab27,\n\t0xab2f, 0xabbf,\n\t0xabee, 0xabef,\n\t0xabfa, 0xabff,\n\t0xd7a4, 0xd7af,\n\t0xd7c7, 0xd7ca,\n\t0xd7fc, 0xf8ff,\n\t0xfa6e, 0xfa6f,\n\t0xfada, 0xfaff,\n\t0xfb07, 0xfb12,\n\t0xfb18, 0xfb1c,\n\t0xfb37, 0xfb37,\n\t0xfb3d, 0xfb3d,\n\t0xfb3f, 0xfb3f,\n\t0xfb42, 0xfb42,\n\t0xfb45, 0xfb45,\n\t0xfbc2, 0xfbd2,\n\t0xfd40, 0xfd4f,\n\t0xfd90, 0xfd91,\n\t0xfdc8, 0xfdef,\n\t0xfdfe, 0xfdff,\n\t0xfe1a, 0xfe1f,\n\t0xfe27, 0xfe2f,\n\t0xfe53, 0xfe53,\n\t0xfe67, 0xfe67,\n\t0xfe6c, 0xfe6f,\n\t0xfe75, 0xfe75,\n\t0xfefd, 0xfefe,\n\t0xff00, 0xff00,\n\t0xffbf, 0xffc1,\n\t0xffc8, 0xffc9,\n\t0xffd0, 0xffd1,\n\t0xffd8, 0xffd9,\n\t0xffdd, 0xffdf,\n\t0xffe7, 0xffe7,\n\t0xffef, 0xfff8,\n\t0xfffe, 0xffff,\n\t0x1000c, 0x1000c,\n\t0x10027, 0x10027,\n\t0x1003b, 0x1003b,\n\t0x1003e, 0x1003e,\n\t0x1004e, 0x1004f,\n\t0x1005e, 0x1007f,\n\t0x100fb, 0x100ff,\n\t0x10103, 0x10106,\n\t0x10134, 0x10136,\n\t0x1018b, 0x1018f,\n\t0x1019c, 0x101cf,\n\t0x101fe, 0x1027f,\n\t0x1029d, 0x1029f,\n\t0x102d1, 0x102ff,\n\t0x1031f, 0x1031f,\n\t0x10324, 0x1032f,\n\t0x1034b, 0x1037f,\n\t0x1039e, 0x1039e,\n\t0x103c4, 0x103c7,\n\t0x103d6, 0x103ff,\n\t0x1049e, 0x1049f,\n\t0x104aa, 0x107ff,\n\t0x10806, 0x10807,\n\t0x10809, 0x10809,\n\t0x10836, 0x10836,\n\t0x10839, 0x1083b,\n\t0x1083d, 0x1083e,\n\t0x10856, 0x10856,\n\t0x10860, 0x108ff,\n\t0x1091c, 0x1091e,\n\t0x1093a, 0x1093e,\n\t0x10940, 0x1097f,\n\t0x109b8, 0x109bd,\n\t0x109c0, 0x109ff,\n\t0x10a04, 0x10a04,\n\t0x10a07, 0x10a0b,\n\t0x10a14, 0x10a14,\n\t0x10a18, 0x10a18,\n\t0x10a34, 0x10a37,\n\t0x10a3b, 0x10a3e,\n\t0x10a48, 0x10a4f,\n\t0x10a59, 0x10a5f,\n\t0x10a80, 0x10aff,\n\t0x10b36, 0x10b38,\n\t0x10b56, 0x10b57,\n\t0x10b73, 0x10b77,\n\t0x10b80, 0x10bff,\n\t0x10c49, 0x10e5f,\n\t0x10e7f, 0x10fff,\n\t0x1104e, 0x11051,\n\t0x11070, 0x1107f,\n\t0x110c2, 0x110cf,\n\t0x110e9, 0x110ef,\n\t0x110fa, 0x110ff,\n\t0x11135, 0x11135,\n\t0x11144, 0x1117f,\n\t0x111c9, 0x111cf,\n\t0x111da, 0x1167f,\n\t0x116b8, 0x116bf,\n\t0x116ca, 0x11fff,\n\t0x1236f, 0x123ff,\n\t0x12463, 0x1246f,\n\t0x12474, 0x12fff,\n\t0x1342f, 0x167ff,\n\t0x16a39, 0x16eff,\n\t0x16f45, 0x16f4f,\n\t0x16f7f, 0x16f8e,\n\t0x16fa0, 0x1afff,\n\t0x1b002, 0x1cfff,\n\t0x1d0f6, 0x1d0ff,\n\t0x1d127, 0x1d128,\n\t0x1d1de, 0x1d1ff,\n\t0x1d246, 0x1d2ff,\n\t0x1d357, 0x1d35f,\n\t0x1d372, 0x1d3ff,\n\t0x1d455, 0x1d455,\n\t0x1d49d, 0x1d49d,\n\t0x1d4a0, 0x1d4a1,\n\t0x1d4a3, 0x1d4a4,\n\t0x1d4a7, 0x1d4a8,\n\t0x1d4ad, 0x1d4ad,\n\t0x1d4ba, 0x1d4ba,\n\t0x1d4bc, 0x1d4bc,\n\t0x1d4c4, 0x1d4c4,\n\t0x1d506, 0x1d506,\n\t0x1d50b, 0x1d50c,\n\t0x1d515, 0x1d515,\n\t0x1d51d, 0x1d51d,\n\t0x1d53a, 0x1d53a,\n\t0x1d53f, 0x1d53f,\n\t0x1d545, 0x1d545,\n\t0x1d547, 0x1d549,\n\t0x1d551, 0x1d551,\n\t0x1d6a6, 0x1d6a7,\n\t0x1d7cc, 0x1d7cd,\n\t0x1d800, 0x1edff,\n\t0x1ee04, 0x1ee04,\n\t0x1ee20, 0x1ee20,\n\t0x1ee23, 0x1ee23,\n\t0x1ee25, 0x1ee26,\n\t0x1ee28, 0x1ee28,\n\t0x1ee33, 0x1ee33,\n\t0x1ee38, 0x1ee38,\n\t0x1ee3a, 0x1ee3a,\n\t0x1ee3c, 0x1ee41,\n\t0x1ee43, 0x1ee46,\n\t0x1ee48, 0x1ee48,\n\t0x1ee4a, 0x1ee4a,\n\t0x1ee4c, 0x1ee4c,\n\t0x1ee50, 0x1ee50,\n\t0x1ee53, 0x1ee53,\n\t0x1ee55, 0x1ee56,\n\t0x1ee58, 0x1ee58,\n\t0x1ee5a, 0x1ee5a,\n\t0x1ee5c, 0x1ee5c,\n\t0x1ee5e, 0x1ee5e,\n\t0x1ee60, 0x1ee60,\n\t0x1ee63, 0x1ee63,\n\t0x1ee65, 0x1ee66,\n\t0x1ee6b, 0x1ee6b,\n\t0x1ee73, 0x1ee73,\n\t0x1ee78, 0x1ee78,\n\t0x1ee7d, 0x1ee7d,\n\t0x1ee7f, 0x1ee7f,\n\t0x1ee8a, 0x1ee8a,\n\t0x1ee9c, 0x1eea0,\n\t0x1eea4, 0x1eea4,\n\t0x1eeaa, 0x1eeaa,\n\t0x1eebc, 0x1eeef,\n\t0x1eef2, 0x1efff,\n\t0x1f02c, 0x1f02f,\n\t0x1f094, 0x1f09f,\n\t0x1f0af, 0x1f0b0,\n\t0x1f0bf, 0x1f0c0,\n\t0x1f0d0, 0x1f0d0,\n\t0x1f0e0, 0x1f0ff,\n\t0x1f10b, 0x1f10f,\n\t0x1f12f, 0x1f12f,\n\t0x1f16c, 0x1f16f,\n\t0x1f19b, 0x1f1e5,\n\t0x1f203, 0x1f20f,\n\t0x1f23b, 0x1f23f,\n\t0x1f249, 0x1f24f,\n\t0x1f252, 0x1f2ff,\n\t0x1f321, 0x1f32f,\n\t0x1f336, 0x1f336,\n\t0x1f37d, 0x1f37f,\n\t0x1f394, 0x1f39f,\n\t0x1f3c5, 0x1f3c5,\n\t0x1f3cb, 0x1f3df,\n\t0x1f3f1, 0x1f3ff,\n\t0x1f43f, 0x1f43f,\n\t0x1f441, 0x1f441,\n\t0x1f4f8, 0x1f4f8,\n\t0x1f4fd, 0x1f4ff,\n\t0x1f53e, 0x1f53f,\n\t0x1f544, 0x1f54f,\n\t0x1f568, 0x1f5fa,\n\t0x1f641, 0x1f644,\n\t0x1f650, 0x1f67f,\n\t0x1f6c6, 0x1f6ff,\n\t0x1f774, 0x1ffff,\n\t0x2a6d7, 0x2a6ff,\n\t0x2b735, 0x2b73f,\n\t0x2b81e, 0x2f7ff,\n\t0x2fa1e, 0xe0000,\n\t0xe0002, 0xe001f,\n\t0xe0080, 0xe00ff,\n\t0xe01f0, 0x10ffff,\n}; /* CR_Unknown */\n\n/* 'Age_1_1': Derived Age 1.1 */\nstatic const OnigCodePoint CR_Age_1_1[] = {\n\t288,\n\t0x0000, 0x01f5,\n\t0x01fa, 0x0217,\n\t0x0250, 0x02a8,\n\t0x02b0, 0x02de,\n\t0x02e0, 0x02e9,\n\t0x0300, 0x0345,\n\t0x0360, 0x0361,\n\t0x0374, 0x0375,\n\t0x037a, 0x037a,\n\t0x037e, 0x037e,\n\t0x0384, 0x038a,\n\t0x038c, 0x038c,\n\t0x038e, 0x03a1,\n\t0x03a3, 0x03ce,\n\t0x03d0, 0x03d6,\n\t0x03da, 0x03da,\n\t0x03dc, 0x03dc,\n\t0x03de, 0x03de,\n\t0x03e0, 0x03e0,\n\t0x03e2, 0x03f3,\n\t0x0401, 0x040c,\n\t0x040e, 0x044f,\n\t0x0451, 0x045c,\n\t0x045e, 0x0486,\n\t0x0490, 0x04c4,\n\t0x04c7, 0x04c8,\n\t0x04cb, 0x04cc,\n\t0x04d0, 0x04eb,\n\t0x04ee, 0x04f5,\n\t0x04f8, 0x04f9,\n\t0x0531, 0x0556,\n\t0x0559, 0x055f,\n\t0x0561, 0x0587,\n\t0x0589, 0x0589,\n\t0x05b0, 0x05b9,\n\t0x05bb, 0x05c3,\n\t0x05d0, 0x05ea,\n\t0x05f0, 0x05f4,\n\t0x060c, 0x060c,\n\t0x061b, 0x061b,\n\t0x061f, 0x061f,\n\t0x0621, 0x063a,\n\t0x0640, 0x0652,\n\t0x0660, 0x066d,\n\t0x0670, 0x06b7,\n\t0x06ba, 0x06be,\n\t0x06c0, 0x06ce,\n\t0x06d0, 0x06ed,\n\t0x06f0, 0x06f9,\n\t0x0901, 0x0903,\n\t0x0905, 0x0939,\n\t0x093c, 0x094d,\n\t0x0950, 0x0954,\n\t0x0958, 0x0970,\n\t0x0981, 0x0983,\n\t0x0985, 0x098c,\n\t0x098f, 0x0990,\n\t0x0993, 0x09a8,\n\t0x09aa, 0x09b0,\n\t0x09b2, 0x09b2,\n\t0x09b6, 0x09b9,\n\t0x09bc, 0x09bc,\n\t0x09be, 0x09c4,\n\t0x09c7, 0x09c8,\n\t0x09cb, 0x09cd,\n\t0x09d7, 0x09d7,\n\t0x09dc, 0x09dd,\n\t0x09df, 0x09e3,\n\t0x09e6, 0x09fa,\n\t0x0a02, 0x0a02,\n\t0x0a05, 0x0a0a,\n\t0x0a0f, 0x0a10,\n\t0x0a13, 0x0a28,\n\t0x0a2a, 0x0a30,\n\t0x0a32, 0x0a33,\n\t0x0a35, 0x0a36,\n\t0x0a38, 0x0a39,\n\t0x0a3c, 0x0a3c,\n\t0x0a3e, 0x0a42,\n\t0x0a47, 0x0a48,\n\t0x0a4b, 0x0a4d,\n\t0x0a59, 0x0a5c,\n\t0x0a5e, 0x0a5e,\n\t0x0a66, 0x0a74,\n\t0x0a81, 0x0a83,\n\t0x0a85, 0x0a8b,\n\t0x0a8d, 0x0a8d,\n\t0x0a8f, 0x0a91,\n\t0x0a93, 0x0aa8,\n\t0x0aaa, 0x0ab0,\n\t0x0ab2, 0x0ab3,\n\t0x0ab5, 0x0ab9,\n\t0x0abc, 0x0ac5,\n\t0x0ac7, 0x0ac9,\n\t0x0acb, 0x0acd,\n\t0x0ad0, 0x0ad0,\n\t0x0ae0, 0x0ae0,\n\t0x0ae6, 0x0aef,\n\t0x0b01, 0x0b03,\n\t0x0b05, 0x0b0c,\n\t0x0b0f, 0x0b10,\n\t0x0b13, 0x0b28,\n\t0x0b2a, 0x0b30,\n\t0x0b32, 0x0b33,\n\t0x0b36, 0x0b39,\n\t0x0b3c, 0x0b43,\n\t0x0b47, 0x0b48,\n\t0x0b4b, 0x0b4d,\n\t0x0b56, 0x0b57,\n\t0x0b5c, 0x0b5d,\n\t0x0b5f, 0x0b61,\n\t0x0b66, 0x0b70,\n\t0x0b82, 0x0b83,\n\t0x0b85, 0x0b8a,\n\t0x0b8e, 0x0b90,\n\t0x0b92, 0x0b95,\n\t0x0b99, 0x0b9a,\n\t0x0b9c, 0x0b9c,\n\t0x0b9e, 0x0b9f,\n\t0x0ba3, 0x0ba4,\n\t0x0ba8, 0x0baa,\n\t0x0bae, 0x0bb5,\n\t0x0bb7, 0x0bb9,\n\t0x0bbe, 0x0bc2,\n\t0x0bc6, 0x0bc8,\n\t0x0bca, 0x0bcd,\n\t0x0bd7, 0x0bd7,\n\t0x0be7, 0x0bf2,\n\t0x0c01, 0x0c03,\n\t0x0c05, 0x0c0c,\n\t0x0c0e, 0x0c10,\n\t0x0c12, 0x0c28,\n\t0x0c2a, 0x0c33,\n\t0x0c35, 0x0c39,\n\t0x0c3e, 0x0c44,\n\t0x0c46, 0x0c48,\n\t0x0c4a, 0x0c4d,\n\t0x0c55, 0x0c56,\n\t0x0c60, 0x0c61,\n\t0x0c66, 0x0c6f,\n\t0x0c82, 0x0c83,\n\t0x0c85, 0x0c8c,\n\t0x0c8e, 0x0c90,\n\t0x0c92, 0x0ca8,\n\t0x0caa, 0x0cb3,\n\t0x0cb5, 0x0cb9,\n\t0x0cbe, 0x0cc4,\n\t0x0cc6, 0x0cc8,\n\t0x0cca, 0x0ccd,\n\t0x0cd5, 0x0cd6,\n\t0x0cde, 0x0cde,\n\t0x0ce0, 0x0ce1,\n\t0x0ce6, 0x0cef,\n\t0x0d02, 0x0d03,\n\t0x0d05, 0x0d0c,\n\t0x0d0e, 0x0d10,\n\t0x0d12, 0x0d28,\n\t0x0d2a, 0x0d39,\n\t0x0d3e, 0x0d43,\n\t0x0d46, 0x0d48,\n\t0x0d4a, 0x0d4d,\n\t0x0d57, 0x0d57,\n\t0x0d60, 0x0d61,\n\t0x0d66, 0x0d6f,\n\t0x0e01, 0x0e3a,\n\t0x0e3f, 0x0e5b,\n\t0x0e81, 0x0e82,\n\t0x0e84, 0x0e84,\n\t0x0e87, 0x0e88,\n\t0x0e8a, 0x0e8a,\n\t0x0e8d, 0x0e8d,\n\t0x0e94, 0x0e97,\n\t0x0e99, 0x0e9f,\n\t0x0ea1, 0x0ea3,\n\t0x0ea5, 0x0ea5,\n\t0x0ea7, 0x0ea7,\n\t0x0eaa, 0x0eab,\n\t0x0ead, 0x0eb9,\n\t0x0ebb, 0x0ebd,\n\t0x0ec0, 0x0ec4,\n\t0x0ec6, 0x0ec6,\n\t0x0ec8, 0x0ecd,\n\t0x0ed0, 0x0ed9,\n\t0x0edc, 0x0edd,\n\t0x10a0, 0x10c5,\n\t0x10d0, 0x10f6,\n\t0x10fb, 0x10fb,\n\t0x1100, 0x1159,\n\t0x115f, 0x11a2,\n\t0x11a8, 0x11f9,\n\t0x1e00, 0x1e9a,\n\t0x1ea0, 0x1ef9,\n\t0x1f00, 0x1f15,\n\t0x1f18, 0x1f1d,\n\t0x1f20, 0x1f45,\n\t0x1f48, 0x1f4d,\n\t0x1f50, 0x1f57,\n\t0x1f59, 0x1f59,\n\t0x1f5b, 0x1f5b,\n\t0x1f5d, 0x1f5d,\n\t0x1f5f, 0x1f7d,\n\t0x1f80, 0x1fb4,\n\t0x1fb6, 0x1fc4,\n\t0x1fc6, 0x1fd3,\n\t0x1fd6, 0x1fdb,\n\t0x1fdd, 0x1fef,\n\t0x1ff2, 0x1ff4,\n\t0x1ff6, 0x1ffe,\n\t0x2000, 0x202e,\n\t0x2030, 0x2046,\n\t0x206a, 0x2070,\n\t0x2074, 0x208e,\n\t0x20a0, 0x20aa,\n\t0x20d0, 0x20e1,\n\t0x2100, 0x2138,\n\t0x2153, 0x2182,\n\t0x2190, 0x21ea,\n\t0x2200, 0x22f1,\n\t0x2300, 0x2300,\n\t0x2302, 0x237a,\n\t0x2400, 0x2424,\n\t0x2440, 0x244a,\n\t0x2460, 0x24ea,\n\t0x2500, 0x2595,\n\t0x25a0, 0x25ef,\n\t0x2600, 0x2613,\n\t0x261a, 0x266f,\n\t0x2701, 0x2704,\n\t0x2706, 0x2709,\n\t0x270c, 0x2727,\n\t0x2729, 0x274b,\n\t0x274d, 0x274d,\n\t0x274f, 0x2752,\n\t0x2756, 0x2756,\n\t0x2758, 0x275e,\n\t0x2761, 0x2767,\n\t0x2776, 0x2794,\n\t0x2798, 0x27af,\n\t0x27b1, 0x27be,\n\t0x3000, 0x3037,\n\t0x303f, 0x303f,\n\t0x3041, 0x3094,\n\t0x3099, 0x309e,\n\t0x30a1, 0x30fe,\n\t0x3105, 0x312c,\n\t0x3131, 0x318e,\n\t0x3190, 0x319f,\n\t0x3200, 0x321c,\n\t0x3220, 0x3243,\n\t0x3260, 0x327b,\n\t0x327f, 0x32b0,\n\t0x32c0, 0x32cb,\n\t0x32d0, 0x32fe,\n\t0x3300, 0x3376,\n\t0x337b, 0x33dd,\n\t0x33e0, 0x33fe,\n\t0x4e00, 0x9fa5,\n\t0xe000, 0xfa2d,\n\t0xfb00, 0xfb06,\n\t0xfb13, 0xfb17,\n\t0xfb1e, 0xfb36,\n\t0xfb38, 0xfb3c,\n\t0xfb3e, 0xfb3e,\n\t0xfb40, 0xfb41,\n\t0xfb43, 0xfb44,\n\t0xfb46, 0xfbb1,\n\t0xfbd3, 0xfd3f,\n\t0xfd50, 0xfd8f,\n\t0xfd92, 0xfdc7,\n\t0xfdf0, 0xfdfb,\n\t0xfe20, 0xfe23,\n\t0xfe30, 0xfe44,\n\t0xfe49, 0xfe52,\n\t0xfe54, 0xfe66,\n\t0xfe68, 0xfe6b,\n\t0xfe70, 0xfe72,\n\t0xfe74, 0xfe74,\n\t0xfe76, 0xfefc,\n\t0xfeff, 0xfeff,\n\t0xff01, 0xff5e,\n\t0xff61, 0xffbe,\n\t0xffc2, 0xffc7,\n\t0xffca, 0xffcf,\n\t0xffd2, 0xffd7,\n\t0xffda, 0xffdc,\n\t0xffe0, 0xffe6,\n\t0xffe8, 0xffee,\n\t0xfffd, 0xffff,\n}; /* CR_Age_1_1 */\n\n/* 'Age_2_0': Derived Age 2.0 */\nstatic const OnigCodePoint CR_Age_2_0[] = {\n\t312,\n\t0x0000, 0x01f5,\n\t0x01fa, 0x0217,\n\t0x0250, 0x02a8,\n\t0x02b0, 0x02de,\n\t0x02e0, 0x02e9,\n\t0x0300, 0x0345,\n\t0x0360, 0x0361,\n\t0x0374, 0x0375,\n\t0x037a, 0x037a,\n\t0x037e, 0x037e,\n\t0x0384, 0x038a,\n\t0x038c, 0x038c,\n\t0x038e, 0x03a1,\n\t0x03a3, 0x03ce,\n\t0x03d0, 0x03d6,\n\t0x03da, 0x03da,\n\t0x03dc, 0x03dc,\n\t0x03de, 0x03de,\n\t0x03e0, 0x03e0,\n\t0x03e2, 0x03f3,\n\t0x0401, 0x040c,\n\t0x040e, 0x044f,\n\t0x0451, 0x045c,\n\t0x045e, 0x0486,\n\t0x0490, 0x04c4,\n\t0x04c7, 0x04c8,\n\t0x04cb, 0x04cc,\n\t0x04d0, 0x04eb,\n\t0x04ee, 0x04f5,\n\t0x04f8, 0x04f9,\n\t0x0531, 0x0556,\n\t0x0559, 0x055f,\n\t0x0561, 0x0587,\n\t0x0589, 0x0589,\n\t0x0591, 0x05a1,\n\t0x05a3, 0x05b9,\n\t0x05bb, 0x05c4,\n\t0x05d0, 0x05ea,\n\t0x05f0, 0x05f4,\n\t0x060c, 0x060c,\n\t0x061b, 0x061b,\n\t0x061f, 0x061f,\n\t0x0621, 0x063a,\n\t0x0640, 0x0652,\n\t0x0660, 0x066d,\n\t0x0670, 0x06b7,\n\t0x06ba, 0x06be,\n\t0x06c0, 0x06ce,\n\t0x06d0, 0x06ed,\n\t0x06f0, 0x06f9,\n\t0x0901, 0x0903,\n\t0x0905, 0x0939,\n\t0x093c, 0x094d,\n\t0x0950, 0x0954,\n\t0x0958, 0x0970,\n\t0x0981, 0x0983,\n\t0x0985, 0x098c,\n\t0x098f, 0x0990,\n\t0x0993, 0x09a8,\n\t0x09aa, 0x09b0,\n\t0x09b2, 0x09b2,\n\t0x09b6, 0x09b9,\n\t0x09bc, 0x09bc,\n\t0x09be, 0x09c4,\n\t0x09c7, 0x09c8,\n\t0x09cb, 0x09cd,\n\t0x09d7, 0x09d7,\n\t0x09dc, 0x09dd,\n\t0x09df, 0x09e3,\n\t0x09e6, 0x09fa,\n\t0x0a02, 0x0a02,\n\t0x0a05, 0x0a0a,\n\t0x0a0f, 0x0a10,\n\t0x0a13, 0x0a28,\n\t0x0a2a, 0x0a30,\n\t0x0a32, 0x0a33,\n\t0x0a35, 0x0a36,\n\t0x0a38, 0x0a39,\n\t0x0a3c, 0x0a3c,\n\t0x0a3e, 0x0a42,\n\t0x0a47, 0x0a48,\n\t0x0a4b, 0x0a4d,\n\t0x0a59, 0x0a5c,\n\t0x0a5e, 0x0a5e,\n\t0x0a66, 0x0a74,\n\t0x0a81, 0x0a83,\n\t0x0a85, 0x0a8b,\n\t0x0a8d, 0x0a8d,\n\t0x0a8f, 0x0a91,\n\t0x0a93, 0x0aa8,\n\t0x0aaa, 0x0ab0,\n\t0x0ab2, 0x0ab3,\n\t0x0ab5, 0x0ab9,\n\t0x0abc, 0x0ac5,\n\t0x0ac7, 0x0ac9,\n\t0x0acb, 0x0acd,\n\t0x0ad0, 0x0ad0,\n\t0x0ae0, 0x0ae0,\n\t0x0ae6, 0x0aef,\n\t0x0b01, 0x0b03,\n\t0x0b05, 0x0b0c,\n\t0x0b0f, 0x0b10,\n\t0x0b13, 0x0b28,\n\t0x0b2a, 0x0b30,\n\t0x0b32, 0x0b33,\n\t0x0b36, 0x0b39,\n\t0x0b3c, 0x0b43,\n\t0x0b47, 0x0b48,\n\t0x0b4b, 0x0b4d,\n\t0x0b56, 0x0b57,\n\t0x0b5c, 0x0b5d,\n\t0x0b5f, 0x0b61,\n\t0x0b66, 0x0b70,\n\t0x0b82, 0x0b83,\n\t0x0b85, 0x0b8a,\n\t0x0b8e, 0x0b90,\n\t0x0b92, 0x0b95,\n\t0x0b99, 0x0b9a,\n\t0x0b9c, 0x0b9c,\n\t0x0b9e, 0x0b9f,\n\t0x0ba3, 0x0ba4,\n\t0x0ba8, 0x0baa,\n\t0x0bae, 0x0bb5,\n\t0x0bb7, 0x0bb9,\n\t0x0bbe, 0x0bc2,\n\t0x0bc6, 0x0bc8,\n\t0x0bca, 0x0bcd,\n\t0x0bd7, 0x0bd7,\n\t0x0be7, 0x0bf2,\n\t0x0c01, 0x0c03,\n\t0x0c05, 0x0c0c,\n\t0x0c0e, 0x0c10,\n\t0x0c12, 0x0c28,\n\t0x0c2a, 0x0c33,\n\t0x0c35, 0x0c39,\n\t0x0c3e, 0x0c44,\n\t0x0c46, 0x0c48,\n\t0x0c4a, 0x0c4d,\n\t0x0c55, 0x0c56,\n\t0x0c60, 0x0c61,\n\t0x0c66, 0x0c6f,\n\t0x0c82, 0x0c83,\n\t0x0c85, 0x0c8c,\n\t0x0c8e, 0x0c90,\n\t0x0c92, 0x0ca8,\n\t0x0caa, 0x0cb3,\n\t0x0cb5, 0x0cb9,\n\t0x0cbe, 0x0cc4,\n\t0x0cc6, 0x0cc8,\n\t0x0cca, 0x0ccd,\n\t0x0cd5, 0x0cd6,\n\t0x0cde, 0x0cde,\n\t0x0ce0, 0x0ce1,\n\t0x0ce6, 0x0cef,\n\t0x0d02, 0x0d03,\n\t0x0d05, 0x0d0c,\n\t0x0d0e, 0x0d10,\n\t0x0d12, 0x0d28,\n\t0x0d2a, 0x0d39,\n\t0x0d3e, 0x0d43,\n\t0x0d46, 0x0d48,\n\t0x0d4a, 0x0d4d,\n\t0x0d57, 0x0d57,\n\t0x0d60, 0x0d61,\n\t0x0d66, 0x0d6f,\n\t0x0e01, 0x0e3a,\n\t0x0e3f, 0x0e5b,\n\t0x0e81, 0x0e82,\n\t0x0e84, 0x0e84,\n\t0x0e87, 0x0e88,\n\t0x0e8a, 0x0e8a,\n\t0x0e8d, 0x0e8d,\n\t0x0e94, 0x0e97,\n\t0x0e99, 0x0e9f,\n\t0x0ea1, 0x0ea3,\n\t0x0ea5, 0x0ea5,\n\t0x0ea7, 0x0ea7,\n\t0x0eaa, 0x0eab,\n\t0x0ead, 0x0eb9,\n\t0x0ebb, 0x0ebd,\n\t0x0ec0, 0x0ec4,\n\t0x0ec6, 0x0ec6,\n\t0x0ec8, 0x0ecd,\n\t0x0ed0, 0x0ed9,\n\t0x0edc, 0x0edd,\n\t0x0f00, 0x0f47,\n\t0x0f49, 0x0f69,\n\t0x0f71, 0x0f8b,\n\t0x0f90, 0x0f95,\n\t0x0f97, 0x0f97,\n\t0x0f99, 0x0fad,\n\t0x0fb1, 0x0fb7,\n\t0x0fb9, 0x0fb9,\n\t0x10a0, 0x10c5,\n\t0x10d0, 0x10f6,\n\t0x10fb, 0x10fb,\n\t0x1100, 0x1159,\n\t0x115f, 0x11a2,\n\t0x11a8, 0x11f9,\n\t0x1e00, 0x1e9b,\n\t0x1ea0, 0x1ef9,\n\t0x1f00, 0x1f15,\n\t0x1f18, 0x1f1d,\n\t0x1f20, 0x1f45,\n\t0x1f48, 0x1f4d,\n\t0x1f50, 0x1f57,\n\t0x1f59, 0x1f59,\n\t0x1f5b, 0x1f5b,\n\t0x1f5d, 0x1f5d,\n\t0x1f5f, 0x1f7d,\n\t0x1f80, 0x1fb4,\n\t0x1fb6, 0x1fc4,\n\t0x1fc6, 0x1fd3,\n\t0x1fd6, 0x1fdb,\n\t0x1fdd, 0x1fef,\n\t0x1ff2, 0x1ff4,\n\t0x1ff6, 0x1ffe,\n\t0x2000, 0x202e,\n\t0x2030, 0x2046,\n\t0x206a, 0x2070,\n\t0x2074, 0x208e,\n\t0x20a0, 0x20ab,\n\t0x20d0, 0x20e1,\n\t0x2100, 0x2138,\n\t0x2153, 0x2182,\n\t0x2190, 0x21ea,\n\t0x2200, 0x22f1,\n\t0x2300, 0x2300,\n\t0x2302, 0x237a,\n\t0x2400, 0x2424,\n\t0x2440, 0x244a,\n\t0x2460, 0x24ea,\n\t0x2500, 0x2595,\n\t0x25a0, 0x25ef,\n\t0x2600, 0x2613,\n\t0x261a, 0x266f,\n\t0x2701, 0x2704,\n\t0x2706, 0x2709,\n\t0x270c, 0x2727,\n\t0x2729, 0x274b,\n\t0x274d, 0x274d,\n\t0x274f, 0x2752,\n\t0x2756, 0x2756,\n\t0x2758, 0x275e,\n\t0x2761, 0x2767,\n\t0x2776, 0x2794,\n\t0x2798, 0x27af,\n\t0x27b1, 0x27be,\n\t0x3000, 0x3037,\n\t0x303f, 0x303f,\n\t0x3041, 0x3094,\n\t0x3099, 0x309e,\n\t0x30a1, 0x30fe,\n\t0x3105, 0x312c,\n\t0x3131, 0x318e,\n\t0x3190, 0x319f,\n\t0x3200, 0x321c,\n\t0x3220, 0x3243,\n\t0x3260, 0x327b,\n\t0x327f, 0x32b0,\n\t0x32c0, 0x32cb,\n\t0x32d0, 0x32fe,\n\t0x3300, 0x3376,\n\t0x337b, 0x33dd,\n\t0x33e0, 0x33fe,\n\t0x4e00, 0x9fa5,\n\t0xac00, 0xd7a3,\n\t0xd800, 0xfa2d,\n\t0xfb00, 0xfb06,\n\t0xfb13, 0xfb17,\n\t0xfb1e, 0xfb36,\n\t0xfb38, 0xfb3c,\n\t0xfb3e, 0xfb3e,\n\t0xfb40, 0xfb41,\n\t0xfb43, 0xfb44,\n\t0xfb46, 0xfbb1,\n\t0xfbd3, 0xfd3f,\n\t0xfd50, 0xfd8f,\n\t0xfd92, 0xfdc7,\n\t0xfdf0, 0xfdfb,\n\t0xfe20, 0xfe23,\n\t0xfe30, 0xfe44,\n\t0xfe49, 0xfe52,\n\t0xfe54, 0xfe66,\n\t0xfe68, 0xfe6b,\n\t0xfe70, 0xfe72,\n\t0xfe74, 0xfe74,\n\t0xfe76, 0xfefc,\n\t0xfeff, 0xfeff,\n\t0xff01, 0xff5e,\n\t0xff61, 0xffbe,\n\t0xffc2, 0xffc7,\n\t0xffca, 0xffcf,\n\t0xffd2, 0xffd7,\n\t0xffda, 0xffdc,\n\t0xffe0, 0xffe6,\n\t0xffe8, 0xffee,\n\t0xfffd, 0xffff,\n\t0x1fffe, 0x1ffff,\n\t0x2fffe, 0x2ffff,\n\t0x3fffe, 0x3ffff,\n\t0x4fffe, 0x4ffff,\n\t0x5fffe, 0x5ffff,\n\t0x6fffe, 0x6ffff,\n\t0x7fffe, 0x7ffff,\n\t0x8fffe, 0x8ffff,\n\t0x9fffe, 0x9ffff,\n\t0xafffe, 0xaffff,\n\t0xbfffe, 0xbffff,\n\t0xcfffe, 0xcffff,\n\t0xdfffe, 0xdffff,\n\t0xefffe, 0x10ffff,\n}; /* CR_Age_2_0 */\n\n/* 'Age_2_1': Derived Age 2.1 */\nstatic const OnigCodePoint CR_Age_2_1[] = {\n\t312,\n\t0x0000, 0x01f5,\n\t0x01fa, 0x0217,\n\t0x0250, 0x02a8,\n\t0x02b0, 0x02de,\n\t0x02e0, 0x02e9,\n\t0x0300, 0x0345,\n\t0x0360, 0x0361,\n\t0x0374, 0x0375,\n\t0x037a, 0x037a,\n\t0x037e, 0x037e,\n\t0x0384, 0x038a,\n\t0x038c, 0x038c,\n\t0x038e, 0x03a1,\n\t0x03a3, 0x03ce,\n\t0x03d0, 0x03d6,\n\t0x03da, 0x03da,\n\t0x03dc, 0x03dc,\n\t0x03de, 0x03de,\n\t0x03e0, 0x03e0,\n\t0x03e2, 0x03f3,\n\t0x0401, 0x040c,\n\t0x040e, 0x044f,\n\t0x0451, 0x045c,\n\t0x045e, 0x0486,\n\t0x0490, 0x04c4,\n\t0x04c7, 0x04c8,\n\t0x04cb, 0x04cc,\n\t0x04d0, 0x04eb,\n\t0x04ee, 0x04f5,\n\t0x04f8, 0x04f9,\n\t0x0531, 0x0556,\n\t0x0559, 0x055f,\n\t0x0561, 0x0587,\n\t0x0589, 0x0589,\n\t0x0591, 0x05a1,\n\t0x05a3, 0x05b9,\n\t0x05bb, 0x05c4,\n\t0x05d0, 0x05ea,\n\t0x05f0, 0x05f4,\n\t0x060c, 0x060c,\n\t0x061b, 0x061b,\n\t0x061f, 0x061f,\n\t0x0621, 0x063a,\n\t0x0640, 0x0652,\n\t0x0660, 0x066d,\n\t0x0670, 0x06b7,\n\t0x06ba, 0x06be,\n\t0x06c0, 0x06ce,\n\t0x06d0, 0x06ed,\n\t0x06f0, 0x06f9,\n\t0x0901, 0x0903,\n\t0x0905, 0x0939,\n\t0x093c, 0x094d,\n\t0x0950, 0x0954,\n\t0x0958, 0x0970,\n\t0x0981, 0x0983,\n\t0x0985, 0x098c,\n\t0x098f, 0x0990,\n\t0x0993, 0x09a8,\n\t0x09aa, 0x09b0,\n\t0x09b2, 0x09b2,\n\t0x09b6, 0x09b9,\n\t0x09bc, 0x09bc,\n\t0x09be, 0x09c4,\n\t0x09c7, 0x09c8,\n\t0x09cb, 0x09cd,\n\t0x09d7, 0x09d7,\n\t0x09dc, 0x09dd,\n\t0x09df, 0x09e3,\n\t0x09e6, 0x09fa,\n\t0x0a02, 0x0a02,\n\t0x0a05, 0x0a0a,\n\t0x0a0f, 0x0a10,\n\t0x0a13, 0x0a28,\n\t0x0a2a, 0x0a30,\n\t0x0a32, 0x0a33,\n\t0x0a35, 0x0a36,\n\t0x0a38, 0x0a39,\n\t0x0a3c, 0x0a3c,\n\t0x0a3e, 0x0a42,\n\t0x0a47, 0x0a48,\n\t0x0a4b, 0x0a4d,\n\t0x0a59, 0x0a5c,\n\t0x0a5e, 0x0a5e,\n\t0x0a66, 0x0a74,\n\t0x0a81, 0x0a83,\n\t0x0a85, 0x0a8b,\n\t0x0a8d, 0x0a8d,\n\t0x0a8f, 0x0a91,\n\t0x0a93, 0x0aa8,\n\t0x0aaa, 0x0ab0,\n\t0x0ab2, 0x0ab3,\n\t0x0ab5, 0x0ab9,\n\t0x0abc, 0x0ac5,\n\t0x0ac7, 0x0ac9,\n\t0x0acb, 0x0acd,\n\t0x0ad0, 0x0ad0,\n\t0x0ae0, 0x0ae0,\n\t0x0ae6, 0x0aef,\n\t0x0b01, 0x0b03,\n\t0x0b05, 0x0b0c,\n\t0x0b0f, 0x0b10,\n\t0x0b13, 0x0b28,\n\t0x0b2a, 0x0b30,\n\t0x0b32, 0x0b33,\n\t0x0b36, 0x0b39,\n\t0x0b3c, 0x0b43,\n\t0x0b47, 0x0b48,\n\t0x0b4b, 0x0b4d,\n\t0x0b56, 0x0b57,\n\t0x0b5c, 0x0b5d,\n\t0x0b5f, 0x0b61,\n\t0x0b66, 0x0b70,\n\t0x0b82, 0x0b83,\n\t0x0b85, 0x0b8a,\n\t0x0b8e, 0x0b90,\n\t0x0b92, 0x0b95,\n\t0x0b99, 0x0b9a,\n\t0x0b9c, 0x0b9c,\n\t0x0b9e, 0x0b9f,\n\t0x0ba3, 0x0ba4,\n\t0x0ba8, 0x0baa,\n\t0x0bae, 0x0bb5,\n\t0x0bb7, 0x0bb9,\n\t0x0bbe, 0x0bc2,\n\t0x0bc6, 0x0bc8,\n\t0x0bca, 0x0bcd,\n\t0x0bd7, 0x0bd7,\n\t0x0be7, 0x0bf2,\n\t0x0c01, 0x0c03,\n\t0x0c05, 0x0c0c,\n\t0x0c0e, 0x0c10,\n\t0x0c12, 0x0c28,\n\t0x0c2a, 0x0c33,\n\t0x0c35, 0x0c39,\n\t0x0c3e, 0x0c44,\n\t0x0c46, 0x0c48,\n\t0x0c4a, 0x0c4d,\n\t0x0c55, 0x0c56,\n\t0x0c60, 0x0c61,\n\t0x0c66, 0x0c6f,\n\t0x0c82, 0x0c83,\n\t0x0c85, 0x0c8c,\n\t0x0c8e, 0x0c90,\n\t0x0c92, 0x0ca8,\n\t0x0caa, 0x0cb3,\n\t0x0cb5, 0x0cb9,\n\t0x0cbe, 0x0cc4,\n\t0x0cc6, 0x0cc8,\n\t0x0cca, 0x0ccd,\n\t0x0cd5, 0x0cd6,\n\t0x0cde, 0x0cde,\n\t0x0ce0, 0x0ce1,\n\t0x0ce6, 0x0cef,\n\t0x0d02, 0x0d03,\n\t0x0d05, 0x0d0c,\n\t0x0d0e, 0x0d10,\n\t0x0d12, 0x0d28,\n\t0x0d2a, 0x0d39,\n\t0x0d3e, 0x0d43,\n\t0x0d46, 0x0d48,\n\t0x0d4a, 0x0d4d,\n\t0x0d57, 0x0d57,\n\t0x0d60, 0x0d61,\n\t0x0d66, 0x0d6f,\n\t0x0e01, 0x0e3a,\n\t0x0e3f, 0x0e5b,\n\t0x0e81, 0x0e82,\n\t0x0e84, 0x0e84,\n\t0x0e87, 0x0e88,\n\t0x0e8a, 0x0e8a,\n\t0x0e8d, 0x0e8d,\n\t0x0e94, 0x0e97,\n\t0x0e99, 0x0e9f,\n\t0x0ea1, 0x0ea3,\n\t0x0ea5, 0x0ea5,\n\t0x0ea7, 0x0ea7,\n\t0x0eaa, 0x0eab,\n\t0x0ead, 0x0eb9,\n\t0x0ebb, 0x0ebd,\n\t0x0ec0, 0x0ec4,\n\t0x0ec6, 0x0ec6,\n\t0x0ec8, 0x0ecd,\n\t0x0ed0, 0x0ed9,\n\t0x0edc, 0x0edd,\n\t0x0f00, 0x0f47,\n\t0x0f49, 0x0f69,\n\t0x0f71, 0x0f8b,\n\t0x0f90, 0x0f95,\n\t0x0f97, 0x0f97,\n\t0x0f99, 0x0fad,\n\t0x0fb1, 0x0fb7,\n\t0x0fb9, 0x0fb9,\n\t0x10a0, 0x10c5,\n\t0x10d0, 0x10f6,\n\t0x10fb, 0x10fb,\n\t0x1100, 0x1159,\n\t0x115f, 0x11a2,\n\t0x11a8, 0x11f9,\n\t0x1e00, 0x1e9b,\n\t0x1ea0, 0x1ef9,\n\t0x1f00, 0x1f15,\n\t0x1f18, 0x1f1d,\n\t0x1f20, 0x1f45,\n\t0x1f48, 0x1f4d,\n\t0x1f50, 0x1f57,\n\t0x1f59, 0x1f59,\n\t0x1f5b, 0x1f5b,\n\t0x1f5d, 0x1f5d,\n\t0x1f5f, 0x1f7d,\n\t0x1f80, 0x1fb4,\n\t0x1fb6, 0x1fc4,\n\t0x1fc6, 0x1fd3,\n\t0x1fd6, 0x1fdb,\n\t0x1fdd, 0x1fef,\n\t0x1ff2, 0x1ff4,\n\t0x1ff6, 0x1ffe,\n\t0x2000, 0x202e,\n\t0x2030, 0x2046,\n\t0x206a, 0x2070,\n\t0x2074, 0x208e,\n\t0x20a0, 0x20ac,\n\t0x20d0, 0x20e1,\n\t0x2100, 0x2138,\n\t0x2153, 0x2182,\n\t0x2190, 0x21ea,\n\t0x2200, 0x22f1,\n\t0x2300, 0x2300,\n\t0x2302, 0x237a,\n\t0x2400, 0x2424,\n\t0x2440, 0x244a,\n\t0x2460, 0x24ea,\n\t0x2500, 0x2595,\n\t0x25a0, 0x25ef,\n\t0x2600, 0x2613,\n\t0x261a, 0x266f,\n\t0x2701, 0x2704,\n\t0x2706, 0x2709,\n\t0x270c, 0x2727,\n\t0x2729, 0x274b,\n\t0x274d, 0x274d,\n\t0x274f, 0x2752,\n\t0x2756, 0x2756,\n\t0x2758, 0x275e,\n\t0x2761, 0x2767,\n\t0x2776, 0x2794,\n\t0x2798, 0x27af,\n\t0x27b1, 0x27be,\n\t0x3000, 0x3037,\n\t0x303f, 0x303f,\n\t0x3041, 0x3094,\n\t0x3099, 0x309e,\n\t0x30a1, 0x30fe,\n\t0x3105, 0x312c,\n\t0x3131, 0x318e,\n\t0x3190, 0x319f,\n\t0x3200, 0x321c,\n\t0x3220, 0x3243,\n\t0x3260, 0x327b,\n\t0x327f, 0x32b0,\n\t0x32c0, 0x32cb,\n\t0x32d0, 0x32fe,\n\t0x3300, 0x3376,\n\t0x337b, 0x33dd,\n\t0x33e0, 0x33fe,\n\t0x4e00, 0x9fa5,\n\t0xac00, 0xd7a3,\n\t0xd800, 0xfa2d,\n\t0xfb00, 0xfb06,\n\t0xfb13, 0xfb17,\n\t0xfb1e, 0xfb36,\n\t0xfb38, 0xfb3c,\n\t0xfb3e, 0xfb3e,\n\t0xfb40, 0xfb41,\n\t0xfb43, 0xfb44,\n\t0xfb46, 0xfbb1,\n\t0xfbd3, 0xfd3f,\n\t0xfd50, 0xfd8f,\n\t0xfd92, 0xfdc7,\n\t0xfdf0, 0xfdfb,\n\t0xfe20, 0xfe23,\n\t0xfe30, 0xfe44,\n\t0xfe49, 0xfe52,\n\t0xfe54, 0xfe66,\n\t0xfe68, 0xfe6b,\n\t0xfe70, 0xfe72,\n\t0xfe74, 0xfe74,\n\t0xfe76, 0xfefc,\n\t0xfeff, 0xfeff,\n\t0xff01, 0xff5e,\n\t0xff61, 0xffbe,\n\t0xffc2, 0xffc7,\n\t0xffca, 0xffcf,\n\t0xffd2, 0xffd7,\n\t0xffda, 0xffdc,\n\t0xffe0, 0xffe6,\n\t0xffe8, 0xffee,\n\t0xfffc, 0xffff,\n\t0x1fffe, 0x1ffff,\n\t0x2fffe, 0x2ffff,\n\t0x3fffe, 0x3ffff,\n\t0x4fffe, 0x4ffff,\n\t0x5fffe, 0x5ffff,\n\t0x6fffe, 0x6ffff,\n\t0x7fffe, 0x7ffff,\n\t0x8fffe, 0x8ffff,\n\t0x9fffe, 0x9ffff,\n\t0xafffe, 0xaffff,\n\t0xbfffe, 0xbffff,\n\t0xcfffe, 0xcffff,\n\t0xdfffe, 0xdffff,\n\t0xefffe, 0x10ffff,\n}; /* CR_Age_2_1 */\n\n/* 'Age_3_0': Derived Age 3.0 */\nstatic const OnigCodePoint CR_Age_3_0[] = {\n\t369,\n\t0x0000, 0x021f,\n\t0x0222, 0x0233,\n\t0x0250, 0x02ad,\n\t0x02b0, 0x02ee,\n\t0x0300, 0x034e,\n\t0x0360, 0x0362,\n\t0x0374, 0x0375,\n\t0x037a, 0x037a,\n\t0x037e, 0x037e,\n\t0x0384, 0x038a,\n\t0x038c, 0x038c,\n\t0x038e, 0x03a1,\n\t0x03a3, 0x03ce,\n\t0x03d0, 0x03d7,\n\t0x03da, 0x03f3,\n\t0x0400, 0x0486,\n\t0x0488, 0x0489,\n\t0x048c, 0x04c4,\n\t0x04c7, 0x04c8,\n\t0x04cb, 0x04cc,\n\t0x04d0, 0x04f5,\n\t0x04f8, 0x04f9,\n\t0x0531, 0x0556,\n\t0x0559, 0x055f,\n\t0x0561, 0x0587,\n\t0x0589, 0x058a,\n\t0x0591, 0x05a1,\n\t0x05a3, 0x05b9,\n\t0x05bb, 0x05c4,\n\t0x05d0, 0x05ea,\n\t0x05f0, 0x05f4,\n\t0x060c, 0x060c,\n\t0x061b, 0x061b,\n\t0x061f, 0x061f,\n\t0x0621, 0x063a,\n\t0x0640, 0x0655,\n\t0x0660, 0x066d,\n\t0x0670, 0x06ed,\n\t0x06f0, 0x06fe,\n\t0x0700, 0x070d,\n\t0x070f, 0x072c,\n\t0x0730, 0x074a,\n\t0x0780, 0x07b0,\n\t0x0901, 0x0903,\n\t0x0905, 0x0939,\n\t0x093c, 0x094d,\n\t0x0950, 0x0954,\n\t0x0958, 0x0970,\n\t0x0981, 0x0983,\n\t0x0985, 0x098c,\n\t0x098f, 0x0990,\n\t0x0993, 0x09a8,\n\t0x09aa, 0x09b0,\n\t0x09b2, 0x09b2,\n\t0x09b6, 0x09b9,\n\t0x09bc, 0x09bc,\n\t0x09be, 0x09c4,\n\t0x09c7, 0x09c8,\n\t0x09cb, 0x09cd,\n\t0x09d7, 0x09d7,\n\t0x09dc, 0x09dd,\n\t0x09df, 0x09e3,\n\t0x09e6, 0x09fa,\n\t0x0a02, 0x0a02,\n\t0x0a05, 0x0a0a,\n\t0x0a0f, 0x0a10,\n\t0x0a13, 0x0a28,\n\t0x0a2a, 0x0a30,\n\t0x0a32, 0x0a33,\n\t0x0a35, 0x0a36,\n\t0x0a38, 0x0a39,\n\t0x0a3c, 0x0a3c,\n\t0x0a3e, 0x0a42,\n\t0x0a47, 0x0a48,\n\t0x0a4b, 0x0a4d,\n\t0x0a59, 0x0a5c,\n\t0x0a5e, 0x0a5e,\n\t0x0a66, 0x0a74,\n\t0x0a81, 0x0a83,\n\t0x0a85, 0x0a8b,\n\t0x0a8d, 0x0a8d,\n\t0x0a8f, 0x0a91,\n\t0x0a93, 0x0aa8,\n\t0x0aaa, 0x0ab0,\n\t0x0ab2, 0x0ab3,\n\t0x0ab5, 0x0ab9,\n\t0x0abc, 0x0ac5,\n\t0x0ac7, 0x0ac9,\n\t0x0acb, 0x0acd,\n\t0x0ad0, 0x0ad0,\n\t0x0ae0, 0x0ae0,\n\t0x0ae6, 0x0aef,\n\t0x0b01, 0x0b03,\n\t0x0b05, 0x0b0c,\n\t0x0b0f, 0x0b10,\n\t0x0b13, 0x0b28,\n\t0x0b2a, 0x0b30,\n\t0x0b32, 0x0b33,\n\t0x0b36, 0x0b39,\n\t0x0b3c, 0x0b43,\n\t0x0b47, 0x0b48,\n\t0x0b4b, 0x0b4d,\n\t0x0b56, 0x0b57,\n\t0x0b5c, 0x0b5d,\n\t0x0b5f, 0x0b61,\n\t0x0b66, 0x0b70,\n\t0x0b82, 0x0b83,\n\t0x0b85, 0x0b8a,\n\t0x0b8e, 0x0b90,\n\t0x0b92, 0x0b95,\n\t0x0b99, 0x0b9a,\n\t0x0b9c, 0x0b9c,\n\t0x0b9e, 0x0b9f,\n\t0x0ba3, 0x0ba4,\n\t0x0ba8, 0x0baa,\n\t0x0bae, 0x0bb5,\n\t0x0bb7, 0x0bb9,\n\t0x0bbe, 0x0bc2,\n\t0x0bc6, 0x0bc8,\n\t0x0bca, 0x0bcd,\n\t0x0bd7, 0x0bd7,\n\t0x0be7, 0x0bf2,\n\t0x0c01, 0x0c03,\n\t0x0c05, 0x0c0c,\n\t0x0c0e, 0x0c10,\n\t0x0c12, 0x0c28,\n\t0x0c2a, 0x0c33,\n\t0x0c35, 0x0c39,\n\t0x0c3e, 0x0c44,\n\t0x0c46, 0x0c48,\n\t0x0c4a, 0x0c4d,\n\t0x0c55, 0x0c56,\n\t0x0c60, 0x0c61,\n\t0x0c66, 0x0c6f,\n\t0x0c82, 0x0c83,\n\t0x0c85, 0x0c8c,\n\t0x0c8e, 0x0c90,\n\t0x0c92, 0x0ca8,\n\t0x0caa, 0x0cb3,\n\t0x0cb5, 0x0cb9,\n\t0x0cbe, 0x0cc4,\n\t0x0cc6, 0x0cc8,\n\t0x0cca, 0x0ccd,\n\t0x0cd5, 0x0cd6,\n\t0x0cde, 0x0cde,\n\t0x0ce0, 0x0ce1,\n\t0x0ce6, 0x0cef,\n\t0x0d02, 0x0d03,\n\t0x0d05, 0x0d0c,\n\t0x0d0e, 0x0d10,\n\t0x0d12, 0x0d28,\n\t0x0d2a, 0x0d39,\n\t0x0d3e, 0x0d43,\n\t0x0d46, 0x0d48,\n\t0x0d4a, 0x0d4d,\n\t0x0d57, 0x0d57,\n\t0x0d60, 0x0d61,\n\t0x0d66, 0x0d6f,\n\t0x0d82, 0x0d83,\n\t0x0d85, 0x0d96,\n\t0x0d9a, 0x0db1,\n\t0x0db3, 0x0dbb,\n\t0x0dbd, 0x0dbd,\n\t0x0dc0, 0x0dc6,\n\t0x0dca, 0x0dca,\n\t0x0dcf, 0x0dd4,\n\t0x0dd6, 0x0dd6,\n\t0x0dd8, 0x0ddf,\n\t0x0df2, 0x0df4,\n\t0x0e01, 0x0e3a,\n\t0x0e3f, 0x0e5b,\n\t0x0e81, 0x0e82,\n\t0x0e84, 0x0e84,\n\t0x0e87, 0x0e88,\n\t0x0e8a, 0x0e8a,\n\t0x0e8d, 0x0e8d,\n\t0x0e94, 0x0e97,\n\t0x0e99, 0x0e9f,\n\t0x0ea1, 0x0ea3,\n\t0x0ea5, 0x0ea5,\n\t0x0ea7, 0x0ea7,\n\t0x0eaa, 0x0eab,\n\t0x0ead, 0x0eb9,\n\t0x0ebb, 0x0ebd,\n\t0x0ec0, 0x0ec4,\n\t0x0ec6, 0x0ec6,\n\t0x0ec8, 0x0ecd,\n\t0x0ed0, 0x0ed9,\n\t0x0edc, 0x0edd,\n\t0x0f00, 0x0f47,\n\t0x0f49, 0x0f6a,\n\t0x0f71, 0x0f8b,\n\t0x0f90, 0x0f97,\n\t0x0f99, 0x0fbc,\n\t0x0fbe, 0x0fcc,\n\t0x0fcf, 0x0fcf,\n\t0x1000, 0x1021,\n\t0x1023, 0x1027,\n\t0x1029, 0x102a,\n\t0x102c, 0x1032,\n\t0x1036, 0x1039,\n\t0x1040, 0x1059,\n\t0x10a0, 0x10c5,\n\t0x10d0, 0x10f6,\n\t0x10fb, 0x10fb,\n\t0x1100, 0x1159,\n\t0x115f, 0x11a2,\n\t0x11a8, 0x11f9,\n\t0x1200, 0x1206,\n\t0x1208, 0x1246,\n\t0x1248, 0x1248,\n\t0x124a, 0x124d,\n\t0x1250, 0x1256,\n\t0x1258, 0x1258,\n\t0x125a, 0x125d,\n\t0x1260, 0x1286,\n\t0x1288, 0x1288,\n\t0x128a, 0x128d,\n\t0x1290, 0x12ae,\n\t0x12b0, 0x12b0,\n\t0x12b2, 0x12b5,\n\t0x12b8, 0x12be,\n\t0x12c0, 0x12c0,\n\t0x12c2, 0x12c5,\n\t0x12c8, 0x12ce,\n\t0x12d0, 0x12d6,\n\t0x12d8, 0x12ee,\n\t0x12f0, 0x130e,\n\t0x1310, 0x1310,\n\t0x1312, 0x1315,\n\t0x1318, 0x131e,\n\t0x1320, 0x1346,\n\t0x1348, 0x135a,\n\t0x1361, 0x137c,\n\t0x13a0, 0x13f4,\n\t0x1401, 0x1676,\n\t0x1680, 0x169c,\n\t0x16a0, 0x16f0,\n\t0x1780, 0x17dc,\n\t0x17e0, 0x17e9,\n\t0x1800, 0x180e,\n\t0x1810, 0x1819,\n\t0x1820, 0x1877,\n\t0x1880, 0x18a9,\n\t0x1e00, 0x1e9b,\n\t0x1ea0, 0x1ef9,\n\t0x1f00, 0x1f15,\n\t0x1f18, 0x1f1d,\n\t0x1f20, 0x1f45,\n\t0x1f48, 0x1f4d,\n\t0x1f50, 0x1f57,\n\t0x1f59, 0x1f59,\n\t0x1f5b, 0x1f5b,\n\t0x1f5d, 0x1f5d,\n\t0x1f5f, 0x1f7d,\n\t0x1f80, 0x1fb4,\n\t0x1fb6, 0x1fc4,\n\t0x1fc6, 0x1fd3,\n\t0x1fd6, 0x1fdb,\n\t0x1fdd, 0x1fef,\n\t0x1ff2, 0x1ff4,\n\t0x1ff6, 0x1ffe,\n\t0x2000, 0x2046,\n\t0x2048, 0x204d,\n\t0x206a, 0x2070,\n\t0x2074, 0x208e,\n\t0x20a0, 0x20af,\n\t0x20d0, 0x20e3,\n\t0x2100, 0x213a,\n\t0x2153, 0x2183,\n\t0x2190, 0x21f3,\n\t0x2200, 0x22f1,\n\t0x2300, 0x237b,\n\t0x237d, 0x239a,\n\t0x2400, 0x2426,\n\t0x2440, 0x244a,\n\t0x2460, 0x24ea,\n\t0x2500, 0x2595,\n\t0x25a0, 0x25f7,\n\t0x2600, 0x2613,\n\t0x2619, 0x2671,\n\t0x2701, 0x2704,\n\t0x2706, 0x2709,\n\t0x270c, 0x2727,\n\t0x2729, 0x274b,\n\t0x274d, 0x274d,\n\t0x274f, 0x2752,\n\t0x2756, 0x2756,\n\t0x2758, 0x275e,\n\t0x2761, 0x2767,\n\t0x2776, 0x2794,\n\t0x2798, 0x27af,\n\t0x27b1, 0x27be,\n\t0x2800, 0x28ff,\n\t0x2e80, 0x2e99,\n\t0x2e9b, 0x2ef3,\n\t0x2f00, 0x2fd5,\n\t0x2ff0, 0x2ffb,\n\t0x3000, 0x303a,\n\t0x303e, 0x303f,\n\t0x3041, 0x3094,\n\t0x3099, 0x309e,\n\t0x30a1, 0x30fe,\n\t0x3105, 0x312c,\n\t0x3131, 0x318e,\n\t0x3190, 0x31b7,\n\t0x3200, 0x321c,\n\t0x3220, 0x3243,\n\t0x3260, 0x327b,\n\t0x327f, 0x32b0,\n\t0x32c0, 0x32cb,\n\t0x32d0, 0x32fe,\n\t0x3300, 0x3376,\n\t0x337b, 0x33dd,\n\t0x33e0, 0x33fe,\n\t0x3400, 0x4db5,\n\t0x4e00, 0x9fa5,\n\t0xa000, 0xa48c,\n\t0xa490, 0xa4a1,\n\t0xa4a4, 0xa4b3,\n\t0xa4b5, 0xa4c0,\n\t0xa4c2, 0xa4c4,\n\t0xa4c6, 0xa4c6,\n\t0xac00, 0xd7a3,\n\t0xd800, 0xfa2d,\n\t0xfb00, 0xfb06,\n\t0xfb13, 0xfb17,\n\t0xfb1d, 0xfb36,\n\t0xfb38, 0xfb3c,\n\t0xfb3e, 0xfb3e,\n\t0xfb40, 0xfb41,\n\t0xfb43, 0xfb44,\n\t0xfb46, 0xfbb1,\n\t0xfbd3, 0xfd3f,\n\t0xfd50, 0xfd8f,\n\t0xfd92, 0xfdc7,\n\t0xfdf0, 0xfdfb,\n\t0xfe20, 0xfe23,\n\t0xfe30, 0xfe44,\n\t0xfe49, 0xfe52,\n\t0xfe54, 0xfe66,\n\t0xfe68, 0xfe6b,\n\t0xfe70, 0xfe72,\n\t0xfe74, 0xfe74,\n\t0xfe76, 0xfefc,\n\t0xfeff, 0xfeff,\n\t0xff01, 0xff5e,\n\t0xff61, 0xffbe,\n\t0xffc2, 0xffc7,\n\t0xffca, 0xffcf,\n\t0xffd2, 0xffd7,\n\t0xffda, 0xffdc,\n\t0xffe0, 0xffe6,\n\t0xffe8, 0xffee,\n\t0xfff9, 0xffff,\n\t0x1fffe, 0x1ffff,\n\t0x2fffe, 0x2ffff,\n\t0x3fffe, 0x3ffff,\n\t0x4fffe, 0x4ffff,\n\t0x5fffe, 0x5ffff,\n\t0x6fffe, 0x6ffff,\n\t0x7fffe, 0x7ffff,\n\t0x8fffe, 0x8ffff,\n\t0x9fffe, 0x9ffff,\n\t0xafffe, 0xaffff,\n\t0xbfffe, 0xbffff,\n\t0xcfffe, 0xcffff,\n\t0xdfffe, 0xdffff,\n\t0xefffe, 0x10ffff,\n}; /* CR_Age_3_0 */\n\n/* 'Age_3_1': Derived Age 3.1 */\nstatic const OnigCodePoint CR_Age_3_1[] = {\n\t402,\n\t0x0000, 0x021f,\n\t0x0222, 0x0233,\n\t0x0250, 0x02ad,\n\t0x02b0, 0x02ee,\n\t0x0300, 0x034e,\n\t0x0360, 0x0362,\n\t0x0374, 0x0375,\n\t0x037a, 0x037a,\n\t0x037e, 0x037e,\n\t0x0384, 0x038a,\n\t0x038c, 0x038c,\n\t0x038e, 0x03a1,\n\t0x03a3, 0x03ce,\n\t0x03d0, 0x03d7,\n\t0x03da, 0x03f5,\n\t0x0400, 0x0486,\n\t0x0488, 0x0489,\n\t0x048c, 0x04c4,\n\t0x04c7, 0x04c8,\n\t0x04cb, 0x04cc,\n\t0x04d0, 0x04f5,\n\t0x04f8, 0x04f9,\n\t0x0531, 0x0556,\n\t0x0559, 0x055f,\n\t0x0561, 0x0587,\n\t0x0589, 0x058a,\n\t0x0591, 0x05a1,\n\t0x05a3, 0x05b9,\n\t0x05bb, 0x05c4,\n\t0x05d0, 0x05ea,\n\t0x05f0, 0x05f4,\n\t0x060c, 0x060c,\n\t0x061b, 0x061b,\n\t0x061f, 0x061f,\n\t0x0621, 0x063a,\n\t0x0640, 0x0655,\n\t0x0660, 0x066d,\n\t0x0670, 0x06ed,\n\t0x06f0, 0x06fe,\n\t0x0700, 0x070d,\n\t0x070f, 0x072c,\n\t0x0730, 0x074a,\n\t0x0780, 0x07b0,\n\t0x0901, 0x0903,\n\t0x0905, 0x0939,\n\t0x093c, 0x094d,\n\t0x0950, 0x0954,\n\t0x0958, 0x0970,\n\t0x0981, 0x0983,\n\t0x0985, 0x098c,\n\t0x098f, 0x0990,\n\t0x0993, 0x09a8,\n\t0x09aa, 0x09b0,\n\t0x09b2, 0x09b2,\n\t0x09b6, 0x09b9,\n\t0x09bc, 0x09bc,\n\t0x09be, 0x09c4,\n\t0x09c7, 0x09c8,\n\t0x09cb, 0x09cd,\n\t0x09d7, 0x09d7,\n\t0x09dc, 0x09dd,\n\t0x09df, 0x09e3,\n\t0x09e6, 0x09fa,\n\t0x0a02, 0x0a02,\n\t0x0a05, 0x0a0a,\n\t0x0a0f, 0x0a10,\n\t0x0a13, 0x0a28,\n\t0x0a2a, 0x0a30,\n\t0x0a32, 0x0a33,\n\t0x0a35, 0x0a36,\n\t0x0a38, 0x0a39,\n\t0x0a3c, 0x0a3c,\n\t0x0a3e, 0x0a42,\n\t0x0a47, 0x0a48,\n\t0x0a4b, 0x0a4d,\n\t0x0a59, 0x0a5c,\n\t0x0a5e, 0x0a5e,\n\t0x0a66, 0x0a74,\n\t0x0a81, 0x0a83,\n\t0x0a85, 0x0a8b,\n\t0x0a8d, 0x0a8d,\n\t0x0a8f, 0x0a91,\n\t0x0a93, 0x0aa8,\n\t0x0aaa, 0x0ab0,\n\t0x0ab2, 0x0ab3,\n\t0x0ab5, 0x0ab9,\n\t0x0abc, 0x0ac5,\n\t0x0ac7, 0x0ac9,\n\t0x0acb, 0x0acd,\n\t0x0ad0, 0x0ad0,\n\t0x0ae0, 0x0ae0,\n\t0x0ae6, 0x0aef,\n\t0x0b01, 0x0b03,\n\t0x0b05, 0x0b0c,\n\t0x0b0f, 0x0b10,\n\t0x0b13, 0x0b28,\n\t0x0b2a, 0x0b30,\n\t0x0b32, 0x0b33,\n\t0x0b36, 0x0b39,\n\t0x0b3c, 0x0b43,\n\t0x0b47, 0x0b48,\n\t0x0b4b, 0x0b4d,\n\t0x0b56, 0x0b57,\n\t0x0b5c, 0x0b5d,\n\t0x0b5f, 0x0b61,\n\t0x0b66, 0x0b70,\n\t0x0b82, 0x0b83,\n\t0x0b85, 0x0b8a,\n\t0x0b8e, 0x0b90,\n\t0x0b92, 0x0b95,\n\t0x0b99, 0x0b9a,\n\t0x0b9c, 0x0b9c,\n\t0x0b9e, 0x0b9f,\n\t0x0ba3, 0x0ba4,\n\t0x0ba8, 0x0baa,\n\t0x0bae, 0x0bb5,\n\t0x0bb7, 0x0bb9,\n\t0x0bbe, 0x0bc2,\n\t0x0bc6, 0x0bc8,\n\t0x0bca, 0x0bcd,\n\t0x0bd7, 0x0bd7,\n\t0x0be7, 0x0bf2,\n\t0x0c01, 0x0c03,\n\t0x0c05, 0x0c0c,\n\t0x0c0e, 0x0c10,\n\t0x0c12, 0x0c28,\n\t0x0c2a, 0x0c33,\n\t0x0c35, 0x0c39,\n\t0x0c3e, 0x0c44,\n\t0x0c46, 0x0c48,\n\t0x0c4a, 0x0c4d,\n\t0x0c55, 0x0c56,\n\t0x0c60, 0x0c61,\n\t0x0c66, 0x0c6f,\n\t0x0c82, 0x0c83,\n\t0x0c85, 0x0c8c,\n\t0x0c8e, 0x0c90,\n\t0x0c92, 0x0ca8,\n\t0x0caa, 0x0cb3,\n\t0x0cb5, 0x0cb9,\n\t0x0cbe, 0x0cc4,\n\t0x0cc6, 0x0cc8,\n\t0x0cca, 0x0ccd,\n\t0x0cd5, 0x0cd6,\n\t0x0cde, 0x0cde,\n\t0x0ce0, 0x0ce1,\n\t0x0ce6, 0x0cef,\n\t0x0d02, 0x0d03,\n\t0x0d05, 0x0d0c,\n\t0x0d0e, 0x0d10,\n\t0x0d12, 0x0d28,\n\t0x0d2a, 0x0d39,\n\t0x0d3e, 0x0d43,\n\t0x0d46, 0x0d48,\n\t0x0d4a, 0x0d4d,\n\t0x0d57, 0x0d57,\n\t0x0d60, 0x0d61,\n\t0x0d66, 0x0d6f,\n\t0x0d82, 0x0d83,\n\t0x0d85, 0x0d96,\n\t0x0d9a, 0x0db1,\n\t0x0db3, 0x0dbb,\n\t0x0dbd, 0x0dbd,\n\t0x0dc0, 0x0dc6,\n\t0x0dca, 0x0dca,\n\t0x0dcf, 0x0dd4,\n\t0x0dd6, 0x0dd6,\n\t0x0dd8, 0x0ddf,\n\t0x0df2, 0x0df4,\n\t0x0e01, 0x0e3a,\n\t0x0e3f, 0x0e5b,\n\t0x0e81, 0x0e82,\n\t0x0e84, 0x0e84,\n\t0x0e87, 0x0e88,\n\t0x0e8a, 0x0e8a,\n\t0x0e8d, 0x0e8d,\n\t0x0e94, 0x0e97,\n\t0x0e99, 0x0e9f,\n\t0x0ea1, 0x0ea3,\n\t0x0ea5, 0x0ea5,\n\t0x0ea7, 0x0ea7,\n\t0x0eaa, 0x0eab,\n\t0x0ead, 0x0eb9,\n\t0x0ebb, 0x0ebd,\n\t0x0ec0, 0x0ec4,\n\t0x0ec6, 0x0ec6,\n\t0x0ec8, 0x0ecd,\n\t0x0ed0, 0x0ed9,\n\t0x0edc, 0x0edd,\n\t0x0f00, 0x0f47,\n\t0x0f49, 0x0f6a,\n\t0x0f71, 0x0f8b,\n\t0x0f90, 0x0f97,\n\t0x0f99, 0x0fbc,\n\t0x0fbe, 0x0fcc,\n\t0x0fcf, 0x0fcf,\n\t0x1000, 0x1021,\n\t0x1023, 0x1027,\n\t0x1029, 0x102a,\n\t0x102c, 0x1032,\n\t0x1036, 0x1039,\n\t0x1040, 0x1059,\n\t0x10a0, 0x10c5,\n\t0x10d0, 0x10f6,\n\t0x10fb, 0x10fb,\n\t0x1100, 0x1159,\n\t0x115f, 0x11a2,\n\t0x11a8, 0x11f9,\n\t0x1200, 0x1206,\n\t0x1208, 0x1246,\n\t0x1248, 0x1248,\n\t0x124a, 0x124d,\n\t0x1250, 0x1256,\n\t0x1258, 0x1258,\n\t0x125a, 0x125d,\n\t0x1260, 0x1286,\n\t0x1288, 0x1288,\n\t0x128a, 0x128d,\n\t0x1290, 0x12ae,\n\t0x12b0, 0x12b0,\n\t0x12b2, 0x12b5,\n\t0x12b8, 0x12be,\n\t0x12c0, 0x12c0,\n\t0x12c2, 0x12c5,\n\t0x12c8, 0x12ce,\n\t0x12d0, 0x12d6,\n\t0x12d8, 0x12ee,\n\t0x12f0, 0x130e,\n\t0x1310, 0x1310,\n\t0x1312, 0x1315,\n\t0x1318, 0x131e,\n\t0x1320, 0x1346,\n\t0x1348, 0x135a,\n\t0x1361, 0x137c,\n\t0x13a0, 0x13f4,\n\t0x1401, 0x1676,\n\t0x1680, 0x169c,\n\t0x16a0, 0x16f0,\n\t0x1780, 0x17dc,\n\t0x17e0, 0x17e9,\n\t0x1800, 0x180e,\n\t0x1810, 0x1819,\n\t0x1820, 0x1877,\n\t0x1880, 0x18a9,\n\t0x1e00, 0x1e9b,\n\t0x1ea0, 0x1ef9,\n\t0x1f00, 0x1f15,\n\t0x1f18, 0x1f1d,\n\t0x1f20, 0x1f45,\n\t0x1f48, 0x1f4d,\n\t0x1f50, 0x1f57,\n\t0x1f59, 0x1f59,\n\t0x1f5b, 0x1f5b,\n\t0x1f5d, 0x1f5d,\n\t0x1f5f, 0x1f7d,\n\t0x1f80, 0x1fb4,\n\t0x1fb6, 0x1fc4,\n\t0x1fc6, 0x1fd3,\n\t0x1fd6, 0x1fdb,\n\t0x1fdd, 0x1fef,\n\t0x1ff2, 0x1ff4,\n\t0x1ff6, 0x1ffe,\n\t0x2000, 0x2046,\n\t0x2048, 0x204d,\n\t0x206a, 0x2070,\n\t0x2074, 0x208e,\n\t0x20a0, 0x20af,\n\t0x20d0, 0x20e3,\n\t0x2100, 0x213a,\n\t0x2153, 0x2183,\n\t0x2190, 0x21f3,\n\t0x2200, 0x22f1,\n\t0x2300, 0x237b,\n\t0x237d, 0x239a,\n\t0x2400, 0x2426,\n\t0x2440, 0x244a,\n\t0x2460, 0x24ea,\n\t0x2500, 0x2595,\n\t0x25a0, 0x25f7,\n\t0x2600, 0x2613,\n\t0x2619, 0x2671,\n\t0x2701, 0x2704,\n\t0x2706, 0x2709,\n\t0x270c, 0x2727,\n\t0x2729, 0x274b,\n\t0x274d, 0x274d,\n\t0x274f, 0x2752,\n\t0x2756, 0x2756,\n\t0x2758, 0x275e,\n\t0x2761, 0x2767,\n\t0x2776, 0x2794,\n\t0x2798, 0x27af,\n\t0x27b1, 0x27be,\n\t0x2800, 0x28ff,\n\t0x2e80, 0x2e99,\n\t0x2e9b, 0x2ef3,\n\t0x2f00, 0x2fd5,\n\t0x2ff0, 0x2ffb,\n\t0x3000, 0x303a,\n\t0x303e, 0x303f,\n\t0x3041, 0x3094,\n\t0x3099, 0x309e,\n\t0x30a1, 0x30fe,\n\t0x3105, 0x312c,\n\t0x3131, 0x318e,\n\t0x3190, 0x31b7,\n\t0x3200, 0x321c,\n\t0x3220, 0x3243,\n\t0x3260, 0x327b,\n\t0x327f, 0x32b0,\n\t0x32c0, 0x32cb,\n\t0x32d0, 0x32fe,\n\t0x3300, 0x3376,\n\t0x337b, 0x33dd,\n\t0x33e0, 0x33fe,\n\t0x3400, 0x4db5,\n\t0x4e00, 0x9fa5,\n\t0xa000, 0xa48c,\n\t0xa490, 0xa4a1,\n\t0xa4a4, 0xa4b3,\n\t0xa4b5, 0xa4c0,\n\t0xa4c2, 0xa4c4,\n\t0xa4c6, 0xa4c6,\n\t0xac00, 0xd7a3,\n\t0xd800, 0xfa2d,\n\t0xfb00, 0xfb06,\n\t0xfb13, 0xfb17,\n\t0xfb1d, 0xfb36,\n\t0xfb38, 0xfb3c,\n\t0xfb3e, 0xfb3e,\n\t0xfb40, 0xfb41,\n\t0xfb43, 0xfb44,\n\t0xfb46, 0xfbb1,\n\t0xfbd3, 0xfd3f,\n\t0xfd50, 0xfd8f,\n\t0xfd92, 0xfdc7,\n\t0xfdd0, 0xfdfb,\n\t0xfe20, 0xfe23,\n\t0xfe30, 0xfe44,\n\t0xfe49, 0xfe52,\n\t0xfe54, 0xfe66,\n\t0xfe68, 0xfe6b,\n\t0xfe70, 0xfe72,\n\t0xfe74, 0xfe74,\n\t0xfe76, 0xfefc,\n\t0xfeff, 0xfeff,\n\t0xff01, 0xff5e,\n\t0xff61, 0xffbe,\n\t0xffc2, 0xffc7,\n\t0xffca, 0xffcf,\n\t0xffd2, 0xffd7,\n\t0xffda, 0xffdc,\n\t0xffe0, 0xffe6,\n\t0xffe8, 0xffee,\n\t0xfff9, 0xffff,\n\t0x10300, 0x1031e,\n\t0x10320, 0x10323,\n\t0x10330, 0x1034a,\n\t0x10400, 0x10425,\n\t0x10428, 0x1044d,\n\t0x1d000, 0x1d0f5,\n\t0x1d100, 0x1d126,\n\t0x1d12a, 0x1d1dd,\n\t0x1d400, 0x1d454,\n\t0x1d456, 0x1d49c,\n\t0x1d49e, 0x1d49f,\n\t0x1d4a2, 0x1d4a2,\n\t0x1d4a5, 0x1d4a6,\n\t0x1d4a9, 0x1d4ac,\n\t0x1d4ae, 0x1d4b9,\n\t0x1d4bb, 0x1d4bb,\n\t0x1d4bd, 0x1d4c0,\n\t0x1d4c2, 0x1d4c3,\n\t0x1d4c5, 0x1d505,\n\t0x1d507, 0x1d50a,\n\t0x1d50d, 0x1d514,\n\t0x1d516, 0x1d51c,\n\t0x1d51e, 0x1d539,\n\t0x1d53b, 0x1d53e,\n\t0x1d540, 0x1d544,\n\t0x1d546, 0x1d546,\n\t0x1d54a, 0x1d550,\n\t0x1d552, 0x1d6a3,\n\t0x1d6a8, 0x1d7c9,\n\t0x1d7ce, 0x1d7ff,\n\t0x1fffe, 0x2a6d6,\n\t0x2f800, 0x2fa1d,\n\t0x2fffe, 0x2ffff,\n\t0x3fffe, 0x3ffff,\n\t0x4fffe, 0x4ffff,\n\t0x5fffe, 0x5ffff,\n\t0x6fffe, 0x6ffff,\n\t0x7fffe, 0x7ffff,\n\t0x8fffe, 0x8ffff,\n\t0x9fffe, 0x9ffff,\n\t0xafffe, 0xaffff,\n\t0xbfffe, 0xbffff,\n\t0xcfffe, 0xcffff,\n\t0xdfffe, 0xdffff,\n\t0xe0001, 0xe0001,\n\t0xe0020, 0xe007f,\n\t0xefffe, 0x10ffff,\n}; /* CR_Age_3_1 */\n\n/* 'Age_3_2': Derived Age 3.2 */\nstatic const OnigCodePoint CR_Age_3_2[] = {\n\t397,\n\t0x0000, 0x0220,\n\t0x0222, 0x0233,\n\t0x0250, 0x02ad,\n\t0x02b0, 0x02ee,\n\t0x0300, 0x034f,\n\t0x0360, 0x036f,\n\t0x0374, 0x0375,\n\t0x037a, 0x037a,\n\t0x037e, 0x037e,\n\t0x0384, 0x038a,\n\t0x038c, 0x038c,\n\t0x038e, 0x03a1,\n\t0x03a3, 0x03ce,\n\t0x03d0, 0x03f6,\n\t0x0400, 0x0486,\n\t0x0488, 0x04ce,\n\t0x04d0, 0x04f5,\n\t0x04f8, 0x04f9,\n\t0x0500, 0x050f,\n\t0x0531, 0x0556,\n\t0x0559, 0x055f,\n\t0x0561, 0x0587,\n\t0x0589, 0x058a,\n\t0x0591, 0x05a1,\n\t0x05a3, 0x05b9,\n\t0x05bb, 0x05c4,\n\t0x05d0, 0x05ea,\n\t0x05f0, 0x05f4,\n\t0x060c, 0x060c,\n\t0x061b, 0x061b,\n\t0x061f, 0x061f,\n\t0x0621, 0x063a,\n\t0x0640, 0x0655,\n\t0x0660, 0x06ed,\n\t0x06f0, 0x06fe,\n\t0x0700, 0x070d,\n\t0x070f, 0x072c,\n\t0x0730, 0x074a,\n\t0x0780, 0x07b1,\n\t0x0901, 0x0903,\n\t0x0905, 0x0939,\n\t0x093c, 0x094d,\n\t0x0950, 0x0954,\n\t0x0958, 0x0970,\n\t0x0981, 0x0983,\n\t0x0985, 0x098c,\n\t0x098f, 0x0990,\n\t0x0993, 0x09a8,\n\t0x09aa, 0x09b0,\n\t0x09b2, 0x09b2,\n\t0x09b6, 0x09b9,\n\t0x09bc, 0x09bc,\n\t0x09be, 0x09c4,\n\t0x09c7, 0x09c8,\n\t0x09cb, 0x09cd,\n\t0x09d7, 0x09d7,\n\t0x09dc, 0x09dd,\n\t0x09df, 0x09e3,\n\t0x09e6, 0x09fa,\n\t0x0a02, 0x0a02,\n\t0x0a05, 0x0a0a,\n\t0x0a0f, 0x0a10,\n\t0x0a13, 0x0a28,\n\t0x0a2a, 0x0a30,\n\t0x0a32, 0x0a33,\n\t0x0a35, 0x0a36,\n\t0x0a38, 0x0a39,\n\t0x0a3c, 0x0a3c,\n\t0x0a3e, 0x0a42,\n\t0x0a47, 0x0a48,\n\t0x0a4b, 0x0a4d,\n\t0x0a59, 0x0a5c,\n\t0x0a5e, 0x0a5e,\n\t0x0a66, 0x0a74,\n\t0x0a81, 0x0a83,\n\t0x0a85, 0x0a8b,\n\t0x0a8d, 0x0a8d,\n\t0x0a8f, 0x0a91,\n\t0x0a93, 0x0aa8,\n\t0x0aaa, 0x0ab0,\n\t0x0ab2, 0x0ab3,\n\t0x0ab5, 0x0ab9,\n\t0x0abc, 0x0ac5,\n\t0x0ac7, 0x0ac9,\n\t0x0acb, 0x0acd,\n\t0x0ad0, 0x0ad0,\n\t0x0ae0, 0x0ae0,\n\t0x0ae6, 0x0aef,\n\t0x0b01, 0x0b03,\n\t0x0b05, 0x0b0c,\n\t0x0b0f, 0x0b10,\n\t0x0b13, 0x0b28,\n\t0x0b2a, 0x0b30,\n\t0x0b32, 0x0b33,\n\t0x0b36, 0x0b39,\n\t0x0b3c, 0x0b43,\n\t0x0b47, 0x0b48,\n\t0x0b4b, 0x0b4d,\n\t0x0b56, 0x0b57,\n\t0x0b5c, 0x0b5d,\n\t0x0b5f, 0x0b61,\n\t0x0b66, 0x0b70,\n\t0x0b82, 0x0b83,\n\t0x0b85, 0x0b8a,\n\t0x0b8e, 0x0b90,\n\t0x0b92, 0x0b95,\n\t0x0b99, 0x0b9a,\n\t0x0b9c, 0x0b9c,\n\t0x0b9e, 0x0b9f,\n\t0x0ba3, 0x0ba4,\n\t0x0ba8, 0x0baa,\n\t0x0bae, 0x0bb5,\n\t0x0bb7, 0x0bb9,\n\t0x0bbe, 0x0bc2,\n\t0x0bc6, 0x0bc8,\n\t0x0bca, 0x0bcd,\n\t0x0bd7, 0x0bd7,\n\t0x0be7, 0x0bf2,\n\t0x0c01, 0x0c03,\n\t0x0c05, 0x0c0c,\n\t0x0c0e, 0x0c10,\n\t0x0c12, 0x0c28,\n\t0x0c2a, 0x0c33,\n\t0x0c35, 0x0c39,\n\t0x0c3e, 0x0c44,\n\t0x0c46, 0x0c48,\n\t0x0c4a, 0x0c4d,\n\t0x0c55, 0x0c56,\n\t0x0c60, 0x0c61,\n\t0x0c66, 0x0c6f,\n\t0x0c82, 0x0c83,\n\t0x0c85, 0x0c8c,\n\t0x0c8e, 0x0c90,\n\t0x0c92, 0x0ca8,\n\t0x0caa, 0x0cb3,\n\t0x0cb5, 0x0cb9,\n\t0x0cbe, 0x0cc4,\n\t0x0cc6, 0x0cc8,\n\t0x0cca, 0x0ccd,\n\t0x0cd5, 0x0cd6,\n\t0x0cde, 0x0cde,\n\t0x0ce0, 0x0ce1,\n\t0x0ce6, 0x0cef,\n\t0x0d02, 0x0d03,\n\t0x0d05, 0x0d0c,\n\t0x0d0e, 0x0d10,\n\t0x0d12, 0x0d28,\n\t0x0d2a, 0x0d39,\n\t0x0d3e, 0x0d43,\n\t0x0d46, 0x0d48,\n\t0x0d4a, 0x0d4d,\n\t0x0d57, 0x0d57,\n\t0x0d60, 0x0d61,\n\t0x0d66, 0x0d6f,\n\t0x0d82, 0x0d83,\n\t0x0d85, 0x0d96,\n\t0x0d9a, 0x0db1,\n\t0x0db3, 0x0dbb,\n\t0x0dbd, 0x0dbd,\n\t0x0dc0, 0x0dc6,\n\t0x0dca, 0x0dca,\n\t0x0dcf, 0x0dd4,\n\t0x0dd6, 0x0dd6,\n\t0x0dd8, 0x0ddf,\n\t0x0df2, 0x0df4,\n\t0x0e01, 0x0e3a,\n\t0x0e3f, 0x0e5b,\n\t0x0e81, 0x0e82,\n\t0x0e84, 0x0e84,\n\t0x0e87, 0x0e88,\n\t0x0e8a, 0x0e8a,\n\t0x0e8d, 0x0e8d,\n\t0x0e94, 0x0e97,\n\t0x0e99, 0x0e9f,\n\t0x0ea1, 0x0ea3,\n\t0x0ea5, 0x0ea5,\n\t0x0ea7, 0x0ea7,\n\t0x0eaa, 0x0eab,\n\t0x0ead, 0x0eb9,\n\t0x0ebb, 0x0ebd,\n\t0x0ec0, 0x0ec4,\n\t0x0ec6, 0x0ec6,\n\t0x0ec8, 0x0ecd,\n\t0x0ed0, 0x0ed9,\n\t0x0edc, 0x0edd,\n\t0x0f00, 0x0f47,\n\t0x0f49, 0x0f6a,\n\t0x0f71, 0x0f8b,\n\t0x0f90, 0x0f97,\n\t0x0f99, 0x0fbc,\n\t0x0fbe, 0x0fcc,\n\t0x0fcf, 0x0fcf,\n\t0x1000, 0x1021,\n\t0x1023, 0x1027,\n\t0x1029, 0x102a,\n\t0x102c, 0x1032,\n\t0x1036, 0x1039,\n\t0x1040, 0x1059,\n\t0x10a0, 0x10c5,\n\t0x10d0, 0x10f8,\n\t0x10fb, 0x10fb,\n\t0x1100, 0x1159,\n\t0x115f, 0x11a2,\n\t0x11a8, 0x11f9,\n\t0x1200, 0x1206,\n\t0x1208, 0x1246,\n\t0x1248, 0x1248,\n\t0x124a, 0x124d,\n\t0x1250, 0x1256,\n\t0x1258, 0x1258,\n\t0x125a, 0x125d,\n\t0x1260, 0x1286,\n\t0x1288, 0x1288,\n\t0x128a, 0x128d,\n\t0x1290, 0x12ae,\n\t0x12b0, 0x12b0,\n\t0x12b2, 0x12b5,\n\t0x12b8, 0x12be,\n\t0x12c0, 0x12c0,\n\t0x12c2, 0x12c5,\n\t0x12c8, 0x12ce,\n\t0x12d0, 0x12d6,\n\t0x12d8, 0x12ee,\n\t0x12f0, 0x130e,\n\t0x1310, 0x1310,\n\t0x1312, 0x1315,\n\t0x1318, 0x131e,\n\t0x1320, 0x1346,\n\t0x1348, 0x135a,\n\t0x1361, 0x137c,\n\t0x13a0, 0x13f4,\n\t0x1401, 0x1676,\n\t0x1680, 0x169c,\n\t0x16a0, 0x16f0,\n\t0x1700, 0x170c,\n\t0x170e, 0x1714,\n\t0x1720, 0x1736,\n\t0x1740, 0x1753,\n\t0x1760, 0x176c,\n\t0x176e, 0x1770,\n\t0x1772, 0x1773,\n\t0x1780, 0x17dc,\n\t0x17e0, 0x17e9,\n\t0x1800, 0x180e,\n\t0x1810, 0x1819,\n\t0x1820, 0x1877,\n\t0x1880, 0x18a9,\n\t0x1e00, 0x1e9b,\n\t0x1ea0, 0x1ef9,\n\t0x1f00, 0x1f15,\n\t0x1f18, 0x1f1d,\n\t0x1f20, 0x1f45,\n\t0x1f48, 0x1f4d,\n\t0x1f50, 0x1f57,\n\t0x1f59, 0x1f59,\n\t0x1f5b, 0x1f5b,\n\t0x1f5d, 0x1f5d,\n\t0x1f5f, 0x1f7d,\n\t0x1f80, 0x1fb4,\n\t0x1fb6, 0x1fc4,\n\t0x1fc6, 0x1fd3,\n\t0x1fd6, 0x1fdb,\n\t0x1fdd, 0x1fef,\n\t0x1ff2, 0x1ff4,\n\t0x1ff6, 0x1ffe,\n\t0x2000, 0x2052,\n\t0x2057, 0x2057,\n\t0x205f, 0x2063,\n\t0x206a, 0x2071,\n\t0x2074, 0x208e,\n\t0x20a0, 0x20b1,\n\t0x20d0, 0x20ea,\n\t0x2100, 0x213a,\n\t0x213d, 0x214b,\n\t0x2153, 0x2183,\n\t0x2190, 0x23ce,\n\t0x2400, 0x2426,\n\t0x2440, 0x244a,\n\t0x2460, 0x24fe,\n\t0x2500, 0x2613,\n\t0x2616, 0x2617,\n\t0x2619, 0x267d,\n\t0x2680, 0x2689,\n\t0x2701, 0x2704,\n\t0x2706, 0x2709,\n\t0x270c, 0x2727,\n\t0x2729, 0x274b,\n\t0x274d, 0x274d,\n\t0x274f, 0x2752,\n\t0x2756, 0x2756,\n\t0x2758, 0x275e,\n\t0x2761, 0x2794,\n\t0x2798, 0x27af,\n\t0x27b1, 0x27be,\n\t0x27d0, 0x27eb,\n\t0x27f0, 0x2aff,\n\t0x2e80, 0x2e99,\n\t0x2e9b, 0x2ef3,\n\t0x2f00, 0x2fd5,\n\t0x2ff0, 0x2ffb,\n\t0x3000, 0x303f,\n\t0x3041, 0x3096,\n\t0x3099, 0x30ff,\n\t0x3105, 0x312c,\n\t0x3131, 0x318e,\n\t0x3190, 0x31b7,\n\t0x31f0, 0x321c,\n\t0x3220, 0x3243,\n\t0x3251, 0x327b,\n\t0x327f, 0x32cb,\n\t0x32d0, 0x32fe,\n\t0x3300, 0x3376,\n\t0x337b, 0x33dd,\n\t0x33e0, 0x33fe,\n\t0x3400, 0x4db5,\n\t0x4e00, 0x9fa5,\n\t0xa000, 0xa48c,\n\t0xa490, 0xa4c6,\n\t0xac00, 0xd7a3,\n\t0xd800, 0xfa2d,\n\t0xfa30, 0xfa6a,\n\t0xfb00, 0xfb06,\n\t0xfb13, 0xfb17,\n\t0xfb1d, 0xfb36,\n\t0xfb38, 0xfb3c,\n\t0xfb3e, 0xfb3e,\n\t0xfb40, 0xfb41,\n\t0xfb43, 0xfb44,\n\t0xfb46, 0xfbb1,\n\t0xfbd3, 0xfd3f,\n\t0xfd50, 0xfd8f,\n\t0xfd92, 0xfdc7,\n\t0xfdd0, 0xfdfc,\n\t0xfe00, 0xfe0f,\n\t0xfe20, 0xfe23,\n\t0xfe30, 0xfe46,\n\t0xfe49, 0xfe52,\n\t0xfe54, 0xfe66,\n\t0xfe68, 0xfe6b,\n\t0xfe70, 0xfe74,\n\t0xfe76, 0xfefc,\n\t0xfeff, 0xfeff,\n\t0xff01, 0xffbe,\n\t0xffc2, 0xffc7,\n\t0xffca, 0xffcf,\n\t0xffd2, 0xffd7,\n\t0xffda, 0xffdc,\n\t0xffe0, 0xffe6,\n\t0xffe8, 0xffee,\n\t0xfff9, 0xffff,\n\t0x10300, 0x1031e,\n\t0x10320, 0x10323,\n\t0x10330, 0x1034a,\n\t0x10400, 0x10425,\n\t0x10428, 0x1044d,\n\t0x1d000, 0x1d0f5,\n\t0x1d100, 0x1d126,\n\t0x1d12a, 0x1d1dd,\n\t0x1d400, 0x1d454,\n\t0x1d456, 0x1d49c,\n\t0x1d49e, 0x1d49f,\n\t0x1d4a2, 0x1d4a2,\n\t0x1d4a5, 0x1d4a6,\n\t0x1d4a9, 0x1d4ac,\n\t0x1d4ae, 0x1d4b9,\n\t0x1d4bb, 0x1d4bb,\n\t0x1d4bd, 0x1d4c0,\n\t0x1d4c2, 0x1d4c3,\n\t0x1d4c5, 0x1d505,\n\t0x1d507, 0x1d50a,\n\t0x1d50d, 0x1d514,\n\t0x1d516, 0x1d51c,\n\t0x1d51e, 0x1d539,\n\t0x1d53b, 0x1d53e,\n\t0x1d540, 0x1d544,\n\t0x1d546, 0x1d546,\n\t0x1d54a, 0x1d550,\n\t0x1d552, 0x1d6a3,\n\t0x1d6a8, 0x1d7c9,\n\t0x1d7ce, 0x1d7ff,\n\t0x1fffe, 0x2a6d6,\n\t0x2f800, 0x2fa1d,\n\t0x2fffe, 0x2ffff,\n\t0x3fffe, 0x3ffff,\n\t0x4fffe, 0x4ffff,\n\t0x5fffe, 0x5ffff,\n\t0x6fffe, 0x6ffff,\n\t0x7fffe, 0x7ffff,\n\t0x8fffe, 0x8ffff,\n\t0x9fffe, 0x9ffff,\n\t0xafffe, 0xaffff,\n\t0xbfffe, 0xbffff,\n\t0xcfffe, 0xcffff,\n\t0xdfffe, 0xdffff,\n\t0xe0001, 0xe0001,\n\t0xe0020, 0xe007f,\n\t0xefffe, 0x10ffff,\n}; /* CR_Age_3_2 */\n\n/* 'Age_4_0': Derived Age 4.0 */\nstatic const OnigCodePoint CR_Age_4_0[] = {\n\t412,\n\t0x0000, 0x0236,\n\t0x0250, 0x0357,\n\t0x035d, 0x036f,\n\t0x0374, 0x0375,\n\t0x037a, 0x037a,\n\t0x037e, 0x037e,\n\t0x0384, 0x038a,\n\t0x038c, 0x038c,\n\t0x038e, 0x03a1,\n\t0x03a3, 0x03ce,\n\t0x03d0, 0x03fb,\n\t0x0400, 0x0486,\n\t0x0488, 0x04ce,\n\t0x04d0, 0x04f5,\n\t0x04f8, 0x04f9,\n\t0x0500, 0x050f,\n\t0x0531, 0x0556,\n\t0x0559, 0x055f,\n\t0x0561, 0x0587,\n\t0x0589, 0x058a,\n\t0x0591, 0x05a1,\n\t0x05a3, 0x05b9,\n\t0x05bb, 0x05c4,\n\t0x05d0, 0x05ea,\n\t0x05f0, 0x05f4,\n\t0x0600, 0x0603,\n\t0x060c, 0x0615,\n\t0x061b, 0x061b,\n\t0x061f, 0x061f,\n\t0x0621, 0x063a,\n\t0x0640, 0x0658,\n\t0x0660, 0x070d,\n\t0x070f, 0x074a,\n\t0x074d, 0x074f,\n\t0x0780, 0x07b1,\n\t0x0901, 0x0939,\n\t0x093c, 0x094d,\n\t0x0950, 0x0954,\n\t0x0958, 0x0970,\n\t0x0981, 0x0983,\n\t0x0985, 0x098c,\n\t0x098f, 0x0990,\n\t0x0993, 0x09a8,\n\t0x09aa, 0x09b0,\n\t0x09b2, 0x09b2,\n\t0x09b6, 0x09b9,\n\t0x09bc, 0x09c4,\n\t0x09c7, 0x09c8,\n\t0x09cb, 0x09cd,\n\t0x09d7, 0x09d7,\n\t0x09dc, 0x09dd,\n\t0x09df, 0x09e3,\n\t0x09e6, 0x09fa,\n\t0x0a01, 0x0a03,\n\t0x0a05, 0x0a0a,\n\t0x0a0f, 0x0a10,\n\t0x0a13, 0x0a28,\n\t0x0a2a, 0x0a30,\n\t0x0a32, 0x0a33,\n\t0x0a35, 0x0a36,\n\t0x0a38, 0x0a39,\n\t0x0a3c, 0x0a3c,\n\t0x0a3e, 0x0a42,\n\t0x0a47, 0x0a48,\n\t0x0a4b, 0x0a4d,\n\t0x0a59, 0x0a5c,\n\t0x0a5e, 0x0a5e,\n\t0x0a66, 0x0a74,\n\t0x0a81, 0x0a83,\n\t0x0a85, 0x0a8d,\n\t0x0a8f, 0x0a91,\n\t0x0a93, 0x0aa8,\n\t0x0aaa, 0x0ab0,\n\t0x0ab2, 0x0ab3,\n\t0x0ab5, 0x0ab9,\n\t0x0abc, 0x0ac5,\n\t0x0ac7, 0x0ac9,\n\t0x0acb, 0x0acd,\n\t0x0ad0, 0x0ad0,\n\t0x0ae0, 0x0ae3,\n\t0x0ae6, 0x0aef,\n\t0x0af1, 0x0af1,\n\t0x0b01, 0x0b03,\n\t0x0b05, 0x0b0c,\n\t0x0b0f, 0x0b10,\n\t0x0b13, 0x0b28,\n\t0x0b2a, 0x0b30,\n\t0x0b32, 0x0b33,\n\t0x0b35, 0x0b39,\n\t0x0b3c, 0x0b43,\n\t0x0b47, 0x0b48,\n\t0x0b4b, 0x0b4d,\n\t0x0b56, 0x0b57,\n\t0x0b5c, 0x0b5d,\n\t0x0b5f, 0x0b61,\n\t0x0b66, 0x0b71,\n\t0x0b82, 0x0b83,\n\t0x0b85, 0x0b8a,\n\t0x0b8e, 0x0b90,\n\t0x0b92, 0x0b95,\n\t0x0b99, 0x0b9a,\n\t0x0b9c, 0x0b9c,\n\t0x0b9e, 0x0b9f,\n\t0x0ba3, 0x0ba4,\n\t0x0ba8, 0x0baa,\n\t0x0bae, 0x0bb5,\n\t0x0bb7, 0x0bb9,\n\t0x0bbe, 0x0bc2,\n\t0x0bc6, 0x0bc8,\n\t0x0bca, 0x0bcd,\n\t0x0bd7, 0x0bd7,\n\t0x0be7, 0x0bfa,\n\t0x0c01, 0x0c03,\n\t0x0c05, 0x0c0c,\n\t0x0c0e, 0x0c10,\n\t0x0c12, 0x0c28,\n\t0x0c2a, 0x0c33,\n\t0x0c35, 0x0c39,\n\t0x0c3e, 0x0c44,\n\t0x0c46, 0x0c48,\n\t0x0c4a, 0x0c4d,\n\t0x0c55, 0x0c56,\n\t0x0c60, 0x0c61,\n\t0x0c66, 0x0c6f,\n\t0x0c82, 0x0c83,\n\t0x0c85, 0x0c8c,\n\t0x0c8e, 0x0c90,\n\t0x0c92, 0x0ca8,\n\t0x0caa, 0x0cb3,\n\t0x0cb5, 0x0cb9,\n\t0x0cbc, 0x0cc4,\n\t0x0cc6, 0x0cc8,\n\t0x0cca, 0x0ccd,\n\t0x0cd5, 0x0cd6,\n\t0x0cde, 0x0cde,\n\t0x0ce0, 0x0ce1,\n\t0x0ce6, 0x0cef,\n\t0x0d02, 0x0d03,\n\t0x0d05, 0x0d0c,\n\t0x0d0e, 0x0d10,\n\t0x0d12, 0x0d28,\n\t0x0d2a, 0x0d39,\n\t0x0d3e, 0x0d43,\n\t0x0d46, 0x0d48,\n\t0x0d4a, 0x0d4d,\n\t0x0d57, 0x0d57,\n\t0x0d60, 0x0d61,\n\t0x0d66, 0x0d6f,\n\t0x0d82, 0x0d83,\n\t0x0d85, 0x0d96,\n\t0x0d9a, 0x0db1,\n\t0x0db3, 0x0dbb,\n\t0x0dbd, 0x0dbd,\n\t0x0dc0, 0x0dc6,\n\t0x0dca, 0x0dca,\n\t0x0dcf, 0x0dd4,\n\t0x0dd6, 0x0dd6,\n\t0x0dd8, 0x0ddf,\n\t0x0df2, 0x0df4,\n\t0x0e01, 0x0e3a,\n\t0x0e3f, 0x0e5b,\n\t0x0e81, 0x0e82,\n\t0x0e84, 0x0e84,\n\t0x0e87, 0x0e88,\n\t0x0e8a, 0x0e8a,\n\t0x0e8d, 0x0e8d,\n\t0x0e94, 0x0e97,\n\t0x0e99, 0x0e9f,\n\t0x0ea1, 0x0ea3,\n\t0x0ea5, 0x0ea5,\n\t0x0ea7, 0x0ea7,\n\t0x0eaa, 0x0eab,\n\t0x0ead, 0x0eb9,\n\t0x0ebb, 0x0ebd,\n\t0x0ec0, 0x0ec4,\n\t0x0ec6, 0x0ec6,\n\t0x0ec8, 0x0ecd,\n\t0x0ed0, 0x0ed9,\n\t0x0edc, 0x0edd,\n\t0x0f00, 0x0f47,\n\t0x0f49, 0x0f6a,\n\t0x0f71, 0x0f8b,\n\t0x0f90, 0x0f97,\n\t0x0f99, 0x0fbc,\n\t0x0fbe, 0x0fcc,\n\t0x0fcf, 0x0fcf,\n\t0x1000, 0x1021,\n\t0x1023, 0x1027,\n\t0x1029, 0x102a,\n\t0x102c, 0x1032,\n\t0x1036, 0x1039,\n\t0x1040, 0x1059,\n\t0x10a0, 0x10c5,\n\t0x10d0, 0x10f8,\n\t0x10fb, 0x10fb,\n\t0x1100, 0x1159,\n\t0x115f, 0x11a2,\n\t0x11a8, 0x11f9,\n\t0x1200, 0x1206,\n\t0x1208, 0x1246,\n\t0x1248, 0x1248,\n\t0x124a, 0x124d,\n\t0x1250, 0x1256,\n\t0x1258, 0x1258,\n\t0x125a, 0x125d,\n\t0x1260, 0x1286,\n\t0x1288, 0x1288,\n\t0x128a, 0x128d,\n\t0x1290, 0x12ae,\n\t0x12b0, 0x12b0,\n\t0x12b2, 0x12b5,\n\t0x12b8, 0x12be,\n\t0x12c0, 0x12c0,\n\t0x12c2, 0x12c5,\n\t0x12c8, 0x12ce,\n\t0x12d0, 0x12d6,\n\t0x12d8, 0x12ee,\n\t0x12f0, 0x130e,\n\t0x1310, 0x1310,\n\t0x1312, 0x1315,\n\t0x1318, 0x131e,\n\t0x1320, 0x1346,\n\t0x1348, 0x135a,\n\t0x1361, 0x137c,\n\t0x13a0, 0x13f4,\n\t0x1401, 0x1676,\n\t0x1680, 0x169c,\n\t0x16a0, 0x16f0,\n\t0x1700, 0x170c,\n\t0x170e, 0x1714,\n\t0x1720, 0x1736,\n\t0x1740, 0x1753,\n\t0x1760, 0x176c,\n\t0x176e, 0x1770,\n\t0x1772, 0x1773,\n\t0x1780, 0x17dd,\n\t0x17e0, 0x17e9,\n\t0x17f0, 0x17f9,\n\t0x1800, 0x180e,\n\t0x1810, 0x1819,\n\t0x1820, 0x1877,\n\t0x1880, 0x18a9,\n\t0x1900, 0x191c,\n\t0x1920, 0x192b,\n\t0x1930, 0x193b,\n\t0x1940, 0x1940,\n\t0x1944, 0x196d,\n\t0x1970, 0x1974,\n\t0x19e0, 0x19ff,\n\t0x1d00, 0x1d6b,\n\t0x1e00, 0x1e9b,\n\t0x1ea0, 0x1ef9,\n\t0x1f00, 0x1f15,\n\t0x1f18, 0x1f1d,\n\t0x1f20, 0x1f45,\n\t0x1f48, 0x1f4d,\n\t0x1f50, 0x1f57,\n\t0x1f59, 0x1f59,\n\t0x1f5b, 0x1f5b,\n\t0x1f5d, 0x1f5d,\n\t0x1f5f, 0x1f7d,\n\t0x1f80, 0x1fb4,\n\t0x1fb6, 0x1fc4,\n\t0x1fc6, 0x1fd3,\n\t0x1fd6, 0x1fdb,\n\t0x1fdd, 0x1fef,\n\t0x1ff2, 0x1ff4,\n\t0x1ff6, 0x1ffe,\n\t0x2000, 0x2054,\n\t0x2057, 0x2057,\n\t0x205f, 0x2063,\n\t0x206a, 0x2071,\n\t0x2074, 0x208e,\n\t0x20a0, 0x20b1,\n\t0x20d0, 0x20ea,\n\t0x2100, 0x213b,\n\t0x213d, 0x214b,\n\t0x2153, 0x2183,\n\t0x2190, 0x23d0,\n\t0x2400, 0x2426,\n\t0x2440, 0x244a,\n\t0x2460, 0x2617,\n\t0x2619, 0x267d,\n\t0x2680, 0x2691,\n\t0x26a0, 0x26a1,\n\t0x2701, 0x2704,\n\t0x2706, 0x2709,\n\t0x270c, 0x2727,\n\t0x2729, 0x274b,\n\t0x274d, 0x274d,\n\t0x274f, 0x2752,\n\t0x2756, 0x2756,\n\t0x2758, 0x275e,\n\t0x2761, 0x2794,\n\t0x2798, 0x27af,\n\t0x27b1, 0x27be,\n\t0x27d0, 0x27eb,\n\t0x27f0, 0x2b0d,\n\t0x2e80, 0x2e99,\n\t0x2e9b, 0x2ef3,\n\t0x2f00, 0x2fd5,\n\t0x2ff0, 0x2ffb,\n\t0x3000, 0x303f,\n\t0x3041, 0x3096,\n\t0x3099, 0x30ff,\n\t0x3105, 0x312c,\n\t0x3131, 0x318e,\n\t0x3190, 0x31b7,\n\t0x31f0, 0x321e,\n\t0x3220, 0x3243,\n\t0x3250, 0x327d,\n\t0x327f, 0x32fe,\n\t0x3300, 0x4db5,\n\t0x4dc0, 0x9fa5,\n\t0xa000, 0xa48c,\n\t0xa490, 0xa4c6,\n\t0xac00, 0xd7a3,\n\t0xd800, 0xfa2d,\n\t0xfa30, 0xfa6a,\n\t0xfb00, 0xfb06,\n\t0xfb13, 0xfb17,\n\t0xfb1d, 0xfb36,\n\t0xfb38, 0xfb3c,\n\t0xfb3e, 0xfb3e,\n\t0xfb40, 0xfb41,\n\t0xfb43, 0xfb44,\n\t0xfb46, 0xfbb1,\n\t0xfbd3, 0xfd3f,\n\t0xfd50, 0xfd8f,\n\t0xfd92, 0xfdc7,\n\t0xfdd0, 0xfdfd,\n\t0xfe00, 0xfe0f,\n\t0xfe20, 0xfe23,\n\t0xfe30, 0xfe52,\n\t0xfe54, 0xfe66,\n\t0xfe68, 0xfe6b,\n\t0xfe70, 0xfe74,\n\t0xfe76, 0xfefc,\n\t0xfeff, 0xfeff,\n\t0xff01, 0xffbe,\n\t0xffc2, 0xffc7,\n\t0xffca, 0xffcf,\n\t0xffd2, 0xffd7,\n\t0xffda, 0xffdc,\n\t0xffe0, 0xffe6,\n\t0xffe8, 0xffee,\n\t0xfff9, 0x1000b,\n\t0x1000d, 0x10026,\n\t0x10028, 0x1003a,\n\t0x1003c, 0x1003d,\n\t0x1003f, 0x1004d,\n\t0x10050, 0x1005d,\n\t0x10080, 0x100fa,\n\t0x10100, 0x10102,\n\t0x10107, 0x10133,\n\t0x10137, 0x1013f,\n\t0x10300, 0x1031e,\n\t0x10320, 0x10323,\n\t0x10330, 0x1034a,\n\t0x10380, 0x1039d,\n\t0x1039f, 0x1039f,\n\t0x10400, 0x1049d,\n\t0x104a0, 0x104a9,\n\t0x10800, 0x10805,\n\t0x10808, 0x10808,\n\t0x1080a, 0x10835,\n\t0x10837, 0x10838,\n\t0x1083c, 0x1083c,\n\t0x1083f, 0x1083f,\n\t0x1d000, 0x1d0f5,\n\t0x1d100, 0x1d126,\n\t0x1d12a, 0x1d1dd,\n\t0x1d300, 0x1d356,\n\t0x1d400, 0x1d454,\n\t0x1d456, 0x1d49c,\n\t0x1d49e, 0x1d49f,\n\t0x1d4a2, 0x1d4a2,\n\t0x1d4a5, 0x1d4a6,\n\t0x1d4a9, 0x1d4ac,\n\t0x1d4ae, 0x1d4b9,\n\t0x1d4bb, 0x1d4bb,\n\t0x1d4bd, 0x1d4c3,\n\t0x1d4c5, 0x1d505,\n\t0x1d507, 0x1d50a,\n\t0x1d50d, 0x1d514,\n\t0x1d516, 0x1d51c,\n\t0x1d51e, 0x1d539,\n\t0x1d53b, 0x1d53e,\n\t0x1d540, 0x1d544,\n\t0x1d546, 0x1d546,\n\t0x1d54a, 0x1d550,\n\t0x1d552, 0x1d6a3,\n\t0x1d6a8, 0x1d7c9,\n\t0x1d7ce, 0x1d7ff,\n\t0x1fffe, 0x2a6d6,\n\t0x2f800, 0x2fa1d,\n\t0x2fffe, 0x2ffff,\n\t0x3fffe, 0x3ffff,\n\t0x4fffe, 0x4ffff,\n\t0x5fffe, 0x5ffff,\n\t0x6fffe, 0x6ffff,\n\t0x7fffe, 0x7ffff,\n\t0x8fffe, 0x8ffff,\n\t0x9fffe, 0x9ffff,\n\t0xafffe, 0xaffff,\n\t0xbfffe, 0xbffff,\n\t0xcfffe, 0xcffff,\n\t0xdfffe, 0xdffff,\n\t0xe0001, 0xe0001,\n\t0xe0020, 0xe007f,\n\t0xe0100, 0xe01ef,\n\t0xefffe, 0x10ffff,\n}; /* CR_Age_4_0 */\n\n/* 'Age_4_1': Derived Age 4.1 */\nstatic const OnigCodePoint CR_Age_4_1[] = {\n\t430,\n\t0x0000, 0x0241,\n\t0x0250, 0x036f,\n\t0x0374, 0x0375,\n\t0x037a, 0x037a,\n\t0x037e, 0x037e,\n\t0x0384, 0x038a,\n\t0x038c, 0x038c,\n\t0x038e, 0x03a1,\n\t0x03a3, 0x03ce,\n\t0x03d0, 0x0486,\n\t0x0488, 0x04ce,\n\t0x04d0, 0x04f9,\n\t0x0500, 0x050f,\n\t0x0531, 0x0556,\n\t0x0559, 0x055f,\n\t0x0561, 0x0587,\n\t0x0589, 0x058a,\n\t0x0591, 0x05b9,\n\t0x05bb, 0x05c7,\n\t0x05d0, 0x05ea,\n\t0x05f0, 0x05f4,\n\t0x0600, 0x0603,\n\t0x060b, 0x0615,\n\t0x061b, 0x061b,\n\t0x061e, 0x061f,\n\t0x0621, 0x063a,\n\t0x0640, 0x065e,\n\t0x0660, 0x070d,\n\t0x070f, 0x074a,\n\t0x074d, 0x076d,\n\t0x0780, 0x07b1,\n\t0x0901, 0x0939,\n\t0x093c, 0x094d,\n\t0x0950, 0x0954,\n\t0x0958, 0x0970,\n\t0x097d, 0x097d,\n\t0x0981, 0x0983,\n\t0x0985, 0x098c,\n\t0x098f, 0x0990,\n\t0x0993, 0x09a8,\n\t0x09aa, 0x09b0,\n\t0x09b2, 0x09b2,\n\t0x09b6, 0x09b9,\n\t0x09bc, 0x09c4,\n\t0x09c7, 0x09c8,\n\t0x09cb, 0x09ce,\n\t0x09d7, 0x09d7,\n\t0x09dc, 0x09dd,\n\t0x09df, 0x09e3,\n\t0x09e6, 0x09fa,\n\t0x0a01, 0x0a03,\n\t0x0a05, 0x0a0a,\n\t0x0a0f, 0x0a10,\n\t0x0a13, 0x0a28,\n\t0x0a2a, 0x0a30,\n\t0x0a32, 0x0a33,\n\t0x0a35, 0x0a36,\n\t0x0a38, 0x0a39,\n\t0x0a3c, 0x0a3c,\n\t0x0a3e, 0x0a42,\n\t0x0a47, 0x0a48,\n\t0x0a4b, 0x0a4d,\n\t0x0a59, 0x0a5c,\n\t0x0a5e, 0x0a5e,\n\t0x0a66, 0x0a74,\n\t0x0a81, 0x0a83,\n\t0x0a85, 0x0a8d,\n\t0x0a8f, 0x0a91,\n\t0x0a93, 0x0aa8,\n\t0x0aaa, 0x0ab0,\n\t0x0ab2, 0x0ab3,\n\t0x0ab5, 0x0ab9,\n\t0x0abc, 0x0ac5,\n\t0x0ac7, 0x0ac9,\n\t0x0acb, 0x0acd,\n\t0x0ad0, 0x0ad0,\n\t0x0ae0, 0x0ae3,\n\t0x0ae6, 0x0aef,\n\t0x0af1, 0x0af1,\n\t0x0b01, 0x0b03,\n\t0x0b05, 0x0b0c,\n\t0x0b0f, 0x0b10,\n\t0x0b13, 0x0b28,\n\t0x0b2a, 0x0b30,\n\t0x0b32, 0x0b33,\n\t0x0b35, 0x0b39,\n\t0x0b3c, 0x0b43,\n\t0x0b47, 0x0b48,\n\t0x0b4b, 0x0b4d,\n\t0x0b56, 0x0b57,\n\t0x0b5c, 0x0b5d,\n\t0x0b5f, 0x0b61,\n\t0x0b66, 0x0b71,\n\t0x0b82, 0x0b83,\n\t0x0b85, 0x0b8a,\n\t0x0b8e, 0x0b90,\n\t0x0b92, 0x0b95,\n\t0x0b99, 0x0b9a,\n\t0x0b9c, 0x0b9c,\n\t0x0b9e, 0x0b9f,\n\t0x0ba3, 0x0ba4,\n\t0x0ba8, 0x0baa,\n\t0x0bae, 0x0bb9,\n\t0x0bbe, 0x0bc2,\n\t0x0bc6, 0x0bc8,\n\t0x0bca, 0x0bcd,\n\t0x0bd7, 0x0bd7,\n\t0x0be6, 0x0bfa,\n\t0x0c01, 0x0c03,\n\t0x0c05, 0x0c0c,\n\t0x0c0e, 0x0c10,\n\t0x0c12, 0x0c28,\n\t0x0c2a, 0x0c33,\n\t0x0c35, 0x0c39,\n\t0x0c3e, 0x0c44,\n\t0x0c46, 0x0c48,\n\t0x0c4a, 0x0c4d,\n\t0x0c55, 0x0c56,\n\t0x0c60, 0x0c61,\n\t0x0c66, 0x0c6f,\n\t0x0c82, 0x0c83,\n\t0x0c85, 0x0c8c,\n\t0x0c8e, 0x0c90,\n\t0x0c92, 0x0ca8,\n\t0x0caa, 0x0cb3,\n\t0x0cb5, 0x0cb9,\n\t0x0cbc, 0x0cc4,\n\t0x0cc6, 0x0cc8,\n\t0x0cca, 0x0ccd,\n\t0x0cd5, 0x0cd6,\n\t0x0cde, 0x0cde,\n\t0x0ce0, 0x0ce1,\n\t0x0ce6, 0x0cef,\n\t0x0d02, 0x0d03,\n\t0x0d05, 0x0d0c,\n\t0x0d0e, 0x0d10,\n\t0x0d12, 0x0d28,\n\t0x0d2a, 0x0d39,\n\t0x0d3e, 0x0d43,\n\t0x0d46, 0x0d48,\n\t0x0d4a, 0x0d4d,\n\t0x0d57, 0x0d57,\n\t0x0d60, 0x0d61,\n\t0x0d66, 0x0d6f,\n\t0x0d82, 0x0d83,\n\t0x0d85, 0x0d96,\n\t0x0d9a, 0x0db1,\n\t0x0db3, 0x0dbb,\n\t0x0dbd, 0x0dbd,\n\t0x0dc0, 0x0dc6,\n\t0x0dca, 0x0dca,\n\t0x0dcf, 0x0dd4,\n\t0x0dd6, 0x0dd6,\n\t0x0dd8, 0x0ddf,\n\t0x0df2, 0x0df4,\n\t0x0e01, 0x0e3a,\n\t0x0e3f, 0x0e5b,\n\t0x0e81, 0x0e82,\n\t0x0e84, 0x0e84,\n\t0x0e87, 0x0e88,\n\t0x0e8a, 0x0e8a,\n\t0x0e8d, 0x0e8d,\n\t0x0e94, 0x0e97,\n\t0x0e99, 0x0e9f,\n\t0x0ea1, 0x0ea3,\n\t0x0ea5, 0x0ea5,\n\t0x0ea7, 0x0ea7,\n\t0x0eaa, 0x0eab,\n\t0x0ead, 0x0eb9,\n\t0x0ebb, 0x0ebd,\n\t0x0ec0, 0x0ec4,\n\t0x0ec6, 0x0ec6,\n\t0x0ec8, 0x0ecd,\n\t0x0ed0, 0x0ed9,\n\t0x0edc, 0x0edd,\n\t0x0f00, 0x0f47,\n\t0x0f49, 0x0f6a,\n\t0x0f71, 0x0f8b,\n\t0x0f90, 0x0f97,\n\t0x0f99, 0x0fbc,\n\t0x0fbe, 0x0fcc,\n\t0x0fcf, 0x0fd1,\n\t0x1000, 0x1021,\n\t0x1023, 0x1027,\n\t0x1029, 0x102a,\n\t0x102c, 0x1032,\n\t0x1036, 0x1039,\n\t0x1040, 0x1059,\n\t0x10a0, 0x10c5,\n\t0x10d0, 0x10fc,\n\t0x1100, 0x1159,\n\t0x115f, 0x11a2,\n\t0x11a8, 0x11f9,\n\t0x1200, 0x1248,\n\t0x124a, 0x124d,\n\t0x1250, 0x1256,\n\t0x1258, 0x1258,\n\t0x125a, 0x125d,\n\t0x1260, 0x1288,\n\t0x128a, 0x128d,\n\t0x1290, 0x12b0,\n\t0x12b2, 0x12b5,\n\t0x12b8, 0x12be,\n\t0x12c0, 0x12c0,\n\t0x12c2, 0x12c5,\n\t0x12c8, 0x12d6,\n\t0x12d8, 0x1310,\n\t0x1312, 0x1315,\n\t0x1318, 0x135a,\n\t0x135f, 0x137c,\n\t0x1380, 0x1399,\n\t0x13a0, 0x13f4,\n\t0x1401, 0x1676,\n\t0x1680, 0x169c,\n\t0x16a0, 0x16f0,\n\t0x1700, 0x170c,\n\t0x170e, 0x1714,\n\t0x1720, 0x1736,\n\t0x1740, 0x1753,\n\t0x1760, 0x176c,\n\t0x176e, 0x1770,\n\t0x1772, 0x1773,\n\t0x1780, 0x17dd,\n\t0x17e0, 0x17e9,\n\t0x17f0, 0x17f9,\n\t0x1800, 0x180e,\n\t0x1810, 0x1819,\n\t0x1820, 0x1877,\n\t0x1880, 0x18a9,\n\t0x1900, 0x191c,\n\t0x1920, 0x192b,\n\t0x1930, 0x193b,\n\t0x1940, 0x1940,\n\t0x1944, 0x196d,\n\t0x1970, 0x1974,\n\t0x1980, 0x19a9,\n\t0x19b0, 0x19c9,\n\t0x19d0, 0x19d9,\n\t0x19de, 0x1a1b,\n\t0x1a1e, 0x1a1f,\n\t0x1d00, 0x1dc3,\n\t0x1e00, 0x1e9b,\n\t0x1ea0, 0x1ef9,\n\t0x1f00, 0x1f15,\n\t0x1f18, 0x1f1d,\n\t0x1f20, 0x1f45,\n\t0x1f48, 0x1f4d,\n\t0x1f50, 0x1f57,\n\t0x1f59, 0x1f59,\n\t0x1f5b, 0x1f5b,\n\t0x1f5d, 0x1f5d,\n\t0x1f5f, 0x1f7d,\n\t0x1f80, 0x1fb4,\n\t0x1fb6, 0x1fc4,\n\t0x1fc6, 0x1fd3,\n\t0x1fd6, 0x1fdb,\n\t0x1fdd, 0x1fef,\n\t0x1ff2, 0x1ff4,\n\t0x1ff6, 0x1ffe,\n\t0x2000, 0x2063,\n\t0x206a, 0x2071,\n\t0x2074, 0x208e,\n\t0x2090, 0x2094,\n\t0x20a0, 0x20b5,\n\t0x20d0, 0x20eb,\n\t0x2100, 0x214c,\n\t0x2153, 0x2183,\n\t0x2190, 0x23db,\n\t0x2400, 0x2426,\n\t0x2440, 0x244a,\n\t0x2460, 0x269c,\n\t0x26a0, 0x26b1,\n\t0x2701, 0x2704,\n\t0x2706, 0x2709,\n\t0x270c, 0x2727,\n\t0x2729, 0x274b,\n\t0x274d, 0x274d,\n\t0x274f, 0x2752,\n\t0x2756, 0x2756,\n\t0x2758, 0x275e,\n\t0x2761, 0x2794,\n\t0x2798, 0x27af,\n\t0x27b1, 0x27be,\n\t0x27c0, 0x27c6,\n\t0x27d0, 0x27eb,\n\t0x27f0, 0x2b13,\n\t0x2c00, 0x2c2e,\n\t0x2c30, 0x2c5e,\n\t0x2c80, 0x2cea,\n\t0x2cf9, 0x2d25,\n\t0x2d30, 0x2d65,\n\t0x2d6f, 0x2d6f,\n\t0x2d80, 0x2d96,\n\t0x2da0, 0x2da6,\n\t0x2da8, 0x2dae,\n\t0x2db0, 0x2db6,\n\t0x2db8, 0x2dbe,\n\t0x2dc0, 0x2dc6,\n\t0x2dc8, 0x2dce,\n\t0x2dd0, 0x2dd6,\n\t0x2dd8, 0x2dde,\n\t0x2e00, 0x2e17,\n\t0x2e1c, 0x2e1d,\n\t0x2e80, 0x2e99,\n\t0x2e9b, 0x2ef3,\n\t0x2f00, 0x2fd5,\n\t0x2ff0, 0x2ffb,\n\t0x3000, 0x303f,\n\t0x3041, 0x3096,\n\t0x3099, 0x30ff,\n\t0x3105, 0x312c,\n\t0x3131, 0x318e,\n\t0x3190, 0x31b7,\n\t0x31c0, 0x31cf,\n\t0x31f0, 0x321e,\n\t0x3220, 0x3243,\n\t0x3250, 0x32fe,\n\t0x3300, 0x4db5,\n\t0x4dc0, 0x9fbb,\n\t0xa000, 0xa48c,\n\t0xa490, 0xa4c6,\n\t0xa700, 0xa716,\n\t0xa800, 0xa82b,\n\t0xac00, 0xd7a3,\n\t0xd800, 0xfa2d,\n\t0xfa30, 0xfa6a,\n\t0xfa70, 0xfad9,\n\t0xfb00, 0xfb06,\n\t0xfb13, 0xfb17,\n\t0xfb1d, 0xfb36,\n\t0xfb38, 0xfb3c,\n\t0xfb3e, 0xfb3e,\n\t0xfb40, 0xfb41,\n\t0xfb43, 0xfb44,\n\t0xfb46, 0xfbb1,\n\t0xfbd3, 0xfd3f,\n\t0xfd50, 0xfd8f,\n\t0xfd92, 0xfdc7,\n\t0xfdd0, 0xfdfd,\n\t0xfe00, 0xfe19,\n\t0xfe20, 0xfe23,\n\t0xfe30, 0xfe52,\n\t0xfe54, 0xfe66,\n\t0xfe68, 0xfe6b,\n\t0xfe70, 0xfe74,\n\t0xfe76, 0xfefc,\n\t0xfeff, 0xfeff,\n\t0xff01, 0xffbe,\n\t0xffc2, 0xffc7,\n\t0xffca, 0xffcf,\n\t0xffd2, 0xffd7,\n\t0xffda, 0xffdc,\n\t0xffe0, 0xffe6,\n\t0xffe8, 0xffee,\n\t0xfff9, 0x1000b,\n\t0x1000d, 0x10026,\n\t0x10028, 0x1003a,\n\t0x1003c, 0x1003d,\n\t0x1003f, 0x1004d,\n\t0x10050, 0x1005d,\n\t0x10080, 0x100fa,\n\t0x10100, 0x10102,\n\t0x10107, 0x10133,\n\t0x10137, 0x1018a,\n\t0x10300, 0x1031e,\n\t0x10320, 0x10323,\n\t0x10330, 0x1034a,\n\t0x10380, 0x1039d,\n\t0x1039f, 0x103c3,\n\t0x103c8, 0x103d5,\n\t0x10400, 0x1049d,\n\t0x104a0, 0x104a9,\n\t0x10800, 0x10805,\n\t0x10808, 0x10808,\n\t0x1080a, 0x10835,\n\t0x10837, 0x10838,\n\t0x1083c, 0x1083c,\n\t0x1083f, 0x1083f,\n\t0x10a00, 0x10a03,\n\t0x10a05, 0x10a06,\n\t0x10a0c, 0x10a13,\n\t0x10a15, 0x10a17,\n\t0x10a19, 0x10a33,\n\t0x10a38, 0x10a3a,\n\t0x10a3f, 0x10a47,\n\t0x10a50, 0x10a58,\n\t0x1d000, 0x1d0f5,\n\t0x1d100, 0x1d126,\n\t0x1d12a, 0x1d1dd,\n\t0x1d200, 0x1d245,\n\t0x1d300, 0x1d356,\n\t0x1d400, 0x1d454,\n\t0x1d456, 0x1d49c,\n\t0x1d49e, 0x1d49f,\n\t0x1d4a2, 0x1d4a2,\n\t0x1d4a5, 0x1d4a6,\n\t0x1d4a9, 0x1d4ac,\n\t0x1d4ae, 0x1d4b9,\n\t0x1d4bb, 0x1d4bb,\n\t0x1d4bd, 0x1d4c3,\n\t0x1d4c5, 0x1d505,\n\t0x1d507, 0x1d50a,\n\t0x1d50d, 0x1d514,\n\t0x1d516, 0x1d51c,\n\t0x1d51e, 0x1d539,\n\t0x1d53b, 0x1d53e,\n\t0x1d540, 0x1d544,\n\t0x1d546, 0x1d546,\n\t0x1d54a, 0x1d550,\n\t0x1d552, 0x1d6a5,\n\t0x1d6a8, 0x1d7c9,\n\t0x1d7ce, 0x1d7ff,\n\t0x1fffe, 0x2a6d6,\n\t0x2f800, 0x2fa1d,\n\t0x2fffe, 0x2ffff,\n\t0x3fffe, 0x3ffff,\n\t0x4fffe, 0x4ffff,\n\t0x5fffe, 0x5ffff,\n\t0x6fffe, 0x6ffff,\n\t0x7fffe, 0x7ffff,\n\t0x8fffe, 0x8ffff,\n\t0x9fffe, 0x9ffff,\n\t0xafffe, 0xaffff,\n\t0xbfffe, 0xbffff,\n\t0xcfffe, 0xcffff,\n\t0xdfffe, 0xdffff,\n\t0xe0001, 0xe0001,\n\t0xe0020, 0xe007f,\n\t0xe0100, 0xe01ef,\n\t0xefffe, 0x10ffff,\n}; /* CR_Age_4_1 */\n\n/* 'Age_5_0': Derived Age 5.0 */\nstatic const OnigCodePoint CR_Age_5_0[] = {\n\t440,\n\t0x0000, 0x036f,\n\t0x0374, 0x0375,\n\t0x037a, 0x037e,\n\t0x0384, 0x038a,\n\t0x038c, 0x038c,\n\t0x038e, 0x03a1,\n\t0x03a3, 0x03ce,\n\t0x03d0, 0x0486,\n\t0x0488, 0x0513,\n\t0x0531, 0x0556,\n\t0x0559, 0x055f,\n\t0x0561, 0x0587,\n\t0x0589, 0x058a,\n\t0x0591, 0x05c7,\n\t0x05d0, 0x05ea,\n\t0x05f0, 0x05f4,\n\t0x0600, 0x0603,\n\t0x060b, 0x0615,\n\t0x061b, 0x061b,\n\t0x061e, 0x061f,\n\t0x0621, 0x063a,\n\t0x0640, 0x065e,\n\t0x0660, 0x070d,\n\t0x070f, 0x074a,\n\t0x074d, 0x076d,\n\t0x0780, 0x07b1,\n\t0x07c0, 0x07fa,\n\t0x0901, 0x0939,\n\t0x093c, 0x094d,\n\t0x0950, 0x0954,\n\t0x0958, 0x0970,\n\t0x097b, 0x097f,\n\t0x0981, 0x0983,\n\t0x0985, 0x098c,\n\t0x098f, 0x0990,\n\t0x0993, 0x09a8,\n\t0x09aa, 0x09b0,\n\t0x09b2, 0x09b2,\n\t0x09b6, 0x09b9,\n\t0x09bc, 0x09c4,\n\t0x09c7, 0x09c8,\n\t0x09cb, 0x09ce,\n\t0x09d7, 0x09d7,\n\t0x09dc, 0x09dd,\n\t0x09df, 0x09e3,\n\t0x09e6, 0x09fa,\n\t0x0a01, 0x0a03,\n\t0x0a05, 0x0a0a,\n\t0x0a0f, 0x0a10,\n\t0x0a13, 0x0a28,\n\t0x0a2a, 0x0a30,\n\t0x0a32, 0x0a33,\n\t0x0a35, 0x0a36,\n\t0x0a38, 0x0a39,\n\t0x0a3c, 0x0a3c,\n\t0x0a3e, 0x0a42,\n\t0x0a47, 0x0a48,\n\t0x0a4b, 0x0a4d,\n\t0x0a59, 0x0a5c,\n\t0x0a5e, 0x0a5e,\n\t0x0a66, 0x0a74,\n\t0x0a81, 0x0a83,\n\t0x0a85, 0x0a8d,\n\t0x0a8f, 0x0a91,\n\t0x0a93, 0x0aa8,\n\t0x0aaa, 0x0ab0,\n\t0x0ab2, 0x0ab3,\n\t0x0ab5, 0x0ab9,\n\t0x0abc, 0x0ac5,\n\t0x0ac7, 0x0ac9,\n\t0x0acb, 0x0acd,\n\t0x0ad0, 0x0ad0,\n\t0x0ae0, 0x0ae3,\n\t0x0ae6, 0x0aef,\n\t0x0af1, 0x0af1,\n\t0x0b01, 0x0b03,\n\t0x0b05, 0x0b0c,\n\t0x0b0f, 0x0b10,\n\t0x0b13, 0x0b28,\n\t0x0b2a, 0x0b30,\n\t0x0b32, 0x0b33,\n\t0x0b35, 0x0b39,\n\t0x0b3c, 0x0b43,\n\t0x0b47, 0x0b48,\n\t0x0b4b, 0x0b4d,\n\t0x0b56, 0x0b57,\n\t0x0b5c, 0x0b5d,\n\t0x0b5f, 0x0b61,\n\t0x0b66, 0x0b71,\n\t0x0b82, 0x0b83,\n\t0x0b85, 0x0b8a,\n\t0x0b8e, 0x0b90,\n\t0x0b92, 0x0b95,\n\t0x0b99, 0x0b9a,\n\t0x0b9c, 0x0b9c,\n\t0x0b9e, 0x0b9f,\n\t0x0ba3, 0x0ba4,\n\t0x0ba8, 0x0baa,\n\t0x0bae, 0x0bb9,\n\t0x0bbe, 0x0bc2,\n\t0x0bc6, 0x0bc8,\n\t0x0bca, 0x0bcd,\n\t0x0bd7, 0x0bd7,\n\t0x0be6, 0x0bfa,\n\t0x0c01, 0x0c03,\n\t0x0c05, 0x0c0c,\n\t0x0c0e, 0x0c10,\n\t0x0c12, 0x0c28,\n\t0x0c2a, 0x0c33,\n\t0x0c35, 0x0c39,\n\t0x0c3e, 0x0c44,\n\t0x0c46, 0x0c48,\n\t0x0c4a, 0x0c4d,\n\t0x0c55, 0x0c56,\n\t0x0c60, 0x0c61,\n\t0x0c66, 0x0c6f,\n\t0x0c82, 0x0c83,\n\t0x0c85, 0x0c8c,\n\t0x0c8e, 0x0c90,\n\t0x0c92, 0x0ca8,\n\t0x0caa, 0x0cb3,\n\t0x0cb5, 0x0cb9,\n\t0x0cbc, 0x0cc4,\n\t0x0cc6, 0x0cc8,\n\t0x0cca, 0x0ccd,\n\t0x0cd5, 0x0cd6,\n\t0x0cde, 0x0cde,\n\t0x0ce0, 0x0ce3,\n\t0x0ce6, 0x0cef,\n\t0x0cf1, 0x0cf2,\n\t0x0d02, 0x0d03,\n\t0x0d05, 0x0d0c,\n\t0x0d0e, 0x0d10,\n\t0x0d12, 0x0d28,\n\t0x0d2a, 0x0d39,\n\t0x0d3e, 0x0d43,\n\t0x0d46, 0x0d48,\n\t0x0d4a, 0x0d4d,\n\t0x0d57, 0x0d57,\n\t0x0d60, 0x0d61,\n\t0x0d66, 0x0d6f,\n\t0x0d82, 0x0d83,\n\t0x0d85, 0x0d96,\n\t0x0d9a, 0x0db1,\n\t0x0db3, 0x0dbb,\n\t0x0dbd, 0x0dbd,\n\t0x0dc0, 0x0dc6,\n\t0x0dca, 0x0dca,\n\t0x0dcf, 0x0dd4,\n\t0x0dd6, 0x0dd6,\n\t0x0dd8, 0x0ddf,\n\t0x0df2, 0x0df4,\n\t0x0e01, 0x0e3a,\n\t0x0e3f, 0x0e5b,\n\t0x0e81, 0x0e82,\n\t0x0e84, 0x0e84,\n\t0x0e87, 0x0e88,\n\t0x0e8a, 0x0e8a,\n\t0x0e8d, 0x0e8d,\n\t0x0e94, 0x0e97,\n\t0x0e99, 0x0e9f,\n\t0x0ea1, 0x0ea3,\n\t0x0ea5, 0x0ea5,\n\t0x0ea7, 0x0ea7,\n\t0x0eaa, 0x0eab,\n\t0x0ead, 0x0eb9,\n\t0x0ebb, 0x0ebd,\n\t0x0ec0, 0x0ec4,\n\t0x0ec6, 0x0ec6,\n\t0x0ec8, 0x0ecd,\n\t0x0ed0, 0x0ed9,\n\t0x0edc, 0x0edd,\n\t0x0f00, 0x0f47,\n\t0x0f49, 0x0f6a,\n\t0x0f71, 0x0f8b,\n\t0x0f90, 0x0f97,\n\t0x0f99, 0x0fbc,\n\t0x0fbe, 0x0fcc,\n\t0x0fcf, 0x0fd1,\n\t0x1000, 0x1021,\n\t0x1023, 0x1027,\n\t0x1029, 0x102a,\n\t0x102c, 0x1032,\n\t0x1036, 0x1039,\n\t0x1040, 0x1059,\n\t0x10a0, 0x10c5,\n\t0x10d0, 0x10fc,\n\t0x1100, 0x1159,\n\t0x115f, 0x11a2,\n\t0x11a8, 0x11f9,\n\t0x1200, 0x1248,\n\t0x124a, 0x124d,\n\t0x1250, 0x1256,\n\t0x1258, 0x1258,\n\t0x125a, 0x125d,\n\t0x1260, 0x1288,\n\t0x128a, 0x128d,\n\t0x1290, 0x12b0,\n\t0x12b2, 0x12b5,\n\t0x12b8, 0x12be,\n\t0x12c0, 0x12c0,\n\t0x12c2, 0x12c5,\n\t0x12c8, 0x12d6,\n\t0x12d8, 0x1310,\n\t0x1312, 0x1315,\n\t0x1318, 0x135a,\n\t0x135f, 0x137c,\n\t0x1380, 0x1399,\n\t0x13a0, 0x13f4,\n\t0x1401, 0x1676,\n\t0x1680, 0x169c,\n\t0x16a0, 0x16f0,\n\t0x1700, 0x170c,\n\t0x170e, 0x1714,\n\t0x1720, 0x1736,\n\t0x1740, 0x1753,\n\t0x1760, 0x176c,\n\t0x176e, 0x1770,\n\t0x1772, 0x1773,\n\t0x1780, 0x17dd,\n\t0x17e0, 0x17e9,\n\t0x17f0, 0x17f9,\n\t0x1800, 0x180e,\n\t0x1810, 0x1819,\n\t0x1820, 0x1877,\n\t0x1880, 0x18a9,\n\t0x1900, 0x191c,\n\t0x1920, 0x192b,\n\t0x1930, 0x193b,\n\t0x1940, 0x1940,\n\t0x1944, 0x196d,\n\t0x1970, 0x1974,\n\t0x1980, 0x19a9,\n\t0x19b0, 0x19c9,\n\t0x19d0, 0x19d9,\n\t0x19de, 0x1a1b,\n\t0x1a1e, 0x1a1f,\n\t0x1b00, 0x1b4b,\n\t0x1b50, 0x1b7c,\n\t0x1d00, 0x1dca,\n\t0x1dfe, 0x1e9b,\n\t0x1ea0, 0x1ef9,\n\t0x1f00, 0x1f15,\n\t0x1f18, 0x1f1d,\n\t0x1f20, 0x1f45,\n\t0x1f48, 0x1f4d,\n\t0x1f50, 0x1f57,\n\t0x1f59, 0x1f59,\n\t0x1f5b, 0x1f5b,\n\t0x1f5d, 0x1f5d,\n\t0x1f5f, 0x1f7d,\n\t0x1f80, 0x1fb4,\n\t0x1fb6, 0x1fc4,\n\t0x1fc6, 0x1fd3,\n\t0x1fd6, 0x1fdb,\n\t0x1fdd, 0x1fef,\n\t0x1ff2, 0x1ff4,\n\t0x1ff6, 0x1ffe,\n\t0x2000, 0x2063,\n\t0x206a, 0x2071,\n\t0x2074, 0x208e,\n\t0x2090, 0x2094,\n\t0x20a0, 0x20b5,\n\t0x20d0, 0x20ef,\n\t0x2100, 0x214e,\n\t0x2153, 0x2184,\n\t0x2190, 0x23e7,\n\t0x2400, 0x2426,\n\t0x2440, 0x244a,\n\t0x2460, 0x269c,\n\t0x26a0, 0x26b2,\n\t0x2701, 0x2704,\n\t0x2706, 0x2709,\n\t0x270c, 0x2727,\n\t0x2729, 0x274b,\n\t0x274d, 0x274d,\n\t0x274f, 0x2752,\n\t0x2756, 0x2756,\n\t0x2758, 0x275e,\n\t0x2761, 0x2794,\n\t0x2798, 0x27af,\n\t0x27b1, 0x27be,\n\t0x27c0, 0x27ca,\n\t0x27d0, 0x27eb,\n\t0x27f0, 0x2b1a,\n\t0x2b20, 0x2b23,\n\t0x2c00, 0x2c2e,\n\t0x2c30, 0x2c5e,\n\t0x2c60, 0x2c6c,\n\t0x2c74, 0x2c77,\n\t0x2c80, 0x2cea,\n\t0x2cf9, 0x2d25,\n\t0x2d30, 0x2d65,\n\t0x2d6f, 0x2d6f,\n\t0x2d80, 0x2d96,\n\t0x2da0, 0x2da6,\n\t0x2da8, 0x2dae,\n\t0x2db0, 0x2db6,\n\t0x2db8, 0x2dbe,\n\t0x2dc0, 0x2dc6,\n\t0x2dc8, 0x2dce,\n\t0x2dd0, 0x2dd6,\n\t0x2dd8, 0x2dde,\n\t0x2e00, 0x2e17,\n\t0x2e1c, 0x2e1d,\n\t0x2e80, 0x2e99,\n\t0x2e9b, 0x2ef3,\n\t0x2f00, 0x2fd5,\n\t0x2ff0, 0x2ffb,\n\t0x3000, 0x303f,\n\t0x3041, 0x3096,\n\t0x3099, 0x30ff,\n\t0x3105, 0x312c,\n\t0x3131, 0x318e,\n\t0x3190, 0x31b7,\n\t0x31c0, 0x31cf,\n\t0x31f0, 0x321e,\n\t0x3220, 0x3243,\n\t0x3250, 0x32fe,\n\t0x3300, 0x4db5,\n\t0x4dc0, 0x9fbb,\n\t0xa000, 0xa48c,\n\t0xa490, 0xa4c6,\n\t0xa700, 0xa71a,\n\t0xa720, 0xa721,\n\t0xa800, 0xa82b,\n\t0xa840, 0xa877,\n\t0xac00, 0xd7a3,\n\t0xd800, 0xfa2d,\n\t0xfa30, 0xfa6a,\n\t0xfa70, 0xfad9,\n\t0xfb00, 0xfb06,\n\t0xfb13, 0xfb17,\n\t0xfb1d, 0xfb36,\n\t0xfb38, 0xfb3c,\n\t0xfb3e, 0xfb3e,\n\t0xfb40, 0xfb41,\n\t0xfb43, 0xfb44,\n\t0xfb46, 0xfbb1,\n\t0xfbd3, 0xfd3f,\n\t0xfd50, 0xfd8f,\n\t0xfd92, 0xfdc7,\n\t0xfdd0, 0xfdfd,\n\t0xfe00, 0xfe19,\n\t0xfe20, 0xfe23,\n\t0xfe30, 0xfe52,\n\t0xfe54, 0xfe66,\n\t0xfe68, 0xfe6b,\n\t0xfe70, 0xfe74,\n\t0xfe76, 0xfefc,\n\t0xfeff, 0xfeff,\n\t0xff01, 0xffbe,\n\t0xffc2, 0xffc7,\n\t0xffca, 0xffcf,\n\t0xffd2, 0xffd7,\n\t0xffda, 0xffdc,\n\t0xffe0, 0xffe6,\n\t0xffe8, 0xffee,\n\t0xfff9, 0x1000b,\n\t0x1000d, 0x10026,\n\t0x10028, 0x1003a,\n\t0x1003c, 0x1003d,\n\t0x1003f, 0x1004d,\n\t0x10050, 0x1005d,\n\t0x10080, 0x100fa,\n\t0x10100, 0x10102,\n\t0x10107, 0x10133,\n\t0x10137, 0x1018a,\n\t0x10300, 0x1031e,\n\t0x10320, 0x10323,\n\t0x10330, 0x1034a,\n\t0x10380, 0x1039d,\n\t0x1039f, 0x103c3,\n\t0x103c8, 0x103d5,\n\t0x10400, 0x1049d,\n\t0x104a0, 0x104a9,\n\t0x10800, 0x10805,\n\t0x10808, 0x10808,\n\t0x1080a, 0x10835,\n\t0x10837, 0x10838,\n\t0x1083c, 0x1083c,\n\t0x1083f, 0x1083f,\n\t0x10900, 0x10919,\n\t0x1091f, 0x1091f,\n\t0x10a00, 0x10a03,\n\t0x10a05, 0x10a06,\n\t0x10a0c, 0x10a13,\n\t0x10a15, 0x10a17,\n\t0x10a19, 0x10a33,\n\t0x10a38, 0x10a3a,\n\t0x10a3f, 0x10a47,\n\t0x10a50, 0x10a58,\n\t0x12000, 0x1236e,\n\t0x12400, 0x12462,\n\t0x12470, 0x12473,\n\t0x1d000, 0x1d0f5,\n\t0x1d100, 0x1d126,\n\t0x1d12a, 0x1d1dd,\n\t0x1d200, 0x1d245,\n\t0x1d300, 0x1d356,\n\t0x1d360, 0x1d371,\n\t0x1d400, 0x1d454,\n\t0x1d456, 0x1d49c,\n\t0x1d49e, 0x1d49f,\n\t0x1d4a2, 0x1d4a2,\n\t0x1d4a5, 0x1d4a6,\n\t0x1d4a9, 0x1d4ac,\n\t0x1d4ae, 0x1d4b9,\n\t0x1d4bb, 0x1d4bb,\n\t0x1d4bd, 0x1d4c3,\n\t0x1d4c5, 0x1d505,\n\t0x1d507, 0x1d50a,\n\t0x1d50d, 0x1d514,\n\t0x1d516, 0x1d51c,\n\t0x1d51e, 0x1d539,\n\t0x1d53b, 0x1d53e,\n\t0x1d540, 0x1d544,\n\t0x1d546, 0x1d546,\n\t0x1d54a, 0x1d550,\n\t0x1d552, 0x1d6a5,\n\t0x1d6a8, 0x1d7cb,\n\t0x1d7ce, 0x1d7ff,\n\t0x1fffe, 0x2a6d6,\n\t0x2f800, 0x2fa1d,\n\t0x2fffe, 0x2ffff,\n\t0x3fffe, 0x3ffff,\n\t0x4fffe, 0x4ffff,\n\t0x5fffe, 0x5ffff,\n\t0x6fffe, 0x6ffff,\n\t0x7fffe, 0x7ffff,\n\t0x8fffe, 0x8ffff,\n\t0x9fffe, 0x9ffff,\n\t0xafffe, 0xaffff,\n\t0xbfffe, 0xbffff,\n\t0xcfffe, 0xcffff,\n\t0xdfffe, 0xdffff,\n\t0xe0001, 0xe0001,\n\t0xe0020, 0xe007f,\n\t0xe0100, 0xe01ef,\n\t0xefffe, 0x10ffff,\n}; /* CR_Age_5_0 */\n\n/* 'Age_5_1': Derived Age 5.1 */\nstatic const OnigCodePoint CR_Age_5_1[] = {\n\t455,\n\t0x0000, 0x0377,\n\t0x037a, 0x037e,\n\t0x0384, 0x038a,\n\t0x038c, 0x038c,\n\t0x038e, 0x03a1,\n\t0x03a3, 0x0523,\n\t0x0531, 0x0556,\n\t0x0559, 0x055f,\n\t0x0561, 0x0587,\n\t0x0589, 0x058a,\n\t0x0591, 0x05c7,\n\t0x05d0, 0x05ea,\n\t0x05f0, 0x05f4,\n\t0x0600, 0x0603,\n\t0x0606, 0x061b,\n\t0x061e, 0x061f,\n\t0x0621, 0x065e,\n\t0x0660, 0x070d,\n\t0x070f, 0x074a,\n\t0x074d, 0x07b1,\n\t0x07c0, 0x07fa,\n\t0x0901, 0x0939,\n\t0x093c, 0x094d,\n\t0x0950, 0x0954,\n\t0x0958, 0x0972,\n\t0x097b, 0x097f,\n\t0x0981, 0x0983,\n\t0x0985, 0x098c,\n\t0x098f, 0x0990,\n\t0x0993, 0x09a8,\n\t0x09aa, 0x09b0,\n\t0x09b2, 0x09b2,\n\t0x09b6, 0x09b9,\n\t0x09bc, 0x09c4,\n\t0x09c7, 0x09c8,\n\t0x09cb, 0x09ce,\n\t0x09d7, 0x09d7,\n\t0x09dc, 0x09dd,\n\t0x09df, 0x09e3,\n\t0x09e6, 0x09fa,\n\t0x0a01, 0x0a03,\n\t0x0a05, 0x0a0a,\n\t0x0a0f, 0x0a10,\n\t0x0a13, 0x0a28,\n\t0x0a2a, 0x0a30,\n\t0x0a32, 0x0a33,\n\t0x0a35, 0x0a36,\n\t0x0a38, 0x0a39,\n\t0x0a3c, 0x0a3c,\n\t0x0a3e, 0x0a42,\n\t0x0a47, 0x0a48,\n\t0x0a4b, 0x0a4d,\n\t0x0a51, 0x0a51,\n\t0x0a59, 0x0a5c,\n\t0x0a5e, 0x0a5e,\n\t0x0a66, 0x0a75,\n\t0x0a81, 0x0a83,\n\t0x0a85, 0x0a8d,\n\t0x0a8f, 0x0a91,\n\t0x0a93, 0x0aa8,\n\t0x0aaa, 0x0ab0,\n\t0x0ab2, 0x0ab3,\n\t0x0ab5, 0x0ab9,\n\t0x0abc, 0x0ac5,\n\t0x0ac7, 0x0ac9,\n\t0x0acb, 0x0acd,\n\t0x0ad0, 0x0ad0,\n\t0x0ae0, 0x0ae3,\n\t0x0ae6, 0x0aef,\n\t0x0af1, 0x0af1,\n\t0x0b01, 0x0b03,\n\t0x0b05, 0x0b0c,\n\t0x0b0f, 0x0b10,\n\t0x0b13, 0x0b28,\n\t0x0b2a, 0x0b30,\n\t0x0b32, 0x0b33,\n\t0x0b35, 0x0b39,\n\t0x0b3c, 0x0b44,\n\t0x0b47, 0x0b48,\n\t0x0b4b, 0x0b4d,\n\t0x0b56, 0x0b57,\n\t0x0b5c, 0x0b5d,\n\t0x0b5f, 0x0b63,\n\t0x0b66, 0x0b71,\n\t0x0b82, 0x0b83,\n\t0x0b85, 0x0b8a,\n\t0x0b8e, 0x0b90,\n\t0x0b92, 0x0b95,\n\t0x0b99, 0x0b9a,\n\t0x0b9c, 0x0b9c,\n\t0x0b9e, 0x0b9f,\n\t0x0ba3, 0x0ba4,\n\t0x0ba8, 0x0baa,\n\t0x0bae, 0x0bb9,\n\t0x0bbe, 0x0bc2,\n\t0x0bc6, 0x0bc8,\n\t0x0bca, 0x0bcd,\n\t0x0bd0, 0x0bd0,\n\t0x0bd7, 0x0bd7,\n\t0x0be6, 0x0bfa,\n\t0x0c01, 0x0c03,\n\t0x0c05, 0x0c0c,\n\t0x0c0e, 0x0c10,\n\t0x0c12, 0x0c28,\n\t0x0c2a, 0x0c33,\n\t0x0c35, 0x0c39,\n\t0x0c3d, 0x0c44,\n\t0x0c46, 0x0c48,\n\t0x0c4a, 0x0c4d,\n\t0x0c55, 0x0c56,\n\t0x0c58, 0x0c59,\n\t0x0c60, 0x0c63,\n\t0x0c66, 0x0c6f,\n\t0x0c78, 0x0c7f,\n\t0x0c82, 0x0c83,\n\t0x0c85, 0x0c8c,\n\t0x0c8e, 0x0c90,\n\t0x0c92, 0x0ca8,\n\t0x0caa, 0x0cb3,\n\t0x0cb5, 0x0cb9,\n\t0x0cbc, 0x0cc4,\n\t0x0cc6, 0x0cc8,\n\t0x0cca, 0x0ccd,\n\t0x0cd5, 0x0cd6,\n\t0x0cde, 0x0cde,\n\t0x0ce0, 0x0ce3,\n\t0x0ce6, 0x0cef,\n\t0x0cf1, 0x0cf2,\n\t0x0d02, 0x0d03,\n\t0x0d05, 0x0d0c,\n\t0x0d0e, 0x0d10,\n\t0x0d12, 0x0d28,\n\t0x0d2a, 0x0d39,\n\t0x0d3d, 0x0d44,\n\t0x0d46, 0x0d48,\n\t0x0d4a, 0x0d4d,\n\t0x0d57, 0x0d57,\n\t0x0d60, 0x0d63,\n\t0x0d66, 0x0d75,\n\t0x0d79, 0x0d7f,\n\t0x0d82, 0x0d83,\n\t0x0d85, 0x0d96,\n\t0x0d9a, 0x0db1,\n\t0x0db3, 0x0dbb,\n\t0x0dbd, 0x0dbd,\n\t0x0dc0, 0x0dc6,\n\t0x0dca, 0x0dca,\n\t0x0dcf, 0x0dd4,\n\t0x0dd6, 0x0dd6,\n\t0x0dd8, 0x0ddf,\n\t0x0df2, 0x0df4,\n\t0x0e01, 0x0e3a,\n\t0x0e3f, 0x0e5b,\n\t0x0e81, 0x0e82,\n\t0x0e84, 0x0e84,\n\t0x0e87, 0x0e88,\n\t0x0e8a, 0x0e8a,\n\t0x0e8d, 0x0e8d,\n\t0x0e94, 0x0e97,\n\t0x0e99, 0x0e9f,\n\t0x0ea1, 0x0ea3,\n\t0x0ea5, 0x0ea5,\n\t0x0ea7, 0x0ea7,\n\t0x0eaa, 0x0eab,\n\t0x0ead, 0x0eb9,\n\t0x0ebb, 0x0ebd,\n\t0x0ec0, 0x0ec4,\n\t0x0ec6, 0x0ec6,\n\t0x0ec8, 0x0ecd,\n\t0x0ed0, 0x0ed9,\n\t0x0edc, 0x0edd,\n\t0x0f00, 0x0f47,\n\t0x0f49, 0x0f6c,\n\t0x0f71, 0x0f8b,\n\t0x0f90, 0x0f97,\n\t0x0f99, 0x0fbc,\n\t0x0fbe, 0x0fcc,\n\t0x0fce, 0x0fd4,\n\t0x1000, 0x1099,\n\t0x109e, 0x10c5,\n\t0x10d0, 0x10fc,\n\t0x1100, 0x1159,\n\t0x115f, 0x11a2,\n\t0x11a8, 0x11f9,\n\t0x1200, 0x1248,\n\t0x124a, 0x124d,\n\t0x1250, 0x1256,\n\t0x1258, 0x1258,\n\t0x125a, 0x125d,\n\t0x1260, 0x1288,\n\t0x128a, 0x128d,\n\t0x1290, 0x12b0,\n\t0x12b2, 0x12b5,\n\t0x12b8, 0x12be,\n\t0x12c0, 0x12c0,\n\t0x12c2, 0x12c5,\n\t0x12c8, 0x12d6,\n\t0x12d8, 0x1310,\n\t0x1312, 0x1315,\n\t0x1318, 0x135a,\n\t0x135f, 0x137c,\n\t0x1380, 0x1399,\n\t0x13a0, 0x13f4,\n\t0x1401, 0x1676,\n\t0x1680, 0x169c,\n\t0x16a0, 0x16f0,\n\t0x1700, 0x170c,\n\t0x170e, 0x1714,\n\t0x1720, 0x1736,\n\t0x1740, 0x1753,\n\t0x1760, 0x176c,\n\t0x176e, 0x1770,\n\t0x1772, 0x1773,\n\t0x1780, 0x17dd,\n\t0x17e0, 0x17e9,\n\t0x17f0, 0x17f9,\n\t0x1800, 0x180e,\n\t0x1810, 0x1819,\n\t0x1820, 0x1877,\n\t0x1880, 0x18aa,\n\t0x1900, 0x191c,\n\t0x1920, 0x192b,\n\t0x1930, 0x193b,\n\t0x1940, 0x1940,\n\t0x1944, 0x196d,\n\t0x1970, 0x1974,\n\t0x1980, 0x19a9,\n\t0x19b0, 0x19c9,\n\t0x19d0, 0x19d9,\n\t0x19de, 0x1a1b,\n\t0x1a1e, 0x1a1f,\n\t0x1b00, 0x1b4b,\n\t0x1b50, 0x1b7c,\n\t0x1b80, 0x1baa,\n\t0x1bae, 0x1bb9,\n\t0x1c00, 0x1c37,\n\t0x1c3b, 0x1c49,\n\t0x1c4d, 0x1c7f,\n\t0x1d00, 0x1de6,\n\t0x1dfe, 0x1f15,\n\t0x1f18, 0x1f1d,\n\t0x1f20, 0x1f45,\n\t0x1f48, 0x1f4d,\n\t0x1f50, 0x1f57,\n\t0x1f59, 0x1f59,\n\t0x1f5b, 0x1f5b,\n\t0x1f5d, 0x1f5d,\n\t0x1f5f, 0x1f7d,\n\t0x1f80, 0x1fb4,\n\t0x1fb6, 0x1fc4,\n\t0x1fc6, 0x1fd3,\n\t0x1fd6, 0x1fdb,\n\t0x1fdd, 0x1fef,\n\t0x1ff2, 0x1ff4,\n\t0x1ff6, 0x1ffe,\n\t0x2000, 0x2064,\n\t0x206a, 0x2071,\n\t0x2074, 0x208e,\n\t0x2090, 0x2094,\n\t0x20a0, 0x20b5,\n\t0x20d0, 0x20f0,\n\t0x2100, 0x214f,\n\t0x2153, 0x2188,\n\t0x2190, 0x23e7,\n\t0x2400, 0x2426,\n\t0x2440, 0x244a,\n\t0x2460, 0x269d,\n\t0x26a0, 0x26bc,\n\t0x26c0, 0x26c3,\n\t0x2701, 0x2704,\n\t0x2706, 0x2709,\n\t0x270c, 0x2727,\n\t0x2729, 0x274b,\n\t0x274d, 0x274d,\n\t0x274f, 0x2752,\n\t0x2756, 0x2756,\n\t0x2758, 0x275e,\n\t0x2761, 0x2794,\n\t0x2798, 0x27af,\n\t0x27b1, 0x27be,\n\t0x27c0, 0x27ca,\n\t0x27cc, 0x27cc,\n\t0x27d0, 0x2b4c,\n\t0x2b50, 0x2b54,\n\t0x2c00, 0x2c2e,\n\t0x2c30, 0x2c5e,\n\t0x2c60, 0x2c6f,\n\t0x2c71, 0x2c7d,\n\t0x2c80, 0x2cea,\n\t0x2cf9, 0x2d25,\n\t0x2d30, 0x2d65,\n\t0x2d6f, 0x2d6f,\n\t0x2d80, 0x2d96,\n\t0x2da0, 0x2da6,\n\t0x2da8, 0x2dae,\n\t0x2db0, 0x2db6,\n\t0x2db8, 0x2dbe,\n\t0x2dc0, 0x2dc6,\n\t0x2dc8, 0x2dce,\n\t0x2dd0, 0x2dd6,\n\t0x2dd8, 0x2dde,\n\t0x2de0, 0x2e30,\n\t0x2e80, 0x2e99,\n\t0x2e9b, 0x2ef3,\n\t0x2f00, 0x2fd5,\n\t0x2ff0, 0x2ffb,\n\t0x3000, 0x303f,\n\t0x3041, 0x3096,\n\t0x3099, 0x30ff,\n\t0x3105, 0x312d,\n\t0x3131, 0x318e,\n\t0x3190, 0x31b7,\n\t0x31c0, 0x31e3,\n\t0x31f0, 0x321e,\n\t0x3220, 0x3243,\n\t0x3250, 0x32fe,\n\t0x3300, 0x4db5,\n\t0x4dc0, 0x9fc3,\n\t0xa000, 0xa48c,\n\t0xa490, 0xa4c6,\n\t0xa500, 0xa62b,\n\t0xa640, 0xa65f,\n\t0xa662, 0xa673,\n\t0xa67c, 0xa697,\n\t0xa700, 0xa78c,\n\t0xa7fb, 0xa82b,\n\t0xa840, 0xa877,\n\t0xa880, 0xa8c4,\n\t0xa8ce, 0xa8d9,\n\t0xa900, 0xa953,\n\t0xa95f, 0xa95f,\n\t0xaa00, 0xaa36,\n\t0xaa40, 0xaa4d,\n\t0xaa50, 0xaa59,\n\t0xaa5c, 0xaa5f,\n\t0xac00, 0xd7a3,\n\t0xd800, 0xfa2d,\n\t0xfa30, 0xfa6a,\n\t0xfa70, 0xfad9,\n\t0xfb00, 0xfb06,\n\t0xfb13, 0xfb17,\n\t0xfb1d, 0xfb36,\n\t0xfb38, 0xfb3c,\n\t0xfb3e, 0xfb3e,\n\t0xfb40, 0xfb41,\n\t0xfb43, 0xfb44,\n\t0xfb46, 0xfbb1,\n\t0xfbd3, 0xfd3f,\n\t0xfd50, 0xfd8f,\n\t0xfd92, 0xfdc7,\n\t0xfdd0, 0xfdfd,\n\t0xfe00, 0xfe19,\n\t0xfe20, 0xfe26,\n\t0xfe30, 0xfe52,\n\t0xfe54, 0xfe66,\n\t0xfe68, 0xfe6b,\n\t0xfe70, 0xfe74,\n\t0xfe76, 0xfefc,\n\t0xfeff, 0xfeff,\n\t0xff01, 0xffbe,\n\t0xffc2, 0xffc7,\n\t0xffca, 0xffcf,\n\t0xffd2, 0xffd7,\n\t0xffda, 0xffdc,\n\t0xffe0, 0xffe6,\n\t0xffe8, 0xffee,\n\t0xfff9, 0x1000b,\n\t0x1000d, 0x10026,\n\t0x10028, 0x1003a,\n\t0x1003c, 0x1003d,\n\t0x1003f, 0x1004d,\n\t0x10050, 0x1005d,\n\t0x10080, 0x100fa,\n\t0x10100, 0x10102,\n\t0x10107, 0x10133,\n\t0x10137, 0x1018a,\n\t0x10190, 0x1019b,\n\t0x101d0, 0x101fd,\n\t0x10280, 0x1029c,\n\t0x102a0, 0x102d0,\n\t0x10300, 0x1031e,\n\t0x10320, 0x10323,\n\t0x10330, 0x1034a,\n\t0x10380, 0x1039d,\n\t0x1039f, 0x103c3,\n\t0x103c8, 0x103d5,\n\t0x10400, 0x1049d,\n\t0x104a0, 0x104a9,\n\t0x10800, 0x10805,\n\t0x10808, 0x10808,\n\t0x1080a, 0x10835,\n\t0x10837, 0x10838,\n\t0x1083c, 0x1083c,\n\t0x1083f, 0x1083f,\n\t0x10900, 0x10919,\n\t0x1091f, 0x10939,\n\t0x1093f, 0x1093f,\n\t0x10a00, 0x10a03,\n\t0x10a05, 0x10a06,\n\t0x10a0c, 0x10a13,\n\t0x10a15, 0x10a17,\n\t0x10a19, 0x10a33,\n\t0x10a38, 0x10a3a,\n\t0x10a3f, 0x10a47,\n\t0x10a50, 0x10a58,\n\t0x12000, 0x1236e,\n\t0x12400, 0x12462,\n\t0x12470, 0x12473,\n\t0x1d000, 0x1d0f5,\n\t0x1d100, 0x1d126,\n\t0x1d129, 0x1d1dd,\n\t0x1d200, 0x1d245,\n\t0x1d300, 0x1d356,\n\t0x1d360, 0x1d371,\n\t0x1d400, 0x1d454,\n\t0x1d456, 0x1d49c,\n\t0x1d49e, 0x1d49f,\n\t0x1d4a2, 0x1d4a2,\n\t0x1d4a5, 0x1d4a6,\n\t0x1d4a9, 0x1d4ac,\n\t0x1d4ae, 0x1d4b9,\n\t0x1d4bb, 0x1d4bb,\n\t0x1d4bd, 0x1d4c3,\n\t0x1d4c5, 0x1d505,\n\t0x1d507, 0x1d50a,\n\t0x1d50d, 0x1d514,\n\t0x1d516, 0x1d51c,\n\t0x1d51e, 0x1d539,\n\t0x1d53b, 0x1d53e,\n\t0x1d540, 0x1d544,\n\t0x1d546, 0x1d546,\n\t0x1d54a, 0x1d550,\n\t0x1d552, 0x1d6a5,\n\t0x1d6a8, 0x1d7cb,\n\t0x1d7ce, 0x1d7ff,\n\t0x1f000, 0x1f02b,\n\t0x1f030, 0x1f093,\n\t0x1fffe, 0x2a6d6,\n\t0x2f800, 0x2fa1d,\n\t0x2fffe, 0x2ffff,\n\t0x3fffe, 0x3ffff,\n\t0x4fffe, 0x4ffff,\n\t0x5fffe, 0x5ffff,\n\t0x6fffe, 0x6ffff,\n\t0x7fffe, 0x7ffff,\n\t0x8fffe, 0x8ffff,\n\t0x9fffe, 0x9ffff,\n\t0xafffe, 0xaffff,\n\t0xbfffe, 0xbffff,\n\t0xcfffe, 0xcffff,\n\t0xdfffe, 0xdffff,\n\t0xe0001, 0xe0001,\n\t0xe0020, 0xe007f,\n\t0xe0100, 0xe01ef,\n\t0xefffe, 0x10ffff,\n}; /* CR_Age_5_1 */\n\n/* 'Age_5_2': Derived Age 5.2 */\nstatic const OnigCodePoint CR_Age_5_2[] = {\n\t495,\n\t0x0000, 0x0377,\n\t0x037a, 0x037e,\n\t0x0384, 0x038a,\n\t0x038c, 0x038c,\n\t0x038e, 0x03a1,\n\t0x03a3, 0x0525,\n\t0x0531, 0x0556,\n\t0x0559, 0x055f,\n\t0x0561, 0x0587,\n\t0x0589, 0x058a,\n\t0x0591, 0x05c7,\n\t0x05d0, 0x05ea,\n\t0x05f0, 0x05f4,\n\t0x0600, 0x0603,\n\t0x0606, 0x061b,\n\t0x061e, 0x061f,\n\t0x0621, 0x065e,\n\t0x0660, 0x070d,\n\t0x070f, 0x074a,\n\t0x074d, 0x07b1,\n\t0x07c0, 0x07fa,\n\t0x0800, 0x082d,\n\t0x0830, 0x083e,\n\t0x0900, 0x0939,\n\t0x093c, 0x094e,\n\t0x0950, 0x0955,\n\t0x0958, 0x0972,\n\t0x0979, 0x097f,\n\t0x0981, 0x0983,\n\t0x0985, 0x098c,\n\t0x098f, 0x0990,\n\t0x0993, 0x09a8,\n\t0x09aa, 0x09b0,\n\t0x09b2, 0x09b2,\n\t0x09b6, 0x09b9,\n\t0x09bc, 0x09c4,\n\t0x09c7, 0x09c8,\n\t0x09cb, 0x09ce,\n\t0x09d7, 0x09d7,\n\t0x09dc, 0x09dd,\n\t0x09df, 0x09e3,\n\t0x09e6, 0x09fb,\n\t0x0a01, 0x0a03,\n\t0x0a05, 0x0a0a,\n\t0x0a0f, 0x0a10,\n\t0x0a13, 0x0a28,\n\t0x0a2a, 0x0a30,\n\t0x0a32, 0x0a33,\n\t0x0a35, 0x0a36,\n\t0x0a38, 0x0a39,\n\t0x0a3c, 0x0a3c,\n\t0x0a3e, 0x0a42,\n\t0x0a47, 0x0a48,\n\t0x0a4b, 0x0a4d,\n\t0x0a51, 0x0a51,\n\t0x0a59, 0x0a5c,\n\t0x0a5e, 0x0a5e,\n\t0x0a66, 0x0a75,\n\t0x0a81, 0x0a83,\n\t0x0a85, 0x0a8d,\n\t0x0a8f, 0x0a91,\n\t0x0a93, 0x0aa8,\n\t0x0aaa, 0x0ab0,\n\t0x0ab2, 0x0ab3,\n\t0x0ab5, 0x0ab9,\n\t0x0abc, 0x0ac5,\n\t0x0ac7, 0x0ac9,\n\t0x0acb, 0x0acd,\n\t0x0ad0, 0x0ad0,\n\t0x0ae0, 0x0ae3,\n\t0x0ae6, 0x0aef,\n\t0x0af1, 0x0af1,\n\t0x0b01, 0x0b03,\n\t0x0b05, 0x0b0c,\n\t0x0b0f, 0x0b10,\n\t0x0b13, 0x0b28,\n\t0x0b2a, 0x0b30,\n\t0x0b32, 0x0b33,\n\t0x0b35, 0x0b39,\n\t0x0b3c, 0x0b44,\n\t0x0b47, 0x0b48,\n\t0x0b4b, 0x0b4d,\n\t0x0b56, 0x0b57,\n\t0x0b5c, 0x0b5d,\n\t0x0b5f, 0x0b63,\n\t0x0b66, 0x0b71,\n\t0x0b82, 0x0b83,\n\t0x0b85, 0x0b8a,\n\t0x0b8e, 0x0b90,\n\t0x0b92, 0x0b95,\n\t0x0b99, 0x0b9a,\n\t0x0b9c, 0x0b9c,\n\t0x0b9e, 0x0b9f,\n\t0x0ba3, 0x0ba4,\n\t0x0ba8, 0x0baa,\n\t0x0bae, 0x0bb9,\n\t0x0bbe, 0x0bc2,\n\t0x0bc6, 0x0bc8,\n\t0x0bca, 0x0bcd,\n\t0x0bd0, 0x0bd0,\n\t0x0bd7, 0x0bd7,\n\t0x0be6, 0x0bfa,\n\t0x0c01, 0x0c03,\n\t0x0c05, 0x0c0c,\n\t0x0c0e, 0x0c10,\n\t0x0c12, 0x0c28,\n\t0x0c2a, 0x0c33,\n\t0x0c35, 0x0c39,\n\t0x0c3d, 0x0c44,\n\t0x0c46, 0x0c48,\n\t0x0c4a, 0x0c4d,\n\t0x0c55, 0x0c56,\n\t0x0c58, 0x0c59,\n\t0x0c60, 0x0c63,\n\t0x0c66, 0x0c6f,\n\t0x0c78, 0x0c7f,\n\t0x0c82, 0x0c83,\n\t0x0c85, 0x0c8c,\n\t0x0c8e, 0x0c90,\n\t0x0c92, 0x0ca8,\n\t0x0caa, 0x0cb3,\n\t0x0cb5, 0x0cb9,\n\t0x0cbc, 0x0cc4,\n\t0x0cc6, 0x0cc8,\n\t0x0cca, 0x0ccd,\n\t0x0cd5, 0x0cd6,\n\t0x0cde, 0x0cde,\n\t0x0ce0, 0x0ce3,\n\t0x0ce6, 0x0cef,\n\t0x0cf1, 0x0cf2,\n\t0x0d02, 0x0d03,\n\t0x0d05, 0x0d0c,\n\t0x0d0e, 0x0d10,\n\t0x0d12, 0x0d28,\n\t0x0d2a, 0x0d39,\n\t0x0d3d, 0x0d44,\n\t0x0d46, 0x0d48,\n\t0x0d4a, 0x0d4d,\n\t0x0d57, 0x0d57,\n\t0x0d60, 0x0d63,\n\t0x0d66, 0x0d75,\n\t0x0d79, 0x0d7f,\n\t0x0d82, 0x0d83,\n\t0x0d85, 0x0d96,\n\t0x0d9a, 0x0db1,\n\t0x0db3, 0x0dbb,\n\t0x0dbd, 0x0dbd,\n\t0x0dc0, 0x0dc6,\n\t0x0dca, 0x0dca,\n\t0x0dcf, 0x0dd4,\n\t0x0dd6, 0x0dd6,\n\t0x0dd8, 0x0ddf,\n\t0x0df2, 0x0df4,\n\t0x0e01, 0x0e3a,\n\t0x0e3f, 0x0e5b,\n\t0x0e81, 0x0e82,\n\t0x0e84, 0x0e84,\n\t0x0e87, 0x0e88,\n\t0x0e8a, 0x0e8a,\n\t0x0e8d, 0x0e8d,\n\t0x0e94, 0x0e97,\n\t0x0e99, 0x0e9f,\n\t0x0ea1, 0x0ea3,\n\t0x0ea5, 0x0ea5,\n\t0x0ea7, 0x0ea7,\n\t0x0eaa, 0x0eab,\n\t0x0ead, 0x0eb9,\n\t0x0ebb, 0x0ebd,\n\t0x0ec0, 0x0ec4,\n\t0x0ec6, 0x0ec6,\n\t0x0ec8, 0x0ecd,\n\t0x0ed0, 0x0ed9,\n\t0x0edc, 0x0edd,\n\t0x0f00, 0x0f47,\n\t0x0f49, 0x0f6c,\n\t0x0f71, 0x0f8b,\n\t0x0f90, 0x0f97,\n\t0x0f99, 0x0fbc,\n\t0x0fbe, 0x0fcc,\n\t0x0fce, 0x0fd8,\n\t0x1000, 0x10c5,\n\t0x10d0, 0x10fc,\n\t0x1100, 0x1248,\n\t0x124a, 0x124d,\n\t0x1250, 0x1256,\n\t0x1258, 0x1258,\n\t0x125a, 0x125d,\n\t0x1260, 0x1288,\n\t0x128a, 0x128d,\n\t0x1290, 0x12b0,\n\t0x12b2, 0x12b5,\n\t0x12b8, 0x12be,\n\t0x12c0, 0x12c0,\n\t0x12c2, 0x12c5,\n\t0x12c8, 0x12d6,\n\t0x12d8, 0x1310,\n\t0x1312, 0x1315,\n\t0x1318, 0x135a,\n\t0x135f, 0x137c,\n\t0x1380, 0x1399,\n\t0x13a0, 0x13f4,\n\t0x1400, 0x169c,\n\t0x16a0, 0x16f0,\n\t0x1700, 0x170c,\n\t0x170e, 0x1714,\n\t0x1720, 0x1736,\n\t0x1740, 0x1753,\n\t0x1760, 0x176c,\n\t0x176e, 0x1770,\n\t0x1772, 0x1773,\n\t0x1780, 0x17dd,\n\t0x17e0, 0x17e9,\n\t0x17f0, 0x17f9,\n\t0x1800, 0x180e,\n\t0x1810, 0x1819,\n\t0x1820, 0x1877,\n\t0x1880, 0x18aa,\n\t0x18b0, 0x18f5,\n\t0x1900, 0x191c,\n\t0x1920, 0x192b,\n\t0x1930, 0x193b,\n\t0x1940, 0x1940,\n\t0x1944, 0x196d,\n\t0x1970, 0x1974,\n\t0x1980, 0x19ab,\n\t0x19b0, 0x19c9,\n\t0x19d0, 0x19da,\n\t0x19de, 0x1a1b,\n\t0x1a1e, 0x1a5e,\n\t0x1a60, 0x1a7c,\n\t0x1a7f, 0x1a89,\n\t0x1a90, 0x1a99,\n\t0x1aa0, 0x1aad,\n\t0x1b00, 0x1b4b,\n\t0x1b50, 0x1b7c,\n\t0x1b80, 0x1baa,\n\t0x1bae, 0x1bb9,\n\t0x1c00, 0x1c37,\n\t0x1c3b, 0x1c49,\n\t0x1c4d, 0x1c7f,\n\t0x1cd0, 0x1cf2,\n\t0x1d00, 0x1de6,\n\t0x1dfd, 0x1f15,\n\t0x1f18, 0x1f1d,\n\t0x1f20, 0x1f45,\n\t0x1f48, 0x1f4d,\n\t0x1f50, 0x1f57,\n\t0x1f59, 0x1f59,\n\t0x1f5b, 0x1f5b,\n\t0x1f5d, 0x1f5d,\n\t0x1f5f, 0x1f7d,\n\t0x1f80, 0x1fb4,\n\t0x1fb6, 0x1fc4,\n\t0x1fc6, 0x1fd3,\n\t0x1fd6, 0x1fdb,\n\t0x1fdd, 0x1fef,\n\t0x1ff2, 0x1ff4,\n\t0x1ff6, 0x1ffe,\n\t0x2000, 0x2064,\n\t0x206a, 0x2071,\n\t0x2074, 0x208e,\n\t0x2090, 0x2094,\n\t0x20a0, 0x20b8,\n\t0x20d0, 0x20f0,\n\t0x2100, 0x2189,\n\t0x2190, 0x23e8,\n\t0x2400, 0x2426,\n\t0x2440, 0x244a,\n\t0x2460, 0x26cd,\n\t0x26cf, 0x26e1,\n\t0x26e3, 0x26e3,\n\t0x26e8, 0x26ff,\n\t0x2701, 0x2704,\n\t0x2706, 0x2709,\n\t0x270c, 0x2727,\n\t0x2729, 0x274b,\n\t0x274d, 0x274d,\n\t0x274f, 0x2752,\n\t0x2756, 0x275e,\n\t0x2761, 0x2794,\n\t0x2798, 0x27af,\n\t0x27b1, 0x27be,\n\t0x27c0, 0x27ca,\n\t0x27cc, 0x27cc,\n\t0x27d0, 0x2b4c,\n\t0x2b50, 0x2b59,\n\t0x2c00, 0x2c2e,\n\t0x2c30, 0x2c5e,\n\t0x2c60, 0x2cf1,\n\t0x2cf9, 0x2d25,\n\t0x2d30, 0x2d65,\n\t0x2d6f, 0x2d6f,\n\t0x2d80, 0x2d96,\n\t0x2da0, 0x2da6,\n\t0x2da8, 0x2dae,\n\t0x2db0, 0x2db6,\n\t0x2db8, 0x2dbe,\n\t0x2dc0, 0x2dc6,\n\t0x2dc8, 0x2dce,\n\t0x2dd0, 0x2dd6,\n\t0x2dd8, 0x2dde,\n\t0x2de0, 0x2e31,\n\t0x2e80, 0x2e99,\n\t0x2e9b, 0x2ef3,\n\t0x2f00, 0x2fd5,\n\t0x2ff0, 0x2ffb,\n\t0x3000, 0x303f,\n\t0x3041, 0x3096,\n\t0x3099, 0x30ff,\n\t0x3105, 0x312d,\n\t0x3131, 0x318e,\n\t0x3190, 0x31b7,\n\t0x31c0, 0x31e3,\n\t0x31f0, 0x321e,\n\t0x3220, 0x32fe,\n\t0x3300, 0x4db5,\n\t0x4dc0, 0x9fcb,\n\t0xa000, 0xa48c,\n\t0xa490, 0xa4c6,\n\t0xa4d0, 0xa62b,\n\t0xa640, 0xa65f,\n\t0xa662, 0xa673,\n\t0xa67c, 0xa697,\n\t0xa6a0, 0xa6f7,\n\t0xa700, 0xa78c,\n\t0xa7fb, 0xa82b,\n\t0xa830, 0xa839,\n\t0xa840, 0xa877,\n\t0xa880, 0xa8c4,\n\t0xa8ce, 0xa8d9,\n\t0xa8e0, 0xa8fb,\n\t0xa900, 0xa953,\n\t0xa95f, 0xa97c,\n\t0xa980, 0xa9cd,\n\t0xa9cf, 0xa9d9,\n\t0xa9de, 0xa9df,\n\t0xaa00, 0xaa36,\n\t0xaa40, 0xaa4d,\n\t0xaa50, 0xaa59,\n\t0xaa5c, 0xaa7b,\n\t0xaa80, 0xaac2,\n\t0xaadb, 0xaadf,\n\t0xabc0, 0xabed,\n\t0xabf0, 0xabf9,\n\t0xac00, 0xd7a3,\n\t0xd7b0, 0xd7c6,\n\t0xd7cb, 0xd7fb,\n\t0xd800, 0xfa2d,\n\t0xfa30, 0xfa6d,\n\t0xfa70, 0xfad9,\n\t0xfb00, 0xfb06,\n\t0xfb13, 0xfb17,\n\t0xfb1d, 0xfb36,\n\t0xfb38, 0xfb3c,\n\t0xfb3e, 0xfb3e,\n\t0xfb40, 0xfb41,\n\t0xfb43, 0xfb44,\n\t0xfb46, 0xfbb1,\n\t0xfbd3, 0xfd3f,\n\t0xfd50, 0xfd8f,\n\t0xfd92, 0xfdc7,\n\t0xfdd0, 0xfdfd,\n\t0xfe00, 0xfe19,\n\t0xfe20, 0xfe26,\n\t0xfe30, 0xfe52,\n\t0xfe54, 0xfe66,\n\t0xfe68, 0xfe6b,\n\t0xfe70, 0xfe74,\n\t0xfe76, 0xfefc,\n\t0xfeff, 0xfeff,\n\t0xff01, 0xffbe,\n\t0xffc2, 0xffc7,\n\t0xffca, 0xffcf,\n\t0xffd2, 0xffd7,\n\t0xffda, 0xffdc,\n\t0xffe0, 0xffe6,\n\t0xffe8, 0xffee,\n\t0xfff9, 0x1000b,\n\t0x1000d, 0x10026,\n\t0x10028, 0x1003a,\n\t0x1003c, 0x1003d,\n\t0x1003f, 0x1004d,\n\t0x10050, 0x1005d,\n\t0x10080, 0x100fa,\n\t0x10100, 0x10102,\n\t0x10107, 0x10133,\n\t0x10137, 0x1018a,\n\t0x10190, 0x1019b,\n\t0x101d0, 0x101fd,\n\t0x10280, 0x1029c,\n\t0x102a0, 0x102d0,\n\t0x10300, 0x1031e,\n\t0x10320, 0x10323,\n\t0x10330, 0x1034a,\n\t0x10380, 0x1039d,\n\t0x1039f, 0x103c3,\n\t0x103c8, 0x103d5,\n\t0x10400, 0x1049d,\n\t0x104a0, 0x104a9,\n\t0x10800, 0x10805,\n\t0x10808, 0x10808,\n\t0x1080a, 0x10835,\n\t0x10837, 0x10838,\n\t0x1083c, 0x1083c,\n\t0x1083f, 0x10855,\n\t0x10857, 0x1085f,\n\t0x10900, 0x1091b,\n\t0x1091f, 0x10939,\n\t0x1093f, 0x1093f,\n\t0x10a00, 0x10a03,\n\t0x10a05, 0x10a06,\n\t0x10a0c, 0x10a13,\n\t0x10a15, 0x10a17,\n\t0x10a19, 0x10a33,\n\t0x10a38, 0x10a3a,\n\t0x10a3f, 0x10a47,\n\t0x10a50, 0x10a58,\n\t0x10a60, 0x10a7f,\n\t0x10b00, 0x10b35,\n\t0x10b39, 0x10b55,\n\t0x10b58, 0x10b72,\n\t0x10b78, 0x10b7f,\n\t0x10c00, 0x10c48,\n\t0x10e60, 0x10e7e,\n\t0x11080, 0x110c1,\n\t0x12000, 0x1236e,\n\t0x12400, 0x12462,\n\t0x12470, 0x12473,\n\t0x13000, 0x1342e,\n\t0x1d000, 0x1d0f5,\n\t0x1d100, 0x1d126,\n\t0x1d129, 0x1d1dd,\n\t0x1d200, 0x1d245,\n\t0x1d300, 0x1d356,\n\t0x1d360, 0x1d371,\n\t0x1d400, 0x1d454,\n\t0x1d456, 0x1d49c,\n\t0x1d49e, 0x1d49f,\n\t0x1d4a2, 0x1d4a2,\n\t0x1d4a5, 0x1d4a6,\n\t0x1d4a9, 0x1d4ac,\n\t0x1d4ae, 0x1d4b9,\n\t0x1d4bb, 0x1d4bb,\n\t0x1d4bd, 0x1d4c3,\n\t0x1d4c5, 0x1d505,\n\t0x1d507, 0x1d50a,\n\t0x1d50d, 0x1d514,\n\t0x1d516, 0x1d51c,\n\t0x1d51e, 0x1d539,\n\t0x1d53b, 0x1d53e,\n\t0x1d540, 0x1d544,\n\t0x1d546, 0x1d546,\n\t0x1d54a, 0x1d550,\n\t0x1d552, 0x1d6a5,\n\t0x1d6a8, 0x1d7cb,\n\t0x1d7ce, 0x1d7ff,\n\t0x1f000, 0x1f02b,\n\t0x1f030, 0x1f093,\n\t0x1f100, 0x1f10a,\n\t0x1f110, 0x1f12e,\n\t0x1f131, 0x1f131,\n\t0x1f13d, 0x1f13d,\n\t0x1f13f, 0x1f13f,\n\t0x1f142, 0x1f142,\n\t0x1f146, 0x1f146,\n\t0x1f14a, 0x1f14e,\n\t0x1f157, 0x1f157,\n\t0x1f15f, 0x1f15f,\n\t0x1f179, 0x1f179,\n\t0x1f17b, 0x1f17c,\n\t0x1f17f, 0x1f17f,\n\t0x1f18a, 0x1f18d,\n\t0x1f190, 0x1f190,\n\t0x1f200, 0x1f200,\n\t0x1f210, 0x1f231,\n\t0x1f240, 0x1f248,\n\t0x1fffe, 0x2a6d6,\n\t0x2a700, 0x2b734,\n\t0x2f800, 0x2fa1d,\n\t0x2fffe, 0x2ffff,\n\t0x3fffe, 0x3ffff,\n\t0x4fffe, 0x4ffff,\n\t0x5fffe, 0x5ffff,\n\t0x6fffe, 0x6ffff,\n\t0x7fffe, 0x7ffff,\n\t0x8fffe, 0x8ffff,\n\t0x9fffe, 0x9ffff,\n\t0xafffe, 0xaffff,\n\t0xbfffe, 0xbffff,\n\t0xcfffe, 0xcffff,\n\t0xdfffe, 0xdffff,\n\t0xe0001, 0xe0001,\n\t0xe0020, 0xe007f,\n\t0xe0100, 0xe01ef,\n\t0xefffe, 0x10ffff,\n}; /* CR_Age_5_2 */\n\n/* 'Age_6_0': Derived Age 6.0 */\nstatic const OnigCodePoint CR_Age_6_0[] = {\n\t511,\n\t0x0000, 0x0377,\n\t0x037a, 0x037e,\n\t0x0384, 0x038a,\n\t0x038c, 0x038c,\n\t0x038e, 0x03a1,\n\t0x03a3, 0x0527,\n\t0x0531, 0x0556,\n\t0x0559, 0x055f,\n\t0x0561, 0x0587,\n\t0x0589, 0x058a,\n\t0x0591, 0x05c7,\n\t0x05d0, 0x05ea,\n\t0x05f0, 0x05f4,\n\t0x0600, 0x0603,\n\t0x0606, 0x061b,\n\t0x061e, 0x070d,\n\t0x070f, 0x074a,\n\t0x074d, 0x07b1,\n\t0x07c0, 0x07fa,\n\t0x0800, 0x082d,\n\t0x0830, 0x083e,\n\t0x0840, 0x085b,\n\t0x085e, 0x085e,\n\t0x0900, 0x0977,\n\t0x0979, 0x097f,\n\t0x0981, 0x0983,\n\t0x0985, 0x098c,\n\t0x098f, 0x0990,\n\t0x0993, 0x09a8,\n\t0x09aa, 0x09b0,\n\t0x09b2, 0x09b2,\n\t0x09b6, 0x09b9,\n\t0x09bc, 0x09c4,\n\t0x09c7, 0x09c8,\n\t0x09cb, 0x09ce,\n\t0x09d7, 0x09d7,\n\t0x09dc, 0x09dd,\n\t0x09df, 0x09e3,\n\t0x09e6, 0x09fb,\n\t0x0a01, 0x0a03,\n\t0x0a05, 0x0a0a,\n\t0x0a0f, 0x0a10,\n\t0x0a13, 0x0a28,\n\t0x0a2a, 0x0a30,\n\t0x0a32, 0x0a33,\n\t0x0a35, 0x0a36,\n\t0x0a38, 0x0a39,\n\t0x0a3c, 0x0a3c,\n\t0x0a3e, 0x0a42,\n\t0x0a47, 0x0a48,\n\t0x0a4b, 0x0a4d,\n\t0x0a51, 0x0a51,\n\t0x0a59, 0x0a5c,\n\t0x0a5e, 0x0a5e,\n\t0x0a66, 0x0a75,\n\t0x0a81, 0x0a83,\n\t0x0a85, 0x0a8d,\n\t0x0a8f, 0x0a91,\n\t0x0a93, 0x0aa8,\n\t0x0aaa, 0x0ab0,\n\t0x0ab2, 0x0ab3,\n\t0x0ab5, 0x0ab9,\n\t0x0abc, 0x0ac5,\n\t0x0ac7, 0x0ac9,\n\t0x0acb, 0x0acd,\n\t0x0ad0, 0x0ad0,\n\t0x0ae0, 0x0ae3,\n\t0x0ae6, 0x0aef,\n\t0x0af1, 0x0af1,\n\t0x0b01, 0x0b03,\n\t0x0b05, 0x0b0c,\n\t0x0b0f, 0x0b10,\n\t0x0b13, 0x0b28,\n\t0x0b2a, 0x0b30,\n\t0x0b32, 0x0b33,\n\t0x0b35, 0x0b39,\n\t0x0b3c, 0x0b44,\n\t0x0b47, 0x0b48,\n\t0x0b4b, 0x0b4d,\n\t0x0b56, 0x0b57,\n\t0x0b5c, 0x0b5d,\n\t0x0b5f, 0x0b63,\n\t0x0b66, 0x0b77,\n\t0x0b82, 0x0b83,\n\t0x0b85, 0x0b8a,\n\t0x0b8e, 0x0b90,\n\t0x0b92, 0x0b95,\n\t0x0b99, 0x0b9a,\n\t0x0b9c, 0x0b9c,\n\t0x0b9e, 0x0b9f,\n\t0x0ba3, 0x0ba4,\n\t0x0ba8, 0x0baa,\n\t0x0bae, 0x0bb9,\n\t0x0bbe, 0x0bc2,\n\t0x0bc6, 0x0bc8,\n\t0x0bca, 0x0bcd,\n\t0x0bd0, 0x0bd0,\n\t0x0bd7, 0x0bd7,\n\t0x0be6, 0x0bfa,\n\t0x0c01, 0x0c03,\n\t0x0c05, 0x0c0c,\n\t0x0c0e, 0x0c10,\n\t0x0c12, 0x0c28,\n\t0x0c2a, 0x0c33,\n\t0x0c35, 0x0c39,\n\t0x0c3d, 0x0c44,\n\t0x0c46, 0x0c48,\n\t0x0c4a, 0x0c4d,\n\t0x0c55, 0x0c56,\n\t0x0c58, 0x0c59,\n\t0x0c60, 0x0c63,\n\t0x0c66, 0x0c6f,\n\t0x0c78, 0x0c7f,\n\t0x0c82, 0x0c83,\n\t0x0c85, 0x0c8c,\n\t0x0c8e, 0x0c90,\n\t0x0c92, 0x0ca8,\n\t0x0caa, 0x0cb3,\n\t0x0cb5, 0x0cb9,\n\t0x0cbc, 0x0cc4,\n\t0x0cc6, 0x0cc8,\n\t0x0cca, 0x0ccd,\n\t0x0cd5, 0x0cd6,\n\t0x0cde, 0x0cde,\n\t0x0ce0, 0x0ce3,\n\t0x0ce6, 0x0cef,\n\t0x0cf1, 0x0cf2,\n\t0x0d02, 0x0d03,\n\t0x0d05, 0x0d0c,\n\t0x0d0e, 0x0d10,\n\t0x0d12, 0x0d3a,\n\t0x0d3d, 0x0d44,\n\t0x0d46, 0x0d48,\n\t0x0d4a, 0x0d4e,\n\t0x0d57, 0x0d57,\n\t0x0d60, 0x0d63,\n\t0x0d66, 0x0d75,\n\t0x0d79, 0x0d7f,\n\t0x0d82, 0x0d83,\n\t0x0d85, 0x0d96,\n\t0x0d9a, 0x0db1,\n\t0x0db3, 0x0dbb,\n\t0x0dbd, 0x0dbd,\n\t0x0dc0, 0x0dc6,\n\t0x0dca, 0x0dca,\n\t0x0dcf, 0x0dd4,\n\t0x0dd6, 0x0dd6,\n\t0x0dd8, 0x0ddf,\n\t0x0df2, 0x0df4,\n\t0x0e01, 0x0e3a,\n\t0x0e3f, 0x0e5b,\n\t0x0e81, 0x0e82,\n\t0x0e84, 0x0e84,\n\t0x0e87, 0x0e88,\n\t0x0e8a, 0x0e8a,\n\t0x0e8d, 0x0e8d,\n\t0x0e94, 0x0e97,\n\t0x0e99, 0x0e9f,\n\t0x0ea1, 0x0ea3,\n\t0x0ea5, 0x0ea5,\n\t0x0ea7, 0x0ea7,\n\t0x0eaa, 0x0eab,\n\t0x0ead, 0x0eb9,\n\t0x0ebb, 0x0ebd,\n\t0x0ec0, 0x0ec4,\n\t0x0ec6, 0x0ec6,\n\t0x0ec8, 0x0ecd,\n\t0x0ed0, 0x0ed9,\n\t0x0edc, 0x0edd,\n\t0x0f00, 0x0f47,\n\t0x0f49, 0x0f6c,\n\t0x0f71, 0x0f97,\n\t0x0f99, 0x0fbc,\n\t0x0fbe, 0x0fcc,\n\t0x0fce, 0x0fda,\n\t0x1000, 0x10c5,\n\t0x10d0, 0x10fc,\n\t0x1100, 0x1248,\n\t0x124a, 0x124d,\n\t0x1250, 0x1256,\n\t0x1258, 0x1258,\n\t0x125a, 0x125d,\n\t0x1260, 0x1288,\n\t0x128a, 0x128d,\n\t0x1290, 0x12b0,\n\t0x12b2, 0x12b5,\n\t0x12b8, 0x12be,\n\t0x12c0, 0x12c0,\n\t0x12c2, 0x12c5,\n\t0x12c8, 0x12d6,\n\t0x12d8, 0x1310,\n\t0x1312, 0x1315,\n\t0x1318, 0x135a,\n\t0x135d, 0x137c,\n\t0x1380, 0x1399,\n\t0x13a0, 0x13f4,\n\t0x1400, 0x169c,\n\t0x16a0, 0x16f0,\n\t0x1700, 0x170c,\n\t0x170e, 0x1714,\n\t0x1720, 0x1736,\n\t0x1740, 0x1753,\n\t0x1760, 0x176c,\n\t0x176e, 0x1770,\n\t0x1772, 0x1773,\n\t0x1780, 0x17dd,\n\t0x17e0, 0x17e9,\n\t0x17f0, 0x17f9,\n\t0x1800, 0x180e,\n\t0x1810, 0x1819,\n\t0x1820, 0x1877,\n\t0x1880, 0x18aa,\n\t0x18b0, 0x18f5,\n\t0x1900, 0x191c,\n\t0x1920, 0x192b,\n\t0x1930, 0x193b,\n\t0x1940, 0x1940,\n\t0x1944, 0x196d,\n\t0x1970, 0x1974,\n\t0x1980, 0x19ab,\n\t0x19b0, 0x19c9,\n\t0x19d0, 0x19da,\n\t0x19de, 0x1a1b,\n\t0x1a1e, 0x1a5e,\n\t0x1a60, 0x1a7c,\n\t0x1a7f, 0x1a89,\n\t0x1a90, 0x1a99,\n\t0x1aa0, 0x1aad,\n\t0x1b00, 0x1b4b,\n\t0x1b50, 0x1b7c,\n\t0x1b80, 0x1baa,\n\t0x1bae, 0x1bb9,\n\t0x1bc0, 0x1bf3,\n\t0x1bfc, 0x1c37,\n\t0x1c3b, 0x1c49,\n\t0x1c4d, 0x1c7f,\n\t0x1cd0, 0x1cf2,\n\t0x1d00, 0x1de6,\n\t0x1dfc, 0x1f15,\n\t0x1f18, 0x1f1d,\n\t0x1f20, 0x1f45,\n\t0x1f48, 0x1f4d,\n\t0x1f50, 0x1f57,\n\t0x1f59, 0x1f59,\n\t0x1f5b, 0x1f5b,\n\t0x1f5d, 0x1f5d,\n\t0x1f5f, 0x1f7d,\n\t0x1f80, 0x1fb4,\n\t0x1fb6, 0x1fc4,\n\t0x1fc6, 0x1fd3,\n\t0x1fd6, 0x1fdb,\n\t0x1fdd, 0x1fef,\n\t0x1ff2, 0x1ff4,\n\t0x1ff6, 0x1ffe,\n\t0x2000, 0x2064,\n\t0x206a, 0x2071,\n\t0x2074, 0x208e,\n\t0x2090, 0x209c,\n\t0x20a0, 0x20b9,\n\t0x20d0, 0x20f0,\n\t0x2100, 0x2189,\n\t0x2190, 0x23f3,\n\t0x2400, 0x2426,\n\t0x2440, 0x244a,\n\t0x2460, 0x26ff,\n\t0x2701, 0x27ca,\n\t0x27cc, 0x27cc,\n\t0x27ce, 0x2b4c,\n\t0x2b50, 0x2b59,\n\t0x2c00, 0x2c2e,\n\t0x2c30, 0x2c5e,\n\t0x2c60, 0x2cf1,\n\t0x2cf9, 0x2d25,\n\t0x2d30, 0x2d65,\n\t0x2d6f, 0x2d70,\n\t0x2d7f, 0x2d96,\n\t0x2da0, 0x2da6,\n\t0x2da8, 0x2dae,\n\t0x2db0, 0x2db6,\n\t0x2db8, 0x2dbe,\n\t0x2dc0, 0x2dc6,\n\t0x2dc8, 0x2dce,\n\t0x2dd0, 0x2dd6,\n\t0x2dd8, 0x2dde,\n\t0x2de0, 0x2e31,\n\t0x2e80, 0x2e99,\n\t0x2e9b, 0x2ef3,\n\t0x2f00, 0x2fd5,\n\t0x2ff0, 0x2ffb,\n\t0x3000, 0x303f,\n\t0x3041, 0x3096,\n\t0x3099, 0x30ff,\n\t0x3105, 0x312d,\n\t0x3131, 0x318e,\n\t0x3190, 0x31ba,\n\t0x31c0, 0x31e3,\n\t0x31f0, 0x321e,\n\t0x3220, 0x32fe,\n\t0x3300, 0x4db5,\n\t0x4dc0, 0x9fcb,\n\t0xa000, 0xa48c,\n\t0xa490, 0xa4c6,\n\t0xa4d0, 0xa62b,\n\t0xa640, 0xa673,\n\t0xa67c, 0xa697,\n\t0xa6a0, 0xa6f7,\n\t0xa700, 0xa78e,\n\t0xa790, 0xa791,\n\t0xa7a0, 0xa7a9,\n\t0xa7fa, 0xa82b,\n\t0xa830, 0xa839,\n\t0xa840, 0xa877,\n\t0xa880, 0xa8c4,\n\t0xa8ce, 0xa8d9,\n\t0xa8e0, 0xa8fb,\n\t0xa900, 0xa953,\n\t0xa95f, 0xa97c,\n\t0xa980, 0xa9cd,\n\t0xa9cf, 0xa9d9,\n\t0xa9de, 0xa9df,\n\t0xaa00, 0xaa36,\n\t0xaa40, 0xaa4d,\n\t0xaa50, 0xaa59,\n\t0xaa5c, 0xaa7b,\n\t0xaa80, 0xaac2,\n\t0xaadb, 0xaadf,\n\t0xab01, 0xab06,\n\t0xab09, 0xab0e,\n\t0xab11, 0xab16,\n\t0xab20, 0xab26,\n\t0xab28, 0xab2e,\n\t0xabc0, 0xabed,\n\t0xabf0, 0xabf9,\n\t0xac00, 0xd7a3,\n\t0xd7b0, 0xd7c6,\n\t0xd7cb, 0xd7fb,\n\t0xd800, 0xfa2d,\n\t0xfa30, 0xfa6d,\n\t0xfa70, 0xfad9,\n\t0xfb00, 0xfb06,\n\t0xfb13, 0xfb17,\n\t0xfb1d, 0xfb36,\n\t0xfb38, 0xfb3c,\n\t0xfb3e, 0xfb3e,\n\t0xfb40, 0xfb41,\n\t0xfb43, 0xfb44,\n\t0xfb46, 0xfbc1,\n\t0xfbd3, 0xfd3f,\n\t0xfd50, 0xfd8f,\n\t0xfd92, 0xfdc7,\n\t0xfdd0, 0xfdfd,\n\t0xfe00, 0xfe19,\n\t0xfe20, 0xfe26,\n\t0xfe30, 0xfe52,\n\t0xfe54, 0xfe66,\n\t0xfe68, 0xfe6b,\n\t0xfe70, 0xfe74,\n\t0xfe76, 0xfefc,\n\t0xfeff, 0xfeff,\n\t0xff01, 0xffbe,\n\t0xffc2, 0xffc7,\n\t0xffca, 0xffcf,\n\t0xffd2, 0xffd7,\n\t0xffda, 0xffdc,\n\t0xffe0, 0xffe6,\n\t0xffe8, 0xffee,\n\t0xfff9, 0x1000b,\n\t0x1000d, 0x10026,\n\t0x10028, 0x1003a,\n\t0x1003c, 0x1003d,\n\t0x1003f, 0x1004d,\n\t0x10050, 0x1005d,\n\t0x10080, 0x100fa,\n\t0x10100, 0x10102,\n\t0x10107, 0x10133,\n\t0x10137, 0x1018a,\n\t0x10190, 0x1019b,\n\t0x101d0, 0x101fd,\n\t0x10280, 0x1029c,\n\t0x102a0, 0x102d0,\n\t0x10300, 0x1031e,\n\t0x10320, 0x10323,\n\t0x10330, 0x1034a,\n\t0x10380, 0x1039d,\n\t0x1039f, 0x103c3,\n\t0x103c8, 0x103d5,\n\t0x10400, 0x1049d,\n\t0x104a0, 0x104a9,\n\t0x10800, 0x10805,\n\t0x10808, 0x10808,\n\t0x1080a, 0x10835,\n\t0x10837, 0x10838,\n\t0x1083c, 0x1083c,\n\t0x1083f, 0x10855,\n\t0x10857, 0x1085f,\n\t0x10900, 0x1091b,\n\t0x1091f, 0x10939,\n\t0x1093f, 0x1093f,\n\t0x10a00, 0x10a03,\n\t0x10a05, 0x10a06,\n\t0x10a0c, 0x10a13,\n\t0x10a15, 0x10a17,\n\t0x10a19, 0x10a33,\n\t0x10a38, 0x10a3a,\n\t0x10a3f, 0x10a47,\n\t0x10a50, 0x10a58,\n\t0x10a60, 0x10a7f,\n\t0x10b00, 0x10b35,\n\t0x10b39, 0x10b55,\n\t0x10b58, 0x10b72,\n\t0x10b78, 0x10b7f,\n\t0x10c00, 0x10c48,\n\t0x10e60, 0x10e7e,\n\t0x11000, 0x1104d,\n\t0x11052, 0x1106f,\n\t0x11080, 0x110c1,\n\t0x12000, 0x1236e,\n\t0x12400, 0x12462,\n\t0x12470, 0x12473,\n\t0x13000, 0x1342e,\n\t0x16800, 0x16a38,\n\t0x1b000, 0x1b001,\n\t0x1d000, 0x1d0f5,\n\t0x1d100, 0x1d126,\n\t0x1d129, 0x1d1dd,\n\t0x1d200, 0x1d245,\n\t0x1d300, 0x1d356,\n\t0x1d360, 0x1d371,\n\t0x1d400, 0x1d454,\n\t0x1d456, 0x1d49c,\n\t0x1d49e, 0x1d49f,\n\t0x1d4a2, 0x1d4a2,\n\t0x1d4a5, 0x1d4a6,\n\t0x1d4a9, 0x1d4ac,\n\t0x1d4ae, 0x1d4b9,\n\t0x1d4bb, 0x1d4bb,\n\t0x1d4bd, 0x1d4c3,\n\t0x1d4c5, 0x1d505,\n\t0x1d507, 0x1d50a,\n\t0x1d50d, 0x1d514,\n\t0x1d516, 0x1d51c,\n\t0x1d51e, 0x1d539,\n\t0x1d53b, 0x1d53e,\n\t0x1d540, 0x1d544,\n\t0x1d546, 0x1d546,\n\t0x1d54a, 0x1d550,\n\t0x1d552, 0x1d6a5,\n\t0x1d6a8, 0x1d7cb,\n\t0x1d7ce, 0x1d7ff,\n\t0x1f000, 0x1f02b,\n\t0x1f030, 0x1f093,\n\t0x1f0a0, 0x1f0ae,\n\t0x1f0b1, 0x1f0be,\n\t0x1f0c1, 0x1f0cf,\n\t0x1f0d1, 0x1f0df,\n\t0x1f100, 0x1f10a,\n\t0x1f110, 0x1f12e,\n\t0x1f130, 0x1f169,\n\t0x1f170, 0x1f19a,\n\t0x1f1e6, 0x1f202,\n\t0x1f210, 0x1f23a,\n\t0x1f240, 0x1f248,\n\t0x1f250, 0x1f251,\n\t0x1f300, 0x1f320,\n\t0x1f330, 0x1f335,\n\t0x1f337, 0x1f37c,\n\t0x1f380, 0x1f393,\n\t0x1f3a0, 0x1f3c4,\n\t0x1f3c6, 0x1f3ca,\n\t0x1f3e0, 0x1f3f0,\n\t0x1f400, 0x1f43e,\n\t0x1f440, 0x1f440,\n\t0x1f442, 0x1f4f7,\n\t0x1f4f9, 0x1f4fc,\n\t0x1f500, 0x1f53d,\n\t0x1f550, 0x1f567,\n\t0x1f5fb, 0x1f5ff,\n\t0x1f601, 0x1f610,\n\t0x1f612, 0x1f614,\n\t0x1f616, 0x1f616,\n\t0x1f618, 0x1f618,\n\t0x1f61a, 0x1f61a,\n\t0x1f61c, 0x1f61e,\n\t0x1f620, 0x1f625,\n\t0x1f628, 0x1f62b,\n\t0x1f62d, 0x1f62d,\n\t0x1f630, 0x1f633,\n\t0x1f635, 0x1f640,\n\t0x1f645, 0x1f64f,\n\t0x1f680, 0x1f6c5,\n\t0x1f700, 0x1f773,\n\t0x1fffe, 0x2a6d6,\n\t0x2a700, 0x2b734,\n\t0x2b740, 0x2b81d,\n\t0x2f800, 0x2fa1d,\n\t0x2fffe, 0x2ffff,\n\t0x3fffe, 0x3ffff,\n\t0x4fffe, 0x4ffff,\n\t0x5fffe, 0x5ffff,\n\t0x6fffe, 0x6ffff,\n\t0x7fffe, 0x7ffff,\n\t0x8fffe, 0x8ffff,\n\t0x9fffe, 0x9ffff,\n\t0xafffe, 0xaffff,\n\t0xbfffe, 0xbffff,\n\t0xcfffe, 0xcffff,\n\t0xdfffe, 0xdffff,\n\t0xe0001, 0xe0001,\n\t0xe0020, 0xe007f,\n\t0xe0100, 0xe01ef,\n\t0xefffe, 0x10ffff,\n}; /* CR_Age_6_0 */\n\n/* 'Age_6_1': Derived Age 6.1 */\nstatic const OnigCodePoint CR_Age_6_1[] = {\n\t549,\n\t0x0000, 0x0377,\n\t0x037a, 0x037e,\n\t0x0384, 0x038a,\n\t0x038c, 0x038c,\n\t0x038e, 0x03a1,\n\t0x03a3, 0x0527,\n\t0x0531, 0x0556,\n\t0x0559, 0x055f,\n\t0x0561, 0x0587,\n\t0x0589, 0x058a,\n\t0x058f, 0x058f,\n\t0x0591, 0x05c7,\n\t0x05d0, 0x05ea,\n\t0x05f0, 0x05f4,\n\t0x0600, 0x0604,\n\t0x0606, 0x061b,\n\t0x061e, 0x070d,\n\t0x070f, 0x074a,\n\t0x074d, 0x07b1,\n\t0x07c0, 0x07fa,\n\t0x0800, 0x082d,\n\t0x0830, 0x083e,\n\t0x0840, 0x085b,\n\t0x085e, 0x085e,\n\t0x08a0, 0x08a0,\n\t0x08a2, 0x08ac,\n\t0x08e4, 0x08fe,\n\t0x0900, 0x0977,\n\t0x0979, 0x097f,\n\t0x0981, 0x0983,\n\t0x0985, 0x098c,\n\t0x098f, 0x0990,\n\t0x0993, 0x09a8,\n\t0x09aa, 0x09b0,\n\t0x09b2, 0x09b2,\n\t0x09b6, 0x09b9,\n\t0x09bc, 0x09c4,\n\t0x09c7, 0x09c8,\n\t0x09cb, 0x09ce,\n\t0x09d7, 0x09d7,\n\t0x09dc, 0x09dd,\n\t0x09df, 0x09e3,\n\t0x09e6, 0x09fb,\n\t0x0a01, 0x0a03,\n\t0x0a05, 0x0a0a,\n\t0x0a0f, 0x0a10,\n\t0x0a13, 0x0a28,\n\t0x0a2a, 0x0a30,\n\t0x0a32, 0x0a33,\n\t0x0a35, 0x0a36,\n\t0x0a38, 0x0a39,\n\t0x0a3c, 0x0a3c,\n\t0x0a3e, 0x0a42,\n\t0x0a47, 0x0a48,\n\t0x0a4b, 0x0a4d,\n\t0x0a51, 0x0a51,\n\t0x0a59, 0x0a5c,\n\t0x0a5e, 0x0a5e,\n\t0x0a66, 0x0a75,\n\t0x0a81, 0x0a83,\n\t0x0a85, 0x0a8d,\n\t0x0a8f, 0x0a91,\n\t0x0a93, 0x0aa8,\n\t0x0aaa, 0x0ab0,\n\t0x0ab2, 0x0ab3,\n\t0x0ab5, 0x0ab9,\n\t0x0abc, 0x0ac5,\n\t0x0ac7, 0x0ac9,\n\t0x0acb, 0x0acd,\n\t0x0ad0, 0x0ad0,\n\t0x0ae0, 0x0ae3,\n\t0x0ae6, 0x0af1,\n\t0x0b01, 0x0b03,\n\t0x0b05, 0x0b0c,\n\t0x0b0f, 0x0b10,\n\t0x0b13, 0x0b28,\n\t0x0b2a, 0x0b30,\n\t0x0b32, 0x0b33,\n\t0x0b35, 0x0b39,\n\t0x0b3c, 0x0b44,\n\t0x0b47, 0x0b48,\n\t0x0b4b, 0x0b4d,\n\t0x0b56, 0x0b57,\n\t0x0b5c, 0x0b5d,\n\t0x0b5f, 0x0b63,\n\t0x0b66, 0x0b77,\n\t0x0b82, 0x0b83,\n\t0x0b85, 0x0b8a,\n\t0x0b8e, 0x0b90,\n\t0x0b92, 0x0b95,\n\t0x0b99, 0x0b9a,\n\t0x0b9c, 0x0b9c,\n\t0x0b9e, 0x0b9f,\n\t0x0ba3, 0x0ba4,\n\t0x0ba8, 0x0baa,\n\t0x0bae, 0x0bb9,\n\t0x0bbe, 0x0bc2,\n\t0x0bc6, 0x0bc8,\n\t0x0bca, 0x0bcd,\n\t0x0bd0, 0x0bd0,\n\t0x0bd7, 0x0bd7,\n\t0x0be6, 0x0bfa,\n\t0x0c01, 0x0c03,\n\t0x0c05, 0x0c0c,\n\t0x0c0e, 0x0c10,\n\t0x0c12, 0x0c28,\n\t0x0c2a, 0x0c33,\n\t0x0c35, 0x0c39,\n\t0x0c3d, 0x0c44,\n\t0x0c46, 0x0c48,\n\t0x0c4a, 0x0c4d,\n\t0x0c55, 0x0c56,\n\t0x0c58, 0x0c59,\n\t0x0c60, 0x0c63,\n\t0x0c66, 0x0c6f,\n\t0x0c78, 0x0c7f,\n\t0x0c82, 0x0c83,\n\t0x0c85, 0x0c8c,\n\t0x0c8e, 0x0c90,\n\t0x0c92, 0x0ca8,\n\t0x0caa, 0x0cb3,\n\t0x0cb5, 0x0cb9,\n\t0x0cbc, 0x0cc4,\n\t0x0cc6, 0x0cc8,\n\t0x0cca, 0x0ccd,\n\t0x0cd5, 0x0cd6,\n\t0x0cde, 0x0cde,\n\t0x0ce0, 0x0ce3,\n\t0x0ce6, 0x0cef,\n\t0x0cf1, 0x0cf2,\n\t0x0d02, 0x0d03,\n\t0x0d05, 0x0d0c,\n\t0x0d0e, 0x0d10,\n\t0x0d12, 0x0d3a,\n\t0x0d3d, 0x0d44,\n\t0x0d46, 0x0d48,\n\t0x0d4a, 0x0d4e,\n\t0x0d57, 0x0d57,\n\t0x0d60, 0x0d63,\n\t0x0d66, 0x0d75,\n\t0x0d79, 0x0d7f,\n\t0x0d82, 0x0d83,\n\t0x0d85, 0x0d96,\n\t0x0d9a, 0x0db1,\n\t0x0db3, 0x0dbb,\n\t0x0dbd, 0x0dbd,\n\t0x0dc0, 0x0dc6,\n\t0x0dca, 0x0dca,\n\t0x0dcf, 0x0dd4,\n\t0x0dd6, 0x0dd6,\n\t0x0dd8, 0x0ddf,\n\t0x0df2, 0x0df4,\n\t0x0e01, 0x0e3a,\n\t0x0e3f, 0x0e5b,\n\t0x0e81, 0x0e82,\n\t0x0e84, 0x0e84,\n\t0x0e87, 0x0e88,\n\t0x0e8a, 0x0e8a,\n\t0x0e8d, 0x0e8d,\n\t0x0e94, 0x0e97,\n\t0x0e99, 0x0e9f,\n\t0x0ea1, 0x0ea3,\n\t0x0ea5, 0x0ea5,\n\t0x0ea7, 0x0ea7,\n\t0x0eaa, 0x0eab,\n\t0x0ead, 0x0eb9,\n\t0x0ebb, 0x0ebd,\n\t0x0ec0, 0x0ec4,\n\t0x0ec6, 0x0ec6,\n\t0x0ec8, 0x0ecd,\n\t0x0ed0, 0x0ed9,\n\t0x0edc, 0x0edf,\n\t0x0f00, 0x0f47,\n\t0x0f49, 0x0f6c,\n\t0x0f71, 0x0f97,\n\t0x0f99, 0x0fbc,\n\t0x0fbe, 0x0fcc,\n\t0x0fce, 0x0fda,\n\t0x1000, 0x10c5,\n\t0x10c7, 0x10c7,\n\t0x10cd, 0x10cd,\n\t0x10d0, 0x1248,\n\t0x124a, 0x124d,\n\t0x1250, 0x1256,\n\t0x1258, 0x1258,\n\t0x125a, 0x125d,\n\t0x1260, 0x1288,\n\t0x128a, 0x128d,\n\t0x1290, 0x12b0,\n\t0x12b2, 0x12b5,\n\t0x12b8, 0x12be,\n\t0x12c0, 0x12c0,\n\t0x12c2, 0x12c5,\n\t0x12c8, 0x12d6,\n\t0x12d8, 0x1310,\n\t0x1312, 0x1315,\n\t0x1318, 0x135a,\n\t0x135d, 0x137c,\n\t0x1380, 0x1399,\n\t0x13a0, 0x13f4,\n\t0x1400, 0x169c,\n\t0x16a0, 0x16f0,\n\t0x1700, 0x170c,\n\t0x170e, 0x1714,\n\t0x1720, 0x1736,\n\t0x1740, 0x1753,\n\t0x1760, 0x176c,\n\t0x176e, 0x1770,\n\t0x1772, 0x1773,\n\t0x1780, 0x17dd,\n\t0x17e0, 0x17e9,\n\t0x17f0, 0x17f9,\n\t0x1800, 0x180e,\n\t0x1810, 0x1819,\n\t0x1820, 0x1877,\n\t0x1880, 0x18aa,\n\t0x18b0, 0x18f5,\n\t0x1900, 0x191c,\n\t0x1920, 0x192b,\n\t0x1930, 0x193b,\n\t0x1940, 0x1940,\n\t0x1944, 0x196d,\n\t0x1970, 0x1974,\n\t0x1980, 0x19ab,\n\t0x19b0, 0x19c9,\n\t0x19d0, 0x19da,\n\t0x19de, 0x1a1b,\n\t0x1a1e, 0x1a5e,\n\t0x1a60, 0x1a7c,\n\t0x1a7f, 0x1a89,\n\t0x1a90, 0x1a99,\n\t0x1aa0, 0x1aad,\n\t0x1b00, 0x1b4b,\n\t0x1b50, 0x1b7c,\n\t0x1b80, 0x1bf3,\n\t0x1bfc, 0x1c37,\n\t0x1c3b, 0x1c49,\n\t0x1c4d, 0x1c7f,\n\t0x1cc0, 0x1cc7,\n\t0x1cd0, 0x1cf6,\n\t0x1d00, 0x1de6,\n\t0x1dfc, 0x1f15,\n\t0x1f18, 0x1f1d,\n\t0x1f20, 0x1f45,\n\t0x1f48, 0x1f4d,\n\t0x1f50, 0x1f57,\n\t0x1f59, 0x1f59,\n\t0x1f5b, 0x1f5b,\n\t0x1f5d, 0x1f5d,\n\t0x1f5f, 0x1f7d,\n\t0x1f80, 0x1fb4,\n\t0x1fb6, 0x1fc4,\n\t0x1fc6, 0x1fd3,\n\t0x1fd6, 0x1fdb,\n\t0x1fdd, 0x1fef,\n\t0x1ff2, 0x1ff4,\n\t0x1ff6, 0x1ffe,\n\t0x2000, 0x2064,\n\t0x206a, 0x2071,\n\t0x2074, 0x208e,\n\t0x2090, 0x209c,\n\t0x20a0, 0x20b9,\n\t0x20d0, 0x20f0,\n\t0x2100, 0x2189,\n\t0x2190, 0x23f3,\n\t0x2400, 0x2426,\n\t0x2440, 0x244a,\n\t0x2460, 0x26ff,\n\t0x2701, 0x2b4c,\n\t0x2b50, 0x2b59,\n\t0x2c00, 0x2c2e,\n\t0x2c30, 0x2c5e,\n\t0x2c60, 0x2cf3,\n\t0x2cf9, 0x2d25,\n\t0x2d27, 0x2d27,\n\t0x2d2d, 0x2d2d,\n\t0x2d30, 0x2d67,\n\t0x2d6f, 0x2d70,\n\t0x2d7f, 0x2d96,\n\t0x2da0, 0x2da6,\n\t0x2da8, 0x2dae,\n\t0x2db0, 0x2db6,\n\t0x2db8, 0x2dbe,\n\t0x2dc0, 0x2dc6,\n\t0x2dc8, 0x2dce,\n\t0x2dd0, 0x2dd6,\n\t0x2dd8, 0x2dde,\n\t0x2de0, 0x2e3b,\n\t0x2e80, 0x2e99,\n\t0x2e9b, 0x2ef3,\n\t0x2f00, 0x2fd5,\n\t0x2ff0, 0x2ffb,\n\t0x3000, 0x303f,\n\t0x3041, 0x3096,\n\t0x3099, 0x30ff,\n\t0x3105, 0x312d,\n\t0x3131, 0x318e,\n\t0x3190, 0x31ba,\n\t0x31c0, 0x31e3,\n\t0x31f0, 0x321e,\n\t0x3220, 0x32fe,\n\t0x3300, 0x4db5,\n\t0x4dc0, 0x9fcc,\n\t0xa000, 0xa48c,\n\t0xa490, 0xa4c6,\n\t0xa4d0, 0xa62b,\n\t0xa640, 0xa697,\n\t0xa69f, 0xa6f7,\n\t0xa700, 0xa78e,\n\t0xa790, 0xa793,\n\t0xa7a0, 0xa7aa,\n\t0xa7f8, 0xa82b,\n\t0xa830, 0xa839,\n\t0xa840, 0xa877,\n\t0xa880, 0xa8c4,\n\t0xa8ce, 0xa8d9,\n\t0xa8e0, 0xa8fb,\n\t0xa900, 0xa953,\n\t0xa95f, 0xa97c,\n\t0xa980, 0xa9cd,\n\t0xa9cf, 0xa9d9,\n\t0xa9de, 0xa9df,\n\t0xaa00, 0xaa36,\n\t0xaa40, 0xaa4d,\n\t0xaa50, 0xaa59,\n\t0xaa5c, 0xaa7b,\n\t0xaa80, 0xaac2,\n\t0xaadb, 0xaaf6,\n\t0xab01, 0xab06,\n\t0xab09, 0xab0e,\n\t0xab11, 0xab16,\n\t0xab20, 0xab26,\n\t0xab28, 0xab2e,\n\t0xabc0, 0xabed,\n\t0xabf0, 0xabf9,\n\t0xac00, 0xd7a3,\n\t0xd7b0, 0xd7c6,\n\t0xd7cb, 0xd7fb,\n\t0xd800, 0xfa6d,\n\t0xfa70, 0xfad9,\n\t0xfb00, 0xfb06,\n\t0xfb13, 0xfb17,\n\t0xfb1d, 0xfb36,\n\t0xfb38, 0xfb3c,\n\t0xfb3e, 0xfb3e,\n\t0xfb40, 0xfb41,\n\t0xfb43, 0xfb44,\n\t0xfb46, 0xfbc1,\n\t0xfbd3, 0xfd3f,\n\t0xfd50, 0xfd8f,\n\t0xfd92, 0xfdc7,\n\t0xfdd0, 0xfdfd,\n\t0xfe00, 0xfe19,\n\t0xfe20, 0xfe26,\n\t0xfe30, 0xfe52,\n\t0xfe54, 0xfe66,\n\t0xfe68, 0xfe6b,\n\t0xfe70, 0xfe74,\n\t0xfe76, 0xfefc,\n\t0xfeff, 0xfeff,\n\t0xff01, 0xffbe,\n\t0xffc2, 0xffc7,\n\t0xffca, 0xffcf,\n\t0xffd2, 0xffd7,\n\t0xffda, 0xffdc,\n\t0xffe0, 0xffe6,\n\t0xffe8, 0xffee,\n\t0xfff9, 0x1000b,\n\t0x1000d, 0x10026,\n\t0x10028, 0x1003a,\n\t0x1003c, 0x1003d,\n\t0x1003f, 0x1004d,\n\t0x10050, 0x1005d,\n\t0x10080, 0x100fa,\n\t0x10100, 0x10102,\n\t0x10107, 0x10133,\n\t0x10137, 0x1018a,\n\t0x10190, 0x1019b,\n\t0x101d0, 0x101fd,\n\t0x10280, 0x1029c,\n\t0x102a0, 0x102d0,\n\t0x10300, 0x1031e,\n\t0x10320, 0x10323,\n\t0x10330, 0x1034a,\n\t0x10380, 0x1039d,\n\t0x1039f, 0x103c3,\n\t0x103c8, 0x103d5,\n\t0x10400, 0x1049d,\n\t0x104a0, 0x104a9,\n\t0x10800, 0x10805,\n\t0x10808, 0x10808,\n\t0x1080a, 0x10835,\n\t0x10837, 0x10838,\n\t0x1083c, 0x1083c,\n\t0x1083f, 0x10855,\n\t0x10857, 0x1085f,\n\t0x10900, 0x1091b,\n\t0x1091f, 0x10939,\n\t0x1093f, 0x1093f,\n\t0x10980, 0x109b7,\n\t0x109be, 0x109bf,\n\t0x10a00, 0x10a03,\n\t0x10a05, 0x10a06,\n\t0x10a0c, 0x10a13,\n\t0x10a15, 0x10a17,\n\t0x10a19, 0x10a33,\n\t0x10a38, 0x10a3a,\n\t0x10a3f, 0x10a47,\n\t0x10a50, 0x10a58,\n\t0x10a60, 0x10a7f,\n\t0x10b00, 0x10b35,\n\t0x10b39, 0x10b55,\n\t0x10b58, 0x10b72,\n\t0x10b78, 0x10b7f,\n\t0x10c00, 0x10c48,\n\t0x10e60, 0x10e7e,\n\t0x11000, 0x1104d,\n\t0x11052, 0x1106f,\n\t0x11080, 0x110c1,\n\t0x110d0, 0x110e8,\n\t0x110f0, 0x110f9,\n\t0x11100, 0x11134,\n\t0x11136, 0x11143,\n\t0x11180, 0x111c8,\n\t0x111d0, 0x111d9,\n\t0x11680, 0x116b7,\n\t0x116c0, 0x116c9,\n\t0x12000, 0x1236e,\n\t0x12400, 0x12462,\n\t0x12470, 0x12473,\n\t0x13000, 0x1342e,\n\t0x16800, 0x16a38,\n\t0x16f00, 0x16f44,\n\t0x16f50, 0x16f7e,\n\t0x16f8f, 0x16f9f,\n\t0x1b000, 0x1b001,\n\t0x1d000, 0x1d0f5,\n\t0x1d100, 0x1d126,\n\t0x1d129, 0x1d1dd,\n\t0x1d200, 0x1d245,\n\t0x1d300, 0x1d356,\n\t0x1d360, 0x1d371,\n\t0x1d400, 0x1d454,\n\t0x1d456, 0x1d49c,\n\t0x1d49e, 0x1d49f,\n\t0x1d4a2, 0x1d4a2,\n\t0x1d4a5, 0x1d4a6,\n\t0x1d4a9, 0x1d4ac,\n\t0x1d4ae, 0x1d4b9,\n\t0x1d4bb, 0x1d4bb,\n\t0x1d4bd, 0x1d4c3,\n\t0x1d4c5, 0x1d505,\n\t0x1d507, 0x1d50a,\n\t0x1d50d, 0x1d514,\n\t0x1d516, 0x1d51c,\n\t0x1d51e, 0x1d539,\n\t0x1d53b, 0x1d53e,\n\t0x1d540, 0x1d544,\n\t0x1d546, 0x1d546,\n\t0x1d54a, 0x1d550,\n\t0x1d552, 0x1d6a5,\n\t0x1d6a8, 0x1d7cb,\n\t0x1d7ce, 0x1d7ff,\n\t0x1ee00, 0x1ee03,\n\t0x1ee05, 0x1ee1f,\n\t0x1ee21, 0x1ee22,\n\t0x1ee24, 0x1ee24,\n\t0x1ee27, 0x1ee27,\n\t0x1ee29, 0x1ee32,\n\t0x1ee34, 0x1ee37,\n\t0x1ee39, 0x1ee39,\n\t0x1ee3b, 0x1ee3b,\n\t0x1ee42, 0x1ee42,\n\t0x1ee47, 0x1ee47,\n\t0x1ee49, 0x1ee49,\n\t0x1ee4b, 0x1ee4b,\n\t0x1ee4d, 0x1ee4f,\n\t0x1ee51, 0x1ee52,\n\t0x1ee54, 0x1ee54,\n\t0x1ee57, 0x1ee57,\n\t0x1ee59, 0x1ee59,\n\t0x1ee5b, 0x1ee5b,\n\t0x1ee5d, 0x1ee5d,\n\t0x1ee5f, 0x1ee5f,\n\t0x1ee61, 0x1ee62,\n\t0x1ee64, 0x1ee64,\n\t0x1ee67, 0x1ee6a,\n\t0x1ee6c, 0x1ee72,\n\t0x1ee74, 0x1ee77,\n\t0x1ee79, 0x1ee7c,\n\t0x1ee7e, 0x1ee7e,\n\t0x1ee80, 0x1ee89,\n\t0x1ee8b, 0x1ee9b,\n\t0x1eea1, 0x1eea3,\n\t0x1eea5, 0x1eea9,\n\t0x1eeab, 0x1eebb,\n\t0x1eef0, 0x1eef1,\n\t0x1f000, 0x1f02b,\n\t0x1f030, 0x1f093,\n\t0x1f0a0, 0x1f0ae,\n\t0x1f0b1, 0x1f0be,\n\t0x1f0c1, 0x1f0cf,\n\t0x1f0d1, 0x1f0df,\n\t0x1f100, 0x1f10a,\n\t0x1f110, 0x1f12e,\n\t0x1f130, 0x1f16b,\n\t0x1f170, 0x1f19a,\n\t0x1f1e6, 0x1f202,\n\t0x1f210, 0x1f23a,\n\t0x1f240, 0x1f248,\n\t0x1f250, 0x1f251,\n\t0x1f300, 0x1f320,\n\t0x1f330, 0x1f335,\n\t0x1f337, 0x1f37c,\n\t0x1f380, 0x1f393,\n\t0x1f3a0, 0x1f3c4,\n\t0x1f3c6, 0x1f3ca,\n\t0x1f3e0, 0x1f3f0,\n\t0x1f400, 0x1f43e,\n\t0x1f440, 0x1f440,\n\t0x1f442, 0x1f4f7,\n\t0x1f4f9, 0x1f4fc,\n\t0x1f500, 0x1f53d,\n\t0x1f540, 0x1f543,\n\t0x1f550, 0x1f567,\n\t0x1f5fb, 0x1f640,\n\t0x1f645, 0x1f64f,\n\t0x1f680, 0x1f6c5,\n\t0x1f700, 0x1f773,\n\t0x1fffe, 0x2a6d6,\n\t0x2a700, 0x2b734,\n\t0x2b740, 0x2b81d,\n\t0x2f800, 0x2fa1d,\n\t0x2fffe, 0x2ffff,\n\t0x3fffe, 0x3ffff,\n\t0x4fffe, 0x4ffff,\n\t0x5fffe, 0x5ffff,\n\t0x6fffe, 0x6ffff,\n\t0x7fffe, 0x7ffff,\n\t0x8fffe, 0x8ffff,\n\t0x9fffe, 0x9ffff,\n\t0xafffe, 0xaffff,\n\t0xbfffe, 0xbffff,\n\t0xcfffe, 0xcffff,\n\t0xdfffe, 0xdffff,\n\t0xe0001, 0xe0001,\n\t0xe0020, 0xe007f,\n\t0xe0100, 0xe01ef,\n\t0xefffe, 0x10ffff,\n}; /* CR_Age_6_1 */\n\n/* 'In_Basic_Latin': Block */\n#define CR_In_Basic_Latin CR_ASCII\n\n/* 'In_Latin_1_Supplement': Block */\nstatic const OnigCodePoint CR_In_Latin_1_Supplement[] = {\n\t1,\n\t0x0080, 0x00ff,\n}; /* CR_In_Latin_1_Supplement */\n\n/* 'In_Latin_Extended_A': Block */\nstatic const OnigCodePoint CR_In_Latin_Extended_A[] = {\n\t1,\n\t0x0100, 0x017f,\n}; /* CR_In_Latin_Extended_A */\n\n/* 'In_Latin_Extended_B': Block */\nstatic const OnigCodePoint CR_In_Latin_Extended_B[] = {\n\t1,\n\t0x0180, 0x024f,\n}; /* CR_In_Latin_Extended_B */\n\n/* 'In_IPA_Extensions': Block */\nstatic const OnigCodePoint CR_In_IPA_Extensions[] = {\n\t1,\n\t0x0250, 0x02af,\n}; /* CR_In_IPA_Extensions */\n\n/* 'In_Spacing_Modifier_Letters': Block */\nstatic const OnigCodePoint CR_In_Spacing_Modifier_Letters[] = {\n\t1,\n\t0x02b0, 0x02ff,\n}; /* CR_In_Spacing_Modifier_Letters */\n\n/* 'In_Combining_Diacritical_Marks': Block */\nstatic const OnigCodePoint CR_In_Combining_Diacritical_Marks[] = {\n\t1,\n\t0x0300, 0x036f,\n}; /* CR_In_Combining_Diacritical_Marks */\n\n/* 'In_Greek_and_Coptic': Block */\nstatic const OnigCodePoint CR_In_Greek_and_Coptic[] = {\n\t1,\n\t0x0370, 0x03ff,\n}; /* CR_In_Greek_and_Coptic */\n\n/* 'In_Cyrillic': Block */\nstatic const OnigCodePoint CR_In_Cyrillic[] = {\n\t1,\n\t0x0400, 0x04ff,\n}; /* CR_In_Cyrillic */\n\n/* 'In_Cyrillic_Supplement': Block */\nstatic const OnigCodePoint CR_In_Cyrillic_Supplement[] = {\n\t1,\n\t0x0500, 0x052f,\n}; /* CR_In_Cyrillic_Supplement */\n\n/* 'In_Armenian': Block */\nstatic const OnigCodePoint CR_In_Armenian[] = {\n\t1,\n\t0x0530, 0x058f,\n}; /* CR_In_Armenian */\n\n/* 'In_Hebrew': Block */\nstatic const OnigCodePoint CR_In_Hebrew[] = {\n\t1,\n\t0x0590, 0x05ff,\n}; /* CR_In_Hebrew */\n\n/* 'In_Arabic': Block */\nstatic const OnigCodePoint CR_In_Arabic[] = {\n\t1,\n\t0x0600, 0x06ff,\n}; /* CR_In_Arabic */\n\n/* 'In_Syriac': Block */\nstatic const OnigCodePoint CR_In_Syriac[] = {\n\t1,\n\t0x0700, 0x074f,\n}; /* CR_In_Syriac */\n\n/* 'In_Arabic_Supplement': Block */\nstatic const OnigCodePoint CR_In_Arabic_Supplement[] = {\n\t1,\n\t0x0750, 0x077f,\n}; /* CR_In_Arabic_Supplement */\n\n/* 'In_Thaana': Block */\nstatic const OnigCodePoint CR_In_Thaana[] = {\n\t1,\n\t0x0780, 0x07bf,\n}; /* CR_In_Thaana */\n\n/* 'In_NKo': Block */\nstatic const OnigCodePoint CR_In_NKo[] = {\n\t1,\n\t0x07c0, 0x07ff,\n}; /* CR_In_NKo */\n\n/* 'In_Samaritan': Block */\nstatic const OnigCodePoint CR_In_Samaritan[] = {\n\t1,\n\t0x0800, 0x083f,\n}; /* CR_In_Samaritan */\n\n/* 'In_Mandaic': Block */\nstatic const OnigCodePoint CR_In_Mandaic[] = {\n\t1,\n\t0x0840, 0x085f,\n}; /* CR_In_Mandaic */\n\n/* 'In_Arabic_Extended_A': Block */\nstatic const OnigCodePoint CR_In_Arabic_Extended_A[] = {\n\t1,\n\t0x08a0, 0x08ff,\n}; /* CR_In_Arabic_Extended_A */\n\n/* 'In_Devanagari': Block */\nstatic const OnigCodePoint CR_In_Devanagari[] = {\n\t1,\n\t0x0900, 0x097f,\n}; /* CR_In_Devanagari */\n\n/* 'In_Bengali': Block */\nstatic const OnigCodePoint CR_In_Bengali[] = {\n\t1,\n\t0x0980, 0x09ff,\n}; /* CR_In_Bengali */\n\n/* 'In_Gurmukhi': Block */\nstatic const OnigCodePoint CR_In_Gurmukhi[] = {\n\t1,\n\t0x0a00, 0x0a7f,\n}; /* CR_In_Gurmukhi */\n\n/* 'In_Gujarati': Block */\nstatic const OnigCodePoint CR_In_Gujarati[] = {\n\t1,\n\t0x0a80, 0x0aff,\n}; /* CR_In_Gujarati */\n\n/* 'In_Oriya': Block */\nstatic const OnigCodePoint CR_In_Oriya[] = {\n\t1,\n\t0x0b00, 0x0b7f,\n}; /* CR_In_Oriya */\n\n/* 'In_Tamil': Block */\nstatic const OnigCodePoint CR_In_Tamil[] = {\n\t1,\n\t0x0b80, 0x0bff,\n}; /* CR_In_Tamil */\n\n/* 'In_Telugu': Block */\nstatic const OnigCodePoint CR_In_Telugu[] = {\n\t1,\n\t0x0c00, 0x0c7f,\n}; /* CR_In_Telugu */\n\n/* 'In_Kannada': Block */\nstatic const OnigCodePoint CR_In_Kannada[] = {\n\t1,\n\t0x0c80, 0x0cff,\n}; /* CR_In_Kannada */\n\n/* 'In_Malayalam': Block */\nstatic const OnigCodePoint CR_In_Malayalam[] = {\n\t1,\n\t0x0d00, 0x0d7f,\n}; /* CR_In_Malayalam */\n\n/* 'In_Sinhala': Block */\nstatic const OnigCodePoint CR_In_Sinhala[] = {\n\t1,\n\t0x0d80, 0x0dff,\n}; /* CR_In_Sinhala */\n\n/* 'In_Thai': Block */\nstatic const OnigCodePoint CR_In_Thai[] = {\n\t1,\n\t0x0e00, 0x0e7f,\n}; /* CR_In_Thai */\n\n/* 'In_Lao': Block */\nstatic const OnigCodePoint CR_In_Lao[] = {\n\t1,\n\t0x0e80, 0x0eff,\n}; /* CR_In_Lao */\n\n/* 'In_Tibetan': Block */\nstatic const OnigCodePoint CR_In_Tibetan[] = {\n\t1,\n\t0x0f00, 0x0fff,\n}; /* CR_In_Tibetan */\n\n/* 'In_Myanmar': Block */\nstatic const OnigCodePoint CR_In_Myanmar[] = {\n\t1,\n\t0x1000, 0x109f,\n}; /* CR_In_Myanmar */\n\n/* 'In_Georgian': Block */\nstatic const OnigCodePoint CR_In_Georgian[] = {\n\t1,\n\t0x10a0, 0x10ff,\n}; /* CR_In_Georgian */\n\n/* 'In_Hangul_Jamo': Block */\nstatic const OnigCodePoint CR_In_Hangul_Jamo[] = {\n\t1,\n\t0x1100, 0x11ff,\n}; /* CR_In_Hangul_Jamo */\n\n/* 'In_Ethiopic': Block */\nstatic const OnigCodePoint CR_In_Ethiopic[] = {\n\t1,\n\t0x1200, 0x137f,\n}; /* CR_In_Ethiopic */\n\n/* 'In_Ethiopic_Supplement': Block */\nstatic const OnigCodePoint CR_In_Ethiopic_Supplement[] = {\n\t1,\n\t0x1380, 0x139f,\n}; /* CR_In_Ethiopic_Supplement */\n\n/* 'In_Cherokee': Block */\nstatic const OnigCodePoint CR_In_Cherokee[] = {\n\t1,\n\t0x13a0, 0x13ff,\n}; /* CR_In_Cherokee */\n\n/* 'In_Unified_Canadian_Aboriginal_Syllabics': Block */\nstatic const OnigCodePoint CR_In_Unified_Canadian_Aboriginal_Syllabics[] = {\n\t1,\n\t0x1400, 0x167f,\n}; /* CR_In_Unified_Canadian_Aboriginal_Syllabics */\n\n/* 'In_Ogham': Block */\nstatic const OnigCodePoint CR_In_Ogham[] = {\n\t1,\n\t0x1680, 0x169f,\n}; /* CR_In_Ogham */\n\n/* 'In_Runic': Block */\nstatic const OnigCodePoint CR_In_Runic[] = {\n\t1,\n\t0x16a0, 0x16ff,\n}; /* CR_In_Runic */\n\n/* 'In_Tagalog': Block */\nstatic const OnigCodePoint CR_In_Tagalog[] = {\n\t1,\n\t0x1700, 0x171f,\n}; /* CR_In_Tagalog */\n\n/* 'In_Hanunoo': Block */\nstatic const OnigCodePoint CR_In_Hanunoo[] = {\n\t1,\n\t0x1720, 0x173f,\n}; /* CR_In_Hanunoo */\n\n/* 'In_Buhid': Block */\nstatic const OnigCodePoint CR_In_Buhid[] = {\n\t1,\n\t0x1740, 0x175f,\n}; /* CR_In_Buhid */\n\n/* 'In_Tagbanwa': Block */\nstatic const OnigCodePoint CR_In_Tagbanwa[] = {\n\t1,\n\t0x1760, 0x177f,\n}; /* CR_In_Tagbanwa */\n\n/* 'In_Khmer': Block */\nstatic const OnigCodePoint CR_In_Khmer[] = {\n\t1,\n\t0x1780, 0x17ff,\n}; /* CR_In_Khmer */\n\n/* 'In_Mongolian': Block */\nstatic const OnigCodePoint CR_In_Mongolian[] = {\n\t1,\n\t0x1800, 0x18af,\n}; /* CR_In_Mongolian */\n\n/* 'In_Unified_Canadian_Aboriginal_Syllabics_Extended': Block */\nstatic const OnigCodePoint CR_In_Unified_Canadian_Aboriginal_Syllabics_Extended[] = {\n\t1,\n\t0x18b0, 0x18ff,\n}; /* CR_In_Unified_Canadian_Aboriginal_Syllabics_Extended */\n\n/* 'In_Limbu': Block */\nstatic const OnigCodePoint CR_In_Limbu[] = {\n\t1,\n\t0x1900, 0x194f,\n}; /* CR_In_Limbu */\n\n/* 'In_Tai_Le': Block */\nstatic const OnigCodePoint CR_In_Tai_Le[] = {\n\t1,\n\t0x1950, 0x197f,\n}; /* CR_In_Tai_Le */\n\n/* 'In_New_Tai_Lue': Block */\nstatic const OnigCodePoint CR_In_New_Tai_Lue[] = {\n\t1,\n\t0x1980, 0x19df,\n}; /* CR_In_New_Tai_Lue */\n\n/* 'In_Khmer_Symbols': Block */\nstatic const OnigCodePoint CR_In_Khmer_Symbols[] = {\n\t1,\n\t0x19e0, 0x19ff,\n}; /* CR_In_Khmer_Symbols */\n\n/* 'In_Buginese': Block */\nstatic const OnigCodePoint CR_In_Buginese[] = {\n\t1,\n\t0x1a00, 0x1a1f,\n}; /* CR_In_Buginese */\n\n/* 'In_Tai_Tham': Block */\nstatic const OnigCodePoint CR_In_Tai_Tham[] = {\n\t1,\n\t0x1a20, 0x1aaf,\n}; /* CR_In_Tai_Tham */\n\n/* 'In_Balinese': Block */\nstatic const OnigCodePoint CR_In_Balinese[] = {\n\t1,\n\t0x1b00, 0x1b7f,\n}; /* CR_In_Balinese */\n\n/* 'In_Sundanese': Block */\nstatic const OnigCodePoint CR_In_Sundanese[] = {\n\t1,\n\t0x1b80, 0x1bbf,\n}; /* CR_In_Sundanese */\n\n/* 'In_Batak': Block */\nstatic const OnigCodePoint CR_In_Batak[] = {\n\t1,\n\t0x1bc0, 0x1bff,\n}; /* CR_In_Batak */\n\n/* 'In_Lepcha': Block */\nstatic const OnigCodePoint CR_In_Lepcha[] = {\n\t1,\n\t0x1c00, 0x1c4f,\n}; /* CR_In_Lepcha */\n\n/* 'In_Ol_Chiki': Block */\n#define CR_In_Ol_Chiki CR_Ol_Chiki\n\n/* 'In_Sundanese_Supplement': Block */\nstatic const OnigCodePoint CR_In_Sundanese_Supplement[] = {\n\t1,\n\t0x1cc0, 0x1ccf,\n}; /* CR_In_Sundanese_Supplement */\n\n/* 'In_Vedic_Extensions': Block */\nstatic const OnigCodePoint CR_In_Vedic_Extensions[] = {\n\t1,\n\t0x1cd0, 0x1cff,\n}; /* CR_In_Vedic_Extensions */\n\n/* 'In_Phonetic_Extensions': Block */\nstatic const OnigCodePoint CR_In_Phonetic_Extensions[] = {\n\t1,\n\t0x1d00, 0x1d7f,\n}; /* CR_In_Phonetic_Extensions */\n\n/* 'In_Phonetic_Extensions_Supplement': Block */\nstatic const OnigCodePoint CR_In_Phonetic_Extensions_Supplement[] = {\n\t1,\n\t0x1d80, 0x1dbf,\n}; /* CR_In_Phonetic_Extensions_Supplement */\n\n/* 'In_Combining_Diacritical_Marks_Supplement': Block */\nstatic const OnigCodePoint CR_In_Combining_Diacritical_Marks_Supplement[] = {\n\t1,\n\t0x1dc0, 0x1dff,\n}; /* CR_In_Combining_Diacritical_Marks_Supplement */\n\n/* 'In_Latin_Extended_Additional': Block */\nstatic const OnigCodePoint CR_In_Latin_Extended_Additional[] = {\n\t1,\n\t0x1e00, 0x1eff,\n}; /* CR_In_Latin_Extended_Additional */\n\n/* 'In_Greek_Extended': Block */\nstatic const OnigCodePoint CR_In_Greek_Extended[] = {\n\t1,\n\t0x1f00, 0x1fff,\n}; /* CR_In_Greek_Extended */\n\n/* 'In_General_Punctuation': Block */\nstatic const OnigCodePoint CR_In_General_Punctuation[] = {\n\t1,\n\t0x2000, 0x206f,\n}; /* CR_In_General_Punctuation */\n\n/* 'In_Superscripts_and_Subscripts': Block */\nstatic const OnigCodePoint CR_In_Superscripts_and_Subscripts[] = {\n\t1,\n\t0x2070, 0x209f,\n}; /* CR_In_Superscripts_and_Subscripts */\n\n/* 'In_Currency_Symbols': Block */\nstatic const OnigCodePoint CR_In_Currency_Symbols[] = {\n\t1,\n\t0x20a0, 0x20cf,\n}; /* CR_In_Currency_Symbols */\n\n/* 'In_Combining_Diacritical_Marks_for_Symbols': Block */\nstatic const OnigCodePoint CR_In_Combining_Diacritical_Marks_for_Symbols[] = {\n\t1,\n\t0x20d0, 0x20ff,\n}; /* CR_In_Combining_Diacritical_Marks_for_Symbols */\n\n/* 'In_Letterlike_Symbols': Block */\nstatic const OnigCodePoint CR_In_Letterlike_Symbols[] = {\n\t1,\n\t0x2100, 0x214f,\n}; /* CR_In_Letterlike_Symbols */\n\n/* 'In_Number_Forms': Block */\nstatic const OnigCodePoint CR_In_Number_Forms[] = {\n\t1,\n\t0x2150, 0x218f,\n}; /* CR_In_Number_Forms */\n\n/* 'In_Arrows': Block */\nstatic const OnigCodePoint CR_In_Arrows[] = {\n\t1,\n\t0x2190, 0x21ff,\n}; /* CR_In_Arrows */\n\n/* 'In_Mathematical_Operators': Block */\nstatic const OnigCodePoint CR_In_Mathematical_Operators[] = {\n\t1,\n\t0x2200, 0x22ff,\n}; /* CR_In_Mathematical_Operators */\n\n/* 'In_Miscellaneous_Technical': Block */\nstatic const OnigCodePoint CR_In_Miscellaneous_Technical[] = {\n\t1,\n\t0x2300, 0x23ff,\n}; /* CR_In_Miscellaneous_Technical */\n\n/* 'In_Control_Pictures': Block */\nstatic const OnigCodePoint CR_In_Control_Pictures[] = {\n\t1,\n\t0x2400, 0x243f,\n}; /* CR_In_Control_Pictures */\n\n/* 'In_Optical_Character_Recognition': Block */\nstatic const OnigCodePoint CR_In_Optical_Character_Recognition[] = {\n\t1,\n\t0x2440, 0x245f,\n}; /* CR_In_Optical_Character_Recognition */\n\n/* 'In_Enclosed_Alphanumerics': Block */\nstatic const OnigCodePoint CR_In_Enclosed_Alphanumerics[] = {\n\t1,\n\t0x2460, 0x24ff,\n}; /* CR_In_Enclosed_Alphanumerics */\n\n/* 'In_Box_Drawing': Block */\nstatic const OnigCodePoint CR_In_Box_Drawing[] = {\n\t1,\n\t0x2500, 0x257f,\n}; /* CR_In_Box_Drawing */\n\n/* 'In_Block_Elements': Block */\nstatic const OnigCodePoint CR_In_Block_Elements[] = {\n\t1,\n\t0x2580, 0x259f,\n}; /* CR_In_Block_Elements */\n\n/* 'In_Geometric_Shapes': Block */\nstatic const OnigCodePoint CR_In_Geometric_Shapes[] = {\n\t1,\n\t0x25a0, 0x25ff,\n}; /* CR_In_Geometric_Shapes */\n\n/* 'In_Miscellaneous_Symbols': Block */\nstatic const OnigCodePoint CR_In_Miscellaneous_Symbols[] = {\n\t1,\n\t0x2600, 0x26ff,\n}; /* CR_In_Miscellaneous_Symbols */\n\n/* 'In_Dingbats': Block */\nstatic const OnigCodePoint CR_In_Dingbats[] = {\n\t1,\n\t0x2700, 0x27bf,\n}; /* CR_In_Dingbats */\n\n/* 'In_Miscellaneous_Mathematical_Symbols_A': Block */\nstatic const OnigCodePoint CR_In_Miscellaneous_Mathematical_Symbols_A[] = {\n\t1,\n\t0x27c0, 0x27ef,\n}; /* CR_In_Miscellaneous_Mathematical_Symbols_A */\n\n/* 'In_Supplemental_Arrows_A': Block */\nstatic const OnigCodePoint CR_In_Supplemental_Arrows_A[] = {\n\t1,\n\t0x27f0, 0x27ff,\n}; /* CR_In_Supplemental_Arrows_A */\n\n/* 'In_Braille_Patterns': Block */\n#define CR_In_Braille_Patterns CR_Braille\n\n/* 'In_Supplemental_Arrows_B': Block */\nstatic const OnigCodePoint CR_In_Supplemental_Arrows_B[] = {\n\t1,\n\t0x2900, 0x297f,\n}; /* CR_In_Supplemental_Arrows_B */\n\n/* 'In_Miscellaneous_Mathematical_Symbols_B': Block */\nstatic const OnigCodePoint CR_In_Miscellaneous_Mathematical_Symbols_B[] = {\n\t1,\n\t0x2980, 0x29ff,\n}; /* CR_In_Miscellaneous_Mathematical_Symbols_B */\n\n/* 'In_Supplemental_Mathematical_Operators': Block */\nstatic const OnigCodePoint CR_In_Supplemental_Mathematical_Operators[] = {\n\t1,\n\t0x2a00, 0x2aff,\n}; /* CR_In_Supplemental_Mathematical_Operators */\n\n/* 'In_Miscellaneous_Symbols_and_Arrows': Block */\nstatic const OnigCodePoint CR_In_Miscellaneous_Symbols_and_Arrows[] = {\n\t1,\n\t0x2b00, 0x2bff,\n}; /* CR_In_Miscellaneous_Symbols_and_Arrows */\n\n/* 'In_Glagolitic': Block */\nstatic const OnigCodePoint CR_In_Glagolitic[] = {\n\t1,\n\t0x2c00, 0x2c5f,\n}; /* CR_In_Glagolitic */\n\n/* 'In_Latin_Extended_C': Block */\nstatic const OnigCodePoint CR_In_Latin_Extended_C[] = {\n\t1,\n\t0x2c60, 0x2c7f,\n}; /* CR_In_Latin_Extended_C */\n\n/* 'In_Coptic': Block */\nstatic const OnigCodePoint CR_In_Coptic[] = {\n\t1,\n\t0x2c80, 0x2cff,\n}; /* CR_In_Coptic */\n\n/* 'In_Georgian_Supplement': Block */\nstatic const OnigCodePoint CR_In_Georgian_Supplement[] = {\n\t1,\n\t0x2d00, 0x2d2f,\n}; /* CR_In_Georgian_Supplement */\n\n/* 'In_Tifinagh': Block */\nstatic const OnigCodePoint CR_In_Tifinagh[] = {\n\t1,\n\t0x2d30, 0x2d7f,\n}; /* CR_In_Tifinagh */\n\n/* 'In_Ethiopic_Extended': Block */\nstatic const OnigCodePoint CR_In_Ethiopic_Extended[] = {\n\t1,\n\t0x2d80, 0x2ddf,\n}; /* CR_In_Ethiopic_Extended */\n\n/* 'In_Cyrillic_Extended_A': Block */\nstatic const OnigCodePoint CR_In_Cyrillic_Extended_A[] = {\n\t1,\n\t0x2de0, 0x2dff,\n}; /* CR_In_Cyrillic_Extended_A */\n\n/* 'In_Supplemental_Punctuation': Block */\nstatic const OnigCodePoint CR_In_Supplemental_Punctuation[] = {\n\t1,\n\t0x2e00, 0x2e7f,\n}; /* CR_In_Supplemental_Punctuation */\n\n/* 'In_CJK_Radicals_Supplement': Block */\nstatic const OnigCodePoint CR_In_CJK_Radicals_Supplement[] = {\n\t1,\n\t0x2e80, 0x2eff,\n}; /* CR_In_CJK_Radicals_Supplement */\n\n/* 'In_Kangxi_Radicals': Block */\nstatic const OnigCodePoint CR_In_Kangxi_Radicals[] = {\n\t1,\n\t0x2f00, 0x2fdf,\n}; /* CR_In_Kangxi_Radicals */\n\n/* 'In_Ideographic_Description_Characters': Block */\nstatic const OnigCodePoint CR_In_Ideographic_Description_Characters[] = {\n\t1,\n\t0x2ff0, 0x2fff,\n}; /* CR_In_Ideographic_Description_Characters */\n\n/* 'In_CJK_Symbols_and_Punctuation': Block */\nstatic const OnigCodePoint CR_In_CJK_Symbols_and_Punctuation[] = {\n\t1,\n\t0x3000, 0x303f,\n}; /* CR_In_CJK_Symbols_and_Punctuation */\n\n/* 'In_Hiragana': Block */\nstatic const OnigCodePoint CR_In_Hiragana[] = {\n\t1,\n\t0x3040, 0x309f,\n}; /* CR_In_Hiragana */\n\n/* 'In_Katakana': Block */\nstatic const OnigCodePoint CR_In_Katakana[] = {\n\t1,\n\t0x30a0, 0x30ff,\n}; /* CR_In_Katakana */\n\n/* 'In_Bopomofo': Block */\nstatic const OnigCodePoint CR_In_Bopomofo[] = {\n\t1,\n\t0x3100, 0x312f,\n}; /* CR_In_Bopomofo */\n\n/* 'In_Hangul_Compatibility_Jamo': Block */\nstatic const OnigCodePoint CR_In_Hangul_Compatibility_Jamo[] = {\n\t1,\n\t0x3130, 0x318f,\n}; /* CR_In_Hangul_Compatibility_Jamo */\n\n/* 'In_Kanbun': Block */\nstatic const OnigCodePoint CR_In_Kanbun[] = {\n\t1,\n\t0x3190, 0x319f,\n}; /* CR_In_Kanbun */\n\n/* 'In_Bopomofo_Extended': Block */\nstatic const OnigCodePoint CR_In_Bopomofo_Extended[] = {\n\t1,\n\t0x31a0, 0x31bf,\n}; /* CR_In_Bopomofo_Extended */\n\n/* 'In_CJK_Strokes': Block */\nstatic const OnigCodePoint CR_In_CJK_Strokes[] = {\n\t1,\n\t0x31c0, 0x31ef,\n}; /* CR_In_CJK_Strokes */\n\n/* 'In_Katakana_Phonetic_Extensions': Block */\nstatic const OnigCodePoint CR_In_Katakana_Phonetic_Extensions[] = {\n\t1,\n\t0x31f0, 0x31ff,\n}; /* CR_In_Katakana_Phonetic_Extensions */\n\n/* 'In_Enclosed_CJK_Letters_and_Months': Block */\nstatic const OnigCodePoint CR_In_Enclosed_CJK_Letters_and_Months[] = {\n\t1,\n\t0x3200, 0x32ff,\n}; /* CR_In_Enclosed_CJK_Letters_and_Months */\n\n/* 'In_CJK_Compatibility': Block */\nstatic const OnigCodePoint CR_In_CJK_Compatibility[] = {\n\t1,\n\t0x3300, 0x33ff,\n}; /* CR_In_CJK_Compatibility */\n\n/* 'In_CJK_Unified_Ideographs_Extension_A': Block */\nstatic const OnigCodePoint CR_In_CJK_Unified_Ideographs_Extension_A[] = {\n\t1,\n\t0x3400, 0x4dbf,\n}; /* CR_In_CJK_Unified_Ideographs_Extension_A */\n\n/* 'In_Yijing_Hexagram_Symbols': Block */\nstatic const OnigCodePoint CR_In_Yijing_Hexagram_Symbols[] = {\n\t1,\n\t0x4dc0, 0x4dff,\n}; /* CR_In_Yijing_Hexagram_Symbols */\n\n/* 'In_CJK_Unified_Ideographs': Block */\nstatic const OnigCodePoint CR_In_CJK_Unified_Ideographs[] = {\n\t1,\n\t0x4e00, 0x9fff,\n}; /* CR_In_CJK_Unified_Ideographs */\n\n/* 'In_Yi_Syllables': Block */\nstatic const OnigCodePoint CR_In_Yi_Syllables[] = {\n\t1,\n\t0xa000, 0xa48f,\n}; /* CR_In_Yi_Syllables */\n\n/* 'In_Yi_Radicals': Block */\nstatic const OnigCodePoint CR_In_Yi_Radicals[] = {\n\t1,\n\t0xa490, 0xa4cf,\n}; /* CR_In_Yi_Radicals */\n\n/* 'In_Lisu': Block */\n#define CR_In_Lisu CR_Lisu\n\n/* 'In_Vai': Block */\nstatic const OnigCodePoint CR_In_Vai[] = {\n\t1,\n\t0xa500, 0xa63f,\n}; /* CR_In_Vai */\n\n/* 'In_Cyrillic_Extended_B': Block */\nstatic const OnigCodePoint CR_In_Cyrillic_Extended_B[] = {\n\t1,\n\t0xa640, 0xa69f,\n}; /* CR_In_Cyrillic_Extended_B */\n\n/* 'In_Bamum': Block */\nstatic const OnigCodePoint CR_In_Bamum[] = {\n\t1,\n\t0xa6a0, 0xa6ff,\n}; /* CR_In_Bamum */\n\n/* 'In_Modifier_Tone_Letters': Block */\nstatic const OnigCodePoint CR_In_Modifier_Tone_Letters[] = {\n\t1,\n\t0xa700, 0xa71f,\n}; /* CR_In_Modifier_Tone_Letters */\n\n/* 'In_Latin_Extended_D': Block */\nstatic const OnigCodePoint CR_In_Latin_Extended_D[] = {\n\t1,\n\t0xa720, 0xa7ff,\n}; /* CR_In_Latin_Extended_D */\n\n/* 'In_Syloti_Nagri': Block */\nstatic const OnigCodePoint CR_In_Syloti_Nagri[] = {\n\t1,\n\t0xa800, 0xa82f,\n}; /* CR_In_Syloti_Nagri */\n\n/* 'In_Common_Indic_Number_Forms': Block */\nstatic const OnigCodePoint CR_In_Common_Indic_Number_Forms[] = {\n\t1,\n\t0xa830, 0xa83f,\n}; /* CR_In_Common_Indic_Number_Forms */\n\n/* 'In_Phags_pa': Block */\nstatic const OnigCodePoint CR_In_Phags_pa[] = {\n\t1,\n\t0xa840, 0xa87f,\n}; /* CR_In_Phags_pa */\n\n/* 'In_Saurashtra': Block */\nstatic const OnigCodePoint CR_In_Saurashtra[] = {\n\t1,\n\t0xa880, 0xa8df,\n}; /* CR_In_Saurashtra */\n\n/* 'In_Devanagari_Extended': Block */\nstatic const OnigCodePoint CR_In_Devanagari_Extended[] = {\n\t1,\n\t0xa8e0, 0xa8ff,\n}; /* CR_In_Devanagari_Extended */\n\n/* 'In_Kayah_Li': Block */\n#define CR_In_Kayah_Li CR_Kayah_Li\n\n/* 'In_Rejang': Block */\nstatic const OnigCodePoint CR_In_Rejang[] = {\n\t1,\n\t0xa930, 0xa95f,\n}; /* CR_In_Rejang */\n\n/* 'In_Hangul_Jamo_Extended_A': Block */\nstatic const OnigCodePoint CR_In_Hangul_Jamo_Extended_A[] = {\n\t1,\n\t0xa960, 0xa97f,\n}; /* CR_In_Hangul_Jamo_Extended_A */\n\n/* 'In_Javanese': Block */\nstatic const OnigCodePoint CR_In_Javanese[] = {\n\t1,\n\t0xa980, 0xa9df,\n}; /* CR_In_Javanese */\n\n/* 'In_Cham': Block */\nstatic const OnigCodePoint CR_In_Cham[] = {\n\t1,\n\t0xaa00, 0xaa5f,\n}; /* CR_In_Cham */\n\n/* 'In_Myanmar_Extended_A': Block */\nstatic const OnigCodePoint CR_In_Myanmar_Extended_A[] = {\n\t1,\n\t0xaa60, 0xaa7f,\n}; /* CR_In_Myanmar_Extended_A */\n\n/* 'In_Tai_Viet': Block */\nstatic const OnigCodePoint CR_In_Tai_Viet[] = {\n\t1,\n\t0xaa80, 0xaadf,\n}; /* CR_In_Tai_Viet */\n\n/* 'In_Meetei_Mayek_Extensions': Block */\nstatic const OnigCodePoint CR_In_Meetei_Mayek_Extensions[] = {\n\t1,\n\t0xaae0, 0xaaff,\n}; /* CR_In_Meetei_Mayek_Extensions */\n\n/* 'In_Ethiopic_Extended_A': Block */\nstatic const OnigCodePoint CR_In_Ethiopic_Extended_A[] = {\n\t1,\n\t0xab00, 0xab2f,\n}; /* CR_In_Ethiopic_Extended_A */\n\n/* 'In_Meetei_Mayek': Block */\nstatic const OnigCodePoint CR_In_Meetei_Mayek[] = {\n\t1,\n\t0xabc0, 0xabff,\n}; /* CR_In_Meetei_Mayek */\n\n/* 'In_Hangul_Syllables': Block */\nstatic const OnigCodePoint CR_In_Hangul_Syllables[] = {\n\t1,\n\t0xac00, 0xd7af,\n}; /* CR_In_Hangul_Syllables */\n\n/* 'In_Hangul_Jamo_Extended_B': Block */\nstatic const OnigCodePoint CR_In_Hangul_Jamo_Extended_B[] = {\n\t1,\n\t0xd7b0, 0xd7ff,\n}; /* CR_In_Hangul_Jamo_Extended_B */\n\n/* 'In_High_Surrogates': Block */\nstatic const OnigCodePoint CR_In_High_Surrogates[] = {\n\t1,\n\t0xd800, 0xdb7f,\n}; /* CR_In_High_Surrogates */\n\n/* 'In_High_Private_Use_Surrogates': Block */\nstatic const OnigCodePoint CR_In_High_Private_Use_Surrogates[] = {\n\t1,\n\t0xdb80, 0xdbff,\n}; /* CR_In_High_Private_Use_Surrogates */\n\n/* 'In_Low_Surrogates': Block */\nstatic const OnigCodePoint CR_In_Low_Surrogates[] = {\n\t1,\n\t0xdc00, 0xdfff,\n}; /* CR_In_Low_Surrogates */\n\n/* 'In_Private_Use_Area': Block */\nstatic const OnigCodePoint CR_In_Private_Use_Area[] = {\n\t1,\n\t0xe000, 0xf8ff,\n}; /* CR_In_Private_Use_Area */\n\n/* 'In_CJK_Compatibility_Ideographs': Block */\nstatic const OnigCodePoint CR_In_CJK_Compatibility_Ideographs[] = {\n\t1,\n\t0xf900, 0xfaff,\n}; /* CR_In_CJK_Compatibility_Ideographs */\n\n/* 'In_Alphabetic_Presentation_Forms': Block */\nstatic const OnigCodePoint CR_In_Alphabetic_Presentation_Forms[] = {\n\t1,\n\t0xfb00, 0xfb4f,\n}; /* CR_In_Alphabetic_Presentation_Forms */\n\n/* 'In_Arabic_Presentation_Forms_A': Block */\nstatic const OnigCodePoint CR_In_Arabic_Presentation_Forms_A[] = {\n\t1,\n\t0xfb50, 0xfdff,\n}; /* CR_In_Arabic_Presentation_Forms_A */\n\n/* 'In_Variation_Selectors': Block */\nstatic const OnigCodePoint CR_In_Variation_Selectors[] = {\n\t1,\n\t0xfe00, 0xfe0f,\n}; /* CR_In_Variation_Selectors */\n\n/* 'In_Vertical_Forms': Block */\nstatic const OnigCodePoint CR_In_Vertical_Forms[] = {\n\t1,\n\t0xfe10, 0xfe1f,\n}; /* CR_In_Vertical_Forms */\n\n/* 'In_Combining_Half_Marks': Block */\nstatic const OnigCodePoint CR_In_Combining_Half_Marks[] = {\n\t1,\n\t0xfe20, 0xfe2f,\n}; /* CR_In_Combining_Half_Marks */\n\n/* 'In_CJK_Compatibility_Forms': Block */\nstatic const OnigCodePoint CR_In_CJK_Compatibility_Forms[] = {\n\t1,\n\t0xfe30, 0xfe4f,\n}; /* CR_In_CJK_Compatibility_Forms */\n\n/* 'In_Small_Form_Variants': Block */\nstatic const OnigCodePoint CR_In_Small_Form_Variants[] = {\n\t1,\n\t0xfe50, 0xfe6f,\n}; /* CR_In_Small_Form_Variants */\n\n/* 'In_Arabic_Presentation_Forms_B': Block */\nstatic const OnigCodePoint CR_In_Arabic_Presentation_Forms_B[] = {\n\t1,\n\t0xfe70, 0xfeff,\n}; /* CR_In_Arabic_Presentation_Forms_B */\n\n/* 'In_Halfwidth_and_Fullwidth_Forms': Block */\nstatic const OnigCodePoint CR_In_Halfwidth_and_Fullwidth_Forms[] = {\n\t1,\n\t0xff00, 0xffef,\n}; /* CR_In_Halfwidth_and_Fullwidth_Forms */\n\n/* 'In_Specials': Block */\nstatic const OnigCodePoint CR_In_Specials[] = {\n\t1,\n\t0xfff0, 0xffff,\n}; /* CR_In_Specials */\n\n/* 'In_Linear_B_Syllabary': Block */\nstatic const OnigCodePoint CR_In_Linear_B_Syllabary[] = {\n\t1,\n\t0x10000, 0x1007f,\n}; /* CR_In_Linear_B_Syllabary */\n\n/* 'In_Linear_B_Ideograms': Block */\nstatic const OnigCodePoint CR_In_Linear_B_Ideograms[] = {\n\t1,\n\t0x10080, 0x100ff,\n}; /* CR_In_Linear_B_Ideograms */\n\n/* 'In_Aegean_Numbers': Block */\nstatic const OnigCodePoint CR_In_Aegean_Numbers[] = {\n\t1,\n\t0x10100, 0x1013f,\n}; /* CR_In_Aegean_Numbers */\n\n/* 'In_Ancient_Greek_Numbers': Block */\nstatic const OnigCodePoint CR_In_Ancient_Greek_Numbers[] = {\n\t1,\n\t0x10140, 0x1018f,\n}; /* CR_In_Ancient_Greek_Numbers */\n\n/* 'In_Ancient_Symbols': Block */\nstatic const OnigCodePoint CR_In_Ancient_Symbols[] = {\n\t1,\n\t0x10190, 0x101cf,\n}; /* CR_In_Ancient_Symbols */\n\n/* 'In_Phaistos_Disc': Block */\nstatic const OnigCodePoint CR_In_Phaistos_Disc[] = {\n\t1,\n\t0x101d0, 0x101ff,\n}; /* CR_In_Phaistos_Disc */\n\n/* 'In_Lycian': Block */\nstatic const OnigCodePoint CR_In_Lycian[] = {\n\t1,\n\t0x10280, 0x1029f,\n}; /* CR_In_Lycian */\n\n/* 'In_Carian': Block */\nstatic const OnigCodePoint CR_In_Carian[] = {\n\t1,\n\t0x102a0, 0x102df,\n}; /* CR_In_Carian */\n\n/* 'In_Old_Italic': Block */\nstatic const OnigCodePoint CR_In_Old_Italic[] = {\n\t1,\n\t0x10300, 0x1032f,\n}; /* CR_In_Old_Italic */\n\n/* 'In_Gothic': Block */\nstatic const OnigCodePoint CR_In_Gothic[] = {\n\t1,\n\t0x10330, 0x1034f,\n}; /* CR_In_Gothic */\n\n/* 'In_Ugaritic': Block */\nstatic const OnigCodePoint CR_In_Ugaritic[] = {\n\t1,\n\t0x10380, 0x1039f,\n}; /* CR_In_Ugaritic */\n\n/* 'In_Old_Persian': Block */\nstatic const OnigCodePoint CR_In_Old_Persian[] = {\n\t1,\n\t0x103a0, 0x103df,\n}; /* CR_In_Old_Persian */\n\n/* 'In_Deseret': Block */\n#define CR_In_Deseret CR_Deseret\n\n/* 'In_Shavian': Block */\n#define CR_In_Shavian CR_Shavian\n\n/* 'In_Osmanya': Block */\nstatic const OnigCodePoint CR_In_Osmanya[] = {\n\t1,\n\t0x10480, 0x104af,\n}; /* CR_In_Osmanya */\n\n/* 'In_Cypriot_Syllabary': Block */\nstatic const OnigCodePoint CR_In_Cypriot_Syllabary[] = {\n\t1,\n\t0x10800, 0x1083f,\n}; /* CR_In_Cypriot_Syllabary */\n\n/* 'In_Imperial_Aramaic': Block */\nstatic const OnigCodePoint CR_In_Imperial_Aramaic[] = {\n\t1,\n\t0x10840, 0x1085f,\n}; /* CR_In_Imperial_Aramaic */\n\n/* 'In_Phoenician': Block */\nstatic const OnigCodePoint CR_In_Phoenician[] = {\n\t1,\n\t0x10900, 0x1091f,\n}; /* CR_In_Phoenician */\n\n/* 'In_Lydian': Block */\nstatic const OnigCodePoint CR_In_Lydian[] = {\n\t1,\n\t0x10920, 0x1093f,\n}; /* CR_In_Lydian */\n\n/* 'In_Meroitic_Hieroglyphs': Block */\n#define CR_In_Meroitic_Hieroglyphs CR_Meroitic_Hieroglyphs\n\n/* 'In_Meroitic_Cursive': Block */\nstatic const OnigCodePoint CR_In_Meroitic_Cursive[] = {\n\t1,\n\t0x109a0, 0x109ff,\n}; /* CR_In_Meroitic_Cursive */\n\n/* 'In_Kharoshthi': Block */\nstatic const OnigCodePoint CR_In_Kharoshthi[] = {\n\t1,\n\t0x10a00, 0x10a5f,\n}; /* CR_In_Kharoshthi */\n\n/* 'In_Old_South_Arabian': Block */\n#define CR_In_Old_South_Arabian CR_Old_South_Arabian\n\n/* 'In_Avestan': Block */\nstatic const OnigCodePoint CR_In_Avestan[] = {\n\t1,\n\t0x10b00, 0x10b3f,\n}; /* CR_In_Avestan */\n\n/* 'In_Inscriptional_Parthian': Block */\nstatic const OnigCodePoint CR_In_Inscriptional_Parthian[] = {\n\t1,\n\t0x10b40, 0x10b5f,\n}; /* CR_In_Inscriptional_Parthian */\n\n/* 'In_Inscriptional_Pahlavi': Block */\nstatic const OnigCodePoint CR_In_Inscriptional_Pahlavi[] = {\n\t1,\n\t0x10b60, 0x10b7f,\n}; /* CR_In_Inscriptional_Pahlavi */\n\n/* 'In_Old_Turkic': Block */\nstatic const OnigCodePoint CR_In_Old_Turkic[] = {\n\t1,\n\t0x10c00, 0x10c4f,\n}; /* CR_In_Old_Turkic */\n\n/* 'In_Rumi_Numeral_Symbols': Block */\nstatic const OnigCodePoint CR_In_Rumi_Numeral_Symbols[] = {\n\t1,\n\t0x10e60, 0x10e7f,\n}; /* CR_In_Rumi_Numeral_Symbols */\n\n/* 'In_Brahmi': Block */\nstatic const OnigCodePoint CR_In_Brahmi[] = {\n\t1,\n\t0x11000, 0x1107f,\n}; /* CR_In_Brahmi */\n\n/* 'In_Kaithi': Block */\nstatic const OnigCodePoint CR_In_Kaithi[] = {\n\t1,\n\t0x11080, 0x110cf,\n}; /* CR_In_Kaithi */\n\n/* 'In_Sora_Sompeng': Block */\nstatic const OnigCodePoint CR_In_Sora_Sompeng[] = {\n\t1,\n\t0x110d0, 0x110ff,\n}; /* CR_In_Sora_Sompeng */\n\n/* 'In_Chakma': Block */\nstatic const OnigCodePoint CR_In_Chakma[] = {\n\t1,\n\t0x11100, 0x1114f,\n}; /* CR_In_Chakma */\n\n/* 'In_Sharada': Block */\nstatic const OnigCodePoint CR_In_Sharada[] = {\n\t1,\n\t0x11180, 0x111df,\n}; /* CR_In_Sharada */\n\n/* 'In_Takri': Block */\nstatic const OnigCodePoint CR_In_Takri[] = {\n\t1,\n\t0x11680, 0x116cf,\n}; /* CR_In_Takri */\n\n/* 'In_Cuneiform': Block */\nstatic const OnigCodePoint CR_In_Cuneiform[] = {\n\t1,\n\t0x12000, 0x123ff,\n}; /* CR_In_Cuneiform */\n\n/* 'In_Cuneiform_Numbers_and_Punctuation': Block */\nstatic const OnigCodePoint CR_In_Cuneiform_Numbers_and_Punctuation[] = {\n\t1,\n\t0x12400, 0x1247f,\n}; /* CR_In_Cuneiform_Numbers_and_Punctuation */\n\n/* 'In_Egyptian_Hieroglyphs': Block */\nstatic const OnigCodePoint CR_In_Egyptian_Hieroglyphs[] = {\n\t1,\n\t0x13000, 0x1342f,\n}; /* CR_In_Egyptian_Hieroglyphs */\n\n/* 'In_Bamum_Supplement': Block */\nstatic const OnigCodePoint CR_In_Bamum_Supplement[] = {\n\t1,\n\t0x16800, 0x16a3f,\n}; /* CR_In_Bamum_Supplement */\n\n/* 'In_Miao': Block */\nstatic const OnigCodePoint CR_In_Miao[] = {\n\t1,\n\t0x16f00, 0x16f9f,\n}; /* CR_In_Miao */\n\n/* 'In_Kana_Supplement': Block */\nstatic const OnigCodePoint CR_In_Kana_Supplement[] = {\n\t1,\n\t0x1b000, 0x1b0ff,\n}; /* CR_In_Kana_Supplement */\n\n/* 'In_Byzantine_Musical_Symbols': Block */\nstatic const OnigCodePoint CR_In_Byzantine_Musical_Symbols[] = {\n\t1,\n\t0x1d000, 0x1d0ff,\n}; /* CR_In_Byzantine_Musical_Symbols */\n\n/* 'In_Musical_Symbols': Block */\nstatic const OnigCodePoint CR_In_Musical_Symbols[] = {\n\t1,\n\t0x1d100, 0x1d1ff,\n}; /* CR_In_Musical_Symbols */\n\n/* 'In_Ancient_Greek_Musical_Notation': Block */\nstatic const OnigCodePoint CR_In_Ancient_Greek_Musical_Notation[] = {\n\t1,\n\t0x1d200, 0x1d24f,\n}; /* CR_In_Ancient_Greek_Musical_Notation */\n\n/* 'In_Tai_Xuan_Jing_Symbols': Block */\nstatic const OnigCodePoint CR_In_Tai_Xuan_Jing_Symbols[] = {\n\t1,\n\t0x1d300, 0x1d35f,\n}; /* CR_In_Tai_Xuan_Jing_Symbols */\n\n/* 'In_Counting_Rod_Numerals': Block */\nstatic const OnigCodePoint CR_In_Counting_Rod_Numerals[] = {\n\t1,\n\t0x1d360, 0x1d37f,\n}; /* CR_In_Counting_Rod_Numerals */\n\n/* 'In_Mathematical_Alphanumeric_Symbols': Block */\nstatic const OnigCodePoint CR_In_Mathematical_Alphanumeric_Symbols[] = {\n\t1,\n\t0x1d400, 0x1d7ff,\n}; /* CR_In_Mathematical_Alphanumeric_Symbols */\n\n/* 'In_Arabic_Mathematical_Alphabetic_Symbols': Block */\nstatic const OnigCodePoint CR_In_Arabic_Mathematical_Alphabetic_Symbols[] = {\n\t1,\n\t0x1ee00, 0x1eeff,\n}; /* CR_In_Arabic_Mathematical_Alphabetic_Symbols */\n\n/* 'In_Mahjong_Tiles': Block */\nstatic const OnigCodePoint CR_In_Mahjong_Tiles[] = {\n\t1,\n\t0x1f000, 0x1f02f,\n}; /* CR_In_Mahjong_Tiles */\n\n/* 'In_Domino_Tiles': Block */\nstatic const OnigCodePoint CR_In_Domino_Tiles[] = {\n\t1,\n\t0x1f030, 0x1f09f,\n}; /* CR_In_Domino_Tiles */\n\n/* 'In_Playing_Cards': Block */\nstatic const OnigCodePoint CR_In_Playing_Cards[] = {\n\t1,\n\t0x1f0a0, 0x1f0ff,\n}; /* CR_In_Playing_Cards */\n\n/* 'In_Enclosed_Alphanumeric_Supplement': Block */\nstatic const OnigCodePoint CR_In_Enclosed_Alphanumeric_Supplement[] = {\n\t1,\n\t0x1f100, 0x1f1ff,\n}; /* CR_In_Enclosed_Alphanumeric_Supplement */\n\n/* 'In_Enclosed_Ideographic_Supplement': Block */\nstatic const OnigCodePoint CR_In_Enclosed_Ideographic_Supplement[] = {\n\t1,\n\t0x1f200, 0x1f2ff,\n}; /* CR_In_Enclosed_Ideographic_Supplement */\n\n/* 'In_Miscellaneous_Symbols_And_Pictographs': Block */\nstatic const OnigCodePoint CR_In_Miscellaneous_Symbols_And_Pictographs[] = {\n\t1,\n\t0x1f300, 0x1f5ff,\n}; /* CR_In_Miscellaneous_Symbols_And_Pictographs */\n\n/* 'In_Emoticons': Block */\nstatic const OnigCodePoint CR_In_Emoticons[] = {\n\t1,\n\t0x1f600, 0x1f64f,\n}; /* CR_In_Emoticons */\n\n/* 'In_Transport_And_Map_Symbols': Block */\nstatic const OnigCodePoint CR_In_Transport_And_Map_Symbols[] = {\n\t1,\n\t0x1f680, 0x1f6ff,\n}; /* CR_In_Transport_And_Map_Symbols */\n\n/* 'In_Alchemical_Symbols': Block */\nstatic const OnigCodePoint CR_In_Alchemical_Symbols[] = {\n\t1,\n\t0x1f700, 0x1f77f,\n}; /* CR_In_Alchemical_Symbols */\n\n/* 'In_CJK_Unified_Ideographs_Extension_B': Block */\nstatic const OnigCodePoint CR_In_CJK_Unified_Ideographs_Extension_B[] = {\n\t1,\n\t0x20000, 0x2a6df,\n}; /* CR_In_CJK_Unified_Ideographs_Extension_B */\n\n/* 'In_CJK_Unified_Ideographs_Extension_C': Block */\nstatic const OnigCodePoint CR_In_CJK_Unified_Ideographs_Extension_C[] = {\n\t1,\n\t0x2a700, 0x2b73f,\n}; /* CR_In_CJK_Unified_Ideographs_Extension_C */\n\n/* 'In_CJK_Unified_Ideographs_Extension_D': Block */\nstatic const OnigCodePoint CR_In_CJK_Unified_Ideographs_Extension_D[] = {\n\t1,\n\t0x2b740, 0x2b81f,\n}; /* CR_In_CJK_Unified_Ideographs_Extension_D */\n\n/* 'In_CJK_Compatibility_Ideographs_Supplement': Block */\nstatic const OnigCodePoint CR_In_CJK_Compatibility_Ideographs_Supplement[] = {\n\t1,\n\t0x2f800, 0x2fa1f,\n}; /* CR_In_CJK_Compatibility_Ideographs_Supplement */\n\n/* 'In_Tags': Block */\nstatic const OnigCodePoint CR_In_Tags[] = {\n\t1,\n\t0xe0000, 0xe007f,\n}; /* CR_In_Tags */\n\n/* 'In_Variation_Selectors_Supplement': Block */\nstatic const OnigCodePoint CR_In_Variation_Selectors_Supplement[] = {\n\t1,\n\t0xe0100, 0xe01ef,\n}; /* CR_In_Variation_Selectors_Supplement */\n\n/* 'In_Supplementary_Private_Use_Area_A': Block */\nstatic const OnigCodePoint CR_In_Supplementary_Private_Use_Area_A[] = {\n\t1,\n\t0xf0000, 0xfffff,\n}; /* CR_In_Supplementary_Private_Use_Area_A */\n\n/* 'In_Supplementary_Private_Use_Area_B': Block */\nstatic const OnigCodePoint CR_In_Supplementary_Private_Use_Area_B[] = {\n\t1,\n\t0x100000, 0x10ffff,\n}; /* CR_In_Supplementary_Private_Use_Area_B */\n\n/* 'In_No_Block': Block */\nstatic const OnigCodePoint CR_In_No_Block[] = {\n\t36,\n\t0x0860, 0x089f,\n\t0x1ab0, 0x1aff,\n\t0x1c80, 0x1cbf,\n\t0x2fe0, 0x2fef,\n\t0xa9e0, 0xa9ff,\n\t0xab30, 0xabbf,\n\t0x10200, 0x1027f,\n\t0x102e0, 0x102ff,\n\t0x10350, 0x1037f,\n\t0x103e0, 0x103ff,\n\t0x104b0, 0x107ff,\n\t0x10860, 0x108ff,\n\t0x10940, 0x1097f,\n\t0x10a80, 0x10aff,\n\t0x10b80, 0x10bff,\n\t0x10c50, 0x10e5f,\n\t0x10e80, 0x10fff,\n\t0x11150, 0x1117f,\n\t0x111e0, 0x1167f,\n\t0x116d0, 0x11fff,\n\t0x12480, 0x12fff,\n\t0x13430, 0x167ff,\n\t0x16a40, 0x16eff,\n\t0x16fa0, 0x1afff,\n\t0x1b100, 0x1cfff,\n\t0x1d250, 0x1d2ff,\n\t0x1d380, 0x1d3ff,\n\t0x1d800, 0x1edff,\n\t0x1ef00, 0x1efff,\n\t0x1f650, 0x1f67f,\n\t0x1f780, 0x1ffff,\n\t0x2a6e0, 0x2a6ff,\n\t0x2b820, 0x2f7ff,\n\t0x2fa20, 0xdffff,\n\t0xe0080, 0xe00ff,\n\t0xe01f0, 0xeffff,\n}; /* CR_In_No_Block */\n#endif /* USE_UNICODE_PROPERTIES */\n\nstatic const OnigCodePoint* const CodeRanges[] = {\n  CR_NEWLINE,\n  CR_Alpha,\n  CR_Blank,\n  CR_Cntrl,\n  CR_Digit,\n  CR_Graph,\n  CR_Lower,\n  CR_Print,\n  CR_Punct,\n  CR_Space,\n  CR_Upper,\n  CR_XDigit,\n  CR_Word,\n  CR_Alnum,\n  CR_ASCII,\n#ifdef USE_UNICODE_PROPERTIES\n  CR_Any,\n  CR_Assigned,\n  CR_C,\n  CR_Cc,\n  CR_Cf,\n  CR_Cn,\n  CR_Co,\n  CR_Cs,\n  CR_L,\n  CR_LC,\n  CR_Ll,\n  CR_Lm,\n  CR_Lo,\n  CR_Lt,\n  CR_Lu,\n  CR_M,\n  CR_Mc,\n  CR_Me,\n  CR_Mn,\n  CR_N,\n  CR_Nd,\n  CR_Nl,\n  CR_No,\n  CR_P,\n  CR_Pc,\n  CR_Pd,\n  CR_Pe,\n  CR_Pf,\n  CR_Pi,\n  CR_Po,\n  CR_Ps,\n  CR_S,\n  CR_Sc,\n  CR_Sk,\n  CR_Sm,\n  CR_So,\n  CR_Z,\n  CR_Zl,\n  CR_Zp,\n  CR_Zs,\n  CR_Math,\n  CR_Alphabetic,\n  CR_Lowercase,\n  CR_Uppercase,\n  CR_Cased,\n  CR_Case_Ignorable,\n  CR_Changes_When_Lowercased,\n  CR_Changes_When_Uppercased,\n  CR_Changes_When_Titlecased,\n  CR_Changes_When_Casefolded,\n  CR_Changes_When_Casemapped,\n  CR_ID_Start,\n  CR_ID_Continue,\n  CR_XID_Start,\n  CR_XID_Continue,\n  CR_Default_Ignorable_Code_Point,\n  CR_Grapheme_Extend,\n  CR_Grapheme_Base,\n  CR_Grapheme_Link,\n  CR_Common,\n  CR_Latin,\n  CR_Greek,\n  CR_Cyrillic,\n  CR_Armenian,\n  CR_Hebrew,\n  CR_Arabic,\n  CR_Syriac,\n  CR_Thaana,\n  CR_Devanagari,\n  CR_Bengali,\n  CR_Gurmukhi,\n  CR_Gujarati,\n  CR_Oriya,\n  CR_Tamil,\n  CR_Telugu,\n  CR_Kannada,\n  CR_Malayalam,\n  CR_Sinhala,\n  CR_Thai,\n  CR_Lao,\n  CR_Tibetan,\n  CR_Myanmar,\n  CR_Georgian,\n  CR_Hangul,\n  CR_Ethiopic,\n  CR_Cherokee,\n  CR_Canadian_Aboriginal,\n  CR_Ogham,\n  CR_Runic,\n  CR_Khmer,\n  CR_Mongolian,\n  CR_Hiragana,\n  CR_Katakana,\n  CR_Bopomofo,\n  CR_Han,\n  CR_Yi,\n  CR_Old_Italic,\n  CR_Gothic,\n  CR_Deseret,\n  CR_Inherited,\n  CR_Tagalog,\n  CR_Hanunoo,\n  CR_Buhid,\n  CR_Tagbanwa,\n  CR_Limbu,\n  CR_Tai_Le,\n  CR_Linear_B,\n  CR_Ugaritic,\n  CR_Shavian,\n  CR_Osmanya,\n  CR_Cypriot,\n  CR_Braille,\n  CR_Buginese,\n  CR_Coptic,\n  CR_New_Tai_Lue,\n  CR_Glagolitic,\n  CR_Tifinagh,\n  CR_Syloti_Nagri,\n  CR_Old_Persian,\n  CR_Kharoshthi,\n  CR_Balinese,\n  CR_Cuneiform,\n  CR_Phoenician,\n  CR_Phags_Pa,\n  CR_Nko,\n  CR_Sundanese,\n  CR_Lepcha,\n  CR_Ol_Chiki,\n  CR_Vai,\n  CR_Saurashtra,\n  CR_Kayah_Li,\n  CR_Rejang,\n  CR_Lycian,\n  CR_Carian,\n  CR_Lydian,\n  CR_Cham,\n  CR_Tai_Tham,\n  CR_Tai_Viet,\n  CR_Avestan,\n  CR_Egyptian_Hieroglyphs,\n  CR_Samaritan,\n  CR_Lisu,\n  CR_Bamum,\n  CR_Javanese,\n  CR_Meetei_Mayek,\n  CR_Imperial_Aramaic,\n  CR_Old_South_Arabian,\n  CR_Inscriptional_Parthian,\n  CR_Inscriptional_Pahlavi,\n  CR_Old_Turkic,\n  CR_Kaithi,\n  CR_Batak,\n  CR_Brahmi,\n  CR_Mandaic,\n  CR_Chakma,\n  CR_Meroitic_Cursive,\n  CR_Meroitic_Hieroglyphs,\n  CR_Miao,\n  CR_Sharada,\n  CR_Sora_Sompeng,\n  CR_Takri,\n  CR_White_Space,\n  CR_Bidi_Control,\n  CR_Join_Control,\n  CR_Dash,\n  CR_Hyphen,\n  CR_Quotation_Mark,\n  CR_Terminal_Punctuation,\n  CR_Other_Math,\n  CR_Hex_Digit,\n  CR_ASCII_Hex_Digit,\n  CR_Other_Alphabetic,\n  CR_Ideographic,\n  CR_Diacritic,\n  CR_Extender,\n  CR_Other_Lowercase,\n  CR_Other_Uppercase,\n  CR_Noncharacter_Code_Point,\n  CR_Other_Grapheme_Extend,\n  CR_IDS_Binary_Operator,\n  CR_IDS_Trinary_Operator,\n  CR_Radical,\n  CR_Unified_Ideograph,\n  CR_Other_Default_Ignorable_Code_Point,\n  CR_Deprecated,\n  CR_Soft_Dotted,\n  CR_Logical_Order_Exception,\n  CR_Other_ID_Start,\n  CR_Other_ID_Continue,\n  CR_STerm,\n  CR_Variation_Selector,\n  CR_Pattern_White_Space,\n  CR_Pattern_Syntax,\n  CR_Unknown,\n  CR_Age_1_1,\n  CR_Age_2_0,\n  CR_Age_2_1,\n  CR_Age_3_0,\n  CR_Age_3_1,\n  CR_Age_3_2,\n  CR_Age_4_0,\n  CR_Age_4_1,\n  CR_Age_5_0,\n  CR_Age_5_1,\n  CR_Age_5_2,\n  CR_Age_6_0,\n  CR_Age_6_1,\n  CR_In_Basic_Latin,\n  CR_In_Latin_1_Supplement,\n  CR_In_Latin_Extended_A,\n  CR_In_Latin_Extended_B,\n  CR_In_IPA_Extensions,\n  CR_In_Spacing_Modifier_Letters,\n  CR_In_Combining_Diacritical_Marks,\n  CR_In_Greek_and_Coptic,\n  CR_In_Cyrillic,\n  CR_In_Cyrillic_Supplement,\n  CR_In_Armenian,\n  CR_In_Hebrew,\n  CR_In_Arabic,\n  CR_In_Syriac,\n  CR_In_Arabic_Supplement,\n  CR_In_Thaana,\n  CR_In_NKo,\n  CR_In_Samaritan,\n  CR_In_Mandaic,\n  CR_In_Arabic_Extended_A,\n  CR_In_Devanagari,\n  CR_In_Bengali,\n  CR_In_Gurmukhi,\n  CR_In_Gujarati,\n  CR_In_Oriya,\n  CR_In_Tamil,\n  CR_In_Telugu,\n  CR_In_Kannada,\n  CR_In_Malayalam,\n  CR_In_Sinhala,\n  CR_In_Thai,\n  CR_In_Lao,\n  CR_In_Tibetan,\n  CR_In_Myanmar,\n  CR_In_Georgian,\n  CR_In_Hangul_Jamo,\n  CR_In_Ethiopic,\n  CR_In_Ethiopic_Supplement,\n  CR_In_Cherokee,\n  CR_In_Unified_Canadian_Aboriginal_Syllabics,\n  CR_In_Ogham,\n  CR_In_Runic,\n  CR_In_Tagalog,\n  CR_In_Hanunoo,\n  CR_In_Buhid,\n  CR_In_Tagbanwa,\n  CR_In_Khmer,\n  CR_In_Mongolian,\n  CR_In_Unified_Canadian_Aboriginal_Syllabics_Extended,\n  CR_In_Limbu,\n  CR_In_Tai_Le,\n  CR_In_New_Tai_Lue,\n  CR_In_Khmer_Symbols,\n  CR_In_Buginese,\n  CR_In_Tai_Tham,\n  CR_In_Balinese,\n  CR_In_Sundanese,\n  CR_In_Batak,\n  CR_In_Lepcha,\n  CR_In_Ol_Chiki,\n  CR_In_Sundanese_Supplement,\n  CR_In_Vedic_Extensions,\n  CR_In_Phonetic_Extensions,\n  CR_In_Phonetic_Extensions_Supplement,\n  CR_In_Combining_Diacritical_Marks_Supplement,\n  CR_In_Latin_Extended_Additional,\n  CR_In_Greek_Extended,\n  CR_In_General_Punctuation,\n  CR_In_Superscripts_and_Subscripts,\n  CR_In_Currency_Symbols,\n  CR_In_Combining_Diacritical_Marks_for_Symbols,\n  CR_In_Letterlike_Symbols,\n  CR_In_Number_Forms,\n  CR_In_Arrows,\n  CR_In_Mathematical_Operators,\n  CR_In_Miscellaneous_Technical,\n  CR_In_Control_Pictures,\n  CR_In_Optical_Character_Recognition,\n  CR_In_Enclosed_Alphanumerics,\n  CR_In_Box_Drawing,\n  CR_In_Block_Elements,\n  CR_In_Geometric_Shapes,\n  CR_In_Miscellaneous_Symbols,\n  CR_In_Dingbats,\n  CR_In_Miscellaneous_Mathematical_Symbols_A,\n  CR_In_Supplemental_Arrows_A,\n  CR_In_Braille_Patterns,\n  CR_In_Supplemental_Arrows_B,\n  CR_In_Miscellaneous_Mathematical_Symbols_B,\n  CR_In_Supplemental_Mathematical_Operators,\n  CR_In_Miscellaneous_Symbols_and_Arrows,\n  CR_In_Glagolitic,\n  CR_In_Latin_Extended_C,\n  CR_In_Coptic,\n  CR_In_Georgian_Supplement,\n  CR_In_Tifinagh,\n  CR_In_Ethiopic_Extended,\n  CR_In_Cyrillic_Extended_A,\n  CR_In_Supplemental_Punctuation,\n  CR_In_CJK_Radicals_Supplement,\n  CR_In_Kangxi_Radicals,\n  CR_In_Ideographic_Description_Characters,\n  CR_In_CJK_Symbols_and_Punctuation,\n  CR_In_Hiragana,\n  CR_In_Katakana,\n  CR_In_Bopomofo,\n  CR_In_Hangul_Compatibility_Jamo,\n  CR_In_Kanbun,\n  CR_In_Bopomofo_Extended,\n  CR_In_CJK_Strokes,\n  CR_In_Katakana_Phonetic_Extensions,\n  CR_In_Enclosed_CJK_Letters_and_Months,\n  CR_In_CJK_Compatibility,\n  CR_In_CJK_Unified_Ideographs_Extension_A,\n  CR_In_Yijing_Hexagram_Symbols,\n  CR_In_CJK_Unified_Ideographs,\n  CR_In_Yi_Syllables,\n  CR_In_Yi_Radicals,\n  CR_In_Lisu,\n  CR_In_Vai,\n  CR_In_Cyrillic_Extended_B,\n  CR_In_Bamum,\n  CR_In_Modifier_Tone_Letters,\n  CR_In_Latin_Extended_D,\n  CR_In_Syloti_Nagri,\n  CR_In_Common_Indic_Number_Forms,\n  CR_In_Phags_pa,\n  CR_In_Saurashtra,\n  CR_In_Devanagari_Extended,\n  CR_In_Kayah_Li,\n  CR_In_Rejang,\n  CR_In_Hangul_Jamo_Extended_A,\n  CR_In_Javanese,\n  CR_In_Cham,\n  CR_In_Myanmar_Extended_A,\n  CR_In_Tai_Viet,\n  CR_In_Meetei_Mayek_Extensions,\n  CR_In_Ethiopic_Extended_A,\n  CR_In_Meetei_Mayek,\n  CR_In_Hangul_Syllables,\n  CR_In_Hangul_Jamo_Extended_B,\n  CR_In_High_Surrogates,\n  CR_In_High_Private_Use_Surrogates,\n  CR_In_Low_Surrogates,\n  CR_In_Private_Use_Area,\n  CR_In_CJK_Compatibility_Ideographs,\n  CR_In_Alphabetic_Presentation_Forms,\n  CR_In_Arabic_Presentation_Forms_A,\n  CR_In_Variation_Selectors,\n  CR_In_Vertical_Forms,\n  CR_In_Combining_Half_Marks,\n  CR_In_CJK_Compatibility_Forms,\n  CR_In_Small_Form_Variants,\n  CR_In_Arabic_Presentation_Forms_B,\n  CR_In_Halfwidth_and_Fullwidth_Forms,\n  CR_In_Specials,\n  CR_In_Linear_B_Syllabary,\n  CR_In_Linear_B_Ideograms,\n  CR_In_Aegean_Numbers,\n  CR_In_Ancient_Greek_Numbers,\n  CR_In_Ancient_Symbols,\n  CR_In_Phaistos_Disc,\n  CR_In_Lycian,\n  CR_In_Carian,\n  CR_In_Old_Italic,\n  CR_In_Gothic,\n  CR_In_Ugaritic,\n  CR_In_Old_Persian,\n  CR_In_Deseret,\n  CR_In_Shavian,\n  CR_In_Osmanya,\n  CR_In_Cypriot_Syllabary,\n  CR_In_Imperial_Aramaic,\n  CR_In_Phoenician,\n  CR_In_Lydian,\n  CR_In_Meroitic_Hieroglyphs,\n  CR_In_Meroitic_Cursive,\n  CR_In_Kharoshthi,\n  CR_In_Old_South_Arabian,\n  CR_In_Avestan,\n  CR_In_Inscriptional_Parthian,\n  CR_In_Inscriptional_Pahlavi,\n  CR_In_Old_Turkic,\n  CR_In_Rumi_Numeral_Symbols,\n  CR_In_Brahmi,\n  CR_In_Kaithi,\n  CR_In_Sora_Sompeng,\n  CR_In_Chakma,\n  CR_In_Sharada,\n  CR_In_Takri,\n  CR_In_Cuneiform,\n  CR_In_Cuneiform_Numbers_and_Punctuation,\n  CR_In_Egyptian_Hieroglyphs,\n  CR_In_Bamum_Supplement,\n  CR_In_Miao,\n  CR_In_Kana_Supplement,\n  CR_In_Byzantine_Musical_Symbols,\n  CR_In_Musical_Symbols,\n  CR_In_Ancient_Greek_Musical_Notation,\n  CR_In_Tai_Xuan_Jing_Symbols,\n  CR_In_Counting_Rod_Numerals,\n  CR_In_Mathematical_Alphanumeric_Symbols,\n  CR_In_Arabic_Mathematical_Alphabetic_Symbols,\n  CR_In_Mahjong_Tiles,\n  CR_In_Domino_Tiles,\n  CR_In_Playing_Cards,\n  CR_In_Enclosed_Alphanumeric_Supplement,\n  CR_In_Enclosed_Ideographic_Supplement,\n  CR_In_Miscellaneous_Symbols_And_Pictographs,\n  CR_In_Emoticons,\n  CR_In_Transport_And_Map_Symbols,\n  CR_In_Alchemical_Symbols,\n  CR_In_CJK_Unified_Ideographs_Extension_B,\n  CR_In_CJK_Unified_Ideographs_Extension_C,\n  CR_In_CJK_Unified_Ideographs_Extension_D,\n  CR_In_CJK_Compatibility_Ideographs_Supplement,\n  CR_In_Tags,\n  CR_In_Variation_Selectors_Supplement,\n  CR_In_Supplementary_Private_Use_Area_A,\n  CR_In_Supplementary_Private_Use_Area_B,\n  CR_In_No_Block,\n#endif /* USE_UNICODE_PROPERTIES */\n};\n\nstatic const OnigCodePoint* const CodeScripts[] = {\n\tCR_Common,\n\tCR_Latin,\n\tCR_Greek,\n\tCR_Cyrillic,\n\tCR_Armenian,\n\tCR_Hebrew,\n\tCR_Arabic,\n\tCR_Syriac,\n\tCR_Thaana,\n\tCR_Devanagari,\n\tCR_Bengali,\n\tCR_Gurmukhi,\n\tCR_Gujarati,\n\tCR_Oriya,\n\tCR_Tamil,\n\tCR_Telugu,\n\tCR_Kannada,\n\tCR_Malayalam,\n\tCR_Sinhala,\n\tCR_Thai,\n\tCR_Lao,\n\tCR_Tibetan,\n\tCR_Myanmar,\n\tCR_Georgian,\n\tCR_Hangul,\n\tCR_Ethiopic,\n\tCR_Cherokee,\n\tCR_Canadian_Aboriginal,\n\tCR_Ogham,\n\tCR_Runic,\n\tCR_Khmer,\n\tCR_Mongolian,\n\tCR_Hiragana,\n\tCR_Katakana,\n\tCR_Bopomofo,\n\tCR_Han,\n\tCR_Yi,\n\tCR_Old_Italic,\n\tCR_Gothic,\n\tCR_Deseret,\n\tCR_Inherited,\n\tCR_Tagalog,\n\tCR_Hanunoo,\n\tCR_Buhid,\n\tCR_Tagbanwa,\n\tCR_Limbu,\n\tCR_Tai_Le,\n\tCR_Linear_B,\n\tCR_Ugaritic,\n\tCR_Shavian,\n\tCR_Osmanya,\n\tCR_Cypriot,\n\tCR_Braille,\n\tCR_Buginese,\n\tCR_Coptic,\n\tCR_New_Tai_Lue,\n\tCR_Glagolitic,\n\tCR_Tifinagh,\n\tCR_Syloti_Nagri,\n\tCR_Old_Persian,\n\tCR_Kharoshthi,\n\tCR_Balinese,\n\tCR_Cuneiform,\n\tCR_Phoenician,\n\tCR_Phags_Pa,\n\tCR_Nko,\n\tCR_Sundanese,\n\tCR_Lepcha,\n\tCR_Ol_Chiki,\n\tCR_Vai,\n\tCR_Saurashtra,\n\tCR_Kayah_Li,\n\tCR_Rejang,\n\tCR_Lycian,\n\tCR_Carian,\n\tCR_Lydian,\n\tCR_Cham,\n\tCR_Tai_Tham,\n\tCR_Tai_Viet,\n\tCR_Avestan,\n\tCR_Egyptian_Hieroglyphs,\n\tCR_Samaritan,\n\tCR_Lisu,\n\tCR_Bamum,\n\tCR_Javanese,\n\tCR_Meetei_Mayek,\n\tCR_Imperial_Aramaic,\n\tCR_Old_South_Arabian,\n\tCR_Inscriptional_Parthian,\n\tCR_Inscriptional_Pahlavi,\n\tCR_Old_Turkic,\n\tCR_Kaithi,\n\tCR_Batak,\n\tCR_Brahmi,\n\tCR_Mandaic,\n\tCR_Chakma,\n\tCR_Meroitic_Cursive,\n\tCR_Meroitic_Hieroglyphs,\n\tCR_Miao,\n\tCR_Sharada,\n\tCR_Sora_Sompeng,\n\tCR_Takri\n};\n\nstruct uniname2ctype_struct {\n  int name, ctype;\n};\n\nstatic const struct uniname2ctype_struct *uniname2ctype_p(const char *, unsigned int);\n\n#ifndef USE_UNICODE_PROPERTIES\n#define TOTAL_KEYWORDS 14\n#define MIN_WORD_LENGTH 4\n#define MAX_WORD_LENGTH 6\n#define MIN_HASH_VALUE 6\n#define MAX_HASH_VALUE 19\n/* maximum key range = 14, duplicates = 0 */\n#else /* USE_UNICODE_PROPERTIES */\n#define TOTAL_KEYWORDS 625\n#define MIN_WORD_LENGTH 1\n#define MAX_WORD_LENGTH 44\n#define MIN_HASH_VALUE 3\n#define MAX_HASH_VALUE 4167\n/* maximum key range = 4165, duplicates = 0 */\n#endif /* USE_UNICODE_PROPERTIES */\n\n#ifdef __GNUC__\n__inline\n#else\n#ifdef __cplusplus\ninline\n#endif\n#endif\nstatic unsigned int\nuniname2ctype_hash (str, len)\n     register const char *str;\n     register unsigned int len;\n{\n#ifndef USE_UNICODE_PROPERTIES\n  static const unsigned char asso_values[] =\n#else /* USE_UNICODE_PROPERTIES */\n  static const unsigned short asso_values[] =\n#endif /* USE_UNICODE_PROPERTIES */\n    {\n#ifndef USE_UNICODE_PROPERTIES\n      20, 20, 20, 20, 20, 20, 20, 20, 20, 20,\n      20, 20, 20, 20, 20, 20, 20, 20, 20, 20,\n      20, 20, 20, 20, 20, 20, 20, 20, 20, 20,\n      20, 20, 20, 20, 20, 20, 20, 20, 20, 20,\n      20, 20, 20, 20, 20, 20, 20, 20, 20, 20,\n      20, 20, 20, 20, 20, 20, 20, 20, 20, 20,\n      20, 20, 20, 20, 20, 20, 20, 20, 20, 20,\n      20, 20, 20, 20, 20, 20, 20, 20, 20, 20,\n      20, 20, 20, 20, 20, 20, 20, 20, 20, 20,\n      20, 20, 20, 20, 20, 20, 20,  3, 11,  5,\n       4, 20, 20,  9, 20,  1, 20, 20, 10, 20,\n       2, 20,  1, 20,  1,  7,  4,  6, 20,  1,\n       4, 20, 20, 20, 20, 20, 20, 20\n#else /* USE_UNICODE_PROPERTIES */\n      4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168,\n      4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168,\n      4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168,\n      4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168,\n      4168, 4168, 4168, 4168, 4168, 4168,    1, 4168,   13,    1,\n         3,   28,   31,   10,   27, 4168, 4168, 4168, 4168, 4168,\n      4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168,\n      4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168,\n      4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168, 4168,\n      4168, 4168, 4168, 4168, 4168, 4168, 4168,   13,  854,   14,\n       443,   19,    7,  570,  335,    4,   66, 1159,  102,   34,\n         1,  178,  474,    1,  192,    2,   64, 1117,  491,  264,\n       256, 1305,    3, 4168, 4168, 4168, 4168, 4168\n#endif /* USE_UNICODE_PROPERTIES */\n    };\n#ifndef USE_UNICODE_PROPERTIES\n  return len + asso_values[(unsigned char)str[2]] + asso_values[(unsigned char)str[0]];\n#else /* USE_UNICODE_PROPERTIES */\n  register int hval = len;\n\n  switch (hval)\n    {\n      default:\n        hval += asso_values[(unsigned char)str[15]];\n      /*FALLTHROUGH*/\n      case 15:\n      case 14:\n      case 13:\n      case 12:\n        hval += asso_values[(unsigned char)str[11]];\n      /*FALLTHROUGH*/\n      case 11:\n      case 10:\n      case 9:\n      case 8:\n      case 7:\n      case 6:\n        hval += asso_values[(unsigned char)str[5]];\n      /*FALLTHROUGH*/\n      case 5:\n        hval += asso_values[(unsigned char)str[4]];\n      /*FALLTHROUGH*/\n      case 4:\n      case 3:\n        hval += asso_values[(unsigned char)str[2]];\n      /*FALLTHROUGH*/\n      case 2:\n        hval += asso_values[(unsigned char)str[1]];\n      /*FALLTHROUGH*/\n      case 1:\n        hval += asso_values[(unsigned char)str[0]];\n        break;\n    }\n  return hval + asso_values[(unsigned char)str[len - 1]];\n#endif /* USE_UNICODE_PROPERTIES */\n}\n\nstruct uniname2ctype_pool_t\n  {\n#ifndef USE_UNICODE_PROPERTIES\n    char uniname2ctype_pool_str6[sizeof(\"word\")];\n    char uniname2ctype_pool_str7[sizeof(\"print\")];\n    char uniname2ctype_pool_str8[sizeof(\"punct\")];\n    char uniname2ctype_pool_str9[sizeof(\"alpha\")];\n    char uniname2ctype_pool_str10[sizeof(\"alnum\")];\n    char uniname2ctype_pool_str11[sizeof(\"xdigit\")];\n    char uniname2ctype_pool_str12[sizeof(\"upper\")];\n    char uniname2ctype_pool_str13[sizeof(\"ascii\")];\n    char uniname2ctype_pool_str14[sizeof(\"cntrl\")];\n    char uniname2ctype_pool_str15[sizeof(\"space\")];\n    char uniname2ctype_pool_str16[sizeof(\"lower\")];\n    char uniname2ctype_pool_str17[sizeof(\"graph\")];\n    char uniname2ctype_pool_str18[sizeof(\"digit\")];\n    char uniname2ctype_pool_str19[sizeof(\"blank\")];\n#else /* USE_UNICODE_PROPERTIES */\n    char uniname2ctype_pool_str3[sizeof(\"n\")];\n    char uniname2ctype_pool_str5[sizeof(\"s\")];\n    char uniname2ctype_pool_str7[sizeof(\"z\")];\n    char uniname2ctype_pool_str9[sizeof(\"zs\")];\n    char uniname2ctype_pool_str16[sizeof(\"zzzz\")];\n    char uniname2ctype_pool_str18[sizeof(\"cn\")];\n    char uniname2ctype_pool_str20[sizeof(\"cs\")];\n    char uniname2ctype_pool_str24[sizeof(\"ci\")];\n    char uniname2ctype_pool_str29[sizeof(\"c\")];\n    char uniname2ctype_pool_str30[sizeof(\"cf\")];\n    char uniname2ctype_pool_str32[sizeof(\"sc\")];\n    char uniname2ctype_pool_str34[sizeof(\"cans\")];\n    char uniname2ctype_pool_str35[sizeof(\"qaai\")];\n    char uniname2ctype_pool_str38[sizeof(\"mn\")];\n    char uniname2ctype_pool_str42[sizeof(\"ascii\")];\n    char uniname2ctype_pool_str44[sizeof(\"cc\")];\n    char uniname2ctype_pool_str45[sizeof(\"qaac\")];\n    char uniname2ctype_pool_str49[sizeof(\"inavestan\")];\n    char uniname2ctype_pool_str52[sizeof(\"inspecials\")];\n    char uniname2ctype_pool_str62[sizeof(\"inipaextensions\")];\n    char uniname2ctype_pool_str64[sizeof(\"mc\")];\n    char uniname2ctype_pool_str66[sizeof(\"insamaritan\")];\n    char uniname2ctype_pool_str69[sizeof(\"m\")];\n    char uniname2ctype_pool_str72[sizeof(\"sm\")];\n    char uniname2ctype_pool_str74[sizeof(\"me\")];\n    char uniname2ctype_pool_str82[sizeof(\"inarmenian\")];\n    char uniname2ctype_pool_str84[sizeof(\"incuneiform\")];\n    char uniname2ctype_pool_str86[sizeof(\"mandaic\")];\n    char uniname2ctype_pool_str90[sizeof(\"inancientsymbols\")];\n    char uniname2ctype_pool_str92[sizeof(\"incuneiformnumbersandpunctuation\")];\n    char uniname2ctype_pool_str96[sizeof(\"inthai\")];\n    char uniname2ctype_pool_str99[sizeof(\"inmusicalsymbols\")];\n    char uniname2ctype_pool_str100[sizeof(\"inmiscellaneoussymbols\")];\n    char uniname2ctype_pool_str106[sizeof(\"incham\")];\n    char uniname2ctype_pool_str109[sizeof(\"inmiscellaneoussymbolsandarrows\")];\n    char uniname2ctype_pool_str113[sizeof(\"initialpunctuation\")];\n    char uniname2ctype_pool_str114[sizeof(\"inmiscellaneoussymbolsandpictographs\")];\n    char uniname2ctype_pool_str116[sizeof(\"inthaana\")];\n    char uniname2ctype_pool_str124[sizeof(\"taile\")];\n    char uniname2ctype_pool_str125[sizeof(\"mtei\")];\n    char uniname2ctype_pool_str132[sizeof(\"lc\")];\n    char uniname2ctype_pool_str133[sizeof(\"lana\")];\n    char uniname2ctype_pool_str134[sizeof(\"inlycian\")];\n    char uniname2ctype_pool_str135[sizeof(\"intransportandmapsymbols\")];\n    char uniname2ctype_pool_str136[sizeof(\"incontrolpictures\")];\n    char uniname2ctype_pool_str142[sizeof(\"sinhala\")];\n    char uniname2ctype_pool_str151[sizeof(\"incommonindicnumberforms\")];\n    char uniname2ctype_pool_str156[sizeof(\"inmiscellaneousmathematicalsymbolsa\")];\n    char uniname2ctype_pool_str158[sizeof(\"sterm\")];\n    char uniname2ctype_pool_str167[sizeof(\"inmyanmarextendeda\")];\n    char uniname2ctype_pool_str172[sizeof(\"lm\")];\n    char uniname2ctype_pool_str175[sizeof(\"taiviet\")];\n    char uniname2ctype_pool_str179[sizeof(\"inlinearbideograms\")];\n    char uniname2ctype_pool_str180[sizeof(\"intaitham\")];\n    char uniname2ctype_pool_str184[sizeof(\"latn\")];\n    char uniname2ctype_pool_str186[sizeof(\"latin\")];\n    char uniname2ctype_pool_str187[sizeof(\"ital\")];\n    char uniname2ctype_pool_str189[sizeof(\"alnum\")];\n    char uniname2ctype_pool_str199[sizeof(\"inmalayalam\")];\n    char uniname2ctype_pool_str201[sizeof(\"intaile\")];\n    char uniname2ctype_pool_str202[sizeof(\"tale\")];\n    char uniname2ctype_pool_str205[sizeof(\"l\")];\n    char uniname2ctype_pool_str207[sizeof(\"nl\")];\n    char uniname2ctype_pool_str209[sizeof(\"zl\")];\n    char uniname2ctype_pool_str216[sizeof(\"intamil\")];\n    char uniname2ctype_pool_str217[sizeof(\"taml\")];\n    char uniname2ctype_pool_str218[sizeof(\"inlatinextendeda\")];\n    char uniname2ctype_pool_str220[sizeof(\"inlatinextendedc\")];\n    char uniname2ctype_pool_str223[sizeof(\"inrunic\")];\n    char uniname2ctype_pool_str224[sizeof(\"incarian\")];\n    char uniname2ctype_pool_str225[sizeof(\"insyriac\")];\n    char uniname2ctype_pool_str227[sizeof(\"cari\")];\n    char uniname2ctype_pool_str230[sizeof(\"inmeeteimayekextensions\")];\n    char uniname2ctype_pool_str231[sizeof(\"osma\")];\n    char uniname2ctype_pool_str232[sizeof(\"lt\")];\n    char uniname2ctype_pool_str233[sizeof(\"miao\")];\n    char uniname2ctype_pool_str234[sizeof(\"insharada\")];\n    char uniname2ctype_pool_str239[sizeof(\"incyrillic\")];\n    char uniname2ctype_pool_str240[sizeof(\"carian\")];\n    char uniname2ctype_pool_str244[sizeof(\"armn\")];\n    char uniname2ctype_pool_str245[sizeof(\"samr\")];\n    char uniname2ctype_pool_str247[sizeof(\"armi\")];\n    char uniname2ctype_pool_str248[sizeof(\"inideographicdescriptioncharacters\")];\n    char uniname2ctype_pool_str252[sizeof(\"inosmanya\")];\n    char uniname2ctype_pool_str253[sizeof(\"armenian\")];\n    char uniname2ctype_pool_str254[sizeof(\"inmyanmar\")];\n    char uniname2ctype_pool_str255[sizeof(\"samaritan\")];\n    char uniname2ctype_pool_str256[sizeof(\"arabic\")];\n    char uniname2ctype_pool_str259[sizeof(\"incherokee\")];\n    char uniname2ctype_pool_str261[sizeof(\"connectorpunctuation\")];\n    char uniname2ctype_pool_str263[sizeof(\"merc\")];\n    char uniname2ctype_pool_str264[sizeof(\"inmiscellaneoustechnical\")];\n    char uniname2ctype_pool_str268[sizeof(\"inenclosedalphanumerics\")];\n    char uniname2ctype_pool_str279[sizeof(\"inemoticons\")];\n    char uniname2ctype_pool_str281[sizeof(\"joinc\")];\n    char uniname2ctype_pool_str288[sizeof(\"cntrl\")];\n    char uniname2ctype_pool_str301[sizeof(\"inenclosedcjklettersandmonths\")];\n    char uniname2ctype_pool_str303[sizeof(\"cwcf\")];\n    char uniname2ctype_pool_str304[sizeof(\"inruminumeralsymbols\")];\n    char uniname2ctype_pool_str308[sizeof(\"ll\")];\n    char uniname2ctype_pool_str313[sizeof(\"term\")];\n    char uniname2ctype_pool_str316[sizeof(\"inlatinextendedadditional\")];\n    char uniname2ctype_pool_str320[sizeof(\"tamil\")];\n    char uniname2ctype_pool_str321[sizeof(\"loe\")];\n    char uniname2ctype_pool_str329[sizeof(\"newtailue\")];\n    char uniname2ctype_pool_str330[sizeof(\"cwcm\")];\n    char uniname2ctype_pool_str339[sizeof(\"inenclosedalphanumericsupplement\")];\n    char uniname2ctype_pool_str346[sizeof(\"sinh\")];\n    char uniname2ctype_pool_str347[sizeof(\"zinh\")];\n    char uniname2ctype_pool_str349[sizeof(\"meroiticcursive\")];\n    char uniname2ctype_pool_str353[sizeof(\"han\")];\n    char uniname2ctype_pool_str357[sizeof(\"hani\")];\n    char uniname2ctype_pool_str358[sizeof(\"inopticalcharacterrecognition\")];\n    char uniname2ctype_pool_str359[sizeof(\"no\")];\n    char uniname2ctype_pool_str360[sizeof(\"so\")];\n    char uniname2ctype_pool_str364[sizeof(\"innewtailue\")];\n    char uniname2ctype_pool_str365[sizeof(\"insinhala\")];\n    char uniname2ctype_pool_str367[sizeof(\"innko\")];\n    char uniname2ctype_pool_str372[sizeof(\"co\")];\n    char uniname2ctype_pool_str375[sizeof(\"shavian\")];\n    char uniname2ctype_pool_str378[sizeof(\"terminalpunctuation\")];\n    char uniname2ctype_pool_str386[sizeof(\"intaixuanjingsymbols\")];\n    char uniname2ctype_pool_str387[sizeof(\"inethiopic\")];\n    char uniname2ctype_pool_str389[sizeof(\"sora\")];\n    char uniname2ctype_pool_str398[sizeof(\"inarrows\")];\n    char uniname2ctype_pool_str400[sizeof(\"cham\")];\n    char uniname2ctype_pool_str403[sizeof(\"inlowsurrogates\")];\n    char uniname2ctype_pool_str405[sizeof(\"oriya\")];\n    char uniname2ctype_pool_str406[sizeof(\"ext\")];\n    char uniname2ctype_pool_str409[sizeof(\"cwt\")];\n    char uniname2ctype_pool_str412[sizeof(\"common\")];\n    char uniname2ctype_pool_str414[sizeof(\"inmiao\")];\n    char uniname2ctype_pool_str420[sizeof(\"thai\")];\n    char uniname2ctype_pool_str425[sizeof(\"intifinagh\")];\n    char uniname2ctype_pool_str426[sizeof(\"ethi\")];\n    char uniname2ctype_pool_str427[sizeof(\"mero\")];\n    char uniname2ctype_pool_str428[sizeof(\"chakma\")];\n    char uniname2ctype_pool_str429[sizeof(\"thaa\")];\n    char uniname2ctype_pool_str430[sizeof(\"inscriptionalparthian\")];\n    char uniname2ctype_pool_str432[sizeof(\"tifinagh\")];\n    char uniname2ctype_pool_str436[sizeof(\"titlecaseletter\")];\n    char uniname2ctype_pool_str445[sizeof(\"thaana\")];\n    char uniname2ctype_pool_str449[sizeof(\"asciihexdigit\")];\n    char uniname2ctype_pool_str450[sizeof(\"math\")];\n    char uniname2ctype_pool_str453[sizeof(\"di\")];\n    char uniname2ctype_pool_str454[sizeof(\"ids\")];\n    char uniname2ctype_pool_str460[sizeof(\"lo\")];\n    char uniname2ctype_pool_str468[sizeof(\"inlao\")];\n    char uniname2ctype_pool_str470[sizeof(\"taitham\")];\n    char uniname2ctype_pool_str474[sizeof(\"lao\")];\n    char uniname2ctype_pool_str475[sizeof(\"laoo\")];\n    char uniname2ctype_pool_str476[sizeof(\"dia\")];\n    char uniname2ctype_pool_str478[sizeof(\"idc\")];\n    char uniname2ctype_pool_str480[sizeof(\"ps\")];\n    char uniname2ctype_pool_str481[sizeof(\"insundanese\")];\n    char uniname2ctype_pool_str484[sizeof(\"pi\")];\n    char uniname2ctype_pool_str485[sizeof(\"cwl\")];\n    char uniname2ctype_pool_str490[sizeof(\"pf\")];\n    char uniname2ctype_pool_str495[sizeof(\"mand\")];\n    char uniname2ctype_pool_str496[sizeof(\"insylotinagri\")];\n    char uniname2ctype_pool_str497[sizeof(\"vs\")];\n    char uniname2ctype_pool_str503[sizeof(\"mongolian\")];\n    char uniname2ctype_pool_str504[sizeof(\"pc\")];\n    char uniname2ctype_pool_str506[sizeof(\"inmandaic\")];\n    char uniname2ctype_pool_str509[sizeof(\"invai\")];\n    char uniname2ctype_pool_str511[sizeof(\"lineseparator\")];\n    char uniname2ctype_pool_str514[sizeof(\"pe\")];\n    char uniname2ctype_pool_str515[sizeof(\"vai\")];\n    char uniname2ctype_pool_str516[sizeof(\"vaii\")];\n    char uniname2ctype_pool_str517[sizeof(\"idst\")];\n    char uniname2ctype_pool_str520[sizeof(\"indominotiles\")];\n    char uniname2ctype_pool_str521[sizeof(\"inshavian\")];\n    char uniname2ctype_pool_str522[sizeof(\"inspacingmodifierletters\")];\n    char uniname2ctype_pool_str524[sizeof(\"format\")];\n    char uniname2ctype_pool_str528[sizeof(\"inphaistosdisc\")];\n    char uniname2ctype_pool_str531[sizeof(\"hano\")];\n    char uniname2ctype_pool_str532[sizeof(\"space\")];\n    char uniname2ctype_pool_str542[sizeof(\"indeseret\")];\n    char uniname2ctype_pool_str545[sizeof(\"inolchiki\")];\n    char uniname2ctype_pool_str548[sizeof(\"hira\")];\n    char uniname2ctype_pool_str553[sizeof(\"joincontrol\")];\n    char uniname2ctype_pool_str555[sizeof(\"idcontinue\")];\n    char uniname2ctype_pool_str558[sizeof(\"inmahjongtiles\")];\n    char uniname2ctype_pool_str560[sizeof(\"patws\")];\n    char uniname2ctype_pool_str563[sizeof(\"inlydian\")];\n    char uniname2ctype_pool_str564[sizeof(\"cher\")];\n    char uniname2ctype_pool_str568[sizeof(\"inhiragana\")];\n    char uniname2ctype_pool_str572[sizeof(\"inogham\")];\n    char uniname2ctype_pool_str574[sizeof(\"avst\")];\n    char uniname2ctype_pool_str575[sizeof(\"inscriptionalpahlavi\")];\n    char uniname2ctype_pool_str579[sizeof(\"incoptic\")];\n    char uniname2ctype_pool_str587[sizeof(\"java\")];\n    char uniname2ctype_pool_str589[sizeof(\"inmathematicalalphanumericsymbols\")];\n    char uniname2ctype_pool_str594[sizeof(\"letter\")];\n    char uniname2ctype_pool_str604[sizeof(\"injavanese\")];\n    char uniname2ctype_pool_str608[sizeof(\"avestan\")];\n    char uniname2ctype_pool_str612[sizeof(\"age=1.1\")];\n    char uniname2ctype_pool_str613[sizeof(\"lepc\")];\n    char uniname2ctype_pool_str614[sizeof(\"age=2.1\")];\n    char uniname2ctype_pool_str616[sizeof(\"inlepcha\")];\n    char uniname2ctype_pool_str617[sizeof(\"javanese\")];\n    char uniname2ctype_pool_str618[sizeof(\"shaw\")];\n    char uniname2ctype_pool_str619[sizeof(\"finalpunctuation\")];\n    char uniname2ctype_pool_str620[sizeof(\"alpha\")];\n    char uniname2ctype_pool_str621[sizeof(\"age=5.1\")];\n    char uniname2ctype_pool_str622[sizeof(\"inmongolian\")];\n    char uniname2ctype_pool_str623[sizeof(\"age=5.2\")];\n    char uniname2ctype_pool_str626[sizeof(\"age=2.0\")];\n    char uniname2ctype_pool_str627[sizeof(\"ahex\")];\n    char uniname2ctype_pool_str630[sizeof(\"ingeneralpunctuation\")];\n    char uniname2ctype_pool_str631[sizeof(\"oids\")];\n    char uniname2ctype_pool_str632[sizeof(\"odi\")];\n    char uniname2ctype_pool_str633[sizeof(\"age=5.0\")];\n    char uniname2ctype_pool_str636[sizeof(\"tavt\")];\n    char uniname2ctype_pool_str637[sizeof(\"intaiviet\")];\n    char uniname2ctype_pool_str638[sizeof(\"age=6.1\")];\n    char uniname2ctype_pool_str639[sizeof(\"age=3.1\")];\n    char uniname2ctype_pool_str640[sizeof(\"insundanesesupplement\")];\n    char uniname2ctype_pool_str641[sizeof(\"age=3.2\")];\n    char uniname2ctype_pool_str642[sizeof(\"age=4.1\")];\n    char uniname2ctype_pool_str643[sizeof(\"oidc\")];\n    char uniname2ctype_pool_str646[sizeof(\"tfng\")];\n    char uniname2ctype_pool_str647[sizeof(\"insmallformvariants\")];\n    char uniname2ctype_pool_str648[sizeof(\"ideo\")];\n    char uniname2ctype_pool_str649[sizeof(\"intags\")];\n    char uniname2ctype_pool_str650[sizeof(\"age=6.0\")];\n    char uniname2ctype_pool_str651[sizeof(\"age=3.0\")];\n    char uniname2ctype_pool_str653[sizeof(\"whitespace\")];\n    char uniname2ctype_pool_str654[sizeof(\"age=4.0\")];\n    char uniname2ctype_pool_str655[sizeof(\"inolditalic\")];\n    char uniname2ctype_pool_str660[sizeof(\"oalpha\")];\n    char uniname2ctype_pool_str668[sizeof(\"ingujarati\")];\n    char uniname2ctype_pool_str672[sizeof(\"control\")];\n    char uniname2ctype_pool_str679[sizeof(\"diacritic\")];\n    char uniname2ctype_pool_str682[sizeof(\"tagbanwa\")];\n    char uniname2ctype_pool_str690[sizeof(\"inphoenician\")];\n    char uniname2ctype_pool_str701[sizeof(\"ininscriptionalparthian\")];\n    char uniname2ctype_pool_str703[sizeof(\"ininscriptionalpahlavi\")];\n    char uniname2ctype_pool_str704[sizeof(\"coptic\")];\n    char uniname2ctype_pool_str705[sizeof(\"dsrt\")];\n    char uniname2ctype_pool_str706[sizeof(\"inmodifiertoneletters\")];\n    char uniname2ctype_pool_str709[sizeof(\"xids\")];\n    char uniname2ctype_pool_str713[sizeof(\"hanunoo\")];\n    char uniname2ctype_pool_str715[sizeof(\"inoldturkic\")];\n    char uniname2ctype_pool_str721[sizeof(\"xidc\")];\n    char uniname2ctype_pool_str725[sizeof(\"idstart\")];\n    char uniname2ctype_pool_str729[sizeof(\"inimperialaramaic\")];\n    char uniname2ctype_pool_str730[sizeof(\"invariationselectors\")];\n    char uniname2ctype_pool_str734[sizeof(\"copt\")];\n    char uniname2ctype_pool_str737[sizeof(\"caseignorable\")];\n    char uniname2ctype_pool_str738[sizeof(\"prti\")];\n    char uniname2ctype_pool_str739[sizeof(\"nchar\")];\n    char uniname2ctype_pool_str746[sizeof(\"deseret\")];\n    char uniname2ctype_pool_str747[sizeof(\"decimalnumber\")];\n    char uniname2ctype_pool_str748[sizeof(\"cprt\")];\n    char uniname2ctype_pool_str750[sizeof(\"inlatin1supplement\")];\n    char uniname2ctype_pool_str771[sizeof(\"imperialaramaic\")];\n    char uniname2ctype_pool_str776[sizeof(\"privateuse\")];\n    char uniname2ctype_pool_str777[sizeof(\"casedletter\")];\n    char uniname2ctype_pool_str778[sizeof(\"lowercase\")];\n    char uniname2ctype_pool_str780[sizeof(\"spaceseparator\")];\n    char uniname2ctype_pool_str784[sizeof(\"radical\")];\n    char uniname2ctype_pool_str787[sizeof(\"mong\")];\n    char uniname2ctype_pool_str788[sizeof(\"canadianaboriginal\")];\n    char uniname2ctype_pool_str792[sizeof(\"letternumber\")];\n    char uniname2ctype_pool_str796[sizeof(\"insorasompeng\")];\n    char uniname2ctype_pool_str797[sizeof(\"dash\")];\n    char uniname2ctype_pool_str798[sizeof(\"wspace\")];\n    char uniname2ctype_pool_str799[sizeof(\"ogam\")];\n    char uniname2ctype_pool_str802[sizeof(\"invariationselectorssupplement\")];\n    char uniname2ctype_pool_str803[sizeof(\"print\")];\n    char uniname2ctype_pool_str811[sizeof(\"otheridcontinue\")];\n    char uniname2ctype_pool_str815[sizeof(\"ingurmukhi\")];\n    char uniname2ctype_pool_str818[sizeof(\"closepunctuation\")];\n    char uniname2ctype_pool_str823[sizeof(\"olditalic\")];\n    char uniname2ctype_pool_str824[sizeof(\"noncharactercodepoint\")];\n    char uniname2ctype_pool_str826[sizeof(\"sharada\")];\n    char uniname2ctype_pool_str827[sizeof(\"ingeometricshapes\")];\n    char uniname2ctype_pool_str830[sizeof(\"otheralphabetic\")];\n    char uniname2ctype_pool_str831[sizeof(\"patternwhitespace\")];\n    char uniname2ctype_pool_str832[sizeof(\"po\")];\n    char uniname2ctype_pool_str833[sizeof(\"rjng\")];\n    char uniname2ctype_pool_str835[sizeof(\"ingreekandcoptic\")];\n    char uniname2ctype_pool_str841[sizeof(\"xdigit\")];\n    char uniname2ctype_pool_str850[sizeof(\"gothic\")];\n    char uniname2ctype_pool_str851[sizeof(\"inoldsoutharabian\")];\n    char uniname2ctype_pool_str852[sizeof(\"xidstart\")];\n    char uniname2ctype_pool_str854[sizeof(\"inrejang\")];\n    char uniname2ctype_pool_str860[sizeof(\"idsbinaryoperator\")];\n    char uniname2ctype_pool_str867[sizeof(\"olower\")];\n    char uniname2ctype_pool_str869[sizeof(\"hex\")];\n    char uniname2ctype_pool_str870[sizeof(\"inenclosedideographicsupplement\")];\n    char uniname2ctype_pool_str874[sizeof(\"inalphabeticpresentationforms\")];\n    char uniname2ctype_pool_str879[sizeof(\"inbasiclatin\")];\n    char uniname2ctype_pool_str884[sizeof(\"othersymbol\")];\n    char uniname2ctype_pool_str889[sizeof(\"nd\")];\n    char uniname2ctype_pool_str890[sizeof(\"sd\")];\n    char uniname2ctype_pool_str900[sizeof(\"omath\")];\n    char uniname2ctype_pool_str901[sizeof(\"separator\")];\n    char uniname2ctype_pool_str907[sizeof(\"inarabic\")];\n    char uniname2ctype_pool_str912[sizeof(\"xidcontinue\")];\n    char uniname2ctype_pool_str913[sizeof(\"otheridstart\")];\n    char uniname2ctype_pool_str914[sizeof(\"grext\")];\n    char uniname2ctype_pool_str917[sizeof(\"otherlowercase\")];\n    char uniname2ctype_pool_str919[sizeof(\"phli\")];\n    char uniname2ctype_pool_str920[sizeof(\"cased\")];\n    char uniname2ctype_pool_str923[sizeof(\"hang\")];\n    char uniname2ctype_pool_str931[sizeof(\"xpeo\")];\n    char uniname2ctype_pool_str933[sizeof(\"lower\")];\n    char uniname2ctype_pool_str936[sizeof(\"modifierletter\")];\n    char uniname2ctype_pool_str938[sizeof(\"inphoneticextensions\")];\n    char uniname2ctype_pool_str939[sizeof(\"inarabicpresentationformsa\")];\n    char uniname2ctype_pool_str943[sizeof(\"innumberforms\")];\n    char uniname2ctype_pool_str945[sizeof(\"oldpersian\")];\n    char uniname2ctype_pool_str946[sizeof(\"incyrillicextendeda\")];\n    char uniname2ctype_pool_str947[sizeof(\"inverticalforms\")];\n    char uniname2ctype_pool_str949[sizeof(\"p\")];\n    char uniname2ctype_pool_str950[sizeof(\"inbyzantinemusicalsymbols\")];\n    char uniname2ctype_pool_str951[sizeof(\"inmathematicaloperators\")];\n    char uniname2ctype_pool_str952[sizeof(\"intibetan\")];\n    char uniname2ctype_pool_str953[sizeof(\"zp\")];\n    char uniname2ctype_pool_str956[sizeof(\"ingeorgian\")];\n    char uniname2ctype_pool_str960[sizeof(\"inbraillepatterns\")];\n    char uniname2ctype_pool_str962[sizeof(\"lepcha\")];\n    char uniname2ctype_pool_str963[sizeof(\"geor\")];\n    char uniname2ctype_pool_str964[sizeof(\"invedicextensions\")];\n    char uniname2ctype_pool_str965[sizeof(\"linb\")];\n    char uniname2ctype_pool_str966[sizeof(\"other\")];\n    char uniname2ctype_pool_str970[sizeof(\"deva\")];\n    char uniname2ctype_pool_str972[sizeof(\"indevanagari\")];\n    char uniname2ctype_pool_str973[sizeof(\"othernumber\")];\n    char uniname2ctype_pool_str974[sizeof(\"bamum\")];\n    char uniname2ctype_pool_str976[sizeof(\"shrd\")];\n    char uniname2ctype_pool_str977[sizeof(\"bali\")];\n    char uniname2ctype_pool_str981[sizeof(\"devanagari\")];\n    char uniname2ctype_pool_str983[sizeof(\"extender\")];\n    char uniname2ctype_pool_str988[sizeof(\"inherited\")];\n    char uniname2ctype_pool_str989[sizeof(\"glagolitic\")];\n    char uniname2ctype_pool_str990[sizeof(\"tibt\")];\n    char uniname2ctype_pool_str994[sizeof(\"inbalinese\")];\n    char uniname2ctype_pool_str996[sizeof(\"ingothic\")];\n    char uniname2ctype_pool_str997[sizeof(\"inmiscellaneousmathematicalsymbolsb\")];\n    char uniname2ctype_pool_str998[sizeof(\"limb\")];\n    char uniname2ctype_pool_str1000[sizeof(\"bengali\")];\n    char uniname2ctype_pool_str1003[sizeof(\"phoenician\")];\n    char uniname2ctype_pool_str1004[sizeof(\"insuperscriptsandsubscripts\")];\n    char uniname2ctype_pool_str1006[sizeof(\"inmeroitichieroglyphs\")];\n    char uniname2ctype_pool_str1007[sizeof(\"tibetan\")];\n    char uniname2ctype_pool_str1010[sizeof(\"inphoneticextensionssupplement\")];\n    char uniname2ctype_pool_str1016[sizeof(\"balinese\")];\n    char uniname2ctype_pool_str1021[sizeof(\"lowercaseletter\")];\n    char uniname2ctype_pool_str1031[sizeof(\"indingbats\")];\n    char uniname2ctype_pool_str1035[sizeof(\"inprivateusearea\")];\n    char uniname2ctype_pool_str1039[sizeof(\"assigned\")];\n    char uniname2ctype_pool_str1044[sizeof(\"patternsyntax\")];\n    char uniname2ctype_pool_str1051[sizeof(\"inhangulsyllables\")];\n    char uniname2ctype_pool_str1065[sizeof(\"sarb\")];\n    char uniname2ctype_pool_str1067[sizeof(\"brai\")];\n    char uniname2ctype_pool_str1069[sizeof(\"insupplementalmathematicaloperators\")];\n    char uniname2ctype_pool_str1070[sizeof(\"phnx\")];\n    char uniname2ctype_pool_str1072[sizeof(\"ingreekextended\")];\n    char uniname2ctype_pool_str1074[sizeof(\"otherletter\")];\n    char uniname2ctype_pool_str1076[sizeof(\"arab\")];\n    char uniname2ctype_pool_str1078[sizeof(\"inlatinextendedd\")];\n    char uniname2ctype_pool_str1081[sizeof(\"word\")];\n    char uniname2ctype_pool_str1084[sizeof(\"inphagspa\")];\n    char uniname2ctype_pool_str1087[sizeof(\"inblockelements\")];\n    char uniname2ctype_pool_str1092[sizeof(\"ethiopic\")];\n    char uniname2ctype_pool_str1094[sizeof(\"inethiopicextendeda\")];\n    char uniname2ctype_pool_str1107[sizeof(\"brahmi\")];\n    char uniname2ctype_pool_str1110[sizeof(\"logicalorderexception\")];\n    char uniname2ctype_pool_str1114[sizeof(\"inoldpersian\")];\n    char uniname2ctype_pool_str1129[sizeof(\"inletterlikesymbols\")];\n    char uniname2ctype_pool_str1133[sizeof(\"sorasompeng\")];\n    char uniname2ctype_pool_str1135[sizeof(\"hiragana\")];\n    char uniname2ctype_pool_str1142[sizeof(\"inhanguljamoextendeda\")];\n    char uniname2ctype_pool_str1147[sizeof(\"othermath\")];\n    char uniname2ctype_pool_str1150[sizeof(\"digit\")];\n    char uniname2ctype_pool_str1151[sizeof(\"goth\")];\n    char uniname2ctype_pool_str1156[sizeof(\"ogham\")];\n    char uniname2ctype_pool_str1162[sizeof(\"sundanese\")];\n    char uniname2ctype_pool_str1170[sizeof(\"saurashtra\")];\n    char uniname2ctype_pool_str1173[sizeof(\"linearb\")];\n    char uniname2ctype_pool_str1179[sizeof(\"graphemebase\")];\n    char uniname2ctype_pool_str1185[sizeof(\"inunifiedcanadianaboriginalsyllabics\")];\n    char uniname2ctype_pool_str1186[sizeof(\"cuneiform\")];\n    char uniname2ctype_pool_str1188[sizeof(\"inkannada\")];\n    char uniname2ctype_pool_str1190[sizeof(\"kana\")];\n    char uniname2ctype_pool_str1195[sizeof(\"inancientgreeknumbers\")];\n    char uniname2ctype_pool_str1196[sizeof(\"incjkstrokes\")];\n    char uniname2ctype_pool_str1198[sizeof(\"inglagolitic\")];\n    char uniname2ctype_pool_str1202[sizeof(\"inancientgreekmusicalnotation\")];\n    char uniname2ctype_pool_str1212[sizeof(\"inchakma\")];\n    char uniname2ctype_pool_str1215[sizeof(\"plrd\")];\n    char uniname2ctype_pool_str1219[sizeof(\"inbrahmi\")];\n    char uniname2ctype_pool_str1224[sizeof(\"cakm\")];\n    char uniname2ctype_pool_str1225[sizeof(\"incjkcompatibilityforms\")];\n    char uniname2ctype_pool_str1229[sizeof(\"lisu\")];\n    char uniname2ctype_pool_str1230[sizeof(\"incjkcompatibilityideographs\")];\n    char uniname2ctype_pool_str1231[sizeof(\"intagalog\")];\n    char uniname2ctype_pool_str1244[sizeof(\"inkaithi\")];\n    char uniname2ctype_pool_str1245[sizeof(\"insupplementalarrowsa\")];\n    char uniname2ctype_pool_str1249[sizeof(\"takri\")];\n    char uniname2ctype_pool_str1253[sizeof(\"ideographic\")];\n    char uniname2ctype_pool_str1256[sizeof(\"hexdigit\")];\n    char uniname2ctype_pool_str1259[sizeof(\"glag\")];\n    char uniname2ctype_pool_str1261[sizeof(\"softdotted\")];\n    char uniname2ctype_pool_str1262[sizeof(\"variationselector\")];\n    char uniname2ctype_pool_str1264[sizeof(\"inkatakana\")];\n    char uniname2ctype_pool_str1265[sizeof(\"meeteimayek\")];\n    char uniname2ctype_pool_str1274[sizeof(\"otherpunctuation\")];\n    char uniname2ctype_pool_str1279[sizeof(\"inhanguljamo\")];\n    char uniname2ctype_pool_str1282[sizeof(\"kali\")];\n    char uniname2ctype_pool_str1289[sizeof(\"braille\")];\n    char uniname2ctype_pool_str1298[sizeof(\"incombininghalfmarks\")];\n    char uniname2ctype_pool_str1300[sizeof(\"talu\")];\n    char uniname2ctype_pool_str1302[sizeof(\"incjkcompatibilityideographssupplement\")];\n    char uniname2ctype_pool_str1306[sizeof(\"telu\")];\n    char uniname2ctype_pool_str1307[sizeof(\"idsb\")];\n    char uniname2ctype_pool_str1310[sizeof(\"tglg\")];\n    char uniname2ctype_pool_str1313[sizeof(\"inmeeteimayek\")];\n    char uniname2ctype_pool_str1315[sizeof(\"yi\")];\n    char uniname2ctype_pool_str1318[sizeof(\"phagspa\")];\n    char uniname2ctype_pool_str1321[sizeof(\"yiii\")];\n    char uniname2ctype_pool_str1323[sizeof(\"inarabicmathematicalalphabeticsymbols\")];\n    char uniname2ctype_pool_str1328[sizeof(\"saur\")];\n    char uniname2ctype_pool_str1330[sizeof(\"ogrext\")];\n    char uniname2ctype_pool_str1334[sizeof(\"bidic\")];\n    char uniname2ctype_pool_str1341[sizeof(\"inkanasupplement\")];\n    char uniname2ctype_pool_str1343[sizeof(\"runic\")];\n    char uniname2ctype_pool_str1344[sizeof(\"inalchemicalsymbols\")];\n    char uniname2ctype_pool_str1350[sizeof(\"georgian\")];\n    char uniname2ctype_pool_str1351[sizeof(\"inugaritic\")];\n    char uniname2ctype_pool_str1354[sizeof(\"insaurashtra\")];\n    char uniname2ctype_pool_str1356[sizeof(\"inhighprivateusesurrogates\")];\n    char uniname2ctype_pool_str1362[sizeof(\"pd\")];\n    char uniname2ctype_pool_str1372[sizeof(\"incountingrodnumerals\")];\n    char uniname2ctype_pool_str1377[sizeof(\"inarabicextendeda\")];\n    char uniname2ctype_pool_str1389[sizeof(\"inkharoshthi\")];\n    char uniname2ctype_pool_str1393[sizeof(\"idstrinaryoperator\")];\n    char uniname2ctype_pool_str1396[sizeof(\"phag\")];\n    char uniname2ctype_pool_str1398[sizeof(\"brah\")];\n    char uniname2ctype_pool_str1402[sizeof(\"mark\")];\n    char uniname2ctype_pool_str1404[sizeof(\"hebr\")];\n    char uniname2ctype_pool_str1411[sizeof(\"inkhmersymbols\")];\n    char uniname2ctype_pool_str1413[sizeof(\"dep\")];\n    char uniname2ctype_pool_str1416[sizeof(\"inkhmer\")];\n    char uniname2ctype_pool_str1422[sizeof(\"deprecated\")];\n    char uniname2ctype_pool_str1424[sizeof(\"rejang\")];\n    char uniname2ctype_pool_str1429[sizeof(\"lyci\")];\n    char uniname2ctype_pool_str1431[sizeof(\"intakri\")];\n    char uniname2ctype_pool_str1432[sizeof(\"takr\")];\n    char uniname2ctype_pool_str1435[sizeof(\"incyrillicsupplement\")];\n    char uniname2ctype_pool_str1436[sizeof(\"changeswhencasefolded\")];\n    char uniname2ctype_pool_str1438[sizeof(\"indevanagariextended\")];\n    char uniname2ctype_pool_str1442[sizeof(\"lycian\")];\n    char uniname2ctype_pool_str1443[sizeof(\"inbengali\")];\n    char uniname2ctype_pool_str1448[sizeof(\"beng\")];\n    char uniname2ctype_pool_str1450[sizeof(\"graph\")];\n    char uniname2ctype_pool_str1452[sizeof(\"inyijinghexagramsymbols\")];\n    char uniname2ctype_pool_str1457[sizeof(\"olck\")];\n    char uniname2ctype_pool_str1460[sizeof(\"inarabicsupplement\")];\n    char uniname2ctype_pool_str1462[sizeof(\"inbuginese\")];\n    char uniname2ctype_pool_str1463[sizeof(\"changeswhencasemapped\")];\n    char uniname2ctype_pool_str1468[sizeof(\"olchiki\")];\n    char uniname2ctype_pool_str1478[sizeof(\"inaegeannumbers\")];\n    char uniname2ctype_pool_str1479[sizeof(\"mlym\")];\n    char uniname2ctype_pool_str1480[sizeof(\"alphabetic\")];\n    char uniname2ctype_pool_str1492[sizeof(\"sylotinagri\")];\n    char uniname2ctype_pool_str1498[sizeof(\"changeswhentitlecased\")];\n    char uniname2ctype_pool_str1504[sizeof(\"tagalog\")];\n    char uniname2ctype_pool_str1505[sizeof(\"tagb\")];\n    char uniname2ctype_pool_str1506[sizeof(\"runr\")];\n    char uniname2ctype_pool_str1510[sizeof(\"malayalam\")];\n    char uniname2ctype_pool_str1512[sizeof(\"inoriya\")];\n    char uniname2ctype_pool_str1516[sizeof(\"intagbanwa\")];\n    char uniname2ctype_pool_str1517[sizeof(\"syrc\")];\n    char uniname2ctype_pool_str1519[sizeof(\"nko\")];\n    char uniname2ctype_pool_str1520[sizeof(\"nkoo\")];\n    char uniname2ctype_pool_str1523[sizeof(\"inethiopicextended\")];\n    char uniname2ctype_pool_str1525[sizeof(\"kaithi\")];\n    char uniname2ctype_pool_str1530[sizeof(\"mathsymbol\")];\n    char uniname2ctype_pool_str1531[sizeof(\"inyiradicals\")];\n    char uniname2ctype_pool_str1536[sizeof(\"insupplementaryprivateuseareaa\")];\n    char uniname2ctype_pool_str1540[sizeof(\"osmanya\")];\n    char uniname2ctype_pool_str1546[sizeof(\"syriac\")];\n    char uniname2ctype_pool_str1548[sizeof(\"otherdefaultignorablecodepoint\")];\n    char uniname2ctype_pool_str1561[sizeof(\"number\")];\n    char uniname2ctype_pool_str1565[sizeof(\"inlinearbsyllabary\")];\n    char uniname2ctype_pool_str1566[sizeof(\"kthi\")];\n    char uniname2ctype_pool_str1567[sizeof(\"sund\")];\n    char uniname2ctype_pool_str1569[sizeof(\"mymr\")];\n    char uniname2ctype_pool_str1571[sizeof(\"incombiningdiacriticalmarks\")];\n    char uniname2ctype_pool_str1578[sizeof(\"enclosingmark\")];\n    char uniname2ctype_pool_str1581[sizeof(\"incombiningdiacriticalmarksforsymbols\")];\n    char uniname2ctype_pool_str1583[sizeof(\"inethiopicsupplement\")];\n    char uniname2ctype_pool_str1590[sizeof(\"unassigned\")];\n    char uniname2ctype_pool_str1591[sizeof(\"sylo\")];\n    char uniname2ctype_pool_str1595[sizeof(\"combiningmark\")];\n    char uniname2ctype_pool_str1598[sizeof(\"myanmar\")];\n    char uniname2ctype_pool_str1605[sizeof(\"graphemeextend\")];\n    char uniname2ctype_pool_str1606[sizeof(\"bidicontrol\")];\n    char uniname2ctype_pool_str1609[sizeof(\"inhalfwidthandfullwidthforms\")];\n    char uniname2ctype_pool_str1617[sizeof(\"cyrl\")];\n    char uniname2ctype_pool_str1620[sizeof(\"knda\")];\n    char uniname2ctype_pool_str1634[sizeof(\"inunifiedcanadianaboriginalsyllabicsextended\")];\n    char uniname2ctype_pool_str1635[sizeof(\"xsux\")];\n    char uniname2ctype_pool_str1636[sizeof(\"modifiersymbol\")];\n    char uniname2ctype_pool_str1643[sizeof(\"incombiningdiacriticalmarkssupplement\")];\n    char uniname2ctype_pool_str1645[sizeof(\"inhanunoo\")];\n    char uniname2ctype_pool_str1648[sizeof(\"inbuhid\")];\n    char uniname2ctype_pool_str1649[sizeof(\"kannada\")];\n    char uniname2ctype_pool_str1658[sizeof(\"inhebrew\")];\n    char uniname2ctype_pool_str1662[sizeof(\"grbase\")];\n    char uniname2ctype_pool_str1664[sizeof(\"spacingmark\")];\n    char uniname2ctype_pool_str1670[sizeof(\"inkatakanaphoneticextensions\")];\n    char uniname2ctype_pool_str1676[sizeof(\"hangul\")];\n    char uniname2ctype_pool_str1683[sizeof(\"incjksymbolsandpunctuation\")];\n    char uniname2ctype_pool_str1688[sizeof(\"bopo\")];\n    char uniname2ctype_pool_str1692[sizeof(\"orya\")];\n    char uniname2ctype_pool_str1699[sizeof(\"inbopomofo\")];\n    char uniname2ctype_pool_str1701[sizeof(\"kharoshthi\")];\n    char uniname2ctype_pool_str1703[sizeof(\"khar\")];\n    char uniname2ctype_pool_str1709[sizeof(\"changeswhenlowercased\")];\n    char uniname2ctype_pool_str1724[sizeof(\"khmr\")];\n    char uniname2ctype_pool_str1725[sizeof(\"punct\")];\n    char uniname2ctype_pool_str1729[sizeof(\"symbol\")];\n    char uniname2ctype_pool_str1732[sizeof(\"cherokee\")];\n    char uniname2ctype_pool_str1737[sizeof(\"cyrillic\")];\n    char uniname2ctype_pool_str1759[sizeof(\"inkangxiradicals\")];\n    char uniname2ctype_pool_str1761[sizeof(\"hebrew\")];\n    char uniname2ctype_pool_str1780[sizeof(\"inarabicpresentationformsb\")];\n    char uniname2ctype_pool_str1787[sizeof(\"incyrillicextendedb\")];\n    char uniname2ctype_pool_str1790[sizeof(\"ugaritic\")];\n    char uniname2ctype_pool_str1829[sizeof(\"incurrencysymbols\")];\n    char uniname2ctype_pool_str1831[sizeof(\"meroitichieroglyphs\")];\n    char uniname2ctype_pool_str1835[sizeof(\"inhighsurrogates\")];\n    char uniname2ctype_pool_str1853[sizeof(\"nonspacingmark\")];\n    char uniname2ctype_pool_str1858[sizeof(\"lydi\")];\n    char uniname2ctype_pool_str1864[sizeof(\"patsyn\")];\n    char uniname2ctype_pool_str1868[sizeof(\"orkh\")];\n    char uniname2ctype_pool_str1871[sizeof(\"lydian\")];\n    char uniname2ctype_pool_str1896[sizeof(\"ugar\")];\n    char uniname2ctype_pool_str1899[sizeof(\"othergraphemeextend\")];\n    char uniname2ctype_pool_str1900[sizeof(\"inlatinextendedb\")];\n    char uniname2ctype_pool_str1904[sizeof(\"bopomofo\")];\n    char uniname2ctype_pool_str1917[sizeof(\"khmer\")];\n    char uniname2ctype_pool_str1925[sizeof(\"uideo\")];\n    char uniname2ctype_pool_str1932[sizeof(\"otheruppercase\")];\n    char uniname2ctype_pool_str1944[sizeof(\"grek\")];\n    char uniname2ctype_pool_str1949[sizeof(\"gujr\")];\n    char uniname2ctype_pool_str1970[sizeof(\"gujarati\")];\n    char uniname2ctype_pool_str1983[sizeof(\"inhanguljamoextendedb\")];\n    char uniname2ctype_pool_str1988[sizeof(\"defaultignorablecodepoint\")];\n    char uniname2ctype_pool_str2005[sizeof(\"inplayingcards\")];\n    char uniname2ctype_pool_str2022[sizeof(\"bamu\")];\n    char uniname2ctype_pool_str2028[sizeof(\"inkanbun\")];\n    char uniname2ctype_pool_str2033[sizeof(\"incjkradicalssupplement\")];\n    char uniname2ctype_pool_str2046[sizeof(\"cypriot\")];\n    char uniname2ctype_pool_str2051[sizeof(\"inbamum\")];\n    char uniname2ctype_pool_str2053[sizeof(\"inmeroiticcursive\")];\n    char uniname2ctype_pool_str2055[sizeof(\"oldturkic\")];\n    char uniname2ctype_pool_str2086[sizeof(\"insupplementalarrowsb\")];\n    char uniname2ctype_pool_str2087[sizeof(\"surrogate\")];\n    char uniname2ctype_pool_str2094[sizeof(\"batk\")];\n    char uniname2ctype_pool_str2102[sizeof(\"inbatak\")];\n    char uniname2ctype_pool_str2119[sizeof(\"inlimbu\")];\n    char uniname2ctype_pool_str2123[sizeof(\"incypriotsyllabary\")];\n    char uniname2ctype_pool_str2129[sizeof(\"dashpunctuation\")];\n    char uniname2ctype_pool_str2130[sizeof(\"innoblock\")];\n    char uniname2ctype_pool_str2141[sizeof(\"hyphen\")];\n    char uniname2ctype_pool_str2162[sizeof(\"insupplementalpunctuation\")];\n    char uniname2ctype_pool_str2165[sizeof(\"ingeorgiansupplement\")];\n    char uniname2ctype_pool_str2178[sizeof(\"oupper\")];\n    char uniname2ctype_pool_str2189[sizeof(\"paragraphseparator\")];\n    char uniname2ctype_pool_str2194[sizeof(\"inbamumsupplement\")];\n    char uniname2ctype_pool_str2299[sizeof(\"uppercase\")];\n    char uniname2ctype_pool_str2313[sizeof(\"currencysymbol\")];\n    char uniname2ctype_pool_str2322[sizeof(\"sk\")];\n    char uniname2ctype_pool_str2338[sizeof(\"lu\")];\n    char uniname2ctype_pool_str2342[sizeof(\"openpunctuation\")];\n    char uniname2ctype_pool_str2349[sizeof(\"inlisu\")];\n    char uniname2ctype_pool_str2371[sizeof(\"qmark\")];\n    char uniname2ctype_pool_str2372[sizeof(\"egyp\")];\n    char uniname2ctype_pool_str2377[sizeof(\"insupplementaryprivateuseareab\")];\n    char uniname2ctype_pool_str2379[sizeof(\"limbu\")];\n    char uniname2ctype_pool_str2400[sizeof(\"inegyptianhieroglyphs\")];\n    char uniname2ctype_pool_str2401[sizeof(\"unifiedideograph\")];\n    char uniname2ctype_pool_str2413[sizeof(\"intelugu\")];\n    char uniname2ctype_pool_str2429[sizeof(\"katakana\")];\n    char uniname2ctype_pool_str2442[sizeof(\"inhangulcompatibilityjamo\")];\n    char uniname2ctype_pool_str2454[sizeof(\"upper\")];\n    char uniname2ctype_pool_str2495[sizeof(\"inkayahli\")];\n    char uniname2ctype_pool_str2515[sizeof(\"cwu\")];\n    char uniname2ctype_pool_str2523[sizeof(\"incjkcompatibility\")];\n    char uniname2ctype_pool_str2542[sizeof(\"uppercaseletter\")];\n    char uniname2ctype_pool_str2549[sizeof(\"bugi\")];\n    char uniname2ctype_pool_str2588[sizeof(\"buginese\")];\n    char uniname2ctype_pool_str2627[sizeof(\"any\")];\n    char uniname2ctype_pool_str2651[sizeof(\"inyisyllables\")];\n    char uniname2ctype_pool_str2671[sizeof(\"inbopomofoextended\")];\n    char uniname2ctype_pool_str2710[sizeof(\"inboxdrawing\")];\n    char uniname2ctype_pool_str2724[sizeof(\"changeswhenuppercased\")];\n    char uniname2ctype_pool_str2727[sizeof(\"unknown\")];\n    char uniname2ctype_pool_str2737[sizeof(\"quotationmark\")];\n    char uniname2ctype_pool_str2753[sizeof(\"buhd\")];\n    char uniname2ctype_pool_str2785[sizeof(\"punctuation\")];\n    char uniname2ctype_pool_str2888[sizeof(\"oldsoutharabian\")];\n    char uniname2ctype_pool_str2925[sizeof(\"kayahli\")];\n    char uniname2ctype_pool_str2940[sizeof(\"incjkunifiedideographs\")];\n    char uniname2ctype_pool_str2961[sizeof(\"incjkunifiedideographsextensiona\")];\n    char uniname2ctype_pool_str2962[sizeof(\"incjkunifiedideographsextensionc\")];\n    char uniname2ctype_pool_str2995[sizeof(\"telugu\")];\n    char uniname2ctype_pool_str3000[sizeof(\"guru\")];\n    char uniname2ctype_pool_str3104[sizeof(\"greek\")];\n    char uniname2ctype_pool_str3189[sizeof(\"grlink\")];\n    char uniname2ctype_pool_str3197[sizeof(\"buhid\")];\n    char uniname2ctype_pool_str3254[sizeof(\"batak\")];\n    char uniname2ctype_pool_str3292[sizeof(\"blank\")];\n    char uniname2ctype_pool_str3391[sizeof(\"incjkunifiedideographsextensiond\")];\n    char uniname2ctype_pool_str3459[sizeof(\"graphemelink\")];\n    char uniname2ctype_pool_str3480[sizeof(\"egyptianhieroglyphs\")];\n    char uniname2ctype_pool_str3802[sizeof(\"incjkunifiedideographsextensionb\")];\n    char uniname2ctype_pool_str3922[sizeof(\"zyyy\")];\n    char uniname2ctype_pool_str4167[sizeof(\"gurmukhi\")];\n#endif /* USE_UNICODE_PROPERTIES */\n  };\nstatic const struct uniname2ctype_pool_t uniname2ctype_pool_contents =\n  {\n#ifndef USE_UNICODE_PROPERTIES\n    \"word\",\n    \"print\",\n    \"punct\",\n    \"alpha\",\n    \"alnum\",\n    \"xdigit\",\n    \"upper\",\n#else /* USE_UNICODE_PROPERTIES */\n    \"n\",\n    \"s\",\n    \"z\",\n    \"zs\",\n    \"zzzz\",\n    \"cn\",\n    \"cs\",\n    \"ci\",\n    \"c\",\n    \"cf\",\n    \"sc\",\n    \"cans\",\n    \"qaai\",\n    \"mn\",\n#endif /* USE_UNICODE_PROPERTIES */\n    \"ascii\",\n#ifdef USE_UNICODE_PROPERTIES\n    \"cc\",\n    \"qaac\",\n    \"inavestan\",\n    \"inspecials\",\n    \"inipaextensions\",\n    \"mc\",\n    \"insamaritan\",\n    \"m\",\n    \"sm\",\n    \"me\",\n    \"inarmenian\",\n    \"incuneiform\",\n    \"mandaic\",\n    \"inancientsymbols\",\n    \"incuneiformnumbersandpunctuation\",\n    \"inthai\",\n    \"inmusicalsymbols\",\n    \"inmiscellaneoussymbols\",\n    \"incham\",\n    \"inmiscellaneoussymbolsandarrows\",\n    \"initialpunctuation\",\n    \"inmiscellaneoussymbolsandpictographs\",\n    \"inthaana\",\n    \"taile\",\n    \"mtei\",\n    \"lc\",\n    \"lana\",\n    \"inlycian\",\n    \"intransportandmapsymbols\",\n    \"incontrolpictures\",\n    \"sinhala\",\n    \"incommonindicnumberforms\",\n    \"inmiscellaneousmathematicalsymbolsa\",\n    \"sterm\",\n    \"inmyanmarextendeda\",\n    \"lm\",\n    \"taiviet\",\n    \"inlinearbideograms\",\n    \"intaitham\",\n    \"latn\",\n    \"latin\",\n    \"ital\",\n    \"alnum\",\n    \"inmalayalam\",\n    \"intaile\",\n    \"tale\",\n    \"l\",\n    \"nl\",\n    \"zl\",\n    \"intamil\",\n    \"taml\",\n    \"inlatinextendeda\",\n    \"inlatinextendedc\",\n    \"inrunic\",\n    \"incarian\",\n    \"insyriac\",\n    \"cari\",\n    \"inmeeteimayekextensions\",\n    \"osma\",\n    \"lt\",\n    \"miao\",\n    \"insharada\",\n    \"incyrillic\",\n    \"carian\",\n    \"armn\",\n    \"samr\",\n    \"armi\",\n    \"inideographicdescriptioncharacters\",\n    \"inosmanya\",\n    \"armenian\",\n    \"inmyanmar\",\n    \"samaritan\",\n    \"arabic\",\n    \"incherokee\",\n    \"connectorpunctuation\",\n    \"merc\",\n    \"inmiscellaneoustechnical\",\n    \"inenclosedalphanumerics\",\n    \"inemoticons\",\n    \"joinc\",\n#endif /* USE_UNICODE_PROPERTIES */\n    \"cntrl\",\n#ifdef USE_UNICODE_PROPERTIES\n    \"inenclosedcjklettersandmonths\",\n    \"cwcf\",\n    \"inruminumeralsymbols\",\n    \"ll\",\n    \"term\",\n    \"inlatinextendedadditional\",\n    \"tamil\",\n    \"loe\",\n    \"newtailue\",\n    \"cwcm\",\n    \"inenclosedalphanumericsupplement\",\n    \"sinh\",\n    \"zinh\",\n    \"meroiticcursive\",\n    \"han\",\n    \"hani\",\n    \"inopticalcharacterrecognition\",\n    \"no\",\n    \"so\",\n    \"innewtailue\",\n    \"insinhala\",\n    \"innko\",\n    \"co\",\n    \"shavian\",\n    \"terminalpunctuation\",\n    \"intaixuanjingsymbols\",\n    \"inethiopic\",\n    \"sora\",\n    \"inarrows\",\n    \"cham\",\n    \"inlowsurrogates\",\n    \"oriya\",\n    \"ext\",\n    \"cwt\",\n    \"common\",\n    \"inmiao\",\n    \"thai\",\n    \"intifinagh\",\n    \"ethi\",\n    \"mero\",\n    \"chakma\",\n    \"thaa\",\n    \"inscriptionalparthian\",\n    \"tifinagh\",\n    \"titlecaseletter\",\n    \"thaana\",\n    \"asciihexdigit\",\n    \"math\",\n    \"di\",\n    \"ids\",\n    \"lo\",\n    \"inlao\",\n    \"taitham\",\n    \"lao\",\n    \"laoo\",\n    \"dia\",\n    \"idc\",\n    \"ps\",\n    \"insundanese\",\n    \"pi\",\n    \"cwl\",\n    \"pf\",\n    \"mand\",\n    \"insylotinagri\",\n    \"vs\",\n    \"mongolian\",\n    \"pc\",\n    \"inmandaic\",\n    \"invai\",\n    \"lineseparator\",\n    \"pe\",\n    \"vai\",\n    \"vaii\",\n    \"idst\",\n    \"indominotiles\",\n    \"inshavian\",\n    \"inspacingmodifierletters\",\n    \"format\",\n    \"inphaistosdisc\",\n    \"hano\",\n#endif /* USE_UNICODE_PROPERTIES */\n    \"space\",\n#ifdef USE_UNICODE_PROPERTIES\n    \"indeseret\",\n    \"inolchiki\",\n    \"hira\",\n    \"joincontrol\",\n    \"idcontinue\",\n    \"inmahjongtiles\",\n    \"patws\",\n    \"inlydian\",\n    \"cher\",\n    \"inhiragana\",\n    \"inogham\",\n    \"avst\",\n    \"inscriptionalpahlavi\",\n    \"incoptic\",\n    \"java\",\n    \"inmathematicalalphanumericsymbols\",\n    \"letter\",\n    \"injavanese\",\n    \"avestan\",\n    \"age=1.1\",\n    \"lepc\",\n    \"age=2.1\",\n    \"inlepcha\",\n    \"javanese\",\n    \"shaw\",\n    \"finalpunctuation\",\n    \"alpha\",\n    \"age=5.1\",\n    \"inmongolian\",\n    \"age=5.2\",\n    \"age=2.0\",\n    \"ahex\",\n    \"ingeneralpunctuation\",\n    \"oids\",\n    \"odi\",\n    \"age=5.0\",\n    \"tavt\",\n    \"intaiviet\",\n    \"age=6.1\",\n    \"age=3.1\",\n    \"insundanesesupplement\",\n    \"age=3.2\",\n    \"age=4.1\",\n    \"oidc\",\n    \"tfng\",\n    \"insmallformvariants\",\n    \"ideo\",\n    \"intags\",\n    \"age=6.0\",\n    \"age=3.0\",\n    \"whitespace\",\n    \"age=4.0\",\n    \"inolditalic\",\n    \"oalpha\",\n    \"ingujarati\",\n    \"control\",\n    \"diacritic\",\n    \"tagbanwa\",\n    \"inphoenician\",\n    \"ininscriptionalparthian\",\n    \"ininscriptionalpahlavi\",\n    \"coptic\",\n    \"dsrt\",\n    \"inmodifiertoneletters\",\n    \"xids\",\n    \"hanunoo\",\n    \"inoldturkic\",\n    \"xidc\",\n    \"idstart\",\n    \"inimperialaramaic\",\n    \"invariationselectors\",\n    \"copt\",\n    \"caseignorable\",\n    \"prti\",\n    \"nchar\",\n    \"deseret\",\n    \"decimalnumber\",\n    \"cprt\",\n    \"inlatin1supplement\",\n    \"imperialaramaic\",\n    \"privateuse\",\n    \"casedletter\",\n    \"lowercase\",\n    \"spaceseparator\",\n    \"radical\",\n    \"mong\",\n    \"canadianaboriginal\",\n    \"letternumber\",\n    \"insorasompeng\",\n    \"dash\",\n    \"wspace\",\n    \"ogam\",\n    \"invariationselectorssupplement\",\n    \"print\",\n    \"otheridcontinue\",\n    \"ingurmukhi\",\n    \"closepunctuation\",\n    \"olditalic\",\n    \"noncharactercodepoint\",\n    \"sharada\",\n    \"ingeometricshapes\",\n    \"otheralphabetic\",\n    \"patternwhitespace\",\n    \"po\",\n    \"rjng\",\n    \"ingreekandcoptic\",\n    \"xdigit\",\n    \"gothic\",\n    \"inoldsoutharabian\",\n    \"xidstart\",\n    \"inrejang\",\n    \"idsbinaryoperator\",\n    \"olower\",\n    \"hex\",\n    \"inenclosedideographicsupplement\",\n    \"inalphabeticpresentationforms\",\n    \"inbasiclatin\",\n    \"othersymbol\",\n    \"nd\",\n    \"sd\",\n    \"omath\",\n    \"separator\",\n    \"inarabic\",\n    \"xidcontinue\",\n    \"otheridstart\",\n    \"grext\",\n    \"otherlowercase\",\n    \"phli\",\n    \"cased\",\n    \"hang\",\n    \"xpeo\",\n#endif /* USE_UNICODE_PROPERTIES */\n    \"lower\",\n#ifndef USE_UNICODE_PROPERTIES\n    \"graph\",\n#else /* USE_UNICODE_PROPERTIES */\n    \"modifierletter\",\n    \"inphoneticextensions\",\n    \"inarabicpresentationformsa\",\n    \"innumberforms\",\n    \"oldpersian\",\n    \"incyrillicextendeda\",\n    \"inverticalforms\",\n    \"p\",\n    \"inbyzantinemusicalsymbols\",\n    \"inmathematicaloperators\",\n    \"intibetan\",\n    \"zp\",\n    \"ingeorgian\",\n    \"inbraillepatterns\",\n    \"lepcha\",\n    \"geor\",\n    \"invedicextensions\",\n    \"linb\",\n    \"other\",\n    \"deva\",\n    \"indevanagari\",\n    \"othernumber\",\n    \"bamum\",\n    \"shrd\",\n    \"bali\",\n    \"devanagari\",\n    \"extender\",\n    \"inherited\",\n    \"glagolitic\",\n    \"tibt\",\n    \"inbalinese\",\n    \"ingothic\",\n    \"inmiscellaneousmathematicalsymbolsb\",\n    \"limb\",\n    \"bengali\",\n    \"phoenician\",\n    \"insuperscriptsandsubscripts\",\n    \"inmeroitichieroglyphs\",\n    \"tibetan\",\n    \"inphoneticextensionssupplement\",\n    \"balinese\",\n    \"lowercaseletter\",\n    \"indingbats\",\n    \"inprivateusearea\",\n    \"assigned\",\n    \"patternsyntax\",\n    \"inhangulsyllables\",\n    \"sarb\",\n    \"brai\",\n    \"insupplementalmathematicaloperators\",\n    \"phnx\",\n    \"ingreekextended\",\n    \"otherletter\",\n    \"arab\",\n    \"inlatinextendedd\",\n    \"word\",\n    \"inphagspa\",\n    \"inblockelements\",\n    \"ethiopic\",\n    \"inethiopicextendeda\",\n    \"brahmi\",\n    \"logicalorderexception\",\n    \"inoldpersian\",\n    \"inletterlikesymbols\",\n    \"sorasompeng\",\n    \"hiragana\",\n    \"inhanguljamoextendeda\",\n    \"othermath\",\n#endif /* USE_UNICODE_PROPERTIES */\n    \"digit\",\n#ifndef USE_UNICODE_PROPERTIES\n    \"blank\"\n#else /* USE_UNICODE_PROPERTIES */\n    \"goth\",\n    \"ogham\",\n    \"sundanese\",\n    \"saurashtra\",\n    \"linearb\",\n    \"graphemebase\",\n    \"inunifiedcanadianaboriginalsyllabics\",\n    \"cuneiform\",\n    \"inkannada\",\n    \"kana\",\n    \"inancientgreeknumbers\",\n    \"incjkstrokes\",\n    \"inglagolitic\",\n    \"inancientgreekmusicalnotation\",\n    \"inchakma\",\n    \"plrd\",\n    \"inbrahmi\",\n    \"cakm\",\n    \"incjkcompatibilityforms\",\n    \"lisu\",\n    \"incjkcompatibilityideographs\",\n    \"intagalog\",\n    \"inkaithi\",\n    \"insupplementalarrowsa\",\n    \"takri\",\n    \"ideographic\",\n    \"hexdigit\",\n    \"glag\",\n    \"softdotted\",\n    \"variationselector\",\n    \"inkatakana\",\n    \"meeteimayek\",\n    \"otherpunctuation\",\n    \"inhanguljamo\",\n    \"kali\",\n    \"braille\",\n    \"incombininghalfmarks\",\n    \"talu\",\n    \"incjkcompatibilityideographssupplement\",\n    \"telu\",\n    \"idsb\",\n    \"tglg\",\n    \"inmeeteimayek\",\n    \"yi\",\n    \"phagspa\",\n    \"yiii\",\n    \"inarabicmathematicalalphabeticsymbols\",\n    \"saur\",\n    \"ogrext\",\n    \"bidic\",\n    \"inkanasupplement\",\n    \"runic\",\n    \"inalchemicalsymbols\",\n    \"georgian\",\n    \"inugaritic\",\n    \"insaurashtra\",\n    \"inhighprivateusesurrogates\",\n    \"pd\",\n    \"incountingrodnumerals\",\n    \"inarabicextendeda\",\n    \"inkharoshthi\",\n    \"idstrinaryoperator\",\n    \"phag\",\n    \"brah\",\n    \"mark\",\n    \"hebr\",\n    \"inkhmersymbols\",\n    \"dep\",\n    \"inkhmer\",\n    \"deprecated\",\n    \"rejang\",\n    \"lyci\",\n    \"intakri\",\n    \"takr\",\n    \"incyrillicsupplement\",\n    \"changeswhencasefolded\",\n    \"indevanagariextended\",\n    \"lycian\",\n    \"inbengali\",\n    \"beng\",\n    \"graph\",\n    \"inyijinghexagramsymbols\",\n    \"olck\",\n    \"inarabicsupplement\",\n    \"inbuginese\",\n    \"changeswhencasemapped\",\n    \"olchiki\",\n    \"inaegeannumbers\",\n    \"mlym\",\n    \"alphabetic\",\n    \"sylotinagri\",\n    \"changeswhentitlecased\",\n    \"tagalog\",\n    \"tagb\",\n    \"runr\",\n    \"malayalam\",\n    \"inoriya\",\n    \"intagbanwa\",\n    \"syrc\",\n    \"nko\",\n    \"nkoo\",\n    \"inethiopicextended\",\n    \"kaithi\",\n    \"mathsymbol\",\n    \"inyiradicals\",\n    \"insupplementaryprivateuseareaa\",\n    \"osmanya\",\n    \"syriac\",\n    \"otherdefaultignorablecodepoint\",\n    \"number\",\n    \"inlinearbsyllabary\",\n    \"kthi\",\n    \"sund\",\n    \"mymr\",\n    \"incombiningdiacriticalmarks\",\n    \"enclosingmark\",\n    \"incombiningdiacriticalmarksforsymbols\",\n    \"inethiopicsupplement\",\n    \"unassigned\",\n    \"sylo\",\n    \"combiningmark\",\n    \"myanmar\",\n    \"graphemeextend\",\n    \"bidicontrol\",\n    \"inhalfwidthandfullwidthforms\",\n    \"cyrl\",\n    \"knda\",\n    \"inunifiedcanadianaboriginalsyllabicsextended\",\n    \"xsux\",\n    \"modifiersymbol\",\n    \"incombiningdiacriticalmarkssupplement\",\n    \"inhanunoo\",\n    \"inbuhid\",\n    \"kannada\",\n    \"inhebrew\",\n    \"grbase\",\n    \"spacingmark\",\n    \"inkatakanaphoneticextensions\",\n    \"hangul\",\n    \"incjksymbolsandpunctuation\",\n    \"bopo\",\n    \"orya\",\n    \"inbopomofo\",\n    \"kharoshthi\",\n    \"khar\",\n    \"changeswhenlowercased\",\n    \"khmr\",\n    \"punct\",\n    \"symbol\",\n    \"cherokee\",\n    \"cyrillic\",\n    \"inkangxiradicals\",\n    \"hebrew\",\n    \"inarabicpresentationformsb\",\n    \"incyrillicextendedb\",\n    \"ugaritic\",\n    \"incurrencysymbols\",\n    \"meroitichieroglyphs\",\n    \"inhighsurrogates\",\n    \"nonspacingmark\",\n    \"lydi\",\n    \"patsyn\",\n    \"orkh\",\n    \"lydian\",\n    \"ugar\",\n    \"othergraphemeextend\",\n    \"inlatinextendedb\",\n    \"bopomofo\",\n    \"khmer\",\n    \"uideo\",\n    \"otheruppercase\",\n    \"grek\",\n    \"gujr\",\n    \"gujarati\",\n    \"inhanguljamoextendedb\",\n    \"defaultignorablecodepoint\",\n    \"inplayingcards\",\n    \"bamu\",\n    \"inkanbun\",\n    \"incjkradicalssupplement\",\n    \"cypriot\",\n    \"inbamum\",\n    \"inmeroiticcursive\",\n    \"oldturkic\",\n    \"insupplementalarrowsb\",\n    \"surrogate\",\n    \"batk\",\n    \"inbatak\",\n    \"inlimbu\",\n    \"incypriotsyllabary\",\n    \"dashpunctuation\",\n    \"innoblock\",\n    \"hyphen\",\n    \"insupplementalpunctuation\",\n    \"ingeorgiansupplement\",\n    \"oupper\",\n    \"paragraphseparator\",\n    \"inbamumsupplement\",\n    \"uppercase\",\n    \"currencysymbol\",\n    \"sk\",\n    \"lu\",\n    \"openpunctuation\",\n    \"inlisu\",\n    \"qmark\",\n    \"egyp\",\n    \"insupplementaryprivateuseareab\",\n    \"limbu\",\n    \"inegyptianhieroglyphs\",\n    \"unifiedideograph\",\n    \"intelugu\",\n    \"katakana\",\n    \"inhangulcompatibilityjamo\",\n    \"upper\",\n    \"inkayahli\",\n    \"cwu\",\n    \"incjkcompatibility\",\n    \"uppercaseletter\",\n    \"bugi\",\n    \"buginese\",\n    \"any\",\n    \"inyisyllables\",\n    \"inbopomofoextended\",\n    \"inboxdrawing\",\n    \"changeswhenuppercased\",\n    \"unknown\",\n    \"quotationmark\",\n    \"buhd\",\n    \"punctuation\",\n    \"oldsoutharabian\",\n    \"kayahli\",\n    \"incjkunifiedideographs\",\n    \"incjkunifiedideographsextensiona\",\n    \"incjkunifiedideographsextensionc\",\n    \"telugu\",\n    \"guru\",\n    \"greek\",\n    \"grlink\",\n    \"buhid\",\n    \"batak\",\n    \"blank\",\n    \"incjkunifiedideographsextensiond\",\n    \"graphemelink\",\n    \"egyptianhieroglyphs\",\n    \"incjkunifiedideographsextensionb\",\n    \"zyyy\",\n    \"gurmukhi\"\n#endif /* USE_UNICODE_PROPERTIES */\n  };\n#define uniname2ctype_pool ((const char *) &uniname2ctype_pool_contents)\n#ifdef __GNUC__\n__inline\n#ifdef __GNUC_STDC_INLINE__\n__attribute__ ((__gnu_inline__))\n#endif\n#endif\nconst struct uniname2ctype_struct *\nuniname2ctype_p (str, len)\n     register const char *str;\n     register unsigned int len;\n{\n  static const struct uniname2ctype_struct wordlist[] =\n    {\n#ifdef USE_UNICODE_PROPERTIES\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3,                                        34},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str5,                                        46},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str7,                                        51},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str9,                                       54},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str16,                                    208},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str18,                                       20},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str20,                                       22},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str24,                                       60},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str29,                                        17},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str30,                                       19},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str32,                                       47},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str34,                                    101},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str35,                                    114},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str38,                                       33},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str42,                                    14},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str44,                                       18},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str45,                                    128},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str49,                               401},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str52,                              377},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str62,                         226},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str64,                                       31},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str66,                             239},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str69,                                        30},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str72,                                       49},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str74,                                       32},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str82,                              232},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str84,                             412},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str86,                                 168},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str90,                        382},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str92,        413},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str96,                                  252},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str99,                        419},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str100,                  304},\n      {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str106,                                  355},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str109,         312},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str113,                       43},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str114,    430},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str116,                                237},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str124,                                   120},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str125,                                    159},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str132,                                       24},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str133,                                    151},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str134,                                384},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str135,                432},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str136,                       298},\n      {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str142,                                  92},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str151,                347},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str156,     306},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str158,                                   204},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str167,                      356},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str172,                                       26},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str175,                                 152},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str179,                      379},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str180,                               276},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str184,                                     75},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str186,                                    75},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str187,                                    111},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str189,                                    13},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str199,                             250},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str201,                                 272},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str202,                                    120},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str205,                                        23},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str207,                                       36},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str209,                                       52},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str216,                                 247},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str217,                                     88},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str218,                        224},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str220,                        314},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str223,                                 263},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str224,                                385},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str225,                                235},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str227,                                    148},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str230,                 358},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str231,                                    124},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str232,                                       28},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str233,                                    172},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str234,                               410},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str239,                              230},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str240,                                  148},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str244,                                     78},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str245,                                    155},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str247,                                    160},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str248,      323},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str252,                               392},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str253,                                 78},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str254,                               255},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str255,                               155},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str256,                                   80},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str259,                              260},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str261,                     39},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str263,                                    170},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str264,                297},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str268,                 300},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str279,                             431},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str281,                                   178},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str288,                                     3},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str301,           333},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str303,                                     64},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str304,                    405},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str308,                                       25},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str313,                                    182},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str316,               287},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str320,                                    88},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str321,                                     201},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str329,                               129},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str330,                                     65},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str339,        428},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str346,                                     92},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str347,                                    114},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str349,                         170},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str353,                                     109},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str357,                                    109},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str358,           299},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str359,                                       37},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str360,                                       50},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str364,                             273},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str365,                               251},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str367,                                   238},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str372,                                       21},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str375,                                 123},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str378,                     182},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str386,                    421},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str387,                              258},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str389,                                    174},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str398,                                295},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str400,                                    150},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str403,                         365},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str405,                                    87},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str406,                                     189},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str409,                                      63},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str412,                                   74},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str414,                                  416},\n      {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str420,                                     93},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str425,                              317},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str426,                                     99},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str427,                                    171},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str428,                                  169},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str429,                                     82},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str430,                   162},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str432,                                131},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str436,                          28},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str445,                                   82},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str449,                           185},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str450,                                     55},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str453,                                       70},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str454,                                      66},\n      {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str460,                                       27},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str468,                                   253},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str470,                                 151},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str474,                                      94},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str475,                                     94},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str476,                                     188},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str478,                                      67},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str480,                                       45},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str481,                             278},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str484,                                       43},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str485,                                      61},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str490,                                       42},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str495,                                    168},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str496,                           346},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str497,                                      205},\n      {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str503,                               105},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str504,                                       39},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str506,                               240},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str509,                                   341},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str511,                            52},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str514,                                       41},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str515,                                     143},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str516,                                    143},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str517,                                    195},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str520,                           426},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str521,                               391},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str522,                227},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str524,                                   19},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str528,                          383},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str531,                                    116},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str532,                                     9},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str542,                               390},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str545,                               281},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str548,                                    106},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str553,                             178},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str555,                               67},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str558,                          425},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str560,                                   206},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str563,                                396},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str564,                                    100},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str568,                              325},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str572,                                 262},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str574,                                    153},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str575,                    163},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str579,                                315},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str587,                                    158},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str589,       423},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str594,                                   23},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str604,                              354},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str608,                                 153},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str612,                                 209},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str613,                                    141},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str614,                                 211},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str616,                                280},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str617,                                158},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str618,                                    123},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str619,                         42},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str620,                                     1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str621,                                 218},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str622,                             269},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str623,                                 219},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str626,                                 210},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str627,                                    185},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str630,                    289},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str631,                                    202},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str632,                                     198},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str633,                                 217},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str636,                                    152},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str637,                               357},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str638,                                 221},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str639,                                 213},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str640,                   282},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str641,                                 214},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str642,                                 216},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str643,                                    203},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str646,                                    131},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str647,                     374},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str648,                                    187},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str649,                                  438},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str650,                                 220},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str651,                                 212},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str653,                              176},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str654,                                 215},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str655,                             386},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str660,                                  186},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str668,                              245},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str672,                                  18},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str679,                               188},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str682,                                118},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str690,                            395},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str701,                 402},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str703,                  403},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str704,                                  128},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str705,                                    113},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str706,                   344},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str709,                                     68},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str713,                                 116},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str715,                             404},\n      {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str721,                                     69},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str725,                                  66},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str729,                       394},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str730,                    370},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str734,                                    128},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str737,                            60},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str738,                                    162},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str739,                                   192},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str746,                                 113},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str747,                            35},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str748,                                    125},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str750,                      223},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str771,                         160},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str776,                               21},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str777,                              24},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str778,                                57},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str780,                           54},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str784,                                 196},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str787,                                    105},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str788,                      101},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str792,                             36},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str796,                           408},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str797,                                    179},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str798,                                  176},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str799,                                    102},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str802,          439},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str803,                                     7},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str811,                         203},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str815,                              244},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str818,                         41},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str823,                               111},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str824,                   192},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str826,                                 173},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str827,                       303},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str830,                         186},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str831,                       206},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str832,                                       44},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str833,                                    146},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str835,                        229},\n      {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str841,                                   11},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str850,                                  112},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str851,                       400},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str852,                                 68},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str854,                                352},\n      {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str860,                       194},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str867,                                  190},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str869,                                     184},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str870,         429},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str874,           368},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str879,                            222},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str884,                              50},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str889,                                       35},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str890,                                      200},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str900,                                   183},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str901,                                51},\n      {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str907,                                234},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str912,                              69},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str913,                            202},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str914,                                    71},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str917,                          190},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str919,                                    163},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str920,                                    59},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str923,                                     98},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str931,                                    133},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str933,                                     6},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str936,                           26},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str938,                    284},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str939,              369},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str943,                           294},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str945,                              133},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str946,                     319},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str947,                         371},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str949,                                        38},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str950,               418},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str951,                 296},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str952,                               254},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str953,                                       53},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str956,                              256},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str960,                       308},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str962,                                  141},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str963,                                     97},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str964,                       283},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str965,                                    121},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str966,                                    17},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str970,                                     83},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str972,                            242},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str973,                              37},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str974,                                   157},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str976,                                    173},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str977,                                    135},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str981,                               83},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str983,                                189},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str988,                               114},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str989,                              130},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str990,                                     95},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str994,                              277},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str996,                                387},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str997,     310},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str998,                                    119},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1000,                                  84},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1003,                              137},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1004,             290},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1006,                   397},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1007,                                  95},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1010,          285},\n      {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1016,                                135},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1021,                          25},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1031,                              305},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1035,                        366},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1039,                                 16},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1044,                           207},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1051,                       361},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1065,                                    161},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1067,                                    126},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1069,     311},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1070,                                    137},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1072,                         288},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1074,                              27},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1076,                                     80},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1078,                        345},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1081,                                     12},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1084,                               348},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1087,                         302},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1092,                                 99},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1094,                     359},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1107,                                  167},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1110,                   201},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1114,                            389},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1129,                     293},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1133,                             174},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1135,                                106},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1142,                   353},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1147,                               183},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1150,                                     4},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1151,                                    112},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1156,                                   102},\n      {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1162,                               140},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1170,                              144},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1173,                                 121},\n      {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1179,                             72},\n      {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1185,    261},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1186,                               136},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1188,                               249},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1190,                                    107},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1195,                   381},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1196,                            331},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1198,                            313},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1202,           420},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1212,                                409},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1215,                                    172},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1219,                                406},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1224,                                    169},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1225,                 373},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1229,                                    156},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1230,            367},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1231,                               264},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1244,                                407},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1245,                   307},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1249,                                   175},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1253,                             187},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1256,                                184},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1259,                                    130},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1261,                              200},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1262,                       205},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1264,                              326},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1265,                             159},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1274,                         44},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1279,                            257},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1282,                                    145},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1289,                                 126},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1298,                    372},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1300,                                    129},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1302,  437},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1306,                                     89},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1307,                                    194},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1310,                                    115},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1313,                           360},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1315,                                      110},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1318,                                 138},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1321,                                    110},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1323,   424},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1328,                                    144},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1330,                                  193},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1334,                                   177},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1341,                        417},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1343,                                   103},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1344,                     433},\n      {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1350,                                 97},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1351,                              388},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1354,                            349},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1356,              364},\n      {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1362,                                       40},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1372,                   422},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1377,                       241},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1389,                            399},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1393,                      195},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1396,                                    138},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1398,                                    167},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1402,                                     30},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1404,                                     79},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1411,                          274},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1413,                                     199},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1416,                                 268},\n      {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1422,                              199},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1424,                                  146},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1429,                                    147},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1431,                                 411},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1432,                                    175},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1435,                    231},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1436,                    64},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1438,                    350},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1442,                                  147},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1443,                               243},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1448,                                     84},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1450,                                     5},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1452,                 336},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1457,                                    142},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1460,                      236},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1462,                              275},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1463,                    65},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1468,                                 142},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1478,                         380},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1479,                                     91},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1480,                               56},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1492,                             132},\n      {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1498,                    63},\n      {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1504,                                 115},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1505,                                    118},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1506,                                    103},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1510,                                91},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1512,                                 246},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1516,                              267},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1517,                                     81},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1519,                                     139},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1520,                                    139},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1523,                      318},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1525,                                  165},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1530,                               49},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1531,                            339},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1536,          440},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1540,                                 124},\n      {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1546,                                   81},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1548,          198},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1561,                                   34},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1565,                      378},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1566,                                    165},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1567,                                    140},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1569,                                     96},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1571,             228},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1578,                            32},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1581,   292},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1583,                    259},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1590,                               20},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1591,                                    132},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1595,                            30},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1598,                                  96},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1605,                           71},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1606,                             177},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1609,            376},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1617,                                     77},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1620,                                     90},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1634, 270},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1635,                                    136},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1636,                           48},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1643,   286},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1645,                               265},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1648,                                 266},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1649,                                  90},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1658,                                233},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1662,                                   72},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1664,                              31},\n      {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1670,            332},\n      {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1676,                                   98},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1683,              324},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1688,                                    108},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1692,                                     87},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1699,                              327},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1701,                              134},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1703,                                    134},\n      {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1709,                    61},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1724,                                    104},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1725,                                     8},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1729,                                   46},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1732,                                100},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1737,                                 77},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1759,                        322},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1761,                                   79},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1780,              375},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1787,                     342},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1790,                                122},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1829,                       291},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1831,                     171},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1835,                        363},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1853,                           33},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1858,                                    149},\n      {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1864,                                  207},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1868,                                    164},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1871,                                  149},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1896,                                    122},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1899,                     193},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1900,                        225},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1904,                                108},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1917,                                   104},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1925,                                   197},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1932,                          191},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1944,                                     76},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1949,                                     86},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1970,                                 86},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1983,                   362},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str1988,                70},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2005,                          427},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2022,                                    157},\n      {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2028,                                329},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2033,                 321},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2046,                                 125},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2051,                                 343},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2053,                       398},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2055,                               164},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2086,                   309},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2087,                                22},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2094,                                    166},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2102,                                 279},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2119,                                 271},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2123,                      393},\n      {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2129,                          40},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2130,                               442},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2141,                                  180},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2162,               320},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2165,                    316},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2178,                                  191},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2189,                       53},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2194,                       415},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2299,                                58},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2313,                           47},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2322,                                       48},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2338,                                       29},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2342,                          45},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2349,                                  340},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2371,                                   181},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2372,                                    154},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2377,          441},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2379,                                   119},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2400,                   414},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2401,                        197},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2413,                                248},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2429,                                107},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2442,               328},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2454,                                    10},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2495,                               351},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2515,                                      62},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2523,                      334},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2542,                          29},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2549,                                    127},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2588,                                127},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2627,                                      15},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2651,                           338},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2671,                      330},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2710,                            301},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2724,                    62},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2727,                                 208},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2737,                           181},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2753,                                    117},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2785,                              38},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2888,                         161},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2925,                                 145},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2940,                  337},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2961,        335},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2962,        435},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str2995,                                   89},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3000,                                     85},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3104,                                    76},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3189,                                   73},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3197,                                   117},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3254,                                   166},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3292,                                     2},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3391,        436},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3459,                             73},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3480,                     154},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n#endif /* USE_UNICODE_PROPERTIES */\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n#ifndef USE_UNICODE_PROPERTIES\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str6,                                     12},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str7,                                     7},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str8,                                     8},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str9,                                     1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str10,                                    13},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str11,                                   11},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str12,                                    10},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str13,                                    14},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str14,                                     3},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str15,                                     9},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str16,                                     6},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str17,                                     5},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str18,                                     4},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str19,                                     2}\n#else /* USE_UNICODE_PROPERTIES */\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3802,        434},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str3922,                                     74},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1}, {-1},\n      {-1},\n      {(int)(long)&((struct uniname2ctype_pool_t *)0)->uniname2ctype_pool_str4167,                                 85}\n#endif /* USE_UNICODE_PROPERTIES */\n    };\n\n  if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)\n    {\n      register int key = uniname2ctype_hash (str, len);\n\n      if (key <= MAX_HASH_VALUE && key >= 0)\n        {\n          register int o = wordlist[key].name;\n          if (o >= 0)\n            {\n              register const char *s = o + uniname2ctype_pool;\n\n              if (*str == *s && !strncmp (str + 1, s + 1, len - 1) && s[len] == '\\0')\n                return &wordlist[key];\n            }\n        }\n    }\n  return 0;\n}\n\nstatic int\nuniname2ctype(const UChar *name, unsigned int len)\n{\n  const struct uniname2ctype_struct *p = uniname2ctype_p((const char *)name, len);\n  if (p) return p->ctype;\n  return -1;\n}\n"
  },
  {
    "path": "src/Onigmo/enc/unicode.c",
    "content": "/**********************************************************************\n  unicode.c -  Oniguruma (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2008  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regint.h\"\n\n#define ONIGENC_IS_UNICODE_ISO_8859_1_CTYPE(code,ctype) \\\n  ((EncUNICODE_ISO_8859_1_CtypeTable[code] & CTYPE_TO_BIT(ctype)) != 0)\n#if 0\n#define ONIGENC_IS_UNICODE_ISO_8859_1_BIT_CTYPE(code,cbit) \\\n  ((EncUNICODE_ISO_8859_1_CtypeTable[code] & (cbit)) != 0)\n#endif\n\nstatic const unsigned short EncUNICODE_ISO_8859_1_CtypeTable[256] = {\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x420c, 0x4209, 0x4208, 0x4208, 0x4208, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4284, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0,\n  0x78b0, 0x78b0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x51a0,\n  0x41a0, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x4008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0288, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008, 0x0008,\n  0x0284, 0x01a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0, 0x00a0,\n  0x00a0, 0x00a0, 0x30e2, 0x01a0, 0x00a0, 0x00a8, 0x00a0, 0x00a0,\n  0x00a0, 0x00a0, 0x10a0, 0x10a0, 0x00a0, 0x30e2, 0x00a0, 0x01a0,\n  0x00a0, 0x10a0, 0x30e2, 0x01a0, 0x10a0, 0x10a0, 0x10a0, 0x01a0,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x00a0,\n  0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x34a2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x00a0,\n  0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2, 0x30e2\n};\n\n#include \"enc/unicode/name2ctype.h\"\n\ntypedef struct {\n  int n;\n  OnigCodePoint code[3];\n} CodePointList3;\n\ntypedef struct {\n  OnigCodePoint  from;\n  CodePointList3 to;\n} CaseFold_11_Type;\n\ntypedef struct {\n  OnigCodePoint  from;\n  CodePointList3 to;\n} CaseUnfold_11_Type;\n\ntypedef struct {\n  int n;\n  OnigCodePoint code[2];\n} CodePointList2;\n\ntypedef struct {\n  OnigCodePoint  from[2];\n  CodePointList2 to;\n} CaseUnfold_12_Type;\n\ntypedef struct {\n  OnigCodePoint  from[3];\n  CodePointList2 to;\n} CaseUnfold_13_Type;\n\n#include \"enc/unicode/casefold.h\"\n\n\n#define numberof(array) (int)(sizeof(array) / sizeof((array)[0]))\n#define CODE_RANGES_NUM numberof(CodeRanges)\n#define CODE_SCRIPTS_NUM numberof(CodeScripts)\n\nextern int\nonigenc_unicode_is_code_ctype(OnigCodePoint code, unsigned int ctype)\n{\n  if (\n#ifdef USE_UNICODE_PROPERTIES\n      ctype <= ONIGENC_MAX_STD_CTYPE &&\n#endif\n      code < 256) {\n    return ONIGENC_IS_UNICODE_ISO_8859_1_CTYPE(code, ctype);\n  }\n\n  if (ctype >= CODE_RANGES_NUM) {\n    return ONIGERR_TYPE_BUG;\n  }\n\n  return onig_is_in_code_range((UChar* )CodeRanges[ctype], code);\n}\n\n\nextern int\nonigenc_unicode_ctype_code_range(int ctype, const OnigCodePoint* ranges[])\n{\n  if (ctype >= CODE_RANGES_NUM) {\n    return ONIGERR_TYPE_BUG;\n  }\n\n  *ranges = CodeRanges[ctype];\n\n  return 0;\n}\n\nextern int\nonigenc_utf16_32_get_ctype_code_range(OnigCtype ctype, OnigCodePoint* sb_out,\n                                      const OnigCodePoint* ranges[])\n{\n  *sb_out = 0x00;\n  return onigenc_unicode_ctype_code_range(ctype, ranges);\n}\n\nextern const OnigCodePoint*\nonigenc_unicode_code_script(OnigCodePoint code)\n{\n\tfor (int ctype = 0; ctype < CODE_SCRIPTS_NUM; ctype++) {\n\t\tif (onig_is_in_code_range((UChar*) CodeScripts[ctype], code)) {\n\t\t\treturn CodeScripts[ctype];\n\t\t}\n\t}\n\treturn 0;\n}\n\n#include \"st.h\"\n\n#define PROPERTY_NAME_MAX_SIZE    (MAX_WORD_LENGTH + 1)\n\nextern int\nonigenc_unicode_property_name_to_ctype(OnigEncoding enc, UChar* name, UChar* end)\n{\n  int len;\n  int ctype;\n  UChar buf[PROPERTY_NAME_MAX_SIZE];\n  UChar *p;\n  OnigCodePoint code;\n\n  len = 0;\n  for (p = name; p < end; p += enclen(enc, p)) {\n    code = ONIGENC_MBC_TO_CODE(enc, p, end);\n    if (code == ' ' || code == '-' || code == '_')\n      continue;\n    if (code >= 0x80)\n      return ONIGERR_INVALID_CHAR_PROPERTY_NAME;\n\n    buf[len++] = ONIGENC_ASCII_CODE_TO_LOWER_CASE(code);\n    if (len >= PROPERTY_NAME_MAX_SIZE)\n      return ONIGERR_INVALID_CHAR_PROPERTY_NAME;\n  }\n\n  buf[len] = 0;\n\n  if ((ctype = uniname2ctype(buf, len)) < 0) {\n    return ONIGERR_INVALID_CHAR_PROPERTY_NAME;\n  }\n\n  return ctype;\n}\n\n\nstatic int\ncode2_cmp(OnigCodePoint* x, OnigCodePoint* y)\n{\n  if (x[0] == y[0] && x[1] == y[1]) return 0;\n  return 1;\n}\n\nstatic int\ncode2_hash(OnigCodePoint* x)\n{\n  return (int )(x[0] + x[1]);\n}\n\nstatic struct st_hash_type type_code2_hash = {\n  code2_cmp,\n  code2_hash,\n};\n\nstatic int\ncode3_cmp(OnigCodePoint* x, OnigCodePoint* y)\n{\n  if (x[0] == y[0] && x[1] == y[1] && x[2] == y[2]) return 0;\n  return 1;\n}\n\nstatic int\ncode3_hash(OnigCodePoint* x)\n{\n  return (int )(x[0] + x[1] + x[2]);\n}\n\nstatic struct st_hash_type type_code3_hash = {\n  code3_cmp,\n  code3_hash,\n};\n\n#ifdef USE_SHARED_UNICODE_TABLE\n\tst_table* FoldTable;    /* fold-1, fold-2, fold-3 */\n\tst_table* Unfold1Table;\n\tst_table* Unfold2Table;\n\tst_table* Unfold3Table;\n\tint CaseFoldInited = 0;\n#else\n\tstatic st_table* FoldTable;    /* fold-1, fold-2, fold-3 */\n\tstatic st_table* Unfold1Table;\n\tstatic st_table* Unfold2Table;\n\tstatic st_table* Unfold3Table;\n\tstatic int CaseFoldInited = 0;\n#endif //USE_SHARED_UNICODE_TABLE\n\nstatic int init_case_fold_table(void)\n{\n  const CaseFold_11_Type   *p;\n  const CaseUnfold_11_Type *p1;\n  const CaseUnfold_12_Type *p2;\n  const CaseUnfold_13_Type *p3;\n  int i;\n\n  THREAD_ATOMIC_START;\n\n  FoldTable = st_init_numtable_with_size(FOLD_TABLE_SIZE);\n  if (ONIG_IS_NULL(FoldTable)) return ONIGERR_MEMORY;\n  for (i = 0; i < numberof(CaseFold); i++) {\n    p = &CaseFold[i];\n    st_add_direct(FoldTable, (st_data_t )p->from, (st_data_t )&(p->to));\n  }\n  for (i = 0; i < numberof(CaseFold_Locale); i++) {\n    p = &CaseFold_Locale[i];\n    st_add_direct(FoldTable, (st_data_t )p->from, (st_data_t )&(p->to));\n  }\n\n  Unfold1Table = st_init_numtable_with_size(UNFOLD1_TABLE_SIZE);\n  if (ONIG_IS_NULL(Unfold1Table)) return ONIGERR_MEMORY;\n\n  for (i = 0; i < numberof(CaseUnfold_11); i++) {\n    p1 = &CaseUnfold_11[i];\n    st_add_direct(Unfold1Table, (st_data_t )p1->from, (st_data_t )&(p1->to));\n  }\n  for (i = 0; i < numberof(CaseUnfold_11_Locale); i++) {\n    p1 = &CaseUnfold_11_Locale[i];\n    st_add_direct(Unfold1Table, (st_data_t )p1->from, (st_data_t )&(p1->to));\n  }\n\n  Unfold2Table = st_init_table_with_size(&type_code2_hash, UNFOLD2_TABLE_SIZE);\n  if (ONIG_IS_NULL(Unfold2Table)) return ONIGERR_MEMORY;\n\n  for (i = 0; i < numberof(CaseUnfold_12); i++) {\n    p2 = &CaseUnfold_12[i];\n    st_add_direct(Unfold2Table, (st_data_t )p2->from, (st_data_t )(&p2->to));\n  }\n  for (i = 0; i < numberof(CaseUnfold_12_Locale); i++) {\n    p2 = &CaseUnfold_12_Locale[i];\n    st_add_direct(Unfold2Table, (st_data_t )p2->from, (st_data_t )(&p2->to));\n  }\n\n  Unfold3Table = st_init_table_with_size(&type_code3_hash, UNFOLD3_TABLE_SIZE);\n  if (ONIG_IS_NULL(Unfold3Table)) return ONIGERR_MEMORY;\n\n  for (i = 0; i < numberof(CaseUnfold_13); i++) {\n    p3 = &CaseUnfold_13[i];\n    st_add_direct(Unfold3Table, (st_data_t )p3->from, (st_data_t )(&p3->to));\n  }\n\n  CaseFoldInited = 1;\n  THREAD_ATOMIC_END;\n  return 0;\n}\n\nextern int\nonigenc_unicode_mbc_case_fold(OnigEncoding enc,\n    OnigCaseFoldType flag ARG_UNUSED, const UChar** pp, const UChar* end,\n    UChar* fold)\n{\n  CodePointList3 *to;\n  OnigCodePoint code;\n  int i, len, rlen;\n  const UChar *p = *pp;\n\n  if (CaseFoldInited == 0) init_case_fold_table();\n\n  code = ONIGENC_MBC_TO_CODE(enc, p, end);\n  len = enclen(enc, p);\n  *pp += len;\n\n#ifdef USE_UNICODE_CASE_FOLD_TURKISH_AZERI\n  if ((flag & ONIGENC_CASE_FOLD_TURKISH_AZERI) != 0) {\n    if (code == 0x0049) {\n      return ONIGENC_CODE_TO_MBC(enc, 0x0131, fold);\n    }\n    else if (code == 0x0130) {\n      return ONIGENC_CODE_TO_MBC(enc, 0x0069, fold);\n    }\n  }\n#endif\n\n  if (onig_st_lookup(FoldTable, (st_data_t )code, (void* )&to) != 0) {\n    if (to->n == 1) {\n      return ONIGENC_CODE_TO_MBC(enc, to->code[0], fold);\n    }\n#if 0\n    /* NO NEEDS TO CHECK */\n    else if ((flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n#else\n    else {\n#endif\n      rlen = 0;\n      for (i = 0; i < to->n; i++) {\n\tlen = ONIGENC_CODE_TO_MBC(enc, to->code[i], fold);\n\tfold += len;\n\trlen += len;\n      }\n      return rlen;\n    }\n  }\n\n  for (i = 0; i < len; i++) {\n    *fold++ = *p++;\n  }\n  return len;\n}\n\nextern int\nonigenc_unicode_mbc_case_fold_se(OnigIterator* it, OnigEncoding enc,\n    OnigCaseFoldType flag ARG_UNUSED, OnigPosition* pp, OnigPosition end,\n    UChar* fold)\n{\n  CodePointList3 *to;\n  OnigCodePoint code;\n  int i, len, rlen;\n  OnigPosition p = *pp;\n\n  if (CaseFoldInited == 0) init_case_fold_table();\n\n  code = ONIGENC_MBC_TO_CODE_SE(it, enc, p, end);\n  len = enclen_se(it, enc, p);\n  *pp += len;\n\n#ifdef USE_UNICODE_CASE_FOLD_TURKISH_AZERI\n  if ((flag & ONIGENC_CASE_FOLD_TURKISH_AZERI) != 0) {\n    if (code == 0x0049) {\n      return ONIGENC_CODE_TO_MBC(enc, 0x0131, fold);\n    }\n    else if (code == 0x0130) {\n      return ONIGENC_CODE_TO_MBC(enc, 0x0069, fold);\n    }\n  }\n#endif\n\n  if (onig_st_lookup(FoldTable, (st_data_t )code, (void* )&to) != 0) {\n    if (to->n == 1) {\n      return ONIGENC_CODE_TO_MBC(enc, to->code[0], fold);\n    }\n#if 0\n    /* NO NEEDS TO CHECK */\n    else if ((flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n#else\n    else {\n#endif\n      rlen = 0;\n      for (i = 0; i < to->n; i++) {\n\tlen = ONIGENC_CODE_TO_MBC(enc, to->code[i], fold);\n\tfold += len;\n\trlen += len;\n      }\n      return rlen;\n    }\n  }\n\n  for (i = 0; i < len; i++) {\n    *fold++ = ONIG_CHARAT(p++);\n  }\n  return len;\n}\n\nextern int\nonigenc_unicode_apply_all_case_fold(OnigCaseFoldType flag,\n\t\t\t\t    OnigApplyAllCaseFoldFunc f, void* arg)\n{\n  const CaseUnfold_11_Type* p11;\n  OnigCodePoint code;\n  int i, j, k, r;\n\n  /* if (CaseFoldInited == 0) init_case_fold_table(); */\n\n  for (i = 0; i < numberof(CaseUnfold_11); i++) {\n    p11 = &CaseUnfold_11[i];\n    for (j = 0; j < p11->to.n; j++) {\n      code = p11->from;\n      r = (*f)(p11->to.code[j], &code, 1, arg);\n      if (r != 0) return r;\n\n      code = p11->to.code[j];\n      r = (*f)(p11->from, &code, 1, arg);\n      if (r != 0) return r;\n\n      for (k = 0; k < j; k++) {\n\tr = (*f)(p11->to.code[j], (OnigCodePoint* )(&p11->to.code[k]), 1, arg);\n\tif (r != 0) return r;\n\n\tr = (*f)(p11->to.code[k], (OnigCodePoint* )(&p11->to.code[j]), 1, arg);\n\tif (r != 0) return r;\n      }\n    }\n  }\n\n#ifdef USE_UNICODE_CASE_FOLD_TURKISH_AZERI\n  if ((flag & ONIGENC_CASE_FOLD_TURKISH_AZERI) != 0) {\n    code = 0x0131;\n    r = (*f)(0x0049, &code, 1, arg);\n    if (r != 0) return r;\n    code = 0x0049;\n    r = (*f)(0x0131, &code, 1, arg);\n    if (r != 0) return r;\n\n    code = 0x0130;\n    r = (*f)(0x0069, &code, 1, arg);\n    if (r != 0) return r;\n    code = 0x0069;\n    r = (*f)(0x0130, &code, 1, arg);\n    if (r != 0) return r;\n  }\n  else {\n#endif\n    for (i = 0; i < numberof(CaseUnfold_11_Locale); i++) {\n      p11 = &CaseUnfold_11_Locale[i];\n      for (j = 0; j < p11->to.n; j++) {\n\tcode = p11->from;\n\tr = (*f)(p11->to.code[j], &code, 1, arg);\n\tif (r != 0) return r;\n\n\tcode = p11->to.code[j];\n\tr = (*f)(p11->from, &code, 1, arg);\n\tif (r != 0) return r;\n\n\tfor (k = 0; k < j; k++) {\n\t  r = (*f)(p11->to.code[j], (OnigCodePoint* )(&p11->to.code[k]),\n\t\t   1, arg);\n\t  if (r != 0) return r;\n\n\t  r = (*f)(p11->to.code[k], (OnigCodePoint* )(&p11->to.code[j]),\n\t\t   1, arg);\n\t  if (r != 0) return r;\n\t}\n      }\n    }\n#ifdef USE_UNICODE_CASE_FOLD_TURKISH_AZERI\n  }\n#endif\n\n  if ((flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n    for (i = 0; i < numberof(CaseUnfold_12); i++) {\n      for (j = 0; j < CaseUnfold_12[i].to.n; j++) {\n\tr = (*f)(CaseUnfold_12[i].to.code[j],\n\t\t (OnigCodePoint* )CaseUnfold_12[i].from, 2, arg);\n\tif (r != 0) return r;\n\n\tfor (k = 0; k < CaseUnfold_12[i].to.n; k++) {\n\t  if (k == j) continue;\n\n\t  r = (*f)(CaseUnfold_12[i].to.code[j],\n\t\t   (OnigCodePoint* )(&CaseUnfold_12[i].to.code[k]), 1, arg);\n\t  if (r != 0) return r;\n\t}\n      }\n    }\n\n#ifdef USE_UNICODE_CASE_FOLD_TURKISH_AZERI\n    if ((flag & ONIGENC_CASE_FOLD_TURKISH_AZERI) == 0) {\n#endif\n      for (i = 0; i < numberof(CaseUnfold_12_Locale); i++) {\n\tfor (j = 0; j < CaseUnfold_12_Locale[i].to.n; j++) {\n\t  r = (*f)(CaseUnfold_12_Locale[i].to.code[j],\n\t\t   (OnigCodePoint* )CaseUnfold_12_Locale[i].from, 2, arg);\n\t  if (r != 0) return r;\n\n\t  for (k = 0; k < CaseUnfold_12_Locale[i].to.n; k++) {\n\t    if (k == j) continue;\n\n\t    r = (*f)(CaseUnfold_12_Locale[i].to.code[j],\n\t\t     (OnigCodePoint* )(&CaseUnfold_12_Locale[i].to.code[k]),\n\t\t     1, arg);\n\t    if (r != 0) return r;\n\t  }\n\t}\n      }\n#ifdef USE_UNICODE_CASE_FOLD_TURKISH_AZERI\n    }\n#endif\n\n    for (i = 0; i < numberof(CaseUnfold_13); i++) {\n      for (j = 0; j < CaseUnfold_13[i].to.n; j++) {\n\tr = (*f)(CaseUnfold_13[i].to.code[j],\n\t\t (OnigCodePoint* )CaseUnfold_13[i].from, 3, arg);\n\tif (r != 0) return r;\n\n\tfor (k = 0; k < CaseUnfold_13[i].to.n; k++) {\n\t  if (k == j) continue;\n\n\t  r = (*f)(CaseUnfold_13[i].to.code[j],\n\t\t   (OnigCodePoint* )(&CaseUnfold_13[i].to.code[k]), 1, arg);\n\t  if (r != 0) return r;\n\t}\n      }\n    }\n  }\n\n  return 0;\n}\n\nextern int\nonigenc_unicode_get_case_fold_codes_by_str(OnigEncoding enc,\n    OnigCaseFoldType flag, const OnigUChar* p, const OnigUChar* end,\n    OnigCaseFoldCodeItem items[])\n{\n  int n, i, j, k, len;\n  OnigCodePoint code, codes[3];\n  CodePointList3 *to, *z3;\n  CodePointList2 *z2;\n\n  if (CaseFoldInited == 0) init_case_fold_table();\n\n  n = 0;\n\n  code = ONIGENC_MBC_TO_CODE(enc, p, end);\n  len = enclen(enc, p);\n\n#ifdef USE_UNICODE_CASE_FOLD_TURKISH_AZERI\n  if ((flag & ONIGENC_CASE_FOLD_TURKISH_AZERI) != 0) {\n    if (code == 0x0049) {\n      items[0].byte_len = len;\n      items[0].code_len = 1;\n      items[0].code[0]  = 0x0131;\n      return 1;\n    }\n    else if (code == 0x0130) {\n      items[0].byte_len = len;\n      items[0].code_len = 1;\n      items[0].code[0]  = 0x0069;\n      return 1;\n    }\n    else if (code == 0x0131) {\n      items[0].byte_len = len;\n      items[0].code_len = 1;\n      items[0].code[0]  = 0x0049;\n      return 1;\n    }\n    else if (code == 0x0069) {\n      items[0].byte_len = len;\n      items[0].code_len = 1;\n      items[0].code[0]  = 0x0130;\n      return 1;\n    }\n  }\n#endif\n\n  if (onig_st_lookup(FoldTable, (st_data_t )code, (void* )&to) != 0) {\n    if (to->n == 1) {\n      OnigCodePoint orig_code = code;\n\n      items[0].byte_len = len;\n      items[0].code_len = 1;\n      items[0].code[0]  = to->code[0];\n      n++;\n\n      code = to->code[0];\n      if (onig_st_lookup(Unfold1Table, (st_data_t )code, (void* )&to) != 0) {\n\tfor (i = 0; i < to->n; i++) {\n\t  if (to->code[i] != orig_code) {\n\t    items[n].byte_len = len;\n\t    items[n].code_len = 1;\n\t    items[n].code[0]  = to->code[i];\n\t    n++;\n\t  }\n\t}\n      }\n    }\n    else if ((flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n      OnigCodePoint cs[3][4];\n      int fn, ncs[3];\n\n      for (fn = 0; fn < to->n; fn++) {\n\tcs[fn][0] = to->code[fn];\n\tif (onig_st_lookup(Unfold1Table, (st_data_t )cs[fn][0],\n\t\t\t   (void* )&z3) != 0) {\n\t  for (i = 0; i < z3->n; i++) {\n\t    cs[fn][i+1] = z3->code[i];\n\t  }\n\t  ncs[fn] = z3->n + 1;\n\t}\n\telse\n\t  ncs[fn] = 1;\n      }\n\n      if (fn == 2) {\n\tfor (i = 0; i < ncs[0]; i++) {\n\t  for (j = 0; j < ncs[1]; j++) {\n\t    items[n].byte_len = len;\n\t    items[n].code_len = 2;\n\t    items[n].code[0]  = cs[0][i];\n\t    items[n].code[1]  = cs[1][j];\n\t    n++;\n\t  }\n\t}\n\n\tif (onig_st_lookup(Unfold2Table, (st_data_t )to->code,\n\t\t\t   (void* )&z2) != 0) {\n\t  for (i = 0; i < z2->n; i++) {\n\t    if (z2->code[i] == code) continue;\n\n\t    items[n].byte_len = len;\n\t    items[n].code_len = 1;\n\t    items[n].code[0]  = z2->code[i];\n\t    n++;\n\t  }\n\t}\n      }\n      else {\n\tfor (i = 0; i < ncs[0]; i++) {\n\t  for (j = 0; j < ncs[1]; j++) {\n\t    for (k = 0; k < ncs[2]; k++) {\n\t      items[n].byte_len = len;\n\t      items[n].code_len = 3;\n\t      items[n].code[0]  = cs[0][i];\n\t      items[n].code[1]  = cs[1][j];\n\t      items[n].code[2]  = cs[2][k];\n\t      n++;\n\t    }\n\t  }\n\t}\n\n\tif (onig_st_lookup(Unfold3Table, (st_data_t )to->code,\n\t\t\t   (void* )&z2) != 0) {\n\t  for (i = 0; i < z2->n; i++) {\n\t    if (z2->code[i] == code) continue;\n\n\t    items[n].byte_len = len;\n\t    items[n].code_len = 1;\n\t    items[n].code[0]  = z2->code[i];\n\t    n++;\n\t  }\n\t}\n      }\n\n      /* multi char folded code is not head of another folded multi char */\n      flag = 0; /* DISABLE_CASE_FOLD_MULTI_CHAR(flag); */\n    }\n  }\n  else {\n    if (onig_st_lookup(Unfold1Table, (st_data_t )code, (void* )&to) != 0) {\n      for (i = 0; i < to->n; i++) {\n\titems[n].byte_len = len;\n\titems[n].code_len = 1;\n\titems[n].code[0]  = to->code[i];\n\tn++;\n      }\n    }\n  }\n\n\n  if ((flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n    p += len;\n    if (p < end) {\n      int clen;\n\n      codes[0] = code;\n      code = ONIGENC_MBC_TO_CODE(enc, p, end);\n      if (onig_st_lookup(FoldTable, (st_data_t )code, (void* )&to) != 0\n\t  && to->n == 1) {\n\tcodes[1] = to->code[0];\n      }\n      else\n\tcodes[1] = code;\n\n      clen = enclen(enc, p);\n      len += clen;\n      if (onig_st_lookup(Unfold2Table, (st_data_t )codes, (void* )&z2) != 0) {\n\tfor (i = 0; i < z2->n; i++) {\n\t  items[n].byte_len = len;\n\t  items[n].code_len = 1;\n\t  items[n].code[0]  = z2->code[i];\n\t  n++;\n\t}\n      }\n\n      p += clen;\n      if (p < end) {\n\tcode = ONIGENC_MBC_TO_CODE(enc, p, end);\n\tif (onig_st_lookup(FoldTable, (st_data_t )code, (void* )&to) != 0\n\t    && to->n == 1) {\n\t  codes[2] = to->code[0];\n\t}\n\telse\n\t  codes[2] = code;\n\n\tclen = enclen(enc, p);\n\tlen += clen;\n\tif (onig_st_lookup(Unfold3Table, (st_data_t )codes,\n\t\t\t   (void* )&z2) != 0) {\n\t  for (i = 0; i < z2->n; i++) {\n\t    items[n].byte_len = len;\n\t    items[n].code_len = 1;\n\t    items[n].code[0]  = z2->code[i];\n\t    n++;\n\t  }\n\t}\n      }\n    }\n  }\n\n  return n;\n}\n"
  },
  {
    "path": "src/Onigmo/enc/utf16_be.c",
    "content": "/**********************************************************************\n  utf16_be.c -  Oniguruma (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2008  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regenc.h\"\n\nstatic const int EncLen_UTF16[] = {\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2\n};\n\nstatic int\nutf16be_mbc_enc_len(const UChar* p)\n{\n  return EncLen_UTF16[*p];\n}\n\nstatic int\nutf16be_mbc_enc_len_se(OnigIterator* it, OnigPosition p)\n{\n  return EncLen_UTF16[ONIG_CHARAT(p)];\n}\n\nstatic int\nutf16be_is_mbc_newline(const UChar* p, const UChar* end)\n{\n  if (p + 1 < end) {\n    if (*(p+1) == 0x0a && *p == 0x00)\n      return 1;\n#ifdef USE_UNICODE_ALL_LINE_TERMINATORS\n    if ((*(p+1) == 0x0b || *(p+1) == 0x0c || *(p+1) == 0x0d || *(p+1) == 0x85)\n\t&& *p == 0x00)\n      return 1;\n    if (*p == 0x20 && (*(p+1) == 0x29 || *(p+1) == 0x28))\n      return 1;\n#endif\n  }\n  return 0;\n}\n\nstatic int\nutf16be_is_mbc_newline_se(OnigIterator* it, OnigPosition p, OnigPosition end)\n{\n  if (p + 1 < end) {\n    const UChar c0 = ONIG_CHARAT(p);\n    const UChar c1 = ONIG_CHARAT(p+1);\n\n    if (c1 == 0x0a && c0 == 0x00)\n      return 1;\n#ifdef USE_UNICODE_ALL_LINE_TERMINATORS\n    if ((c1 == 0x0b || c1 == 0x0c || c1 == 0x0d || c1 == 0x85)\n\t&& c0 == 0x00)\n      return 1;\n    if (c0 == 0x20 && (c1 == 0x29 || c1 == 0x28))\n      return 1;\n#endif\n  }\n  return 0;\n}\n\nstatic OnigCodePoint\nutf16be_mbc_to_code(const UChar* p, const UChar* end ARG_UNUSED)\n{\n  OnigCodePoint code;\n\n  if (UTF16_IS_SURROGATE_FIRST(*p)) {\n    code = ((((p[0] - 0xd8) << 2) + ((p[1] & 0xc0) >> 6) + 1) << 16)\n         + ((((p[1] & 0x3f) << 2) + (p[2] - 0xdc)) << 8)\n         + p[3];\n  }\n  else {\n    code = p[0] * 256 + p[1];\n  }\n  return code;\n}\n\nstatic OnigCodePoint\nutf16be_mbc_to_code_se(OnigIterator* it, OnigPosition p, OnigPosition end ARG_UNUSED)\n{\n  OnigCodePoint code;\n  const UChar c0 = ONIG_CHARAT(p);\n  const UChar c1 = ONIG_CHARAT(p+1);\n\n  if (UTF16_IS_SURROGATE_FIRST(c0)) {\n    code = ((((c0 - 0xd8) << 2) + ((c1 & 0xc0) >> 6) + 1) << 16)\n         + ((((c1 & 0x3f) << 2) + (ONIG_CHARAT(p+2) - 0xdc)) << 8)\n         + ONIG_CHARAT(p+3);\n  }\n  else {\n    code = c0 * 256 + c1;\n  }\n  return code;\n}\n\nstatic int\nutf16be_code_to_mbclen(OnigCodePoint code)\n{\n  return (code > 0xffff ? 4 : 2);\n}\n\nstatic int\nutf16be_code_to_mbc(OnigCodePoint code, UChar *buf)\n{\n  UChar* p = buf;\n\n  if (code > 0xffff) {\n    unsigned int plane, high;\n\n    plane = (code >> 16) - 1;\n    *p++ = (plane >> 2) + 0xd8;\n    high = (code & 0xff00) >> 8;\n    *p++ = ((plane & 0x03) << 6) + (high >> 2);\n    *p++ = (high & 0x03) + 0xdc;\n    *p   = (UChar )(code & 0xff);\n    return 4;\n  }\n  else {\n    *p++ = (UChar )((code & 0xff00) >> 8);\n    *p++ = (UChar )(code & 0xff);\n    return 2;\n  }\n}\n\nstatic int\nutf16be_mbc_case_fold(OnigCaseFoldType flag,\n\t\t      const UChar** pp, const UChar* end, UChar* fold)\n{\n  const UChar* p = *pp;\n\n  if (ONIGENC_IS_ASCII_CODE(*(p+1)) && *p == 0) {\n    p++;\n#ifdef USE_UNICODE_CASE_FOLD_TURKISH_AZERI\n    if ((flag & ONIGENC_CASE_FOLD_TURKISH_AZERI) != 0) {\n      if (*p == 0x49) {\n\t*fold++ = 0x01;\n\t*fold   = 0x31;\n\t(*pp) += 2;\n\treturn 2;\n      }\n    }\n#endif\n\n    *fold++ = 0;\n    *fold   = ONIGENC_ASCII_CODE_TO_LOWER_CASE(*p);\n    *pp += 2;\n    return 2;\n  }\n  else\n    return onigenc_unicode_mbc_case_fold(ONIG_ENCODING_UTF16_BE, flag,\n\t\t\t\t\t pp, end, fold);\n}\n\nstatic int\nutf16be_mbc_case_fold_se(OnigIterator* it, OnigCaseFoldType flag,\n\t\t      OnigPosition* pp, OnigPosition end, UChar* fold)\n{\n  const UChar c0 = ONIG_CHARAT(*pp);\n  const UChar c1 = ONIG_CHARAT(*pp+1);\n\n  if (ONIGENC_IS_ASCII_CODE(c1) && c0 == 0) {\n#ifdef USE_UNICODE_CASE_FOLD_TURKISH_AZERI\n    if ((flag & ONIGENC_CASE_FOLD_TURKISH_AZERI) != 0) {\n      if (c1 == 0x49) {\n\t*fold++ = 0x01;\n\t*fold   = 0x31;\n\t(*pp) += 2;\n\treturn 2;\n      }\n    }\n#endif\n\n    *fold++ = 0;\n    *fold   = ONIGENC_ASCII_CODE_TO_LOWER_CASE(c1);\n    *pp += 2;\n    return 2;\n  }\n  else\n    return onigenc_unicode_mbc_case_fold_se(it, ONIG_ENCODING_UTF16_BE, flag,\n\t\t\t\t\t pp, end, fold);\n}\n\n#if 0\nstatic int\nutf16be_is_mbc_ambiguous(OnigCaseFoldType flag, const UChar** pp, const UChar* end)\n{\n  const UChar* p = *pp;\n\n  (*pp) += EncLen_UTF16[*p];\n\n  if (*p == 0) {\n    int c, v;\n\n    p++;\n    if (*p == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n      return TRUE;\n    }\n\n    c = *p;\n    v = ONIGENC_IS_UNICODE_ISO_8859_1_BIT_CTYPE(c,\n\t\t(BIT_CTYPE_UPPER | BIT_CTYPE_LOWER));\n\n    if ((v | BIT_CTYPE_LOWER) != 0) {\n      /* 0xaa, 0xb5, 0xba are lower case letter, but can't convert. */\n      if (c >= 0xaa && c <= 0xba)\n\treturn FALSE;\n      else\n\treturn TRUE;\n    }\n    return (v != 0 ? TRUE : FALSE);\n  }\n\n  return FALSE;\n}\n#endif\n\nstatic UChar*\nutf16be_left_adjust_char_head(const UChar* start, const UChar* s)\n{\n  if (s <= start) return (UChar* )s;\n\n  if ((s - start) % 2 == 1) {\n    s--;\n  }\n\n  if (UTF16_IS_SURROGATE_SECOND(*s) && s > start + 1)\n    s -= 2;\n\n  return (UChar* )s;\n}\n\nstatic OnigPosition\nutf16be_left_adjust_char_head_se(OnigIterator* it, OnigPosition start, OnigPosition s)\n{\n  if (s <= start) return s;\n\n  if ((s - start) % 2 == 1) {\n    s--;\n  }\n\n  if (UTF16_IS_SURROGATE_SECOND(ONIG_CHARAT(s)) && s > start + 1)\n    s -= 2;\n\n  return s;\n}\n\nstatic int\nutf16be_get_case_fold_codes_by_str(OnigCaseFoldType flag,\n    const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem items[])\n{\n  return onigenc_unicode_get_case_fold_codes_by_str(ONIG_ENCODING_UTF16_BE,\n\t\t\t\t\t\t    flag, p, end, items);\n}\n\nOnigEncodingType OnigEncodingUTF16_BE = {\n  utf16be_mbc_enc_len,\n  utf16be_mbc_enc_len_se,\n  \"UTF-16BE\",   /* name */\n  4,            /* max byte length */\n  2,            /* min byte length */\n  utf16be_is_mbc_newline,\n  utf16be_is_mbc_newline_se,\n  utf16be_mbc_to_code,\n  utf16be_mbc_to_code_se,\n  utf16be_code_to_mbclen,\n  utf16be_code_to_mbc,\n  utf16be_mbc_case_fold,\n  utf16be_mbc_case_fold_se,\n  onigenc_unicode_apply_all_case_fold,\n  utf16be_get_case_fold_codes_by_str,\n  onigenc_unicode_property_name_to_ctype,\n  onigenc_unicode_is_code_ctype,\n  onigenc_utf16_32_get_ctype_code_range,\n  utf16be_left_adjust_char_head,\n  utf16be_left_adjust_char_head_se,\n  onigenc_always_false_is_allowed_reverse_match,\n  ONIGENC_FLAG_UNICODE,\n};\n"
  },
  {
    "path": "src/Onigmo/enc/utf16_le.c",
    "content": "/**********************************************************************\n  utf16_le.c -  Oniguruma (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2008  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regenc.h\"\n\nstatic const int EncLen_UTF16[] = {\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2\n};\n\nstatic int\nutf16le_code_to_mbclen(OnigCodePoint code)\n{\n  return (code > 0xffff ? 4 : 2);\n}\n\nstatic int\nutf16le_mbc_enc_len(const UChar* p)\n{\n  return EncLen_UTF16[*(p+1)];\n}\n\nstatic int\nutf16le_mbc_enc_len_se(OnigIterator* it, OnigPosition p)\n{\n  return EncLen_UTF16[ONIG_CHARAT(p+1)];\n}\n\nstatic int\nutf16le_is_mbc_newline(const UChar* p, const UChar* end)\n{\n  if (p + 1 < end) {\n    if (*p == 0x0a && *(p+1) == 0x00)\n      return 1;\n#ifdef USE_UNICODE_ALL_LINE_TERMINATORS\n    if ((*p == 0x0b || *p == 0x0c || *p == 0x0d || *p == 0x85)\n\t&& *(p+1) == 0x00)\n      return 1;\n    if (*(p+1) == 0x20 && (*p == 0x29 || *p == 0x28))\n      return 1;\n#endif\n  }\n  return 0;\n}\n\nstatic int\nutf16le_is_mbc_newline_se(OnigIterator* it, OnigPosition p, OnigPosition end)\n{\n  if (p + 1 < end) {\n    const UChar c0 = ONIG_CHARAT(p);\n    const UChar c1 = ONIG_CHARAT(p+1);\n\n    if (c0 == 0x0a && c1 == 0x00)\n      return 1;\n#ifdef USE_UNICODE_ALL_LINE_TERMINATORS\n    if ((c0 == 0x0b || c0 == 0x0c || c0 == 0x0d || c0 == 0x85)\n\t&& c1 == 0x00)\n      return 1;\n    if (c1 == 0x20 && (c0 == 0x29 || c0 == 0x28))\n      return 1;\n#endif\n  }\n  return 0;\n}\n\nstatic OnigCodePoint\nutf16le_mbc_to_code(const UChar* p, const UChar* end ARG_UNUSED)\n{\n  OnigCodePoint code;\n  UChar c0 = *p;\n  UChar c1 = *(p+1);\n\n  if (UTF16_IS_SURROGATE_FIRST(c1)) {\n    code = ((((c1 - 0xd8) << 2) + ((c0  & 0xc0) >> 6) + 1) << 16)\n         + ((((c0 & 0x3f) << 2) + (p[3] - 0xdc)) << 8)\n         + p[2];\n  }\n  else {\n    code = c1 * 256 + p[0];\n  }\n  return code;\n}\n\nstatic OnigCodePoint\nutf16le_mbc_to_code_se(OnigIterator* it, OnigPosition p, OnigPosition end ARG_UNUSED)\n{\n  OnigCodePoint code;\n  const UChar c0 = ONIG_CHARAT(p);\n  const UChar c1 = ONIG_CHARAT(p+1);\n\n  if (UTF16_IS_SURROGATE_FIRST(c1)) {\n    code = ((((c1 - 0xd8) << 2) + ((c0  & 0xc0) >> 6) + 1) << 16)\n         + ((((c0 & 0x3f) << 2) + (ONIG_CHARAT(p+3) - 0xdc)) << 8)\n         + ONIG_CHARAT(p+2);\n  }\n  else {\n    code = c1 * 256 + c0;\n  }\n  return code;\n}\n\nstatic int\nutf16le_code_to_mbc(OnigCodePoint code, UChar *buf)\n{\n  UChar* p = buf;\n\n  if (code > 0xffff) {\n    unsigned int plane, high;\n\n    plane = (code >> 16) - 1;\n    high = (code & 0xff00) >> 8;\n\n    *p++ = ((plane & 0x03) << 6) + (high >> 2);\n    *p++ = (plane >> 2) + 0xd8;\n    *p++ = (UChar )(code & 0xff);\n    *p   = (high & 0x03) + 0xdc;\n    return 4;\n  }\n  else {\n    *p++ = (UChar )(code & 0xff);\n    *p++ = (UChar )((code & 0xff00) >> 8);\n    return 2;\n  }\n}\n\nstatic int\nutf16le_mbc_case_fold(OnigCaseFoldType flag,\n\t\t      const UChar** pp, const UChar* end, UChar* fold)\n{\n  const UChar* p = *pp;\n\n  if (ONIGENC_IS_ASCII_CODE(*p) && *(p+1) == 0) {\n#ifdef USE_UNICODE_CASE_FOLD_TURKISH_AZERI\n    if ((flag & ONIGENC_CASE_FOLD_TURKISH_AZERI) != 0) {\n      if (*p == 0x49) {\n\t*fold++ = 0x31;\n\t*fold   = 0x01;\n\t(*pp) += 2;\n\treturn 2;\n      }\n    }\n#endif\n\n    *fold++ = ONIGENC_ASCII_CODE_TO_LOWER_CASE(*p);\n    *fold   = 0;\n    *pp += 2;\n    return 2;\n  }\n  else\n    return onigenc_unicode_mbc_case_fold(ONIG_ENCODING_UTF16_LE, flag, pp, end,\n\t\t\t\t\t fold);\n}\n\nstatic int\nutf16le_mbc_case_fold_se(OnigIterator* it, OnigCaseFoldType flag,\n\t\t      OnigPosition* pp, OnigPosition end, UChar* fold)\n{\n  const UChar c = ONIG_CHARAT(*pp);\n\n  if (ONIGENC_IS_ASCII_CODE(c) && ONIG_CHARAT(*pp+1) == 0) {\n#ifdef USE_UNICODE_CASE_FOLD_TURKISH_AZERI\n    if ((flag & ONIGENC_CASE_FOLD_TURKISH_AZERI) != 0) {\n      if (c == 0x49) {\n\t*fold++ = 0x31;\n\t*fold   = 0x01;\n\t(*pp) += 2;\n\treturn 2;\n      }\n    }\n#endif\n\n    *fold++ = ONIGENC_ASCII_CODE_TO_LOWER_CASE(c);\n    *fold   = 0;\n    *pp += 2;\n    return 2;\n  }\n  else\n    return onigenc_unicode_mbc_case_fold_se(it, ONIG_ENCODING_UTF16_LE, flag, pp, end,\n\t\t\t\t\t fold);\n}\n\n#if 0\nstatic int\nutf16le_is_mbc_ambiguous(OnigCaseFoldType flag, const UChar** pp,\n\t\t\t const UChar* end)\n{\n  const UChar* p = *pp;\n\n  (*pp) += EncLen_UTF16[*(p+1)];\n\n  if (*(p+1) == 0) {\n    int c, v;\n\n    if (*p == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n      return TRUE;\n    }\n\n    c = *p;\n    v = ONIGENC_IS_UNICODE_ISO_8859_1_BIT_CTYPE(c,\n                       (BIT_CTYPE_UPPER | BIT_CTYPE_LOWER));\n    if ((v | BIT_CTYPE_LOWER) != 0) {\n      /* 0xaa, 0xb5, 0xba are lower case letter, but can't convert. */\n      if (c >= 0xaa && c <= 0xba)\n\treturn FALSE;\n      else\n\treturn TRUE;\n    }\n    return (v != 0 ? TRUE : FALSE);\n  }\n\n  return FALSE;\n}\n#endif\n\nstatic UChar*\nutf16le_left_adjust_char_head(const UChar* start, const UChar* s)\n{\n  if (s <= start) return (UChar* )s;\n\n  if ((s - start) % 2 == 1) {\n    s--;\n  }\n\n  if (UTF16_IS_SURROGATE_SECOND(*(s+1)) && s > start + 1)\n    s -= 2;\n\n  return (UChar* )s;\n}\n\nstatic OnigPosition\nutf16le_left_adjust_char_head_se(OnigIterator* it, OnigPosition start, OnigPosition s)\n{\n  if (s <= start) return s;\n\n  if ((s - start) % 2 == 1) {\n    s--;\n  }\n\n  if (UTF16_IS_SURROGATE_SECOND(ONIG_CHARAT(s+1)) && s > start + 1)\n    s -= 2;\n\n  return s;\n}\n\nstatic int\nutf16le_get_case_fold_codes_by_str(OnigCaseFoldType flag,\n    const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem items[])\n{\n  return onigenc_unicode_get_case_fold_codes_by_str(ONIG_ENCODING_UTF16_LE,\n\t\t\t\t\t\t    flag, p, end, items);\n}\n\nOnigEncodingType OnigEncodingUTF16_LE = {\n  utf16le_mbc_enc_len,\n  utf16le_mbc_enc_len_se,\n  \"UTF-16LE\",   /* name */\n  4,            /* max byte length */\n  2,            /* min byte length */\n  utf16le_is_mbc_newline,\n  utf16le_is_mbc_newline_se,\n  utf16le_mbc_to_code,\n  utf16le_mbc_to_code_se,\n  utf16le_code_to_mbclen,\n  utf16le_code_to_mbc,\n  utf16le_mbc_case_fold,\n  utf16le_mbc_case_fold_se,\n  onigenc_unicode_apply_all_case_fold,\n  utf16le_get_case_fold_codes_by_str,\n  onigenc_unicode_property_name_to_ctype,\n  onigenc_unicode_is_code_ctype,\n  onigenc_utf16_32_get_ctype_code_range,\n  utf16le_left_adjust_char_head,\n  utf16le_left_adjust_char_head_se,\n  onigenc_always_false_is_allowed_reverse_match,\n  ONIGENC_FLAG_UNICODE,\n};\n"
  },
  {
    "path": "src/Onigmo/enc/utf32_be.c",
    "content": "/**********************************************************************\n  utf32_be.c -  Oniguruma (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2007  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regenc.h\"\n\nstatic int\nutf32be_mbc_enc_len(const UChar* p ARG_UNUSED)\n{\n  return 4;\n}\n\nstatic int\nutf32be_mbc_enc_len_se(OnigIterator* it ARG_UNUSED, OnigPosition p ARG_UNUSED)\n{\n  return 4;\n}\n\nstatic int\nutf32be_is_mbc_newline(const UChar* p, const UChar* end)\n{\n  if (p + 3 < end) {\n    if (*(p+3) == 0x0a && *(p+2) == 0 && *(p+1) == 0 && *p == 0)\n      return 1;\n#ifdef USE_UNICODE_ALL_LINE_TERMINATORS\n    if ((*(p+3) == 0x0b || *(p+3) == 0x0c || *(p+3) == 0x0d || *(p+3) == 0x85)\n\t&& *(p+2) == 0 && *(p+1) == 0 && *p == 0x00)\n      return 1;\n    if (*(p+2) == 0x20 && (*(p+3) == 0x29 || *(p+3) == 0x28)\n\t&& *(p+1) == 0 && *p == 0)\n      return 1;\n#endif\n  }\n  return 0;\n}\n\nstatic int\nutf32be_is_mbc_newline_se(OnigIterator* it, OnigPosition p, OnigPosition end)\n{\n  if (p + 3 < end) {\n\tconst UChar c2 = ONIG_CHARAT(p+2);\n    const UChar c3 = ONIG_CHARAT(p+3);\n\n    if (c3 == 0x0a && c2 == 0 && ONIG_CHARAT(p+1) == 0 && ONIG_CHARAT(p) == 0)\n      return 1;\n#ifdef USE_UNICODE_ALL_LINE_TERMINATORS\n    if ((c3 == 0x0b || c3 == 0x0c || c3 == 0x0d || c3 == 0x85)\n\t&& c2 == 0 && ONIG_CHARAT(p+1) == 0 && ONIG_CHARAT(p) == 0x00)\n      return 1;\n    if (c2 == 0x20 && (c3 == 0x29 || c3 == 0x28)\n\t&& ONIG_CHARAT(p+1) == 0 && ONIG_CHARAT(p) == 0)\n      return 1;\n#endif\n  }\n  return 0;\n}\n\nstatic OnigCodePoint\nutf32be_mbc_to_code(const UChar* p, const UChar* end ARG_UNUSED)\n{\n  return (OnigCodePoint )(((p[0] * 256 + p[1]) * 256 + p[2]) * 256 + p[3]);\n}\n\nstatic OnigCodePoint\nutf32be_mbc_to_code_se(OnigIterator* it, OnigPosition p, OnigPosition end ARG_UNUSED)\n{\n  return (OnigCodePoint )(((ONIG_CHARAT(p) * 256 + ONIG_CHARAT(p+1)) * 256 + ONIG_CHARAT(p+2)) * 256 + ONIG_CHARAT(p+3));\n}\n\nstatic int\nutf32be_code_to_mbclen(OnigCodePoint code ARG_UNUSED)\n{\n  return 4;\n}\n\nstatic int\nutf32be_code_to_mbc(OnigCodePoint code, UChar *buf)\n{\n  UChar* p = buf;\n\n  *p++ = (UChar )((code & 0xff000000) >>24);\n  *p++ = (UChar )((code & 0xff0000)   >>16);\n  *p++ = (UChar )((code & 0xff00)     >> 8);\n  *p++ = (UChar ) (code & 0xff);\n  return 4;\n}\n\nstatic int\nutf32be_mbc_case_fold(OnigCaseFoldType flag,\n\t\t      const UChar** pp, const UChar* end, UChar* fold)\n{\n  const UChar* p = *pp;\n\n  if (ONIGENC_IS_ASCII_CODE(*(p+3)) && *(p+2) == 0 && *(p+1) == 0 && *p == 0) {\n    *fold++ = 0;\n    *fold++ = 0;\n\n#ifdef USE_UNICODE_CASE_FOLD_TURKISH_AZERI\n    if ((flag & ONIGENC_CASE_FOLD_TURKISH_AZERI) != 0) {\n      if (*(p+3) == 0x49) {\n\t*fold++ = 0x01;\n\t*fold   = 0x31;\n\t(*pp) += 4;\n\treturn 4;\n      }\n    }\n#endif\n\n    *fold++ = 0;\n    *fold   = ONIGENC_ASCII_CODE_TO_LOWER_CASE(*(p+3));\n    *pp += 4;\n    return 4;\n  }\n  else\n    return onigenc_unicode_mbc_case_fold(ONIG_ENCODING_UTF32_BE, flag, pp, end,\n\t\t\t\t\t fold);\n}\n\nstatic int\nutf32be_mbc_case_fold_se(OnigIterator* it, OnigCaseFoldType flag,\n\t\t      OnigPosition* pp, OnigPosition end, UChar* fold)\n{\n  OnigPosition p = *pp;\n  const UChar c3 = ONIG_CHARAT(p+3);\n\n  if (ONIGENC_IS_ASCII_CODE(c3) && ONIG_CHARAT(p+2) == 0 && ONIG_CHARAT(p+1) == 0 && ONIG_CHARAT(p) == 0) {\n    *fold++ = 0;\n    *fold++ = 0;\n\n#ifdef USE_UNICODE_CASE_FOLD_TURKISH_AZERI\n    if ((flag & ONIGENC_CASE_FOLD_TURKISH_AZERI) != 0) {\n      if (c3 == 0x49) {\n\t*fold++ = 0x01;\n\t*fold   = 0x31;\n\t(*pp) += 4;\n\treturn 4;\n      }\n    }\n#endif\n\n    *fold++ = 0;\n    *fold   = ONIGENC_ASCII_CODE_TO_LOWER_CASE(c3);\n    *pp += 4;\n    return 4;\n  }\n  else\n    return onigenc_unicode_mbc_case_fold_se(it, ONIG_ENCODING_UTF32_BE, flag, pp, end,\n\t\t\t\t\t fold);\n}\n\n#if 0\nstatic int\nutf32be_is_mbc_ambiguous(OnigCaseFoldType flag, const UChar** pp, const UChar* end)\n{\n  const UChar* p = *pp;\n\n  (*pp) += 4;\n\n  if (*(p+2) == 0 && *(p+1) == 0 && *p == 0) {\n    int c, v;\n\n    p += 3;\n    if (*p == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n      return TRUE;\n    }\n\n    c = *p;\n    v = ONIGENC_IS_UNICODE_ISO_8859_1_BIT_CTYPE(c,\n                       (BIT_CTYPE_UPPER | BIT_CTYPE_LOWER));\n    if ((v | BIT_CTYPE_LOWER) != 0) {\n      /* 0xaa, 0xb5, 0xba are lower case letter, but can't convert. */\n      if (c >= 0xaa && c <= 0xba)\n\treturn FALSE;\n      else\n\treturn TRUE;\n    }\n    return (v != 0 ? TRUE : FALSE);\n  }\n\n  return FALSE;\n}\n#endif\n\nstatic UChar*\nutf32be_left_adjust_char_head(const UChar* start, const UChar* s)\n{\n  int rem;\n\n  if (s <= start) return (UChar* )s;\n\n  rem = (int )((s - start) % 4);\n  return (UChar* )(s - rem);\n}\n\nstatic OnigPosition\nutf32be_left_adjust_char_head_se(OnigIterator* it, OnigPosition start, OnigPosition s)\n{\n  int rem;\n\n  if (s <= start) return s;\n\n  rem = (int )((s - start) % 4);\n  return (s - rem);\n}\n\nstatic int\nutf32be_get_case_fold_codes_by_str(OnigCaseFoldType flag,\n    const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem items[])\n{\n  return onigenc_unicode_get_case_fold_codes_by_str(ONIG_ENCODING_UTF32_BE,\n\t\t\t\t\t\t    flag, p, end, items);\n}\n\nOnigEncodingType OnigEncodingUTF32_BE = {\n  utf32be_mbc_enc_len,\n  utf32be_mbc_enc_len_se,\n  \"UTF-32BE\",   /* name */\n  4,            /* max byte length */\n  4,            /* min byte length */\n  utf32be_is_mbc_newline,\n  utf32be_is_mbc_newline_se,\n  utf32be_mbc_to_code,\n  utf32be_mbc_to_code_se,\n  utf32be_code_to_mbclen,\n  utf32be_code_to_mbc,\n  utf32be_mbc_case_fold,\n  utf32be_mbc_case_fold_se,\n  onigenc_unicode_apply_all_case_fold,\n  utf32be_get_case_fold_codes_by_str,\n  onigenc_unicode_property_name_to_ctype,\n  onigenc_unicode_is_code_ctype,\n  onigenc_utf16_32_get_ctype_code_range,\n  utf32be_left_adjust_char_head,\n  utf32be_left_adjust_char_head_se,\n  onigenc_always_false_is_allowed_reverse_match,\n  ONIGENC_FLAG_UNICODE,\n};\n"
  },
  {
    "path": "src/Onigmo/enc/utf32_le.c",
    "content": "/**********************************************************************\n  utf32_le.c -  Oniguruma (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2007  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regenc.h\"\n\nstatic int\nutf32le_mbc_enc_len(const UChar* p ARG_UNUSED)\n{\n  return 4;\n}\n\nstatic int\nutf32le_mbc_enc_len_se(OnigIterator* it ARG_UNUSED, OnigPosition p ARG_UNUSED)\n{\n  return 4;\n}\n\nstatic int\nutf32le_is_mbc_newline(const UChar* p, const UChar* end)\n{\n  if (p + 3 < end) {\n    if (*p == 0x0a && *(p+1) == 0 && *(p+2) == 0 && *(p+3) == 0)\n      return 1;\n#ifdef USE_UNICODE_ALL_LINE_TERMINATORS\n    if ((*p == 0x0b ||*p == 0x0c ||*p == 0x0d || *p == 0x85)\n\t&& *(p+1) == 0x00 && *(p+2) == 0x00 && *(p+3) == 0x00)\n      return 1;\n    if (*(p+1) == 0x20 && (*p == 0x29 || *p == 0x28)\n\t&& *(p+2) == 0x00 && *(p+3) == 0x00)\n      return 1;\n#endif\n  }\n  return 0;\n}\n\nstatic int\nutf32le_is_mbc_newline_se(OnigIterator* it, OnigPosition p, OnigPosition end)\n{\n  if (p + 3 < end) {\n    const UChar c0 = ONIG_CHARAT(p);\n    const UChar c1 = ONIG_CHARAT(p+1);\n\n    if (c0 == 0x0a && c1 == 0 && ONIG_CHARAT(p+2) == 0 && ONIG_CHARAT(p+3) == 0)\n      return 1;\n#ifdef USE_UNICODE_ALL_LINE_TERMINATORS\n    if ((c0 == 0x0b || c0 == 0x0c || c0 == 0x0d || c0 == 0x85)\n\t&& c1 == 0x00 && ONIG_CHARAT(p+2) == 0x00 && ONIG_CHARAT(p+3) == 0x00)\n      return 1;\n    if (c1 == 0x20 && (c0 == 0x29 || c0 == 0x28)\n\t&& ONIG_CHARAT(p+2) == 0x00 && ONIG_CHARAT(p+3) == 0x00)\n      return 1;\n#endif\n  }\n  return 0;\n}\n\nstatic OnigCodePoint\nutf32le_mbc_to_code(const UChar* p, const UChar* end ARG_UNUSED)\n{\n  return (OnigCodePoint )(((p[3] * 256 + p[2]) * 256 + p[1]) * 256 + p[0]);\n}\n\nstatic OnigCodePoint\nutf32le_mbc_to_code_se(OnigIterator* it, OnigPosition p, OnigPosition end ARG_UNUSED)\n{\n  return (OnigCodePoint )(((ONIG_CHARAT(p+3) * 256 + ONIG_CHARAT(p+2)) * 256 + ONIG_CHARAT(p+1)) * 256 + ONIG_CHARAT(p));\n}\n\nstatic int\nutf32le_code_to_mbclen(OnigCodePoint code ARG_UNUSED)\n{\n  return 4;\n}\n\nstatic int\nutf32le_code_to_mbc(OnigCodePoint code, UChar *buf)\n{\n  UChar* p = buf;\n\n  *p++ = (UChar ) (code & 0xff);\n  *p++ = (UChar )((code & 0xff00)     >> 8);\n  *p++ = (UChar )((code & 0xff0000)   >>16);\n  *p++ = (UChar )((code & 0xff000000) >>24);\n  return 4;\n}\n\nstatic int\nutf32le_mbc_case_fold(OnigCaseFoldType flag,\n\t\t      const UChar** pp, const UChar* end, UChar* fold)\n{\n  const UChar* p = *pp;\n\n  if (ONIGENC_IS_ASCII_CODE(*p) && *(p+1) == 0 && *(p+2) == 0 && *(p+3) == 0) {\n#ifdef USE_UNICODE_CASE_FOLD_TURKISH_AZERI\n    if ((flag & ONIGENC_CASE_FOLD_TURKISH_AZERI) != 0) {\n      if (*p == 0x49) {\n\t*fold++ = 0x31;\n\t*fold++ = 0x01;\n      }\n    }\n    else {\n#endif\n      *fold++ = ONIGENC_ASCII_CODE_TO_LOWER_CASE(*p);\n      *fold++ = 0;\n#ifdef USE_UNICODE_CASE_FOLD_TURKISH_AZERI\n    }\n#endif\n\n    *fold++ = 0;\n    *fold   = 0;\n    *pp += 4;\n    return 4;\n  }\n  else\n    return onigenc_unicode_mbc_case_fold(ONIG_ENCODING_UTF32_LE, flag, pp, end,\n\t\t\t\t\t fold);\n}\n\nstatic int\nutf32le_mbc_case_fold_se(OnigIterator* it, OnigCaseFoldType flag,\n\t\t      OnigPosition* pp, OnigPosition end, UChar* fold)\n{\n  const OnigPosition p = *pp;\n  const UChar c = ONIG_CHARAT(p);\n\n  if (ONIGENC_IS_ASCII_CODE(c) && ONIG_CHARAT(p+1) == 0 && ONIG_CHARAT(p+2) == 0 && ONIG_CHARAT(p+3) == 0) {\n#ifdef USE_UNICODE_CASE_FOLD_TURKISH_AZERI\n    if ((flag & ONIGENC_CASE_FOLD_TURKISH_AZERI) != 0) {\n      if (c == 0x49) {\n\t*fold++ = 0x31;\n\t*fold++ = 0x01;\n      }\n    }\n    else {\n#endif\n      *fold++ = ONIGENC_ASCII_CODE_TO_LOWER_CASE(c);\n      *fold++ = 0;\n#ifdef USE_UNICODE_CASE_FOLD_TURKISH_AZERI\n    }\n#endif\n\n    *fold++ = 0;\n    *fold   = 0;\n    *pp += 4;\n    return 4;\n  }\n  else\n    return onigenc_unicode_mbc_case_fold_se(it, ONIG_ENCODING_UTF32_LE, flag, pp, end,\n\t\t\t\t\t fold);\n}\n\n#if 0\nstatic int\nutf32le_is_mbc_ambiguous(OnigCaseFoldType flag, const UChar** pp, const UChar* end)\n{\n  const UChar* p = *pp;\n\n  (*pp) += 4;\n\n  if (*(p+1) == 0 && *(p+2) == 0 && *(p+3) == 0) {\n    int c, v;\n\n    if (*p == 0xdf && (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n      return TRUE;\n    }\n\n    c = *p;\n    v = ONIGENC_IS_UNICODE_ISO_8859_1_BIT_CTYPE(c,\n                       (BIT_CTYPE_UPPER | BIT_CTYPE_LOWER));\n    if ((v | BIT_CTYPE_LOWER) != 0) {\n      /* 0xaa, 0xb5, 0xba are lower case letter, but can't convert. */\n      if (c >= 0xaa && c <= 0xba)\n\treturn FALSE;\n      else\n\treturn TRUE;\n    }\n    return (v != 0 ? TRUE : FALSE);\n  }\n\n  return FALSE;\n}\n#endif\n\nstatic UChar*\nutf32le_left_adjust_char_head(const UChar* start, const UChar* s)\n{\n  int rem;\n\n  if (s <= start) return (UChar* )s;\n\n  rem = (int )((s - start) % 4);\n  return (UChar* )(s - rem);\n}\n\nstatic OnigPosition\nutf32le_left_adjust_char_head_se(OnigIterator* it, OnigPosition start, OnigPosition s)\n{\n  int rem;\n\n  if (s <= start) return s;\n\n  rem = (int )((s - start) % 4);\n  return (s - rem);\n}\n\nstatic int\nutf32le_get_case_fold_codes_by_str(OnigCaseFoldType flag,\n    const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem items[])\n{\n  return onigenc_unicode_get_case_fold_codes_by_str(ONIG_ENCODING_UTF32_LE,\n\t\t\t\t\t\t    flag, p, end, items);\n}\n\nOnigEncodingType OnigEncodingUTF32_LE = {\n  utf32le_mbc_enc_len,\n  utf32le_mbc_enc_len_se,\n  \"UTF-32LE\",   /* name */\n  4,            /* max byte length */\n  4,            /* min byte length */\n  utf32le_is_mbc_newline,\n  utf32le_is_mbc_newline_se,\n  utf32le_mbc_to_code,\n  utf32le_mbc_to_code_se,\n  utf32le_code_to_mbclen,\n  utf32le_code_to_mbc,\n  utf32le_mbc_case_fold,\n  utf32le_mbc_case_fold_se,\n  onigenc_unicode_apply_all_case_fold,\n  utf32le_get_case_fold_codes_by_str,\n  onigenc_unicode_property_name_to_ctype,\n  onigenc_unicode_is_code_ctype,\n  onigenc_utf16_32_get_ctype_code_range,\n  utf32le_left_adjust_char_head,\n  utf32le_left_adjust_char_head_se,\n  onigenc_always_false_is_allowed_reverse_match,\n  ONIGENC_FLAG_UNICODE,\n};\n"
  },
  {
    "path": "src/Onigmo/enc/utf8.c",
    "content": "/**********************************************************************\n  utf8.c -  Oniguruma (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2007  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regenc.h\"\n\n#define USE_INVALID_CODE_SCHEME\n\n#ifdef USE_INVALID_CODE_SCHEME\n/* virtual codepoint values for invalid encoding byte 0xfe and 0xff */\n#define INVALID_CODE_FE   0xfffffffe\n#define INVALID_CODE_FF   0xffffffff\n#define VALID_CODE_LIMIT  0x7fffffff\n#endif\n\n#define utf8_islead(c)     ((UChar )((c) & 0xc0) != 0x80)\n\nstatic const int EncLen_UTF8[] = {\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,\n  3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,\n  4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 1, 1\n};\n\nstatic int\nmbc_enc_len(const UChar* p)\n{\n  return EncLen_UTF8[*p];\n}\n\nstatic int\nmbc_enc_len_se(OnigIterator* it, OnigPosition p)\n{\n  return EncLen_UTF8[ONIG_CHARAT(p)];\n}\n\nstatic int\nis_mbc_newline(const UChar* p, const UChar* end)\n{\n  if (p < end) {\n    if (*p == 0x0a) return 1;\n\n#ifdef USE_UNICODE_ALL_LINE_TERMINATORS\n    if (*p == 0x0b || *p == 0x0c || *p == 0x0d) return 1;\n    if (p + 1 < end) {\n      if (*(p+1) == 0x85 && *p == 0xc2) /* U+0085 */\n\treturn 1;\n      if (p + 2 < end) {\n\tif ((*(p+2) == 0xa8 || *(p+2) == 0xa9)\n\t    && *(p+1) == 0x80 && *p == 0xe2)  /* U+2028, U+2029 */\n\t  return 1;\n      }\n    }\n#endif\n  }\n\n  return 0;\n}\n\nstatic int\nis_mbc_newline_se(OnigIterator* it, OnigPosition p, OnigPosition end)\n{\n  if (p < end) {\n\tconst UChar c0 = ONIG_CHARAT(p);\n    if (c0 == 0x0a) return 1;\n\n#ifdef USE_UNICODE_ALL_LINE_TERMINATORS\n    if (c0 == 0x0b || c0 == 0x0c || c0 == 0x0d) return 1;\n    if (p + 1 < end) {\n\t  const UChar c1 = ONIG_CHARAT(p+1);\n      if (c1 == 0x85 && c0 == 0xc2) /* U+0085 */\n\treturn 1;\n      if (p + 2 < end) {\n\t  const UChar c2 = ONIG_CHARAT(p+2);\n\tif ((c2 == 0xa8 || c2 == 0xa9)\n\t    && c1 == 0x80 && c0 == 0xe2)  /* U+2028, U+2029 */\n\t  return 1;\n      }\n    }\n#endif\n  }\n\n  return 0;\n}\n\nstatic OnigCodePoint\nmbc_to_code(const UChar* p, const UChar* end ARG_UNUSED)\n{\n  int c, len;\n  OnigCodePoint n;\n\n  len = mbc_enc_len(p);\n  c = *p++;\n  if (len > 1) {\n    len--;\n    n = c & ((1 << (6 - len)) - 1);\n    while (len--) {\n      c = *p++;\n      n = (n << 6) | (c & ((1 << 6) - 1));\n    }\n    return n;\n  }\n  else {\n#ifdef USE_INVALID_CODE_SCHEME\n    if (c > 0xfd) {\n      return ((c == 0xfe) ? INVALID_CODE_FE : INVALID_CODE_FF);\n    }\n#endif\n    return (OnigCodePoint )c;\n  }\n}\n\nstatic OnigCodePoint\nmbc_to_code_se(OnigIterator* it, OnigPosition p, OnigPosition end ARG_UNUSED)\n{\n  int c, len;\n  OnigCodePoint n;\n\n  len = mbc_enc_len_se(it, p);\n  c = ONIG_CHARAT(p++);\n  if (len > 1) {\n    len--;\n    n = c & ((1 << (6 - len)) - 1);\n    while (len--) {\n      c = ONIG_CHARAT(p++);\n      n = (n << 6) | (c & ((1 << 6) - 1));\n    }\n    return n;\n  }\n  else {\n#ifdef USE_INVALID_CODE_SCHEME\n    if (c > 0xfd) {\n      return ((c == 0xfe) ? INVALID_CODE_FE : INVALID_CODE_FF);\n    }\n#endif\n    return (OnigCodePoint )c;\n  }\n}\n\nstatic int\ncode_to_mbclen(OnigCodePoint code)\n{\n  if      ((code & 0xffffff80) == 0) return 1;\n  else if ((code & 0xfffff800) == 0) return 2;\n  else if ((code & 0xffff0000) == 0) return 3;\n  else if ((code & 0xffe00000) == 0) return 4;\n  else if ((code & 0xfc000000) == 0) return 5;\n  else if ((code & 0x80000000) == 0) return 6;\n#ifdef USE_INVALID_CODE_SCHEME\n  else if (code == INVALID_CODE_FE) return 1;\n  else if (code == INVALID_CODE_FF) return 1;\n#endif\n  else\n    return ONIGERR_INVALID_CODE_POINT_VALUE;\n}\n\nstatic int\ncode_to_mbc(OnigCodePoint code, UChar *buf)\n{\n#define UTF8_TRAILS(code, shift) (UChar )((((code) >> (shift)) & 0x3f) | 0x80)\n#define UTF8_TRAIL0(code)        (UChar )(((code) & 0x3f) | 0x80)\n\n  if ((code & 0xffffff80) == 0) {\n    *buf = (UChar )code;\n    return 1;\n  }\n  else {\n    UChar *p = buf;\n\n    if ((code & 0xfffff800) == 0) {\n      *p++ = (UChar )(((code>>6)& 0x1f) | 0xc0);\n    }\n    else if ((code & 0xffff0000) == 0) {\n      *p++ = (UChar )(((code>>12) & 0x0f) | 0xe0);\n      *p++ = UTF8_TRAILS(code, 6);\n    }\n    else if ((code & 0xffe00000) == 0) {\n      *p++ = (UChar )(((code>>18) & 0x07) | 0xf0);\n      *p++ = UTF8_TRAILS(code, 12);\n      *p++ = UTF8_TRAILS(code,  6);\n    }\n    else if ((code & 0xfc000000) == 0) {\n      *p++ = (UChar )(((code>>24) & 0x03) | 0xf8);\n      *p++ = UTF8_TRAILS(code, 18);\n      *p++ = UTF8_TRAILS(code, 12);\n      *p++ = UTF8_TRAILS(code,  6);\n    }\n    else if ((code & 0x80000000) == 0) {\n      *p++ = (UChar )(((code>>30) & 0x01) | 0xfc);\n      *p++ = UTF8_TRAILS(code, 24);\n      *p++ = UTF8_TRAILS(code, 18);\n      *p++ = UTF8_TRAILS(code, 12);\n      *p++ = UTF8_TRAILS(code,  6);\n    }\n#ifdef USE_INVALID_CODE_SCHEME\n    else if (code == INVALID_CODE_FE) {\n      *p = 0xfe;\n      return 1;\n    }\n    else if (code == INVALID_CODE_FF) {\n      *p = 0xff;\n      return 1;\n    }\n#endif\n    else {\n      return ONIGERR_TOO_BIG_WIDE_CHAR_VALUE;\n    }\n\n    *p++ = UTF8_TRAIL0(code);\n    return (int )(p - buf);\n  }\n}\n\nstatic int\nmbc_case_fold(OnigCaseFoldType flag, const UChar** pp,\n\t      const UChar* end, UChar* fold)\n{\n  const UChar* p = *pp;\n\n  if (ONIGENC_IS_MBC_ASCII(p)) {\n#ifdef USE_UNICODE_CASE_FOLD_TURKISH_AZERI\n    if ((flag & ONIGENC_CASE_FOLD_TURKISH_AZERI) != 0) {\n      if (*p == 0x49) {\n\t*fold++ = 0xc4;\n\t*fold   = 0xb1;\n\t(*pp)++;\n\treturn 2;\n      }\n    }\n#endif\n\n    *fold = ONIGENC_ASCII_CODE_TO_LOWER_CASE(*p);\n    (*pp)++;\n    return 1; /* return byte length of converted char to lower */\n  }\n  else {\n    return onigenc_unicode_mbc_case_fold(ONIG_ENCODING_UTF8, flag,\n\t\t\t\t\t pp, end, fold);\n  }\n}\n\nstatic int\nmbc_case_fold_se(OnigIterator* it, OnigCaseFoldType flag, OnigPosition* pp,\n\t      OnigPosition end, UChar* fold)\n{\n  const UChar c = ONIG_CHARAT(*pp);\n\n  if (ONIGENC_IS_MBC_ASCII_SE(c)) {\n#ifdef USE_UNICODE_CASE_FOLD_TURKISH_AZERI\n    if ((flag & ONIGENC_CASE_FOLD_TURKISH_AZERI) != 0) {\n      if (c == 0x49) {\n\t*fold++ = 0xc4;\n\t*fold   = 0xb1;\n\t(*pp)++;\n\treturn 2;\n      }\n    }\n#endif\n\n    *fold = ONIGENC_ASCII_CODE_TO_LOWER_CASE(c);\n    (*pp)++;\n    return 1; /* return byte length of converted char to lower */\n  }\n  else {\n    return onigenc_unicode_mbc_case_fold_se(it, ONIG_ENCODING_UTF8, flag,\n\t\t\t\t\t pp, end, fold);\n  }\n}\n\n#if 0\nstatic int\nis_mbc_ambiguous(OnigCaseFoldType flag, const UChar** pp, const UChar* end)\n{\n  const UChar* p = *pp;\n\n  if (ONIGENC_IS_MBC_ASCII(p)) {\n    (*pp)++;\n    return ONIGENC_IS_ASCII_CODE_CASE_AMBIG(*p);\n  }\n  else {\n    (*pp) += mbc_enc_len(p);\n\n    if (*p == 0xc3) {\n      int c = *(p + 1);\n      if (c >= 0x80) {\n\tif (c <= (UChar )0x9e) { /* upper */\n\t  if (c == (UChar )0x97) return FALSE;\n\t  return TRUE;\n\t}\n\telse if (c >= (UChar )0xa0 && c <= (UChar )0xbe) { /* lower */\n\t  if (c == (UChar )'\\267') return FALSE;\n\t  return TRUE;\n\t}\n        else if (c == (UChar )0x9f &&\n                 (flag & INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR) != 0) {\n\t  return TRUE;\n        }\n      }\n    }\n  }\n\n  return FALSE;\n}\n#endif\n\n\nstatic int\nget_ctype_code_range(OnigCtype ctype, OnigCodePoint *sb_out,\n\t\t     const OnigCodePoint* ranges[])\n{\n  *sb_out = 0x80;\n  return onigenc_unicode_ctype_code_range(ctype, ranges);\n}\n\n\nstatic UChar*\nleft_adjust_char_head(const UChar* start, const UChar* s)\n{\n  const UChar *p;\n\n  if (s <= start) return (UChar* )s;\n  p = s;\n\n  while (!utf8_islead(*p) && p > start) p--;\n  return (UChar* )p;\n}\n\nstatic OnigPosition\nleft_adjust_char_head_se(OnigIterator* it, OnigPosition start, OnigPosition s)\n{\n  OnigPosition p;\n\n  if (s <= start) return s;\n  p = s;\n\n  while (!utf8_islead(ONIG_CHARAT(p)) && p > start) p--;\n  return p;\n}\n\nstatic int\nget_case_fold_codes_by_str(OnigCaseFoldType flag,\n    const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem items[])\n{\n  return onigenc_unicode_get_case_fold_codes_by_str(ONIG_ENCODING_UTF8,\n\t\t\t\t\t\t    flag, p, end, items);\n}\n\nOnigEncodingType OnigEncodingUTF8 = {\n  mbc_enc_len,\n  mbc_enc_len_se,\n  \"UTF-8\",     /* name */\n  6,           /* max byte length */\n  1,           /* min byte length */\n  is_mbc_newline,\n  is_mbc_newline_se,\n  mbc_to_code,\n  mbc_to_code_se,\n  code_to_mbclen,\n  code_to_mbc,\n  mbc_case_fold,\n  mbc_case_fold_se,\n  onigenc_unicode_apply_all_case_fold,\n  get_case_fold_codes_by_str,\n  onigenc_unicode_property_name_to_ctype,\n  onigenc_unicode_is_code_ctype,\n  get_ctype_code_range,\n  left_adjust_char_head,\n  left_adjust_char_head_se,\n  onigenc_always_true_is_allowed_reverse_match,\n  ONIGENC_FLAG_UNICODE,\n};\n"
  },
  {
    "path": "src/Onigmo/index.html",
    "content": "<html>\n<head>\n  <meta HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html;CHARSET=x-sjis\">\n  <title>Oniguruma</title>\n</head>\n<body BGCOLOR=\"#ffffff\" VLINK=\"#808040\" TEXT=\"#696969\">\n\n<h1>Oniguruma</h1> (<a href=\"index_ja.html\">Japanese</a>)\n\n<p>\n(c) K.Kosako, updated at: 2013/04/04\n</p>\n\n<dl>\n<font color=\"orange\">\n<dt><b>What's new</b>\n</font>\n<ul>\n<li>2013/04/04: Version 5.9.4 released.</li>\n<li>2007/08/16: Version 4.7.1 released.</li>\n<li>2007/06/20: Version 2.5.9 released.</li>\n<li>2007/06/20: Maintainer of 2.x was changed.</li>\n</ul>\n</dl>\n<hr>\n\n<p>\nOniguruma is a regular expressions library.<br>\nThe characteristics of this library is that different character encoding\n<br>for every regular expression object can be specified.\n<br>(supported APIs: GNU regex, POSIX and Oniguruma native)\n</p>\n\n<dl>\n<dt><b>Supported character encodings:</b><br>\nASCII, UTF-8, UTF-16BE, UTF-16LE, UTF-32BE, UTF-32LE,<br>\nEUC-JP, EUC-TW, EUC-KR, EUC-CN,<br>\nShift_JIS, Big5, GB18030, KOI8-R, CP1251,<br>\nISO-8859-1, ISO-8859-2, ISO-8859-3, ISO-8859-4, ISO-8859-5,<br>\nISO-8859-6, ISO-8859-7, ISO-8859-8, ISO-8859-9, ISO-8859-10,<br>\nISO-8859-11, ISO-8859-13, ISO-8859-14, ISO-8859-15, ISO-8859-16<br>\n<font color=\"orange\">\n(GB18030 encoding was contributed by KUBO Takehiro)<br>\n(CP1251 encoding was contributed by Byte)\n</font>\n</p>\n</dl>\n\n<hr>\n\n<dt><b>License:</b> BSD license.\n\n<dl>\n<dt><b>Platform:</b>\n<ul>\n<li> Unix (include Mac OS X)\n<li> Cygwin\n<li> Win32\n</ul>\n\n<br>\n\n<dt><b>Download:</b>\n<ul>\n<li> <a href=\"archive/onig-5.9.4.tar.gz\">Latest release version 5.9.4</a> (2013/04/04)   <a href=\"HISTORY_5X.txt\">Change Log</a>\n<li> <a href=\"archive/onig-5.9.3.tar.gz\">5.9.3</a> (2012/10/26)\n<li> <a href=\"archive/onig-4.7.1.tar.gz\">Latest release version 4.7.1</a> (2007/08/16)   <a href=\"HISTORY_4X.txt\">Change Log</a>\n<li> <a href=\"archive/onig-4.7.0.tar.gz\">4.7.0</a> (2007/06/18)\n<li> <a href=\"archive/onigd2_5_9.tar.gz\">Latest release version 2.5.9</a> (2007/06/20)   <a href=\"HISTORY_2X.txt\">Change Log</a>\n</ul>\n\n<br>\n<font color=\"red\">\nMaintainer of 2.x was changed to Hannes Wyss &lt;hwyss AT ywesee.com&gt;.<br>\nAbout 2.x, please contact him.<br>\n</font>\n* 5.x supports Unicode Property/Script.<br>\n* 2.x supports Ruby1.6/1.8.<br>\n\n<br>\n<dt><b>Documents:</b> (version 5.9.4)\n<ul>\n <li> <a href=\"doc/RE.txt\">Regular Expressions</a>\n      <a href=\"doc/RE.ja.txt\">(Japanese: EUC-JP)</a>\n <li> <a href=\"doc/API.txt\">Oniguruma API</a>\n      <a href=\"doc/API.ja.txt\">(Japanese: EUC-JP)</a>\n</ul>\n\n<br>\n<dt><b>Sample Programs:</b>\n<ul>\n <li><a href=\"sample/simple.c\">example of the minimum</a>\n <li><a href=\"sample/sql.c\">example of the variable syntax and meta character (SQL-like pattern match)</a>\n</ul>\n\n<br>\n<dt><b>Site Links:</b>\n<ul>\n<li> <a href=\"http://www.freebsd.org/cgi/cvsweb.cgi/ports/devel/oniguruma/\">FreeBSD ports</a>\n<li> <a href=\"http://www.softantenna.com/lib/1953/index.html\">SoftAntenna &gt; Lib &gt;  Oniguruma</a> (Japanese page)\n</ul>\n\n<br>\n<dt><b>Links:</b>\n<ul>\n<li> <a href=\"http://www.perzl.org/aix/index.php?n=Main.Oniguruma\">AIX Open Source Packages</a>\n<li> <a href=\"https://aur.archlinux.org/packages/oniguruma/\">Arch Linux Package</a>\n<li> <a href=\"http://homepage3.nifty.com/k-takata/mysoft/bregonig.html\">bregonig.dll (Win32)</a> (Japanese page)\n<li> <a href=\"http://www.halbiz.com/osaru/cnregex.html\">cnRegex 4D Plugin (Mac OS X)</a> (Japanese page)\n<li> <a href=\"http://limechat.net/cocoaoniguruma/\">CocoaOniguruma</a>\n<li> <a href=\"http://kmaebashi.com/\">crowbar</a> (Japanese page)\n<li> <a href=\"http://oniguruma5.darwinports.com\">Darwin Ports (Mac OS X)</a>\n<li> <a href=\"http://homepage2.nifty.com/Km/onig.htm\">Delphi interface (Win32)</a> (Japanese page)\n<li> <a href=\"http://pyxis-project.net/ensemble/\">Ensemble (Mac OS X)</a> (Japanese page)\n<li> <a href=\"http://www.srcw.net/FaEdit/\">FaEdit (Win32)</a> (Japanese page)\n<li> <a href=\"http://www.tom.sfc.keio.ac.jp/~sakai/d/?date=20050209\">GHC patch</a> Masahiro Sakai (Japanese Blog)\n<li> <a href=\"http://www.gyazsquare.com/gyazmail/index.php\">GyazMail (Mac OS X)</a>\n<li> <a href=\"http://www5d.biglobe.ne.jp/~f-taste/knt3/jcref3.html\">J-cref v3</a> (Japanese page)\n<li> <a href=\"http://www.artman21.net/\">Jedit X (Mac OS X)</a>\n<li> <a href=\"http://www.chitora.jp/lhaz.html\">Lhaz (Win32)</a> (Japanese page)\n<li> <a href=\"http://limechat.net/\">LimeChat</a> (Japanese page)\n<li> <a href=\"http://medb.enhiro.com/\">meDB</a> (Japanese page)\n<li> <a href=\"http://monaos.org/\">Mona OS</a>\n<li> <a href=\"http://mongoose.jp/\">mongoose</a> (Japanese page)\n<li> <a href=\"http://www.irori.org/tool/mregexp.html\">mregexp</a> (Japanese page)\n<li> <a href=\"http://ochusha.sourceforge.jp/\">Ochusha</a> (Japanese page)\n<li> <a href=\"http://sonoisa.github.com/ogrekit/About_%28English%29.html\">OgreKit (Mac OS X)</a> Regular Expression Framework for Cocoa (Japanese page)\n<li> <a href=\"http://www.kanetaka.net/4dapi/wiki4d.dll/4dcgi/wiki.cgi?plugins-oniguruma\">OnigRegexp</a> (Japanese page)\n<li> <a href=\"http://rubyforge.org/projects/oniguruma\">Oniguruma for Ruby</a>\n<li> <a href=\"http://openspace.timedia.co.jp/~yasuyuki/wiliki/wiliki.cgi?Oniguruma-mysqld&l=jp\">Oniguruma-mysqld</a>\n<li> <a href=\"http://www.void.in/wiki/OnigPP\">OnigPP</a> (Japanese page)\n<li> <a href=\"http://www.kt.rim.or.jp/~kbk/sed/index.html\">Onigsed (Win32)</a> (Japanese page)\n<li> <a href=\"http://glozer.net/code.html#oregexp\">oregexp</a> Erlang binding\n<li> <a href=\"http://www.kt.rim.or.jp/~kbk/yagrep/index.html\">yagrep (Win32)</a> (Japanese page)\n<li> <a href=\"http://www.php.gr.jp/\">Japan PHP User Group</a> PHP 5.0 mb_ereg (Japanese page)\n<li> <a href=\"http://yatsu.info/wiki/Pufui/\">Pufui (Mac OS X)</a> (Japanese page)\n<li> <a href=\"http://ultrapop.jp/?q2ch\">q2ch</a> (Japanese page)\n<li> <a href=\"http://search.cpan.org/~andya/re-engine-Oniguruma\">re-engine-Oniguruma</a>\n<li> <a href=\"http://harumune.s56.xrea.com/assari/index.php?RSSTyping\">RSSTyping</a> (Japanese page)\n<li> <a href=\"http://tobysoft.net/wiki/index.php?Ruby%2Fruby-win32-oniguruma\">ruby-win32-oniguruma</a> (Japanese page)\n<li> <a href=\"http://quux.s74.xrea.com/\">SevenFour (Mac OS X)</a> (Japanese page)\n<li> <a href=\"http://storklab.cyber-ninja.jp/\">Stork Lab. Products (Mac OS X)</a> (Japanese page)\n<li> <a href=\"http://sourceforge.jp/projects/ttssh2/\">TeraTerm (Win32)</a>\n<li> <a href=\"http://www8.ocn.ne.jp/~sonoisa/TiddlyWikiPod/\">TiddlyWikiPod (Mac OS X)</a>\n<li> <a href=\"http://www.cyanworks.net/mac.html\">TunesTEXT (Mac OS X)</a>\n<li> <a href=\"https://code.google.com/p/oniguruma-visualworks/\">oniguruma-visualworks</a>\n<li> <a href=\"http://sourceforge.jp/projects/frogger/\">XML parser</a>\n<li> <a href=\"http://www.yokkasoft.net/\">YokkaSoft (Win32)</a> (Japanese page)\n<li> <a href=\"http://www.hi-ho.ne.jp/kuze/tool.htm\">Zed (Win32)</a> (Japanese page)\n</ul>\n\n<br>\n<dt><b>References:</b>\n<ul>\n<li> <a href=\"http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=%C0%B5%B5%AC%C9%BD%B8%BD\">Ruby Reference Manual Regexp</a> (Japanese page)\n<li> <a href=\"http://www.perl.com/doc/manual/html/pod/perlre.html\">Perl regular expressions</a>\n<li> <a href=\"http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html\">java.util.regex.Pattern (J2SE 1.4.2)</a>\n<li> <a href=\"http://www.opengroup.org/onlinepubs/007908799/xbd/re.html\">The Open Group</a>\n<li> <a href=\"http://regex.info/\">Mastering Regular Expressions</a>\n<li> <a href=\"http://www.unicode.org/\">Unicode Home Page</a>\n<li> <a href=\"http://www.kt.rim.or.jp/~kbk/regex/regex.html\">Regular expressions memo</a> (Japanese page)\n<li> <a href=\"http://www.din.or.jp/~ohzaki/regex.htm\">Regular expressions technique</a> (Japanese page)\n</ul>\n\n<br>\n</dl>\n<p>\nand I'm thankful to Akinori MUSHA.\n</p>\n\n<hr>\n<dl>\n<dt><b>Other Libraries:</b>\n<ul>\n<li> <a href=\"http://www.boost.org/libs/regex/doc/\">Boost.Regex</a>\n<li> <a href=\"http://arglist.com/regex/\">A copy of Henry Spencer's</a>\n<li> <a href=\"http://directory.fsf.org/regex.html\">GNU regex</a>\n<li> <a href=\"http://www.pcre.org/\">PCRE</a>\n<li> <a href=\"http://re2c.org/\">re2c</a>\n<li> <a href=\"http://tiny-rex.sourceforge.net/\">T-Rex</a>\n<li> <a href=\"http://laurikari.net/tre/\">TRE</a>\n<li> <a href=\"http://svn.codehaus.org/jruby/joni/\">Joni (Java)</a>\n<li> <a href=\"http://jregex.sourceforge.net/\">JRegex (Java)</a>\n<li> <a href=\"http://www.cacas.org/java/gnu/regexp/\">gnu.regexp for Java</a>\n<li> <a href=\"http://jakarta.apache.org/regexp/index.html\">Jakarta Project Regexp</a>\n<li> <a href=\"http://jakarta.apache.org/oro/\">Jakarta Project ORO</a>\n<li> <a href=\"http://sourceforge.jp/projects/onig4j/\">Oniguruma for Java</a>\n</ul>\n</dl>\n</body>\n</html>\n"
  },
  {
    "path": "src/Onigmo/index_ja.html",
    "content": "<html>\n<head>\n  <meta HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html;CHARSET=utf-8\">\n  <title>鬼車</title>\n</head>\n<body BGCOLOR=\"#ffffff\" VLINK=\"#808040\" TEXT=\"#696969\">\n\n<h1>鬼車</h1>\n\n<p>\n(c) K.Kosako, 最終更新: 2013/04/04\n</p>\n\n<dl>\n<font color=\"orange\">\n<dt><b>更新情報</b>\n</font>\n<ul>\n<li>2013/04/04: Version 5.9.4 リリース</li>\n<li>2007/08/16: Version 4.7.1 リリース</li>\n<li>2007/06/20: Version 2.5.9 リリース</li>\n<li>2007/06/20: 2.xの保守担当者を変更</li>\n</ul>\n</dl>\n<hr>\n\n<p>\n鬼車は正規表現ライブラリである。<br>\nこのライブラリの特徴は、それぞれの正規表現オブジェクトごとに異なる文字エンコーディングを\n指定できること。<br>\n(API: GNU regex, POSIX and Oniguruma native)\n</p>\n\n<dl>\n<dt><b>対応している文字エンコーディング:</b><br>\nASCII, UTF-8, UTF-16BE, UTF-16LE, UTF-32BE, UTF-32LE,<br>\nEUC-JP, EUC-TW, EUC-KR, EUC-CN,<br>\nShift_JIS, Big5, GB18030, KOI8-R, CP1251,<br>\nISO-8859-1, ISO-8859-2, ISO-8859-3, ISO-8859-4, ISO-8859-5,<br>\nISO-8859-6, ISO-8859-7, ISO-8859-8, ISO-8859-9, ISO-8859-10,<br>\nISO-8859-11, ISO-8859-13, ISO-8859-14, ISO-8859-15, ISO-8859-16<br>\n<font color=\"orange\">\n(GB18030は、KUBO Takehiro氏提供)<br>\n(CP1251は、Byte氏提供)\n</font>\n</p>\n</dl>\n\n<hr>\n\n<dt><b>ライセンス:</b>BSDライセンス\n\n<dl>\n<dt><b>プラットフォーム:</b>\n<ul>\n<li> Unix (Mac OS Xを含む)\n<li> Cygwin\n<li> Win32\n</ul>\n\n<br>\n\n<dt><b>ダウンロード:</b>\n<ul>\n<li> <a href=\"archive/onig-5.9.4.tar.gz\">5.9.4 最新版</a> (2013/04/04)   <a href=\"HISTORY_5X.txt\">更新履歴</a>\n<li> <a href=\"archive/onig-5.9.3.tar.gz\">5.9.3</a> (2012/10/26)\n<li> <a href=\"archive/onig-4.7.1.tar.gz\">4.7.1 最新版</a> (2007/08/16)   <a href=\"HISTORY_4X.txt\">更新履歴</a>\n<li> <a href=\"archive/onig-4.7.0.tar.gz\">4.7.0</a> (2007/06/18)\n<li> <a href=\"archive/onigd2_5_9.tar.gz\">2.5.9 最新版</a> (2007/06/20)   <a href=\"HISTORY_2X.txt\">更新履歴</a>\n</ul>\n\n<br>\n<font color=\"red\">\n2.xの保守担当は、Hannes Wyss &lt;hwyss AT ywesee.com&gt;に交替しました。<br>\n2.xについては、彼に連絡してください。<br>\n</font>\n* 5.xはUnicode Property/Scriptを提供<br>\n* 2.xはRuby1.6/1.8組込みライブラリとして動作する。 (2006年末で保守を終了)<br>\n\n<br>\n<dt><b>ドキュメント:</b> (version 5.9.4)\n<ul>\n <li> <a href=\"doc/RE.txt\">正規表現</a>\n      <a href=\"doc/RE.ja.txt\">(日本語: EUC-JP)</a>\n <li> <a href=\"doc/API.txt\">鬼車API</a>\n      <a href=\"doc/API.ja.txt\">(日本語: EUC-JP)</a>\n</ul>\n\n<br>\n<dt><b>サンプルプログラム:</b>\n<ul>\n <li><a href=\"sample/simple.c\">最小使用例</a>\n <li><a href=\"sample/sql.c\">可変文法と可変メタ文字機能使用例(SQL-like pattern match)</a>\n</ul>\n\n<br>\n<dt><b>サイト:</b>\n<ul>\n<li> <a href=\"http://www.freebsd.org/cgi/cvsweb.cgi/ports/devel/oniguruma/\">FreeBSD ports</a>\n<li> <a href=\"http://www.softantenna.com/lib/1953/index.html\">SoftAntenna &gt; Lib &gt;  Oniguruma</a> (日本語)\n</ul>\n\n<br>\n<dt><b>リンク:</b>\n<ul>\n<li> <a href=\"http://www.perzl.org/aix/index.php?n=Main.Oniguruma\">AIX Open Source Packages</a>\n<li> <a href=\"https://aur.archlinux.org/packages/oniguruma/\">Arch Linux Package</a>\n<li> <a href=\"http://homepage3.nifty.com/k-takata/mysoft/bregonig.html\">bregonig.dll (Win32)</a> (日本語)\n<li> <a href=\"http://www.halbiz.com/osaru/cnregex.html\">cnRegex 4D Plugin (Mac OS X)</a> (日本語)\n<li> <a href=\"http://limechat.net/cocoaoniguruma/index_ja.html\">CocoaOniguruma</a> (日本語)\n<li> <a href=\"http://kmaebashi.com/\">crowbar</a> (日本語)\n<li> <a href=\"http://oniguruma5.darwinports.com\">Darwin Ports (Mac OS X)</a>\n<li> <a href=\"http://homepage2.nifty.com/Km/onig.htm\">Delphi interface (Win32)</a> (日本語)\n<li> <a href=\"http://pyxis-project.net/ensemble/\">Ensemble (Mac OS X)</a> (日本語)\n<li> <a href=\"http://www.srcw.net/FaEdit/\">FaEdit (Win32)</a> (日本語)\n<li> <a href=\"http://www.tom.sfc.keio.ac.jp/~sakai/d/?date=20050209\">GHC patch</a> Masahiro Sakai (Japanese Blog)\n<li> <a href=\"http://www.gyazsquare.com/gyazmail/index.php\">GyazMail (Mac OS X)</a>\n<li> <a href=\"http://www5d.biglobe.ne.jp/~f-taste/knt3/jcref3.html\">J-cref v3</a> (日本語)\n<li> <a href=\"http://www.artman21.net/\">Jedit X (Mac OS X)</a>\n<li> <a href=\"http://www.chitora.jp/lhaz.html\">Lhaz (Win32)</a> (日本語)\n<li> <a href=\"http://limechat.net/\">LimeChat</a> (日本語)\n<li> <a href=\"http://medb.enhiro.com/\">meDB</a> (日本語)\n<li> <a href=\"http://monaos.org/\">Mona OS</a>\n<li> <a href=\"http://mongoose.jp/\">mongoose</a> (日本語)\n<li> <a href=\"http://www.irori.org/tool/mregexp.html\">mregexp</a> (日本語)\n<li> <a href=\"http://ochusha.sourceforge.jp/\">おちゅ〜しゃ</a> (日本語)\n<li> <a href=\"http://sonoisa.github.com/ogrekit/About.html\">OgreKit (Mac OS X)</a> Regular Expression Framework for Cocoa (日本語)\n<li> <a href=\"http://www.kanetaka.net/4dapi/wiki4d.dll/4dcgi/wiki.cgi?plugins-oniguruma\">OnigRegexp</a> (日本語)\n<li> <a href=\"http://rubyforge.org/projects/oniguruma\">Oniguruma for Ruby</a>\n<li> <a href=\"http://openspace.timedia.co.jp/~yasuyuki/wiliki/wiliki.cgi?Oniguruma-mysqld&l=jp\">Oniguruma-mysqld</a>\n<li> <a href=\"http://www.void.in/wiki/OnigPP\">OnigPP</a> (日本語)\n<li> <a href=\"http://www.kt.rim.or.jp/~kbk/sed/index.html\">Onigsed (Win32)</a> (日本語)\n<li> <a href=\"http://glozer.net/code.html#oregexp\">oregexp</a> Erlang binding\n<li> <a href=\"http://www.kt.rim.or.jp/~kbk/yagrep/index.html\">yagrep (Win32)</a> (日本語)\n<li> <a href=\"http://www.php.gr.jp/\">日本PHPユーザ会</a> PHP 5.0 mb_ereg (日本語)\n<li> <a href=\"http://yatsu.info/wiki/Pufui/\">Pufui (Mac OS X)</a> (日本語)\n<li> <a href=\"http://ultrapop.jp/?q2ch\">q2ch</a> (日本語)\n<li> <a href=\"http://search.cpan.org/~andya/re-engine-Oniguruma\">re-engine-Oniguruma</a>\n<li> <a href=\"http://harumune.s56.xrea.com/assari/index.php?RSSTyping\">RSSTyping</a> (日本語)\n<li> <a href=\"http://tobysoft.net/wiki/index.php?Ruby%2Fruby-win32-oniguruma\">ruby-win32-oniguruma</a> (日本語)\n<li> <a href=\"http://quux.s74.xrea.com/\">SevenFour (Mac OS X)</a> (日本語)\n<li> <a href=\"http://storklab.cyber-ninja.jp/\">Stork Lab. Products (Mac OS X)</a> (日本語)\n<li> <a href=\"http://sourceforge.jp/projects/ttssh2/\">TeraTerm (Win32)</a>\n<li> <a href=\"http://www8.ocn.ne.jp/~sonoisa/TiddlyWikiPod/\">TiddlyWikiPod (Mac OS X)</a>\n<li> <a href=\"http://www.cyanworks.net/mac.html\">TunesTEXT (Mac OS X)</a>\n<li> <a href=\"https://code.google.com/p/oniguruma-visualworks/\">oniguruma-visualworks</a>\n<li> <a href=\"http://sourceforge.jp/projects/frogger/\">XML parser</a>\n<li> <a href=\"http://www.yokkasoft.net/\">YokkaSoft (Win32)</a> (日本語)\n<li> <a href=\"http://www.hi-ho.ne.jp/kuze/tool.htm\">Zed (Win32)</a> (日本語)\n</ul>\n\n<br>\n<dt><b>参考資料:</b>\n<ul>\n<li> <a href=\"http://www.ruby-lang.org/ja/man/index.cgi?cmd=view;name=%C0%B5%B5%AC%C9%BD%B8%BD\">Rubyリファレンスマニュアル</a> (日本語)\n<li> <a href=\"http://www.perl.com/doc/manual/html/pod/perlre.html\">Perl regular expressions</a>\n<li> <a href=\"http://java.sun.com/j2se/1.4.2/docs/api/java/util/regex/Pattern.html\">java.util.regex.Pattern (J2SE 1.4.2)</a>\n<li> <a href=\"http://www.opengroup.org/onlinepubs/007908799/xbd/re.html\">The Open Group</a>\n<li> <a href=\"http://regex.info/\">Mastering Regular Expressions</a>\n<li> <a href=\"http://www.unicode.org/\">Unicode Home Page</a>\n<li> <a href=\"http://www.kt.rim.or.jp/~kbk/regex/regex.html\">正規表現メモ</a> (日本語)\n<li> <a href=\"http://www.din.or.jp/~ohzaki/regex.htm\">Perl正規表現雑技</a> (日本語)\n</ul>\n\n<br>\n</dl>\n<p>\nand I'm thankful to Akinori MUSHA.\n</p>\n\n<hr>\n<dl>\n<dt><b>他のライブラリ:</b>\n<ul>\n<li> <a href=\"http://www.boost.org/libs/regex/doc/\">Boost.Regex</a>\n<li> <a href=\"http://arglist.com/regex/\">A copy of Henry Spencer's</a>\n<li> <a href=\"http://directory.fsf.org/regex.html\">GNU regex</a>\n<li> <a href=\"http://www.pcre.org/\">PCRE</a>\n<li> <a href=\"http://re2c.org/\">re2c</a>\n<li> <a href=\"http://tiny-rex.sourceforge.net/\">T-Rex</a>\n<li> <a href=\"http://laurikari.net/tre/\">TRE</a>\n<li> <a href=\"http://svn.codehaus.org/jruby/joni/\">Joni (Java)</a>\n<li> <a href=\"http://jregex.sourceforge.net/\">JRegex (Java)</a>\n<li> <a href=\"http://www.cacas.org/java/gnu/regexp/\">gnu.regexp for Java</a>\n<li> <a href=\"http://jakarta.apache.org/regexp/index.html\">Jakarta Project Regexp</a>\n<li> <a href=\"http://jakarta.apache.org/oro/\">Jakarta Project ORO</a>\n<li> <a href=\"http://sourceforge.jp/projects/onig4j/\">Oniguruma for Java</a>\n</ul>\n</dl>\n\n<hr>\n<a href=\"../\">ホームにもどる</a>\n</body>\n</html>\n"
  },
  {
    "path": "src/Onigmo/install-sh",
    "content": "#!/bin/sh\n# install - install a program, script, or datafile\n\nscriptversion=2009-04-28.21; # UTC\n\n# This originates from X11R5 (mit/util/scripts/install.sh), which was\n# later released in X11R6 (xc/config/util/install.sh) with the\n# following copyright and license.\n#\n# Copyright (C) 1994 X Consortium\n#\n# Permission is hereby granted, free of charge, to any person obtaining a copy\n# of this software and associated documentation files (the \"Software\"), to\n# deal in the Software without restriction, including without limitation the\n# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n# sell copies of the Software, and to permit persons to whom the Software is\n# furnished to do so, subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be included in\n# all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\n# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN\n# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-\n# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n#\n# Except as contained in this notice, the name of the X Consortium shall not\n# be used in advertising or otherwise to promote the sale, use or other deal-\n# ings in this Software without prior written authorization from the X Consor-\n# tium.\n#\n#\n# FSF changes to this file are in the public domain.\n#\n# Calling this script install-sh is preferred over install.sh, to prevent\n# `make' implicit rules from creating a file called install from it\n# when there is no Makefile.\n#\n# This script is compatible with the BSD install script, but was written\n# from scratch.\n\nnl='\n'\nIFS=\" \"\"\t$nl\"\n\n# set DOITPROG to echo to test this script\n\n# Don't use :- since 4.3BSD and earlier shells don't like it.\ndoit=${DOITPROG-}\nif test -z \"$doit\"; then\n  doit_exec=exec\nelse\n  doit_exec=$doit\nfi\n\n# Put in absolute file names if you don't have them in your path;\n# or use environment vars.\n\nchgrpprog=${CHGRPPROG-chgrp}\nchmodprog=${CHMODPROG-chmod}\nchownprog=${CHOWNPROG-chown}\ncmpprog=${CMPPROG-cmp}\ncpprog=${CPPROG-cp}\nmkdirprog=${MKDIRPROG-mkdir}\nmvprog=${MVPROG-mv}\nrmprog=${RMPROG-rm}\nstripprog=${STRIPPROG-strip}\n\nposix_glob='?'\ninitialize_posix_glob='\n  test \"$posix_glob\" != \"?\" || {\n    if (set -f) 2>/dev/null; then\n      posix_glob=\n    else\n      posix_glob=:\n    fi\n  }\n'\n\nposix_mkdir=\n\n# Desired mode of installed file.\nmode=0755\n\nchgrpcmd=\nchmodcmd=$chmodprog\nchowncmd=\nmvcmd=$mvprog\nrmcmd=\"$rmprog -f\"\nstripcmd=\n\nsrc=\ndst=\ndir_arg=\ndst_arg=\n\ncopy_on_change=false\nno_target_directory=\n\nusage=\"\\\nUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE\n   or: $0 [OPTION]... SRCFILES... DIRECTORY\n   or: $0 [OPTION]... -t DIRECTORY SRCFILES...\n   or: $0 [OPTION]... -d DIRECTORIES...\n\nIn the 1st form, copy SRCFILE to DSTFILE.\nIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY.\nIn the 4th, create DIRECTORIES.\n\nOptions:\n     --help     display this help and exit.\n     --version  display version info and exit.\n\n  -c            (ignored)\n  -C            install only if different (preserve the last data modification time)\n  -d            create directories instead of installing files.\n  -g GROUP      $chgrpprog installed files to GROUP.\n  -m MODE       $chmodprog installed files to MODE.\n  -o USER       $chownprog installed files to USER.\n  -s            $stripprog installed files.\n  -t DIRECTORY  install into DIRECTORY.\n  -T            report an error if DSTFILE is a directory.\n\nEnvironment variables override the default commands:\n  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG\n  RMPROG STRIPPROG\n\"\n\nwhile test $# -ne 0; do\n  case $1 in\n    -c) ;;\n\n    -C) copy_on_change=true;;\n\n    -d) dir_arg=true;;\n\n    -g) chgrpcmd=\"$chgrpprog $2\"\n\tshift;;\n\n    --help) echo \"$usage\"; exit $?;;\n\n    -m) mode=$2\n\tcase $mode in\n\t  *' '* | *'\t'* | *'\n'*\t  | *'*'* | *'?'* | *'['*)\n\t    echo \"$0: invalid mode: $mode\" >&2\n\t    exit 1;;\n\tesac\n\tshift;;\n\n    -o) chowncmd=\"$chownprog $2\"\n\tshift;;\n\n    -s) stripcmd=$stripprog;;\n\n    -t) dst_arg=$2\n\tshift;;\n\n    -T) no_target_directory=true;;\n\n    --version) echo \"$0 $scriptversion\"; exit $?;;\n\n    --)\tshift\n\tbreak;;\n\n    -*)\techo \"$0: invalid option: $1\" >&2\n\texit 1;;\n\n    *)  break;;\n  esac\n  shift\ndone\n\nif test $# -ne 0 && test -z \"$dir_arg$dst_arg\"; then\n  # When -d is used, all remaining arguments are directories to create.\n  # When -t is used, the destination is already specified.\n  # Otherwise, the last argument is the destination.  Remove it from $@.\n  for arg\n  do\n    if test -n \"$dst_arg\"; then\n      # $@ is not empty: it contains at least $arg.\n      set fnord \"$@\" \"$dst_arg\"\n      shift # fnord\n    fi\n    shift # arg\n    dst_arg=$arg\n  done\nfi\n\nif test $# -eq 0; then\n  if test -z \"$dir_arg\"; then\n    echo \"$0: no input file specified.\" >&2\n    exit 1\n  fi\n  # It's OK to call `install-sh -d' without argument.\n  # This can happen when creating conditional directories.\n  exit 0\nfi\n\nif test -z \"$dir_arg\"; then\n  trap '(exit $?); exit' 1 2 13 15\n\n  # Set umask so as not to create temps with too-generous modes.\n  # However, 'strip' requires both read and write access to temps.\n  case $mode in\n    # Optimize common cases.\n    *644) cp_umask=133;;\n    *755) cp_umask=22;;\n\n    *[0-7])\n      if test -z \"$stripcmd\"; then\n\tu_plus_rw=\n      else\n\tu_plus_rw='% 200'\n      fi\n      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;\n    *)\n      if test -z \"$stripcmd\"; then\n\tu_plus_rw=\n      else\n\tu_plus_rw=,u+rw\n      fi\n      cp_umask=$mode$u_plus_rw;;\n  esac\nfi\n\nfor src\ndo\n  # Protect names starting with `-'.\n  case $src in\n    -*) src=./$src;;\n  esac\n\n  if test -n \"$dir_arg\"; then\n    dst=$src\n    dstdir=$dst\n    test -d \"$dstdir\"\n    dstdir_status=$?\n  else\n\n    # Waiting for this to be detected by the \"$cpprog $src $dsttmp\" command\n    # might cause directories to be created, which would be especially bad\n    # if $src (and thus $dsttmp) contains '*'.\n    if test ! -f \"$src\" && test ! -d \"$src\"; then\n      echo \"$0: $src does not exist.\" >&2\n      exit 1\n    fi\n\n    if test -z \"$dst_arg\"; then\n      echo \"$0: no destination specified.\" >&2\n      exit 1\n    fi\n\n    dst=$dst_arg\n    # Protect names starting with `-'.\n    case $dst in\n      -*) dst=./$dst;;\n    esac\n\n    # If destination is a directory, append the input filename; won't work\n    # if double slashes aren't ignored.\n    if test -d \"$dst\"; then\n      if test -n \"$no_target_directory\"; then\n\techo \"$0: $dst_arg: Is a directory\" >&2\n\texit 1\n      fi\n      dstdir=$dst\n      dst=$dstdir/`basename \"$src\"`\n      dstdir_status=0\n    else\n      # Prefer dirname, but fall back on a substitute if dirname fails.\n      dstdir=`\n\t(dirname \"$dst\") 2>/dev/null ||\n\texpr X\"$dst\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t     X\"$dst\" : 'X\\(//\\)[^/]' \\| \\\n\t     X\"$dst\" : 'X\\(//\\)$' \\| \\\n\t     X\"$dst\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n\techo X\"$dst\" |\n\t    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t\t   s//\\1/\n\t\t   q\n\t\t }\n\t\t /^X\\(\\/\\/\\)[^/].*/{\n\t\t   s//\\1/\n\t\t   q\n\t\t }\n\t\t /^X\\(\\/\\/\\)$/{\n\t\t   s//\\1/\n\t\t   q\n\t\t }\n\t\t /^X\\(\\/\\).*/{\n\t\t   s//\\1/\n\t\t   q\n\t\t }\n\t\t s/.*/./; q'\n      `\n\n      test -d \"$dstdir\"\n      dstdir_status=$?\n    fi\n  fi\n\n  obsolete_mkdir_used=false\n\n  if test $dstdir_status != 0; then\n    case $posix_mkdir in\n      '')\n\t# Create intermediate dirs using mode 755 as modified by the umask.\n\t# This is like FreeBSD 'install' as of 1997-10-28.\n\tumask=`umask`\n\tcase $stripcmd.$umask in\n\t  # Optimize common cases.\n\t  *[2367][2367]) mkdir_umask=$umask;;\n\t  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;\n\n\t  *[0-7])\n\t    mkdir_umask=`expr $umask + 22 \\\n\t      - $umask % 100 % 40 + $umask % 20 \\\n\t      - $umask % 10 % 4 + $umask % 2\n\t    `;;\n\t  *) mkdir_umask=$umask,go-w;;\n\tesac\n\n\t# With -d, create the new directory with the user-specified mode.\n\t# Otherwise, rely on $mkdir_umask.\n\tif test -n \"$dir_arg\"; then\n\t  mkdir_mode=-m$mode\n\telse\n\t  mkdir_mode=\n\tfi\n\n\tposix_mkdir=false\n\tcase $umask in\n\t  *[123567][0-7][0-7])\n\t    # POSIX mkdir -p sets u+wx bits regardless of umask, which\n\t    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.\n\t    ;;\n\t  *)\n\t    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$\n\t    trap 'ret=$?; rmdir \"$tmpdir/d\" \"$tmpdir\" 2>/dev/null; exit $ret' 0\n\n\t    if (umask $mkdir_umask &&\n\t\texec $mkdirprog $mkdir_mode -p -- \"$tmpdir/d\") >/dev/null 2>&1\n\t    then\n\t      if test -z \"$dir_arg\" || {\n\t\t   # Check for POSIX incompatibilities with -m.\n\t\t   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or\n\t\t   # other-writeable bit of parent directory when it shouldn't.\n\t\t   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.\n\t\t   ls_ld_tmpdir=`ls -ld \"$tmpdir\"`\n\t\t   case $ls_ld_tmpdir in\n\t\t     d????-?r-*) different_mode=700;;\n\t\t     d????-?--*) different_mode=755;;\n\t\t     *) false;;\n\t\t   esac &&\n\t\t   $mkdirprog -m$different_mode -p -- \"$tmpdir\" && {\n\t\t     ls_ld_tmpdir_1=`ls -ld \"$tmpdir\"`\n\t\t     test \"$ls_ld_tmpdir\" = \"$ls_ld_tmpdir_1\"\n\t\t   }\n\t\t }\n\t      then posix_mkdir=:\n\t      fi\n\t      rmdir \"$tmpdir/d\" \"$tmpdir\"\n\t    else\n\t      # Remove any dirs left behind by ancient mkdir implementations.\n\t      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null\n\t    fi\n\t    trap '' 0;;\n\tesac;;\n    esac\n\n    if\n      $posix_mkdir && (\n\tumask $mkdir_umask &&\n\t$doit_exec $mkdirprog $mkdir_mode -p -- \"$dstdir\"\n      )\n    then :\n    else\n\n      # The umask is ridiculous, or mkdir does not conform to POSIX,\n      # or it failed possibly due to a race condition.  Create the\n      # directory the slow way, step by step, checking for races as we go.\n\n      case $dstdir in\n\t/*) prefix='/';;\n\t-*) prefix='./';;\n\t*)  prefix='';;\n      esac\n\n      eval \"$initialize_posix_glob\"\n\n      oIFS=$IFS\n      IFS=/\n      $posix_glob set -f\n      set fnord $dstdir\n      shift\n      $posix_glob set +f\n      IFS=$oIFS\n\n      prefixes=\n\n      for d\n      do\n\ttest -z \"$d\" && continue\n\n\tprefix=$prefix$d\n\tif test -d \"$prefix\"; then\n\t  prefixes=\n\telse\n\t  if $posix_mkdir; then\n\t    (umask=$mkdir_umask &&\n\t     $doit_exec $mkdirprog $mkdir_mode -p -- \"$dstdir\") && break\n\t    # Don't fail if two instances are running concurrently.\n\t    test -d \"$prefix\" || exit 1\n\t  else\n\t    case $prefix in\n\t      *\\'*) qprefix=`echo \"$prefix\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;;\n\t      *) qprefix=$prefix;;\n\t    esac\n\t    prefixes=\"$prefixes '$qprefix'\"\n\t  fi\n\tfi\n\tprefix=$prefix/\n      done\n\n      if test -n \"$prefixes\"; then\n\t# Don't fail if two instances are running concurrently.\n\t(umask $mkdir_umask &&\n\t eval \"\\$doit_exec \\$mkdirprog $prefixes\") ||\n\t  test -d \"$dstdir\" || exit 1\n\tobsolete_mkdir_used=true\n      fi\n    fi\n  fi\n\n  if test -n \"$dir_arg\"; then\n    { test -z \"$chowncmd\" || $doit $chowncmd \"$dst\"; } &&\n    { test -z \"$chgrpcmd\" || $doit $chgrpcmd \"$dst\"; } &&\n    { test \"$obsolete_mkdir_used$chowncmd$chgrpcmd\" = false ||\n      test -z \"$chmodcmd\" || $doit $chmodcmd $mode \"$dst\"; } || exit 1\n  else\n\n    # Make a couple of temp file names in the proper directory.\n    dsttmp=$dstdir/_inst.$$_\n    rmtmp=$dstdir/_rm.$$_\n\n    # Trap to clean up those temp files at exit.\n    trap 'ret=$?; rm -f \"$dsttmp\" \"$rmtmp\" && exit $ret' 0\n\n    # Copy the file name to the temp name.\n    (umask $cp_umask && $doit_exec $cpprog \"$src\" \"$dsttmp\") &&\n\n    # and set any options; do chmod last to preserve setuid bits.\n    #\n    # If any of these fail, we abort the whole thing.  If we want to\n    # ignore errors from any of these, just make sure not to ignore\n    # errors from the above \"$doit $cpprog $src $dsttmp\" command.\n    #\n    { test -z \"$chowncmd\" || $doit $chowncmd \"$dsttmp\"; } &&\n    { test -z \"$chgrpcmd\" || $doit $chgrpcmd \"$dsttmp\"; } &&\n    { test -z \"$stripcmd\" || $doit $stripcmd \"$dsttmp\"; } &&\n    { test -z \"$chmodcmd\" || $doit $chmodcmd $mode \"$dsttmp\"; } &&\n\n    # If -C, don't bother to copy if it wouldn't change the file.\n    if $copy_on_change &&\n       old=`LC_ALL=C ls -dlL \"$dst\"\t2>/dev/null` &&\n       new=`LC_ALL=C ls -dlL \"$dsttmp\"\t2>/dev/null` &&\n\n       eval \"$initialize_posix_glob\" &&\n       $posix_glob set -f &&\n       set X $old && old=:$2:$4:$5:$6 &&\n       set X $new && new=:$2:$4:$5:$6 &&\n       $posix_glob set +f &&\n\n       test \"$old\" = \"$new\" &&\n       $cmpprog \"$dst\" \"$dsttmp\" >/dev/null 2>&1\n    then\n      rm -f \"$dsttmp\"\n    else\n      # Rename the file to the real destination.\n      $doit $mvcmd -f \"$dsttmp\" \"$dst\" 2>/dev/null ||\n\n      # The rename failed, perhaps because mv can't rename something else\n      # to itself, or perhaps because mv is so ancient that it does not\n      # support -f.\n      {\n\t# Now remove or move aside any old file at destination location.\n\t# We try this two ways since rm can't unlink itself on some\n\t# systems and the destination file might be busy for other\n\t# reasons.  In this case, the final cleanup might fail but the new\n\t# file should still install successfully.\n\t{\n\t  test ! -f \"$dst\" ||\n\t  $doit $rmcmd -f \"$dst\" 2>/dev/null ||\n\t  { $doit $mvcmd -f \"$dst\" \"$rmtmp\" 2>/dev/null &&\n\t    { $doit $rmcmd -f \"$rmtmp\" 2>/dev/null; :; }\n\t  } ||\n\t  { echo \"$0: cannot unlink or rename $dst\" >&2\n\t    (exit 1); exit 1\n\t  }\n\t} &&\n\n\t# Now rename the file to the real destination.\n\t$doit $mvcmd \"$dsttmp\" \"$dst\"\n      }\n    fi || exit 1\n\n    trap '' 0\n  fi\ndone\n\n# Local variables:\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"scriptversion=\"\n# time-stamp-format: \"%:y-%02m-%02d.%02H\"\n# time-stamp-time-zone: \"UTC\"\n# time-stamp-end: \"; # UTC\"\n# End:\n"
  },
  {
    "path": "src/Onigmo/ltmain.sh",
    "content": "# Generated from ltmain.m4sh.\n\n# ltmain.sh (GNU libtool) 2.2.6b\n# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996\n\n# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007 2008 Free Software Foundation, Inc.\n# This is free software; see the source for copying conditions.  There is NO\n# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n# GNU Libtool is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version.\n#\n# As a special exception to the GNU General Public License,\n# if you distribute this file as part of a program or library that\n# is built using GNU Libtool, you may include this file under the\n# same distribution terms that you use for the rest of that program.\n#\n# GNU Libtool is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with GNU Libtool; see the file COPYING.  If not, a copy\n# can be downloaded from http://www.gnu.org/licenses/gpl.html,\n# or obtained by writing to the Free Software Foundation, Inc.,\n# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n\n# Usage: $progname [OPTION]... [MODE-ARG]...\n#\n# Provide generalized library-building support services.\n#\n#     --config             show all configuration variables\n#     --debug              enable verbose shell tracing\n# -n, --dry-run            display commands without modifying any files\n#     --features           display basic configuration information and exit\n#     --mode=MODE          use operation mode MODE\n#     --preserve-dup-deps  don't remove duplicate dependency libraries\n#     --quiet, --silent    don't print informational messages\n#     --tag=TAG            use configuration variables from tag TAG\n# -v, --verbose            print informational messages (default)\n#     --version            print version information\n# -h, --help               print short or long help message\n#\n# MODE must be one of the following:\n#\n#       clean              remove files from the build directory\n#       compile            compile a source file into a libtool object\n#       execute            automatically set library path, then run a program\n#       finish             complete the installation of libtool libraries\n#       install            install libraries or executables\n#       link               create a library or an executable\n#       uninstall          remove libraries from an installed directory\n#\n# MODE-ARGS vary depending on the MODE.\n# Try `$progname --help --mode=MODE' for a more detailed description of MODE.\n#\n# When reporting a bug, please describe a test case to reproduce it and\n# include the following information:\n#\n#       host-triplet:\t$host\n#       shell:\t\t$SHELL\n#       compiler:\t\t$LTCC\n#       compiler flags:\t\t$LTCFLAGS\n#       linker:\t\t$LD (gnu? $with_gnu_ld)\n#       $progname:\t\t(GNU libtool) 2.2.6b Debian-2.2.6b-2ubuntu1\n#       automake:\t\t$automake_version\n#       autoconf:\t\t$autoconf_version\n#\n# Report bugs to <bug-libtool@gnu.org>.\n\nPROGRAM=ltmain.sh\nPACKAGE=libtool\nVERSION=\"2.2.6b Debian-2.2.6b-2ubuntu1\"\nTIMESTAMP=\"\"\npackage_revision=1.3017\n\n# Be Bourne compatible\nif test -n \"${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then\n  emulate sh\n  NULLCMD=:\n  # Zsh 3.x and 4.x performs word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\n  setopt NO_GLOB_SUBST\nelse\n  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac\nfi\nBIN_SH=xpg4; export BIN_SH # for Tru64\nDUALCASE=1; export DUALCASE # for MKS sh\n\n# NLS nuisances: We save the old values to restore during execute mode.\n# Only set LANG and LC_ALL to C if already set.\n# These must not be set unconditionally because not all systems understand\n# e.g. LANG=C (notably SCO).\nlt_user_locale=\nlt_safe_locale=\nfor lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES\ndo\n  eval \"if test \\\"\\${$lt_var+set}\\\" = set; then\n          save_$lt_var=\\$$lt_var\n          $lt_var=C\n\t  export $lt_var\n\t  lt_user_locale=\\\"$lt_var=\\\\\\$save_\\$lt_var; \\$lt_user_locale\\\"\n\t  lt_safe_locale=\\\"$lt_var=C; \\$lt_safe_locale\\\"\n\tfi\"\ndone\n\n$lt_unset CDPATH\n\n\n\n\n\n: ${CP=\"cp -f\"}\n: ${ECHO=\"echo\"}\n: ${EGREP=\"/bin/grep -E\"}\n: ${FGREP=\"/bin/grep -F\"}\n: ${GREP=\"/bin/grep\"}\n: ${LN_S=\"ln -s\"}\n: ${MAKE=\"make\"}\n: ${MKDIR=\"mkdir\"}\n: ${MV=\"mv -f\"}\n: ${RM=\"rm -f\"}\n: ${SED=\"/bin/sed\"}\n: ${SHELL=\"${CONFIG_SHELL-/bin/sh}\"}\n: ${Xsed=\"$SED -e 1s/^X//\"}\n\n# Global variables:\nEXIT_SUCCESS=0\nEXIT_FAILURE=1\nEXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.\nEXIT_SKIP=77\t  # $? = 77 is used to indicate a skipped test to automake.\n\nexit_status=$EXIT_SUCCESS\n\n# Make sure IFS has a sensible default\nlt_nl='\n'\nIFS=\" \t$lt_nl\"\n\ndirname=\"s,/[^/]*$,,\"\nbasename=\"s,^.*/,,\"\n\n# func_dirname_and_basename file append nondir_replacement\n# perform func_basename and func_dirname in a single function\n# call:\n#   dirname:  Compute the dirname of FILE.  If nonempty,\n#             add APPEND to the result, otherwise set result\n#             to NONDIR_REPLACEMENT.\n#             value returned in \"$func_dirname_result\"\n#   basename: Compute filename of FILE.\n#             value retuned in \"$func_basename_result\"\n# Implementation must be kept synchronized with func_dirname\n# and func_basename. For efficiency, we do not delegate to\n# those functions but instead duplicate the functionality here.\nfunc_dirname_and_basename ()\n{\n  # Extract subdirectory from the argument.\n  func_dirname_result=`$ECHO \"X${1}\" | $Xsed -e \"$dirname\"`\n  if test \"X$func_dirname_result\" = \"X${1}\"; then\n    func_dirname_result=\"${3}\"\n  else\n    func_dirname_result=\"$func_dirname_result${2}\"\n  fi\n  func_basename_result=`$ECHO \"X${1}\" | $Xsed -e \"$basename\"`\n}\n\n# Generated shell functions inserted here.\n\n# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh\n# is ksh but when the shell is invoked as \"sh\" and the current value of\n# the _XPG environment variable is not equal to 1 (one), the special\n# positional parameter $0, within a function call, is the name of the\n# function.\nprogpath=\"$0\"\n\n# The name of this program:\n# In the unlikely event $progname began with a '-', it would play havoc with\n# func_echo (imagine progname=-n), so we prepend ./ in that case:\nfunc_dirname_and_basename \"$progpath\"\nprogname=$func_basename_result\ncase $progname in\n  -*) progname=./$progname ;;\nesac\n\n# Make sure we have an absolute path for reexecution:\ncase $progpath in\n  [\\\\/]*|[A-Za-z]:\\\\*) ;;\n  *[\\\\/]*)\n     progdir=$func_dirname_result\n     progdir=`cd \"$progdir\" && pwd`\n     progpath=\"$progdir/$progname\"\n     ;;\n  *)\n     save_IFS=\"$IFS\"\n     IFS=:\n     for progdir in $PATH; do\n       IFS=\"$save_IFS\"\n       test -x \"$progdir/$progname\" && break\n     done\n     IFS=\"$save_IFS\"\n     test -n \"$progdir\" || progdir=`pwd`\n     progpath=\"$progdir/$progname\"\n     ;;\nesac\n\n# Sed substitution that helps us do robust quoting.  It backslashifies\n# metacharacters that are still active within double-quoted strings.\nXsed=\"${SED}\"' -e 1s/^X//'\nsed_quote_subst='s/\\([`\"$\\\\]\\)/\\\\\\1/g'\n\n# Same as above, but do not quote variable references.\ndouble_quote_subst='s/\\([\"`\\\\]\\)/\\\\\\1/g'\n\n# Re-`\\' parameter expansions in output of double_quote_subst that were\n# `\\'-ed in input to the same.  If an odd number of `\\' preceded a '$'\n# in input to double_quote_subst, that '$' was protected from expansion.\n# Since each input `\\' is now two `\\'s, look for any number of runs of\n# four `\\'s followed by two `\\'s and then a '$'.  `\\' that '$'.\nbs='\\\\'\nbs2='\\\\\\\\'\nbs4='\\\\\\\\\\\\\\\\'\ndollar='\\$'\nsed_double_backslash=\"\\\n  s/$bs4/&\\\\\n/g\n  s/^$bs2$dollar/$bs&/\n  s/\\\\([^$bs]\\\\)$bs2$dollar/\\\\1$bs2$bs$dollar/g\n  s/\\n//g\"\n\n# Standard options:\nopt_dry_run=false\nopt_help=false\nopt_quiet=false\nopt_verbose=false\nopt_warning=:\n\n# func_echo arg...\n# Echo program name prefixed message, along with the current mode\n# name if it has been set yet.\nfunc_echo ()\n{\n    $ECHO \"$progname${mode+: }$mode: $*\"\n}\n\n# func_verbose arg...\n# Echo program name prefixed message in verbose mode only.\nfunc_verbose ()\n{\n    $opt_verbose && func_echo ${1+\"$@\"}\n\n    # A bug in bash halts the script if the last line of a function\n    # fails when set -e is in force, so we need another command to\n    # work around that:\n    :\n}\n\n# func_error arg...\n# Echo program name prefixed message to standard error.\nfunc_error ()\n{\n    $ECHO \"$progname${mode+: }$mode: \"${1+\"$@\"} 1>&2\n}\n\n# func_warning arg...\n# Echo program name prefixed warning message to standard error.\nfunc_warning ()\n{\n    $opt_warning && $ECHO \"$progname${mode+: }$mode: warning: \"${1+\"$@\"} 1>&2\n\n    # bash bug again:\n    :\n}\n\n# func_fatal_error arg...\n# Echo program name prefixed message to standard error, and exit.\nfunc_fatal_error ()\n{\n    func_error ${1+\"$@\"}\n    exit $EXIT_FAILURE\n}\n\n# func_fatal_help arg...\n# Echo program name prefixed message to standard error, followed by\n# a help hint, and exit.\nfunc_fatal_help ()\n{\n    func_error ${1+\"$@\"}\n    func_fatal_error \"$help\"\n}\nhelp=\"Try \\`$progname --help' for more information.\"  ## default\n\n\n# func_grep expression filename\n# Check whether EXPRESSION matches any line of FILENAME, without output.\nfunc_grep ()\n{\n    $GREP \"$1\" \"$2\" >/dev/null 2>&1\n}\n\n\n# func_mkdir_p directory-path\n# Make sure the entire path to DIRECTORY-PATH is available.\nfunc_mkdir_p ()\n{\n    my_directory_path=\"$1\"\n    my_dir_list=\n\n    if test -n \"$my_directory_path\" && test \"$opt_dry_run\" != \":\"; then\n\n      # Protect directory names starting with `-'\n      case $my_directory_path in\n        -*) my_directory_path=\"./$my_directory_path\" ;;\n      esac\n\n      # While some portion of DIR does not yet exist...\n      while test ! -d \"$my_directory_path\"; do\n        # ...make a list in topmost first order.  Use a colon delimited\n\t# list incase some portion of path contains whitespace.\n        my_dir_list=\"$my_directory_path:$my_dir_list\"\n\n        # If the last portion added has no slash in it, the list is done\n        case $my_directory_path in */*) ;; *) break ;; esac\n\n        # ...otherwise throw away the child directory and loop\n        my_directory_path=`$ECHO \"X$my_directory_path\" | $Xsed -e \"$dirname\"`\n      done\n      my_dir_list=`$ECHO \"X$my_dir_list\" | $Xsed -e 's,:*$,,'`\n\n      save_mkdir_p_IFS=\"$IFS\"; IFS=':'\n      for my_dir in $my_dir_list; do\n\tIFS=\"$save_mkdir_p_IFS\"\n        # mkdir can fail with a `File exist' error if two processes\n        # try to create one of the directories concurrently.  Don't\n        # stop in that case!\n        $MKDIR \"$my_dir\" 2>/dev/null || :\n      done\n      IFS=\"$save_mkdir_p_IFS\"\n\n      # Bail out if we (or some other process) failed to create a directory.\n      test -d \"$my_directory_path\" || \\\n        func_fatal_error \"Failed to create \\`$1'\"\n    fi\n}\n\n\n# func_mktempdir [string]\n# Make a temporary directory that won't clash with other running\n# libtool processes, and avoids race conditions if possible.  If\n# given, STRING is the basename for that directory.\nfunc_mktempdir ()\n{\n    my_template=\"${TMPDIR-/tmp}/${1-$progname}\"\n\n    if test \"$opt_dry_run\" = \":\"; then\n      # Return a directory name, but don't create it in dry-run mode\n      my_tmpdir=\"${my_template}-$$\"\n    else\n\n      # If mktemp works, use that first and foremost\n      my_tmpdir=`mktemp -d \"${my_template}-XXXXXXXX\" 2>/dev/null`\n\n      if test ! -d \"$my_tmpdir\"; then\n        # Failing that, at least try and use $RANDOM to avoid a race\n        my_tmpdir=\"${my_template}-${RANDOM-0}$$\"\n\n        save_mktempdir_umask=`umask`\n        umask 0077\n        $MKDIR \"$my_tmpdir\"\n        umask $save_mktempdir_umask\n      fi\n\n      # If we're not in dry-run mode, bomb out on failure\n      test -d \"$my_tmpdir\" || \\\n        func_fatal_error \"cannot create temporary directory \\`$my_tmpdir'\"\n    fi\n\n    $ECHO \"X$my_tmpdir\" | $Xsed\n}\n\n\n# func_quote_for_eval arg\n# Aesthetically quote ARG to be evaled later.\n# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT\n# is double-quoted, suitable for a subsequent eval, whereas\n# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters\n# which are still active within double quotes backslashified.\nfunc_quote_for_eval ()\n{\n    case $1 in\n      *[\\\\\\`\\\"\\$]*)\n\tfunc_quote_for_eval_unquoted_result=`$ECHO \"X$1\" | $Xsed -e \"$sed_quote_subst\"` ;;\n      *)\n        func_quote_for_eval_unquoted_result=\"$1\" ;;\n    esac\n\n    case $func_quote_for_eval_unquoted_result in\n      # Double-quote args containing shell metacharacters to delay\n      # word splitting, command substitution and and variable\n      # expansion for a subsequent eval.\n      # Many Bourne shells cannot handle close brackets correctly\n      # in scan sets, so we specify it separately.\n      *[\\[\\~\\#\\^\\&\\*\\(\\)\\{\\}\\|\\;\\<\\>\\?\\'\\ \\\t]*|*]*|\"\")\n        func_quote_for_eval_result=\"\\\"$func_quote_for_eval_unquoted_result\\\"\"\n        ;;\n      *)\n        func_quote_for_eval_result=\"$func_quote_for_eval_unquoted_result\"\n    esac\n}\n\n\n# func_quote_for_expand arg\n# Aesthetically quote ARG to be evaled later; same as above,\n# but do not quote variable references.\nfunc_quote_for_expand ()\n{\n    case $1 in\n      *[\\\\\\`\\\"]*)\n\tmy_arg=`$ECHO \"X$1\" | $Xsed \\\n\t    -e \"$double_quote_subst\" -e \"$sed_double_backslash\"` ;;\n      *)\n        my_arg=\"$1\" ;;\n    esac\n\n    case $my_arg in\n      # Double-quote args containing shell metacharacters to delay\n      # word splitting and command substitution for a subsequent eval.\n      # Many Bourne shells cannot handle close brackets correctly\n      # in scan sets, so we specify it separately.\n      *[\\[\\~\\#\\^\\&\\*\\(\\)\\{\\}\\|\\;\\<\\>\\?\\'\\ \\\t]*|*]*|\"\")\n        my_arg=\"\\\"$my_arg\\\"\"\n        ;;\n    esac\n\n    func_quote_for_expand_result=\"$my_arg\"\n}\n\n\n# func_show_eval cmd [fail_exp]\n# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is\n# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP\n# is given, then evaluate it.\nfunc_show_eval ()\n{\n    my_cmd=\"$1\"\n    my_fail_exp=\"${2-:}\"\n\n    ${opt_silent-false} || {\n      func_quote_for_expand \"$my_cmd\"\n      eval \"func_echo $func_quote_for_expand_result\"\n    }\n\n    if ${opt_dry_run-false}; then :; else\n      eval \"$my_cmd\"\n      my_status=$?\n      if test \"$my_status\" -eq 0; then :; else\n\teval \"(exit $my_status); $my_fail_exp\"\n      fi\n    fi\n}\n\n\n# func_show_eval_locale cmd [fail_exp]\n# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is\n# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP\n# is given, then evaluate it.  Use the saved locale for evaluation.\nfunc_show_eval_locale ()\n{\n    my_cmd=\"$1\"\n    my_fail_exp=\"${2-:}\"\n\n    ${opt_silent-false} || {\n      func_quote_for_expand \"$my_cmd\"\n      eval \"func_echo $func_quote_for_expand_result\"\n    }\n\n    if ${opt_dry_run-false}; then :; else\n      eval \"$lt_user_locale\n\t    $my_cmd\"\n      my_status=$?\n      eval \"$lt_safe_locale\"\n      if test \"$my_status\" -eq 0; then :; else\n\teval \"(exit $my_status); $my_fail_exp\"\n      fi\n    fi\n}\n\n\n\n\n\n# func_version\n# Echo version message to standard output and exit.\nfunc_version ()\n{\n    $SED -n '/^# '$PROGRAM' (GNU /,/# warranty; / {\n        s/^# //\n\ts/^# *$//\n        s/\\((C)\\)[ 0-9,-]*\\( [1-9][0-9]*\\)/\\1\\2/\n        p\n     }' < \"$progpath\"\n     exit $?\n}\n\n# func_usage\n# Echo short help message to standard output and exit.\nfunc_usage ()\n{\n    $SED -n '/^# Usage:/,/# -h/ {\n        s/^# //\n\ts/^# *$//\n\ts/\\$progname/'$progname'/\n\tp\n    }' < \"$progpath\"\n    $ECHO\n    $ECHO \"run \\`$progname --help | more' for full usage\"\n    exit $?\n}\n\n# func_help\n# Echo long help message to standard output and exit.\nfunc_help ()\n{\n    $SED -n '/^# Usage:/,/# Report bugs to/ {\n        s/^# //\n\ts/^# *$//\n\ts*\\$progname*'$progname'*\n\ts*\\$host*'\"$host\"'*\n\ts*\\$SHELL*'\"$SHELL\"'*\n\ts*\\$LTCC*'\"$LTCC\"'*\n\ts*\\$LTCFLAGS*'\"$LTCFLAGS\"'*\n\ts*\\$LD*'\"$LD\"'*\n\ts/\\$with_gnu_ld/'\"$with_gnu_ld\"'/\n\ts/\\$automake_version/'\"`(automake --version) 2>/dev/null |$SED 1q`\"'/\n\ts/\\$autoconf_version/'\"`(autoconf --version) 2>/dev/null |$SED 1q`\"'/\n\tp\n     }' < \"$progpath\"\n    exit $?\n}\n\n# func_missing_arg argname\n# Echo program name prefixed message to standard error and set global\n# exit_cmd.\nfunc_missing_arg ()\n{\n    func_error \"missing argument for $1\"\n    exit_cmd=exit\n}\n\nexit_cmd=:\n\n\n\n\n\n# Check that we have a working $ECHO.\nif test \"X$1\" = X--no-reexec; then\n  # Discard the --no-reexec flag, and continue.\n  shift\nelif test \"X$1\" = X--fallback-echo; then\n  # Avoid inline document here, it may be left over\n  :\nelif test \"X`{ $ECHO '\\t'; } 2>/dev/null`\" = 'X\\t'; then\n  # Yippee, $ECHO works!\n  :\nelse\n  # Restart under the correct shell, and then maybe $ECHO will work.\n  exec $SHELL \"$progpath\" --no-reexec ${1+\"$@\"}\nfi\n\nif test \"X$1\" = X--fallback-echo; then\n  # used as fallback echo\n  shift\n  cat <<EOF\n$*\nEOF\n  exit $EXIT_SUCCESS\nfi\n\nmagic=\"%%%MAGIC variable%%%\"\nmagic_exe=\"%%%MAGIC EXE variable%%%\"\n\n# Global variables.\n# $mode is unset\nnonopt=\nexecute_dlfiles=\npreserve_args=\nlo2o=\"s/\\\\.lo\\$/.${objext}/\"\no2lo=\"s/\\\\.${objext}\\$/.lo/\"\nextracted_archives=\nextracted_serial=0\n\nopt_dry_run=false\nopt_duplicate_deps=false\nopt_silent=false\nopt_debug=:\n\n# If this variable is set in any of the actions, the command in it\n# will be execed at the end.  This prevents here-documents from being\n# left over by shells.\nexec_cmd=\n\n# func_fatal_configuration arg...\n# Echo program name prefixed message to standard error, followed by\n# a configuration failure hint, and exit.\nfunc_fatal_configuration ()\n{\n    func_error ${1+\"$@\"}\n    func_error \"See the $PACKAGE documentation for more information.\"\n    func_fatal_error \"Fatal configuration error.\"\n}\n\n\n# func_config\n# Display the configuration for all the tags in this script.\nfunc_config ()\n{\n    re_begincf='^# ### BEGIN LIBTOOL'\n    re_endcf='^# ### END LIBTOOL'\n\n    # Default configuration.\n    $SED \"1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\\$d\" < \"$progpath\"\n\n    # Now print the configurations for the tags.\n    for tagname in $taglist; do\n      $SED -n \"/$re_begincf TAG CONFIG: $tagname\\$/,/$re_endcf TAG CONFIG: $tagname\\$/p\" < \"$progpath\"\n    done\n\n    exit $?\n}\n\n# func_features\n# Display the features supported by this script.\nfunc_features ()\n{\n    $ECHO \"host: $host\"\n    if test \"$build_libtool_libs\" = yes; then\n      $ECHO \"enable shared libraries\"\n    else\n      $ECHO \"disable shared libraries\"\n    fi\n    if test \"$build_old_libs\" = yes; then\n      $ECHO \"enable static libraries\"\n    else\n      $ECHO \"disable static libraries\"\n    fi\n\n    exit $?\n}\n\n# func_enable_tag tagname\n# Verify that TAGNAME is valid, and either flag an error and exit, or\n# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist\n# variable here.\nfunc_enable_tag ()\n{\n  # Global variable:\n  tagname=\"$1\"\n\n  re_begincf=\"^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\\$\"\n  re_endcf=\"^# ### END LIBTOOL TAG CONFIG: $tagname\\$\"\n  sed_extractcf=\"/$re_begincf/,/$re_endcf/p\"\n\n  # Validate tagname.\n  case $tagname in\n    *[!-_A-Za-z0-9,/]*)\n      func_fatal_error \"invalid tag name: $tagname\"\n      ;;\n  esac\n\n  # Don't test for the \"default\" C tag, as we know it's\n  # there but not specially marked.\n  case $tagname in\n    CC) ;;\n    *)\n      if $GREP \"$re_begincf\" \"$progpath\" >/dev/null 2>&1; then\n\ttaglist=\"$taglist $tagname\"\n\n\t# Evaluate the configuration.  Be careful to quote the path\n\t# and the sed script, to avoid splitting on whitespace, but\n\t# also don't use non-portable quotes within backquotes within\n\t# quotes we have to do it in 2 steps:\n\textractedcf=`$SED -n -e \"$sed_extractcf\" < \"$progpath\"`\n\teval \"$extractedcf\"\n      else\n\tfunc_error \"ignoring unknown tag $tagname\"\n      fi\n      ;;\n  esac\n}\n\n# Parse options once, thoroughly.  This comes as soon as possible in\n# the script to make things like `libtool --version' happen quickly.\n{\n\n  # Shorthand for --mode=foo, only valid as the first argument\n  case $1 in\n  clean|clea|cle|cl)\n    shift; set dummy --mode clean ${1+\"$@\"}; shift\n    ;;\n  compile|compil|compi|comp|com|co|c)\n    shift; set dummy --mode compile ${1+\"$@\"}; shift\n    ;;\n  execute|execut|execu|exec|exe|ex|e)\n    shift; set dummy --mode execute ${1+\"$@\"}; shift\n    ;;\n  finish|finis|fini|fin|fi|f)\n    shift; set dummy --mode finish ${1+\"$@\"}; shift\n    ;;\n  install|instal|insta|inst|ins|in|i)\n    shift; set dummy --mode install ${1+\"$@\"}; shift\n    ;;\n  link|lin|li|l)\n    shift; set dummy --mode link ${1+\"$@\"}; shift\n    ;;\n  uninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)\n    shift; set dummy --mode uninstall ${1+\"$@\"}; shift\n    ;;\n  esac\n\n  # Parse non-mode specific arguments:\n  while test \"$#\" -gt 0; do\n    opt=\"$1\"\n    shift\n\n    case $opt in\n      --config)\t\tfunc_config\t\t\t\t\t;;\n\n      --debug)\t\tpreserve_args=\"$preserve_args $opt\"\n\t\t\tfunc_echo \"enabling shell trace mode\"\n\t\t\topt_debug='set -x'\n\t\t\t$opt_debug\n\t\t\t;;\n\n      -dlopen)\t\ttest \"$#\" -eq 0 && func_missing_arg \"$opt\" && break\n\t\t\texecute_dlfiles=\"$execute_dlfiles $1\"\n\t\t\tshift\n\t\t\t;;\n\n      --dry-run | -n)\topt_dry_run=:\t\t\t\t\t;;\n      --features)       func_features\t\t\t\t\t;;\n      --finish)\t\tmode=\"finish\"\t\t\t\t\t;;\n\n      --mode)\t\ttest \"$#\" -eq 0 && func_missing_arg \"$opt\" && break\n\t\t\tcase $1 in\n\t\t\t  # Valid mode arguments:\n\t\t\t  clean)\t;;\n\t\t\t  compile)\t;;\n\t\t\t  execute)\t;;\n\t\t\t  finish)\t;;\n\t\t\t  install)\t;;\n\t\t\t  link)\t\t;;\n\t\t\t  relink)\t;;\n\t\t\t  uninstall)\t;;\n\n\t\t\t  # Catch anything else as an error\n\t\t\t  *) func_error \"invalid argument for $opt\"\n\t\t\t     exit_cmd=exit\n\t\t\t     break\n\t\t\t     ;;\n\t\t        esac\n\n\t\t\tmode=\"$1\"\n\t\t\tshift\n\t\t\t;;\n\n      --preserve-dup-deps)\n\t\t\topt_duplicate_deps=:\t\t\t\t;;\n\n      --quiet|--silent)\tpreserve_args=\"$preserve_args $opt\"\n\t\t\topt_silent=:\n\t\t\t;;\n\n      --verbose| -v)\tpreserve_args=\"$preserve_args $opt\"\n\t\t\topt_silent=false\n\t\t\t;;\n\n      --tag)\t\ttest \"$#\" -eq 0 && func_missing_arg \"$opt\" && break\n\t\t\tpreserve_args=\"$preserve_args $opt $1\"\n\t\t\tfunc_enable_tag \"$1\"\t# tagname is set here\n\t\t\tshift\n\t\t\t;;\n\n      # Separate optargs to long options:\n      -dlopen=*|--mode=*|--tag=*)\n\t\t\tfunc_opt_split \"$opt\"\n\t\t\tset dummy \"$func_opt_split_opt\" \"$func_opt_split_arg\" ${1+\"$@\"}\n\t\t\tshift\n\t\t\t;;\n\n      -\\?|-h)\t\tfunc_usage\t\t\t\t\t;;\n      --help)\t\topt_help=:\t\t\t\t\t;;\n      --version)\tfunc_version\t\t\t\t\t;;\n\n      -*)\t\tfunc_fatal_help \"unrecognized option \\`$opt'\"\t;;\n\n      *)\t\tnonopt=\"$opt\"\n\t\t\tbreak\n\t\t\t;;\n    esac\n  done\n\n\n  case $host in\n    *cygwin* | *mingw* | *pw32* | *cegcc*)\n      # don't eliminate duplications in $postdeps and $predeps\n      opt_duplicate_compiler_generated_deps=:\n      ;;\n    *)\n      opt_duplicate_compiler_generated_deps=$opt_duplicate_deps\n      ;;\n  esac\n\n  # Having warned about all mis-specified options, bail out if\n  # anything was wrong.\n  $exit_cmd $EXIT_FAILURE\n}\n\n# func_check_version_match\n# Ensure that we are using m4 macros, and libtool script from the same\n# release of libtool.\nfunc_check_version_match ()\n{\n  if test \"$package_revision\" != \"$macro_revision\"; then\n    if test \"$VERSION\" != \"$macro_version\"; then\n      if test -z \"$macro_version\"; then\n        cat >&2 <<_LT_EOF\n$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the\n$progname: definition of this LT_INIT comes from an older release.\n$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION\n$progname: and run autoconf again.\n_LT_EOF\n      else\n        cat >&2 <<_LT_EOF\n$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the\n$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.\n$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION\n$progname: and run autoconf again.\n_LT_EOF\n      fi\n    else\n      cat >&2 <<_LT_EOF\n$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,\n$progname: but the definition of this LT_INIT comes from revision $macro_revision.\n$progname: You should recreate aclocal.m4 with macros from revision $package_revision\n$progname: of $PACKAGE $VERSION and run autoconf again.\n_LT_EOF\n    fi\n\n    exit $EXIT_MISMATCH\n  fi\n}\n\n\n## ----------- ##\n##    Main.    ##\n## ----------- ##\n\n$opt_help || {\n  # Sanity checks first:\n  func_check_version_match\n\n  if test \"$build_libtool_libs\" != yes && test \"$build_old_libs\" != yes; then\n    func_fatal_configuration \"not configured to build any kind of library\"\n  fi\n\n  test -z \"$mode\" && func_fatal_error \"error: you must specify a MODE.\"\n\n\n  # Darwin sucks\n  eval std_shrext=\\\"$shrext_cmds\\\"\n\n\n  # Only execute mode is allowed to have -dlopen flags.\n  if test -n \"$execute_dlfiles\" && test \"$mode\" != execute; then\n    func_error \"unrecognized option \\`-dlopen'\"\n    $ECHO \"$help\" 1>&2\n    exit $EXIT_FAILURE\n  fi\n\n  # Change the help message to a mode-specific one.\n  generic_help=\"$help\"\n  help=\"Try \\`$progname --help --mode=$mode' for more information.\"\n}\n\n\n# func_lalib_p file\n# True iff FILE is a libtool `.la' library or `.lo' object file.\n# This function is only a basic sanity check; it will hardly flush out\n# determined imposters.\nfunc_lalib_p ()\n{\n    test -f \"$1\" &&\n      $SED -e 4q \"$1\" 2>/dev/null \\\n        | $GREP \"^# Generated by .*$PACKAGE\" > /dev/null 2>&1\n}\n\n# func_lalib_unsafe_p file\n# True iff FILE is a libtool `.la' library or `.lo' object file.\n# This function implements the same check as func_lalib_p without\n# resorting to external programs.  To this end, it redirects stdin and\n# closes it afterwards, without saving the original file descriptor.\n# As a safety measure, use it only where a negative result would be\n# fatal anyway.  Works if `file' does not exist.\nfunc_lalib_unsafe_p ()\n{\n    lalib_p=no\n    if test -f \"$1\" && test -r \"$1\" && exec 5<&0 <\"$1\"; then\n\tfor lalib_p_l in 1 2 3 4\n\tdo\n\t    read lalib_p_line\n\t    case \"$lalib_p_line\" in\n\t\t\\#\\ Generated\\ by\\ *$PACKAGE* ) lalib_p=yes; break;;\n\t    esac\n\tdone\n\texec 0<&5 5<&-\n    fi\n    test \"$lalib_p\" = yes\n}\n\n# func_ltwrapper_script_p file\n# True iff FILE is a libtool wrapper script\n# This function is only a basic sanity check; it will hardly flush out\n# determined imposters.\nfunc_ltwrapper_script_p ()\n{\n    func_lalib_p \"$1\"\n}\n\n# func_ltwrapper_executable_p file\n# True iff FILE is a libtool wrapper executable\n# This function is only a basic sanity check; it will hardly flush out\n# determined imposters.\nfunc_ltwrapper_executable_p ()\n{\n    func_ltwrapper_exec_suffix=\n    case $1 in\n    *.exe) ;;\n    *) func_ltwrapper_exec_suffix=.exe ;;\n    esac\n    $GREP \"$magic_exe\" \"$1$func_ltwrapper_exec_suffix\" >/dev/null 2>&1\n}\n\n# func_ltwrapper_scriptname file\n# Assumes file is an ltwrapper_executable\n# uses $file to determine the appropriate filename for a\n# temporary ltwrapper_script.\nfunc_ltwrapper_scriptname ()\n{\n    func_ltwrapper_scriptname_result=\"\"\n    if func_ltwrapper_executable_p \"$1\"; then\n\tfunc_dirname_and_basename \"$1\" \"\" \".\"\n\tfunc_stripname '' '.exe' \"$func_basename_result\"\n\tfunc_ltwrapper_scriptname_result=\"$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper\"\n    fi\n}\n\n# func_ltwrapper_p file\n# True iff FILE is a libtool wrapper script or wrapper executable\n# This function is only a basic sanity check; it will hardly flush out\n# determined imposters.\nfunc_ltwrapper_p ()\n{\n    func_ltwrapper_script_p \"$1\" || func_ltwrapper_executable_p \"$1\"\n}\n\n\n# func_execute_cmds commands fail_cmd\n# Execute tilde-delimited COMMANDS.\n# If FAIL_CMD is given, eval that upon failure.\n# FAIL_CMD may read-access the current command in variable CMD!\nfunc_execute_cmds ()\n{\n    $opt_debug\n    save_ifs=$IFS; IFS='~'\n    for cmd in $1; do\n      IFS=$save_ifs\n      eval cmd=\\\"$cmd\\\"\n      func_show_eval \"$cmd\" \"${2-:}\"\n    done\n    IFS=$save_ifs\n}\n\n\n# func_source file\n# Source FILE, adding directory component if necessary.\n# Note that it is not necessary on cygwin/mingw to append a dot to\n# FILE even if both FILE and FILE.exe exist: automatic-append-.exe\n# behavior happens only for exec(3), not for open(2)!  Also, sourcing\n# `FILE.' does not work on cygwin managed mounts.\nfunc_source ()\n{\n    $opt_debug\n    case $1 in\n    */* | *\\\\*)\t. \"$1\" ;;\n    *)\t\t. \"./$1\" ;;\n    esac\n}\n\n\n# func_infer_tag arg\n# Infer tagged configuration to use if any are available and\n# if one wasn't chosen via the \"--tag\" command line option.\n# Only attempt this if the compiler in the base compile\n# command doesn't match the default compiler.\n# arg is usually of the form 'gcc ...'\nfunc_infer_tag ()\n{\n    $opt_debug\n    if test -n \"$available_tags\" && test -z \"$tagname\"; then\n      CC_quoted=\n      for arg in $CC; do\n        func_quote_for_eval \"$arg\"\n\tCC_quoted=\"$CC_quoted $func_quote_for_eval_result\"\n      done\n      case $@ in\n      # Blanks in the command may have been stripped by the calling shell,\n      # but not from the CC environment variable when configure was run.\n      \" $CC \"* | \"$CC \"* | \" `$ECHO $CC` \"* | \"`$ECHO $CC` \"* | \" $CC_quoted\"* | \"$CC_quoted \"* | \" `$ECHO $CC_quoted` \"* | \"`$ECHO $CC_quoted` \"*) ;;\n      # Blanks at the start of $base_compile will cause this to fail\n      # if we don't check for them as well.\n      *)\n\tfor z in $available_tags; do\n\t  if $GREP \"^# ### BEGIN LIBTOOL TAG CONFIG: $z$\" < \"$progpath\" > /dev/null; then\n\t    # Evaluate the configuration.\n\t    eval \"`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`\"\n\t    CC_quoted=\n\t    for arg in $CC; do\n\t      # Double-quote args containing other shell metacharacters.\n\t      func_quote_for_eval \"$arg\"\n\t      CC_quoted=\"$CC_quoted $func_quote_for_eval_result\"\n\t    done\n\t    case \"$@ \" in\n\t      \" $CC \"* | \"$CC \"* | \" `$ECHO $CC` \"* | \"`$ECHO $CC` \"* | \" $CC_quoted\"* | \"$CC_quoted \"* | \" `$ECHO $CC_quoted` \"* | \"`$ECHO $CC_quoted` \"*)\n\t      # The compiler in the base compile command matches\n\t      # the one in the tagged configuration.\n\t      # Assume this is the tagged configuration we want.\n\t      tagname=$z\n\t      break\n\t      ;;\n\t    esac\n\t  fi\n\tdone\n\t# If $tagname still isn't set, then no tagged configuration\n\t# was found and let the user know that the \"--tag\" command\n\t# line option must be used.\n\tif test -z \"$tagname\"; then\n\t  func_echo \"unable to infer tagged configuration\"\n\t  func_fatal_error \"specify a tag with \\`--tag'\"\n#\telse\n#\t  func_verbose \"using $tagname tagged configuration\"\n\tfi\n\t;;\n      esac\n    fi\n}\n\n\n\n# func_write_libtool_object output_name pic_name nonpic_name\n# Create a libtool object file (analogous to a \".la\" file),\n# but don't create it if we're doing a dry run.\nfunc_write_libtool_object ()\n{\n    write_libobj=${1}\n    if test \"$build_libtool_libs\" = yes; then\n      write_lobj=\\'${2}\\'\n    else\n      write_lobj=none\n    fi\n\n    if test \"$build_old_libs\" = yes; then\n      write_oldobj=\\'${3}\\'\n    else\n      write_oldobj=none\n    fi\n\n    $opt_dry_run || {\n      cat >${write_libobj}T <<EOF\n# $write_libobj - a libtool object file\n# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION\n#\n# Please DO NOT delete this file!\n# It is necessary for linking the library.\n\n# Name of the PIC object.\npic_object=$write_lobj\n\n# Name of the non-PIC object\nnon_pic_object=$write_oldobj\n\nEOF\n      $MV \"${write_libobj}T\" \"${write_libobj}\"\n    }\n}\n\n# func_mode_compile arg...\nfunc_mode_compile ()\n{\n    $opt_debug\n    # Get the compilation command and the source file.\n    base_compile=\n    srcfile=\"$nonopt\"  #  always keep a non-empty value in \"srcfile\"\n    suppress_opt=yes\n    suppress_output=\n    arg_mode=normal\n    libobj=\n    later=\n    pie_flag=\n\n    for arg\n    do\n      case $arg_mode in\n      arg  )\n\t# do not \"continue\".  Instead, add this to base_compile\n\tlastarg=\"$arg\"\n\targ_mode=normal\n\t;;\n\n      target )\n\tlibobj=\"$arg\"\n\targ_mode=normal\n\tcontinue\n\t;;\n\n      normal )\n\t# Accept any command-line options.\n\tcase $arg in\n\t-o)\n\t  test -n \"$libobj\" && \\\n\t    func_fatal_error \"you cannot specify \\`-o' more than once\"\n\t  arg_mode=target\n\t  continue\n\t  ;;\n\n\t-pie | -fpie | -fPIE)\n          pie_flag=\"$pie_flag $arg\"\n\t  continue\n\t  ;;\n\n\t-shared | -static | -prefer-pic | -prefer-non-pic)\n\t  later=\"$later $arg\"\n\t  continue\n\t  ;;\n\n\t-no-suppress)\n\t  suppress_opt=no\n\t  continue\n\t  ;;\n\n\t-Xcompiler)\n\t  arg_mode=arg  #  the next one goes into the \"base_compile\" arg list\n\t  continue      #  The current \"srcfile\" will either be retained or\n\t  ;;            #  replaced later.  I would guess that would be a bug.\n\n\t-Wc,*)\n\t  func_stripname '-Wc,' '' \"$arg\"\n\t  args=$func_stripname_result\n\t  lastarg=\n\t  save_ifs=\"$IFS\"; IFS=','\n\t  for arg in $args; do\n\t    IFS=\"$save_ifs\"\n\t    func_quote_for_eval \"$arg\"\n\t    lastarg=\"$lastarg $func_quote_for_eval_result\"\n\t  done\n\t  IFS=\"$save_ifs\"\n\t  func_stripname ' ' '' \"$lastarg\"\n\t  lastarg=$func_stripname_result\n\n\t  # Add the arguments to base_compile.\n\t  base_compile=\"$base_compile $lastarg\"\n\t  continue\n\t  ;;\n\n\t*)\n\t  # Accept the current argument as the source file.\n\t  # The previous \"srcfile\" becomes the current argument.\n\t  #\n\t  lastarg=\"$srcfile\"\n\t  srcfile=\"$arg\"\n\t  ;;\n\tesac  #  case $arg\n\t;;\n      esac    #  case $arg_mode\n\n      # Aesthetically quote the previous argument.\n      func_quote_for_eval \"$lastarg\"\n      base_compile=\"$base_compile $func_quote_for_eval_result\"\n    done # for arg\n\n    case $arg_mode in\n    arg)\n      func_fatal_error \"you must specify an argument for -Xcompile\"\n      ;;\n    target)\n      func_fatal_error \"you must specify a target with \\`-o'\"\n      ;;\n    *)\n      # Get the name of the library object.\n      test -z \"$libobj\" && {\n\tfunc_basename \"$srcfile\"\n\tlibobj=\"$func_basename_result\"\n      }\n      ;;\n    esac\n\n    # Recognize several different file suffixes.\n    # If the user specifies -o file.o, it is replaced with file.lo\n    case $libobj in\n    *.[cCFSifmso] | \\\n    *.ada | *.adb | *.ads | *.asm | \\\n    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \\\n    *.[fF][09]? | *.for | *.java | *.obj | *.sx)\n      func_xform \"$libobj\"\n      libobj=$func_xform_result\n      ;;\n    esac\n\n    case $libobj in\n    *.lo) func_lo2o \"$libobj\"; obj=$func_lo2o_result ;;\n    *)\n      func_fatal_error \"cannot determine name of library object from \\`$libobj'\"\n      ;;\n    esac\n\n    func_infer_tag $base_compile\n\n    for arg in $later; do\n      case $arg in\n      -shared)\n\ttest \"$build_libtool_libs\" != yes && \\\n\t  func_fatal_configuration \"can not build a shared library\"\n\tbuild_old_libs=no\n\tcontinue\n\t;;\n\n      -static)\n\tbuild_libtool_libs=no\n\tbuild_old_libs=yes\n\tcontinue\n\t;;\n\n      -prefer-pic)\n\tpic_mode=yes\n\tcontinue\n\t;;\n\n      -prefer-non-pic)\n\tpic_mode=no\n\tcontinue\n\t;;\n      esac\n    done\n\n    func_quote_for_eval \"$libobj\"\n    test \"X$libobj\" != \"X$func_quote_for_eval_result\" \\\n      && $ECHO \"X$libobj\" | $GREP '[]~#^*{};<>?\"'\"'\"'\t &()|`$[]' \\\n      && func_warning \"libobj name \\`$libobj' may not contain shell special characters.\"\n    func_dirname_and_basename \"$obj\" \"/\" \"\"\n    objname=\"$func_basename_result\"\n    xdir=\"$func_dirname_result\"\n    lobj=${xdir}$objdir/$objname\n\n    test -z \"$base_compile\" && \\\n      func_fatal_help \"you must specify a compilation command\"\n\n    # Delete any leftover library objects.\n    if test \"$build_old_libs\" = yes; then\n      removelist=\"$obj $lobj $libobj ${libobj}T\"\n    else\n      removelist=\"$lobj $libobj ${libobj}T\"\n    fi\n\n    # On Cygwin there's no \"real\" PIC flag so we must build both object types\n    case $host_os in\n    cygwin* | mingw* | pw32* | os2* | cegcc*)\n      pic_mode=default\n      ;;\n    esac\n    if test \"$pic_mode\" = no && test \"$deplibs_check_method\" != pass_all; then\n      # non-PIC code in shared libraries is not supported\n      pic_mode=default\n    fi\n\n    # Calculate the filename of the output object if compiler does\n    # not support -o with -c\n    if test \"$compiler_c_o\" = no; then\n      output_obj=`$ECHO \"X$srcfile\" | $Xsed -e 's%^.*/%%' -e 's%\\.[^.]*$%%'`.${objext}\n      lockfile=\"$output_obj.lock\"\n    else\n      output_obj=\n      need_locks=no\n      lockfile=\n    fi\n\n    # Lock this critical section if it is needed\n    # We use this script file to make the link, it avoids creating a new file\n    if test \"$need_locks\" = yes; then\n      until $opt_dry_run || ln \"$progpath\" \"$lockfile\" 2>/dev/null; do\n\tfunc_echo \"Waiting for $lockfile to be removed\"\n\tsleep 2\n      done\n    elif test \"$need_locks\" = warn; then\n      if test -f \"$lockfile\"; then\n\t$ECHO \"\\\n*** ERROR, $lockfile exists and contains:\n`cat $lockfile 2>/dev/null`\n\nThis indicates that another process is trying to use the same\ntemporary object file, and libtool could not work around it because\nyour compiler does not support \\`-c' and \\`-o' together.  If you\nrepeat this compilation, it may succeed, by chance, but you had better\navoid parallel builds (make -j) in this platform, or get a better\ncompiler.\"\n\n\t$opt_dry_run || $RM $removelist\n\texit $EXIT_FAILURE\n      fi\n      removelist=\"$removelist $output_obj\"\n      $ECHO \"$srcfile\" > \"$lockfile\"\n    fi\n\n    $opt_dry_run || $RM $removelist\n    removelist=\"$removelist $lockfile\"\n    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15\n\n    if test -n \"$fix_srcfile_path\"; then\n      eval srcfile=\\\"$fix_srcfile_path\\\"\n    fi\n    func_quote_for_eval \"$srcfile\"\n    qsrcfile=$func_quote_for_eval_result\n\n    # Only build a PIC object if we are building libtool libraries.\n    if test \"$build_libtool_libs\" = yes; then\n      # Without this assignment, base_compile gets emptied.\n      fbsd_hideous_sh_bug=$base_compile\n\n      if test \"$pic_mode\" != no; then\n\tcommand=\"$base_compile $qsrcfile $pic_flag\"\n      else\n\t# Don't build PIC code\n\tcommand=\"$base_compile $qsrcfile\"\n      fi\n\n      func_mkdir_p \"$xdir$objdir\"\n\n      if test -z \"$output_obj\"; then\n\t# Place PIC objects in $objdir\n\tcommand=\"$command -o $lobj\"\n      fi\n\n      func_show_eval_locale \"$command\"\t\\\n          'test -n \"$output_obj\" && $RM $removelist; exit $EXIT_FAILURE'\n\n      if test \"$need_locks\" = warn &&\n\t test \"X`cat $lockfile 2>/dev/null`\" != \"X$srcfile\"; then\n\t$ECHO \"\\\n*** ERROR, $lockfile contains:\n`cat $lockfile 2>/dev/null`\n\nbut it should contain:\n$srcfile\n\nThis indicates that another process is trying to use the same\ntemporary object file, and libtool could not work around it because\nyour compiler does not support \\`-c' and \\`-o' together.  If you\nrepeat this compilation, it may succeed, by chance, but you had better\navoid parallel builds (make -j) in this platform, or get a better\ncompiler.\"\n\n\t$opt_dry_run || $RM $removelist\n\texit $EXIT_FAILURE\n      fi\n\n      # Just move the object if needed, then go on to compile the next one\n      if test -n \"$output_obj\" && test \"X$output_obj\" != \"X$lobj\"; then\n\tfunc_show_eval '$MV \"$output_obj\" \"$lobj\"' \\\n\t  'error=$?; $opt_dry_run || $RM $removelist; exit $error'\n      fi\n\n      # Allow error messages only from the first compilation.\n      if test \"$suppress_opt\" = yes; then\n\tsuppress_output=' >/dev/null 2>&1'\n      fi\n    fi\n\n    # Only build a position-dependent object if we build old libraries.\n    if test \"$build_old_libs\" = yes; then\n      if test \"$pic_mode\" != yes; then\n\t# Don't build PIC code\n\tcommand=\"$base_compile $qsrcfile$pie_flag\"\n      else\n\tcommand=\"$base_compile $qsrcfile $pic_flag\"\n      fi\n      if test \"$compiler_c_o\" = yes; then\n\tcommand=\"$command -o $obj\"\n      fi\n\n      # Suppress compiler output if we already did a PIC compilation.\n      command=\"$command$suppress_output\"\n      func_show_eval_locale \"$command\" \\\n        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'\n\n      if test \"$need_locks\" = warn &&\n\t test \"X`cat $lockfile 2>/dev/null`\" != \"X$srcfile\"; then\n\t$ECHO \"\\\n*** ERROR, $lockfile contains:\n`cat $lockfile 2>/dev/null`\n\nbut it should contain:\n$srcfile\n\nThis indicates that another process is trying to use the same\ntemporary object file, and libtool could not work around it because\nyour compiler does not support \\`-c' and \\`-o' together.  If you\nrepeat this compilation, it may succeed, by chance, but you had better\navoid parallel builds (make -j) in this platform, or get a better\ncompiler.\"\n\n\t$opt_dry_run || $RM $removelist\n\texit $EXIT_FAILURE\n      fi\n\n      # Just move the object if needed\n      if test -n \"$output_obj\" && test \"X$output_obj\" != \"X$obj\"; then\n\tfunc_show_eval '$MV \"$output_obj\" \"$obj\"' \\\n\t  'error=$?; $opt_dry_run || $RM $removelist; exit $error'\n      fi\n    fi\n\n    $opt_dry_run || {\n      func_write_libtool_object \"$libobj\" \"$objdir/$objname\" \"$objname\"\n\n      # Unlock the critical section if it was locked\n      if test \"$need_locks\" != no; then\n\tremovelist=$lockfile\n        $RM \"$lockfile\"\n      fi\n    }\n\n    exit $EXIT_SUCCESS\n}\n\n$opt_help || {\ntest \"$mode\" = compile && func_mode_compile ${1+\"$@\"}\n}\n\nfunc_mode_help ()\n{\n    # We need to display help for each of the modes.\n    case $mode in\n      \"\")\n        # Generic help is extracted from the usage comments\n        # at the start of this file.\n        func_help\n        ;;\n\n      clean)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...\n\nRemove files from the build directory.\n\nRM is the name of the program to use to delete files associated with each FILE\n(typically \\`/bin/rm').  RM-OPTIONS are options (such as \\`-f') to be passed\nto RM.\n\nIf FILE is a libtool library, object or program, all the files associated\nwith it are deleted. Otherwise, only FILE itself is deleted using RM.\"\n        ;;\n\n      compile)\n      $ECHO \\\n\"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE\n\nCompile a source file into a libtool library object.\n\nThis mode accepts the following additional options:\n\n  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE\n  -no-suppress      do not suppress compiler output for multiple passes\n  -prefer-pic       try to building PIC objects only\n  -prefer-non-pic   try to building non-PIC objects only\n  -shared           do not build a \\`.o' file suitable for static linking\n  -static           only build a \\`.o' file suitable for static linking\n\nCOMPILE-COMMAND is a command to be used in creating a \\`standard' object file\nfrom the given SOURCEFILE.\n\nThe output file name is determined by removing the directory component from\nSOURCEFILE, then substituting the C source code suffix \\`.c' with the\nlibrary object suffix, \\`.lo'.\"\n        ;;\n\n      execute)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...\n\nAutomatically set library path, then run a program.\n\nThis mode accepts the following additional options:\n\n  -dlopen FILE      add the directory containing FILE to the library path\n\nThis mode sets the library path environment variable according to \\`-dlopen'\nflags.\n\nIf any of the ARGS are libtool executable wrappers, then they are translated\ninto their corresponding uninstalled binary, and any of their required library\ndirectories are added to the library path.\n\nThen, COMMAND is executed, with ARGS as arguments.\"\n        ;;\n\n      finish)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...\n\nComplete the installation of libtool libraries.\n\nEach LIBDIR is a directory that contains libtool libraries.\n\nThe commands that this mode executes may require superuser privileges.  Use\nthe \\`--dry-run' option if you just want to see what would be executed.\"\n        ;;\n\n      install)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...\n\nInstall executables or libraries.\n\nINSTALL-COMMAND is the installation command.  The first component should be\neither the \\`install' or \\`cp' program.\n\nThe following components of INSTALL-COMMAND are treated specially:\n\n  -inst-prefix PREFIX-DIR  Use PREFIX-DIR as a staging area for installation\n\nThe rest of the components are interpreted as arguments to that command (only\nBSD-compatible install options are recognized).\"\n        ;;\n\n      link)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...\n\nLink object files or libraries together to form another library, or to\ncreate an executable program.\n\nLINK-COMMAND is a command using the C compiler that you would use to create\na program from several object files.\n\nThe following components of LINK-COMMAND are treated specially:\n\n  -all-static       do not do any dynamic linking at all\n  -avoid-version    do not add a version suffix if possible\n  -dlopen FILE      \\`-dlpreopen' FILE if it cannot be dlopened at runtime\n  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols\n  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)\n  -export-symbols SYMFILE\n                    try to export only the symbols listed in SYMFILE\n  -export-symbols-regex REGEX\n                    try to export only the symbols matching REGEX\n  -LLIBDIR          search LIBDIR for required installed libraries\n  -lNAME            OUTPUT-FILE requires the installed library libNAME\n  -module           build a library that can dlopened\n  -no-fast-install  disable the fast-install mode\n  -no-install       link a not-installable executable\n  -no-undefined     declare that a library does not refer to external symbols\n  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects\n  -objectlist FILE  Use a list of object files found in FILE to specify objects\n  -precious-files-regex REGEX\n                    don't remove output files matching REGEX\n  -release RELEASE  specify package release information\n  -rpath LIBDIR     the created library will eventually be installed in LIBDIR\n  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries\n  -shared           only do dynamic linking of libtool libraries\n  -shrext SUFFIX    override the standard shared library file extension\n  -static           do not do any dynamic linking of uninstalled libtool libraries\n  -static-libtool-libs\n                    do not do any dynamic linking of libtool libraries\n  -version-info CURRENT[:REVISION[:AGE]]\n                    specify library version info [each variable defaults to 0]\n  -weak LIBNAME     declare that the target provides the LIBNAME interface\n\nAll other options (arguments beginning with \\`-') are ignored.\n\nEvery other argument is treated as a filename.  Files ending in \\`.la' are\ntreated as uninstalled libtool libraries, other files are standard or library\nobject files.\n\nIf the OUTPUT-FILE ends in \\`.la', then a libtool library is created,\nonly library objects (\\`.lo' files) may be specified, and \\`-rpath' is\nrequired, except when creating a convenience library.\n\nIf OUTPUT-FILE ends in \\`.a' or \\`.lib', then a standard library is created\nusing \\`ar' and \\`ranlib', or on Windows using \\`lib'.\n\nIf OUTPUT-FILE ends in \\`.lo' or \\`.${objext}', then a reloadable object file\nis created, otherwise an executable program is created.\"\n        ;;\n\n      uninstall)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...\n\nRemove libraries from an installation directory.\n\nRM is the name of the program to use to delete files associated with each FILE\n(typically \\`/bin/rm').  RM-OPTIONS are options (such as \\`-f') to be passed\nto RM.\n\nIf FILE is a libtool library, all the files associated with it are deleted.\nOtherwise, only FILE itself is deleted using RM.\"\n        ;;\n\n      *)\n        func_fatal_help \"invalid operation mode \\`$mode'\"\n        ;;\n    esac\n\n    $ECHO\n    $ECHO \"Try \\`$progname --help' for more information about other modes.\"\n\n    exit $?\n}\n\n  # Now that we've collected a possible --mode arg, show help if necessary\n  $opt_help && func_mode_help\n\n\n# func_mode_execute arg...\nfunc_mode_execute ()\n{\n    $opt_debug\n    # The first argument is the command name.\n    cmd=\"$nonopt\"\n    test -z \"$cmd\" && \\\n      func_fatal_help \"you must specify a COMMAND\"\n\n    # Handle -dlopen flags immediately.\n    for file in $execute_dlfiles; do\n      test -f \"$file\" \\\n\t|| func_fatal_help \"\\`$file' is not a file\"\n\n      dir=\n      case $file in\n      *.la)\n\t# Check to see that this really is a libtool archive.\n\tfunc_lalib_unsafe_p \"$file\" \\\n\t  || func_fatal_help \"\\`$lib' is not a valid libtool archive\"\n\n\t# Read the libtool library.\n\tdlname=\n\tlibrary_names=\n\tfunc_source \"$file\"\n\n\t# Skip this library if it cannot be dlopened.\n\tif test -z \"$dlname\"; then\n\t  # Warn if it was a shared library.\n\t  test -n \"$library_names\" && \\\n\t    func_warning \"\\`$file' was not linked with \\`-export-dynamic'\"\n\t  continue\n\tfi\n\n\tfunc_dirname \"$file\" \"\" \".\"\n\tdir=\"$func_dirname_result\"\n\n\tif test -f \"$dir/$objdir/$dlname\"; then\n\t  dir=\"$dir/$objdir\"\n\telse\n\t  if test ! -f \"$dir/$dlname\"; then\n\t    func_fatal_error \"cannot find \\`$dlname' in \\`$dir' or \\`$dir/$objdir'\"\n\t  fi\n\tfi\n\t;;\n\n      *.lo)\n\t# Just add the directory containing the .lo file.\n\tfunc_dirname \"$file\" \"\" \".\"\n\tdir=\"$func_dirname_result\"\n\t;;\n\n      *)\n\tfunc_warning \"\\`-dlopen' is ignored for non-libtool libraries and objects\"\n\tcontinue\n\t;;\n      esac\n\n      # Get the absolute pathname.\n      absdir=`cd \"$dir\" && pwd`\n      test -n \"$absdir\" && dir=\"$absdir\"\n\n      # Now add the directory to shlibpath_var.\n      if eval \"test -z \\\"\\$$shlibpath_var\\\"\"; then\n\teval \"$shlibpath_var=\\\"\\$dir\\\"\"\n      else\n\teval \"$shlibpath_var=\\\"\\$dir:\\$$shlibpath_var\\\"\"\n      fi\n    done\n\n    # This variable tells wrapper scripts just to set shlibpath_var\n    # rather than running their programs.\n    libtool_execute_magic=\"$magic\"\n\n    # Check if any of the arguments is a wrapper script.\n    args=\n    for file\n    do\n      case $file in\n      -*) ;;\n      *)\n\t# Do a test to see if this is really a libtool program.\n\tif func_ltwrapper_script_p \"$file\"; then\n\t  func_source \"$file\"\n\t  # Transform arg to wrapped name.\n\t  file=\"$progdir/$program\"\n\telif func_ltwrapper_executable_p \"$file\"; then\n\t  func_ltwrapper_scriptname \"$file\"\n\t  func_source \"$func_ltwrapper_scriptname_result\"\n\t  # Transform arg to wrapped name.\n\t  file=\"$progdir/$program\"\n\tfi\n\t;;\n      esac\n      # Quote arguments (to preserve shell metacharacters).\n      func_quote_for_eval \"$file\"\n      args=\"$args $func_quote_for_eval_result\"\n    done\n\n    if test \"X$opt_dry_run\" = Xfalse; then\n      if test -n \"$shlibpath_var\"; then\n\t# Export the shlibpath_var.\n\teval \"export $shlibpath_var\"\n      fi\n\n      # Restore saved environment variables\n      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES\n      do\n\teval \"if test \\\"\\${save_$lt_var+set}\\\" = set; then\n                $lt_var=\\$save_$lt_var; export $lt_var\n\t      else\n\t\t$lt_unset $lt_var\n\t      fi\"\n      done\n\n      # Now prepare to actually exec the command.\n      exec_cmd=\"\\$cmd$args\"\n    else\n      # Display what would be done.\n      if test -n \"$shlibpath_var\"; then\n\teval \"\\$ECHO \\\"\\$shlibpath_var=\\$$shlibpath_var\\\"\"\n\t$ECHO \"export $shlibpath_var\"\n      fi\n      $ECHO \"$cmd$args\"\n      exit $EXIT_SUCCESS\n    fi\n}\n\ntest \"$mode\" = execute && func_mode_execute ${1+\"$@\"}\n\n\n# func_mode_finish arg...\nfunc_mode_finish ()\n{\n    $opt_debug\n    libdirs=\"$nonopt\"\n    admincmds=\n\n    if test -n \"$finish_cmds$finish_eval\" && test -n \"$libdirs\"; then\n      for dir\n      do\n\tlibdirs=\"$libdirs $dir\"\n      done\n\n      for libdir in $libdirs; do\n\tif test -n \"$finish_cmds\"; then\n\t  # Do each command in the finish commands.\n\t  func_execute_cmds \"$finish_cmds\" 'admincmds=\"$admincmds\n'\"$cmd\"'\"'\n\tfi\n\tif test -n \"$finish_eval\"; then\n\t  # Do the single finish_eval.\n\t  eval cmds=\\\"$finish_eval\\\"\n\t  $opt_dry_run || eval \"$cmds\" || admincmds=\"$admincmds\n       $cmds\"\n\tfi\n      done\n    fi\n\n    # Exit here if they wanted silent mode.\n    $opt_silent && exit $EXIT_SUCCESS\n\n    $ECHO \"X----------------------------------------------------------------------\" | $Xsed\n    $ECHO \"Libraries have been installed in:\"\n    for libdir in $libdirs; do\n      $ECHO \"   $libdir\"\n    done\n    $ECHO\n    $ECHO \"If you ever happen to want to link against installed libraries\"\n    $ECHO \"in a given directory, LIBDIR, you must either use libtool, and\"\n    $ECHO \"specify the full pathname of the library, or use the \\`-LLIBDIR'\"\n    $ECHO \"flag during linking and do at least one of the following:\"\n    if test -n \"$shlibpath_var\"; then\n      $ECHO \"   - add LIBDIR to the \\`$shlibpath_var' environment variable\"\n      $ECHO \"     during execution\"\n    fi\n    if test -n \"$runpath_var\"; then\n      $ECHO \"   - add LIBDIR to the \\`$runpath_var' environment variable\"\n      $ECHO \"     during linking\"\n    fi\n    if test -n \"$hardcode_libdir_flag_spec\"; then\n      libdir=LIBDIR\n      eval flag=\\\"$hardcode_libdir_flag_spec\\\"\n\n      $ECHO \"   - use the \\`$flag' linker flag\"\n    fi\n    if test -n \"$admincmds\"; then\n      $ECHO \"   - have your system administrator run these commands:$admincmds\"\n    fi\n    if test -f /etc/ld.so.conf; then\n      $ECHO \"   - have your system administrator add LIBDIR to \\`/etc/ld.so.conf'\"\n    fi\n    $ECHO\n\n    $ECHO \"See any operating system documentation about shared libraries for\"\n    case $host in\n      solaris2.[6789]|solaris2.1[0-9])\n        $ECHO \"more information, such as the ld(1), crle(1) and ld.so(8) manual\"\n\t$ECHO \"pages.\"\n\t;;\n      *)\n        $ECHO \"more information, such as the ld(1) and ld.so(8) manual pages.\"\n        ;;\n    esac\n    $ECHO \"X----------------------------------------------------------------------\" | $Xsed\n    exit $EXIT_SUCCESS\n}\n\ntest \"$mode\" = finish && func_mode_finish ${1+\"$@\"}\n\n\n# func_mode_install arg...\nfunc_mode_install ()\n{\n    $opt_debug\n    # There may be an optional sh(1) argument at the beginning of\n    # install_prog (especially on Windows NT).\n    if test \"$nonopt\" = \"$SHELL\" || test \"$nonopt\" = /bin/sh ||\n       # Allow the use of GNU shtool's install command.\n       $ECHO \"X$nonopt\" | $GREP shtool >/dev/null; then\n      # Aesthetically quote it.\n      func_quote_for_eval \"$nonopt\"\n      install_prog=\"$func_quote_for_eval_result \"\n      arg=$1\n      shift\n    else\n      install_prog=\n      arg=$nonopt\n    fi\n\n    # The real first argument should be the name of the installation program.\n    # Aesthetically quote it.\n    func_quote_for_eval \"$arg\"\n    install_prog=\"$install_prog$func_quote_for_eval_result\"\n\n    # We need to accept at least all the BSD install flags.\n    dest=\n    files=\n    opts=\n    prev=\n    install_type=\n    isdir=no\n    stripme=\n    for arg\n    do\n      if test -n \"$dest\"; then\n\tfiles=\"$files $dest\"\n\tdest=$arg\n\tcontinue\n      fi\n\n      case $arg in\n      -d) isdir=yes ;;\n      -f)\n\tcase \" $install_prog \" in\n\t*[\\\\\\ /]cp\\ *) ;;\n\t*) prev=$arg ;;\n\tesac\n\t;;\n      -g | -m | -o)\n\tprev=$arg\n\t;;\n      -s)\n\tstripme=\" -s\"\n\tcontinue\n\t;;\n      -*)\n\t;;\n      *)\n\t# If the previous option needed an argument, then skip it.\n\tif test -n \"$prev\"; then\n\t  prev=\n\telse\n\t  dest=$arg\n\t  continue\n\tfi\n\t;;\n      esac\n\n      # Aesthetically quote the argument.\n      func_quote_for_eval \"$arg\"\n      install_prog=\"$install_prog $func_quote_for_eval_result\"\n    done\n\n    test -z \"$install_prog\" && \\\n      func_fatal_help \"you must specify an install program\"\n\n    test -n \"$prev\" && \\\n      func_fatal_help \"the \\`$prev' option requires an argument\"\n\n    if test -z \"$files\"; then\n      if test -z \"$dest\"; then\n\tfunc_fatal_help \"no file or destination specified\"\n      else\n\tfunc_fatal_help \"you must specify a destination\"\n      fi\n    fi\n\n    # Strip any trailing slash from the destination.\n    func_stripname '' '/' \"$dest\"\n    dest=$func_stripname_result\n\n    # Check to see that the destination is a directory.\n    test -d \"$dest\" && isdir=yes\n    if test \"$isdir\" = yes; then\n      destdir=\"$dest\"\n      destname=\n    else\n      func_dirname_and_basename \"$dest\" \"\" \".\"\n      destdir=\"$func_dirname_result\"\n      destname=\"$func_basename_result\"\n\n      # Not a directory, so check to see that there is only one file specified.\n      set dummy $files; shift\n      test \"$#\" -gt 1 && \\\n\tfunc_fatal_help \"\\`$dest' is not a directory\"\n    fi\n    case $destdir in\n    [\\\\/]* | [A-Za-z]:[\\\\/]*) ;;\n    *)\n      for file in $files; do\n\tcase $file in\n\t*.lo) ;;\n\t*)\n\t  func_fatal_help \"\\`$destdir' must be an absolute directory name\"\n\t  ;;\n\tesac\n      done\n      ;;\n    esac\n\n    # This variable tells wrapper scripts just to set variables rather\n    # than running their programs.\n    libtool_install_magic=\"$magic\"\n\n    staticlibs=\n    future_libdirs=\n    current_libdirs=\n    for file in $files; do\n\n      # Do each installation.\n      case $file in\n      *.$libext)\n\t# Do the static libraries later.\n\tstaticlibs=\"$staticlibs $file\"\n\t;;\n\n      *.la)\n\t# Check to see that this really is a libtool archive.\n\tfunc_lalib_unsafe_p \"$file\" \\\n\t  || func_fatal_help \"\\`$file' is not a valid libtool archive\"\n\n\tlibrary_names=\n\told_library=\n\trelink_command=\n\tfunc_source \"$file\"\n\n\t# Add the libdir to current_libdirs if it is the destination.\n\tif test \"X$destdir\" = \"X$libdir\"; then\n\t  case \"$current_libdirs \" in\n\t  *\" $libdir \"*) ;;\n\t  *) current_libdirs=\"$current_libdirs $libdir\" ;;\n\t  esac\n\telse\n\t  # Note the libdir as a future libdir.\n\t  case \"$future_libdirs \" in\n\t  *\" $libdir \"*) ;;\n\t  *) future_libdirs=\"$future_libdirs $libdir\" ;;\n\t  esac\n\tfi\n\n\tfunc_dirname \"$file\" \"/\" \"\"\n\tdir=\"$func_dirname_result\"\n\tdir=\"$dir$objdir\"\n\n\tif test -n \"$relink_command\"; then\n\t  # Determine the prefix the user has applied to our future dir.\n\t  inst_prefix_dir=`$ECHO \"X$destdir\" | $Xsed -e \"s%$libdir\\$%%\"`\n\n\t  # Don't allow the user to place us outside of our expected\n\t  # location b/c this prevents finding dependent libraries that\n\t  # are installed to the same prefix.\n\t  # At present, this check doesn't affect windows .dll's that\n\t  # are installed into $libdir/../bin (currently, that works fine)\n\t  # but it's something to keep an eye on.\n\t  test \"$inst_prefix_dir\" = \"$destdir\" && \\\n\t    func_fatal_error \"error: cannot install \\`$file' to a directory not ending in $libdir\"\n\n\t  if test -n \"$inst_prefix_dir\"; then\n\t    # Stick the inst_prefix_dir data into the link command.\n\t    relink_command=`$ECHO \"X$relink_command\" | $Xsed -e \"s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%\"`\n\t  else\n\t    relink_command=`$ECHO \"X$relink_command\" | $Xsed -e \"s%@inst_prefix_dir@%%\"`\n\t  fi\n\n\t  func_warning \"relinking \\`$file'\"\n\t  func_show_eval \"$relink_command\" \\\n\t    'func_fatal_error \"error: relink \\`$file'\\'' with the above command before installing it\"'\n\tfi\n\n\t# See the names of the shared library.\n\tset dummy $library_names; shift\n\tif test -n \"$1\"; then\n\t  realname=\"$1\"\n\t  shift\n\n\t  srcname=\"$realname\"\n\t  test -n \"$relink_command\" && srcname=\"$realname\"T\n\n\t  # Install the shared library and build the symlinks.\n\t  func_show_eval \"$install_prog $dir/$srcname $destdir/$realname\" \\\n\t      'exit $?'\n\t  tstripme=\"$stripme\"\n\t  case $host_os in\n\t  cygwin* | mingw* | pw32* | cegcc*)\n\t    case $realname in\n\t    *.dll.a)\n\t      tstripme=\"\"\n\t      ;;\n\t    esac\n\t    ;;\n\t  esac\n\t  if test -n \"$tstripme\" && test -n \"$striplib\"; then\n\t    func_show_eval \"$striplib $destdir/$realname\" 'exit $?'\n\t  fi\n\n\t  if test \"$#\" -gt 0; then\n\t    # Delete the old symlinks, and create new ones.\n\t    # Try `ln -sf' first, because the `ln' binary might depend on\n\t    # the symlink we replace!  Solaris /bin/ln does not understand -f,\n\t    # so we also need to try rm && ln -s.\n\t    for linkname\n\t    do\n\t      test \"$linkname\" != \"$realname\" \\\n\t\t&& func_show_eval \"(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })\"\n\t    done\n\t  fi\n\n\t  # Do each command in the postinstall commands.\n\t  lib=\"$destdir/$realname\"\n\t  func_execute_cmds \"$postinstall_cmds\" 'exit $?'\n\tfi\n\n\t# Install the pseudo-library for information purposes.\n\tfunc_basename \"$file\"\n\tname=\"$func_basename_result\"\n\tinstname=\"$dir/$name\"i\n\tfunc_show_eval \"$install_prog $instname $destdir/$name\" 'exit $?'\n\n\t# Maybe install the static library, too.\n\ttest -n \"$old_library\" && staticlibs=\"$staticlibs $dir/$old_library\"\n\t;;\n\n      *.lo)\n\t# Install (i.e. copy) a libtool object.\n\n\t# Figure out destination file name, if it wasn't already specified.\n\tif test -n \"$destname\"; then\n\t  destfile=\"$destdir/$destname\"\n\telse\n\t  func_basename \"$file\"\n\t  destfile=\"$func_basename_result\"\n\t  destfile=\"$destdir/$destfile\"\n\tfi\n\n\t# Deduce the name of the destination old-style object file.\n\tcase $destfile in\n\t*.lo)\n\t  func_lo2o \"$destfile\"\n\t  staticdest=$func_lo2o_result\n\t  ;;\n\t*.$objext)\n\t  staticdest=\"$destfile\"\n\t  destfile=\n\t  ;;\n\t*)\n\t  func_fatal_help \"cannot copy a libtool object to \\`$destfile'\"\n\t  ;;\n\tesac\n\n\t# Install the libtool object if requested.\n\ttest -n \"$destfile\" && \\\n\t  func_show_eval \"$install_prog $file $destfile\" 'exit $?'\n\n\t# Install the old object if enabled.\n\tif test \"$build_old_libs\" = yes; then\n\t  # Deduce the name of the old-style object file.\n\t  func_lo2o \"$file\"\n\t  staticobj=$func_lo2o_result\n\t  func_show_eval \"$install_prog \\$staticobj \\$staticdest\" 'exit $?'\n\tfi\n\texit $EXIT_SUCCESS\n\t;;\n\n      *)\n\t# Figure out destination file name, if it wasn't already specified.\n\tif test -n \"$destname\"; then\n\t  destfile=\"$destdir/$destname\"\n\telse\n\t  func_basename \"$file\"\n\t  destfile=\"$func_basename_result\"\n\t  destfile=\"$destdir/$destfile\"\n\tfi\n\n\t# If the file is missing, and there is a .exe on the end, strip it\n\t# because it is most likely a libtool script we actually want to\n\t# install\n\tstripped_ext=\"\"\n\tcase $file in\n\t  *.exe)\n\t    if test ! -f \"$file\"; then\n\t      func_stripname '' '.exe' \"$file\"\n\t      file=$func_stripname_result\n\t      stripped_ext=\".exe\"\n\t    fi\n\t    ;;\n\tesac\n\n\t# Do a test to see if this is really a libtool program.\n\tcase $host in\n\t*cygwin* | *mingw*)\n\t    if func_ltwrapper_executable_p \"$file\"; then\n\t      func_ltwrapper_scriptname \"$file\"\n\t      wrapper=$func_ltwrapper_scriptname_result\n\t    else\n\t      func_stripname '' '.exe' \"$file\"\n\t      wrapper=$func_stripname_result\n\t    fi\n\t    ;;\n\t*)\n\t    wrapper=$file\n\t    ;;\n\tesac\n\tif func_ltwrapper_script_p \"$wrapper\"; then\n\t  notinst_deplibs=\n\t  relink_command=\n\n\t  func_source \"$wrapper\"\n\n\t  # Check the variables that should have been set.\n\t  test -z \"$generated_by_libtool_version\" && \\\n\t    func_fatal_error \"invalid libtool wrapper script \\`$wrapper'\"\n\n\t  finalize=yes\n\t  for lib in $notinst_deplibs; do\n\t    # Check to see that each library is installed.\n\t    libdir=\n\t    if test -f \"$lib\"; then\n\t      func_source \"$lib\"\n\t    fi\n\t    libfile=\"$libdir/\"`$ECHO \"X$lib\" | $Xsed -e 's%^.*/%%g'` ### testsuite: skip nested quoting test\n\t    if test -n \"$libdir\" && test ! -f \"$libfile\"; then\n\t      func_warning \"\\`$lib' has not been installed in \\`$libdir'\"\n\t      finalize=no\n\t    fi\n\t  done\n\n\t  relink_command=\n\t  func_source \"$wrapper\"\n\n\t  outputname=\n\t  if test \"$fast_install\" = no && test -n \"$relink_command\"; then\n\t    $opt_dry_run || {\n\t      if test \"$finalize\" = yes; then\n\t        tmpdir=`func_mktempdir`\n\t\tfunc_basename \"$file$stripped_ext\"\n\t\tfile=\"$func_basename_result\"\n\t        outputname=\"$tmpdir/$file\"\n\t        # Replace the output file specification.\n\t        relink_command=`$ECHO \"X$relink_command\" | $Xsed -e 's%@OUTPUT@%'\"$outputname\"'%g'`\n\n\t        $opt_silent || {\n\t          func_quote_for_expand \"$relink_command\"\n\t\t  eval \"func_echo $func_quote_for_expand_result\"\n\t        }\n\t        if eval \"$relink_command\"; then :\n\t          else\n\t\t  func_error \"error: relink \\`$file' with the above command before installing it\"\n\t\t  $opt_dry_run || ${RM}r \"$tmpdir\"\n\t\t  continue\n\t        fi\n\t        file=\"$outputname\"\n\t      else\n\t        func_warning \"cannot relink \\`$file'\"\n\t      fi\n\t    }\n\t  else\n\t    # Install the binary that we compiled earlier.\n\t    file=`$ECHO \"X$file$stripped_ext\" | $Xsed -e \"s%\\([^/]*\\)$%$objdir/\\1%\"`\n\t  fi\n\tfi\n\n\t# remove .exe since cygwin /usr/bin/install will append another\n\t# one anyway\n\tcase $install_prog,$host in\n\t*/usr/bin/install*,*cygwin*)\n\t  case $file:$destfile in\n\t  *.exe:*.exe)\n\t    # this is ok\n\t    ;;\n\t  *.exe:*)\n\t    destfile=$destfile.exe\n\t    ;;\n\t  *:*.exe)\n\t    func_stripname '' '.exe' \"$destfile\"\n\t    destfile=$func_stripname_result\n\t    ;;\n\t  esac\n\t  ;;\n\tesac\n\tfunc_show_eval \"$install_prog\\$stripme \\$file \\$destfile\" 'exit $?'\n\t$opt_dry_run || if test -n \"$outputname\"; then\n\t  ${RM}r \"$tmpdir\"\n\tfi\n\t;;\n      esac\n    done\n\n    for file in $staticlibs; do\n      func_basename \"$file\"\n      name=\"$func_basename_result\"\n\n      # Set up the ranlib parameters.\n      oldlib=\"$destdir/$name\"\n\n      func_show_eval \"$install_prog \\$file \\$oldlib\" 'exit $?'\n\n      if test -n \"$stripme\" && test -n \"$old_striplib\"; then\n\tfunc_show_eval \"$old_striplib $oldlib\" 'exit $?'\n      fi\n\n      # Do each command in the postinstall commands.\n      func_execute_cmds \"$old_postinstall_cmds\" 'exit $?'\n    done\n\n    test -n \"$future_libdirs\" && \\\n      func_warning \"remember to run \\`$progname --finish$future_libdirs'\"\n\n    if test -n \"$current_libdirs\"; then\n      # Maybe just do a dry run.\n      $opt_dry_run && current_libdirs=\" -n$current_libdirs\"\n      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'\n    else\n      exit $EXIT_SUCCESS\n    fi\n}\n\ntest \"$mode\" = install && func_mode_install ${1+\"$@\"}\n\n\n# func_generate_dlsyms outputname originator pic_p\n# Extract symbols from dlprefiles and create ${outputname}S.o with\n# a dlpreopen symbol table.\nfunc_generate_dlsyms ()\n{\n    $opt_debug\n    my_outputname=\"$1\"\n    my_originator=\"$2\"\n    my_pic_p=\"${3-no}\"\n    my_prefix=`$ECHO \"$my_originator\" | sed 's%[^a-zA-Z0-9]%_%g'`\n    my_dlsyms=\n\n    if test -n \"$dlfiles$dlprefiles\" || test \"$dlself\" != no; then\n      if test -n \"$NM\" && test -n \"$global_symbol_pipe\"; then\n\tmy_dlsyms=\"${my_outputname}S.c\"\n      else\n\tfunc_error \"not configured to extract global symbols from dlpreopened files\"\n      fi\n    fi\n\n    if test -n \"$my_dlsyms\"; then\n      case $my_dlsyms in\n      \"\") ;;\n      *.c)\n\t# Discover the nlist of each of the dlfiles.\n\tnlist=\"$output_objdir/${my_outputname}.nm\"\n\n\tfunc_show_eval \"$RM $nlist ${nlist}S ${nlist}T\"\n\n\t# Parse the name list into a source file.\n\tfunc_verbose \"creating $output_objdir/$my_dlsyms\"\n\n\t$opt_dry_run || $ECHO > \"$output_objdir/$my_dlsyms\" \"\\\n/* $my_dlsyms - symbol resolution table for \\`$my_outputname' dlsym emulation. */\n/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */\n\n#ifdef __cplusplus\nextern \\\"C\\\" {\n#endif\n\n/* External symbol declarations for the compiler. */\\\n\"\n\n\tif test \"$dlself\" = yes; then\n\t  func_verbose \"generating symbol list for \\`$output'\"\n\n\t  $opt_dry_run || echo ': @PROGRAM@ ' > \"$nlist\"\n\n\t  # Add our own program objects to the symbol list.\n\t  progfiles=`$ECHO \"X$objs$old_deplibs\" | $SP2NL | $Xsed -e \"$lo2o\" | $NL2SP`\n\t  for progfile in $progfiles; do\n\t    func_verbose \"extracting global C symbols from \\`$progfile'\"\n\t    $opt_dry_run || eval \"$NM $progfile | $global_symbol_pipe >> '$nlist'\"\n\t  done\n\n\t  if test -n \"$exclude_expsyms\"; then\n\t    $opt_dry_run || {\n\t      eval '$EGREP -v \" ($exclude_expsyms)$\" \"$nlist\" > \"$nlist\"T'\n\t      eval '$MV \"$nlist\"T \"$nlist\"'\n\t    }\n\t  fi\n\n\t  if test -n \"$export_symbols_regex\"; then\n\t    $opt_dry_run || {\n\t      eval '$EGREP -e \"$export_symbols_regex\" \"$nlist\" > \"$nlist\"T'\n\t      eval '$MV \"$nlist\"T \"$nlist\"'\n\t    }\n\t  fi\n\n\t  # Prepare the list of exported symbols\n\t  if test -z \"$export_symbols\"; then\n\t    export_symbols=\"$output_objdir/$outputname.exp\"\n\t    $opt_dry_run || {\n\t      $RM $export_symbols\n\t      eval \"${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \\(.*\\)$/\\1/p' \"'< \"$nlist\" > \"$export_symbols\"'\n\t      case $host in\n\t      *cygwin* | *mingw* | *cegcc* )\n                eval \"echo EXPORTS \"'> \"$output_objdir/$outputname.def\"'\n                eval 'cat \"$export_symbols\" >> \"$output_objdir/$outputname.def\"'\n\t        ;;\n\t      esac\n\t    }\n\t  else\n\t    $opt_dry_run || {\n\t      eval \"${SED} -e 's/\\([].[*^$]\\)/\\\\\\\\\\1/g' -e 's/^/ /' -e 's/$/$/'\"' < \"$export_symbols\" > \"$output_objdir/$outputname.exp\"'\n\t      eval '$GREP -f \"$output_objdir/$outputname.exp\" < \"$nlist\" > \"$nlist\"T'\n\t      eval '$MV \"$nlist\"T \"$nlist\"'\n\t      case $host in\n\t        *cygwin | *mingw* | *cegcc* )\n\t          eval \"echo EXPORTS \"'> \"$output_objdir/$outputname.def\"'\n\t          eval 'cat \"$nlist\" >> \"$output_objdir/$outputname.def\"'\n\t          ;;\n\t      esac\n\t    }\n\t  fi\n\tfi\n\n\tfor dlprefile in $dlprefiles; do\n\t  func_verbose \"extracting global C symbols from \\`$dlprefile'\"\n\t  func_basename \"$dlprefile\"\n\t  name=\"$func_basename_result\"\n\t  $opt_dry_run || {\n\t    eval '$ECHO \": $name \" >> \"$nlist\"'\n\t    eval \"$NM $dlprefile 2>/dev/null | $global_symbol_pipe >> '$nlist'\"\n\t  }\n\tdone\n\n\t$opt_dry_run || {\n\t  # Make sure we have at least an empty file.\n\t  test -f \"$nlist\" || : > \"$nlist\"\n\n\t  if test -n \"$exclude_expsyms\"; then\n\t    $EGREP -v \" ($exclude_expsyms)$\" \"$nlist\" > \"$nlist\"T\n\t    $MV \"$nlist\"T \"$nlist\"\n\t  fi\n\n\t  # Try sorting and uniquifying the output.\n\t  if $GREP -v \"^: \" < \"$nlist\" |\n\t      if sort -k 3 </dev/null >/dev/null 2>&1; then\n\t\tsort -k 3\n\t      else\n\t\tsort +2\n\t      fi |\n\t      uniq > \"$nlist\"S; then\n\t    :\n\t  else\n\t    $GREP -v \"^: \" < \"$nlist\" > \"$nlist\"S\n\t  fi\n\n\t  if test -f \"$nlist\"S; then\n\t    eval \"$global_symbol_to_cdecl\"' < \"$nlist\"S >> \"$output_objdir/$my_dlsyms\"'\n\t  else\n\t    $ECHO '/* NONE */' >> \"$output_objdir/$my_dlsyms\"\n\t  fi\n\n\t  $ECHO >> \"$output_objdir/$my_dlsyms\" \"\\\n\n/* The mapping between symbol names and symbols.  */\ntypedef struct {\n  const char *name;\n  void *address;\n} lt_dlsymlist;\n\"\n\t  case $host in\n\t  *cygwin* | *mingw* | *cegcc* )\n\t    $ECHO >> \"$output_objdir/$my_dlsyms\" \"\\\n/* DATA imports from DLLs on WIN32 con't be const, because\n   runtime relocations are performed -- see ld's documentation\n   on pseudo-relocs.  */\"\n\t    lt_dlsym_const= ;;\n\t  *osf5*)\n\t    echo >> \"$output_objdir/$my_dlsyms\" \"\\\n/* This system does not cope well with relocations in const data */\"\n\t    lt_dlsym_const= ;;\n\t  *)\n\t    lt_dlsym_const=const ;;\n\t  esac\n\n\t  $ECHO >> \"$output_objdir/$my_dlsyms\" \"\\\nextern $lt_dlsym_const lt_dlsymlist\nlt_${my_prefix}_LTX_preloaded_symbols[];\n$lt_dlsym_const lt_dlsymlist\nlt_${my_prefix}_LTX_preloaded_symbols[] =\n{\\\n  { \\\"$my_originator\\\", (void *) 0 },\"\n\n\t  case $need_lib_prefix in\n\t  no)\n\t    eval \"$global_symbol_to_c_name_address\" < \"$nlist\" >> \"$output_objdir/$my_dlsyms\"\n\t    ;;\n\t  *)\n\t    eval \"$global_symbol_to_c_name_address_lib_prefix\" < \"$nlist\" >> \"$output_objdir/$my_dlsyms\"\n\t    ;;\n\t  esac\n\t  $ECHO >> \"$output_objdir/$my_dlsyms\" \"\\\n  {0, (void *) 0}\n};\n\n/* This works around a problem in FreeBSD linker */\n#ifdef FREEBSD_WORKAROUND\nstatic const void *lt_preloaded_setup() {\n  return lt_${my_prefix}_LTX_preloaded_symbols;\n}\n#endif\n\n#ifdef __cplusplus\n}\n#endif\\\n\"\n\t} # !$opt_dry_run\n\n\tpic_flag_for_symtable=\n\tcase \"$compile_command \" in\n\t*\" -static \"*) ;;\n\t*)\n\t  case $host in\n\t  # compiling the symbol table file with pic_flag works around\n\t  # a FreeBSD bug that causes programs to crash when -lm is\n\t  # linked before any other PIC object.  But we must not use\n\t  # pic_flag when linking with -static.  The problem exists in\n\t  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.\n\t  *-*-freebsd2*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)\n\t    pic_flag_for_symtable=\" $pic_flag -DFREEBSD_WORKAROUND\" ;;\n\t  *-*-hpux*)\n\t    pic_flag_for_symtable=\" $pic_flag\"  ;;\n\t  *)\n\t    if test \"X$my_pic_p\" != Xno; then\n\t      pic_flag_for_symtable=\" $pic_flag\"\n\t    fi\n\t    ;;\n\t  esac\n\t  ;;\n\tesac\n\tsymtab_cflags=\n\tfor arg in $LTCFLAGS; do\n\t  case $arg in\n\t  -pie | -fpie | -fPIE) ;;\n\t  *) symtab_cflags=\"$symtab_cflags $arg\" ;;\n\t  esac\n\tdone\n\n\t# Now compile the dynamic symbol file.\n\tfunc_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable \"$my_dlsyms\")' 'exit $?'\n\n\t# Clean up the generated files.\n\tfunc_show_eval '$RM \"$output_objdir/$my_dlsyms\" \"$nlist\" \"${nlist}S\" \"${nlist}T\"'\n\n\t# Transform the symbol file into the correct name.\n\tsymfileobj=\"$output_objdir/${my_outputname}S.$objext\"\n\tcase $host in\n\t*cygwin* | *mingw* | *cegcc* )\n\t  if test -f \"$output_objdir/$my_outputname.def\"; then\n\t    compile_command=`$ECHO \"X$compile_command\" | $Xsed -e \"s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%\"`\n\t    finalize_command=`$ECHO \"X$finalize_command\" | $Xsed -e \"s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%\"`\n\t  else\n\t    compile_command=`$ECHO \"X$compile_command\" | $Xsed -e \"s%@SYMFILE@%$symfileobj%\"`\n\t    finalize_command=`$ECHO \"X$finalize_command\" | $Xsed -e \"s%@SYMFILE@%$symfileobj%\"`\n\t  fi\n\t  ;;\n\t*)\n\t  compile_command=`$ECHO \"X$compile_command\" | $Xsed -e \"s%@SYMFILE@%$symfileobj%\"`\n\t  finalize_command=`$ECHO \"X$finalize_command\" | $Xsed -e \"s%@SYMFILE@%$symfileobj%\"`\n\t  ;;\n\tesac\n\t;;\n      *)\n\tfunc_fatal_error \"unknown suffix for \\`$my_dlsyms'\"\n\t;;\n      esac\n    else\n      # We keep going just in case the user didn't refer to\n      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe\n      # really was required.\n\n      # Nullify the symbol file.\n      compile_command=`$ECHO \"X$compile_command\" | $Xsed -e \"s% @SYMFILE@%%\"`\n      finalize_command=`$ECHO \"X$finalize_command\" | $Xsed -e \"s% @SYMFILE@%%\"`\n    fi\n}\n\n# func_win32_libid arg\n# return the library type of file 'arg'\n#\n# Need a lot of goo to handle *both* DLLs and import libs\n# Has to be a shell function in order to 'eat' the argument\n# that is supplied when $file_magic_command is called.\nfunc_win32_libid ()\n{\n  $opt_debug\n  win32_libid_type=\"unknown\"\n  win32_fileres=`file -L $1 2>/dev/null`\n  case $win32_fileres in\n  *ar\\ archive\\ import\\ library*) # definitely import\n    win32_libid_type=\"x86 archive import\"\n    ;;\n  *ar\\ archive*) # could be an import, or static\n    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |\n       $EGREP 'file format pe-i386(.*architecture: i386)?' >/dev/null ; then\n      win32_nmres=`eval $NM -f posix -A $1 |\n\t$SED -n -e '\n\t    1,100{\n\t\t/ I /{\n\t\t    s,.*,import,\n\t\t    p\n\t\t    q\n\t\t}\n\t    }'`\n      case $win32_nmres in\n      import*)  win32_libid_type=\"x86 archive import\";;\n      *)        win32_libid_type=\"x86 archive static\";;\n      esac\n    fi\n    ;;\n  *DLL*)\n    win32_libid_type=\"x86 DLL\"\n    ;;\n  *executable*) # but shell scripts are \"executable\" too...\n    case $win32_fileres in\n    *MS\\ Windows\\ PE\\ Intel*)\n      win32_libid_type=\"x86 DLL\"\n      ;;\n    esac\n    ;;\n  esac\n  $ECHO \"$win32_libid_type\"\n}\n\n\n\n# func_extract_an_archive dir oldlib\nfunc_extract_an_archive ()\n{\n    $opt_debug\n    f_ex_an_ar_dir=\"$1\"; shift\n    f_ex_an_ar_oldlib=\"$1\"\n    func_show_eval \"(cd \\$f_ex_an_ar_dir && $AR x \\\"\\$f_ex_an_ar_oldlib\\\")\" 'exit $?'\n    if ($AR t \"$f_ex_an_ar_oldlib\" | sort | sort -uc >/dev/null 2>&1); then\n     :\n    else\n      func_fatal_error \"object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib\"\n    fi\n}\n\n\n# func_extract_archives gentop oldlib ...\nfunc_extract_archives ()\n{\n    $opt_debug\n    my_gentop=\"$1\"; shift\n    my_oldlibs=${1+\"$@\"}\n    my_oldobjs=\"\"\n    my_xlib=\"\"\n    my_xabs=\"\"\n    my_xdir=\"\"\n\n    for my_xlib in $my_oldlibs; do\n      # Extract the objects.\n      case $my_xlib in\n\t[\\\\/]* | [A-Za-z]:[\\\\/]*) my_xabs=\"$my_xlib\" ;;\n\t*) my_xabs=`pwd`\"/$my_xlib\" ;;\n      esac\n      func_basename \"$my_xlib\"\n      my_xlib=\"$func_basename_result\"\n      my_xlib_u=$my_xlib\n      while :; do\n        case \" $extracted_archives \" in\n\t*\" $my_xlib_u \"*)\n\t  func_arith $extracted_serial + 1\n\t  extracted_serial=$func_arith_result\n\t  my_xlib_u=lt$extracted_serial-$my_xlib ;;\n\t*) break ;;\n\tesac\n      done\n      extracted_archives=\"$extracted_archives $my_xlib_u\"\n      my_xdir=\"$my_gentop/$my_xlib_u\"\n\n      func_mkdir_p \"$my_xdir\"\n\n      case $host in\n      *-darwin*)\n\tfunc_verbose \"Extracting $my_xabs\"\n\t# Do not bother doing anything if just a dry run\n\t$opt_dry_run || {\n\t  darwin_orig_dir=`pwd`\n\t  cd $my_xdir || exit $?\n\t  darwin_archive=$my_xabs\n\t  darwin_curdir=`pwd`\n\t  darwin_base_archive=`basename \"$darwin_archive\"`\n\t  darwin_arches=`$LIPO -info \"$darwin_archive\" 2>/dev/null | $GREP Architectures 2>/dev/null || true`\n\t  if test -n \"$darwin_arches\"; then\n\t    darwin_arches=`$ECHO \"$darwin_arches\" | $SED -e 's/.*are://'`\n\t    darwin_arch=\n\t    func_verbose \"$darwin_base_archive has multiple architectures $darwin_arches\"\n\t    for darwin_arch in  $darwin_arches ; do\n\t      func_mkdir_p \"unfat-$$/${darwin_base_archive}-${darwin_arch}\"\n\t      $LIPO -thin $darwin_arch -output \"unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}\" \"${darwin_archive}\"\n\t      cd \"unfat-$$/${darwin_base_archive}-${darwin_arch}\"\n\t      func_extract_an_archive \"`pwd`\" \"${darwin_base_archive}\"\n\t      cd \"$darwin_curdir\"\n\t      $RM \"unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}\"\n\t    done # $darwin_arches\n            ## Okay now we've a bunch of thin objects, gotta fatten them up :)\n\t    darwin_filelist=`find unfat-$$ -type f -name \\*.o -print -o -name \\*.lo -print | $SED -e \"$basename\" | sort -u`\n\t    darwin_file=\n\t    darwin_files=\n\t    for darwin_file in $darwin_filelist; do\n\t      darwin_files=`find unfat-$$ -name $darwin_file -print | $NL2SP`\n\t      $LIPO -create -output \"$darwin_file\" $darwin_files\n\t    done # $darwin_filelist\n\t    $RM -rf unfat-$$\n\t    cd \"$darwin_orig_dir\"\n\t  else\n\t    cd $darwin_orig_dir\n\t    func_extract_an_archive \"$my_xdir\" \"$my_xabs\"\n\t  fi # $darwin_arches\n\t} # !$opt_dry_run\n\t;;\n      *)\n        func_extract_an_archive \"$my_xdir\" \"$my_xabs\"\n\t;;\n      esac\n      my_oldobjs=\"$my_oldobjs \"`find $my_xdir -name \\*.$objext -print -o -name \\*.lo -print | $NL2SP`\n    done\n\n    func_extract_archives_result=\"$my_oldobjs\"\n}\n\n\n\n# func_emit_wrapper_part1 [arg=no]\n#\n# Emit the first part of a libtool wrapper script on stdout.\n# For more information, see the description associated with\n# func_emit_wrapper(), below.\nfunc_emit_wrapper_part1 ()\n{\n\tfunc_emit_wrapper_part1_arg1=no\n\tif test -n \"$1\" ; then\n\t  func_emit_wrapper_part1_arg1=$1\n\tfi\n\n\t$ECHO \"\\\n#! $SHELL\n\n# $output - temporary wrapper script for $objdir/$outputname\n# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION\n#\n# The $output program cannot be directly executed until all the libtool\n# libraries that it depends on are installed.\n#\n# This wrapper script should never be moved out of the build directory.\n# If it is, it will not operate correctly.\n\n# Sed substitution that helps us do robust quoting.  It backslashifies\n# metacharacters that are still active within double-quoted strings.\nXsed='${SED} -e 1s/^X//'\nsed_quote_subst='$sed_quote_subst'\n\n# Be Bourne compatible\nif test -n \\\"\\${ZSH_VERSION+set}\\\" && (emulate sh) >/dev/null 2>&1; then\n  emulate sh\n  NULLCMD=:\n  # Zsh 3.x and 4.x performs word splitting on \\${1+\\\"\\$@\\\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '\\${1+\\\"\\$@\\\"}'='\\\"\\$@\\\"'\n  setopt NO_GLOB_SUBST\nelse\n  case \\`(set -o) 2>/dev/null\\` in *posix*) set -o posix;; esac\nfi\nBIN_SH=xpg4; export BIN_SH # for Tru64\nDUALCASE=1; export DUALCASE # for MKS sh\n\n# The HP-UX ksh and POSIX shell print the target directory to stdout\n# if CDPATH is set.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\nrelink_command=\\\"$relink_command\\\"\n\n# This environment variable determines our operation mode.\nif test \\\"\\$libtool_install_magic\\\" = \\\"$magic\\\"; then\n  # install mode needs the following variables:\n  generated_by_libtool_version='$macro_version'\n  notinst_deplibs='$notinst_deplibs'\nelse\n  # When we are sourced in execute mode, \\$file and \\$ECHO are already set.\n  if test \\\"\\$libtool_execute_magic\\\" != \\\"$magic\\\"; then\n    ECHO=\\\"$qecho\\\"\n    file=\\\"\\$0\\\"\n    # Make sure echo works.\n    if test \\\"X\\$1\\\" = X--no-reexec; then\n      # Discard the --no-reexec flag, and continue.\n      shift\n    elif test \\\"X\\`{ \\$ECHO '\\t'; } 2>/dev/null\\`\\\" = 'X\\t'; then\n      # Yippee, \\$ECHO works!\n      :\n    else\n      # Restart under the correct shell, and then maybe \\$ECHO will work.\n      exec $SHELL \\\"\\$0\\\" --no-reexec \\${1+\\\"\\$@\\\"}\n    fi\n  fi\\\n\"\n\t$ECHO \"\\\n\n  # Find the directory that this script lives in.\n  thisdir=\\`\\$ECHO \\\"X\\$file\\\" | \\$Xsed -e 's%/[^/]*$%%'\\`\n  test \\\"x\\$thisdir\\\" = \\\"x\\$file\\\" && thisdir=.\n\n  # Follow symbolic links until we get to the real thisdir.\n  file=\\`ls -ld \\\"\\$file\\\" | ${SED} -n 's/.*-> //p'\\`\n  while test -n \\\"\\$file\\\"; do\n    destdir=\\`\\$ECHO \\\"X\\$file\\\" | \\$Xsed -e 's%/[^/]*\\$%%'\\`\n\n    # If there was a directory component, then change thisdir.\n    if test \\\"x\\$destdir\\\" != \\\"x\\$file\\\"; then\n      case \\\"\\$destdir\\\" in\n      [\\\\\\\\/]* | [A-Za-z]:[\\\\\\\\/]*) thisdir=\\\"\\$destdir\\\" ;;\n      *) thisdir=\\\"\\$thisdir/\\$destdir\\\" ;;\n      esac\n    fi\n\n    file=\\`\\$ECHO \\\"X\\$file\\\" | \\$Xsed -e 's%^.*/%%'\\`\n    file=\\`ls -ld \\\"\\$thisdir/\\$file\\\" | ${SED} -n 's/.*-> //p'\\`\n  done\n\"\n}\n# end: func_emit_wrapper_part1\n\n# func_emit_wrapper_part2 [arg=no]\n#\n# Emit the second part of a libtool wrapper script on stdout.\n# For more information, see the description associated with\n# func_emit_wrapper(), below.\nfunc_emit_wrapper_part2 ()\n{\n\tfunc_emit_wrapper_part2_arg1=no\n\tif test -n \"$1\" ; then\n\t  func_emit_wrapper_part2_arg1=$1\n\tfi\n\n\t$ECHO \"\\\n\n  # Usually 'no', except on cygwin/mingw when embedded into\n  # the cwrapper.\n  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_part2_arg1\n  if test \\\"\\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\\\" = \\\"yes\\\"; then\n    # special case for '.'\n    if test \\\"\\$thisdir\\\" = \\\".\\\"; then\n      thisdir=\\`pwd\\`\n    fi\n    # remove .libs from thisdir\n    case \\\"\\$thisdir\\\" in\n    *[\\\\\\\\/]$objdir ) thisdir=\\`\\$ECHO \\\"X\\$thisdir\\\" | \\$Xsed -e 's%[\\\\\\\\/][^\\\\\\\\/]*$%%'\\` ;;\n    $objdir )   thisdir=. ;;\n    esac\n  fi\n\n  # Try to get the absolute directory name.\n  absdir=\\`cd \\\"\\$thisdir\\\" && pwd\\`\n  test -n \\\"\\$absdir\\\" && thisdir=\\\"\\$absdir\\\"\n\"\n\n\tif test \"$fast_install\" = yes; then\n\t  $ECHO \"\\\n  program=lt-'$outputname'$exeext\n  progdir=\\\"\\$thisdir/$objdir\\\"\n\n  if test ! -f \\\"\\$progdir/\\$program\\\" ||\n     { file=\\`ls -1dt \\\"\\$progdir/\\$program\\\" \\\"\\$progdir/../\\$program\\\" 2>/dev/null | ${SED} 1q\\`; \\\\\n       test \\\"X\\$file\\\" != \\\"X\\$progdir/\\$program\\\"; }; then\n\n    file=\\\"\\$\\$-\\$program\\\"\n\n    if test ! -d \\\"\\$progdir\\\"; then\n      $MKDIR \\\"\\$progdir\\\"\n    else\n      $RM \\\"\\$progdir/\\$file\\\"\n    fi\"\n\n\t  $ECHO \"\\\n\n    # relink executable if necessary\n    if test -n \\\"\\$relink_command\\\"; then\n      if relink_command_output=\\`eval \\$relink_command 2>&1\\`; then :\n      else\n\t$ECHO \\\"\\$relink_command_output\\\" >&2\n\t$RM \\\"\\$progdir/\\$file\\\"\n\texit 1\n      fi\n    fi\n\n    $MV \\\"\\$progdir/\\$file\\\" \\\"\\$progdir/\\$program\\\" 2>/dev/null ||\n    { $RM \\\"\\$progdir/\\$program\\\";\n      $MV \\\"\\$progdir/\\$file\\\" \\\"\\$progdir/\\$program\\\"; }\n    $RM \\\"\\$progdir/\\$file\\\"\n  fi\"\n\telse\n\t  $ECHO \"\\\n  program='$outputname'\n  progdir=\\\"\\$thisdir/$objdir\\\"\n\"\n\tfi\n\n\t$ECHO \"\\\n\n  if test -f \\\"\\$progdir/\\$program\\\"; then\"\n\n\t# Export our shlibpath_var if we have one.\n\tif test \"$shlibpath_overrides_runpath\" = yes && test -n \"$shlibpath_var\" && test -n \"$temp_rpath\"; then\n\t  $ECHO \"\\\n    # Add our own library path to $shlibpath_var\n    $shlibpath_var=\\\"$temp_rpath\\$$shlibpath_var\\\"\n\n    # Some systems cannot cope with colon-terminated $shlibpath_var\n    # The second colon is a workaround for a bug in BeOS R4 sed\n    $shlibpath_var=\\`\\$ECHO \\\"X\\$$shlibpath_var\\\" | \\$Xsed -e 's/::*\\$//'\\`\n\n    export $shlibpath_var\n\"\n\tfi\n\n\t# fixup the dll searchpath if we need to.\n\tif test -n \"$dllsearchpath\"; then\n\t  $ECHO \"\\\n    # Add the dll search path components to the executable PATH\n    PATH=$dllsearchpath:\\$PATH\n\"\n\tfi\n\n\t$ECHO \"\\\n    if test \\\"\\$libtool_execute_magic\\\" != \\\"$magic\\\"; then\n      # Run the actual program with our arguments.\n\"\n\tcase $host in\n\t# Backslashes separate directories on plain windows\n\t*-*-mingw | *-*-os2* | *-cegcc*)\n\t  $ECHO \"\\\n      exec \\\"\\$progdir\\\\\\\\\\$program\\\" \\${1+\\\"\\$@\\\"}\n\"\n\t  ;;\n\n\t*)\n\t  $ECHO \"\\\n      exec \\\"\\$progdir/\\$program\\\" \\${1+\\\"\\$@\\\"}\n\"\n\t  ;;\n\tesac\n\t$ECHO \"\\\n      \\$ECHO \\\"\\$0: cannot exec \\$program \\$*\\\" 1>&2\n      exit 1\n    fi\n  else\n    # The program doesn't exist.\n    \\$ECHO \\\"\\$0: error: \\\\\\`\\$progdir/\\$program' does not exist\\\" 1>&2\n    \\$ECHO \\\"This script is just a wrapper for \\$program.\\\" 1>&2\n    $ECHO \\\"See the $PACKAGE documentation for more information.\\\" 1>&2\n    exit 1\n  fi\nfi\\\n\"\n}\n# end: func_emit_wrapper_part2\n\n\n# func_emit_wrapper [arg=no]\n#\n# Emit a libtool wrapper script on stdout.\n# Don't directly open a file because we may want to\n# incorporate the script contents within a cygwin/mingw\n# wrapper executable.  Must ONLY be called from within\n# func_mode_link because it depends on a number of variables\n# set therein.\n#\n# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\n# variable will take.  If 'yes', then the emitted script\n# will assume that the directory in which it is stored is\n# the $objdir directory.  This is a cygwin/mingw-specific\n# behavior.\nfunc_emit_wrapper ()\n{\n\tfunc_emit_wrapper_arg1=no\n\tif test -n \"$1\" ; then\n\t  func_emit_wrapper_arg1=$1\n\tfi\n\n\t# split this up so that func_emit_cwrapperexe_src\n\t# can call each part independently.\n\tfunc_emit_wrapper_part1 \"${func_emit_wrapper_arg1}\"\n\tfunc_emit_wrapper_part2 \"${func_emit_wrapper_arg1}\"\n}\n\n\n# func_to_host_path arg\n#\n# Convert paths to host format when used with build tools.\n# Intended for use with \"native\" mingw (where libtool itself\n# is running under the msys shell), or in the following cross-\n# build environments:\n#    $build          $host\n#    mingw (msys)    mingw  [e.g. native]\n#    cygwin          mingw\n#    *nix + wine     mingw\n# where wine is equipped with the `winepath' executable.\n# In the native mingw case, the (msys) shell automatically\n# converts paths for any non-msys applications it launches,\n# but that facility isn't available from inside the cwrapper.\n# Similar accommodations are necessary for $host mingw and\n# $build cygwin.  Calling this function does no harm for other\n# $host/$build combinations not listed above.\n#\n# ARG is the path (on $build) that should be converted to\n# the proper representation for $host. The result is stored\n# in $func_to_host_path_result.\nfunc_to_host_path ()\n{\n  func_to_host_path_result=\"$1\"\n  if test -n \"$1\" ; then\n    case $host in\n      *mingw* )\n        lt_sed_naive_backslashify='s|\\\\\\\\*|\\\\|g;s|/|\\\\|g;s|\\\\|\\\\\\\\|g'\n        case $build in\n          *mingw* ) # actually, msys\n            # awkward: cmd appends spaces to result\n            lt_sed_strip_trailing_spaces=\"s/[ ]*\\$//\"\n            func_to_host_path_tmp1=`( cmd //c echo \"$1\" |\\\n              $SED -e \"$lt_sed_strip_trailing_spaces\" ) 2>/dev/null || echo \"\"`\n            func_to_host_path_result=`echo \"$func_to_host_path_tmp1\" |\\\n              $SED -e \"$lt_sed_naive_backslashify\"`\n            ;;\n          *cygwin* )\n            func_to_host_path_tmp1=`cygpath -w \"$1\"`\n            func_to_host_path_result=`echo \"$func_to_host_path_tmp1\" |\\\n              $SED -e \"$lt_sed_naive_backslashify\"`\n            ;;\n          * )\n            # Unfortunately, winepath does not exit with a non-zero\n            # error code, so we are forced to check the contents of\n            # stdout. On the other hand, if the command is not\n            # found, the shell will set an exit code of 127 and print\n            # *an error message* to stdout. So we must check for both\n            # error code of zero AND non-empty stdout, which explains\n            # the odd construction:\n            func_to_host_path_tmp1=`winepath -w \"$1\" 2>/dev/null`\n            if test \"$?\" -eq 0 && test -n \"${func_to_host_path_tmp1}\"; then\n              func_to_host_path_result=`echo \"$func_to_host_path_tmp1\" |\\\n                $SED -e \"$lt_sed_naive_backslashify\"`\n            else\n              # Allow warning below.\n              func_to_host_path_result=\"\"\n            fi\n            ;;\n        esac\n        if test -z \"$func_to_host_path_result\" ; then\n          func_error \"Could not determine host path corresponding to\"\n          func_error \"  '$1'\"\n          func_error \"Continuing, but uninstalled executables may not work.\"\n          # Fallback:\n          func_to_host_path_result=\"$1\"\n        fi\n        ;;\n    esac\n  fi\n}\n# end: func_to_host_path\n\n# func_to_host_pathlist arg\n#\n# Convert pathlists to host format when used with build tools.\n# See func_to_host_path(), above. This function supports the\n# following $build/$host combinations (but does no harm for\n# combinations not listed here):\n#    $build          $host\n#    mingw (msys)    mingw  [e.g. native]\n#    cygwin          mingw\n#    *nix + wine     mingw\n#\n# Path separators are also converted from $build format to\n# $host format. If ARG begins or ends with a path separator\n# character, it is preserved (but converted to $host format)\n# on output.\n#\n# ARG is a pathlist (on $build) that should be converted to\n# the proper representation on $host. The result is stored\n# in $func_to_host_pathlist_result.\nfunc_to_host_pathlist ()\n{\n  func_to_host_pathlist_result=\"$1\"\n  if test -n \"$1\" ; then\n    case $host in\n      *mingw* )\n        lt_sed_naive_backslashify='s|\\\\\\\\*|\\\\|g;s|/|\\\\|g;s|\\\\|\\\\\\\\|g'\n        # Remove leading and trailing path separator characters from\n        # ARG. msys behavior is inconsistent here, cygpath turns them\n        # into '.;' and ';.', and winepath ignores them completely.\n        func_to_host_pathlist_tmp2=\"$1\"\n        # Once set for this call, this variable should not be\n        # reassigned. It is used in tha fallback case.\n        func_to_host_pathlist_tmp1=`echo \"$func_to_host_pathlist_tmp2\" |\\\n          $SED -e 's|^:*||' -e 's|:*$||'`\n        case $build in\n          *mingw* ) # Actually, msys.\n            # Awkward: cmd appends spaces to result.\n            lt_sed_strip_trailing_spaces=\"s/[ ]*\\$//\"\n            func_to_host_pathlist_tmp2=`( cmd //c echo \"$func_to_host_pathlist_tmp1\" |\\\n              $SED -e \"$lt_sed_strip_trailing_spaces\" ) 2>/dev/null || echo \"\"`\n            func_to_host_pathlist_result=`echo \"$func_to_host_pathlist_tmp2\" |\\\n              $SED -e \"$lt_sed_naive_backslashify\"`\n            ;;\n          *cygwin* )\n            func_to_host_pathlist_tmp2=`cygpath -w -p \"$func_to_host_pathlist_tmp1\"`\n            func_to_host_pathlist_result=`echo \"$func_to_host_pathlist_tmp2\" |\\\n              $SED -e \"$lt_sed_naive_backslashify\"`\n            ;;\n          * )\n            # unfortunately, winepath doesn't convert pathlists\n            func_to_host_pathlist_result=\"\"\n            func_to_host_pathlist_oldIFS=$IFS\n            IFS=:\n            for func_to_host_pathlist_f in $func_to_host_pathlist_tmp1 ; do\n              IFS=$func_to_host_pathlist_oldIFS\n              if test -n \"$func_to_host_pathlist_f\" ; then\n                func_to_host_path \"$func_to_host_pathlist_f\"\n                if test -n \"$func_to_host_path_result\" ; then\n                  if test -z \"$func_to_host_pathlist_result\" ; then\n                    func_to_host_pathlist_result=\"$func_to_host_path_result\"\n                  else\n                    func_to_host_pathlist_result=\"$func_to_host_pathlist_result;$func_to_host_path_result\"\n                  fi\n                fi\n              fi\n              IFS=:\n            done\n            IFS=$func_to_host_pathlist_oldIFS\n            ;;\n        esac\n        if test -z \"$func_to_host_pathlist_result\" ; then\n          func_error \"Could not determine the host path(s) corresponding to\"\n          func_error \"  '$1'\"\n          func_error \"Continuing, but uninstalled executables may not work.\"\n          # Fallback. This may break if $1 contains DOS-style drive\n          # specifications. The fix is not to complicate the expression\n          # below, but for the user to provide a working wine installation\n          # with winepath so that path translation in the cross-to-mingw\n          # case works properly.\n          lt_replace_pathsep_nix_to_dos=\"s|:|;|g\"\n          func_to_host_pathlist_result=`echo \"$func_to_host_pathlist_tmp1\" |\\\n            $SED -e \"$lt_replace_pathsep_nix_to_dos\"`\n        fi\n        # Now, add the leading and trailing path separators back\n        case \"$1\" in\n          :* ) func_to_host_pathlist_result=\";$func_to_host_pathlist_result\"\n            ;;\n        esac\n        case \"$1\" in\n          *: ) func_to_host_pathlist_result=\"$func_to_host_pathlist_result;\"\n            ;;\n        esac\n        ;;\n    esac\n  fi\n}\n# end: func_to_host_pathlist\n\n# func_emit_cwrapperexe_src\n# emit the source code for a wrapper executable on stdout\n# Must ONLY be called from within func_mode_link because\n# it depends on a number of variable set therein.\nfunc_emit_cwrapperexe_src ()\n{\n\tcat <<EOF\n\n/* $cwrappersource - temporary wrapper executable for $objdir/$outputname\n   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION\n\n   The $output program cannot be directly executed until all the libtool\n   libraries that it depends on are installed.\n\n   This wrapper executable should never be moved out of the build directory.\n   If it is, it will not operate correctly.\n\n   Currently, it simply execs the wrapper *script* \"$SHELL $output\",\n   but could eventually absorb all of the scripts functionality and\n   exec $objdir/$outputname directly.\n*/\nEOF\n\t    cat <<\"EOF\"\n#include <stdio.h>\n#include <stdlib.h>\n#ifdef _MSC_VER\n# include <direct.h>\n# include <process.h>\n# include <io.h>\n# define setmode _setmode\n#else\n# include <unistd.h>\n# include <stdint.h>\n# ifdef __CYGWIN__\n#  include <io.h>\n#  define HAVE_SETENV\n#  ifdef __STRICT_ANSI__\nchar *realpath (const char *, char *);\nint putenv (char *);\nint setenv (const char *, const char *, int);\n#  endif\n# endif\n#endif\n#include <malloc.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <string.h>\n#include <ctype.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <sys/stat.h>\n\n#if defined(PATH_MAX)\n# define LT_PATHMAX PATH_MAX\n#elif defined(MAXPATHLEN)\n# define LT_PATHMAX MAXPATHLEN\n#else\n# define LT_PATHMAX 1024\n#endif\n\n#ifndef S_IXOTH\n# define S_IXOTH 0\n#endif\n#ifndef S_IXGRP\n# define S_IXGRP 0\n#endif\n\n#ifdef _MSC_VER\n# define S_IXUSR _S_IEXEC\n# define stat _stat\n# ifndef _INTPTR_T_DEFINED\n#  define intptr_t int\n# endif\n#endif\n\n#ifndef DIR_SEPARATOR\n# define DIR_SEPARATOR '/'\n# define PATH_SEPARATOR ':'\n#endif\n\n#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \\\n  defined (__OS2__)\n# define HAVE_DOS_BASED_FILE_SYSTEM\n# define FOPEN_WB \"wb\"\n# ifndef DIR_SEPARATOR_2\n#  define DIR_SEPARATOR_2 '\\\\'\n# endif\n# ifndef PATH_SEPARATOR_2\n#  define PATH_SEPARATOR_2 ';'\n# endif\n#endif\n\n#ifndef DIR_SEPARATOR_2\n# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)\n#else /* DIR_SEPARATOR_2 */\n# define IS_DIR_SEPARATOR(ch) \\\n\t(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))\n#endif /* DIR_SEPARATOR_2 */\n\n#ifndef PATH_SEPARATOR_2\n# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)\n#else /* PATH_SEPARATOR_2 */\n# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)\n#endif /* PATH_SEPARATOR_2 */\n\n#ifdef __CYGWIN__\n# define FOPEN_WB \"wb\"\n#endif\n\n#ifndef FOPEN_WB\n# define FOPEN_WB \"w\"\n#endif\n#ifndef _O_BINARY\n# define _O_BINARY 0\n#endif\n\n#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))\n#define XFREE(stale) do { \\\n  if (stale) { free ((void *) stale); stale = 0; } \\\n} while (0)\n\n#undef LTWRAPPER_DEBUGPRINTF\n#if defined DEBUGWRAPPER\n# define LTWRAPPER_DEBUGPRINTF(args) ltwrapper_debugprintf args\nstatic void\nltwrapper_debugprintf (const char *fmt, ...)\n{\n    va_list args;\n    va_start (args, fmt);\n    (void) vfprintf (stderr, fmt, args);\n    va_end (args);\n}\n#else\n# define LTWRAPPER_DEBUGPRINTF(args)\n#endif\n\nconst char *program_name = NULL;\n\nvoid *xmalloc (size_t num);\nchar *xstrdup (const char *string);\nconst char *base_name (const char *name);\nchar *find_executable (const char *wrapper);\nchar *chase_symlinks (const char *pathspec);\nint make_executable (const char *path);\nint check_executable (const char *path);\nchar *strendzap (char *str, const char *pat);\nvoid lt_fatal (const char *message, ...);\nvoid lt_setenv (const char *name, const char *value);\nchar *lt_extend_str (const char *orig_value, const char *add, int to_end);\nvoid lt_opt_process_env_set (const char *arg);\nvoid lt_opt_process_env_prepend (const char *arg);\nvoid lt_opt_process_env_append (const char *arg);\nint lt_split_name_value (const char *arg, char** name, char** value);\nvoid lt_update_exe_path (const char *name, const char *value);\nvoid lt_update_lib_path (const char *name, const char *value);\n\nstatic const char *script_text_part1 =\nEOF\n\n\t    func_emit_wrapper_part1 yes |\n\t        $SED -e 's/\\([\\\\\"]\\)/\\\\\\1/g' \\\n\t             -e 's/^/  \"/' -e 's/$/\\\\n\"/'\n\t    echo \";\"\n\t    cat <<EOF\n\nstatic const char *script_text_part2 =\nEOF\n\t    func_emit_wrapper_part2 yes |\n\t        $SED -e 's/\\([\\\\\"]\\)/\\\\\\1/g' \\\n\t             -e 's/^/  \"/' -e 's/$/\\\\n\"/'\n\t    echo \";\"\n\n\t    cat <<EOF\nconst char * MAGIC_EXE = \"$magic_exe\";\nconst char * LIB_PATH_VARNAME = \"$shlibpath_var\";\nEOF\n\n\t    if test \"$shlibpath_overrides_runpath\" = yes && test -n \"$shlibpath_var\" && test -n \"$temp_rpath\"; then\n              func_to_host_pathlist \"$temp_rpath\"\n\t      cat <<EOF\nconst char * LIB_PATH_VALUE   = \"$func_to_host_pathlist_result\";\nEOF\n\t    else\n\t      cat <<\"EOF\"\nconst char * LIB_PATH_VALUE   = \"\";\nEOF\n\t    fi\n\n\t    if test -n \"$dllsearchpath\"; then\n              func_to_host_pathlist \"$dllsearchpath:\"\n\t      cat <<EOF\nconst char * EXE_PATH_VARNAME = \"PATH\";\nconst char * EXE_PATH_VALUE   = \"$func_to_host_pathlist_result\";\nEOF\n\t    else\n\t      cat <<\"EOF\"\nconst char * EXE_PATH_VARNAME = \"\";\nconst char * EXE_PATH_VALUE   = \"\";\nEOF\n\t    fi\n\n\t    if test \"$fast_install\" = yes; then\n\t      cat <<EOF\nconst char * TARGET_PROGRAM_NAME = \"lt-$outputname\"; /* hopefully, no .exe */\nEOF\n\t    else\n\t      cat <<EOF\nconst char * TARGET_PROGRAM_NAME = \"$outputname\"; /* hopefully, no .exe */\nEOF\n\t    fi\n\n\n\t    cat <<\"EOF\"\n\n#define LTWRAPPER_OPTION_PREFIX         \"--lt-\"\n#define LTWRAPPER_OPTION_PREFIX_LENGTH  5\n\nstatic const size_t opt_prefix_len         = LTWRAPPER_OPTION_PREFIX_LENGTH;\nstatic const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;\n\nstatic const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX \"dump-script\";\n\nstatic const size_t env_set_opt_len     = LTWRAPPER_OPTION_PREFIX_LENGTH + 7;\nstatic const char *env_set_opt          = LTWRAPPER_OPTION_PREFIX \"env-set\";\n  /* argument is putenv-style \"foo=bar\", value of foo is set to bar */\n\nstatic const size_t env_prepend_opt_len = LTWRAPPER_OPTION_PREFIX_LENGTH + 11;\nstatic const char *env_prepend_opt      = LTWRAPPER_OPTION_PREFIX \"env-prepend\";\n  /* argument is putenv-style \"foo=bar\", new value of foo is bar${foo} */\n\nstatic const size_t env_append_opt_len  = LTWRAPPER_OPTION_PREFIX_LENGTH + 10;\nstatic const char *env_append_opt       = LTWRAPPER_OPTION_PREFIX \"env-append\";\n  /* argument is putenv-style \"foo=bar\", new value of foo is ${foo}bar */\n\nint\nmain (int argc, char *argv[])\n{\n  char **newargz;\n  int  newargc;\n  char *tmp_pathspec;\n  char *actual_cwrapper_path;\n  char *actual_cwrapper_name;\n  char *target_name;\n  char *lt_argv_zero;\n  intptr_t rval = 127;\n\n  int i;\n\n  program_name = (char *) xstrdup (base_name (argv[0]));\n  LTWRAPPER_DEBUGPRINTF ((\"(main) argv[0]      : %s\\n\", argv[0]));\n  LTWRAPPER_DEBUGPRINTF ((\"(main) program_name : %s\\n\", program_name));\n\n  /* very simple arg parsing; don't want to rely on getopt */\n  for (i = 1; i < argc; i++)\n    {\n      if (strcmp (argv[i], dumpscript_opt) == 0)\n\t{\nEOF\n\t    case \"$host\" in\n\t      *mingw* | *cygwin* )\n\t\t# make stdout use \"unix\" line endings\n\t\techo \"          setmode(1,_O_BINARY);\"\n\t\t;;\n\t      esac\n\n\t    cat <<\"EOF\"\n\t  printf (\"%s\", script_text_part1);\n\t  printf (\"%s\", script_text_part2);\n\t  return 0;\n\t}\n    }\n\n  newargz = XMALLOC (char *, argc + 1);\n  tmp_pathspec = find_executable (argv[0]);\n  if (tmp_pathspec == NULL)\n    lt_fatal (\"Couldn't find %s\", argv[0]);\n  LTWRAPPER_DEBUGPRINTF ((\"(main) found exe (before symlink chase) at : %s\\n\",\n\t\t\t  tmp_pathspec));\n\n  actual_cwrapper_path = chase_symlinks (tmp_pathspec);\n  LTWRAPPER_DEBUGPRINTF ((\"(main) found exe (after symlink chase) at : %s\\n\",\n\t\t\t  actual_cwrapper_path));\n  XFREE (tmp_pathspec);\n\n  actual_cwrapper_name = xstrdup( base_name (actual_cwrapper_path));\n  strendzap (actual_cwrapper_path, actual_cwrapper_name);\n\n  /* wrapper name transforms */\n  strendzap (actual_cwrapper_name, \".exe\");\n  tmp_pathspec = lt_extend_str (actual_cwrapper_name, \".exe\", 1);\n  XFREE (actual_cwrapper_name);\n  actual_cwrapper_name = tmp_pathspec;\n  tmp_pathspec = 0;\n\n  /* target_name transforms -- use actual target program name; might have lt- prefix */\n  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));\n  strendzap (target_name, \".exe\");\n  tmp_pathspec = lt_extend_str (target_name, \".exe\", 1);\n  XFREE (target_name);\n  target_name = tmp_pathspec;\n  tmp_pathspec = 0;\n\n  LTWRAPPER_DEBUGPRINTF ((\"(main) libtool target name: %s\\n\",\n\t\t\t  target_name));\nEOF\n\n\t    cat <<EOF\n  newargz[0] =\n    XMALLOC (char, (strlen (actual_cwrapper_path) +\n\t\t    strlen (\"$objdir\") + 1 + strlen (actual_cwrapper_name) + 1));\n  strcpy (newargz[0], actual_cwrapper_path);\n  strcat (newargz[0], \"$objdir\");\n  strcat (newargz[0], \"/\");\nEOF\n\n\t    cat <<\"EOF\"\n  /* stop here, and copy so we don't have to do this twice */\n  tmp_pathspec = xstrdup (newargz[0]);\n\n  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */\n  strcat (newargz[0], actual_cwrapper_name);\n\n  /* DO want the lt- prefix here if it exists, so use target_name */\n  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);\n  XFREE (tmp_pathspec);\n  tmp_pathspec = NULL;\nEOF\n\n\t    case $host_os in\n\t      mingw*)\n\t    cat <<\"EOF\"\n  {\n    char* p;\n    while ((p = strchr (newargz[0], '\\\\')) != NULL)\n      {\n\t*p = '/';\n      }\n    while ((p = strchr (lt_argv_zero, '\\\\')) != NULL)\n      {\n\t*p = '/';\n      }\n  }\nEOF\n\t    ;;\n\t    esac\n\n\t    cat <<\"EOF\"\n  XFREE (target_name);\n  XFREE (actual_cwrapper_path);\n  XFREE (actual_cwrapper_name);\n\n  lt_setenv (\"BIN_SH\", \"xpg4\"); /* for Tru64 */\n  lt_setenv (\"DUALCASE\", \"1\");  /* for MSK sh */\n  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);\n  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);\n\n  newargc=0;\n  for (i = 1; i < argc; i++)\n    {\n      if (strncmp (argv[i], env_set_opt, env_set_opt_len) == 0)\n        {\n          if (argv[i][env_set_opt_len] == '=')\n            {\n              const char *p = argv[i] + env_set_opt_len + 1;\n              lt_opt_process_env_set (p);\n            }\n          else if (argv[i][env_set_opt_len] == '\\0' && i + 1 < argc)\n            {\n              lt_opt_process_env_set (argv[++i]); /* don't copy */\n            }\n          else\n            lt_fatal (\"%s missing required argument\", env_set_opt);\n          continue;\n        }\n      if (strncmp (argv[i], env_prepend_opt, env_prepend_opt_len) == 0)\n        {\n          if (argv[i][env_prepend_opt_len] == '=')\n            {\n              const char *p = argv[i] + env_prepend_opt_len + 1;\n              lt_opt_process_env_prepend (p);\n            }\n          else if (argv[i][env_prepend_opt_len] == '\\0' && i + 1 < argc)\n            {\n              lt_opt_process_env_prepend (argv[++i]); /* don't copy */\n            }\n          else\n            lt_fatal (\"%s missing required argument\", env_prepend_opt);\n          continue;\n        }\n      if (strncmp (argv[i], env_append_opt, env_append_opt_len) == 0)\n        {\n          if (argv[i][env_append_opt_len] == '=')\n            {\n              const char *p = argv[i] + env_append_opt_len + 1;\n              lt_opt_process_env_append (p);\n            }\n          else if (argv[i][env_append_opt_len] == '\\0' && i + 1 < argc)\n            {\n              lt_opt_process_env_append (argv[++i]); /* don't copy */\n            }\n          else\n            lt_fatal (\"%s missing required argument\", env_append_opt);\n          continue;\n        }\n      if (strncmp (argv[i], ltwrapper_option_prefix, opt_prefix_len) == 0)\n        {\n          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX\n             namespace, but it is not one of the ones we know about and\n             have already dealt with, above (inluding dump-script), then\n             report an error. Otherwise, targets might begin to believe\n             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX\n             namespace. The first time any user complains about this, we'll\n             need to make LTWRAPPER_OPTION_PREFIX a configure-time option\n             or a configure.ac-settable value.\n           */\n          lt_fatal (\"Unrecognized option in %s namespace: '%s'\",\n                    ltwrapper_option_prefix, argv[i]);\n        }\n      /* otherwise ... */\n      newargz[++newargc] = xstrdup (argv[i]);\n    }\n  newargz[++newargc] = NULL;\n\n  LTWRAPPER_DEBUGPRINTF     ((\"(main) lt_argv_zero : %s\\n\", (lt_argv_zero ? lt_argv_zero : \"<NULL>\")));\n  for (i = 0; i < newargc; i++)\n    {\n      LTWRAPPER_DEBUGPRINTF ((\"(main) newargz[%d]   : %s\\n\", i, (newargz[i] ? newargz[i] : \"<NULL>\")));\n    }\n\nEOF\n\n\t    case $host_os in\n\t      mingw*)\n\t\tcat <<\"EOF\"\n  /* execv doesn't actually work on mingw as expected on unix */\n  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);\n  if (rval == -1)\n    {\n      /* failed to start process */\n      LTWRAPPER_DEBUGPRINTF ((\"(main) failed to launch target \\\"%s\\\": errno = %d\\n\", lt_argv_zero, errno));\n      return 127;\n    }\n  return rval;\nEOF\n\t\t;;\n\t      *)\n\t\tcat <<\"EOF\"\n  execv (lt_argv_zero, newargz);\n  return rval; /* =127, but avoids unused variable warning */\nEOF\n\t\t;;\n\t    esac\n\n\t    cat <<\"EOF\"\n}\n\nvoid *\nxmalloc (size_t num)\n{\n  void *p = (void *) malloc (num);\n  if (!p)\n    lt_fatal (\"Memory exhausted\");\n\n  return p;\n}\n\nchar *\nxstrdup (const char *string)\n{\n  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),\n\t\t\t  string) : NULL;\n}\n\nconst char *\nbase_name (const char *name)\n{\n  const char *base;\n\n#if defined (HAVE_DOS_BASED_FILE_SYSTEM)\n  /* Skip over the disk name in MSDOS pathnames. */\n  if (isalpha ((unsigned char) name[0]) && name[1] == ':')\n    name += 2;\n#endif\n\n  for (base = name; *name; name++)\n    if (IS_DIR_SEPARATOR (*name))\n      base = name + 1;\n  return base;\n}\n\nint\ncheck_executable (const char *path)\n{\n  struct stat st;\n\n  LTWRAPPER_DEBUGPRINTF ((\"(check_executable)  : %s\\n\",\n\t\t\t  path ? (*path ? path : \"EMPTY!\") : \"NULL!\"));\n  if ((!path) || (!*path))\n    return 0;\n\n  if ((stat (path, &st) >= 0)\n      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))\n    return 1;\n  else\n    return 0;\n}\n\nint\nmake_executable (const char *path)\n{\n  int rval = 0;\n  struct stat st;\n\n  LTWRAPPER_DEBUGPRINTF ((\"(make_executable)   : %s\\n\",\n\t\t\t  path ? (*path ? path : \"EMPTY!\") : \"NULL!\"));\n  if ((!path) || (!*path))\n    return 0;\n\n  if (stat (path, &st) >= 0)\n    {\n      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);\n    }\n  return rval;\n}\n\n/* Searches for the full path of the wrapper.  Returns\n   newly allocated full path name if found, NULL otherwise\n   Does not chase symlinks, even on platforms that support them.\n*/\nchar *\nfind_executable (const char *wrapper)\n{\n  int has_slash = 0;\n  const char *p;\n  const char *p_next;\n  /* static buffer for getcwd */\n  char tmp[LT_PATHMAX + 1];\n  int tmp_len;\n  char *concat_name;\n\n  LTWRAPPER_DEBUGPRINTF ((\"(find_executable)   : %s\\n\",\n\t\t\t  wrapper ? (*wrapper ? wrapper : \"EMPTY!\") : \"NULL!\"));\n\n  if ((wrapper == NULL) || (*wrapper == '\\0'))\n    return NULL;\n\n  /* Absolute path? */\n#if defined (HAVE_DOS_BASED_FILE_SYSTEM)\n  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')\n    {\n      concat_name = xstrdup (wrapper);\n      if (check_executable (concat_name))\n\treturn concat_name;\n      XFREE (concat_name);\n    }\n  else\n    {\n#endif\n      if (IS_DIR_SEPARATOR (wrapper[0]))\n\t{\n\t  concat_name = xstrdup (wrapper);\n\t  if (check_executable (concat_name))\n\t    return concat_name;\n\t  XFREE (concat_name);\n\t}\n#if defined (HAVE_DOS_BASED_FILE_SYSTEM)\n    }\n#endif\n\n  for (p = wrapper; *p; p++)\n    if (*p == '/')\n      {\n\thas_slash = 1;\n\tbreak;\n      }\n  if (!has_slash)\n    {\n      /* no slashes; search PATH */\n      const char *path = getenv (\"PATH\");\n      if (path != NULL)\n\t{\n\t  for (p = path; *p; p = p_next)\n\t    {\n\t      const char *q;\n\t      size_t p_len;\n\t      for (q = p; *q; q++)\n\t\tif (IS_PATH_SEPARATOR (*q))\n\t\t  break;\n\t      p_len = q - p;\n\t      p_next = (*q == '\\0' ? q : q + 1);\n\t      if (p_len == 0)\n\t\t{\n\t\t  /* empty path: current directory */\n\t\t  if (getcwd (tmp, LT_PATHMAX) == NULL)\n\t\t    lt_fatal (\"getcwd failed\");\n\t\t  tmp_len = strlen (tmp);\n\t\t  concat_name =\n\t\t    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);\n\t\t  memcpy (concat_name, tmp, tmp_len);\n\t\t  concat_name[tmp_len] = '/';\n\t\t  strcpy (concat_name + tmp_len + 1, wrapper);\n\t\t}\n\t      else\n\t\t{\n\t\t  concat_name =\n\t\t    XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);\n\t\t  memcpy (concat_name, p, p_len);\n\t\t  concat_name[p_len] = '/';\n\t\t  strcpy (concat_name + p_len + 1, wrapper);\n\t\t}\n\t      if (check_executable (concat_name))\n\t\treturn concat_name;\n\t      XFREE (concat_name);\n\t    }\n\t}\n      /* not found in PATH; assume curdir */\n    }\n  /* Relative path | not found in path: prepend cwd */\n  if (getcwd (tmp, LT_PATHMAX) == NULL)\n    lt_fatal (\"getcwd failed\");\n  tmp_len = strlen (tmp);\n  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);\n  memcpy (concat_name, tmp, tmp_len);\n  concat_name[tmp_len] = '/';\n  strcpy (concat_name + tmp_len + 1, wrapper);\n\n  if (check_executable (concat_name))\n    return concat_name;\n  XFREE (concat_name);\n  return NULL;\n}\n\nchar *\nchase_symlinks (const char *pathspec)\n{\n#ifndef S_ISLNK\n  return xstrdup (pathspec);\n#else\n  char buf[LT_PATHMAX];\n  struct stat s;\n  char *tmp_pathspec = xstrdup (pathspec);\n  char *p;\n  int has_symlinks = 0;\n  while (strlen (tmp_pathspec) && !has_symlinks)\n    {\n      LTWRAPPER_DEBUGPRINTF ((\"checking path component for symlinks: %s\\n\",\n\t\t\t      tmp_pathspec));\n      if (lstat (tmp_pathspec, &s) == 0)\n\t{\n\t  if (S_ISLNK (s.st_mode) != 0)\n\t    {\n\t      has_symlinks = 1;\n\t      break;\n\t    }\n\n\t  /* search backwards for last DIR_SEPARATOR */\n\t  p = tmp_pathspec + strlen (tmp_pathspec) - 1;\n\t  while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))\n\t    p--;\n\t  if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))\n\t    {\n\t      /* no more DIR_SEPARATORS left */\n\t      break;\n\t    }\n\t  *p = '\\0';\n\t}\n      else\n\t{\n\t  char *errstr = strerror (errno);\n\t  lt_fatal (\"Error accessing file %s (%s)\", tmp_pathspec, errstr);\n\t}\n    }\n  XFREE (tmp_pathspec);\n\n  if (!has_symlinks)\n    {\n      return xstrdup (pathspec);\n    }\n\n  tmp_pathspec = realpath (pathspec, buf);\n  if (tmp_pathspec == 0)\n    {\n      lt_fatal (\"Could not follow symlinks for %s\", pathspec);\n    }\n  return xstrdup (tmp_pathspec);\n#endif\n}\n\nchar *\nstrendzap (char *str, const char *pat)\n{\n  size_t len, patlen;\n\n  assert (str != NULL);\n  assert (pat != NULL);\n\n  len = strlen (str);\n  patlen = strlen (pat);\n\n  if (patlen <= len)\n    {\n      str += len - patlen;\n      if (strcmp (str, pat) == 0)\n\t*str = '\\0';\n    }\n  return str;\n}\n\nstatic void\nlt_error_core (int exit_status, const char *mode,\n\t       const char *message, va_list ap)\n{\n  fprintf (stderr, \"%s: %s: \", program_name, mode);\n  vfprintf (stderr, message, ap);\n  fprintf (stderr, \".\\n\");\n\n  if (exit_status >= 0)\n    exit (exit_status);\n}\n\nvoid\nlt_fatal (const char *message, ...)\n{\n  va_list ap;\n  va_start (ap, message);\n  lt_error_core (EXIT_FAILURE, \"FATAL\", message, ap);\n  va_end (ap);\n}\n\nvoid\nlt_setenv (const char *name, const char *value)\n{\n  LTWRAPPER_DEBUGPRINTF ((\"(lt_setenv) setting '%s' to '%s'\\n\",\n                          (name ? name : \"<NULL>\"),\n                          (value ? value : \"<NULL>\")));\n  {\n#ifdef HAVE_SETENV\n    /* always make a copy, for consistency with !HAVE_SETENV */\n    char *str = xstrdup (value);\n    setenv (name, str, 1);\n#else\n    int len = strlen (name) + 1 + strlen (value) + 1;\n    char *str = XMALLOC (char, len);\n    sprintf (str, \"%s=%s\", name, value);\n    if (putenv (str) != EXIT_SUCCESS)\n      {\n        XFREE (str);\n      }\n#endif\n  }\n}\n\nchar *\nlt_extend_str (const char *orig_value, const char *add, int to_end)\n{\n  char *new_value;\n  if (orig_value && *orig_value)\n    {\n      int orig_value_len = strlen (orig_value);\n      int add_len = strlen (add);\n      new_value = XMALLOC (char, add_len + orig_value_len + 1);\n      if (to_end)\n        {\n          strcpy (new_value, orig_value);\n          strcpy (new_value + orig_value_len, add);\n        }\n      else\n        {\n          strcpy (new_value, add);\n          strcpy (new_value + add_len, orig_value);\n        }\n    }\n  else\n    {\n      new_value = xstrdup (add);\n    }\n  return new_value;\n}\n\nint\nlt_split_name_value (const char *arg, char** name, char** value)\n{\n  const char *p;\n  int len;\n  if (!arg || !*arg)\n    return 1;\n\n  p = strchr (arg, (int)'=');\n\n  if (!p)\n    return 1;\n\n  *value = xstrdup (++p);\n\n  len = strlen (arg) - strlen (*value);\n  *name = XMALLOC (char, len);\n  strncpy (*name, arg, len-1);\n  (*name)[len - 1] = '\\0';\n\n  return 0;\n}\n\nvoid\nlt_opt_process_env_set (const char *arg)\n{\n  char *name = NULL;\n  char *value = NULL;\n\n  if (lt_split_name_value (arg, &name, &value) != 0)\n    {\n      XFREE (name);\n      XFREE (value);\n      lt_fatal (\"bad argument for %s: '%s'\", env_set_opt, arg);\n    }\n\n  lt_setenv (name, value);\n  XFREE (name);\n  XFREE (value);\n}\n\nvoid\nlt_opt_process_env_prepend (const char *arg)\n{\n  char *name = NULL;\n  char *value = NULL;\n  char *new_value = NULL;\n\n  if (lt_split_name_value (arg, &name, &value) != 0)\n    {\n      XFREE (name);\n      XFREE (value);\n      lt_fatal (\"bad argument for %s: '%s'\", env_prepend_opt, arg);\n    }\n\n  new_value = lt_extend_str (getenv (name), value, 0);\n  lt_setenv (name, new_value);\n  XFREE (new_value);\n  XFREE (name);\n  XFREE (value);\n}\n\nvoid\nlt_opt_process_env_append (const char *arg)\n{\n  char *name = NULL;\n  char *value = NULL;\n  char *new_value = NULL;\n\n  if (lt_split_name_value (arg, &name, &value) != 0)\n    {\n      XFREE (name);\n      XFREE (value);\n      lt_fatal (\"bad argument for %s: '%s'\", env_append_opt, arg);\n    }\n\n  new_value = lt_extend_str (getenv (name), value, 1);\n  lt_setenv (name, new_value);\n  XFREE (new_value);\n  XFREE (name);\n  XFREE (value);\n}\n\nvoid\nlt_update_exe_path (const char *name, const char *value)\n{\n  LTWRAPPER_DEBUGPRINTF ((\"(lt_update_exe_path) modifying '%s' by prepending '%s'\\n\",\n                          (name ? name : \"<NULL>\"),\n                          (value ? value : \"<NULL>\")));\n\n  if (name && *name && value && *value)\n    {\n      char *new_value = lt_extend_str (getenv (name), value, 0);\n      /* some systems can't cope with a ':'-terminated path #' */\n      int len = strlen (new_value);\n      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))\n        {\n          new_value[len-1] = '\\0';\n        }\n      lt_setenv (name, new_value);\n      XFREE (new_value);\n    }\n}\n\nvoid\nlt_update_lib_path (const char *name, const char *value)\n{\n  LTWRAPPER_DEBUGPRINTF ((\"(lt_update_lib_path) modifying '%s' by prepending '%s'\\n\",\n                          (name ? name : \"<NULL>\"),\n                          (value ? value : \"<NULL>\")));\n\n  if (name && *name && value && *value)\n    {\n      char *new_value = lt_extend_str (getenv (name), value, 0);\n      lt_setenv (name, new_value);\n      XFREE (new_value);\n    }\n}\n\n\nEOF\n}\n# end: func_emit_cwrapperexe_src\n\n# func_mode_link arg...\nfunc_mode_link ()\n{\n    $opt_debug\n    case $host in\n    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)\n      # It is impossible to link a dll without this setting, and\n      # we shouldn't force the makefile maintainer to figure out\n      # which system we are compiling for in order to pass an extra\n      # flag for every libtool invocation.\n      # allow_undefined=no\n\n      # FIXME: Unfortunately, there are problems with the above when trying\n      # to make a dll which has undefined symbols, in which case not\n      # even a static library is built.  For now, we need to specify\n      # -no-undefined on the libtool link line when we can be certain\n      # that all symbols are satisfied, otherwise we get a static library.\n      allow_undefined=yes\n      ;;\n    *)\n      allow_undefined=yes\n      ;;\n    esac\n    libtool_args=$nonopt\n    base_compile=\"$nonopt $@\"\n    compile_command=$nonopt\n    finalize_command=$nonopt\n\n    compile_rpath=\n    finalize_rpath=\n    compile_shlibpath=\n    finalize_shlibpath=\n    convenience=\n    old_convenience=\n    deplibs=\n    old_deplibs=\n    compiler_flags=\n    linker_flags=\n    dllsearchpath=\n    lib_search_path=`pwd`\n    inst_prefix_dir=\n    new_inherited_linker_flags=\n\n    avoid_version=no\n    dlfiles=\n    dlprefiles=\n    dlself=no\n    export_dynamic=no\n    export_symbols=\n    export_symbols_regex=\n    generated=\n    libobjs=\n    ltlibs=\n    module=no\n    no_install=no\n    objs=\n    non_pic_objects=\n    precious_files_regex=\n    prefer_static_libs=no\n    preload=no\n    prev=\n    prevarg=\n    release=\n    rpath=\n    xrpath=\n    perm_rpath=\n    temp_rpath=\n    thread_safe=no\n    vinfo=\n    vinfo_number=no\n    weak_libs=\n    single_module=\"${wl}-single_module\"\n    func_infer_tag $base_compile\n\n    # We need to know -static, to get the right output filenames.\n    for arg\n    do\n      case $arg in\n      -shared)\n\ttest \"$build_libtool_libs\" != yes && \\\n\t  func_fatal_configuration \"can not build a shared library\"\n\tbuild_old_libs=no\n\tbreak\n\t;;\n      -all-static | -static | -static-libtool-libs)\n\tcase $arg in\n\t-all-static)\n\t  if test \"$build_libtool_libs\" = yes && test -z \"$link_static_flag\"; then\n\t    func_warning \"complete static linking is impossible in this configuration\"\n\t  fi\n\t  if test -n \"$link_static_flag\"; then\n\t    dlopen_self=$dlopen_self_static\n\t  fi\n\t  prefer_static_libs=yes\n\t  ;;\n\t-static)\n\t  if test -z \"$pic_flag\" && test -n \"$link_static_flag\"; then\n\t    dlopen_self=$dlopen_self_static\n\t  fi\n\t  prefer_static_libs=built\n\t  ;;\n\t-static-libtool-libs)\n\t  if test -z \"$pic_flag\" && test -n \"$link_static_flag\"; then\n\t    dlopen_self=$dlopen_self_static\n\t  fi\n\t  prefer_static_libs=yes\n\t  ;;\n\tesac\n\tbuild_libtool_libs=no\n\tbuild_old_libs=yes\n\tbreak\n\t;;\n      esac\n    done\n\n    # See if our shared archives depend on static archives.\n    test -n \"$old_archive_from_new_cmds\" && build_old_libs=yes\n\n    # Go through the arguments, transforming them on the way.\n    while test \"$#\" -gt 0; do\n      arg=\"$1\"\n      shift\n      func_quote_for_eval \"$arg\"\n      qarg=$func_quote_for_eval_unquoted_result\n      func_append libtool_args \" $func_quote_for_eval_result\"\n\n      # If the previous option needs an argument, assign it.\n      if test -n \"$prev\"; then\n\tcase $prev in\n\toutput)\n\t  func_append compile_command \" @OUTPUT@\"\n\t  func_append finalize_command \" @OUTPUT@\"\n\t  ;;\n\tesac\n\n\tcase $prev in\n\tdlfiles|dlprefiles)\n\t  if test \"$preload\" = no; then\n\t    # Add the symbol object into the linking commands.\n\t    func_append compile_command \" @SYMFILE@\"\n\t    func_append finalize_command \" @SYMFILE@\"\n\t    preload=yes\n\t  fi\n\t  case $arg in\n\t  *.la | *.lo) ;;  # We handle these cases below.\n\t  force)\n\t    if test \"$dlself\" = no; then\n\t      dlself=needless\n\t      export_dynamic=yes\n\t    fi\n\t    prev=\n\t    continue\n\t    ;;\n\t  self)\n\t    if test \"$prev\" = dlprefiles; then\n\t      dlself=yes\n\t    elif test \"$prev\" = dlfiles && test \"$dlopen_self\" != yes; then\n\t      dlself=yes\n\t    else\n\t      dlself=needless\n\t      export_dynamic=yes\n\t    fi\n\t    prev=\n\t    continue\n\t    ;;\n\t  *)\n\t    if test \"$prev\" = dlfiles; then\n\t      dlfiles=\"$dlfiles $arg\"\n\t    else\n\t      dlprefiles=\"$dlprefiles $arg\"\n\t    fi\n\t    prev=\n\t    continue\n\t    ;;\n\t  esac\n\t  ;;\n\texpsyms)\n\t  export_symbols=\"$arg\"\n\t  test -f \"$arg\" \\\n\t    || func_fatal_error \"symbol file \\`$arg' does not exist\"\n\t  prev=\n\t  continue\n\t  ;;\n\texpsyms_regex)\n\t  export_symbols_regex=\"$arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\tframework)\n\t  case $host in\n\t    *-*-darwin*)\n\t      case \"$deplibs \" in\n\t\t*\" $qarg.ltframework \"*) ;;\n\t\t*) deplibs=\"$deplibs $qarg.ltframework\" # this is fixed later\n\t\t   ;;\n\t      esac\n\t      ;;\n\t  esac\n\t  prev=\n\t  continue\n\t  ;;\n\tinst_prefix)\n\t  inst_prefix_dir=\"$arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\tobjectlist)\n\t  if test -f \"$arg\"; then\n\t    save_arg=$arg\n\t    moreargs=\n\t    for fil in `cat \"$save_arg\"`\n\t    do\n#\t      moreargs=\"$moreargs $fil\"\n\t      arg=$fil\n\t      # A libtool-controlled object.\n\n\t      # Check to see that this really is a libtool object.\n\t      if func_lalib_unsafe_p \"$arg\"; then\n\t\tpic_object=\n\t\tnon_pic_object=\n\n\t\t# Read the .lo file\n\t\tfunc_source \"$arg\"\n\n\t\tif test -z \"$pic_object\" ||\n\t\t   test -z \"$non_pic_object\" ||\n\t\t   test \"$pic_object\" = none &&\n\t\t   test \"$non_pic_object\" = none; then\n\t\t  func_fatal_error \"cannot find name of object for \\`$arg'\"\n\t\tfi\n\n\t\t# Extract subdirectory from the argument.\n\t\tfunc_dirname \"$arg\" \"/\" \"\"\n\t\txdir=\"$func_dirname_result\"\n\n\t\tif test \"$pic_object\" != none; then\n\t\t  # Prepend the subdirectory the object is found in.\n\t\t  pic_object=\"$xdir$pic_object\"\n\n\t\t  if test \"$prev\" = dlfiles; then\n\t\t    if test \"$build_libtool_libs\" = yes && test \"$dlopen_support\" = yes; then\n\t\t      dlfiles=\"$dlfiles $pic_object\"\n\t\t      prev=\n\t\t      continue\n\t\t    else\n\t\t      # If libtool objects are unsupported, then we need to preload.\n\t\t      prev=dlprefiles\n\t\t    fi\n\t\t  fi\n\n\t\t  # CHECK ME:  I think I busted this.  -Ossama\n\t\t  if test \"$prev\" = dlprefiles; then\n\t\t    # Preload the old-style object.\n\t\t    dlprefiles=\"$dlprefiles $pic_object\"\n\t\t    prev=\n\t\t  fi\n\n\t\t  # A PIC object.\n\t\t  func_append libobjs \" $pic_object\"\n\t\t  arg=\"$pic_object\"\n\t\tfi\n\n\t\t# Non-PIC object.\n\t\tif test \"$non_pic_object\" != none; then\n\t\t  # Prepend the subdirectory the object is found in.\n\t\t  non_pic_object=\"$xdir$non_pic_object\"\n\n\t\t  # A standard non-PIC object\n\t\t  func_append non_pic_objects \" $non_pic_object\"\n\t\t  if test -z \"$pic_object\" || test \"$pic_object\" = none ; then\n\t\t    arg=\"$non_pic_object\"\n\t\t  fi\n\t\telse\n\t\t  # If the PIC object exists, use it instead.\n\t\t  # $xdir was prepended to $pic_object above.\n\t\t  non_pic_object=\"$pic_object\"\n\t\t  func_append non_pic_objects \" $non_pic_object\"\n\t\tfi\n\t      else\n\t\t# Only an error if not doing a dry-run.\n\t\tif $opt_dry_run; then\n\t\t  # Extract subdirectory from the argument.\n\t\t  func_dirname \"$arg\" \"/\" \"\"\n\t\t  xdir=\"$func_dirname_result\"\n\n\t\t  func_lo2o \"$arg\"\n\t\t  pic_object=$xdir$objdir/$func_lo2o_result\n\t\t  non_pic_object=$xdir$func_lo2o_result\n\t\t  func_append libobjs \" $pic_object\"\n\t\t  func_append non_pic_objects \" $non_pic_object\"\n\t        else\n\t\t  func_fatal_error \"\\`$arg' is not a valid libtool object\"\n\t\tfi\n\t      fi\n\t    done\n\t  else\n\t    func_fatal_error \"link input file \\`$arg' does not exist\"\n\t  fi\n\t  arg=$save_arg\n\t  prev=\n\t  continue\n\t  ;;\n\tprecious_regex)\n\t  precious_files_regex=\"$arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\trelease)\n\t  release=\"-$arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\trpath | xrpath)\n\t  # We need an absolute path.\n\t  case $arg in\n\t  [\\\\/]* | [A-Za-z]:[\\\\/]*) ;;\n\t  *)\n\t    func_fatal_error \"only absolute run-paths are allowed\"\n\t    ;;\n\t  esac\n\t  if test \"$prev\" = rpath; then\n\t    case \"$rpath \" in\n\t    *\" $arg \"*) ;;\n\t    *) rpath=\"$rpath $arg\" ;;\n\t    esac\n\t  else\n\t    case \"$xrpath \" in\n\t    *\" $arg \"*) ;;\n\t    *) xrpath=\"$xrpath $arg\" ;;\n\t    esac\n\t  fi\n\t  prev=\n\t  continue\n\t  ;;\n\tshrext)\n\t  shrext_cmds=\"$arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\tweak)\n\t  weak_libs=\"$weak_libs $arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\txcclinker)\n\t  linker_flags=\"$linker_flags $qarg\"\n\t  compiler_flags=\"$compiler_flags $qarg\"\n\t  prev=\n\t  func_append compile_command \" $qarg\"\n\t  func_append finalize_command \" $qarg\"\n\t  continue\n\t  ;;\n\txcompiler)\n\t  compiler_flags=\"$compiler_flags $qarg\"\n\t  prev=\n\t  func_append compile_command \" $qarg\"\n\t  func_append finalize_command \" $qarg\"\n\t  continue\n\t  ;;\n\txlinker)\n\t  linker_flags=\"$linker_flags $qarg\"\n\t  compiler_flags=\"$compiler_flags $wl$qarg\"\n\t  prev=\n\t  func_append compile_command \" $wl$qarg\"\n\t  func_append finalize_command \" $wl$qarg\"\n\t  continue\n\t  ;;\n\t*)\n\t  eval \"$prev=\\\"\\$arg\\\"\"\n\t  prev=\n\t  continue\n\t  ;;\n\tesac\n      fi # test -n \"$prev\"\n\n      prevarg=\"$arg\"\n\n      case $arg in\n      -all-static)\n\tif test -n \"$link_static_flag\"; then\n\t  # See comment for -static flag below, for more details.\n\t  func_append compile_command \" $link_static_flag\"\n\t  func_append finalize_command \" $link_static_flag\"\n\tfi\n\tcontinue\n\t;;\n\n      -allow-undefined)\n\t# FIXME: remove this flag sometime in the future.\n\tfunc_fatal_error \"\\`-allow-undefined' must not be used because it is the default\"\n\t;;\n\n      -avoid-version)\n\tavoid_version=yes\n\tcontinue\n\t;;\n\n      -dlopen)\n\tprev=dlfiles\n\tcontinue\n\t;;\n\n      -dlpreopen)\n\tprev=dlprefiles\n\tcontinue\n\t;;\n\n      -export-dynamic)\n\texport_dynamic=yes\n\tcontinue\n\t;;\n\n      -export-symbols | -export-symbols-regex)\n\tif test -n \"$export_symbols\" || test -n \"$export_symbols_regex\"; then\n\t  func_fatal_error \"more than one -exported-symbols argument is not allowed\"\n\tfi\n\tif test \"X$arg\" = \"X-export-symbols\"; then\n\t  prev=expsyms\n\telse\n\t  prev=expsyms_regex\n\tfi\n\tcontinue\n\t;;\n\n      -framework)\n\tprev=framework\n\tcontinue\n\t;;\n\n      -inst-prefix-dir)\n\tprev=inst_prefix\n\tcontinue\n\t;;\n\n      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*\n      # so, if we see these flags be careful not to treat them like -L\n      -L[A-Z][A-Z]*:*)\n\tcase $with_gcc/$host in\n\tno/*-*-irix* | /*-*-irix*)\n\t  func_append compile_command \" $arg\"\n\t  func_append finalize_command \" $arg\"\n\t  ;;\n\tesac\n\tcontinue\n\t;;\n\n      -L*)\n\tfunc_stripname '-L' '' \"$arg\"\n\tdir=$func_stripname_result\n\tif test -z \"$dir\"; then\n\t  if test \"$#\" -gt 0; then\n\t    func_fatal_error \"require no space between \\`-L' and \\`$1'\"\n\t  else\n\t    func_fatal_error \"need path for \\`-L' option\"\n\t  fi\n\tfi\n\t# We need an absolute path.\n\tcase $dir in\n\t[\\\\/]* | [A-Za-z]:[\\\\/]*) ;;\n\t*)\n\t  absdir=`cd \"$dir\" && pwd`\n\t  test -z \"$absdir\" && \\\n\t    func_fatal_error \"cannot determine absolute directory name of \\`$dir'\"\n\t  dir=\"$absdir\"\n\t  ;;\n\tesac\n\tcase \"$deplibs \" in\n\t*\" -L$dir \"*) ;;\n\t*)\n\t  deplibs=\"$deplibs -L$dir\"\n\t  lib_search_path=\"$lib_search_path $dir\"\n\t  ;;\n\tesac\n\tcase $host in\n\t*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)\n\t  testbindir=`$ECHO \"X$dir\" | $Xsed -e 's*/lib$*/bin*'`\n\t  case :$dllsearchpath: in\n\t  *\":$dir:\"*) ;;\n\t  ::) dllsearchpath=$dir;;\n\t  *) dllsearchpath=\"$dllsearchpath:$dir\";;\n\t  esac\n\t  case :$dllsearchpath: in\n\t  *\":$testbindir:\"*) ;;\n\t  ::) dllsearchpath=$testbindir;;\n\t  *) dllsearchpath=\"$dllsearchpath:$testbindir\";;\n\t  esac\n\t  ;;\n\tesac\n\tcontinue\n\t;;\n\n      -l*)\n\tif test \"X$arg\" = \"X-lc\" || test \"X$arg\" = \"X-lm\"; then\n\t  case $host in\n\t  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc*)\n\t    # These systems don't actually have a C or math library (as such)\n\t    continue\n\t    ;;\n\t  *-*-os2*)\n\t    # These systems don't actually have a C library (as such)\n\t    test \"X$arg\" = \"X-lc\" && continue\n\t    ;;\n\t  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)\n\t    # Do not include libc due to us having libc/libc_r.\n\t    test \"X$arg\" = \"X-lc\" && continue\n\t    ;;\n\t  *-*-rhapsody* | *-*-darwin1.[012])\n\t    # Rhapsody C and math libraries are in the System framework\n\t    deplibs=\"$deplibs System.ltframework\"\n\t    continue\n\t    ;;\n\t  *-*-sco3.2v5* | *-*-sco5v6*)\n\t    # Causes problems with __ctype\n\t    test \"X$arg\" = \"X-lc\" && continue\n\t    ;;\n\t  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)\n\t    # Compiler inserts libc in the correct place for threads to work\n\t    test \"X$arg\" = \"X-lc\" && continue\n\t    ;;\n\t  esac\n\telif test \"X$arg\" = \"X-lc_r\"; then\n\t case $host in\n\t *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)\n\t   # Do not include libc_r directly, use -pthread flag.\n\t   continue\n\t   ;;\n\t esac\n\tfi\n\tdeplibs=\"$deplibs $arg\"\n\tcontinue\n\t;;\n\n      -module)\n\tmodule=yes\n\tcontinue\n\t;;\n\n      # Tru64 UNIX uses -model [arg] to determine the layout of C++\n      # classes, name mangling, and exception handling.\n      # Darwin uses the -arch flag to determine output architecture.\n      -model|-arch|-isysroot)\n\tcompiler_flags=\"$compiler_flags $arg\"\n\tfunc_append compile_command \" $arg\"\n\tfunc_append finalize_command \" $arg\"\n\tprev=xcompiler\n\tcontinue\n\t;;\n\n      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)\n\tcompiler_flags=\"$compiler_flags $arg\"\n\tfunc_append compile_command \" $arg\"\n\tfunc_append finalize_command \" $arg\"\n\tcase \"$new_inherited_linker_flags \" in\n\t    *\" $arg \"*) ;;\n\t    * ) new_inherited_linker_flags=\"$new_inherited_linker_flags $arg\" ;;\n\tesac\n\tcontinue\n\t;;\n\n      -multi_module)\n\tsingle_module=\"${wl}-multi_module\"\n\tcontinue\n\t;;\n\n      -no-fast-install)\n\tfast_install=no\n\tcontinue\n\t;;\n\n      -no-install)\n\tcase $host in\n\t*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)\n\t  # The PATH hackery in wrapper scripts is required on Windows\n\t  # and Darwin in order for the loader to find any dlls it needs.\n\t  func_warning \"\\`-no-install' is ignored for $host\"\n\t  func_warning \"assuming \\`-no-fast-install' instead\"\n\t  fast_install=no\n\t  ;;\n\t*) no_install=yes ;;\n\tesac\n\tcontinue\n\t;;\n\n      -no-undefined)\n\tallow_undefined=no\n\tcontinue\n\t;;\n\n      -objectlist)\n\tprev=objectlist\n\tcontinue\n\t;;\n\n      -o) prev=output ;;\n\n      -precious-files-regex)\n\tprev=precious_regex\n\tcontinue\n\t;;\n\n      -release)\n\tprev=release\n\tcontinue\n\t;;\n\n      -rpath)\n\tprev=rpath\n\tcontinue\n\t;;\n\n      -R)\n\tprev=xrpath\n\tcontinue\n\t;;\n\n      -R*)\n\tfunc_stripname '-R' '' \"$arg\"\n\tdir=$func_stripname_result\n\t# We need an absolute path.\n\tcase $dir in\n\t[\\\\/]* | [A-Za-z]:[\\\\/]*) ;;\n\t*)\n\t  func_fatal_error \"only absolute run-paths are allowed\"\n\t  ;;\n\tesac\n\tcase \"$xrpath \" in\n\t*\" $dir \"*) ;;\n\t*) xrpath=\"$xrpath $dir\" ;;\n\tesac\n\tcontinue\n\t;;\n\n      -shared)\n\t# The effects of -shared are defined in a previous loop.\n\tcontinue\n\t;;\n\n      -shrext)\n\tprev=shrext\n\tcontinue\n\t;;\n\n      -static | -static-libtool-libs)\n\t# The effects of -static are defined in a previous loop.\n\t# We used to do the same as -all-static on platforms that\n\t# didn't have a PIC flag, but the assumption that the effects\n\t# would be equivalent was wrong.  It would break on at least\n\t# Digital Unix and AIX.\n\tcontinue\n\t;;\n\n      -thread-safe)\n\tthread_safe=yes\n\tcontinue\n\t;;\n\n      -version-info)\n\tprev=vinfo\n\tcontinue\n\t;;\n\n      -version-number)\n\tprev=vinfo\n\tvinfo_number=yes\n\tcontinue\n\t;;\n\n      -weak)\n        prev=weak\n\tcontinue\n\t;;\n\n      -Wc,*)\n\tfunc_stripname '-Wc,' '' \"$arg\"\n\targs=$func_stripname_result\n\targ=\n\tsave_ifs=\"$IFS\"; IFS=','\n\tfor flag in $args; do\n\t  IFS=\"$save_ifs\"\n          func_quote_for_eval \"$flag\"\n\t  arg=\"$arg $wl$func_quote_for_eval_result\"\n\t  compiler_flags=\"$compiler_flags $func_quote_for_eval_result\"\n\tdone\n\tIFS=\"$save_ifs\"\n\tfunc_stripname ' ' '' \"$arg\"\n\targ=$func_stripname_result\n\t;;\n\n      -Wl,*)\n\tfunc_stripname '-Wl,' '' \"$arg\"\n\targs=$func_stripname_result\n\targ=\n\tsave_ifs=\"$IFS\"; IFS=','\n\tfor flag in $args; do\n\t  IFS=\"$save_ifs\"\n          func_quote_for_eval \"$flag\"\n\t  arg=\"$arg $wl$func_quote_for_eval_result\"\n\t  compiler_flags=\"$compiler_flags $wl$func_quote_for_eval_result\"\n\t  linker_flags=\"$linker_flags $func_quote_for_eval_result\"\n\tdone\n\tIFS=\"$save_ifs\"\n\tfunc_stripname ' ' '' \"$arg\"\n\targ=$func_stripname_result\n\t;;\n\n      -Xcompiler)\n\tprev=xcompiler\n\tcontinue\n\t;;\n\n      -Xlinker)\n\tprev=xlinker\n\tcontinue\n\t;;\n\n      -XCClinker)\n\tprev=xcclinker\n\tcontinue\n\t;;\n\n      # -msg_* for osf cc\n      -msg_*)\n\tfunc_quote_for_eval \"$arg\"\n\targ=\"$func_quote_for_eval_result\"\n\t;;\n\n      # -64, -mips[0-9] enable 64-bit mode on the SGI compiler\n      # -r[0-9][0-9]* specifies the processor on the SGI compiler\n      # -xarch=*, -xtarget=* enable 64-bit mode on the Sun compiler\n      # +DA*, +DD* enable 64-bit mode on the HP compiler\n      # -q* pass through compiler args for the IBM compiler\n      # -m*, -t[45]*, -txscale* pass through architecture-specific\n      # compiler args for GCC\n      # -F/path gives path to uninstalled frameworks, gcc on darwin\n      # -p, -pg, --coverage, -fprofile-* pass through profiling flag for GCC\n      # @file GCC response files\n      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \\\n      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*)\n        func_quote_for_eval \"$arg\"\n\targ=\"$func_quote_for_eval_result\"\n        func_append compile_command \" $arg\"\n        func_append finalize_command \" $arg\"\n        compiler_flags=\"$compiler_flags $arg\"\n        continue\n        ;;\n\n      # Some other compiler flag.\n      -* | +*)\n        func_quote_for_eval \"$arg\"\n\targ=\"$func_quote_for_eval_result\"\n\t;;\n\n      *.$objext)\n\t# A standard object.\n\tobjs=\"$objs $arg\"\n\t;;\n\n      *.lo)\n\t# A libtool-controlled object.\n\n\t# Check to see that this really is a libtool object.\n\tif func_lalib_unsafe_p \"$arg\"; then\n\t  pic_object=\n\t  non_pic_object=\n\n\t  # Read the .lo file\n\t  func_source \"$arg\"\n\n\t  if test -z \"$pic_object\" ||\n\t     test -z \"$non_pic_object\" ||\n\t     test \"$pic_object\" = none &&\n\t     test \"$non_pic_object\" = none; then\n\t    func_fatal_error \"cannot find name of object for \\`$arg'\"\n\t  fi\n\n\t  # Extract subdirectory from the argument.\n\t  func_dirname \"$arg\" \"/\" \"\"\n\t  xdir=\"$func_dirname_result\"\n\n\t  if test \"$pic_object\" != none; then\n\t    # Prepend the subdirectory the object is found in.\n\t    pic_object=\"$xdir$pic_object\"\n\n\t    if test \"$prev\" = dlfiles; then\n\t      if test \"$build_libtool_libs\" = yes && test \"$dlopen_support\" = yes; then\n\t\tdlfiles=\"$dlfiles $pic_object\"\n\t\tprev=\n\t\tcontinue\n\t      else\n\t\t# If libtool objects are unsupported, then we need to preload.\n\t\tprev=dlprefiles\n\t      fi\n\t    fi\n\n\t    # CHECK ME:  I think I busted this.  -Ossama\n\t    if test \"$prev\" = dlprefiles; then\n\t      # Preload the old-style object.\n\t      dlprefiles=\"$dlprefiles $pic_object\"\n\t      prev=\n\t    fi\n\n\t    # A PIC object.\n\t    func_append libobjs \" $pic_object\"\n\t    arg=\"$pic_object\"\n\t  fi\n\n\t  # Non-PIC object.\n\t  if test \"$non_pic_object\" != none; then\n\t    # Prepend the subdirectory the object is found in.\n\t    non_pic_object=\"$xdir$non_pic_object\"\n\n\t    # A standard non-PIC object\n\t    func_append non_pic_objects \" $non_pic_object\"\n\t    if test -z \"$pic_object\" || test \"$pic_object\" = none ; then\n\t      arg=\"$non_pic_object\"\n\t    fi\n\t  else\n\t    # If the PIC object exists, use it instead.\n\t    # $xdir was prepended to $pic_object above.\n\t    non_pic_object=\"$pic_object\"\n\t    func_append non_pic_objects \" $non_pic_object\"\n\t  fi\n\telse\n\t  # Only an error if not doing a dry-run.\n\t  if $opt_dry_run; then\n\t    # Extract subdirectory from the argument.\n\t    func_dirname \"$arg\" \"/\" \"\"\n\t    xdir=\"$func_dirname_result\"\n\n\t    func_lo2o \"$arg\"\n\t    pic_object=$xdir$objdir/$func_lo2o_result\n\t    non_pic_object=$xdir$func_lo2o_result\n\t    func_append libobjs \" $pic_object\"\n\t    func_append non_pic_objects \" $non_pic_object\"\n\t  else\n\t    func_fatal_error \"\\`$arg' is not a valid libtool object\"\n\t  fi\n\tfi\n\t;;\n\n      *.$libext)\n\t# An archive.\n\tdeplibs=\"$deplibs $arg\"\n\told_deplibs=\"$old_deplibs $arg\"\n\tcontinue\n\t;;\n\n      *.la)\n\t# A libtool-controlled library.\n\n\tif test \"$prev\" = dlfiles; then\n\t  # This library was specified with -dlopen.\n\t  dlfiles=\"$dlfiles $arg\"\n\t  prev=\n\telif test \"$prev\" = dlprefiles; then\n\t  # The library was specified with -dlpreopen.\n\t  dlprefiles=\"$dlprefiles $arg\"\n\t  prev=\n\telse\n\t  deplibs=\"$deplibs $arg\"\n\tfi\n\tcontinue\n\t;;\n\n      # Some other compiler argument.\n      *)\n\t# Unknown arguments in both finalize_command and compile_command need\n\t# to be aesthetically quoted because they are evaled later.\n\tfunc_quote_for_eval \"$arg\"\n\targ=\"$func_quote_for_eval_result\"\n\t;;\n      esac # arg\n\n      # Now actually substitute the argument into the commands.\n      if test -n \"$arg\"; then\n\tfunc_append compile_command \" $arg\"\n\tfunc_append finalize_command \" $arg\"\n      fi\n    done # argument parsing loop\n\n    test -n \"$prev\" && \\\n      func_fatal_help \"the \\`$prevarg' option requires an argument\"\n\n    if test \"$export_dynamic\" = yes && test -n \"$export_dynamic_flag_spec\"; then\n      eval arg=\\\"$export_dynamic_flag_spec\\\"\n      func_append compile_command \" $arg\"\n      func_append finalize_command \" $arg\"\n    fi\n\n    oldlibs=\n    # calculate the name of the file, without its directory\n    func_basename \"$output\"\n    outputname=\"$func_basename_result\"\n    libobjs_save=\"$libobjs\"\n\n    if test -n \"$shlibpath_var\"; then\n      # get the directories listed in $shlibpath_var\n      eval shlib_search_path=\\`\\$ECHO \\\"X\\${$shlibpath_var}\\\" \\| \\$Xsed -e \\'s/:/ /g\\'\\`\n    else\n      shlib_search_path=\n    fi\n    eval sys_lib_search_path=\\\"$sys_lib_search_path_spec\\\"\n    eval sys_lib_dlsearch_path=\\\"$sys_lib_dlsearch_path_spec\\\"\n\n    func_dirname \"$output\" \"/\" \"\"\n    output_objdir=\"$func_dirname_result$objdir\"\n    # Create the object directory.\n    func_mkdir_p \"$output_objdir\"\n\n    # Determine the type of output\n    case $output in\n    \"\")\n      func_fatal_help \"you must specify an output file\"\n      ;;\n    *.$libext) linkmode=oldlib ;;\n    *.lo | *.$objext) linkmode=obj ;;\n    *.la) linkmode=lib ;;\n    *) linkmode=prog ;; # Anything else should be a program.\n    esac\n\n    specialdeplibs=\n\n    libs=\n    # Find all interdependent deplibs by searching for libraries\n    # that are linked more than once (e.g. -la -lb -la)\n    for deplib in $deplibs; do\n      if $opt_duplicate_deps ; then\n\tcase \"$libs \" in\n\t*\" $deplib \"*) specialdeplibs=\"$specialdeplibs $deplib\" ;;\n\tesac\n      fi\n      libs=\"$libs $deplib\"\n    done\n\n    if test \"$linkmode\" = lib; then\n      libs=\"$predeps $libs $compiler_lib_search_path $postdeps\"\n\n      # Compute libraries that are listed more than once in $predeps\n      # $postdeps and mark them as special (i.e., whose duplicates are\n      # not to be eliminated).\n      pre_post_deps=\n      if $opt_duplicate_compiler_generated_deps; then\n\tfor pre_post_dep in $predeps $postdeps; do\n\t  case \"$pre_post_deps \" in\n\t  *\" $pre_post_dep \"*) specialdeplibs=\"$specialdeplibs $pre_post_deps\" ;;\n\t  esac\n\t  pre_post_deps=\"$pre_post_deps $pre_post_dep\"\n\tdone\n      fi\n      pre_post_deps=\n    fi\n\n    deplibs=\n    newdependency_libs=\n    newlib_search_path=\n    need_relink=no # whether we're linking any uninstalled libtool libraries\n    notinst_deplibs= # not-installed libtool libraries\n    notinst_path= # paths that contain not-installed libtool libraries\n\n    case $linkmode in\n    lib)\n\tpasses=\"conv dlpreopen link\"\n\tfor file in $dlfiles $dlprefiles; do\n\t  case $file in\n\t  *.la) ;;\n\t  *)\n\t    func_fatal_help \"libraries can \\`-dlopen' only libtool libraries: $file\"\n\t    ;;\n\t  esac\n\tdone\n\t;;\n    prog)\n\tcompile_deplibs=\n\tfinalize_deplibs=\n\talldeplibs=no\n\tnewdlfiles=\n\tnewdlprefiles=\n\tpasses=\"conv scan dlopen dlpreopen link\"\n\t;;\n    *)  passes=\"conv\"\n\t;;\n    esac\n\n    for pass in $passes; do\n      # The preopen pass in lib mode reverses $deplibs; put it back here\n      # so that -L comes before libs that need it for instance...\n      if test \"$linkmode,$pass\" = \"lib,link\"; then\n\t## FIXME: Find the place where the list is rebuilt in the wrong\n\t##        order, and fix it there properly\n        tmp_deplibs=\n\tfor deplib in $deplibs; do\n\t  tmp_deplibs=\"$deplib $tmp_deplibs\"\n\tdone\n\tdeplibs=\"$tmp_deplibs\"\n      fi\n\n      if test \"$linkmode,$pass\" = \"lib,link\" ||\n\t test \"$linkmode,$pass\" = \"prog,scan\"; then\n\tlibs=\"$deplibs\"\n\tdeplibs=\n      fi\n      if test \"$linkmode\" = prog; then\n\tcase $pass in\n\tdlopen) libs=\"$dlfiles\" ;;\n\tdlpreopen) libs=\"$dlprefiles\" ;;\n\tlink)\n\t  libs=\"$deplibs %DEPLIBS%\"\n\t  test \"X$link_all_deplibs\" != Xno && libs=\"$libs $dependency_libs\"\n\t  ;;\n\tesac\n      fi\n      if test \"$linkmode,$pass\" = \"lib,dlpreopen\"; then\n\t# Collect and forward deplibs of preopened libtool libs\n\tfor lib in $dlprefiles; do\n\t  # Ignore non-libtool-libs\n\t  dependency_libs=\n\t  case $lib in\n\t  *.la)\tfunc_source \"$lib\" ;;\n\t  esac\n\n\t  # Collect preopened libtool deplibs, except any this library\n\t  # has declared as weak libs\n\t  for deplib in $dependency_libs; do\n            deplib_base=`$ECHO \"X$deplib\" | $Xsed -e \"$basename\"`\n\t    case \" $weak_libs \" in\n\t    *\" $deplib_base \"*) ;;\n\t    *) deplibs=\"$deplibs $deplib\" ;;\n\t    esac\n\t  done\n\tdone\n\tlibs=\"$dlprefiles\"\n      fi\n      if test \"$pass\" = dlopen; then\n\t# Collect dlpreopened libraries\n\tsave_deplibs=\"$deplibs\"\n\tdeplibs=\n      fi\n\n      for deplib in $libs; do\n\tlib=\n\tfound=no\n\tcase $deplib in\n\t-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe|-threads)\n\t  if test \"$linkmode,$pass\" = \"prog,link\"; then\n\t    compile_deplibs=\"$deplib $compile_deplibs\"\n\t    finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t  else\n\t    compiler_flags=\"$compiler_flags $deplib\"\n\t    if test \"$linkmode\" = lib ; then\n\t\tcase \"$new_inherited_linker_flags \" in\n\t\t    *\" $deplib \"*) ;;\n\t\t    * ) new_inherited_linker_flags=\"$new_inherited_linker_flags $deplib\" ;;\n\t\tesac\n\t    fi\n\t  fi\n\t  continue\n\t  ;;\n\t-l*)\n\t  if test \"$linkmode\" != lib && test \"$linkmode\" != prog; then\n\t    func_warning \"\\`-l' is ignored for archives/objects\"\n\t    continue\n\t  fi\n\t  func_stripname '-l' '' \"$deplib\"\n\t  name=$func_stripname_result\n\t  if test \"$linkmode\" = lib; then\n\t    searchdirs=\"$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path\"\n\t  else\n\t    searchdirs=\"$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path\"\n\t  fi\n\t  for searchdir in $searchdirs; do\n\t    for search_ext in .la $std_shrext .so .a; do\n\t      # Search the libtool library\n\t      lib=\"$searchdir/lib${name}${search_ext}\"\n\t      if test -f \"$lib\"; then\n\t\tif test \"$search_ext\" = \".la\"; then\n\t\t  found=yes\n\t\telse\n\t\t  found=no\n\t\tfi\n\t\tbreak 2\n\t      fi\n\t    done\n\t  done\n\t  if test \"$found\" != yes; then\n\t    # deplib doesn't seem to be a libtool library\n\t    if test \"$linkmode,$pass\" = \"prog,link\"; then\n\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t    else\n\t      deplibs=\"$deplib $deplibs\"\n\t      test \"$linkmode\" = lib && newdependency_libs=\"$deplib $newdependency_libs\"\n\t    fi\n\t    continue\n\t  else # deplib is a libtool library\n\t    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,\n\t    # We need to do some special things here, and not later.\n\t    if test \"X$allow_libtool_libs_with_static_runtimes\" = \"Xyes\" ; then\n\t      case \" $predeps $postdeps \" in\n\t      *\" $deplib \"*)\n\t\tif func_lalib_p \"$lib\"; then\n\t\t  library_names=\n\t\t  old_library=\n\t\t  func_source \"$lib\"\n\t\t  for l in $old_library $library_names; do\n\t\t    ll=\"$l\"\n\t\t  done\n\t\t  if test \"X$ll\" = \"X$old_library\" ; then # only static version available\n\t\t    found=no\n\t\t    func_dirname \"$lib\" \"\" \".\"\n\t\t    ladir=\"$func_dirname_result\"\n\t\t    lib=$ladir/$old_library\n\t\t    if test \"$linkmode,$pass\" = \"prog,link\"; then\n\t\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t\t    else\n\t\t      deplibs=\"$deplib $deplibs\"\n\t\t      test \"$linkmode\" = lib && newdependency_libs=\"$deplib $newdependency_libs\"\n\t\t    fi\n\t\t    continue\n\t\t  fi\n\t\tfi\n\t\t;;\n\t      *) ;;\n\t      esac\n\t    fi\n\t  fi\n\t  ;; # -l\n\t*.ltframework)\n\t  if test \"$linkmode,$pass\" = \"prog,link\"; then\n\t    compile_deplibs=\"$deplib $compile_deplibs\"\n\t    finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t  else\n\t    deplibs=\"$deplib $deplibs\"\n\t    if test \"$linkmode\" = lib ; then\n\t\tcase \"$new_inherited_linker_flags \" in\n\t\t    *\" $deplib \"*) ;;\n\t\t    * ) new_inherited_linker_flags=\"$new_inherited_linker_flags $deplib\" ;;\n\t\tesac\n\t    fi\n\t  fi\n\t  continue\n\t  ;;\n\t-L*)\n\t  case $linkmode in\n\t  lib)\n\t    deplibs=\"$deplib $deplibs\"\n\t    test \"$pass\" = conv && continue\n\t    newdependency_libs=\"$deplib $newdependency_libs\"\n\t    func_stripname '-L' '' \"$deplib\"\n\t    newlib_search_path=\"$newlib_search_path $func_stripname_result\"\n\t    ;;\n\t  prog)\n\t    if test \"$pass\" = conv; then\n\t      deplibs=\"$deplib $deplibs\"\n\t      continue\n\t    fi\n\t    if test \"$pass\" = scan; then\n\t      deplibs=\"$deplib $deplibs\"\n\t    else\n\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t    fi\n\t    func_stripname '-L' '' \"$deplib\"\n\t    newlib_search_path=\"$newlib_search_path $func_stripname_result\"\n\t    ;;\n\t  *)\n\t    func_warning \"\\`-L' is ignored for archives/objects\"\n\t    ;;\n\t  esac # linkmode\n\t  continue\n\t  ;; # -L\n\t-R*)\n\t  if test \"$pass\" = link; then\n\t    func_stripname '-R' '' \"$deplib\"\n\t    dir=$func_stripname_result\n\t    # Make sure the xrpath contains only unique directories.\n\t    case \"$xrpath \" in\n\t    *\" $dir \"*) ;;\n\t    *) xrpath=\"$xrpath $dir\" ;;\n\t    esac\n\t  fi\n\t  deplibs=\"$deplib $deplibs\"\n\t  continue\n\t  ;;\n\t*.la) lib=\"$deplib\" ;;\n\t*.$libext)\n\t  if test \"$pass\" = conv; then\n\t    deplibs=\"$deplib $deplibs\"\n\t    continue\n\t  fi\n\t  case $linkmode in\n\t  lib)\n\t    # Linking convenience modules into shared libraries is allowed,\n\t    # but linking other static libraries is non-portable.\n\t    case \" $dlpreconveniencelibs \" in\n\t    *\" $deplib \"*) ;;\n\t    *)\n\t      valid_a_lib=no\n\t      case $deplibs_check_method in\n\t\tmatch_pattern*)\n\t\t  set dummy $deplibs_check_method; shift\n\t\t  match_pattern_regex=`expr \"$deplibs_check_method\" : \"$1 \\(.*\\)\"`\n\t\t  if eval \"\\$ECHO \\\"X$deplib\\\"\" 2>/dev/null | $Xsed -e 10q \\\n\t\t    | $EGREP \"$match_pattern_regex\" > /dev/null; then\n\t\t    valid_a_lib=yes\n\t\t  fi\n\t\t;;\n\t\tpass_all)\n\t\t  valid_a_lib=yes\n\t\t;;\n\t      esac\n\t      if test \"$valid_a_lib\" != yes; then\n\t\t$ECHO\n\t\t$ECHO \"*** Warning: Trying to link with static lib archive $deplib.\"\n\t\t$ECHO \"*** I have the capability to make that library automatically link in when\"\n\t\t$ECHO \"*** you link to this library.  But I can only do this if you have a\"\n\t\t$ECHO \"*** shared version of the library, which you do not appear to have\"\n\t\t$ECHO \"*** because the file extensions .$libext of this argument makes me believe\"\n\t\t$ECHO \"*** that it is just a static archive that I should not use here.\"\n\t      else\n\t\t$ECHO\n\t\t$ECHO \"*** Warning: Linking the shared library $output against the\"\n\t\t$ECHO \"*** static library $deplib is not portable!\"\n\t\tdeplibs=\"$deplib $deplibs\"\n\t      fi\n\t      ;;\n\t    esac\n\t    continue\n\t    ;;\n\t  prog)\n\t    if test \"$pass\" != link; then\n\t      deplibs=\"$deplib $deplibs\"\n\t    else\n\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t    fi\n\t    continue\n\t    ;;\n\t  esac # linkmode\n\t  ;; # *.$libext\n\t*.lo | *.$objext)\n\t  if test \"$pass\" = conv; then\n\t    deplibs=\"$deplib $deplibs\"\n\t  elif test \"$linkmode\" = prog; then\n\t    if test \"$pass\" = dlpreopen || test \"$dlopen_support\" != yes || test \"$build_libtool_libs\" = no; then\n\t      # If there is no dlopen support or we're linking statically,\n\t      # we need to preload.\n\t      newdlprefiles=\"$newdlprefiles $deplib\"\n\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t    else\n\t      newdlfiles=\"$newdlfiles $deplib\"\n\t    fi\n\t  fi\n\t  continue\n\t  ;;\n\t%DEPLIBS%)\n\t  alldeplibs=yes\n\t  continue\n\t  ;;\n\tesac # case $deplib\n\n\tif test \"$found\" = yes || test -f \"$lib\"; then :\n\telse\n\t  func_fatal_error \"cannot find the library \\`$lib' or unhandled argument \\`$deplib'\"\n\tfi\n\n\t# Check to see that this really is a libtool archive.\n\tfunc_lalib_unsafe_p \"$lib\" \\\n\t  || func_fatal_error \"\\`$lib' is not a valid libtool archive\"\n\n\tfunc_dirname \"$lib\" \"\" \".\"\n\tladir=\"$func_dirname_result\"\n\n\tdlname=\n\tdlopen=\n\tdlpreopen=\n\tlibdir=\n\tlibrary_names=\n\told_library=\n\tinherited_linker_flags=\n\t# If the library was installed with an old release of libtool,\n\t# it will not redefine variables installed, or shouldnotlink\n\tinstalled=yes\n\tshouldnotlink=no\n\tavoidtemprpath=\n\n\n\t# Read the .la file\n\tfunc_source \"$lib\"\n\n\t# Convert \"-framework foo\" to \"foo.ltframework\"\n\tif test -n \"$inherited_linker_flags\"; then\n\t  tmp_inherited_linker_flags=`$ECHO \"X$inherited_linker_flags\" | $Xsed -e 's/-framework \\([^ $]*\\)/\\1.ltframework/g'`\n\t  for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do\n\t    case \" $new_inherited_linker_flags \" in\n\t      *\" $tmp_inherited_linker_flag \"*) ;;\n\t      *) new_inherited_linker_flags=\"$new_inherited_linker_flags $tmp_inherited_linker_flag\";;\n\t    esac\n\t  done\n\tfi\n\tdependency_libs=`$ECHO \"X $dependency_libs\" | $Xsed -e 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\tif test \"$linkmode,$pass\" = \"lib,link\" ||\n\t   test \"$linkmode,$pass\" = \"prog,scan\" ||\n\t   { test \"$linkmode\" != prog && test \"$linkmode\" != lib; }; then\n\t  test -n \"$dlopen\" && dlfiles=\"$dlfiles $dlopen\"\n\t  test -n \"$dlpreopen\" && dlprefiles=\"$dlprefiles $dlpreopen\"\n\tfi\n\n\tif test \"$pass\" = conv; then\n\t  # Only check for convenience libraries\n\t  deplibs=\"$lib $deplibs\"\n\t  if test -z \"$libdir\"; then\n\t    if test -z \"$old_library\"; then\n\t      func_fatal_error \"cannot find name of link library for \\`$lib'\"\n\t    fi\n\t    # It is a libtool convenience library, so add in its objects.\n\t    convenience=\"$convenience $ladir/$objdir/$old_library\"\n\t    old_convenience=\"$old_convenience $ladir/$objdir/$old_library\"\n\t    tmp_libs=\n\t    for deplib in $dependency_libs; do\n\t      deplibs=\"$deplib $deplibs\"\n\t      if $opt_duplicate_deps ; then\n\t\tcase \"$tmp_libs \" in\n\t\t*\" $deplib \"*) specialdeplibs=\"$specialdeplibs $deplib\" ;;\n\t\tesac\n\t      fi\n\t      tmp_libs=\"$tmp_libs $deplib\"\n\t    done\n\t  elif test \"$linkmode\" != prog && test \"$linkmode\" != lib; then\n\t    func_fatal_error \"\\`$lib' is not a convenience library\"\n\t  fi\n\t  continue\n\tfi # $pass = conv\n\n\n\t# Get the name of the library we link against.\n\tlinklib=\n\tfor l in $old_library $library_names; do\n\t  linklib=\"$l\"\n\tdone\n\tif test -z \"$linklib\"; then\n\t  func_fatal_error \"cannot find name of link library for \\`$lib'\"\n\tfi\n\n\t# This library was specified with -dlopen.\n\tif test \"$pass\" = dlopen; then\n\t  if test -z \"$libdir\"; then\n\t    func_fatal_error \"cannot -dlopen a convenience library: \\`$lib'\"\n\t  fi\n\t  if test -z \"$dlname\" ||\n\t     test \"$dlopen_support\" != yes ||\n\t     test \"$build_libtool_libs\" = no; then\n\t    # If there is no dlname, no dlopen support or we're linking\n\t    # statically, we need to preload.  We also need to preload any\n\t    # dependent libraries so libltdl's deplib preloader doesn't\n\t    # bomb out in the load deplibs phase.\n\t    dlprefiles=\"$dlprefiles $lib $dependency_libs\"\n\t  else\n\t    newdlfiles=\"$newdlfiles $lib\"\n\t  fi\n\t  continue\n\tfi # $pass = dlopen\n\n\t# We need an absolute path.\n\tcase $ladir in\n\t[\\\\/]* | [A-Za-z]:[\\\\/]*) abs_ladir=\"$ladir\" ;;\n\t*)\n\t  abs_ladir=`cd \"$ladir\" && pwd`\n\t  if test -z \"$abs_ladir\"; then\n\t    func_warning \"cannot determine absolute directory name of \\`$ladir'\"\n\t    func_warning \"passing it literally to the linker, although it might fail\"\n\t    abs_ladir=\"$ladir\"\n\t  fi\n\t  ;;\n\tesac\n\tfunc_basename \"$lib\"\n\tlaname=\"$func_basename_result\"\n\n\t# Find the relevant object directory and library name.\n\tif test \"X$installed\" = Xyes; then\n\t  if test ! -f \"$libdir/$linklib\" && test -f \"$abs_ladir/$linklib\"; then\n\t    func_warning \"library \\`$lib' was moved.\"\n\t    dir=\"$ladir\"\n\t    absdir=\"$abs_ladir\"\n\t    libdir=\"$abs_ladir\"\n\t  else\n\t    dir=\"$libdir\"\n\t    absdir=\"$libdir\"\n\t  fi\n\t  test \"X$hardcode_automatic\" = Xyes && avoidtemprpath=yes\n\telse\n\t  if test ! -f \"$ladir/$objdir/$linklib\" && test -f \"$abs_ladir/$linklib\"; then\n\t    dir=\"$ladir\"\n\t    absdir=\"$abs_ladir\"\n\t    # Remove this search path later\n\t    notinst_path=\"$notinst_path $abs_ladir\"\n\t  else\n\t    dir=\"$ladir/$objdir\"\n\t    absdir=\"$abs_ladir/$objdir\"\n\t    # Remove this search path later\n\t    notinst_path=\"$notinst_path $abs_ladir\"\n\t  fi\n\tfi # $installed = yes\n\tfunc_stripname 'lib' '.la' \"$laname\"\n\tname=$func_stripname_result\n\n\t# This library was specified with -dlpreopen.\n\tif test \"$pass\" = dlpreopen; then\n\t  if test -z \"$libdir\" && test \"$linkmode\" = prog; then\n\t    func_fatal_error \"only libraries may -dlpreopen a convenience library: \\`$lib'\"\n\t  fi\n\t  # Prefer using a static library (so that no silly _DYNAMIC symbols\n\t  # are required to link).\n\t  if test -n \"$old_library\"; then\n\t    newdlprefiles=\"$newdlprefiles $dir/$old_library\"\n\t    # Keep a list of preopened convenience libraries to check\n\t    # that they are being used correctly in the link pass.\n\t    test -z \"$libdir\" && \\\n\t\tdlpreconveniencelibs=\"$dlpreconveniencelibs $dir/$old_library\"\n\t  # Otherwise, use the dlname, so that lt_dlopen finds it.\n\t  elif test -n \"$dlname\"; then\n\t    newdlprefiles=\"$newdlprefiles $dir/$dlname\"\n\t  else\n\t    newdlprefiles=\"$newdlprefiles $dir/$linklib\"\n\t  fi\n\tfi # $pass = dlpreopen\n\n\tif test -z \"$libdir\"; then\n\t  # Link the convenience library\n\t  if test \"$linkmode\" = lib; then\n\t    deplibs=\"$dir/$old_library $deplibs\"\n\t  elif test \"$linkmode,$pass\" = \"prog,link\"; then\n\t    compile_deplibs=\"$dir/$old_library $compile_deplibs\"\n\t    finalize_deplibs=\"$dir/$old_library $finalize_deplibs\"\n\t  else\n\t    deplibs=\"$lib $deplibs\" # used for prog,scan pass\n\t  fi\n\t  continue\n\tfi\n\n\n\tif test \"$linkmode\" = prog && test \"$pass\" != link; then\n\t  newlib_search_path=\"$newlib_search_path $ladir\"\n\t  deplibs=\"$lib $deplibs\"\n\n\t  linkalldeplibs=no\n\t  if test \"$link_all_deplibs\" != no || test -z \"$library_names\" ||\n\t     test \"$build_libtool_libs\" = no; then\n\t    linkalldeplibs=yes\n\t  fi\n\n\t  tmp_libs=\n\t  for deplib in $dependency_libs; do\n\t    case $deplib in\n\t    -L*) func_stripname '-L' '' \"$deplib\"\n\t         newlib_search_path=\"$newlib_search_path $func_stripname_result\"\n\t\t ;;\n\t    esac\n\t    # Need to link against all dependency_libs?\n\t    if test \"$linkalldeplibs\" = yes; then\n\t      deplibs=\"$deplib $deplibs\"\n\t    else\n\t      # Need to hardcode shared library paths\n\t      # or/and link against static libraries\n\t      newdependency_libs=\"$deplib $newdependency_libs\"\n\t    fi\n\t    if $opt_duplicate_deps ; then\n\t      case \"$tmp_libs \" in\n\t      *\" $deplib \"*) specialdeplibs=\"$specialdeplibs $deplib\" ;;\n\t      esac\n\t    fi\n\t    tmp_libs=\"$tmp_libs $deplib\"\n\t  done # for deplib\n\t  continue\n\tfi # $linkmode = prog...\n\n\tif test \"$linkmode,$pass\" = \"prog,link\"; then\n\t  if test -n \"$library_names\" &&\n\t     { { test \"$prefer_static_libs\" = no ||\n\t         test \"$prefer_static_libs,$installed\" = \"built,yes\"; } ||\n\t       test -z \"$old_library\"; }; then\n\t    # We need to hardcode the library path\n\t    if test -n \"$shlibpath_var\" && test -z \"$avoidtemprpath\" ; then\n\t      # Make sure the rpath contains only unique directories.\n\t      case \"$temp_rpath:\" in\n\t      *\"$absdir:\"*) ;;\n\t      *) temp_rpath=\"$temp_rpath$absdir:\" ;;\n\t      esac\n\t    fi\n\n\t    # Hardcode the library path.\n\t    # Skip directories that are in the system default run-time\n\t    # search path.\n\t    case \" $sys_lib_dlsearch_path \" in\n\t    *\" $absdir \"*) ;;\n\t    *)\n\t      case \"$compile_rpath \" in\n\t      *\" $absdir \"*) ;;\n\t      *) compile_rpath=\"$compile_rpath $absdir\"\n\t      esac\n\t      ;;\n\t    esac\n\t    case \" $sys_lib_dlsearch_path \" in\n\t    *\" $libdir \"*) ;;\n\t    *)\n\t      case \"$finalize_rpath \" in\n\t      *\" $libdir \"*) ;;\n\t      *) finalize_rpath=\"$finalize_rpath $libdir\"\n\t      esac\n\t      ;;\n\t    esac\n\t  fi # $linkmode,$pass = prog,link...\n\n\t  if test \"$alldeplibs\" = yes &&\n\t     { test \"$deplibs_check_method\" = pass_all ||\n\t       { test \"$build_libtool_libs\" = yes &&\n\t\t test -n \"$library_names\"; }; }; then\n\t    # We only need to search for static libraries\n\t    continue\n\t  fi\n\tfi\n\n\tlink_static=no # Whether the deplib will be linked statically\n\tuse_static_libs=$prefer_static_libs\n\tif test \"$use_static_libs\" = built && test \"$installed\" = yes; then\n\t  use_static_libs=no\n\tfi\n\tif test -n \"$library_names\" &&\n\t   { test \"$use_static_libs\" = no || test -z \"$old_library\"; }; then\n\t  case $host in\n\t  *cygwin* | *mingw* | *cegcc*)\n\t      # No point in relinking DLLs because paths are not encoded\n\t      notinst_deplibs=\"$notinst_deplibs $lib\"\n\t      need_relink=no\n\t    ;;\n\t  *)\n\t    if test \"$installed\" = no; then\n\t      notinst_deplibs=\"$notinst_deplibs $lib\"\n\t      need_relink=yes\n\t    fi\n\t    ;;\n\t  esac\n\t  # This is a shared library\n\n\t  # Warn about portability, can't link against -module's on some\n\t  # systems (darwin).  Don't bleat about dlopened modules though!\n\t  dlopenmodule=\"\"\n\t  for dlpremoduletest in $dlprefiles; do\n\t    if test \"X$dlpremoduletest\" = \"X$lib\"; then\n\t      dlopenmodule=\"$dlpremoduletest\"\n\t      break\n\t    fi\n\t  done\n\t  if test -z \"$dlopenmodule\" && test \"$shouldnotlink\" = yes && test \"$pass\" = link; then\n\t    $ECHO\n\t    if test \"$linkmode\" = prog; then\n\t      $ECHO \"*** Warning: Linking the executable $output against the loadable module\"\n\t    else\n\t      $ECHO \"*** Warning: Linking the shared library $output against the loadable module\"\n\t    fi\n\t    $ECHO \"*** $linklib is not portable!\"\n\t  fi\n\t  if test \"$linkmode\" = lib &&\n\t     test \"$hardcode_into_libs\" = yes; then\n\t    # Hardcode the library path.\n\t    # Skip directories that are in the system default run-time\n\t    # search path.\n\t    case \" $sys_lib_dlsearch_path \" in\n\t    *\" $absdir \"*) ;;\n\t    *)\n\t      case \"$compile_rpath \" in\n\t      *\" $absdir \"*) ;;\n\t      *) compile_rpath=\"$compile_rpath $absdir\"\n\t      esac\n\t      ;;\n\t    esac\n\t    case \" $sys_lib_dlsearch_path \" in\n\t    *\" $libdir \"*) ;;\n\t    *)\n\t      case \"$finalize_rpath \" in\n\t      *\" $libdir \"*) ;;\n\t      *) finalize_rpath=\"$finalize_rpath $libdir\"\n\t      esac\n\t      ;;\n\t    esac\n\t  fi\n\n\t  if test -n \"$old_archive_from_expsyms_cmds\"; then\n\t    # figure out the soname\n\t    set dummy $library_names\n\t    shift\n\t    realname=\"$1\"\n\t    shift\n\t    libname=`eval \"\\\\$ECHO \\\"$libname_spec\\\"\"`\n\t    # use dlname if we got it. it's perfectly good, no?\n\t    if test -n \"$dlname\"; then\n\t      soname=\"$dlname\"\n\t    elif test -n \"$soname_spec\"; then\n\t      # bleh windows\n\t      case $host in\n\t      *cygwin* | mingw* | *cegcc*)\n\t        func_arith $current - $age\n\t\tmajor=$func_arith_result\n\t\tversuffix=\"-$major\"\n\t\t;;\n\t      esac\n\t      eval soname=\\\"$soname_spec\\\"\n\t    else\n\t      soname=\"$realname\"\n\t    fi\n\n\t    # Make a new name for the extract_expsyms_cmds to use\n\t    soroot=\"$soname\"\n\t    func_basename \"$soroot\"\n\t    soname=\"$func_basename_result\"\n\t    func_stripname 'lib' '.dll' \"$soname\"\n\t    newlib=libimp-$func_stripname_result.a\n\n\t    # If the library has no export list, then create one now\n\t    if test -f \"$output_objdir/$soname-def\"; then :\n\t    else\n\t      func_verbose \"extracting exported symbol list from \\`$soname'\"\n\t      func_execute_cmds \"$extract_expsyms_cmds\" 'exit $?'\n\t    fi\n\n\t    # Create $newlib\n\t    if test -f \"$output_objdir/$newlib\"; then :; else\n\t      func_verbose \"generating import library for \\`$soname'\"\n\t      func_execute_cmds \"$old_archive_from_expsyms_cmds\" 'exit $?'\n\t    fi\n\t    # make sure the library variables are pointing to the new library\n\t    dir=$output_objdir\n\t    linklib=$newlib\n\t  fi # test -n \"$old_archive_from_expsyms_cmds\"\n\n\t  if test \"$linkmode\" = prog || test \"$mode\" != relink; then\n\t    add_shlibpath=\n\t    add_dir=\n\t    add=\n\t    lib_linked=yes\n\t    case $hardcode_action in\n\t    immediate | unsupported)\n\t      if test \"$hardcode_direct\" = no; then\n\t\tadd=\"$dir/$linklib\"\n\t\tcase $host in\n\t\t  *-*-sco3.2v5.0.[024]*) add_dir=\"-L$dir\" ;;\n\t\t  *-*-sysv4*uw2*) add_dir=\"-L$dir\" ;;\n\t\t  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \\\n\t\t    *-*-unixware7*) add_dir=\"-L$dir\" ;;\n\t\t  *-*-darwin* )\n\t\t    # if the lib is a (non-dlopened) module then we can not\n\t\t    # link against it, someone is ignoring the earlier warnings\n\t\t    if /usr/bin/file -L $add 2> /dev/null |\n\t\t\t $GREP \": [^:]* bundle\" >/dev/null ; then\n\t\t      if test \"X$dlopenmodule\" != \"X$lib\"; then\n\t\t\t$ECHO \"*** Warning: lib $linklib is a module, not a shared library\"\n\t\t\tif test -z \"$old_library\" ; then\n\t\t\t  $ECHO\n\t\t\t  $ECHO \"*** And there doesn't seem to be a static archive available\"\n\t\t\t  $ECHO \"*** The link will probably fail, sorry\"\n\t\t\telse\n\t\t\t  add=\"$dir/$old_library\"\n\t\t\tfi\n\t\t      elif test -n \"$old_library\"; then\n\t\t\tadd=\"$dir/$old_library\"\n\t\t      fi\n\t\t    fi\n\t\tesac\n\t      elif test \"$hardcode_minus_L\" = no; then\n\t\tcase $host in\n\t\t*-*-sunos*) add_shlibpath=\"$dir\" ;;\n\t\tesac\n\t\tadd_dir=\"-L$dir\"\n\t\tadd=\"-l$name\"\n\t      elif test \"$hardcode_shlibpath_var\" = no; then\n\t\tadd_shlibpath=\"$dir\"\n\t\tadd=\"-l$name\"\n\t      else\n\t\tlib_linked=no\n\t      fi\n\t      ;;\n\t    relink)\n\t      if test \"$hardcode_direct\" = yes &&\n\t         test \"$hardcode_direct_absolute\" = no; then\n\t\tadd=\"$dir/$linklib\"\n\t      elif test \"$hardcode_minus_L\" = yes; then\n\t\tadd_dir=\"-L$dir\"\n\t\t# Try looking first in the location we're being installed to.\n\t\tif test -n \"$inst_prefix_dir\"; then\n\t\t  case $libdir in\n\t\t    [\\\\/]*)\n\t\t      add_dir=\"$add_dir -L$inst_prefix_dir$libdir\"\n\t\t      ;;\n\t\t  esac\n\t\tfi\n\t\tadd=\"-l$name\"\n\t      elif test \"$hardcode_shlibpath_var\" = yes; then\n\t\tadd_shlibpath=\"$dir\"\n\t\tadd=\"-l$name\"\n\t      else\n\t\tlib_linked=no\n\t      fi\n\t      ;;\n\t    *) lib_linked=no ;;\n\t    esac\n\n\t    if test \"$lib_linked\" != yes; then\n\t      func_fatal_configuration \"unsupported hardcode properties\"\n\t    fi\n\n\t    if test -n \"$add_shlibpath\"; then\n\t      case :$compile_shlibpath: in\n\t      *\":$add_shlibpath:\"*) ;;\n\t      *) compile_shlibpath=\"$compile_shlibpath$add_shlibpath:\" ;;\n\t      esac\n\t    fi\n\t    if test \"$linkmode\" = prog; then\n\t      test -n \"$add_dir\" && compile_deplibs=\"$add_dir $compile_deplibs\"\n\t      test -n \"$add\" && compile_deplibs=\"$add $compile_deplibs\"\n\t    else\n\t      test -n \"$add_dir\" && deplibs=\"$add_dir $deplibs\"\n\t      test -n \"$add\" && deplibs=\"$add $deplibs\"\n\t      if test \"$hardcode_direct\" != yes &&\n\t\t test \"$hardcode_minus_L\" != yes &&\n\t\t test \"$hardcode_shlibpath_var\" = yes; then\n\t\tcase :$finalize_shlibpath: in\n\t\t*\":$libdir:\"*) ;;\n\t\t*) finalize_shlibpath=\"$finalize_shlibpath$libdir:\" ;;\n\t\tesac\n\t      fi\n\t    fi\n\t  fi\n\n\t  if test \"$linkmode\" = prog || test \"$mode\" = relink; then\n\t    add_shlibpath=\n\t    add_dir=\n\t    add=\n\t    # Finalize command for both is simple: just hardcode it.\n\t    if test \"$hardcode_direct\" = yes &&\n\t       test \"$hardcode_direct_absolute\" = no; then\n\t      add=\"$libdir/$linklib\"\n\t    elif test \"$hardcode_minus_L\" = yes; then\n\t      add_dir=\"-L$libdir\"\n\t      add=\"-l$name\"\n\t    elif test \"$hardcode_shlibpath_var\" = yes; then\n\t      case :$finalize_shlibpath: in\n\t      *\":$libdir:\"*) ;;\n\t      *) finalize_shlibpath=\"$finalize_shlibpath$libdir:\" ;;\n\t      esac\n\t      add=\"-l$name\"\n\t    elif test \"$hardcode_automatic\" = yes; then\n\t      if test -n \"$inst_prefix_dir\" &&\n\t\t test -f \"$inst_prefix_dir$libdir/$linklib\" ; then\n\t\tadd=\"$inst_prefix_dir$libdir/$linklib\"\n\t      else\n\t\tadd=\"$libdir/$linklib\"\n\t      fi\n\t    else\n\t      # We cannot seem to hardcode it, guess we'll fake it.\n\t      add_dir=\"-L$libdir\"\n\t      # Try looking first in the location we're being installed to.\n\t      if test -n \"$inst_prefix_dir\"; then\n\t\tcase $libdir in\n\t\t  [\\\\/]*)\n\t\t    add_dir=\"$add_dir -L$inst_prefix_dir$libdir\"\n\t\t    ;;\n\t\tesac\n\t      fi\n\t      add=\"-l$name\"\n\t    fi\n\n\t    if test \"$linkmode\" = prog; then\n\t      test -n \"$add_dir\" && finalize_deplibs=\"$add_dir $finalize_deplibs\"\n\t      test -n \"$add\" && finalize_deplibs=\"$add $finalize_deplibs\"\n\t    else\n\t      test -n \"$add_dir\" && deplibs=\"$add_dir $deplibs\"\n\t      test -n \"$add\" && deplibs=\"$add $deplibs\"\n\t    fi\n\t  fi\n\telif test \"$linkmode\" = prog; then\n\t  # Here we assume that one of hardcode_direct or hardcode_minus_L\n\t  # is not unsupported.  This is valid on all known static and\n\t  # shared platforms.\n\t  if test \"$hardcode_direct\" != unsupported; then\n\t    test -n \"$old_library\" && linklib=\"$old_library\"\n\t    compile_deplibs=\"$dir/$linklib $compile_deplibs\"\n\t    finalize_deplibs=\"$dir/$linklib $finalize_deplibs\"\n\t  else\n\t    compile_deplibs=\"-l$name -L$dir $compile_deplibs\"\n\t    finalize_deplibs=\"-l$name -L$dir $finalize_deplibs\"\n\t  fi\n\telif test \"$build_libtool_libs\" = yes; then\n\t  # Not a shared library\n\t  if test \"$deplibs_check_method\" != pass_all; then\n\t    # We're trying link a shared library against a static one\n\t    # but the system doesn't support it.\n\n\t    # Just print a warning and add the library to dependency_libs so\n\t    # that the program can be linked against the static library.\n\t    $ECHO\n\t    $ECHO \"*** Warning: This system can not link to static lib archive $lib.\"\n\t    $ECHO \"*** I have the capability to make that library automatically link in when\"\n\t    $ECHO \"*** you link to this library.  But I can only do this if you have a\"\n\t    $ECHO \"*** shared version of the library, which you do not appear to have.\"\n\t    if test \"$module\" = yes; then\n\t      $ECHO \"*** But as you try to build a module library, libtool will still create \"\n\t      $ECHO \"*** a static module, that should work as long as the dlopening application\"\n\t      $ECHO \"*** is linked with the -dlopen flag to resolve symbols at runtime.\"\n\t      if test -z \"$global_symbol_pipe\"; then\n\t\t$ECHO\n\t\t$ECHO \"*** However, this would only work if libtool was able to extract symbol\"\n\t\t$ECHO \"*** lists from a program, using \\`nm' or equivalent, but libtool could\"\n\t\t$ECHO \"*** not find such a program.  So, this module is probably useless.\"\n\t\t$ECHO \"*** \\`nm' from GNU binutils and a full rebuild may help.\"\n\t      fi\n\t      if test \"$build_old_libs\" = no; then\n\t\tbuild_libtool_libs=module\n\t\tbuild_old_libs=yes\n\t      else\n\t\tbuild_libtool_libs=no\n\t      fi\n\t    fi\n\t  else\n\t    deplibs=\"$dir/$old_library $deplibs\"\n\t    link_static=yes\n\t  fi\n\tfi # link shared/static library?\n\n\tif test \"$linkmode\" = lib; then\n\t  if test -n \"$dependency_libs\" &&\n\t     { test \"$hardcode_into_libs\" != yes ||\n\t       test \"$build_old_libs\" = yes ||\n\t       test \"$link_static\" = yes; }; then\n\t    # Extract -R from dependency_libs\n\t    temp_deplibs=\n\t    for libdir in $dependency_libs; do\n\t      case $libdir in\n\t      -R*) func_stripname '-R' '' \"$libdir\"\n\t           temp_xrpath=$func_stripname_result\n\t\t   case \" $xrpath \" in\n\t\t   *\" $temp_xrpath \"*) ;;\n\t\t   *) xrpath=\"$xrpath $temp_xrpath\";;\n\t\t   esac;;\n\t      *) temp_deplibs=\"$temp_deplibs $libdir\";;\n\t      esac\n\t    done\n\t    dependency_libs=\"$temp_deplibs\"\n\t  fi\n\n\t  newlib_search_path=\"$newlib_search_path $absdir\"\n\t  # Link against this library\n\t  test \"$link_static\" = no && newdependency_libs=\"$abs_ladir/$laname $newdependency_libs\"\n\t  # ... and its dependency_libs\n\t  tmp_libs=\n\t  for deplib in $dependency_libs; do\n\t    newdependency_libs=\"$deplib $newdependency_libs\"\n\t    if $opt_duplicate_deps ; then\n\t      case \"$tmp_libs \" in\n\t      *\" $deplib \"*) specialdeplibs=\"$specialdeplibs $deplib\" ;;\n\t      esac\n\t    fi\n\t    tmp_libs=\"$tmp_libs $deplib\"\n\t  done\n\n\t  if test \"$link_all_deplibs\" != no; then\n\t    # Add the search paths of all dependency libraries\n\t    for deplib in $dependency_libs; do\n\t      path=\n\t      case $deplib in\n\t      -L*) path=\"$deplib\" ;;\n\t      *.la)\n\t        func_dirname \"$deplib\" \"\" \".\"\n\t\tdir=\"$func_dirname_result\"\n\t\t# We need an absolute path.\n\t\tcase $dir in\n\t\t[\\\\/]* | [A-Za-z]:[\\\\/]*) absdir=\"$dir\" ;;\n\t\t*)\n\t\t  absdir=`cd \"$dir\" && pwd`\n\t\t  if test -z \"$absdir\"; then\n\t\t    func_warning \"cannot determine absolute directory name of \\`$dir'\"\n\t\t    absdir=\"$dir\"\n\t\t  fi\n\t\t  ;;\n\t\tesac\n\t\tif $GREP \"^installed=no\" $deplib > /dev/null; then\n\t\tcase $host in\n\t\t*-*-darwin*)\n\t\t  depdepl=\n\t\t  eval deplibrary_names=`${SED} -n -e 's/^library_names=\\(.*\\)$/\\1/p' $deplib`\n\t\t  if test -n \"$deplibrary_names\" ; then\n\t\t    for tmp in $deplibrary_names ; do\n\t\t      depdepl=$tmp\n\t\t    done\n\t\t    if test -f \"$absdir/$objdir/$depdepl\" ; then\n\t\t      depdepl=\"$absdir/$objdir/$depdepl\"\n\t\t      darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`\n                      if test -z \"$darwin_install_name\"; then\n                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`\n                      fi\n\t\t      compiler_flags=\"$compiler_flags ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}\"\n\t\t      linker_flags=\"$linker_flags -dylib_file ${darwin_install_name}:${depdepl}\"\n\t\t      path=\n\t\t    fi\n\t\t  fi\n\t\t  ;;\n\t\t*)\n\t\t  path=\"-L$absdir/$objdir\"\n\t\t  ;;\n\t\tesac\n\t\telse\n\t\t  eval libdir=`${SED} -n -e 's/^libdir=\\(.*\\)$/\\1/p' $deplib`\n\t\t  test -z \"$libdir\" && \\\n\t\t    func_fatal_error \"\\`$deplib' is not a valid libtool archive\"\n\t\t  test \"$absdir\" != \"$libdir\" && \\\n\t\t    func_warning \"\\`$deplib' seems to be moved\"\n\n\t\t  path=\"-L$absdir\"\n\t\tfi\n\t\t;;\n\t      esac\n\t      case \" $deplibs \" in\n\t      *\" $path \"*) ;;\n\t      *) deplibs=\"$path $deplibs\" ;;\n\t      esac\n\t    done\n\t  fi # link_all_deplibs != no\n\tfi # linkmode = lib\n      done # for deplib in $libs\n      if test \"$pass\" = link; then\n\tif test \"$linkmode\" = \"prog\"; then\n\t  compile_deplibs=\"$new_inherited_linker_flags $compile_deplibs\"\n\t  finalize_deplibs=\"$new_inherited_linker_flags $finalize_deplibs\"\n\telse\n\t  compiler_flags=\"$compiler_flags \"`$ECHO \"X $new_inherited_linker_flags\" | $Xsed -e 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\tfi\n      fi\n      dependency_libs=\"$newdependency_libs\"\n      if test \"$pass\" = dlpreopen; then\n\t# Link the dlpreopened libraries before other libraries\n\tfor deplib in $save_deplibs; do\n\t  deplibs=\"$deplib $deplibs\"\n\tdone\n      fi\n      if test \"$pass\" != dlopen; then\n\tif test \"$pass\" != conv; then\n\t  # Make sure lib_search_path contains only unique directories.\n\t  lib_search_path=\n\t  for dir in $newlib_search_path; do\n\t    case \"$lib_search_path \" in\n\t    *\" $dir \"*) ;;\n\t    *) lib_search_path=\"$lib_search_path $dir\" ;;\n\t    esac\n\t  done\n\t  newlib_search_path=\n\tfi\n\n\tif test \"$linkmode,$pass\" != \"prog,link\"; then\n\t  vars=\"deplibs\"\n\telse\n\t  vars=\"compile_deplibs finalize_deplibs\"\n\tfi\n\tfor var in $vars dependency_libs; do\n\t  # Add libraries to $var in reverse order\n\t  eval tmp_libs=\\\"\\$$var\\\"\n\t  new_libs=\n\t  for deplib in $tmp_libs; do\n\t    # FIXME: Pedantically, this is the right thing to do, so\n\t    #        that some nasty dependency loop isn't accidentally\n\t    #        broken:\n\t    #new_libs=\"$deplib $new_libs\"\n\t    # Pragmatically, this seems to cause very few problems in\n\t    # practice:\n\t    case $deplib in\n\t    -L*) new_libs=\"$deplib $new_libs\" ;;\n\t    -R*) ;;\n\t    *)\n\t      # And here is the reason: when a library appears more\n\t      # than once as an explicit dependence of a library, or\n\t      # is implicitly linked in more than once by the\n\t      # compiler, it is considered special, and multiple\n\t      # occurrences thereof are not removed.  Compare this\n\t      # with having the same library being listed as a\n\t      # dependency of multiple other libraries: in this case,\n\t      # we know (pedantically, we assume) the library does not\n\t      # need to be listed more than once, so we keep only the\n\t      # last copy.  This is not always right, but it is rare\n\t      # enough that we require users that really mean to play\n\t      # such unportable linking tricks to link the library\n\t      # using -Wl,-lname, so that libtool does not consider it\n\t      # for duplicate removal.\n\t      case \" $specialdeplibs \" in\n\t      *\" $deplib \"*) new_libs=\"$deplib $new_libs\" ;;\n\t      *)\n\t\tcase \" $new_libs \" in\n\t\t*\" $deplib \"*) ;;\n\t\t*) new_libs=\"$deplib $new_libs\" ;;\n\t\tesac\n\t\t;;\n\t      esac\n\t      ;;\n\t    esac\n\t  done\n\t  tmp_libs=\n\t  for deplib in $new_libs; do\n\t    case $deplib in\n\t    -L*)\n\t      case \" $tmp_libs \" in\n\t      *\" $deplib \"*) ;;\n\t      *) tmp_libs=\"$tmp_libs $deplib\" ;;\n\t      esac\n\t      ;;\n\t    *) tmp_libs=\"$tmp_libs $deplib\" ;;\n\t    esac\n\t  done\n\t  eval $var=\\\"$tmp_libs\\\"\n\tdone # for var\n      fi\n      # Last step: remove runtime libs from dependency_libs\n      # (they stay in deplibs)\n      tmp_libs=\n      for i in $dependency_libs ; do\n\tcase \" $predeps $postdeps $compiler_lib_search_path \" in\n\t*\" $i \"*)\n\t  i=\"\"\n\t  ;;\n\tesac\n\tif test -n \"$i\" ; then\n\t  tmp_libs=\"$tmp_libs $i\"\n\tfi\n      done\n      dependency_libs=$tmp_libs\n    done # for pass\n    if test \"$linkmode\" = prog; then\n      dlfiles=\"$newdlfiles\"\n    fi\n    if test \"$linkmode\" = prog || test \"$linkmode\" = lib; then\n      dlprefiles=\"$newdlprefiles\"\n    fi\n\n    case $linkmode in\n    oldlib)\n      if test -n \"$dlfiles$dlprefiles\" || test \"$dlself\" != no; then\n\tfunc_warning \"\\`-dlopen' is ignored for archives\"\n      fi\n\n      case \" $deplibs\" in\n      *\\ -l* | *\\ -L*)\n\tfunc_warning \"\\`-l' and \\`-L' are ignored for archives\" ;;\n      esac\n\n      test -n \"$rpath\" && \\\n\tfunc_warning \"\\`-rpath' is ignored for archives\"\n\n      test -n \"$xrpath\" && \\\n\tfunc_warning \"\\`-R' is ignored for archives\"\n\n      test -n \"$vinfo\" && \\\n\tfunc_warning \"\\`-version-info/-version-number' is ignored for archives\"\n\n      test -n \"$release\" && \\\n\tfunc_warning \"\\`-release' is ignored for archives\"\n\n      test -n \"$export_symbols$export_symbols_regex\" && \\\n\tfunc_warning \"\\`-export-symbols' is ignored for archives\"\n\n      # Now set the variables for building old libraries.\n      build_libtool_libs=no\n      oldlibs=\"$output\"\n      objs=\"$objs$old_deplibs\"\n      ;;\n\n    lib)\n      # Make sure we only generate libraries of the form `libNAME.la'.\n      case $outputname in\n      lib*)\n\tfunc_stripname 'lib' '.la' \"$outputname\"\n\tname=$func_stripname_result\n\teval shared_ext=\\\"$shrext_cmds\\\"\n\teval libname=\\\"$libname_spec\\\"\n\t;;\n      *)\n\ttest \"$module\" = no && \\\n\t  func_fatal_help \"libtool library \\`$output' must begin with \\`lib'\"\n\n\tif test \"$need_lib_prefix\" != no; then\n\t  # Add the \"lib\" prefix for modules if required\n\t  func_stripname '' '.la' \"$outputname\"\n\t  name=$func_stripname_result\n\t  eval shared_ext=\\\"$shrext_cmds\\\"\n\t  eval libname=\\\"$libname_spec\\\"\n\telse\n\t  func_stripname '' '.la' \"$outputname\"\n\t  libname=$func_stripname_result\n\tfi\n\t;;\n      esac\n\n      if test -n \"$objs\"; then\n\tif test \"$deplibs_check_method\" != pass_all; then\n\t  func_fatal_error \"cannot build libtool library \\`$output' from non-libtool objects on this host:$objs\"\n\telse\n\t  $ECHO\n\t  $ECHO \"*** Warning: Linking the shared library $output against the non-libtool\"\n\t  $ECHO \"*** objects $objs is not portable!\"\n\t  libobjs=\"$libobjs $objs\"\n\tfi\n      fi\n\n      test \"$dlself\" != no && \\\n\tfunc_warning \"\\`-dlopen self' is ignored for libtool libraries\"\n\n      set dummy $rpath\n      shift\n      test \"$#\" -gt 1 && \\\n\tfunc_warning \"ignoring multiple \\`-rpath's for a libtool library\"\n\n      install_libdir=\"$1\"\n\n      oldlibs=\n      if test -z \"$rpath\"; then\n\tif test \"$build_libtool_libs\" = yes; then\n\t  # Building a libtool convenience library.\n\t  # Some compilers have problems with a `.al' extension so\n\t  # convenience libraries should have the same extension an\n\t  # archive normally would.\n\t  oldlibs=\"$output_objdir/$libname.$libext $oldlibs\"\n\t  build_libtool_libs=convenience\n\t  build_old_libs=yes\n\tfi\n\n\ttest -n \"$vinfo\" && \\\n\t  func_warning \"\\`-version-info/-version-number' is ignored for convenience libraries\"\n\n\ttest -n \"$release\" && \\\n\t  func_warning \"\\`-release' is ignored for convenience libraries\"\n      else\n\n\t# Parse the version information argument.\n\tsave_ifs=\"$IFS\"; IFS=':'\n\tset dummy $vinfo 0 0 0\n\tshift\n\tIFS=\"$save_ifs\"\n\n\ttest -n \"$7\" && \\\n\t  func_fatal_help \"too many parameters to \\`-version-info'\"\n\n\t# convert absolute version numbers to libtool ages\n\t# this retains compatibility with .la files and attempts\n\t# to make the code below a bit more comprehensible\n\n\tcase $vinfo_number in\n\tyes)\n\t  number_major=\"$1\"\n\t  number_minor=\"$2\"\n\t  number_revision=\"$3\"\n\t  #\n\t  # There are really only two kinds -- those that\n\t  # use the current revision as the major version\n\t  # and those that subtract age and use age as\n\t  # a minor version.  But, then there is irix\n\t  # which has an extra 1 added just for fun\n\t  #\n\t  case $version_type in\n\t  darwin|linux|osf|windows|none)\n\t    func_arith $number_major + $number_minor\n\t    current=$func_arith_result\n\t    age=\"$number_minor\"\n\t    revision=\"$number_revision\"\n\t    ;;\n\t  freebsd-aout|freebsd-elf|sunos)\n\t    current=\"$number_major\"\n\t    revision=\"$number_minor\"\n\t    age=\"0\"\n\t    ;;\n\t  irix|nonstopux)\n\t    func_arith $number_major + $number_minor\n\t    current=$func_arith_result\n\t    age=\"$number_minor\"\n\t    revision=\"$number_minor\"\n\t    lt_irix_increment=no\n\t    ;;\n\t  *)\n\t    func_fatal_configuration \"$modename: unknown library version type \\`$version_type'\"\n\t    ;;\n\t  esac\n\t  ;;\n\tno)\n\t  current=\"$1\"\n\t  revision=\"$2\"\n\t  age=\"$3\"\n\t  ;;\n\tesac\n\n\t# Check that each of the things are valid numbers.\n\tcase $current in\n\t0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;\n\t*)\n\t  func_error \"CURRENT \\`$current' must be a nonnegative integer\"\n\t  func_fatal_error \"\\`$vinfo' is not valid version information\"\n\t  ;;\n\tesac\n\n\tcase $revision in\n\t0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;\n\t*)\n\t  func_error \"REVISION \\`$revision' must be a nonnegative integer\"\n\t  func_fatal_error \"\\`$vinfo' is not valid version information\"\n\t  ;;\n\tesac\n\n\tcase $age in\n\t0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;\n\t*)\n\t  func_error \"AGE \\`$age' must be a nonnegative integer\"\n\t  func_fatal_error \"\\`$vinfo' is not valid version information\"\n\t  ;;\n\tesac\n\n\tif test \"$age\" -gt \"$current\"; then\n\t  func_error \"AGE \\`$age' is greater than the current interface number \\`$current'\"\n\t  func_fatal_error \"\\`$vinfo' is not valid version information\"\n\tfi\n\n\t# Calculate the version variables.\n\tmajor=\n\tversuffix=\n\tverstring=\n\tcase $version_type in\n\tnone) ;;\n\n\tdarwin)\n\t  # Like Linux, but with the current version available in\n\t  # verstring for coding it into the library header\n\t  func_arith $current - $age\n\t  major=.$func_arith_result\n\t  versuffix=\"$major.$age.$revision\"\n\t  # Darwin ld doesn't like 0 for these options...\n\t  func_arith $current + 1\n\t  minor_current=$func_arith_result\n\t  xlcverstring=\"${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision\"\n\t  verstring=\"-compatibility_version $minor_current -current_version $minor_current.$revision\"\n\t  ;;\n\n\tfreebsd-aout)\n\t  major=\".$current\"\n\t  versuffix=\".$current.$revision\";\n\t  ;;\n\n\tfreebsd-elf)\n\t  major=\".$current\"\n\t  versuffix=\".$current\"\n\t  ;;\n\n\tirix | nonstopux)\n\t  if test \"X$lt_irix_increment\" = \"Xno\"; then\n\t    func_arith $current - $age\n\t  else\n\t    func_arith $current - $age + 1\n\t  fi\n\t  major=$func_arith_result\n\n\t  case $version_type in\n\t    nonstopux) verstring_prefix=nonstopux ;;\n\t    *)         verstring_prefix=sgi ;;\n\t  esac\n\t  verstring=\"$verstring_prefix$major.$revision\"\n\n\t  # Add in all the interfaces that we are compatible with.\n\t  loop=$revision\n\t  while test \"$loop\" -ne 0; do\n\t    func_arith $revision - $loop\n\t    iface=$func_arith_result\n\t    func_arith $loop - 1\n\t    loop=$func_arith_result\n\t    verstring=\"$verstring_prefix$major.$iface:$verstring\"\n\t  done\n\n\t  # Before this point, $major must not contain `.'.\n\t  major=.$major\n\t  versuffix=\"$major.$revision\"\n\t  ;;\n\n\tlinux)\n\t  func_arith $current - $age\n\t  major=.$func_arith_result\n\t  versuffix=\"$major.$age.$revision\"\n\t  ;;\n\n\tosf)\n\t  func_arith $current - $age\n\t  major=.$func_arith_result\n\t  versuffix=\".$current.$age.$revision\"\n\t  verstring=\"$current.$age.$revision\"\n\n\t  # Add in all the interfaces that we are compatible with.\n\t  loop=$age\n\t  while test \"$loop\" -ne 0; do\n\t    func_arith $current - $loop\n\t    iface=$func_arith_result\n\t    func_arith $loop - 1\n\t    loop=$func_arith_result\n\t    verstring=\"$verstring:${iface}.0\"\n\t  done\n\n\t  # Make executables depend on our current version.\n\t  verstring=\"$verstring:${current}.0\"\n\t  ;;\n\n\tqnx)\n\t  major=\".$current\"\n\t  versuffix=\".$current\"\n\t  ;;\n\n\tsunos)\n\t  major=\".$current\"\n\t  versuffix=\".$current.$revision\"\n\t  ;;\n\n\twindows)\n\t  # Use '-' rather than '.', since we only want one\n\t  # extension on DOS 8.3 filesystems.\n\t  func_arith $current - $age\n\t  major=$func_arith_result\n\t  versuffix=\"-$major\"\n\t  ;;\n\n\t*)\n\t  func_fatal_configuration \"unknown library version type \\`$version_type'\"\n\t  ;;\n\tesac\n\n\t# Clear the version info if we defaulted, and they specified a release.\n\tif test -z \"$vinfo\" && test -n \"$release\"; then\n\t  major=\n\t  case $version_type in\n\t  darwin)\n\t    # we can't check for \"0.0\" in archive_cmds due to quoting\n\t    # problems, so we reset it completely\n\t    verstring=\n\t    ;;\n\t  *)\n\t    verstring=\"0.0\"\n\t    ;;\n\t  esac\n\t  if test \"$need_version\" = no; then\n\t    versuffix=\n\t  else\n\t    versuffix=\".0.0\"\n\t  fi\n\tfi\n\n\t# Remove version info from name if versioning should be avoided\n\tif test \"$avoid_version\" = yes && test \"$need_version\" = no; then\n\t  major=\n\t  versuffix=\n\t  verstring=\"\"\n\tfi\n\n\t# Check to see if the archive will have undefined symbols.\n\tif test \"$allow_undefined\" = yes; then\n\t  if test \"$allow_undefined_flag\" = unsupported; then\n\t    func_warning \"undefined symbols not allowed in $host shared libraries\"\n\t    build_libtool_libs=no\n\t    build_old_libs=yes\n\t  fi\n\telse\n\t  # Don't allow undefined symbols.\n\t  allow_undefined_flag=\"$no_undefined_flag\"\n\tfi\n\n      fi\n\n      func_generate_dlsyms \"$libname\" \"$libname\" \"yes\"\n      libobjs=\"$libobjs $symfileobj\"\n      test \"X$libobjs\" = \"X \" && libobjs=\n\n      if test \"$mode\" != relink; then\n\t# Remove our outputs, but don't remove object files since they\n\t# may have been created when compiling PIC objects.\n\tremovelist=\n\ttempremovelist=`$ECHO \"$output_objdir/*\"`\n\tfor p in $tempremovelist; do\n\t  case $p in\n\t    *.$objext | *.gcno)\n\t       ;;\n\t    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)\n\t       if test \"X$precious_files_regex\" != \"X\"; then\n\t\t if $ECHO \"$p\" | $EGREP -e \"$precious_files_regex\" >/dev/null 2>&1\n\t\t then\n\t\t   continue\n\t\t fi\n\t       fi\n\t       removelist=\"$removelist $p\"\n\t       ;;\n\t    *) ;;\n\t  esac\n\tdone\n\ttest -n \"$removelist\" && \\\n\t  func_show_eval \"${RM}r \\$removelist\"\n      fi\n\n      # Now set the variables for building old libraries.\n      if test \"$build_old_libs\" = yes && test \"$build_libtool_libs\" != convenience ; then\n\toldlibs=\"$oldlibs $output_objdir/$libname.$libext\"\n\n\t# Transform .lo files to .o files.\n\toldobjs=\"$objs \"`$ECHO \"X$libobjs\" | $SP2NL | $Xsed -e '/\\.'${libext}'$/d' -e \"$lo2o\" | $NL2SP`\n      fi\n\n      # Eliminate all temporary directories.\n      #for path in $notinst_path; do\n      #\tlib_search_path=`$ECHO \"X$lib_search_path \" | $Xsed -e \"s% $path % %g\"`\n      #\tdeplibs=`$ECHO \"X$deplibs \" | $Xsed -e \"s% -L$path % %g\"`\n      #\tdependency_libs=`$ECHO \"X$dependency_libs \" | $Xsed -e \"s% -L$path % %g\"`\n      #done\n\n      if test -n \"$xrpath\"; then\n\t# If the user specified any rpath flags, then add them.\n\ttemp_xrpath=\n\tfor libdir in $xrpath; do\n\t  temp_xrpath=\"$temp_xrpath -R$libdir\"\n\t  case \"$finalize_rpath \" in\n\t  *\" $libdir \"*) ;;\n\t  *) finalize_rpath=\"$finalize_rpath $libdir\" ;;\n\t  esac\n\tdone\n\tif test \"$hardcode_into_libs\" != yes || test \"$build_old_libs\" = yes; then\n\t  dependency_libs=\"$temp_xrpath $dependency_libs\"\n\tfi\n      fi\n\n      # Make sure dlfiles contains only unique files that won't be dlpreopened\n      old_dlfiles=\"$dlfiles\"\n      dlfiles=\n      for lib in $old_dlfiles; do\n\tcase \" $dlprefiles $dlfiles \" in\n\t*\" $lib \"*) ;;\n\t*) dlfiles=\"$dlfiles $lib\" ;;\n\tesac\n      done\n\n      # Make sure dlprefiles contains only unique files\n      old_dlprefiles=\"$dlprefiles\"\n      dlprefiles=\n      for lib in $old_dlprefiles; do\n\tcase \"$dlprefiles \" in\n\t*\" $lib \"*) ;;\n\t*) dlprefiles=\"$dlprefiles $lib\" ;;\n\tesac\n      done\n\n      if test \"$build_libtool_libs\" = yes; then\n\tif test -n \"$rpath\"; then\n\t  case $host in\n\t  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc*)\n\t    # these systems don't actually have a c library (as such)!\n\t    ;;\n\t  *-*-rhapsody* | *-*-darwin1.[012])\n\t    # Rhapsody C library is in the System framework\n\t    deplibs=\"$deplibs System.ltframework\"\n\t    ;;\n\t  *-*-netbsd*)\n\t    # Don't link with libc until the a.out ld.so is fixed.\n\t    ;;\n\t  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)\n\t    # Do not include libc due to us having libc/libc_r.\n\t    ;;\n\t  *-*-sco3.2v5* | *-*-sco5v6*)\n\t    # Causes problems with __ctype\n\t    ;;\n\t  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)\n\t    # Compiler inserts libc in the correct place for threads to work\n\t    ;;\n\t  *)\n\t    # Add libc to deplibs on all other systems if necessary.\n\t    if test \"$build_libtool_need_lc\" = \"yes\"; then\n\t      deplibs=\"$deplibs -lc\"\n\t    fi\n\t    ;;\n\t  esac\n\tfi\n\n\t# Transform deplibs into only deplibs that can be linked in shared.\n\tname_save=$name\n\tlibname_save=$libname\n\trelease_save=$release\n\tversuffix_save=$versuffix\n\tmajor_save=$major\n\t# I'm not sure if I'm treating the release correctly.  I think\n\t# release should show up in the -l (ie -lgmp5) so we don't want to\n\t# add it in twice.  Is that correct?\n\trelease=\"\"\n\tversuffix=\"\"\n\tmajor=\"\"\n\tnewdeplibs=\n\tdroppeddeps=no\n\tcase $deplibs_check_method in\n\tpass_all)\n\t  # Don't check for shared/static.  Everything works.\n\t  # This might be a little naive.  We might want to check\n\t  # whether the library exists or not.  But this is on\n\t  # osf3 & osf4 and I'm not really sure... Just\n\t  # implementing what was already the behavior.\n\t  newdeplibs=$deplibs\n\t  ;;\n\ttest_compile)\n\t  # This code stresses the \"libraries are programs\" paradigm to its\n\t  # limits. Maybe even breaks it.  We compile a program, linking it\n\t  # against the deplibs as a proxy for the library.  Then we can check\n\t  # whether they linked in statically or dynamically with ldd.\n\t  $opt_dry_run || $RM conftest.c\n\t  cat > conftest.c <<EOF\n\t  int main() { return 0; }\nEOF\n\t  $opt_dry_run || $RM conftest\n\t  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then\n\t    ldd_output=`ldd conftest`\n\t    for i in $deplibs; do\n\t      case $i in\n\t      -l*)\n\t\tfunc_stripname -l '' \"$i\"\n\t\tname=$func_stripname_result\n\t\tif test \"X$allow_libtool_libs_with_static_runtimes\" = \"Xyes\" ; then\n\t\t  case \" $predeps $postdeps \" in\n\t\t  *\" $i \"*)\n\t\t    newdeplibs=\"$newdeplibs $i\"\n\t\t    i=\"\"\n\t\t    ;;\n\t\t  esac\n\t\tfi\n\t\tif test -n \"$i\" ; then\n\t\t  libname=`eval \"\\\\$ECHO \\\"$libname_spec\\\"\"`\n\t\t  deplib_matches=`eval \"\\\\$ECHO \\\"$library_names_spec\\\"\"`\n\t\t  set dummy $deplib_matches; shift\n\t\t  deplib_match=$1\n\t\t  if test `expr \"$ldd_output\" : \".*$deplib_match\"` -ne 0 ; then\n\t\t    newdeplibs=\"$newdeplibs $i\"\n\t\t  else\n\t\t    droppeddeps=yes\n\t\t    $ECHO\n\t\t    $ECHO \"*** Warning: dynamic linker does not accept needed library $i.\"\n\t\t    $ECHO \"*** I have the capability to make that library automatically link in when\"\n\t\t    $ECHO \"*** you link to this library.  But I can only do this if you have a\"\n\t\t    $ECHO \"*** shared version of the library, which I believe you do not have\"\n\t\t    $ECHO \"*** because a test_compile did reveal that the linker did not use it for\"\n\t\t    $ECHO \"*** its dynamic dependency list that programs get resolved with at runtime.\"\n\t\t  fi\n\t\tfi\n\t\t;;\n\t      *)\n\t\tnewdeplibs=\"$newdeplibs $i\"\n\t\t;;\n\t      esac\n\t    done\n\t  else\n\t    # Error occurred in the first compile.  Let's try to salvage\n\t    # the situation: Compile a separate program for each library.\n\t    for i in $deplibs; do\n\t      case $i in\n\t      -l*)\n\t\tfunc_stripname -l '' \"$i\"\n\t\tname=$func_stripname_result\n\t\t$opt_dry_run || $RM conftest\n\t\tif $LTCC $LTCFLAGS -o conftest conftest.c $i; then\n\t\t  ldd_output=`ldd conftest`\n\t\t  if test \"X$allow_libtool_libs_with_static_runtimes\" = \"Xyes\" ; then\n\t\t    case \" $predeps $postdeps \" in\n\t\t    *\" $i \"*)\n\t\t      newdeplibs=\"$newdeplibs $i\"\n\t\t      i=\"\"\n\t\t      ;;\n\t\t    esac\n\t\t  fi\n\t\t  if test -n \"$i\" ; then\n\t\t    libname=`eval \"\\\\$ECHO \\\"$libname_spec\\\"\"`\n\t\t    deplib_matches=`eval \"\\\\$ECHO \\\"$library_names_spec\\\"\"`\n\t\t    set dummy $deplib_matches; shift\n\t\t    deplib_match=$1\n\t\t    if test `expr \"$ldd_output\" : \".*$deplib_match\"` -ne 0 ; then\n\t\t      newdeplibs=\"$newdeplibs $i\"\n\t\t    else\n\t\t      droppeddeps=yes\n\t\t      $ECHO\n\t\t      $ECHO \"*** Warning: dynamic linker does not accept needed library $i.\"\n\t\t      $ECHO \"*** I have the capability to make that library automatically link in when\"\n\t\t      $ECHO \"*** you link to this library.  But I can only do this if you have a\"\n\t\t      $ECHO \"*** shared version of the library, which you do not appear to have\"\n\t\t      $ECHO \"*** because a test_compile did reveal that the linker did not use this one\"\n\t\t      $ECHO \"*** as a dynamic dependency that programs can get resolved with at runtime.\"\n\t\t    fi\n\t\t  fi\n\t\telse\n\t\t  droppeddeps=yes\n\t\t  $ECHO\n\t\t  $ECHO \"*** Warning!  Library $i is needed by this library but I was not able to\"\n\t\t  $ECHO \"*** make it link in!  You will probably need to install it or some\"\n\t\t  $ECHO \"*** library that it depends on before this library will be fully\"\n\t\t  $ECHO \"*** functional.  Installing it before continuing would be even better.\"\n\t\tfi\n\t\t;;\n\t      *)\n\t\tnewdeplibs=\"$newdeplibs $i\"\n\t\t;;\n\t      esac\n\t    done\n\t  fi\n\t  ;;\n\tfile_magic*)\n\t  set dummy $deplibs_check_method; shift\n\t  file_magic_regex=`expr \"$deplibs_check_method\" : \"$1 \\(.*\\)\"`\n\t  for a_deplib in $deplibs; do\n\t    case $a_deplib in\n\t    -l*)\n\t      func_stripname -l '' \"$a_deplib\"\n\t      name=$func_stripname_result\n\t      if test \"X$allow_libtool_libs_with_static_runtimes\" = \"Xyes\" ; then\n\t\tcase \" $predeps $postdeps \" in\n\t\t*\" $a_deplib \"*)\n\t\t  newdeplibs=\"$newdeplibs $a_deplib\"\n\t\t  a_deplib=\"\"\n\t\t  ;;\n\t\tesac\n\t      fi\n\t      if test -n \"$a_deplib\" ; then\n\t\tlibname=`eval \"\\\\$ECHO \\\"$libname_spec\\\"\"`\n\t\tfor i in $lib_search_path $sys_lib_search_path $shlib_search_path; do\n\t\t  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`\n\t\t  for potent_lib in $potential_libs; do\n\t\t      # Follow soft links.\n\t\t      if ls -lLd \"$potent_lib\" 2>/dev/null |\n\t\t\t $GREP \" -> \" >/dev/null; then\n\t\t\tcontinue\n\t\t      fi\n\t\t      # The statement above tries to avoid entering an\n\t\t      # endless loop below, in case of cyclic links.\n\t\t      # We might still enter an endless loop, since a link\n\t\t      # loop can be closed while we follow links,\n\t\t      # but so what?\n\t\t      potlib=\"$potent_lib\"\n\t\t      while test -h \"$potlib\" 2>/dev/null; do\n\t\t\tpotliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`\n\t\t\tcase $potliblink in\n\t\t\t[\\\\/]* | [A-Za-z]:[\\\\/]*) potlib=\"$potliblink\";;\n\t\t\t*) potlib=`$ECHO \"X$potlib\" | $Xsed -e 's,[^/]*$,,'`\"$potliblink\";;\n\t\t\tesac\n\t\t      done\n\t\t      if eval $file_magic_cmd \\\"\\$potlib\\\" 2>/dev/null |\n\t\t\t $SED -e 10q |\n\t\t\t $EGREP \"$file_magic_regex\" > /dev/null; then\n\t\t\tnewdeplibs=\"$newdeplibs $a_deplib\"\n\t\t\ta_deplib=\"\"\n\t\t\tbreak 2\n\t\t      fi\n\t\t  done\n\t\tdone\n\t      fi\n\t      if test -n \"$a_deplib\" ; then\n\t\tdroppeddeps=yes\n\t\t$ECHO\n\t\t$ECHO \"*** Warning: linker path does not have real file for library $a_deplib.\"\n\t\t$ECHO \"*** I have the capability to make that library automatically link in when\"\n\t\t$ECHO \"*** you link to this library.  But I can only do this if you have a\"\n\t\t$ECHO \"*** shared version of the library, which you do not appear to have\"\n\t\t$ECHO \"*** because I did check the linker path looking for a file starting\"\n\t\tif test -z \"$potlib\" ; then\n\t\t  $ECHO \"*** with $libname but no candidates were found. (...for file magic test)\"\n\t\telse\n\t\t  $ECHO \"*** with $libname and none of the candidates passed a file format test\"\n\t\t  $ECHO \"*** using a file magic. Last file checked: $potlib\"\n\t\tfi\n\t      fi\n\t      ;;\n\t    *)\n\t      # Add a -L argument.\n\t      newdeplibs=\"$newdeplibs $a_deplib\"\n\t      ;;\n\t    esac\n\t  done # Gone through all deplibs.\n\t  ;;\n\tmatch_pattern*)\n\t  set dummy $deplibs_check_method; shift\n\t  match_pattern_regex=`expr \"$deplibs_check_method\" : \"$1 \\(.*\\)\"`\n\t  for a_deplib in $deplibs; do\n\t    case $a_deplib in\n\t    -l*)\n\t      func_stripname -l '' \"$a_deplib\"\n\t      name=$func_stripname_result\n\t      if test \"X$allow_libtool_libs_with_static_runtimes\" = \"Xyes\" ; then\n\t\tcase \" $predeps $postdeps \" in\n\t\t*\" $a_deplib \"*)\n\t\t  newdeplibs=\"$newdeplibs $a_deplib\"\n\t\t  a_deplib=\"\"\n\t\t  ;;\n\t\tesac\n\t      fi\n\t      if test -n \"$a_deplib\" ; then\n\t\tlibname=`eval \"\\\\$ECHO \\\"$libname_spec\\\"\"`\n\t\tfor i in $lib_search_path $sys_lib_search_path $shlib_search_path; do\n\t\t  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`\n\t\t  for potent_lib in $potential_libs; do\n\t\t    potlib=\"$potent_lib\" # see symlink-check above in file_magic test\n\t\t    if eval \"\\$ECHO \\\"X$potent_lib\\\"\" 2>/dev/null | $Xsed -e 10q | \\\n\t\t       $EGREP \"$match_pattern_regex\" > /dev/null; then\n\t\t      newdeplibs=\"$newdeplibs $a_deplib\"\n\t\t      a_deplib=\"\"\n\t\t      break 2\n\t\t    fi\n\t\t  done\n\t\tdone\n\t      fi\n\t      if test -n \"$a_deplib\" ; then\n\t\tdroppeddeps=yes\n\t\t$ECHO\n\t\t$ECHO \"*** Warning: linker path does not have real file for library $a_deplib.\"\n\t\t$ECHO \"*** I have the capability to make that library automatically link in when\"\n\t\t$ECHO \"*** you link to this library.  But I can only do this if you have a\"\n\t\t$ECHO \"*** shared version of the library, which you do not appear to have\"\n\t\t$ECHO \"*** because I did check the linker path looking for a file starting\"\n\t\tif test -z \"$potlib\" ; then\n\t\t  $ECHO \"*** with $libname but no candidates were found. (...for regex pattern test)\"\n\t\telse\n\t\t  $ECHO \"*** with $libname and none of the candidates passed a file format test\"\n\t\t  $ECHO \"*** using a regex pattern. Last file checked: $potlib\"\n\t\tfi\n\t      fi\n\t      ;;\n\t    *)\n\t      # Add a -L argument.\n\t      newdeplibs=\"$newdeplibs $a_deplib\"\n\t      ;;\n\t    esac\n\t  done # Gone through all deplibs.\n\t  ;;\n\tnone | unknown | *)\n\t  newdeplibs=\"\"\n\t  tmp_deplibs=`$ECHO \"X $deplibs\" | $Xsed \\\n\t      -e 's/ -lc$//' -e 's/ -[LR][^ ]*//g'`\n\t  if test \"X$allow_libtool_libs_with_static_runtimes\" = \"Xyes\" ; then\n\t    for i in $predeps $postdeps ; do\n\t      # can't use Xsed below, because $i might contain '/'\n\t      tmp_deplibs=`$ECHO \"X $tmp_deplibs\" | $Xsed -e \"s,$i,,\"`\n\t    done\n\t  fi\n\t  if $ECHO \"X $tmp_deplibs\" | $Xsed -e 's/[\t ]//g' |\n\t     $GREP . >/dev/null; then\n\t    $ECHO\n\t    if test \"X$deplibs_check_method\" = \"Xnone\"; then\n\t      $ECHO \"*** Warning: inter-library dependencies are not supported in this platform.\"\n\t    else\n\t      $ECHO \"*** Warning: inter-library dependencies are not known to be supported.\"\n\t    fi\n\t    $ECHO \"*** All declared inter-library dependencies are being dropped.\"\n\t    droppeddeps=yes\n\t  fi\n\t  ;;\n\tesac\n\tversuffix=$versuffix_save\n\tmajor=$major_save\n\trelease=$release_save\n\tlibname=$libname_save\n\tname=$name_save\n\n\tcase $host in\n\t*-*-rhapsody* | *-*-darwin1.[012])\n\t  # On Rhapsody replace the C library with the System framework\n\t  newdeplibs=`$ECHO \"X $newdeplibs\" | $Xsed -e 's/ -lc / System.ltframework /'`\n\t  ;;\n\tesac\n\n\tif test \"$droppeddeps\" = yes; then\n\t  if test \"$module\" = yes; then\n\t    $ECHO\n\t    $ECHO \"*** Warning: libtool could not satisfy all declared inter-library\"\n\t    $ECHO \"*** dependencies of module $libname.  Therefore, libtool will create\"\n\t    $ECHO \"*** a static module, that should work as long as the dlopening\"\n\t    $ECHO \"*** application is linked with the -dlopen flag.\"\n\t    if test -z \"$global_symbol_pipe\"; then\n\t      $ECHO\n\t      $ECHO \"*** However, this would only work if libtool was able to extract symbol\"\n\t      $ECHO \"*** lists from a program, using \\`nm' or equivalent, but libtool could\"\n\t      $ECHO \"*** not find such a program.  So, this module is probably useless.\"\n\t      $ECHO \"*** \\`nm' from GNU binutils and a full rebuild may help.\"\n\t    fi\n\t    if test \"$build_old_libs\" = no; then\n\t      oldlibs=\"$output_objdir/$libname.$libext\"\n\t      build_libtool_libs=module\n\t      build_old_libs=yes\n\t    else\n\t      build_libtool_libs=no\n\t    fi\n\t  else\n\t    $ECHO \"*** The inter-library dependencies that have been dropped here will be\"\n\t    $ECHO \"*** automatically added whenever a program is linked with this library\"\n\t    $ECHO \"*** or is declared to -dlopen it.\"\n\n\t    if test \"$allow_undefined\" = no; then\n\t      $ECHO\n\t      $ECHO \"*** Since this library must not contain undefined symbols,\"\n\t      $ECHO \"*** because either the platform does not support them or\"\n\t      $ECHO \"*** it was explicitly requested with -no-undefined,\"\n\t      $ECHO \"*** libtool will only create a static version of it.\"\n\t      if test \"$build_old_libs\" = no; then\n\t\toldlibs=\"$output_objdir/$libname.$libext\"\n\t\tbuild_libtool_libs=module\n\t\tbuild_old_libs=yes\n\t      else\n\t\tbuild_libtool_libs=no\n\t      fi\n\t    fi\n\t  fi\n\tfi\n\t# Done checking deplibs!\n\tdeplibs=$newdeplibs\n      fi\n      # Time to change all our \"foo.ltframework\" stuff back to \"-framework foo\"\n      case $host in\n\t*-*-darwin*)\n\t  newdeplibs=`$ECHO \"X $newdeplibs\" | $Xsed -e 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\t  new_inherited_linker_flags=`$ECHO \"X $new_inherited_linker_flags\" | $Xsed -e 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\t  deplibs=`$ECHO \"X $deplibs\" | $Xsed -e 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\t  ;;\n      esac\n\n      # move library search paths that coincide with paths to not yet\n      # installed libraries to the beginning of the library search list\n      new_libs=\n      for path in $notinst_path; do\n\tcase \" $new_libs \" in\n\t*\" -L$path/$objdir \"*) ;;\n\t*)\n\t  case \" $deplibs \" in\n\t  *\" -L$path/$objdir \"*)\n\t    new_libs=\"$new_libs -L$path/$objdir\" ;;\n\t  esac\n\t  ;;\n\tesac\n      done\n      for deplib in $deplibs; do\n\tcase $deplib in\n\t-L*)\n\t  case \" $new_libs \" in\n\t  *\" $deplib \"*) ;;\n\t  *) new_libs=\"$new_libs $deplib\" ;;\n\t  esac\n\t  ;;\n\t*) new_libs=\"$new_libs $deplib\" ;;\n\tesac\n      done\n      deplibs=\"$new_libs\"\n\n      # All the library-specific variables (install_libdir is set above).\n      library_names=\n      old_library=\n      dlname=\n\n      # Test again, we may have decided not to build it any more\n      if test \"$build_libtool_libs\" = yes; then\n\tif test \"$hardcode_into_libs\" = yes; then\n\t  # Hardcode the library paths\n\t  hardcode_libdirs=\n\t  dep_rpath=\n\t  rpath=\"$finalize_rpath\"\n\t  test \"$mode\" != relink && rpath=\"$compile_rpath$rpath\"\n\t  for libdir in $rpath; do\n\t    if test -n \"$hardcode_libdir_flag_spec\"; then\n\t      if test -n \"$hardcode_libdir_separator\"; then\n\t\tif test -z \"$hardcode_libdirs\"; then\n\t\t  hardcode_libdirs=\"$libdir\"\n\t\telse\n\t\t  # Just accumulate the unique libdirs.\n\t\t  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in\n\t\t  *\"$hardcode_libdir_separator$libdir$hardcode_libdir_separator\"*)\n\t\t    ;;\n\t\t  *)\n\t\t    hardcode_libdirs=\"$hardcode_libdirs$hardcode_libdir_separator$libdir\"\n\t\t    ;;\n\t\t  esac\n\t\tfi\n\t      else\n\t\teval flag=\\\"$hardcode_libdir_flag_spec\\\"\n\t\tdep_rpath=\"$dep_rpath $flag\"\n\t      fi\n\t    elif test -n \"$runpath_var\"; then\n\t      case \"$perm_rpath \" in\n\t      *\" $libdir \"*) ;;\n\t      *) perm_rpath=\"$perm_rpath $libdir\" ;;\n\t      esac\n\t    fi\n\t  done\n\t  # Substitute the hardcoded libdirs into the rpath.\n\t  if test -n \"$hardcode_libdir_separator\" &&\n\t     test -n \"$hardcode_libdirs\"; then\n\t    libdir=\"$hardcode_libdirs\"\n\t    if test -n \"$hardcode_libdir_flag_spec_ld\"; then\n\t      eval dep_rpath=\\\"$hardcode_libdir_flag_spec_ld\\\"\n\t    else\n\t      eval dep_rpath=\\\"$hardcode_libdir_flag_spec\\\"\n\t    fi\n\t  fi\n\t  if test -n \"$runpath_var\" && test -n \"$perm_rpath\"; then\n\t    # We should set the runpath_var.\n\t    rpath=\n\t    for dir in $perm_rpath; do\n\t      rpath=\"$rpath$dir:\"\n\t    done\n\t    eval \"$runpath_var='$rpath\\$$runpath_var'; export $runpath_var\"\n\t  fi\n\t  test -n \"$dep_rpath\" && deplibs=\"$dep_rpath $deplibs\"\n\tfi\n\n\tshlibpath=\"$finalize_shlibpath\"\n\ttest \"$mode\" != relink && shlibpath=\"$compile_shlibpath$shlibpath\"\n\tif test -n \"$shlibpath\"; then\n\t  eval \"$shlibpath_var='$shlibpath\\$$shlibpath_var'; export $shlibpath_var\"\n\tfi\n\n\t# Get the real and link names of the library.\n\teval shared_ext=\\\"$shrext_cmds\\\"\n\teval library_names=\\\"$library_names_spec\\\"\n\tset dummy $library_names\n\tshift\n\trealname=\"$1\"\n\tshift\n\n\tif test -n \"$soname_spec\"; then\n\t  eval soname=\\\"$soname_spec\\\"\n\telse\n\t  soname=\"$realname\"\n\tfi\n\tif test -z \"$dlname\"; then\n\t  dlname=$soname\n\tfi\n\n\tlib=\"$output_objdir/$realname\"\n\tlinknames=\n\tfor link\n\tdo\n\t  linknames=\"$linknames $link\"\n\tdone\n\n\t# Use standard objects if they are pic\n\ttest -z \"$pic_flag\" && libobjs=`$ECHO \"X$libobjs\" | $SP2NL | $Xsed -e \"$lo2o\" | $NL2SP`\n\ttest \"X$libobjs\" = \"X \" && libobjs=\n\n\tdelfiles=\n\tif test -n \"$export_symbols\" && test -n \"$include_expsyms\"; then\n\t  $opt_dry_run || cp \"$export_symbols\" \"$output_objdir/$libname.uexp\"\n\t  export_symbols=\"$output_objdir/$libname.uexp\"\n\t  delfiles=\"$delfiles $export_symbols\"\n\tfi\n\n\torig_export_symbols=\n\tcase $host_os in\n\tcygwin* | mingw* | cegcc*)\n\t  if test -n \"$export_symbols\" && test -z \"$export_symbols_regex\"; then\n\t    # exporting using user supplied symfile\n\t    if test \"x`$SED 1q $export_symbols`\" != xEXPORTS; then\n\t      # and it's NOT already a .def file. Must figure out\n\t      # which of the given symbols are data symbols and tag\n\t      # them as such. So, trigger use of export_symbols_cmds.\n\t      # export_symbols gets reassigned inside the \"prepare\n\t      # the list of exported symbols\" if statement, so the\n\t      # include_expsyms logic still works.\n\t      orig_export_symbols=\"$export_symbols\"\n\t      export_symbols=\n\t      always_export_symbols=yes\n\t    fi\n\t  fi\n\t  ;;\n\tesac\n\n\t# Prepare the list of exported symbols\n\tif test -z \"$export_symbols\"; then\n\t  if test \"$always_export_symbols\" = yes || test -n \"$export_symbols_regex\"; then\n\t    func_verbose \"generating symbol list for \\`$libname.la'\"\n\t    export_symbols=\"$output_objdir/$libname.exp\"\n\t    $opt_dry_run || $RM $export_symbols\n\t    cmds=$export_symbols_cmds\n\t    save_ifs=\"$IFS\"; IFS='~'\n\t    for cmd in $cmds; do\n\t      IFS=\"$save_ifs\"\n\t      eval cmd=\\\"$cmd\\\"\n\t      func_len \" $cmd\"\n\t      len=$func_len_result\n\t      if test \"$len\" -lt \"$max_cmd_len\" || test \"$max_cmd_len\" -le -1; then\n\t\tfunc_show_eval \"$cmd\" 'exit $?'\n\t\tskipped_export=false\n\t      else\n\t\t# The command line is too long to execute in one step.\n\t\tfunc_verbose \"using reloadable object file for export list...\"\n\t\tskipped_export=:\n\t\t# Break out early, otherwise skipped_export may be\n\t\t# set to false by a later but shorter cmd.\n\t\tbreak\n\t      fi\n\t    done\n\t    IFS=\"$save_ifs\"\n\t    if test -n \"$export_symbols_regex\" && test \"X$skipped_export\" != \"X:\"; then\n\t      func_show_eval '$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"'\n\t      func_show_eval '$MV \"${export_symbols}T\" \"$export_symbols\"'\n\t    fi\n\t  fi\n\tfi\n\n\tif test -n \"$export_symbols\" && test -n \"$include_expsyms\"; then\n\t  tmp_export_symbols=\"$export_symbols\"\n\t  test -n \"$orig_export_symbols\" && tmp_export_symbols=\"$orig_export_symbols\"\n\t  $opt_dry_run || eval '$ECHO \"X$include_expsyms\" | $Xsed | $SP2NL >> \"$tmp_export_symbols\"'\n\tfi\n\n\tif test \"X$skipped_export\" != \"X:\" && test -n \"$orig_export_symbols\"; then\n\t  # The given exports_symbols file has to be filtered, so filter it.\n\t  func_verbose \"filter symbol list for \\`$libname.la' to tag DATA exports\"\n\t  # FIXME: $output_objdir/$libname.filter potentially contains lots of\n\t  # 's' commands which not all seds can handle. GNU sed should be fine\n\t  # though. Also, the filter scales superlinearly with the number of\n\t  # global variables. join(1) would be nice here, but unfortunately\n\t  # isn't a blessed tool.\n\t  $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\\(.*\\)\\([ \\,].*\\),s|^\\1$|\\1\\2|,' < $export_symbols > $output_objdir/$libname.filter\n\t  delfiles=\"$delfiles $export_symbols $output_objdir/$libname.filter\"\n\t  export_symbols=$output_objdir/$libname.def\n\t  $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols\n\tfi\n\n\ttmp_deplibs=\n\tfor test_deplib in $deplibs; do\n\t  case \" $convenience \" in\n\t  *\" $test_deplib \"*) ;;\n\t  *)\n\t    tmp_deplibs=\"$tmp_deplibs $test_deplib\"\n\t    ;;\n\t  esac\n\tdone\n\tdeplibs=\"$tmp_deplibs\"\n\n\tif test -n \"$convenience\"; then\n\t  if test -n \"$whole_archive_flag_spec\" &&\n\t    test \"$compiler_needs_object\" = yes &&\n\t    test -z \"$libobjs\"; then\n\t    # extract the archives, so we have objects to list.\n\t    # TODO: could optimize this to just extract one archive.\n\t    whole_archive_flag_spec=\n\t  fi\n\t  if test -n \"$whole_archive_flag_spec\"; then\n\t    save_libobjs=$libobjs\n\t    eval libobjs=\\\"\\$libobjs $whole_archive_flag_spec\\\"\n\t    test \"X$libobjs\" = \"X \" && libobjs=\n\t  else\n\t    gentop=\"$output_objdir/${outputname}x\"\n\t    generated=\"$generated $gentop\"\n\n\t    func_extract_archives $gentop $convenience\n\t    libobjs=\"$libobjs $func_extract_archives_result\"\n\t    test \"X$libobjs\" = \"X \" && libobjs=\n\t  fi\n\tfi\n\n\tif test \"$thread_safe\" = yes && test -n \"$thread_safe_flag_spec\"; then\n\t  eval flag=\\\"$thread_safe_flag_spec\\\"\n\t  linker_flags=\"$linker_flags $flag\"\n\tfi\n\n\t# Make a backup of the uninstalled library when relinking\n\tif test \"$mode\" = relink; then\n\t  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?\n\tfi\n\n\t# Do each of the archive commands.\n\tif test \"$module\" = yes && test -n \"$module_cmds\" ; then\n\t  if test -n \"$export_symbols\" && test -n \"$module_expsym_cmds\"; then\n\t    eval test_cmds=\\\"$module_expsym_cmds\\\"\n\t    cmds=$module_expsym_cmds\n\t  else\n\t    eval test_cmds=\\\"$module_cmds\\\"\n\t    cmds=$module_cmds\n\t  fi\n\telse\n\t  if test -n \"$export_symbols\" && test -n \"$archive_expsym_cmds\"; then\n\t    eval test_cmds=\\\"$archive_expsym_cmds\\\"\n\t    cmds=$archive_expsym_cmds\n\t  else\n\t    eval test_cmds=\\\"$archive_cmds\\\"\n\t    cmds=$archive_cmds\n\t  fi\n\tfi\n\n\tif test \"X$skipped_export\" != \"X:\" &&\n\t   func_len \" $test_cmds\" &&\n\t   len=$func_len_result &&\n\t   test \"$len\" -lt \"$max_cmd_len\" || test \"$max_cmd_len\" -le -1; then\n\t  :\n\telse\n\t  # The command line is too long to link in one step, link piecewise\n\t  # or, if using GNU ld and skipped_export is not :, use a linker\n\t  # script.\n\n\t  # Save the value of $output and $libobjs because we want to\n\t  # use them later.  If we have whole_archive_flag_spec, we\n\t  # want to use save_libobjs as it was before\n\t  # whole_archive_flag_spec was expanded, because we can't\n\t  # assume the linker understands whole_archive_flag_spec.\n\t  # This may have to be revisited, in case too many\n\t  # convenience libraries get linked in and end up exceeding\n\t  # the spec.\n\t  if test -z \"$convenience\" || test -z \"$whole_archive_flag_spec\"; then\n\t    save_libobjs=$libobjs\n\t  fi\n\t  save_output=$output\n\t  output_la=`$ECHO \"X$output\" | $Xsed -e \"$basename\"`\n\n\t  # Clear the reloadable object creation command queue and\n\t  # initialize k to one.\n\t  test_cmds=\n\t  concat_cmds=\n\t  objlist=\n\t  last_robj=\n\t  k=1\n\n\t  if test -n \"$save_libobjs\" && test \"X$skipped_export\" != \"X:\" && test \"$with_gnu_ld\" = yes; then\n\t    output=${output_objdir}/${output_la}.lnkscript\n\t    func_verbose \"creating GNU ld script: $output\"\n\t    $ECHO 'INPUT (' > $output\n\t    for obj in $save_libobjs\n\t    do\n\t      $ECHO \"$obj\" >> $output\n\t    done\n\t    $ECHO ')' >> $output\n\t    delfiles=\"$delfiles $output\"\n\t  elif test -n \"$save_libobjs\" && test \"X$skipped_export\" != \"X:\" && test \"X$file_list_spec\" != X; then\n\t    output=${output_objdir}/${output_la}.lnk\n\t    func_verbose \"creating linker input file list: $output\"\n\t    : > $output\n\t    set x $save_libobjs\n\t    shift\n\t    firstobj=\n\t    if test \"$compiler_needs_object\" = yes; then\n\t      firstobj=\"$1 \"\n\t      shift\n\t    fi\n\t    for obj\n\t    do\n\t      $ECHO \"$obj\" >> $output\n\t    done\n\t    delfiles=\"$delfiles $output\"\n\t    output=$firstobj\\\"$file_list_spec$output\\\"\n\t  else\n\t    if test -n \"$save_libobjs\"; then\n\t      func_verbose \"creating reloadable object files...\"\n\t      output=$output_objdir/$output_la-${k}.$objext\n\t      eval test_cmds=\\\"$reload_cmds\\\"\n\t      func_len \" $test_cmds\"\n\t      len0=$func_len_result\n\t      len=$len0\n\n\t      # Loop over the list of objects to be linked.\n\t      for obj in $save_libobjs\n\t      do\n\t\tfunc_len \" $obj\"\n\t\tfunc_arith $len + $func_len_result\n\t\tlen=$func_arith_result\n\t\tif test \"X$objlist\" = X ||\n\t\t   test \"$len\" -lt \"$max_cmd_len\"; then\n\t\t  func_append objlist \" $obj\"\n\t\telse\n\t\t  # The command $test_cmds is almost too long, add a\n\t\t  # command to the queue.\n\t\t  if test \"$k\" -eq 1 ; then\n\t\t    # The first file doesn't have a previous command to add.\n\t\t    eval concat_cmds=\\\"$reload_cmds $objlist $last_robj\\\"\n\t\t  else\n\t\t    # All subsequent reloadable object files will link in\n\t\t    # the last one created.\n\t\t    eval concat_cmds=\\\"\\$concat_cmds~$reload_cmds $objlist $last_robj~\\$RM $last_robj\\\"\n\t\t  fi\n\t\t  last_robj=$output_objdir/$output_la-${k}.$objext\n\t\t  func_arith $k + 1\n\t\t  k=$func_arith_result\n\t\t  output=$output_objdir/$output_la-${k}.$objext\n\t\t  objlist=$obj\n\t\t  func_len \" $last_robj\"\n\t\t  func_arith $len0 + $func_len_result\n\t\t  len=$func_arith_result\n\t\tfi\n\t      done\n\t      # Handle the remaining objects by creating one last\n\t      # reloadable object file.  All subsequent reloadable object\n\t      # files will link in the last one created.\n\t      test -z \"$concat_cmds\" || concat_cmds=$concat_cmds~\n\t      eval concat_cmds=\\\"\\${concat_cmds}$reload_cmds $objlist $last_robj\\\"\n\t      if test -n \"$last_robj\"; then\n\t        eval concat_cmds=\\\"\\${concat_cmds}~\\$RM $last_robj\\\"\n\t      fi\n\t      delfiles=\"$delfiles $output\"\n\n\t    else\n\t      output=\n\t    fi\n\n\t    if ${skipped_export-false}; then\n\t      func_verbose \"generating symbol list for \\`$libname.la'\"\n\t      export_symbols=\"$output_objdir/$libname.exp\"\n\t      $opt_dry_run || $RM $export_symbols\n\t      libobjs=$output\n\t      # Append the command to create the export file.\n\t      test -z \"$concat_cmds\" || concat_cmds=$concat_cmds~\n\t      eval concat_cmds=\\\"\\$concat_cmds$export_symbols_cmds\\\"\n\t      if test -n \"$last_robj\"; then\n\t\teval concat_cmds=\\\"\\$concat_cmds~\\$RM $last_robj\\\"\n\t      fi\n\t    fi\n\n\t    test -n \"$save_libobjs\" &&\n\t      func_verbose \"creating a temporary reloadable object file: $output\"\n\n\t    # Loop through the commands generated above and execute them.\n\t    save_ifs=\"$IFS\"; IFS='~'\n\t    for cmd in $concat_cmds; do\n\t      IFS=\"$save_ifs\"\n\t      $opt_silent || {\n\t\t  func_quote_for_expand \"$cmd\"\n\t\t  eval \"func_echo $func_quote_for_expand_result\"\n\t      }\n\t      $opt_dry_run || eval \"$cmd\" || {\n\t\tlt_exit=$?\n\n\t\t# Restore the uninstalled library and exit\n\t\tif test \"$mode\" = relink; then\n\t\t  ( cd \"$output_objdir\" && \\\n\t\t    $RM \"${realname}T\" && \\\n\t\t    $MV \"${realname}U\" \"$realname\" )\n\t\tfi\n\n\t\texit $lt_exit\n\t      }\n\t    done\n\t    IFS=\"$save_ifs\"\n\n\t    if test -n \"$export_symbols_regex\" && ${skipped_export-false}; then\n\t      func_show_eval '$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"'\n\t      func_show_eval '$MV \"${export_symbols}T\" \"$export_symbols\"'\n\t    fi\n\t  fi\n\n          if ${skipped_export-false}; then\n\t    if test -n \"$export_symbols\" && test -n \"$include_expsyms\"; then\n\t      tmp_export_symbols=\"$export_symbols\"\n\t      test -n \"$orig_export_symbols\" && tmp_export_symbols=\"$orig_export_symbols\"\n\t      $opt_dry_run || eval '$ECHO \"X$include_expsyms\" | $Xsed | $SP2NL >> \"$tmp_export_symbols\"'\n\t    fi\n\n\t    if test -n \"$orig_export_symbols\"; then\n\t      # The given exports_symbols file has to be filtered, so filter it.\n\t      func_verbose \"filter symbol list for \\`$libname.la' to tag DATA exports\"\n\t      # FIXME: $output_objdir/$libname.filter potentially contains lots of\n\t      # 's' commands which not all seds can handle. GNU sed should be fine\n\t      # though. Also, the filter scales superlinearly with the number of\n\t      # global variables. join(1) would be nice here, but unfortunately\n\t      # isn't a blessed tool.\n\t      $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\\(.*\\)\\([ \\,].*\\),s|^\\1$|\\1\\2|,' < $export_symbols > $output_objdir/$libname.filter\n\t      delfiles=\"$delfiles $export_symbols $output_objdir/$libname.filter\"\n\t      export_symbols=$output_objdir/$libname.def\n\t      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols\n\t    fi\n\t  fi\n\n\t  libobjs=$output\n\t  # Restore the value of output.\n\t  output=$save_output\n\n\t  if test -n \"$convenience\" && test -n \"$whole_archive_flag_spec\"; then\n\t    eval libobjs=\\\"\\$libobjs $whole_archive_flag_spec\\\"\n\t    test \"X$libobjs\" = \"X \" && libobjs=\n\t  fi\n\t  # Expand the library linking commands again to reset the\n\t  # value of $libobjs for piecewise linking.\n\n\t  # Do each of the archive commands.\n\t  if test \"$module\" = yes && test -n \"$module_cmds\" ; then\n\t    if test -n \"$export_symbols\" && test -n \"$module_expsym_cmds\"; then\n\t      cmds=$module_expsym_cmds\n\t    else\n\t      cmds=$module_cmds\n\t    fi\n\t  else\n\t    if test -n \"$export_symbols\" && test -n \"$archive_expsym_cmds\"; then\n\t      cmds=$archive_expsym_cmds\n\t    else\n\t      cmds=$archive_cmds\n\t    fi\n\t  fi\n\tfi\n\n\tif test -n \"$delfiles\"; then\n\t  # Append the command to remove temporary files to $cmds.\n\t  eval cmds=\\\"\\$cmds~\\$RM $delfiles\\\"\n\tfi\n\n\t# Add any objects from preloaded convenience libraries\n\tif test -n \"$dlprefiles\"; then\n\t  gentop=\"$output_objdir/${outputname}x\"\n\t  generated=\"$generated $gentop\"\n\n\t  func_extract_archives $gentop $dlprefiles\n\t  libobjs=\"$libobjs $func_extract_archives_result\"\n\t  test \"X$libobjs\" = \"X \" && libobjs=\n\tfi\n\n\tsave_ifs=\"$IFS\"; IFS='~'\n\tfor cmd in $cmds; do\n\t  IFS=\"$save_ifs\"\n\t  eval cmd=\\\"$cmd\\\"\n\t  $opt_silent || {\n\t    func_quote_for_expand \"$cmd\"\n\t    eval \"func_echo $func_quote_for_expand_result\"\n\t  }\n\t  $opt_dry_run || eval \"$cmd\" || {\n\t    lt_exit=$?\n\n\t    # Restore the uninstalled library and exit\n\t    if test \"$mode\" = relink; then\n\t      ( cd \"$output_objdir\" && \\\n\t        $RM \"${realname}T\" && \\\n\t\t$MV \"${realname}U\" \"$realname\" )\n\t    fi\n\n\t    exit $lt_exit\n\t  }\n\tdone\n\tIFS=\"$save_ifs\"\n\n\t# Restore the uninstalled library and exit\n\tif test \"$mode\" = relink; then\n\t  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?\n\n\t  if test -n \"$convenience\"; then\n\t    if test -z \"$whole_archive_flag_spec\"; then\n\t      func_show_eval '${RM}r \"$gentop\"'\n\t    fi\n\t  fi\n\n\t  exit $EXIT_SUCCESS\n\tfi\n\n\t# Create links to the real library.\n\tfor linkname in $linknames; do\n\t  if test \"$realname\" != \"$linkname\"; then\n\t    func_show_eval '(cd \"$output_objdir\" && $RM \"$linkname\" && $LN_S \"$realname\" \"$linkname\")' 'exit $?'\n\t  fi\n\tdone\n\n\t# If -module or -export-dynamic was specified, set the dlname.\n\tif test \"$module\" = yes || test \"$export_dynamic\" = yes; then\n\t  # On all known operating systems, these are identical.\n\t  dlname=\"$soname\"\n\tfi\n      fi\n      ;;\n\n    obj)\n      if test -n \"$dlfiles$dlprefiles\" || test \"$dlself\" != no; then\n\tfunc_warning \"\\`-dlopen' is ignored for objects\"\n      fi\n\n      case \" $deplibs\" in\n      *\\ -l* | *\\ -L*)\n\tfunc_warning \"\\`-l' and \\`-L' are ignored for objects\" ;;\n      esac\n\n      test -n \"$rpath\" && \\\n\tfunc_warning \"\\`-rpath' is ignored for objects\"\n\n      test -n \"$xrpath\" && \\\n\tfunc_warning \"\\`-R' is ignored for objects\"\n\n      test -n \"$vinfo\" && \\\n\tfunc_warning \"\\`-version-info' is ignored for objects\"\n\n      test -n \"$release\" && \\\n\tfunc_warning \"\\`-release' is ignored for objects\"\n\n      case $output in\n      *.lo)\n\ttest -n \"$objs$old_deplibs\" && \\\n\t  func_fatal_error \"cannot build library object \\`$output' from non-libtool objects\"\n\n\tlibobj=$output\n\tfunc_lo2o \"$libobj\"\n\tobj=$func_lo2o_result\n\t;;\n      *)\n\tlibobj=\n\tobj=\"$output\"\n\t;;\n      esac\n\n      # Delete the old objects.\n      $opt_dry_run || $RM $obj $libobj\n\n      # Objects from convenience libraries.  This assumes\n      # single-version convenience libraries.  Whenever we create\n      # different ones for PIC/non-PIC, this we'll have to duplicate\n      # the extraction.\n      reload_conv_objs=\n      gentop=\n      # reload_cmds runs $LD directly, so let us get rid of\n      # -Wl from whole_archive_flag_spec and hope we can get by with\n      # turning comma into space..\n      wl=\n\n      if test -n \"$convenience\"; then\n\tif test -n \"$whole_archive_flag_spec\"; then\n\t  eval tmp_whole_archive_flags=\\\"$whole_archive_flag_spec\\\"\n\t  reload_conv_objs=$reload_objs\\ `$ECHO \"X$tmp_whole_archive_flags\" | $Xsed -e 's|,| |g'`\n\telse\n\t  gentop=\"$output_objdir/${obj}x\"\n\t  generated=\"$generated $gentop\"\n\n\t  func_extract_archives $gentop $convenience\n\t  reload_conv_objs=\"$reload_objs $func_extract_archives_result\"\n\tfi\n      fi\n\n      # Create the old-style object.\n      reload_objs=\"$objs$old_deplibs \"`$ECHO \"X$libobjs\" | $SP2NL | $Xsed -e '/\\.'${libext}$'/d' -e '/\\.lib$/d' -e \"$lo2o\" | $NL2SP`\" $reload_conv_objs\" ### testsuite: skip nested quoting test\n\n      output=\"$obj\"\n      func_execute_cmds \"$reload_cmds\" 'exit $?'\n\n      # Exit if we aren't doing a library object file.\n      if test -z \"$libobj\"; then\n\tif test -n \"$gentop\"; then\n\t  func_show_eval '${RM}r \"$gentop\"'\n\tfi\n\n\texit $EXIT_SUCCESS\n      fi\n\n      if test \"$build_libtool_libs\" != yes; then\n\tif test -n \"$gentop\"; then\n\t  func_show_eval '${RM}r \"$gentop\"'\n\tfi\n\n\t# Create an invalid libtool object if no PIC, so that we don't\n\t# accidentally link it into a program.\n\t# $show \"echo timestamp > $libobj\"\n\t# $opt_dry_run || eval \"echo timestamp > $libobj\" || exit $?\n\texit $EXIT_SUCCESS\n      fi\n\n      if test -n \"$pic_flag\" || test \"$pic_mode\" != default; then\n\t# Only do commands if we really have different PIC objects.\n\treload_objs=\"$libobjs $reload_conv_objs\"\n\toutput=\"$libobj\"\n\tfunc_execute_cmds \"$reload_cmds\" 'exit $?'\n      fi\n\n      if test -n \"$gentop\"; then\n\tfunc_show_eval '${RM}r \"$gentop\"'\n      fi\n\n      exit $EXIT_SUCCESS\n      ;;\n\n    prog)\n      case $host in\n\t*cygwin*) func_stripname '' '.exe' \"$output\"\n\t          output=$func_stripname_result.exe;;\n      esac\n      test -n \"$vinfo\" && \\\n\tfunc_warning \"\\`-version-info' is ignored for programs\"\n\n      test -n \"$release\" && \\\n\tfunc_warning \"\\`-release' is ignored for programs\"\n\n      test \"$preload\" = yes \\\n        && test \"$dlopen_support\" = unknown \\\n\t&& test \"$dlopen_self\" = unknown \\\n\t&& test \"$dlopen_self_static\" = unknown && \\\n\t  func_warning \"\\`LT_INIT([dlopen])' not used. Assuming no dlopen support.\"\n\n      case $host in\n      *-*-rhapsody* | *-*-darwin1.[012])\n\t# On Rhapsody replace the C library is the System framework\n\tcompile_deplibs=`$ECHO \"X $compile_deplibs\" | $Xsed -e 's/ -lc / System.ltframework /'`\n\tfinalize_deplibs=`$ECHO \"X $finalize_deplibs\" | $Xsed -e 's/ -lc / System.ltframework /'`\n\t;;\n      esac\n\n      case $host in\n      *-*-darwin*)\n\t# Don't allow lazy linking, it breaks C++ global constructors\n\t# But is supposedly fixed on 10.4 or later (yay!).\n\tif test \"$tagname\" = CXX ; then\n\t  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in\n\t    10.[0123])\n\t      compile_command=\"$compile_command ${wl}-bind_at_load\"\n\t      finalize_command=\"$finalize_command ${wl}-bind_at_load\"\n\t    ;;\n\t  esac\n\tfi\n\t# Time to change all our \"foo.ltframework\" stuff back to \"-framework foo\"\n\tcompile_deplibs=`$ECHO \"X $compile_deplibs\" | $Xsed -e 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\tfinalize_deplibs=`$ECHO \"X $finalize_deplibs\" | $Xsed -e 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\t;;\n      esac\n\n\n      # move library search paths that coincide with paths to not yet\n      # installed libraries to the beginning of the library search list\n      new_libs=\n      for path in $notinst_path; do\n\tcase \" $new_libs \" in\n\t*\" -L$path/$objdir \"*) ;;\n\t*)\n\t  case \" $compile_deplibs \" in\n\t  *\" -L$path/$objdir \"*)\n\t    new_libs=\"$new_libs -L$path/$objdir\" ;;\n\t  esac\n\t  ;;\n\tesac\n      done\n      for deplib in $compile_deplibs; do\n\tcase $deplib in\n\t-L*)\n\t  case \" $new_libs \" in\n\t  *\" $deplib \"*) ;;\n\t  *) new_libs=\"$new_libs $deplib\" ;;\n\t  esac\n\t  ;;\n\t*) new_libs=\"$new_libs $deplib\" ;;\n\tesac\n      done\n      compile_deplibs=\"$new_libs\"\n\n\n      compile_command=\"$compile_command $compile_deplibs\"\n      finalize_command=\"$finalize_command $finalize_deplibs\"\n\n      if test -n \"$rpath$xrpath\"; then\n\t# If the user specified any rpath flags, then add them.\n\tfor libdir in $rpath $xrpath; do\n\t  # This is the magic to use -rpath.\n\t  case \"$finalize_rpath \" in\n\t  *\" $libdir \"*) ;;\n\t  *) finalize_rpath=\"$finalize_rpath $libdir\" ;;\n\t  esac\n\tdone\n      fi\n\n      # Now hardcode the library paths\n      rpath=\n      hardcode_libdirs=\n      for libdir in $compile_rpath $finalize_rpath; do\n\tif test -n \"$hardcode_libdir_flag_spec\"; then\n\t  if test -n \"$hardcode_libdir_separator\"; then\n\t    if test -z \"$hardcode_libdirs\"; then\n\t      hardcode_libdirs=\"$libdir\"\n\t    else\n\t      # Just accumulate the unique libdirs.\n\t      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in\n\t      *\"$hardcode_libdir_separator$libdir$hardcode_libdir_separator\"*)\n\t\t;;\n\t      *)\n\t\thardcode_libdirs=\"$hardcode_libdirs$hardcode_libdir_separator$libdir\"\n\t\t;;\n\t      esac\n\t    fi\n\t  else\n\t    eval flag=\\\"$hardcode_libdir_flag_spec\\\"\n\t    rpath=\"$rpath $flag\"\n\t  fi\n\telif test -n \"$runpath_var\"; then\n\t  case \"$perm_rpath \" in\n\t  *\" $libdir \"*) ;;\n\t  *) perm_rpath=\"$perm_rpath $libdir\" ;;\n\t  esac\n\tfi\n\tcase $host in\n\t*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)\n\t  testbindir=`${ECHO} \"$libdir\" | ${SED} -e 's*/lib$*/bin*'`\n\t  case :$dllsearchpath: in\n\t  *\":$libdir:\"*) ;;\n\t  ::) dllsearchpath=$libdir;;\n\t  *) dllsearchpath=\"$dllsearchpath:$libdir\";;\n\t  esac\n\t  case :$dllsearchpath: in\n\t  *\":$testbindir:\"*) ;;\n\t  ::) dllsearchpath=$testbindir;;\n\t  *) dllsearchpath=\"$dllsearchpath:$testbindir\";;\n\t  esac\n\t  ;;\n\tesac\n      done\n      # Substitute the hardcoded libdirs into the rpath.\n      if test -n \"$hardcode_libdir_separator\" &&\n\t test -n \"$hardcode_libdirs\"; then\n\tlibdir=\"$hardcode_libdirs\"\n\teval rpath=\\\" $hardcode_libdir_flag_spec\\\"\n      fi\n      compile_rpath=\"$rpath\"\n\n      rpath=\n      hardcode_libdirs=\n      for libdir in $finalize_rpath; do\n\tif test -n \"$hardcode_libdir_flag_spec\"; then\n\t  if test -n \"$hardcode_libdir_separator\"; then\n\t    if test -z \"$hardcode_libdirs\"; then\n\t      hardcode_libdirs=\"$libdir\"\n\t    else\n\t      # Just accumulate the unique libdirs.\n\t      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in\n\t      *\"$hardcode_libdir_separator$libdir$hardcode_libdir_separator\"*)\n\t\t;;\n\t      *)\n\t\thardcode_libdirs=\"$hardcode_libdirs$hardcode_libdir_separator$libdir\"\n\t\t;;\n\t      esac\n\t    fi\n\t  else\n\t    eval flag=\\\"$hardcode_libdir_flag_spec\\\"\n\t    rpath=\"$rpath $flag\"\n\t  fi\n\telif test -n \"$runpath_var\"; then\n\t  case \"$finalize_perm_rpath \" in\n\t  *\" $libdir \"*) ;;\n\t  *) finalize_perm_rpath=\"$finalize_perm_rpath $libdir\" ;;\n\t  esac\n\tfi\n      done\n      # Substitute the hardcoded libdirs into the rpath.\n      if test -n \"$hardcode_libdir_separator\" &&\n\t test -n \"$hardcode_libdirs\"; then\n\tlibdir=\"$hardcode_libdirs\"\n\teval rpath=\\\" $hardcode_libdir_flag_spec\\\"\n      fi\n      finalize_rpath=\"$rpath\"\n\n      if test -n \"$libobjs\" && test \"$build_old_libs\" = yes; then\n\t# Transform all the library objects into standard objects.\n\tcompile_command=`$ECHO \"X$compile_command\" | $SP2NL | $Xsed -e \"$lo2o\" | $NL2SP`\n\tfinalize_command=`$ECHO \"X$finalize_command\" | $SP2NL | $Xsed -e \"$lo2o\" | $NL2SP`\n      fi\n\n      func_generate_dlsyms \"$outputname\" \"@PROGRAM@\" \"no\"\n\n      # template prelinking step\n      if test -n \"$prelink_cmds\"; then\n\tfunc_execute_cmds \"$prelink_cmds\" 'exit $?'\n      fi\n\n      wrappers_required=yes\n      case $host in\n      *cygwin* | *mingw* )\n        if test \"$build_libtool_libs\" != yes; then\n          wrappers_required=no\n        fi\n        ;;\n      *cegcc)\n        # Disable wrappers for cegcc, we are cross compiling anyway.\n        wrappers_required=no\n        ;;\n      *)\n        if test \"$need_relink\" = no || test \"$build_libtool_libs\" != yes; then\n          wrappers_required=no\n        fi\n        ;;\n      esac\n      if test \"$wrappers_required\" = no; then\n\t# Replace the output file specification.\n\tcompile_command=`$ECHO \"X$compile_command\" | $Xsed -e 's%@OUTPUT@%'\"$output\"'%g'`\n\tlink_command=\"$compile_command$compile_rpath\"\n\n\t# We have no uninstalled library dependencies, so finalize right now.\n\texit_status=0\n\tfunc_show_eval \"$link_command\" 'exit_status=$?'\n\n\t# Delete the generated files.\n\tif test -f \"$output_objdir/${outputname}S.${objext}\"; then\n\t  func_show_eval '$RM \"$output_objdir/${outputname}S.${objext}\"'\n\tfi\n\n\texit $exit_status\n      fi\n\n      if test -n \"$compile_shlibpath$finalize_shlibpath\"; then\n\tcompile_command=\"$shlibpath_var=\\\"$compile_shlibpath$finalize_shlibpath\\$$shlibpath_var\\\" $compile_command\"\n      fi\n      if test -n \"$finalize_shlibpath\"; then\n\tfinalize_command=\"$shlibpath_var=\\\"$finalize_shlibpath\\$$shlibpath_var\\\" $finalize_command\"\n      fi\n\n      compile_var=\n      finalize_var=\n      if test -n \"$runpath_var\"; then\n\tif test -n \"$perm_rpath\"; then\n\t  # We should set the runpath_var.\n\t  rpath=\n\t  for dir in $perm_rpath; do\n\t    rpath=\"$rpath$dir:\"\n\t  done\n\t  compile_var=\"$runpath_var=\\\"$rpath\\$$runpath_var\\\" \"\n\tfi\n\tif test -n \"$finalize_perm_rpath\"; then\n\t  # We should set the runpath_var.\n\t  rpath=\n\t  for dir in $finalize_perm_rpath; do\n\t    rpath=\"$rpath$dir:\"\n\t  done\n\t  finalize_var=\"$runpath_var=\\\"$rpath\\$$runpath_var\\\" \"\n\tfi\n      fi\n\n      if test \"$no_install\" = yes; then\n\t# We don't need to create a wrapper script.\n\tlink_command=\"$compile_var$compile_command$compile_rpath\"\n\t# Replace the output file specification.\n\tlink_command=`$ECHO \"X$link_command\" | $Xsed -e 's%@OUTPUT@%'\"$output\"'%g'`\n\t# Delete the old output file.\n\t$opt_dry_run || $RM $output\n\t# Link the executable and exit\n\tfunc_show_eval \"$link_command\" 'exit $?'\n\texit $EXIT_SUCCESS\n      fi\n\n      if test \"$hardcode_action\" = relink; then\n\t# Fast installation is not supported\n\tlink_command=\"$compile_var$compile_command$compile_rpath\"\n\trelink_command=\"$finalize_var$finalize_command$finalize_rpath\"\n\n\tfunc_warning \"this platform does not like uninstalled shared libraries\"\n\tfunc_warning \"\\`$output' will be relinked during installation\"\n      else\n\tif test \"$fast_install\" != no; then\n\t  link_command=\"$finalize_var$compile_command$finalize_rpath\"\n\t  if test \"$fast_install\" = yes; then\n\t    relink_command=`$ECHO \"X$compile_var$compile_command$compile_rpath\" | $Xsed -e 's%@OUTPUT@%\\$progdir/\\$file%g'`\n\t  else\n\t    # fast_install is set to needless\n\t    relink_command=\n\t  fi\n\telse\n\t  link_command=\"$compile_var$compile_command$compile_rpath\"\n\t  relink_command=\"$finalize_var$finalize_command$finalize_rpath\"\n\tfi\n      fi\n\n      # Replace the output file specification.\n      link_command=`$ECHO \"X$link_command\" | $Xsed -e 's%@OUTPUT@%'\"$output_objdir/$outputname\"'%g'`\n\n      # Delete the old output files.\n      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname\n\n      func_show_eval \"$link_command\" 'exit $?'\n\n      # Now create the wrapper script.\n      func_verbose \"creating $output\"\n\n      # Quote the relink command for shipping.\n      if test -n \"$relink_command\"; then\n\t# Preserve any variables that may affect compiler behavior\n\tfor var in $variables_saved_for_relink; do\n\t  if eval test -z \\\"\\${$var+set}\\\"; then\n\t    relink_command=\"{ test -z \\\"\\${$var+set}\\\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command\"\n\t  elif eval var_value=\\$$var; test -z \"$var_value\"; then\n\t    relink_command=\"$var=; export $var; $relink_command\"\n\t  else\n\t    func_quote_for_eval \"$var_value\"\n\t    relink_command=\"$var=$func_quote_for_eval_result; export $var; $relink_command\"\n\t  fi\n\tdone\n\trelink_command=\"(cd `pwd`; $relink_command)\"\n\trelink_command=`$ECHO \"X$relink_command\" | $Xsed -e \"$sed_quote_subst\"`\n      fi\n\n      # Quote $ECHO for shipping.\n      if test \"X$ECHO\" = \"X$SHELL $progpath --fallback-echo\"; then\n\tcase $progpath in\n\t[\\\\/]* | [A-Za-z]:[\\\\/]*) qecho=\"$SHELL $progpath --fallback-echo\";;\n\t*) qecho=\"$SHELL `pwd`/$progpath --fallback-echo\";;\n\tesac\n\tqecho=`$ECHO \"X$qecho\" | $Xsed -e \"$sed_quote_subst\"`\n      else\n\tqecho=`$ECHO \"X$ECHO\" | $Xsed -e \"$sed_quote_subst\"`\n      fi\n\n      # Only actually do things if not in dry run mode.\n      $opt_dry_run || {\n\t# win32 will think the script is a binary if it has\n\t# a .exe suffix, so we strip it off here.\n\tcase $output in\n\t  *.exe) func_stripname '' '.exe' \"$output\"\n\t         output=$func_stripname_result ;;\n\tesac\n\t# test for cygwin because mv fails w/o .exe extensions\n\tcase $host in\n\t  *cygwin*)\n\t    exeext=.exe\n\t    func_stripname '' '.exe' \"$outputname\"\n\t    outputname=$func_stripname_result ;;\n\t  *) exeext= ;;\n\tesac\n\tcase $host in\n\t  *cygwin* | *mingw* )\n\t    func_dirname_and_basename \"$output\" \"\" \".\"\n\t    output_name=$func_basename_result\n\t    output_path=$func_dirname_result\n\t    cwrappersource=\"$output_path/$objdir/lt-$output_name.c\"\n\t    cwrapper=\"$output_path/$output_name.exe\"\n\t    $RM $cwrappersource $cwrapper\n\t    trap \"$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE\" 1 2 15\n\n\t    func_emit_cwrapperexe_src > $cwrappersource\n\n\t    # The wrapper executable is built using the $host compiler,\n\t    # because it contains $host paths and files. If cross-\n\t    # compiling, it, like the target executable, must be\n\t    # executed on the $host or under an emulation environment.\n\t    $opt_dry_run || {\n\t      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource\n\t      $STRIP $cwrapper\n\t    }\n\n\t    # Now, create the wrapper script for func_source use:\n\t    func_ltwrapper_scriptname $cwrapper\n\t    $RM $func_ltwrapper_scriptname_result\n\t    trap \"$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE\" 1 2 15\n\t    $opt_dry_run || {\n\t      # note: this script will not be executed, so do not chmod.\n\t      if test \"x$build\" = \"x$host\" ; then\n\t\t$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result\n\t      else\n\t\tfunc_emit_wrapper no > $func_ltwrapper_scriptname_result\n\t      fi\n\t    }\n\t  ;;\n\t  * )\n\t    $RM $output\n\t    trap \"$RM $output; exit $EXIT_FAILURE\" 1 2 15\n\n\t    func_emit_wrapper no > $output\n\t    chmod +x $output\n\t  ;;\n\tesac\n      }\n      exit $EXIT_SUCCESS\n      ;;\n    esac\n\n    # See if we need to build an old-fashioned archive.\n    for oldlib in $oldlibs; do\n\n      if test \"$build_libtool_libs\" = convenience; then\n\toldobjs=\"$libobjs_save $symfileobj\"\n\taddlibs=\"$convenience\"\n\tbuild_libtool_libs=no\n      else\n\tif test \"$build_libtool_libs\" = module; then\n\t  oldobjs=\"$libobjs_save\"\n\t  build_libtool_libs=no\n\telse\n\t  oldobjs=\"$old_deplibs $non_pic_objects\"\n\t  if test \"$preload\" = yes && test -f \"$symfileobj\"; then\n\t    oldobjs=\"$oldobjs $symfileobj\"\n\t  fi\n\tfi\n\taddlibs=\"$old_convenience\"\n      fi\n\n      if test -n \"$addlibs\"; then\n\tgentop=\"$output_objdir/${outputname}x\"\n\tgenerated=\"$generated $gentop\"\n\n\tfunc_extract_archives $gentop $addlibs\n\toldobjs=\"$oldobjs $func_extract_archives_result\"\n      fi\n\n      # Do each command in the archive commands.\n      if test -n \"$old_archive_from_new_cmds\" && test \"$build_libtool_libs\" = yes; then\n\tcmds=$old_archive_from_new_cmds\n      else\n\n\t# Add any objects from preloaded convenience libraries\n\tif test -n \"$dlprefiles\"; then\n\t  gentop=\"$output_objdir/${outputname}x\"\n\t  generated=\"$generated $gentop\"\n\n\t  func_extract_archives $gentop $dlprefiles\n\t  oldobjs=\"$oldobjs $func_extract_archives_result\"\n\tfi\n\n\t# POSIX demands no paths to be encoded in archives.  We have\n\t# to avoid creating archives with duplicate basenames if we\n\t# might have to extract them afterwards, e.g., when creating a\n\t# static archive out of a convenience library, or when linking\n\t# the entirety of a libtool archive into another (currently\n\t# not supported by libtool).\n\tif (for obj in $oldobjs\n\t    do\n\t      func_basename \"$obj\"\n\t      $ECHO \"$func_basename_result\"\n\t    done | sort | sort -uc >/dev/null 2>&1); then\n\t  :\n\telse\n\t  $ECHO \"copying selected object files to avoid basename conflicts...\"\n\t  gentop=\"$output_objdir/${outputname}x\"\n\t  generated=\"$generated $gentop\"\n\t  func_mkdir_p \"$gentop\"\n\t  save_oldobjs=$oldobjs\n\t  oldobjs=\n\t  counter=1\n\t  for obj in $save_oldobjs\n\t  do\n\t    func_basename \"$obj\"\n\t    objbase=\"$func_basename_result\"\n\t    case \" $oldobjs \" in\n\t    \" \") oldobjs=$obj ;;\n\t    *[\\ /]\"$objbase \"*)\n\t      while :; do\n\t\t# Make sure we don't pick an alternate name that also\n\t\t# overlaps.\n\t\tnewobj=lt$counter-$objbase\n\t\tfunc_arith $counter + 1\n\t\tcounter=$func_arith_result\n\t\tcase \" $oldobjs \" in\n\t\t*[\\ /]\"$newobj \"*) ;;\n\t\t*) if test ! -f \"$gentop/$newobj\"; then break; fi ;;\n\t\tesac\n\t      done\n\t      func_show_eval \"ln $obj $gentop/$newobj || cp $obj $gentop/$newobj\"\n\t      oldobjs=\"$oldobjs $gentop/$newobj\"\n\t      ;;\n\t    *) oldobjs=\"$oldobjs $obj\" ;;\n\t    esac\n\t  done\n\tfi\n\teval cmds=\\\"$old_archive_cmds\\\"\n\n\tfunc_len \" $cmds\"\n\tlen=$func_len_result\n\tif test \"$len\" -lt \"$max_cmd_len\" || test \"$max_cmd_len\" -le -1; then\n\t  cmds=$old_archive_cmds\n\telse\n\t  # the command line is too long to link in one step, link in parts\n\t  func_verbose \"using piecewise archive linking...\"\n\t  save_RANLIB=$RANLIB\n\t  RANLIB=:\n\t  objlist=\n\t  concat_cmds=\n\t  save_oldobjs=$oldobjs\n\t  oldobjs=\n\t  # Is there a better way of finding the last object in the list?\n\t  for obj in $save_oldobjs\n\t  do\n\t    last_oldobj=$obj\n\t  done\n\t  eval test_cmds=\\\"$old_archive_cmds\\\"\n\t  func_len \" $test_cmds\"\n\t  len0=$func_len_result\n\t  len=$len0\n\t  for obj in $save_oldobjs\n\t  do\n\t    func_len \" $obj\"\n\t    func_arith $len + $func_len_result\n\t    len=$func_arith_result\n\t    func_append objlist \" $obj\"\n\t    if test \"$len\" -lt \"$max_cmd_len\"; then\n\t      :\n\t    else\n\t      # the above command should be used before it gets too long\n\t      oldobjs=$objlist\n\t      if test \"$obj\" = \"$last_oldobj\" ; then\n\t\tRANLIB=$save_RANLIB\n\t      fi\n\t      test -z \"$concat_cmds\" || concat_cmds=$concat_cmds~\n\t      eval concat_cmds=\\\"\\${concat_cmds}$old_archive_cmds\\\"\n\t      objlist=\n\t      len=$len0\n\t    fi\n\t  done\n\t  RANLIB=$save_RANLIB\n\t  oldobjs=$objlist\n\t  if test \"X$oldobjs\" = \"X\" ; then\n\t    eval cmds=\\\"\\$concat_cmds\\\"\n\t  else\n\t    eval cmds=\\\"\\$concat_cmds~\\$old_archive_cmds\\\"\n\t  fi\n\tfi\n      fi\n      func_execute_cmds \"$cmds\" 'exit $?'\n    done\n\n    test -n \"$generated\" && \\\n      func_show_eval \"${RM}r$generated\"\n\n    # Now create the libtool archive.\n    case $output in\n    *.la)\n      old_library=\n      test \"$build_old_libs\" = yes && old_library=\"$libname.$libext\"\n      func_verbose \"creating $output\"\n\n      # Preserve any variables that may affect compiler behavior\n      for var in $variables_saved_for_relink; do\n\tif eval test -z \\\"\\${$var+set}\\\"; then\n\t  relink_command=\"{ test -z \\\"\\${$var+set}\\\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command\"\n\telif eval var_value=\\$$var; test -z \"$var_value\"; then\n\t  relink_command=\"$var=; export $var; $relink_command\"\n\telse\n\t  func_quote_for_eval \"$var_value\"\n\t  relink_command=\"$var=$func_quote_for_eval_result; export $var; $relink_command\"\n\tfi\n      done\n      # Quote the link command for shipping.\n      relink_command=\"(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)\"\n      relink_command=`$ECHO \"X$relink_command\" | $Xsed -e \"$sed_quote_subst\"`\n      if test \"$hardcode_automatic\" = yes ; then\n\trelink_command=\n      fi\n\n      # Only create the output if not a dry run.\n      $opt_dry_run || {\n\tfor installed in no yes; do\n\t  if test \"$installed\" = yes; then\n\t    if test -z \"$install_libdir\"; then\n\t      break\n\t    fi\n\t    output=\"$output_objdir/$outputname\"i\n\t    # Replace all uninstalled libtool libraries with the installed ones\n\t    newdependency_libs=\n\t    for deplib in $dependency_libs; do\n\t      case $deplib in\n\t      *.la)\n\t\tfunc_basename \"$deplib\"\n\t\tname=\"$func_basename_result\"\n\t\teval libdir=`${SED} -n -e 's/^libdir=\\(.*\\)$/\\1/p' $deplib`\n\t\ttest -z \"$libdir\" && \\\n\t\t  func_fatal_error \"\\`$deplib' is not a valid libtool archive\"\n\t\tnewdependency_libs=\"$newdependency_libs $libdir/$name\"\n\t\t;;\n\t      *) newdependency_libs=\"$newdependency_libs $deplib\" ;;\n\t      esac\n\t    done\n\t    dependency_libs=\"$newdependency_libs\"\n\t    newdlfiles=\n\n\t    for lib in $dlfiles; do\n\t      case $lib in\n\t      *.la)\n\t        func_basename \"$lib\"\n\t\tname=\"$func_basename_result\"\n\t\teval libdir=`${SED} -n -e 's/^libdir=\\(.*\\)$/\\1/p' $lib`\n\t\ttest -z \"$libdir\" && \\\n\t\t  func_fatal_error \"\\`$lib' is not a valid libtool archive\"\n\t\tnewdlfiles=\"$newdlfiles $libdir/$name\"\n\t\t;;\n\t      *) newdlfiles=\"$newdlfiles $lib\" ;;\n\t      esac\n\t    done\n\t    dlfiles=\"$newdlfiles\"\n\t    newdlprefiles=\n\t    for lib in $dlprefiles; do\n\t      case $lib in\n\t      *.la)\n\t\t# Only pass preopened files to the pseudo-archive (for\n\t\t# eventual linking with the app. that links it) if we\n\t\t# didn't already link the preopened objects directly into\n\t\t# the library:\n\t\tfunc_basename \"$lib\"\n\t\tname=\"$func_basename_result\"\n\t\teval libdir=`${SED} -n -e 's/^libdir=\\(.*\\)$/\\1/p' $lib`\n\t\ttest -z \"$libdir\" && \\\n\t\t  func_fatal_error \"\\`$lib' is not a valid libtool archive\"\n\t\tnewdlprefiles=\"$newdlprefiles $libdir/$name\"\n\t\t;;\n\t      esac\n\t    done\n\t    dlprefiles=\"$newdlprefiles\"\n\t  else\n\t    newdlfiles=\n\t    for lib in $dlfiles; do\n\t      case $lib in\n\t\t[\\\\/]* | [A-Za-z]:[\\\\/]*) abs=\"$lib\" ;;\n\t\t*) abs=`pwd`\"/$lib\" ;;\n\t      esac\n\t      newdlfiles=\"$newdlfiles $abs\"\n\t    done\n\t    dlfiles=\"$newdlfiles\"\n\t    newdlprefiles=\n\t    for lib in $dlprefiles; do\n\t      case $lib in\n\t\t[\\\\/]* | [A-Za-z]:[\\\\/]*) abs=\"$lib\" ;;\n\t\t*) abs=`pwd`\"/$lib\" ;;\n\t      esac\n\t      newdlprefiles=\"$newdlprefiles $abs\"\n\t    done\n\t    dlprefiles=\"$newdlprefiles\"\n\t  fi\n\t  $RM $output\n\t  # place dlname in correct position for cygwin\n\t  tdlname=$dlname\n\t  case $host,$output,$installed,$module,$dlname in\n\t    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll) tdlname=../bin/$dlname ;;\n\t  esac\n\t  $ECHO > $output \"\\\n# $outputname - a libtool library file\n# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION\n#\n# Please DO NOT delete this file!\n# It is necessary for linking the library.\n\n# The name that we can dlopen(3).\ndlname='$tdlname'\n\n# Names of this library.\nlibrary_names='$library_names'\n\n# The name of the static archive.\nold_library='$old_library'\n\n# Linker flags that can not go in dependency_libs.\ninherited_linker_flags='$new_inherited_linker_flags'\n\n# Libraries that this one depends upon.\ndependency_libs='$dependency_libs'\n\n# Names of additional weak libraries provided by this library\nweak_library_names='$weak_libs'\n\n# Version information for $libname.\ncurrent=$current\nage=$age\nrevision=$revision\n\n# Is this an already installed library?\ninstalled=$installed\n\n# Should we warn about portability when linking against -modules?\nshouldnotlink=$module\n\n# Files to dlopen/dlpreopen\ndlopen='$dlfiles'\ndlpreopen='$dlprefiles'\n\n# Directory that this library needs to be installed in:\nlibdir='$install_libdir'\"\n\t  if test \"$installed\" = no && test \"$need_relink\" = yes; then\n\t    $ECHO >> $output \"\\\nrelink_command=\\\"$relink_command\\\"\"\n\t  fi\n\tdone\n      }\n\n      # Do a symbolic link so that the libtool archive can be found in\n      # LD_LIBRARY_PATH before the program is installed.\n      func_show_eval '( cd \"$output_objdir\" && $RM \"$outputname\" && $LN_S \"../$outputname\" \"$outputname\" )' 'exit $?'\n      ;;\n    esac\n    exit $EXIT_SUCCESS\n}\n\n{ test \"$mode\" = link || test \"$mode\" = relink; } &&\n    func_mode_link ${1+\"$@\"}\n\n\n# func_mode_uninstall arg...\nfunc_mode_uninstall ()\n{\n    $opt_debug\n    RM=\"$nonopt\"\n    files=\n    rmforce=\n    exit_status=0\n\n    # This variable tells wrapper scripts just to set variables rather\n    # than running their programs.\n    libtool_install_magic=\"$magic\"\n\n    for arg\n    do\n      case $arg in\n      -f) RM=\"$RM $arg\"; rmforce=yes ;;\n      -*) RM=\"$RM $arg\" ;;\n      *) files=\"$files $arg\" ;;\n      esac\n    done\n\n    test -z \"$RM\" && \\\n      func_fatal_help \"you must specify an RM program\"\n\n    rmdirs=\n\n    origobjdir=\"$objdir\"\n    for file in $files; do\n      func_dirname \"$file\" \"\" \".\"\n      dir=\"$func_dirname_result\"\n      if test \"X$dir\" = X.; then\n\tobjdir=\"$origobjdir\"\n      else\n\tobjdir=\"$dir/$origobjdir\"\n      fi\n      func_basename \"$file\"\n      name=\"$func_basename_result\"\n      test \"$mode\" = uninstall && objdir=\"$dir\"\n\n      # Remember objdir for removal later, being careful to avoid duplicates\n      if test \"$mode\" = clean; then\n\tcase \" $rmdirs \" in\n\t  *\" $objdir \"*) ;;\n\t  *) rmdirs=\"$rmdirs $objdir\" ;;\n\tesac\n      fi\n\n      # Don't error if the file doesn't exist and rm -f was used.\n      if { test -L \"$file\"; } >/dev/null 2>&1 ||\n\t { test -h \"$file\"; } >/dev/null 2>&1 ||\n\t test -f \"$file\"; then\n\t:\n      elif test -d \"$file\"; then\n\texit_status=1\n\tcontinue\n      elif test \"$rmforce\" = yes; then\n\tcontinue\n      fi\n\n      rmfiles=\"$file\"\n\n      case $name in\n      *.la)\n\t# Possibly a libtool archive, so verify it.\n\tif func_lalib_p \"$file\"; then\n\t  func_source $dir/$name\n\n\t  # Delete the libtool libraries and symlinks.\n\t  for n in $library_names; do\n\t    rmfiles=\"$rmfiles $objdir/$n\"\n\t  done\n\t  test -n \"$old_library\" && rmfiles=\"$rmfiles $objdir/$old_library\"\n\n\t  case \"$mode\" in\n\t  clean)\n\t    case \"  $library_names \" in\n\t    # \"  \" in the beginning catches empty $dlname\n\t    *\" $dlname \"*) ;;\n\t    *) rmfiles=\"$rmfiles $objdir/$dlname\" ;;\n\t    esac\n\t    test -n \"$libdir\" && rmfiles=\"$rmfiles $objdir/$name $objdir/${name}i\"\n\t    ;;\n\t  uninstall)\n\t    if test -n \"$library_names\"; then\n\t      # Do each command in the postuninstall commands.\n\t      func_execute_cmds \"$postuninstall_cmds\" 'test \"$rmforce\" = yes || exit_status=1'\n\t    fi\n\n\t    if test -n \"$old_library\"; then\n\t      # Do each command in the old_postuninstall commands.\n\t      func_execute_cmds \"$old_postuninstall_cmds\" 'test \"$rmforce\" = yes || exit_status=1'\n\t    fi\n\t    # FIXME: should reinstall the best remaining shared library.\n\t    ;;\n\t  esac\n\tfi\n\t;;\n\n      *.lo)\n\t# Possibly a libtool object, so verify it.\n\tif func_lalib_p \"$file\"; then\n\n\t  # Read the .lo file\n\t  func_source $dir/$name\n\n\t  # Add PIC object to the list of files to remove.\n\t  if test -n \"$pic_object\" &&\n\t     test \"$pic_object\" != none; then\n\t    rmfiles=\"$rmfiles $dir/$pic_object\"\n\t  fi\n\n\t  # Add non-PIC object to the list of files to remove.\n\t  if test -n \"$non_pic_object\" &&\n\t     test \"$non_pic_object\" != none; then\n\t    rmfiles=\"$rmfiles $dir/$non_pic_object\"\n\t  fi\n\tfi\n\t;;\n\n      *)\n\tif test \"$mode\" = clean ; then\n\t  noexename=$name\n\t  case $file in\n\t  *.exe)\n\t    func_stripname '' '.exe' \"$file\"\n\t    file=$func_stripname_result\n\t    func_stripname '' '.exe' \"$name\"\n\t    noexename=$func_stripname_result\n\t    # $file with .exe has already been added to rmfiles,\n\t    # add $file without .exe\n\t    rmfiles=\"$rmfiles $file\"\n\t    ;;\n\t  esac\n\t  # Do a test to see if this is a libtool program.\n\t  if func_ltwrapper_p \"$file\"; then\n\t    if func_ltwrapper_executable_p \"$file\"; then\n\t      func_ltwrapper_scriptname \"$file\"\n\t      relink_command=\n\t      func_source $func_ltwrapper_scriptname_result\n\t      rmfiles=\"$rmfiles $func_ltwrapper_scriptname_result\"\n\t    else\n\t      relink_command=\n\t      func_source $dir/$noexename\n\t    fi\n\n\t    # note $name still contains .exe if it was in $file originally\n\t    # as does the version of $file that was added into $rmfiles\n\t    rmfiles=\"$rmfiles $objdir/$name $objdir/${name}S.${objext}\"\n\t    if test \"$fast_install\" = yes && test -n \"$relink_command\"; then\n\t      rmfiles=\"$rmfiles $objdir/lt-$name\"\n\t    fi\n\t    if test \"X$noexename\" != \"X$name\" ; then\n\t      rmfiles=\"$rmfiles $objdir/lt-${noexename}.c\"\n\t    fi\n\t  fi\n\tfi\n\t;;\n      esac\n      func_show_eval \"$RM $rmfiles\" 'exit_status=1'\n    done\n    objdir=\"$origobjdir\"\n\n    # Try to remove the ${objdir}s in the directories where we deleted files\n    for dir in $rmdirs; do\n      if test -d \"$dir\"; then\n\tfunc_show_eval \"rmdir $dir >/dev/null 2>&1\"\n      fi\n    done\n\n    exit $exit_status\n}\n\n{ test \"$mode\" = uninstall || test \"$mode\" = clean; } &&\n    func_mode_uninstall ${1+\"$@\"}\n\ntest -z \"$mode\" && {\n  help=\"$generic_help\"\n  func_fatal_help \"you must specify a MODE\"\n}\n\ntest -z \"$exec_cmd\" && \\\n  func_fatal_help \"invalid operation mode \\`$mode'\"\n\nif test -n \"$exec_cmd\"; then\n  eval exec \"$exec_cmd\"\n  exit $EXIT_FAILURE\nfi\n\nexit $exit_status\n\n\n# The TAGs below are defined such that we never get into a situation\n# in which we disable both kinds of libraries.  Given conflicting\n# choices, we go for a static library, that is the most portable,\n# since we can't tell whether shared libraries were disabled because\n# the user asked for that or because the platform doesn't support\n# them.  This is particularly important on AIX, because we don't\n# support having both static and shared libraries enabled at the same\n# time on that platform, so we default to a shared-only configuration.\n# If a disable-shared tag is given, we'll fallback to a static-only\n# configuration.  But we'll never go from static-only to shared-only.\n\n# ### BEGIN LIBTOOL TAG CONFIG: disable-shared\nbuild_libtool_libs=no\nbuild_old_libs=yes\n# ### END LIBTOOL TAG CONFIG: disable-shared\n\n# ### BEGIN LIBTOOL TAG CONFIG: disable-static\nbuild_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`\n# ### END LIBTOOL TAG CONFIG: disable-static\n\n# Local Variables:\n# mode:shell-script\n# sh-indentation:2\n# End:\n# vi:sw=2\n\n"
  },
  {
    "path": "src/Onigmo/m4/libtool.m4",
    "content": "# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-\n#\n#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,\n#                 2006, 2007, 2008 Free Software Foundation, Inc.\n#   Written by Gordon Matzigkeit, 1996\n#\n# This file is free software; the Free Software Foundation gives\n# unlimited permission to copy and/or distribute it, with or without\n# modifications, as long as this notice is preserved.\n\nm4_define([_LT_COPYING], [dnl\n#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,\n#                 2006, 2007, 2008 Free Software Foundation, Inc.\n#   Written by Gordon Matzigkeit, 1996\n#\n#   This file is part of GNU Libtool.\n#\n# GNU Libtool is free software; you can redistribute it and/or\n# modify it under the terms of the GNU General Public License as\n# published by the Free Software Foundation; either version 2 of\n# the License, or (at your option) any later version.\n#\n# As a special exception to the GNU General Public License,\n# if you distribute this file as part of a program or library that\n# is built using GNU Libtool, you may include this file under the\n# same distribution terms that you use for the rest of that program.\n#\n# GNU Libtool is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with GNU Libtool; see the file COPYING.  If not, a copy\n# can be downloaded from http://www.gnu.org/licenses/gpl.html, or\n# obtained by writing to the Free Software Foundation, Inc.,\n# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n])\n\n# serial 56 LT_INIT\n\n\n# LT_PREREQ(VERSION)\n# ------------------\n# Complain and exit if this libtool version is less that VERSION.\nm4_defun([LT_PREREQ],\n[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,\n       [m4_default([$3],\n\t\t   [m4_fatal([Libtool version $1 or higher is required],\n\t\t             63)])],\n       [$2])])\n\n\n# _LT_CHECK_BUILDDIR\n# ------------------\n# Complain if the absolute build directory name contains unusual characters\nm4_defun([_LT_CHECK_BUILDDIR],\n[case `pwd` in\n  *\\ * | *\\\t*)\n    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;\nesac\n])\n\n\n# LT_INIT([OPTIONS])\n# ------------------\nAC_DEFUN([LT_INIT],\n[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT\nAC_BEFORE([$0], [LT_LANG])dnl\nAC_BEFORE([$0], [LT_OUTPUT])dnl\nAC_BEFORE([$0], [LTDL_INIT])dnl\nm4_require([_LT_CHECK_BUILDDIR])dnl\n\ndnl Autoconf doesn't catch unexpanded LT_ macros by default:\nm4_pattern_forbid([^_?LT_[A-Z_]+$])dnl\nm4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl\ndnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4\ndnl unless we require an AC_DEFUNed macro:\nAC_REQUIRE([LTOPTIONS_VERSION])dnl\nAC_REQUIRE([LTSUGAR_VERSION])dnl\nAC_REQUIRE([LTVERSION_VERSION])dnl\nAC_REQUIRE([LTOBSOLETE_VERSION])dnl\nm4_require([_LT_PROG_LTMAIN])dnl\n\ndnl Parse OPTIONS\n_LT_SET_OPTIONS([$0], [$1])\n\n# This can be used to rebuild libtool when needed\nLIBTOOL_DEPS=\"$ltmain\"\n\n# Always use our own libtool.\nLIBTOOL='$(SHELL) $(top_builddir)/libtool'\nAC_SUBST(LIBTOOL)dnl\n\n_LT_SETUP\n\n# Only expand once:\nm4_define([LT_INIT])\n])# LT_INIT\n\n# Old names:\nAU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])\nAU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_PROG_LIBTOOL], [])\ndnl AC_DEFUN([AM_PROG_LIBTOOL], [])\n\n\n# _LT_CC_BASENAME(CC)\n# -------------------\n# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.\nm4_defun([_LT_CC_BASENAME],\n[for cc_temp in $1\"\"; do\n  case $cc_temp in\n    compile | *[[\\\\/]]compile | ccache | *[[\\\\/]]ccache ) ;;\n    distcc | *[[\\\\/]]distcc | purify | *[[\\\\/]]purify ) ;;\n    \\-*) ;;\n    *) break;;\n  esac\ndone\ncc_basename=`$ECHO \"X$cc_temp\" | $Xsed -e 's%.*/%%' -e \"s%^$host_alias-%%\"`\n])\n\n\n# _LT_FILEUTILS_DEFAULTS\n# ----------------------\n# It is okay to use these file commands and assume they have been set\n# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.\nm4_defun([_LT_FILEUTILS_DEFAULTS],\n[: ${CP=\"cp -f\"}\n: ${MV=\"mv -f\"}\n: ${RM=\"rm -f\"}\n])# _LT_FILEUTILS_DEFAULTS\n\n\n# _LT_SETUP\n# ---------\nm4_defun([_LT_SETUP],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\nAC_REQUIRE([AC_CANONICAL_BUILD])dnl\n_LT_DECL([], [host_alias], [0], [The host system])dnl\n_LT_DECL([], [host], [0])dnl\n_LT_DECL([], [host_os], [0])dnl\ndnl\n_LT_DECL([], [build_alias], [0], [The build system])dnl\n_LT_DECL([], [build], [0])dnl\n_LT_DECL([], [build_os], [0])dnl\ndnl\nAC_REQUIRE([AC_PROG_CC])dnl\nAC_REQUIRE([LT_PATH_LD])dnl\nAC_REQUIRE([LT_PATH_NM])dnl\ndnl\nAC_REQUIRE([AC_PROG_LN_S])dnl\ntest -z \"$LN_S\" && LN_S=\"ln -s\"\n_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl\ndnl\nAC_REQUIRE([LT_CMD_MAX_LEN])dnl\n_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally \"o\")])dnl\n_LT_DECL([], [exeext], [0], [Executable file suffix (normally \"\")])dnl\ndnl\nm4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_CHECK_SHELL_FEATURES])dnl\nm4_require([_LT_CMD_RELOAD])dnl\nm4_require([_LT_CHECK_MAGIC_METHOD])dnl\nm4_require([_LT_CMD_OLD_ARCHIVE])dnl\nm4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl\n\n_LT_CONFIG_LIBTOOL_INIT([\n# See if we are running on zsh, and set the options which allow our\n# commands through without removal of \\ escapes INIT.\nif test -n \"\\${ZSH_VERSION+set}\" ; then\n   setopt NO_GLOB_SUBST\nfi\n])\nif test -n \"${ZSH_VERSION+set}\" ; then\n   setopt NO_GLOB_SUBST\nfi\n\n_LT_CHECK_OBJDIR\n\nm4_require([_LT_TAG_COMPILER])dnl\n_LT_PROG_ECHO_BACKSLASH\n\ncase $host_os in\naix3*)\n  # AIX sometimes has problems with the GCC collect2 program.  For some\n  # reason, if we set the COLLECT_NAMES environment variable, the problems\n  # vanish in a puff of smoke.\n  if test \"X${COLLECT_NAMES+set}\" != Xset; then\n    COLLECT_NAMES=\n    export COLLECT_NAMES\n  fi\n  ;;\nesac\n\n# Sed substitution that helps us do robust quoting.  It backslashifies\n# metacharacters that are still active within double-quoted strings.\nsed_quote_subst='s/\\([[\"`$\\\\]]\\)/\\\\\\1/g'\n\n# Same as above, but do not quote variable references.\ndouble_quote_subst='s/\\([[\"`\\\\]]\\)/\\\\\\1/g'\n\n# Sed substitution to delay expansion of an escaped shell variable in a\n# double_quote_subst'ed string.\ndelay_variable_subst='s/\\\\\\\\\\\\\\\\\\\\\\$/\\\\\\\\\\\\$/g'\n\n# Sed substitution to delay expansion of an escaped single quote.\ndelay_single_quote_subst='s/'\\''/'\\'\\\\\\\\\\\\\\'\\''/g'\n\n# Sed substitution to avoid accidental globbing in evaled expressions\nno_glob_subst='s/\\*/\\\\\\*/g'\n\n# Global variables:\nofile=libtool\ncan_build_shared=yes\n\n# All known linkers require a `.a' archive for static linking (except MSVC,\n# which needs '.lib').\nlibext=a\n\nwith_gnu_ld=\"$lt_cv_prog_gnu_ld\"\n\nold_CC=\"$CC\"\nold_CFLAGS=\"$CFLAGS\"\n\n# Set sane defaults for various variables\ntest -z \"$CC\" && CC=cc\ntest -z \"$LTCC\" && LTCC=$CC\ntest -z \"$LTCFLAGS\" && LTCFLAGS=$CFLAGS\ntest -z \"$LD\" && LD=ld\ntest -z \"$ac_objext\" && ac_objext=o\n\n_LT_CC_BASENAME([$compiler])\n\n# Only perform the check for file, if the check method requires it\ntest -z \"$MAGIC_CMD\" && MAGIC_CMD=file\ncase $deplibs_check_method in\nfile_magic*)\n  if test \"$file_magic_cmd\" = '$MAGIC_CMD'; then\n    _LT_PATH_MAGIC\n  fi\n  ;;\nesac\n\n# Use C for the default configuration in the libtool script\nLT_SUPPORTED_TAG([CC])\n_LT_LANG_C_CONFIG\n_LT_LANG_DEFAULT_CONFIG\n_LT_CONFIG_COMMANDS\n])# _LT_SETUP\n\n\n# _LT_PROG_LTMAIN\n# ---------------\n# Note that this code is called both from `configure', and `config.status'\n# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,\n# `config.status' has no value for ac_aux_dir unless we are using Automake,\n# so we pass a copy along to make sure it has a sensible value anyway.\nm4_defun([_LT_PROG_LTMAIN],\n[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl\n_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])\nltmain=\"$ac_aux_dir/ltmain.sh\"\n])# _LT_PROG_LTMAIN\n\n\n## ------------------------------------- ##\n## Accumulate code for creating libtool. ##\n## ------------------------------------- ##\n\n# So that we can recreate a full libtool script including additional\n# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS\n# in macros and then make a single call at the end using the `libtool'\n# label.\n\n\n# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])\n# ----------------------------------------\n# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.\nm4_define([_LT_CONFIG_LIBTOOL_INIT],\n[m4_ifval([$1],\n          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],\n                     [$1\n])])])\n\n# Initialize.\nm4_define([_LT_OUTPUT_LIBTOOL_INIT])\n\n\n# _LT_CONFIG_LIBTOOL([COMMANDS])\n# ------------------------------\n# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.\nm4_define([_LT_CONFIG_LIBTOOL],\n[m4_ifval([$1],\n          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],\n                     [$1\n])])])\n\n# Initialize.\nm4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])\n\n\n# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])\n# -----------------------------------------------------\nm4_defun([_LT_CONFIG_SAVE_COMMANDS],\n[_LT_CONFIG_LIBTOOL([$1])\n_LT_CONFIG_LIBTOOL_INIT([$2])\n])\n\n\n# _LT_FORMAT_COMMENT([COMMENT])\n# -----------------------------\n# Add leading comment marks to the start of each line, and a trailing\n# full-stop to the whole comment if one is not present already.\nm4_define([_LT_FORMAT_COMMENT],\n[m4_ifval([$1], [\nm4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],\n              [['`$\\]], [\\\\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])\n)])\n\n\n\n## ------------------------ ##\n## FIXME: Eliminate VARNAME ##\n## ------------------------ ##\n\n\n# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])\n# -------------------------------------------------------------------\n# CONFIGNAME is the name given to the value in the libtool script.\n# VARNAME is the (base) name used in the configure script.\n# VALUE may be 0, 1 or 2 for a computed quote escaped value based on\n# VARNAME.  Any other value will be used directly.\nm4_define([_LT_DECL],\n[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],\n    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],\n\t[m4_ifval([$1], [$1], [$2])])\n    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])\n    m4_ifval([$4],\n\t[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])\n    lt_dict_add_subkey([lt_decl_dict], [$2],\n\t[tagged?], [m4_ifval([$5], [yes], [no])])])\n])\n\n\n# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])\n# --------------------------------------------------------\nm4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])\n\n\n# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])\n# ------------------------------------------------\nm4_define([lt_decl_tag_varnames],\n[_lt_decl_filter([tagged?], [yes], $@)])\n\n\n# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])\n# ---------------------------------------------------------\nm4_define([_lt_decl_filter],\n[m4_case([$#],\n  [0], [m4_fatal([$0: too few arguments: $#])],\n  [1], [m4_fatal([$0: too few arguments: $#: $1])],\n  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],\n  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],\n  [lt_dict_filter([lt_decl_dict], $@)])[]dnl\n])\n\n\n# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])\n# --------------------------------------------------\nm4_define([lt_decl_quote_varnames],\n[_lt_decl_filter([value], [1], $@)])\n\n\n# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])\n# ---------------------------------------------------\nm4_define([lt_decl_dquote_varnames],\n[_lt_decl_filter([value], [2], $@)])\n\n\n# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])\n# ---------------------------------------------------\nm4_define([lt_decl_varnames_tagged],\n[m4_assert([$# <= 2])dnl\n_$0(m4_quote(m4_default([$1], [[, ]])),\n    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),\n    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])\nm4_define([_lt_decl_varnames_tagged],\n[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])\n\n\n# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])\n# ------------------------------------------------\nm4_define([lt_decl_all_varnames],\n[_$0(m4_quote(m4_default([$1], [[, ]])),\n     m4_if([$2], [],\n\t   m4_quote(lt_decl_varnames),\n\tm4_quote(m4_shift($@))))[]dnl\n])\nm4_define([_lt_decl_all_varnames],\n[lt_join($@, lt_decl_varnames_tagged([$1],\n\t\t\tlt_decl_tag_varnames([[, ]], m4_shift($@))))dnl\n])\n\n\n# _LT_CONFIG_STATUS_DECLARE([VARNAME])\n# ------------------------------------\n# Quote a variable value, and forward it to `config.status' so that its\n# declaration there will have the same value as in `configure'.  VARNAME\n# must have a single quote delimited value for this to work.\nm4_define([_LT_CONFIG_STATUS_DECLARE],\n[$1='`$ECHO \"X$][$1\" | $Xsed -e \"$delay_single_quote_subst\"`'])\n\n\n# _LT_CONFIG_STATUS_DECLARATIONS\n# ------------------------------\n# We delimit libtool config variables with single quotes, so when\n# we write them to config.status, we have to be sure to quote all\n# embedded single quotes properly.  In configure, this macro expands\n# each variable declared with _LT_DECL (and _LT_TAGDECL) into:\n#\n#    <var>='`$ECHO \"X$<var>\" | $Xsed -e \"$delay_single_quote_subst\"`'\nm4_defun([_LT_CONFIG_STATUS_DECLARATIONS],\n[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),\n    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])\n\n\n# _LT_LIBTOOL_TAGS\n# ----------------\n# Output comment and list of tags supported by the script\nm4_defun([_LT_LIBTOOL_TAGS],\n[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl\navailable_tags=\"_LT_TAGS\"dnl\n])\n\n\n# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])\n# -----------------------------------\n# Extract the dictionary values for VARNAME (optionally with TAG) and\n# expand to a commented shell variable setting:\n#\n#    # Some comment about what VAR is for.\n#    visible_name=$lt_internal_name\nm4_define([_LT_LIBTOOL_DECLARE],\n[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],\n\t\t\t\t\t   [description])))[]dnl\nm4_pushdef([_libtool_name],\n    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl\nm4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),\n    [0], [_libtool_name=[$]$1],\n    [1], [_libtool_name=$lt_[]$1],\n    [2], [_libtool_name=$lt_[]$1],\n    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl\nm4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl\n])\n\n\n# _LT_LIBTOOL_CONFIG_VARS\n# -----------------------\n# Produce commented declarations of non-tagged libtool config variables\n# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'\n# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG\n# section) are produced by _LT_LIBTOOL_TAG_VARS.\nm4_defun([_LT_LIBTOOL_CONFIG_VARS],\n[m4_foreach([_lt_var],\n    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),\n    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])\n\n\n# _LT_LIBTOOL_TAG_VARS(TAG)\n# -------------------------\nm4_define([_LT_LIBTOOL_TAG_VARS],\n[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),\n    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])\n\n\n# _LT_TAGVAR(VARNAME, [TAGNAME])\n# ------------------------------\nm4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])\n\n\n# _LT_CONFIG_COMMANDS\n# -------------------\n# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of\n# variables for single and double quote escaping we saved from calls\n# to _LT_DECL, we can put quote escaped variables declarations\n# into `config.status', and then the shell code to quote escape them in\n# for loops in `config.status'.  Finally, any additional code accumulated\n# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.\nm4_defun([_LT_CONFIG_COMMANDS],\n[AC_PROVIDE_IFELSE([LT_OUTPUT],\n\tdnl If the libtool generation code has been placed in $CONFIG_LT,\n\tdnl instead of duplicating it all over again into config.status,\n\tdnl then we will have config.status run $CONFIG_LT later, so it\n\tdnl needs to know what name is stored there:\n        [AC_CONFIG_COMMANDS([libtool],\n            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],\n    dnl If the libtool generation code is destined for config.status,\n    dnl expand the accumulated commands and init code now:\n    [AC_CONFIG_COMMANDS([libtool],\n        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])\n])#_LT_CONFIG_COMMANDS\n\n\n# Initialize.\nm4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],\n[\n\n# The HP-UX ksh and POSIX shell print the target directory to stdout\n# if CDPATH is set.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\nsed_quote_subst='$sed_quote_subst'\ndouble_quote_subst='$double_quote_subst'\ndelay_variable_subst='$delay_variable_subst'\n_LT_CONFIG_STATUS_DECLARATIONS\nLTCC='$LTCC'\nLTCFLAGS='$LTCFLAGS'\ncompiler='$compiler_DEFAULT'\n\n# Quote evaled strings.\nfor var in lt_decl_all_varnames([[ \\\n]], lt_decl_quote_varnames); do\n    case \\`eval \\\\\\\\\\$ECHO \"X\\\\\\\\\\$\\$var\"\\` in\n    *[[\\\\\\\\\\\\\\`\\\\\"\\\\\\$]]*)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\`\\\\\\$ECHO \\\\\"X\\\\\\$\\$var\\\\\" | \\\\\\$Xsed -e \\\\\"\\\\\\$sed_quote_subst\\\\\"\\\\\\`\\\\\\\\\\\\\"\"\n      ;;\n    *)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\$\\$var\\\\\\\\\\\\\"\"\n      ;;\n    esac\ndone\n\n# Double-quote double-evaled strings.\nfor var in lt_decl_all_varnames([[ \\\n]], lt_decl_dquote_varnames); do\n    case \\`eval \\\\\\\\\\$ECHO \"X\\\\\\\\\\$\\$var\"\\` in\n    *[[\\\\\\\\\\\\\\`\\\\\"\\\\\\$]]*)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\`\\\\\\$ECHO \\\\\"X\\\\\\$\\$var\\\\\" | \\\\\\$Xsed -e \\\\\"\\\\\\$double_quote_subst\\\\\" -e \\\\\"\\\\\\$sed_quote_subst\\\\\" -e \\\\\"\\\\\\$delay_variable_subst\\\\\"\\\\\\`\\\\\\\\\\\\\"\"\n      ;;\n    *)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\$\\$var\\\\\\\\\\\\\"\"\n      ;;\n    esac\ndone\n\n# Fix-up fallback echo if it was mangled by the above quoting rules.\ncase \\$lt_ECHO in\n*'\\\\\\[$]0 --fallback-echo\"')dnl \"\n  lt_ECHO=\\`\\$ECHO \"X\\$lt_ECHO\" | \\$Xsed -e 's/\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\[$]0 --fallback-echo\"\\[$]/\\[$]0 --fallback-echo\"/'\\`\n  ;;\nesac\n\n_LT_OUTPUT_LIBTOOL_INIT\n])\n\n\n# LT_OUTPUT\n# ---------\n# This macro allows early generation of the libtool script (before\n# AC_OUTPUT is called), incase it is used in configure for compilation\n# tests.\nAC_DEFUN([LT_OUTPUT],\n[: ${CONFIG_LT=./config.lt}\nAC_MSG_NOTICE([creating $CONFIG_LT])\ncat >\"$CONFIG_LT\" <<_LTEOF\n#! $SHELL\n# Generated by $as_me.\n# Run this file to recreate a libtool stub with the current configuration.\n\nlt_cl_silent=false\nSHELL=\\${CONFIG_SHELL-$SHELL}\n_LTEOF\n\ncat >>\"$CONFIG_LT\" <<\\_LTEOF\nAS_SHELL_SANITIZE\n_AS_PREPARE\n\nexec AS_MESSAGE_FD>&1\nexec AS_MESSAGE_LOG_FD>>config.log\n{\n  echo\n  AS_BOX([Running $as_me.])\n} >&AS_MESSAGE_LOG_FD\n\nlt_cl_help=\"\\\n\\`$as_me' creates a local libtool stub from the current configuration,\nfor use in further configure time tests before the real libtool is\ngenerated.\n\nUsage: $[0] [[OPTIONS]]\n\n  -h, --help      print this help, then exit\n  -V, --version   print version number, then exit\n  -q, --quiet     do not print progress messages\n  -d, --debug     don't remove temporary files\n\nReport bugs to <bug-libtool@gnu.org>.\"\n\nlt_cl_version=\"\\\nm4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl\nm4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])\nconfigured by $[0], generated by m4_PACKAGE_STRING.\n\nCopyright (C) 2008 Free Software Foundation, Inc.\nThis config.lt script is free software; the Free Software Foundation\ngives unlimited permision to copy, distribute and modify it.\"\n\nwhile test $[#] != 0\ndo\n  case $[1] in\n    --version | --v* | -V )\n      echo \"$lt_cl_version\"; exit 0 ;;\n    --help | --h* | -h )\n      echo \"$lt_cl_help\"; exit 0 ;;\n    --debug | --d* | -d )\n      debug=: ;;\n    --quiet | --q* | --silent | --s* | -q )\n      lt_cl_silent=: ;;\n\n    -*) AC_MSG_ERROR([unrecognized option: $[1]\nTry \\`$[0] --help' for more information.]) ;;\n\n    *) AC_MSG_ERROR([unrecognized argument: $[1]\nTry \\`$[0] --help' for more information.]) ;;\n  esac\n  shift\ndone\n\nif $lt_cl_silent; then\n  exec AS_MESSAGE_FD>/dev/null\nfi\n_LTEOF\n\ncat >>\"$CONFIG_LT\" <<_LTEOF\n_LT_OUTPUT_LIBTOOL_COMMANDS_INIT\n_LTEOF\n\ncat >>\"$CONFIG_LT\" <<\\_LTEOF\nAC_MSG_NOTICE([creating $ofile])\n_LT_OUTPUT_LIBTOOL_COMMANDS\nAS_EXIT(0)\n_LTEOF\nchmod +x \"$CONFIG_LT\"\n\n# configure is writing to config.log, but config.lt does its own redirection,\n# appending to config.log, which fails on DOS, as config.log is still kept\n# open by configure.  Here we exec the FD to /dev/null, effectively closing\n# config.log, so it can be properly (re)opened and appended to by config.lt.\nif test \"$no_create\" != yes; then\n  lt_cl_success=:\n  test \"$silent\" = yes &&\n    lt_config_lt_args=\"$lt_config_lt_args --quiet\"\n  exec AS_MESSAGE_LOG_FD>/dev/null\n  $SHELL \"$CONFIG_LT\" $lt_config_lt_args || lt_cl_success=false\n  exec AS_MESSAGE_LOG_FD>>config.log\n  $lt_cl_success || AS_EXIT(1)\nfi\n])# LT_OUTPUT\n\n\n# _LT_CONFIG(TAG)\n# ---------------\n# If TAG is the built-in tag, create an initial libtool script with a\n# default configuration from the untagged config vars.  Otherwise add code\n# to config.status for appending the configuration named by TAG from the\n# matching tagged config vars.\nm4_defun([_LT_CONFIG],\n[m4_require([_LT_FILEUTILS_DEFAULTS])dnl\n_LT_CONFIG_SAVE_COMMANDS([\n  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl\n  m4_if(_LT_TAG, [C], [\n    # See if we are running on zsh, and set the options which allow our\n    # commands through without removal of \\ escapes.\n    if test -n \"${ZSH_VERSION+set}\" ; then\n      setopt NO_GLOB_SUBST\n    fi\n\n    cfgfile=\"${ofile}T\"\n    trap \"$RM \\\"$cfgfile\\\"; exit 1\" 1 2 15\n    $RM \"$cfgfile\"\n\n    cat <<_LT_EOF >> \"$cfgfile\"\n#! $SHELL\n\n# `$ECHO \"$ofile\" | sed 's%^.*/%%'` - Provide generalized library-building support services.\n# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION\n# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:\n# NOTE: Changes made to this file will be lost: look at ltmain.sh.\n#\n_LT_COPYING\n_LT_LIBTOOL_TAGS\n\n# ### BEGIN LIBTOOL CONFIG\n_LT_LIBTOOL_CONFIG_VARS\n_LT_LIBTOOL_TAG_VARS\n# ### END LIBTOOL CONFIG\n\n_LT_EOF\n\n  case $host_os in\n  aix3*)\n    cat <<\\_LT_EOF >> \"$cfgfile\"\n# AIX sometimes has problems with the GCC collect2 program.  For some\n# reason, if we set the COLLECT_NAMES environment variable, the problems\n# vanish in a puff of smoke.\nif test \"X${COLLECT_NAMES+set}\" != Xset; then\n  COLLECT_NAMES=\n  export COLLECT_NAMES\nfi\n_LT_EOF\n    ;;\n  esac\n\n  _LT_PROG_LTMAIN\n\n  # We use sed instead of cat because bash on DJGPP gets confused if\n  # if finds mixed CR/LF and LF-only lines.  Since sed operates in\n  # text mode, it properly converts lines to CR/LF.  This bash problem\n  # is reportedly fixed, but why not run on old versions too?\n  sed '/^# Generated shell functions inserted here/q' \"$ltmain\" >> \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\"; exit 1)\n\n  _LT_PROG_XSI_SHELLFNS\n\n  sed -n '/^# Generated shell functions inserted here/,$p' \"$ltmain\" >> \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\"; exit 1)\n\n  mv -f \"$cfgfile\" \"$ofile\" ||\n    (rm -f \"$ofile\" && cp \"$cfgfile\" \"$ofile\" && rm -f \"$cfgfile\")\n  chmod +x \"$ofile\"\n],\n[cat <<_LT_EOF >> \"$ofile\"\n\ndnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded\ndnl in a comment (ie after a #).\n# ### BEGIN LIBTOOL TAG CONFIG: $1\n_LT_LIBTOOL_TAG_VARS(_LT_TAG)\n# ### END LIBTOOL TAG CONFIG: $1\n_LT_EOF\n])dnl /m4_if\n],\n[m4_if([$1], [], [\n    PACKAGE='$PACKAGE'\n    VERSION='$VERSION'\n    TIMESTAMP='$TIMESTAMP'\n    RM='$RM'\n    ofile='$ofile'], [])\n])dnl /_LT_CONFIG_SAVE_COMMANDS\n])# _LT_CONFIG\n\n\n# LT_SUPPORTED_TAG(TAG)\n# ---------------------\n# Trace this macro to discover what tags are supported by the libtool\n# --tag option, using:\n#    autoconf --trace 'LT_SUPPORTED_TAG:$1'\nAC_DEFUN([LT_SUPPORTED_TAG], [])\n\n\n# C support is built-in for now\nm4_define([_LT_LANG_C_enabled], [])\nm4_define([_LT_TAGS], [])\n\n\n# LT_LANG(LANG)\n# -------------\n# Enable libtool support for the given language if not already enabled.\nAC_DEFUN([LT_LANG],\n[AC_BEFORE([$0], [LT_OUTPUT])dnl\nm4_case([$1],\n  [C],\t\t\t[_LT_LANG(C)],\n  [C++],\t\t[_LT_LANG(CXX)],\n  [Java],\t\t[_LT_LANG(GCJ)],\n  [Fortran 77],\t\t[_LT_LANG(F77)],\n  [Fortran],\t\t[_LT_LANG(FC)],\n  [Windows Resource],\t[_LT_LANG(RC)],\n  [m4_ifdef([_LT_LANG_]$1[_CONFIG],\n    [_LT_LANG($1)],\n    [m4_fatal([$0: unsupported language: \"$1\"])])])dnl\n])# LT_LANG\n\n\n# _LT_LANG(LANGNAME)\n# ------------------\nm4_defun([_LT_LANG],\n[m4_ifdef([_LT_LANG_]$1[_enabled], [],\n  [LT_SUPPORTED_TAG([$1])dnl\n  m4_append([_LT_TAGS], [$1 ])dnl\n  m4_define([_LT_LANG_]$1[_enabled], [])dnl\n  _LT_LANG_$1_CONFIG($1)])dnl\n])# _LT_LANG\n\n\n# _LT_LANG_DEFAULT_CONFIG\n# -----------------------\nm4_defun([_LT_LANG_DEFAULT_CONFIG],\n[AC_PROVIDE_IFELSE([AC_PROG_CXX],\n  [LT_LANG(CXX)],\n  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])\n\nAC_PROVIDE_IFELSE([AC_PROG_F77],\n  [LT_LANG(F77)],\n  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])\n\nAC_PROVIDE_IFELSE([AC_PROG_FC],\n  [LT_LANG(FC)],\n  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])\n\ndnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal\ndnl pulling things in needlessly.\nAC_PROVIDE_IFELSE([AC_PROG_GCJ],\n  [LT_LANG(GCJ)],\n  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],\n    [LT_LANG(GCJ)],\n    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],\n      [LT_LANG(GCJ)],\n      [m4_ifdef([AC_PROG_GCJ],\n\t[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])\n       m4_ifdef([A][M_PROG_GCJ],\n\t[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])\n       m4_ifdef([LT_PROG_GCJ],\n\t[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])\n\nAC_PROVIDE_IFELSE([LT_PROG_RC],\n  [LT_LANG(RC)],\n  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])\n])# _LT_LANG_DEFAULT_CONFIG\n\n# Obsolete macros:\nAU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])\nAU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])\nAU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])\nAU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_CXX], [])\ndnl AC_DEFUN([AC_LIBTOOL_F77], [])\ndnl AC_DEFUN([AC_LIBTOOL_FC], [])\ndnl AC_DEFUN([AC_LIBTOOL_GCJ], [])\n\n\n# _LT_TAG_COMPILER\n# ----------------\nm4_defun([_LT_TAG_COMPILER],\n[AC_REQUIRE([AC_PROG_CC])dnl\n\n_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl\n_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl\n_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl\n_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl\n\n# If no C compiler was specified, use CC.\nLTCC=${LTCC-\"$CC\"}\n\n# If no C compiler flags were specified, use CFLAGS.\nLTCFLAGS=${LTCFLAGS-\"$CFLAGS\"}\n\n# Allow CC to be a program name with arguments.\ncompiler=$CC\n])# _LT_TAG_COMPILER\n\n\n# _LT_COMPILER_BOILERPLATE\n# ------------------------\n# Check for compiler boilerplate output or warnings with\n# the simple compiler test code.\nm4_defun([_LT_COMPILER_BOILERPLATE],\n[m4_require([_LT_DECL_SED])dnl\nac_outfile=conftest.$ac_objext\necho \"$lt_simple_compile_test_code\" >conftest.$ac_ext\neval \"$ac_compile\" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err\n_lt_compiler_boilerplate=`cat conftest.err`\n$RM conftest*\n])# _LT_COMPILER_BOILERPLATE\n\n\n# _LT_LINKER_BOILERPLATE\n# ----------------------\n# Check for linker boilerplate output or warnings with\n# the simple link test code.\nm4_defun([_LT_LINKER_BOILERPLATE],\n[m4_require([_LT_DECL_SED])dnl\nac_outfile=conftest.$ac_objext\necho \"$lt_simple_link_test_code\" >conftest.$ac_ext\neval \"$ac_link\" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err\n_lt_linker_boilerplate=`cat conftest.err`\n$RM -r conftest*\n])# _LT_LINKER_BOILERPLATE\n\n# _LT_REQUIRED_DARWIN_CHECKS\n# -------------------------\nm4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[\n  case $host_os in\n    rhapsody* | darwin*)\n    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])\n    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])\n    AC_CHECK_TOOL([LIPO], [lipo], [:])\n    AC_CHECK_TOOL([OTOOL], [otool], [:])\n    AC_CHECK_TOOL([OTOOL64], [otool64], [:])\n    _LT_DECL([], [DSYMUTIL], [1],\n      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])\n    _LT_DECL([], [NMEDIT], [1],\n      [Tool to change global to local symbols on Mac OS X])\n    _LT_DECL([], [LIPO], [1],\n      [Tool to manipulate fat objects and archives on Mac OS X])\n    _LT_DECL([], [OTOOL], [1],\n      [ldd/readelf like tool for Mach-O binaries on Mac OS X])\n    _LT_DECL([], [OTOOL64], [1],\n      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])\n\n    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],\n      [lt_cv_apple_cc_single_mod=no\n      if test -z \"${LT_MULTI_MODULE}\"; then\n\t# By default we will add the -single_module flag. You can override\n\t# by either setting the environment variable LT_MULTI_MODULE\n\t# non-empty at configure time, or by adding -multi_module to the\n\t# link flags.\n\trm -rf libconftest.dylib*\n\techo \"int foo(void){return 1;}\" > conftest.c\n\techo \"$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \\\n-dynamiclib -Wl,-single_module conftest.c\" >&AS_MESSAGE_LOG_FD\n\t$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \\\n\t  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err\n        _lt_result=$?\n\tif test -f libconftest.dylib && test ! -s conftest.err && test $_lt_result = 0; then\n\t  lt_cv_apple_cc_single_mod=yes\n\telse\n\t  cat conftest.err >&AS_MESSAGE_LOG_FD\n\tfi\n\trm -rf libconftest.dylib*\n\trm -f conftest.*\n      fi])\n    AC_CACHE_CHECK([for -exported_symbols_list linker flag],\n      [lt_cv_ld_exported_symbols_list],\n      [lt_cv_ld_exported_symbols_list=no\n      save_LDFLAGS=$LDFLAGS\n      echo \"_main\" > conftest.sym\n      LDFLAGS=\"$LDFLAGS -Wl,-exported_symbols_list,conftest.sym\"\n      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],\n\t[lt_cv_ld_exported_symbols_list=yes],\n\t[lt_cv_ld_exported_symbols_list=no])\n\tLDFLAGS=\"$save_LDFLAGS\"\n    ])\n    case $host_os in\n    rhapsody* | darwin1.[[012]])\n      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;\n    darwin1.*)\n      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;\n    darwin*) # darwin 5.x on\n      # if running on 10.5 or later, the deployment target defaults\n      # to the OS version, if on x86, and 10.4, the deployment\n      # target defaults to 10.4. Don't you love it?\n      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in\n\t10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)\n\t  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;\n\t10.[[012]]*)\n\t  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;\n\t10.*)\n\t  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;\n      esac\n    ;;\n  esac\n    if test \"$lt_cv_apple_cc_single_mod\" = \"yes\"; then\n      _lt_dar_single_mod='$single_module'\n    fi\n    if test \"$lt_cv_ld_exported_symbols_list\" = \"yes\"; then\n      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'\n    else\n      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'\n    fi\n    if test \"$DSYMUTIL\" != \":\"; then\n      _lt_dsymutil='~$DSYMUTIL $lib || :'\n    else\n      _lt_dsymutil=\n    fi\n    ;;\n  esac\n])\n\n\n# _LT_DARWIN_LINKER_FEATURES\n# --------------------------\n# Checks for linker and compiler features on darwin\nm4_defun([_LT_DARWIN_LINKER_FEATURES],\n[\n  m4_require([_LT_REQUIRED_DARWIN_CHECKS])\n  _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n  _LT_TAGVAR(hardcode_direct, $1)=no\n  _LT_TAGVAR(hardcode_automatic, $1)=yes\n  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported\n  _LT_TAGVAR(whole_archive_flag_spec, $1)=''\n  _LT_TAGVAR(link_all_deplibs, $1)=yes\n  _LT_TAGVAR(allow_undefined_flag, $1)=\"$_lt_dar_allow_undefined\"\n  case $cc_basename in\n     ifort*) _lt_dar_can_shared=yes ;;\n     *) _lt_dar_can_shared=$GCC ;;\n  esac\n  if test \"$_lt_dar_can_shared\" = \"yes\"; then\n    output_verbose_link_cmd=echo\n    _LT_TAGVAR(archive_cmds, $1)=\"\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\$libobjs \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring $_lt_dar_single_mod${_lt_dsymutil}\"\n    _LT_TAGVAR(module_cmds, $1)=\"\\$CC \\$allow_undefined_flag -o \\$lib -bundle \\$libobjs \\$deplibs \\$compiler_flags${_lt_dsymutil}\"\n    _LT_TAGVAR(archive_expsym_cmds, $1)=\"sed 's,^,_,' < \\$export_symbols > \\$output_objdir/\\${libname}-symbols.expsym~\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\$libobjs \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}\"\n    _LT_TAGVAR(module_expsym_cmds, $1)=\"sed -e 's,^,_,' < \\$export_symbols > \\$output_objdir/\\${libname}-symbols.expsym~\\$CC \\$allow_undefined_flag -o \\$lib -bundle \\$libobjs \\$deplibs \\$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}\"\n    m4_if([$1], [CXX],\n[   if test \"$lt_cv_apple_cc_single_mod\" != \"yes\"; then\n      _LT_TAGVAR(archive_cmds, $1)=\"\\$CC -r -keep_private_externs -nostdlib -o \\${lib}-master.o \\$libobjs~\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\${lib}-master.o \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring${_lt_dsymutil}\"\n      _LT_TAGVAR(archive_expsym_cmds, $1)=\"sed 's,^,_,' < \\$export_symbols > \\$output_objdir/\\${libname}-symbols.expsym~\\$CC -r -keep_private_externs -nostdlib -o \\${lib}-master.o \\$libobjs~\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\${lib}-master.o \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring${_lt_dar_export_syms}${_lt_dsymutil}\"\n    fi\n],[])\n  else\n  _LT_TAGVAR(ld_shlibs, $1)=no\n  fi\n])\n\n# _LT_SYS_MODULE_PATH_AIX\n# -----------------------\n# Links a minimal program and checks the executable\n# for the system default hardcoded library path. In most cases,\n# this is /usr/lib:/lib, but when the MPI compilers are used\n# the location of the communication and MPI libs are included too.\n# If we don't find anything, use the default library path according\n# to the aix ld manual.\nm4_defun([_LT_SYS_MODULE_PATH_AIX],\n[m4_require([_LT_DECL_SED])dnl\nAC_LINK_IFELSE(AC_LANG_PROGRAM,[\nlt_aix_libpath_sed='\n    /Import File Strings/,/^$/ {\n\t/^0/ {\n\t    s/^0  *\\(.*\\)$/\\1/\n\t    p\n\t}\n    }'\naix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n# Check for a 64-bit object if we didn't find anything.\nif test -z \"$aix_libpath\"; then\n  aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\nfi],[])\nif test -z \"$aix_libpath\"; then aix_libpath=\"/usr/lib:/lib\"; fi\n])# _LT_SYS_MODULE_PATH_AIX\n\n\n# _LT_SHELL_INIT(ARG)\n# -------------------\nm4_define([_LT_SHELL_INIT],\n[ifdef([AC_DIVERSION_NOTICE],\n\t     [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],\n\t [AC_DIVERT_PUSH(NOTICE)])\n$1\nAC_DIVERT_POP\n])# _LT_SHELL_INIT\n\n\n# _LT_PROG_ECHO_BACKSLASH\n# -----------------------\n# Add some code to the start of the generated configure script which\n# will find an echo command which doesn't interpret backslashes.\nm4_defun([_LT_PROG_ECHO_BACKSLASH],\n[_LT_SHELL_INIT([\n# Check that we are running under the correct shell.\nSHELL=${CONFIG_SHELL-/bin/sh}\n\ncase X$lt_ECHO in\nX*--fallback-echo)\n  # Remove one level of quotation (which was required for Make).\n  ECHO=`echo \"$lt_ECHO\" | sed 's,\\\\\\\\\\[$]\\\\[$]0,'[$]0','`\n  ;;\nesac\n\nECHO=${lt_ECHO-echo}\nif test \"X[$]1\" = X--no-reexec; then\n  # Discard the --no-reexec flag, and continue.\n  shift\nelif test \"X[$]1\" = X--fallback-echo; then\n  # Avoid inline document here, it may be left over\n  :\nelif test \"X`{ $ECHO '\\t'; } 2>/dev/null`\" = 'X\\t' ; then\n  # Yippee, $ECHO works!\n  :\nelse\n  # Restart under the correct shell.\n  exec $SHELL \"[$]0\" --no-reexec ${1+\"[$]@\"}\nfi\n\nif test \"X[$]1\" = X--fallback-echo; then\n  # used as fallback echo\n  shift\n  cat <<_LT_EOF\n[$]*\n_LT_EOF\n  exit 0\nfi\n\n# The HP-UX ksh and POSIX shell print the target directory to stdout\n# if CDPATH is set.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\nif test -z \"$lt_ECHO\"; then\n  if test \"X${echo_test_string+set}\" != Xset; then\n    # find a string as large as possible, as long as the shell can cope with it\n    for cmd in 'sed 50q \"[$]0\"' 'sed 20q \"[$]0\"' 'sed 10q \"[$]0\"' 'sed 2q \"[$]0\"' 'echo test'; do\n      # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...\n      if { echo_test_string=`eval $cmd`; } 2>/dev/null &&\n\t { test \"X$echo_test_string\" = \"X$echo_test_string\"; } 2>/dev/null\n      then\n        break\n      fi\n    done\n  fi\n\n  if test \"X`{ $ECHO '\\t'; } 2>/dev/null`\" = 'X\\t' &&\n     echo_testing_string=`{ $ECHO \"$echo_test_string\"; } 2>/dev/null` &&\n     test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n    :\n  else\n    # The Solaris, AIX, and Digital Unix default echo programs unquote\n    # backslashes.  This makes it impossible to quote backslashes using\n    #   echo \"$something\" | sed 's/\\\\/\\\\\\\\/g'\n    #\n    # So, first we look for a working echo in the user's PATH.\n\n    lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n    for dir in $PATH /usr/ucb; do\n      IFS=\"$lt_save_ifs\"\n      if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&\n         test \"X`($dir/echo '\\t') 2>/dev/null`\" = 'X\\t' &&\n         echo_testing_string=`($dir/echo \"$echo_test_string\") 2>/dev/null` &&\n         test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n        ECHO=\"$dir/echo\"\n        break\n      fi\n    done\n    IFS=\"$lt_save_ifs\"\n\n    if test \"X$ECHO\" = Xecho; then\n      # We didn't find a better echo, so look for alternatives.\n      if test \"X`{ print -r '\\t'; } 2>/dev/null`\" = 'X\\t' &&\n         echo_testing_string=`{ print -r \"$echo_test_string\"; } 2>/dev/null` &&\n         test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n        # This shell has a builtin print -r that does the trick.\n        ECHO='print -r'\n      elif { test -f /bin/ksh || test -f /bin/ksh$ac_exeext; } &&\n\t   test \"X$CONFIG_SHELL\" != X/bin/ksh; then\n        # If we have ksh, try running configure again with it.\n        ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}\n        export ORIGINAL_CONFIG_SHELL\n        CONFIG_SHELL=/bin/ksh\n        export CONFIG_SHELL\n        exec $CONFIG_SHELL \"[$]0\" --no-reexec ${1+\"[$]@\"}\n      else\n        # Try using printf.\n        ECHO='printf %s\\n'\n        if test \"X`{ $ECHO '\\t'; } 2>/dev/null`\" = 'X\\t' &&\n\t   echo_testing_string=`{ $ECHO \"$echo_test_string\"; } 2>/dev/null` &&\n\t   test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n\t  # Cool, printf works\n\t  :\n        elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL \"[$]0\" --fallback-echo '\\t') 2>/dev/null` &&\n\t     test \"X$echo_testing_string\" = 'X\\t' &&\n\t     echo_testing_string=`($ORIGINAL_CONFIG_SHELL \"[$]0\" --fallback-echo \"$echo_test_string\") 2>/dev/null` &&\n\t     test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n\t  CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL\n\t  export CONFIG_SHELL\n\t  SHELL=\"$CONFIG_SHELL\"\n\t  export SHELL\n\t  ECHO=\"$CONFIG_SHELL [$]0 --fallback-echo\"\n        elif echo_testing_string=`($CONFIG_SHELL \"[$]0\" --fallback-echo '\\t') 2>/dev/null` &&\n\t     test \"X$echo_testing_string\" = 'X\\t' &&\n\t     echo_testing_string=`($CONFIG_SHELL \"[$]0\" --fallback-echo \"$echo_test_string\") 2>/dev/null` &&\n\t     test \"X$echo_testing_string\" = \"X$echo_test_string\"; then\n\t  ECHO=\"$CONFIG_SHELL [$]0 --fallback-echo\"\n        else\n\t  # maybe with a smaller string...\n\t  prev=:\n\n\t  for cmd in 'echo test' 'sed 2q \"[$]0\"' 'sed 10q \"[$]0\"' 'sed 20q \"[$]0\"' 'sed 50q \"[$]0\"'; do\n\t    if { test \"X$echo_test_string\" = \"X`eval $cmd`\"; } 2>/dev/null\n\t    then\n\t      break\n\t    fi\n\t    prev=\"$cmd\"\n\t  done\n\n\t  if test \"$prev\" != 'sed 50q \"[$]0\"'; then\n\t    echo_test_string=`eval $prev`\n\t    export echo_test_string\n\t    exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} \"[$]0\" ${1+\"[$]@\"}\n\t  else\n\t    # Oops.  We lost completely, so just stick with echo.\n\t    ECHO=echo\n\t  fi\n        fi\n      fi\n    fi\n  fi\nfi\n\n# Copy echo and quote the copy suitably for passing to libtool from\n# the Makefile, instead of quoting the original, which is used later.\nlt_ECHO=$ECHO\nif test \"X$lt_ECHO\" = \"X$CONFIG_SHELL [$]0 --fallback-echo\"; then\n   lt_ECHO=\"$CONFIG_SHELL \\\\\\$\\[$]0 --fallback-echo\"\nfi\n\nAC_SUBST(lt_ECHO)\n])\n_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])\n_LT_DECL([], [ECHO], [1],\n    [An echo program that does not interpret backslashes])\n])# _LT_PROG_ECHO_BACKSLASH\n\n\n# _LT_ENABLE_LOCK\n# ---------------\nm4_defun([_LT_ENABLE_LOCK],\n[AC_ARG_ENABLE([libtool-lock],\n  [AS_HELP_STRING([--disable-libtool-lock],\n    [avoid locking (might break parallel builds)])])\ntest \"x$enable_libtool_lock\" != xno && enable_libtool_lock=yes\n\n# Some flags need to be propagated to the compiler or linker for good\n# libtool support.\ncase $host in\nia64-*-hpux*)\n  # Find out which ABI we are using.\n  echo 'int i;' > conftest.$ac_ext\n  if AC_TRY_EVAL(ac_compile); then\n    case `/usr/bin/file conftest.$ac_objext` in\n      *ELF-32*)\n\tHPUX_IA64_MODE=\"32\"\n\t;;\n      *ELF-64*)\n\tHPUX_IA64_MODE=\"64\"\n\t;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\n*-*-irix6*)\n  # Find out which ABI we are using.\n  echo '[#]line __oline__ \"configure\"' > conftest.$ac_ext\n  if AC_TRY_EVAL(ac_compile); then\n    if test \"$lt_cv_prog_gnu_ld\" = yes; then\n      case `/usr/bin/file conftest.$ac_objext` in\n\t*32-bit*)\n\t  LD=\"${LD-ld} -melf32bsmip\"\n\t  ;;\n\t*N32*)\n\t  LD=\"${LD-ld} -melf32bmipn32\"\n\t  ;;\n\t*64-bit*)\n\t  LD=\"${LD-ld} -melf64bmip\"\n\t;;\n      esac\n    else\n      case `/usr/bin/file conftest.$ac_objext` in\n\t*32-bit*)\n\t  LD=\"${LD-ld} -32\"\n\t  ;;\n\t*N32*)\n\t  LD=\"${LD-ld} -n32\"\n\t  ;;\n\t*64-bit*)\n\t  LD=\"${LD-ld} -64\"\n\t  ;;\n      esac\n    fi\n  fi\n  rm -rf conftest*\n  ;;\n\nx86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \\\ns390*-*linux*|s390*-*tpf*|sparc*-*linux*)\n  # Find out which ABI we are using.\n  echo 'int i;' > conftest.$ac_ext\n  if AC_TRY_EVAL(ac_compile); then\n    case `/usr/bin/file conftest.o` in\n      *32-bit*)\n\tcase $host in\n\t  x86_64-*kfreebsd*-gnu)\n\t    LD=\"${LD-ld} -m elf_i386_fbsd\"\n\t    ;;\n\t  x86_64-*linux*)\n\t    LD=\"${LD-ld} -m elf_i386\"\n\t    ;;\n\t  ppc64-*linux*|powerpc64-*linux*)\n\t    LD=\"${LD-ld} -m elf32ppclinux\"\n\t    ;;\n\t  s390x-*linux*)\n\t    LD=\"${LD-ld} -m elf_s390\"\n\t    ;;\n\t  sparc64-*linux*)\n\t    LD=\"${LD-ld} -m elf32_sparc\"\n\t    ;;\n\tesac\n\t;;\n      *64-bit*)\n\tcase $host in\n\t  x86_64-*kfreebsd*-gnu)\n\t    LD=\"${LD-ld} -m elf_x86_64_fbsd\"\n\t    ;;\n\t  x86_64-*linux*)\n\t    LD=\"${LD-ld} -m elf_x86_64\"\n\t    ;;\n\t  ppc*-*linux*|powerpc*-*linux*)\n\t    LD=\"${LD-ld} -m elf64ppc\"\n\t    ;;\n\t  s390*-*linux*|s390*-*tpf*)\n\t    LD=\"${LD-ld} -m elf64_s390\"\n\t    ;;\n\t  sparc*-*linux*)\n\t    LD=\"${LD-ld} -m elf64_sparc\"\n\t    ;;\n\tesac\n\t;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\n\n*-*-sco3.2v5*)\n  # On SCO OpenServer 5, we need -belf to get full-featured binaries.\n  SAVE_CFLAGS=\"$CFLAGS\"\n  CFLAGS=\"$CFLAGS -belf\"\n  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,\n    [AC_LANG_PUSH(C)\n     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])\n     AC_LANG_POP])\n  if test x\"$lt_cv_cc_needs_belf\" != x\"yes\"; then\n    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf\n    CFLAGS=\"$SAVE_CFLAGS\"\n  fi\n  ;;\nsparc*-*solaris*)\n  # Find out which ABI we are using.\n  echo 'int i;' > conftest.$ac_ext\n  if AC_TRY_EVAL(ac_compile); then\n    case `/usr/bin/file conftest.o` in\n    *64-bit*)\n      case $lt_cv_prog_gnu_ld in\n      yes*) LD=\"${LD-ld} -m elf64_sparc\" ;;\n      *)\n\tif ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then\n\t  LD=\"${LD-ld} -64\"\n\tfi\n\t;;\n      esac\n      ;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\nesac\n\nneed_locks=\"$enable_libtool_lock\"\n])# _LT_ENABLE_LOCK\n\n\n# _LT_CMD_OLD_ARCHIVE\n# -------------------\nm4_defun([_LT_CMD_OLD_ARCHIVE],\n[AC_CHECK_TOOL(AR, ar, false)\ntest -z \"$AR\" && AR=ar\ntest -z \"$AR_FLAGS\" && AR_FLAGS=cru\n_LT_DECL([], [AR], [1], [The archiver])\n_LT_DECL([], [AR_FLAGS], [1])\n\nAC_CHECK_TOOL(STRIP, strip, :)\ntest -z \"$STRIP\" && STRIP=:\n_LT_DECL([], [STRIP], [1], [A symbol stripping program])\n\nAC_CHECK_TOOL(RANLIB, ranlib, :)\ntest -z \"$RANLIB\" && RANLIB=:\n_LT_DECL([], [RANLIB], [1],\n    [Commands used to install an old-style archive])\n\n# Determine commands to create old-style static archives.\nold_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'\nold_postinstall_cmds='chmod 644 $oldlib'\nold_postuninstall_cmds=\n\nif test -n \"$RANLIB\"; then\n  case $host_os in\n  openbsd*)\n    old_postinstall_cmds=\"$old_postinstall_cmds~\\$RANLIB -t \\$oldlib\"\n    ;;\n  *)\n    old_postinstall_cmds=\"$old_postinstall_cmds~\\$RANLIB \\$oldlib\"\n    ;;\n  esac\n  old_archive_cmds=\"$old_archive_cmds~\\$RANLIB \\$oldlib\"\nfi\n_LT_DECL([], [old_postinstall_cmds], [2])\n_LT_DECL([], [old_postuninstall_cmds], [2])\n_LT_TAGDECL([], [old_archive_cmds], [2],\n    [Commands used to build an old-style archive])\n])# _LT_CMD_OLD_ARCHIVE\n\n\n# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,\n#\t\t[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])\n# ----------------------------------------------------------------\n# Check whether the given compiler option works\nAC_DEFUN([_LT_COMPILER_OPTION],\n[m4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_DECL_SED])dnl\nAC_CACHE_CHECK([$1], [$2],\n  [$2=no\n   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n   lt_compiler_flag=\"$3\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   # The option is referenced via a variable to avoid confusing sed.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [[^ ]]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:__oline__: $lt_compile\\\"\" >&AS_MESSAGE_LOG_FD)\n   (eval \"$lt_compile\" 2>conftest.err)\n   ac_status=$?\n   cat conftest.err >&AS_MESSAGE_LOG_FD\n   echo \"$as_me:__oline__: \\$? = $ac_status\" >&AS_MESSAGE_LOG_FD\n   if (exit $ac_status) && test -s \"$ac_outfile\"; then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings other than the usual output.\n     $ECHO \"X$_lt_compiler_boilerplate\" | $Xsed -e '/^$/d' >conftest.exp\n     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then\n       $2=yes\n     fi\n   fi\n   $RM conftest*\n])\n\nif test x\"[$]$2\" = xyes; then\n    m4_if([$5], , :, [$5])\nelse\n    m4_if([$6], , :, [$6])\nfi\n])# _LT_COMPILER_OPTION\n\n# Old name:\nAU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])\n\n\n# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,\n#                  [ACTION-SUCCESS], [ACTION-FAILURE])\n# ----------------------------------------------------\n# Check whether the given linker option works\nAC_DEFUN([_LT_LINKER_OPTION],\n[m4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_DECL_SED])dnl\nAC_CACHE_CHECK([$1], [$2],\n  [$2=no\n   save_LDFLAGS=\"$LDFLAGS\"\n   LDFLAGS=\"$LDFLAGS $3\"\n   echo \"$lt_simple_link_test_code\" > conftest.$ac_ext\n   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then\n     # The linker can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     if test -s conftest.err; then\n       # Append any errors to the config.log.\n       cat conftest.err 1>&AS_MESSAGE_LOG_FD\n       $ECHO \"X$_lt_linker_boilerplate\" | $Xsed -e '/^$/d' > conftest.exp\n       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n       if diff conftest.exp conftest.er2 >/dev/null; then\n         $2=yes\n       fi\n     else\n       $2=yes\n     fi\n   fi\n   $RM -r conftest*\n   LDFLAGS=\"$save_LDFLAGS\"\n])\n\nif test x\"[$]$2\" = xyes; then\n    m4_if([$4], , :, [$4])\nelse\n    m4_if([$5], , :, [$5])\nfi\n])# _LT_LINKER_OPTION\n\n# Old name:\nAU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])\n\n\n# LT_CMD_MAX_LEN\n#---------------\nAC_DEFUN([LT_CMD_MAX_LEN],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\n# find the maximum length of command line arguments\nAC_MSG_CHECKING([the maximum length of command line arguments])\nAC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl\n  i=0\n  teststring=\"ABCD\"\n\n  case $build_os in\n  msdosdjgpp*)\n    # On DJGPP, this test can blow up pretty badly due to problems in libc\n    # (any single argument exceeding 2000 bytes causes a buffer overrun\n    # during glob expansion).  Even if it were fixed, the result of this\n    # check would be larger than it should be.\n    lt_cv_sys_max_cmd_len=12288;    # 12K is about right\n    ;;\n\n  gnu*)\n    # Under GNU Hurd, this test is not required because there is\n    # no limit to the length of command line arguments.\n    # Libtool will interpret -1 as no limit whatsoever\n    lt_cv_sys_max_cmd_len=-1;\n    ;;\n\n  cygwin* | mingw* | cegcc*)\n    # On Win9x/ME, this test blows up -- it succeeds, but takes\n    # about 5 minutes as the teststring grows exponentially.\n    # Worse, since 9x/ME are not pre-emptively multitasking,\n    # you end up with a \"frozen\" computer, even though with patience\n    # the test eventually succeeds (with a max line length of 256k).\n    # Instead, let's just punt: use the minimum linelength reported by\n    # all of the supported platforms: 8192 (on NT/2K/XP).\n    lt_cv_sys_max_cmd_len=8192;\n    ;;\n\n  amigaos*)\n    # On AmigaOS with pdksh, this test takes hours, literally.\n    # So we just punt and use a minimum line length of 8192.\n    lt_cv_sys_max_cmd_len=8192;\n    ;;\n\n  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)\n    # This has been around since 386BSD, at least.  Likely further.\n    if test -x /sbin/sysctl; then\n      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`\n    elif test -x /usr/sbin/sysctl; then\n      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`\n    else\n      lt_cv_sys_max_cmd_len=65536\t# usable default for all BSDs\n    fi\n    # And add a safety zone\n    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 4`\n    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\* 3`\n    ;;\n\n  interix*)\n    # We know the value 262144 and hardcode it with a safety zone (like BSD)\n    lt_cv_sys_max_cmd_len=196608\n    ;;\n\n  osf*)\n    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure\n    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not\n    # nice to cause kernel panics so lets avoid the loop below.\n    # First set a reasonable default.\n    lt_cv_sys_max_cmd_len=16384\n    #\n    if test -x /sbin/sysconfig; then\n      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in\n        *1*) lt_cv_sys_max_cmd_len=-1 ;;\n      esac\n    fi\n    ;;\n  sco3.2v5*)\n    lt_cv_sys_max_cmd_len=102400\n    ;;\n  sysv5* | sco5v6* | sysv4.2uw2*)\n    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`\n    if test -n \"$kargmax\"; then\n      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[\t ]]//'`\n    else\n      lt_cv_sys_max_cmd_len=32768\n    fi\n    ;;\n  *)\n    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`\n    if test -n \"$lt_cv_sys_max_cmd_len\"; then\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 4`\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\* 3`\n    else\n      # Make teststring a little bigger before we do anything with it.\n      # a 1K string should be a reasonable start.\n      for i in 1 2 3 4 5 6 7 8 ; do\n        teststring=$teststring$teststring\n      done\n      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}\n      # If test is not a shell built-in, we'll probably end up computing a\n      # maximum length that is only half of the actual maximum length, but\n      # we can't tell.\n      while { test \"X\"`$SHELL [$]0 --fallback-echo \"X$teststring$teststring\" 2>/dev/null` \\\n\t         = \"XX$teststring$teststring\"; } >/dev/null 2>&1 &&\n\t      test $i != 17 # 1/2 MB should be enough\n      do\n        i=`expr $i + 1`\n        teststring=$teststring$teststring\n      done\n      # Only check the string length outside the loop.\n      lt_cv_sys_max_cmd_len=`expr \"X$teststring\" : \".*\" 2>&1`\n      teststring=\n      # Add a significant safety factor because C++ compilers can tack on\n      # massive amounts of additional arguments before passing them to the\n      # linker.  It appears as though 1/2 is a usable value.\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 2`\n    fi\n    ;;\n  esac\n])\nif test -n $lt_cv_sys_max_cmd_len ; then\n  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)\nelse\n  AC_MSG_RESULT(none)\nfi\nmax_cmd_len=$lt_cv_sys_max_cmd_len\n_LT_DECL([], [max_cmd_len], [0],\n    [What is the maximum length of a command?])\n])# LT_CMD_MAX_LEN\n\n# Old name:\nAU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])\n\n\n# _LT_HEADER_DLFCN\n# ----------------\nm4_defun([_LT_HEADER_DLFCN],\n[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl\n])# _LT_HEADER_DLFCN\n\n\n# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,\n#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)\n# ----------------------------------------------------------------\nm4_defun([_LT_TRY_DLOPEN_SELF],\n[m4_require([_LT_HEADER_DLFCN])dnl\nif test \"$cross_compiling\" = yes; then :\n  [$4]\nelse\n  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2\n  lt_status=$lt_dlunknown\n  cat > conftest.$ac_ext <<_LT_EOF\n[#line __oline__ \"configure\"\n#include \"confdefs.h\"\n\n#if HAVE_DLFCN_H\n#include <dlfcn.h>\n#endif\n\n#include <stdio.h>\n\n#ifdef RTLD_GLOBAL\n#  define LT_DLGLOBAL\t\tRTLD_GLOBAL\n#else\n#  ifdef DL_GLOBAL\n#    define LT_DLGLOBAL\t\tDL_GLOBAL\n#  else\n#    define LT_DLGLOBAL\t\t0\n#  endif\n#endif\n\n/* We may have to define LT_DLLAZY_OR_NOW in the command line if we\n   find out it does not work in some platform. */\n#ifndef LT_DLLAZY_OR_NOW\n#  ifdef RTLD_LAZY\n#    define LT_DLLAZY_OR_NOW\t\tRTLD_LAZY\n#  else\n#    ifdef DL_LAZY\n#      define LT_DLLAZY_OR_NOW\t\tDL_LAZY\n#    else\n#      ifdef RTLD_NOW\n#        define LT_DLLAZY_OR_NOW\tRTLD_NOW\n#      else\n#        ifdef DL_NOW\n#          define LT_DLLAZY_OR_NOW\tDL_NOW\n#        else\n#          define LT_DLLAZY_OR_NOW\t0\n#        endif\n#      endif\n#    endif\n#  endif\n#endif\n\nvoid fnord() { int i=42;}\nint main ()\n{\n  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);\n  int status = $lt_dlunknown;\n\n  if (self)\n    {\n      if (dlsym (self,\"fnord\"))       status = $lt_dlno_uscore;\n      else if (dlsym( self,\"_fnord\")) status = $lt_dlneed_uscore;\n      /* dlclose (self); */\n    }\n  else\n    puts (dlerror ());\n\n  return status;\n}]\n_LT_EOF\n  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then\n    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null\n    lt_status=$?\n    case x$lt_status in\n      x$lt_dlno_uscore) $1 ;;\n      x$lt_dlneed_uscore) $2 ;;\n      x$lt_dlunknown|x*) $3 ;;\n    esac\n  else :\n    # compilation failed\n    $3\n  fi\nfi\nrm -fr conftest*\n])# _LT_TRY_DLOPEN_SELF\n\n\n# LT_SYS_DLOPEN_SELF\n# ------------------\nAC_DEFUN([LT_SYS_DLOPEN_SELF],\n[m4_require([_LT_HEADER_DLFCN])dnl\nif test \"x$enable_dlopen\" != xyes; then\n  enable_dlopen=unknown\n  enable_dlopen_self=unknown\n  enable_dlopen_self_static=unknown\nelse\n  lt_cv_dlopen=no\n  lt_cv_dlopen_libs=\n\n  case $host_os in\n  beos*)\n    lt_cv_dlopen=\"load_add_on\"\n    lt_cv_dlopen_libs=\n    lt_cv_dlopen_self=yes\n    ;;\n\n  mingw* | pw32* | cegcc*)\n    lt_cv_dlopen=\"LoadLibrary\"\n    lt_cv_dlopen_libs=\n    ;;\n\n  cygwin*)\n    lt_cv_dlopen=\"dlopen\"\n    lt_cv_dlopen_libs=\n    ;;\n\n  darwin*)\n  # if libdl is installed we need to link against it\n    AC_CHECK_LIB([dl], [dlopen],\n\t\t[lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-ldl\"],[\n    lt_cv_dlopen=\"dyld\"\n    lt_cv_dlopen_libs=\n    lt_cv_dlopen_self=yes\n    ])\n    ;;\n\n  *)\n    AC_CHECK_FUNC([shl_load],\n\t  [lt_cv_dlopen=\"shl_load\"],\n      [AC_CHECK_LIB([dld], [shl_load],\n\t    [lt_cv_dlopen=\"shl_load\" lt_cv_dlopen_libs=\"-ldld\"],\n\t[AC_CHECK_FUNC([dlopen],\n\t      [lt_cv_dlopen=\"dlopen\"],\n\t  [AC_CHECK_LIB([dl], [dlopen],\n\t\t[lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-ldl\"],\n\t    [AC_CHECK_LIB([svld], [dlopen],\n\t\t  [lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-lsvld\"],\n\t      [AC_CHECK_LIB([dld], [dld_link],\n\t\t    [lt_cv_dlopen=\"dld_link\" lt_cv_dlopen_libs=\"-ldld\"])\n\t      ])\n\t    ])\n\t  ])\n\t])\n      ])\n    ;;\n  esac\n\n  if test \"x$lt_cv_dlopen\" != xno; then\n    enable_dlopen=yes\n  else\n    enable_dlopen=no\n  fi\n\n  case $lt_cv_dlopen in\n  dlopen)\n    save_CPPFLAGS=\"$CPPFLAGS\"\n    test \"x$ac_cv_header_dlfcn_h\" = xyes && CPPFLAGS=\"$CPPFLAGS -DHAVE_DLFCN_H\"\n\n    save_LDFLAGS=\"$LDFLAGS\"\n    wl=$lt_prog_compiler_wl eval LDFLAGS=\\\"\\$LDFLAGS $export_dynamic_flag_spec\\\"\n\n    save_LIBS=\"$LIBS\"\n    LIBS=\"$lt_cv_dlopen_libs $LIBS\"\n\n    AC_CACHE_CHECK([whether a program can dlopen itself],\n\t  lt_cv_dlopen_self, [dnl\n\t  _LT_TRY_DLOPEN_SELF(\n\t    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,\n\t    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)\n    ])\n\n    if test \"x$lt_cv_dlopen_self\" = xyes; then\n      wl=$lt_prog_compiler_wl eval LDFLAGS=\\\"\\$LDFLAGS $lt_prog_compiler_static\\\"\n      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],\n\t  lt_cv_dlopen_self_static, [dnl\n\t  _LT_TRY_DLOPEN_SELF(\n\t    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,\n\t    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)\n      ])\n    fi\n\n    CPPFLAGS=\"$save_CPPFLAGS\"\n    LDFLAGS=\"$save_LDFLAGS\"\n    LIBS=\"$save_LIBS\"\n    ;;\n  esac\n\n  case $lt_cv_dlopen_self in\n  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;\n  *) enable_dlopen_self=unknown ;;\n  esac\n\n  case $lt_cv_dlopen_self_static in\n  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;\n  *) enable_dlopen_self_static=unknown ;;\n  esac\nfi\n_LT_DECL([dlopen_support], [enable_dlopen], [0],\n\t [Whether dlopen is supported])\n_LT_DECL([dlopen_self], [enable_dlopen_self], [0],\n\t [Whether dlopen of programs is supported])\n_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],\n\t [Whether dlopen of statically linked programs is supported])\n])# LT_SYS_DLOPEN_SELF\n\n# Old name:\nAU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])\n\n\n# _LT_COMPILER_C_O([TAGNAME])\n# ---------------------------\n# Check to see if options -c and -o are simultaneously supported by compiler.\n# This macro does not hard code the compiler like AC_PROG_CC_C_O.\nm4_defun([_LT_COMPILER_C_O],\n[m4_require([_LT_DECL_SED])dnl\nm4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_TAG_COMPILER])dnl\nAC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],\n  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],\n  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no\n   $RM -r conftest 2>/dev/null\n   mkdir conftest\n   cd conftest\n   mkdir out\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n   lt_compiler_flag=\"-o out/conftest2.$ac_objext\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [[^ ]]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:__oline__: $lt_compile\\\"\" >&AS_MESSAGE_LOG_FD)\n   (eval \"$lt_compile\" 2>out/conftest.err)\n   ac_status=$?\n   cat out/conftest.err >&AS_MESSAGE_LOG_FD\n   echo \"$as_me:__oline__: \\$? = $ac_status\" >&AS_MESSAGE_LOG_FD\n   if (exit $ac_status) && test -s out/conftest2.$ac_objext\n   then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     $ECHO \"X$_lt_compiler_boilerplate\" | $Xsed -e '/^$/d' > out/conftest.exp\n     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2\n     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then\n       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes\n     fi\n   fi\n   chmod u+w . 2>&AS_MESSAGE_LOG_FD\n   $RM conftest*\n   # SGI C++ compiler will create directory out/ii_files/ for\n   # template instantiation\n   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files\n   $RM out/* && rmdir out\n   cd ..\n   $RM -r conftest\n   $RM conftest*\n])\n_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],\n\t[Does compiler simultaneously support -c and -o options?])\n])# _LT_COMPILER_C_O\n\n\n# _LT_COMPILER_FILE_LOCKS([TAGNAME])\n# ----------------------------------\n# Check to see if we can do hard links to lock some files if needed\nm4_defun([_LT_COMPILER_FILE_LOCKS],\n[m4_require([_LT_ENABLE_LOCK])dnl\nm4_require([_LT_FILEUTILS_DEFAULTS])dnl\n_LT_COMPILER_C_O([$1])\n\nhard_links=\"nottested\"\nif test \"$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)\" = no && test \"$need_locks\" != no; then\n  # do not overwrite the value of need_locks provided by the user\n  AC_MSG_CHECKING([if we can lock with hard links])\n  hard_links=yes\n  $RM conftest*\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  touch conftest.a\n  ln conftest.a conftest.b 2>&5 || hard_links=no\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  AC_MSG_RESULT([$hard_links])\n  if test \"$hard_links\" = no; then\n    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])\n    need_locks=warn\n  fi\nelse\n  need_locks=no\nfi\n_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])\n])# _LT_COMPILER_FILE_LOCKS\n\n\n# _LT_CHECK_OBJDIR\n# ----------------\nm4_defun([_LT_CHECK_OBJDIR],\n[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],\n[rm -f .libs 2>/dev/null\nmkdir .libs 2>/dev/null\nif test -d .libs; then\n  lt_cv_objdir=.libs\nelse\n  # MS-DOS does not allow filenames that begin with a dot.\n  lt_cv_objdir=_libs\nfi\nrmdir .libs 2>/dev/null])\nobjdir=$lt_cv_objdir\n_LT_DECL([], [objdir], [0],\n         [The name of the directory that contains temporary libtool files])dnl\nm4_pattern_allow([LT_OBJDIR])dnl\nAC_DEFINE_UNQUOTED(LT_OBJDIR, \"$lt_cv_objdir/\",\n  [Define to the sub-directory in which libtool stores uninstalled libraries.])\n])# _LT_CHECK_OBJDIR\n\n\n# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])\n# --------------------------------------\n# Check hardcoding attributes.\nm4_defun([_LT_LINKER_HARDCODE_LIBPATH],\n[AC_MSG_CHECKING([how to hardcode library paths into programs])\n_LT_TAGVAR(hardcode_action, $1)=\nif test -n \"$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\" ||\n   test -n \"$_LT_TAGVAR(runpath_var, $1)\" ||\n   test \"X$_LT_TAGVAR(hardcode_automatic, $1)\" = \"Xyes\" ; then\n\n  # We can hardcode non-existent directories.\n  if test \"$_LT_TAGVAR(hardcode_direct, $1)\" != no &&\n     # If the only mechanism to avoid hardcoding is shlibpath_var, we\n     # have to relink, otherwise we might link with an installed library\n     # when we should be linking with a yet-to-be-installed one\n     ## test \"$_LT_TAGVAR(hardcode_shlibpath_var, $1)\" != no &&\n     test \"$_LT_TAGVAR(hardcode_minus_L, $1)\" != no; then\n    # Linking always hardcodes the temporary library directory.\n    _LT_TAGVAR(hardcode_action, $1)=relink\n  else\n    # We can link without hardcoding, and we can hardcode nonexisting dirs.\n    _LT_TAGVAR(hardcode_action, $1)=immediate\n  fi\nelse\n  # We cannot hardcode anything, or else we can only hardcode existing\n  # directories.\n  _LT_TAGVAR(hardcode_action, $1)=unsupported\nfi\nAC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])\n\nif test \"$_LT_TAGVAR(hardcode_action, $1)\" = relink ||\n   test \"$_LT_TAGVAR(inherit_rpath, $1)\" = yes; then\n  # Fast installation is not supported\n  enable_fast_install=no\nelif test \"$shlibpath_overrides_runpath\" = yes ||\n     test \"$enable_shared\" = no; then\n  # Fast installation is not necessary\n  enable_fast_install=needless\nfi\n_LT_TAGDECL([], [hardcode_action], [0],\n    [How to hardcode a shared library path into an executable])\n])# _LT_LINKER_HARDCODE_LIBPATH\n\n\n# _LT_CMD_STRIPLIB\n# ----------------\nm4_defun([_LT_CMD_STRIPLIB],\n[m4_require([_LT_DECL_EGREP])\nstriplib=\nold_striplib=\nAC_MSG_CHECKING([whether stripping libraries is possible])\nif test -n \"$STRIP\" && $STRIP -V 2>&1 | $GREP \"GNU strip\" >/dev/null; then\n  test -z \"$old_striplib\" && old_striplib=\"$STRIP --strip-debug\"\n  test -z \"$striplib\" && striplib=\"$STRIP --strip-unneeded\"\n  AC_MSG_RESULT([yes])\nelse\n# FIXME - insert some real tests, host_os isn't really good enough\n  case $host_os in\n  darwin*)\n    if test -n \"$STRIP\" ; then\n      striplib=\"$STRIP -x\"\n      old_striplib=\"$STRIP -S\"\n      AC_MSG_RESULT([yes])\n    else\n      AC_MSG_RESULT([no])\n    fi\n    ;;\n  *)\n    AC_MSG_RESULT([no])\n    ;;\n  esac\nfi\n_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])\n_LT_DECL([], [striplib], [1])\n])# _LT_CMD_STRIPLIB\n\n\n# _LT_SYS_DYNAMIC_LINKER([TAG])\n# -----------------------------\n# PORTME Fill in your ld.so characteristics\nm4_defun([_LT_SYS_DYNAMIC_LINKER],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\nm4_require([_LT_DECL_EGREP])dnl\nm4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_DECL_OBJDUMP])dnl\nm4_require([_LT_DECL_SED])dnl\nAC_MSG_CHECKING([dynamic linker characteristics])\nm4_if([$1],\n\t[], [\nif test \"$GCC\" = yes; then\n  case $host_os in\n    darwin*) lt_awk_arg=\"/^libraries:/,/LR/\" ;;\n    *) lt_awk_arg=\"/^libraries:/\" ;;\n  esac\n  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e \"s/^libraries://\" -e \"s,=/,/,g\"`\n  if $ECHO \"$lt_search_path_spec\" | $GREP ';' >/dev/null ; then\n    # if the path contains \";\" then we assume it to be the separator\n    # otherwise default to the standard path separator (i.e. \":\") - it is\n    # assumed that no part of a normal pathname contains \";\" but that should\n    # okay in the real world where \";\" in dirpaths is itself problematic.\n    lt_search_path_spec=`$ECHO \"$lt_search_path_spec\" | $SED -e 's/;/ /g'`\n  else\n    lt_search_path_spec=`$ECHO \"$lt_search_path_spec\" | $SED  -e \"s/$PATH_SEPARATOR/ /g\"`\n  fi\n  # Ok, now we have the path, separated by spaces, we can step through it\n  # and add multilib dir if necessary.\n  lt_tmp_lt_search_path_spec=\n  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`\n  for lt_sys_path in $lt_search_path_spec; do\n    if test -d \"$lt_sys_path/$lt_multi_os_dir\"; then\n      lt_tmp_lt_search_path_spec=\"$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir\"\n    else\n      test -d \"$lt_sys_path\" && \\\n\tlt_tmp_lt_search_path_spec=\"$lt_tmp_lt_search_path_spec $lt_sys_path\"\n    fi\n  done\n  lt_search_path_spec=`$ECHO $lt_tmp_lt_search_path_spec | awk '\nBEGIN {RS=\" \"; FS=\"/|\\n\";} {\n  lt_foo=\"\";\n  lt_count=0;\n  for (lt_i = NF; lt_i > 0; lt_i--) {\n    if ($lt_i != \"\" && $lt_i != \".\") {\n      if ($lt_i == \"..\") {\n        lt_count++;\n      } else {\n        if (lt_count == 0) {\n          lt_foo=\"/\" $lt_i lt_foo;\n        } else {\n          lt_count--;\n        }\n      }\n    }\n  }\n  if (lt_foo != \"\") { lt_freq[[lt_foo]]++; }\n  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }\n}'`\n  sys_lib_search_path_spec=`$ECHO $lt_search_path_spec`\nelse\n  sys_lib_search_path_spec=\"/lib /usr/lib /usr/local/lib\"\nfi])\nlibrary_names_spec=\nlibname_spec='lib$name'\nsoname_spec=\nshrext_cmds=\".so\"\npostinstall_cmds=\npostuninstall_cmds=\nfinish_cmds=\nfinish_eval=\nshlibpath_var=\nshlibpath_overrides_runpath=unknown\nversion_type=none\ndynamic_linker=\"$host_os ld.so\"\nsys_lib_dlsearch_path_spec=\"/lib /usr/lib\"\nneed_lib_prefix=unknown\nhardcode_into_libs=no\n\n# when you set need_version to no, make sure it does not cause -set_version\n# flags to be left without arguments\nneed_version=unknown\n\ncase $host_os in\naix3*)\n  version_type=linux\n  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'\n  shlibpath_var=LIBPATH\n\n  # AIX 3 has no versioning support, so we append a major version to the name.\n  soname_spec='${libname}${release}${shared_ext}$major'\n  ;;\n\naix[[4-9]]*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  hardcode_into_libs=yes\n  if test \"$host_cpu\" = ia64; then\n    # AIX 5 supports IA64\n    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'\n    shlibpath_var=LD_LIBRARY_PATH\n  else\n    # With GCC up to 2.95.x, collect2 would create an import file\n    # for dependence libraries.  The import file would start with\n    # the line `#! .'.  This would cause the generated library to\n    # depend on `.', always an invalid library.  This was fixed in\n    # development snapshots of GCC prior to 3.0.\n    case $host_os in\n      aix4 | aix4.[[01]] | aix4.[[01]].*)\n      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'\n\t   echo ' yes '\n\t   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then\n\t:\n      else\n\tcan_build_shared=no\n      fi\n      ;;\n    esac\n    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct\n    # soname into executable. Probably we can add versioning support to\n    # collect2, so additional links can be useful in future.\n    if test \"$aix_use_runtimelinking\" = yes; then\n      # If using run time linking (on AIX 4.2 or later) use lib<name>.so\n      # instead of lib<name>.a to let people know that these are not\n      # typical AIX shared libraries.\n      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    else\n      # We preserve .a as extension for shared libraries through AIX4.2\n      # and later when we are not doing run time linking.\n      library_names_spec='${libname}${release}.a $libname.a'\n      soname_spec='${libname}${release}${shared_ext}$major'\n    fi\n    shlibpath_var=LIBPATH\n  fi\n  ;;\n\namigaos*)\n  case $host_cpu in\n  powerpc)\n    # Since July 2007 AmigaOS4 officially supports .so libraries.\n    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    ;;\n  m68k)\n    library_names_spec='$libname.ixlibrary $libname.a'\n    # Create ${libname}_ixlibrary.a entries in /sys/libs.\n    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$ECHO \"X$lib\" | $Xsed -e '\\''s%^.*/\\([[^/]]*\\)\\.ixlibrary$%\\1%'\\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show \"cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a\"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'\n    ;;\n  esac\n  ;;\n\nbeos*)\n  library_names_spec='${libname}${shared_ext}'\n  dynamic_linker=\"$host_os ld.so\"\n  shlibpath_var=LIBRARY_PATH\n  ;;\n\nbsdi[[45]]*)\n  version_type=linux\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  sys_lib_search_path_spec=\"/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib\"\n  sys_lib_dlsearch_path_spec=\"/shlib /usr/lib /usr/local/lib\"\n  # the default ld.so.conf also contains /usr/contrib/lib and\n  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow\n  # libtool to hard-code these into programs\n  ;;\n\ncygwin* | mingw* | pw32* | cegcc*)\n  version_type=windows\n  shrext_cmds=\".dll\"\n  need_version=no\n  need_lib_prefix=no\n\n  case $GCC,$host_os in\n  yes,cygwin* | yes,mingw* | yes,pw32* | yes,cegcc*)\n    library_names_spec='$libname.dll.a'\n    # DLL is installed to $(libdir)/../bin by postinstall_cmds\n    postinstall_cmds='base_file=`basename \\${file}`~\n      dlpath=`$SHELL 2>&1 -c '\\''. $dir/'\\''\\${base_file}'\\''i; echo \\$dlname'\\''`~\n      dldir=$destdir/`dirname \\$dlpath`~\n      test -d \\$dldir || mkdir -p \\$dldir~\n      $install_prog $dir/$dlname \\$dldir/$dlname~\n      chmod a+x \\$dldir/$dlname~\n      if test -n '\\''$stripme'\\'' && test -n '\\''$striplib'\\''; then\n        eval '\\''$striplib \\$dldir/$dlname'\\'' || exit \\$?;\n      fi'\n    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\\''. $file; echo \\$dlname'\\''`~\n      dlpath=$dir/\\$dldll~\n       $RM \\$dlpath'\n    shlibpath_overrides_runpath=yes\n\n    case $host_os in\n    cygwin*)\n      # Cygwin DLLs use 'cyg' prefix rather than 'lib'\n      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'\n      sys_lib_search_path_spec=\"/usr/lib /lib/w32api /lib /usr/local/lib\"\n      ;;\n    mingw* | cegcc*)\n      # MinGW DLLs use traditional 'lib' prefix\n      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'\n      sys_lib_search_path_spec=`$CC -print-search-dirs | $GREP \"^libraries:\" | $SED -e \"s/^libraries://\" -e \"s,=/,/,g\"`\n      if $ECHO \"$sys_lib_search_path_spec\" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then\n        # It is most probably a Windows format PATH printed by\n        # mingw gcc, but we are running on Cygwin. Gcc prints its search\n        # path with ; separators, and with drive letters. We can handle the\n        # drive letters (cygwin fileutils understands them), so leave them,\n        # especially as we might pass files found there to a mingw objdump,\n        # which wouldn't understand a cygwinified path. Ahh.\n        sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | $SED -e 's/;/ /g'`\n      else\n        sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | $SED  -e \"s/$PATH_SEPARATOR/ /g\"`\n      fi\n      ;;\n    pw32*)\n      # pw32 DLLs use 'pw' prefix rather than 'lib'\n      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'\n      ;;\n    esac\n    ;;\n\n  *)\n    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'\n    ;;\n  esac\n  dynamic_linker='Win32 ld.exe'\n  # FIXME: first we should search . and the directory the executable is in\n  shlibpath_var=PATH\n  ;;\n\ndarwin* | rhapsody*)\n  dynamic_linker=\"$host_os dyld\"\n  version_type=darwin\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'\n  soname_spec='${libname}${release}${major}$shared_ext'\n  shlibpath_overrides_runpath=yes\n  shlibpath_var=DYLD_LIBRARY_PATH\n  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'\nm4_if([$1], [],[\n  sys_lib_search_path_spec=\"$sys_lib_search_path_spec /usr/local/lib\"])\n  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'\n  ;;\n\ndgux*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\nfreebsd1*)\n  dynamic_linker=no\n  ;;\n\nfreebsd* | dragonfly*)\n  # DragonFly does not have aout.  When/if they implement a new\n  # versioning mechanism, adjust this.\n  if test -x /usr/bin/objformat; then\n    objformat=`/usr/bin/objformat`\n  else\n    case $host_os in\n    freebsd[[123]]*) objformat=aout ;;\n    *) objformat=elf ;;\n    esac\n  fi\n  version_type=freebsd-$objformat\n  case $version_type in\n    freebsd-elf*)\n      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'\n      need_version=no\n      need_lib_prefix=no\n      ;;\n    freebsd-*)\n      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'\n      need_version=yes\n      ;;\n  esac\n  shlibpath_var=LD_LIBRARY_PATH\n  case $host_os in\n  freebsd2*)\n    shlibpath_overrides_runpath=yes\n    ;;\n  freebsd3.[[01]]* | freebsdelf3.[[01]]*)\n    shlibpath_overrides_runpath=yes\n    hardcode_into_libs=yes\n    ;;\n  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \\\n  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)\n    shlibpath_overrides_runpath=no\n    hardcode_into_libs=yes\n    ;;\n  *) # from 4.6 on, and DragonFly\n    shlibpath_overrides_runpath=yes\n    hardcode_into_libs=yes\n    ;;\n  esac\n  ;;\n\ngnu*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  hardcode_into_libs=yes\n  ;;\n\nhpux9* | hpux10* | hpux11*)\n  # Give a soname corresponding to the major version so that dld.sl refuses to\n  # link against other versions.\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  case $host_cpu in\n  ia64*)\n    shrext_cmds='.so'\n    hardcode_into_libs=yes\n    dynamic_linker=\"$host_os dld.so\"\n    shlibpath_var=LD_LIBRARY_PATH\n    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    if test \"X$HPUX_IA64_MODE\" = X32; then\n      sys_lib_search_path_spec=\"/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib\"\n    else\n      sys_lib_search_path_spec=\"/usr/lib/hpux64 /usr/local/lib/hpux64\"\n    fi\n    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec\n    ;;\n  hppa*64*)\n    shrext_cmds='.sl'\n    hardcode_into_libs=yes\n    dynamic_linker=\"$host_os dld.sl\"\n    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH\n    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    sys_lib_search_path_spec=\"/usr/lib/pa20_64 /usr/ccs/lib/pa20_64\"\n    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec\n    ;;\n  *)\n    shrext_cmds='.sl'\n    dynamic_linker=\"$host_os dld.sl\"\n    shlibpath_var=SHLIB_PATH\n    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    ;;\n  esac\n  # HP-UX runs *really* slowly unless shared libraries are mode 555.\n  postinstall_cmds='chmod 555 $lib'\n  ;;\n\ninterix[[3-9]]*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  ;;\n\nirix5* | irix6* | nonstopux*)\n  case $host_os in\n    nonstopux*) version_type=nonstopux ;;\n    *)\n\tif test \"$lt_cv_prog_gnu_ld\" = yes; then\n\t\tversion_type=linux\n\telse\n\t\tversion_type=irix\n\tfi ;;\n  esac\n  need_lib_prefix=no\n  need_version=no\n  soname_spec='${libname}${release}${shared_ext}$major'\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'\n  case $host_os in\n  irix5* | nonstopux*)\n    libsuff= shlibsuff=\n    ;;\n  *)\n    case $LD in # libtool.m4 will add one of these switches to LD\n    *-32|*\"-32 \"|*-melf32bsmip|*\"-melf32bsmip \")\n      libsuff= shlibsuff= libmagic=32-bit;;\n    *-n32|*\"-n32 \"|*-melf32bmipn32|*\"-melf32bmipn32 \")\n      libsuff=32 shlibsuff=N32 libmagic=N32;;\n    *-64|*\"-64 \"|*-melf64bmip|*\"-melf64bmip \")\n      libsuff=64 shlibsuff=64 libmagic=64-bit;;\n    *) libsuff= shlibsuff= libmagic=never-match;;\n    esac\n    ;;\n  esac\n  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH\n  shlibpath_overrides_runpath=no\n  sys_lib_search_path_spec=\"/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}\"\n  sys_lib_dlsearch_path_spec=\"/usr/lib${libsuff} /lib${libsuff}\"\n  hardcode_into_libs=yes\n  ;;\n\n# No shared lib support for Linux oldld, aout, or coff.\nlinux*oldld* | linux*aout* | linux*coff*)\n  dynamic_linker=no\n  ;;\n\n# This must be Linux ELF.\nlinux* | k*bsd*-gnu | kopensolaris*-gnu)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -n $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  # Some binutils ld are patched to set DT_RUNPATH\n  save_LDFLAGS=$LDFLAGS\n  save_libdir=$libdir\n  eval \"libdir=/foo; wl=\\\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\\\"; \\\n       LDFLAGS=\\\"\\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\\\"\"\n  AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],\n    [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep \"RUNPATH.*$libdir\" >/dev/null],\n       [shlibpath_overrides_runpath=yes])])\n  LDFLAGS=$save_LDFLAGS\n  libdir=$save_libdir\n\n  # This implies no fast_install, which is unacceptable.\n  # Some rework will be needed to allow for fast_install\n  # before this can be enabled.\n  hardcode_into_libs=yes\n\n  # Append ld.so.conf contents to the search path\n  if test -f /etc/ld.so.conf; then\n    lt_ld_extra=`awk '/^include / { system(sprintf(\"cd /etc; cat %s 2>/dev/null\", \\[$]2)); skip = 1; } { if (!skip) print \\[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[\t ]*hwcap[\t ]/d;s/[:,\t]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\\n' ' '`\n    sys_lib_dlsearch_path_spec=\"/lib /usr/lib $lt_ld_extra\"\n  fi\n\n  # We used to test for /lib/ld.so.1 and disable shared libraries on\n  # powerpc, because MkLinux only supported shared libraries with the\n  # GNU dynamic linker.  Since this was broken with cross compilers,\n  # most powerpc-linux boxes support dynamic linking these days and\n  # people can always --disable-shared, the test was removed, and we\n  # assume the GNU/Linux dynamic linker is in use.\n  dynamic_linker='GNU/Linux ld.so'\n  ;;\n\nnetbsdelf*-gnu)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  dynamic_linker='NetBSD ld.elf_so'\n  ;;\n\nnetbsd*)\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n    finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n    dynamic_linker='NetBSD (a.out) ld.so'\n  else\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    dynamic_linker='NetBSD ld.elf_so'\n  fi\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  ;;\n\nnewsos6)\n  version_type=linux\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  ;;\n\n*nto* | *qnx*)\n  version_type=qnx\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  dynamic_linker='ldqnx.so'\n  ;;\n\nopenbsd*)\n  version_type=sunos\n  sys_lib_dlsearch_path_spec=\"/usr/lib\"\n  need_lib_prefix=no\n  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.\n  case $host_os in\n    openbsd3.3 | openbsd3.3.*)\tneed_version=yes ;;\n    *)\t\t\t\tneed_version=no  ;;\n  esac\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  if test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n    case $host_os in\n      openbsd2.[[89]] | openbsd2.[[89]].*)\n\tshlibpath_overrides_runpath=no\n\t;;\n      *)\n\tshlibpath_overrides_runpath=yes\n\t;;\n      esac\n  else\n    shlibpath_overrides_runpath=yes\n  fi\n  ;;\n\nos2*)\n  libname_spec='$name'\n  shrext_cmds=\".dll\"\n  need_lib_prefix=no\n  library_names_spec='$libname${shared_ext} $libname.a'\n  dynamic_linker='OS/2 ld.exe'\n  shlibpath_var=LIBPATH\n  ;;\n\nosf3* | osf4* | osf5*)\n  version_type=osf\n  need_lib_prefix=no\n  need_version=no\n  soname_spec='${libname}${release}${shared_ext}$major'\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  sys_lib_search_path_spec=\"/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib\"\n  sys_lib_dlsearch_path_spec=\"$sys_lib_search_path_spec\"\n  ;;\n\nrdos*)\n  dynamic_linker=no\n  ;;\n\nsolaris*)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  # ldd complains unless libraries are executable\n  postinstall_cmds='chmod +x $lib'\n  ;;\n\nsunos4*)\n  version_type=sunos\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/usr/etc\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  if test \"$with_gnu_ld\" = yes; then\n    need_lib_prefix=no\n  fi\n  need_version=yes\n  ;;\n\nsysv4 | sysv4.3*)\n  version_type=linux\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  case $host_vendor in\n    sni)\n      shlibpath_overrides_runpath=no\n      need_lib_prefix=no\n      runpath_var=LD_RUN_PATH\n      ;;\n    siemens)\n      need_lib_prefix=no\n      ;;\n    motorola)\n      need_lib_prefix=no\n      need_version=no\n      shlibpath_overrides_runpath=no\n      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'\n      ;;\n  esac\n  ;;\n\nsysv4*MP*)\n  if test -d /usr/nec ;then\n    version_type=linux\n    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'\n    soname_spec='$libname${shared_ext}.$major'\n    shlibpath_var=LD_LIBRARY_PATH\n  fi\n  ;;\n\nsysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)\n  version_type=freebsd-elf\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  if test \"$with_gnu_ld\" = yes; then\n    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'\n  else\n    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'\n    case $host_os in\n      sco3.2v5*)\n        sys_lib_search_path_spec=\"$sys_lib_search_path_spec /lib\"\n\t;;\n    esac\n  fi\n  sys_lib_dlsearch_path_spec='/usr/lib'\n  ;;\n\ntpf*)\n  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  ;;\n\nuts4*)\n  version_type=linux\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\n*)\n  dynamic_linker=no\n  ;;\nesac\nAC_MSG_RESULT([$dynamic_linker])\ntest \"$dynamic_linker\" = no && can_build_shared=no\n\nvariables_saved_for_relink=\"PATH $shlibpath_var $runpath_var\"\nif test \"$GCC\" = yes; then\n  variables_saved_for_relink=\"$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH\"\nfi\n\nif test \"${lt_cv_sys_lib_search_path_spec+set}\" = set; then\n  sys_lib_search_path_spec=\"$lt_cv_sys_lib_search_path_spec\"\nfi\nif test \"${lt_cv_sys_lib_dlsearch_path_spec+set}\" = set; then\n  sys_lib_dlsearch_path_spec=\"$lt_cv_sys_lib_dlsearch_path_spec\"\nfi\n\n_LT_DECL([], [variables_saved_for_relink], [1],\n    [Variables whose values should be saved in libtool wrapper scripts and\n    restored at link time])\n_LT_DECL([], [need_lib_prefix], [0],\n    [Do we need the \"lib\" prefix for modules?])\n_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])\n_LT_DECL([], [version_type], [0], [Library versioning type])\n_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])\n_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])\n_LT_DECL([], [shlibpath_overrides_runpath], [0],\n    [Is shlibpath searched before the hard-coded library search path?])\n_LT_DECL([], [libname_spec], [1], [Format of library name prefix])\n_LT_DECL([], [library_names_spec], [1],\n    [[List of archive names.  First name is the real one, the rest are links.\n    The last name is the one that the linker finds with -lNAME]])\n_LT_DECL([], [soname_spec], [1],\n    [[The coded name of the library, if different from the real name]])\n_LT_DECL([], [postinstall_cmds], [2],\n    [Command to use after installation of a shared archive])\n_LT_DECL([], [postuninstall_cmds], [2],\n    [Command to use after uninstallation of a shared archive])\n_LT_DECL([], [finish_cmds], [2],\n    [Commands used to finish a libtool library installation in a directory])\n_LT_DECL([], [finish_eval], [1],\n    [[As \"finish_cmds\", except a single script fragment to be evaled but\n    not shown]])\n_LT_DECL([], [hardcode_into_libs], [0],\n    [Whether we should hardcode library paths into libraries])\n_LT_DECL([], [sys_lib_search_path_spec], [2],\n    [Compile-time system search path for libraries])\n_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],\n    [Run-time system search path for libraries])\n])# _LT_SYS_DYNAMIC_LINKER\n\n\n# _LT_PATH_TOOL_PREFIX(TOOL)\n# --------------------------\n# find a file program which can recognize shared library\nAC_DEFUN([_LT_PATH_TOOL_PREFIX],\n[m4_require([_LT_DECL_EGREP])dnl\nAC_MSG_CHECKING([for $1])\nAC_CACHE_VAL(lt_cv_path_MAGIC_CMD,\n[case $MAGIC_CMD in\n[[\\\\/*] |  ?:[\\\\/]*])\n  lt_cv_path_MAGIC_CMD=\"$MAGIC_CMD\" # Let the user override the test with a path.\n  ;;\n*)\n  lt_save_MAGIC_CMD=\"$MAGIC_CMD\"\n  lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\ndnl $ac_dummy forces splitting on constant user-supplied paths.\ndnl POSIX.2 word splitting is done only on the output of word expansions,\ndnl not every word.  This closes a longstanding sh security hole.\n  ac_dummy=\"m4_if([$2], , $PATH, [$2])\"\n  for ac_dir in $ac_dummy; do\n    IFS=\"$lt_save_ifs\"\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f $ac_dir/$1; then\n      lt_cv_path_MAGIC_CMD=\"$ac_dir/$1\"\n      if test -n \"$file_magic_test_file\"; then\n\tcase $deplibs_check_method in\n\t\"file_magic \"*)\n\t  file_magic_regex=`expr \"$deplibs_check_method\" : \"file_magic \\(.*\\)\"`\n\t  MAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\n\t  if eval $file_magic_cmd \\$file_magic_test_file 2> /dev/null |\n\t    $EGREP \"$file_magic_regex\" > /dev/null; then\n\t    :\n\t  else\n\t    cat <<_LT_EOF 1>&2\n\n*** Warning: the command libtool uses to detect shared libraries,\n*** $file_magic_cmd, produces output that libtool cannot recognize.\n*** The result is that libtool may fail to recognize shared libraries\n*** as such.  This will affect the creation of libtool libraries that\n*** depend on shared libraries, but programs linked with such libtool\n*** libraries will work regardless of this problem.  Nevertheless, you\n*** may want to report the problem to your system manager and/or to\n*** bug-libtool@gnu.org\n\n_LT_EOF\n\t  fi ;;\n\tesac\n      fi\n      break\n    fi\n  done\n  IFS=\"$lt_save_ifs\"\n  MAGIC_CMD=\"$lt_save_MAGIC_CMD\"\n  ;;\nesac])\nMAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\nif test -n \"$MAGIC_CMD\"; then\n  AC_MSG_RESULT($MAGIC_CMD)\nelse\n  AC_MSG_RESULT(no)\nfi\n_LT_DECL([], [MAGIC_CMD], [0],\n\t [Used to examine libraries when file_magic_cmd begins with \"file\"])dnl\n])# _LT_PATH_TOOL_PREFIX\n\n# Old name:\nAU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])\n\n\n# _LT_PATH_MAGIC\n# --------------\n# find a file program which can recognize a shared library\nm4_defun([_LT_PATH_MAGIC],\n[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)\nif test -z \"$lt_cv_path_MAGIC_CMD\"; then\n  if test -n \"$ac_tool_prefix\"; then\n    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)\n  else\n    MAGIC_CMD=:\n  fi\nfi\n])# _LT_PATH_MAGIC\n\n\n# LT_PATH_LD\n# ----------\n# find the pathname to the GNU or non-GNU linker\nAC_DEFUN([LT_PATH_LD],\n[AC_REQUIRE([AC_PROG_CC])dnl\nAC_REQUIRE([AC_CANONICAL_HOST])dnl\nAC_REQUIRE([AC_CANONICAL_BUILD])dnl\nm4_require([_LT_DECL_SED])dnl\nm4_require([_LT_DECL_EGREP])dnl\n\nAC_ARG_WITH([gnu-ld],\n    [AS_HELP_STRING([--with-gnu-ld],\n\t[assume the C compiler uses GNU ld @<:@default=no@:>@])],\n    [test \"$withval\" = no || with_gnu_ld=yes],\n    [with_gnu_ld=no])dnl\n\nac_prog=ld\nif test \"$GCC\" = yes; then\n  # Check if gcc -print-prog-name=ld gives a path.\n  AC_MSG_CHECKING([for ld used by $CC])\n  case $host in\n  *-*-mingw*)\n    # gcc leaves a trailing carriage return which upsets mingw\n    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\\015'` ;;\n  *)\n    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;\n  esac\n  case $ac_prog in\n    # Accept absolute paths.\n    [[\\\\/]]* | ?:[[\\\\/]]*)\n      re_direlt='/[[^/]][[^/]]*/\\.\\./'\n      # Canonicalize the pathname of ld\n      ac_prog=`$ECHO \"$ac_prog\"| $SED 's%\\\\\\\\%/%g'`\n      while $ECHO \"$ac_prog\" | $GREP \"$re_direlt\" > /dev/null 2>&1; do\n\tac_prog=`$ECHO $ac_prog| $SED \"s%$re_direlt%/%\"`\n      done\n      test -z \"$LD\" && LD=\"$ac_prog\"\n      ;;\n  \"\")\n    # If it fails, then pretend we aren't using GCC.\n    ac_prog=ld\n    ;;\n  *)\n    # If it is relative, then search for the first ld in PATH.\n    with_gnu_ld=unknown\n    ;;\n  esac\nelif test \"$with_gnu_ld\" = yes; then\n  AC_MSG_CHECKING([for GNU ld])\nelse\n  AC_MSG_CHECKING([for non-GNU ld])\nfi\nAC_CACHE_VAL(lt_cv_path_LD,\n[if test -z \"$LD\"; then\n  lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n  for ac_dir in $PATH; do\n    IFS=\"$lt_save_ifs\"\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f \"$ac_dir/$ac_prog\" || test -f \"$ac_dir/$ac_prog$ac_exeext\"; then\n      lt_cv_path_LD=\"$ac_dir/$ac_prog\"\n      # Check to see if the program is GNU ld.  I'd rather use --version,\n      # but apparently some variants of GNU ld only accept -v.\n      # Break only if it was the GNU/non-GNU ld that we prefer.\n      case `\"$lt_cv_path_LD\" -v 2>&1 </dev/null` in\n      *GNU* | *'with BFD'*)\n\ttest \"$with_gnu_ld\" != no && break\n\t;;\n      *)\n\ttest \"$with_gnu_ld\" != yes && break\n\t;;\n      esac\n    fi\n  done\n  IFS=\"$lt_save_ifs\"\nelse\n  lt_cv_path_LD=\"$LD\" # Let the user override the test with a path.\nfi])\nLD=\"$lt_cv_path_LD\"\nif test -n \"$LD\"; then\n  AC_MSG_RESULT($LD)\nelse\n  AC_MSG_RESULT(no)\nfi\ntest -z \"$LD\" && AC_MSG_ERROR([no acceptable ld found in \\$PATH])\n_LT_PATH_LD_GNU\nAC_SUBST([LD])\n\n_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])\n])# LT_PATH_LD\n\n# Old names:\nAU_ALIAS([AM_PROG_LD], [LT_PATH_LD])\nAU_ALIAS([AC_PROG_LD], [LT_PATH_LD])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AM_PROG_LD], [])\ndnl AC_DEFUN([AC_PROG_LD], [])\n\n\n# _LT_PATH_LD_GNU\n#- --------------\nm4_defun([_LT_PATH_LD_GNU],\n[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,\n[# I'd rather use --version here, but apparently some GNU lds only accept -v.\ncase `$LD -v 2>&1 </dev/null` in\n*GNU* | *'with BFD'*)\n  lt_cv_prog_gnu_ld=yes\n  ;;\n*)\n  lt_cv_prog_gnu_ld=no\n  ;;\nesac])\nwith_gnu_ld=$lt_cv_prog_gnu_ld\n])# _LT_PATH_LD_GNU\n\n\n# _LT_CMD_RELOAD\n# --------------\n# find reload flag for linker\n#   -- PORTME Some linkers may need a different reload flag.\nm4_defun([_LT_CMD_RELOAD],\n[AC_CACHE_CHECK([for $LD option to reload object files],\n  lt_cv_ld_reload_flag,\n  [lt_cv_ld_reload_flag='-r'])\nreload_flag=$lt_cv_ld_reload_flag\ncase $reload_flag in\n\"\" | \" \"*) ;;\n*) reload_flag=\" $reload_flag\" ;;\nesac\nreload_cmds='$LD$reload_flag -o $output$reload_objs'\ncase $host_os in\n  darwin*)\n    if test \"$GCC\" = yes; then\n      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'\n    else\n      reload_cmds='$LD$reload_flag -o $output$reload_objs'\n    fi\n    ;;\nesac\n_LT_DECL([], [reload_flag], [1], [How to create reloadable object files])dnl\n_LT_DECL([], [reload_cmds], [2])dnl\n])# _LT_CMD_RELOAD\n\n\n# _LT_CHECK_MAGIC_METHOD\n# ----------------------\n# how to check for library dependencies\n#  -- PORTME fill in with the dynamic library characteristics\nm4_defun([_LT_CHECK_MAGIC_METHOD],\n[m4_require([_LT_DECL_EGREP])\nm4_require([_LT_DECL_OBJDUMP])\nAC_CACHE_CHECK([how to recognize dependent libraries],\nlt_cv_deplibs_check_method,\n[lt_cv_file_magic_cmd='$MAGIC_CMD'\nlt_cv_file_magic_test_file=\nlt_cv_deplibs_check_method='unknown'\n# Need to set the preceding variable on all platforms that support\n# interlibrary dependencies.\n# 'none' -- dependencies not supported.\n# `unknown' -- same as none, but documents that we really don't know.\n# 'pass_all' -- all dependencies passed with no checks.\n# 'test_compile' -- check by making test program.\n# 'file_magic [[regex]]' -- check by looking for files in library path\n# which responds to the $file_magic_cmd with a given extended regex.\n# If you have `file' or equivalent on your system and you're not sure\n# whether `pass_all' will *always* work, you probably want this one.\n\ncase $host_os in\naix[[4-9]]*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nbeos*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nbsdi[[45]]*)\n  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'\n  lt_cv_file_magic_cmd='/usr/bin/file -L'\n  lt_cv_file_magic_test_file=/shlib/libc.so\n  ;;\n\ncygwin*)\n  # func_win32_libid is a shell function defined in ltmain.sh\n  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'\n  lt_cv_file_magic_cmd='func_win32_libid'\n  ;;\n\nmingw* | pw32*)\n  # Base MSYS/MinGW do not provide the 'file' command needed by\n  # func_win32_libid shell function, so use a weaker test based on 'objdump',\n  # unless we find 'file', for example because we are cross-compiling.\n  if ( file / ) >/dev/null 2>&1; then\n    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'\n    lt_cv_file_magic_cmd='func_win32_libid'\n  else\n    lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'\n    lt_cv_file_magic_cmd='$OBJDUMP -f'\n  fi\n  ;;\n\ncegcc)\n  # use the weaker test based on 'objdump'. See mingw*.\n  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'\n  lt_cv_file_magic_cmd='$OBJDUMP -f'\n  ;;\n\ndarwin* | rhapsody*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nfreebsd* | dragonfly*)\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then\n    case $host_cpu in\n    i*86 )\n      # Not sure whether the presence of OpenBSD here was a mistake.\n      # Let's accept both of them until this is cleared up.\n      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'\n      lt_cv_file_magic_cmd=/usr/bin/file\n      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`\n      ;;\n    esac\n  else\n    lt_cv_deplibs_check_method=pass_all\n  fi\n  ;;\n\ngnu*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nhpux10.20* | hpux11*)\n  lt_cv_file_magic_cmd=/usr/bin/file\n  case $host_cpu in\n  ia64*)\n    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'\n    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so\n    ;;\n  hppa*64*)\n    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]']\n    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl\n    ;;\n  *)\n    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library'\n    lt_cv_file_magic_test_file=/usr/lib/libc.sl\n    ;;\n  esac\n  ;;\n\ninterix[[3-9]]*)\n  # PIC code is broken on Interix 3.x, that's why |\\.a not |_pic\\.a here\n  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\\.so|\\.a)$'\n  ;;\n\nirix5* | irix6* | nonstopux*)\n  case $LD in\n  *-32|*\"-32 \") libmagic=32-bit;;\n  *-n32|*\"-n32 \") libmagic=N32;;\n  *-64|*\"-64 \") libmagic=64-bit;;\n  *) libmagic=never-match;;\n  esac\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\n# This must be Linux ELF.\nlinux* | k*bsd*-gnu | kopensolaris*-gnu)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nnetbsd* | netbsdelf*-gnu)\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then\n    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\\.so\\.[[0-9]]+\\.[[0-9]]+|_pic\\.a)$'\n  else\n    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\\.so|_pic\\.a)$'\n  fi\n  ;;\n\nnewos6*)\n  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'\n  lt_cv_file_magic_cmd=/usr/bin/file\n  lt_cv_file_magic_test_file=/usr/lib/libnls.so\n  ;;\n\n*nto* | *qnx*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nopenbsd*)\n  if test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\\.so\\.[[0-9]]+\\.[[0-9]]+|\\.so|_pic\\.a)$'\n  else\n    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\\.so\\.[[0-9]]+\\.[[0-9]]+|_pic\\.a)$'\n  fi\n  ;;\n\nosf3* | osf4* | osf5*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nrdos*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsolaris*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsysv4 | sysv4.3*)\n  case $host_vendor in\n  motorola)\n    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'\n    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`\n    ;;\n  ncr)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  sequent)\n    lt_cv_file_magic_cmd='/bin/file'\n    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'\n    ;;\n  sni)\n    lt_cv_file_magic_cmd='/bin/file'\n    lt_cv_deplibs_check_method=\"file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib\"\n    lt_cv_file_magic_test_file=/lib/libc.so\n    ;;\n  siemens)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  pc)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  esac\n  ;;\n\ntpf*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\nesac\n])\nfile_magic_cmd=$lt_cv_file_magic_cmd\ndeplibs_check_method=$lt_cv_deplibs_check_method\ntest -z \"$deplibs_check_method\" && deplibs_check_method=unknown\n\n_LT_DECL([], [deplibs_check_method], [1],\n    [Method to check whether dependent libraries are shared objects])\n_LT_DECL([], [file_magic_cmd], [1],\n    [Command to use when deplibs_check_method == \"file_magic\"])\n])# _LT_CHECK_MAGIC_METHOD\n\n\n# LT_PATH_NM\n# ----------\n# find the pathname to a BSD- or MS-compatible name lister\nAC_DEFUN([LT_PATH_NM],\n[AC_REQUIRE([AC_PROG_CC])dnl\nAC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,\n[if test -n \"$NM\"; then\n  # Let the user override the test.\n  lt_cv_path_NM=\"$NM\"\nelse\n  lt_nm_to_check=\"${ac_tool_prefix}nm\"\n  if test -n \"$ac_tool_prefix\" && test \"$build\" = \"$host\"; then\n    lt_nm_to_check=\"$lt_nm_to_check nm\"\n  fi\n  for lt_tmp_nm in $lt_nm_to_check; do\n    lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do\n      IFS=\"$lt_save_ifs\"\n      test -z \"$ac_dir\" && ac_dir=.\n      tmp_nm=\"$ac_dir/$lt_tmp_nm\"\n      if test -f \"$tmp_nm\" || test -f \"$tmp_nm$ac_exeext\" ; then\n\t# Check to see if the nm accepts a BSD-compat flag.\n\t# Adding the `sed 1q' prevents false positives on HP-UX, which says:\n\t#   nm: unknown option \"B\" ignored\n\t# Tru64's nm complains that /dev/null is an invalid object file\n\tcase `\"$tmp_nm\" -B /dev/null 2>&1 | sed '1q'` in\n\t*/dev/null* | *'Invalid file or object type'*)\n\t  lt_cv_path_NM=\"$tmp_nm -B\"\n\t  break\n\t  ;;\n\t*)\n\t  case `\"$tmp_nm\" -p /dev/null 2>&1 | sed '1q'` in\n\t  */dev/null*)\n\t    lt_cv_path_NM=\"$tmp_nm -p\"\n\t    break\n\t    ;;\n\t  *)\n\t    lt_cv_path_NM=${lt_cv_path_NM=\"$tmp_nm\"} # keep the first match, but\n\t    continue # so that we can try to find one that supports BSD flags\n\t    ;;\n\t  esac\n\t  ;;\n\tesac\n      fi\n    done\n    IFS=\"$lt_save_ifs\"\n  done\n  : ${lt_cv_path_NM=no}\nfi])\nif test \"$lt_cv_path_NM\" != \"no\"; then\n  NM=\"$lt_cv_path_NM\"\nelse\n  # Didn't find any BSD compatible name lister, look for dumpbin.\n  AC_CHECK_TOOLS(DUMPBIN, [\"dumpbin -symbols\" \"link -dump -symbols\"], :)\n  AC_SUBST([DUMPBIN])\n  if test \"$DUMPBIN\" != \":\"; then\n    NM=\"$DUMPBIN\"\n  fi\nfi\ntest -z \"$NM\" && NM=nm\nAC_SUBST([NM])\n_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl\n\nAC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],\n  [lt_cv_nm_interface=\"BSD nm\"\n  echo \"int some_variable = 0;\" > conftest.$ac_ext\n  (eval echo \"\\\"\\$as_me:__oline__: $ac_compile\\\"\" >&AS_MESSAGE_LOG_FD)\n  (eval \"$ac_compile\" 2>conftest.err)\n  cat conftest.err >&AS_MESSAGE_LOG_FD\n  (eval echo \"\\\"\\$as_me:__oline__: $NM \\\\\\\"conftest.$ac_objext\\\\\\\"\\\"\" >&AS_MESSAGE_LOG_FD)\n  (eval \"$NM \\\"conftest.$ac_objext\\\"\" 2>conftest.err > conftest.out)\n  cat conftest.err >&AS_MESSAGE_LOG_FD\n  (eval echo \"\\\"\\$as_me:__oline__: output\\\"\" >&AS_MESSAGE_LOG_FD)\n  cat conftest.out >&AS_MESSAGE_LOG_FD\n  if $GREP 'External.*some_variable' conftest.out > /dev/null; then\n    lt_cv_nm_interface=\"MS dumpbin\"\n  fi\n  rm -f conftest*])\n])# LT_PATH_NM\n\n# Old names:\nAU_ALIAS([AM_PROG_NM], [LT_PATH_NM])\nAU_ALIAS([AC_PROG_NM], [LT_PATH_NM])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AM_PROG_NM], [])\ndnl AC_DEFUN([AC_PROG_NM], [])\n\n\n# LT_LIB_M\n# --------\n# check for math library\nAC_DEFUN([LT_LIB_M],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\nLIBM=\ncase $host in\n*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*)\n  # These system don't have libm, or don't need it\n  ;;\n*-ncr-sysv4.3*)\n  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=\"-lmw\")\n  AC_CHECK_LIB(m, cos, LIBM=\"$LIBM -lm\")\n  ;;\n*)\n  AC_CHECK_LIB(m, cos, LIBM=\"-lm\")\n  ;;\nesac\nAC_SUBST([LIBM])\n])# LT_LIB_M\n\n# Old name:\nAU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_CHECK_LIBM], [])\n\n\n# _LT_COMPILER_NO_RTTI([TAGNAME])\n# -------------------------------\nm4_defun([_LT_COMPILER_NO_RTTI],\n[m4_require([_LT_TAG_COMPILER])dnl\n\n_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=\n\nif test \"$GCC\" = yes; then\n  _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'\n\n  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],\n    lt_cv_prog_compiler_rtti_exceptions,\n    [-fno-rtti -fno-exceptions], [],\n    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=\"$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions\"])\nfi\n_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],\n\t[Compiler flag to turn off builtin functions])\n])# _LT_COMPILER_NO_RTTI\n\n\n# _LT_CMD_GLOBAL_SYMBOLS\n# ----------------------\nm4_defun([_LT_CMD_GLOBAL_SYMBOLS],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\nAC_REQUIRE([AC_PROG_CC])dnl\nAC_REQUIRE([LT_PATH_NM])dnl\nAC_REQUIRE([LT_PATH_LD])dnl\nm4_require([_LT_DECL_SED])dnl\nm4_require([_LT_DECL_EGREP])dnl\nm4_require([_LT_TAG_COMPILER])dnl\n\n# Check for command to grab the raw symbol name followed by C symbol from nm.\nAC_MSG_CHECKING([command to parse $NM output from $compiler object])\nAC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],\n[\n# These are sane defaults that work on at least a few old systems.\n# [They come from Ultrix.  What could be older than Ultrix?!! ;)]\n\n# Character class describing NM global symbol codes.\nsymcode='[[BCDEGRST]]'\n\n# Regexp to match symbols that can be accessed directly from C.\nsympat='\\([[_A-Za-z]][[_A-Za-z0-9]]*\\)'\n\n# Define system-specific variables.\ncase $host_os in\naix*)\n  symcode='[[BCDT]]'\n  ;;\ncygwin* | mingw* | pw32* | cegcc*)\n  symcode='[[ABCDGISTW]]'\n  ;;\nhpux*)\n  if test \"$host_cpu\" = ia64; then\n    symcode='[[ABCDEGRST]]'\n  fi\n  ;;\nirix* | nonstopux*)\n  symcode='[[BCDEGRST]]'\n  ;;\nosf*)\n  symcode='[[BCDEGQRST]]'\n  ;;\nsolaris*)\n  symcode='[[BDRT]]'\n  ;;\nsco3.2v5*)\n  symcode='[[DT]]'\n  ;;\nsysv4.2uw2*)\n  symcode='[[DT]]'\n  ;;\nsysv5* | sco5v6* | unixware* | OpenUNIX*)\n  symcode='[[ABDT]]'\n  ;;\nsysv4)\n  symcode='[[DFNSTU]]'\n  ;;\nesac\n\n# If we're using GNU nm, then use its standard symbol codes.\ncase `$NM -V 2>&1` in\n*GNU* | *'with BFD'*)\n  symcode='[[ABCDGIRSTW]]' ;;\nesac\n\n# Transform an extracted symbol line into a proper C declaration.\n# Some systems (esp. on ia64) link data and code symbols differently,\n# so use this general approach.\nlt_cv_sys_global_symbol_to_cdecl=\"sed -n -e 's/^T .* \\(.*\\)$/extern int \\1();/p' -e 's/^$symcode* .* \\(.*\\)$/extern char \\1;/p'\"\n\n# Transform an extracted symbol line into symbol name and symbol address\nlt_cv_sys_global_symbol_to_c_name_address=\"sed -n -e 's/^: \\([[^ ]]*\\) $/  {\\\\\\\"\\1\\\\\\\", (void *) 0},/p' -e 's/^$symcode* \\([[^ ]]*\\) \\([[^ ]]*\\)$/  {\\\"\\2\\\", (void *) \\&\\2},/p'\"\nlt_cv_sys_global_symbol_to_c_name_address_lib_prefix=\"sed -n -e 's/^: \\([[^ ]]*\\) $/  {\\\\\\\"\\1\\\\\\\", (void *) 0},/p' -e 's/^$symcode* \\([[^ ]]*\\) \\(lib[[^ ]]*\\)$/  {\\\"\\2\\\", (void *) \\&\\2},/p' -e 's/^$symcode* \\([[^ ]]*\\) \\([[^ ]]*\\)$/  {\\\"lib\\2\\\", (void *) \\&\\2},/p'\"\n\n# Handle CRLF in mingw tool chain\nopt_cr=\ncase $build_os in\nmingw*)\n  opt_cr=`$ECHO 'x\\{0,1\\}' | tr x '\\015'` # option cr in regexp\n  ;;\nesac\n\n# Try without a prefix underscore, then with it.\nfor ac_symprfx in \"\" \"_\"; do\n\n  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.\n  symxfrm=\"\\\\1 $ac_symprfx\\\\2 \\\\2\"\n\n  # Write the raw and C identifiers.\n  if test \"$lt_cv_nm_interface\" = \"MS dumpbin\"; then\n    # Fake it for dumpbin and say T for any non-static function\n    # and D for any global variable.\n    # Also find C++ and __fastcall symbols from MSVC++,\n    # which start with @ or ?.\n    lt_cv_sys_global_symbol_pipe=\"$AWK ['\"\\\n\"     {last_section=section; section=\\$ 3};\"\\\n\"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};\"\\\n\"     \\$ 0!~/External *\\|/{next};\"\\\n\"     / 0+ UNDEF /{next}; / UNDEF \\([^|]\\)*()/{next};\"\\\n\"     {if(hide[section]) next};\"\\\n\"     {f=0}; \\$ 0~/\\(\\).*\\|/{f=1}; {printf f ? \\\"T \\\" : \\\"D \\\"};\"\\\n\"     {split(\\$ 0, a, /\\||\\r/); split(a[2], s)};\"\\\n\"     s[1]~/^[@?]/{print s[1], s[1]; next};\"\\\n\"     s[1]~prfx {split(s[1],t,\\\"@\\\"); print t[1], substr(t[1],length(prfx))}\"\\\n\"     ' prfx=^$ac_symprfx]\"\n  else\n    lt_cv_sys_global_symbol_pipe=\"sed -n -e 's/^.*[[\t ]]\\($symcode$symcode*\\)[[\t ]][[\t ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'\"\n  fi\n\n  # Check to see that the pipe works correctly.\n  pipe_works=no\n\n  rm -f conftest*\n  cat > conftest.$ac_ext <<_LT_EOF\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nchar nm_test_var;\nvoid nm_test_func(void);\nvoid nm_test_func(void){}\n#ifdef __cplusplus\n}\n#endif\nint main(){nm_test_var='a';nm_test_func();return(0);}\n_LT_EOF\n\n  if AC_TRY_EVAL(ac_compile); then\n    # Now try to grab the symbols.\n    nlist=conftest.nm\n    if AC_TRY_EVAL(NM conftest.$ac_objext \\| $lt_cv_sys_global_symbol_pipe \\> $nlist) && test -s \"$nlist\"; then\n      # Try sorting and uniquifying the output.\n      if sort \"$nlist\" | uniq > \"$nlist\"T; then\n\tmv -f \"$nlist\"T \"$nlist\"\n      else\n\trm -f \"$nlist\"T\n      fi\n\n      # Make sure that we snagged all the symbols we need.\n      if $GREP ' nm_test_var$' \"$nlist\" >/dev/null; then\n\tif $GREP ' nm_test_func$' \"$nlist\" >/dev/null; then\n\t  cat <<_LT_EOF > conftest.$ac_ext\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n_LT_EOF\n\t  # Now generate the symbol file.\n\t  eval \"$lt_cv_sys_global_symbol_to_cdecl\"' < \"$nlist\" | $GREP -v main >> conftest.$ac_ext'\n\n\t  cat <<_LT_EOF >> conftest.$ac_ext\n\n/* The mapping between symbol names and symbols.  */\nconst struct {\n  const char *name;\n  void       *address;\n}\nlt__PROGRAM__LTX_preloaded_symbols[[]] =\n{\n  { \"@PROGRAM@\", (void *) 0 },\n_LT_EOF\n\t  $SED \"s/^$symcode$symcode* \\(.*\\) \\(.*\\)$/  {\\\"\\2\\\", (void *) \\&\\2},/\" < \"$nlist\" | $GREP -v main >> conftest.$ac_ext\n\t  cat <<\\_LT_EOF >> conftest.$ac_ext\n  {0, (void *) 0}\n};\n\n/* This works around a problem in FreeBSD linker */\n#ifdef FREEBSD_WORKAROUND\nstatic const void *lt_preloaded_setup() {\n  return lt__PROGRAM__LTX_preloaded_symbols;\n}\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n_LT_EOF\n\t  # Now try linking the two files.\n\t  mv conftest.$ac_objext conftstm.$ac_objext\n\t  lt_save_LIBS=\"$LIBS\"\n\t  lt_save_CFLAGS=\"$CFLAGS\"\n\t  LIBS=\"conftstm.$ac_objext\"\n\t  CFLAGS=\"$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)\"\n\t  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then\n\t    pipe_works=yes\n\t  fi\n\t  LIBS=\"$lt_save_LIBS\"\n\t  CFLAGS=\"$lt_save_CFLAGS\"\n\telse\n\t  echo \"cannot find nm_test_func in $nlist\" >&AS_MESSAGE_LOG_FD\n\tfi\n      else\n\techo \"cannot find nm_test_var in $nlist\" >&AS_MESSAGE_LOG_FD\n      fi\n    else\n      echo \"cannot run $lt_cv_sys_global_symbol_pipe\" >&AS_MESSAGE_LOG_FD\n    fi\n  else\n    echo \"$progname: failed program was:\" >&AS_MESSAGE_LOG_FD\n    cat conftest.$ac_ext >&5\n  fi\n  rm -rf conftest* conftst*\n\n  # Do not use the global_symbol_pipe unless it works.\n  if test \"$pipe_works\" = yes; then\n    break\n  else\n    lt_cv_sys_global_symbol_pipe=\n  fi\ndone\n])\nif test -z \"$lt_cv_sys_global_symbol_pipe\"; then\n  lt_cv_sys_global_symbol_to_cdecl=\nfi\nif test -z \"$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl\"; then\n  AC_MSG_RESULT(failed)\nelse\n  AC_MSG_RESULT(ok)\nfi\n\n_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],\n    [Take the output of nm and produce a listing of raw symbols and C names])\n_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],\n    [Transform the output of nm in a proper C declaration])\n_LT_DECL([global_symbol_to_c_name_address],\n    [lt_cv_sys_global_symbol_to_c_name_address], [1],\n    [Transform the output of nm in a C name address pair])\n_LT_DECL([global_symbol_to_c_name_address_lib_prefix],\n    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],\n    [Transform the output of nm in a C name address pair when lib prefix is needed])\n]) # _LT_CMD_GLOBAL_SYMBOLS\n\n\n# _LT_COMPILER_PIC([TAGNAME])\n# ---------------------------\nm4_defun([_LT_COMPILER_PIC],\n[m4_require([_LT_TAG_COMPILER])dnl\n_LT_TAGVAR(lt_prog_compiler_wl, $1)=\n_LT_TAGVAR(lt_prog_compiler_pic, $1)=\n_LT_TAGVAR(lt_prog_compiler_static, $1)=\n\nAC_MSG_CHECKING([for $compiler option to produce PIC])\nm4_if([$1], [CXX], [\n  # C++ specific cases for pic, static, wl, etc.\n  if test \"$GXX\" = yes; then\n    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n\n    case $host_os in\n    aix*)\n      # All AIX code is PIC.\n      if test \"$host_cpu\" = ia64; then\n\t# AIX 5 now supports IA64 processor\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n        ;;\n      m68k)\n            # FIXME: we need at least 68020 code to build shared libraries, but\n            # adding the `-m68020' flag to GCC prevents building anything better,\n            # like `-m68040'.\n            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'\n        ;;\n      esac\n      ;;\n\n    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)\n      # PIC is the default for these OSes.\n      ;;\n    mingw* | cygwin* | os2* | pw32* | cegcc*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      # Although the cygwin gcc ignores -fPIC, still need this for old-style\n      # (--disable-auto-import) libraries\n      m4_if([$1], [GCJ], [],\n\t[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])\n      ;;\n    darwin* | rhapsody*)\n      # PIC is the default on this platform\n      # Common symbols not allowed in MH_DYLIB files\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'\n      ;;\n    *djgpp*)\n      # DJGPP does not support shared libraries at all\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)=\n      ;;\n    interix[[3-9]]*)\n      # Interix 3.x gcc -fpic/-fPIC options generate broken code.\n      # Instead, we relocate shared libraries at runtime.\n      ;;\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic\n      fi\n      ;;\n    hpux*)\n      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit\n      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag\n      # sets the default TLS model and affects inlining.\n      case $host_cpu in\n      hppa*64*)\n\t;;\n      *)\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t;;\n      esac\n      ;;\n    *qnx* | *nto*)\n      # QNX uses GNU C++, but need to define -shared option too, otherwise\n      # it will coredump.\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'\n      ;;\n    *)\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n      ;;\n    esac\n  else\n    case $host_os in\n      aix[[4-9]]*)\n\t# All AIX code is PIC.\n\tif test \"$host_cpu\" = ia64; then\n\t  # AIX 5 now supports IA64 processor\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\telse\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'\n\tfi\n\t;;\n      chorus*)\n\tcase $cc_basename in\n\tcxch68*)\n\t  # Green Hills C++ Compiler\n\t  # _LT_TAGVAR(lt_prog_compiler_static, $1)=\"--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a\"\n\t  ;;\n\tesac\n\t;;\n      dgux*)\n\tcase $cc_basename in\n\t  ec++*)\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t    ;;\n\t  ghcx*)\n\t    # Green Hills C++ Compiler\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      freebsd* | dragonfly*)\n\t# FreeBSD uses GNU C++\n\t;;\n      hpux9* | hpux10* | hpux11*)\n\tcase $cc_basename in\n\t  CC*)\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'\n\t    if test \"$host_cpu\" != ia64; then\n\t      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'\n\t    fi\n\t    ;;\n\t  aCC*)\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'\n\t    case $host_cpu in\n\t    hppa*64*|ia64*)\n\t      # +Z the default\n\t      ;;\n\t    *)\n\t      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'\n\t      ;;\n\t    esac\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      interix*)\n\t# This is c89, which is MS Visual C++ (no shared libs)\n\t# Anyone wants to do a port?\n\t;;\n      irix5* | irix6* | nonstopux*)\n\tcase $cc_basename in\n\t  CC*)\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n\t    # CC pic flag -KPIC is the default.\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      linux* | k*bsd*-gnu | kopensolaris*-gnu)\n\tcase $cc_basename in\n\t  KCC*)\n\t    # KAI C++ Compiler\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t    ;;\n\t  ecpc* )\n\t    # old Intel C++ for x86_64 which still supported -KPIC.\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n\t    ;;\n\t  icpc* )\n\t    # Intel C++, used to be incompatible with GCC.\n\t    # ICC 10 doesn't accept -KPIC any more.\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n\t    ;;\n\t  pgCC* | pgcpp*)\n\t    # Portland Group C++ compiler\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t    ;;\n\t  cxx*)\n\t    # Compaq C++\n\t    # Make sure the PIC flag is empty.  It appears that all Alpha\n\t    # Linux and Compaq Tru64 Unix objects are PIC.\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)=\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n\t    ;;\n\t  xlc* | xlC*)\n\t    # IBM XL 8.0 on PPC\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'\n\t    ;;\n\t  *)\n\t    case `$CC -V 2>&1 | sed 5q` in\n\t    *Sun\\ C*)\n\t      # Sun C++ 5.9\n\t      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '\n\t      ;;\n\t    esac\n\t    ;;\n\tesac\n\t;;\n      lynxos*)\n\t;;\n      m88k*)\n\t;;\n      mvs*)\n\tcase $cc_basename in\n\t  cxx*)\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      netbsd* | netbsdelf*-gnu)\n\t;;\n      *qnx* | *nto*)\n        # QNX uses GNU C++, but need to define -shared option too, otherwise\n        # it will coredump.\n        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'\n        ;;\n      osf3* | osf4* | osf5*)\n\tcase $cc_basename in\n\t  KCC*)\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'\n\t    ;;\n\t  RCC*)\n\t    # Rational C++ 2.4.1\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'\n\t    ;;\n\t  cxx*)\n\t    # Digital/Compaq C++\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    # Make sure the PIC flag is empty.  It appears that all Alpha\n\t    # Linux and Compaq Tru64 Unix objects are PIC.\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)=\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      psos*)\n\t;;\n      solaris*)\n\tcase $cc_basename in\n\t  CC*)\n\t    # Sun C++ 4.2, 5.x and Centerline C++\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '\n\t    ;;\n\t  gcx*)\n\t    # Green Hills C++ Compiler\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      sunos4*)\n\tcase $cc_basename in\n\t  CC*)\n\t    # Sun C++ 4.x\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t    ;;\n\t  lcc*)\n\t    # Lucid\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)\n\tcase $cc_basename in\n\t  CC*)\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t    ;;\n\tesac\n\t;;\n      tandem*)\n\tcase $cc_basename in\n\t  NCC*)\n\t    # NonStop-UX NCC 3.20\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      vxworks*)\n\t;;\n      *)\n\t_LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no\n\t;;\n    esac\n  fi\n],\n[\n  if test \"$GCC\" = yes; then\n    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n\n    case $host_os in\n      aix*)\n      # All AIX code is PIC.\n      if test \"$host_cpu\" = ia64; then\n\t# AIX 5 now supports IA64 processor\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n        ;;\n      m68k)\n            # FIXME: we need at least 68020 code to build shared libraries, but\n            # adding the `-m68020' flag to GCC prevents building anything better,\n            # like `-m68040'.\n            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'\n        ;;\n      esac\n      ;;\n\n    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)\n      # PIC is the default for these OSes.\n      ;;\n\n    mingw* | cygwin* | pw32* | os2* | cegcc*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      # Although the cygwin gcc ignores -fPIC, still need this for old-style\n      # (--disable-auto-import) libraries\n      m4_if([$1], [GCJ], [],\n\t[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])\n      ;;\n\n    darwin* | rhapsody*)\n      # PIC is the default on this platform\n      # Common symbols not allowed in MH_DYLIB files\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'\n      ;;\n\n    hpux*)\n      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit\n      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag\n      # sets the default TLS model and affects inlining.\n      case $host_cpu in\n      hppa*64*)\n\t# +Z the default\n\t;;\n      *)\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t;;\n      esac\n      ;;\n\n    interix[[3-9]]*)\n      # Interix 3.x gcc -fpic/-fPIC options generate broken code.\n      # Instead, we relocate shared libraries at runtime.\n      ;;\n\n    msdosdjgpp*)\n      # Just because we use GCC doesn't mean we suddenly get shared libraries\n      # on systems that don't support them.\n      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no\n      enable_shared=no\n      ;;\n\n    *nto* | *qnx*)\n      # QNX uses GNU C++, but need to define -shared option too, otherwise\n      # it will coredump.\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic\n      fi\n      ;;\n\n    *)\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n      ;;\n    esac\n  else\n    # PORTME Check for flag to pass linker flags through the system compiler.\n    case $host_os in\n    aix*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      if test \"$host_cpu\" = ia64; then\n\t# AIX 5 now supports IA64 processor\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      else\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'\n      fi\n      ;;\n\n    mingw* | cygwin* | pw32* | os2* | cegcc*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      m4_if([$1], [GCJ], [],\n\t[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])\n      ;;\n\n    hpux9* | hpux10* | hpux11*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but\n      # not for PA HP-UX.\n      case $host_cpu in\n      hppa*64*|ia64*)\n\t# +Z the default\n\t;;\n      *)\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'\n\t;;\n      esac\n      # Is there a better lt_prog_compiler_static that works with the bundled CC?\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'\n      ;;\n\n    irix5* | irix6* | nonstopux*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      # PIC (with -KPIC) is the default.\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n      ;;\n\n    linux* | k*bsd*-gnu | kopensolaris*-gnu)\n      case $cc_basename in\n      # old Intel for x86_64 which still supported -KPIC.\n      ecc*)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n        ;;\n      # icc used to be incompatible with GCC.\n      # ICC 10 doesn't accept -KPIC any more.\n      icc* | ifort*)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n        ;;\n      # Lahey Fortran 8.1.\n      lf95*)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'\n\t;;\n      pgcc* | pgf77* | pgf90* | pgf95*)\n        # Portland Group compilers (*not* the Pentium gcc compiler,\n\t# which looks to be a dead project)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n        ;;\n      ccc*)\n        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n        # All Alpha code is PIC.\n        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n        ;;\n      xl*)\n\t# IBM XL C 8.0/Fortran 10.1 on PPC\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'\n\t;;\n      *)\n\tcase `$CC -V 2>&1 | sed 5q` in\n\t*Sun\\ C*)\n\t  # Sun C 5.9\n\t  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t  ;;\n\t*Sun\\ F*)\n\t  # Sun Fortran 8.3 passes all unrecognized flags to the linker\n\t  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t  _LT_TAGVAR(lt_prog_compiler_wl, $1)=''\n\t  ;;\n\tesac\n\t;;\n      esac\n      ;;\n\n    newsos6)\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      ;;\n\n    *nto* | *qnx*)\n      # QNX uses GNU C++, but need to define -shared option too, otherwise\n      # it will coredump.\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'\n      ;;\n\n    osf3* | osf4* | osf5*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      # All OSF/1 code is PIC.\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n      ;;\n\n    rdos*)\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n      ;;\n\n    solaris*)\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      case $cc_basename in\n      f77* | f90* | f95*)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;\n      *)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;\n      esac\n      ;;\n\n    sunos4*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      ;;\n\n    sysv4 | sysv4.2uw2* | sysv4.3*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec ;then\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      fi\n      ;;\n\n    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      ;;\n\n    unicos*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no\n      ;;\n\n    uts4*)\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      ;;\n\n    *)\n      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no\n      ;;\n    esac\n  fi\n])\ncase $host_os in\n  # For platforms which do not support PIC, -DPIC is meaningless:\n  *djgpp*)\n    _LT_TAGVAR(lt_prog_compiler_pic, $1)=\n    ;;\n  *)\n    _LT_TAGVAR(lt_prog_compiler_pic, $1)=\"$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])\"\n    ;;\nesac\nAC_MSG_RESULT([$_LT_TAGVAR(lt_prog_compiler_pic, $1)])\n_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],\n\t[How to pass a linker flag through the compiler])\n\n#\n# Check to make sure the PIC flag actually works.\n#\nif test -n \"$_LT_TAGVAR(lt_prog_compiler_pic, $1)\"; then\n  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],\n    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],\n    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],\n    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in\n     \"\" | \" \"*) ;;\n     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=\" $_LT_TAGVAR(lt_prog_compiler_pic, $1)\" ;;\n     esac],\n    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=\n     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])\nfi\n_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],\n\t[Additional compiler flags for building library objects])\n\n#\n# Check to make sure the static flag actually works.\n#\nwl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\\\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\\\"\n_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],\n  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),\n  $lt_tmp_static_flag,\n  [],\n  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])\n_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],\n\t[Compiler flag to prevent dynamic linking])\n])# _LT_COMPILER_PIC\n\n\n# _LT_LINKER_SHLIBS([TAGNAME])\n# ----------------------------\n# See if the linker supports building shared libraries.\nm4_defun([_LT_LINKER_SHLIBS],\n[AC_REQUIRE([LT_PATH_LD])dnl\nAC_REQUIRE([LT_PATH_NM])dnl\nm4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_DECL_EGREP])dnl\nm4_require([_LT_DECL_SED])dnl\nm4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl\nm4_require([_LT_TAG_COMPILER])dnl\nAC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])\nm4_if([$1], [CXX], [\n  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\\''s/.* //'\\'' | sort | uniq > $export_symbols'\n  case $host_os in\n  aix[[4-9]]*)\n    # If we're using GNU nm, then we don't want the \"-C\" option.\n    # -C means demangle to AIX nm, but means don't demangle with GNU nm\n    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then\n      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\")) && ([substr](\\$ 3,1,1) != \".\")) { print \\$ 3 } }'\\'' | sort -u > $export_symbols'\n    else\n      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\")) && ([substr](\\$ 3,1,1) != \".\")) { print \\$ 3 } }'\\'' | sort -u > $export_symbols'\n    fi\n    ;;\n  pw32*)\n    _LT_TAGVAR(export_symbols_cmds, $1)=\"$ltdll_cmds\"\n  ;;\n  cygwin* | mingw* | cegcc*)\n    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\\([[^ ]]*\\)/\\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\\([[^ ]]*\\)[[ ]][[^ ]]*/\\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\\'' | sort | uniq > $export_symbols'\n  ;;\n  linux* | k*bsd*-gnu)\n    _LT_TAGVAR(link_all_deplibs, $1)=no\n  ;;\n  *)\n    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\\''s/.* //'\\'' | sort | uniq > $export_symbols'\n  ;;\n  esac\n  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']\n], [\n  runpath_var=\n  _LT_TAGVAR(allow_undefined_flag, $1)=\n  _LT_TAGVAR(always_export_symbols, $1)=no\n  _LT_TAGVAR(archive_cmds, $1)=\n  _LT_TAGVAR(archive_expsym_cmds, $1)=\n  _LT_TAGVAR(compiler_needs_object, $1)=no\n  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no\n  _LT_TAGVAR(export_dynamic_flag_spec, $1)=\n  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\\''s/.* //'\\'' | sort | uniq > $export_symbols'\n  _LT_TAGVAR(hardcode_automatic, $1)=no\n  _LT_TAGVAR(hardcode_direct, $1)=no\n  _LT_TAGVAR(hardcode_direct_absolute, $1)=no\n  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=\n  _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=\n  _LT_TAGVAR(hardcode_libdir_separator, $1)=\n  _LT_TAGVAR(hardcode_minus_L, $1)=no\n  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported\n  _LT_TAGVAR(inherit_rpath, $1)=no\n  _LT_TAGVAR(link_all_deplibs, $1)=unknown\n  _LT_TAGVAR(module_cmds, $1)=\n  _LT_TAGVAR(module_expsym_cmds, $1)=\n  _LT_TAGVAR(old_archive_from_new_cmds, $1)=\n  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=\n  _LT_TAGVAR(thread_safe_flag_spec, $1)=\n  _LT_TAGVAR(whole_archive_flag_spec, $1)=\n  # include_expsyms should be a list of space-separated symbols to be *always*\n  # included in the symbol list\n  _LT_TAGVAR(include_expsyms, $1)=\n  # exclude_expsyms can be an extended regexp of symbols to exclude\n  # it will be wrapped by ` (' and `)$', so one must not match beginning or\n  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',\n  # as well as any symbol that contains `d'.\n  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']\n  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out\n  # platforms (ab)use it in PIC code, but their linkers get confused if\n  # the symbol is explicitly referenced.  Since portable code cannot\n  # rely on this symbol name, it's probably fine to never include it in\n  # preloaded symbol tables.\n  # Exclude shared library initialization/finalization symbols.\ndnl Note also adjust exclude_expsyms for C++ above.\n  extract_expsyms_cmds=\n\n  case $host_os in\n  cygwin* | mingw* | pw32* | cegcc*)\n    # FIXME: the MSVC++ port hasn't been tested in a loooong time\n    # When not using gcc, we currently assume that we are using\n    # Microsoft Visual C++.\n    if test \"$GCC\" != yes; then\n      with_gnu_ld=no\n    fi\n    ;;\n  interix*)\n    # we just hope/assume this is gcc and not c89 (= MSVC++)\n    with_gnu_ld=yes\n    ;;\n  openbsd*)\n    with_gnu_ld=no\n    ;;\n  linux* | k*bsd*-gnu)\n    _LT_TAGVAR(link_all_deplibs, $1)=no\n    ;;\n  esac\n\n  _LT_TAGVAR(ld_shlibs, $1)=yes\n  if test \"$with_gnu_ld\" = yes; then\n    # If archive_cmds runs LD, not CC, wlarc should be empty\n    wlarc='${wl}'\n\n    # Set some defaults for GNU ld with shared library support. These\n    # are reset later if shared libraries are not supported. Putting them\n    # here allows them to be overridden if necessary.\n    runpath_var=LD_RUN_PATH\n    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'\n    # ancient GNU ld didn't support --whole-archive et. al.\n    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then\n      _LT_TAGVAR(whole_archive_flag_spec, $1)=\"$wlarc\"'--whole-archive$convenience '\"$wlarc\"'--no-whole-archive'\n    else\n      _LT_TAGVAR(whole_archive_flag_spec, $1)=\n    fi\n    supports_anon_versioning=no\n    case `$LD -v 2>&1` in\n      *GNU\\ gold*) supports_anon_versioning=yes ;;\n      *\\ [[01]].* | *\\ 2.[[0-9]].* | *\\ 2.10.*) ;; # catch versions < 2.11\n      *\\ 2.11.93.0.2\\ *) supports_anon_versioning=yes ;; # RH7.3 ...\n      *\\ 2.11.92.0.12\\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...\n      *\\ 2.11.*) ;; # other 2.11 versions\n      *) supports_anon_versioning=yes ;;\n    esac\n\n    # See if GNU ld supports shared libraries.\n    case $host_os in\n    aix[[3-9]]*)\n      # On AIX/PPC, the GNU linker is very broken\n      if test \"$host_cpu\" != ia64; then\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: the GNU linker, at least up to release 2.9.1, is reported\n*** to be unable to reliably create shared libraries on AIX.\n*** Therefore, libtool is disabling shared libraries support.  If you\n*** really care for shared libraries, you may want to modify your PATH\n*** so that a non-GNU linker is found, and then restart.\n\n_LT_EOF\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n            _LT_TAGVAR(archive_expsym_cmds, $1)=''\n        ;;\n      m68k)\n            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO \"#define NAME $libname\" > $output_objdir/a2ixlibrary.data~$ECHO \"#define LIBRARY_ID 1\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define VERSION $major\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define REVISION $revision\" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'\n            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n            _LT_TAGVAR(hardcode_minus_L, $1)=yes\n        ;;\n      esac\n      ;;\n\n    beos*)\n      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t_LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n\t# Joseph Beckenbach <jrb3@best.com> says some releases of gcc\n\t# support --undefined.  This deserves some investigation.  FIXME\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n      else\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n\n    cygwin* | mingw* | pw32* | cegcc*)\n      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,\n      # as there is no search path for DLLs.\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n      _LT_TAGVAR(always_export_symbols, $1)=no\n      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes\n      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\\([[^ ]]*\\)/\\1 DATA/'\\'' | $SED -e '\\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\\'' | sort | uniq > $export_symbols'\n\n      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then\n        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n\t# If the export-symbols file already is a .def file (1st line\n\t# is EXPORTS), use it as is; otherwise, prepend...\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='if test \"x`$SED 1q $export_symbols`\" = xEXPORTS; then\n\t  cp $export_symbols $output_objdir/$soname.def;\n\telse\n\t  echo EXPORTS > $output_objdir/$soname.def;\n\t  cat $export_symbols >> $output_objdir/$soname.def;\n\tfi~\n\t$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n      else\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n\n    interix[[3-9]]*)\n      _LT_TAGVAR(hardcode_direct, $1)=no\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.\n      # Instead, shared libraries are loaded at an image base (0x10000000 by\n      # default) and relocated if they conflict, which is a slow very memory\n      # consuming and fragmenting process.  To avoid this, we pick a random,\n      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link\n      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.\n      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n      _LT_TAGVAR(archive_expsym_cmds, $1)='sed \"s,^,_,\" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n      ;;\n\n    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)\n      tmp_diet=no\n      if test \"$host_os\" = linux-dietlibc; then\n\tcase $cc_basename in\n\t  diet\\ *) tmp_diet=yes;;\t# linux-dietlibc with static linking (!diet-dyn)\n\tesac\n      fi\n      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \\\n\t && test \"$tmp_diet\" = no\n      then\n\ttmp_addflag=\n\ttmp_sharedflag='-shared'\n\tcase $cc_basename,$host_cpu in\n        pgcc*)\t\t\t\t# Portland Group C compiler\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; $ECHO \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  tmp_addflag=' $pic_flag'\n\t  ;;\n\tpgf77* | pgf90* | pgf95*)\t# Portland Group f77 and f90 compilers\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; $ECHO \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  tmp_addflag=' $pic_flag -Mnomain' ;;\n\tecc*,ia64* | icc*,ia64*)\t# Intel C compiler on ia64\n\t  tmp_addflag=' -i_dynamic' ;;\n\tefc*,ia64* | ifort*,ia64*)\t# Intel Fortran compiler on ia64\n\t  tmp_addflag=' -i_dynamic -nofor_main' ;;\n\tifc* | ifort*)\t\t\t# Intel Fortran compiler\n\t  tmp_addflag=' -nofor_main' ;;\n\tlf95*)\t\t\t\t# Lahey Fortran 8.1\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)=\n\t  tmp_sharedflag='--shared' ;;\n\txl[[cC]]*)\t\t\t# IBM XL C 8.0 on PPC (deal with xlf below)\n\t  tmp_sharedflag='-qmkshrobj'\n\t  tmp_addflag= ;;\n\tesac\n\tcase `$CC -V 2>&1 | sed 5q` in\n\t*Sun\\ C*)\t\t\t# Sun C 5.9\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\\\"\\\"; do test -z \\\"$conv\\\" || new_convenience=\\\"$new_convenience,$conv\\\"; done; $ECHO \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  _LT_TAGVAR(compiler_needs_object, $1)=yes\n\t  tmp_sharedflag='-G' ;;\n\t*Sun\\ F*)\t\t\t# Sun Fortran 8.3\n\t  tmp_sharedflag='-G' ;;\n\tesac\n\t_LT_TAGVAR(archive_cmds, $1)='$CC '\"$tmp_sharedflag\"\"$tmp_addflag\"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\n        if test \"x$supports_anon_versioning\" = xyes; then\n          _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $output_objdir/$libname.ver~\n\t    cat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $output_objdir/$libname.ver~\n\t    echo \"local: *; };\" >> $output_objdir/$libname.ver~\n\t    $CC '\"$tmp_sharedflag\"\"$tmp_addflag\"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'\n        fi\n\n\tcase $cc_basename in\n\txlf*)\n\t  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir'\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $compiler_flags -soname $soname -o $lib'\n\t  if test \"x$supports_anon_versioning\" = xyes; then\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $output_objdir/$libname.ver~\n\t      cat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $output_objdir/$libname.ver~\n\t      echo \"local: *; };\" >> $output_objdir/$libname.ver~\n\t      $LD -shared $libobjs $deplibs $compiler_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'\n\t  fi\n\t  ;;\n\tesac\n      else\n        _LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n\n    netbsd* | netbsdelf*-gnu)\n      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'\n\twlarc=\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n      fi\n      ;;\n\n    solaris*)\n      if $LD -v 2>&1 | $GREP 'BFD 2\\.8' > /dev/null; then\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: The releases 2.8.* of the GNU linker cannot reliably\n*** create shared libraries on Solaris systems.  Therefore, libtool\n*** is disabling shared libraries support.  We urge you to upgrade GNU\n*** binutils to release 2.9.1 or newer.  Another option is to modify\n*** your PATH or compiler configuration so that the native linker is\n*** used, and then restart.\n\n_LT_EOF\n      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n      else\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n\n    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)\n      case `$LD -v 2>&1` in\n        *\\ [[01]].* | *\\ 2.[[0-9]].* | *\\ 2.1[[0-5]].*)\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not\n*** reliably create shared libraries on SCO systems.  Therefore, libtool\n*** is disabling shared libraries support.  We urge you to upgrade GNU\n*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify\n*** your PATH or compiler configuration so that the native linker is\n*** used, and then restart.\n\n_LT_EOF\n\t;;\n\t*)\n\t  # For security reasons, it is highly recommended that you always\n\t  # use absolute paths for naming shared libraries, and exclude the\n\t  # DT_RUNPATH tag from executables and libraries.  But doing so\n\t  # requires that you compile everything twice, which is a pain.\n\t  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n\t  else\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t  fi\n\t;;\n      esac\n      ;;\n\n    sunos4*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n      wlarc=\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    *)\n      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n      else\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n    esac\n\n    if test \"$_LT_TAGVAR(ld_shlibs, $1)\" = no; then\n      runpath_var=\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)=\n      _LT_TAGVAR(whole_archive_flag_spec, $1)=\n    fi\n  else\n    # PORTME fill in a description of your system's linker (not GNU ld)\n    case $host_os in\n    aix3*)\n      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n      _LT_TAGVAR(always_export_symbols, $1)=yes\n      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'\n      # Note: this linker hardcodes the directories in LIBPATH if there\n      # are no directories specified by -L.\n      _LT_TAGVAR(hardcode_minus_L, $1)=yes\n      if test \"$GCC\" = yes && test -z \"$lt_prog_compiler_static\"; then\n\t# Neither direct hardcoding nor static linking is supported with a\n\t# broken collect2.\n\t_LT_TAGVAR(hardcode_direct, $1)=unsupported\n      fi\n      ;;\n\n    aix[[4-9]]*)\n      if test \"$host_cpu\" = ia64; then\n\t# On IA64, the linker does run time linking by default, so we don't\n\t# have to do anything special.\n\taix_use_runtimelinking=no\n\texp_sym_flag='-Bexport'\n\tno_entry_flag=\"\"\n      else\n\t# If we're using GNU nm, then we don't want the \"-C\" option.\n\t# -C means demangle to AIX nm, but means don't demangle with GNU nm\n\tif $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then\n\t  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\")) && ([substr](\\$ 3,1,1) != \".\")) { print \\$ 3 } }'\\'' | sort -u > $export_symbols'\n\telse\n\t  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\")) && ([substr](\\$ 3,1,1) != \".\")) { print \\$ 3 } }'\\'' | sort -u > $export_symbols'\n\tfi\n\taix_use_runtimelinking=no\n\n\t# Test if we are trying to use run time linking or normal\n\t# AIX style linking. If -brtl is somewhere in LDFLAGS, we\n\t# need to do runtime linking.\n\tcase $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)\n\t  for ld_flag in $LDFLAGS; do\n\t  if (test $ld_flag = \"-brtl\" || test $ld_flag = \"-Wl,-brtl\"); then\n\t    aix_use_runtimelinking=yes\n\t    break\n\t  fi\n\t  done\n\t  ;;\n\tesac\n\n\texp_sym_flag='-bexport'\n\tno_entry_flag='-bnoentry'\n      fi\n\n      # When large executables or shared objects are built, AIX ld can\n      # have problems creating the table of contents.  If linking a library\n      # or program results in \"error TOC overflow\" add -mminimal-toc to\n      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not\n      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.\n\n      _LT_TAGVAR(archive_cmds, $1)=''\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'\n      _LT_TAGVAR(link_all_deplibs, $1)=yes\n      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'\n\n      if test \"$GCC\" = yes; then\n\tcase $host_os in aix4.[[012]]|aix4.[[012]].*)\n\t# We only want to do this on AIX 4.2 and lower, the check\n\t# below for broken collect2 doesn't work under 4.3+\n\t  collect2name=`${CC} -print-prog-name=collect2`\n\t  if test -f \"$collect2name\" &&\n\t   strings \"$collect2name\" | $GREP resolve_lib_name >/dev/null\n\t  then\n\t  # We have reworked collect2\n\t  :\n\t  else\n\t  # We have old collect2\n\t  _LT_TAGVAR(hardcode_direct, $1)=unsupported\n\t  # It fails to find uninstalled libraries when the uninstalled\n\t  # path is not listed in the libpath.  Setting hardcode_minus_L\n\t  # to unsupported forces relinking\n\t  _LT_TAGVAR(hardcode_minus_L, $1)=yes\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n\t  _LT_TAGVAR(hardcode_libdir_separator, $1)=\n\t  fi\n\t  ;;\n\tesac\n\tshared_flag='-shared'\n\tif test \"$aix_use_runtimelinking\" = yes; then\n\t  shared_flag=\"$shared_flag \"'${wl}-G'\n\tfi\n\t_LT_TAGVAR(link_all_deplibs, $1)=no\n      else\n\t# not using gcc\n\tif test \"$host_cpu\" = ia64; then\n\t# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release\n\t# chokes on -Wl,-G. The following line is correct:\n\t  shared_flag='-G'\n\telse\n\t  if test \"$aix_use_runtimelinking\" = yes; then\n\t    shared_flag='${wl}-G'\n\t  else\n\t    shared_flag='${wl}-bM:SRE'\n\t  fi\n\tfi\n      fi\n\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'\n      # It seems that -bexpall does not export symbols beginning with\n      # underscore (_), so it is better to generate a list of symbols to export.\n      _LT_TAGVAR(always_export_symbols, $1)=yes\n      if test \"$aix_use_runtimelinking\" = yes; then\n\t# Warning - without using the other runtime loading flags (-brtl),\n\t# -berok will link without error, but may produce a broken library.\n\t_LT_TAGVAR(allow_undefined_flag, $1)='-berok'\n        # Determine the default libpath from the value encoded in an\n        # empty executable.\n        _LT_SYS_MODULE_PATH_AIX\n        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '\"\\${wl}$no_entry_flag\"' $compiler_flags `if test \"x${allow_undefined_flag}\" != \"x\"; then $ECHO \"X${wl}${allow_undefined_flag}\" | $Xsed; else :; fi` '\"\\${wl}$exp_sym_flag:\\$export_symbols $shared_flag\"\n      else\n\tif test \"$host_cpu\" = ia64; then\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'\n\t  _LT_TAGVAR(allow_undefined_flag, $1)=\"-z nodefs\"\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs '\"\\${wl}$no_entry_flag\"' $compiler_flags ${wl}${allow_undefined_flag} '\"\\${wl}$exp_sym_flag:\\$export_symbols\"\n\telse\n\t # Determine the default libpath from the value encoded in an\n\t # empty executable.\n\t _LT_SYS_MODULE_PATH_AIX\n\t _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n\t  # Warning - without using the other run time loading flags,\n\t  # -berok will link without error, but may produce a broken library.\n\t  _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'\n\t  _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'\n\t  # Exported symbols can be pulled into shared objects from archives\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'\n\t  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes\n\t  # This is similar to how AIX traditionally builds its shared libraries.\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'\n\tfi\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n            _LT_TAGVAR(archive_expsym_cmds, $1)=''\n        ;;\n      m68k)\n            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO \"#define NAME $libname\" > $output_objdir/a2ixlibrary.data~$ECHO \"#define LIBRARY_ID 1\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define VERSION $major\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define REVISION $revision\" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'\n            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n            _LT_TAGVAR(hardcode_minus_L, $1)=yes\n        ;;\n      esac\n      ;;\n\n    bsdi[[45]]*)\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic\n      ;;\n\n    cygwin* | mingw* | pw32* | cegcc*)\n      # When not using gcc, we currently assume that we are using\n      # Microsoft Visual C++.\n      # hardcode_libdir_flag_spec is actually meaningless, as there is\n      # no search path for DLLs.\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '\n      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n      # Tell ltmain to make .lib files, not .a files.\n      libext=lib\n      # Tell ltmain to make .dll files, not .so files.\n      shrext_cmds=\".dll\"\n      # FIXME: Setting linknames here is a bad hack.\n      _LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `$ECHO \"X$deplibs\" | $Xsed -e '\\''s/ -lc$//'\\''` -link -dll~linknames='\n      # The linker will automatically build a .lib file if we build a DLL.\n      _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'\n      # FIXME: Should let the user specify the lib program.\n      _LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'\n      _LT_TAGVAR(fix_srcfile_path, $1)='`cygpath -w \"$srcfile\"`'\n      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes\n      ;;\n\n    darwin* | rhapsody*)\n      _LT_DARWIN_LINKER_FEATURES($1)\n      ;;\n\n    dgux*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    freebsd1*)\n      _LT_TAGVAR(ld_shlibs, $1)=no\n      ;;\n\n    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor\n    # support.  Future versions do this automatically, but an explicit c++rt0.o\n    # does not break anything, and helps significantly (at the cost of a little\n    # extra space).\n    freebsd2.2*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    # Unfortunately, older versions of FreeBSD 2 do not have this feature.\n    freebsd2*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_minus_L, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.\n    freebsd* | dragonfly*)\n      _LT_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    hpux9*)\n      if test \"$GCC\" = yes; then\n\t_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'\n      fi\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n\n      # hardcode_minus_L: Not really in the search PATH,\n      # but as the default location of the library.\n      _LT_TAGVAR(hardcode_minus_L, $1)=yes\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n      ;;\n\n    hpux10*)\n      if test \"$GCC\" = yes -a \"$with_gnu_ld\" = no; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'\n      fi\n      if test \"$with_gnu_ld\" = no; then\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'\n\t_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'\n\t_LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\t_LT_TAGVAR(hardcode_direct, $1)=yes\n\t_LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n\t_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n\t# hardcode_minus_L: Not really in the search PATH,\n\t# but as the default location of the library.\n\t_LT_TAGVAR(hardcode_minus_L, $1)=yes\n      fi\n      ;;\n\n    hpux11*)\n      if test \"$GCC\" = yes -a \"$with_gnu_ld\" = no; then\n\tcase $host_cpu in\n\thppa*64*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tia64*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\t*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tesac\n      else\n\tcase $host_cpu in\n\thppa*64*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tia64*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\t*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tesac\n      fi\n      if test \"$with_gnu_ld\" = no; then\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'\n\t_LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n\tcase $host_cpu in\n\thppa*64*|ia64*)\n\t  _LT_TAGVAR(hardcode_direct, $1)=no\n\t  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t  ;;\n\t*)\n\t  _LT_TAGVAR(hardcode_direct, $1)=yes\n\t  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n\t  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n\n\t  # hardcode_minus_L: Not really in the search PATH,\n\t  # but as the default location of the library.\n\t  _LT_TAGVAR(hardcode_minus_L, $1)=yes\n\t  ;;\n\tesac\n      fi\n      ;;\n\n    irix5* | irix6* | nonstopux*)\n      if test \"$GCC\" = yes; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && $ECHO \"X${wl}-set_version ${wl}$verstring\" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t# Try to use the -exported_symbol ld option, if it does not\n\t# work, assume that -exports_file does not work either and\n\t# implicitly export all symbols.\n        save_LDFLAGS=\"$LDFLAGS\"\n        LDFLAGS=\"$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null\"\n        AC_LINK_IFELSE(int foo(void) {},\n          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && $ECHO \"X${wl}-set_version ${wl}$verstring\" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'\n        )\n        LDFLAGS=\"$save_LDFLAGS\"\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && $ECHO \"X-set_version $verstring\" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && $ECHO \"X-set_version $verstring\" | $Xsed` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'\n      fi\n      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n      _LT_TAGVAR(inherit_rpath, $1)=yes\n      _LT_TAGVAR(link_all_deplibs, $1)=yes\n      ;;\n\n    netbsd* | netbsdelf*-gnu)\n      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF\n      fi\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    newsos6)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    *nto* | *qnx*)\n      ;;\n\n    openbsd*)\n      if test -f /usr/libexec/ld.so; then\n\t_LT_TAGVAR(hardcode_direct, $1)=yes\n\t_LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t_LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n\tif test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n\telse\n\t  case $host_os in\n\t   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)\n\t     _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n\t     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n\t     ;;\n\t   *)\n\t     _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'\n\t     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t     ;;\n\t  esac\n\tfi\n      else\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n\n    os2*)\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n      _LT_TAGVAR(hardcode_minus_L, $1)=yes\n      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n      _LT_TAGVAR(archive_cmds, $1)='$ECHO \"LIBRARY $libname INITINSTANCE\" > $output_objdir/$libname.def~$ECHO \"DESCRIPTION \\\"$libname\\\"\" >> $output_objdir/$libname.def~$ECHO DATA >> $output_objdir/$libname.def~$ECHO \" SINGLE NONSHARED\" >> $output_objdir/$libname.def~$ECHO EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'\n      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'\n      ;;\n\n    osf3*)\n      if test \"$GCC\" = yes; then\n\t_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\\*'\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && $ECHO \"X${wl}-set_version ${wl}$verstring\" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n      else\n\t_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \\*'\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && $ECHO \"X-set_version $verstring\" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'\n      fi\n      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n      ;;\n\n    osf4* | osf5*)\t# as osf3* with the addition of -msym flag\n      if test \"$GCC\" = yes; then\n\t_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\\*'\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n \"$verstring\" && $ECHO \"X${wl}-set_version ${wl}$verstring\" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n      else\n\t_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \\*'\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n \"$verstring\" && $ECHO \"X-set_version $verstring\" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf \"%s %s\\\\n\" -exported_symbol \"\\$i\" >> $lib.exp; done; printf \"%s\\\\n\" \"-hidden\">> $lib.exp~\n\t$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n \"$verstring\" && $ECHO \"X-set_version $verstring\" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'\n\n\t# Both c and cxx compiler support -rpath directly\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'\n      fi\n      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n      ;;\n\n    solaris*)\n      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'\n      if test \"$GCC\" = yes; then\n\twlarc='${wl}'\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t  $CC -shared ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'\n      else\n\tcase `$CC -V 2>&1` in\n\t*\"Compilers 5.0\"*)\n\t  wlarc=''\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'\n\t  ;;\n\t*)\n\t  wlarc='${wl}'\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'\n\t  ;;\n\tesac\n      fi\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      case $host_os in\n      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;\n      *)\n\t# The compiler driver will combine and reorder linker options,\n\t# but understands `-z linker_flag'.  GCC discards it without `$wl',\n\t# but is careful enough not to reorder.\n\t# Supported since Solaris 2.6 (maybe 2.5.1?)\n\tif test \"$GCC\" = yes; then\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'\n\telse\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'\n\tfi\n\t;;\n      esac\n      _LT_TAGVAR(link_all_deplibs, $1)=yes\n      ;;\n\n    sunos4*)\n      if test \"x$host_vendor\" = xsequent; then\n\t# Use $CC to link under sequent, because it throws in some extra .o\n\t# files that make .init and .fini sections work.\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'\n      fi\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_minus_L, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    sysv4)\n      case $host_vendor in\n\tsni)\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???\n\t;;\n\tsiemens)\n\t  ## LD is ld it makes a PLAMLIB\n\t  ## CC just makes a GrossModule.\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'\n\t  _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'\n\t  _LT_TAGVAR(hardcode_direct, $1)=no\n        ;;\n\tmotorola)\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie\n\t;;\n      esac\n      runpath_var='LD_RUN_PATH'\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    sysv4.3*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t_LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\trunpath_var=LD_RUN_PATH\n\thardcode_runpath_var=yes\n\t_LT_TAGVAR(ld_shlibs, $1)=yes\n      fi\n      ;;\n\n    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)\n      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'\n      _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      runpath_var='LD_RUN_PATH'\n\n      if test \"$GCC\" = yes; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      fi\n      ;;\n\n    sysv5* | sco3.2v5* | sco5v6*)\n      # Note: We can NOT use -z defs as we might desire, because we do not\n      # link with -lc, and that would cause any symbols used from libc to\n      # always be unresolved, which means just about no library would\n      # ever link correctly.  If we're not using GNU ld we use -z text\n      # though, which does catch some bad symbols but isn't as heavy-handed\n      # as -z defs.\n      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'\n      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'\n      _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'\n      _LT_TAGVAR(link_all_deplibs, $1)=yes\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'\n      runpath_var='LD_RUN_PATH'\n\n      if test \"$GCC\" = yes; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      fi\n      ;;\n\n    uts4*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    *)\n      _LT_TAGVAR(ld_shlibs, $1)=no\n      ;;\n    esac\n\n    if test x$host_vendor = xsni; then\n      case $host in\n      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)\n\t_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'\n\t;;\n      esac\n    fi\n  fi\n])\nAC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])\ntest \"$_LT_TAGVAR(ld_shlibs, $1)\" = no && can_build_shared=no\n\n_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld\n\n_LT_DECL([], [libext], [0], [Old archive suffix (normally \"a\")])dnl\n_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally \".so\")])dnl\n_LT_DECL([], [extract_expsyms_cmds], [2],\n    [The commands to extract the exported symbol list from a shared archive])\n\n#\n# Do we need to explicitly link libc?\n#\ncase \"x$_LT_TAGVAR(archive_cmds_need_lc, $1)\" in\nx|xyes)\n  # Assume -lc should be added\n  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes\n\n  if test \"$enable_shared\" = yes && test \"$GCC\" = yes; then\n    case $_LT_TAGVAR(archive_cmds, $1) in\n    *'~'*)\n      # FIXME: we may have to deal with multi-command sequences.\n      ;;\n    '$CC '*)\n      # Test whether the compiler implicitly links with -lc since on some\n      # systems, -lgcc has to come before -lc. If gcc already passes -lc\n      # to ld, don't add -lc before -lgcc.\n      AC_MSG_CHECKING([whether -lc should be explicitly linked in])\n      $RM conftest*\n      echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n      if AC_TRY_EVAL(ac_compile) 2>conftest.err; then\n        soname=conftest\n        lib=conftest\n        libobjs=conftest.$ac_objext\n        deplibs=\n        wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)\n\tpic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)\n        compiler_flags=-v\n        linker_flags=-v\n        verstring=\n        output_objdir=.\n        libname=conftest\n        lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)\n        _LT_TAGVAR(allow_undefined_flag, $1)=\n        if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\\>\\&1 \\| $GREP \\\" -lc \\\" \\>/dev/null 2\\>\\&1)\n        then\n\t  _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n        else\n\t  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes\n        fi\n        _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag\n      else\n        cat conftest.err 1>&5\n      fi\n      $RM conftest*\n      AC_MSG_RESULT([$_LT_TAGVAR(archive_cmds_need_lc, $1)])\n      ;;\n    esac\n  fi\n  ;;\nesac\n\n_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],\n    [Whether or not to add -lc for building shared libraries])\n_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],\n    [enable_shared_with_static_runtimes], [0],\n    [Whether or not to disallow shared libs when runtime libs are static])\n_LT_TAGDECL([], [export_dynamic_flag_spec], [1],\n    [Compiler flag to allow reflexive dlopens])\n_LT_TAGDECL([], [whole_archive_flag_spec], [1],\n    [Compiler flag to generate shared objects directly from archives])\n_LT_TAGDECL([], [compiler_needs_object], [1],\n    [Whether the compiler copes with passing no objects directly])\n_LT_TAGDECL([], [old_archive_from_new_cmds], [2],\n    [Create an old-style archive from a shared archive])\n_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],\n    [Create a temporary old-style archive to link instead of a shared archive])\n_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])\n_LT_TAGDECL([], [archive_expsym_cmds], [2])\n_LT_TAGDECL([], [module_cmds], [2],\n    [Commands used to build a loadable module if different from building\n    a shared archive.])\n_LT_TAGDECL([], [module_expsym_cmds], [2])\n_LT_TAGDECL([], [with_gnu_ld], [1],\n    [Whether we are building with GNU ld or not])\n_LT_TAGDECL([], [allow_undefined_flag], [1],\n    [Flag that allows shared libraries with undefined symbols to be built])\n_LT_TAGDECL([], [no_undefined_flag], [1],\n    [Flag that enforces no undefined symbols])\n_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],\n    [Flag to hardcode $libdir into a binary during linking.\n    This must work even if $libdir does not exist])\n_LT_TAGDECL([], [hardcode_libdir_flag_spec_ld], [1],\n    [[If ld is used when linking, flag to hardcode $libdir into a binary\n    during linking.  This must work even if $libdir does not exist]])\n_LT_TAGDECL([], [hardcode_libdir_separator], [1],\n    [Whether we need a single \"-rpath\" flag with a separated argument])\n_LT_TAGDECL([], [hardcode_direct], [0],\n    [Set to \"yes\" if using DIR/libNAME${shared_ext} during linking hardcodes\n    DIR into the resulting binary])\n_LT_TAGDECL([], [hardcode_direct_absolute], [0],\n    [Set to \"yes\" if using DIR/libNAME${shared_ext} during linking hardcodes\n    DIR into the resulting binary and the resulting library dependency is\n    \"absolute\", i.e impossible to change by setting ${shlibpath_var} if the\n    library is relocated])\n_LT_TAGDECL([], [hardcode_minus_L], [0],\n    [Set to \"yes\" if using the -LDIR flag during linking hardcodes DIR\n    into the resulting binary])\n_LT_TAGDECL([], [hardcode_shlibpath_var], [0],\n    [Set to \"yes\" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR\n    into the resulting binary])\n_LT_TAGDECL([], [hardcode_automatic], [0],\n    [Set to \"yes\" if building a shared library automatically hardcodes DIR\n    into the library and all subsequent libraries and executables linked\n    against it])\n_LT_TAGDECL([], [inherit_rpath], [0],\n    [Set to yes if linker adds runtime paths of dependent libraries\n    to runtime path list])\n_LT_TAGDECL([], [link_all_deplibs], [0],\n    [Whether libtool must link a program against all its dependency libraries])\n_LT_TAGDECL([], [fix_srcfile_path], [1],\n    [Fix the shell variable $srcfile for the compiler])\n_LT_TAGDECL([], [always_export_symbols], [0],\n    [Set to \"yes\" if exported symbols are required])\n_LT_TAGDECL([], [export_symbols_cmds], [2],\n    [The commands to list exported symbols])\n_LT_TAGDECL([], [exclude_expsyms], [1],\n    [Symbols that should not be listed in the preloaded symbols])\n_LT_TAGDECL([], [include_expsyms], [1],\n    [Symbols that must always be exported])\n_LT_TAGDECL([], [prelink_cmds], [2],\n    [Commands necessary for linking programs (against libraries) with templates])\n_LT_TAGDECL([], [file_list_spec], [1],\n    [Specify filename containing input files])\ndnl FIXME: Not yet implemented\ndnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],\ndnl    [Compiler flag to generate thread safe objects])\n])# _LT_LINKER_SHLIBS\n\n\n# _LT_LANG_C_CONFIG([TAG])\n# ------------------------\n# Ensure that the configuration variables for a C compiler are suitably\n# defined.  These variables are subsequently used by _LT_CONFIG to write\n# the compiler configuration to `libtool'.\nm4_defun([_LT_LANG_C_CONFIG],\n[m4_require([_LT_DECL_EGREP])dnl\nlt_save_CC=\"$CC\"\nAC_LANG_PUSH(C)\n\n# Source file extension for C test sources.\nac_ext=c\n\n# Object file extension for compiled C test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# Code to be used in simple compile tests\nlt_simple_compile_test_code=\"int some_variable = 0;\"\n\n# Code to be used in simple link tests\nlt_simple_link_test_code='int main(){return(0);}'\n\n_LT_TAG_COMPILER\n# Save the default compiler, since it gets overwritten when the other\n# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.\ncompiler_DEFAULT=$CC\n\n# save warnings/boilerplate of simple test code\n_LT_COMPILER_BOILERPLATE\n_LT_LINKER_BOILERPLATE\n\n## CAVEAT EMPTOR:\n## There is no encapsulation within the following macros, do not change\n## the running order or otherwise move them around unless you know exactly\n## what you are doing...\nif test -n \"$compiler\"; then\n  _LT_COMPILER_NO_RTTI($1)\n  _LT_COMPILER_PIC($1)\n  _LT_COMPILER_C_O($1)\n  _LT_COMPILER_FILE_LOCKS($1)\n  _LT_LINKER_SHLIBS($1)\n  _LT_SYS_DYNAMIC_LINKER($1)\n  _LT_LINKER_HARDCODE_LIBPATH($1)\n  LT_SYS_DLOPEN_SELF\n  _LT_CMD_STRIPLIB\n\n  # Report which library types will actually be built\n  AC_MSG_CHECKING([if libtool supports shared libraries])\n  AC_MSG_RESULT([$can_build_shared])\n\n  AC_MSG_CHECKING([whether to build shared libraries])\n  test \"$can_build_shared\" = \"no\" && enable_shared=no\n\n  # On AIX, shared libraries and static libraries use the same namespace, and\n  # are all built from PIC.\n  case $host_os in\n  aix3*)\n    test \"$enable_shared\" = yes && enable_static=no\n    if test -n \"$RANLIB\"; then\n      archive_cmds=\"$archive_cmds~\\$RANLIB \\$lib\"\n      postinstall_cmds='$RANLIB $lib'\n    fi\n    ;;\n\n  aix[[4-9]]*)\n    if test \"$host_cpu\" != ia64 && test \"$aix_use_runtimelinking\" = no ; then\n      test \"$enable_shared\" = yes && enable_static=no\n    fi\n    ;;\n  esac\n  AC_MSG_RESULT([$enable_shared])\n\n  AC_MSG_CHECKING([whether to build static libraries])\n  # Make sure either enable_shared or enable_static is yes.\n  test \"$enable_shared\" = yes || enable_static=yes\n  AC_MSG_RESULT([$enable_static])\n\n  _LT_CONFIG($1)\nfi\nAC_LANG_POP\nCC=\"$lt_save_CC\"\n])# _LT_LANG_C_CONFIG\n\n\n# _LT_PROG_CXX\n# ------------\n# Since AC_PROG_CXX is broken, in that it returns g++ if there is no c++\n# compiler, we have our own version here.\nm4_defun([_LT_PROG_CXX],\n[\npushdef([AC_MSG_ERROR], [_lt_caught_CXX_error=yes])\nAC_PROG_CXX\nif test -n \"$CXX\" && ( test \"X$CXX\" != \"Xno\" &&\n    ( (test \"X$CXX\" = \"Xg++\" && `g++ -v >/dev/null 2>&1` ) ||\n    (test \"X$CXX\" != \"Xg++\"))) ; then\n  AC_PROG_CXXCPP\nelse\n  _lt_caught_CXX_error=yes\nfi\npopdef([AC_MSG_ERROR])\n])# _LT_PROG_CXX\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([_LT_PROG_CXX], [])\n\n\n# _LT_LANG_CXX_CONFIG([TAG])\n# --------------------------\n# Ensure that the configuration variables for a C++ compiler are suitably\n# defined.  These variables are subsequently used by _LT_CONFIG to write\n# the compiler configuration to `libtool'.\nm4_defun([_LT_LANG_CXX_CONFIG],\n[AC_REQUIRE([_LT_PROG_CXX])dnl\nm4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_DECL_EGREP])dnl\n\nAC_LANG_PUSH(C++)\n_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n_LT_TAGVAR(allow_undefined_flag, $1)=\n_LT_TAGVAR(always_export_symbols, $1)=no\n_LT_TAGVAR(archive_expsym_cmds, $1)=\n_LT_TAGVAR(compiler_needs_object, $1)=no\n_LT_TAGVAR(export_dynamic_flag_spec, $1)=\n_LT_TAGVAR(hardcode_direct, $1)=no\n_LT_TAGVAR(hardcode_direct_absolute, $1)=no\n_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=\n_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=\n_LT_TAGVAR(hardcode_libdir_separator, $1)=\n_LT_TAGVAR(hardcode_minus_L, $1)=no\n_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported\n_LT_TAGVAR(hardcode_automatic, $1)=no\n_LT_TAGVAR(inherit_rpath, $1)=no\n_LT_TAGVAR(module_cmds, $1)=\n_LT_TAGVAR(module_expsym_cmds, $1)=\n_LT_TAGVAR(link_all_deplibs, $1)=unknown\n_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds\n_LT_TAGVAR(no_undefined_flag, $1)=\n_LT_TAGVAR(whole_archive_flag_spec, $1)=\n_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no\n\n# Source file extension for C++ test sources.\nac_ext=cpp\n\n# Object file extension for compiled C++ test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# No sense in running all these tests if we already determined that\n# the CXX compiler isn't working.  Some variables (like enable_shared)\n# are currently assumed to apply to all compilers on this platform,\n# and will be corrupted by setting them based on a non-working compiler.\nif test \"$_lt_caught_CXX_error\" != yes; then\n  # Code to be used in simple compile tests\n  lt_simple_compile_test_code=\"int some_variable = 0;\"\n\n  # Code to be used in simple link tests\n  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'\n\n  # ltmain only uses $CC for tagged configurations so make sure $CC is set.\n  _LT_TAG_COMPILER\n\n  # save warnings/boilerplate of simple test code\n  _LT_COMPILER_BOILERPLATE\n  _LT_LINKER_BOILERPLATE\n\n  # Allow CC to be a program name with arguments.\n  lt_save_CC=$CC\n  lt_save_LD=$LD\n  lt_save_GCC=$GCC\n  GCC=$GXX\n  lt_save_with_gnu_ld=$with_gnu_ld\n  lt_save_path_LD=$lt_cv_path_LD\n  if test -n \"${lt_cv_prog_gnu_ldcxx+set}\"; then\n    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx\n  else\n    $as_unset lt_cv_prog_gnu_ld\n  fi\n  if test -n \"${lt_cv_path_LDCXX+set}\"; then\n    lt_cv_path_LD=$lt_cv_path_LDCXX\n  else\n    $as_unset lt_cv_path_LD\n  fi\n  test -z \"${LDCXX+set}\" || LD=$LDCXX\n  CC=${CXX-\"c++\"}\n  compiler=$CC\n  _LT_TAGVAR(compiler, $1)=$CC\n  _LT_CC_BASENAME([$compiler])\n\n  if test -n \"$compiler\"; then\n    # We don't want -fno-exception when compiling C++ code, so set the\n    # no_builtin_flag separately\n    if test \"$GXX\" = yes; then\n      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'\n    else\n      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=\n    fi\n\n    if test \"$GXX\" = yes; then\n      # Set up default GNU C++ configuration\n\n      LT_PATH_LD\n\n      # Check if GNU C++ uses GNU ld as the underlying linker, since the\n      # archiving commands below assume that GNU ld is being used.\n      if test \"$with_gnu_ld\" = yes; then\n        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'\n        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n\n        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'\n\n        # If archive_cmds runs LD, not CC, wlarc should be empty\n        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to\n        #     investigate it a little bit more. (MM)\n        wlarc='${wl}'\n\n        # ancient GNU ld didn't support --whole-archive et. al.\n        if eval \"`$CC -print-prog-name=ld` --help 2>&1\" |\n\t  $GREP 'no-whole-archive' > /dev/null; then\n          _LT_TAGVAR(whole_archive_flag_spec, $1)=\"$wlarc\"'--whole-archive$convenience '\"$wlarc\"'--no-whole-archive'\n        else\n          _LT_TAGVAR(whole_archive_flag_spec, $1)=\n        fi\n      else\n        with_gnu_ld=no\n        wlarc=\n\n        # A generic and very simple default shared library creation\n        # command for GNU C++ for the case where it uses the native\n        # linker, instead of GNU ld.  If possible, this setting should\n        # overridden to take advantage of the native linker features on\n        # the platform it is being used on.\n        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'\n      fi\n\n      # Commands to make compiler produce verbose output that lists\n      # what \"hidden\" libraries, object files and flags are used when\n      # linking a shared library.\n      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP \"\\-L\"'\n\n    else\n      GXX=no\n      with_gnu_ld=no\n      wlarc=\n    fi\n\n    # PORTME: fill in a description of your system's C++ link characteristics\n    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])\n    _LT_TAGVAR(ld_shlibs, $1)=yes\n    case $host_os in\n      aix3*)\n        # FIXME: insert proper C++ library support\n        _LT_TAGVAR(ld_shlibs, $1)=no\n        ;;\n      aix[[4-9]]*)\n        if test \"$host_cpu\" = ia64; then\n          # On IA64, the linker does run time linking by default, so we don't\n          # have to do anything special.\n          aix_use_runtimelinking=no\n          exp_sym_flag='-Bexport'\n          no_entry_flag=\"\"\n        else\n          aix_use_runtimelinking=no\n\n          # Test if we are trying to use run time linking or normal\n          # AIX style linking. If -brtl is somewhere in LDFLAGS, we\n          # need to do runtime linking.\n          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)\n\t    for ld_flag in $LDFLAGS; do\n\t      case $ld_flag in\n\t      *-brtl*)\n\t        aix_use_runtimelinking=yes\n\t        break\n\t        ;;\n\t      esac\n\t    done\n\t    ;;\n          esac\n\n          exp_sym_flag='-bexport'\n          no_entry_flag='-bnoentry'\n        fi\n\n        # When large executables or shared objects are built, AIX ld can\n        # have problems creating the table of contents.  If linking a library\n        # or program results in \"error TOC overflow\" add -mminimal-toc to\n        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not\n        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.\n\n        _LT_TAGVAR(archive_cmds, $1)=''\n        _LT_TAGVAR(hardcode_direct, $1)=yes\n        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'\n        _LT_TAGVAR(link_all_deplibs, $1)=yes\n        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'\n\n        if test \"$GXX\" = yes; then\n          case $host_os in aix4.[[012]]|aix4.[[012]].*)\n          # We only want to do this on AIX 4.2 and lower, the check\n          # below for broken collect2 doesn't work under 4.3+\n\t  collect2name=`${CC} -print-prog-name=collect2`\n\t  if test -f \"$collect2name\" &&\n\t     strings \"$collect2name\" | $GREP resolve_lib_name >/dev/null\n\t  then\n\t    # We have reworked collect2\n\t    :\n\t  else\n\t    # We have old collect2\n\t    _LT_TAGVAR(hardcode_direct, $1)=unsupported\n\t    # It fails to find uninstalled libraries when the uninstalled\n\t    # path is not listed in the libpath.  Setting hardcode_minus_L\n\t    # to unsupported forces relinking\n\t    _LT_TAGVAR(hardcode_minus_L, $1)=yes\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n\t    _LT_TAGVAR(hardcode_libdir_separator, $1)=\n\t  fi\n          esac\n          shared_flag='-shared'\n\t  if test \"$aix_use_runtimelinking\" = yes; then\n\t    shared_flag=\"$shared_flag \"'${wl}-G'\n\t  fi\n        else\n          # not using gcc\n          if test \"$host_cpu\" = ia64; then\n\t  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release\n\t  # chokes on -Wl,-G. The following line is correct:\n\t  shared_flag='-G'\n          else\n\t    if test \"$aix_use_runtimelinking\" = yes; then\n\t      shared_flag='${wl}-G'\n\t    else\n\t      shared_flag='${wl}-bM:SRE'\n\t    fi\n          fi\n        fi\n\n        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'\n        # It seems that -bexpall does not export symbols beginning with\n        # underscore (_), so it is better to generate a list of symbols to\n\t# export.\n        _LT_TAGVAR(always_export_symbols, $1)=yes\n        if test \"$aix_use_runtimelinking\" = yes; then\n          # Warning - without using the other runtime loading flags (-brtl),\n          # -berok will link without error, but may produce a broken library.\n          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'\n          # Determine the default libpath from the value encoded in an empty\n          # executable.\n          _LT_SYS_MODULE_PATH_AIX\n          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n\n          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '\"\\${wl}$no_entry_flag\"' $compiler_flags `if test \"x${allow_undefined_flag}\" != \"x\"; then $ECHO \"X${wl}${allow_undefined_flag}\" | $Xsed; else :; fi` '\"\\${wl}$exp_sym_flag:\\$export_symbols $shared_flag\"\n        else\n          if test \"$host_cpu\" = ia64; then\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'\n\t    _LT_TAGVAR(allow_undefined_flag, $1)=\"-z nodefs\"\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs '\"\\${wl}$no_entry_flag\"' $compiler_flags ${wl}${allow_undefined_flag} '\"\\${wl}$exp_sym_flag:\\$export_symbols\"\n          else\n\t    # Determine the default libpath from the value encoded in an\n\t    # empty executable.\n\t    _LT_SYS_MODULE_PATH_AIX\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n\t    # Warning - without using the other run time loading flags,\n\t    # -berok will link without error, but may produce a broken library.\n\t    _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'\n\t    _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'\n\t    # Exported symbols can be pulled into shared objects from archives\n\t    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'\n\t    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes\n\t    # This is similar to how AIX traditionally builds its shared\n\t    # libraries.\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'\n          fi\n        fi\n        ;;\n\n      beos*)\n\tif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n\t  # Joseph Beckenbach <jrb3@best.com> says some releases of gcc\n\t  # support --undefined.  This deserves some investigation.  FIXME\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\telse\n\t  _LT_TAGVAR(ld_shlibs, $1)=no\n\tfi\n\t;;\n\n      chorus*)\n        case $cc_basename in\n          *)\n\t  # FIXME: insert proper C++ library support\n\t  _LT_TAGVAR(ld_shlibs, $1)=no\n\t  ;;\n        esac\n        ;;\n\n      cygwin* | mingw* | pw32* | cegcc*)\n        # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,\n        # as there is no search path for DLLs.\n        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n        _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n        _LT_TAGVAR(always_export_symbols, $1)=no\n        _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes\n\n        if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then\n          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n          # If the export-symbols file already is a .def file (1st line\n          # is EXPORTS), use it as is; otherwise, prepend...\n          _LT_TAGVAR(archive_expsym_cmds, $1)='if test \"x`$SED 1q $export_symbols`\" = xEXPORTS; then\n\t    cp $export_symbols $output_objdir/$soname.def;\n          else\n\t    echo EXPORTS > $output_objdir/$soname.def;\n\t    cat $export_symbols >> $output_objdir/$soname.def;\n          fi~\n          $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n        else\n          _LT_TAGVAR(ld_shlibs, $1)=no\n        fi\n        ;;\n      darwin* | rhapsody*)\n        _LT_DARWIN_LINKER_FEATURES($1)\n\t;;\n\n      dgux*)\n        case $cc_basename in\n          ec++*)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          ghcx*)\n\t    # Green Hills C++ Compiler\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          *)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n        esac\n        ;;\n\n      freebsd[[12]]*)\n        # C++ shared libraries reported to be fairly broken before\n\t# switch to ELF\n        _LT_TAGVAR(ld_shlibs, $1)=no\n        ;;\n\n      freebsd-elf*)\n        _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n        ;;\n\n      freebsd* | dragonfly*)\n        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF\n        # conventions\n        _LT_TAGVAR(ld_shlibs, $1)=yes\n        ;;\n\n      gnu*)\n        ;;\n\n      hpux9*)\n        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'\n        _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n        _LT_TAGVAR(hardcode_direct, $1)=yes\n        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,\n\t\t\t\t             # but as the default\n\t\t\t\t             # location of the library.\n\n        case $cc_basename in\n          CC*)\n            # FIXME: insert proper C++ library support\n            _LT_TAGVAR(ld_shlibs, $1)=no\n            ;;\n          aCC*)\n            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'\n            # Commands to make compiler produce verbose output that lists\n            # what \"hidden\" libraries, object files and flags are used when\n            # linking a shared library.\n            #\n            # There doesn't appear to be a way to prevent this compiler from\n            # explicitly linking system object files so we need to strip them\n            # from the output so that they don't get included in the library\n            # dependencies.\n            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP \"\\-L\"`; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; $ECHO \"X$list\" | $Xsed'\n            ;;\n          *)\n            if test \"$GXX\" = yes; then\n              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'\n            else\n              # FIXME: insert proper C++ library support\n              _LT_TAGVAR(ld_shlibs, $1)=no\n            fi\n            ;;\n        esac\n        ;;\n\n      hpux10*|hpux11*)\n        if test $with_gnu_ld = no; then\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'\n\t  _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n          case $host_cpu in\n            hppa*64*|ia64*)\n              ;;\n            *)\n\t      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n              ;;\n          esac\n        fi\n        case $host_cpu in\n          hppa*64*|ia64*)\n            _LT_TAGVAR(hardcode_direct, $1)=no\n            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n            ;;\n          *)\n            _LT_TAGVAR(hardcode_direct, $1)=yes\n            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,\n\t\t\t\t\t         # but as the default\n\t\t\t\t\t         # location of the library.\n            ;;\n        esac\n\n        case $cc_basename in\n          CC*)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          aCC*)\n\t    case $host_cpu in\n\t      hppa*64*)\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t        ;;\n\t      ia64*)\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t        ;;\n\t      *)\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t        ;;\n\t    esac\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP \"\\-L\"`; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; $ECHO \"X$list\" | $Xsed'\n\t    ;;\n          *)\n\t    if test \"$GXX\" = yes; then\n\t      if test $with_gnu_ld = no; then\n\t        case $host_cpu in\n\t          hppa*64*)\n\t            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t            ;;\n\t          ia64*)\n\t            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t            ;;\n\t          *)\n\t            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t            ;;\n\t        esac\n\t      fi\n\t    else\n\t      # FIXME: insert proper C++ library support\n\t      _LT_TAGVAR(ld_shlibs, $1)=no\n\t    fi\n\t    ;;\n        esac\n        ;;\n\n      interix[[3-9]]*)\n\t_LT_TAGVAR(hardcode_direct, $1)=no\n\t_LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n\t# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.\n\t# Instead, shared libraries are loaded at an image base (0x10000000 by\n\t# default) and relocated if they conflict, which is a slow very memory\n\t# consuming and fragmenting process.  To avoid this, we pick a random,\n\t# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link\n\t# time.  Moving up from 0x10000000 also allows more sbrk(2) space.\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='sed \"s,^,_,\" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n\t;;\n      irix5* | irix6*)\n        case $cc_basename in\n          CC*)\n\t    # SGI C++\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n \"$verstring\" && $ECHO \"X-set_version $verstring\" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'\n\n\t    # Archives containing C++ object files must be created using\n\t    # \"CC -ar\", where \"CC\" is the IRIX C++ compiler.  This is\n\t    # necessary to make sure instantiated templates are included\n\t    # in the archive.\n\t    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'\n\t    ;;\n          *)\n\t    if test \"$GXX\" = yes; then\n\t      if test \"$with_gnu_ld\" = no; then\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && $ECHO \"X${wl}-set_version ${wl}$verstring\" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t      else\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && $ECHO \"X${wl}-set_version ${wl}$verstring\" | $Xsed` -o $lib'\n\t      fi\n\t    fi\n\t    _LT_TAGVAR(link_all_deplibs, $1)=yes\n\t    ;;\n        esac\n        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n        _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n        _LT_TAGVAR(inherit_rpath, $1)=yes\n        ;;\n\n      linux* | k*bsd*-gnu | kopensolaris*-gnu)\n        case $cc_basename in\n          KCC*)\n\t    # Kuck and Associates, Inc. (KAI) C++ Compiler\n\n\t    # KCC will only create a shared library if the output file\n\t    # ends with \".so\" (or \".sl\" for HP-UX), so rename the library\n\t    # to its proper name (with version) after linking.\n\t    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\\''s/\\([[^()0-9A-Za-z{}]]\\)/\\\\\\\\\\1/g'\\''`; templib=`echo $lib | $SED -e \"s/\\${tempext}\\..*/.so/\"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \\$templib; mv \\$templib $lib'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\\''s/\\([[^()0-9A-Za-z{}]]\\)/\\\\\\\\\\1/g'\\''`; templib=`echo $lib | $SED -e \"s/\\${tempext}\\..*/.so/\"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \\$templib ${wl}-retain-symbols-file,$export_symbols; mv \\$templib $lib'\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP \"ld\"`; rm -f libconftest$shared_ext; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; $ECHO \"X$list\" | $Xsed'\n\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'\n\n\t    # Archives containing C++ object files must be created using\n\t    # \"CC -Bstatic\", where \"CC\" is the KAI C++ compiler.\n\t    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'\n\t    ;;\n\t  icpc* | ecpc* )\n\t    # Intel C++\n\t    with_gnu_ld=yes\n\t    # version 8.0 and above of icpc choke on multiply defined symbols\n\t    # if we add $predep_objects and $postdep_objects, however 7.1 and\n\t    # earlier do not add the objects themselves.\n\t    case `$CC -V 2>&1` in\n\t      *\"Version 7.\"*)\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n\t\t;;\n\t      *)  # Version 8.0 or newer\n\t        tmp_idyn=\n\t        case $host_cpu in\n\t\t  ia64*) tmp_idyn=' -i_dynamic';;\n\t\tesac\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'\"$tmp_idyn\"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'\"$tmp_idyn\"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n\t\t;;\n\t    esac\n\t    _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'\n\t    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'\n\t    ;;\n          pgCC* | pgcpp*)\n            # Portland Group C++ compiler\n\t    case `$CC -V` in\n\t    *pgCC\\ [[1-5]]* | *pgcpp\\ [[1-5]]*)\n\t      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~\n\t\trm -rf $tpldir~\n\t\t$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~\n\t\tcompile_command=\"$compile_command `find $tpldir -name \\*.o | $NL2SP`\"'\n\t      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~\n\t\trm -rf $tpldir~\n\t\t$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~\n\t\t$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \\*.o | $NL2SP`~\n\t\t$RANLIB $oldlib'\n\t      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~\n\t\trm -rf $tpldir~\n\t\t$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~\n\t\t$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \\*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'\n\t      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~\n\t\trm -rf $tpldir~\n\t\t$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~\n\t\t$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \\*.o | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'\n\t      ;;\n\t    *) # Version 6 will use weak symbols\n\t      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'\n\t      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'\n\t      ;;\n\t    esac\n\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'\n\t    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'\n\t    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; $ECHO \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n            ;;\n\t  cxx*)\n\t    # Compaq C++\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'\n\n\t    runpath_var=LD_RUN_PATH\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'\n\t    _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP \"ld\"`; templist=`$ECHO \"X$templist\" | $Xsed -e \"s/\\(^.*ld.*\\)\\( .*ld .*$\\)/\\1/\"`; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; $ECHO \"X$list\" | $Xsed'\n\t    ;;\n\t  xl*)\n\t    # IBM XL 8.0 on PPC, with GNU ld\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n\t    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t    if test \"x$supports_anon_versioning\" = xyes; then\n\t      _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $output_objdir/$libname.ver~\n\t\tcat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $output_objdir/$libname.ver~\n\t\techo \"local: *; };\" >> $output_objdir/$libname.ver~\n\t\t$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'\n\t    fi\n\t    ;;\n\t  *)\n\t    case `$CC -V 2>&1 | sed 5q` in\n\t    *Sun\\ C*)\n\t      # Sun C++ 5.9\n\t      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'\n\t      _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'\n\t      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n\t      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\\\"\\\"; do test -z \\\"$conv\\\" || new_convenience=\\\"$new_convenience,$conv\\\"; done; $ECHO \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t      _LT_TAGVAR(compiler_needs_object, $1)=yes\n\n\t      # Not sure whether something based on\n\t      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1\n\t      # would be better.\n\t      output_verbose_link_cmd='echo'\n\n\t      # Archives containing C++ object files must be created using\n\t      # \"CC -xar\", where \"CC\" is the Sun C++ compiler.  This is\n\t      # necessary to make sure instantiated templates are included\n\t      # in the archive.\n\t      _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'\n\t      ;;\n\t    esac\n\t    ;;\n\tesac\n\t;;\n\n      lynxos*)\n        # FIXME: insert proper C++ library support\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n\t;;\n\n      m88k*)\n        # FIXME: insert proper C++ library support\n        _LT_TAGVAR(ld_shlibs, $1)=no\n\t;;\n\n      mvs*)\n        case $cc_basename in\n          cxx*)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n\t  *)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n\tesac\n\t;;\n\n      netbsd*)\n        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'\n\t  wlarc=\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n\t  _LT_TAGVAR(hardcode_direct, $1)=yes\n\t  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\tfi\n\t# Workaround some broken pre-1.5 toolchains\n\toutput_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e \"s:-lgcc -lc -lgcc::\"'\n\t;;\n\n      *nto* | *qnx*)\n        _LT_TAGVAR(ld_shlibs, $1)=yes\n\t;;\n\n      openbsd2*)\n        # C++ shared libraries are fairly broken\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n\t;;\n\n      openbsd*)\n\tif test -f /usr/libexec/ld.so; then\n\t  _LT_TAGVAR(hardcode_direct, $1)=yes\n\t  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t  if test -z \"`echo __ELF__ | $CC -E - | grep __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'\n\t    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n\t    _LT_TAGVAR(whole_archive_flag_spec, $1)=\"$wlarc\"'--whole-archive$convenience '\"$wlarc\"'--no-whole-archive'\n\t  fi\n\t  output_verbose_link_cmd=echo\n\telse\n\t  _LT_TAGVAR(ld_shlibs, $1)=no\n\tfi\n\t;;\n\n      osf3* | osf4* | osf5*)\n        case $cc_basename in\n          KCC*)\n\t    # Kuck and Associates, Inc. (KAI) C++ Compiler\n\n\t    # KCC will only create a shared library if the output file\n\t    # ends with \".so\" (or \".sl\" for HP-UX), so rename the library\n\t    # to its proper name (with version) after linking.\n\t    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\\''s/\\([[^()0-9A-Za-z{}]]\\)/\\\\\\\\\\1/g'\\''`; templib=`echo \"$lib\" | $SED -e \"s/\\${tempext}\\..*/.so/\"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \\$templib; mv \\$templib $lib'\n\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t    _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n\t    # Archives containing C++ object files must be created using\n\t    # the KAI C++ compiler.\n\t    case $host in\n\t      osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;\n\t      *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;\n\t    esac\n\t    ;;\n          RCC*)\n\t    # Rational C++ 2.4.1\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          cxx*)\n\t    case $host in\n\t      osf3*)\n\t        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\\*'\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n \"$verstring\" && $ECHO \"X${wl}-set_version $verstring\" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'\n\t        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n\t\t;;\n\t      *)\n\t        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \\*'\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n \"$verstring\" && $ECHO \"X-set_version $verstring\" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib'\n\t        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf \"%s %s\\\\n\" -exported_symbol \"\\$i\" >> $lib.exp; done~\n\t          echo \"-hidden\">> $lib.exp~\n\t          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n \"$verstring\" && $ECHO \"X-set_version $verstring\" | $Xsed` -update_registry ${output_objdir}/so_locations -o $lib~\n\t          $RM $lib.exp'\n\t        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'\n\t\t;;\n\t    esac\n\n\t    _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP \"ld\" | $GREP -v \"ld:\"`; templist=`$ECHO \"X$templist\" | $Xsed -e \"s/\\(^.*ld.*\\)\\( .*ld.*$\\)/\\1/\"`; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; $ECHO \"X$list\" | $Xsed'\n\t    ;;\n\t  *)\n\t    if test \"$GXX\" = yes && test \"$with_gnu_ld\" = no; then\n\t      _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\\*'\n\t      case $host in\n\t        osf3*)\n\t          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && $ECHO \"X${wl}-set_version ${wl}$verstring\" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t\t  ;;\n\t        *)\n\t          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n \"$verstring\" && $ECHO \"${wl}-set_version ${wl}$verstring\" | $Xsed` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t\t  ;;\n\t      esac\n\n\t      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n\t      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n\t      # Commands to make compiler produce verbose output that lists\n\t      # what \"hidden\" libraries, object files and flags are used when\n\t      # linking a shared library.\n\t      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP \"\\-L\"'\n\n\t    else\n\t      # FIXME: insert proper C++ library support\n\t      _LT_TAGVAR(ld_shlibs, $1)=no\n\t    fi\n\t    ;;\n        esac\n        ;;\n\n      psos*)\n        # FIXME: insert proper C++ library support\n        _LT_TAGVAR(ld_shlibs, $1)=no\n        ;;\n\n      sunos4*)\n        case $cc_basename in\n          CC*)\n\t    # Sun C++ 4.x\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          lcc*)\n\t    # Lucid\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          *)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n        esac\n        ;;\n\n      solaris*)\n        case $cc_basename in\n          CC*)\n\t    # Sun C++ 4.2, 5.x and Centerline C++\n            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes\n\t    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'\n\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n\t    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t    case $host_os in\n\t      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;\n\t      *)\n\t\t# The compiler driver will combine and reorder linker options,\n\t\t# but understands `-z linker_flag'.\n\t        # Supported since Solaris 2.6 (maybe 2.5.1?)\n\t\t_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'\n\t        ;;\n\t    esac\n\t    _LT_TAGVAR(link_all_deplibs, $1)=yes\n\n\t    output_verbose_link_cmd='echo'\n\n\t    # Archives containing C++ object files must be created using\n\t    # \"CC -xar\", where \"CC\" is the Sun C++ compiler.  This is\n\t    # necessary to make sure instantiated templates are included\n\t    # in the archive.\n\t    _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'\n\t    ;;\n          gcx*)\n\t    # Green Hills C++ Compiler\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'\n\n\t    # The C++ compiler must be used to create the archive.\n\t    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'\n\t    ;;\n          *)\n\t    # GNU C++ compiler with Solaris linker\n\t    if test \"$GXX\" = yes && test \"$with_gnu_ld\" = no; then\n\t      _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'\n\t      if $CC --version | $GREP -v '^2\\.7' > /dev/null; then\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'\n\t        _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t\t  $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'\n\n\t        # Commands to make compiler produce verbose output that lists\n\t        # what \"hidden\" libraries, object files and flags are used when\n\t        # linking a shared library.\n\t        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP \"\\-L\"'\n\t      else\n\t        # g++ 2.7 appears to require `-G' NOT `-shared' on this\n\t        # platform.\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'\n\t        _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t\t  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'\n\n\t        # Commands to make compiler produce verbose output that lists\n\t        # what \"hidden\" libraries, object files and flags are used when\n\t        # linking a shared library.\n\t        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP \"\\-L\"'\n\t      fi\n\n\t      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'\n\t      case $host_os in\n\t\tsolaris2.[[0-5]] | solaris2.[[0-5]].*) ;;\n\t\t*)\n\t\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'\n\t\t  ;;\n\t      esac\n\t    fi\n\t    ;;\n        esac\n        ;;\n\n    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)\n      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'\n      _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      runpath_var='LD_RUN_PATH'\n\n      case $cc_basename in\n        CC*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\t*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n      esac\n      ;;\n\n      sysv5* | sco3.2v5* | sco5v6*)\n\t# Note: We can NOT use -z defs as we might desire, because we do not\n\t# link with -lc, and that would cause any symbols used from libc to\n\t# always be unresolved, which means just about no library would\n\t# ever link correctly.  If we're not using GNU ld we use -z text\n\t# though, which does catch some bad symbols but isn't as heavy-handed\n\t# as -z defs.\n\t_LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'\n\t_LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'\n\t_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n\t_LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'\n\t_LT_TAGVAR(hardcode_libdir_separator, $1)=':'\n\t_LT_TAGVAR(link_all_deplibs, $1)=yes\n\t_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'\n\trunpath_var='LD_RUN_PATH'\n\n\tcase $cc_basename in\n          CC*)\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    ;;\n\t  *)\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    ;;\n\tesac\n      ;;\n\n      tandem*)\n        case $cc_basename in\n          NCC*)\n\t    # NonStop-UX NCC 3.20\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          *)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n        esac\n        ;;\n\n      vxworks*)\n        # FIXME: insert proper C++ library support\n        _LT_TAGVAR(ld_shlibs, $1)=no\n        ;;\n\n      *)\n        # FIXME: insert proper C++ library support\n        _LT_TAGVAR(ld_shlibs, $1)=no\n        ;;\n    esac\n\n    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])\n    test \"$_LT_TAGVAR(ld_shlibs, $1)\" = no && can_build_shared=no\n\n    _LT_TAGVAR(GCC, $1)=\"$GXX\"\n    _LT_TAGVAR(LD, $1)=\"$LD\"\n\n    ## CAVEAT EMPTOR:\n    ## There is no encapsulation within the following macros, do not change\n    ## the running order or otherwise move them around unless you know exactly\n    ## what you are doing...\n    _LT_SYS_HIDDEN_LIBDEPS($1)\n    _LT_COMPILER_PIC($1)\n    _LT_COMPILER_C_O($1)\n    _LT_COMPILER_FILE_LOCKS($1)\n    _LT_LINKER_SHLIBS($1)\n    _LT_SYS_DYNAMIC_LINKER($1)\n    _LT_LINKER_HARDCODE_LIBPATH($1)\n\n    _LT_CONFIG($1)\n  fi # test -n \"$compiler\"\n\n  CC=$lt_save_CC\n  LDCXX=$LD\n  LD=$lt_save_LD\n  GCC=$lt_save_GCC\n  with_gnu_ld=$lt_save_with_gnu_ld\n  lt_cv_path_LDCXX=$lt_cv_path_LD\n  lt_cv_path_LD=$lt_save_path_LD\n  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld\n  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld\nfi # test \"$_lt_caught_CXX_error\" != yes\n\nAC_LANG_POP\n])# _LT_LANG_CXX_CONFIG\n\n\n# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])\n# ---------------------------------\n# Figure out \"hidden\" library dependencies from verbose\n# compiler output when linking a shared library.\n# Parse the compiler output and extract the necessary\n# objects, libraries and library flags.\nm4_defun([_LT_SYS_HIDDEN_LIBDEPS],\n[m4_require([_LT_FILEUTILS_DEFAULTS])dnl\n# Dependencies to place before and after the object being linked:\n_LT_TAGVAR(predep_objects, $1)=\n_LT_TAGVAR(postdep_objects, $1)=\n_LT_TAGVAR(predeps, $1)=\n_LT_TAGVAR(postdeps, $1)=\n_LT_TAGVAR(compiler_lib_search_path, $1)=\n\ndnl we can't use the lt_simple_compile_test_code here,\ndnl because it contains code intended for an executable,\ndnl not a library.  It's possible we should let each\ndnl tag define a new lt_????_link_test_code variable,\ndnl but it's only used here...\nm4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF\nint a;\nvoid foo (void) { a = 0; }\n_LT_EOF\n], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF\nclass Foo\n{\npublic:\n  Foo (void) { a = 0; }\nprivate:\n  int a;\n};\n_LT_EOF\n], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF\n      subroutine foo\n      implicit none\n      integer*4 a\n      a=0\n      return\n      end\n_LT_EOF\n], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF\n      subroutine foo\n      implicit none\n      integer a\n      a=0\n      return\n      end\n_LT_EOF\n], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF\npublic class foo {\n  private int a;\n  public void bar (void) {\n    a = 0;\n  }\n};\n_LT_EOF\n])\ndnl Parse the compiler output and extract the necessary\ndnl objects, libraries and library flags.\nif AC_TRY_EVAL(ac_compile); then\n  # Parse the compiler output and extract the necessary\n  # objects, libraries and library flags.\n\n  # Sentinel used to keep track of whether or not we are before\n  # the conftest object file.\n  pre_test_object_deps_done=no\n\n  for p in `eval \"$output_verbose_link_cmd\"`; do\n    case $p in\n\n    -L* | -R* | -l*)\n       # Some compilers place space between \"-{L,R}\" and the path.\n       # Remove the space.\n       if test $p = \"-L\" ||\n          test $p = \"-R\"; then\n\t prev=$p\n\t continue\n       else\n\t prev=\n       fi\n\n       if test \"$pre_test_object_deps_done\" = no; then\n\t case $p in\n\t -L* | -R*)\n\t   # Internal compiler library paths should come after those\n\t   # provided the user.  The postdeps already come after the\n\t   # user supplied libs so there is no need to process them.\n\t   if test -z \"$_LT_TAGVAR(compiler_lib_search_path, $1)\"; then\n\t     _LT_TAGVAR(compiler_lib_search_path, $1)=\"${prev}${p}\"\n\t   else\n\t     _LT_TAGVAR(compiler_lib_search_path, $1)=\"${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}\"\n\t   fi\n\t   ;;\n\t # The \"-l\" case would never come before the object being\n\t # linked, so don't bother handling this case.\n\t esac\n       else\n\t if test -z \"$_LT_TAGVAR(postdeps, $1)\"; then\n\t   _LT_TAGVAR(postdeps, $1)=\"${prev}${p}\"\n\t else\n\t   _LT_TAGVAR(postdeps, $1)=\"${_LT_TAGVAR(postdeps, $1)} ${prev}${p}\"\n\t fi\n       fi\n       ;;\n\n    *.$objext)\n       # This assumes that the test object file only shows up\n       # once in the compiler output.\n       if test \"$p\" = \"conftest.$objext\"; then\n\t pre_test_object_deps_done=yes\n\t continue\n       fi\n\n       if test \"$pre_test_object_deps_done\" = no; then\n\t if test -z \"$_LT_TAGVAR(predep_objects, $1)\"; then\n\t   _LT_TAGVAR(predep_objects, $1)=\"$p\"\n\t else\n\t   _LT_TAGVAR(predep_objects, $1)=\"$_LT_TAGVAR(predep_objects, $1) $p\"\n\t fi\n       else\n\t if test -z \"$_LT_TAGVAR(postdep_objects, $1)\"; then\n\t   _LT_TAGVAR(postdep_objects, $1)=\"$p\"\n\t else\n\t   _LT_TAGVAR(postdep_objects, $1)=\"$_LT_TAGVAR(postdep_objects, $1) $p\"\n\t fi\n       fi\n       ;;\n\n    *) ;; # Ignore the rest.\n\n    esac\n  done\n\n  # Clean up.\n  rm -f a.out a.exe\nelse\n  echo \"libtool.m4: error: problem compiling $1 test program\"\nfi\n\n$RM -f confest.$objext\n\n# PORTME: override above test on systems where it is broken\nm4_if([$1], [CXX],\n[case $host_os in\ninterix[[3-9]]*)\n  # Interix 3.5 installs completely hosed .la files for C++, so rather than\n  # hack all around it, let's just trust \"g++\" to DTRT.\n  _LT_TAGVAR(predep_objects,$1)=\n  _LT_TAGVAR(postdep_objects,$1)=\n  _LT_TAGVAR(postdeps,$1)=\n  ;;\n\nlinux*)\n  case `$CC -V 2>&1 | sed 5q` in\n  *Sun\\ C*)\n    # Sun C++ 5.9\n\n    # The more standards-conforming stlport4 library is\n    # incompatible with the Cstd library. Avoid specifying\n    # it if it's in CXXFLAGS. Ignore libCrun as\n    # -library=stlport4 depends on it.\n    case \" $CXX $CXXFLAGS \" in\n    *\" -library=stlport4 \"*)\n      solaris_use_stlport4=yes\n      ;;\n    esac\n\n    if test \"$solaris_use_stlport4\" != yes; then\n      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'\n    fi\n    ;;\n  esac\n  ;;\n\nsolaris*)\n  case $cc_basename in\n  CC*)\n    # The more standards-conforming stlport4 library is\n    # incompatible with the Cstd library. Avoid specifying\n    # it if it's in CXXFLAGS. Ignore libCrun as\n    # -library=stlport4 depends on it.\n    case \" $CXX $CXXFLAGS \" in\n    *\" -library=stlport4 \"*)\n      solaris_use_stlport4=yes\n      ;;\n    esac\n\n    # Adding this requires a known-good setup of shared libraries for\n    # Sun compiler versions before 5.6, else PIC objects from an old\n    # archive will be linked into the output, leading to subtle bugs.\n    if test \"$solaris_use_stlport4\" != yes; then\n      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'\n    fi\n    ;;\n  esac\n  ;;\nesac\n])\n\ncase \" $_LT_TAGVAR(postdeps, $1) \" in\n*\" -lc \"*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;\nesac\n _LT_TAGVAR(compiler_lib_search_dirs, $1)=\nif test -n \"${_LT_TAGVAR(compiler_lib_search_path, $1)}\"; then\n _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo \" ${_LT_TAGVAR(compiler_lib_search_path, $1)}\" | ${SED} -e 's! -L! !g' -e 's!^ !!'`\nfi\n_LT_TAGDECL([], [compiler_lib_search_dirs], [1],\n    [The directories searched by this compiler when creating a shared library])\n_LT_TAGDECL([], [predep_objects], [1],\n    [Dependencies to place before and after the objects being linked to\n    create a shared library])\n_LT_TAGDECL([], [postdep_objects], [1])\n_LT_TAGDECL([], [predeps], [1])\n_LT_TAGDECL([], [postdeps], [1])\n_LT_TAGDECL([], [compiler_lib_search_path], [1],\n    [The library search path used internally by the compiler when linking\n    a shared library])\n])# _LT_SYS_HIDDEN_LIBDEPS\n\n\n# _LT_PROG_F77\n# ------------\n# Since AC_PROG_F77 is broken, in that it returns the empty string\n# if there is no fortran compiler, we have our own version here.\nm4_defun([_LT_PROG_F77],\n[\npushdef([AC_MSG_ERROR], [_lt_disable_F77=yes])\nAC_PROG_F77\nif test -z \"$F77\" || test \"X$F77\" = \"Xno\"; then\n  _lt_disable_F77=yes\nfi\npopdef([AC_MSG_ERROR])\n])# _LT_PROG_F77\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([_LT_PROG_F77], [])\n\n\n# _LT_LANG_F77_CONFIG([TAG])\n# --------------------------\n# Ensure that the configuration variables for a Fortran 77 compiler are\n# suitably defined.  These variables are subsequently used by _LT_CONFIG\n# to write the compiler configuration to `libtool'.\nm4_defun([_LT_LANG_F77_CONFIG],\n[AC_REQUIRE([_LT_PROG_F77])dnl\nAC_LANG_PUSH(Fortran 77)\n\n_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n_LT_TAGVAR(allow_undefined_flag, $1)=\n_LT_TAGVAR(always_export_symbols, $1)=no\n_LT_TAGVAR(archive_expsym_cmds, $1)=\n_LT_TAGVAR(export_dynamic_flag_spec, $1)=\n_LT_TAGVAR(hardcode_direct, $1)=no\n_LT_TAGVAR(hardcode_direct_absolute, $1)=no\n_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=\n_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=\n_LT_TAGVAR(hardcode_libdir_separator, $1)=\n_LT_TAGVAR(hardcode_minus_L, $1)=no\n_LT_TAGVAR(hardcode_automatic, $1)=no\n_LT_TAGVAR(inherit_rpath, $1)=no\n_LT_TAGVAR(module_cmds, $1)=\n_LT_TAGVAR(module_expsym_cmds, $1)=\n_LT_TAGVAR(link_all_deplibs, $1)=unknown\n_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds\n_LT_TAGVAR(no_undefined_flag, $1)=\n_LT_TAGVAR(whole_archive_flag_spec, $1)=\n_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no\n\n# Source file extension for f77 test sources.\nac_ext=f\n\n# Object file extension for compiled f77 test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# No sense in running all these tests if we already determined that\n# the F77 compiler isn't working.  Some variables (like enable_shared)\n# are currently assumed to apply to all compilers on this platform,\n# and will be corrupted by setting them based on a non-working compiler.\nif test \"$_lt_disable_F77\" != yes; then\n  # Code to be used in simple compile tests\n  lt_simple_compile_test_code=\"\\\n      subroutine t\n      return\n      end\n\"\n\n  # Code to be used in simple link tests\n  lt_simple_link_test_code=\"\\\n      program t\n      end\n\"\n\n  # ltmain only uses $CC for tagged configurations so make sure $CC is set.\n  _LT_TAG_COMPILER\n\n  # save warnings/boilerplate of simple test code\n  _LT_COMPILER_BOILERPLATE\n  _LT_LINKER_BOILERPLATE\n\n  # Allow CC to be a program name with arguments.\n  lt_save_CC=\"$CC\"\n  lt_save_GCC=$GCC\n  CC=${F77-\"f77\"}\n  compiler=$CC\n  _LT_TAGVAR(compiler, $1)=$CC\n  _LT_CC_BASENAME([$compiler])\n  GCC=$G77\n  if test -n \"$compiler\"; then\n    AC_MSG_CHECKING([if libtool supports shared libraries])\n    AC_MSG_RESULT([$can_build_shared])\n\n    AC_MSG_CHECKING([whether to build shared libraries])\n    test \"$can_build_shared\" = \"no\" && enable_shared=no\n\n    # On AIX, shared libraries and static libraries use the same namespace, and\n    # are all built from PIC.\n    case $host_os in\n      aix3*)\n        test \"$enable_shared\" = yes && enable_static=no\n        if test -n \"$RANLIB\"; then\n          archive_cmds=\"$archive_cmds~\\$RANLIB \\$lib\"\n          postinstall_cmds='$RANLIB $lib'\n        fi\n        ;;\n      aix[[4-9]]*)\n\tif test \"$host_cpu\" != ia64 && test \"$aix_use_runtimelinking\" = no ; then\n\t  test \"$enable_shared\" = yes && enable_static=no\n\tfi\n        ;;\n    esac\n    AC_MSG_RESULT([$enable_shared])\n\n    AC_MSG_CHECKING([whether to build static libraries])\n    # Make sure either enable_shared or enable_static is yes.\n    test \"$enable_shared\" = yes || enable_static=yes\n    AC_MSG_RESULT([$enable_static])\n\n    _LT_TAGVAR(GCC, $1)=\"$G77\"\n    _LT_TAGVAR(LD, $1)=\"$LD\"\n\n    ## CAVEAT EMPTOR:\n    ## There is no encapsulation within the following macros, do not change\n    ## the running order or otherwise move them around unless you know exactly\n    ## what you are doing...\n    _LT_COMPILER_PIC($1)\n    _LT_COMPILER_C_O($1)\n    _LT_COMPILER_FILE_LOCKS($1)\n    _LT_LINKER_SHLIBS($1)\n    _LT_SYS_DYNAMIC_LINKER($1)\n    _LT_LINKER_HARDCODE_LIBPATH($1)\n\n    _LT_CONFIG($1)\n  fi # test -n \"$compiler\"\n\n  GCC=$lt_save_GCC\n  CC=\"$lt_save_CC\"\nfi # test \"$_lt_disable_F77\" != yes\n\nAC_LANG_POP\n])# _LT_LANG_F77_CONFIG\n\n\n# _LT_PROG_FC\n# -----------\n# Since AC_PROG_FC is broken, in that it returns the empty string\n# if there is no fortran compiler, we have our own version here.\nm4_defun([_LT_PROG_FC],\n[\npushdef([AC_MSG_ERROR], [_lt_disable_FC=yes])\nAC_PROG_FC\nif test -z \"$FC\" || test \"X$FC\" = \"Xno\"; then\n  _lt_disable_FC=yes\nfi\npopdef([AC_MSG_ERROR])\n])# _LT_PROG_FC\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([_LT_PROG_FC], [])\n\n\n# _LT_LANG_FC_CONFIG([TAG])\n# -------------------------\n# Ensure that the configuration variables for a Fortran compiler are\n# suitably defined.  These variables are subsequently used by _LT_CONFIG\n# to write the compiler configuration to `libtool'.\nm4_defun([_LT_LANG_FC_CONFIG],\n[AC_REQUIRE([_LT_PROG_FC])dnl\nAC_LANG_PUSH(Fortran)\n\n_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n_LT_TAGVAR(allow_undefined_flag, $1)=\n_LT_TAGVAR(always_export_symbols, $1)=no\n_LT_TAGVAR(archive_expsym_cmds, $1)=\n_LT_TAGVAR(export_dynamic_flag_spec, $1)=\n_LT_TAGVAR(hardcode_direct, $1)=no\n_LT_TAGVAR(hardcode_direct_absolute, $1)=no\n_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=\n_LT_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=\n_LT_TAGVAR(hardcode_libdir_separator, $1)=\n_LT_TAGVAR(hardcode_minus_L, $1)=no\n_LT_TAGVAR(hardcode_automatic, $1)=no\n_LT_TAGVAR(inherit_rpath, $1)=no\n_LT_TAGVAR(module_cmds, $1)=\n_LT_TAGVAR(module_expsym_cmds, $1)=\n_LT_TAGVAR(link_all_deplibs, $1)=unknown\n_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds\n_LT_TAGVAR(no_undefined_flag, $1)=\n_LT_TAGVAR(whole_archive_flag_spec, $1)=\n_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no\n\n# Source file extension for fc test sources.\nac_ext=${ac_fc_srcext-f}\n\n# Object file extension for compiled fc test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# No sense in running all these tests if we already determined that\n# the FC compiler isn't working.  Some variables (like enable_shared)\n# are currently assumed to apply to all compilers on this platform,\n# and will be corrupted by setting them based on a non-working compiler.\nif test \"$_lt_disable_FC\" != yes; then\n  # Code to be used in simple compile tests\n  lt_simple_compile_test_code=\"\\\n      subroutine t\n      return\n      end\n\"\n\n  # Code to be used in simple link tests\n  lt_simple_link_test_code=\"\\\n      program t\n      end\n\"\n\n  # ltmain only uses $CC for tagged configurations so make sure $CC is set.\n  _LT_TAG_COMPILER\n\n  # save warnings/boilerplate of simple test code\n  _LT_COMPILER_BOILERPLATE\n  _LT_LINKER_BOILERPLATE\n\n  # Allow CC to be a program name with arguments.\n  lt_save_CC=\"$CC\"\n  lt_save_GCC=$GCC\n  CC=${FC-\"f95\"}\n  compiler=$CC\n  GCC=$ac_cv_fc_compiler_gnu\n\n  _LT_TAGVAR(compiler, $1)=$CC\n  _LT_CC_BASENAME([$compiler])\n\n  if test -n \"$compiler\"; then\n    AC_MSG_CHECKING([if libtool supports shared libraries])\n    AC_MSG_RESULT([$can_build_shared])\n\n    AC_MSG_CHECKING([whether to build shared libraries])\n    test \"$can_build_shared\" = \"no\" && enable_shared=no\n\n    # On AIX, shared libraries and static libraries use the same namespace, and\n    # are all built from PIC.\n    case $host_os in\n      aix3*)\n        test \"$enable_shared\" = yes && enable_static=no\n        if test -n \"$RANLIB\"; then\n          archive_cmds=\"$archive_cmds~\\$RANLIB \\$lib\"\n          postinstall_cmds='$RANLIB $lib'\n        fi\n        ;;\n      aix[[4-9]]*)\n\tif test \"$host_cpu\" != ia64 && test \"$aix_use_runtimelinking\" = no ; then\n\t  test \"$enable_shared\" = yes && enable_static=no\n\tfi\n        ;;\n    esac\n    AC_MSG_RESULT([$enable_shared])\n\n    AC_MSG_CHECKING([whether to build static libraries])\n    # Make sure either enable_shared or enable_static is yes.\n    test \"$enable_shared\" = yes || enable_static=yes\n    AC_MSG_RESULT([$enable_static])\n\n    _LT_TAGVAR(GCC, $1)=\"$ac_cv_fc_compiler_gnu\"\n    _LT_TAGVAR(LD, $1)=\"$LD\"\n\n    ## CAVEAT EMPTOR:\n    ## There is no encapsulation within the following macros, do not change\n    ## the running order or otherwise move them around unless you know exactly\n    ## what you are doing...\n    _LT_SYS_HIDDEN_LIBDEPS($1)\n    _LT_COMPILER_PIC($1)\n    _LT_COMPILER_C_O($1)\n    _LT_COMPILER_FILE_LOCKS($1)\n    _LT_LINKER_SHLIBS($1)\n    _LT_SYS_DYNAMIC_LINKER($1)\n    _LT_LINKER_HARDCODE_LIBPATH($1)\n\n    _LT_CONFIG($1)\n  fi # test -n \"$compiler\"\n\n  GCC=$lt_save_GCC\n  CC=\"$lt_save_CC\"\nfi # test \"$_lt_disable_FC\" != yes\n\nAC_LANG_POP\n])# _LT_LANG_FC_CONFIG\n\n\n# _LT_LANG_GCJ_CONFIG([TAG])\n# --------------------------\n# Ensure that the configuration variables for the GNU Java Compiler compiler\n# are suitably defined.  These variables are subsequently used by _LT_CONFIG\n# to write the compiler configuration to `libtool'.\nm4_defun([_LT_LANG_GCJ_CONFIG],\n[AC_REQUIRE([LT_PROG_GCJ])dnl\nAC_LANG_SAVE\n\n# Source file extension for Java test sources.\nac_ext=java\n\n# Object file extension for compiled Java test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# Code to be used in simple compile tests\nlt_simple_compile_test_code=\"class foo {}\"\n\n# Code to be used in simple link tests\nlt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'\n\n# ltmain only uses $CC for tagged configurations so make sure $CC is set.\n_LT_TAG_COMPILER\n\n# save warnings/boilerplate of simple test code\n_LT_COMPILER_BOILERPLATE\n_LT_LINKER_BOILERPLATE\n\n# Allow CC to be a program name with arguments.\nlt_save_CC=\"$CC\"\nlt_save_GCC=$GCC\nGCC=yes\nCC=${GCJ-\"gcj\"}\ncompiler=$CC\n_LT_TAGVAR(compiler, $1)=$CC\n_LT_TAGVAR(LD, $1)=\"$LD\"\n_LT_CC_BASENAME([$compiler])\n\n# GCJ did not exist at the time GCC didn't implicitly link libc in.\n_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n\n_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds\n\n## CAVEAT EMPTOR:\n## There is no encapsulation within the following macros, do not change\n## the running order or otherwise move them around unless you know exactly\n## what you are doing...\nif test -n \"$compiler\"; then\n  _LT_COMPILER_NO_RTTI($1)\n  _LT_COMPILER_PIC($1)\n  _LT_COMPILER_C_O($1)\n  _LT_COMPILER_FILE_LOCKS($1)\n  _LT_LINKER_SHLIBS($1)\n  _LT_LINKER_HARDCODE_LIBPATH($1)\n\n  _LT_CONFIG($1)\nfi\n\nAC_LANG_RESTORE\n\nGCC=$lt_save_GCC\nCC=\"$lt_save_CC\"\n])# _LT_LANG_GCJ_CONFIG\n\n\n# _LT_LANG_RC_CONFIG([TAG])\n# -------------------------\n# Ensure that the configuration variables for the Windows resource compiler\n# are suitably defined.  These variables are subsequently used by _LT_CONFIG\n# to write the compiler configuration to `libtool'.\nm4_defun([_LT_LANG_RC_CONFIG],\n[AC_REQUIRE([LT_PROG_RC])dnl\nAC_LANG_SAVE\n\n# Source file extension for RC test sources.\nac_ext=rc\n\n# Object file extension for compiled RC test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# Code to be used in simple compile tests\nlt_simple_compile_test_code='sample MENU { MENUITEM \"&Soup\", 100, CHECKED }'\n\n# Code to be used in simple link tests\nlt_simple_link_test_code=\"$lt_simple_compile_test_code\"\n\n# ltmain only uses $CC for tagged configurations so make sure $CC is set.\n_LT_TAG_COMPILER\n\n# save warnings/boilerplate of simple test code\n_LT_COMPILER_BOILERPLATE\n_LT_LINKER_BOILERPLATE\n\n# Allow CC to be a program name with arguments.\nlt_save_CC=\"$CC\"\nlt_save_GCC=$GCC\nGCC=\nCC=${RC-\"windres\"}\ncompiler=$CC\n_LT_TAGVAR(compiler, $1)=$CC\n_LT_CC_BASENAME([$compiler])\n_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes\n\nif test -n \"$compiler\"; then\n  :\n  _LT_CONFIG($1)\nfi\n\nGCC=$lt_save_GCC\nAC_LANG_RESTORE\nCC=\"$lt_save_CC\"\n])# _LT_LANG_RC_CONFIG\n\n\n# LT_PROG_GCJ\n# -----------\nAC_DEFUN([LT_PROG_GCJ],\n[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],\n  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],\n    [AC_CHECK_TOOL(GCJ, gcj,)\n      test \"x${GCJFLAGS+set}\" = xset || GCJFLAGS=\"-g -O2\"\n      AC_SUBST(GCJFLAGS)])])[]dnl\n])\n\n# Old name:\nAU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([LT_AC_PROG_GCJ], [])\n\n\n# LT_PROG_RC\n# ----------\nAC_DEFUN([LT_PROG_RC],\n[AC_CHECK_TOOL(RC, windres,)\n])\n\n# Old name:\nAU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([LT_AC_PROG_RC], [])\n\n\n# _LT_DECL_EGREP\n# --------------\n# If we don't have a new enough Autoconf to choose the best grep\n# available, choose the one first in the user's PATH.\nm4_defun([_LT_DECL_EGREP],\n[AC_REQUIRE([AC_PROG_EGREP])dnl\nAC_REQUIRE([AC_PROG_FGREP])dnl\ntest -z \"$GREP\" && GREP=grep\n_LT_DECL([], [GREP], [1], [A grep program that handles long lines])\n_LT_DECL([], [EGREP], [1], [An ERE matcher])\n_LT_DECL([], [FGREP], [1], [A literal string matcher])\ndnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too\nAC_SUBST([GREP])\n])\n\n\n# _LT_DECL_OBJDUMP\n# --------------\n# If we don't have a new enough Autoconf to choose the best objdump\n# available, choose the one first in the user's PATH.\nm4_defun([_LT_DECL_OBJDUMP],\n[AC_CHECK_TOOL(OBJDUMP, objdump, false)\ntest -z \"$OBJDUMP\" && OBJDUMP=objdump\n_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])\nAC_SUBST([OBJDUMP])\n])\n\n\n# _LT_DECL_SED\n# ------------\n# Check for a fully-functional sed program, that truncates\n# as few characters as possible.  Prefer GNU sed if found.\nm4_defun([_LT_DECL_SED],\n[AC_PROG_SED\ntest -z \"$SED\" && SED=sed\nXsed=\"$SED -e 1s/^X//\"\n_LT_DECL([], [SED], [1], [A sed program that does not truncate output])\n_LT_DECL([], [Xsed], [\"\\$SED -e 1s/^X//\"],\n    [Sed that helps us avoid accidentally triggering echo(1) options like -n])\n])# _LT_DECL_SED\n\nm4_ifndef([AC_PROG_SED], [\n############################################################\n# NOTE: This macro has been submitted for inclusion into   #\n#  GNU Autoconf as AC_PROG_SED.  When it is available in   #\n#  a released version of Autoconf we should remove this    #\n#  macro and use it instead.                               #\n############################################################\n\nm4_defun([AC_PROG_SED],\n[AC_MSG_CHECKING([for a sed that does not truncate output])\nAC_CACHE_VAL(lt_cv_path_SED,\n[# Loop through the user's path and test for sed and gsed.\n# Then use that list of sed's as ones to test for truncation.\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for lt_ac_prog in sed gsed; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      if $as_executable_p \"$as_dir/$lt_ac_prog$ac_exec_ext\"; then\n        lt_ac_sed_list=\"$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext\"\n      fi\n    done\n  done\ndone\nIFS=$as_save_IFS\nlt_ac_max=0\nlt_ac_count=0\n# Add /usr/xpg4/bin/sed as it is typically found on Solaris\n# along with /bin/sed that truncates output.\nfor lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do\n  test ! -f $lt_ac_sed && continue\n  cat /dev/null > conftest.in\n  lt_ac_count=0\n  echo $ECHO_N \"0123456789$ECHO_C\" >conftest.in\n  # Check for GNU sed and select it if it is found.\n  if \"$lt_ac_sed\" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then\n    lt_cv_path_SED=$lt_ac_sed\n    break\n  fi\n  while true; do\n    cat conftest.in conftest.in >conftest.tmp\n    mv conftest.tmp conftest.in\n    cp conftest.in conftest.nl\n    echo >>conftest.nl\n    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break\n    cmp -s conftest.out conftest.nl || break\n    # 10000 chars as input seems more than enough\n    test $lt_ac_count -gt 10 && break\n    lt_ac_count=`expr $lt_ac_count + 1`\n    if test $lt_ac_count -gt $lt_ac_max; then\n      lt_ac_max=$lt_ac_count\n      lt_cv_path_SED=$lt_ac_sed\n    fi\n  done\ndone\n])\nSED=$lt_cv_path_SED\nAC_SUBST([SED])\nAC_MSG_RESULT([$SED])\n])#AC_PROG_SED\n])#m4_ifndef\n\n# Old name:\nAU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([LT_AC_PROG_SED], [])\n\n\n# _LT_CHECK_SHELL_FEATURES\n# ------------------------\n# Find out whether the shell is Bourne or XSI compatible,\n# or has some other useful features.\nm4_defun([_LT_CHECK_SHELL_FEATURES],\n[AC_MSG_CHECKING([whether the shell understands some XSI constructs])\n# Try some XSI features\nxsi_shell=no\n( _lt_dummy=\"a/b/c\"\n  test \"${_lt_dummy##*/},${_lt_dummy%/*},\"${_lt_dummy%\"$_lt_dummy\"}, \\\n      = c,a/b,, \\\n    && eval 'test $(( 1 + 1 )) -eq 2 \\\n    && test \"${#_lt_dummy}\" -eq 5' ) >/dev/null 2>&1 \\\n  && xsi_shell=yes\nAC_MSG_RESULT([$xsi_shell])\n_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])\n\nAC_MSG_CHECKING([whether the shell understands \"+=\"])\nlt_shell_append=no\n( foo=bar; set foo baz; eval \"$[1]+=\\$[2]\" && test \"$foo\" = barbaz ) \\\n    >/dev/null 2>&1 \\\n  && lt_shell_append=yes\nAC_MSG_RESULT([$lt_shell_append])\n_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])\n\nif ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then\n  lt_unset=unset\nelse\n  lt_unset=false\nfi\n_LT_DECL([], [lt_unset], [0], [whether the shell understands \"unset\"])dnl\n\n# test EBCDIC or ASCII\ncase `echo X|tr X '\\101'` in\n A) # ASCII based system\n    # \\n is not interpreted correctly by Solaris 8 /usr/ucb/tr\n  lt_SP2NL='tr \\040 \\012'\n  lt_NL2SP='tr \\015\\012 \\040\\040'\n  ;;\n *) # EBCDIC based system\n  lt_SP2NL='tr \\100 \\n'\n  lt_NL2SP='tr \\r\\n \\100\\100'\n  ;;\nesac\n_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl\n_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl\n])# _LT_CHECK_SHELL_FEATURES\n\n\n# _LT_PROG_XSI_SHELLFNS\n# ---------------------\n# Bourne and XSI compatible variants of some useful shell functions.\nm4_defun([_LT_PROG_XSI_SHELLFNS],\n[case $xsi_shell in\n  yes)\n    cat << \\_LT_EOF >> \"$cfgfile\"\n\n# func_dirname file append nondir_replacement\n# Compute the dirname of FILE.  If nonempty, add APPEND to the result,\n# otherwise set result to NONDIR_REPLACEMENT.\nfunc_dirname ()\n{\n  case ${1} in\n    */*) func_dirname_result=\"${1%/*}${2}\" ;;\n    *  ) func_dirname_result=\"${3}\" ;;\n  esac\n}\n\n# func_basename file\nfunc_basename ()\n{\n  func_basename_result=\"${1##*/}\"\n}\n\n# func_dirname_and_basename file append nondir_replacement\n# perform func_basename and func_dirname in a single function\n# call:\n#   dirname:  Compute the dirname of FILE.  If nonempty,\n#             add APPEND to the result, otherwise set result\n#             to NONDIR_REPLACEMENT.\n#             value returned in \"$func_dirname_result\"\n#   basename: Compute filename of FILE.\n#             value retuned in \"$func_basename_result\"\n# Implementation must be kept synchronized with func_dirname\n# and func_basename. For efficiency, we do not delegate to\n# those functions but instead duplicate the functionality here.\nfunc_dirname_and_basename ()\n{\n  case ${1} in\n    */*) func_dirname_result=\"${1%/*}${2}\" ;;\n    *  ) func_dirname_result=\"${3}\" ;;\n  esac\n  func_basename_result=\"${1##*/}\"\n}\n\n# func_stripname prefix suffix name\n# strip PREFIX and SUFFIX off of NAME.\n# PREFIX and SUFFIX must not contain globbing or regex special\n# characters, hashes, percent signs, but SUFFIX may contain a leading\n# dot (in which case that matches only a dot).\nfunc_stripname ()\n{\n  # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\n  # positional parameters, so assign one to ordinary parameter first.\n  func_stripname_result=${3}\n  func_stripname_result=${func_stripname_result#\"${1}\"}\n  func_stripname_result=${func_stripname_result%\"${2}\"}\n}\n\n# func_opt_split\nfunc_opt_split ()\n{\n  func_opt_split_opt=${1%%=*}\n  func_opt_split_arg=${1#*=}\n}\n\n# func_lo2o object\nfunc_lo2o ()\n{\n  case ${1} in\n    *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\n    *)    func_lo2o_result=${1} ;;\n  esac\n}\n\n# func_xform libobj-or-source\nfunc_xform ()\n{\n  func_xform_result=${1%.*}.lo\n}\n\n# func_arith arithmetic-term...\nfunc_arith ()\n{\n  func_arith_result=$(( $[*] ))\n}\n\n# func_len string\n# STRING may not start with a hyphen.\nfunc_len ()\n{\n  func_len_result=${#1}\n}\n\n_LT_EOF\n    ;;\n  *) # Bourne compatible functions.\n    cat << \\_LT_EOF >> \"$cfgfile\"\n\n# func_dirname file append nondir_replacement\n# Compute the dirname of FILE.  If nonempty, add APPEND to the result,\n# otherwise set result to NONDIR_REPLACEMENT.\nfunc_dirname ()\n{\n  # Extract subdirectory from the argument.\n  func_dirname_result=`$ECHO \"X${1}\" | $Xsed -e \"$dirname\"`\n  if test \"X$func_dirname_result\" = \"X${1}\"; then\n    func_dirname_result=\"${3}\"\n  else\n    func_dirname_result=\"$func_dirname_result${2}\"\n  fi\n}\n\n# func_basename file\nfunc_basename ()\n{\n  func_basename_result=`$ECHO \"X${1}\" | $Xsed -e \"$basename\"`\n}\n\ndnl func_dirname_and_basename\ndnl A portable version of this function is already defined in general.m4sh\ndnl so there is no need for it here.\n\n# func_stripname prefix suffix name\n# strip PREFIX and SUFFIX off of NAME.\n# PREFIX and SUFFIX must not contain globbing or regex special\n# characters, hashes, percent signs, but SUFFIX may contain a leading\n# dot (in which case that matches only a dot).\n# func_strip_suffix prefix name\nfunc_stripname ()\n{\n  case ${2} in\n    .*) func_stripname_result=`$ECHO \"X${3}\" \\\n           | $Xsed -e \"s%^${1}%%\" -e \"s%\\\\\\\\${2}\\$%%\"`;;\n    *)  func_stripname_result=`$ECHO \"X${3}\" \\\n           | $Xsed -e \"s%^${1}%%\" -e \"s%${2}\\$%%\"`;;\n  esac\n}\n\n# sed scripts:\nmy_sed_long_opt='1s/^\\(-[[^=]]*\\)=.*/\\1/;q'\nmy_sed_long_arg='1s/^-[[^=]]*=//'\n\n# func_opt_split\nfunc_opt_split ()\n{\n  func_opt_split_opt=`$ECHO \"X${1}\" | $Xsed -e \"$my_sed_long_opt\"`\n  func_opt_split_arg=`$ECHO \"X${1}\" | $Xsed -e \"$my_sed_long_arg\"`\n}\n\n# func_lo2o object\nfunc_lo2o ()\n{\n  func_lo2o_result=`$ECHO \"X${1}\" | $Xsed -e \"$lo2o\"`\n}\n\n# func_xform libobj-or-source\nfunc_xform ()\n{\n  func_xform_result=`$ECHO \"X${1}\" | $Xsed -e 's/\\.[[^.]]*$/.lo/'`\n}\n\n# func_arith arithmetic-term...\nfunc_arith ()\n{\n  func_arith_result=`expr \"$[@]\"`\n}\n\n# func_len string\n# STRING may not start with a hyphen.\nfunc_len ()\n{\n  func_len_result=`expr \"$[1]\" : \".*\" 2>/dev/null || echo $max_cmd_len`\n}\n\n_LT_EOF\nesac\n\ncase $lt_shell_append in\n  yes)\n    cat << \\_LT_EOF >> \"$cfgfile\"\n\n# func_append var value\n# Append VALUE to the end of shell variable VAR.\nfunc_append ()\n{\n  eval \"$[1]+=\\$[2]\"\n}\n_LT_EOF\n    ;;\n  *)\n    cat << \\_LT_EOF >> \"$cfgfile\"\n\n# func_append var value\n# Append VALUE to the end of shell variable VAR.\nfunc_append ()\n{\n  eval \"$[1]=\\$$[1]\\$[2]\"\n}\n\n_LT_EOF\n    ;;\n  esac\n])\n"
  },
  {
    "path": "src/Onigmo/m4/ltoptions.m4",
    "content": "# Helper functions for option handling.                    -*- Autoconf -*-\n#\n#   Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.\n#   Written by Gary V. Vaughan, 2004\n#\n# This file is free software; the Free Software Foundation gives\n# unlimited permission to copy and/or distribute it, with or without\n# modifications, as long as this notice is preserved.\n\n# serial 6 ltoptions.m4\n\n# This is to help aclocal find these macros, as it can't see m4_define.\nAC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])\n\n\n# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)\n# ------------------------------------------\nm4_define([_LT_MANGLE_OPTION],\n[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])\n\n\n# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)\n# ---------------------------------------\n# Set option OPTION-NAME for macro MACRO-NAME, and if there is a\n# matching handler defined, dispatch to it.  Other OPTION-NAMEs are\n# saved as a flag.\nm4_define([_LT_SET_OPTION],\n[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl\nm4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),\n        _LT_MANGLE_DEFUN([$1], [$2]),\n    [m4_warning([Unknown $1 option `$2'])])[]dnl\n])\n\n\n# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])\n# ------------------------------------------------------------\n# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.\nm4_define([_LT_IF_OPTION],\n[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])\n\n\n# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)\n# -------------------------------------------------------\n# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME\n# are set.\nm4_define([_LT_UNLESS_OPTIONS],\n[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),\n\t    [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),\n\t\t      [m4_define([$0_found])])])[]dnl\nm4_ifdef([$0_found], [m4_undefine([$0_found])], [$3\n])[]dnl\n])\n\n\n# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)\n# ----------------------------------------\n# OPTION-LIST is a space-separated list of Libtool options associated\n# with MACRO-NAME.  If any OPTION has a matching handler declared with\n# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about\n# the unknown option and exit.\nm4_defun([_LT_SET_OPTIONS],\n[# Set options\nm4_foreach([_LT_Option], m4_split(m4_normalize([$2])),\n    [_LT_SET_OPTION([$1], _LT_Option)])\n\nm4_if([$1],[LT_INIT],[\n  dnl\n  dnl Simply set some default values (i.e off) if boolean options were not\n  dnl specified:\n  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no\n  ])\n  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no\n  ])\n  dnl\n  dnl If no reference was made to various pairs of opposing options, then\n  dnl we run the default mode handler for the pair.  For example, if neither\n  dnl `shared' nor `disable-shared' was passed, we enable building of shared\n  dnl archives by default:\n  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])\n  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])\n  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])\n  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],\n  \t\t   [_LT_ENABLE_FAST_INSTALL])\n  ])\n])# _LT_SET_OPTIONS\n\n\n## --------------------------------- ##\n## Macros to handle LT_INIT options. ##\n## --------------------------------- ##\n\n# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)\n# -----------------------------------------\nm4_define([_LT_MANGLE_DEFUN],\n[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])\n\n\n# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)\n# -----------------------------------------------\nm4_define([LT_OPTION_DEFINE],\n[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl\n])# LT_OPTION_DEFINE\n\n\n# dlopen\n# ------\nLT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes\n])\n\nAU_DEFUN([AC_LIBTOOL_DLOPEN],\n[_LT_SET_OPTION([LT_INIT], [dlopen])\nAC_DIAGNOSE([obsolete],\n[$0: Remove this warning and the call to _LT_SET_OPTION when you\nput the `dlopen' option into LT_INIT's first parameter.])\n])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])\n\n\n# win32-dll\n# ---------\n# Declare package support for building win32 dll's.\nLT_OPTION_DEFINE([LT_INIT], [win32-dll],\n[enable_win32_dll=yes\n\ncase $host in\n*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-cegcc*)\n  AC_CHECK_TOOL(AS, as, false)\n  AC_CHECK_TOOL(DLLTOOL, dlltool, false)\n  AC_CHECK_TOOL(OBJDUMP, objdump, false)\n  ;;\nesac\n\ntest -z \"$AS\" && AS=as\n_LT_DECL([], [AS],      [0], [Assembler program])dnl\n\ntest -z \"$DLLTOOL\" && DLLTOOL=dlltool\n_LT_DECL([], [DLLTOOL], [0], [DLL creation program])dnl\n\ntest -z \"$OBJDUMP\" && OBJDUMP=objdump\n_LT_DECL([], [OBJDUMP], [0], [Object dumper program])dnl\n])# win32-dll\n\nAU_DEFUN([AC_LIBTOOL_WIN32_DLL],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\n_LT_SET_OPTION([LT_INIT], [win32-dll])\nAC_DIAGNOSE([obsolete],\n[$0: Remove this warning and the call to _LT_SET_OPTION when you\nput the `win32-dll' option into LT_INIT's first parameter.])\n])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])\n\n\n# _LT_ENABLE_SHARED([DEFAULT])\n# ----------------------------\n# implement the --enable-shared flag, and supports the `shared' and\n# `disable-shared' LT_INIT options.\n# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.\nm4_define([_LT_ENABLE_SHARED],\n[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl\nAC_ARG_ENABLE([shared],\n    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],\n\t[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],\n    [p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_shared=yes ;;\n    no) enable_shared=no ;;\n    *)\n      enable_shared=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for pkg in $enableval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_shared=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac],\n    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)\n\n    _LT_DECL([build_libtool_libs], [enable_shared], [0],\n\t[Whether or not to build shared libraries])\n])# _LT_ENABLE_SHARED\n\nLT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])\nLT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])\n\n# Old names:\nAC_DEFUN([AC_ENABLE_SHARED],\n[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])\n])\n\nAC_DEFUN([AC_DISABLE_SHARED],\n[_LT_SET_OPTION([LT_INIT], [disable-shared])\n])\n\nAU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])\nAU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AM_ENABLE_SHARED], [])\ndnl AC_DEFUN([AM_DISABLE_SHARED], [])\n\n\n\n# _LT_ENABLE_STATIC([DEFAULT])\n# ----------------------------\n# implement the --enable-static flag, and support the `static' and\n# `disable-static' LT_INIT options.\n# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.\nm4_define([_LT_ENABLE_STATIC],\n[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl\nAC_ARG_ENABLE([static],\n    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],\n\t[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],\n    [p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_static=yes ;;\n    no) enable_static=no ;;\n    *)\n     enable_static=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for pkg in $enableval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_static=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac],\n    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)\n\n    _LT_DECL([build_old_libs], [enable_static], [0],\n\t[Whether or not to build static libraries])\n])# _LT_ENABLE_STATIC\n\nLT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])\nLT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])\n\n# Old names:\nAC_DEFUN([AC_ENABLE_STATIC],\n[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])\n])\n\nAC_DEFUN([AC_DISABLE_STATIC],\n[_LT_SET_OPTION([LT_INIT], [disable-static])\n])\n\nAU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])\nAU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AM_ENABLE_STATIC], [])\ndnl AC_DEFUN([AM_DISABLE_STATIC], [])\n\n\n\n# _LT_ENABLE_FAST_INSTALL([DEFAULT])\n# ----------------------------------\n# implement the --enable-fast-install flag, and support the `fast-install'\n# and `disable-fast-install' LT_INIT options.\n# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.\nm4_define([_LT_ENABLE_FAST_INSTALL],\n[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl\nAC_ARG_ENABLE([fast-install],\n    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],\n    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],\n    [p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_fast_install=yes ;;\n    no) enable_fast_install=no ;;\n    *)\n      enable_fast_install=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for pkg in $enableval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_fast_install=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac],\n    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)\n\n_LT_DECL([fast_install], [enable_fast_install], [0],\n\t [Whether or not to optimize for fast installation])dnl\n])# _LT_ENABLE_FAST_INSTALL\n\nLT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])\nLT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])\n\n# Old names:\nAU_DEFUN([AC_ENABLE_FAST_INSTALL],\n[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])\nAC_DIAGNOSE([obsolete],\n[$0: Remove this warning and the call to _LT_SET_OPTION when you put\nthe `fast-install' option into LT_INIT's first parameter.])\n])\n\nAU_DEFUN([AC_DISABLE_FAST_INSTALL],\n[_LT_SET_OPTION([LT_INIT], [disable-fast-install])\nAC_DIAGNOSE([obsolete],\n[$0: Remove this warning and the call to _LT_SET_OPTION when you put\nthe `disable-fast-install' option into LT_INIT's first parameter.])\n])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])\ndnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])\n\n\n# _LT_WITH_PIC([MODE])\n# --------------------\n# implement the --with-pic flag, and support the `pic-only' and `no-pic'\n# LT_INIT options.\n# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.\nm4_define([_LT_WITH_PIC],\n[AC_ARG_WITH([pic],\n    [AS_HELP_STRING([--with-pic],\n\t[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],\n    [pic_mode=\"$withval\"],\n    [pic_mode=default])\n\ntest -z \"$pic_mode\" && pic_mode=m4_default([$1], [default])\n\n_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl\n])# _LT_WITH_PIC\n\nLT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])\nLT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])\n\n# Old name:\nAU_DEFUN([AC_LIBTOOL_PICMODE],\n[_LT_SET_OPTION([LT_INIT], [pic-only])\nAC_DIAGNOSE([obsolete],\n[$0: Remove this warning and the call to _LT_SET_OPTION when you\nput the `pic-only' option into LT_INIT's first parameter.])\n])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])\n\n## ----------------- ##\n## LTDL_INIT Options ##\n## ----------------- ##\n\nm4_define([_LTDL_MODE], [])\nLT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],\n\t\t [m4_define([_LTDL_MODE], [nonrecursive])])\nLT_OPTION_DEFINE([LTDL_INIT], [recursive],\n\t\t [m4_define([_LTDL_MODE], [recursive])])\nLT_OPTION_DEFINE([LTDL_INIT], [subproject],\n\t\t [m4_define([_LTDL_MODE], [subproject])])\n\nm4_define([_LTDL_TYPE], [])\nLT_OPTION_DEFINE([LTDL_INIT], [installable],\n\t\t [m4_define([_LTDL_TYPE], [installable])])\nLT_OPTION_DEFINE([LTDL_INIT], [convenience],\n\t\t [m4_define([_LTDL_TYPE], [convenience])])\n"
  },
  {
    "path": "src/Onigmo/m4/ltsugar.m4",
    "content": "# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-\n#\n# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.\n# Written by Gary V. Vaughan, 2004\n#\n# This file is free software; the Free Software Foundation gives\n# unlimited permission to copy and/or distribute it, with or without\n# modifications, as long as this notice is preserved.\n\n# serial 6 ltsugar.m4\n\n# This is to help aclocal find these macros, as it can't see m4_define.\nAC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])\n\n\n# lt_join(SEP, ARG1, [ARG2...])\n# -----------------------------\n# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their\n# associated separator.\n# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier\n# versions in m4sugar had bugs.\nm4_define([lt_join],\n[m4_if([$#], [1], [],\n       [$#], [2], [[$2]],\n       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])\nm4_define([_lt_join],\n[m4_if([$#$2], [2], [],\n       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])\n\n\n# lt_car(LIST)\n# lt_cdr(LIST)\n# ------------\n# Manipulate m4 lists.\n# These macros are necessary as long as will still need to support\n# Autoconf-2.59 which quotes differently.\nm4_define([lt_car], [[$1]])\nm4_define([lt_cdr],\n[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],\n       [$#], 1, [],\n       [m4_dquote(m4_shift($@))])])\nm4_define([lt_unquote], $1)\n\n\n# lt_append(MACRO-NAME, STRING, [SEPARATOR])\n# ------------------------------------------\n# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.\n# Note that neither SEPARATOR nor STRING are expanded; they are appended\n# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).\n# No SEPARATOR is output if MACRO-NAME was previously undefined (different\n# than defined and empty).\n#\n# This macro is needed until we can rely on Autoconf 2.62, since earlier\n# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.\nm4_define([lt_append],\n[m4_define([$1],\n\t   m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])\n\n\n\n# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])\n# ----------------------------------------------------------\n# Produce a SEP delimited list of all paired combinations of elements of\n# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list\n# has the form PREFIXmINFIXSUFFIXn.\n# Needed until we can rely on m4_combine added in Autoconf 2.62.\nm4_define([lt_combine],\n[m4_if(m4_eval([$# > 3]), [1],\n       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl\n[[m4_foreach([_Lt_prefix], [$2],\n\t     [m4_foreach([_Lt_suffix],\n\t\t]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,\n\t[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])\n\n\n# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])\n# -----------------------------------------------------------------------\n# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited\n# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.\nm4_define([lt_if_append_uniq],\n[m4_ifdef([$1],\n\t  [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],\n\t\t [lt_append([$1], [$2], [$3])$4],\n\t\t [$5])],\n\t  [lt_append([$1], [$2], [$3])$4])])\n\n\n# lt_dict_add(DICT, KEY, VALUE)\n# -----------------------------\nm4_define([lt_dict_add],\n[m4_define([$1($2)], [$3])])\n\n\n# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)\n# --------------------------------------------\nm4_define([lt_dict_add_subkey],\n[m4_define([$1($2:$3)], [$4])])\n\n\n# lt_dict_fetch(DICT, KEY, [SUBKEY])\n# ----------------------------------\nm4_define([lt_dict_fetch],\n[m4_ifval([$3],\n\tm4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),\n    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])\n\n\n# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])\n# -----------------------------------------------------------------\nm4_define([lt_if_dict_fetch],\n[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],\n\t[$5],\n    [$6])])\n\n\n# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])\n# --------------------------------------------------------------\nm4_define([lt_dict_filter],\n[m4_if([$5], [], [],\n  [lt_join(m4_quote(m4_default([$4], [[, ]])),\n           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),\n\t\t      [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl\n])\n"
  },
  {
    "path": "src/Onigmo/m4/ltversion.m4",
    "content": "# ltversion.m4 -- version numbers\t\t\t-*- Autoconf -*-\n#\n#   Copyright (C) 2004 Free Software Foundation, Inc.\n#   Written by Scott James Remnant, 2004\n#\n# This file is free software; the Free Software Foundation gives\n# unlimited permission to copy and/or distribute it, with or without\n# modifications, as long as this notice is preserved.\n\n# Generated from ltversion.in.\n\n# serial 3017 ltversion.m4\n# This file is part of GNU Libtool\n\nm4_define([LT_PACKAGE_VERSION], [2.2.6b])\nm4_define([LT_PACKAGE_REVISION], [1.3017])\n\nAC_DEFUN([LTVERSION_VERSION],\n[macro_version='2.2.6b'\nmacro_revision='1.3017'\n_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])\n_LT_DECL(, macro_revision, 0)\n])\n"
  },
  {
    "path": "src/Onigmo/m4/lt~obsolete.m4",
    "content": "# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-\n#\n#   Copyright (C) 2004, 2005, 2007 Free Software Foundation, Inc.\n#   Written by Scott James Remnant, 2004.\n#\n# This file is free software; the Free Software Foundation gives\n# unlimited permission to copy and/or distribute it, with or without\n# modifications, as long as this notice is preserved.\n\n# serial 4 lt~obsolete.m4\n\n# These exist entirely to fool aclocal when bootstrapping libtool.\n#\n# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)\n# which have later been changed to m4_define as they aren't part of the\n# exported API, or moved to Autoconf or Automake where they belong.\n#\n# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN\n# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us\n# using a macro with the same name in our local m4/libtool.m4 it'll\n# pull the old libtool.m4 in (it doesn't see our shiny new m4_define\n# and doesn't know about Autoconf macros at all.)\n#\n# So we provide this file, which has a silly filename so it's always\n# included after everything else.  This provides aclocal with the\n# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything\n# because those macros already exist, or will be overwritten later.\n# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. \n#\n# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.\n# Yes, that means every name once taken will need to remain here until\n# we give up compatibility with versions before 1.7, at which point\n# we need to keep only those names which we still refer to.\n\n# This is to help aclocal find these macros, as it can't see m4_define.\nAC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])\n\nm4_ifndef([AC_LIBTOOL_LINKER_OPTION],\t[AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])\nm4_ifndef([AC_PROG_EGREP],\t\t[AC_DEFUN([AC_PROG_EGREP])])\nm4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],\t[AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])\nm4_ifndef([_LT_AC_SHELL_INIT],\t\t[AC_DEFUN([_LT_AC_SHELL_INIT])])\nm4_ifndef([_LT_AC_SYS_LIBPATH_AIX],\t[AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])\nm4_ifndef([_LT_PROG_LTMAIN],\t\t[AC_DEFUN([_LT_PROG_LTMAIN])])\nm4_ifndef([_LT_AC_TAGVAR],\t\t[AC_DEFUN([_LT_AC_TAGVAR])])\nm4_ifndef([AC_LTDL_ENABLE_INSTALL],\t[AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])\nm4_ifndef([AC_LTDL_PREOPEN],\t\t[AC_DEFUN([AC_LTDL_PREOPEN])])\nm4_ifndef([_LT_AC_SYS_COMPILER],\t[AC_DEFUN([_LT_AC_SYS_COMPILER])])\nm4_ifndef([_LT_AC_LOCK],\t\t[AC_DEFUN([_LT_AC_LOCK])])\nm4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],\t[AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])\nm4_ifndef([_LT_AC_TRY_DLOPEN_SELF],\t[AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])\nm4_ifndef([AC_LIBTOOL_PROG_CC_C_O],\t[AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])\nm4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])\nm4_ifndef([AC_LIBTOOL_OBJDIR],\t\t[AC_DEFUN([AC_LIBTOOL_OBJDIR])])\nm4_ifndef([AC_LTDL_OBJDIR],\t\t[AC_DEFUN([AC_LTDL_OBJDIR])])\nm4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])\nm4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],\t[AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])\nm4_ifndef([AC_PATH_MAGIC],\t\t[AC_DEFUN([AC_PATH_MAGIC])])\nm4_ifndef([AC_PROG_LD_GNU],\t\t[AC_DEFUN([AC_PROG_LD_GNU])])\nm4_ifndef([AC_PROG_LD_RELOAD_FLAG],\t[AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])\nm4_ifndef([AC_DEPLIBS_CHECK_METHOD],\t[AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])\nm4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])\nm4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])\nm4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])\nm4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS],\t[AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])\nm4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP],\t[AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])\nm4_ifndef([LT_AC_PROG_EGREP],\t\t[AC_DEFUN([LT_AC_PROG_EGREP])])\nm4_ifndef([LT_AC_PROG_SED],\t\t[AC_DEFUN([LT_AC_PROG_SED])])\nm4_ifndef([_LT_CC_BASENAME],\t\t[AC_DEFUN([_LT_CC_BASENAME])])\nm4_ifndef([_LT_COMPILER_BOILERPLATE],\t[AC_DEFUN([_LT_COMPILER_BOILERPLATE])])\nm4_ifndef([_LT_LINKER_BOILERPLATE],\t[AC_DEFUN([_LT_LINKER_BOILERPLATE])])\nm4_ifndef([_AC_PROG_LIBTOOL],\t\t[AC_DEFUN([_AC_PROG_LIBTOOL])])\nm4_ifndef([AC_LIBTOOL_SETUP],\t\t[AC_DEFUN([AC_LIBTOOL_SETUP])])\nm4_ifndef([_LT_AC_CHECK_DLFCN],\t\t[AC_DEFUN([_LT_AC_CHECK_DLFCN])])\nm4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],\t[AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])\nm4_ifndef([_LT_AC_TAGCONFIG],\t\t[AC_DEFUN([_LT_AC_TAGCONFIG])])\nm4_ifndef([AC_DISABLE_FAST_INSTALL],\t[AC_DEFUN([AC_DISABLE_FAST_INSTALL])])\nm4_ifndef([_LT_AC_LANG_CXX],\t\t[AC_DEFUN([_LT_AC_LANG_CXX])])\nm4_ifndef([_LT_AC_LANG_F77],\t\t[AC_DEFUN([_LT_AC_LANG_F77])])\nm4_ifndef([_LT_AC_LANG_GCJ],\t\t[AC_DEFUN([_LT_AC_LANG_GCJ])])\nm4_ifndef([AC_LIBTOOL_RC],\t\t[AC_DEFUN([AC_LIBTOOL_RC])])\nm4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],\t[AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])\nm4_ifndef([_LT_AC_LANG_C_CONFIG],\t[AC_DEFUN([_LT_AC_LANG_C_CONFIG])])\nm4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],\t[AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])\nm4_ifndef([_LT_AC_LANG_CXX_CONFIG],\t[AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])\nm4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],\t[AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])\nm4_ifndef([_LT_AC_LANG_F77_CONFIG],\t[AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])\nm4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],\t[AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])\nm4_ifndef([_LT_AC_LANG_GCJ_CONFIG],\t[AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])\nm4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],\t[AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])\nm4_ifndef([_LT_AC_LANG_RC_CONFIG],\t[AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])\nm4_ifndef([AC_LIBTOOL_CONFIG],\t\t[AC_DEFUN([AC_LIBTOOL_CONFIG])])\nm4_ifndef([_LT_AC_FILE_LTDLL_C],\t[AC_DEFUN([_LT_AC_FILE_LTDLL_C])])\n"
  },
  {
    "path": "src/Onigmo/missing",
    "content": "#! /bin/sh\n# Common stub for a few missing GNU programs while installing.\n\nscriptversion=2009-04-28.21; # UTC\n\n# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006,\n# 2008, 2009 Free Software Foundation, Inc.\n# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.\n\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2, or (at your option)\n# any later version.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n\n# You should have received a copy of the GNU General Public License\n# along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\nif test $# -eq 0; then\n  echo 1>&2 \"Try \\`$0 --help' for more information\"\n  exit 1\nfi\n\nrun=:\nsed_output='s/.* --output[ =]\\([^ ]*\\).*/\\1/p'\nsed_minuso='s/.* -o \\([^ ]*\\).*/\\1/p'\n\n# In the cases where this matters, `missing' is being run in the\n# srcdir already.\nif test -f configure.ac; then\n  configure_ac=configure.ac\nelse\n  configure_ac=configure.in\nfi\n\nmsg=\"missing on your system\"\n\ncase $1 in\n--run)\n  # Try to run requested program, and just exit if it succeeds.\n  run=\n  shift\n  \"$@\" && exit 0\n  # Exit code 63 means version mismatch.  This often happens\n  # when the user try to use an ancient version of a tool on\n  # a file that requires a minimum version.  In this case we\n  # we should proceed has if the program had been absent, or\n  # if --run hadn't been passed.\n  if test $? = 63; then\n    run=:\n    msg=\"probably too old\"\n  fi\n  ;;\n\n  -h|--h|--he|--hel|--help)\n    echo \"\\\n$0 [OPTION]... PROGRAM [ARGUMENT]...\n\nHandle \\`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an\nerror status if there is no known handling for PROGRAM.\n\nOptions:\n  -h, --help      display this help and exit\n  -v, --version   output version information and exit\n  --run           try to run the given command, and emulate it if it fails\n\nSupported PROGRAM values:\n  aclocal      touch file \\`aclocal.m4'\n  autoconf     touch file \\`configure'\n  autoheader   touch file \\`config.h.in'\n  autom4te     touch the output file, or create a stub one\n  automake     touch all \\`Makefile.in' files\n  bison        create \\`y.tab.[ch]', if possible, from existing .[ch]\n  flex         create \\`lex.yy.c', if possible, from existing .c\n  help2man     touch the output file\n  lex          create \\`lex.yy.c', if possible, from existing .c\n  makeinfo     touch the output file\n  tar          try tar, gnutar, gtar, then tar without non-portable flags\n  yacc         create \\`y.tab.[ch]', if possible, from existing .[ch]\n\nVersion suffixes to PROGRAM as well as the prefixes \\`gnu-', \\`gnu', and\n\\`g' are ignored when checking the name.\n\nSend bug reports to <bug-automake@gnu.org>.\"\n    exit $?\n    ;;\n\n  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)\n    echo \"missing $scriptversion (GNU Automake)\"\n    exit $?\n    ;;\n\n  -*)\n    echo 1>&2 \"$0: Unknown \\`$1' option\"\n    echo 1>&2 \"Try \\`$0 --help' for more information\"\n    exit 1\n    ;;\n\nesac\n\n# normalize program name to check for.\nprogram=`echo \"$1\" | sed '\n  s/^gnu-//; t\n  s/^gnu//; t\n  s/^g//; t'`\n\n# Now exit if we have it, but it failed.  Also exit now if we\n# don't have it and --version was passed (most likely to detect\n# the program).  This is about non-GNU programs, so use $1 not\n# $program.\ncase $1 in\n  lex*|yacc*)\n    # Not GNU programs, they don't have --version.\n    ;;\n\n  tar*)\n    if test -n \"$run\"; then\n       echo 1>&2 \"ERROR: \\`tar' requires --run\"\n       exit 1\n    elif test \"x$2\" = \"x--version\" || test \"x$2\" = \"x--help\"; then\n       exit 1\n    fi\n    ;;\n\n  *)\n    if test -z \"$run\" && ($1 --version) > /dev/null 2>&1; then\n       # We have it, but it failed.\n       exit 1\n    elif test \"x$2\" = \"x--version\" || test \"x$2\" = \"x--help\"; then\n       # Could not run --version or --help.  This is probably someone\n       # running `$TOOL --version' or `$TOOL --help' to check whether\n       # $TOOL exists and not knowing $TOOL uses missing.\n       exit 1\n    fi\n    ;;\nesac\n\n# If it does not exist, or fails to run (possibly an outdated version),\n# try to emulate it.\ncase $program in\n  aclocal*)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is $msg.  You should only need it if\n         you modified \\`acinclude.m4' or \\`${configure_ac}'.  You might want\n         to install the \\`Automake' and \\`Perl' packages.  Grab them from\n         any GNU archive site.\"\n    touch aclocal.m4\n    ;;\n\n  autoconf*)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is $msg.  You should only need it if\n         you modified \\`${configure_ac}'.  You might want to install the\n         \\`Autoconf' and \\`GNU m4' packages.  Grab them from any GNU\n         archive site.\"\n    touch configure\n    ;;\n\n  autoheader*)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is $msg.  You should only need it if\n         you modified \\`acconfig.h' or \\`${configure_ac}'.  You might want\n         to install the \\`Autoconf' and \\`GNU m4' packages.  Grab them\n         from any GNU archive site.\"\n    files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\\([^)]*\\)).*/\\1/p' ${configure_ac}`\n    test -z \"$files\" && files=\"config.h\"\n    touch_files=\n    for f in $files; do\n      case $f in\n      *:*) touch_files=\"$touch_files \"`echo \"$f\" |\n\t\t\t\t       sed -e 's/^[^:]*://' -e 's/:.*//'`;;\n      *) touch_files=\"$touch_files $f.in\";;\n      esac\n    done\n    touch $touch_files\n    ;;\n\n  automake*)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is $msg.  You should only need it if\n         you modified \\`Makefile.am', \\`acinclude.m4' or \\`${configure_ac}'.\n         You might want to install the \\`Automake' and \\`Perl' packages.\n         Grab them from any GNU archive site.\"\n    find . -type f -name Makefile.am -print |\n\t   sed 's/\\.am$/.in/' |\n\t   while read f; do touch \"$f\"; done\n    ;;\n\n  autom4te*)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is needed, but is $msg.\n         You might have modified some files without having the\n         proper tools for further handling them.\n         You can get \\`$1' as part of \\`Autoconf' from any GNU\n         archive site.\"\n\n    file=`echo \"$*\" | sed -n \"$sed_output\"`\n    test -z \"$file\" && file=`echo \"$*\" | sed -n \"$sed_minuso\"`\n    if test -f \"$file\"; then\n\ttouch $file\n    else\n\ttest -z \"$file\" || exec >$file\n\techo \"#! /bin/sh\"\n\techo \"# Created by GNU Automake missing as a replacement of\"\n\techo \"#  $ $@\"\n\techo \"exit 0\"\n\tchmod +x $file\n\texit 1\n    fi\n    ;;\n\n  bison*|yacc*)\n    echo 1>&2 \"\\\nWARNING: \\`$1' $msg.  You should only need it if\n         you modified a \\`.y' file.  You may need the \\`Bison' package\n         in order for those modifications to take effect.  You can get\n         \\`Bison' from any GNU archive site.\"\n    rm -f y.tab.c y.tab.h\n    if test $# -ne 1; then\n        eval LASTARG=\"\\${$#}\"\n\tcase $LASTARG in\n\t*.y)\n\t    SRCFILE=`echo \"$LASTARG\" | sed 's/y$/c/'`\n\t    if test -f \"$SRCFILE\"; then\n\t         cp \"$SRCFILE\" y.tab.c\n\t    fi\n\t    SRCFILE=`echo \"$LASTARG\" | sed 's/y$/h/'`\n\t    if test -f \"$SRCFILE\"; then\n\t         cp \"$SRCFILE\" y.tab.h\n\t    fi\n\t  ;;\n\tesac\n    fi\n    if test ! -f y.tab.h; then\n\techo >y.tab.h\n    fi\n    if test ! -f y.tab.c; then\n\techo 'main() { return 0; }' >y.tab.c\n    fi\n    ;;\n\n  lex*|flex*)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is $msg.  You should only need it if\n         you modified a \\`.l' file.  You may need the \\`Flex' package\n         in order for those modifications to take effect.  You can get\n         \\`Flex' from any GNU archive site.\"\n    rm -f lex.yy.c\n    if test $# -ne 1; then\n        eval LASTARG=\"\\${$#}\"\n\tcase $LASTARG in\n\t*.l)\n\t    SRCFILE=`echo \"$LASTARG\" | sed 's/l$/c/'`\n\t    if test -f \"$SRCFILE\"; then\n\t         cp \"$SRCFILE\" lex.yy.c\n\t    fi\n\t  ;;\n\tesac\n    fi\n    if test ! -f lex.yy.c; then\n\techo 'main() { return 0; }' >lex.yy.c\n    fi\n    ;;\n\n  help2man*)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is $msg.  You should only need it if\n\t you modified a dependency of a manual page.  You may need the\n\t \\`Help2man' package in order for those modifications to take\n\t effect.  You can get \\`Help2man' from any GNU archive site.\"\n\n    file=`echo \"$*\" | sed -n \"$sed_output\"`\n    test -z \"$file\" && file=`echo \"$*\" | sed -n \"$sed_minuso\"`\n    if test -f \"$file\"; then\n\ttouch $file\n    else\n\ttest -z \"$file\" || exec >$file\n\techo \".ab help2man is required to generate this page\"\n\texit $?\n    fi\n    ;;\n\n  makeinfo*)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is $msg.  You should only need it if\n         you modified a \\`.texi' or \\`.texinfo' file, or any other file\n         indirectly affecting the aspect of the manual.  The spurious\n         call might also be the consequence of using a buggy \\`make' (AIX,\n         DU, IRIX).  You might want to install the \\`Texinfo' package or\n         the \\`GNU make' package.  Grab either from any GNU archive site.\"\n    # The file to touch is that specified with -o ...\n    file=`echo \"$*\" | sed -n \"$sed_output\"`\n    test -z \"$file\" && file=`echo \"$*\" | sed -n \"$sed_minuso\"`\n    if test -z \"$file\"; then\n      # ... or it is the one specified with @setfilename ...\n      infile=`echo \"$*\" | sed 's/.* \\([^ ]*\\) *$/\\1/'`\n      file=`sed -n '\n\t/^@setfilename/{\n\t  s/.* \\([^ ]*\\) *$/\\1/\n\t  p\n\t  q\n\t}' $infile`\n      # ... or it is derived from the source name (dir/f.texi becomes f.info)\n      test -z \"$file\" && file=`echo \"$infile\" | sed 's,.*/,,;s,.[^.]*$,,'`.info\n    fi\n    # If the file does not exist, the user really needs makeinfo;\n    # let's fail without touching anything.\n    test -f $file || exit 1\n    touch $file\n    ;;\n\n  tar*)\n    shift\n\n    # We have already tried tar in the generic part.\n    # Look for gnutar/gtar before invocation to avoid ugly error\n    # messages.\n    if (gnutar --version > /dev/null 2>&1); then\n       gnutar \"$@\" && exit 0\n    fi\n    if (gtar --version > /dev/null 2>&1); then\n       gtar \"$@\" && exit 0\n    fi\n    firstarg=\"$1\"\n    if shift; then\n\tcase $firstarg in\n\t*o*)\n\t    firstarg=`echo \"$firstarg\" | sed s/o//`\n\t    tar \"$firstarg\" \"$@\" && exit 0\n\t    ;;\n\tesac\n\tcase $firstarg in\n\t*h*)\n\t    firstarg=`echo \"$firstarg\" | sed s/h//`\n\t    tar \"$firstarg\" \"$@\" && exit 0\n\t    ;;\n\tesac\n    fi\n\n    echo 1>&2 \"\\\nWARNING: I can't seem to be able to run \\`tar' with the given arguments.\n         You may want to install GNU tar or Free paxutils, or check the\n         command line arguments.\"\n    exit 1\n    ;;\n\n  *)\n    echo 1>&2 \"\\\nWARNING: \\`$1' is needed, and is $msg.\n         You might have modified some files without having the\n         proper tools for further handling them.  Check the \\`README' file,\n         it often tells you about the needed prerequisites for installing\n         this package.  You may also peek at any GNU archive site, in case\n         some other package would contain this missing \\`$1' program.\"\n    exit 1\n    ;;\nesac\n\nexit 0\n\n# Local variables:\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"scriptversion=\"\n# time-stamp-format: \"%:y-%02m-%02d.%02H\"\n# time-stamp-time-zone: \"UTC\"\n# time-stamp-end: \"; # UTC\"\n# End:\n"
  },
  {
    "path": "src/Onigmo/onig-config.in",
    "content": "#!/bin/sh\n# Copyright (C) 2006  K.Kosako (sndgk393 AT ybb DOT ne DOT jp)\n\nONIG_VERSION=@PACKAGE_VERSION@\n\nshow_usage()\n{\n  cat <<EOF\nUsage: onig-config [OPTION]\n\n  Values for OPTION are:\n  --prefix[=DIR]       change prefix to DIR\n  --prefix             print prefix\n  --exec-prefix[=DIR]  change exec_prefix to DIR\n  --exec-prefix        print exec_prefix\n  --cflags             print C compiler flags\n  --libs               print library information\n  --version            print oniguruma version\n  --help               print this help\n\nEOF\n\n  exit 1\n}\n\nif test $# -eq 0; then\n  show_usage\nfi\n\nprefix=@prefix@\nexec_prefix=@exec_prefix@\nis_set_exec_prefix=no\n\nwhile test $# -gt 0; do\n  case \"$1\" in\n  -*=*) val=`echo \"$1\" | sed 's/[-_a-zA-Z0-9]*=//'`\n     ;;\n  *) val=\n     ;;\n  esac\n\n  case $1 in\n    --prefix=*)\n      prefix=$val\n      if test $is_set_exec_prefix = no ; then\n        exec_prefix=$val\n      fi\n      ;;\n    --prefix)\n      echo $prefix\n      ;;\n    --exec-prefix=*)\n      exec_prefix=$val\n      is_set_exec_prefix=yes\n      ;;\n    --exec-prefix)\n      echo $exec_prefix\n      ;;\n    --cflags)\n      if test @includedir@ != /usr/include ; then\n        show_includedir=-I@includedir@\n      fi\n      echo $show_includedir\n      ;;\n    --libs)\n      echo -L@libdir@ -lonig\n      ;;\n    --version)\n      echo $ONIG_VERSION\n      ;;\n    *)\n      show_usage\n      ;;\n  esac\n  shift\ndone\n\n# END\n"
  },
  {
    "path": "src/Onigmo/onig.py",
    "content": "# -*- coding: utf-8 -*-\n\n\"\"\"Using Onigmo (Oniguruma-mod) regular expression library.\n\nThis is a low level wrapper for Onigmo regular expression DLL/shared object.\n(This module does not support static link library.)\nThis provides almost same API as the original C API, so the API is not\nobject oriented.\n\nOnigmo DLL (onig.dll, libonig.so, etc.) must be placed in the\ndefault search path. The default search path depends on the system.\n\"\"\"\n\nimport ctypes\nimport os\nimport sys\n\n#__all__ = [\"onig_new\", \"onig_free\",\n#           \"onig_search\", \"onig_match\",\n#           \"onig_region_new\", \"onig_region_free\",\n#           \"onig_version\", \"onig_copyright\"]\n\n\n#\n# Type Definitions\n#\n\nOnigCodePoint = ctypes.c_uint\n\nclass OnigRegexType(ctypes.Structure):\n    _fields_ = [\n    ]\nregex_t = OnigRegexType\nOnigRegex = ctypes.POINTER(OnigRegexType)\n\ntry:\n    # Python 2.7\n    _c_ssize_t = ctypes.c_ssize_t\nexcept AttributeError:\n    # Python 2.6\n    if ctypes.sizeof(ctypes.c_int) == ctypes.sizeof(ctypes.c_void_p):\n        _c_ssize_t = ctypes.c_int\n    elif ctypes.sizeof(ctypes.c_long) == ctypes.sizeof(ctypes.c_void_p):\n        _c_ssize_t = ctypes.c_long\n    elif ctypes.sizeof(ctypes.c_longlong) == ctypes.sizeof(ctypes.c_void_p):\n        _c_ssize_t = ctypes.c_longlong\n\nclass OnigRegion(ctypes.Structure):\n    _fields_ = [\n        (\"allocated\",   ctypes.c_int),\n        (\"num_regs\",    ctypes.c_int),\n        (\"beg\",         ctypes.POINTER(_c_ssize_t)),\n        (\"end\",         ctypes.POINTER(_c_ssize_t)),\n        (\"history_root\",ctypes.c_void_p),\n    ]\nre_registers = OnigRegion\n\nOnigOptionType = ctypes.c_int\n\nclass OnigEncodingType(ctypes.Structure):\n    _fields_ = [\n        (\"mbc_enc_len\",     ctypes.c_void_p),\n        (\"name\",            ctypes.c_char_p),\n        (\"max_enc_len\",     ctypes.c_int),\n        (\"min_enc_len\",     ctypes.c_int),\n        (\"is_mbc_newline\",  ctypes.c_void_p),\n        (\"mbc_to_code\",     ctypes.c_void_p),\n        (\"code_to_mbclen\",  ctypes.c_void_p),\n        (\"code_to_mbc\",     ctypes.c_void_p),\n        (\"mbc_case_fold\",   ctypes.c_void_p),\n        (\"apply_all_case_fold\",     ctypes.c_void_p),\n        (\"get_case_fold_codes_by_str\",  ctypes.c_void_p),\n        (\"property_name_to_ctype\",  ctypes.c_void_p),\n        (\"is_code_ctype\",           ctypes.c_void_p),\n        (\"get_ctype_code_range\",    ctypes.c_void_p),\n        (\"left_adjust_char_head\",   ctypes.c_void_p),\n        (\"is_allowed_reverse_match\",ctypes.c_void_p),\n    ]\nOnigEncoding = ctypes.POINTER(OnigEncodingType)\n\nclass OnigMetaCharTableType(ctypes.Structure):\n    _fields_ = [\n        (\"esc\",             OnigCodePoint),\n        (\"anychar\",         OnigCodePoint),\n        (\"anytime\",         OnigCodePoint),\n        (\"zero_or_one_time\",OnigCodePoint),\n        (\"one_or_one_time\", OnigCodePoint),\n        (\"anychar_anytime\", OnigCodePoint),\n    ]\n\nclass OnigSyntaxType(ctypes.Structure):\n    _fields_ = [\n        (\"op\",              ctypes.c_uint),\n        (\"op2\",             ctypes.c_uint),\n        (\"behavior\",        ctypes.c_uint),\n        (\"options\",         OnigOptionType),\n        (\"meta_char_table\", OnigMetaCharTableType),\n    ]\n\nclass OnigErrorInfo(ctypes.Structure):\n    _fields_ = [\n        (\"enc\",     OnigEncoding),\n        (\"par\",     ctypes.c_char_p),\n        (\"par_end\", ctypes.c_char_p),\n    ]\n\n\n# load the DLL or the shared library\n\nif os.name in (\"nt\", \"ce\"):\n    _libname = \"onig.dll\"\nelif sys.platform == \"cygwin\":\n    _libname = \"libonig.dll\"\nelse:\n    _libname = \"libonig.so\"\n\nlibonig = ctypes.cdll.LoadLibrary(_libname)\n\n#\n# Encodings\n#\ndef _load_encoding(enc):\n    return ctypes.pointer(OnigEncodingType.in_dll(libonig, enc))\n\nONIG_ENCODING_ASCII         = _load_encoding(\"OnigEncodingASCII\")\nONIG_ENCODING_ISO_8859_1    = _load_encoding(\"OnigEncodingISO_8859_1\")\nONIG_ENCODING_ISO_8859_2    = _load_encoding(\"OnigEncodingISO_8859_2\")\nONIG_ENCODING_ISO_8859_3    = _load_encoding(\"OnigEncodingISO_8859_3\")\nONIG_ENCODING_ISO_8859_4    = _load_encoding(\"OnigEncodingISO_8859_4\")\nONIG_ENCODING_ISO_8859_5    = _load_encoding(\"OnigEncodingISO_8859_5\")\nONIG_ENCODING_ISO_8859_6    = _load_encoding(\"OnigEncodingISO_8859_6\")\nONIG_ENCODING_ISO_8859_7    = _load_encoding(\"OnigEncodingISO_8859_7\")\nONIG_ENCODING_ISO_8859_8    = _load_encoding(\"OnigEncodingISO_8859_8\")\nONIG_ENCODING_ISO_8859_9    = _load_encoding(\"OnigEncodingISO_8859_9\")\nONIG_ENCODING_ISO_8859_10   = _load_encoding(\"OnigEncodingISO_8859_10\")\nONIG_ENCODING_ISO_8859_11   = _load_encoding(\"OnigEncodingISO_8859_11\")\nONIG_ENCODING_ISO_8859_13   = _load_encoding(\"OnigEncodingISO_8859_13\")\nONIG_ENCODING_ISO_8859_14   = _load_encoding(\"OnigEncodingISO_8859_14\")\nONIG_ENCODING_ISO_8859_15   = _load_encoding(\"OnigEncodingISO_8859_15\")\nONIG_ENCODING_ISO_8859_16   = _load_encoding(\"OnigEncodingISO_8859_16\")\nONIG_ENCODING_UTF8          = _load_encoding(\"OnigEncodingUTF8\")\nONIG_ENCODING_UTF16_LE      = _load_encoding(\"OnigEncodingUTF16_LE\")\nONIG_ENCODING_UTF16_BE      = _load_encoding(\"OnigEncodingUTF16_BE\")\nONIG_ENCODING_UTF32_LE      = _load_encoding(\"OnigEncodingUTF32_LE\")\nONIG_ENCODING_UTF32_BE      = _load_encoding(\"OnigEncodingUTF32_BE\")\nONIG_ENCODING_EUC_JP        = _load_encoding(\"OnigEncodingEUC_JP\")\nONIG_ENCODING_EUC_TW        = _load_encoding(\"OnigEncodingEUC_TW\")\nONIG_ENCODING_EUC_KR        = _load_encoding(\"OnigEncodingEUC_KR\")\nONIG_ENCODING_EUC_CN        = _load_encoding(\"OnigEncodingEUC_CN\")\nONIG_ENCODING_SJIS          = _load_encoding(\"OnigEncodingSJIS\")\ntry:\n    ONIG_ENCODING_CP932     = _load_encoding(\"OnigEncodingCP932\")\nexcept ValueError:\n    pass\n#ONIG_ENCODING_KOI8         = _load_encoding(\"OnigEncodingKOI8\")\nONIG_ENCODING_KOI8_R        = _load_encoding(\"OnigEncodingKOI8_R\")\nONIG_ENCODING_CP1251        = _load_encoding(\"OnigEncodingCP1251\")\nONIG_ENCODING_BIG5          = _load_encoding(\"OnigEncodingBIG5\")\nONIG_ENCODING_GB18030       = _load_encoding(\"OnigEncodingGB18030\")\n\n#ONIG_ENCODING_UNDEF         = None\n\n\n#\n# Syntaxes\n#\ndef _load_syntax(syn):\n    return ctypes.pointer(OnigSyntaxType.in_dll(libonig, syn))\n\nONIG_SYNTAX_ASIS            = _load_syntax(\"OnigSyntaxASIS\")\nONIG_SYNTAX_POSIX_BASIC     = _load_syntax(\"OnigSyntaxPosixBasic\")\nONIG_SYNTAX_POSIX_EXTENDED  = _load_syntax(\"OnigSyntaxPosixExtended\")\nONIG_SYNTAX_EMACS           = _load_syntax(\"OnigSyntaxEmacs\")\nONIG_SYNTAX_GREP            = _load_syntax(\"OnigSyntaxGrep\")\nONIG_SYNTAX_GNU_REGEX       = _load_syntax(\"OnigSyntaxGnuRegex\")\nONIG_SYNTAX_JAVA            = _load_syntax(\"OnigSyntaxJava\")\nONIG_SYNTAX_PERL            = _load_syntax(\"OnigSyntaxPerl\")\ntry:\n    ONIG_SYNTAX_PERL58      = _load_syntax(\"OnigSyntaxPerl58\")\n    ONIG_SYNTAX_PERL58_NG   = _load_syntax(\"OnigSyntaxPerl58_NG\")\nexcept ValueError:\n    pass\ntry:\n    ONIG_SYNTAX_PERL_NG     = _load_syntax(\"OnigSyntaxPerl_NG\")\nexcept ValueError:\n    pass\nONIG_SYNTAX_RUBY            = _load_syntax(\"OnigSyntaxRuby\")\ntry:\n    ONIG_SYNTAX_PYTHON      = _load_syntax(\"OnigSyntaxPython\")\nexcept ValueError:\n    pass\n\nONIG_SYNTAX_DEFAULT         = ctypes.POINTER(OnigSyntaxType).in_dll(\n                                    libonig, \"OnigDefaultSyntax\")\n\n\n#\n# Constants\n#\n\nONIG_MAX_ERROR_MESSAGE_LEN = 90\n\n# options\nONIG_OPTION_NONE                = 0\nONIG_OPTION_IGNORECASE          = 1\nONIG_OPTION_EXTEND              = (ONIG_OPTION_IGNORECASE         << 1)\nONIG_OPTION_MULTILINE           = (ONIG_OPTION_EXTEND             << 1)\nONIG_OPTION_DOTALL              =  ONIG_OPTION_MULTILINE\nONIG_OPTION_SINGLELINE          = (ONIG_OPTION_MULTILINE          << 1)\nONIG_OPTION_FIND_LONGEST        = (ONIG_OPTION_SINGLELINE         << 1)\nONIG_OPTION_FIND_NOT_EMPTY      = (ONIG_OPTION_FIND_LONGEST       << 1)\nONIG_OPTION_NEGATE_SINGLELINE   = (ONIG_OPTION_FIND_NOT_EMPTY     << 1)\nONIG_OPTION_DONT_CAPTURE_GROUP  = (ONIG_OPTION_NEGATE_SINGLELINE  << 1)\nONIG_OPTION_CAPTURE_GROUP       = (ONIG_OPTION_DONT_CAPTURE_GROUP << 1)\n# options (search time)\nONIG_OPTION_NOTBOL              = (ONIG_OPTION_CAPTURE_GROUP << 1)\nONIG_OPTION_NOTEOL              = (ONIG_OPTION_NOTBOL << 1)\nONIG_OPTION_POSIX_REGION        = (ONIG_OPTION_NOTEOL << 1)\n# options (ctype range)\nONIG_OPTION_ASCII_RANGE         = (ONIG_OPTION_POSIX_REGION << 1)\nONIG_OPTION_POSIX_BRACKET_ALL_RANGE = (ONIG_OPTION_ASCII_RANGE << 1)\nONIG_OPTION_WORD_BOUND_ALL_RANGE    = (ONIG_OPTION_POSIX_BRACKET_ALL_RANGE << 1)\n# options (newline)\nONIG_OPTION_NEWLINE_CRLF        = (ONIG_OPTION_WORD_BOUND_ALL_RANGE << 1)\n\nONIG_OPTION_DEFAULT             = ONIG_OPTION_NONE\n\n\n# syntax (operators)\nONIG_SYN_OP_VARIABLE_META_CHARACTERS    = (1<<0)\nONIG_SYN_OP_DOT_ANYCHAR                 = (1<<1)\nONIG_SYN_OP_ASTERISK_ZERO_INF           = (1<<2)\nONIG_SYN_OP_ESC_ASTERISK_ZERO_INF       = (1<<3)\nONIG_SYN_OP_PLUS_ONE_INF                = (1<<4)\nONIG_SYN_OP_ESC_PLUS_ONE_INF            = (1<<5)\nONIG_SYN_OP_QMARK_ZERO_ONE              = (1<<6)\nONIG_SYN_OP_ESC_QMARK_ZERO_ONE          = (1<<7)\nONIG_SYN_OP_BRACE_INTERVAL              = (1<<8)\nONIG_SYN_OP_ESC_BRACE_INTERVAL          = (1<<9)\nONIG_SYN_OP_VBAR_ALT                    = (1<<10)\nONIG_SYN_OP_ESC_VBAR_ALT                = (1<<11)\nONIG_SYN_OP_LPAREN_SUBEXP               = (1<<12)\nONIG_SYN_OP_ESC_LPAREN_SUBEXP           = (1<<13)\nONIG_SYN_OP_ESC_AZ_BUF_ANCHOR           = (1<<14)\nONIG_SYN_OP_ESC_CAPITAL_G_BEGIN_ANCHOR  = (1<<15)\nONIG_SYN_OP_DECIMAL_BACKREF             = (1<<16)\nONIG_SYN_OP_BRACKET_CC                  = (1<<17)\nONIG_SYN_OP_ESC_W_WORD                  = (1<<18)\nONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END     = (1<<19)\nONIG_SYN_OP_ESC_B_WORD_BOUND            = (1<<20)\nONIG_SYN_OP_ESC_S_WHITE_SPACE           = (1<<21)\nONIG_SYN_OP_ESC_D_DIGIT                 = (1<<22)\nONIG_SYN_OP_LINE_ANCHOR                 = (1<<23)\nONIG_SYN_OP_POSIX_BRACKET               = (1<<24)\nONIG_SYN_OP_QMARK_NON_GREEDY            = (1<<25)\nONIG_SYN_OP_ESC_CONTROL_CHARS           = (1<<26)\nONIG_SYN_OP_ESC_C_CONTROL               = (1<<27)\nONIG_SYN_OP_ESC_OCTAL3                  = (1<<28)\nONIG_SYN_OP_ESC_X_HEX2                  = (1<<29)\nONIG_SYN_OP_ESC_X_BRACE_HEX8            = (1<<30)\nONIG_SYN_OP_ESC_O_BRACE_OCTAL           = (1<<31)\n\nONIG_SYN_OP2_ESC_CAPITAL_Q_QUOTE        = (1<<0)\nONIG_SYN_OP2_QMARK_GROUP_EFFECT         = (1<<1)\nONIG_SYN_OP2_OPTION_PERL                = (1<<2)\nONIG_SYN_OP2_OPTION_RUBY                = (1<<3)\nONIG_SYN_OP2_PLUS_POSSESSIVE_REPEAT     = (1<<4)\nONIG_SYN_OP2_PLUS_POSSESSIVE_INTERVAL   = (1<<5)\nONIG_SYN_OP2_CCLASS_SET_OP              = (1<<6)\nONIG_SYN_OP2_QMARK_LT_NAMED_GROUP       = (1<<7)\nONIG_SYN_OP2_ESC_K_NAMED_BACKREF        = (1<<8)\nONIG_SYN_OP2_ESC_G_SUBEXP_CALL          = (1<<9)\nONIG_SYN_OP2_ATMARK_CAPTURE_HISTORY     = (1<<10)\nONIG_SYN_OP2_ESC_CAPITAL_C_BAR_CONTROL  = (1<<11)\nONIG_SYN_OP2_ESC_CAPITAL_M_BAR_META     = (1<<12)\nONIG_SYN_OP2_ESC_V_VTAB                 = (1<<13)\nONIG_SYN_OP2_ESC_U_HEX4                 = (1<<14)\nONIG_SYN_OP2_ESC_GNU_BUF_ANCHOR         = (1<<15)\nONIG_SYN_OP2_ESC_P_BRACE_CHAR_PROPERTY  = (1<<16)\nONIG_SYN_OP2_ESC_P_BRACE_CIRCUMFLEX_NOT = (1<<17)\n#ONIG_SYN_OP2_CHAR_PROPERTY_PREFIX_IS   = (1<<18)\nONIG_SYN_OP2_ESC_H_XDIGIT               = (1<<19)\nONIG_SYN_OP2_INEFFECTIVE_ESCAPE         = (1<<20)\nONIG_SYN_OP2_ESC_CAPITAL_R_LINEBREAK    = (1<<21)\nONIG_SYN_OP2_ESC_CAPITAL_X_EXTENDED_GRAPHEME_CLUSTER = (1<<22)\nONIG_SYN_OP2_ESC_V_VERTICAL_WHITESPACE   = (1<<23)\nONIG_SYN_OP2_ESC_H_HORIZONTAL_WHITESPACE = (1<<24)\nONIG_SYN_OP2_ESC_CAPITAL_K_KEEP          = (1<<25)\nONIG_SYN_OP2_ESC_G_BRACE_BACKREF         = (1<<26)\nONIG_SYN_OP2_QMARK_SUBEXP_CALL           = (1<<27)\nONIG_SYN_OP2_QMARK_VBAR_BRANCH_RESET     = (1<<28)\nONIG_SYN_OP2_QMARK_LPAREN_CONDITION      = (1<<29)\nONIG_SYN_OP2_QMARK_CAPITAL_P_NAMED_GROUP = (1<<30)\nONIG_SYN_OP2_OPTION_JAVA                 = (1<<31)\n\n# syntax (behavior)\nONIG_SYN_CONTEXT_INDEP_ANCHORS           = (1<<31)\nONIG_SYN_CONTEXT_INDEP_REPEAT_OPS        = (1<<0)\nONIG_SYN_CONTEXT_INVALID_REPEAT_OPS      = (1<<1)\nONIG_SYN_ALLOW_UNMATCHED_CLOSE_SUBEXP    = (1<<2)\nONIG_SYN_ALLOW_INVALID_INTERVAL          = (1<<3)\nONIG_SYN_ALLOW_INTERVAL_LOW_ABBREV       = (1<<4)\nONIG_SYN_STRICT_CHECK_BACKREF            = (1<<5)\nONIG_SYN_DIFFERENT_LEN_ALT_LOOK_BEHIND   = (1<<6)\nONIG_SYN_CAPTURE_ONLY_NAMED_GROUP        = (1<<7)\nONIG_SYN_ALLOW_MULTIPLEX_DEFINITION_NAME = (1<<8)\nONIG_SYN_FIXED_INTERVAL_IS_GREEDY_ONLY   = (1<<9)\nONIG_SYN_ALLOW_MULTIPLEX_DEFINITION_NAME_CALL = (1<<10)\n\n# (behavior) in char class [...]\nONIG_SYN_POSIX_BRACKET_ALWAYS_ALL_RANGE = (1<<19)\nONIG_SYN_NOT_NEWLINE_IN_NEGATIVE_CC     = (1<<20)\nONIG_SYN_BACKSLASH_ESCAPE_IN_CC         = (1<<21)\nONIG_SYN_ALLOW_EMPTY_RANGE_IN_CC        = (1<<22)\nONIG_SYN_ALLOW_DOUBLE_RANGE_OP_IN_CC    = (1<<23)\n# syntax (behavior) warning\nONIG_SYN_WARN_CC_OP_NOT_ESCAPED         = (1<<24)\nONIG_SYN_WARN_REDUNDANT_NESTED_REPEAT   = (1<<25)\n\n# meta character specifiers (onig_set_meta_char())\nONIG_META_CHAR_ESCAPE               = 0\nONIG_META_CHAR_ANYCHAR              = 1\nONIG_META_CHAR_ANYTIME              = 2\nONIG_META_CHAR_ZERO_OR_ONE_TIME     = 3\nONIG_META_CHAR_ONE_OR_MORE_TIME     = 4\nONIG_META_CHAR_ANYCHAR_ANYTIME      = 5\n\nONIG_INEFFECTIVE_META_CHAR          = 0\n\n\n# error codes\ndef ONIG_IS_PATTERN_ERROR(ecode):\n    return ((ecode) <= -100 and (ecode) > -1000)\n# normal return\nONIG_NORMAL             =  0\nONIG_MISMATCH           = -1\nONIG_NO_SUPPORT_CONFIG  = -2\n# internal error\n# general error\nONIGERR_INVALID_ARGUMENT    = -30\n# syntax error\n# values error (syntax error)\n# errors related to thread\nONIGERR_OVER_THREAD_PASS_LIMIT_COUNT    = -1001\n\n\n#\n# Onigmo APIs\n#\n\n# onig_init\nonig_init = libonig.onig_init\n\n# onig_error_code_to_str\nlibonig.onig_error_code_to_str.argtypes = [ctypes.c_char_p, ctypes.c_int,\n        ctypes.POINTER(OnigErrorInfo)]\ndef onig_error_code_to_str(err_buf, err_code, err_info=None):\n    return libonig.onig_error_code_to_str(err_buf, err_code, err_info)\n\n# onig_set_warn_func\n# onig_set_verb_warn_func\n\n# onig_new\nlibonig.onig_new.argtypes = [ctypes.POINTER(OnigRegex),\n        ctypes.c_void_p, ctypes.c_void_p,\n        OnigOptionType, OnigEncoding, ctypes.POINTER(OnigSyntaxType),\n        ctypes.POINTER(OnigErrorInfo)]\nonig_new = libonig.onig_new\n\n# onig_reg_init\n# onig_new_without_alloc\n# onig_new_deluxe\n\n# onig_free\nlibonig.onig_free.argtypes = [OnigRegex]\nonig_free = libonig.onig_free\n\n# onig_free_body\n# onig_recompile\n# onig_recompile_deluxe\n\n# onig_search\nlibonig.onig_search.argtypes = [OnigRegex,\n        ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p,\n        ctypes.POINTER(OnigRegion), OnigOptionType]\nlibonig.onig_search.restype = _c_ssize_t\nonig_search = libonig.onig_search\n\n# onig_search_gpos\n\n# onig_match\nlibonig.onig_match.argtypes = [OnigRegex,\n        ctypes.c_void_p, ctypes.c_void_p, ctypes.c_void_p,\n        ctypes.POINTER(OnigRegion), OnigOptionType]\nlibonig.onig_match.restype = _c_ssize_t\nonig_match = libonig.onig_match\n\n# onig_region_new\nlibonig.onig_region_new.argtypes = []\nlibonig.onig_region_new.restype = ctypes.POINTER(OnigRegion)\nonig_region_new = libonig.onig_region_new\n\n# onig_region_init\n\n# onig_region_free\nlibonig.onig_region_free.argtypes = [ctypes.POINTER(OnigRegion), ctypes.c_int]\nonig_region_free = libonig.onig_region_free\n\n# onig_region_copy\n# onig_region_clear\n# onig_region_resize\n# onig_region_set\n# onig_name_to_group_numbers\n# onig_name_to_backref_number\n# onig_foreach_name\n# onig_number_of_names\n# onig_number_of_captures\n# onig_number_of_capture_histories\n# onig_get_capture_tree\n# onig_capture_tree_traverse\n# onig_noname_group_capture_is_active\n# onig_get_encoding\n# onig_get_options\n# onig_get_case_fold_flag\n# onig_get_syntax\n# onig_set_default_syntax\n\n# onig_copy_syntax\nlibonig.onig_copy_syntax.argtypes = [ctypes.POINTER(OnigSyntaxType),\n        ctypes.POINTER(OnigSyntaxType)]\nonig_copy_syntax = libonig.onig_copy_syntax\n\n# onig_get_syntax_op\n# onig_get_syntax_op2\n# onig_get_syntax_behavior\n# onig_get_syntax_options\n# onig_set_syntax_op\n# onig_set_syntax_op2\n# onig_set_syntax_behavior\n# onig_set_syntax_options\n# onig_set_meta_char\n# onig_copy_encoding\n# onig_get_default_case_fold_flag\n# onig_set_default_case_fold_flag\n# onig_get_match_stack_limit_size\n# onig_set_match_stack_limit_size\n\n# onig_end\nlibonig.onig_end.argtypes = []\nonig_end = libonig.onig_end\n\n# onig_version\nlibonig.onig_version.argtypes = []\nlibonig.onig_version.restype = ctypes.c_char_p\ndef onig_version():\n    return libonig.onig_version().decode()\n\n# onig_copyright\nlibonig.onig_copyright.argtypes = []\nlibonig.onig_copyright.restype = ctypes.c_char_p\ndef onig_copyright():\n    return libonig.onig_copyright().decode()\n"
  },
  {
    "path": "src/Onigmo/oniggnu.h",
    "content": "#ifndef ONIGGNU_H\n#define ONIGGNU_H\n/**********************************************************************\n  oniggnu.h - Oniguruma (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2005  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"oniguruma.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define RE_MBCTYPE_ASCII         0\n#define RE_MBCTYPE_EUC           1\n#define RE_MBCTYPE_SJIS          2\n#define RE_MBCTYPE_UTF8          3\n\n/* GNU regex options */\n#ifndef RE_NREGS\n#define RE_NREGS                ONIG_NREGION\n#endif\n\n#define RE_OPTION_IGNORECASE         ONIG_OPTION_IGNORECASE\n#define RE_OPTION_EXTENDED           ONIG_OPTION_EXTEND\n#define RE_OPTION_MULTILINE          ONIG_OPTION_MULTILINE\n#define RE_OPTION_SINGLELINE         ONIG_OPTION_SINGLELINE\n#define RE_OPTION_LONGEST            ONIG_OPTION_FIND_LONGEST\n#define RE_OPTION_POSIXLINE         (RE_OPTION_MULTILINE|RE_OPTION_SINGLELINE)\n#define RE_OPTION_FIND_NOT_EMPTY     ONIG_OPTION_FIND_NOT_EMPTY\n#define RE_OPTION_NEGATE_SINGLELINE  ONIG_OPTION_NEGATE_SINGLELINE\n#define RE_OPTION_DONT_CAPTURE_GROUP ONIG_OPTION_DONT_CAPTURE_GROUP\n#define RE_OPTION_CAPTURE_GROUP      ONIG_OPTION_CAPTURE_GROUP\n\n\nONIG_EXTERN\nvoid re_mbcinit P_((int));\nONIG_EXTERN\nint re_compile_pattern P_((const char*, int, struct re_pattern_buffer*, char* err_buf));\nONIG_EXTERN\nint re_recompile_pattern P_((const char*, int, struct re_pattern_buffer*, char* err_buf));\nONIG_EXTERN\nvoid re_free_pattern P_((struct re_pattern_buffer*));\nONIG_EXTERN\nint re_adjust_startpos P_((struct re_pattern_buffer*, const char*, int, int, int));\nONIG_EXTERN\nint re_search P_((OnigIterator* it, struct re_pattern_buffer*, OnigPosition, OnigPosition, OnigPosition, OnigPosition, struct re_registers*));\nONIG_EXTERN\nint re_match P_((OnigIterator* it, struct re_pattern_buffer*, OnigPosition, OnigPosition, OnigPosition, struct re_registers*));\nONIG_EXTERN\nvoid re_set_casetable P_((const char*));\nONIG_EXTERN\nvoid re_free_registers P_((struct re_registers*));\nONIG_EXTERN\nint re_alloc_pattern P_((struct re_pattern_buffer**));  /* added */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ONIGGNU_H */\n"
  },
  {
    "path": "src/Onigmo/onigposix.h",
    "content": "#ifndef ONIGPOSIX_H\n#define ONIGPOSIX_H\n/**********************************************************************\n  onigposix.h - Oniguruma (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2005  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n#include <stdlib.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* options */\n#define REG_ICASE          (1<<0)\n#define REG_NEWLINE        (1<<1)\n#define REG_NOTBOL         (1<<2)\n#define REG_NOTEOL         (1<<3)\n#define REG_EXTENDED       (1<<4) /* if not set, Basic Onigular Expression */\n#define REG_NOSUB          (1<<5)\n\n/* POSIX error codes */\n#define REG_NOMATCH          1\n#define REG_BADPAT           2\n#define REG_ECOLLATE         3\n#define REG_ECTYPE           4\n#define REG_EESCAPE          5\n#define REG_ESUBREG          6\n#define REG_EBRACK           7\n#define REG_EPAREN           8\n#define REG_EBRACE           9\n#define REG_BADBR           10\n#define REG_ERANGE          11\n#define REG_ESPACE          12\n#define REG_BADRPT          13\n\n/* extended error codes */\n#define REG_EONIG_INTERNAL  14\n#define REG_EONIG_BADWC     15\n#define REG_EONIG_BADARG    16\n#define REG_EONIG_THREAD    17\n\n/* character encodings (for reg_set_encoding()) */\n#define REG_POSIX_ENCODING_ASCII     0\n#define REG_POSIX_ENCODING_EUC_JP    1\n#define REG_POSIX_ENCODING_SJIS      2\n#define REG_POSIX_ENCODING_UTF8      3\n#define REG_POSIX_ENCODING_UTF16_BE  4\n#define REG_POSIX_ENCODING_UTF16_LE  5\n\n\ntypedef int regoff_t;\n\ntypedef struct {\n  regoff_t  rm_so;\n  regoff_t  rm_eo;\n} regmatch_t;\n\n/* POSIX regex_t */\ntypedef struct {\n  void*   onig;          /* Oniguruma regex_t*  */\n  size_t  re_nsub;\n  int     comp_options;\n} regex_t;\n\n\n#ifndef P_\n#if defined(__STDC__) || defined(_WIN32)\n# define P_(args) args\n#else\n# define P_(args) ()\n#endif\n#endif\n\n#ifndef ONIG_EXTERN\n#if defined(_WIN32) && !defined(__GNUC__)\n#if defined(EXPORT)\n#define ONIG_EXTERN   extern __declspec(dllexport)\n#else\n#define ONIG_EXTERN   extern __declspec(dllimport)\n#endif\n#endif\n#endif\n\n#ifndef ONIG_EXTERN\n#define ONIG_EXTERN   extern\n#endif\n\n#ifndef ONIGURUMA_H\ntypedef unsigned int        OnigOptionType;\n\n/* syntax */\ntypedef struct {\n  unsigned int op;\n  unsigned int op2;\n  unsigned int behavior;\n  OnigOptionType options;    /* default option */\n} OnigSyntaxType;\n\nONIG_EXTERN OnigSyntaxType OnigSyntaxPosixBasic;\nONIG_EXTERN OnigSyntaxType OnigSyntaxPosixExtended;\nONIG_EXTERN OnigSyntaxType OnigSyntaxEmacs;\nONIG_EXTERN OnigSyntaxType OnigSyntaxGrep;\nONIG_EXTERN OnigSyntaxType OnigSyntaxGnuRegex;\nONIG_EXTERN OnigSyntaxType OnigSyntaxJava;\nONIG_EXTERN OnigSyntaxType OnigSyntaxPerl;\nONIG_EXTERN OnigSyntaxType OnigSyntaxRuby;\n\n/* predefined syntaxes (see regsyntax.c) */\n#define ONIG_SYNTAX_POSIX_BASIC        (&OnigSyntaxPosixBasic)\n#define ONIG_SYNTAX_POSIX_EXTENDED     (&OnigSyntaxPosixExtended)\n#define ONIG_SYNTAX_EMACS              (&OnigSyntaxEmacs)\n#define ONIG_SYNTAX_GREP               (&OnigSyntaxGrep)\n#define ONIG_SYNTAX_GNU_REGEX          (&OnigSyntaxGnuRegex)\n#define ONIG_SYNTAX_JAVA               (&OnigSyntaxJava)\n#define ONIG_SYNTAX_PERL               (&OnigSyntaxPerl)\n#define ONIG_SYNTAX_RUBY               (&OnigSyntaxRuby)\n/* default syntax */\n#define ONIG_SYNTAX_DEFAULT             OnigDefaultSyntax\n\nONIG_EXTERN OnigSyntaxType*  OnigDefaultSyntax;\n\nONIG_EXTERN int  onig_set_default_syntax P_((OnigSyntaxType* syntax));\nONIG_EXTERN void onig_copy_syntax P_((OnigSyntaxType* to, OnigSyntaxType* from));\nONIG_EXTERN const char* onig_version P_((void));\nONIG_EXTERN const char* onig_copyright P_((void));\n\n#endif /* ONIGURUMA_H */\n\n\nONIG_EXTERN int    regcomp P_((regex_t* reg, const char* pat, int options));\nONIG_EXTERN OnigPosition regexec P_((OnigIterator* it, regex_t* reg, OnigPosition str, size_t nmatch, regmatch_t* matches, int options));\nONIG_EXTERN void   regfree P_((regex_t* reg));\nONIG_EXTERN size_t regerror P_((int code, const regex_t* reg, char* buf, size_t size));\n\n/* extended API */\nONIG_EXTERN void reg_set_encoding P_((int enc));\nONIG_EXTERN int  reg_name_to_group_numbers P_((regex_t* reg, const unsigned char* name, const unsigned char* name_end, int** nums));\nONIG_EXTERN int  reg_foreach_name P_((regex_t* reg, int (*func)(const unsigned char*, const unsigned char*,int,int*,regex_t*,void*), void* arg));\nONIG_EXTERN int  reg_number_of_names P_((regex_t* reg));\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ONIGPOSIX_H */\n"
  },
  {
    "path": "src/Onigmo/oniguruma.h",
    "content": "#ifndef ONIGURUMA_H\n#define ONIGURUMA_H\n/**********************************************************************\n  oniguruma.h - Onigmo (Oniguruma-mod) (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2009  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * Copyright (c) 2011-2013  K.Takata  <kentkt AT csc DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define ONIGURUMA\n#define ONIGURUMA_VERSION_MAJOR   5\n#define ONIGURUMA_VERSION_MINOR   13\n#define ONIGURUMA_VERSION_TEENY   5\n\n#ifdef __cplusplus\n# ifndef  HAVE_PROTOTYPES\n#  define HAVE_PROTOTYPES 1\n# endif\n# ifndef  HAVE_STDARG_PROTOTYPES\n#  define HAVE_STDARG_PROTOTYPES 1\n# endif\n#endif\n\n/* escape Mac OS X/Xcode 2.4/gcc 4.0.1 problem */\n#if defined(__APPLE__) && defined(__GNUC__) && __GNUC__ >= 4\n# ifndef  HAVE_STDARG_PROTOTYPES\n#  define HAVE_STDARG_PROTOTYPES 1\n# endif\n#endif\n\n#ifdef HAVE_STDARG_H\n# ifndef  HAVE_STDARG_PROTOTYPES\n#  define HAVE_STDARG_PROTOTYPES 1\n# endif\n#endif\n\n#ifndef P_\n#if defined(__STDC__) || defined(_WIN32)\n# define P_(args) args\n#else\n# define P_(args) ()\n#endif\n#endif\n\n#ifndef PV_\n#ifdef HAVE_STDARG_PROTOTYPES\n# define PV_(args) args\n#else\n# define PV_(args) ()\n#endif\n#endif\n\n#ifndef ONIG_EXTERN\n#if defined(_WIN32) && !defined(__GNUC__)\n#if defined(EXPORT) || defined(RUBY_EXPORT)\n#define ONIG_EXTERN   extern __declspec(dllexport)\n#else\n#define ONIG_EXTERN   extern __declspec(dllimport)\n#endif\n#endif\n#endif\n\n#ifndef ONIG_EXTERN\n#define ONIG_EXTERN   extern\n#endif\n\n#include <stddef.h>\t\t/* for size_t */\n\n/* PART: character encoding */\n\n#ifndef ONIG_ESCAPE_UCHAR_COLLISION\n#define UChar OnigUChar\n#endif\n\ntypedef unsigned char  OnigUChar;\ntypedef unsigned int   OnigCodePoint;\ntypedef unsigned int   OnigCtype;\n\ntypedef size_t         OnigDistance;\n#define ONIG_INFINITE_DISTANCE  ~((OnigDistance )0)\n\n#if defined(_MSC_VER)\ntypedef __int64\t\t\t\t\tOnigPosition;\n#else\ntypedef long long\t\t\t\tOnigPosition;\n#endif\n#define ONIG_BADPOS             -1\n#define ONIG_IS_BADPOS(p)       (p == ONIG_BADPOS)\n#define ONIG_IS_NOT_BADPOS(p)   (p != ONIG_BADPOS)\n\ntypedef UChar (*OnigCharAtFunc)(OnigPosition pos, const void* ptr);\ntypedef struct OnigIteratorStruct {\n\tOnigCharAtFunc at;\n\tconst void* ptr;\n} OnigIterator;\n\n#define ONIG_CHARAT(pos)       (it->at(pos, it->ptr))\n\n/* Iterator API */\nONIG_EXTERN\nUChar onig_default_charat P_((OnigPosition pos, const void* ptr));\n\ntypedef unsigned int OnigCaseFoldType; /* case fold flag */\n\nONIG_EXTERN OnigCaseFoldType OnigDefaultCaseFoldFlag;\n\n/* #define ONIGENC_CASE_FOLD_HIRAGANA_KATAKANA  (1<<1) */\n/* #define ONIGENC_CASE_FOLD_KATAKANA_WIDTH     (1<<2) */\n#define ONIGENC_CASE_FOLD_TURKISH_AZERI         (1<<20)\n#define INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR   (1<<30)\n\n#define ONIGENC_CASE_FOLD_MIN      INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR\n#define ONIGENC_CASE_FOLD_DEFAULT  OnigDefaultCaseFoldFlag\n\n\n#define ONIGENC_MAX_COMP_CASE_FOLD_CODE_LEN       3\n#define ONIGENC_GET_CASE_FOLD_CODES_MAX_NUM      13\n/* 13 => Unicode:0x1ffc */\n\n/* code range */\n#define ONIGENC_CODE_RANGE_NUM(range)     ((int )range[0])\n#define ONIGENC_CODE_RANGE_FROM(range,i)  range[((i)*2) + 1]\n#define ONIGENC_CODE_RANGE_TO(range,i)    range[((i)*2) + 2]\n\ntypedef struct {\n  int byte_len;  /* argument(original) character(s) byte length */\n  int code_len;  /* number of code */\n  OnigCodePoint code[ONIGENC_MAX_COMP_CASE_FOLD_CODE_LEN];\n} OnigCaseFoldCodeItem;\n\ntypedef struct {\n  OnigCodePoint esc;\n  OnigCodePoint anychar;\n  OnigCodePoint anytime;\n  OnigCodePoint zero_or_one_time;\n  OnigCodePoint one_or_more_time;\n  OnigCodePoint anychar_anytime;\n} OnigMetaCharTableType;\n\ntypedef int (*OnigApplyAllCaseFoldFunc)(OnigCodePoint from, OnigCodePoint* to, int to_len, void* arg);\n\ntypedef struct OnigEncodingTypeST {\n  int    (*mbc_enc_len)(const OnigUChar* p);\n  int    (*mbc_enc_len_se)(OnigIterator* it, OnigPosition p);\n  const char*   name;\n  int           max_enc_len;\n  int           min_enc_len;\n  int    (*is_mbc_newline)(const OnigUChar* p, const OnigUChar* end);\n  int    (*is_mbc_newline_se)(OnigIterator* it, OnigPosition p, OnigPosition end);\n  OnigCodePoint (*mbc_to_code)(const OnigUChar* p, const OnigUChar* end);\n  OnigCodePoint (*mbc_to_code_se)(OnigIterator* it, OnigPosition p, OnigPosition end);\n  int    (*code_to_mbclen)(OnigCodePoint code);\n  int    (*code_to_mbc)(OnigCodePoint code, OnigUChar *buf);\n  int    (*mbc_case_fold)(OnigCaseFoldType flag, const OnigUChar** pp, const OnigUChar* end, OnigUChar* to);\n  int    (*mbc_case_fold_se)(OnigIterator* it, OnigCaseFoldType flag, OnigPosition* pp, OnigPosition end, OnigUChar* to);\n  int    (*apply_all_case_fold)(OnigCaseFoldType flag, OnigApplyAllCaseFoldFunc f, void* arg);\n  int    (*get_case_fold_codes_by_str)(OnigCaseFoldType flag, const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem acs[]);\n  int    (*property_name_to_ctype)(struct OnigEncodingTypeST* enc, OnigUChar* p, OnigUChar* end);\n  int    (*is_code_ctype)(OnigCodePoint code, OnigCtype ctype);\n  int    (*get_ctype_code_range)(OnigCtype ctype, OnigCodePoint* sb_out, const OnigCodePoint* ranges[]);\n  OnigUChar* (*left_adjust_char_head)(const OnigUChar* start, const OnigUChar* p);\n  OnigPosition (*left_adjust_char_head_se)(OnigIterator* it, OnigPosition start, OnigPosition p);\n  int    (*is_allowed_reverse_match)(const OnigUChar* p, const OnigUChar* end);\n  unsigned int  flags;\n} OnigEncodingType;\n\ntypedef OnigEncodingType* OnigEncoding;\n\nONIG_EXTERN OnigEncodingType OnigEncodingASCII;\nONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_1;\nONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_2;\nONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_3;\nONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_4;\nONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_5;\nONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_6;\nONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_7;\nONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_8;\nONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_9;\nONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_10;\nONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_11;\nONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_13;\nONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_14;\nONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_15;\nONIG_EXTERN OnigEncodingType OnigEncodingISO_8859_16;\nONIG_EXTERN OnigEncodingType OnigEncodingUTF8;\nONIG_EXTERN OnigEncodingType OnigEncodingUTF16_BE;\nONIG_EXTERN OnigEncodingType OnigEncodingUTF16_LE;\nONIG_EXTERN OnigEncodingType OnigEncodingUTF32_BE;\nONIG_EXTERN OnigEncodingType OnigEncodingUTF32_LE;\nONIG_EXTERN OnigEncodingType OnigEncodingEUC_JP;\nONIG_EXTERN OnigEncodingType OnigEncodingEUC_TW;\nONIG_EXTERN OnigEncodingType OnigEncodingEUC_KR;\nONIG_EXTERN OnigEncodingType OnigEncodingEUC_CN;\nONIG_EXTERN OnigEncodingType OnigEncodingSJIS;\nONIG_EXTERN OnigEncodingType OnigEncodingCP932;\nONIG_EXTERN OnigEncodingType OnigEncodingKOI8;\nONIG_EXTERN OnigEncodingType OnigEncodingKOI8_R;\nONIG_EXTERN OnigEncodingType OnigEncodingCP1251;\nONIG_EXTERN OnigEncodingType OnigEncodingBIG5;\nONIG_EXTERN OnigEncodingType OnigEncodingGB18030;\n\n#define ONIG_ENCODING_ASCII        (&OnigEncodingASCII)\n#define ONIG_ENCODING_ISO_8859_1   (&OnigEncodingISO_8859_1)\n#define ONIG_ENCODING_ISO_8859_2   (&OnigEncodingISO_8859_2)\n#define ONIG_ENCODING_ISO_8859_3   (&OnigEncodingISO_8859_3)\n#define ONIG_ENCODING_ISO_8859_4   (&OnigEncodingISO_8859_4)\n#define ONIG_ENCODING_ISO_8859_5   (&OnigEncodingISO_8859_5)\n#define ONIG_ENCODING_ISO_8859_6   (&OnigEncodingISO_8859_6)\n#define ONIG_ENCODING_ISO_8859_7   (&OnigEncodingISO_8859_7)\n#define ONIG_ENCODING_ISO_8859_8   (&OnigEncodingISO_8859_8)\n#define ONIG_ENCODING_ISO_8859_9   (&OnigEncodingISO_8859_9)\n#define ONIG_ENCODING_ISO_8859_10  (&OnigEncodingISO_8859_10)\n#define ONIG_ENCODING_ISO_8859_11  (&OnigEncodingISO_8859_11)\n#define ONIG_ENCODING_ISO_8859_13  (&OnigEncodingISO_8859_13)\n#define ONIG_ENCODING_ISO_8859_14  (&OnigEncodingISO_8859_14)\n#define ONIG_ENCODING_ISO_8859_15  (&OnigEncodingISO_8859_15)\n#define ONIG_ENCODING_ISO_8859_16  (&OnigEncodingISO_8859_16)\n#define ONIG_ENCODING_UTF8         (&OnigEncodingUTF8)\n#define ONIG_ENCODING_UTF16_BE     (&OnigEncodingUTF16_BE)\n#define ONIG_ENCODING_UTF16_LE     (&OnigEncodingUTF16_LE)\n#define ONIG_ENCODING_UTF32_BE     (&OnigEncodingUTF32_BE)\n#define ONIG_ENCODING_UTF32_LE     (&OnigEncodingUTF32_LE)\n#define ONIG_ENCODING_EUC_JP       (&OnigEncodingEUC_JP)\n#define ONIG_ENCODING_EUC_TW       (&OnigEncodingEUC_TW)\n#define ONIG_ENCODING_EUC_KR       (&OnigEncodingEUC_KR)\n#define ONIG_ENCODING_EUC_CN       (&OnigEncodingEUC_CN)\n#define ONIG_ENCODING_SJIS         (&OnigEncodingSJIS)\n#define ONIG_ENCODING_CP932        (&OnigEncodingCP932)\n#define ONIG_ENCODING_KOI8         (&OnigEncodingKOI8)\n#define ONIG_ENCODING_KOI8_R       (&OnigEncodingKOI8_R)\n#define ONIG_ENCODING_CP1251       (&OnigEncodingCP1251)\n#define ONIG_ENCODING_BIG5         (&OnigEncodingBIG5)\n#define ONIG_ENCODING_GB18030      (&OnigEncodingGB18030)\n\n#define ONIG_ENCODING_UNDEF    ((OnigEncoding )0)\n\n\n/* work size */\n#define ONIGENC_CODE_TO_MBC_MAXLEN       7\n#define ONIGENC_MBC_CASE_FOLD_MAXLEN    18\n/* 18: 6(max-byte) * 3(case-fold chars) */\n\n/* character types */\n#define ONIGENC_CTYPE_NEWLINE   0\n#define ONIGENC_CTYPE_ALPHA     1\n#define ONIGENC_CTYPE_BLANK     2\n#define ONIGENC_CTYPE_CNTRL     3\n#define ONIGENC_CTYPE_DIGIT     4\n#define ONIGENC_CTYPE_GRAPH     5\n#define ONIGENC_CTYPE_LOWER     6\n#define ONIGENC_CTYPE_PRINT     7\n#define ONIGENC_CTYPE_PUNCT     8\n#define ONIGENC_CTYPE_SPACE     9\n#define ONIGENC_CTYPE_UPPER    10\n#define ONIGENC_CTYPE_XDIGIT   11\n#define ONIGENC_CTYPE_WORD     12\n#define ONIGENC_CTYPE_ALNUM    13  /* alpha || digit */\n#define ONIGENC_CTYPE_ASCII    14\n#define ONIGENC_MAX_STD_CTYPE  ONIGENC_CTYPE_ASCII\n\n/* flags */\n#define ONIGENC_FLAG_NONE       0U\n#define ONIGENC_FLAG_UNICODE    1U\n\n\n#define onig_enc_len(enc,p,end)        ONIGENC_MBC_ENC_LEN(enc,p)\n\n#define ONIGENC_IS_UNDEF(enc)          ((enc) == ONIG_ENCODING_UNDEF)\n#define ONIGENC_IS_SINGLEBYTE(enc)     (ONIGENC_MBC_MAXLEN(enc) == 1)\n#define ONIGENC_IS_MBC_HEAD(enc,p)     (ONIGENC_MBC_ENC_LEN(enc,p) != 1)\n#define ONIGENC_IS_MBC_HEAD_SE(it,enc,p)     (ONIGENC_MBC_ENC_LEN_SE(it,enc,p) != 1)\n#define ONIGENC_IS_MBC_ASCII(p)           (*(p)   < 128)\n#define ONIGENC_IS_MBC_ASCII_SE(c)        (c      < 128)\n#define ONIGENC_IS_CODE_ASCII(code)       ((code) < 128)\n#define ONIGENC_IS_MBC_WORD(enc,s,end) \\\n   ONIGENC_IS_CODE_WORD(enc,ONIGENC_MBC_TO_CODE(enc,s,end))\n#define ONIGENC_IS_MBC_WORD_SE(it,enc,s,end) \\\n   ONIGENC_IS_CODE_WORD(enc,ONIGENC_MBC_TO_CODE_SE(it,enc,s,end))\n#define ONIGENC_IS_MBC_SINGLEBYTE_SE(it,enc,s,end) \\\n    (ONIGENC_MBC_TO_CODE_SE(it,enc,s,end) <= 0xFF)\n#define ONIGENC_IS_MBC_ASCII_WORD(enc,s,end) \\\n   onigenc_ascii_is_code_ctype( \\\n\tONIGENC_MBC_TO_CODE(enc,s,end),ONIGENC_CTYPE_WORD)\n#define ONIGENC_IS_MBC_ASCII_WORD_SE(it,enc,s,end) \\\n   onigenc_ascii_is_code_ctype( \\\n\tONIGENC_MBC_TO_CODE_SE(it,enc,s,end),ONIGENC_CTYPE_WORD)\n#define ONIGENC_IS_UNICODE(enc)        ((enc)->flags & ONIGENC_FLAG_UNICODE)\n\n#define ONIGENC_SCRIPT(enc,s,end)              (onigenc_unicode_code_script(ONIGENC_MBC_TO_CODE(enc,s,end)))\n#define ONIGENC_SCRIPT_SE(it,enc,s,end)        (onigenc_unicode_code_script(ONIGENC_MBC_TO_CODE_SE(it,enc,s,end)))\n\n#define ONIGENC_NAME(enc)                      ((enc)->name)\n\n#define ONIGENC_MBC_CASE_FOLD(enc,flag,pp,end,buf) \\\n  (enc)->mbc_case_fold(flag,(const OnigUChar** )pp,end,buf)\n#define ONIGENC_MBC_CASE_FOLD_SE(it,enc,flag,pp,end,buf) \\\n\t(enc)->mbc_case_fold_se(it,flag,(OnigPosition* )pp,end,buf)\n#define ONIGENC_IS_ALLOWED_REVERSE_MATCH(enc,s,end) \\\n        (enc)->is_allowed_reverse_match(s,end)\n#define ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc,start,s) \\\n        (enc)->left_adjust_char_head(start, s)\n#define ONIGENC_LEFT_ADJUST_CHAR_HEAD_SE(it,enc,start,s) \\\n        (enc)->left_adjust_char_head_se(it, start, s)\n#define ONIGENC_APPLY_ALL_CASE_FOLD(enc,case_fold_flag,f,arg) \\\n        (enc)->apply_all_case_fold(case_fold_flag,f,arg)\n#define ONIGENC_GET_CASE_FOLD_CODES_BY_STR(enc,case_fold_flag,p,end,acs) \\\n       (enc)->get_case_fold_codes_by_str(case_fold_flag,p,end,acs)\n#define ONIGENC_STEP_BACK(enc,start,s,n) \\\n        onigenc_step_back((enc),(start),(s),(n))\n#define ONIGENC_STEP_BACK_SE(it,enc,start,s,n) \\\n        onigenc_step_back_se((it),(enc),(start),(s),(n))\n\n#define ONIGENC_MBC_ENC_LEN(enc,p)             (enc)->mbc_enc_len(p)\n#define ONIGENC_MBC_ENC_LEN_SE(it,enc,p)          (enc)->mbc_enc_len_se((it),(p))\n#define ONIGENC_MBC_MAXLEN(enc)               ((enc)->max_enc_len)\n#define ONIGENC_MBC_MAXLEN_DIST(enc)           ONIGENC_MBC_MAXLEN(enc)\n#define ONIGENC_MBC_MINLEN(enc)               ((enc)->min_enc_len)\n#define ONIGENC_IS_MBC_NEWLINE(enc,p,end)      (enc)->is_mbc_newline((p),(end))\n#define ONIGENC_IS_MBC_NEWLINE_SE(it,enc,p,end)   (enc)->is_mbc_newline_se((it),(p),(end))\n#define ONIGENC_MBC_TO_CODE(enc,p,end)         (enc)->mbc_to_code((p),(end))\n#define ONIGENC_MBC_TO_CODE_SE(it,enc,p,end)      (enc)->mbc_to_code_se((it),(p),(end))\n#define ONIGENC_CODE_TO_MBCLEN(enc,code)       (enc)->code_to_mbclen(code)\n#define ONIGENC_CODE_TO_MBC(enc,code,buf)      (enc)->code_to_mbc(code,buf)\n#define ONIGENC_PROPERTY_NAME_TO_CTYPE(enc,p,end) \\\n  (enc)->property_name_to_ctype(enc,p,end)\n\n#define ONIGENC_IS_CODE_CTYPE(enc,code,ctype)  (enc)->is_code_ctype(code,ctype)\n\n#define ONIGENC_IS_CODE_NEWLINE(enc,code) \\\n        ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_NEWLINE)\n#define ONIGENC_IS_CODE_GRAPH(enc,code) \\\n        ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_GRAPH)\n#define ONIGENC_IS_CODE_PRINT(enc,code) \\\n        ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_PRINT)\n#define ONIGENC_IS_CODE_ALNUM(enc,code) \\\n        ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_ALNUM)\n#define ONIGENC_IS_CODE_ALPHA(enc,code) \\\n        ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_ALPHA)\n#define ONIGENC_IS_CODE_LOWER(enc,code) \\\n        ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_LOWER)\n#define ONIGENC_IS_CODE_UPPER(enc,code) \\\n        ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_UPPER)\n#define ONIGENC_IS_CODE_CNTRL(enc,code) \\\n        ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_CNTRL)\n#define ONIGENC_IS_CODE_PUNCT(enc,code) \\\n        ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_PUNCT)\n#define ONIGENC_IS_CODE_SPACE(enc,code) \\\n        ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_SPACE)\n#define ONIGENC_IS_CODE_BLANK(enc,code) \\\n        ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_BLANK)\n#define ONIGENC_IS_CODE_DIGIT(enc,code) \\\n        ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_DIGIT)\n#define ONIGENC_IS_CODE_XDIGIT(enc,code) \\\n        ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_XDIGIT)\n#define ONIGENC_IS_CODE_WORD(enc,code) \\\n        ONIGENC_IS_CODE_CTYPE(enc,code,ONIGENC_CTYPE_WORD)\n\n#define ONIGENC_GET_CTYPE_CODE_RANGE(enc,ctype,sbout,ranges) \\\n        (enc)->get_ctype_code_range(ctype,sbout,ranges)\n\nONIG_EXTERN\nOnigUChar* onigenc_step_back P_((OnigEncoding enc, const OnigUChar* start, const OnigUChar* s, int n));\nONIG_EXTERN\nOnigPosition onigenc_step_back_se P_((OnigIterator* it, OnigEncoding enc, OnigPosition start, OnigPosition s, int n));\n\n/* encoding API */\nONIG_EXTERN\nint onigenc_init P_((void));\nONIG_EXTERN\nint onigenc_set_default_encoding P_((OnigEncoding enc));\nONIG_EXTERN\nOnigEncoding onigenc_get_default_encoding P_((void));\nONIG_EXTERN\nvoid  onigenc_set_default_caseconv_table P_((const OnigUChar* table));\nONIG_EXTERN\nOnigUChar* onigenc_get_right_adjust_char_head_with_prev P_((OnigEncoding enc, const OnigUChar* start, const OnigUChar* s, const OnigUChar** prev));\nONIG_EXTERN\nOnigPosition onigenc_get_right_adjust_char_head_with_prev_se P_((OnigIterator* it, OnigEncoding enc, OnigPosition start, OnigPosition s, OnigPosition* prev));\nONIG_EXTERN\nOnigUChar* onigenc_get_prev_char_head P_((OnigEncoding enc, const OnigUChar* start, const OnigUChar* s));\nONIG_EXTERN\nOnigPosition onigenc_get_prev_char_head_se P_((OnigIterator* it, OnigEncoding enc, OnigPosition start, OnigPosition s));\nONIG_EXTERN\nOnigUChar* onigenc_get_left_adjust_char_head P_((OnigEncoding enc, const OnigUChar* start, const OnigUChar* s));\nONIG_EXTERN\nOnigPosition onigenc_get_left_adjust_char_head_se P_((OnigIterator* it, OnigEncoding enc, OnigPosition start, OnigPosition s));\nONIG_EXTERN\nOnigUChar* onigenc_get_right_adjust_char_head P_((OnigEncoding enc, const OnigUChar* start, const OnigUChar* s));\nONIG_EXTERN\nOnigPosition onigenc_get_right_adjust_char_head_se P_((OnigIterator* it, OnigEncoding enc, OnigPosition start, OnigPosition s));\nONIG_EXTERN\nint onigenc_strlen P_((OnigEncoding enc, const OnigUChar* p, const OnigUChar* end));\nONIG_EXTERN\nint onigenc_strlen_se P_((OnigIterator* it, OnigEncoding enc, OnigPosition p, OnigPosition end));\nONIG_EXTERN\nint onigenc_strlen_null P_((OnigEncoding enc, const OnigUChar* p));\nONIG_EXTERN\nint onigenc_str_bytelen_null P_((OnigEncoding enc, const OnigUChar* p));\nONIG_EXTERN\nOnigPosition onigenc_str_bytelen_null_se P_((OnigIterator* it, OnigEncoding enc, OnigPosition p));\n\n\n/* PART: regular expression */\n\n/* config parameters */\n#define ONIG_NREGION                          10\n#define ONIG_MAX_BACKREF_NUM                1000\n#define ONIG_MAX_REPEAT_NUM               100000\n#define ONIG_MAX_MULTI_BYTE_RANGES_NUM     10000\n/* constants */\n#define ONIG_MAX_ERROR_MESSAGE_LEN            90\n\ntypedef unsigned int        OnigOptionType;\n\n#define ONIG_OPTION_DEFAULT            ONIG_OPTION_NONE\n\n/* options */\n#define ONIG_OPTION_NONE                 0U\n#define ONIG_OPTION_IGNORECASE           1U\n#define ONIG_OPTION_EXTEND               (ONIG_OPTION_IGNORECASE         << 1)\n#define ONIG_OPTION_MULTILINE            (ONIG_OPTION_EXTEND             << 1)\n#define ONIG_OPTION_DOTALL                ONIG_OPTION_MULTILINE\n#define ONIG_OPTION_SINGLELINE           (ONIG_OPTION_MULTILINE          << 1)\n#define ONIG_OPTION_FIND_LONGEST         (ONIG_OPTION_SINGLELINE         << 1)\n#define ONIG_OPTION_FIND_NOT_EMPTY       (ONIG_OPTION_FIND_LONGEST       << 1)\n#define ONIG_OPTION_NEGATE_SINGLELINE    (ONIG_OPTION_FIND_NOT_EMPTY     << 1)\n#define ONIG_OPTION_DONT_CAPTURE_GROUP   (ONIG_OPTION_NEGATE_SINGLELINE  << 1)\n#define ONIG_OPTION_CAPTURE_GROUP        (ONIG_OPTION_DONT_CAPTURE_GROUP << 1)\n/* options (search time) */\n#define ONIG_OPTION_NOTBOL               (ONIG_OPTION_CAPTURE_GROUP << 1)\n#define ONIG_OPTION_NOTEOL               (ONIG_OPTION_NOTBOL << 1)\n#define ONIG_OPTION_POSIX_REGION         (ONIG_OPTION_NOTEOL << 1)\n/* options (ctype range) */\n#define ONIG_OPTION_ASCII_RANGE          (ONIG_OPTION_POSIX_REGION << 1)\n#define ONIG_OPTION_POSIX_BRACKET_ALL_RANGE (ONIG_OPTION_ASCII_RANGE << 1)\n#define ONIG_OPTION_WORD_BOUND_ALL_RANGE    (ONIG_OPTION_POSIX_BRACKET_ALL_RANGE << 1)\n/* options (newline) */\n#define ONIG_OPTION_NEWLINE_CRLF         (ONIG_OPTION_WORD_BOUND_ALL_RANGE << 1)\n// options (whole word)\n#define SE_ONIG_OPTION_WHOLEWORD\t     (ONIG_OPTION_NEWLINE_CRLF << 1)\n#define ONIG_OPTION_MAXBIT               SE_ONIG_OPTION_WHOLEWORD  /* limit */\n\n#define ONIG_OPTION_ON(options,regopt)      ((options) |= (regopt))\n#define ONIG_OPTION_OFF(options,regopt)     ((options) &= ~(regopt))\n#define ONIG_IS_OPTION_ON(options,option)   ((options) & (option))\n\n/* syntax */\ntypedef struct {\n  unsigned int   op;\n  unsigned int   op2;\n  unsigned int   behavior;\n  OnigOptionType options;   /* default option */\n  OnigMetaCharTableType meta_char_table;\n} OnigSyntaxType;\n\nONIG_EXTERN OnigSyntaxType OnigSyntaxASIS;\nONIG_EXTERN OnigSyntaxType OnigSyntaxWildChar;\nONIG_EXTERN OnigSyntaxType OnigSyntaxPosixBasic;\nONIG_EXTERN OnigSyntaxType OnigSyntaxPosixExtended;\nONIG_EXTERN OnigSyntaxType OnigSyntaxEmacs;\nONIG_EXTERN OnigSyntaxType OnigSyntaxGrep;\nONIG_EXTERN OnigSyntaxType OnigSyntaxGnuRegex;\nONIG_EXTERN OnigSyntaxType OnigSyntaxJava;\nONIG_EXTERN OnigSyntaxType OnigSyntaxPerl58;\nONIG_EXTERN OnigSyntaxType OnigSyntaxPerl58_NG;\nONIG_EXTERN OnigSyntaxType OnigSyntaxPerl;\nONIG_EXTERN OnigSyntaxType OnigSyntaxRuby;\nONIG_EXTERN OnigSyntaxType OnigSyntaxPython;\n\n/* predefined syntaxes (see regsyntax.c) */\n#define ONIG_SYNTAX_ASIS               (&OnigSyntaxASIS)\n#define ONIG_SYNTAX_WILDCHAR\t\t   (&OnigSyntaxWildChar)\n#define ONIG_SYNTAX_POSIX_BASIC        (&OnigSyntaxPosixBasic)\n#define ONIG_SYNTAX_POSIX_EXTENDED     (&OnigSyntaxPosixExtended)\n#define ONIG_SYNTAX_EMACS              (&OnigSyntaxEmacs)\n#define ONIG_SYNTAX_GREP               (&OnigSyntaxGrep)\n#define ONIG_SYNTAX_GNU_REGEX          (&OnigSyntaxGnuRegex)\n#define ONIG_SYNTAX_JAVA               (&OnigSyntaxJava)\n#define ONIG_SYNTAX_PERL58             (&OnigSyntaxPerl58)\n#define ONIG_SYNTAX_PERL58_NG          (&OnigSyntaxPerl58_NG)\n#define ONIG_SYNTAX_PERL               (&OnigSyntaxPerl)\n#define ONIG_SYNTAX_RUBY               (&OnigSyntaxRuby)\n#define ONIG_SYNTAX_PYTHON             (&OnigSyntaxPython)\n\n/* default syntax */\nONIG_EXTERN OnigSyntaxType*   OnigDefaultSyntax;\n#define ONIG_SYNTAX_DEFAULT   OnigDefaultSyntax\n\n/* syntax (operators) */\n#define ONIG_SYN_OP_VARIABLE_META_CHARACTERS    (1U<<0)\n#define ONIG_SYN_OP_DOT_ANYCHAR                 (1U<<1)   /* . */\n#define ONIG_SYN_OP_ASTERISK_ZERO_INF           (1U<<2)   /* * */\n#define ONIG_SYN_OP_ESC_ASTERISK_ZERO_INF       (1U<<3)\n#define ONIG_SYN_OP_PLUS_ONE_INF                (1U<<4)   /* + */\n#define ONIG_SYN_OP_ESC_PLUS_ONE_INF            (1U<<5)\n#define ONIG_SYN_OP_QMARK_ZERO_ONE              (1U<<6)   /* ? */\n#define ONIG_SYN_OP_ESC_QMARK_ZERO_ONE          (1U<<7)\n#define ONIG_SYN_OP_BRACE_INTERVAL              (1U<<8)   /* {lower,upper} */\n#define ONIG_SYN_OP_ESC_BRACE_INTERVAL          (1U<<9)   /* \\{lower,upper\\} */\n#define ONIG_SYN_OP_VBAR_ALT                    (1U<<10)   /* | */\n#define ONIG_SYN_OP_ESC_VBAR_ALT                (1U<<11)  /* \\| */\n#define ONIG_SYN_OP_LPAREN_SUBEXP               (1U<<12)  /* (...)   */\n#define ONIG_SYN_OP_ESC_LPAREN_SUBEXP           (1U<<13)  /* \\(...\\) */\n#define ONIG_SYN_OP_ESC_AZ_BUF_ANCHOR           (1U<<14)  /* \\A, \\Z, \\z */\n#define ONIG_SYN_OP_ESC_CAPITAL_G_BEGIN_ANCHOR  (1U<<15)  /* \\G     */\n#define ONIG_SYN_OP_DECIMAL_BACKREF             (1U<<16)  /* \\num   */\n#define ONIG_SYN_OP_BRACKET_CC                  (1U<<17)  /* [...]  */\n#define ONIG_SYN_OP_ESC_W_WORD                  (1U<<18)  /* \\w, \\W */\n#define ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END     (1U<<19)  /* \\<. \\> */\n#define ONIG_SYN_OP_ESC_B_WORD_BOUND            (1U<<20)  /* \\b, \\B */\n#define ONIG_SYN_OP_ESC_S_WHITE_SPACE           (1U<<21)  /* \\s, \\S */\n#define ONIG_SYN_OP_ESC_D_DIGIT                 (1U<<22)  /* \\d, \\D */\n#define ONIG_SYN_OP_LINE_ANCHOR                 (1U<<23)  /* ^, $   */\n#define ONIG_SYN_OP_POSIX_BRACKET               (1U<<24)  /* [:xxxx:] */\n#define ONIG_SYN_OP_QMARK_NON_GREEDY            (1U<<25)  /* ??,*?,+?,{n,m}? */\n#define ONIG_SYN_OP_ESC_CONTROL_CHARS           (1U<<26)  /* \\n,\\r,\\t,\\a ... */\n#define ONIG_SYN_OP_ESC_C_CONTROL               (1U<<27)  /* \\cx  */\n#define ONIG_SYN_OP_ESC_OCTAL3                  (1U<<28)  /* \\OOO */\n#define ONIG_SYN_OP_ESC_X_HEX2                  (1U<<29)  /* \\xHH */\n#define ONIG_SYN_OP_ESC_X_BRACE_HEX8            (1U<<30)  /* \\x{7HHHHHHH} */\n#define ONIG_SYN_OP_ESC_O_BRACE_OCTAL           (1U<<31)  /* \\o{OOO} */ /* NOTIMPL */\n\n#define ONIG_SYN_OP2_ESC_CAPITAL_Q_QUOTE        (1U<<0)  /* \\Q...\\E */\n#define ONIG_SYN_OP2_QMARK_GROUP_EFFECT         (1U<<1)  /* (?...) */\n#define ONIG_SYN_OP2_OPTION_PERL                (1U<<2)  /* (?imsxadlu), (?-imsx), (?^imsxalu) */\n#define ONIG_SYN_OP2_OPTION_RUBY                (1U<<3)  /* (?imxadu), (?-imx)  */\n#define ONIG_SYN_OP2_PLUS_POSSESSIVE_REPEAT     (1U<<4)  /* ?+,*+,++ */\n#define ONIG_SYN_OP2_PLUS_POSSESSIVE_INTERVAL   (1U<<5)  /* {n,m}+   */\n#define ONIG_SYN_OP2_CCLASS_SET_OP              (1U<<6)  /* [...&&..[..]..] */\n#define ONIG_SYN_OP2_QMARK_LT_NAMED_GROUP       (1U<<7)  /* (?<name>...) */\n#define ONIG_SYN_OP2_ESC_K_NAMED_BACKREF        (1U<<8)  /* \\k<name> */\n#define ONIG_SYN_OP2_ESC_G_SUBEXP_CALL          (1U<<9)  /* \\g<name>, \\g<n> */\n#define ONIG_SYN_OP2_ATMARK_CAPTURE_HISTORY     (1U<<10) /* (?@..),(?@<x>..) */\n#define ONIG_SYN_OP2_ESC_CAPITAL_C_BAR_CONTROL  (1U<<11) /* \\C-x */\n#define ONIG_SYN_OP2_ESC_CAPITAL_M_BAR_META     (1U<<12) /* \\M-x */\n#define ONIG_SYN_OP2_ESC_V_VTAB                 (1U<<13) /* \\v as VTAB */\n#define ONIG_SYN_OP2_ESC_U_HEX4                 (1U<<14) /* \\uHHHH */\n#define ONIG_SYN_OP2_ESC_GNU_BUF_ANCHOR         (1U<<15) /* \\`, \\' */\n#define ONIG_SYN_OP2_ESC_P_BRACE_CHAR_PROPERTY  (1U<<16) /* \\p{...}, \\P{...} */\n#define ONIG_SYN_OP2_ESC_P_BRACE_CIRCUMFLEX_NOT (1U<<17) /* \\p{^..}, \\P{^..} */\n/* #define ONIG_SYN_OP2_CHAR_PROPERTY_PREFIX_IS (1U<<18) */\n#define ONIG_SYN_OP2_ESC_H_XDIGIT               (1U<<19) /* \\h, \\H */\n#define ONIG_SYN_OP2_INEFFECTIVE_ESCAPE         (1U<<20) /* \\ */\n#define ONIG_SYN_OP2_ESC_CAPITAL_R_LINEBREAK    (1U<<21) /* \\R as (?>\\x0D\\x0A|[\\x0A-\\x0D\\x{85}\\x{2028}\\x{2029}]) */\n#define ONIG_SYN_OP2_ESC_CAPITAL_X_EXTENDED_GRAPHEME_CLUSTER (1U<<22) /* \\X as (?>\\P{M}\\p{M}*) */\n#define ONIG_SYN_OP2_ESC_V_VERTICAL_WHITESPACE   (1U<<23) /* \\v, \\V -- Perl */ /* NOTIMPL */\n#define ONIG_SYN_OP2_ESC_H_HORIZONTAL_WHITESPACE (1U<<24) /* \\h, \\H -- Perl */ /* NOTIMPL */\n#define ONIG_SYN_OP2_ESC_CAPITAL_K_KEEP         (1U<<25) /* \\K */\n#define ONIG_SYN_OP2_ESC_G_BRACE_BACKREF        (1U<<26) /* \\g{name}, \\g{n} */\n#define ONIG_SYN_OP2_QMARK_SUBEXP_CALL          (1U<<27) /* (?&name), (?n), (?R), (?0) */\n#define ONIG_SYN_OP2_QMARK_VBAR_BRANCH_RESET    (1U<<28) /* (?|...) */         /* NOTIMPL */\n#define ONIG_SYN_OP2_QMARK_LPAREN_CONDITION     (1U<<29) /* (?(cond)yes...|no...) */\n#define ONIG_SYN_OP2_QMARK_CAPITAL_P_NAMED_GROUP (1U<<30) /* (?P<name>...), (?P=name), (?P>name) -- Python/PCRE */\n#define ONIG_SYN_OP2_OPTION_JAVA                (1U<<31) /* (?idmsux), (?-idmsux) */ /* NOTIMPL */\n\n/* syntax (behavior) */\n#define ONIG_SYN_CONTEXT_INDEP_ANCHORS           (1U<<31) /* not implemented */\n#define ONIG_SYN_CONTEXT_INDEP_REPEAT_OPS        (1U<<0)  /* ?, *, +, {n,m} */\n#define ONIG_SYN_CONTEXT_INVALID_REPEAT_OPS      (1U<<1)  /* error or ignore */\n#define ONIG_SYN_ALLOW_UNMATCHED_CLOSE_SUBEXP    (1U<<2)  /* ...)... */\n#define ONIG_SYN_ALLOW_INVALID_INTERVAL          (1U<<3)  /* {??? */\n#define ONIG_SYN_ALLOW_INTERVAL_LOW_ABBREV       (1U<<4)  /* {,n} => {0,n} */\n#define ONIG_SYN_STRICT_CHECK_BACKREF            (1U<<5)  /* /(\\1)/,/\\1()/ ..*/\n#define ONIG_SYN_DIFFERENT_LEN_ALT_LOOK_BEHIND   (1U<<6)  /* (?<=a|bc) */\n#define ONIG_SYN_CAPTURE_ONLY_NAMED_GROUP        (1U<<7)  /* see doc/RE */\n#define ONIG_SYN_ALLOW_MULTIPLEX_DEFINITION_NAME (1U<<8)  /* (?<x>)(?<x>) */\n#define ONIG_SYN_FIXED_INTERVAL_IS_GREEDY_ONLY   (1U<<9)  /* a{n}?=(?:a{n})? */\n#define ONIG_SYN_ALLOW_MULTIPLEX_DEFINITION_NAME_CALL (1U<<10)  /* (?<x>)(?<x>)(?&x) */\n\n/* syntax (behavior) in char class [...] */\n#define ONIG_SYN_NOT_NEWLINE_IN_NEGATIVE_CC      (1U<<20) /* [^...] */\n#define ONIG_SYN_BACKSLASH_ESCAPE_IN_CC          (1U<<21) /* [..\\w..] etc.. */\n#define ONIG_SYN_ALLOW_EMPTY_RANGE_IN_CC         (1U<<22)\n#define ONIG_SYN_ALLOW_DOUBLE_RANGE_OP_IN_CC     (1U<<23) /* [0-9-a]=[0-9\\-a] */\n/* syntax (behavior) warning */\n#define ONIG_SYN_WARN_CC_OP_NOT_ESCAPED          (1U<<24) /* [,-,] */\n#define ONIG_SYN_WARN_REDUNDANT_NESTED_REPEAT    (1U<<25) /* (?:a*)+ */\n\n/* meta character specifiers (onig_set_meta_char()) */\n#define ONIG_META_CHAR_ESCAPE               0\n#define ONIG_META_CHAR_ANYCHAR              1\n#define ONIG_META_CHAR_ANYTIME              2\n#define ONIG_META_CHAR_ZERO_OR_ONE_TIME     3\n#define ONIG_META_CHAR_ONE_OR_MORE_TIME     4\n#define ONIG_META_CHAR_ANYCHAR_ANYTIME      5\n\n#define ONIG_INEFFECTIVE_META_CHAR          0\n\n/* error codes */\n#define ONIG_IS_PATTERN_ERROR(ecode)   ((ecode) <= -100 && (ecode) > -1000)\n/* normal return */\n#define ONIG_NORMAL                                            0\n#define ONIG_MISMATCH                                         -1\n#define ONIG_NO_SUPPORT_CONFIG                                -2\n\n/* internal error */\n#define ONIGERR_MEMORY                                         -5\n#define ONIGERR_TYPE_BUG                                       -6\n#define ONIGERR_PARSER_BUG                                    -11\n#define ONIGERR_STACK_BUG                                     -12\n#define ONIGERR_UNDEFINED_BYTECODE                            -13\n#define ONIGERR_UNEXPECTED_BYTECODE                           -14\n#define ONIGERR_MATCH_STACK_LIMIT_OVER                        -15\n#define ONIGERR_DEFAULT_ENCODING_IS_NOT_SET                   -21\n#define ONIGERR_SPECIFIED_ENCODING_CANT_CONVERT_TO_WIDE_CHAR  -22\n/* general error */\n#define ONIGERR_INVALID_ARGUMENT                              -30\n/* syntax error */\n#define ONIGERR_END_PATTERN_AT_LEFT_BRACE                    -100\n#define ONIGERR_END_PATTERN_AT_LEFT_BRACKET                  -101\n#define ONIGERR_EMPTY_CHAR_CLASS                             -102\n#define ONIGERR_PREMATURE_END_OF_CHAR_CLASS                  -103\n#define ONIGERR_END_PATTERN_AT_ESCAPE                        -104\n#define ONIGERR_END_PATTERN_AT_META                          -105\n#define ONIGERR_END_PATTERN_AT_CONTROL                       -106\n#define ONIGERR_META_CODE_SYNTAX                             -108\n#define ONIGERR_CONTROL_CODE_SYNTAX                          -109\n#define ONIGERR_CHAR_CLASS_VALUE_AT_END_OF_RANGE             -110\n#define ONIGERR_CHAR_CLASS_VALUE_AT_START_OF_RANGE           -111\n#define ONIGERR_UNMATCHED_RANGE_SPECIFIER_IN_CHAR_CLASS      -112\n#define ONIGERR_TARGET_OF_REPEAT_OPERATOR_NOT_SPECIFIED      -113\n#define ONIGERR_TARGET_OF_REPEAT_OPERATOR_INVALID            -114\n#define ONIGERR_NESTED_REPEAT_OPERATOR                       -115\n#define ONIGERR_UNMATCHED_CLOSE_PARENTHESIS                  -116\n#define ONIGERR_END_PATTERN_WITH_UNMATCHED_PARENTHESIS       -117\n#define ONIGERR_END_PATTERN_IN_GROUP                         -118\n#define ONIGERR_UNDEFINED_GROUP_OPTION                       -119\n#define ONIGERR_INVALID_POSIX_BRACKET_TYPE                   -121\n#define ONIGERR_INVALID_LOOK_BEHIND_PATTERN                  -122\n#define ONIGERR_INVALID_REPEAT_RANGE_PATTERN                 -123\n#define ONIGERR_INVALID_CONDITION_PATTERN                    -124\n/* values error (syntax error) */\n#define ONIGERR_TOO_BIG_NUMBER                               -200\n#define ONIGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE              -201\n#define ONIGERR_UPPER_SMALLER_THAN_LOWER_IN_REPEAT_RANGE     -202\n#define ONIGERR_EMPTY_RANGE_IN_CHAR_CLASS                    -203\n#define ONIGERR_MISMATCH_CODE_LENGTH_IN_CLASS_RANGE          -204\n#define ONIGERR_TOO_MANY_MULTI_BYTE_RANGES                   -205\n#define ONIGERR_TOO_SHORT_MULTI_BYTE_STRING                  -206\n#define ONIGERR_TOO_BIG_BACKREF_NUMBER                       -207\n#define ONIGERR_INVALID_BACKREF                              -208\n#define ONIGERR_NUMBERED_BACKREF_OR_CALL_NOT_ALLOWED         -209\n#define ONIGERR_TOO_SHORT_DIGITS                             -210\n#define ONIGERR_TOO_LONG_WIDE_CHAR_VALUE                     -212\n#define ONIGERR_EMPTY_GROUP_NAME                             -214\n#define ONIGERR_INVALID_GROUP_NAME                           -215\n#define ONIGERR_INVALID_CHAR_IN_GROUP_NAME                   -216\n#define ONIGERR_UNDEFINED_NAME_REFERENCE                     -217\n#define ONIGERR_UNDEFINED_GROUP_REFERENCE                    -218\n#define ONIGERR_MULTIPLEX_DEFINED_NAME                       -219\n#define ONIGERR_MULTIPLEX_DEFINITION_NAME_CALL               -220\n#define ONIGERR_NEVER_ENDING_RECURSION                       -221\n#define ONIGERR_GROUP_NUMBER_OVER_FOR_CAPTURE_HISTORY        -222\n#define ONIGERR_INVALID_CHAR_PROPERTY_NAME                   -223\n#define ONIGERR_INVALID_CODE_POINT_VALUE                     -400\n#define ONIGERR_INVALID_WIDE_CHAR_VALUE                      -400\n#define ONIGERR_TOO_BIG_WIDE_CHAR_VALUE                      -401\n#define ONIGERR_NOT_SUPPORTED_ENCODING_COMBINATION           -402\n#define ONIGERR_INVALID_COMBINATION_OF_OPTIONS               -403\n\n/* errors related to thread */\n#define ONIGERR_OVER_THREAD_PASS_LIMIT_COUNT                -1001\n\n\n/* must be smaller than BIT_STATUS_BITS_NUM (unsigned int * 8) */\n#define ONIG_MAX_CAPTURE_HISTORY_GROUP   31\n#define ONIG_IS_CAPTURE_HISTORY_GROUP(r, i) \\\n  ((i) <= ONIG_MAX_CAPTURE_HISTORY_GROUP && (r)->list && (r)->list[i])\n\ntypedef struct OnigCaptureTreeNodeStruct {\n  int group;   /* group number */\n  OnigPosition beg;\n  OnigPosition end;\n  int allocated;\n  int num_childs;\n  struct OnigCaptureTreeNodeStruct** childs;\n} OnigCaptureTreeNode;\n\n/* match result region type */\nstruct re_registers {\n  int  allocated;\n  int  num_regs;\n  OnigPosition* beg;\n  OnigPosition* end;\n  /* extended */\n  OnigCaptureTreeNode* history_root;  /* capture history tree root */\n};\n\n/* capture tree traverse */\n#define ONIG_TRAVERSE_CALLBACK_AT_FIRST   1\n#define ONIG_TRAVERSE_CALLBACK_AT_LAST    2\n#define ONIG_TRAVERSE_CALLBACK_AT_BOTH \\\n  ( ONIG_TRAVERSE_CALLBACK_AT_FIRST | ONIG_TRAVERSE_CALLBACK_AT_LAST )\n\n\n#define ONIG_REGION_NOTPOS            -1\n\ntypedef struct re_registers   OnigRegion;\n\ntypedef struct {\n  OnigEncoding enc;\n  OnigUChar* par;\n  OnigUChar* par_end;\n} OnigErrorInfo;\n\ntypedef struct {\n  int lower;\n  int upper;\n} OnigRepeatRange;\n\ntypedef void (*OnigWarnFunc) P_((const char* s));\nextern void onig_null_warn P_((const char* s));\n#define ONIG_NULL_WARN       onig_null_warn\n\n#define ONIG_CHAR_TABLE_SIZE   256\n\n/* regex_t state */\n#define ONIG_STATE_NORMAL              0\n#define ONIG_STATE_SEARCHING           1\n#define ONIG_STATE_COMPILING          -1\n#define ONIG_STATE_MODIFY             -2\n\n#define ONIG_STATE(reg) \\\n  ((reg)->state > 0 ? ONIG_STATE_SEARCHING : (reg)->state)\n\ntypedef struct re_pattern_buffer {\n  /* common members of BBuf(bytes-buffer) */\n  unsigned char* p;         /* compiled pattern */\n  unsigned int used;        /* used space for p */\n  unsigned int alloc;       /* allocated space for p */\n\n  int state;                     /* normal, searching, compiling */\n  int num_mem;                   /* used memory(...) num counted from 1 */\n  int num_repeat;                /* OP_REPEAT/OP_REPEAT_NG id-counter */\n  int num_null_check;            /* OP_NULL_CHECK_START/END id counter */\n  int num_comb_exp_check;        /* combination explosion check */\n  int num_call;                  /* number of subexp call */\n  unsigned int capture_history;  /* (?@...) flag (1-31) */\n  unsigned int bt_mem_start;     /* need backtrack flag */\n  unsigned int bt_mem_end;       /* need backtrack flag */\n  int stack_pop_level;\n  int repeat_range_alloc;\n  OnigRepeatRange* repeat_range;\n\n  OnigEncoding      enc;\n  OnigOptionType    options;\n  OnigSyntaxType*   syntax;\n  OnigCaseFoldType  case_fold_flag;\n  void*             name_table;\n\n  /* optimization info (string search, char-map and anchors) */\n  int            optimize;          /* optimize flag */\n  int            threshold_len;     /* search str-length for apply optimize */\n  int            anchor;            /* BEGIN_BUF, BEGIN_POS, (SEMI_)END_BUF */\n  OnigDistance   anchor_dmin;       /* (SEMI_)END_BUF anchor distance */\n  OnigDistance   anchor_dmax;       /* (SEMI_)END_BUF anchor distance */\n  int            sub_anchor;        /* start-anchor for exact or map */\n  unsigned char *exact;\n  unsigned char *exact_end;\n  unsigned char  map[ONIG_CHAR_TABLE_SIZE]; /* used as BM skip or char-map */\n  int           *int_map;                   /* BM skip for exact_len > 255 */\n  int           *int_map_backward;          /* BM skip for backward search */\n  OnigDistance   dmin;                      /* min-distance of exact or map */\n  OnigDistance   dmax;                      /* max-distance of exact or map */\n\n  /* regex_t link chain */\n  struct re_pattern_buffer* chain;  /* escape compile-conflict */\n} OnigRegexType;\n\ntypedef OnigRegexType*  OnigRegex;\n\n#ifndef ONIG_ESCAPE_REGEX_T_COLLISION\n  typedef OnigRegexType  regex_t;\n#endif\n\n\ntypedef struct {\n  int             num_of_elements;\n  OnigEncoding    pattern_enc;\n  OnigEncoding    target_enc;\n  OnigSyntaxType* syntax;\n  OnigOptionType  option;\n  OnigCaseFoldType   case_fold_flag;\n} OnigCompileInfo;\n\n/* Oniguruma Native API */\nONIG_EXTERN\nint onig_init P_((void));\nONIG_EXTERN\nint onig_error_code_to_str PV_((OnigUChar* s, OnigPosition err_code, ...));\nONIG_EXTERN\nvoid onig_set_warn_func P_((OnigWarnFunc f));\nONIG_EXTERN\nvoid onig_set_verb_warn_func P_((OnigWarnFunc f));\nONIG_EXTERN\nint onig_new P_((OnigRegex*, const OnigUChar* pattern, const OnigUChar* pattern_end, OnigOptionType option, OnigEncoding enc, OnigSyntaxType* syntax, OnigErrorInfo* einfo));\nONIG_EXTERN\nint onig_reg_init P_((OnigRegex reg, OnigOptionType option, OnigCaseFoldType case_fold_flag, OnigEncoding enc, OnigSyntaxType* syntax));\nONIG_EXTERN\nint onig_new_without_alloc P_((OnigRegex, const OnigUChar* pattern, const OnigUChar* pattern_end, OnigOptionType option, OnigEncoding enc, OnigSyntaxType* syntax, OnigErrorInfo* einfo));\nONIG_EXTERN\nint onig_new_deluxe P_((OnigRegex* reg, const OnigUChar* pattern, const OnigUChar* pattern_end, OnigCompileInfo* ci, OnigErrorInfo* einfo));\nONIG_EXTERN\nvoid onig_free P_((OnigRegex));\nONIG_EXTERN\nvoid onig_free_body P_((OnigRegex));\nONIG_EXTERN\nint onig_recompile P_((OnigRegex, const OnigUChar* pattern, const OnigUChar* pattern_end, OnigOptionType option, OnigEncoding enc, OnigSyntaxType* syntax, OnigErrorInfo* einfo));\nONIG_EXTERN\nint onig_recompile_deluxe P_((OnigRegex reg, const OnigUChar* pattern, const OnigUChar* pattern_end, OnigCompileInfo* ci, OnigErrorInfo* einfo));\nONIG_EXTERN\nOnigPosition onig_search P_((OnigIterator* it, OnigRegex, OnigPosition str, OnigPosition end, OnigPosition start, OnigPosition range, OnigRegion* region, OnigOptionType option));\nONIG_EXTERN\nOnigPosition onig_search_gpos P_((OnigIterator* it, OnigRegex, OnigPosition str, OnigPosition end, OnigPosition global_pos, OnigPosition start, OnigPosition range, OnigRegion* region, OnigOptionType option));\nONIG_EXTERN\nOnigPosition onig_match P_((OnigIterator* it, OnigRegex, OnigPosition str, OnigPosition end, OnigPosition at, OnigRegion* region, OnigOptionType option));\nONIG_EXTERN\nOnigPosition onig_match_gpos P_((OnigIterator* it, OnigRegex, OnigPosition str, OnigPosition end, OnigPosition global_pos, OnigPosition at, OnigRegion* region, OnigOptionType option));\nONIG_EXTERN\nOnigRegion* onig_region_new P_((void));\nONIG_EXTERN\nvoid onig_region_init P_((OnigRegion* region));\nONIG_EXTERN\nvoid onig_region_free P_((OnigRegion* region, int free_self));\nONIG_EXTERN\nvoid onig_region_copy P_((OnigRegion* to, OnigRegion* from));\nONIG_EXTERN\nvoid onig_region_clear P_((OnigRegion* region));\nONIG_EXTERN\nint onig_region_resize P_((OnigRegion* region, int n));\nONIG_EXTERN\nint onig_region_set P_((OnigRegion* region, int at, int beg, int end));\nONIG_EXTERN\nint onig_name_to_group_numbers P_((OnigRegex reg, const OnigUChar* name, const OnigUChar* name_end, int** nums));\nONIG_EXTERN\nint onig_name_to_backref_number P_((OnigRegex reg, const OnigUChar* name, const OnigUChar* name_end, OnigRegion *region));\nONIG_EXTERN\nint onig_foreach_name P_((OnigRegex reg, int (*func)(const OnigUChar*, const OnigUChar*,int,int*,OnigRegex,void*), void* arg));\nONIG_EXTERN\nint onig_number_of_names P_((OnigRegex reg));\nONIG_EXTERN\nint onig_number_of_captures P_((OnigRegex reg));\nONIG_EXTERN\nint onig_number_of_capture_histories P_((OnigRegex reg));\nONIG_EXTERN\nOnigCaptureTreeNode* onig_get_capture_tree P_((OnigRegion* region));\nONIG_EXTERN\nint onig_capture_tree_traverse P_((OnigRegion* region, int at, int(*callback_func)(int,OnigPosition,OnigPosition,int,int,void*), void* arg));\nONIG_EXTERN\nint onig_noname_group_capture_is_active P_((OnigRegex reg));\nONIG_EXTERN\nOnigEncoding onig_get_encoding P_((OnigRegex reg));\nONIG_EXTERN\nOnigOptionType onig_get_options P_((OnigRegex reg));\nONIG_EXTERN\nOnigCaseFoldType onig_get_case_fold_flag P_((OnigRegex reg));\nONIG_EXTERN\nOnigSyntaxType* onig_get_syntax P_((OnigRegex reg));\nONIG_EXTERN\nint onig_set_default_syntax P_((OnigSyntaxType* syntax));\nONIG_EXTERN\nvoid onig_copy_syntax P_((OnigSyntaxType* to, const OnigSyntaxType* from));\nONIG_EXTERN\nunsigned int onig_get_syntax_op P_((OnigSyntaxType* syntax));\nONIG_EXTERN\nunsigned int onig_get_syntax_op2 P_((OnigSyntaxType* syntax));\nONIG_EXTERN\nunsigned int onig_get_syntax_behavior P_((OnigSyntaxType* syntax));\nONIG_EXTERN\nOnigOptionType onig_get_syntax_options P_((OnigSyntaxType* syntax));\nONIG_EXTERN\nvoid onig_set_syntax_op P_((OnigSyntaxType* syntax, unsigned int op));\nONIG_EXTERN\nvoid onig_set_syntax_op2 P_((OnigSyntaxType* syntax, unsigned int op2));\nONIG_EXTERN\nvoid onig_set_syntax_behavior P_((OnigSyntaxType* syntax, unsigned int behavior));\nONIG_EXTERN\nvoid onig_set_syntax_options P_((OnigSyntaxType* syntax, OnigOptionType options));\nONIG_EXTERN\nint onig_set_meta_char P_((OnigSyntaxType* syntax, unsigned int what, OnigCodePoint code));\nONIG_EXTERN\nvoid onig_copy_encoding P_((OnigEncoding to, OnigEncoding from));\nONIG_EXTERN\nOnigCaseFoldType onig_get_default_case_fold_flag P_((void));\nONIG_EXTERN\nint onig_set_default_case_fold_flag P_((OnigCaseFoldType case_fold_flag));\nONIG_EXTERN\nunsigned int onig_get_match_stack_limit_size P_((void));\nONIG_EXTERN\nint onig_set_match_stack_limit_size P_((unsigned int size));\nONIG_EXTERN\nint onig_end P_((void));\nONIG_EXTERN\nconst char* onig_version P_((void));\nONIG_EXTERN\nconst char* onig_copyright P_((void));\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* ONIGURUMA_H */\n"
  },
  {
    "path": "src/Onigmo/oniguruma.pc.in",
    "content": "prefix=@prefix@\nexec_prefix=@exec_prefix@\nlibdir=@libdir@\nincludedir=@includedir@\ndatarootdir=@datarootdir@\ndatadir=@datadir@\n\nName: oniguruma\nDescription: Regular expression library\nVersion: @PACKAGE_VERSION@\nRequires:\nLibs: -L${libdir} -lonig\nCflags: -I${includedir}\n\n"
  },
  {
    "path": "src/Onigmo/regcomp.c",
    "content": "/**********************************************************************\n  regcomp.c -  Onigmo (Oniguruma-mod) (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2008  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * Copyright (c) 2011-2013  K.Takata  <kentkt AT csc DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regparse.h\"\n\nOnigCaseFoldType OnigDefaultCaseFoldFlag = ONIGENC_CASE_FOLD_MIN;\n\nextern OnigCaseFoldType\nonig_get_default_case_fold_flag(void)\n{\n  return OnigDefaultCaseFoldFlag;\n}\n\nextern int\nonig_set_default_case_fold_flag(OnigCaseFoldType case_fold_flag)\n{\n  OnigDefaultCaseFoldFlag = case_fold_flag;\n  return 0;\n}\n\n\n#ifndef PLATFORM_UNALIGNED_WORD_ACCESS\nstatic unsigned char PadBuf[WORD_ALIGNMENT_SIZE];\n#endif\n\n#if 0\nstatic UChar*\nstr_dup(UChar* s, UChar* end)\n{\n  ptrdiff_t len = end - s;\n\n  if (len > 0) {\n    UChar* r = (UChar* )xmalloc(len + 1);\n    CHECK_NULL_RETURN(r);\n    xmemcpy(r, s, len);\n    r[len] = (UChar )0;\n    return r;\n  }\n  else return NULL;\n}\n#endif\n\nstatic void\nswap_node(Node* a, Node* b)\n{\n  Node c;\n  c = *a; *a = *b; *b = c;\n\n  if (NTYPE(a) == NT_STR) {\n    StrNode* sn = NSTR(a);\n    if (sn->capa == 0) {\n      size_t len = sn->end - sn->s;\n      sn->s   = sn->buf;\n      sn->end = sn->s + len;\n    }\n  }\n\n  if (NTYPE(b) == NT_STR) {\n    StrNode* sn = NSTR(b);\n    if (sn->capa == 0) {\n      size_t len = sn->end - sn->s;\n      sn->s   = sn->buf;\n      sn->end = sn->s + len;\n    }\n  }\n}\n\nstatic OnigDistance\ndistance_add(OnigDistance d1, OnigDistance d2)\n{\n  if (d1 == ONIG_INFINITE_DISTANCE || d2 == ONIG_INFINITE_DISTANCE)\n    return ONIG_INFINITE_DISTANCE;\n  else {\n    if (d1 <= ONIG_INFINITE_DISTANCE - d2) return d1 + d2;\n    else return ONIG_INFINITE_DISTANCE;\n  }\n}\n\nstatic OnigDistance\ndistance_multiply(OnigDistance d, int m)\n{\n  if (m == 0) return 0;\n\n  if (d < ONIG_INFINITE_DISTANCE / m)\n    return d * m;\n  else\n    return ONIG_INFINITE_DISTANCE;\n}\n\nstatic int\nbitset_is_empty(BitSetRef bs)\n{\n  int i;\n  for (i = 0; i < BITSET_SIZE; i++) {\n    if (bs[i] != 0) return 0;\n  }\n  return 1;\n}\n\n#ifdef ONIG_DEBUG\nstatic int\nbitset_on_num(BitSetRef bs)\n{\n  int i, n;\n\n  n = 0;\n  for (i = 0; i < SINGLE_BYTE_SIZE; i++) {\n    if (BITSET_AT(bs, i)) n++;\n  }\n  return n;\n}\n#endif\n\nextern int\nonig_bbuf_init(BBuf* buf, OnigDistance size)\n{\n  if (size <= 0) {\n    size   = 0;\n    buf->p = NULL;\n  }\n  else {\n    buf->p = (UChar* )xmalloc(size);\n    if (IS_NULL(buf->p)) return(ONIGERR_MEMORY);\n  }\n\n  buf->alloc = (unsigned int )size;\n  buf->used  = 0;\n  return 0;\n}\n\n\n#ifdef USE_SUBEXP_CALL\n\nstatic int\nunset_addr_list_init(UnsetAddrList* uslist, int size)\n{\n  UnsetAddr* p;\n\n  p = (UnsetAddr* )xmalloc(sizeof(UnsetAddr)* size);\n  CHECK_NULL_RETURN_MEMERR(p);\n  uslist->num   = 0;\n  uslist->alloc = size;\n  uslist->us    = p;\n  return 0;\n}\n\nstatic void\nunset_addr_list_end(UnsetAddrList* uslist)\n{\n  if (IS_NOT_NULL(uslist->us))\n    xfree(uslist->us);\n}\n\nstatic int\nunset_addr_list_add(UnsetAddrList* uslist, int offset, struct _Node* node)\n{\n  UnsetAddr* p;\n  int size;\n\n  if (uslist->num >= uslist->alloc) {\n    size = uslist->alloc * 2;\n    p = (UnsetAddr* )xrealloc(uslist->us, sizeof(UnsetAddr) * size);\n    CHECK_NULL_RETURN_MEMERR(p);\n    uslist->alloc = size;\n    uslist->us    = p;\n  }\n\n  uslist->us[uslist->num].offset = offset;\n  uslist->us[uslist->num].target = node;\n  uslist->num++;\n  return 0;\n}\n#endif /* USE_SUBEXP_CALL */\n\n\nstatic int\nadd_opcode(regex_t* reg, int opcode)\n{\n  BBUF_ADD1(reg, opcode);\n  return 0;\n}\n\n#ifdef USE_COMBINATION_EXPLOSION_CHECK\nstatic int\nadd_state_check_num(regex_t* reg, int num)\n{\n  StateCheckNumType n = (StateCheckNumType )num;\n\n  BBUF_ADD(reg, &n, SIZE_STATE_CHECK_NUM);\n  return 0;\n}\n#endif\n\nstatic int\nadd_rel_addr(regex_t* reg, int addr)\n{\n  RelAddrType ra = (RelAddrType )addr;\n\n  BBUF_ADD(reg, &ra, SIZE_RELADDR);\n  return 0;\n}\n\nstatic int\nadd_abs_addr(regex_t* reg, int addr)\n{\n  AbsAddrType ra = (AbsAddrType )addr;\n\n  BBUF_ADD(reg, &ra, SIZE_ABSADDR);\n  return 0;\n}\n\nstatic int\nadd_length(regex_t* reg, OnigDistance len)\n{\n  LengthType l = (LengthType )len;\n\n  BBUF_ADD(reg, &l, SIZE_LENGTH);\n  return 0;\n}\n\nstatic int\nadd_mem_num(regex_t* reg, int num)\n{\n  MemNumType n = (MemNumType )num;\n\n  BBUF_ADD(reg, &n, SIZE_MEMNUM);\n  return 0;\n}\n\nstatic int\nadd_pointer(regex_t* reg, void* addr)\n{\n  PointerType ptr = (PointerType )addr;\n\n  BBUF_ADD(reg, &ptr, SIZE_POINTER);\n  return 0;\n}\n\nstatic int\nadd_option(regex_t* reg, OnigOptionType option)\n{\n  BBUF_ADD(reg, &option, SIZE_OPTION);\n  return 0;\n}\n\nstatic int\nadd_opcode_rel_addr(regex_t* reg, int opcode, int addr)\n{\n  int r;\n\n  r = add_opcode(reg, opcode);\n  if (r) return r;\n  r = add_rel_addr(reg, addr);\n  return r;\n}\n\nstatic int\nadd_bytes(regex_t* reg, UChar* bytes, OnigDistance len)\n{\n  BBUF_ADD(reg, bytes, len);\n  return 0;\n}\n\nstatic int\nadd_bitset(regex_t* reg, BitSetRef bs)\n{\n  BBUF_ADD(reg, bs, SIZE_BITSET);\n  return 0;\n}\n\nstatic int\nadd_opcode_option(regex_t* reg, int opcode, OnigOptionType option)\n{\n  int r;\n\n  r = add_opcode(reg, opcode);\n  if (r) return r;\n  r = add_option(reg, option);\n  return r;\n}\n\nstatic int compile_length_tree(Node* node, regex_t* reg);\nstatic int compile_tree(Node* node, regex_t* reg);\n\n\n#define IS_NEED_STR_LEN_OP_EXACT(op) \\\n   ((op) == OP_EXACTN    || (op) == OP_EXACTMB2N ||\\\n    (op) == OP_EXACTMB3N || (op) == OP_EXACTMBN  || (op) == OP_EXACTN_IC)\n\nstatic int\nselect_str_opcode(int mb_len, OnigDistance str_len, int ignore_case)\n{\n  int op;\n\n  if (ignore_case) {\n    switch (str_len) {\n    case 1:  op = OP_EXACT1_IC; break;\n    default: op = OP_EXACTN_IC; break;\n    }\n  }\n  else {\n    switch (mb_len) {\n    case 1:\n      switch (str_len) {\n      case 1:  op = OP_EXACT1; break;\n      case 2:  op = OP_EXACT2; break;\n      case 3:  op = OP_EXACT3; break;\n      case 4:  op = OP_EXACT4; break;\n      case 5:  op = OP_EXACT5; break;\n      default: op = OP_EXACTN; break;\n      }\n      break;\n\n    case 2:\n      switch (str_len) {\n      case 1:  op = OP_EXACTMB2N1; break;\n      case 2:  op = OP_EXACTMB2N2; break;\n      case 3:  op = OP_EXACTMB2N3; break;\n      default: op = OP_EXACTMB2N;  break;\n      }\n      break;\n\n    case 3:\n      op = OP_EXACTMB3N;\n      break;\n\n    default:\n      op = OP_EXACTMBN;\n      break;\n    }\n  }\n  return op;\n}\n\nstatic int\ncompile_tree_empty_check(Node* node, regex_t* reg, int empty_info)\n{\n  int r;\n  int saved_num_null_check = reg->num_null_check;\n\n  if (empty_info != 0) {\n    r = add_opcode(reg, OP_NULL_CHECK_START);\n    if (r) return r;\n    r = add_mem_num(reg, reg->num_null_check); /* NULL CHECK ID */\n    if (r) return r;\n    reg->num_null_check++;\n  }\n\n  r = compile_tree(node, reg);\n  if (r) return r;\n\n  if (empty_info != 0) {\n    if (empty_info == NQ_TARGET_IS_EMPTY)\n      r = add_opcode(reg, OP_NULL_CHECK_END);\n    else if (empty_info == NQ_TARGET_IS_EMPTY_MEM)\n      r = add_opcode(reg, OP_NULL_CHECK_END_MEMST);\n    else if (empty_info == NQ_TARGET_IS_EMPTY_REC)\n      r = add_opcode(reg, OP_NULL_CHECK_END_MEMST_PUSH);\n\n    if (r) return r;\n    r = add_mem_num(reg, saved_num_null_check); /* NULL CHECK ID */\n  }\n  return r;\n}\n\n#ifdef USE_SUBEXP_CALL\nstatic int\ncompile_call(CallNode* node, regex_t* reg)\n{\n  int r;\n\n  r = add_opcode(reg, OP_CALL);\n  if (r) return r;\n  r = unset_addr_list_add(node->unset_addr_list, BBUF_GET_OFFSET_POS(reg),\n                          node->target);\n  if (r) return r;\n  r = add_abs_addr(reg, 0 /*dummy addr.*/);\n  return r;\n}\n#endif\n\nstatic int\ncompile_tree_n_times(Node* node, int n, regex_t* reg)\n{\n  int i, r;\n\n  for (i = 0; i < n; i++) {\n    r = compile_tree(node, reg);\n    if (r) return r;\n  }\n  return 0;\n}\n\nstatic int\nadd_compile_string_length(UChar* s ARG_UNUSED, int mb_len, OnigDistance str_len,\n                          regex_t* reg ARG_UNUSED, int ignore_case)\n{\n  int len;\n  int op = select_str_opcode(mb_len, str_len, ignore_case);\n\n  len = SIZE_OPCODE;\n\n  if (op == OP_EXACTMBN)  len += SIZE_LENGTH;\n  if (IS_NEED_STR_LEN_OP_EXACT(op))\n    len += SIZE_LENGTH;\n\n  len += mb_len * (int )str_len;\n  return len;\n}\n\nstatic int\nadd_compile_string(UChar* s, int mb_len, OnigDistance str_len,\n                   regex_t* reg, int ignore_case)\n{\n  int op = select_str_opcode(mb_len, str_len, ignore_case);\n  add_opcode(reg, op);\n\n  if (op == OP_EXACTMBN)\n    add_length(reg, mb_len);\n\n  if (IS_NEED_STR_LEN_OP_EXACT(op)) {\n    if (op == OP_EXACTN_IC)\n      add_length(reg, mb_len * str_len);\n    else\n      add_length(reg, str_len);\n  }\n\n  add_bytes(reg, s, mb_len * str_len);\n  return 0;\n}\n\n\nstatic int\ncompile_length_string_node(Node* node, regex_t* reg)\n{\n  int rlen, r, len, prev_len, slen, ambig;\n  OnigEncoding enc = reg->enc;\n  UChar *p, *prev;\n  StrNode* sn;\n\n  sn = NSTR(node);\n  if (sn->end <= sn->s)\n    return 0;\n\n  ambig = NSTRING_IS_AMBIG(node);\n\n  p = prev = sn->s;\n  prev_len = enclen(enc, p);\n  p += prev_len;\n  slen = 1;\n  rlen = 0;\n\n  for (; p < sn->end; ) {\n    len = enclen(enc, p);\n    if (len == prev_len) {\n      slen++;\n    }\n    else {\n      r = add_compile_string_length(prev, prev_len, slen, reg, ambig);\n      rlen += r;\n      prev = p;\n      slen = 1;\n      prev_len = len;\n    }\n    p += len;\n  }\n  r = add_compile_string_length(prev, prev_len, slen, reg, ambig);\n  rlen += r;\n  return rlen;\n}\n\nstatic int\ncompile_length_string_raw_node(StrNode* sn, regex_t* reg)\n{\n  if (sn->end <= sn->s)\n    return 0;\n\n  return add_compile_string_length(sn->s, 1 /* sb */, sn->end - sn->s, reg, 0);\n}\n\nstatic int\ncompile_string_node(Node* node, regex_t* reg)\n{\n  int r, len, prev_len, slen, ambig;\n  OnigEncoding enc = reg->enc;\n  UChar *p, *prev, *end;\n  StrNode* sn;\n\n  sn = NSTR(node);\n  if (sn->end <= sn->s)\n    return 0;\n\n  end = sn->end;\n  ambig = NSTRING_IS_AMBIG(node);\n\n  p = prev = sn->s;\n  prev_len = enclen(enc, p);\n  p += prev_len;\n  slen = 1;\n\n  for (; p < end; ) {\n    len = enclen(enc, p);\n    if (len == prev_len) {\n      slen++;\n    }\n    else {\n      r = add_compile_string(prev, prev_len, slen, reg, ambig);\n      if (r) return r;\n\n      prev  = p;\n      slen  = 1;\n      prev_len = len;\n    }\n\n    p += len;\n  }\n  return add_compile_string(prev, prev_len, slen, reg, ambig);\n}\n\nstatic int\ncompile_string_raw_node(StrNode* sn, regex_t* reg)\n{\n  if (sn->end <= sn->s)\n    return 0;\n\n  return add_compile_string(sn->s, 1 /* sb */, sn->end - sn->s, reg, 0);\n}\n\nstatic int\nadd_multi_byte_cclass(BBuf* mbuf, regex_t* reg)\n{\n#ifdef PLATFORM_UNALIGNED_WORD_ACCESS\n  add_length(reg, mbuf->used);\n  return add_bytes(reg, mbuf->p, mbuf->used);\n#else\n  int r, pad_size;\n  UChar* p = BBUF_GET_ADD_ADDRESS(reg) + SIZE_LENGTH;\n\n  GET_ALIGNMENT_PAD_SIZE(p, pad_size);\n  add_length(reg, mbuf->used + (WORD_ALIGNMENT_SIZE - 1));\n  if (pad_size != 0) add_bytes(reg, PadBuf, pad_size);\n\n  r = add_bytes(reg, mbuf->p, mbuf->used);\n\n  /* padding for return value from compile_length_cclass_node() to be fix. */\n  pad_size = (WORD_ALIGNMENT_SIZE - 1) - pad_size;\n  if (pad_size != 0) add_bytes(reg, PadBuf, pad_size);\n  return r;\n#endif\n}\n\nstatic int\ncompile_length_cclass_node(CClassNode* cc, regex_t* reg)\n{\n  int len;\n\n  if (IS_NCCLASS_SHARE(cc)) {\n    len = SIZE_OPCODE + SIZE_POINTER;\n    return len;\n  }\n\n  if (IS_NULL(cc->mbuf)) {\n    len = SIZE_OPCODE + SIZE_BITSET;\n  }\n  else {\n    if (ONIGENC_MBC_MINLEN(reg->enc) > 1 || bitset_is_empty(cc->bs)) {\n      len = SIZE_OPCODE;\n    }\n    else {\n      len = SIZE_OPCODE + SIZE_BITSET;\n    }\n#ifdef PLATFORM_UNALIGNED_WORD_ACCESS\n    len += SIZE_LENGTH + cc->mbuf->used;\n#else\n    len += SIZE_LENGTH + cc->mbuf->used + (WORD_ALIGNMENT_SIZE - 1);\n#endif\n  }\n\n  return len;\n}\n\nstatic int\ncompile_cclass_node(CClassNode* cc, regex_t* reg)\n{\n  int r;\n\n  if (IS_NCCLASS_SHARE(cc)) {\n    add_opcode(reg, OP_CCLASS_NODE);\n    r = add_pointer(reg, cc);\n    return r;\n  }\n\n  if (IS_NULL(cc->mbuf)) {\n    if (IS_NCCLASS_NOT(cc))\n      add_opcode(reg, OP_CCLASS_NOT);\n    else\n      add_opcode(reg, OP_CCLASS);\n\n    r = add_bitset(reg, cc->bs);\n  }\n  else {\n    if (ONIGENC_MBC_MINLEN(reg->enc) > 1 || bitset_is_empty(cc->bs)) {\n      if (IS_NCCLASS_NOT(cc))\n        add_opcode(reg, OP_CCLASS_MB_NOT);\n      else\n        add_opcode(reg, OP_CCLASS_MB);\n\n      r = add_multi_byte_cclass(cc->mbuf, reg);\n    }\n    else {\n      if (IS_NCCLASS_NOT(cc))\n        add_opcode(reg, OP_CCLASS_MIX_NOT);\n      else\n        add_opcode(reg, OP_CCLASS_MIX);\n\n      r = add_bitset(reg, cc->bs);\n      if (r) return r;\n      r = add_multi_byte_cclass(cc->mbuf, reg);\n    }\n  }\n\n  return r;\n}\n\nstatic int\nentry_repeat_range(regex_t* reg, int id, int lower, int upper)\n{\n#define REPEAT_RANGE_ALLOC  4\n\n  OnigRepeatRange* p;\n\n  if (reg->repeat_range_alloc == 0) {\n    p = (OnigRepeatRange* )xmalloc(sizeof(OnigRepeatRange) * REPEAT_RANGE_ALLOC);\n    CHECK_NULL_RETURN_MEMERR(p);\n    reg->repeat_range = p;\n    reg->repeat_range_alloc = REPEAT_RANGE_ALLOC;\n  }\n  else if (reg->repeat_range_alloc <= id) {\n    int n;\n    n = reg->repeat_range_alloc + REPEAT_RANGE_ALLOC;\n    p = (OnigRepeatRange* )xrealloc(reg->repeat_range,\n                                    sizeof(OnigRepeatRange) * n);\n    CHECK_NULL_RETURN_MEMERR(p);\n    reg->repeat_range = p;\n    reg->repeat_range_alloc = n;\n  }\n  else {\n    p = reg->repeat_range;\n  }\n\n  p[id].lower = lower;\n  p[id].upper = (IS_REPEAT_INFINITE(upper) ? 0x7fffffff : upper);\n  return 0;\n}\n\nstatic int\ncompile_range_repeat_node(QtfrNode* qn, int target_len, int empty_info,\n                          regex_t* reg)\n{\n  int r;\n  int num_repeat = reg->num_repeat;\n\n  r = add_opcode(reg, qn->greedy ? OP_REPEAT : OP_REPEAT_NG);\n  if (r) return r;\n  r = add_mem_num(reg, num_repeat); /* OP_REPEAT ID */\n  reg->num_repeat++;\n  if (r) return r;\n  r = add_rel_addr(reg, target_len + SIZE_OP_REPEAT_INC);\n  if (r) return r;\n\n  r = entry_repeat_range(reg, num_repeat, qn->lower, qn->upper);\n  if (r) return r;\n\n  r = compile_tree_empty_check(qn->target, reg, empty_info);\n  if (r) return r;\n\n  if (\n#ifdef USE_SUBEXP_CALL\n      reg->num_call > 0 ||\n#endif\n      IS_QUANTIFIER_IN_REPEAT(qn)) {\n    r = add_opcode(reg, qn->greedy ? OP_REPEAT_INC_SG : OP_REPEAT_INC_NG_SG);\n  }\n  else {\n    r = add_opcode(reg, qn->greedy ? OP_REPEAT_INC : OP_REPEAT_INC_NG);\n  }\n  if (r) return r;\n  r = add_mem_num(reg, num_repeat); /* OP_REPEAT ID */\n  return r;\n}\n\nstatic int\nis_anychar_star_quantifier(QtfrNode* qn)\n{\n  if (qn->greedy && IS_REPEAT_INFINITE(qn->upper) &&\n      NTYPE(qn->target) == NT_CANY)\n    return 1;\n  else\n    return 0;\n}\n\n#define QUANTIFIER_EXPAND_LIMIT_SIZE   50\n#define CKN_ON   (ckn > 0)\n\n#ifdef USE_COMBINATION_EXPLOSION_CHECK\n\nstatic int\ncompile_length_quantifier_node(QtfrNode* qn, regex_t* reg)\n{\n  int len, mod_tlen, cklen;\n  int ckn;\n  int infinite = IS_REPEAT_INFINITE(qn->upper);\n  int empty_info = qn->target_empty_info;\n  int tlen = compile_length_tree(qn->target, reg);\n\n  if (tlen < 0) return tlen;\n\n  ckn = ((reg->num_comb_exp_check > 0) ? qn->comb_exp_check_num : 0);\n\n  cklen = (CKN_ON ? SIZE_STATE_CHECK_NUM: 0);\n\n  /* anychar repeat */\n  if (NTYPE(qn->target) == NT_CANY) {\n    if (qn->greedy && infinite) {\n      if (IS_NOT_NULL(qn->next_head_exact) && !CKN_ON)\n        return SIZE_OP_ANYCHAR_STAR_PEEK_NEXT + tlen * qn->lower + cklen;\n      else\n        return SIZE_OP_ANYCHAR_STAR + tlen * qn->lower + cklen;\n    }\n  }\n\n  if (empty_info != 0)\n    mod_tlen = tlen + (SIZE_OP_NULL_CHECK_START + SIZE_OP_NULL_CHECK_END);\n  else\n    mod_tlen = tlen;\n\n  if (infinite && qn->lower <= 1) {\n    if (qn->greedy) {\n      if (qn->lower == 1)\n\tlen = SIZE_OP_JUMP;\n      else\n\tlen = 0;\n\n      len += SIZE_OP_PUSH + cklen + mod_tlen + SIZE_OP_JUMP;\n    }\n    else {\n      if (qn->lower == 0)\n\tlen = SIZE_OP_JUMP;\n      else\n\tlen = 0;\n\n      len += mod_tlen + SIZE_OP_PUSH + cklen;\n    }\n  }\n  else if (qn->upper == 0) {\n    if (qn->is_refered != 0) /* /(?<n>..){0}/ */\n      len = SIZE_OP_JUMP + tlen;\n    else\n      len = 0;\n  }\n  else if (qn->upper == 1 && qn->greedy) {\n    if (qn->lower == 0) {\n      if (CKN_ON) {\n\tlen = SIZE_OP_STATE_CHECK_PUSH + tlen;\n      }\n      else {\n\tlen = SIZE_OP_PUSH + tlen;\n      }\n    }\n    else {\n      len = tlen;\n    }\n  }\n  else if (!qn->greedy && qn->upper == 1 && qn->lower == 0) { /* '??' */\n    len = SIZE_OP_PUSH + cklen + SIZE_OP_JUMP + tlen;\n  }\n  else {\n    len = SIZE_OP_REPEAT_INC\n        + mod_tlen + SIZE_OPCODE + SIZE_RELADDR + SIZE_MEMNUM;\n    if (CKN_ON)\n      len += SIZE_OP_STATE_CHECK;\n  }\n\n  return len;\n}\n\nstatic int\ncompile_quantifier_node(QtfrNode* qn, regex_t* reg)\n{\n  int r, mod_tlen;\n  int ckn;\n  int infinite = IS_REPEAT_INFINITE(qn->upper);\n  int empty_info = qn->target_empty_info;\n  int tlen = compile_length_tree(qn->target, reg);\n\n  if (tlen < 0) return tlen;\n\n  ckn = ((reg->num_comb_exp_check > 0) ? qn->comb_exp_check_num : 0);\n\n  if (is_anychar_star_quantifier(qn)) {\n    r = compile_tree_n_times(qn->target, qn->lower, reg);\n    if (r) return r;\n    if (IS_NOT_NULL(qn->next_head_exact) && !CKN_ON) {\n      if (IS_MULTILINE(reg->options))\n\tr = add_opcode(reg, OP_ANYCHAR_ML_STAR_PEEK_NEXT);\n      else\n\tr = add_opcode(reg, OP_ANYCHAR_STAR_PEEK_NEXT);\n      if (r) return r;\n      if (CKN_ON) {\n\tr = add_state_check_num(reg, ckn);\n\tif (r) return r;\n      }\n\n      return add_bytes(reg, NSTR(qn->next_head_exact)->s, 1);\n    }\n    else {\n      if (IS_MULTILINE(reg->options)) {\n\tr = add_opcode(reg, (CKN_ON ?\n\t\t\t       OP_STATE_CHECK_ANYCHAR_ML_STAR\n\t\t\t     : OP_ANYCHAR_ML_STAR));\n      }\n      else {\n\tr = add_opcode(reg, (CKN_ON ?\n\t\t\t       OP_STATE_CHECK_ANYCHAR_STAR\n\t\t\t     : OP_ANYCHAR_STAR));\n      }\n      if (r) return r;\n      if (CKN_ON)\n\tr = add_state_check_num(reg, ckn);\n\n      return r;\n    }\n  }\n\n  if (empty_info != 0)\n    mod_tlen = tlen + (SIZE_OP_NULL_CHECK_START + SIZE_OP_NULL_CHECK_END);\n  else\n    mod_tlen = tlen;\n\n  if (infinite && qn->lower <= 1) {\n    if (qn->greedy) {\n      if (qn->lower == 1) {\n\tr = add_opcode_rel_addr(reg, OP_JUMP,\n\t\t\t(CKN_ON ? SIZE_OP_STATE_CHECK_PUSH : SIZE_OP_PUSH));\n\tif (r) return r;\n      }\n\n      if (CKN_ON) {\n\tr = add_opcode(reg, OP_STATE_CHECK_PUSH);\n\tif (r) return r;\n\tr = add_state_check_num(reg, ckn);\n\tif (r) return r;\n\tr = add_rel_addr(reg, mod_tlen + SIZE_OP_JUMP);\n      }\n      else {\n\tr = add_opcode_rel_addr(reg, OP_PUSH, mod_tlen + SIZE_OP_JUMP);\n      }\n      if (r) return r;\n      r = compile_tree_empty_check(qn->target, reg, empty_info);\n      if (r) return r;\n      r = add_opcode_rel_addr(reg, OP_JUMP,\n\t      -(mod_tlen + (int )SIZE_OP_JUMP\n\t\t+ (int )(CKN_ON ? SIZE_OP_STATE_CHECK_PUSH : SIZE_OP_PUSH)));\n    }\n    else {\n      if (qn->lower == 0) {\n\tr = add_opcode_rel_addr(reg, OP_JUMP, mod_tlen);\n\tif (r) return r;\n      }\n      r = compile_tree_empty_check(qn->target, reg, empty_info);\n      if (r) return r;\n      if (CKN_ON) {\n\tr = add_opcode(reg, OP_STATE_CHECK_PUSH_OR_JUMP);\n\tif (r) return r;\n\tr = add_state_check_num(reg, ckn);\n\tif (r) return r;\n\tr = add_rel_addr(reg,\n\t\t -(mod_tlen + (int )SIZE_OP_STATE_CHECK_PUSH_OR_JUMP));\n      }\n      else\n\tr = add_opcode_rel_addr(reg, OP_PUSH, -(mod_tlen + (int )SIZE_OP_PUSH));\n    }\n  }\n  else if (qn->upper == 0) {\n    if (qn->is_refered != 0) { /* /(?<n>..){0}/ */\n      r = add_opcode_rel_addr(reg, OP_JUMP, tlen);\n      if (r) return r;\n      r = compile_tree(qn->target, reg);\n    }\n    else\n      r = 0;\n  }\n  else if (qn->upper == 1 && qn->greedy) {\n    if (qn->lower == 0) {\n      if (CKN_ON) {\n\tr = add_opcode(reg, OP_STATE_CHECK_PUSH);\n\tif (r) return r;\n\tr = add_state_check_num(reg, ckn);\n\tif (r) return r;\n\tr = add_rel_addr(reg, tlen);\n      }\n      else {\n\tr = add_opcode_rel_addr(reg, OP_PUSH, tlen);\n      }\n      if (r) return r;\n    }\n\n    r = compile_tree(qn->target, reg);\n  }\n  else if (!qn->greedy && qn->upper == 1 && qn->lower == 0) { /* '??' */\n    if (CKN_ON) {\n      r = add_opcode(reg, OP_STATE_CHECK_PUSH);\n      if (r) return r;\n      r = add_state_check_num(reg, ckn);\n      if (r) return r;\n      r = add_rel_addr(reg, SIZE_OP_JUMP);\n    }\n    else {\n      r = add_opcode_rel_addr(reg, OP_PUSH, SIZE_OP_JUMP);\n    }\n\n    if (r) return r;\n    r = add_opcode_rel_addr(reg, OP_JUMP, tlen);\n    if (r) return r;\n    r = compile_tree(qn->target, reg);\n  }\n  else {\n    r = compile_range_repeat_node(qn, mod_tlen, empty_info, reg);\n    if (CKN_ON) {\n      if (r) return r;\n      r = add_opcode(reg, OP_STATE_CHECK);\n      if (r) return r;\n      r = add_state_check_num(reg, ckn);\n    }\n  }\n  return r;\n}\n\n#else /* USE_COMBINATION_EXPLOSION_CHECK */\n\nstatic int\ncompile_length_quantifier_node(QtfrNode* qn, regex_t* reg)\n{\n  int len, mod_tlen;\n  int infinite = IS_REPEAT_INFINITE(qn->upper);\n  int empty_info = qn->target_empty_info;\n  int tlen = compile_length_tree(qn->target, reg);\n\n  if (tlen < 0) return tlen;\n\n  /* anychar repeat */\n  if (NTYPE(qn->target) == NT_CANY) {\n    if (qn->greedy && infinite) {\n      if (IS_NOT_NULL(qn->next_head_exact))\n        return SIZE_OP_ANYCHAR_STAR_PEEK_NEXT + tlen * qn->lower;\n      else\n        return SIZE_OP_ANYCHAR_STAR + tlen * qn->lower;\n    }\n  }\n\n  if (empty_info != 0)\n    mod_tlen = tlen + (SIZE_OP_NULL_CHECK_START + SIZE_OP_NULL_CHECK_END);\n  else\n    mod_tlen = tlen;\n\n  if (infinite &&\n      (qn->lower <= 1 || tlen * qn->lower <= QUANTIFIER_EXPAND_LIMIT_SIZE)) {\n    if (qn->lower == 1 && tlen > QUANTIFIER_EXPAND_LIMIT_SIZE) {\n      len = SIZE_OP_JUMP;\n    }\n    else {\n      len = tlen * qn->lower;\n    }\n\n    if (qn->greedy) {\n      if (IS_NOT_NULL(qn->head_exact))\n\tlen += SIZE_OP_PUSH_OR_JUMP_EXACT1 + mod_tlen + SIZE_OP_JUMP;\n      else if (IS_NOT_NULL(qn->next_head_exact))\n\tlen += SIZE_OP_PUSH_IF_PEEK_NEXT + mod_tlen + SIZE_OP_JUMP;\n      else\n\tlen += SIZE_OP_PUSH + mod_tlen + SIZE_OP_JUMP;\n    }\n    else\n      len += SIZE_OP_JUMP + mod_tlen + SIZE_OP_PUSH;\n  }\n  else if (qn->upper == 0 && qn->is_refered != 0) { /* /(?<n>..){0}/ */\n    len = SIZE_OP_JUMP + tlen;\n  }\n  else if (!infinite && qn->greedy &&\n           (qn->upper == 1 || (tlen + SIZE_OP_PUSH) * qn->upper\n                                      <= QUANTIFIER_EXPAND_LIMIT_SIZE)) {\n    len = tlen * qn->lower;\n    len += (SIZE_OP_PUSH + tlen) * (qn->upper - qn->lower);\n  }\n  else if (!qn->greedy && qn->upper == 1 && qn->lower == 0) { /* '??' */\n    len = SIZE_OP_PUSH + SIZE_OP_JUMP + tlen;\n  }\n  else {\n    len = SIZE_OP_REPEAT_INC\n        + mod_tlen + SIZE_OPCODE + SIZE_RELADDR + SIZE_MEMNUM;\n  }\n\n  return len;\n}\n\nstatic int\ncompile_quantifier_node(QtfrNode* qn, regex_t* reg)\n{\n  int i, r, mod_tlen;\n  int infinite = IS_REPEAT_INFINITE(qn->upper);\n  int empty_info = qn->target_empty_info;\n  int tlen = compile_length_tree(qn->target, reg);\n\n  if (tlen < 0) return tlen;\n\n  if (is_anychar_star_quantifier(qn)) {\n    r = compile_tree_n_times(qn->target, qn->lower, reg);\n    if (r) return r;\n    if (IS_NOT_NULL(qn->next_head_exact)) {\n      if (IS_MULTILINE(reg->options))\n\tr = add_opcode(reg, OP_ANYCHAR_ML_STAR_PEEK_NEXT);\n      else\n\tr = add_opcode(reg, OP_ANYCHAR_STAR_PEEK_NEXT);\n      if (r) return r;\n      return add_bytes(reg, NSTR(qn->next_head_exact)->s, 1);\n    }\n    else {\n      if (IS_MULTILINE(reg->options))\n\treturn add_opcode(reg, OP_ANYCHAR_ML_STAR);\n      else\n\treturn add_opcode(reg, OP_ANYCHAR_STAR);\n    }\n  }\n\n  if (empty_info != 0)\n    mod_tlen = tlen + (SIZE_OP_NULL_CHECK_START + SIZE_OP_NULL_CHECK_END);\n  else\n    mod_tlen = tlen;\n\n  if (infinite &&\n      (qn->lower <= 1 || tlen * qn->lower <= QUANTIFIER_EXPAND_LIMIT_SIZE)) {\n    if (qn->lower == 1 && tlen > QUANTIFIER_EXPAND_LIMIT_SIZE) {\n      if (qn->greedy) {\n\tif (IS_NOT_NULL(qn->head_exact))\n\t  r = add_opcode_rel_addr(reg, OP_JUMP, SIZE_OP_PUSH_OR_JUMP_EXACT1);\n\telse if (IS_NOT_NULL(qn->next_head_exact))\n\t  r = add_opcode_rel_addr(reg, OP_JUMP, SIZE_OP_PUSH_IF_PEEK_NEXT);\n\telse\n\t  r = add_opcode_rel_addr(reg, OP_JUMP, SIZE_OP_PUSH);\n      }\n      else {\n\tr = add_opcode_rel_addr(reg, OP_JUMP, SIZE_OP_JUMP);\n      }\n      if (r) return r;\n    }\n    else {\n      r = compile_tree_n_times(qn->target, qn->lower, reg);\n      if (r) return r;\n    }\n\n    if (qn->greedy) {\n      if (IS_NOT_NULL(qn->head_exact)) {\n\tr = add_opcode_rel_addr(reg, OP_PUSH_OR_JUMP_EXACT1,\n\t\t\t     mod_tlen + SIZE_OP_JUMP);\n\tif (r) return r;\n\tadd_bytes(reg, NSTR(qn->head_exact)->s, 1);\n\tr = compile_tree_empty_check(qn->target, reg, empty_info);\n\tif (r) return r;\n\tr = add_opcode_rel_addr(reg, OP_JUMP,\n\t-(mod_tlen + (int )SIZE_OP_JUMP + (int )SIZE_OP_PUSH_OR_JUMP_EXACT1));\n      }\n      else if (IS_NOT_NULL(qn->next_head_exact)) {\n\tr = add_opcode_rel_addr(reg, OP_PUSH_IF_PEEK_NEXT,\n\t\t\t\tmod_tlen + SIZE_OP_JUMP);\n\tif (r) return r;\n\tadd_bytes(reg, NSTR(qn->next_head_exact)->s, 1);\n\tr = compile_tree_empty_check(qn->target, reg, empty_info);\n\tif (r) return r;\n\tr = add_opcode_rel_addr(reg, OP_JUMP,\n          -(mod_tlen + (int )SIZE_OP_JUMP + (int )SIZE_OP_PUSH_IF_PEEK_NEXT));\n      }\n      else {\n\tr = add_opcode_rel_addr(reg, OP_PUSH, mod_tlen + SIZE_OP_JUMP);\n\tif (r) return r;\n\tr = compile_tree_empty_check(qn->target, reg, empty_info);\n\tif (r) return r;\n\tr = add_opcode_rel_addr(reg, OP_JUMP,\n\t\t     -(mod_tlen + (int )SIZE_OP_JUMP + (int )SIZE_OP_PUSH));\n      }\n    }\n    else {\n      r = add_opcode_rel_addr(reg, OP_JUMP, mod_tlen);\n      if (r) return r;\n      r = compile_tree_empty_check(qn->target, reg, empty_info);\n      if (r) return r;\n      r = add_opcode_rel_addr(reg, OP_PUSH, -(mod_tlen + (int )SIZE_OP_PUSH));\n    }\n  }\n  else if (qn->upper == 0 && qn->is_refered != 0) { /* /(?<n>..){0}/ */\n    r = add_opcode_rel_addr(reg, OP_JUMP, tlen);\n    if (r) return r;\n    r = compile_tree(qn->target, reg);\n  }\n  else if (!infinite && qn->greedy &&\n           (qn->upper == 1 || (tlen + SIZE_OP_PUSH) * qn->upper\n                                  <= QUANTIFIER_EXPAND_LIMIT_SIZE)) {\n    int n = qn->upper - qn->lower;\n\n    r = compile_tree_n_times(qn->target, qn->lower, reg);\n    if (r) return r;\n\n    for (i = 0; i < n; i++) {\n      r = add_opcode_rel_addr(reg, OP_PUSH,\n\t\t\t   (n - i) * tlen + (n - i - 1) * SIZE_OP_PUSH);\n      if (r) return r;\n      r = compile_tree(qn->target, reg);\n      if (r) return r;\n    }\n  }\n  else if (!qn->greedy && qn->upper == 1 && qn->lower == 0) { /* '??' */\n    r = add_opcode_rel_addr(reg, OP_PUSH, SIZE_OP_JUMP);\n    if (r) return r;\n    r = add_opcode_rel_addr(reg, OP_JUMP, tlen);\n    if (r) return r;\n    r = compile_tree(qn->target, reg);\n  }\n  else {\n    r = compile_range_repeat_node(qn, mod_tlen, empty_info, reg);\n  }\n  return r;\n}\n#endif /* USE_COMBINATION_EXPLOSION_CHECK */\n\nstatic int\ncompile_length_option_node(EncloseNode* node, regex_t* reg)\n{\n  int tlen;\n  OnigOptionType prev = reg->options;\n\n  reg->options = node->option;\n  tlen = compile_length_tree(node->target, reg);\n  reg->options = prev;\n\n  if (tlen < 0) return tlen;\n\n  if (IS_DYNAMIC_OPTION(prev ^ node->option)) {\n    return SIZE_OP_SET_OPTION_PUSH + SIZE_OP_SET_OPTION + SIZE_OP_FAIL\n           + tlen + SIZE_OP_SET_OPTION;\n  }\n  else\n    return tlen;\n}\n\nstatic int\ncompile_option_node(EncloseNode* node, regex_t* reg)\n{\n  int r;\n  OnigOptionType prev = reg->options;\n\n  if (IS_DYNAMIC_OPTION(prev ^ node->option)) {\n    r = add_opcode_option(reg, OP_SET_OPTION_PUSH, node->option);\n    if (r) return r;\n    r = add_opcode_option(reg, OP_SET_OPTION, prev);\n    if (r) return r;\n    r = add_opcode(reg, OP_FAIL);\n    if (r) return r;\n  }\n\n  reg->options = node->option;\n  r = compile_tree(node->target, reg);\n  reg->options = prev;\n\n  if (IS_DYNAMIC_OPTION(prev ^ node->option)) {\n    if (r) return r;\n    r = add_opcode_option(reg, OP_SET_OPTION, prev);\n  }\n  return r;\n}\n\nstatic int\ncompile_length_enclose_node(EncloseNode* node, regex_t* reg)\n{\n  int len;\n  int tlen;\n\n  if (node->type == ENCLOSE_OPTION)\n    return compile_length_option_node(node, reg);\n\n  if (node->target) {\n    tlen = compile_length_tree(node->target, reg);\n    if (tlen < 0) return tlen;\n  }\n  else\n    tlen = 0;\n\n  switch (node->type) {\n  case ENCLOSE_MEMORY:\n#ifdef USE_SUBEXP_CALL\n    if (IS_ENCLOSE_CALLED(node)) {\n      len = SIZE_OP_MEMORY_START_PUSH + tlen\n\t  + SIZE_OP_CALL + SIZE_OP_JUMP + SIZE_OP_RETURN;\n      if (BIT_STATUS_AT(reg->bt_mem_end, node->regnum))\n\tlen += (IS_ENCLOSE_RECURSION(node)\n\t\t? SIZE_OP_MEMORY_END_PUSH_REC : SIZE_OP_MEMORY_END_PUSH);\n      else\n\tlen += (IS_ENCLOSE_RECURSION(node)\n\t\t? SIZE_OP_MEMORY_END_REC : SIZE_OP_MEMORY_END);\n    }\n    else\n#endif\n    {\n      if (BIT_STATUS_AT(reg->bt_mem_start, node->regnum))\n\tlen = SIZE_OP_MEMORY_START_PUSH;\n      else\n\tlen = SIZE_OP_MEMORY_START;\n\n      len += tlen + (BIT_STATUS_AT(reg->bt_mem_end, node->regnum)\n\t\t     ? SIZE_OP_MEMORY_END_PUSH : SIZE_OP_MEMORY_END);\n    }\n    break;\n\n  case ENCLOSE_STOP_BACKTRACK:\n    if (IS_ENCLOSE_STOP_BT_SIMPLE_REPEAT(node)) {\n      QtfrNode* qn = NQTFR(node->target);\n      tlen = compile_length_tree(qn->target, reg);\n      if (tlen < 0) return tlen;\n\n      len = tlen * qn->lower\n\t  + SIZE_OP_PUSH + tlen + SIZE_OP_POP + SIZE_OP_JUMP;\n    }\n    else {\n      len = SIZE_OP_PUSH_STOP_BT + tlen + SIZE_OP_POP_STOP_BT;\n    }\n    break;\n\n  case ENCLOSE_CONDITION:\n    len = SIZE_OP_CONDITION;\n    if (NTYPE(node->target) == NT_ALT) {\n      Node* x = node->target;\n\n      tlen = compile_length_tree(NCAR(x), reg); /* yes-node */\n      if (tlen < 0) return tlen;\n      len += tlen + SIZE_OP_JUMP;\n      if (NCDR(x) == NULL) return ONIGERR_PARSER_BUG;\n      x = NCDR(x);\n      tlen = compile_length_tree(NCAR(x), reg); /* no-node */\n      if (tlen < 0) return tlen;\n      len += tlen;\n      if (NCDR(x) != NULL) return ONIGERR_INVALID_CONDITION_PATTERN;\n    }\n    else {\n      return ONIGERR_PARSER_BUG;\n    }\n    break;\n\n  default:\n    return ONIGERR_TYPE_BUG;\n    break;\n  }\n\n  return len;\n}\n\nstatic int get_char_length_tree(Node* node, regex_t* reg, int* len);\n\nstatic int\ncompile_enclose_node(EncloseNode* node, regex_t* reg)\n{\n  int r, len;\n\n  if (node->type == ENCLOSE_OPTION)\n    return compile_option_node(node, reg);\n\n  switch (node->type) {\n  case ENCLOSE_MEMORY:\n#ifdef USE_SUBEXP_CALL\n    if (IS_ENCLOSE_CALLED(node)) {\n      r = add_opcode(reg, OP_CALL);\n      if (r) return r;\n      node->call_addr = BBUF_GET_OFFSET_POS(reg) + SIZE_ABSADDR + SIZE_OP_JUMP;\n      node->state |= NST_ADDR_FIXED;\n      r = add_abs_addr(reg, (int )node->call_addr);\n      if (r) return r;\n      len = compile_length_tree(node->target, reg);\n      len += (SIZE_OP_MEMORY_START_PUSH + SIZE_OP_RETURN);\n      if (BIT_STATUS_AT(reg->bt_mem_end, node->regnum))\n\tlen += (IS_ENCLOSE_RECURSION(node)\n\t\t? SIZE_OP_MEMORY_END_PUSH_REC : SIZE_OP_MEMORY_END_PUSH);\n      else\n\tlen += (IS_ENCLOSE_RECURSION(node)\n\t\t? SIZE_OP_MEMORY_END_REC : SIZE_OP_MEMORY_END);\n\n      r = add_opcode_rel_addr(reg, OP_JUMP, len);\n      if (r) return r;\n    }\n#endif\n    if (BIT_STATUS_AT(reg->bt_mem_start, node->regnum))\n      r = add_opcode(reg, OP_MEMORY_START_PUSH);\n    else\n      r = add_opcode(reg, OP_MEMORY_START);\n    if (r) return r;\n    r = add_mem_num(reg, node->regnum);\n    if (r) return r;\n    r = compile_tree(node->target, reg);\n    if (r) return r;\n#ifdef USE_SUBEXP_CALL\n    if (IS_ENCLOSE_CALLED(node)) {\n      if (BIT_STATUS_AT(reg->bt_mem_end, node->regnum))\n\tr = add_opcode(reg, (IS_ENCLOSE_RECURSION(node)\n\t\t\t     ? OP_MEMORY_END_PUSH_REC : OP_MEMORY_END_PUSH));\n      else\n\tr = add_opcode(reg, (IS_ENCLOSE_RECURSION(node)\n\t\t\t     ? OP_MEMORY_END_REC : OP_MEMORY_END));\n\n      if (r) return r;\n      r = add_mem_num(reg, node->regnum);\n      if (r) return r;\n      r = add_opcode(reg, OP_RETURN);\n    }\n    else\n#endif\n    {\n      if (BIT_STATUS_AT(reg->bt_mem_end, node->regnum))\n\tr = add_opcode(reg, OP_MEMORY_END_PUSH);\n      else\n\tr = add_opcode(reg, OP_MEMORY_END);\n      if (r) return r;\n      r = add_mem_num(reg, node->regnum);\n    }\n    break;\n\n  case ENCLOSE_STOP_BACKTRACK:\n    if (IS_ENCLOSE_STOP_BT_SIMPLE_REPEAT(node)) {\n      QtfrNode* qn = NQTFR(node->target);\n      r = compile_tree_n_times(qn->target, qn->lower, reg);\n      if (r) return r;\n\n      len = compile_length_tree(qn->target, reg);\n      if (len < 0) return len;\n\n      r = add_opcode_rel_addr(reg, OP_PUSH, len + SIZE_OP_POP + SIZE_OP_JUMP);\n      if (r) return r;\n      r = compile_tree(qn->target, reg);\n      if (r) return r;\n      r = add_opcode(reg, OP_POP);\n      if (r) return r;\n      r = add_opcode_rel_addr(reg, OP_JUMP,\n\t -((int )SIZE_OP_PUSH + len + (int )SIZE_OP_POP + (int )SIZE_OP_JUMP));\n    }\n    else {\n      r = add_opcode(reg, OP_PUSH_STOP_BT);\n      if (r) return r;\n      r = compile_tree(node->target, reg);\n      if (r) return r;\n      r = add_opcode(reg, OP_POP_STOP_BT);\n    }\n    break;\n\n  case ENCLOSE_CONDITION:\n    r = add_opcode(reg, OP_CONDITION);\n    if (r) return r;\n    r = add_mem_num(reg, node->regnum);\n    if (r) return r;\n\n    if (NTYPE(node->target) == NT_ALT) {\n      Node* x = node->target;\n      int len2;\n\n      len = compile_length_tree(NCAR(x), reg);  /* yes-node */\n      if (len < 0) return len;\n      if (NCDR(x) == NULL) return ONIGERR_PARSER_BUG;\n      x = NCDR(x);\n      len2 = compile_length_tree(NCAR(x), reg); /* no-node */\n      if (len2 < 0) return len2;\n      if (NCDR(x) != NULL) return ONIGERR_INVALID_CONDITION_PATTERN;\n\n      x = node->target;\n      r = add_rel_addr(reg, len + SIZE_OP_JUMP);\n      if (r) return r;\n      r = compile_tree(NCAR(x), reg);   /* yes-node */\n      if (r) return r;\n      r = add_opcode_rel_addr(reg, OP_JUMP, len2);\n      if (r) return r;\n      x = NCDR(x);\n      r = compile_tree(NCAR(x), reg);   /* no-node */\n    }\n    else {\n      return ONIGERR_PARSER_BUG;\n    }\n    break;\n\n  default:\n    return ONIGERR_TYPE_BUG;\n    break;\n  }\n\n  return r;\n}\n\nstatic int\ncompile_length_anchor_node(AnchorNode* node, regex_t* reg)\n{\n  int len;\n  int tlen = 0;\n\n  if (node->target) {\n    tlen = compile_length_tree(node->target, reg);\n    if (tlen < 0) return tlen;\n  }\n\n  switch (node->type) {\n  case ANCHOR_PREC_READ:\n    len = SIZE_OP_PUSH_POS + tlen + SIZE_OP_POP_POS;\n    break;\n  case ANCHOR_PREC_READ_NOT:\n    len = SIZE_OP_PUSH_POS_NOT + tlen + SIZE_OP_FAIL_POS;\n    break;\n  case ANCHOR_LOOK_BEHIND:\n    len = SIZE_OP_LOOK_BEHIND + tlen;\n    break;\n  case ANCHOR_LOOK_BEHIND_NOT:\n    len = SIZE_OP_PUSH_LOOK_BEHIND_NOT + tlen + SIZE_OP_FAIL_LOOK_BEHIND_NOT;\n    break;\n\n  default:\n    len = SIZE_OPCODE;\n    break;\n  }\n\n  return len;\n}\n\nstatic int\ncompile_anchor_node(AnchorNode* node, regex_t* reg)\n{\n  int r, len;\n\n  switch (node->type) {\n  case ANCHOR_BEGIN_BUF:      r = add_opcode(reg, OP_BEGIN_BUF);      break;\n  case ANCHOR_END_BUF:        r = add_opcode(reg, OP_END_BUF);        break;\n  case ANCHOR_BEGIN_LINE:     r = add_opcode(reg, OP_BEGIN_LINE);     break;\n  case ANCHOR_END_LINE:       r = add_opcode(reg, OP_END_LINE);       break;\n  case ANCHOR_SEMI_END_BUF:   r = add_opcode(reg, OP_SEMI_END_BUF);   break;\n  case ANCHOR_BEGIN_POSITION: r = add_opcode(reg, OP_BEGIN_POSITION); break;\n\n  /* used for implicit anchor optimization: /.*a/ ==> /(?:^|\\G).*a/ */\n  case ANCHOR_ANYCHAR_STAR:   r = add_opcode(reg, OP_BEGIN_POS_OR_LINE); break;\n\n  case ANCHOR_WORD_BOUND:\n    if (node->ascii_range)    r = add_opcode(reg, OP_ASCII_WORD_BOUND);\n    else                      r = add_opcode(reg, OP_WORD_BOUND);\n    break;\n  case ANCHOR_NOT_WORD_BOUND:\n    if (node->ascii_range)    r = add_opcode(reg, OP_NOT_ASCII_WORD_BOUND);\n    else                      r = add_opcode(reg, OP_NOT_WORD_BOUND);\n    break;\n#ifdef USE_WORD_BEGIN_END\n  case ANCHOR_WORD_BEGIN:\n    if (node->ascii_range)    r = add_opcode(reg, OP_ASCII_WORD_BEGIN);\n    else                      r = add_opcode(reg, OP_WORD_BEGIN);\n    break;\n  case ANCHOR_WORD_END:\n    if (node->ascii_range)    r = add_opcode(reg, OP_ASCII_WORD_END);\n    else                      r = add_opcode(reg, OP_WORD_END);\n    break;\n#endif\n  case ANCHOR_KEEP:           r = add_opcode(reg, OP_KEEP);           break;\n\n  case ANCHOR_PREC_READ:\n    r = add_opcode(reg, OP_PUSH_POS);\n    if (r) return r;\n    r = compile_tree(node->target, reg);\n    if (r) return r;\n    r = add_opcode(reg, OP_POP_POS);\n    break;\n\n  case ANCHOR_PREC_READ_NOT:\n    len = compile_length_tree(node->target, reg);\n    if (len < 0) return len;\n    r = add_opcode_rel_addr(reg, OP_PUSH_POS_NOT, len + SIZE_OP_FAIL_POS);\n    if (r) return r;\n    r = compile_tree(node->target, reg);\n    if (r) return r;\n    r = add_opcode(reg, OP_FAIL_POS);\n    break;\n\n  case ANCHOR_LOOK_BEHIND:\n    {\n      int n;\n      r = add_opcode(reg, OP_LOOK_BEHIND);\n      if (r) return r;\n      if (node->char_len < 0) {\n\tr = get_char_length_tree(node->target, reg, &n);\n\tif (r) return ONIGERR_INVALID_LOOK_BEHIND_PATTERN;\n      }\n      else\n\tn = node->char_len;\n      r = add_length(reg, n);\n      if (r) return r;\n      r = compile_tree(node->target, reg);\n    }\n    break;\n\n  case ANCHOR_LOOK_BEHIND_NOT:\n    {\n      int n;\n      len = compile_length_tree(node->target, reg);\n      r = add_opcode_rel_addr(reg, OP_PUSH_LOOK_BEHIND_NOT,\n\t\t\t   len + SIZE_OP_FAIL_LOOK_BEHIND_NOT);\n      if (r) return r;\n      if (node->char_len < 0) {\n\tr = get_char_length_tree(node->target, reg, &n);\n\tif (r) return ONIGERR_INVALID_LOOK_BEHIND_PATTERN;\n      }\n      else\n\tn = node->char_len;\n      r = add_length(reg, n);\n      if (r) return r;\n      r = compile_tree(node->target, reg);\n      if (r) return r;\n      r = add_opcode(reg, OP_FAIL_LOOK_BEHIND_NOT);\n    }\n    break;\n\n  default:\n    return ONIGERR_TYPE_BUG;\n    break;\n  }\n\n  return r;\n}\n\nstatic int\ncompile_length_tree(Node* node, regex_t* reg)\n{\n  int len, type, r;\n\n  type = NTYPE(node);\n  switch (type) {\n  case NT_LIST:\n    len = 0;\n    do {\n      r = compile_length_tree(NCAR(node), reg);\n      if (r < 0) return r;\n      len += r;\n    } while (IS_NOT_NULL(node = NCDR(node)));\n    r = len;\n    break;\n\n  case NT_ALT:\n    {\n      int n;\n\n      n = r = 0;\n      do {\n\tr += compile_length_tree(NCAR(node), reg);\n\tn++;\n      } while (IS_NOT_NULL(node = NCDR(node)));\n      r += (SIZE_OP_PUSH + SIZE_OP_JUMP) * (n - 1);\n    }\n    break;\n\n  case NT_STR:\n    if (NSTRING_IS_RAW(node))\n      r = compile_length_string_raw_node(NSTR(node), reg);\n    else\n      r = compile_length_string_node(node, reg);\n    break;\n\n  case NT_CCLASS:\n    r = compile_length_cclass_node(NCCLASS(node), reg);\n    break;\n\n  case NT_CTYPE:\n  case NT_CANY:\n    r = SIZE_OPCODE;\n    break;\n\n  case NT_BREF:\n    {\n      BRefNode* br = NBREF(node);\n\n#ifdef USE_BACKREF_WITH_LEVEL\n      if (IS_BACKREF_NEST_LEVEL(br)) {\n        r = SIZE_OPCODE + SIZE_OPTION + SIZE_LENGTH +\n            SIZE_LENGTH + (SIZE_MEMNUM * br->back_num);\n      }\n      else\n#endif\n      if (br->back_num == 1) {\n\tr = ((!IS_IGNORECASE(reg->options) && br->back_static[0] <= 2)\n\t     ? SIZE_OPCODE : (SIZE_OPCODE + SIZE_MEMNUM));\n      }\n      else {\n\tr = SIZE_OPCODE + SIZE_LENGTH + (SIZE_MEMNUM * br->back_num);\n      }\n    }\n    break;\n\n#ifdef USE_SUBEXP_CALL\n  case NT_CALL:\n    r = SIZE_OP_CALL;\n    break;\n#endif\n\n  case NT_QTFR:\n    r = compile_length_quantifier_node(NQTFR(node), reg);\n    break;\n\n  case NT_ENCLOSE:\n    r = compile_length_enclose_node(NENCLOSE(node), reg);\n    break;\n\n  case NT_ANCHOR:\n    r = compile_length_anchor_node(NANCHOR(node), reg);\n    break;\n\n  default:\n    return ONIGERR_TYPE_BUG;\n    break;\n  }\n\n  return r;\n}\n\nstatic int\ncompile_tree(Node* node, regex_t* reg)\n{\n  int n, type, len, pos, r = 0;\n\n  type = NTYPE(node);\n  switch (type) {\n  case NT_LIST:\n    do {\n      r = compile_tree(NCAR(node), reg);\n    } while (r == 0 && IS_NOT_NULL(node = NCDR(node)));\n    break;\n\n  case NT_ALT:\n    {\n      Node* x = node;\n      len = 0;\n      do {\n\tlen += compile_length_tree(NCAR(x), reg);\n\tif (NCDR(x) != NULL) {\n\t  len += SIZE_OP_PUSH + SIZE_OP_JUMP;\n\t}\n      } while (IS_NOT_NULL(x = NCDR(x)));\n      pos = reg->used + len;  /* goal position */\n\n      do {\n\tlen = compile_length_tree(NCAR(node), reg);\n\tif (IS_NOT_NULL(NCDR(node))) {\n\t  r = add_opcode_rel_addr(reg, OP_PUSH, len + SIZE_OP_JUMP);\n\t  if (r) break;\n\t}\n\tr = compile_tree(NCAR(node), reg);\n\tif (r) break;\n\tif (IS_NOT_NULL(NCDR(node))) {\n\t  len = pos - (reg->used + SIZE_OP_JUMP);\n\t  r = add_opcode_rel_addr(reg, OP_JUMP, len);\n\t  if (r) break;\n\t}\n      } while (IS_NOT_NULL(node = NCDR(node)));\n    }\n    break;\n\n  case NT_STR:\n    if (NSTRING_IS_RAW(node))\n      r = compile_string_raw_node(NSTR(node), reg);\n    else\n      r = compile_string_node(node, reg);\n    break;\n\n  case NT_CCLASS:\n    r = compile_cclass_node(NCCLASS(node), reg);\n    break;\n\n  case NT_CTYPE:\n    {\n      int op;\n\n      switch (NCTYPE(node)->ctype) {\n      case ONIGENC_CTYPE_WORD:\n\tif (NCTYPE(node)->ascii_range != 0) {\n\t  if (NCTYPE(node)->not != 0)  op = OP_NOT_ASCII_WORD;\n\t  else                         op = OP_ASCII_WORD;\n\t}\n\telse {\n\t  if (NCTYPE(node)->not != 0)  op = OP_NOT_WORD;\n\t  else                         op = OP_WORD;\n\t}\n\tbreak;\n      default:\n\treturn ONIGERR_TYPE_BUG;\n\tbreak;\n      }\n      r = add_opcode(reg, op);\n    }\n    break;\n\n  case NT_CANY:\n    if (IS_MULTILINE(reg->options))\n      r = add_opcode(reg, OP_ANYCHAR_ML);\n    else\n      r = add_opcode(reg, OP_ANYCHAR);\n    break;\n\n  case NT_BREF:\n    {\n      BRefNode* br = NBREF(node);\n\n#ifdef USE_BACKREF_WITH_LEVEL\n      if (IS_BACKREF_NEST_LEVEL(br)) {\n\tr = add_opcode(reg, OP_BACKREF_WITH_LEVEL);\n\tif (r) return r;\n\tr = add_option(reg, (reg->options & ONIG_OPTION_IGNORECASE));\n\tif (r) return r;\n\tr = add_length(reg, br->nest_level);\n\tif (r) return r;\n\n\tgoto add_bacref_mems;\n      }\n      else\n#endif\n      if (br->back_num == 1) {\n\tn = br->back_static[0];\n\tif (IS_IGNORECASE(reg->options)) {\n\t  r = add_opcode(reg, OP_BACKREFN_IC);\n\t  if (r) return r;\n\t  r = add_mem_num(reg, n);\n\t}\n\telse {\n\t  switch (n) {\n\t  case 1:  r = add_opcode(reg, OP_BACKREF1); break;\n\t  case 2:  r = add_opcode(reg, OP_BACKREF2); break;\n\t  default:\n\t    r = add_opcode(reg, OP_BACKREFN);\n\t    if (r) return r;\n\t    r = add_mem_num(reg, n);\n\t    break;\n\t  }\n\t}\n      }\n      else {\n\tint i;\n\tint* p;\n\n        if (IS_IGNORECASE(reg->options)) {\n          r = add_opcode(reg, OP_BACKREF_MULTI_IC);\n        }\n        else {\n          r = add_opcode(reg, OP_BACKREF_MULTI);\n        }\n\tif (r) return r;\n\n#ifdef USE_BACKREF_WITH_LEVEL\n      add_bacref_mems:\n#endif\n\tr = add_length(reg, br->back_num);\n\tif (r) return r;\n\tp = BACKREFS_P(br);\n\tfor (i = br->back_num - 1; i >= 0; i--) {\n\t  r = add_mem_num(reg, p[i]);\n\t  if (r) return r;\n\t}\n      }\n    }\n    break;\n\n#ifdef USE_SUBEXP_CALL\n  case NT_CALL:\n    r = compile_call(NCALL(node), reg);\n    break;\n#endif\n\n  case NT_QTFR:\n    r = compile_quantifier_node(NQTFR(node), reg);\n    break;\n\n  case NT_ENCLOSE:\n    r = compile_enclose_node(NENCLOSE(node), reg);\n    break;\n\n  case NT_ANCHOR:\n    r = compile_anchor_node(NANCHOR(node), reg);\n    break;\n\n  default:\n#ifdef ONIG_DEBUG\n    fprintf(stderr, \"compile_tree: undefined node type %d\\n\", NTYPE(node));\n#endif\n    break;\n  }\n\n  return r;\n}\n\n#ifdef USE_NAMED_GROUP\n\nstatic int\nnoname_disable_map(Node** plink, GroupNumRemap* map, int* counter)\n{\n  int r = 0;\n  Node* node = *plink;\n\n  switch (NTYPE(node)) {\n  case NT_LIST:\n  case NT_ALT:\n    do {\n      r = noname_disable_map(&(NCAR(node)), map, counter);\n    } while (r == 0 && IS_NOT_NULL(node = NCDR(node)));\n    break;\n\n  case NT_QTFR:\n    {\n      Node** ptarget = &(NQTFR(node)->target);\n      Node*  old = *ptarget;\n      r = noname_disable_map(ptarget, map, counter);\n      if (*ptarget != old && NTYPE(*ptarget) == NT_QTFR) {\n\tonig_reduce_nested_quantifier(node, *ptarget);\n      }\n    }\n    break;\n\n  case NT_ENCLOSE:\n    {\n      EncloseNode* en = NENCLOSE(node);\n      if (en->type == ENCLOSE_MEMORY) {\n\tif (IS_ENCLOSE_NAMED_GROUP(en)) {\n\t  (*counter)++;\n\t  map[en->regnum].new_val = *counter;\n\t  en->regnum = *counter;\n\t  r = noname_disable_map(&(en->target), map, counter);\n\t}\n\telse {\n\t  *plink = en->target;\n\t  en->target = NULL_NODE;\n\t  onig_node_free(node);\n\t  r = noname_disable_map(plink, map, counter);\n\t}\n      }\n      else\n\tr = noname_disable_map(&(en->target), map, counter);\n    }\n    break;\n\n  case NT_ANCHOR:\n    {\n      AnchorNode* an = NANCHOR(node);\n      switch (an->type) {\n      case ANCHOR_PREC_READ:\n      case ANCHOR_PREC_READ_NOT:\n      case ANCHOR_LOOK_BEHIND:\n      case ANCHOR_LOOK_BEHIND_NOT:\n\tr = noname_disable_map(&(an->target), map, counter);\n\tbreak;\n      }\n    }\n    break;\n\n  default:\n    break;\n  }\n\n  return r;\n}\n\nstatic int\nrenumber_node_backref(Node* node, GroupNumRemap* map)\n{\n  int i, pos, n, old_num;\n  int *backs;\n  BRefNode* bn = NBREF(node);\n\n  if (! IS_BACKREF_NAME_REF(bn))\n    return ONIGERR_NUMBERED_BACKREF_OR_CALL_NOT_ALLOWED;\n\n  old_num = bn->back_num;\n  if (IS_NULL(bn->back_dynamic))\n    backs = bn->back_static;\n  else\n    backs = bn->back_dynamic;\n\n  for (i = 0, pos = 0; i < old_num; i++) {\n    n = map[backs[i]].new_val;\n    if (n > 0) {\n      backs[pos] = n;\n      pos++;\n    }\n  }\n\n  bn->back_num = pos;\n  return 0;\n}\n\nstatic int\nrenumber_by_map(Node* node, GroupNumRemap* map)\n{\n  int r = 0;\n\n  switch (NTYPE(node)) {\n  case NT_LIST:\n  case NT_ALT:\n    do {\n      r = renumber_by_map(NCAR(node), map);\n    } while (r == 0 && IS_NOT_NULL(node = NCDR(node)));\n    break;\n  case NT_QTFR:\n    r = renumber_by_map(NQTFR(node)->target, map);\n    break;\n  case NT_ENCLOSE:\n    {\n      EncloseNode* en = NENCLOSE(node);\n      if (en->type == ENCLOSE_CONDITION)\n        en->regnum = map[en->regnum].new_val;\n      r = renumber_by_map(en->target, map);\n    }\n    break;\n\n  case NT_BREF:\n    r = renumber_node_backref(node, map);\n    break;\n\n  case NT_ANCHOR:\n    {\n      AnchorNode* an = NANCHOR(node);\n      switch (an->type) {\n      case ANCHOR_PREC_READ:\n      case ANCHOR_PREC_READ_NOT:\n      case ANCHOR_LOOK_BEHIND:\n      case ANCHOR_LOOK_BEHIND_NOT:\n\tr = renumber_by_map(an->target, map);\n\tbreak;\n      }\n    }\n    break;\n\n  default:\n    break;\n  }\n\n  return r;\n}\n\nstatic int\nnumbered_ref_check(Node* node)\n{\n  int r = 0;\n\n  switch (NTYPE(node)) {\n  case NT_LIST:\n  case NT_ALT:\n    do {\n      r = numbered_ref_check(NCAR(node));\n    } while (r == 0 && IS_NOT_NULL(node = NCDR(node)));\n    break;\n  case NT_QTFR:\n    r = numbered_ref_check(NQTFR(node)->target);\n    break;\n  case NT_ENCLOSE:\n    r = numbered_ref_check(NENCLOSE(node)->target);\n    break;\n\n  case NT_BREF:\n    if (! IS_BACKREF_NAME_REF(NBREF(node)))\n      return ONIGERR_NUMBERED_BACKREF_OR_CALL_NOT_ALLOWED;\n    break;\n\n  default:\n    break;\n  }\n\n  return r;\n}\n\nstatic int\ndisable_noname_group_capture(Node** root, regex_t* reg, ScanEnv* env)\n{\n  int r, i, pos, counter;\n  BitStatusType loc;\n  GroupNumRemap* map;\n\n  map = (GroupNumRemap* )xalloca(sizeof(GroupNumRemap) * (env->num_mem + 1));\n  CHECK_NULL_RETURN_MEMERR(map);\n  for (i = 1; i <= env->num_mem; i++) {\n    map[i].new_val = 0;\n  }\n  counter = 0;\n  r = noname_disable_map(root, map, &counter);\n  if (r != 0) return r;\n\n  r = renumber_by_map(*root, map);\n  if (r != 0) return r;\n\n  for (i = 1, pos = 1; i <= env->num_mem; i++) {\n    if (map[i].new_val > 0) {\n      SCANENV_MEM_NODES(env)[pos] = SCANENV_MEM_NODES(env)[i];\n      pos++;\n    }\n  }\n\n  loc = env->capture_history;\n  BIT_STATUS_CLEAR(env->capture_history);\n  for (i = 1; i <= ONIG_MAX_CAPTURE_HISTORY_GROUP; i++) {\n    if (BIT_STATUS_AT(loc, i)) {\n      BIT_STATUS_ON_AT_SIMPLE(env->capture_history, map[i].new_val);\n    }\n  }\n\n  env->num_mem = env->num_named;\n  reg->num_mem = env->num_named;\n\n  return onig_renumber_name_table(reg, map);\n}\n#endif /* USE_NAMED_GROUP */\n\n#ifdef USE_SUBEXP_CALL\nstatic int\nunset_addr_list_fix(UnsetAddrList* uslist, regex_t* reg)\n{\n  int i, offset;\n  EncloseNode* en;\n  AbsAddrType addr;\n\n  for (i = 0; i < uslist->num; i++) {\n    en = NENCLOSE(uslist->us[i].target);\n    if (! IS_ENCLOSE_ADDR_FIXED(en)) return ONIGERR_PARSER_BUG;\n    addr = en->call_addr;\n    offset = uslist->us[i].offset;\n\n    BBUF_WRITE(reg, offset, &addr, SIZE_ABSADDR);\n  }\n  return 0;\n}\n#endif\n\n#ifdef USE_MONOMANIAC_CHECK_CAPTURES_IN_ENDLESS_REPEAT\nstatic int\nquantifiers_memory_node_info(Node* node)\n{\n  int r = 0;\n\n  switch (NTYPE(node)) {\n  case NT_LIST:\n  case NT_ALT:\n    {\n      int v;\n      do {\n\tv = quantifiers_memory_node_info(NCAR(node));\n\tif (v > r) r = v;\n      } while (v >= 0 && IS_NOT_NULL(node = NCDR(node)));\n    }\n    break;\n\n#ifdef USE_SUBEXP_CALL\n  case NT_CALL:\n    if (IS_CALL_RECURSION(NCALL(node))) {\n      return NQ_TARGET_IS_EMPTY_REC; /* tiny version */\n    }\n    else\n      r = quantifiers_memory_node_info(NCALL(node)->target);\n    break;\n#endif\n\n  case NT_QTFR:\n    {\n      QtfrNode* qn = NQTFR(node);\n      if (qn->upper != 0) {\n\tr = quantifiers_memory_node_info(qn->target);\n      }\n    }\n    break;\n\n  case NT_ENCLOSE:\n    {\n      EncloseNode* en = NENCLOSE(node);\n      switch (en->type) {\n      case ENCLOSE_MEMORY:\n\treturn NQ_TARGET_IS_EMPTY_MEM;\n\tbreak;\n\n      case ENCLOSE_OPTION:\n      case ENCLOSE_STOP_BACKTRACK:\n      case ENCLOSE_CONDITION:\n\tr = quantifiers_memory_node_info(en->target);\n\tbreak;\n      default:\n\tbreak;\n      }\n    }\n    break;\n\n  case NT_BREF:\n  case NT_STR:\n  case NT_CTYPE:\n  case NT_CCLASS:\n  case NT_CANY:\n  case NT_ANCHOR:\n  default:\n    break;\n  }\n\n  return r;\n}\n#endif /* USE_MONOMANIAC_CHECK_CAPTURES_IN_ENDLESS_REPEAT */\n\nstatic int\nget_min_match_length(Node* node, OnigDistance *min, ScanEnv* env)\n{\n  OnigDistance tmin;\n  int r = 0;\n\n  *min = 0;\n  switch (NTYPE(node)) {\n  case NT_BREF:\n    {\n      int i;\n      int* backs;\n      Node** nodes = SCANENV_MEM_NODES(env);\n      BRefNode* br = NBREF(node);\n      if (br->state & NST_RECURSION) break;\n\n      backs = BACKREFS_P(br);\n      if (backs[0] > env->num_mem)  return ONIGERR_INVALID_BACKREF;\n      r = get_min_match_length(nodes[backs[0]], min, env);\n      if (r != 0) break;\n      for (i = 1; i < br->back_num; i++) {\n\tif (backs[i] > env->num_mem)  return ONIGERR_INVALID_BACKREF;\n\tr = get_min_match_length(nodes[backs[i]], &tmin, env);\n\tif (r != 0) break;\n\tif (*min > tmin) *min = tmin;\n      }\n    }\n    break;\n\n#ifdef USE_SUBEXP_CALL\n  case NT_CALL:\n    if (IS_CALL_RECURSION(NCALL(node))) {\n      EncloseNode* en = NENCLOSE(NCALL(node)->target);\n      if (IS_ENCLOSE_MIN_FIXED(en))\n\t*min = en->min_len;\n    }\n    else\n      r = get_min_match_length(NCALL(node)->target, min, env);\n    break;\n#endif\n\n  case NT_LIST:\n    do {\n      r = get_min_match_length(NCAR(node), &tmin, env);\n      if (r == 0) *min += tmin;\n    } while (r == 0 && IS_NOT_NULL(node = NCDR(node)));\n    break;\n\n  case NT_ALT:\n    {\n      Node *x, *y;\n      y = node;\n      do {\n\tx = NCAR(y);\n\tr = get_min_match_length(x, &tmin, env);\n\tif (r != 0) break;\n\tif (y == node) *min = tmin;\n\telse if (*min > tmin) *min = tmin;\n      } while (r == 0 && IS_NOT_NULL(y = NCDR(y)));\n    }\n    break;\n\n  case NT_STR:\n    {\n      StrNode* sn = NSTR(node);\n      *min = sn->end - sn->s;\n    }\n    break;\n\n  case NT_CTYPE:\n    *min = 1;\n    break;\n\n  case NT_CCLASS:\n  case NT_CANY:\n    *min = 1;\n    break;\n\n  case NT_QTFR:\n    {\n      QtfrNode* qn = NQTFR(node);\n\n      if (qn->lower > 0) {\n\tr = get_min_match_length(qn->target, min, env);\n\tif (r == 0)\n\t  *min = distance_multiply(*min, qn->lower);\n      }\n    }\n    break;\n\n  case NT_ENCLOSE:\n    {\n      EncloseNode* en = NENCLOSE(node);\n      switch (en->type) {\n      case ENCLOSE_MEMORY:\n#ifdef USE_SUBEXP_CALL\n\tif (IS_ENCLOSE_MIN_FIXED(en))\n\t  *min = en->min_len;\n\telse {\n\t  r = get_min_match_length(en->target, min, env);\n\t  if (r == 0) {\n\t    en->min_len = *min;\n\t    SET_ENCLOSE_STATUS(node, NST_MIN_FIXED);\n\t  }\n\t}\n\tbreak;\n#endif\n      case ENCLOSE_OPTION:\n      case ENCLOSE_STOP_BACKTRACK:\n      case ENCLOSE_CONDITION:\n\tr = get_min_match_length(en->target, min, env);\n\tbreak;\n      }\n    }\n    break;\n\n  case NT_ANCHOR:\n  default:\n    break;\n  }\n\n  return r;\n}\n\nstatic int\nget_max_match_length(Node* node, OnigDistance *max, ScanEnv* env)\n{\n  OnigDistance tmax;\n  int r = 0;\n\n  *max = 0;\n  switch (NTYPE(node)) {\n  case NT_LIST:\n    do {\n      r = get_max_match_length(NCAR(node), &tmax, env);\n      if (r == 0)\n\t*max = distance_add(*max, tmax);\n    } while (r == 0 && IS_NOT_NULL(node = NCDR(node)));\n    break;\n\n  case NT_ALT:\n    do {\n      r = get_max_match_length(NCAR(node), &tmax, env);\n      if (r == 0 && *max < tmax) *max = tmax;\n    } while (r == 0 && IS_NOT_NULL(node = NCDR(node)));\n    break;\n\n  case NT_STR:\n    {\n      StrNode* sn = NSTR(node);\n      *max = sn->end - sn->s;\n    }\n    break;\n\n  case NT_CTYPE:\n    *max = ONIGENC_MBC_MAXLEN_DIST(env->enc);\n    break;\n\n  case NT_CCLASS:\n  case NT_CANY:\n    *max = ONIGENC_MBC_MAXLEN_DIST(env->enc);\n    break;\n\n  case NT_BREF:\n    {\n      int i;\n      int* backs;\n      Node** nodes = SCANENV_MEM_NODES(env);\n      BRefNode* br = NBREF(node);\n      if (br->state & NST_RECURSION) {\n\t*max = ONIG_INFINITE_DISTANCE;\n\tbreak;\n      }\n      backs = BACKREFS_P(br);\n      for (i = 0; i < br->back_num; i++) {\n\tif (backs[i] > env->num_mem)  return ONIGERR_INVALID_BACKREF;\n\tr = get_max_match_length(nodes[backs[i]], &tmax, env);\n\tif (r != 0) break;\n\tif (*max < tmax) *max = tmax;\n      }\n    }\n    break;\n\n#ifdef USE_SUBEXP_CALL\n  case NT_CALL:\n    if (! IS_CALL_RECURSION(NCALL(node)))\n      r = get_max_match_length(NCALL(node)->target, max, env);\n    else\n      *max = ONIG_INFINITE_DISTANCE;\n    break;\n#endif\n\n  case NT_QTFR:\n    {\n      QtfrNode* qn = NQTFR(node);\n\n      if (qn->upper != 0) {\n\tr = get_max_match_length(qn->target, max, env);\n\tif (r == 0 && *max != 0) {\n\t  if (! IS_REPEAT_INFINITE(qn->upper))\n\t    *max = distance_multiply(*max, qn->upper);\n\t  else\n\t    *max = ONIG_INFINITE_DISTANCE;\n\t}\n      }\n    }\n    break;\n\n  case NT_ENCLOSE:\n    {\n      EncloseNode* en = NENCLOSE(node);\n      switch (en->type) {\n      case ENCLOSE_MEMORY:\n#ifdef USE_SUBEXP_CALL\n\tif (IS_ENCLOSE_MAX_FIXED(en))\n\t  *max = en->max_len;\n\telse {\n\t  r = get_max_match_length(en->target, max, env);\n\t  if (r == 0) {\n\t    en->max_len = *max;\n\t    SET_ENCLOSE_STATUS(node, NST_MAX_FIXED);\n\t  }\n\t}\n\tbreak;\n#endif\n      case ENCLOSE_OPTION:\n      case ENCLOSE_STOP_BACKTRACK:\n      case ENCLOSE_CONDITION:\n\tr = get_max_match_length(en->target, max, env);\n\tbreak;\n      }\n    }\n    break;\n\n  case NT_ANCHOR:\n  default:\n    break;\n  }\n\n  return r;\n}\n\n#define GET_CHAR_LEN_VARLEN           -1\n#define GET_CHAR_LEN_TOP_ALT_VARLEN   -2\n\n/* fixed size pattern node only */\nstatic int\nget_char_length_tree1(Node* node, regex_t* reg, int* len, int level)\n{\n  int tlen;\n  int r = 0;\n\n  level++;\n  *len = 0;\n  switch (NTYPE(node)) {\n  case NT_LIST:\n    do {\n      r = get_char_length_tree1(NCAR(node), reg, &tlen, level);\n      if (r == 0)\n\t*len = (int )distance_add(*len, tlen);\n    } while (r == 0 && IS_NOT_NULL(node = NCDR(node)));\n    break;\n\n  case NT_ALT:\n    {\n      int tlen2;\n      int varlen = 0;\n\n      r = get_char_length_tree1(NCAR(node), reg, &tlen, level);\n      while (r == 0 && IS_NOT_NULL(node = NCDR(node))) {\n\tr = get_char_length_tree1(NCAR(node), reg, &tlen2, level);\n\tif (r == 0) {\n\t  if (tlen != tlen2)\n\t    varlen = 1;\n\t}\n      }\n      if (r == 0) {\n\tif (varlen != 0) {\n\t  if (level == 1)\n\t    r = GET_CHAR_LEN_TOP_ALT_VARLEN;\n\t  else\n\t    r = GET_CHAR_LEN_VARLEN;\n\t}\n\telse\n\t  *len = tlen;\n      }\n    }\n    break;\n\n  case NT_STR:\n    {\n      StrNode* sn = NSTR(node);\n      UChar *s = sn->s;\n      while (s < sn->end) {\n\ts += enclen(reg->enc, s);\n\t(*len)++;\n      }\n    }\n    break;\n\n  case NT_QTFR:\n    {\n      QtfrNode* qn = NQTFR(node);\n      if (qn->lower == qn->upper) {\n\tr = get_char_length_tree1(qn->target, reg, &tlen, level);\n\tif (r == 0)\n\t  *len = (int )distance_multiply(tlen, qn->lower);\n      }\n      else\n\tr = GET_CHAR_LEN_VARLEN;\n    }\n    break;\n\n#ifdef USE_SUBEXP_CALL\n  case NT_CALL:\n    if (! IS_CALL_RECURSION(NCALL(node)))\n      r = get_char_length_tree1(NCALL(node)->target, reg, len, level);\n    else\n      r = GET_CHAR_LEN_VARLEN;\n    break;\n#endif\n\n  case NT_CTYPE:\n    *len = 1;\n    break;\n\n  case NT_CCLASS:\n  case NT_CANY:\n    *len = 1;\n    break;\n\n  case NT_ENCLOSE:\n    {\n      EncloseNode* en = NENCLOSE(node);\n      switch (en->type) {\n      case ENCLOSE_MEMORY:\n#ifdef USE_SUBEXP_CALL\n\tif (IS_ENCLOSE_CLEN_FIXED(en))\n\t  *len = en->char_len;\n\telse {\n\t  r = get_char_length_tree1(en->target, reg, len, level);\n\t  if (r == 0) {\n\t    en->char_len = *len;\n\t    SET_ENCLOSE_STATUS(node, NST_CLEN_FIXED);\n\t  }\n\t}\n\tbreak;\n#endif\n      case ENCLOSE_OPTION:\n      case ENCLOSE_STOP_BACKTRACK:\n      case ENCLOSE_CONDITION:\n\tr = get_char_length_tree1(en->target, reg, len, level);\n\tbreak;\n      default:\n\tbreak;\n      }\n    }\n    break;\n\n  case NT_ANCHOR:\n    break;\n\n  default:\n    r = GET_CHAR_LEN_VARLEN;\n    break;\n  }\n\n  return r;\n}\n\nstatic int\nget_char_length_tree(Node* node, regex_t* reg, int* len)\n{\n  return get_char_length_tree1(node, reg, len, 0);\n}\n\n/* x is not included y ==>  1 : 0 */\nstatic int\nis_not_included(Node* x, Node* y, regex_t* reg)\n{\n  int i;\n  OnigDistance len;\n  OnigCodePoint code;\n  UChar *p;\n  int ytype;\n\n retry:\n  ytype = NTYPE(y);\n  switch (NTYPE(x)) {\n  case NT_CTYPE:\n    {\n      switch (ytype) {\n      case NT_CTYPE:\n\tif (NCTYPE(y)->ctype == NCTYPE(x)->ctype &&\n\t    NCTYPE(y)->not   != NCTYPE(x)->not &&\n\t    NCTYPE(y)->ascii_range == NCTYPE(x)->ascii_range)\n\t  return 1;\n\telse\n\t  return 0;\n\tbreak;\n\n      case NT_CCLASS:\n      swap:\n\t{\n\t  Node* tmp;\n\t  tmp = x; x = y; y = tmp;\n\t  goto retry;\n\t}\n\tbreak;\n\n      case NT_STR:\n\tgoto swap;\n\tbreak;\n\n      default:\n\tbreak;\n      }\n    }\n    break;\n\n  case NT_CCLASS:\n    {\n      CClassNode* xc = NCCLASS(x);\n      switch (ytype) {\n      case NT_CTYPE:\n\tswitch (NCTYPE(y)->ctype) {\n\tcase ONIGENC_CTYPE_WORD:\n\t  if (NCTYPE(y)->not == 0) {\n\t    if (IS_NULL(xc->mbuf) && !IS_NCCLASS_NOT(xc)) {\n\t      for (i = 0; i < SINGLE_BYTE_SIZE; i++) {\n\t\tif (BITSET_AT(xc->bs, i)) {\n\t\t  if (NCTYPE(y)->ascii_range) {\n\t\t    if (IS_CODE_SB_WORD(reg->enc, i)) return 0;\n\t\t  }\n\t\t  else {\n\t\t    if (ONIGENC_IS_CODE_WORD(reg->enc, i)) return 0;\n\t\t  }\n\t\t}\n\t      }\n\t      return 1;\n\t    }\n\t    return 0;\n\t  }\n\t  else {\n\t    for (i = 0; i < SINGLE_BYTE_SIZE; i++) {\n\t      int is_word;\n\t      if (NCTYPE(y)->ascii_range)\n\t\tis_word = IS_CODE_SB_WORD(reg->enc, i);\n\t      else\n\t\tis_word = ONIGENC_IS_CODE_WORD(reg->enc, i);\n\t      if (! is_word) {\n\t\tif (!IS_NCCLASS_NOT(xc)) {\n\t\t  if (BITSET_AT(xc->bs, i))\n\t\t    return 0;\n\t\t}\n\t\telse {\n\t\t  if (! BITSET_AT(xc->bs, i))\n\t\t    return 0;\n\t\t}\n\t      }\n\t    }\n\t    return 1;\n\t  }\n\t  break;\n\n\tdefault:\n\t  break;\n\t}\n\tbreak;\n\n      case NT_CCLASS:\n\t{\n\t  int v;\n\t  CClassNode* yc = NCCLASS(y);\n\n\t  for (i = 0; i < SINGLE_BYTE_SIZE; i++) {\n\t    v = BITSET_AT(xc->bs, i);\n\t    if ((v != 0 && !IS_NCCLASS_NOT(xc)) ||\n                (v == 0 && IS_NCCLASS_NOT(xc))) {\n\t      v = BITSET_AT(yc->bs, i);\n\t      if ((v != 0 && !IS_NCCLASS_NOT(yc)) ||\n                  (v == 0 && IS_NCCLASS_NOT(yc)))\n\t\treturn 0;\n\t    }\n\t  }\n\t  if ((IS_NULL(xc->mbuf) && !IS_NCCLASS_NOT(xc)) ||\n\t      (IS_NULL(yc->mbuf) && !IS_NCCLASS_NOT(yc)))\n\t    return 1;\n\t  return 0;\n\t}\n\tbreak;\n\n      case NT_STR:\n\tgoto swap;\n\tbreak;\n\n      default:\n\tbreak;\n      }\n    }\n    break;\n\n  case NT_STR:\n    {\n      StrNode* xs = NSTR(x);\n      if (NSTRING_LEN(x) == 0)\n\tbreak;\n\n      switch (ytype) {\n      case NT_CTYPE:\n\tswitch (NCTYPE(y)->ctype) {\n\tcase ONIGENC_CTYPE_WORD:\n\t  if (NCTYPE(y)->ascii_range) {\n\t    if (ONIGENC_IS_MBC_ASCII_WORD(reg->enc, xs->s, xs->end))\n\t      return NCTYPE(y)->not;\n\t    else\n\t      return !(NCTYPE(y)->not);\n\t  }\n\t  else {\n\t    if (ONIGENC_IS_MBC_WORD(reg->enc, xs->s, xs->end))\n\t      return NCTYPE(y)->not;\n\t    else\n\t      return !(NCTYPE(y)->not);\n\t  }\n\t  break;\n\tdefault:\n\t  break;\n\t}\n\tbreak;\n\n      case NT_CCLASS:\n\t{\n\t  CClassNode* cc = NCCLASS(y);\n\n\t  code = ONIGENC_MBC_TO_CODE(reg->enc, xs->s,\n\t\t\t\t     xs->s + ONIGENC_MBC_MAXLEN(reg->enc));\n\t  return (onig_is_code_in_cc(reg->enc, code, cc) != 0 ? 0 : 1);\n\t}\n\tbreak;\n\n      case NT_STR:\n\t{\n\t  UChar *q;\n\t  StrNode* ys = NSTR(y);\n\t  len = NSTRING_LEN(x);\n\t  if (len > NSTRING_LEN(y)) len = NSTRING_LEN(y);\n\t  if (NSTRING_IS_AMBIG(x) || NSTRING_IS_AMBIG(y)) {\n            /* tiny version */\n            return 0;\n\t  }\n\t  else {\n\t    for (i = 0, p = ys->s, q = xs->s; (OnigDistance )i < len; i++, p++, q++) {\n\t      if (*p != *q) return 1;\n\t    }\n\t  }\n\t}\n\tbreak;\n\n      default:\n\tbreak;\n      }\n    }\n    break;\n\n  default:\n    break;\n  }\n\n  return 0;\n}\n\nstatic Node*\nget_head_value_node(Node* node, int exact, regex_t* reg)\n{\n  Node* n = NULL_NODE;\n\n  switch (NTYPE(node)) {\n  case NT_BREF:\n  case NT_ALT:\n  case NT_CANY:\n#ifdef USE_SUBEXP_CALL\n  case NT_CALL:\n#endif\n    break;\n\n  case NT_CTYPE:\n  case NT_CCLASS:\n    if (exact == 0) {\n      n = node;\n    }\n    break;\n\n  case NT_LIST:\n    n = get_head_value_node(NCAR(node), exact, reg);\n    break;\n\n  case NT_STR:\n    {\n      StrNode* sn = NSTR(node);\n\n      if (sn->end <= sn->s)\n\tbreak;\n\n      if (exact != 0 &&\n\t  !NSTRING_IS_RAW(node) && IS_IGNORECASE(reg->options)) {\n      }\n      else {\n\tn = node;\n      }\n    }\n    break;\n\n  case NT_QTFR:\n    {\n      QtfrNode* qn = NQTFR(node);\n      if (qn->lower > 0) {\n\tif (IS_NOT_NULL(qn->head_exact))\n\t  n = qn->head_exact;\n\telse\n\t  n = get_head_value_node(qn->target, exact, reg);\n      }\n    }\n    break;\n\n  case NT_ENCLOSE:\n    {\n      EncloseNode* en = NENCLOSE(node);\n      switch (en->type) {\n      case ENCLOSE_OPTION:\n\t{\n\t  OnigOptionType options = reg->options;\n\n\t  reg->options = NENCLOSE(node)->option;\n\t  n = get_head_value_node(NENCLOSE(node)->target, exact, reg);\n\t  reg->options = options;\n\t}\n\tbreak;\n\n      case ENCLOSE_MEMORY:\n      case ENCLOSE_STOP_BACKTRACK:\n      case ENCLOSE_CONDITION:\n\tn = get_head_value_node(en->target, exact, reg);\n\tbreak;\n      }\n    }\n    break;\n\n  case NT_ANCHOR:\n    if (NANCHOR(node)->type == ANCHOR_PREC_READ)\n      n = get_head_value_node(NANCHOR(node)->target, exact, reg);\n    break;\n\n  default:\n    break;\n  }\n\n  return n;\n}\n\nstatic int\ncheck_type_tree(Node* node, int type_mask, int enclose_mask, int anchor_mask)\n{\n  int type, r = 0;\n\n  type = NTYPE(node);\n  if ((NTYPE2BIT(type) & type_mask) == 0)\n    return 1;\n\n  switch (type) {\n  case NT_LIST:\n  case NT_ALT:\n    do {\n      r = check_type_tree(NCAR(node), type_mask, enclose_mask,\n\t\t\t  anchor_mask);\n    } while (r == 0 && IS_NOT_NULL(node = NCDR(node)));\n    break;\n\n  case NT_QTFR:\n    r = check_type_tree(NQTFR(node)->target, type_mask, enclose_mask,\n\t\t\tanchor_mask);\n    break;\n\n  case NT_ENCLOSE:\n    {\n      EncloseNode* en = NENCLOSE(node);\n      if ((en->type & enclose_mask) == 0)\n\treturn 1;\n\n      r = check_type_tree(en->target, type_mask, enclose_mask, anchor_mask);\n    }\n    break;\n\n  case NT_ANCHOR:\n    type = NANCHOR(node)->type;\n    if ((type & anchor_mask) == 0)\n      return 1;\n\n    if (NANCHOR(node)->target)\n      r = check_type_tree(NANCHOR(node)->target,\n\t\t\t  type_mask, enclose_mask, anchor_mask);\n    break;\n\n  default:\n    break;\n  }\n  return r;\n}\n\n#ifdef USE_SUBEXP_CALL\n\n#define RECURSION_EXIST       1\n#define RECURSION_INFINITE    2\n\nstatic int\nsubexp_inf_recursive_check(Node* node, ScanEnv* env, int head)\n{\n  int type;\n  int r = 0;\n\n  type = NTYPE(node);\n  switch (type) {\n  case NT_LIST:\n    {\n      Node *x;\n      OnigDistance min;\n      int ret;\n\n      x = node;\n      do {\n\tret = subexp_inf_recursive_check(NCAR(x), env, head);\n\tif (ret < 0 || ret == RECURSION_INFINITE) return ret;\n\tr |= ret;\n\tif (head) {\n\t  ret = get_min_match_length(NCAR(x), &min, env);\n\t  if (ret != 0) return ret;\n\t  if (min != 0) head = 0;\n\t}\n      } while (IS_NOT_NULL(x = NCDR(x)));\n    }\n    break;\n\n  case NT_ALT:\n    {\n      int ret;\n      r = RECURSION_EXIST;\n      do {\n\tret = subexp_inf_recursive_check(NCAR(node), env, head);\n\tif (ret < 0 || ret == RECURSION_INFINITE) return ret;\n\tr &= ret;\n      } while (IS_NOT_NULL(node = NCDR(node)));\n    }\n    break;\n\n  case NT_QTFR:\n    r = subexp_inf_recursive_check(NQTFR(node)->target, env, head);\n    if (r == RECURSION_EXIST) {\n      if (NQTFR(node)->lower == 0) r = 0;\n    }\n    break;\n\n  case NT_ANCHOR:\n    {\n      AnchorNode* an = NANCHOR(node);\n      switch (an->type) {\n      case ANCHOR_PREC_READ:\n      case ANCHOR_PREC_READ_NOT:\n      case ANCHOR_LOOK_BEHIND:\n      case ANCHOR_LOOK_BEHIND_NOT:\n\tr = subexp_inf_recursive_check(an->target, env, head);\n\tbreak;\n      }\n    }\n    break;\n\n  case NT_CALL:\n    r = subexp_inf_recursive_check(NCALL(node)->target, env, head);\n    break;\n\n  case NT_ENCLOSE:\n    if (IS_ENCLOSE_MARK2(NENCLOSE(node)))\n      return 0;\n    else if (IS_ENCLOSE_MARK1(NENCLOSE(node)))\n      return (head == 0 ? RECURSION_EXIST : RECURSION_INFINITE);\n    else {\n      SET_ENCLOSE_STATUS(node, NST_MARK2);\n      r = subexp_inf_recursive_check(NENCLOSE(node)->target, env, head);\n      CLEAR_ENCLOSE_STATUS(node, NST_MARK2);\n    }\n    break;\n\n  default:\n    break;\n  }\n\n  return r;\n}\n\nstatic int\nsubexp_inf_recursive_check_trav(Node* node, ScanEnv* env)\n{\n  int type;\n  int r = 0;\n\n  type = NTYPE(node);\n  switch (type) {\n  case NT_LIST:\n  case NT_ALT:\n    do {\n      r = subexp_inf_recursive_check_trav(NCAR(node), env);\n    } while (r == 0 && IS_NOT_NULL(node = NCDR(node)));\n    break;\n\n  case NT_QTFR:\n    r = subexp_inf_recursive_check_trav(NQTFR(node)->target, env);\n    break;\n\n  case NT_ANCHOR:\n    {\n      AnchorNode* an = NANCHOR(node);\n      switch (an->type) {\n      case ANCHOR_PREC_READ:\n      case ANCHOR_PREC_READ_NOT:\n      case ANCHOR_LOOK_BEHIND:\n      case ANCHOR_LOOK_BEHIND_NOT:\n\tr = subexp_inf_recursive_check_trav(an->target, env);\n\tbreak;\n      }\n    }\n    break;\n\n  case NT_ENCLOSE:\n    {\n      EncloseNode* en = NENCLOSE(node);\n\n      if (IS_ENCLOSE_RECURSION(en)) {\n\tSET_ENCLOSE_STATUS(node, NST_MARK1);\n\tr = subexp_inf_recursive_check(en->target, env, 1);\n\tif (r > 0) return ONIGERR_NEVER_ENDING_RECURSION;\n\tCLEAR_ENCLOSE_STATUS(node, NST_MARK1);\n      }\n      r = subexp_inf_recursive_check_trav(en->target, env);\n    }\n\n    break;\n\n  default:\n    break;\n  }\n\n  return r;\n}\n\nstatic int\nsubexp_recursive_check(Node* node)\n{\n  int r = 0;\n\n  switch (NTYPE(node)) {\n  case NT_LIST:\n  case NT_ALT:\n    do {\n      r |= subexp_recursive_check(NCAR(node));\n    } while (IS_NOT_NULL(node = NCDR(node)));\n    break;\n\n  case NT_QTFR:\n    r = subexp_recursive_check(NQTFR(node)->target);\n    break;\n\n  case NT_ANCHOR:\n    {\n      AnchorNode* an = NANCHOR(node);\n      switch (an->type) {\n      case ANCHOR_PREC_READ:\n      case ANCHOR_PREC_READ_NOT:\n      case ANCHOR_LOOK_BEHIND:\n      case ANCHOR_LOOK_BEHIND_NOT:\n\tr = subexp_recursive_check(an->target);\n\tbreak;\n      }\n    }\n    break;\n\n  case NT_CALL:\n    r = subexp_recursive_check(NCALL(node)->target);\n    if (r != 0) SET_CALL_RECURSION(node);\n    break;\n\n  case NT_ENCLOSE:\n    if (IS_ENCLOSE_MARK2(NENCLOSE(node)))\n      return 0;\n    else if (IS_ENCLOSE_MARK1(NENCLOSE(node)))\n      return 1; /* recursion */\n    else {\n      SET_ENCLOSE_STATUS(node, NST_MARK2);\n      r = subexp_recursive_check(NENCLOSE(node)->target);\n      CLEAR_ENCLOSE_STATUS(node, NST_MARK2);\n    }\n    break;\n\n  default:\n    break;\n  }\n\n  return r;\n}\n\n\nstatic int\nsubexp_recursive_check_trav(Node* node, ScanEnv* env)\n{\n#define FOUND_CALLED_NODE    1\n\n  int type;\n  int r = 0;\n\n  type = NTYPE(node);\n  switch (type) {\n  case NT_LIST:\n  case NT_ALT:\n    {\n      int ret;\n      do {\n\tret = subexp_recursive_check_trav(NCAR(node), env);\n\tif (ret == FOUND_CALLED_NODE) r = FOUND_CALLED_NODE;\n\telse if (ret < 0) return ret;\n      } while (IS_NOT_NULL(node = NCDR(node)));\n    }\n    break;\n\n  case NT_QTFR:\n    r = subexp_recursive_check_trav(NQTFR(node)->target, env);\n    if (NQTFR(node)->upper == 0) {\n      if (r == FOUND_CALLED_NODE)\n\tNQTFR(node)->is_refered = 1;\n    }\n    break;\n\n  case NT_ANCHOR:\n    {\n      AnchorNode* an = NANCHOR(node);\n      switch (an->type) {\n      case ANCHOR_PREC_READ:\n      case ANCHOR_PREC_READ_NOT:\n      case ANCHOR_LOOK_BEHIND:\n      case ANCHOR_LOOK_BEHIND_NOT:\n\tr = subexp_recursive_check_trav(an->target, env);\n\tbreak;\n      }\n    }\n    break;\n\n  case NT_ENCLOSE:\n    {\n      EncloseNode* en = NENCLOSE(node);\n\n      if (! IS_ENCLOSE_RECURSION(en)) {\n\tif (IS_ENCLOSE_CALLED(en)) {\n\t  SET_ENCLOSE_STATUS(node, NST_MARK1);\n\t  r = subexp_recursive_check(en->target);\n\t  if (r != 0) SET_ENCLOSE_STATUS(node, NST_RECURSION);\n\t  CLEAR_ENCLOSE_STATUS(node, NST_MARK1);\n\t}\n      }\n      r = subexp_recursive_check_trav(en->target, env);\n      if (IS_ENCLOSE_CALLED(en))\n\tr |= FOUND_CALLED_NODE;\n    }\n    break;\n\n  default:\n    break;\n  }\n\n  return r;\n}\n\nstatic int\nsetup_subexp_call(Node* node, ScanEnv* env)\n{\n  int type;\n  int r = 0;\n\n  type = NTYPE(node);\n  switch (type) {\n  case NT_LIST:\n    do {\n      r = setup_subexp_call(NCAR(node), env);\n    } while (r == 0 && IS_NOT_NULL(node = NCDR(node)));\n    break;\n\n  case NT_ALT:\n    do {\n      r = setup_subexp_call(NCAR(node), env);\n    } while (r == 0 && IS_NOT_NULL(node = NCDR(node)));\n    break;\n\n  case NT_QTFR:\n    r = setup_subexp_call(NQTFR(node)->target, env);\n    break;\n  case NT_ENCLOSE:\n    r = setup_subexp_call(NENCLOSE(node)->target, env);\n    break;\n\n  case NT_CALL:\n    {\n      CallNode* cn = NCALL(node);\n      Node** nodes = SCANENV_MEM_NODES(env);\n\n      if (cn->group_num != 0) {\n\tint gnum = cn->group_num;\n\n#ifdef USE_NAMED_GROUP\n\tif (env->num_named > 0 &&\n\t    IS_SYNTAX_BV(env->syntax, ONIG_SYN_CAPTURE_ONLY_NAMED_GROUP) &&\n\t    !ONIG_IS_OPTION_ON(env->option, ONIG_OPTION_CAPTURE_GROUP)) {\n\t  return ONIGERR_NUMBERED_BACKREF_OR_CALL_NOT_ALLOWED;\n\t}\n#endif\n\tif (gnum > env->num_mem) {\n\t  onig_scan_env_set_error_string(env,\n\t\t ONIGERR_UNDEFINED_GROUP_REFERENCE, cn->name, cn->name_end);\n\t  return ONIGERR_UNDEFINED_GROUP_REFERENCE;\n\t}\n\n#ifdef USE_NAMED_GROUP\n      set_call_attr:\n#endif\n\tcn->target = nodes[cn->group_num];\n\tif (IS_NULL(cn->target)) {\n\t  onig_scan_env_set_error_string(env,\n\t\t ONIGERR_UNDEFINED_NAME_REFERENCE, cn->name, cn->name_end);\n\t  return ONIGERR_UNDEFINED_NAME_REFERENCE;\n\t}\n\tSET_ENCLOSE_STATUS(cn->target, NST_CALLED);\n\tBIT_STATUS_ON_AT(env->bt_mem_start, cn->group_num);\n\tcn->unset_addr_list = env->unset_addr_list;\n      }\n#ifdef USE_NAMED_GROUP\n#ifdef USE_PERL_SUBEXP_CALL\n      else if (cn->name == cn->name_end) {\n\tgoto set_call_attr;\n      }\n#endif\n      else {\n\tint *refs;\n\n\tint n = onig_name_to_group_numbers(env->reg, cn->name, cn->name_end,\n\t\t\t\t\t   &refs);\n\tif (n <= 0) {\n\t  onig_scan_env_set_error_string(env,\n\t\t ONIGERR_UNDEFINED_NAME_REFERENCE, cn->name, cn->name_end);\n\t  return ONIGERR_UNDEFINED_NAME_REFERENCE;\n\t}\n\telse if (n > 1 &&\n\t    ! IS_SYNTAX_BV(env->syntax, ONIG_SYN_ALLOW_MULTIPLEX_DEFINITION_NAME_CALL)) {\n\t  onig_scan_env_set_error_string(env,\n\t    ONIGERR_MULTIPLEX_DEFINITION_NAME_CALL, cn->name, cn->name_end);\n\t  return ONIGERR_MULTIPLEX_DEFINITION_NAME_CALL;\n\t}\n\telse {\n\t  cn->group_num = refs[0];\n\t  goto set_call_attr;\n\t}\n      }\n#endif\n    }\n    break;\n\n  case NT_ANCHOR:\n    {\n      AnchorNode* an = NANCHOR(node);\n\n      switch (an->type) {\n      case ANCHOR_PREC_READ:\n      case ANCHOR_PREC_READ_NOT:\n      case ANCHOR_LOOK_BEHIND:\n      case ANCHOR_LOOK_BEHIND_NOT:\n\tr = setup_subexp_call(an->target, env);\n\tbreak;\n      }\n    }\n    break;\n\n  default:\n    break;\n  }\n\n  return r;\n}\n#endif\n\n/* divide different length alternatives in look-behind.\n  (?<=A|B) ==> (?<=A)|(?<=B)\n  (?<!A|B) ==> (?<!A)(?<!B)\n*/\nstatic int\ndivide_look_behind_alternatives(Node* node)\n{\n  Node *head, *np, *insert_node;\n  AnchorNode* an = NANCHOR(node);\n  int anc_type = an->type;\n\n  head = an->target;\n  np = NCAR(head);\n  swap_node(node, head);\n  NCAR(node) = head;\n  NANCHOR(head)->target = np;\n\n  np = node;\n  while ((np = NCDR(np)) != NULL_NODE) {\n    insert_node = onig_node_new_anchor(anc_type);\n    CHECK_NULL_RETURN_MEMERR(insert_node);\n    NANCHOR(insert_node)->target = NCAR(np);\n    NCAR(np) = insert_node;\n  }\n\n  if (anc_type == ANCHOR_LOOK_BEHIND_NOT) {\n    np = node;\n    do {\n      SET_NTYPE(np, NT_LIST);  /* alt -> list */\n    } while ((np = NCDR(np)) != NULL_NODE);\n  }\n  return 0;\n}\n\nstatic int\nsetup_look_behind(Node* node, regex_t* reg, ScanEnv* env)\n{\n  int r, len;\n  AnchorNode* an = NANCHOR(node);\n\n  r = get_char_length_tree(an->target, reg, &len);\n  if (r == 0)\n    an->char_len = len;\n  else if (r == GET_CHAR_LEN_VARLEN)\n    r = ONIGERR_INVALID_LOOK_BEHIND_PATTERN;\n  else if (r == GET_CHAR_LEN_TOP_ALT_VARLEN) {\n    if (IS_SYNTAX_BV(env->syntax, ONIG_SYN_DIFFERENT_LEN_ALT_LOOK_BEHIND))\n      r = divide_look_behind_alternatives(node);\n    else\n      r = ONIGERR_INVALID_LOOK_BEHIND_PATTERN;\n  }\n\n  return r;\n}\n\nstatic int\nnext_setup(Node* node, Node* next_node, int in_root, regex_t* reg)\n{\n  int type;\n\n retry:\n  type = NTYPE(node);\n  if (type == NT_QTFR) {\n    QtfrNode* qn = NQTFR(node);\n    if (qn->greedy && IS_REPEAT_INFINITE(qn->upper)) {\n#ifdef USE_QTFR_PEEK_NEXT\n      Node* n = get_head_value_node(next_node, 1, reg);\n      /* '\\0': for UTF-16BE etc... */\n      if (IS_NOT_NULL(n) && NSTR(n)->s[0] != '\\0') {\n\tqn->next_head_exact = n;\n      }\n#endif\n      /* automatic possessivation a*b ==> (?>a*)b */\n      if (qn->lower <= 1) {\n\tint ttype = NTYPE(qn->target);\n\tif (IS_NODE_TYPE_SIMPLE(ttype)) {\n\t  Node *x, *y;\n\t  x = get_head_value_node(qn->target, 0, reg);\n\t  if (IS_NOT_NULL(x)) {\n\t    y = get_head_value_node(next_node,  0, reg);\n\t    if (IS_NOT_NULL(y) && is_not_included(x, y, reg)) {\n\t      Node* en = onig_node_new_enclose(ENCLOSE_STOP_BACKTRACK);\n\t      CHECK_NULL_RETURN_MEMERR(en);\n\t      SET_ENCLOSE_STATUS(en, NST_STOP_BT_SIMPLE_REPEAT);\n\t      swap_node(node, en);\n\t      NENCLOSE(node)->target = en;\n\t    }\n\t  }\n\t}\n      }\n\n#ifndef ONIG_DONT_OPTIMIZE\n      if (NTYPE(node) == NT_QTFR && /* the type may be changed by above block */\n\t  in_root && /* qn->lower == 0 && */\n\t  NTYPE(qn->target) == NT_CANY &&\n\t  ! IS_MULTILINE(reg->options)) {\n\t/* implicit anchor: /.*a/ ==> /(?:^|\\G).*a/ */\n\tNode *np;\n\tnp = onig_node_new_list(NULL_NODE, NULL_NODE);\n\tCHECK_NULL_RETURN_MEMERR(np);\n\tswap_node(node, np);\n\tNCDR(node) = onig_node_new_list(np, NULL_NODE);\n\tif (IS_NULL(NCDR(node))) {\n\t  onig_node_free(np);\n\t  return ONIGERR_MEMORY;\n\t}\n\tnp = onig_node_new_anchor(ANCHOR_ANYCHAR_STAR);   /* (?:^|\\G) */\n\tCHECK_NULL_RETURN_MEMERR(np);\n\tNCAR(node) = np;\n      }\n#endif\n    }\n  }\n  else if (type == NT_ENCLOSE) {\n    EncloseNode* en = NENCLOSE(node);\n    in_root = 0;\n    if (en->type == ENCLOSE_MEMORY) {\n      node = en->target;\n      goto retry;\n    }\n  }\n  return 0;\n}\n\n\nstatic int\nupdate_string_node_case_fold(regex_t* reg, Node *node)\n{\n  UChar *p, *end, buf[ONIGENC_MBC_CASE_FOLD_MAXLEN];\n  UChar *sbuf, *ebuf, *sp;\n  int r, i, len;\n  OnigDistance sbuf_size;\n  StrNode* sn = NSTR(node);\n\n  end = sn->end;\n  sbuf_size = (end - sn->s) * 2;\n  sbuf = (UChar* )xmalloc(sbuf_size);\n  CHECK_NULL_RETURN_MEMERR(sbuf);\n  ebuf = sbuf + sbuf_size;\n\n  sp = sbuf;\n  p = sn->s;\n  while (p < end) {\n    len = ONIGENC_MBC_CASE_FOLD(reg->enc, reg->case_fold_flag, &p, end, buf);\n    for (i = 0; i < len; i++) {\n      if (sp >= ebuf) {\n\tUChar* p = (UChar* )xrealloc(sbuf, sbuf_size * 2);\n\tif (IS_NULL(p)) {\n\t  xfree(sbuf);\n\t  return ONIGERR_MEMORY;\n\t}\n\tsbuf = p;\n\tsp = sbuf + sbuf_size;\n\tsbuf_size *= 2;\n\tebuf = sbuf + sbuf_size;\n      }\n\n      *sp++ = buf[i];\n    }\n  }\n\n  r = onig_node_str_set(node, sbuf, sp);\n  if (r != 0) {\n    xfree(sbuf);\n    return r;\n  }\n\n  xfree(sbuf);\n  return 0;\n}\n\nstatic int\nexpand_case_fold_make_rem_string(Node** rnode, UChar *s, UChar *end,\n\t\t\t\t regex_t* reg)\n{\n  int r;\n  Node *node;\n\n  node = onig_node_new_str(s, end);\n  if (IS_NULL(node)) return ONIGERR_MEMORY;\n\n  r = update_string_node_case_fold(reg, node);\n  if (r != 0) {\n    onig_node_free(node);\n    return r;\n  }\n\n  NSTRING_SET_AMBIG(node);\n  NSTRING_SET_DONT_GET_OPT_INFO(node);\n  *rnode = node;\n  return 0;\n}\n\nstatic int\nexpand_case_fold_string_alt(int item_num, OnigCaseFoldCodeItem items[],\n\t\t\t    UChar *p, int slen, UChar *end,\n\t\t\t    regex_t* reg, Node **rnode)\n{\n  int r, i, j, len, varlen, varclen;\n  Node *anode, *var_anode, *snode, *xnode, *an;\n  UChar buf[ONIGENC_CODE_TO_MBC_MAXLEN];\n\n  *rnode = var_anode = NULL_NODE;\n\n  varlen = 0;\n  varclen = 0;\n  for (i = 0; i < item_num; i++) {\n    if (items[i].byte_len != slen) {\n      varlen = 1;\n      break;\n    }\n    if (items[i].code_len != 1) {\n      varclen = 1;\n    }\n  }\n\n  if (varlen != 0) {\n    *rnode = var_anode = onig_node_new_alt(NULL_NODE, NULL_NODE);\n    if (IS_NULL(var_anode)) return ONIGERR_MEMORY;\n\n    xnode = onig_node_new_list(NULL, NULL);\n    if (IS_NULL(xnode)) goto mem_err;\n    NCAR(var_anode) = xnode;\n\n    anode = onig_node_new_alt(NULL_NODE, NULL_NODE);\n    if (IS_NULL(anode)) goto mem_err;\n    NCAR(xnode) = anode;\n  }\n  else {\n    *rnode = anode = onig_node_new_alt(NULL_NODE, NULL_NODE);\n    if (IS_NULL(anode)) return ONIGERR_MEMORY;\n  }\n\n  snode = onig_node_new_str(p, p + slen);\n  if (IS_NULL(snode)) goto mem_err;\n\n  NCAR(anode) = snode;\n\n  for (i = 0; i < item_num; i++) {\n    snode = onig_node_new_str(NULL, NULL);\n    if (IS_NULL(snode)) goto mem_err;\n\n    for (j = 0; j < items[i].code_len; j++) {\n      len = ONIGENC_CODE_TO_MBC(reg->enc, items[i].code[j], buf);\n      if (len < 0) {\n\tr = len;\n\tgoto mem_err2;\n      }\n\n      r = onig_node_str_cat(snode, buf, buf + len);\n      if (r != 0) goto mem_err2;\n    }\n\n    an = onig_node_new_alt(NULL_NODE, NULL_NODE);\n    if (IS_NULL(an)) {\n      goto mem_err2;\n    }\n\n    if (items[i].byte_len != slen) {\n      Node *rem;\n      UChar *q = p + items[i].byte_len;\n\n      if (q < end) {\n\tr = expand_case_fold_make_rem_string(&rem, q, end, reg);\n\tif (r != 0) {\n\t  onig_node_free(an);\n\t  goto mem_err2;\n\t}\n\n\txnode = onig_node_list_add(NULL_NODE, snode);\n\tif (IS_NULL(xnode)) {\n\t  onig_node_free(an);\n\t  onig_node_free(rem);\n\t  goto mem_err2;\n\t}\n\tif (IS_NULL(onig_node_list_add(xnode, rem))) {\n\t  onig_node_free(an);\n\t  onig_node_free(xnode);\n\t  onig_node_free(rem);\n\t  goto mem_err;\n\t}\n\n\tNCAR(an) = xnode;\n      }\n      else {\n\tNCAR(an) = snode;\n      }\n\n      NCDR(var_anode) = an;\n      var_anode = an;\n    }\n    else {\n      NCAR(an)     = snode;\n      NCDR(anode) = an;\n      anode = an;\n    }\n  }\n\n  if (varclen && !varlen)\n    return 2;\n  return varlen;\n\n mem_err2:\n  onig_node_free(snode);\n\n mem_err:\n  onig_node_free(*rnode);\n\n  return ONIGERR_MEMORY;\n}\n\nstatic int\nexpand_case_fold_string(Node* node, regex_t* reg)\n{\n#define THRESHOLD_CASE_FOLD_ALT_FOR_EXPANSION  8\n\n  int r, n, len, alt_num;\n  int varlen = 0;\n  UChar *start, *end, *p;\n  Node *top_root, *root, *snode, *prev_node;\n  OnigCaseFoldCodeItem items[ONIGENC_GET_CASE_FOLD_CODES_MAX_NUM];\n  StrNode* sn = NSTR(node);\n\n  if (NSTRING_IS_AMBIG(node)) return 0;\n\n  start = sn->s;\n  end   = sn->end;\n  if (start >= end) return 0;\n\n  r = 0;\n  top_root = root = prev_node = snode = NULL_NODE;\n  alt_num = 1;\n  p = start;\n  while (p < end) {\n    n = ONIGENC_GET_CASE_FOLD_CODES_BY_STR(reg->enc, reg->case_fold_flag,\n\t\t\t\t\t   p, end, items);\n    if (n < 0) {\n      r = n;\n      goto err;\n    }\n\n    len = enclen(reg->enc, p);\n\n    if (n == 0) {\n      if (IS_NULL(snode)) {\n\tif (IS_NULL(root) && IS_NOT_NULL(prev_node)) {\n\t  top_root = root = onig_node_list_add(NULL_NODE, prev_node);\n\t  if (IS_NULL(root)) {\n\t    onig_node_free(prev_node);\n\t    goto mem_err;\n\t  }\n\t}\n\n\tprev_node = snode = onig_node_new_str(NULL, NULL);\n\tif (IS_NULL(snode)) goto mem_err;\n\tif (IS_NOT_NULL(root)) {\n\t  if (IS_NULL(onig_node_list_add(root, snode))) {\n\t    onig_node_free(snode);\n\t    goto mem_err;\n\t  }\n\t}\n      }\n\n      r = onig_node_str_cat(snode, p, p + len);\n      if (r != 0) goto err;\n    }\n    else {\n      alt_num *= (n + 1);\n      if (alt_num > THRESHOLD_CASE_FOLD_ALT_FOR_EXPANSION) break;\n\n      if (IS_NULL(root) && IS_NOT_NULL(prev_node)) {\n\ttop_root = root = onig_node_list_add(NULL_NODE, prev_node);\n\tif (IS_NULL(root)) {\n\t  onig_node_free(prev_node);\n\t  goto mem_err;\n\t}\n      }\n\n      r = expand_case_fold_string_alt(n, items, p, len, end, reg, &prev_node);\n      if (r < 0) goto mem_err;\n      if (r > 0) varlen = 1;\n      if (r == 1) {\n\tif (IS_NULL(root)) {\n\t  top_root = prev_node;\n\t}\n\telse {\n\t  if (IS_NULL(onig_node_list_add(root, prev_node))) {\n\t    onig_node_free(prev_node);\n\t    goto mem_err;\n\t  }\n\t}\n\n\troot = NCAR(prev_node);\n      }\n      else { /* r == 0 || r == 2 */\n\tif (IS_NOT_NULL(root)) {\n\t  if (IS_NULL(onig_node_list_add(root, prev_node))) {\n\t    onig_node_free(prev_node);\n\t    goto mem_err;\n\t  }\n\t}\n      }\n\n      snode = NULL_NODE;\n    }\n\n    p += len;\n  }\n\n  if (p < end) {\n    Node *srem;\n\n    r = expand_case_fold_make_rem_string(&srem, p, end, reg);\n    if (r != 0) goto mem_err;\n\n    if (IS_NOT_NULL(prev_node) && IS_NULL(root)) {\n      top_root = root = onig_node_list_add(NULL_NODE, prev_node);\n      if (IS_NULL(root)) {\n\tonig_node_free(srem);\n\tonig_node_free(prev_node);\n\tgoto mem_err;\n      }\n    }\n\n    if (IS_NULL(root)) {\n      prev_node = srem;\n    }\n    else {\n      if (IS_NULL(onig_node_list_add(root, srem))) {\n\tonig_node_free(srem);\n\tgoto mem_err;\n      }\n    }\n  }\n\n  /* ending */\n  top_root = (IS_NOT_NULL(top_root) ? top_root : prev_node);\n  if (!varlen) {\n    /* When all expanded strings are same length, case-insensitive\n       BM search will be used. */\n    r = update_string_node_case_fold(reg, node);\n    if (r == 0) {\n      NSTRING_SET_AMBIG(node);\n    }\n  }\n  else {\n    swap_node(node, top_root);\n    r = 0;\n  }\n  onig_node_free(top_root);\n  return r;\n\n mem_err:\n  r = ONIGERR_MEMORY;\n\n err:\n  onig_node_free(top_root);\n  return r;\n}\n\n\n#ifdef USE_COMBINATION_EXPLOSION_CHECK\n\n#define CEC_THRES_NUM_BIG_REPEAT         512\n#define CEC_INFINITE_NUM          0x7fffffff\n\n#define CEC_IN_INFINITE_REPEAT    (1<<0)\n#define CEC_IN_FINITE_REPEAT      (1<<1)\n#define CEC_CONT_BIG_REPEAT       (1<<2)\n\nstatic int\nsetup_comb_exp_check(Node* node, int state, ScanEnv* env)\n{\n  int type;\n  int r = state;\n\n  type = NTYPE(node);\n  switch (type) {\n  case NT_LIST:\n    {\n      Node* prev = NULL_NODE;\n      do {\n\tr = setup_comb_exp_check(NCAR(node), r, env);\n\tprev = NCAR(node);\n      } while (r >= 0 && IS_NOT_NULL(node = NCDR(node)));\n    }\n    break;\n\n  case NT_ALT:\n    {\n      int ret;\n      do {\n\tret = setup_comb_exp_check(NCAR(node), state, env);\n\tr |= ret;\n      } while (ret >= 0 && IS_NOT_NULL(node = NCDR(node)));\n    }\n    break;\n\n  case NT_QTFR:\n    {\n      int child_state = state;\n      int add_state = 0;\n      QtfrNode* qn = NQTFR(node);\n      Node* target = qn->target;\n      int var_num;\n\n      if (! IS_REPEAT_INFINITE(qn->upper)) {\n\tif (qn->upper > 1) {\n\t  /* {0,1}, {1,1} are allowed */\n\t  child_state |= CEC_IN_FINITE_REPEAT;\n\n\t  /* check (a*){n,m}, (a+){n,m} => (a*){n,n}, (a+){n,n} */\n\t  if (env->backrefed_mem == 0) {\n\t    if (NTYPE(qn->target) == NT_ENCLOSE) {\n\t      EncloseNode* en = NENCLOSE(qn->target);\n\t      if (en->type == ENCLOSE_MEMORY) {\n\t\tif (NTYPE(en->target) == NT_QTFR) {\n\t\t  QtfrNode* q = NQTFR(en->target);\n\t\t  if (IS_REPEAT_INFINITE(q->upper)\n\t\t      && q->greedy == qn->greedy) {\n\t\t    qn->upper = (qn->lower == 0 ? 1 : qn->lower);\n\t\t    if (qn->upper == 1)\n\t\t      child_state = state;\n\t\t  }\n\t\t}\n\t      }\n\t    }\n\t  }\n\t}\n      }\n\n      if (state & CEC_IN_FINITE_REPEAT) {\n\tqn->comb_exp_check_num = -1;\n      }\n      else {\n\tif (IS_REPEAT_INFINITE(qn->upper)) {\n\t  var_num = CEC_INFINITE_NUM;\n\t  child_state |= CEC_IN_INFINITE_REPEAT;\n\t}\n\telse {\n\t  var_num = qn->upper - qn->lower;\n\t}\n\n\tif (var_num >= CEC_THRES_NUM_BIG_REPEAT)\n\t  add_state |= CEC_CONT_BIG_REPEAT;\n\n\tif (((state & CEC_IN_INFINITE_REPEAT) != 0 && var_num != 0) ||\n\t    ((state & CEC_CONT_BIG_REPEAT) != 0 &&\n\t     var_num >= CEC_THRES_NUM_BIG_REPEAT)) {\n\t  if (qn->comb_exp_check_num == 0) {\n\t    env->num_comb_exp_check++;\n\t    qn->comb_exp_check_num = env->num_comb_exp_check;\n\t    if (env->curr_max_regnum > env->comb_exp_max_regnum)\n\t      env->comb_exp_max_regnum = env->curr_max_regnum;\n\t  }\n\t}\n      }\n\n      r = setup_comb_exp_check(target, child_state, env);\n      r |= add_state;\n    }\n    break;\n\n  case NT_ENCLOSE:\n    {\n      EncloseNode* en = NENCLOSE(node);\n\n      switch (en->type) {\n      case ENCLOSE_MEMORY:\n\t{\n\t  if (env->curr_max_regnum < en->regnum)\n\t    env->curr_max_regnum = en->regnum;\n\n\t  r = setup_comb_exp_check(en->target, state, env);\n\t}\n\tbreak;\n\n      default:\n\tr = setup_comb_exp_check(en->target, state, env);\n\tbreak;\n      }\n    }\n    break;\n\n#ifdef USE_SUBEXP_CALL\n  case NT_CALL:\n    if (IS_CALL_RECURSION(NCALL(node)))\n      env->has_recursion = 1;\n    else\n      r = setup_comb_exp_check(NCALL(node)->target, state, env);\n    break;\n#endif\n\n  default:\n    break;\n  }\n\n  return r;\n}\n#endif\n\n#define IN_ALT        (1<<0)\n#define IN_NOT        (1<<1)\n#define IN_REPEAT     (1<<2)\n#define IN_VAR_REPEAT (1<<3)\n#define IN_ROOT       (1<<4)\n\n/* setup_tree does the following work.\n 1. check empty loop. (set qn->target_empty_info)\n 2. expand ignore-case in char class.\n 3. set memory status bit flags. (reg->mem_stats)\n 4. set qn->head_exact for [push, exact] -> [push_or_jump_exact1, exact].\n 5. find invalid patterns in look-behind.\n 6. expand repeated string.\n */\nstatic int\nsetup_tree(Node* node, regex_t* reg, int state, ScanEnv* env)\n{\n  int type;\n  int r = 0;\n  int in_root = state & IN_ROOT;\n\n  state &= ~IN_ROOT;\nrestart:\n  type = NTYPE(node);\n  switch (type) {\n  case NT_LIST:\n    {\n      Node* prev = NULL_NODE;\n      int prev_in_root = 0;\n      state |= in_root;\n      do {\n\tr = setup_tree(NCAR(node), reg, state, env);\n\tif (IS_NOT_NULL(prev) && r == 0) {\n\t  r = next_setup(prev, NCAR(node), prev_in_root, reg);\n\t}\n\tprev = NCAR(node);\n\tprev_in_root = state & IN_ROOT;\n\tstate &= ~IN_ROOT;\n      } while (r == 0 && IS_NOT_NULL(node = NCDR(node)));\n    }\n    break;\n\n  case NT_ALT:\n    do {\n      r = setup_tree(NCAR(node), reg, (state | IN_ALT), env);\n    } while (r == 0 && IS_NOT_NULL(node = NCDR(node)));\n    break;\n\n  case NT_CCLASS:\n    break;\n\n  case NT_STR:\n    if (IS_IGNORECASE(reg->options) && !NSTRING_IS_RAW(node)) {\n      r = expand_case_fold_string(node, reg);\n    }\n    break;\n\n  case NT_CTYPE:\n  case NT_CANY:\n    break;\n\n#ifdef USE_SUBEXP_CALL\n  case NT_CALL:\n    break;\n#endif\n\n  case NT_BREF:\n    {\n      int i;\n      int* p;\n      Node** nodes = SCANENV_MEM_NODES(env);\n      BRefNode* br = NBREF(node);\n      p = BACKREFS_P(br);\n      for (i = 0; i < br->back_num; i++) {\n\tif (p[i] > env->num_mem)  return ONIGERR_INVALID_BACKREF;\n\tBIT_STATUS_ON_AT(env->backrefed_mem, p[i]);\n\tBIT_STATUS_ON_AT(env->bt_mem_start, p[i]);\n#ifdef USE_BACKREF_WITH_LEVEL\n\tif (IS_BACKREF_NEST_LEVEL(br)) {\n\t  BIT_STATUS_ON_AT(env->bt_mem_end, p[i]);\n\t}\n#endif\n\tSET_ENCLOSE_STATUS(nodes[p[i]], NST_MEM_BACKREFED);\n      }\n    }\n    break;\n\n  case NT_QTFR:\n    {\n      OnigDistance d;\n      QtfrNode* qn = NQTFR(node);\n      Node* target = qn->target;\n\n      if ((state & IN_REPEAT) != 0) {\n        qn->state |= NST_IN_REPEAT;\n      }\n\n      if (IS_REPEAT_INFINITE(qn->upper) || qn->upper >= 1) {\n\tr = get_min_match_length(target, &d, env);\n\tif (r) break;\n\tif (d == 0) {\n\t  qn->target_empty_info = NQ_TARGET_IS_EMPTY;\n#ifdef USE_MONOMANIAC_CHECK_CAPTURES_IN_ENDLESS_REPEAT\n\t  r = quantifiers_memory_node_info(target);\n\t  if (r < 0) break;\n\t  if (r > 0) {\n\t    qn->target_empty_info = r;\n\t  }\n#endif\n#if 0\n\t  r = get_max_match_length(target, &d, env);\n\t  if (r == 0 && d == 0) {\n\t    /*  ()* ==> ()?, ()+ ==> ()  */\n\t    qn->upper = 1;\n\t    if (qn->lower > 1) qn->lower = 1;\n\t    if (NTYPE(target) == NT_STR) {\n\t      qn->upper = qn->lower = 0;  /* /(?:)+/ ==> // */\n\t    }\n\t  }\n#endif\n\t}\n      }\n\n      state |= IN_REPEAT;\n      if (qn->lower != qn->upper)\n\tstate |= IN_VAR_REPEAT;\n      r = setup_tree(target, reg, state, env);\n      if (r) break;\n\n      /* expand string */\n#define EXPAND_STRING_MAX_LENGTH  100\n      if (NTYPE(target) == NT_STR) {\n\tif (qn->lower > 1) {\n\t  int i, n = qn->lower;\n\t  OnigDistance len = NSTRING_LEN(target);\n\t  StrNode* sn = NSTR(target);\n\t  Node* np;\n\n\t  np = onig_node_new_str(sn->s, sn->end);\n\t  if (IS_NULL(np)) return ONIGERR_MEMORY;\n\t  NSTR(np)->flag = sn->flag;\n\n\t  for (i = 1; i < n && (i+1) * len <= EXPAND_STRING_MAX_LENGTH; i++) {\n\t    r = onig_node_str_cat(np, sn->s, sn->end);\n\t    if (r) {\n\t      onig_node_free(np);\n\t      return r;\n\t    }\n\t  }\n\t  if (i < qn->upper || IS_REPEAT_INFINITE(qn->upper)) {\n\t    Node *np1, *np2;\n\n\t    qn->lower -= i;\n\t    if (! IS_REPEAT_INFINITE(qn->upper))\n\t      qn->upper -= i;\n\n\t    np1 = onig_node_new_list(np, NULL);\n\t    if (IS_NULL(np1)) {\n\t      onig_node_free(np);\n\t      return ONIGERR_MEMORY;\n\t    }\n\t    swap_node(np1, node);\n\t    np2 = onig_node_list_add(node, np1);\n\t    if (IS_NULL(np2)) {\n\t      onig_node_free(np1);\n\t      return ONIGERR_MEMORY;\n\t    }\n\t  }\n\t  else {\n\t    swap_node(np, node);\n\t    onig_node_free(np);\n\t  }\n\t  break; /* break case NT_QTFR: */\n\t}\n      }\n\n#ifdef USE_OP_PUSH_OR_JUMP_EXACT\n      if (qn->greedy && (qn->target_empty_info != 0)) {\n\tif (NTYPE(target) == NT_QTFR) {\n\t  QtfrNode* tqn = NQTFR(target);\n\t  if (IS_NOT_NULL(tqn->head_exact)) {\n\t    qn->head_exact  = tqn->head_exact;\n\t    tqn->head_exact = NULL;\n\t  }\n\t}\n\telse {\n\t  qn->head_exact = get_head_value_node(qn->target, 1, reg);\n\t}\n      }\n#endif\n    }\n    break;\n\n  case NT_ENCLOSE:\n    {\n      EncloseNode* en = NENCLOSE(node);\n\n      switch (en->type) {\n      case ENCLOSE_OPTION:\n\t{\n\t  OnigOptionType options = reg->options;\n\t  state |= in_root;\n\t  reg->options = NENCLOSE(node)->option;\n\t  r = setup_tree(NENCLOSE(node)->target, reg, state, env);\n\t  reg->options = options;\n\t}\n\tbreak;\n\n      case ENCLOSE_MEMORY:\n\tif ((state & (IN_ALT | IN_NOT | IN_VAR_REPEAT)) != 0) {\n\t  BIT_STATUS_ON_AT(env->bt_mem_start, en->regnum);\n\t  /* SET_ENCLOSE_STATUS(node, NST_MEM_IN_ALT_NOT); */\n\t}\n        r = setup_tree(en->target, reg, state, env);\n        break;\n\n      case ENCLOSE_STOP_BACKTRACK:\n\t{\n\t  Node* target = en->target;\n\t  r = setup_tree(target, reg, state, env);\n\t  if (NTYPE(target) == NT_QTFR) {\n\t    QtfrNode* tqn = NQTFR(target);\n\t    if (IS_REPEAT_INFINITE(tqn->upper) && tqn->lower <= 1 &&\n\t\ttqn->greedy != 0) {  /* (?>a*), a*+ etc... */\n\t      int qtype = NTYPE(tqn->target);\n\t      if (IS_NODE_TYPE_SIMPLE(qtype))\n\t\tSET_ENCLOSE_STATUS(node, NST_STOP_BT_SIMPLE_REPEAT);\n\t    }\n\t  }\n\t}\n\tbreak;\n\n      case ENCLOSE_CONDITION:\n#ifdef USE_NAMED_GROUP\n\tif (! IS_ENCLOSE_NAME_REF(NENCLOSE(node)) &&\n\t    env->num_named > 0 &&\n\t    IS_SYNTAX_BV(env->syntax, ONIG_SYN_CAPTURE_ONLY_NAMED_GROUP) &&\n\t    !ONIG_IS_OPTION_ON(env->option, ONIG_OPTION_CAPTURE_GROUP)) {\n\t  return ONIGERR_NUMBERED_BACKREF_OR_CALL_NOT_ALLOWED;\n\t}\n#endif\n\tr = setup_tree(NENCLOSE(node)->target, reg, state, env);\n\tbreak;\n      }\n    }\n    break;\n\n  case NT_ANCHOR:\n    {\n      AnchorNode* an = NANCHOR(node);\n\n      switch (an->type) {\n      case ANCHOR_PREC_READ:\n\tr = setup_tree(an->target, reg, state, env);\n\tbreak;\n      case ANCHOR_PREC_READ_NOT:\n\tr = setup_tree(an->target, reg, (state | IN_NOT), env);\n\tbreak;\n\n/* allowed node types in look-behind */\n#define ALLOWED_TYPE_IN_LB  \\\n  ( BIT_NT_LIST | BIT_NT_ALT | BIT_NT_STR | BIT_NT_CCLASS | BIT_NT_CTYPE | \\\n    BIT_NT_CANY | BIT_NT_ANCHOR | BIT_NT_ENCLOSE | BIT_NT_QTFR | BIT_NT_CALL )\n\n#define ALLOWED_ENCLOSE_IN_LB       ( ENCLOSE_MEMORY | ENCLOSE_OPTION )\n#define ALLOWED_ENCLOSE_IN_LB_NOT   ENCLOSE_OPTION\n\n#define ALLOWED_ANCHOR_IN_LB \\\n( ANCHOR_LOOK_BEHIND | ANCHOR_LOOK_BEHIND_NOT | ANCHOR_BEGIN_LINE | \\\n  ANCHOR_END_LINE | ANCHOR_BEGIN_BUF | ANCHOR_BEGIN_POSITION | ANCHOR_KEEP | \\\n  ANCHOR_WORD_BOUND | ANCHOR_NOT_WORD_BOUND | \\\n  ANCHOR_WORD_BEGIN | ANCHOR_WORD_END )\n#define ALLOWED_ANCHOR_IN_LB_NOT \\\n( ANCHOR_LOOK_BEHIND | ANCHOR_LOOK_BEHIND_NOT | ANCHOR_BEGIN_LINE | \\\n  ANCHOR_END_LINE | ANCHOR_BEGIN_BUF | ANCHOR_BEGIN_POSITION | ANCHOR_KEEP | \\\n  ANCHOR_WORD_BOUND | ANCHOR_NOT_WORD_BOUND | \\\n  ANCHOR_WORD_BEGIN | ANCHOR_WORD_END )\n\n      case ANCHOR_LOOK_BEHIND:\n\t{\n\t  r = check_type_tree(an->target, ALLOWED_TYPE_IN_LB,\n\t\t\t      ALLOWED_ENCLOSE_IN_LB, ALLOWED_ANCHOR_IN_LB);\n\t  if (r < 0) return r;\n\t  if (r > 0) return ONIGERR_INVALID_LOOK_BEHIND_PATTERN;\n\t  r = setup_look_behind(node, reg, env);\n\t  if (r != 0) return r;\n\t  if (NTYPE(node) != NT_ANCHOR) goto restart;\n\t  r = setup_tree(an->target, reg, state, env);\n\t}\n\tbreak;\n\n      case ANCHOR_LOOK_BEHIND_NOT:\n\t{\n\t  r = check_type_tree(an->target, ALLOWED_TYPE_IN_LB,\n\t\t      ALLOWED_ENCLOSE_IN_LB_NOT, ALLOWED_ANCHOR_IN_LB_NOT);\n\t  if (r < 0) return r;\n\t  if (r > 0) return ONIGERR_INVALID_LOOK_BEHIND_PATTERN;\n\t  r = setup_look_behind(node, reg, env);\n\t  if (r != 0) return r;\n\t  if (NTYPE(node) != NT_ANCHOR) goto restart;\n\t  r = setup_tree(an->target, reg, (state | IN_NOT), env);\n\t}\n\tbreak;\n      }\n    }\n    break;\n\n  default:\n    break;\n  }\n\n  return r;\n}\n\n#ifndef USE_SUNDAY_QUICK_SEARCH\n/* set skip map for Boyer-Moore search */\nstatic int\nset_bm_skip(UChar* s, UChar* end, regex_t* reg,\n\t    UChar skip[], int** int_skip, int ignore_case)\n{\n  OnigDistance i, len;\n  int clen, flen, n, j, k;\n  UChar *p, buf[ONIGENC_GET_CASE_FOLD_CODES_MAX_NUM][ONIGENC_MBC_CASE_FOLD_MAXLEN];\n  OnigCaseFoldCodeItem items[ONIGENC_GET_CASE_FOLD_CODES_MAX_NUM];\n  OnigEncoding enc = reg->enc;\n\n  len = end - s;\n  if (len < ONIG_CHAR_TABLE_SIZE) {\n    for (i = 0; i < ONIG_CHAR_TABLE_SIZE; i++) skip[i] = (UChar )len;\n\n    n = 0;\n    for (i = 0; i < len - 1; i += clen) {\n      p = s + i;\n      if (ignore_case)\n\tn = ONIGENC_GET_CASE_FOLD_CODES_BY_STR(enc, reg->case_fold_flag,\n\t\t\t\t\t       p, end, items);\n      clen = enclen(enc, p);\n\n      for (j = 0; j < n; j++) {\n\tif ((items[j].code_len != 1) || (items[j].byte_len != clen))\n\t  return 1;  /* different length isn't supported. */\n\tflen = ONIGENC_CODE_TO_MBC(enc, items[j].code[0], buf[j]);\n\tif (flen != clen)\n\t  return 1;  /* different length isn't supported. */\n      }\n      for (j = 0; j < clen; j++) {\n\tskip[s[i + j]] = (UChar )(len - 1 - i - j);\n\tfor (k = 0; k < n; k++) {\n\t  skip[buf[k][j]] = (UChar )(len - 1 - i - j);\n\t}\n      }\n    }\n  }\n  else {\n    if (IS_NULL(*int_skip)) {\n      *int_skip = (int* )xmalloc(sizeof(int) * ONIG_CHAR_TABLE_SIZE);\n      if (IS_NULL(*int_skip)) return ONIGERR_MEMORY;\n    }\n    for (i = 0; i < ONIG_CHAR_TABLE_SIZE; i++) (*int_skip)[i] = (int )len;\n\n    n = 0;\n    for (i = 0; i < len - 1; i += clen) {\n      p = s + i;\n      if (ignore_case)\n\tn = ONIGENC_GET_CASE_FOLD_CODES_BY_STR(enc, reg->case_fold_flag,\n\t\t\t\t\t       p, end, items);\n      clen = enclen(enc, p);\n\n      for (j = 0; j < n; j++) {\n\tif ((items[j].code_len != 1) || (items[j].byte_len != clen))\n\t  return 1;  /* different length isn't supported. */\n\tflen = ONIGENC_CODE_TO_MBC(enc, items[j].code[0], buf[j]);\n\tif (flen != clen)\n\t  return 1;  /* different length isn't supported. */\n      }\n      for (j = 0; j < clen; j++) {\n\t(*int_skip)[s[i + j]] = (int )(len - 1 - i - j);\n\tfor (k = 0; k < n; k++) {\n\t  (*int_skip)[buf[k][j]] = (int )(len - 1 - i - j);\n\t}\n      }\n    }\n  }\n  return 0;\n}\n\n#else /* USE_SUNDAY_QUICK_SEARCH */\n\n/* set skip map for Sunday's quick search */\nstatic int\nset_bm_skip(UChar* s, UChar* end, regex_t* reg,\n\t    UChar skip[], int** int_skip, int ignore_case)\n{\n  OnigDistance i, len;\n  int clen, flen, n, j, k;\n  UChar *p, buf[ONIGENC_GET_CASE_FOLD_CODES_MAX_NUM][ONIGENC_MBC_CASE_FOLD_MAXLEN];\n  OnigCaseFoldCodeItem items[ONIGENC_GET_CASE_FOLD_CODES_MAX_NUM];\n  OnigEncoding enc = reg->enc;\n\n  len = end - s;\n  if (len < ONIG_CHAR_TABLE_SIZE) {\n    for (i = 0; i < ONIG_CHAR_TABLE_SIZE; i++) skip[i] = (UChar )(len + 1);\n\n    n = 0;\n    for (i = 0; i < len; i += clen) {\n      p = s + i;\n      if (ignore_case)\n\tn = ONIGENC_GET_CASE_FOLD_CODES_BY_STR(enc, reg->case_fold_flag,\n\t\t\t\t\t       p, end, items);\n      clen = enclen(enc, p);\n\n      for (j = 0; j < n; j++) {\n\tif ((items[j].code_len != 1) || (items[j].byte_len != clen))\n\t  return 1;  /* different length isn't supported. */\n\tflen = ONIGENC_CODE_TO_MBC(enc, items[j].code[0], buf[j]);\n\tif (flen != clen)\n\t  return 1;  /* different length isn't supported. */\n      }\n      for (j = 0; j < clen; j++) {\n\tskip[s[i + j]] = (UChar )(len - i - j);\n\tfor (k = 0; k < n; k++) {\n\t  skip[buf[k][j]] = (UChar )(len - i - j);\n\t}\n      }\n    }\n  }\n  else {\n    if (IS_NULL(*int_skip)) {\n      *int_skip = (int* )xmalloc(sizeof(int) * ONIG_CHAR_TABLE_SIZE);\n      if (IS_NULL(*int_skip)) return ONIGERR_MEMORY;\n    }\n    for (i = 0; i < ONIG_CHAR_TABLE_SIZE; i++) (*int_skip)[i] = (int )(len + 1);\n\n    n = 0;\n    for (i = 0; i < len; i += clen) {\n      p = s + i;\n      if (ignore_case)\n\tn = ONIGENC_GET_CASE_FOLD_CODES_BY_STR(enc, reg->case_fold_flag,\n\t\t\t\t\t       p, end, items);\n      clen = enclen(enc, p);\n\n      for (j = 0; j < n; j++) {\n\tif ((items[j].code_len != 1) || (items[j].byte_len != clen))\n\t  return 1;  /* different length isn't supported. */\n\tflen = ONIGENC_CODE_TO_MBC(enc, items[j].code[0], buf[j]);\n\tif (flen != clen)\n\t  return 1;  /* different length isn't supported. */\n      }\n      for (j = 0; j < clen; j++) {\n\t(*int_skip)[s[i + j]] = (int )(len - i - j);\n\tfor (k = 0; k < n; k++) {\n\t  (*int_skip)[buf[k][j]] = (int )(len - i - j);\n\t}\n      }\n    }\n  }\n  return 0;\n}\n#endif /* USE_SUNDAY_QUICK_SEARCH */\n\n#define OPT_EXACT_MAXLEN   24\n\ntypedef struct {\n  OnigDistance min;  /* min byte length */\n  OnigDistance max;  /* max byte length */\n} MinMaxLen;\n\ntypedef struct {\n  MinMaxLen        mmd;\n  OnigEncoding     enc;\n  OnigOptionType   options;\n  OnigCaseFoldType case_fold_flag;\n  ScanEnv*         scan_env;\n} OptEnv;\n\ntypedef struct {\n  int left_anchor;\n  int right_anchor;\n} OptAncInfo;\n\ntypedef struct {\n  MinMaxLen  mmd; /* info position */\n  OptAncInfo anc;\n\n  int   reach_end;\n  int   ignore_case;  /* -1: unset, 0: case sensitive, 1: ignore case */\n  int   len;\n  UChar s[OPT_EXACT_MAXLEN];\n} OptExactInfo;\n\ntypedef struct {\n  MinMaxLen mmd; /* info position */\n  OptAncInfo anc;\n\n  int   value;      /* weighted value */\n  UChar map[ONIG_CHAR_TABLE_SIZE];\n} OptMapInfo;\n\ntypedef struct {\n  MinMaxLen    len;\n\n  OptAncInfo   anc;\n  OptExactInfo exb;    /* boundary */\n  OptExactInfo exm;    /* middle */\n  OptExactInfo expr;   /* prec read (?=...) */\n\n  OptMapInfo   map;   /* boundary */\n} NodeOptInfo;\n\n\nstatic int\nmap_position_value(OnigEncoding enc, int i)\n{\n  static const short int ByteValTable[] = {\n     5,  1,  1,  1,  1,  1,  1,  1,  1, 10, 10,  1,  1, 10,  1,  1,\n     1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,\n    12,  4,  7,  4,  4,  4,  4,  4,  4,  5,  5,  5,  5,  5,  5,  5,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  5,  5,  5,  5,  5,  5,\n     5,  6,  6,  6,  6,  7,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  5,  6,  5,  5,  5,\n     5,  6,  6,  6,  6,  7,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,\n     6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  6,  5,  5,  5,  5,  1\n  };\n\n  if (i < (int )(sizeof(ByteValTable)/sizeof(ByteValTable[0]))) {\n    if (i == 0 && ONIGENC_MBC_MINLEN(enc) > 1)\n      return 20;\n    else\n      return (int )ByteValTable[i];\n  }\n  else\n    return 4;   /* Take it easy. */\n}\n\nstatic int\ndistance_value(MinMaxLen* mm)\n{\n  /* 1000 / (min-max-dist + 1) */\n  static const short int dist_vals[] = {\n    1000,  500,  333,  250,  200,  167,  143,  125,  111,  100,\n      91,   83,   77,   71,   67,   63,   59,   56,   53,   50,\n      48,   45,   43,   42,   40,   38,   37,   36,   34,   33,\n      32,   31,   30,   29,   29,   28,   27,   26,   26,   25,\n      24,   24,   23,   23,   22,   22,   21,   21,   20,   20,\n      20,   19,   19,   19,   18,   18,   18,   17,   17,   17,\n      16,   16,   16,   16,   15,   15,   15,   15,   14,   14,\n      14,   14,   14,   14,   13,   13,   13,   13,   13,   13,\n      12,   12,   12,   12,   12,   12,   11,   11,   11,   11,\n      11,   11,   11,   11,   11,   10,   10,   10,   10,   10\n  };\n\n  OnigDistance d;\n\n  if (mm->max == ONIG_INFINITE_DISTANCE) return 0;\n\n  d = mm->max - mm->min;\n  if (d < sizeof(dist_vals)/sizeof(dist_vals[0]))\n    /* return dist_vals[d] * 16 / (mm->min + 12); */\n    return (int )dist_vals[d];\n  else\n    return 1;\n}\n\nstatic int\ncomp_distance_value(MinMaxLen* d1, MinMaxLen* d2, int v1, int v2)\n{\n  if (v2 <= 0) return -1;\n  if (v1 <= 0) return  1;\n\n  v1 *= distance_value(d1);\n  v2 *= distance_value(d2);\n\n  if (v2 > v1) return  1;\n  if (v2 < v1) return -1;\n\n  if (d2->min < d1->min) return  1;\n  if (d2->min > d1->min) return -1;\n  return 0;\n}\n\nstatic int\nis_equal_mml(MinMaxLen* a, MinMaxLen* b)\n{\n  return (a->min == b->min && a->max == b->max) ? 1 : 0;\n}\n\n\nstatic void\nset_mml(MinMaxLen* mml, OnigDistance min, OnigDistance max)\n{\n  mml->min = min;\n  mml->max = max;\n}\n\nstatic void\nclear_mml(MinMaxLen* mml)\n{\n  mml->min = mml->max = 0;\n}\n\nstatic void\ncopy_mml(MinMaxLen* to, MinMaxLen* from)\n{\n  to->min = from->min;\n  to->max = from->max;\n}\n\nstatic void\nadd_mml(MinMaxLen* to, MinMaxLen* from)\n{\n  to->min = distance_add(to->min, from->min);\n  to->max = distance_add(to->max, from->max);\n}\n\n#if 0\nstatic void\nadd_len_mml(MinMaxLen* to, OnigDistance len)\n{\n  to->min = distance_add(to->min, len);\n  to->max = distance_add(to->max, len);\n}\n#endif\n\nstatic void\nalt_merge_mml(MinMaxLen* to, MinMaxLen* from)\n{\n  if (to->min > from->min) to->min = from->min;\n  if (to->max < from->max) to->max = from->max;\n}\n\nstatic void\ncopy_opt_env(OptEnv* to, OptEnv* from)\n{\n  *to = *from;\n}\n\nstatic void\nclear_opt_anc_info(OptAncInfo* anc)\n{\n  anc->left_anchor  = 0;\n  anc->right_anchor = 0;\n}\n\nstatic void\ncopy_opt_anc_info(OptAncInfo* to, OptAncInfo* from)\n{\n  *to = *from;\n}\n\nstatic void\nconcat_opt_anc_info(OptAncInfo* to, OptAncInfo* left, OptAncInfo* right,\n\t\t    OnigDistance left_len, OnigDistance right_len)\n{\n  clear_opt_anc_info(to);\n\n  to->left_anchor = left->left_anchor;\n  if (left_len == 0) {\n    to->left_anchor |= right->left_anchor;\n  }\n\n  to->right_anchor = right->right_anchor;\n  if (right_len == 0) {\n    to->right_anchor |= left->right_anchor;\n  }\n}\n\nstatic int\nis_left_anchor(int anc)\n{\n  if (anc == ANCHOR_END_BUF || anc == ANCHOR_SEMI_END_BUF ||\n      anc == ANCHOR_END_LINE || anc == ANCHOR_PREC_READ ||\n      anc == ANCHOR_PREC_READ_NOT)\n    return 0;\n\n  return 1;\n}\n\nstatic int\nis_set_opt_anc_info(OptAncInfo* to, int anc)\n{\n  if ((to->left_anchor & anc) != 0) return 1;\n\n  return ((to->right_anchor & anc) != 0 ? 1 : 0);\n}\n\nstatic void\nadd_opt_anc_info(OptAncInfo* to, int anc)\n{\n  if (is_left_anchor(anc))\n    to->left_anchor |= anc;\n  else\n    to->right_anchor |= anc;\n}\n\nstatic void\nremove_opt_anc_info(OptAncInfo* to, int anc)\n{\n  if (is_left_anchor(anc))\n    to->left_anchor &= ~anc;\n  else\n    to->right_anchor &= ~anc;\n}\n\nstatic void\nalt_merge_opt_anc_info(OptAncInfo* to, OptAncInfo* add)\n{\n  to->left_anchor  &= add->left_anchor;\n  to->right_anchor &= add->right_anchor;\n}\n\nstatic int\nis_full_opt_exact_info(OptExactInfo* ex)\n{\n  return (ex->len >= OPT_EXACT_MAXLEN ? 1 : 0);\n}\n\nstatic void\nclear_opt_exact_info(OptExactInfo* ex)\n{\n  clear_mml(&ex->mmd);\n  clear_opt_anc_info(&ex->anc);\n  ex->reach_end   = 0;\n  ex->ignore_case = -1;   /* unset */\n  ex->len         = 0;\n  ex->s[0]        = '\\0';\n}\n\nstatic void\ncopy_opt_exact_info(OptExactInfo* to, OptExactInfo* from)\n{\n  *to = *from;\n}\n\nstatic void\nconcat_opt_exact_info(OptExactInfo* to, OptExactInfo* add, OnigEncoding enc)\n{\n  int i, j, len;\n  UChar *p, *end;\n  OptAncInfo tanc;\n\n  if (to->ignore_case < 0)\n    to->ignore_case = add->ignore_case;\n  else if (to->ignore_case != add->ignore_case)\n    return ;  /* avoid */\n\n  p = add->s;\n  end = p + add->len;\n  for (i = to->len; p < end; ) {\n    len = enclen(enc, p);\n    if (i + len > OPT_EXACT_MAXLEN) break;\n    for (j = 0; j < len && p < end; j++)\n      to->s[i++] = *p++;\n  }\n\n  to->len = i;\n  to->reach_end = (p == end ? add->reach_end : 0);\n\n  concat_opt_anc_info(&tanc, &to->anc, &add->anc, 1, 1);\n  if (! to->reach_end) tanc.right_anchor = 0;\n  copy_opt_anc_info(&to->anc, &tanc);\n}\n\nstatic void\nconcat_opt_exact_info_str(OptExactInfo* to, UChar* s, UChar* end,\n\t\t\t  int raw ARG_UNUSED, OnigEncoding enc)\n{\n  int i, j, len;\n  UChar *p;\n\n  for (i = to->len, p = s; p < end && i < OPT_EXACT_MAXLEN; ) {\n    len = enclen(enc, p);\n    if (i + len > OPT_EXACT_MAXLEN) break;\n    for (j = 0; j < len && p < end; j++)\n      to->s[i++] = *p++;\n  }\n\n  to->len = i;\n}\n\nstatic void\nalt_merge_opt_exact_info(OptExactInfo* to, OptExactInfo* add, OptEnv* env)\n{\n  int i, j, len;\n\n  if (add->len == 0 || to->len == 0) {\n    clear_opt_exact_info(to);\n    return ;\n  }\n\n  if (! is_equal_mml(&to->mmd, &add->mmd)) {\n    clear_opt_exact_info(to);\n    return ;\n  }\n\n  for (i = 0; i < to->len && i < add->len; ) {\n    if (to->s[i] != add->s[i]) break;\n    len = enclen(env->enc, to->s + i);\n\n    for (j = 1; j < len; j++) {\n      if (to->s[i+j] != add->s[i+j]) break;\n    }\n    if (j < len) break;\n    i += len;\n  }\n\n  if (! add->reach_end || i < add->len || i < to->len) {\n    to->reach_end = 0;\n  }\n  to->len = i;\n  if (to->ignore_case < 0)\n    to->ignore_case = add->ignore_case;\n  else if (add->ignore_case >= 0)\n    to->ignore_case |= add->ignore_case;\n\n  alt_merge_opt_anc_info(&to->anc, &add->anc);\n  if (! to->reach_end) to->anc.right_anchor = 0;\n}\n\nstatic void\nselect_opt_exact_info(OnigEncoding enc, OptExactInfo* now, OptExactInfo* alt)\n{\n  int v1, v2;\n\n  v1 = now->len;\n  v2 = alt->len;\n\n  if (v2 == 0) {\n    return ;\n  }\n  else if (v1 == 0) {\n    copy_opt_exact_info(now, alt);\n    return ;\n  }\n  else if (v1 <= 2 && v2 <= 2) {\n    /* ByteValTable[x] is big value --> low price */\n    v2 = map_position_value(enc, now->s[0]);\n    v1 = map_position_value(enc, alt->s[0]);\n\n    if (now->len > 1) v1 += 5;\n    if (alt->len > 1) v2 += 5;\n  }\n\n  if (now->ignore_case <= 0) v1 *= 2;\n  if (alt->ignore_case <= 0) v2 *= 2;\n\n  if (comp_distance_value(&now->mmd, &alt->mmd, v1, v2) > 0)\n    copy_opt_exact_info(now, alt);\n}\n\nstatic void\nclear_opt_map_info(OptMapInfo* map)\n{\n  static const OptMapInfo clean_info = {\n    {0, 0}, {0, 0}, 0,\n    {\n      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n      0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n    }\n  };\n\n  xmemcpy(map, &clean_info, sizeof(OptMapInfo));\n}\n\nstatic void\ncopy_opt_map_info(OptMapInfo* to, OptMapInfo* from)\n{\n  *to = *from;\n}\n\nstatic void\nadd_char_opt_map_info(OptMapInfo* map, UChar c, OnigEncoding enc)\n{\n  if (map->map[c] == 0) {\n    map->map[c] = 1;\n    map->value += map_position_value(enc, c);\n  }\n}\n\nstatic int\nadd_char_amb_opt_map_info(OptMapInfo* map, UChar* p, UChar* end,\n                          OnigEncoding enc, OnigCaseFoldType case_fold_flag)\n{\n  OnigCaseFoldCodeItem items[ONIGENC_GET_CASE_FOLD_CODES_MAX_NUM];\n  UChar buf[ONIGENC_CODE_TO_MBC_MAXLEN];\n  int i, n;\n\n  add_char_opt_map_info(map, p[0], enc);\n\n  case_fold_flag = DISABLE_CASE_FOLD_MULTI_CHAR(case_fold_flag);\n  n = ONIGENC_GET_CASE_FOLD_CODES_BY_STR(enc, case_fold_flag, p, end, items);\n  if (n < 0) return n;\n\n  for (i = 0; i < n; i++) {\n    ONIGENC_CODE_TO_MBC(enc, items[i].code[0], buf);\n    add_char_opt_map_info(map, buf[0], enc);\n  }\n\n  return 0;\n}\n\nstatic void\nselect_opt_map_info(OptMapInfo* now, OptMapInfo* alt)\n{\n  const int z = 1<<15; /* 32768: something big value */\n\n  int v1, v2;\n\n  if (alt->value == 0) return ;\n  if (now->value == 0) {\n    copy_opt_map_info(now, alt);\n    return ;\n  }\n\n  v1 = z / now->value;\n  v2 = z / alt->value;\n  if (comp_distance_value(&now->mmd, &alt->mmd, v1, v2) > 0)\n    copy_opt_map_info(now, alt);\n}\n\nstatic int\ncomp_opt_exact_or_map_info(OptExactInfo* e, OptMapInfo* m)\n{\n#define COMP_EM_BASE  20\n  int ve, vm;\n\n  if (m->value <= 0) return -1;\n\n  ve = COMP_EM_BASE * e->len * (e->ignore_case > 0 ? 1 : 2);\n  vm = COMP_EM_BASE * 5 * 2 / m->value;\n  return comp_distance_value(&e->mmd, &m->mmd, ve, vm);\n}\n\nstatic void\nalt_merge_opt_map_info(OnigEncoding enc, OptMapInfo* to, OptMapInfo* add)\n{\n  int i, val;\n\n  /* if (! is_equal_mml(&to->mmd, &add->mmd)) return ; */\n  if (to->value == 0) return ;\n  if (add->value == 0 || to->mmd.max < add->mmd.min) {\n    clear_opt_map_info(to);\n    return ;\n  }\n\n  alt_merge_mml(&to->mmd, &add->mmd);\n\n  val = 0;\n  for (i = 0; i < ONIG_CHAR_TABLE_SIZE; i++) {\n    if (add->map[i])\n      to->map[i] = 1;\n\n    if (to->map[i])\n      val += map_position_value(enc, i);\n  }\n  to->value = val;\n\n  alt_merge_opt_anc_info(&to->anc, &add->anc);\n}\n\nstatic void\nset_bound_node_opt_info(NodeOptInfo* opt, MinMaxLen* mmd)\n{\n  copy_mml(&(opt->exb.mmd),  mmd);\n  copy_mml(&(opt->expr.mmd), mmd);\n  copy_mml(&(opt->map.mmd),  mmd);\n}\n\nstatic void\nclear_node_opt_info(NodeOptInfo* opt)\n{\n  clear_mml(&opt->len);\n  clear_opt_anc_info(&opt->anc);\n  clear_opt_exact_info(&opt->exb);\n  clear_opt_exact_info(&opt->exm);\n  clear_opt_exact_info(&opt->expr);\n  clear_opt_map_info(&opt->map);\n}\n\nstatic void\ncopy_node_opt_info(NodeOptInfo* to, NodeOptInfo* from)\n{\n  *to = *from;\n}\n\nstatic void\nconcat_left_node_opt_info(OnigEncoding enc, NodeOptInfo* to, NodeOptInfo* add)\n{\n  int exb_reach, exm_reach;\n  OptAncInfo tanc;\n\n  concat_opt_anc_info(&tanc, &to->anc, &add->anc, to->len.max, add->len.max);\n  copy_opt_anc_info(&to->anc, &tanc);\n\n  if (add->exb.len > 0 && to->len.max == 0) {\n    concat_opt_anc_info(&tanc, &to->anc, &add->exb.anc,\n\t\t\tto->len.max, add->len.max);\n    copy_opt_anc_info(&add->exb.anc, &tanc);\n  }\n\n  if (add->map.value > 0 && to->len.max == 0) {\n    if (add->map.mmd.max == 0)\n      add->map.anc.left_anchor |= to->anc.left_anchor;\n  }\n\n  exb_reach = to->exb.reach_end;\n  exm_reach = to->exm.reach_end;\n\n  if (add->len.max != 0)\n    to->exb.reach_end = to->exm.reach_end = 0;\n\n  if (add->exb.len > 0) {\n    if (exb_reach) {\n      concat_opt_exact_info(&to->exb, &add->exb, enc);\n      clear_opt_exact_info(&add->exb);\n    }\n    else if (exm_reach) {\n      concat_opt_exact_info(&to->exm, &add->exb, enc);\n      clear_opt_exact_info(&add->exb);\n    }\n  }\n  select_opt_exact_info(enc, &to->exm, &add->exb);\n  select_opt_exact_info(enc, &to->exm, &add->exm);\n\n  if (to->expr.len > 0) {\n    if (add->len.max > 0) {\n      if (to->expr.len > (int )add->len.max)\n\tto->expr.len = (int )add->len.max;\n\n      if (to->expr.mmd.max == 0)\n\tselect_opt_exact_info(enc, &to->exb, &to->expr);\n      else\n\tselect_opt_exact_info(enc, &to->exm, &to->expr);\n    }\n  }\n  else if (add->expr.len > 0) {\n    copy_opt_exact_info(&to->expr, &add->expr);\n  }\n\n  select_opt_map_info(&to->map, &add->map);\n\n  add_mml(&to->len, &add->len);\n}\n\nstatic void\nalt_merge_node_opt_info(NodeOptInfo* to, NodeOptInfo* add, OptEnv* env)\n{\n  alt_merge_opt_anc_info  (&to->anc,  &add->anc);\n  alt_merge_opt_exact_info(&to->exb,  &add->exb, env);\n  alt_merge_opt_exact_info(&to->exm,  &add->exm, env);\n  alt_merge_opt_exact_info(&to->expr, &add->expr, env);\n  alt_merge_opt_map_info(env->enc, &to->map,  &add->map);\n\n  alt_merge_mml(&to->len, &add->len);\n}\n\n\n#define MAX_NODE_OPT_INFO_REF_COUNT    5\n\nstatic int\noptimize_node_left(Node* node, NodeOptInfo* opt, OptEnv* env)\n{\n  int type;\n  int r = 0;\n\n  clear_node_opt_info(opt);\n  set_bound_node_opt_info(opt, &env->mmd);\n\n  type = NTYPE(node);\n  switch (type) {\n  case NT_LIST:\n    {\n      OptEnv nenv;\n      NodeOptInfo nopt;\n      Node* nd = node;\n\n      copy_opt_env(&nenv, env);\n      do {\n\tr = optimize_node_left(NCAR(nd), &nopt, &nenv);\n\tif (r == 0) {\n\t  add_mml(&nenv.mmd, &nopt.len);\n\t  concat_left_node_opt_info(env->enc, opt, &nopt);\n\t}\n      } while (r == 0 && IS_NOT_NULL(nd = NCDR(nd)));\n    }\n    break;\n\n  case NT_ALT:\n    {\n      NodeOptInfo nopt;\n      Node* nd = node;\n\n      do {\n\tr = optimize_node_left(NCAR(nd), &nopt, env);\n\tif (r == 0) {\n\t  if (nd == node) copy_node_opt_info(opt, &nopt);\n\t  else            alt_merge_node_opt_info(opt, &nopt, env);\n\t}\n      } while ((r == 0) && IS_NOT_NULL(nd = NCDR(nd)));\n    }\n    break;\n\n  case NT_STR:\n    {\n      StrNode* sn = NSTR(node);\n      OnigDistance slen = sn->end - sn->s;\n      int is_raw = NSTRING_IS_RAW(node);\n\n      if (! NSTRING_IS_AMBIG(node)) {\n\tconcat_opt_exact_info_str(&opt->exb, sn->s, sn->end,\n\t\t\t\t  is_raw, env->enc);\n\topt->exb.ignore_case = 0;\n\tif (slen > 0) {\n\t  add_char_opt_map_info(&opt->map, *(sn->s), env->enc);\n\t}\n        set_mml(&opt->len, slen, slen);\n      }\n      else {\n        OnigDistance max;\n\n\tif (NSTRING_IS_DONT_GET_OPT_INFO(node)) {\n          int n = onigenc_strlen(env->enc, sn->s, sn->end);\n          max = ONIGENC_MBC_MAXLEN_DIST(env->enc) * n;\n\t}\n\telse {\n\t  concat_opt_exact_info_str(&opt->exb, sn->s, sn->end,\n\t\t\t\t    is_raw, env->enc);\n\t  opt->exb.ignore_case = 1;\n\n\t  if (slen > 0) {\n\t    r = add_char_amb_opt_map_info(&opt->map, sn->s, sn->end,\n\t\t\t\t\t  env->enc, env->case_fold_flag);\n\t    if (r != 0) break;\n\t  }\n\n\t  max = slen;\n\t}\n\n        set_mml(&opt->len, slen, max);\n      }\n\n      if ((OnigDistance )opt->exb.len == slen)\n\topt->exb.reach_end = 1;\n    }\n    break;\n\n  case NT_CCLASS:\n    {\n      int i, z;\n      CClassNode* cc = NCCLASS(node);\n\n      /* no need to check ignore case. (set in setup_tree()) */\n\n      if (IS_NOT_NULL(cc->mbuf) || IS_NCCLASS_NOT(cc)) {\n        OnigDistance min = ONIGENC_MBC_MINLEN(env->enc);\n\tOnigDistance max = ONIGENC_MBC_MAXLEN_DIST(env->enc);\n\n\tset_mml(&opt->len, min, max);\n      }\n      else {\n        for (i = 0; i < SINGLE_BYTE_SIZE; i++) {\n          z = BITSET_AT(cc->bs, i);\n          if ((z && !IS_NCCLASS_NOT(cc)) || (!z && IS_NCCLASS_NOT(cc))) {\n            add_char_opt_map_info(&opt->map, (UChar )i, env->enc);\n          }\n        }\n\tset_mml(&opt->len, 1, 1);\n      }\n    }\n    break;\n\n  case NT_CTYPE:\n    {\n      int i, min, max;\n      int maxcode;\n\n      max = ONIGENC_MBC_MAXLEN_DIST(env->enc);\n\n      if (max == 1) {\n        min = 1;\n\n\tmaxcode = NCTYPE(node)->ascii_range ? 0x80 : SINGLE_BYTE_SIZE;\n\tswitch (NCTYPE(node)->ctype) {\n\tcase ONIGENC_CTYPE_WORD:\n\t  if (NCTYPE(node)->not != 0) {\n\t    for (i = 0; i < SINGLE_BYTE_SIZE; i++) {\n\t      if (! ONIGENC_IS_CODE_WORD(env->enc, i) || i >= maxcode) {\n\t\tadd_char_opt_map_info(&opt->map, (UChar )i, env->enc);\n\t      }\n\t    }\n\t  }\n\t  else {\n\t    for (i = 0; i < maxcode; i++) {\n\t      if (ONIGENC_IS_CODE_WORD(env->enc, i)) {\n\t\tadd_char_opt_map_info(&opt->map, (UChar )i, env->enc);\n\t      }\n\t    }\n\t  }\n\t  break;\n\t}\n      }\n      else {\n        min = ONIGENC_MBC_MINLEN(env->enc);\n      }\n      set_mml(&opt->len, min, max);\n    }\n    break;\n\n  case NT_CANY:\n    {\n      OnigDistance min = ONIGENC_MBC_MINLEN(env->enc);\n      OnigDistance max = ONIGENC_MBC_MAXLEN_DIST(env->enc);\n      set_mml(&opt->len, min, max);\n    }\n    break;\n\n  case NT_ANCHOR:\n    switch (NANCHOR(node)->type) {\n    case ANCHOR_BEGIN_BUF:\n    case ANCHOR_BEGIN_POSITION:\n    case ANCHOR_BEGIN_LINE:\n    case ANCHOR_END_BUF:\n    case ANCHOR_SEMI_END_BUF:\n    case ANCHOR_END_LINE:\n    case ANCHOR_LOOK_BEHIND: /* just for (?<=x).* */\n      add_opt_anc_info(&opt->anc, NANCHOR(node)->type);\n      break;\n\n    case ANCHOR_PREC_READ:\n      {\n\tNodeOptInfo nopt;\n\n\tr = optimize_node_left(NANCHOR(node)->target, &nopt, env);\n\tif (r == 0) {\n\t  if (nopt.exb.len > 0)\n\t    copy_opt_exact_info(&opt->expr, &nopt.exb);\n\t  else if (nopt.exm.len > 0)\n\t    copy_opt_exact_info(&opt->expr, &nopt.exm);\n\n\t  opt->expr.reach_end = 0;\n\n\t  if (nopt.map.value > 0)\n\t    copy_opt_map_info(&opt->map, &nopt.map);\n\t}\n      }\n      break;\n\n    case ANCHOR_PREC_READ_NOT:\n    case ANCHOR_LOOK_BEHIND_NOT:\n      break;\n    }\n    break;\n\n  case NT_BREF:\n    {\n      int i;\n      int* backs;\n      OnigDistance min, max, tmin, tmax;\n      Node** nodes = SCANENV_MEM_NODES(env->scan_env);\n      BRefNode* br = NBREF(node);\n\n      if (br->state & NST_RECURSION) {\n\tset_mml(&opt->len, 0, ONIG_INFINITE_DISTANCE);\n\tbreak;\n      }\n      backs = BACKREFS_P(br);\n      r = get_min_match_length(nodes[backs[0]], &min, env->scan_env);\n      if (r != 0) break;\n      r = get_max_match_length(nodes[backs[0]], &max, env->scan_env);\n      if (r != 0) break;\n      for (i = 1; i < br->back_num; i++) {\n\tr = get_min_match_length(nodes[backs[i]], &tmin, env->scan_env);\n\tif (r != 0) break;\n\tr = get_max_match_length(nodes[backs[i]], &tmax, env->scan_env);\n\tif (r != 0) break;\n\tif (min > tmin) min = tmin;\n\tif (max < tmax) max = tmax;\n      }\n      if (r == 0) set_mml(&opt->len, min, max);\n    }\n    break;\n\n#ifdef USE_SUBEXP_CALL\n  case NT_CALL:\n    if (IS_CALL_RECURSION(NCALL(node)))\n      set_mml(&opt->len, 0, ONIG_INFINITE_DISTANCE);\n    else {\n      OnigOptionType save = env->options;\n      env->options = NENCLOSE(NCALL(node)->target)->option;\n      r = optimize_node_left(NCALL(node)->target, opt, env);\n      env->options = save;\n    }\n    break;\n#endif\n\n  case NT_QTFR:\n    {\n      int i;\n      OnigDistance min, max;\n      NodeOptInfo nopt;\n      QtfrNode* qn = NQTFR(node);\n\n      r = optimize_node_left(qn->target, &nopt, env);\n      if (r) break;\n\n      if (/*qn->lower == 0 &&*/ IS_REPEAT_INFINITE(qn->upper)) {\n\tif (env->mmd.max == 0 &&\n\t    NTYPE(qn->target) == NT_CANY && qn->greedy) {\n\t  if (IS_MULTILINE(env->options))\n\t    /* implicit anchor: /.*a/ ==> /\\A.*a/ */\n\t    add_opt_anc_info(&opt->anc, ANCHOR_ANYCHAR_STAR_ML);\n\t  else\n\t    add_opt_anc_info(&opt->anc, ANCHOR_ANYCHAR_STAR);\n\t}\n      }\n      else {\n\tif (qn->lower > 0) {\n\t  copy_node_opt_info(opt, &nopt);\n\t  if (nopt.exb.len > 0) {\n\t    if (nopt.exb.reach_end) {\n\t      for (i = 2; i <= qn->lower &&\n\t\t          ! is_full_opt_exact_info(&opt->exb); i++) {\n\t\tconcat_opt_exact_info(&opt->exb, &nopt.exb, env->enc);\n\t      }\n\t      if (i < qn->lower) {\n\t\topt->exb.reach_end = 0;\n\t      }\n\t    }\n\t  }\n\n\t  if (qn->lower != qn->upper) {\n\t    opt->exb.reach_end = 0;\n\t    opt->exm.reach_end = 0;\n\t  }\n\t  if (qn->lower > 1)\n\t    opt->exm.reach_end = 0;\n\t}\n      }\n\n      min = distance_multiply(nopt.len.min, qn->lower);\n      if (IS_REPEAT_INFINITE(qn->upper))\n\tmax = (nopt.len.max > 0 ? ONIG_INFINITE_DISTANCE : 0);\n      else\n\tmax = distance_multiply(nopt.len.max, qn->upper);\n\n      set_mml(&opt->len, min, max);\n    }\n    break;\n\n  case NT_ENCLOSE:\n    {\n      EncloseNode* en = NENCLOSE(node);\n\n      switch (en->type) {\n      case ENCLOSE_OPTION:\n\t{\n\t  OnigOptionType save = env->options;\n\n\t  env->options = en->option;\n\t  r = optimize_node_left(en->target, opt, env);\n\t  env->options = save;\n\t}\n\tbreak;\n\n      case ENCLOSE_MEMORY:\n#ifdef USE_SUBEXP_CALL\n\ten->opt_count++;\n\tif (en->opt_count > MAX_NODE_OPT_INFO_REF_COUNT) {\n\t  OnigDistance min, max;\n\n\t  min = 0;\n\t  max = ONIG_INFINITE_DISTANCE;\n\t  if (IS_ENCLOSE_MIN_FIXED(en)) min = en->min_len;\n\t  if (IS_ENCLOSE_MAX_FIXED(en)) max = en->max_len;\n\t  set_mml(&opt->len, min, max);\n\t}\n\telse\n#endif\n\t{\n\t  r = optimize_node_left(en->target, opt, env);\n\n\t  if (is_set_opt_anc_info(&opt->anc, ANCHOR_ANYCHAR_STAR_MASK)) {\n\t    if (BIT_STATUS_AT(env->scan_env->backrefed_mem, en->regnum))\n\t      remove_opt_anc_info(&opt->anc, ANCHOR_ANYCHAR_STAR_MASK);\n\t  }\n\t}\n\tbreak;\n\n      case ENCLOSE_STOP_BACKTRACK:\n      case ENCLOSE_CONDITION:\n\tr = optimize_node_left(en->target, opt, env);\n\tbreak;\n      }\n    }\n    break;\n\n  default:\n#ifdef ONIG_DEBUG\n    fprintf(stderr, \"optimize_node_left: undefined node type %d\\n\",\n\t    NTYPE(node));\n#endif\n    r = ONIGERR_TYPE_BUG;\n    break;\n  }\n\n  return r;\n}\n\nstatic int\nset_optimize_exact_info(regex_t* reg, OptExactInfo* e)\n{\n  int r;\n  int allow_reverse;\n\n  if (e->len == 0) return 0;\n\n  reg->exact = (UChar* )xmalloc(e->len);\n  CHECK_NULL_RETURN_MEMERR(reg->exact);\n  xmemcpy(reg->exact, e->s, e->len);\n  reg->exact_end = reg->exact + e->len;\n\n  allow_reverse =\n\tONIGENC_IS_ALLOWED_REVERSE_MATCH(reg->enc, reg->exact, reg->exact_end);\n\n  if (e->ignore_case > 0) {\n    if (e->len >= 3 || (e->len >= 2 && allow_reverse)) {\n      r = set_bm_skip(reg->exact, reg->exact_end, reg,\n\t\t      reg->map, &(reg->int_map), 1);\n      if (r == 0) {\n\treg->optimize = (allow_reverse != 0\n\t\t\t ? ONIG_OPTIMIZE_EXACT_BM_IC : ONIG_OPTIMIZE_EXACT_BM_NOT_REV_IC);\n      }\n      else {\n\treg->optimize = ONIG_OPTIMIZE_EXACT_IC;\n      }\n    }\n    else {\n      reg->optimize = ONIG_OPTIMIZE_EXACT_IC;\n    }\n  }\n  else {\n    if (e->len >= 3 || (e->len >= 2 && allow_reverse)) {\n      r = set_bm_skip(reg->exact, reg->exact_end, reg,\n\t              reg->map, &(reg->int_map), 0);\n      if (r) return r;\n\n      reg->optimize = (allow_reverse != 0\n\t\t       ? ONIG_OPTIMIZE_EXACT_BM : ONIG_OPTIMIZE_EXACT_BM_NOT_REV);\n    }\n    else {\n      reg->optimize = ONIG_OPTIMIZE_EXACT;\n    }\n  }\n\n  reg->dmin = e->mmd.min;\n  reg->dmax = e->mmd.max;\n\n  if (reg->dmin != ONIG_INFINITE_DISTANCE) {\n    reg->threshold_len = (int )(reg->dmin + (reg->exact_end - reg->exact));\n  }\n\n  return 0;\n}\n\nstatic void\nset_optimize_map_info(regex_t* reg, OptMapInfo* m)\n{\n  int i;\n\n  for (i = 0; i < ONIG_CHAR_TABLE_SIZE; i++)\n    reg->map[i] = m->map[i];\n\n  reg->optimize   = ONIG_OPTIMIZE_MAP;\n  reg->dmin       = m->mmd.min;\n  reg->dmax       = m->mmd.max;\n\n  if (reg->dmin != ONIG_INFINITE_DISTANCE) {\n    reg->threshold_len = (int )(reg->dmin + 1);\n  }\n}\n\nstatic void\nset_sub_anchor(regex_t* reg, OptAncInfo* anc)\n{\n  reg->sub_anchor |= anc->left_anchor  & ANCHOR_BEGIN_LINE;\n  reg->sub_anchor |= anc->right_anchor & ANCHOR_END_LINE;\n}\n\n#ifdef ONIG_DEBUG\nstatic void print_optimize_info(FILE* f, regex_t* reg);\n#endif\n\nstatic int\nset_optimize_info_from_tree(Node* node, regex_t* reg, ScanEnv* scan_env)\n{\n\n  int r;\n  NodeOptInfo opt;\n  OptEnv env;\n\n  env.enc            = reg->enc;\n  env.options        = reg->options;\n  env.case_fold_flag = reg->case_fold_flag;\n  env.scan_env   = scan_env;\n  clear_mml(&env.mmd);\n\n  r = optimize_node_left(node, &opt, &env);\n  if (r) return r;\n\n  reg->anchor = opt.anc.left_anchor & (ANCHOR_BEGIN_BUF |\n        ANCHOR_BEGIN_POSITION | ANCHOR_ANYCHAR_STAR | ANCHOR_ANYCHAR_STAR_ML |\n        ANCHOR_LOOK_BEHIND);\n\n  reg->anchor |= opt.anc.right_anchor & (ANCHOR_END_BUF | ANCHOR_SEMI_END_BUF);\n\n  if (reg->anchor & (ANCHOR_END_BUF | ANCHOR_SEMI_END_BUF)) {\n    reg->anchor_dmin = opt.len.min;\n    reg->anchor_dmax = opt.len.max;\n  }\n\n  if (opt.exb.len > 0 || opt.exm.len > 0) {\n    select_opt_exact_info(reg->enc, &opt.exb, &opt.exm);\n    if (opt.map.value > 0 &&\n\tcomp_opt_exact_or_map_info(&opt.exb, &opt.map) > 0) {\n      goto set_map;\n    }\n    else {\n      r = set_optimize_exact_info(reg, &opt.exb);\n      set_sub_anchor(reg, &opt.exb.anc);\n    }\n  }\n  else if (opt.map.value > 0) {\n  set_map:\n    set_optimize_map_info(reg, &opt.map);\n    set_sub_anchor(reg, &opt.map.anc);\n  }\n  else {\n    reg->sub_anchor |= opt.anc.left_anchor & ANCHOR_BEGIN_LINE;\n    if (opt.len.max == 0)\n      reg->sub_anchor |= opt.anc.right_anchor & ANCHOR_END_LINE;\n  }\n\n#if defined(ONIG_DEBUG_COMPILE) || defined(ONIG_DEBUG_MATCH)\n  print_optimize_info(stderr, reg);\n#endif\n  return r;\n}\n\nstatic void\nclear_optimize_info(regex_t* reg)\n{\n  reg->optimize      = ONIG_OPTIMIZE_NONE;\n  reg->anchor        = 0;\n  reg->anchor_dmin   = 0;\n  reg->anchor_dmax   = 0;\n  reg->sub_anchor    = 0;\n  reg->exact_end     = (UChar* )NULL;\n  reg->threshold_len = 0;\n  if (IS_NOT_NULL(reg->exact)) {\n    xfree(reg->exact);\n    reg->exact = (UChar* )NULL;\n  }\n}\n\n#ifdef ONIG_DEBUG\n\nstatic void print_enc_string(FILE* fp, OnigEncoding enc,\n\t\t\t     const UChar *s, const UChar *end)\n{\n  fprintf(fp, \"\\nPATTERN: /\");\n\n  if (ONIGENC_MBC_MINLEN(enc) > 1) {\n    const UChar *p;\n    OnigCodePoint code;\n\n    p = s;\n    while (p < end) {\n      code = ONIGENC_MBC_TO_CODE(enc, p, end);\n      if (code >= 0x80) {\n\tfprintf(fp, \" 0x%04x \", (int )code);\n      }\n      else {\n\tfputc((int )code, fp);\n      }\n\n      p += enclen(enc, p);\n    }\n  }\n  else {\n    while (s < end) {\n      fputc((int )*s, fp);\n      s++;\n    }\n  }\n\n  fprintf(fp, \"/\\n\");\n}\n\nstatic void\nprint_distance_range(FILE* f, OnigDistance a, OnigDistance b)\n{\n  if (a == ONIG_INFINITE_DISTANCE)\n    fputs(\"inf\", f);\n  else\n    fprintf(f, \"(%u)\", a);\n\n  fputs(\"-\", f);\n\n  if (b == ONIG_INFINITE_DISTANCE)\n    fputs(\"inf\", f);\n  else\n    fprintf(f, \"(%u)\", b);\n}\n\nstatic void\nprint_anchor(FILE* f, int anchor)\n{\n  int q = 0;\n\n  fprintf(f, \"[\");\n\n  if (anchor & ANCHOR_BEGIN_BUF) {\n    fprintf(f, \"begin-buf\");\n    q = 1;\n  }\n  if (anchor & ANCHOR_BEGIN_LINE) {\n    if (q) fprintf(f, \", \");\n    q = 1;\n    fprintf(f, \"begin-line\");\n  }\n  if (anchor & ANCHOR_BEGIN_POSITION) {\n    if (q) fprintf(f, \", \");\n    q = 1;\n    fprintf(f, \"begin-pos\");\n  }\n  if (anchor & ANCHOR_END_BUF) {\n    if (q) fprintf(f, \", \");\n    q = 1;\n    fprintf(f, \"end-buf\");\n  }\n  if (anchor & ANCHOR_SEMI_END_BUF) {\n    if (q) fprintf(f, \", \");\n    q = 1;\n    fprintf(f, \"semi-end-buf\");\n  }\n  if (anchor & ANCHOR_END_LINE) {\n    if (q) fprintf(f, \", \");\n    q = 1;\n    fprintf(f, \"end-line\");\n  }\n  if (anchor & ANCHOR_ANYCHAR_STAR) {\n    if (q) fprintf(f, \", \");\n    q = 1;\n    fprintf(f, \"anychar-star\");\n  }\n  if (anchor & ANCHOR_ANYCHAR_STAR_ML) {\n    if (q) fprintf(f, \", \");\n    fprintf(f, \"anychar-star-ml\");\n  }\n\n  fprintf(f, \"]\");\n}\n\nstatic void\nprint_optimize_info(FILE* f, regex_t* reg)\n{\n  static const char* on[] = { \"NONE\", \"EXACT\", \"EXACT_BM\", \"EXACT_BM_NOT_REV\",\n                              \"EXACT_IC\", \"MAP\",\n                              \"EXACT_BM_IC\", \"EXACT_BM_NOT_REV_IC\" };\n\n  fprintf(f, \"optimize: %s\\n\", on[reg->optimize]);\n  fprintf(f, \"  anchor: \"); print_anchor(f, reg->anchor);\n  if ((reg->anchor & ANCHOR_END_BUF_MASK) != 0)\n    print_distance_range(f, reg->anchor_dmin, reg->anchor_dmax);\n  fprintf(f, \"\\n\");\n\n  if (reg->optimize) {\n    fprintf(f, \"  sub anchor: \"); print_anchor(f, reg->sub_anchor);\n    fprintf(f, \"\\n\");\n  }\n  fprintf(f, \"\\n\");\n\n  if (reg->exact) {\n    UChar *p;\n    fprintf(f, \"exact: [\");\n    for (p = reg->exact; p < reg->exact_end; p++) {\n      fputc(*p, f);\n    }\n    fprintf(f, \"]: length: %d\\n\", (reg->exact_end - reg->exact));\n  }\n  else if (reg->optimize & ONIG_OPTIMIZE_MAP) {\n    int c, i, n = 0;\n\n    for (i = 0; i < ONIG_CHAR_TABLE_SIZE; i++)\n      if (reg->map[i]) n++;\n\n    fprintf(f, \"map: n=%d\\n\", n);\n    if (n > 0) {\n      c = 0;\n      fputc('[', f);\n      for (i = 0; i < ONIG_CHAR_TABLE_SIZE; i++) {\n\tif (reg->map[i] != 0) {\n          if (c > 0)  fputs(\", \", f);\n          c++;\n          if (ONIGENC_MBC_MAXLEN(reg->enc) == 1 &&\n              ONIGENC_IS_CODE_PRINT(reg->enc, (OnigCodePoint )i))\n            fputc(i, f);\n          else\n            fprintf(f, \"%d\", i);\n        }\n      }\n      fprintf(f, \"]\\n\");\n    }\n  }\n}\n#endif /* ONIG_DEBUG */\n\n\nextern void\nonig_free_body(regex_t* reg)\n{\n  if (IS_NOT_NULL(reg)) {\n    if (IS_NOT_NULL(reg->p))                xfree(reg->p);\n    if (IS_NOT_NULL(reg->exact))            xfree(reg->exact);\n    if (IS_NOT_NULL(reg->int_map))          xfree(reg->int_map);\n    if (IS_NOT_NULL(reg->int_map_backward)) xfree(reg->int_map_backward);\n    if (IS_NOT_NULL(reg->repeat_range))     xfree(reg->repeat_range);\n    if (IS_NOT_NULL(reg->chain))            onig_free(reg->chain);\n\n#ifdef USE_NAMED_GROUP\n    onig_names_free(reg);\n#endif\n  }\n}\n\nextern void\nonig_free(regex_t* reg)\n{\n  if (IS_NOT_NULL(reg)) {\n    onig_free_body(reg);\n    xfree(reg);\n  }\n}\n\nsize_t\nonig_memsize(const regex_t *reg)\n{\n    size_t size = sizeof(regex_t);\n    if (IS_NULL(reg)) return 0;\n    if (IS_NOT_NULL(reg->p))                size += reg->alloc;\n    if (IS_NOT_NULL(reg->exact))            size += reg->exact_end - reg->exact;\n    if (IS_NOT_NULL(reg->int_map))          size += sizeof(int) * ONIG_CHAR_TABLE_SIZE;\n    if (IS_NOT_NULL(reg->int_map_backward)) size += sizeof(int) * ONIG_CHAR_TABLE_SIZE;\n    if (IS_NOT_NULL(reg->repeat_range))     size += reg->repeat_range_alloc * sizeof(OnigRepeatRange);\n    if (IS_NOT_NULL(reg->chain))            size += onig_memsize(reg->chain);\n\n    return size;\n}\n\nsize_t\nonig_region_memsize(const OnigRegion *regs)\n{\n    size_t size = sizeof(*regs);\n    if (IS_NULL(regs)) return 0;\n    size += regs->allocated * (sizeof(*regs->beg) + sizeof(*regs->end));\n    return size;\n}\n\n#define REGEX_TRANSFER(to,from) do {\\\n  (to)->state = ONIG_STATE_MODIFY;\\\n  onig_free_body(to);\\\n  xmemcpy(to, from, sizeof(regex_t));\\\n  xfree(from);\\\n} while (0)\n\nextern void\nonig_transfer(regex_t* to, regex_t* from)\n{\n  THREAD_ATOMIC_START;\n  REGEX_TRANSFER(to, from);\n  THREAD_ATOMIC_END;\n}\n\n#define REGEX_CHAIN_HEAD(reg) do {\\\n  while (IS_NOT_NULL((reg)->chain)) {\\\n    (reg) = (reg)->chain;\\\n  }\\\n} while (0)\n\nextern void\nonig_chain_link_add(regex_t* to, regex_t* add)\n{\n  THREAD_ATOMIC_START;\n  REGEX_CHAIN_HEAD(to);\n  to->chain = add;\n  THREAD_ATOMIC_END;\n}\n\nextern void\nonig_chain_reduce(regex_t* reg)\n{\n  regex_t *head, *prev;\n\n  prev = reg;\n  head = prev->chain;\n  if (IS_NOT_NULL(head)) {\n    reg->state = ONIG_STATE_MODIFY;\n    while (IS_NOT_NULL(head->chain)) {\n      prev = head;\n      head = head->chain;\n    }\n    prev->chain = (regex_t* )NULL;\n    REGEX_TRANSFER(reg, head);\n  }\n}\n\n#ifdef ONIG_DEBUG\nstatic void print_compiled_byte_code_list P_((FILE* f, regex_t* reg));\n#endif\n#ifdef ONIG_DEBUG_PARSE_TREE\nstatic void print_tree P_((FILE* f, Node* node));\n#endif\n\nextern int\nonig_compile(regex_t* reg, const UChar* pattern, const UChar* pattern_end,\n\t      OnigErrorInfo* einfo)\n{\n#define COMPILE_INIT_SIZE  20\n\n  int r;\n  OnigDistance init_size;\n  Node*  root;\n  ScanEnv  scan_env = {0};\n#ifdef USE_SUBEXP_CALL\n  UnsetAddrList  uslist;\n#endif\n\n  if (IS_NOT_NULL(einfo)) einfo->par = (UChar* )NULL;\n\n  reg->state = ONIG_STATE_COMPILING;\n\n#ifdef ONIG_DEBUG\n  print_enc_string(stderr, reg->enc, pattern, pattern_end);\n#endif\n\n  if (reg->alloc == 0) {\n    init_size = (pattern_end - pattern) * 2;\n    if (init_size <= 0) init_size = COMPILE_INIT_SIZE;\n    r = BBUF_INIT(reg, init_size);\n    if (r != 0) goto end;\n  }\n  else\n    reg->used = 0;\n\n  reg->num_mem            = 0;\n  reg->num_repeat         = 0;\n  reg->num_null_check     = 0;\n  reg->repeat_range_alloc = 0;\n  reg->repeat_range       = (OnigRepeatRange* )NULL;\n#ifdef USE_COMBINATION_EXPLOSION_CHECK\n  reg->num_comb_exp_check = 0;\n#endif\n\n  r = onig_parse_make_tree(&root, pattern, pattern_end, reg, &scan_env);\n  if (r != 0) goto err;\n\n#ifdef USE_NAMED_GROUP\n  /* mixed use named group and no-named group */\n  if (scan_env.num_named > 0 &&\n      IS_SYNTAX_BV(scan_env.syntax, ONIG_SYN_CAPTURE_ONLY_NAMED_GROUP) &&\n      !ONIG_IS_OPTION_ON(reg->options, ONIG_OPTION_CAPTURE_GROUP)) {\n    if (scan_env.num_named != scan_env.num_mem)\n      r = disable_noname_group_capture(&root, reg, &scan_env);\n    else\n      r = numbered_ref_check(root);\n\n    if (r != 0) goto err;\n  }\n#endif\n\n#ifdef USE_SUBEXP_CALL\n  if (scan_env.num_call > 0) {\n    r = unset_addr_list_init(&uslist, scan_env.num_call);\n    if (r != 0) goto err;\n    scan_env.unset_addr_list = &uslist;\n    r = setup_subexp_call(root, &scan_env);\n    if (r != 0) goto err_unset;\n    r = subexp_recursive_check_trav(root, &scan_env);\n    if (r  < 0) goto err_unset;\n    r = subexp_inf_recursive_check_trav(root, &scan_env);\n    if (r != 0) goto err_unset;\n\n    reg->num_call = scan_env.num_call;\n  }\n  else\n    reg->num_call = 0;\n#endif\n\n  r = setup_tree(root, reg, IN_ROOT, &scan_env);\n  if (r != 0) goto err_unset;\n\n#ifdef ONIG_DEBUG_PARSE_TREE\n  print_tree(stderr, root);\n#endif\n\n  reg->capture_history  = scan_env.capture_history;\n  reg->bt_mem_start     = scan_env.bt_mem_start;\n  reg->bt_mem_start    |= reg->capture_history;\n  if (IS_FIND_CONDITION(reg->options))\n    BIT_STATUS_ON_ALL(reg->bt_mem_end);\n  else {\n    reg->bt_mem_end  = scan_env.bt_mem_end;\n    reg->bt_mem_end |= reg->capture_history;\n  }\n\n#ifdef USE_COMBINATION_EXPLOSION_CHECK\n  if (scan_env.backrefed_mem == 0\n#ifdef USE_SUBEXP_CALL\n      || scan_env.num_call == 0\n#endif\n      ) {\n    setup_comb_exp_check(root, 0, &scan_env);\n#ifdef USE_SUBEXP_CALL\n    if (scan_env.has_recursion != 0) {\n      scan_env.num_comb_exp_check = 0;\n    }\n    else\n#endif\n    if (scan_env.comb_exp_max_regnum > 0) {\n      int i;\n      for (i = 1; i <= scan_env.comb_exp_max_regnum; i++) {\n\tif (BIT_STATUS_AT(scan_env.backrefed_mem, i) != 0) {\n\t  scan_env.num_comb_exp_check = 0;\n\t  break;\n\t}\n      }\n    }\n  }\n\n  reg->num_comb_exp_check = scan_env.num_comb_exp_check;\n#endif\n\n  clear_optimize_info(reg);\n#ifndef ONIG_DONT_OPTIMIZE\n  r = set_optimize_info_from_tree(root, reg, &scan_env);\n  if (r != 0) goto err_unset;\n#endif\n\n  if (IS_NOT_NULL(scan_env.mem_nodes_dynamic)) {\n    xfree(scan_env.mem_nodes_dynamic);\n    scan_env.mem_nodes_dynamic = (Node** )NULL;\n  }\n\n  if (IS_WHOLEWORD(reg->options))\n\t  r = add_opcode(reg, OP_WORD_BEGIN);\n  r = compile_tree(root, reg);\n  if (r == 0) {\n\t  if (IS_WHOLEWORD(reg->options))\n\t\t  r = add_opcode(reg, OP_WORD_END);\n\t  r = add_opcode(reg, OP_END);\n#ifdef USE_SUBEXP_CALL\n    if (scan_env.num_call > 0) {\n      r = unset_addr_list_fix(&uslist, reg);\n      unset_addr_list_end(&uslist);\n      if (r) goto err;\n    }\n#endif\n\n    if ((reg->num_repeat != 0) || (reg->bt_mem_end != 0))\n      reg->stack_pop_level = STACK_POP_LEVEL_ALL;\n    else {\n      if (reg->bt_mem_start != 0)\n\treg->stack_pop_level = STACK_POP_LEVEL_MEM_START;\n      else\n\treg->stack_pop_level = STACK_POP_LEVEL_FREE;\n    }\n  }\n#ifdef USE_SUBEXP_CALL\n  else if (scan_env.num_call > 0) {\n    unset_addr_list_end(&uslist);\n  }\n#endif\n  onig_node_free(root);\n\n#ifdef ONIG_DEBUG_COMPILE\n#ifdef USE_NAMED_GROUP\n  onig_print_names(stderr, reg);\n#endif\n  print_compiled_byte_code_list(stderr, reg);\n#endif\n\n end:\n  reg->state = ONIG_STATE_NORMAL;\n  return r;\n\n err_unset:\n#ifdef USE_SUBEXP_CALL\n  if (scan_env.num_call > 0) {\n    unset_addr_list_end(&uslist);\n  }\n#endif\n err:\n  if (IS_NOT_NULL(scan_env.error)) {\n    if (IS_NOT_NULL(einfo)) {\n      einfo->enc     = scan_env.enc;\n      einfo->par     = scan_env.error;\n      einfo->par_end = scan_env.error_end;\n    }\n  }\n\n  onig_node_free(root);\n  if (IS_NOT_NULL(scan_env.mem_nodes_dynamic))\n      xfree(scan_env.mem_nodes_dynamic);\n  return r;\n}\n\n#ifdef USE_RECOMPILE_API\nextern int\nonig_recompile(regex_t* reg, const UChar* pattern, const UChar* pattern_end,\n\t    OnigOptionType option, OnigEncoding enc, OnigSyntaxType* syntax,\n\t    OnigErrorInfo* einfo)\n{\n  int r;\n  regex_t *new_reg;\n\n  r = onig_new(&new_reg, pattern, pattern_end, option, enc, syntax, einfo);\n  if (r) return r;\n  if (ONIG_STATE(reg) == ONIG_STATE_NORMAL) {\n    onig_transfer(reg, new_reg);\n  }\n  else {\n    onig_chain_link_add(reg, new_reg);\n  }\n  return 0;\n}\n#endif\n\nstatic int onig_inited = 0;\n\nextern int\nonig_reg_init(regex_t* reg, OnigOptionType option,\n\t      OnigCaseFoldType case_fold_flag,\n\t      OnigEncoding enc, OnigSyntaxType* syntax)\n{\n  if (! onig_inited)\n    onig_init();\n\n  if (IS_NULL(reg))\n    return ONIGERR_INVALID_ARGUMENT;\n\n  if (ONIGENC_IS_UNDEF(enc))\n    return ONIGERR_DEFAULT_ENCODING_IS_NOT_SET;\n\n  if ((option & (ONIG_OPTION_DONT_CAPTURE_GROUP|ONIG_OPTION_CAPTURE_GROUP))\n      == (ONIG_OPTION_DONT_CAPTURE_GROUP|ONIG_OPTION_CAPTURE_GROUP)) {\n    return ONIGERR_INVALID_COMBINATION_OF_OPTIONS;\n  }\n\n  (reg)->state = ONIG_STATE_MODIFY;\n\n  if ((option & ONIG_OPTION_NEGATE_SINGLELINE) != 0) {\n    option |= syntax->options;\n    option &= ~ONIG_OPTION_SINGLELINE;\n  }\n  else\n    option |= syntax->options;\n\n  (reg)->enc              = enc;\n  (reg)->options          = option;\n  (reg)->syntax           = syntax;\n  (reg)->optimize         = 0;\n  (reg)->exact            = (UChar* )NULL;\n  (reg)->int_map          = (int* )NULL;\n  (reg)->int_map_backward = (int* )NULL;\n  (reg)->chain            = (regex_t* )NULL;\n\n  (reg)->p                = (UChar* )NULL;\n  (reg)->alloc            = 0;\n  (reg)->used             = 0;\n  (reg)->name_table       = (void* )NULL;\n\n  (reg)->case_fold_flag   = case_fold_flag;\n  return 0;\n}\n\nextern int\nonig_new_without_alloc(regex_t* reg, const UChar* pattern,\n          const UChar* pattern_end, OnigOptionType option, OnigEncoding enc,\n          OnigSyntaxType* syntax, OnigErrorInfo* einfo)\n{\n  int r;\n\n  r = onig_reg_init(reg, option, ONIGENC_CASE_FOLD_DEFAULT, enc, syntax);\n  if (r) return r;\n\n  r = onig_compile(reg, pattern, pattern_end, einfo);\n  return r;\n}\n\nextern int\nonig_new(regex_t** reg, const UChar* pattern, const UChar* pattern_end,\n\t  OnigOptionType option, OnigEncoding enc, OnigSyntaxType* syntax,\n\t  OnigErrorInfo* einfo)\n{\n  int r;\n\n  *reg = (regex_t* )xmalloc(sizeof(regex_t));\n  if (IS_NULL(*reg)) return ONIGERR_MEMORY;\n\n  r = onig_reg_init(*reg, option, ONIGENC_CASE_FOLD_DEFAULT, enc, syntax);\n  if (r) goto err;\n\n  r = onig_compile(*reg, pattern, pattern_end, einfo);\n  if (r) {\n  err:\n    onig_free(*reg);\n    *reg = NULL;\n  }\n  return r;\n}\n\n\nextern int\nonig_init(void)\n{\n  if (onig_inited != 0)\n    return 0;\n\n  THREAD_SYSTEM_INIT;\n  THREAD_ATOMIC_START;\n\n  onig_inited = 1;\n\n  onigenc_init();\n  /* onigenc_set_default_caseconv_table((UChar* )0); */\n\n#ifdef ONIG_DEBUG_STATISTICS\n  onig_statistics_init();\n#endif\n\n  THREAD_ATOMIC_END;\n  return 0;\n}\n\n\nextern int\nonig_end(void)\n{\n  THREAD_ATOMIC_START;\n\n#ifdef ONIG_DEBUG_STATISTICS\n  onig_print_statistics(stderr);\n#endif\n\n#ifdef USE_SHARED_CCLASS_TABLE\n  onig_free_shared_cclass_table();\n#endif\n\n#ifdef USE_PARSE_TREE_NODE_RECYCLE\n  onig_free_node_list();\n#endif\n\n#ifdef USE_SHARED_UNICODE_TABLE\n  onig_free_shared_unicode_table();\n#endif\n\n  onig_inited = 0;\n\n  THREAD_ATOMIC_END;\n  THREAD_SYSTEM_END;\n  return 0;\n}\n\nextern int\nonig_is_in_code_range(const UChar* p, OnigCodePoint code)\n{\n  OnigCodePoint n, *data;\n  OnigCodePoint low, high, x;\n\n  GET_CODE_POINT(n, p);\n  data = (OnigCodePoint* )p;\n  data++;\n\n  for (low = 0, high = n; low < high; ) {\n    x = (low + high) >> 1;\n    if (code > data[x * 2 + 1])\n      low = x + 1;\n    else\n      high = x;\n  }\n\n  return ((low < n && code >= data[low * 2]) ? 1 : 0);\n}\n\nextern int\nonig_is_code_in_cc_len(int elen, OnigCodePoint code, CClassNode* cc)\n{\n  int found;\n\n  if (elen > 1 || (code >= SINGLE_BYTE_SIZE)) {\n    if (IS_NULL(cc->mbuf)) {\n      found = 0;\n    }\n    else {\n      found = (onig_is_in_code_range(cc->mbuf->p, code) != 0 ? 1 : 0);\n    }\n  }\n  else {\n    found = (BITSET_AT(cc->bs, code) == 0 ? 0 : 1);\n  }\n\n  if (IS_NCCLASS_NOT(cc))\n    return !found;\n  else\n    return found;\n}\n\nextern int\nonig_is_code_in_cc(OnigEncoding enc, OnigCodePoint code, CClassNode* cc)\n{\n  int len;\n\n  if (ONIGENC_MBC_MINLEN(enc) > 1) {\n    len = 2;\n  }\n  else {\n    len = ONIGENC_CODE_TO_MBCLEN(enc, code);\n  }\n  return onig_is_code_in_cc_len(len, code, cc);\n}\n\n\n#ifdef ONIG_DEBUG\n\n/* arguments type */\n#define ARG_SPECIAL     -1\n#define ARG_NON          0\n#define ARG_RELADDR      1\n#define ARG_ABSADDR      2\n#define ARG_LENGTH       3\n#define ARG_MEMNUM       4\n#define ARG_OPTION       5\n#define ARG_STATE_CHECK  6\n\nOnigOpInfoType OnigOpInfo[] = {\n  { OP_FINISH,            \"finish\",          ARG_NON },\n  { OP_END,               \"end\",             ARG_NON },\n  { OP_EXACT1,            \"exact1\",          ARG_SPECIAL },\n  { OP_EXACT2,            \"exact2\",          ARG_SPECIAL },\n  { OP_EXACT3,            \"exact3\",          ARG_SPECIAL },\n  { OP_EXACT4,            \"exact4\",          ARG_SPECIAL },\n  { OP_EXACT5,            \"exact5\",          ARG_SPECIAL },\n  { OP_EXACTN,            \"exactn\",          ARG_SPECIAL },\n  { OP_EXACTMB2N1,        \"exactmb2-n1\",     ARG_SPECIAL },\n  { OP_EXACTMB2N2,        \"exactmb2-n2\",     ARG_SPECIAL },\n  { OP_EXACTMB2N3,        \"exactmb2-n3\",     ARG_SPECIAL },\n  { OP_EXACTMB2N,         \"exactmb2-n\",      ARG_SPECIAL },\n  { OP_EXACTMB3N,         \"exactmb3n\"  ,     ARG_SPECIAL },\n  { OP_EXACTMBN,          \"exactmbn\",        ARG_SPECIAL },\n  { OP_EXACT1_IC,         \"exact1-ic\",       ARG_SPECIAL },\n  { OP_EXACTN_IC,         \"exactn-ic\",       ARG_SPECIAL },\n  { OP_CCLASS,            \"cclass\",          ARG_SPECIAL },\n  { OP_CCLASS_MB,         \"cclass-mb\",       ARG_SPECIAL },\n  { OP_CCLASS_MIX,        \"cclass-mix\",      ARG_SPECIAL },\n  { OP_CCLASS_NOT,        \"cclass-not\",      ARG_SPECIAL },\n  { OP_CCLASS_MB_NOT,     \"cclass-mb-not\",   ARG_SPECIAL },\n  { OP_CCLASS_MIX_NOT,    \"cclass-mix-not\",  ARG_SPECIAL },\n  { OP_CCLASS_NODE,       \"cclass-node\",     ARG_SPECIAL },\n  { OP_ANYCHAR,           \"anychar\",         ARG_NON },\n  { OP_ANYCHAR_ML,        \"anychar-ml\",      ARG_NON },\n  { OP_ANYCHAR_STAR,      \"anychar*\",        ARG_NON },\n  { OP_ANYCHAR_ML_STAR,   \"anychar-ml*\",     ARG_NON },\n  { OP_ANYCHAR_STAR_PEEK_NEXT, \"anychar*-peek-next\", ARG_SPECIAL },\n  { OP_ANYCHAR_ML_STAR_PEEK_NEXT, \"anychar-ml*-peek-next\", ARG_SPECIAL },\n  { OP_WORD,                \"word\",            ARG_NON },\n  { OP_NOT_WORD,            \"not-word\",        ARG_NON },\n  { OP_WORD_BOUND,          \"word-bound\",      ARG_NON },\n  { OP_NOT_WORD_BOUND,      \"not-word-bound\",  ARG_NON },\n  { OP_WORD_BEGIN,          \"word-begin\",      ARG_NON },\n  { OP_WORD_END,            \"word-end\",        ARG_NON },\n  { OP_ASCII_WORD,          \"ascii-word\",           ARG_NON },\n  { OP_NOT_ASCII_WORD,      \"not-ascii-word\",       ARG_NON },\n  { OP_ASCII_WORD_BOUND,    \"ascii-word-bound\",     ARG_NON },\n  { OP_NOT_ASCII_WORD_BOUND,\"not-ascii-word-bound\", ARG_NON },\n  { OP_ASCII_WORD_BEGIN,    \"ascii-word-begin\",     ARG_NON },\n  { OP_ASCII_WORD_END,      \"ascii-word-end\",       ARG_NON },\n  { OP_BEGIN_BUF,           \"begin-buf\",       ARG_NON },\n  { OP_END_BUF,             \"end-buf\",         ARG_NON },\n  { OP_BEGIN_LINE,          \"begin-line\",      ARG_NON },\n  { OP_END_LINE,            \"end-line\",        ARG_NON },\n  { OP_SEMI_END_BUF,        \"semi-end-buf\",    ARG_NON },\n  { OP_BEGIN_POSITION,      \"begin-position\",  ARG_NON },\n  { OP_BEGIN_POS_OR_LINE,   \"begin-pos-or-line\",    ARG_NON },\n  { OP_BACKREF1,            \"backref1\",             ARG_NON },\n  { OP_BACKREF2,            \"backref2\",             ARG_NON },\n  { OP_BACKREFN,            \"backrefn\",             ARG_MEMNUM  },\n  { OP_BACKREFN_IC,         \"backrefn-ic\",          ARG_SPECIAL },\n  { OP_BACKREF_MULTI,       \"backref_multi\",        ARG_SPECIAL },\n  { OP_BACKREF_MULTI_IC,    \"backref_multi-ic\",     ARG_SPECIAL },\n  { OP_BACKREF_WITH_LEVEL,  \"backref_at_level\",     ARG_SPECIAL },\n  { OP_MEMORY_START_PUSH,   \"mem-start-push\",       ARG_MEMNUM  },\n  { OP_MEMORY_START,        \"mem-start\",            ARG_MEMNUM  },\n  { OP_MEMORY_END_PUSH,     \"mem-end-push\",         ARG_MEMNUM  },\n  { OP_MEMORY_END_PUSH_REC, \"mem-end-push-rec\",     ARG_MEMNUM  },\n  { OP_MEMORY_END,          \"mem-end\",              ARG_MEMNUM  },\n  { OP_MEMORY_END_REC,      \"mem-end-rec\",          ARG_MEMNUM  },\n  { OP_SET_OPTION_PUSH,     \"set-option-push\",      ARG_OPTION  },\n  { OP_SET_OPTION,          \"set-option\",           ARG_OPTION  },\n  { OP_KEEP,                \"keep\",                 ARG_NON },\n  { OP_FAIL,                \"fail\",                 ARG_NON },\n  { OP_JUMP,                \"jump\",                 ARG_RELADDR },\n  { OP_PUSH,                \"push\",                 ARG_RELADDR },\n  { OP_POP,                 \"pop\",                  ARG_NON },\n  { OP_PUSH_OR_JUMP_EXACT1, \"push-or-jump-e1\",      ARG_SPECIAL },\n  { OP_PUSH_IF_PEEK_NEXT,   \"push-if-peek-next\",    ARG_SPECIAL },\n  { OP_REPEAT,              \"repeat\",               ARG_SPECIAL },\n  { OP_REPEAT_NG,           \"repeat-ng\",            ARG_SPECIAL },\n  { OP_REPEAT_INC,          \"repeat-inc\",           ARG_MEMNUM  },\n  { OP_REPEAT_INC_NG,       \"repeat-inc-ng\",        ARG_MEMNUM  },\n  { OP_REPEAT_INC_SG,       \"repeat-inc-sg\",        ARG_MEMNUM  },\n  { OP_REPEAT_INC_NG_SG,    \"repeat-inc-ng-sg\",     ARG_MEMNUM  },\n  { OP_NULL_CHECK_START,    \"null-check-start\",     ARG_MEMNUM  },\n  { OP_NULL_CHECK_END,      \"null-check-end\",       ARG_MEMNUM  },\n  { OP_NULL_CHECK_END_MEMST,\"null-check-end-memst\", ARG_MEMNUM  },\n  { OP_NULL_CHECK_END_MEMST_PUSH,\"null-check-end-memst-push\", ARG_MEMNUM  },\n  { OP_PUSH_POS,             \"push-pos\",             ARG_NON },\n  { OP_POP_POS,              \"pop-pos\",              ARG_NON },\n  { OP_PUSH_POS_NOT,         \"push-pos-not\",         ARG_RELADDR },\n  { OP_FAIL_POS,             \"fail-pos\",             ARG_NON },\n  { OP_PUSH_STOP_BT,         \"push-stop-bt\",         ARG_NON },\n  { OP_POP_STOP_BT,          \"pop-stop-bt\",          ARG_NON },\n  { OP_LOOK_BEHIND,          \"look-behind\",          ARG_SPECIAL },\n  { OP_PUSH_LOOK_BEHIND_NOT, \"push-look-behind-not\", ARG_SPECIAL },\n  { OP_FAIL_LOOK_BEHIND_NOT, \"fail-look-behind-not\", ARG_NON },\n  { OP_CALL,                 \"call\",                 ARG_ABSADDR },\n  { OP_RETURN,               \"return\",               ARG_NON },\n  { OP_CONDITION,            \"condition\",            ARG_SPECIAL },\n  { OP_STATE_CHECK_PUSH,         \"state-check-push\",         ARG_SPECIAL },\n  { OP_STATE_CHECK_PUSH_OR_JUMP, \"state-check-push-or-jump\", ARG_SPECIAL },\n  { OP_STATE_CHECK,              \"state-check\",              ARG_STATE_CHECK },\n  { OP_STATE_CHECK_ANYCHAR_STAR, \"state-check-anychar*\",     ARG_STATE_CHECK },\n  { OP_STATE_CHECK_ANYCHAR_ML_STAR,\n    \"state-check-anychar-ml*\", ARG_STATE_CHECK },\n  { -1, \"\", ARG_NON }\n};\n\nstatic const char*\nop2name(int opcode)\n{\n  int i;\n\n  for (i = 0; OnigOpInfo[i].opcode >= 0; i++) {\n    if (opcode == OnigOpInfo[i].opcode)\n      return OnigOpInfo[i].name;\n  }\n  return \"\";\n}\n\nstatic int\nop2arg_type(int opcode)\n{\n  int i;\n\n  for (i = 0; OnigOpInfo[i].opcode >= 0; i++) {\n    if (opcode == OnigOpInfo[i].opcode)\n      return OnigOpInfo[i].arg_type;\n  }\n  return ARG_SPECIAL;\n}\n\nstatic void\nIndent(FILE* f, int indent)\n{\n  int i;\n  for (i = 0; i < indent; i++) putc(' ', f);\n}\n\nstatic void\np_string(FILE* f, int len, UChar* s)\n{\n  fputs(\":\", f);\n  while (len-- > 0) { fputc(*s++, f); }\n}\n\nstatic void\np_len_string(FILE* f, LengthType len, int mb_len, UChar* s)\n{\n  int x = len * mb_len;\n\n  fprintf(f, \":%d:\", len);\n  while (x-- > 0) { fputc(*s++, f); }\n}\n\nextern void\nonig_print_compiled_byte_code(FILE* f, UChar* bp, UChar** nextp,\n                              OnigEncoding enc)\n{\n  int i, n, arg_type;\n  RelAddrType addr;\n  LengthType len;\n  MemNumType mem;\n  StateCheckNumType scn;\n  OnigCodePoint code;\n  UChar *q;\n\n  fprintf(f, \"[%s\", op2name(*bp));\n  arg_type = op2arg_type(*bp);\n  if (arg_type != ARG_SPECIAL) {\n    bp++;\n    switch (arg_type) {\n    case ARG_NON:\n      break;\n    case ARG_RELADDR:\n      GET_RELADDR_INC(addr, bp);\n      fprintf(f, \":(%d)\", addr);\n      break;\n    case ARG_ABSADDR:\n      GET_ABSADDR_INC(addr, bp);\n      fprintf(f, \":(%d)\", addr);\n      break;\n    case ARG_LENGTH:\n      GET_LENGTH_INC(len, bp);\n      fprintf(f, \":%d\", len);\n      break;\n    case ARG_MEMNUM:\n      mem = *((MemNumType* )bp);\n      bp += SIZE_MEMNUM;\n      fprintf(f, \":%d\", mem);\n      break;\n    case ARG_OPTION:\n      {\n\tOnigOptionType option = *((OnigOptionType* )bp);\n\tbp += SIZE_OPTION;\n\tfprintf(f, \":%d\", option);\n      }\n      break;\n\n    case ARG_STATE_CHECK:\n      scn = *((StateCheckNumType* )bp);\n      bp += SIZE_STATE_CHECK_NUM;\n      fprintf(f, \":%d\", scn);\n      break;\n    }\n  }\n  else {\n    switch (*bp++) {\n    case OP_EXACT1:\n    case OP_ANYCHAR_STAR_PEEK_NEXT:\n    case OP_ANYCHAR_ML_STAR_PEEK_NEXT:\n      p_string(f, 1, bp++); break;\n    case OP_EXACT2:\n      p_string(f, 2, bp); bp += 2; break;\n    case OP_EXACT3:\n      p_string(f, 3, bp); bp += 3; break;\n    case OP_EXACT4:\n      p_string(f, 4, bp); bp += 4; break;\n    case OP_EXACT5:\n      p_string(f, 5, bp); bp += 5; break;\n    case OP_EXACTN:\n      GET_LENGTH_INC(len, bp);\n      p_len_string(f, len, 1, bp);\n      bp += len;\n      break;\n\n    case OP_EXACTMB2N1:\n      p_string(f, 2, bp); bp += 2; break;\n    case OP_EXACTMB2N2:\n      p_string(f, 4, bp); bp += 4; break;\n    case OP_EXACTMB2N3:\n      p_string(f, 6, bp); bp += 6; break;\n    case OP_EXACTMB2N:\n      GET_LENGTH_INC(len, bp);\n      p_len_string(f, len, 2, bp);\n      bp += len * 2;\n      break;\n    case OP_EXACTMB3N:\n      GET_LENGTH_INC(len, bp);\n      p_len_string(f, len, 3, bp);\n      bp += len * 3;\n      break;\n    case OP_EXACTMBN:\n      {\n\tint mb_len;\n\n\tGET_LENGTH_INC(mb_len, bp);\n\tGET_LENGTH_INC(len, bp);\n\tfprintf(f, \":%d:%d:\", mb_len, len);\n\tn = len * mb_len;\n\twhile (n-- > 0) { fputc(*bp++, f); }\n      }\n      break;\n\n    case OP_EXACT1_IC:\n      len = enclen(enc, bp);\n      p_string(f, len, bp);\n      bp += len;\n      break;\n    case OP_EXACTN_IC:\n      GET_LENGTH_INC(len, bp);\n      p_len_string(f, len, 1, bp);\n      bp += len;\n      break;\n\n    case OP_CCLASS:\n      n = bitset_on_num((BitSetRef )bp);\n      bp += SIZE_BITSET;\n      fprintf(f, \":%d\", n);\n      break;\n\n    case OP_CCLASS_NOT:\n      n = bitset_on_num((BitSetRef )bp);\n      bp += SIZE_BITSET;\n      fprintf(f, \":%d\", n);\n      break;\n\n    case OP_CCLASS_MB:\n    case OP_CCLASS_MB_NOT:\n      GET_LENGTH_INC(len, bp);\n      q = bp;\n#ifndef PLATFORM_UNALIGNED_WORD_ACCESS\n      ALIGNMENT_RIGHT(q);\n#endif\n      GET_CODE_POINT(code, q);\n      bp += len;\n      fprintf(f, \":%d:%d\", (int )code, len);\n      break;\n\n    case OP_CCLASS_MIX:\n    case OP_CCLASS_MIX_NOT:\n      n = bitset_on_num((BitSetRef )bp);\n      bp += SIZE_BITSET;\n      GET_LENGTH_INC(len, bp);\n      q = bp;\n#ifndef PLATFORM_UNALIGNED_WORD_ACCESS\n      ALIGNMENT_RIGHT(q);\n#endif\n      GET_CODE_POINT(code, q);\n      bp += len;\n      fprintf(f, \":%d:%d:%d\", n, (int )code, len);\n      break;\n\n    case OP_CCLASS_NODE:\n      {\n        CClassNode *cc;\n\n        GET_POINTER_INC(cc, bp);\n        n = bitset_on_num(cc->bs);\n        fprintf(f, \":%u:%d\", (unsigned int )cc, n);\n      }\n      break;\n\n    case OP_BACKREFN_IC:\n      mem = *((MemNumType* )bp);\n      bp += SIZE_MEMNUM;\n      fprintf(f, \":%d\", mem);\n      break;\n\n    case OP_BACKREF_MULTI_IC:\n    case OP_BACKREF_MULTI:\n      fputs(\" \", f);\n      GET_LENGTH_INC(len, bp);\n      for (i = 0; i < len; i++) {\n\tGET_MEMNUM_INC(mem, bp);\n\tif (i > 0) fputs(\", \", f);\n\tfprintf(f, \"%d\", mem);\n      }\n      break;\n\n    case OP_BACKREF_WITH_LEVEL:\n      {\n\tOnigOptionType option;\n\tLengthType level;\n\n\tGET_OPTION_INC(option, bp);\n\tfprintf(f, \":%d\", option);\n\tGET_LENGTH_INC(level, bp);\n\tfprintf(f, \":%d\", level);\n\n\tfputs(\" \", f);\n\tGET_LENGTH_INC(len, bp);\n\tfor (i = 0; i < len; i++) {\n\t  GET_MEMNUM_INC(mem, bp);\n\t  if (i > 0) fputs(\", \", f);\n\t  fprintf(f, \"%d\", mem);\n\t}\n      }\n      break;\n\n    case OP_REPEAT:\n    case OP_REPEAT_NG:\n      {\n\tmem = *((MemNumType* )bp);\n\tbp += SIZE_MEMNUM;\n\taddr = *((RelAddrType* )bp);\n\tbp += SIZE_RELADDR;\n\tfprintf(f, \":%d:%d\", mem, addr);\n      }\n      break;\n\n    case OP_PUSH_OR_JUMP_EXACT1:\n    case OP_PUSH_IF_PEEK_NEXT:\n      addr = *((RelAddrType* )bp);\n      bp += SIZE_RELADDR;\n      fprintf(f, \":(%d)\", addr);\n      p_string(f, 1, bp);\n      bp += 1;\n      break;\n\n    case OP_LOOK_BEHIND:\n      GET_LENGTH_INC(len, bp);\n      fprintf(f, \":%d\", len);\n      break;\n\n    case OP_PUSH_LOOK_BEHIND_NOT:\n      GET_RELADDR_INC(addr, bp);\n      GET_LENGTH_INC(len, bp);\n      fprintf(f, \":%d:(%d)\", len, addr);\n      break;\n\n    case OP_STATE_CHECK_PUSH:\n    case OP_STATE_CHECK_PUSH_OR_JUMP:\n      scn = *((StateCheckNumType* )bp);\n      bp += SIZE_STATE_CHECK_NUM;\n      addr = *((RelAddrType* )bp);\n      bp += SIZE_RELADDR;\n      fprintf(f, \":%d:(%d)\", scn, addr);\n      break;\n\n    case OP_CONDITION:\n      GET_MEMNUM_INC(mem, bp);\n      GET_RELADDR_INC(addr, bp);\n      fprintf(f, \":%d:(%d)\", mem, addr);\n      break;\n\n    default:\n      fprintf(stderr, \"onig_print_compiled_byte_code: undefined code %d\\n\",\n\t      *--bp);\n    }\n  }\n  fputs(\"]\", f);\n  if (nextp) *nextp = bp;\n}\n\nstatic void\nprint_compiled_byte_code_list(FILE* f, regex_t* reg)\n{\n  int ncode;\n  UChar* bp = reg->p;\n  UChar* end = reg->p + reg->used;\n\n  fprintf(f, \"code length: %d\", reg->used);\n\n  ncode = -1;\n  while (bp < end) {\n    ncode++;\n    if (ncode % 5 == 0)\n      fprintf(f, \"\\n%ld:\", bp - reg->p);\n    else\n      fprintf(f, \" %ld:\", bp - reg->p);\n    onig_print_compiled_byte_code(f, bp, &bp, reg->enc);\n  }\n\n  fprintf(f, \"\\n\");\n}\n\nstatic void\nprint_indent_tree(FILE* f, Node* node, int indent)\n{\n  int i, type, container_p = 0;\n  int add = 3;\n  UChar* p;\n\n  Indent(f, indent);\n  if (IS_NULL(node)) {\n    fprintf(f, \"ERROR: null node!!!\\n\");\n    exit (0);\n  }\n\n  type = NTYPE(node);\n  switch (type) {\n  case NT_LIST:\n  case NT_ALT:\n    if (NTYPE(node) == NT_LIST)\n      fprintf(f, \"<list:%x>\\n\", (int )node);\n    else\n      fprintf(f, \"<alt:%x>\\n\", (int )node);\n\n    print_indent_tree(f, NCAR(node), indent + add);\n    while (IS_NOT_NULL(node = NCDR(node))) {\n      if (NTYPE(node) != type) {\n\tfprintf(f, \"ERROR: list/alt right is not a cons. %d\\n\", NTYPE(node));\n\texit(0);\n      }\n      print_indent_tree(f, NCAR(node), indent + add);\n    }\n    break;\n\n  case NT_STR:\n    fprintf(f, \"<string%s:%x>\",\n\t    (NSTRING_IS_RAW(node) ? \"-raw\" : \"\"), (int )node);\n    for (p = NSTR(node)->s; p < NSTR(node)->end; p++) {\n      if (*p >= 0x20 && *p < 0x7f)\n\tfputc(*p, f);\n      else {\n\tfprintf(f, \" 0x%02x\", *p);\n      }\n    }\n    break;\n\n  case NT_CCLASS:\n    fprintf(f, \"<cclass:%x>\", (int )node);\n    if (IS_NCCLASS_NOT(NCCLASS(node))) fputs(\" not\", f);\n    if (NCCLASS(node)->mbuf) {\n      BBuf* bbuf = NCCLASS(node)->mbuf;\n      for (i = 0; i < (int )bbuf->used; i++) {\n\tif (i > 0) fprintf(f, \",\");\n\tfprintf(f, \"%0x\", bbuf->p[i]);\n      }\n    }\n    break;\n\n  case NT_CTYPE:\n    fprintf(f, \"<ctype:%x> \", (int )node);\n    switch (NCTYPE(node)->ctype) {\n    case ONIGENC_CTYPE_WORD:\n      if (NCTYPE(node)->not != 0)\n\tfputs(\"not word\",       f);\n      else\n\tfputs(\"word\",           f);\n      break;\n\n    default:\n      fprintf(f, \"ERROR: undefined ctype.\\n\");\n      exit(0);\n    }\n    break;\n\n  case NT_CANY:\n    fprintf(f, \"<anychar:%x>\", (int )node);\n    break;\n\n  case NT_ANCHOR:\n    fprintf(f, \"<anchor:%x> \", (int )node);\n    switch (NANCHOR(node)->type) {\n    case ANCHOR_BEGIN_BUF:      fputs(\"begin buf\",      f); break;\n    case ANCHOR_END_BUF:        fputs(\"end buf\",        f); break;\n    case ANCHOR_BEGIN_LINE:     fputs(\"begin line\",     f); break;\n    case ANCHOR_END_LINE:       fputs(\"end line\",       f); break;\n    case ANCHOR_SEMI_END_BUF:   fputs(\"semi end buf\",   f); break;\n    case ANCHOR_BEGIN_POSITION: fputs(\"begin position\", f); break;\n    case ANCHOR_ANYCHAR_STAR:   fputs(\"begin position/line\", f); break;\n\n    case ANCHOR_WORD_BOUND:      fputs(\"word bound\",     f); break;\n    case ANCHOR_NOT_WORD_BOUND:  fputs(\"not word bound\", f); break;\n#ifdef USE_WORD_BEGIN_END\n    case ANCHOR_WORD_BEGIN:      fputs(\"word begin\", f);     break;\n    case ANCHOR_WORD_END:        fputs(\"word end\", f);       break;\n#endif\n    case ANCHOR_PREC_READ:       fputs(\"prec read\",      f); container_p = TRUE; break;\n    case ANCHOR_PREC_READ_NOT:   fputs(\"prec read not\",  f); container_p = TRUE; break;\n    case ANCHOR_LOOK_BEHIND:     fputs(\"look_behind\",    f); container_p = TRUE; break;\n    case ANCHOR_LOOK_BEHIND_NOT: fputs(\"look_behind_not\",f); container_p = TRUE; break;\n    case ANCHOR_KEEP:            fputs(\"keep\",f);            break;\n\n    default:\n      fprintf(f, \"ERROR: undefined anchor type.\\n\");\n      break;\n    }\n    break;\n\n  case NT_BREF:\n    {\n      int* p;\n      BRefNode* br = NBREF(node);\n      p = BACKREFS_P(br);\n      fprintf(f, \"<backref:%x>\", (int )node);\n      for (i = 0; i < br->back_num; i++) {\n\tif (i > 0) fputs(\", \", f);\n\tfprintf(f, \"%d\", p[i]);\n      }\n    }\n    break;\n\n#ifdef USE_SUBEXP_CALL\n  case NT_CALL:\n    {\n      CallNode* cn = NCALL(node);\n      fprintf(f, \"<call:%x>\", (int )node);\n      p_string(f, cn->name_end - cn->name, cn->name);\n    }\n    break;\n#endif\n\n  case NT_QTFR:\n    fprintf(f, \"<quantifier:%x>{%d,%d}%s\\n\", (int )node,\n\t    NQTFR(node)->lower, NQTFR(node)->upper,\n\t    (NQTFR(node)->greedy ? \"\" : \"?\"));\n    print_indent_tree(f, NQTFR(node)->target, indent + add);\n    break;\n\n  case NT_ENCLOSE:\n    fprintf(f, \"<enclose:%x> \", (int )node);\n    switch (NENCLOSE(node)->type) {\n    case ENCLOSE_OPTION:\n      fprintf(f, \"option:%d\", NENCLOSE(node)->option);\n      break;\n    case ENCLOSE_MEMORY:\n      fprintf(f, \"memory:%d\", NENCLOSE(node)->regnum);\n      break;\n    case ENCLOSE_STOP_BACKTRACK:\n      fprintf(f, \"stop-bt\");\n      break;\n    case ENCLOSE_CONDITION:\n      fprintf(f, \"condition:%d\", NENCLOSE(node)->regnum);\n      break;\n\n    default:\n      break;\n    }\n    fprintf(f, \"\\n\");\n    print_indent_tree(f, NENCLOSE(node)->target, indent + add);\n    break;\n\n  default:\n    fprintf(f, \"print_indent_tree: undefined node type %d\\n\", NTYPE(node));\n    break;\n  }\n\n  if (type != NT_LIST && type != NT_ALT && type != NT_QTFR &&\n      type != NT_ENCLOSE)\n    fprintf(f, \"\\n\");\n\n  if (container_p) print_indent_tree(f, NANCHOR(node)->target, indent + add);\n\n  fflush(f);\n}\n#endif /* ONIG_DEBUG */\n\n#ifdef ONIG_DEBUG_PARSE_TREE\nstatic void\nprint_tree(FILE* f, Node* node)\n{\n  print_indent_tree(f, node, 0);\n}\n#endif\n"
  },
  {
    "path": "src/Onigmo/regenc.c",
    "content": "/**********************************************************************\n  regenc.c -  Onigmo (Oniguruma-mod) (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2007  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * Copyright (c) 2011       K.Takata  <kentkt AT csc DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regint.h\"\n\nOnigEncoding OnigEncDefaultCharEncoding = ONIG_ENCODING_INIT_DEFAULT;\n\nextern int\nonigenc_init(void)\n{\n  return 0;\n}\n\nextern OnigEncoding\nonigenc_get_default_encoding(void)\n{\n  return OnigEncDefaultCharEncoding;\n}\n\nextern int\nonigenc_set_default_encoding(OnigEncoding enc)\n{\n  OnigEncDefaultCharEncoding = enc;\n  return 0;\n}\n\nextern UChar*\nonigenc_get_right_adjust_char_head(OnigEncoding enc, const UChar* start, const UChar* s)\n{\n  UChar* p = ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc, start, s);\n  if (p < s) {\n    p += enclen(enc, p);\n  }\n  return p;\n}\n\nextern OnigPosition\nonigenc_get_right_adjust_char_head_se(OnigIterator* it, OnigEncoding enc, OnigPosition start, OnigPosition s)\n{\n  OnigPosition p = ONIGENC_LEFT_ADJUST_CHAR_HEAD_SE(it, enc, start, s);\n  if (p < s) {\n    p += enclen_se(it, enc, p);\n  }\n  return p;\n}\n\nextern UChar*\nonigenc_get_right_adjust_char_head_with_prev(OnigEncoding enc,\n\t\t\t\t   const UChar* start, const UChar* s, const UChar** prev)\n{\n  UChar* p = ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc, start, s);\n\n  if (p < s) {\n    if (prev) *prev = (const UChar* )p;\n    p += enclen(enc, p);\n  }\n  else {\n    if (prev) *prev = (const UChar* )NULL; /* Sorry */\n  }\n  return p;\n}\n\nextern OnigPosition\nonigenc_get_right_adjust_char_head_with_prev_se(OnigIterator* it, OnigEncoding enc,\n\t\t\t\t   OnigPosition start, OnigPosition s, OnigPosition* prev)\n{\n  OnigPosition p = ONIGENC_LEFT_ADJUST_CHAR_HEAD_SE(it, enc, start, s);\n\n  if (p < s) {\n    if (prev) *prev = p;\n    p += enclen_se(it, enc, p);\n  }\n  else {\n    if (prev) *prev = ONIG_BADPOS; /* Sorry */\n  }\n  return p;\n}\n\nextern UChar*\nonigenc_get_prev_char_head(OnigEncoding enc, const UChar* start, const UChar* s)\n{\n  if (s <= start)\n    return (UChar* )NULL;\n\n  return ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc, start, s - 1);\n}\n\nextern OnigPosition\nonigenc_get_prev_char_head_se(OnigIterator* it, OnigEncoding enc, OnigPosition start, OnigPosition s)\n{\n  if (s <= start)\n    return ONIG_BADPOS;\n\n  return ONIGENC_LEFT_ADJUST_CHAR_HEAD_SE(it, enc, start, s - 1);\n}\n\nextern UChar*\nonigenc_step_back(OnigEncoding enc, const UChar* start, const UChar* s, int n)\n{\n  while (ONIG_IS_NOT_NULL(s) && n-- > 0) {\n    if (s <= start)\n      return (UChar* )NULL;\n\n    s = ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc, start, s - 1);\n  }\n  return (UChar* )s;\n}\n\nextern OnigPosition\nonigenc_step_back_se(OnigIterator* it, OnigEncoding enc, OnigPosition start, OnigPosition s, int n)\n{\n  while (ONIG_IS_NOT_BADPOS(s) && n-- > 0) {\n    if (s <= start)\n      return ONIG_BADPOS;\n\n    s = ONIGENC_LEFT_ADJUST_CHAR_HEAD_SE(it, enc, start, s - 1);\n  }\n  return s;\n}\n\nextern UChar*\nonigenc_step(OnigEncoding enc, const UChar* p, const UChar* end, int n)\n{\n  UChar* q = (UChar* )p;\n  while (n-- > 0) {\n    q += ONIGENC_MBC_ENC_LEN(enc, q);\n  }\n  return (q <= end ? q : NULL);\n}\n\nextern int\nonigenc_strlen(OnigEncoding enc, const UChar* p, const UChar* end)\n{\n  int n = 0;\n  UChar* q = (UChar* )p;\n\n  while (q < end) {\n    q += ONIGENC_MBC_ENC_LEN(enc, q);\n    n++;\n  }\n  return n;\n}\n\nextern int\nonigenc_strlen_se(OnigIterator* it, OnigEncoding enc, OnigPosition p, OnigPosition end)\n{\n\tint n = 0;\n\n\twhile (p < end) {\n\t\tp += ONIGENC_MBC_ENC_LEN_SE(it, enc, p);\n\t\tn++;\n\t}\n\treturn n;\n}\n\nextern int\nonigenc_strlen_null(OnigEncoding enc, const UChar* s)\n{\n  int n = 0;\n  UChar* p = (UChar* )s;\n\n  while (1) {\n    if (*p == '\\0') {\n      UChar* q;\n      int len = ONIGENC_MBC_MINLEN(enc);\n\n      if (len == 1) return n;\n      q = p + 1;\n      while (len > 1) {\n        if (*q != '\\0') break;\n        q++;\n        len--;\n      }\n      if (len == 1) return n;\n    }\n    p += ONIGENC_MBC_ENC_LEN(enc, p);\n    n++;\n  }\n}\n\nextern int\nonigenc_str_bytelen_null(OnigEncoding enc, const UChar* s)\n{\n  UChar* start = (UChar* )s;\n  UChar* p = (UChar* )s;\n\n  while (1) {\n    if (*p == '\\0') {\n      UChar* q;\n      int len = ONIGENC_MBC_MINLEN(enc);\n\n      if (len == 1) return (int )(p - start);\n      q = p + 1;\n      while (len > 1) {\n        if (*q != '\\0') break;\n        q++;\n        len--;\n      }\n      if (len == 1) return (int )(p - start);\n    }\n    p += ONIGENC_MBC_ENC_LEN(enc, p);\n  }\n}\n\nextern OnigPosition\nonigenc_str_bytelen_null_se(OnigIterator* it, OnigEncoding enc, OnigPosition s)\n{\n  OnigPosition start = s;\n  OnigPosition p = s;\n\n  while (1) {\n    if (ONIG_CHARAT(p) == '\\0') {\n      OnigPosition q;\n      int len = ONIGENC_MBC_MINLEN(enc);\n\n      if (len == 1) return p - start;\n      q = p + 1;\n      while (len > 1) {\n        if (ONIG_CHARAT(q) != '\\0') break;\n        q++;\n        len--;\n      }\n      if (len == 1) return p - start;\n    }\n    p += ONIGENC_MBC_ENC_LEN_SE(it, enc, p);\n  }\n}\n\nconst UChar OnigEncAsciiToLowerCaseTable[] = {\n  '\\000', '\\001', '\\002', '\\003', '\\004', '\\005', '\\006', '\\007',\n  '\\010', '\\011', '\\012', '\\013', '\\014', '\\015', '\\016', '\\017',\n  '\\020', '\\021', '\\022', '\\023', '\\024', '\\025', '\\026', '\\027',\n  '\\030', '\\031', '\\032', '\\033', '\\034', '\\035', '\\036', '\\037',\n  '\\040', '\\041', '\\042', '\\043', '\\044', '\\045', '\\046', '\\047',\n  '\\050', '\\051', '\\052', '\\053', '\\054', '\\055', '\\056', '\\057',\n  '\\060', '\\061', '\\062', '\\063', '\\064', '\\065', '\\066', '\\067',\n  '\\070', '\\071', '\\072', '\\073', '\\074', '\\075', '\\076', '\\077',\n  '\\100', '\\141', '\\142', '\\143', '\\144', '\\145', '\\146', '\\147',\n  '\\150', '\\151', '\\152', '\\153', '\\154', '\\155', '\\156', '\\157',\n  '\\160', '\\161', '\\162', '\\163', '\\164', '\\165', '\\166', '\\167',\n  '\\170', '\\171', '\\172', '\\133', '\\134', '\\135', '\\136', '\\137',\n  '\\140', '\\141', '\\142', '\\143', '\\144', '\\145', '\\146', '\\147',\n  '\\150', '\\151', '\\152', '\\153', '\\154', '\\155', '\\156', '\\157',\n  '\\160', '\\161', '\\162', '\\163', '\\164', '\\165', '\\166', '\\167',\n  '\\170', '\\171', '\\172', '\\173', '\\174', '\\175', '\\176', '\\177',\n  '\\200', '\\201', '\\202', '\\203', '\\204', '\\205', '\\206', '\\207',\n  '\\210', '\\211', '\\212', '\\213', '\\214', '\\215', '\\216', '\\217',\n  '\\220', '\\221', '\\222', '\\223', '\\224', '\\225', '\\226', '\\227',\n  '\\230', '\\231', '\\232', '\\233', '\\234', '\\235', '\\236', '\\237',\n  '\\240', '\\241', '\\242', '\\243', '\\244', '\\245', '\\246', '\\247',\n  '\\250', '\\251', '\\252', '\\253', '\\254', '\\255', '\\256', '\\257',\n  '\\260', '\\261', '\\262', '\\263', '\\264', '\\265', '\\266', '\\267',\n  '\\270', '\\271', '\\272', '\\273', '\\274', '\\275', '\\276', '\\277',\n  '\\300', '\\301', '\\302', '\\303', '\\304', '\\305', '\\306', '\\307',\n  '\\310', '\\311', '\\312', '\\313', '\\314', '\\315', '\\316', '\\317',\n  '\\320', '\\321', '\\322', '\\323', '\\324', '\\325', '\\326', '\\327',\n  '\\330', '\\331', '\\332', '\\333', '\\334', '\\335', '\\336', '\\337',\n  '\\340', '\\341', '\\342', '\\343', '\\344', '\\345', '\\346', '\\347',\n  '\\350', '\\351', '\\352', '\\353', '\\354', '\\355', '\\356', '\\357',\n  '\\360', '\\361', '\\362', '\\363', '\\364', '\\365', '\\366', '\\367',\n  '\\370', '\\371', '\\372', '\\373', '\\374', '\\375', '\\376', '\\377',\n};\n\n#ifdef USE_UPPER_CASE_TABLE\nconst UChar OnigEncAsciiToUpperCaseTable[256] = {\n  '\\000', '\\001', '\\002', '\\003', '\\004', '\\005', '\\006', '\\007',\n  '\\010', '\\011', '\\012', '\\013', '\\014', '\\015', '\\016', '\\017',\n  '\\020', '\\021', '\\022', '\\023', '\\024', '\\025', '\\026', '\\027',\n  '\\030', '\\031', '\\032', '\\033', '\\034', '\\035', '\\036', '\\037',\n  '\\040', '\\041', '\\042', '\\043', '\\044', '\\045', '\\046', '\\047',\n  '\\050', '\\051', '\\052', '\\053', '\\054', '\\055', '\\056', '\\057',\n  '\\060', '\\061', '\\062', '\\063', '\\064', '\\065', '\\066', '\\067',\n  '\\070', '\\071', '\\072', '\\073', '\\074', '\\075', '\\076', '\\077',\n  '\\100', '\\101', '\\102', '\\103', '\\104', '\\105', '\\106', '\\107',\n  '\\110', '\\111', '\\112', '\\113', '\\114', '\\115', '\\116', '\\117',\n  '\\120', '\\121', '\\122', '\\123', '\\124', '\\125', '\\126', '\\127',\n  '\\130', '\\131', '\\132', '\\133', '\\134', '\\135', '\\136', '\\137',\n  '\\140', '\\101', '\\102', '\\103', '\\104', '\\105', '\\106', '\\107',\n  '\\110', '\\111', '\\112', '\\113', '\\114', '\\115', '\\116', '\\117',\n  '\\120', '\\121', '\\122', '\\123', '\\124', '\\125', '\\126', '\\127',\n  '\\130', '\\131', '\\132', '\\173', '\\174', '\\175', '\\176', '\\177',\n  '\\200', '\\201', '\\202', '\\203', '\\204', '\\205', '\\206', '\\207',\n  '\\210', '\\211', '\\212', '\\213', '\\214', '\\215', '\\216', '\\217',\n  '\\220', '\\221', '\\222', '\\223', '\\224', '\\225', '\\226', '\\227',\n  '\\230', '\\231', '\\232', '\\233', '\\234', '\\235', '\\236', '\\237',\n  '\\240', '\\241', '\\242', '\\243', '\\244', '\\245', '\\246', '\\247',\n  '\\250', '\\251', '\\252', '\\253', '\\254', '\\255', '\\256', '\\257',\n  '\\260', '\\261', '\\262', '\\263', '\\264', '\\265', '\\266', '\\267',\n  '\\270', '\\271', '\\272', '\\273', '\\274', '\\275', '\\276', '\\277',\n  '\\300', '\\301', '\\302', '\\303', '\\304', '\\305', '\\306', '\\307',\n  '\\310', '\\311', '\\312', '\\313', '\\314', '\\315', '\\316', '\\317',\n  '\\320', '\\321', '\\322', '\\323', '\\324', '\\325', '\\326', '\\327',\n  '\\330', '\\331', '\\332', '\\333', '\\334', '\\335', '\\336', '\\337',\n  '\\340', '\\341', '\\342', '\\343', '\\344', '\\345', '\\346', '\\347',\n  '\\350', '\\351', '\\352', '\\353', '\\354', '\\355', '\\356', '\\357',\n  '\\360', '\\361', '\\362', '\\363', '\\364', '\\365', '\\366', '\\367',\n  '\\370', '\\371', '\\372', '\\373', '\\374', '\\375', '\\376', '\\377',\n};\n#endif\n\nconst unsigned short OnigEncAsciiCtypeTable[256] = {\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x420c, 0x4209, 0x4208, 0x4208, 0x4208, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008, 0x4008,\n  0x4284, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0, 0x78b0,\n  0x78b0, 0x78b0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x41a0,\n  0x41a0, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x7ca2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2, 0x74a2,\n  0x74a2, 0x74a2, 0x74a2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x51a0,\n  0x41a0, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x78e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2, 0x70e2,\n  0x70e2, 0x70e2, 0x70e2, 0x41a0, 0x41a0, 0x41a0, 0x41a0, 0x4008,\n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\n  0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000\n};\n\nconst UChar OnigEncISO_8859_1_ToLowerCaseTable[256] = {\n  '\\000', '\\001', '\\002', '\\003', '\\004', '\\005', '\\006', '\\007',\n  '\\010', '\\011', '\\012', '\\013', '\\014', '\\015', '\\016', '\\017',\n  '\\020', '\\021', '\\022', '\\023', '\\024', '\\025', '\\026', '\\027',\n  '\\030', '\\031', '\\032', '\\033', '\\034', '\\035', '\\036', '\\037',\n  '\\040', '\\041', '\\042', '\\043', '\\044', '\\045', '\\046', '\\047',\n  '\\050', '\\051', '\\052', '\\053', '\\054', '\\055', '\\056', '\\057',\n  '\\060', '\\061', '\\062', '\\063', '\\064', '\\065', '\\066', '\\067',\n  '\\070', '\\071', '\\072', '\\073', '\\074', '\\075', '\\076', '\\077',\n  '\\100', '\\141', '\\142', '\\143', '\\144', '\\145', '\\146', '\\147',\n  '\\150', '\\151', '\\152', '\\153', '\\154', '\\155', '\\156', '\\157',\n  '\\160', '\\161', '\\162', '\\163', '\\164', '\\165', '\\166', '\\167',\n  '\\170', '\\171', '\\172', '\\133', '\\134', '\\135', '\\136', '\\137',\n  '\\140', '\\141', '\\142', '\\143', '\\144', '\\145', '\\146', '\\147',\n  '\\150', '\\151', '\\152', '\\153', '\\154', '\\155', '\\156', '\\157',\n  '\\160', '\\161', '\\162', '\\163', '\\164', '\\165', '\\166', '\\167',\n  '\\170', '\\171', '\\172', '\\173', '\\174', '\\175', '\\176', '\\177',\n  '\\200', '\\201', '\\202', '\\203', '\\204', '\\205', '\\206', '\\207',\n  '\\210', '\\211', '\\212', '\\213', '\\214', '\\215', '\\216', '\\217',\n  '\\220', '\\221', '\\222', '\\223', '\\224', '\\225', '\\226', '\\227',\n  '\\230', '\\231', '\\232', '\\233', '\\234', '\\235', '\\236', '\\237',\n  '\\240', '\\241', '\\242', '\\243', '\\244', '\\245', '\\246', '\\247',\n  '\\250', '\\251', '\\252', '\\253', '\\254', '\\255', '\\256', '\\257',\n  '\\260', '\\261', '\\262', '\\263', '\\264', '\\265', '\\266', '\\267',\n  '\\270', '\\271', '\\272', '\\273', '\\274', '\\275', '\\276', '\\277',\n  '\\340', '\\341', '\\342', '\\343', '\\344', '\\345', '\\346', '\\347',\n  '\\350', '\\351', '\\352', '\\353', '\\354', '\\355', '\\356', '\\357',\n  '\\360', '\\361', '\\362', '\\363', '\\364', '\\365', '\\366', '\\327',\n  '\\370', '\\371', '\\372', '\\373', '\\374', '\\375', '\\376', '\\337',\n  '\\340', '\\341', '\\342', '\\343', '\\344', '\\345', '\\346', '\\347',\n  '\\350', '\\351', '\\352', '\\353', '\\354', '\\355', '\\356', '\\357',\n  '\\360', '\\361', '\\362', '\\363', '\\364', '\\365', '\\366', '\\367',\n  '\\370', '\\371', '\\372', '\\373', '\\374', '\\375', '\\376', '\\377'\n};\n\n#ifdef USE_UPPER_CASE_TABLE\nconst UChar OnigEncISO_8859_1_ToUpperCaseTable[256] = {\n  '\\000', '\\001', '\\002', '\\003', '\\004', '\\005', '\\006', '\\007',\n  '\\010', '\\011', '\\012', '\\013', '\\014', '\\015', '\\016', '\\017',\n  '\\020', '\\021', '\\022', '\\023', '\\024', '\\025', '\\026', '\\027',\n  '\\030', '\\031', '\\032', '\\033', '\\034', '\\035', '\\036', '\\037',\n  '\\040', '\\041', '\\042', '\\043', '\\044', '\\045', '\\046', '\\047',\n  '\\050', '\\051', '\\052', '\\053', '\\054', '\\055', '\\056', '\\057',\n  '\\060', '\\061', '\\062', '\\063', '\\064', '\\065', '\\066', '\\067',\n  '\\070', '\\071', '\\072', '\\073', '\\074', '\\075', '\\076', '\\077',\n  '\\100', '\\101', '\\102', '\\103', '\\104', '\\105', '\\106', '\\107',\n  '\\110', '\\111', '\\112', '\\113', '\\114', '\\115', '\\116', '\\117',\n  '\\120', '\\121', '\\122', '\\123', '\\124', '\\125', '\\126', '\\127',\n  '\\130', '\\131', '\\132', '\\133', '\\134', '\\135', '\\136', '\\137',\n  '\\140', '\\101', '\\102', '\\103', '\\104', '\\105', '\\106', '\\107',\n  '\\110', '\\111', '\\112', '\\113', '\\114', '\\115', '\\116', '\\117',\n  '\\120', '\\121', '\\122', '\\123', '\\124', '\\125', '\\126', '\\127',\n  '\\130', '\\131', '\\132', '\\173', '\\174', '\\175', '\\176', '\\177',\n  '\\200', '\\201', '\\202', '\\203', '\\204', '\\205', '\\206', '\\207',\n  '\\210', '\\211', '\\212', '\\213', '\\214', '\\215', '\\216', '\\217',\n  '\\220', '\\221', '\\222', '\\223', '\\224', '\\225', '\\226', '\\227',\n  '\\230', '\\231', '\\232', '\\233', '\\234', '\\235', '\\236', '\\237',\n  '\\240', '\\241', '\\242', '\\243', '\\244', '\\245', '\\246', '\\247',\n  '\\250', '\\251', '\\252', '\\253', '\\254', '\\255', '\\256', '\\257',\n  '\\260', '\\261', '\\262', '\\263', '\\264', '\\265', '\\266', '\\267',\n  '\\270', '\\271', '\\272', '\\273', '\\274', '\\275', '\\276', '\\277',\n  '\\300', '\\301', '\\302', '\\303', '\\304', '\\305', '\\306', '\\307',\n  '\\310', '\\311', '\\312', '\\313', '\\314', '\\315', '\\316', '\\317',\n  '\\320', '\\321', '\\322', '\\323', '\\324', '\\325', '\\326', '\\327',\n  '\\330', '\\331', '\\332', '\\333', '\\334', '\\335', '\\336', '\\337',\n  '\\300', '\\301', '\\302', '\\303', '\\304', '\\305', '\\306', '\\307',\n  '\\310', '\\311', '\\312', '\\313', '\\314', '\\315', '\\316', '\\317',\n  '\\320', '\\321', '\\322', '\\323', '\\324', '\\325', '\\326', '\\367',\n  '\\330', '\\331', '\\332', '\\333', '\\334', '\\335', '\\336', '\\377',\n};\n#endif\n\nextern void\nonigenc_set_default_caseconv_table(const UChar* table ARG_UNUSED)\n{\n  /* nothing */\n  /* obsoleted. */\n}\n\nextern UChar*\nonigenc_get_left_adjust_char_head(OnigEncoding enc, const UChar* start, const UChar* s)\n{\n  return ONIGENC_LEFT_ADJUST_CHAR_HEAD(enc, start, s);\n}\n\nextern OnigPosition\nonigenc_get_left_adjust_char_head_se(OnigIterator* it, OnigEncoding enc, OnigPosition start, OnigPosition s)\n{\n  return ONIGENC_LEFT_ADJUST_CHAR_HEAD_SE(it, enc, start, s);\n}\n\nconst OnigPairCaseFoldCodes OnigAsciiLowerMap[] = {\n  { 0x41, 0x61 },\n  { 0x42, 0x62 },\n  { 0x43, 0x63 },\n  { 0x44, 0x64 },\n  { 0x45, 0x65 },\n  { 0x46, 0x66 },\n  { 0x47, 0x67 },\n  { 0x48, 0x68 },\n  { 0x49, 0x69 },\n  { 0x4a, 0x6a },\n  { 0x4b, 0x6b },\n  { 0x4c, 0x6c },\n  { 0x4d, 0x6d },\n  { 0x4e, 0x6e },\n  { 0x4f, 0x6f },\n  { 0x50, 0x70 },\n  { 0x51, 0x71 },\n  { 0x52, 0x72 },\n  { 0x53, 0x73 },\n  { 0x54, 0x74 },\n  { 0x55, 0x75 },\n  { 0x56, 0x76 },\n  { 0x57, 0x77 },\n  { 0x58, 0x78 },\n  { 0x59, 0x79 },\n  { 0x5a, 0x7a }\n};\n\nextern int\nonigenc_ascii_apply_all_case_fold(OnigCaseFoldType flag ARG_UNUSED,\n\t\t\t\t  OnigApplyAllCaseFoldFunc f, void* arg)\n{\n  OnigCodePoint code;\n  int i, r;\n\n  for (i = 0;\n       i < (int )(sizeof(OnigAsciiLowerMap)/sizeof(OnigPairCaseFoldCodes));\n       i++) {\n    code = OnigAsciiLowerMap[i].to;\n    r = (*f)(OnigAsciiLowerMap[i].from, &code, 1, arg);\n    if (r != 0) return r;\n\n    code = OnigAsciiLowerMap[i].from;\n    r = (*f)(OnigAsciiLowerMap[i].to, &code, 1, arg);\n    if (r != 0) return r;\n  }\n\n  return 0;\n}\n\nextern int\nonigenc_ascii_get_case_fold_codes_by_str(OnigCaseFoldType flag ARG_UNUSED,\n\t const OnigUChar* p, const OnigUChar* end ARG_UNUSED,\n\t OnigCaseFoldCodeItem items[])\n{\n  if (0x41 <= *p && *p <= 0x5a) {\n    items[0].byte_len = 1;\n    items[0].code_len = 1;\n    items[0].code[0] = (OnigCodePoint )(*p + 0x20);\n    return 1;\n  }\n  else if (0x61 <= *p && *p <= 0x7a) {\n    items[0].byte_len = 1;\n    items[0].code_len = 1;\n    items[0].code[0] = (OnigCodePoint )(*p - 0x20);\n    return 1;\n  }\n  else\n    return 0;\n}\n\nstatic int\nss_apply_all_case_fold(OnigCaseFoldType flag ARG_UNUSED,\n\t\t       OnigApplyAllCaseFoldFunc f, void* arg)\n{\n  static OnigCodePoint ss[] = { 0x73, 0x73 };\n\n  return (*f)((OnigCodePoint )0xdf, ss, 2, arg);\n}\n\nextern int\nonigenc_apply_all_case_fold_with_map(int map_size,\n    const OnigPairCaseFoldCodes map[],\n    int ess_tsett_flag, OnigCaseFoldType flag,\n    OnigApplyAllCaseFoldFunc f, void* arg)\n{\n  OnigCodePoint code;\n  int i, r;\n\n  r = onigenc_ascii_apply_all_case_fold(flag, f, arg);\n  if (r != 0) return r;\n\n  for (i = 0; i < map_size; i++) {\n    code = map[i].to;\n    r = (*f)(map[i].from, &code, 1, arg);\n    if (r != 0) return r;\n\n    code = map[i].from;\n    r = (*f)(map[i].to, &code, 1, arg);\n    if (r != 0) return r;\n  }\n\n  if (ess_tsett_flag != 0)\n    return ss_apply_all_case_fold(flag, f, arg);\n\n  return 0;\n}\n\nextern int\nonigenc_get_case_fold_codes_by_str_with_map(int map_size,\n    const OnigPairCaseFoldCodes map[],\n    int ess_tsett_flag, OnigCaseFoldType flag ARG_UNUSED,\n    const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem items[])\n{\n  if (0x41 <= *p && *p <= 0x5a) {\n    items[0].byte_len = 1;\n    items[0].code_len = 1;\n    items[0].code[0] = (OnigCodePoint )(*p + 0x20);\n    if (*p == 0x53 && ess_tsett_flag != 0 && end > p + 1\n\t&& (*(p+1) == 0x53 || *(p+1) == 0x73)) {\n      /* SS */\n      items[1].byte_len = 2;\n      items[1].code_len = 1;\n      items[1].code[0] = (OnigCodePoint )0xdf;\n      return 2;\n    }\n    else\n      return 1;\n  }\n  else if (0x61 <= *p && *p <= 0x7a) {\n    items[0].byte_len = 1;\n    items[0].code_len = 1;\n    items[0].code[0] = (OnigCodePoint )(*p - 0x20);\n    if (*p == 0x73 && ess_tsett_flag != 0 && end > p + 1\n\t&& (*(p+1) == 0x73 || *(p+1) == 0x53)) {\n      /* ss */\n      items[1].byte_len = 2;\n      items[1].code_len = 1;\n      items[1].code[0] = (OnigCodePoint )0xdf;\n      return 2;\n    }\n    else\n      return 1;\n  }\n  else if (*p == 0xdf && ess_tsett_flag != 0) {\n    items[0].byte_len = 1;\n    items[0].code_len = 2;\n    items[0].code[0] = (OnigCodePoint )'s';\n    items[0].code[1] = (OnigCodePoint )'s';\n\n    items[1].byte_len = 1;\n    items[1].code_len = 2;\n    items[1].code[0] = (OnigCodePoint )'S';\n    items[1].code[1] = (OnigCodePoint )'S';\n\n    items[2].byte_len = 1;\n    items[2].code_len = 2;\n    items[2].code[0] = (OnigCodePoint )'s';\n    items[2].code[1] = (OnigCodePoint )'S';\n\n    items[3].byte_len = 1;\n    items[3].code_len = 2;\n    items[3].code[0] = (OnigCodePoint )'S';\n    items[3].code[1] = (OnigCodePoint )'s';\n\n    return 4;\n  }\n  else {\n    int i;\n\n    for (i = 0; i < map_size; i++) {\n      if (*p == map[i].from) {\n\titems[0].byte_len = 1;\n\titems[0].code_len = 1;\n\titems[0].code[0] = map[i].to;\n\treturn 1;\n      }\n      else if (*p == map[i].to) {\n\titems[0].byte_len = 1;\n\titems[0].code_len = 1;\n\titems[0].code[0] = map[i].from;\n\treturn 1;\n      }\n    }\n  }\n\n  return 0;\n}\n\n\nextern int\nonigenc_not_support_get_ctype_code_range(OnigCtype ctype ARG_UNUSED,\n\t OnigCodePoint* sb_out ARG_UNUSED,\n\t const OnigCodePoint* ranges[] ARG_UNUSED)\n{\n  return ONIG_NO_SUPPORT_CONFIG;\n}\n\nextern int\nonigenc_is_mbc_newline_0x0a(const UChar* p, const UChar* end)\n{\n  if (p < end) {\n    if (*p == 0x0a) return 1;\n  }\n  return 0;\n}\n\nextern int\nonigenc_is_mbc_newline_0x0a_se(OnigIterator* it, OnigPosition p, OnigPosition end)\n{\n  if (p < end) {\n    if (ONIG_CHARAT(p) == 0x0a) return 1;\n  }\n  return 0;\n}\n\n/* for single byte encodings */\nextern int\nonigenc_ascii_mbc_case_fold(OnigCaseFoldType flag ARG_UNUSED, const UChar** p,\n\t    const UChar*end ARG_UNUSED, UChar* lower)\n{\n  *lower = ONIGENC_ASCII_CODE_TO_LOWER_CASE(**p);\n\n  (*p)++;\n  return 1; /* return byte length of converted char to lower */\n}\n\n/* for single byte encodings */\nextern int\nonigenc_ascii_mbc_case_fold_se(OnigIterator* it, OnigCaseFoldType flag ARG_UNUSED, OnigPosition* p,\n\t    OnigPosition end ARG_UNUSED, UChar* lower)\n{\n  *lower = ONIGENC_ASCII_CODE_TO_LOWER_CASE(ONIG_CHARAT(*p));\n\n  (*p)++;\n  return 1; /* return byte length of converted char to lower */\n}\n\n#if 0\nextern int\nonigenc_ascii_is_mbc_ambiguous(OnigCaseFoldType flag,\n\t\t\t       const UChar** pp, const UChar* end)\n{\n  const UChar* p = *pp;\n\n  (*pp)++;\n  return ONIGENC_IS_ASCII_CODE_CASE_AMBIG(*p);\n}\n#endif\n\nextern int\nonigenc_single_byte_mbc_enc_len(const UChar* p ARG_UNUSED)\n{\n  return 1;\n}\n\nextern int\nonigenc_single_byte_mbc_enc_len_se(OnigIterator* it ARG_UNUSED, OnigPosition p ARG_UNUSED)\n{\n  return 1;\n}\n\nextern OnigCodePoint\nonigenc_single_byte_mbc_to_code(const UChar* p, const UChar* end ARG_UNUSED)\n{\n  return (OnigCodePoint )(*p);\n}\n\nextern OnigCodePoint\nonigenc_single_byte_mbc_to_code_se(OnigIterator* it, OnigPosition p, OnigPosition end ARG_UNUSED)\n{\n  return (OnigCodePoint )(ONIG_CHARAT(p));\n}\n\nextern int\nonigenc_single_byte_code_to_mbclen(OnigCodePoint code ARG_UNUSED)\n{\n  return (code < 0x100 ? 1 : ONIGERR_INVALID_CODE_POINT_VALUE);\n}\n\nextern int\nonigenc_single_byte_code_to_mbc(OnigCodePoint code, UChar *buf)\n{\n  *buf = (UChar )(code & 0xff);\n  return 1;\n}\n\nextern UChar*\nonigenc_single_byte_left_adjust_char_head(const UChar* start ARG_UNUSED,\n\t\t\t\t\t  const UChar* s)\n{\n  return (UChar* )s;\n}\n\nextern OnigPosition\nonigenc_single_byte_left_adjust_char_head_se(OnigIterator* it ARG_UNUSED, OnigPosition start ARG_UNUSED,\n\t\t\t\t\t  OnigPosition s)\n{\n  return s;\n}\n\nextern int\nonigenc_always_true_is_allowed_reverse_match(const UChar* s   ARG_UNUSED,\n\t\t\t\t\t     const UChar* end ARG_UNUSED)\n{\n  return TRUE;\n}\n\nextern int\nonigenc_always_false_is_allowed_reverse_match(const UChar* s   ARG_UNUSED,\n\t\t\t\t\t      const UChar* end ARG_UNUSED)\n{\n  return FALSE;\n}\n\nextern int\nonigenc_ascii_is_code_ctype(OnigCodePoint code, unsigned int ctype)\n{\n  if (code < 128)\n    return ONIGENC_IS_ASCII_CODE_CTYPE(code, ctype);\n  else\n    return FALSE;\n}\n\nextern OnigCodePoint\nonigenc_mbn_mbc_to_code(OnigEncoding enc, const UChar* p, const UChar* end)\n{\n  int c, i, len;\n  OnigCodePoint n;\n\n  len = enclen(enc, p);\n  n = (OnigCodePoint )(*p++);\n  if (len == 1) return n;\n\n  for (i = 1; i < len; i++) {\n    if (p >= end) break;\n    c = *p++;\n    n <<= 8;  n += c;\n  }\n  return n;\n}\n\nextern OnigCodePoint\nonigenc_mbn_mbc_to_code_se(OnigIterator* it, OnigEncoding enc, OnigPosition p, OnigPosition end)\n{\n  int c, i, len;\n  OnigCodePoint n;\n\n  len = enclen_se(it, enc, p);\n  n = (OnigCodePoint )(ONIG_CHARAT(p++));\n  if (len == 1) return n;\n\n  for (i = 1; i < len; i++) {\n    if (p >= end) break;\n    c = ONIG_CHARAT(p++);\n    n <<= 8;  n += c;\n  }\n  return n;\n}\n\nextern int\nonigenc_mbn_mbc_case_fold(OnigEncoding enc, OnigCaseFoldType flag ARG_UNUSED,\n                          const UChar** pp, const UChar* end ARG_UNUSED,\n\t\t\t  UChar* lower)\n{\n  int len;\n  const UChar *p = *pp;\n\n  if (ONIGENC_IS_MBC_ASCII(p)) {\n    *lower = ONIGENC_ASCII_CODE_TO_LOWER_CASE(*p);\n    (*pp)++;\n    return 1;\n  }\n  else {\n    int i;\n\n    len = enclen(enc, p);\n    for (i = 0; i < len; i++) {\n      *lower++ = *p++;\n    }\n    (*pp) += len;\n    return len; /* return byte length of converted to lower char */\n  }\n}\n\nextern int\nonigenc_mbn_mbc_case_fold_se(OnigIterator* it, OnigEncoding enc, OnigCaseFoldType flag ARG_UNUSED,\n                          OnigPosition* pp, OnigPosition end ARG_UNUSED,\n\t\t\t  UChar* lower)\n{\n  int len;\n  OnigPosition p = *pp;\n  const UChar c = ONIG_CHARAT(*pp);\n\n  if (ONIGENC_IS_MBC_ASCII_SE(c)) {\n    *lower = ONIGENC_ASCII_CODE_TO_LOWER_CASE(c);\n    (*pp)++;\n    return 1;\n  }\n  else {\n    int i;\n\n    len = enclen_se(it, enc, p);\n    for (i = 0; i < len; i++) {\n      *lower++ = ONIG_CHARAT(p++);\n    }\n    (*pp) += len;\n    return len; /* return byte length of converted to lower char */\n  }\n}\n\n#if 0\nextern int\nonigenc_mbn_is_mbc_ambiguous(OnigEncoding enc, OnigCaseFoldType flag,\n                             const UChar** pp, const UChar* end)\n{\n  const UChar* p = *pp;\n\n  if (ONIGENC_IS_MBC_ASCII(p)) {\n    (*pp)++;\n    return ONIGENC_IS_ASCII_CODE_CASE_AMBIG(*p);\n  }\n\n  (*pp) += enclen(enc, p);\n  return FALSE;\n}\n#endif\n\nextern int\nonigenc_mb2_code_to_mbclen(OnigCodePoint code)\n{\n  if ((code & 0xff00) != 0) return 2;\n  else return 1;\n}\n\nextern int\nonigenc_mb4_code_to_mbclen(OnigCodePoint code)\n{\n       if ((code & 0xff000000) != 0) return 4;\n  else if ((code & 0xff0000) != 0) return 3;\n  else if ((code & 0xff00) != 0) return 2;\n  else return 1;\n}\n\nextern int\nonigenc_mb2_code_to_mbc(OnigEncoding enc, OnigCodePoint code, UChar *buf)\n{\n  UChar *p = buf;\n\n  if ((code & 0xff00) != 0) {\n    *p++ = (UChar )((code >>  8) & 0xff);\n  }\n  *p++ = (UChar )(code & 0xff);\n\n#if 1\n  if (enclen(enc, buf) != (p - buf))\n    return ONIGERR_INVALID_CODE_POINT_VALUE;\n#endif\n  return (int )(p - buf);\n}\n\nextern int\nonigenc_mb4_code_to_mbc(OnigEncoding enc, OnigCodePoint code, UChar *buf)\n{\n  UChar *p = buf;\n\n  if ((code & 0xff000000) != 0) {\n    *p++ = (UChar )((code >> 24) & 0xff);\n  }\n  if ((code & 0xff0000) != 0 || p != buf) {\n    *p++ = (UChar )((code >> 16) & 0xff);\n  }\n  if ((code & 0xff00) != 0 || p != buf) {\n    *p++ = (UChar )((code >> 8) & 0xff);\n  }\n  *p++ = (UChar )(code & 0xff);\n\n#if 1\n  if (enclen(enc, buf) != (p - buf))\n    return ONIGERR_INVALID_CODE_POINT_VALUE;\n#endif\n  return (int )(p - buf);\n}\n\nextern int\nonigenc_minimum_property_name_to_ctype(OnigEncoding enc, UChar* p, UChar* end)\n{\n  static const PosixBracketEntryType PBS[] = {\n    { (UChar* )\"Alnum\",  ONIGENC_CTYPE_ALNUM,  5 },\n    { (UChar* )\"Alpha\",  ONIGENC_CTYPE_ALPHA,  5 },\n    { (UChar* )\"Blank\",  ONIGENC_CTYPE_BLANK,  5 },\n    { (UChar* )\"Cntrl\",  ONIGENC_CTYPE_CNTRL,  5 },\n    { (UChar* )\"Digit\",  ONIGENC_CTYPE_DIGIT,  5 },\n    { (UChar* )\"Graph\",  ONIGENC_CTYPE_GRAPH,  5 },\n    { (UChar* )\"Lower\",  ONIGENC_CTYPE_LOWER,  5 },\n    { (UChar* )\"Print\",  ONIGENC_CTYPE_PRINT,  5 },\n    { (UChar* )\"Punct\",  ONIGENC_CTYPE_PUNCT,  5 },\n    { (UChar* )\"Space\",  ONIGENC_CTYPE_SPACE,  5 },\n    { (UChar* )\"Upper\",  ONIGENC_CTYPE_UPPER,  5 },\n    { (UChar* )\"XDigit\", ONIGENC_CTYPE_XDIGIT, 6 },\n    { (UChar* )\"ASCII\",  ONIGENC_CTYPE_ASCII,  5 },\n    { (UChar* )\"Word\",   ONIGENC_CTYPE_WORD,   4 },\n    { (UChar* )NULL, -1, 0 }\n  };\n\n  const PosixBracketEntryType *pb;\n  int len;\n\n  len = onigenc_strlen(enc, p, end);\n  for (pb = PBS; IS_NOT_NULL(pb->name); pb++) {\n    if (len == pb->len &&\n        onigenc_with_ascii_strnicmp(enc, p, end, pb->name, pb->len) == 0)\n      return pb->ctype;\n  }\n\n  return ONIGERR_INVALID_CHAR_PROPERTY_NAME;\n}\n\nextern int\nonigenc_mb2_is_code_ctype(OnigEncoding enc, OnigCodePoint code,\n\t\t\t  unsigned int ctype)\n{\n  if (code < 128)\n    return ONIGENC_IS_ASCII_CODE_CTYPE(code, ctype);\n  else {\n    if (CTYPE_IS_WORD_GRAPH_PRINT(ctype)) {\n      return (ONIGENC_CODE_TO_MBCLEN(enc, code) > 1 ? TRUE : FALSE);\n    }\n  }\n\n  return FALSE;\n}\n\nextern int\nonigenc_mb4_is_code_ctype(OnigEncoding enc, OnigCodePoint code,\n\t\t\t  unsigned int ctype)\n{\n  if (code < 128)\n    return ONIGENC_IS_ASCII_CODE_CTYPE(code, ctype);\n  else {\n    if (CTYPE_IS_WORD_GRAPH_PRINT(ctype)) {\n      return (ONIGENC_CODE_TO_MBCLEN(enc, code) > 1 ? TRUE : FALSE);\n    }\n  }\n\n  return FALSE;\n}\n\nextern int\nonigenc_with_ascii_strncmp(OnigEncoding enc, const UChar* p, const UChar* end,\n                           const UChar* sascii /* ascii */, int n)\n{\n  int x, c;\n\n  while (n-- > 0) {\n    if (p >= end) return (int )(*sascii);\n\n    c = (int )ONIGENC_MBC_TO_CODE(enc, p, end);\n    x = *sascii - c;\n    if (x) return x;\n\n    sascii++;\n    p += enclen(enc, p);\n  }\n  return 0;\n}\n\nextern int\nonigenc_with_ascii_strnicmp(OnigEncoding enc, const UChar* p, const UChar* end,\n                            const UChar* sascii /* ascii */, int n)\n{\n  int x, c;\n\n  while (n-- > 0) {\n    if (p >= end) return (int )(*sascii);\n\n    c = (int )ONIGENC_MBC_TO_CODE(enc, p, end);\n    if (ONIGENC_IS_ASCII_CODE(c))\n      c = ONIGENC_ASCII_CODE_TO_LOWER_CASE(c);\n    x = ONIGENC_ASCII_CODE_TO_LOWER_CASE(*sascii) - c;\n    if (x) return x;\n\n    sascii++;\n    p += enclen(enc, p);\n  }\n  return 0;\n}\n\n/* Property management */\nstatic int\nresize_property_list(int new_size, const OnigCodePoint*** plist, int* psize)\n{\n  size_t size;\n  const OnigCodePoint **list = *plist;\n\n  size = sizeof(OnigCodePoint*) * new_size;\n  if (IS_NULL(list)) {\n    list = (const OnigCodePoint** )xmalloc(size);\n  }\n  else {\n    list = (const OnigCodePoint** )xrealloc((void* )list, size);\n  }\n\n  if (IS_NULL(list)) return ONIGERR_MEMORY;\n\n  *plist = list;\n  *psize = new_size;\n\n  return 0;\n}\n\nextern int\nonigenc_property_list_add_property(UChar* name, const OnigCodePoint* prop,\n     hash_table_type **table, const OnigCodePoint*** plist, int *pnum,\n     int *psize)\n{\n#define PROP_INIT_SIZE     16\n\n  int r;\n\n  if (*psize <= *pnum) {\n    int new_size = (*psize == 0 ? PROP_INIT_SIZE : *psize * 2);\n    r = resize_property_list(new_size, plist, psize);\n    if (r != 0) return r;\n  }\n\n  (*plist)[*pnum] = prop;\n\n  if (ONIG_IS_NULL(*table)) {\n    *table = onig_st_init_strend_table_with_size(PROP_INIT_SIZE);\n    if (ONIG_IS_NULL(*table)) return ONIGERR_MEMORY;\n  }\n\n  *pnum = *pnum + 1;\n  onig_st_insert_strend(*table, name, name + strlen((char* )name),\n\t\t\t(hash_data_type )(*pnum + ONIGENC_MAX_STD_CTYPE));\n  return 0;\n}\n\nextern int\nonigenc_property_list_init(int (*f)(void))\n{\n  int r;\n\n  THREAD_ATOMIC_START;\n\n  r = f();\n\n  THREAD_ATOMIC_END;\n  return r;\n}\n"
  },
  {
    "path": "src/Onigmo/regenc.h",
    "content": "#ifndef REGENC_H\n#define REGENC_H\n/**********************************************************************\n  regenc.h -  Onigmo (Oniguruma-mod) (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2008  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * Copyright (c) 2011       K.Takata  <kentkt AT csc DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#ifndef PACKAGE\n/* PACKAGE is defined in config.h */\n#include \"config.h\"\n#endif\n\n#ifdef ONIG_ESCAPE_UCHAR_COLLISION\n#undef ONIG_ESCAPE_UCHAR_COLLISION\n#endif\n\n#include \"oniguruma.h\"\n\ntypedef struct {\n  OnigCodePoint from;\n  OnigCodePoint to;\n} OnigPairCaseFoldCodes;\n\n\n#ifndef NULL\n#define NULL   ((void* )0)\n#endif\n\n#ifndef TRUE\n#define TRUE    1\n#endif\n\n#ifndef FALSE\n#define FALSE   0\n#endif\n\n#ifndef ARG_UNUSED\n#if defined(__GNUC__)\n#  define ARG_UNUSED  __attribute__ ((unused))\n#else\n#  define ARG_UNUSED\n#endif\n#endif\n\n#define ONIG_IS_NULL(p)                    (((void*)(p)) == (void*)0)\n#define ONIG_IS_NOT_NULL(p)                (((void*)(p)) != (void*)0)\n#define ONIG_CHECK_NULL_RETURN(p)          if (ONIG_IS_NULL(p)) return NULL\n#define ONIG_CHECK_NULL_RETURN_VAL(p,val)  if (ONIG_IS_NULL(p)) return (val)\n\n#define enclen(enc,p)      ONIGENC_MBC_ENC_LEN(enc,p)\n#define enclen_se(it,enc,p)   ONIGENC_MBC_ENC_LEN_SE(it,enc,p)\n\n/* character types bit flag */\n#define BIT_CTYPE_NEWLINE  (1<< ONIGENC_CTYPE_NEWLINE)\n#define BIT_CTYPE_ALPHA    (1<< ONIGENC_CTYPE_ALPHA)\n#define BIT_CTYPE_BLANK    (1<< ONIGENC_CTYPE_BLANK)\n#define BIT_CTYPE_CNTRL    (1<< ONIGENC_CTYPE_CNTRL)\n#define BIT_CTYPE_DIGIT    (1<< ONIGENC_CTYPE_DIGIT)\n#define BIT_CTYPE_GRAPH    (1<< ONIGENC_CTYPE_GRAPH)\n#define BIT_CTYPE_LOWER    (1<< ONIGENC_CTYPE_LOWER)\n#define BIT_CTYPE_PRINT    (1<< ONIGENC_CTYPE_PRINT)\n#define BIT_CTYPE_PUNCT    (1<< ONIGENC_CTYPE_PUNCT)\n#define BIT_CTYPE_SPACE    (1<< ONIGENC_CTYPE_SPACE)\n#define BIT_CTYPE_UPPER    (1<< ONIGENC_CTYPE_UPPER)\n#define BIT_CTYPE_XDIGIT   (1<< ONIGENC_CTYPE_XDIGIT)\n#define BIT_CTYPE_WORD     (1<< ONIGENC_CTYPE_WORD)\n#define BIT_CTYPE_ALNUM    (1<< ONIGENC_CTYPE_ALNUM)\n#define BIT_CTYPE_ASCII    (1<< ONIGENC_CTYPE_ASCII)\n\n#define CTYPE_TO_BIT(ctype)  (1<<(ctype))\n#define CTYPE_IS_WORD_GRAPH_PRINT(ctype) \\\n  ((ctype) == ONIGENC_CTYPE_WORD || (ctype) == ONIGENC_CTYPE_GRAPH ||\\\n   (ctype) == ONIGENC_CTYPE_PRINT)\n\n\ntypedef struct {\n  const UChar *name;\n  int       ctype;\n  short int len;\n} PosixBracketEntryType;\n\n\n#define USE_CRNL_AS_LINE_TERMINATOR\n#define USE_UNICODE_PROPERTIES\n/* #define USE_UNICODE_CASE_FOLD_TURKISH_AZERI */\n#define USE_UNICODE_ALL_LINE_TERMINATORS  /* see Unicode.org UTS #18 */\n\n\n#define ONIG_ENCODING_INIT_DEFAULT           ONIG_ENCODING_ASCII\n\n/* for encoding system implementation (internal) */\nONIG_EXTERN int onigenc_ascii_apply_all_case_fold P_((OnigCaseFoldType flag, OnigApplyAllCaseFoldFunc f, void* arg));\nONIG_EXTERN int onigenc_ascii_get_case_fold_codes_by_str P_((OnigCaseFoldType flag, const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem items[]));\nONIG_EXTERN int onigenc_apply_all_case_fold_with_map P_((int map_size, const OnigPairCaseFoldCodes map[], int ess_tsett_flag, OnigCaseFoldType flag, OnigApplyAllCaseFoldFunc f, void* arg));\nONIG_EXTERN int onigenc_get_case_fold_codes_by_str_with_map P_((int map_size, const OnigPairCaseFoldCodes map[], int ess_tsett_flag, OnigCaseFoldType flag, const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem items[]));\nONIG_EXTERN int onigenc_not_support_get_ctype_code_range P_((OnigCtype ctype, OnigCodePoint* sb_out, const OnigCodePoint* ranges[]));\nONIG_EXTERN int onigenc_is_mbc_newline_0x0a P_((const UChar* p, const UChar* end));\nONIG_EXTERN int onigenc_is_mbc_newline_0x0a_se P_((OnigIterator* it, OnigPosition p, OnigPosition end));\n\n\n/* methods for single byte encoding */\nONIG_EXTERN int onigenc_ascii_mbc_case_fold P_((OnigCaseFoldType flag, const UChar** p, const UChar* end, UChar* lower));\nONIG_EXTERN int onigenc_ascii_mbc_case_fold_se P_((OnigIterator* it, OnigCaseFoldType flag, OnigPosition* p, OnigPosition end, UChar* lower));\nONIG_EXTERN int onigenc_single_byte_mbc_enc_len P_((const UChar* p));\nONIG_EXTERN int onigenc_single_byte_mbc_enc_len_se P_((OnigIterator* it, OnigPosition p));\nONIG_EXTERN OnigCodePoint onigenc_single_byte_mbc_to_code P_((const UChar* p, const UChar* end));\nONIG_EXTERN OnigCodePoint onigenc_single_byte_mbc_to_code_se P_((OnigIterator* it, OnigPosition p, OnigPosition end));\nONIG_EXTERN int onigenc_single_byte_code_to_mbclen P_((OnigCodePoint code));\nONIG_EXTERN int onigenc_single_byte_code_to_mbc P_((OnigCodePoint code, UChar *buf));\nONIG_EXTERN UChar* onigenc_single_byte_left_adjust_char_head P_((const UChar* start, const UChar* s));\nONIG_EXTERN OnigPosition onigenc_single_byte_left_adjust_char_head_se P_((OnigIterator* it, OnigPosition start, OnigPosition s));\nONIG_EXTERN int onigenc_always_true_is_allowed_reverse_match P_((const UChar* s, const UChar* end));\nONIG_EXTERN int onigenc_always_false_is_allowed_reverse_match P_((const UChar* s, const UChar* end));\nONIG_EXTERN int onigenc_ascii_is_code_ctype P_((OnigCodePoint code, unsigned int ctype));\n\n/* methods for multi byte encoding */\nONIG_EXTERN OnigCodePoint onigenc_mbn_mbc_to_code P_((OnigEncoding enc, const UChar* p, const UChar* end));\nONIG_EXTERN OnigCodePoint onigenc_mbn_mbc_to_code_se P_((OnigIterator* it, OnigEncoding enc, OnigPosition p, OnigPosition end));\nONIG_EXTERN int onigenc_mbn_mbc_case_fold P_((OnigEncoding enc, OnigCaseFoldType flag, const UChar** p, const UChar* end, UChar* lower));\nONIG_EXTERN int onigenc_mbn_mbc_case_fold_se P_((OnigIterator* it, OnigEncoding enc, OnigCaseFoldType flag, OnigPosition* p, OnigPosition end, UChar* lower));\nONIG_EXTERN int onigenc_mb2_code_to_mbclen P_((OnigCodePoint code));\nONIG_EXTERN int onigenc_mb2_code_to_mbc P_((OnigEncoding enc, OnigCodePoint code, UChar *buf));\nONIG_EXTERN int onigenc_minimum_property_name_to_ctype P_((OnigEncoding enc, UChar* p, UChar* end));\nONIG_EXTERN int onigenc_unicode_property_name_to_ctype P_((OnigEncoding enc, UChar* p, UChar* end));\nONIG_EXTERN int onigenc_mb2_is_code_ctype P_((OnigEncoding enc, OnigCodePoint code, unsigned int ctype));\nONIG_EXTERN int onigenc_mb4_code_to_mbclen P_((OnigCodePoint code));\nONIG_EXTERN int onigenc_mb4_code_to_mbc P_((OnigEncoding enc, OnigCodePoint code, UChar *buf));\nONIG_EXTERN int onigenc_mb4_is_code_ctype P_((OnigEncoding enc, OnigCodePoint code, unsigned int ctype));\n\n\n/* in enc/unicode.c */\nONIG_EXTERN const OnigCodePoint* onigenc_unicode_code_script P_((OnigCodePoint code));\nONIG_EXTERN int onigenc_unicode_is_code_ctype P_((OnigCodePoint code, unsigned int ctype));\nONIG_EXTERN int onigenc_utf16_32_get_ctype_code_range P_((OnigCtype ctype, OnigCodePoint *sb_out, const OnigCodePoint* ranges[]));\nONIG_EXTERN int onigenc_unicode_ctype_code_range P_((int ctype, const OnigCodePoint* ranges[]));\nONIG_EXTERN int onigenc_unicode_get_case_fold_codes_by_str P_((OnigEncoding enc, OnigCaseFoldType flag, const OnigUChar* p, const OnigUChar* end, OnigCaseFoldCodeItem items[]));\nONIG_EXTERN int onigenc_unicode_mbc_case_fold P_((OnigEncoding enc, OnigCaseFoldType flag, const UChar** pp, const UChar* end, UChar* fold));\nONIG_EXTERN int onigenc_unicode_mbc_case_fold_se P_((OnigIterator* it, OnigEncoding enc, OnigCaseFoldType flag, OnigPosition* pp, OnigPosition end, UChar* fold));\nONIG_EXTERN int onigenc_unicode_apply_all_case_fold P_((OnigCaseFoldType flag, OnigApplyAllCaseFoldFunc f, void* arg));\n\n\n#define UTF16_IS_SURROGATE_FIRST(c)    (((c) & 0xfc) == 0xd8)\n#define UTF16_IS_SURROGATE_SECOND(c)   (((c) & 0xfc) == 0xdc)\n\n#define ONIGENC_ISO_8859_1_TO_LOWER_CASE(c) \\\n  OnigEncISO_8859_1_ToLowerCaseTable[c]\n#define ONIGENC_ISO_8859_1_TO_UPPER_CASE(c) \\\n  OnigEncISO_8859_1_ToUpperCaseTable[c]\n\nONIG_EXTERN const UChar OnigEncISO_8859_1_ToLowerCaseTable[];\nONIG_EXTERN const UChar OnigEncISO_8859_1_ToUpperCaseTable[];\n\nONIG_EXTERN int\nonigenc_with_ascii_strncmp P_((OnigEncoding enc, const UChar* p, const UChar* end, const UChar* sascii /* ascii */, int n));\nONIG_EXTERN int\nonigenc_with_ascii_strnicmp P_((OnigEncoding enc, const UChar* p, const UChar* end, const UChar* sascii /* ascii */, int n));\nONIG_EXTERN UChar*\nonigenc_step P_((OnigEncoding enc, const UChar* p, const UChar* end, int n));\n\n/* defined in regexec.c, but used in enc/xxx.c */\nextern int  onig_is_in_code_range P_((const UChar* p, OnigCodePoint code));\n\nONIG_EXTERN OnigEncoding  OnigEncDefaultCharEncoding;\nONIG_EXTERN const UChar  OnigEncAsciiToLowerCaseTable[];\nONIG_EXTERN const UChar  OnigEncAsciiToUpperCaseTable[];\nONIG_EXTERN const unsigned short OnigEncAsciiCtypeTable[];\n\n#define ONIGENC_IS_ASCII_CODE(code)  ((code) < 0x80)\n#define ONIGENC_ASCII_CODE_TO_LOWER_CASE(c) OnigEncAsciiToLowerCaseTable[c]\n#define ONIGENC_ASCII_CODE_TO_UPPER_CASE(c) OnigEncAsciiToUpperCaseTable[c]\n#define ONIGENC_IS_ASCII_CODE_CTYPE(code,ctype) \\\n  ((OnigEncAsciiCtypeTable[code] & CTYPE_TO_BIT(ctype)) != 0)\n#define ONIGENC_IS_ASCII_CODE_CASE_AMBIG(code) \\\n (ONIGENC_IS_ASCII_CODE_CTYPE(code, ONIGENC_CTYPE_UPPER) ||\\\n  ONIGENC_IS_ASCII_CODE_CTYPE(code, ONIGENC_CTYPE_LOWER))\n\n/* Check if the code is in the range. (from <= code && code <= to) */\n#define ONIGENC_IS_IN_RANGE(code, from, to) \\\n  ((OnigCodePoint )((code) - (from)) <= (OnigCodePoint )((to) - (from)))\n\n\n#endif /* REGENC_H */\n"
  },
  {
    "path": "src/Onigmo/regerror.c",
    "content": "/**********************************************************************\n  regerror.c -  Onigmo (Oniguruma-mod) (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2007  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * Copyright (c) 2011       K.Takata  <kentkt AT csc DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regint.h\"\n#include <stdio.h> /* for vsnprintf() */\n\n#ifdef HAVE_STDARG_PROTOTYPES\n#include <stdarg.h>\n#define va_init_list(a,b) va_start(a,b)\n#else\n#include <varargs.h>\n#define va_init_list(a,b) va_start(a)\n#endif\n\nextern UChar*\nonig_error_code_to_format(OnigPosition code)\n{\n  const char *p;\n\n  if (code >= 0) return (UChar* )0;\n\n  switch (code) {\n  case ONIG_MISMATCH:\n    p = \"mismatch\"; break;\n  case ONIG_NO_SUPPORT_CONFIG:\n    p = \"no support in this configuration\"; break;\n  case ONIGERR_MEMORY:\n    p = \"failed to allocate memory\"; break;\n  case ONIGERR_MATCH_STACK_LIMIT_OVER:\n    p = \"match-stack limit over\"; break;\n  case ONIGERR_TYPE_BUG:\n    p = \"undefined type (bug)\"; break;\n  case ONIGERR_PARSER_BUG:\n    p = \"internal parser error (bug)\"; break;\n  case ONIGERR_STACK_BUG:\n    p = \"stack error (bug)\"; break;\n  case ONIGERR_UNDEFINED_BYTECODE:\n    p = \"undefined bytecode (bug)\"; break;\n  case ONIGERR_UNEXPECTED_BYTECODE:\n    p = \"unexpected bytecode (bug)\"; break;\n  case ONIGERR_DEFAULT_ENCODING_IS_NOT_SET:\n    p = \"default multibyte-encoding is not set\"; break;\n  case ONIGERR_SPECIFIED_ENCODING_CANT_CONVERT_TO_WIDE_CHAR:\n    p = \"can't convert to wide-char on specified multibyte-encoding\"; break;\n  case ONIGERR_INVALID_ARGUMENT:\n    p = \"invalid argument\"; break;\n  case ONIGERR_END_PATTERN_AT_LEFT_BRACE:\n    p = \"end pattern at left brace\"; break;\n  case ONIGERR_END_PATTERN_AT_LEFT_BRACKET:\n    p = \"end pattern at left bracket\"; break;\n  case ONIGERR_EMPTY_CHAR_CLASS:\n    p = \"empty char-class\"; break;\n  case ONIGERR_PREMATURE_END_OF_CHAR_CLASS:\n    p = \"premature end of char-class\"; break;\n  case ONIGERR_END_PATTERN_AT_ESCAPE:\n    p = \"end pattern at escape\"; break;\n  case ONIGERR_END_PATTERN_AT_META:\n    p = \"end pattern at meta\"; break;\n  case ONIGERR_END_PATTERN_AT_CONTROL:\n    p = \"end pattern at control\"; break;\n  case ONIGERR_META_CODE_SYNTAX:\n    p = \"invalid meta-code syntax\"; break;\n  case ONIGERR_CONTROL_CODE_SYNTAX:\n    p = \"invalid control-code syntax\"; break;\n  case ONIGERR_CHAR_CLASS_VALUE_AT_END_OF_RANGE:\n    p = \"char-class value at end of range\"; break;\n  case ONIGERR_CHAR_CLASS_VALUE_AT_START_OF_RANGE:\n    p = \"char-class value at start of range\"; break;\n  case ONIGERR_UNMATCHED_RANGE_SPECIFIER_IN_CHAR_CLASS:\n    p = \"unmatched range specifier in char-class\"; break;\n  case ONIGERR_TARGET_OF_REPEAT_OPERATOR_NOT_SPECIFIED:\n    p = \"target of repeat operator is not specified\"; break;\n  case ONIGERR_TARGET_OF_REPEAT_OPERATOR_INVALID:\n    p = \"target of repeat operator is invalid\"; break;\n  case ONIGERR_NESTED_REPEAT_OPERATOR:\n    p = \"nested repeat operator\"; break;\n  case ONIGERR_UNMATCHED_CLOSE_PARENTHESIS:\n    p = \"unmatched close parenthesis\"; break;\n  case ONIGERR_END_PATTERN_WITH_UNMATCHED_PARENTHESIS:\n    p = \"end pattern with unmatched parenthesis\"; break;\n  case ONIGERR_END_PATTERN_IN_GROUP:\n    p = \"end pattern in group\"; break;\n  case ONIGERR_UNDEFINED_GROUP_OPTION:\n    p = \"undefined group option\"; break;\n  case ONIGERR_INVALID_POSIX_BRACKET_TYPE:\n    p = \"invalid POSIX bracket type\"; break;\n  case ONIGERR_INVALID_LOOK_BEHIND_PATTERN:\n    p = \"invalid pattern in look-behind\"; break;\n  case ONIGERR_INVALID_REPEAT_RANGE_PATTERN:\n    p = \"invalid repeat range {lower,upper}\"; break;\n  case ONIGERR_INVALID_CONDITION_PATTERN:\n    p = \"invalid conditional pattern\"; break;\n  case ONIGERR_TOO_BIG_NUMBER:\n    p = \"too big number\"; break;\n  case ONIGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE:\n    p = \"too big number for repeat range\"; break;\n  case ONIGERR_UPPER_SMALLER_THAN_LOWER_IN_REPEAT_RANGE:\n    p = \"upper is smaller than lower in repeat range\"; break;\n  case ONIGERR_EMPTY_RANGE_IN_CHAR_CLASS:\n    p = \"empty range in char class\"; break;\n  case ONIGERR_MISMATCH_CODE_LENGTH_IN_CLASS_RANGE:\n    p = \"mismatch multibyte code length in char-class range\"; break;\n  case ONIGERR_TOO_MANY_MULTI_BYTE_RANGES:\n    p = \"too many multibyte code ranges are specified\"; break;\n  case ONIGERR_TOO_SHORT_MULTI_BYTE_STRING:\n    p = \"too short multibyte code string\"; break;\n  case ONIGERR_TOO_BIG_BACKREF_NUMBER:\n    p = \"too big backref number\"; break;\n  case ONIGERR_INVALID_BACKREF:\n#ifdef USE_NAMED_GROUP\n    p = \"invalid backref number/name\"; break;\n#else\n    p = \"invalid backref number\"; break;\n#endif\n  case ONIGERR_NUMBERED_BACKREF_OR_CALL_NOT_ALLOWED:\n    p = \"numbered backref/call is not allowed. (use name)\"; break;\n  case ONIGERR_TOO_BIG_WIDE_CHAR_VALUE:\n    p = \"too big wide-char value\"; break;\n  case ONIGERR_TOO_SHORT_DIGITS:\n    p = \"too short digits\"; break;\n  case ONIGERR_TOO_LONG_WIDE_CHAR_VALUE:\n    p = \"too long wide-char value\"; break;\n  case ONIGERR_INVALID_CODE_POINT_VALUE:\n    p = \"invalid code point value\"; break;\n  case ONIGERR_EMPTY_GROUP_NAME:\n    p = \"group name is empty\"; break;\n  case ONIGERR_INVALID_GROUP_NAME:\n    p = \"invalid group name <%n>\"; break;\n  case ONIGERR_INVALID_CHAR_IN_GROUP_NAME:\n#ifdef USE_NAMED_GROUP\n    p = \"invalid char in group name <%n>\"; break;\n#else\n    p = \"invalid char in group number <%n>\"; break;\n#endif\n  case ONIGERR_UNDEFINED_NAME_REFERENCE:\n    p = \"undefined name <%n> reference\"; break;\n  case ONIGERR_UNDEFINED_GROUP_REFERENCE:\n    p = \"undefined group <%n> reference\"; break;\n  case ONIGERR_MULTIPLEX_DEFINED_NAME:\n    p = \"multiplex defined name <%n>\"; break;\n  case ONIGERR_MULTIPLEX_DEFINITION_NAME_CALL:\n    p = \"multiplex definition name <%n> call\"; break;\n  case ONIGERR_NEVER_ENDING_RECURSION:\n    p = \"never ending recursion\"; break;\n  case ONIGERR_GROUP_NUMBER_OVER_FOR_CAPTURE_HISTORY:\n    p = \"group number is too big for capture history\"; break;\n  case ONIGERR_INVALID_CHAR_PROPERTY_NAME:\n    p = \"invalid character property name {%n}\"; break;\n  case ONIGERR_NOT_SUPPORTED_ENCODING_COMBINATION:\n    p = \"not supported encoding combination\"; break;\n  case ONIGERR_INVALID_COMBINATION_OF_OPTIONS:\n    p = \"invalid combination of options\"; break;\n  case ONIGERR_OVER_THREAD_PASS_LIMIT_COUNT:\n    p = \"over thread pass limit count\"; break;\n\n  default:\n    p = \"undefined error code\"; break;\n  }\n\n  return (UChar* )p;\n}\n\nstatic void sprint_byte(char* s, unsigned int v)\n{\n  sprintf(s, \"%02x\", (v & 0377));\n}\n\nstatic void sprint_byte_with_x(char* s, unsigned int v)\n{\n  sprintf(s, \"\\\\x%02x\", (v & 0377));\n}\n\nstatic int to_ascii(OnigEncoding enc, UChar *s, UChar *end,\n\t\t    UChar buf[], int buf_size, int *is_over)\n{\n  int len;\n  UChar *p;\n  OnigCodePoint code;\n\n  if (ONIGENC_MBC_MINLEN(enc) > 1) {\n    p = s;\n    len = 0;\n    while (p < end) {\n      code = ONIGENC_MBC_TO_CODE(enc, p, end);\n      if (code >= 0x80) {\n\tif (code > 0xffff && len + 10 <= buf_size) {\n\t  sprint_byte_with_x((char*)(&(buf[len])), (unsigned int)(code >> 24));\n\t  sprint_byte((char*)(&(buf[len+4])),      (unsigned int)(code >> 16));\n\t  sprint_byte((char*)(&(buf[len+6])),      (unsigned int)(code >>  8));\n\t  sprint_byte((char*)(&(buf[len+8])),      (unsigned int)code);\n\t  len += 10;\n\t}\n\telse if (len + 6 <= buf_size) {\n\t  sprint_byte_with_x((char*)(&(buf[len])), (unsigned int)(code >> 8));\n\t  sprint_byte((char*)(&(buf[len+4])),      (unsigned int)code);\n\t  len += 6;\n\t}\n\telse {\n\t  break;\n\t}\n      }\n      else {\n\tbuf[len++] = (UChar )code;\n      }\n\n      p += enclen(enc, p);\n      if (len >= buf_size) break;\n    }\n\n    *is_over = ((p < end) ? 1 : 0);\n  }\n  else {\n    len = (int )MIN((end - s), buf_size);\n    xmemcpy(buf, s, (size_t )len);\n    *is_over = ((buf_size < (end - s)) ? 1 : 0);\n  }\n\n  return len;\n}\n\n\n/* for ONIG_MAX_ERROR_MESSAGE_LEN */\n#define MAX_ERROR_PAR_LEN   30\n\nextern int\n#ifdef HAVE_STDARG_PROTOTYPES\nonig_error_code_to_str(UChar* s, OnigPosition code, ...)\n#else\nonig_error_code_to_str(s, code, va_alist)\n  UChar* s;\n  OnigPosition code;\n  va_dcl\n#endif\n{\n  UChar *p, *q;\n  OnigErrorInfo* einfo;\n  size_t len;\n  int is_over;\n  UChar parbuf[MAX_ERROR_PAR_LEN];\n  va_list vargs;\n\n  va_init_list(vargs, code);\n\n  switch (code) {\n  case ONIGERR_UNDEFINED_NAME_REFERENCE:\n  case ONIGERR_UNDEFINED_GROUP_REFERENCE:\n  case ONIGERR_MULTIPLEX_DEFINED_NAME:\n  case ONIGERR_MULTIPLEX_DEFINITION_NAME_CALL:\n  case ONIGERR_INVALID_GROUP_NAME:\n  case ONIGERR_INVALID_CHAR_IN_GROUP_NAME:\n  case ONIGERR_INVALID_CHAR_PROPERTY_NAME:\n    einfo = va_arg(vargs, OnigErrorInfo*);\n    len = to_ascii(einfo->enc, einfo->par, einfo->par_end,\n\t\t   parbuf, MAX_ERROR_PAR_LEN - 3, &is_over);\n    q = onig_error_code_to_format(code);\n    p = s;\n    while (*q != '\\0') {\n      if (*q == '%') {\n\tq++;\n\tif (*q == 'n') { /* '%n': name */\n\t  xmemcpy(p, parbuf, len);\n\t  p += len;\n\t  if (is_over != 0) {\n\t    xmemcpy(p, \"...\", 3);\n\t    p += 3;\n\t  }\n\t  q++;\n\t}\n\telse\n\t  goto normal_char;\n      }\n      else {\n      normal_char:\n\t*p++ = *q++;\n      }\n    }\n    *p = '\\0';\n    len = p - s;\n    break;\n\n  default:\n    q = onig_error_code_to_format(code);\n    len = onigenc_str_bytelen_null(ONIG_ENCODING_ASCII, q);\n    xmemcpy(s, q, len);\n    s[len] = '\\0';\n    break;\n  }\n\n  va_end(vargs);\n  return (int )len;\n}\n\n\nvoid\n#ifdef HAVE_STDARG_PROTOTYPES\nonig_snprintf_with_pattern(UChar buf[], int bufsize, OnigEncoding enc,\n                           UChar* pat, UChar* pat_end, const UChar *fmt, ...)\n#else\nonig_snprintf_with_pattern(buf, bufsize, enc, pat, pat_end, fmt, va_alist)\n    UChar buf[];\n    int bufsize;\n    OnigEncoding enc;\n    UChar* pat;\n    UChar* pat_end;\n    const UChar *fmt;\n    va_dcl\n#endif\n{\n  size_t need;\n  int n, len;\n  UChar *p, *s, *bp;\n  UChar bs[6];\n  va_list args;\n\n  va_init_list(args, fmt);\n  n = xvsnprintf((char* )buf, bufsize, (const char* )fmt, args);\n  va_end(args);\n\n  need = (pat_end - pat) * 4 + 4;\n\n  if (n + need < (size_t )bufsize) {\n    strcat((char* )buf, \": /\");\n    s = buf + onigenc_str_bytelen_null(ONIG_ENCODING_ASCII, buf);\n\n    p = pat;\n    while (p < pat_end) {\n      if (*p == '\\\\') {\n\t*s++ = *p++;\n\tlen = enclen(enc, p);\n\twhile (len-- > 0) *s++ = *p++;\n      }\n      else if (*p == '/') {\n\t*s++ = (unsigned char )'\\\\';\n\t*s++ = *p++;\n      }\n      else if (ONIGENC_IS_MBC_HEAD(enc, p)) {\n        len = enclen(enc, p);\n        if (ONIGENC_MBC_MINLEN(enc) == 1) {\n          while (len-- > 0) *s++ = *p++;\n        }\n        else { /* for UTF16 */\n          int blen;\n\n          while (len-- > 0) {\n            sprint_byte_with_x((char* )bs, (unsigned int )(*p++));\n            blen = onigenc_str_bytelen_null(ONIG_ENCODING_ASCII, bs);\n            bp = bs;\n            while (blen-- > 0) *s++ = *bp++;\n          }\n        }\n      }\n      else if (!ONIGENC_IS_CODE_PRINT(enc, *p) &&\n\t       !ONIGENC_IS_CODE_SPACE(enc, *p)) {\n\tsprint_byte_with_x((char* )bs, (unsigned int )(*p++));\n\tlen = onigenc_str_bytelen_null(ONIG_ENCODING_ASCII, bs);\n        bp = bs;\n\twhile (len-- > 0) *s++ = *bp++;\n      }\n      else {\n\t*s++ = *p++;\n      }\n    }\n\n    *s++ = '/';\n    *s   = '\\0';\n  }\n}\n"
  },
  {
    "path": "src/Onigmo/regexec.c",
    "content": "/**********************************************************************\n  regexec.c -  Onigmo (Oniguruma-mod) (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2008  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * Copyright (c) 2011-2013  K.Takata  <kentkt AT csc DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regint.h\"\n\n//#define USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE\n\n#ifdef USE_CRNL_AS_LINE_TERMINATOR\n#define ONIGENC_IS_MBC_CRNL_SE(it,enc,p,end) \\\n  (ONIGENC_MBC_TO_CODE_SE(it,enc,p,end) == 13 && \\\n   ONIGENC_MBC_TO_CODE_SE(it,enc,(p+enclen_se(it,enc,p)),end) == 10)\n#define ONIGENC_IS_MBC_NEWLINE_EX_SE(it, enc,p,start,end,option,check_prev) \\\n  is_mbc_newline_ex_se((it), (enc),(p),(start),(end),(option),(check_prev))\nstatic int\nis_mbc_newline_ex_se(OnigIterator* it, OnigEncoding enc, OnigPosition p, OnigPosition start,\n\t\t  OnigPosition end, OnigOptionType option, int check_prev)\n{\n  if (IS_NEWLINE_CRLF(option)) {\n    if (ONIGENC_MBC_TO_CODE_SE(it, enc, p, end) == 0x0a) {\n      if (check_prev) {\n\tOnigPosition prev = onigenc_get_prev_char_head_se(it, enc, start, p);\n\tif ((ONIG_IS_NOT_BADPOS(prev)) && ONIGENC_MBC_TO_CODE_SE(it, enc, prev, end) == 0x0d)\n\t  return 0;\n\telse\n\t  return 1;\n      }\n      else\n\treturn 1;\n    }\n    else {\n      OnigPosition pnext = p + enclen_se(it, enc, p);\n      if (pnext < end &&\n\t  ONIGENC_MBC_TO_CODE_SE(it, enc, p, end) == 0x0d &&\n\t  ONIGENC_MBC_TO_CODE_SE(it, enc, pnext, end) == 0x0a)\n\treturn 1;\n      if (ONIGENC_IS_MBC_NEWLINE_SE(it, enc, p, end))\n\treturn 1;\n      return 0;\n    }\n  }\n  else {\n    return ONIGENC_IS_MBC_NEWLINE_SE(it, enc, p, end);\n  }\n}\n#else /* USE_CRNL_AS_LINE_TERMINATOR */\n#define ONIGENC_IS_MBC_NEWLINE_EX_SE(it, enc,p,start,end,option,check_prev) \\\n  ONIGENC_IS_MBC_NEWLINE_SE((it), (enc), (p), (end))\n#endif /* USE_CRNL_AS_LINE_TERMINATOR */\n\n#ifdef USE_CAPTURE_HISTORY\nstatic void history_tree_free(OnigCaptureTreeNode* node);\n\nstatic void\nhistory_tree_clear(OnigCaptureTreeNode* node)\n{\n  int i;\n\n  if (IS_NOT_NULL(node)) {\n    for (i = 0; i < node->num_childs; i++) {\n      if (IS_NOT_NULL(node->childs[i])) {\n        history_tree_free(node->childs[i]);\n      }\n    }\n    for (i = 0; i < node->allocated; i++) {\n      node->childs[i] = (OnigCaptureTreeNode* )0;\n    }\n    node->num_childs = 0;\n    node->beg = ONIG_REGION_NOTPOS;\n    node->end = ONIG_REGION_NOTPOS;\n    node->group = -1;\n    xfree(node->childs);\n    node->childs = (OnigCaptureTreeNode** )0;\n  }\n}\n\nstatic void\nhistory_tree_free(OnigCaptureTreeNode* node)\n{\n  history_tree_clear(node);\n  xfree(node);\n}\n\nstatic void\nhistory_root_free(OnigRegion* r)\n{\n  if (IS_NOT_NULL(r->history_root)) {\n    history_tree_free(r->history_root);\n    r->history_root = (OnigCaptureTreeNode* )0;\n  }\n}\n\nstatic OnigCaptureTreeNode*\nhistory_node_new(void)\n{\n  OnigCaptureTreeNode* node;\n\n  node = (OnigCaptureTreeNode* )xmalloc(sizeof(OnigCaptureTreeNode));\n  CHECK_NULL_RETURN(node);\n  node->childs     = (OnigCaptureTreeNode** )0;\n  node->allocated  = 0;\n  node->num_childs = 0;\n  node->group      = -1;\n  node->beg        = ONIG_REGION_NOTPOS;\n  node->end        = ONIG_REGION_NOTPOS;\n\n  return node;\n}\n\nstatic int\nhistory_tree_add_child(OnigCaptureTreeNode* parent, OnigCaptureTreeNode* child)\n{\n#define HISTORY_TREE_INIT_ALLOC_SIZE  8\n\n  if (parent->num_childs >= parent->allocated) {\n    int n, i;\n\n    if (IS_NULL(parent->childs)) {\n      n = HISTORY_TREE_INIT_ALLOC_SIZE;\n      parent->childs =\n        (OnigCaptureTreeNode** )xmalloc(sizeof(OnigCaptureTreeNode*) * n);\n      CHECK_NULL_RETURN_MEMERR(parent->childs);\n    }\n    else {\n      OnigCaptureTreeNode** tmp;\n      n = parent->allocated * 2;\n      tmp =\n        (OnigCaptureTreeNode** )xrealloc(parent->childs,\n                                         sizeof(OnigCaptureTreeNode*) * n);\n      if (tmp == 0) {\n\thistory_tree_clear(parent);\n\treturn ONIGERR_MEMORY;\n      }\n      parent->childs = tmp;\n    }\n    for (i = parent->allocated; i < n; i++) {\n      parent->childs[i] = (OnigCaptureTreeNode* )0;\n    }\n    parent->allocated = n;\n  }\n\n  parent->childs[parent->num_childs] = child;\n  parent->num_childs++;\n  return 0;\n}\n\nstatic OnigCaptureTreeNode*\nhistory_tree_clone(OnigCaptureTreeNode* node)\n{\n  int i, r;\n  OnigCaptureTreeNode *clone, *child;\n\n  clone = history_node_new();\n  CHECK_NULL_RETURN(clone);\n\n  clone->beg = node->beg;\n  clone->end = node->end;\n  for (i = 0; i < node->num_childs; i++) {\n    child = history_tree_clone(node->childs[i]);\n    if (IS_NULL(child)) {\n      history_tree_free(clone);\n      return (OnigCaptureTreeNode* )0;\n    }\n    r = history_tree_add_child(clone, child);\n    if (r != 0) {\n      history_tree_free(child);\n      history_tree_free(clone);\n      return (OnigCaptureTreeNode* )0;\n    }\n  }\n\n  return clone;\n}\n\nextern  OnigCaptureTreeNode*\nonig_get_capture_tree(OnigRegion* region)\n{\n  return region->history_root;\n}\n#endif /* USE_CAPTURE_HISTORY */\n\nextern void\nonig_region_clear(OnigRegion* region)\n{\n  int i;\n\n  for (i = 0; i < region->num_regs; i++) {\n    region->beg[i] = region->end[i] = ONIG_REGION_NOTPOS;\n  }\n#ifdef USE_CAPTURE_HISTORY\n  history_root_free(region);\n#endif\n}\n\nextern int\nonig_region_resize(OnigRegion* region, int n)\n{\n  region->num_regs = n;\n\n  if (n < ONIG_NREGION)\n    n = ONIG_NREGION;\n\n  if (region->allocated == 0) {\n    region->beg = (OnigPosition* )xmalloc(n * sizeof(OnigPosition));\n    if (region->beg == 0)\n      return ONIGERR_MEMORY;\n\n    region->end = (OnigPosition* )xmalloc(n * sizeof(OnigPosition));\n    if (region->end == 0) {\n      xfree(region->beg);\n      return ONIGERR_MEMORY;\n    }\n\n    region->allocated = n;\n  }\n  else if (region->allocated < n) {\n    OnigPosition *tmp;\n\n    region->allocated = 0;\n    tmp = (OnigPosition* )xrealloc(region->beg, n * sizeof(OnigPosition));\n    if (tmp == 0) {\n      xfree(region->beg);\n      xfree(region->end);\n      return ONIGERR_MEMORY;\n    }\n    region->beg = tmp;\n    tmp = (OnigPosition* )xrealloc(region->end, n * sizeof(OnigPosition));\n    if (tmp == 0) {\n      xfree(region->beg);\n      xfree(region->end);\n      return ONIGERR_MEMORY;\n    }\n    region->end = tmp;\n\n    region->allocated = n;\n  }\n\n  return 0;\n}\n\nstatic int\nonig_region_resize_clear(OnigRegion* region, int n)\n{\n  int r;\n\n  r = onig_region_resize(region, n);\n  if (r != 0) return r;\n  onig_region_clear(region);\n  return 0;\n}\n\nextern int\nonig_region_set(OnigRegion* region, int at, int beg, int end)\n{\n  if (at < 0) return ONIGERR_INVALID_ARGUMENT;\n\n  if (at >= region->allocated) {\n    int r = onig_region_resize(region, at + 1);\n    if (r < 0) return r;\n  }\n\n  region->beg[at] = beg;\n  region->end[at] = end;\n  return 0;\n}\n\nextern void\nonig_region_init(OnigRegion* region)\n{\n  region->num_regs     = 0;\n  region->allocated    = 0;\n  region->beg          = (OnigPosition* )0;\n  region->end          = (OnigPosition* )0;\n  region->history_root = (OnigCaptureTreeNode* )0;\n}\n\nextern OnigRegion*\nonig_region_new(void)\n{\n  OnigRegion* r;\n\n  r = (OnigRegion* )xmalloc(sizeof(OnigRegion));\n  if (r)\n    onig_region_init(r);\n  return r;\n}\n\nextern void\nonig_region_free(OnigRegion* r, int free_self)\n{\n  if (r) {\n    if (r->allocated > 0) {\n      if (r->beg) xfree(r->beg);\n      if (r->end) xfree(r->end);\n      r->allocated = 0;\n    }\n#ifdef USE_CAPTURE_HISTORY\n    history_root_free(r);\n#endif\n    if (free_self) xfree(r);\n  }\n}\n\nextern void\nonig_region_copy(OnigRegion* to, OnigRegion* from)\n{\n#define RREGC_SIZE   (sizeof(int) * from->num_regs)\n  int i, r;\n\n  if (to == from) return;\n\n  r = onig_region_resize(to, from->num_regs);\n  if (r) return;\n\n  for (i = 0; i < from->num_regs; i++) {\n    to->beg[i] = from->beg[i];\n    to->end[i] = from->end[i];\n  }\n  to->num_regs = from->num_regs;\n\n#ifdef USE_CAPTURE_HISTORY\n  history_root_free(to);\n\n  if (IS_NOT_NULL(from->history_root)) {\n    to->history_root = history_tree_clone(from->history_root);\n  }\n#endif\n}\n\n\n/** stack **/\n#define INVALID_STACK_INDEX   -1\n\n/* stack type */\n/* used by normal-POP */\n#define STK_ALT                    0x0001\n#define STK_LOOK_BEHIND_NOT        0x0002\n#define STK_POS_NOT                0x0003\n/* handled by normal-POP */\n#define STK_MEM_START              0x0100\n#define STK_MEM_END                0x8200\n#define STK_REPEAT_INC             0x0300\n#define STK_STATE_CHECK_MARK       0x1000\n/* avoided by normal-POP */\n#define STK_NULL_CHECK_START       0x3000\n#define STK_NULL_CHECK_END         0x5000  /* for recursive call */\n#define STK_MEM_END_MARK           0x8400\n#define STK_POS                    0x0500  /* used when POP-POS */\n#define STK_STOP_BT                0x0600  /* mark for \"(?>...)\" */\n#define STK_REPEAT                 0x0700\n#define STK_CALL_FRAME             0x0800\n#define STK_RETURN                 0x0900\n#define STK_VOID                   0x0a00  /* for fill a blank */\n\n/* stack type check mask */\n#define STK_MASK_POP_USED          0x00ff\n#define STK_MASK_TO_VOID_TARGET    0x10ff\n#define STK_MASK_MEM_END_OR_MARK   0x8000  /* MEM_END or MEM_END_MARK */\n\n#ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE\n#define MATCH_ARG_INIT(msa, arg_option, arg_region, arg_start, arg_gpos) do {\\\n  (msa).stack_p  = (void* )0;\\\n  (msa).options  = (arg_option);\\\n  (msa).region   = (arg_region);\\\n  (msa).start    = (arg_start);\\\n  (msa).gpos     = (arg_gpos);\\\n  (msa).best_len = ONIG_MISMATCH;\\\n} while(0)\n#else\n#define MATCH_ARG_INIT(msa, arg_option, arg_region, arg_start, arg_gpos) do {\\\n  (msa).stack_p  = (void* )0;\\\n  (msa).options  = (arg_option);\\\n  (msa).region   = (arg_region);\\\n  (msa).start    = (arg_start);\\\n  (msa).gpos     = (arg_gpos);\\\n} while(0)\n#endif\n\n#ifdef USE_COMBINATION_EXPLOSION_CHECK\n\n#define STATE_CHECK_BUFF_MALLOC_THRESHOLD_SIZE  16\n\n#define STATE_CHECK_BUFF_INIT(msa, str_len, offset, state_num) do {\t\\\n  if ((state_num) > 0 && str_len >= STATE_CHECK_STRING_THRESHOLD_LEN) {\\\n    unsigned int size = (unsigned int )(((str_len) + 1) * (state_num) + 7) >> 3;\\\n    offset = ((offset) * (state_num)) >> 3;\\\n    if (size > 0 && offset < size && size < STATE_CHECK_BUFF_MAX_SIZE) {\\\n      if (size >= STATE_CHECK_BUFF_MALLOC_THRESHOLD_SIZE) {\\\n        (msa).state_check_buff = (void* )xmalloc(size);\\\n        CHECK_NULL_RETURN_MEMERR((msa).state_check_buff);\\\n      }\\\n      else \\\n        (msa).state_check_buff = (void* )xalloca(size);\\\n      xmemset(((char* )((msa).state_check_buff)+(offset)), 0, \\\n              (size_t )(size - (offset))); \\\n      (msa).state_check_buff_size = size;\\\n    }\\\n    else {\\\n      (msa).state_check_buff = (void* )0;\\\n      (msa).state_check_buff_size = 0;\\\n    }\\\n  }\\\n  else {\\\n    (msa).state_check_buff = (void* )0;\\\n    (msa).state_check_buff_size = 0;\\\n  }\\\n  } while(0)\n\n#define MATCH_ARG_FREE(msa) do {\\\n  if ((msa).stack_p) xfree((msa).stack_p);\\\n  if ((msa).state_check_buff_size >= STATE_CHECK_BUFF_MALLOC_THRESHOLD_SIZE) { \\\n    if ((msa).state_check_buff) xfree((msa).state_check_buff);\\\n  }\\\n} while(0)\n#else /* USE_COMBINATION_EXPLOSION_CHECK */\n#define STATE_CHECK_BUFF_INIT(msa, str_len, offset, state_num)\n#define MATCH_ARG_FREE(msa)  if ((msa).stack_p) xfree((msa).stack_p)\n#endif /* USE_COMBINATION_EXPLOSION_CHECK */\n\n\n\n#define STACK_INIT(alloc_addr, ptr_num, stack_num)  do {\\\n  if (msa->stack_p) {\\\n    alloc_addr = (char* )xalloca(sizeof(OnigStackIndex) * (ptr_num));\\\n    stk_alloc  = (OnigStackType* )(msa->stack_p);\\\n    stk_base   = stk_alloc;\\\n    stk        = stk_base;\\\n    stk_end    = stk_base + msa->stack_n;\\\n  }\\\n  else {\\\n    alloc_addr = (char* )xalloca(sizeof(OnigStackIndex) * (ptr_num)\\\n\t\t       + sizeof(OnigStackType) * (stack_num));\\\n    stk_alloc  = (OnigStackType* )(alloc_addr + sizeof(OnigStackIndex) * (ptr_num));\\\n    stk_base   = stk_alloc;\\\n    stk        = stk_base;\\\n    stk_end    = stk_base + (stack_num);\\\n  }\\\n} while(0)\n\n#define STACK_SAVE do{\\\n  if (stk_base != stk_alloc) {\\\n    msa->stack_p = stk_base;\\\n    msa->stack_n = stk_end - stk_base; /* TODO: check overflow */\\\n  };\\\n} while(0)\n\nstatic unsigned int MatchStackLimitSize = DEFAULT_MATCH_STACK_LIMIT_SIZE;\n\nextern unsigned int\nonig_get_match_stack_limit_size(void)\n{\n  return MatchStackLimitSize;\n}\n\nextern int\nonig_set_match_stack_limit_size(unsigned int size)\n{\n  MatchStackLimitSize = size;\n  return 0;\n}\n\nstatic int\nstack_double(OnigStackType** arg_stk_base, OnigStackType** arg_stk_end,\n\t     OnigStackType** arg_stk, OnigStackType* stk_alloc, OnigMatchArg* msa)\n{\n  size_t n;\n  OnigStackType *x, *stk_base, *stk_end, *stk;\n\n  stk_base = *arg_stk_base;\n  stk_end  = *arg_stk_end;\n  stk      = *arg_stk;\n\n  n = stk_end - stk_base;\n  if (stk_base == stk_alloc && IS_NULL(msa->stack_p)) {\n    x = (OnigStackType* )xmalloc(sizeof(OnigStackType) * n * 2);\n    if (IS_NULL(x)) {\n      STACK_SAVE;\n      return ONIGERR_MEMORY;\n    }\n    xmemcpy(x, stk_base, n * sizeof(OnigStackType));\n    n *= 2;\n  }\n  else {\n    unsigned int limit_size = MatchStackLimitSize;\n    n *= 2;\n    if (limit_size != 0 && n > limit_size) {\n      if ((unsigned int )(stk_end - stk_base) == limit_size)\n        return ONIGERR_MATCH_STACK_LIMIT_OVER;\n      else\n        n = limit_size;\n    }\n    x = (OnigStackType* )xrealloc(stk_base, sizeof(OnigStackType) * n);\n    if (IS_NULL(x)) {\n      STACK_SAVE;\n      return ONIGERR_MEMORY;\n    }\n  }\n  *arg_stk      = x + (stk - stk_base);\n  *arg_stk_base = x;\n  *arg_stk_end  = x + n;\n  return 0;\n}\n\n#define STACK_ENSURE(n)\tdo {\\\n  if (stk_end - stk < (n)) {\\\n    int r = stack_double(&stk_base, &stk_end, &stk, stk_alloc, msa);\\\n    if (r != 0) { STACK_SAVE; return r; } \\\n  }\\\n} while(0)\n\n#define STACK_AT(index)        (stk_base + (index))\n#define GET_STACK_INDEX(stk)   ((stk) - stk_base)\n\n#define STACK_PUSH_TYPE(stack_type) do {\\\n  STACK_ENSURE(1);\\\n  stk->type = (stack_type);\\\n  STACK_INC;\\\n} while(0)\n\n#define IS_TO_VOID_TARGET(stk) (((stk)->type & STK_MASK_TO_VOID_TARGET) != 0)\n\n#ifdef USE_COMBINATION_EXPLOSION_CHECK\n#define STATE_CHECK_POS(s,snum) \\\n  (((s) - str) * num_comb_exp_check + ((snum) - 1))\n#define STATE_CHECK_VAL(v,snum) do {\\\n  if (state_check_buff != NULL) {\\\n    int x = STATE_CHECK_POS(s,snum);\\\n    (v) = state_check_buff[x/8] & (1<<(x%8));\\\n  }\\\n  else (v) = 0;\\\n} while(0)\n\n\n#define ELSE_IF_STATE_CHECK_MARK(stk) \\\n  else if ((stk)->type == STK_STATE_CHECK_MARK) { \\\n    int x = STATE_CHECK_POS(stk->u.state.pstr, stk->u.state.state_check);\\\n    state_check_buff[x/8] |= (1<<(x%8));\t\t\t\t\\\n  }\n\n#define STACK_PUSH(stack_type,pat,s,sprev,keep) do {\\\n  STACK_ENSURE(1);\\\n  stk->type = (stack_type);\\\n  stk->u.state.pcode     = (pat);\\\n  stk->u.state.pstr      = (s);\\\n  stk->u.state.pstr_prev = (sprev);\\\n  stk->u.state.state_check = 0;\\\n  stk->u.state.pkeep     = (keep);\\\n  STACK_INC;\\\n} while(0)\n\n#define STACK_PUSH_ENSURED(stack_type,pat) do {\\\n  stk->type = (stack_type);\\\n  stk->u.state.pcode = (pat);\\\n  stk->u.state.state_check = 0;\\\n  STACK_INC;\\\n} while(0)\n\n#define STACK_PUSH_ALT_WITH_STATE_CHECK(pat,s,sprev,snum,keep) do {\\\n  STACK_ENSURE(1);\\\n  stk->type = STK_ALT;\\\n  stk->u.state.pcode     = (pat);\\\n  stk->u.state.pstr      = (s);\\\n  stk->u.state.pstr_prev = (sprev);\\\n  stk->u.state.state_check = ((state_check_buff != NULL) ? (snum) : 0);\\\n  stk->u.state.pkeep     = (keep);\\\n  STACK_INC;\\\n} while(0)\n\n#define STACK_PUSH_STATE_CHECK(s,snum) do {\\\n  if (state_check_buff != NULL) {\\\n    STACK_ENSURE(1);\\\n    stk->type = STK_STATE_CHECK_MARK;\\\n    stk->u.state.pstr = (s);\\\n    stk->u.state.state_check = (snum);\\\n    STACK_INC;\\\n  }\\\n} while(0)\n\n#else /* USE_COMBINATION_EXPLOSION_CHECK */\n\n#define ELSE_IF_STATE_CHECK_MARK(stk)\n\n#define STACK_PUSH(stack_type,pat,s,sprev,keep) do {\\\n  STACK_ENSURE(1);\\\n  stk->type = (stack_type);\\\n  stk->u.state.pcode     = (pat);\\\n  stk->u.state.pstr      = (s);\\\n  stk->u.state.pstr_prev = (sprev);\\\n  stk->u.state.pkeep     = (keep);\\\n  STACK_INC;\\\n} while(0)\n\n#define STACK_PUSH_ENSURED(stack_type,pat) do {\\\n  stk->type = (stack_type);\\\n  stk->u.state.pcode = (pat);\\\n  STACK_INC;\\\n} while(0)\n#endif /* USE_COMBINATION_EXPLOSION_CHECK */\n\n#define STACK_PUSH_ALT(pat,s,sprev,keep)     STACK_PUSH(STK_ALT,pat,s,sprev,keep)\n#define STACK_PUSH_POS(s,sprev,keep)         STACK_PUSH(STK_POS,NULL_UCHARP,s,sprev,keep)\n#define STACK_PUSH_POS_NOT(pat,s,sprev,keep) STACK_PUSH(STK_POS_NOT,pat,s,sprev,keep)\n#define STACK_PUSH_STOP_BT              STACK_PUSH_TYPE(STK_STOP_BT)\n#define STACK_PUSH_LOOK_BEHIND_NOT(pat,s,sprev,keep) \\\n        STACK_PUSH(STK_LOOK_BEHIND_NOT,pat,s,sprev,keep)\n\n#define STACK_PUSH_REPEAT(id, pat) do {\\\n  STACK_ENSURE(1);\\\n  stk->type = STK_REPEAT;\\\n  stk->u.repeat.num    = (id);\\\n  stk->u.repeat.pcode  = (pat);\\\n  stk->u.repeat.count  = 0;\\\n  STACK_INC;\\\n} while(0)\n\n#define STACK_PUSH_REPEAT_INC(sindex) do {\\\n  STACK_ENSURE(1);\\\n  stk->type = STK_REPEAT_INC;\\\n  stk->u.repeat_inc.si  = (sindex);\\\n  STACK_INC;\\\n} while(0)\n\n#define STACK_PUSH_MEM_START(mnum, s) do {\\\n  STACK_ENSURE(1);\\\n  stk->type = STK_MEM_START;\\\n  stk->u.mem.num      = (mnum);\\\n  stk->u.mem.pstr     = (s);\\\n  stk->u.mem.start    = mem_start_stk[mnum];\\\n  stk->u.mem.end      = mem_end_stk[mnum];\\\n  mem_start_stk[mnum] = GET_STACK_INDEX(stk);\\\n  mem_end_stk[mnum]   = INVALID_STACK_INDEX;\\\n  STACK_INC;\\\n} while(0)\n\n#define STACK_PUSH_MEM_END(mnum, s) do {\\\n  STACK_ENSURE(1);\\\n  stk->type = STK_MEM_END;\\\n  stk->u.mem.num    = (mnum);\\\n  stk->u.mem.pstr   = (s);\\\n  stk->u.mem.start  = mem_start_stk[mnum];\\\n  stk->u.mem.end    = mem_end_stk[mnum];\\\n  mem_end_stk[mnum] = GET_STACK_INDEX(stk);\\\n  STACK_INC;\\\n} while(0)\n\n#define STACK_PUSH_MEM_END_MARK(mnum) do {\\\n  STACK_ENSURE(1);\\\n  stk->type = STK_MEM_END_MARK;\\\n  stk->u.mem.num = (mnum);\\\n  STACK_INC;\\\n} while(0)\n\n#define STACK_GET_MEM_START(mnum, k) do {\\\n  int level = 0;\\\n  k = stk;\\\n  while (k > stk_base) {\\\n    k--;\\\n    if ((k->type & STK_MASK_MEM_END_OR_MARK) != 0 \\\n      && k->u.mem.num == (mnum)) {\\\n      level++;\\\n    }\\\n    else if (k->type == STK_MEM_START && k->u.mem.num == (mnum)) {\\\n      if (level == 0) break;\\\n      level--;\\\n    }\\\n  }\\\n} while(0)\n\n#define STACK_GET_MEM_RANGE(k, mnum, start, end) do {\\\n  int level = 0;\\\n  while (k < stk) {\\\n    if (k->type == STK_MEM_START && k->u.mem.num == (mnum)) {\\\n      if (level == 0) (start) = k->u.mem.pstr;\\\n      level++;\\\n    }\\\n    else if (k->type == STK_MEM_END && k->u.mem.num == (mnum)) {\\\n      level--;\\\n      if (level == 0) {\\\n        (end) = k->u.mem.pstr;\\\n        break;\\\n      }\\\n    }\\\n    k++;\\\n  }\\\n} while(0)\n\n#define STACK_PUSH_NULL_CHECK_START(cnum, s) do {\\\n  STACK_ENSURE(1);\\\n  stk->type = STK_NULL_CHECK_START;\\\n  stk->u.null_check.num  = (cnum);\\\n  stk->u.null_check.pstr = (s);\\\n  STACK_INC;\\\n} while(0)\n\n#define STACK_PUSH_NULL_CHECK_END(cnum) do {\\\n  STACK_ENSURE(1);\\\n  stk->type = STK_NULL_CHECK_END;\\\n  stk->u.null_check.num  = (cnum);\\\n  STACK_INC;\\\n} while(0)\n\n#define STACK_PUSH_CALL_FRAME(pat) do {\\\n  STACK_ENSURE(1);\\\n  stk->type = STK_CALL_FRAME;\\\n  stk->u.call_frame.ret_addr = (pat);\\\n  STACK_INC;\\\n} while(0)\n\n#define STACK_PUSH_RETURN do {\\\n  STACK_ENSURE(1);\\\n  stk->type = STK_RETURN;\\\n  STACK_INC;\\\n} while(0)\n\n\n#ifdef ONIG_DEBUG\n#define STACK_BASE_CHECK(p, at) \\\n  if ((p) < stk_base) {\\\n    fprintf(stderr, \"at %s\\n\", at);\\\n    goto stack_error;\\\n  }\n#else\n#define STACK_BASE_CHECK(p, at)\n#endif\n\n#define STACK_POP_ONE do {\\\n  stk--;\\\n  STACK_BASE_CHECK(stk, \"STACK_POP_ONE\"); \\\n} while(0)\n\n#define STACK_POP  do {\\\n  switch (pop_level) {\\\n  case STACK_POP_LEVEL_FREE:\\\n    while (1) {\\\n      stk--;\\\n      STACK_BASE_CHECK(stk, \"STACK_POP\"); \\\n      if ((stk->type & STK_MASK_POP_USED) != 0)  break;\\\n      ELSE_IF_STATE_CHECK_MARK(stk);\\\n    }\\\n    break;\\\n  case STACK_POP_LEVEL_MEM_START:\\\n    while (1) {\\\n      stk--;\\\n      STACK_BASE_CHECK(stk, \"STACK_POP 2\"); \\\n      if ((stk->type & STK_MASK_POP_USED) != 0)  break;\\\n      else if (stk->type == STK_MEM_START) {\\\n        mem_start_stk[stk->u.mem.num] = stk->u.mem.start;\\\n        mem_end_stk[stk->u.mem.num]   = stk->u.mem.end;\\\n      }\\\n      ELSE_IF_STATE_CHECK_MARK(stk);\\\n    }\\\n    break;\\\n  default:\\\n    while (1) {\\\n      stk--;\\\n      STACK_BASE_CHECK(stk, \"STACK_POP 3\"); \\\n      if ((stk->type & STK_MASK_POP_USED) != 0)  break;\\\n      else if (stk->type == STK_MEM_START) {\\\n        mem_start_stk[stk->u.mem.num] = stk->u.mem.start;\\\n        mem_end_stk[stk->u.mem.num]   = stk->u.mem.end;\\\n      }\\\n      else if (stk->type == STK_REPEAT_INC) {\\\n        STACK_AT(stk->u.repeat_inc.si)->u.repeat.count--;\\\n      }\\\n      else if (stk->type == STK_MEM_END) {\\\n        mem_start_stk[stk->u.mem.num] = stk->u.mem.start;\\\n        mem_end_stk[stk->u.mem.num]   = stk->u.mem.end;\\\n      }\\\n      ELSE_IF_STATE_CHECK_MARK(stk);\\\n    }\\\n    break;\\\n  }\\\n} while(0)\n\n#define STACK_POP_TIL_POS_NOT  do {\\\n  while (1) {\\\n    stk--;\\\n    STACK_BASE_CHECK(stk, \"STACK_POP_TIL_POS_NOT\"); \\\n    if (stk->type == STK_POS_NOT) break;\\\n    else if (stk->type == STK_MEM_START) {\\\n      mem_start_stk[stk->u.mem.num] = stk->u.mem.start;\\\n      mem_end_stk[stk->u.mem.num]   = stk->u.mem.end;\\\n    }\\\n    else if (stk->type == STK_REPEAT_INC) {\\\n      STACK_AT(stk->u.repeat_inc.si)->u.repeat.count--;\\\n    }\\\n    else if (stk->type == STK_MEM_END) {\\\n      mem_start_stk[stk->u.mem.num] = stk->u.mem.start;\\\n      mem_end_stk[stk->u.mem.num]   = stk->u.mem.end;\\\n    }\\\n    ELSE_IF_STATE_CHECK_MARK(stk);\\\n  }\\\n} while(0)\n\n#define STACK_POP_TIL_LOOK_BEHIND_NOT  do {\\\n  while (1) {\\\n    stk--;\\\n    STACK_BASE_CHECK(stk, \"STACK_POP_TIL_LOOK_BEHIND_NOT\"); \\\n    if (stk->type == STK_LOOK_BEHIND_NOT) break;\\\n    else if (stk->type == STK_MEM_START) {\\\n      mem_start_stk[stk->u.mem.num] = stk->u.mem.start;\\\n      mem_end_stk[stk->u.mem.num]   = stk->u.mem.end;\\\n    }\\\n    else if (stk->type == STK_REPEAT_INC) {\\\n      STACK_AT(stk->u.repeat_inc.si)->u.repeat.count--;\\\n    }\\\n    else if (stk->type == STK_MEM_END) {\\\n      mem_start_stk[stk->u.mem.num] = stk->u.mem.start;\\\n      mem_end_stk[stk->u.mem.num]   = stk->u.mem.end;\\\n    }\\\n    ELSE_IF_STATE_CHECK_MARK(stk);\\\n  }\\\n} while(0)\n\n#define STACK_POS_END(k) do {\\\n  k = stk;\\\n  while (1) {\\\n    k--;\\\n    STACK_BASE_CHECK(k, \"STACK_POS_END\"); \\\n    if (IS_TO_VOID_TARGET(k)) {\\\n      k->type = STK_VOID;\\\n    }\\\n    else if (k->type == STK_POS) {\\\n      k->type = STK_VOID;\\\n      break;\\\n    }\\\n  }\\\n} while(0)\n\n#define STACK_STOP_BT_END do {\\\n  OnigStackType *k = stk;\\\n  while (1) {\\\n    k--;\\\n    STACK_BASE_CHECK(k, \"STACK_STOP_BT_END\"); \\\n    if (IS_TO_VOID_TARGET(k)) {\\\n      k->type = STK_VOID;\\\n    }\\\n    else if (k->type == STK_STOP_BT) {\\\n      k->type = STK_VOID;\\\n      break;\\\n    }\\\n  }\\\n} while(0)\n\n#define STACK_NULL_CHECK(isnull,id,s) do {\\\n  OnigStackType* k = stk;\\\n  while (1) {\\\n    k--;\\\n    STACK_BASE_CHECK(k, \"STACK_NULL_CHECK\"); \\\n    if (k->type == STK_NULL_CHECK_START) {\\\n      if (k->u.null_check.num == (id)) {\\\n        (isnull) = (k->u.null_check.pstr == (s));\\\n        break;\\\n      }\\\n    }\\\n  }\\\n} while(0)\n\n#define STACK_NULL_CHECK_REC(isnull,id,s) do {\\\n  int level = 0;\\\n  OnigStackType* k = stk;\\\n  while (1) {\\\n    k--;\\\n    STACK_BASE_CHECK(k, \"STACK_NULL_CHECK_REC\"); \\\n    if (k->type == STK_NULL_CHECK_START) {\\\n      if (k->u.null_check.num == (id)) {\\\n        if (level == 0) {\\\n          (isnull) = (k->u.null_check.pstr == (s));\\\n          break;\\\n        }\\\n        else level--;\\\n      }\\\n    }\\\n    else if (k->type == STK_NULL_CHECK_END) {\\\n      level++;\\\n    }\\\n  }\\\n} while(0)\n\n#define STACK_NULL_CHECK_MEMST(isnull,id,s,reg) do {\\\n  OnigStackType* k = stk;\\\n  while (1) {\\\n    k--;\\\n    STACK_BASE_CHECK(k, \"STACK_NULL_CHECK_MEMST\"); \\\n    if (k->type == STK_NULL_CHECK_START) {\\\n      if (k->u.null_check.num == (id)) {\\\n        if (k->u.null_check.pstr != (s)) {\\\n          (isnull) = 0;\\\n          break;\\\n        }\\\n        else {\\\n          OnigPosition endp;\\\n          (isnull) = 1;\\\n          while (k < stk) {\\\n            if (k->type == STK_MEM_START) {\\\n              if (k->u.mem.end == INVALID_STACK_INDEX) {\\\n                (isnull) = 0; break;\\\n              }\\\n              if (BIT_STATUS_AT(reg->bt_mem_end, k->u.mem.num))\\\n                endp = STACK_AT(k->u.mem.end)->u.mem.pstr;\\\n              else\\\n                endp = k->u.mem.end;\\\n              if (STACK_AT(k->u.mem.start)->u.mem.pstr != endp) {\\\n                (isnull) = 0; break;\\\n              }\\\n              else if (endp != s) {\\\n                (isnull) = -1; /* empty, but position changed */ \\\n              }\\\n            }\\\n            k++;\\\n          }\\\n          break;\\\n        }\\\n      }\\\n    }\\\n  }\\\n} while(0)\n\n#define STACK_NULL_CHECK_MEMST_REC(isnull,id,s,reg) do {\\\n  int level = 0;\\\n  OnigStackType* k = stk;\\\n  while (1) {\\\n    k--;\\\n    STACK_BASE_CHECK(k, \"STACK_NULL_CHECK_MEMST_REC\"); \\\n    if (k->type == STK_NULL_CHECK_START) {\\\n      if (k->u.null_check.num == (id)) {\\\n        if (level == 0) {\\\n          if (k->u.null_check.pstr != (s)) {\\\n            (isnull) = 0;\\\n            break;\\\n          }\\\n          else {\\\n            OnigPosition endp;\\\n            (isnull) = 1;\\\n            while (k < stk) {\\\n              if (k->type == STK_MEM_START) {\\\n                if (k->u.mem.end == INVALID_STACK_INDEX) {\\\n                  (isnull) = 0; break;\\\n                }\\\n                if (BIT_STATUS_AT(reg->bt_mem_end, k->u.mem.num))\\\n                  endp = STACK_AT(k->u.mem.end)->u.mem.pstr;\\\n                else\\\n                  endp = k->u.mem.end;\\\n                if (STACK_AT(k->u.mem.start)->u.mem.pstr != endp) {\\\n                  (isnull) = 0; break;\\\n                }\\\n                else if (endp != s) {\\\n                  (isnull) = -1; /* empty, but position changed */ \\\n                }\\\n              }\\\n              k++;\\\n            }\\\n            break;\\\n          }\\\n        }\\\n        else {\\\n          level--;\\\n        }\\\n      }\\\n    }\\\n    else if (k->type == STK_NULL_CHECK_END) {\\\n      if (k->u.null_check.num == (id)) level++;\\\n    }\\\n  }\\\n} while(0)\n\n#define STACK_GET_REPEAT(id, k) do {\\\n  int level = 0;\\\n  k = stk;\\\n  while (1) {\\\n    k--;\\\n    STACK_BASE_CHECK(k, \"STACK_GET_REPEAT\"); \\\n    if (k->type == STK_REPEAT) {\\\n      if (level == 0) {\\\n        if (k->u.repeat.num == (id)) {\\\n          break;\\\n        }\\\n      }\\\n    }\\\n    else if (k->type == STK_CALL_FRAME) level--;\\\n    else if (k->type == STK_RETURN)     level++;\\\n  }\\\n} while(0)\n\n#define STACK_RETURN(addr)  do {\\\n  int level = 0;\\\n  OnigStackType* k = stk;\\\n  while (1) {\\\n    k--;\\\n    STACK_BASE_CHECK(k, \"STACK_RETURN\"); \\\n    if (k->type == STK_CALL_FRAME) {\\\n      if (level == 0) {\\\n        (addr) = k->u.call_frame.ret_addr;\\\n        break;\\\n      }\\\n      else level--;\\\n    }\\\n    else if (k->type == STK_RETURN)\\\n      level++;\\\n  }\\\n} while(0)\n\n#define STRING_CMP_SE(it,s1,s2,len) do {\\\n  while (len-- > 0) {\\\n    if (ONIG_CHARAT(s1++) != ONIG_CHARAT(s2++)) goto fail;\\\n  }\\\n} while(0)\n\n#define STRING_CMP_IC_SE(it, case_fold_flag,s1,ps2,len) do {\\\n  if (string_cmp_ic_se(it, encode, case_fold_flag, s1, ps2, len) == 0) \\\n    goto fail; \\\n} while(0)\n\nstatic int string_cmp_ic_se(OnigIterator* it, OnigEncoding enc, int case_fold_flag,\n\t\t\t OnigPosition s1, OnigPosition* ps2, OnigPosition mblen)\n{\n  UChar buf1[ONIGENC_MBC_CASE_FOLD_MAXLEN];\n  UChar buf2[ONIGENC_MBC_CASE_FOLD_MAXLEN];\n  UChar* p1, *p2;\n  OnigPosition end1, s2, end2;\n  int len1, len2;\n\n  s2   = *ps2;\n  end1 = s1 + mblen;\n  end2 = s2 + mblen;\n  while (s1 < end1) {\n    len1 = ONIGENC_MBC_CASE_FOLD_SE(it, enc, case_fold_flag, &s1, end1, buf1);\n    len2 = ONIGENC_MBC_CASE_FOLD_SE(it, enc, case_fold_flag, &s2, end2, buf2);\n    if (len1 != len2) return 0;\n    p1 = buf1;\n    p2 = buf2;\n    while (len1-- > 0) {\n      if (*p1 != *p2) return 0;\n      p1++;\n      p2++;\n    }\n  }\n\n  *ps2 = s2;\n  return 1;\n}\n\n#define STRING_CMP_VALUE_SE(it, s1,s2,len,is_fail) do {\\\n  is_fail = 0;\\\n  while (len-- > 0) {\\\n    if (ONIG_CHARAT(s1++) != ONIG_CHARAT(s2++)) {\\\n      is_fail = 1; break;\\\n    }\\\n  }\\\n} while(0)\n\n#define STRING_CMP_VALUE_IC_SE(it, case_fold_flag,s1,ps2,len,is_fail) do {\\\n  if (string_cmp_ic_se(it, encode, case_fold_flag, s1, ps2, len) == 0) \\\n    is_fail = 1; \\\n  else \\\n    is_fail = 0; \\\n} while(0)\n\n\n#define IS_EMPTY_STR           (str == end)\n#define ON_STR_BEGIN(s)       ((s) == str)\n#define ON_STR_END(s)         ((s) == end)\n#ifdef USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE\n#define DATA_ENSURE_CHECK1     (s < right_range)\n#define DATA_ENSURE_CHECK(n)   (s + (n) <= right_range)\n#define DATA_ENSURE(n)         if (s + (n) > right_range) goto fail\n#else\n#define DATA_ENSURE_CHECK1     (s < end)\n#define DATA_ENSURE_CHECK(n)   (s + (n) <= end)\n#define DATA_ENSURE(n)         if (s + (n) > end) goto fail\n#endif /* USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE */\n\n\n#ifdef USE_CAPTURE_HISTORY\nstatic int\nmake_capture_history_tree(OnigCaptureTreeNode* node, OnigStackType** kp,\n                          OnigStackType* stk_top, OnigPosition str, regex_t* reg)\n{\n  int n, r;\n  OnigCaptureTreeNode* child;\n  OnigStackType* k = *kp;\n\n  while (k < stk_top) {\n    if (k->type == STK_MEM_START) {\n      n = k->u.mem.num;\n      if (n <= ONIG_MAX_CAPTURE_HISTORY_GROUP &&\n          BIT_STATUS_AT(reg->capture_history, n) != 0) {\n        child = history_node_new();\n        CHECK_NULL_RETURN_MEMERR(child);\n        child->group = n;\n        child->beg = k->u.mem.pstr - str;\n        r = history_tree_add_child(node, child);\n        if (r != 0) {\n          history_tree_free(child);\n          return r;\n        }\n        *kp = (k + 1);\n        r = make_capture_history_tree(child, kp, stk_top, str, reg);\n        if (r != 0) return r;\n\n        k = *kp;\n        child->end = k->u.mem.pstr - str;\n      }\n    }\n    else if (k->type == STK_MEM_END) {\n      if (k->u.mem.num == node->group) {\n        node->end = k->u.mem.pstr - str;\n        *kp = k;\n        return 0;\n      }\n    }\n    k++;\n  }\n\n  return 1; /* 1: root node ending. */\n}\n#endif /* USE_CAPTURE_HISTORY */\n\n#ifdef USE_BACKREF_WITH_LEVEL\nstatic int mem_is_in_memp(int mem, int num, UChar* memp)\n{\n  int i;\n  MemNumType m;\n\n  for (i = 0; i < num; i++) {\n    GET_MEMNUM_INC(m, memp);\n    if (mem == (int )m) return 1;\n  }\n  return 0;\n}\n\nstatic int backref_match_at_nested_level(OnigIterator* it, regex_t* reg\n\t , OnigStackType* top, OnigStackType* stk_base\n\t , int ignore_case, int case_fold_flag\n\t , int nest, int mem_num, UChar* memp, OnigPosition* s, OnigPosition send)\n{\n  OnigPosition ss, p, pstart, pend = ONIG_BADPOS;\n  int level;\n  OnigStackType* k;\n\n  level = 0;\n  k = top;\n  k--;\n  while (k >= stk_base) {\n    if (k->type == STK_CALL_FRAME) {\n      level--;\n    }\n    else if (k->type == STK_RETURN) {\n      level++;\n    }\n    else if (level == nest) {\n      if (k->type == STK_MEM_START) {\n\tif (mem_is_in_memp(k->u.mem.num, mem_num, memp)) {\n\t  pstart = k->u.mem.pstr;\n\t  if (pend != ONIG_BADPOS) {\n\t    if (pend - pstart > send - *s) return 0; /* or goto next_mem; */\n\t    p  = pstart;\n\t    ss = *s;\n\n\t    if (ignore_case != 0) {\n\t      if (string_cmp_ic_se(it, reg->enc, case_fold_flag,\n\t\t\t\tpstart, &ss, pend - pstart) == 0)\n\t\treturn 0; /* or goto next_mem; */\n\t    }\n\t    else {\n\t      while (p < pend) {\n\t\tif (ONIG_CHARAT(p++) != ONIG_CHARAT(ss++)) return 0; /* or goto next_mem; */\n\t      }\n\t    }\n\n\t    *s = ss;\n\t    return 1;\n\t  }\n\t}\n      }\n      else if (k->type == STK_MEM_END) {\n\tif (mem_is_in_memp(k->u.mem.num, mem_num, memp)) {\n\t  pend = k->u.mem.pstr;\n\t}\n      }\n    }\n    k--;\n  }\n\n  return 0;\n}\n#endif /* USE_BACKREF_WITH_LEVEL */\n\n\n#ifdef ONIG_DEBUG_STATISTICS\n\n#define USE_TIMEOFDAY\n\n#ifdef USE_TIMEOFDAY\n#ifdef HAVE_SYS_TIME_H\n#include <sys/time.h>\n#endif\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\nstatic struct timeval ts, te;\n#define GETTIME(t)        gettimeofday(&(t), (struct timezone* )0)\n#define TIMEDIFF(te,ts)   (((te).tv_usec - (ts).tv_usec) + \\\n                           (((te).tv_sec - (ts).tv_sec)*1000000))\n#else /* USE_TIMEOFDAY */\n#ifdef HAVE_SYS_TIMES_H\n#include <sys/times.h>\n#endif\nstatic struct tms ts, te;\n#define GETTIME(t)         times(&(t))\n#define TIMEDIFF(te,ts)   ((te).tms_utime - (ts).tms_utime)\n#endif /* USE_TIMEOFDAY */\n\nstatic int OpCounter[256];\nstatic int OpPrevCounter[256];\nstatic unsigned long OpTime[256];\nstatic int OpCurr = OP_FINISH;\nstatic int OpPrevTarget = OP_FAIL;\nstatic int MaxStackDepth = 0;\n\n#define MOP_IN(opcode) do {\\\n  if (opcode == OpPrevTarget) OpPrevCounter[OpCurr]++;\\\n  OpCurr = opcode;\\\n  OpCounter[opcode]++;\\\n  GETTIME(ts);\\\n} while(0)\n\n#define MOP_OUT do {\\\n  GETTIME(te);\\\n  OpTime[OpCurr] += TIMEDIFF(te, ts);\\\n} while(0)\n\nextern void\nonig_statistics_init(void)\n{\n  int i;\n  for (i = 0; i < 256; i++) {\n    OpCounter[i] = OpPrevCounter[i] = 0; OpTime[i] = 0;\n  }\n  MaxStackDepth = 0;\n}\n\nextern void\nonig_print_statistics(FILE* f)\n{\n  int i;\n  fprintf(f, \"   count      prev        time\\n\");\n  for (i = 0; OnigOpInfo[i].opcode >= 0; i++) {\n    fprintf(f, \"%8d: %8d: %10ld: %s\\n\",\n\t    OpCounter[i], OpPrevCounter[i], OpTime[i], OnigOpInfo[i].name);\n  }\n  fprintf(f, \"\\nmax stack depth: %d\\n\", MaxStackDepth);\n}\n\n#define STACK_INC do {\\\n  stk++;\\\n  if (stk - stk_base > MaxStackDepth) \\\n    MaxStackDepth = stk - stk_base;\\\n} while(0)\n\n#else /* ONIG_DEBUG_STATISTICS */\n#define STACK_INC     stk++\n\n#define MOP_IN(opcode)\n#define MOP_OUT\n#endif /* ONIG_DEBUG_STATISTICS */\n\n\n\n/* matching region of POSIX API */\ntypedef int regoff_t;\n\ntypedef struct {\n  regoff_t  rm_so;\n  regoff_t  rm_eo;\n} posix_regmatch_t;\n\n/* match data(str - end) from position (sstart). */\n/* if sstart == str then set sprev to NULL. */\nstatic OnigPosition\nmatch_at(OnigIterator* it, regex_t* reg, OnigPosition str, OnigPosition end,\n#ifdef USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE\n\t const OnigPosition right_range,\n#endif\n\t const OnigPosition sstart, OnigPosition sprev, OnigMatchArg* msa)\n{\n  static UChar FinishCode[] = { OP_FINISH };\n\n  int i, num_mem, pop_level;\n  OnigPosition n, best_len;\n  LengthType tlen, tlen2;\n  MemNumType mem;\n  RelAddrType addr;\n  OnigOptionType option = reg->options;\n  OnigEncoding encode = reg->enc;\n  OnigCaseFoldType case_fold_flag = reg->case_fold_flag;\n  OnigPosition s, q, sbegin;\n  UChar *p = reg->p;\n  OnigPosition pkeep;\n  char *alloca_base;\n  OnigStackType *stk_alloc, *stk_base, *stk, *stk_end;\n  OnigStackType *stkp; /* used as any purpose. */\n  OnigStackIndex si;\n  OnigStackIndex *repeat_stk;\n  OnigStackIndex *mem_start_stk, *mem_end_stk;\n#ifdef USE_COMBINATION_EXPLOSION_CHECK\n  int scv;\n  unsigned char* state_check_buff = msa->state_check_buff;\n  int num_comb_exp_check = reg->num_comb_exp_check;\n#endif\n\n#ifdef USE_SUBEXP_CALL\n  /* Stack #0 is used to store the pattern itself and used for (?R), \\g<0>, etc. */\n  n = reg->num_repeat + (reg->num_mem + 1) * 2;\n\n  STACK_INIT(alloca_base, n, INIT_MATCH_STACK_SIZE);\n  pop_level = reg->stack_pop_level;\n  num_mem = reg->num_mem;\n  repeat_stk = (OnigStackIndex* )alloca_base;\n\n  mem_start_stk = (OnigStackIndex* )(repeat_stk + reg->num_repeat);\n  mem_end_stk   = mem_start_stk + (num_mem + 1);\n  for (i = 0; i <= num_mem; i++) {\n    mem_start_stk[i] = mem_end_stk[i] = INVALID_STACK_INDEX;\n  }\n#else /* USE_SUBEXP_CALL */\n  /* Stack #0 not is used. */\n  n = reg->num_repeat + reg->num_mem * 2;\n\n  STACK_INIT(alloca_base, n, INIT_MATCH_STACK_SIZE);\n  pop_level = reg->stack_pop_level;\n  num_mem = reg->num_mem;\n  repeat_stk = (OnigStackIndex* )alloca_base;\n\n  mem_start_stk = (OnigStackIndex* )(repeat_stk + reg->num_repeat);\n  mem_end_stk   = mem_start_stk + num_mem;\n  mem_start_stk--; /* for index start from 1,\n\t\t      mem_start_stk[1]..mem_start_stk[num_mem] */\n  mem_end_stk--;   /* for index start from 1,\n\t\t      mem_end_stk[1]..mem_end_stk[num_mem] */\n  for (i = 1; i <= num_mem; i++) {\n    mem_start_stk[i] = mem_end_stk[i] = INVALID_STACK_INDEX;\n  }\n#endif /* USE_SUBEXP_CALL */\n\n#ifdef ONIG_DEBUG_MATCH\n  fprintf(stderr, \"match_at: ptr: %p, str: %d, end: %d, start: %d, sprev: %d\\n\",\n\t  it->ptr, (int )str, (int )end, (int )sstart, (int )sprev);\n  fprintf(stderr, \"size: %d, start offset: %d\\n\",\n\t  (int )(end - str), (int )(sstart - str));\n#endif\n\n  STACK_PUSH_ENSURED(STK_ALT, FinishCode);  /* bottom stack */\n  best_len = ONIG_MISMATCH;\n  s = sstart;\n  pkeep = sstart;\n  while (1) {\n#ifdef ONIG_DEBUG_MATCH\n    if (ONIG_IS_NOT_BADPOS(s)) {\n      OnigPosition q;\n\t  UChar *bp, buf[50];\n      int len;\n      fprintf(stderr, \"%4d> \\\"\", (int )(s - str));\n      bp = buf;\n      if (*p != OP_FINISH) {    /* s may not be a valid pointer if OP_FINISH. */\n\tfor (i = 0, q = s; i < 7 && q < end; i++) {\n\t  len = enclen_se(it, encode, q);\n\t  while (len-- > 0) *bp++ = ONIG_CHARAT(q++);\n\t}\n      }\n      if (q < end) { xmemcpy(bp, \"...\\\"\", 4); bp += 4; }\n      else         { xmemcpy(bp, \"\\\"\",    1); bp += 1; }\n      *bp = 0;\n      fputs((char* )buf, stderr);\n      for (i = 0; i < 20 - (bp - buf); i++) fputc(' ', stderr);\n      onig_print_compiled_byte_code(stderr, p, NULL, encode);\n      fprintf(stderr, \"\\n\");\n    }\n#endif\n\n    sbegin = s;\n    switch (*p++) {\n    case OP_END:  MOP_IN(OP_END);\n      n = s - sstart;\n      if (n > best_len) {\n\tOnigRegion* region;\n#ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE\n\tif (IS_FIND_LONGEST(option)) {\n\t  if (n > msa->best_len) {\n\t    msa->best_len = n;\n\t    msa->best_s   = sstart;\n\t  }\n\t  else\n\t    goto end_best_len;\n        }\n#endif\n\tbest_len = n;\n\tregion = msa->region;\n\tif (region) {\n#ifdef USE_POSIX_API_REGION_OPTION\n\t  if (IS_POSIX_REGION(msa->options)) {\n\t    posix_regmatch_t* rmt = (posix_regmatch_t* )region;\n\n\t    rmt[0].rm_so = (regoff_t )(((pkeep > s) ? s : pkeep) - str);\n\t    rmt[0].rm_eo = (regoff_t )(s - str);\n\t    for (i = 1; i <= num_mem; i++) {\n\t      if (mem_end_stk[i] != INVALID_STACK_INDEX) {\n\t\tif (BIT_STATUS_AT(reg->bt_mem_start, i))\n\t\t  rmt[i].rm_so = (regoff_t )(STACK_AT(mem_start_stk[i])->u.mem.pstr - str);\n\t\telse\n\t\t  rmt[i].rm_so = (regoff_t )((OnigPosition)mem_start_stk[i] - str);\n\n\t\trmt[i].rm_eo = (regoff_t )((BIT_STATUS_AT(reg->bt_mem_end, i)\n\t\t\t\t? STACK_AT(mem_end_stk[i])->u.mem.pstr\n\t\t\t\t: (OnigPosition)mem_end_stk[i]) - str);\n\t      }\n\t      else {\n\t\trmt[i].rm_so = rmt[i].rm_eo = ONIG_REGION_NOTPOS;\n\t      }\n\t    }\n\t  }\n\t  else {\n#endif /* USE_POSIX_API_REGION_OPTION */\n\t    region->beg[0] = ((pkeep > s) ? s : pkeep) - str;\n\t    region->end[0] = s - str;\n\t    for (i = 1; i <= num_mem; i++) {\n\t      if (mem_end_stk[i] != INVALID_STACK_INDEX) {\n\t\tif (BIT_STATUS_AT(reg->bt_mem_start, i))\n\t\t  region->beg[i] = STACK_AT(mem_start_stk[i])->u.mem.pstr - str;\n\t\telse\n\t\t  region->beg[i] = (OnigPosition)mem_start_stk[i] - str;\n\n\t\tregion->end[i] = (BIT_STATUS_AT(reg->bt_mem_end, i)\n\t\t\t\t  ? STACK_AT(mem_end_stk[i])->u.mem.pstr\n\t\t\t\t  : (OnigPosition)mem_end_stk[i]) - str;\n\t      }\n\t      else {\n\t\tregion->beg[i] = region->end[i] = ONIG_REGION_NOTPOS;\n\t      }\n\t    }\n\n#ifdef USE_CAPTURE_HISTORY\n\t    if (reg->capture_history != 0) {\n              int r;\n              OnigCaptureTreeNode* node;\n\n              if (IS_NULL(region->history_root)) {\n                region->history_root = node = history_node_new();\n                CHECK_NULL_RETURN_MEMERR(node);\n              }\n              else {\n                node = region->history_root;\n                history_tree_clear(node);\n              }\n\n              node->group = 0;\n              node->beg   = ((pkeep > s) ? s : pkeep) - str;\n              node->end   = s - str;\n\n              stkp = stk_base;\n              r = make_capture_history_tree(region->history_root, &stkp,\n                                            stk, str, reg);\n              if (r < 0) {\n                best_len = r; /* error code */\n                goto finish;\n              }\n\t    }\n#endif /* USE_CAPTURE_HISTORY */\n#ifdef USE_POSIX_API_REGION_OPTION\n\t  } /* else IS_POSIX_REGION() */\n#endif\n\t} /* if (region) */\n      } /* n > best_len */\n\n#ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE\n    end_best_len:\n#endif\n      MOP_OUT;\n\n      if (IS_FIND_CONDITION(option)) {\n\tif (IS_FIND_NOT_EMPTY(option) && s == sstart) {\n\t  best_len = ONIG_MISMATCH;\n\t  goto fail; /* for retry */\n\t}\n\tif (IS_FIND_LONGEST(option) && DATA_ENSURE_CHECK1) {\n\t  goto fail; /* for retry */\n\t}\n      }\n\n      /* default behavior: return first-matching result. */\n      goto finish;\n      break;\n\n    case OP_EXACT1:  MOP_IN(OP_EXACT1);\n#if 0\n      DATA_ENSURE(1);\n      if (*p != ONIG_CHARAT(s)) goto fail;\n      p++; s++;\n#endif\n      if (*p != ONIG_CHARAT(s++)) goto fail;\n      DATA_ENSURE(0);\n      p++;\n      MOP_OUT;\n      break;\n\n    case OP_EXACT1_IC:  MOP_IN(OP_EXACT1_IC);\n      {\n\tint len;\n\tUChar *q, lowbuf[ONIGENC_MBC_CASE_FOLD_MAXLEN];\n\n\tDATA_ENSURE(1);\n\tlen = ONIGENC_MBC_CASE_FOLD_SE(it, encode,\n\t\t    /* DISABLE_CASE_FOLD_MULTI_CHAR(case_fold_flag), */\n\t\t    case_fold_flag,\n\t\t    &s, end, lowbuf);\n\tDATA_ENSURE(0);\n\tq = lowbuf;\n\twhile (len-- > 0) {\n\t  if (*p != *q) {\n            goto fail;\n          }\n\t  p++; q++;\n\t}\n      }\n      MOP_OUT;\n      break;\n\n    case OP_EXACT2:  MOP_IN(OP_EXACT2);\n      DATA_ENSURE(2);\n      if (*p != ONIG_CHARAT(s)) goto fail;\n      p++; s++;\n      if (*p != ONIG_CHARAT(s)) goto fail;\n      sprev = s;\n      p++; s++;\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_EXACT3:  MOP_IN(OP_EXACT3);\n      DATA_ENSURE(3);\n      if (*p != ONIG_CHARAT(s)) goto fail;\n      p++; s++;\n      if (*p != ONIG_CHARAT(s)) goto fail;\n      p++; s++;\n      if (*p != ONIG_CHARAT(s)) goto fail;\n      sprev = s;\n      p++; s++;\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_EXACT4:  MOP_IN(OP_EXACT4);\n      DATA_ENSURE(4);\n      if (*p != ONIG_CHARAT(s)) goto fail;\n      p++; s++;\n      if (*p != ONIG_CHARAT(s)) goto fail;\n      p++; s++;\n      if (*p != ONIG_CHARAT(s)) goto fail;\n      p++; s++;\n      if (*p != ONIG_CHARAT(s)) goto fail;\n      sprev = s;\n      p++; s++;\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_EXACT5:  MOP_IN(OP_EXACT5);\n      DATA_ENSURE(5);\n      if (*p != ONIG_CHARAT(s)) goto fail;\n      p++; s++;\n      if (*p != ONIG_CHARAT(s)) goto fail;\n      p++; s++;\n      if (*p != ONIG_CHARAT(s)) goto fail;\n      p++; s++;\n      if (*p != ONIG_CHARAT(s)) goto fail;\n      p++; s++;\n      if (*p != ONIG_CHARAT(s)) goto fail;\n      sprev = s;\n      p++; s++;\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_EXACTN:  MOP_IN(OP_EXACTN);\n      GET_LENGTH_INC(tlen, p);\n      DATA_ENSURE(tlen);\n      while (tlen-- > 0) {\n\tif (*p++ != ONIG_CHARAT(s++)) goto fail;\n      }\n      sprev = s - 1;\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_EXACTN_IC:  MOP_IN(OP_EXACTN_IC);\n      {\n\tint len;\n\tUChar *q, *endp, lowbuf[ONIGENC_MBC_CASE_FOLD_MAXLEN];\n\n\tGET_LENGTH_INC(tlen, p);\n\tendp = p + tlen;\n\n\twhile (p < endp) {\n\t  sprev = s;\n\t  DATA_ENSURE(1);\n\t  len = ONIGENC_MBC_CASE_FOLD_SE(it, encode,\n\t\t      /* DISABLE_CASE_FOLD_MULTI_CHAR(case_fold_flag), */\n\t\t      case_fold_flag,\n\t\t      &s, end, lowbuf);\n\t  DATA_ENSURE(0);\n\t  q = lowbuf;\n\t  while (len-- > 0) {\n\t    if (*p != *q) goto fail;\n\t    p++; q++;\n\t  }\n\t}\n      }\n\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_EXACTMB2N1:  MOP_IN(OP_EXACTMB2N1);\n      DATA_ENSURE(2);\n      if (*p != ONIG_CHARAT(s)) goto fail;\n      p++; s++;\n      if (*p != ONIG_CHARAT(s)) goto fail;\n      p++; s++;\n      MOP_OUT;\n      break;\n\n    case OP_EXACTMB2N2:  MOP_IN(OP_EXACTMB2N2);\n      DATA_ENSURE(4);\n      if (*p != ONIG_CHARAT(s)) goto fail;\n      p++; s++;\n      if (*p != ONIG_CHARAT(s)) goto fail;\n      p++; s++;\n      sprev = s;\n      if (*p != ONIG_CHARAT(s)) goto fail;\n      p++; s++;\n      if (*p != ONIG_CHARAT(s)) goto fail;\n      p++; s++;\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_EXACTMB2N3:  MOP_IN(OP_EXACTMB2N3);\n      DATA_ENSURE(6);\n      if (*p != ONIG_CHARAT(s)) goto fail;\n      p++; s++;\n      if (*p != ONIG_CHARAT(s)) goto fail;\n      p++; s++;\n      if (*p != ONIG_CHARAT(s)) goto fail;\n      p++; s++;\n      if (*p != ONIG_CHARAT(s)) goto fail;\n      p++; s++;\n      sprev = s;\n      if (*p != ONIG_CHARAT(s)) goto fail;\n      p++; s++;\n      if (*p != ONIG_CHARAT(s)) goto fail;\n      p++; s++;\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_EXACTMB2N:  MOP_IN(OP_EXACTMB2N);\n      GET_LENGTH_INC(tlen, p);\n      DATA_ENSURE(tlen * 2);\n      while (tlen-- > 0) {\n\tif (*p != ONIG_CHARAT(s)) goto fail;\n\tp++; s++;\n\tif (*p != ONIG_CHARAT(s)) goto fail;\n\tp++; s++;\n      }\n      sprev = s - 2;\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_EXACTMB3N:  MOP_IN(OP_EXACTMB3N);\n      GET_LENGTH_INC(tlen, p);\n      DATA_ENSURE(tlen * 3);\n      while (tlen-- > 0) {\n\tif (*p != ONIG_CHARAT(s)) goto fail;\n\tp++; s++;\n\tif (*p != ONIG_CHARAT(s)) goto fail;\n\tp++; s++;\n\tif (*p != ONIG_CHARAT(s)) goto fail;\n\tp++; s++;\n      }\n      sprev = s - 3;\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_EXACTMBN:  MOP_IN(OP_EXACTMBN);\n      GET_LENGTH_INC(tlen,  p);  /* mb-len */\n      GET_LENGTH_INC(tlen2, p);  /* string len */\n      tlen2 *= tlen;\n      DATA_ENSURE(tlen2);\n      while (tlen2-- > 0) {\n\tif (*p != ONIG_CHARAT(s)) goto fail;\n\tp++; s++;\n      }\n      sprev = s - tlen;\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_CCLASS:  MOP_IN(OP_CCLASS);\n      DATA_ENSURE(1);\n      if (BITSET_AT(((BitSetRef )p), ONIG_CHARAT(s)) == 0) goto fail;\n      p += SIZE_BITSET;\n      s += enclen_se(it, encode, s);   /* OP_CCLASS can match mb-code. \\D, \\S */\n      MOP_OUT;\n      break;\n\n    case OP_CCLASS_MB:  MOP_IN(OP_CCLASS_MB);\n      if (! ONIGENC_IS_MBC_HEAD_SE(it, encode, s)) goto fail;\n\n    cclass_mb:\n      GET_LENGTH_INC(tlen, p);\n      {\n\tOnigCodePoint code;\n\tOnigPosition ss;\n\tint mb_len;\n\n\tDATA_ENSURE(1);\n\tmb_len = enclen_se(it, encode, s);\n\tDATA_ENSURE(mb_len);\n\tss = s;\n\ts += mb_len;\n\tcode = ONIGENC_MBC_TO_CODE_SE(it, encode, ss, s);\n\n#ifdef PLATFORM_UNALIGNED_WORD_ACCESS\n\tif (! onig_is_in_code_range(p, code)) goto fail;\n#else\n\tUChar* q = p;\n\tALIGNMENT_RIGHT(q);\n\tif (! onig_is_in_code_range(q, code)) goto fail;\n#endif\n      }\n      p += tlen;\n      MOP_OUT;\n      break;\n\n    case OP_CCLASS_MIX:  MOP_IN(OP_CCLASS_MIX);\n      DATA_ENSURE(1);\n      if (ONIGENC_IS_MBC_HEAD_SE(it, encode, s)) {\n\tp += SIZE_BITSET;\n\tgoto cclass_mb;\n      }\n      else {\n\tif (BITSET_AT(((BitSetRef )p), ONIG_CHARAT(s)) == 0)\n\t  goto fail;\n\n\tp += SIZE_BITSET;\n\tGET_LENGTH_INC(tlen, p);\n\tp += tlen;\n\ts++;\n      }\n      MOP_OUT;\n      break;\n\n    case OP_CCLASS_NOT:  MOP_IN(OP_CCLASS_NOT);\n      DATA_ENSURE(1);\n      if (BITSET_AT(((BitSetRef )p), ONIG_CHARAT(s)) != 0) goto fail;\n      p += SIZE_BITSET;\n      s += enclen_se(it, encode, s);\n      MOP_OUT;\n      break;\n\n    case OP_CCLASS_MB_NOT:  MOP_IN(OP_CCLASS_MB_NOT);\n      DATA_ENSURE(1);\n      if (! ONIGENC_IS_MBC_HEAD_SE(it, encode, s)) {\n\ts++;\n\tGET_LENGTH_INC(tlen, p);\n\tp += tlen;\n\tgoto cc_mb_not_success;\n      }\n\n    cclass_mb_not:\n      GET_LENGTH_INC(tlen, p);\n      {\n\tOnigCodePoint code;\n\tOnigPosition ss;\n\tint mb_len = enclen_se(it, encode, s);\n\n\tif (! DATA_ENSURE_CHECK(mb_len)) {\n          DATA_ENSURE(1);\n\t  s = end;\n\t  p += tlen;\n\t  goto cc_mb_not_success;\n\t}\n\n\tss = s;\n\ts += mb_len;\n\tcode = ONIGENC_MBC_TO_CODE_SE(it, encode, ss, s);\n\n#ifdef PLATFORM_UNALIGNED_WORD_ACCESS\n\tif (onig_is_in_code_range(p, code)) goto fail;\n#else\n\tUChar* q = p;\n\tALIGNMENT_RIGHT(q);\n\tif (onig_is_in_code_range(q, code)) goto fail;\n#endif\n      }\n      p += tlen;\n\n    cc_mb_not_success:\n      MOP_OUT;\n      break;\n\n    case OP_CCLASS_MIX_NOT:  MOP_IN(OP_CCLASS_MIX_NOT);\n      DATA_ENSURE(1);\n      if (ONIGENC_IS_MBC_HEAD_SE(it, encode, s)) {\n\tp += SIZE_BITSET;\n\tgoto cclass_mb_not;\n      }\n      else {\n\tif (BITSET_AT(((BitSetRef )p), ONIG_CHARAT(s)) != 0)\n\t  goto fail;\n\n\tp += SIZE_BITSET;\n\tGET_LENGTH_INC(tlen, p);\n\tp += tlen;\n\ts++;\n      }\n      MOP_OUT;\n      break;\n\n    case OP_CCLASS_NODE:  MOP_IN(OP_CCLASS_NODE);\n      {\n\tOnigCodePoint code;\n        void *node;\n        int mb_len;\n        OnigPosition ss;\n\n        DATA_ENSURE(1);\n        GET_POINTER_INC(node, p);\n\tmb_len = enclen_se(it, encode, s);\n\tss = s;\n\ts += mb_len;\n\tDATA_ENSURE(0);\n\tcode = ONIGENC_MBC_TO_CODE_SE(it, encode, ss, s);\n\tif (onig_is_code_in_cc_len(mb_len, code, node) == 0) goto fail;\n      }\n      MOP_OUT;\n      break;\n\n    case OP_ANYCHAR:  MOP_IN(OP_ANYCHAR);\n      DATA_ENSURE(1);\n      n = enclen_se(it, encode, s);\n      DATA_ENSURE(n);\n      if (ONIGENC_IS_MBC_NEWLINE_EX_SE(it, encode, s, str, end, option, 0)) goto fail;\n      s += n;\n      MOP_OUT;\n      break;\n\n    case OP_ANYCHAR_ML:  MOP_IN(OP_ANYCHAR_ML);\n      DATA_ENSURE(1);\n      n = enclen_se(it, encode, s);\n      DATA_ENSURE(n);\n      s += n;\n      MOP_OUT;\n      break;\n\n    case OP_ANYCHAR_STAR:  MOP_IN(OP_ANYCHAR_STAR);\n      while (DATA_ENSURE_CHECK1) {\n\tSTACK_PUSH_ALT(p, s, sprev, pkeep);\n\tn = enclen_se(it, encode, s);\n        DATA_ENSURE(n);\n        if (ONIGENC_IS_MBC_NEWLINE_EX_SE(it, encode, s, str, end, option, 0))  goto fail;\n        sprev = s;\n        s += n;\n      }\n      MOP_OUT;\n      break;\n\n    case OP_ANYCHAR_ML_STAR:  MOP_IN(OP_ANYCHAR_ML_STAR);\n      while (DATA_ENSURE_CHECK1) {\n\tSTACK_PUSH_ALT(p, s, sprev, pkeep);\n\tn = enclen_se(it, encode, s);\n\tif (n > 1) {\n\t  DATA_ENSURE(n);\n\t  sprev = s;\n\t  s += n;\n\t}\n\telse {\n\t  sprev = s;\n\t  s++;\n\t}\n      }\n      MOP_OUT;\n      break;\n\n    case OP_ANYCHAR_STAR_PEEK_NEXT:  MOP_IN(OP_ANYCHAR_STAR_PEEK_NEXT);\n      while (DATA_ENSURE_CHECK1) {\n\tif (*p == ONIG_CHARAT(s)) {\n\t  STACK_PUSH_ALT(p + 1, s, sprev, pkeep);\n\t}\n\tn = enclen_se(it, encode, s);\n        DATA_ENSURE(n);\n        if (ONIGENC_IS_MBC_NEWLINE_EX_SE(it, encode, s, str, end, option, 0))  goto fail;\n        sprev = s;\n        s += n;\n      }\n      p++;\n      MOP_OUT;\n      break;\n\n    case OP_ANYCHAR_ML_STAR_PEEK_NEXT:MOP_IN(OP_ANYCHAR_ML_STAR_PEEK_NEXT);\n      while (DATA_ENSURE_CHECK1) {\n\tif (*p == ONIG_CHARAT(s)) {\n\t  STACK_PUSH_ALT(p + 1, s, sprev, pkeep);\n\t}\n\tn = enclen_se(it, encode, s);\n\tif (n > 1) {\n\t  DATA_ENSURE(n);\n\t  sprev = s;\n\t  s += n;\n\t}\n\telse {\n\t  sprev = s;\n\t  s++;\n\t}\n      }\n      p++;\n      MOP_OUT;\n      break;\n\n#ifdef USE_COMBINATION_EXPLOSION_CHECK\n    case OP_STATE_CHECK_ANYCHAR_STAR:  MOP_IN(OP_STATE_CHECK_ANYCHAR_STAR);\n      GET_STATE_CHECK_NUM_INC(mem, p);\n      while (DATA_ENSURE_CHECK1) {\n\tSTATE_CHECK_VAL(scv, mem);\n\tif (scv) goto fail;\n\n\tSTACK_PUSH_ALT_WITH_STATE_CHECK(p, s, sprev, mem, pkeep);\n\tn = enclen_se(it, encode, s);\n        DATA_ENSURE(n);\n        if (ONIGENC_IS_MBC_NEWLINE_EX_SE(it, encode, s, str, end, option, 0))  goto fail;\n        sprev = s;\n        s += n;\n      }\n      MOP_OUT;\n      break;\n\n    case OP_STATE_CHECK_ANYCHAR_ML_STAR:\n      MOP_IN(OP_STATE_CHECK_ANYCHAR_ML_STAR);\n\n      GET_STATE_CHECK_NUM_INC(mem, p);\n      while (DATA_ENSURE_CHECK1) {\n\tSTATE_CHECK_VAL(scv, mem);\n\tif (scv) goto fail;\n\n\tSTACK_PUSH_ALT_WITH_STATE_CHECK(p, s, sprev, mem, pkeep);\n\tn = enclen_se(it, encode, s);\n\tif (n > 1) {\n\t  DATA_ENSURE(n);\n\t  sprev = s;\n\t  s += n;\n\t}\n\telse {\n\t  sprev = s;\n\t  s++;\n\t}\n      }\n      MOP_OUT;\n      break;\n#endif /* USE_COMBINATION_EXPLOSION_CHECK */\n\n    case OP_WORD:  MOP_IN(OP_WORD);\n      DATA_ENSURE(1);\n      if (! ONIGENC_IS_MBC_WORD_SE(it, encode, s, end))\n\tgoto fail;\n\n      s += enclen_se(it, encode, s);\n      MOP_OUT;\n      break;\n\n    case OP_ASCII_WORD:  MOP_IN(OP_ASCII_WORD);\n      DATA_ENSURE(1);\n      if (! ONIGENC_IS_MBC_ASCII_WORD_SE(it, encode, s, end))\n\tgoto fail;\n\n      s += enclen_se(it, encode, s);\n      MOP_OUT;\n      break;\n\n    case OP_NOT_WORD:  MOP_IN(OP_NOT_WORD);\n      DATA_ENSURE(1);\n      if (ONIGENC_IS_MBC_WORD_SE(it, encode, s, end))\n\tgoto fail;\n\n      s += enclen_se(it, encode, s);\n      MOP_OUT;\n      break;\n\n    case OP_NOT_ASCII_WORD:  MOP_IN(OP_NOT_ASCII_WORD);\n      DATA_ENSURE(1);\n      if (ONIGENC_IS_MBC_ASCII_WORD_SE(it, encode, s, end))\n\tgoto fail;\n\n      s += enclen_se(it, encode, s);\n      MOP_OUT;\n      break;\n\n    case OP_WORD_BOUND:  MOP_IN(OP_WORD_BOUND);\n      if (ON_STR_BEGIN(s)) {\n\tDATA_ENSURE(1);\n\tif (! ONIGENC_IS_MBC_WORD_SE(it, encode, s, end))\n\t  goto fail;\n      }\n      else if (ON_STR_END(s)) {\n\tif (! ONIGENC_IS_MBC_WORD_SE(it, encode, sprev, end))\n\t  goto fail;\n      }\n      else {\n\tif (ONIGENC_IS_MBC_WORD_SE(it, encode, s, end)\n\t    == ONIGENC_IS_MBC_WORD_SE(it, encode, sprev, end))\n\t  goto fail;\n      }\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_ASCII_WORD_BOUND:  MOP_IN(OP_ASCII_WORD_BOUND);\n      if (ON_STR_BEGIN(s)) {\n\tDATA_ENSURE(1);\n\tif (! ONIGENC_IS_MBC_ASCII_WORD_SE(it, encode, s, end))\n\t  goto fail;\n      }\n      else if (ON_STR_END(s)) {\n\tif (! ONIGENC_IS_MBC_ASCII_WORD_SE(it, encode, sprev, end))\n\t  goto fail;\n      }\n      else {\n\tif (ONIGENC_IS_MBC_ASCII_WORD_SE(it, encode, s, end)\n\t    == ONIGENC_IS_MBC_ASCII_WORD_SE(it, encode, sprev, end))\n\t  goto fail;\n      }\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_NOT_WORD_BOUND:  MOP_IN(OP_NOT_WORD_BOUND);\n      if (ON_STR_BEGIN(s)) {\n\tif (DATA_ENSURE_CHECK1 && ONIGENC_IS_MBC_WORD_SE(it, encode, s, end))\n\t  goto fail;\n      }\n      else if (ON_STR_END(s)) {\n\tif (ONIGENC_IS_MBC_WORD_SE(it, encode, sprev, end))\n\t  goto fail;\n      }\n      else {\n\tif (ONIGENC_IS_MBC_WORD_SE(it, encode, s, end)\n\t    != ONIGENC_IS_MBC_WORD_SE(it, encode, sprev, end))\n\t  goto fail;\n      }\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_NOT_ASCII_WORD_BOUND:  MOP_IN(OP_NOT_ASCII_WORD_BOUND);\n      if (ON_STR_BEGIN(s)) {\n\tif (DATA_ENSURE_CHECK1 && ONIGENC_IS_MBC_ASCII_WORD_SE(it, encode, s, end))\n\t  goto fail;\n      }\n      else if (ON_STR_END(s)) {\n\tif (ONIGENC_IS_MBC_ASCII_WORD_SE(it, encode, sprev, end))\n\t  goto fail;\n      }\n      else {\n\tif (ONIGENC_IS_MBC_ASCII_WORD_SE(it, encode, s, end)\n\t    != ONIGENC_IS_MBC_ASCII_WORD_SE(it, encode, sprev, end))\n\t  goto fail;\n      }\n      MOP_OUT;\n      continue;\n      break;\n\n#ifdef USE_WORD_BEGIN_END\n    case OP_WORD_BEGIN:  MOP_IN(OP_WORD_BEGIN);\n      if (DATA_ENSURE_CHECK1 /*&& ONIGENC_IS_MBC_WORD_SE(it, encode, s, end)*/) {\n\tif (ON_STR_BEGIN(s) || !ONIGENC_IS_MBC_WORD_SE(it, encode, sprev, end) || !ONIGENC_IS_MBC_WORD_SE(it, encode, s, end)) {\n\t  MOP_OUT;\n\t  continue;\n\t} else if (ONIGENC_SCRIPT_SE(it, encode, sprev, end) != ONIGENC_SCRIPT_SE(it, encode, s, end)) {\n\t\tif (!ONIGENC_IS_MBC_SINGLEBYTE_SE(it, encode, sprev, end) || !ONIGENC_IS_MBC_SINGLEBYTE_SE(it, encode, s, end)) {\n\t\t\tMOP_OUT;\n\t\t\tcontinue;\n\t\t}\n\t}\n      }\n      goto fail;\n      break;\n\n    case OP_ASCII_WORD_BEGIN:  MOP_IN(OP_ASCII_WORD_BEGIN);\n      if (DATA_ENSURE_CHECK1 && ONIGENC_IS_MBC_ASCII_WORD_SE(it, encode, s, end)) {\n\tif (ON_STR_BEGIN(s) || !ONIGENC_IS_MBC_ASCII_WORD_SE(it, encode, sprev, end)) {\n\t  MOP_OUT;\n\t  continue;\n\t}\n      }\n      goto fail;\n      break;\n\n    case OP_WORD_END:  MOP_IN(OP_WORD_END);\n      if (!ON_STR_BEGIN(s) /*&& ONIGENC_IS_MBC_WORD_SE(it, encode, sprev, end)*/) {\n\tif (ON_STR_END(s) || !ONIGENC_IS_MBC_WORD_SE(it, encode, s, end) || !ONIGENC_IS_MBC_WORD_SE(it, encode, sprev, end)) {\n\t  MOP_OUT;\n\t  continue;\n\t} else if (ONIGENC_SCRIPT_SE(it, encode, s, end) != ONIGENC_SCRIPT_SE(it, encode, sprev, end)) {\n\t\tif (!ONIGENC_IS_MBC_SINGLEBYTE_SE(it, encode, s, end) || !ONIGENC_IS_MBC_SINGLEBYTE_SE(it, encode, sprev, end)) {\n\t\t\tMOP_OUT;\n\t\t\tcontinue;\n\t\t}\n\t}\n      }\n      goto fail;\n      break;\n\n    case OP_ASCII_WORD_END:  MOP_IN(OP_ASCII_WORD_END);\n      if (!ON_STR_BEGIN(s) && ONIGENC_IS_MBC_ASCII_WORD_SE(it, encode, sprev, end)) {\n\tif (ON_STR_END(s) || !ONIGENC_IS_MBC_ASCII_WORD_SE(it, encode, s, end)) {\n\t  MOP_OUT;\n\t  continue;\n\t}\n      }\n      goto fail;\n      break;\n#endif\n\n    case OP_BEGIN_BUF:  MOP_IN(OP_BEGIN_BUF);\n      if (! ON_STR_BEGIN(s)) goto fail;\n\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_END_BUF:  MOP_IN(OP_END_BUF);\n      if (! ON_STR_END(s)) goto fail;\n\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_BEGIN_LINE:  MOP_IN(OP_BEGIN_LINE);\n    op_begin_line:\n      if (ON_STR_BEGIN(s)) {\n\tif (IS_NOTBOL(msa->options)) goto fail;\n\tMOP_OUT;\n\tcontinue;\n      }\n      else if (ONIGENC_IS_MBC_NEWLINE_SE(it, encode, sprev, end)\n#ifdef USE_CRNL_AS_LINE_TERMINATOR\n\t\t&& !(IS_NEWLINE_CRLF(option)\n\t\t     && ONIGENC_IS_MBC_CRNL_SE(it,encode, sprev, end))\n#endif\n\t\t/*&& !ON_STR_END(s)*/) {\n\tMOP_OUT;\n\tcontinue;\n      }\n      goto fail;\n      break;\n\n    case OP_END_LINE:  MOP_IN(OP_END_LINE);\n      if (ON_STR_END(s)) {\n#ifndef USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE\n\tif (IS_EMPTY_STR || !ONIGENC_IS_MBC_NEWLINE_EX_SE(it, encode, sprev, str, end, option, 1)) {\n#endif\n\t  if (IS_NOTEOL(msa->options)) goto fail;\n\t  MOP_OUT;\n\t  continue;\n#ifndef USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE\n\t}\n#endif\n      }\n      else if (ONIGENC_IS_MBC_NEWLINE_EX_SE(it, encode, s, str, end, option, 1)) {\n\tMOP_OUT;\n\tcontinue;\n      }\n      goto fail;\n      break;\n\n    case OP_SEMI_END_BUF:  MOP_IN(OP_SEMI_END_BUF);\n      if (ON_STR_END(s)) {\n#ifndef USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE\n\tif (IS_EMPTY_STR || !ONIGENC_IS_MBC_NEWLINE_EX_SE(it, encode, sprev, str, end, option, 1)) {\n#endif\n\t  if (IS_NOTEOL(msa->options)) goto fail;\n\t  MOP_OUT;\n\t  continue;\n#ifndef USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE\n\t}\n#endif\n      }\n      else if (ONIGENC_IS_MBC_NEWLINE_EX_SE(it, encode, s, str, end, option, 1)) {\n\tOnigPosition ss = s + enclen_se(it, encode, s);\n\tif (ON_STR_END(ss)) {\n\t  MOP_OUT;\n\t  continue;\n\t}\n#ifdef USE_CRNL_AS_LINE_TERMINATOR\n\telse if (IS_NEWLINE_CRLF(option)\n\t    && ONIGENC_IS_MBC_CRNL_SE(it, encode, s, end)) {\n\t  ss += enclen_se(it, encode, ss);\n\t  if (ON_STR_END(ss)) {\n\t    MOP_OUT;\n\t    continue;\n\t  }\n\t}\n#endif\n      }\n      goto fail;\n      break;\n\n    case OP_BEGIN_POSITION:  MOP_IN(OP_BEGIN_POSITION);\n      if (s != msa->gpos)\n\tgoto fail;\n\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_BEGIN_POS_OR_LINE:  MOP_IN(OP_BEGIN_POS_OR_LINE);\n      if (s != msa->gpos)\n\tgoto op_begin_line;\n\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_MEMORY_START_PUSH:  MOP_IN(OP_MEMORY_START_PUSH);\n      GET_MEMNUM_INC(mem, p);\n      STACK_PUSH_MEM_START(mem, s);\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_MEMORY_START:  MOP_IN(OP_MEMORY_START);\n      GET_MEMNUM_INC(mem, p);\n      mem_start_stk[mem] = (OnigStackIndex)(s);\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_MEMORY_END_PUSH:  MOP_IN(OP_MEMORY_END_PUSH);\n      GET_MEMNUM_INC(mem, p);\n      STACK_PUSH_MEM_END(mem, s);\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_MEMORY_END:  MOP_IN(OP_MEMORY_END);\n      GET_MEMNUM_INC(mem, p);\n      mem_end_stk[mem] = (OnigStackIndex)(s);\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_KEEP:  MOP_IN(OP_KEEP);\n      pkeep = s;\n      MOP_OUT;\n      continue;\n      break;\n\n#ifdef USE_SUBEXP_CALL\n    case OP_MEMORY_END_PUSH_REC:  MOP_IN(OP_MEMORY_END_PUSH_REC);\n      GET_MEMNUM_INC(mem, p);\n      STACK_GET_MEM_START(mem, stkp); /* should be before push mem-end. */\n      STACK_PUSH_MEM_END(mem, s);\n      mem_start_stk[mem] = GET_STACK_INDEX(stkp);\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_MEMORY_END_REC:  MOP_IN(OP_MEMORY_END_REC);\n      GET_MEMNUM_INC(mem, p);\n      mem_end_stk[mem] = (OnigStackIndex)s;\n      STACK_GET_MEM_START(mem, stkp);\n\n      if (BIT_STATUS_AT(reg->bt_mem_start, mem))\n\tmem_start_stk[mem] = GET_STACK_INDEX(stkp);\n      else\n\tmem_start_stk[mem] = (OnigStackIndex )(stkp->u.mem.pstr);\n\n      STACK_PUSH_MEM_END_MARK(mem);\n      MOP_OUT;\n      continue;\n      break;\n#endif\n\n    case OP_BACKREF1:  MOP_IN(OP_BACKREF1);\n      mem = 1;\n      goto backref;\n      break;\n\n    case OP_BACKREF2:  MOP_IN(OP_BACKREF2);\n      mem = 2;\n      goto backref;\n      break;\n\n    case OP_BACKREFN:  MOP_IN(OP_BACKREFN);\n      GET_MEMNUM_INC(mem, p);\n    backref:\n      {\n\tint len;\n\tOnigPosition pstart, pend;\n\n\t/* if you want to remove following line,\n\t   you should check in parse and compile time. */\n\tif (mem > num_mem) goto fail;\n\tif (mem_end_stk[mem]   == INVALID_STACK_INDEX) goto fail;\n\tif (mem_start_stk[mem] == INVALID_STACK_INDEX) goto fail;\n\n\tif (BIT_STATUS_AT(reg->bt_mem_start, mem))\n\t  pstart = STACK_AT(mem_start_stk[mem])->u.mem.pstr;\n\telse\n\t  pstart = (OnigPosition)mem_start_stk[mem];\n\n\tpend = (BIT_STATUS_AT(reg->bt_mem_end, mem)\n\t\t? STACK_AT(mem_end_stk[mem])->u.mem.pstr\n\t\t: (OnigPosition)mem_end_stk[mem]);\n\tn = pend - pstart;\n\tDATA_ENSURE(n);\n\tsprev = s;\n\tSTRING_CMP_SE(it, pstart, s, n);\n\twhile (sprev + (len = enclen_se(it, encode, sprev)) < s)\n\t  sprev += len;\n\n\tMOP_OUT;\n\tcontinue;\n      }\n      break;\n\n    case OP_BACKREFN_IC:  MOP_IN(OP_BACKREFN_IC);\n      GET_MEMNUM_INC(mem, p);\n      {\n\tint len;\n\tOnigPosition pstart, pend;\n\n\t/* if you want to remove following line,\n\t   you should check in parse and compile time. */\n\tif (mem > num_mem) goto fail;\n\tif (mem_end_stk[mem]   == INVALID_STACK_INDEX) goto fail;\n\tif (mem_start_stk[mem] == INVALID_STACK_INDEX) goto fail;\n\n\tif (BIT_STATUS_AT(reg->bt_mem_start, mem))\n\t  pstart = STACK_AT(mem_start_stk[mem])->u.mem.pstr;\n\telse\n\t  pstart = (OnigPosition)(mem_start_stk[mem]);\n\n\tpend = (BIT_STATUS_AT(reg->bt_mem_end, mem)\n\t\t? STACK_AT(mem_end_stk[mem])->u.mem.pstr\n\t\t: (OnigPosition)(mem_end_stk[mem]));\n\tn = pend - pstart;\n\tDATA_ENSURE(n);\n\tsprev = s;\n\tSTRING_CMP_IC_SE(it, case_fold_flag, pstart, &s, n);\n\twhile (sprev + (len = enclen_se(it, encode, sprev)) < s)\n\t  sprev += len;\n\n\tMOP_OUT;\n\tcontinue;\n      }\n      break;\n\n    case OP_BACKREF_MULTI:  MOP_IN(OP_BACKREF_MULTI);\n      {\n\tint len, is_fail;\n\tOnigPosition pstart, pend, swork;\n\n\tGET_LENGTH_INC(tlen, p);\n\tfor (i = 0; i < tlen; i++) {\n\t  GET_MEMNUM_INC(mem, p);\n\n\t  if (mem_end_stk[mem]   == INVALID_STACK_INDEX) continue;\n\t  if (mem_start_stk[mem] == INVALID_STACK_INDEX) continue;\n\n\t  if (BIT_STATUS_AT(reg->bt_mem_start, mem))\n\t    pstart = STACK_AT(mem_start_stk[mem])->u.mem.pstr;\n\t  else\n\t    pstart = (OnigPosition)(mem_start_stk[mem]);\n\n\t  pend = (BIT_STATUS_AT(reg->bt_mem_end, mem)\n\t\t  ? STACK_AT(mem_end_stk[mem])->u.mem.pstr\n\t\t  : (OnigPosition)(mem_end_stk[mem]));\n\t  n = pend - pstart;\n\t  DATA_ENSURE(n);\n\t  sprev = s;\n\t  swork = s;\n\t  STRING_CMP_VALUE_SE(it, pstart, swork, n, is_fail);\n\t  if (is_fail) continue;\n\t  s = swork;\n\t  while (sprev + (len = enclen_se(it, encode, sprev)) < s)\n\t    sprev += len;\n\n\t  p += (SIZE_MEMNUM * (tlen - i - 1));\n\t  break; /* success */\n\t}\n\tif (i == tlen) goto fail;\n\tMOP_OUT;\n\tcontinue;\n      }\n      break;\n\n    case OP_BACKREF_MULTI_IC:  MOP_IN(OP_BACKREF_MULTI_IC);\n      {\n\tint len, is_fail;\n\tOnigPosition pstart, pend, swork;\n\n\tGET_LENGTH_INC(tlen, p);\n\tfor (i = 0; i < tlen; i++) {\n\t  GET_MEMNUM_INC(mem, p);\n\n\t  if (mem_end_stk[mem]   == INVALID_STACK_INDEX) continue;\n\t  if (mem_start_stk[mem] == INVALID_STACK_INDEX) continue;\n\n\t  if (BIT_STATUS_AT(reg->bt_mem_start, mem))\n\t    pstart = STACK_AT(mem_start_stk[mem])->u.mem.pstr;\n\t  else\n\t    pstart = (OnigPosition)(mem_start_stk[mem]);\n\n\t  pend = (BIT_STATUS_AT(reg->bt_mem_end, mem)\n\t\t  ? STACK_AT(mem_end_stk[mem])->u.mem.pstr\n\t\t  : (OnigPosition)(mem_end_stk[mem]));\n\t  n = pend - pstart;\n\t  DATA_ENSURE(n);\n\t  sprev = s;\n\t  swork = s;\n\t  STRING_CMP_VALUE_IC_SE(it, case_fold_flag, pstart, &swork, n, is_fail);\n\t  if (is_fail) continue;\n\t  s = swork;\n\t  while (sprev + (len = enclen_se(it, encode, sprev)) < s)\n\t    sprev += len;\n\n\t  p += (SIZE_MEMNUM * (tlen - i - 1));\n\t  break; /* success */\n\t}\n\tif (i == tlen) goto fail;\n\tMOP_OUT;\n\tcontinue;\n      }\n      break;\n\n#ifdef USE_BACKREF_WITH_LEVEL\n    case OP_BACKREF_WITH_LEVEL:\n      {\n\tint len;\n\tOnigOptionType ic;\n\tLengthType level;\n\n\tGET_OPTION_INC(ic,    p);\n\tGET_LENGTH_INC(level, p);\n\tGET_LENGTH_INC(tlen,  p);\n\n\tsprev = s;\n\tif (backref_match_at_nested_level(it, reg, stk, stk_base, ic\n\t\t  , case_fold_flag, (int )level, (int )tlen, p, &s, end)) {\n\t  while (sprev + (len = enclen_se(it, encode, sprev)) < s)\n\t    sprev += len;\n\n\t  p += (SIZE_MEMNUM * tlen);\n\t}\n\telse\n\t  goto fail;\n\n\tMOP_OUT;\n\tcontinue;\n      }\n\n      break;\n#endif\n\n#if 0   /* no need: IS_DYNAMIC_OPTION() == 0 */\n    case OP_SET_OPTION_PUSH:  MOP_IN(OP_SET_OPTION_PUSH);\n      GET_OPTION_INC(option, p);\n      STACK_PUSH_ALT(p, s, sprev, pkeep);\n      p += SIZE_OP_SET_OPTION + SIZE_OP_FAIL;\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_SET_OPTION:  MOP_IN(OP_SET_OPTION);\n      GET_OPTION_INC(option, p);\n      MOP_OUT;\n      continue;\n      break;\n#endif\n\n    case OP_NULL_CHECK_START:  MOP_IN(OP_NULL_CHECK_START);\n      GET_MEMNUM_INC(mem, p);    /* mem: null check id */\n      STACK_PUSH_NULL_CHECK_START(mem, s);\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_NULL_CHECK_END:  MOP_IN(OP_NULL_CHECK_END);\n      {\n\tint isnull;\n\n\tGET_MEMNUM_INC(mem, p); /* mem: null check id */\n\tSTACK_NULL_CHECK(isnull, mem, s);\n\tif (isnull) {\n#ifdef ONIG_DEBUG_MATCH\n\t  fprintf(stderr, \"NULL_CHECK_END: skip  id:%d, s:%d, ptr: %p)\\n\",\n\t\t  (int )mem, (int )s, it->ptr);\n#endif\n\tnull_check_found:\n\t  /* empty loop founded, skip next instruction */\n\t  switch (*p++) {\n\t  case OP_JUMP:\n\t  case OP_PUSH:\n\t    p += SIZE_RELADDR;\n\t    break;\n\t  case OP_REPEAT_INC:\n\t  case OP_REPEAT_INC_NG:\n\t  case OP_REPEAT_INC_SG:\n\t  case OP_REPEAT_INC_NG_SG:\n\t    p += SIZE_MEMNUM;\n\t    break;\n\t  default:\n\t    goto unexpected_bytecode_error;\n\t    break;\n\t  }\n\t}\n      }\n      MOP_OUT;\n      continue;\n      break;\n\n#ifdef USE_MONOMANIAC_CHECK_CAPTURES_IN_ENDLESS_REPEAT\n    case OP_NULL_CHECK_END_MEMST:  MOP_IN(OP_NULL_CHECK_END_MEMST);\n      {\n\tint isnull;\n\n\tGET_MEMNUM_INC(mem, p); /* mem: null check id */\n\tSTACK_NULL_CHECK_MEMST(isnull, mem, s, reg);\n\tif (isnull) {\n#ifdef ONIG_DEBUG_MATCH\n\t  fprintf(stderr, \"NULL_CHECK_END_MEMST: skip  id:%d, s:%d, ptr: %p)\\n\",\n\t\t  (int )mem, (int )s, it->ptr);\n#endif\n\t  if (isnull == -1) goto fail;\n\t  goto null_check_found;\n\t}\n      }\n      MOP_OUT;\n      continue;\n      break;\n#endif\n\n#ifdef USE_SUBEXP_CALL\n    case OP_NULL_CHECK_END_MEMST_PUSH:\n      MOP_IN(OP_NULL_CHECK_END_MEMST_PUSH);\n      {\n\tint isnull;\n\n\tGET_MEMNUM_INC(mem, p); /* mem: null check id */\n#ifdef USE_MONOMANIAC_CHECK_CAPTURES_IN_ENDLESS_REPEAT\n\tSTACK_NULL_CHECK_MEMST_REC(isnull, mem, s, reg);\n#else\n\tSTACK_NULL_CHECK_REC(isnull, mem, s);\n#endif\n\tif (isnull) {\n#ifdef ONIG_DEBUG_MATCH\n\t  fprintf(stderr, \"NULL_CHECK_END_MEMST_PUSH: skip  id:%d, s:%d ptr: %p)\\n\",\n\t\t  (int )mem, (int )s, it->ptr);\n#endif\n\t  if (isnull == -1) goto fail;\n\t  goto null_check_found;\n\t}\n\telse {\n\t  STACK_PUSH_NULL_CHECK_END(mem);\n\t}\n      }\n      MOP_OUT;\n      continue;\n      break;\n#endif\n\n    case OP_JUMP:  MOP_IN(OP_JUMP);\n      GET_RELADDR_INC(addr, p);\n      p += addr;\n      MOP_OUT;\n      CHECK_INTERRUPT_IN_MATCH_AT;\n      continue;\n      break;\n\n    case OP_PUSH:  MOP_IN(OP_PUSH);\n      GET_RELADDR_INC(addr, p);\n      STACK_PUSH_ALT(p + addr, s, sprev, pkeep);\n      MOP_OUT;\n      continue;\n      break;\n\n#ifdef USE_COMBINATION_EXPLOSION_CHECK\n    case OP_STATE_CHECK_PUSH:  MOP_IN(OP_STATE_CHECK_PUSH);\n      GET_STATE_CHECK_NUM_INC(mem, p);\n      STATE_CHECK_VAL(scv, mem);\n      if (scv) goto fail;\n\n      GET_RELADDR_INC(addr, p);\n      STACK_PUSH_ALT_WITH_STATE_CHECK(p + addr, s, sprev, mem, pkeep);\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_STATE_CHECK_PUSH_OR_JUMP:  MOP_IN(OP_STATE_CHECK_PUSH_OR_JUMP);\n      GET_STATE_CHECK_NUM_INC(mem, p);\n      GET_RELADDR_INC(addr, p);\n      STATE_CHECK_VAL(scv, mem);\n      if (scv) {\n\tp += addr;\n      }\n      else {\n\tSTACK_PUSH_ALT_WITH_STATE_CHECK(p + addr, s, sprev, mem, pkeep);\n      }\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_STATE_CHECK:  MOP_IN(OP_STATE_CHECK);\n      GET_STATE_CHECK_NUM_INC(mem, p);\n      STATE_CHECK_VAL(scv, mem);\n      if (scv) goto fail;\n\n      STACK_PUSH_STATE_CHECK(s, mem);\n      MOP_OUT;\n      continue;\n      break;\n#endif /* USE_COMBINATION_EXPLOSION_CHECK */\n\n    case OP_POP:  MOP_IN(OP_POP);\n      STACK_POP_ONE;\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_PUSH_OR_JUMP_EXACT1:  MOP_IN(OP_PUSH_OR_JUMP_EXACT1);\n      GET_RELADDR_INC(addr, p);\n      if (*p == ONIG_CHARAT(s) && DATA_ENSURE_CHECK1) {\n\tp++;\n\tSTACK_PUSH_ALT(p + addr, s, sprev, pkeep);\n\tMOP_OUT;\n\tcontinue;\n      }\n      p += (addr + 1);\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_PUSH_IF_PEEK_NEXT:  MOP_IN(OP_PUSH_IF_PEEK_NEXT);\n      GET_RELADDR_INC(addr, p);\n      if (*p == ONIG_CHARAT(s)) {\n\tp++;\n\tSTACK_PUSH_ALT(p + addr, s, sprev, pkeep);\n\tMOP_OUT;\n\tcontinue;\n      }\n      p++;\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_REPEAT:  MOP_IN(OP_REPEAT);\n      {\n\tGET_MEMNUM_INC(mem, p);    /* mem: OP_REPEAT ID */\n\tGET_RELADDR_INC(addr, p);\n\n\tSTACK_ENSURE(1);\n\trepeat_stk[mem] = GET_STACK_INDEX(stk);\n\tSTACK_PUSH_REPEAT(mem, p);\n\n\tif (reg->repeat_range[mem].lower == 0) {\n\t  STACK_PUSH_ALT(p + addr, s, sprev, pkeep);\n\t}\n      }\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_REPEAT_NG:  MOP_IN(OP_REPEAT_NG);\n      {\n\tGET_MEMNUM_INC(mem, p);    /* mem: OP_REPEAT ID */\n\tGET_RELADDR_INC(addr, p);\n\n\tSTACK_ENSURE(1);\n\trepeat_stk[mem] = GET_STACK_INDEX(stk);\n\tSTACK_PUSH_REPEAT(mem, p);\n\n\tif (reg->repeat_range[mem].lower == 0) {\n\t  STACK_PUSH_ALT(p, s, sprev, pkeep);\n\t  p += addr;\n\t}\n      }\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_REPEAT_INC:  MOP_IN(OP_REPEAT_INC);\n      GET_MEMNUM_INC(mem, p); /* mem: OP_REPEAT ID */\n      si = repeat_stk[mem];\n      stkp = STACK_AT(si);\n\n    repeat_inc:\n      stkp->u.repeat.count++;\n      if (stkp->u.repeat.count >= reg->repeat_range[mem].upper) {\n        /* end of repeat. Nothing to do. */\n      }\n      else if (stkp->u.repeat.count >= reg->repeat_range[mem].lower) {\n        STACK_PUSH_ALT(p, s, sprev, pkeep);\n        p = STACK_AT(si)->u.repeat.pcode; /* Don't use stkp after PUSH. */\n      }\n      else {\n        p = stkp->u.repeat.pcode;\n      }\n      STACK_PUSH_REPEAT_INC(si);\n      MOP_OUT;\n      CHECK_INTERRUPT_IN_MATCH_AT;\n      continue;\n      break;\n\n    case OP_REPEAT_INC_SG:  MOP_IN(OP_REPEAT_INC_SG);\n      GET_MEMNUM_INC(mem, p); /* mem: OP_REPEAT ID */\n      STACK_GET_REPEAT(mem, stkp);\n      si = GET_STACK_INDEX(stkp);\n      goto repeat_inc;\n      break;\n\n    case OP_REPEAT_INC_NG:  MOP_IN(OP_REPEAT_INC_NG);\n      GET_MEMNUM_INC(mem, p); /* mem: OP_REPEAT ID */\n      si = repeat_stk[mem];\n      stkp = STACK_AT(si);\n\n    repeat_inc_ng:\n      stkp->u.repeat.count++;\n      if (stkp->u.repeat.count < reg->repeat_range[mem].upper) {\n        if (stkp->u.repeat.count >= reg->repeat_range[mem].lower) {\n          UChar* pcode = stkp->u.repeat.pcode;\n\n          STACK_PUSH_REPEAT_INC(si);\n          STACK_PUSH_ALT(pcode, s, sprev, pkeep);\n        }\n        else {\n          p = stkp->u.repeat.pcode;\n          STACK_PUSH_REPEAT_INC(si);\n        }\n      }\n      else if (stkp->u.repeat.count == reg->repeat_range[mem].upper) {\n        STACK_PUSH_REPEAT_INC(si);\n      }\n      MOP_OUT;\n      CHECK_INTERRUPT_IN_MATCH_AT;\n      continue;\n      break;\n\n    case OP_REPEAT_INC_NG_SG:  MOP_IN(OP_REPEAT_INC_NG_SG);\n      GET_MEMNUM_INC(mem, p); /* mem: OP_REPEAT ID */\n      STACK_GET_REPEAT(mem, stkp);\n      si = GET_STACK_INDEX(stkp);\n      goto repeat_inc_ng;\n      break;\n\n    case OP_PUSH_POS:  MOP_IN(OP_PUSH_POS);\n      STACK_PUSH_POS(s, sprev, pkeep);\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_POP_POS:  MOP_IN(OP_POP_POS);\n      {\n\tSTACK_POS_END(stkp);\n\ts     = stkp->u.state.pstr;\n\tsprev = stkp->u.state.pstr_prev;\n      }\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_PUSH_POS_NOT:  MOP_IN(OP_PUSH_POS_NOT);\n      GET_RELADDR_INC(addr, p);\n      STACK_PUSH_POS_NOT(p + addr, s, sprev, pkeep);\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_FAIL_POS:  MOP_IN(OP_FAIL_POS);\n      STACK_POP_TIL_POS_NOT;\n      goto fail;\n      break;\n\n    case OP_PUSH_STOP_BT:  MOP_IN(OP_PUSH_STOP_BT);\n      STACK_PUSH_STOP_BT;\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_POP_STOP_BT:  MOP_IN(OP_POP_STOP_BT);\n      STACK_STOP_BT_END;\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_LOOK_BEHIND:  MOP_IN(OP_LOOK_BEHIND);\n      GET_LENGTH_INC(tlen, p);\n      s = ONIGENC_STEP_BACK_SE(it, encode, str, s, (int )tlen);\n      if (ONIG_IS_BADPOS(s)) goto fail;\n      sprev = onigenc_get_prev_char_head_se(it, encode, str, s);\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_PUSH_LOOK_BEHIND_NOT:  MOP_IN(OP_PUSH_LOOK_BEHIND_NOT);\n      GET_RELADDR_INC(addr, p);\n      GET_LENGTH_INC(tlen, p);\n      q = ONIGENC_STEP_BACK_SE(it, encode, str, s, (int )tlen);\n      if (ONIG_IS_BADPOS(q)) {\n\t/* too short case -> success. ex. /(?<!XXX)a/.match(\"a\")\n\t   If you want to change to fail, replace following line. */\n\tp += addr;\n\t/* goto fail; */\n      }\n      else {\n\tSTACK_PUSH_LOOK_BEHIND_NOT(p + addr, s, sprev, pkeep);\n\ts = q;\n\tsprev = onigenc_get_prev_char_head_se(it, encode, str, s);\n      }\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_FAIL_LOOK_BEHIND_NOT:  MOP_IN(OP_FAIL_LOOK_BEHIND_NOT);\n      STACK_POP_TIL_LOOK_BEHIND_NOT;\n      goto fail;\n      break;\n\n#ifdef USE_SUBEXP_CALL\n    case OP_CALL:  MOP_IN(OP_CALL);\n      GET_ABSADDR_INC(addr, p);\n      STACK_PUSH_CALL_FRAME(p);\n      p = reg->p + addr;\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_RETURN:  MOP_IN(OP_RETURN);\n      STACK_RETURN(p);\n      STACK_PUSH_RETURN;\n      MOP_OUT;\n      continue;\n      break;\n#endif\n\n    case OP_CONDITION:  MOP_IN(OP_CONDITION);\n      GET_MEMNUM_INC(mem, p);\n      GET_RELADDR_INC(addr, p);\n      if ((mem > num_mem) ||\n\t  (mem_end_stk[mem]   == INVALID_STACK_INDEX) ||\n\t  (mem_start_stk[mem] == INVALID_STACK_INDEX)) {\n\tp += addr;\n      }\n      MOP_OUT;\n      continue;\n      break;\n\n    case OP_FINISH:\n      goto finish;\n      break;\n\n    fail:\n      MOP_OUT;\n      /* fall */\n    case OP_FAIL:  MOP_IN(OP_FAIL);\n      STACK_POP;\n      p     = stk->u.state.pcode;\n      s     = stk->u.state.pstr;\n      sprev = stk->u.state.pstr_prev;\n      pkeep = stk->u.state.pkeep;\n\n#ifdef USE_COMBINATION_EXPLOSION_CHECK\n      if (stk->u.state.state_check != 0) {\n        stk->type = STK_STATE_CHECK_MARK;\n        stk++;\n      }\n#endif\n\n      MOP_OUT;\n      continue;\n      break;\n\n    default:\n      goto bytecode_error;\n\n    } /* end of switch */\n    sprev = sbegin;\n  } /* end of while(1) */\n\n finish:\n  STACK_SAVE;\n  return best_len;\n\n#ifdef ONIG_DEBUG\n stack_error:\n  STACK_SAVE;\n  return ONIGERR_STACK_BUG;\n#endif\n\n bytecode_error:\n  STACK_SAVE;\n  return ONIGERR_UNDEFINED_BYTECODE;\n\n unexpected_bytecode_error:\n  STACK_SAVE;\n  return ONIGERR_UNEXPECTED_BYTECODE;\n}\n\nstatic int\nmemcmp_se(OnigIterator* it, UChar* target, UChar* target_end, OnigPosition p) {\n\tint r = 0;\n\twhile (target < target_end) {\n\t\tif (*target != ONIG_CHARAT(p++)) {\n\t\t\tr = 1;\n\t\t\tbreak;\n\t\t}\n\t\ttarget++;\n\t}\n\treturn r;\n}\n\nstatic OnigPosition\nslow_search_se(OnigIterator* it, OnigEncoding enc, UChar* target, UChar* target_end,\n\t    OnigPosition text, OnigPosition text_end, OnigPosition text_range)\n{\n  UChar* t;\n  OnigPosition p, s, end;\n\n  end = text_end;\n  end -= target_end - target - 1;\n  if (end > text_range)\n    end = text_range;\n\n  s = text;\n\n  if (enc->max_enc_len == enc->min_enc_len) {\n    int n = enc->max_enc_len;\n\n    while (s < end) {\n      if (ONIG_CHARAT(s) == *target) {\n\tp = s + 1;\n\tt = target + 1;\n\tif (target_end == t || memcmp_se(it, t, target_end, p) == 0)\n\t  return s;\n      }\n      s += n;\n    }\n    return ONIG_BADPOS;\n  }\n  while (s < end) {\n    if (ONIG_CHARAT(s) == *target) {\n      p = s + 1;\n      t = target + 1;\n      if (target_end == t || memcmp_se(it, t, target_end, p) == 0)\n\treturn s;\n    }\n    s += enclen_se(it, enc, s);\n  }\n\n  return ONIG_BADPOS;\n}\n\nstatic int\nstr_lower_case_match_se(OnigIterator* it, OnigEncoding enc, int case_fold_flag,\n                     const UChar* t, const UChar* tend,\n\t\t     OnigPosition p, OnigPosition end)\n{\n  int lowlen;\n  UChar *q, lowbuf[ONIGENC_MBC_CASE_FOLD_MAXLEN];\n\n  while (t < tend) {\n    lowlen = ONIGENC_MBC_CASE_FOLD_SE(it, enc, case_fold_flag, &p, end, lowbuf);\n    q = lowbuf;\n    while (lowlen > 0) {\n      if (*t++ != *q++)\treturn 0;\n      lowlen--;\n    }\n  }\n\n  return 1;\n}\n\nstatic OnigPosition\nslow_search_ic_se(OnigIterator* it, OnigEncoding enc, int case_fold_flag,\n\t       UChar* target, UChar* target_end,\n\t       OnigPosition text, OnigPosition text_end, OnigPosition text_range)\n{\n  OnigPosition s, end;\n\n  end = text_end;\n  end -= target_end - target - 1;\n  if (end > text_range)\n    end = text_range;\n\n  s = text;\n\n  while (s < end) {\n    if (str_lower_case_match_se(it, enc, case_fold_flag, target, target_end,\n\t\t\t     s, text_end))\n      return s;\n\n    s += enclen_se(it, enc, s);\n  }\n\n  return ONIG_BADPOS;\n}\n\nstatic OnigPosition\nslow_search_backward_se(OnigIterator* it, OnigEncoding enc, UChar* target, UChar* target_end,\n\t\t     OnigPosition text, OnigPosition adjust_text,\n\t\t     OnigPosition text_end, OnigPosition text_start)\n{\n  UChar* t;\n  OnigPosition p, s;\n\n  s = text_end;\n  s -= (target_end - target);\n  if (s > text_start)\n    s = text_start;\n  else\n    s = ONIGENC_LEFT_ADJUST_CHAR_HEAD_SE(it, enc, adjust_text, s);\n\n  while (s >= text) {\n    if (ONIG_CHARAT(s) == *target) {\n      p = s + 1;\n      t = target + 1;\n      while (t < target_end) {\n\tif (*t != ONIG_CHARAT(p++))\n\t  break;\n\tt++;\n      }\n      if (t == target_end)\n\treturn s;\n    }\n    s = onigenc_get_prev_char_head_se(it, enc, adjust_text, s);\n  }\n\n  return ONIG_BADPOS;\n}\n\nstatic OnigPosition\nslow_search_backward_ic_se(OnigIterator* it, OnigEncoding enc, int case_fold_flag,\n\t\t\tUChar* target, UChar* target_end,\n\t\t\tOnigPosition text, OnigPosition adjust_text,\n\t\t\tOnigPosition text_end, OnigPosition text_start)\n{\n  OnigPosition s;\n\n  s = text_end;\n  s -= (target_end - target);\n  if (s > text_start)\n    s = text_start;\n  else\n    s = ONIGENC_LEFT_ADJUST_CHAR_HEAD_SE(it, enc, adjust_text, s);\n\n  while (s >= text) {\n    if (str_lower_case_match_se(it, enc, case_fold_flag,\n                             target, target_end, s, text_end))\n      return s;\n\n    s = onigenc_get_prev_char_head_se(it, enc, adjust_text, s);\n  }\n\n  return ONIG_BADPOS;\n}\n\n#ifndef USE_SUNDAY_QUICK_SEARCH\n/* Boyer-Moore-Horspool search applied to a multibyte string */\nstatic OnigPosition\nbm_search_notrev_se(OnigIterator* it, regex_t* reg, const UChar* target, const UChar* target_end,\n\t\t OnigPosition text, OnigPosition text_end,\n\t\t OnigPosition text_range)\n{\n  const UChar *t;\n  OnigPosition s, se, p, end;\n  const UChar *tail;\n  ptrdiff_t skip, tlen1;\n\n#ifdef ONIG_DEBUG_SEARCH\n  fprintf(stderr, \"bm_search_notrev_se: text: %d, text_end: %d, text_range: %d\\n\",\n\t  (int )text, (int )text_end, (int )text_range);\n#endif\n\n  tail = target_end - 1;\n  tlen1 = tail - target;\n  end = text_range;\n  if (end + tlen1 > text_end)\n    end = text_end - tlen1;\n\n  s = text;\n\n  if (IS_NULL(reg->int_map)) {\n    while (s < end) {\n      p = se = s + tlen1;\n      t = tail;\n      while (ONIG_CHARAT(p) == *t) {\n\tif (t == target) return s;\n\tp--; t--;\n      }\n      skip = reg->map[ONIG_CHARAT(se)];\n      p = s;\n      do {\n        s += enclen_se(it, reg->enc, s);\n      } while ((s - p) < skip && s < end);\n    }\n  }\n  else {\n    while (s < end) {\n      p = se = s + tlen1;\n      t = tail;\n      while (ONIG_CHARAT(p) == *t) {\n\tif (t == target) return s;\n\tp--; t--;\n      }\n      skip = reg->int_map[*se];\n      p = s;\n      do {\n        s += enclen_se(it, reg->enc, s);\n      } while ((s - p) < skip && s < end);\n    }\n  }\n\n  return ONIG_BADPOS;\n}\n\n/* Boyer-Moore-Horspool search */\nstatic OnigPosition\nbm_search_se(OnigIterator* it, regex_t* reg, const UChar* target, const UChar* target_end,\n\t  OnigPosition text, OnigPosition text_end, OnigPosition text_range)\n{\n  const UChar *t;\n  OnigPosition s, p, end;\n  const UChar *tail;\n\n  end = text_range + (target_end - target) - 1;\n  if (end > text_end)\n    end = text_end;\n\n  tail = target_end - 1;\n  s = text + (target_end - target) - 1;\n  if (IS_NULL(reg->int_map)) {\n    while (s < end) {\n      p = s;\n      t = tail;\n      while (ONIG_CHARAT(p) == *t) {\n\tif (t == target) return p;\n\tp--; t--;\n      }\n      s += reg->map[ONIG_CHARAT(s)];\n    }\n  }\n  else { /* see int_map[] */\n    while (s < end) {\n      p = s;\n      t = tail;\n      while (ONIG_CHARAT(p) == *t) {\n\tif (t == target) return p;\n\tp--; t--;\n      }\n      s += reg->int_map[*s];\n    }\n  }\n  return ONIG_BADPOS;\n}\n\n/* Boyer-Moore-Horspool search applied to a multibyte string (ignore case) */\nstatic OnigPosition\nbm_search_notrev_ic(OnigIterator* it, regex_t* reg, const UChar* target, const UChar* target_end,\n\t\t    OnigPosition text, OnigPosition text_end,\n\t\t    OnigPosition text_range)\n{\n  OnigPosition s, se, t, end;\n  const UChar *tail;\n  ptrdiff_t skip, tlen1;\n  OnigEncoding enc = reg->enc;\n  int case_fold_flag = reg->case_fold_flag;\n\n#ifdef ONIG_DEBUG_SEARCH\n  fprintf(stderr, \"bm_search_notrev_ic: text: %d, text_end: %d, text_range: %d\\n\",\n\t  (int )text, (int )text_end, (int )text_range);\n#endif\n\n  tail = target_end - 1;\n  tlen1 = tail - target;\n  end = text_range;\n  if (end + tlen1 > text_end)\n    end = text_end - tlen1;\n\n  s = text;\n\n  if (IS_NULL(reg->int_map)) {\n    while (s < end) {\n      se = s + tlen1;\n      if (str_lower_case_match(enc, case_fold_flag, target, target_end,\n\t\t\t       s, se + 1))\n\treturn s;\n      skip = reg->map[ONIG_CHARAT(se)];\n      t = s;\n      do {\n        s += enclen_se(it, reg->enc, s);\n      } while ((s - t) < skip && s < end);\n    }\n  }\n  else {\n    while (s < end) {\n      se = s + tlen1;\n      if (str_lower_case_match(enc, case_fold_flag, target, target_end,\n\t\t\t       s, se + 1))\n\treturn s;\n      skip = reg->int_map[ONIG_CHARAT(se)];\n      t = s;\n      do {\n        s += enclen_se(it, reg->enc, s);\n      } while ((s - t) < skip && s < end);\n    }\n  }\n\n  return ONIG_BADPOS;\n}\n\n/* Boyer-Moore-Horspool search (ignore case) */\nstatic OnigPosition\nbm_search_ic_se(OnigIterator* it, regex_t* reg, const UChar* target, const UChar* target_end,\n\t     OnigPosition text, OnigPosition text_end, OnigPosition text_range)\n{\n  OnigPosition s, p, end;\n  const UChar *tail;\n  OnigEncoding enc = reg->enc;\n  int case_fold_flag = reg->case_fold_flag;\n\n#ifdef ONIG_DEBUG_SEARCH\n  fprintf(stderr, \"bm_search_ic_se: text: %d, text_end: %d, text_range: %d\\n\",\n\t  (int )text, (int )text_end, (int )text_range);\n#endif\n\n  end = text_range + (target_end - target) - 1;\n  if (end > text_end)\n    end = text_end;\n\n  tail = target_end - 1;\n  s = text + (target_end - target) - 1;\n  if (IS_NULL(reg->int_map)) {\n    while (s < end) {\n      p = s - (target_end - target) + 1;\n      if (str_lower_case_match(enc, case_fold_flag, target, target_end,\n\t\t\t       p, s + 1))\n\treturn p;\n      s += reg->map[ONIG_CHARAT(s)];\n    }\n  }\n  else { /* see int_map[] */\n    while (s < end) {\n      p = s - (target_end - target) + 1;\n      if (str_lower_case_match(enc, case_fold_flag, target, target_end,\n\t\t\t       p, s + 1))\n\treturn p;\n      s += reg->int_map[ONIG_CHARAT(s)];\n    }\n  }\n  return ONIG_BADPOS;\n}\n\n#else /* USE_SUNDAY_QUICK_SEARCH */\n\n/* Sunday's quick search applied to a multibyte string */\nstatic OnigPosition\nbm_search_notrev_se(OnigIterator* it, regex_t* reg, const UChar* target, const UChar* target_end,\n\t\t OnigPosition text, OnigPosition text_end,\n\t\t OnigPosition text_range)\n{\n  const UChar *t;\n  OnigPosition s, se, p, end;\n  const UChar *tail;\n  ptrdiff_t skip, tlen1;\n  OnigEncoding enc = reg->enc;\n  int (*mbc_enc_len_se)(OnigIterator* it, OnigPosition p) = enc->mbc_enc_len_se;\n\n#ifdef ONIG_DEBUG_SEARCH\n  fprintf(stderr, \"bm_search_notrev_se: text: %d, text_end: %d, text_range: %d\\n\",\n\t  (int )text, (int )text_end, (int )text_range);\n#endif\n\n  tail = target_end - 1;\n  tlen1 = tail - target;\n  end = text_range;\n  if (end + tlen1 > text_end)\n    end = text_end - tlen1;\n\n  s = text;\n\n  if (IS_NULL(reg->int_map)) {\n    while (s < end) {\n      p = se = s + tlen1;\n      t = tail;\n      while (ONIG_CHARAT(p) == *t) {\n\tif (t == target) return s;\n\tp--; t--;\n      }\n      if (s + 1 >= end) break;\n      skip = reg->map[ONIG_CHARAT(se + 1)];\n      p = s;\n      do {\n        s += mbc_enc_len_se(it, s);\n      } while ((s - p) < skip && s < end);\n    }\n  }\n  else {\n    while (s < end) {\n      p = se = s + tlen1;\n      t = tail;\n      while (ONIG_CHARAT(p) == *t) {\n\tif (t == target) return s;\n\tp--; t--;\n      }\n      if (s + 1 >= end) break;\n      skip = reg->int_map[ONIG_CHARAT(se + 1)];\n      p = s;\n      do {\n        s += mbc_enc_len_se(it, s);\n      } while ((s - p) < skip && s < end);\n    }\n  }\n\n  return ONIG_BADPOS;\n}\n\n/* Sunday's quick search */\nstatic OnigPosition\nbm_search_se(OnigIterator* it, regex_t* reg, const UChar* target, const UChar* target_end,\n\t  OnigPosition text, OnigPosition text_end, OnigPosition text_range)\n{\n  const UChar *t;\n  OnigPosition s, p, end;\n  const UChar *tail;\n  ptrdiff_t tlen1;\n\n  tail = target_end - 1;\n  tlen1 = tail - target;\n  end = text_range + tlen1;\n  if (end > text_end)\n    end = text_end;\n\n  s = text + tlen1;\n  if (IS_NULL(reg->int_map)) {\n    while (s < end) {\n      p = s;\n      t = tail;\n      while (ONIG_CHARAT(p) == *t) {\n\tif (t == target) return p;\n\tp--; t--;\n      }\n      if (s + 1 >= end) break;\n      s += reg->map[ONIG_CHARAT(s + 1)];\n    }\n  }\n  else { /* see int_map[] */\n    while (s < end) {\n      p = s;\n      t = tail;\n      while (ONIG_CHARAT(p) == *t) {\n\tif (t == target) return p;\n\tp--; t--;\n      }\n      if (s + 1 >= end) break;\n      s += reg->int_map[ONIG_CHARAT(s + 1)];\n    }\n  }\n  return ONIG_BADPOS;\n}\n\n/* Sunday's quick search applied to a multibyte string (ignore case) */\nstatic OnigPosition\nbm_search_notrev_ic_se(OnigIterator* it, regex_t* reg, const UChar* target, const UChar* target_end,\n\t\t    OnigPosition text, const OnigPosition text_end,\n\t\t    OnigPosition text_range)\n{\n  OnigPosition t;\n  OnigPosition s, se, end;\n  const UChar *tail;\n  ptrdiff_t skip, tlen1;\n  OnigEncoding enc = reg->enc;\n  int (*mbc_enc_len_se)(OnigIterator* it, OnigPosition p) = enc->mbc_enc_len_se;\n  int case_fold_flag = reg->case_fold_flag;\n\n#ifdef ONIG_DEBUG_SEARCH\n  fprintf(stderr, \"bm_search_notrev_ic: text: %d, text_end: %d, text_range: %d\\n\",\n\t  (int )text, (int )text_end, (int )text_range);\n#endif\n\n  tail = target_end - 1;\n  tlen1 = tail - target;\n  end = text_range;\n  if (end + tlen1 > text_end)\n    end = text_end - tlen1;\n\n  s = text;\n\n  if (IS_NULL(reg->int_map)) {\n    while (s < end) {\n      se = s + tlen1;\n      if (str_lower_case_match_se(it, enc, case_fold_flag, target, target_end,\n\t\t\t       s, se + 1))\n\treturn s;\n      if (s + 1 >= end) break;\n      skip = reg->map[ONIG_CHARAT(se + 1)];\n      t = s;\n      do {\n        s += mbc_enc_len_se(it, s);\n      } while ((s - t) < skip && s < end);\n    }\n  }\n  else {\n    while (s < end) {\n      se = s + tlen1;\n      if (str_lower_case_match_se(it, enc, case_fold_flag, target, target_end,\n\t\t\t       s, se + 1))\n\treturn s;\n      if (s + 1 >= end) break;\n      skip = reg->int_map[ONIG_CHARAT(se + 1)];\n      t = s;\n      do {\n        s += mbc_enc_len_se(it, s);\n      } while ((s - t) < skip && s < end);\n    }\n  }\n\n  return ONIG_BADPOS;\n}\n\n/* Sunday's quick search (ignore case) */\nstatic OnigPosition\nbm_search_ic_se(OnigIterator* it, regex_t* reg, const UChar* target, const UChar* target_end,\n\t     OnigPosition text, OnigPosition text_end, OnigPosition text_range)\n{\n  OnigPosition s, p, end;\n  const UChar *tail;\n  ptrdiff_t tlen1;\n  OnigEncoding enc = reg->enc;\n  int case_fold_flag = reg->case_fold_flag;\n\n#ifdef ONIG_DEBUG_SEARCH\n  fprintf(stderr, \"bm_search_ic_se: text: %d, text_end: %d, text_range: %d\\n\",\n\t  (int )text, (int )text_end, (int )text_range);\n#endif\n\n  tail = target_end - 1;\n  tlen1 = tail - target;\n  end = text_range + tlen1;\n  if (end > text_end)\n    end = text_end;\n\n  s = text + tlen1;\n  if (IS_NULL(reg->int_map)) {\n    while (s < end) {\n      p = s - tlen1;\n      if (str_lower_case_match_se(it, enc, case_fold_flag, target, target_end,\n\t\t\t       p, s + 1))\n\treturn p;\n      if (s + 1 >= end) break;\n      s += reg->map[ONIG_CHARAT(s + 1)];\n    }\n  }\n  else { /* see int_map[] */\n    while (s < end) {\n      p = s - tlen1;\n      if (str_lower_case_match_se(it, enc, case_fold_flag, target, target_end,\n\t\t\t       p, s + 1))\n\treturn p;\n      if (s + 1 >= end) break;\n      s += reg->int_map[ONIG_CHARAT(s + 1)];\n    }\n  }\n  return ONIG_BADPOS;\n}\n#endif /* USE_SUNDAY_QUICK_SEARCH */\n\nstatic int\nset_bm_backward_skip(UChar* s, UChar* end, OnigEncoding enc ARG_UNUSED,\n\t\t     int** skip)\n{\n  int i, len;\n\n  if (IS_NULL(*skip)) {\n    *skip = (int* )xmalloc(sizeof(int) * ONIG_CHAR_TABLE_SIZE);\n    if (IS_NULL(*skip)) return ONIGERR_MEMORY;\n  }\n\n  len = (int )(end - s);\n  for (i = 0; i < ONIG_CHAR_TABLE_SIZE; i++)\n    (*skip)[i] = len;\n\n  for (i = len - 1; i > 0; i--)\n    (*skip)[s[i]] = i;\n\n  return 0;\n}\n\nstatic OnigPosition\nbm_search_backward(OnigIterator* it, regex_t* reg, const UChar* target, const UChar* target_end,\n\t\t   OnigPosition text, OnigPosition adjust_text,\n\t\t   OnigPosition text_end, OnigPosition text_start)\n{\n  const UChar *t;\n  OnigPosition s, p;\n\n  s = text_end - (target_end - target);\n  if (text_start < s)\n    s = text_start;\n  else\n    s = ONIGENC_LEFT_ADJUST_CHAR_HEAD_SE(it, reg->enc, adjust_text, s);\n\n  while (s >= text) {\n    p = s;\n    t = target;\n    while (t < target_end && ONIG_CHARAT(p) == *t) {\n      p++; t++;\n    }\n    if (t == target_end)\n      return s;\n\n    s -= reg->int_map_backward[ONIG_CHARAT(s)];\n    s = ONIGENC_LEFT_ADJUST_CHAR_HEAD_SE(it, reg->enc, adjust_text, s);\n  }\n\n  return ONIG_BADPOS;\n}\n\nstatic OnigPosition\nmap_search_se(OnigIterator* it, OnigEncoding enc, UChar map[],\n\t   OnigPosition text, OnigPosition text_range)\n{\n  OnigPosition s = text;\n\n  while (s < text_range) {\n    if (map[ONIG_CHARAT(s)]) return s;\n\n    s += enclen_se(it, enc, s);\n  }\n  return ONIG_BADPOS;\n}\n\nstatic OnigPosition\nmap_search_backward(OnigIterator* it, OnigEncoding enc, UChar map[],\n\t\t    OnigPosition text, OnigPosition adjust_text,\n\t\t    OnigPosition text_start)\n{\n  OnigPosition s = text_start;\n\n  while (s >= text) {\n    if (map[ONIG_CHARAT(s)]) return s;\n\n    s = onigenc_get_prev_char_head_se(it, enc, adjust_text, s);\n  }\n  return ONIG_BADPOS;\n}\n\nextern OnigPosition\nonig_match(OnigIterator* it, regex_t* reg, OnigPosition str, OnigPosition end, OnigPosition at, OnigRegion* region,\n\t    OnigOptionType option)\n{\n  return onig_match_gpos(it, reg, str, end, at, at, region, option);\n}\n\nextern OnigPosition\nonig_match_gpos(OnigIterator* it, regex_t* reg, OnigPosition str, OnigPosition end, OnigPosition global_pos, OnigPosition at, OnigRegion* region,\n\t        OnigOptionType option)\n{\n  OnigPosition r;\n  OnigPosition prev;\n  OnigMatchArg msa;\n\n#if defined(USE_RECOMPILE_API) && defined(USE_MULTI_THREAD_SYSTEM)\n start:\n  THREAD_ATOMIC_START;\n  if (ONIG_STATE(reg) >= ONIG_STATE_NORMAL) {\n    ONIG_STATE_INC(reg);\n    if (IS_NOT_NULL(reg->chain) && ONIG_STATE(reg) == ONIG_STATE_NORMAL) {\n      onig_chain_reduce(reg);\n      ONIG_STATE_INC(reg);\n    }\n  }\n  else {\n    int n;\n\n    THREAD_ATOMIC_END;\n    n = 0;\n    while (ONIG_STATE(reg) < ONIG_STATE_NORMAL) {\n      if (++n > THREAD_PASS_LIMIT_COUNT)\n\treturn ONIGERR_OVER_THREAD_PASS_LIMIT_COUNT;\n      THREAD_PASS;\n    }\n    goto start;\n  }\n  THREAD_ATOMIC_END;\n#endif /* USE_RECOMPILE_API && USE_MULTI_THREAD_SYSTEM */\n\n  MATCH_ARG_INIT(msa, option, region, at, global_pos);\n#ifdef USE_COMBINATION_EXPLOSION_CHECK\n  {\n    int offset = at - str;\n    STATE_CHECK_BUFF_INIT(msa, end - str, offset, reg->num_comb_exp_check);\n  }\n#endif\n\n  if (region\n#ifdef USE_POSIX_API_REGION_OPTION\n      && !IS_POSIX_REGION(option)\n#endif\n      ) {\n    r = onig_region_resize_clear(region, reg->num_mem + 1);\n  }\n  else\n    r = 0;\n\n  if (r == 0) {\n    prev = onigenc_get_prev_char_head_se(it, reg->enc, str, at);\n    r = match_at(it, reg, str, end,\n#ifdef USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE\n\t\t end,\n#endif\n\t\t at, prev, &msa);\n  }\n\n  MATCH_ARG_FREE(msa);\n  ONIG_STATE_DEC_THREAD(reg);\n  return r;\n}\n\nstatic int\nforward_search_range(OnigIterator* it, regex_t* reg, OnigPosition str, OnigPosition end, OnigPosition s,\n\t\t     OnigPosition range, OnigPosition* low, OnigPosition* high, OnigPosition* low_prev)\n{\n  OnigPosition p, pprev = ONIG_BADPOS;\n\n#ifdef ONIG_DEBUG_SEARCH\n  fprintf(stderr, \"forward_search_range: ptr: %p, str: %d, end: %d, s: %d, range: %d\\n\",\n\t  it->ptr, (int )str, (int )end, (int )s, (int )range);\n#endif\n\n  p = s;\n  if (reg->dmin > 0) {\n    if (ONIGENC_IS_SINGLEBYTE(reg->enc)) {\n      p += reg->dmin;\n    }\n    else {\n      OnigPosition q = p + reg->dmin;\n      while (p < q) p += enclen_se(it, reg->enc, p);\n    }\n  }\n\n retry:\n  switch (reg->optimize) {\n  case ONIG_OPTIMIZE_EXACT:\n    p = slow_search_se(it, reg->enc, reg->exact, reg->exact_end, p, end, range);\n    break;\n  case ONIG_OPTIMIZE_EXACT_IC:\n    p = slow_search_ic_se(it, reg->enc, reg->case_fold_flag,\n                       reg->exact, reg->exact_end, p, end, range);\n    break;\n\n  case ONIG_OPTIMIZE_EXACT_BM:\n    p = bm_search_se(it, reg, reg->exact, reg->exact_end, p, end, range);\n    break;\n\n  case ONIG_OPTIMIZE_EXACT_BM_NOT_REV:\n    p = bm_search_notrev_se(it, reg, reg->exact, reg->exact_end, p, end, range);\n    break;\n\n  case ONIG_OPTIMIZE_EXACT_BM_IC:\n    p = bm_search_ic_se(it, reg, reg->exact, reg->exact_end, p, end, range);\n    break;\n\n  case ONIG_OPTIMIZE_EXACT_BM_NOT_REV_IC:\n    p = bm_search_notrev_ic_se(it, reg, reg->exact, reg->exact_end, p, end, range);\n    break;\n\n  case ONIG_OPTIMIZE_MAP:\n    p = map_search_se(it, reg->enc, reg->map, p, range);\n    break;\n  }\n\n  if (ONIG_IS_NOT_BADPOS(p) && p < range) {\n    if (p - reg->dmin < s) {\n    retry_gate:\n      pprev = p;\n      p += enclen_se(it, reg->enc, p);\n      goto retry;\n    }\n\n    if (reg->sub_anchor) {\n      OnigPosition prev;\n\n      switch (reg->sub_anchor) {\n      case ANCHOR_BEGIN_LINE:\n\tif (!ON_STR_BEGIN(p)) {\n\t  prev = onigenc_get_prev_char_head_se(it, reg->enc,\n\t\t\t\t\t    (ONIG_IS_NOT_BADPOS(pprev) ? pprev : str), p);\n\t  if (!ONIGENC_IS_MBC_NEWLINE_EX_SE(it, reg->enc, prev, str, end, reg->options, 0))\n\t    goto retry_gate;\n\t}\n\tbreak;\n\n      case ANCHOR_END_LINE:\n\tif (ON_STR_END(p)) {\n#ifndef USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE\n\t  prev = onigenc_get_prev_char_head_se(it, reg->enc,\n\t\t\t\t\t    (ONIG_IS_NOT_BADPOS(pprev) ? pprev : str), p);\n\t  if (prev && ONIGENC_IS_MBC_NEWLINE_EX_SE(it, reg->enc, prev, str, end, reg->options, 1))\n\t    goto retry_gate;\n#endif\n\t}\n\telse if (! ONIGENC_IS_MBC_NEWLINE_EX_SE(it, reg->enc, p, str, end, reg->options, 1))\n\t  goto retry_gate;\n\tbreak;\n      }\n    }\n\n    if (reg->dmax == 0) {\n      *low = p;\n      if (low_prev) {\n\tif (*low > s)\n\t  *low_prev = onigenc_get_prev_char_head_se(it, reg->enc, s, p);\n\telse\n\t  *low_prev = onigenc_get_prev_char_head_se(it, reg->enc,\n\t\t\t\t\t\t (ONIG_IS_NOT_BADPOS(pprev) ? pprev : str), p);\n      }\n    }\n    else {\n      if (reg->dmax != ONIG_INFINITE_DISTANCE) {\n\t*low = p - reg->dmax;\n\tif (*low > s) {\n\t  *low = onigenc_get_right_adjust_char_head_with_prev_se(it, reg->enc, s,\n\t\t\t\t\t\t\t      *low, low_prev);\n\t  if (low_prev && ONIG_IS_BADPOS(*low_prev))\n\t    *low_prev = onigenc_get_prev_char_head_se(it, reg->enc,\n\t\t\t\t\t\t   (ONIG_IS_NOT_BADPOS(pprev) ? pprev : s), *low);\n\t}\n\telse {\n\t  if (low_prev)\n\t    *low_prev = onigenc_get_prev_char_head_se(it, reg->enc,\n\t\t\t\t\t       (ONIG_IS_NOT_BADPOS(pprev) ? pprev : str), *low);\n\t}\n      }\n    }\n    /* no needs to adjust *high, *high is used as range check only */\n    *high = p - reg->dmin;\n\n#ifdef ONIG_DEBUG_SEARCH\n    fprintf(stderr,\n    \"forward_search_range success: low: %d, high: %d, dmin: %d, dmax: %d\\n\",\n\t    (int )(*low - str), (int )(*high - str), reg->dmin, reg->dmax);\n#endif\n    return 1; /* success */\n  }\n\n  return 0; /* fail */\n}\n\nstatic int set_bm_backward_skip P_((UChar* s, UChar* end, OnigEncoding enc,\n\t\t\t\t    int** skip));\n\n#define BM_BACKWARD_SEARCH_LENGTH_THRESHOLD   100\n\nstatic int\nbackward_search_range_se(OnigIterator* it, regex_t* reg, OnigPosition str, OnigPosition end,\n\t\t      OnigPosition s, OnigPosition range, OnigPosition adjrange,\n\t\t      OnigPosition* low, OnigPosition* high)\n{\n  int r;\n  OnigPosition p;\n\n  range += reg->dmin;\n  p = s;\n\n retry:\n  switch (reg->optimize) {\n  case ONIG_OPTIMIZE_EXACT:\n  exact_method:\n    p = slow_search_backward_se(it, reg->enc, reg->exact, reg->exact_end,\n\t\t\t     range, adjrange, end, p);\n    break;\n\n  case ONIG_OPTIMIZE_EXACT_IC:\n  case ONIG_OPTIMIZE_EXACT_BM_IC:\n  case ONIG_OPTIMIZE_EXACT_BM_NOT_REV_IC:\n    p = slow_search_backward_ic_se(it, reg->enc, reg->case_fold_flag,\n                                reg->exact, reg->exact_end,\n                                range, adjrange, end, p);\n    break;\n\n  case ONIG_OPTIMIZE_EXACT_BM:\n  case ONIG_OPTIMIZE_EXACT_BM_NOT_REV:\n    if (IS_NULL(reg->int_map_backward)) {\n      if (s - range < BM_BACKWARD_SEARCH_LENGTH_THRESHOLD)\n\tgoto exact_method;\n\n      r = set_bm_backward_skip(reg->exact, reg->exact_end, reg->enc,\n\t\t\t       &(reg->int_map_backward));\n      if (r) return r;\n    }\n    p = bm_search_backward(it, reg, reg->exact, reg->exact_end, range, adjrange,\n\t\t\t   end, p);\n    break;\n\n  case ONIG_OPTIMIZE_MAP:\n    p = map_search_backward(it, reg->enc, reg->map, range, adjrange, p);\n    break;\n  }\n\n  if (ONIG_IS_NOT_BADPOS(p)) {\n    if (reg->sub_anchor) {\n      OnigPosition prev;\n\n      switch (reg->sub_anchor) {\n      case ANCHOR_BEGIN_LINE:\n\tif (!ON_STR_BEGIN(p)) {\n\t  prev = onigenc_get_prev_char_head_se(it, reg->enc, str, p);\n\t  if (!ONIGENC_IS_MBC_NEWLINE_EX_SE(it, reg->enc, prev, str, end, reg->options, 0)) {\n\t    p = prev;\n\t    goto retry;\n\t  }\n\t}\n\tbreak;\n\n      case ANCHOR_END_LINE:\n\tif (ON_STR_END(p)) {\n#ifndef USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE\n\t  prev = onigenc_get_prev_char_head_se(it, reg->enc, adjrange, p);\n\t  if (ONIG_IS_BADPOS(prev)) goto fail;\n\t  if (ONIGENC_IS_MBC_NEWLINE_EX_SE(it, reg->enc, prev, str, end, reg->options, 1)) {\n\t    p = prev;\n\t    goto retry;\n\t  }\n#endif\n\t}\n\telse if (! ONIGENC_IS_MBC_NEWLINE_EX_SE(it, reg->enc, p, str, end, reg->options, 1)) {\n\t  p = onigenc_get_prev_char_head_se(it, reg->enc, adjrange, p);\n\t  if (ONIG_IS_BADPOS(p)) goto fail;\n\t  goto retry;\n\t}\n\tbreak;\n      }\n    }\n\n    /* no needs to adjust *high, *high is used as range check only */\n    if (reg->dmax != ONIG_INFINITE_DISTANCE) {\n      *low  = p - reg->dmax;\n      *high = p - reg->dmin;\n      *high = onigenc_get_right_adjust_char_head_se(it, reg->enc, adjrange, *high);\n    }\n\n#ifdef ONIG_DEBUG_SEARCH\n    fprintf(stderr, \"backward_search_range_se: low: %d, high: %d\\n\",\n\t    (int )(*low), (int )(*high));\n#endif\n    return 1; /* success */\n  }\n\n fail:\n#ifdef ONIG_DEBUG_SEARCH\n  fprintf(stderr, \"backward_search_range_se: fail.\\n\");\n#endif\n  return 0; /* fail */\n}\n\n\nextern OnigPosition\nonig_search(OnigIterator* it, regex_t* reg, OnigPosition str, OnigPosition end,\n\t    OnigPosition start, OnigPosition range, OnigRegion* region, OnigOptionType option)\n{\n  return onig_search_gpos(it, reg, str, end, start, start, range, region, option);\n}\n\nextern OnigPosition\nonig_search_gpos(OnigIterator* it, regex_t* reg, OnigPosition str, OnigPosition end,\n\t    OnigPosition global_pos,\n\t    OnigPosition start, OnigPosition range, OnigRegion* region, OnigOptionType option)\n{\n  OnigPosition r;\n  OnigPosition s, prev;\n  OnigMatchArg msa;\n#ifdef USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE\n  OnigPosition orig_start = start;\n  OnigPosition orig_range = range;\n#endif\n\n#if defined(USE_RECOMPILE_API) && defined(USE_MULTI_THREAD_SYSTEM)\n start:\n  THREAD_ATOMIC_START;\n  if (ONIG_STATE(reg) >= ONIG_STATE_NORMAL) {\n    ONIG_STATE_INC(reg);\n    if (IS_NOT_NULL(reg->chain) && ONIG_STATE(reg) == ONIG_STATE_NORMAL) {\n      onig_chain_reduce(reg);\n      ONIG_STATE_INC(reg);\n    }\n  }\n  else {\n    int n;\n\n    THREAD_ATOMIC_END;\n    n = 0;\n    while (ONIG_STATE(reg) < ONIG_STATE_NORMAL) {\n      if (++n > THREAD_PASS_LIMIT_COUNT)\n\treturn ONIGERR_OVER_THREAD_PASS_LIMIT_COUNT;\n      THREAD_PASS;\n    }\n    goto start;\n  }\n  THREAD_ATOMIC_END;\n#endif /* USE_RECOMPILE_API && USE_MULTI_THREAD_SYSTEM */\n\n#ifdef ONIG_DEBUG_SEARCH\n  fprintf(stderr,\n\t  \"onig_search (entry point): ptr: %p,  str: %d , end: %d, start: %d, range: %d\\n\",\n     it->ptr, (int )str, (int )end, (int )start, (int )range);\n#endif\n\n  if (region\n#ifdef USE_POSIX_API_REGION_OPTION\n      && !IS_POSIX_REGION(option)\n#endif\n      ) {\n    r = onig_region_resize_clear(region, reg->num_mem + 1);\n    if (r) goto finish_no_msa;\n  }\n\n  if (start > end || start < str) goto mismatch_no_msa;\n\n\n#ifdef USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE\n#ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE\n#define MATCH_AND_RETURN_CHECK(upper_range) \\\n  r = match_at(it, reg, str, end, (upper_range), s, prev, &msa); \\\n  if (r != ONIG_MISMATCH) {\\\n    if (r >= 0) {\\\n      if (! IS_FIND_LONGEST(reg->options)) {\\\n        goto match;\\\n      }\\\n    }\\\n    else goto finish; /* error */ \\\n  }\n#else\n#define MATCH_AND_RETURN_CHECK(upper_range) \\\n  r = match_at(it, reg, str, end, (upper_range), s, prev, &msa); \\\n  if (r != ONIG_MISMATCH) {\\\n    if (r >= 0) {\\\n      goto match;\\\n    }\\\n    else goto finish; /* error */ \\\n  }\n#endif /* USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE */\n#else\n#ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE\n#define MATCH_AND_RETURN_CHECK(none) \\\n  r = match_at(it, reg, str, end, s, prev, &msa);\\\n  if (r != ONIG_MISMATCH) {\\\n    if (r >= 0) {\\\n      if (! IS_FIND_LONGEST(reg->options)) {\\\n        goto match;\\\n      }\\\n    }\\\n    else goto finish; /* error */ \\\n  }\n#else\n#define MATCH_AND_RETURN_CHECK(none) \\\n  r = match_at(it, reg, str, end, s, prev, &msa);\\\n  if (r != ONIG_MISMATCH) {\\\n    if (r >= 0) {\\\n      goto match;\\\n    }\\\n    else goto finish; /* error */ \\\n  }\n#endif /* USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE */\n#endif /* USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE */\n\n\n  /* anchor optimize: resume search range */\n  if (reg->anchor != 0 && str < end) {\n    OnigPosition min_semi_end, max_semi_end;\n\n    if (reg->anchor & ANCHOR_BEGIN_POSITION) {\n      /* search start-position only */\n    begin_position:\n      if (range > start)\n\trange = start + 1;\n      else\n\trange = start;\n    }\n    else if (reg->anchor & ANCHOR_BEGIN_BUF) {\n      /* search str-position only */\n      if (range > start) {\n\tif (start != str) goto mismatch_no_msa;\n\trange = str + 1;\n      }\n      else {\n\tif (range <= str) {\n\t  start = str;\n\t  range = str;\n\t}\n\telse\n\t  goto mismatch_no_msa;\n      }\n    }\n    else if (reg->anchor & ANCHOR_END_BUF) {\n      min_semi_end = max_semi_end = end;\n\n    end_buf:\n      if ((OnigDistance )(max_semi_end - str) < reg->anchor_dmin)\n\tgoto mismatch_no_msa;\n\n      if (range > start) {\n\tif ((OnigDistance )(min_semi_end - start) > reg->anchor_dmax) {\n\t  start = min_semi_end - reg->anchor_dmax;\n\t  if (start < end)\n\t    start = onigenc_get_right_adjust_char_head_se(it, reg->enc, str, start);\n\t}\n\tif ((OnigDistance )(max_semi_end - (range - 1)) < reg->anchor_dmin) {\n\t  range = max_semi_end - reg->anchor_dmin + 1;\n\t}\n\n\tif (start > range) goto mismatch_no_msa;\n\t/* If start == range, match with empty at end.\n\t   Backward search is used. */\n      }\n      else {\n\tif ((OnigDistance )(min_semi_end - range) > reg->anchor_dmax) {\n\t  range = min_semi_end - reg->anchor_dmax;\n\t}\n\tif ((OnigDistance )(max_semi_end - start) < reg->anchor_dmin) {\n\t  start = max_semi_end - reg->anchor_dmin;\n\t  start = ONIGENC_LEFT_ADJUST_CHAR_HEAD_SE(it, reg->enc, str, start);\n\t}\n\tif (range > start) goto mismatch_no_msa;\n      }\n    }\n    else if (reg->anchor & ANCHOR_SEMI_END_BUF) {\n      OnigPosition pre_end = ONIGENC_STEP_BACK_SE(it, reg->enc, str, end, 1);\n\n      max_semi_end = end;\n      if (ONIGENC_IS_MBC_NEWLINE_SE(it, reg->enc, pre_end, end)) {\n\tmin_semi_end = pre_end;\n\n#ifdef USE_CRNL_AS_LINE_TERMINATOR\n\tpre_end = ONIGENC_STEP_BACK_SE(it, reg->enc, str, pre_end, 1);\n\tif (ONIG_IS_NOT_BADPOS(pre_end) &&\n\t    IS_NEWLINE_CRLF(reg->options) &&\n\t    ONIGENC_IS_MBC_CRNL_SE(it, reg->enc, pre_end, end)) {\n\t  min_semi_end = pre_end;\n\t}\n#endif\n\tif (min_semi_end > str && start <= min_semi_end) {\n\t  goto end_buf;\n\t}\n      }\n      else {\n\tmin_semi_end = end;\n\tgoto end_buf;\n      }\n    }\n    else if ((reg->anchor & ANCHOR_ANYCHAR_STAR_ML)) {\n      if (! (reg->anchor & ANCHOR_LOOK_BEHIND)) {\n\tgoto begin_position;\n      }\n    }\n  }\n  else if (str == end) { /* empty string */\n    static OnigPosition address_for_empty_string = 0;\n\n#ifdef ONIG_DEBUG_SEARCH\n    fprintf(stderr, \"onig_search: empty string.\\n\");\n#endif\n\n    if (reg->threshold_len == 0) {\n      start = end = str = address_for_empty_string;\n      s = start;\n      prev = ONIG_BADPOS;\n\n      MATCH_ARG_INIT(msa, option, region, start, start);\n#ifdef USE_COMBINATION_EXPLOSION_CHECK\n      msa.state_check_buff = (void* )0;\n      msa.state_check_buff_size = 0;   /* NO NEED, for valgrind */\n#endif\n      MATCH_AND_RETURN_CHECK(end);\n      goto mismatch;\n    }\n    goto mismatch_no_msa;\n  }\n\n#ifdef ONIG_DEBUG_SEARCH\n  fprintf(stderr, \"onig_search(apply anchor): end: %d, start: %d, range: %d\\n\",\n\t  (int )end, (int )start, (int )range);\n#endif\n\n  MATCH_ARG_INIT(msa, option, region, start, global_pos);\n#ifdef USE_COMBINATION_EXPLOSION_CHECK\n  {\n    int offset = (MIN(start, range) - str);\n    STATE_CHECK_BUFF_INIT(msa, end - str, offset, reg->num_comb_exp_check);\n  }\n#endif\n\n  s = start;\n  if (range > start) {   /* forward search */\n    if (s > str)\n      prev = onigenc_get_prev_char_head_se(it, reg->enc, str, s);\n    else\n      prev = ONIG_BADPOS;\n\n    if (reg->optimize != ONIG_OPTIMIZE_NONE) {\n      OnigPosition sch_range, low, high, low_prev;\n\n      sch_range = range;\n      if (reg->dmax != 0) {\n\tif (reg->dmax == ONIG_INFINITE_DISTANCE)\n\t  sch_range = end;\n\telse {\n\t  sch_range += reg->dmax;\n\t  if (sch_range > end) sch_range = end;\n\t}\n      }\n\n      if ((end - start) < reg->threshold_len)\n        goto mismatch;\n\n      if (reg->dmax != ONIG_INFINITE_DISTANCE) {\n\tdo {\n\t  if (! forward_search_range(it, reg, str, end, s, sch_range,\n\t\t\t\t     &low, &high, &low_prev)) goto mismatch;\n\t  if (s < low) {\n\t    s    = low;\n\t    prev = low_prev;\n\t  }\n\t  while (s <= high) {\n\t    MATCH_AND_RETURN_CHECK(orig_range);\n\t    prev = s;\n\t    s += enclen_se(it, reg->enc, s);\n\t  }\n\t} while (s < range);\n\tgoto mismatch;\n      }\n      else { /* check only. */\n\tif (! forward_search_range(it, reg, str, end, s, sch_range,\n\t\t\t\t   &low, &high, (OnigPosition* )NULL)) goto mismatch;\n\n        if ((reg->anchor & ANCHOR_ANYCHAR_STAR) != 0) {\n          do {\n            if ((reg->anchor & ANCHOR_BEGIN_POSITION) == 0)\n              msa.gpos = s;     /* move \\G position */\n            MATCH_AND_RETURN_CHECK(orig_range);\n            prev = s;\n            s += enclen_se(it, reg->enc, s);\n\n            if ((reg->anchor & ANCHOR_LOOK_BEHIND) == 0) {\n              while (!ONIGENC_IS_MBC_NEWLINE_EX_SE(it, reg->enc, prev, str, end, reg->options, 0)\n                     && s < range) {\n                prev = s;\n                s += enclen_se(it, reg->enc, s);\n              }\n            }\n          } while (s < range);\n          goto mismatch;\n        }\n      }\n    }\n\n    do {\n      MATCH_AND_RETURN_CHECK(orig_range);\n      prev = s;\n      s += enclen_se(it, reg->enc, s);\n    } while (s < range);\n\n    if (s == range) { /* because empty match with /$/. */\n      MATCH_AND_RETURN_CHECK(orig_range);\n    }\n  }\n  else {  /* backward search */\n#ifdef USE_MATCH_RANGE_MUST_BE_INSIDE_OF_SPECIFIED_RANGE\n    if (orig_start < end)\n      orig_start += enclen_se(it, reg->enc, orig_start); /* is upper range */\n#endif\n\n    if (reg->optimize != ONIG_OPTIMIZE_NONE) {\n      OnigPosition low, high, adjrange, sch_start;\n\n      if (range < end)\n\tadjrange = ONIGENC_LEFT_ADJUST_CHAR_HEAD_SE(it, reg->enc, str, range);\n      else\n\tadjrange = end;\n\n      if (reg->dmax != ONIG_INFINITE_DISTANCE &&\n\t  (end - range) >= reg->threshold_len) {\n\tdo {\n\t  sch_start = s + reg->dmax;\n\t  if (sch_start > end) sch_start = end;\n\t  if (backward_search_range_se(it, reg, str, end, sch_start, range, adjrange,\n\t\t\t\t    &low, &high) <= 0)\n\t    goto mismatch;\n\n\t  if (s > high)\n\t    s = high;\n\n\t  while (s >= low) {\n\t    prev = onigenc_get_prev_char_head_se(it, reg->enc, str, s);\n\t    MATCH_AND_RETURN_CHECK(orig_start);\n\t    s = prev;\n\t  }\n\t} while (s >= range);\n\tgoto mismatch;\n      }\n      else { /* check only. */\n\tif ((end - range) < reg->threshold_len) goto mismatch;\n\n\tsch_start = s;\n\tif (reg->dmax != 0) {\n\t  if (reg->dmax == ONIG_INFINITE_DISTANCE)\n\t    sch_start = end;\n\t  else {\n\t    sch_start += reg->dmax;\n\t    if (sch_start > end) sch_start = end;\n\t    else\n\t      sch_start = ONIGENC_LEFT_ADJUST_CHAR_HEAD_SE(it, reg->enc,\n\t\t\t\t\t\t    start, sch_start);\n\t  }\n\t}\n\tif (backward_search_range_se(it, reg, str, end, sch_start, range, adjrange,\n\t\t\t\t  &low, &high) <= 0) goto mismatch;\n      }\n    }\n\n    do {\n      prev = onigenc_get_prev_char_head_se(it, reg->enc, str, s);\n      MATCH_AND_RETURN_CHECK(orig_start);\n      s = prev;\n    } while (s >= range);\n  }\n\n mismatch:\n#ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE\n  if (IS_FIND_LONGEST(reg->options)) {\n    if (msa.best_len >= 0) {\n      s = msa.best_s;\n      goto match;\n    }\n  }\n#endif\n  r = ONIG_MISMATCH;\n\n finish:\n  MATCH_ARG_FREE(msa);\n  ONIG_STATE_DEC_THREAD(reg);\n\n  /* If result is mismatch and no FIND_NOT_EMPTY option,\n     then the region is not set in match_at(). */\n  if (IS_FIND_NOT_EMPTY(reg->options) && region\n#ifdef USE_POSIX_API_REGION_OPTION\n      && !IS_POSIX_REGION(option)\n#endif\n      ) {\n    onig_region_clear(region);\n  }\n\n#ifdef ONIG_DEBUG\n  if (r != ONIG_MISMATCH)\n    fprintf(stderr, \"onig_search: error %d\\n\", r);\n#endif\n  return r;\n\n mismatch_no_msa:\n  r = ONIG_MISMATCH;\n finish_no_msa:\n  ONIG_STATE_DEC_THREAD(reg);\n#ifdef ONIG_DEBUG\n  if (r != ONIG_MISMATCH)\n    fprintf(stderr, \"onig_search: error %d\\n\", r);\n#endif\n  return r;\n\n match:\n  ONIG_STATE_DEC_THREAD(reg);\n  MATCH_ARG_FREE(msa);\n  return s - str;\n}\n\nextern OnigEncoding\nonig_get_encoding(regex_t* reg)\n{\n  return reg->enc;\n}\n\nextern OnigOptionType\nonig_get_options(regex_t* reg)\n{\n  return reg->options;\n}\n\nextern  OnigCaseFoldType\nonig_get_case_fold_flag(regex_t* reg)\n{\n  return reg->case_fold_flag;\n}\n\nextern OnigSyntaxType*\nonig_get_syntax(regex_t* reg)\n{\n  return reg->syntax;\n}\n\nextern int\nonig_number_of_captures(regex_t* reg)\n{\n  return reg->num_mem;\n}\n\nextern int\nonig_number_of_capture_histories(regex_t* reg)\n{\n#ifdef USE_CAPTURE_HISTORY\n  int i, n;\n\n  n = 0;\n  for (i = 0; i <= ONIG_MAX_CAPTURE_HISTORY_GROUP; i++) {\n    if (BIT_STATUS_AT(reg->capture_history, i) != 0)\n      n++;\n  }\n  return n;\n#else\n  return 0;\n#endif\n}\n\nextern void\nonig_copy_encoding(OnigEncoding to, OnigEncoding from)\n{\n  *to = *from;\n}\n\nextern UChar\nonig_default_charat (OnigPosition pos, const void* ptr) {\n\treturn ptr ? *((const UChar*)(ptr) + pos) : '\\0';\t\n}\n"
  },
  {
    "path": "src/Onigmo/regext.c",
    "content": "/**********************************************************************\n  regext.c -  Onigmo (Oniguruma-mod) (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2008  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * Copyright (c) 2011       K.Takata  <kentkt AT csc DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regint.h\"\n\nstatic void\nconv_ext0be32(const UChar* s, const UChar* end, UChar* conv)\n{\n  while (s < end) {\n    *conv++ = '\\0';\n    *conv++ = '\\0';\n    *conv++ = '\\0';\n    *conv++ = *s++;\n  }\n}\n\nstatic void\nconv_ext0le32(const UChar* s, const UChar* end, UChar* conv)\n{\n  while (s < end) {\n    *conv++ = *s++;\n    *conv++ = '\\0';\n    *conv++ = '\\0';\n    *conv++ = '\\0';\n  }\n}\n\nstatic void\nconv_ext0be(const UChar* s, const UChar* end, UChar* conv)\n{\n  while (s < end) {\n    *conv++ = '\\0';\n    *conv++ = *s++;\n  }\n}\n\nstatic void\nconv_ext0le(const UChar* s, const UChar* end, UChar* conv)\n{\n  while (s < end) {\n    *conv++ = *s++;\n    *conv++ = '\\0';\n  }\n}\n\nstatic void\nconv_swap4bytes(const UChar* s, const UChar* end, UChar* conv)\n{\n  while (s < end) {\n    *conv++ = s[3];\n    *conv++ = s[2];\n    *conv++ = s[1];\n    *conv++ = s[0];\n    s += 4;\n  }\n}\n\nstatic void\nconv_swap2bytes(const UChar* s, const UChar* end, UChar* conv)\n{\n  while (s < end) {\n    *conv++ = s[1];\n    *conv++ = s[0];\n    s += 2;\n  }\n}\n\nstatic int\nconv_encoding(OnigEncoding from, OnigEncoding to, const UChar* s, const UChar* end,\n              UChar** conv, UChar** conv_end)\n{\n  ptrdiff_t len = end - s;\n\n  if (to == ONIG_ENCODING_UTF16_BE) {\n    if (from == ONIG_ENCODING_ASCII || from == ONIG_ENCODING_ISO_8859_1) {\n      *conv = (UChar* )xmalloc(len * 2);\n      CHECK_NULL_RETURN_MEMERR(*conv);\n      *conv_end = *conv + (len * 2);\n      conv_ext0be(s, end, *conv);\n      return 0;\n    }\n    else if (from == ONIG_ENCODING_UTF16_LE) {\n    swap16:\n      *conv = (UChar* )xmalloc(len);\n      CHECK_NULL_RETURN_MEMERR(*conv);\n      *conv_end = *conv + len;\n      conv_swap2bytes(s, end, *conv);\n      return 0;\n    }\n  }\n  else if (to == ONIG_ENCODING_UTF16_LE) {\n    if (from == ONIG_ENCODING_ASCII || from == ONIG_ENCODING_ISO_8859_1) {\n      *conv = (UChar* )xmalloc(len * 2);\n      CHECK_NULL_RETURN_MEMERR(*conv);\n      *conv_end = *conv + (len * 2);\n      conv_ext0le(s, end, *conv);\n      return 0;\n    }\n    else if (from == ONIG_ENCODING_UTF16_BE) {\n      goto swap16;\n    }\n  }\n  if (to == ONIG_ENCODING_UTF32_BE) {\n    if (from == ONIG_ENCODING_ASCII || from == ONIG_ENCODING_ISO_8859_1) {\n      *conv = (UChar* )xmalloc(len * 4);\n      CHECK_NULL_RETURN_MEMERR(*conv);\n      *conv_end = *conv + (len * 4);\n      conv_ext0be32(s, end, *conv);\n      return 0;\n    }\n    else if (from == ONIG_ENCODING_UTF32_LE) {\n    swap32:\n      *conv = (UChar* )xmalloc(len);\n      CHECK_NULL_RETURN_MEMERR(*conv);\n      *conv_end = *conv + len;\n      conv_swap4bytes(s, end, *conv);\n      return 0;\n    }\n  }\n  else if (to == ONIG_ENCODING_UTF32_LE) {\n    if (from == ONIG_ENCODING_ASCII || from == ONIG_ENCODING_ISO_8859_1) {\n      *conv = (UChar* )xmalloc(len * 4);\n      CHECK_NULL_RETURN_MEMERR(*conv);\n      *conv_end = *conv + (len * 4);\n      conv_ext0le32(s, end, *conv);\n      return 0;\n    }\n    else if (from == ONIG_ENCODING_UTF32_BE) {\n      goto swap32;\n    }\n  }\n\n  return ONIGERR_NOT_SUPPORTED_ENCODING_COMBINATION;\n}\n\nextern int\nonig_new_deluxe(regex_t** reg, const UChar* pattern, const UChar* pattern_end,\n                OnigCompileInfo* ci, OnigErrorInfo* einfo)\n{\n  int r;\n  UChar *cpat, *cpat_end;\n\n  if (IS_NOT_NULL(einfo)) einfo->par = (UChar* )NULL;\n\n  if (ci->pattern_enc != ci->target_enc) {\n    r = conv_encoding(ci->pattern_enc, ci->target_enc, pattern, pattern_end,\n                      &cpat, &cpat_end);\n    if (r) return r;\n  }\n  else {\n    cpat     = (UChar* )pattern;\n    cpat_end = (UChar* )pattern_end;\n  }\n\n  *reg = (regex_t* )xmalloc(sizeof(regex_t));\n  if (IS_NULL(*reg)) {\n    r = ONIGERR_MEMORY;\n    goto err2;\n  }\n\n  r = onig_reg_init(*reg, ci->option, ci->case_fold_flag, ci->target_enc,\n\t\t    ci->syntax);\n  if (r) goto err;\n\n  r = onig_compile(*reg, cpat, cpat_end, einfo);\n  if (r) {\n  err:\n    onig_free(*reg);\n    *reg = NULL;\n  }\n\n err2:\n  if (cpat != pattern) xfree(cpat);\n\n  return r;\n}\n\n#ifdef USE_RECOMPILE_API\nextern int\nonig_recompile_deluxe(regex_t* reg, const UChar* pattern, const UChar* pattern_end,\n                      OnigCompileInfo* ci, OnigErrorInfo* einfo)\n{\n  int r;\n  regex_t *new_reg;\n\n  r = onig_new_deluxe(&new_reg, pattern, pattern_end, ci, einfo);\n  if (r) return r;\n  if (ONIG_STATE(reg) == ONIG_STATE_NORMAL) {\n    onig_transfer(reg, new_reg);\n  }\n  else {\n    onig_chain_link_add(reg, new_reg);\n  }\n  return 0;\n}\n#endif\n"
  },
  {
    "path": "src/Onigmo/reggnu.c",
    "content": "/**********************************************************************\n  reggnu.c -  Onigmo (Oniguruma-mod) (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2008  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * Copyright (c) 2011       K.Takata  <kentkt AT csc DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regint.h\"\n\n#ifndef ONIGGNU_H\n#include \"oniggnu.h\"\n#endif\n\nextern void\nre_free_registers(OnigRegion* r)\n{\n  /* 0: don't free self */\n  onig_region_free(r, 0);\n}\n\nextern int\nre_adjust_startpos(regex_t* reg, const char* string, int size,\n\t\t   int startpos, int range)\n{\n  if (startpos > 0 && ONIGENC_MBC_MAXLEN(reg->enc) != 1 && startpos < size) {\n    UChar *p;\n    UChar *s = (UChar* )string + startpos;\n\n    if (range > 0) {\n      p = onigenc_get_right_adjust_char_head(reg->enc, (UChar* )string, s);\n    }\n    else {\n      p = ONIGENC_LEFT_ADJUST_CHAR_HEAD(reg->enc, (UChar* )string, s);\n    }\n    return (int )(p - (UChar* )string);\n  }\n\n  return startpos;\n}\n\nextern int\nre_match(OnigIterator* it, regex_t* reg, OnigPosition str, OnigPosition size, OnigPosition pos,\n\t struct re_registers* regs)\n{\n  return (int )onig_match(it, reg, str, (str + size),\n\t\t    (str + pos), regs, ONIG_OPTION_NONE);\n}\n\nextern int\nre_search(OnigIterator* it, regex_t* bufp, OnigPosition str, OnigPosition size, OnigPosition startpos, OnigPosition range,\n\t  struct re_registers* regs)\n{\n  return (int )onig_search(it, bufp, str, (str + size),\n\t\t     (str + startpos),\n\t\t     (str + startpos + range),\n\t\t     regs, ONIG_OPTION_NONE);\n}\n\nextern int\nre_compile_pattern(const char* pattern, int size, regex_t* reg, char* ebuf)\n{\n  int r;\n  OnigErrorInfo einfo;\n\n  r = onig_compile(reg, (UChar* )pattern, (UChar* )(pattern + size), &einfo);\n  if (r != ONIG_NORMAL) {\n    if (IS_NOT_NULL(ebuf))\n      (void )onig_error_code_to_str((UChar* )ebuf, r, &einfo);\n  }\n\n  return r;\n}\n\n#ifdef USE_RECOMPILE_API\nextern int\nre_recompile_pattern(const char* pattern, int size, regex_t* reg, char* ebuf)\n{\n  int r;\n  OnigErrorInfo einfo;\n  OnigEncoding enc;\n\n  /* I think encoding and options should be arguments of this function.\n     But this is adapted to present re.c. (2002/11/29)\n   */\n  enc = OnigEncDefaultCharEncoding;\n\n  r = onig_recompile(reg, (UChar* )pattern, (UChar* )(pattern + size),\n\t\t     reg->options, enc, OnigDefaultSyntax, &einfo);\n  if (r != ONIG_NORMAL) {\n    if (IS_NOT_NULL(ebuf))\n      (void )onig_error_code_to_str((UChar* )ebuf, r, &einfo);\n  }\n  return r;\n}\n#endif\n\nextern void\nre_free_pattern(regex_t* reg)\n{\n  onig_free(reg);\n}\n\nextern int\nre_alloc_pattern(regex_t** reg)\n{\n  *reg = (regex_t* )xmalloc(sizeof(regex_t));\n  if (IS_NULL(*reg)) return ONIGERR_MEMORY;\n\n  return onig_reg_init(*reg, ONIG_OPTION_DEFAULT,\n\t\t       ONIGENC_CASE_FOLD_DEFAULT,\n\t\t       OnigEncDefaultCharEncoding,\n\t\t       OnigDefaultSyntax);\n}\n\nextern void\nre_set_casetable(const char* table)\n{\n  onigenc_set_default_caseconv_table((UChar* )table);\n}\n\nextern void\nre_mbcinit(int mb_code)\n{\n  OnigEncoding enc;\n\n  switch (mb_code) {\n  case RE_MBCTYPE_ASCII:\n    enc = ONIG_ENCODING_ASCII;\n    break;\n  case RE_MBCTYPE_EUC:\n    enc = ONIG_ENCODING_EUC_JP;\n    break;\n  case RE_MBCTYPE_SJIS:\n    enc = ONIG_ENCODING_SJIS;\n    break;\n  case RE_MBCTYPE_UTF8:\n    enc = ONIG_ENCODING_UTF8;\n    break;\n  default:\n    return ;\n    break;\n  }\n\n  onigenc_set_default_encoding(enc);\n}\n"
  },
  {
    "path": "src/Onigmo/regint.h",
    "content": "#ifndef REGINT_H\n#define REGINT_H\n/**********************************************************************\n  regint.h -  Onigmo (Oniguruma-mod) (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2008  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * Copyright (c) 2011-2012  K.Takata  <kentkt AT csc DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n/* for debug */\n/* #define ONIG_DEBUG_PARSE_TREE */\n/* #define ONIG_DEBUG_COMPILE */\n/* #define ONIG_DEBUG_SEARCH */\n/* #define ONIG_DEBUG_MATCH */\n/* #define ONIG_DONT_OPTIMIZE */\n\n/* for byte-code statistical data. */\n/* #define ONIG_DEBUG_STATISTICS */\n\n#if defined(ONIG_DEBUG_PARSE_TREE) || defined(ONIG_DEBUG_MATCH) || \\\n    defined(ONIG_DEBUG_SEARCH) || defined(ONIG_DEBUG_COMPILE) || \\\n    defined(ONIG_DEBUG_STATISTICS)\n#ifndef ONIG_DEBUG\n#define ONIG_DEBUG\n#endif\n#endif\n\n#if defined(__i386) || defined(__i386__) || defined(_M_IX86) || \\\n    defined(__x86_64) || defined(__x86_64__) || defined(_M_AMD64) || \\\n    defined(__mc68020__)\n#define PLATFORM_UNALIGNED_WORD_ACCESS\n#endif\n\n/* config */\n/* spec. config */\n#define USE_NAMED_GROUP\n#define USE_SUBEXP_CALL\n#define USE_PERL_SUBEXP_CALL\n#define USE_CAPITAL_P_NAMED_GROUP\n#define USE_BACKREF_WITH_LEVEL        /* \\k<name+n>, \\k<name-n> */\n#define USE_MONOMANIAC_CHECK_CAPTURES_IN_ENDLESS_REPEAT  /* /(?:()|())*\\2/ */\n#define USE_NEWLINE_AT_END_OF_STRING_HAS_EMPTY_LINE     /* /\\n$/ =~ \"\\n\" */\n#define USE_WARNING_REDUNDANT_NESTED_REPEAT_OPERATOR\n/* #define USE_RECOMPILE_API */\n/* !!! moved to regenc.h. */ /* #define USE_CRNL_AS_LINE_TERMINATOR */\n#define USE_NO_INVALID_QUANTIFIER\n\n/* internal config */\n#define USE_PARSE_TREE_NODE_RECYCLE\n#define USE_OP_PUSH_OR_JUMP_EXACT\n#define USE_QTFR_PEEK_NEXT\n#define USE_ST_LIBRARY\n#define USE_SHARED_CCLASS_TABLE\n#define USE_SUNDAY_QUICK_SEARCH\n\n#define USE_SHARED_UNICODE_TABLE\n\n#define INIT_MATCH_STACK_SIZE                     160\n#define DEFAULT_MATCH_STACK_LIMIT_SIZE              0 /* unlimited */\n\n/* check config */\n#if defined(USE_PERL_SUBEXP_CALL) || defined(USE_CAPITAL_P_NAMED_GROUP)\n#if !defined(USE_NAMED_GROUP) || !defined(USE_SUBEXP_CALL)\n#error USE_NAMED_GROUP and USE_SUBEXP_CALL must be defined.\n#endif\n#endif\n\n#if defined(__GNUC__)\n#  define ARG_UNUSED  __attribute__ ((unused))\n#else\n#  define ARG_UNUSED\n#endif\n\n/* */\n/* escape other system UChar definition */\n#include \"config.h\"\n#ifdef ONIG_ESCAPE_UCHAR_COLLISION\n#undef ONIG_ESCAPE_UCHAR_COLLISION\n#endif\n\n#define USE_WORD_BEGIN_END        /* \"\\<\", \"\\>\" */\n#define USE_CAPTURE_HISTORY\n#define USE_VARIABLE_META_CHARS\n#define USE_POSIX_API_REGION_OPTION\n#define USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE\n/* #define USE_COMBINATION_EXPLOSION_CHECK */     /* (X*)* */\n\n/* #define USE_MULTI_THREAD_SYSTEM */\n#define THREAD_SYSTEM_INIT      /* depend on thread system */\n#define THREAD_SYSTEM_END       /* depend on thread system */\n#define THREAD_ATOMIC_START     /* depend on thread system */\n#define THREAD_ATOMIC_END       /* depend on thread system */\n#define THREAD_PASS             /* depend on thread system */\n#define xmalloc     malloc\n#define xrealloc    realloc\n#define xcalloc     calloc\n#define xfree       free\n\n#define CHECK_INTERRUPT_IN_MATCH_AT\n\n#define st_init_table                  onig_st_init_table\n#define st_init_table_with_size        onig_st_init_table_with_size\n#define st_init_numtable               onig_st_init_numtable\n#define st_init_numtable_with_size     onig_st_init_numtable_with_size\n#define st_init_strtable               onig_st_init_strtable\n#define st_init_strtable_with_size     onig_st_init_strtable_with_size\n#define st_delete                      onig_st_delete\n#define st_delete_safe                 onig_st_delete_safe\n#define st_insert                      onig_st_insert\n#define st_lookup                      onig_st_lookup\n#define st_foreach                     onig_st_foreach\n#define st_add_direct                  onig_st_add_direct\n#define st_free_table                  onig_st_free_table\n#define st_cleanup_safe                onig_st_cleanup_safe\n#define st_copy                        onig_st_copy\n#define st_nothing_key_clone           onig_st_nothing_key_clone\n#define st_nothing_key_free            onig_st_nothing_key_free\n/* */\n#define onig_st_is_member              st_is_member\n\n#define STATE_CHECK_STRING_THRESHOLD_LEN             7\n#define STATE_CHECK_BUFF_MAX_SIZE               0x4000\n\n#define THREAD_PASS_LIMIT_COUNT     8\n#define xmemset     memset\n#define xmemcpy     memcpy\n#define xmemmove    memmove\n\n#if defined(_WIN32) && !defined(__GNUC__)\n#define xalloca     _alloca\n#define xvsnprintf  _vsnprintf\n#else\n#define xalloca     alloca\n#define xvsnprintf  vsnprintf\n#endif\n\n\n#if defined(USE_RECOMPILE_API) && defined(USE_MULTI_THREAD_SYSTEM)\n#define ONIG_STATE_INC(reg) (reg)->state++\n#define ONIG_STATE_DEC(reg) (reg)->state--\n\n#define ONIG_STATE_INC_THREAD(reg) do {\\\n  THREAD_ATOMIC_START;\\\n  (reg)->state++;\\\n  THREAD_ATOMIC_END;\\\n} while(0)\n#define ONIG_STATE_DEC_THREAD(reg) do {\\\n  THREAD_ATOMIC_START;\\\n  (reg)->state--;\\\n  THREAD_ATOMIC_END;\\\n} while(0)\n#else\n#define ONIG_STATE_INC(reg)         /* Nothing */\n#define ONIG_STATE_DEC(reg)         /* Nothing */\n#define ONIG_STATE_INC_THREAD(reg)  /* Nothing */\n#define ONIG_STATE_DEC_THREAD(reg)  /* Nothing */\n#endif /* USE_RECOMPILE_API && USE_MULTI_THREAD_SYSTEM */\n\n#ifdef HAVE_STDLIB_H\n#include <stdlib.h>\n#endif\n\n#if defined(HAVE_ALLOCA_H) && (defined(_AIX) || !defined(__GNUC__))\n#include <alloca.h>\n#endif\n\n#ifdef HAVE_STRING_H\n# include <string.h>\n#else\n# include <strings.h>\n#endif\n\n#include <ctype.h>\n#ifdef HAVE_SYS_TYPES_H\n#ifndef __BORLANDC__\n#include <sys/types.h>\n#endif\n#endif\n\n#ifdef HAVE_STDINT_H\n# include <stdint.h>\n#endif\n\n#ifdef STDC_HEADERS\n# include <stddef.h>\n#endif\n\n#ifdef __BORLANDC__\n#include <malloc.h>\n#endif\n\n#ifdef ONIG_DEBUG\n# include <stdio.h>\n#endif\n\n#ifdef _WIN32\n#if defined(_MSC_VER) && (_MSC_VER < 1300)\n#ifndef _INTPTR_T_DEFINED\n#define _INTPTR_T_DEFINED\ntypedef int intptr_t;\n#endif\n#ifndef _UINTPTR_T_DEFINED\n#define _UINTPTR_T_DEFINED\ntypedef unsigned int uintptr_t;\n#endif\n#endif\n#endif /* _WIN32 */\n\n#include \"regenc.h\"\n\n#ifdef MIN\n#undef MIN\n#endif\n#ifdef MAX\n#undef MAX\n#endif\n#define MIN(a,b) (((a)>(b))?(b):(a))\n#define MAX(a,b) (((a)<(b))?(b):(a))\n\n#define IS_NULL(p)                    (((void*)(p)) == (void*)0)\n#define IS_NOT_NULL(p)                (((void*)(p)) != (void*)0)\n#define CHECK_NULL_RETURN(p)          if (IS_NULL(p)) return NULL\n#define CHECK_NULL_RETURN_MEMERR(p)   if (IS_NULL(p)) return ONIGERR_MEMORY\n#define NULL_UCHARP                   ((UChar* )0)\n\n#define ONIG_LAST_CODE_POINT    (~((OnigCodePoint )0))\n\n#ifdef PLATFORM_UNALIGNED_WORD_ACCESS\n\n#define PLATFORM_GET_INC(val,p,type) do{\\\n  val  = *(type* )p;\\\n  (p) += sizeof(type);\\\n} while(0)\n\n#else\n\n#define PLATFORM_GET_INC(val,p,type) do{\\\n  xmemcpy(&val, (p), sizeof(type));\\\n  (p) += sizeof(type);\\\n} while(0)\n\n/* sizeof(OnigCodePoint) */\n#define WORD_ALIGNMENT_SIZE     SIZEOF_LONG\n\n#define GET_ALIGNMENT_PAD_SIZE(addr,pad_size) do {\\\n  (pad_size) = WORD_ALIGNMENT_SIZE \\\n               - ((uintptr_t )(addr) % WORD_ALIGNMENT_SIZE);\\\n  if ((pad_size) == WORD_ALIGNMENT_SIZE) (pad_size) = 0;\\\n} while (0)\n\n#define ALIGNMENT_RIGHT(addr) do {\\\n  (addr) += (WORD_ALIGNMENT_SIZE - 1);\\\n  (addr) -= ((uintptr_t )(addr) % WORD_ALIGNMENT_SIZE);\\\n} while (0)\n\n#endif /* PLATFORM_UNALIGNED_WORD_ACCESS */\n\n/* stack pop level */\n#define STACK_POP_LEVEL_FREE        0\n#define STACK_POP_LEVEL_MEM_START   1\n#define STACK_POP_LEVEL_ALL         2\n\n/* optimize flags */\n#define ONIG_OPTIMIZE_NONE              0\n#define ONIG_OPTIMIZE_EXACT             1   /* Slow Search */\n#define ONIG_OPTIMIZE_EXACT_BM          2   /* Boyer Moore Search */\n#define ONIG_OPTIMIZE_EXACT_BM_NOT_REV  3   /* BM (applied to a multibyte string) */\n#define ONIG_OPTIMIZE_EXACT_IC          4   /* Slow Search (ignore case) */\n#define ONIG_OPTIMIZE_MAP               5   /* char map */\n#define ONIG_OPTIMIZE_EXACT_BM_IC         6 /* BM (ignore case) */\n#define ONIG_OPTIMIZE_EXACT_BM_NOT_REV_IC 7 /* BM (applied to a multibyte string) (ignore case) */\n\n/* bit status */\ntypedef unsigned int  BitStatusType;\n\n#define BIT_STATUS_BITS_NUM          (sizeof(BitStatusType) * 8)\n#define BIT_STATUS_CLEAR(stats)      (stats) = 0\n#define BIT_STATUS_ON_ALL(stats)     (stats) = ~((BitStatusType )0)\n#define BIT_STATUS_AT(stats,n) \\\n  ((n) < (int )BIT_STATUS_BITS_NUM  ?  ((stats) & (1 << n)) : ((stats) & 1))\n\n#define BIT_STATUS_ON_AT(stats,n) do {\\\n    if ((n) < (int )BIT_STATUS_BITS_NUM)\t\\\n    (stats) |= (1 << (n));\\\n  else\\\n    (stats) |= 1;\\\n} while (0)\n\n#define BIT_STATUS_ON_AT_SIMPLE(stats,n) do {\\\n    if ((n) < (int )BIT_STATUS_BITS_NUM)\\\n    (stats) |= (1 << (n));\\\n} while (0)\n\n\n#define INT_MAX_LIMIT           ((1UL << (SIZEOF_INT * 8 - 1)) - 1)\n\n#define DIGITVAL(code)    ((code) - '0')\n#define ODIGITVAL(code)   DIGITVAL(code)\n#define XDIGITVAL(enc,code) \\\n  (ONIGENC_IS_CODE_DIGIT(enc,code) ? DIGITVAL(code) \\\n   : (ONIGENC_IS_CODE_UPPER(enc,code) ? (code) - 'A' + 10 : (code) - 'a' + 10))\n\n#define IS_SINGLELINE(option)     ((option) & ONIG_OPTION_SINGLELINE)\n#define IS_MULTILINE(option)      ((option) & ONIG_OPTION_MULTILINE)\n#define IS_IGNORECASE(option)     ((option) & ONIG_OPTION_IGNORECASE)\n#define IS_EXTEND(option)         ((option) & ONIG_OPTION_EXTEND)\n#define IS_FIND_LONGEST(option)   ((option) & ONIG_OPTION_FIND_LONGEST)\n#define IS_FIND_NOT_EMPTY(option) ((option) & ONIG_OPTION_FIND_NOT_EMPTY)\n#define IS_FIND_CONDITION(option) ((option) & \\\n          (ONIG_OPTION_FIND_LONGEST | ONIG_OPTION_FIND_NOT_EMPTY))\n#define IS_NOTBOL(option)         ((option) & ONIG_OPTION_NOTBOL)\n#define IS_NOTEOL(option)         ((option) & ONIG_OPTION_NOTEOL)\n#define IS_POSIX_REGION(option)   ((option) & ONIG_OPTION_POSIX_REGION)\n#define IS_ASCII_RANGE(option)    ((option) & ONIG_OPTION_ASCII_RANGE)\n#define IS_POSIX_BRACKET_ALL_RANGE(option)  ((option) & ONIG_OPTION_POSIX_BRACKET_ALL_RANGE)\n#define IS_WORD_BOUND_ALL_RANGE(option)     ((option) & ONIG_OPTION_WORD_BOUND_ALL_RANGE)\n#define IS_NEWLINE_CRLF(option)   ((option) & ONIG_OPTION_NEWLINE_CRLF)\n#define IS_WHOLEWORD(option)   ((option) & SE_ONIG_OPTION_WHOLEWORD)\n\n/* OP_SET_OPTION is required for these options.\n#define IS_DYNAMIC_OPTION(option) \\\n  (((option) & (ONIG_OPTION_MULTILINE | ONIG_OPTION_IGNORECASE)) != 0)\n*/\n/* ignore-case and multibyte status are included in compiled code. */\n#define IS_DYNAMIC_OPTION(option)  0\n\n#define DISABLE_CASE_FOLD_MULTI_CHAR(case_fold_flag) \\\n  ((case_fold_flag) & ~INTERNAL_ONIGENC_CASE_FOLD_MULTI_CHAR)\n\n#define REPEAT_INFINITE         -1\n#define IS_REPEAT_INFINITE(n)   ((n) == REPEAT_INFINITE)\n\n/* bitset */\n#define BITS_PER_BYTE      8\n#define SINGLE_BYTE_SIZE   (1 << BITS_PER_BYTE)\n#define BITS_IN_ROOM       ((int )sizeof(Bits) * BITS_PER_BYTE)\n#define BITSET_SIZE        (SINGLE_BYTE_SIZE / BITS_IN_ROOM)\n\n#ifdef PLATFORM_UNALIGNED_WORD_ACCESS\ntypedef unsigned int   Bits;\n#else\ntypedef unsigned char  Bits;\n#endif\ntypedef Bits           BitSet[BITSET_SIZE];\ntypedef Bits*          BitSetRef;\n\n#define SIZE_BITSET        (int )sizeof(BitSet)\n\n#define BITSET_CLEAR(bs) do {\\\n  int i;\\\n  for (i = 0; i < BITSET_SIZE; i++) { (bs)[i] = 0; }\t\\\n} while (0)\n\n#define BS_ROOM(bs,pos)            (bs)[(int )(pos) / BITS_IN_ROOM]\n#define BS_BIT(pos)                (1 << ((int )(pos) % BITS_IN_ROOM))\n\n#define BITSET_AT(bs, pos)         (BS_ROOM(bs,pos) & BS_BIT(pos))\n#define BITSET_SET_BIT(bs, pos)     BS_ROOM(bs,pos) |= BS_BIT(pos)\n#define BITSET_CLEAR_BIT(bs, pos)   BS_ROOM(bs,pos) &= ~(BS_BIT(pos))\n#define BITSET_INVERT_BIT(bs, pos)  BS_ROOM(bs,pos) ^= BS_BIT(pos)\n\n/* bytes buffer */\ntypedef struct _BBuf {\n  UChar* p;\n  unsigned int used;\n  unsigned int alloc;\n} BBuf;\n\n#define BBUF_INIT(buf,size)    onig_bbuf_init((BBuf* )(buf), (size))\n\n#define BBUF_SIZE_INC(buf,inc) do{\\\n  (buf)->alloc += (inc);\\\n  (buf)->p = (UChar* )xrealloc((buf)->p, (buf)->alloc);\\\n  if (IS_NULL((buf)->p)) return(ONIGERR_MEMORY);\\\n} while (0)\n\n#define BBUF_EXPAND(buf,low) do{\\\n  do { (buf)->alloc *= 2; } while ((buf)->alloc < (unsigned int )low);\\\n  (buf)->p = (UChar* )xrealloc((buf)->p, (buf)->alloc);\\\n  if (IS_NULL((buf)->p)) return(ONIGERR_MEMORY);\\\n} while (0)\n\n#define BBUF_ENSURE_SIZE(buf,size) do{\\\n  unsigned int new_alloc = (buf)->alloc;\\\n  while (new_alloc < (unsigned int )(size)) { new_alloc *= 2; }\\\n  if ((buf)->alloc != new_alloc) {\\\n    (buf)->p = (UChar* )xrealloc((buf)->p, new_alloc);\\\n    if (IS_NULL((buf)->p)) return(ONIGERR_MEMORY);\\\n    (buf)->alloc = new_alloc;\\\n  }\\\n} while (0)\n\n#define BBUF_WRITE(buf,pos,bytes,n) do{\\\n  int used = (pos) + (int )(n);\\\n  if ((buf)->alloc < (unsigned int )used) BBUF_EXPAND((buf),used);\\\n  xmemcpy((buf)->p + (pos), (bytes), (n));\\\n  if ((buf)->used < (unsigned int )used) (buf)->used = used;\\\n} while (0)\n\n#define BBUF_WRITE1(buf,pos,byte) do{\\\n  int used = (pos) + 1;\\\n  if ((buf)->alloc < (unsigned int )used) BBUF_EXPAND((buf),used);\\\n  (buf)->p[(pos)] = (UChar )(byte);\\\n  if ((buf)->used < (unsigned int )used) (buf)->used = used;\\\n} while (0)\n\n#define BBUF_ADD(buf,bytes,n)       BBUF_WRITE((buf),(buf)->used,(bytes),(n))\n#define BBUF_ADD1(buf,byte)         BBUF_WRITE1((buf),(buf)->used,(byte))\n#define BBUF_GET_ADD_ADDRESS(buf)   ((buf)->p + (buf)->used)\n#define BBUF_GET_OFFSET_POS(buf)    ((buf)->used)\n\n/* from < to */\n#define BBUF_MOVE_RIGHT(buf,from,to,n) do {\\\n  if ((unsigned int )((to)+(n)) > (buf)->alloc) BBUF_EXPAND((buf),(to) + (n));\\\n  xmemmove((buf)->p + (to), (buf)->p + (from), (n));\\\n  if ((unsigned int )((to)+(n)) > (buf)->used) (buf)->used = (to) + (n);\\\n} while (0)\n\n/* from > to */\n#define BBUF_MOVE_LEFT(buf,from,to,n) do {\\\n  xmemmove((buf)->p + (to), (buf)->p + (from), (n));\\\n} while (0)\n\n/* from > to */\n#define BBUF_MOVE_LEFT_REDUCE(buf,from,to) do {\\\n  xmemmove((buf)->p + (to), (buf)->p + (from), (buf)->used - (from));\\\n  (buf)->used -= (from - to);\\\n} while (0)\n\n#define BBUF_INSERT(buf,pos,bytes,n) do {\\\n  if (pos >= (buf)->used) {\\\n    BBUF_WRITE(buf,pos,bytes,n);\\\n  }\\\n  else {\\\n    BBUF_MOVE_RIGHT((buf),(pos),(pos) + (n),((buf)->used - (pos)));\\\n    xmemcpy((buf)->p + (pos), (bytes), (n));\\\n  }\\\n} while (0)\n\n#define BBUF_GET_BYTE(buf, pos) (buf)->p[(pos)]\n\n\n#define ANCHOR_BEGIN_BUF        (1<<0)\n#define ANCHOR_BEGIN_LINE       (1<<1)\n#define ANCHOR_BEGIN_POSITION   (1<<2)\n#define ANCHOR_END_BUF          (1<<3)\n#define ANCHOR_SEMI_END_BUF     (1<<4)\n#define ANCHOR_END_LINE         (1<<5)\n\n#define ANCHOR_WORD_BOUND       (1<<6)\n#define ANCHOR_NOT_WORD_BOUND   (1<<7)\n#define ANCHOR_WORD_BEGIN       (1<<8)\n#define ANCHOR_WORD_END         (1<<9)\n#define ANCHOR_PREC_READ        (1<<10)\n#define ANCHOR_PREC_READ_NOT    (1<<11)\n#define ANCHOR_LOOK_BEHIND      (1<<12)\n#define ANCHOR_LOOK_BEHIND_NOT  (1<<13)\n\n#define ANCHOR_ANYCHAR_STAR     (1<<14)   /* \".*\" optimize info */\n#define ANCHOR_ANYCHAR_STAR_ML  (1<<15)   /* \".*\" optimize info (multi-line) */\n\n#define ANCHOR_KEEP             (1<<16)\n\n/* operation code */\nenum OpCode {\n  OP_FINISH = 0,        /* matching process terminator (no more alternative) */\n  OP_END    = 1,        /* pattern code terminator (success end) */\n\n  OP_EXACT1 = 2,        /* single byte, N = 1 */\n  OP_EXACT2,            /* single byte, N = 2 */\n  OP_EXACT3,            /* single byte, N = 3 */\n  OP_EXACT4,            /* single byte, N = 4 */\n  OP_EXACT5,            /* single byte, N = 5 */\n  OP_EXACTN,            /* single byte */\n  OP_EXACTMB2N1,        /* mb-length = 2 N = 1 */\n  OP_EXACTMB2N2,        /* mb-length = 2 N = 2 */\n  OP_EXACTMB2N3,        /* mb-length = 2 N = 3 */\n  OP_EXACTMB2N,         /* mb-length = 2 */\n  OP_EXACTMB3N,         /* mb-length = 3 */\n  OP_EXACTMBN,          /* other length */\n\n  OP_EXACT1_IC,         /* single byte, N = 1, ignore case */\n  OP_EXACTN_IC,         /* single byte,        ignore case */\n\n  OP_CCLASS,\n  OP_CCLASS_MB,\n  OP_CCLASS_MIX,\n  OP_CCLASS_NOT,\n  OP_CCLASS_MB_NOT,\n  OP_CCLASS_MIX_NOT,\n  OP_CCLASS_NODE,       /* pointer to CClassNode node */\n\n  OP_ANYCHAR,                 /* \".\"  */\n  OP_ANYCHAR_ML,              /* \".\"  multi-line */\n  OP_ANYCHAR_STAR,            /* \".*\" */\n  OP_ANYCHAR_ML_STAR,         /* \".*\" multi-line */\n  OP_ANYCHAR_STAR_PEEK_NEXT,\n  OP_ANYCHAR_ML_STAR_PEEK_NEXT,\n\n  OP_WORD,\n  OP_NOT_WORD,\n  OP_WORD_BOUND,\n  OP_NOT_WORD_BOUND,\n  OP_WORD_BEGIN,\n  OP_WORD_END,\n\n  OP_ASCII_WORD,\n  OP_NOT_ASCII_WORD,\n  OP_ASCII_WORD_BOUND,\n  OP_NOT_ASCII_WORD_BOUND,\n  OP_ASCII_WORD_BEGIN,\n  OP_ASCII_WORD_END,\n\n  OP_BEGIN_BUF,\n  OP_END_BUF,\n  OP_BEGIN_LINE,\n  OP_END_LINE,\n  OP_SEMI_END_BUF,\n  OP_BEGIN_POSITION,\n  OP_BEGIN_POS_OR_LINE,   /* used for implicit anchor optimization */\n\n  OP_BACKREF1,\n  OP_BACKREF2,\n  OP_BACKREFN,\n  OP_BACKREFN_IC,\n  OP_BACKREF_MULTI,\n  OP_BACKREF_MULTI_IC,\n  OP_BACKREF_WITH_LEVEL,    /* \\k<xxx+n>, \\k<xxx-n> */\n\n  OP_MEMORY_START,\n  OP_MEMORY_START_PUSH,   /* push back-tracker to stack */\n  OP_MEMORY_END_PUSH,     /* push back-tracker to stack */\n  OP_MEMORY_END_PUSH_REC, /* push back-tracker to stack */\n  OP_MEMORY_END,\n  OP_MEMORY_END_REC,      /* push marker to stack */\n\n  OP_KEEP,\n\n  OP_FAIL,               /* pop stack and move */\n  OP_JUMP,\n  OP_PUSH,\n  OP_POP,\n  OP_PUSH_OR_JUMP_EXACT1,  /* if match exact then push, else jump. */\n  OP_PUSH_IF_PEEK_NEXT,    /* if match exact then push, else none. */\n  OP_REPEAT,               /* {n,m} */\n  OP_REPEAT_NG,            /* {n,m}? (non greedy) */\n  OP_REPEAT_INC,\n  OP_REPEAT_INC_NG,        /* non greedy */\n  OP_REPEAT_INC_SG,        /* search and get in stack */\n  OP_REPEAT_INC_NG_SG,     /* search and get in stack (non greedy) */\n  OP_NULL_CHECK_START,     /* null loop checker start */\n  OP_NULL_CHECK_END,       /* null loop checker end   */\n  OP_NULL_CHECK_END_MEMST, /* null loop checker end (with capture status) */\n  OP_NULL_CHECK_END_MEMST_PUSH, /* with capture status and push check-end */\n\n  OP_PUSH_POS,             /* (?=...)  start */\n  OP_POP_POS,              /* (?=...)  end   */\n  OP_PUSH_POS_NOT,         /* (?!...)  start */\n  OP_FAIL_POS,             /* (?!...)  end   */\n  OP_PUSH_STOP_BT,         /* (?>...)  start */\n  OP_POP_STOP_BT,          /* (?>...)  end   */\n  OP_LOOK_BEHIND,          /* (?<=...) start (no needs end opcode) */\n  OP_PUSH_LOOK_BEHIND_NOT, /* (?<!...) start */\n  OP_FAIL_LOOK_BEHIND_NOT, /* (?<!...) end   */\n\n  OP_CALL,                 /* \\g<name> */\n  OP_RETURN,\n\n  OP_CONDITION,\n\n  OP_STATE_CHECK_PUSH,         /* combination explosion check and push */\n  OP_STATE_CHECK_PUSH_OR_JUMP, /* check ok -> push, else jump  */\n  OP_STATE_CHECK,              /* check only */\n  OP_STATE_CHECK_ANYCHAR_STAR,\n  OP_STATE_CHECK_ANYCHAR_ML_STAR,\n\n  /* no need: IS_DYNAMIC_OPTION() == 0 */\n  OP_SET_OPTION_PUSH,    /* set option and push recover option */\n  OP_SET_OPTION          /* set option */\n};\n\ntypedef int RelAddrType;\ntypedef int AbsAddrType;\ntypedef int LengthType;\ntypedef int RepeatNumType;\ntypedef short int MemNumType;\ntypedef short int StateCheckNumType;\ntypedef void* PointerType;\n\n#define SIZE_OPCODE           1\n#define SIZE_RELADDR          (int )sizeof(RelAddrType)\n#define SIZE_ABSADDR          (int )sizeof(AbsAddrType)\n#define SIZE_LENGTH           (int )sizeof(LengthType)\n#define SIZE_MEMNUM           (int )sizeof(MemNumType)\n#define SIZE_STATE_CHECK_NUM  (int )sizeof(StateCheckNumType)\n#define SIZE_REPEATNUM        (int )sizeof(RepeatNumType)\n#define SIZE_OPTION           (int )sizeof(OnigOptionType)\n#define SIZE_CODE_POINT       (int )sizeof(OnigCodePoint)\n#define SIZE_POINTER          (int )sizeof(PointerType)\n\n\n#define GET_RELADDR_INC(addr,p)    PLATFORM_GET_INC(addr,   p, RelAddrType)\n#define GET_ABSADDR_INC(addr,p)    PLATFORM_GET_INC(addr,   p, AbsAddrType)\n#define GET_LENGTH_INC(len,p)      PLATFORM_GET_INC(len,    p, LengthType)\n#define GET_MEMNUM_INC(num,p)      PLATFORM_GET_INC(num,    p, MemNumType)\n#define GET_REPEATNUM_INC(num,p)   PLATFORM_GET_INC(num,    p, RepeatNumType)\n#define GET_OPTION_INC(option,p)   PLATFORM_GET_INC(option, p, OnigOptionType)\n#define GET_POINTER_INC(ptr,p)     PLATFORM_GET_INC(ptr,    p, PointerType)\n#define GET_STATE_CHECK_NUM_INC(num,p)  PLATFORM_GET_INC(num, p, StateCheckNumType)\n\n/* code point's address must be aligned address. */\n#define GET_CODE_POINT(code,p)   code = *((OnigCodePoint* )(p))\n#define GET_BYTE_INC(byte,p) do{\\\n  byte = *(p);\\\n  (p)++;\\\n} while(0)\n\n\n/* op-code + arg size */\n#define SIZE_OP_ANYCHAR_STAR            SIZE_OPCODE\n#define SIZE_OP_ANYCHAR_STAR_PEEK_NEXT (SIZE_OPCODE + 1)\n#define SIZE_OP_JUMP                   (SIZE_OPCODE + SIZE_RELADDR)\n#define SIZE_OP_PUSH                   (SIZE_OPCODE + SIZE_RELADDR)\n#define SIZE_OP_POP                     SIZE_OPCODE\n#define SIZE_OP_PUSH_OR_JUMP_EXACT1    (SIZE_OPCODE + SIZE_RELADDR + 1)\n#define SIZE_OP_PUSH_IF_PEEK_NEXT      (SIZE_OPCODE + SIZE_RELADDR + 1)\n#define SIZE_OP_REPEAT_INC             (SIZE_OPCODE + SIZE_MEMNUM)\n#define SIZE_OP_REPEAT_INC_NG          (SIZE_OPCODE + SIZE_MEMNUM)\n#define SIZE_OP_PUSH_POS                SIZE_OPCODE\n#define SIZE_OP_PUSH_POS_NOT           (SIZE_OPCODE + SIZE_RELADDR)\n#define SIZE_OP_POP_POS                 SIZE_OPCODE\n#define SIZE_OP_FAIL_POS                SIZE_OPCODE\n#define SIZE_OP_SET_OPTION             (SIZE_OPCODE + SIZE_OPTION)\n#define SIZE_OP_SET_OPTION_PUSH        (SIZE_OPCODE + SIZE_OPTION)\n#define SIZE_OP_FAIL                    SIZE_OPCODE\n#define SIZE_OP_MEMORY_START           (SIZE_OPCODE + SIZE_MEMNUM)\n#define SIZE_OP_MEMORY_START_PUSH      (SIZE_OPCODE + SIZE_MEMNUM)\n#define SIZE_OP_MEMORY_END_PUSH        (SIZE_OPCODE + SIZE_MEMNUM)\n#define SIZE_OP_MEMORY_END_PUSH_REC    (SIZE_OPCODE + SIZE_MEMNUM)\n#define SIZE_OP_MEMORY_END             (SIZE_OPCODE + SIZE_MEMNUM)\n#define SIZE_OP_MEMORY_END_REC         (SIZE_OPCODE + SIZE_MEMNUM)\n#define SIZE_OP_PUSH_STOP_BT            SIZE_OPCODE\n#define SIZE_OP_POP_STOP_BT             SIZE_OPCODE\n#define SIZE_OP_NULL_CHECK_START       (SIZE_OPCODE + SIZE_MEMNUM)\n#define SIZE_OP_NULL_CHECK_END         (SIZE_OPCODE + SIZE_MEMNUM)\n#define SIZE_OP_LOOK_BEHIND            (SIZE_OPCODE + SIZE_LENGTH)\n#define SIZE_OP_PUSH_LOOK_BEHIND_NOT   (SIZE_OPCODE + SIZE_RELADDR + SIZE_LENGTH)\n#define SIZE_OP_FAIL_LOOK_BEHIND_NOT    SIZE_OPCODE\n#define SIZE_OP_CALL                   (SIZE_OPCODE + SIZE_ABSADDR)\n#define SIZE_OP_RETURN                  SIZE_OPCODE\n#define SIZE_OP_CONDITION              (SIZE_OPCODE + SIZE_MEMNUM + SIZE_RELADDR)\n\n#ifdef USE_COMBINATION_EXPLOSION_CHECK\n#define SIZE_OP_STATE_CHECK            (SIZE_OPCODE + SIZE_STATE_CHECK_NUM)\n#define SIZE_OP_STATE_CHECK_PUSH       (SIZE_OPCODE + SIZE_STATE_CHECK_NUM + SIZE_RELADDR)\n#define SIZE_OP_STATE_CHECK_PUSH_OR_JUMP (SIZE_OPCODE + SIZE_STATE_CHECK_NUM + SIZE_RELADDR)\n#define SIZE_OP_STATE_CHECK_ANYCHAR_STAR (SIZE_OPCODE + SIZE_STATE_CHECK_NUM)\n#endif\n\n#define MC_ESC(syn)               (syn)->meta_char_table.esc\n#define MC_ANYCHAR(syn)           (syn)->meta_char_table.anychar\n#define MC_ANYTIME(syn)           (syn)->meta_char_table.anytime\n#define MC_ZERO_OR_ONE_TIME(syn)  (syn)->meta_char_table.zero_or_one_time\n#define MC_ONE_OR_MORE_TIME(syn)  (syn)->meta_char_table.one_or_more_time\n#define MC_ANYCHAR_ANYTIME(syn)   (syn)->meta_char_table.anychar_anytime\n\n#define IS_MC_ESC_CODE(code, syn) \\\n  ((code) == MC_ESC(syn) && \\\n   !IS_SYNTAX_OP2((syn), ONIG_SYN_OP2_INEFFECTIVE_ESCAPE))\n\n\n#define SYN_POSIX_COMMON_OP \\\n ( ONIG_SYN_OP_DOT_ANYCHAR | ONIG_SYN_OP_POSIX_BRACKET | \\\n   ONIG_SYN_OP_DECIMAL_BACKREF | \\\n   ONIG_SYN_OP_BRACKET_CC | ONIG_SYN_OP_ASTERISK_ZERO_INF | \\\n   ONIG_SYN_OP_LINE_ANCHOR | \\\n   ONIG_SYN_OP_ESC_CONTROL_CHARS )\n\n#define SYN_GNU_REGEX_OP \\\n  ( ONIG_SYN_OP_DOT_ANYCHAR | ONIG_SYN_OP_BRACKET_CC | \\\n    ONIG_SYN_OP_POSIX_BRACKET | ONIG_SYN_OP_DECIMAL_BACKREF | \\\n    ONIG_SYN_OP_BRACE_INTERVAL | ONIG_SYN_OP_LPAREN_SUBEXP | \\\n    ONIG_SYN_OP_VBAR_ALT | \\\n    ONIG_SYN_OP_ASTERISK_ZERO_INF | ONIG_SYN_OP_PLUS_ONE_INF | \\\n    ONIG_SYN_OP_QMARK_ZERO_ONE | \\\n    ONIG_SYN_OP_ESC_AZ_BUF_ANCHOR | ONIG_SYN_OP_ESC_CAPITAL_G_BEGIN_ANCHOR | \\\n    ONIG_SYN_OP_ESC_W_WORD | \\\n    ONIG_SYN_OP_ESC_B_WORD_BOUND | ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END | \\\n    ONIG_SYN_OP_ESC_S_WHITE_SPACE | ONIG_SYN_OP_ESC_D_DIGIT | \\\n    ONIG_SYN_OP_LINE_ANCHOR )\n\n#define SYN_GNU_REGEX_BV \\\n  ( ONIG_SYN_CONTEXT_INDEP_ANCHORS | ONIG_SYN_CONTEXT_INDEP_REPEAT_OPS | \\\n    ONIG_SYN_CONTEXT_INVALID_REPEAT_OPS | ONIG_SYN_ALLOW_INVALID_INTERVAL | \\\n    ONIG_SYN_BACKSLASH_ESCAPE_IN_CC | ONIG_SYN_ALLOW_DOUBLE_RANGE_OP_IN_CC )\n\n\n#define NCCLASS_FLAGS(cc)           ((cc)->flags)\n#define NCCLASS_FLAG_SET(cc,flag)    (NCCLASS_FLAGS(cc) |= (flag))\n#define NCCLASS_FLAG_CLEAR(cc,flag)  (NCCLASS_FLAGS(cc) &= ~(flag))\n#define IS_NCCLASS_FLAG_ON(cc,flag) ((NCCLASS_FLAGS(cc) & (flag)) != 0)\n\n/* cclass node */\n#define FLAG_NCCLASS_NOT           (1<<0)\n#define FLAG_NCCLASS_SHARE         (1<<1)\n\n#define NCCLASS_SET_NOT(nd)     NCCLASS_FLAG_SET(nd, FLAG_NCCLASS_NOT)\n#define NCCLASS_SET_SHARE(nd)   NCCLASS_FLAG_SET(nd, FLAG_NCCLASS_SHARE)\n#define NCCLASS_CLEAR_NOT(nd)   NCCLASS_FLAG_CLEAR(nd, FLAG_NCCLASS_NOT)\n#define IS_NCCLASS_NOT(nd)      IS_NCCLASS_FLAG_ON(nd, FLAG_NCCLASS_NOT)\n#define IS_NCCLASS_SHARE(nd)    IS_NCCLASS_FLAG_ON(nd, FLAG_NCCLASS_SHARE)\n\ntypedef struct {\n  int type;\n  /* struct _Node* next; */\n  /* unsigned int flags; */\n} NodeBase;\n\ntypedef struct {\n  NodeBase base;\n  unsigned int flags;\n  BitSet bs;\n  BBuf*  mbuf;   /* multi-byte info or NULL */\n} CClassNode;\n\ntypedef OnigPosition OnigStackIndex;\n\ntypedef struct _OnigStackType {\n  unsigned int type;\n  union {\n    struct {\n      UChar *pcode;      /* byte code position */\n      OnigPosition pstr;       /* string position */\n      OnigPosition pstr_prev;  /* previous char position of pstr */\n#ifdef USE_COMBINATION_EXPLOSION_CHECK\n      unsigned int state_check;\n#endif\n      OnigPosition pkeep;      /* keep pattern position */\n    } state;\n    struct {\n      int   count;       /* for OP_REPEAT_INC, OP_REPEAT_INC_NG */\n      UChar *pcode;      /* byte code position (head of repeated target) */\n      int   num;         /* repeat id */\n    } repeat;\n    struct {\n      OnigStackIndex si;     /* index of stack */\n    } repeat_inc;\n    struct {\n      int num;           /* memory num */\n      OnigPosition pstr;       /* start/end position */\n      /* Following information is set, if this stack type is MEM-START */\n      OnigStackIndex start;  /* prev. info (for backtrack  \"(...)*\" ) */\n      OnigStackIndex end;    /* prev. info (for backtrack  \"(...)*\" ) */\n    } mem;\n    struct {\n      int num;           /* null check id */\n      OnigPosition pstr;       /* start position */\n    } null_check;\n#ifdef USE_SUBEXP_CALL\n    struct {\n      UChar *ret_addr;   /* byte code position */\n      int    num;        /* null check id */\n      OnigPosition pstr;       /* string position */\n    } call_frame;\n#endif\n  } u;\n} OnigStackType;\n\ntypedef struct {\n  void* stack_p;\n  size_t stack_n;\n  OnigOptionType options;\n  OnigRegion*    region;\n  OnigPosition start;   /* search start position */\n  OnigPosition gpos;    /* global position (for \\G: BEGIN_POSITION) */\n#ifdef USE_FIND_LONGEST_SEARCH_ALL_OF_RANGE\n  OnigPosition best_len;  /* for ONIG_OPTION_FIND_LONGEST */\n  OnigPosition best_s;\n#endif\n#ifdef USE_COMBINATION_EXPLOSION_CHECK\n  void* state_check_buff;\n  int   state_check_buff_size;\n#endif\n} OnigMatchArg;\n\n\n#define IS_CODE_SB_WORD(enc,code) \\\n  (ONIGENC_IS_CODE_ASCII(code) && ONIGENC_IS_CODE_WORD(enc,code))\n\n#ifdef ONIG_DEBUG\n\ntypedef struct {\n  short int opcode;\n  const char* name;\n  short int arg_type;\n} OnigOpInfoType;\n\nextern OnigOpInfoType OnigOpInfo[];\n\nextern void onig_print_compiled_byte_code P_((FILE* f, UChar* bp, UChar** nextp, OnigEncoding enc));\n\n#ifdef ONIG_DEBUG_STATISTICS\nextern void onig_statistics_init P_((void));\nextern void onig_print_statistics P_((FILE* f));\n#endif\n#endif\n\nextern UChar* onig_error_code_to_format P_((OnigPosition code));\nextern void  onig_snprintf_with_pattern PV_((UChar buf[], int bufsize, OnigEncoding enc, UChar* pat, UChar* pat_end, const UChar *fmt, ...));\nextern int  onig_bbuf_init P_((BBuf* buf, OnigDistance size));\nextern int  onig_compile P_((regex_t* reg, const UChar* pattern, const UChar* pattern_end, OnigErrorInfo* einfo));\nextern void onig_chain_reduce P_((regex_t* reg));\nextern void onig_chain_link_add P_((regex_t* to, regex_t* add));\nextern void onig_transfer P_((regex_t* to, regex_t* from));\nextern int  onig_is_code_in_cc P_((OnigEncoding enc, OnigCodePoint code, CClassNode* cc));\nextern int  onig_is_code_in_cc_len P_((int enclen, OnigCodePoint code, CClassNode* cc));\n\n/* strend hash */\ntypedef void hash_table_type;\ntypedef uintptr_t hash_data_type;\n\nextern hash_table_type* onig_st_init_strend_table_with_size P_((int size));\nextern int onig_st_lookup_strend P_((hash_table_type* table, const UChar* str_key, const UChar* end_key, hash_data_type *value));\nextern int onig_st_insert_strend P_((hash_table_type* table, const UChar* str_key, const UChar* end_key, hash_data_type value));\n\n/* encoding property management */\n#define PROPERTY_LIST_ADD_PROP(Name, CR) \\\n  r = onigenc_property_list_add_property((UChar* )Name, CR,\\\n\t      &PropertyNameTable, &PropertyList, &PropertyListNum,\\\n\t      &PropertyListSize);\\\n  if (r != 0) goto end\n\n#define PROPERTY_LIST_INIT_CHECK \\\n  if (PropertyInited == 0) {\\\n    int r = onigenc_property_list_init(init_property_list);\\\n    if (r != 0) return r;\\\n  }\n\nextern int onigenc_property_list_add_property P_((UChar* name, const OnigCodePoint* prop, hash_table_type **table, const OnigCodePoint*** plist, int *pnum, int *psize));\n\ntypedef int (*ONIGENC_INIT_PROPERTY_LIST_FUNC_TYPE)(void);\n\nextern int onigenc_property_list_init P_((ONIGENC_INIT_PROPERTY_LIST_FUNC_TYPE));\n\nextern size_t onig_memsize P_((const regex_t *reg));\nextern size_t onig_region_memsize P_((const struct re_registers *regs));\n\n#endif /* REGINT_H */\n"
  },
  {
    "path": "src/Onigmo/regparse.c",
    "content": "/**********************************************************************\n  regparse.c -  Onigmo (Oniguruma-mod) (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2008  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * Copyright (c) 2011-2013  K.Takata  <kentkt AT csc DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regparse.h\"\n#include \"st.h\"\n\n#define WARN_BUFSIZE    256\n\n#define CASE_FOLD_IS_APPLIED_INSIDE_NEGATIVE_CCLASS\n\nOnigSyntaxType OnigSyntaxRuby = {\n  (( SYN_GNU_REGEX_OP | ONIG_SYN_OP_QMARK_NON_GREEDY |\n     ONIG_SYN_OP_ESC_OCTAL3 | ONIG_SYN_OP_ESC_X_HEX2 |\n     ONIG_SYN_OP_ESC_X_BRACE_HEX8 | ONIG_SYN_OP_ESC_CONTROL_CHARS |\n     ONIG_SYN_OP_ESC_C_CONTROL )\n   & ~ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END )\n  , ( ONIG_SYN_OP2_QMARK_GROUP_EFFECT |\n      ONIG_SYN_OP2_OPTION_RUBY |\n      ONIG_SYN_OP2_QMARK_LT_NAMED_GROUP | ONIG_SYN_OP2_ESC_K_NAMED_BACKREF |\n      ONIG_SYN_OP2_ESC_G_SUBEXP_CALL |\n      ONIG_SYN_OP2_ESC_P_BRACE_CHAR_PROPERTY  |\n      ONIG_SYN_OP2_ESC_P_BRACE_CIRCUMFLEX_NOT |\n      ONIG_SYN_OP2_PLUS_POSSESSIVE_REPEAT |\n      ONIG_SYN_OP2_CCLASS_SET_OP | ONIG_SYN_OP2_ESC_CAPITAL_C_BAR_CONTROL |\n      ONIG_SYN_OP2_ESC_CAPITAL_M_BAR_META | ONIG_SYN_OP2_ESC_V_VTAB |\n      ONIG_SYN_OP2_ESC_H_XDIGIT |\n      ONIG_SYN_OP2_ESC_CAPITAL_X_EXTENDED_GRAPHEME_CLUSTER |\n      ONIG_SYN_OP2_QMARK_LPAREN_CONDITION |\n      ONIG_SYN_OP2_ESC_CAPITAL_R_LINEBREAK |\n      ONIG_SYN_OP2_ESC_CAPITAL_K_KEEP )\n  , ( SYN_GNU_REGEX_BV |\n      ONIG_SYN_ALLOW_INTERVAL_LOW_ABBREV |\n      ONIG_SYN_DIFFERENT_LEN_ALT_LOOK_BEHIND |\n      ONIG_SYN_CAPTURE_ONLY_NAMED_GROUP |\n      ONIG_SYN_ALLOW_MULTIPLEX_DEFINITION_NAME |\n      ONIG_SYN_FIXED_INTERVAL_IS_GREEDY_ONLY |\n      ONIG_SYN_WARN_CC_OP_NOT_ESCAPED |\n      ONIG_SYN_WARN_REDUNDANT_NESTED_REPEAT )\n  , ( /*ONIG_OPTION_ASCII_RANGE |*/ ONIG_OPTION_POSIX_BRACKET_ALL_RANGE |\n      ONIG_OPTION_WORD_BOUND_ALL_RANGE )\n  ,\n  {\n      (OnigCodePoint )'\\\\'                       /* esc */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar '.'  */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anytime '*'  */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* zero or one time '?' */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* one or more time '+' */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar anytime */\n  }\n};\n\nOnigSyntaxType*  OnigDefaultSyntax = ONIG_SYNTAX_RUBY;\n\nextern void onig_null_warn(const char* s ARG_UNUSED) { }\n\n#ifdef DEFAULT_WARN_FUNCTION\nstatic OnigWarnFunc onig_warn = (OnigWarnFunc )DEFAULT_WARN_FUNCTION;\n#else\nstatic OnigWarnFunc onig_warn = onig_null_warn;\n#endif\n\n#ifdef DEFAULT_VERB_WARN_FUNCTION\nstatic OnigWarnFunc onig_verb_warn = (OnigWarnFunc )DEFAULT_VERB_WARN_FUNCTION;\n#else\nstatic OnigWarnFunc onig_verb_warn = onig_null_warn;\n#endif\n\nextern void onig_set_warn_func(OnigWarnFunc f)\n{\n  onig_warn = f;\n}\n\nextern void onig_set_verb_warn_func(OnigWarnFunc f)\n{\n  onig_verb_warn = f;\n}\n\nstatic void\nbbuf_free(BBuf* bbuf)\n{\n  if (IS_NOT_NULL(bbuf)) {\n    if (IS_NOT_NULL(bbuf->p)) xfree(bbuf->p);\n    xfree(bbuf);\n  }\n}\n\nstatic int\nbbuf_clone(BBuf** rto, BBuf* from)\n{\n  int r;\n  BBuf *to;\n\n  *rto = to = (BBuf* )xmalloc(sizeof(BBuf));\n  CHECK_NULL_RETURN_MEMERR(to);\n  r = BBUF_INIT(to, from->alloc);\n  if (r != 0) return r;\n  to->used = from->used;\n  xmemcpy(to->p, from->p, from->used);\n  return 0;\n}\n\n#define BACKREF_REL_TO_ABS(rel_no, env) \\\n  ((env)->num_mem + 1 + (rel_no))\n\n#define ONOFF(v,f,negative)    (negative) ? ((v) &= ~(f)) : ((v) |= (f))\n\n#define MBCODE_START_POS(enc) \\\n  (OnigCodePoint )(ONIGENC_MBC_MINLEN(enc) > 1 ? 0 : 0x80)\n\n#define SET_ALL_MULTI_BYTE_RANGE(enc, pbuf) \\\n  add_code_range_to_buf(pbuf, MBCODE_START_POS(enc), ONIG_LAST_CODE_POINT)\n\n#define ADD_ALL_MULTI_BYTE_RANGE(enc, mbuf) do {\\\n  if (! ONIGENC_IS_SINGLEBYTE(enc)) {\\\n    r = SET_ALL_MULTI_BYTE_RANGE(enc, &(mbuf));\\\n    if (r) return r;\\\n  }\\\n} while (0)\n\n\n#define BITSET_IS_EMPTY(bs,empty) do {\\\n  int i;\\\n  empty = 1;\\\n  for (i = 0; i < BITSET_SIZE; i++) {\\\n    if ((bs)[i] != 0) {\\\n      empty = 0; break;\\\n    }\\\n  }\\\n} while (0)\n\nstatic void\nbitset_set_range(BitSetRef bs, int from, int to)\n{\n  int i;\n  for (i = from; i <= to && i < SINGLE_BYTE_SIZE; i++) {\n    BITSET_SET_BIT(bs, i);\n  }\n}\n\n#if 0\nstatic void\nbitset_set_all(BitSetRef bs)\n{\n  int i;\n  for (i = 0; i < BITSET_SIZE; i++) { bs[i] = ~((Bits )0); }\n}\n#endif\n\nstatic void\nbitset_invert(BitSetRef bs)\n{\n  int i;\n  for (i = 0; i < BITSET_SIZE; i++) { bs[i] = ~(bs[i]); }\n}\n\nstatic void\nbitset_invert_to(BitSetRef from, BitSetRef to)\n{\n  int i;\n  for (i = 0; i < BITSET_SIZE; i++) { to[i] = ~(from[i]); }\n}\n\nstatic void\nbitset_and(BitSetRef dest, BitSetRef bs)\n{\n  int i;\n  for (i = 0; i < BITSET_SIZE; i++) { dest[i] &= bs[i]; }\n}\n\nstatic void\nbitset_or(BitSetRef dest, BitSetRef bs)\n{\n  int i;\n  for (i = 0; i < BITSET_SIZE; i++) { dest[i] |= bs[i]; }\n}\n\nstatic void\nbitset_copy(BitSetRef dest, BitSetRef bs)\n{\n  int i;\n  for (i = 0; i < BITSET_SIZE; i++) { dest[i] = bs[i]; }\n}\n\nextern int\nonig_strncmp(const UChar* s1, const UChar* s2, int n)\n{\n  int x;\n\n  while (n-- > 0) {\n    x = *s2++ - *s1++;\n    if (x) return x;\n  }\n  return 0;\n}\n\nextern void\nonig_strcpy(UChar* dest, const UChar* src, const UChar* end)\n{\n  ptrdiff_t len = end - src;\n  if (len > 0) {\n    xmemcpy(dest, src, len);\n    dest[len] = (UChar )0;\n  }\n}\n\n#ifdef USE_NAMED_GROUP\nstatic UChar*\nstrdup_with_null(OnigEncoding enc, UChar* s, UChar* end)\n{\n  ptrdiff_t slen;\n  int term_len, i;\n  UChar *r;\n\n  slen = end - s;\n  term_len = ONIGENC_MBC_MINLEN(enc);\n\n  r = (UChar* )xmalloc(slen + term_len);\n  CHECK_NULL_RETURN(r);\n  xmemcpy(r, s, slen);\n\n  for (i = 0; i < term_len; i++)\n    r[slen + i] = (UChar )0;\n\n  return r;\n}\n#endif\n\n/* scan pattern methods */\n#define PEND_VALUE   0\n\n#define PFETCH_READY  UChar* pfetch_prev\n#define PEND         (p < end ?  0 : 1)\n#define PUNFETCH     p = pfetch_prev\n#define PINC       do { \\\n  pfetch_prev = p; \\\n  p += ONIGENC_MBC_ENC_LEN(enc, p); \\\n} while (0)\n#define PFETCH(c)  do { \\\n  c = ONIGENC_MBC_TO_CODE(enc, p, end); \\\n  pfetch_prev = p; \\\n  p += ONIGENC_MBC_ENC_LEN(enc, p); \\\n} while (0)\n\n#define PPEEK        (p < end ? ONIGENC_MBC_TO_CODE(enc, p, end) : PEND_VALUE)\n#define PPEEK_IS(c)  (PPEEK == (OnigCodePoint )c)\n\nstatic UChar*\nstrcat_capa(UChar* dest, UChar* dest_end, const UChar* src, const UChar* src_end,\n\t      size_t capa)\n{\n  UChar* r;\n\n  if (dest)\n    r = (UChar* )xrealloc(dest, capa + 1);\n  else\n    r = (UChar* )xmalloc(capa + 1);\n\n  CHECK_NULL_RETURN(r);\n  onig_strcpy(r + (dest_end - dest), src, src_end);\n  return r;\n}\n\n/* dest on static area */\nstatic UChar*\nstrcat_capa_from_static(UChar* dest, UChar* dest_end,\n\t\t\tconst UChar* src, const UChar* src_end, size_t capa)\n{\n  UChar* r;\n\n  r = (UChar* )xmalloc(capa + 1);\n  CHECK_NULL_RETURN(r);\n  onig_strcpy(r, dest, dest_end);\n  onig_strcpy(r + (dest_end - dest), src, src_end);\n  return r;\n}\n\n\n#ifdef USE_ST_LIBRARY\n\ntypedef struct {\n  UChar* s;\n  UChar* end;\n} st_str_end_key;\n\nstatic int\nstr_end_cmp(st_str_end_key* x, st_str_end_key* y)\n{\n  UChar *p, *q;\n  int c;\n\n  if ((x->end - x->s) != (y->end - y->s))\n    return 1;\n\n  p = x->s;\n  q = y->s;\n  while (p < x->end) {\n    c = (int )*p - (int )*q;\n    if (c != 0) return c;\n\n    p++; q++;\n  }\n\n  return 0;\n}\n\nstatic int\nstr_end_hash(st_str_end_key* x)\n{\n  UChar *p;\n  int val = 0;\n\n  p = x->s;\n  while (p < x->end) {\n    val = val * 997 + (int )*p++;\n  }\n\n  return val + (val >> 5);\n}\n\nextern hash_table_type*\nonig_st_init_strend_table_with_size(int size)\n{\n  static struct st_hash_type hashType = {\n    str_end_cmp,\n    str_end_hash,\n  };\n\n  return (hash_table_type* )\n           onig_st_init_table_with_size(&hashType, size);\n}\n\nextern int\nonig_st_lookup_strend(hash_table_type* table, const UChar* str_key,\n\t\t      const UChar* end_key, hash_data_type *value)\n{\n  st_str_end_key key;\n\n  key.s   = (UChar* )str_key;\n  key.end = (UChar* )end_key;\n\n  return onig_st_lookup(table, (st_data_t )(&key), value);\n}\n\nextern int\nonig_st_insert_strend(hash_table_type* table, const UChar* str_key,\n\t\t      const UChar* end_key, hash_data_type value)\n{\n  st_str_end_key* key;\n  int result;\n\n  key = (st_str_end_key* )xmalloc(sizeof(st_str_end_key));\n  key->s   = (UChar* )str_key;\n  key->end = (UChar* )end_key;\n  result = onig_st_insert(table, (st_data_t )key, value);\n  if (result) {\n    xfree(key);\n  }\n  return result;\n}\n\n#endif /* USE_ST_LIBRARY */\n\n\n#ifdef USE_NAMED_GROUP\n\n#define INIT_NAME_BACKREFS_ALLOC_NUM   8\n\ntypedef struct {\n  UChar* name;\n  size_t name_len;   /* byte length */\n  int    back_num;   /* number of backrefs */\n  int    back_alloc;\n  int    back_ref1;\n  int*   back_refs;\n} NameEntry;\n\n#ifdef USE_ST_LIBRARY\n\ntypedef st_table  NameTable;\ntypedef st_data_t HashDataType;   /* 1.6 st.h doesn't define st_data_t type */\n\n#ifdef ONIG_DEBUG\nstatic int\ni_print_name_entry(UChar* key, NameEntry* e, void* arg)\n{\n  int i;\n  FILE* fp = (FILE* )arg;\n\n  fprintf(fp, \"%s: \", e->name);\n  if (e->back_num == 0)\n    fputs(\"-\", fp);\n  else if (e->back_num == 1)\n    fprintf(fp, \"%d\", e->back_ref1);\n  else {\n    for (i = 0; i < e->back_num; i++) {\n      if (i > 0) fprintf(fp, \", \");\n      fprintf(fp, \"%d\", e->back_refs[i]);\n    }\n  }\n  fputs(\"\\n\", fp);\n  return ST_CONTINUE;\n}\n\nextern int\nonig_print_names(FILE* fp, regex_t* reg)\n{\n  NameTable* t = (NameTable* )reg->name_table;\n\n  if (IS_NOT_NULL(t)) {\n    fprintf(fp, \"name table\\n\");\n    onig_st_foreach(t, i_print_name_entry, (HashDataType )fp);\n    fputs(\"\\n\", fp);\n  }\n  return 0;\n}\n#endif /* ONIG_DEBUG */\n\nstatic int\ni_free_name_entry(UChar* key, NameEntry* e, void* arg ARG_UNUSED)\n{\n  xfree(e->name);\n  if (IS_NOT_NULL(e->back_refs)) xfree(e->back_refs);\n  xfree(key);\n  xfree(e);\n  return ST_DELETE;\n}\n\nstatic int\nnames_clear(regex_t* reg)\n{\n  NameTable* t = (NameTable* )reg->name_table;\n\n  if (IS_NOT_NULL(t)) {\n    onig_st_foreach(t, i_free_name_entry, 0);\n  }\n  return 0;\n}\n\nextern int\nonig_names_free(regex_t* reg)\n{\n  int r;\n  NameTable* t;\n\n  r = names_clear(reg);\n  if (r) return r;\n\n  t = (NameTable* )reg->name_table;\n  if (IS_NOT_NULL(t)) onig_st_free_table(t);\n  reg->name_table = (void* )NULL;\n  return 0;\n}\n\nstatic NameEntry*\nname_find(regex_t* reg, const UChar* name, const UChar* name_end)\n{\n  NameEntry* e;\n  NameTable* t = (NameTable* )reg->name_table;\n\n  e = (NameEntry* )NULL;\n  if (IS_NOT_NULL(t)) {\n    onig_st_lookup_strend(t, name, name_end, (HashDataType* )((void* )(&e)));\n  }\n  return e;\n}\n\ntypedef struct {\n  int (*func)(const UChar*, const UChar*,int,int*,regex_t*,void*);\n  regex_t* reg;\n  void* arg;\n  int ret;\n  OnigEncoding enc;\n} INamesArg;\n\nstatic int\ni_names(UChar* key ARG_UNUSED, NameEntry* e, INamesArg* arg)\n{\n  int r = (*(arg->func))(e->name,\n                         e->name + e->name_len,\n                         e->back_num,\n\t\t\t (e->back_num > 1 ? e->back_refs : &(e->back_ref1)),\n\t\t\t arg->reg, arg->arg);\n  if (r != 0) {\n    arg->ret = r;\n    return ST_STOP;\n  }\n  return ST_CONTINUE;\n}\n\nextern int\nonig_foreach_name(regex_t* reg,\n  int (*func)(const UChar*, const UChar*,int,int*,regex_t*,void*), void* arg)\n{\n  INamesArg narg;\n  NameTable* t = (NameTable* )reg->name_table;\n\n  narg.ret = 0;\n  if (IS_NOT_NULL(t)) {\n    narg.func = func;\n    narg.reg  = reg;\n    narg.arg  = arg;\n    narg.enc  = reg->enc; /* should be pattern encoding. */\n    onig_st_foreach(t, i_names, (HashDataType )&narg);\n  }\n  return narg.ret;\n}\n\nstatic int\ni_renumber_name(UChar* key ARG_UNUSED, NameEntry* e, GroupNumRemap* map)\n{\n  int i;\n\n  if (e->back_num > 1) {\n    for (i = 0; i < e->back_num; i++) {\n      e->back_refs[i] = map[e->back_refs[i]].new_val;\n    }\n  }\n  else if (e->back_num == 1) {\n    e->back_ref1 = map[e->back_ref1].new_val;\n  }\n\n  return ST_CONTINUE;\n}\n\nextern int\nonig_renumber_name_table(regex_t* reg, GroupNumRemap* map)\n{\n  NameTable* t = (NameTable* )reg->name_table;\n\n  if (IS_NOT_NULL(t)) {\n    onig_st_foreach(t, i_renumber_name, (HashDataType )map);\n  }\n  return 0;\n}\n\n\nextern int\nonig_number_of_names(regex_t* reg)\n{\n  NameTable* t = (NameTable* )reg->name_table;\n\n  if (IS_NOT_NULL(t))\n    return t->num_entries;\n  else\n    return 0;\n}\n\n#else  /* USE_ST_LIBRARY */\n\n#define INIT_NAMES_ALLOC_NUM    8\n\ntypedef struct {\n  NameEntry* e;\n  int        num;\n  int        alloc;\n} NameTable;\n\n#ifdef ONIG_DEBUG\nextern int\nonig_print_names(FILE* fp, regex_t* reg)\n{\n  int i, j;\n  NameEntry* e;\n  NameTable* t = (NameTable* )reg->name_table;\n\n  if (IS_NOT_NULL(t) && t->num > 0) {\n    fprintf(fp, \"name table\\n\");\n    for (i = 0; i < t->num; i++) {\n      e = &(t->e[i]);\n      fprintf(fp, \"%s: \", e->name);\n      if (e->back_num == 0) {\n\tfputs(\"-\", fp);\n      }\n      else if (e->back_num == 1) {\n\tfprintf(fp, \"%d\", e->back_ref1);\n      }\n      else {\n\tfor (j = 0; j < e->back_num; j++) {\n\t  if (j > 0) fprintf(fp, \", \");\n\t  fprintf(fp, \"%d\", e->back_refs[j]);\n\t}\n      }\n      fputs(\"\\n\", fp);\n    }\n    fputs(\"\\n\", fp);\n  }\n  return 0;\n}\n#endif\n\nstatic int\nnames_clear(regex_t* reg)\n{\n  int i;\n  NameEntry* e;\n  NameTable* t = (NameTable* )reg->name_table;\n\n  if (IS_NOT_NULL(t)) {\n    for (i = 0; i < t->num; i++) {\n      e = &(t->e[i]);\n      if (IS_NOT_NULL(e->name)) {\n\txfree(e->name);\n\te->name       = NULL;\n\te->name_len   = 0;\n\te->back_num   = 0;\n\te->back_alloc = 0;\n\tif (IS_NOT_NULL(e->back_refs)) xfree(e->back_refs);\n\te->back_refs = (int* )NULL;\n      }\n    }\n    if (IS_NOT_NULL(t->e)) {\n      xfree(t->e);\n      t->e = NULL;\n    }\n    t->num = 0;\n  }\n  return 0;\n}\n\nextern int\nonig_names_free(regex_t* reg)\n{\n  int r;\n  NameTable* t;\n\n  r = names_clear(reg);\n  if (r) return r;\n\n  t = (NameTable* )reg->name_table;\n  if (IS_NOT_NULL(t)) xfree(t);\n  reg->name_table = NULL;\n  return 0;\n}\n\nstatic NameEntry*\nname_find(regex_t* reg, const UChar* name, const UChar* name_end)\n{\n  int i, len;\n  NameEntry* e;\n  NameTable* t = (NameTable* )reg->name_table;\n\n  if (IS_NOT_NULL(t)) {\n    len = name_end - name;\n    for (i = 0; i < t->num; i++) {\n      e = &(t->e[i]);\n      if (len == e->name_len && onig_strncmp(name, e->name, len) == 0)\n\treturn e;\n    }\n  }\n  return (NameEntry* )NULL;\n}\n\nextern int\nonig_foreach_name(regex_t* reg,\n  int (*func)(const UChar*, const UChar*,int,int*,regex_t*,void*), void* arg)\n{\n  int i, r;\n  NameEntry* e;\n  NameTable* t = (NameTable* )reg->name_table;\n\n  if (IS_NOT_NULL(t)) {\n    for (i = 0; i < t->num; i++) {\n      e = &(t->e[i]);\n      r = (*func)(e->name, e->name + e->name_len, e->back_num,\n\t\t  (e->back_num > 1 ? e->back_refs : &(e->back_ref1)),\n\t\t  reg, arg);\n      if (r != 0) return r;\n    }\n  }\n  return 0;\n}\n\nextern int\nonig_number_of_names(regex_t* reg)\n{\n  NameTable* t = (NameTable* )reg->name_table;\n\n  if (IS_NOT_NULL(t))\n    return t->num;\n  else\n    return 0;\n}\n\n#endif /* else USE_ST_LIBRARY */\n\nstatic int\nname_add(regex_t* reg, UChar* name, UChar* name_end, int backref, ScanEnv* env)\n{\n  int alloc;\n  NameEntry* e;\n  NameTable* t = (NameTable* )reg->name_table;\n\n  if (name_end - name <= 0)\n    return ONIGERR_EMPTY_GROUP_NAME;\n\n  e = name_find(reg, name, name_end);\n  if (IS_NULL(e)) {\n#ifdef USE_ST_LIBRARY\n    if (IS_NULL(t)) {\n      t = onig_st_init_strend_table_with_size(5);\n      reg->name_table = (void* )t;\n    }\n    e = (NameEntry* )xmalloc(sizeof(NameEntry));\n    CHECK_NULL_RETURN_MEMERR(e);\n\n    e->name = strdup_with_null(reg->enc, name, name_end);\n    if (IS_NULL(e->name)) {\n      xfree(e);  return ONIGERR_MEMORY;\n    }\n    onig_st_insert_strend(t, e->name, (e->name + (name_end - name)),\n                          (HashDataType )e);\n\n    e->name_len   = name_end - name;\n    e->back_num   = 0;\n    e->back_alloc = 0;\n    e->back_refs  = (int* )NULL;\n\n#else\n\n    if (IS_NULL(t)) {\n      alloc = INIT_NAMES_ALLOC_NUM;\n      t = (NameTable* )xmalloc(sizeof(NameTable));\n      CHECK_NULL_RETURN_MEMERR(t);\n      t->e     = NULL;\n      t->alloc = 0;\n      t->num   = 0;\n\n      t->e = (NameEntry* )xmalloc(sizeof(NameEntry) * alloc);\n      if (IS_NULL(t->e)) {\n\txfree(t);\n\treturn ONIGERR_MEMORY;\n      }\n      t->alloc = alloc;\n      reg->name_table = t;\n      goto clear;\n    }\n    else if (t->num == t->alloc) {\n      int i;\n      NameEntry* p;\n\n      alloc = t->alloc * 2;\n      p = (NameEntry* )xrealloc(t->e, sizeof(NameEntry) * alloc);\n      CHECK_NULL_RETURN_MEMERR(p);\n      t->e = p;\n      t->alloc = alloc;\n\n    clear:\n      for (i = t->num; i < t->alloc; i++) {\n\tt->e[i].name       = NULL;\n\tt->e[i].name_len   = 0;\n\tt->e[i].back_num   = 0;\n\tt->e[i].back_alloc = 0;\n\tt->e[i].back_refs  = (int* )NULL;\n      }\n    }\n    e = &(t->e[t->num]);\n    t->num++;\n    e->name = strdup_with_null(reg->enc, name, name_end);\n    if (IS_NULL(e->name)) return ONIGERR_MEMORY;\n    e->name_len = name_end - name;\n#endif\n  }\n\n  if (e->back_num >= 1 &&\n      ! IS_SYNTAX_BV(env->syntax, ONIG_SYN_ALLOW_MULTIPLEX_DEFINITION_NAME)) {\n    onig_scan_env_set_error_string(env, ONIGERR_MULTIPLEX_DEFINED_NAME,\n\t\t\t\t    name, name_end);\n    return ONIGERR_MULTIPLEX_DEFINED_NAME;\n  }\n\n  e->back_num++;\n  if (e->back_num == 1) {\n    e->back_ref1 = backref;\n  }\n  else {\n    if (e->back_num == 2) {\n      alloc = INIT_NAME_BACKREFS_ALLOC_NUM;\n      e->back_refs = (int* )xmalloc(sizeof(int) * alloc);\n      CHECK_NULL_RETURN_MEMERR(e->back_refs);\n      e->back_alloc = alloc;\n      e->back_refs[0] = e->back_ref1;\n      e->back_refs[1] = backref;\n    }\n    else {\n      if (e->back_num > e->back_alloc) {\n\tint* p;\n\talloc = e->back_alloc * 2;\n\tp = (int* )xrealloc(e->back_refs, sizeof(int) * alloc);\n\tCHECK_NULL_RETURN_MEMERR(p);\n\te->back_refs = p;\n\te->back_alloc = alloc;\n      }\n      e->back_refs[e->back_num - 1] = backref;\n    }\n  }\n\n  return 0;\n}\n\nextern int\nonig_name_to_group_numbers(regex_t* reg, const UChar* name,\n\t\t\t   const UChar* name_end, int** nums)\n{\n  NameEntry* e = name_find(reg, name, name_end);\n\n  if (IS_NULL(e)) return ONIGERR_UNDEFINED_NAME_REFERENCE;\n\n  switch (e->back_num) {\n  case 0:\n    *nums = 0;\n    break;\n  case 1:\n    *nums = &(e->back_ref1);\n    break;\n  default:\n    *nums = e->back_refs;\n    break;\n  }\n  return e->back_num;\n}\n\nextern int\nonig_name_to_backref_number(regex_t* reg, const UChar* name,\n\t\t\t    const UChar* name_end, OnigRegion *region)\n{\n  int i, n, *nums;\n\n  n = onig_name_to_group_numbers(reg, name, name_end, &nums);\n  if (n < 0)\n    return n;\n  else if (n == 0)\n    return ONIGERR_PARSER_BUG;\n  else if (n == 1)\n    return nums[0];\n  else {\n    if (IS_NOT_NULL(region)) {\n      for (i = n - 1; i >= 0; i--) {\n\tif (region->beg[nums[i]] != ONIG_REGION_NOTPOS)\n\t  return nums[i];\n      }\n    }\n    return nums[n - 1];\n  }\n}\n\n#else /* USE_NAMED_GROUP */\n\nextern int\nonig_name_to_group_numbers(regex_t* reg, const UChar* name,\n\t\t\t   const UChar* name_end, int** nums)\n{\n  return ONIG_NO_SUPPORT_CONFIG;\n}\n\nextern int\nonig_name_to_backref_number(regex_t* reg, const UChar* name,\n\t\t\t    const UChar* name_end, OnigRegion* region)\n{\n  return ONIG_NO_SUPPORT_CONFIG;\n}\n\nextern int\nonig_foreach_name(regex_t* reg,\n  int (*func)(const UChar*, const UChar*,int,int*,regex_t*,void*), void* arg)\n{\n  return ONIG_NO_SUPPORT_CONFIG;\n}\n\nextern int\nonig_number_of_names(regex_t* reg)\n{\n  return 0;\n}\n#endif /* else USE_NAMED_GROUP */\n\nextern int\nonig_noname_group_capture_is_active(regex_t* reg)\n{\n  if (ONIG_IS_OPTION_ON(reg->options, ONIG_OPTION_DONT_CAPTURE_GROUP))\n    return 0;\n\n#ifdef USE_NAMED_GROUP\n  if (onig_number_of_names(reg) > 0 &&\n      IS_SYNTAX_BV(reg->syntax, ONIG_SYN_CAPTURE_ONLY_NAMED_GROUP) &&\n      !ONIG_IS_OPTION_ON(reg->options, ONIG_OPTION_CAPTURE_GROUP)) {\n    return 0;\n  }\n#endif\n\n  return 1;\n}\n\n\n#define INIT_SCANENV_MEMNODES_ALLOC_SIZE   16\n\nstatic void\nscan_env_clear(ScanEnv* env)\n{\n  int i;\n\n  BIT_STATUS_CLEAR(env->capture_history);\n  BIT_STATUS_CLEAR(env->bt_mem_start);\n  BIT_STATUS_CLEAR(env->bt_mem_end);\n  BIT_STATUS_CLEAR(env->backrefed_mem);\n  env->error      = (UChar* )NULL;\n  env->error_end  = (UChar* )NULL;\n  env->num_call   = 0;\n  env->num_mem    = 0;\n#ifdef USE_NAMED_GROUP\n  env->num_named  = 0;\n#endif\n  env->mem_alloc         = 0;\n  env->mem_nodes_dynamic = (Node** )NULL;\n\n  for (i = 0; i < SCANENV_MEMNODES_SIZE; i++)\n    env->mem_nodes_static[i] = NULL_NODE;\n\n#ifdef USE_COMBINATION_EXPLOSION_CHECK\n  env->num_comb_exp_check  = 0;\n  env->comb_exp_max_regnum = 0;\n  env->curr_max_regnum     = 0;\n  env->has_recursion       = 0;\n#endif\n}\n\nstatic int\nscan_env_add_mem_entry(ScanEnv* env)\n{\n  int i, need, alloc;\n  Node** p;\n\n  need = env->num_mem + 1;\n  if (need >= SCANENV_MEMNODES_SIZE) {\n    if (env->mem_alloc <= need) {\n      if (IS_NULL(env->mem_nodes_dynamic)) {\n\talloc = INIT_SCANENV_MEMNODES_ALLOC_SIZE;\n\tp = (Node** )xmalloc(sizeof(Node*) * alloc);\n\txmemcpy(p, env->mem_nodes_static,\n\t\tsizeof(Node*) * SCANENV_MEMNODES_SIZE);\n      }\n      else {\n\talloc = env->mem_alloc * 2;\n\tp = (Node** )xrealloc(env->mem_nodes_dynamic, sizeof(Node*) * alloc);\n      }\n      CHECK_NULL_RETURN_MEMERR(p);\n\n      for (i = env->num_mem + 1; i < alloc; i++)\n\tp[i] = NULL_NODE;\n\n      env->mem_nodes_dynamic = p;\n      env->mem_alloc = alloc;\n    }\n  }\n\n  env->num_mem++;\n  return env->num_mem;\n}\n\nstatic int\nscan_env_set_mem_node(ScanEnv* env, int num, Node* node)\n{\n  if (env->num_mem >= num)\n    SCANENV_MEM_NODES(env)[num] = node;\n  else\n    return ONIGERR_PARSER_BUG;\n  return 0;\n}\n\n\n#ifdef USE_PARSE_TREE_NODE_RECYCLE\ntypedef struct _FreeNode {\n  struct _FreeNode* next;\n} FreeNode;\n\nstatic FreeNode* FreeNodeList = (FreeNode* )NULL;\n#endif\n\nextern void\nonig_node_free(Node* node)\n{\n start:\n  if (IS_NULL(node)) return ;\n\n  switch (NTYPE(node)) {\n  case NT_STR:\n    if (NSTR(node)->capa != 0 &&\n\tIS_NOT_NULL(NSTR(node)->s) && NSTR(node)->s != NSTR(node)->buf) {\n      xfree(NSTR(node)->s);\n    }\n    break;\n\n  case NT_LIST:\n  case NT_ALT:\n    onig_node_free(NCAR(node));\n    {\n      Node* next_node = NCDR(node);\n\n#ifdef USE_PARSE_TREE_NODE_RECYCLE\n      {\n\tFreeNode* n = (FreeNode* )node;\n\n        THREAD_ATOMIC_START;\n\tn->next = FreeNodeList;\n\tFreeNodeList = n;\n        THREAD_ATOMIC_END;\n      }\n#else\n      xfree(node);\n#endif\n      node = next_node;\n      goto start;\n    }\n    break;\n\n  case NT_CCLASS:\n    {\n      CClassNode* cc = NCCLASS(node);\n\n      if (IS_NCCLASS_SHARE(cc)) return ;\n      if (cc->mbuf)\n        bbuf_free(cc->mbuf);\n    }\n    break;\n\n  case NT_QTFR:\n    if (NQTFR(node)->target)\n      onig_node_free(NQTFR(node)->target);\n    break;\n\n  case NT_ENCLOSE:\n    if (NENCLOSE(node)->target)\n      onig_node_free(NENCLOSE(node)->target);\n    break;\n\n  case NT_BREF:\n    if (IS_NOT_NULL(NBREF(node)->back_dynamic))\n      xfree(NBREF(node)->back_dynamic);\n    break;\n\n  case NT_ANCHOR:\n    if (NANCHOR(node)->target)\n      onig_node_free(NANCHOR(node)->target);\n    break;\n  }\n\n#ifdef USE_PARSE_TREE_NODE_RECYCLE\n  {\n    FreeNode* n = (FreeNode* )node;\n\n    THREAD_ATOMIC_START;\n    n->next = FreeNodeList;\n    FreeNodeList = n;\n    THREAD_ATOMIC_END;\n  }\n#else\n  xfree(node);\n#endif\n}\n\n#ifdef USE_PARSE_TREE_NODE_RECYCLE\nextern int\nonig_free_node_list(void)\n{\n  FreeNode* n;\n\n  /* THREAD_ATOMIC_START; */\n  while (IS_NOT_NULL(FreeNodeList)) {\n    n = FreeNodeList;\n    FreeNodeList = FreeNodeList->next;\n    xfree(n);\n  }\n  /* THREAD_ATOMIC_END; */\n  return 0;\n}\n#endif\n\nstatic Node*\nnode_new(void)\n{\n  Node* node;\n\n#ifdef USE_PARSE_TREE_NODE_RECYCLE\n  THREAD_ATOMIC_START;\n  if (IS_NOT_NULL(FreeNodeList)) {\n    node = (Node* )FreeNodeList;\n    FreeNodeList = FreeNodeList->next;\n    THREAD_ATOMIC_END;\n    return node;\n  }\n  THREAD_ATOMIC_END;\n#endif\n\n  node = (Node* )xmalloc(sizeof(Node));\n  /* xmemset(node, 0, sizeof(Node)); */\n  return node;\n}\n\n\nstatic void\ninitialize_cclass(CClassNode* cc)\n{\n  BITSET_CLEAR(cc->bs);\n  /* cc->base.flags = 0; */\n  cc->flags = 0;\n  cc->mbuf  = NULL;\n}\n\nstatic Node*\nnode_new_cclass(void)\n{\n  Node* node = node_new();\n  CHECK_NULL_RETURN(node);\n\n  SET_NTYPE(node, NT_CCLASS);\n  initialize_cclass(NCCLASS(node));\n  return node;\n}\n\nstatic Node*\nnode_new_cclass_by_codepoint_range(int not, OnigCodePoint sb_out,\n\t\t\t\t   const OnigCodePoint ranges[])\n{\n  int n, i;\n  CClassNode* cc;\n  OnigCodePoint j;\n\n  Node* node = node_new_cclass();\n  CHECK_NULL_RETURN(node);\n\n  cc = NCCLASS(node);\n  if (not != 0) NCCLASS_SET_NOT(cc);\n\n  BITSET_CLEAR(cc->bs);\n  if (sb_out > 0 && IS_NOT_NULL(ranges)) {\n    n = ONIGENC_CODE_RANGE_NUM(ranges);\n    for (i = 0; i < n; i++) {\n      for (j  = ONIGENC_CODE_RANGE_FROM(ranges, i);\n           j <= (OnigCodePoint )ONIGENC_CODE_RANGE_TO(ranges, i); j++) {\n\tif (j >= sb_out) goto sb_end;\n\n        BITSET_SET_BIT(cc->bs, j);\n      }\n    }\n  }\n\n sb_end:\n  if (IS_NULL(ranges)) {\n  is_null:\n    cc->mbuf = NULL;\n  }\n  else {\n    BBuf* bbuf;\n\n    n = ONIGENC_CODE_RANGE_NUM(ranges);\n    if (n == 0) goto is_null;\n\n    bbuf = (BBuf* )xmalloc(sizeof(BBuf));\n    CHECK_NULL_RETURN(bbuf);\n    bbuf->alloc = n + 1;\n    bbuf->used  = n + 1;\n    bbuf->p     = (UChar* )((void* )ranges);\n\n    cc->mbuf = bbuf;\n  }\n\n  return node;\n}\n\nstatic Node*\nnode_new_ctype(int type, int not, int ascii_range)\n{\n  Node* node = node_new();\n  CHECK_NULL_RETURN(node);\n\n  SET_NTYPE(node, NT_CTYPE);\n  NCTYPE(node)->ctype = type;\n  NCTYPE(node)->not   = not;\n  NCTYPE(node)->ascii_range = ascii_range;\n  return node;\n}\n\nstatic Node*\nnode_new_anychar(void)\n{\n  Node* node = node_new();\n  CHECK_NULL_RETURN(node);\n\n  SET_NTYPE(node, NT_CANY);\n  return node;\n}\n\nstatic Node*\nnode_new_list(Node* left, Node* right)\n{\n  Node* node = node_new();\n  CHECK_NULL_RETURN(node);\n\n  SET_NTYPE(node, NT_LIST);\n  NCAR(node)  = left;\n  NCDR(node) = right;\n  return node;\n}\n\nextern Node*\nonig_node_new_list(Node* left, Node* right)\n{\n  return node_new_list(left, right);\n}\n\nextern Node*\nonig_node_list_add(Node* list, Node* x)\n{\n  Node *n;\n\n  n = onig_node_new_list(x, NULL);\n  if (IS_NULL(n)) return NULL_NODE;\n\n  if (IS_NOT_NULL(list)) {\n    while (IS_NOT_NULL(NCDR(list)))\n      list = NCDR(list);\n\n    NCDR(list) = n;\n  }\n\n  return n;\n}\n\nextern Node*\nonig_node_new_alt(Node* left, Node* right)\n{\n  Node* node = node_new();\n  CHECK_NULL_RETURN(node);\n\n  SET_NTYPE(node, NT_ALT);\n  NCAR(node)  = left;\n  NCDR(node) = right;\n  return node;\n}\n\nextern Node*\nonig_node_new_anchor(int type)\n{\n  Node* node = node_new();\n  CHECK_NULL_RETURN(node);\n\n  SET_NTYPE(node, NT_ANCHOR);\n  NANCHOR(node)->type     = type;\n  NANCHOR(node)->target   = NULL;\n  NANCHOR(node)->char_len = -1;\n  NANCHOR(node)->ascii_range = 0;\n  return node;\n}\n\nstatic Node*\nnode_new_backref(int back_num, int* backrefs, int by_name,\n#ifdef USE_BACKREF_WITH_LEVEL\n\t\t int exist_level, int nest_level,\n#endif\n\t\t ScanEnv* env)\n{\n  int i;\n  Node* node = node_new();\n\n  CHECK_NULL_RETURN(node);\n\n  SET_NTYPE(node, NT_BREF);\n  NBREF(node)->state    = 0;\n  NBREF(node)->back_num = back_num;\n  NBREF(node)->back_dynamic = (int* )NULL;\n  if (by_name != 0)\n    NBREF(node)->state |= NST_NAME_REF;\n\n#ifdef USE_BACKREF_WITH_LEVEL\n  if (exist_level != 0) {\n    NBREF(node)->state |= NST_NEST_LEVEL;\n    NBREF(node)->nest_level  = nest_level;\n  }\n#endif\n\n  for (i = 0; i < back_num; i++) {\n    if (backrefs[i] <= env->num_mem &&\n\tIS_NULL(SCANENV_MEM_NODES(env)[backrefs[i]])) {\n      NBREF(node)->state |= NST_RECURSION;   /* /...(\\1).../ */\n      break;\n    }\n  }\n\n  if (back_num <= NODE_BACKREFS_SIZE) {\n    for (i = 0; i < back_num; i++)\n      NBREF(node)->back_static[i] = backrefs[i];\n  }\n  else {\n    int* p = (int* )xmalloc(sizeof(int) * back_num);\n    if (IS_NULL(p)) {\n      onig_node_free(node);\n      return NULL;\n    }\n    NBREF(node)->back_dynamic = p;\n    for (i = 0; i < back_num; i++)\n      p[i] = backrefs[i];\n  }\n  return node;\n}\n\n#ifdef USE_SUBEXP_CALL\nstatic Node*\nnode_new_call(UChar* name, UChar* name_end, int gnum)\n{\n  Node* node = node_new();\n  CHECK_NULL_RETURN(node);\n\n  SET_NTYPE(node, NT_CALL);\n  NCALL(node)->state     = 0;\n  NCALL(node)->target    = NULL_NODE;\n  NCALL(node)->name      = name;\n  NCALL(node)->name_end  = name_end;\n  NCALL(node)->group_num = gnum;  /* call by number if gnum != 0 */\n  return node;\n}\n#endif\n\nstatic Node*\nnode_new_quantifier(int lower, int upper, int by_number)\n{\n  Node* node = node_new();\n  CHECK_NULL_RETURN(node);\n\n  SET_NTYPE(node, NT_QTFR);\n  NQTFR(node)->state  = 0;\n  NQTFR(node)->target = NULL;\n  NQTFR(node)->lower  = lower;\n  NQTFR(node)->upper  = upper;\n  NQTFR(node)->greedy = 1;\n  NQTFR(node)->target_empty_info = NQ_TARGET_ISNOT_EMPTY;\n  NQTFR(node)->head_exact        = NULL_NODE;\n  NQTFR(node)->next_head_exact   = NULL_NODE;\n  NQTFR(node)->is_refered        = 0;\n  if (by_number != 0)\n    NQTFR(node)->state |= NST_BY_NUMBER;\n\n#ifdef USE_COMBINATION_EXPLOSION_CHECK\n  NQTFR(node)->comb_exp_check_num = 0;\n#endif\n\n  return node;\n}\n\nstatic Node*\nnode_new_enclose(int type)\n{\n  Node* node = node_new();\n  CHECK_NULL_RETURN(node);\n\n  SET_NTYPE(node, NT_ENCLOSE);\n  NENCLOSE(node)->type      = type;\n  NENCLOSE(node)->state     =  0;\n  NENCLOSE(node)->regnum    =  0;\n  NENCLOSE(node)->option    =  0;\n  NENCLOSE(node)->target    = NULL;\n  NENCLOSE(node)->call_addr = -1;\n  NENCLOSE(node)->opt_count =  0;\n  return node;\n}\n\nextern Node*\nonig_node_new_enclose(int type)\n{\n  return node_new_enclose(type);\n}\n\nstatic Node*\nnode_new_enclose_memory(OnigOptionType option, int is_named)\n{\n  Node* node = node_new_enclose(ENCLOSE_MEMORY);\n  CHECK_NULL_RETURN(node);\n  if (is_named != 0)\n    SET_ENCLOSE_STATUS(node, NST_NAMED_GROUP);\n\n#ifdef USE_SUBEXP_CALL\n  NENCLOSE(node)->option = option;\n#endif\n  return node;\n}\n\nstatic Node*\nnode_new_option(OnigOptionType option)\n{\n  Node* node = node_new_enclose(ENCLOSE_OPTION);\n  CHECK_NULL_RETURN(node);\n  NENCLOSE(node)->option = option;\n  return node;\n}\n\nextern int\nonig_node_str_cat(Node* node, const UChar* s, const UChar* end)\n{\n  ptrdiff_t addlen = end - s;\n\n  if (addlen > 0) {\n    ptrdiff_t len  = NSTR(node)->end - NSTR(node)->s;\n\n    if (NSTR(node)->capa > 0 || (len + addlen > NODE_STR_BUF_SIZE - 1)) {\n      UChar* p;\n      ptrdiff_t capa = len + addlen + NODE_STR_MARGIN;\n\n      if (capa <= NSTR(node)->capa) {\n\tonig_strcpy(NSTR(node)->s + len, s, end);\n      }\n      else {\n\tif (NSTR(node)->s == NSTR(node)->buf)\n\t  p = strcat_capa_from_static(NSTR(node)->s, NSTR(node)->end,\n\t\t\t\t      s, end, capa);\n\telse\n\t  p = strcat_capa(NSTR(node)->s, NSTR(node)->end, s, end, capa);\n\n\tCHECK_NULL_RETURN_MEMERR(p);\n\tNSTR(node)->s    = p;\n\tNSTR(node)->capa = (int )capa;\n      }\n    }\n    else {\n      onig_strcpy(NSTR(node)->s + len, s, end);\n    }\n    NSTR(node)->end = NSTR(node)->s + len + addlen;\n  }\n\n  return 0;\n}\n\nextern int\nonig_node_str_set(Node* node, const UChar* s, const UChar* end)\n{\n  onig_node_str_clear(node);\n  return onig_node_str_cat(node, s, end);\n}\n\nstatic int\nnode_str_cat_char(Node* node, UChar c)\n{\n  UChar s[1];\n\n  s[0] = c;\n  return onig_node_str_cat(node, s, s + 1);\n}\n\nstatic int\nnode_str_cat_codepoint(Node* node, OnigEncoding enc, OnigCodePoint c)\n{\n  UChar buf[ONIGENC_CODE_TO_MBC_MAXLEN];\n  int num = ONIGENC_CODE_TO_MBC(enc, c, buf);\n  if (num < 0) return num;\n  return onig_node_str_cat(node, buf, buf + num);\n}\n\nextern void\nonig_node_conv_to_str_node(Node* node, int flag)\n{\n  SET_NTYPE(node, NT_STR);\n  NSTR(node)->flag = flag;\n  NSTR(node)->capa = 0;\n  NSTR(node)->s    = NSTR(node)->buf;\n  NSTR(node)->end  = NSTR(node)->buf;\n}\n\nextern void\nonig_node_str_clear(Node* node)\n{\n  if (NSTR(node)->capa != 0 &&\n      IS_NOT_NULL(NSTR(node)->s) && NSTR(node)->s != NSTR(node)->buf) {\n    xfree(NSTR(node)->s);\n  }\n\n  NSTR(node)->capa = 0;\n  NSTR(node)->flag = 0;\n  NSTR(node)->s    = NSTR(node)->buf;\n  NSTR(node)->end  = NSTR(node)->buf;\n}\n\nstatic Node*\nnode_new_str(const UChar* s, const UChar* end)\n{\n  Node* node = node_new();\n  CHECK_NULL_RETURN(node);\n\n  SET_NTYPE(node, NT_STR);\n  NSTR(node)->capa = 0;\n  NSTR(node)->flag = 0;\n  NSTR(node)->s    = NSTR(node)->buf;\n  NSTR(node)->end  = NSTR(node)->buf;\n  if (onig_node_str_cat(node, s, end)) {\n    onig_node_free(node);\n    return NULL;\n  }\n  return node;\n}\n\nextern Node*\nonig_node_new_str(const UChar* s, const UChar* end)\n{\n  return node_new_str(s, end);\n}\n\nstatic Node*\nnode_new_str_raw(UChar* s, UChar* end)\n{\n  Node* node = node_new_str(s, end);\n  if (IS_NOT_NULL(node))\n    NSTRING_SET_RAW(node);\n  return node;\n}\n\nstatic Node*\nnode_new_empty(void)\n{\n  return node_new_str(NULL, NULL);\n}\n\nstatic Node*\nnode_new_str_raw_char(UChar c)\n{\n  UChar p[1];\n\n  p[0] = c;\n  return node_new_str_raw(p, p + 1);\n}\n\nstatic Node*\nstr_node_split_last_char(StrNode* sn, OnigEncoding enc)\n{\n  const UChar *p;\n  Node* n = NULL_NODE;\n\n  if (sn->end > sn->s) {\n    p = onigenc_get_prev_char_head(enc, sn->s, sn->end);\n    if (p && p > sn->s) { /* can be split. */\n      n = node_new_str(p, sn->end);\n      if (IS_NOT_NULL(n) && (sn->flag & NSTR_RAW) != 0)\n\tNSTRING_SET_RAW(n);\n      sn->end = (UChar* )p;\n    }\n  }\n  return n;\n}\n\nstatic int\nstr_node_can_be_split(StrNode* sn, OnigEncoding enc)\n{\n  if (sn->end > sn->s) {\n    return ((enclen(enc, sn->s) < sn->end - sn->s)  ?  1 : 0);\n  }\n  return 0;\n}\n\n#ifdef USE_PAD_TO_SHORT_BYTE_CHAR\nstatic int\nnode_str_head_pad(StrNode* sn, int num, UChar val)\n{\n  UChar buf[NODE_STR_BUF_SIZE];\n  int i, len;\n\n  len = sn->end - sn->s;\n  onig_strcpy(buf, sn->s, sn->end);\n  onig_strcpy(&(sn->s[num]), buf, buf + len);\n  sn->end += num;\n\n  for (i = 0; i < num; i++) {\n    sn->s[i] = val;\n  }\n}\n#endif\n\nextern int\nonig_scan_unsigned_number(UChar** src, const UChar* end, OnigEncoding enc)\n{\n  unsigned int num, val;\n  OnigCodePoint c;\n  UChar* p = *src;\n  PFETCH_READY;\n\n  num = 0;\n  while (!PEND) {\n    PFETCH(c);\n    if (ONIGENC_IS_CODE_DIGIT(enc, c)) {\n      val = (unsigned int )DIGITVAL(c);\n      if ((INT_MAX_LIMIT - val) / 10UL < num)\n\treturn -1;  /* overflow */\n\n      num = num * 10 + val;\n    }\n    else {\n      PUNFETCH;\n      break;\n    }\n  }\n  *src = p;\n  return num;\n}\n\nstatic int\nscan_unsigned_hexadecimal_number(UChar** src, UChar* end, int minlen,\n\t\t\t\t int maxlen, OnigEncoding enc)\n{\n  OnigCodePoint c;\n  unsigned int num, val;\n  int restlen;\n  UChar* p = *src;\n  PFETCH_READY;\n\n  restlen = maxlen - minlen;\n  num = 0;\n  while (!PEND && maxlen-- != 0) {\n    PFETCH(c);\n    if (ONIGENC_IS_CODE_XDIGIT(enc, c)) {\n      val = (unsigned int )XDIGITVAL(enc,c);\n      if ((INT_MAX_LIMIT - val) / 16UL < num)\n\treturn -1;  /* overflow */\n\n      num = (num << 4) + XDIGITVAL(enc,c);\n    }\n    else {\n      PUNFETCH;\n      break;\n    }\n  }\n  if (maxlen > restlen)\n    return -2;  /* not enough digits */\n  *src = p;\n  return num;\n}\n\nstatic int\nscan_unsigned_octal_number(UChar** src, UChar* end, int maxlen,\n\t\t\t   OnigEncoding enc)\n{\n  OnigCodePoint c;\n  unsigned int num, val;\n  UChar* p = *src;\n  PFETCH_READY;\n\n  num = 0;\n  while (!PEND && maxlen-- != 0) {\n    PFETCH(c);\n    if (ONIGENC_IS_CODE_DIGIT(enc, c) && c < '8') {\n      val = ODIGITVAL(c);\n      if ((INT_MAX_LIMIT - val) / 8UL < num)\n\treturn -1;  /* overflow */\n\n      num = (num << 3) + val;\n    }\n    else {\n      PUNFETCH;\n      break;\n    }\n  }\n  *src = p;\n  return num;\n}\n\n\n#define BBUF_WRITE_CODE_POINT(bbuf,pos,code) \\\n    BBUF_WRITE(bbuf, pos, &(code), SIZE_CODE_POINT)\n\n/* data format:\n     [n][from-1][to-1][from-2][to-2] ... [from-n][to-n]\n     (all data size is OnigCodePoint)\n */\nstatic int\nnew_code_range(BBuf** pbuf)\n{\n#define INIT_MULTI_BYTE_RANGE_SIZE  (SIZE_CODE_POINT * 5)\n  int r;\n  OnigCodePoint n;\n  BBuf* bbuf;\n\n  bbuf = *pbuf = (BBuf* )xmalloc(sizeof(BBuf));\n  CHECK_NULL_RETURN_MEMERR(*pbuf);\n  r = BBUF_INIT(*pbuf, INIT_MULTI_BYTE_RANGE_SIZE);\n  if (r) return r;\n\n  n = 0;\n  BBUF_WRITE_CODE_POINT(bbuf, 0, n);\n  return 0;\n}\n\nstatic int\nadd_code_range_to_buf(BBuf** pbuf, OnigCodePoint from, OnigCodePoint to)\n{\n  int r, inc_n, pos;\n  OnigCodePoint low, high, bound, x;\n  OnigCodePoint n, *data;\n  BBuf* bbuf;\n\n  if (from > to) {\n    n = from; from = to; to = n;\n  }\n\n  if (IS_NULL(*pbuf)) {\n    r = new_code_range(pbuf);\n    if (r) return r;\n    bbuf = *pbuf;\n    n = 0;\n  }\n  else {\n    bbuf = *pbuf;\n    GET_CODE_POINT(n, bbuf->p);\n  }\n  data = (OnigCodePoint* )(bbuf->p);\n  data++;\n\n  bound = (from == 0) ? 0 : n;\n  for (low = 0; low < bound; ) {\n    x = (low + bound) >> 1;\n    if (from - 1 > data[x*2 + 1])\n      low = x + 1;\n    else\n      bound = x;\n  }\n\n  high = (to == ONIG_LAST_CODE_POINT) ? n : low;\n  for (bound = n; high < bound; ) {\n    x = (high + bound) >> 1;\n    if (to + 1 >= data[x*2])\n      high = x + 1;\n    else\n      bound = x;\n  }\n\n  inc_n = low + 1 - high;\n  if (n + inc_n > ONIG_MAX_MULTI_BYTE_RANGES_NUM)\n    return ONIGERR_TOO_MANY_MULTI_BYTE_RANGES;\n\n  if (inc_n != 1) {\n    if (from > data[low*2])\n      from = data[low*2];\n    if (to < data[(high - 1)*2 + 1])\n      to = data[(high - 1)*2 + 1];\n  }\n\n  if (inc_n != 0) {\n    int from_pos = SIZE_CODE_POINT * (1 + high * 2);\n    int to_pos   = SIZE_CODE_POINT * (1 + (low + 1) * 2);\n\n    if (inc_n > 0) {\n      if (high < n) {\n\tint size = (n - high) * 2 * SIZE_CODE_POINT;\n\tBBUF_MOVE_RIGHT(bbuf, from_pos, to_pos, size);\n      }\n    }\n    else {\n      BBUF_MOVE_LEFT_REDUCE(bbuf, from_pos, to_pos);\n    }\n  }\n\n  pos = SIZE_CODE_POINT * (1 + low * 2);\n  BBUF_ENSURE_SIZE(bbuf, pos + SIZE_CODE_POINT * 2);\n  BBUF_WRITE_CODE_POINT(bbuf, pos, from);\n  BBUF_WRITE_CODE_POINT(bbuf, pos + SIZE_CODE_POINT, to);\n  n += inc_n;\n  BBUF_WRITE_CODE_POINT(bbuf, 0, n);\n\n  return 0;\n}\n\nstatic int\nadd_code_range(BBuf** pbuf, ScanEnv* env, OnigCodePoint from, OnigCodePoint to)\n{\n  if (from > to) {\n    if (IS_SYNTAX_BV(env->syntax, ONIG_SYN_ALLOW_EMPTY_RANGE_IN_CC))\n      return 0;\n    else\n      return ONIGERR_EMPTY_RANGE_IN_CHAR_CLASS;\n  }\n\n  return add_code_range_to_buf(pbuf, from, to);\n}\n\nstatic int\nnot_code_range_buf(OnigEncoding enc, BBuf* bbuf, BBuf** pbuf)\n{\n  int r, i, n;\n  OnigCodePoint pre, from, *data, to = 0;\n\n  *pbuf = (BBuf* )NULL;\n  if (IS_NULL(bbuf)) {\n  set_all:\n    return SET_ALL_MULTI_BYTE_RANGE(enc, pbuf);\n  }\n\n  data = (OnigCodePoint* )(bbuf->p);\n  GET_CODE_POINT(n, data);\n  data++;\n  if (n <= 0) goto set_all;\n\n  r = 0;\n  pre = MBCODE_START_POS(enc);\n  for (i = 0; i < n; i++) {\n    from = data[i*2];\n    to   = data[i*2+1];\n    if (pre <= from - 1) {\n      r = add_code_range_to_buf(pbuf, pre, from - 1);\n      if (r != 0) return r;\n    }\n    if (to == ONIG_LAST_CODE_POINT) break;\n    pre = to + 1;\n  }\n  if (to < ONIG_LAST_CODE_POINT) {\n    r = add_code_range_to_buf(pbuf, to + 1, ONIG_LAST_CODE_POINT);\n  }\n  return r;\n}\n\n#define SWAP_BBUF_NOT(bbuf1, not1, bbuf2, not2) do {\\\n  BBuf *tbuf; \\\n  int  tnot; \\\n  tnot = not1;  not1  = not2;  not2  = tnot; \\\n  tbuf = bbuf1; bbuf1 = bbuf2; bbuf2 = tbuf; \\\n} while (0)\n\nstatic int\nor_code_range_buf(OnigEncoding enc, BBuf* bbuf1, int not1,\n                  BBuf* bbuf2, int not2, BBuf** pbuf)\n{\n  int r;\n  OnigCodePoint i, n1, *data1;\n  OnigCodePoint from, to;\n\n  *pbuf = (BBuf* )NULL;\n  if (IS_NULL(bbuf1) && IS_NULL(bbuf2)) {\n    if (not1 != 0 || not2 != 0)\n      return SET_ALL_MULTI_BYTE_RANGE(enc, pbuf);\n    return 0;\n  }\n\n  r = 0;\n  if (IS_NULL(bbuf2))\n    SWAP_BBUF_NOT(bbuf1, not1, bbuf2, not2);\n\n  if (IS_NULL(bbuf1)) {\n    if (not1 != 0) {\n      return SET_ALL_MULTI_BYTE_RANGE(enc, pbuf);\n    }\n    else {\n      if (not2 == 0) {\n\treturn bbuf_clone(pbuf, bbuf2);\n      }\n      else {\n\treturn not_code_range_buf(enc, bbuf2, pbuf);\n      }\n    }\n  }\n\n  if (not1 != 0)\n    SWAP_BBUF_NOT(bbuf1, not1, bbuf2, not2);\n\n  data1 = (OnigCodePoint* )(bbuf1->p);\n  GET_CODE_POINT(n1, data1);\n  data1++;\n\n  if (not2 == 0 && not1 == 0) { /* 1 OR 2 */\n    r = bbuf_clone(pbuf, bbuf2);\n  }\n  else if (not1 == 0) { /* 1 OR (not 2) */\n    r = not_code_range_buf(enc, bbuf2, pbuf);\n  }\n  if (r != 0) return r;\n\n  for (i = 0; i < n1; i++) {\n    from = data1[i*2];\n    to   = data1[i*2+1];\n    r = add_code_range_to_buf(pbuf, from, to);\n    if (r != 0) return r;\n  }\n  return 0;\n}\n\nstatic int\nand_code_range1(BBuf** pbuf, OnigCodePoint from1, OnigCodePoint to1,\n\t        OnigCodePoint* data, int n)\n{\n  int i, r;\n  OnigCodePoint from2, to2;\n\n  for (i = 0; i < n; i++) {\n    from2 = data[i*2];\n    to2   = data[i*2+1];\n    if (from2 < from1) {\n      if (to2 < from1) continue;\n      else {\n\tfrom1 = to2 + 1;\n      }\n    }\n    else if (from2 <= to1) {\n      if (to2 < to1) {\n\tif (from1 <= from2 - 1) {\n\t  r = add_code_range_to_buf(pbuf, from1, from2-1);\n\t  if (r != 0) return r;\n\t}\n\tfrom1 = to2 + 1;\n      }\n      else {\n\tto1 = from2 - 1;\n      }\n    }\n    else {\n      from1 = from2;\n    }\n    if (from1 > to1) break;\n  }\n  if (from1 <= to1) {\n    r = add_code_range_to_buf(pbuf, from1, to1);\n    if (r != 0) return r;\n  }\n  return 0;\n}\n\nstatic int\nand_code_range_buf(BBuf* bbuf1, int not1, BBuf* bbuf2, int not2, BBuf** pbuf)\n{\n  int r;\n  OnigCodePoint i, j, n1, n2, *data1, *data2;\n  OnigCodePoint from, to, from1, to1, from2, to2;\n\n  *pbuf = (BBuf* )NULL;\n  if (IS_NULL(bbuf1)) {\n    if (not1 != 0 && IS_NOT_NULL(bbuf2)) /* not1 != 0 -> not2 == 0 */\n      return bbuf_clone(pbuf, bbuf2);\n    return 0;\n  }\n  else if (IS_NULL(bbuf2)) {\n    if (not2 != 0)\n      return bbuf_clone(pbuf, bbuf1);\n    return 0;\n  }\n\n  if (not1 != 0)\n    SWAP_BBUF_NOT(bbuf1, not1, bbuf2, not2);\n\n  data1 = (OnigCodePoint* )(bbuf1->p);\n  data2 = (OnigCodePoint* )(bbuf2->p);\n  GET_CODE_POINT(n1, data1);\n  GET_CODE_POINT(n2, data2);\n  data1++;\n  data2++;\n\n  if (not2 == 0 && not1 == 0) { /* 1 AND 2 */\n    for (i = 0; i < n1; i++) {\n      from1 = data1[i*2];\n      to1   = data1[i*2+1];\n      for (j = 0; j < n2; j++) {\n\tfrom2 = data2[j*2];\n\tto2   = data2[j*2+1];\n\tif (from2 > to1) break;\n\tif (to2 < from1) continue;\n\tfrom = MAX(from1, from2);\n\tto   = MIN(to1, to2);\n\tr = add_code_range_to_buf(pbuf, from, to);\n\tif (r != 0) return r;\n      }\n    }\n  }\n  else if (not1 == 0) { /* 1 AND (not 2) */\n    for (i = 0; i < n1; i++) {\n      from1 = data1[i*2];\n      to1   = data1[i*2+1];\n      r = and_code_range1(pbuf, from1, to1, data2, n2);\n      if (r != 0) return r;\n    }\n  }\n\n  return 0;\n}\n\nstatic int\nand_cclass(CClassNode* dest, CClassNode* cc, OnigEncoding enc)\n{\n  int r, not1, not2;\n  BBuf *buf1, *buf2, *pbuf = 0;\n  BitSetRef bsr1, bsr2;\n  BitSet bs1, bs2;\n\n  not1 = IS_NCCLASS_NOT(dest);\n  bsr1 = dest->bs;\n  buf1 = dest->mbuf;\n  not2 = IS_NCCLASS_NOT(cc);\n  bsr2 = cc->bs;\n  buf2 = cc->mbuf;\n\n  if (not1 != 0) {\n    bitset_invert_to(bsr1, bs1);\n    bsr1 = bs1;\n  }\n  if (not2 != 0) {\n    bitset_invert_to(bsr2, bs2);\n    bsr2 = bs2;\n  }\n  bitset_and(bsr1, bsr2);\n  if (bsr1 != dest->bs) {\n    bitset_copy(dest->bs, bsr1);\n    bsr1 = dest->bs;\n  }\n  if (not1 != 0) {\n    bitset_invert(dest->bs);\n  }\n\n  if (! ONIGENC_IS_SINGLEBYTE(enc)) {\n    if (not1 != 0 && not2 != 0) {\n      r = or_code_range_buf(enc, buf1, 0, buf2, 0, &pbuf);\n    }\n    else {\n      r = and_code_range_buf(buf1, not1, buf2, not2, &pbuf);\n      if (r == 0 && not1 != 0) {\n\tBBuf *tbuf = 0;\n\tr = not_code_range_buf(enc, pbuf, &tbuf);\n\tbbuf_free(pbuf);\n\tpbuf = tbuf;\n      }\n    }\n    if (r != 0) {\n      bbuf_free(pbuf);\n      return r;\n    }\n\n    dest->mbuf = pbuf;\n    bbuf_free(buf1);\n    return r;\n  }\n  return 0;\n}\n\nstatic int\nor_cclass(CClassNode* dest, CClassNode* cc, OnigEncoding enc)\n{\n  int r, not1, not2;\n  BBuf *buf1, *buf2, *pbuf = 0;\n  BitSetRef bsr1, bsr2;\n  BitSet bs1, bs2;\n\n  not1 = IS_NCCLASS_NOT(dest);\n  bsr1 = dest->bs;\n  buf1 = dest->mbuf;\n  not2 = IS_NCCLASS_NOT(cc);\n  bsr2 = cc->bs;\n  buf2 = cc->mbuf;\n\n  if (not1 != 0) {\n    bitset_invert_to(bsr1, bs1);\n    bsr1 = bs1;\n  }\n  if (not2 != 0) {\n    bitset_invert_to(bsr2, bs2);\n    bsr2 = bs2;\n  }\n  bitset_or(bsr1, bsr2);\n  if (bsr1 != dest->bs) {\n    bitset_copy(dest->bs, bsr1);\n    bsr1 = dest->bs;\n  }\n  if (not1 != 0) {\n    bitset_invert(dest->bs);\n  }\n\n  if (! ONIGENC_IS_SINGLEBYTE(enc)) {\n    if (not1 != 0 && not2 != 0) {\n      r = and_code_range_buf(buf1, 0, buf2, 0, &pbuf);\n    }\n    else {\n      r = or_code_range_buf(enc, buf1, not1, buf2, not2, &pbuf);\n      if (r == 0 && not1 != 0) {\n\tBBuf *tbuf = 0;\n\tr = not_code_range_buf(enc, pbuf, &tbuf);\n\tbbuf_free(pbuf);\n\tpbuf = tbuf;\n      }\n    }\n    if (r != 0) {\n      bbuf_free(pbuf);\n      return r;\n    }\n\n    dest->mbuf = pbuf;\n    bbuf_free(buf1);\n    return r;\n  }\n  else\n    return 0;\n}\n\nstatic int\nconv_backslash_value(int c, ScanEnv* env)\n{\n  if (IS_SYNTAX_OP(env->syntax, ONIG_SYN_OP_ESC_CONTROL_CHARS)) {\n    switch (c) {\n    case 'n': return '\\n';\n    case 't': return '\\t';\n    case 'r': return '\\r';\n    case 'f': return '\\f';\n    case 'a': return '\\007';\n    case 'b': return '\\010';\n    case 'e': return '\\033';\n    case 'v':\n      if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_ESC_V_VTAB))\n\treturn '\\v';\n      break;\n\n    default:\n      break;\n    }\n  }\n  return c;\n}\n\n#ifdef USE_NO_INVALID_QUANTIFIER\n#define is_invalid_quantifier_target(node) 0\n#else\nstatic int\nis_invalid_quantifier_target(Node* node)\n{\n  switch (NTYPE(node)) {\n  case NT_ANCHOR:\n    return 1;\n    break;\n\n  case NT_ENCLOSE:\n    /* allow enclosed elements */\n    /* return is_invalid_quantifier_target(NENCLOSE(node)->target); */\n    break;\n\n  case NT_LIST:\n    do {\n      if (! is_invalid_quantifier_target(NCAR(node))) return 0;\n    } while (IS_NOT_NULL(node = NCDR(node)));\n    return 0;\n    break;\n\n  case NT_ALT:\n    do {\n      if (is_invalid_quantifier_target(NCAR(node))) return 1;\n    } while (IS_NOT_NULL(node = NCDR(node)));\n    break;\n\n  default:\n    break;\n  }\n  return 0;\n}\n#endif\n\n/* ?:0, *:1, +:2, ??:3, *?:4, +?:5 */\nstatic int\npopular_quantifier_num(QtfrNode* q)\n{\n  if (q->greedy) {\n    if (q->lower == 0) {\n      if (q->upper == 1) return 0;\n      else if (IS_REPEAT_INFINITE(q->upper)) return 1;\n    }\n    else if (q->lower == 1) {\n      if (IS_REPEAT_INFINITE(q->upper)) return 2;\n    }\n  }\n  else {\n    if (q->lower == 0) {\n      if (q->upper == 1) return 3;\n      else if (IS_REPEAT_INFINITE(q->upper)) return 4;\n    }\n    else if (q->lower == 1) {\n      if (IS_REPEAT_INFINITE(q->upper)) return 5;\n    }\n  }\n  return -1;\n}\n\n\nenum ReduceType {\n  RQ_ASIS = 0, /* as is */\n  RQ_DEL  = 1, /* delete parent */\n  RQ_A,        /* to '*'    */\n  RQ_AQ,       /* to '*?'   */\n  RQ_QQ,       /* to '??'   */\n  RQ_P_QQ,     /* to '+)??' */\n  RQ_PQ_Q      /* to '+?)?' */\n};\n\nstatic enum ReduceType const ReduceTypeTable[6][6] = {\n  {RQ_DEL,  RQ_A,    RQ_A,   RQ_QQ,   RQ_AQ,   RQ_ASIS}, /* '?'  */\n  {RQ_DEL,  RQ_DEL,  RQ_DEL, RQ_P_QQ, RQ_P_QQ, RQ_DEL},  /* '*'  */\n  {RQ_A,    RQ_A,    RQ_DEL, RQ_ASIS, RQ_P_QQ, RQ_DEL},  /* '+'  */\n  {RQ_DEL,  RQ_AQ,   RQ_AQ,  RQ_DEL,  RQ_AQ,   RQ_AQ},   /* '??' */\n  {RQ_DEL,  RQ_DEL,  RQ_DEL, RQ_DEL,  RQ_DEL,  RQ_DEL},  /* '*?' */\n  {RQ_ASIS, RQ_PQ_Q, RQ_DEL, RQ_AQ,   RQ_AQ,   RQ_DEL}   /* '+?' */\n};\n\nextern void\nonig_reduce_nested_quantifier(Node* pnode, Node* cnode)\n{\n  int pnum, cnum;\n  QtfrNode *p, *c;\n\n  p = NQTFR(pnode);\n  c = NQTFR(cnode);\n  pnum = popular_quantifier_num(p);\n  cnum = popular_quantifier_num(c);\n  if (pnum < 0 || cnum < 0) return ;\n\n  switch (ReduceTypeTable[cnum][pnum]) {\n  case RQ_DEL:\n    *pnode = *cnode;\n    break;\n  case RQ_A:\n    p->target = c->target;\n    p->lower  = 0;  p->upper = REPEAT_INFINITE;  p->greedy = 1;\n    break;\n  case RQ_AQ:\n    p->target = c->target;\n    p->lower  = 0;  p->upper = REPEAT_INFINITE;  p->greedy = 0;\n    break;\n  case RQ_QQ:\n    p->target = c->target;\n    p->lower  = 0;  p->upper = 1;  p->greedy = 0;\n    break;\n  case RQ_P_QQ:\n    p->target = cnode;\n    p->lower  = 0;  p->upper = 1;  p->greedy = 0;\n    c->lower  = 1;  c->upper = REPEAT_INFINITE;  c->greedy = 1;\n    return ;\n    break;\n  case RQ_PQ_Q:\n    p->target = cnode;\n    p->lower  = 0;  p->upper = 1;  p->greedy = 1;\n    c->lower  = 1;  c->upper = REPEAT_INFINITE;  c->greedy = 0;\n    return ;\n    break;\n  case RQ_ASIS:\n    p->target = cnode;\n    return ;\n    break;\n  }\n\n  c->target = NULL_NODE;\n  onig_node_free(cnode);\n}\n\n\nenum TokenSyms {\n  TK_EOT      = 0,   /* end of token */\n  TK_RAW_BYTE = 1,\n  TK_CHAR,\n  TK_STRING,\n  TK_CODE_POINT,\n  TK_ANYCHAR,\n  TK_CHAR_TYPE,\n  TK_BACKREF,\n  TK_CALL,\n  TK_ANCHOR,\n  TK_OP_REPEAT,\n  TK_INTERVAL,\n  TK_ANYCHAR_ANYTIME,  /* SQL '%' == .* */\n  TK_ALT,\n  TK_SUBEXP_OPEN,\n  TK_SUBEXP_CLOSE,\n  TK_CC_OPEN,\n  TK_QUOTE_OPEN,\n  TK_CHAR_PROPERTY,    /* \\p{...}, \\P{...} */\n  TK_LINEBREAK,\n  TK_EXTENDED_GRAPHEME_CLUSTER,\n  TK_KEEP,\n  /* in cc */\n  TK_CC_CLOSE,\n  TK_CC_RANGE,\n  TK_POSIX_BRACKET_OPEN,\n  TK_CC_AND,             /* && */\n  TK_CC_CC_OPEN          /* [ */\n};\n\ntypedef struct {\n  enum TokenSyms type;\n  int escaped;\n  int base;   /* is number: 8, 16 (used in [....]) */\n  UChar* backp;\n  union {\n    UChar* s;\n    int   c;\n    OnigCodePoint code;\n    struct {\n      int subtype;\n      int ascii_range;\n    } anchor;\n    struct {\n      int lower;\n      int upper;\n      int greedy;\n      int possessive;\n    } repeat;\n    struct {\n      int  num;\n      int  ref1;\n      int* refs;\n      int  by_name;\n#ifdef USE_BACKREF_WITH_LEVEL\n      int  exist_level;\n      int  level;   /* \\k<name+n> */\n#endif\n    } backref;\n    struct {\n      UChar* name;\n      UChar* name_end;\n      int    gnum;\n      int    rel;\n    } call;\n    struct {\n      int ctype;\n      int not;\n    } prop;\n  } u;\n} OnigToken;\n\n\nstatic int\nfetch_range_quantifier(UChar** src, UChar* end, OnigToken* tok, ScanEnv* env)\n{\n  int low, up, syn_allow, non_low = 0;\n  int r = 0;\n  OnigCodePoint c;\n  OnigEncoding enc = env->enc;\n  UChar* p = *src;\n  PFETCH_READY;\n\n  syn_allow = IS_SYNTAX_BV(env->syntax, ONIG_SYN_ALLOW_INVALID_INTERVAL);\n\n  if (PEND) {\n    if (syn_allow)\n      return 1;  /* \"....{\" : OK! */\n    else\n      return ONIGERR_END_PATTERN_AT_LEFT_BRACE;  /* \"....{\" syntax error */\n  }\n\n  if (! syn_allow) {\n    c = PPEEK;\n    if (c == ')' || c == '(' || c == '|') {\n      return ONIGERR_END_PATTERN_AT_LEFT_BRACE;\n    }\n  }\n\n  low = onig_scan_unsigned_number(&p, end, env->enc);\n  if (low < 0) return ONIGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE;\n  if (low > ONIG_MAX_REPEAT_NUM)\n    return ONIGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE;\n\n  if (p == *src) { /* can't read low */\n    if (IS_SYNTAX_BV(env->syntax, ONIG_SYN_ALLOW_INTERVAL_LOW_ABBREV)) {\n      /* allow {,n} as {0,n} */\n      low = 0;\n      non_low = 1;\n    }\n    else\n      goto invalid;\n  }\n\n  if (PEND) goto invalid;\n  PFETCH(c);\n  if (c == ',') {\n    UChar* prev = p;\n    up = onig_scan_unsigned_number(&p, end, env->enc);\n    if (up < 0) return ONIGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE;\n    if (up > ONIG_MAX_REPEAT_NUM)\n      return ONIGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE;\n\n    if (p == prev) {\n      if (non_low != 0)\n\tgoto invalid;\n      up = REPEAT_INFINITE;  /* {n,} : {n,infinite} */\n    }\n  }\n  else {\n    if (non_low != 0)\n      goto invalid;\n\n    PUNFETCH;\n    up = low;  /* {n} : exact n times */\n    r = 2;     /* fixed */\n  }\n\n  if (PEND) goto invalid;\n  PFETCH(c);\n  if (IS_SYNTAX_OP(env->syntax, ONIG_SYN_OP_ESC_BRACE_INTERVAL)) {\n    if (c != MC_ESC(env->syntax)) goto invalid;\n    PFETCH(c);\n  }\n  if (c != '}') goto invalid;\n\n  if (!IS_REPEAT_INFINITE(up) && low > up) {\n    return ONIGERR_UPPER_SMALLER_THAN_LOWER_IN_REPEAT_RANGE;\n  }\n\n  tok->type = TK_INTERVAL;\n  tok->u.repeat.lower = low;\n  tok->u.repeat.upper = up;\n  *src = p;\n  return r; /* 0: normal {n,m}, 2: fixed {n} */\n\n invalid:\n  if (syn_allow)\n    return 1;  /* OK */\n  else\n    return ONIGERR_INVALID_REPEAT_RANGE_PATTERN;\n}\n\n/* \\M-, \\C-, \\c, or \\... */\nstatic int\nfetch_escaped_value(UChar** src, UChar* end, ScanEnv* env)\n{\n  int v;\n  OnigCodePoint c;\n  OnigEncoding enc = env->enc;\n  UChar* p = *src;\n  PFETCH_READY;\n\n  if (PEND) return ONIGERR_END_PATTERN_AT_ESCAPE;\n\n  PFETCH(c);\n  switch (c) {\n  case 'M':\n    if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_ESC_CAPITAL_M_BAR_META)) {\n      if (PEND) return ONIGERR_END_PATTERN_AT_META;\n      PFETCH(c);\n      if (c != '-') return ONIGERR_META_CODE_SYNTAX;\n      if (PEND) return ONIGERR_END_PATTERN_AT_META;\n      PFETCH(c);\n      if (c == MC_ESC(env->syntax)) {\n\tv = fetch_escaped_value(&p, end, env);\n\tif (v < 0) return v;\n        c = (OnigCodePoint )v;\n      }\n      c = ((c & 0xff) | 0x80);\n    }\n    else\n      goto backslash;\n    break;\n\n  case 'C':\n    if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_ESC_CAPITAL_C_BAR_CONTROL)) {\n      if (PEND) return ONIGERR_END_PATTERN_AT_CONTROL;\n      PFETCH(c);\n      if (c != '-') return ONIGERR_CONTROL_CODE_SYNTAX;\n      goto control;\n    }\n    else\n      goto backslash;\n\n  case 'c':\n    if (IS_SYNTAX_OP(env->syntax, ONIG_SYN_OP_ESC_C_CONTROL)) {\n    control:\n      if (PEND) return ONIGERR_END_PATTERN_AT_CONTROL;\n      PFETCH(c);\n      if (c == '?') {\n\tc = 0177;\n      }\n      else {\n        if (c == MC_ESC(env->syntax)) {\n          v = fetch_escaped_value(&p, end, env);\n          if (v < 0) return v;\n          c = (OnigCodePoint )v;\n        }\n\tc &= 0x9f;\n      }\n      break;\n    }\n    /* fall through */\n\n  default:\n    {\n    backslash:\n      c = conv_backslash_value(c, env);\n    }\n    break;\n  }\n\n  *src = p;\n  return c;\n}\n\nstatic int fetch_token(OnigToken* tok, UChar** src, UChar* end, ScanEnv* env);\n\nstatic OnigCodePoint\nget_name_end_code_point(OnigCodePoint start)\n{\n  switch (start) {\n  case '<':  return (OnigCodePoint )'>'; break;\n  case '\\'': return (OnigCodePoint )'\\''; break;\n  case '(':  return (OnigCodePoint )')'; break;\n  case '{':  return (OnigCodePoint )'}'; break;\n  default:\n    break;\n  }\n\n  return (OnigCodePoint )0;\n}\n\n#ifdef USE_NAMED_GROUP\n#ifdef USE_BACKREF_WITH_LEVEL\n/*\n   \\k<name+n>, \\k<name-n>\n   \\k<num+n>,  \\k<num-n>\n   \\k<-num+n>, \\k<-num-n>\n*/\nstatic int\nfetch_name_with_level(OnigCodePoint start_code, UChar** src, UChar* end,\n\t\t      UChar** rname_end, ScanEnv* env,\n\t\t      int* rback_num, int* rlevel)\n{\n  int r, sign, is_num, exist_level;\n  OnigCodePoint end_code;\n  OnigCodePoint c = 0;\n  OnigEncoding enc = env->enc;\n  UChar *name_end;\n  UChar *pnum_head;\n  UChar *p = *src;\n  PFETCH_READY;\n\n  *rback_num = 0;\n  is_num = exist_level = 0;\n  sign = 1;\n  pnum_head = *src;\n\n  end_code = get_name_end_code_point(start_code);\n\n  name_end = end;\n  r = 0;\n  if (PEND) {\n    return ONIGERR_EMPTY_GROUP_NAME;\n  }\n  else {\n    PFETCH(c);\n    if (c == end_code)\n      return ONIGERR_EMPTY_GROUP_NAME;\n\n    if (ONIGENC_IS_CODE_DIGIT(enc, c)) {\n      is_num = 1;\n    }\n    else if (c == '-') {\n      is_num = 2;\n      sign = -1;\n      pnum_head = p;\n    }\n    else if (!ONIGENC_IS_CODE_WORD(enc, c)) {\n      r = ONIGERR_INVALID_CHAR_IN_GROUP_NAME;\n    }\n  }\n\n  while (!PEND) {\n    name_end = p;\n    PFETCH(c);\n    if (c == end_code || c == ')' || c == '+' || c == '-') {\n      if (is_num == 2) r = ONIGERR_INVALID_GROUP_NAME;\n      break;\n    }\n\n    if (is_num != 0) {\n      if (ONIGENC_IS_CODE_DIGIT(enc, c)) {\n\tis_num = 1;\n      }\n      else {\n\tr = ONIGERR_INVALID_GROUP_NAME;\n\tis_num = 0;\n      }\n    }\n    else if (!ONIGENC_IS_CODE_WORD(enc, c)) {\n      r = ONIGERR_INVALID_CHAR_IN_GROUP_NAME;\n    }\n  }\n\n  if (r == 0 && c != end_code) {\n    if (c == '+' || c == '-') {\n      int level;\n      int flag = (c == '-' ? -1 : 1);\n\n      PFETCH(c);\n      if (! ONIGENC_IS_CODE_DIGIT(enc, c)) goto err;\n      PUNFETCH;\n      level = onig_scan_unsigned_number(&p, end, enc);\n      if (level < 0) return ONIGERR_TOO_BIG_NUMBER;\n      *rlevel = (level * flag);\n      exist_level = 1;\n\n      PFETCH(c);\n      if (c == end_code)\n\tgoto end;\n    }\n\n  err:\n    r = ONIGERR_INVALID_GROUP_NAME;\n    name_end = end;\n  }\n\n end:\n  if (r == 0) {\n    if (is_num != 0) {\n      *rback_num = onig_scan_unsigned_number(&pnum_head, name_end, enc);\n      if (*rback_num < 0) return ONIGERR_TOO_BIG_NUMBER;\n      else if (*rback_num == 0) goto err;\n\n      *rback_num *= sign;\n    }\n\n    *rname_end = name_end;\n    *src = p;\n    return (exist_level ? 1 : 0);\n  }\n  else {\n    onig_scan_env_set_error_string(env, r, *src, name_end);\n    return r;\n  }\n}\n#endif /* USE_BACKREF_WITH_LEVEL */\n\n/*\n  ref: 0 -> define name    (don't allow number name)\n       1 -> reference name (allow number name)\n*/\nstatic int\nfetch_name(OnigCodePoint start_code, UChar** src, UChar* end,\n\t   UChar** rname_end, ScanEnv* env, int* rback_num, int ref)\n{\n  int r, is_num, sign;\n  OnigCodePoint end_code;\n  OnigCodePoint c = 0;\n  OnigEncoding enc = env->enc;\n  UChar *name_end;\n  UChar *pnum_head;\n  UChar *p = *src;\n  PFETCH_READY;\n\n  *rback_num = 0;\n\n  end_code = get_name_end_code_point(start_code);\n\n  name_end = end;\n  pnum_head = *src;\n  r = 0;\n  is_num = 0;\n  sign = 1;\n  if (PEND) {\n    return ONIGERR_EMPTY_GROUP_NAME;\n  }\n  else {\n    PFETCH(c);\n    if (c == end_code)\n      return ONIGERR_EMPTY_GROUP_NAME;\n\n    if (ONIGENC_IS_CODE_DIGIT(enc, c)) {\n      if (ref == 1)\n\tis_num = 1;\n      else {\n\tr = ONIGERR_INVALID_GROUP_NAME;\n\tis_num = 0;\n      }\n    }\n    else if (c == '-') {\n      if (ref == 1) {\n\tis_num = 2;\n\tsign = -1;\n\tpnum_head = p;\n      }\n      else {\n\tr = ONIGERR_INVALID_GROUP_NAME;\n\tis_num = 0;\n      }\n    }\n    else if (!ONIGENC_IS_CODE_WORD(enc, c)) {\n      r = ONIGERR_INVALID_CHAR_IN_GROUP_NAME;\n    }\n  }\n\n  if (r == 0) {\n    while (!PEND) {\n      name_end = p;\n      PFETCH(c);\n      if (c == end_code || c == ')') {\n\tif (is_num == 2) r = ONIGERR_INVALID_GROUP_NAME;\n\tbreak;\n      }\n\n      if (is_num != 0) {\n\tif (ONIGENC_IS_CODE_DIGIT(enc, c)) {\n\t  is_num = 1;\n\t}\n\telse {\n\t  if (!ONIGENC_IS_CODE_WORD(enc, c))\n\t    r = ONIGERR_INVALID_CHAR_IN_GROUP_NAME;\n\t  else\n\t    r = ONIGERR_INVALID_GROUP_NAME;\n\n\t  is_num = 0;\n\t}\n      }\n      else {\n\tif (!ONIGENC_IS_CODE_WORD(enc, c)) {\n\t  r = ONIGERR_INVALID_CHAR_IN_GROUP_NAME;\n\t}\n      }\n    }\n\n    if (c != end_code) {\n      r = ONIGERR_INVALID_GROUP_NAME;\n      name_end = end;\n    }\n\n    if (is_num != 0) {\n      *rback_num = onig_scan_unsigned_number(&pnum_head, name_end, enc);\n      if (*rback_num < 0) return ONIGERR_TOO_BIG_NUMBER;\n      else if (*rback_num == 0) {\n\tr = ONIGERR_INVALID_GROUP_NAME;\n\tgoto err;\n      }\n\n      *rback_num *= sign;\n    }\n\n    *rname_end = name_end;\n    *src = p;\n    return 0;\n  }\n  else {\n    while (!PEND) {\n      name_end = p;\n      PFETCH(c);\n      if (c == end_code || c == ')')\n\tbreak;\n    }\n    if (PEND)\n      name_end = end;\n\n  err:\n    onig_scan_env_set_error_string(env, r, *src, name_end);\n    return r;\n  }\n}\n#else\nstatic int\nfetch_name(OnigCodePoint start_code, UChar** src, UChar* end,\n\t   UChar** rname_end, ScanEnv* env, int* rback_num, int ref)\n{\n  int r, is_num, sign;\n  OnigCodePoint end_code;\n  OnigCodePoint c = 0;\n  UChar *name_end;\n  OnigEncoding enc = env->enc;\n  UChar *pnum_head;\n  UChar *p = *src;\n  PFETCH_READY;\n\n  *rback_num = 0;\n\n  end_code = get_name_end_code_point(start_code);\n\n  *rname_end = name_end = end;\n  r = 0;\n  pnum_head = *src;\n  is_num = 0;\n  sign = 1;\n\n  if (PEND) {\n    return ONIGERR_EMPTY_GROUP_NAME;\n  }\n  else {\n    PFETCH(c);\n    if (c == end_code)\n      return ONIGERR_EMPTY_GROUP_NAME;\n\n    if (ONIGENC_IS_CODE_DIGIT(enc, c)) {\n      is_num = 1;\n    }\n    else if (c == '-') {\n      is_num = 2;\n      sign = -1;\n      pnum_head = p;\n    }\n    else {\n      r = ONIGERR_INVALID_CHAR_IN_GROUP_NAME;\n    }\n  }\n\n  while (!PEND) {\n    name_end = p;\n\n    PFETCH(c);\n    if (c == end_code || c == ')') break;\n    if (! ONIGENC_IS_CODE_DIGIT(enc, c))\n      r = ONIGERR_INVALID_CHAR_IN_GROUP_NAME;\n  }\n  if (r == 0 && c != end_code) {\n    r = ONIGERR_INVALID_GROUP_NAME;\n    name_end = end;\n  }\n\n  if (r == 0) {\n    *rback_num = onig_scan_unsigned_number(&pnum_head, name_end, enc);\n    if (*rback_num < 0) return ONIGERR_TOO_BIG_NUMBER;\n    else if (*rback_num == 0) {\n      r = ONIGERR_INVALID_GROUP_NAME;\n      goto err;\n    }\n    *rback_num *= sign;\n\n    *rname_end = name_end;\n    *src = p;\n    return 0;\n  }\n  else {\n  err:\n    onig_scan_env_set_error_string(env, r, *src, name_end);\n    return r;\n  }\n}\n#endif /* USE_NAMED_GROUP */\n\nstatic void\nCC_ESC_WARN(ScanEnv* env, UChar *c)\n{\n  if (onig_warn == onig_null_warn) return ;\n\n  if (IS_SYNTAX_BV(env->syntax, ONIG_SYN_WARN_CC_OP_NOT_ESCAPED) &&\n      IS_SYNTAX_BV(env->syntax, ONIG_SYN_BACKSLASH_ESCAPE_IN_CC)) {\n    UChar buf[WARN_BUFSIZE];\n    onig_snprintf_with_pattern(buf, WARN_BUFSIZE, env->enc,\n\t\tenv->pattern, env->pattern_end,\n                (UChar* )\"character class has '%s' without escape\", c);\n    (*onig_warn)((char* )buf);\n  }\n}\n\nstatic void\nCLOSE_BRACKET_WITHOUT_ESC_WARN(ScanEnv* env, UChar* c)\n{\n  if (onig_warn == onig_null_warn) return ;\n\n  if (IS_SYNTAX_BV(env->syntax, ONIG_SYN_WARN_CC_OP_NOT_ESCAPED)) {\n    UChar buf[WARN_BUFSIZE];\n    onig_snprintf_with_pattern(buf, WARN_BUFSIZE, env->enc,\n\t\tenv->pattern, env->pattern_end,\n\t\t(UChar* )\"regular expression has '%s' without escape\", c);\n    (*onig_warn)((char* )buf);\n  }\n}\n\nstatic UChar*\nfind_str_position(OnigCodePoint s[], int n, UChar* from, UChar* to,\n\t\t  UChar **next, OnigEncoding enc)\n{\n  int i;\n  OnigCodePoint x;\n  UChar *q;\n  UChar *p = from;\n\n  while (p < to) {\n    x = ONIGENC_MBC_TO_CODE(enc, p, to);\n    q = p + enclen(enc, p);\n    if (x == s[0]) {\n      for (i = 1; i < n && q < to; i++) {\n\tx = ONIGENC_MBC_TO_CODE(enc, q, to);\n\tif (x != s[i]) break;\n\tq += enclen(enc, q);\n      }\n      if (i >= n) {\n\tif (IS_NOT_NULL(next))\n\t  *next = q;\n\treturn p;\n      }\n    }\n    p = q;\n  }\n  return NULL_UCHARP;\n}\n\nstatic int\nstr_exist_check_with_esc(OnigCodePoint s[], int n, UChar* from, UChar* to,\n\t\t OnigCodePoint bad, OnigEncoding enc, OnigSyntaxType* syn)\n{\n  int i, in_esc;\n  OnigCodePoint x;\n  UChar *q;\n  UChar *p = from;\n\n  in_esc = 0;\n  while (p < to) {\n    if (in_esc) {\n      in_esc = 0;\n      p += enclen(enc, p);\n    }\n    else {\n      x = ONIGENC_MBC_TO_CODE(enc, p, to);\n      q = p + enclen(enc, p);\n      if (x == s[0]) {\n\tfor (i = 1; i < n && q < to; i++) {\n\t  x = ONIGENC_MBC_TO_CODE(enc, q, to);\n\t  if (x != s[i]) break;\n\t  q += enclen(enc, q);\n\t}\n\tif (i >= n) return 1;\n\tp += enclen(enc, p);\n      }\n      else {\n\tx = ONIGENC_MBC_TO_CODE(enc, p, to);\n\tif (x == bad) return 0;\n\telse if (x == MC_ESC(syn)) in_esc = 1;\n\tp = q;\n      }\n    }\n  }\n  return 0;\n}\n\nstatic int\nfetch_token_in_cc(OnigToken* tok, UChar** src, UChar* end, ScanEnv* env)\n{\n  int num;\n  OnigCodePoint c, c2;\n  OnigSyntaxType* syn = env->syntax;\n  OnigEncoding enc = env->enc;\n  UChar* prev;\n  UChar* p = *src;\n  PFETCH_READY;\n\n  if (PEND) {\n    tok->type = TK_EOT;\n    return tok->type;\n  }\n\n  PFETCH(c);\n  tok->type = TK_CHAR;\n  tok->base = 0;\n  tok->u.c  = c;\n  tok->escaped = 0;\n\n  if (c == ']') {\n    tok->type = TK_CC_CLOSE;\n  }\n  else if (c == '-') {\n    tok->type = TK_CC_RANGE;\n  }\n  else if (c == MC_ESC(syn)) {\n    if (! IS_SYNTAX_BV(syn, ONIG_SYN_BACKSLASH_ESCAPE_IN_CC))\n      goto end;\n\n    if (PEND) return ONIGERR_END_PATTERN_AT_ESCAPE;\n\n    PFETCH(c);\n    tok->escaped = 1;\n    tok->u.c = c;\n    switch (c) {\n    case 'w':\n      tok->type = TK_CHAR_TYPE;\n      tok->u.prop.ctype = ONIGENC_CTYPE_WORD;\n      tok->u.prop.not   = 0;\n      break;\n    case 'W':\n      tok->type = TK_CHAR_TYPE;\n      tok->u.prop.ctype = ONIGENC_CTYPE_WORD;\n      tok->u.prop.not   = 1;\n      break;\n    case 'd':\n      tok->type = TK_CHAR_TYPE;\n      tok->u.prop.ctype = ONIGENC_CTYPE_DIGIT;\n      tok->u.prop.not   = 0;\n      break;\n    case 'D':\n      tok->type = TK_CHAR_TYPE;\n      tok->u.prop.ctype = ONIGENC_CTYPE_DIGIT;\n      tok->u.prop.not   = 1;\n      break;\n    case 's':\n      tok->type = TK_CHAR_TYPE;\n      tok->u.prop.ctype = ONIGENC_CTYPE_SPACE;\n      tok->u.prop.not   = 0;\n      break;\n    case 'S':\n      tok->type = TK_CHAR_TYPE;\n      tok->u.prop.ctype = ONIGENC_CTYPE_SPACE;\n      tok->u.prop.not   = 1;\n      break;\n    case 'h':\n      if (! IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_H_XDIGIT)) break;\n      tok->type = TK_CHAR_TYPE;\n      tok->u.prop.ctype = ONIGENC_CTYPE_XDIGIT;\n      tok->u.prop.not   = 0;\n      break;\n    case 'H':\n      if (! IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_H_XDIGIT)) break;\n      tok->type = TK_CHAR_TYPE;\n      tok->u.prop.ctype = ONIGENC_CTYPE_XDIGIT;\n      tok->u.prop.not   = 1;\n      break;\n\n    case 'p':\n    case 'P':\n      c2 = PPEEK;\n      if (c2 == '{' &&\n\t  IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_P_BRACE_CHAR_PROPERTY)) {\n\tPINC;\n\ttok->type = TK_CHAR_PROPERTY;\n\ttok->u.prop.not = (c == 'P' ? 1 : 0);\n\n\tif (IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_P_BRACE_CIRCUMFLEX_NOT)) {\n\t  PFETCH(c2);\n\t  if (c2 == '^') {\n\t    tok->u.prop.not = (tok->u.prop.not == 0 ? 1 : 0);\n\t  }\n\t  else\n\t    PUNFETCH;\n\t}\n      }\n      break;\n\n    case 'x':\n      if (PEND) break;\n\n      prev = p;\n      if (PPEEK_IS('{') && IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_X_BRACE_HEX8)) {\n\tPINC;\n\tnum = scan_unsigned_hexadecimal_number(&p, end, 0, 8, enc);\n\tif (num < 0) return ONIGERR_TOO_BIG_WIDE_CHAR_VALUE;\n\tif (!PEND) {\n          c2 = PPEEK;\n          if (ONIGENC_IS_CODE_XDIGIT(enc, c2))\n            return ONIGERR_TOO_LONG_WIDE_CHAR_VALUE;\n        }\n\n\tif (p > prev + enclen(enc, prev) && !PEND && (PPEEK_IS('}'))) {\n\t  PINC;\n\t  tok->type   = TK_CODE_POINT;\n\t  tok->base   = 16;\n\t  tok->u.code = (OnigCodePoint )num;\n\t}\n\telse {\n\t  /* can't read nothing or invalid format */\n\t  p = prev;\n\t}\n      }\n      else if (IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_X_HEX2)) {\n\tnum = scan_unsigned_hexadecimal_number(&p, end, 0, 2, enc);\n\tif (num < 0) return ONIGERR_TOO_BIG_NUMBER;\n\tif (p == prev) {  /* can't read nothing. */\n\t  num = 0; /* but, it's not error */\n\t}\n\ttok->type = TK_RAW_BYTE;\n\ttok->base = 16;\n\ttok->u.c  = num;\n      }\n      break;\n\n    case 'u':\n      if (PEND) break;\n\n      prev = p;\n      if (IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_U_HEX4)) {\n\tnum = scan_unsigned_hexadecimal_number(&p, end, 4, 4, enc);\n\tif (num < -1) return ONIGERR_TOO_SHORT_DIGITS;\n\telse if (num < 0) return ONIGERR_TOO_BIG_NUMBER;\n\tif (p == prev) {  /* can't read nothing. */\n\t  num = 0; /* but, it's not error */\n\t}\n\ttok->type   = TK_CODE_POINT;\n\ttok->base   = 16;\n\ttok->u.code = (OnigCodePoint )num;\n      }\n      break;\n\n    case '0':\n    case '1': case '2': case '3': case '4': case '5': case '6': case '7':\n      if (IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_OCTAL3)) {\n\tPUNFETCH;\n\tprev = p;\n\tnum = scan_unsigned_octal_number(&p, end, 3, enc);\n\tif (num < 0) return ONIGERR_TOO_BIG_NUMBER;\n\tif (p == prev) {  /* can't read nothing. */\n\t  num = 0; /* but, it's not error */\n\t}\n\ttok->type = TK_RAW_BYTE;\n\ttok->base = 8;\n\ttok->u.c  = num;\n      }\n      break;\n\n    default:\n      PUNFETCH;\n      num = fetch_escaped_value(&p, end, env);\n      if (num < 0) return num;\n      if (tok->u.c != num) {\n\ttok->u.code = (OnigCodePoint )num;\n\ttok->type   = TK_CODE_POINT;\n      }\n      break;\n    }\n  }\n  else if (c == '[') {\n    if (IS_SYNTAX_OP(syn, ONIG_SYN_OP_POSIX_BRACKET) && (PPEEK_IS(':'))) {\n      OnigCodePoint send[] = { (OnigCodePoint )':', (OnigCodePoint )']' };\n      tok->backp = p; /* point at '[' is read */\n      PINC;\n      if (str_exist_check_with_esc(send, 2, p, end,\n                                   (OnigCodePoint )']', enc, syn)) {\n\ttok->type = TK_POSIX_BRACKET_OPEN;\n      }\n      else {\n\tPUNFETCH;\n\tgoto cc_in_cc;\n      }\n    }\n    else {\n    cc_in_cc:\n      if (IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_CCLASS_SET_OP)) {\n\ttok->type = TK_CC_CC_OPEN;\n      }\n      else {\n\tCC_ESC_WARN(env, (UChar* )\"[\");\n      }\n    }\n  }\n  else if (c == '&') {\n    if (IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_CCLASS_SET_OP) &&\n\t!PEND && (PPEEK_IS('&'))) {\n      PINC;\n      tok->type = TK_CC_AND;\n    }\n  }\n\n end:\n  *src = p;\n  return tok->type;\n}\n\n#ifdef USE_NAMED_GROUP\nstatic int\nfetch_named_backref_token(OnigCodePoint c, OnigToken* tok, UChar** src,\n\t\t\t  UChar* end, ScanEnv* env)\n{\n  int r, num;\n  OnigSyntaxType* syn = env->syntax;\n  UChar* prev;\n  UChar* p = *src;\n  UChar* name_end;\n  int* backs;\n  int back_num;\n\n  prev = p;\n\n#ifdef USE_BACKREF_WITH_LEVEL\n  name_end = NULL_UCHARP; /* no need. escape gcc warning. */\n  r = fetch_name_with_level(c, &p, end, &name_end,\n\t\t\t    env, &back_num, &tok->u.backref.level);\n  if (r == 1) tok->u.backref.exist_level = 1;\n  else        tok->u.backref.exist_level = 0;\n#else\n  r = fetch_name(&p, end, &name_end, env, &back_num, 1);\n#endif\n  if (r < 0) return r;\n\n  if (back_num != 0) {\n    if (back_num < 0) {\n      back_num = BACKREF_REL_TO_ABS(back_num, env);\n      if (back_num <= 0)\n\treturn ONIGERR_INVALID_BACKREF;\n    }\n\n    if (IS_SYNTAX_BV(syn, ONIG_SYN_STRICT_CHECK_BACKREF)) {\n      if (back_num > env->num_mem ||\n\t  IS_NULL(SCANENV_MEM_NODES(env)[back_num]))\n\treturn ONIGERR_INVALID_BACKREF;\n    }\n    tok->type = TK_BACKREF;\n    tok->u.backref.by_name = 0;\n    tok->u.backref.num  = 1;\n    tok->u.backref.ref1 = back_num;\n  }\n  else {\n    num = onig_name_to_group_numbers(env->reg, prev, name_end, &backs);\n    if (num <= 0) {\n      onig_scan_env_set_error_string(env,\n\t\t     ONIGERR_UNDEFINED_NAME_REFERENCE, prev, name_end);\n      return ONIGERR_UNDEFINED_NAME_REFERENCE;\n    }\n    if (IS_SYNTAX_BV(syn, ONIG_SYN_STRICT_CHECK_BACKREF)) {\n      int i;\n      for (i = 0; i < num; i++) {\n\tif (backs[i] > env->num_mem ||\n\t    IS_NULL(SCANENV_MEM_NODES(env)[backs[i]]))\n\t  return ONIGERR_INVALID_BACKREF;\n      }\n    }\n\n    tok->type = TK_BACKREF;\n    tok->u.backref.by_name = 1;\n    if (num == 1) {\n      tok->u.backref.num  = 1;\n      tok->u.backref.ref1 = backs[0];\n    }\n    else {\n      tok->u.backref.num  = num;\n      tok->u.backref.refs = backs;\n    }\n  }\n  *src = p;\n  return 0;\n}\n#endif\n\nstatic int\nfetch_token(OnigToken* tok, UChar** src, UChar* end, ScanEnv* env)\n{\n  int r, num;\n  OnigCodePoint c;\n  OnigEncoding enc = env->enc;\n  OnigSyntaxType* syn = env->syntax;\n  UChar* prev;\n  UChar* p = *src;\n  PFETCH_READY;\n\n start:\n  if (PEND) {\n    tok->type = TK_EOT;\n    return tok->type;\n  }\n\n  tok->type  = TK_STRING;\n  tok->base  = 0;\n  tok->backp = p;\n\n  PFETCH(c);\n  if (IS_MC_ESC_CODE(c, syn)) {\n    if (PEND) return ONIGERR_END_PATTERN_AT_ESCAPE;\n\n    tok->backp = p;\n    PFETCH(c);\n\n    tok->u.c = c;\n    tok->escaped = 1;\n    switch (c) {\n    case '*':\n      if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_ASTERISK_ZERO_INF)) break;\n      tok->type = TK_OP_REPEAT;\n      tok->u.repeat.lower = 0;\n      tok->u.repeat.upper = REPEAT_INFINITE;\n      goto greedy_check;\n      break;\n\n    case '+':\n      if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_PLUS_ONE_INF)) break;\n      tok->type = TK_OP_REPEAT;\n      tok->u.repeat.lower = 1;\n      tok->u.repeat.upper = REPEAT_INFINITE;\n      goto greedy_check;\n      break;\n\n    case '?':\n      if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_QMARK_ZERO_ONE)) break;\n      tok->type = TK_OP_REPEAT;\n      tok->u.repeat.lower = 0;\n      tok->u.repeat.upper = 1;\n    greedy_check:\n      if (!PEND && PPEEK_IS('?') &&\n\t  IS_SYNTAX_OP(syn, ONIG_SYN_OP_QMARK_NON_GREEDY)) {\n\tPFETCH(c);\n\ttok->u.repeat.greedy     = 0;\n\ttok->u.repeat.possessive = 0;\n      }\n      else {\n      possessive_check:\n\tif (!PEND && PPEEK_IS('+') &&\n\t    ((IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_PLUS_POSSESSIVE_REPEAT) &&\n\t      tok->type != TK_INTERVAL)  ||\n\t     (IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_PLUS_POSSESSIVE_INTERVAL) &&\n\t      tok->type == TK_INTERVAL))) {\n\t  PFETCH(c);\n\t  tok->u.repeat.greedy     = 1;\n\t  tok->u.repeat.possessive = 1;\n\t}\n\telse {\n\t  tok->u.repeat.greedy     = 1;\n\t  tok->u.repeat.possessive = 0;\n\t}\n      }\n      break;\n\n    case '{':\n      if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_BRACE_INTERVAL)) break;\n      r = fetch_range_quantifier(&p, end, tok, env);\n      if (r < 0) return r;  /* error */\n      if (r == 0) goto greedy_check;\n      else if (r == 2) { /* {n} */\n\tif (IS_SYNTAX_BV(syn, ONIG_SYN_FIXED_INTERVAL_IS_GREEDY_ONLY))\n\t  goto possessive_check;\n\n\tgoto greedy_check;\n      }\n      /* r == 1 : normal char */\n      break;\n\n    case '|':\n      if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_VBAR_ALT)) break;\n      tok->type = TK_ALT;\n      break;\n\n    case '(':\n      if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_LPAREN_SUBEXP)) break;\n      tok->type = TK_SUBEXP_OPEN;\n      break;\n\n    case ')':\n      if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_LPAREN_SUBEXP)) break;\n      tok->type = TK_SUBEXP_CLOSE;\n      break;\n\n    case 'w':\n      if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_W_WORD)) break;\n      tok->type = TK_CHAR_TYPE;\n      tok->u.prop.ctype = ONIGENC_CTYPE_WORD;\n      tok->u.prop.not   = 0;\n      break;\n\n    case 'W':\n      if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_W_WORD)) break;\n      tok->type = TK_CHAR_TYPE;\n      tok->u.prop.ctype = ONIGENC_CTYPE_WORD;\n      tok->u.prop.not   = 1;\n      break;\n\n    case 'b':\n      if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_B_WORD_BOUND)) break;\n      tok->type = TK_ANCHOR;\n      tok->u.anchor.subtype = ANCHOR_WORD_BOUND;\n      tok->u.anchor.ascii_range = IS_ASCII_RANGE(env->option)\n\t\t&& ! IS_WORD_BOUND_ALL_RANGE(env->option);\n      break;\n\n    case 'B':\n      if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_B_WORD_BOUND)) break;\n      tok->type = TK_ANCHOR;\n      tok->u.anchor.subtype = ANCHOR_NOT_WORD_BOUND;\n      tok->u.anchor.ascii_range = IS_ASCII_RANGE(env->option)\n\t\t&& ! IS_WORD_BOUND_ALL_RANGE(env->option);\n      break;\n\n#ifdef USE_WORD_BEGIN_END\n    case '<':\n      if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END)) break;\n      tok->type = TK_ANCHOR;\n      tok->u.anchor.subtype = ANCHOR_WORD_BEGIN;\n      tok->u.anchor.ascii_range = IS_ASCII_RANGE(env->option);\n      break;\n\n    case '>':\n      if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END)) break;\n      tok->type = TK_ANCHOR;\n      tok->u.anchor.subtype = ANCHOR_WORD_END;\n      tok->u.anchor.ascii_range = IS_ASCII_RANGE(env->option);\n      break;\n#endif\n\n    case 's':\n      if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_S_WHITE_SPACE)) break;\n      tok->type = TK_CHAR_TYPE;\n      tok->u.prop.ctype = ONIGENC_CTYPE_SPACE;\n      tok->u.prop.not   = 0;\n      break;\n\n    case 'S':\n      if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_S_WHITE_SPACE)) break;\n      tok->type = TK_CHAR_TYPE;\n      tok->u.prop.ctype = ONIGENC_CTYPE_SPACE;\n      tok->u.prop.not   = 1;\n      break;\n\n    case 'd':\n      if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_D_DIGIT)) break;\n      tok->type = TK_CHAR_TYPE;\n      tok->u.prop.ctype = ONIGENC_CTYPE_DIGIT;\n      tok->u.prop.not   = 0;\n      break;\n\n    case 'D':\n      if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_D_DIGIT)) break;\n      tok->type = TK_CHAR_TYPE;\n      tok->u.prop.ctype = ONIGENC_CTYPE_DIGIT;\n      tok->u.prop.not   = 1;\n      break;\n\n    case 'h':\n      if (! IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_H_XDIGIT)) break;\n      tok->type = TK_CHAR_TYPE;\n      tok->u.prop.ctype = ONIGENC_CTYPE_XDIGIT;\n      tok->u.prop.not   = 0;\n      break;\n\n    case 'H':\n      if (! IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_H_XDIGIT)) break;\n      tok->type = TK_CHAR_TYPE;\n      tok->u.prop.ctype = ONIGENC_CTYPE_XDIGIT;\n      tok->u.prop.not   = 1;\n      break;\n\n    case 'A':\n      if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_AZ_BUF_ANCHOR)) break;\n    begin_buf:\n      tok->type = TK_ANCHOR;\n      tok->u.anchor.subtype = ANCHOR_BEGIN_BUF;\n      break;\n\n    case 'Z':\n      if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_AZ_BUF_ANCHOR)) break;\n      tok->type = TK_ANCHOR;\n      tok->u.anchor.subtype = ANCHOR_SEMI_END_BUF;\n      break;\n\n    case 'z':\n      if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_AZ_BUF_ANCHOR)) break;\n    end_buf:\n      tok->type = TK_ANCHOR;\n      tok->u.anchor.subtype = ANCHOR_END_BUF;\n      break;\n\n    case 'G':\n      if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_CAPITAL_G_BEGIN_ANCHOR)) break;\n      tok->type = TK_ANCHOR;\n      tok->u.anchor.subtype = ANCHOR_BEGIN_POSITION;\n      break;\n\n    case '`':\n      if (! IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_GNU_BUF_ANCHOR)) break;\n      goto begin_buf;\n      break;\n\n    case '\\'':\n      if (! IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_GNU_BUF_ANCHOR)) break;\n      goto end_buf;\n      break;\n\n    case 'x':\n      if (PEND) break;\n\n      prev = p;\n      if (PPEEK_IS('{') && IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_X_BRACE_HEX8)) {\n\tPINC;\n\tnum = scan_unsigned_hexadecimal_number(&p, end, 0, 8, enc);\n\tif (num < 0) return ONIGERR_TOO_BIG_WIDE_CHAR_VALUE;\n\tif (!PEND) {\n          if (ONIGENC_IS_CODE_XDIGIT(enc, PPEEK))\n            return ONIGERR_TOO_LONG_WIDE_CHAR_VALUE;\n        }\n\n\tif ((p > prev + enclen(enc, prev)) && !PEND && PPEEK_IS('}')) {\n\t  PINC;\n\t  tok->type   = TK_CODE_POINT;\n\t  tok->u.code = (OnigCodePoint )num;\n\t}\n\telse {\n\t  /* can't read nothing or invalid format */\n\t  p = prev;\n\t}\n      }\n      else if (IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_X_HEX2)) {\n\tnum = scan_unsigned_hexadecimal_number(&p, end, 0, 2, enc);\n\tif (num < 0) return ONIGERR_TOO_BIG_NUMBER;\n\tif (p == prev) {  /* can't read nothing. */\n\t  num = 0; /* but, it's not error */\n\t}\n\ttok->type = TK_RAW_BYTE;\n\ttok->base = 16;\n\ttok->u.c  = num;\n      }\n      break;\n\n    case 'u':\n      if (PEND) break;\n\n      prev = p;\n      if (IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_U_HEX4)) {\n\tnum = scan_unsigned_hexadecimal_number(&p, end, 4, 4, enc);\n\tif (num < -1) return ONIGERR_TOO_SHORT_DIGITS;\n\telse if (num < 0) return ONIGERR_TOO_BIG_NUMBER;\n\tif (p == prev) {  /* can't read nothing. */\n\t  num = 0; /* but, it's not error */\n\t}\n\ttok->type   = TK_CODE_POINT;\n\ttok->base   = 16;\n\ttok->u.code = (OnigCodePoint )num;\n      }\n      break;\n\n    case '1': case '2': case '3': case '4':\n    case '5': case '6': case '7': case '8': case '9':\n      PUNFETCH;\n      prev = p;\n      num = onig_scan_unsigned_number(&p, end, enc);\n      if (num < 0 || num > ONIG_MAX_BACKREF_NUM) {\n        goto skip_backref;\n      }\n\n      if (IS_SYNTAX_OP(syn, ONIG_SYN_OP_DECIMAL_BACKREF) &&\n\t  (num <= env->num_mem || num <= 9)) { /* This spec. from GNU regex */\n\tif (IS_SYNTAX_BV(syn, ONIG_SYN_STRICT_CHECK_BACKREF)) {\n\t  if (num > env->num_mem || IS_NULL(SCANENV_MEM_NODES(env)[num]))\n\t    return ONIGERR_INVALID_BACKREF;\n\t}\n\n\ttok->type = TK_BACKREF;\n\ttok->u.backref.num     = 1;\n\ttok->u.backref.ref1    = num;\n\ttok->u.backref.by_name = 0;\n#ifdef USE_BACKREF_WITH_LEVEL\n\ttok->u.backref.exist_level = 0;\n#endif\n\tbreak;\n      }\n\n    skip_backref:\n      if (c == '8' || c == '9') {\n\t/* normal char */\n\tp = prev; PINC;\n\tbreak;\n      }\n\n      p = prev;\n      /* fall through */\n    case '0':\n      if (IS_SYNTAX_OP(syn, ONIG_SYN_OP_ESC_OCTAL3)) {\n\tprev = p;\n\tnum = scan_unsigned_octal_number(&p, end, (c == '0' ? 2:3), enc);\n\tif (num < 0) return ONIGERR_TOO_BIG_NUMBER;\n\tif (p == prev) {  /* can't read nothing. */\n\t  num = 0; /* but, it's not error */\n\t}\n\ttok->type = TK_RAW_BYTE;\n\ttok->base = 8;\n\ttok->u.c  = num;\n      }\n      else if (c != '0') {\n\tPINC;\n      }\n      break;\n\n#ifdef USE_NAMED_GROUP\n    case 'k':\n      if (IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_K_NAMED_BACKREF)) {\n\tPFETCH(c);\n\tif (c == '<' || c == '\\'') {\n\t  r = fetch_named_backref_token(c, tok, &p, end, env);\n\t  if (r < 0) return r;\n\t}\n\telse\n\t  PUNFETCH;\n      }\n      break;\n#endif\n\n#if defined(USE_SUBEXP_CALL) || defined(USE_NAMED_GROUP)\n    case 'g':\n#ifdef USE_NAMED_GROUP\n      if (IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_G_BRACE_BACKREF)) {\n\tPFETCH(c);\n\tif (c == '{') {\n\t  r = fetch_named_backref_token(c, tok, &p, end, env);\n\t  if (r < 0) return r;\n\t}\n\telse\n\t  PUNFETCH;\n      }\n#endif\n#ifdef USE_SUBEXP_CALL\n      if (IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_G_SUBEXP_CALL)) {\n\tPFETCH(c);\n\tif (c == '<' || c == '\\'') {\n\t  int gnum = -1, rel = 0;\n\t  UChar* name_end;\n\t  OnigCodePoint cnext;\n\n\t  cnext = PPEEK;\n\t  if (cnext == '0') {\n\t    PINC;\n\t    if (PPEEK_IS(get_name_end_code_point(c))) {  /* \\g<0>, \\g'0' */\n\t      PINC;\n\t      name_end = p;\n\t      gnum = 0;\n\t    }\n\t  }\n\t  else if (cnext == '+') {\n\t    PINC;\n\t    rel = 1;\n\t  }\n\t  prev = p;\n\t  if (gnum < 0) {\n\t    r = fetch_name((OnigCodePoint )c, &p, end, &name_end, env, &gnum, 1);\n\t    if (r < 0) return r;\n\t  }\n\n\t  tok->type = TK_CALL;\n\t  tok->u.call.name     = prev;\n\t  tok->u.call.name_end = name_end;\n\t  tok->u.call.gnum     = gnum;\n\t  tok->u.call.rel      = rel;\n\t}\n\telse\n\t  PUNFETCH;\n      }\n#endif\n      break;\n#endif\n\n    case 'Q':\n      if (IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_CAPITAL_Q_QUOTE)) {\n\ttok->type = TK_QUOTE_OPEN;\n      }\n      break;\n\n    case 'p':\n    case 'P':\n      if (PPEEK_IS('{') &&\n\t  IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_P_BRACE_CHAR_PROPERTY)) {\n\tPINC;\n\ttok->type = TK_CHAR_PROPERTY;\n\ttok->u.prop.not = (c == 'P' ? 1 : 0);\n\n\tif (IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_P_BRACE_CIRCUMFLEX_NOT)) {\n\t  PFETCH(c);\n\t  if (c == '^') {\n\t    tok->u.prop.not = (tok->u.prop.not == 0 ? 1 : 0);\n\t  }\n\t  else\n\t    PUNFETCH;\n\t}\n      }\n      break;\n\n    case 'R':\n      if (IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_CAPITAL_R_LINEBREAK)) {\n\ttok->type = TK_LINEBREAK;\n      }\n      break;\n\n    case 'X':\n      if (IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_CAPITAL_X_EXTENDED_GRAPHEME_CLUSTER)) {\n\ttok->type = TK_EXTENDED_GRAPHEME_CLUSTER;\n      }\n      break;\n\n    case 'K':\n      if (IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_ESC_CAPITAL_K_KEEP)) {\n\ttok->type = TK_KEEP;\n      }\n      break;\n\n    default:\n      PUNFETCH;\n      num = fetch_escaped_value(&p, end, env);\n      if (num < 0) return num;\n      /* set_raw: */\n      if (tok->u.c != num) {\n\ttok->type = TK_CODE_POINT;\n\ttok->u.code = (OnigCodePoint )num;\n      }\n      else { /* string */\n\tp = tok->backp + enclen(enc, tok->backp);\n      }\n      break;\n    }\n  }\n  else {\n    tok->u.c = c;\n    tok->escaped = 0;\n\n#ifdef USE_VARIABLE_META_CHARS\n    if ((c != ONIG_INEFFECTIVE_META_CHAR) &&\n\tIS_SYNTAX_OP(syn, ONIG_SYN_OP_VARIABLE_META_CHARACTERS)) {\n      if (c == MC_ANYCHAR(syn))\n\tgoto any_char;\n      else if (c == MC_ANYTIME(syn))\n\tgoto anytime;\n      else if (c == MC_ZERO_OR_ONE_TIME(syn))\n\tgoto zero_or_one_time;\n      else if (c == MC_ONE_OR_MORE_TIME(syn))\n\tgoto one_or_more_time;\n      else if (c == MC_ANYCHAR_ANYTIME(syn)) {\n\ttok->type = TK_ANYCHAR_ANYTIME;\n\tgoto out;\n      }\n    }\n#endif\n\n    switch (c) {\n    case '.':\n      if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_DOT_ANYCHAR)) break;\n#ifdef USE_VARIABLE_META_CHARS\n    any_char:\n#endif\n      tok->type = TK_ANYCHAR;\n      break;\n\n    case '*':\n      if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_ASTERISK_ZERO_INF)) break;\n#ifdef USE_VARIABLE_META_CHARS\n    anytime:\n#endif\n      tok->type = TK_OP_REPEAT;\n      tok->u.repeat.lower = 0;\n      tok->u.repeat.upper = REPEAT_INFINITE;\n      goto greedy_check;\n      break;\n\n    case '+':\n      if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_PLUS_ONE_INF)) break;\n#ifdef USE_VARIABLE_META_CHARS\n    one_or_more_time:\n#endif\n      tok->type = TK_OP_REPEAT;\n      tok->u.repeat.lower = 1;\n      tok->u.repeat.upper = REPEAT_INFINITE;\n      goto greedy_check;\n      break;\n\n    case '?':\n      if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_QMARK_ZERO_ONE)) break;\n#ifdef USE_VARIABLE_META_CHARS\n    zero_or_one_time:\n#endif\n      tok->type = TK_OP_REPEAT;\n      tok->u.repeat.lower = 0;\n      tok->u.repeat.upper = 1;\n      goto greedy_check;\n      break;\n\n    case '{':\n      if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_BRACE_INTERVAL)) break;\n      r = fetch_range_quantifier(&p, end, tok, env);\n      if (r < 0) return r;  /* error */\n      if (r == 0) goto greedy_check;\n      else if (r == 2) { /* {n} */\n\tif (IS_SYNTAX_BV(syn, ONIG_SYN_FIXED_INTERVAL_IS_GREEDY_ONLY))\n\t  goto possessive_check;\n\n\tgoto greedy_check;\n      }\n      /* r == 1 : normal char */\n      break;\n\n    case '|':\n      if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_VBAR_ALT)) break;\n      tok->type = TK_ALT;\n      break;\n\n    case '(':\n      if (PPEEK_IS('?') &&\n          IS_SYNTAX_OP2(syn, ONIG_SYN_OP2_QMARK_GROUP_EFFECT)) {\n        PINC;\n        if (PPEEK_IS('#')) {\n          PFETCH(c);\n          while (1) {\n            if (PEND) return ONIGERR_END_PATTERN_IN_GROUP;\n            PFETCH(c);\n            if (c == MC_ESC(syn)) {\n              if (!PEND) PFETCH(c);\n            }\n            else {\n              if (c == ')') break;\n            }\n          }\n          goto start;\n        }\n#ifdef USE_PERL_SUBEXP_CALL\n\t/* (?&name), (?n), (?R), (?0), (?+n), (?-n) */\n\tc = PPEEK;\n\tif ((c == '&' || c == 'R' || ONIGENC_IS_CODE_DIGIT(enc, c)) &&\n\t    IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_QMARK_SUBEXP_CALL)) {\n\t  /* (?&name), (?n), (?R), (?0) */\n\t  int gnum;\n\t  UChar *name;\n\t  UChar *name_end;\n\n\t  if (c == 'R' || c == '0') {\n\t    PINC;   /* skip 'R' / '0' */\n\t    if (!PPEEK_IS(')')) return ONIGERR_INVALID_GROUP_NAME;\n\t    PINC;   /* skip ')' */\n\t    name_end = name = p;\n\t    gnum = 0;\n\t  }\n\t  else {\n\t    int numref = 1;\n\t    if (c == '&') {     /* (?&name) */\n\t      PINC;\n\t      numref = 0;       /* don't allow number name */\n\t    }\n\t    name = p;\n\t    r = fetch_name((OnigCodePoint )'(', &p, end, &name_end, env, &gnum, numref);\n\t    if (r < 0) return r;\n\t  }\n\n\t  tok->type = TK_CALL;\n\t  tok->u.call.name     = name;\n\t  tok->u.call.name_end = name_end;\n\t  tok->u.call.gnum     = gnum;\n\t  tok->u.call.rel      = 0;\n\t  break;\n\t}\n\telse if ((c == '-' || c == '+') &&\n\t    IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_QMARK_SUBEXP_CALL)) {\n\t  /* (?+n), (?-n) */\n\t  int gnum;\n\t  UChar *name;\n\t  UChar *name_end;\n\t  OnigCodePoint cnext;\n\t  PFETCH_READY;\n\n\t  PINC;     /* skip '-' / '+' */\n\t  cnext = PPEEK;\n\t  if (ONIGENC_IS_CODE_DIGIT(enc, cnext)) {\n\t    if (c == '-') PUNFETCH;\n\t    name = p;\n\t    r = fetch_name((OnigCodePoint )'(', &p, end, &name_end, env, &gnum, 1);\n\t    if (r < 0) return r;\n\n\t    tok->type = TK_CALL;\n\t    tok->u.call.name     = name;\n\t    tok->u.call.name_end = name_end;\n\t    tok->u.call.gnum     = gnum;\n\t    tok->u.call.rel      = 1;\n\t    break;\n\t  }\n\t}\n#endif /* USE_PERL_SUBEXP_CALL */\n#ifdef USE_CAPITAL_P_NAMED_GROUP\n\tif (PPEEK_IS('P') &&\n\t    IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_QMARK_CAPITAL_P_NAMED_GROUP)) {\n\t  int gnum;\n\t  UChar *name;\n\t  UChar *name_end;\n\t  PFETCH_READY;\n\n\t  PINC;     /* skip 'P' */\n\t  PFETCH(c);\n\t  if (c == '=') {       /* (?P=name): backref */\n\t    r = fetch_named_backref_token((OnigCodePoint )'(', tok, &p, end, env);\n\t    if (r < 0) return r;\n\t    break;\n\t  }\n\t  else if (c == '>') {  /* (?P>name): subexp call */\n\t    name = p;\n\t    r = fetch_name((OnigCodePoint )'(', &p, end, &name_end, env, &gnum, 0);\n\t    if (r < 0) return r;\n\n\t    tok->type = TK_CALL;\n\t    tok->u.call.name     = name;\n\t    tok->u.call.name_end = name_end;\n\t    tok->u.call.gnum     = gnum;\n\t    tok->u.call.rel      = 0;\n\t    break;\n\t  }\n\t  PUNFETCH;\n\t}\n#endif /* USE_CAPITAL_P_NAMED_GROUP */\n        PUNFETCH;\n      }\n\n      if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_LPAREN_SUBEXP)) break;\n      tok->type = TK_SUBEXP_OPEN;\n      break;\n\n    case ')':\n      if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_LPAREN_SUBEXP)) break;\n      tok->type = TK_SUBEXP_CLOSE;\n      break;\n\n    case '^':\n      if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_LINE_ANCHOR)) break;\n      tok->type = TK_ANCHOR;\n      tok->u.anchor.subtype = (IS_SINGLELINE(env->option)\n\t\t\t       ? ANCHOR_BEGIN_BUF : ANCHOR_BEGIN_LINE);\n      break;\n\n    case '$':\n      if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_LINE_ANCHOR)) break;\n      tok->type = TK_ANCHOR;\n      tok->u.anchor.subtype = (IS_SINGLELINE(env->option)\n\t\t\t       ? ANCHOR_SEMI_END_BUF : ANCHOR_END_LINE);\n      break;\n\n    case '[':\n      if (! IS_SYNTAX_OP(syn, ONIG_SYN_OP_BRACKET_CC)) break;\n      tok->type = TK_CC_OPEN;\n      break;\n\n    case ']':\n      if (*src > env->pattern)   /* /].../ is allowed. */\n\tCLOSE_BRACKET_WITHOUT_ESC_WARN(env, (UChar* )\"]\");\n      break;\n\n    case '#':\n      if (IS_EXTEND(env->option)) {\n\twhile (!PEND) {\n\t  PFETCH(c);\n\t  if (ONIGENC_IS_CODE_NEWLINE(enc, c))\n\t    break;\n\t}\n\tgoto start;\n\tbreak;\n      }\n      break;\n\n    case ' ': case '\\t': case '\\n': case '\\r': case '\\f':\n      if (IS_EXTEND(env->option))\n\tgoto start;\n      break;\n\n    default:\n      /* string */\n      break;\n    }\n  }\n\n#ifdef USE_VARIABLE_META_CHARS\n out:\n#endif\n  *src = p;\n  return tok->type;\n}\n\nstatic int\nadd_ctype_to_cc_by_range(CClassNode* cc, int ctype ARG_UNUSED, int not,\n\t\t\t OnigEncoding enc ARG_UNUSED,\n                         OnigCodePoint sb_out, const OnigCodePoint mbr[])\n{\n  int i, r;\n  OnigCodePoint j;\n\n  int n = ONIGENC_CODE_RANGE_NUM(mbr);\n\n  if (not == 0) {\n    for (i = 0; i < n; i++) {\n      for (j  = ONIGENC_CODE_RANGE_FROM(mbr, i);\n           j <= ONIGENC_CODE_RANGE_TO(mbr, i); j++) {\n\tif (j >= sb_out) {\n\t  if (j > ONIGENC_CODE_RANGE_FROM(mbr, i)) {\n\t    r = add_code_range_to_buf(&(cc->mbuf), j,\n\t\t\t\t      ONIGENC_CODE_RANGE_TO(mbr, i));\n\t    if (r != 0) return r;\n\t    i++;\n\t  }\n\n\t  goto sb_end;\n\t}\n        BITSET_SET_BIT(cc->bs, j);\n      }\n    }\n\n  sb_end:\n    for ( ; i < n; i++) {\n      r = add_code_range_to_buf(&(cc->mbuf),\n                                ONIGENC_CODE_RANGE_FROM(mbr, i),\n                                ONIGENC_CODE_RANGE_TO(mbr, i));\n      if (r != 0) return r;\n    }\n  }\n  else {\n    OnigCodePoint prev = 0;\n\n    for (i = 0; i < n; i++) {\n      for (j = prev;\n\t   j < ONIGENC_CODE_RANGE_FROM(mbr, i); j++) {\n\tif (j >= sb_out) {\n\t  goto sb_end2;\n\t}\n\tBITSET_SET_BIT(cc->bs, j);\n      }\n      prev = ONIGENC_CODE_RANGE_TO(mbr, i) + 1;\n    }\n    for (j = prev; j < sb_out; j++) {\n      BITSET_SET_BIT(cc->bs, j);\n    }\n\n  sb_end2:\n    prev = sb_out;\n\n    for (i = 0; i < n; i++) {\n      if (prev < ONIGENC_CODE_RANGE_FROM(mbr, i)) {\n\tr = add_code_range_to_buf(&(cc->mbuf), prev,\n                                  ONIGENC_CODE_RANGE_FROM(mbr, i) - 1);\n\tif (r != 0) return r;\n      }\n      prev = ONIGENC_CODE_RANGE_TO(mbr, i) + 1;\n    }\n    if (prev < 0x7fffffff) {\n      r = add_code_range_to_buf(&(cc->mbuf), prev, 0x7fffffff);\n      if (r != 0) return r;\n    }\n  }\n\n  return 0;\n}\n\nstatic int\nadd_ctype_to_cc(CClassNode* cc, int ctype, int not, int char_prop, ScanEnv* env)\n{\n  int maxcode, ascii_range;\n  int c, r;\n  const OnigCodePoint *ranges;\n  OnigCodePoint sb_out;\n  OnigEncoding enc = env->enc;\n  OnigOptionType option = env->option;\n\n  ascii_range = IS_ASCII_RANGE(option) && (char_prop == 0);\n\n  r = ONIGENC_GET_CTYPE_CODE_RANGE(enc, ctype, &sb_out, &ranges);\n  if (r == 0) {\n    if (ascii_range) {\n      CClassNode ccwork;\n      initialize_cclass(&ccwork);\n      r = add_ctype_to_cc_by_range(&ccwork, ctype, not, env->enc, sb_out,\n\t\t\t\t   ranges);\n      if (r == 0) {\n\tif (not) {\n\t  r = add_code_range_to_buf(&(ccwork.mbuf), 0x80, ONIG_LAST_CODE_POINT);\n\t}\n\telse {\n\t  CClassNode ccascii;\n\t  initialize_cclass(&ccascii);\n\t  if (ONIGENC_MBC_MINLEN(env->enc) > 1) {\n\t    add_code_range(&(ccascii.mbuf), env, 0x00, 0x7F);\n\t  }\n\t  else {\n\t    bitset_set_range(ccascii.bs, 0x00, 0x7F);\n\t  }\n\t  r = and_cclass(&ccwork, &ccascii, enc);\n\t  if (IS_NOT_NULL(ccascii.mbuf)) bbuf_free(ccascii.mbuf);\n\t}\n\tif (r == 0) {\n\t  r = or_cclass(cc, &ccwork, enc);\n\t}\n\tif (IS_NOT_NULL(ccwork.mbuf)) bbuf_free(ccwork.mbuf);\n      }\n    }\n    else {\n      r = add_ctype_to_cc_by_range(cc, ctype, not, env->enc, sb_out, ranges);\n    }\n    return r;\n  }\n  else if (r != ONIG_NO_SUPPORT_CONFIG) {\n    return r;\n  }\n\n  maxcode = ascii_range ? 0x80 : SINGLE_BYTE_SIZE;\n  r = 0;\n  switch (ctype) {\n  case ONIGENC_CTYPE_ALPHA:\n  case ONIGENC_CTYPE_BLANK:\n  case ONIGENC_CTYPE_CNTRL:\n  case ONIGENC_CTYPE_DIGIT:\n  case ONIGENC_CTYPE_LOWER:\n  case ONIGENC_CTYPE_PUNCT:\n  case ONIGENC_CTYPE_SPACE:\n  case ONIGENC_CTYPE_UPPER:\n  case ONIGENC_CTYPE_XDIGIT:\n  case ONIGENC_CTYPE_ASCII:\n  case ONIGENC_CTYPE_ALNUM:\n    if (not != 0) {\n      for (c = 0; c < SINGLE_BYTE_SIZE; c++) {\n\tif (! ONIGENC_IS_CODE_CTYPE(enc, (OnigCodePoint )c, ctype))\n\t  BITSET_SET_BIT(cc->bs, c);\n      }\n      ADD_ALL_MULTI_BYTE_RANGE(enc, cc->mbuf);\n    }\n    else {\n      for (c = 0; c < SINGLE_BYTE_SIZE; c++) {\n\tif (ONIGENC_IS_CODE_CTYPE(enc, (OnigCodePoint )c, ctype))\n\t  BITSET_SET_BIT(cc->bs, c);\n      }\n    }\n    break;\n\n  case ONIGENC_CTYPE_GRAPH:\n  case ONIGENC_CTYPE_PRINT:\n    if (not != 0) {\n      for (c = 0; c < SINGLE_BYTE_SIZE; c++) {\n\tif (! ONIGENC_IS_CODE_CTYPE(enc, (OnigCodePoint )c, ctype)\n\t    || c >= maxcode)\n\t  BITSET_SET_BIT(cc->bs, c);\n      }\n      if (ascii_range)\n        ADD_ALL_MULTI_BYTE_RANGE(enc, cc->mbuf);\n    }\n    else {\n      for (c = 0; c < maxcode; c++) {\n\tif (ONIGENC_IS_CODE_CTYPE(enc, (OnigCodePoint )c, ctype))\n\t  BITSET_SET_BIT(cc->bs, c);\n      }\n      if (! ascii_range)\n        ADD_ALL_MULTI_BYTE_RANGE(enc, cc->mbuf);\n    }\n    break;\n\n  case ONIGENC_CTYPE_WORD:\n    if (not == 0) {\n      for (c = 0; c < maxcode; c++) {\n\tif (ONIGENC_IS_CODE_WORD(enc, c)) BITSET_SET_BIT(cc->bs, c);\n      }\n      if (! ascii_range)\n        ADD_ALL_MULTI_BYTE_RANGE(enc, cc->mbuf);\n    }\n    else {\n      for (c = 0; c < SINGLE_BYTE_SIZE; c++) {\n        if ((ONIGENC_CODE_TO_MBCLEN(enc, c) > 0) /* check invalid code point */\n\t    && (! ONIGENC_IS_CODE_WORD(enc, c) || c >= maxcode))\n\t  BITSET_SET_BIT(cc->bs, c);\n      }\n      if (ascii_range)\n        ADD_ALL_MULTI_BYTE_RANGE(enc, cc->mbuf);\n    }\n    break;\n\n  default:\n    return ONIGERR_PARSER_BUG;\n    break;\n  }\n\n  return r;\n}\n\nstatic int\nparse_posix_bracket(CClassNode* cc, UChar** src, UChar* end, ScanEnv* env)\n{\n#define POSIX_BRACKET_CHECK_LIMIT_LENGTH  20\n#define POSIX_BRACKET_NAME_MIN_LEN         4\n\n  static const PosixBracketEntryType PBS[] = {\n    { (UChar* )\"alnum\",  ONIGENC_CTYPE_ALNUM,  5 },\n    { (UChar* )\"alpha\",  ONIGENC_CTYPE_ALPHA,  5 },\n    { (UChar* )\"blank\",  ONIGENC_CTYPE_BLANK,  5 },\n    { (UChar* )\"cntrl\",  ONIGENC_CTYPE_CNTRL,  5 },\n    { (UChar* )\"digit\",  ONIGENC_CTYPE_DIGIT,  5 },\n    { (UChar* )\"graph\",  ONIGENC_CTYPE_GRAPH,  5 },\n    { (UChar* )\"lower\",  ONIGENC_CTYPE_LOWER,  5 },\n    { (UChar* )\"print\",  ONIGENC_CTYPE_PRINT,  5 },\n    { (UChar* )\"punct\",  ONIGENC_CTYPE_PUNCT,  5 },\n    { (UChar* )\"space\",  ONIGENC_CTYPE_SPACE,  5 },\n    { (UChar* )\"upper\",  ONIGENC_CTYPE_UPPER,  5 },\n    { (UChar* )\"xdigit\", ONIGENC_CTYPE_XDIGIT, 6 },\n    { (UChar* )\"ascii\",  ONIGENC_CTYPE_ASCII,  5 },\n    { (UChar* )\"word\",   ONIGENC_CTYPE_WORD,   4 },\n    { (UChar* )NULL,     -1, 0 }\n  };\n\n  const PosixBracketEntryType *pb;\n  int not, i, r;\n  OnigCodePoint c;\n  OnigEncoding enc = env->enc;\n  UChar *p = *src;\n  PFETCH_READY;\n\n  if (PPEEK_IS('^')) {\n    PINC;\n    not = 1;\n  }\n  else\n    not = 0;\n\n  if (onigenc_strlen(enc, p, end) < POSIX_BRACKET_NAME_MIN_LEN + 3)\n    goto not_posix_bracket;\n\n  for (pb = PBS; IS_NOT_NULL(pb->name); pb++) {\n    if (onigenc_with_ascii_strncmp(enc, p, end, pb->name, pb->len) == 0) {\n      p = (UChar* )onigenc_step(enc, p, end, pb->len);\n      if (onigenc_with_ascii_strncmp(enc, p, end, (UChar* )\":]\", 2) != 0)\n\treturn ONIGERR_INVALID_POSIX_BRACKET_TYPE;\n\n      r = add_ctype_to_cc(cc, pb->ctype, not,\n\t    IS_POSIX_BRACKET_ALL_RANGE(env->option),\n\t    env);\n      if (r != 0) return r;\n\n      PINC; PINC;\n      *src = p;\n      return 0;\n    }\n  }\n\n not_posix_bracket:\n  c = 0;\n  i = 0;\n  while (!PEND && ((c = PPEEK) != ':') && c != ']') {\n    PINC;\n    if (++i > POSIX_BRACKET_CHECK_LIMIT_LENGTH) break;\n  }\n  if (c == ':' && ! PEND) {\n    PINC;\n    if (! PEND) {\n      PFETCH(c);\n      if (c == ']')\n\treturn ONIGERR_INVALID_POSIX_BRACKET_TYPE;\n    }\n  }\n\n  return 1;  /* 1: is not POSIX bracket, but no error. */\n}\n\nstatic int\nfetch_char_property_to_ctype(UChar** src, UChar* end, ScanEnv* env)\n{\n  int r;\n  OnigCodePoint c;\n  OnigEncoding enc = env->enc;\n  UChar *prev, *start, *p = *src;\n  PFETCH_READY;\n\n  r = 0;\n  start = prev = p;\n\n  while (!PEND) {\n    prev = p;\n    PFETCH(c);\n    if (c == '}') {\n      r = ONIGENC_PROPERTY_NAME_TO_CTYPE(enc, start, prev);\n      if (r < 0) break;\n\n      *src = p;\n      return r;\n    }\n    else if (c == '(' || c == ')' || c == '{' || c == '|') {\n      r = ONIGERR_INVALID_CHAR_PROPERTY_NAME;\n      break;\n    }\n  }\n\n  onig_scan_env_set_error_string(env, r, *src, prev);\n  return r;\n}\n\nstatic int\nparse_char_property(Node** np, OnigToken* tok, UChar** src, UChar* end,\n\t\t    ScanEnv* env)\n{\n  int r, ctype;\n  CClassNode* cc;\n\n  ctype = fetch_char_property_to_ctype(src, end, env);\n  if (ctype < 0) return ctype;\n\n  *np = node_new_cclass();\n  CHECK_NULL_RETURN_MEMERR(*np);\n  cc = NCCLASS(*np);\n  r = add_ctype_to_cc(cc, ctype, 0, 1, env);\n  if (r != 0) return r;\n  if (tok->u.prop.not != 0) NCCLASS_SET_NOT(cc);\n\n  return 0;\n}\n\n\nenum CCSTATE {\n  CCS_VALUE,\n  CCS_RANGE,\n  CCS_COMPLETE,\n  CCS_START\n};\n\nenum CCVALTYPE {\n  CCV_SB,\n  CCV_CODE_POINT,\n  CCV_CLASS\n};\n\nstatic int\nnext_state_class(CClassNode* cc, OnigCodePoint* vs, enum CCVALTYPE* type,\n\t\t enum CCSTATE* state, ScanEnv* env)\n{\n  int r;\n\n  if (*state == CCS_RANGE)\n    return ONIGERR_CHAR_CLASS_VALUE_AT_END_OF_RANGE;\n\n  if (*state == CCS_VALUE && *type != CCV_CLASS) {\n    if (*type == CCV_SB)\n      BITSET_SET_BIT(cc->bs, (int )(*vs));\n    else if (*type == CCV_CODE_POINT) {\n      r = add_code_range(&(cc->mbuf), env, *vs, *vs);\n      if (r < 0) return r;\n    }\n  }\n\n  *state = CCS_VALUE;\n  *type  = CCV_CLASS;\n  return 0;\n}\n\nstatic int\nnext_state_val(CClassNode* cc, OnigCodePoint *vs, OnigCodePoint v,\n\t       int* vs_israw, int v_israw,\n\t       enum CCVALTYPE intype, enum CCVALTYPE* type,\n\t       enum CCSTATE* state, ScanEnv* env)\n{\n  int r;\n\n  switch (*state) {\n  case CCS_VALUE:\n    if (*type == CCV_SB)\n      BITSET_SET_BIT(cc->bs, (int )(*vs));\n    else if (*type == CCV_CODE_POINT) {\n      r = add_code_range(&(cc->mbuf), env, *vs, *vs);\n      if (r < 0) return r;\n    }\n    break;\n\n  case CCS_RANGE:\n    if (intype == *type) {\n      if (intype == CCV_SB) {\n        if (*vs > 0xff || v > 0xff)\n          return ONIGERR_INVALID_CODE_POINT_VALUE;\n\n\tif (*vs > v) {\n\t  if (IS_SYNTAX_BV(env->syntax, ONIG_SYN_ALLOW_EMPTY_RANGE_IN_CC))\n\t    goto ccs_range_end;\n\t  else\n\t    return ONIGERR_EMPTY_RANGE_IN_CHAR_CLASS;\n\t}\n\tbitset_set_range(cc->bs, (int )*vs, (int )v);\n      }\n      else {\n\tr = add_code_range(&(cc->mbuf), env, *vs, v);\n\tif (r < 0) return r;\n      }\n    }\n    else {\n#if 0\n      if (intype == CCV_CODE_POINT && *type == CCV_SB) {\n#endif\n\tif (*vs > v) {\n\t  if (IS_SYNTAX_BV(env->syntax, ONIG_SYN_ALLOW_EMPTY_RANGE_IN_CC))\n\t    goto ccs_range_end;\n\t  else\n\t    return ONIGERR_EMPTY_RANGE_IN_CHAR_CLASS;\n\t}\n\tbitset_set_range(cc->bs, (int )*vs, (int )(v < 0xff ? v : 0xff));\n\tr = add_code_range(&(cc->mbuf), env, (OnigCodePoint )*vs, v);\n\tif (r < 0) return r;\n#if 0\n      }\n      else\n\treturn ONIGERR_MISMATCH_CODE_LENGTH_IN_CLASS_RANGE;\n#endif\n    }\n  ccs_range_end:\n    *state = CCS_COMPLETE;\n    break;\n\n  case CCS_COMPLETE:\n  case CCS_START:\n    *state = CCS_VALUE;\n    break;\n\n  default:\n    break;\n  }\n\n  *vs_israw = v_israw;\n  *vs       = v;\n  *type     = intype;\n  return 0;\n}\n\nstatic int\ncode_exist_check(OnigCodePoint c, UChar* from, UChar* end, int ignore_escaped,\n\t\t ScanEnv* env)\n{\n  int in_esc;\n  OnigCodePoint code;\n  OnigEncoding enc = env->enc;\n  UChar* p = from;\n  PFETCH_READY;\n\n  in_esc = 0;\n  while (! PEND) {\n    if (ignore_escaped && in_esc) {\n      in_esc = 0;\n    }\n    else {\n      PFETCH(code);\n      if (code == c) return 1;\n      if (code == MC_ESC(env->syntax)) in_esc = 1;\n    }\n  }\n  return 0;\n}\n\nstatic int\nparse_char_class(Node** np, OnigToken* tok, UChar** src, UChar* end,\n\t\t ScanEnv* env)\n{\n  int r, neg, len, fetched, and_start;\n  OnigCodePoint v, vs;\n  UChar *p;\n  Node* node;\n  CClassNode *cc, *prev_cc;\n  CClassNode work_cc;\n\n  enum CCSTATE state;\n  enum CCVALTYPE val_type, in_type;\n  int val_israw, in_israw;\n\n  prev_cc = (CClassNode* )NULL;\n  *np = NULL_NODE;\n  r = fetch_token_in_cc(tok, src, end, env);\n  if (r == TK_CHAR && tok->u.c == '^' && tok->escaped == 0) {\n    neg = 1;\n    r = fetch_token_in_cc(tok, src, end, env);\n  }\n  else {\n    neg = 0;\n  }\n\n  if (r < 0) return r;\n  if (r == TK_CC_CLOSE) {\n    if (! code_exist_check((OnigCodePoint )']',\n                           *src, env->pattern_end, 1, env))\n      return ONIGERR_EMPTY_CHAR_CLASS;\n\n    CC_ESC_WARN(env, (UChar* )\"]\");\n    r = tok->type = TK_CHAR;  /* allow []...] */\n  }\n\n  *np = node = node_new_cclass();\n  CHECK_NULL_RETURN_MEMERR(node);\n  cc = NCCLASS(node);\n\n  and_start = 0;\n  state = CCS_START;\n  p = *src;\n  while (r != TK_CC_CLOSE) {\n    fetched = 0;\n    switch (r) {\n    case TK_CHAR:\n      if ((tok->u.code >= SINGLE_BYTE_SIZE) ||\n\t  (len = ONIGENC_CODE_TO_MBCLEN(env->enc, tok->u.c)) > 1) {\n\tin_type = CCV_CODE_POINT;\n      }\n      else if (len < 0) {\n\tr = len;\n\tgoto err;\n      }\n      else {\n      sb_char:\n\tin_type = CCV_SB;\n      }\n      v = (OnigCodePoint )tok->u.c;\n      in_israw = 0;\n      goto val_entry2;\n      break;\n\n    case TK_RAW_BYTE:\n      /* tok->base != 0 : octal or hexadec. */\n      if (! ONIGENC_IS_SINGLEBYTE(env->enc) && tok->base != 0) {\n\tUChar buf[ONIGENC_CODE_TO_MBC_MAXLEN];\n\tUChar* bufe = buf + ONIGENC_CODE_TO_MBC_MAXLEN;\n\tUChar* psave = p;\n\tint i, base = tok->base;\n\n\tbuf[0] = (UChar )tok->u.c;\n\tfor (i = 1; i < ONIGENC_MBC_MAXLEN(env->enc); i++) {\n\t  r = fetch_token_in_cc(tok, &p, end, env);\n\t  if (r < 0) goto err;\n\t  if (r != TK_RAW_BYTE || tok->base != base) {\n\t    fetched = 1;\n\t    break;\n\t  }\n\t  buf[i] = (UChar )tok->u.c;\n\t}\n\n\tif (i < ONIGENC_MBC_MINLEN(env->enc)) {\n\t  r = ONIGERR_TOO_SHORT_MULTI_BYTE_STRING;\n\t  goto err;\n\t}\n\n\tlen = enclen(env->enc, buf);\n\tif (i < len) {\n\t  r = ONIGERR_TOO_SHORT_MULTI_BYTE_STRING;\n\t  goto err;\n\t}\n\telse if (i > len) { /* fetch back */\n\t  p = psave;\n\t  for (i = 1; i < len; i++) {\n\t    r = fetch_token_in_cc(tok, &p, end, env);\n\t  }\n\t  fetched = 0;\n\t}\n\n\tif (i == 1) {\n\t  v = (OnigCodePoint )buf[0];\n\t  goto raw_single;\n\t}\n\telse {\n\t  v = ONIGENC_MBC_TO_CODE(env->enc, buf, bufe);\n\t  in_type = CCV_CODE_POINT;\n\t}\n      }\n      else {\n\tv = (OnigCodePoint )tok->u.c;\n      raw_single:\n\tin_type = CCV_SB;\n      }\n      in_israw = 1;\n      goto val_entry2;\n      break;\n\n    case TK_CODE_POINT:\n      v = tok->u.code;\n      in_israw = 1;\n    val_entry:\n      len = ONIGENC_CODE_TO_MBCLEN(env->enc, v);\n      if (len < 0) {\n\tr = len;\n\tgoto err;\n      }\n      in_type = (len == 1 ? CCV_SB : CCV_CODE_POINT);\n    val_entry2:\n      r = next_state_val(cc, &vs, v, &val_israw, in_israw, in_type, &val_type,\n\t\t\t &state, env);\n      if (r != 0) goto err;\n      break;\n\n    case TK_POSIX_BRACKET_OPEN:\n      r = parse_posix_bracket(cc, &p, end, env);\n      if (r < 0) goto err;\n      if (r == 1) {  /* is not POSIX bracket */\n\tCC_ESC_WARN(env, (UChar* )\"[\");\n\tp = tok->backp;\n\tv = (OnigCodePoint )tok->u.c;\n\tin_israw = 0;\n\tgoto val_entry;\n      }\n      goto next_class;\n      break;\n\n    case TK_CHAR_TYPE:\n      r = add_ctype_to_cc(cc, tok->u.prop.ctype, tok->u.prop.not, 0, env);\n      if (r != 0) return r;\n\n    next_class:\n      r = next_state_class(cc, &vs, &val_type, &state, env);\n      if (r != 0) goto err;\n      break;\n\n    case TK_CHAR_PROPERTY:\n      {\n\tint ctype;\n\n\tctype = fetch_char_property_to_ctype(&p, end, env);\n\tif (ctype < 0) return ctype;\n\tr = add_ctype_to_cc(cc, ctype, tok->u.prop.not, 1, env);\n\tif (r != 0) return r;\n\tgoto next_class;\n      }\n      break;\n\n    case TK_CC_RANGE:\n      if (state == CCS_VALUE) {\n\tr = fetch_token_in_cc(tok, &p, end, env);\n\tif (r < 0) goto err;\n\tfetched = 1;\n\tif (r == TK_CC_CLOSE) { /* allow [x-] */\n\trange_end_val:\n\t  v = (OnigCodePoint )'-';\n\t  in_israw = 0;\n\t  goto val_entry;\n\t}\n\telse if (r == TK_CC_AND) {\n\t  CC_ESC_WARN(env, (UChar* )\"-\");\n\t  goto range_end_val;\n\t}\n\tstate = CCS_RANGE;\n      }\n      else if (state == CCS_START) {\n\t/* [-xa] is allowed */\n\tv = (OnigCodePoint )tok->u.c;\n\tin_israw = 0;\n\n\tr = fetch_token_in_cc(tok, &p, end, env);\n\tif (r < 0) goto err;\n\tfetched = 1;\n\t/* [--x] or [a&&-x] is warned. */\n\tif (r == TK_CC_RANGE || and_start != 0)\n\t  CC_ESC_WARN(env, (UChar* )\"-\");\n\n\tgoto val_entry;\n      }\n      else if (state == CCS_RANGE) {\n\tCC_ESC_WARN(env, (UChar* )\"-\");\n\tgoto sb_char;  /* [!--x] is allowed */\n      }\n      else { /* CCS_COMPLETE */\n\tr = fetch_token_in_cc(tok, &p, end, env);\n\tif (r < 0) goto err;\n\tfetched = 1;\n\tif (r == TK_CC_CLOSE) goto range_end_val; /* allow [a-b-] */\n\telse if (r == TK_CC_AND) {\n\t  CC_ESC_WARN(env, (UChar* )\"-\");\n\t  goto range_end_val;\n\t}\n\n\tif (IS_SYNTAX_BV(env->syntax, ONIG_SYN_ALLOW_DOUBLE_RANGE_OP_IN_CC)) {\n\t  CC_ESC_WARN(env, (UChar* )\"-\");\n\t  goto range_end_val;   /* [0-9-a] is allowed as [0-9\\-a] */\n\t}\n\tr = ONIGERR_UNMATCHED_RANGE_SPECIFIER_IN_CHAR_CLASS;\n\tgoto err;\n      }\n      break;\n\n    case TK_CC_CC_OPEN: /* [ */\n      {\n\tNode *anode;\n\tCClassNode* acc;\n\n\tr = parse_char_class(&anode, tok, &p, end, env);\n\tif (r == 0) {\n\t  acc = NCCLASS(anode);\n\t  r = or_cclass(cc, acc, env->enc);\n\t}\n\tonig_node_free(anode);\n\tif (r != 0) goto err;\n      }\n      break;\n\n    case TK_CC_AND: /* && */\n      {\n\tif (state == CCS_VALUE) {\n\t  r = next_state_val(cc, &vs, 0, &val_israw, 0, val_type,\n\t\t\t     &val_type, &state, env);\n\t  if (r != 0) goto err;\n\t}\n\t/* initialize local variables */\n\tand_start = 1;\n\tstate = CCS_START;\n\n\tif (IS_NOT_NULL(prev_cc)) {\n\t  r = and_cclass(prev_cc, cc, env->enc);\n\t  if (r != 0) goto err;\n\t  bbuf_free(cc->mbuf);\n\t}\n\telse {\n\t  prev_cc = cc;\n\t  cc = &work_cc;\n\t}\n\tinitialize_cclass(cc);\n      }\n      break;\n\n    case TK_EOT:\n      r = ONIGERR_PREMATURE_END_OF_CHAR_CLASS;\n      goto err;\n      break;\n    default:\n      r = ONIGERR_PARSER_BUG;\n      goto err;\n      break;\n    }\n\n    if (fetched)\n      r = tok->type;\n    else {\n      r = fetch_token_in_cc(tok, &p, end, env);\n      if (r < 0) goto err;\n    }\n  }\n\n  if (state == CCS_VALUE) {\n    r = next_state_val(cc, &vs, 0, &val_israw, 0, val_type,\n\t\t       &val_type, &state, env);\n    if (r != 0) goto err;\n  }\n\n  if (IS_NOT_NULL(prev_cc)) {\n    r = and_cclass(prev_cc, cc, env->enc);\n    if (r != 0) goto err;\n    bbuf_free(cc->mbuf);\n    cc = prev_cc;\n  }\n\n  if (neg != 0)\n    NCCLASS_SET_NOT(cc);\n  else\n    NCCLASS_CLEAR_NOT(cc);\n  if (IS_NCCLASS_NOT(cc) &&\n      IS_SYNTAX_BV(env->syntax, ONIG_SYN_NOT_NEWLINE_IN_NEGATIVE_CC)) {\n    int is_empty;\n\n    is_empty = (IS_NULL(cc->mbuf) ? 1 : 0);\n    if (is_empty != 0)\n      BITSET_IS_EMPTY(cc->bs, is_empty);\n\n    if (is_empty == 0) {\n#define NEWLINE_CODE    0x0a\n\n      if (ONIGENC_IS_CODE_NEWLINE(env->enc, NEWLINE_CODE)) {\n        if (ONIGENC_CODE_TO_MBCLEN(env->enc, NEWLINE_CODE) == 1)\n          BITSET_SET_BIT(cc->bs, NEWLINE_CODE);\n        else {\n          r = add_code_range(&(cc->mbuf), env, NEWLINE_CODE, NEWLINE_CODE);\n          if (r < 0) goto err;\n        }\n      }\n    }\n  }\n  *src = p;\n  return 0;\n\n err:\n  if (cc != NCCLASS(*np))\n    bbuf_free(cc->mbuf);\n  return r;\n}\n\nstatic int parse_subexp(Node** top, OnigToken* tok, int term,\n\t\t\tUChar** src, UChar* end, ScanEnv* env);\n\nstatic int\nparse_enclose(Node** np, OnigToken* tok, int term, UChar** src, UChar* end,\n\t      ScanEnv* env)\n{\n  int r = 0, num;\n  Node *target, *work1 = NULL, *work2 = NULL;\n  OnigOptionType option;\n  OnigCodePoint c;\n  OnigEncoding enc = env->enc;\n\n#ifdef USE_NAMED_GROUP\n  int list_capture;\n#endif\n\n  UChar* p = *src;\n  PFETCH_READY;\n\n  *np = NULL;\n  if (PEND) return ONIGERR_END_PATTERN_WITH_UNMATCHED_PARENTHESIS;\n\n  option = env->option;\n  if (PPEEK_IS('?') &&\n      IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_QMARK_GROUP_EFFECT)) {\n    PINC;\n    if (PEND) return ONIGERR_END_PATTERN_IN_GROUP;\n\n    PFETCH(c);\n    switch (c) {\n    case ':':   /* (?:...) grouping only */\n    group:\n      r = fetch_token(tok, &p, end, env);\n      if (r < 0) return r;\n      r = parse_subexp(np, tok, term, &p, end, env);\n      if (r < 0) return r;\n      *src = p;\n      return 1; /* group */\n      break;\n\n    case '=':\n      *np = onig_node_new_anchor(ANCHOR_PREC_READ);\n      break;\n    case '!':   /* preceding read */\n      *np = onig_node_new_anchor(ANCHOR_PREC_READ_NOT);\n      break;\n    case '>':   /* (?>...) stop backtrack */\n      *np = node_new_enclose(ENCLOSE_STOP_BACKTRACK);\n      break;\n\n#ifdef USE_NAMED_GROUP\n    case '\\'':\n      if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_QMARK_LT_NAMED_GROUP)) {\n\tgoto named_group1;\n      }\n      else\n\treturn ONIGERR_UNDEFINED_GROUP_OPTION;\n      break;\n\n#ifdef USE_CAPITAL_P_NAMED_GROUP\n    case 'P':   /* (?P<name>...) */\n      if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_QMARK_CAPITAL_P_NAMED_GROUP)) {\n\tPFETCH(c);\n\tif (c == '<') goto named_group1;\n      }\n      return ONIGERR_UNDEFINED_GROUP_OPTION;\n      break;\n#endif\n#endif\n\n    case '<':   /* look behind (?<=...), (?<!...) */\n      PFETCH(c);\n      if (c == '=')\n\t*np = onig_node_new_anchor(ANCHOR_LOOK_BEHIND);\n      else if (c == '!')\n\t*np = onig_node_new_anchor(ANCHOR_LOOK_BEHIND_NOT);\n#ifdef USE_NAMED_GROUP\n      else {    /* (?<name>...) */\n\tif (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_QMARK_LT_NAMED_GROUP)) {\n\t  UChar *name;\n\t  UChar *name_end;\n\n\t  PUNFETCH;\n\t  c = '<';\n\n\tnamed_group1:\n\t  list_capture = 0;\n\n\tnamed_group2:\n\t  name = p;\n\t  r = fetch_name((OnigCodePoint )c, &p, end, &name_end, env, &num, 0);\n\t  if (r < 0) return r;\n\n\t  num = scan_env_add_mem_entry(env);\n\t  if (num < 0) return num;\n\t  if (list_capture != 0 && num >= (int )BIT_STATUS_BITS_NUM)\n\t    return ONIGERR_GROUP_NUMBER_OVER_FOR_CAPTURE_HISTORY;\n\n\t  r = name_add(env->reg, name, name_end, num, env);\n\t  if (r != 0) return r;\n\t  *np = node_new_enclose_memory(env->option, 1);\n\t  CHECK_NULL_RETURN_MEMERR(*np);\n\t  NENCLOSE(*np)->regnum = num;\n\t  if (list_capture != 0)\n\t    BIT_STATUS_ON_AT_SIMPLE(env->capture_history, num);\n\t  env->num_named++;\n\t}\n\telse {\n\t  return ONIGERR_UNDEFINED_GROUP_OPTION;\n\t}\n      }\n#else\n      else {\n\treturn ONIGERR_UNDEFINED_GROUP_OPTION;\n      }\n#endif\n      break;\n\n    case '@':\n      if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_ATMARK_CAPTURE_HISTORY)) {\n#ifdef USE_NAMED_GROUP\n\tif (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_QMARK_LT_NAMED_GROUP)) {\n\t  PFETCH(c);\n\t  if (c == '<' || c == '\\'') {\n\t    list_capture = 1;\n\t    goto named_group2; /* (?@<name>...) */\n\t  }\n\t  PUNFETCH;\n\t}\n#endif\n\t*np = node_new_enclose_memory(env->option, 0);\n\tCHECK_NULL_RETURN_MEMERR(*np);\n\tnum = scan_env_add_mem_entry(env);\n\tif (num < 0) {\n\t  onig_node_free(*np);\n\t  return num;\n\t}\n\telse if (num >= (int )BIT_STATUS_BITS_NUM) {\n\t  onig_node_free(*np);\n\t  return ONIGERR_GROUP_NUMBER_OVER_FOR_CAPTURE_HISTORY;\n\t}\n\tNENCLOSE(*np)->regnum = num;\n\tBIT_STATUS_ON_AT_SIMPLE(env->capture_history, num);\n      }\n      else {\n\treturn ONIGERR_UNDEFINED_GROUP_OPTION;\n      }\n      break;\n\n    case '(':   /* conditional expression: (?(cond)yes), (?(cond)yes|no) */\n      if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_QMARK_LPAREN_CONDITION)) {\n\tUChar *name = NULL;\n\tUChar *name_end;\n\tPFETCH(c);\n\tif (ONIGENC_IS_CODE_DIGIT(enc, c)) {     /* (n) */\n\t  PUNFETCH;\n\t  r = fetch_name((OnigCodePoint )'(', &p, end, &name_end, env, &num, 1);\n\t  if (r < 0) return r;\n\t  if (num < 0) {\n\t    num = BACKREF_REL_TO_ABS(num, env);\n\t    if (num <= 0)\n\t      return ONIGERR_INVALID_BACKREF;\n\t  }\n\t  if (IS_SYNTAX_BV(env->syntax, ONIG_SYN_STRICT_CHECK_BACKREF)) {\n\t    if (num > env->num_mem ||\n\t        IS_NULL(SCANENV_MEM_NODES(env)[num]))\n\t    return ONIGERR_INVALID_BACKREF;\n\t  }\n\t}\n#ifdef USE_NAMED_GROUP\n\telse if (c == '<' || c == '\\'') {    /* (<name>), ('name') */\n\t  int nums;\n\t  int *backs;\n\n\t  name = p;\n\t  r = fetch_name((OnigCodePoint )c, &p, end, &name_end, env, &num, 0);\n\t  if (r < 0) return r;\n\t  PFETCH(c);\n\t  if (c != ')') return ONIGERR_UNDEFINED_GROUP_OPTION;\n\n\t  nums = onig_name_to_group_numbers(env->reg, name, name_end, &backs);\n\t  if (nums <= 0) {\n\t    onig_scan_env_set_error_string(env,\n\t\t     ONIGERR_UNDEFINED_NAME_REFERENCE, name, name_end);\n\t    return ONIGERR_UNDEFINED_NAME_REFERENCE;\n\t  }\n\t  if (IS_SYNTAX_BV(env->syntax, ONIG_SYN_STRICT_CHECK_BACKREF)) {\n\t    int i;\n\t    for (i = 0; i < nums; i++) {\n\t      if (backs[i] > env->num_mem ||\n\t\t  IS_NULL(SCANENV_MEM_NODES(env)[backs[i]]))\n\t      return ONIGERR_INVALID_BACKREF;\n\t    }\n\t  }\n\t  num = backs[0];       /* XXX: use left most named group as Perl */\n\t}\n#endif\n\telse\n\t  return ONIGERR_INVALID_CONDITION_PATTERN;\n\t*np = node_new_enclose(ENCLOSE_CONDITION);\n\tCHECK_NULL_RETURN_MEMERR(*np);\n\tNENCLOSE(*np)->regnum = num;\n\tif (IS_NOT_NULL(name)) NENCLOSE(*np)->state |= NST_NAME_REF;\n      }\n      else\n\treturn ONIGERR_UNDEFINED_GROUP_OPTION;\n      break;\n\n#if 0\n    case '|':   /* branch reset: (?|...) */\n      if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_QMARK_VBAR_BRANCH_RESET)) {\n\t/* TODO */\n      }\n      else\n\treturn ONIGERR_UNDEFINED_GROUP_OPTION;\n      break;\n#endif\n\n    case '^':   /* loads default options */\n      if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_OPTION_PERL)) {\n\t/* d-imsx */\n\tONOFF(option, ONIG_OPTION_ASCII_RANGE, 1);\n\tONOFF(option, ONIG_OPTION_IGNORECASE, 1);\n\tONOFF(option, ONIG_OPTION_SINGLELINE, 0);\n\tONOFF(option, ONIG_OPTION_MULTILINE,  1);\n\tONOFF(option, ONIG_OPTION_EXTEND, 1);\n\tPFETCH(c);\n      }\n#if 0\n      else if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_OPTION_RUBY)) {\n\t/* d-imx */\n\tONOFF(option, ONIG_OPTION_ASCII_RANGE, 0);\n\tONOFF(option, ONIG_OPTION_POSIX_BRACKET_ALL_RANGE, 0);\n\tONOFF(option, ONIG_OPTION_WORD_BOUND_ALL_RANGE, 0);\n\tONOFF(option, ONIG_OPTION_IGNORECASE, 1);\n\tONOFF(option, ONIG_OPTION_MULTILINE,  1);\n\tONOFF(option, ONIG_OPTION_EXTEND, 1);\n\tPFETCH(c);\n      }\n#endif\n      else {\n\treturn ONIGERR_UNDEFINED_GROUP_OPTION;\n      }\n      /* fall through */\n#ifdef USE_POSIXLINE_OPTION\n    case 'p':\n#endif\n    case '-': case 'i': case 'm': case 's': case 'x':\n    case 'a': case 'd': case 'l': case 'u':\n      {\n\tint neg = 0;\n\n\twhile (1) {\n\t  switch (c) {\n\t  case ':':\n\t  case ')':\n\t  break;\n\n\t  case '-':  neg = 1; break;\n\t  case 'x':  ONOFF(option, ONIG_OPTION_EXTEND,     neg); break;\n\t  case 'i':  ONOFF(option, ONIG_OPTION_IGNORECASE, neg); break;\n\t  case 's':\n\t    if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_OPTION_PERL)) {\n\t      ONOFF(option, ONIG_OPTION_MULTILINE,  neg);\n\t    }\n\t    else\n\t      return ONIGERR_UNDEFINED_GROUP_OPTION;\n\t    break;\n\n\t  case 'm':\n\t    if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_OPTION_PERL)) {\n\t      ONOFF(option, ONIG_OPTION_SINGLELINE, (neg == 0 ? 1 : 0));\n\t    }\n\t    else if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_OPTION_RUBY)) {\n\t      ONOFF(option, ONIG_OPTION_MULTILINE,  neg);\n\t    }\n\t    else\n\t      return ONIGERR_UNDEFINED_GROUP_OPTION;\n\t    break;\n#ifdef USE_POSIXLINE_OPTION\n\t  case 'p':\n\t    ONOFF(option, ONIG_OPTION_MULTILINE|ONIG_OPTION_SINGLELINE, neg);\n\t    break;\n#endif\n\n\t  case 'a':     /* limits \\d, \\s, \\w and POSIX brackets to ASCII range */\n\t    if ((IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_OPTION_PERL) ||\n\t         IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_OPTION_RUBY)) &&\n\t        (neg == 0)) {\n\t      ONOFF(option, ONIG_OPTION_ASCII_RANGE, 0);\n\t      ONOFF(option, ONIG_OPTION_POSIX_BRACKET_ALL_RANGE, 1);\n\t      ONOFF(option, ONIG_OPTION_WORD_BOUND_ALL_RANGE, 1);\n\t    }\n\t    else\n\t      return ONIGERR_UNDEFINED_GROUP_OPTION;\n\t    break;\n\n\t  case 'u':\n\t    if ((IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_OPTION_PERL) ||\n\t         IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_OPTION_RUBY)) &&\n\t        (neg == 0)) {\n\t      ONOFF(option, ONIG_OPTION_ASCII_RANGE, 1);\n\t      ONOFF(option, ONIG_OPTION_POSIX_BRACKET_ALL_RANGE, 1);\n\t      ONOFF(option, ONIG_OPTION_WORD_BOUND_ALL_RANGE, 1);\n\t    }\n\t    else\n\t      return ONIGERR_UNDEFINED_GROUP_OPTION;\n\t    break;\n\n\t  case 'd':\n\t    if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_OPTION_PERL) &&\n\t        (neg == 0)) {\n\t      ONOFF(option, ONIG_OPTION_ASCII_RANGE, 1);\n\t    }\n\t    else if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_OPTION_RUBY) &&\n\t        (neg == 0)) {\n\t      ONOFF(option, ONIG_OPTION_ASCII_RANGE, 0);\n\t      ONOFF(option, ONIG_OPTION_POSIX_BRACKET_ALL_RANGE, 0);\n\t      ONOFF(option, ONIG_OPTION_WORD_BOUND_ALL_RANGE, 0);\n\t    }\n\t    else\n\t      return ONIGERR_UNDEFINED_GROUP_OPTION;\n\t    break;\n\n\t  case 'l':\n\t    if (IS_SYNTAX_OP2(env->syntax, ONIG_SYN_OP2_OPTION_PERL) && (neg == 0)) {\n\t      ONOFF(option, ONIG_OPTION_ASCII_RANGE, 1);\n\t    }\n\t    else\n\t      return ONIGERR_UNDEFINED_GROUP_OPTION;\n\t    break;\n\n\t  default:\n\t    return ONIGERR_UNDEFINED_GROUP_OPTION;\n\t  }\n\n\t  if (c == ')') {\n\t    *np = node_new_option(option);\n\t    CHECK_NULL_RETURN_MEMERR(*np);\n\t    *src = p;\n\t    return 2; /* option only */\n\t  }\n\t  else if (c == ':') {\n\t    OnigOptionType prev = env->option;\n\n\t    env->option     = option;\n\t    r = fetch_token(tok, &p, end, env);\n\t    if (r < 0) return r;\n\t    r = parse_subexp(&target, tok, term, &p, end, env);\n\t    env->option = prev;\n\t    if (r < 0) return r;\n\t    *np = node_new_option(option);\n\t    CHECK_NULL_RETURN_MEMERR(*np);\n\t    NENCLOSE(*np)->target = target;\n\t    *src = p;\n\t    return 0;\n\t  }\n\n\t  if (PEND) return ONIGERR_END_PATTERN_IN_GROUP;\n\t  PFETCH(c);\n\t}\n      }\n      break;\n\n    default:\n      return ONIGERR_UNDEFINED_GROUP_OPTION;\n    }\n  }\n  else {\n    if (ONIG_IS_OPTION_ON(env->option, ONIG_OPTION_DONT_CAPTURE_GROUP))\n      goto group;\n\n    *np = node_new_enclose_memory(env->option, 0);\n    CHECK_NULL_RETURN_MEMERR(*np);\n    num = scan_env_add_mem_entry(env);\n    if (num < 0) return num;\n    NENCLOSE(*np)->regnum = num;\n  }\n\n  CHECK_NULL_RETURN_MEMERR(*np);\n  r = fetch_token(tok, &p, end, env);\n  if (r < 0) return r;\n  r = parse_subexp(&target, tok, term, &p, end, env);\n  if (r < 0) {\n    onig_node_free(target);\n    return r;\n  }\n\n  if (NTYPE(*np) == NT_ANCHOR)\n    NANCHOR(*np)->target = target;\n  else {\n    NENCLOSE(*np)->target = target;\n    if (NENCLOSE(*np)->type == ENCLOSE_MEMORY) {\n      /* Don't move this to previous of parse_subexp() */\n      r = scan_env_set_mem_node(env, NENCLOSE(*np)->regnum, *np);\n      if (r != 0) return r;\n    }\n    else if (NENCLOSE(*np)->type == ENCLOSE_CONDITION) {\n      if (NTYPE(target) != NT_ALT) {\n\t/* convert (?(cond)yes) to (?(cond)yes|empty) */\n\twork1 = node_new_empty();\n\tif (IS_NULL(work1)) goto err;\n\twork2 = onig_node_new_alt(work1, NULL_NODE);\n\tif (IS_NULL(work2)) goto err;\n\twork1 = onig_node_new_alt(target, work2);\n\tif (IS_NULL(work1)) goto err;\n\tNENCLOSE(*np)->target = work1;\n      }\n    }\n  }\n\n  *src = p;\n  return 0;\n\n err:\n  onig_node_free(work1);\n  onig_node_free(work2);\n  onig_node_free(*np);\n  *np = NULL;\n  return ONIGERR_MEMORY;\n}\n\nstatic const char* const PopularQStr[] = {\n  \"?\", \"*\", \"+\", \"??\", \"*?\", \"+?\"\n};\n\nstatic const char* const ReduceQStr[] = {\n  \"\", \"\", \"*\", \"*?\", \"??\", \"+ and ??\", \"+? and ?\"\n};\n\nstatic int\nset_quantifier(Node* qnode, Node* target, int group, ScanEnv* env)\n{\n  QtfrNode* qn;\n\n  qn = NQTFR(qnode);\n  if (qn->lower == 1 && qn->upper == 1) {\n    return 1;\n  }\n\n  switch (NTYPE(target)) {\n  case NT_STR:\n    if (! group) {\n      StrNode* sn = NSTR(target);\n      if (str_node_can_be_split(sn, env->enc)) {\n\tNode* n = str_node_split_last_char(sn, env->enc);\n\tif (IS_NOT_NULL(n)) {\n\t  qn->target = n;\n\t  return 2;\n\t}\n      }\n    }\n    break;\n\n  case NT_QTFR:\n    { /* check redundant double repeat. */\n      /* verbose warn (?:.?)? etc... but not warn (.?)? etc... */\n      QtfrNode* qnt   = NQTFR(target);\n      int nestq_num   = popular_quantifier_num(qn);\n      int targetq_num = popular_quantifier_num(qnt);\n\n#ifdef USE_WARNING_REDUNDANT_NESTED_REPEAT_OPERATOR\n      if (!IS_QUANTIFIER_BY_NUMBER(qn) && !IS_QUANTIFIER_BY_NUMBER(qnt) &&\n\t  IS_SYNTAX_BV(env->syntax, ONIG_SYN_WARN_REDUNDANT_NESTED_REPEAT)) {\n        UChar buf[WARN_BUFSIZE];\n\n        switch (ReduceTypeTable[targetq_num][nestq_num]) {\n        case RQ_ASIS:\n          break;\n\n        case RQ_DEL:\n          if (onig_verb_warn != onig_null_warn) {\n            onig_snprintf_with_pattern(buf, WARN_BUFSIZE, env->enc,\n                                 env->pattern, env->pattern_end,\n                                 (UChar* )\"redundant nested repeat operator\");\n            (*onig_verb_warn)((char* )buf);\n          }\n          goto warn_exit;\n          break;\n\n        default:\n          if (onig_verb_warn != onig_null_warn) {\n            onig_snprintf_with_pattern(buf, WARN_BUFSIZE, env->enc,\n                                       env->pattern, env->pattern_end,\n            (UChar* )\"nested repeat operator %s and %s was replaced with '%s'\",\n            PopularQStr[targetq_num], PopularQStr[nestq_num],\n            ReduceQStr[ReduceTypeTable[targetq_num][nestq_num]]);\n            (*onig_verb_warn)((char* )buf);\n          }\n          goto warn_exit;\n          break;\n        }\n      }\n\n    warn_exit:\n#endif\n      if (targetq_num >= 0) {\n\tif (nestq_num >= 0) {\n\t  onig_reduce_nested_quantifier(qnode, target);\n\t  goto q_exit;\n\t}\n\telse if (targetq_num == 1 || targetq_num == 2) { /* * or + */\n\t  /* (?:a*){n,m}, (?:a+){n,m} => (?:a*){n,n}, (?:a+){n,n} */\n\t  if (! IS_REPEAT_INFINITE(qn->upper) && qn->upper > 1 && qn->greedy) {\n\t    qn->upper = (qn->lower == 0 ? 1 : qn->lower);\n\t  }\n\t}\n      }\n    }\n    break;\n\n  default:\n    break;\n  }\n\n  qn->target = target;\n q_exit:\n  return 0;\n}\n\n\n#ifdef USE_SHARED_CCLASS_TABLE\n\n#define THRESHOLD_RANGE_NUM_FOR_SHARE_CCLASS     8\n\n/* for ctype node hash table */\n\ntypedef struct {\n  OnigEncoding enc;\n  int not;\n  int type;\n} type_cclass_key;\n\nstatic int type_cclass_cmp(type_cclass_key* x, type_cclass_key* y)\n{\n  if (x->type != y->type) return 1;\n  if (x->enc  != y->enc)  return 1;\n  if (x->not  != y->not)  return 1;\n  return 0;\n}\n\nstatic int type_cclass_hash(type_cclass_key* key)\n{\n  int i, val;\n  UChar *p;\n\n  val = 0;\n\n  p = (UChar* )&(key->enc);\n  for (i = 0; i < (int )sizeof(key->enc); i++) {\n    val = val * 997 + (int )*p++;\n  }\n\n  p = (UChar* )(&key->type);\n  for (i = 0; i < (int )sizeof(key->type); i++) {\n    val = val * 997 + (int )*p++;\n  }\n\n  val += key->not;\n  return val + (val >> 5);\n}\n\nstatic struct st_hash_type type_type_cclass_hash = {\n    type_cclass_cmp,\n    type_cclass_hash,\n};\n\nstatic st_table* OnigTypeCClassTable;\n\n\nstatic int\ni_free_shared_class(type_cclass_key* key, Node* node, void* arg ARG_UNUSED)\n{\n  if (IS_NOT_NULL(node)) {\n    CClassNode* cc = NCCLASS(node);\n    if (IS_NOT_NULL(cc->mbuf)) xfree(cc->mbuf);\n    xfree(node);\n  }\n\n  if (IS_NOT_NULL(key)) xfree(key);\n  return ST_DELETE;\n}\n\nextern int\nonig_free_shared_cclass_table(void)\n{\n  THREAD_ATOMIC_START;\n  if (IS_NOT_NULL(OnigTypeCClassTable)) {\n    onig_st_foreach(OnigTypeCClassTable, i_free_shared_class, 0);\n    onig_st_free_table(OnigTypeCClassTable);\n    OnigTypeCClassTable = NULL;\n  }\n  THREAD_ATOMIC_END;\n\n  return 0;\n}\n\n#endif /* USE_SHARED_CCLASS_TABLE */\n\n#ifdef USE_SHARED_UNICODE_TABLE\n\nextern st_table* FoldTable;    /* fold-1, fold-2, fold-3 */\nextern st_table* Unfold1Table;\nextern st_table* Unfold2Table;\nextern st_table* Unfold3Table;\nextern int CaseFoldInited;\n\nstatic int\ni_free_shared_unicode_table(st_str_end_key* key, Node* node, void* arg ARG_UNUSED)\n{\n\tif (IS_NOT_NULL(key)) xfree(key);\n\treturn ST_DELETE;\n}\n\nextern int\nonig_free_shared_unicode_table(void)\n{\n\tTHREAD_ATOMIC_START;\n\tif (IS_NOT_NULL(FoldTable)) {\n\t\tonig_st_free_table(FoldTable);\n\t\tFoldTable = NULL;\n\t}\n\n\tif (IS_NOT_NULL(Unfold1Table)) {\n\t\tonig_st_free_table(Unfold1Table);\n\t\tUnfold1Table = NULL;\n\t}\n\n\tif (IS_NOT_NULL(Unfold2Table)) {\n\t\tonig_st_free_table(Unfold2Table);\n\t\tUnfold2Table = NULL;\n\t}\n\n\tif (IS_NOT_NULL(Unfold3Table)) {\n\t\tonig_st_free_table(Unfold3Table);\n\t\tUnfold3Table = NULL;\n\t}\n\tCaseFoldInited = 0;\n\t\n\tTHREAD_ATOMIC_END;\n\treturn 0;\n}\n\n#endif // USE_SHARED_UNICODE_TABLE\n\n#ifndef CASE_FOLD_IS_APPLIED_INSIDE_NEGATIVE_CCLASS\nstatic int\nclear_not_flag_cclass(CClassNode* cc, OnigEncoding enc)\n{\n  BBuf *tbuf;\n  int r;\n\n  if (IS_NCCLASS_NOT(cc)) {\n    bitset_invert(cc->bs);\n\n    if (! ONIGENC_IS_SINGLEBYTE(enc)) {\n      r = not_code_range_buf(enc, cc->mbuf, &tbuf);\n      if (r != 0) return r;\n\n      bbuf_free(cc->mbuf);\n      cc->mbuf = tbuf;\n    }\n\n    NCCLASS_CLEAR_NOT(cc);\n  }\n\n  return 0;\n}\n#endif /* CASE_FOLD_IS_APPLIED_INSIDE_NEGATIVE_CCLASS */\n\ntypedef struct {\n  ScanEnv*    env;\n  CClassNode* cc;\n  Node*       alt_root;\n  Node**      ptail;\n} IApplyCaseFoldArg;\n\nstatic int\ni_apply_case_fold(OnigCodePoint from, OnigCodePoint to[],\n\t\t  int to_len, void* arg)\n{\n  IApplyCaseFoldArg* iarg;\n  ScanEnv* env;\n  CClassNode* cc;\n  BitSetRef bs;\n\n  iarg = (IApplyCaseFoldArg* )arg;\n  env = iarg->env;\n  cc  = iarg->cc;\n  bs = cc->bs;\n\n  if (to_len == 1) {\n    int is_in = onig_is_code_in_cc(env->enc, from, cc);\n#ifdef CASE_FOLD_IS_APPLIED_INSIDE_NEGATIVE_CCLASS\n    if ((is_in != 0 && !IS_NCCLASS_NOT(cc)) ||\n\t(is_in == 0 &&  IS_NCCLASS_NOT(cc))) {\n      if (ONIGENC_MBC_MINLEN(env->enc) > 1 || *to >= SINGLE_BYTE_SIZE) {\n\tadd_code_range(&(cc->mbuf), env, *to, *to);\n      }\n      else {\n\tBITSET_SET_BIT(bs, *to);\n      }\n    }\n#else\n    if (is_in != 0) {\n      if (ONIGENC_MBC_MINLEN(env->enc) > 1 || *to >= SINGLE_BYTE_SIZE) {\n\tif (IS_NCCLASS_NOT(cc)) clear_not_flag_cclass(cc, env->enc);\n\tadd_code_range(&(cc->mbuf), env, *to, *to);\n      }\n      else {\n\tif (IS_NCCLASS_NOT(cc)) {\n\t  BITSET_CLEAR_BIT(bs, *to);\n\t}\n\telse\n\t  BITSET_SET_BIT(bs, *to);\n      }\n    }\n#endif /* CASE_FOLD_IS_APPLIED_INSIDE_NEGATIVE_CCLASS */\n  }\n  else {\n    int r, i, len;\n    UChar buf[ONIGENC_CODE_TO_MBC_MAXLEN];\n    Node *snode = NULL_NODE;\n\n    if (onig_is_code_in_cc(env->enc, from, cc)\n#ifdef CASE_FOLD_IS_APPLIED_INSIDE_NEGATIVE_CCLASS\n\t&& !IS_NCCLASS_NOT(cc)\n#endif\n\t) {\n      for (i = 0; i < to_len; i++) {\n\tlen = ONIGENC_CODE_TO_MBC(env->enc, to[i], buf);\n\tif (i == 0) {\n\t  snode = onig_node_new_str(buf, buf + len);\n\t  CHECK_NULL_RETURN_MEMERR(snode);\n\n\t  /* char-class expanded multi-char only\n\t     compare with string folded at match time. */\n\t  NSTRING_SET_AMBIG(snode);\n\t}\n\telse {\n\t  r = onig_node_str_cat(snode, buf, buf + len);\n\t  if (r < 0) {\n\t    onig_node_free(snode);\n\t    return r;\n\t  }\n\t}\n      }\n\n      *(iarg->ptail) = onig_node_new_alt(snode, NULL_NODE);\n      CHECK_NULL_RETURN_MEMERR(*(iarg->ptail));\n      iarg->ptail = &(NCDR((*(iarg->ptail))));\n    }\n  }\n\n  return 0;\n}\n\nstatic int\nnode_linebreak(Node** np, ScanEnv* env)\n{\n  /* same as (?>\\x0D\\x0A|[\\x0A-\\x0D\\x{85}\\x{2028}\\x{2029}]) */\n  Node* left = NULL;\n  Node* right = NULL;\n  Node* target1 = NULL;\n  Node* target2 = NULL;\n  CClassNode* cc;\n  int num1, num2;\n  UChar buf[ONIGENC_CODE_TO_MBC_MAXLEN * 2];\n\n  /* \\x0D\\x0A */\n  num1 = ONIGENC_CODE_TO_MBC(env->enc, 0x0D, buf);\n  if (num1 < 0) return num1;\n  num2 = ONIGENC_CODE_TO_MBC(env->enc, 0x0A, buf + num1);\n  if (num2 < 0) return num2;\n  left = node_new_str_raw(buf, buf + num1 + num2);\n  if (IS_NULL(left)) goto err;\n\n  /* [\\x0A-\\x0D] or [\\x0A-\\x0D\\x{85}\\x{2028}\\x{2029}] */\n  right = node_new_cclass();\n  if (IS_NULL(right)) goto err;\n  cc = NCCLASS(right);\n  if (ONIGENC_MBC_MINLEN(env->enc) > 1) {\n    add_code_range(&(cc->mbuf), env, 0x0A, 0x0D);\n  }\n  else {\n    bitset_set_range(cc->bs, 0x0A, 0x0D);\n  }\n\n  /* TODO: move this block to enc/unicode.c */\n  if (ONIGENC_IS_UNICODE(env->enc)) {\n    /* UTF-8, UTF-16BE/LE, UTF-32BE/LE */\n    add_code_range(&(cc->mbuf), env, 0x85, 0x85);\n    add_code_range(&(cc->mbuf), env, 0x2028, 0x2029);\n  }\n\n  /* ...|... */\n  target1 = onig_node_new_alt(right, NULL_NODE);\n  if (IS_NULL(target1)) goto err;\n  right = NULL;\n  target2 = onig_node_new_alt(left, target1);\n  if (IS_NULL(target2)) goto err;\n  left = NULL;\n  target1 = NULL;\n\n  /* (?>...) */\n  *np = node_new_enclose(ENCLOSE_STOP_BACKTRACK);\n  if (IS_NULL(*np)) goto err;\n  NENCLOSE(*np)->target = target2;\n  return ONIG_NORMAL;\n\n err:\n  onig_node_free(left);\n  onig_node_free(right);\n  onig_node_free(target1);\n  onig_node_free(target2);\n  return ONIGERR_MEMORY;\n}\n\nstatic int\nnode_extended_grapheme_cluster(Node** np, ScanEnv* env)\n{\n  /* same as (?>\\P{M}\\p{M}*) */\n  Node* np1 = NULL;\n  Node* np2 = NULL;\n  Node* qn = NULL;\n  Node* list1 = NULL;\n  Node* list2 = NULL;\n  int r = 0;\n\n#ifdef USE_UNICODE_PROPERTIES\n  if (ONIGENC_IS_UNICODE(env->enc)) {\n    /* UTF-8, UTF-16BE/LE, UTF-32BE/LE */\n    CClassNode* cc1;\n    CClassNode* cc2;\n    UChar* propname = (UChar* )\"M\";\n    int ctype = env->enc->property_name_to_ctype(ONIG_ENCODING_ASCII,\n\tpropname, propname + 1);\n    if (ctype >= 0) {\n      /* \\P{M} */\n      np1 = node_new_cclass();\n      if (IS_NULL(np1)) goto err;\n      cc1 = NCCLASS(np1);\n      r = add_ctype_to_cc(cc1, ctype, 0, 1, env);\n      if (r != 0) goto err;\n      NCCLASS_SET_NOT(cc1);\n\n      /* \\p{M}* */\n      np2 = node_new_cclass();\n      if (IS_NULL(np2)) goto err;\n      cc2 = NCCLASS(np2);\n      r = add_ctype_to_cc(cc2, ctype, 0, 1, env);\n      if (r != 0) goto err;\n\n      qn = node_new_quantifier(0, REPEAT_INFINITE, 0);\n      if (IS_NULL(qn)) goto err;\n      NQTFR(qn)->target = np2;\n      np2 = NULL;\n\n      /* \\P{M}\\p{M}* */\n      list2 = node_new_list(qn, NULL_NODE);\n      if (IS_NULL(list2)) goto err;\n      qn = NULL;\n      list1 = node_new_list(np1, list2);\n      if (IS_NULL(list1)) goto err;\n      np1 = NULL;\n      list2 = NULL;\n\n      /* (?>...) */\n      *np = node_new_enclose(ENCLOSE_STOP_BACKTRACK);\n      if (IS_NULL(*np)) goto err;\n      NENCLOSE(*np)->target = list1;\n      return ONIG_NORMAL;\n    }\n  }\n#endif /* USE_UNICODE_PROPERTIES */\n  if (IS_NULL(*np)) {\n    /* PerlSyntax: (?s:.), RubySyntax: (?m:.) */\n    OnigOptionType option;\n    np1 = node_new_anychar();\n    if (IS_NULL(np1)) goto err;\n\n    option = env->option;\n    ONOFF(option, ONIG_OPTION_MULTILINE, 0);\n    *np = node_new_option(option);\n    if (IS_NULL(*np)) goto err;\n    NENCLOSE(*np)->target = np1;\n  }\n  return ONIG_NORMAL;\n\n err:\n  onig_node_free(np1);\n  onig_node_free(np2);\n  onig_node_free(qn);\n  onig_node_free(list1);\n  onig_node_free(list2);\n  return (r == 0) ? ONIGERR_MEMORY : r;\n}\n\nstatic int\ncountbits(unsigned int bits)\n{\n  bits = (bits & 0x55555555) + ((bits >> 1) & 0x55555555);\n  bits = (bits & 0x33333333) + ((bits >> 2) & 0x33333333);\n  bits = (bits & 0x0f0f0f0f) + ((bits >> 4) & 0x0f0f0f0f);\n  bits = (bits & 0x00ff00ff) + ((bits >> 8) & 0x00ff00ff);\n  return (bits & 0x0000ffff) + ((bits >>16) & 0x0000ffff);\n}\n\nstatic int\nis_onechar_cclass(CClassNode* cc, OnigCodePoint* code)\n{\n  const OnigCodePoint not_found = ONIG_LAST_CODE_POINT;\n  OnigCodePoint c = not_found;\n  int i;\n  BBuf *bbuf = cc->mbuf;\n\n  if (IS_NCCLASS_NOT(cc)) return 0;\n\n  /* check bbuf */\n  if (IS_NOT_NULL(bbuf)) {\n    OnigCodePoint n, *data;\n    GET_CODE_POINT(n, bbuf->p);\n    data = (OnigCodePoint* )(bbuf->p) + 1;\n    if ((n == 1) && (data[0] == data[1])) {\n      /* only one char found in the bbuf, save the code point. */\n      c = data[0];\n      if (((c < SINGLE_BYTE_SIZE) && BITSET_AT(cc->bs, c))) {\n        /* skip if c is included in the bitset */\n\tc = not_found;\n      }\n    }\n    else {\n      return 0;  /* the bbuf contains multiple chars */\n    }\n  }\n\n  /* check bitset */\n  for (i = 0; i < BITSET_SIZE; i++) {\n    Bits b1 = cc->bs[i];\n    if (b1 != 0) {\n      if (((b1 & (b1 - 1)) == 0) && (c == not_found)) {\n        c = BITS_IN_ROOM * i + countbits(b1 - 1);\n      } else {\n        return 0;  /* the character class contains multiple chars */\n      }\n    }\n  }\n\n  if (c != not_found) {\n    *code = c;\n    return 1;\n  }\n\n  /* the character class contains no char. */\n  return 0;\n}\n\n\nstatic int\nparse_exp(Node** np, OnigToken* tok, int term,\n\t  UChar** src, UChar* end, ScanEnv* env)\n{\n  int r, len, group = 0;\n  Node* qn;\n  Node** targetp;\n\n  *np = NULL;\n  if (tok->type == (enum TokenSyms )term)\n    goto end_of_token;\n\n  switch (tok->type) {\n  case TK_ALT:\n  case TK_EOT:\n  end_of_token:\n    *np = node_new_empty();\n    return tok->type;\n    break;\n\n  case TK_SUBEXP_OPEN:\n    r = parse_enclose(np, tok, TK_SUBEXP_CLOSE, src, end, env);\n    if (r < 0) return r;\n    if (r == 1) group = 1;\n    else if (r == 2) { /* option only */\n      Node* target;\n      OnigOptionType prev = env->option;\n\n      env->option = NENCLOSE(*np)->option;\n      r = fetch_token(tok, src, end, env);\n      if (r < 0) return r;\n      r = parse_subexp(&target, tok, term, src, end, env);\n      env->option = prev;\n      if (r < 0) {\n\tonig_node_free(target);\n\treturn r;\n      }\n      NENCLOSE(*np)->target = target;\n      return tok->type;\n    }\n    break;\n\n  case TK_SUBEXP_CLOSE:\n    if (! IS_SYNTAX_BV(env->syntax, ONIG_SYN_ALLOW_UNMATCHED_CLOSE_SUBEXP))\n      return ONIGERR_UNMATCHED_CLOSE_PARENTHESIS;\n\n    if (tok->escaped) goto tk_raw_byte;\n    else goto tk_byte;\n    break;\n\n  case TK_LINEBREAK:\n    r = node_linebreak(np, env);\n    if (r < 0) return r;\n    break;\n\n  case TK_EXTENDED_GRAPHEME_CLUSTER:\n    r = node_extended_grapheme_cluster(np, env);\n    if (r < 0) return r;\n    break;\n\n  case TK_KEEP:\n    *np = onig_node_new_anchor(ANCHOR_KEEP);\n    CHECK_NULL_RETURN_MEMERR(*np);\n    break;\n\n  case TK_STRING:\n  tk_byte:\n    {\n      *np = node_new_str(tok->backp, *src);\n      CHECK_NULL_RETURN_MEMERR(*np);\n\n    string_loop:\n      while (1) {\n\tr = fetch_token(tok, src, end, env);\n\tif (r < 0) return r;\n\tif (r == TK_STRING) {\n\t  r = onig_node_str_cat(*np, tok->backp, *src);\n\t}\n#ifndef NUMBERED_CHAR_IS_NOT_CASE_AMBIG\n\telse if (r == TK_CODE_POINT) {\n\t  r = node_str_cat_codepoint(*np, env->enc, tok->u.code);\n\t}\n#endif\n\telse {\n\t  break;\n\t}\n\tif (r < 0) return r;\n      }\n\n    string_end:\n      targetp = np;\n      goto repeat;\n    }\n    break;\n\n  case TK_RAW_BYTE:\n  tk_raw_byte:\n    {\n      *np = node_new_str_raw_char((UChar )tok->u.c);\n      CHECK_NULL_RETURN_MEMERR(*np);\n      len = 1;\n      while (1) {\n\tif (len >= ONIGENC_MBC_MINLEN(env->enc)) {\n\t  if (len == enclen(env->enc, NSTR(*np)->s)) {\n\t    r = fetch_token(tok, src, end, env);\n\t    NSTRING_CLEAR_RAW(*np);\n\t    goto string_end;\n\t  }\n\t}\n\n\tr = fetch_token(tok, src, end, env);\n\tif (r < 0) return r;\n\tif (r != TK_RAW_BYTE) {\n\t  /* Don't use this, it is wrong for little endian encodings. */\n#ifdef USE_PAD_TO_SHORT_BYTE_CHAR\n\t  int rem;\n\t  if (len < ONIGENC_MBC_MINLEN(env->enc)) {\n\t    rem = ONIGENC_MBC_MINLEN(env->enc) - len;\n\t    (void )node_str_head_pad(NSTR(*np), rem, (UChar )0);\n\t    if (len + rem == enclen(env->enc, NSTR(*np)->s)) {\n\t      NSTRING_CLEAR_RAW(*np);\n\t      goto string_end;\n\t    }\n\t  }\n#endif\n\t  return ONIGERR_TOO_SHORT_MULTI_BYTE_STRING;\n\t}\n\n\tr = node_str_cat_char(*np, (UChar )tok->u.c);\n\tif (r < 0) return r;\n\n\tlen++;\n      }\n    }\n    break;\n\n  case TK_CODE_POINT:\n    {\n      *np = node_new_empty();\n      CHECK_NULL_RETURN_MEMERR(*np);\n      r = node_str_cat_codepoint(*np, env->enc, tok->u.code);\n      if (r != 0) return r;\n#ifdef NUMBERED_CHAR_IS_NOT_CASE_AMBIG\n      NSTRING_SET_RAW(*np);\n#else\n      goto string_loop;\n#endif\n    }\n    break;\n\n  case TK_QUOTE_OPEN:\n    {\n      OnigCodePoint end_op[2];\n      UChar *qstart, *qend, *nextp;\n\n      end_op[0] = (OnigCodePoint )MC_ESC(env->syntax);\n      end_op[1] = (OnigCodePoint )'E';\n      qstart = *src;\n      qend = find_str_position(end_op, 2, qstart, end, &nextp, env->enc);\n      if (IS_NULL(qend)) {\n\tnextp = qend = end;\n      }\n      *np = node_new_str(qstart, qend);\n      CHECK_NULL_RETURN_MEMERR(*np);\n      *src = nextp;\n    }\n    break;\n\n  case TK_CHAR_TYPE:\n    {\n      switch (tok->u.prop.ctype) {\n      case ONIGENC_CTYPE_WORD:\n\t*np = node_new_ctype(tok->u.prop.ctype, tok->u.prop.not,\n\t\t\t     IS_ASCII_RANGE(env->option));\n\tCHECK_NULL_RETURN_MEMERR(*np);\n\tbreak;\n\n      case ONIGENC_CTYPE_SPACE:\n      case ONIGENC_CTYPE_DIGIT:\n      case ONIGENC_CTYPE_XDIGIT:\n\t{\n\t  CClassNode* cc;\n\n#ifdef USE_SHARED_CCLASS_TABLE\n          const OnigCodePoint *mbr;\n\t  OnigCodePoint sb_out;\n\n          r = ONIGENC_GET_CTYPE_CODE_RANGE(env->enc, tok->u.prop.ctype,\n\t\t\t\t\t   &sb_out, &mbr);\n          if (r == 0 &&\n              ! IS_ASCII_RANGE(env->option) &&\n              ONIGENC_CODE_RANGE_NUM(mbr)\n              >= THRESHOLD_RANGE_NUM_FOR_SHARE_CCLASS) {\n            type_cclass_key  key;\n            type_cclass_key* new_key;\n\n            key.enc  = env->enc;\n            key.not  = tok->u.prop.not;\n            key.type = tok->u.prop.ctype;\n\n            THREAD_ATOMIC_START;\n\n            if (IS_NULL(OnigTypeCClassTable)) {\n              OnigTypeCClassTable\n                = onig_st_init_table_with_size(&type_type_cclass_hash, 10);\n              if (IS_NULL(OnigTypeCClassTable)) {\n                THREAD_ATOMIC_END;\n                return ONIGERR_MEMORY;\n              }\n            }\n            else {\n              if (onig_st_lookup(OnigTypeCClassTable, (st_data_t )&key,\n                                 (st_data_t* )np)) {\n                THREAD_ATOMIC_END;\n                break;\n              }\n            }\n\n            *np = node_new_cclass_by_codepoint_range(tok->u.prop.not,\n\t\t\t\t\t\t     sb_out, mbr);\n            if (IS_NULL(*np)) {\n              THREAD_ATOMIC_END;\n              return ONIGERR_MEMORY;\n            }\n\n            cc = NCCLASS(*np);\n            NCCLASS_SET_SHARE(cc);\n            new_key = (type_cclass_key* )xmalloc(sizeof(type_cclass_key));\n\t    xmemcpy(new_key, &key, sizeof(type_cclass_key));\n            onig_st_add_direct(OnigTypeCClassTable, (st_data_t )new_key,\n                               (st_data_t )*np);\n\n            THREAD_ATOMIC_END;\n          }\n          else {\n#endif\n            *np = node_new_cclass();\n            CHECK_NULL_RETURN_MEMERR(*np);\n            cc = NCCLASS(*np);\n            r = add_ctype_to_cc(cc, tok->u.prop.ctype, 0, 0, env);\n\t    if (r != 0) return r;\n            if (tok->u.prop.not != 0) NCCLASS_SET_NOT(cc);\n#ifdef USE_SHARED_CCLASS_TABLE\n          }\n#endif\n\t}\n\tbreak;\n\n      default:\n\treturn ONIGERR_PARSER_BUG;\n\tbreak;\n      }\n    }\n    break;\n\n  case TK_CHAR_PROPERTY:\n    r = parse_char_property(np, tok, src, end, env);\n    if (r != 0) return r;\n    break;\n\n  case TK_CC_OPEN:\n    {\n      CClassNode* cc;\n      OnigCodePoint code;\n\n      r = parse_char_class(np, tok, src, end, env);\n      if (r != 0) return r;\n\n      cc = NCCLASS(*np);\n      if (is_onechar_cclass(cc, &code)) {\n\tonig_node_free(*np);\n\t*np = node_new_empty();\n\tCHECK_NULL_RETURN_MEMERR(*np);\n\tr = node_str_cat_codepoint(*np, env->enc, code);\n\tif (r != 0) return r;\n\tgoto string_loop;\n      }\n      if (IS_IGNORECASE(env->option)) {\n\tIApplyCaseFoldArg iarg;\n\n\tiarg.env      = env;\n\tiarg.cc       = cc;\n\tiarg.alt_root = NULL_NODE;\n\tiarg.ptail    = &(iarg.alt_root);\n\n\tr = ONIGENC_APPLY_ALL_CASE_FOLD(env->enc, env->case_fold_flag,\n\t\t\t\t\ti_apply_case_fold, &iarg);\n\tif (r != 0) {\n\t  onig_node_free(iarg.alt_root);\n\t  return r;\n\t}\n\tif (IS_NOT_NULL(iarg.alt_root)) {\n          Node* work = onig_node_new_alt(*np, iarg.alt_root);\n          if (IS_NULL(work)) {\n            onig_node_free(iarg.alt_root);\n            return ONIGERR_MEMORY;\n          }\n          *np = work;\n\t}\n      }\n    }\n    break;\n\n  case TK_ANYCHAR:\n    *np = node_new_anychar();\n    CHECK_NULL_RETURN_MEMERR(*np);\n    break;\n\n  case TK_ANYCHAR_ANYTIME:\n    *np = node_new_anychar();\n    CHECK_NULL_RETURN_MEMERR(*np);\n    qn = node_new_quantifier(0, REPEAT_INFINITE, 0);\n    CHECK_NULL_RETURN_MEMERR(qn);\n    NQTFR(qn)->target = *np;\n    *np = qn;\n    break;\n\n  case TK_BACKREF:\n    len = tok->u.backref.num;\n    *np = node_new_backref(len,\n\t\t   (len > 1 ? tok->u.backref.refs : &(tok->u.backref.ref1)),\n\t\t\t   tok->u.backref.by_name,\n#ifdef USE_BACKREF_WITH_LEVEL\n\t\t\t   tok->u.backref.exist_level,\n\t\t\t   tok->u.backref.level,\n#endif\n\t\t\t   env);\n    CHECK_NULL_RETURN_MEMERR(*np);\n    break;\n\n#ifdef USE_SUBEXP_CALL\n  case TK_CALL:\n    {\n      int gnum = tok->u.call.gnum;\n\n      if (gnum < 0 || tok->u.call.rel != 0) {\n\tif (gnum > 0) gnum--;\n\tgnum = BACKREF_REL_TO_ABS(gnum, env);\n\tif (gnum <= 0)\n\t  return ONIGERR_INVALID_BACKREF;\n      }\n      *np = node_new_call(tok->u.call.name, tok->u.call.name_end, gnum);\n      CHECK_NULL_RETURN_MEMERR(*np);\n      env->num_call++;\n    }\n    break;\n#endif\n\n  case TK_ANCHOR:\n    *np = onig_node_new_anchor(tok->u.anchor.subtype);\n    CHECK_NULL_RETURN_MEMERR(*np);\n    NANCHOR(*np)->ascii_range = tok->u.anchor.ascii_range;\n    break;\n\n  case TK_OP_REPEAT:\n  case TK_INTERVAL:\n    if (IS_SYNTAX_BV(env->syntax, ONIG_SYN_CONTEXT_INDEP_REPEAT_OPS)) {\n      if (IS_SYNTAX_BV(env->syntax, ONIG_SYN_CONTEXT_INVALID_REPEAT_OPS))\n\treturn ONIGERR_TARGET_OF_REPEAT_OPERATOR_NOT_SPECIFIED;\n      else\n\t*np = node_new_empty();\n    }\n    else {\n      goto tk_byte;\n    }\n    break;\n\n  default:\n    return ONIGERR_PARSER_BUG;\n    break;\n  }\n\n  {\n    targetp = np;\n\n  re_entry:\n    r = fetch_token(tok, src, end, env);\n    if (r < 0) return r;\n\n  repeat:\n    if (r == TK_OP_REPEAT || r == TK_INTERVAL) {\n      if (is_invalid_quantifier_target(*targetp))\n\treturn ONIGERR_TARGET_OF_REPEAT_OPERATOR_INVALID;\n\n      qn = node_new_quantifier(tok->u.repeat.lower, tok->u.repeat.upper,\n\t\t\t       (r == TK_INTERVAL ? 1 : 0));\n      CHECK_NULL_RETURN_MEMERR(qn);\n      NQTFR(qn)->greedy = tok->u.repeat.greedy;\n      r = set_quantifier(qn, *targetp, group, env);\n      if (r < 0) {\n\tonig_node_free(qn);\n\treturn r;\n      }\n\n      if (tok->u.repeat.possessive != 0) {\n\tNode* en;\n\ten = node_new_enclose(ENCLOSE_STOP_BACKTRACK);\n\tif (IS_NULL(en)) {\n\t  onig_node_free(qn);\n\t  return ONIGERR_MEMORY;\n\t}\n\tNENCLOSE(en)->target = qn;\n\tqn = en;\n      }\n\n      if (r == 0) {\n\t*targetp = qn;\n      }\n      else if (r == 1) {\n\tonig_node_free(qn);\n      }\n      else if (r == 2) { /* split case: /abc+/ */\n\tNode *tmp;\n\n\t*targetp = node_new_list(*targetp, NULL);\n\tif (IS_NULL(*targetp)) {\n\t  onig_node_free(qn);\n\t  return ONIGERR_MEMORY;\n\t}\n\ttmp = NCDR(*targetp) = node_new_list(qn, NULL);\n\tif (IS_NULL(tmp)) {\n\t  onig_node_free(qn);\n\t  return ONIGERR_MEMORY;\n\t}\n\ttargetp = &(NCAR(tmp));\n      }\n      goto re_entry;\n    }\n  }\n\n  return r;\n}\n\nstatic int\nparse_branch(Node** top, OnigToken* tok, int term,\n\t     UChar** src, UChar* end, ScanEnv* env)\n{\n  int r;\n  Node *node, **headp;\n\n  *top = NULL;\n  r = parse_exp(&node, tok, term, src, end, env);\n  if (r < 0) {\n    onig_node_free(node);\n    return r;\n  }\n\n  if (r == TK_EOT || r == term || r == TK_ALT) {\n    *top = node;\n  }\n  else {\n    *top  = node_new_list(node, NULL);\n    headp = &(NCDR(*top));\n    while (r != TK_EOT && r != term && r != TK_ALT) {\n      r = parse_exp(&node, tok, term, src, end, env);\n      if (r < 0) {\n\tonig_node_free(node);\n\treturn r;\n      }\n\n      if (NTYPE(node) == NT_LIST) {\n\t*headp = node;\n\twhile (IS_NOT_NULL(NCDR(node))) node = NCDR(node);\n\theadp = &(NCDR(node));\n      }\n      else {\n\t*headp = node_new_list(node, NULL);\n\theadp = &(NCDR(*headp));\n      }\n    }\n  }\n\n  return r;\n}\n\n/* term_tok: TK_EOT or TK_SUBEXP_CLOSE */\nstatic int\nparse_subexp(Node** top, OnigToken* tok, int term,\n\t     UChar** src, UChar* end, ScanEnv* env)\n{\n  int r;\n  Node *node, **headp;\n\n  *top = NULL;\n  r = parse_branch(&node, tok, term, src, end, env);\n  if (r < 0) {\n    onig_node_free(node);\n    return r;\n  }\n\n  if (r == term) {\n    *top = node;\n  }\n  else if (r == TK_ALT) {\n    *top  = onig_node_new_alt(node, NULL);\n    headp = &(NCDR(*top));\n    while (r == TK_ALT) {\n      r = fetch_token(tok, src, end, env);\n      if (r < 0) return r;\n      r = parse_branch(&node, tok, term, src, end, env);\n      if (r < 0) {\n\tonig_node_free(node);\n\treturn r;\n      }\n\n      *headp = onig_node_new_alt(node, NULL);\n      headp = &(NCDR(*headp));\n    }\n\n    if (tok->type != (enum TokenSyms )term)\n      goto err;\n  }\n  else {\n    onig_node_free(node);\n  err:\n    if (term == TK_SUBEXP_CLOSE)\n      return ONIGERR_END_PATTERN_WITH_UNMATCHED_PARENTHESIS;\n    else\n      return ONIGERR_PARSER_BUG;\n  }\n\n  return r;\n}\n\nstatic int\nparse_regexp(Node** top, UChar** src, UChar* end, ScanEnv* env)\n{\n  int r;\n  OnigToken tok;\n\n  r = fetch_token(&tok, src, end, env);\n  if (r < 0) return r;\n  r = parse_subexp(top, &tok, TK_EOT, src, end, env);\n  if (r < 0) return r;\n\n#ifdef USE_SUBEXP_CALL\n  if (env->num_call > 0) {\n    /* Capture the pattern itself. It is used for (?R), (?0) and \\g<0>. */\n    const int num = 0;\n    Node* np;\n    np = node_new_enclose_memory(env->option, 0);\n    CHECK_NULL_RETURN_MEMERR(np);\n    NENCLOSE(np)->regnum = num;\n    NENCLOSE(np)->target = *top;\n    r = scan_env_set_mem_node(env, num, np);\n    if (r != 0) return r;\n    *top = np;\n  }\n#endif\n  return 0;\n}\n\nextern int\nonig_parse_make_tree(Node** root, const UChar* pattern, const UChar* end,\n\t\t     regex_t* reg, ScanEnv* env)\n{\n  int r;\n  UChar* p;\n\n#ifdef USE_NAMED_GROUP\n  names_clear(reg);\n#endif\n\n  scan_env_clear(env);\n  env->option         = reg->options;\n  env->case_fold_flag = reg->case_fold_flag;\n  env->enc            = reg->enc;\n  env->syntax         = reg->syntax;\n  env->pattern        = (UChar* )pattern;\n  env->pattern_end    = (UChar* )end;\n  env->reg            = reg;\n\n  *root = NULL;\n  p = (UChar* )pattern;\n  r = parse_regexp(root, &p, (UChar* )end, env);\n  reg->num_mem = env->num_mem;\n  return r;\n}\n\nextern void\nonig_scan_env_set_error_string(ScanEnv* env, int ecode ARG_UNUSED,\n\t\t\t\tUChar* arg, UChar* arg_end)\n{\n  env->error     = arg;\n  env->error_end = arg_end;\n}\n"
  },
  {
    "path": "src/Onigmo/regparse.h",
    "content": "#ifndef REGPARSE_H\n#define REGPARSE_H\n/**********************************************************************\n  regparse.h -  Onigmo (Oniguruma-mod) (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2007  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * Copyright (c) 2011       K.Takata  <kentkt AT csc DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regint.h\"\n\n/* node type */\n#define NT_STR         0\n#define NT_CCLASS      1\n#define NT_CTYPE       2\n#define NT_CANY        3\n#define NT_BREF        4\n#define NT_QTFR        5\n#define NT_ENCLOSE     6\n#define NT_ANCHOR      7\n#define NT_LIST        8\n#define NT_ALT         9\n#define NT_CALL       10\n\n/* node type bit */\n#define NTYPE2BIT(type)      (1<<(type))\n\n#define BIT_NT_STR        NTYPE2BIT(NT_STR)\n#define BIT_NT_CCLASS     NTYPE2BIT(NT_CCLASS)\n#define BIT_NT_CTYPE      NTYPE2BIT(NT_CTYPE)\n#define BIT_NT_CANY       NTYPE2BIT(NT_CANY)\n#define BIT_NT_BREF       NTYPE2BIT(NT_BREF)\n#define BIT_NT_QTFR       NTYPE2BIT(NT_QTFR)\n#define BIT_NT_ENCLOSE    NTYPE2BIT(NT_ENCLOSE)\n#define BIT_NT_ANCHOR     NTYPE2BIT(NT_ANCHOR)\n#define BIT_NT_LIST       NTYPE2BIT(NT_LIST)\n#define BIT_NT_ALT        NTYPE2BIT(NT_ALT)\n#define BIT_NT_CALL       NTYPE2BIT(NT_CALL)\n\n#define IS_NODE_TYPE_SIMPLE(type) \\\n  ((NTYPE2BIT(type) & (BIT_NT_STR | BIT_NT_CCLASS | BIT_NT_CTYPE |\\\n                       BIT_NT_CANY | BIT_NT_BREF)) != 0)\n\n#define NTYPE(node)             ((node)->u.base.type)\n#define SET_NTYPE(node, ntype)   (node)->u.base.type = (ntype)\n\n#define NSTR(node)         (&((node)->u.str))\n#define NCCLASS(node)      (&((node)->u.cclass))\n#define NCTYPE(node)       (&((node)->u.ctype))\n#define NBREF(node)        (&((node)->u.bref))\n#define NQTFR(node)        (&((node)->u.qtfr))\n#define NENCLOSE(node)     (&((node)->u.enclose))\n#define NANCHOR(node)      (&((node)->u.anchor))\n#define NCONS(node)        (&((node)->u.cons))\n#define NCALL(node)        (&((node)->u.call))\n\n#define NCAR(node)         (NCONS(node)->car)\n#define NCDR(node)         (NCONS(node)->cdr)\n\n\n\n#define ANCHOR_ANYCHAR_STAR_MASK (ANCHOR_ANYCHAR_STAR | ANCHOR_ANYCHAR_STAR_ML)\n#define ANCHOR_END_BUF_MASK      (ANCHOR_END_BUF | ANCHOR_SEMI_END_BUF)\n\n#define ENCLOSE_MEMORY           (1<<0)\n#define ENCLOSE_OPTION           (1<<1)\n#define ENCLOSE_STOP_BACKTRACK   (1<<2)\n#define ENCLOSE_CONDITION        (1<<3)\n\n#define NODE_STR_MARGIN         16\n#define NODE_STR_BUF_SIZE       24  /* sizeof(CClassNode) - sizeof(int)*4 */\n#define NODE_BACKREFS_SIZE       6\n\n#define NSTR_RAW                (1<<0) /* by backslashed number */\n#define NSTR_AMBIG              (1<<1)\n#define NSTR_DONT_GET_OPT_INFO  (1<<2)\n\n#define NSTRING_LEN(node) (OnigDistance )((node)->u.str.end - (node)->u.str.s)\n#define NSTRING_SET_RAW(node)          (node)->u.str.flag |= NSTR_RAW\n#define NSTRING_CLEAR_RAW(node)        (node)->u.str.flag &= ~NSTR_RAW\n#define NSTRING_SET_AMBIG(node)        (node)->u.str.flag |= NSTR_AMBIG\n#define NSTRING_SET_DONT_GET_OPT_INFO(node) \\\n  (node)->u.str.flag |= NSTR_DONT_GET_OPT_INFO\n#define NSTRING_IS_RAW(node)          (((node)->u.str.flag & NSTR_RAW)   != 0)\n#define NSTRING_IS_AMBIG(node)        (((node)->u.str.flag & NSTR_AMBIG) != 0)\n#define NSTRING_IS_DONT_GET_OPT_INFO(node) \\\n  (((node)->u.str.flag & NSTR_DONT_GET_OPT_INFO) != 0)\n\n#define BACKREFS_P(br) \\\n  (IS_NOT_NULL((br)->back_dynamic) ? (br)->back_dynamic : (br)->back_static);\n\n#define NQ_TARGET_ISNOT_EMPTY     0\n#define NQ_TARGET_IS_EMPTY        1\n#define NQ_TARGET_IS_EMPTY_MEM    2\n#define NQ_TARGET_IS_EMPTY_REC    3\n\n/* status bits */\n#define NST_MIN_FIXED             (1<<0)\n#define NST_MAX_FIXED             (1<<1)\n#define NST_CLEN_FIXED            (1<<2)\n#define NST_MARK1                 (1<<3)\n#define NST_MARK2                 (1<<4)\n#define NST_MEM_BACKREFED         (1<<5)\n#define NST_STOP_BT_SIMPLE_REPEAT (1<<6)\n#define NST_RECURSION             (1<<7)\n#define NST_CALLED                (1<<8)\n#define NST_ADDR_FIXED            (1<<9)\n#define NST_NAMED_GROUP           (1<<10)\n#define NST_NAME_REF              (1<<11)\n#define NST_IN_REPEAT             (1<<12) /* STK_REPEAT is nested in stack. */\n#define NST_NEST_LEVEL            (1<<13)\n#define NST_BY_NUMBER             (1<<14) /* {n,m} */\n\n#define SET_ENCLOSE_STATUS(node,f)      (node)->u.enclose.state |=  (f)\n#define CLEAR_ENCLOSE_STATUS(node,f)    (node)->u.enclose.state &= ~(f)\n\n#define IS_ENCLOSE_CALLED(en)          (((en)->state & NST_CALLED)        != 0)\n#define IS_ENCLOSE_ADDR_FIXED(en)      (((en)->state & NST_ADDR_FIXED)    != 0)\n#define IS_ENCLOSE_RECURSION(en)       (((en)->state & NST_RECURSION)     != 0)\n#define IS_ENCLOSE_MARK1(en)           (((en)->state & NST_MARK1)         != 0)\n#define IS_ENCLOSE_MARK2(en)           (((en)->state & NST_MARK2)         != 0)\n#define IS_ENCLOSE_MIN_FIXED(en)       (((en)->state & NST_MIN_FIXED)     != 0)\n#define IS_ENCLOSE_MAX_FIXED(en)       (((en)->state & NST_MAX_FIXED)     != 0)\n#define IS_ENCLOSE_CLEN_FIXED(en)      (((en)->state & NST_CLEN_FIXED)    != 0)\n#define IS_ENCLOSE_STOP_BT_SIMPLE_REPEAT(en) \\\n    (((en)->state & NST_STOP_BT_SIMPLE_REPEAT) != 0)\n#define IS_ENCLOSE_NAMED_GROUP(en)     (((en)->state & NST_NAMED_GROUP)   != 0)\n#define IS_ENCLOSE_NAME_REF(en)        (((en)->state & NST_NAME_REF)      != 0)\n\n#define SET_CALL_RECURSION(node)       (node)->u.call.state |= NST_RECURSION\n#define IS_CALL_RECURSION(cn)          (((cn)->state & NST_RECURSION)  != 0)\n#define IS_CALL_NAME_REF(cn)           (((cn)->state & NST_NAME_REF)   != 0)\n#define IS_BACKREF_NAME_REF(bn)        (((bn)->state & NST_NAME_REF)   != 0)\n#define IS_BACKREF_NEST_LEVEL(bn)      (((bn)->state & NST_NEST_LEVEL) != 0)\n#define IS_QUANTIFIER_IN_REPEAT(qn)    (((qn)->state & NST_IN_REPEAT)  != 0)\n#define IS_QUANTIFIER_BY_NUMBER(qn)    (((qn)->state & NST_BY_NUMBER)  != 0)\n\n#define CALLNODE_REFNUM_UNDEF  -1\n\ntypedef struct {\n  NodeBase base;\n  UChar* s;\n  UChar* end;\n  unsigned int flag;\n  int    capa;    /* (allocated size - 1) or 0: use buf[] */\n  UChar  buf[NODE_STR_BUF_SIZE];\n} StrNode;\n\ntypedef struct {\n  NodeBase base;\n  int state;\n  struct _Node* target;\n  int lower;\n  int upper;\n  int greedy;\n  int target_empty_info;\n  struct _Node* head_exact;\n  struct _Node* next_head_exact;\n  int is_refered;     /* include called node. don't eliminate even if {0} */\n#ifdef USE_COMBINATION_EXPLOSION_CHECK\n  int comb_exp_check_num;  /* 1,2,3...: check,  0: no check  */\n#endif\n} QtfrNode;\n\ntypedef struct {\n  NodeBase base;\n  int state;\n  int type;\n  int regnum;\n  OnigOptionType option;\n  struct _Node*  target;\n  AbsAddrType    call_addr;\n  /* for multiple call reference */\n  OnigDistance min_len; /* min length (byte) */\n  OnigDistance max_len; /* max length (byte) */\n  int char_len;         /* character length  */\n  int opt_count;        /* referenced count in optimize_node_left() */\n} EncloseNode;\n\n#ifdef USE_SUBEXP_CALL\n\ntypedef struct {\n  int           offset;\n  struct _Node* target;\n} UnsetAddr;\n\ntypedef struct {\n  int        num;\n  int        alloc;\n  UnsetAddr* us;\n} UnsetAddrList;\n\ntypedef struct {\n  NodeBase base;\n  int     state;\n  int     group_num;\n  UChar*  name;\n  UChar*  name_end;\n  struct _Node*  target;  /* EncloseNode : ENCLOSE_MEMORY */\n  UnsetAddrList* unset_addr_list;\n} CallNode;\n\n#endif\n\ntypedef struct {\n  NodeBase base;\n  int  state;\n  int  back_num;\n  int  back_static[NODE_BACKREFS_SIZE];\n  int* back_dynamic;\n  int  nest_level;\n} BRefNode;\n\ntypedef struct {\n  NodeBase base;\n  int type;\n  struct _Node* target;\n  int char_len;\n  int ascii_range;\n} AnchorNode;\n\ntypedef struct {\n  NodeBase base;\n  struct _Node* car;\n  struct _Node* cdr;\n} ConsAltNode;\n\ntypedef struct {\n  NodeBase base;\n  int ctype;\n  int not;\n  int ascii_range;\n} CtypeNode;\n\ntypedef struct _Node {\n  union {\n    NodeBase     base;\n    StrNode      str;\n    CClassNode   cclass;\n    QtfrNode     qtfr;\n    EncloseNode  enclose;\n    BRefNode     bref;\n    AnchorNode   anchor;\n    ConsAltNode  cons;\n    CtypeNode    ctype;\n#ifdef USE_SUBEXP_CALL\n    CallNode     call;\n#endif\n  } u;\n} Node;\n\n\n#define NULL_NODE  ((Node* )0)\n\n#define SCANENV_MEMNODES_SIZE               8\n#define SCANENV_MEM_NODES(senv)   \\\n (IS_NOT_NULL((senv)->mem_nodes_dynamic) ? \\\n    (senv)->mem_nodes_dynamic : (senv)->mem_nodes_static)\n\ntypedef struct {\n  OnigOptionType   option;\n  OnigCaseFoldType case_fold_flag;\n  OnigEncoding     enc;\n  OnigSyntaxType*  syntax;\n  BitStatusType    capture_history;\n  BitStatusType    bt_mem_start;\n  BitStatusType    bt_mem_end;\n  BitStatusType    backrefed_mem;\n  UChar*           pattern;\n  UChar*           pattern_end;\n  UChar*           error;\n  UChar*           error_end;\n  regex_t*         reg;       /* for reg->names only */\n  int              num_call;\n#ifdef USE_SUBEXP_CALL\n  UnsetAddrList*   unset_addr_list;\n#endif\n  int              num_mem;\n#ifdef USE_NAMED_GROUP\n  int              num_named;\n#endif\n  int              mem_alloc;\n  Node*            mem_nodes_static[SCANENV_MEMNODES_SIZE];\n  Node**           mem_nodes_dynamic;\n#ifdef USE_COMBINATION_EXPLOSION_CHECK\n  int num_comb_exp_check;\n  int comb_exp_max_regnum;\n  int curr_max_regnum;\n  int has_recursion;\n#endif\n} ScanEnv;\n\n\n#define IS_SYNTAX_OP(syn, opm)    (((syn)->op  & (opm)) != 0)\n#define IS_SYNTAX_OP2(syn, opm)   (((syn)->op2 & (opm)) != 0)\n#define IS_SYNTAX_BV(syn, bvm)    (((syn)->behavior & (bvm)) != 0)\n\n#ifdef USE_NAMED_GROUP\ntypedef struct {\n  int new_val;\n} GroupNumRemap;\n\nextern int    onig_renumber_name_table P_((regex_t* reg, GroupNumRemap* map));\n#endif\n\nextern int    onig_strncmp P_((const UChar* s1, const UChar* s2, int n));\nextern void   onig_strcpy P_((UChar* dest, const UChar* src, const UChar* end));\nextern void   onig_scan_env_set_error_string P_((ScanEnv* env, int ecode, UChar* arg, UChar* arg_end));\nextern int    onig_scan_unsigned_number P_((UChar** src, const UChar* end, OnigEncoding enc));\nextern void   onig_reduce_nested_quantifier P_((Node* pnode, Node* cnode));\nextern void   onig_node_conv_to_str_node P_((Node* node, int raw));\nextern int    onig_node_str_cat P_((Node* node, const UChar* s, const UChar* end));\nextern int    onig_node_str_set P_((Node* node, const UChar* s, const UChar* end));\nextern void   onig_node_free P_((Node* node));\nextern Node*  onig_node_new_enclose P_((int type));\nextern Node*  onig_node_new_anchor P_((int type));\nextern Node*  onig_node_new_str P_((const UChar* s, const UChar* end));\nextern Node*  onig_node_new_list P_((Node* left, Node* right));\nextern Node*  onig_node_list_add P_((Node* list, Node* x));\nextern Node*  onig_node_new_alt P_((Node* left, Node* right));\nextern void   onig_node_str_clear P_((Node* node));\nextern int    onig_free_node_list P_((void));\nextern int    onig_names_free P_((regex_t* reg));\nextern int    onig_parse_make_tree P_((Node** root, const UChar* pattern, const UChar* end, regex_t* reg, ScanEnv* env));\nextern int    onig_free_shared_cclass_table P_((void));\n\n#ifdef USE_SHARED_UNICODE_TABLE\nextern int    onig_free_shared_unicode_table P_((void));\n#endif //USE_SHARED_UNICODE_TABLE\n\n#ifdef ONIG_DEBUG\n#ifdef USE_NAMED_GROUP\nextern int onig_print_names(FILE*, regex_t*);\n#endif\n#endif\n\n#endif /* REGPARSE_H */\n"
  },
  {
    "path": "src/Onigmo/regposerr.c",
    "content": "/**********************************************************************\n  regposerr.c - Oniguruma (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2007  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#define regex_t   onig_regex_t\n#include \"regint.h\"\n#undef regex_t\n#include \"onigposix.h\"\n\n#ifdef HAVE_STRING_H\n# include <string.h>\n#else\n# include <strings.h>\n#endif\n\n#if defined(__GNUC__)\n#  define ARG_UNUSED  __attribute__ ((unused))\n#else\n#  define ARG_UNUSED\n#endif\n\nstatic char* ESTRING[] = {\n  NULL,\n  \"failed to match\",                         /* REG_NOMATCH    */\n  \"Invalid regular expression\",              /* REG_BADPAT     */\n  \"invalid collating element referenced\",    /* REG_ECOLLATE   */\n  \"invalid character class type referenced\", /* REG_ECTYPE     */\n  \"bad backslash-escape sequence\",           /* REG_EESCAPE    */\n  \"invalid back reference number\",           /* REG_ESUBREG    */\n  \"imbalanced [ and ]\",                      /* REG_EBRACK     */\n  \"imbalanced ( and )\",                      /* REG_EPAREN     */\n  \"imbalanced { and }\",                      /* REG_EBRACE     */\n  \"invalid repeat range {n,m}\",              /* REG_BADBR      */\n  \"invalid range\",                           /* REG_ERANGE     */\n  \"Out of memory\",                           /* REG_ESPACE     */\n  \"? * + not preceded by valid regular expression\", /* REG_BADRPT   */\n\n  /* Extended errors */\n  \"internal error\",                          /* REG_EONIG_INTERNAL */\n  \"invalid wide char value\",                 /* REG_EONIG_BADWC    */\n  \"invalid argument\",                        /* REG_EONIG_BADARG   */\n  \"multi-thread error\"                       /* REG_EONIG_THREAD   */\n};\n\n#include <stdio.h>\n\n\nextern size_t\nregerror(int posix_ecode, const regex_t* reg ARG_UNUSED, char* buf,\n\t size_t size)\n{\n  char* s;\n  char tbuf[35];\n  size_t len;\n\n  if (posix_ecode > 0\n      && posix_ecode < (int )(sizeof(ESTRING) / sizeof(ESTRING[0]))) {\n    s = ESTRING[posix_ecode];\n  }\n  else if (posix_ecode == 0) {\n    s = \"\";\n  }\n  else {\n    sprintf(tbuf, \"undefined error code (%d)\", posix_ecode);\n    s = tbuf;\n  }\n\n  len = strlen(s) + 1; /* use strlen() because s is ascii encoding. */\n\n  if (buf != NULL && size > 0) {\n    strncpy(buf, s, size - 1);\n    buf[size - 1] = '\\0';\n  }\n  return len;\n}\n"
  },
  {
    "path": "src/Onigmo/regposix.c",
    "content": "/**********************************************************************\n  regposix.c - Onigmo (Oniguruma-mod) (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2008  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * Copyright (c) 2011       K.Takata  <kentkt AT csc DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#define regex_t   onig_regex_t\n#include \"regint.h\"\n#undef regex_t\n#include \"onigposix.h\"\n\n#define ONIG_C(reg)    ((onig_regex_t* )((reg)->onig))\n#define PONIG_C(reg)   ((onig_regex_t** )(&(reg)->onig))\n\n/* #define ENC_STRING_LEN(enc,s,len)    len = strlen(s) */\n#define ENC_STRING_LEN(enc,s,len) do { \\\n  if (ONIGENC_MBC_MINLEN(enc) == 1) { \\\n    UChar* tmps = (UChar* )(s); \\\n    while (*tmps != 0) tmps++; \\\n    len = (int )(tmps - (UChar* )(s)); \\\n  } \\\n  else { \\\n    len = onigenc_str_bytelen_null(enc, (UChar* )s); \\\n  } \\\n} while(0)\n\n/* #define ENC_STRING_LEN_SE(enc,s,len)    len = strlen(s) */\n#define ENC_STRING_LEN_SE(enc,s,len) do { \\\n  if (ONIGENC_MBC_MINLEN(enc) == 1) { \\\n    OnigPosition tmps = s; \\\n    while (ONIG_CHARAT(tmps) != 0) tmps++; \\\n    len = tmps - s; \\\n  } \\\n  else { \\\n    len = onigenc_str_bytelen_null_se(it, enc, s); \\\n  } \\\n} while(0)\n\ntypedef struct {\n  int onig_err;\n  int posix_err;\n} O2PERR;\n\nstatic int\nonig2posix_error_code(int code)\n{\n  static const O2PERR o2p[] = {\n    { ONIG_MISMATCH,                                      REG_NOMATCH },\n    { ONIG_NO_SUPPORT_CONFIG,                             REG_EONIG_INTERNAL },\n    { ONIGERR_MEMORY,                                     REG_ESPACE  },\n    { ONIGERR_MATCH_STACK_LIMIT_OVER,                     REG_EONIG_INTERNAL },\n    { ONIGERR_TYPE_BUG,                                   REG_EONIG_INTERNAL },\n    { ONIGERR_PARSER_BUG,                                 REG_EONIG_INTERNAL },\n    { ONIGERR_STACK_BUG,                                  REG_EONIG_INTERNAL },\n    { ONIGERR_UNDEFINED_BYTECODE,                         REG_EONIG_INTERNAL },\n    { ONIGERR_UNEXPECTED_BYTECODE,                        REG_EONIG_INTERNAL },\n    { ONIGERR_DEFAULT_ENCODING_IS_NOT_SET,                REG_EONIG_BADARG },\n    { ONIGERR_SPECIFIED_ENCODING_CANT_CONVERT_TO_WIDE_CHAR, REG_EONIG_BADARG },\n    { ONIGERR_INVALID_ARGUMENT,                           REG_EONIG_BADARG },\n    { ONIGERR_END_PATTERN_AT_LEFT_BRACE,                  REG_EBRACE  },\n    { ONIGERR_END_PATTERN_AT_LEFT_BRACKET,                REG_EBRACK  },\n    { ONIGERR_EMPTY_CHAR_CLASS,                           REG_ECTYPE  },\n    { ONIGERR_PREMATURE_END_OF_CHAR_CLASS,                REG_ECTYPE  },\n    { ONIGERR_END_PATTERN_AT_ESCAPE,                      REG_EESCAPE },\n    { ONIGERR_END_PATTERN_AT_META,                        REG_EESCAPE },\n    { ONIGERR_END_PATTERN_AT_CONTROL,                     REG_EESCAPE },\n    { ONIGERR_META_CODE_SYNTAX,                           REG_BADPAT  },\n    { ONIGERR_CONTROL_CODE_SYNTAX,                        REG_BADPAT  },\n    { ONIGERR_CHAR_CLASS_VALUE_AT_END_OF_RANGE,           REG_ECTYPE  },\n    { ONIGERR_CHAR_CLASS_VALUE_AT_START_OF_RANGE,         REG_ECTYPE  },\n    { ONIGERR_UNMATCHED_RANGE_SPECIFIER_IN_CHAR_CLASS,    REG_ECTYPE  },\n    { ONIGERR_TARGET_OF_REPEAT_OPERATOR_NOT_SPECIFIED,    REG_BADRPT  },\n    { ONIGERR_TARGET_OF_REPEAT_OPERATOR_INVALID,          REG_BADRPT  },\n    { ONIGERR_NESTED_REPEAT_OPERATOR,                     REG_BADRPT  },\n    { ONIGERR_UNMATCHED_CLOSE_PARENTHESIS,                REG_EPAREN  },\n    { ONIGERR_END_PATTERN_WITH_UNMATCHED_PARENTHESIS,     REG_EPAREN  },\n    { ONIGERR_END_PATTERN_IN_GROUP,                       REG_BADPAT  },\n    { ONIGERR_UNDEFINED_GROUP_OPTION,                     REG_BADPAT  },\n    { ONIGERR_INVALID_POSIX_BRACKET_TYPE,                 REG_BADPAT  },\n    { ONIGERR_INVALID_LOOK_BEHIND_PATTERN,                REG_BADPAT  },\n    { ONIGERR_INVALID_REPEAT_RANGE_PATTERN,               REG_BADPAT  },\n    { ONIGERR_TOO_BIG_NUMBER,                             REG_BADPAT  },\n    { ONIGERR_TOO_BIG_NUMBER_FOR_REPEAT_RANGE,            REG_BADBR   },\n    { ONIGERR_UPPER_SMALLER_THAN_LOWER_IN_REPEAT_RANGE,   REG_BADBR   },\n    { ONIGERR_EMPTY_RANGE_IN_CHAR_CLASS,                  REG_ECTYPE  },\n    { ONIGERR_MISMATCH_CODE_LENGTH_IN_CLASS_RANGE,        REG_ECTYPE  },\n    { ONIGERR_TOO_MANY_MULTI_BYTE_RANGES,                 REG_ECTYPE  },\n    { ONIGERR_TOO_SHORT_MULTI_BYTE_STRING,                REG_BADPAT  },\n    { ONIGERR_TOO_BIG_BACKREF_NUMBER,                     REG_ESUBREG },\n    { ONIGERR_INVALID_BACKREF,                            REG_ESUBREG },\n    { ONIGERR_NUMBERED_BACKREF_OR_CALL_NOT_ALLOWED,       REG_BADPAT  },\n    { ONIGERR_TOO_BIG_WIDE_CHAR_VALUE,                    REG_EONIG_BADWC },\n    { ONIGERR_TOO_LONG_WIDE_CHAR_VALUE,                   REG_EONIG_BADWC },\n    { ONIGERR_INVALID_CODE_POINT_VALUE,                   REG_EONIG_BADWC },\n    { ONIGERR_EMPTY_GROUP_NAME,                           REG_BADPAT },\n    { ONIGERR_INVALID_GROUP_NAME,                         REG_BADPAT },\n    { ONIGERR_INVALID_CHAR_IN_GROUP_NAME,                 REG_BADPAT },\n    { ONIGERR_UNDEFINED_NAME_REFERENCE,                   REG_BADPAT },\n    { ONIGERR_UNDEFINED_GROUP_REFERENCE,                  REG_BADPAT },\n    { ONIGERR_MULTIPLEX_DEFINED_NAME,                     REG_BADPAT },\n    { ONIGERR_MULTIPLEX_DEFINITION_NAME_CALL,             REG_BADPAT },\n    { ONIGERR_NEVER_ENDING_RECURSION,                     REG_BADPAT },\n    { ONIGERR_GROUP_NUMBER_OVER_FOR_CAPTURE_HISTORY,      REG_BADPAT },\n    { ONIGERR_INVALID_CHAR_PROPERTY_NAME,                 REG_BADPAT },\n    { ONIGERR_NOT_SUPPORTED_ENCODING_COMBINATION,         REG_EONIG_BADARG },\n    { ONIGERR_OVER_THREAD_PASS_LIMIT_COUNT,               REG_EONIG_THREAD }\n\n  };\n\n  int i;\n\n  if (code >= 0) return 0;\n\n  for (i = 0; i < (int )(sizeof(o2p) / sizeof(o2p[0])); i++) {\n    if (code == o2p[i].onig_err)\n      return o2p[i].posix_err;\n  }\n\n  return REG_EONIG_INTERNAL;  /* but, unknown error code */\n}\n\nextern int\nregcomp(regex_t* reg, const char* pattern, int posix_options)\n{\n  int r, len;\n  OnigSyntaxType* syntax = OnigDefaultSyntax;\n  OnigOptionType options;\n\n  if ((posix_options & REG_EXTENDED) == 0)\n    syntax = ONIG_SYNTAX_POSIX_BASIC;\n\n  options = syntax->options;\n  if ((posix_options & REG_ICASE)   != 0)\n    ONIG_OPTION_ON(options, ONIG_OPTION_IGNORECASE);\n  if ((posix_options & REG_NEWLINE) != 0) {\n    ONIG_OPTION_ON( options, ONIG_OPTION_NEGATE_SINGLELINE);\n    ONIG_OPTION_OFF(options, ONIG_OPTION_SINGLELINE);\n  }\n\n  reg->comp_options = posix_options;\n\n  ENC_STRING_LEN(OnigEncDefaultCharEncoding, pattern, len);\n  r = onig_new(PONIG_C(reg), (UChar* )pattern, (UChar* )(pattern + len),\n\t       options, OnigEncDefaultCharEncoding, syntax,\n\t       (OnigErrorInfo* )NULL);\n  if (r != ONIG_NORMAL) {\n    return onig2posix_error_code(r);\n  }\n\n  reg->re_nsub = ONIG_C(reg)->num_mem;\n  return 0;\n}\n\nextern OnigPosition\nregexec(OnigIterator* it, regex_t* reg, OnigPosition str, size_t nmatch,\n\tregmatch_t pmatch[], int posix_options)\n{\n  OnigPosition r, i, len;\n  OnigPosition end;\n  regmatch_t* pm;\n  OnigOptionType options;\n\n  options = ONIG_OPTION_POSIX_REGION;\n  if ((posix_options & REG_NOTBOL) != 0) options |= ONIG_OPTION_NOTBOL;\n  if ((posix_options & REG_NOTEOL) != 0) options |= ONIG_OPTION_NOTEOL;\n\n  if (nmatch == 0 || (reg->comp_options & REG_NOSUB) != 0) {\n    pm = (regmatch_t* )NULL;\n    nmatch = 0;\n  }\n  else if ((int )nmatch < ONIG_C(reg)->num_mem + 1) {\n    pm = (regmatch_t* )xmalloc(sizeof(regmatch_t)\n                               * (ONIG_C(reg)->num_mem + 1));\n    if (pm == NULL)\n      return REG_ESPACE;\n  }\n  else {\n    pm = pmatch;\n  }\n\n  ENC_STRING_LEN_SE(ONIG_C(reg)->enc, str, len);\n  end = str + len;\n  r = onig_search(it, ONIG_C(reg), str, end, str, end,\n\t\t  (OnigRegion* )pm, options);\n\n  if (r >= 0) {\n    r = 0; /* Match */\n    if (pm != pmatch && pm != NULL) {\n      xmemcpy(pmatch, pm, sizeof(regmatch_t) * nmatch);\n    }\n  }\n  else if (r == ONIG_MISMATCH) {\n    r = REG_NOMATCH;\n    for (i = 0; i < (int )nmatch; i++)\n      pmatch[i].rm_so = pmatch[i].rm_eo = ONIG_REGION_NOTPOS;\n  }\n  else {\n    r = onig2posix_error_code((int)r);\n  }\n\n  if (pm != pmatch && pm != NULL)\n    xfree(pm);\n\n#if 0\n  if (reg->re_nsub > nmatch - 1)\n    reg->re_nsub = (nmatch <= 1 ? 0 : nmatch - 1);\n#endif\n\n  return r;\n}\n\nextern void\nregfree(regex_t* reg)\n{\n  onig_free(ONIG_C(reg));\n}\n\n\nextern void\nreg_set_encoding(int mb_code)\n{\n  OnigEncoding enc;\n\n  switch (mb_code) {\n  case REG_POSIX_ENCODING_ASCII:\n    enc = ONIG_ENCODING_ASCII;\n    break;\n  case REG_POSIX_ENCODING_EUC_JP:\n    enc = ONIG_ENCODING_EUC_JP;\n    break;\n  case REG_POSIX_ENCODING_SJIS:\n    enc = ONIG_ENCODING_SJIS;\n    break;\n  case REG_POSIX_ENCODING_UTF8:\n    enc = ONIG_ENCODING_UTF8;\n    break;\n  case REG_POSIX_ENCODING_UTF16_BE:\n    enc = ONIG_ENCODING_UTF16_BE;\n    break;\n  case REG_POSIX_ENCODING_UTF16_LE:\n    enc = ONIG_ENCODING_UTF16_LE;\n    break;\n\n  default:\n    return ;\n    break;\n  }\n\n  onigenc_set_default_encoding(enc);\n}\n\nextern int\nreg_name_to_group_numbers(regex_t* reg,\n  const unsigned char* name, const unsigned char* name_end, int** nums)\n{\n  return onig_name_to_group_numbers(ONIG_C(reg), name, name_end, nums);\n}\n\ntypedef struct {\n  int (*func)(const unsigned char*, const unsigned char*,int,int*,regex_t*,void*);\n  regex_t* reg;\n  void* arg;\n} i_wrap;\n\nstatic int\ni_wrapper(const UChar* name, const UChar* name_end, int ng, int* gs,\n\t  onig_regex_t* reg ARG_UNUSED, void* arg)\n{\n  i_wrap* warg = (i_wrap* )arg;\n\n  return (*warg->func)(name, name_end, ng, gs, warg->reg, warg->arg);\n}\n\nextern int\nreg_foreach_name(regex_t* reg,\n int (*func)(const unsigned char*, const unsigned char*,int,int*,regex_t*,void*),\n void* arg)\n{\n  i_wrap warg;\n\n  warg.func = func;\n  warg.reg  = reg;\n  warg.arg  = arg;\n\n  return onig_foreach_name(ONIG_C(reg), i_wrapper, &warg);\n}\n\nextern int\nreg_number_of_names(regex_t* reg)\n{\n  return onig_number_of_names(ONIG_C(reg));\n}\n"
  },
  {
    "path": "src/Onigmo/regsyntax.c",
    "content": "/**********************************************************************\n  regsyntax.c -  Onigmo (Oniguruma-mod) (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2006  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * Copyright (c) 2011-2012  K.Takata  <kentkt AT csc DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regint.h\"\n\nOnigSyntaxType OnigSyntaxASIS = {\n    0\n  , ONIG_SYN_OP2_INEFFECTIVE_ESCAPE\n  , 0\n  , ONIG_OPTION_NONE\n  ,\n  {\n      (OnigCodePoint )'\\\\'                       /* esc */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar '.'  */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anytime '*'  */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* zero or one time '?' */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* one or more time '+' */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar anytime */\n  }\n};\n\nOnigSyntaxType OnigSyntaxWildChar = {\n  ONIG_SYN_OP_VARIABLE_META_CHARACTERS\n  , 0\n  , 0\n  , ONIG_OPTION_SINGLELINE \n  ,\n  {\n  \t  (OnigCodePoint )'\\\\'                       /* esc */\n  \t, (OnigCodePoint )'?'\t\t\t\t\t\t /* anychar '.'  */\n  \t, (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anytime '*'  */\n  \t, (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* zero or one time '?' */\n  \t, (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* one or more time '+' */\n  \t, (OnigCodePoint )'*'\t\t\t\t\t\t /* anychar anytime */\n  }\n};\n\nOnigSyntaxType OnigSyntaxPosixBasic = {\n  ( SYN_POSIX_COMMON_OP | ONIG_SYN_OP_ESC_LPAREN_SUBEXP |\n    ONIG_SYN_OP_ESC_BRACE_INTERVAL )\n  , 0\n  , 0\n  , ( ONIG_OPTION_SINGLELINE | ONIG_OPTION_MULTILINE )\n  ,\n  {\n      (OnigCodePoint )'\\\\'                       /* esc */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar '.'  */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anytime '*'  */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* zero or one time '?' */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* one or more time '+' */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar anytime */\n  }\n};\n\nOnigSyntaxType OnigSyntaxPosixExtended = {\n  ( SYN_POSIX_COMMON_OP | ONIG_SYN_OP_LPAREN_SUBEXP |\n    ONIG_SYN_OP_BRACE_INTERVAL |\n    ONIG_SYN_OP_PLUS_ONE_INF | ONIG_SYN_OP_QMARK_ZERO_ONE | ONIG_SYN_OP_VBAR_ALT )\n  , 0\n  , ( ONIG_SYN_CONTEXT_INDEP_ANCHORS |\n      ONIG_SYN_CONTEXT_INDEP_REPEAT_OPS | ONIG_SYN_CONTEXT_INVALID_REPEAT_OPS |\n      ONIG_SYN_ALLOW_UNMATCHED_CLOSE_SUBEXP |\n      ONIG_SYN_ALLOW_DOUBLE_RANGE_OP_IN_CC )\n  , ( ONIG_OPTION_SINGLELINE | ONIG_OPTION_MULTILINE )\n  ,\n  {\n      (OnigCodePoint )'\\\\'                       /* esc */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar '.'  */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anytime '*'  */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* zero or one time '?' */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* one or more time '+' */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar anytime */\n  }\n};\n\nOnigSyntaxType OnigSyntaxEmacs = {\n  ( ONIG_SYN_OP_DOT_ANYCHAR | ONIG_SYN_OP_BRACKET_CC |\n    ONIG_SYN_OP_ESC_BRACE_INTERVAL |\n    ONIG_SYN_OP_ESC_LPAREN_SUBEXP | ONIG_SYN_OP_ESC_VBAR_ALT |\n    ONIG_SYN_OP_ASTERISK_ZERO_INF | ONIG_SYN_OP_PLUS_ONE_INF |\n    ONIG_SYN_OP_QMARK_ZERO_ONE | ONIG_SYN_OP_DECIMAL_BACKREF |\n    ONIG_SYN_OP_LINE_ANCHOR | ONIG_SYN_OP_ESC_CONTROL_CHARS )\n  , ONIG_SYN_OP2_ESC_GNU_BUF_ANCHOR\n  , ONIG_SYN_ALLOW_EMPTY_RANGE_IN_CC\n  , ONIG_OPTION_NONE\n  ,\n  {\n      (OnigCodePoint )'\\\\'                       /* esc */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar '.'  */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anytime '*'  */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* zero or one time '?' */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* one or more time '+' */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar anytime */\n  }\n};\n\nOnigSyntaxType OnigSyntaxGrep = {\n  ( ONIG_SYN_OP_DOT_ANYCHAR | ONIG_SYN_OP_BRACKET_CC | ONIG_SYN_OP_POSIX_BRACKET |\n    ONIG_SYN_OP_ESC_BRACE_INTERVAL | ONIG_SYN_OP_ESC_LPAREN_SUBEXP |\n    ONIG_SYN_OP_ESC_VBAR_ALT |\n    ONIG_SYN_OP_ASTERISK_ZERO_INF | ONIG_SYN_OP_ESC_PLUS_ONE_INF |\n    ONIG_SYN_OP_ESC_QMARK_ZERO_ONE | ONIG_SYN_OP_LINE_ANCHOR |\n    ONIG_SYN_OP_ESC_W_WORD | ONIG_SYN_OP_ESC_B_WORD_BOUND |\n    ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END | ONIG_SYN_OP_DECIMAL_BACKREF )\n  , 0\n  , ( ONIG_SYN_ALLOW_EMPTY_RANGE_IN_CC | ONIG_SYN_NOT_NEWLINE_IN_NEGATIVE_CC )\n  , ONIG_OPTION_NONE\n  ,\n  {\n      (OnigCodePoint )'\\\\'                       /* esc */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar '.'  */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anytime '*'  */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* zero or one time '?' */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* one or more time '+' */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar anytime */\n  }\n};\n\nOnigSyntaxType OnigSyntaxGnuRegex = {\n  SYN_GNU_REGEX_OP\n  , 0\n  , SYN_GNU_REGEX_BV\n  , ONIG_OPTION_NONE\n  ,\n  {\n      (OnigCodePoint )'\\\\'                       /* esc */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar '.'  */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anytime '*'  */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* zero or one time '?' */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* one or more time '+' */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar anytime */\n  }\n};\n\nOnigSyntaxType OnigSyntaxJava = {\n  (( SYN_GNU_REGEX_OP | ONIG_SYN_OP_QMARK_NON_GREEDY |\n     ONIG_SYN_OP_ESC_CONTROL_CHARS | ONIG_SYN_OP_ESC_C_CONTROL |\n     ONIG_SYN_OP_ESC_OCTAL3 | ONIG_SYN_OP_ESC_X_HEX2 )\n   & ~ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END )\n  , ( ONIG_SYN_OP2_ESC_CAPITAL_Q_QUOTE | ONIG_SYN_OP2_QMARK_GROUP_EFFECT |\n      ONIG_SYN_OP2_OPTION_PERL | ONIG_SYN_OP2_PLUS_POSSESSIVE_REPEAT |\n      ONIG_SYN_OP2_PLUS_POSSESSIVE_INTERVAL | ONIG_SYN_OP2_CCLASS_SET_OP |\n      ONIG_SYN_OP2_ESC_V_VTAB | ONIG_SYN_OP2_ESC_U_HEX4 |\n      ONIG_SYN_OP2_ESC_P_BRACE_CHAR_PROPERTY )\n  , ( SYN_GNU_REGEX_BV | ONIG_SYN_DIFFERENT_LEN_ALT_LOOK_BEHIND )\n  , ( ONIG_OPTION_SINGLELINE | ONIG_OPTION_ASCII_RANGE |\n      ONIG_OPTION_WORD_BOUND_ALL_RANGE )\n  ,\n  {\n      (OnigCodePoint )'\\\\'                       /* esc */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar '.'  */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anytime '*'  */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* zero or one time '?' */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* one or more time '+' */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar anytime */\n  }\n};\n\n/* Perl 5.8 */\nOnigSyntaxType OnigSyntaxPerl58 = {\n  (( SYN_GNU_REGEX_OP | ONIG_SYN_OP_QMARK_NON_GREEDY |\n     ONIG_SYN_OP_ESC_OCTAL3 | ONIG_SYN_OP_ESC_X_HEX2 |\n     ONIG_SYN_OP_ESC_X_BRACE_HEX8 | ONIG_SYN_OP_ESC_CONTROL_CHARS |\n     ONIG_SYN_OP_ESC_C_CONTROL )\n   & ~ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END )\n  , ( ONIG_SYN_OP2_ESC_CAPITAL_Q_QUOTE |\n      ONIG_SYN_OP2_QMARK_GROUP_EFFECT | ONIG_SYN_OP2_OPTION_PERL |\n      ONIG_SYN_OP2_ESC_P_BRACE_CHAR_PROPERTY |\n      ONIG_SYN_OP2_ESC_P_BRACE_CIRCUMFLEX_NOT |\n      ONIG_SYN_OP2_ESC_CAPITAL_X_EXTENDED_GRAPHEME_CLUSTER |\n      ONIG_SYN_OP2_QMARK_LPAREN_CONDITION)\n  , SYN_GNU_REGEX_BV\n  , ONIG_OPTION_SINGLELINE\n  ,\n  {\n      (OnigCodePoint )'\\\\'                       /* esc */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar '.'  */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anytime '*'  */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* zero or one time '?' */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* one or more time '+' */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar anytime */\n  }\n};\n\n/* Perl 5.8 + named group */\nOnigSyntaxType OnigSyntaxPerl58_NG = {\n  (( SYN_GNU_REGEX_OP | ONIG_SYN_OP_QMARK_NON_GREEDY |\n     ONIG_SYN_OP_ESC_OCTAL3 | ONIG_SYN_OP_ESC_X_HEX2 |\n     ONIG_SYN_OP_ESC_X_BRACE_HEX8 | ONIG_SYN_OP_ESC_CONTROL_CHARS |\n     ONIG_SYN_OP_ESC_C_CONTROL )\n   & ~ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END )\n  , ( ONIG_SYN_OP2_ESC_CAPITAL_Q_QUOTE |\n      ONIG_SYN_OP2_QMARK_GROUP_EFFECT | ONIG_SYN_OP2_OPTION_PERL |\n      ONIG_SYN_OP2_ESC_P_BRACE_CHAR_PROPERTY  |\n      ONIG_SYN_OP2_ESC_P_BRACE_CIRCUMFLEX_NOT |\n      ONIG_SYN_OP2_ESC_CAPITAL_X_EXTENDED_GRAPHEME_CLUSTER |\n      ONIG_SYN_OP2_QMARK_LPAREN_CONDITION     |\n      ONIG_SYN_OP2_QMARK_LT_NAMED_GROUP       |\n      ONIG_SYN_OP2_ESC_K_NAMED_BACKREF        |\n      ONIG_SYN_OP2_ESC_G_SUBEXP_CALL )\n  , ( SYN_GNU_REGEX_BV |\n      ONIG_SYN_CAPTURE_ONLY_NAMED_GROUP |\n      ONIG_SYN_ALLOW_MULTIPLEX_DEFINITION_NAME )\n  , ONIG_OPTION_SINGLELINE\n  ,\n  {\n      (OnigCodePoint )'\\\\'                       /* esc */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar '.'  */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anytime '*'  */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* zero or one time '?' */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* one or more time '+' */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar anytime */\n  }\n};\n\n/* Perl 5.10+ */\nOnigSyntaxType OnigSyntaxPerl = {\n  (( SYN_GNU_REGEX_OP | ONIG_SYN_OP_QMARK_NON_GREEDY |\n     ONIG_SYN_OP_ESC_OCTAL3 | ONIG_SYN_OP_ESC_X_HEX2 |\n     ONIG_SYN_OP_ESC_X_BRACE_HEX8 | ONIG_SYN_OP_ESC_CONTROL_CHARS |\n     ONIG_SYN_OP_ESC_C_CONTROL )\n   & ~ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END )\n  , ( ONIG_SYN_OP2_ESC_CAPITAL_Q_QUOTE |\n      ONIG_SYN_OP2_QMARK_GROUP_EFFECT | ONIG_SYN_OP2_OPTION_PERL |\n      ONIG_SYN_OP2_ESC_P_BRACE_CHAR_PROPERTY  |\n      ONIG_SYN_OP2_ESC_P_BRACE_CIRCUMFLEX_NOT |\n      ONIG_SYN_OP2_ESC_CAPITAL_X_EXTENDED_GRAPHEME_CLUSTER |\n      ONIG_SYN_OP2_QMARK_LPAREN_CONDITION |\n      ONIG_SYN_OP2_PLUS_POSSESSIVE_REPEAT |\n      ONIG_SYN_OP2_PLUS_POSSESSIVE_INTERVAL |\n      ONIG_SYN_OP2_ESC_CAPITAL_R_LINEBREAK |\n      ONIG_SYN_OP2_ESC_CAPITAL_K_KEEP |\n      ONIG_SYN_OP2_QMARK_SUBEXP_CALL |\n      ONIG_SYN_OP2_ESC_G_BRACE_BACKREF |\n      ONIG_SYN_OP2_QMARK_CAPITAL_P_NAMED_GROUP |\n      ONIG_SYN_OP2_QMARK_LT_NAMED_GROUP |\n      ONIG_SYN_OP2_ESC_K_NAMED_BACKREF )\n  , ( SYN_GNU_REGEX_BV |\n      ONIG_SYN_ALLOW_MULTIPLEX_DEFINITION_NAME |\n      ONIG_SYN_ALLOW_MULTIPLEX_DEFINITION_NAME_CALL )\n  , ( ONIG_OPTION_SINGLELINE | ONIG_OPTION_CAPTURE_GROUP )\n  ,\n  {\n      (OnigCodePoint )'\\\\'                       /* esc */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar '.'  */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anytime '*'  */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* zero or one time '?' */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* one or more time '+' */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar anytime */\n  }\n};\n\nOnigSyntaxType OnigSyntaxPython = {\n  (( SYN_GNU_REGEX_OP | ONIG_SYN_OP_QMARK_NON_GREEDY |\n     ONIG_SYN_OP_ESC_OCTAL3 | ONIG_SYN_OP_ESC_X_HEX2 |\n     ONIG_SYN_OP_ESC_X_BRACE_HEX8 | ONIG_SYN_OP_ESC_CONTROL_CHARS |\n     ONIG_SYN_OP_ESC_C_CONTROL )\n   & ~ONIG_SYN_OP_ESC_LTGT_WORD_BEGIN_END )\n  , ( ONIG_SYN_OP2_QMARK_GROUP_EFFECT | ONIG_SYN_OP2_OPTION_PERL |\n      ONIG_SYN_OP2_ESC_P_BRACE_CHAR_PROPERTY  |\n      ONIG_SYN_OP2_ESC_P_BRACE_CIRCUMFLEX_NOT |\n      ONIG_SYN_OP2_PLUS_POSSESSIVE_REPEAT |\n      ONIG_SYN_OP2_ESC_V_VTAB |\n      ONIG_SYN_OP2_ESC_U_HEX4 |\n      ONIG_SYN_OP2_QMARK_LPAREN_CONDITION |\n      ONIG_SYN_OP2_QMARK_CAPITAL_P_NAMED_GROUP )\n  , ( SYN_GNU_REGEX_BV |\n      ONIG_SYN_ALLOW_INTERVAL_LOW_ABBREV )\n  , ( ONIG_OPTION_SINGLELINE | ONIG_OPTION_ASCII_RANGE )\n  ,\n  {\n      (OnigCodePoint )'\\\\'                       /* esc */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar '.'  */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anytime '*'  */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* zero or one time '?' */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* one or more time '+' */\n    , (OnigCodePoint )ONIG_INEFFECTIVE_META_CHAR /* anychar anytime */\n  }\n};\n\n\n\nextern int\nonig_set_default_syntax(OnigSyntaxType* syntax)\n{\n  if (IS_NULL(syntax))\n    syntax = ONIG_SYNTAX_RUBY;\n\n  OnigDefaultSyntax = syntax;\n  return 0;\n}\n\nextern void\nonig_copy_syntax(OnigSyntaxType* to, const OnigSyntaxType* from)\n{\n  *to = *from;\n}\n\nextern void\nonig_set_syntax_op(OnigSyntaxType* syntax, unsigned int op)\n{\n  syntax->op = op;\n}\n\nextern void\nonig_set_syntax_op2(OnigSyntaxType* syntax, unsigned int op2)\n{\n  syntax->op2 = op2;\n}\n\nextern void\nonig_set_syntax_behavior(OnigSyntaxType* syntax, unsigned int behavior)\n{\n  syntax->behavior = behavior;\n}\n\nextern void\nonig_set_syntax_options(OnigSyntaxType* syntax, OnigOptionType options)\n{\n  syntax->options = options;\n}\n\nextern unsigned int\nonig_get_syntax_op(OnigSyntaxType* syntax)\n{\n  return syntax->op;\n}\n\nextern unsigned int\nonig_get_syntax_op2(OnigSyntaxType* syntax)\n{\n  return syntax->op2;\n}\n\nextern unsigned int\nonig_get_syntax_behavior(OnigSyntaxType* syntax)\n{\n  return syntax->behavior;\n}\n\nextern OnigOptionType\nonig_get_syntax_options(OnigSyntaxType* syntax)\n{\n  return syntax->options;\n}\n\n#ifdef USE_VARIABLE_META_CHARS\nextern int onig_set_meta_char(OnigSyntaxType* enc,\n                              unsigned int what, OnigCodePoint code)\n{\n  switch (what) {\n  case ONIG_META_CHAR_ESCAPE:\n    enc->meta_char_table.esc = code;\n    break;\n  case ONIG_META_CHAR_ANYCHAR:\n    enc->meta_char_table.anychar = code;\n    break;\n  case ONIG_META_CHAR_ANYTIME:\n    enc->meta_char_table.anytime = code;\n    break;\n  case ONIG_META_CHAR_ZERO_OR_ONE_TIME:\n    enc->meta_char_table.zero_or_one_time = code;\n    break;\n  case ONIG_META_CHAR_ONE_OR_MORE_TIME:\n    enc->meta_char_table.one_or_more_time = code;\n    break;\n  case ONIG_META_CHAR_ANYCHAR_ANYTIME:\n    enc->meta_char_table.anychar_anytime = code;\n    break;\n  default:\n    return ONIGERR_INVALID_ARGUMENT;\n    break;\n  }\n  return 0;\n}\n#endif /* USE_VARIABLE_META_CHARS */\n"
  },
  {
    "path": "src/Onigmo/regtrav.c",
    "content": "/**********************************************************************\n  regtrav.c -  Onigmo (Oniguruma-mod) (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2004  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * Copyright (c) 2011       K.Takata  <kentkt AT csc DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"regint.h\"\n\n#ifdef USE_CAPTURE_HISTORY\n\nstatic int\ncapture_tree_traverse(OnigCaptureTreeNode* node, int at,\n              int(*callback_func)(int,OnigPosition,OnigPosition,int,int,void*),\n              int level, void* arg)\n{\n  int r, i;\n\n  if (node == (OnigCaptureTreeNode* )0)\n    return 0;\n\n  if ((at & ONIG_TRAVERSE_CALLBACK_AT_FIRST) != 0) {\n    r = (*callback_func)(node->group, node->beg, node->end,\n                         level, ONIG_TRAVERSE_CALLBACK_AT_FIRST, arg);\n    if (r != 0) return r;\n  }\n\n  for (i = 0; i < node->num_childs; i++) {\n    r = capture_tree_traverse(node->childs[i], at,\n                              callback_func, level + 1, arg);\n    if (r != 0) return r;\n  }\n\n  if ((at & ONIG_TRAVERSE_CALLBACK_AT_LAST) != 0) {\n    r = (*callback_func)(node->group, node->beg, node->end,\n                         level, ONIG_TRAVERSE_CALLBACK_AT_LAST, arg);\n    if (r != 0) return r;\n  }\n\n  return 0;\n}\n#endif /* USE_CAPTURE_HISTORY */\n\nextern int\nonig_capture_tree_traverse(OnigRegion* region, int at,\n              int(*callback_func)(int,OnigPosition,OnigPosition,int,int,void*),\n              void* arg)\n{\n#ifdef USE_CAPTURE_HISTORY\n  return capture_tree_traverse(region->history_root, at,\n                               callback_func, 0, arg);\n#else\n  return ONIG_NO_SUPPORT_CONFIG;\n#endif\n}\n"
  },
  {
    "path": "src/Onigmo/regversion.c",
    "content": "/**********************************************************************\n  regversion.c -  Onigmo (Oniguruma-mod) (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2002-2009  K.Kosako  <sndgk393 AT ybb DOT ne DOT jp>\n * Copyright (c) 2011-2013  K.Takata  <kentkt AT csc DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"config.h\"\n#include \"oniguruma.h\"\n#include <stdio.h>\n\nextern const char*\nonig_version(void)\n{\n  static char s[12];\n\n  sprintf(s, \"%d.%d.%d\",\n          ONIGURUMA_VERSION_MAJOR,\n          ONIGURUMA_VERSION_MINOR,\n          ONIGURUMA_VERSION_TEENY);\n  return s;\n}\n\nextern const char*\nonig_copyright(void)\n{\n  static char s[80];\n\n  sprintf(s, \"Onigmo %d.%d.%d : Copyright (C) 2002-2009 K.Kosako, \"\n\t     \"2011-2013 K.Takata\",\n          ONIGURUMA_VERSION_MAJOR,\n          ONIGURUMA_VERSION_MINOR,\n          ONIGURUMA_VERSION_TEENY);\n  return s;\n}\n"
  },
  {
    "path": "src/Onigmo/sample/Makefile.am",
    "content": "noinst_PROGRAMS = encode listcap names posix simple sql syntax crnl\n\nlibname = $(top_builddir)/libonig.la\nLDADD   = $(libname)\nINCLUDES  = -I$(top_srcdir) -I$(includedir)\n\nencode_SOURCES  = encode.c\nlistcap_SOURCES = listcap.c\nnames_SOURCES   = names.c\nposix_SOURCES   = posix.c\nsimple_SOURCES  = simple.c\nsql_SOURCES     = sql.c\nsyntax_SOURCES  = syntax.c\n\n\nsampledir = $(top_builddir)/sample\n\ntest: encode listcap names posix simple sql syntax\n\t@$(sampledir)/encode\n\t@$(sampledir)/listcap\n\t@$(sampledir)/names\n\t@$(sampledir)/posix\n\t@$(sampledir)/simple\n\t@$(sampledir)/sql\n\t@$(sampledir)/syntax\n"
  },
  {
    "path": "src/Onigmo/sample/Makefile.in",
    "content": "# Makefile.in generated by automake 1.11.1 from Makefile.am.\n# @configure_input@\n\n# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,\n# 2003, 2004, 2005, 2006, 2007, 2008, 2009  Free Software Foundation,\n# Inc.\n# This Makefile.in is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\n@SET_MAKE@\n\nVPATH = @srcdir@\npkgdatadir = $(datadir)/@PACKAGE@\npkgincludedir = $(includedir)/@PACKAGE@\npkglibdir = $(libdir)/@PACKAGE@\npkglibexecdir = $(libexecdir)/@PACKAGE@\nam__cd = CDPATH=\"$${ZSH_VERSION+.}$(PATH_SEPARATOR)\" && cd\ninstall_sh_DATA = $(install_sh) -c -m 644\ninstall_sh_PROGRAM = $(install_sh) -c\ninstall_sh_SCRIPT = $(install_sh) -c\nINSTALL_HEADER = $(INSTALL_DATA)\ntransform = $(program_transform_name)\nNORMAL_INSTALL = :\nPRE_INSTALL = :\nPOST_INSTALL = :\nNORMAL_UNINSTALL = :\nPRE_UNINSTALL = :\nPOST_UNINSTALL = :\nbuild_triplet = @build@\nhost_triplet = @host@\nnoinst_PROGRAMS = encode$(EXEEXT) listcap$(EXEEXT) names$(EXEEXT) \\\n\tposix$(EXEEXT) simple$(EXEEXT) sql$(EXEEXT) syntax$(EXEEXT) \\\n\tcrnl$(EXEEXT)\nsubdir = sample\nDIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in\nACLOCAL_M4 = $(top_srcdir)/aclocal.m4\nam__aclocal_m4_deps = $(top_srcdir)/m4/libtool.m4 \\\n\t$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \\\n\t$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \\\n\t$(top_srcdir)/configure.in\nam__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \\\n\t$(ACLOCAL_M4)\nmkinstalldirs = $(install_sh) -d\nCONFIG_HEADER = $(top_builddir)/config.h\nCONFIG_CLEAN_FILES =\nCONFIG_CLEAN_VPATH_FILES =\nPROGRAMS = $(noinst_PROGRAMS)\ncrnl_SOURCES = crnl.c\ncrnl_OBJECTS = crnl.$(OBJEXT)\ncrnl_LDADD = $(LDADD)\ncrnl_DEPENDENCIES = $(libname)\nam_encode_OBJECTS = encode.$(OBJEXT)\nencode_OBJECTS = $(am_encode_OBJECTS)\nencode_LDADD = $(LDADD)\nencode_DEPENDENCIES = $(libname)\nam_listcap_OBJECTS = listcap.$(OBJEXT)\nlistcap_OBJECTS = $(am_listcap_OBJECTS)\nlistcap_LDADD = $(LDADD)\nlistcap_DEPENDENCIES = $(libname)\nam_names_OBJECTS = names.$(OBJEXT)\nnames_OBJECTS = $(am_names_OBJECTS)\nnames_LDADD = $(LDADD)\nnames_DEPENDENCIES = $(libname)\nam_posix_OBJECTS = posix.$(OBJEXT)\nposix_OBJECTS = $(am_posix_OBJECTS)\nposix_LDADD = $(LDADD)\nposix_DEPENDENCIES = $(libname)\nam_simple_OBJECTS = simple.$(OBJEXT)\nsimple_OBJECTS = $(am_simple_OBJECTS)\nsimple_LDADD = $(LDADD)\nsimple_DEPENDENCIES = $(libname)\nam_sql_OBJECTS = sql.$(OBJEXT)\nsql_OBJECTS = $(am_sql_OBJECTS)\nsql_LDADD = $(LDADD)\nsql_DEPENDENCIES = $(libname)\nam_syntax_OBJECTS = syntax.$(OBJEXT)\nsyntax_OBJECTS = $(am_syntax_OBJECTS)\nsyntax_LDADD = $(LDADD)\nsyntax_DEPENDENCIES = $(libname)\nDEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)\ndepcomp = $(SHELL) $(top_srcdir)/depcomp\nam__depfiles_maybe = depfiles\nam__mv = mv -f\nCOMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \\\n\t$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)\nLTCOMPILE = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \\\n\t--mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \\\n\t$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)\nCCLD = $(CC)\nLINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \\\n\t--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \\\n\t$(LDFLAGS) -o $@\nSOURCES = crnl.c $(encode_SOURCES) $(listcap_SOURCES) $(names_SOURCES) \\\n\t$(posix_SOURCES) $(simple_SOURCES) $(sql_SOURCES) \\\n\t$(syntax_SOURCES)\nDIST_SOURCES = crnl.c $(encode_SOURCES) $(listcap_SOURCES) \\\n\t$(names_SOURCES) $(posix_SOURCES) $(simple_SOURCES) \\\n\t$(sql_SOURCES) $(syntax_SOURCES)\nETAGS = etags\nCTAGS = ctags\nDISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)\nACLOCAL = @ACLOCAL@\nALLOCA = @ALLOCA@\nAMTAR = @AMTAR@\nAR = @AR@\nAUTOCONF = @AUTOCONF@\nAUTOHEADER = @AUTOHEADER@\nAUTOMAKE = @AUTOMAKE@\nAWK = @AWK@\nCC = @CC@\nCCDEPMODE = @CCDEPMODE@\nCFLAGS = @CFLAGS@\nCPP = @CPP@\nCPPFLAGS = @CPPFLAGS@\nCYGPATH_W = @CYGPATH_W@\nDEFS = @DEFS@\nDEPDIR = @DEPDIR@\nDSYMUTIL = @DSYMUTIL@\nDUMPBIN = @DUMPBIN@\nECHO_C = @ECHO_C@\nECHO_N = @ECHO_N@\nECHO_T = @ECHO_T@\nEGREP = @EGREP@\nEXEEXT = @EXEEXT@\nFGREP = @FGREP@\nGREP = @GREP@\nINSTALL = @INSTALL@\nINSTALL_DATA = @INSTALL_DATA@\nINSTALL_PROGRAM = @INSTALL_PROGRAM@\nINSTALL_SCRIPT = @INSTALL_SCRIPT@\nINSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@\nLD = @LD@\nLDFLAGS = @LDFLAGS@\nLIBOBJS = @LIBOBJS@\nLIBS = @LIBS@\nLIBTOOL = @LIBTOOL@\nLIPO = @LIPO@\nLN_S = @LN_S@\nLTLIBOBJS = @LTLIBOBJS@\nLTVERSION = @LTVERSION@\nMAKEINFO = @MAKEINFO@\nMKDIR_P = @MKDIR_P@\nNM = @NM@\nNMEDIT = @NMEDIT@\nOBJDUMP = @OBJDUMP@\nOBJEXT = @OBJEXT@\nOTOOL = @OTOOL@\nOTOOL64 = @OTOOL64@\nPACKAGE = @PACKAGE@\nPACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@\nPACKAGE_NAME = @PACKAGE_NAME@\nPACKAGE_STRING = @PACKAGE_STRING@\nPACKAGE_TARNAME = @PACKAGE_TARNAME@\nPACKAGE_URL = @PACKAGE_URL@\nPACKAGE_VERSION = @PACKAGE_VERSION@\nPATH_SEPARATOR = @PATH_SEPARATOR@\nRANLIB = @RANLIB@\nRUBYDIR = @RUBYDIR@\nSED = @SED@\nSET_MAKE = @SET_MAKE@\nSHELL = @SHELL@\nSTATISTICS = @STATISTICS@\nSTRIP = @STRIP@\nVERSION = @VERSION@\nabs_builddir = @abs_builddir@\nabs_srcdir = @abs_srcdir@\nabs_top_builddir = @abs_top_builddir@\nabs_top_srcdir = @abs_top_srcdir@\nac_ct_CC = @ac_ct_CC@\nac_ct_DUMPBIN = @ac_ct_DUMPBIN@\nam__include = @am__include@\nam__leading_dot = @am__leading_dot@\nam__quote = @am__quote@\nam__tar = @am__tar@\nam__untar = @am__untar@\nbindir = @bindir@\nbuild = @build@\nbuild_alias = @build_alias@\nbuild_cpu = @build_cpu@\nbuild_os = @build_os@\nbuild_vendor = @build_vendor@\nbuilddir = @builddir@\ndatadir = @datadir@\ndatarootdir = @datarootdir@\ndocdir = @docdir@\ndvidir = @dvidir@\nexec_prefix = @exec_prefix@\nhost = @host@\nhost_alias = @host_alias@\nhost_cpu = @host_cpu@\nhost_os = @host_os@\nhost_vendor = @host_vendor@\nhtmldir = @htmldir@\nincludedir = @includedir@\ninfodir = @infodir@\ninstall_sh = @install_sh@\nlibdir = @libdir@\nlibexecdir = @libexecdir@\nlocaledir = @localedir@\nlocalstatedir = @localstatedir@\nlt_ECHO = @lt_ECHO@\nmandir = @mandir@\nmkdir_p = @mkdir_p@\noldincludedir = @oldincludedir@\npdfdir = @pdfdir@\nprefix = @prefix@\nprogram_transform_name = @program_transform_name@\npsdir = @psdir@\nsbindir = @sbindir@\nsharedstatedir = @sharedstatedir@\nsrcdir = @srcdir@\nsysconfdir = @sysconfdir@\ntarget_alias = @target_alias@\ntop_build_prefix = @top_build_prefix@\ntop_builddir = @top_builddir@\ntop_srcdir = @top_srcdir@\nlibname = $(top_builddir)/libonig.la\nLDADD = $(libname)\nINCLUDES = -I$(top_srcdir) -I$(includedir)\nencode_SOURCES = encode.c\nlistcap_SOURCES = listcap.c\nnames_SOURCES = names.c\nposix_SOURCES = posix.c\nsimple_SOURCES = simple.c\nsql_SOURCES = sql.c\nsyntax_SOURCES = syntax.c\nsampledir = $(top_builddir)/sample\nall: all-am\n\n.SUFFIXES:\n.SUFFIXES: .c .lo .o .obj\n$(srcdir)/Makefile.in:  $(srcdir)/Makefile.am  $(am__configure_deps)\n\t@for dep in $?; do \\\n\t  case '$(am__configure_deps)' in \\\n\t    *$$dep*) \\\n\t      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \\\n\t        && { if test -f $@; then exit 0; else break; fi; }; \\\n\t      exit 1;; \\\n\t  esac; \\\n\tdone; \\\n\techo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign sample/Makefile'; \\\n\t$(am__cd) $(top_srcdir) && \\\n\t  $(AUTOMAKE) --foreign sample/Makefile\n.PRECIOUS: Makefile\nMakefile: $(srcdir)/Makefile.in $(top_builddir)/config.status\n\t@case '$?' in \\\n\t  *config.status*) \\\n\t    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \\\n\t  *) \\\n\t    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \\\n\t    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \\\n\tesac;\n\n$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n\n$(top_srcdir)/configure:  $(am__configure_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(ACLOCAL_M4):  $(am__aclocal_m4_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(am__aclocal_m4_deps):\n\nclean-noinstPROGRAMS:\n\t@list='$(noinst_PROGRAMS)'; test -n \"$$list\" || exit 0; \\\n\techo \" rm -f\" $$list; \\\n\trm -f $$list || exit $$?; \\\n\ttest -n \"$(EXEEXT)\" || exit 0; \\\n\tlist=`for p in $$list; do echo \"$$p\"; done | sed 's/$(EXEEXT)$$//'`; \\\n\techo \" rm -f\" $$list; \\\n\trm -f $$list\ncrnl$(EXEEXT): $(crnl_OBJECTS) $(crnl_DEPENDENCIES) \n\t@rm -f crnl$(EXEEXT)\n\t$(LINK) $(crnl_OBJECTS) $(crnl_LDADD) $(LIBS)\nencode$(EXEEXT): $(encode_OBJECTS) $(encode_DEPENDENCIES) \n\t@rm -f encode$(EXEEXT)\n\t$(LINK) $(encode_OBJECTS) $(encode_LDADD) $(LIBS)\nlistcap$(EXEEXT): $(listcap_OBJECTS) $(listcap_DEPENDENCIES) \n\t@rm -f listcap$(EXEEXT)\n\t$(LINK) $(listcap_OBJECTS) $(listcap_LDADD) $(LIBS)\nnames$(EXEEXT): $(names_OBJECTS) $(names_DEPENDENCIES) \n\t@rm -f names$(EXEEXT)\n\t$(LINK) $(names_OBJECTS) $(names_LDADD) $(LIBS)\nposix$(EXEEXT): $(posix_OBJECTS) $(posix_DEPENDENCIES) \n\t@rm -f posix$(EXEEXT)\n\t$(LINK) $(posix_OBJECTS) $(posix_LDADD) $(LIBS)\nsimple$(EXEEXT): $(simple_OBJECTS) $(simple_DEPENDENCIES) \n\t@rm -f simple$(EXEEXT)\n\t$(LINK) $(simple_OBJECTS) $(simple_LDADD) $(LIBS)\nsql$(EXEEXT): $(sql_OBJECTS) $(sql_DEPENDENCIES) \n\t@rm -f sql$(EXEEXT)\n\t$(LINK) $(sql_OBJECTS) $(sql_LDADD) $(LIBS)\nsyntax$(EXEEXT): $(syntax_OBJECTS) $(syntax_DEPENDENCIES) \n\t@rm -f syntax$(EXEEXT)\n\t$(LINK) $(syntax_OBJECTS) $(syntax_LDADD) $(LIBS)\n\nmostlyclean-compile:\n\t-rm -f *.$(OBJEXT)\n\ndistclean-compile:\n\t-rm -f *.tab.c\n\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/crnl.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/encode.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/listcap.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/names.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/posix.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/simple.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sql.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/syntax.Po@am__quote@\n\n.c.o:\n@am__fastdepCC_TRUE@\t$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(COMPILE) -c $<\n\n.c.obj:\n@am__fastdepCC_TRUE@\t$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(COMPILE) -c `$(CYGPATH_W) '$<'`\n\n.c.lo:\n@am__fastdepCC_TRUE@\t$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<\n@am__fastdepCC_TRUE@\t$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tsource='$<' object='$@' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(LTCOMPILE) -c -o $@ $<\n\nmostlyclean-libtool:\n\t-rm -f *.lo\n\nclean-libtool:\n\t-rm -rf .libs _libs\n\nID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)\n\tlist='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \\\n\tunique=`for i in $$list; do \\\n\t    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n\t  done | \\\n\t  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \\\n\t      END { if (nonempty) { for (i in files) print i; }; }'`; \\\n\tmkid -fID $$unique\ntags: TAGS\n\nTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \\\n\t\t$(TAGS_FILES) $(LISP)\n\tset x; \\\n\there=`pwd`; \\\n\tlist='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \\\n\tunique=`for i in $$list; do \\\n\t    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n\t  done | \\\n\t  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \\\n\t      END { if (nonempty) { for (i in files) print i; }; }'`; \\\n\tshift; \\\n\tif test -z \"$(ETAGS_ARGS)$$*$$unique\"; then :; else \\\n\t  test -n \"$$unique\" || unique=$$empty_fix; \\\n\t  if test $$# -gt 0; then \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      \"$$@\" $$unique; \\\n\t  else \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      $$unique; \\\n\t  fi; \\\n\tfi\nctags: CTAGS\nCTAGS:  $(HEADERS) $(SOURCES)  $(TAGS_DEPENDENCIES) \\\n\t\t$(TAGS_FILES) $(LISP)\n\tlist='$(SOURCES) $(HEADERS)  $(LISP) $(TAGS_FILES)'; \\\n\tunique=`for i in $$list; do \\\n\t    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n\t  done | \\\n\t  $(AWK) '{ files[$$0] = 1; nonempty = 1; } \\\n\t      END { if (nonempty) { for (i in files) print i; }; }'`; \\\n\ttest -z \"$(CTAGS_ARGS)$$unique\" \\\n\t  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \\\n\t     $$unique\n\nGTAGS:\n\there=`$(am__cd) $(top_builddir) && pwd` \\\n\t  && $(am__cd) $(top_srcdir) \\\n\t  && gtags -i $(GTAGS_ARGS) \"$$here\"\n\ndistclean-tags:\n\t-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags\n\ndistdir: $(DISTFILES)\n\t@srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\ttopsrcdirstrip=`echo \"$(top_srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\tlist='$(DISTFILES)'; \\\n\t  dist_files=`for file in $$list; do echo $$file; done | \\\n\t  sed -e \"s|^$$srcdirstrip/||;t\" \\\n\t      -e \"s|^$$topsrcdirstrip/|$(top_builddir)/|;t\"`; \\\n\tcase $$dist_files in \\\n\t  */*) $(MKDIR_P) `echo \"$$dist_files\" | \\\n\t\t\t   sed '/\\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \\\n\t\t\t   sort -u` ;; \\\n\tesac; \\\n\tfor file in $$dist_files; do \\\n\t  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \\\n\t  if test -d $$d/$$file; then \\\n\t    dir=`echo \"/$$file\" | sed -e 's,/[^/]*$$,,'`; \\\n\t    if test -d \"$(distdir)/$$file\"; then \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \\\n\t      cp -fpR $(srcdir)/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    cp -fpR $$d/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t  else \\\n\t    test -f \"$(distdir)/$$file\" \\\n\t    || cp -p $$d/$$file \"$(distdir)/$$file\" \\\n\t    || exit 1; \\\n\t  fi; \\\n\tdone\ncheck-am: all-am\ncheck: check-am\nall-am: Makefile $(PROGRAMS)\ninstalldirs:\ninstall: install-am\ninstall-exec: install-exec-am\ninstall-data: install-data-am\nuninstall: uninstall-am\n\ninstall-am: all-am\n\t@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am\n\ninstallcheck: installcheck-am\ninstall-strip:\n\t$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t  install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t  `test -z '$(STRIP)' || \\\n\t    echo \"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'\"` install\nmostlyclean-generic:\n\nclean-generic:\n\ndistclean-generic:\n\t-test -z \"$(CONFIG_CLEAN_FILES)\" || rm -f $(CONFIG_CLEAN_FILES)\n\t-test . = \"$(srcdir)\" || test -z \"$(CONFIG_CLEAN_VPATH_FILES)\" || rm -f $(CONFIG_CLEAN_VPATH_FILES)\n\nmaintainer-clean-generic:\n\t@echo \"This command is intended for maintainers to use\"\n\t@echo \"it deletes files that may require special tools to rebuild.\"\nclean: clean-am\n\nclean-am: clean-generic clean-libtool clean-noinstPROGRAMS \\\n\tmostlyclean-am\n\ndistclean: distclean-am\n\t-rm -rf ./$(DEPDIR)\n\t-rm -f Makefile\ndistclean-am: clean-am distclean-compile distclean-generic \\\n\tdistclean-tags\n\ndvi: dvi-am\n\ndvi-am:\n\nhtml: html-am\n\nhtml-am:\n\ninfo: info-am\n\ninfo-am:\n\ninstall-data-am:\n\ninstall-dvi: install-dvi-am\n\ninstall-dvi-am:\n\ninstall-exec-am:\n\ninstall-html: install-html-am\n\ninstall-html-am:\n\ninstall-info: install-info-am\n\ninstall-info-am:\n\ninstall-man:\n\ninstall-pdf: install-pdf-am\n\ninstall-pdf-am:\n\ninstall-ps: install-ps-am\n\ninstall-ps-am:\n\ninstallcheck-am:\n\nmaintainer-clean: maintainer-clean-am\n\t-rm -rf ./$(DEPDIR)\n\t-rm -f Makefile\nmaintainer-clean-am: distclean-am maintainer-clean-generic\n\nmostlyclean: mostlyclean-am\n\nmostlyclean-am: mostlyclean-compile mostlyclean-generic \\\n\tmostlyclean-libtool\n\npdf: pdf-am\n\npdf-am:\n\nps: ps-am\n\nps-am:\n\nuninstall-am:\n\n.MAKE: install-am install-strip\n\n.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \\\n\tclean-libtool clean-noinstPROGRAMS ctags distclean \\\n\tdistclean-compile distclean-generic distclean-libtool \\\n\tdistclean-tags distdir dvi dvi-am html html-am info info-am \\\n\tinstall install-am install-data install-data-am install-dvi \\\n\tinstall-dvi-am install-exec install-exec-am install-html \\\n\tinstall-html-am install-info install-info-am install-man \\\n\tinstall-pdf install-pdf-am install-ps install-ps-am \\\n\tinstall-strip installcheck installcheck-am installdirs \\\n\tmaintainer-clean maintainer-clean-generic mostlyclean \\\n\tmostlyclean-compile mostlyclean-generic mostlyclean-libtool \\\n\tpdf pdf-am ps ps-am tags uninstall uninstall-am\n\n\ntest: encode listcap names posix simple sql syntax\n\t@$(sampledir)/encode\n\t@$(sampledir)/listcap\n\t@$(sampledir)/names\n\t@$(sampledir)/posix\n\t@$(sampledir)/simple\n\t@$(sampledir)/sql\n\t@$(sampledir)/syntax\n\n# Tell versions [3.59,3.63) of GNU make to not export all variables.\n# Otherwise a system limit (for SysV at least) may be exceeded.\n.NOEXPORT:\n"
  },
  {
    "path": "src/Onigmo/sample/crnl.c",
    "content": "/*\n * crnl.c  2007/05/30  K.Kosako\n *\n * !!! You should enable USE_CRNL_AS_LINE_TERMINATOR. !!!\n *\n * USE_CRNL_AS_LINE_TERMINATOR config test program.\n */\n#include <stdio.h>\n#include <string.h>\n#include \"oniguruma.h\"\n\n#define USE_UNICODE_ALL_LINE_TERMINATORS \n\nstatic int nfail = 0;\n\nstatic void result(int no, OnigPosition from, OnigPosition to,\n\t\t   OnigPosition expected_from, OnigPosition expected_to)\n{\n  fprintf(stderr, \"%3d: \", no);\n  if (from == expected_from && to == expected_to) {\n    fprintf(stderr, \"Success\\n\");\n  }\n  else {\n    fprintf(stderr, \"Fail: expected: (%d-%d), result: (%d-%d)\\n\",\n\t    (int)expected_from, (int)expected_to, (int)from, (int)to);\n\n    nfail++;\n  }\n}\n\nstatic int\nx0(int no, char* pattern_arg, char* str_arg,\n   int start_offset, int expected_from, int expected_to, int backward)\n{\n  OnigPosition r;\n  OnigPosition start, range, end;\n  regex_t* reg;\n  OnigErrorInfo einfo;\n  OnigRegion *region;\n  UChar *pattern, *str;\n  OnigIterator it = {onig_default_charat, str_arg};\n\n  pattern = (UChar* )pattern_arg;\n  str     = (UChar* )str_arg;\n\n  r = onig_new(&reg, pattern, pattern + strlen((char* )pattern),\n\tONIG_OPTION_NEWLINE_CRLF, ONIG_ENCODING_UTF8, ONIG_SYNTAX_DEFAULT, &einfo);\n  if (r != ONIG_NORMAL) {\n    char s[ONIG_MAX_ERROR_MESSAGE_LEN];\n    onig_error_code_to_str(s, r, &einfo);\n    fprintf(stderr, \"ERROR: %s\\n\", s);\n    return -1;\n  }\n\n  region = onig_region_new();\n\n  end   = strlen((char* )str);\n  if (backward) {\n    start = end + start_offset;\n    range = 0;\n  }\n  else {\n    start = start_offset;\n    range = end;\n  }\n  r = onig_search(&it, reg, 0, end, start, range, region, ONIG_OPTION_NONE);\n  if (r >= 0 || r == ONIG_MISMATCH) {\n    result(no, region->beg[0], region->end[0], expected_from, expected_to);\n  }\n  else if (r == ONIG_MISMATCH) {\n    result(no, r, -1, expected_from, expected_to);\n  }\n  else { /* error */\n    char s[ONIG_MAX_ERROR_MESSAGE_LEN];\n    onig_error_code_to_str(s, r);\n    fprintf(stderr, \"ERROR: %s\\n\", s);\n    return -1;\n  }\n\n  onig_region_free(region, 1 /* 1:free self, 0:free contents only */);\n  onig_free(reg);\n  return 0;\n}\n\nstatic int\nx(int no, char* pattern_arg, char* str_arg,\n  int expected_from, int expected_to)\n{\n  return x0(no, pattern_arg, str_arg, 0, expected_from, expected_to, 0);\n}\n\nstatic int\nf0(int no, char* pattern_arg, char* str_arg, int start_offset, int backward)\n{\n  return x0(no, pattern_arg, str_arg, start_offset, -1, -1, backward);\n}\n\nstatic int\nf(int no, char* pattern_arg, char* str_arg)\n{\n  return x(no, pattern_arg, str_arg, -1, -1);\n}\n\nextern int main(int argc, char* argv[])\n{\n  x( 1, \"\",        \"\\r\\n\",        0,  0);\n/*  x( 2, \".\",       \"\\r\\n\",        0,  1); */\n  f( 2, \".\",       \"\\r\\n\");\n  f( 3, \"..\",      \"\\r\\n\");\n  x( 4, \"^\",       \"\\r\\n\",        0,  0);\n  x( 5, \"\\\\n^\",    \"\\r\\nf\",       1,  2);\n  x( 6, \"\\\\n^a\",   \"\\r\\na\",       1,  3);\n  x( 7, \"$\",       \"\\r\\n\",        0,  0);\n  x( 8, \"T$\",      \"T\\r\\n\",       0,  1);\n#ifdef USE_UNICODE_ALL_LINE_TERMINATORS\n  x( 9, \"T$\",      \"T\\raT\\r\\n\",   0,  1);\n#else\n  x( 9, \"T$\",      \"T\\raT\\r\\n\",   3,  4);\n#endif\n  x(10, \"\\\\z\",     \"\\r\\n\",        2,  2);\n  f(11, \"a\\\\z\",    \"a\\r\\n\");\n  x(12, \"\\\\Z\",     \"\\r\\n\",        0,  0);\n  x(13, \"\\\\Z\",     \"\\r\\na\",       3,  3);\n  x(14, \"\\\\Z\",     \"\\r\\n\\r\\n\\n\",  4,  4);\n  x(15, \"\\\\Z\",     \"\\r\\n\\r\\nX\",   5,  5);\n  x(16, \"a\\\\Z\",    \"a\\r\\n\",       0,  1);\n  x(17, \"aaaaaaaaaaaaaaa\\\\Z\",   \"aaaaaaaaaaaaaaa\\r\\n\",  0,  15);\n  x(18, \"a|$\",     \"b\\r\\n\",       1,  1);\n#ifdef USE_UNICODE_ALL_LINE_TERMINATORS\n  x(19, \"$|b\",     \"\\rb\",         0,  0);\n#else\n  x(19, \"$|b\",     \"\\rb\",         1,  2);\n#endif\n  x(20, \"a$|ab$\",  \"\\r\\nab\\r\\n\",  2,  4);\n\n  x(21, \"a|\\\\Z\",       \"b\\r\\n\",       1,  1);\n#ifdef USE_UNICODE_ALL_LINE_TERMINATORS\n  x(22, \"\\\\Z|b\",       \"\\rb\",         0,  0);\n#else\n  x(22, \"\\\\Z|b\",       \"\\rb\",         1,  2);\n#endif\n  x(23, \"a\\\\Z|ab\\\\Z\",  \"\\r\\nab\\r\\n\",  2,  4);\n  x(24, \"(?=a$).\",     \"a\\r\\n\",       0,  1);\n#ifdef USE_UNICODE_ALL_LINE_TERMINATORS\n  x(25, \"(?=a$).\",     \"a\\r\",         0,  1);\n  f(26, \"(?!a$)..\",    \"a\\r\");\n#else\n  f(25, \"(?=a$).\",     \"a\\r\");\n  x(26, \"(?!a$)..\",    \"a\\r\",         0,  2);\n#endif\n/*  x(27, \"(?<=a$).\\\\n\", \"a\\r\\n\",       1,  3); */\n  x(27, \"(?<=a$)\\\\r\\\\n\", \"a\\r\\n\",       1,  3);\n/*  f(28, \"(?<!a$).\\\\n\", \"a\\r\\n\"); */\n  f(28, \"(?<!a$)\\\\r\\\\n\", \"a\\r\\n\");\n  x(29, \"(?=a\\\\Z).\",     \"a\\r\\n\",       0,  1);\n#ifdef USE_UNICODE_ALL_LINE_TERMINATORS\n  x(30, \"(?=a\\\\Z).\",     \"a\\r\",         0,  1);\n  f(31, \"(?!a\\\\Z)..\",    \"a\\r\");\n#else\n  f(30, \"(?=a\\\\Z).\",     \"a\\r\");\n  x(31, \"(?!a\\\\Z)..\",    \"a\\r\",         0,  2);\n#endif\n\n  x(32, \".*$\",     \"aa\\r\\n\",      0,  2);\n#ifdef USE_UNICODE_ALL_LINE_TERMINATORS\n  x(33, \".*$\",     \"aa\\r\",        0,  2);\n#else\n  x(33, \".*$\",     \"aa\\r\",        0,  3);\n#endif\n  x(34, \"\\\\R{3}\",  \"\\r\\r\\n\\n\",    0,  4);\n  x(35, \"$\",       \"\\n\",          0,  0);\n  x(36, \"T$\",      \"T\\n\",         0,  1);\n  x(37, \"(?m).\",   \"\\r\\n\",        0,  1);\n  x(38, \"(?m)..\",  \"\\r\\n\",        0,  2);\n  x0(39, \"^\",      \"\\n.\",     1,  1,  1,  0);\n  x0(40, \"^\",      \"\\r\\n.\",   1,  2,  2,  0);\n  x0(41, \"^\",      \"\\r\\n.\",   2,  2,  2,  0);\n  x0(42, \"$\",      \"\\n\\n\",    1,  1,  1,  0);\n  x0(43, \"$\",      \"\\r\\n\\n\",  1,  2,  2,  0);\n  x0(44, \"$\",      \"\\r\\n\\n\",  2,  2,  2,  0);\n#ifdef USE_UNICODE_ALL_LINE_TERMINATORS\n  x0(45, \"^$\",     \"\\n\\r\",    1,  1,  1,  0);\n#else\n  f0(45, \"^$\",     \"\\n\\r\",    1,  0);\n#endif\n  x0(46, \"^$\",     \"\\n\\r\\n\",  1,  1,  1,  0);\n  x0(47, \"^$\",     \"\\r\\n\\n\",  1,  2,  2,  0);\n  x0(48, \"\\\\Z\",    \"\\r\\n\\n\",  1,  2,  2,  0);\n  f0(49, \".(?=\\\\Z)\", \"\\r\\n\",  1,  0);\n  x0(50, \"(?=\\\\Z)\", \"\\r\\n\",   1,  2,  2,  0);\n  x0(51, \"(?<=^).\", \"\\r\\n.\",  0,  2,  3,  0);\n  x0(52, \"(?<=^).\", \"\\r\\n.\",  1,  2,  3,  0);\n  x0(53, \"(?<=^).\", \"\\r\\n.\",  2,  2,  3,  0);\n  x0(54, \"^a\",      \"\\r\\na\",  0,  2,  3,  0);\n  x0(55, \"^a\",      \"\\r\\na\",  1,  2,  3,  0);\n  x0(56, \"(?m)$.{1,2}a\", \"\\r\\na\", 0,  0,  3,  0);\n  f0(57, \"(?m)$.{1,2}a\", \"\\r\\na\", 1,  0);\n  x0(58, \".*b\",      \"\\r\\naaab\\r\\n\",  1,  2,  6,  0);\n\n  /* backward search */\n/*  x0(59, \"$\",      \"\\n\\n\",    0,  1,  1,  1); */\t/* BUG? */\n  x0(60, \"$\",      \"\\n\\n\",   -1,  1,  1,  1);\n  x0(61, \"$\",      \"\\n\\r\\n\", -1,  1,  1,  1);\n  x0(62, \"$\",      \"\\n\\r\\n\", -2,  1,  1,  1);\n  x0(63, \"^$\",     \"\\n\\r\\n\", -1,  1,  1,  1);\n  x0(64, \"^$\",     \"\\n\\r\\n\",  0,  1,  1,  1);\n  x0(65, \"^$\",     \"\\r\\n\\n\",  0,  2,  2,  1);\n  x0(66, \"^a\",     \"\\r\\na\",   0,  2,  3,  1);\n  x0(67, \"^a\",     \"\\r\\na\",  -1,  2,  3,  1);\n  f0(68, \"^a\",     \"\\r\\na\",  -2,  1);\n\n  onig_end();\n\n  if (nfail > 0) {\n    fprintf(stderr, \"\\n\");\n    fprintf(stderr, \"!!! You have to enable USE_CRNL_AS_LINE_TERMINATOR\\n\");\n    fprintf(stderr, \"!!! in regenc.h for this test program.\\n\");\n    fprintf(stderr, \"\\n\");\n  }\n\n  return 0;\n}\n"
  },
  {
    "path": "src/Onigmo/sample/encode.c",
    "content": "/*\n * encode.c\n */\n#include <stdio.h>\n#include \"oniguruma.h\"\n\nstatic int\nsearch(OnigIterator* it, regex_t* reg, OnigPosition str, OnigPosition end)\n{\n  OnigPosition r;\n  OnigPosition start, range;\n  OnigRegion *region;\n\n  region = onig_region_new();\n\n  start = str;\n  range = end;\n  r = onig_search(it, reg, str, end, start, range, region, ONIG_OPTION_NONE);\n  if (r >= 0) {\n    int i;\n\n    fprintf(stderr, \"match at %d  (%s)\\n\", (int)r,\n            ONIGENC_NAME(onig_get_encoding(reg)));\n    for (i = 0; i < region->num_regs; i++) {\n      fprintf(stderr, \"%d: (%ld-%ld)\\n\", i, (int)region->beg[i], (int)region->end[i]);\n    }\n  }\n  else if (r == ONIG_MISMATCH) {\n    fprintf(stderr, \"search fail (%s)\\n\",\n            ONIGENC_NAME(onig_get_encoding(reg)));\n  }\n  else { /* error */\n    char s[ONIG_MAX_ERROR_MESSAGE_LEN];\n    onig_error_code_to_str(s, r);\n    fprintf(stderr, \"ERROR: %s\\n\", s);\n    fprintf(stderr, \"  (%s)\\n\", ONIGENC_NAME(onig_get_encoding(reg)));\n    return -1;\n  }\n\n  onig_region_free(region, 1 /* 1:free self, 0:free contents only */);\n  return 0;\n}\n\nstatic int\nexec(OnigEncoding enc, OnigOptionType options,\n     char* apattern, char* astr)\n{\n  OnigPosition r;\n  OnigPosition end;\n  regex_t* reg;\n  OnigErrorInfo einfo;\n  UChar* pattern = (UChar* )apattern;\n  UChar* str     = (UChar* )astr;\n  OnigIterator it = {onig_default_charat, str};\n\n  onig_init();\n  r = onig_new(&reg, pattern,\n               pattern + onigenc_str_bytelen_null(enc, pattern),\n               options, enc, ONIG_SYNTAX_DEFAULT, &einfo);\n  if (r != ONIG_NORMAL) {\n    char s[ONIG_MAX_ERROR_MESSAGE_LEN];\n    onig_error_code_to_str(s, r, &einfo);\n    fprintf(stderr, \"ERROR: %s\\n\", s);\n    return -1;\n  }\n\n  end   = onigenc_str_bytelen_null(enc, str);\n  r = search(&it, reg, 0, end);\n\n  onig_free(reg);\n  onig_end();\n  return 0;\n}\n\nstatic OnigCaseFoldType CF = ONIGENC_CASE_FOLD_MIN;\n\n#if 0\nstatic void\nset_case_fold(OnigCaseFoldType cf)\n{\n  CF = cf;\n}\n#endif\n\nstatic int\nexec_deluxe(OnigEncoding pattern_enc, OnigEncoding str_enc,\n            OnigOptionType options, char* apattern, char* astr)\n{\n  OnigPosition r;\n  OnigPosition end;\n  regex_t* reg;\n  OnigCompileInfo ci;\n  OnigErrorInfo einfo;\n  UChar* pattern = (UChar* )apattern;\n  UChar* str     = (UChar* )astr;\n  OnigIterator it = {onig_default_charat, str};\n\n  ci.num_of_elements = 5;\n  ci.pattern_enc = pattern_enc;\n  ci.target_enc  = str_enc;\n  ci.syntax      = ONIG_SYNTAX_DEFAULT;\n  ci.option      = options;\n  ci.case_fold_flag  = CF;\n\n  r = onig_new_deluxe(&reg, pattern,\n                      pattern + onigenc_str_bytelen_null(pattern_enc, pattern),\n                      &ci, &einfo);\n  if (r != ONIG_NORMAL) {\n    char s[ONIG_MAX_ERROR_MESSAGE_LEN];\n    onig_error_code_to_str(s, r, &einfo);\n    fprintf(stderr, \"ERROR: %s\\n\", s);\n    return -1;\n  }\n\n  end = onigenc_str_bytelen_null(str_enc, str);\n  r = search(&it, reg, 0, end);\n\n  onig_free(reg);\n  onig_end();\n  return 0;\n}\n\nextern int main(int argc, char* argv[])\n{\n  int r;\n  /* ISO 8859-1 test */\n  static unsigned char str[] = { 0xc7, 0xd6, 0xfe, 0xea, 0xe0, 0xe2, 0x00 };\n  static unsigned char pattern[] = { 0xe7, 0xf6, 0xde, '\\\\', 'w', '+', 0x00 };\n\n  r = exec(ONIG_ENCODING_CP1251, ONIG_OPTION_IGNORECASE,\n\t   \"aBc\", \" AbC\");\n\n  r = exec(ONIG_ENCODING_ISO_8859_1, ONIG_OPTION_IGNORECASE,\n\t   \" [a-c\\337z] \", \"  SS  \");\n  r = exec(ONIG_ENCODING_ISO_8859_1, ONIG_OPTION_IGNORECASE,\n\t   \" [\\330-\\341] \", \"  SS  \");\n\n  r = exec(ONIG_ENCODING_ISO_8859_2, ONIG_OPTION_IGNORECASE,\n\t   \"\\337          \", \"          Ss          \");\n  r = exec(ONIG_ENCODING_ISO_8859_2, ONIG_OPTION_IGNORECASE,\n\t   \"SS          \", \"          \\337          \");\n  r = exec(ONIG_ENCODING_ISO_8859_2, ONIG_OPTION_IGNORECASE,\n\t   \"\\\\A\\\\S\\\\z\", \"ss\");\n\n  r = exec(ONIG_ENCODING_ISO_8859_2, ONIG_OPTION_IGNORECASE,\n\t   \"[ac]+\", \"bbbaAaCCC\");\n\n  r = exec(ONIG_ENCODING_ISO_8859_3, ONIG_OPTION_IGNORECASE,\n\t   \"[ac]+\", \"bbbaAaCCC\");\n  r = exec(ONIG_ENCODING_ISO_8859_4, ONIG_OPTION_IGNORECASE,\n\t   \"[ac]+\", \"bbbaAaCCC\");\n  r = exec(ONIG_ENCODING_ISO_8859_5, ONIG_OPTION_IGNORECASE,\n\t   \"[ac]+\", \"bbbaAaCCC\");\n  r = exec(ONIG_ENCODING_ISO_8859_6, ONIG_OPTION_IGNORECASE,\n\t   \"[ac]+\", \"bbbaAaCCC\");\n  r = exec(ONIG_ENCODING_ISO_8859_7, ONIG_OPTION_IGNORECASE,\n\t   \"[ac]+\", \"bbbaAaCCC\");\n  r = exec(ONIG_ENCODING_ISO_8859_8, ONIG_OPTION_IGNORECASE,\n\t   \"[ac]+\", \"bbbaAaCCC\");\n  r = exec(ONIG_ENCODING_ISO_8859_9, ONIG_OPTION_IGNORECASE,\n\t   \"[ac]+\", \"bbbaAaCCC\");\n  r = exec(ONIG_ENCODING_ISO_8859_10, ONIG_OPTION_IGNORECASE,\n\t   \"[ac]+\", \"bbbaAaCCC\");\n  r = exec(ONIG_ENCODING_ISO_8859_11, ONIG_OPTION_IGNORECASE,\n\t   \"[ac]+\", \"bbbaAaCCC\");\n  r = exec(ONIG_ENCODING_ISO_8859_13, ONIG_OPTION_IGNORECASE,\n\t   \"[ac]+\", \"bbbaAaCCC\");\n  r = exec(ONIG_ENCODING_ISO_8859_14, ONIG_OPTION_IGNORECASE,\n\t   \"[ac]+\", \"bbbaAaCCC\");\n  r = exec(ONIG_ENCODING_ISO_8859_15, ONIG_OPTION_IGNORECASE,\n\t   (char* )pattern, (char* )str);\n  r = exec(ONIG_ENCODING_ISO_8859_16, ONIG_OPTION_IGNORECASE,\n\t   (char* )pattern, (char* )str);\n\n  r = exec(ONIG_ENCODING_KOI8_R, ONIG_OPTION_NONE, \"a+\", \"bbbaaaccc\");\n  r = exec(ONIG_ENCODING_EUC_TW, ONIG_OPTION_NONE, \"b*a+?c+\", \"bbbaaaccc\");\n  r = exec(ONIG_ENCODING_EUC_KR, ONIG_OPTION_NONE, \"a+\", \"bbbaaaccc\");\n  r = exec(ONIG_ENCODING_EUC_CN, ONIG_OPTION_NONE, \"c+\", \"bbbaaaccc\");\n  r = exec(ONIG_ENCODING_BIG5,   ONIG_OPTION_NONE, \"a+\", \"bbbaaaccc\");\n\n  r = exec(ONIG_ENCODING_ISO_8859_1, ONIG_OPTION_IGNORECASE,\n           \"\\337\", \"SS\");\n  r = exec(ONIG_ENCODING_ISO_8859_1, ONIG_OPTION_IGNORECASE,\n           \"SS\", \"\\337\");\n  r = exec(ONIG_ENCODING_ISO_8859_1, ONIG_OPTION_IGNORECASE,\n           \"SSb\\337ssc\", \"a\\337bSS\\337cd\");\n  r = exec(ONIG_ENCODING_ISO_8859_1, ONIG_OPTION_IGNORECASE,\n           \"[a\\337]{0,2}\", \"aSS\");\n  r = exec(ONIG_ENCODING_ISO_8859_1, ONIG_OPTION_IGNORECASE,\n           \"is\", \"iss\");\n\n  r = exec_deluxe(ONIG_ENCODING_ASCII, ONIG_ENCODING_UTF16_BE,\n                  ONIG_OPTION_NONE, \"a+\",\n                  \"\\000b\\000a\\000a\\000a\\000c\\000c\\000\\000\");\n\n  r = exec_deluxe(ONIG_ENCODING_ASCII, ONIG_ENCODING_UTF16_LE,\n                  ONIG_OPTION_NONE, \"a+\",\n                  \"b\\000a\\000a\\000a\\000a\\000c\\000\\000\\000\");\n\n  r = exec_deluxe(ONIG_ENCODING_UTF16_BE, ONIG_ENCODING_UTF16_LE,\n                  ONIG_OPTION_NONE,\n                  \"\\000b\\000a\\000a\\000a\\000c\\000c\\000\\000\",\n                  \"x\\000b\\000a\\000a\\000a\\000c\\000c\\000\\000\\000\");\n\n  r = exec_deluxe(ONIG_ENCODING_ISO_8859_1, ONIG_ENCODING_UTF16_BE,\n                  ONIG_OPTION_IGNORECASE,\n                  \"\\337\", \"\\000S\\000S\\000\\000\");\n\n  r = exec_deluxe(ONIG_ENCODING_ISO_8859_1, ONIG_ENCODING_UTF16_BE,\n                  ONIG_OPTION_IGNORECASE,\n                  \"SS\", \"\\000\\337\\000\\000\");\n\n  r = exec_deluxe(ONIG_ENCODING_ISO_8859_1, ONIG_ENCODING_UTF16_LE,\n                  ONIG_OPTION_IGNORECASE,\n                  \"\\337\", \"S\\000S\\000\\000\\000\");\n\n  r = exec_deluxe(ONIG_ENCODING_ISO_8859_1, ONIG_ENCODING_UTF32_BE,\n                  ONIG_OPTION_IGNORECASE,\n                  \"SS\", \"\\000\\000\\000\\337\\000\\000\\000\\000\");\n\n  r = exec_deluxe(ONIG_ENCODING_ISO_8859_1, ONIG_ENCODING_UTF32_LE,\n                  ONIG_OPTION_IGNORECASE,\n                  \"\\337\", \"S\\000\\000\\000S\\000\\000\\000\\000\\000\\000\\000\");\n\n  r = exec(ONIG_ENCODING_UTF16_BE, ONIG_OPTION_NONE,\n\t   \"\\000[\\000[\\000:\\000a\\000l\\000n\\000u\\000m\\000:\\000]\\000]\\000+\\000\\000\",\n           \"\\000#\\002\\120\\000a\\000Z\\012\\077\\012\\076\\012\\075\\000\\000\");\n  /* 0x0a3d == \\012\\075 : is not alnum */\n  /* 0x0a3e == \\012\\076 : is alnum */\n\n  r = exec(ONIG_ENCODING_UTF16_BE, ONIG_OPTION_NONE,\n\t   \"\\000\\\\\\000d\\000+\\000\\000\",\n           \"\\0003\\0001\\377\\020\\377\\031\\377\\032\\000\\000\");\n\n  r = exec(ONIG_ENCODING_GB18030, ONIG_OPTION_IGNORECASE,\n\t   \"(Aa\\\\d)+\", \"BaA5Aa0234\");\n\n  r = exec_deluxe(ONIG_ENCODING_ISO_8859_1, ONIG_ENCODING_UTF16_BE,\n                  ONIG_OPTION_NONE,\n\t\t  \"^\\\\P{Hiragana}\\\\p{^Hiragana}(\\\\p{Hiragana}+)$\",\n\t\t  \"\\060\\100\\060\\240\\060\\101\\060\\102\\060\\226\\060\\237\\000\\000\");\n\n  r = exec_deluxe(ONIG_ENCODING_UTF16_BE, ONIG_ENCODING_UTF16_BE,\n                  ONIG_OPTION_IGNORECASE,\n\t\t  \"\\000[\\000\\337\\000]\\000\\000\", \"\\000S\\000S\\000\\000\");\n\n  r = exec_deluxe(ONIG_ENCODING_UTF16_BE, ONIG_ENCODING_UTF16_BE,\n                  ONIG_OPTION_IGNORECASE,\n\t\t  \"\\000[\\000\\337\\000]\\000\\000\", \"\\000s\\000S\\000\\000\");\n\n  r = exec_deluxe(ONIG_ENCODING_UTF16_BE, ONIG_ENCODING_UTF16_BE,\n                  ONIG_OPTION_IGNORECASE,\n\t\t  \"\\000^\\000[\\000\\001\\000-\\377\\375\\000]\\000$\\000\\000\",\n\t\t  \"\\000s\\000S\\000\\000\");\n\n  r = exec_deluxe(ONIG_ENCODING_UTF16_BE, ONIG_ENCODING_UTF16_BE,\n                  ONIG_OPTION_IGNORECASE,\n\t\t  \"\\000S\\000S\\000\\000\",\n\t\t  \"\\000S\\000T\\000\\337\\000\\000\");\n\n  r = exec_deluxe(ONIG_ENCODING_UTF16_BE, ONIG_ENCODING_UTF16_BE,\n                  ONIG_OPTION_IGNORECASE,\n\t\t  \"\\000S\\000T\\000S\\000S\\000\\000\",\n\t\t  \"\\000S\\000t\\000s\\000S\\000\\000\");\n\n  {\n    UChar pat[]  = { 0x1f, 0xfc, 0x00, 0x00 };\n    UChar str1[] = { 0x21, 0x26, 0x1f, 0xbe, 0x00, 0x00 };\n    UChar str2[] = { 0x1f, 0xf3, 0x00, 0x00 };\n\n    r = exec_deluxe(ONIG_ENCODING_UTF16_BE, ONIG_ENCODING_UTF16_BE,\n\t\t    ONIG_OPTION_IGNORECASE,\n\t\t    (char* )pat, (char* )str1);\n\n    r = exec_deluxe(ONIG_ENCODING_UTF16_BE, ONIG_ENCODING_UTF16_BE,\n\t\t    ONIG_OPTION_IGNORECASE,\n\t\t    (char* )pat, (char* )str2);\n  }\n\n#if 0\n  /* You should define USE_UNICODE_CASE_FOLD_TURKISH_AZERI in regenc.h. */\n\n  set_case_fold(ONIGENC_CASE_FOLD_TURKISH_AZERI);\n\n  r = exec_deluxe(ONIG_ENCODING_UTF8, ONIG_ENCODING_UTF8,\n                  ONIG_OPTION_IGNORECASE,\n\t\t  \"Ii\", \"\\304\\261\\304\\260\");\n\n  r = exec_deluxe(ONIG_ENCODING_UTF16_BE, ONIG_ENCODING_UTF16_BE,\n                  ONIG_OPTION_IGNORECASE,\n\t\t  \"\\000I\\000i\\000\\000\", \"\\001\\061\\001\\060\\000\\000\");\n\n  r = exec_deluxe(ONIG_ENCODING_UTF16_BE, ONIG_ENCODING_UTF16_BE,\n                  ONIG_OPTION_IGNORECASE,\n\t\t  \"\\001\\061\\001\\060\\000\\000\", \"\\000I\\000i\\000\\000\");\n\n  set_case_fold(ONIGENC_CASE_FOLD_MIN);\n#endif\n\n  return 0;\n}\n"
  },
  {
    "path": "src/Onigmo/sample/listcap.c",
    "content": "/*\n * listcap.c\n *\n * capture history (?@...) sample.\n */\n#include <stdio.h>\n#include <string.h>\n#include \"oniguruma.h\"\n\nstatic int\nnode_callback(int group, OnigPosition beg, OnigPosition end, int level,\n\t      int at, void* arg)\n{\n  int i;\n\n  if (at != ONIG_TRAVERSE_CALLBACK_AT_FIRST)\n    return -1; /* error */\n\n  /* indent */\n  for (i = 0; i < level * 2; i++)\n    fputc(' ', stderr);\n\n  fprintf(stderr, \"%d: (%ld-%ld)\\n\", group, (int)beg, (int)end);\n  return 0;\n}\n\nextern int ex(unsigned char* str, unsigned char* pattern,\n              OnigSyntaxType* syntax)\n{\n  OnigPosition r;\n  OnigPosition start, range, end;\n  regex_t* reg;\n  OnigErrorInfo einfo;\n  OnigRegion *region;\n  OnigIterator it = {onig_default_charat, str};\n\n  r = onig_new(&reg, pattern, pattern + strlen((char* )pattern),\n\t       ONIG_OPTION_DEFAULT, ONIG_ENCODING_ASCII, syntax, &einfo);\n  if (r != ONIG_NORMAL) {\n    char s[ONIG_MAX_ERROR_MESSAGE_LEN];\n    onig_error_code_to_str(s, r, &einfo);\n    fprintf(stderr, \"ERROR: %s\\n\", s);\n    return -1;\n  }\n\n  fprintf(stderr, \"number of captures: %d\\n\", onig_number_of_captures(reg));\n  fprintf(stderr, \"number of capture histories: %d\\n\",\n          onig_number_of_capture_histories(reg));\n\n  region = onig_region_new();\n\n  end   = strlen((char* )str);\n  start = 0;\n  range = end;\n  r = onig_search(&it, reg, 0, end, start, range, region, ONIG_OPTION_NONE);\n  if (r >= 0) {\n    int i;\n\n    fprintf(stderr, \"match at %d\\n\", (int)r);\n    for (i = 0; i < region->num_regs; i++) {\n      fprintf(stderr, \"%d: (%ld-%ld)\\n\", i, (long)region->beg[i], (long)region->end[i]);\n    }\n    fprintf(stderr, \"\\n\");\n\n    r = onig_capture_tree_traverse(region, ONIG_TRAVERSE_CALLBACK_AT_FIRST,\n                                   node_callback, (void* )0);\n  }\n  else if (r == ONIG_MISMATCH) {\n    fprintf(stderr, \"search fail\\n\");\n  }\n  else { /* error */\n    char s[ONIG_MAX_ERROR_MESSAGE_LEN];\n    onig_error_code_to_str(s, r);\n    return -1;\n  }\n\n  onig_region_free(region, 1 /* 1:free self, 0:free contents only */);\n  onig_free(reg);\n  return 0;\n}\n\n\nextern int main(int argc, char* argv[])\n{\n  int r;\n  OnigSyntaxType syn;\n\n  static UChar* str1 = (UChar* )\"((())())\";\n  static UChar* pattern1\n    = (UChar* )\"\\\\g<p>(?@<p>\\\\(\\\\g<s>\\\\)){0}(?@<s>(?:\\\\g<p>)*|){0}\";\n\n  static UChar* str2     = (UChar* )\"x00x00x00\";\n  static UChar* pattern2 = (UChar* )\"(?@x(?@\\\\d+))+\";\n\n  static UChar* str3     = (UChar* )\"0123\";\n  static UChar* pattern3 = (UChar* )\"(?@.)(?@.)(?@.)(?@.)\";\n\n /* enable capture hostory */\n  onig_copy_syntax(&syn, ONIG_SYNTAX_DEFAULT);\n  onig_set_syntax_op2(&syn,\n       onig_get_syntax_op2(&syn) | ONIG_SYN_OP2_ATMARK_CAPTURE_HISTORY);\n\n  r = ex(str1, pattern1, &syn);\n  r = ex(str2, pattern2, &syn);\n  r = ex(str3, pattern3, &syn);\n\n  onig_end();\n  return 0;\n}\n"
  },
  {
    "path": "src/Onigmo/sample/names.c",
    "content": "/*\n * names.c -- example of group name callback.\n */\n#include <stdio.h>\n#include <string.h>\n#include \"oniguruma.h\"\n\nstatic int\nname_callback(const UChar* name, const UChar* name_end,\n\t      int ngroup_num, int* group_nums,\n\t      regex_t* reg, void* arg)\n{\n  int i, gn, ref;\n  char* s;\n  OnigRegion *region = (OnigRegion* )arg;\n\n  for (i = 0; i < ngroup_num; i++) {\n    gn = group_nums[i];\n    ref = onig_name_to_backref_number(reg, name, name_end, region);\n    s = (ref == gn ? \"*\" : \"\");\n    fprintf(stderr, \"%s (%d): \", name, gn);\n    fprintf(stderr, \"(%ld-%ld) %s\\n\", (int)region->beg[gn], (int)region->end[gn], s);\n  }\n  return 0;  /* 0: continue */\n}\n\nextern int main(int argc, char* argv[])\n{\n  OnigPosition r;\n  OnigPosition start, range, end;\n  regex_t* reg;\n  OnigErrorInfo einfo;\n  OnigRegion *region;\n\n  static UChar* pattern = (UChar* )\"(?<foo>a*)(?<bar>b*)(?<foo>c*)\";\n  static UChar* str = (UChar* )\"aaabbbbcc\";\n  OnigIterator it = {onig_default_charat, str};\n\n  r = onig_new(&reg, pattern, pattern + strlen((char* )pattern),\n\tONIG_OPTION_DEFAULT, ONIG_ENCODING_ASCII, ONIG_SYNTAX_DEFAULT, &einfo);\n  if (r != ONIG_NORMAL) {\n    char s[ONIG_MAX_ERROR_MESSAGE_LEN];\n    onig_error_code_to_str(s, r, &einfo);\n    fprintf(stderr, \"ERROR: %s\\n\", s);\n    return -1;\n  }\n\n  fprintf(stderr, \"number of names: %d\\n\", onig_number_of_names(reg));\n\n  region = onig_region_new();\n\n  end   = strlen((char* )str);\n  start = 0;\n  range = end;\n  r = onig_search(&it, reg, 0, end, start, range, region, ONIG_OPTION_NONE);\n  if (r >= 0) {\n    fprintf(stderr, \"match at %d\\n\\n\", r);\n    r = onig_foreach_name(reg, name_callback, (void* )region);\n  }\n  else if (r == ONIG_MISMATCH) {\n    fprintf(stderr, \"search fail\\n\");\n  }\n  else { /* error */\n    char s[ONIG_MAX_ERROR_MESSAGE_LEN];\n    onig_error_code_to_str(s, r);\n    return -1;\n  }\n\n  onig_region_free(region, 1 /* 1:free self, 0:free contents only */);\n  onig_free(reg);\n  onig_end();\n  return 0;\n}\n"
  },
  {
    "path": "src/Onigmo/sample/posix.c",
    "content": "/*\n * posix.c\n */\n#include <stdio.h>\n#define regex_t   onig_regex_t\n#include \"regint.h\"\n#undef regex_t\n\n#include \"onigposix.h\"\n\ntypedef unsigned char  UChar;\n\nstatic int x(regex_t* reg, unsigned char* pattern, unsigned char* str)\n{\n  int r, i;\n  char buf[200];\n  regmatch_t pmatch[20];\n  OnigIterator it = {onig_default_charat, str};\n\n  r = (int)regexec(&it, reg, 0, reg->re_nsub + 1, pmatch, 0);\n  if (r != 0 && r != REG_NOMATCH) {\n    regerror(r, reg, buf, sizeof(buf));\n    fprintf(stderr, \"ERROR: %s\\n\", buf);\n    return -1;\n  }\n\n  if (r == REG_NOMATCH) {\n    fprintf(stderr, \"FAIL: /%s/ '%s'\\n\", pattern, str);\n  }\n  else {\n    fprintf(stderr, \"OK: /%s/ '%s'\\n\", pattern, str);\n    for (i = 0; i <= (int )reg->re_nsub; i++) {\n      fprintf(stderr, \"%d: %d-%d\\n\", i, pmatch[i].rm_so, pmatch[i].rm_eo);\n    }\n  }\n  return 0;\n}\n\nextern int main(int argc, char* argv[])\n{\n  int r;\n  char buf[200];\n  regex_t reg;\n  UChar* pattern;\n\n  /* default syntax (ONIG_SYNTAX_RUBY) */\n  pattern = (UChar* )\"^a+b{2,7}[c-f]?$|uuu\";\n  r = regcomp(&reg, (char* )pattern, REG_EXTENDED);\n  if (r) {\n    regerror(r, &reg, buf, sizeof(buf));\n    fprintf(stderr, \"ERROR: %s\\n\", buf);\n    return -1;\n  }\n  x(&reg, pattern, (UChar* )\"aaabbbbd\");\n\n  /* POSIX Basic RE (REG_EXTENDED is not specified.) */\n  pattern = (UChar* )\"^a+b{2,7}[c-f]?|uuu\";\n  r = regcomp(&reg, (char* )pattern, 0);\n  if (r) {\n    regerror(r, &reg, buf, sizeof(buf));\n    fprintf(stderr, \"ERROR: %s\\n\", buf);\n    return -1;\n  }\n  x(&reg, pattern, (UChar* )\"a+b{2,7}d?|uuu\");\n\n  /* POSIX Basic RE (REG_EXTENDED is not specified.) */\n  pattern = (UChar* )\"^a*b\\\\{2,7\\\\}\\\\([c-f]\\\\)$\";\n  r = regcomp(&reg, (char* )pattern, 0);\n  if (r) {\n    regerror(r, &reg, buf, sizeof(buf));\n    fprintf(stderr, \"ERROR: %s\\n\", buf);\n    return -1;\n  }\n  x(&reg, pattern, (UChar* )\"aaaabbbbbbd\");\n\n  /* POSIX Extended RE */\n  onig_set_default_syntax(ONIG_SYNTAX_POSIX_EXTENDED);\n  pattern = (UChar* )\"^a+b{2,7}[c-f]?)$|uuu\";\n  r = regcomp(&reg, (char* )pattern, REG_EXTENDED);\n  if (r) {\n    regerror(r, &reg, buf, sizeof(buf));\n    fprintf(stderr, \"ERROR: %s\\n\", buf);\n    return -1;\n  }\n  x(&reg, pattern, (UChar* )\"aaabbbbd)\");\n\n  pattern = (UChar* )\"^b.\";\n  r = regcomp(&reg, (char* )pattern, REG_EXTENDED | REG_NEWLINE);\n  if (r) {\n    regerror(r, &reg, buf, sizeof(buf));\n    fprintf(stderr, \"ERROR: %s\\n\", buf);\n    return -1;\n  }\n  x(&reg, pattern, (UChar* )\"a\\nb\\n\");\n\n  regfree(&reg);\n  return 0;\n}\n"
  },
  {
    "path": "src/Onigmo/sample/simple.c",
    "content": "/*\n * simple.c\n */\n#include <stdio.h>\n#include <string.h>\n#include \"oniguruma.h\"\n\nextern int main(int argc, char* argv[])\n{\n  OnigPosition r;\n  OnigPosition start, range, end;\n  regex_t* reg;\n  OnigErrorInfo einfo;\n  OnigRegion *region;\n\n  static UChar* pattern = (UChar* )\"a(.*)b|[e-f]+\";\n  static UChar* str     = (UChar* )\"zzzzaffffffffb\";\n  OnigIterator it = {onig_default_charat, str};\n\n  r = onig_new(&reg, pattern, pattern + strlen((char* )pattern),\n\tONIG_OPTION_DEFAULT, ONIG_ENCODING_ASCII, ONIG_SYNTAX_DEFAULT, &einfo);\n  if (r != ONIG_NORMAL) {\n    char s[ONIG_MAX_ERROR_MESSAGE_LEN];\n    onig_error_code_to_str(s, r, &einfo);\n    fprintf(stderr, \"ERROR: %s\\n\", s);\n    return -1;\n  }\n\n  region = onig_region_new();\n\n  end   = strlen((char* )str);\n  start = 0;\n  range = end;\n  r = onig_search(&it, reg, 0, end, start, range, region, ONIG_OPTION_NONE);\n  if (r >= 0) {\n    int i;\n\n    fprintf(stderr, \"match at %d\\n\", r);\n    for (i = 0; i < region->num_regs; i++) {\n      fprintf(stderr, \"%d: (%ld-%ld)\\n\", i, (int)region->beg[i], (int)region->end[i]);\n    }\n  }\n  else if (r == ONIG_MISMATCH) {\n    fprintf(stderr, \"search fail\\n\");\n  }\n  else { /* error */\n    char s[ONIG_MAX_ERROR_MESSAGE_LEN];\n    onig_error_code_to_str(s, r);\n    fprintf(stderr, \"ERROR: %s\\n\", s);\n    return -1;\n  }\n\n  onig_region_free(region, 1 /* 1:free self, 0:free contents only */);\n  onig_free(reg);\n  onig_end();\n  return 0;\n}\n"
  },
  {
    "path": "src/Onigmo/sample/sql.c",
    "content": "/*\n * sql.c\n */\n#include <stdio.h>\n#include <string.h>\n#include \"oniguruma.h\"\n\nextern int main(int argc, char* argv[])\n{\n  static OnigSyntaxType SQLSyntax;\n\n  OnigPosition r;\n  OnigPosition start, range, end;\n  regex_t* reg;\n  OnigErrorInfo einfo;\n  OnigRegion *region;\n\n  static UChar* pattern = (UChar* )\"\\\\_%\\\\\\\\__zz\";\n  static UChar* str = (UChar* )\"a_abcabcabc\\\\ppzz\";\n  OnigIterator it = {onig_default_charat, str};\n\n  onig_set_syntax_op      (&SQLSyntax, ONIG_SYN_OP_VARIABLE_META_CHARACTERS);\n  onig_set_syntax_op2     (&SQLSyntax, 0);\n  onig_set_syntax_behavior(&SQLSyntax, 0);\n  onig_set_syntax_options (&SQLSyntax, ONIG_OPTION_MULTILINE);\n  onig_set_meta_char(&SQLSyntax, ONIG_META_CHAR_ESCAPE, (OnigCodePoint )'\\\\');\n  onig_set_meta_char(&SQLSyntax, ONIG_META_CHAR_ANYCHAR, (OnigCodePoint )'_');\n  onig_set_meta_char(&SQLSyntax, ONIG_META_CHAR_ANYTIME,\n\t\t     ONIG_INEFFECTIVE_META_CHAR);\n  onig_set_meta_char(&SQLSyntax, ONIG_META_CHAR_ZERO_OR_ONE_TIME,\n\t\t     ONIG_INEFFECTIVE_META_CHAR);\n  onig_set_meta_char(&SQLSyntax, ONIG_META_CHAR_ONE_OR_MORE_TIME,\n\t\t     ONIG_INEFFECTIVE_META_CHAR);\n  onig_set_meta_char(&SQLSyntax, ONIG_META_CHAR_ANYCHAR_ANYTIME,\n\t\t     (OnigCodePoint )'%');\n\n  r = onig_new(&reg, pattern, pattern + strlen((char* )pattern),\n\t       ONIG_OPTION_DEFAULT, ONIG_ENCODING_ASCII, &SQLSyntax, &einfo);\n  if (r != ONIG_NORMAL) {\n    char s[ONIG_MAX_ERROR_MESSAGE_LEN];\n    onig_error_code_to_str(s, r, &einfo);\n    fprintf(stderr, \"ERROR: %s\\n\", s);\n    return -1;\n  }\n\n  region = onig_region_new();\n\n  end   = strlen((char* )str);\n  start = 0;\n  range = end;\n  r = onig_search(&it, reg, 0, end, start, range, region, ONIG_OPTION_NONE);\n  if (r >= 0) {\n    int i;\n\n    fprintf(stderr, \"match at %d\\n\", r);\n    for (i = 0; i < region->num_regs; i++) {\n      fprintf(stderr, \"%d: (%ld-%ld)\\n\", i, (int)region->beg[i], (int)region->end[i]);\n    }\n  }\n  else if (r == ONIG_MISMATCH) {\n    fprintf(stderr, \"search fail\\n\");\n  }\n  else { /* error */\n    char s[ONIG_MAX_ERROR_MESSAGE_LEN];\n    onig_error_code_to_str(s, r);\n    fprintf(stderr, \"ERROR: %s\\n\", s);\n    return -1;\n  }\n\n  onig_region_free(region, 1 /* 1:free self, 0:free contents only */);\n  onig_free(reg);\n  onig_end();\n  return 0;\n}\n"
  },
  {
    "path": "src/Onigmo/sample/syntax.c",
    "content": "/*\n * syntax.c\n */\n#include <stdio.h>\n#include <string.h>\n#include \"oniguruma.h\"\n\nextern int exec(OnigSyntaxType* syntax,\n\t\tchar* apattern, char* astr)\n{\n  OnigPosition r;\n  OnigPosition start, range, end;\n  regex_t* reg;\n  OnigErrorInfo einfo;\n  OnigRegion *region;\n  UChar* pattern = (UChar* )apattern;\n  UChar* str     = (UChar* )astr;\n  OnigIterator it = {onig_default_charat, str};\n\n  r = onig_new(&reg, pattern, pattern + strlen((char* )pattern),\n\t       ONIG_OPTION_DEFAULT, ONIG_ENCODING_ASCII, syntax, &einfo);\n  if (r != ONIG_NORMAL) {\n    char s[ONIG_MAX_ERROR_MESSAGE_LEN];\n    onig_error_code_to_str(s, r, &einfo);\n    fprintf(stderr, \"ERROR: %s\\n\", s);\n    return -1;\n  }\n\n  region = onig_region_new();\n\n  end   = strlen((char* )str);\n  start = 0;\n  range = end;\n  r = onig_search(&it, reg, 0, end, start, range, region, ONIG_OPTION_NONE);\n  if (r >= 0) {\n    int i;\n\n    fprintf(stderr, \"match at %d\\n\", r);\n    for (i = 0; i < region->num_regs; i++) {\n      fprintf(stderr, \"%d: (%ld-%ld)\\n\", i, (int)region->beg[i], (int)region->end[i]);\n    }\n  }\n  else if (r == ONIG_MISMATCH) {\n    fprintf(stderr, \"search fail\\n\");\n  }\n  else { /* error */\n    char s[ONIG_MAX_ERROR_MESSAGE_LEN];\n    onig_error_code_to_str(s, r);\n    fprintf(stderr, \"ERROR: %s\\n\", s);\n    return -1;\n  }\n\n  onig_region_free(region, 1 /* 1:free self, 0:free contents only */);\n  onig_free(reg);\n  onig_end();\n  return 0;\n}\n\nextern int main(int argc, char* argv[])\n{\n  int r;\n\n  r = exec(ONIG_SYNTAX_PERL,\n\t   \"\\\\p{XDigit}\\\\P{XDigit}\\\\p{^XDigit}\\\\P{^XDigit}\\\\p{XDigit}\",\n\t   \"bgh3a\");\n\n  r = exec(ONIG_SYNTAX_JAVA,\n\t   \"\\\\p{XDigit}\\\\P{XDigit}[a-c&&b-g]\", \"bgc\");\n\n  r = exec(ONIG_SYNTAX_ASIS,\n           \"abc def* e+ g?ddd[a-rvvv] (vv){3,7}hv\\\\dvv(?:aczui ss)\\\\W\\\\w$\",\n           \"abc def* e+ g?ddd[a-rvvv] (vv){3,7}hv\\\\dvv(?:aczui ss)\\\\W\\\\w$\");\n  onig_end();\n  return 0;\n}\n"
  },
  {
    "path": "src/Onigmo/st.c",
    "content": "/* This is a public domain general purpose hash table package written by Peter Moore @ UCB. */\n\n/* static\tchar\tsccsid[] = \"@(#) st.c 5.1 89/12/14 Crucible\"; */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#ifdef _WIN32\n#include <malloc.h>\n#endif\n\n#include \"regint.h\"\n#include \"st.h\"\n\ntypedef struct st_table_entry st_table_entry;\n\nstruct st_table_entry {\n    unsigned int hash;\n    st_data_t key;\n    st_data_t record;\n    st_table_entry *next;\n};\n\n#define ST_DEFAULT_MAX_DENSITY 5\n#define ST_DEFAULT_INIT_TABLE_SIZE 11\n\n    /*\n     * DEFAULT_MAX_DENSITY is the default for the largest we allow the\n     * average number of items per bin before increasing the number of\n     * bins\n     *\n     * DEFAULT_INIT_TABLE_SIZE is the default for the number of bins\n     * allocated initially\n     *\n     */\n\nstatic int numcmp(long, long);\nstatic int numhash(long);\nstatic struct st_hash_type type_numhash = {\n    numcmp,\n    numhash,\n};\n\n/* extern int strcmp(const char *, const char *); */\nstatic int strhash(const char *);\nstatic struct st_hash_type type_strhash = {\n    strcmp,\n    strhash,\n};\n\nstatic void rehash(st_table *);\n\n#define alloc(type) (type*)xmalloc((unsigned)sizeof(type))\n#define Calloc(n,s) (char*)xcalloc((n),(s))\n\n#define EQUAL(table,x,y) ((x)==(y) || (*table->type->compare)((x),(y)) == 0)\n\n#define do_hash(key,table) (unsigned int)(*(table)->type->hash)((key))\n#define do_hash_bin(key,table) (do_hash(key, table)%(table)->num_bins)\n\n/*\n * MINSIZE is the minimum size of a dictionary.\n */\n\n#define MINSIZE 8\n\n/*\nTable of prime numbers 2^n+a, 2<=n<=30.\n*/\nstatic const long primes[] = {\n\t8 + 3,\n\t16 + 3,\n\t32 + 5,\n\t64 + 3,\n\t128 + 3,\n\t256 + 27,\n\t512 + 9,\n\t1024 + 9,\n\t2048 + 5,\n\t4096 + 3,\n\t8192 + 27,\n\t16384 + 43,\n\t32768 + 3,\n\t65536 + 45,\n\t131072 + 29,\n\t262144 + 3,\n\t524288 + 21,\n\t1048576 + 7,\n\t2097152 + 17,\n\t4194304 + 15,\n\t8388608 + 9,\n\t16777216 + 43,\n\t33554432 + 35,\n\t67108864 + 15,\n\t134217728 + 29,\n\t268435456 + 3,\n\t536870912 + 11,\n\t1073741824 + 85,\n\t0\n};\n\nstatic int\nnew_size(size)\n    int size;\n{\n    int i;\n\n#if 0\n    for (i=3; i<31; i++) {\n\tif ((1<<i) > size) return 1<<i;\n    }\n    return -1;\n#else\n    int newsize;\n\n    for (i = 0, newsize = MINSIZE;\n\t i < (int )(sizeof(primes)/sizeof(primes[0]));\n\t i++, newsize <<= 1)\n    {\n\tif (newsize > size) return primes[i];\n    }\n    /* Ran out of polynomials */\n    return -1;\t\t\t/* should raise exception */\n#endif\n}\n\n#ifdef HASH_LOG\nstatic int collision = 0;\nstatic int init_st = 0;\n\nstatic void\nstat_col()\n{\n    FILE *f = fopen(\"/tmp/col\", \"w\");\n    fprintf(f, \"collision: %d\\n\", collision);\n    fclose(f);\n}\n#endif\n\nst_table*\nst_init_table_with_size(type, size)\n    struct st_hash_type *type;\n    int size;\n{\n    st_table *tbl;\n\n#ifdef HASH_LOG\n    if (init_st == 0) {\n\tinit_st = 1;\n\tatexit(stat_col);\n    }\n#endif\n\n    size = new_size(size);\t/* round up to prime number */\n\n    tbl = alloc(st_table);\n    tbl->type = type;\n    tbl->num_entries = 0;\n    tbl->num_bins = size;\n    tbl->bins = (st_table_entry **)Calloc(size, sizeof(st_table_entry*));\n\n    return tbl;\n}\n\nst_table*\nst_init_table(type)\n    struct st_hash_type *type;\n{\n    return st_init_table_with_size(type, 0);\n}\n\nst_table*\nst_init_numtable(void)\n{\n    return st_init_table(&type_numhash);\n}\n\nst_table*\nst_init_numtable_with_size(size)\n    int size;\n{\n    return st_init_table_with_size(&type_numhash, size);\n}\n\nst_table*\nst_init_strtable(void)\n{\n    return st_init_table(&type_strhash);\n}\n\nst_table*\nst_init_strtable_with_size(size)\n    int size;\n{\n    return st_init_table_with_size(&type_strhash, size);\n}\n\nvoid\nst_free_table(table)\n    st_table *table;\n{\n    register st_table_entry *ptr, *next;\n    int i;\n\n    for(i = 0; i < table->num_bins; i++) {\n\tptr = table->bins[i];\n\twhile (ptr != 0) {\n\t    next = ptr->next;\n\t    free(ptr);\n\t    ptr = next;\n\t}\n    }\n    free(table->bins);\n    free(table);\n}\n\n#define PTR_NOT_EQUAL(table, ptr, hash_val, key) \\\n((ptr) != 0 && (ptr->hash != (hash_val) || !EQUAL((table), (key), (ptr)->key)))\n\n#ifdef HASH_LOG\n#define COLLISION collision++\n#else\n#define COLLISION\n#endif\n\n#define FIND_ENTRY(table, ptr, hash_val, bin_pos) do {\\\n    bin_pos = hash_val%(table)->num_bins;\\\n    ptr = (table)->bins[bin_pos];\\\n    if (PTR_NOT_EQUAL(table, ptr, hash_val, key)) {\\\n\tCOLLISION;\\\n\twhile (PTR_NOT_EQUAL(table, ptr->next, hash_val, key)) {\\\n\t    ptr = ptr->next;\\\n\t}\\\n\tptr = ptr->next;\\\n    }\\\n} while (0)\n\nint\nst_lookup(table, key, value)\n    st_table *table;\n    register st_data_t key;\n    st_data_t *value;\n{\n    unsigned int hash_val, bin_pos;\n    register st_table_entry *ptr;\n\n    hash_val = do_hash(key, table);\n    FIND_ENTRY(table, ptr, hash_val, bin_pos);\n\n    if (ptr == 0) {\n\treturn 0;\n    }\n    else {\n\tif (value != 0)  *value = ptr->record;\n\treturn 1;\n    }\n}\n\n#define ADD_DIRECT(table, key, value, hash_val, bin_pos)\\\ndo {\\\n    st_table_entry *entry;\\\n    if (table->num_entries/(table->num_bins) > ST_DEFAULT_MAX_DENSITY) {\\\n\trehash(table);\\\n        bin_pos = hash_val % table->num_bins;\\\n    }\\\n    \\\n    entry = alloc(st_table_entry);\\\n    \\\n    entry->hash = hash_val;\\\n    entry->key = key;\\\n    entry->record = value;\\\n    entry->next = table->bins[bin_pos];\\\n    table->bins[bin_pos] = entry;\\\n    table->num_entries++;\\\n} while (0)\n\nint\nst_insert(table, key, value)\n    register st_table *table;\n    register st_data_t key;\n    st_data_t value;\n{\n    unsigned int hash_val, bin_pos;\n    register st_table_entry *ptr;\n\n    hash_val = do_hash(key, table);\n    FIND_ENTRY(table, ptr, hash_val, bin_pos);\n\n    if (ptr == 0) {\n\tADD_DIRECT(table, key, value, hash_val, bin_pos);\n\treturn 0;\n    }\n    else {\n\tptr->record = value;\n\treturn 1;\n    }\n}\n\nvoid\nst_add_direct(table, key, value)\n    st_table *table;\n    st_data_t key;\n    st_data_t value;\n{\n    unsigned int hash_val, bin_pos;\n\n    hash_val = do_hash(key, table);\n    bin_pos = hash_val % table->num_bins;\n    ADD_DIRECT(table, key, value, hash_val, bin_pos);\n}\n\nstatic void\nrehash(table)\n    register st_table *table;\n{\n    register st_table_entry *ptr, *next, **new_bins;\n    int i, old_num_bins = table->num_bins, new_num_bins;\n    unsigned int hash_val;\n\n    new_num_bins = new_size(old_num_bins+1);\n    new_bins = (st_table_entry**)Calloc(new_num_bins, sizeof(st_table_entry*));\n\n    for(i = 0; i < old_num_bins; i++) {\n\tptr = table->bins[i];\n\twhile (ptr != 0) {\n\t    next = ptr->next;\n\t    hash_val = ptr->hash % new_num_bins;\n\t    ptr->next = new_bins[hash_val];\n\t    new_bins[hash_val] = ptr;\n\t    ptr = next;\n\t}\n    }\n    free(table->bins);\n    table->num_bins = new_num_bins;\n    table->bins = new_bins;\n}\n\nst_table*\nst_copy(old_table)\n    st_table *old_table;\n{\n    st_table *new_table;\n    st_table_entry *ptr, *entry;\n    int i, num_bins = old_table->num_bins;\n\n    new_table = alloc(st_table);\n    if (new_table == 0) {\n\treturn 0;\n    }\n\n    *new_table = *old_table;\n    new_table->bins = (st_table_entry**)\n\tCalloc((unsigned)num_bins, sizeof(st_table_entry*));\n\n    if (new_table->bins == 0) {\n\tfree(new_table);\n\treturn 0;\n    }\n\n    for(i = 0; i < num_bins; i++) {\n\tnew_table->bins[i] = 0;\n\tptr = old_table->bins[i];\n\twhile (ptr != 0) {\n\t    entry = alloc(st_table_entry);\n\t    if (entry == 0) {\n\t\tfree(new_table->bins);\n\t\tfree(new_table);\n\t\treturn 0;\n\t    }\n\t    *entry = *ptr;\n\t    entry->next = new_table->bins[i];\n\t    new_table->bins[i] = entry;\n\t    ptr = ptr->next;\n\t}\n    }\n    return new_table;\n}\n\nint\nst_delete(table, key, value)\n    register st_table *table;\n    register st_data_t *key;\n    st_data_t *value;\n{\n    unsigned int hash_val;\n    st_table_entry *tmp;\n    register st_table_entry *ptr;\n\n    hash_val = do_hash_bin(*key, table);\n    ptr = table->bins[hash_val];\n\n    if (ptr == 0) {\n\tif (value != 0) *value = 0;\n\treturn 0;\n    }\n\n    if (EQUAL(table, *key, ptr->key)) {\n\ttable->bins[hash_val] = ptr->next;\n\ttable->num_entries--;\n\tif (value != 0) *value = ptr->record;\n\t*key = ptr->key;\n\tfree(ptr);\n\treturn 1;\n    }\n\n    for(; ptr->next != 0; ptr = ptr->next) {\n\tif (EQUAL(table, ptr->next->key, *key)) {\n\t    tmp = ptr->next;\n\t    ptr->next = ptr->next->next;\n\t    table->num_entries--;\n\t    if (value != 0) *value = tmp->record;\n\t    *key = tmp->key;\n\t    free(tmp);\n\t    return 1;\n\t}\n    }\n\n    return 0;\n}\n\nint\nst_delete_safe(table, key, value, never)\n    register st_table *table;\n    register st_data_t *key;\n    st_data_t *value;\n    st_data_t never;\n{\n    unsigned int hash_val;\n    register st_table_entry *ptr;\n\n    hash_val = do_hash_bin(*key, table);\n    ptr = table->bins[hash_val];\n\n    if (ptr == 0) {\n\tif (value != 0) *value = 0;\n\treturn 0;\n    }\n\n    for(; ptr != 0; ptr = ptr->next) {\n\tif ((ptr->key != never) && EQUAL(table, ptr->key, *key)) {\n\t    table->num_entries--;\n\t    *key = ptr->key;\n\t    if (value != 0) *value = ptr->record;\n\t    ptr->key = ptr->record = never;\n\t    return 1;\n\t}\n    }\n\n    return 0;\n}\n\nstatic int\n#if defined(__GNUC__)\ndelete_never(st_data_t key __attribute__ ((unused)), st_data_t value,\n\t     st_data_t never)\n#else\ndelete_never(key, value, never)\n    st_data_t key, value, never;\n#endif\n{\n    if (value == never) return ST_DELETE;\n    return ST_CONTINUE;\n}\n\nvoid\nst_cleanup_safe(table, never)\n    st_table *table;\n    st_data_t never;\n{\n    int num_entries = table->num_entries;\n\n    st_foreach(table, delete_never, never);\n    table->num_entries = num_entries;\n}\n\nint\nst_foreach(table, func, arg)\n    st_table *table;\n    int (*func)();\n    st_data_t arg;\n{\n    st_table_entry *ptr, *last, *tmp;\n    enum st_retval retval;\n    int i;\n\n    for(i = 0; i < table->num_bins; i++) {\n\tlast = 0;\n\tfor(ptr = table->bins[i]; ptr != 0;) {\n\t    retval = (*func)(ptr->key, ptr->record, arg);\n\t    switch (retval) {\n\t    case ST_CHECK:\t/* check if hash is modified during iteration */\n\t        tmp = 0;\n\t\tif (i < table->num_bins) {\n\t\t    for (tmp = table->bins[i]; tmp; tmp=tmp->next) {\n\t\t\tif (tmp == ptr) break;\n\t\t    }\n\t\t}\n\t\tif (!tmp) {\n\t\t    /* call func with error notice */\n\t\t    return 1;\n\t\t}\n\t\t/* fall through */\n\t    case ST_CONTINUE:\n\t\tlast = ptr;\n\t\tptr = ptr->next;\n\t\tbreak;\n\t    case ST_STOP:\n\t        return 0;\n\t    case ST_DELETE:\n\t\ttmp = ptr;\n\t\tif (last == 0) {\n\t\t    table->bins[i] = ptr->next;\n\t\t}\n\t\telse {\n\t\t    last->next = ptr->next;\n\t\t}\n\t\tptr = ptr->next;\n\t\tfree(tmp);\n\t\ttable->num_entries--;\n\t    }\n\t}\n    }\n    return 0;\n}\n\nstatic int\nstrhash(string)\n    register const char *string;\n{\n    register int c;\n\n#ifdef HASH_ELFHASH\n    register unsigned int h = 0, g;\n\n    while ((c = *string++) != '\\0') {\n\th = ( h << 4 ) + c;\n\tif ( g = h & 0xF0000000 )\n\t    h ^= g >> 24;\n\th &= ~g;\n    }\n    return h;\n#elif HASH_PERL\n    register int val = 0;\n\n    while ((c = *string++) != '\\0') {\n\tval += c;\n\tval += (val << 10);\n\tval ^= (val >> 6);\n    }\n    val += (val << 3);\n    val ^= (val >> 11);\n\n    return val + (val << 15);\n#else\n    register int val = 0;\n\n    while ((c = *string++) != '\\0') {\n\tval = val*997 + c;\n    }\n\n    return val + (val>>5);\n#endif\n}\n\nstatic int\nnumcmp(x, y)\n    long x, y;\n{\n    return x != y;\n}\n\nstatic int\nnumhash(n)\n    long n;\n{\n    return n;\n}\n"
  },
  {
    "path": "src/Onigmo/st.h",
    "content": "/* This is a public domain general purpose hash table package written by Peter Moore @ UCB. */\n\n/* @(#) st.h 5.1 89/12/14 */\n\n#ifndef ST_INCLUDED\n\n#define ST_INCLUDED\n\ntypedef uintptr_t st_data_t;\n#define ST_DATA_T_DEFINED\n\ntypedef struct st_table st_table;\n\nstruct st_hash_type {\n    int (*compare)();\n    int (*hash)();\n};\n\nstruct st_table {\n    struct st_hash_type *type;\n    int num_bins;\n    int num_entries;\n    struct st_table_entry **bins;\n};\n\n#define st_is_member(table,key) st_lookup(table,key,(st_data_t *)0)\n\nenum st_retval {ST_CONTINUE, ST_STOP, ST_DELETE, ST_CHECK};\n\n#ifndef _\n# define _(args) args\n#endif\n#ifndef ANYARGS\n# ifdef __cplusplus\n#   define ANYARGS ...\n# else\n#   define ANYARGS\n# endif\n#endif\n\nst_table *st_init_table _((struct st_hash_type *));\nst_table *st_init_table_with_size _((struct st_hash_type *, int));\nst_table *st_init_numtable _((void));\nst_table *st_init_numtable_with_size _((int));\nst_table *st_init_strtable _((void));\nst_table *st_init_strtable_with_size _((int));\nint st_delete _((st_table *, st_data_t *, st_data_t *));\nint st_delete_safe _((st_table *, st_data_t *, st_data_t *, st_data_t));\nint st_insert _((st_table *, st_data_t, st_data_t));\nint st_lookup _((st_table *, st_data_t, st_data_t *));\nint st_foreach _((st_table *, int (*)(ANYARGS), st_data_t));\nvoid st_add_direct _((st_table *, st_data_t, st_data_t));\nvoid st_free_table _((st_table *));\nvoid st_cleanup_safe _((st_table *, st_data_t));\nst_table *st_copy _((st_table *));\n\n#define ST_NUMCMP\t((int (*)()) 0)\n#define ST_NUMHASH\t((int (*)()) -2)\n\n#define st_numcmp\tST_NUMCMP\n#define st_numhash\tST_NUMHASH\n\n#endif /* ST_INCLUDED */\n"
  },
  {
    "path": "src/Onigmo/test.rb",
    "content": "# test.rb\n# Copyright (C) 2003-2006  K.Kosako (sndgk393 AT ybb DOT ne DOT jp)\n\n$SILENT = false\nif (ARGV.size > 0 and ARGV[0] == '-s')\n  $SILENT = true\nend\n\ndef pr(result, reg, str, n = 0, *range)\n  printf(\"%s /%s/:'%s'\", result, reg.source, str)\n  if (n.class == Fixnum)\n    printf(\":%d\", n) if n != 0\n    if (range.size > 0)\n      if (range[3].nil?)\n\tprintf(\" (%d-%d : X-X)\", range[0], range[1])\n      else\n\tprintf(\" (%d-%d : %d-%d)\", range[0], range[1], range[2], range[3])\n      end\n    end\n  else\n    printf(\"  %s\", n)\n  end\n  printf(\"\\n\")\nend\n\ndef rok(result_opt, reg, str, n = 0, *range)\n  result = \"OK\" + result_opt\n  result += \" \" * (7 - result.length)\n  pr(result, reg, str, n, *range) unless $SILENT\n  $rok += 1\nend\n\ndef rfail(result_opt, reg, str, n = 0, *range)\n  result = \"FAIL\" + result_opt\n  result += \" \" * (7 - result.length)\n  pr(result, reg, str, n, *range)\n  $rfail += 1\nend\n\ndef x(reg, str, s, e, n = 0)\n  m = reg.match(str)\n  if m\n    if (m.size() <= n)\n      rfail(\"(%d)\" % (m.size()-1), reg, str, n)\n    else\n      if (m.begin(n) == s && m.end(n) == e)\n\trok(\"\", reg, str, n)\n      else\n\trfail(\"\", reg, str, n, s, e, m.begin(n), m.end(n))\n      end\n    end\n  else\n    rfail(\"\", reg, str, n)\n  end\nend\n\ndef n(reg, str)\n  m = reg.match(str)\n  if m\n    rfail(\"(N)\", reg, str, 0)\n  else\n    rok(\"(N)\", reg, str, 0)\n  end\nend\n\ndef r(reg, str, index, pos = nil)\n  if (pos)\n    res = str.rindex(reg, pos)\n  else\n    res = str.rindex(reg)\n  end\n  if res\n    if (res == index)\n      rok(\"(r)\", reg, str)\n    else\n      rfail(\"(r)\", reg, str, [res, '-', index])\n    end\n  else\n    rfail(\"(r)\", reg, str)\n  end\nend\n\ndef i(reg, str, s = 0, e = 0, n = 0)\n  # ignore\nend\n\n### main ###\n$rok = $rfail = 0\n\n\nx(/\\M-Z/n, \"\\xDA\", 0, 1)\n\n# from URI::ABS_URI\nn(/^\n        ([a-zA-Z][-+.a-zA-Z\\d]*):                     (?# 1: scheme)\n        (?:\n           ((?:[-_.!~*'()a-zA-Z\\d;?:@&=+$,]|%[a-fA-F\\d]{2})(?:[-_.!~*'()a-zA-Z\\d;\\/?:@&=+$,\\[\\]]|%[a-fA-F\\d]{2})*)              (?# 2: opaque)\n        |\n           (?:(?:\n             \\/\\/(?:\n                 (?:(?:((?:[-_.!~*'()a-zA-Z\\d;:&=+$,]|%[a-fA-F\\d]{2})*)@)?  (?# 3: userinfo)\n                   (?:((?:(?:(?:[a-zA-Z\\d](?:[-a-zA-Z\\d]*[a-zA-Z\\d])?)\\.)*(?:[a-zA-Z](?:[-a-zA-Z\\d]*[a-zA-Z\\d])?)\\.?|\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|\\[(?:(?:[a-fA-F\\d]{1,4}:)*(?:[a-fA-F\\d]{1,4}|\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})|(?:(?:[a-fA-F\\d]{1,4}:)*[a-fA-F\\d]{1,4})?::(?:(?:[a-fA-F\\d]{1,4}:)*(?:[a-fA-F\\d]{1,4}|\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}))?)\\]))(?::(\\d*))?))?(?# 4: host, 5: port)\n               |\n                 ((?:[-_.!~*'()a-zA-Z\\d$,;+@&=+]|%[a-fA-F\\d]{2})+)           (?# 6: registry)\n               )\n             |\n             (?!\\/\\/))                              (?# XXX: '\\/\\/' is the mark for hostport)\n             (\\/(?:[-_.!~*'()a-zA-Z\\d:@&=+$,]|%[a-fA-F\\d]{2})*(?:;(?:[-_.!~*'()a-zA-Z\\d:@&=+$,]|%[a-fA-F\\d]{2})*)*(?:\\/(?:[-_.!~*'()a-zA-Z\\d:@&=+$,]|%[a-fA-F\\d]{2})*(?:;(?:[-_.!~*'()a-zA-Z\\d:@&=+$,]|%[a-fA-F\\d]{2})*)*)*)?              (?# 7: path)\n           )(?:\\?((?:[-_.!~*'()a-zA-Z\\d;\\/?:@&=+$,\\[\\]]|%[a-fA-F\\d]{2})*))?           (?# 8: query)\n        )\n        (?:\\#((?:[-_.!~*'()a-zA-Z\\d;\\/?:@&=+$,\\[\\]]|%[a-fA-F\\d]{2})*))?            (?# 9: fragment)\n      $/xn, \"http://example.org/Andr\\xC3\\xA9\")\n\n\ndef test_sb(enc)\n$KCODE = enc\n\nx(//, '', 0, 0)\nx(/^/, '', 0, 0)\nx(/$/, '', 0, 0)\nx(/\\G/, '', 0, 0)\nx(/\\A/, '', 0, 0)\nx(/\\Z/, '', 0, 0)\nx(/\\z/, '', 0, 0)\nx(/^$/, '', 0, 0)\nx(/\\ca/, \"\\001\", 0, 1)\nx(/\\C-b/, \"\\002\", 0, 1)\nx(/\\c\\\\/, \"\\034\", 0, 1)\nx(/q[\\c\\\\]/, \"q\\034\", 0, 2)\nx(//, 'a', 0, 0)\nx(/a/, 'a', 0, 1)\nx(/\\x61/, 'a', 0, 1)\nx(/aa/, 'aa', 0, 2)\nx(/aaa/, 'aaa', 0, 3)\nx(/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/, 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa', 0, 35)\nx(/ab/, 'ab', 0, 2)\nx(/b/, 'ab', 1, 2)\nx(/bc/, 'abc', 1, 3)\nx(/(?i:#RET#)/, '#INS##RET#', 5, 10)\nx(/\\17/, \"\\017\", 0, 1)\nx(/\\x1f/, \"\\x1f\", 0, 1)\nx(/a(?#....\\\\JJJJ)b/, 'ab', 0, 2)\nx(Regexp.new(\"(?x)\\ta .\\n+b\"), '0a123b4', 1, 6)\nx(/(?x)  G (o O(?-x)oO) g L/, \"GoOoOgLe\", 0, 7)\nx(/./, 'a', 0, 1)\nn(/./, '')\nx(/../, 'ab', 0, 2)\nx(/\\w/, 'e', 0, 1)\nn(/\\W/, 'e')\nx(/\\s/, ' ', 0, 1)\nx(/\\S/, 'b', 0, 1)\nx(/\\d/, '4', 0, 1)\nn(/\\D/, '4')\nx(/\\b/, 'z ', 0, 0)\nx(/\\b/, ' z', 1, 1)\nx(/\\B/, 'zz ', 1, 1)\nx(/\\B/, 'z ', 2, 2)\nx(/\\B/, ' z', 0, 0)\nx(/[ab]/, 'b', 0, 1)\nn(/[ab]/, 'c')\nx(/[a-z]/, 't', 0, 1)\nn(/[^a]/, 'a')\nx(/[^a]/, \"\\n\", 0, 1)\nx(/[]]/, ']', 0, 1)\nn(/[^]]/, ']')\nx(/[\\^]+/, '0^^1', 1, 3)\nx(/[b-]/, 'b', 0, 1)\nx(/[b-]/, '-', 0, 1)\nx(/[\\w]/, 'z', 0, 1)\nn(/[\\w]/, ' ')\nx(/[\\W]/, 'b$', 1, 2)\nx(/[\\d]/, '5', 0, 1)\nn(/[\\d]/, 'e')\nx(/[\\D]/, 't', 0, 1)\nn(/[\\D]/, '3')\nx(/[\\s]/, ' ', 0, 1)\nn(/[\\s]/, 'a')\nx(/[\\S]/, 'b', 0, 1)\nn(/[\\S]/, ' ')\nx(/[\\w\\d]/, '2', 0, 1)\nn(/[\\w\\d]/, ' ')\nx(/[[:upper:]]/, 'B', 0, 1)\nx(/[*[:xdigit:]+]/, '+', 0, 1)\nx(/[*[:xdigit:]+]/, 'GHIKK-9+*', 6, 7)\nx(/[*[:xdigit:]+]/, '-@^+', 3, 4)\nn(/[[:upper]]/, 'A')\nx(/[[:upper]]/, ':', 0, 1)\nx(/[\\044-\\047]/, \"\\046\", 0, 1)\nx(/[\\x5a-\\x5c]/, \"\\x5b\", 0, 1)\nx(/[\\x6A-\\x6D]/, \"\\x6c\", 0, 1)\nn(/[\\x6A-\\x6D]/, \"\\x6E\")\nn(/^[0-9A-F]+ 0+ UNDEF /, '75F 00000000 SECT14A notype ()    External    | _rb_apply')\nx(/[\\[]/, '[', 0, 1)\nx(/[\\]]/, ']', 0, 1)\nx(/[&]/, '&', 0, 1)\nx(/[[ab]]/, 'b', 0, 1)\nx(/[[ab]c]/, 'c', 0, 1)\nn(/[[^a]]/, 'a')\nn(/[^[a]]/, 'a')\nx(/[[ab]&&bc]/, 'b', 0, 1)\nn(/[[ab]&&bc]/, 'a')\nn(/[[ab]&&bc]/, 'c')\nx(/[a-z&&b-y&&c-x]/, 'w', 0, 1)\nn(/[^a-z&&b-y&&c-x]/, 'w')\nx(/[[^a&&a]&&a-z]/, 'b', 0, 1)\nn(/[[^a&&a]&&a-z]/, 'a')\nx(/[[^a-z&&bcdef]&&[^c-g]]/, 'h', 0, 1)\nn(/[[^a-z&&bcdef]&&[^c-g]]/, 'c')\nx(/[^[^abc]&&[^cde]]/, 'c', 0, 1)\nx(/[^[^abc]&&[^cde]]/, 'e', 0, 1)\nn(/[^[^abc]&&[^cde]]/, 'f')\nx(/[a-&&-a]/, '-', 0, 1)\nn(/[a\\-&&\\-a]/, '&')\nn(/\\wabc/, ' abc')\nx(/a\\Wbc/, 'a bc', 0, 4)\nx(/a.b.c/, 'aabbc', 0, 5)\nx(/.\\wb\\W..c/, 'abb bcc', 0, 7)\nx(/\\s\\wzzz/, ' zzzz', 0, 5)\nx(/aa.b/, 'aabb', 0, 4)\nn(/.a/, 'ab')\nx(/.a/, 'aa', 0, 2)\nx(/^a/, 'a', 0, 1)\nx(/^a$/, 'a', 0, 1)\nx(/^\\w$/, 'a', 0, 1)\nn(/^\\w$/, ' ')\nx(/^\\wab$/, 'zab', 0, 3)\nx(/^\\wabcdef$/, 'zabcdef', 0, 7)\nx(/^\\w...def$/, 'zabcdef', 0, 7)\nx(/\\w\\w\\s\\Waaa\\d/, 'aa  aaa4', 0, 8)\nx(/\\A\\Z/, '', 0, 0)\nx(/\\Axyz/, 'xyz', 0, 3)\nx(/xyz\\Z/, 'xyz', 0, 3)\nx(/xyz\\z/, 'xyz', 0, 3)\nx(/a\\Z/, 'a', 0, 1)\nx(/\\Gaz/, 'az', 0, 2)\nn(/\\Gz/, 'bza')\nn(/az\\G/, 'az')\nn(/az\\A/, 'az')\nn(/a\\Az/, 'az')\nx(/\\^\\$/, '^$', 0, 2)\nx(/^x?y/, 'xy', 0, 2)\nx(/^(x?y)/, 'xy', 0, 2)\nx(/\\w/, '_', 0, 1)\nn(/\\W/, '_')\nx(/(?=z)z/, 'z', 0, 1)\nn(/(?=z)./, 'a')\nx(/(?!z)a/, 'a', 0, 1)\nn(/(?!z)a/, 'z')\nx(/(?i:a)/, 'a', 0, 1)\nx(/(?i:a)/, 'A', 0, 1)\nx(/(?i:A)/, 'a', 0, 1)\nn(/(?i:A)/, 'b')\nx(/(?i:[A-Z])/, 'a', 0, 1)\nx(/(?i:[f-m])/, 'H', 0, 1)\nx(/(?i:[f-m])/, 'h', 0, 1)\nn(/(?i:[f-m])/, 'e')\nx(/(?i:[A-c])/, 'D', 0, 1)\n#n(/(?i:[a-C])/, 'D')   # changed spec.(error) 2003/09/17\n#n(/(?i:[b-C])/, 'A')\n#x(/(?i:[a-C])/, 'B', 0, 1)\n#n(/(?i:[c-X])/, '[')\nn(/(?i:[^a-z])/, 'A')\nn(/(?i:[^a-z])/, 'a')\nx(/(?i:[!-k])/, 'Z', 0, 1)\nx(/(?i:[!-k])/, '7', 0, 1)\nx(/(?i:[T-}])/, 'b', 0, 1)\nx(/(?i:[T-}])/, '{', 0, 1)\nx(/(?i:\\?a)/, '?A', 0, 2)\nx(/(?i:\\*A)/, '*a', 0, 2)\nn(/./, \"\\n\")\nx(/(?m:.)/, \"\\n\", 0, 1)\nx(/(?m:a.)/, \"a\\n\", 0, 2)\nx(/(?m:.b)/, \"a\\nb\", 1, 3)\nx(/.*abc/, \"dddabdd\\nddabc\", 8, 13)\nx(/(?m:.*abc)/, \"dddabddabc\", 0, 10)\nn(/(?i)(?-i)a/, \"A\")\nn(/(?i)(?-i:a)/, \"A\")\nx(/a?/, '', 0, 0)\nx(/a?/, 'b', 0, 0)\nx(/a?/, 'a', 0, 1)\nx(/a*/, '', 0, 0)\nx(/a*/, 'a', 0, 1)\nx(/a*/, 'aaa', 0, 3)\nx(/a*/, 'baaaa', 0, 0)\nn(/a+/, '')\nx(/a+/, 'a', 0, 1)\nx(/a+/, 'aaaa', 0, 4)\nx(/a+/, 'aabbb', 0, 2)\nx(/a+/, 'baaaa', 1, 5)\nx(/.?/, '', 0, 0)\nx(/.?/, 'f', 0, 1)\nx(/.?/, \"\\n\", 0, 0)\nx(/.*/, '', 0, 0)\nx(/.*/, 'abcde', 0, 5)\nx(/.+/, 'z', 0, 1)\nx(/.+/, \"zdswer\\n\", 0, 6)\nx(/(.*)a\\1f/, \"babfbac\", 0, 4)\nx(/(.*)a\\1f/, \"bacbabf\", 3, 7)\nx(/((.*)a\\2f)/, \"bacbabf\", 3, 7)\nx(/(.*)a\\1f/, \"baczzzzzz\\nbazz\\nzzzzbabf\", 19, 23)\nx(/a|b/, 'a', 0, 1)\nx(/a|b/, 'b', 0, 1)\nx(/|a/, 'a', 0, 0)\nx(/(|a)/, 'a', 0, 0)\nx(/ab|bc/, 'ab', 0, 2)\nx(/ab|bc/, 'bc', 0, 2)\nx(/z(?:ab|bc)/, 'zbc', 0, 3)\nx(/a(?:ab|bc)c/, 'aabc', 0, 4)\nx(/ab|(?:ac|az)/, 'az', 0, 2)\nx(/a|b|c/, 'dc', 1, 2)\nx(/a|b|cd|efg|h|ijk|lmn|o|pq|rstuvwx|yz/, 'pqr', 0, 2)\nn(/a|b|cd|efg|h|ijk|lmn|o|pq|rstuvwx|yz/, 'mn')\nx(/a|^z/, 'ba', 1, 2)\nx(/a|^z/, 'za', 0, 1)\nx(/a|\\Gz/, 'bza', 2, 3)\nx(/a|\\Gz/, 'za', 0, 1)\nx(/a|\\Az/, 'bza', 2, 3)\nx(/a|\\Az/, 'za', 0, 1)\nx(/a|b\\Z/, 'ba', 1, 2)\nx(/a|b\\Z/, 'b', 0, 1)\nx(/a|b\\z/, 'ba', 1, 2)\nx(/a|b\\z/, 'b', 0, 1)\nx(/\\w|\\s/, ' ', 0, 1)\nn(/\\w|\\w/, ' ')\nx(/\\w|%/, '%', 0, 1)\nx(/\\w|[&$]/, '&', 0, 1)\nx(/[b-d]|[^e-z]/, 'a', 0, 1)\nx(/(?:a|[c-f])|bz/, 'dz', 0, 1)\nx(/(?:a|[c-f])|bz/, 'bz', 0, 2)\nx(/abc|(?=zz)..f/, 'zzf', 0, 3)\nx(/abc|(?!zz)..f/, 'abf', 0, 3)\nx(/(?=za)..a|(?=zz)..a/, 'zza', 0, 3)\nn(/(?>a|abd)c/, 'abdc')\nx(/(?>abd|a)c/, 'abdc', 0, 4)\nx(/a?|b/, 'a', 0, 1)\nx(/a?|b/, 'b', 0, 0)\nx(/a?|b/, '', 0, 0)\nx(/a*|b/, 'aa', 0, 2)\nx(/a*|b*/, 'ba', 0, 0)\nx(/a*|b*/, 'ab', 0, 1)\nx(/a+|b*/, '', 0, 0)\nx(/a+|b*/, 'bbb', 0, 3)\nx(/a+|b*/, 'abbb', 0, 1)\nn(/a+|b+/, '')\nx(/(a|b)?/, 'b', 0, 1)\nx(/(a|b)*/, 'ba', 0, 2)\nx(/(a|b)+/, 'bab', 0, 3)\nx(/(ab|ca)+/, 'caabbc', 0, 4)\nx(/(ab|ca)+/, 'aabca', 1, 5)\nx(/(ab|ca)+/, 'abzca', 0, 2)\nx(/(a|bab)+/, 'ababa', 0, 5)\nx(/(a|bab)+/, 'ba', 1, 2)\nx(/(a|bab)+/, 'baaaba', 1, 4)\nx(/(?:a|b)(?:a|b)/, 'ab', 0, 2)\nx(/(?:a*|b*)(?:a*|b*)/, 'aaabbb', 0, 3)\nx(/(?:a*|b*)(?:a+|b+)/, 'aaabbb', 0, 6)\nx(/(?:a+|b+){2}/, 'aaabbb', 0, 6)\nx(/h{0,}/, 'hhhh', 0, 4)\nx(/(?:a+|b+){1,2}/, 'aaabbb', 0, 6)\nn(/ax{2}*a/, '0axxxa1')\nn(/a.{0,2}a/, \"0aXXXa0\")\nn(/a.{0,2}?a/, \"0aXXXa0\")\nn(/a.{0,2}?a/, \"0aXXXXa0\")\nx(/^a{2,}?a$/, \"aaa\", 0, 3)\nx(/^[a-z]{2,}?$/, \"aaa\", 0, 3)\nx(/(?:a+|\\Ab*)cc/, 'cc', 0, 2)\nn(/(?:a+|\\Ab*)cc/, 'abcc')\nx(/(?:^a+|b+)*c/, 'aabbbabc', 6, 8)\nx(/(?:^a+|b+)*c/, 'aabbbbc', 0, 7)\nx(/a|(?i)c/, 'C', 0, 1)\nx(/(?i)c|a/, 'C', 0, 1)\ni(/(?i)c|a/, 'A', 0, 1)  # different spec.\nx(/(?i:c)|a/, 'C', 0, 1)\nn(/(?i:c)|a/, 'A')\nx(/[abc]?/, 'abc', 0, 1)\nx(/[abc]*/, 'abc', 0, 3)\nx(/[^abc]*/, 'abc', 0, 0)\nn(/[^abc]+/, 'abc')\nx(/a??/, 'aaa', 0, 0)\nx(/ba??b/, 'bab', 0, 3)\nx(/a*?/, 'aaa', 0, 0)\nx(/ba*?/, 'baa', 0, 1)\nx(/ba*?b/, 'baab', 0, 4)\nx(/a+?/, 'aaa', 0, 1)\nx(/ba+?/, 'baa', 0, 2)\nx(/ba+?b/, 'baab', 0, 4)\nx(/(?:a?)??/, 'a', 0, 0)\nx(/(?:a??)?/, 'a', 0, 0)\nx(/(?:a?)+?/, 'aaa', 0, 1)\nx(/(?:a+)??/, 'aaa', 0, 0)\nx(/(?:a+)??b/, 'aaab', 0, 4)\ni(/(?:ab)?{2}/, '', 0, 0)   # GNU regex bug\nx(/(?:ab)?{2}/, 'ababa', 0, 4)\nx(/(?:ab)*{0}/, 'ababa', 0, 0)\nx(/(?:ab){3,}/, 'abababab', 0, 8)\nn(/(?:ab){3,}/, 'abab')\nx(/(?:ab){2,4}/, 'ababab', 0, 6)\nx(/(?:ab){2,4}/, 'ababababab', 0, 8)\nx(/(?:ab){2,4}?/, 'ababababab', 0, 4)\nx(/(?:ab){,}/, 'ab{,}', 0, 5)\nx(/(?:abc)+?{2}/, 'abcabcabc', 0, 6)\nx(/(?:X*)(?i:xa)/, 'XXXa', 0, 4)\nx(/(d+)([^abc]z)/, 'dddz', 0, 4)\nx(/([^abc]*)([^abc]z)/, 'dddz', 0, 4)\nx(/(\\w+)(\\wz)/, 'dddz', 0, 4)\nx(/(a)/, 'a', 0, 1, 1)\nx(/(ab)/, 'ab', 0, 2, 1)\nx(/((ab))/, 'ab', 0, 2)\nx(/((ab))/, 'ab', 0, 2, 1)\nx(/((ab))/, 'ab', 0, 2, 2)\nx(/((((((((((((((((((((ab))))))))))))))))))))/, 'ab', 0, 2, 20)\nx(/(ab)(cd)/, 'abcd', 0, 2, 1)\nx(/(ab)(cd)/, 'abcd', 2, 4, 2)\nx(/()(a)bc(def)ghijk/, 'abcdefghijk', 3, 6, 3)\nx(/(()(a)bc(def)ghijk)/, 'abcdefghijk', 3, 6, 4)\nx(/(^a)/, 'a', 0, 1)\nx(/(a)|(a)/, 'ba', 1, 2, 1)\nx(/(^a)|(a)/, 'ba', 1, 2, 2)\nx(/(a?)/, 'aaa', 0, 1, 1)\nx(/(a*)/, 'aaa', 0, 3, 1)\nx(/(a*)/, '', 0, 0, 1)\nx(/(a+)/, 'aaaaaaa', 0, 7, 1)\nx(/(a+|b*)/, 'bbbaa', 0, 3, 1)\nx(/(a+|b?)/, 'bbbaa', 0, 1, 1)\nx(/(abc)?/, 'abc', 0, 3, 1)\nx(/(abc)*/, 'abc', 0, 3, 1)\nx(/(abc)+/, 'abc', 0, 3, 1)\nx(/(xyz|abc)+/, 'abc', 0, 3, 1)\nx(/([xyz][abc]|abc)+/, 'abc', 0, 3, 1)\nx(/((?i:abc))/, 'AbC', 0, 3, 1)\nx(/(abc)(?i:\\1)/, 'abcABC', 0, 6)\nx(/((?m:a.c))/, \"a\\nc\", 0, 3, 1)\nx(/((?=az)a)/, 'azb', 0, 1, 1)\nx(/abc|(.abd)/, 'zabd', 0, 4, 1)\nx(/(?:abc)|(ABC)/, 'abc', 0, 3)\nx(/(?i:(abc))|(zzz)/, 'ABC', 0, 3, 1)\nx(/a*(.)/, 'aaaaz', 4, 5, 1)\nx(/a*?(.)/, 'aaaaz', 0, 1, 1)\nx(/a*?(c)/, 'aaaac', 4, 5, 1)\nx(/[bcd]a*(.)/, 'caaaaz', 5, 6, 1)\nx(/(\\Abb)cc/, 'bbcc', 0, 2, 1)\nn(/(\\Abb)cc/, 'zbbcc')\nx(/(^bb)cc/, 'bbcc', 0, 2, 1)\nn(/(^bb)cc/, 'zbbcc')\nx(/cc(bb$)/, 'ccbb', 2, 4, 1)\nn(/cc(bb$)/, 'ccbbb')\n#n(/\\1/, 'a')     # compile error on Oniguruma\nn(/(\\1)/, '')\nn(/\\1(a)/, 'aa')\nn(/(a(b)\\1)\\2+/, 'ababb')\nn(/(?:(?:\\1|z)(a))+$/, 'zaa')\nx(/(?:(?:\\1|z)(a))+$/, 'zaaa', 0, 4)\nx(/(a)(?=\\1)/, 'aa', 0, 1)\nn(/(a)$|\\1/, 'az')\nx(/(a)\\1/, 'aa', 0, 2)\nn(/(a)\\1/, 'ab')\nx(/(a?)\\1/, 'aa', 0, 2)\nx(/(a??)\\1/, 'aa', 0, 0)\nx(/(a*)\\1/, 'aaaaa', 0, 4)\nx(/(a*)\\1/, 'aaaaa', 0, 2, 1)\nx(/a(b*)\\1/, 'abbbb', 0, 5)\nx(/a(b*)\\1/, 'ab', 0, 1)\nx(/(a*)(b*)\\1\\2/, 'aaabbaaabb', 0, 10)\nx(/(a*)(b*)\\2/, 'aaabbbb', 0, 7)\nx(/(((((((a*)b))))))c\\7/, 'aaabcaaa', 0, 8)\nx(/(((((((a*)b))))))c\\7/, 'aaabcaaa', 0, 3, 7)\nx(/(a)(b)(c)\\2\\1\\3/, 'abcbac', 0, 6)\nx(/([a-d])\\1/, 'cc', 0, 2)\nx(/(\\w\\d\\s)\\1/, 'f5 f5 ', 0, 6)\nn(/(\\w\\d\\s)\\1/, 'f5 f5')\nx(/(who|[a-c]{3})\\1/, 'whowho', 0, 6)\nx(/...(who|[a-c]{3})\\1/, 'abcwhowho', 0, 9)\nx(/(who|[a-c]{3})\\1/, 'cbccbc', 0, 6)\nx(/(^a)\\1/, 'aa', 0, 2)\nn(/(^a)\\1/, 'baa')\nn(/(a$)\\1/, 'aa')\nn(/(ab\\Z)\\1/, 'ab')\nx(/(a*\\Z)\\1/, 'a', 1, 1)\nx(/.(a*\\Z)\\1/, 'ba', 1, 2)\nx(/(.(abc)\\2)/, 'zabcabc', 0, 7, 1)\nx(/(.(..\\d.)\\2)/, 'z12341234', 0, 9, 1)\nx(/((?i:az))\\1/, 'AzAz', 0, 4)\nn(/((?i:az))\\1/, 'Azaz')\nx(/(?<=a)b/, 'ab', 1, 2)\nn(/(?<=a)b/, 'bb')\nx(/(?<=a|b)b/, 'bb', 1, 2)\nx(/(?<=a|bc)b/, 'bcb', 2, 3)\nx(/(?<=a|bc)b/, 'ab', 1, 2)\nx(/(?<=a|bc||defghij|klmnopq|r)z/, 'rz', 1, 2)\nx(/(a)\\g<1>/, 'aa', 0, 2)\nx(/(?<!a)b/, 'cb', 1, 2)\nn(/(?<!a)b/, 'ab')\nx(/(?<!a|bc)b/, 'bbb', 0, 1)\nn(/(?<!a|bc)z/, 'bcz')\nx(/(?<name1>a)/, 'a', 0, 1)\nx(/(?<name_2>ab)\\g<name_2>/, 'abab', 0, 4)\nx(/(?<name_3>.zv.)\\k<name_3>/, 'azvbazvb', 0, 8)\nx(/(?<=\\g<ab>)|-\\zEND (?<ab>XyZ)/, 'XyZ', 3, 3)\nx(/(?<n>|a\\g<n>)+/, '', 0, 0)\nx(/(?<n>|\\(\\g<n>\\))+$/, '()(())', 0, 6)\nx(/\\g<n>(?<n>.){0}/, 'X', 0, 1, 1)\nx(/\\g<n>(abc|df(?<n>.YZ){2,8}){0}/, 'XYZ', 0, 3)\nx(/\\A(?<n>(a\\g<n>)|)\\z/, 'aaaa', 0, 4)\nx(/(?<n>|\\g<m>\\g<n>)\\z|\\zEND (?<m>a|(b)\\g<m>)/, 'bbbbabba', 0, 8)\nx(/(?<name1240>\\w+\\sx)a+\\k<name1240>/, '  fg xaaaaaaaafg x', 2, 18)\nx(/(z)()()(?<_9>a)\\g<_9>/, 'zaa', 2, 3, 1)\nx(/(.)(((?<_>a)))\\k<_>/, 'zaa', 0, 3)\nx(/((?<name1>\\d)|(?<name2>\\w))(\\k<name1>|\\k<name2>)/, 'ff', 0, 2)\nx(/(?:(?<x>)|(?<x>efg))\\k<x>/, '', 0, 0)\nx(/(?:(?<x>abc)|(?<x>efg))\\k<x>/, 'abcefgefg', 3, 9)\nn(/(?:(?<x>abc)|(?<x>efg))\\k<x>/, 'abcefg')\nx(/(?:(?<n1>.)|(?<n1>..)|(?<n1>...)|(?<n1>....)|(?<n1>.....)|(?<n1>......)|(?<n1>.......)|(?<n1>........)|(?<n1>.........)|(?<n1>..........)|(?<n1>...........)|(?<n1>............)|(?<n1>.............)|(?<n1>..............))\\k<n1>$/, 'a-pyumpyum', 2, 10)\nx(/(?:(?<n1>.)|(?<n1>..)|(?<n1>...)|(?<n1>....)|(?<n1>.....)|(?<n1>......)|(?<n1>.......)|(?<n1>........)|(?<n1>.........)|(?<n1>..........)|(?<n1>...........)|(?<n1>............)|(?<n1>.............)|(?<n1>..............))\\k<n1>$/, 'xxxxabcdefghijklmnabcdefghijklmn', 4, 18, 14)\nx(/(?<name1>)(?<name2>)(?<name3>)(?<name4>)(?<name5>)(?<name6>)(?<name7>)(?<name8>)(?<name9>)(?<name10>)(?<name11>)(?<name12>)(?<name13>)(?<name14>)(?<name15>)(?<name16>aaa)(?<name17>)$/, 'aaa', 0, 3, 16)\nx(/(?<foo>a|\\(\\g<foo>\\))/, 'a', 0, 1)\nx(/(?<foo>a|\\(\\g<foo>\\))/, '((((((a))))))', 0, 13)\nx(/(?<foo>a|\\(\\g<foo>\\))/, '((((((((a))))))))', 0, 17, 1)\nx(/\\g<bar>|\\zEND(?<bar>.*abc$)/, 'abcxxxabc', 0, 9)\nx(/\\g<1>|\\zEND(.a.)/, 'bac', 0, 3)\nx(/\\g<_A>\\g<_A>|\\zEND(.a.)(?<_A>.b.)/, 'xbxyby', 3, 6, 1)\nx(/\\A(?:\\g<pon>|\\g<pan>|\\zEND  (?<pan>a|c\\g<pon>c)(?<pon>b|d\\g<pan>d))$/, 'cdcbcdc', 0, 7)\nx(/\\A(?<n>|a\\g<m>)\\z|\\zEND (?<m>\\g<n>)/, 'aaaa', 0, 4)\nx(/(?<n>(a|b\\g<n>c){3,5})/, 'baaaaca', 1, 5)\nx(/(?<n>(a|b\\g<n>c){3,5})/, 'baaaacaaaaa', 0, 10)\nx(/(?<pare>\\(([^\\(\\)]++|\\g<pare>)*+\\))/, '((a))', 0, 5)\nx(/()*\\1/, '', 0, 0)\nx(/(?:()|())*\\1\\2/, '', 0, 0)\nx(/(?:\\1a|())*/, 'a', 0, 0, 1)\nx(/x((.)*)*x/, '0x1x2x3', 1, 6)\nx(/x((.)*)*x(?i:\\1)\\Z/, '0x1x2x1X2', 1, 9)\nx(/(?:()|()|()|()|()|())*\\2\\5/, '', 0, 0)\nx(/(?:()|()|()|(x)|()|())*\\2b\\5/, 'b', 0, 1)\n\nr(//, '', 0)\nr(/a/, 'a', 0)\nr(/a/, 'a', 0, 1)\nr(/b/, 'abc', 1)\nr(/b/, 'abc', 1, 2)\nr(/./, 'a', 0)\nr(/.*/, 'abcde fgh', 9)\nr(/a*/, 'aaabbc', 6)\nr(/a+/, 'aaabbc', 2)\nr(/a?/, 'bac', 3)\nr(/a??/, 'bac', 3)\nr(/abcde/, 'abcdeavcd', 0)\nr(/\\w\\d\\s/, '  a2 aa $3 ', 2)\nr(/[c-f]aa[x-z]/, '3caaycaaa', 1)\nr(/(?i:fG)g/, 'fGgFggFgG', 3)\nr(/a|b/, 'b', 0)\nr(/ab|bc|cd/, 'bcc', 0)\nr(/(ffy)\\1/, 'ffyffyffy', 3)\nr(/|z/, 'z', 1)\nr(/^az/, 'azaz', 0)\nr(/az$/, 'azaz', 2)\nr(/(((.a)))\\3/, 'zazaaa', 0)\nr(/(ac*?z)\\1/, 'aacczacczacz', 1)\nr(/aaz{3,4}/, 'bbaabbaazzzaazz', 6)\nr(/\\000a/, \"b\\000a\", 1)\nr(/ff\\xfe/, \"fff\\xfe\", 1)\nr(/...abcdefghijklmnopqrstuvwxyz/, 'zzzzzabcdefghijklmnopqrstuvwxyz', 2)\nend\n\ndef test_euc(enc)\n$KCODE = enc\n\nx(/\\xED\\xF2/, \"\\xed\\xf2\", 0, 2)\nx(//, '', 0, 0)\nx(//, '', 0, 2)\nn(//, '')\nx(//, '', 0, 4)\nx(//, '', 0, 6)\nx(//, '', 0, 70)\nx(//, '', 2, 4)\nx(//, '', 2, 6)\nx(/\\xca\\xb8/, \"\\xca\\xb8\", 0, 2)\nx(/./, '', 0, 2)\nx(/../, '', 0, 4)\nx(/(?u)\\w/, '', 0, 2)\nn(/(?u)\\W/, '')\nx(/(?u)[\\W]/, '$', 2, 3)\nx(/\\S/, '', 0, 2)\nx(/\\S/, '', 0, 2)\nx(/\\b/, ' ', 0, 0)\nx(/\\b/, ' ', 1, 1)\nx(/\\B/, ' ', 2, 2)\nx(/\\B/, ' ', 3, 3)\nx(/\\B/, ' ', 0, 0)\nx(/[]/, '', 0, 2)\nn(/[ʤ]/, '')\nx(/[-]/, '', 0, 2)\nn(/[^]/, '')\nx(/(?u)[\\w]/, '', 0, 2)\nn(/[\\d]/, '')\nx(/[\\D]/, '', 0, 2)\nn(/[\\s]/, '')\nx(/[\\S]/, '', 0, 2)\nx(/(?u)[\\w\\d]/, '', 0, 2)\nx(/(?u)[\\w\\d]/, '   ', 3, 5)\n#x(/[\\xa4\\xcf-\\xa4\\xd3]/, \"\\xa4\\xd0\", 0, 2)  # diff spec with GNU regex.\n#n(/[\\xb6\\xe7-\\xb6\\xef]/, \"\\xb6\\xe5\")        # diff spec with GNU regex.\nn(/(?u)\\w/, ' ')\nx(/(?u)\\W/, ' ', 0, 5)\nx(/../, '', 0, 10)\nx(/(?u).\\w\\W../, ' ', 0, 13)\nx(/(?u)\\s\\w/, ' ', 0, 9)\nx(/./, '', 0, 8)\nn(/./, '')\nx(/./, '', 0, 4)\nx(/^/, '', 0, 2)\nx(/^$/, '', 0, 2)\nx(/(?u)^\\w$/, '', 0, 2)\nx(/(?u)^\\w$/, 'z', 0, 11)\nx(/(?u)^\\w...$/, 'z', 0, 13)\nx(/(?u)\\w\\w\\s\\W\\d/, 'a  4', 0, 12)\nx(/\\A/, '', 0, 6)\nx(/\\Z/, '', 0, 6)\nx(/\\z/, '', 0, 6)\nx(/\\Z/, \"\\n\", 0, 6)\nx(/\\Gݤ/, 'ݤ', 0, 4)\nn(/\\G/, '')\nn(/Ȥ\\G/, 'Ȥ')\nn(/ޤ\\A/, 'ޤ')\nn(/\\A/, 'ޤ')\nx(/(?=)/, '', 0, 2)\nn(/(?=)./, '')\nx(/(?!)/, '', 0, 2)\nn(/(?!)/, '')\nx(/(?i:)/, '', 0, 2)\nx(/(?i:֤)/, '֤', 0, 4)\nn(/(?i:)/, '')\nx(/(?m:.)/, \"\\n\", 0, 3)\nx(/(?m:.)/, \"\\n\", 2, 5)\nx(/?/, '', 0, 0)\nx(/?/, '', 0, 0)\nx(/?/, '', 0, 2)\nx(/*/, '', 0, 0)\nx(/*/, '', 0, 2)\nx(/*/, 'һһ', 0, 6)\nx(/*/, '', 0, 0)\nn(/+/, '')\nx(/+/, '', 0, 2)\nx(/+/, '', 0, 8)\nx(/+/, '', 0, 4)\nx(/+/, '', 2, 10)\nx(/.?/, '', 0, 2)\nx(/.*/, 'ѤԤפ', 0, 8)\nx(/.+/, '', 0, 2)\nx(/.+/, \"\\n\", 0, 8)\nx(/|/, '', 0, 2)\nx(/|/, '', 0, 2)\nx(/|/, '', 0, 4)\nx(/|/, '', 0, 4)\nx(/(?:|)/, '򤫤', 0, 6)\nx(/(?:|)/, '򤭤', 0, 8)\nx(/|(?:|)/, '', 0, 4)\nx(/||/, '', 2, 4)\nx(/|||||||||ĤƤȤʤ|̤/, '', 0, 6)\nn(/|||||||||ĤƤȤʤ|̤/, '')\nx(/|^/, '֤', 2, 4)\nx(/|^/, '', 0, 2)\nx(/|\\G/, 'ֵ', 4, 6)\nx(/|\\G/, 'ֵ', 0, 2)\nx(/|\\A/, 'bֵ', 3, 5)\nx(/|\\A/, '', 0, 2)\nx(/|\\Z/, 'ֵ', 2, 4)\nx(/|\\Z/, '', 0, 2)\nx(/|\\Z/, \"\\n\", 0, 2)\nx(/|\\z/, 'ֵ', 2, 4)\nx(/|\\z/, '', 0, 2)\nx(/(?u)\\w|\\s/, '', 0, 2)\nx(/(?u)\\w|%/, '%', 0, 1)\nx(/(?u)\\w|[&$]/, '&', 0, 2)\nx(/[-]/, '', 0, 2)\nx(/[-]|[^-]/, '', 0, 2)\nx(/[-]|[^-]/, '', 0, 2)\nx(/[^]/, \"\\n\", 0, 1)\nx(/(?:|[-])|/, '', 0, 2)\nx(/(?:|[-])|/, '', 0, 4)\nx(/|(?=)../, '', 0, 6)\nx(/|(?!)../, '', 0, 6)\nx(/(?=)..|(?=)../, '', 0, 6)\nx(/(?<=|)/, '', 4, 6)\nn(/(?>|)/, '')\nx(/(?>|)/, '', 0, 8)\nx(/?|/, '', 0, 2)\nx(/?|/, '', 0, 0)\nx(/?|/, '', 0, 0)\nx(/*|/, '', 0, 4)\nx(/*|*/, '', 0, 0)\nx(/*|*/, '', 0, 2)\nx(/[a]*|*/, 'a', 0, 3)\nx(/+|*/, '', 0, 0)\nx(/+|*/, '', 0, 6)\nx(/+|*/, '', 0, 2)\nx(/+|*/, 'a', 0, 0)\nn(/+|+/, '')\nx(/(|)?/, '', 0, 2)\nx(/(|)*/, '', 0, 4)\nx(/(|)+/, '', 0, 6)\nx(/(|)+/, '', 0, 8)\nx(/(|)+/, '', 4, 12)\nx(/(|)+/, '', 2, 10)\nx(/(|)+/, '򤦤', 0, 4)\nx(/(|)+/, '$$zzzz򤦤', 6, 10)\nx(/(|)+/, '', 0, 10)\nx(/(|)+/, '', 2, 4)\nx(/(|)+/, '', 2, 8)\nx(/(?:|)(?:|)/, '', 0, 4)\nx(/(?:*|*)(?:*|*)/, '', 0, 6)\nx(/(?:*|*)(?:+|+)/, '', 0, 12)\nx(/(?:+|+){2}/, '', 0, 12)\nx(/(?:+|+){1,2}/, '', 0, 12)\nx(/(?:+|\\A*)/, '', 0, 4)\nn(/(?:+|\\A*)/, '')\nx(/(?:^+|+)*/, '', 12, 16)\nx(/(?:^+|+)*/, '', 0, 14)\nx(/{0,}/, '', 0, 8)\nx(/|(?i)c/, 'C', 0, 1)\nx(/(?i)c|/, 'C', 0, 1)\nx(/(?i:)|a/, 'a', 0, 1)\nn(/(?i:)|a/, 'A')\nx(/[]?/, '', 0, 2)\nx(/[]*/, '', 0, 6)\nx(/[^]*/, '', 0, 0)\nn(/[^]+/, '')\nx(/??/, '', 0, 0)\nx(/??/, '', 0, 6)\nx(/*?/, '', 0, 0)\nx(/*?/, '', 0, 2)\nx(/*?/, '', 0, 8)\nx(/+?/, '', 0, 2)\nx(/+?/, '', 0, 4)\nx(/+?/, '', 0, 8)\nx(/(?:ŷ?)??/, 'ŷ', 0, 0)\nx(/(?:ŷ??)?/, 'ŷ', 0, 0)\nx(/(?:̴?)+?/, '̴̴̴', 0, 2)\nx(/(?:+)??/, '', 0, 0)\nx(/(?:+)??/, '', 0, 8)\ni(/(?:)?{2}/, '', 0, 0)   # GNU regex bug\nx(/(?:)?{2}/, 'ֵֵ', 0, 8)\nx(/(?:)*{0}/, 'ֵֵ', 0, 0)\nx(/(?:){3,}/, 'ֵֵֵ', 0, 16)\nn(/(?:){3,}/, 'ֵ')\nx(/(?:){2,4}/, 'ֵֵ', 0, 12)\nx(/(?:){2,4}/, 'ֵֵֵֵ', 0, 16)\nx(/(?:){2,4}?/, 'ֵֵֵֵ', 0, 8)\nx(/(?:){,}/, '{,}', 0, 7)\nx(/(?:)+?{2}/, '', 0, 12)\nx(/()/, '', 0, 2, 1)\nx(/(п)/, 'п', 0, 4, 1)\nx(/(())/, '', 0, 4)\nx(/(())/, '', 0, 4, 1)\nx(/(())/, '', 0, 4, 2)\nx(/((((((((((((((((((((̻))))))))))))))))))))/, '̻', 0, 4, 20)\nx(/()()/, '', 0, 4, 1)\nx(/()()/, '', 4, 8, 2)\nx(/()()()/, '', 6, 12, 3)\nx(/(()()())/, '', 6, 12, 4)\nx(/.*(ե)󡦥(()奿)/, 'ե󡦥ޥ󥷥奿', 10, 18, 2)\nx(/(^)/, '', 0, 2)\nx(/()|()/, '', 2, 4, 1)\nx(/(^)|()/, '', 2, 4, 2)\nx(/(?)/, '', 0, 2, 1)\nx(/(*)/, 'ޤޤ', 0, 6, 1)\nx(/(*)/, '', 0, 0, 1)\nx(/(+)/, '', 0, 14, 1)\nx(/(+|*)/, 'դդդؤ', 0, 6, 1)\nx(/(+|?)/, '', 0, 2, 1)\nx(/()?/, '', 0, 6, 1)\nx(/()*/, '', 0, 6, 1)\nx(/()+/, '', 0, 6, 1)\nx(/(|)+/, '', 0, 6, 1)\nx(/([ʤˤ][]|)+/, '', 0, 6, 1)\nx(/((?i:))/, '', 0, 6, 1)\nx(/((?m:.))/, \"\\n\", 0, 5, 1)\nx(/((?=))/, '', 0, 2, 1)\nx(/|(.)/, '󤢤', 0, 8, 1)\nx(/*(.)/, '', 8, 10, 1)\nx(/*?(.)/, '', 0, 2, 1)\nx(/*?()/, '', 8, 10, 1)\nx(/[]*(.)/, '', 10, 12, 1)\nx(/(\\A)/, '', 0, 4, 1)\nn(/(\\A)/, '󤤤')\nx(/(^)/, '', 0, 4, 1)\nn(/(^)/, '󤤤')\nx(/($)/, '', 4, 8, 1)\nn(/($)/, '')\nx(/(̵)\\1/, '̵̵', 0, 4)\nn(/(̵)\\1/, '̵')\nx(/(?)\\1/, '', 0, 4)\nx(/(??)\\1/, '', 0, 0)\nx(/(*)\\1/, '', 0, 8)\nx(/(*)\\1/, '', 0, 4, 1)\nx(/(*)\\1/, '', 0, 10)\nx(/(*)\\1/, '', 0, 2)\nx(/(*)(*)\\1\\2/, '', 0, 20)\nx(/(*)(*)\\2/, '', 0, 14)\nx(/(*)(*)\\2/, '', 6, 10, 2)\nx(/(((((((*)))))))\\7/, 'ݤݤݤڤԤݤݤ', 0, 16)\nx(/(((((((*)))))))\\7/, 'ݤݤݤڤԤݤݤ', 0, 6, 7)\nx(/()()()\\2\\1\\3/, 'ϤҤդҤϤ', 0, 12)\nx(/([-])\\1/, '', 0, 4)\nx(/(?u)(\\w\\d\\s)\\1/, '5 5 ', 0, 8)\nn(/(?u)(\\w\\d\\s)\\1/, '5 5')\nx(/(ï|[-]{3})\\1/, 'ïï', 0, 8)\nx(/...(ï|[-]{3})\\1/, 'aïï', 0, 13)\nx(/(ï|[-]{3})\\1/, '', 0, 12)\nx(/(^)\\1/, '', 0, 4)\nn(/(^)\\1/, '')\nn(/($)\\1/, '')\nn(/(\\Z)\\1/, '')\nx(/(*\\Z)\\1/, '', 2, 2)\nx(/.(*\\Z)\\1/, '', 2, 4)\nx(/(.(䤤)\\2)/, 'z䤤䤤', 0, 13, 1)\nx(/(.(..\\d.)\\2)/, '12341234', 0, 10, 1)\nx(/((?i:v))\\1/, 'vv', 0, 10)\nx(/(?<>|\\(\\g<>\\))/, '(((((())))))', 0, 14)\nx(/\\A(?:\\g<_1>|\\g<_2>|\\zλ  (?<_1>|\\g<_2>)(?<_2>|\\g<_1>))$/, '߼', 0, 26)\nx(/[[Ҥ]]/, '', 0, 2)\nx(/[[]]/, '', 0, 2)\nn(/[[^]]/, '')\nn(/[^[]]/, '')\nx(/[^[^]]/, '', 0, 2)\nx(/[[]&&]/, '', 0, 2)\nn(/[[]&&]/, '')\nn(/[[]&&]/, '')\nx(/[-&&-&&-]/, '', 0, 2)\nn(/[^-&&-&&-]/, '')\nx(/[[^&&]&&-]/, '', 0, 2)\nn(/[[^&&]&&-]/, '')\nx(/[[^-&&]&&[^-]]/, '', 0, 2)\nn(/[[^-&&]&&[^-]]/, '')\nx(/[^[^]&&[^]]/, '', 0, 2)\nx(/[^[^]&&[^]]/, '', 0, 2)\nn(/[^[^]&&[^]]/, '')\nx(/[-&&-]/, '-', 0, 1)\nx(/[^[^a-z]&&[^bcdefg]q-w]/, '', 0, 2)\nx(/[^[^a-z]&&[^bcdefg]g-w]/, 'f', 0, 1)\nx(/[^[^a-z]&&[^bcdefg]g-w]/, 'g', 0, 1)\nn(/[^[^a-z]&&[^bcdefg]g-w]/, '2')\nx(/a<b>СΥ<\\/b>/, 'a<b>СΥ</b>', 0, 32)\nx(/.<b>СΥ<\\/b>/, 'a<b>СΥ</b>', 0, 32)\n\nr(//, '', 0)\nr(//, '', 0, 2)\nr(//, '', 2)\nr(//, '', 2, 4)\nr(/./, '', 0)\nr(/.*/, ' ', 17)\nr(/.*/, ' ', 6)\nr(/*/, '', 12)\nr(/+/, '', 4)\nr(/?/, '', 6)\nr(/??/, '', 6)\nr(/ace/, 'aceavcd', 0)\nr(/(?u)\\w\\d\\s/, '  2  $3 ', 2)\nr(/[-][-]/, '3ʤ', 1)\nr(/|/, '', 0)\nr(/||/, '', 0)\nr(/(ȤȤ)\\1/, 'ȤȤȤȤȤȤ', 6)\nr(/|/, '', 2)\nr(/^/, '', 0)\nr(/$/, '', 4)\nr(/(((.)))\\3/, 'zz', 0)\nr(/(*?)\\1/, '󤢤󤢤', 2)\nr(/{3,4}/, 'ƤƤ󤢤󤢤', 12)\nr(/\\000/, \"\\000\", 2)\nr(/Ȥ\\xfe\\xfe/, \"ȤȤ\\xfe\\xfe\", 2)\nr(/.../, 'zzzzz', 2)\nend\n\ntest_sb('ASCII')\ntest_sb('EUC')\ntest_sb('SJIS')\ntest_sb('UTF-8')\ntest_euc('EUC')\n\n\n# UTF-8   (by UENO Katsuhiro)\n$KCODE = 'UTF-8'\n\nx(/\\w/u, \"\\xc3\\x81\", 0, 2)\nn(/\\W/u, \"\\xc3\\x81\")\nx(/[\\w]/u, \"\\xc3\\x81\", 0, 2)\nx(/./u, \"\\xfe\", 0, 1)\nx(/\\xfe/u, \"\\xfe\", 0, 1)\nx(/\\S*/u, \"\\xfe\", 0, 1)\nx(/\\s*/u, \"\\xfe\", 0, 0)\nn(/\\w+/u, \"\\xfe\")\nx(/\\W+/u, \"\\xfe\\xff\", 0, 2)\nx(/[\\xfe]/u, \"aaa\\xfe\", 3, 4)\nx(/[\\xff\\xfe]/u, \"\\xff\\xfe\", 0, 1)\nx(/[a-c\\xff\\xfe]+/u, \"\\xffabc\\xfe\", 0, 5)\n\ns = \"\\xe3\\x81\\x82\\xe3\\x81\\x81\\xf0\\x90\\x80\\x85\\xe3\\x81\\x8a\\xe3\\x81\\x85\"\nx(/[\\xc2\\x80-\\xed\\x9f\\xbf]+/u, s, 0, 6)\n\ns = \"\\xf0\\x90\\x80\\x85\\xe3\\x81\\x82\"\nx(/[\\xc2\\x80-\\xed\\x9f\\xbf]/u, s, 4, 7)\n\ns = \"\\xed\\x9f\\xbf\"\nn(/[\\xc2\\x80-\\xed\\x9f\\xbe]/u, s)\n\ns = \"\\xed\\x9f\\xbf\"\nn(/[\\xc2\\x80-\\xed\\x9f\\xbe]/u, s)\n\ns = \"\\xed\\x9f\\xbf\"\nn(/[\\xc2\\x80-\\xed\\x9f\\xbe]/u, s)\n\ns = \"\\xed\\x9f\\xbf\"\nn(/[\\xc3\\xad\\xed\\x9f\\xbe]/u, s)\n\ns = \"\\xed\\x9f\\xbf\"\nn(/[\\xc4\\x80-\\xed\\x9f\\xbe]/u, s)\n\ns = \"\\xed\\x9f\\xbf\\xf0\\x90\\x80\\x85\\xed\\x9f\\xbf\"\nx(/[^\\xc2\\x80-\\xed\\x9f\\xbe]/u, s, 0, 3)\n\ns = \"\\xed\\x9f\\xbf\"\nx(/[^\\xc3\\xad\\xed\\x9f\\xbe]/u, s, 0, 3)\n\ns = \"\\xed\\x9f\\xbf\\xf0\\x90\\x80\\x85\\xed\\x9f\\xbf\"\nx(/[^\\xc4\\x80-\\xed\\x9f\\xbe]/u, s, 0, 3)\n\ns = \"\\xc3\\xbe\\xc3\\xbf\"\nn(/[\\xfe\\xff\\xc3\\x80]/u, s)\n\ns = \"\\xc3\\xbe\"\nx(/[\\xc2\\xa0-\\xc3\\xbe]/u, s, 0, 2)\n\ns = \"sssss\"\nx(/s+/iu, s, 0, 5)\n\ns = \"SSSSS\"\nx(/s+/iu, s, 0, 5)\n\nreg = Regexp.new(\"\\\\x{fb40}\", nil, 'u')\nx(reg, \"\\357\\255\\200\", 0, 3)\nx(/\\A\\w\\z/u, \"\\357\\255\\200\", 0, 3)\nx(/\\A\\W\\z/u, \"\\357\\255\\202\", 0, 3)\nn(/\\A\\w\\z/u, \"\\357\\255\\202\")\n\nx(/\\303\\200/iu, \"\\303\\240\", 0, 2)\nx(/\\303\\247/iu, \"\\303\\207\", 0, 2)\n\n\n\n# Japanese long text.\n$KCODE = 'EUC'\n\ns = <<EOS\nܤˤƤϡ췳ˤĤƤĴ˴ŤȽĬ\nȤлȬǯʼƤǯϪνäǯǤ뤳ȤäƷڹ\n췳ε켰֤ĥɾޤȤäƤ롣\nͭ̾ԤȤƤϡΡϺ󤲤뤳ȤǤ\n\nʼƬȬ ͭơ ë饦 (1998)\nEOS\n\nx(/\\((.+)\\)/, s, 305, 309, 1)\nx(/Ϻ/, s, 229, 239)\nx(/$/, s, 202, 204)\nx(/(^ʼƬ..Ȭ)/, s, 269, 279, 1)\nx(/^$/, s, 268, 268)\n\n\ns = <<EOS\nʤ޻ϰʸǤ\n⤷ȤФ򤷤뤹ΤʸǤȤȡϤȤФ򤷤뤹ΤǤϤʤ\nܤbookϤȤФǤ뤬ۥhonϲʤ٤ǡʬñ\nĤΤǤϤʤ\nñȤƤη֤⤿ʤǤ롣\nַˤפ򥢥ϴФŪʰ̣Ѥ\nΤʤΤϸǤϤꤨʤΤǤ롣\n\n ִɴá\nEOS\n\nn(/\\((.+)\\)/, s)\nx(/(.*)/, s, 254, 264, 1)\nx(/$/, s, 34, 36)\nx(/(book)/, s, 120, 124, 1)\nx(/^$/, s, 360, 360)\n\n\ns = <<EOS\nबûˤäƤȤСΤӤ̩Ѥ̤ȡ\nμι⤵ˤɤˤʤ\nγмԤŪʶäĤΤϡưΩäȤ\nݡ ϡɥͤξǯǤϤʤ\n\nϺ ֱûѤŸưˤդĤġ ҥ(1986)\nEOS\n\nx(/\\((.+)\\)/, s, 290, 296)\nx(/(.*)(.+)/, s, 257, 275, 2)\nx(/^ݡ /, s, 179, 184)\nx(/()/, s, 0, 4, 1)\nx(/\\w/, s, 30, 34)\n\n\ns = <<EOS\nȤäơϡⷯ⡢䷯⡢Ƥ⤦ͤοʪ⡢̤ˤʤȤ򡢤輷ǡ¤ʪäƤ롣\n黰ͤξϰԤФƤʤΤ\n񤯤ҤޤʤäΤǤ\nֶáפʤȬФĤŤƤ椯ǤȤˤĤƤϡϤ֤ߤʤۤɤγοäƤ롣λˤϡ̳ǽϤʪΤ褦ʿʪͤ⤤롣\nפȡȤɤ©νФ褦ʤ⤤ΤǤ롣\n\nϺ ֤ʻƤޤ  輷 (1961)\nEOS\n\nx(/\\((\\d+)\\)/, s, 496, 502)\nx(/(.+.*)/, s, 449, 479, 1)\nx(/(.)/, s, 96, 98, 1)\nx(/$/, s, 120, 122)\nx(//, s, 209, 217)\n\n\ns = <<EOS\n󽽸ܤ̤ۤβйΩƤ˿Ť꤬äΤϡĤäƤͽϲ䲰ΤòʼҤͤä\nϲȤäƤ⡢;󲰤ǼѱȡͻήΤȤƱʪǤϤʤä\n⤽⤬ʪȤƹͤ줿ϡ͢ޤ˶ʬϤܸꤷΤǤäˤʤʤǡ;ǼΤϡƤưϤˤѤ߾夲ʬȴƿ˻Ωƾ夲Τä\n\n° ֻĻ (2000)\nEOS\n\nx(/\\((\\d+)\\)/, s, 506, 512)\nx(/(.*)/, s, 493, 505, 1)\nx(//, s, 292, 298)\n\n\ns = <<EOS\nܿͤФѤä٤΢ˤϡĤϡ\nӤबƯƤ\nϡ郎ּʼ˸뤫ɤפǤä\n\nʼƬȬ ͭơ ë饦 (1998)\nEOS\n\nx(/\\((\\d+)\\)/, s, 185, 191)\nx(/(.*)/, s, 108, 138, 1)\nx(/^/, s, 90, 96)\nx(/^.*$/, s, 0, 58)\n\ns = <<EOS\n  ɣϿͤ⿩Ϥλˤ⤷ޤϤˤɣ쾣Ʀ򤿤ƤޤΤ˰Ϥ٤ʹ֤ϾΤΤ򤿤٤Ǥޤ\n  ʹ֤ϥإӤ򤿤٤ڤǤơǤϤˤꡢڤ򤳤ޤڤꡢڤɣƤޤƤƤ٤äΤƤɣȾ餤ǤäǯˤʤȡɣĤΤؤäơɣƤλʬΰ줯餤ˤʤäإӤˤϱ򾯤줿Ǥ\n\nܾ ˺줿ܿ͡ (1960)\nEOS\n\nx(/(ɣƤλʬΰ줯餤)/, s, 357, 381, 1)\nx(/ޤ$/, s, 140, 150)\nx(/  ʹ(.*)/, s, 157, 423, 1)\nx(/إ[Ϥ]/, s, 165, 175)\n\ns = <<EOS\nȤϤȤ ¢դ˵̤Ȥ α֤ޤº\n\nľ αϿ (1859)\nEOS\n\nx(/\\((.+)\\)/, s, 68, 74)\nx(/(.*)/, s, 59, 65, 1)\nx(/^(ľ)/, s, 48, 56, 1)\n\ns = <<EOS\nդޤǤʤǽ˴ڤԢ첻ɽͤˤƤ⡢\nŤ˲ȤƤΤªؤƤ𤿤ΤǤꡢĤʸŤ\nɽ벻ʸȤ򤵤Ƥ𤿤櫓Ǥϰɤ\nȤ̣뤫ȤդȡʸˤĤɽ줿ޤۣ桢\n԰ΤΤǤꤨʤȤդȤ̣ޤˤƤ⡢\nԢ첻ʸʡڤԤδطϾΤ餺Ȥ\nʸϻ䤿԰ʲɽΤ˺ǤդϤ԰ʸ\nǤꡢŪʤŤҤϤԢ첻˺ǤŬ礷ɽˡ\nȸؤޤĤޤꡢŪʤŤҤɽŪǤʤȤʿ\n餹ޤؤˡ͡ϤޤŤʸɽṲ̆Ȥʿդ٤\nꡢĤơԢ첻ΤΤɽݤƤ뤳Ȥܤ\n٤Ǥޤ\n\nʡ¸ ֻԢ춵\nEOS\n\nx(/Ԣ춵/, s, 800, 808)\nx(/𤿤櫓Ǥ/, s, 176, 188)\n\ns = <<EOS\nȥ󥹥ܳˤĤơˤ줿\nǤ롣ˡƻˡͿ줿Ϥ¤ꡢ\nᤫ龡ԲǽäƤ롣\n뤤ϥ˥饤Ф븷ޤĤäΤ\nʤ\nʹߡܳˤĤƤɾϡ\nּˤȯ®١סֲסŰƻѡפʤɤˡ԰򵢤\n褦ˤʤä\n\n̵ϯ ֺ֡ξαפǤʬʤܳ ڽ˼ (2005)\nEOS\n\nx(/\\A(.*)ܳˤĤ/, s, 0, 22, 1)\nx(/(.*?)[^]*(.+?)[^]*(?:.*?)/, s, 290, 332)\nx(/{1,2}(?=)/, s, 28, 32)\n\n# result\nprintf(\"\\n*** SUCCESS: %d,  FAIL: %d    Ruby %s (%s) [%s] ***\\n\",\n       $rok, $rfail, RUBY_VERSION, RUBY_RELEASE_DATE, RUBY_PLATFORM)\n\n# END.\n"
  },
  {
    "path": "src/Onigmo/testc.c",
    "content": "/*\n * This program was generated by testconv.rb.\n */\n#include \"config.h\"\n#ifdef ONIG_ESCAPE_UCHAR_COLLISION\n#undef ONIG_ESCAPE_UCHAR_COLLISION\n#endif\n#include <stdio.h>\n\n#ifdef POSIX_TEST\n#include \"onigposix.h\"\n#else\n#include \"oniguruma.h\"\n#endif\n\n#ifdef HAVE_STRING_H\n# include <string.h>\n#else\n# include <strings.h>\n#endif\n\n#define SLEN(s)  strlen(s)\n\nstatic int nsucc  = 0;\nstatic int nfail  = 0;\nstatic int nerror = 0;\n\nstatic FILE* err_file;\n\n#ifndef POSIX_TEST\nstatic OnigRegion* region;\n#endif\n\nstatic void xx(char* pattern, char* str, int from, int to, int mem, int not)\n{\n  OnigPosition r;\n\n#ifdef POSIX_TEST\n  regex_t reg;\n  char buf[200];\n  regmatch_t pmatch[25];\n\n  r = regcomp(&reg, pattern, REG_EXTENDED | REG_NEWLINE);\n  if (r) {\n    regerror(r, &reg, buf, sizeof(buf));\n    fprintf(err_file, \"ERROR: %s\\n\", buf);\n    nerror++;\n    return ;\n  }\n\n  r = regexec(&reg, str, reg.re_nsub + 1, pmatch, 0);\n  if (r != 0 && r != REG_NOMATCH) {\n    regerror(r, &reg, buf, sizeof(buf));\n    fprintf(err_file, \"ERROR: %s\\n\", buf);\n    nerror++;\n    return ;\n  }\n\n  if (r == REG_NOMATCH) {\n    if (not) {\n      fprintf(stdout, \"OK(N): /%s/ '%s'\\n\", pattern, str);\n      nsucc++;\n    }\n    else {\n      fprintf(stdout, \"FAIL: /%s/ '%s'\\n\", pattern, str);\n      nfail++;\n    }\n  }\n  else {\n    if (not) {\n      fprintf(stdout, \"FAIL(N): /%s/ '%s'\\n\", pattern, str);\n      nfail++;\n    }\n    else {\n      if (pmatch[mem].rm_so == from && pmatch[mem].rm_eo == to) {\n        fprintf(stdout, \"OK: /%s/ '%s'\\n\", pattern, str);\n        nsucc++;\n      }\n      else {\n        fprintf(stdout, \"FAIL: /%s/ '%s' %d-%d : %d-%d\\n\", pattern, str,\n\t        from, to, pmatch[mem].rm_so, pmatch[mem].rm_eo);\n        nfail++;\n      }\n    }\n  }\n  regfree(&reg);\n\n#else\n  regex_t* reg;\n  OnigErrorInfo einfo;\n  OnigSyntaxType syn = *ONIG_SYNTAX_DEFAULT;\n  OnigIterator it = {onig_default_charat, str};\n\n  /* ONIG_OPTION_OFF(syn.options, ONIG_OPTION_ASCII_RANGE); */\n\n  r = onig_new(&reg, (UChar* )pattern, (UChar* )(pattern + SLEN(pattern)),\n\t       ONIG_OPTION_DEFAULT, ONIG_ENCODING_EUC_JP, &syn, &einfo);\n  if (r) {\n    char s[ONIG_MAX_ERROR_MESSAGE_LEN];\n    onig_error_code_to_str((UChar* )s, r, &einfo);\n    fprintf(err_file, \"ERROR: %s\\n\", s);\n    nerror++;\n    return ;\n  }\n\n  r = onig_search(&it, reg, 0, SLEN(str),\n\t\t  0, SLEN(str),\n\t\t  region, ONIG_OPTION_NONE);\n  if (r < ONIG_MISMATCH) {\n    char s[ONIG_MAX_ERROR_MESSAGE_LEN];\n    onig_error_code_to_str((UChar* )s, r);\n    fprintf(err_file, \"ERROR: %s\\n\", s);\n    nerror++;\n    return ;\n  }\n\n  if (r == ONIG_MISMATCH) {\n    if (not) {\n      fprintf(stdout, \"OK(N): /%s/ '%s'\\n\", pattern, str);\n      nsucc++;\n    }\n    else {\n      fprintf(stdout, \"FAIL: /%s/ '%s'\\n\", pattern, str);\n      nfail++;\n    }\n  }\n  else {\n    if (not) {\n      fprintf(stdout, \"FAIL(N): /%s/ '%s'\\n\", pattern, str);\n      nfail++;\n    }\n    else {\n      if (region->beg[mem] == from && region->end[mem] == to) {\n        fprintf(stdout, \"OK: /%s/ '%s'\\n\", pattern, str);\n        nsucc++;\n      }\n      else {\n        fprintf(stdout, \"FAIL: /%s/ '%s' %d-%d : %d-%d\\n\", pattern, str,\n\t        from, to, region->beg[mem], region->end[mem]);\n        nfail++;\n      }\n    }\n  }\n  onig_free(reg);\n#endif\n}\n\nstatic void x2(char* pattern, char* str, int from, int to)\n{\n  xx(pattern, str, from, to, 0, 0);\n}\n\nstatic void x3(char* pattern, char* str, int from, int to, int mem)\n{\n  xx(pattern, str, from, to, mem, 0);\n}\n\nstatic void n(char* pattern, char* str)\n{\n  xx(pattern, str, 0, 0, 0, 1);\n}\n\nextern int main(int argc, char* argv[])\n{\n  err_file = stdout;\n\n#ifdef POSIX_TEST\n  reg_set_encoding(REG_POSIX_ENCODING_EUC_JP);\n#else\n  region = onig_region_new();\n#endif\n\n  x2(\"\", \"\", 0, 0);\n  x2(\"^\", \"\", 0, 0);\n  x2(\"$\", \"\", 0, 0);\n  x2(\"\\\\G\", \"\", 0, 0);\n  x2(\"\\\\A\", \"\", 0, 0);\n  x2(\"\\\\Z\", \"\", 0, 0);\n  x2(\"\\\\z\", \"\", 0, 0);\n  x2(\"^$\", \"\", 0, 0);\n  x2(\"\\\\ca\", \"\\001\", 0, 1);\n  x2(\"\\\\C-b\", \"\\002\", 0, 1);\n  x2(\"\\\\c\\\\\\\\\", \"\\034\", 0, 1);\n  x2(\"q[\\\\c\\\\\\\\]\", \"q\\034\", 0, 2);\n  x2(\"\", \"a\", 0, 0);\n  x2(\"a\", \"a\", 0, 1);\n  x2(\"\\\\x61\", \"a\", 0, 1);\n  x2(\"aa\", \"aa\", 0, 2);\n  x2(\"aaa\", \"aaa\", 0, 3);\n  x2(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\", \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\", 0, 35);\n  x2(\"ab\", \"ab\", 0, 2);\n  x2(\"b\", \"ab\", 1, 2);\n  x2(\"bc\", \"abc\", 1, 3);\n  x2(\"(?i:#RET#)\", \"#INS##RET#\", 5, 10);\n  x2(\"\\\\17\", \"\\017\", 0, 1);\n  x2(\"\\\\x1f\", \"\\x1f\", 0, 1);\n  x2(\"a(?#....\\\\\\\\JJJJ)b\", \"ab\", 0, 2);\n  x2(\"(?x)  G (o O(?-x)oO) g L\", \"GoOoOgLe\", 0, 7);\n  x2(\".\", \"a\", 0, 1);\n  n(\".\", \"\");\n  x2(\"..\", \"ab\", 0, 2);\n  x2(\"\\\\w\", \"e\", 0, 1);\n  n(\"\\\\W\", \"e\");\n  x2(\"\\\\s\", \" \", 0, 1);\n  x2(\"\\\\S\", \"b\", 0, 1);\n  x2(\"\\\\d\", \"4\", 0, 1);\n  n(\"\\\\D\", \"4\");\n  x2(\"\\\\b\", \"z \", 0, 0);\n  x2(\"\\\\b\", \" z\", 1, 1);\n  x2(\"\\\\B\", \"zz \", 1, 1);\n  x2(\"\\\\B\", \"z \", 2, 2);\n  x2(\"\\\\B\", \" z\", 0, 0);\n  x2(\"[ab]\", \"b\", 0, 1);\n  n(\"[ab]\", \"c\");\n  x2(\"[a-z]\", \"t\", 0, 1);\n  n(\"[^a]\", \"a\");\n  x2(\"[^a]\", \"\\n\", 0, 1);\n  x2(\"[]]\", \"]\", 0, 1);\n  n(\"[^]]\", \"]\");\n  x2(\"[\\\\^]+\", \"0^^1\", 1, 3);\n  x2(\"[b-]\", \"b\", 0, 1);\n  x2(\"[b-]\", \"-\", 0, 1);\n  x2(\"[\\\\w]\", \"z\", 0, 1);\n  n(\"[\\\\w]\", \" \");\n  x2(\"[\\\\W]\", \"b$\", 1, 2);\n  x2(\"[\\\\d]\", \"5\", 0, 1);\n  n(\"[\\\\d]\", \"e\");\n  x2(\"[\\\\D]\", \"t\", 0, 1);\n  n(\"[\\\\D]\", \"3\");\n  x2(\"[\\\\s]\", \" \", 0, 1);\n  n(\"[\\\\s]\", \"a\");\n  x2(\"[\\\\S]\", \"b\", 0, 1);\n  n(\"[\\\\S]\", \" \");\n  x2(\"[\\\\w\\\\d]\", \"2\", 0, 1);\n  n(\"[\\\\w\\\\d]\", \" \");\n  x2(\"[[:upper:]]\", \"B\", 0, 1);\n  x2(\"[*[:xdigit:]+]\", \"+\", 0, 1);\n  x2(\"[*[:xdigit:]+]\", \"GHIKK-9+*\", 6, 7);\n  x2(\"[*[:xdigit:]+]\", \"-@^+\", 3, 4);\n  n(\"[[:upper]]\", \"A\");\n  x2(\"[[:upper]]\", \":\", 0, 1);\n  x2(\"[\\\\044-\\\\047]\", \"\\046\", 0, 1);\n  x2(\"[\\\\x5a-\\\\x5c]\", \"\\x5b\", 0, 1);\n  x2(\"[\\\\x6A-\\\\x6D]\", \"\\x6c\", 0, 1);\n  n(\"[\\\\x6A-\\\\x6D]\", \"\\x6E\");\n  n(\"^[0-9A-F]+ 0+ UNDEF \", \"75F 00000000 SECT14A notype ()    External    | _rb_apply\");\n  x2(\"[\\\\[]\", \"[\", 0, 1);\n  x2(\"[\\\\]]\", \"]\", 0, 1);\n  x2(\"[&]\", \"&\", 0, 1);\n  x2(\"[[ab]]\", \"b\", 0, 1);\n  x2(\"[[ab]c]\", \"c\", 0, 1);\n  n(\"[[^a]]\", \"a\");\n  n(\"[^[a]]\", \"a\");\n  x2(\"[[ab]&&bc]\", \"b\", 0, 1);\n  n(\"[[ab]&&bc]\", \"a\");\n  n(\"[[ab]&&bc]\", \"c\");\n  x2(\"[a-z&&b-y&&c-x]\", \"w\", 0, 1);\n  n(\"[^a-z&&b-y&&c-x]\", \"w\");\n  x2(\"[[^a&&a]&&a-z]\", \"b\", 0, 1);\n  n(\"[[^a&&a]&&a-z]\", \"a\");\n  x2(\"[[^a-z&&bcdef]&&[^c-g]]\", \"h\", 0, 1);\n  n(\"[[^a-z&&bcdef]&&[^c-g]]\", \"c\");\n  x2(\"[^[^abc]&&[^cde]]\", \"c\", 0, 1);\n  x2(\"[^[^abc]&&[^cde]]\", \"e\", 0, 1);\n  n(\"[^[^abc]&&[^cde]]\", \"f\");\n  x2(\"[a-&&-a]\", \"-\", 0, 1);\n  n(\"[a\\\\-&&\\\\-a]\", \"&\");\n  n(\"\\\\wabc\", \" abc\");\n  x2(\"a\\\\Wbc\", \"a bc\", 0, 4);\n  x2(\"a.b.c\", \"aabbc\", 0, 5);\n  x2(\".\\\\wb\\\\W..c\", \"abb bcc\", 0, 7);\n  x2(\"\\\\s\\\\wzzz\", \" zzzz\", 0, 5);\n  x2(\"aa.b\", \"aabb\", 0, 4);\n  n(\".a\", \"ab\");\n  x2(\".a\", \"aa\", 0, 2);\n  x2(\"^a\", \"a\", 0, 1);\n  x2(\"^a$\", \"a\", 0, 1);\n  x2(\"^\\\\w$\", \"a\", 0, 1);\n  n(\"^\\\\w$\", \" \");\n  x2(\"^\\\\wab$\", \"zab\", 0, 3);\n  x2(\"^\\\\wabcdef$\", \"zabcdef\", 0, 7);\n  x2(\"^\\\\w...def$\", \"zabcdef\", 0, 7);\n  x2(\"\\\\w\\\\w\\\\s\\\\Waaa\\\\d\", \"aa  aaa4\", 0, 8);\n  x2(\"\\\\A\\\\Z\", \"\", 0, 0);\n  x2(\"\\\\Axyz\", \"xyz\", 0, 3);\n  x2(\"xyz\\\\Z\", \"xyz\", 0, 3);\n  x2(\"xyz\\\\z\", \"xyz\", 0, 3);\n  x2(\"a\\\\Z\", \"a\", 0, 1);\n  x2(\"\\\\Gaz\", \"az\", 0, 2);\n  n(\"\\\\Gz\", \"bza\");\n  n(\"az\\\\G\", \"az\");\n  n(\"az\\\\A\", \"az\");\n  n(\"a\\\\Az\", \"az\");\n  x2(\"\\\\^\\\\$\", \"^$\", 0, 2);\n  x2(\"^x?y\", \"xy\", 0, 2);\n  x2(\"^(x?y)\", \"xy\", 0, 2);\n  x2(\"\\\\w\", \"_\", 0, 1);\n  n(\"\\\\W\", \"_\");\n  x2(\"(?=z)z\", \"z\", 0, 1);\n  n(\"(?=z).\", \"a\");\n  x2(\"(?!z)a\", \"a\", 0, 1);\n  n(\"(?!z)a\", \"z\");\n  x2(\"(?i:a)\", \"a\", 0, 1);\n  x2(\"(?i:a)\", \"A\", 0, 1);\n  x2(\"(?i:A)\", \"a\", 0, 1);\n  n(\"(?i:A)\", \"b\");\n  x2(\"(?i:[A-Z])\", \"a\", 0, 1);\n  x2(\"(?i:[f-m])\", \"H\", 0, 1);\n  x2(\"(?i:[f-m])\", \"h\", 0, 1);\n  n(\"(?i:[f-m])\", \"e\");\n  x2(\"(?i:[A-c])\", \"D\", 0, 1);\n  n(\"(?i:[^a-z])\", \"A\");\n  n(\"(?i:[^a-z])\", \"a\");\n  x2(\"(?i:[!-k])\", \"Z\", 0, 1);\n  x2(\"(?i:[!-k])\", \"7\", 0, 1);\n  x2(\"(?i:[T-}])\", \"b\", 0, 1);\n  x2(\"(?i:[T-}])\", \"{\", 0, 1);\n  x2(\"(?i:\\\\?a)\", \"?A\", 0, 2);\n  x2(\"(?i:\\\\*A)\", \"*a\", 0, 2);\n  n(\".\", \"\\n\");\n  x2(\"(?m:.)\", \"\\n\", 0, 1);\n  x2(\"(?m:a.)\", \"a\\n\", 0, 2);\n  x2(\"(?m:.b)\", \"a\\nb\", 1, 3);\n  x2(\".*abc\", \"dddabdd\\nddabc\", 8, 13);\n  x2(\"(?m:.*abc)\", \"dddabddabc\", 0, 10);\n  n(\"(?i)(?-i)a\", \"A\");\n  n(\"(?i)(?-i:a)\", \"A\");\n  x2(\"a?\", \"\", 0, 0);\n  x2(\"a?\", \"b\", 0, 0);\n  x2(\"a?\", \"a\", 0, 1);\n  x2(\"a*\", \"\", 0, 0);\n  x2(\"a*\", \"a\", 0, 1);\n  x2(\"a*\", \"aaa\", 0, 3);\n  x2(\"a*\", \"baaaa\", 0, 0);\n  n(\"a+\", \"\");\n  x2(\"a+\", \"a\", 0, 1);\n  x2(\"a+\", \"aaaa\", 0, 4);\n  x2(\"a+\", \"aabbb\", 0, 2);\n  x2(\"a+\", \"baaaa\", 1, 5);\n  x2(\".?\", \"\", 0, 0);\n  x2(\".?\", \"f\", 0, 1);\n  x2(\".?\", \"\\n\", 0, 0);\n  x2(\".*\", \"\", 0, 0);\n  x2(\".*\", \"abcde\", 0, 5);\n  x2(\".+\", \"z\", 0, 1);\n  x2(\".+\", \"zdswer\\n\", 0, 6);\n  x2(\"(.*)a\\\\1f\", \"babfbac\", 0, 4);\n  x2(\"(.*)a\\\\1f\", \"bacbabf\", 3, 7);\n  x2(\"((.*)a\\\\2f)\", \"bacbabf\", 3, 7);\n  x2(\"(.*)a\\\\1f\", \"baczzzzzz\\nbazz\\nzzzzbabf\", 19, 23);\n  x2(\"a|b\", \"a\", 0, 1);\n  x2(\"a|b\", \"b\", 0, 1);\n  x2(\"|a\", \"a\", 0, 0);\n  x2(\"(|a)\", \"a\", 0, 0);\n  x2(\"ab|bc\", \"ab\", 0, 2);\n  x2(\"ab|bc\", \"bc\", 0, 2);\n  x2(\"z(?:ab|bc)\", \"zbc\", 0, 3);\n  x2(\"a(?:ab|bc)c\", \"aabc\", 0, 4);\n  x2(\"ab|(?:ac|az)\", \"az\", 0, 2);\n  x2(\"a|b|c\", \"dc\", 1, 2);\n  x2(\"a|b|cd|efg|h|ijk|lmn|o|pq|rstuvwx|yz\", \"pqr\", 0, 2);\n  n(\"a|b|cd|efg|h|ijk|lmn|o|pq|rstuvwx|yz\", \"mn\");\n  x2(\"a|^z\", \"ba\", 1, 2);\n  x2(\"a|^z\", \"za\", 0, 1);\n  x2(\"a|\\\\Gz\", \"bza\", 2, 3);\n  x2(\"a|\\\\Gz\", \"za\", 0, 1);\n  x2(\"a|\\\\Az\", \"bza\", 2, 3);\n  x2(\"a|\\\\Az\", \"za\", 0, 1);\n  x2(\"a|b\\\\Z\", \"ba\", 1, 2);\n  x2(\"a|b\\\\Z\", \"b\", 0, 1);\n  x2(\"a|b\\\\z\", \"ba\", 1, 2);\n  x2(\"a|b\\\\z\", \"b\", 0, 1);\n  x2(\"\\\\w|\\\\s\", \" \", 0, 1);\n  n(\"\\\\w|\\\\w\", \" \");\n  x2(\"\\\\w|%\", \"%\", 0, 1);\n  x2(\"\\\\w|[&$]\", \"&\", 0, 1);\n  x2(\"[b-d]|[^e-z]\", \"a\", 0, 1);\n  x2(\"(?:a|[c-f])|bz\", \"dz\", 0, 1);\n  x2(\"(?:a|[c-f])|bz\", \"bz\", 0, 2);\n  x2(\"abc|(?=zz)..f\", \"zzf\", 0, 3);\n  x2(\"abc|(?!zz)..f\", \"abf\", 0, 3);\n  x2(\"(?=za)..a|(?=zz)..a\", \"zza\", 0, 3);\n  n(\"(?>a|abd)c\", \"abdc\");\n  x2(\"(?>abd|a)c\", \"abdc\", 0, 4);\n  x2(\"a?|b\", \"a\", 0, 1);\n  x2(\"a?|b\", \"b\", 0, 0);\n  x2(\"a?|b\", \"\", 0, 0);\n  x2(\"a*|b\", \"aa\", 0, 2);\n  x2(\"a*|b*\", \"ba\", 0, 0);\n  x2(\"a*|b*\", \"ab\", 0, 1);\n  x2(\"a+|b*\", \"\", 0, 0);\n  x2(\"a+|b*\", \"bbb\", 0, 3);\n  x2(\"a+|b*\", \"abbb\", 0, 1);\n  n(\"a+|b+\", \"\");\n  x2(\"(a|b)?\", \"b\", 0, 1);\n  x2(\"(a|b)*\", \"ba\", 0, 2);\n  x2(\"(a|b)+\", \"bab\", 0, 3);\n  x2(\"(ab|ca)+\", \"caabbc\", 0, 4);\n  x2(\"(ab|ca)+\", \"aabca\", 1, 5);\n  x2(\"(ab|ca)+\", \"abzca\", 0, 2);\n  x2(\"(a|bab)+\", \"ababa\", 0, 5);\n  x2(\"(a|bab)+\", \"ba\", 1, 2);\n  x2(\"(a|bab)+\", \"baaaba\", 1, 4);\n  x2(\"(?:a|b)(?:a|b)\", \"ab\", 0, 2);\n  x2(\"(?:a*|b*)(?:a*|b*)\", \"aaabbb\", 0, 3);\n  x2(\"(?:a*|b*)(?:a+|b+)\", \"aaabbb\", 0, 6);\n  x2(\"(?:a+|b+){2}\", \"aaabbb\", 0, 6);\n  x2(\"h{0,}\", \"hhhh\", 0, 4);\n  x2(\"(?:a+|b+){1,2}\", \"aaabbb\", 0, 6);\n  n(\"ax{2}*a\", \"0axxxa1\");\n  n(\"a.{0,2}a\", \"0aXXXa0\");\n  n(\"a.{0,2}?a\", \"0aXXXa0\");\n  n(\"a.{0,2}?a\", \"0aXXXXa0\");\n  x2(\"^a{2,}?a$\", \"aaa\", 0, 3);\n  x2(\"^[a-z]{2,}?$\", \"aaa\", 0, 3);\n  x2(\"(?:a+|\\\\Ab*)cc\", \"cc\", 0, 2);\n  n(\"(?:a+|\\\\Ab*)cc\", \"abcc\");\n  x2(\"(?:^a+|b+)*c\", \"aabbbabc\", 6, 8);\n  x2(\"(?:^a+|b+)*c\", \"aabbbbc\", 0, 7);\n  x2(\"a|(?i)c\", \"C\", 0, 1);\n  x2(\"(?i)c|a\", \"C\", 0, 1);\n  x2(\"(?i)c|a\", \"A\", 0, 1);\n  x2(\"(?i:c)|a\", \"C\", 0, 1);\n  n(\"(?i:c)|a\", \"A\");\n  x2(\"[abc]?\", \"abc\", 0, 1);\n  x2(\"[abc]*\", \"abc\", 0, 3);\n  x2(\"[^abc]*\", \"abc\", 0, 0);\n  n(\"[^abc]+\", \"abc\");\n  x2(\"a?\\?\", \"aaa\", 0, 0);\n  x2(\"ba?\\?b\", \"bab\", 0, 3);\n  x2(\"a*?\", \"aaa\", 0, 0);\n  x2(\"ba*?\", \"baa\", 0, 1);\n  x2(\"ba*?b\", \"baab\", 0, 4);\n  x2(\"a+?\", \"aaa\", 0, 1);\n  x2(\"ba+?\", \"baa\", 0, 2);\n  x2(\"ba+?b\", \"baab\", 0, 4);\n  x2(\"(?:a?)?\\?\", \"a\", 0, 0);\n  x2(\"(?:a?\\?)?\", \"a\", 0, 0);\n  x2(\"(?:a?)+?\", \"aaa\", 0, 1);\n  x2(\"(?:a+)?\\?\", \"aaa\", 0, 0);\n  x2(\"(?:a+)?\\?b\", \"aaab\", 0, 4);\n  x2(\"(?:ab)?{2}\", \"\", 0, 0);\n  x2(\"(?:ab)?{2}\", \"ababa\", 0, 4);\n  x2(\"(?:ab)*{0}\", \"ababa\", 0, 0);\n  x2(\"(?:ab){3,}\", \"abababab\", 0, 8);\n  n(\"(?:ab){3,}\", \"abab\");\n  x2(\"(?:ab){2,4}\", \"ababab\", 0, 6);\n  x2(\"(?:ab){2,4}\", \"ababababab\", 0, 8);\n  x2(\"(?:ab){2,4}?\", \"ababababab\", 0, 4);\n  x2(\"(?:ab){,}\", \"ab{,}\", 0, 5);\n  x2(\"(?:abc)+?{2}\", \"abcabcabc\", 0, 6);\n  x2(\"(?:X*)(?i:xa)\", \"XXXa\", 0, 4);\n  x2(\"(d+)([^abc]z)\", \"dddz\", 0, 4);\n  x2(\"([^abc]*)([^abc]z)\", \"dddz\", 0, 4);\n  x2(\"(\\\\w+)(\\\\wz)\", \"dddz\", 0, 4);\n  x3(\"(a)\", \"a\", 0, 1, 1);\n  x3(\"(ab)\", \"ab\", 0, 2, 1);\n  x2(\"((ab))\", \"ab\", 0, 2);\n  x3(\"((ab))\", \"ab\", 0, 2, 1);\n  x3(\"((ab))\", \"ab\", 0, 2, 2);\n  x3(\"((((((((((((((((((((ab))))))))))))))))))))\", \"ab\", 0, 2, 20);\n  x3(\"(ab)(cd)\", \"abcd\", 0, 2, 1);\n  x3(\"(ab)(cd)\", \"abcd\", 2, 4, 2);\n  x3(\"()(a)bc(def)ghijk\", \"abcdefghijk\", 3, 6, 3);\n  x3(\"(()(a)bc(def)ghijk)\", \"abcdefghijk\", 3, 6, 4);\n  x2(\"(^a)\", \"a\", 0, 1);\n  x3(\"(a)|(a)\", \"ba\", 1, 2, 1);\n  x3(\"(^a)|(a)\", \"ba\", 1, 2, 2);\n  x3(\"(a?)\", \"aaa\", 0, 1, 1);\n  x3(\"(a*)\", \"aaa\", 0, 3, 1);\n  x3(\"(a*)\", \"\", 0, 0, 1);\n  x3(\"(a+)\", \"aaaaaaa\", 0, 7, 1);\n  x3(\"(a+|b*)\", \"bbbaa\", 0, 3, 1);\n  x3(\"(a+|b?)\", \"bbbaa\", 0, 1, 1);\n  x3(\"(abc)?\", \"abc\", 0, 3, 1);\n  x3(\"(abc)*\", \"abc\", 0, 3, 1);\n  x3(\"(abc)+\", \"abc\", 0, 3, 1);\n  x3(\"(xyz|abc)+\", \"abc\", 0, 3, 1);\n  x3(\"([xyz][abc]|abc)+\", \"abc\", 0, 3, 1);\n  x3(\"((?i:abc))\", \"AbC\", 0, 3, 1);\n  x2(\"(abc)(?i:\\\\1)\", \"abcABC\", 0, 6);\n  x3(\"((?m:a.c))\", \"a\\nc\", 0, 3, 1);\n  x3(\"((?=az)a)\", \"azb\", 0, 1, 1);\n  x3(\"abc|(.abd)\", \"zabd\", 0, 4, 1);\n  x2(\"(?:abc)|(ABC)\", \"abc\", 0, 3);\n  x3(\"(?i:(abc))|(zzz)\", \"ABC\", 0, 3, 1);\n  x3(\"a*(.)\", \"aaaaz\", 4, 5, 1);\n  x3(\"a*?(.)\", \"aaaaz\", 0, 1, 1);\n  x3(\"a*?(c)\", \"aaaac\", 4, 5, 1);\n  x3(\"[bcd]a*(.)\", \"caaaaz\", 5, 6, 1);\n  x3(\"(\\\\Abb)cc\", \"bbcc\", 0, 2, 1);\n  n(\"(\\\\Abb)cc\", \"zbbcc\");\n  x3(\"(^bb)cc\", \"bbcc\", 0, 2, 1);\n  n(\"(^bb)cc\", \"zbbcc\");\n  x3(\"cc(bb$)\", \"ccbb\", 2, 4, 1);\n  n(\"cc(bb$)\", \"ccbbb\");\n  n(\"(\\\\1)\", \"\");\n  n(\"\\\\1(a)\", \"aa\");\n  n(\"(a(b)\\\\1)\\\\2+\", \"ababb\");\n  n(\"(?:(?:\\\\1|z)(a))+$\", \"zaa\");\n  x2(\"(?:(?:\\\\1|z)(a))+$\", \"zaaa\", 0, 4);\n  x2(\"(a)(?=\\\\1)\", \"aa\", 0, 1);\n  n(\"(a)$|\\\\1\", \"az\");\n  x2(\"(a)\\\\1\", \"aa\", 0, 2);\n  n(\"(a)\\\\1\", \"ab\");\n  x2(\"(a?)\\\\1\", \"aa\", 0, 2);\n  x2(\"(a?\\?)\\\\1\", \"aa\", 0, 0);\n  x2(\"(a*)\\\\1\", \"aaaaa\", 0, 4);\n  x3(\"(a*)\\\\1\", \"aaaaa\", 0, 2, 1);\n  x2(\"a(b*)\\\\1\", \"abbbb\", 0, 5);\n  x2(\"a(b*)\\\\1\", \"ab\", 0, 1);\n  x2(\"(a*)(b*)\\\\1\\\\2\", \"aaabbaaabb\", 0, 10);\n  x2(\"(a*)(b*)\\\\2\", \"aaabbbb\", 0, 7);\n  x2(\"(((((((a*)b))))))c\\\\7\", \"aaabcaaa\", 0, 8);\n  x3(\"(((((((a*)b))))))c\\\\7\", \"aaabcaaa\", 0, 3, 7);\n  x2(\"(a)(b)(c)\\\\2\\\\1\\\\3\", \"abcbac\", 0, 6);\n  x2(\"([a-d])\\\\1\", \"cc\", 0, 2);\n  x2(\"(\\\\w\\\\d\\\\s)\\\\1\", \"f5 f5 \", 0, 6);\n  n(\"(\\\\w\\\\d\\\\s)\\\\1\", \"f5 f5\");\n  x2(\"(who|[a-c]{3})\\\\1\", \"whowho\", 0, 6);\n  x2(\"...(who|[a-c]{3})\\\\1\", \"abcwhowho\", 0, 9);\n  x2(\"(who|[a-c]{3})\\\\1\", \"cbccbc\", 0, 6);\n  x2(\"(^a)\\\\1\", \"aa\", 0, 2);\n  n(\"(^a)\\\\1\", \"baa\");\n  n(\"(a$)\\\\1\", \"aa\");\n  n(\"(ab\\\\Z)\\\\1\", \"ab\");\n  x2(\"(a*\\\\Z)\\\\1\", \"a\", 1, 1);\n  x2(\".(a*\\\\Z)\\\\1\", \"ba\", 1, 2);\n  x3(\"(.(abc)\\\\2)\", \"zabcabc\", 0, 7, 1);\n  x3(\"(.(..\\\\d.)\\\\2)\", \"z12341234\", 0, 9, 1);\n  x2(\"((?i:az))\\\\1\", \"AzAz\", 0, 4);\n  n(\"((?i:az))\\\\1\", \"Azaz\");\n  x2(\"(?<=a)b\", \"ab\", 1, 2);\n  n(\"(?<=a)b\", \"bb\");\n  x2(\"(?<=a|b)b\", \"bb\", 1, 2);\n  x2(\"(?<=a|bc)b\", \"bcb\", 2, 3);\n  x2(\"(?<=a|bc)b\", \"ab\", 1, 2);\n  x2(\"(?<=a|bc||defghij|klmnopq|r)z\", \"rz\", 1, 2);\n  x2(\"(a)\\\\g<1>\", \"aa\", 0, 2);\n  x2(\"(?<!a)b\", \"cb\", 1, 2);\n  n(\"(?<!a)b\", \"ab\");\n  x2(\"(?<!a|bc)b\", \"bbb\", 0, 1);\n  n(\"(?<!a|bc)z\", \"bcz\");\n  x2(\"(?<name1>a)\", \"a\", 0, 1);\n  x2(\"(?<name_2>ab)\\\\g<name_2>\", \"abab\", 0, 4);\n  x2(\"(?<name_3>.zv.)\\\\k<name_3>\", \"azvbazvb\", 0, 8);\n  x2(\"(?<=\\\\g<ab>)|-\\\\zEND (?<ab>XyZ)\", \"XyZ\", 3, 3);\n  x2(\"(?<n>|a\\\\g<n>)+\", \"\", 0, 0);\n  x2(\"(?<n>|\\\\(\\\\g<n>\\\\))+$\", \"()(())\", 0, 6);\n  x3(\"\\\\g<n>(?<n>.){0}\", \"X\", 0, 1, 1);\n  x2(\"\\\\g<n>(abc|df(?<n>.YZ){2,8}){0}\", \"XYZ\", 0, 3);\n  x2(\"\\\\A(?<n>(a\\\\g<n>)|)\\\\z\", \"aaaa\", 0, 4);\n  x2(\"(?<n>|\\\\g<m>\\\\g<n>)\\\\z|\\\\zEND (?<m>a|(b)\\\\g<m>)\", \"bbbbabba\", 0, 8);\n  x2(\"(?<name1240>\\\\w+\\\\sx)a+\\\\k<name1240>\", \"  fg xaaaaaaaafg x\", 2, 18);\n  x3(\"(z)()()(?<_9>a)\\\\g<_9>\", \"zaa\", 2, 3, 1);\n  x2(\"(.)(((?<_>a)))\\\\k<_>\", \"zaa\", 0, 3);\n  x2(\"((?<name1>\\\\d)|(?<name2>\\\\w))(\\\\k<name1>|\\\\k<name2>)\", \"ff\", 0, 2);\n  x2(\"(?:(?<x>)|(?<x>efg))\\\\k<x>\", \"\", 0, 0);\n  x2(\"(?:(?<x>abc)|(?<x>efg))\\\\k<x>\", \"abcefgefg\", 3, 9);\n  n(\"(?:(?<x>abc)|(?<x>efg))\\\\k<x>\", \"abcefg\");\n  x2(\"(?:(?<n1>.)|(?<n1>..)|(?<n1>...)|(?<n1>....)|(?<n1>.....)|(?<n1>......)|(?<n1>.......)|(?<n1>........)|(?<n1>.........)|(?<n1>..........)|(?<n1>...........)|(?<n1>............)|(?<n1>.............)|(?<n1>..............))\\\\k<n1>$\", \"a-pyumpyum\", 2, 10);\n  x3(\"(?:(?<n1>.)|(?<n1>..)|(?<n1>...)|(?<n1>....)|(?<n1>.....)|(?<n1>......)|(?<n1>.......)|(?<n1>........)|(?<n1>.........)|(?<n1>..........)|(?<n1>...........)|(?<n1>............)|(?<n1>.............)|(?<n1>..............))\\\\k<n1>$\", \"xxxxabcdefghijklmnabcdefghijklmn\", 4, 18, 14);\n  x3(\"(?<name1>)(?<name2>)(?<name3>)(?<name4>)(?<name5>)(?<name6>)(?<name7>)(?<name8>)(?<name9>)(?<name10>)(?<name11>)(?<name12>)(?<name13>)(?<name14>)(?<name15>)(?<name16>aaa)(?<name17>)$\", \"aaa\", 0, 3, 16);\n  x2(\"(?<foo>a|\\\\(\\\\g<foo>\\\\))\", \"a\", 0, 1);\n  x2(\"(?<foo>a|\\\\(\\\\g<foo>\\\\))\", \"((((((a))))))\", 0, 13);\n  x3(\"(?<foo>a|\\\\(\\\\g<foo>\\\\))\", \"((((((((a))))))))\", 0, 17, 1);\n  x2(\"\\\\g<bar>|\\\\zEND(?<bar>.*abc$)\", \"abcxxxabc\", 0, 9);\n  x2(\"\\\\g<1>|\\\\zEND(.a.)\", \"bac\", 0, 3);\n  x3(\"\\\\g<_A>\\\\g<_A>|\\\\zEND(.a.)(?<_A>.b.)\", \"xbxyby\", 3, 6, 1);\n  x2(\"\\\\A(?:\\\\g<pon>|\\\\g<pan>|\\\\zEND  (?<pan>a|c\\\\g<pon>c)(?<pon>b|d\\\\g<pan>d))$\", \"cdcbcdc\", 0, 7);\n  x2(\"\\\\A(?<n>|a\\\\g<m>)\\\\z|\\\\zEND (?<m>\\\\g<n>)\", \"aaaa\", 0, 4);\n  x2(\"(?<n>(a|b\\\\g<n>c){3,5})\", \"baaaaca\", 1, 5);\n  x2(\"(?<n>(a|b\\\\g<n>c){3,5})\", \"baaaacaaaaa\", 0, 10);\n  x2(\"(?<pare>\\\\(([^\\\\(\\\\)]++|\\\\g<pare>)*+\\\\))\", \"((a))\", 0, 5);\n  x2(\"()*\\\\1\", \"\", 0, 0);\n  x2(\"(?:()|())*\\\\1\\\\2\", \"\", 0, 0);\n  x3(\"(?:\\\\1a|())*\", \"a\", 0, 0, 1);\n  x2(\"x((.)*)*x\", \"0x1x2x3\", 1, 6);\n  x2(\"x((.)*)*x(?i:\\\\1)\\\\Z\", \"0x1x2x1X2\", 1, 9);\n  x2(\"(?:()|()|()|()|()|())*\\\\2\\\\5\", \"\", 0, 0);\n  x2(\"(?:()|()|()|(x)|()|())*\\\\2b\\\\5\", \"b\", 0, 1);\n  x2(\"\\\\xED\\\\xF2\", \"\\xed\\xf2\", 0, 2);\n  x2(\"\", \"\", 0, 0);\n  x2(\"\", \"\", 0, 2);\n  n(\"\", \"\");\n  x2(\"\", \"\", 0, 4);\n  x2(\"\", \"\", 0, 6);\n  x2(\"\", \"\", 0, 70);\n  x2(\"\", \"\", 2, 4);\n  x2(\"\", \"\", 2, 6);\n  x2(\"\\\\xca\\\\xb8\", \"\\xca\\xb8\", 0, 2);\n  x2(\".\", \"\", 0, 2);\n  x2(\"..\", \"\", 0, 4);\n  x2(\"(?u)\\\\w\", \"\", 0, 2);\n  n(\"(?u)\\\\W\", \"\");\n  x2(\"(?u)[\\\\W]\", \"$\", 2, 3);\n  x2(\"\\\\S\", \"\", 0, 2);\n  x2(\"\\\\S\", \"\", 0, 2);\n  x2(\"\\\\b\", \" \", 0, 0);\n  x2(\"\\\\b\", \" \", 1, 1);\n  x2(\"\\\\B\", \" \", 2, 2);\n  x2(\"\\\\B\", \" \", 3, 3);\n  x2(\"\\\\B\", \" \", 0, 0);\n  x2(\"[]\", \"\", 0, 2);\n  n(\"[ʤ]\", \"\");\n  x2(\"[-]\", \"\", 0, 2);\n  n(\"[^]\", \"\");\n  x2(\"(?u)[\\\\w]\", \"\", 0, 2);\n  n(\"[\\\\d]\", \"\");\n  x2(\"[\\\\D]\", \"\", 0, 2);\n  n(\"[\\\\s]\", \"\");\n  x2(\"[\\\\S]\", \"\", 0, 2);\n  x2(\"(?u)[\\\\w\\\\d]\", \"\", 0, 2);\n  x2(\"(?u)[\\\\w\\\\d]\", \"   \", 3, 5);\n  n(\"(?u)\\\\w\", \" \");\n  x2(\"(?u)\\\\W\", \" \", 0, 5);\n  x2(\"..\", \"\", 0, 10);\n  x2(\"(?u).\\\\w\\\\W..\", \" \", 0, 13);\n  x2(\"(?u)\\\\s\\\\w\", \" \", 0, 9);\n  x2(\".\", \"\", 0, 8);\n  n(\".\", \"\");\n  x2(\".\", \"\", 0, 4);\n  x2(\"^\", \"\", 0, 2);\n  x2(\"^$\", \"\", 0, 2);\n  x2(\"(?u)^\\\\w$\", \"\", 0, 2);\n  x2(\"(?u)^\\\\w$\", \"z\", 0, 11);\n  x2(\"(?u)^\\\\w...$\", \"z\", 0, 13);\n  x2(\"(?u)\\\\w\\\\w\\\\s\\\\W\\\\d\", \"a  4\", 0, 12);\n  x2(\"\\\\A\", \"\", 0, 6);\n  x2(\"\\\\Z\", \"\", 0, 6);\n  x2(\"\\\\z\", \"\", 0, 6);\n  x2(\"\\\\Z\", \"\\n\", 0, 6);\n  x2(\"\\\\Gݤ\", \"ݤ\", 0, 4);\n  n(\"\\\\G\", \"\");\n  n(\"Ȥ\\\\G\", \"Ȥ\");\n  n(\"ޤ\\\\A\", \"ޤ\");\n  n(\"\\\\A\", \"ޤ\");\n  x2(\"(?=)\", \"\", 0, 2);\n  n(\"(?=).\", \"\");\n  x2(\"(?!)\", \"\", 0, 2);\n  n(\"(?!)\", \"\");\n  x2(\"(?i:)\", \"\", 0, 2);\n  x2(\"(?i:֤)\", \"֤\", 0, 4);\n  n(\"(?i:)\", \"\");\n  x2(\"(?m:.)\", \"\\n\", 0, 3);\n  x2(\"(?m:.)\", \"\\n\", 2, 5);\n  x2(\"?\", \"\", 0, 0);\n  x2(\"?\", \"\", 0, 0);\n  x2(\"?\", \"\", 0, 2);\n  x2(\"*\", \"\", 0, 0);\n  x2(\"*\", \"\", 0, 2);\n  x2(\"*\", \"һһ\", 0, 6);\n  x2(\"*\", \"\", 0, 0);\n  n(\"+\", \"\");\n  x2(\"+\", \"\", 0, 2);\n  x2(\"+\", \"\", 0, 8);\n  x2(\"+\", \"\", 0, 4);\n  x2(\"+\", \"\", 2, 10);\n  x2(\".?\", \"\", 0, 2);\n  x2(\".*\", \"ѤԤפ\", 0, 8);\n  x2(\".+\", \"\", 0, 2);\n  x2(\".+\", \"\\n\", 0, 8);\n  x2(\"|\", \"\", 0, 2);\n  x2(\"|\", \"\", 0, 2);\n  x2(\"|\", \"\", 0, 4);\n  x2(\"|\", \"\", 0, 4);\n  x2(\"(?:|)\", \"򤫤\", 0, 6);\n  x2(\"(?:|)\", \"򤭤\", 0, 8);\n  x2(\"|(?:|)\", \"\", 0, 4);\n  x2(\"||\", \"\", 2, 4);\n  x2(\"|||||||||ĤƤȤʤ|̤\", \"\", 0, 6);\n  n(\"|||||||||ĤƤȤʤ|̤\", \"\");\n  x2(\"|^\", \"֤\", 2, 4);\n  x2(\"|^\", \"\", 0, 2);\n  x2(\"|\\\\G\", \"ֵ\", 4, 6);\n  x2(\"|\\\\G\", \"ֵ\", 0, 2);\n  x2(\"|\\\\A\", \"bֵ\", 3, 5);\n  x2(\"|\\\\A\", \"\", 0, 2);\n  x2(\"|\\\\Z\", \"ֵ\", 2, 4);\n  x2(\"|\\\\Z\", \"\", 0, 2);\n  x2(\"|\\\\Z\", \"\\n\", 0, 2);\n  x2(\"|\\\\z\", \"ֵ\", 2, 4);\n  x2(\"|\\\\z\", \"\", 0, 2);\n  x2(\"(?u)\\\\w|\\\\s\", \"\", 0, 2);\n  x2(\"(?u)\\\\w|%\", \"%\", 0, 1);\n  x2(\"(?u)\\\\w|[&$]\", \"&\", 0, 2);\n  x2(\"[-]\", \"\", 0, 2);\n  x2(\"[-]|[^-]\", \"\", 0, 2);\n  x2(\"[-]|[^-]\", \"\", 0, 2);\n  x2(\"[^]\", \"\\n\", 0, 1);\n  x2(\"(?:|[-])|\", \"\", 0, 2);\n  x2(\"(?:|[-])|\", \"\", 0, 4);\n  x2(\"|(?=)..\", \"\", 0, 6);\n  x2(\"|(?!)..\", \"\", 0, 6);\n  x2(\"(?=)..|(?=)..\", \"\", 0, 6);\n  x2(\"(?<=|)\", \"\", 4, 6);\n  n(\"(?>|)\", \"\");\n  x2(\"(?>|)\", \"\", 0, 8);\n  x2(\"?|\", \"\", 0, 2);\n  x2(\"?|\", \"\", 0, 0);\n  x2(\"?|\", \"\", 0, 0);\n  x2(\"*|\", \"\", 0, 4);\n  x2(\"*|*\", \"\", 0, 0);\n  x2(\"*|*\", \"\", 0, 2);\n  x2(\"[a]*|*\", \"a\", 0, 3);\n  x2(\"+|*\", \"\", 0, 0);\n  x2(\"+|*\", \"\", 0, 6);\n  x2(\"+|*\", \"\", 0, 2);\n  x2(\"+|*\", \"a\", 0, 0);\n  n(\"+|+\", \"\");\n  x2(\"(|)?\", \"\", 0, 2);\n  x2(\"(|)*\", \"\", 0, 4);\n  x2(\"(|)+\", \"\", 0, 6);\n  x2(\"(|)+\", \"\", 0, 8);\n  x2(\"(|)+\", \"\", 4, 12);\n  x2(\"(|)+\", \"\", 2, 10);\n  x2(\"(|)+\", \"򤦤\", 0, 4);\n  x2(\"(|)+\", \"$$zzzz򤦤\", 6, 10);\n  x2(\"(|)+\", \"\", 0, 10);\n  x2(\"(|)+\", \"\", 2, 4);\n  x2(\"(|)+\", \"\", 2, 8);\n  x2(\"(?:|)(?:|)\", \"\", 0, 4);\n  x2(\"(?:*|*)(?:*|*)\", \"\", 0, 6);\n  x2(\"(?:*|*)(?:+|+)\", \"\", 0, 12);\n  x2(\"(?:+|+){2}\", \"\", 0, 12);\n  x2(\"(?:+|+){1,2}\", \"\", 0, 12);\n  x2(\"(?:+|\\\\A*)\", \"\", 0, 4);\n  n(\"(?:+|\\\\A*)\", \"\");\n  x2(\"(?:^+|+)*\", \"\", 12, 16);\n  x2(\"(?:^+|+)*\", \"\", 0, 14);\n  x2(\"{0,}\", \"\", 0, 8);\n  x2(\"|(?i)c\", \"C\", 0, 1);\n  x2(\"(?i)c|\", \"C\", 0, 1);\n  x2(\"(?i:)|a\", \"a\", 0, 1);\n  n(\"(?i:)|a\", \"A\");\n  x2(\"[]?\", \"\", 0, 2);\n  x2(\"[]*\", \"\", 0, 6);\n  x2(\"[^]*\", \"\", 0, 0);\n  n(\"[^]+\", \"\");\n  x2(\"?\\?\", \"\", 0, 0);\n  x2(\"?\\?\", \"\", 0, 6);\n  x2(\"*?\", \"\", 0, 0);\n  x2(\"*?\", \"\", 0, 2);\n  x2(\"*?\", \"\", 0, 8);\n  x2(\"+?\", \"\", 0, 2);\n  x2(\"+?\", \"\", 0, 4);\n  x2(\"+?\", \"\", 0, 8);\n  x2(\"(?:ŷ?)?\\?\", \"ŷ\", 0, 0);\n  x2(\"(?:ŷ?\\?)?\", \"ŷ\", 0, 0);\n  x2(\"(?:̴?)+?\", \"̴̴̴\", 0, 2);\n  x2(\"(?:+)?\\?\", \"\", 0, 0);\n  x2(\"(?:+)?\\?\", \"\", 0, 8);\n  x2(\"(?:)?{2}\", \"\", 0, 0);\n  x2(\"(?:)?{2}\", \"ֵֵ\", 0, 8);\n  x2(\"(?:)*{0}\", \"ֵֵ\", 0, 0);\n  x2(\"(?:){3,}\", \"ֵֵֵ\", 0, 16);\n  n(\"(?:){3,}\", \"ֵ\");\n  x2(\"(?:){2,4}\", \"ֵֵ\", 0, 12);\n  x2(\"(?:){2,4}\", \"ֵֵֵֵ\", 0, 16);\n  x2(\"(?:){2,4}?\", \"ֵֵֵֵ\", 0, 8);\n  x2(\"(?:){,}\", \"{,}\", 0, 7);\n  x2(\"(?:)+?{2}\", \"\", 0, 12);\n  x3(\"()\", \"\", 0, 2, 1);\n  x3(\"(п)\", \"п\", 0, 4, 1);\n  x2(\"(())\", \"\", 0, 4);\n  x3(\"(())\", \"\", 0, 4, 1);\n  x3(\"(())\", \"\", 0, 4, 2);\n  x3(\"((((((((((((((((((((̻))))))))))))))))))))\", \"̻\", 0, 4, 20);\n  x3(\"()()\", \"\", 0, 4, 1);\n  x3(\"()()\", \"\", 4, 8, 2);\n  x3(\"()()()\", \"\", 6, 12, 3);\n  x3(\"(()()())\", \"\", 6, 12, 4);\n  x3(\".*(ե)󡦥(()奿)\", \"ե󡦥ޥ󥷥奿\", 10, 18, 2);\n  x2(\"(^)\", \"\", 0, 2);\n  x3(\"()|()\", \"\", 2, 4, 1);\n  x3(\"(^)|()\", \"\", 2, 4, 2);\n  x3(\"(?)\", \"\", 0, 2, 1);\n  x3(\"(*)\", \"ޤޤ\", 0, 6, 1);\n  x3(\"(*)\", \"\", 0, 0, 1);\n  x3(\"(+)\", \"\", 0, 14, 1);\n  x3(\"(+|*)\", \"դդդؤ\", 0, 6, 1);\n  x3(\"(+|?)\", \"\", 0, 2, 1);\n  x3(\"()?\", \"\", 0, 6, 1);\n  x3(\"()*\", \"\", 0, 6, 1);\n  x3(\"()+\", \"\", 0, 6, 1);\n  x3(\"(|)+\", \"\", 0, 6, 1);\n  x3(\"([ʤˤ][]|)+\", \"\", 0, 6, 1);\n  x3(\"((?i:))\", \"\", 0, 6, 1);\n  x3(\"((?m:.))\", \"\\n\", 0, 5, 1);\n  x3(\"((?=))\", \"\", 0, 2, 1);\n  x3(\"|(.)\", \"󤢤\", 0, 8, 1);\n  x3(\"*(.)\", \"\", 8, 10, 1);\n  x3(\"*?(.)\", \"\", 0, 2, 1);\n  x3(\"*?()\", \"\", 8, 10, 1);\n  x3(\"[]*(.)\", \"\", 10, 12, 1);\n  x3(\"(\\\\A)\", \"\", 0, 4, 1);\n  n(\"(\\\\A)\", \"󤤤\");\n  x3(\"(^)\", \"\", 0, 4, 1);\n  n(\"(^)\", \"󤤤\");\n  x3(\"($)\", \"\", 4, 8, 1);\n  n(\"($)\", \"\");\n  x2(\"(̵)\\\\1\", \"̵̵\", 0, 4);\n  n(\"(̵)\\\\1\", \"̵\");\n  x2(\"(?)\\\\1\", \"\", 0, 4);\n  x2(\"(?\\?)\\\\1\", \"\", 0, 0);\n  x2(\"(*)\\\\1\", \"\", 0, 8);\n  x3(\"(*)\\\\1\", \"\", 0, 4, 1);\n  x2(\"(*)\\\\1\", \"\", 0, 10);\n  x2(\"(*)\\\\1\", \"\", 0, 2);\n  x2(\"(*)(*)\\\\1\\\\2\", \"\", 0, 20);\n  x2(\"(*)(*)\\\\2\", \"\", 0, 14);\n  x3(\"(*)(*)\\\\2\", \"\", 6, 10, 2);\n  x2(\"(((((((*)))))))\\\\7\", \"ݤݤݤڤԤݤݤ\", 0, 16);\n  x3(\"(((((((*)))))))\\\\7\", \"ݤݤݤڤԤݤݤ\", 0, 6, 7);\n  x2(\"()()()\\\\2\\\\1\\\\3\", \"ϤҤդҤϤ\", 0, 12);\n  x2(\"([-])\\\\1\", \"\", 0, 4);\n  x2(\"(?u)(\\\\w\\\\d\\\\s)\\\\1\", \"5 5 \", 0, 8);\n  n(\"(?u)(\\\\w\\\\d\\\\s)\\\\1\", \"5 5\");\n  x2(\"(ï|[-]{3})\\\\1\", \"ïï\", 0, 8);\n  x2(\"...(ï|[-]{3})\\\\1\", \"aïï\", 0, 13);\n  x2(\"(ï|[-]{3})\\\\1\", \"\", 0, 12);\n  x2(\"(^)\\\\1\", \"\", 0, 4);\n  n(\"(^)\\\\1\", \"\");\n  n(\"($)\\\\1\", \"\");\n  n(\"(\\\\Z)\\\\1\", \"\");\n  x2(\"(*\\\\Z)\\\\1\", \"\", 2, 2);\n  x2(\".(*\\\\Z)\\\\1\", \"\", 2, 4);\n  x3(\"(.(䤤)\\\\2)\", \"z䤤䤤\", 0, 13, 1);\n  x3(\"(.(..\\\\d.)\\\\2)\", \"12341234\", 0, 10, 1);\n  x2(\"((?i:v))\\\\1\", \"vv\", 0, 10);\n  x2(\"(?<>|\\\\(\\\\g<>\\\\))\", \"(((((())))))\", 0, 14);\n  x2(\"\\\\A(?:\\\\g<_1>|\\\\g<_2>|\\\\zλ  (?<_1>|\\\\g<_2>)(?<_2>|\\\\g<_1>))$\", \"߼\", 0, 26);\n  x2(\"[[Ҥ]]\", \"\", 0, 2);\n  x2(\"[[]]\", \"\", 0, 2);\n  n(\"[[^]]\", \"\");\n  n(\"[^[]]\", \"\");\n  x2(\"[^[^]]\", \"\", 0, 2);\n  x2(\"[[]&&]\", \"\", 0, 2);\n  n(\"[[]&&]\", \"\");\n  n(\"[[]&&]\", \"\");\n  x2(\"[-&&-&&-]\", \"\", 0, 2);\n  n(\"[^-&&-&&-]\", \"\");\n  x2(\"[[^&&]&&-]\", \"\", 0, 2);\n  n(\"[[^&&]&&-]\", \"\");\n  x2(\"[[^-&&]&&[^-]]\", \"\", 0, 2);\n  n(\"[[^-&&]&&[^-]]\", \"\");\n  x2(\"[^[^]&&[^]]\", \"\", 0, 2);\n  x2(\"[^[^]&&[^]]\", \"\", 0, 2);\n  n(\"[^[^]&&[^]]\", \"\");\n  x2(\"[-&&-]\", \"-\", 0, 1);\n  x2(\"[^[^a-z]&&[^bcdefg]q-w]\", \"\", 0, 2);\n  x2(\"[^[^a-z]&&[^bcdefg]g-w]\", \"f\", 0, 1);\n  x2(\"[^[^a-z]&&[^bcdefg]g-w]\", \"g\", 0, 1);\n  n(\"[^[^a-z]&&[^bcdefg]g-w]\", \"2\");\n  x2(\"a<b>СΥ<\\\\/b>\", \"a<b>СΥ</b>\", 0, 32);\n  x2(\".<b>СΥ<\\\\/b>\", \"a<b>СΥ</b>\", 0, 32);\n  fprintf(stdout,\n       \"\\nRESULT   SUCC: %d,  FAIL: %d,  ERROR: %d      (by Onigmo %s)\\n\",\n       nsucc, nfail, nerror, onig_version());\n\n#ifndef POSIX_TEST\n  onig_region_free(region, 1);\n  onig_end();\n#endif\n\n  return ((nfail == 0 && nerror == 0) ? 0 : -1);\n}\n"
  },
  {
    "path": "src/Onigmo/testconv.rb",
    "content": "#!/usr/local/bin/ruby -Ke\n# testconv.rb\n# Copyright (C) 2003-2006  K.Kosako (sndgk393 AT ybb DOT ne DOT jp)\n\nWINDOWS = (ARGV.size > 0 && /^-win/i =~ ARGV[0])\nARGV.shift if WINDOWS\n\nif WINDOWS\n  REGENC  = 'ONIG_ENCODING_SJIS'\nelse\n  REGENC  = 'ONIG_ENCODING_EUC_JP'\nend\n\ndef conv_reg(s)\n  s.gsub!(/\\\\/, '\\\\\\\\\\\\\\\\')  #'\n  s.gsub!(/\\?\\?/, '?\\\\\\\\?')  # escape ANSI trigraph (??)\n  s\nend\n\ndef conv_str(s)\n  if (s[0] == ?')\n    s = s[1..-2]\n    return s.gsub(/\\\\/, '\\\\\\\\\\\\\\\\')  #'\n  else\n    return s[1..-2]\n  end\nend\n\nprint(<<\"EOS\")\n/*\n * This program was generated by testconv.rb.\n */\n#include \"config.h\"\n#ifdef ONIG_ESCAPE_UCHAR_COLLISION\n#undef ONIG_ESCAPE_UCHAR_COLLISION\n#endif\n#include <stdio.h>\n\n#ifdef POSIX_TEST\n#include \"onigposix.h\"\n#else\n#include \"oniguruma.h\"\n#endif\n\n#ifdef HAVE_STRING_H\n# include <string.h>\n#else\n# include <strings.h>\n#endif\n\n#define SLEN(s)  strlen(s)\n\nstatic int nsucc  = 0;\nstatic int nfail  = 0;\nstatic int nerror = 0;\n\nstatic FILE* err_file;\n\n#ifndef POSIX_TEST\nstatic OnigRegion* region;\n#endif\n\nstatic void xx(char* pattern, char* str, int from, int to, int mem, int not)\n{\n  int r;\n\n#ifdef POSIX_TEST\n  regex_t reg;\n  char buf[200];\n  regmatch_t pmatch[25];\n\n  r = regcomp(&reg, pattern, REG_EXTENDED | REG_NEWLINE);\n  if (r) {\n    regerror(r, &reg, buf, sizeof(buf));\n    fprintf(err_file, \"ERROR: %s\\\\n\", buf);\n    nerror++;\n    return ;\n  }\n\n  r = regexec(&reg, str, reg.re_nsub + 1, pmatch, 0);\n  if (r != 0 && r != REG_NOMATCH) {\n    regerror(r, &reg, buf, sizeof(buf));\n    fprintf(err_file, \"ERROR: %s\\\\n\", buf);\n    nerror++;\n    return ;\n  }\n\n  if (r == REG_NOMATCH) {\n    if (not) {\n      fprintf(stdout, \"OK(N): /%s/ '%s'\\\\n\", pattern, str);\n      nsucc++;\n    }\n    else {\n      fprintf(stdout, \"FAIL: /%s/ '%s'\\\\n\", pattern, str);\n      nfail++;\n    }\n  }\n  else {\n    if (not) {\n      fprintf(stdout, \"FAIL(N): /%s/ '%s'\\\\n\", pattern, str);\n      nfail++;\n    }\n    else {\n      if (pmatch[mem].rm_so == from && pmatch[mem].rm_eo == to) {\n        fprintf(stdout, \"OK: /%s/ '%s'\\\\n\", pattern, str);\n        nsucc++;\n      }\n      else {\n        fprintf(stdout, \"FAIL: /%s/ '%s' %d-%d : %d-%d\\\\n\", pattern, str,\n\t        from, to, pmatch[mem].rm_so, pmatch[mem].rm_eo);\n        nfail++;\n      }\n    }\n  }\n  regfree(&reg);\n\n#else\n  regex_t* reg;\n  OnigErrorInfo einfo;\n  OnigSyntaxType syn = *ONIG_SYNTAX_DEFAULT;\n\n  /* ONIG_OPTION_OFF(syn.options, ONIG_OPTION_ASCII_RANGE); */\n\n  r = onig_new(&reg, (UChar* )pattern, (UChar* )(pattern + SLEN(pattern)),\n\t       ONIG_OPTION_DEFAULT, #{REGENC}, &syn, &einfo);\n  if (r) {\n    char s[ONIG_MAX_ERROR_MESSAGE_LEN];\n    onig_error_code_to_str((UChar* )s, r, &einfo);\n    fprintf(err_file, \"ERROR: %s\\\\n\", s);\n    nerror++;\n    return ;\n  }\n\n  r = onig_search(reg, (UChar* )str, (UChar* )(str + SLEN(str)),\n\t\t  (UChar* )str, (UChar* )(str + SLEN(str)),\n\t\t  region, ONIG_OPTION_NONE);\n  if (r < ONIG_MISMATCH) {\n    char s[ONIG_MAX_ERROR_MESSAGE_LEN];\n    onig_error_code_to_str((UChar* )s, r);\n    fprintf(err_file, \"ERROR: %s\\\\n\", s);\n    nerror++;\n    return ;\n  }\n\n  if (r == ONIG_MISMATCH) {\n    if (not) {\n      fprintf(stdout, \"OK(N): /%s/ '%s'\\\\n\", pattern, str);\n      nsucc++;\n    }\n    else {\n      fprintf(stdout, \"FAIL: /%s/ '%s'\\\\n\", pattern, str);\n      nfail++;\n    }\n  }\n  else {\n    if (not) {\n      fprintf(stdout, \"FAIL(N): /%s/ '%s'\\\\n\", pattern, str);\n      nfail++;\n    }\n    else {\n      if (region->beg[mem] == from && region->end[mem] == to) {\n        fprintf(stdout, \"OK: /%s/ '%s'\\\\n\", pattern, str);\n        nsucc++;\n      }\n      else {\n        fprintf(stdout, \"FAIL: /%s/ '%s' %d-%d : %d-%d\\\\n\", pattern, str,\n\t        from, to, region->beg[mem], region->end[mem]);\n        nfail++;\n      }\n    }\n  }\n  onig_free(reg);\n#endif\n}\n\nstatic void x2(char* pattern, char* str, int from, int to)\n{\n  xx(pattern, str, from, to, 0, 0);\n}\n\nstatic void x3(char* pattern, char* str, int from, int to, int mem)\n{\n  xx(pattern, str, from, to, mem, 0);\n}\n\nstatic void n(char* pattern, char* str)\n{\n  xx(pattern, str, 0, 0, 0, 1);\n}\n\nextern int main(int argc, char* argv[])\n{\n  err_file = stdout;\n\n#ifdef POSIX_TEST\n  reg_set_encoding(#{REGENC.sub(/\\AONIG_/, 'REG_POSIX_')});\n#else\n  region = onig_region_new();\n#endif\n\nEOS\n\nPAT = '\\\\/([^\\\\\\\\\\\\/]*(?:\\\\\\\\.[^\\\\\\\\\\\\/]*)*)\\\\/'\nCM = '\\s*,\\s*'\nRX2 = %r{\\Ax\\(#{PAT}#{CM}('[^']*'|\"[^\"]*\")#{CM}(\\S+)#{CM}(\\S+)\\)}\nRI2 = %r{\\Ai\\(#{PAT}#{CM}('[^']*'|\"[^\"]*\")#{CM}(\\S+)#{CM}(\\S+)\\)}\nRX3 = %r{\\Ax\\(#{PAT}#{CM}('[^']*'|\"[^\"]*\")#{CM}(\\S+)#{CM}(\\S+)#{CM}(\\S+)\\)}\nRN  = %r{\\An\\(#{PAT}#{CM}('[^']*'|\"[^\"]*\")\\)} #'\n\nwhile line = gets()\n  if (m = RX2.match(line))\n    reg = conv_reg(m[1])\n    str = conv_str(m[2])\n    printf(\"  x2(\\\"%s\\\", \\\"%s\\\", %s, %s);\\n\", reg, str, m[3], m[4])\n  elsif (m = RI2.match(line))\n    reg = conv_reg(m[1])\n    str = conv_str(m[2])\n    printf(\"  x2(\\\"%s\\\", \\\"%s\\\", %s, %s);\\n\", reg, str, m[3], m[4])\n  elsif (m = RX3.match(line))\n    reg = conv_reg(m[1])\n    str = conv_str(m[2])\n    printf(\"  x3(\\\"%s\\\", \\\"%s\\\", %s, %s, %s);\\n\", reg, str, m[3], m[4], m[5])\n  elsif (m = RN.match(line))\n    reg = conv_reg(m[1])\n    str = conv_str(m[2])\n    printf(\"  n(\\\"%s\\\", \\\"%s\\\");\\n\", reg, str)\n  else\n\n  end\nend\n\nprint(<<'EOS')\n  fprintf(stdout,\n       \"\\nRESULT   SUCC: %d,  FAIL: %d,  ERROR: %d      (by Onigmo %s)\\n\",\n       nsucc, nfail, nerror, onig_version());\n\n#ifndef POSIX_TEST\n  onig_region_free(region, 1);\n  onig_end();\n#endif\n\n  return ((nfail == 0 && nerror == 0) ? 0 : -1);\n}\nEOS\n\n# END OF SCRIPT\n"
  },
  {
    "path": "src/Onigmo/testconvu.rb",
    "content": "#!/usr/local/bin/ruby -Ke\n# testconvu.rb\n# Copyright (C) 2004-2006  K.Kosako (sndgk393 AT ybb DOT ne DOT jp)\n\nrequire 'iconv'\n\nWINDOWS = (ARGV.size > 0 && /^-win/i =~ ARGV[0])\nARGV.shift if WINDOWS\n\nBIG_ENDIAN    = 1\nLITTLE_ENDIAN = 2\n\nICV_BE = Iconv.new('UTF-16BE', 'EUC-JP')\nICV_LE = Iconv.new('UTF-16LE', 'EUC-JP')\n\ndef eucjp_char_pos(s, byte_pos)\n  pos = 0\n  i   = 0\n  while (i < byte_pos)\n    x = s[i]\n    if ((x >= 0xa1 && x <= 0xfe) || x == 0x8e)\n      i += 2\n    elsif (x == 0x8f)\n      i += 3\n    else\n      i += 1\n    end\n    pos += 1\n  end\n  return pos\nend\n\ndef utf16_byte_pos(endian, s, char_pos)\n  i = 0\n  while (char_pos > 0)\n    x = (endian == BIG_ENDIAN ? s[i] : s[i+1])\n    if (x >= 0xd8 && x <= 0xdb)\n      i += 4\n    else\n      i += 2\n    end\n    char_pos -= 1\n  end\n  return i\nend\n\ndef s_escape(s)\n  q = ''\n  s.each_byte { |b|\n    if (b < 0x20 || b >= 0x7f || b == 0x22 || b == 0x5c)\n      q << sprintf(\"\\\\%03o\", b)\n    else\n      q << b.chr\n    end\n  }\n  q\nend\n\ndef conv_to_utf16(endian, s)\n  begin\n    if (endian == BIG_ENDIAN)\n      q = ICV_BE.iconv(s)\n    else\n      q = ICV_LE.iconv(s)\n    end\n  rescue Iconv::InvalidCharacter\n    q = 'Invalid character'\n  rescue Iconv::IllegalSequence\n    STDERR.printf(\"Iconv::IllegalSequence: [%s]\\n\", s)\n    return ''\n  end\n\n  q << \"\\000\\000\"\n  s_escape(q)\nend\n\ndef conv_reg(endian, s)\n  s = s.gsub(/\\\\([0-7]{2,3})\\\\([0-7]{2,3})/) {\n              $1.to_i(8).chr + $2.to_i(8).chr\n            }\n\n  s = s.gsub(/\\\\x([0-9A-Fa-f]{2})\\\\x([0-9A-Fa-f]{2})/) {\n              $1.to_i(16).chr + $2.to_i(16).chr\n            }\n\n  if (endian == BIG_ENDIAN)\n    s = s.gsub(/(\\\\[0-7]{2,3})/) { \"\\\\000\" + $1 }\n    s = s.gsub(/(\\\\x[0-9A-Fa-f]{2})/) { \"\\\\x00\" + $1 }\n  else\n    s = s.gsub(/(\\\\[0-7]{2,3})/) { $1 + \"\\\\000\" }\n    s = s.gsub(/(\\\\x[0-9A-Fa-f]{2})/) { $1 + \"\\\\x00\" }\n  end\n\n  s = s.gsub(/\\\\/, '\\\\\\\\')  #'\n\n  if (WINDOWS)\n    s = s.gsub(/\\?\\?/, '?\\\\?')   # escape ANSI trigraph\n  end\n  conv_to_utf16(endian, s)\nend\n\ndef conv_str(endian, s, from, to)\n  if (s[0] == ?')\n    s = s[1..-2]\n    q = s.gsub(/\\\\/, '\\\\\\\\')  #'\n  else\n    q = s[1..-2]\n    q.gsub!(/\\\\n/, \"\\x0a\")\n    q.gsub!(/\\\\t/, \"\\x09\")\n    q.gsub!(/\\\\v/, \"\\x0b\")\n    q.gsub!(/\\\\r/, \"\\x0d\")\n    q.gsub!(/\\\\f/, \"\\x0c\")\n    q.gsub!(/\\\\a/, \"\\x07\")\n    q.gsub!(/\\\\e/, \"\\x1b\")\n\n    q.gsub!(/\\\\([0-7]{2,3})/)      { $1.to_i(8).chr }\n    q.gsub!(/\\\\x([0-9A-Fa-f]{2})/) { $1.to_i(16).chr }\n  end\n\n  from = from.to_i\n  to   = to.to_i\n  eucjp_from = eucjp_char_pos(q, from)\n  eucjp_to   = eucjp_char_pos(q, to)\n\n  s = conv_to_utf16(endian, q)\n\n  from = utf16_byte_pos(endian, s, eucjp_from)\n  to   = utf16_byte_pos(endian, s, eucjp_to)\n  return s, from, to\nend\n\nprint(<<\"EOS\")\n/*\n * This program was generated by testconv.rb.\n */\n#include<stdio.h>\n\n#ifdef POSIX_TEST\n#include \"onigposix.h\"\n#else\n#include \"oniguruma.h\"\n#endif\n\nstatic int nsucc  = 0;\nstatic int nfail  = 0;\nstatic int nerror = 0;\n\nstatic FILE* err_file;\n\n#ifndef POSIX_TEST\nstatic OnigRegion* region;\nstatic OnigEncoding ENC;\n#endif\n\n#define ulen(p) onigenc_str_bytelen_null(ENC, (UChar* )p)\n\nstatic void uconv(char* from, char* to, int len)\n{\n  int i;\n  unsigned char c;\n  char *q;\n\n  q = to;\n\n  for (i = 0; i < len; i += 2) {\n    c = (unsigned char )from[i];\n    if (c == 0) {\n      c = (unsigned char )from[i+1];\n      if (c < 0x20 || c >= 0x7f || c == 0x5c || c == 0x22) {\n        sprintf(q, \"\\\\\\\\%03o\", c);\n        q += 4;\n      }\n      else {\n        sprintf(q, \"%c\", c);\n        q++;\n      }\n    }\n    else {\n      sprintf(q, \"\\\\\\\\%03o\", c);\n      q += 4;\n      c = (unsigned char )from[i+1];\n      sprintf(q, \"\\\\\\\\%03o\", c);\n      q += 4;\n    }\n  }\n\n  *q = 0;\n}\n\nstatic void xx(char* pattern, char* str, int from, int to, int mem, int not)\n{\n  int r;\n  char cpat[4000], cstr[4000];\n\n#ifdef POSIX_TEST\n  regex_t reg;\n  char buf[200];\n  regmatch_t pmatch[20];\n\n  uconv(pattern, cpat, ulen(pattern));\n  uconv(str,     cstr, ulen(str));\n\n  r = regcomp(&reg, pattern, REG_EXTENDED | REG_NEWLINE);\n  if (r) {\n    regerror(r, &reg, buf, sizeof(buf));\n    fprintf(err_file, \"ERROR: %s\\\\n\", buf);\n    nerror++;\n    return ;\n  }\n\n  r = regexec(&reg, str, reg.re_nsub + 1, pmatch, 0);\n  if (r != 0 && r != REG_NOMATCH) {\n    regerror(r, &reg, buf, sizeof(buf));\n    fprintf(err_file, \"ERROR: %s\\\\n\", buf);\n    nerror++;\n    return ;\n  }\n\n  if (r == REG_NOMATCH) {\n    if (not) {\n      fprintf(stdout, \"OK(N): /%s/ '%s'\\\\n\", cpat, cstr);\n      nsucc++;\n    }\n    else {\n      fprintf(stdout, \"FAIL: /%s/ '%s'\\\\n\", cpat, cstr);\n      nfail++;\n    }\n  }\n  else {\n    if (not) {\n      fprintf(stdout, \"FAIL(N): /%s/ '%s'\\\\n\", cpat, cstr);\n      nfail++;\n    }\n    else {\n      if (pmatch[mem].rm_so == from && pmatch[mem].rm_eo == to) {\n        fprintf(stdout, \"OK: /%s/ '%s'\\\\n\", cpat, cstr);\n        nsucc++;\n      }\n      else {\n        fprintf(stdout, \"FAIL: /%s/ '%s' %d-%d : %d-%d\\\\n\", cpat, cstr,\n\t        from, to, pmatch[mem].rm_so, pmatch[mem].rm_eo);\n        nfail++;\n      }\n    }\n  }\n  regfree(&reg);\n\n#else\n  regex_t* reg;\n  OnigCompileInfo ci;\n  OnigErrorInfo einfo;\n  OnigSyntaxType syn = *ONIG_SYNTAX_DEFAULT;\n\n  /* ONIG_OPTION_OFF(syn.options, ONIG_OPTION_ASCII_RANGE); */\n\n  uconv(pattern, cpat, ulen(pattern));\n  uconv(str,     cstr, ulen(str));\n\n#if 0\n  r = onig_new(&reg, (UChar* )pattern, (UChar* )(pattern + ulen(pattern)),\n\t       ONIG_OPTION_DEFAULT, ENC, &syn, &einfo);\n#else\n  ci.num_of_elements = 5;\n  ci.pattern_enc = ENC;\n  ci.target_enc  = ENC;\n  ci.syntax      = &syn;\n  ci.option      = ONIG_OPTION_DEFAULT;\n  ci.case_fold_flag = ONIGENC_CASE_FOLD_DEFAULT;\n\n  r = onig_new_deluxe(&reg, (UChar* )pattern,\n          (UChar* )(pattern + ulen(pattern)),\n          &ci, &einfo);\n#endif\n\n  if (r) {\n    char s[ONIG_MAX_ERROR_MESSAGE_LEN];\n    onig_error_code_to_str(s, r, &einfo);\n    fprintf(err_file, \"ERROR: %s\\\\n\", s);\n    nerror++;\n    return ;\n  }\n\n  r = onig_search(reg, (UChar* )str, (UChar* )(str + ulen(str)),\n\t\t  (UChar* )str, (UChar* )(str + ulen(str)),\n\t\t  region, ONIG_OPTION_NONE);\n  if (r < ONIG_MISMATCH) {\n    char s[ONIG_MAX_ERROR_MESSAGE_LEN];\n    onig_error_code_to_str(s, r);\n    fprintf(err_file, \"ERROR: %s\\\\n\", s);\n    nerror++;\n    return ;\n  }\n\n  if (r == ONIG_MISMATCH) {\n    if (not) {\n      fprintf(stdout, \"OK(N): /%s/ '%s'\\\\n\", cpat, cstr);\n      nsucc++;\n    }\n    else {\n      fprintf(stdout, \"FAIL: /%s/ '%s'\\\\n\", cpat, cstr);\n      nfail++;\n    }\n  }\n  else {\n    if (not) {\n      fprintf(stdout, \"FAIL(N): /%s/ '%s'\\\\n\", cpat, cstr);\n      nfail++;\n    }\n    else {\n      if (region->beg[mem] == from && region->end[mem] == to) {\n        fprintf(stdout, \"OK: /%s/ '%s'\\\\n\", cpat, cstr);\n        nsucc++;\n      }\n      else {\n        fprintf(stdout, \"FAIL: /%s/ '%s' %d-%d : %d-%d\\\\n\", cpat, cstr,\n\t        from, to, region->beg[mem], region->end[mem]);\n        nfail++;\n      }\n    }\n  }\n  onig_free(reg);\n#endif\n}\n\nstatic void x2(char* pattern, char* str, int from, int to)\n{\n  xx(pattern, str, from, to, 0, 0);\n}\n\nstatic void x3(char* pattern, char* str, int from, int to, int mem)\n{\n  xx(pattern, str, from, to, mem, 0);\n}\n\nstatic void n(char* pattern, char* str)\n{\n  xx(pattern, str, 0, 0, 0, 1);\n}\n\nextern int main(int argc, char* argv[])\n{\n  err_file = stdout;\n\n#ifndef POSIX_TEST\n  region = onig_region_new();\n#endif\nEOS\n\n\nPAT = '\\\\/([^\\\\\\\\\\\\/]*(?:\\\\\\\\.[^\\\\\\\\\\\\/]*)*)\\\\/'\nCM  = /\\s*,\\s*/\nRX2 = %r{\\Ax\\(#{PAT}#{CM}('[^']*'|\"[^\"]*\")#{CM}(\\S+)#{CM}(\\S+)\\)}\nRI2 = %r{\\Ai\\(#{PAT}#{CM}('[^']*'|\"[^\"]*\")#{CM}(\\S+)#{CM}(\\S+)\\)}\nRX3 = %r{\\Ax\\(#{PAT}#{CM}('[^']*'|\"[^\"]*\")#{CM}(\\S+)#{CM}(\\S+)#{CM}(\\S+)\\)}\nRN  = %r{\\An\\(#{PAT}#{CM}('[^']*'|\"[^\"]*\")\\)} #'\n\ndef convert(endian, fp)\n\n  if (endian == BIG_ENDIAN)\n    se = 'BE'\n  else\n    se = 'LE'\n  end\n\n  print(<<\"EOS\")\n#ifdef POSIX_TEST\n  reg_set_encoding(REG_POSIX_ENCODING_UTF16_#{se});\n#else\n  ENC = ONIG_ENCODING_UTF16_#{se};\n#endif\nEOS\n\n  while line = fp.gets()\n    if (m = RX2.match(line))\n      reg = conv_reg(endian, m[1])\n      str, from, to = conv_str(endian, m[2], m[3], m[4])\n      printf(\"  x2(\\\"%s\\\", \\\"%s\\\", %s, %s);\\n\", reg, str, from, to)\n    elsif (m = RI2.match(line))\n      reg = conv_reg(endian, m[1])\n      str, from, to = conv_str(endian, m[2], m[3], m[4])\n      printf(\"  x2(\\\"%s\\\", \\\"%s\\\", %s, %s);\\n\", reg, str, from, to)\n    elsif (m = RX3.match(line))\n      reg = conv_reg(endian, m[1])\n      str, from, to = conv_str(endian, m[2], m[3], m[4])\n      printf(\"  x3(\\\"%s\\\", \\\"%s\\\", %s, %s, %s);\\n\", reg, str, from, to, m[5])\n    elsif (m = RN.match(line))\n      reg = conv_reg(endian, m[1])\n      str, from, to = conv_str(endian, m[2], 0, 0)\n      printf(\"  n(\\\"%s\\\", \\\"%s\\\");\\n\", reg, str)\n    else\n    end\n  end\nend\n\nFile::open(ARGV[0]) { |fp|\n  convert(BIG_ENDIAN, fp)\n}\n\n#File::open(ARGV[0]) { |fp|\n#  convert(LITTLE_ENDIAN, fp)\n#}\n\nICV_BE.close\nICV_LE.close\n\nprint(<<'EOS')\n  fprintf(stdout,\n       \"\\nRESULT   SUCC: %d,  FAIL: %d,  ERROR: %d      (by Onigmo %s)\\n\",\n       nsucc, nfail, nerror, onig_version());\n\n#ifndef POSIX_TEST\n  onig_region_free(region, 1);\n  onig_end();\n#endif\n\n  return ((nfail == 0 && nerror == 0) ? 0 : -1);\n}\nEOS\n\n# END OF SCRIPT\n"
  },
  {
    "path": "src/Onigmo/testpy.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\nfrom __future__ import print_function, unicode_literals\nfrom ctypes import *\nimport onig\nimport sys\nimport io\nimport locale\n\nnerror = 0\nnsucc = 0\nnfail = 0\nregion = 0\n\nonig_encoding = onig.ONIG_ENCODING_EUC_JP\nencoding = onig_encoding[0].name.decode()\n\nclass strptr:\n    \"\"\"a helper class to get a pointer to a string\"\"\"\n    def __init__(self, s):\n        if not isinstance(s, bytes):\n            raise TypeError\n        self._str = s\n        try:\n            self._ptr = cast(self._str, c_void_p)   # CPython 2.x/3.x\n        except TypeError:\n            self._ptr = c_void_p(self._str)         # PyPy 1.x\n\n    def getptr(self, offset=0):\n        if offset == -1:    # -1 means the end of the string\n            offset = len(self._str)\n        elif offset > len(self._str):\n            raise IndexError\n        return self._ptr.value + offset\n\ndef cc_to_cb(s, enc, cc):\n    \"\"\"convert char count to byte count\n\n    arguments:\n      s -- unicode string\n      enc -- encoding name\n      cc -- char count\n    \"\"\"\n    s = s.encode('UTF-32LE')\n    clen = cc * 4\n    if clen > len(s):\n        raise IndexError\n    return len(s[:clen].decode('UTF-32LE').encode(enc))\n\ndef print_result(result, pattern, file=None):\n    if not file:\n        file = sys.stdout\n    print(result + \": \", end='', file=file)\n    try:\n        print(pattern, file=file)\n    except UnicodeEncodeError as e:\n        print('(' + str(e) + ')')\n\ndef xx(pattern, target, s_from, s_to, mem, not_match):\n    global nerror\n    global nsucc\n    global nfail\n    global region\n\n    reg = onig.OnigRegex()\n    einfo = onig.OnigErrorInfo()\n    syn = onig.OnigSyntaxType()\n    msg = create_string_buffer(onig.ONIG_MAX_ERROR_MESSAGE_LEN)\n\n    pattern2 = pattern\n    if not isinstance(pattern, bytes):\n        pattern2 = pattern.encode(encoding)\n    patternp = strptr(pattern2)\n\n    target2 = target\n    if not isinstance(target, bytes):\n        s_from = cc_to_cb(target, encoding, s_from)\n        s_to = cc_to_cb(target, encoding, s_to)\n        target2 = target.encode(encoding)\n    targetp = strptr(target2)\n\n    # special syntactic settings\n    onig.onig_copy_syntax(byref(syn), onig.ONIG_SYNTAX_DEFAULT)\n    syn.options &= ~onig.ONIG_OPTION_ASCII_RANGE\n    syn.behavior &= ~onig.ONIG_SYN_POSIX_BRACKET_ALWAYS_ALL_RANGE\n\n    r = onig.onig_new(byref(reg), patternp.getptr(), patternp.getptr(-1),\n            onig.ONIG_OPTION_DEFAULT, onig_encoding, byref(syn), byref(einfo));\n    if r != 0:\n        onig.onig_error_code_to_str(msg, r, byref(einfo))\n        nerror += 1\n        print_result(\"ERROR\", \"%s (/%s/ '%s')\" % (msg.value, pattern, target),\n                file=sys.stderr)\n        return\n\n    r = onig.onig_search(reg, targetp.getptr(), targetp.getptr(-1),\n                    targetp.getptr(), targetp.getptr(-1),\n                    region, onig.ONIG_OPTION_NONE);\n    if r < onig.ONIG_MISMATCH:\n        onig.onig_error_code_to_str(msg, r)\n        nerror += 1\n        print_result(\"ERROR\", \"%s (/%s/ '%s')\" % (msg.value, pattern, target),\n                file=sys.stderr)\n        return\n\n    if r == onig.ONIG_MISMATCH:\n        if not_match:\n            nsucc += 1\n            print_result(\"OK(N)\", \"/%s/ '%s'\" % (pattern, target))\n        else:\n            nfail += 1\n            print_result(\"FAIL\", \"/%s/ '%s'\" % (pattern, target))\n    else:\n        if not_match:\n            nfail += 1\n            print_result(\"FAIL(N)\", \"/%s/ '%s'\" % (pattern, target))\n        else:\n            start = region[0].beg[mem]\n            end = region[0].end[mem]\n            if (start == s_from) and (end == s_to):\n                nsucc += 1\n                print_result(\"OK\", \"/%s/ '%s'\" % (pattern, target))\n            else:\n                nfail += 1\n                print_result(\"FAIL\", \"/%s/ '%s' %d-%d : %d-%d\" % (pattern, target,\n                        s_from, s_to, start, end))\n    onig.onig_free(reg)\n\ndef x2(pattern, target, s_from, s_to):\n    xx(pattern, target, s_from, s_to, 0, False)\n\ndef x3(pattern, target, s_from, s_to, mem):\n    xx(pattern, target, s_from, s_to, mem, False)\n\ndef n(pattern, target):\n    xx(pattern, target, 0, 0, 0, True)\n\n\ndef is_unicode_encoding(enc):\n    return enc in (onig.ONIG_ENCODING_UTF16_LE,\n                   onig.ONIG_ENCODING_UTF16_BE,\n                   onig.ONIG_ENCODING_UTF8)\n\ndef main():\n    global region\n    global onig_encoding\n    global encoding\n\n    region = onig.onig_region_new()\n\n    # set encoding of the test target\n    if len(sys.argv) > 1:\n        encs = {\"EUC-JP\": onig.ONIG_ENCODING_EUC_JP,\n                \"SJIS\": onig.ONIG_ENCODING_SJIS,\n                \"UTF-8\": onig.ONIG_ENCODING_UTF8,\n                \"UTF-16LE\": onig.ONIG_ENCODING_UTF16_LE,\n                \"UTF-16BE\": onig.ONIG_ENCODING_UTF16_BE}\n        try:\n            onig_encoding = encs[sys.argv[1]]\n        except KeyError:\n            print(\"test target encoding error\")\n            print(\"Usage: python testpy.py [test target encoding] [output encoding]\")\n            sys.exit()\n        encoding = onig_encoding[0].name.decode()\n\n    # set encoding of stdout/stderr\n    if len(sys.argv) > 2:\n        outenc = sys.argv[2]\n    else:\n        outenc = locale.getpreferredencoding()\n\n    def get_text_writer(fileno, **kwargs):\n        kw = dict(kwargs)\n        kw.setdefault('errors', 'backslashreplace')\n        kw.setdefault('closefd', False)\n        writer = io.open(fileno, mode='w', **kw)\n\n        # work around for Python 2.x\n        write = writer.write    # save the original write() function\n        enc = locale.getpreferredencoding()\n        writer.write = lambda s: write(s.decode(enc)) \\\n                if isinstance(s, bytes) else write(s)  # convert to unistr\n        return writer\n\n    sys.stdout = get_text_writer(sys.stdout.fileno(), encoding=outenc)\n    sys.stderr = get_text_writer(sys.stderr.fileno(), encoding=outenc)\n\n    # Copied from onig-5.9.2/testc.c\n    #   '?\\?' which is used to avoid trigraph is replaced by '??'.\n    #   Match positions are specified by unit of character instead of byte.\n\n    x2(\"\", \"\", 0, 0);\n    x2(\"^\", \"\", 0, 0);\n    x2(\"$\", \"\", 0, 0);\n    x2(\"\\\\G\", \"\", 0, 0);\n    x2(\"\\\\A\", \"\", 0, 0);\n    x2(\"\\\\Z\", \"\", 0, 0);\n    x2(\"\\\\z\", \"\", 0, 0);\n    x2(\"^$\", \"\", 0, 0);\n    x2(\"\\\\ca\", \"\\001\", 0, 1);\n    x2(\"\\\\C-b\", \"\\002\", 0, 1);\n    x2(\"\\\\c\\\\\\\\\", \"\\034\", 0, 1);\n    x2(\"q[\\\\c\\\\\\\\]\", \"q\\034\", 0, 2);\n    x2(\"\", \"a\", 0, 0);\n    x2(\"a\", \"a\", 0, 1);\n    if onig_encoding == onig.ONIG_ENCODING_UTF16_LE:\n        x2(\"\\\\x61\\\\x00\", \"a\", 0, 1);\n    elif onig_encoding == onig.ONIG_ENCODING_UTF16_BE:\n        x2(\"\\\\x00\\\\x61\", \"a\", 0, 1);\n    else:\n        x2(\"\\\\x61\", \"a\", 0, 1);\n    x2(\"aa\", \"aa\", 0, 2);\n    x2(\"aaa\", \"aaa\", 0, 3);\n    x2(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\", \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\", 0, 35);\n    x2(\"ab\", \"ab\", 0, 2);\n    x2(\"b\", \"ab\", 1, 2);\n    x2(\"bc\", \"abc\", 1, 3);\n    x2(\"(?i:#RET#)\", \"#INS##RET#\", 5, 10);\n    if onig_encoding == onig.ONIG_ENCODING_UTF16_LE:\n        x2(\"\\\\17\\\\00\", \"\\017\", 0, 1);\n        x2(\"\\\\x1f\\\\x00\", \"\\x1f\", 0, 1);\n    elif onig_encoding == onig.ONIG_ENCODING_UTF16_BE:\n        x2(\"\\\\00\\\\17\", \"\\017\", 0, 1);\n        x2(\"\\\\x00\\\\x1f\", \"\\x1f\", 0, 1);\n    else:\n        x2(\"\\\\17\", \"\\017\", 0, 1);\n        x2(\"\\\\x1f\", \"\\x1f\", 0, 1);\n    x2(\"a(?#....\\\\\\\\JJJJ)b\", \"ab\", 0, 2);\n    x2(\"(?x)  G (o O(?-x)oO) g L\", \"GoOoOgLe\", 0, 7);\n    x2(\".\", \"a\", 0, 1);\n    n(\".\", \"\");\n    x2(\"..\", \"ab\", 0, 2);\n    x2(\"\\\\w\", \"e\", 0, 1);\n    n(\"\\\\W\", \"e\");\n    x2(\"\\\\s\", \" \", 0, 1);\n    x2(\"\\\\S\", \"b\", 0, 1);\n    x2(\"\\\\d\", \"4\", 0, 1);\n    n(\"\\\\D\", \"4\");\n    x2(\"\\\\b\", \"z \", 0, 0);\n    x2(\"\\\\b\", \" z\", 1, 1);\n    x2(\"\\\\B\", \"zz \", 1, 1);\n    x2(\"\\\\B\", \"z \", 2, 2);\n    x2(\"\\\\B\", \" z\", 0, 0);\n    x2(\"[ab]\", \"b\", 0, 1);\n    n(\"[ab]\", \"c\");\n    x2(\"[a-z]\", \"t\", 0, 1);\n    n(\"[^a]\", \"a\");\n    x2(\"[^a]\", \"\\n\", 0, 1);\n    x2(\"[]]\", \"]\", 0, 1);\n    n(\"[^]]\", \"]\");\n    x2(\"[\\\\^]+\", \"0^^1\", 1, 3);\n    x2(\"[b-]\", \"b\", 0, 1);\n    x2(\"[b-]\", \"-\", 0, 1);\n    x2(\"[\\\\w]\", \"z\", 0, 1);\n    n(\"[\\\\w]\", \" \");\n    x2(\"[\\\\W]\", \"b$\", 1, 2);\n    x2(\"[\\\\d]\", \"5\", 0, 1);\n    n(\"[\\\\d]\", \"e\");\n    x2(\"[\\\\D]\", \"t\", 0, 1);\n    n(\"[\\\\D]\", \"3\");\n    x2(\"[\\\\s]\", \" \", 0, 1);\n    n(\"[\\\\s]\", \"a\");\n    x2(\"[\\\\S]\", \"b\", 0, 1);\n    n(\"[\\\\S]\", \" \");\n    x2(\"[\\\\w\\\\d]\", \"2\", 0, 1);\n    n(\"[\\\\w\\\\d]\", \" \");\n    x2(\"[[:upper:]]\", \"B\", 0, 1);\n    x2(\"[*[:xdigit:]+]\", \"+\", 0, 1);\n    x2(\"[*[:xdigit:]+]\", \"GHIKK-9+*\", 6, 7);\n    x2(\"[*[:xdigit:]+]\", \"-@^+\", 3, 4);\n    n(\"[[:upper]]\", \"A\");\n    x2(\"[[:upper]]\", \":\", 0, 1);\n    if onig_encoding == onig.ONIG_ENCODING_UTF16_LE:\n        x2(\"[\\\\044\\\\000-\\\\047\\\\000]\", \"\\046\", 0, 1);\n        x2(\"[\\\\x5a\\\\x00-\\\\x5c\\\\x00]\", \"\\x5b\", 0, 1);\n        x2(\"[\\\\x6A\\\\x00-\\\\x6D\\\\x00]\", \"\\x6c\", 0, 1);\n        n(\"[\\\\x6A\\\\x00-\\\\x6D\\\\x00]\", \"\\x6E\");\n    elif onig_encoding == onig.ONIG_ENCODING_UTF16_BE:\n        x2(\"[\\\\000\\\\044-\\\\000\\\\047]\", \"\\046\", 0, 1);\n        x2(\"[\\\\x00\\\\x5a-\\\\x00\\\\x5c]\", \"\\x5b\", 0, 1);\n        x2(\"[\\\\x00\\\\x6A-\\\\x00\\\\x6D]\", \"\\x6c\", 0, 1);\n        n(\"[\\\\x00\\\\x6A-\\\\x00\\\\x6D]\", \"\\x6E\");\n    else:\n        x2(\"[\\\\044-\\\\047]\", \"\\046\", 0, 1);\n        x2(\"[\\\\x5a-\\\\x5c]\", \"\\x5b\", 0, 1);\n        x2(\"[\\\\x6A-\\\\x6D]\", \"\\x6c\", 0, 1);\n        n(\"[\\\\x6A-\\\\x6D]\", \"\\x6E\");\n    n(\"^[0-9A-F]+ 0+ UNDEF \", \"75F 00000000 SECT14A notype ()    External    | _rb_apply\");\n    x2(\"[\\\\[]\", \"[\", 0, 1);\n    x2(\"[\\\\]]\", \"]\", 0, 1);\n    x2(\"[&]\", \"&\", 0, 1);\n    x2(\"[[ab]]\", \"b\", 0, 1);\n    x2(\"[[ab]c]\", \"c\", 0, 1);\n    n(\"[[^a]]\", \"a\");\n    n(\"[^[a]]\", \"a\");\n    x2(\"[[ab]&&bc]\", \"b\", 0, 1);\n    n(\"[[ab]&&bc]\", \"a\");\n    n(\"[[ab]&&bc]\", \"c\");\n    x2(\"[a-z&&b-y&&c-x]\", \"w\", 0, 1);\n    n(\"[^a-z&&b-y&&c-x]\", \"w\");\n    x2(\"[[^a&&a]&&a-z]\", \"b\", 0, 1);\n    n(\"[[^a&&a]&&a-z]\", \"a\");\n    x2(\"[[^a-z&&bcdef]&&[^c-g]]\", \"h\", 0, 1);\n    n(\"[[^a-z&&bcdef]&&[^c-g]]\", \"c\");\n    x2(\"[^[^abc]&&[^cde]]\", \"c\", 0, 1);\n    x2(\"[^[^abc]&&[^cde]]\", \"e\", 0, 1);\n    n(\"[^[^abc]&&[^cde]]\", \"f\");\n    x2(\"[a-&&-a]\", \"-\", 0, 1);\n    n(\"[a\\\\-&&\\\\-a]\", \"&\");\n    n(\"\\\\wabc\", \" abc\");\n    x2(\"a\\\\Wbc\", \"a bc\", 0, 4);\n    x2(\"a.b.c\", \"aabbc\", 0, 5);\n    x2(\".\\\\wb\\\\W..c\", \"abb bcc\", 0, 7);\n    x2(\"\\\\s\\\\wzzz\", \" zzzz\", 0, 5);\n    x2(\"aa.b\", \"aabb\", 0, 4);\n    n(\".a\", \"ab\");\n    x2(\".a\", \"aa\", 0, 2);\n    x2(\"^a\", \"a\", 0, 1);\n    x2(\"^a$\", \"a\", 0, 1);\n    x2(\"^\\\\w$\", \"a\", 0, 1);\n    n(\"^\\\\w$\", \" \");\n    x2(\"^\\\\wab$\", \"zab\", 0, 3);\n    x2(\"^\\\\wabcdef$\", \"zabcdef\", 0, 7);\n    x2(\"^\\\\w...def$\", \"zabcdef\", 0, 7);\n    x2(\"\\\\w\\\\w\\\\s\\\\Waaa\\\\d\", \"aa  aaa4\", 0, 8);\n    x2(\"\\\\A\\\\Z\", \"\", 0, 0);\n    x2(\"\\\\Axyz\", \"xyz\", 0, 3);\n    x2(\"xyz\\\\Z\", \"xyz\", 0, 3);\n    x2(\"xyz\\\\z\", \"xyz\", 0, 3);\n    x2(\"a\\\\Z\", \"a\", 0, 1);\n    x2(\"\\\\Gaz\", \"az\", 0, 2);\n    n(\"\\\\Gz\", \"bza\");\n    n(\"az\\\\G\", \"az\");\n    n(\"az\\\\A\", \"az\");\n    n(\"a\\\\Az\", \"az\");\n    x2(\"\\\\^\\\\$\", \"^$\", 0, 2);\n    x2(\"^x?y\", \"xy\", 0, 2);\n    x2(\"^(x?y)\", \"xy\", 0, 2);\n    x2(\"\\\\w\", \"_\", 0, 1);\n    n(\"\\\\W\", \"_\");\n    x2(\"(?=z)z\", \"z\", 0, 1);\n    n(\"(?=z).\", \"a\");\n    x2(\"(?!z)a\", \"a\", 0, 1);\n    n(\"(?!z)a\", \"z\");\n    x2(\"(?i:a)\", \"a\", 0, 1);\n    x2(\"(?i:a)\", \"A\", 0, 1);\n    x2(\"(?i:A)\", \"a\", 0, 1);\n    n(\"(?i:A)\", \"b\");\n    x2(\"(?i:[A-Z])\", \"a\", 0, 1);\n    x2(\"(?i:[f-m])\", \"H\", 0, 1);\n    x2(\"(?i:[f-m])\", \"h\", 0, 1);\n    n(\"(?i:[f-m])\", \"e\");\n    x2(\"(?i:[A-c])\", \"D\", 0, 1);\n    n(\"(?i:[^a-z])\", \"A\");\n    n(\"(?i:[^a-z])\", \"a\");\n    x2(\"(?i:[!-k])\", \"Z\", 0, 1);\n    x2(\"(?i:[!-k])\", \"7\", 0, 1);\n    x2(\"(?i:[T-}])\", \"b\", 0, 1);\n    x2(\"(?i:[T-}])\", \"{\", 0, 1);\n    x2(\"(?i:\\\\?a)\", \"?A\", 0, 2);\n    x2(\"(?i:\\\\*A)\", \"*a\", 0, 2);\n    n(\".\", \"\\n\");\n    x2(\"(?m:.)\", \"\\n\", 0, 1);\n    x2(\"(?m:a.)\", \"a\\n\", 0, 2);\n    x2(\"(?m:.b)\", \"a\\nb\", 1, 3);\n    x2(\".*abc\", \"dddabdd\\nddabc\", 8, 13);\n    x2(\"(?m:.*abc)\", \"dddabddabc\", 0, 10);\n    n(\"(?i)(?-i)a\", \"A\");\n    n(\"(?i)(?-i:a)\", \"A\");\n    x2(\"a?\", \"\", 0, 0);\n    x2(\"a?\", \"b\", 0, 0);\n    x2(\"a?\", \"a\", 0, 1);\n    x2(\"a*\", \"\", 0, 0);\n    x2(\"a*\", \"a\", 0, 1);\n    x2(\"a*\", \"aaa\", 0, 3);\n    x2(\"a*\", \"baaaa\", 0, 0);\n    n(\"a+\", \"\");\n    x2(\"a+\", \"a\", 0, 1);\n    x2(\"a+\", \"aaaa\", 0, 4);\n    x2(\"a+\", \"aabbb\", 0, 2);\n    x2(\"a+\", \"baaaa\", 1, 5);\n    x2(\".?\", \"\", 0, 0);\n    x2(\".?\", \"f\", 0, 1);\n    x2(\".?\", \"\\n\", 0, 0);\n    x2(\".*\", \"\", 0, 0);\n    x2(\".*\", \"abcde\", 0, 5);\n    x2(\".+\", \"z\", 0, 1);\n    x2(\".+\", \"zdswer\\n\", 0, 6);\n    x2(\"(.*)a\\\\1f\", \"babfbac\", 0, 4);\n    x2(\"(.*)a\\\\1f\", \"bacbabf\", 3, 7);\n    x2(\"((.*)a\\\\2f)\", \"bacbabf\", 3, 7);\n    x2(\"(.*)a\\\\1f\", \"baczzzzzz\\nbazz\\nzzzzbabf\", 19, 23);\n    x2(\"a|b\", \"a\", 0, 1);\n    x2(\"a|b\", \"b\", 0, 1);\n    x2(\"|a\", \"a\", 0, 0);\n    x2(\"(|a)\", \"a\", 0, 0);\n    x2(\"ab|bc\", \"ab\", 0, 2);\n    x2(\"ab|bc\", \"bc\", 0, 2);\n    x2(\"z(?:ab|bc)\", \"zbc\", 0, 3);\n    x2(\"a(?:ab|bc)c\", \"aabc\", 0, 4);\n    x2(\"ab|(?:ac|az)\", \"az\", 0, 2);\n    x2(\"a|b|c\", \"dc\", 1, 2);\n    x2(\"a|b|cd|efg|h|ijk|lmn|o|pq|rstuvwx|yz\", \"pqr\", 0, 2);\n    n(\"a|b|cd|efg|h|ijk|lmn|o|pq|rstuvwx|yz\", \"mn\");\n    x2(\"a|^z\", \"ba\", 1, 2);\n    x2(\"a|^z\", \"za\", 0, 1);\n    x2(\"a|\\\\Gz\", \"bza\", 2, 3);\n    x2(\"a|\\\\Gz\", \"za\", 0, 1);\n    x2(\"a|\\\\Az\", \"bza\", 2, 3);\n    x2(\"a|\\\\Az\", \"za\", 0, 1);\n    x2(\"a|b\\\\Z\", \"ba\", 1, 2);\n    x2(\"a|b\\\\Z\", \"b\", 0, 1);\n    x2(\"a|b\\\\z\", \"ba\", 1, 2);\n    x2(\"a|b\\\\z\", \"b\", 0, 1);\n    x2(\"\\\\w|\\\\s\", \" \", 0, 1);\n    n(\"\\\\w|\\\\w\", \" \");\n    x2(\"\\\\w|%\", \"%\", 0, 1);\n    x2(\"\\\\w|[&$]\", \"&\", 0, 1);\n    x2(\"[b-d]|[^e-z]\", \"a\", 0, 1);\n    x2(\"(?:a|[c-f])|bz\", \"dz\", 0, 1);\n    x2(\"(?:a|[c-f])|bz\", \"bz\", 0, 2);\n    x2(\"abc|(?=zz)..f\", \"zzf\", 0, 3);\n    x2(\"abc|(?!zz)..f\", \"abf\", 0, 3);\n    x2(\"(?=za)..a|(?=zz)..a\", \"zza\", 0, 3);\n    n(\"(?>a|abd)c\", \"abdc\");\n    x2(\"(?>abd|a)c\", \"abdc\", 0, 4);\n    x2(\"a?|b\", \"a\", 0, 1);\n    x2(\"a?|b\", \"b\", 0, 0);\n    x2(\"a?|b\", \"\", 0, 0);\n    x2(\"a*|b\", \"aa\", 0, 2);\n    x2(\"a*|b*\", \"ba\", 0, 0);\n    x2(\"a*|b*\", \"ab\", 0, 1);\n    x2(\"a+|b*\", \"\", 0, 0);\n    x2(\"a+|b*\", \"bbb\", 0, 3);\n    x2(\"a+|b*\", \"abbb\", 0, 1);\n    n(\"a+|b+\", \"\");\n    x2(\"(a|b)?\", \"b\", 0, 1);\n    x2(\"(a|b)*\", \"ba\", 0, 2);\n    x2(\"(a|b)+\", \"bab\", 0, 3);\n    x2(\"(ab|ca)+\", \"caabbc\", 0, 4);\n    x2(\"(ab|ca)+\", \"aabca\", 1, 5);\n    x2(\"(ab|ca)+\", \"abzca\", 0, 2);\n    x2(\"(a|bab)+\", \"ababa\", 0, 5);\n    x2(\"(a|bab)+\", \"ba\", 1, 2);\n    x2(\"(a|bab)+\", \"baaaba\", 1, 4);\n    x2(\"(?:a|b)(?:a|b)\", \"ab\", 0, 2);\n    x2(\"(?:a*|b*)(?:a*|b*)\", \"aaabbb\", 0, 3);\n    x2(\"(?:a*|b*)(?:a+|b+)\", \"aaabbb\", 0, 6);\n    x2(\"(?:a+|b+){2}\", \"aaabbb\", 0, 6);\n    x2(\"h{0,}\", \"hhhh\", 0, 4);\n    x2(\"(?:a+|b+){1,2}\", \"aaabbb\", 0, 6);\n    n(\"ax{2}*a\", \"0axxxa1\");\n    n(\"a.{0,2}a\", \"0aXXXa0\");\n    n(\"a.{0,2}?a\", \"0aXXXa0\");\n    n(\"a.{0,2}?a\", \"0aXXXXa0\");\n    x2(\"^a{2,}?a$\", \"aaa\", 0, 3);\n    x2(\"^[a-z]{2,}?$\", \"aaa\", 0, 3);\n    x2(\"(?:a+|\\\\Ab*)cc\", \"cc\", 0, 2);\n    n(\"(?:a+|\\\\Ab*)cc\", \"abcc\");\n    x2(\"(?:^a+|b+)*c\", \"aabbbabc\", 6, 8);\n    x2(\"(?:^a+|b+)*c\", \"aabbbbc\", 0, 7);\n    x2(\"a|(?i)c\", \"C\", 0, 1);\n    x2(\"(?i)c|a\", \"C\", 0, 1);\n    x2(\"(?i)c|a\", \"A\", 0, 1);\n    x2(\"(?i:c)|a\", \"C\", 0, 1);\n    n(\"(?i:c)|a\", \"A\");\n    x2(\"[abc]?\", \"abc\", 0, 1);\n    x2(\"[abc]*\", \"abc\", 0, 3);\n    x2(\"[^abc]*\", \"abc\", 0, 0);\n    n(\"[^abc]+\", \"abc\");\n    x2(\"a??\", \"aaa\", 0, 0);\n    x2(\"ba??b\", \"bab\", 0, 3);\n    x2(\"a*?\", \"aaa\", 0, 0);\n    x2(\"ba*?\", \"baa\", 0, 1);\n    x2(\"ba*?b\", \"baab\", 0, 4);\n    x2(\"a+?\", \"aaa\", 0, 1);\n    x2(\"ba+?\", \"baa\", 0, 2);\n    x2(\"ba+?b\", \"baab\", 0, 4);\n    x2(\"(?:a?)??\", \"a\", 0, 0);\n    x2(\"(?:a??)?\", \"a\", 0, 0);\n    x2(\"(?:a?)+?\", \"aaa\", 0, 1);\n    x2(\"(?:a+)??\", \"aaa\", 0, 0);\n    x2(\"(?:a+)??b\", \"aaab\", 0, 4);\n    x2(\"(?:ab)?{2}\", \"\", 0, 0);\n    x2(\"(?:ab)?{2}\", \"ababa\", 0, 4);\n    x2(\"(?:ab)*{0}\", \"ababa\", 0, 0);\n    x2(\"(?:ab){3,}\", \"abababab\", 0, 8);\n    n(\"(?:ab){3,}\", \"abab\");\n    x2(\"(?:ab){2,4}\", \"ababab\", 0, 6);\n    x2(\"(?:ab){2,4}\", \"ababababab\", 0, 8);\n    x2(\"(?:ab){2,4}?\", \"ababababab\", 0, 4);\n    x2(\"(?:ab){,}\", \"ab{,}\", 0, 5);\n    x2(\"(?:abc)+?{2}\", \"abcabcabc\", 0, 6);\n    x2(\"(?:X*)(?i:xa)\", \"XXXa\", 0, 4);\n    x2(\"(d+)([^abc]z)\", \"dddz\", 0, 4);\n    x2(\"([^abc]*)([^abc]z)\", \"dddz\", 0, 4);\n    x2(\"(\\\\w+)(\\\\wz)\", \"dddz\", 0, 4);\n    x3(\"(a)\", \"a\", 0, 1, 1);\n    x3(\"(ab)\", \"ab\", 0, 2, 1);\n    x2(\"((ab))\", \"ab\", 0, 2);\n    x3(\"((ab))\", \"ab\", 0, 2, 1);\n    x3(\"((ab))\", \"ab\", 0, 2, 2);\n    x3(\"((((((((((((((((((((ab))))))))))))))))))))\", \"ab\", 0, 2, 20);\n    x3(\"(ab)(cd)\", \"abcd\", 0, 2, 1);\n    x3(\"(ab)(cd)\", \"abcd\", 2, 4, 2);\n    x3(\"()(a)bc(def)ghijk\", \"abcdefghijk\", 3, 6, 3);\n    x3(\"(()(a)bc(def)ghijk)\", \"abcdefghijk\", 3, 6, 4);\n    x2(\"(^a)\", \"a\", 0, 1);\n    x3(\"(a)|(a)\", \"ba\", 1, 2, 1);\n    x3(\"(^a)|(a)\", \"ba\", 1, 2, 2);\n    x3(\"(a?)\", \"aaa\", 0, 1, 1);\n    x3(\"(a*)\", \"aaa\", 0, 3, 1);\n    x3(\"(a*)\", \"\", 0, 0, 1);\n    x3(\"(a+)\", \"aaaaaaa\", 0, 7, 1);\n    x3(\"(a+|b*)\", \"bbbaa\", 0, 3, 1);\n    x3(\"(a+|b?)\", \"bbbaa\", 0, 1, 1);\n    x3(\"(abc)?\", \"abc\", 0, 3, 1);\n    x3(\"(abc)*\", \"abc\", 0, 3, 1);\n    x3(\"(abc)+\", \"abc\", 0, 3, 1);\n    x3(\"(xyz|abc)+\", \"abc\", 0, 3, 1);\n    x3(\"([xyz][abc]|abc)+\", \"abc\", 0, 3, 1);\n    x3(\"((?i:abc))\", \"AbC\", 0, 3, 1);\n    x2(\"(abc)(?i:\\\\1)\", \"abcABC\", 0, 6);\n    x3(\"((?m:a.c))\", \"a\\nc\", 0, 3, 1);\n    x3(\"((?=az)a)\", \"azb\", 0, 1, 1);\n    x3(\"abc|(.abd)\", \"zabd\", 0, 4, 1);\n    x2(\"(?:abc)|(ABC)\", \"abc\", 0, 3);\n    x3(\"(?i:(abc))|(zzz)\", \"ABC\", 0, 3, 1);\n    x3(\"a*(.)\", \"aaaaz\", 4, 5, 1);\n    x3(\"a*?(.)\", \"aaaaz\", 0, 1, 1);\n    x3(\"a*?(c)\", \"aaaac\", 4, 5, 1);\n    x3(\"[bcd]a*(.)\", \"caaaaz\", 5, 6, 1);\n    x3(\"(\\\\Abb)cc\", \"bbcc\", 0, 2, 1);\n    n(\"(\\\\Abb)cc\", \"zbbcc\");\n    x3(\"(^bb)cc\", \"bbcc\", 0, 2, 1);\n    n(\"(^bb)cc\", \"zbbcc\");\n    x3(\"cc(bb$)\", \"ccbb\", 2, 4, 1);\n    n(\"cc(bb$)\", \"ccbbb\");\n    n(\"(\\\\1)\", \"\");\n    n(\"\\\\1(a)\", \"aa\");\n    n(\"(a(b)\\\\1)\\\\2+\", \"ababb\");\n    n(\"(?:(?:\\\\1|z)(a))+$\", \"zaa\");\n    x2(\"(?:(?:\\\\1|z)(a))+$\", \"zaaa\", 0, 4);\n    x2(\"(a)(?=\\\\1)\", \"aa\", 0, 1);\n    n(\"(a)$|\\\\1\", \"az\");\n    x2(\"(a)\\\\1\", \"aa\", 0, 2);\n    n(\"(a)\\\\1\", \"ab\");\n    x2(\"(a?)\\\\1\", \"aa\", 0, 2);\n    x2(\"(a??)\\\\1\", \"aa\", 0, 0);\n    x2(\"(a*)\\\\1\", \"aaaaa\", 0, 4);\n    x3(\"(a*)\\\\1\", \"aaaaa\", 0, 2, 1);\n    x2(\"a(b*)\\\\1\", \"abbbb\", 0, 5);\n    x2(\"a(b*)\\\\1\", \"ab\", 0, 1);\n    x2(\"(a*)(b*)\\\\1\\\\2\", \"aaabbaaabb\", 0, 10);\n    x2(\"(a*)(b*)\\\\2\", \"aaabbbb\", 0, 7);\n    x2(\"(((((((a*)b))))))c\\\\7\", \"aaabcaaa\", 0, 8);\n    x3(\"(((((((a*)b))))))c\\\\7\", \"aaabcaaa\", 0, 3, 7);\n    x2(\"(a)(b)(c)\\\\2\\\\1\\\\3\", \"abcbac\", 0, 6);\n    x2(\"([a-d])\\\\1\", \"cc\", 0, 2);\n    x2(\"(\\\\w\\\\d\\\\s)\\\\1\", \"f5 f5 \", 0, 6);\n    n(\"(\\\\w\\\\d\\\\s)\\\\1\", \"f5 f5\");\n    x2(\"(who|[a-c]{3})\\\\1\", \"whowho\", 0, 6);\n    x2(\"...(who|[a-c]{3})\\\\1\", \"abcwhowho\", 0, 9);\n    x2(\"(who|[a-c]{3})\\\\1\", \"cbccbc\", 0, 6);\n    x2(\"(^a)\\\\1\", \"aa\", 0, 2);\n    n(\"(^a)\\\\1\", \"baa\");\n    n(\"(a$)\\\\1\", \"aa\");\n    n(\"(ab\\\\Z)\\\\1\", \"ab\");\n    x2(\"(a*\\\\Z)\\\\1\", \"a\", 1, 1);\n    x2(\".(a*\\\\Z)\\\\1\", \"ba\", 1, 2);\n    x3(\"(.(abc)\\\\2)\", \"zabcabc\", 0, 7, 1);\n    x3(\"(.(..\\\\d.)\\\\2)\", \"z12341234\", 0, 9, 1);\n    x2(\"((?i:az))\\\\1\", \"AzAz\", 0, 4);\n    n(\"((?i:az))\\\\1\", \"Azaz\");\n    x2(\"(?<=a)b\", \"ab\", 1, 2);\n    n(\"(?<=a)b\", \"bb\");\n    x2(\"(?<=a|b)b\", \"bb\", 1, 2);\n    x2(\"(?<=a|bc)b\", \"bcb\", 2, 3);\n    x2(\"(?<=a|bc)b\", \"ab\", 1, 2);\n    x2(\"(?<=a|bc||defghij|klmnopq|r)z\", \"rz\", 1, 2);\n    x2(\"(a)\\\\g<1>\", \"aa\", 0, 2);\n    x2(\"(?<!a)b\", \"cb\", 1, 2);\n    n(\"(?<!a)b\", \"ab\");\n    x2(\"(?<!a|bc)b\", \"bbb\", 0, 1);\n    n(\"(?<!a|bc)z\", \"bcz\");\n    x2(\"(?<name1>a)\", \"a\", 0, 1);\n    x2(\"(?<name_2>ab)\\\\g<name_2>\", \"abab\", 0, 4);\n    x2(\"(?<name_3>.zv.)\\\\k<name_3>\", \"azvbazvb\", 0, 8);\n    x2(\"(?<=\\\\g<ab>)|-\\\\zEND (?<ab>XyZ)\", \"XyZ\", 3, 3);\n    x2(\"(?<n>|a\\\\g<n>)+\", \"\", 0, 0);\n    x2(\"(?<n>|\\\\(\\\\g<n>\\\\))+$\", \"()(())\", 0, 6);\n    x3(\"\\\\g<n>(?<n>.){0}\", \"X\", 0, 1, 1);\n    x2(\"\\\\g<n>(abc|df(?<n>.YZ){2,8}){0}\", \"XYZ\", 0, 3);\n    x2(\"\\\\A(?<n>(a\\\\g<n>)|)\\\\z\", \"aaaa\", 0, 4);\n    x2(\"(?<n>|\\\\g<m>\\\\g<n>)\\\\z|\\\\zEND (?<m>a|(b)\\\\g<m>)\", \"bbbbabba\", 0, 8);\n    x2(\"(?<name1240>\\\\w+\\\\sx)a+\\\\k<name1240>\", \"  fg xaaaaaaaafg x\", 2, 18);\n    x3(\"(z)()()(?<_9>a)\\\\g<_9>\", \"zaa\", 2, 3, 1);\n    x2(\"(.)(((?<_>a)))\\\\k<_>\", \"zaa\", 0, 3);\n    x2(\"((?<name1>\\\\d)|(?<name2>\\\\w))(\\\\k<name1>|\\\\k<name2>)\", \"ff\", 0, 2);\n    x2(\"(?:(?<x>)|(?<x>efg))\\\\k<x>\", \"\", 0, 0);\n    x2(\"(?:(?<x>abc)|(?<x>efg))\\\\k<x>\", \"abcefgefg\", 3, 9);\n    n(\"(?:(?<x>abc)|(?<x>efg))\\\\k<x>\", \"abcefg\");\n    x2(\"(?:(?<n1>.)|(?<n1>..)|(?<n1>...)|(?<n1>....)|(?<n1>.....)|(?<n1>......)|(?<n1>.......)|(?<n1>........)|(?<n1>.........)|(?<n1>..........)|(?<n1>...........)|(?<n1>............)|(?<n1>.............)|(?<n1>..............))\\\\k<n1>$\", \"a-pyumpyum\", 2, 10);\n    x3(\"(?:(?<n1>.)|(?<n1>..)|(?<n1>...)|(?<n1>....)|(?<n1>.....)|(?<n1>......)|(?<n1>.......)|(?<n1>........)|(?<n1>.........)|(?<n1>..........)|(?<n1>...........)|(?<n1>............)|(?<n1>.............)|(?<n1>..............))\\\\k<n1>$\", \"xxxxabcdefghijklmnabcdefghijklmn\", 4, 18, 14);\n    x3(\"(?<name1>)(?<name2>)(?<name3>)(?<name4>)(?<name5>)(?<name6>)(?<name7>)(?<name8>)(?<name9>)(?<name10>)(?<name11>)(?<name12>)(?<name13>)(?<name14>)(?<name15>)(?<name16>aaa)(?<name17>)$\", \"aaa\", 0, 3, 16);\n    x2(\"(?<foo>a|\\\\(\\\\g<foo>\\\\))\", \"a\", 0, 1);\n    x2(\"(?<foo>a|\\\\(\\\\g<foo>\\\\))\", \"((((((a))))))\", 0, 13);\n    x3(\"(?<foo>a|\\\\(\\\\g<foo>\\\\))\", \"((((((((a))))))))\", 0, 17, 1);\n    x2(\"\\\\g<bar>|\\\\zEND(?<bar>.*abc$)\", \"abcxxxabc\", 0, 9);\n    x2(\"\\\\g<1>|\\\\zEND(.a.)\", \"bac\", 0, 3);\n    x3(\"\\\\g<_A>\\\\g<_A>|\\\\zEND(.a.)(?<_A>.b.)\", \"xbxyby\", 3, 6, 1);\n    x2(\"\\\\A(?:\\\\g<pon>|\\\\g<pan>|\\\\zEND  (?<pan>a|c\\\\g<pon>c)(?<pon>b|d\\\\g<pan>d))$\", \"cdcbcdc\", 0, 7);\n    x2(\"\\\\A(?<n>|a\\\\g<m>)\\\\z|\\\\zEND (?<m>\\\\g<n>)\", \"aaaa\", 0, 4);\n    x2(\"(?<n>(a|b\\\\g<n>c){3,5})\", \"baaaaca\", 1, 5);\n    x2(\"(?<n>(a|b\\\\g<n>c){3,5})\", \"baaaacaaaaa\", 0, 10);\n    x2(\"(?<pare>\\\\(([^\\\\(\\\\)]++|\\\\g<pare>)*+\\\\))\", \"((a))\", 0, 5);\n    x2(\"()*\\\\1\", \"\", 0, 0);\n    x2(\"(?:()|())*\\\\1\\\\2\", \"\", 0, 0);\n    x3(\"(?:\\\\1a|())*\", \"a\", 0, 0, 1);\n    x2(\"x((.)*)*x\", \"0x1x2x3\", 1, 6);\n    x2(\"x((.)*)*x(?i:\\\\1)\\\\Z\", \"0x1x2x1X2\", 1, 9);\n    x2(\"(?:()|()|()|()|()|())*\\\\2\\\\5\", \"\", 0, 0);\n    x2(\"(?:()|()|()|(x)|()|())*\\\\2b\\\\5\", \"b\", 0, 1);\n    if onig_encoding == onig.ONIG_ENCODING_UTF16_LE:\n        x2(\"\\\\xFA\\\\x8F\", \"\\u8ffa\", 0, 1);\n    elif onig_encoding == onig.ONIG_ENCODING_UTF16_BE:\n        x2(\"\\\\x8F\\\\xFA\", \"\\u8ffa\", 0, 1);\n    elif onig_encoding == onig.ONIG_ENCODING_UTF8:\n        x2(\"\\\\xE8\\\\xBF\\\\xBA\", \"\\u8ffa\", 0, 1);\n    elif onig_encoding == onig.ONIG_ENCODING_SJIS:\n        x2(\"\\\\xE7\\\\x92\", \"\\u8ffa\", 0, 1);\n    elif onig_encoding == onig.ONIG_ENCODING_EUC_JP:\n        x2(\"\\\\xED\\\\xF2\", \"\\u8ffa\", 0, 1); # \"迺\"\n    x2(\"\", \"あ\", 0, 0);\n    x2(\"あ\", \"あ\", 0, 1);\n    n(\"い\", \"あ\");\n    x2(\"うう\", \"うう\", 0, 2);\n    x2(\"あいう\", \"あいう\", 0, 3);\n    x2(\"こここここここここここここここここここここここここここここここここここ\", \"こここここここここここここここここここここここここここここここここここ\", 0, 35);\n    x2(\"あ\", \"いあ\", 1, 2);\n    x2(\"いう\", \"あいう\", 1, 3);\n#    x2(b\"\\\\xca\\\\xb8\", b\"\\xca\\xb8\", 0, 2);   # \"文\"\n    x2(\".\", \"あ\", 0, 1);\n    x2(\"..\", \"かき\", 0, 2);\n    x2(\"\\\\w\", \"お\", 0, 1);\n    n(\"\\\\W\", \"あ\");\n    x2(\"[\\\\W]\", \"う$\", 1, 2);\n    x2(\"\\\\S\", \"そ\", 0, 1);\n    x2(\"\\\\S\", \"漢\", 0, 1);\n    x2(\"\\\\b\", \"気 \", 0, 0);\n    x2(\"\\\\b\", \" ほ\", 1, 1);\n    x2(\"\\\\B\", \"せそ \", 1, 1);\n    x2(\"\\\\B\", \"う \", 2, 2);\n    x2(\"\\\\B\", \" い\", 0, 0);\n    x2(\"[たち]\", \"ち\", 0, 1);\n    n(\"[なに]\", \"ぬ\");\n    x2(\"[う-お]\", \"え\", 0, 1);\n    n(\"[^け]\", \"け\");\n    x2(\"[\\\\w]\", \"ね\", 0, 1);\n    n(\"[\\\\d]\", \"ふ\");\n    x2(\"[\\\\D]\", \"は\", 0, 1);\n    n(\"[\\\\s]\", \"く\");\n    x2(\"[\\\\S]\", \"へ\", 0, 1);\n    x2(\"[\\\\w\\\\d]\", \"よ\", 0, 1);\n    x2(\"[\\\\w\\\\d]\", \"   よ\", 3, 4);\n    n(\"\\\\w鬼車\", \" 鬼車\");\n    x2(\"鬼\\\\W車\", \"鬼 車\", 0, 3);\n    x2(\"あ.い.う\", \"ああいいう\", 0, 5);\n    x2(\".\\\\wう\\\\W..ぞ\", \"えうう うぞぞ\", 0, 7);\n    x2(\"\\\\s\\\\wこここ\", \" ここここ\", 0, 5);\n    x2(\"ああ.け\", \"ああけけ\", 0, 4);\n    n(\".い\", \"いえ\");\n    x2(\".お\", \"おお\", 0, 2);\n    x2(\"^あ\", \"あ\", 0, 1);\n    x2(\"^む$\", \"む\", 0, 1);\n    x2(\"^\\\\w$\", \"に\", 0, 1);\n    x2(\"^\\\\wかきくけこ$\", \"zかきくけこ\", 0, 6);\n    x2(\"^\\\\w...うえお$\", \"zあいううえお\", 0, 7);\n    x2(\"\\\\w\\\\w\\\\s\\\\Wおおお\\\\d\", \"aお  おおお4\", 0, 8);\n    x2(\"\\\\Aたちつ\", \"たちつ\", 0, 3);\n    x2(\"むめも\\\\Z\", \"むめも\", 0, 3);\n    x2(\"かきく\\\\z\", \"かきく\", 0, 3);\n    x2(\"かきく\\\\Z\", \"かきく\\n\", 0, 3);\n    x2(\"\\\\Gぽぴ\", \"ぽぴ\", 0, 2);\n    n(\"\\\\Gえ\", \"うえお\");\n    n(\"とて\\\\G\", \"とて\");\n    n(\"まみ\\\\A\", \"まみ\");\n    n(\"ま\\\\Aみ\", \"まみ\");\n    x2(\"(?=せ)せ\", \"せ\", 0, 1);\n    n(\"(?=う).\", \"い\");\n    x2(\"(?!う)か\", \"か\", 0, 1);\n    n(\"(?!と)あ\", \"と\");\n    x2(\"(?i:あ)\", \"あ\", 0, 1);\n    x2(\"(?i:ぶべ)\", \"ぶべ\", 0, 2);\n    n(\"(?i:い)\", \"う\");\n    x2(\"(?m:よ.)\", \"よ\\n\", 0, 2);\n    x2(\"(?m:.め)\", \"ま\\nめ\", 1, 3);\n    x2(\"あ?\", \"\", 0, 0);\n    x2(\"変?\", \"化\", 0, 0);\n    x2(\"変?\", \"変\", 0, 1);\n    x2(\"量*\", \"\", 0, 0);\n    x2(\"量*\", \"量\", 0, 1);\n    x2(\"子*\", \"子子子\", 0, 3);\n    x2(\"馬*\", \"鹿馬馬馬馬\", 0, 0);\n    n(\"山+\", \"\");\n    x2(\"河+\", \"河\", 0, 1);\n    x2(\"時+\", \"時時時時\", 0, 4);\n    x2(\"え+\", \"ええううう\", 0, 2);\n    x2(\"う+\", \"おうううう\", 1, 5);\n    x2(\".?\", \"た\", 0, 1);\n    x2(\".*\", \"ぱぴぷぺ\", 0, 4);\n    x2(\".+\", \"ろ\", 0, 1);\n    x2(\".+\", \"いうえか\\n\", 0, 4);\n    x2(\"あ|い\", \"あ\", 0, 1);\n    x2(\"あ|い\", \"い\", 0, 1);\n    x2(\"あい|いう\", \"あい\", 0, 2);\n    x2(\"あい|いう\", \"いう\", 0, 2);\n    x2(\"を(?:かき|きく)\", \"をかき\", 0, 3);\n    x2(\"を(?:かき|きく)け\", \"をきくけ\", 0, 4);\n    x2(\"あい|(?:あう|あを)\", \"あを\", 0, 2);\n    x2(\"あ|い|う\", \"えう\", 1, 2);\n    x2(\"あ|い|うえ|おかき|く|けこさ|しすせ|そ|たち|つてとなに|ぬね\", \"しすせ\", 0, 3);\n    n(\"あ|い|うえ|おかき|く|けこさ|しすせ|そ|たち|つてとなに|ぬね\", \"すせ\");\n    x2(\"あ|^わ\", \"ぶあ\", 1, 2);\n    x2(\"あ|^を\", \"をあ\", 0, 1);\n    x2(\"鬼|\\\\G車\", \"け車鬼\", 2, 3);\n    x2(\"鬼|\\\\G車\", \"車鬼\", 0, 1);\n    x2(\"鬼|\\\\A車\", \"b車鬼\", 2, 3);\n    x2(\"鬼|\\\\A車\", \"車\", 0, 1);\n    x2(\"鬼|車\\\\Z\", \"車鬼\", 1, 2);\n    x2(\"鬼|車\\\\Z\", \"車\", 0, 1);\n    x2(\"鬼|車\\\\Z\", \"車\\n\", 0, 1);\n    x2(\"鬼|車\\\\z\", \"車鬼\", 1, 2);\n    x2(\"鬼|車\\\\z\", \"車\", 0, 1);\n    x2(\"\\\\w|\\\\s\", \"お\", 0, 1);\n    x2(\"\\\\w|%\", \"%お\", 0, 1);\n    x2(\"\\\\w|[&$]\", \"う&\", 0, 1);\n    x2(\"[い-け]\", \"う\", 0, 1);\n    x2(\"[い-け]|[^か-こ]\", \"あ\", 0, 1);\n    x2(\"[い-け]|[^か-こ]\", \"か\", 0, 1);\n    x2(\"[^あ]\", \"\\n\", 0, 1);\n    x2(\"(?:あ|[う-き])|いを\", \"うを\", 0, 1);\n    x2(\"(?:あ|[う-き])|いを\", \"いを\", 0, 2);\n    x2(\"あいう|(?=けけ)..ほ\", \"けけほ\", 0, 3);\n    x2(\"あいう|(?!けけ)..ほ\", \"あいほ\", 0, 3);\n    x2(\"(?=をあ)..あ|(?=をを)..あ\", \"ををあ\", 0, 3);\n    x2(\"(?<=あ|いう)い\", \"いうい\", 2, 3);\n    n(\"(?>あ|あいえ)う\", \"あいえう\");\n    x2(\"(?>あいえ|あ)う\", \"あいえう\", 0, 4);\n    x2(\"あ?|い\", \"あ\", 0, 1);\n    x2(\"あ?|い\", \"い\", 0, 0);\n    x2(\"あ?|い\", \"\", 0, 0);\n    x2(\"あ*|い\", \"ああ\", 0, 2);\n    x2(\"あ*|い*\", \"いあ\", 0, 0);\n    x2(\"あ*|い*\", \"あい\", 0, 1);\n    x2(\"[aあ]*|い*\", \"aあいいい\", 0, 2);\n    x2(\"あ+|い*\", \"\", 0, 0);\n    x2(\"あ+|い*\", \"いいい\", 0, 3);\n    x2(\"あ+|い*\", \"あいいい\", 0, 1);\n    x2(\"あ+|い*\", \"aあいいい\", 0, 0);\n    n(\"あ+|い+\", \"\");\n    x2(\"(あ|い)?\", \"い\", 0, 1);\n    x2(\"(あ|い)*\", \"いあ\", 0, 2);\n    x2(\"(あ|い)+\", \"いあい\", 0, 3);\n    x2(\"(あい|うあ)+\", \"うああいうえ\", 0, 4);\n    x2(\"(あい|うえ)+\", \"うああいうえ\", 2, 6);\n    x2(\"(あい|うあ)+\", \"ああいうあ\", 1, 5);\n    x2(\"(あい|うあ)+\", \"あいをうあ\", 0, 2);\n    x2(\"(あい|うあ)+\", \"$$zzzzあいをうあ\", 6, 8);\n    x2(\"(あ|いあい)+\", \"あいあいあ\", 0, 5);\n    x2(\"(あ|いあい)+\", \"いあ\", 1, 2);\n    x2(\"(あ|いあい)+\", \"いあああいあ\", 1, 4);\n    x2(\"(?:あ|い)(?:あ|い)\", \"あい\", 0, 2);\n    x2(\"(?:あ*|い*)(?:あ*|い*)\", \"あああいいい\", 0, 3);\n    x2(\"(?:あ*|い*)(?:あ+|い+)\", \"あああいいい\", 0, 6);\n    x2(\"(?:あ+|い+){2}\", \"あああいいい\", 0, 6);\n    x2(\"(?:あ+|い+){1,2}\", \"あああいいい\", 0, 6);\n    x2(\"(?:あ+|\\\\Aい*)うう\", \"うう\", 0, 2);\n    n(\"(?:あ+|\\\\Aい*)うう\", \"あいうう\");\n    x2(\"(?:^あ+|い+)*う\", \"ああいいいあいう\", 6, 8);\n    x2(\"(?:^あ+|い+)*う\", \"ああいいいいう\", 0, 7);\n    x2(\"う{0,}\", \"うううう\", 0, 4);\n    x2(\"あ|(?i)c\", \"C\", 0, 1);\n    x2(\"(?i)c|あ\", \"C\", 0, 1);\n    x2(\"(?i:あ)|a\", \"a\", 0, 1);\n    n(\"(?i:あ)|a\", \"A\");\n    x2(\"[あいう]?\", \"あいう\", 0, 1);\n    x2(\"[あいう]*\", \"あいう\", 0, 3);\n    x2(\"[^あいう]*\", \"あいう\", 0, 0);\n    n(\"[^あいう]+\", \"あいう\");\n    x2(\"あ??\", \"あああ\", 0, 0);\n    x2(\"いあ??い\", \"いあい\", 0, 3);\n    x2(\"あ*?\", \"あああ\", 0, 0);\n    x2(\"いあ*?\", \"いああ\", 0, 1);\n    x2(\"いあ*?い\", \"いああい\", 0, 4);\n    x2(\"あ+?\", \"あああ\", 0, 1);\n    x2(\"いあ+?\", \"いああ\", 0, 2);\n    x2(\"いあ+?い\", \"いああい\", 0, 4);\n    x2(\"(?:天?)??\", \"天\", 0, 0);\n    x2(\"(?:天??)?\", \"天\", 0, 0);\n    x2(\"(?:夢?)+?\", \"夢夢夢\", 0, 1);\n    x2(\"(?:風+)??\", \"風風風\", 0, 0);\n    x2(\"(?:雪+)??霜\", \"雪雪雪霜\", 0, 4);\n    x2(\"(?:あい)?{2}\", \"\", 0, 0);\n    x2(\"(?:鬼車)?{2}\", \"鬼車鬼車鬼\", 0, 4);\n    x2(\"(?:鬼車)*{0}\", \"鬼車鬼車鬼\", 0, 0);\n    x2(\"(?:鬼車){3,}\", \"鬼車鬼車鬼車鬼車\", 0, 8);\n    n(\"(?:鬼車){3,}\", \"鬼車鬼車\");\n    x2(\"(?:鬼車){2,4}\", \"鬼車鬼車鬼車\", 0, 6);\n    x2(\"(?:鬼車){2,4}\", \"鬼車鬼車鬼車鬼車鬼車\", 0, 8);\n    x2(\"(?:鬼車){2,4}?\", \"鬼車鬼車鬼車鬼車鬼車\", 0, 4);\n    x2(\"(?:鬼車){,}\", \"鬼車{,}\", 0, 5);\n    x2(\"(?:かきく)+?{2}\", \"かきくかきくかきく\", 0, 6);\n    x3(\"(火)\", \"火\", 0, 1, 1);\n    x3(\"(火水)\", \"火水\", 0, 2, 1);\n    x2(\"((時間))\", \"時間\", 0, 2);\n    x3(\"((風水))\", \"風水\", 0, 2, 1);\n    x3(\"((昨日))\", \"昨日\", 0, 2, 2);\n    x3(\"((((((((((((((((((((量子))))))))))))))))))))\", \"量子\", 0, 2, 20);\n    x3(\"(あい)(うえ)\", \"あいうえ\", 0, 2, 1);\n    x3(\"(あい)(うえ)\", \"あいうえ\", 2, 4, 2);\n    x3(\"()(あ)いう(えおか)きくけこ\", \"あいうえおかきくけこ\", 3, 6, 3);\n    x3(\"(()(あ)いう(えおか)きくけこ)\", \"あいうえおかきくけこ\", 3, 6, 4);\n    x3(\".*(フォ)ン・マ(ン()シュタ)イン\", \"フォン・マンシュタイン\", 5, 9, 2);\n    x2(\"(^あ)\", \"あ\", 0, 1);\n    x3(\"(あ)|(あ)\", \"いあ\", 1, 2, 1);\n    x3(\"(^あ)|(あ)\", \"いあ\", 1, 2, 2);\n    x3(\"(あ?)\", \"あああ\", 0, 1, 1);\n    x3(\"(ま*)\", \"ままま\", 0, 3, 1);\n    x3(\"(と*)\", \"\", 0, 0, 1);\n    x3(\"(る+)\", \"るるるるるるる\", 0, 7, 1);\n    x3(\"(ふ+|へ*)\", \"ふふふへへ\", 0, 3, 1);\n    x3(\"(あ+|い?)\", \"いいいああ\", 0, 1, 1);\n    x3(\"(あいう)?\", \"あいう\", 0, 3, 1);\n    x3(\"(あいう)*\", \"あいう\", 0, 3, 1);\n    x3(\"(あいう)+\", \"あいう\", 0, 3, 1);\n    x3(\"(さしす|あいう)+\", \"あいう\", 0, 3, 1);\n    x3(\"([なにぬ][かきく]|かきく)+\", \"かきく\", 0, 3, 1);\n    x3(\"((?i:あいう))\", \"あいう\", 0, 3, 1);\n    x3(\"((?m:あ.う))\", \"あ\\nう\", 0, 3, 1);\n    x3(\"((?=あん)あ)\", \"あんい\", 0, 1, 1);\n    x3(\"あいう|(.あいえ)\", \"んあいえ\", 0, 4, 1);\n    x3(\"あ*(.)\", \"ああああん\", 4, 5, 1);\n    x3(\"あ*?(.)\", \"ああああん\", 0, 1, 1);\n    x3(\"あ*?(ん)\", \"ああああん\", 4, 5, 1);\n    x3(\"[いうえ]あ*(.)\", \"えああああん\", 5, 6, 1);\n    x3(\"(\\\\Aいい)うう\", \"いいうう\", 0, 2, 1);\n    n(\"(\\\\Aいい)うう\", \"んいいうう\");\n    x3(\"(^いい)うう\", \"いいうう\", 0, 2, 1);\n    n(\"(^いい)うう\", \"んいいうう\");\n    x3(\"ろろ(るる$)\", \"ろろるる\", 2, 4, 1);\n    n(\"ろろ(るる$)\", \"ろろるるる\");\n    x2(\"(無)\\\\1\", \"無無\", 0, 2);\n    n(\"(無)\\\\1\", \"無武\");\n    x2(\"(空?)\\\\1\", \"空空\", 0, 2);\n    x2(\"(空??)\\\\1\", \"空空\", 0, 0);\n    x2(\"(空*)\\\\1\", \"空空空空空\", 0, 4);\n    x3(\"(空*)\\\\1\", \"空空空空空\", 0, 2, 1);\n    x2(\"あ(い*)\\\\1\", \"あいいいい\", 0, 5);\n    x2(\"あ(い*)\\\\1\", \"あい\", 0, 1);\n    x2(\"(あ*)(い*)\\\\1\\\\2\", \"あああいいあああいい\", 0, 10);\n    x2(\"(あ*)(い*)\\\\2\", \"あああいいいい\", 0, 7);\n    x3(\"(あ*)(い*)\\\\2\", \"あああいいいい\", 3, 5, 2);\n    x2(\"(((((((ぽ*)ぺ))))))ぴ\\\\7\", \"ぽぽぽぺぴぽぽぽ\", 0, 8);\n    x3(\"(((((((ぽ*)ぺ))))))ぴ\\\\7\", \"ぽぽぽぺぴぽぽぽ\", 0, 3, 7);\n    x2(\"(は)(ひ)(ふ)\\\\2\\\\1\\\\3\", \"はひふひはふ\", 0, 6);\n    x2(\"([き-け])\\\\1\", \"くく\", 0, 2);\n    x2(\"(\\\\w\\\\d\\\\s)\\\\1\", \"あ5 あ5 \", 0, 6);\n    n(\"(\\\\w\\\\d\\\\s)\\\\1\", \"あ5 あ5\");\n    x2(\"(誰？|[あ-う]{3})\\\\1\", \"誰？誰？\", 0, 4);\n    x2(\"...(誰？|[あ-う]{3})\\\\1\", \"あaあ誰？誰？\", 0, 7);\n    x2(\"(誰？|[あ-う]{3})\\\\1\", \"ういうういう\", 0, 6);\n    x2(\"(^こ)\\\\1\", \"ここ\", 0, 2);\n    n(\"(^む)\\\\1\", \"めむむ\");\n    n(\"(あ$)\\\\1\", \"ああ\");\n    n(\"(あい\\\\Z)\\\\1\", \"あい\");\n    x2(\"(あ*\\\\Z)\\\\1\", \"あ\", 1, 1);\n    x2(\".(あ*\\\\Z)\\\\1\", \"いあ\", 1, 2);\n    x3(\"(.(やいゆ)\\\\2)\", \"zやいゆやいゆ\", 0, 7, 1);\n    x3(\"(.(..\\\\d.)\\\\2)\", \"あ12341234\", 0, 9, 1);\n    x2(\"((?i:あvず))\\\\1\", \"あvずあvず\", 0, 6);\n    x2(\"(?<愚か>変|\\\\(\\\\g<愚か>\\\\))\", \"((((((変))))))\", 0, 13);\n    x2(\"\\\\A(?:\\\\g<阿_1>|\\\\g<云_2>|\\\\z終了  (?<阿_1>観|自\\\\g<云_2>自)(?<云_2>在|菩薩\\\\g<阿_1>菩薩))$\", \"菩薩自菩薩自在自菩薩自菩薩\", 0, 13);\n    x2(\"[[ひふ]]\", \"ふ\", 0, 1);\n    x2(\"[[いおう]か]\", \"か\", 0, 1);\n    n(\"[[^あ]]\", \"あ\");\n    n(\"[^[あ]]\", \"あ\");\n    x2(\"[^[^あ]]\", \"あ\", 0, 1);\n    x2(\"[[かきく]&&きく]\", \"く\", 0, 1);\n    n(\"[[かきく]&&きく]\", \"か\");\n    n(\"[[かきく]&&きく]\", \"け\");\n    x2(\"[あ-ん&&い-を&&う-ゑ]\", \"ゑ\", 0, 1);\n    n(\"[^あ-ん&&い-を&&う-ゑ]\", \"ゑ\");\n    x2(\"[[^あ&&あ]&&あ-ん]\", \"い\", 0, 1);\n    n(\"[[^あ&&あ]&&あ-ん]\", \"あ\");\n    x2(\"[[^あ-ん&&いうえお]&&[^う-か]]\", \"き\", 0, 1);\n    n(\"[[^あ-ん&&いうえお]&&[^う-か]]\", \"い\");\n    x2(\"[^[^あいう]&&[^うえお]]\", \"う\", 0, 1);\n    x2(\"[^[^あいう]&&[^うえお]]\", \"え\", 0, 1);\n    n(\"[^[^あいう]&&[^うえお]]\", \"か\");\n    x2(\"[あ-&&-あ]\", \"-\", 0, 1);\n    x2(\"[^[^a-zあいう]&&[^bcdefgうえお]q-w]\", \"え\", 0, 1);\n    x2(\"[^[^a-zあいう]&&[^bcdefgうえお]g-w]\", \"f\", 0, 1);\n    x2(\"[^[^a-zあいう]&&[^bcdefgうえお]g-w]\", \"g\", 0, 1);\n    n(\"[^[^a-zあいう]&&[^bcdefgうえお]g-w]\", \"2\");\n    x2(\"a<b>バージョンのダウンロード<\\\\/b>\", \"a<b>バージョンのダウンロード</b>\", 0, 20);\n    x2(\".<b>バージョンのダウンロード<\\\\/b>\", \"a<b>バージョンのダウンロード</b>\", 0, 20);\n\n\n    # additional test patterns\n    if is_unicode_encoding(onig_encoding):\n        x2(\"\\\\x{3042}\\\\x{3044}\", \"あい\", 0, 2)\n    elif onig_encoding == onig.ONIG_ENCODING_SJIS:\n        x2(\"\\\\x{82a0}\\\\x{82A2}\", \"あい\", 0, 2)\n    elif onig_encoding == onig.ONIG_ENCODING_EUC_JP:\n        x2(\"\\\\x{a4a2}\\\\x{A4A4}\", \"あい\", 0, 2)\n    x2(\"\\\\p{Hiragana}\\\\p{Katakana}\", \"あイ\", 0, 2)\n    x2(\"(?m)^A.B$\", \"X\\nA\\nB\\nZ\", 2, 5)\n    n(\"(?<!(?<=a)b|c)d\", \"abd\")\n    n(\"(?<!(?<=a)b|c)d\", \"cd\")\n    x2(\"(?<!(?<=a)b|c)d\", \"bd\", 1, 2)\n    x2(\"(a){2}z\", \"aaz\", 0, 3)\n    x2(\"(?<=a).*b\", \"aab\", 1, 3)\n    x2(\"(?<=(?<!A)B)C\", \"BBC\", 2, 3)\n    n(\"(?<=(?<!A)B)C\", \"ABC\")\n    n(\"(?i)(?<!aa|b)c\", \"Aac\")\n    n(\"(?i)(?<!b|aa)c\", \"Aac\")\n    x2(\"(?<=\\\\babc)d\", \" abcd\", 4, 5)\n    x2(\"(?<=\\\\Babc)d\", \"aabcd\", 4, 5)\n    x2(\"a\\\\b?a\", \"aa\", 0, 2)\n    x2(\"[^x]*x\", \"aaax\", 0, 4)\n    x2(\"(?i)[\\\\x{0}-B]+\", \"\\x00\\x01\\x02\\x1f\\x20@AaBbC\", 0, 10)\n    x2(\"(?i)a{2}\", \"AA\", 0, 2)\n    if is_unicode_encoding(onig_encoding):\n        # The longest script name\n        x2(\"\\\\p{Other_Default_Ignorable_Code_Point}+\", \"\\u034F\\uFFF8\\U000E0FFF\", 0, 3)\n        # The longest block name\n        x2(\"\\\\p{In_Unified_Canadian_Aboriginal_Syllabics_Extended}+\", \"\\u18B0\\u18FF\", 0, 2)\n    x2(\"[0-9-a]+\", \" 0123456789-a \", 1, 13)     # same as [0-9\\-a]\n    x2(\"[0-9-\\\\s]+\", \" 0123456789-a \", 0, 12)   # same as [0-9\\-\\s]\n    x2(\"(?i:a) B\", \"a B\", 0, 3);\n    x2(\"(?i:a )B\", \"a B\", 0, 3);\n    x2(\"B (?i:a)\", \"B a\", 0, 3);\n    x2(\"B(?i: a)\", \"B a\", 0, 3);\n    if is_unicode_encoding(onig_encoding):\n        x2(\"(?a)[\\p{Space}\\d]\", \"\\u00a0\", 0, 1)\n        x2(\"(?a)[\\d\\p{Space}]\", \"\\u00a0\", 0, 1)\n        n(\"(?a)[^\\p{Space}\\d]\", \"\\u00a0\")\n        n(\"(?a)[^\\d\\p{Space}]\", \"\\u00a0\")\n    n(\"x.*?\\\\Z$\", \"x\\ny\")\n    n(\"x.*?\\\\Z$\", \"x\\r\\ny\")\n    x2(\"x.*?\\\\Z$\", \"x\\n\", 0, 1)\n    x2(\"x.*?\\\\Z$\", \"x\\r\\n\", 0, 2)   # \\Z will match between \\r and \\n, if\n                                    # ONIG_OPTION_NEWLINE_CRLF isn't specified.\n    x2(\"(?<=fo).*\", \"foo\", 2, 3)\n    x2(\"(?m)(?<=fo).*\", \"foo\", 2, 3)\n    x2(\"(?m)(?<=fo).+\", \"foo\", 2, 3)\n    x2(\"\\\\n?\\\\z\", \"hello\", 5, 5)\n    x2(\"\\\\z\", \"hello\", 5, 5)\n    x2(\"\\\\n?\\\\z\", \"こんにちは\", 5, 5)\n    x2(\"\\\\z\", \"こんにちは\", 5, 5)\n\n    # character classes (tests for character class optimization)\n    x2(\"[@][a]\", \"@a\", 0, 2);\n    x2(\".*[a][b][c][d][e]\", \"abcde\", 0, 5);\n    x2(\"(?i)[A\\\\x{41}]\", \"a\", 0, 1);\n    x2(\"[abA]\", \"a\", 0, 1);\n    x2(\"[[ab]&&[ac]]+\", \"aaa\", 0, 3);\n    x2(\"[[あい]&&[あう]]+\", \"あああ\", 0, 3);\n\n    # possessive quantifiers\n    n(\"a?+a\", \"a\")\n    n(\"a*+a\", \"aaaa\")\n    n(\"a++a\", \"aaaa\")\n#    n(\"a{2,3}+a\", \"aaa\")    # ONIG_SYNTAX_DEFAULT doesn't support this\n\n    # linebreak\n    x2(\"\\\\R\", \"\\n\", 0, 1)\n    x2(\"\\\\R\", \"\\r\", 0, 1)\n    x2(\"\\\\R{3}\", \"\\r\\r\\n\\n\", 0, 4)\n\n#    if (onig_encoding == onig.ONIG_ENCODING_UTF16_LE or\n#            onig_encoding == onig.ONIG_ENCODING_UTF16_BE or\n#            onig_encoding == onig.ONIG_ENCODING_UTF8):\n#        # USE_UNICODE_ALL_LINE_TERMINATORS must be defined\n#        x2(\"\\\\R\", \"\\u0085\", 0, 1)\n#        x2(\"\\\\R\", \"\\u2028\", 0, 1)\n#        x2(\"\\\\R\", \"\\u2029\", 0, 1)\n\n    # extended grapheme cluster\n    x2(\"\\\\X{5}\", \"あいab\\n\", 0, 5)\n    if is_unicode_encoding(onig_encoding):\n        x2(\"\\\\X\", \"\\u306F\\u309A\\n\", 0, 2)\n\n    # keep\n    x2(\"ab\\\\Kcd\", \"abcd\", 2, 4)\n    x2(\"ab\\\\Kc(\\\\Kd|z)\", \"abcd\", 3, 4)\n    x2(\"ab\\\\Kc(\\\\Kz|d)\", \"abcd\", 2, 4)\n    x2(\"(a\\\\K)*\", \"aaab\", 3, 3)\n    x3(\"(a\\\\K)*\", \"aaab\", 2, 3, 1)\n#    x2(\"a\\\\K?a\", \"aa\", 0, 2)        # error: differ from perl\n    x2(\"ab(?=c\\Kd)\", \"abcd\", 2, 2)          # This behaviour is currently not well defined. (see: perlre)\n    x2(\"(?<=a\\\\Kb|aa)cd\", \"abcd\", 1, 4)     # This behaviour is currently not well defined. (see: perlre)\n    x2(\"(?<=ab|a\\\\Ka)cd\", \"abcd\", 2, 4)     # This behaviour is currently not well defined. (see: perlre)\n\n    # named group and subroutine call\n#    x2(\"(?<name_2>ab)(?&name_2)\", \"abab\", 0, 4);\n#    x2(\"(?<name_2>ab)(?1)\", \"abab\", 0, 4);\n#    x2(\"(?<n>|\\\\((?&n)\\\\))+$\", \"()(())\", 0, 6);\n#    x2(\"(a|x(?-1)x)\", \"xax\", 0, 3);\n#    x2(\"(a|(x(?-2)x))\", \"xax\", 0, 3);\n#    x2(\"a|x(?0)x\", \"xax\", 0, 3);\n#    x2(\"a|x(?R)x\", \"xax\", 0, 3);\n    x2(\"(a|x\\g<0>x)\", \"xax\", 0, 3);\n    x2(\"(a|x\\g'0'x)\", \"xax\", 0, 3);\n#    x2(\"(?-i:(?+1))(?i:(a)){0}\", \"A\", 0, 1);\n    x2(\"(?-i:\\g<+1>)(?i:(a)){0}\", \"A\", 0, 1);\n    x2(\"(?-i:\\g'+1')(?i:(a)){0}\", \"A\", 0, 1);\n\n    # character set modifiers\n    x2(\"(?u)\\\\w+\", \"あa#\", 0, 2);\n    x2(\"(?a)\\\\w+\", \"あa#\", 1, 2);\n    x2(\"(?u)\\\\W+\", \"あa#\", 2, 3);\n    x2(\"(?a)\\\\W+\", \"あa#\", 0, 1);\n\n    x2(\"(?a)\\\\b\", \"あa\", 1, 1);\n    x2(\"(?a)\\\\w\\\\b\", \"aあ\", 0, 1);\n    x2(\"(?a)\\\\B\", \"a ああ \", 2, 2);\n\n    x2(\"(?u)\\\\B\", \"あ \", 2, 2);\n    x2(\"(?a)\\\\B\", \"あ \", 0, 0);\n    x2(\"(?a)\\\\B\", \"aあ \", 2, 2);\n\n    x2(\"(?a)\\\\p{Alpha}\\\\P{Alpha}\", \"a。\", 0, 2);\n    x2(\"(?u)\\\\p{Alpha}\\\\P{Alpha}\", \"a。\", 0, 2);\n    x2(\"(?a)[[:word:]]+\", \"aあ\", 0, 1);\n    x2(\"(?a)[[:^word:]]+\", \"aあ\", 1, 2);\n    x2(\"(?u)[[:word:]]+\", \"aあ\", 0, 2);\n    n(\"(?u)[[:^word:]]+\", \"aあ\");\n\n    # \\g{} backref\n#    x2(\"((?<name1>\\\\d)|(?<name2>\\\\w))(\\\\g{name1}|\\\\g{name2})\", \"ff\", 0, 2);\n#    x2(\"(?:(?<x>)|(?<x>efg))\\\\g{x}\", \"\", 0, 0);\n#    x2(\"(?:(?<x>abc)|(?<x>efg))\\\\g{x}\", \"abcefgefg\", 3, 9);\n#    n(\"(?:(?<x>abc)|(?<x>efg))\\\\g{x}\", \"abcefg\");\n#    x2(\"((.*)a\\\\g{2}f)\", \"bacbabf\", 3, 7);\n#    x2(\"(.*)a\\\\g{1}f\", \"baczzzzzz\\nbazz\\nzzzzbabf\", 19, 23);\n#    x2(\"((.*)a\\\\g{-1}f)\", \"bacbabf\", 3, 7);\n#    x2(\"(.*)a\\\\g{-1}f\", \"baczzzzzz\\nbazz\\nzzzzbabf\", 19, 23);\n#    x2(\"(あ*)(い*)\\\\g{-2}\\\\g{-1}\", \"あああいいあああいい\", 0, 10);\n\n    # Python/PCRE compatible named group\n#    x2(\"(?P<name_2>ab)(?P>name_2)\", \"abab\", 0, 4);\n#    x2(\"(?P<n>|\\\\((?P>n)\\\\))+$\", \"()(())\", 0, 6);\n#    x2(\"((?P<name1>\\\\d)|(?P<name2>\\\\w))((?P=name1)|(?P=name2))\", \"ff\", 0, 2);\n\n    # Fullwidth Alphabet\n    n(\"ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚ\", \"ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ\");\n    x2(\"(?i)ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚ\", \"ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚ\", 0, 26);\n    x2(\"(?i)ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚ\", \"ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ\", 0, 26);\n    x2(\"(?i)ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ\", \"ａｂｃｄｅｆｇｈｉｊｋｌｍｎｏｐｑｒｓｔｕｖｗｘｙｚ\", 0, 26);\n    x2(\"(?i)ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ\", \"ＡＢＣＤＥＦＧＨＩＪＫＬＭＮＯＰＱＲＳＴＵＶＷＸＹＺ\", 0, 26);\n\n    # Greek\n    n(\"αβγδεζηθικλμνξοπρστυφχψω\", \"ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ\");\n    x2(\"(?i)αβγδεζηθικλμνξοπρστυφχψω\", \"αβγδεζηθικλμνξοπρστυφχψω\", 0, 24);\n    x2(\"(?i)αβγδεζηθικλμνξοπρστυφχψω\", \"ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ\", 0, 24);\n    x2(\"(?i)ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ\", \"αβγδεζηθικλμνξοπρστυφχψω\", 0, 24);\n    x2(\"(?i)ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ\", \"ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩ\", 0, 24);\n\n    # Cyrillic\n    n(\"абвгдеёжзийклмнопрстуфхцчшщъыьэюя\", \"АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ\");\n    x2(\"(?i)абвгдеёжзийклмнопрстуфхцчшщъыьэюя\", \"абвгдеёжзийклмнопрстуфхцчшщъыьэюя\", 0, 33);\n    x2(\"(?i)абвгдеёжзийклмнопрстуфхцчшщъыьэюя\", \"АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ\", 0, 33);\n    x2(\"(?i)АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ\", \"абвгдеёжзийклмнопрстуфхцчшщъыьэюя\", 0, 33);\n    x2(\"(?i)АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ\", \"АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ\", 0, 33);\n\n    # multiple name definition\n    x2(\"(?<a>a)(?<a>b)\\\\k<a>\", \"aba\", 0, 3)\n#    x2(\"(?<a>a)(?<a>b)(?&a)\", \"aba\", 0, 3)\n#    x2(\"(?<a>(a|.)(?<a>b))(?&a)\", \"abcb\", 0, 4)\n\n    # branch reset\n#    x3(\"(?|(c)|(?:(b)|(a)))\", \"a\", 0, 1, 2)\n#    x3(\"(?|(c)|(?|(b)|(a)))\", \"a\", 0, 1, 1)\n\n    # conditional expression\n    x2(\"(?:(a)|(b))(?(1)cd)e\", \"acde\", 0, 4)\n    n(\"(?:(a)|(b))(?(1)cd)e\", \"ae\")\n    x2(\"(?:(a)|(b))(?(2)cd)e\", \"ae\", 0, 2)\n    n(\"(?:(a)|(b))(?(2)cd)e\", \"acde\")\n    x2(\"(?:(a)|(b))(?(1)c|d)\", \"ac\", 0, 2)\n    x2(\"(?:(a)|(b))(?(1)c|d)\", \"bd\", 0, 2)\n    n(\"(?:(a)|(b))(?(1)c|d)\", \"ad\")\n    n(\"(?:(a)|(b))(?(1)c|d)\", \"bc\")\n    x2(\"(?:(a)|(b))(?:(?(1)cd)e|fg)\", \"acde\", 0, 4)\n    x2(\"(?:(a)|(b))(?:(?(1)cd|x)e|fg)\", \"bxe\", 0, 3)\n    n(\"(?:(a)|(b))(?:(?(2)cd|x)e|fg)\", \"bxe\")\n    x2(\"(?:(?<x>a)|(?<y>b))(?:(?(<x>)cd|x)e|fg)\", \"bxe\", 0, 3)\n    n(\"(?:(?<x>a)|(?<y>b))(?:(?(<y>)cd|x)e|fg)\", \"bxe\")\n    x2(\"((?<=a))?(?(1)b|c)\", \"abc\", 1, 2)\n    x2(\"((?<=a))?(?(1)b|c)\", \"bc\", 1, 2)\n    x2(\"((?<x>x)|(?<y>y))(?(<x>)y|x)\", \"xy\", 0, 2)\n    x2(\"((?<x>x)|(?<y>y))(?(<x>)y|x)\", \"yx\", 0, 2)\n    n(\"((?<x>x)|(?<y>y))(?(<x>)y|x)\", \"xx\")\n    n(\"((?<x>x)|(?<y>y))(?(<x>)y|x)\", \"yy\")\n\n    # Implicit-anchor optimization\n    x2(\"(?m:.*abc)\", \"dddabdd\\nddabc\", 0, 13)   # optimized /(?m:.*abc)/ ==> /\\A(?m:.*abc)/\n    x2(\"(?m:.+abc)\", \"dddabdd\\nddabc\", 0, 13)   # optimized\n    x2(\"(?-m:.*abc)\", \"dddabdd\\nddabc\", 8, 13)  # optimized /(?-m:.*abc)/ ==> /(?:^|\\A)(?m:.*abc)/\n    x2(\"(?-m:.+abc)\", \"dddabdd\\nddabc\", 8, 13)  # optimized\n    x2(\"(?-m:.*abc)\", \"dddabdd\\nabc\", 8, 11)    # optimized\n    n(\"(?-m:.+abc)\", \"dddabdd\\nabc\")            # optimized\n    x2(\"(?m:.*\\\\Z)\", \"dddabdd\\nddabc\", 0, 13)   # optimized /(?m:.*\\Z)/ ==> /\\A(?m:.*\\Z)/\n    x2(\"(?-m:.*\\\\Z)\", \"dddabdd\\nddabc\", 8, 13)  # optimized /(?-m:.*\\Z)/ ==> /(?:^|\\A)(?m:.*\\Z)/\n    x2(\"(.*)X\\\\1\", \"1234X2345\", 1, 8)           # not optimized\n\n    # Allow options in look-behind\n    x2(\"(?<=(?i)ab)cd\", \"ABcd\", 2, 4)\n    x2(\"(?<=(?i:ab))cd\", \"ABcd\", 2, 4)\n    n(\"(?<=(?i)ab)cd\", \"ABCD\")\n    n(\"(?<=(?i:ab))cd\", \"ABCD\")\n    x2(\"(?<!(?i)ab)cd\", \"aacd\", 2, 4)\n    x2(\"(?<!(?i:ab))cd\", \"aacd\", 2, 4)\n    n(\"(?<!(?i)ab)cd\", \"ABcd\")\n    n(\"(?<!(?i:ab))cd\", \"ABcd\")\n\n\n    print(\"\\nRESULT   SUCC: %d,  FAIL: %d,  ERROR: %d      (by Onigmo %s)\" % (\n          nsucc, nfail, nerror, onig.onig_version()))\n\n    onig.onig_region_free(region, 1)\n    onig.onig_end()\n\n    if (nfail == 0 and nerror == 0):\n        exit(0)\n    else:\n        exit(-1)\n\nif __name__ == '__main__':\n    main()\n\n"
  },
  {
    "path": "src/Onigmo/testu.c",
    "content": "/*\n * This program was generated by testconv.rb.\n */\n#include<stdio.h>\n\n#ifdef POSIX_TEST\n#include \"onigposix.h\"\n#else\n#include \"oniguruma.h\"\n#endif\n\nstatic int nsucc  = 0;\nstatic int nfail  = 0;\nstatic int nerror = 0;\n\nstatic FILE* err_file;\n\n#ifndef POSIX_TEST\nstatic OnigRegion* region;\nstatic OnigEncoding ENC;\n#endif\n\n#define ulen(p) onigenc_str_bytelen_null(ENC, (UChar* )p)\n\nstatic void uconv(char* from, char* to, int len)\n{\n  int i;\n  unsigned char c;\n  char *q;\n\n  q = to;\n\n  for (i = 0; i < len; i += 2) {\n    c = (unsigned char )from[i];\n    if (c == 0) {\n      c = (unsigned char )from[i+1];\n      if (c < 0x20 || c >= 0x7f || c == 0x5c || c == 0x22) {\n        sprintf(q, \"\\\\%03o\", c);\n        q += 4;\n      }\n      else {\n        sprintf(q, \"%c\", c);\n        q++;\n      }\n    }\n    else {\n      sprintf(q, \"\\\\%03o\", c);\n      q += 4;\n      c = (unsigned char )from[i+1];\n      sprintf(q, \"\\\\%03o\", c);\n      q += 4;\n    }\n  }\n\n  *q = 0;\n}\n\nstatic void xx(char* pattern, char* str, int from, int to, int mem, int not)\n{\n  OnigPosition r;\n  char cpat[4000], cstr[4000];\n\n#ifdef POSIX_TEST\n  regex_t reg;\n  char buf[200];\n  regmatch_t pmatch[20];\n\n  uconv(pattern, cpat, ulen(pattern));\n  uconv(str,     cstr, ulen(str));\n\n  r = regcomp(&reg, pattern, REG_EXTENDED | REG_NEWLINE);\n  if (r) {\n    regerror(r, &reg, buf, sizeof(buf));\n    fprintf(err_file, \"ERROR: %s\\n\", buf);\n    nerror++;\n    return ;\n  }\n\n  r = regexec(&reg, str, reg.re_nsub + 1, pmatch, 0);\n  if (r != 0 && r != REG_NOMATCH) {\n    regerror(r, &reg, buf, sizeof(buf));\n    fprintf(err_file, \"ERROR: %s\\n\", buf);\n    nerror++;\n    return ;\n  }\n\n  if (r == REG_NOMATCH) {\n    if (not) {\n      fprintf(stdout, \"OK(N): /%s/ '%s'\\n\", cpat, cstr);\n      nsucc++;\n    }\n    else {\n      fprintf(stdout, \"FAIL: /%s/ '%s'\\n\", cpat, cstr);\n      nfail++;\n    }\n  }\n  else {\n    if (not) {\n      fprintf(stdout, \"FAIL(N): /%s/ '%s'\\n\", cpat, cstr);\n      nfail++;\n    }\n    else {\n      if (pmatch[mem].rm_so == from && pmatch[mem].rm_eo == to) {\n        fprintf(stdout, \"OK: /%s/ '%s'\\n\", cpat, cstr);\n        nsucc++;\n      }\n      else {\n        fprintf(stdout, \"FAIL: /%s/ '%s' %d-%d : %d-%d\\n\", cpat, cstr,\n\t        from, to, pmatch[mem].rm_so, pmatch[mem].rm_eo);\n        nfail++;\n      }\n    }\n  }\n  regfree(&reg);\n\n#else\n  regex_t* reg;\n  OnigCompileInfo ci;\n  OnigErrorInfo einfo;\n  OnigSyntaxType syn = *ONIG_SYNTAX_DEFAULT;\n  OnigIterator it = {onig_default_charat, str};\n\n  /* ONIG_OPTION_OFF(syn.options, ONIG_OPTION_ASCII_RANGE); */\n\n  uconv(pattern, cpat, ulen(pattern));\n  uconv(str,     cstr, ulen(str));\n\n#if 0\n  r = onig_new(&reg, (UChar* )pattern, (UChar* )(pattern + ulen(pattern)),\n\t       ONIG_OPTION_DEFAULT, ENC, &syn, &einfo);\n#else\n  ci.num_of_elements = 5;\n  ci.pattern_enc = ENC;\n  ci.target_enc  = ENC;\n  ci.syntax      = &syn;\n  ci.option      = ONIG_OPTION_DEFAULT;\n  ci.case_fold_flag = ONIGENC_CASE_FOLD_DEFAULT;\n\n  r = onig_new_deluxe(&reg, (UChar* )pattern,\n          (UChar* )(pattern + ulen(pattern)),\n          &ci, &einfo);\n#endif\n\n  if (r) {\n    char s[ONIG_MAX_ERROR_MESSAGE_LEN];\n    onig_error_code_to_str(s, r, &einfo);\n    fprintf(err_file, \"ERROR: %s\\n\", s);\n    nerror++;\n    return ;\n  }\n\n  r = onig_search(&it, reg, 0, ulen(str),\n\t\t  0, ulen(str),\n\t\t  region, ONIG_OPTION_NONE);\n  if (r < ONIG_MISMATCH) {\n    char s[ONIG_MAX_ERROR_MESSAGE_LEN];\n    onig_error_code_to_str(s, r);\n    fprintf(err_file, \"ERROR: %s\\n\", s);\n    nerror++;\n    return ;\n  }\n\n  if (r == ONIG_MISMATCH) {\n    if (not) {\n      fprintf(stdout, \"OK(N): /%s/ '%s'\\n\", cpat, cstr);\n      nsucc++;\n    }\n    else {\n      fprintf(stdout, \"FAIL: /%s/ '%s'\\n\", cpat, cstr);\n      nfail++;\n    }\n  }\n  else {\n    if (not) {\n      fprintf(stdout, \"FAIL(N): /%s/ '%s'\\n\", cpat, cstr);\n      nfail++;\n    }\n    else {\n      if (region->beg[mem] == from && region->end[mem] == to) {\n        fprintf(stdout, \"OK: /%s/ '%s'\\n\", cpat, cstr);\n        nsucc++;\n      }\n      else {\n        fprintf(stdout, \"FAIL: /%s/ '%s' %d-%d : %d-%d\\n\", cpat, cstr,\n\t        from, to, region->beg[mem], region->end[mem]);\n        nfail++;\n      }\n    }\n  }\n  onig_free(reg);\n#endif\n}\n\nstatic void x2(char* pattern, char* str, int from, int to)\n{\n  xx(pattern, str, from, to, 0, 0);\n}\n\nstatic void x3(char* pattern, char* str, int from, int to, int mem)\n{\n  xx(pattern, str, from, to, mem, 0);\n}\n\nstatic void n(char* pattern, char* str)\n{\n  xx(pattern, str, 0, 0, 0, 1);\n}\n\nextern int main(int argc, char* argv[])\n{\n  err_file = stdout;\n\n#ifndef POSIX_TEST\n  region = onig_region_new();\n#endif\n#ifdef POSIX_TEST\n  reg_set_encoding(REG_POSIX_ENCODING_UTF16_BE);\n#else\n  ENC = ONIG_ENCODING_UTF16_BE;\n#endif\n  x2(\"\\000\\000\", \"\\000\\000\", 0, 0);\n  x2(\"\\000^\\000\\000\", \"\\000\\000\", 0, 0);\n  x2(\"\\000$\\000\\000\", \"\\000\\000\", 0, 0);\n  x2(\"\\000\\134\\000G\\000\\000\", \"\\000\\000\", 0, 0);\n  x2(\"\\000\\134\\000A\\000\\000\", \"\\000\\000\", 0, 0);\n  x2(\"\\000\\134\\000Z\\000\\000\", \"\\000\\000\", 0, 0);\n  x2(\"\\000\\134\\000z\\000\\000\", \"\\000\\000\", 0, 0);\n  x2(\"\\000^\\000$\\000\\000\", \"\\000\\000\", 0, 0);\n  x2(\"\\000\\134\\000c\\000a\\000\\000\", \"\\000\\001\\000\\000\", 0, 2);\n  x2(\"\\000\\134\\000C\\000-\\000b\\000\\000\", \"\\000\\002\\000\\000\", 0, 2);\n  x2(\"\\000\\134\\000c\\000\\134\\000\\134\\000\\000\", \"\\000\\034\\000\\000\", 0, 2);\n  x2(\"\\000q\\000[\\000\\134\\000c\\000\\134\\000\\134\\000]\\000\\000\", \"\\000q\\000\\034\\000\\000\", 0, 4);\n  x2(\"\\000\\000\", \"\\000a\\000\\000\", 0, 0);\n  x2(\"\\000a\\000\\000\", \"\\000a\\000\\000\", 0, 2);\n  x2(\"\\000\\134\\000x\\0000\\0000\\000\\134\\000x\\0006\\0001\\000\\000\", \"\\000a\\000\\000\", 0, 2);\n  x2(\"\\000a\\000a\\000\\000\", \"\\000a\\000a\\000\\000\", 0, 4);\n  x2(\"\\000a\\000a\\000a\\000\\000\", \"\\000a\\000a\\000a\\000\\000\", 0, 6);\n  x2(\"\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000\\000\", \"\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000\\000\", 0, 70);\n  x2(\"\\000a\\000b\\000\\000\", \"\\000a\\000b\\000\\000\", 0, 4);\n  x2(\"\\000b\\000\\000\", \"\\000a\\000b\\000\\000\", 2, 4);\n  x2(\"\\000b\\000c\\000\\000\", \"\\000a\\000b\\000c\\000\\000\", 2, 6);\n  x2(\"\\000(\\000?\\000i\\000:\\000#\\000R\\000E\\000T\\000#\\000)\\000\\000\", \"\\000#\\000I\\000N\\000S\\000#\\000#\\000R\\000E\\000T\\000#\\000\\000\", 10, 20);\n  x2(\"\\000\\134\\0000\\0000\\0000\\000\\134\\0001\\0007\\000\\000\", \"\\000\\017\\000\\000\", 0, 2);\n  x2(\"\\000\\134\\000x\\0000\\0000\\000\\134\\000x\\0001\\000f\\000\\000\", \"\\000\\037\\000\\000\", 0, 2);\n  x2(\"\\000a\\000(\\000?\\000#\\000.\\000.\\000.\\000.\\000\\134\\000\\134\\000J\\000J\\000J\\000J\\000)\\000b\\000\\000\", \"\\000a\\000b\\000\\000\", 0, 4);\n  x2(\"\\000(\\000?\\000x\\000)\\000 \\000 \\000G\\000 \\000(\\000o\\000 \\000O\\000(\\000?\\000-\\000x\\000)\\000o\\000O\\000)\\000 \\000g\\000 \\000L\\000\\000\", \"\\000G\\000o\\000O\\000o\\000O\\000g\\000L\\000e\\000\\000\", 0, 14);\n  x2(\"\\000.\\000\\000\", \"\\000a\\000\\000\", 0, 2);\n  n(\"\\000.\\000\\000\", \"\\000\\000\");\n  x2(\"\\000.\\000.\\000\\000\", \"\\000a\\000b\\000\\000\", 0, 4);\n  x2(\"\\000\\134\\000w\\000\\000\", \"\\000e\\000\\000\", 0, 2);\n  n(\"\\000\\134\\000W\\000\\000\", \"\\000e\\000\\000\");\n  x2(\"\\000\\134\\000s\\000\\000\", \"\\000 \\000\\000\", 0, 2);\n  x2(\"\\000\\134\\000S\\000\\000\", \"\\000b\\000\\000\", 0, 2);\n  x2(\"\\000\\134\\000d\\000\\000\", \"\\0004\\000\\000\", 0, 2);\n  n(\"\\000\\134\\000D\\000\\000\", \"\\0004\\000\\000\");\n  x2(\"\\000\\134\\000b\\000\\000\", \"\\000z\\000 \\000\\000\", 0, 0);\n  x2(\"\\000\\134\\000b\\000\\000\", \"\\000 \\000z\\000\\000\", 2, 2);\n  x2(\"\\000\\134\\000B\\000\\000\", \"\\000z\\000z\\000 \\000\\000\", 2, 2);\n  x2(\"\\000\\134\\000B\\000\\000\", \"\\000z\\000 \\000\\000\", 4, 4);\n  x2(\"\\000\\134\\000B\\000\\000\", \"\\000 \\000z\\000\\000\", 0, 0);\n  x2(\"\\000[\\000a\\000b\\000]\\000\\000\", \"\\000b\\000\\000\", 0, 2);\n  n(\"\\000[\\000a\\000b\\000]\\000\\000\", \"\\000c\\000\\000\");\n  x2(\"\\000[\\000a\\000-\\000z\\000]\\000\\000\", \"\\000t\\000\\000\", 0, 2);\n  n(\"\\000[\\000^\\000a\\000]\\000\\000\", \"\\000a\\000\\000\");\n  x2(\"\\000[\\000^\\000a\\000]\\000\\000\", \"\\000\\012\\000\\000\", 0, 2);\n  x2(\"\\000[\\000]\\000]\\000\\000\", \"\\000]\\000\\000\", 0, 2);\n  n(\"\\000[\\000^\\000]\\000]\\000\\000\", \"\\000]\\000\\000\");\n  x2(\"\\000[\\000\\134\\000^\\000]\\000+\\000\\000\", \"\\0000\\000^\\000^\\0001\\000\\000\", 2, 6);\n  x2(\"\\000[\\000b\\000-\\000]\\000\\000\", \"\\000b\\000\\000\", 0, 2);\n  x2(\"\\000[\\000b\\000-\\000]\\000\\000\", \"\\000-\\000\\000\", 0, 2);\n  x2(\"\\000[\\000\\134\\000w\\000]\\000\\000\", \"\\000z\\000\\000\", 0, 2);\n  n(\"\\000[\\000\\134\\000w\\000]\\000\\000\", \"\\000 \\000\\000\");\n  x2(\"\\000[\\000\\134\\000W\\000]\\000\\000\", \"\\000b\\000$\\000\\000\", 2, 4);\n  x2(\"\\000[\\000\\134\\000d\\000]\\000\\000\", \"\\0005\\000\\000\", 0, 2);\n  n(\"\\000[\\000\\134\\000d\\000]\\000\\000\", \"\\000e\\000\\000\");\n  x2(\"\\000[\\000\\134\\000D\\000]\\000\\000\", \"\\000t\\000\\000\", 0, 2);\n  n(\"\\000[\\000\\134\\000D\\000]\\000\\000\", \"\\0003\\000\\000\");\n  x2(\"\\000[\\000\\134\\000s\\000]\\000\\000\", \"\\000 \\000\\000\", 0, 2);\n  n(\"\\000[\\000\\134\\000s\\000]\\000\\000\", \"\\000a\\000\\000\");\n  x2(\"\\000[\\000\\134\\000S\\000]\\000\\000\", \"\\000b\\000\\000\", 0, 2);\n  n(\"\\000[\\000\\134\\000S\\000]\\000\\000\", \"\\000 \\000\\000\");\n  x2(\"\\000[\\000\\134\\000w\\000\\134\\000d\\000]\\000\\000\", \"\\0002\\000\\000\", 0, 2);\n  n(\"\\000[\\000\\134\\000w\\000\\134\\000d\\000]\\000\\000\", \"\\000 \\000\\000\");\n  x2(\"\\000[\\000[\\000:\\000u\\000p\\000p\\000e\\000r\\000:\\000]\\000]\\000\\000\", \"\\000B\\000\\000\", 0, 2);\n  x2(\"\\000[\\000*\\000[\\000:\\000x\\000d\\000i\\000g\\000i\\000t\\000:\\000]\\000+\\000]\\000\\000\", \"\\000+\\000\\000\", 0, 2);\n  x2(\"\\000[\\000*\\000[\\000:\\000x\\000d\\000i\\000g\\000i\\000t\\000:\\000]\\000+\\000]\\000\\000\", \"\\000G\\000H\\000I\\000K\\000K\\000-\\0009\\000+\\000*\\000\\000\", 12, 14);\n  x2(\"\\000[\\000*\\000[\\000:\\000x\\000d\\000i\\000g\\000i\\000t\\000:\\000]\\000+\\000]\\000\\000\", \"\\000-\\000@\\000^\\000+\\000\\000\", 6, 8);\n  n(\"\\000[\\000[\\000:\\000u\\000p\\000p\\000e\\000r\\000]\\000]\\000\\000\", \"\\000A\\000\\000\");\n  x2(\"\\000[\\000[\\000:\\000u\\000p\\000p\\000e\\000r\\000]\\000]\\000\\000\", \"\\000:\\000\\000\", 0, 2);\n  x2(\"\\000[\\000\\134\\0000\\0000\\0000\\000\\134\\0000\\0004\\0004\\000-\\000\\134\\0000\\0000\\0000\\000\\134\\0000\\0004\\0007\\000]\\000\\000\", \"\\000&\\000\\000\", 0, 2);\n  x2(\"\\000[\\000\\134\\000x\\0000\\0000\\000\\134\\000x\\0005\\000a\\000-\\000\\134\\000x\\0000\\0000\\000\\134\\000x\\0005\\000c\\000]\\000\\000\", \"\\000[\\000\\000\", 0, 2);\n  x2(\"\\000[\\000\\134\\000x\\0000\\0000\\000\\134\\000x\\0006\\000A\\000-\\000\\134\\000x\\0000\\0000\\000\\134\\000x\\0006\\000D\\000]\\000\\000\", \"\\000l\\000\\000\", 0, 2);\n  n(\"\\000[\\000\\134\\000x\\0000\\0000\\000\\134\\000x\\0006\\000A\\000-\\000\\134\\000x\\0000\\0000\\000\\134\\000x\\0006\\000D\\000]\\000\\000\", \"\\000n\\000\\000\");\n  n(\"\\000^\\000[\\0000\\000-\\0009\\000A\\000-\\000F\\000]\\000+\\000 \\0000\\000+\\000 \\000U\\000N\\000D\\000E\\000F\\000 \\000\\000\", \"\\0007\\0005\\000F\\000 \\0000\\0000\\0000\\0000\\0000\\0000\\0000\\0000\\000 \\000S\\000E\\000C\\000T\\0001\\0004\\000A\\000 \\000n\\000o\\000t\\000y\\000p\\000e\\000 \\000(\\000)\\000 \\000 \\000 \\000 \\000E\\000x\\000t\\000e\\000r\\000n\\000a\\000l\\000 \\000 \\000 \\000 \\000|\\000 \\000_\\000r\\000b\\000_\\000a\\000p\\000p\\000l\\000y\\000\\000\");\n  x2(\"\\000[\\000\\134\\000[\\000]\\000\\000\", \"\\000[\\000\\000\", 0, 2);\n  x2(\"\\000[\\000\\134\\000]\\000]\\000\\000\", \"\\000]\\000\\000\", 0, 2);\n  x2(\"\\000[\\000&\\000]\\000\\000\", \"\\000&\\000\\000\", 0, 2);\n  x2(\"\\000[\\000[\\000a\\000b\\000]\\000]\\000\\000\", \"\\000b\\000\\000\", 0, 2);\n  x2(\"\\000[\\000[\\000a\\000b\\000]\\000c\\000]\\000\\000\", \"\\000c\\000\\000\", 0, 2);\n  n(\"\\000[\\000[\\000^\\000a\\000]\\000]\\000\\000\", \"\\000a\\000\\000\");\n  n(\"\\000[\\000^\\000[\\000a\\000]\\000]\\000\\000\", \"\\000a\\000\\000\");\n  x2(\"\\000[\\000[\\000a\\000b\\000]\\000&\\000&\\000b\\000c\\000]\\000\\000\", \"\\000b\\000\\000\", 0, 2);\n  n(\"\\000[\\000[\\000a\\000b\\000]\\000&\\000&\\000b\\000c\\000]\\000\\000\", \"\\000a\\000\\000\");\n  n(\"\\000[\\000[\\000a\\000b\\000]\\000&\\000&\\000b\\000c\\000]\\000\\000\", \"\\000c\\000\\000\");\n  x2(\"\\000[\\000a\\000-\\000z\\000&\\000&\\000b\\000-\\000y\\000&\\000&\\000c\\000-\\000x\\000]\\000\\000\", \"\\000w\\000\\000\", 0, 2);\n  n(\"\\000[\\000^\\000a\\000-\\000z\\000&\\000&\\000b\\000-\\000y\\000&\\000&\\000c\\000-\\000x\\000]\\000\\000\", \"\\000w\\000\\000\");\n  x2(\"\\000[\\000[\\000^\\000a\\000&\\000&\\000a\\000]\\000&\\000&\\000a\\000-\\000z\\000]\\000\\000\", \"\\000b\\000\\000\", 0, 2);\n  n(\"\\000[\\000[\\000^\\000a\\000&\\000&\\000a\\000]\\000&\\000&\\000a\\000-\\000z\\000]\\000\\000\", \"\\000a\\000\\000\");\n  x2(\"\\000[\\000[\\000^\\000a\\000-\\000z\\000&\\000&\\000b\\000c\\000d\\000e\\000f\\000]\\000&\\000&\\000[\\000^\\000c\\000-\\000g\\000]\\000]\\000\\000\", \"\\000h\\000\\000\", 0, 2);\n  n(\"\\000[\\000[\\000^\\000a\\000-\\000z\\000&\\000&\\000b\\000c\\000d\\000e\\000f\\000]\\000&\\000&\\000[\\000^\\000c\\000-\\000g\\000]\\000]\\000\\000\", \"\\000c\\000\\000\");\n  x2(\"\\000[\\000^\\000[\\000^\\000a\\000b\\000c\\000]\\000&\\000&\\000[\\000^\\000c\\000d\\000e\\000]\\000]\\000\\000\", \"\\000c\\000\\000\", 0, 2);\n  x2(\"\\000[\\000^\\000[\\000^\\000a\\000b\\000c\\000]\\000&\\000&\\000[\\000^\\000c\\000d\\000e\\000]\\000]\\000\\000\", \"\\000e\\000\\000\", 0, 2);\n  n(\"\\000[\\000^\\000[\\000^\\000a\\000b\\000c\\000]\\000&\\000&\\000[\\000^\\000c\\000d\\000e\\000]\\000]\\000\\000\", \"\\000f\\000\\000\");\n  x2(\"\\000[\\000a\\000-\\000&\\000&\\000-\\000a\\000]\\000\\000\", \"\\000-\\000\\000\", 0, 2);\n  n(\"\\000[\\000a\\000\\134\\000-\\000&\\000&\\000\\134\\000-\\000a\\000]\\000\\000\", \"\\000&\\000\\000\");\n  n(\"\\000\\134\\000w\\000a\\000b\\000c\\000\\000\", \"\\000 \\000a\\000b\\000c\\000\\000\");\n  x2(\"\\000a\\000\\134\\000W\\000b\\000c\\000\\000\", \"\\000a\\000 \\000b\\000c\\000\\000\", 0, 8);\n  x2(\"\\000a\\000.\\000b\\000.\\000c\\000\\000\", \"\\000a\\000a\\000b\\000b\\000c\\000\\000\", 0, 10);\n  x2(\"\\000.\\000\\134\\000w\\000b\\000\\134\\000W\\000.\\000.\\000c\\000\\000\", \"\\000a\\000b\\000b\\000 \\000b\\000c\\000c\\000\\000\", 0, 14);\n  x2(\"\\000\\134\\000s\\000\\134\\000w\\000z\\000z\\000z\\000\\000\", \"\\000 \\000z\\000z\\000z\\000z\\000\\000\", 0, 10);\n  x2(\"\\000a\\000a\\000.\\000b\\000\\000\", \"\\000a\\000a\\000b\\000b\\000\\000\", 0, 8);\n  n(\"\\000.\\000a\\000\\000\", \"\\000a\\000b\\000\\000\");\n  x2(\"\\000.\\000a\\000\\000\", \"\\000a\\000a\\000\\000\", 0, 4);\n  x2(\"\\000^\\000a\\000\\000\", \"\\000a\\000\\000\", 0, 2);\n  x2(\"\\000^\\000a\\000$\\000\\000\", \"\\000a\\000\\000\", 0, 2);\n  x2(\"\\000^\\000\\134\\000w\\000$\\000\\000\", \"\\000a\\000\\000\", 0, 2);\n  n(\"\\000^\\000\\134\\000w\\000$\\000\\000\", \"\\000 \\000\\000\");\n  x2(\"\\000^\\000\\134\\000w\\000a\\000b\\000$\\000\\000\", \"\\000z\\000a\\000b\\000\\000\", 0, 6);\n  x2(\"\\000^\\000\\134\\000w\\000a\\000b\\000c\\000d\\000e\\000f\\000$\\000\\000\", \"\\000z\\000a\\000b\\000c\\000d\\000e\\000f\\000\\000\", 0, 14);\n  x2(\"\\000^\\000\\134\\000w\\000.\\000.\\000.\\000d\\000e\\000f\\000$\\000\\000\", \"\\000z\\000a\\000b\\000c\\000d\\000e\\000f\\000\\000\", 0, 14);\n  x2(\"\\000\\134\\000w\\000\\134\\000w\\000\\134\\000s\\000\\134\\000W\\000a\\000a\\000a\\000\\134\\000d\\000\\000\", \"\\000a\\000a\\000 \\000 \\000a\\000a\\000a\\0004\\000\\000\", 0, 16);\n  x2(\"\\000\\134\\000A\\000\\134\\000Z\\000\\000\", \"\\000\\000\", 0, 0);\n  x2(\"\\000\\134\\000A\\000x\\000y\\000z\\000\\000\", \"\\000x\\000y\\000z\\000\\000\", 0, 6);\n  x2(\"\\000x\\000y\\000z\\000\\134\\000Z\\000\\000\", \"\\000x\\000y\\000z\\000\\000\", 0, 6);\n  x2(\"\\000x\\000y\\000z\\000\\134\\000z\\000\\000\", \"\\000x\\000y\\000z\\000\\000\", 0, 6);\n  x2(\"\\000a\\000\\134\\000Z\\000\\000\", \"\\000a\\000\\000\", 0, 2);\n  x2(\"\\000\\134\\000G\\000a\\000z\\000\\000\", \"\\000a\\000z\\000\\000\", 0, 4);\n  n(\"\\000\\134\\000G\\000z\\000\\000\", \"\\000b\\000z\\000a\\000\\000\");\n  n(\"\\000a\\000z\\000\\134\\000G\\000\\000\", \"\\000a\\000z\\000\\000\");\n  n(\"\\000a\\000z\\000\\134\\000A\\000\\000\", \"\\000a\\000z\\000\\000\");\n  n(\"\\000a\\000\\134\\000A\\000z\\000\\000\", \"\\000a\\000z\\000\\000\");\n  x2(\"\\000\\134\\000^\\000\\134\\000$\\000\\000\", \"\\000^\\000$\\000\\000\", 0, 4);\n  x2(\"\\000^\\000x\\000?\\000y\\000\\000\", \"\\000x\\000y\\000\\000\", 0, 4);\n  x2(\"\\000^\\000(\\000x\\000?\\000y\\000)\\000\\000\", \"\\000x\\000y\\000\\000\", 0, 4);\n  x2(\"\\000\\134\\000w\\000\\000\", \"\\000_\\000\\000\", 0, 2);\n  n(\"\\000\\134\\000W\\000\\000\", \"\\000_\\000\\000\");\n  x2(\"\\000(\\000?\\000=\\000z\\000)\\000z\\000\\000\", \"\\000z\\000\\000\", 0, 2);\n  n(\"\\000(\\000?\\000=\\000z\\000)\\000.\\000\\000\", \"\\000a\\000\\000\");\n  x2(\"\\000(\\000?\\000!\\000z\\000)\\000a\\000\\000\", \"\\000a\\000\\000\", 0, 2);\n  n(\"\\000(\\000?\\000!\\000z\\000)\\000a\\000\\000\", \"\\000z\\000\\000\");\n  x2(\"\\000(\\000?\\000i\\000:\\000a\\000)\\000\\000\", \"\\000a\\000\\000\", 0, 2);\n  x2(\"\\000(\\000?\\000i\\000:\\000a\\000)\\000\\000\", \"\\000A\\000\\000\", 0, 2);\n  x2(\"\\000(\\000?\\000i\\000:\\000A\\000)\\000\\000\", \"\\000a\\000\\000\", 0, 2);\n  n(\"\\000(\\000?\\000i\\000:\\000A\\000)\\000\\000\", \"\\000b\\000\\000\");\n  x2(\"\\000(\\000?\\000i\\000:\\000[\\000A\\000-\\000Z\\000]\\000)\\000\\000\", \"\\000a\\000\\000\", 0, 2);\n  x2(\"\\000(\\000?\\000i\\000:\\000[\\000f\\000-\\000m\\000]\\000)\\000\\000\", \"\\000H\\000\\000\", 0, 2);\n  x2(\"\\000(\\000?\\000i\\000:\\000[\\000f\\000-\\000m\\000]\\000)\\000\\000\", \"\\000h\\000\\000\", 0, 2);\n  n(\"\\000(\\000?\\000i\\000:\\000[\\000f\\000-\\000m\\000]\\000)\\000\\000\", \"\\000e\\000\\000\");\n  x2(\"\\000(\\000?\\000i\\000:\\000[\\000A\\000-\\000c\\000]\\000)\\000\\000\", \"\\000D\\000\\000\", 0, 2);\n  n(\"\\000(\\000?\\000i\\000:\\000[\\000^\\000a\\000-\\000z\\000]\\000)\\000\\000\", \"\\000A\\000\\000\");\n  n(\"\\000(\\000?\\000i\\000:\\000[\\000^\\000a\\000-\\000z\\000]\\000)\\000\\000\", \"\\000a\\000\\000\");\n  x2(\"\\000(\\000?\\000i\\000:\\000[\\000!\\000-\\000k\\000]\\000)\\000\\000\", \"\\000Z\\000\\000\", 0, 2);\n  x2(\"\\000(\\000?\\000i\\000:\\000[\\000!\\000-\\000k\\000]\\000)\\000\\000\", \"\\0007\\000\\000\", 0, 2);\n  x2(\"\\000(\\000?\\000i\\000:\\000[\\000T\\000-\\000}\\000]\\000)\\000\\000\", \"\\000b\\000\\000\", 0, 2);\n  x2(\"\\000(\\000?\\000i\\000:\\000[\\000T\\000-\\000}\\000]\\000)\\000\\000\", \"\\000{\\000\\000\", 0, 2);\n  x2(\"\\000(\\000?\\000i\\000:\\000\\134\\000?\\000a\\000)\\000\\000\", \"\\000?\\000A\\000\\000\", 0, 4);\n  x2(\"\\000(\\000?\\000i\\000:\\000\\134\\000*\\000A\\000)\\000\\000\", \"\\000*\\000a\\000\\000\", 0, 4);\n  n(\"\\000.\\000\\000\", \"\\000\\012\\000\\000\");\n  x2(\"\\000(\\000?\\000m\\000:\\000.\\000)\\000\\000\", \"\\000\\012\\000\\000\", 0, 2);\n  x2(\"\\000(\\000?\\000m\\000:\\000a\\000.\\000)\\000\\000\", \"\\000a\\000\\012\\000\\000\", 0, 4);\n  x2(\"\\000(\\000?\\000m\\000:\\000.\\000b\\000)\\000\\000\", \"\\000a\\000\\012\\000b\\000\\000\", 2, 6);\n  x2(\"\\000.\\000*\\000a\\000b\\000c\\000\\000\", \"\\000d\\000d\\000d\\000a\\000b\\000d\\000d\\000\\012\\000d\\000d\\000a\\000b\\000c\\000\\000\", 16, 26);\n  x2(\"\\000(\\000?\\000m\\000:\\000.\\000*\\000a\\000b\\000c\\000)\\000\\000\", \"\\000d\\000d\\000d\\000a\\000b\\000d\\000d\\000a\\000b\\000c\\000\\000\", 0, 20);\n  n(\"\\000(\\000?\\000i\\000)\\000(\\000?\\000-\\000i\\000)\\000a\\000\\000\", \"\\000A\\000\\000\");\n  n(\"\\000(\\000?\\000i\\000)\\000(\\000?\\000-\\000i\\000:\\000a\\000)\\000\\000\", \"\\000A\\000\\000\");\n  x2(\"\\000a\\000?\\000\\000\", \"\\000\\000\", 0, 0);\n  x2(\"\\000a\\000?\\000\\000\", \"\\000b\\000\\000\", 0, 0);\n  x2(\"\\000a\\000?\\000\\000\", \"\\000a\\000\\000\", 0, 2);\n  x2(\"\\000a\\000*\\000\\000\", \"\\000\\000\", 0, 0);\n  x2(\"\\000a\\000*\\000\\000\", \"\\000a\\000\\000\", 0, 2);\n  x2(\"\\000a\\000*\\000\\000\", \"\\000a\\000a\\000a\\000\\000\", 0, 6);\n  x2(\"\\000a\\000*\\000\\000\", \"\\000b\\000a\\000a\\000a\\000a\\000\\000\", 0, 0);\n  n(\"\\000a\\000+\\000\\000\", \"\\000\\000\");\n  x2(\"\\000a\\000+\\000\\000\", \"\\000a\\000\\000\", 0, 2);\n  x2(\"\\000a\\000+\\000\\000\", \"\\000a\\000a\\000a\\000a\\000\\000\", 0, 8);\n  x2(\"\\000a\\000+\\000\\000\", \"\\000a\\000a\\000b\\000b\\000b\\000\\000\", 0, 4);\n  x2(\"\\000a\\000+\\000\\000\", \"\\000b\\000a\\000a\\000a\\000a\\000\\000\", 2, 10);\n  x2(\"\\000.\\000?\\000\\000\", \"\\000\\000\", 0, 0);\n  x2(\"\\000.\\000?\\000\\000\", \"\\000f\\000\\000\", 0, 2);\n  x2(\"\\000.\\000?\\000\\000\", \"\\000\\012\\000\\000\", 0, 0);\n  x2(\"\\000.\\000*\\000\\000\", \"\\000\\000\", 0, 0);\n  x2(\"\\000.\\000*\\000\\000\", \"\\000a\\000b\\000c\\000d\\000e\\000\\000\", 0, 10);\n  x2(\"\\000.\\000+\\000\\000\", \"\\000z\\000\\000\", 0, 2);\n  x2(\"\\000.\\000+\\000\\000\", \"\\000z\\000d\\000s\\000w\\000e\\000r\\000\\012\\000\\000\", 0, 12);\n  x2(\"\\000(\\000.\\000*\\000)\\000a\\000\\134\\0001\\000f\\000\\000\", \"\\000b\\000a\\000b\\000f\\000b\\000a\\000c\\000\\000\", 0, 8);\n  x2(\"\\000(\\000.\\000*\\000)\\000a\\000\\134\\0001\\000f\\000\\000\", \"\\000b\\000a\\000c\\000b\\000a\\000b\\000f\\000\\000\", 6, 14);\n  x2(\"\\000(\\000(\\000.\\000*\\000)\\000a\\000\\134\\0002\\000f\\000)\\000\\000\", \"\\000b\\000a\\000c\\000b\\000a\\000b\\000f\\000\\000\", 6, 14);\n  x2(\"\\000(\\000.\\000*\\000)\\000a\\000\\134\\0001\\000f\\000\\000\", \"\\000b\\000a\\000c\\000z\\000z\\000z\\000z\\000z\\000z\\000\\012\\000b\\000a\\000z\\000z\\000\\012\\000z\\000z\\000z\\000z\\000b\\000a\\000b\\000f\\000\\000\", 38, 46);\n  x2(\"\\000a\\000|\\000b\\000\\000\", \"\\000a\\000\\000\", 0, 2);\n  x2(\"\\000a\\000|\\000b\\000\\000\", \"\\000b\\000\\000\", 0, 2);\n  x2(\"\\000|\\000a\\000\\000\", \"\\000a\\000\\000\", 0, 0);\n  x2(\"\\000(\\000|\\000a\\000)\\000\\000\", \"\\000a\\000\\000\", 0, 0);\n  x2(\"\\000a\\000b\\000|\\000b\\000c\\000\\000\", \"\\000a\\000b\\000\\000\", 0, 4);\n  x2(\"\\000a\\000b\\000|\\000b\\000c\\000\\000\", \"\\000b\\000c\\000\\000\", 0, 4);\n  x2(\"\\000z\\000(\\000?\\000:\\000a\\000b\\000|\\000b\\000c\\000)\\000\\000\", \"\\000z\\000b\\000c\\000\\000\", 0, 6);\n  x2(\"\\000a\\000(\\000?\\000:\\000a\\000b\\000|\\000b\\000c\\000)\\000c\\000\\000\", \"\\000a\\000a\\000b\\000c\\000\\000\", 0, 8);\n  x2(\"\\000a\\000b\\000|\\000(\\000?\\000:\\000a\\000c\\000|\\000a\\000z\\000)\\000\\000\", \"\\000a\\000z\\000\\000\", 0, 4);\n  x2(\"\\000a\\000|\\000b\\000|\\000c\\000\\000\", \"\\000d\\000c\\000\\000\", 2, 4);\n  x2(\"\\000a\\000|\\000b\\000|\\000c\\000d\\000|\\000e\\000f\\000g\\000|\\000h\\000|\\000i\\000j\\000k\\000|\\000l\\000m\\000n\\000|\\000o\\000|\\000p\\000q\\000|\\000r\\000s\\000t\\000u\\000v\\000w\\000x\\000|\\000y\\000z\\000\\000\", \"\\000p\\000q\\000r\\000\\000\", 0, 4);\n  n(\"\\000a\\000|\\000b\\000|\\000c\\000d\\000|\\000e\\000f\\000g\\000|\\000h\\000|\\000i\\000j\\000k\\000|\\000l\\000m\\000n\\000|\\000o\\000|\\000p\\000q\\000|\\000r\\000s\\000t\\000u\\000v\\000w\\000x\\000|\\000y\\000z\\000\\000\", \"\\000m\\000n\\000\\000\");\n  x2(\"\\000a\\000|\\000^\\000z\\000\\000\", \"\\000b\\000a\\000\\000\", 2, 4);\n  x2(\"\\000a\\000|\\000^\\000z\\000\\000\", \"\\000z\\000a\\000\\000\", 0, 2);\n  x2(\"\\000a\\000|\\000\\134\\000G\\000z\\000\\000\", \"\\000b\\000z\\000a\\000\\000\", 4, 6);\n  x2(\"\\000a\\000|\\000\\134\\000G\\000z\\000\\000\", \"\\000z\\000a\\000\\000\", 0, 2);\n  x2(\"\\000a\\000|\\000\\134\\000A\\000z\\000\\000\", \"\\000b\\000z\\000a\\000\\000\", 4, 6);\n  x2(\"\\000a\\000|\\000\\134\\000A\\000z\\000\\000\", \"\\000z\\000a\\000\\000\", 0, 2);\n  x2(\"\\000a\\000|\\000b\\000\\134\\000Z\\000\\000\", \"\\000b\\000a\\000\\000\", 2, 4);\n  x2(\"\\000a\\000|\\000b\\000\\134\\000Z\\000\\000\", \"\\000b\\000\\000\", 0, 2);\n  x2(\"\\000a\\000|\\000b\\000\\134\\000z\\000\\000\", \"\\000b\\000a\\000\\000\", 2, 4);\n  x2(\"\\000a\\000|\\000b\\000\\134\\000z\\000\\000\", \"\\000b\\000\\000\", 0, 2);\n  x2(\"\\000\\134\\000w\\000|\\000\\134\\000s\\000\\000\", \"\\000 \\000\\000\", 0, 2);\n  n(\"\\000\\134\\000w\\000|\\000\\134\\000w\\000\\000\", \"\\000 \\000\\000\");\n  x2(\"\\000\\134\\000w\\000|\\000%\\000\\000\", \"\\000%\\000\\000\", 0, 2);\n  x2(\"\\000\\134\\000w\\000|\\000[\\000&\\000$\\000]\\000\\000\", \"\\000&\\000\\000\", 0, 2);\n  x2(\"\\000[\\000b\\000-\\000d\\000]\\000|\\000[\\000^\\000e\\000-\\000z\\000]\\000\\000\", \"\\000a\\000\\000\", 0, 2);\n  x2(\"\\000(\\000?\\000:\\000a\\000|\\000[\\000c\\000-\\000f\\000]\\000)\\000|\\000b\\000z\\000\\000\", \"\\000d\\000z\\000\\000\", 0, 2);\n  x2(\"\\000(\\000?\\000:\\000a\\000|\\000[\\000c\\000-\\000f\\000]\\000)\\000|\\000b\\000z\\000\\000\", \"\\000b\\000z\\000\\000\", 0, 4);\n  x2(\"\\000a\\000b\\000c\\000|\\000(\\000?\\000=\\000z\\000z\\000)\\000.\\000.\\000f\\000\\000\", \"\\000z\\000z\\000f\\000\\000\", 0, 6);\n  x2(\"\\000a\\000b\\000c\\000|\\000(\\000?\\000!\\000z\\000z\\000)\\000.\\000.\\000f\\000\\000\", \"\\000a\\000b\\000f\\000\\000\", 0, 6);\n  x2(\"\\000(\\000?\\000=\\000z\\000a\\000)\\000.\\000.\\000a\\000|\\000(\\000?\\000=\\000z\\000z\\000)\\000.\\000.\\000a\\000\\000\", \"\\000z\\000z\\000a\\000\\000\", 0, 6);\n  n(\"\\000(\\000?\\000>\\000a\\000|\\000a\\000b\\000d\\000)\\000c\\000\\000\", \"\\000a\\000b\\000d\\000c\\000\\000\");\n  x2(\"\\000(\\000?\\000>\\000a\\000b\\000d\\000|\\000a\\000)\\000c\\000\\000\", \"\\000a\\000b\\000d\\000c\\000\\000\", 0, 8);\n  x2(\"\\000a\\000?\\000|\\000b\\000\\000\", \"\\000a\\000\\000\", 0, 2);\n  x2(\"\\000a\\000?\\000|\\000b\\000\\000\", \"\\000b\\000\\000\", 0, 0);\n  x2(\"\\000a\\000?\\000|\\000b\\000\\000\", \"\\000\\000\", 0, 0);\n  x2(\"\\000a\\000*\\000|\\000b\\000\\000\", \"\\000a\\000a\\000\\000\", 0, 4);\n  x2(\"\\000a\\000*\\000|\\000b\\000*\\000\\000\", \"\\000b\\000a\\000\\000\", 0, 0);\n  x2(\"\\000a\\000*\\000|\\000b\\000*\\000\\000\", \"\\000a\\000b\\000\\000\", 0, 2);\n  x2(\"\\000a\\000+\\000|\\000b\\000*\\000\\000\", \"\\000\\000\", 0, 0);\n  x2(\"\\000a\\000+\\000|\\000b\\000*\\000\\000\", \"\\000b\\000b\\000b\\000\\000\", 0, 6);\n  x2(\"\\000a\\000+\\000|\\000b\\000*\\000\\000\", \"\\000a\\000b\\000b\\000b\\000\\000\", 0, 2);\n  n(\"\\000a\\000+\\000|\\000b\\000+\\000\\000\", \"\\000\\000\");\n  x2(\"\\000(\\000a\\000|\\000b\\000)\\000?\\000\\000\", \"\\000b\\000\\000\", 0, 2);\n  x2(\"\\000(\\000a\\000|\\000b\\000)\\000*\\000\\000\", \"\\000b\\000a\\000\\000\", 0, 4);\n  x2(\"\\000(\\000a\\000|\\000b\\000)\\000+\\000\\000\", \"\\000b\\000a\\000b\\000\\000\", 0, 6);\n  x2(\"\\000(\\000a\\000b\\000|\\000c\\000a\\000)\\000+\\000\\000\", \"\\000c\\000a\\000a\\000b\\000b\\000c\\000\\000\", 0, 8);\n  x2(\"\\000(\\000a\\000b\\000|\\000c\\000a\\000)\\000+\\000\\000\", \"\\000a\\000a\\000b\\000c\\000a\\000\\000\", 2, 10);\n  x2(\"\\000(\\000a\\000b\\000|\\000c\\000a\\000)\\000+\\000\\000\", \"\\000a\\000b\\000z\\000c\\000a\\000\\000\", 0, 4);\n  x2(\"\\000(\\000a\\000|\\000b\\000a\\000b\\000)\\000+\\000\\000\", \"\\000a\\000b\\000a\\000b\\000a\\000\\000\", 0, 10);\n  x2(\"\\000(\\000a\\000|\\000b\\000a\\000b\\000)\\000+\\000\\000\", \"\\000b\\000a\\000\\000\", 2, 4);\n  x2(\"\\000(\\000a\\000|\\000b\\000a\\000b\\000)\\000+\\000\\000\", \"\\000b\\000a\\000a\\000a\\000b\\000a\\000\\000\", 2, 8);\n  x2(\"\\000(\\000?\\000:\\000a\\000|\\000b\\000)\\000(\\000?\\000:\\000a\\000|\\000b\\000)\\000\\000\", \"\\000a\\000b\\000\\000\", 0, 4);\n  x2(\"\\000(\\000?\\000:\\000a\\000*\\000|\\000b\\000*\\000)\\000(\\000?\\000:\\000a\\000*\\000|\\000b\\000*\\000)\\000\\000\", \"\\000a\\000a\\000a\\000b\\000b\\000b\\000\\000\", 0, 6);\n  x2(\"\\000(\\000?\\000:\\000a\\000*\\000|\\000b\\000*\\000)\\000(\\000?\\000:\\000a\\000+\\000|\\000b\\000+\\000)\\000\\000\", \"\\000a\\000a\\000a\\000b\\000b\\000b\\000\\000\", 0, 12);\n  x2(\"\\000(\\000?\\000:\\000a\\000+\\000|\\000b\\000+\\000)\\000{\\0002\\000}\\000\\000\", \"\\000a\\000a\\000a\\000b\\000b\\000b\\000\\000\", 0, 12);\n  x2(\"\\000h\\000{\\0000\\000,\\000}\\000\\000\", \"\\000h\\000h\\000h\\000h\\000\\000\", 0, 8);\n  x2(\"\\000(\\000?\\000:\\000a\\000+\\000|\\000b\\000+\\000)\\000{\\0001\\000,\\0002\\000}\\000\\000\", \"\\000a\\000a\\000a\\000b\\000b\\000b\\000\\000\", 0, 12);\n  n(\"\\000a\\000x\\000{\\0002\\000}\\000*\\000a\\000\\000\", \"\\0000\\000a\\000x\\000x\\000x\\000a\\0001\\000\\000\");\n  n(\"\\000a\\000.\\000{\\0000\\000,\\0002\\000}\\000a\\000\\000\", \"\\0000\\000a\\000X\\000X\\000X\\000a\\0000\\000\\000\");\n  n(\"\\000a\\000.\\000{\\0000\\000,\\0002\\000}\\000?\\000a\\000\\000\", \"\\0000\\000a\\000X\\000X\\000X\\000a\\0000\\000\\000\");\n  n(\"\\000a\\000.\\000{\\0000\\000,\\0002\\000}\\000?\\000a\\000\\000\", \"\\0000\\000a\\000X\\000X\\000X\\000X\\000a\\0000\\000\\000\");\n  x2(\"\\000^\\000a\\000{\\0002\\000,\\000}\\000?\\000a\\000$\\000\\000\", \"\\000a\\000a\\000a\\000\\000\", 0, 6);\n  x2(\"\\000^\\000[\\000a\\000-\\000z\\000]\\000{\\0002\\000,\\000}\\000?\\000$\\000\\000\", \"\\000a\\000a\\000a\\000\\000\", 0, 6);\n  x2(\"\\000(\\000?\\000:\\000a\\000+\\000|\\000\\134\\000A\\000b\\000*\\000)\\000c\\000c\\000\\000\", \"\\000c\\000c\\000\\000\", 0, 4);\n  n(\"\\000(\\000?\\000:\\000a\\000+\\000|\\000\\134\\000A\\000b\\000*\\000)\\000c\\000c\\000\\000\", \"\\000a\\000b\\000c\\000c\\000\\000\");\n  x2(\"\\000(\\000?\\000:\\000^\\000a\\000+\\000|\\000b\\000+\\000)\\000*\\000c\\000\\000\", \"\\000a\\000a\\000b\\000b\\000b\\000a\\000b\\000c\\000\\000\", 12, 16);\n  x2(\"\\000(\\000?\\000:\\000^\\000a\\000+\\000|\\000b\\000+\\000)\\000*\\000c\\000\\000\", \"\\000a\\000a\\000b\\000b\\000b\\000b\\000c\\000\\000\", 0, 14);\n  x2(\"\\000a\\000|\\000(\\000?\\000i\\000)\\000c\\000\\000\", \"\\000C\\000\\000\", 0, 2);\n  x2(\"\\000(\\000?\\000i\\000)\\000c\\000|\\000a\\000\\000\", \"\\000C\\000\\000\", 0, 2);\n  x2(\"\\000(\\000?\\000i\\000)\\000c\\000|\\000a\\000\\000\", \"\\000A\\000\\000\", 0, 2);\n  x2(\"\\000(\\000?\\000i\\000:\\000c\\000)\\000|\\000a\\000\\000\", \"\\000C\\000\\000\", 0, 2);\n  n(\"\\000(\\000?\\000i\\000:\\000c\\000)\\000|\\000a\\000\\000\", \"\\000A\\000\\000\");\n  x2(\"\\000[\\000a\\000b\\000c\\000]\\000?\\000\\000\", \"\\000a\\000b\\000c\\000\\000\", 0, 2);\n  x2(\"\\000[\\000a\\000b\\000c\\000]\\000*\\000\\000\", \"\\000a\\000b\\000c\\000\\000\", 0, 6);\n  x2(\"\\000[\\000^\\000a\\000b\\000c\\000]\\000*\\000\\000\", \"\\000a\\000b\\000c\\000\\000\", 0, 0);\n  n(\"\\000[\\000^\\000a\\000b\\000c\\000]\\000+\\000\\000\", \"\\000a\\000b\\000c\\000\\000\");\n  x2(\"\\000a\\000?\\000?\\000\\000\", \"\\000a\\000a\\000a\\000\\000\", 0, 0);\n  x2(\"\\000b\\000a\\000?\\000?\\000b\\000\\000\", \"\\000b\\000a\\000b\\000\\000\", 0, 6);\n  x2(\"\\000a\\000*\\000?\\000\\000\", \"\\000a\\000a\\000a\\000\\000\", 0, 0);\n  x2(\"\\000b\\000a\\000*\\000?\\000\\000\", \"\\000b\\000a\\000a\\000\\000\", 0, 2);\n  x2(\"\\000b\\000a\\000*\\000?\\000b\\000\\000\", \"\\000b\\000a\\000a\\000b\\000\\000\", 0, 8);\n  x2(\"\\000a\\000+\\000?\\000\\000\", \"\\000a\\000a\\000a\\000\\000\", 0, 2);\n  x2(\"\\000b\\000a\\000+\\000?\\000\\000\", \"\\000b\\000a\\000a\\000\\000\", 0, 4);\n  x2(\"\\000b\\000a\\000+\\000?\\000b\\000\\000\", \"\\000b\\000a\\000a\\000b\\000\\000\", 0, 8);\n  x2(\"\\000(\\000?\\000:\\000a\\000?\\000)\\000?\\000?\\000\\000\", \"\\000a\\000\\000\", 0, 0);\n  x2(\"\\000(\\000?\\000:\\000a\\000?\\000?\\000)\\000?\\000\\000\", \"\\000a\\000\\000\", 0, 0);\n  x2(\"\\000(\\000?\\000:\\000a\\000?\\000)\\000+\\000?\\000\\000\", \"\\000a\\000a\\000a\\000\\000\", 0, 2);\n  x2(\"\\000(\\000?\\000:\\000a\\000+\\000)\\000?\\000?\\000\\000\", \"\\000a\\000a\\000a\\000\\000\", 0, 0);\n  x2(\"\\000(\\000?\\000:\\000a\\000+\\000)\\000?\\000?\\000b\\000\\000\", \"\\000a\\000a\\000a\\000b\\000\\000\", 0, 8);\n  x2(\"\\000(\\000?\\000:\\000a\\000b\\000)\\000?\\000{\\0002\\000}\\000\\000\", \"\\000\\000\", 0, 0);\n  x2(\"\\000(\\000?\\000:\\000a\\000b\\000)\\000?\\000{\\0002\\000}\\000\\000\", \"\\000a\\000b\\000a\\000b\\000a\\000\\000\", 0, 8);\n  x2(\"\\000(\\000?\\000:\\000a\\000b\\000)\\000*\\000{\\0000\\000}\\000\\000\", \"\\000a\\000b\\000a\\000b\\000a\\000\\000\", 0, 0);\n  x2(\"\\000(\\000?\\000:\\000a\\000b\\000)\\000{\\0003\\000,\\000}\\000\\000\", \"\\000a\\000b\\000a\\000b\\000a\\000b\\000a\\000b\\000\\000\", 0, 16);\n  n(\"\\000(\\000?\\000:\\000a\\000b\\000)\\000{\\0003\\000,\\000}\\000\\000\", \"\\000a\\000b\\000a\\000b\\000\\000\");\n  x2(\"\\000(\\000?\\000:\\000a\\000b\\000)\\000{\\0002\\000,\\0004\\000}\\000\\000\", \"\\000a\\000b\\000a\\000b\\000a\\000b\\000\\000\", 0, 12);\n  x2(\"\\000(\\000?\\000:\\000a\\000b\\000)\\000{\\0002\\000,\\0004\\000}\\000\\000\", \"\\000a\\000b\\000a\\000b\\000a\\000b\\000a\\000b\\000a\\000b\\000\\000\", 0, 16);\n  x2(\"\\000(\\000?\\000:\\000a\\000b\\000)\\000{\\0002\\000,\\0004\\000}\\000?\\000\\000\", \"\\000a\\000b\\000a\\000b\\000a\\000b\\000a\\000b\\000a\\000b\\000\\000\", 0, 8);\n  x2(\"\\000(\\000?\\000:\\000a\\000b\\000)\\000{\\000,\\000}\\000\\000\", \"\\000a\\000b\\000{\\000,\\000}\\000\\000\", 0, 10);\n  x2(\"\\000(\\000?\\000:\\000a\\000b\\000c\\000)\\000+\\000?\\000{\\0002\\000}\\000\\000\", \"\\000a\\000b\\000c\\000a\\000b\\000c\\000a\\000b\\000c\\000\\000\", 0, 12);\n  x2(\"\\000(\\000?\\000:\\000X\\000*\\000)\\000(\\000?\\000i\\000:\\000x\\000a\\000)\\000\\000\", \"\\000X\\000X\\000X\\000a\\000\\000\", 0, 8);\n  x2(\"\\000(\\000d\\000+\\000)\\000(\\000[\\000^\\000a\\000b\\000c\\000]\\000z\\000)\\000\\000\", \"\\000d\\000d\\000d\\000z\\000\\000\", 0, 8);\n  x2(\"\\000(\\000[\\000^\\000a\\000b\\000c\\000]\\000*\\000)\\000(\\000[\\000^\\000a\\000b\\000c\\000]\\000z\\000)\\000\\000\", \"\\000d\\000d\\000d\\000z\\000\\000\", 0, 8);\n  x2(\"\\000(\\000\\134\\000w\\000+\\000)\\000(\\000\\134\\000w\\000z\\000)\\000\\000\", \"\\000d\\000d\\000d\\000z\\000\\000\", 0, 8);\n  x3(\"\\000(\\000a\\000)\\000\\000\", \"\\000a\\000\\000\", 0, 2, 1);\n  x3(\"\\000(\\000a\\000b\\000)\\000\\000\", \"\\000a\\000b\\000\\000\", 0, 4, 1);\n  x2(\"\\000(\\000(\\000a\\000b\\000)\\000)\\000\\000\", \"\\000a\\000b\\000\\000\", 0, 4);\n  x3(\"\\000(\\000(\\000a\\000b\\000)\\000)\\000\\000\", \"\\000a\\000b\\000\\000\", 0, 4, 1);\n  x3(\"\\000(\\000(\\000a\\000b\\000)\\000)\\000\\000\", \"\\000a\\000b\\000\\000\", 0, 4, 2);\n  x3(\"\\000(\\000(\\000(\\000(\\000(\\000(\\000(\\000(\\000(\\000(\\000(\\000(\\000(\\000(\\000(\\000(\\000(\\000(\\000(\\000(\\000a\\000b\\000)\\000)\\000)\\000)\\000)\\000)\\000)\\000)\\000)\\000)\\000)\\000)\\000)\\000)\\000)\\000)\\000)\\000)\\000)\\000)\\000\\000\", \"\\000a\\000b\\000\\000\", 0, 4, 20);\n  x3(\"\\000(\\000a\\000b\\000)\\000(\\000c\\000d\\000)\\000\\000\", \"\\000a\\000b\\000c\\000d\\000\\000\", 0, 4, 1);\n  x3(\"\\000(\\000a\\000b\\000)\\000(\\000c\\000d\\000)\\000\\000\", \"\\000a\\000b\\000c\\000d\\000\\000\", 4, 8, 2);\n  x3(\"\\000(\\000)\\000(\\000a\\000)\\000b\\000c\\000(\\000d\\000e\\000f\\000)\\000g\\000h\\000i\\000j\\000k\\000\\000\", \"\\000a\\000b\\000c\\000d\\000e\\000f\\000g\\000h\\000i\\000j\\000k\\000\\000\", 6, 12, 3);\n  x3(\"\\000(\\000(\\000)\\000(\\000a\\000)\\000b\\000c\\000(\\000d\\000e\\000f\\000)\\000g\\000h\\000i\\000j\\000k\\000)\\000\\000\", \"\\000a\\000b\\000c\\000d\\000e\\000f\\000g\\000h\\000i\\000j\\000k\\000\\000\", 6, 12, 4);\n  x2(\"\\000(\\000^\\000a\\000)\\000\\000\", \"\\000a\\000\\000\", 0, 2);\n  x3(\"\\000(\\000a\\000)\\000|\\000(\\000a\\000)\\000\\000\", \"\\000b\\000a\\000\\000\", 2, 4, 1);\n  x3(\"\\000(\\000^\\000a\\000)\\000|\\000(\\000a\\000)\\000\\000\", \"\\000b\\000a\\000\\000\", 2, 4, 2);\n  x3(\"\\000(\\000a\\000?\\000)\\000\\000\", \"\\000a\\000a\\000a\\000\\000\", 0, 2, 1);\n  x3(\"\\000(\\000a\\000*\\000)\\000\\000\", \"\\000a\\000a\\000a\\000\\000\", 0, 6, 1);\n  x3(\"\\000(\\000a\\000*\\000)\\000\\000\", \"\\000\\000\", 0, 0, 1);\n  x3(\"\\000(\\000a\\000+\\000)\\000\\000\", \"\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000\\000\", 0, 14, 1);\n  x3(\"\\000(\\000a\\000+\\000|\\000b\\000*\\000)\\000\\000\", \"\\000b\\000b\\000b\\000a\\000a\\000\\000\", 0, 6, 1);\n  x3(\"\\000(\\000a\\000+\\000|\\000b\\000?\\000)\\000\\000\", \"\\000b\\000b\\000b\\000a\\000a\\000\\000\", 0, 2, 1);\n  x3(\"\\000(\\000a\\000b\\000c\\000)\\000?\\000\\000\", \"\\000a\\000b\\000c\\000\\000\", 0, 6, 1);\n  x3(\"\\000(\\000a\\000b\\000c\\000)\\000*\\000\\000\", \"\\000a\\000b\\000c\\000\\000\", 0, 6, 1);\n  x3(\"\\000(\\000a\\000b\\000c\\000)\\000+\\000\\000\", \"\\000a\\000b\\000c\\000\\000\", 0, 6, 1);\n  x3(\"\\000(\\000x\\000y\\000z\\000|\\000a\\000b\\000c\\000)\\000+\\000\\000\", \"\\000a\\000b\\000c\\000\\000\", 0, 6, 1);\n  x3(\"\\000(\\000[\\000x\\000y\\000z\\000]\\000[\\000a\\000b\\000c\\000]\\000|\\000a\\000b\\000c\\000)\\000+\\000\\000\", \"\\000a\\000b\\000c\\000\\000\", 0, 6, 1);\n  x3(\"\\000(\\000(\\000?\\000i\\000:\\000a\\000b\\000c\\000)\\000)\\000\\000\", \"\\000A\\000b\\000C\\000\\000\", 0, 6, 1);\n  x2(\"\\000(\\000a\\000b\\000c\\000)\\000(\\000?\\000i\\000:\\000\\134\\0001\\000)\\000\\000\", \"\\000a\\000b\\000c\\000A\\000B\\000C\\000\\000\", 0, 12);\n  x3(\"\\000(\\000(\\000?\\000m\\000:\\000a\\000.\\000c\\000)\\000)\\000\\000\", \"\\000a\\000\\012\\000c\\000\\000\", 0, 6, 1);\n  x3(\"\\000(\\000(\\000?\\000=\\000a\\000z\\000)\\000a\\000)\\000\\000\", \"\\000a\\000z\\000b\\000\\000\", 0, 2, 1);\n  x3(\"\\000a\\000b\\000c\\000|\\000(\\000.\\000a\\000b\\000d\\000)\\000\\000\", \"\\000z\\000a\\000b\\000d\\000\\000\", 0, 8, 1);\n  x2(\"\\000(\\000?\\000:\\000a\\000b\\000c\\000)\\000|\\000(\\000A\\000B\\000C\\000)\\000\\000\", \"\\000a\\000b\\000c\\000\\000\", 0, 6);\n  x3(\"\\000(\\000?\\000i\\000:\\000(\\000a\\000b\\000c\\000)\\000)\\000|\\000(\\000z\\000z\\000z\\000)\\000\\000\", \"\\000A\\000B\\000C\\000\\000\", 0, 6, 1);\n  x3(\"\\000a\\000*\\000(\\000.\\000)\\000\\000\", \"\\000a\\000a\\000a\\000a\\000z\\000\\000\", 8, 10, 1);\n  x3(\"\\000a\\000*\\000?\\000(\\000.\\000)\\000\\000\", \"\\000a\\000a\\000a\\000a\\000z\\000\\000\", 0, 2, 1);\n  x3(\"\\000a\\000*\\000?\\000(\\000c\\000)\\000\\000\", \"\\000a\\000a\\000a\\000a\\000c\\000\\000\", 8, 10, 1);\n  x3(\"\\000[\\000b\\000c\\000d\\000]\\000a\\000*\\000(\\000.\\000)\\000\\000\", \"\\000c\\000a\\000a\\000a\\000a\\000z\\000\\000\", 10, 12, 1);\n  x3(\"\\000(\\000\\134\\000A\\000b\\000b\\000)\\000c\\000c\\000\\000\", \"\\000b\\000b\\000c\\000c\\000\\000\", 0, 4, 1);\n  n(\"\\000(\\000\\134\\000A\\000b\\000b\\000)\\000c\\000c\\000\\000\", \"\\000z\\000b\\000b\\000c\\000c\\000\\000\");\n  x3(\"\\000(\\000^\\000b\\000b\\000)\\000c\\000c\\000\\000\", \"\\000b\\000b\\000c\\000c\\000\\000\", 0, 4, 1);\n  n(\"\\000(\\000^\\000b\\000b\\000)\\000c\\000c\\000\\000\", \"\\000z\\000b\\000b\\000c\\000c\\000\\000\");\n  x3(\"\\000c\\000c\\000(\\000b\\000b\\000$\\000)\\000\\000\", \"\\000c\\000c\\000b\\000b\\000\\000\", 4, 8, 1);\n  n(\"\\000c\\000c\\000(\\000b\\000b\\000$\\000)\\000\\000\", \"\\000c\\000c\\000b\\000b\\000b\\000\\000\");\n  n(\"\\000(\\000\\134\\0001\\000)\\000\\000\", \"\\000\\000\");\n  n(\"\\000\\134\\0001\\000(\\000a\\000)\\000\\000\", \"\\000a\\000a\\000\\000\");\n  n(\"\\000(\\000a\\000(\\000b\\000)\\000\\134\\0001\\000)\\000\\134\\0002\\000+\\000\\000\", \"\\000a\\000b\\000a\\000b\\000b\\000\\000\");\n  n(\"\\000(\\000?\\000:\\000(\\000?\\000:\\000\\134\\0001\\000|\\000z\\000)\\000(\\000a\\000)\\000)\\000+\\000$\\000\\000\", \"\\000z\\000a\\000a\\000\\000\");\n  x2(\"\\000(\\000?\\000:\\000(\\000?\\000:\\000\\134\\0001\\000|\\000z\\000)\\000(\\000a\\000)\\000)\\000+\\000$\\000\\000\", \"\\000z\\000a\\000a\\000a\\000\\000\", 0, 8);\n  x2(\"\\000(\\000a\\000)\\000(\\000?\\000=\\000\\134\\0001\\000)\\000\\000\", \"\\000a\\000a\\000\\000\", 0, 2);\n  n(\"\\000(\\000a\\000)\\000$\\000|\\000\\134\\0001\\000\\000\", \"\\000a\\000z\\000\\000\");\n  x2(\"\\000(\\000a\\000)\\000\\134\\0001\\000\\000\", \"\\000a\\000a\\000\\000\", 0, 4);\n  n(\"\\000(\\000a\\000)\\000\\134\\0001\\000\\000\", \"\\000a\\000b\\000\\000\");\n  x2(\"\\000(\\000a\\000?\\000)\\000\\134\\0001\\000\\000\", \"\\000a\\000a\\000\\000\", 0, 4);\n  x2(\"\\000(\\000a\\000?\\000?\\000)\\000\\134\\0001\\000\\000\", \"\\000a\\000a\\000\\000\", 0, 0);\n  x2(\"\\000(\\000a\\000*\\000)\\000\\134\\0001\\000\\000\", \"\\000a\\000a\\000a\\000a\\000a\\000\\000\", 0, 8);\n  x3(\"\\000(\\000a\\000*\\000)\\000\\134\\0001\\000\\000\", \"\\000a\\000a\\000a\\000a\\000a\\000\\000\", 0, 4, 1);\n  x2(\"\\000a\\000(\\000b\\000*\\000)\\000\\134\\0001\\000\\000\", \"\\000a\\000b\\000b\\000b\\000b\\000\\000\", 0, 10);\n  x2(\"\\000a\\000(\\000b\\000*\\000)\\000\\134\\0001\\000\\000\", \"\\000a\\000b\\000\\000\", 0, 2);\n  x2(\"\\000(\\000a\\000*\\000)\\000(\\000b\\000*\\000)\\000\\134\\0001\\000\\134\\0002\\000\\000\", \"\\000a\\000a\\000a\\000b\\000b\\000a\\000a\\000a\\000b\\000b\\000\\000\", 0, 20);\n  x2(\"\\000(\\000a\\000*\\000)\\000(\\000b\\000*\\000)\\000\\134\\0002\\000\\000\", \"\\000a\\000a\\000a\\000b\\000b\\000b\\000b\\000\\000\", 0, 14);\n  x2(\"\\000(\\000(\\000(\\000(\\000(\\000(\\000(\\000a\\000*\\000)\\000b\\000)\\000)\\000)\\000)\\000)\\000)\\000c\\000\\134\\0007\\000\\000\", \"\\000a\\000a\\000a\\000b\\000c\\000a\\000a\\000a\\000\\000\", 0, 16);\n  x3(\"\\000(\\000(\\000(\\000(\\000(\\000(\\000(\\000a\\000*\\000)\\000b\\000)\\000)\\000)\\000)\\000)\\000)\\000c\\000\\134\\0007\\000\\000\", \"\\000a\\000a\\000a\\000b\\000c\\000a\\000a\\000a\\000\\000\", 0, 6, 7);\n  x2(\"\\000(\\000a\\000)\\000(\\000b\\000)\\000(\\000c\\000)\\000\\134\\0002\\000\\134\\0001\\000\\134\\0003\\000\\000\", \"\\000a\\000b\\000c\\000b\\000a\\000c\\000\\000\", 0, 12);\n  x2(\"\\000(\\000[\\000a\\000-\\000d\\000]\\000)\\000\\134\\0001\\000\\000\", \"\\000c\\000c\\000\\000\", 0, 4);\n  x2(\"\\000(\\000\\134\\000w\\000\\134\\000d\\000\\134\\000s\\000)\\000\\134\\0001\\000\\000\", \"\\000f\\0005\\000 \\000f\\0005\\000 \\000\\000\", 0, 12);\n  n(\"\\000(\\000\\134\\000w\\000\\134\\000d\\000\\134\\000s\\000)\\000\\134\\0001\\000\\000\", \"\\000f\\0005\\000 \\000f\\0005\\000\\000\");\n  x2(\"\\000(\\000w\\000h\\000o\\000|\\000[\\000a\\000-\\000c\\000]\\000{\\0003\\000}\\000)\\000\\134\\0001\\000\\000\", \"\\000w\\000h\\000o\\000w\\000h\\000o\\000\\000\", 0, 12);\n  x2(\"\\000.\\000.\\000.\\000(\\000w\\000h\\000o\\000|\\000[\\000a\\000-\\000c\\000]\\000{\\0003\\000}\\000)\\000\\134\\0001\\000\\000\", \"\\000a\\000b\\000c\\000w\\000h\\000o\\000w\\000h\\000o\\000\\000\", 0, 18);\n  x2(\"\\000(\\000w\\000h\\000o\\000|\\000[\\000a\\000-\\000c\\000]\\000{\\0003\\000}\\000)\\000\\134\\0001\\000\\000\", \"\\000c\\000b\\000c\\000c\\000b\\000c\\000\\000\", 0, 12);\n  x2(\"\\000(\\000^\\000a\\000)\\000\\134\\0001\\000\\000\", \"\\000a\\000a\\000\\000\", 0, 4);\n  n(\"\\000(\\000^\\000a\\000)\\000\\134\\0001\\000\\000\", \"\\000b\\000a\\000a\\000\\000\");\n  n(\"\\000(\\000a\\000$\\000)\\000\\134\\0001\\000\\000\", \"\\000a\\000a\\000\\000\");\n  n(\"\\000(\\000a\\000b\\000\\134\\000Z\\000)\\000\\134\\0001\\000\\000\", \"\\000a\\000b\\000\\000\");\n  x2(\"\\000(\\000a\\000*\\000\\134\\000Z\\000)\\000\\134\\0001\\000\\000\", \"\\000a\\000\\000\", 2, 2);\n  x2(\"\\000.\\000(\\000a\\000*\\000\\134\\000Z\\000)\\000\\134\\0001\\000\\000\", \"\\000b\\000a\\000\\000\", 2, 4);\n  x3(\"\\000(\\000.\\000(\\000a\\000b\\000c\\000)\\000\\134\\0002\\000)\\000\\000\", \"\\000z\\000a\\000b\\000c\\000a\\000b\\000c\\000\\000\", 0, 14, 1);\n  x3(\"\\000(\\000.\\000(\\000.\\000.\\000\\134\\000d\\000.\\000)\\000\\134\\0002\\000)\\000\\000\", \"\\000z\\0001\\0002\\0003\\0004\\0001\\0002\\0003\\0004\\000\\000\", 0, 18, 1);\n  x2(\"\\000(\\000(\\000?\\000i\\000:\\000a\\000z\\000)\\000)\\000\\134\\0001\\000\\000\", \"\\000A\\000z\\000A\\000z\\000\\000\", 0, 8);\n  n(\"\\000(\\000(\\000?\\000i\\000:\\000a\\000z\\000)\\000)\\000\\134\\0001\\000\\000\", \"\\000A\\000z\\000a\\000z\\000\\000\");\n  x2(\"\\000(\\000?\\000<\\000=\\000a\\000)\\000b\\000\\000\", \"\\000a\\000b\\000\\000\", 2, 4);\n  n(\"\\000(\\000?\\000<\\000=\\000a\\000)\\000b\\000\\000\", \"\\000b\\000b\\000\\000\");\n  x2(\"\\000(\\000?\\000<\\000=\\000a\\000|\\000b\\000)\\000b\\000\\000\", \"\\000b\\000b\\000\\000\", 2, 4);\n  x2(\"\\000(\\000?\\000<\\000=\\000a\\000|\\000b\\000c\\000)\\000b\\000\\000\", \"\\000b\\000c\\000b\\000\\000\", 4, 6);\n  x2(\"\\000(\\000?\\000<\\000=\\000a\\000|\\000b\\000c\\000)\\000b\\000\\000\", \"\\000a\\000b\\000\\000\", 2, 4);\n  x2(\"\\000(\\000?\\000<\\000=\\000a\\000|\\000b\\000c\\000|\\000|\\000d\\000e\\000f\\000g\\000h\\000i\\000j\\000|\\000k\\000l\\000m\\000n\\000o\\000p\\000q\\000|\\000r\\000)\\000z\\000\\000\", \"\\000r\\000z\\000\\000\", 2, 4);\n  x2(\"\\000(\\000a\\000)\\000\\134\\000g\\000<\\0001\\000>\\000\\000\", \"\\000a\\000a\\000\\000\", 0, 4);\n  x2(\"\\000(\\000?\\000<\\000!\\000a\\000)\\000b\\000\\000\", \"\\000c\\000b\\000\\000\", 2, 4);\n  n(\"\\000(\\000?\\000<\\000!\\000a\\000)\\000b\\000\\000\", \"\\000a\\000b\\000\\000\");\n  x2(\"\\000(\\000?\\000<\\000!\\000a\\000|\\000b\\000c\\000)\\000b\\000\\000\", \"\\000b\\000b\\000b\\000\\000\", 0, 2);\n  n(\"\\000(\\000?\\000<\\000!\\000a\\000|\\000b\\000c\\000)\\000z\\000\\000\", \"\\000b\\000c\\000z\\000\\000\");\n  x2(\"\\000(\\000?\\000<\\000n\\000a\\000m\\000e\\0001\\000>\\000a\\000)\\000\\000\", \"\\000a\\000\\000\", 0, 2);\n  x2(\"\\000(\\000?\\000<\\000n\\000a\\000m\\000e\\000_\\0002\\000>\\000a\\000b\\000)\\000\\134\\000g\\000<\\000n\\000a\\000m\\000e\\000_\\0002\\000>\\000\\000\", \"\\000a\\000b\\000a\\000b\\000\\000\", 0, 8);\n  x2(\"\\000(\\000?\\000<\\000n\\000a\\000m\\000e\\000_\\0003\\000>\\000.\\000z\\000v\\000.\\000)\\000\\134\\000k\\000<\\000n\\000a\\000m\\000e\\000_\\0003\\000>\\000\\000\", \"\\000a\\000z\\000v\\000b\\000a\\000z\\000v\\000b\\000\\000\", 0, 16);\n  x2(\"\\000(\\000?\\000<\\000=\\000\\134\\000g\\000<\\000a\\000b\\000>\\000)\\000|\\000-\\000\\134\\000z\\000E\\000N\\000D\\000 \\000(\\000?\\000<\\000a\\000b\\000>\\000X\\000y\\000Z\\000)\\000\\000\", \"\\000X\\000y\\000Z\\000\\000\", 6, 6);\n  x2(\"\\000(\\000?\\000<\\000n\\000>\\000|\\000a\\000\\134\\000g\\000<\\000n\\000>\\000)\\000+\\000\\000\", \"\\000\\000\", 0, 0);\n  x2(\"\\000(\\000?\\000<\\000n\\000>\\000|\\000\\134\\000(\\000\\134\\000g\\000<\\000n\\000>\\000\\134\\000)\\000)\\000+\\000$\\000\\000\", \"\\000(\\000)\\000(\\000(\\000)\\000)\\000\\000\", 0, 12);\n  x3(\"\\000\\134\\000g\\000<\\000n\\000>\\000(\\000?\\000<\\000n\\000>\\000.\\000)\\000{\\0000\\000}\\000\\000\", \"\\000X\\000\\000\", 0, 2, 1);\n  x2(\"\\000\\134\\000g\\000<\\000n\\000>\\000(\\000a\\000b\\000c\\000|\\000d\\000f\\000(\\000?\\000<\\000n\\000>\\000.\\000Y\\000Z\\000)\\000{\\0002\\000,\\0008\\000}\\000)\\000{\\0000\\000}\\000\\000\", \"\\000X\\000Y\\000Z\\000\\000\", 0, 6);\n  x2(\"\\000\\134\\000A\\000(\\000?\\000<\\000n\\000>\\000(\\000a\\000\\134\\000g\\000<\\000n\\000>\\000)\\000|\\000)\\000\\134\\000z\\000\\000\", \"\\000a\\000a\\000a\\000a\\000\\000\", 0, 8);\n  x2(\"\\000(\\000?\\000<\\000n\\000>\\000|\\000\\134\\000g\\000<\\000m\\000>\\000\\134\\000g\\000<\\000n\\000>\\000)\\000\\134\\000z\\000|\\000\\134\\000z\\000E\\000N\\000D\\000 \\000(\\000?\\000<\\000m\\000>\\000a\\000|\\000(\\000b\\000)\\000\\134\\000g\\000<\\000m\\000>\\000)\\000\\000\", \"\\000b\\000b\\000b\\000b\\000a\\000b\\000b\\000a\\000\\000\", 0, 16);\n  x2(\"\\000(\\000?\\000<\\000n\\000a\\000m\\000e\\0001\\0002\\0004\\0000\\000>\\000\\134\\000w\\000+\\000\\134\\000s\\000x\\000)\\000a\\000+\\000\\134\\000k\\000<\\000n\\000a\\000m\\000e\\0001\\0002\\0004\\0000\\000>\\000\\000\", \"\\000 \\000 \\000f\\000g\\000 \\000x\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000a\\000f\\000g\\000 \\000x\\000\\000\", 4, 36);\n  x3(\"\\000(\\000z\\000)\\000(\\000)\\000(\\000)\\000(\\000?\\000<\\000_\\0009\\000>\\000a\\000)\\000\\134\\000g\\000<\\000_\\0009\\000>\\000\\000\", \"\\000z\\000a\\000a\\000\\000\", 4, 6, 1);\n  x2(\"\\000(\\000.\\000)\\000(\\000(\\000(\\000?\\000<\\000_\\000>\\000a\\000)\\000)\\000)\\000\\134\\000k\\000<\\000_\\000>\\000\\000\", \"\\000z\\000a\\000a\\000\\000\", 0, 6);\n  x2(\"\\000(\\000(\\000?\\000<\\000n\\000a\\000m\\000e\\0001\\000>\\000\\134\\000d\\000)\\000|\\000(\\000?\\000<\\000n\\000a\\000m\\000e\\0002\\000>\\000\\134\\000w\\000)\\000)\\000(\\000\\134\\000k\\000<\\000n\\000a\\000m\\000e\\0001\\000>\\000|\\000\\134\\000k\\000<\\000n\\000a\\000m\\000e\\0002\\000>\\000)\\000\\000\", \"\\000f\\000f\\000\\000\", 0, 4);\n  x2(\"\\000(\\000?\\000:\\000(\\000?\\000<\\000x\\000>\\000)\\000|\\000(\\000?\\000<\\000x\\000>\\000e\\000f\\000g\\000)\\000)\\000\\134\\000k\\000<\\000x\\000>\\000\\000\", \"\\000\\000\", 0, 0);\n  x2(\"\\000(\\000?\\000:\\000(\\000?\\000<\\000x\\000>\\000a\\000b\\000c\\000)\\000|\\000(\\000?\\000<\\000x\\000>\\000e\\000f\\000g\\000)\\000)\\000\\134\\000k\\000<\\000x\\000>\\000\\000\", \"\\000a\\000b\\000c\\000e\\000f\\000g\\000e\\000f\\000g\\000\\000\", 6, 18);\n  n(\"\\000(\\000?\\000:\\000(\\000?\\000<\\000x\\000>\\000a\\000b\\000c\\000)\\000|\\000(\\000?\\000<\\000x\\000>\\000e\\000f\\000g\\000)\\000)\\000\\134\\000k\\000<\\000x\\000>\\000\\000\", \"\\000a\\000b\\000c\\000e\\000f\\000g\\000\\000\");\n  x2(\"\\000(\\000?\\000:\\000(\\000?\\000<\\000n\\0001\\000>\\000.\\000)\\000|\\000(\\000?\\000<\\000n\\0001\\000>\\000.\\000.\\000)\\000|\\000(\\000?\\000<\\000n\\0001\\000>\\000.\\000.\\000.\\000)\\000|\\000(\\000?\\000<\\000n\\0001\\000>\\000.\\000.\\000.\\000.\\000)\\000|\\000(\\000?\\000<\\000n\\0001\\000>\\000.\\000.\\000.\\000.\\000.\\000)\\000|\\000(\\000?\\000<\\000n\\0001\\000>\\000.\\000.\\000.\\000.\\000.\\000.\\000)\\000|\\000(\\000?\\000<\\000n\\0001\\000>\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000)\\000|\\000(\\000?\\000<\\000n\\0001\\000>\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000)\\000|\\000(\\000?\\000<\\000n\\0001\\000>\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000)\\000|\\000(\\000?\\000<\\000n\\0001\\000>\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000)\\000|\\000(\\000?\\000<\\000n\\0001\\000>\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000)\\000|\\000(\\000?\\000<\\000n\\0001\\000>\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000)\\000|\\000(\\000?\\000<\\000n\\0001\\000>\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000)\\000|\\000(\\000?\\000<\\000n\\0001\\000>\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000)\\000)\\000\\134\\000k\\000<\\000n\\0001\\000>\\000$\\000\\000\", \"\\000a\\000-\\000p\\000y\\000u\\000m\\000p\\000y\\000u\\000m\\000\\000\", 4, 20);\n  x3(\"\\000(\\000?\\000:\\000(\\000?\\000<\\000n\\0001\\000>\\000.\\000)\\000|\\000(\\000?\\000<\\000n\\0001\\000>\\000.\\000.\\000)\\000|\\000(\\000?\\000<\\000n\\0001\\000>\\000.\\000.\\000.\\000)\\000|\\000(\\000?\\000<\\000n\\0001\\000>\\000.\\000.\\000.\\000.\\000)\\000|\\000(\\000?\\000<\\000n\\0001\\000>\\000.\\000.\\000.\\000.\\000.\\000)\\000|\\000(\\000?\\000<\\000n\\0001\\000>\\000.\\000.\\000.\\000.\\000.\\000.\\000)\\000|\\000(\\000?\\000<\\000n\\0001\\000>\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000)\\000|\\000(\\000?\\000<\\000n\\0001\\000>\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000)\\000|\\000(\\000?\\000<\\000n\\0001\\000>\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000)\\000|\\000(\\000?\\000<\\000n\\0001\\000>\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000)\\000|\\000(\\000?\\000<\\000n\\0001\\000>\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000)\\000|\\000(\\000?\\000<\\000n\\0001\\000>\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000)\\000|\\000(\\000?\\000<\\000n\\0001\\000>\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000)\\000|\\000(\\000?\\000<\\000n\\0001\\000>\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000.\\000)\\000)\\000\\134\\000k\\000<\\000n\\0001\\000>\\000$\\000\\000\", \"\\000x\\000x\\000x\\000x\\000a\\000b\\000c\\000d\\000e\\000f\\000g\\000h\\000i\\000j\\000k\\000l\\000m\\000n\\000a\\000b\\000c\\000d\\000e\\000f\\000g\\000h\\000i\\000j\\000k\\000l\\000m\\000n\\000\\000\", 8, 36, 14);\n  x3(\"\\000(\\000?\\000<\\000n\\000a\\000m\\000e\\0001\\000>\\000)\\000(\\000?\\000<\\000n\\000a\\000m\\000e\\0002\\000>\\000)\\000(\\000?\\000<\\000n\\000a\\000m\\000e\\0003\\000>\\000)\\000(\\000?\\000<\\000n\\000a\\000m\\000e\\0004\\000>\\000)\\000(\\000?\\000<\\000n\\000a\\000m\\000e\\0005\\000>\\000)\\000(\\000?\\000<\\000n\\000a\\000m\\000e\\0006\\000>\\000)\\000(\\000?\\000<\\000n\\000a\\000m\\000e\\0007\\000>\\000)\\000(\\000?\\000<\\000n\\000a\\000m\\000e\\0008\\000>\\000)\\000(\\000?\\000<\\000n\\000a\\000m\\000e\\0009\\000>\\000)\\000(\\000?\\000<\\000n\\000a\\000m\\000e\\0001\\0000\\000>\\000)\\000(\\000?\\000<\\000n\\000a\\000m\\000e\\0001\\0001\\000>\\000)\\000(\\000?\\000<\\000n\\000a\\000m\\000e\\0001\\0002\\000>\\000)\\000(\\000?\\000<\\000n\\000a\\000m\\000e\\0001\\0003\\000>\\000)\\000(\\000?\\000<\\000n\\000a\\000m\\000e\\0001\\0004\\000>\\000)\\000(\\000?\\000<\\000n\\000a\\000m\\000e\\0001\\0005\\000>\\000)\\000(\\000?\\000<\\000n\\000a\\000m\\000e\\0001\\0006\\000>\\000a\\000a\\000a\\000)\\000(\\000?\\000<\\000n\\000a\\000m\\000e\\0001\\0007\\000>\\000)\\000$\\000\\000\", \"\\000a\\000a\\000a\\000\\000\", 0, 6, 16);\n  x2(\"\\000(\\000?\\000<\\000f\\000o\\000o\\000>\\000a\\000|\\000\\134\\000(\\000\\134\\000g\\000<\\000f\\000o\\000o\\000>\\000\\134\\000)\\000)\\000\\000\", \"\\000a\\000\\000\", 0, 2);\n  x2(\"\\000(\\000?\\000<\\000f\\000o\\000o\\000>\\000a\\000|\\000\\134\\000(\\000\\134\\000g\\000<\\000f\\000o\\000o\\000>\\000\\134\\000)\\000)\\000\\000\", \"\\000(\\000(\\000(\\000(\\000(\\000(\\000a\\000)\\000)\\000)\\000)\\000)\\000)\\000\\000\", 0, 26);\n  x3(\"\\000(\\000?\\000<\\000f\\000o\\000o\\000>\\000a\\000|\\000\\134\\000(\\000\\134\\000g\\000<\\000f\\000o\\000o\\000>\\000\\134\\000)\\000)\\000\\000\", \"\\000(\\000(\\000(\\000(\\000(\\000(\\000(\\000(\\000a\\000)\\000)\\000)\\000)\\000)\\000)\\000)\\000)\\000\\000\", 0, 34, 1);\n  x2(\"\\000\\134\\000g\\000<\\000b\\000a\\000r\\000>\\000|\\000\\134\\000z\\000E\\000N\\000D\\000(\\000?\\000<\\000b\\000a\\000r\\000>\\000.\\000*\\000a\\000b\\000c\\000$\\000)\\000\\000\", \"\\000a\\000b\\000c\\000x\\000x\\000x\\000a\\000b\\000c\\000\\000\", 0, 18);\n  x2(\"\\000\\134\\000g\\000<\\0001\\000>\\000|\\000\\134\\000z\\000E\\000N\\000D\\000(\\000.\\000a\\000.\\000)\\000\\000\", \"\\000b\\000a\\000c\\000\\000\", 0, 6);\n  x3(\"\\000\\134\\000g\\000<\\000_\\000A\\000>\\000\\134\\000g\\000<\\000_\\000A\\000>\\000|\\000\\134\\000z\\000E\\000N\\000D\\000(\\000.\\000a\\000.\\000)\\000(\\000?\\000<\\000_\\000A\\000>\\000.\\000b\\000.\\000)\\000\\000\", \"\\000x\\000b\\000x\\000y\\000b\\000y\\000\\000\", 6, 12, 1);\n  x2(\"\\000\\134\\000A\\000(\\000?\\000:\\000\\134\\000g\\000<\\000p\\000o\\000n\\000>\\000|\\000\\134\\000g\\000<\\000p\\000a\\000n\\000>\\000|\\000\\134\\000z\\000E\\000N\\000D\\000 \\000 \\000(\\000?\\000<\\000p\\000a\\000n\\000>\\000a\\000|\\000c\\000\\134\\000g\\000<\\000p\\000o\\000n\\000>\\000c\\000)\\000(\\000?\\000<\\000p\\000o\\000n\\000>\\000b\\000|\\000d\\000\\134\\000g\\000<\\000p\\000a\\000n\\000>\\000d\\000)\\000)\\000$\\000\\000\", \"\\000c\\000d\\000c\\000b\\000c\\000d\\000c\\000\\000\", 0, 14);\n  x2(\"\\000\\134\\000A\\000(\\000?\\000<\\000n\\000>\\000|\\000a\\000\\134\\000g\\000<\\000m\\000>\\000)\\000\\134\\000z\\000|\\000\\134\\000z\\000E\\000N\\000D\\000 \\000(\\000?\\000<\\000m\\000>\\000\\134\\000g\\000<\\000n\\000>\\000)\\000\\000\", \"\\000a\\000a\\000a\\000a\\000\\000\", 0, 8);\n  x2(\"\\000(\\000?\\000<\\000n\\000>\\000(\\000a\\000|\\000b\\000\\134\\000g\\000<\\000n\\000>\\000c\\000)\\000{\\0003\\000,\\0005\\000}\\000)\\000\\000\", \"\\000b\\000a\\000a\\000a\\000a\\000c\\000a\\000\\000\", 2, 10);\n  x2(\"\\000(\\000?\\000<\\000n\\000>\\000(\\000a\\000|\\000b\\000\\134\\000g\\000<\\000n\\000>\\000c\\000)\\000{\\0003\\000,\\0005\\000}\\000)\\000\\000\", \"\\000b\\000a\\000a\\000a\\000a\\000c\\000a\\000a\\000a\\000a\\000a\\000\\000\", 0, 20);\n  x2(\"\\000(\\000?\\000<\\000p\\000a\\000r\\000e\\000>\\000\\134\\000(\\000(\\000[\\000^\\000\\134\\000(\\000\\134\\000)\\000]\\000+\\000+\\000|\\000\\134\\000g\\000<\\000p\\000a\\000r\\000e\\000>\\000)\\000*\\000+\\000\\134\\000)\\000)\\000\\000\", \"\\000(\\000(\\000a\\000)\\000)\\000\\000\", 0, 10);\n  x2(\"\\000(\\000)\\000*\\000\\134\\0001\\000\\000\", \"\\000\\000\", 0, 0);\n  x2(\"\\000(\\000?\\000:\\000(\\000)\\000|\\000(\\000)\\000)\\000*\\000\\134\\0001\\000\\134\\0002\\000\\000\", \"\\000\\000\", 0, 0);\n  x3(\"\\000(\\000?\\000:\\000\\134\\0001\\000a\\000|\\000(\\000)\\000)\\000*\\000\\000\", \"\\000a\\000\\000\", 0, 0, 1);\n  x2(\"\\000x\\000(\\000(\\000.\\000)\\000*\\000)\\000*\\000x\\000\\000\", \"\\0000\\000x\\0001\\000x\\0002\\000x\\0003\\000\\000\", 2, 12);\n  x2(\"\\000x\\000(\\000(\\000.\\000)\\000*\\000)\\000*\\000x\\000(\\000?\\000i\\000:\\000\\134\\0001\\000)\\000\\134\\000Z\\000\\000\", \"\\0000\\000x\\0001\\000x\\0002\\000x\\0001\\000X\\0002\\000\\000\", 2, 18);\n  x2(\"\\000(\\000?\\000:\\000(\\000)\\000|\\000(\\000)\\000|\\000(\\000)\\000|\\000(\\000)\\000|\\000(\\000)\\000|\\000(\\000)\\000)\\000*\\000\\134\\0002\\000\\134\\0005\\000\\000\", \"\\000\\000\", 0, 0);\n  x2(\"\\000(\\000?\\000:\\000(\\000)\\000|\\000(\\000)\\000|\\000(\\000)\\000|\\000(\\000x\\000)\\000|\\000(\\000)\\000|\\000(\\000)\\000)\\000*\\000\\134\\0002\\000b\\000\\134\\0005\\000\\000\", \"\\000b\\000\\000\", 0, 2);\n  x2(\"\\217\\372\\000\\000\", \"\\217\\372\\000\\000\", 0, 2);\n  x2(\"\\000\\000\", \"0B\\000\\000\", 0, 0);\n  x2(\"0B\\000\\000\", \"0B\\000\\000\", 0, 2);\n  n(\"0D\\000\\000\", \"0B\\000\\000\");\n  x2(\"0F0F\\000\\000\", \"0F0F\\000\\000\", 0, 4);\n  x2(\"0B0D0F\\000\\000\", \"0B0D0F\\000\\000\", 0, 6);\n  x2(\"0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S\\000\\000\", \"0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S0S\\000\\000\", 0, 70);\n  x2(\"0B\\000\\000\", \"0D0B\\000\\000\", 2, 4);\n  x2(\"0D0F\\000\\000\", \"0B0D0F\\000\\000\", 2, 6);\n  x2(\"e\\207\\000\\000\", \"e\\207\\000\\000\", 0, 2);\n  x2(\"\\000.\\000\\000\", \"0B\\000\\000\", 0, 2);\n  x2(\"\\000.\\000.\\000\\000\", \"0K0M\\000\\000\", 0, 4);\n  x2(\"\\000(\\000?\\000u\\000)\\000\\134\\000w\\000\\000\", \"0J\\000\\000\", 0, 2);\n  n(\"\\000(\\000?\\000u\\000)\\000\\134\\000W\\000\\000\", \"0B\\000\\000\");\n  x2(\"\\000(\\000?\\000u\\000)\\000[\\000\\134\\000W\\000]\\000\\000\", \"0F\\000$\\000\\000\", 2, 4);\n  x2(\"\\000\\134\\000S\\000\\000\", \"0]\\000\\000\", 0, 2);\n  x2(\"\\000\\134\\000S\\000\\000\", \"o\\042\\000\\000\", 0, 2);\n  x2(\"\\000\\134\\000b\\000\\000\", \"l\\027\\000 \\000\\000\", 0, 0);\n  x2(\"\\000\\134\\000b\\000\\000\", \"\\000 0{\\000\\000\", 2, 2);\n  x2(\"\\000\\134\\000B\\000\\000\", \"0[0]\\000 \\000\\000\", 2, 2);\n  x2(\"\\000\\134\\000B\\000\\000\", \"0F\\000 \\000\\000\", 4, 4);\n  x2(\"\\000\\134\\000B\\000\\000\", \"\\000 0D\\000\\000\", 0, 0);\n  x2(\"\\000[0_0a\\000]\\000\\000\", \"0a\\000\\000\", 0, 2);\n  n(\"\\000[0j0k\\000]\\000\\000\", \"0l\\000\\000\");\n  x2(\"\\000[0F\\000-0J\\000]\\000\\000\", \"0H\\000\\000\", 0, 2);\n  n(\"\\000[\\000^0Q\\000]\\000\\000\", \"0Q\\000\\000\");\n  x2(\"\\000(\\000?\\000u\\000)\\000[\\000\\134\\000w\\000]\\000\\000\", \"0m\\000\\000\", 0, 2);\n  n(\"\\000[\\000\\134\\000d\\000]\\000\\000\", \"0u\\000\\000\");\n  x2(\"\\000[\\000\\134\\000D\\000]\\000\\000\", \"0o\\000\\000\", 0, 2);\n  n(\"\\000[\\000\\134\\000s\\000]\\000\\000\", \"0O\\000\\000\");\n  x2(\"\\000[\\000\\134\\000S\\000]\\000\\000\", \"0x\\000\\000\", 0, 2);\n  x2(\"\\000(\\000?\\000u\\000)\\000[\\000\\134\\000w\\000\\134\\000d\\000]\\000\\000\", \"0\\210\\000\\000\", 0, 2);\n  x2(\"\\000(\\000?\\000u\\000)\\000[\\000\\134\\000w\\000\\134\\000d\\000]\\000\\000\", \"\\000 \\000 \\000 0\\210\\000\\000\", 6, 8);\n  n(\"\\000(\\000?\\000u\\000)\\000\\134\\000w\\233<\\216\\312\\000\\000\", \"\\000 \\233<\\216\\312\\000\\000\");\n  x2(\"\\000(\\000?\\000u\\000)\\233<\\000\\134\\000W\\216\\312\\000\\000\", \"\\233<\\000 \\216\\312\\000\\000\", 0, 6);\n  x2(\"0B\\000.0D\\000.0F\\000\\000\", \"0B0B0D0D0F\\000\\000\", 0, 10);\n  x2(\"\\000(\\000?\\000u\\000)\\000.\\000\\134\\000w0F\\000\\134\\000W\\000.\\000.0^\\000\\000\", \"0H0F0F\\000 0F0^0^\\000\\000\", 0, 14);\n  x2(\"\\000(\\000?\\000u\\000)\\000\\134\\000s\\000\\134\\000w0S0S0S\\000\\000\", \"\\000 0S0S0S0S\\000\\000\", 0, 10);\n  x2(\"0B0B\\000.0Q\\000\\000\", \"0B0B0Q0Q\\000\\000\", 0, 8);\n  n(\"\\000.0D\\000\\000\", \"0D0H\\000\\000\");\n  x2(\"\\000.0J\\000\\000\", \"0J0J\\000\\000\", 0, 4);\n  x2(\"\\000^0B\\000\\000\", \"0B\\000\\000\", 0, 2);\n  x2(\"\\000^0\\200\\000$\\000\\000\", \"0\\200\\000\\000\", 0, 2);\n  x2(\"\\000(\\000?\\000u\\000)\\000^\\000\\134\\000w\\000$\\000\\000\", \"0k\\000\\000\", 0, 2);\n  x2(\"\\000(\\000?\\000u\\000)\\000^\\000\\134\\000w0K0M0O0Q0S\\000$\\000\\000\", \"\\000z0K0M0O0Q0S\\000\\000\", 0, 12);\n  x2(\"\\000(\\000?\\000u\\000)\\000^\\000\\134\\000w\\000.\\000.\\000.0F0H0J\\000$\\000\\000\", \"\\000z0B0D0F0F0H0J\\000\\000\", 0, 14);\n  x2(\"\\000(\\000?\\000u\\000)\\000\\134\\000w\\000\\134\\000w\\000\\134\\000s\\000\\134\\000W0J0J0J\\000\\134\\000d\\000\\000\", \"\\000a0J\\000 \\000 0J0J0J\\0004\\000\\000\", 0, 16);\n  x2(\"\\000\\134\\000A0_0a0d\\000\\000\", \"0_0a0d\\000\\000\", 0, 6);\n  x2(\"0\\2000\\2010\\202\\000\\134\\000Z\\000\\000\", \"0\\2000\\2010\\202\\000\\000\", 0, 6);\n  x2(\"0K0M0O\\000\\134\\000z\\000\\000\", \"0K0M0O\\000\\000\", 0, 6);\n  x2(\"0K0M0O\\000\\134\\000Z\\000\\000\", \"0K0M0O\\000\\012\\000\\000\", 0, 6);\n  x2(\"\\000\\134\\000G0}0t\\000\\000\", \"0}0t\\000\\000\", 0, 4);\n  n(\"\\000\\134\\000G0H\\000\\000\", \"0F0H0J\\000\\000\");\n  n(\"0h0f\\000\\134\\000G\\000\\000\", \"0h0f\\000\\000\");\n  n(\"0~0\\177\\000\\134\\000A\\000\\000\", \"0~0\\177\\000\\000\");\n  n(\"0~\\000\\134\\000A0\\177\\000\\000\", \"0~0\\177\\000\\000\");\n  x2(\"\\000(\\000?\\000=0[\\000)0[\\000\\000\", \"0[\\000\\000\", 0, 2);\n  n(\"\\000(\\000?\\000=0F\\000)\\000.\\000\\000\", \"0D\\000\\000\");\n  x2(\"\\000(\\000?\\000!0F\\000)0K\\000\\000\", \"0K\\000\\000\", 0, 2);\n  n(\"\\000(\\000?\\000!0h\\000)0B\\000\\000\", \"0h\\000\\000\");\n  x2(\"\\000(\\000?\\000i\\000:0B\\000)\\000\\000\", \"0B\\000\\000\", 0, 2);\n  x2(\"\\000(\\000?\\000i\\000:0v0y\\000)\\000\\000\", \"0v0y\\000\\000\", 0, 4);\n  n(\"\\000(\\000?\\000i\\000:0D\\000)\\000\\000\", \"0F\\000\\000\");\n  x2(\"\\000(\\000?\\000m\\000:0\\210\\000.\\000)\\000\\000\", \"0\\210\\000\\012\\000\\000\", 0, 4);\n  x2(\"\\000(\\000?\\000m\\000:\\000.0\\201\\000)\\000\\000\", \"0~\\000\\0120\\201\\000\\000\", 2, 6);\n  x2(\"0B\\000?\\000\\000\", \"\\000\\000\", 0, 0);\n  x2(\"Y\\011\\000?\\000\\000\", \"S\\026\\000\\000\", 0, 0);\n  x2(\"Y\\011\\000?\\000\\000\", \"Y\\011\\000\\000\", 0, 2);\n  x2(\"\\221\\317\\000*\\000\\000\", \"\\000\\000\", 0, 0);\n  x2(\"\\221\\317\\000*\\000\\000\", \"\\221\\317\\000\\000\", 0, 2);\n  x2(\"[P\\000*\\000\\000\", \"[P[P[P\\000\\000\", 0, 6);\n  x2(\"\\231\\254\\000*\\000\\000\", \"\\236\\177\\231\\254\\231\\254\\231\\254\\231\\254\\000\\000\", 0, 0);\n  n(\"\\134q\\000+\\000\\000\", \"\\000\\000\");\n  x2(\"l\\263\\000+\\000\\000\", \"l\\263\\000\\000\", 0, 2);\n  x2(\"fB\\000+\\000\\000\", \"fBfBfBfB\\000\\000\", 0, 8);\n  x2(\"0H\\000+\\000\\000\", \"0H0H0F0F0F\\000\\000\", 0, 4);\n  x2(\"0F\\000+\\000\\000\", \"0J0F0F0F0F\\000\\000\", 2, 10);\n  x2(\"\\000.\\000?\\000\\000\", \"0_\\000\\000\", 0, 2);\n  x2(\"\\000.\\000*\\000\\000\", \"0q0t0w0z\\000\\000\", 0, 8);\n  x2(\"\\000.\\000+\\000\\000\", \"0\\215\\000\\000\", 0, 2);\n  x2(\"\\000.\\000+\\000\\000\", \"0D0F0H0K\\000\\012\\000\\000\", 0, 8);\n  x2(\"0B\\000|0D\\000\\000\", \"0B\\000\\000\", 0, 2);\n  x2(\"0B\\000|0D\\000\\000\", \"0D\\000\\000\", 0, 2);\n  x2(\"0B0D\\000|0D0F\\000\\000\", \"0B0D\\000\\000\", 0, 4);\n  x2(\"0B0D\\000|0D0F\\000\\000\", \"0D0F\\000\\000\", 0, 4);\n  x2(\"0\\222\\000(\\000?\\000:0K0M\\000|0M0O\\000)\\000\\000\", \"0\\2220K0M\\000\\000\", 0, 6);\n  x2(\"0\\222\\000(\\000?\\000:0K0M\\000|0M0O\\000)0Q\\000\\000\", \"0\\2220M0O0Q\\000\\000\", 0, 8);\n  x2(\"0B0D\\000|\\000(\\000?\\000:0B0F\\000|0B0\\222\\000)\\000\\000\", \"0B0\\222\\000\\000\", 0, 4);\n  x2(\"0B\\000|0D\\000|0F\\000\\000\", \"0H0F\\000\\000\", 2, 4);\n  x2(\"0B\\000|0D\\000|0F0H\\000|0J0K0M\\000|0O\\000|0Q0S0U\\000|0W0Y0[\\000|0]\\000|0_0a\\000|0d0f0h0j0k\\000|0l0m\\000\\000\", \"0W0Y0[\\000\\000\", 0, 6);\n  n(\"0B\\000|0D\\000|0F0H\\000|0J0K0M\\000|0O\\000|0Q0S0U\\000|0W0Y0[\\000|0]\\000|0_0a\\000|0d0f0h0j0k\\000|0l0m\\000\\000\", \"0Y0[\\000\\000\");\n  x2(\"0B\\000|\\000^0\\217\\000\\000\", \"0v0B\\000\\000\", 2, 4);\n  x2(\"0B\\000|\\000^0\\222\\000\\000\", \"0\\2220B\\000\\000\", 0, 2);\n  x2(\"\\233<\\000|\\000\\134\\000G\\216\\312\\000\\000\", \"0Q\\216\\312\\233<\\000\\000\", 4, 6);\n  x2(\"\\233<\\000|\\000\\134\\000G\\216\\312\\000\\000\", \"\\216\\312\\233<\\000\\000\", 0, 2);\n  x2(\"\\233<\\000|\\000\\134\\000A\\216\\312\\000\\000\", \"\\000b\\216\\312\\233<\\000\\000\", 4, 6);\n  x2(\"\\233<\\000|\\000\\134\\000A\\216\\312\\000\\000\", \"\\216\\312\\000\\000\", 0, 2);\n  x2(\"\\233<\\000|\\216\\312\\000\\134\\000Z\\000\\000\", \"\\216\\312\\233<\\000\\000\", 2, 4);\n  x2(\"\\233<\\000|\\216\\312\\000\\134\\000Z\\000\\000\", \"\\216\\312\\000\\000\", 0, 2);\n  x2(\"\\233<\\000|\\216\\312\\000\\134\\000Z\\000\\000\", \"\\216\\312\\000\\012\\000\\000\", 0, 2);\n  x2(\"\\233<\\000|\\216\\312\\000\\134\\000z\\000\\000\", \"\\216\\312\\233<\\000\\000\", 2, 4);\n  x2(\"\\233<\\000|\\216\\312\\000\\134\\000z\\000\\000\", \"\\216\\312\\000\\000\", 0, 2);\n  x2(\"\\000(\\000?\\000u\\000)\\000\\134\\000w\\000|\\000\\134\\000s\\000\\000\", \"0J\\000\\000\", 0, 2);\n  x2(\"\\000(\\000?\\000u\\000)\\000\\134\\000w\\000|\\000%\\000\\000\", \"\\000%0J\\000\\000\", 0, 2);\n  x2(\"\\000(\\000?\\000u\\000)\\000\\134\\000w\\000|\\000[\\000&\\000$\\000]\\000\\000\", \"0F\\000&\\000\\000\", 0, 2);\n  x2(\"\\000[0D\\000-0Q\\000]\\000\\000\", \"0F\\000\\000\", 0, 2);\n  x2(\"\\000[0D\\000-0Q\\000]\\000|\\000[\\000^0K\\000-0S\\000]\\000\\000\", \"0B\\000\\000\", 0, 2);\n  x2(\"\\000[0D\\000-0Q\\000]\\000|\\000[\\000^0K\\000-0S\\000]\\000\\000\", \"0K\\000\\000\", 0, 2);\n  x2(\"\\000[\\000^0B\\000]\\000\\000\", \"\\000\\012\\000\\000\", 0, 2);\n  x2(\"\\000(\\000?\\000:0B\\000|\\000[0F\\000-0M\\000]\\000)\\000|0D0\\222\\000\\000\", \"0F0\\222\\000\\000\", 0, 2);\n  x2(\"\\000(\\000?\\000:0B\\000|\\000[0F\\000-0M\\000]\\000)\\000|0D0\\222\\000\\000\", \"0D0\\222\\000\\000\", 0, 4);\n  x2(\"0B0D0F\\000|\\000(\\000?\\000=0Q0Q\\000)\\000.\\000.0{\\000\\000\", \"0Q0Q0{\\000\\000\", 0, 6);\n  x2(\"0B0D0F\\000|\\000(\\000?\\000!0Q0Q\\000)\\000.\\000.0{\\000\\000\", \"0B0D0{\\000\\000\", 0, 6);\n  x2(\"\\000(\\000?\\000=0\\2220B\\000)\\000.\\000.0B\\000|\\000(\\000?\\000=0\\2220\\222\\000)\\000.\\000.0B\\000\\000\", \"0\\2220\\2220B\\000\\000\", 0, 6);\n  x2(\"\\000(\\000?\\000<\\000=0B\\000|0D0F\\000)0D\\000\\000\", \"0D0F0D\\000\\000\", 4, 6);\n  n(\"\\000(\\000?\\000>0B\\000|0B0D0H\\000)0F\\000\\000\", \"0B0D0H0F\\000\\000\");\n  x2(\"\\000(\\000?\\000>0B0D0H\\000|0B\\000)0F\\000\\000\", \"0B0D0H0F\\000\\000\", 0, 8);\n  x2(\"0B\\000?\\000|0D\\000\\000\", \"0B\\000\\000\", 0, 2);\n  x2(\"0B\\000?\\000|0D\\000\\000\", \"0D\\000\\000\", 0, 0);\n  x2(\"0B\\000?\\000|0D\\000\\000\", \"\\000\\000\", 0, 0);\n  x2(\"0B\\000*\\000|0D\\000\\000\", \"0B0B\\000\\000\", 0, 4);\n  x2(\"0B\\000*\\000|0D\\000*\\000\\000\", \"0D0B\\000\\000\", 0, 0);\n  x2(\"0B\\000*\\000|0D\\000*\\000\\000\", \"0B0D\\000\\000\", 0, 2);\n  x2(\"\\000[\\000a0B\\000]\\000*\\000|0D\\000*\\000\\000\", \"\\000a0B0D0D0D\\000\\000\", 0, 4);\n  x2(\"0B\\000+\\000|0D\\000*\\000\\000\", \"\\000\\000\", 0, 0);\n  x2(\"0B\\000+\\000|0D\\000*\\000\\000\", \"0D0D0D\\000\\000\", 0, 6);\n  x2(\"0B\\000+\\000|0D\\000*\\000\\000\", \"0B0D0D0D\\000\\000\", 0, 2);\n  x2(\"0B\\000+\\000|0D\\000*\\000\\000\", \"\\000a0B0D0D0D\\000\\000\", 0, 0);\n  n(\"0B\\000+\\000|0D\\000+\\000\\000\", \"\\000\\000\");\n  x2(\"\\000(0B\\000|0D\\000)\\000?\\000\\000\", \"0D\\000\\000\", 0, 2);\n  x2(\"\\000(0B\\000|0D\\000)\\000*\\000\\000\", \"0D0B\\000\\000\", 0, 4);\n  x2(\"\\000(0B\\000|0D\\000)\\000+\\000\\000\", \"0D0B0D\\000\\000\", 0, 6);\n  x2(\"\\000(0B0D\\000|0F0B\\000)\\000+\\000\\000\", \"0F0B0B0D0F0H\\000\\000\", 0, 8);\n  x2(\"\\000(0B0D\\000|0F0H\\000)\\000+\\000\\000\", \"0F0B0B0D0F0H\\000\\000\", 4, 12);\n  x2(\"\\000(0B0D\\000|0F0B\\000)\\000+\\000\\000\", \"0B0B0D0F0B\\000\\000\", 2, 10);\n  x2(\"\\000(0B0D\\000|0F0B\\000)\\000+\\000\\000\", \"0B0D0\\2220F0B\\000\\000\", 0, 4);\n  x2(\"\\000(0B0D\\000|0F0B\\000)\\000+\\000\\000\", \"\\000$\\000$\\000z\\000z\\000z\\000z0B0D0\\2220F0B\\000\\000\", 12, 16);\n  x2(\"\\000(0B\\000|0D0B0D\\000)\\000+\\000\\000\", \"0B0D0B0D0B\\000\\000\", 0, 10);\n  x2(\"\\000(0B\\000|0D0B0D\\000)\\000+\\000\\000\", \"0D0B\\000\\000\", 2, 4);\n  x2(\"\\000(0B\\000|0D0B0D\\000)\\000+\\000\\000\", \"0D0B0B0B0D0B\\000\\000\", 2, 8);\n  x2(\"\\000(\\000?\\000:0B\\000|0D\\000)\\000(\\000?\\000:0B\\000|0D\\000)\\000\\000\", \"0B0D\\000\\000\", 0, 4);\n  x2(\"\\000(\\000?\\000:0B\\000*\\000|0D\\000*\\000)\\000(\\000?\\000:0B\\000*\\000|0D\\000*\\000)\\000\\000\", \"0B0B0B0D0D0D\\000\\000\", 0, 6);\n  x2(\"\\000(\\000?\\000:0B\\000*\\000|0D\\000*\\000)\\000(\\000?\\000:0B\\000+\\000|0D\\000+\\000)\\000\\000\", \"0B0B0B0D0D0D\\000\\000\", 0, 12);\n  x2(\"\\000(\\000?\\000:0B\\000+\\000|0D\\000+\\000)\\000{\\0002\\000}\\000\\000\", \"0B0B0B0D0D0D\\000\\000\", 0, 12);\n  x2(\"\\000(\\000?\\000:0B\\000+\\000|0D\\000+\\000)\\000{\\0001\\000,\\0002\\000}\\000\\000\", \"0B0B0B0D0D0D\\000\\000\", 0, 12);\n  x2(\"\\000(\\000?\\000:0B\\000+\\000|\\000\\134\\000A0D\\000*\\000)0F0F\\000\\000\", \"0F0F\\000\\000\", 0, 4);\n  n(\"\\000(\\000?\\000:0B\\000+\\000|\\000\\134\\000A0D\\000*\\000)0F0F\\000\\000\", \"0B0D0F0F\\000\\000\");\n  x2(\"\\000(\\000?\\000:\\000^0B\\000+\\000|0D\\000+\\000)\\000*0F\\000\\000\", \"0B0B0D0D0D0B0D0F\\000\\000\", 12, 16);\n  x2(\"\\000(\\000?\\000:\\000^0B\\000+\\000|0D\\000+\\000)\\000*0F\\000\\000\", \"0B0B0D0D0D0D0F\\000\\000\", 0, 14);\n  x2(\"0F\\000{\\0000\\000,\\000}\\000\\000\", \"0F0F0F0F\\000\\000\", 0, 8);\n  x2(\"0B\\000|\\000(\\000?\\000i\\000)\\000c\\000\\000\", \"\\000C\\000\\000\", 0, 2);\n  x2(\"\\000(\\000?\\000i\\000)\\000c\\000|0B\\000\\000\", \"\\000C\\000\\000\", 0, 2);\n  x2(\"\\000(\\000?\\000i\\000:0B\\000)\\000|\\000a\\000\\000\", \"\\000a\\000\\000\", 0, 2);\n  n(\"\\000(\\000?\\000i\\000:0B\\000)\\000|\\000a\\000\\000\", \"\\000A\\000\\000\");\n  x2(\"\\000[0B0D0F\\000]\\000?\\000\\000\", \"0B0D0F\\000\\000\", 0, 2);\n  x2(\"\\000[0B0D0F\\000]\\000*\\000\\000\", \"0B0D0F\\000\\000\", 0, 6);\n  x2(\"\\000[\\000^0B0D0F\\000]\\000*\\000\\000\", \"0B0D0F\\000\\000\", 0, 0);\n  n(\"\\000[\\000^0B0D0F\\000]\\000+\\000\\000\", \"0B0D0F\\000\\000\");\n  x2(\"0B\\000?\\000?\\000\\000\", \"0B0B0B\\000\\000\", 0, 0);\n  x2(\"0D0B\\000?\\000?0D\\000\\000\", \"0D0B0D\\000\\000\", 0, 6);\n  x2(\"0B\\000*\\000?\\000\\000\", \"0B0B0B\\000\\000\", 0, 0);\n  x2(\"0D0B\\000*\\000?\\000\\000\", \"0D0B0B\\000\\000\", 0, 2);\n  x2(\"0D0B\\000*\\000?0D\\000\\000\", \"0D0B0B0D\\000\\000\", 0, 8);\n  x2(\"0B\\000+\\000?\\000\\000\", \"0B0B0B\\000\\000\", 0, 2);\n  x2(\"0D0B\\000+\\000?\\000\\000\", \"0D0B0B\\000\\000\", 0, 4);\n  x2(\"0D0B\\000+\\000?0D\\000\\000\", \"0D0B0B0D\\000\\000\", 0, 8);\n  x2(\"\\000(\\000?\\000:Y)\\000?\\000)\\000?\\000?\\000\\000\", \"Y)\\000\\000\", 0, 0);\n  x2(\"\\000(\\000?\\000:Y)\\000?\\000?\\000)\\000?\\000\\000\", \"Y)\\000\\000\", 0, 0);\n  x2(\"\\000(\\000?\\000:Y\\042\\000?\\000)\\000+\\000?\\000\\000\", \"Y\\042Y\\042Y\\042\\000\\000\", 0, 2);\n  x2(\"\\000(\\000?\\000:\\230\\250\\000+\\000)\\000?\\000?\\000\\000\", \"\\230\\250\\230\\250\\230\\250\\000\\000\", 0, 0);\n  x2(\"\\000(\\000?\\000:\\226\\352\\000+\\000)\\000?\\000?\\227\\034\\000\\000\", \"\\226\\352\\226\\352\\226\\352\\227\\034\\000\\000\", 0, 8);\n  x2(\"\\000(\\000?\\000:0B0D\\000)\\000?\\000{\\0002\\000}\\000\\000\", \"\\000\\000\", 0, 0);\n  x2(\"\\000(\\000?\\000:\\233<\\216\\312\\000)\\000?\\000{\\0002\\000}\\000\\000\", \"\\233<\\216\\312\\233<\\216\\312\\233<\\000\\000\", 0, 8);\n  x2(\"\\000(\\000?\\000:\\233<\\216\\312\\000)\\000*\\000{\\0000\\000}\\000\\000\", \"\\233<\\216\\312\\233<\\216\\312\\233<\\000\\000\", 0, 0);\n  x2(\"\\000(\\000?\\000:\\233<\\216\\312\\000)\\000{\\0003\\000,\\000}\\000\\000\", \"\\233<\\216\\312\\233<\\216\\312\\233<\\216\\312\\233<\\216\\312\\000\\000\", 0, 16);\n  n(\"\\000(\\000?\\000:\\233<\\216\\312\\000)\\000{\\0003\\000,\\000}\\000\\000\", \"\\233<\\216\\312\\233<\\216\\312\\000\\000\");\n  x2(\"\\000(\\000?\\000:\\233<\\216\\312\\000)\\000{\\0002\\000,\\0004\\000}\\000\\000\", \"\\233<\\216\\312\\233<\\216\\312\\233<\\216\\312\\000\\000\", 0, 12);\n  x2(\"\\000(\\000?\\000:\\233<\\216\\312\\000)\\000{\\0002\\000,\\0004\\000}\\000\\000\", \"\\233<\\216\\312\\233<\\216\\312\\233<\\216\\312\\233<\\216\\312\\233<\\216\\312\\000\\000\", 0, 16);\n  x2(\"\\000(\\000?\\000:\\233<\\216\\312\\000)\\000{\\0002\\000,\\0004\\000}\\000?\\000\\000\", \"\\233<\\216\\312\\233<\\216\\312\\233<\\216\\312\\233<\\216\\312\\233<\\216\\312\\000\\000\", 0, 8);\n  x2(\"\\000(\\000?\\000:\\233<\\216\\312\\000)\\000{\\000,\\000}\\000\\000\", \"\\233<\\216\\312\\000{\\000,\\000}\\000\\000\", 0, 10);\n  x2(\"\\000(\\000?\\000:0K0M0O\\000)\\000+\\000?\\000{\\0002\\000}\\000\\000\", \"0K0M0O0K0M0O0K0M0O\\000\\000\", 0, 12);\n  x3(\"\\000(pk\\000)\\000\\000\", \"pk\\000\\000\", 0, 2, 1);\n  x3(\"\\000(pkl4\\000)\\000\\000\", \"pkl4\\000\\000\", 0, 4, 1);\n  x2(\"\\000(\\000(fB\\225\\223\\000)\\000)\\000\\000\", \"fB\\225\\223\\000\\000\", 0, 4);\n  x3(\"\\000(\\000(\\230\\250l4\\000)\\000)\\000\\000\", \"\\230\\250l4\\000\\000\", 0, 4, 1);\n  x3(\"\\000(\\000(f(e\\345\\000)\\000)\\000\\000\", \"f(e\\345\\000\\000\", 0, 4, 2);\n  x3(\"\\000(\\000(\\000(\\000(\\000(\\000(\\000(\\000(\\000(\\000(\\000(\\000(\\000(\\000(\\000(\\000(\\000(\\000(\\000(\\000(\\221\\317[P\\000)\\000)\\000)\\000)\\000)\\000)\\000)\\000)\\000)\\000)\\000)\\000)\\000)\\000)\\000)\\000)\\000)\\000)\\000)\\000)\\000\\000\", \"\\221\\317[P\\000\\000\", 0, 4, 20);\n  x3(\"\\000(0B0D\\000)\\000(0F0H\\000)\\000\\000\", \"0B0D0F0H\\000\\000\", 0, 4, 1);\n  x3(\"\\000(0B0D\\000)\\000(0F0H\\000)\\000\\000\", \"0B0D0F0H\\000\\000\", 4, 8, 2);\n  x3(\"\\000(\\000)\\000(0B\\000)0D0F\\000(0H0J0K\\000)0M0O0Q0S\\000\\000\", \"0B0D0F0H0J0K0M0O0Q0S\\000\\000\", 6, 12, 3);\n  x3(\"\\000(\\000(\\000)\\000(0B\\000)0D0F\\000(0H0J0K\\000)0M0O0Q0S\\000)\\000\\000\", \"0B0D0F0H0J0K0M0O0Q0S\\000\\000\", 6, 12, 4);\n  x3(\"\\000.\\000*\\000(0\\3250\\251\\000)0\\3630\\3730\\336\\000(0\\363\\000(\\000)0\\2670\\3450\\277\\000)0\\2440\\363\\000\\000\", \"0\\3250\\2510\\3630\\3730\\3360\\3630\\2670\\3450\\2770\\2440\\363\\000\\000\", 10, 18, 2);\n  x2(\"\\000(\\000^0B\\000)\\000\\000\", \"0B\\000\\000\", 0, 2);\n  x3(\"\\000(0B\\000)\\000|\\000(0B\\000)\\000\\000\", \"0D0B\\000\\000\", 2, 4, 1);\n  x3(\"\\000(\\000^0B\\000)\\000|\\000(0B\\000)\\000\\000\", \"0D0B\\000\\000\", 2, 4, 2);\n  x3(\"\\000(0B\\000?\\000)\\000\\000\", \"0B0B0B\\000\\000\", 0, 2, 1);\n  x3(\"\\000(0~\\000*\\000)\\000\\000\", \"0~0~0~\\000\\000\", 0, 6, 1);\n  x3(\"\\000(0h\\000*\\000)\\000\\000\", \"\\000\\000\", 0, 0, 1);\n  x3(\"\\000(0\\213\\000+\\000)\\000\\000\", \"0\\2130\\2130\\2130\\2130\\2130\\2130\\213\\000\\000\", 0, 14, 1);\n  x3(\"\\000(0u\\000+\\000|0x\\000*\\000)\\000\\000\", \"0u0u0u0x0x\\000\\000\", 0, 6, 1);\n  x3(\"\\000(0B\\000+\\000|0D\\000?\\000)\\000\\000\", \"0D0D0D0B0B\\000\\000\", 0, 2, 1);\n  x3(\"\\000(0B0D0F\\000)\\000?\\000\\000\", \"0B0D0F\\000\\000\", 0, 6, 1);\n  x3(\"\\000(0B0D0F\\000)\\000*\\000\\000\", \"0B0D0F\\000\\000\", 0, 6, 1);\n  x3(\"\\000(0B0D0F\\000)\\000+\\000\\000\", \"0B0D0F\\000\\000\", 0, 6, 1);\n  x3(\"\\000(0U0W0Y\\000|0B0D0F\\000)\\000+\\000\\000\", \"0B0D0F\\000\\000\", 0, 6, 1);\n  x3(\"\\000(\\000[0j0k0l\\000]\\000[0K0M0O\\000]\\000|0K0M0O\\000)\\000+\\000\\000\", \"0K0M0O\\000\\000\", 0, 6, 1);\n  x3(\"\\000(\\000(\\000?\\000i\\000:0B0D0F\\000)\\000)\\000\\000\", \"0B0D0F\\000\\000\", 0, 6, 1);\n  x3(\"\\000(\\000(\\000?\\000m\\000:0B\\000.0F\\000)\\000)\\000\\000\", \"0B\\000\\0120F\\000\\000\", 0, 6, 1);\n  x3(\"\\000(\\000(\\000?\\000=0B0\\223\\000)0B\\000)\\000\\000\", \"0B0\\2230D\\000\\000\", 0, 2, 1);\n  x3(\"0B0D0F\\000|\\000(\\000.0B0D0H\\000)\\000\\000\", \"0\\2230B0D0H\\000\\000\", 0, 8, 1);\n  x3(\"0B\\000*\\000(\\000.\\000)\\000\\000\", \"0B0B0B0B0\\223\\000\\000\", 8, 10, 1);\n  x3(\"0B\\000*\\000?\\000(\\000.\\000)\\000\\000\", \"0B0B0B0B0\\223\\000\\000\", 0, 2, 1);\n  x3(\"0B\\000*\\000?\\000(0\\223\\000)\\000\\000\", \"0B0B0B0B0\\223\\000\\000\", 8, 10, 1);\n  x3(\"\\000[0D0F0H\\000]0B\\000*\\000(\\000.\\000)\\000\\000\", \"0H0B0B0B0B0\\223\\000\\000\", 10, 12, 1);\n  x3(\"\\000(\\000\\134\\000A0D0D\\000)0F0F\\000\\000\", \"0D0D0F0F\\000\\000\", 0, 4, 1);\n  n(\"\\000(\\000\\134\\000A0D0D\\000)0F0F\\000\\000\", \"0\\2230D0D0F0F\\000\\000\");\n  x3(\"\\000(\\000^0D0D\\000)0F0F\\000\\000\", \"0D0D0F0F\\000\\000\", 0, 4, 1);\n  n(\"\\000(\\000^0D0D\\000)0F0F\\000\\000\", \"0\\2230D0D0F0F\\000\\000\");\n  x3(\"0\\2150\\215\\000(0\\2130\\213\\000$\\000)\\000\\000\", \"0\\2150\\2150\\2130\\213\\000\\000\", 4, 8, 1);\n  n(\"0\\2150\\215\\000(0\\2130\\213\\000$\\000)\\000\\000\", \"0\\2150\\2150\\2130\\2130\\213\\000\\000\");\n  x2(\"\\000(q!\\000)\\000\\134\\0001\\000\\000\", \"q!q!\\000\\000\", 0, 4);\n  n(\"\\000(q!\\000)\\000\\134\\0001\\000\\000\", \"q!kf\\000\\000\");\n  x2(\"\\000(zz\\000?\\000)\\000\\134\\0001\\000\\000\", \"zzzz\\000\\000\", 0, 4);\n  x2(\"\\000(zz\\000?\\000?\\000)\\000\\134\\0001\\000\\000\", \"zzzz\\000\\000\", 0, 0);\n  x2(\"\\000(zz\\000*\\000)\\000\\134\\0001\\000\\000\", \"zzzzzzzzzz\\000\\000\", 0, 8);\n  x3(\"\\000(zz\\000*\\000)\\000\\134\\0001\\000\\000\", \"zzzzzzzzzz\\000\\000\", 0, 4, 1);\n  x2(\"0B\\000(0D\\000*\\000)\\000\\134\\0001\\000\\000\", \"0B0D0D0D0D\\000\\000\", 0, 10);\n  x2(\"0B\\000(0D\\000*\\000)\\000\\134\\0001\\000\\000\", \"0B0D\\000\\000\", 0, 2);\n  x2(\"\\000(0B\\000*\\000)\\000(0D\\000*\\000)\\000\\134\\0001\\000\\134\\0002\\000\\000\", \"0B0B0B0D0D0B0B0B0D0D\\000\\000\", 0, 20);\n  x2(\"\\000(0B\\000*\\000)\\000(0D\\000*\\000)\\000\\134\\0002\\000\\000\", \"0B0B0B0D0D0D0D\\000\\000\", 0, 14);\n  x3(\"\\000(0B\\000*\\000)\\000(0D\\000*\\000)\\000\\134\\0002\\000\\000\", \"0B0B0B0D0D0D0D\\000\\000\", 6, 10, 2);\n  x2(\"\\000(\\000(\\000(\\000(\\000(\\000(\\000(0}\\000*\\000)0z\\000)\\000)\\000)\\000)\\000)\\000)0t\\000\\134\\0007\\000\\000\", \"0}0}0}0z0t0}0}0}\\000\\000\", 0, 16);\n  x3(\"\\000(\\000(\\000(\\000(\\000(\\000(\\000(0}\\000*\\000)0z\\000)\\000)\\000)\\000)\\000)\\000)0t\\000\\134\\0007\\000\\000\", \"0}0}0}0z0t0}0}0}\\000\\000\", 0, 6, 7);\n  x2(\"\\000(0o\\000)\\000(0r\\000)\\000(0u\\000)\\000\\134\\0002\\000\\134\\0001\\000\\134\\0003\\000\\000\", \"0o0r0u0r0o0u\\000\\000\", 0, 12);\n  x2(\"\\000(\\000[0M\\000-0Q\\000]\\000)\\000\\134\\0001\\000\\000\", \"0O0O\\000\\000\", 0, 4);\n  x2(\"\\000(\\000?\\000u\\000)\\000(\\000\\134\\000w\\000\\134\\000d\\000\\134\\000s\\000)\\000\\134\\0001\\000\\000\", \"0B\\0005\\000 0B\\0005\\000 \\000\\000\", 0, 12);\n  n(\"\\000(\\000?\\000u\\000)\\000(\\000\\134\\000w\\000\\134\\000d\\000\\134\\000s\\000)\\000\\134\\0001\\000\\000\", \"0B\\0005\\000 0B\\0005\\000\\000\");\n  x2(\"\\000(\\212\\260\\377\\037\\000|\\000[0B\\000-0F\\000]\\000{\\0003\\000}\\000)\\000\\134\\0001\\000\\000\", \"\\212\\260\\377\\037\\212\\260\\377\\037\\000\\000\", 0, 8);\n  x2(\"\\000.\\000.\\000.\\000(\\212\\260\\377\\037\\000|\\000[0B\\000-0F\\000]\\000{\\0003\\000}\\000)\\000\\134\\0001\\000\\000\", \"0B\\000a0B\\212\\260\\377\\037\\212\\260\\377\\037\\000\\000\", 0, 14);\n  x2(\"\\000(\\212\\260\\377\\037\\000|\\000[0B\\000-0F\\000]\\000{\\0003\\000}\\000)\\000\\134\\0001\\000\\000\", \"0F0D0F0F0D0F\\000\\000\", 0, 12);\n  x2(\"\\000(\\000^0S\\000)\\000\\134\\0001\\000\\000\", \"0S0S\\000\\000\", 0, 4);\n  n(\"\\000(\\000^0\\200\\000)\\000\\134\\0001\\000\\000\", \"0\\2010\\2000\\200\\000\\000\");\n  n(\"\\000(0B\\000$\\000)\\000\\134\\0001\\000\\000\", \"0B0B\\000\\000\");\n  n(\"\\000(0B0D\\000\\134\\000Z\\000)\\000\\134\\0001\\000\\000\", \"0B0D\\000\\000\");\n  x2(\"\\000(0B\\000*\\000\\134\\000Z\\000)\\000\\134\\0001\\000\\000\", \"0B\\000\\000\", 2, 2);\n  x2(\"\\000.\\000(0B\\000*\\000\\134\\000Z\\000)\\000\\134\\0001\\000\\000\", \"0D0B\\000\\000\", 2, 4);\n  x3(\"\\000(\\000.\\000(0\\2040D0\\206\\000)\\000\\134\\0002\\000)\\000\\000\", \"\\000z0\\2040D0\\2060\\2040D0\\206\\000\\000\", 0, 14, 1);\n  x3(\"\\000(\\000.\\000(\\000.\\000.\\000\\134\\000d\\000.\\000)\\000\\134\\0002\\000)\\000\\000\", \"0B\\0001\\0002\\0003\\0004\\0001\\0002\\0003\\0004\\000\\000\", 0, 18, 1);\n  x2(\"\\000(\\000(\\000?\\000i\\000:0B\\000v0Z\\000)\\000)\\000\\134\\0001\\000\\000\", \"0B\\000v0Z0B\\000v0Z\\000\\000\", 0, 12);\n  x2(\"\\000(\\000?\\000<a\\0320K\\000>Y\\011\\000|\\000\\134\\000(\\000\\134\\000g\\000<a\\0320K\\000>\\000\\134\\000)\\000)\\000\\000\", \"\\000(\\000(\\000(\\000(\\000(\\000(Y\\011\\000)\\000)\\000)\\000)\\000)\\000)\\000\\000\", 0, 26);\n  x2(\"\\000\\134\\000A\\000(\\000?\\000:\\000\\134\\000g\\000<\\226?\\000_\\0001\\000>\\000|\\000\\134\\000g\\000<N\\221\\000_\\0002\\000>\\000|\\000\\134\\000z}BN\\206\\000 \\000 \\000(\\000?\\000<\\226?\\000_\\0001\\000>\\211\\263\\000|\\201\\352\\000\\134\\000g\\000<N\\221\\000_\\0002\\000>\\201\\352\\000)\\000(\\000?\\000<N\\221\\000_\\0002\\000>W(\\000|\\203\\351\\205\\251\\000\\134\\000g\\000<\\226?\\000_\\0001\\000>\\203\\351\\205\\251\\000)\\000)\\000$\\000\\000\", \"\\203\\351\\205\\251\\201\\352\\203\\351\\205\\251\\201\\352W(\\201\\352\\203\\351\\205\\251\\201\\352\\203\\351\\205\\251\\000\\000\", 0, 26);\n  x2(\"\\000[\\000[0r0u\\000]\\000]\\000\\000\", \"0u\\000\\000\", 0, 2);\n  x2(\"\\000[\\000[0D0J0F\\000]0K\\000]\\000\\000\", \"0K\\000\\000\", 0, 2);\n  n(\"\\000[\\000[\\000^0B\\000]\\000]\\000\\000\", \"0B\\000\\000\");\n  n(\"\\000[\\000^\\000[0B\\000]\\000]\\000\\000\", \"0B\\000\\000\");\n  x2(\"\\000[\\000^\\000[\\000^0B\\000]\\000]\\000\\000\", \"0B\\000\\000\", 0, 2);\n  x2(\"\\000[\\000[0K0M0O\\000]\\000&\\000&0M0O\\000]\\000\\000\", \"0O\\000\\000\", 0, 2);\n  n(\"\\000[\\000[0K0M0O\\000]\\000&\\000&0M0O\\000]\\000\\000\", \"0K\\000\\000\");\n  n(\"\\000[\\000[0K0M0O\\000]\\000&\\000&0M0O\\000]\\000\\000\", \"0Q\\000\\000\");\n  x2(\"\\000[0B\\000-0\\223\\000&\\000&0D\\000-0\\222\\000&\\000&0F\\000-0\\221\\000]\\000\\000\", \"0\\221\\000\\000\", 0, 2);\n  n(\"\\000[\\000^0B\\000-0\\223\\000&\\000&0D\\000-0\\222\\000&\\000&0F\\000-0\\221\\000]\\000\\000\", \"0\\221\\000\\000\");\n  x2(\"\\000[\\000[\\000^0B\\000&\\000&0B\\000]\\000&\\000&0B\\000-0\\223\\000]\\000\\000\", \"0D\\000\\000\", 0, 2);\n  n(\"\\000[\\000[\\000^0B\\000&\\000&0B\\000]\\000&\\000&0B\\000-0\\223\\000]\\000\\000\", \"0B\\000\\000\");\n  x2(\"\\000[\\000[\\000^0B\\000-0\\223\\000&\\000&0D0F0H0J\\000]\\000&\\000&\\000[\\000^0F\\000-0K\\000]\\000]\\000\\000\", \"0M\\000\\000\", 0, 2);\n  n(\"\\000[\\000[\\000^0B\\000-0\\223\\000&\\000&0D0F0H0J\\000]\\000&\\000&\\000[\\000^0F\\000-0K\\000]\\000]\\000\\000\", \"0D\\000\\000\");\n  x2(\"\\000[\\000^\\000[\\000^0B0D0F\\000]\\000&\\000&\\000[\\000^0F0H0J\\000]\\000]\\000\\000\", \"0F\\000\\000\", 0, 2);\n  x2(\"\\000[\\000^\\000[\\000^0B0D0F\\000]\\000&\\000&\\000[\\000^0F0H0J\\000]\\000]\\000\\000\", \"0H\\000\\000\", 0, 2);\n  n(\"\\000[\\000^\\000[\\000^0B0D0F\\000]\\000&\\000&\\000[\\000^0F0H0J\\000]\\000]\\000\\000\", \"0K\\000\\000\");\n  x2(\"\\000[0B\\000-\\000&\\000&\\000-0B\\000]\\000\\000\", \"\\000-\\000\\000\", 0, 2);\n  x2(\"\\000[\\000^\\000[\\000^\\000a\\000-\\000z0B0D0F\\000]\\000&\\000&\\000[\\000^\\000b\\000c\\000d\\000e\\000f\\000g0F0H0J\\000]\\000q\\000-\\000w\\000]\\000\\000\", \"0H\\000\\000\", 0, 2);\n  x2(\"\\000[\\000^\\000[\\000^\\000a\\000-\\000z0B0D0F\\000]\\000&\\000&\\000[\\000^\\000b\\000c\\000d\\000e\\000f\\000g0F0H0J\\000]\\000g\\000-\\000w\\000]\\000\\000\", \"\\000f\\000\\000\", 0, 2);\n  x2(\"\\000[\\000^\\000[\\000^\\000a\\000-\\000z0B0D0F\\000]\\000&\\000&\\000[\\000^\\000b\\000c\\000d\\000e\\000f\\000g0F0H0J\\000]\\000g\\000-\\000w\\000]\\000\\000\", \"\\000g\\000\\000\", 0, 2);\n  n(\"\\000[\\000^\\000[\\000^\\000a\\000-\\000z0B0D0F\\000]\\000&\\000&\\000[\\000^\\000b\\000c\\000d\\000e\\000f\\000g0F0H0J\\000]\\000g\\000-\\000w\\000]\\000\\000\", \"\\0002\\000\\000\");\n  x2(\"\\000a\\000<\\000b\\000>0\\3200\\3740\\2700\\3470\\3630n0\\3000\\2460\\3630\\3550\\3740\\311\\000<\\000\\134\\000/\\000b\\000>\\000\\000\", \"\\000a\\000<\\000b\\000>0\\3200\\3740\\2700\\3470\\3630n0\\3000\\2460\\3630\\3550\\3740\\311\\000<\\000/\\000b\\000>\\000\\000\", 0, 40);\n  x2(\"\\000.\\000<\\000b\\000>0\\3200\\3740\\2700\\3470\\3630n0\\3000\\2460\\3630\\3550\\3740\\311\\000<\\000\\134\\000/\\000b\\000>\\000\\000\", \"\\000a\\000<\\000b\\000>0\\3200\\3740\\2700\\3470\\3630n0\\3000\\2460\\3630\\3550\\3740\\311\\000<\\000/\\000b\\000>\\000\\000\", 0, 40);\n  fprintf(stdout,\n       \"\\nRESULT   SUCC: %d,  FAIL: %d,  ERROR: %d      (by Onigmo %s)\\n\",\n       nsucc, nfail, nerror, onig_version());\n\n#ifndef POSIX_TEST\n  onig_region_free(region, 1);\n  onig_end();\n#endif\n\n  return ((nfail == 0 && nerror == 0) ? 0 : -1);\n}\n"
  },
  {
    "path": "src/Onigmo/tool/.gitignore",
    "content": "# ignore UCD files\nBlocks.txt\nCaseFolding.txt\nDerivedAge.txt\nDerivedCoreProperties.txt\nPropList.txt\nPropertyAliases.txt\nPropertyValueAliases.txt\nScripts.txt\nUnicodeData.txt\n\n# ignore generated files\ncasefold.h\nname2ctype.h\nname2ctype.kwd\n"
  },
  {
    "path": "src/Onigmo/tool/CaseFolding.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n# Usage:\n#   $ wget http://www.unicode.org/Public/UNIDATA/CaseFolding.txt\n#   $ python CaseFolding.py CaseFolding.txt > ../enc/unicode/casefold.h\n\nfrom __future__ import print_function\nimport sys\nimport re\n\ndef print_case_folding_data(filename):\n    pattern = re.compile(\"([0-9A-F]{4,6}); ([CFT]); \" +\n            \"([0-9A-F]{4,6})(?: ([0-9A-F]{4,6}))?(?: ([0-9A-F]{4,6}))?;\")\n\n    fold = {}\n    unfold = [{}, {}, {}]\n    turkic = []\n\n    with open(filename, 'r') as f:\n        for line in f:\n            res = pattern.match(line)\n            if not res:\n                continue\n            ch_from = int(res.group(1), 16)\n            ch_to = []\n\n            if res.group(2) == 'T':\n                # Turkic case folding\n                turkic.append(ch_from)\n                continue\n\n            # store folding data\n            for i in range(3, 6):\n                if res.group(i):\n                    ch_to.append(int(res.group(i), 16))\n            fold[ch_from] = ch_to\n\n            # store unfolding data\n            key = tuple(ch_to)\n            i = len(key) - 1\n            unfold[i].setdefault(key, []).append(ch_from)\n\n    # move locale dependent data to (un)fold_locale\n    fold_locale = {}\n    unfold_locale = [{}, {}]\n    for ch_from in turkic:\n        key = tuple(fold[ch_from])\n        i = len(key) - 1\n        unfold_locale[i][key] = unfold[i][key]\n        del unfold[i][key]\n        fold_locale[ch_from] = fold[ch_from]\n        del fold[ch_from]\n\n    # print the header\n    print(\"/* DO NOT EDIT THIS FILE. */\")\n    print(\"/* Generated by tool/CaseFolding.py */\\n\")\n\n    # print folding data\n\n    # CaseFold\n    print(\"static const CaseFold_11_Type CaseFold[] = {\")\n    for k, v in sorted(fold.items()):\n        sv = \", \".join(\"0x%04x\" % i for i in v)\n        print(\" { 0x%04x, {%d, {%s}}},\" % (k, len(v), sv))\n    print(\"};\\n\")\n\n    # CaseFold_Locale\n    print(\"static const CaseFold_11_Type CaseFold_Locale[] = {\")\n    for k, v in sorted(fold_locale.items()):\n        sv = \", \".join(\"0x%04x\" % i for i in v)\n        print(\" { 0x%04x, {%d, {%s}}},\" % (k, len(v), sv))\n    print(\"};\\n\")\n\n    # print unfolding data\n\n    # CaseUnfold_11\n    print(\"static const CaseUnfold_11_Type CaseUnfold_11[] = {\")\n    for k, v in sorted(unfold[0].items()):\n        sv = \", \".join(\"0x%04x\" % i for i in v)\n        print(\" { 0x%04x, {%d, {%s }}},\" % (k[0], len(v), sv))\n    print(\"};\\n\")\n\n    # CaseUnfold_11_Locale\n    print(\"static const CaseUnfold_11_Type CaseUnfold_11_Locale[] = {\")\n    for k, v in sorted(unfold_locale[0].items()):\n        sv = \", \".join(\"0x%04x\" % i for i in v)\n        print(\" { 0x%04x, {%d, {%s }}},\" % (k[0], len(v), sv))\n    print(\"};\\n\")\n\n    # CaseUnfold_12\n    print(\"static const CaseUnfold_12_Type CaseUnfold_12[] = {\")\n    for k, v in sorted(unfold[1].items()):\n        sk = \", \".join(\"0x%04x\" % i for i in k)\n        sv = \", \".join(\"0x%04x\" % i for i in v)\n        print(\" { {%s}, {%d, {%s }}},\" % (sk, len(v), sv))\n    print(\"};\\n\")\n\n    # CaseUnfold_12_Locale\n    print(\"static const CaseUnfold_12_Type CaseUnfold_12_Locale[] = {\")\n    for k, v in sorted(unfold_locale[1].items()):\n        sk = \", \".join(\"0x%04x\" % i for i in k)\n        sv = \", \".join(\"0x%04x\" % i for i in v)\n        print(\" { {%s}, {%d, {%s }}},\" % (sk, len(v), sv))\n    print(\"};\\n\")\n\n    # CaseUnfold_13\n    print(\"static const CaseUnfold_13_Type CaseUnfold_13[] = {\")\n    for k, v in sorted(unfold[2].items()):\n        sk = \", \".join(\"0x%04x\" % i for i in k)\n        sv = \", \".join(\"0x%04x\" % i for i in v)\n        print(\" { {%s}, {%d, {%s }}},\" % (sk, len(v), sv))\n    print(\"};\\n\")\n\n    # table sizes\n    fold_table_size = len(fold) + len(fold_locale)\n    print(\"#define FOLD_TABLE_SIZE\\t\\t%d\" % int(fold_table_size * 1.2))\n    unfold1_table_size = len(unfold[0]) + len(unfold_locale[0])\n    print(\"#define UNFOLD1_TABLE_SIZE\\t%d\" % int(unfold1_table_size * 1.2))\n    unfold2_table_size = len(unfold[1]) + len(unfold_locale[1])\n    print(\"#define UNFOLD2_TABLE_SIZE\\t%d\" % int(unfold2_table_size * 1.5))\n    unfold3_table_size = len(unfold[2])\n    print(\"#define UNFOLD3_TABLE_SIZE\\t%d\" % int(unfold3_table_size * 1.7))\n\ndef main():\n    filename = 'CaseFolding.txt'\n    if len(sys.argv) > 1:\n        filename = sys.argv[1]\n    print_case_folding_data(filename)\n\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "src/Onigmo/tool/convert-name2ctype.sh",
    "content": "#!/bin/sh\n\n# Convert name2ctype.kwd to name2ctype.h using GNU gperf.\n#\n# Usage:\n#   convert-name2ctype.sh name2ctype.kwd > name2ctype.h\n\nNAME2CTYPE_OPTIONS='-7 -c -j1 -i1 -t -C -P -T -H uniname2ctype_hash -Q uniname2ctype_pool -N uniname2ctype_p'\n\n# undef USE_UNICODE_PROPERTIES\nsed '/^#ifdef USE_UNICODE_PROPERTIES/,/^#endif/d' $1 | gperf ${NAME2CTYPE_OPTIONS} > name2ctype-1.h\n# define USE_UNICODE_PROPERTIES\nsed '/^\\(#ifdef USE_UNICODE_PROPERTIES\\|#endif\\)/d' $1 | gperf ${NAME2CTYPE_OPTIONS} > name2ctype-2.h\n# merge them\ndiff -DUSE_UNICODE_PROPERTIES name2ctype-1.h name2ctype-2.h\nrm name2ctype-1.h name2ctype-2.h\n"
  },
  {
    "path": "src/Onigmo/tool/enc-unicode.rb",
    "content": "#!/usr/bin/env ruby\n\n# Creates the data structures needed by Onigurma to map Unicode codepoints to\n# property names and POSIX character classes\n#\n# To use this, get UnicodeData.txt, Scripts.txt, PropList.txt,\n# PropertyAliases.txt, PropertyValueAliases.txt, DerivedCoreProperties.txt,\n# DerivedAge.txt and Blocks.txt  from unicode.org.\n# (http://unicode.org/Public/UNIDATA/) And run following command.\n# ruby1.9 tool/enc-unicode.rb data_dir > enc/unicode/name2ctype.kwd\n# You can get source file for gperf.  After this, simply make ruby.\n\nunless ARGV.size == 1\n  $stderr.puts \"Usage: #{$0} data_directory\"\n  exit(1)\nend\n\nPOSIX_NAMES = %w[NEWLINE Alpha Blank Cntrl Digit Graph Lower Print Punct Space Upper XDigit Word Alnum ASCII]\n\ndef pair_codepoints(codepoints)\n\n  # We have a sorted Array of codepoints that we wish to partition into\n  # ranges such that the start- and endpoints form an inclusive set of\n  # codepoints with property _property_. Note: It is intended that some ranges\n  # will begin with the value with  which they end, e.g. 0x0020 -> 0x0020\n\n  codepoints.sort!\n  last_cp = codepoints.first\n  pairs = [[last_cp, nil]]\n  codepoints[1..-1].each do |codepoint|\n    next if last_cp == codepoint\n\n    # If the current codepoint does not follow directly on from the last\n    # codepoint, the last codepoint represents the end of the current range,\n    # and the current codepoint represents the start of the next range.\n    if last_cp.next != codepoint\n      pairs[-1][-1] = last_cp\n      pairs << [codepoint, nil]\n    end\n    last_cp = codepoint\n  end\n\n  # The final pair has as its endpoint the last codepoint for this property\n  pairs[-1][-1] = codepoints.last\n  pairs\nend\n\ndef parse_unicode_data(file)\n  last_cp = 0\n  data = {'Any' => (0x0000..0x10ffff).to_a, 'Assigned' => [],\n    'ASCII' => (0..0x007F).to_a, 'NEWLINE' => [0x0a], 'Cn' => []}\n  beg_cp = nil\n  IO.foreach(file) do |line|\n    fields = line.split(';')\n    cp = fields[0].to_i(16)\n\n    case fields[1]\n    when /\\A<(.*),\\s*First>\\z/\n      beg_cp = cp\n      next\n    when /\\A<(.*),\\s*Last>\\z/\n      cps = (beg_cp..cp).to_a\n    else\n      beg_cp = cp\n      cps = [cp]\n    end\n\n    # The Cn category represents unassigned characters. These are not listed in\n    # UnicodeData.txt so we must derive them by looking for 'holes' in the range\n    # of listed codepoints. We increment the last codepoint seen and compare it\n    # with the current codepoint. If the current codepoint is less than\n    # last_cp.next we have found a hole, so we add the missing codepoint to the\n    # Cn category.\n    data['Cn'].concat((last_cp.next...beg_cp).to_a)\n\n    # Assigned - Defined in unicode.c; interpreted as every character in the\n    # Unicode range minus the unassigned characters\n    data['Assigned'].concat(cps)\n\n    # The third field denotes the 'General' category, e.g. Lu\n    (data[fields[2]] ||= []).concat(cps)\n\n    # The 'Major' category is the first letter of the 'General' category, e.g.\n    # 'Lu' -> 'L'\n    (data[fields[2][0,1]] ||= []).concat(cps)\n    last_cp = cp\n  end\n\n  # The last Cn codepoint should be 0x10ffff. If it's not, append the missing\n  # codepoints to Cn and C\n  cn_remainder = (last_cp.next..0x10ffff).to_a\n  data['Cn'] += cn_remainder\n  data['C'] += data['Cn']\n\n  # Special case for LC (Cased_Letter). LC = Ll + Lt + Lu\n  data['LC'] = data['Ll'] + data['Lt'] + data['Lu']\n\n  # Define General Category properties\n  gcps = data.keys.sort - POSIX_NAMES\n\n  # Returns General Category Property names and the data\n  [gcps, data]\nend\n\ndef define_posix_props(data)\n  # We now derive the character classes (POSIX brackets), e.g. [[:alpha:]]\n  #\n\n  data['Alpha'] = data['Alphabetic']\n  data['Upper'] = data['Uppercase']\n  data['Lower'] = data['Lowercase']\n  data['Punct'] = data['Punctuation']\n  data['Digit'] = data['Decimal_Number']\n  data['XDigit'] = (0x0030..0x0039).to_a + (0x0041..0x0046).to_a +\n                   (0x0061..0x0066).to_a\n  data['Alnum'] = data['Alpha'] + data['Digit']\n  data['Space'] = data['White_Space']\n  data['Blank'] = data['Space_Separator'] + [0x0009]\n  data['Cntrl'] = data['Cc']\n  data['Word'] = data['Alpha'] + data['Mark'] + data['Digit'] + data['Connector_Punctuation']\n  data['Graph'] = data['Any'] - data['Space'] - data['Cntrl'] -\n    data['Surrogate'] - data['Unassigned']\n  data['Print'] = data['Graph'] + data['Space_Separator']\nend\n\ndef parse_scripts(data, categories)\n  files = [\n    {:fn => 'DerivedCoreProperties.txt', :title => 'Derived Property'},\n    {:fn => 'Scripts.txt', :title => 'Script'},\n    {:fn => 'PropList.txt', :title => 'Binary Property'}\n  ]\n  current = nil\n  cps = []\n  names = {}\n  files.each do |file|\n    IO.foreach(get_file(file[:fn])) do |line|\n      if /^# Total code points: / =~ line\n        data[current] = cps\n        categories[current] = file[:title]\n        (names[file[:title]] ||= []) << current\n        cps = []\n      elsif /^([0-9a-fA-F]+)(?:..([0-9a-fA-F]+))?\\s*;\\s*(\\w+)/ =~ line\n        current = $3\n        $2 ? cps.concat(($1.to_i(16)..$2.to_i(16)).to_a) : cps.push($1.to_i(16))\n      end\n    end\n  end\n  #  All code points not explicitly listed for Script\n  #  have the value Unknown (Zzzz).\n  data['Unknown'] =  (0..0x10ffff).to_a - data.values_at(*names['Script']).flatten\n  categories['Unknown'] = 'Script'\n  names.values.flatten << 'Unknown'\nend\n\ndef parse_aliases(data)\n  kv = {}\n  IO.foreach(get_file('PropertyAliases.txt')) do |line|\n    next unless /^(\\w+)\\s*; (\\w+)/ =~ line\n    data[$1] = data[$2]\n    kv[normalize_propname($1)] = normalize_propname($2)\n  end\n  IO.foreach(get_file('PropertyValueAliases.txt')) do |line|\n    next unless /^(sc|gc)\\s*; (\\w+)\\s*; (\\w+)(?:\\s*; (\\w+))?/ =~ line\n    if $1 == 'gc'\n      data[$3] = data[$2]\n      data[$4] = data[$2]\n      kv[normalize_propname($3)] = normalize_propname($2)\n      kv[normalize_propname($4)] = normalize_propname($2) if $4\n    else\n      data[$2] = data[$3]\n      data[$4] = data[$3]\n      kv[normalize_propname($2)] = normalize_propname($3)\n      kv[normalize_propname($4)] = normalize_propname($3) if $4\n    end\n  end\n  kv\nend\n\n# According to Unicode6.0.0/ch03.pdf, Section 3.1, \"An update version\n# never involves any additions to the character repertoire.\" Versions\n# in DerivedAge.txt should always be /\\d+\\.\\d+/\ndef parse_age(data)\n  current = nil\n  last_constname = nil\n  cps = []\n  ages = []\n  IO.foreach(get_file('DerivedAge.txt')) do |line|\n    if /^# Total code points: / =~ line\n      constname = constantize_agename(current)\n      # each version matches all previous versions\n      cps.concat(data[last_constname]) if last_constname\n      data[constname] = cps\n      make_const(constname, cps, \"Derived Age #{current}\")\n      ages << current\n      last_constname = constname\n      cps = []\n    elsif /^([0-9a-fA-F]+)(?:..([0-9a-fA-F]+))?\\s*;\\s*(\\d+\\.\\d+)/ =~ line\n      current = $3\n      $2 ? cps.concat(($1.to_i(16)..$2.to_i(16)).to_a) : cps.push($1.to_i(16))\n    end\n  end\n  ages\nend\n\ndef parse_block(data)\n  current = nil\n  last_constname = nil\n  cps = []\n  blocks = []\n  IO.foreach(get_file('Blocks.txt')) do |line|\n    if /^([0-9a-fA-F]+)\\.\\.([0-9a-fA-F]+);\\s*(.*)/ =~ line\n      cps = ($1.to_i(16)..$2.to_i(16)).to_a\n      constname = constantize_blockname($3)\n      data[constname] = cps\n      make_const(constname, cps, \"Block\")\n      blocks << constname\n    end\n  end\n\n  # All code points not belonging to any of the named blocks\n  # have the value No_Block.\n  no_block = (0..0x10ffff).to_a - data.values_at(*blocks).flatten\n  constname = constantize_blockname(\"No_Block\")\n  make_const(constname, no_block, \"Block\")\n  blocks << constname\nend\n\n# shim for Ruby 1.8\nunless {}.respond_to?(:key)\n  class Hash\n    alias key index\n  end\nend\n\n$const_cache = {}\n# make_const(property, pairs, name): Prints a 'static const' structure for a\n# given property, group of paired codepoints, and a human-friendly name for\n# the group\ndef make_const(prop, data, name)\n  puts \"\\n/* '#{prop}': #{name} */\"\n  if origprop = $const_cache.key(data)\n    puts \"#define CR_#{prop} CR_#{origprop}\"\n  else\n    $const_cache[prop] = data\n    pairs = pair_codepoints(data)\n    puts \"static const OnigCodePoint CR_#{prop}[] = {\"\n    # The first element of the constant is the number of pairs of codepoints\n    puts \"\\t#{pairs.size},\"\n    pairs.each do |pair|\n      pair.map! { |c|  c == 0 ? '0x0000' : sprintf(\"%0#6x\", c) }\n      puts \"\\t#{pair.first}, #{pair.last},\"\n    end\n    puts \"}; /* CR_#{prop} */\"\n  end\nend\n\ndef normalize_propname(name)\n  name = name.downcase\n  name.delete!('- _')\n  name\nend\n\ndef constantize_agename(name)\n  \"Age_#{name.sub(/\\./, '_')}\"\nend\n\ndef constantize_blockname(name)\n  \"In_#{name.gsub(/\\W/, '_')}\"\nend\n\ndef get_file(name)\n  File.join(ARGV[0], name)\nend\n\n\n# Write Data\nputs '%{'\nputs '#define long size_t'\nprops, data = parse_unicode_data(get_file('UnicodeData.txt'))\ncategories = {}\nprops.concat parse_scripts(data, categories)\naliases = parse_aliases(data)\ndefine_posix_props(data)\nPOSIX_NAMES.each do |name|\n  make_const(name, data[name], \"[[:#{name}:]]\")\nend\nprint \"\\n#ifdef USE_UNICODE_PROPERTIES\"\nprops.each do |name|\n  category = categories[name] ||\n    case name.size\n    when 1 then 'Major Category'\n    when 2 then 'General Category'\n    else        '-'\n    end\n  make_const(name, data[name], category)\nend\nages = parse_age(data)\nblocks = parse_block(data)\nputs '#endif /* USE_UNICODE_PROPERTIES */'\nputs(<<'__HEREDOC')\n\nstatic const OnigCodePoint* const CodeRanges[] = {\n__HEREDOC\nPOSIX_NAMES.each{|name|puts\"  CR_#{name},\"}\nputs \"#ifdef USE_UNICODE_PROPERTIES\"\nprops.each{|name| puts\"  CR_#{name},\"}\nages.each{|name|  puts\"  CR_#{constantize_agename(name)},\"}\nblocks.each{|name|puts\"  CR_#{name},\"}\n\nputs(<<'__HEREDOC')\n#endif /* USE_UNICODE_PROPERTIES */\n};\nstruct uniname2ctype_struct {\n  int name, ctype;\n};\n\nstatic const struct uniname2ctype_struct *uniname2ctype_p(const char *, unsigned int);\n%}\nstruct uniname2ctype_struct;\n%%\n__HEREDOC\ni = -1\nname_to_index = {}\nPOSIX_NAMES.each do |name|\n  i += 1\n  next if name == 'NEWLINE'\n  name = normalize_propname(name)\n  name_to_index[name] = i\n  puts\"%-40s %3d\" % [name + ',', i]\nend\nputs \"#ifdef USE_UNICODE_PROPERTIES\"\nprops.each do |name|\n  i += 1\n  name = normalize_propname(name)\n  name_to_index[name] = i\n  puts \"%-40s %3d\" % [name + ',', i]\nend\naliases.each_pair do |k, v|\n  next if name_to_index[k]\n  next unless v = name_to_index[v]\n  puts \"%-40s %3d\" % [k + ',', v]\nend\nages.each do |name|\n  i += 1\n  name = \"age=#{name}\"\n  name_to_index[name] = i\n  puts \"%-40s %3d\" % [name + ',', i]\nend\nblocks.each do |name|\n  i += 1\n  name = normalize_propname(name)\n  name_to_index[name] = i\n  puts \"%-40s %3d\" % [name + ',', i]\nend\nputs(<<'__HEREDOC')\n#endif /* USE_UNICODE_PROPERTIES */\n%%\nstatic int\nuniname2ctype(const UChar *name, unsigned int len)\n{\n  const struct uniname2ctype_struct *p = uniname2ctype_p((const char *)name, len);\n  if (p) return p->ctype;\n  return -1;\n}\n__HEREDOC\n"
  },
  {
    "path": "src/Onigmo/win32/Makefile",
    "content": "# Oniguruma Makefile for Win32\n\nproduct_name = oniguruma\n\n# Comment out the next line, if you don't want to use LTCG.\nUSE_LTCG = 1\n\n# Enable the next line, if you want to use a .def file.\n#DEFFILE = onig.def\n\n\nCPPFLAGS = \nCFLAGS = -O2 -nologo /W3\nLDFLAGS =\nLOADLIBES =\nARLIB = lib\nARLIB_FLAGS = -nologo\nARDLL = cl\nARDLL_FLAGS = -nologo -LD $(LINKFLAGS) -dll\nLINKFLAGS = -link -incremental:no -pdb:none\n\nINSTALL = install -c\nCP      = copy\nCC = cl\nRC = rc\nDEFS = -DHAVE_CONFIG_H -DNOT_RUBY -DEXPORT\nRUBYDIR = ..\nPYTHON = python\n\n# Command string to get the version of cl.exe\n_MSC_VER = [for /f %i in ('cmd /c \"(echo _MSC_VER>mscver.c) && ($(CC) /EP mscver.c 2>nul) && del mscver.c\"') do @exit %i]\n\n!if DEFINED(USE_LTCG) && $(USE_LTCG)\n# Use LTCG (Link Time Code Generation).\n# Check if cl.exe is newer than VC++ 7.0 (_MSC_VER >= 1300).\n!if $(_MSC_VER) >= 1300\nCFLAGS = $(CFLAGS) -GL\nARLIB_FLAGS = $(ARLIB_FLAGS) -LTCG\nARDLL_FLAGS = $(ARDLL_FLAGS) -LTCG\n!endif\n!endif\n\n!ifdef DEFFILE\n# Use a .def file to export APIs.\nCFLAGS = $(CFLAGS) /DONIG_EXTERN=extern\nARDLL_FLAGS = $(ARDLL_FLAGS) -def:$(DEFFILE)\n!endif\n\nsubdirs = \n\nlibbase   = onig\nlibname   = $(libbase)_s.lib\ndllname   = $(libbase).dll\ndlllib    = $(libbase).lib\n\nonigheaders  = oniguruma.h regint.h regparse.h regenc.h st.h\nposixheaders = onigposix.h\nheaders      = $(posixheaders) $(onigheaders)\n\nonigobjs     = reggnu.obj regerror.obj regparse.obj regext.obj regcomp.obj \\\n\t       regexec.obj regenc.obj regsyntax.obj regtrav.obj \\\n\t       regversion.obj st.obj\nposixobjs    = regposix.obj regposerr.obj\nlibobjs      = $(onigobjs) $(posixobjs)\n\njp_objs      =  $(encdir)\\euc_jp.obj $(encdir)\\sjis.obj $(encdir)\\cp932.obj\niso8859_objs =  $(encdir)\\iso8859_1.obj  $(encdir)\\iso8859_2.obj \\\n\t\t$(encdir)\\iso8859_3.obj  $(encdir)\\iso8859_4.obj \\\n\t\t$(encdir)\\iso8859_5.obj  $(encdir)\\iso8859_6.obj \\\n\t\t$(encdir)\\iso8859_7.obj  $(encdir)\\iso8859_8.obj \\\n\t\t$(encdir)\\iso8859_9.obj  $(encdir)\\iso8859_10.obj \\\n\t\t$(encdir)\\iso8859_11.obj $(encdir)\\iso8859_13.obj \\\n\t\t$(encdir)\\iso8859_14.obj $(encdir)\\iso8859_15.obj \\\n\t\t$(encdir)\\iso8859_16.obj\n\nencobjs      =  $(encdir)\\ascii.obj $(encdir)\\utf8.obj \\\n\t\t$(encdir)\\unicode.obj \\\n\t\t$(encdir)\\utf16_be.obj $(encdir)\\utf16_le.obj \\\n\t\t$(encdir)\\utf32_be.obj $(encdir)\\utf32_le.obj \\\n\t\t$(jp_objs) $(iso8859_objs) \\\n\t\t$(encdir)\\euc_tw.obj $(encdir)\\euc_kr.obj $(encdir)\\big5.obj \\\n\t\t$(encdir)\\gb18030.obj \\\n\t\t$(encdir)\\koi8_r.obj  \\\n\t\t$(encdir)\\cp1251.obj # $(encdir)\\koi8.obj\n\nresobj       = win32\\onig.res\n\nonigsources  = regerror.c regparse.c regext.c regcomp.c regexec.c regenc.c \\\n\t       regsyntax.c regtrav.c regversion.c reggnu.c st.c\nposixsources = regposix.c regposerr.c\nlibsources   = $(posixsources) $(onigsources)\nrubysources  = $(onigsources)\n\nencdir       = enc\npatchfiles   = re.c.168.patch re.c.181.patch\ndistfiles    = README COPYING HISTORY \\\n\t\tMakefile.in configure.in config.h.in configure \\\n\t\t$(headers) $(libsources) $(patchfiles) \\\n\t\ttest.rb testconv.rb\ntestc        = testc\ntestcu       = testu\ntestp        = testp\n\nmakeargs = $(MFLAGS) CPPFLAGS='$(CPPFLAGS)' CFLAGS='$(CFLAGS)' CC='$(CC)'\n\n.SUFFIXES:\n.SUFFIXES: .obj .c .h .ps .dvi .info .texinfo .res .rc\n\n!ifdef NOBatch\n.c.obj:\n\t$(CC) $(CFLAGS) $(CPPFLAGS) $(DEFS) /I. /I.. /Fo$@ /c $<\n!else\n# batch-mode inference rules\n.c.obj::\n\t$(CC) $(CFLAGS) $(CPPFLAGS) $(DEFS) /I. /I.. /Fo.\\ /c $<\n{$(encdir)\\}.c{$(encdir)\\}.obj::\n\t$(CC) $(CFLAGS) $(CPPFLAGS) $(DEFS) /I. /I.. /Fo$(encdir)\\ /c $<\n!endif\n\n.rc.res:\n\t$(RC) /Fo$@ $<\n\n# targets\ndefault: all\n\nsetup:\n\t$(CP) win32\\config.h config.h\n\t$(CP) win32\\testc.c  testc.c\n\n\nall: $(libname) $(dllname) \n\n$(libname): $(libobjs) $(encobjs)\n\t$(ARLIB) $(ARLIB_FLAGS) -out:$@ $(libobjs) $(encobjs)\n\n$(dllname): $(libobjs) $(encobjs) $(resobj) $(DEFFILE)\n\t$(ARDLL) $(libobjs) $(encobjs) $(resobj) -Fe$@ $(ARDLL_FLAGS)\n\nregparse.obj:  regparse.c $(onigheaders) config.h st.h\nregext.obj:    regext.c   $(onigheaders) config.h\nregtrav.obj:   regtrav.c  $(onigheaders) config.h\nregcomp.obj:   regcomp.c  $(onigheaders) config.h\nregexec.obj:   regexec.c  regint.h regenc.h oniguruma.h config.h\nreggnu.obj:    reggnu.c   regint.h regenc.h oniguruma.h config.h oniggnu.h\nregerror.obj:  regerror.c regint.h regenc.h oniguruma.h config.h\nregenc.obj:    regenc.c   regint.h regenc.h oniguruma.h config.h\nregsyntax.obj: regsyntax.c regint.h regenc.h oniguruma.h config.h\nregversion.obj: regversion.c oniguruma.h config.h\nregposix.obj:  regposix.c $(posixheaders) oniguruma.h config.h\nregposerr.obj: regposerr.c $(posixheaders) config.h\nst.obj:        st.c regint.h oniguruma.h config.h st.h\n\n$(encdir)\\ascii.obj:      $(encdir)\\ascii.c regenc.h config.h\n$(encdir)\\unicode.obj:    $(encdir)\\unicode.c regint.h regenc.h config.h $(encdir)\\unicode\\casefold.h $(encdir)\\unicode\\name2ctype.h\n$(encdir)\\utf8.obj:       $(encdir)\\utf8.c regenc.h config.h\n$(encdir)\\utf16_be.obj:   $(encdir)\\utf16_be.c regenc.h config.h\n$(encdir)\\utf16_le.obj:   $(encdir)\\utf16_le.c regenc.h config.h\n$(encdir)\\utf32_be.obj:   $(encdir)\\utf32_be.c regenc.h config.h\n$(encdir)\\utf32_le.obj:   $(encdir)\\utf32_le.c regenc.h config.h\n$(encdir)\\euc_jp.obj:     $(encdir)\\euc_jp.c regenc.h config.h\n$(encdir)\\euc_tw.obj:     $(encdir)\\euc_tw.c regenc.h config.h\n$(encdir)\\euc_kr.obj:     $(encdir)\\euc_kr.c regenc.h config.h\n$(encdir)\\sjis.obj:       $(encdir)\\sjis.c regenc.h config.h\n$(encdir)\\cp932.obj:      $(encdir)\\cp932.c $(encdir)\\sjis.c regenc.h config.h\n$(encdir)\\iso8859_1.obj:  $(encdir)\\iso8859_1.c regenc.h config.h\n$(encdir)\\iso8859_2.obj:  $(encdir)\\iso8859_2.c regenc.h config.h\n$(encdir)\\iso8859_3.obj:  $(encdir)\\iso8859_3.c regenc.h config.h\n$(encdir)\\iso8859_4.obj:  $(encdir)\\iso8859_4.c regenc.h config.h\n$(encdir)\\iso8859_5.obj:  $(encdir)\\iso8859_5.c regenc.h config.h\n$(encdir)\\iso8859_6.obj:  $(encdir)\\iso8859_6.c regenc.h config.h\n$(encdir)\\iso8859_7.obj:  $(encdir)\\iso8859_7.c regenc.h config.h\n$(encdir)\\iso8859_8.obj:  $(encdir)\\iso8859_8.c regenc.h config.h\n$(encdir)\\iso8859_9.obj:  $(encdir)\\iso8859_9.c regenc.h config.h\n$(encdir)\\iso8859_10.obj: $(encdir)\\iso8859_10.c regenc.h config.h\n$(encdir)\\iso8859_11.obj: $(encdir)\\iso8859_11.c regenc.h config.h\n$(encdir)\\iso8859_13.obj: $(encdir)\\iso8859_13.c regenc.h config.h\n$(encdir)\\iso8859_14.obj: $(encdir)\\iso8859_14.c regenc.h config.h\n$(encdir)\\iso8859_15.obj: $(encdir)\\iso8859_15.c regenc.h config.h\n$(encdir)\\iso8859_16.obj: $(encdir)\\iso8859_16.c regenc.h config.h\n$(encdir)\\koi8.obj:       $(encdir)\\koi8.c   regenc.h config.h\n$(encdir)\\koi8_r.obj:     $(encdir)\\koi8_r.c regenc.h config.h\n$(encdir)\\cp1251.obj:     $(encdir)\\cp1251.c regenc.h config.h\n$(encdir)\\big5.obj:       $(encdir)\\big5.c   regenc.h config.h\n$(encdir)\\gb18030.obj:    $(encdir)\\gb18030.c   regenc.h config.h\n\nwin32\\onig.res: win32\\onig.rc\n\n\n# Ruby test\nrtest:\n\t$(RUBYDIR)\\win32\\ruby -w -Ke test.rb\n\n# C library test\nctest: $(testc)\n\t.\\$(testc)\n\n# POSIX C library test\nptest: $(testp)\n\t.\\$(testp)\n\n$(testc): $(testc).c $(libname)\n\t$(CC) -nologo -o $(testc) -DONIG_EXTERN=extern $(testc).c $(libname)\n\n$(testp): $(testc).c $(dlllib)\n\t$(CC) -nologo -DPOSIX_TEST -o $(testp) $(testc).c $(dlllib)\n\n#$(testc)u.c: test.rb testconvu.rb\n#\truby -Ke testconvu.rb test.rb > $@\n\n$(testcu): $(testcu).c $(libname)\n\t$(CC) -nologo -o $(testcu) -DONIG_EXTERN=extern $(testcu).c $(libname)\n\n$(libbase).def: win32\\makedef.py oniguruma.h regenc.h oniggnu.h onigposix.h\n\t$(PYTHON) win32\\makedef.py > $@\n\nclean:\n\tdel *.obj $(encdir)\\*.obj *.lib *.exp *.dll $(testp).exe $(testc).exe $(testc).obj $(testcu).exe $(testcu).obj win32\\*.res\n\n\n# backup file suffix\nSORIG = ruby_orig\n\n# ruby 1.9 source update\n19:\n\t$(CP) regerror.c    $(RUBYDIR)\n\t$(CP) regparse.c    $(RUBYDIR)\n\t$(CP) regcomp.c     $(RUBYDIR)\n\t$(CP) regexec.c     $(RUBYDIR)\n\t$(CP) regenc.c      $(RUBYDIR)\n\t$(CP) regint.h      $(RUBYDIR)\n\t$(CP) regparse.h    $(RUBYDIR)\n\t$(CP) regenc.h      $(RUBYDIR)\n\t$(CP) oniguruma.h   $(RUBYDIR)\n\t$(CP) enc\\ascii.c   $(RUBYDIR)\n\t$(CP) enc\\utf8.c    $(RUBYDIR)\n\t$(CP) enc\\euc_jp.c  $(RUBYDIR)\n\t$(CP) enc\\sjis.c    $(RUBYDIR)\n\t$(CP) enc\\unicode.c $(RUBYDIR)\n\n\nsamples: all\n\t$(CC) $(CFLAGS) -I. -o simple  sample\\simple.c  $(dlllib)\n\t$(CC) $(CFLAGS) -I. -o posix   sample\\posix.c   $(dlllib)\n\t$(CC) $(CFLAGS) -I. -o names   sample\\names.c   $(dlllib)\n\t$(CC) $(CFLAGS) -I. -o listcap sample\\listcap.c $(dlllib)\n\t$(CC) $(CFLAGS) -I. -o sql     sample\\sql.c     $(dlllib)\n\t$(CC) $(CFLAGS) -I. -o encode  sample\\encode.c  $(dlllib)\n\t$(CC) $(CFLAGS) -I. -o syntax  sample\\syntax.c  $(dlllib)\n\t$(CC) $(CFLAGS) -I. -o crnl    sample\\crnl.c    $(dlllib)\n"
  },
  {
    "path": "src/Onigmo/win32/config.h",
    "content": "#define STDC_HEADERS 1\n#define HAVE_SYS_TYPES_H 1\n#define HAVE_SYS_STAT_H 1\n#define HAVE_STDLIB_H 1\n#define HAVE_STRING_H 1\n#define HAVE_MEMORY_H 1\n#define HAVE_FLOAT_H 1\n#define HAVE_OFF_T 1\n#define SIZEOF_INT 4\n#define SIZEOF_SHORT 2\n#define SIZEOF_LONG 4\n#define SIZEOF_LONG_LONG 0\n#define SIZEOF___INT64 8\n#define SIZEOF_OFF_T 4\n#define SIZEOF_VOIDP 4\n#define SIZEOF_FLOAT 4\n#define SIZEOF_DOUBLE 8\n#define HAVE_PROTOTYPES 1\n#define TOKEN_PASTE(x,y) x##y\n#define HAVE_STDARG_PROTOTYPES 1\n#ifndef NORETURN\n#if _MSC_VER > 1100\n#define NORETURN(x) __declspec(noreturn) x\n#else\n#define NORETURN(x) x\n#endif\n#endif\n#define HAVE_DECL_SYS_NERR 1\n#define HAVE_LIMITS_H 1\n#define HAVE_FCNTL_H 1\n#define HAVE_SYS_UTIME_H 1\n#if _MSC_VER >= 1600\n#define HAVE_STDINT_H 1\n#endif\n#define uid_t int\n#define gid_t int\n#define HAVE_STRUCT_STAT_ST_RDEV 1\n#define HAVE_ST_RDEV 1\n#define GETGROUPS_T int\n#define RETSIGTYPE void\n#define HAVE_ALLOCA 1\n#define HAVE_DUP2 1\n#define HAVE_MEMCMP 1\n#define HAVE_MEMMOVE 1\n#define HAVE_MKDIR 1\n#define HAVE_STRCASECMP 1\n#define HAVE_STRNCASECMP 1\n#define HAVE_STRERROR 1\n#define HAVE_STRFTIME 1\n#define HAVE_STRCHR 1\n#define HAVE_STRSTR 1\n#define HAVE_STRTOD 1\n#define HAVE_STRTOL 1\n#define HAVE_STRTOUL 1\n#define HAVE_FLOCK 1\n#define HAVE_VSNPRINTF 1\n#define HAVE_FINITE 1\n#define HAVE_FMOD 1\n#define HAVE_FREXP 1\n#define HAVE_HYPOT 1\n#define HAVE_MODF 1\n#define HAVE_WAITPID 1\n#define HAVE_CHSIZE 1\n#define HAVE_TIMES 1\n#define HAVE__SETJMP 1\n#define HAVE_TELLDIR 1\n#define HAVE_SEEKDIR 1\n#define HAVE_MKTIME 1\n#define HAVE_COSH 1\n#define HAVE_SINH 1\n#define HAVE_TANH 1\n#define HAVE_EXECVE 1\n#define HAVE_TZNAME 1\n#define HAVE_DAYLIGHT 1\n#define SETPGRP_VOID 1\n#define inline __inline\n#define NEED_IO_SEEK_BETWEEN_RW 1\n#define RSHIFT(x,y) ((x)>>(int)y)\n#define FILE_COUNT _cnt\n#define FILE_READPTR _ptr\n#define DEFAULT_KCODE KCODE_NONE\n#define DLEXT \".so\"\n#define DLEXT2 \".dll\"\n"
  },
  {
    "path": "src/Onigmo/win32/makedef.py",
    "content": "#!/usr/bin/env python\n\nfrom __future__ import print_function\nimport re\n\nheader_files = (\n    \"oniguruma.h\", \"regenc.h\",\n    \"oniggnu.h\", \"onigposix.h\"\n)\n\nexclude_symbols = (\n    \"OnigEncodingKOI8\",\n\n    # USE_UPPER_CASE_TABLE\n    \"OnigEncAsciiToUpperCaseTable\",\n    \"OnigEncISO_8859_1_ToUpperCaseTable\",\n\n    # USE_RECOMPILE_API\n    \"onig_recompile\",\n    \"onig_recompile_deluxe\",\n    \"re_recompile_pattern\",\n\n    # USE_VARIABLE_META_CHARS\n    #\"onig_set_meta_char\",\n\n    # USE_CAPTURE_HISTORY\n    #\"onig_get_capture_tree\",\n)\n\nsymbols = set()\n\nrx1 = re.compile(\"(ONIG_EXTERN.*)$\")\nrx2 = re.compile(r\"(\\w+)( +PV?_\\(\\(.*\\)\\)|\\[.*\\])?;\\s*(/\\*.*\\*/)?$\")\nfor filename in header_files:\n    with open(filename, \"r\") as f:\n        while True:\n            line = f.readline()\n            if not line:\n                break\n            m = rx1.match(line)\n            if not m:\n                continue\n            s = m.group(1)\n            if s[-1] != ';':\n                s += ' ' + f.readline()\n            m2 = rx2.search(s)\n            if m2 and (not m2.group(1) in exclude_symbols):\n                symbols.add(m2.group(1))\n\nprint('EXPORTS')\nfor s in sorted(symbols):\n    print('\\t' + s)\n"
  },
  {
    "path": "src/Onigmo/win32/onig.rc",
    "content": "/**********************************************************************\n  onig.rc - Onigmo (Oniguruma-mod) (regular expression library)\n**********************************************************************/\n/*-\n * Copyright (c) 2011-2012  K.Takata  <kentkt AT csc DOT jp>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include <windows.h>\n#include \"oniguruma.h\"\n\n#define TOSTR_(a)\t#a\n#define ONIG_VERSION_TOSTR_(a,b,c)\t\\\n\tTOSTR_(a) \".\" TOSTR_(b) \".\" TOSTR_(c)\n#define ONIG_VERSION_STRING\t\\\n\tONIG_VERSION_TOSTR_(ONIGURUMA_VERSION_MAJOR, ONIGURUMA_VERSION_MINOR, ONIGURUMA_VERSION_TEENY)\n\n\n/////////////////////////////////////////////////////////////////////////////\n// English resources\n\n#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\n#ifdef _WIN32\nLANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US\n#pragma code_page(1252)\n#endif //_WIN32\n\n/////////////////////////////////////////////////////////////////////////////\n//\n// Version\n//\n\nVS_VERSION_INFO VERSIONINFO\n FILEVERSION ONIGURUMA_VERSION_MAJOR,ONIGURUMA_VERSION_MINOR,ONIGURUMA_VERSION_TEENY,0\n PRODUCTVERSION ONIGURUMA_VERSION_MAJOR,ONIGURUMA_VERSION_MINOR,ONIGURUMA_VERSION_TEENY,0\n FILEFLAGSMASK 0x3fL\n#ifdef _DEBUG\n FILEFLAGS 0x1L\n#else\n FILEFLAGS 0x0L\n#endif\n FILEOS 0x40004L\n FILETYPE 0x2L\n FILESUBTYPE 0x0L\nBEGIN\n    BLOCK \"StringFileInfo\"\n    BEGIN\n        BLOCK \"040904b0\"\n        BEGIN\n            VALUE \"Comments\", \"\\0\"\n            VALUE \"CompanyName\", \" \\0\"\n            VALUE \"FileDescription\", \"Onigmo (Oniguruma-mod) (regular expression library)\\0\"\n            VALUE \"FileVersion\", ONIG_VERSION_STRING \"\\0\"\n            VALUE \"InternalName\", \"onig.dll\\0\"\n            VALUE \"LegalCopyright\", \"Copyright (C) 2002-2009 K.Kosako, 2011-2012 K.Takata\\0\"\n            VALUE \"LegalTrademarks\", \"\\0\"\n            VALUE \"OriginalFilename\", \"onig.dll\\0\"\n            VALUE \"PrivateBuild\", \"\\0\"\n            VALUE \"ProductName\", \"Onigmo (Oniguruma-mod)\\0\"\n            VALUE \"ProductVersion\", ONIG_VERSION_STRING \"\\0\"\n            VALUE \"SpecialBuild\", \"\\0\"\n        END\n    END\n    BLOCK \"VarFileInfo\"\n    BEGIN\n        VALUE \"Translation\", 0x0409, 1200\n    END\nEND\n\n\n\n#endif    // English resources\n/////////////////////////////////////////////////////////////////////////////\n"
  },
  {
    "path": "src/Onigmo/win32/testc.c",
    "content": "/*\n * This program was generated by testconv.rb.\n */\n#include \"config.h\"\n#ifdef ONIG_ESCAPE_UCHAR_COLLISION\n#undef ONIG_ESCAPE_UCHAR_COLLISION\n#endif\n#include <stdio.h>\n\n#ifdef POSIX_TEST\n#include \"onigposix.h\"\n#else\n#include \"oniguruma.h\"\n#endif\n\n#ifdef HAVE_STRING_H\n# include <string.h>\n#else\n# include <strings.h>\n#endif\n\n#define SLEN(s)  strlen(s)\n\nstatic int nsucc  = 0;\nstatic int nfail  = 0;\nstatic int nerror = 0;\n\nstatic FILE* err_file;\n\n#ifndef POSIX_TEST\nstatic OnigRegion* region;\n#endif\n\nstatic void xx(char* pattern, char* str, int from, int to, int mem, int not)\n{\n  OnigPosition r;\n\n#ifdef POSIX_TEST\n  regex_t reg;\n  char buf[200];\n  regmatch_t pmatch[25];\n\n  r = regcomp(&reg, pattern, REG_EXTENDED | REG_NEWLINE);\n  if (r) {\n    regerror(r, &reg, buf, sizeof(buf));\n    fprintf(err_file, \"ERROR: %s\\n\", buf);\n    nerror++;\n    return ;\n  }\n\n  r = regexec(&reg, str, reg.re_nsub + 1, pmatch, 0);\n  if (r != 0 && r != REG_NOMATCH) {\n    regerror(r, &reg, buf, sizeof(buf));\n    fprintf(err_file, \"ERROR: %s\\n\", buf);\n    nerror++;\n    return ;\n  }\n\n  if (r == REG_NOMATCH) {\n    if (not) {\n      fprintf(stdout, \"OK(N): /%s/ '%s'\\n\", pattern, str);\n      nsucc++;\n    }\n    else {\n      fprintf(stdout, \"FAIL: /%s/ '%s'\\n\", pattern, str);\n      nfail++;\n    }\n  }\n  else {\n    if (not) {\n      fprintf(stdout, \"FAIL(N): /%s/ '%s'\\n\", pattern, str);\n      nfail++;\n    }\n    else {\n      if (pmatch[mem].rm_so == from && pmatch[mem].rm_eo == to) {\n        fprintf(stdout, \"OK: /%s/ '%s'\\n\", pattern, str);\n        nsucc++;\n      }\n      else {\n        fprintf(stdout, \"FAIL: /%s/ '%s' %d-%d : %d-%d\\n\", pattern, str,\n\t        from, to, pmatch[mem].rm_so, pmatch[mem].rm_eo);\n        nfail++;\n      }\n    }\n  }\n  regfree(&reg);\n\n#else\n  regex_t* reg;\n  OnigErrorInfo einfo;\n  OnigSyntaxType syn = *ONIG_SYNTAX_DEFAULT;\n  OnigIterator it = {onig_default_charat, str};\n\n  /* ONIG_OPTION_OFF(syn.options, ONIG_OPTION_ASCII_RANGE); */\n\n  r = onig_new(&reg, (UChar* )pattern, (UChar* )(pattern + SLEN(pattern)),\n\t       ONIG_OPTION_DEFAULT, ONIG_ENCODING_SJIS, &syn, &einfo);\n  if (r) {\n    char s[ONIG_MAX_ERROR_MESSAGE_LEN];\n    onig_error_code_to_str((UChar* )s, r, &einfo);\n    fprintf(err_file, \"ERROR: %s\\n\", s);\n    nerror++;\n    return ;\n  }\n\n  r = onig_search(&it, reg, 0, SLEN(str),\n\t\t  0, SLEN(str),\n\t\t  region, ONIG_OPTION_NONE);\n  if (r < ONIG_MISMATCH) {\n    char s[ONIG_MAX_ERROR_MESSAGE_LEN];\n    onig_error_code_to_str((UChar* )s, r);\n    fprintf(err_file, \"ERROR: %s\\n\", s);\n    nerror++;\n    return ;\n  }\n\n  if (r == ONIG_MISMATCH) {\n    if (not) {\n      fprintf(stdout, \"OK(N): /%s/ '%s'\\n\", pattern, str);\n      nsucc++;\n    }\n    else {\n      fprintf(stdout, \"FAIL: /%s/ '%s'\\n\", pattern, str);\n      nfail++;\n    }\n  }\n  else {\n    if (not) {\n      fprintf(stdout, \"FAIL(N): /%s/ '%s'\\n\", pattern, str);\n      nfail++;\n    }\n    else {\n      if (region->beg[mem] == from && region->end[mem] == to) {\n        fprintf(stdout, \"OK: /%s/ '%s'\\n\", pattern, str);\n        nsucc++;\n      }\n      else {\n        fprintf(stdout, \"FAIL: /%s/ '%s' %d-%d : %d-%d\\n\", pattern, str,\n\t        from, to, region->beg[mem], region->end[mem]);\n        nfail++;\n      }\n    }\n  }\n  onig_free(reg);\n#endif\n}\n\nstatic void x2(char* pattern, char* str, int from, int to)\n{\n  xx(pattern, str, from, to, 0, 0);\n}\n\nstatic void x3(char* pattern, char* str, int from, int to, int mem)\n{\n  xx(pattern, str, from, to, mem, 0);\n}\n\nstatic void n(char* pattern, char* str)\n{\n  xx(pattern, str, 0, 0, 0, 1);\n}\n\nextern int main(int argc, char* argv[])\n{\n  err_file = stdout;\n\n#ifdef POSIX_TEST\n  reg_set_encoding(REG_POSIX_ENCODING_SJIS);\n#else\n  region = onig_region_new();\n#endif\n\n  x2(\"\", \"\", 0, 0);\n  x2(\"^\", \"\", 0, 0);\n  x2(\"$\", \"\", 0, 0);\n  x2(\"\\\\G\", \"\", 0, 0);\n  x2(\"\\\\A\", \"\", 0, 0);\n  x2(\"\\\\Z\", \"\", 0, 0);\n  x2(\"\\\\z\", \"\", 0, 0);\n  x2(\"^$\", \"\", 0, 0);\n  x2(\"\\\\ca\", \"\\001\", 0, 1);\n  x2(\"\\\\C-b\", \"\\002\", 0, 1);\n  x2(\"\\\\c\\\\\\\\\", \"\\034\", 0, 1);\n  x2(\"q[\\\\c\\\\\\\\]\", \"q\\034\", 0, 2);\n  x2(\"\", \"a\", 0, 0);\n  x2(\"a\", \"a\", 0, 1);\n  x2(\"\\\\x61\", \"a\", 0, 1);\n  x2(\"aa\", \"aa\", 0, 2);\n  x2(\"aaa\", \"aaa\", 0, 3);\n  x2(\"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\", \"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\", 0, 35);\n  x2(\"ab\", \"ab\", 0, 2);\n  x2(\"b\", \"ab\", 1, 2);\n  x2(\"bc\", \"abc\", 1, 3);\n  x2(\"(?i:#RET#)\", \"#INS##RET#\", 5, 10);\n  x2(\"\\\\17\", \"\\017\", 0, 1);\n  x2(\"\\\\x1f\", \"\\x1f\", 0, 1);\n  x2(\"a(?#....\\\\\\\\JJJJ)b\", \"ab\", 0, 2);\n  x2(\"(?x)  G (o O(?-x)oO) g L\", \"GoOoOgLe\", 0, 7);\n  x2(\".\", \"a\", 0, 1);\n  n(\".\", \"\");\n  x2(\"..\", \"ab\", 0, 2);\n  x2(\"\\\\w\", \"e\", 0, 1);\n  n(\"\\\\W\", \"e\");\n  x2(\"\\\\s\", \" \", 0, 1);\n  x2(\"\\\\S\", \"b\", 0, 1);\n  x2(\"\\\\d\", \"4\", 0, 1);\n  n(\"\\\\D\", \"4\");\n  x2(\"\\\\b\", \"z \", 0, 0);\n  x2(\"\\\\b\", \" z\", 1, 1);\n  x2(\"\\\\B\", \"zz \", 1, 1);\n  x2(\"\\\\B\", \"z \", 2, 2);\n  x2(\"\\\\B\", \" z\", 0, 0);\n  x2(\"[ab]\", \"b\", 0, 1);\n  n(\"[ab]\", \"c\");\n  x2(\"[a-z]\", \"t\", 0, 1);\n  n(\"[^a]\", \"a\");\n  x2(\"[^a]\", \"\\n\", 0, 1);\n  x2(\"[]]\", \"]\", 0, 1);\n  n(\"[^]]\", \"]\");\n  x2(\"[\\\\^]+\", \"0^^1\", 1, 3);\n  x2(\"[b-]\", \"b\", 0, 1);\n  x2(\"[b-]\", \"-\", 0, 1);\n  x2(\"[\\\\w]\", \"z\", 0, 1);\n  n(\"[\\\\w]\", \" \");\n  x2(\"[\\\\W]\", \"b$\", 1, 2);\n  x2(\"[\\\\d]\", \"5\", 0, 1);\n  n(\"[\\\\d]\", \"e\");\n  x2(\"[\\\\D]\", \"t\", 0, 1);\n  n(\"[\\\\D]\", \"3\");\n  x2(\"[\\\\s]\", \" \", 0, 1);\n  n(\"[\\\\s]\", \"a\");\n  x2(\"[\\\\S]\", \"b\", 0, 1);\n  n(\"[\\\\S]\", \" \");\n  x2(\"[\\\\w\\\\d]\", \"2\", 0, 1);\n  n(\"[\\\\w\\\\d]\", \" \");\n  x2(\"[[:upper:]]\", \"B\", 0, 1);\n  x2(\"[*[:xdigit:]+]\", \"+\", 0, 1);\n  x2(\"[*[:xdigit:]+]\", \"GHIKK-9+*\", 6, 7);\n  x2(\"[*[:xdigit:]+]\", \"-@^+\", 3, 4);\n  n(\"[[:upper]]\", \"A\");\n  x2(\"[[:upper]]\", \":\", 0, 1);\n  x2(\"[\\\\044-\\\\047]\", \"\\046\", 0, 1);\n  x2(\"[\\\\x5a-\\\\x5c]\", \"\\x5b\", 0, 1);\n  x2(\"[\\\\x6A-\\\\x6D]\", \"\\x6c\", 0, 1);\n  n(\"[\\\\x6A-\\\\x6D]\", \"\\x6E\");\n  n(\"^[0-9A-F]+ 0+ UNDEF \", \"75F 00000000 SECT14A notype ()    External    | _rb_apply\");\n  x2(\"[\\\\[]\", \"[\", 0, 1);\n  x2(\"[\\\\]]\", \"]\", 0, 1);\n  x2(\"[&]\", \"&\", 0, 1);\n  x2(\"[[ab]]\", \"b\", 0, 1);\n  x2(\"[[ab]c]\", \"c\", 0, 1);\n  n(\"[[^a]]\", \"a\");\n  n(\"[^[a]]\", \"a\");\n  x2(\"[[ab]&&bc]\", \"b\", 0, 1);\n  n(\"[[ab]&&bc]\", \"a\");\n  n(\"[[ab]&&bc]\", \"c\");\n  x2(\"[a-z&&b-y&&c-x]\", \"w\", 0, 1);\n  n(\"[^a-z&&b-y&&c-x]\", \"w\");\n  x2(\"[[^a&&a]&&a-z]\", \"b\", 0, 1);\n  n(\"[[^a&&a]&&a-z]\", \"a\");\n  x2(\"[[^a-z&&bcdef]&&[^c-g]]\", \"h\", 0, 1);\n  n(\"[[^a-z&&bcdef]&&[^c-g]]\", \"c\");\n  x2(\"[^[^abc]&&[^cde]]\", \"c\", 0, 1);\n  x2(\"[^[^abc]&&[^cde]]\", \"e\", 0, 1);\n  n(\"[^[^abc]&&[^cde]]\", \"f\");\n  x2(\"[a-&&-a]\", \"-\", 0, 1);\n  n(\"[a\\\\-&&\\\\-a]\", \"&\");\n  n(\"\\\\wabc\", \" abc\");\n  x2(\"a\\\\Wbc\", \"a bc\", 0, 4);\n  x2(\"a.b.c\", \"aabbc\", 0, 5);\n  x2(\".\\\\wb\\\\W..c\", \"abb bcc\", 0, 7);\n  x2(\"\\\\s\\\\wzzz\", \" zzzz\", 0, 5);\n  x2(\"aa.b\", \"aabb\", 0, 4);\n  n(\".a\", \"ab\");\n  x2(\".a\", \"aa\", 0, 2);\n  x2(\"^a\", \"a\", 0, 1);\n  x2(\"^a$\", \"a\", 0, 1);\n  x2(\"^\\\\w$\", \"a\", 0, 1);\n  n(\"^\\\\w$\", \" \");\n  x2(\"^\\\\wab$\", \"zab\", 0, 3);\n  x2(\"^\\\\wabcdef$\", \"zabcdef\", 0, 7);\n  x2(\"^\\\\w...def$\", \"zabcdef\", 0, 7);\n  x2(\"\\\\w\\\\w\\\\s\\\\Waaa\\\\d\", \"aa  aaa4\", 0, 8);\n  x2(\"\\\\A\\\\Z\", \"\", 0, 0);\n  x2(\"\\\\Axyz\", \"xyz\", 0, 3);\n  x2(\"xyz\\\\Z\", \"xyz\", 0, 3);\n  x2(\"xyz\\\\z\", \"xyz\", 0, 3);\n  x2(\"a\\\\Z\", \"a\", 0, 1);\n  x2(\"\\\\Gaz\", \"az\", 0, 2);\n  n(\"\\\\Gz\", \"bza\");\n  n(\"az\\\\G\", \"az\");\n  n(\"az\\\\A\", \"az\");\n  n(\"a\\\\Az\", \"az\");\n  x2(\"\\\\^\\\\$\", \"^$\", 0, 2);\n  x2(\"^x?y\", \"xy\", 0, 2);\n  x2(\"^(x?y)\", \"xy\", 0, 2);\n  x2(\"\\\\w\", \"_\", 0, 1);\n  n(\"\\\\W\", \"_\");\n  x2(\"(?=z)z\", \"z\", 0, 1);\n  n(\"(?=z).\", \"a\");\n  x2(\"(?!z)a\", \"a\", 0, 1);\n  n(\"(?!z)a\", \"z\");\n  x2(\"(?i:a)\", \"a\", 0, 1);\n  x2(\"(?i:a)\", \"A\", 0, 1);\n  x2(\"(?i:A)\", \"a\", 0, 1);\n  n(\"(?i:A)\", \"b\");\n  x2(\"(?i:[A-Z])\", \"a\", 0, 1);\n  x2(\"(?i:[f-m])\", \"H\", 0, 1);\n  x2(\"(?i:[f-m])\", \"h\", 0, 1);\n  n(\"(?i:[f-m])\", \"e\");\n  x2(\"(?i:[A-c])\", \"D\", 0, 1);\n  n(\"(?i:[^a-z])\", \"A\");\n  n(\"(?i:[^a-z])\", \"a\");\n  x2(\"(?i:[!-k])\", \"Z\", 0, 1);\n  x2(\"(?i:[!-k])\", \"7\", 0, 1);\n  x2(\"(?i:[T-}])\", \"b\", 0, 1);\n  x2(\"(?i:[T-}])\", \"{\", 0, 1);\n  x2(\"(?i:\\\\?a)\", \"?A\", 0, 2);\n  x2(\"(?i:\\\\*A)\", \"*a\", 0, 2);\n  n(\".\", \"\\n\");\n  x2(\"(?m:.)\", \"\\n\", 0, 1);\n  x2(\"(?m:a.)\", \"a\\n\", 0, 2);\n  x2(\"(?m:.b)\", \"a\\nb\", 1, 3);\n  x2(\".*abc\", \"dddabdd\\nddabc\", 8, 13);\n  x2(\"(?m:.*abc)\", \"dddabddabc\", 0, 10);\n  n(\"(?i)(?-i)a\", \"A\");\n  n(\"(?i)(?-i:a)\", \"A\");\n  x2(\"a?\", \"\", 0, 0);\n  x2(\"a?\", \"b\", 0, 0);\n  x2(\"a?\", \"a\", 0, 1);\n  x2(\"a*\", \"\", 0, 0);\n  x2(\"a*\", \"a\", 0, 1);\n  x2(\"a*\", \"aaa\", 0, 3);\n  x2(\"a*\", \"baaaa\", 0, 0);\n  n(\"a+\", \"\");\n  x2(\"a+\", \"a\", 0, 1);\n  x2(\"a+\", \"aaaa\", 0, 4);\n  x2(\"a+\", \"aabbb\", 0, 2);\n  x2(\"a+\", \"baaaa\", 1, 5);\n  x2(\".?\", \"\", 0, 0);\n  x2(\".?\", \"f\", 0, 1);\n  x2(\".?\", \"\\n\", 0, 0);\n  x2(\".*\", \"\", 0, 0);\n  x2(\".*\", \"abcde\", 0, 5);\n  x2(\".+\", \"z\", 0, 1);\n  x2(\".+\", \"zdswer\\n\", 0, 6);\n  x2(\"(.*)a\\\\1f\", \"babfbac\", 0, 4);\n  x2(\"(.*)a\\\\1f\", \"bacbabf\", 3, 7);\n  x2(\"((.*)a\\\\2f)\", \"bacbabf\", 3, 7);\n  x2(\"(.*)a\\\\1f\", \"baczzzzzz\\nbazz\\nzzzzbabf\", 19, 23);\n  x2(\"a|b\", \"a\", 0, 1);\n  x2(\"a|b\", \"b\", 0, 1);\n  x2(\"|a\", \"a\", 0, 0);\n  x2(\"(|a)\", \"a\", 0, 0);\n  x2(\"ab|bc\", \"ab\", 0, 2);\n  x2(\"ab|bc\", \"bc\", 0, 2);\n  x2(\"z(?:ab|bc)\", \"zbc\", 0, 3);\n  x2(\"a(?:ab|bc)c\", \"aabc\", 0, 4);\n  x2(\"ab|(?:ac|az)\", \"az\", 0, 2);\n  x2(\"a|b|c\", \"dc\", 1, 2);\n  x2(\"a|b|cd|efg|h|ijk|lmn|o|pq|rstuvwx|yz\", \"pqr\", 0, 2);\n  n(\"a|b|cd|efg|h|ijk|lmn|o|pq|rstuvwx|yz\", \"mn\");\n  x2(\"a|^z\", \"ba\", 1, 2);\n  x2(\"a|^z\", \"za\", 0, 1);\n  x2(\"a|\\\\Gz\", \"bza\", 2, 3);\n  x2(\"a|\\\\Gz\", \"za\", 0, 1);\n  x2(\"a|\\\\Az\", \"bza\", 2, 3);\n  x2(\"a|\\\\Az\", \"za\", 0, 1);\n  x2(\"a|b\\\\Z\", \"ba\", 1, 2);\n  x2(\"a|b\\\\Z\", \"b\", 0, 1);\n  x2(\"a|b\\\\z\", \"ba\", 1, 2);\n  x2(\"a|b\\\\z\", \"b\", 0, 1);\n  x2(\"\\\\w|\\\\s\", \" \", 0, 1);\n  n(\"\\\\w|\\\\w\", \" \");\n  x2(\"\\\\w|%\", \"%\", 0, 1);\n  x2(\"\\\\w|[&$]\", \"&\", 0, 1);\n  x2(\"[b-d]|[^e-z]\", \"a\", 0, 1);\n  x2(\"(?:a|[c-f])|bz\", \"dz\", 0, 1);\n  x2(\"(?:a|[c-f])|bz\", \"bz\", 0, 2);\n  x2(\"abc|(?=zz)..f\", \"zzf\", 0, 3);\n  x2(\"abc|(?!zz)..f\", \"abf\", 0, 3);\n  x2(\"(?=za)..a|(?=zz)..a\", \"zza\", 0, 3);\n  n(\"(?>a|abd)c\", \"abdc\");\n  x2(\"(?>abd|a)c\", \"abdc\", 0, 4);\n  x2(\"a?|b\", \"a\", 0, 1);\n  x2(\"a?|b\", \"b\", 0, 0);\n  x2(\"a?|b\", \"\", 0, 0);\n  x2(\"a*|b\", \"aa\", 0, 2);\n  x2(\"a*|b*\", \"ba\", 0, 0);\n  x2(\"a*|b*\", \"ab\", 0, 1);\n  x2(\"a+|b*\", \"\", 0, 0);\n  x2(\"a+|b*\", \"bbb\", 0, 3);\n  x2(\"a+|b*\", \"abbb\", 0, 1);\n  n(\"a+|b+\", \"\");\n  x2(\"(a|b)?\", \"b\", 0, 1);\n  x2(\"(a|b)*\", \"ba\", 0, 2);\n  x2(\"(a|b)+\", \"bab\", 0, 3);\n  x2(\"(ab|ca)+\", \"caabbc\", 0, 4);\n  x2(\"(ab|ca)+\", \"aabca\", 1, 5);\n  x2(\"(ab|ca)+\", \"abzca\", 0, 2);\n  x2(\"(a|bab)+\", \"ababa\", 0, 5);\n  x2(\"(a|bab)+\", \"ba\", 1, 2);\n  x2(\"(a|bab)+\", \"baaaba\", 1, 4);\n  x2(\"(?:a|b)(?:a|b)\", \"ab\", 0, 2);\n  x2(\"(?:a*|b*)(?:a*|b*)\", \"aaabbb\", 0, 3);\n  x2(\"(?:a*|b*)(?:a+|b+)\", \"aaabbb\", 0, 6);\n  x2(\"(?:a+|b+){2}\", \"aaabbb\", 0, 6);\n  x2(\"h{0,}\", \"hhhh\", 0, 4);\n  x2(\"(?:a+|b+){1,2}\", \"aaabbb\", 0, 6);\n  n(\"ax{2}*a\", \"0axxxa1\");\n  n(\"a.{0,2}a\", \"0aXXXa0\");\n  n(\"a.{0,2}?a\", \"0aXXXa0\");\n  n(\"a.{0,2}?a\", \"0aXXXXa0\");\n  x2(\"^a{2,}?a$\", \"aaa\", 0, 3);\n  x2(\"^[a-z]{2,}?$\", \"aaa\", 0, 3);\n  x2(\"(?:a+|\\\\Ab*)cc\", \"cc\", 0, 2);\n  n(\"(?:a+|\\\\Ab*)cc\", \"abcc\");\n  x2(\"(?:^a+|b+)*c\", \"aabbbabc\", 6, 8);\n  x2(\"(?:^a+|b+)*c\", \"aabbbbc\", 0, 7);\n  x2(\"a|(?i)c\", \"C\", 0, 1);\n  x2(\"(?i)c|a\", \"C\", 0, 1);\n  x2(\"(?i)c|a\", \"A\", 0, 1);\n  x2(\"(?i:c)|a\", \"C\", 0, 1);\n  n(\"(?i:c)|a\", \"A\");\n  x2(\"[abc]?\", \"abc\", 0, 1);\n  x2(\"[abc]*\", \"abc\", 0, 3);\n  x2(\"[^abc]*\", \"abc\", 0, 0);\n  n(\"[^abc]+\", \"abc\");\n  x2(\"a?\\?\", \"aaa\", 0, 0);\n  x2(\"ba?\\?b\", \"bab\", 0, 3);\n  x2(\"a*?\", \"aaa\", 0, 0);\n  x2(\"ba*?\", \"baa\", 0, 1);\n  x2(\"ba*?b\", \"baab\", 0, 4);\n  x2(\"a+?\", \"aaa\", 0, 1);\n  x2(\"ba+?\", \"baa\", 0, 2);\n  x2(\"ba+?b\", \"baab\", 0, 4);\n  x2(\"(?:a?)?\\?\", \"a\", 0, 0);\n  x2(\"(?:a?\\?)?\", \"a\", 0, 0);\n  x2(\"(?:a?)+?\", \"aaa\", 0, 1);\n  x2(\"(?:a+)?\\?\", \"aaa\", 0, 0);\n  x2(\"(?:a+)?\\?b\", \"aaab\", 0, 4);\n  x2(\"(?:ab)?{2}\", \"\", 0, 0);\n  x2(\"(?:ab)?{2}\", \"ababa\", 0, 4);\n  x2(\"(?:ab)*{0}\", \"ababa\", 0, 0);\n  x2(\"(?:ab){3,}\", \"abababab\", 0, 8);\n  n(\"(?:ab){3,}\", \"abab\");\n  x2(\"(?:ab){2,4}\", \"ababab\", 0, 6);\n  x2(\"(?:ab){2,4}\", \"ababababab\", 0, 8);\n  x2(\"(?:ab){2,4}?\", \"ababababab\", 0, 4);\n  x2(\"(?:ab){,}\", \"ab{,}\", 0, 5);\n  x2(\"(?:abc)+?{2}\", \"abcabcabc\", 0, 6);\n  x2(\"(?:X*)(?i:xa)\", \"XXXa\", 0, 4);\n  x2(\"(d+)([^abc]z)\", \"dddz\", 0, 4);\n  x2(\"([^abc]*)([^abc]z)\", \"dddz\", 0, 4);\n  x2(\"(\\\\w+)(\\\\wz)\", \"dddz\", 0, 4);\n  x3(\"(a)\", \"a\", 0, 1, 1);\n  x3(\"(ab)\", \"ab\", 0, 2, 1);\n  x2(\"((ab))\", \"ab\", 0, 2);\n  x3(\"((ab))\", \"ab\", 0, 2, 1);\n  x3(\"((ab))\", \"ab\", 0, 2, 2);\n  x3(\"((((((((((((((((((((ab))))))))))))))))))))\", \"ab\", 0, 2, 20);\n  x3(\"(ab)(cd)\", \"abcd\", 0, 2, 1);\n  x3(\"(ab)(cd)\", \"abcd\", 2, 4, 2);\n  x3(\"()(a)bc(def)ghijk\", \"abcdefghijk\", 3, 6, 3);\n  x3(\"(()(a)bc(def)ghijk)\", \"abcdefghijk\", 3, 6, 4);\n  x2(\"(^a)\", \"a\", 0, 1);\n  x3(\"(a)|(a)\", \"ba\", 1, 2, 1);\n  x3(\"(^a)|(a)\", \"ba\", 1, 2, 2);\n  x3(\"(a?)\", \"aaa\", 0, 1, 1);\n  x3(\"(a*)\", \"aaa\", 0, 3, 1);\n  x3(\"(a*)\", \"\", 0, 0, 1);\n  x3(\"(a+)\", \"aaaaaaa\", 0, 7, 1);\n  x3(\"(a+|b*)\", \"bbbaa\", 0, 3, 1);\n  x3(\"(a+|b?)\", \"bbbaa\", 0, 1, 1);\n  x3(\"(abc)?\", \"abc\", 0, 3, 1);\n  x3(\"(abc)*\", \"abc\", 0, 3, 1);\n  x3(\"(abc)+\", \"abc\", 0, 3, 1);\n  x3(\"(xyz|abc)+\", \"abc\", 0, 3, 1);\n  x3(\"([xyz][abc]|abc)+\", \"abc\", 0, 3, 1);\n  x3(\"((?i:abc))\", \"AbC\", 0, 3, 1);\n  x2(\"(abc)(?i:\\\\1)\", \"abcABC\", 0, 6);\n  x3(\"((?m:a.c))\", \"a\\nc\", 0, 3, 1);\n  x3(\"((?=az)a)\", \"azb\", 0, 1, 1);\n  x3(\"abc|(.abd)\", \"zabd\", 0, 4, 1);\n  x2(\"(?:abc)|(ABC)\", \"abc\", 0, 3);\n  x3(\"(?i:(abc))|(zzz)\", \"ABC\", 0, 3, 1);\n  x3(\"a*(.)\", \"aaaaz\", 4, 5, 1);\n  x3(\"a*?(.)\", \"aaaaz\", 0, 1, 1);\n  x3(\"a*?(c)\", \"aaaac\", 4, 5, 1);\n  x3(\"[bcd]a*(.)\", \"caaaaz\", 5, 6, 1);\n  x3(\"(\\\\Abb)cc\", \"bbcc\", 0, 2, 1);\n  n(\"(\\\\Abb)cc\", \"zbbcc\");\n  x3(\"(^bb)cc\", \"bbcc\", 0, 2, 1);\n  n(\"(^bb)cc\", \"zbbcc\");\n  x3(\"cc(bb$)\", \"ccbb\", 2, 4, 1);\n  n(\"cc(bb$)\", \"ccbbb\");\n  n(\"(\\\\1)\", \"\");\n  n(\"\\\\1(a)\", \"aa\");\n  n(\"(a(b)\\\\1)\\\\2+\", \"ababb\");\n  n(\"(?:(?:\\\\1|z)(a))+$\", \"zaa\");\n  x2(\"(?:(?:\\\\1|z)(a))+$\", \"zaaa\", 0, 4);\n  x2(\"(a)(?=\\\\1)\", \"aa\", 0, 1);\n  n(\"(a)$|\\\\1\", \"az\");\n  x2(\"(a)\\\\1\", \"aa\", 0, 2);\n  n(\"(a)\\\\1\", \"ab\");\n  x2(\"(a?)\\\\1\", \"aa\", 0, 2);\n  x2(\"(a?\\?)\\\\1\", \"aa\", 0, 0);\n  x2(\"(a*)\\\\1\", \"aaaaa\", 0, 4);\n  x3(\"(a*)\\\\1\", \"aaaaa\", 0, 2, 1);\n  x2(\"a(b*)\\\\1\", \"abbbb\", 0, 5);\n  x2(\"a(b*)\\\\1\", \"ab\", 0, 1);\n  x2(\"(a*)(b*)\\\\1\\\\2\", \"aaabbaaabb\", 0, 10);\n  x2(\"(a*)(b*)\\\\2\", \"aaabbbb\", 0, 7);\n  x2(\"(((((((a*)b))))))c\\\\7\", \"aaabcaaa\", 0, 8);\n  x3(\"(((((((a*)b))))))c\\\\7\", \"aaabcaaa\", 0, 3, 7);\n  x2(\"(a)(b)(c)\\\\2\\\\1\\\\3\", \"abcbac\", 0, 6);\n  x2(\"([a-d])\\\\1\", \"cc\", 0, 2);\n  x2(\"(\\\\w\\\\d\\\\s)\\\\1\", \"f5 f5 \", 0, 6);\n  n(\"(\\\\w\\\\d\\\\s)\\\\1\", \"f5 f5\");\n  x2(\"(who|[a-c]{3})\\\\1\", \"whowho\", 0, 6);\n  x2(\"...(who|[a-c]{3})\\\\1\", \"abcwhowho\", 0, 9);\n  x2(\"(who|[a-c]{3})\\\\1\", \"cbccbc\", 0, 6);\n  x2(\"(^a)\\\\1\", \"aa\", 0, 2);\n  n(\"(^a)\\\\1\", \"baa\");\n  n(\"(a$)\\\\1\", \"aa\");\n  n(\"(ab\\\\Z)\\\\1\", \"ab\");\n  x2(\"(a*\\\\Z)\\\\1\", \"a\", 1, 1);\n  x2(\".(a*\\\\Z)\\\\1\", \"ba\", 1, 2);\n  x3(\"(.(abc)\\\\2)\", \"zabcabc\", 0, 7, 1);\n  x3(\"(.(..\\\\d.)\\\\2)\", \"z12341234\", 0, 9, 1);\n  x2(\"((?i:az))\\\\1\", \"AzAz\", 0, 4);\n  n(\"((?i:az))\\\\1\", \"Azaz\");\n  x2(\"(?<=a)b\", \"ab\", 1, 2);\n  n(\"(?<=a)b\", \"bb\");\n  x2(\"(?<=a|b)b\", \"bb\", 1, 2);\n  x2(\"(?<=a|bc)b\", \"bcb\", 2, 3);\n  x2(\"(?<=a|bc)b\", \"ab\", 1, 2);\n  x2(\"(?<=a|bc||defghij|klmnopq|r)z\", \"rz\", 1, 2);\n  x2(\"(a)\\\\g<1>\", \"aa\", 0, 2);\n  x2(\"(?<!a)b\", \"cb\", 1, 2);\n  n(\"(?<!a)b\", \"ab\");\n  x2(\"(?<!a|bc)b\", \"bbb\", 0, 1);\n  n(\"(?<!a|bc)z\", \"bcz\");\n  x2(\"(?<name1>a)\", \"a\", 0, 1);\n  x2(\"(?<name_2>ab)\\\\g<name_2>\", \"abab\", 0, 4);\n  x2(\"(?<name_3>.zv.)\\\\k<name_3>\", \"azvbazvb\", 0, 8);\n  x2(\"(?<=\\\\g<ab>)|-\\\\zEND (?<ab>XyZ)\", \"XyZ\", 3, 3);\n  x2(\"(?<n>|a\\\\g<n>)+\", \"\", 0, 0);\n  x2(\"(?<n>|\\\\(\\\\g<n>\\\\))+$\", \"()(())\", 0, 6);\n  x3(\"\\\\g<n>(?<n>.){0}\", \"X\", 0, 1, 1);\n  x2(\"\\\\g<n>(abc|df(?<n>.YZ){2,8}){0}\", \"XYZ\", 0, 3);\n  x2(\"\\\\A(?<n>(a\\\\g<n>)|)\\\\z\", \"aaaa\", 0, 4);\n  x2(\"(?<n>|\\\\g<m>\\\\g<n>)\\\\z|\\\\zEND (?<m>a|(b)\\\\g<m>)\", \"bbbbabba\", 0, 8);\n  x2(\"(?<name1240>\\\\w+\\\\sx)a+\\\\k<name1240>\", \"  fg xaaaaaaaafg x\", 2, 18);\n  x3(\"(z)()()(?<_9>a)\\\\g<_9>\", \"zaa\", 2, 3, 1);\n  x2(\"(.)(((?<_>a)))\\\\k<_>\", \"zaa\", 0, 3);\n  x2(\"((?<name1>\\\\d)|(?<name2>\\\\w))(\\\\k<name1>|\\\\k<name2>)\", \"ff\", 0, 2);\n  x2(\"(?:(?<x>)|(?<x>efg))\\\\k<x>\", \"\", 0, 0);\n  x2(\"(?:(?<x>abc)|(?<x>efg))\\\\k<x>\", \"abcefgefg\", 3, 9);\n  n(\"(?:(?<x>abc)|(?<x>efg))\\\\k<x>\", \"abcefg\");\n  x2(\"(?:(?<n1>.)|(?<n1>..)|(?<n1>...)|(?<n1>....)|(?<n1>.....)|(?<n1>......)|(?<n1>.......)|(?<n1>........)|(?<n1>.........)|(?<n1>..........)|(?<n1>...........)|(?<n1>............)|(?<n1>.............)|(?<n1>..............))\\\\k<n1>$\", \"a-pyumpyum\", 2, 10);\n  x3(\"(?:(?<n1>.)|(?<n1>..)|(?<n1>...)|(?<n1>....)|(?<n1>.....)|(?<n1>......)|(?<n1>.......)|(?<n1>........)|(?<n1>.........)|(?<n1>..........)|(?<n1>...........)|(?<n1>............)|(?<n1>.............)|(?<n1>..............))\\\\k<n1>$\", \"xxxxabcdefghijklmnabcdefghijklmn\", 4, 18, 14);\n  x3(\"(?<name1>)(?<name2>)(?<name3>)(?<name4>)(?<name5>)(?<name6>)(?<name7>)(?<name8>)(?<name9>)(?<name10>)(?<name11>)(?<name12>)(?<name13>)(?<name14>)(?<name15>)(?<name16>aaa)(?<name17>)$\", \"aaa\", 0, 3, 16);\n  x2(\"(?<foo>a|\\\\(\\\\g<foo>\\\\))\", \"a\", 0, 1);\n  x2(\"(?<foo>a|\\\\(\\\\g<foo>\\\\))\", \"((((((a))))))\", 0, 13);\n  x3(\"(?<foo>a|\\\\(\\\\g<foo>\\\\))\", \"((((((((a))))))))\", 0, 17, 1);\n  x2(\"\\\\g<bar>|\\\\zEND(?<bar>.*abc$)\", \"abcxxxabc\", 0, 9);\n  x2(\"\\\\g<1>|\\\\zEND(.a.)\", \"bac\", 0, 3);\n  x3(\"\\\\g<_A>\\\\g<_A>|\\\\zEND(.a.)(?<_A>.b.)\", \"xbxyby\", 3, 6, 1);\n  x2(\"\\\\A(?:\\\\g<pon>|\\\\g<pan>|\\\\zEND  (?<pan>a|c\\\\g<pon>c)(?<pon>b|d\\\\g<pan>d))$\", \"cdcbcdc\", 0, 7);\n  x2(\"\\\\A(?<n>|a\\\\g<m>)\\\\z|\\\\zEND (?<m>\\\\g<n>)\", \"aaaa\", 0, 4);\n  x2(\"(?<n>(a|b\\\\g<n>c){3,5})\", \"baaaaca\", 1, 5);\n  x2(\"(?<n>(a|b\\\\g<n>c){3,5})\", \"baaaacaaaaa\", 0, 10);\n  x2(\"(?<pare>\\\\(([^\\\\(\\\\)]++|\\\\g<pare>)*+\\\\))\", \"((a))\", 0, 5);\n  x2(\"()*\\\\1\", \"\", 0, 0);\n  x2(\"(?:()|())*\\\\1\\\\2\", \"\", 0, 0);\n  x3(\"(?:\\\\1a|())*\", \"a\", 0, 0, 1);\n  x2(\"x((.)*)*x\", \"0x1x2x3\", 1, 6);\n  x2(\"x((.)*)*x(?i:\\\\1)\\\\Z\", \"0x1x2x1X2\", 1, 9);\n  x2(\"(?:()|()|()|()|()|())*\\\\2\\\\5\", \"\", 0, 0);\n  x2(\"(?:()|()|()|(x)|()|())*\\\\2b\\\\5\", \"b\", 0, 1);\n  x2(\"\\\\xED\\\\xF2\", \"\\xed\\xf2\", 0, 2);\n  x2(\"\", \"\", 0, 0);\n  x2(\"\", \"\", 0, 2);\n  n(\"\", \"\");\n  x2(\"\", \"\", 0, 4);\n  x2(\"\", \"\", 0, 6);\n  x2(\"\", \"\", 0, 70);\n  x2(\"\", \"\", 2, 4);\n  x2(\"\", \"\", 2, 6);\n  x2(\"\\\\xca\\\\xb8\", \"\\xca\\xb8\", 0, 2);\n  x2(\".\", \"\", 0, 2);\n  x2(\"..\", \"\", 0, 4);\n  x2(\"(?u)\\\\w\", \"\", 0, 2);\n  n(\"(?u)\\\\W\", \"\");\n  x2(\"(?u)[\\\\W]\", \"$\", 2, 3);\n  x2(\"\\\\S\", \"\", 0, 2);\n  x2(\"\\\\S\", \"\", 0, 2);\n  x2(\"\\\\b\", \"C \", 0, 0);\n  x2(\"\\\\b\", \" \", 1, 1);\n  x2(\"\\\\B\", \" \", 2, 2);\n  x2(\"\\\\B\", \" \", 3, 3);\n  x2(\"\\\\B\", \" \", 0, 0);\n  x2(\"[]\", \"\", 0, 2);\n  n(\"[Ȃ]\", \"\");\n  x2(\"[-]\", \"\", 0, 2);\n  n(\"[^]\", \"\");\n  x2(\"(?u)[\\\\w]\", \"\", 0, 2);\n  n(\"[\\\\d]\", \"\");\n  x2(\"[\\\\D]\", \"\", 0, 2);\n  n(\"[\\\\s]\", \"\");\n  x2(\"[\\\\S]\", \"\", 0, 2);\n  x2(\"(?u)[\\\\w\\\\d]\", \"\", 0, 2);\n  x2(\"(?u)[\\\\w\\\\d]\", \"   \", 3, 5);\n  n(\"(?u)\\\\wS\", \" S\");\n  x2(\"(?u)S\\\\W\", \"S \", 0, 5);\n  x2(\"..\", \"\", 0, 10);\n  x2(\"(?u).\\\\w\\\\W..\", \" \", 0, 13);\n  x2(\"(?u)\\\\s\\\\w\", \" \", 0, 9);\n  x2(\".\", \"\", 0, 8);\n  n(\".\", \"\");\n  x2(\".\", \"\", 0, 4);\n  x2(\"^\", \"\", 0, 2);\n  x2(\"^$\", \"\", 0, 2);\n  x2(\"(?u)^\\\\w$\", \"\", 0, 2);\n  x2(\"(?u)^\\\\w$\", \"z\", 0, 11);\n  x2(\"(?u)^\\\\w...$\", \"z\", 0, 13);\n  x2(\"(?u)\\\\w\\\\w\\\\s\\\\W\\\\d\", \"a  4\", 0, 12);\n  x2(\"\\\\A\", \"\", 0, 6);\n  x2(\"ނ߂\\\\Z\", \"ނ߂\", 0, 6);\n  x2(\"\\\\z\", \"\", 0, 6);\n  x2(\"\\\\Z\", \"\\n\", 0, 6);\n  x2(\"\\\\Gۂ\", \"ۂ\", 0, 4);\n  n(\"\\\\G\", \"\");\n  n(\"Ƃ\\\\G\", \"Ƃ\");\n  n(\"܂\\\\A\", \"܂\");\n  n(\"\\\\A\", \"܂\");\n  x2(\"(?=)\", \"\", 0, 2);\n  n(\"(?=).\", \"\");\n  x2(\"(?!)\", \"\", 0, 2);\n  n(\"(?!)\", \"\");\n  x2(\"(?i:)\", \"\", 0, 2);\n  x2(\"(?i:Ԃ)\", \"Ԃ\", 0, 4);\n  n(\"(?i:)\", \"\");\n  x2(\"(?m:.)\", \"\\n\", 0, 3);\n  x2(\"(?m:.)\", \"\\n\", 2, 5);\n  x2(\"?\", \"\", 0, 0);\n  x2(\"?\", \"\", 0, 0);\n  x2(\"?\", \"\", 0, 2);\n  x2(\"*\", \"\", 0, 0);\n  x2(\"*\", \"\", 0, 2);\n  x2(\"q*\", \"qqq\", 0, 6);\n  x2(\"n*\", \"nnnn\", 0, 0);\n  n(\"R+\", \"\");\n  x2(\"+\", \"\", 0, 2);\n  x2(\"+\", \"\", 0, 8);\n  x2(\"+\", \"\", 0, 4);\n  x2(\"+\", \"\", 2, 10);\n  x2(\".?\", \"\", 0, 2);\n  x2(\".*\", \"ς҂Ղ\", 0, 8);\n  x2(\".+\", \"\", 0, 2);\n  x2(\".+\", \"\\n\", 0, 8);\n  x2(\"|\", \"\", 0, 2);\n  x2(\"|\", \"\", 0, 2);\n  x2(\"|\", \"\", 0, 4);\n  x2(\"|\", \"\", 0, 4);\n  x2(\"(?:|)\", \"\", 0, 6);\n  x2(\"(?:|)\", \"\", 0, 8);\n  x2(\"|(?:|)\", \"\", 0, 4);\n  x2(\"||\", \"\", 2, 4);\n  x2(\"|||||||||ĂƂȂ|ʂ\", \"\", 0, 6);\n  n(\"|||||||||ĂƂȂ|ʂ\", \"\");\n  x2(\"|^\", \"Ԃ\", 2, 4);\n  x2(\"|^\", \"\", 0, 2);\n  x2(\"S|\\\\G\", \"ԋS\", 4, 6);\n  x2(\"S|\\\\G\", \"ԋS\", 0, 2);\n  x2(\"S|\\\\A\", \"bԋS\", 3, 5);\n  x2(\"S|\\\\A\", \"\", 0, 2);\n  x2(\"S|\\\\Z\", \"ԋS\", 2, 4);\n  x2(\"S|\\\\Z\", \"\", 0, 2);\n  x2(\"S|\\\\Z\", \"\\n\", 0, 2);\n  x2(\"S|\\\\z\", \"ԋS\", 2, 4);\n  x2(\"S|\\\\z\", \"\", 0, 2);\n  x2(\"(?u)\\\\w|\\\\s\", \"\", 0, 2);\n  x2(\"(?u)\\\\w|%\", \"%\", 0, 1);\n  x2(\"(?u)\\\\w|[&$]\", \"&\", 0, 2);\n  x2(\"[-]\", \"\", 0, 2);\n  x2(\"[-]|[^-]\", \"\", 0, 2);\n  x2(\"[-]|[^-]\", \"\", 0, 2);\n  x2(\"[^]\", \"\\n\", 0, 1);\n  x2(\"(?:|[-])|\", \"\", 0, 2);\n  x2(\"(?:|[-])|\", \"\", 0, 4);\n  x2(\"|(?=)..\", \"\", 0, 6);\n  x2(\"|(?!)..\", \"\", 0, 6);\n  x2(\"(?=)..|(?=)..\", \"\", 0, 6);\n  x2(\"(?<=|)\", \"\", 4, 6);\n  n(\"(?>|)\", \"\");\n  x2(\"(?>|)\", \"\", 0, 8);\n  x2(\"?|\", \"\", 0, 2);\n  x2(\"?|\", \"\", 0, 0);\n  x2(\"?|\", \"\", 0, 0);\n  x2(\"*|\", \"\", 0, 4);\n  x2(\"*|*\", \"\", 0, 0);\n  x2(\"*|*\", \"\", 0, 2);\n  x2(\"[a]*|*\", \"a\", 0, 3);\n  x2(\"+|*\", \"\", 0, 0);\n  x2(\"+|*\", \"\", 0, 6);\n  x2(\"+|*\", \"\", 0, 2);\n  x2(\"+|*\", \"a\", 0, 0);\n  n(\"+|+\", \"\");\n  x2(\"(|)?\", \"\", 0, 2);\n  x2(\"(|)*\", \"\", 0, 4);\n  x2(\"(|)+\", \"\", 0, 6);\n  x2(\"(|)+\", \"\", 0, 8);\n  x2(\"(|)+\", \"\", 4, 12);\n  x2(\"(|)+\", \"\", 2, 10);\n  x2(\"(|)+\", \"\", 0, 4);\n  x2(\"(|)+\", \"$$zzzz\", 6, 10);\n  x2(\"(|)+\", \"\", 0, 10);\n  x2(\"(|)+\", \"\", 2, 4);\n  x2(\"(|)+\", \"\", 2, 8);\n  x2(\"(?:|)(?:|)\", \"\", 0, 4);\n  x2(\"(?:*|*)(?:*|*)\", \"\", 0, 6);\n  x2(\"(?:*|*)(?:+|+)\", \"\", 0, 12);\n  x2(\"(?:+|+){2}\", \"\", 0, 12);\n  x2(\"(?:+|+){1,2}\", \"\", 0, 12);\n  x2(\"(?:+|\\\\A*)\", \"\", 0, 4);\n  n(\"(?:+|\\\\A*)\", \"\");\n  x2(\"(?:^+|+)*\", \"\", 12, 16);\n  x2(\"(?:^+|+)*\", \"\", 0, 14);\n  x2(\"{0,}\", \"\", 0, 8);\n  x2(\"|(?i)c\", \"C\", 0, 1);\n  x2(\"(?i)c|\", \"C\", 0, 1);\n  x2(\"(?i:)|a\", \"a\", 0, 1);\n  n(\"(?i:)|a\", \"A\");\n  x2(\"[]?\", \"\", 0, 2);\n  x2(\"[]*\", \"\", 0, 6);\n  x2(\"[^]*\", \"\", 0, 0);\n  n(\"[^]+\", \"\");\n  x2(\"?\\?\", \"\", 0, 0);\n  x2(\"?\\?\", \"\", 0, 6);\n  x2(\"*?\", \"\", 0, 0);\n  x2(\"*?\", \"\", 0, 2);\n  x2(\"*?\", \"\", 0, 8);\n  x2(\"+?\", \"\", 0, 2);\n  x2(\"+?\", \"\", 0, 4);\n  x2(\"+?\", \"\", 0, 8);\n  x2(\"(?:V?)?\\?\", \"V\", 0, 0);\n  x2(\"(?:V?\\?)?\", \"V\", 0, 0);\n  x2(\"(?:?)+?\", \"\", 0, 2);\n  x2(\"(?:+)?\\?\", \"\", 0, 0);\n  x2(\"(?:+)?\\?\", \"ᑚ\", 0, 8);\n  x2(\"(?:)?{2}\", \"\", 0, 0);\n  x2(\"(?:S)?{2}\", \"SԋSԋS\", 0, 8);\n  x2(\"(?:S)*{0}\", \"SԋSԋS\", 0, 0);\n  x2(\"(?:S){3,}\", \"SԋSԋSԋS\", 0, 16);\n  n(\"(?:S){3,}\", \"SԋS\");\n  x2(\"(?:S){2,4}\", \"SԋSԋS\", 0, 12);\n  x2(\"(?:S){2,4}\", \"SԋSԋSԋSԋS\", 0, 16);\n  x2(\"(?:S){2,4}?\", \"SԋSԋSԋSԋS\", 0, 8);\n  x2(\"(?:S){,}\", \"S{,}\", 0, 7);\n  x2(\"(?:)+?{2}\", \"\", 0, 12);\n  x3(\"()\", \"\", 0, 2, 1);\n  x3(\"(ΐ)\", \"ΐ\", 0, 4, 1);\n  x2(\"(())\", \"\", 0, 4);\n  x3(\"(())\", \"\", 0, 4, 1);\n  x3(\"(())\", \"\", 0, 4, 2);\n  x3(\"((((((((((((((((((((ʎq))))))))))))))))))))\", \"ʎq\", 0, 4, 20);\n  x3(\"()()\", \"\", 0, 4, 1);\n  x3(\"()()\", \"\", 4, 8, 2);\n  x3(\"()()()\", \"\", 6, 12, 3);\n  x3(\"(()()())\", \"\", 6, 12, 4);\n  x3(\".*(tH)E}(()V^)C\", \"tHE}V^C\", 10, 18, 2);\n  x2(\"(^)\", \"\", 0, 2);\n  x3(\"()|()\", \"\", 2, 4, 1);\n  x3(\"(^)|()\", \"\", 2, 4, 2);\n  x3(\"(?)\", \"\", 0, 2, 1);\n  x3(\"(*)\", \"܂܂\", 0, 6, 1);\n  x3(\"(*)\", \"\", 0, 0, 1);\n  x3(\"(+)\", \"\", 0, 14, 1);\n  x3(\"(+|*)\", \"ӂӂӂւ\", 0, 6, 1);\n  x3(\"(+|?)\", \"\", 0, 2, 1);\n  x3(\"()?\", \"\", 0, 6, 1);\n  x3(\"()*\", \"\", 0, 6, 1);\n  x3(\"()+\", \"\", 0, 6, 1);\n  x3(\"(|)+\", \"\", 0, 6, 1);\n  x3(\"([Ȃɂ][]|)+\", \"\", 0, 6, 1);\n  x3(\"((?i:))\", \"\", 0, 6, 1);\n  x3(\"((?m:.))\", \"\\n\", 0, 5, 1);\n  x3(\"((?=))\", \"\", 0, 2, 1);\n  x3(\"|(.)\", \"񂠂\", 0, 8, 1);\n  x3(\"*(.)\", \"\", 8, 10, 1);\n  x3(\"*?(.)\", \"\", 0, 2, 1);\n  x3(\"*?()\", \"\", 8, 10, 1);\n  x3(\"[]*(.)\", \"\", 10, 12, 1);\n  x3(\"(\\\\A)\", \"\", 0, 4, 1);\n  n(\"(\\\\A)\", \"񂢂\");\n  x3(\"(^)\", \"\", 0, 4, 1);\n  n(\"(^)\", \"񂢂\");\n  x3(\"($)\", \"\", 4, 8, 1);\n  n(\"($)\", \"\");\n  x2(\"()\\\\1\", \"\", 0, 4);\n  n(\"()\\\\1\", \"\");\n  x2(\"(?)\\\\1\", \"\", 0, 4);\n  x2(\"(?\\?)\\\\1\", \"\", 0, 0);\n  x2(\"(*)\\\\1\", \"\", 0, 8);\n  x3(\"(*)\\\\1\", \"\", 0, 4, 1);\n  x2(\"(*)\\\\1\", \"\", 0, 10);\n  x2(\"(*)\\\\1\", \"\", 0, 2);\n  x2(\"(*)(*)\\\\1\\\\2\", \"\", 0, 20);\n  x2(\"(*)(*)\\\\2\", \"\", 0, 14);\n  x3(\"(*)(*)\\\\2\", \"\", 6, 10, 2);\n  x2(\"(((((((*)))))))\\\\7\", \"ۂۂۂ؂҂ۂۂ\", 0, 16);\n  x3(\"(((((((*)))))))\\\\7\", \"ۂۂۂ؂҂ۂۂ\", 0, 6, 7);\n  x2(\"()()()\\\\2\\\\1\\\\3\", \"͂ЂӂЂ͂\", 0, 12);\n  x2(\"([-])\\\\1\", \"\", 0, 4);\n  x2(\"(?u)(\\\\w\\\\d\\\\s)\\\\1\", \"5 5 \", 0, 8);\n  n(\"(?u)(\\\\w\\\\d\\\\s)\\\\1\", \"5 5\");\n  x2(\"(NH|[-]{3})\\\\1\", \"NHNH\", 0, 8);\n  x2(\"...(NH|[-]{3})\\\\1\", \"aNHNH\", 0, 13);\n  x2(\"(NH|[-]{3})\\\\1\", \"\", 0, 12);\n  x2(\"(^)\\\\1\", \"\", 0, 4);\n  n(\"(^)\\\\1\", \"߂ނ\");\n  n(\"($)\\\\1\", \"\");\n  n(\"(\\\\Z)\\\\1\", \"\");\n  x2(\"(*\\\\Z)\\\\1\", \"\", 2, 2);\n  x2(\".(*\\\\Z)\\\\1\", \"\", 2, 4);\n  x3(\"(.(₢)\\\\2)\", \"z₢₢\", 0, 13, 1);\n  x3(\"(.(..\\\\d.)\\\\2)\", \"12341234\", 0, 10, 1);\n  x2(\"((?i:v))\\\\1\", \"vv\", 0, 10);\n  x2(\"(?<>|\\\\(\\\\g<>\\\\))\", \"(((((())))))\", 0, 14);\n  x2(\"\\\\A(?:\\\\g<_1>|\\\\g<]_2>|\\\\zI  (?<_1>|\\\\g<]_2>)(?<]_2>|F\\\\g<_1>F))$\", \"FFݎFF\", 0, 26);\n  x2(\"[[Ђ]]\", \"\", 0, 2);\n  x2(\"[[]]\", \"\", 0, 2);\n  n(\"[[^]]\", \"\");\n  n(\"[^[]]\", \"\");\n  x2(\"[^[^]]\", \"\", 0, 2);\n  x2(\"[[]&&]\", \"\", 0, 2);\n  n(\"[[]&&]\", \"\");\n  n(\"[[]&&]\", \"\");\n  x2(\"[-&&-&&-]\", \"\", 0, 2);\n  n(\"[^-&&-&&-]\", \"\");\n  x2(\"[[^&&]&&-]\", \"\", 0, 2);\n  n(\"[[^&&]&&-]\", \"\");\n  x2(\"[[^-&&]&&[^-]]\", \"\", 0, 2);\n  n(\"[[^-&&]&&[^-]]\", \"\");\n  x2(\"[^[^]&&[^]]\", \"\", 0, 2);\n  x2(\"[^[^]&&[^]]\", \"\", 0, 2);\n  n(\"[^[^]&&[^]]\", \"\");\n  x2(\"[-&&-]\", \"-\", 0, 1);\n  x2(\"[^[^a-z]&&[^bcdefg]q-w]\", \"\", 0, 2);\n  x2(\"[^[^a-z]&&[^bcdefg]g-w]\", \"f\", 0, 1);\n  x2(\"[^[^a-z]&&[^bcdefg]g-w]\", \"g\", 0, 1);\n  n(\"[^[^a-z]&&[^bcdefg]g-w]\", \"2\");\n  x2(\"a<b>o[W̃_E[h<\\\\/b>\", \"a<b>o[W̃_E[h</b>\", 0, 32);\n  x2(\".<b>o[W̃_E[h<\\\\/b>\", \"a<b>o[W̃_E[h</b>\", 0, 32);\n  fprintf(stdout,\n       \"\\nRESULT   SUCC: %d,  FAIL: %d,  ERROR: %d      (by Onigmo %s)\\n\",\n       nsucc, nfail, nerror, onig_version());\n\n#ifndef POSIX_TEST\n  onig_region_free(region, 1);\n  onig_end();\n#endif\n\n  return ((nfail == 0 && nerror == 0) ? 0 : -1);\n}\n"
  },
  {
    "path": "src/Protocols/Protocol.h",
    "content": " /*\n * Copyright 2020, WindTerm.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef PROTOCOL_H\n#define PROTOCOL_H\n\n#pragma once\n\n#include <QByteArray>\n\nclass Protocol\n{\npublic:\n\tProtocol(void) = default;\n\tvirtual ~Protocol(void) = default;\n\n\tQByteArray name() const { return m_name; }\n\nprotected:\n\tQByteArray m_name;\n};\n\n#endif // PROTOCOL_H"
  },
  {
    "path": "src/Protocols/TelnetProtocol.cpp",
    "content": " /*\n * Copyright 2020, WindTerm.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"TelnetProtocol.h\"\n\n#include <iomanip>\n#include <mutex>\n#include <sstream>\n\nconst char *arrTelnetCmds[] =\n{\n  \"XEOF\",  \"SUSP\",  \"ABORT\", \"EOR\",  \"SE\",\n  \"NOP\",   \"DM\",    \"BREAK\", \"IP\",   \"AO\",\n  \"AYT\",   \"EC\",    \"EL\",    \"GA\",   \"SB\",\n  \"WILL\",  \"WONT\",  \"DO\",    \"DONT\", \"IAC\"\n};\n\nconst char *arrTelnetOpts[] =\n{\n\t\"BINARY\", \"ECHO\", \"RCP\", \"SUPPRESS GO AHEAD\", \"NAME\", \"STATUS\", \"TIMING MARK\", \"RCTE\", \n\t\"NAOL\", \"NAOP\", \"NAOCRD\", \"NAOHTS\", \"NAOHTD\", \"NAOFFD\", \"NAOVTS\", \"NAOVTD\", \n\t\"NAOLFD\", \"EXTEND ASCII\", \"LOGOUT\", \"BYTE MACRO\", \"DATA ENTRY TERMINAL\", \"SUPDUP\", \"SUPDUP OUTPUT\", \"SEND LOCATION\",\n\t\"TERMINAL TYPE\", \"END OF RECORD\", \"TACACS UID\", \"OUTPUT MARKING\", \"TTYLOC\", \"3270 REGIME\", \"X.3 PAD\", \"NAWS\",\n\t\"TSPEED\", \"LFLOW\", \"LINEMODE\", \"XDISPLOC\", \"OLD ENVIRON\", \"AUTHENTICATION\", \"ENCRYPT\", \"NEW ENVIRON\", \n\t\"TN3270E\", \"XAUTH\", \"CHARSET\", \"RSP\", \"COM PORT CONTROL\", \"SUPPRESS LOCAL ECHO\", \"START TLS\", \"KERMIT\", \n\t\"SEND-URL\", \"FORWARD_X\",\n};\n\nstd::string TelnetProtocol::GetCommandName(uchar chTelnetCmd)\n{\n\tif (chTelnetCmd >= TELCMD_XEOF && chTelnetCmd <= TELCMD_IAC)\n\t\treturn arrTelnetCmds[chTelnetCmd - TELCMD_XEOF];\n\n\tstd::ostringstream oss;\n\toss << \"0x\" << std::hex << std::setw(2) << std::setfill('0') << (int)chTelnetCmd << \"(Unknown Telnet Command)\";\n\treturn oss.str();\n}\n\nstd::string TelnetProtocol::GetOptionName(uchar chTelnetOption)\n{\n\tif (chTelnetOption >= TELOPT_BINARY && chTelnetOption <= TELOPT_FORWARD_X) { return arrTelnetOpts[chTelnetOption - TELOPT_BINARY];} \n\telse if (chTelnetOption == TELOPT_MCCP1) { return \"MUD COMPRESSION PROTOCOL (V1)\"; }\n\telse if (chTelnetOption == TELOPT_MCCP2) { return \"MUD COMPRESSION PROTOCOL (V2)\"; }\n\telse if (chTelnetOption == TELOPT_MSP) { return \"MUD SOUND PROTOCOL\"; }\n\telse if (chTelnetOption == TELOPT_MXP) { return \"MUD EXTENSION PROTOCOL\";}\n\telse if (chTelnetOption == TELOPT_PRAGMA_LOGON) { return \"TELOPT PRAGMA LOGON\"; }\n\telse if (chTelnetOption == TELOPT_SSPI_LOGON) { return \"TELOPT SSPI LOGON\"; }\n\telse if (chTelnetOption == TELOPT_PRAGMA_HEARTBEAT) { return \"TELOPT PRAGMA HEARTBEAT\"; }\n\telse if (chTelnetOption == TELOPT_EXOPL) { return \"EXTENDED OPTIONS LIST\"; }\n\n\tstd::ostringstream oss;\n\toss << \"0x\" << std::hex << std::setw(2) << std::setfill('0') << (int)chTelnetOption << \"(Unknown Telnet Option)\";\n\treturn oss.str();\n}\n\nTelnetOptionVector &TelnetProtocol::GetOptionVector()\n{\n\tstatic TelnetOptionVector m_vTelnetOption;\n\tstatic std::once_flag flag;\n\n\tstd::call_once(flag, [&]() {\n\t\tm_vTelnetOption.clear();\n\t\tm_vTelnetOption.resize(TELOPT_INDEX_MAX);\n\n\t\tm_vTelnetOption[TELOPT_INDEX_NAWS].Init(TELOPT_NAWS, TELNET_CLIENT, TELOPT_STATE_INACTIVE_REQUESTED);\n\t\tm_vTelnetOption[TELOPT_INDEX_TTYPE].Init(TELOPT_TTYPE, TELNET_CLIENT, TELOPT_STATE_INACTIVE_REQUESTED);\n\t\tm_vTelnetOption[TELOPT_INDEX_ECHO].Init(TELOPT_ECHO, TELNET_SERVER, TELOPT_STATE_INACTIVE_REQUESTED);\n\t\tm_vTelnetOption[TELOPT_INDEX_SERVER_SGA].Init(TELOPT_SGA, TELNET_SERVER, TELOPT_STATE_INACTIVE_REQUESTED);\n\t\tm_vTelnetOption[TELOPT_INDEX_CLIENT_SGA].Init(TELOPT_SGA, TELNET_CLIENT, TELOPT_STATE_INACTIVE_REQUESTED);\n\t\tm_vTelnetOption[TELOPT_INDEX_SERVER_BIN].Init(TELOPT_BINARY, TELNET_SERVER, TELOPT_STATE_INACTIVE);\n\t\tm_vTelnetOption[TELOPT_INDEX_CLIENT_BIN].Init(TELOPT_BINARY, TELNET_CLIENT, TELOPT_STATE_INACTIVE);\n\t});\n\n\treturn m_vTelnetOption;\n}\n\nTelnetProtocol::TelnetProtocol()\n{\n\tm_name = \"Telnet\";\n}\n"
  },
  {
    "path": "src/Protocols/TelnetProtocol.h",
    "content": " /*\n * Copyright 2020, WindTerm.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef TELNETPROTOCOL_H\n#define TELNETPROTOCOL_H\n\n#pragma once\n\n#include <vector>\n#include \"Protocol.h\"\n\ntypedef unsigned char uchar;\n\n/* TELNET Command Codes: */\nconstexpr uchar TELCMD_XEOF\t\t\t\t= 236;\t/* End of file: EOF is already used\t*/\nconstexpr uchar TELCMD_SUSP\t\t\t\t= 237;\t/* Suspend process\t\t\t\t\t*/\nconstexpr uchar TELCMD_ABORT\t\t\t= 238;\t/* Abort process\t\t\t\t\t*/\nconstexpr uchar TELCMD_EOR\t\t\t\t= 239;\t/* end of record (transparent mode)\t*/\nconstexpr uchar TELCMD_SE\t\t\t\t= 240;\t/* end sub negotiation\t\t\t\t*/\nconstexpr uchar TELCMD_NOP\t\t\t\t= 241;\t/* nop\t\t\t\t\t\t\t\t*/\nconstexpr uchar TELCMD_DM\t\t\t\t= 242;\t/* data mark--for connect. cleaning\t*/\nconstexpr uchar TELCMD_BREAK\t\t\t= 243;\t/* break\t\t\t\t\t\t\t*/\nconstexpr uchar TELCMD_IP\t\t\t\t= 244;\t/* interrupt process--permanently\t*/\nconstexpr uchar TELCMD_AO\t\t\t\t= 245;\t/* abort output--but let prog finish*/\nconstexpr uchar TELCMD_AYT\t\t\t\t= 246;\t/* are you there\t\t\t\t\t*/\nconstexpr uchar TELCMD_EC\t\t\t\t= 247;\t/* erase the current character\t\t*/\nconstexpr uchar TELCMD_EL\t\t\t\t= 248;\t/* erase the current line\t\t\t*/\nconstexpr uchar TELCMD_GA\t\t\t\t= 249;\t/* you may reverse the line\t\t\t*/\nconstexpr uchar TELCMD_SB\t\t\t\t= 250;\t/* interpret as subnegotiation\t\t*/\nconstexpr uchar TELCMD_WILL\t\t\t\t= 251;\t/* I will use option\t\t\t\t*/\nconstexpr uchar TELCMD_WONT\t\t\t\t= 252;\t/* I won't use option\t\t\t\t*/\nconstexpr uchar TELCMD_DO\t\t\t\t= 253;\t/* please, you use option\t\t\t*/\nconstexpr uchar TELCMD_DONT\t\t\t\t= 254;\t/* you are not to use option\t\t*/\nconstexpr uchar TELCMD_IAC\t\t\t\t= 255;\t/* interpret as command\t\t\t\t*/\n\n/* The telnet options represented as strings */\nconstexpr uchar TELOPT_BINARY\t\t\t= 0;   // Binary Transmission - RFC 856\nconstexpr uchar TELOPT_ECHO\t\t\t\t= 1;   // Echo                - RFC 857\nconstexpr uchar TELOPT_RCP\t\t\t\t= 2;   // Reconnection\nconstexpr uchar TELOPT_SGA\t\t\t\t= 3;   // Suppress Go Ahead   - RFC 858\nconstexpr uchar TELOPT_NAMS\t\t\t\t= 4;   // Approx Message Size Negotiation\nconstexpr uchar TELOPT_STATUS\t\t\t= 5;   // Status              - RFC 859\nconstexpr uchar TELOPT_TM\t\t\t\t= 6;   // Timing Mark         - RFC 860\nconstexpr uchar TELOPT_RCTE\t\t\t\t= 7;   // Remote controlled transmission and echo - RFC 563,726\nconstexpr uchar TELOPT_NAOL\t\t\t\t= 8;   // Negotiate about output line width - NIC50005\nconstexpr uchar TELOPT_NAOP\t\t\t\t= 9;   // Negotiate about output page size - NIC50005\nconstexpr uchar TELOPT_NAOCRD\t\t\t= 10;  // Negotiate about CR disposition - RFC 652\nconstexpr uchar TELOPT_NAOHTS\t\t\t= 11;  // Negotiate about horizontal tabstops - RFC 653\nconstexpr uchar TELOPT_NAOHTD\t\t\t= 12;  // Negotiate about horizontal tab disposition - RFC 654\nconstexpr uchar TELOPT_NAOFFD\t\t\t= 13;  // Negotiate about formfeed disposition - RFC 655\nconstexpr uchar TELOPT_NAOVTS\t\t\t= 14;  // Negotiate about vertical tab stops - RFC 656\nconstexpr uchar TELOPT_NAOVTD\t\t\t= 15;  // Negotiate about vertical tab disposition - RFC 657\nconstexpr uchar TELOPT_NAOLFD\t\t\t= 16;  // Negotiate about output LF disposition - RFC 658\nconstexpr uchar TELOPT_XASCII\t\t\t= 17;  // Extended ascic character set - RFC 698\nconstexpr uchar TELOPT_LOGOUT\t\t\t= 18;  // Force logout             - RFC 727\nconstexpr uchar TELOPT_BM\t\t\t\t= 19;  // Byte Macro         - RFC 735\nconstexpr uchar TELOPT_DET\t\t\t\t= 20;  // Data Entry Terminal - RFC 732,1043\nconstexpr uchar TELOPT_SUPDUP\t\t\t= 21;  // SUPDUP Protocol             - RFC 734,736\nconstexpr uchar TELOPT_SUPDUPOUTPUT\t\t= 22;  // SUPDUP Output      - RFC 749\nconstexpr uchar TELOPT_SNDLOC\t\t\t= 23;  // Send Location      - RFC 779\nconstexpr uchar TELOPT_TTYPE\t\t\t= 24;  // Terminal Type      - RFC 1091\nconstexpr uchar TELOPT_EOR\t\t\t\t= 25;  // End of Record      - RFC 885\nconstexpr uchar TELOPT_TUID\t\t\t\t= 26;  // TACACS User Identification - RFC 927\nconstexpr uchar TELOPT_OUTMRK\t\t\t= 27;  // Output Marking     - RFC 933\nconstexpr uchar TELOPT_TTYLOC\t\t\t= 28;  // Terminal Location Number - RFC 946\nconstexpr uchar TELOPT_3270REGIME\t\t= 29;  // Telnet 3270 Regime - RFC 1041\nconstexpr uchar TELOPT_X3PAD\t\t\t= 30;  // X.3 PAD            - RFC 1053\nconstexpr uchar TELOPT_NAWS\t\t\t\t= 31;  // Negotiate window size - RFC 1073\nconstexpr uchar TELOPT_TSPEED\t\t\t= 32;  // Terminal Speed     - RFC 1079\nconstexpr uchar TELOPT_LFLOW\t\t\t= 33;  // Remote Flow Control - RFC 1372\nconstexpr uchar TELOPT_LINEMODE\t\t\t= 34;  // Linemode option     - RFC 1184\nconstexpr uchar TELOPT_XDISPLOC\t\t\t= 35;  // X Display Location - RFC 1096\nconstexpr uchar TELOPT_OLD_ENVIRON\t\t= 36;  // Environment Option - RFC 1408\nconstexpr uchar TELOPT_AUTHENTICATION\t= 37;  // Authenticate - RFC 1416,2941,2942,2943,2951\nconstexpr uchar TELOPT_ENCRYPT\t\t\t= 38;  // Encryption Option - RFC 2946\nconstexpr uchar TELOPT_NEW_ENVIRON\t\t= 39;  // New Environment Option - RFC 1572\nconstexpr uchar TELOPT_TN3270E\t\t\t= 40;  // TN3270 enhancements    - RFC 2355\nconstexpr uchar TELOPT_XAUTH\t\t\t= 41;  // XAUTH\nconstexpr uchar TELOPT_CHARSET\t\t\t= 42;  // Negotiate charset to use - RFC 2066\nconstexpr uchar TELOPT_RSP\t\t\t\t= 43;  // Telnet remote serial port\nconstexpr uchar TELOPT_COM_PORT_OPTION\t= 44;  // Com port control option - RFC 2217\nconstexpr uchar TELOPT_SLE\t\t\t\t= 45;  // Telnet suppress local echo\nconstexpr uchar TELOPT_STARTTLS\t\t\t= 46;  // Telnet Start TLS\nconstexpr uchar TELOPT_KERMIT\t\t\t= 47;  // Automatic Kermit file transfer - RFC 2840\nconstexpr uchar TELOPT_SEND_URL\t\t\t= 48;  // Send URL\nconstexpr uchar TELOPT_FORWARD_X\t\t= 49;  // X forwarding\nconstexpr uchar TELOPT_MCCP1            = 85;  // Mud Compression Protocol (v1)\nconstexpr uchar TELOPT_MCCP2            = 86;  // Mud Compression Protocol (v2)\nconstexpr uchar TELOPT_MSP              = 90;  // Mud Sound Protocol\nconstexpr uchar TELOPT_MXP              = 91;  // Mud eXtension Protocol\nconstexpr uchar TELOPT_ZMP\t\t\t\t= 93;\t// Zenith Mud Protocol\nconstexpr uchar TELOPT_PRAGMA_LOGON\t\t= 138; // Telnet option pragma logon\nconstexpr uchar TELOPT_SSPI_LOGON\t\t= 139; // Telnet option SSPI login\nconstexpr uchar TELOPT_PRAGMA_HEARTBEAT\t= 140; // Telnet option pragma heartbeat\nconstexpr uchar TELOPT_GMCP\t\t\t\t= 201; // Generic Mud Communication Protocol\nconstexpr uchar TELOPT_EXOPL\t\t\t= 255; // extended-options-list - RFC 861\n\n/* Option Subnegotiation Constants: */\nconstexpr uchar TELSUB_IS\t\t\t\t= 0;   // An option IS\nconstexpr uchar TELSUB_SEND\t\t\t\t= 1;   // Send an option\nconstexpr uchar TELSUB_INFO\t\t\t\t= 2;   // Environ: informational version of IS\nconstexpr uchar TELSUB_NAME\t\t\t\t= 3;\n\n/* Keyboard Command Characters: */\nconstexpr char TELKEY_LF\t\t\t\t= '\\n';\t// Line Feed\nconstexpr char TELKEY_CR\t\t\t\t= '\\r';\t// Carriage Return\nconstexpr char TELKEY_BEL\t\t\t\t= '\\a';\t// Bell (attention signal)\nconstexpr char TELKEY_BS\t\t\t\t= '\\b';\t// Back Space\nconstexpr char TELKEY_HT\t\t\t\t= '\\t';\t// Horizontal Tab\nconstexpr char TELKEY_VT\t\t\t\t= '\\v';\t// Vertical Tab\nconstexpr char TELKEY_FF\t\t\t\t= '\\f';\t// Form Feed\n\nenum TelnetOptionIndex : uchar {\n\tTELOPT_INDEX_NAWS,\n\tTELOPT_INDEX_TSPEED,\n\tTELOPT_INDEX_TTYPE,\n\tTELOPT_INDEX_NEW_ENVIRON,\n\tTELOPT_INDEX_LFLOW,\n\tTELOPT_INDEX_LINEMODE,\n\tTELOPT_INDEX_ECHO,\n\tTELOPT_INDEX_SERVER_SGA,\n\tTELOPT_INDEX_CLIENT_SGA,\n\tTELOPT_INDEX_SERVER_BIN,\n\tTELOPT_INDEX_CLIENT_BIN,\n\tTELOPT_INDEX_MAX\n};\n\nenum TelnetAction : uchar {\n\tTELACT_ABORT,\t// Abort Process\n\tTELACT_AO,\t\t// Abort Output\n\tTELACT_AYT,\t\t// Are You There\n\tTELACT_BREAK,\t// serial-line break\n\tTELACT_EC,\t\t// Erase Character\n\tTELACT_EL,\t\t// Erase Line\n\tTELACT_EOF,\t\t// end-of-file on session input\n\tTELACT_EOL,\t\t// Telnet end-of-line sequence (CRLF, as opposed to CR NUL that escapes a literal CR)\n\tTELACT_EOR,\t\t// End Of Record\n\tTELACT_GA,\t\t// Go Ahead\n\tTELACT_IP,\t\t// Interrupt Process\n\tTELACT_NOP,\t\t// transmit data with no effect\n\tTELACT_SUSP\t\t// Suspend Process\n};\n\nenum TelnetSide : uchar {\n\tTELNET_SERVER,\n\tTELNET_CLIENT\n};\n\n#define BIT_INACTIVE\t0x00\n#define BIT_ACTIVE\t\t0x01\n#define BIT_REQUESTED\t0x10\n\nenum TelnetOptionState {\n\tTELOPT_STATE_INACTIVE = BIT_INACTIVE,\n\tTELOPT_STATE_ACTIVE = BIT_ACTIVE,\n\tTELOPT_STATE_INACTIVE_REQUESTED = BIT_INACTIVE | BIT_REQUESTED,\n\tTELOPT_STATE_ACTIVE_REQUESTED = BIT_ACTIVE | BIT_REQUESTED \n};\n\nstruct TelnetOption {\n\tint nTelnetOption;\n\n\tTelnetSide eTelnetSide;\n\tTelnetOptionState eOptionState;\n\n\tTelnetOption() :\n\t  nTelnetOption(-1),\n\t  eTelnetSide(TELNET_SERVER),\n\t  eOptionState(TELOPT_STATE_INACTIVE)\n\t{}\n\n\tvoid Init(uchar _nTelnetOption, TelnetSide _eTelnetSide, TelnetOptionState _eOptionState)\n\t{\n\t\tnTelnetOption = _nTelnetOption;\n\t\teTelnetSide = _eTelnetSide;\n\t\teOptionState = _eOptionState;\n\t}\n};\ntypedef std::vector<TelnetOption> TelnetOptionVector;\ntypedef std::vector<TelnetOptionState> TelnetOptionStateVector;\n\nclass TelnetProtocol : public Protocol\n{\npublic:\n\tTelnetProtocol();\n\n\tstd::string GetCommandName(uchar chTelnetCmd);\n\tstd::string GetOptionName(uchar chTelnetOpt);\n\t\n\tTelnetOptionVector &GetOptionVector();\n};\n\n#endif // TELNETPROTOCOL_H"
  },
  {
    "path": "src/Pty/ConPty.cpp",
    "content": " /*\n * Copyright 2020, WindTerm.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"ConPty.h\"\n\n#include <QThread>\n\n#ifdef Q_OS_WIN\n#include <process.h>\n#endif\n\n#define CONPTY_MINIMAL_WINDOWS_VERSION 18309\n\nclass PipeThread : public QThread {\npublic:\n\tPipeThread(ConPty *conpty, LPVOID pipe)\n\t\t: QThread(conpty)\n\t\t, m_conpty(conpty)\n\t\t, m_pipe(pipe)\n\t{}\n\n\tvoid run() final {\n\t\tconstexpr DWORD BUFF_SIZE = 512;\n\t\tchar szBuffer[BUFF_SIZE];\n\n\t\twhile (isInterruptionRequested() == false) {\n\t\t\tif (isInterruptionRequested()) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tDWORD bytesRead;\n\t\t\tbool readSuccess = ReadFile(m_pipe, szBuffer, BUFF_SIZE, &bytesRead, NULL);\n\n\t\t\tif (readSuccess == false) {\n\t\t\t\tm_conpty->setErrorCode(GetLastError());\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (isInterruptionRequested()) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (readSuccess && bytesRead > 0) {\n\t\t\t\tm_conpty->appendBuffer(QByteArray(szBuffer, bytesRead));\n\t\t\t}\n\t\t}\n\t}\n\nprivate:\n\tConPty *m_conpty;\n\tLPVOID m_pipe;\n};\n\nConPty::ConPty(QObject *parent /*= nullptr*/)\n\t: m_inPipe(INVALID_HANDLE_VALUE)\n\t, m_outPipe(INVALID_HANDLE_VALUE)\n\t, m_pipeThread(nullptr)\n\t, m_ptyHandler(INVALID_HANDLE_VALUE)\n{}\n\nConPty::~ConPty() {\n\tstop();\n}\n\nvoid ConPty::appendBuffer(const QByteArray &buffer) {\n\tif (buffer.isEmpty() == false) {\n\t\t{\n\t\t\tThreadLocker<SpinMutex> locker(m_mutex);\n\t\t\tm_buffer.append(buffer);\n\t\t}\n\t\temit readyRead();\n\t}\n}\n\nHRESULT ConPty::createPseudoConsoleAndPipes(HPCON *phPC, HANDLE *phPipeIn, HANDLE *phPipeOut,\n\t\t\t\t\t\t\t\t\t\t\tqint16 rows, qint16 columns) {\n\tHRESULT hr = E_UNEXPECTED;\n\tHANDLE hPipePTYIn = INVALID_HANDLE_VALUE;\n\tHANDLE hPipePTYOut = INVALID_HANDLE_VALUE;\n\n\tif (CreatePipe(&hPipePTYIn, phPipeOut, NULL, 0) && CreatePipe(phPipeIn, &hPipePTYOut, NULL, 0)) {\n#if COMPILE_CONPTY_ENABLED\n\t\thr = CreatePseudoConsole({columns, rows}, hPipePTYIn, hPipePTYOut, 0, phPC);\n#endif\n\t\tif (INVALID_HANDLE_VALUE != hPipePTYOut) CloseHandle(hPipePTYOut);\n\t\tif (INVALID_HANDLE_VALUE != hPipePTYIn) CloseHandle(hPipePTYIn);\n\t}\n\treturn hr;\n}\n\nHRESULT ConPty::initStartupInfoAttachedToPseudoConsole(STARTUPINFOEX *pStartupInfo, HPCON hPC) {\n\tHRESULT hr = E_UNEXPECTED;\n\n\tif (pStartupInfo) {\n\t\tSIZE_T attrListSize;\n\n\t\tpStartupInfo->StartupInfo.cb = sizeof(STARTUPINFOEX);\n\n\t\tInitializeProcThreadAttributeList(NULL, 1, 0, &attrListSize);\n\n\t\tpStartupInfo->lpAttributeList = reinterpret_cast<LPPROC_THREAD_ATTRIBUTE_LIST>(malloc(attrListSize));\n\n\t\tif (pStartupInfo->lpAttributeList\n\t\t\t&& InitializeProcThreadAttributeList(pStartupInfo->lpAttributeList, 1, 0, &attrListSize)) {\n\t\t\thr = UpdateProcThreadAttribute(\n\t\t\t\tpStartupInfo->lpAttributeList,\n\t\t\t\t0,\n\t\t\t\tPROC_THREAD_ATTRIBUTE_PSEUDOCONSOLE,\n\t\t\t\thPC,\n\t\t\t\tsizeof(HPCON),\n\t\t\t\tNULL,\n\t\t\t\tNULL\n\t\t\t) ? S_OK : HRESULT_FROM_WIN32(GetLastError());\n\t\t} else {\n\t\t\thr = HRESULT_FROM_WIN32(GetLastError());\n\t\t}\n\t}\n\treturn hr;\n}\n\nbool ConPty::createProcess(QString command, const QString &arguments,\n\t\t\t\t\t\t   const QString &workingDirectory, const QStringList &environment,\n\t\t\t\t\t\t   qint16 rows, qint16 columns) {\n\tif (isAvailable() == false) {\n\t\tsetErrorString(tr(\"Windows 10 version below 1809 is not supported.\"));\n\t\treturn false;\n\t}\n\tstop();\n\n\tHRESULT hr = createPseudoConsoleAndPipes(&m_ptyHandler, &m_inPipe, &m_outPipe, rows, columns); \n\n\tif (hr == S_OK) {\n\t\tm_startupInfo = std::make_unique<STARTUPINFOEX>();\n\t\tm_processInformation = std::make_unique<PROCESS_INFORMATION>();\n\n\t\tm_pipeThread = new PipeThread(this, m_inPipe);\n\t\tm_pipeThread->start();\n\n\t\tif (initStartupInfoAttachedToPseudoConsole(m_startupInfo.get(), m_ptyHandler) == S_OK) {\n\t\t\tstd::wstring env = environment.join(QChar('\\0')).append(QChar('\\0')).toStdWString();\n\n\t\t\tif (arguments.isEmpty() == false) {\n\t\t\t\tcommand.append(\" \").append(arguments);\n\t\t\t}\n\n\t\t\tLPWSTR szCommand = new wchar_t[command.size() + 1];\n\t\t\tint commandLength = command.toWCharArray(szCommand);\n\t\t\tszCommand[commandLength] = '\\0';\n\n\t\t\thr = CreateProcess(\n\t\t\t\tNULL,\n\t\t\t\tszCommand,\n\t\t\t\tNULL,\n\t\t\t\tNULL,\n\t\t\t\tFALSE,\n\t\t\t\tEXTENDED_STARTUPINFO_PRESENT | CREATE_UNICODE_ENVIRONMENT,\n\t\t\t\tLPWSTR(env.data()),\n\t\t\t\tworkingDirectory.isEmpty() ? NULL : workingDirectory.toStdWString().c_str(),\n\t\t\t\t&m_startupInfo->StartupInfo,\n\t\t\t\tm_processInformation.get()\n\t\t\t) ? S_OK : GetLastError();\n\n\t\t\tdelete szCommand;\n\t\t\tszCommand = nullptr;\n\t\t}\n\t}\n\n\tif (hr == S_OK) {\n\t\tm_rows = rows;\n\t\tm_columns = columns;\n\n\t\tinstallWinProcessEventNotifier(m_processInformation->hProcess);\n\t} else {\n\t\tsetErrorCode(GetLastError());\n\t}\n\treturn true;\n}\n\nbool ConPty::isAvailable() {\n\tqint32 buildNumber = QSysInfo::kernelVersion().split(\".\").last().toInt();\n\treturn (buildNumber >= CONPTY_MINIMAL_WINDOWS_VERSION) ? true : false;\n}\n\nQByteArray ConPty::readAll() {\n\tThreadLocker<SpinMutex> locker(m_mutex);\n\treturn std::move(m_buffer);\n}\n\nbool ConPty::resizeWindow(qint16 rows, qint16 columns) {\n\tbool success = true;\n\n\tif (rows != m_rows && columns != m_columns) {\n#if COMPILE_CONPTY_ENABLED\n\t\tHRESULT hr = (m_ptyHandler != INVALID_HANDLE_VALUE)\n\t\t\t\t   ? ResizePseudoConsole(m_ptyHandler, { columns, rows })\n\t\t\t\t   : S_FALSE;\n\t\tsuccess = (hr == S_OK) ? true : false;\n#endif\n\t\tif (success) {\n\t\t\trows = m_rows;\n\t\t\tcolumns = m_columns;\n\t\t}\n\t}\n\tQ_ASSERT(success);\n\treturn success;\n}\n\nvoid ConPty::stop() {\n\tif (m_pipeThread) {\n\t\tm_pipeThread->requestInterruption();\n\t}\n\n\tif (m_processInformation) {\n\t\tuninstallWinProcessEventNotifier(m_processInformation->hProcess);\n\t\tCloseHandle(m_processInformation->hThread);\n\t\tCloseHandle(m_processInformation->hProcess);\n\t}\n\n\tif (m_startupInfo) {\n\t\tDeleteProcThreadAttributeList(m_startupInfo->lpAttributeList);\n\t\tfree(m_startupInfo->lpAttributeList);\n\t}\n\n\tif (m_ptyHandler != INVALID_HANDLE_VALUE) {\n#if COMPILE_CONPTY_ENABLED\n\t\tClosePseudoConsole(m_ptyHandler);\n#endif\n\t}\n\n\tif (m_inPipe != INVALID_HANDLE_VALUE) {\n\t\tCloseHandle(m_inPipe);\n\t}\n\n\tif (m_outPipe != INVALID_HANDLE_VALUE) {\n\t\tCloseHandle(m_outPipe);\n\t}\n\n\tif (m_pipeThread) {\n\t\tm_pipeThread->wait(1000);\n\t\tm_pipeThread->deleteLater();\n\t}\n}\n\nqint64 ConPty::write(const QByteArray &text) {\n\tDWORD bytesWritten;\n\n\tWriteFile(m_outPipe, text.data(), text.size(), &bytesWritten, NULL);\n\treturn bytesWritten;\n}\n"
  },
  {
    "path": "src/Pty/ConPty.h",
    "content": " /*\n * Copyright 2020, WindTerm.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef CONPTY_H\n#define CONPTY_H\n\n#pragma once\n\n#include \"Pty.h\"\n\n#ifdef Q_OS_WIN\n\t#include <windows.h>\n#endif // Q_OS_WIN\n\nclass PipeThread;\n\nclass ConPty\n\t: public Pty\n{\n\tQ_OBJECT\n\npublic:\n\tConPty(QObject *parent = nullptr);\n\tvirtual ~ConPty();\n\n\tvoid appendBuffer(const QByteArray &buffer);\n\tbool createProcess(QString command, const QString &arguments,\n\t\t\t\t\t   const QString &workingDirectory, const QStringList &environment,\n\t\t\t\t\t   qint16 rows, qint16 columns) final;\n\tstatic bool isAvailable();\n\tQByteArray readAll() final;\n\tbool resizeWindow(qint16 rows, qint16 columns) final;\n\tqint64 write(const QByteArray &text) final;\n\nprivate:\n\tHRESULT createPseudoConsoleAndPipes(HPCON *phPC, HANDLE *phPipeIn, HANDLE *phPipeOut, qint16 rows, qint16 columns);\n\tHRESULT initStartupInfoAttachedToPseudoConsole(STARTUPINFOEX *pStartupInfo, HPCON hPC);\n\tvoid stop();\n\nprivate:\n\tQ_DISABLE_COPY(ConPty)\n\n\tQByteArray m_buffer;\n\tPipeThread *m_pipeThread;\n\n\tHANDLE m_inPipe;\n\tHANDLE m_outPipe;\n\tHPCON m_ptyHandler;\n\tstd::unique_ptr<PROCESS_INFORMATION> m_processInformation;\n\tstd::unique_ptr<STARTUPINFOEX> m_startupInfo;\n};\n\n#endif // CONPTY_H"
  },
  {
    "path": "src/Pty/Pty.cpp",
    "content": " /*\n * Copyright 2020, WindTerm.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"Pty.h\"\n\n#ifdef Q_OS_WIN\n\t#include <windows.h>\n\t#include <QWinEventNotifier>\n#endif // Q_OS_WIN\n\nPty::Pty()\n\t: m_columns(-1)\n\t, m_errorCode(0)\n\t, m_rows(-1)\n#ifdef Q_OS_WIN\n\t, m_winProcessEventNotifier(nullptr)\n#endif\n{}\n\nQString Pty::errorString() {\n\tThreadLocker<SpinMutex> locker(m_mutex);\n\treturn std::move(m_errorString);\n}\n\n#ifdef Q_OS_WIN\nvoid Pty::installWinProcessEventNotifier(void *handle) {\n\tif (m_winProcessEventNotifier == nullptr) {\n\t\tm_winProcessEventNotifier = new QWinEventNotifier(handle, this);\n\n\t\tconnect(m_winProcessEventNotifier, &QWinEventNotifier::activated, this, [this](HANDLE handle) {\n\t\t\tif (handle) {\n\t\t\t\tDWORD exitCode;\n\n\t\t\t\tif (GetExitCodeProcess(handle, &exitCode)) {\n\t\t\t\t\tsetErrorString(QString(\"Process exited with code %1\").arg(\n\t\t\t\t\t\tQString::number(exitCode, (exitCode >= 0xFF) ? 16 : 10).prepend((exitCode >= 0xFF) ? \"0x\" : \"\")\n\t\t\t\t\t));\n\t\t\t\t}\n\t\t\t\tm_winProcessEventNotifier->setEnabled(false);\n\t\t\t}\n\t\t});\n\t}\n\n\tif (m_winProcessEventNotifier->handle() != handle) {\n\t\tm_winProcessEventNotifier->setHandle(handle);\n\t\tm_winProcessEventNotifier->setEnabled(true);\n\t}\n}\n#endif\n\nvoid Pty::setErrorCode(int errorCode) {\n\tconstexpr int bufferLength = 512;\n\twchar_t buffer[bufferLength];\n\n\tFormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, errorCode,\n\t\t\t\t  LANG_NEUTRAL, buffer, bufferLength, NULL);\n\n\tQString lastError = QString::fromWCharArray(buffer);\n\tsetErrorString(lastError);\n\n\tm_errorCode = errorCode;\n}\n\nvoid Pty::setErrorString(const QString &errorString) {\n\tif (errorString.isEmpty() == false) {\n\t\t{\n\t\t\tThreadLocker<SpinMutex> locker(m_mutex);\n\t\t\tm_errorString = errorString;\t\n\t\t}\n\t\temit errorOccurred();\n\t}\n}\n\n#ifdef Q_OS_WIN\nvoid Pty::uninstallWinProcessEventNotifier(void *handle) {\n\tif (m_winProcessEventNotifier != nullptr\n\t\t&& m_winProcessEventNotifier->handle() == handle) {\n\t\tm_winProcessEventNotifier->deleteLater();\n\t\tm_winProcessEventNotifier = nullptr;\n\t}\n}\n#endif\n"
  },
  {
    "path": "src/Pty/Pty.h",
    "content": " /*\n * Copyright 2020, WindTerm.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef PTY_H\n#define PTY_H\n\n#include <QObject>\n\n#include \"Public/Spin.h\"\n\nclass QWinEventNotifier;\n\nclass Pty\n\t: public QObject\n{\n\tQ_OBJECT\n\npublic:\n\tPty();\n\tvirtual ~Pty() = default;\n\n\tvirtual bool createProcess(QString command, const QString &arguments,\n\t\t\t\t\t\t\t   const QString &workingDirectory, const QStringList &environment,\n\t\t\t\t\t\t\t   qint16 rows, qint16 columns) = 0;\n\tint errorCode() const { return m_errorCode; }\n\tQString errorString();\n\tvirtual QByteArray readAll() = 0;\t\n\tvirtual bool resizeWindow(qint16 rows, qint16 columns) = 0;\n\tvoid setErrorCode(int errorCode);\n\tvoid setErrorString(const QString &errorString);\n\tvirtual qint64 write(const QByteArray &text) = 0;\n\nprotected:\n#ifdef Q_OS_WIN\n\tvoid installWinProcessEventNotifier(void *handle);\n\tvoid uninstallWinProcessEventNotifier(void *handle);\n#endif\n\nQ_SIGNALS:\n\tvoid errorOccurred();\n\tvoid readyRead();\n\nprotected:\n\tSpinMutex m_mutex;\n\n\tqint16 m_columns;\n\tqint16 m_rows;\n\nprivate:\n\tQ_DISABLE_COPY(Pty)\n\n\tint m_errorCode;\n\tQString m_errorString;\n\n#ifdef Q_OS_WIN\n\tQWinEventNotifier *m_winProcessEventNotifier;\n#endif\n};\n\n#endif // PTY_H\n"
  },
  {
    "path": "src/Pty/UnixPty.cpp",
    "content": " /*\n * Copyright 2020, WindTerm.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#include \"UnixPty.h\"\n#ifdef Q_OS_UNIX\n\n#include <QFileInfo>\n#include <QThread>\n\n#include <errno.h>\n#include <utmpx.h>\n#include <fcntl.h>\n#include <sys/ioctl.h>\n#include <unistd.h>\n#include <stdlib.h>\n\nconstexpr int BUFFER_SIZE\t= 0x800; // 2048 bytes\n\nShellProcess::ShellProcess()\n\t: QProcess()\n\t, m_handleMaster(-1)\n\t, m_handleSlave(-1)\n{\n\tsetProcessChannelMode(QProcess::MergedChannels);\n}\n\nvoid ShellProcess::setupChildProcess() {\n\tdup2(m_handleSlave, STDIN_FILENO);\n\tdup2(m_handleSlave, STDOUT_FILENO);\n\tdup2(m_handleSlave, STDERR_FILENO);\n\n\tpid_t sid = setsid();\n\tioctl(m_handleSlave, TIOCSCTTY, 0);\n\ttcsetpgrp(m_handleSlave, sid);\n\n\tstruct utmpx utmpxInfo;\n\tmemset(&utmpxInfo, 0, sizeof(utmpxInfo));\n\n\tstrncpy(utmpxInfo.ut_user, qgetenv(\"USER\"), sizeof(utmpxInfo.ut_user));\n\n\tQString device(m_handleSlaveName);\n\tif (device.startsWith(\"/dev/\")) {\n\t\tdevice = device.mid(5);\n\t}\n\tconst char *d = device.toLatin1().constData();\n\tstrncpy(utmpxInfo.ut_line, d, sizeof(utmpxInfo.ut_line));\n\tstrncpy(utmpxInfo.ut_id, d + strlen(d) - sizeof(utmpxInfo.ut_id), sizeof(utmpxInfo.ut_id));\n\n\tstruct timeval tv;\n\tgettimeofday(&tv, 0);\n\tutmpxInfo.ut_tv.tv_sec = tv.tv_sec;\n\tutmpxInfo.ut_tv.tv_usec = tv.tv_usec;\n\n\tutmpxInfo.ut_type = USER_PROCESS;\n\tutmpxInfo.ut_pid = getpid();\n\n\tutmpxname(_PATH_UTMPX);\n\tsetutxent();\n\tpututxline(&utmpxInfo);\n\tendutxent();\n\n#if !defined(Q_OS_UNIX)\n\tupdwtmpx(_PATH_UTMPX, &loginInfo);\n#endif\n}\n\nUnixPty::UnixPty(QObject *parent /*= nullptr*/)\n\t: Pty(parent)\n\t, m_pid(0)\n\t, m_readMasterNotify(nullptr)\n{\n\tm_buffer = static_cast<char *>(malloc(BUFFER_SIZE));\n}\n\nUnixPty::~UnixPty() {\n\tstop();\n\n\tfree(m_buffer);\n\tm_buffer = nullptr;\n}\n\nbool UnixPty::createProcess(QString command, const QString &arguments,\n\t\t\t\t\t\t\tconst QString &workingDirectory, const QProcessEnvironment &environment,\n\t\t\t\t\t\t\tint rows, int columns) {\n\tif (m_shellProcess.state() == QProcess::Running) {\n\t\treturn false;\n\t}\n\n\tQFileInfo fileInfo(command);\n\tif (fileInfo.isRelative() || fileInfo.exists() == false) {\n\t\tsetErrorString(tr(\"UnixPty: shell file path must be absolute\"));\n\t\treturn false;\n\t}\n\n\tbool success = false;\n\tdo {\n\t\tint result = 0;\n\n\t\tm_shellProcess.m_handleMaster = ::posix_openpt(O_RDWR | O_NOCTTY);\n\t\tif (m_shellProcess.m_handleMaster < 0) {\n\t\t\tsetError(\"Unable to open master\");\n\t\t\tbreak;\n\t\t}\n\n\t\tm_shellProcess.m_handleSlaveName = ptsname(m_shellProcess.m_handleMaster);\n\t\tif (m_shellProcess.m_handleSlaveName.isEmpty()) {\n\t\t\tsetError(\"Unable to get slave name\");\n\t\t\tbreak;\n\t\t}\n\n\t\tresult = grantpt(m_shellProcess.m_handleMaster);\n\t\tif (result != 0) {\n\t\t\tsetError(\"Unable to change perms for slave\");\n\t\t\tbreak;\n\t\t}\n\n\t\tresult = unlockpt(m_shellProcess.m_handleMaster);\n\t\tif (result != 0) {\n\t\t\tsetError(\"Unable to unlock slave\");\n\t\t\tbreak;\n\t\t}\n\n\t\tm_shellProcess.m_handleSlave = ::open(m_shellProcess.m_handleSlaveName.toLatin1().data(), O_RDWR | O_NOCTTY);\n\t\tif (m_shellProcess.m_handleSlave < 0) {\n\t\t\tsetError(\"Unable to open slave\");\n\t\t\tbreak;\n\t\t}\n\n\t\tint flags = fcntl(m_shellProcess.m_handleMaster, F_GETFL, 0);\n\t\tresult = fcntl(m_shellProcess.m_handleMaster, F_SETFL, flags | O_NONBLOCK);\n\t\tif (result == -1) {\n\t\t\tsetError(\"Unable to set non-blocking mode for master\");\n\t\t\tbreak;\n\t\t}\n\n\t\tresult = fcntl(m_shellProcess.m_handleMaster, F_SETFD, FD_CLOEXEC);\n\t\tif (result == -1) {\n\t\t\tsetError(\"Unable to set flags for master\");\n\t\t\tbreak;\n\t\t}\n\n\t\tresult = fcntl(m_shellProcess.m_handleSlave, F_SETFD, FD_CLOEXEC);\n\t\tif (result == -1) {\n\t\t\tsetError(\"Unable to set flags for slave\");\n\t\t\tbreak;\n\t\t}\n\n\t\tstruct ::termios ttmode;\n\t\tif (terminalAttributes(&ttmode) == false) {\n\t\t\tbreak;\n\t\t}\n\t\tttmode.c_iflag |= IXON;\n\t\tttmode.c_iflag |= IUTF8;\n\t\tttmode.c_lflag |= ECHO;\n\n#ifdef Q_OS_MACOS\n\t\tttmode.c_cc[VDSUSP] = 25;\n\t\tttmode.c_cc[VSTATUS] = 20;\n#endif\n\t\tif (setTerminalAttributes(&ttmode) == false) {\n\t\t\tbreak;\n\t\t}\n\n\t\tm_readMasterNotify = new QSocketNotifier(m_shellProcess.m_handleMaster, QSocketNotifier::Read, &m_shellProcess);\n\t\tm_readMasterNotify->setEnabled(true);\n\t\tm_readMasterNotify->moveToThread(m_shellProcess.thread());\n\n\t\tQObject::connect(m_readMasterNotify, &QSocketNotifier::activated, [this](int socket) {\n\t\t\tQ_UNUSED(socket)\n\t\t\tint readSize = 0;\n\t\t\tQByteArray readData;\n\n\t\t\tdo {\n\t\t\t\treadSize = ::read(m_shellProcess.m_handleMaster, m_buffer, BUFFER_SIZE);\n\n\t\t\t\tif (readSize == -1) {\n\t\t\t\t\tif (errno == EAGAIN) {\n\t\t\t\t\t\tQThread::yieldCurrentThread();\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treadData.append(QByteArray::fromRawData(m_buffer, readSize));\n\t\t\t} while (readSize == BUFFER_SIZE || (readSize == -1 && errno == EAGAIN)); //last data block always < readSize\n\n\t\t\tif (readData.isEmpty() == false) {\n\t\t\t\tm_shellReadBuffer.append(readData);\n\t\t\t\temit readyRead();\n\t\t\t}\n\t\t});\n\n\t\tm_shellProcess.setWorkingDirectory(workingDirectory);\n\t\tm_shellProcess.setProcessEnvironment(environment);\n\t\tm_shellProcess.setReadChannel(QProcess::StandardOutput);\n\t\tm_shellProcess.start(command, arguments.isEmpty() ? QStringList() : QStringList(arguments));\n\t\tm_shellProcess.waitForStarted();\n\n\t\tm_pid = m_shellProcess.processId();\n\t\tsuccess = resizeWindow(rows, columns);\n\t} while(0);\n\n\tif (success == false) {\n\t\tstop();\n\t}\n\tQ_ASSERT(success == true);\n\treturn success;\n}\n\nbool UnixPty::resizeWindow(int rows, int columns) {\n\tif (rows != m_rows || columns != m_columns) {\n\t\tbool success = false;\n\t\tstruct winsize winSize;\n\n\t\tmemset(&winSize, 0, sizeof(winSize));\n\t\twinSize.ws_row = static_cast<quint16>(rows);\n\t\twinSize.ws_col = static_cast<quint16>(columns);\n\n\t\tif (ioctl(m_shellProcess.m_handleMaster, TIOCSWINSZ, &winSize) == 0\n\t\t\t&& ioctl(m_shellProcess.m_handleSlave, TIOCSWINSZ, &winSize) == 0) {\n\t\t\tm_rows = rows;\n\t\t\tm_columns = columns;\n\t\t\tsuccess = true;\n\t\t}\n\t\treturn success;\n\t}\n\treturn true;\n}\n\nvoid UnixPty::setError(const char *error) {\n\tPty::setErrorString(QString(\"%1: %2 -> %3\").arg(tr(\"UnixPty\"), tr(error), strerror(errno)));\n}\n\nbool UnixPty::setTerminalAttributes(struct ::termios *ttmode) {\n\tQ_ASSERT(m_shellProcess.m_handleMaster >= 0);\n\tint result = -1;\n\n\tif (m_shellProcess.m_handleMaster >=0) {\n\t\tresult = tcsetattr(m_shellProcess.m_handleMaster, TCSANOW, ttmode);\n\n\t\tif (result != 0) {\n\t\t\tsetError(\"Unable to set terminal attributes\");\n\t\t}\n\t}\n\treturn (result == 0);\n}\n\nvoid UnixPty::stop() {\n\tm_shellProcess.m_handleSlaveName = QString();\n\n\tif (m_shellProcess.m_handleSlave >= 0) {\n\t\t::close(m_shellProcess.m_handleSlave);\n\t\tm_shellProcess.m_handleSlave = -1;\n\t}\n\n\tif (m_shellProcess.m_handleMaster >= 0) {\n\t\t::close(m_shellProcess.m_handleMaster);\n\t\tm_shellProcess.m_handleMaster = -1;\n\t}\n\n\tif (m_shellProcess.state() == QProcess::Running) {\n\t\tm_readMasterNotify->disconnect();\n\t\tm_readMasterNotify->deleteLater();\n\n\t\tm_shellProcess.terminate();\n\t\tm_shellProcess.waitForFinished(1000);\n\n\t\tif (m_shellProcess.state() == QProcess::Running) {\n\t\t\tQProcess::startDetached(QString(\"kill -9 %1\").arg(m_pid));\n\t\t\tm_shellProcess.kill();\n\t\t\tm_shellProcess.waitForFinished(1000);\n\t\t}\n\t\tQ_ASSERT(m_shellProcess.state() == QProcess::NotRunning);\n\t}\n}\n\nbool UnixPty::terminalAttributes(struct ::termios *ttmode) {\n\tQ_ASSERT(m_shellProcess.m_handleMaster >= 0);\n\tint result = -1;\n\n\tif (m_shellProcess.m_handleMaster >= 0) {\n\t\tresult = tcgetattr(m_shellProcess.m_handleMaster, ttmode);\n\n\t\tif (result != 0) {\n\t\t\tsetError(\"Unable to get terminal attributes\");\n\t\t}\n\t}\n\treturn (result == 0);\n}\n\nQByteArray UnixPty::readAll() {\n\tQByteArray shellReadBuffer = m_shellReadBuffer;\n\n\tm_shellReadBuffer.clear();\n\treturn shellReadBuffer;\n}\n\nqint64 UnixPty::write(const QByteArray &text) {\n\tint writeSize = ::write(m_shellProcess.m_handleMaster, text.constData(), text.size());\n\tQ_ASSERT(writeSize == text.size());\n\n\tif (writeSize == -1) {\n\t\tsetError(\"Unable to write output\");\n\t}\n\treturn writeSize;\n}\n\nbool UnixPty::isAvailable() {\n\treturn true;\n}\n\nvoid UnixPty::moveToThread(QThread *targetThread) {\n\tm_shellProcess.moveToThread(targetThread);\n}\n\n#endif // Q_OS_UNIX"
  },
  {
    "path": "src/Pty/UnixPty.h",
    "content": " /*\n * Copyright 2020, WindTerm.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n#ifndef UNIXPTY_H\n#define UNIXPTY_H\n\n#pragma once\n\n#include <QtGlobal>\n\n#ifdef Q_OS_UNIX\n\n#include \"Pty.h\"\n#include <QProcess>\n#include <QSocketNotifier>\n\n#include <termios.h>\n\nclass ShellProcess\n\t: public QProcess\n{\n    Q_OBJECT\n\npublic:\n\tShellProcess();\n\nprivate:\n\tvoid setupChildProcess() final;\n\nprivate:\n\tint m_handleMaster;\n\tint m_handleSlave;\n    QString m_handleSlaveName;\n\nprivate:\n\tfriend class UnixPty;\n};\n\nclass UnixPty\n\t: public Pty\n{\npublic:\n\tUnixPty(QObject *parent = nullptr);\n    virtual ~UnixPty();\n\n\tbool createProcess(QString command, const QString &arguments,\n\t\t\t\t\t   const QString &workingDirectory, const QProcessEnvironment &environment,\n\t\t\t\t\t   int rows, int columns) final;\n\tstatic bool isAvailable();\n\tbool resizeWindow(int rows, int columns) final;\n    QByteArray readAll() final;\n\tqint64 write(const QByteArray &text) final;\n\nprivate:\n\tvoid moveToThread(QThread *targetThread);\n\tvoid setError(const char *error);\n\tbool setTerminalAttributes(struct ::termios *ttmode);\n\tvoid stop();\n\tbool terminalAttributes(struct ::termios *ttmode);\n\nprivate:\n\tqint64 m_pid;\n\tShellProcess m_shellProcess;\n\tQSocketNotifier *m_readMasterNotify;\n\n\tchar *m_buffer;\n\tQByteArray m_shellReadBuffer;\n};\n\n#endif // Q_OS_UNIX\n#endif // UNIXPTY_H\n"
  },
  {
    "path": "src/Pty/WinPty.cpp",
    "content": " /*\n * Copyright 2020, WindTerm.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"WinPty.h\"\n\n#include <QFileInfo>\n#include <QLocalSocket>\n#include <QCoreApplication>\n\n#include <sstream>\n\nconst char *WINPTY_AGENT_NAME\t= \"winpty-agent.exe\";\nconst char *WINPTY_DLL_NAME\t\t= \"winpty.dll\";\n\nQString castErrorToString(winpty_error_ptr_t error_ptr) {\n\treturn QString::fromStdWString(winpty_error_msg(error_ptr));\n}\n\nWinPty::WinPty(QObject *parent /*= nullptr*/)\n\t: m_ptyHandler(nullptr)\n\t, m_innerHandle(INVALID_HANDLE_VALUE)\n\t, m_outSocket(nullptr)\n\t, m_inSocket(nullptr)\n{}\n\nWinPty::~WinPty() {\n\tstop();\n}\n\nbool WinPty::createProcess(QString command, const QString &arguments,\n\t\t\t\t\t\t   const QString &workingDirectory, const QStringList &environment,\n\t\t\t\t\t\t   qint16 rows, qint16 columns) {\n\tbool success = false;\n\twinpty_error_ptr_t errorPtr = nullptr;\n\tQString errorString;\n\n\tdo {\n\t\tstop();\n\n\t\tif (isAvailable() == false) {\n\t\t\terrorString = tr(\"Winpty-agent.exe or winpty.dll not found!.\");\n\t\t\tbreak;\n\t\t}\n\t\tcommand = command.trimmed();\n\n\t\tif (command.startsWith(\"\\\"\") && command.endsWith(\"\\\"\")) {\n\t\t\tcommand.remove(command.length() - 1, 1);\n\t\t\tcommand.remove(0, 1);\n\t\t}\n\n\t\tQString commandWithArguments = command;\n\n\t\tif (commandWithArguments.contains(' ')) {\n\t\t\tcommandWithArguments.prepend(\"\\\"\").append(\"\\\"\");\n\t\t}\n\n\t\tif (arguments.isEmpty() == false) {\n\t\t\tcommandWithArguments.append(\" \").append(arguments);\n\t\t}\n\t\tstd::wstring env = environment.join(QChar('\\0')).append(QChar('\\0')).toStdWString();\n\t\twinpty_config_t* startConfig = winpty_config_new(0, &errorPtr);\n\n\t\tif (startConfig == nullptr) {\n\t\t\terrorString = QString(\"WinPty Error: create start config -> %1\").arg(castErrorToString(errorPtr));\n\t\t\tbreak;\n\t\t}\n\t\twinpty_config_set_initial_size(startConfig, columns, rows);\n\t\twinpty_config_set_mouse_mode(startConfig, WINPTY_MOUSE_MODE_AUTO);\n\n\t\tm_ptyHandler = winpty_open(startConfig, &errorPtr);\n\t\twinpty_config_free(startConfig);\n\n\t\tif (m_ptyHandler == nullptr) {\n\t\t\terrorString = QString(\"WinPty Error: start agent -> %1\").arg(castErrorToString(errorPtr));\n\t\t\tbreak;\n\t\t}\n\n\t\tQString m_conInName = QString::fromWCharArray(winpty_conin_name(m_ptyHandler));\n\t\tQString m_conOutName = QString::fromWCharArray(winpty_conout_name(m_ptyHandler));\n\t\tm_outSocket = std::make_unique<QLocalSocket>();\n\t\tm_inSocket = std::make_unique<QLocalSocket>();\n\n\t\tm_outSocket->connectToServer(m_conInName, QIODevice::WriteOnly);\n\t\tm_outSocket->waitForConnected();\n\n\t\tm_inSocket->connectToServer(m_conOutName, QIODevice::ReadOnly);\n\t\tm_inSocket->waitForConnected();\n\n\t\tif (m_outSocket->state() != QLocalSocket::ConnectedState\n\t\t\t&& m_inSocket->state() != QLocalSocket::ConnectedState) {\n\t\t\terrorString = QString(\"WinPty Error: Unable to connect local sockets -> %1 / %2\")\n\t\t\t\t\t\t\t\t  .arg(m_outSocket->errorString())\n\t\t\t\t\t\t\t\t  .arg(m_inSocket->errorString());\n\n\t\t\tm_inSocket.reset(nullptr);\n\t\t\tm_outSocket.reset(nullptr);\n\t\t\tbreak;\n\t\t}\n\n\t\tconnect(m_inSocket.get(), &QLocalSocket::readyRead, this, [this]() {\n\t\t\temit readyRead();\n\t\t});\n\n\t\twinpty_spawn_config_t* spawnConfig = winpty_spawn_config_new(\n\t\t\tWINPTY_SPAWN_FLAG_AUTO_SHUTDOWN,\n\t\t\tcommand.toStdWString().c_str(),\n\t\t\tcommandWithArguments.toStdWString().c_str(),\n\t\t\tworkingDirectory.isEmpty() ? NULL : workingDirectory.toStdWString().c_str(),\n\t\t\tenv.c_str(),\n\t\t\t&errorPtr\n\t\t);\n\n\t\tif (spawnConfig == nullptr) {\n\t\t\terrorString = QString(\"WinPty Error: create spawn config -> %1\").arg(castErrorToString(errorPtr));\n\t\t\tbreak;\n\t\t}\n\n\t\tBOOL spawnSuccess = winpty_spawn(m_ptyHandler, spawnConfig, &m_innerHandle, nullptr, nullptr, &errorPtr);\n\t\twinpty_spawn_config_free(spawnConfig);\n\n\t\tif (spawnSuccess == FALSE) {\n\t\t\terrorString = QString(\"WinPty Error: start terminal process -> %1\").arg(castErrorToString(errorPtr));\n\t\t\tbreak;\n\t\t}\n\t\tsuccess = true;\n\t} while (0);\n\n\tif (errorString.isEmpty() == false) {\n\t\tQ_ASSERT(success == false);\n\n\t\twinpty_error_free(errorPtr);\n\t\tsetErrorString(errorString);\n\t}\n\n\tif (success) {\n\t\tm_columns = columns;\n\t\tm_rows = rows;\n\n\t\tinstallWinProcessEventNotifier(m_innerHandle);\n\t}\n\treturn success;\n}\n\nQByteArray WinPty::readAll() {\n\tQByteArray buffer;\n\n\tif (m_inSocket) {\n\t\tbuffer = m_inSocket->readAll();\n\t\tQ_ASSERT(buffer.isEmpty() == false);\n\t}\n\treturn buffer;\n}\n\nbool WinPty::resizeWindow(qint16 rows, qint16 columns) {\n\tbool success = true;\n\n\tif (rows != m_rows && columns != m_columns) {\n\t\tsuccess = m_ptyHandler ? winpty_set_size(m_ptyHandler, columns, rows, nullptr) : false;\n\n\t\tif (success) {\n\t\t\tm_rows = rows;\n\t\t\tm_columns = columns;\n\t\t}\n\t}\n\tQ_ASSERT(success);\n\treturn success;\n}\n\nvoid WinPty::stop() {\n\tif (m_ptyHandler != nullptr) {\n\t\twinpty_free(m_ptyHandler);\n\t\tm_ptyHandler = nullptr;\n\t}\n\n\tif (m_innerHandle != INVALID_HANDLE_VALUE) {\n\t\tuninstallWinProcessEventNotifier(m_innerHandle);\n\t\tCloseHandle(m_innerHandle);\n\t\tm_innerHandle = INVALID_HANDLE_VALUE;\n\t}\n\n\tm_outSocket.reset(nullptr);\n\tm_inSocket.reset(nullptr);\n}\n\nqint64 WinPty::write(const QByteArray &text) {\n\tqint64 bytesWritten = -1;\n\n\tif (m_outSocket) {\n\t\tbytesWritten = m_outSocket->write(text);\n\t\tQ_ASSERT(bytesWritten != -1);\n\t}\n\treturn bytesWritten;\n}\n\nbool WinPty::isAvailable() {\n\treturn QFile::exists(QCoreApplication::applicationDirPath() + \"/\" + WINPTY_AGENT_NAME)\n\t\t&& QFile::exists(QCoreApplication::applicationDirPath() + \"/\" + WINPTY_DLL_NAME);\n}"
  },
  {
    "path": "src/Pty/WinPty.h",
    "content": " /*\n * Copyright 2020, WindTerm.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef WINPTY_H\n#define WINPTY_H\n\n#pragma once\n\n#include \"Pty.h\"\n\n#ifdef Q_OS_WIN\n\t#include <windows.h>\n#endif // Q_OS_WIN\n\n#include \"winpty_api.h\"\n\nclass QLocalSocket;\n\nclass WinPty\n\t: public Pty\n{\n\tQ_OBJECT\n\npublic:\n\tWinPty(QObject *parent = nullptr);\n\tvirtual ~WinPty();\n\n\tbool createProcess(QString command, const QString &arguments,\n\t\t\t\t\t   const QString &workingDirectory, const QStringList &environment,\n\t\t\t\t\t   qint16 rows, qint16 columns) final;\n\tstatic bool isAvailable();\n\tQByteArray readAll() final;\n\tbool resizeWindow(qint16 rows, qint16 columns) final;\n\tqint64 write(const QByteArray &text) final;\n\nprivate:\n\tvoid stop();\n\nprivate:\n\tQ_DISABLE_COPY(WinPty)\n\n\twinpty_t *m_ptyHandler;\n\tHANDLE m_innerHandle;\n\tstd::unique_ptr<QLocalSocket> m_inSocket;\n\tstd::unique_ptr<QLocalSocket> m_outSocket;\n};\n\n#endif // WINPTY_H"
  },
  {
    "path": "src/Pty/ptyqt LICENSE",
    "content": "MIT License\n\nCopyright (c) 2019 Vitaly Petrov\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "src/README.md",
    "content": "**Important: WindTerm is a partial open source project, and the source will be gradually opened.**\n\n**All released source codes (except thirdparty directory) are provided under the terms of Apache-2.0 license.**\n\n# Components\n\nBelow is a list of (some) WindTerm components in alphabetical order, along with a brief description of each.\n\n## Libssh\n\nAn improved version based on libssh 0.95. Add support for pageant, external socket, and hmac-md5-96, hmac-sha1-96-etm@openssh.com, hmac-sha1-96, hmac-md5-96-etm@openssh.com. \n\n## Onigmo\n\nAn improved version based on Onigmo 5.13.5. In particular, **the addition of iterator makes it possible to match gap buffer or nonadjacent memory blocks.** Please refer to the sample files for how to use.\n\n## Pty\n\nAn improved version based on [ptyqt](https://github.com/kafeg/ptyqt). **Almost all the code was rewritten to make the pty more robust and stable.**\n\n## Protocol/TelentProtocol.h/cpp\n\nAn implementation of Telnet protocol.\n\n## Utility/CircularBuffer.h\n\nA quick circular buffer template class.\n\n## Utility/Cryptographic.h/cpp\n\nA very safe encryption class using the PBKDF2-algorithm as defined in RFC 8018. WindTerm uses this class together with the user's master password to protect user data, including passwords, private keys and so on.\n\n## Utility/MemoryPointer.h\n\nA smart memory pointer.\n\n## Utility/ScopeGuard.h\n\nA class of which the sole purpose is to run the function f in its destructor. This is useful for guaranteeing your cleanup code is executed.\n\n## Utility/Spin.h\n\nA high-performance spin mutex and locker.\n\n## Utility/ThreadLocal.h/cpp\n\nA high-performance thread local storage.\n\n## Widgets/PopupWidget.h/cpp\n\nA popup widget.\n\n## Widgets/Scrollbar.h/cpp\n\nA scrollbar supports 64-bit ranges.\n\n## Widgets/Splitter.h/cpp\n\nA convenient splitter for showing and hiding widgets."
  },
  {
    "path": "src/Utility/CircularBuffer.h",
    "content": " /*\n * Copyright 2020, WindTerm.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef CIRCULARBUFFER_H\n#define CIRCULARBUFFER_H\n\n#pragma once\n\n#include <QtAlgorithms>\n#include <QtGlobal>\n\n#define ROUND_UP_POW2(value)\t{ (1 << (32 - qCountLeadingZeroBits(value))) }\n\ntemplate <typename T>\nclass CircularBuffer {\npublic:\n\tCircularBuffer(quint32 capacity)\n\t\t: m_currentIndex(0) {\n\t\tQ_ASSERT(capacity < (1 << 31));\n\n\t\tm_capacity = ROUND_UP_POW2(capacity);\n\t\tm_mask = m_capacity - 1;\n\t\tm_buffer = static_cast<qint64 *>(calloc(m_capacity, sizeof(qint64)));\n\n\t\tclear();\n\t}\n\n\t~CircularBuffer() {\n\t\tfree(m_buffer);\n\t\tm_buffer = nullptr;\n\t}\n\n\tvoid append(const T &value) {\n\t\tm_buffer[++m_currentIndex & m_mask] = value;\n\t}\n\n\tconst T &at(qint64 index) const {\n\t\tQ_ASSERT(index >= std::max<qint64>(0, m_currentIndex + 1 - m_capacity) && index <= m_currentIndex);\n\t\treturn m_buffer[index & m_mask];\n\t}\n\n\tint capacity() const { return m_capacity; }\n\tvoid clear() {\n\t\tm_currentIndex = -1;\n\t\tmemset(m_buffer, 0xFF, m_capacity * sizeof(qint64));\n\n#ifdef _DEBUG\n\t\tfor (int i = 0; i < m_capacity; i++) {\n\t\t\tQ_ASSERT(m_buffer[i] == -1);\n\t\t}\n#endif // _DEBUG\n\t}\n\n\tqint64 currentIndex() const { return m_currentIndex; }\n\tqint64 minIndex() const { return std::max<qint64>(0, m_currentIndex + 1 - m_capacity); }\n\n\tconst T &operator [](qint64 index) const {\n\t\tQ_ASSERT(index >= std::max<qint64>(0, m_currentIndex + 1 - m_capacity) && index <= m_currentIndex);\n\t\treturn m_buffer[index & m_mask];\n\t}\n\nprivate:\n\tT *m_buffer;\n\tqint64 m_currentIndex;\n\n\tint m_capacity;\n\tint m_mask;\n};\n\nclass Int64CircularBuffer : public CircularBuffer<qint64> {\npublic:\n\tInt64CircularBuffer(quint32 capacity)\n\t\t: CircularBuffer<qint64>(capacity)\n\t{}\n};\n\n#endif // CIRCULARBUFFER_H"
  },
  {
    "path": "src/Utility/Cryptographic.cpp",
    "content": " /*\n * Copyright 2020, WindTerm.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"Cryptographic.h\"\n\n#include <QByteArray>\n#include <qpassworddigestor.h>\n#include <QRandomGenerator>\n\n#include \"openssl/evp.h\"\n\nconstexpr int AES_256_IV_LENGTH\t\t\t= 16;\nconstexpr int AES_256_KEY_LENGTH\t\t= 32;\nconstexpr int PBKDF2_LENGTH\t\t\t\t= AES_256_IV_LENGTH + AES_256_KEY_LENGTH;\nconstexpr int PBKDF2_ITERATION_COUNT\t= 100000;\n\nQByteArray Cryptographic::decrypt(const QByteArray &data, const QByteArray &pbkdf2) {\n\treturn doCrypt(QByteArray::fromBase64(data), Cryptographic::key(pbkdf2), Cryptographic::iv(pbkdf2), 0);\n}\n\nQByteArray Cryptographic::doCrypt(QByteArray data, const QByteArray &key, const QByteArray &iv, int enc) {\n\tQByteArray crypted(data.length() + EVP_MAX_BLOCK_LENGTH, '\\0');\n\tint cryptedLength = 0;\n\tint length;\n\n\tEVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();\n\n\tEVP_CipherInit_ex(\n\t\tctx,\n\t\tEVP_aes_256_cbc(),\n\t\tnullptr,\n\t\treinterpret_cast<const uchar *>(key.constData()),\n\t\treinterpret_cast<const uchar *>(iv.constData()),\n\t\tenc\n\t);\n\n\tEVP_CipherUpdate(\n\t\tctx,\n\t\treinterpret_cast<uchar *>(crypted.data()),\n\t\t&length,\n\t\treinterpret_cast<const uchar *>(data.constData()),\n\t\tdata.length()\n\t);\n\tcryptedLength += length;\n\n\tEVP_CipherFinal_ex(ctx, reinterpret_cast<uchar *>(crypted.data() + cryptedLength), &length);\n\tcryptedLength += length;\n\n\tEVP_CIPHER_CTX_free(ctx);\n\n\tcrypted.resize(cryptedLength);\n\treturn crypted;\n}\n\nQByteArray Cryptographic::encrypt(const QByteArray &data, const QByteArray &pbkdf2) {\n\tQByteArray encrypted = doCrypt(data, Cryptographic::key(pbkdf2), Cryptographic::iv(pbkdf2), 1);\n\treturn encrypted.toBase64();\n}\n\nQByteArray Cryptographic::iv(const QByteArray &pbkdf2) {\n\tQ_ASSERT(pbkdf2.length() == PBKDF2_LENGTH);\n\treturn QByteArray::fromRawData(pbkdf2.constData() + AES_256_KEY_LENGTH, AES_256_IV_LENGTH);\n}\n\nQByteArray Cryptographic::key(const QByteArray &pbkdf2) {\n\tQ_ASSERT(pbkdf2.length() == PBKDF2_LENGTH);\n\treturn QByteArray::fromRawData(pbkdf2.constData(), AES_256_KEY_LENGTH);\n}\n\nQByteArray Cryptographic::pbkdf2(const QByteArray &password, const QByteArray &salt) {\n\treturn QPasswordDigestor::deriveKeyPbkdf2(QCryptographicHash::Sha3_512, password, salt, PBKDF2_ITERATION_COUNT, PBKDF2_LENGTH);\n}\n\nQByteArray Cryptographic::salt() {\n\tQByteArray number = QByteArray::number(QRandomGenerator::system()->generate64());\n\tQByteArray numberHash = QCryptographicHash::hash(number, QCryptographicHash::Sha512);\n\treturn numberHash.toBase64();\n}\n"
  },
  {
    "path": "src/Utility/Cryptographic.h",
    "content": " /*\n * Copyright 2020, WindTerm.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef CRYPTOGRAPHIC_H\n#define CRYPTOGRAPHIC_H\n\n#pragma once\n\nclass QByteArray;\n\nclass Cryptographic {\npublic:\n\tCryptographic() = default;\n\n\tstatic QByteArray decrypt(const QByteArray &data, const QByteArray &pbkdf2);\n\tstatic QByteArray encrypt(const QByteArray &data, const QByteArray &pbkdf2);\n\tstatic QByteArray pbkdf2(const QByteArray &password, const QByteArray &salt);\n\tstatic QByteArray salt();\n\nprivate:\n\tstatic QByteArray doCrypt(QByteArray data, const QByteArray &key, const QByteArray &iv, int enc);\n\tstatic QByteArray iv(const QByteArray &pbkdf2);\n\tstatic QByteArray key(const QByteArray &pbkdf2);\n};\n\n#endif // CRYPTOGRAPHIC_H"
  },
  {
    "path": "src/Utility/MemoryPointer.h",
    "content": "#ifndef MEMORYPOINTER_H\n#define MEMORYPOINTER_H\n\n#pragma once\n\n#include <QtGlobal>\n\ntemplate <typename T>\nstruct MemoryPointer {\n\ttypedef decltype(nullptr) nullptr_t;\n\npublic:\n\tMemoryPointer()\n\t\t: uMemory({ 0 })\n\t{}\n\n\tMemoryPointer(const MemoryPointer &other) = delete;\n\tMemoryPointer &MemoryPointer::operator=(const MemoryPointer &other) = delete;\n\n\tMemoryPointer &MemoryPointer::operator=(nullptr_t) noexcept {\n\t\tfree();\n\n\t\tuMemory = { 0 };\n\t\treturn (*this);\n\t}\n\n\tMemoryPointer(MemoryPointer &&other) noexcept {\n\t\tuMemory = other.uMemory;\n\t\tother.uMemory = { 0 };\n\t}\n\n\tMemoryPointer& MemoryPointer::operator=(MemoryPointer &&other) noexcept\t{\n\t\tif (this != &other) {\n\t\t\tfree();\n\t\t\t\n\t\t\tuMemory = other.uMemory;\n\t\t\tother.uMemory = { 0 };\n\t\t}\n\t\treturn (*this);\n\t}\n\n\t~MemoryPointer() {\n\t\tfree();\n\t}\n\n\tinline T *data() const {\n\t\treturn static_cast<T *>(uMemory.pointer);\n\t}\n\n\tinline T *operator->() const {\n\t\treturn data();\n\t}\n\n\tinline T &operator*() const {\n\t\treturn *data();\n\t}\n\n\tinline operator T*() const {\n\t\treturn data();\n\t}\n\n\tinline operator bool() const noexcept {\n\t\treturn data() != nullptr;\n\t}\n\n\tinline bool isNull() const {\n\t\treturn uMemory.pointer == NULL;\n\t}\n\nprivate:\n\tvoid free() {\n\t\tif (uMemory.alloced) {\n\t\t\t::free(reinterpret_cast<void *>(uMemory.pointer));\n\t\t\tuMemory = { 0 };\n\t\t}\n\t}\n\nprivate:\n\tunion MemoryUnion {\n\t\tquint64 value;\n\n\t\tstruct {\n\t\t\tquint64 alloced : 1;\n\t\t\tquint64 pointer : 48;\n\t\t};\n\t};\n\tMemoryUnion uMemory;\n};\n\ntemplate <class T>\ninline bool operator==(const T *o, const MemoryPointer<T> &p) {\n\treturn o == p.operator->();\n}\n\ntemplate<class T>\ninline bool operator==(const MemoryPointer<T> &p, const T *o) {\n\treturn p.operator->() == o;\n}\n\ntemplate <class T>\ninline bool operator==(T *o, const MemoryPointer<T> &p) {\n\treturn o == p.operator->();\n}\n\ntemplate<class T>\ninline bool operator==(const MemoryPointer<T> &p, T *o) {\n\treturn p.operator->() == o;\n}\n\ntemplate<class T>\ninline bool operator==(const MemoryPointer<T> &lhs, const MemoryPointer<T> &rhs) {\n\treturn lhs.operator->() == rhs.operator->();\n}\n\ntemplate <class T>\ninline bool operator!=(const T *o, const MemoryPointer<T> &p) {\n\treturn o != p.operator->();\n}\n\ntemplate<class T>\ninline bool operator!= (const MemoryPointer<T> &p, const T *o) {\n\treturn p.operator->() != o;\n}\n\ntemplate <class T>\ninline bool operator!=(T *o, const MemoryPointer<T> &p) {\n\treturn o != p.operator->();\n}\n\ntemplate<class T>\ninline bool operator!= (const MemoryPointer<T> &p, T *o) {\n\treturn p.operator->() != o;\n}\n\ntemplate<class T>\ninline bool operator!= (const MemoryPointer<T> &lhs, const MemoryPointer<T> &rhs) {\n\treturn lhs.operator->() != rhs.operator->();\n}\n\n#endif // MEMORYPOINTER_H"
  },
  {
    "path": "src/Utility/ScopeGuard.h",
    "content": " /*\n * Copyright 2020, WindTerm.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef SCOPEGUARD_H\n#define SCOPEGUARD_H\n\nclass ScopeGuard {\n\ttypedef std::function<void()> GuardFunction;\n\npublic:\n\tScopeGuard(GuardFunction acquire, GuardFunction release)\n\t\t: m_active(true)\n\t\t, m_release(std::move(release))\n\t{\n\t\tacquire();\n\t}\n\n\t~ScopeGuard() {\n\t\tif (m_active) {\n\t\t\tm_release();\n\t\t}\n\t}\n\n\tScopeGuard() = delete;\n\tScopeGuard(const ScopeGuard &) = delete;\n\tScopeGuard &operator=(const ScopeGuard &) = delete;\n\n\tScopeGuard(ScopeGuard &&other)\n\t\t: m_active(other.m_active)\n\t\t, m_release(std::move(other.m_release))\n\t{\n\t\tother.cancel();\n\t}\n\n\tvoid cancel() {\n\t\tm_active = false;\n\t}\n\t\nprivate:\n\tbool m_active;\n\tGuardFunction m_release;\n};\n\n#endif // SCOPEGUARD_H\n"
  },
  {
    "path": "src/Utility/Spin.h",
    "content": " /*\n * Copyright 2020, WindTerm.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef SPIN_H\n#define SPIN_H\n\n#pragma once\n\n#include <atomic>\n#include <thread>\n\nclass SpinMutex {\npublic:\n\tSpinMutex() {\n\t\tunlock();\n\t}\n\n\tvoid yield(size_t nCount) {\n\t\tif (nCount < 2) {\n\t\t} else if (nCount < 16) {\n\t\t\tstd::this_thread::yield();\n\t\t} else if (nCount < 32) {\n\t\t\tstd::this_thread::sleep_for(std::chrono::nanoseconds(100));\n\t\t} else {\n\t\t\tstd::this_thread::sleep_for(std::chrono::microseconds(10));\n\t\t}\n\t}\n\n\tvoid lock() {\n\t\tfor (size_t i = 0; !try_lock(); i++) {\n\t\t\tyield(i);\n\t\t}\n\t}\n\n\tvoid unlock() {\n\t\tflag.clear(std::memory_order_release);\n\t}\n\n\tbool try_lock() {\n\t\treturn flag.test_and_set(std::memory_order_acquire) == false;\n\t}\n\nprivate:\n\tSpinMutex(const SpinMutex &) = delete;\n\tSpinMutex &operator=(const SpinMutex &) = delete;\n\n\tstd::atomic_flag flag;\n};\n\ntemplate <typename LockType>\nclass ThreadLocker {\npublic:\n\tThreadLocker(LockType& m_, bool bLock_ = true) : m(m_), bLock(bLock_) {\n\t\tif (bLock) m.lock();\n\t}\n\n\t~ThreadLocker() {\n\t\tif (bLock) m.unlock();\n\t}\n\nprivate:\n\tLockType& m;\n\tbool bLock;\n};\n\n#endif // SPIN_H"
  },
  {
    "path": "src/Utility/ThreadLocal.cpp",
    "content": " /*\n * Copyright 2020, WindTerm.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"ThreadLocal.h\"\n\n#include <QThread>\n\nvoid ThreadLocalWatcher::stopWatchCurrentThread() {\n\tQThread::currentThread()->disconnect(this);\n}\n\nvoid ThreadLocalWatcher::watchCurrentThread() {\n\tboost::thread::id id = boost::this_thread::get_id();\n\n\tconnect(QThread::currentThread(), &QThread::finished, this, [this, id]() {\n\t\tclear(id);\n\t});\n}"
  },
  {
    "path": "src/Utility/ThreadLocal.h",
    "content": " /*\n * Copyright 2020, WindTerm.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef THREADLOCAL_H\n#define THREADLOCAL_H\n\n#include <QObject>\n\n#include <mutex>\n#include <vector>\n#include <boost/thread.hpp>\n\n#include \"Spin.h\"\n\n#define STATIC_LOCAL_COUNT\t6\n\nclass ThreadLocalWatcher : public QObject {\n\tQ_OBJECT\n\npublic:\n\tThreadLocalWatcher() = default;\n\nprotected:\n\tvoid stopWatchCurrentThread();\n\tvoid watchCurrentThread();\n\tvirtual void clear(const boost::thread::id &id) = 0;\n\nprivate:\n\tQ_DISABLE_COPY(ThreadLocalWatcher)\n};\n\ntemplate <typename T>\nclass ThreadLocal : public ThreadLocalWatcher {\npublic:\n\tThreadLocal()\n\t\t: m_mainThreadId(boost::this_thread::get_id())\n\t{\n\t\tfor (int i = 0; i < STATIC_LOCAL_COUNT; i++) {\n\t\t\tm_staticLocals[i] = nullptr;\n\t\t}\n\t}\n\t\n\t~ThreadLocal() {\n\t\tclearAll();\n\t}\n\n\tvoid clear(const boost::thread::id &id) {\n\t\tstd::lock_guard<SpinMutex> lock(m_mutex);\n\n\t\tif (removeLocal(id)) {\n\t\t\tstopWatchCurrentThread();\n\t\t}\n\t}\n\n\tvoid clearAll() {\n\t\tstd::lock_guard<SpinMutex> lock(m_mutex);\n\n\t\tfor (int i = 0; i < STATIC_LOCAL_COUNT; i++) {\n\t\t\tif (Local *local = m_staticLocals[i]) {\n\t\t\t\tdelete local;\n\t\t\t\tm_staticLocals[i] = nullptr;\n\t\t\t}\n\t\t}\n\n\t\tif (m_dynamicLocals) {\n\t\t\tfor (Local *local : *m_dynamicLocals) {\n\t\t\t\tdelete local;\n\t\t\t}\n\t\t\tm_dynamicLocals.reset(nullptr);\n\t\t}\n\t}\n\n\tT *get() {\n\t\tboost::thread::id id = boost::this_thread::get_id();\n\n\t\tfor (const Local *local : m_staticLocals) {\n\t\t\tif (local && local->id == id) {\n\t\t\t\treturn local->ptr;\n\t\t\t}\n\t\t}\n\n\t\tif (m_dynamicLocals) {\n\t\t\tstd::lock_guard<SpinMutex> lock(m_mutex);\n\n\t\t\tfor (const Local *local : *m_dynamicLocals) {\n\t\t\t\tif (local && local->id == id) {\n\t\t\t\t\treturn local->ptr;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn nullptr;\n\t}\n\n\tboost::thread::id mainThreadId() const {\n\t\treturn m_mainThreadId;\n\t}\n\n\tvoid reset(T *t) {\n\t\tstd::lock_guard<SpinMutex> lock(m_mutex);\n\t\tboost::thread::id id = boost::this_thread::get_id();\n\n\t\tbool removed = removeLocal(id);\n\t\tbool added = addLocal(id, t);\n\n\t\tif (id != m_mainThreadId) {\n\t\t\tif (removed) {\n\t\t\t\tif (added == false) {\n\t\t\t\t\tstopWatchCurrentThread();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (added) {\n\t\t\t\t\twatchCurrentThread();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\nprivate:\n\tbool addLocal(const boost::thread::id &id, T *t) {\n\t\tif (t == nullptr) {\n\t\t\treturn false;\n\t\t}\n\n\t\tfor (int i = 0; i < STATIC_LOCAL_COUNT; i++) {\n\t\t\tif (m_staticLocals[i] == nullptr) {\n\t\t\t\tm_staticLocals[i] = new Local(id, t);\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tif (m_dynamicLocals.get() == nullptr) {\n\t\t\tm_dynamicLocals = std::make_unique<LocalVector>();\n\t\t}\n\t\tm_dynamicLocals->push_back(new Local(id, t));\n\t\treturn true;\n\t}\n\n\tbool removeLocal(const boost::thread::id &id) {\n\t\tfor (int i = 0; i < STATIC_LOCAL_COUNT; i++) {\n\t\t\tLocal *local = m_staticLocals[i];\n\n\t\t\tif (local && local->id == id) {\n\t\t\t\tdelete local;\n\t\t\t\tm_staticLocals[i] = nullptr;\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\tif (m_dynamicLocals) {\n\t\t\tfor (auto it = m_dynamicLocals->begin(); it != m_dynamicLocals->end(); ++it) {\n\t\t\t\tLocal *local = *it;\n\n\t\t\t\tif (local && local->id == id) {\n\t\t\t\t\tdelete local;\n\t\t\t\t\tm_dynamicLocals->erase(it);\n\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\nprivate:\n\tQ_DISABLE_COPY(ThreadLocal)\n\n\tstruct Local {\n\t\tboost::thread::id id;\n\t\tT *ptr;\n\n\t\tLocal(boost::thread::id id_, T *ptr_)\n\t\t\t: id(id_)\n\t\t\t, ptr(ptr_)\n\t\t{}\n\n\t\t~Local() {\n\t\t\tdelete ptr;\n\t\t\tptr = nullptr;\n\t\t}\n\t};\n\ttypedef std::vector<Local *> LocalVector;\n\tstd::unique_ptr<LocalVector> m_dynamicLocals;\n\n\tLocal *m_staticLocals[STATIC_LOCAL_COUNT];\n\n\tboost::thread::id m_mainThreadId;\n\tSpinMutex m_mutex;\n};\n\n#endif // THREADLOCAL_H"
  },
  {
    "path": "src/Widgets/PopupWidget.cpp",
    "content": " /*\n * Copyright 2020, WindTerm.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"PopupWidget.h\"\n\n#include <QAction>\n#include <QApplication>\n#include <QDesktopWidget>\n#include <QMouseEvent>\n#include <QStyle>\n#include <QToolButton>\n#include <QVBoxLayout>\n\n#include <private/qeffects_p.h>\n\n#define TRIANGLE_HEIGHT 18\n\nPopupWidget::PopupWidget(QWidget *parent /*= nullptr*/)\n\t: QFrame(parent)\n{\n\tsetWindowFlags(Qt::Window\n\t\t\t\t\t| Qt::FramelessWindowHint\n\t\t\t\t\t| Qt::WindowStaysOnTopHint\n\t\t\t\t\t| Qt::X11BypassWindowManagerHint\n\t\t\t\t\t| Qt::WindowDoesNotAcceptFocus);\n\n\tsetAttribute(Qt::WA_ShowWithoutActivating, true);\n\tsetAttribute(Qt::WA_X11DoNotAcceptFocus, true);\n\tsetAttribute(Qt::WA_DeleteOnClose, true);\n\tsetFocusPolicy(Qt::NoFocus);\n\tsetFrameShape(QFrame::StyledPanel);\n\tsetMouseTracking(true);\n\tcreateLayout();\n}\n\nPopupWidget::~PopupWidget() {\n\tif (QAbstractButton *button = dynamic_cast<QAbstractButton *>(parent())) {\n\t\tif (QToolButton *toolButton = dynamic_cast<QToolButton *>(parent())) {\n\t\t\tif (QAction *action = toolButton->defaultAction()) {\n\t\t\t\taction->setChecked(false);\n\t\t\t}\n\t\t}\n\t\tbutton->setChecked(false);\n\t}\n\t// Kill any running effect\n\tqFadeEffect(0);\n}\n\nvoid PopupWidget::createLayout() {\n\tQVBoxLayout *vBoxLayout = new QVBoxLayout;\n\tvBoxLayout->setSpacing(0);\n\n\tsetLayout(vBoxLayout);\n}\n\nbool PopupWidget::eventFilter(QObject *watched, QEvent *event) {\n\tswitch (event->type()) {\n\tcase QEvent::FocusOut:\n\t\tif (QWidget *widget = dynamic_cast<QWidget *>(watched)) {\n\t\t\tif (isAncestorOf(widget) == false && QApplication::activePopupWidget() == nullptr) {\n\t\t\t\tbool hasMenuAncestor = false;\n\n\t\t\t\tdo {\n\t\t\t\t\tif (widget->inherits(\"QMenu\")) {\n\t\t\t\t\t\thasMenuAncestor = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} while (widget = widget->parentWidget());\n\n\t\t\t\tif (hasMenuAncestor == false) {\n\t\t\t\t\tclose();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tbreak;\n\tcase QEvent::KeyPress: {\n\t\tif (QKeyEvent *keyEvent = dynamic_cast<QKeyEvent *>(event)) {\n\t\t\tQWidget *activePopupWidget = QApplication::activePopupWidget();\n\t\t\t\n\t\t\tif (keyEvent->matches(QKeySequence::Cancel)) {\t\t\t\t\n\t\t\t\tif (activePopupWidget) {\n\t\t\t\t\tactivePopupWidget->close();\n\t\t\t\t} else {\n\t\t\t\t\tclose();\n\t\t\t\t}\n\t\t\t\treturn true;\n\t\t\t} else if (isAncestorOf(QApplication::focusWidget()) == false) {\n\t\t\t\tif (activePopupWidget == nullptr) {\n\t\t\t\t\tclose();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tbreak;\n\t}\n\tcase QEvent::NonClientAreaMouseButtonPress:\n\tcase QEvent::WindowStateChange:\n\t\tclose();\n\t\tbreak;\n\tcase QEvent::MouseButtonPress: {\n\t\tif (QMouseEvent *mouseEvent = dynamic_cast<QMouseEvent *>(event)) {\n\t\t\tdo {\n\t\t\t\tQPoint globalPos = mouseEvent->globalPos();\n\n\t\t\t\tif (rect().contains(mapFromGlobal(globalPos)))\n\t\t\t\t\tbreak;\n\n\t\t\t\tif (QAbstractButton *button = dynamic_cast<QAbstractButton *>(parentWidget())) {\n\t\t\t\t\tif (button->rect().contains(button->mapFromGlobal(globalPos))) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsetAttribute(Qt::WA_NoMouseReplay);\n\t\t\t\tclose();\n\t\t\t} while (0);\n\t\t}\n\t\tbreak;\n\t}\n\tcase QEvent::WindowDeactivate: {\n\t\tif (QWidget *parentWidget = this->parentWidget()) {\n\t\t\tif (parentWidget->isAncestorOf(QApplication::focusWidget()) == false) {\n\t\t\t\tclose();\n\t\t\t}\n\t\t}\n\t\tbreak;\n\t}\n\t}\n\treturn false;\n}\n\nvoid PopupWidget::mousePressEvent(QMouseEvent *event) {\n\tsetAttribute(Qt::WA_NoMouseReplay);\n\tQWidget::mousePressEvent(event);\n}\n\nvoid PopupWidget::setCentralWidget(QWidget *widget) {\n\twidget->layout()->setContentsMargins(QMargins());\n\twidget->setParent(this);\n\tlayout()->addWidget(widget);\n\tadjustSize();\n}\n\nvoid PopupWidget::show(Area hArea, Area vArea) {\n\tQ_ASSERT(parentWidget() != nullptr);\n\n\tif (QWidget *parent = parentWidget()) {\n\t\tQPoint newPos;\n\t\tQPolygon triPolygon;\n\t\tQRect rectPolygon;\n\n\t\tQPoint pos = parent->mapToGlobal(QPoint());\n\t\tQRect rect = parent->rect();\n\t\tQRect screenRect = QApplication::desktop()->availableGeometry(this);\n\n\t\tint topMargin = style()->pixelMetric(QStyle::PM_LayoutTopMargin);\n\t\tint bottomMargin = style()->pixelMetric(QStyle::PM_LayoutBottomMargin);\n\t\tint leftMargin = style()->pixelMetric(QStyle::PM_LayoutLeftMargin);\n\t\tint rightMargin = style()->pixelMetric(QStyle::PM_LayoutRightMargin);\n\t\tint triangleHeight = std::max(TRIANGLE_HEIGHT, topMargin);\n\n\t\tif (pos.y() < height()) {\n\t\t\tif (vArea == TopArea) {\n\t\t\t\tvArea = BottomArea;\n\t\t\t}\n\t\t} else {\n\t\t\tif (vArea == BottomArea && screenRect.height() - pos.y() - rect.height() < height()) {\n\t\t\t\tvArea = TopArea;\n\t\t\t}\n\t\t}\n\n\t\tif (hArea == MiddleArea) {\n\t\t\tnewPos.setX(qBound(0, pos.x() + (rect.width() - width()) / 2, screenRect.width() - width()));\n\t\t} else {\n\t\t\tif (hArea == LeftArea) {\n\t\t\t\tif (pos.x() + rect.width() < width()) {\n\t\t\t\t\thArea = RightArea;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (screenRect.width() - pos.x() < width()) {\n\t\t\t\t\thArea = LeftArea;\n\t\t\t\t}\n\t\t\t}\n\t\t\tnewPos.setX((hArea == LeftArea) ? pos.x() + rect.width() - width() : pos.x());\n\t\t}\n\t\tnewPos.setY((vArea == BottomArea) ? pos.y() + rect.height() : pos.y() - height() - triangleHeight);\n\n\t\tint xCenter = pos.x() + (rect.width() / 2) - newPos.x();\n\n\t\tif (vArea == TopArea) {\n\t\t\ttriPolygon << QPoint(xCenter - triangleHeight, height())\n\t\t\t\t\t   << QPoint(xCenter, height() + triangleHeight)\n\t\t\t\t\t   << QPoint(xCenter + triangleHeight, height());\n\t\t\trectPolygon = QRect(0, 0, width(), height());\n\t\t\tlayout()->setContentsMargins(leftMargin, topMargin, rightMargin, bottomMargin + triangleHeight * 2);\n\t\t} else {\n\t\t\ttriPolygon << QPoint(xCenter - triangleHeight, triangleHeight)\n\t\t\t\t\t   << QPoint(xCenter, 0)\n\t\t\t\t\t   << QPoint(xCenter + triangleHeight, triangleHeight);\n\t\t\trectPolygon = QRect(0, triangleHeight, width(), height());\n\t\t\tlayout()->setContentsMargins(leftMargin, topMargin + triangleHeight, rightMargin, bottomMargin);\n\t\t}\n\n\t\tQRegion triangle(triPolygon);\n\t\tQRegion rectangle(rectPolygon, QRegion::Rectangle);\n\t\tQRegion mask = rectangle.united(triangle);\n\t\tsetMask(mask);\n\n\t\tmove(newPos);\n\t\tQWidget::show();\n\n\t\tqFadeEffect(this, 200);\n\t\tqApp->installEventFilter(this);\n\t}\n}"
  },
  {
    "path": "src/Widgets/PopupWidget.h",
    "content": " /*\n * Copyright 2020, WindTerm.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef POPUPWIDGET_H\n#define POPUPWIDGET_H\n\n#pragma once\n\n#include <QFrame>\n\nclass PopupWidget : public QFrame\n{\n\tQ_OBJECT\n\npublic:\n\texplicit PopupWidget(QWidget *parent = nullptr);\n\tvirtual ~PopupWidget();\n\n\tenum Area { LeftArea, MiddleArea, RightArea, TopArea, BottomArea };\n\npublic:\n\tvoid setCentralWidget(QWidget *widget);\n\tvoid show(Area hArea, Area vArea);\n\nprivate:\n\tvoid createLayout();\n\tbool eventFilter(QObject *watched, QEvent *event) override;\n\tvoid mousePressEvent(QMouseEvent *event) override;\n\nprivate:\n\tQ_DISABLE_COPY(PopupWidget)\n};\n\n#endif // POPUPWIDGET_H"
  },
  {
    "path": "src/Widgets/ScrollBar.cpp",
    "content": " /*\n * Copyright 2020, WindTerm.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"ScrollBar.h\"\n\n#include <QEvent>\n#include <QVariant>\n\nScrollBar::ScrollBar(Qt::Orientation orientation, QWidget *parent /*= nullptr*/)\n\t: QScrollBar(orientation, parent)\n{\n\tm_maximum = QScrollBar::maximum();\n\tm_minimum = QScrollBar::minimum();\n\tm_value = QScrollBar::value();\n\n\tsetContextMenuPolicy(Qt::PreventContextMenu);\n\tcreateConnections();\n}\n\nvoid ScrollBar::createConnections() {\n\tconnect(this, &QScrollBar::valueChanged, this, [this](qint64 value) {\n\t\tif (m_maximum > INT_MAX) {\n\t\t\tvalue *= (double)m_maximum / INT_MAX;\n\t\t}\n\n\t\tif (m_value != value) {\n\t\t\tqint64 oldValue = m_value;\n\t\t\tm_value = value;\n\n\t\t\temit valueChanged(m_value, oldValue);\n\t\t}\n\t});\n\n\tconnect(this, &QScrollBar::actionTriggered, this, [this](int action) {\n\t\tqint64 oldValue = m_value;\n\n\t\tswitch (action) {\n\t\tcase QAbstractSlider::SliderMove:\n\t\t\tif (m_maximum > INT_MAX) {\n\t\t\t\tm_value = (QScrollBar::sliderPosition() * ((double)m_maximum / INT_MAX));\n\t\t\t} else {\n\t\t\t\tm_value = QScrollBar::sliderPosition();\n\t\t\t}\n\t\t\tbreak;\n\t\tcase QAbstractSlider::SliderPageStepAdd:\n\t\t\tm_value = std::min(m_maximum, m_value + pageStep());\n\t\t\tbreak;\n\t\tcase QAbstractSlider::SliderPageStepSub:\n\t\t\tm_value = std::max(m_minimum, m_value - pageStep());\n\t\t\tbreak;\n\t\tcase QAbstractSlider::SliderSingleStepAdd:\n\t\t\tm_value = std::min(m_maximum, m_value + singleStep());\n\t\t\tbreak;\n\t\tcase QAbstractSlider::SliderSingleStepSub:\n\t\t\tm_value = std::max(m_minimum, m_value - singleStep());\n\t\t\tbreak;\n\t\tcase QAbstractSlider::SliderToMaximum:\n\t\t\tm_value = m_maximum;\n\t\t\tbreak;\n\t\tcase QAbstractSlider::SliderToMinimum:\n\t\t\tm_value = m_minimum;\n\t\t\tbreak;\n\t\t}\n\n\t\tif (m_maximum > INT_MAX) {\n\t\t\tQ_ASSERT(QScrollBar::maximum() == INT_MAX);\n\t\t\tQScrollBar::setSliderPosition(m_value * ((double)INT_MAX / m_maximum));\n\t\t}\n\n\t\tif (m_value != oldValue) {\n\t\t\temit valueChanged(m_value, oldValue);\n\t\t}\n\t});\n}\n\nbool ScrollBar::setMaximum(qint64 maximum) {\n\treturn setRange(std::min(m_minimum, maximum), maximum);\n}\n\nbool ScrollBar::setMinimum(qint64 minimum) {\n\treturn setRange(minimum, std::max(minimum, m_maximum));\n}\n\nbool ScrollBar::setPage(int page) {\n\tif (page > 0 && page != QScrollBar::pageStep()) {\n\t\tQScrollBar::setPageStep(page);\n\t\temit pageChanged(page);\n\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nbool ScrollBar::setRange(qint64 minimum, qint64 maximum) {\n\tif (minimum >= 0 && minimum <= maximum && (m_minimum != minimum || m_maximum != maximum)) {\n\t\tm_maximum = maximum;\n\t\tm_minimum = minimum;\n\n\t\tQScrollBar::setRange(\n\t\t\t(m_minimum > INT_MAX) ? INT_MAX : m_minimum,\n\t\t\t(m_maximum > INT_MAX) ? INT_MAX : m_maximum\n\t\t);\n\t\temit rangeChanged(minimum, maximum);\n\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nbool ScrollBar::setSingleStep(int singleStep) {\n\tif (singleStep > 0 && singleStep != QScrollBar::singleStep()) {\n\t\tQScrollBar::setSingleStep(singleStep);\n\t\temit singleStepChanged(singleStep);\n\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nbool ScrollBar::setValue(qint64 value) {\n\tvalue = qBound(m_minimum, value, m_maximum);\n\n\tif (m_value != value) {\n\t\tqint64 oldValue = m_value;\n\t\tm_value = value;\n\n\t\tif (m_maximum > INT_MAX) {\n\t\t\tvalue *= (double)INT_MAX / m_maximum;\n\t\t}\n\t\t\n\t\t{\n\t\t\tQSignalBlocker blocker(this);\n\t\t\tQScrollBar::setValue(value);\n\t\t}\n\t\temit valueChanged(m_value, oldValue);\n\n\t\treturn true;\n\t}\n\treturn false;\n}"
  },
  {
    "path": "src/Widgets/ScrollBar.h",
    "content": " /*\n * Copyright 2020, WindTerm.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef SCROLLBAR_H\n#define SCROLLBAR_H\n\n#pragma once\n\n#include <QScrollBar>\n\nclass ScrollBar : public QScrollBar\n{\n\tQ_OBJECT\n\npublic:\n\texplicit ScrollBar(Qt::Orientation orientation, QWidget *parent = nullptr);\t\n\tvirtual ~ScrollBar() = default;\n\n\tqint64 maximum() const { return m_maximum; }\n\tqint64 minimum() const { return m_minimum; }\n\tbool setMaximum(qint64 maximum);\n\tbool setMinimum(qint64 minimum);\n\tbool setPage(int page);\n\tbool setRange(qint64 minimum, qint64 maximum);\n\tbool setSingleStep(int singleStep);\n\tbool setValue(qint64 value);\n\tqint64 value() const { return m_value; }\n\nprivate:\n\tvoid createConnections();\n\nQ_SIGNALS:\n\tvoid pageChanged(int page) const;\n\tvoid rangeChanged(qint64 minimum, qint64 maximum) const;\n\tvoid singleStepChanged(int singleStep) const;\n\tvoid valueChanged(qint64 value, qint64 oldValue) const;\n\nprivate:\n\tQ_DISABLE_COPY(ScrollBar)\n\n\tqint64 m_maximum;\n\tqint64 m_minimum;\n\tqint64 m_value;\n};\n\n#endif // SCROLLBAR_H"
  },
  {
    "path": "src/Widgets/Splitter.cpp",
    "content": " /*\n * Copyright 2020, WindTerm.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#include \"Splitter.h\"\n\n#include <QEvent>\n#include <QVariant>\n\nconst char* const SPLITTER_RATIO = \"ratio\";\n\nSplitter::Splitter(QWidget *parent)\n\t: QSplitter(parent)\n\t, m_mainIndex(0)\n{}\n\nSplitter::~Splitter()\n{}\n\nvoid Splitter::showIndex(int index) {\n\tif (isIndexVisible(index))\n\t\treturn;\n\n\temit showIndexRequested(index);\n\n\tif (QSplitterHandle *handle = this->handle(index)) {\n\t\tQList<int> sizes = this->sizes();\n\n\t\tint total = 0;\n\t\tfor (int size : sizes) {\n\t\t\ttotal += size;\n\t\t}\n\n\t\tfloat ratio = handle->property(SPLITTER_RATIO).toFloat();\n\t\tif (ratio == 0.0) {\n\t\t\tratio = 0.18f;\n\t\t}\n\n\t\tint offset = 0;\n\t\tint size = total * ratio;\n\n\t\tif (index > 0) {\n\t\t\tfor (int i = 0; i < index; i++) {\n\t\t\t\toffset += sizes[i];\n\t\t\t}\n\t\t\toffset -= size;\n\t\t} else {\n\t\t\toffset = size;\n\t\t}\n\n\t\tif (index <= m_mainIndex) {\n\t\t\tindex += 1;\n\t\t}\n\t\tmoveSplitter(offset, index);\n\t}\n}\n\nvoid Splitter::hideIndex(int index) {\n\tif (isIndexVisible(index) == false)\n\t\treturn;\n\n\temit hideIndexRequested(index);\n\n\tif (QSplitterHandle *handle = this->handle(index)) {\n\t\tQList<int> sizes = this->sizes();\n\t\tint size = sizes[index];\n\n\t\tfloat total = 0;\n\t\tfor (int size : sizes) {\n\t\t\ttotal += size;\n\t\t}\n\t\thandle->setProperty(SPLITTER_RATIO, size / total);\n\n\t\tint offset = 0;\n\t\tfor (int i = 0; i <= index; i++) {\n\t\t\tif (i == index && index <= m_mainIndex)\n\t\t\t\tbreak;\n\t\t\toffset += sizes[i];\n\t\t}\n\n\t\tif (index <= m_mainIndex) {\n\t\t\tindex += 1;\n\t\t}\n\t\tmoveSplitter(offset, index);\n\t}\n}\n\nbool Splitter::isIndexVisible(int index) {\n\tif (index >= 0 && index < count()) {\n\t\treturn sizes()[index] > 0;\n\t}\n\t\n\tQ_ASSERT(false);\n\treturn false;\n}\n\nvoid Splitter::setIndexVisible(int index, bool visible) {\n\tif (visible) {\n\t\tshowIndex(index);\n\t} else {\n\t\thideIndex(index);\n\t}\n}\n\nvoid Splitter::setMainIndex(int mainIndex) {\n\tm_mainIndex = mainIndex;\n}\n\nbool Splitter::eventFilter(QObject *obj, QEvent *event) {\n\tif (event->type() == QEvent::MouseButtonDblClick) {\n\t\tif (QSplitterHandle *handle = dynamic_cast<QSplitterHandle *>(obj)) {\n\t\t\tfor (int i = 0; i < count(); i++) {\n\t\t\t\tif (handle == this->handle(i)) {\n\t\t\t\t\tif (i <= m_mainIndex && i > 0) {\n\t\t\t\t\t\ti--;\n\t\t\t\t\t}\n\t\t\t\t\tbool visible = isIndexVisible(i);\n\t\t\t\t\tsetIndexVisible(i, !visible);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn QSplitter::eventFilter(obj, event);\n}\n\nQSplitterHandle *Splitter::createHandle() {\n\tQSplitterHandle *handle = QSplitter::createHandle();\n\thandle->installEventFilter(this);\n\t\n\treturn handle;\n}"
  },
  {
    "path": "src/Widgets/Splitter.h",
    "content": " /*\n * Copyright 2020, WindTerm.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n *     http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n#ifndef SPLITTER_H\n#define SPLITTER_H\n\n#pragma once\n\n#include <QSplitter>\n\nextern const char* const SPLITTER_RATIO;\n\nclass Splitter : public QSplitter\n{\n\tQ_OBJECT\n\npublic:\n\texplicit Splitter(QWidget *parent = 0);\n\t~Splitter();\n\n\tvoid showIndex(int index);\n\tvoid hideIndex(int index);\n\tbool isIndexVisible(int index);\n\tvoid setIndexVisible(int index, bool visible);\n\n\tvoid setMainIndex(int mainIndex);\n\nprotected:\n\tbool eventFilter(QObject *obj, QEvent *event);\n\n\tQSplitterHandle *createHandle();\n\nQ_SIGNALS:\n\tvoid showIndexRequested(int index);\n\tvoid hideIndexRequested(int index);\n\nprivate:\n\tQ_DISABLE_COPY(Splitter)\n\n\tint m_mainIndex;\n};\n\n#endif // SPLITTER_H"
  },
  {
    "path": "src/libssh/.arcconfig",
    "content": "{\n  \"phabricator.uri\" : \"https://bugs.libssh.org/\",\n  \"history.immutable\": true\n}\n"
  },
  {
    "path": "src/libssh/.gitlab-ci.yml",
    "content": "variables:\n  BUILD_IMAGES_PROJECT: libssh/build-images\n  FEDORA_BUILD: buildenv-fedora\n  CENTOS7_BUILD: buildenv-centos7\n  TUMBLEWEED_BUILD: buildenv-tumbleweed\n  MINGW_BUILD: buildenv-mingw\n\n# pkd tests fail on CentOS7 docker images, so we don't use -DSERVER_TESTING=ON\ncentos7/openssl_1.0.x/x86_64:\n  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$CENTOS7_BUILD\n  script:\n  - mkdir -p obj && cd obj && cmake3\n    -DCMAKE_BUILD_TYPE=RelWithDebInfo\n    -DPICKY_DEVELOPER=ON\n    -DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON -DWITH_PCAP=ON\n    -DUNIT_TESTING=ON -DCLIENT_TESTING=ON .. &&\n    make -j$(nproc) && ctest --output-on-failure\n  tags:\n  - shared\n  except:\n  - tags\n  artifacts:\n    expire_in: 1 week\n    when: on_failure\n    paths:\n      - obj/\n\nfedora/openssl_1.1.x/x86_64:\n  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$FEDORA_BUILD\n  script:\n  - mkdir -p obj && cd obj && cmake\n    -DCMAKE_BUILD_TYPE=RelWithDebInfo\n    -DPICKY_DEVELOPER=ON\n    -DWITH_BLOWFISH_CIPHER=ON\n    -DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON -DWITH_PCAP=ON\n    -DWITH_DEBUG_CRYPTO=ON\n    -DWITH_DEBUG_PACKET=ON -DWITH_DEBUG_CALLTRACE=ON\n    -DUNIT_TESTING=ON -DCLIENT_TESTING=ON -DSERVER_TESTING=ON .. &&\n    make -j$(nproc) && ctest --output-on-failure\n  tags:\n  - shared\n  except:\n  - tags\n  artifacts:\n    expire_in: 1 week\n    when: on_failure\n    paths:\n      - obj/\n\nfedora/openssl_1.1.x/x86_64/fips:\n  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$FEDORA_BUILD\n  script:\n  - echo 1 > /etc/system-fips\n  - update-crypto-policies --set FIPS\n  - mkdir -p obj && cd obj && cmake\n    -DCMAKE_BUILD_TYPE=RelWithDebInfo\n    -DPICKY_DEVELOPER=ON\n    -DWITH_BLOWFISH_CIPHER=ON\n    -DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON -DWITH_PCAP=ON\n    -DWITH_DEBUG_CRYPTO=ON -DWITH_DEBUG_PACKET=ON -DWITH_DEBUG_CALLTRACE=ON\n    -DUNIT_TESTING=ON -DCLIENT_TESTING=ON -DSERVER_TESTING=ON .. &&\n    make -j$(nproc) && OPENSSL_FORCE_FIPS_MODE=1 ctest --output-on-failure\n  tags:\n  - shared\n  except:\n  - tags\n  artifacts:\n    expire_in: 1 week\n    when: on_failure\n    paths:\n      - obj/\n\nfedora/openssl_1.1.x/x86_64/minimal:\n  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$FEDORA_BUILD\n  script:\n  - mkdir -p obj && cd obj && cmake\n    -DCMAKE_BUILD_TYPE=RelWithDebInfo\n    -DPICKY_DEVELOPER=ON\n    -DWITH_SFTP=OFF -DWITH_SERVER=OFF -DWITH_ZLIB=OFF -DWITH_PCAP=OFF\n    -DUNIT_TESTING=ON -DCLIENT_TESTING=ON -DWITH_GEX=OFF .. &&\n    make -j$(nproc) && ctest --output-on-failure\n  tags:\n  - shared\n  except:\n  - tags\n  artifacts:\n    expire_in: 1 week\n    when: on_failure\n    paths:\n      - obj/\n\n# Address sanitizer doesn't mix well with LD_PRELOAD used in the testsuite\n# so, this is only enabled for unit tests right now.\n# TODO: add -DCLIENT_TESTING=ON -DSERVER_TESTING=ON\nfedora/address-sanitizer:\n  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$FEDORA_BUILD\n  script:\n  - mkdir -p obj && cd obj && cmake\n    -DCMAKE_BUILD_TYPE=AddressSanitizer\n    -DPICKY_DEVELOPER=ON\n    -DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON -DWITH_PCAP=ON\n    -DUNIT_TESTING=ON .. &&\n    make -j$(nproc) && ctest --output-on-failure\n  tags:\n  - shared\n  except:\n  - tags\n  artifacts:\n    expire_in: 1 week\n    when: on_failure\n    paths:\n      - obj/\n\n# This is disabled as it report OpenSSL issues\n# It also has ethe same issues with cwrap as AddressSanitizer\n.fedora/memory-sanitizer:\n  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$FEDORA_BUILD\n  script:\n  - mkdir -p obj && cd obj && cmake\n    -DCMAKE_BUILD_TYPE=MemorySanitizer\n    -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++\n    -DPICKY_DEVELOPER=ON\n    -DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON -DWITH_PCAP=ON\n    -DUNIT_TESTING=ON ..\n    && make -j$(nproc) && ctest --output-on-failure\n  tags:\n  - shared\n  except:\n  - tags\n  artifacts:\n    expire_in: 1 week\n    when: on_failure\n    paths:\n      - obj/\n\nfedora/undefined-sanitizer:\n  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$FEDORA_BUILD\n  script:\n  - mkdir -p obj && cd obj && cmake\n    -DCMAKE_BUILD_TYPE=UndefinedSanitizer\n    -DPICKY_DEVELOPER=ON\n    -DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON -DWITH_PCAP=ON\n    -DUNIT_TESTING=ON -DCLIENT_TESTING=ON -DSERVER_TESTING=ON ..\n    && make -j$(nproc) && ctest --output-on-failure\n  tags:\n  - shared\n  except:\n  - tags\n  artifacts:\n    expire_in: 1 week\n    when: on_failure\n    paths:\n      - obj/\n\nfedora/csbuild:\n  variables:\n      GIT_DEPTH: \"100\"\n  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$FEDORA_BUILD\n  script:\n  - |\n    if [[ -z \"$CI_COMMIT_BEFORE_SHA\" ]]; then\n        export CI_COMMIT_BEFORE_SHA=$(git rev-parse \"${CI_COMMIT_SHA}~20\")\n    fi\n\n    # Check if the commit exists in this branch\n    # This is not the case for a force push\n    git branch --contains $CI_COMMIT_BEFORE_SHA 2>/dev/null || export CI_COMMIT_BEFORE_SHA=$(git rev-parse \"${CI_COMMIT_SHA}~20\")\n\n    export CI_COMMIT_RANGE=\"$CI_COMMIT_BEFORE_SHA..$CI_COMMIT_SHA\"\n\n  - csbuild\n    --build-dir=obj-csbuild\n    --build-cmd \"rm -rf CMakeFiles CMakeCache.txt && cmake -DCMAKE_BUILD_TYPE=Debug -DPICKY_DEVELOPER=ON -DUNIT_TESTING=ON -DCLIENT_TESTING=ON -DSERVER_TESTING=ON -DFUZZ_TESTING=ON @SRCDIR@ && make clean && make -j$(nproc)\"\n    --git-commit-range $CI_COMMIT_RANGE\n    --color\n    --print-current --print-fixed\n  tags:\n  - shared\n  except:\n  - tags\n  artifacts:\n    expire_in: 1 week\n    when: on_failure\n    paths:\n      - obj-csbuild/\n\n# That is a specific runner that we cannot enable universally.\n# We restrict it to builds under the $BUILD_IMAGES_PROJECT project.\nfreebsd/x86_64:\n  image:\n  script:\n  - mkdir -p obj && cd obj && cmake\n    -DCMAKE_BUILD_TYPE=RelWithDebInfo\n    -DPICKY_DEVELOPER=ON\n    -DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON -DWITH_PCAP=ON\n    -DUNIT_TESTING=ON .. &&\n    make && ctest --output-on-failure\n  tags:\n  - freebsd\n  except:\n  - tags\n  only:\n  - branches@libssh/libssh-mirror\n  - branches@cryptomilk/libssh-mirror\n  artifacts:\n    expire_in: 1 week\n    when: on_failure\n    paths:\n      - obj/\n\nfedora/libgcrypt/x86_64:\n  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$FEDORA_BUILD\n  script:\n  - mkdir -p obj && cd obj && cmake\n    -DCMAKE_BUILD_TYPE=RelWithDebInfo\n    -DPICKY_DEVELOPER=ON\n    -DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON -DWITH_PCAP=ON\n    -DUNIT_TESTING=ON -DCLIENT_TESTING=ON -DSERVER_TESTING=ON\n    -DWITH_GCRYPT=ON -DWITH_DEBUG_CRYPTO=ON .. &&\n    make -j$(nproc) && ctest --output-on-failure\n  tags:\n  - shared\n  except:\n  - tags\n  artifacts:\n    expire_in: 1 week\n    when: on_failure\n    paths:\n      - obj/\n\nfedora/mbedtls/x86_64:\n  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$FEDORA_BUILD\n  script:\n  - mkdir -p obj && cd obj && cmake\n    -DCMAKE_BUILD_TYPE=RelWithDebInfo\n    -DPICKY_DEVELOPER=ON\n    -DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON -DWITH_PCAP=ON\n    -DUNIT_TESTING=ON -DCLIENT_TESTING=ON -DSERVER_TESTING=ON\n    -DWITH_MBEDTLS=ON -DWITH_DEBUG_CRYPTO=ON .. &&\n    make -j$(nproc) && ctest --output-on-failure\n  tags:\n  - shared\n  except:\n  - tags\n  artifacts:\n    expire_in: 1 week\n    when: on_failure\n    paths:\n      - obj/\n\n# Unit testing only, no client and pkd testing, because cwrap is not available\n# for MinGW\nfedora/mingw64:\n  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$MINGW_BUILD\n  script:\n  - export WINEPATH=/usr/x86_64-w64-mingw32/sys-root/mingw/bin\n  - export WINEDEBUG=-all\n  - mkdir -p obj && cd obj && mingw64-cmake\n    -DCMAKE_BUILD_TYPE=RelWithDebInfo\n    -DPICKY_DEVELOPER=ON\n    -DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON -DWITH_PCAP=ON\n    -DUNIT_TESTING=ON .. &&\n    make -j$(nproc) &&\n    ctest --output-on-failure\n  tags:\n  - shared\n  except:\n  - tags\n  artifacts:\n    expire_in: 1 week\n    when: on_failure\n    paths:\n      - obj/\n\n# Unit testing only, no client and pkd testing, because cwrap is not available\n# for MinGW\nfedora/mingw32:\n  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$MINGW_BUILD\n  script:\n  - export WINEPATH=/usr/i686-w64-mingw32/sys-root/mingw/bin\n  - export WINEDEBUG=-all\n  - mkdir -p obj && cd obj && mingw32-cmake\n    -DCMAKE_BUILD_TYPE=RelWithDebInfo\n    -DPICKY_DEVELOPER=ON\n    -DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON -DWITH_PCAP=ON\n    -DUNIT_TESTING=ON .. &&\n    make -j$(nproc) &&\n    ctest --output-on-failure\n  tags:\n  - shared\n  except:\n  - tags\n  artifacts:\n    expire_in: 1 week\n    when: on_failure\n    paths:\n      - obj/\n\ntumbleweed/openssl_1.1.x/x86_64/gcc:\n  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$TUMBLEWEED_BUILD\n  script:\n  - mkdir -p obj && cd obj && cmake\n    -DCMAKE_BUILD_TYPE=RelWithDebInfo\n    -DPICKY_DEVELOPER=ON\n    -DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON -DWITH_PCAP=ON\n    -DKRB5_CONFIG=/usr/lib/mit/bin/krb5-config\n    -DUNIT_TESTING=ON -DSERVER_TESTING=ON .. &&\n    make -j$(nproc) && ctest --output-on-failure\n  tags:\n  - shared\n  except:\n  - tags\n  artifacts:\n    expire_in: 1 week\n    when: on_failure\n    paths:\n      - obj/\n\ntumbleweed/openssl_1.1.x/x86/gcc:\n  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$TUMBLEWEED_BUILD\n  script:\n  - mkdir -p obj && cd obj && cmake\n    -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-cross-m32.cmake\n    -DCMAKE_BUILD_TYPE=RelWithDebInfo\n    -DPICKY_DEVELOPER=ON\n    -DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON -DWITH_PCAP=ON\n    -DUNIT_TESTING=ON .. &&\n    make -j$(nproc) && ctest --output-on-failure\n  tags:\n  - shared\n  except:\n  - tags\n  artifacts:\n    expire_in: 1 week\n    when: on_failure\n    paths:\n      - obj/\n\ntumbleweed/openssl_1.1.x/x86_64/gcc7:\n  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$TUMBLEWEED_BUILD\n  script:\n  - mkdir -p obj && cd obj && cmake\n    -DCMAKE_C_COMPILER=gcc-7 -DCMAKE_CXX_COMPILER=g++-7\n    -DCMAKE_BUILD_TYPE=RelWithDebInfo\n    -DPICKY_DEVELOPER=ON\n    -DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON -DWITH_PCAP=ON\n    -DKRB5_CONFIG=/usr/lib/mit/bin/krb5-config\n    -DUNIT_TESTING=ON -DSERVER_TESTING=ON .. &&\n    make -j$(nproc) && ctest --output-on-failure\n  tags:\n  - shared\n  except:\n  - tags\n  artifacts:\n    expire_in: 1 week\n    when: on_failure\n    paths:\n      - obj/\n\ntumbleweed/openssl_1.1.x/x86/gcc7:\n  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$TUMBLEWEED_BUILD\n  script:\n  - mkdir -p obj && cd obj && cmake\n    -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain-cross-m32.cmake\n    -DCMAKE_C_COMPILER=gcc-7 -DCMAKE_CXX_COMPILER=g++-7\n    -DCMAKE_BUILD_TYPE=RelWithDebInfo\n    -DPICKY_DEVELOPER=ON\n    -DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON -DWITH_PCAP=ON\n    -DUNIT_TESTING=ON .. &&\n    make -j$(nproc) && ctest --output-on-failure\n  tags:\n  - shared\n  except:\n  - tags\n  artifacts:\n    expire_in: 1 week\n    when: on_failure\n    paths:\n      - obj/\n\ntumbleweed/openssl_1.1.x/x86_64/clang:\n  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$TUMBLEWEED_BUILD\n  script:\n  - mkdir -p obj && cd obj && cmake\n    -DCMAKE_BUILD_TYPE=RelWithDebInfo\n    -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++\n    -DPICKY_DEVELOPER=ON\n    -DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON -DWITH_PCAP=ON\n    -DKRB5_CONFIG=/usr/lib/mit/bin/krb5-config\n    -DUNIT_TESTING=ON\n    -DSERVER_TESTING=ON .. &&\n    make -j$(nproc) && ctest --output-on-failure\n  tags:\n  - shared\n  except:\n  - tags\n  artifacts:\n    expire_in: 1 week\n    when: on_failure\n    paths:\n      - obj/\n\ntumbleweed/docs:\n  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$TUMBLEWEED_BUILD\n  script:\n  - mkdir -p obj && cd obj && cmake .. && make docs\n  tags:\n  - shared\n  except:\n  - tags\n  artifacts:\n    expire_in: 1 week\n    when: on_failure\n    paths:\n      - obj/\n\ntumbleweed/undefined-sanitizer:\n  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$TUMBLEWEED_BUILD\n  script:\n  - mkdir -p obj && cd obj && cmake\n    -DCMAKE_BUILD_TYPE=UndefinedSanitizer\n    -DPICKY_DEVELOPER=ON\n    -DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON -DWITH_PCAP=ON\n    -DUNIT_TESTING=ON -DSERVER_TESTING=ON .. &&\n    make -j$(nproc) && ctest --output-on-failure\n  tags:\n  - shared\n  except:\n  - tags\n  artifacts:\n    expire_in: 1 week\n    when: on_failure\n    paths:\n      - obj/\n\ntumbleweed/static-analysis:\n  image: $CI_REGISTRY/$BUILD_IMAGES_PROJECT:$TUMBLEWEED_BUILD\n  script:\n  - export CCC_CC=clang\n  - export CCC_CXX=clang++\n  - mkdir -p obj && cd obj && scan-build cmake\n    -DCMAKE_BUILD_TYPE=Debug\n    -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++\n    -DPICKY_DEVELOPER=ON\n    -DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON -DWITH_PCAP=ON\n    -DUNIT_TESTING=ON -DSERVER_TESTING=ON .. &&\n    scan-build --status-bugs -o scan make -j$(nproc)\n  tags:\n  - shared\n  except:\n  - tags\n  artifacts:\n    expire_in: 1 week\n    when: on_failure\n    paths:\n      - obj/scan\n\nvisualstudio/x86_64:\n  variables:\n    ErrorActionPreference: STOP\n  script:\n  - $env:VCPKG_DEFAULT_TRIPLET=\"x64-windows\"\n  - mkdir -p obj; if ($?) {cd obj}; if (! $?) {exit 1}\n  - cmake\n      -A x64\n      -DCMAKE_TOOLCHAIN_FILE=\"$env:VCPKG_TOOLCHAIN_FILE\"\n      -DPICKY_DEVELOPER=ON\n      -DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON -DWITH_PCAP=ON\n      -DUNIT_TESTING=ON ..\n  - cmake --build .\n  - ctest --output-on-failure\n  tags:\n  - vs2017\n  - windows\n  except:\n  - tags\n  only:\n  - branches@libssh/libssh-mirror\n  - branches@ansasaki/libssh-mirror\n  - branches@cryptomilk/libssh-mirror\n  - branches@jjelen/libssh-mirror\n  artifacts:\n    expire_in: 1 week\n    when: on_failure\n    paths:\n      - obj/\n\nvisualstudio/x86:\n  variables:\n    ErrorActionPreference: STOP\n  script:\n  - $env:VCPKG_DEFAULT_TRIPLET=\"x86-windows\"\n  - mkdir -p obj; if ($?) {cd obj}; if (! $?) {exit 1}\n  - cmake\n      -DCMAKE_TOOLCHAIN_FILE=\"$env:VCPKG_TOOLCHAIN_FILE\"\n      -DPICKY_DEVELOPER=ON\n      -DWITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON -DWITH_PCAP=ON\n      -DUNIT_TESTING=ON ..\n  - cmake --build .\n  - ctest --output-on-failure\n  tags:\n  - vs2017\n  - windows\n  except:\n  - tags\n  only:\n  - branches@libssh/libssh-mirror\n  - branches@ansasaki/libssh-mirror\n  - branches@cryptomilk/libssh-mirror\n  - branches@jjelen/libssh-mirror\n  artifacts:\n    expire_in: 1 week\n    when: on_failure\n    paths:\n      - obj/\n"
  },
  {
    "path": "src/libssh/AUTHORS",
    "content": "Author(s):\nAris Adamantiadis <aris@0xbadc0de.be> (project initiator)\n\nAndreas Schneider <asn@cryptomilk.org> (developer)\n\nNick Zitzmann <seiryu (at) comcast (dot) net> (mostly client SFTP stuff)\n\nNorbert Kiesel <nkiesel (at) tbdnetworks (dot) com> (getaddrinfo and other patches)\n\nJean-Philippe Garcia Ballester <giga (at) le-pec (dot) org> (Port to libgcrypt and configure.in voodoo, debian packaging)\n\nContributor(s):\n\nLaurent Bigonville <bigon (at) bigon (dot) be> (debian packaging)\n\n"
  },
  {
    "path": "src/libssh/BSD",
    "content": "Some parts are under the BSDv2 License :\n\n\nCopyright (c) 2000 Markus Friedl.  All rights reserved.\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n 1. Redistributions of source code must retain the above copyright\n    notice, this list of conditions and the following disclaimer.\n 2. Redistributions in binary form must reproduce the above copyright\n    notice, this list of conditions and the following disclaimer in the\n    documentation and/or other materials provided with the distribution.\n \nTHIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\nIMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\nIN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\nNOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\nTHIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\n"
  },
  {
    "path": "src/libssh/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.3.0)\ncmake_policy(SET CMP0048 NEW)\n\n# Specify search path for CMake modules to be loaded by include() \n# and find_package()\nlist(APPEND CMAKE_MODULE_PATH \"${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules\")\n\n# Add defaults for cmake\n# Those need to be set before the project() call.\ninclude(DefineCMakeDefaults)\ninclude(DefineCompilerFlags)\n\nproject(libssh VERSION 0.9.5 LANGUAGES C)\n\n# global needed variable\nset(APPLICATION_NAME ${PROJECT_NAME})\n\n# SOVERSION scheme: CURRENT.AGE.REVISION\n#   If there was an incompatible interface change:\n#     Increment CURRENT. Set AGE and REVISION to 0\n#   If there was a compatible interface change:\n#     Increment AGE. Set REVISION to 0\n#   If the source code was changed, but there were no interface changes:\n#     Increment REVISION.\nset(LIBRARY_VERSION \"4.8.6\")\nset(LIBRARY_SOVERSION \"4\")\n\n# where to look first for cmake modules, before ${CMAKE_ROOT}/Modules/ is checked\n\n# add definitions\ninclude(DefinePlatformDefaults)\ninclude(DefineOptions.cmake)\ninclude(CPackConfig.cmake)\ninclude(GNUInstallDirs)\n\ninclude(CompilerChecks.cmake)\n\n# disallow in-source build\ninclude(MacroEnsureOutOfSourceBuild)\nmacro_ensure_out_of_source_build(\"${PROJECT_NAME} requires an out of source build. Please create a separate build directory and run 'cmake /path/to/${PROJECT_NAME} [options]' there.\")\n\n# Copy library files to a lib sub-directory\nset(CMAKE_LIBRARY_OUTPUT_DIRECTORY \"${CMAKE_BINARY_DIR}/lib\")\n\n# search for libraries\nif (WITH_ZLIB)\n    find_package(ZLIB REQUIRED)\nendif (WITH_ZLIB)\n\nif (WITH_GCRYPT)\n  find_package(GCrypt 1.5.0 REQUIRED)\n  if (NOT GCRYPT_FOUND)\n    message(FATAL_ERROR \"Could not find GCrypt\")\n  endif (NOT GCRYPT_FOUND)\nelseif(WITH_MBEDTLS)\n    find_package(MbedTLS REQUIRED)\n    if (NOT MBEDTLS_FOUND)\n      message(FATAL_ERROR \"Could not find mbedTLS\")\n    endif (NOT MBEDTLS_FOUND)\nelse (WITH_GCRYPT)\n  find_package(OpenSSL)\n  if (NOT OPENSSL_FOUND)\n    find_package(GCrypt)\n    if (NOT GCRYPT_FOUND)\n      find_package(MbedTLS)\n      if (NOT MBEDTLS_FOUND)\n        message(FATAL_ERROR \"Could not find OpenSSL, GCrypt or mbedTLS\")\n      endif (NOT MBEDTLS_FOUND)\n    endif (NOT GCRYPT_FOUND)\n  endif (NOT OPENSSL_FOUND)\nendif(WITH_GCRYPT)\n\nif (UNIT_TESTING)\n    find_package(CMocka REQUIRED)\nendif ()\n\n# Find out if we have threading available\nset(CMAKE_THREAD_PREFER_PTHREADS ON)\nset(THREADS_PREFER_PTHREAD_FLAG ON)\nfind_package(Threads)\n\nif (WITH_GSSAPI)\n    find_package(GSSAPI)\nendif (WITH_GSSAPI)\n\nif (WITH_NACL)\n    find_package(NaCl)\n    if (NOT NACL_FOUND)\n        set(WITH_NACL OFF)\n    endif (NOT NACL_FOUND)\nendif (WITH_NACL)\n\nif (BSD OR SOLARIS OR OSX)\n    find_package(Argp)\nendif (BSD OR SOLARIS OR OSX)\n\n# Disable symbol versioning in non UNIX platforms\nif (UNIX)\n    find_package(ABIMap 0.3.1)\nelse (UNIX)\n    set(WITH_SYMBOL_VERSIONING OFF)\nendif (UNIX)\n\n# config.h checks\ninclude(ConfigureChecks.cmake)\nconfigure_file(config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h)\n\n# check subdirectories\nadd_subdirectory(doc)\nadd_subdirectory(include)\nadd_subdirectory(src)\n\n# pkg-config file\nif (UNIX)\nconfigure_file(libssh.pc.cmake ${CMAKE_CURRENT_BINARY_DIR}/libssh.pc)\ninstall(\n  FILES\n    ${CMAKE_CURRENT_BINARY_DIR}/libssh.pc\n  DESTINATION\n    ${CMAKE_INSTALL_LIBDIR}/pkgconfig\n  COMPONENT\n    pkgconfig\n)\nendif (UNIX)\n\n# CMake config files\ninclude(CMakePackageConfigHelpers)\n\nset(LIBSSH_LIBRARY_NAME ${CMAKE_SHARED_LIBRARY_PREFIX}ssh${CMAKE_SHARED_LIBRARY_SUFFIX})\n\n# libssh-config-version.cmake\nwrite_basic_package_version_file(libssh-config-version.cmake\n                                 VERSION ${PROJECT_VERSION}\n                                 COMPATIBILITY SameMajorVersion)\n\ninstall(\n    FILES\n        ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}-config-version.cmake\n    DESTINATION\n        ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME}\n    COMPONENT\n        devel)\n\nif (WITH_EXAMPLES)\n    add_subdirectory(examples)\nendif (WITH_EXAMPLES)\n\nif (UNIT_TESTING)\n    include(AddCMockaTest)\n    add_subdirectory(tests)\nendif (UNIT_TESTING)\n\n### SOURCE PACKAGE\nif (WITH_SYMBOL_VERSIONING AND ABIMAP_FOUND)\n    # Get the current ABI version from source\n    get_filename_component(current_abi_path\n                           \"${CMAKE_SOURCE_DIR}/src/ABI/current\"\n                           ABSOLUTE)\n\n    # Check if the ABI version should be updated\n    file(READ ${current_abi_path} CURRENT_ABI_CONTENT)\n    string(STRIP \"${CURRENT_ABI_CONTENT}\" CURRENT_ABI_VERSION)\n\n    if (LIBRARY_VERSION VERSION_GREATER CURRENT_ABI_VERSION)\n        set(UPDATE_ABI TRUE)\n    endif ()\n\n    if (UPDATE_ABI)\n        message(STATUS \"Library version bumped to ${LIBRARY_VERSION}: Updating ABI\")\n\n        # Get the list of header files\n        get_file_list(${PROJECT_NAME}_header_list\n                      DIRECTORIES \"${CMAKE_SOURCE_DIR}/include/libssh\"\n                      FILES_PATTERNS \"*.h\")\n\n        # Extract the symbols marked as \"LIBSSH_API\" from the header files\n        extract_symbols(${PROJECT_NAME}.symbols\n                        HEADERS_LIST ${PROJECT_NAME}_header_list\n                        FILTER_PATTERN \"LIBSSH_API\"\n                        COPY_TO \"${CMAKE_SOURCE_DIR}/src/ABI/${PROJECT_NAME}-${LIBRARY_VERSION}.symbols\")\n\n        if (WITH_ABI_BREAK)\n            set(ALLOW_ABI_BREAK \"BREAK_ABI\")\n        endif()\n\n        # Target we can depend on in 'make dist'\n        set(_SYMBOL_TARGET \"${PROJECT_NAME}.map\")\n\n        # Set the path to the current map file\n        set(MAP_PATH \"${CMAKE_SOURCE_DIR}/src/${_SYMBOL_TARGET}\")\n\n        # Generate the symbol version map file\n        generate_map_file(${_SYMBOL_TARGET}\n                          SYMBOLS ${PROJECT_NAME}.symbols\n                          RELEASE_NAME_VERSION ${PROJECT_NAME}_${LIBRARY_VERSION}\n                          CURRENT_MAP ${MAP_PATH}\n                          COPY_TO ${MAP_PATH}\n                          FINAL\n                          ${ALLOW_ABI_BREAK})\n\n        # Write the current version to the source\n        file(WRITE ${current_abi_path} ${LIBRARY_VERSION})\n    endif(UPDATE_ABI)\nendif (WITH_SYMBOL_VERSIONING AND ABIMAP_FOUND)\n\nadd_custom_target(dist COMMAND ${CMAKE_MAKE_PROGRAM} package_source DEPENDS ${_SYMBOL_TARGET})\n\n# Link compile database for clangd\nexecute_process(COMMAND cmake -E create_symlink\n                \"${CMAKE_BINARY_DIR}/compile_commands.json\"\n                \"${CMAKE_SOURCE_DIR}/compile_commands.json\")\n\nmessage(STATUS \"********************************************\")\nmessage(STATUS \"********** ${PROJECT_NAME} build options : **********\")\n\nmessage(STATUS \"zlib support: ${WITH_ZLIB}\")\nmessage(STATUS \"libgcrypt support: ${WITH_GCRYPT}\")\nmessage(STATUS \"libmbedTLS support: ${WITH_MBEDTLS}\")\nmessage(STATUS \"libnacl support: ${WITH_NACL}\")\nmessage(STATUS \"SFTP support: ${WITH_SFTP}\")\nmessage(STATUS \"Server support : ${WITH_SERVER}\")\nmessage(STATUS \"GSSAPI support : ${WITH_GSSAPI}\")\nmessage(STATUS \"GEX support : ${WITH_GEX}\")\nmessage(STATUS \"Pcap debugging support : ${WITH_PCAP}\")\nmessage(STATUS \"Build shared library: ${BUILD_SHARED_LIBS}\")\nmessage(STATUS \"Unit testing: ${UNIT_TESTING}\")\nmessage(STATUS \"Client code testing: ${CLIENT_TESTING}\")\nmessage(STATUS \"Blowfish cipher support: ${WITH_BLOWFISH_CIPHER}\")\nset(_SERVER_TESTING OFF)\nif (WITH_SERVER)\n    set(_SERVER_TESTING ${SERVER_TESTING})\nendif()\nmessage(STATUS \"Server code testing: ${_SERVER_TESTING}\")\nif (WITH_INTERNAL_DOC)\n    message(STATUS \"Internal documentation generation\")\nelse (WITH_INTERNAL_DOC)\n    message(STATUS \"Public API documentation generation\")\nendif (WITH_INTERNAL_DOC)\nmessage(STATUS \"Benchmarks: ${WITH_BENCHMARKS}\")\nmessage(STATUS \"Symbol versioning: ${WITH_SYMBOL_VERSIONING}\")\nmessage(STATUS \"Allow ABI break: ${WITH_ABI_BREAK}\")\nmessage(STATUS \"Release is final: ${WITH_FINAL}\")\nmessage(STATUS \"Global client config: ${GLOBAL_CLIENT_CONFIG}\")\nif (WITH_SERVER)\nmessage(STATUS \"Global bind config: ${GLOBAL_BIND_CONFIG}\")\nendif()\nmessage(STATUS \"********************************************\")\n\n"
  },
  {
    "path": "src/libssh/COPYING",
    "content": "\t\t  GNU LESSER GENERAL PUBLIC LICENSE\n\t\t       Version 2.1, February 1999\n\n Copyright (C) 1991, 1999 Free Software Foundation, Inc.\n     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n[This is the first released version of the Lesser GPL.  It also counts\n as the successor of the GNU Library Public License, version 2, hence\n the version number 2.1.]\n\n\t\t\t    Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicenses are intended to guarantee your freedom to share and change\nfree software--to make sure the software is free for all its users.\n\n  This license, the Lesser General Public License, applies to some\nspecially designated software packages--typically libraries--of the\nFree Software Foundation and other authors who decide to use it.  You\ncan use it too, but we suggest you first think carefully about whether\nthis license or the ordinary General Public License is the better\nstrategy to use in any particular case, based on the explanations below.\n\n  When we speak of free software, we are referring to freedom of use,\nnot price.  Our General Public Licenses are designed to make sure that\nyou have the freedom to distribute copies of free software (and charge\nfor this service if you wish); that you receive source code or can get\nit if you want it; that you can change the software and use pieces of\nit in new free programs; and that you are informed that you can do\nthese things.\n\n  To protect your rights, we need to make restrictions that forbid\ndistributors to deny you these rights or to ask you to surrender these\nrights.  These restrictions translate to certain responsibilities for\nyou if you distribute copies of the library or if you modify it.\n\n  For example, if you distribute copies of the library, whether gratis\nor for a fee, you must give the recipients all the rights that we gave\nyou.  You must make sure that they, too, receive or can get the source\ncode.  If you link other code with the library, you must provide\ncomplete object files to the recipients, so that they can relink them\nwith the library after making changes to the library and recompiling\nit.  And you must show them these terms so they know their rights.\n\n  We protect your rights with a two-step method: (1) we copyright the\nlibrary, and (2) we offer you this license, which gives you legal\npermission to copy, distribute and/or modify the library.\n\n  To protect each distributor, we want to make it very clear that\nthere is no warranty for the free library.  Also, if the library is\nmodified by someone else and passed on, the recipients should know\nthat what they have is not the original version, so that the original\nauthor's reputation will not be affected by problems that might be\nintroduced by others.\n\f\n  Finally, software patents pose a constant threat to the existence of\nany free program.  We wish to make sure that a company cannot\neffectively restrict the users of a free program by obtaining a\nrestrictive license from a patent holder.  Therefore, we insist that\nany patent license obtained for a version of the library must be\nconsistent with the full freedom of use specified in this license.\n\n  Most GNU software, including some libraries, is covered by the\nordinary GNU General Public License.  This license, the GNU Lesser\nGeneral Public License, applies to certain designated libraries, and\nis quite different from the ordinary General Public License.  We use\nthis license for certain libraries in order to permit linking those\nlibraries into non-free programs.\n\n  When a program is linked with a library, whether statically or using\na shared library, the combination of the two is legally speaking a\ncombined work, a derivative of the original library.  The ordinary\nGeneral Public License therefore permits such linking only if the\nentire combination fits its criteria of freedom.  The Lesser General\nPublic License permits more lax criteria for linking other code with\nthe library.\n\n  We call this license the \"Lesser\" General Public License because it\ndoes Less to protect the user's freedom than the ordinary General\nPublic License.  It also provides other free software developers Less\nof an advantage over competing non-free programs.  These disadvantages\nare the reason we use the ordinary General Public License for many\nlibraries.  However, the Lesser license provides advantages in certain\nspecial circumstances.\n\n  For example, on rare occasions, there may be a special need to\nencourage the widest possible use of a certain library, so that it becomes\na de-facto standard.  To achieve this, non-free programs must be\nallowed to use the library.  A more frequent case is that a free\nlibrary does the same job as widely used non-free libraries.  In this\ncase, there is little to gain by limiting the free library to free\nsoftware only, so we use the Lesser General Public License.\n\n  In other cases, permission to use a particular library in non-free\nprograms enables a greater number of people to use a large body of\nfree software.  For example, permission to use the GNU C Library in\nnon-free programs enables many more people to use the whole GNU\noperating system, as well as its variant, the GNU/Linux operating\nsystem.\n\n  Although the Lesser General Public License is Less protective of the\nusers' freedom, it does ensure that the user of a program that is\nlinked with the Library has the freedom and the wherewithal to run\nthat program using a modified version of the Library.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.  Pay close attention to the difference between a\n\"work based on the library\" and a \"work that uses the library\".  The\nformer contains code derived from the library, whereas the latter must\nbe combined with the library in order to run.\n\f\n\t\t  GNU LESSER GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License Agreement applies to any software library or other\nprogram which contains a notice placed by the copyright holder or\nother authorized party saying it may be distributed under the terms of\nthis Lesser General Public License (also called \"this License\").\nEach licensee is addressed as \"you\".\n\n  A \"library\" means a collection of software functions and/or data\nprepared so as to be conveniently linked with application programs\n(which use some of those functions and data) to form executables.\n\n  The \"Library\", below, refers to any such software library or work\nwhich has been distributed under these terms.  A \"work based on the\nLibrary\" means either the Library or any derivative work under\ncopyright law: that is to say, a work containing the Library or a\nportion of it, either verbatim or with modifications and/or translated\nstraightforwardly into another language.  (Hereinafter, translation is\nincluded without limitation in the term \"modification\".)\n\n  \"Source code\" for a work means the preferred form of the work for\nmaking modifications to it.  For a library, complete source code means\nall the source code for all modules it contains, plus any associated\ninterface definition files, plus the scripts used to control compilation\nand installation of the library.\n\n  Activities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning a program using the Library is not restricted, and output from\nsuch a program is covered only if its contents constitute a work based\non the Library (independent of the use of the Library in a tool for\nwriting it).  Whether that is true depends on what the Library does\nand what the program that uses the Library does.\n  \n  1. You may copy and distribute verbatim copies of the Library's\ncomplete source code as you receive it, in any medium, provided that\nyou conspicuously and appropriately publish on each copy an\nappropriate copyright notice and disclaimer of warranty; keep intact\nall the notices that refer to this License and to the absence of any\nwarranty; and distribute a copy of this License along with the\nLibrary.\n\n  You may charge a fee for the physical act of transferring a copy,\nand you may at your option offer warranty protection in exchange for a\nfee.\n\f\n  2. You may modify your copy or copies of the Library or any portion\nof it, thus forming a work based on the Library, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) The modified work must itself be a software library.\n\n    b) You must cause the files modified to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    c) You must cause the whole of the work to be licensed at no\n    charge to all third parties under the terms of this License.\n\n    d) If a facility in the modified Library refers to a function or a\n    table of data to be supplied by an application program that uses\n    the facility, other than as an argument passed when the facility\n    is invoked, then you must make a good faith effort to ensure that,\n    in the event an application does not supply such function or\n    table, the facility still operates, and performs whatever part of\n    its purpose remains meaningful.\n\n    (For example, a function in a library to compute square roots has\n    a purpose that is entirely well-defined independent of the\n    application.  Therefore, Subsection 2d requires that any\n    application-supplied function or table used by this function must\n    be optional: if the application does not supply it, the square\n    root function must still compute square roots.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Library,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Library, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote\nit.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Library.\n\nIn addition, mere aggregation of another work not based on the Library\nwith the Library (or with a work based on the Library) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may opt to apply the terms of the ordinary GNU General Public\nLicense instead of this License to a given copy of the Library.  To do\nthis, you must alter all the notices that refer to this License, so\nthat they refer to the ordinary GNU General Public License, version 2,\ninstead of to this License.  (If a newer version than version 2 of the\nordinary GNU General Public License has appeared, then you can specify\nthat version instead if you wish.)  Do not make any other change in\nthese notices.\n\f\n  Once this change is made in a given copy, it is irreversible for\nthat copy, so the ordinary GNU General Public License applies to all\nsubsequent copies and derivative works made from that copy.\n\n  This option is useful when you wish to copy part of the code of\nthe Library into a program that is not a library.\n\n  4. You may copy and distribute the Library (or a portion or\nderivative of it, under Section 2) in object code or executable form\nunder the terms of Sections 1 and 2 above provided that you accompany\nit with the complete corresponding machine-readable source code, which\nmust be distributed under the terms of Sections 1 and 2 above on a\nmedium customarily used for software interchange.\n\n  If distribution of object code is made by offering access to copy\nfrom a designated place, then offering equivalent access to copy the\nsource code from the same place satisfies the requirement to\ndistribute the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  5. A program that contains no derivative of any portion of the\nLibrary, but is designed to work with the Library by being compiled or\nlinked with it, is called a \"work that uses the Library\".  Such a\nwork, in isolation, is not a derivative work of the Library, and\ntherefore falls outside the scope of this License.\n\n  However, linking a \"work that uses the Library\" with the Library\ncreates an executable that is a derivative of the Library (because it\ncontains portions of the Library), rather than a \"work that uses the\nlibrary\".  The executable is therefore covered by this License.\nSection 6 states terms for distribution of such executables.\n\n  When a \"work that uses the Library\" uses material from a header file\nthat is part of the Library, the object code for the work may be a\nderivative work of the Library even though the source code is not.\nWhether this is true is especially significant if the work can be\nlinked without the Library, or if the work is itself a library.  The\nthreshold for this to be true is not precisely defined by law.\n\n  If such an object file uses only numerical parameters, data\nstructure layouts and accessors, and small macros and small inline\nfunctions (ten lines or less in length), then the use of the object\nfile is unrestricted, regardless of whether it is legally a derivative\nwork.  (Executables containing this object code plus portions of the\nLibrary will still fall under Section 6.)\n\n  Otherwise, if the work is a derivative of the Library, you may\ndistribute the object code for the work under the terms of Section 6.\nAny executables containing that work also fall under Section 6,\nwhether or not they are linked directly with the Library itself.\n\f\n  6. As an exception to the Sections above, you may also combine or\nlink a \"work that uses the Library\" with the Library to produce a\nwork containing portions of the Library, and distribute that work\nunder terms of your choice, provided that the terms permit\nmodification of the work for the customer's own use and reverse\nengineering for debugging such modifications.\n\n  You must give prominent notice with each copy of the work that the\nLibrary is used in it and that the Library and its use are covered by\nthis License.  You must supply a copy of this License.  If the work\nduring execution displays copyright notices, you must include the\ncopyright notice for the Library among them, as well as a reference\ndirecting the user to the copy of this License.  Also, you must do one\nof these things:\n\n    a) Accompany the work with the complete corresponding\n    machine-readable source code for the Library including whatever\n    changes were used in the work (which must be distributed under\n    Sections 1 and 2 above); and, if the work is an executable linked\n    with the Library, with the complete machine-readable \"work that\n    uses the Library\", as object code and/or source code, so that the\n    user can modify the Library and then relink to produce a modified\n    executable containing the modified Library.  (It is understood\n    that the user who changes the contents of definitions files in the\n    Library will not necessarily be able to recompile the application\n    to use the modified definitions.)\n\n    b) Use a suitable shared library mechanism for linking with the\n    Library.  A suitable mechanism is one that (1) uses at run time a\n    copy of the library already present on the user's computer system,\n    rather than copying library functions into the executable, and (2)\n    will operate properly with a modified version of the library, if\n    the user installs one, as long as the modified version is\n    interface-compatible with the version that the work was made with.\n\n    c) Accompany the work with a written offer, valid for at\n    least three years, to give the same user the materials\n    specified in Subsection 6a, above, for a charge no more\n    than the cost of performing this distribution.\n\n    d) If distribution of the work is made by offering access to copy\n    from a designated place, offer equivalent access to copy the above\n    specified materials from the same place.\n\n    e) Verify that the user has already received a copy of these\n    materials or that you have already sent this user a copy.\n\n  For an executable, the required form of the \"work that uses the\nLibrary\" must include any data and utility programs needed for\nreproducing the executable from it.  However, as a special exception,\nthe materials to be distributed need not include anything that is\nnormally distributed (in either source or binary form) with the major\ncomponents (compiler, kernel, and so on) of the operating system on\nwhich the executable runs, unless that component itself accompanies\nthe executable.\n\n  It may happen that this requirement contradicts the license\nrestrictions of other proprietary libraries that do not normally\naccompany the operating system.  Such a contradiction means you cannot\nuse both them and the Library together in an executable that you\ndistribute.\n\f\n  7. You may place library facilities that are a work based on the\nLibrary side-by-side in a single library together with other library\nfacilities not covered by this License, and distribute such a combined\nlibrary, provided that the separate distribution of the work based on\nthe Library and of the other library facilities is otherwise\npermitted, and provided that you do these two things:\n\n    a) Accompany the combined library with a copy of the same work\n    based on the Library, uncombined with any other library\n    facilities.  This must be distributed under the terms of the\n    Sections above.\n\n    b) Give prominent notice with the combined library of the fact\n    that part of it is a work based on the Library, and explaining\n    where to find the accompanying uncombined form of the same work.\n\n  8. You may not copy, modify, sublicense, link with, or distribute\nthe Library except as expressly provided under this License.  Any\nattempt otherwise to copy, modify, sublicense, link with, or\ndistribute the Library is void, and will automatically terminate your\nrights under this License.  However, parties who have received copies,\nor rights, from you under this License will not have their licenses\nterminated so long as such parties remain in full compliance.\n\n  9. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Library or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Library (or any work based on the\nLibrary), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Library or works based on it.\n\n  10. Each time you redistribute the Library (or any work based on the\nLibrary), the recipient automatically receives a license from the\noriginal licensor to copy, distribute, link with or modify the Library\nsubject to these terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties with\nthis License.\n\f\n  11. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Library at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Library by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Library.\n\nIf any portion of this section is held invalid or unenforceable under any\nparticular circumstance, the balance of the section is intended to apply,\nand the section as a whole is intended to apply in other circumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  12. If the distribution and/or use of the Library is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Library under this License may add\nan explicit geographical distribution limitation excluding those countries,\nso that distribution is permitted only in or among countries not thus\nexcluded.  In such case, this License incorporates the limitation as if\nwritten in the body of this License.\n\n  13. The Free Software Foundation may publish revised and/or new\nversions of the Lesser General Public License from time to time.\nSuch new versions will be similar in spirit to the present version,\nbut may differ in detail to address new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Library\nspecifies a version number of this License which applies to it and\n\"any later version\", you have the option of following the terms and\nconditions either of that version or of any later version published by\nthe Free Software Foundation.  If the Library does not specify a\nlicense version number, you may choose any version ever published by\nthe Free Software Foundation.\n\f\n  14. If you wish to incorporate parts of the Library into other free\nprograms whose distribution conditions are incompatible with these,\nwrite to the author to ask for permission.  For software which is\ncopyrighted by the Free Software Foundation, write to the Free\nSoftware Foundation; we sometimes make exceptions for this.  Our\ndecision will be guided by the two goals of preserving the free status\nof all derivatives of our free software and of promoting the sharing\nand reuse of software generally.\n\n\t\t\t    NO WARRANTY\n\n  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO\nWARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.\nEXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR\nOTHER PARTIES PROVIDE THE LIBRARY \"AS IS\" WITHOUT WARRANTY OF ANY\nKIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\nLIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME\nTHE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN\nWRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY\nAND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU\nFOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR\nCONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE\nLIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING\nRENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A\nFAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF\nSUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGES.\n\n\t\t\t    Linking with OpenSSL\n\n  17. In addition, as a special exception, we give permission to link the code\nof its release of libssh with the OpenSSL project's \"OpenSSL\" library (or with\nmodified versions of it that use the same license as the \"OpenSSL\" library),\nand distribute the linked executables. You must obey the GNU Lesser General\nPublic License in all respects for all of the code used other than \"OpenSSL\".\nIf you modify this file, you may extend this exception to your version of the\nfile, but you are not obligated to do so. If you do not wish to do so, delete\nthis exception statement from your version.\n\n\t\t     END OF TERMS AND CONDITIONS\n"
  },
  {
    "path": "src/libssh/CPackConfig.cmake",
    "content": "### GENERAL SETTINGS\nset(CPACK_PACKAGE_NAME ${PROJECT_NAME})\nset(CPACK_PACKAGE_DESCRIPTION_SUMMARY \"The SSH Library\")\nset(CPACK_PACKAGE_DESCRIPTION_FILE \"${CMAKE_CURRENT_SOURCE_DIR}/README\")\nset(CPACK_PACKAGE_VENDOR \"The SSH Library Development Team\")\nset(CPACK_PACKAGE_INSTALL_DIRECTORY ${CPACK_PACKAGE_NAME})\nset(CPACK_RESOURCE_FILE_LICENSE \"${CMAKE_CURRENT_SOURCE_DIR}/COPYING\")\n\nset(CPACK_PACKAGE_VERSION ${PROJECT_VERSION})\n\n# SOURCE GENERATOR\nset(CPACK_SOURCE_GENERATOR \"TXZ\")\nset(CPACK_SOURCE_IGNORE_FILES \"~$;[.]swp$;/[.]git/;/[.]clangd/;.gitignore;/build*;/obj*;tags;cscope.*;compile_commands.json;.*\\.patch\")\nset(CPACK_SOURCE_PACKAGE_FILE_NAME \"${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}\")\n\n### NSIS INSTALLER\nif (WIN32)\n    set(CPACK_GENERATOR \"ZIP\")\n\n    ### nsis generator\n    find_package(NSIS)\n    if (NSIS_MAKE)\n        set(CPACK_GENERATOR \"${CPACK_GENERATOR};NSIS\")\n        set(CPACK_NSIS_DISPLAY_NAME \"The SSH Library\")\n        set(CPACK_NSIS_COMPRESSOR \"/SOLID zlib\")\n        set(CPACK_NSIS_MENU_LINKS \"https://www.libssh.org/\" \"libssh homepage\")\n    endif (NSIS_MAKE)\nendif (WIN32)\n\nset(CPACK_PACKAGE_INSTALL_DIRECTORY \"libssh\")\n\nset(CPACK_PACKAGE_FILE_NAME ${APPLICATION_NAME}-${CPACK_PACKAGE_VERSION})\n\nset(CPACK_COMPONENT_LIBRARIES_DISPLAY_NAME \"Libraries\")\nset(CPACK_COMPONENT_HEADERS_DISPLAY_NAME \"C/C++ Headers\")\nset(CPACK_COMPONENT_LIBRARIES_DESCRIPTION\n  \"Libraries used to build programs which use libssh\")\nset(CPACK_COMPONENT_HEADERS_DESCRIPTION\n  \"C/C++ header files for use with libssh\")\nset(CPACK_COMPONENT_HEADERS_DEPENDS libraries)\nset(CPACK_COMPONENT_LIBRARIES_GROUP \"Development\")\nset(CPACK_COMPONENT_HEADERS_GROUP \"Development\")\n\ninclude(CPack)\n"
  },
  {
    "path": "src/libssh/CTestConfig.cmake",
    "content": "set(UPDATE_TYPE \"true\")\n\nset(CTEST_PROJECT_NAME \"libssh\")\nset(CTEST_NIGHTLY_START_TIME \"01:00:00 UTC\")\n\nset(CTEST_DROP_METHOD \"https\")\nset(CTEST_DROP_SITE \"test.libssh.org\")\nset(CTEST_DROP_LOCATION \"/submit.php?project=libssh\")\nset(CTEST_DROP_SITE_CDASH TRUE)\n"
  },
  {
    "path": "src/libssh/ChangeLog",
    "content": "ChangeLog\n==========\n\nversion 0.9.5 (released 2020-XX-XX)\n  * CVE-2020-16135: Avoid null pointer dereference in sftpserver (T232)\n  * Improve handling of library initialization (T222)\n  * Fix parsing of subsecond times in SFTP (T219)\n  * Make the documentation reproducible\n  * Remove deprecated API usage in OpenSSL\n  * Fix regression of ssh_channel_poll_timeout() returning SSH_AGAIN\n  * Define version in one place (T226)\n  * Prevent invalid free when using different C runtimes than OpenSSL (T229)\n  * Compatibility improvements to testsuite\n\nversion 0.9.4 (released 2020-04-09)\n  * Fixed CVE-2020-1730 - Possible DoS in client and server when handling\n    AES-CTR keys with OpenSSL\n  * Added diffie-hellman-group14-sha256\n  * Fixed serveral possible memory leaks\n\nversion 0.9.3 (released 2019-12-10)\n  * Fixed CVE-2019-14889 - SCP: Unsanitized location leads to command execution\n  * SSH-01-003 Client: Missing NULL check leads to crash in erroneous state\n  * SSH-01-006 General: Various unchecked Null-derefs cause DOS\n  * SSH-01-007 PKI Gcrypt: Potential UAF/double free with RSA pubkeys\n  * SSH-01-010 SSH: Deprecated hash function in fingerprinting\n  * SSH-01-013 Conf-Parsing: Recursive wildcards in hostnames lead to DOS\n  * SSH-01-014 Conf-Parsing: Integer underflow leads to OOB array access\n  * SSH-01-001 State Machine: Initial machine states should be set explicitly\n  * SSH-01-002 Kex: Differently bound macros used to iterate same array\n  * SSH-01-005 Code-Quality: Integer sign confusion during assignments\n  * SSH-01-008 SCP: Protocol Injection via unescaped File Names\n  * SSH-01-009 SSH: Update documentation which RFCs are implemented\n  * SSH-01-012 PKI: Information leak via uninitialized stack buffer\n\nversion 0.9.2 (released 2019-11-07)\n  * Fixed libssh-config.cmake\n  * Fixed issues with rsa algorithm negotiation (T191)\n  * Fixed detection of OpenSSL ed25519 support (T197)\n\nversion 0.9.1 (released 2019-10-25)\n  * Added support for Ed25519 via OpenSSL\n  * Added support for X25519 via OpenSSL\n  * Added support for localuser in Match keyword\n  * Fixed Match keyword to be case sensitive\n  * Fixed compilation with LibreSSL\n  * Fixed error report of channel open (T75)\n  * Fixed sftp documentation (T137)\n  * Fixed known_hosts parsing (T156)\n  * Fixed build issue with MinGW (T157)\n  * Fixed build with gcc 9 (T164)\n  * Fixed deprecation issues (T165)\n  * Fixed known_hosts directory creation (T166)\n\nversion 0.9.0 (released 2019-06-28)\n  * Added support for AES-GCM\n  * Added improved rekeying support\n  * Added performance improvements\n  * Disabled blowfish support by default\n  * Fixed several ssh config parsing issues\n  * Added support for DH Group Exchange KEX\n  * Added support for Encrypt-then-MAC mode\n  * Added support for parsing server side configuration file\n  * Added support for ECDSA/Ed25519 certificates\n  * Added FIPS 140-2 compatibility\n  * Improved known_hosts parsing\n  * Improved documentation\n  * Improved OpenSSL API usage for KEX, DH, and signatures\n\nversion 0.8.7 (released 2019-02-25)\n  * Fixed handling extension flags in the server implementation\n  * Fixed exporting ed25519 private keys\n  * Fixed corner cases for rsa-sha2 signatures\n  * Fixed some issues with connector\n\nversion 0.8.6 (released 2018-12-24)\n  * Fixed compilation issues with different OpenSSL versions\n  * Fixed StrictHostKeyChecking in new knownhosts API\n  * Fixed ssh_send_keepalive() with packet filter\n  * Fixed possible crash with knownhosts options\n  * Fixed issus with rekeying\n  * Fixed strong ECDSA keys\n  * Fixed some issues with rsa-sha2 extentions\n  * Fixed access violation in ssh_init() (static linking)\n  * Fixed ssh_channel_close() handling\n\nversion 0.8.5 (released 2018-10-29)\n  * Added support to get known_hosts locations with ssh_options_get()\n  * Fixed preferred algorithm for known hosts negotiations\n  * Fixed KEX with some server implementations (e.g. Cisco)\n  * Fixed issues with MSVC\n  * Fixed keyboard-interactive auth in server mode\n    (regression from CVE-2018-10933)\n  * Fixed gssapi auth in server mode (regression from CVE-2018-10933)\n  * Fixed socket fd handling with proxy command\n  * Fixed a memory leak with OpenSSL\n\nversion 0.8.4 (released 2018-10-16)\n  * Fixed CVE-2018-10933\n  * Fixed building without globbing support\n  * Fixed possible memory leaks\n  * Avoid SIGPIPE on sockets\n\nversion 0.8.3 (released 2018-09-21)\n  * Added support for rsa-sha2\n  * Added support to parse private keys in openssh container format\n    (other than ed25519)\n  * Added support for diffie-hellman-group18-sha512 and\n    diffie-hellman-group16-sha512\n  * Added ssh_get_fingerprint_hash()\n  * Added ssh_pki_export_privkey_base64()\n  * Added support for Match keyword in config file\n  * Improved performance and reduced memory footprint for sftp\n  * Fixed ecdsa publickey auth\n  * Fixed reading a closed channel\n  * Added support to announce posix-rename@openssh.com and\n    hardlink@openssh.com in the sftp server\n\nversion 0.8.2 (released 2018-08-30)\n  * Added sha256 fingerprints for pubkeys\n  * Improved compiler flag detection\n  * Fixed race condition in reading sftp messages\n  * Fixed doxygen generation and added modern style\n  * Fixed library initialization on Windows\n  * Fixed __bounded__ attribute detection\n  * Fixed a bug in the options parser\n  * Fixed documentation for new knwon_hosts API\n\nversion 0.8.1 (released 2018-08-13)\n  * Fixed version number in the header\n  * Fixed version number in pkg-config and cmake config\n  * Fixed library initialization\n  * Fixed attribute detection\n\nversion 0.8.0 (released 2018-08-10)\n  * Removed support for deprecated SSHv1 protocol\n  * Added new connector API for clients\n  * Added new known_hosts parsing API\n  * Added support for OpenSSL 1.1\n  * Added support for chacha20-poly1305 cipher\n  * Added crypto backend for mbedtls crypto library\n  * Added ECDSA support with gcrypt backend\n  * Added advanced client and server testing using cwrap.org\n  * Added support for curve25519-sha256 alias\n  * Added support for global known_hosts file\n  * Added support for symbol versioning\n  * Improved ssh_config parsing\n  * Improved threading support\n\nversion 0.7.5 (released 2017-04-13)\n  * Fixed a memory allocation issue with buffers\n  * Fixed PKI on Windows\n  * Fixed some SSHv1 functions\n  * Fixed config hostname expansion\n\nversion 0.7.4 (released 2017-02-03)\n  * Added id_ed25519 to the default identity list\n  * Fixed sftp EOF packet handling\n  * Fixed ssh_send_banner() to confirm with RFC 4253\n  * Fixed some memory leaks\n\nversion 0.7.3 (released 2016-01-23)\n  * Fixed CVE-2016-0739\n  * Fixed ssh-agent on big endian\n  * Fixed some documentation issues\n\nversion 0.7.2 (released 2015-09-15)\n  * Fixed OpenSSL detection on Windows\n  * Fixed return status for ssh_userauth_agent()\n  * Fixed KEX to prefer hmac-sha2-256\n  * Fixed sftp packet handling\n  * Fixed return values of ssh_key_is_(public|private)\n  * Fixed bug in global success reply\n\nversion 0.7.1 (released 2015-06-30)\n  * Fixed SSH_AUTH_PARTIAL auth with auto public key\n  * Fixed memory leak in session options\n  * Fixed allocation of ed25519 public keys\n  * Fixed channel exit-status and exit-signal\n  * Reintroduce ssh_forward_listen()\n\nversion 0.7.0 (released 2015-05-11)\n  * Added support for ed25519 keys\n  * Added SHA2 algorithms for HMAC\n  * Added improved and more secure buffer handling code\n  * Added callback for auth_none_function\n  * Added support for ECDSA private key signing\n  * Added more tests\n  * Fixed a lot of bugs\n  * Improved API documentation\n\nversion 0.6.5 (released 2015-04-29)\n  * Fixed CVE-2015-3146\n  * Fixed port handling in config file\n  * Fixed the build with libgcrypt\n  * Fixed SFTP endian issues (rlo #179)\n  * Fixed uninitilized sig variable (rlo #167)\n  * Fixed polling issues which could result in a hang\n  * Fixed handling of EINTR in ssh_poll() (rlo #186)\n  * Fixed C99 issues with __func__\n  * Fixed some memory leaks\n  * Improved macro detection on Windows\n\nversion 0.6.4 (released 2014-12-19)\n  * Fixed CVE-2014-8132.\n  * Added SHA-2 for session ID signing with ECDSA keys.\n  * Added support for ECDSA host keys.\n  * Added support for more ECDSA hostkey algorithms.\n  * Added ssh_pki_key_ecdsa_name() API.\n  * Fixed setting the bindfd only after successful listen.\n  * Fixed issues with user created sockets.\n  * Fixed several issues in libssh C++ wrapper.\n  * Fixed several documentation issues.\n  * Fixed channel exit-signal request.\n  * Fixed X11 request screen number in messages.\n  * Fixed several memory leaks.\n\nversion 0.6.3 (released 2014-03-04)\n  * Fixed CVE-2014-0017.\n  * Fixed memory leak with ecdsa signatures.\n\nversion 0.6.2 (released 2014-03-04)\n  * security: fix for vulnerability CVE-2014-0017\n\nversion 0.6.1 (released 2014-02-08)\n  * Added support for libgcrypt 1.6.\n  * Added ssh_channel_accept_forward().\n  * Added known_hosts heuristic during connection (#138).\n  * Added getters for session cipher names.\n  * Fixed decrypt of zero length buffer.\n  * Fixed padding in RSA signature blobs.\n  * Fixed DSA signature extraction.\n  * Fixed some memory leaks.\n  * Fixed read of non-connected socket.\n  * Fixed thread dectection.\n\nversion 0.6.0 (released 2014-01-08)\n  * Added new publicy key API.\n  * Added new userauth API.\n  * Added ssh_get_publickey_hash() function.\n  * Added ssh_get_poll_flags() function.\n  * Added gssapi-mic userauth.\n  * Added GSSAPIServerIdentity option.\n  * Added GSSAPIClientIdentity option.\n  * Added GSSAPIDelegateCredentials option.\n  * Added new callback based server API.\n  * Added Elliptic Curve DSA (ECDSA) support (with OpenSSL).\n  * Added Elliptic Curve Diffie Hellman (ECDH) support.\n  * Added Curve25519 for ECDH key exchange.\n  * Added improved logging system.\n  * Added SSH-agent forwarding.\n  * Added key-reexchange.\n  * Added more unit tests.\n  * Improved documentation.\n  * Fixed timeout handling.\n\nversion 0.5.5 (released 2013-07-26)\n  * BUG 103: Fix ProxyCommand parsing.\n  * Fix setting -D_FORTIFY_SOURCE=2.\n  * Fix pollset error return if emtpy.\n  * Fix NULL pointer checks in channel functions.\n  * Several bugfixes.\n\nversion 0.5.4 (released 2013-01-22)\n  * CVE-2013-0176 - NULL dereference leads to denial of service\n  * Fixed several NULL pointer dereferences in SSHv1.\n  * Fixed a free crash bug in options parsing.\n\nversion 0.5.3 (released 2012-11-20)\n  * CVE-2012-4559 Fixed multiple double free() flaws.\n  * CVE-2012-4560 Fixed multiple buffer overflow flaws.\n  * CVE-2012-4561 Fixed multiple invalid free() flaws.\n  * BUG #84 - Fix bug in sftp_mkdir not returning on error.\n  * BUG #85 - Fixed a possible channel infinite loop if the connection dropped.\n  * BUG #88 - Added missing channel request_state and set it to accepted.\n  * BUG #89 - Reset error state to no error on successful SSHv1 authentiction.\n  * Fixed a possible use after free in ssh_free().\n  * Fixed multiple possible NULL pointer dereferences.\n  * Fixed multiple memory leaks in error paths.\n  * Fixed timeout handling.\n  * Fixed regression in pre-connected socket setting.\n  * Handle all unknown global messages.\n\nversion 0.5.2 (released 2011-09-17)\n  * Increased window size x10.\n  * Fixed SSHv1.\n  * Fixed bugged lists.\n  * Fixed use-after-free + inconsistent callbacks call in poll.\n  * Fixed scp documentation.\n  * Fixed possible infinite loop in channel_read().\n  * Fixed handling of short reads of sftp_async_read().\n  * Fixed handling request service timeout in blocking mode.\n  * Fixed ssh_auth_list() documentation.\n  * Fixed incorrect return values in ssh_channel_write().\n  * Fixed an infinite loop in the termination callback.\n  * Fixed handling of SSH_AGAIN in channel_open().\n  * Fixed \"status -5 inflating zlib packet\"\n\nversion 0.5.1 (released 2011-08-09)\n  * Added checks for NULL pointers in string.c.\n  * Set the channel max packet size to 32768.\n  * Don't (de)compress empty buffers.\n  * Fixed ssh_scp_write so it works when doing recursive copy.\n  * Fixed another source of endless wait.\n  * Fixed an endless loop in case of a channel_open error.\n  * Fixed session timeout handling.\n  * Fixed ssh_channel_from_local() loop.\n  * Fixed permissions of scp example when we copy a file.\n  * Workaround ssh_get_user_home_dir on LDAP users.\n  * Added pkg-config support for libssh_threads.\n  * Fixed compilation without server and sftp modes.\n  * Fix static .lib overwriting on Windows.\n\nversion 0.5.0 (released 2011-06-01)\n  * Added ssh_ prefix to all functions.\n  * Added complete Windows support.\n  * Added improved server support.\n  * Added unit tests for a lot of functions.\n  * Added asynchronous service request.\n  * Added a multiplatform ssh_getpass() function.\n  * Added a tutorial.\n  * Added a lot of documentation.\n  * Fixed a lot of bugs.\n  * Fixed several memory leaks.\n\nversion 0.4.8 (released 2011-01-15)\n  * Fixed memory leaks in session signing.\n  * Fixed memory leak in ssh_print_hexa.\n  * Fixed problem with ssh_connect w/ timeout and fd > 1024.\n  * Fixed some warnings on OS/2.\n  * Fixed installation path for OS/2.\n\nversion 0.4.7 (released 2010-12-28)\n  * Fixed a possible memory leak in ssh_get_user_home().\n  * Fixed a memory leak in sftp_xstat.\n  * Fixed uninitialized fd->revents member.\n  * Fixed timout value in ssh_channel_accept().\n  * Fixed length checks in ssh_analyze_banner().\n  * Fixed a possible data overread and crash bug.\n  * Fixed setting max_fd which breaks ssh_select().\n  * Fixed some pedantic build warnings.\n  * Fixed a memory leak with session->bindaddr.\n\nversion 0.4.6 (released 2010-09-03)\n  * Added a cleanup function to free the ws2_32 library.\n  * Fixed build with gcc 3.4.\n  * Fixed the Windows build on Vista and newer.\n  * Fixed the usage of WSAPoll() on Windows.\n  * Fixed \"@deprecated\" in doxygen\n  * Fixed some mingw warnings.\n  * Fixed handling of opened channels.\n  * Fixed keepalive problem on older openssh servers.\n  * Fixed testing for big endian on Windows.\n  * Fixed the Windows preprocessor macros and defines.\n\nversion 0.4.5 (released 2010-07-13)\n  * Added option to bind a client to an ip address.\n  * Fixed the ssh socket polling function.\n  * Fixed Windows related bugs in bsd_poll().\n  * Fixed serveral build warnings.\n\nversion 0.4.4 (released 2010-06-01)\n  * Fixed a bug in the expand function for escape sequences.\n  * Fixed a bug in the tilde expand function.\n  * Fixed a bug in setting the options.\n\nversion 0.4.3 (released 2010-05-18)\n  * Added global/keepalive responses.\n  * Added runtime detection of WSAPoll().\n  * Added a select(2) based poll-emulation if poll(2) is not available.\n  * Added a function to expand an escaped string.\n  * Added a function to expand the tilde from a path.\n  * Added a proxycommand support.\n  * Added ssh_privatekey_type public function\n  * Added the possibility to define _OPENSSL_DIR and _ZLIB_DIR.\n  * Fixed sftp_chown.\n  * Fixed sftp_rename on protocol version 3.\n  * Fixed a blocking bug in channel_poll.\n  * Fixed config parsing wich has overwritten user specified values.\n  * Fixed hashed [host]:port format in knownhosts\n  * Fixed Windows build.\n  * Fixed doublefree happening after a negociation error.\n  * Fixed aes*-ctr with <= OpenSSL 0.9.7b.\n  * Fixed some documentation.\n  * Fixed exec example which has broken read usage.\n  * Fixed broken algorithm choice for server.\n  * Fixed a typo that we don't export all symbols.\n  * Removed the unneeded dependency to doxygen.\n  * Build examples only on the Linux plattform.\n\nversion 0.4.2 (released 2010-03-15)\n  * Added owner and group information in sftp attributes.\n  * Added missing SSH_OPTIONS_FD option.\n  * Added printout of owner and group in the sftp example.\n  * Added a prepend function for ssh_list.\n  * Added send back replies to openssh's keepalives.\n  * Fixed documentation in scp code\n  * Fixed longname parsing, this only workings with readdir.\n  * Fixed and added support for several identity files.\n  * Fixed sftp_parse_longname() on Windows.\n  * Fixed a race condition bug in ssh_scp_close()\n  * Remove config support for SSHv1 Cipher variable.\n  * Rename ssh_list_add to ssh_list_append.\n  * Rename ssh_list_get_head to ssh_list_pop_head\n\nversion 0.4.1 (released 2010-02-13)\n  * Added support for aes128-ctr, aes192-ctr and aes256-ctr encryption.\n  * Added an example for exec.\n  * Added private key type detection feature in privatekey_from_file().\n  * Fixed zlib compression fallback.\n  * Fixed kex bug that client preference should be prioritary\n  * Fixed known_hosts file set by the user.\n  * Fixed a memleak in channel_accept().\n  * Fixed underflow when leave_function() are unbalanced\n  * Fixed memory corruption in handle_channel_request_open().\n  * Fixed closing of a file handle case of errors in privatekey_from_file().\n  * Fixed ssh_get_user_home_dir() to be thread safe.\n  * Fixed the doxygen documentation.\n\nversion 0.4.0 (released 2009-12-10)\n  * Added scp support.\n  * Added support for sending signals (RFC 4254, section 6.9).\n  * Added MSVC support.\n  * Added support for ~/.ssh/config.\n  * Added sftp extension support.\n  * Added X11 forwarding support for client.\n  * Added forward listening.\n  * Added support for openssh extensions (statvfs, fstatvfs).\n  * Added a cleaned up interface for setting options.\n  * Added a generic way to handle sockets asynchronously.\n  * Added logging of the sftp flags used to open a file.\n  * Added full poll() support and poll-emulation for win32.\n  * Added missing 64bit functions in sftp.\n  * Added support for ~/ and SSH_DIR/ in filenames instead of %s/.\n  * Fixed Fix channel_get_exit_status bug.\n  * Fixed calltrace logging to make it optional.\n  * Fixed compilation on Solaris.\n  * Fixed resolving of ip addresses.\n  * Fixed libssh compilation without server support.\n  * Fixed possible memory corruptions (ticket #14).\n\nversion 0.3.4 (released 2009-09-14)\n  * Added ssh_basename and ssh_dirname.\n  * Added a portable ssh_mkdir function.\n  * Added a sftp_tell64() function.\n  * Added missing NULL pointer checks to crypt_set_algorithms_server.\n  * Fixed ssh_write_knownhost if ~/.ssh doesn't exist.\n  * Fixed a possible integer overflow in buffer_get_data().\n  * Fixed possible security bug in packet_decrypt().\n  * Fixed a possible stack overflow in agent code.\n\nversion 0.3.3 (released 2009-08-18)\n  * Fixed double free pointer crash in dsa_public_to_string.\n  * Fixed channel_get_exit_status bug.\n  * Fixed ssh_finalize which didn't clear the flag.\n  * Fixed memory leak introduced by previous bugfix.\n  * Fixed channel_poll broken when delayed EOF recvd.\n  * Fixed stupid \"can't parse known host key\" bug.\n  * Fixed possible memory corruption (ticket #14).\n\nversion 0.3.2 (released 2009-08-05)\n  * Added ssh_init() function.\n  * Added sftp_readlink() function.\n  * Added sftp_symlink() function.\n  * Fixed ssh_write_knownhost().\n  * Fixed compilation on Solaris.\n  * Fixed SSHv1 compilation.\n\nversion 0.3.1 (released 2009-07-14)\n  * Added return code SSH_SERVER_FILE_NOT_FOUND.\n  * Fixed compilation of SSHv1.\n  * Fixed several memory leaks.\n  * Fixed possible infinite loops.\n  * Fixed a possible crash bug.\n  * Fixed build warnings.\n  * Fixed cmake on BSD.\nversion 0.3.1 (released 2009-07-14)\n  * Added return code SSH_SERVER_FILE_NOT_FOUND.\n  * Fixed compilation of SSHv1.\n  * Fixed several memory leaks.\n  * Fixed possible infinite loops.\n  * Fixed a possible crash bug.\n  * Fixed build warnings.\n  * Fixed cmake on BSD.\n\nversion 0.3 (released 2009-05-21)\n  * Added support for ssh-agent authentication.\n  * Added POSIX like sftp implementation.\n  * Added error checking to all functions.\n  * Added const to arguments where it was needed.\n  * Added a channel_get_exit_status() function.\n  * Added a channel_read_buffer() function, channel_read() is now\n    a POSIX like function.\n  * Added a more generic auth callback function.\n  * Added printf attribute checking for log and error functions.\n  * Added runtime function tracer support.\n  * Added NSIS build support with CPack.\n  * Added openssh hashed host support.\n  * Added API documentation for all public functions.\n  * Added asynchronous SFTP read function.\n  * Added a ssh_bind_set_fd() function.\n  * Fixed known_hosts parsing.\n  * Fixed a lot of build warnings.\n  * Fixed the Windows build.\n  * Fixed a lot of memory leaks.\n  * Fixed a double free corruption in the server support.\n  * Fixed the \"ssh_accept:\" bug in server support.\n  * Fixed important channel bugs.\n  * Refactored the socket handling.\n  * Switched to CMake build system.\n  * Improved performance.\n\nversion 0.2 (released 2007-11-29)\n  * General cleanup\n  * More comprehensive API\n  * Up-to-date Doxygen documentation of each public function\n  * Basic server-based support\n  * Libgcrypt support (alternative to openssl and its license)\n  * SSH1 support (disabled by default)\n  * Added 3des-cbc\n  * A lot of bugfixes\n\nversion 0.11-dev\n  * Server implementation development.\n  * Small bug corrected when connecting to sun ssh servers.\n  * Channel wierdness corrected (writing huge data packets)\n  * Channel_read_nonblocking added\n  * Channel bug where stderr wasn't correctly read fixed.\n  * Added sftp_file_set_nonblocking(), which is nonblocking SFTP IO\n  * Connect_status callback.\n  * Priv.h contains the internal functions, libssh.h the public interface\n  * Options_set_timeout (thx marcelo) really working.\n  * Tcp tunneling through channel_open_forward.\n  * Channel_request_exec()\n  * Channel_request_env()\n  * Ssh_get_pubkey_hash()\n  * Ssh_is_server_known()\n  * Ssh_write_known_host()\n  * Options_set_ssh_dir\n  * How could this happen ! there weren't any channel_close !\n  * Nasty channel_free bug resolved.\n  * Removed the unsigned long all around the code. use only u8,u32 & u64.\n  * It now compiles and runs under amd64 !\n  * Channel_request_pty_size\n  * Channel_change_pty_size\n  * Options_copy()\n  * Ported the doc to an HTML file.\n  * Small bugfix in packet.c\n  * Prefixed error constants with SSH_\n  * Sftp_stat, sftp_lstat, sftp_fstat. thanks Michel Bardiaux for the patch.\n  * Again channel number mismatch fixed.\n  * Fixed a bug in ssh_select making the select fail when a signal has been\n    caught.\n  * Keyboard-interactive authentication working.\n\nversion 0.1 (released 2004-03-05)\n  * Begining of sftp subsystem implementation.\n  * Some cleanup into channels implementation\n  * Now every channel functions is called by its CHANNEL handler.\n  * Added channel_poll() and channel_read().\n  * Changed the client so it uses the new channel_poll and channel_read interface\n  * Small use-after-free bug with channels resolved\n  * Changed stupidities in lot of function names.\n  * Removed a debug output file opened by default.\n  * Added API.txt, the libssh programmer handbook.\n  * Various bug fixes from Nick Zitzmann.\n  * Developed a cryptographic structure for handling protocols.\n  * An autoconf script which took me half of a day to set up.\n  * A ssh_select wrapper has been written.\n\nversion 0.0.4 (released 2003-10-10)\n  * Some terminal code (eof handling) added\n  * Channels bugfix (it still needs some tweaking though)\n  * Zlib support\n  * Added a wrapper.c file. The goal is to provide a similar API to every\n    cryptographic functions. bignums and sha/md5 are wrapped now.\n  * More work than it first looks.\n  * Support for other crypto libs planed (lighter libs)\n  * Fixed stupid select() bug.\n  * Libssh now compiles and links with openssl 0.9.6\n  * RSA pubkey authentication code now works !\n\nversion 0.0.3 (released 2003-09-15)\n  * Added install target in makefile\n  * Some cleanup in headers files and source code\n  * Change default banner and project name to libssh.\n  * New file auth.c to support more and more authentication ways\n  * Bugfix(read offbyone) in send_kex\n  * A base64 parser. don't read the source, it's awful. pure 0xbadc0de.\n  * Changed the client filename to \"ssh\". logic isn't it ?\n  * Dss publickey authentication ! still need to wait for the rsa one\n  * Bugfix in packet.c\n  * New misc.c contains misc functions\n\nversion 0.0.2 (released 2003-09-03)\n  * Initial release.\n  * Client supports both ssh and dss hostkey verification, but doesn't compare them to openssh's files. (~/.ssh/known_hosts)\n  * The only supported authentication method is password.\n  * Compiles on linux and openbsd. freebsd and netbsd should work, too\n  * Lot of work which hasn't been discussed here.\n"
  },
  {
    "path": "src/libssh/CompilerChecks.cmake",
    "content": "include(AddCCompilerFlag)\ninclude(CheckCCompilerFlagSSP)\n\nif (UNIX)\n    #\n    # Check for -Werror turned on if possible\n    #\n    # This will prevent that compiler flags are detected incorrectly.\n    #\n    check_c_compiler_flag(\"-Werror\" REQUIRED_FLAGS_WERROR)\n    if (REQUIRED_FLAGS_WERROR)\n        set(CMAKE_REQUIRED_FLAGS \"-Werror\")\n\n        if (PICKY_DEVELOPER)\n            list(APPEND SUPPORTED_COMPILER_FLAGS \"-Werror\")\n        endif()\n    endif()\n\n    add_c_compiler_flag(\"-std=gnu99\" SUPPORTED_COMPILER_FLAGS)\n    add_c_compiler_flag(\"-Wpedantic\" SUPPORTED_COMPILER_FLAGS)\n    add_c_compiler_flag(\"-Wall\" SUPPORTED_COMPILER_FLAGS)\n    add_c_compiler_flag(\"-Wshadow\" SUPPORTED_COMPILER_FLAGS)\n    add_c_compiler_flag(\"-Wmissing-prototypes\" SUPPORTED_COMPILER_FLAGS)\n    add_c_compiler_flag(\"-Wcast-align\" SUPPORTED_COMPILER_FLAGS)\n    #add_c_compiler_flag(\"-Wcast-qual\" SUPPORTED_COMPILER_FLAGS)\n    add_c_compiler_flag(\"-Werror=address\" SUPPORTED_COMPILER_FLAGS)\n    add_c_compiler_flag(\"-Wstrict-prototypes\" SUPPORTED_COMPILER_FLAGS)\n    add_c_compiler_flag(\"-Werror=strict-prototypes\" SUPPORTED_COMPILER_FLAGS)\n    add_c_compiler_flag(\"-Wwrite-strings\" SUPPORTED_COMPILER_FLAGS)\n    add_c_compiler_flag(\"-Werror=write-strings\" SUPPORTED_COMPILER_FLAGS)\n    add_c_compiler_flag(\"-Werror-implicit-function-declaration\" SUPPORTED_COMPILER_FLAGS)\n    add_c_compiler_flag(\"-Wpointer-arith\" SUPPORTED_COMPILER_FLAGS)\n    add_c_compiler_flag(\"-Werror=pointer-arith\" SUPPORTED_COMPILER_FLAGS)\n    add_c_compiler_flag(\"-Wdeclaration-after-statement\" SUPPORTED_COMPILER_FLAGS)\n    add_c_compiler_flag(\"-Werror=declaration-after-statement\" SUPPORTED_COMPILER_FLAGS)\n    add_c_compiler_flag(\"-Wreturn-type\" SUPPORTED_COMPILER_FLAGS)\n    add_c_compiler_flag(\"-Werror=return-type\" SUPPORTED_COMPILER_FLAGS)\n    add_c_compiler_flag(\"-Wuninitialized\" SUPPORTED_COMPILER_FLAGS)\n    add_c_compiler_flag(\"-Werror=uninitialized\" SUPPORTED_COMPILER_FLAGS)\n    add_c_compiler_flag(\"-Wimplicit-fallthrough\" SUPPORTED_COMPILER_FLAGS)\n    add_c_compiler_flag(\"-Werror=strict-overflow\" SUPPORTED_COMPILER_FLAGS)\n    add_c_compiler_flag(\"-Wstrict-overflow=2\" SUPPORTED_COMPILER_FLAGS)\n    add_c_compiler_flag(\"-Wno-format-zero-length\" SUPPORTED_COMPILER_FLAGS)\n    add_c_compiler_flag(\"-Wmissing-field-initializers\" SUPPORTED_COMPILER_FLAGS)\n    add_c_compiler_flag(\"-Wsign-compare\" SUPPORTED_COMPILER_FLAGS)\n\n    check_c_compiler_flag(\"-Wformat\" REQUIRED_FLAGS_WFORMAT)\n    if (REQUIRED_FLAGS_WFORMAT)\n        list(APPEND SUPPORTED_COMPILER_FLAGS \"-Wformat\")\n        set(CMAKE_REQUIRED_FLAGS \"${CMAKE_REQUIRED_FLAGS} -Wformat\")\n    endif()\n    add_c_compiler_flag(\"-Wformat-security\" SUPPORTED_COMPILER_FLAGS)\n    add_c_compiler_flag(\"-Werror=format-security\" SUPPORTED_COMPILER_FLAGS)\n\n    # Allow zero for a variadic macro argument\n    string(TOLOWER \"${CMAKE_C_COMPILER_ID}\" _C_COMPILER_ID)\n    if (\"${_C_COMPILER_ID}\" STREQUAL \"clang\")\n        add_c_compiler_flag(\"-Wno-gnu-zero-variadic-macro-arguments\" SUPPORTED_COMPILER_FLAGS)\n    endif()\n\n    add_c_compiler_flag(\"-fno-common\" SUPPORTED_COMPILER_FLAGS)\n\n    if (CMAKE_BUILD_TYPE)\n        string(TOLOWER \"${CMAKE_BUILD_TYPE}\" CMAKE_BUILD_TYPE_LOWER)\n        if (CMAKE_BUILD_TYPE_LOWER MATCHES (release|relwithdebinfo|minsizerel))\n            add_c_compiler_flag(\"-Wp,-D_FORTIFY_SOURCE=2\" SUPPORTED_COMPILER_FLAGS)\n        endif()\n    endif()\n\n    check_c_compiler_flag_ssp(\"-fstack-protector-strong\" WITH_STACK_PROTECTOR_STRONG)\n    if (WITH_STACK_PROTECTOR_STRONG)\n        list(APPEND SUPPORTED_COMPILER_FLAGS \"-fstack-protector-strong\")\n        # This is needed as Solaris has a seperate libssp\n        if (SOLARIS)\n            list(APPEND SUPPORTED_LINKER_FLAGS \"-fstack-protector-strong\")\n        endif()\n    else (WITH_STACK_PROTECTOR_STRONG)\n        check_c_compiler_flag_ssp(\"-fstack-protector\" WITH_STACK_PROTECTOR)\n        if (WITH_STACK_PROTECTOR)\n            list(APPEND SUPPORTED_COMPILER_FLAGS \"-fstack-protector\")\n            # This is needed as Solaris has a seperate libssp\n            if (SOLARIS)\n                list(APPEND SUPPORTED_LINKER_FLAGS \"-fstack-protector\")\n            endif()\n        endif()\n    endif (WITH_STACK_PROTECTOR_STRONG)\n\n    check_c_compiler_flag_ssp(\"-fstack-clash-protection\" WITH_STACK_CLASH_PROTECTION)\n    if (WITH_STACK_CLASH_PROTECTION)\n        list(APPEND SUPPORTED_COMPILER_FLAGS \"-fstack-clash-protection\")\n    endif()\n\n    if (PICKY_DEVELOPER)\n        add_c_compiler_flag(\"-Wno-error=deprecated-declarations\" SUPPORTED_COMPILER_FLAGS)\n        add_c_compiler_flag(\"-Wno-error=tautological-compare\" SUPPORTED_COMPILER_FLAGS)\n    endif()\n\n    add_c_compiler_flag(\"-Wno-deprecated-declarations\" DEPRECATION_COMPILER_FLAGS)\n\n    # Unset CMAKE_REQUIRED_FLAGS\n    unset(CMAKE_REQUIRED_FLAGS)\nendif()\n\nif (MSVC)\n    add_c_compiler_flag(\"/D _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES=1\" SUPPORTED_COMPILER_FLAGS)\n    add_c_compiler_flag(\"/D _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES_COUNT=1\" SUPPORTED_COMPILER_FLAGS)\n    add_c_compiler_flag(\"/D _CRT_NONSTDC_NO_WARNINGS=1\" SUPPORTED_COMPILER_FLAGS)\n    add_c_compiler_flag(\"/D _CRT_SECURE_NO_WARNINGS=1\" SUPPORTED_COMPILER_FLAGS)\nendif()\n\n# This removes this annoying warning\n# \"warning: 'BN_CTX_free' is deprecated: first deprecated in OS X 10.7 [-Wdeprecated-declarations]\"\nif (OSX)\n    add_c_compiler_flag(\"-Wno-deprecated-declarations\" SUPPORTED_COMPILER_FLAGS)\nendif()\n\nset(DEFAULT_C_COMPILE_FLAGS ${SUPPORTED_COMPILER_FLAGS} CACHE INTERNAL \"Default C Compiler Flags\" FORCE)\nset(DEFAULT_LINK_FLAGS ${SUPPORTED_LINKER_FLAGS} CACHE INTERNAL \"Default C Linker Flags\" FORCE)\n\nif (DEPRECATION_COMPILER_FLAGS)\n    set(DEFAULT_C_NO_DEPRECATION_FLAGS ${DEPRECATION_COMPILER_FLAGS} CACHE INTERNAL \"Default no deprecation flags\" FORCE)\nendif()\n"
  },
  {
    "path": "src/libssh/ConfigureChecks.cmake",
    "content": "include(CheckIncludeFile)\ninclude(CheckIncludeFiles)\ninclude(CheckSymbolExists)\ninclude(CheckFunctionExists)\ninclude(CheckLibraryExists)\ninclude(CheckTypeSize)\ninclude(CheckStructHasMember)\ninclude(TestBigEndian)\n\nset(PACKAGE ${PROJECT_NAME})\nset(VERSION ${PROJECT_VERSION})\nset(SYSCONFDIR ${CMAKE_INSTALL_SYSCONFDIR})\n\nset(BINARYDIR ${CMAKE_BINARY_DIR})\nset(SOURCEDIR ${CMAKE_SOURCE_DIR})\n\nfunction(COMPILER_DUMPVERSION _OUTPUT_VERSION)\n    # Remove whitespaces from the argument.\n    # This is needed for CC=\"ccache gcc\" cmake ..\n    string(REPLACE \" \" \"\" _C_COMPILER_ARG \"${CMAKE_C_COMPILER_ARG1}\")\n\n    execute_process(\n        COMMAND\n            ${CMAKE_C_COMPILER} ${_C_COMPILER_ARG} -dumpversion\n        OUTPUT_VARIABLE _COMPILER_VERSION\n    )\n\n    string(REGEX REPLACE \"([0-9])\\\\.([0-9])(\\\\.[0-9])?\" \"\\\\1\\\\2\"\n           _COMPILER_VERSION \"${_COMPILER_VERSION}\")\n\n    set(${_OUTPUT_VERSION} ${_COMPILER_VERSION} PARENT_SCOPE)\nendfunction()\n\nif(CMAKE_COMPILER_IS_GNUCC AND NOT MINGW AND NOT OS2)\n    compiler_dumpversion(GNUCC_VERSION)\n    if (NOT GNUCC_VERSION EQUAL 34)\n        set(CMAKE_REQUIRED_FLAGS \"-fvisibility=hidden\")\n        check_c_source_compiles(\n\"void __attribute__((visibility(\\\"default\\\"))) test() {}\nint main(void){ return 0; }\n\" WITH_VISIBILITY_HIDDEN)\n        unset(CMAKE_REQUIRED_FLAGS)\n    endif (NOT GNUCC_VERSION EQUAL 34)\nendif(CMAKE_COMPILER_IS_GNUCC AND NOT MINGW AND NOT OS2)\n\n# HEADER FILES\nset(CMAKE_REQUIRED_INCLUDES ${CMAKE_REQUIRED_INCLUDES} ${ARGP_INCLUDE_DIR})\ncheck_include_file(argp.h HAVE_ARGP_H)\nunset(CMAKE_REQUIRED_INCLUDES)\n\ncheck_include_file(pty.h HAVE_PTY_H)\ncheck_include_file(utmp.h HAVE_UTMP_H)\ncheck_include_file(termios.h HAVE_TERMIOS_H)\ncheck_include_file(unistd.h HAVE_UNISTD_H)\ncheck_include_file(stdint.h HAVE_STDINT_H)\ncheck_include_file(util.h HAVE_UTIL_H)\ncheck_include_file(libutil.h HAVE_LIBUTIL_H)\ncheck_include_file(sys/time.h HAVE_SYS_TIME_H)\ncheck_include_file(sys/utime.h HAVE_SYS_UTIME_H)\ncheck_include_file(sys/param.h HAVE_SYS_PARAM_H)\ncheck_include_file(arpa/inet.h HAVE_ARPA_INET_H)\ncheck_include_file(byteswap.h HAVE_BYTESWAP_H)\ncheck_include_file(glob.h HAVE_GLOB_H)\ncheck_include_file(valgrind/valgrind.h HAVE_VALGRIND_VALGRIND_H)\n\nif (WIN32)\n  check_include_file(io.h HAVE_IO_H)\n\n  check_include_files(\"winsock2.h;ws2tcpip.h;wspiapi.h\" HAVE_WSPIAPI_H)\n  if (NOT HAVE_WSPIAPI_H)\n    message(STATUS \"WARNING: Without wspiapi.h, this build will only work on Windows XP and newer versions\")\n  endif (NOT HAVE_WSPIAPI_H)\n  check_include_files(\"winsock2.h;ws2tcpip.h\" HAVE_WS2TCPIP_H)\nendif (WIN32)\n\nif (OPENSSL_FOUND)\n    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})\n    check_include_file(openssl/des.h HAVE_OPENSSL_DES_H)\n    if (NOT HAVE_OPENSSL_DES_H)\n        message(FATAL_ERROR \"Could not detect openssl/des.h\")\n    endif()\n\n    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})\n    check_include_file(openssl/aes.h HAVE_OPENSSL_AES_H)\n    if (NOT HAVE_OPENSSL_AES_H)\n        message(FATAL_ERROR \"Could not detect openssl/aes.h\")\n    endif()\n\n    if (WITH_BLOWFISH_CIPHER)\n        set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})\n        check_include_file(openssl/blowfish.h HAVE_OPENSSL_BLOWFISH_H)\n    endif()\n\n    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})\n    check_include_file(openssl/ecdh.h HAVE_OPENSSL_ECDH_H)\n\n    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})\n    check_include_file(openssl/ec.h HAVE_OPENSSL_EC_H)\n\n    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})\n    check_include_file(openssl/ecdsa.h HAVE_OPENSSL_ECDSA_H)\n\n    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})\n    set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})\n    check_function_exists(EVP_aes_128_ctr HAVE_OPENSSL_EVP_AES_CTR)\n\n    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})\n    set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})\n    check_function_exists(EVP_aes_128_cbc HAVE_OPENSSL_EVP_AES_CBC)\n\n    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})\n    set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})\n    check_function_exists(EVP_aes_128_gcm HAVE_OPENSSL_EVP_AES_GCM)\n\n    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})\n    set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})\n    check_function_exists(CRYPTO_THREADID_set_callback HAVE_OPENSSL_CRYPTO_THREADID_SET_CALLBACK)\n\n    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})\n    set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})\n    check_function_exists(CRYPTO_ctr128_encrypt HAVE_OPENSSL_CRYPTO_CTR128_ENCRYPT)\n\n    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})\n    set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})\n    check_function_exists(EVP_CIPHER_CTX_new HAVE_OPENSSL_EVP_CIPHER_CTX_NEW)\n\n    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})\n    set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})\n    check_function_exists(EVP_KDF_CTX_new_id HAVE_OPENSSL_EVP_KDF_CTX_NEW_ID)\n\n    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})\n    set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})\n    check_function_exists(FIPS_mode HAVE_OPENSSL_FIPS_MODE)\n\n    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})\n    set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})\n    check_function_exists(RAND_priv_bytes HAVE_OPENSSL_RAND_PRIV_BYTES)\n\n    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})\n    set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})\n    check_function_exists(EVP_DigestSign HAVE_OPENSSL_EVP_DIGESTSIGN)\n\n    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})\n    set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})\n    check_function_exists(EVP_DigestVerify HAVE_OPENSSL_EVP_DIGESTVERIFY)\n\n    check_function_exists(OPENSSL_ia32cap_loc HAVE_OPENSSL_IA32CAP_LOC)\n\n    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})\n    set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})\n    check_symbol_exists(EVP_PKEY_ED25519 \"openssl/evp.h\" FOUND_OPENSSL_ED25519)\n\n    if (HAVE_OPENSSL_EVP_DIGESTSIGN AND HAVE_OPENSSL_EVP_DIGESTVERIFY AND\n        FOUND_OPENSSL_ED25519)\n        set(HAVE_OPENSSL_ED25519 1)\n    endif()\n\n    set(CMAKE_REQUIRED_INCLUDES ${OPENSSL_INCLUDE_DIR})\n    set(CMAKE_REQUIRED_LIBRARIES ${OPENSSL_CRYPTO_LIBRARY})\n    check_symbol_exists(EVP_PKEY_X25519 \"openssl/evp.h\" HAVE_OPENSSL_X25519)\n\n    unset(CMAKE_REQUIRED_INCLUDES)\n    unset(CMAKE_REQUIRED_LIBRARIES)\nendif()\n\nif (CMAKE_HAVE_PTHREAD_H)\n  set(HAVE_PTHREAD_H 1)\nendif (CMAKE_HAVE_PTHREAD_H)\n\nif (NOT WITH_GCRYPT AND NOT WITH_MBEDTLS)\n    if (HAVE_OPENSSL_EC_H AND HAVE_OPENSSL_ECDSA_H)\n        set(HAVE_OPENSSL_ECC 1)\n    endif (HAVE_OPENSSL_EC_H AND HAVE_OPENSSL_ECDSA_H)\n\n    if (HAVE_OPENSSL_ECC)\n        set(HAVE_ECC 1)\n    endif (HAVE_OPENSSL_ECC)\nendif ()\n\nif (NOT WITH_MBEDTLS)\n    set(HAVE_DSA 1)\nendif (NOT WITH_MBEDTLS)\n\n# FUNCTIONS\n\ncheck_function_exists(isblank HAVE_ISBLANK)\ncheck_function_exists(strncpy HAVE_STRNCPY)\ncheck_function_exists(strndup HAVE_STRNDUP)\ncheck_function_exists(strtoull HAVE_STRTOULL)\ncheck_function_exists(explicit_bzero HAVE_EXPLICIT_BZERO)\ncheck_function_exists(memset_s HAVE_MEMSET_S)\n\nif (HAVE_GLOB_H)\n    check_struct_has_member(glob_t gl_flags glob.h HAVE_GLOB_GL_FLAGS_MEMBER)\n    check_function_exists(glob HAVE_GLOB)\nendif (HAVE_GLOB_H)\n\nif (NOT WIN32)\n  check_function_exists(vsnprintf HAVE_VSNPRINTF)\n  check_function_exists(snprintf HAVE_SNPRINTF)\nendif (NOT WIN32)\n\nif (WIN32)\n    check_symbol_exists(vsnprintf \"stdio.h\" HAVE_VSNPRINTF)\n    check_symbol_exists(snprintf \"stdio.h\" HAVE_SNPRINTF)\n\n    check_symbol_exists(_vsnprintf_s \"stdio.h\" HAVE__VSNPRINTF_S)\n    check_symbol_exists(_vsnprintf \"stdio.h\" HAVE__VSNPRINTF)\n    check_symbol_exists(_snprintf \"stdio.h\" HAVE__SNPRINTF)\n    check_symbol_exists(_snprintf_s \"stdio.h\" HAVE__SNPRINTF_S)\n\n    if (HAVE_WSPIAPI_H OR HAVE_WS2TCPIP_H)\n        check_symbol_exists(ntohll winsock2.h HAVE_NTOHLL)\n        check_symbol_exists(htonll winsock2.h HAVE_HTONLL)\n\n        set(CMAKE_REQUIRED_LIBRARIES ws2_32)\n        check_symbol_exists(select \"winsock2.h;ws2tcpip.h\" HAVE_SELECT)\n        check_symbol_exists(poll \"winsock2.h;ws2tcpip.h\" HAVE_SELECT)\n        # The getaddrinfo function is defined to the WspiapiGetAddrInfo inline function\n        check_symbol_exists(getaddrinfo \"winsock2.h;ws2tcpip.h\" HAVE_GETADDRINFO)\n        unset(CMAKE_REQUIRED_LIBRARIES)\n    endif (HAVE_WSPIAPI_H OR HAVE_WS2TCPIP_H)\n\n    check_function_exists(_strtoui64 HAVE__STRTOUI64)\n\n    set(HAVE_SELECT TRUE)\n\n    check_symbol_exists(SecureZeroMemory \"windows.h\" HAVE_SECURE_ZERO_MEMORY)\nelse (WIN32)\n    check_function_exists(poll HAVE_POLL)\n    check_function_exists(select HAVE_SELECT)\n    check_function_exists(getaddrinfo HAVE_GETADDRINFO)\n\n    check_symbol_exists(ntohll arpa/inet.h HAVE_NTOHLL)\n    check_symbol_exists(htonll arpa/inet.h HAVE_HTONLL)\nendif (WIN32)\n\n\nif (UNIX)\n    if (NOT LINUX)\n        # libsocket (Solaris)\n        check_library_exists(socket getaddrinfo \"\" HAVE_LIBSOCKET)\n        if (HAVE_LIBSOCKET)\n            set(HAVE_GETADDRINFO TRUE)\n            set(_REQUIRED_LIBRARIES ${_REQUIRED_LIBRARIES} socket)\n        endif (HAVE_LIBSOCKET)\n\n        # libnsl/inet_pton (Solaris)\n        check_library_exists(nsl inet_pton \"\" HAVE_LIBNSL)\n        if (HAVE_LIBNSL)\n            set(_REQUIRED_LIBRARIES ${_REQUIRED_LIBRARIES} nsl)\n        endif (HAVE_LIBNSL)\n\n        # librt\n        check_library_exists(rt nanosleep \"\" HAVE_LIBRT)\n    endif (NOT LINUX)\n\n    check_library_exists(rt clock_gettime \"\" HAVE_CLOCK_GETTIME)\n    if (HAVE_LIBRT OR HAVE_CLOCK_GETTIME)\n        set(_REQUIRED_LIBRARIES ${_REQUIRED_LIBRARIES} rt)\n    endif (HAVE_LIBRT OR HAVE_CLOCK_GETTIME)\n\n    check_library_exists(util forkpty \"\" HAVE_LIBUTIL)\n    check_function_exists(cfmakeraw HAVE_CFMAKERAW)\n    check_function_exists(__strtoull HAVE___STRTOULL)\nendif (UNIX)\n\nset(LIBSSH_REQUIRED_LIBRARIES ${_REQUIRED_LIBRARIES} CACHE INTERNAL \"libssh required system libraries\")\n\n# LIBRARIES\nif (OPENSSL_FOUND)\n  set(HAVE_LIBCRYPTO 1)\nendif (OPENSSL_FOUND)\n\nif (GCRYPT_FOUND)\n    set(HAVE_LIBGCRYPT 1)\n    if (GCRYPT_VERSION VERSION_GREATER \"1.4.6\")\n        set(HAVE_GCRYPT_ECC 1)\n        set(HAVE_ECC 1)\n    endif (GCRYPT_VERSION VERSION_GREATER \"1.4.6\")\nendif (GCRYPT_FOUND)\n\nif (MBEDTLS_FOUND)\n    set(HAVE_LIBMBEDCRYPTO 1)\n    set(HAVE_ECC 1)\nendif (MBEDTLS_FOUND)\n\nif (CMAKE_USE_PTHREADS_INIT)\n    set(HAVE_PTHREAD 1)\nendif (CMAKE_USE_PTHREADS_INIT)\n\nif (UNIT_TESTING)\n    if (CMOCKA_FOUND)\n        set(CMAKE_REQUIRED_LIBRARIES ${CMOCKA_LIBRARIES})\n        check_function_exists(cmocka_set_test_filter HAVE_CMOCKA_SET_TEST_FILTER)\n        unset(CMAKE_REQUIRED_LIBRARIES)\n    endif ()\nendif ()\n\n# OPTIONS\ncheck_c_source_compiles(\"\n__thread int tls;\n\nint main(void) {\n    return 0;\n}\" HAVE_GCC_THREAD_LOCAL_STORAGE)\n\ncheck_c_source_compiles(\"\n__declspec(thread) int tls;\n\nint main(void) {\n    return 0;\n}\" HAVE_MSC_THREAD_LOCAL_STORAGE)\n\n###########################################################\n# For detecting attributes we need to treat warnings as\n# errors\nif (UNIX OR MINGW)\n    # Get warnings for attributs\n    check_c_compiler_flag(\"-Wattributes\" REQUIRED_FLAGS_WERROR)\n    if (REQUIRED_FLAGS_WERROR)\n        string(APPEND CMAKE_REQUIRED_FLAGS \"-Wattributes \")\n    endif()\n\n    # Turn warnings into errors\n    check_c_compiler_flag(\"-Werror\" REQUIRED_FLAGS_WERROR)\n    if (REQUIRED_FLAGS_WERROR)\n        string(APPEND CMAKE_REQUIRED_FLAGS \"-Werror \")\n    endif()\nendif ()\n\ncheck_c_source_compiles(\"\nvoid test_constructor_attribute(void) __attribute__ ((constructor));\n\nvoid test_constructor_attribute(void)\n{\n    return;\n}\n\nint main(void) {\n    return 0;\n}\" HAVE_CONSTRUCTOR_ATTRIBUTE)\n\ncheck_c_source_compiles(\"\nvoid test_destructor_attribute(void) __attribute__ ((destructor));\n\nvoid test_destructor_attribute(void)\n{\n    return;\n}\n\nint main(void) {\n    return 0;\n}\" HAVE_DESTRUCTOR_ATTRIBUTE)\n\ncheck_c_source_compiles(\"\n#define FALL_THROUGH __attribute__((fallthrough))\n\nint main(void) {\n    int i = 2;\n\n    switch (i) {\n    case 0:\n        FALL_THROUGH;\n    case 1:\n        break;\n    default:\n        break;\n    }\n\n    return 0;\n}\" HAVE_FALLTHROUGH_ATTRIBUTE)\n\nif (NOT WIN32)\n    check_c_source_compiles(\"\n    #define __unused __attribute__((unused))\n\n    static int do_nothing(int i __unused)\n    {\n        return 0;\n    }\n\n    int main(void)\n    {\n        int i;\n\n        i = do_nothing(5);\n        if (i > 5) {\n            return 1;\n        }\n\n        return 0;\n    }\" HAVE_UNUSED_ATTRIBUTE)\nendif()\n\ncheck_c_source_compiles(\"\n#include <string.h>\n\nint main(void)\n{\n    char buf[] = \\\"This is some content\\\";\n\n    memset(buf, '\\\\\\\\0', sizeof(buf)); __asm__ volatile(\\\"\\\" : : \\\"g\\\"(&buf) : \\\"memory\\\");\n\n    return 0;\n}\" HAVE_GCC_VOLATILE_MEMORY_PROTECTION)\n\ncheck_c_source_compiles(\"\n#include <stdio.h>\nint main(void) {\n    printf(\\\"%s\\\", __func__);\n    return 0;\n}\" HAVE_COMPILER__FUNC__)\n\ncheck_c_source_compiles(\"\n#include <stdio.h>\nint main(void) {\n    printf(\\\"%s\\\", __FUNCTION__);\n    return 0;\n}\" HAVE_COMPILER__FUNCTION__)\n\n# This is only available with OpenBSD's gcc implementation */\nif (OPENBSD)\ncheck_c_source_compiles(\"\n#define ARRAY_LEN 16\nvoid test_attr(const unsigned char *k)\n    __attribute__((__bounded__(__minbytes__, 2, 16)));\n\nint main(void) {\n    return 0;\n}\" HAVE_GCC_BOUNDED_ATTRIBUTE)\nendif(OPENBSD)\n\n# Stop treating warnings as errors\nunset(CMAKE_REQUIRED_FLAGS)\n\n# Check for version script support\nfile(WRITE \"${CMAKE_CURRENT_BINARY_DIR}/conftest.map\" \"VERS_1 {\n        global: sym;\n};\nVERS_2 {\n        global: sym;\n} VERS_1;\n\")\n\nset(CMAKE_REQUIRED_FLAGS \"-Wl,--version-script=\\\"${CMAKE_CURRENT_BINARY_DIR}/conftest.map\\\"\")\ncheck_c_source_compiles(\"int main(void) { return 0; }\" HAVE_LD_VERSION_SCRIPT)\nunset(CMAKE_REQUIRED_FLAGS)\nfile(REMOVE \"${CMAKE_CURRENT_BINARY_DIR}/conftest.map\")\n\nif (WITH_DEBUG_CRYPTO)\n  set(DEBUG_CRYPTO 1)\nendif (WITH_DEBUG_CRYPTO)\n\nif (WITH_DEBUG_PACKET)\n  set(DEBUG_PACKET 1)\nendif (WITH_DEBUG_PACKET)\n\nif (WITH_DEBUG_CALLTRACE)\n  set(DEBUG_CALLTRACE 1)\nendif (WITH_DEBUG_CALLTRACE)\n\nif (WITH_GSSAPI AND NOT GSSAPI_FOUND)\n    set(WITH_GSSAPI 0)\nendif (WITH_GSSAPI AND NOT GSSAPI_FOUND)\n\n# ENDIAN\nif (NOT WIN32)\n    test_big_endian(WORDS_BIGENDIAN)\nendif (NOT WIN32)\n"
  },
  {
    "path": "src/libssh/DefineOptions.cmake",
    "content": "option(WITH_GSSAPI \"Build with GSSAPI support\" ON)\noption(WITH_ZLIB \"Build with ZLIB support\" ON)\noption(WITH_SFTP \"Build with SFTP support\" ON)\noption(WITH_SERVER \"Build with SSH server support\" ON)\noption(WITH_DEBUG_CRYPTO \"Build with cryto debug output\" OFF)\noption(WITH_DEBUG_PACKET \"Build with packet debug output\" OFF)\noption(WITH_DEBUG_CALLTRACE \"Build with calltrace debug output\" ON)\noption(WITH_GCRYPT \"Compile against libgcrypt\" OFF)\noption(WITH_MBEDTLS \"Compile against libmbedtls\" OFF)\noption(WITH_BLOWFISH_CIPHER \"Compile with blowfish support\" OFF)\noption(WITH_PCAP \"Compile with Pcap generation support\" ON)\noption(WITH_INTERNAL_DOC \"Compile doxygen internal documentation\" OFF)\noption(BUILD_SHARED_LIBS \"Build shared libraries\" ON)\noption(UNIT_TESTING \"Build with unit tests\" OFF)\noption(CLIENT_TESTING \"Build with client tests; requires openssh\" OFF)\noption(SERVER_TESTING \"Build with server tests; requires openssh and dropbear\" OFF)\noption(WITH_BENCHMARKS \"Build benchmarks tools\" OFF)\noption(WITH_EXAMPLES \"Build examples\" ON)\noption(WITH_NACL \"Build with libnacl (curve25519)\" ON)\noption(WITH_SYMBOL_VERSIONING \"Build with symbol versioning\" ON)\noption(WITH_ABI_BREAK \"Allow ABI break\" OFF)\noption(WITH_GEX \"Enable DH Group exchange mechanisms\" ON)\noption(FUZZ_TESTING \"Build with fuzzer for the server\" OFF)\noption(PICKY_DEVELOPER \"Build with picky developer flags\" OFF)\n\nif (WITH_ZLIB)\n    set(WITH_LIBZ ON)\nelse (WITH_ZLIB)\n    set(WITH_LIBZ OFF)\nendif (WITH_ZLIB)\n\nif (WITH_BENCHMARKS)\n  set(UNIT_TESTING ON)\n  set(CLIENT_TESTING ON)\nendif()\n\nif (UNIT_TESTING OR CLIENT_TESTING OR SERVER_TESTING)\n  set(BUILD_STATIC_LIB ON)\nendif()\n\nif (WITH_NACL)\n  set(WITH_NACL ON)\nendif (WITH_NACL)\n\nif (WITH_ABI_BREAK)\n  set(WITH_SYMBOL_VERSIONING ON)\nendif (WITH_ABI_BREAK)\n\nif (NOT GLOBAL_BIND_CONFIG)\n  set(GLOBAL_BIND_CONFIG \"/etc/ssh/libssh_server_config\")\nendif (NOT GLOBAL_BIND_CONFIG)\n\nif (NOT GLOBAL_CLIENT_CONFIG)\n  set(GLOBAL_CLIENT_CONFIG \"/etc/ssh/ssh_config\")\nendif (NOT GLOBAL_CLIENT_CONFIG)\n"
  },
  {
    "path": "src/libssh/INSTALL",
    "content": "# How to build from source\n\n## Requirements\n\n### Common requirements\n\nIn order to build libssh, you need to install several components:\n\n- A C compiler\n- [CMake](https://www.cmake.org) >= 2.6.0.\n- [openssl](https://www.openssl.org) >= 0.9.8\nor\n- [gcrypt](https://www.gnu.org/directory/Security/libgcrypt.html) >= 1.4\n- [libz](https://www.zlib.net) >= 1.2\n\noptional:\n- [cmocka](https://cmocka.org/) >= 1.1.0\n- [socket_wrapper](https://cwrap.org/) >= 1.1.5\n- [nss_wrapper](https://cwrap.org/) >= 1.1.2\n- [uid_wrapper](https://cwrap.org/) >= 1.2.0\n- [pam_wrapper](https://cwrap.org/) >= 1.0.1\n\nNote that these version numbers are version we know works correctly. If you\nbuild and run libssh successfully with an older version, please let us know.\n\nFor Windows use vcpkg:\n\nhttps://github.com/Microsoft/vcpkg\n\nwhich you can use to install openssl and zlib. libssh itself is also part of\nvcpkg!\n\n## Building\nFirst, you need to configure the compilation, using CMake. Go inside the\n`build` dir. Create it if it doesn't exist.\n\nGNU/Linux, MacOS X, MSYS/MinGW:\n\n    cmake -DUNIT_TESTING=ON -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Debug ..\n    make\n\nOn Windows you should choose a makefile gernerator with -G or use\n\n    cmake-gui.exe ..\n\nTo enable additional client tests against a local OpenSSH server, add the\ncompile option -DCLIENT_TESTING=ON. These tests require an OpenSSH\nserver package and some wrapper libraries (see optional requirements) to\nbe installed.\n\nIf you're interested in server testing, then a OpenSSH client should be\ninstalled on the system and if possible also dropbear. Once that is done\nenable server support with -DWITH_SERVER=ON and enable testing of it with\n-DSERVER_TESTING=ON.\n\n## Testing build\n\n    make test\n\n### CMake standard options\nHere is a list of the most interesting options provided out of the box by\nCMake.\n\n- CMAKE_BUILD_TYPE:     The type of build (can be Debug Release MinSizeRel\n                        RelWithDebInfo)\n- CMAKE_INSTALL_PREFIX: The prefix to use when running make install (Default\n                        to /usr/local on GNU/Linux and MacOS X)\n- CMAKE_C_COMPILER:     The path to the C compiler\n- CMAKE_CXX_COMPILER:   The path to the C++ compiler\n\n### CMake options defined for libssh\n\nOptions are defined in the following files:\n\n- DefineOptions.cmake\n\nThey can be changed with the -D option:\n\n`cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Debug -DWITH_ZLIB=OFF ..`\n\n### Browsing/editing CMake options\n\nIn addition to passing options on the command line, you can browse and edit\nCMake options using `cmakesetup` (Windows), `cmake-gui` or `ccmake` (GNU/Linux\nand MacOS X).\n\n- Go to the build dir\n- On Windows: run `cmakesetup`\n- On GNU/Linux and MacOS X: run `ccmake ..`\n\n### Useful Windows options:\n\nIf you have installed OpenSSL or ZLIB in non standard directories, maybe you\nwant to set:\n\nOPENSSL_ROOT_DIR\n\nand\n\nZLIB_ROOT_DIR\n\n## Installing\n\nIf you want to install libssh after compilation run:\n\n    make install\n\n## Running\n\nThe libssh binary can be found in the `build/src` directory.\nYou can use `build/examples/samplessh` which is a sample client to\ntest libssh on UNIX.\n\n## About this document\n\nThis document is written using [Markdown][] syntax, making it possible to\nprovide usable information in both plain text and HTML format. Whenever\nmodifying this document please use [Markdown][] syntax.\n\n[markdown]: https://www.daringfireball.net/projects/markdown\n"
  },
  {
    "path": "src/libssh/README",
    "content": "  _   _   _                          _\n (_) (_) (_)                        (_)\n (_)  _  (_) _         _  _   _  _  (_) _\n (_) (_) (_)(_) _     (_)(_) (_)(_) (_)(_) _\n (_) (_) (_)   (_)  _ (_)  _ (_)    (_)   (_)\n (_) (_) (_)(_)(_) (_)(_) (_)(_)    (_)   (_).org\n\n The SSH library\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\n1* Why ?\n-_-_-_-_-_\n\nWhy not ? :) I've began to work on my own implementation of the ssh protocol\nbecause i didn't like the currently public ones.\nNot any allowed you to import and use the functions as a powerful library, \nand so i worked on a library-based SSH implementation which was non-existing\nin the free and open source software world.\n\n\n2* How/Who ?\n-_-_-_-_-_-_-_\n\nIf you downloaded this file, you must know what it is : a library for\naccessing ssh client services through C libraries calls in a simple manner.\nEverybody can use this software under the terms of the LGPL - see the COPYING\nfile\n\nIf you ask yourself how to compile libssh, please read INSTALL before anything.\n\n3* Where ?\n-_-_-_-_-_-_\n\nhttps://www.libssh.org\n\n4* Contributing\n-_-_-_-_-_-_-_-_-_\n\nPlease read the file 'SubmittingPatches' next to this README file. It explains\nour copyright policy and how you should send patches for upstream inclusion.\n\nHave fun and happy libssh hacking!\n\nThe libssh Team\n"
  },
  {
    "path": "src/libssh/README.CodingStyle",
    "content": "Coding conventions in the libssh tree\n======================================\n\n===========\nQuick Start\n===========\n\nCoding style guidelines are about reducing the number of unnecessary\nreformatting patches and making things easier for developers to work together.\n\nYou don't have to like them or even agree with them, but once put in place we\nall have to abide by them (or vote to change them).  However, coding style\nshould never outweigh coding itself and so the guidelines described here are\nhopefully easy enough to follow as they are very common and supported by tools\nand editors.\n\nThe basic style for C code, is the Linux kernel coding style (See\nDocumentation/CodingStyle in the kernel source tree). This closely matches what\nlibssh developers use already anyways, with a few exceptions as mentioned\nbelow.\n\nBut to save you the trouble of reading the Linux kernel style guide, here\nare the highlights.\n\n* Maximum Line Width is 80 Characters\n  The reason is not about people with low-res screens but rather sticking\n  to 80 columns prevents you from easily nesting more than one level of\n  if statements or other code blocks.\n\n* Use 4 Spaces to Indent\n\n* No Trailing Whitespace\n  Clean up your files before committing.\n\n* Follow the K&R guidelines.  We won't go through all of them here. Do you\n  have a copy of \"The C Programming Language\" anyways right?\n\n\n=============\nEditor Hints\n=============\n\nEmacs\n------\nAdd the follow to your $HOME/.emacs file:\n\n  (add-hook 'c-mode-hook\n    (lambda ()\n        (c-set-style \"linux\")\n        (c-toggle-auto-state)))\n\n\nVim\n----\n\nFor the basic vi editor included with all variants of \\*nix, add the\nfollowing to $HOME/.vimrc:\n\n    set ts=4 sw=4 et cindent\n\nYou can use the Vim gitmodline plugin to store this in the git config:\n\n    https://git.cryptomilk.org/projects/vim-gitmodeline.git/\n\nFor Vim, the following settings in $HOME/.vimrc will also deal with\ndisplaying trailing whitespace:\n\n    if has(\"syntax\") && (&t_Co > 2 || has(\"gui_running\"))\n        syntax on\n        function! ActivateInvisibleCharIndicator()\n            syntax match TrailingSpace \"[ \\t]\\+$\" display containedin=ALL\n            highlight TrailingSpace ctermbg=Red\n        endf\n        autocmd BufNewFile,BufRead * call ActivateInvisibleCharIndicator()\n    endif\n    \" Show tabs, trailing whitespace, and continued lines visually\n    set list listchars=tab:»·,trail:·,extends:…\n\n    \" highlight overly long lines same as TODOs.\n    set textwidth=80\n    autocmd BufNewFile,BufRead *.c,*.h exec 'match Todo /\\%>' . &textwidth . 'v.\\+/'\n\n\n==========================\nFAQ & Statement Reference\n==========================\n\nComments\n---------\n\nComments should always use the standard C syntax.  C++ style comments are not\ncurrently allowed.\n\nThe lines before a comment should be empty. If the comment directly belongs to\nthe following code, there should be no empty line after the comment, except if\nthe comment contains a summary of multiple following code blocks.\n\nThis is good:\n\n    ...\n    int i;\n\n    /*\n     * This is a multi line comment,\n     * which explains the logical steps we have to do:\n     *\n     * 1. We need to set i=5, because...\n     * 2. We need to call complex_fn1\n     */\n\n    /* This is a one line comment about i = 5. */\n    i = 5;\n\n    /*\n     * This is a multi line comment,\n     * explaining the call to complex_fn1()\n     */\n    ret = complex_fn1();\n    if (ret != 0) {\n    ...\n\n    /**\n     * @brief This is a doxygen comment.\n     *\n     * This is a more detailed explanation of\n     * this simple function.\n     *\n     * @param[in]   param1     The parameter value of the function.\n     *\n     * @param[out]  result1    The result value of the function.\n     *\n     * @return              0 on success and -1 on error.\n     */\n    int example(int param1, int *result1);\n\nThis is bad:\n\n    ...\n    int i;\n    /*\n     * This is a multi line comment,\n     * which explains the logical steps we have to do:\n     *\n     * 1. We need to set i=5, because...\n     * 2. We need to call complex_fn1\n     */\n    /* This is a one line comment about i = 5. */\n    i = 5;\n    /*\n     * This is a multi line comment,\n     * explaining the call to complex_fn1()\n     */\n    ret = complex_fn1();\n    if (ret != 0) {\n    ...\n\n    /*This is a one line comment.*/\n\n    /* This is a multi line comment,\n       with some more words...*/\n\n    /*\n     * This is a multi line comment,\n     * with some more words...*/\n\nIndention & Whitespace & 80 columns\n------------------------------------\n\nTo avoid confusion, indentations have to be 4 spaces. Do not use tabs!.  When\nwrapping parameters for function calls, align the parameter list with the first\nparameter on the previous line.  For example,\n\n    var1 = foo(arg1,\n               arg2,\n               arg3);\n\nThe previous example is intended to illustrate alignment of function\nparameters across lines and not as encourage for gratuitous line\nsplitting.  Never split a line before columns 70 - 79 unless you\nhave a really good reason.  Be smart about formatting.\n\n\nIf, switch, & Code blocks\n--------------------------\n\nAlways follow an 'if' keyword with a space but don't include additional\nspaces following or preceding the parentheses in the conditional.\nThis is good:\n\n    if (x == 1)\n\nThis is bad:\n\n    if ( x == 1 )\n\nor\n\n    if (x==1)\n\nYes we have a lot of code that uses the second and third form and we are trying\nto clean it up without being overly intrusive.\n\nNote that this is a rule about parentheses following keywords and not\nfunctions.  Don't insert a space between the name and left parentheses when\ninvoking functions.\n\nBraces for code blocks used by for, if, switch, while, do..while, etc.  should\nbegin on the same line as the statement keyword and end on a line of their own.\nYou should always include braces, even if the block only contains one\nstatement.  NOTE: Functions are different and the beginning left brace should\nbe located in the first column on the next line.\n\nIf the beginning statement has to be broken across lines due to length, the\nbeginning brace should be on a line of its own.\n\nThe exception to the ending rule is when the closing brace is followed by\nanother language keyword such as else or the closing while in a do..while loop.\n\nGood examples:\n\n    if (x == 1) {\n        printf(\"good\\n\");\n    }\n\n    for (x = 1; x < 10; x++) {\n        print(\"%d\\n\", x);\n    }\n\n    for (really_really_really_really_long_var_name = 0;\n         really_really_really_really_long_var_name < 10;\n         really_really_really_really_long_var_name++)\n    {\n        print(\"%d\\n\", really_really_really_really_long_var_name);\n    }\n\n    do {\n        printf(\"also good\\n\");\n    } while (1);\n\nBad examples:\n\n    while (1)\n    {\n        print(\"I'm in a loop!\\n\"); }\n\n    for (x=1;\n         x<10;\n         x++)\n    {\n        print(\"no good\\n\");\n    }\n\n    if (i < 10)\n        print(\"I should be in braces.\\n\");\n\n\nGoto\n-----\n\nWhile many people have been academically taught that \"goto\"s are fundamentally\nevil, they can greatly enhance readability and reduce memory leaks when used as\nthe single exit point from a function. But in no libssh world what so ever is a\ngoto outside of a function or block of code a good idea.\n\nGood Examples:\n\n    int function foo(int y)\n    {\n        int *z = NULL;\n        int rc = 0;\n\n        if (y < 10) {\n            z = malloc(sizeof(int)*y);\n            if (z == NULL) {\n                rc = 1;\n                goto done;\n            }\n        }\n\n        print(\"Allocated %d elements.\\n\", y);\n\n    done:\n        if (z != NULL) {\n            free(z);\n        }\n\n        return rc;\n    }\n\nInitialize pointers\n-------------------\n\nAll pointer variables MUST be initialized to NULL. History has\ndemonstrated that uninitialized pointer variables have lead to various\nbugs and security issues.\n\nPointers MUST be initialized even if the assignment directly follows\nthe declaration, like pointer2 in the example below, because the\ninstructions sequence may change over time.\n\nGood Example:\n\n    char *pointer1 = NULL;\n    char *pointer2 = NULL;\n\n    pointer2 = some_func2();\n\n    ...\n\n    pointer1 = some_func1();\n\nTypedefs\n---------\n\nlibssh tries to avoid \"typedef struct { .. } x_t;\" so we do always try to use\n\"struct x { .. };\". We know there are still such typedefs in the code, but for\nnew code, please don't do that anymore.\n\nMake use of helper variables\n-----------------------------\n\nPlease try to avoid passing function calls as function parameters in new code.\nThis makes the code much easier to read and it's also easier to use the \"step\"\ncommand within gdb.\n\nGood Example:\n\n    char *name;\n\n    name = get_some_name();\n    if (name == NULL) {\n        ...\n    }\n\n    rc = some_function_my_name(name);\n    ...\n\n\nBad Example:\n\n    rc = some_function_my_name(get_some_name());\n    ...\n\nPlease try to avoid passing function return values to if- or while-conditions.\nThe reason for this is better handling of code under a debugger.\n\nGood example:\n\n    x = malloc(sizeof(short) * 10);\n    if (x == NULL) {\n        fprintf(stderr, \"Unable to alloc memory!\\n\");\n    }\n\nBad example:\n\n    if ((x = malloc(sizeof(short)*10)) == NULL ) {\n        fprintf(stderr, \"Unable to alloc memory!\\n\");\n    }\n\nThere are exceptions to this rule. One example is walking a data structure in\nan iterator style:\n\n    while ((opt = poptGetNextOpt(pc)) != -1) {\n        ... do something with opt ...\n    }\n\nBut in general, please try to avoid this pattern.\n\n\nControl-Flow changing macros\n-----------------------------\n\nMacros like STATUS_NOT_OK_RETURN that change control flow (return/goto/etc)\nfrom within the macro are considered bad, because they look like function calls\nthat never change control flow. Please do not introduce them.\n"
  },
  {
    "path": "src/libssh/README.mbedtls",
    "content": "mbedTLS and libssh in multithreaded applications\n==================================================\n\nTo use libssh with mbedTLS in a multithreaded application, mbedTLS has to be\nbuilt with threading support enabled.\n\nIf threading support is not available and multi threading is used, ssh_init\nwill fail.\n\nMore information about building mbedTLS with threading support can be found\nin the mbedTLS documentation.\n"
  },
  {
    "path": "src/libssh/README.md",
    "content": "[![pipeline status](https://gitlab.com/libssh/libssh-mirror/badges/master/pipeline.svg)](https://gitlab.com/libssh/libssh-mirror/commits/master)\n\n```\n  _   _   _                          _\n (_) (_) (_)                        (_)\n (_)  _  (_) _         _  _   _  _  (_) _\n (_) (_) (_)(_) _     (_)(_) (_)(_) (_)(_) _\n (_) (_) (_)   (_)  _ (_)  _ (_)    (_)   (_)\n (_) (_) (_)(_)(_) (_)(_) (_)(_)    (_)   (_).org\n\n The SSH library\n\n```\n\n# Why?\n\nWhy not ? :) I've began to work on my own implementation of the ssh protocol\nbecause i didn't like the currently public ones.\nNot any allowed you to import and use the functions as a powerful library,\nand so i worked on a library-based SSH implementation which was non-existing\nin the free and open source software world.\n\n\n# How/Who?\n\nIf you downloaded this file, you must know what it is : a library for\naccessing ssh client services through C libraries calls in a simple manner.\nEverybody can use this software under the terms of the LGPL - see the COPYING\nfile\n\nIf you ask yourself how to compile libssh, please read INSTALL before anything.\n\n# Where ?\n\nhttps://www.libssh.org\n\n# Contributing\n\nPlease read the file 'SubmittingPatches' next to this README file. It explains\nour copyright policy and how you should send patches for upstream inclusion.\n\nHave fun and happy libssh hacking!\n\nThe libssh Team\n"
  },
  {
    "path": "src/libssh/SubmittingPatches",
    "content": "How to contribute a patch to libssh\n====================================\n\nPlease checkout the libssh source code using git. Change the code and then\nuse  \"git format-patch\" to create a patch. The patch should be signed (see\nbelow) and send it to libssh@libssh.org, or attach it to a bug report at\nhttps://red.libssh.org/\n\nFor larger code changes, breaking the changes up into a set of simple\npatches, each of which does a single thing, are much easier to review.\nPatch sets like that will most likely have an easier time being merged\ninto the libssh code than large single patches that make lots of\nchanges in one large diff.\n\nOwnership of the contributed code\n==================================\n\nlibssh is a project with distributed copyright ownership, which means\nwe prefer the copyright on parts of libssh to be held by individuals\nrather than corporations if possible. There are historical legal\nreasons for this, but one of the best ways to explain it is that it's\nmuch easier to work with individuals who have ownership than corporate\nlegal departments if we ever need to make reasonable compromises with\npeople using and working with libssh.\n\nWe track the ownership of every part of libssh via https://git.libssh.org,\nour source code control system, so we know the provenance of every piece\nof code that is committed to libssh.\n\nSo if possible, if you're doing libssh changes on behalf of a company\nwho normally owns all the work you do please get them to assign\npersonal copyright ownership of your changes to you as an individual,\nthat makes things very easy for us to work with and avoids bringing\ncorporate legal departments into the picture.\n\nIf you can't do this we can still accept patches from you owned by\nyour employer under a standard employment contract with corporate\ncopyright ownership. It just requires a simple set-up process first.\n\nWe use a process very similar to the way things are done in the Linux\nKernel community, so it should be very easy to get a sign off from\nyour corporate legal department. The only changes we've made are to\naccommodate the license we use, which is LGPLv2 (or later) whereas the\nLinux kernel uses GPLv2.\n\nThe process is called signing.\n\nHow to sign your work\n----------------------\n\nOnce you have permission to contribute to libssh from your employer, simply\nemail a copy of the following text from your corporate email address to:\n\ncontributing@libssh.org\n\n\n\nlibssh Developer's Certificate of Origin. Version 1.0\n\n\nBy making a contribution to this project, I certify that:\n\n(a) The contribution was created in whole or in part by me and I\n    have the right to submit it under the appropriate\n    version of the GNU General Public License; or\n\n(b) The contribution is based upon previous work that, to the best of\n    my knowledge, is covered under an appropriate open source license\n    and I have the right under that license to submit that work with\n    modifications, whether created in whole or in part by me, under\n    the GNU General Public License, in the appropriate version; or\n\n(c) The contribution was provided directly to me by some other\n    person who certified (a) or (b) and I have not modified it.\n\n(d) I understand and agree that this project and the contribution are\n    public and that a record of the contribution (including all\n    metadata and personal information I submit with it, including my\n    sign-off) is maintained indefinitely and may be redistributed\n    consistent with the libssh Team's policies and the requirements of\n    the GNU GPL where they are relevant.\n\n(e) I am granting this work to this project under the terms of the\n    GNU Lesser General Public License as published by the\n    Free Software Foundation; either version 2.1 of\n    the License, or (at the option of the project) any later version.\n\n    https://www.gnu.org/licenses/lgpl-2.1.html\n\n\nWe will maintain a copy of that email as a record that you have the\nrights to contribute code to libssh under the required licenses whilst\nworking for the company where the email came from.\n\nThen when sending in a patch via the normal mechanisms described\nabove, add a line that states:\n\n   Signed-off-by: Random J Developer <random@developer.example.org>\n\nusing your real name and the email address you sent the original email\nyou used to send the libssh Developer's Certificate of Origin to us\n(sorry, no pseudonyms or anonymous contributions.)\n\nThat's it! Such code can then quite happily contain changes that have\ncopyright messages such as:\n\n   (c) Example Corporation.\n\nand can be merged into the libssh codebase in the same way as patches\nfrom any other individual. You don't need to send in a copy of the\nlibssh Developer's Certificate of Origin for each patch, or inside each\npatch. Just the sign-off message is all that is required once we've\nreceived the initial email.\n\nHave fun and happy libssh hacking !\n\nThe libssh Team\n\n"
  },
  {
    "path": "src/libssh/cmake/Modules/AddCCompilerFlag.cmake",
    "content": "#\n# add_c_compiler_flag(\"-Werror\" SUPPORTED_CFLAGS)\n#\n# Copyright (c) 2018      Andreas Schneider <asn@cryptomilk.org>\n#\n# Redistribution and use is allowed according to the terms of the BSD license.\n# For details see the accompanying COPYING-CMAKE-SCRIPTS file.\n\ninclude(CheckCCompilerFlag)\n\nmacro(add_c_compiler_flag _COMPILER_FLAG _OUTPUT_VARIABLE)\n    string(TOUPPER ${_COMPILER_FLAG} _COMPILER_FLAG_NAME)\n    string(REGEX REPLACE \"^-\" \"\" _COMPILER_FLAG_NAME \"${_COMPILER_FLAG_NAME}\")\n    string(REGEX REPLACE \"(-|=|\\ )\" \"_\" _COMPILER_FLAG_NAME \"${_COMPILER_FLAG_NAME}\")\n\n    check_c_compiler_flag(\"${_COMPILER_FLAG}\" WITH_${_COMPILER_FLAG_NAME}_FLAG)\n    if (WITH_${_COMPILER_FLAG_NAME}_FLAG)\n        #string(APPEND ${_OUTPUT_VARIABLE} \"${_COMPILER_FLAG} \")\n        list(APPEND ${_OUTPUT_VARIABLE} ${_COMPILER_FLAG})\n    endif()\nendmacro()\n"
  },
  {
    "path": "src/libssh/cmake/Modules/AddCMockaTest.cmake",
    "content": "#\n# Copyright (c) 2007      Daniel Gollub <dgollub@suse.de>\n# Copyright (c) 2007-2018 Andreas Schneider <asn@cryptomilk.org>\n# Copyright (c) 2018      Anderson Toshiyuki Sasaki <ansasaki@redhat.com>\n#\n# Redistribution and use is allowed according to the terms of the BSD license.\n# For details see the accompanying COPYING-CMAKE-SCRIPTS file.\n\n#.rst:\n# AddCMockaTest\n# -------------\n#\n# This file provides a function to add a test\n#\n# Functions provided\n# ------------------\n#\n# ::\n#\n#   add_cmocka_test(target_name\n#                   SOURCES src1 src2 ... srcN\n#                   [COMPILE_OPTIONS opt1 opt2 ... optN]\n#                   [LINK_LIBRARIES lib1 lib2 ... libN]\n#                   [LINK_OPTIONS lopt1 lop2 .. loptN]\n#                  )\n#\n# ``target_name``:\n#   Required, expects the name of the test which will be used to define a target\n#\n# ``SOURCES``:\n#   Required, expects one or more source files names\n#\n# ``COMPILE_OPTIONS``:\n#   Optional, expects one or more options to be passed to the compiler\n#\n# ``LINK_LIBRARIES``:\n#   Optional, expects one or more libraries to be linked with the test\n#   executable.\n#\n# ``LINK_OPTIONS``:\n#   Optional, expects one or more options to be passed to the linker\n#\n#\n# Example:\n#\n# .. code-block:: cmake\n#\n#   add_cmocka_test(my_test\n#                   SOURCES my_test.c other_source.c\n#                   COMPILE_OPTIONS -g -Wall\n#                   LINK_LIBRARIES mylib\n#                   LINK_OPTIONS -Wl,--enable-syscall-fixup\n#                  )\n#\n# Where ``my_test`` is the name of the test, ``my_test.c`` and\n# ``other_source.c`` are sources for the binary, ``-g -Wall`` are compiler\n# options to be used, ``mylib`` is a target of a library to be linked, and\n# ``-Wl,--enable-syscall-fixup`` is an option passed to the linker.\n#\n\nenable_testing()\ninclude(CTest)\n\nif (CMAKE_CROSSCOMPILING)\n    if (WIN32)\n        find_program(WINE_EXECUTABLE\n                     NAMES wine)\n        set(TARGET_SYSTEM_EMULATOR ${WINE_EXECUTABLE})\n    endif()\nendif()\n\nfunction(ADD_CMOCKA_TEST _TARGET_NAME)\n\n    set(one_value_arguments\n    )\n\n    set(multi_value_arguments\n        SOURCES\n        COMPILE_OPTIONS\n        LINK_LIBRARIES\n        LINK_OPTIONS\n    )\n\n    cmake_parse_arguments(_add_cmocka_test\n        \"\"\n        \"${one_value_arguments}\"\n        \"${multi_value_arguments}\"\n        ${ARGN}\n    )\n\n    if (NOT DEFINED _add_cmocka_test_SOURCES)\n        message(FATAL_ERROR \"No sources provided for target ${_TARGET_NAME}\")\n    endif()\n\n    add_executable(${_TARGET_NAME} ${_add_cmocka_test_SOURCES})\n\n    if (DEFINED _add_cmocka_test_COMPILE_OPTIONS)\n        target_compile_options(${_TARGET_NAME}\n            PRIVATE ${_add_cmocka_test_COMPILE_OPTIONS}\n        )\n    endif()\n\n    if (DEFINED _add_cmocka_test_LINK_LIBRARIES)\n        target_link_libraries(${_TARGET_NAME}\n            PRIVATE ${_add_cmocka_test_LINK_LIBRARIES}\n        )\n    endif()\n\n    if (DEFINED _add_cmocka_test_LINK_OPTIONS)\n        set_target_properties(${_TARGET_NAME}\n            PROPERTIES LINK_FLAGS\n            ${_add_cmocka_test_LINK_OPTIONS}\n        )\n    endif()\n\n    add_test(${_TARGET_NAME}\n        ${TARGET_SYSTEM_EMULATOR} ${_TARGET_NAME}\n    )\n\nendfunction (ADD_CMOCKA_TEST)\n"
  },
  {
    "path": "src/libssh/cmake/Modules/COPYING-CMAKE-SCRIPTS",
    "content": "Redistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n\n1. Redistributions of source code must retain the copyright\n   notice, this list of conditions and the following disclaimer.\n2. Redistributions in binary form must reproduce the copyright\n   notice, this list of conditions and the following disclaimer in the\n   documentation and/or other materials provided with the distribution.\n3. The name of the author may not be used to endorse or promote products \n   derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\nIMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\nOF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\nIN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\nINCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\nNOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\nTHIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "src/libssh/cmake/Modules/CheckCCompilerFlagSSP.cmake",
    "content": "# - Check whether the C compiler supports a given flag in the\n# context of a stack checking compiler option.\n\n# CHECK_C_COMPILER_FLAG_SSP(FLAG VARIABLE)\n#\n#  FLAG - the compiler flag\n#  VARIABLE - variable to store the result\n#\n#  This actually calls check_c_source_compiles.\n#  See help for CheckCSourceCompiles for a listing of variables\n#  that can modify the build.\n\n# Copyright (c) 2006, Alexander Neundorf, <neundorf@kde.org>\n#\n# Redistribution and use is allowed according to the terms of the BSD license.\n# For details see the accompanying COPYING-CMAKE-SCRIPTS file.\n\n# Requires cmake 3.10\n#include_guard(GLOBAL)\ninclude(CheckCSourceCompiles)\n\nmacro(CHECK_C_COMPILER_FLAG_SSP _FLAG _RESULT)\n   set(SAFE_CMAKE_REQUIRED_FLAGS \"${CMAKE_REQUIRED_FLAGS}\")\n   set(CMAKE_REQUIRED_FLAGS \"${_FLAG}\")\n\n   check_c_source_compiles(\"int main(int argc, char **argv) { char buffer[256]; return buffer[argc]=0;}\" ${_RESULT})\n\n   set(CMAKE_REQUIRED_FLAGS \"${SAFE_CMAKE_REQUIRED_FLAGS}\")\nendmacro(CHECK_C_COMPILER_FLAG_SSP)\n"
  },
  {
    "path": "src/libssh/cmake/Modules/DefineCMakeDefaults.cmake",
    "content": "# Always include srcdir and builddir in include path\n# This saves typing ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY} in\n# about every subdir\n# since cmake 2.4.0\nset(CMAKE_INCLUDE_CURRENT_DIR ON)\n\n# Put the include dirs which are in the source or build tree\n# before all other include dirs, so the headers in the sources\n# are prefered over the already installed ones\n# since cmake 2.4.1\nset(CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE ON)\n\n# Use colored output\n# since cmake 2.4.0\nset(CMAKE_COLOR_MAKEFILE ON)\n\n# Create the compile command database for clang by default\nset(CMAKE_EXPORT_COMPILE_COMMANDS ON)\n\n# Always build with -fPIC\nset(CMAKE_POSITION_INDEPENDENT_CODE ON)\n"
  },
  {
    "path": "src/libssh/cmake/Modules/DefineCompilerFlags.cmake",
    "content": "if (UNIX AND NOT WIN32)\n    # Activate with: -DCMAKE_BUILD_TYPE=Profiling\n    set(CMAKE_C_FLAGS_PROFILING \"-O0 -g -fprofile-arcs -ftest-coverage\"\n        CACHE STRING \"Flags used by the C compiler during PROFILING builds.\")\n    set(CMAKE_CXX_FLAGS_PROFILING \"-O0 -g -fprofile-arcs -ftest-coverage\"\n        CACHE STRING \"Flags used by the CXX compiler during PROFILING builds.\")\n    set(CMAKE_SHARED_LINKER_FLAGS_PROFILING \"-fprofile-arcs -ftest-coverage\"\n        CACHE STRING \"Flags used by the linker during the creation of shared libraries during PROFILING builds.\")\n    set(CMAKE_MODULE_LINKER_FLAGS_PROFILING \"-fprofile-arcs -ftest-coverage\"\n        CACHE STRING \"Flags used by the linker during the creation of shared libraries during PROFILING builds.\")\n    set(CMAKE_EXEC_LINKER_FLAGS_PROFILING \"-fprofile-arcs -ftest-coverage\"\n        CACHE STRING \"Flags used by the linker during PROFILING builds.\")\n\n    # Activate with: -DCMAKE_BUILD_TYPE=AddressSanitizer\n    set(CMAKE_C_FLAGS_ADDRESSSANITIZER \"-g -O1 -fsanitize=address -fno-omit-frame-pointer\"\n        CACHE STRING \"Flags used by the C compiler during ADDRESSSANITIZER builds.\")\n    set(CMAKE_CXX_FLAGS_ADDRESSSANITIZER \"-g -O1 -fsanitize=address -fno-omit-frame-pointer\"\n        CACHE STRING \"Flags used by the CXX compiler during ADDRESSSANITIZER builds.\")\n    set(CMAKE_SHARED_LINKER_FLAGS_ADDRESSSANITIZER \"-fsanitize=address\"\n        CACHE STRING \"Flags used by the linker during the creation of shared libraries during ADDRESSSANITIZER builds.\")\n    set(CMAKE_MODULE_LINKER_FLAGS_ADDRESSSANITIZER \"-fsanitize=address\"\n        CACHE STRING \"Flags used by the linker during the creation of shared libraries during ADDRESSSANITIZER builds.\")\n    set(CMAKE_EXEC_LINKER_FLAGS_ADDRESSSANITIZER \"-fsanitize=address\"\n        CACHE STRING \"Flags used by the linker during ADDRESSSANITIZER builds.\")\n\n    # Activate with: -DCMAKE_BUILD_TYPE=MemorySanitizer\n    set(CMAKE_C_FLAGS_MEMORYSANITIZER \"-g -O2 -fsanitize=memory -fsanitize-memory-track-origins=2 -fno-omit-frame-pointer\"\n        CACHE STRING \"Flags used by the C compiler during MEMORYSANITIZER builds.\")\n    set(CMAKE_CXX_FLAGS_MEMORYSANITIZER \"-g -O2 -fsanitize=memory -fsanitize-memory-track-origins=2 -fno-omit-frame-pointer\"\n        CACHE STRING \"Flags used by the CXX compiler during MEMORYSANITIZER builds.\")\n    set(CMAKE_SHARED_LINKER_FLAGS_MEMORYSANITIZER \"-fsanitize=memory\"\n        CACHE STRING \"Flags used by the linker during the creation of shared libraries during MEMORYSANITIZER builds.\")\n    set(CMAKE_MODULE_LINKER_FLAGS_MEMORYSANITIZER \"-fsanitize=memory\"\n        CACHE STRING \"Flags used by the linker during the creation of shared libraries during MEMORYSANITIZER builds.\")\n    set(CMAKE_EXEC_LINKER_FLAGS_MEMORYSANITIZER \"-fsanitize=memory\"\n        CACHE STRING \"Flags used by the linker during MEMORYSANITIZER builds.\")\n\n    # Activate with: -DCMAKE_BUILD_TYPE=UndefinedSanitizer\n    set(CMAKE_C_FLAGS_UNDEFINEDSANITIZER \"-g -O1 -fsanitize=undefined -fsanitize=null -fsanitize=alignment -fno-sanitize-recover\"\n        CACHE STRING \"Flags used by the C compiler during UNDEFINEDSANITIZER builds.\")\n    set(CMAKE_CXX_FLAGS_UNDEFINEDSANITIZER \"-g -O1 -fsanitize=undefined -fsanitize=null -fsanitize=alignment -fno-sanitize-recover\"\n        CACHE STRING \"Flags used by the CXX compiler during UNDEFINEDSANITIZER builds.\")\n    set(CMAKE_SHARED_LINKER_FLAGS_UNDEFINEDSANITIZER \"-fsanitize=undefined\"\n        CACHE STRING \"Flags used by the linker during the creation of shared libraries during UNDEFINEDSANITIZER builds.\")\n    set(CMAKE_MODULE_LINKER_FLAGS_UNDEFINEDSANITIZER \"-fsanitize=undefined\"\n        CACHE STRING \"Flags used by the linker during the creation of shared libraries during UNDEFINEDSANITIZER builds.\")\n    set(CMAKE_EXEC_LINKER_FLAGS_UNDEFINEDSANITIZER \"-fsanitize=undefined\"\n        CACHE STRING \"Flags used by the linker during UNDEFINEDSANITIZER builds.\")\nendif()\n"
  },
  {
    "path": "src/libssh/cmake/Modules/DefinePlatformDefaults.cmake",
    "content": "# Set system vars\n\nif (CMAKE_SYSTEM_NAME MATCHES \"Linux\")\n    set(LINUX TRUE)\nendif(CMAKE_SYSTEM_NAME MATCHES \"Linux\")\n\nif (CMAKE_SYSTEM_NAME MATCHES \"FreeBSD\")\n    set(FREEBSD TRUE)\n    set(BSD TRUE)\nendif (CMAKE_SYSTEM_NAME MATCHES \"FreeBSD\")\n\nif (CMAKE_SYSTEM_NAME MATCHES \"OpenBSD\")\n    set(OPENBSD TRUE)\n    set(BSD TRUE)\nendif (CMAKE_SYSTEM_NAME MATCHES \"OpenBSD\")\n\nif (CMAKE_SYSTEM_NAME MATCHES \"NetBSD\")\n    set(NETBSD TRUE)\n    set(BSD TRUE)\nendif (CMAKE_SYSTEM_NAME MATCHES \"NetBSD\")\n\nif (CMAKE_SYSTEM_NAME MATCHES \"(Solaris|SunOS)\")\n    set(SOLARIS TRUE)\nendif (CMAKE_SYSTEM_NAME MATCHES \"(Solaris|SunOS)\")\n\nif (CMAKE_SYSTEM_NAME MATCHES \"OS2\")\n    set(OS2 TRUE)\nendif (CMAKE_SYSTEM_NAME MATCHES \"OS2\")\n\nif (CMAKE_SYSTEM_NAME MATCHES \"Darwin\")\n\tset (OSX TRUE)\nendif (CMAKE_SYSTEM_NAME MATCHES \"Darwin\")\n"
  },
  {
    "path": "src/libssh/cmake/Modules/ExtractSymbols.cmake",
    "content": "#\n#  Copyright (c) 2018 Anderson Toshiyuki Sasaki <ansasaki@redhat.com>\n#\n#  Redistribution and use is allowed according to the terms of the New\n#  BSD license.\n#  For details see the accompanying COPYING-CMAKE-SCRIPTS file.\n#\n\n#.rst:\n# ExtractSymbols\n# --------------\n#\n# This is a helper script for FindABImap.cmake.\n#\n# Extract symbols from header files and output a list to a file.\n# This script is run in build time to extract symbols from the provided header\n# files. This way, symbols added or removed can be checked and used to update\n# the symbol version script.\n#\n# All symbols followed by the character ``'('`` are extracted. If a\n# ``FILTER_PATTERN`` is provided, only the lines containing the given string are\n# considered.\n#\n# Expected defined variables\n# --------------------------\n#\n# ``HEADERS_LIST_FILE``:\n#   Required, expects a file containing the list of header files to be parsed.\n#\n# ``OUTPUT_PATH``:\n#   Required, expects the output file path.\n#\n# Optionally defined variables\n# ----------------------------\n#\n# ``FILTER_PATTERN``:\n#   Expects a string. Only lines containing the given string will be considered\n#   when extracting symbols.\n#\n\nif (NOT DEFINED OUTPUT_PATH)\n    message(SEND_ERROR \"OUTPUT_PATH not defined\")\nendif()\n\nif (NOT DEFINED HEADERS_LIST_FILE)\n    message(SEND_ERROR \"HEADERS not defined\")\nendif()\n\nfile(READ ${HEADERS_LIST_FILE} HEADERS_LIST)\n\nset(symbols)\nforeach(header ${HEADERS_LIST})\n\n    # Filter only lines containing the FILTER_PATTERN\n    file(STRINGS ${header} contain_filter\n      REGEX \"^.*${FILTER_PATTERN}.*[(]\"\n    )\n\n    # Remove function-like macros\n    foreach(line ${contain_filter})\n        if (NOT ${line} MATCHES \".*#[ ]*define\")\n            list(APPEND not_macro ${line})\n        endif()\n    endforeach()\n\n    set(functions)\n\n    # Get only the function names followed by '('\n    foreach(line ${not_macro})\n        string(REGEX MATCHALL \"[a-zA-Z0-9_]+[ ]*[(]\" func ${line})\n        list(APPEND functions ${func})\n    endforeach()\n\n    set(extracted_symbols)\n\n    # Remove '('\n    foreach(line ${functions})\n        string(REGEX REPLACE \"[(]\" \"\" symbol ${line})\n        string(STRIP \"${symbol}\" symbol)\n        list(APPEND extracted_symbols ${symbol})\n    endforeach()\n\n    list(APPEND symbols ${extracted_symbols})\nendforeach()\n\nlist(REMOVE_DUPLICATES symbols)\n\nlist(SORT symbols)\n\nstring(REPLACE \";\" \"\\n\" symbols_list \"${symbols}\")\n\nfile(WRITE ${OUTPUT_PATH} \"${symbols_list}\")\n"
  },
  {
    "path": "src/libssh/cmake/Modules/FindABIMap.cmake",
    "content": "#\n#  Copyright (c) 2018 Anderson Toshiyuki Sasaki <ansasaki@redhat.com>\n#\n#  Redistribution and use is allowed according to the terms of the New\n#  BSD license.\n#  For details see the accompanying COPYING-CMAKE-SCRIPTS file.\n#\n\n#.rst:\n# FindABIMap\n# ----------\n#\n# This file provides functions to generate the symbol version script. It uses\n# the ``abimap`` tool to generate and update the linker script file. It can be\n# installed by calling::\n#\n#   $ pip install abimap\n#\n# The ``function generate_map_file`` generates a symbol version script\n# containing the provided symbols. It defines a custom command which sets\n# ``target_name`` as its ``OUTPUT``.\n#\n# The experimental function ``extract_symbols()`` is provided as a simple\n# parser to extract the symbols from C header files. It simply extracts symbols\n# followed by an opening '``(``'. It is recommended to use a filter pattern to\n# select the lines to be considered. It defines a custom command which sets\n# ``target_name`` as its output.\n#\n# The helper function ``get_files_list()`` is provided to find files given a\n# name pattern. It defines a custom command which sets ``target_name`` as its\n# output.\n#\n# Functions provided\n# ------------------\n#\n# ::\n#\n#   generate_map_file(target_name\n#                     RELEASE_NAME_VERSION release_name\n#                     SYMBOLS symbols_target\n#                     [CURRENT_MAP cur_map]\n#                     [FINAL]\n#                     [BREAK_ABI]\n#                     [COPY_TO output]\n#                    )\n#\n# ``target_name``:\n#   Required, expects the name of the file to receive the generated symbol\n#   version script. It should be added as a dependency for the library. Use the\n#   linker option ``--version-script filename`` to add the version information\n#   to the symbols when building the library.\n#\n# ``RELEASE_NAME_VERSION``:\n#   Required, expects a string containing the name and version information to be\n#   added to the symbols in the format ``lib_name_1_2_3``.\n#\n# ``SYMBOLS``:\n#   Required, expects a target with the property ``LIST_FILE`` containing a path\n#   to a file containing the list of symbols to be added to the symbol version\n#   script.\n#\n# ``CURRENT_MAP``:\n#   Optional. If given, the new set of symbols will be checked against the\n#   ones contained in the ``cur_map`` file and updated properly. If an\n#   incompatible change is detected and ``BREAK_ABI`` is not defined, the build\n#   will fail.\n#\n# ``FINAL``:\n#   Optional. If given, will provide the ``--final`` option to ``abimap`` tool,\n#   which will mark the modified release in the symbol version script with a\n#   special comment, preventing later changes. This option should be set when\n#   creating a library release and the resulting map file should be stored with\n#   the source code.\n#\n# ``BREAK_ABI``:\n#   Optional. If provided, will use ``abimap`` ``--allow-abi-break`` option, which\n#   accepts incompatible changes to the set of symbols. This is necessary if any\n#   previously existing symbol were removed.\n#\n# ``COPY_TO``:\n#   Optional, expects a string containing the path to where the generated\n#   map file will be copied.\n#\n# Example:\n#\n# .. code-block:: cmake\n#\n#   find_package(ABIMap)\n#   generate_map_file(\"lib.map\"\n#                     RELEASE_NAME_VERSION \"lib_1_0_0\"\n#                     SYMBOLS symbols\n#                    )\n#\n# Where the target ``symbols`` has its property ``LIST_FILE`` set to the path to\n# a file containing::\n#\n#  ``symbol1``\n#  ``symbol2``\n#\n# This example would result in the symbol version script to be created in\n# ``${CMAKE_CURRENT_BINARY_DIR}/lib.map`` containing the provided symbols.\n#\n# ::\n#\n#   get_files_list(target_name\n#                   DIRECTORIES dir1 [dir2 ...]\n#                   FILES_PATTERNS exp1 [exp2 ...]\n#                   [COPY_TO output]\n#                  )\n#\n# ``target_name``:\n#   Required, expects the name of the target to be created. A file named as\n#   ``${target_name}.list`` will be created in\n#   ``${CMAKE_CURRENT_BINARY_DIR}`` to receive the list of files found.\n#\n# ``DIRECTORIES``:\n#   Required, expects a list of directories paths. Only absolute paths are\n#   supported.\n#\n# ``FILES_PATTERN``:\n#   Required, expects a list of matching expressions to find the files to be\n#   considered in the directories.\n#\n# ``COPY_TO``:\n#   Optional, expects a string containing the path to where the file containing\n#   the list of files will be copied.\n#\n# This command searches the directories provided in ``DIRECTORIES`` for files\n# matching any of the patterns provided in ``FILES_PATTERNS``. The obtained list\n# is written to the path specified by ``output``. A target named ``target_name``\n# will be created and its property ``LIST_FILE`` will be set to contain\n# ``${CMAKE_CURRENT_BINARY_DIR}/${target_name}.list``\n#\n# Example:\n#\n# .. code-block:: cmake\n#\n#   find_package(ABIMap)\n#   get_files_list(target\n#     DIRECTORIES \"/include/mylib\"\n#     FILES_PATTERNS \"*.h\"\n#     COPY_TO \"my_list.txt\"\n#   )\n#\n# Consider that ``/include/mylib`` contains 3 files, ``h1.h``, ``h2.h``, and\n# ``h3.hpp``\n#\n# Will result in a file ``my_list.txt`` containing::\n#\n#   ``h1.h;h2.h``\n#\n# And the target ``target`` will have its property ``LIST_FILE`` set to contain\n# ``${CMAKE_CURRENT_BINARY_DIR}/target.list``\n#\n# ::\n#\n#   extract_symbols(target_name\n#                   HEADERS_LIST headers_list_target\n#                   [FILTER_PATTERN pattern]\n#                   [COPY_TO output]\n#                  )\n#\n# ``target_name``:\n#   Required, expects the name of the target to be created. A file named after\n#   the string given in ``target_name`` will be created in\n#   ``${CMAKE_CURRENT_BINARY_DIR}`` to receive the list of symbols.\n#\n# ``HEADERS_LIST``:\n#   Required, expects a target with the property ``LIST_FILE`` set, containing a\n#   file path. Such file must contain a list of files paths.\n#\n# ``FILTER_PATTERN``:\n#   Optional, expects a string. Only the lines containing the filter pattern\n#   will be considered.\n#\n# ``COPY_TO``:\n#   Optional, expects a string containing the path to where the file containing\n#   the found symbols will be copied.\n#\n# This command extracts the symbols from the files listed in\n# ``headers_list`` and write them on the ``output`` file. If ``pattern``\n# is provided, then only the lines containing the string given in ``pattern``\n# will be considered. It is recommended to provide a ``FILTER_PATTERN`` to mark\n# the lines containing exported function declaration, since this function is\n# experimental and can return wrong symbols when parsing the header files. A\n# target named ``target_name`` will be created with the property ``LIST_FILE``\n# set to contain ``${CMAKE_CURRENT_BINARY_DIR}/${target_name}.list``.\n#\n# Example:\n#\n# .. code-block:: cmake\n#\n#   find_package(ABIMap)\n#   extract_symbols(\"lib.symbols\"\n#     HEADERS_LIST \"headers_target\"\n#     FILTER_PATTERN \"API_FUNCTION\"\n#   )\n#\n# Where ``LIST_FILE`` property in ``headers_target`` points to a file\n# containing::\n#\n#   header1.h;header2.h\n#\n# Where ``header1.h`` contains::\n#\n#   API_FUNCTION int exported_func1(int a, int b);\n#\n# ``header2.h`` contains::\n#\n#   API_FUNCTION int exported_func2(int a);\n#\n#   int private_func2(int b);\n#\n# Will result in a file ``lib.symbols.list`` in ``${CMAKE_CURRENT_BINARY_DIR}``\n# containing::\n#\n#   ``exported_func1``\n#   ``exported_func2``\n#\n\n# Search for python which is required\nif (ABIMap_FIND_REQURIED)\n    find_package(PythonInterp REQUIRED)\nelse()\n    find_package(PythonInterp)\nendif()\n\n\nif (PYTHONINTERP_FOUND)\n    # Search for abimap tool used to generate the map files\n    find_program(ABIMAP_EXECUTABLE NAMES abimap DOC \"path to the abimap executable\")\n    mark_as_advanced(ABIMAP_EXECUTABLE)\n\n    if (NOT ABIMAP_EXECUTABLE AND UNIX)\n        message(STATUS \"Could not find `abimap` in PATH.\"\n                       \" It can be found in PyPI as `abimap`\"\n                       \" (try `pip install abimap`)\")\n    endif ()\n\n    if (ABIMAP_EXECUTABLE)\n        # Get the abimap version\n        execute_process(COMMAND ${ABIMAP_EXECUTABLE} version\n                        OUTPUT_VARIABLE ABIMAP_VERSION_STRING\n                        OUTPUT_STRIP_TRAILING_WHITESPACE)\n\n        # If the version string starts with abimap-, strip it\n        if (\"abimap\" STRLESS_EQUAL ${ABIMAP_VERSION_STRING})\n            string(REGEX REPLACE \"abimap-\" \"\" ABIMAP_VERSION_STRING \"${ABIMAP_VERSION_STRING}\")\n        endif()\n    endif()\n\n    include(FindPackageHandleStandardArgs)\n    find_package_handle_standard_args(ABIMap\n                                      REQUIRED_VARS ABIMAP_EXECUTABLE\n                                      VERSION_VAR ABIMAP_VERSION_STRING)\nendif()\n\n\nif (ABIMAP_FOUND)\n\n# Define helper scripts\nset(_EXTRACT_SYMBOLS_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/ExtractSymbols.cmake)\nset(_GENERATE_MAP_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/GenerateMap.cmake)\nset(_GET_FILES_LIST_SCRIPT ${CMAKE_CURRENT_LIST_DIR}/GetFilesList.cmake)\n\nfunction(get_file_list _TARGET_NAME)\n\n    set(one_value_arguments\n        COPY_TO\n    )\n\n    set(multi_value_arguments\n        DIRECTORIES\n        FILES_PATTERNS\n    )\n\n    cmake_parse_arguments(_get_files_list\n        \"\"\n        \"${one_value_arguments}\"\n        \"${multi_value_arguments}\"\n        ${ARGN}\n    )\n\n    # The DIRS argument is required\n    if (NOT DEFINED _get_files_list_DIRECTORIES)\n        message(FATAL_ERROR \"No directories paths provided. Provide a list of\"\n                            \" directories paths containing header files.\")\n    endif()\n\n    # The FILES_PATTERNS argument is required\n    if (NOT DEFINED _get_files_list_FILES_PATTERNS)\n        message(FATAL_ERROR \"No matching expressions provided. Provide a list\"\n                            \" of matching patterns for the header files.\")\n    endif()\n\n    set(_FILES_LIST_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/${_TARGET_NAME}.list)\n\n    get_filename_component(_get_files_list_OUTPUT_PATH\n                           \"${_FILES_LIST_OUTPUT_PATH}\"\n                           ABSOLUTE)\n\n    add_custom_target(\n        ${_TARGET_NAME}_int ALL\n        COMMAND ${CMAKE_COMMAND}\n          -DOUTPUT_PATH=\"${_get_files_list_OUTPUT_PATH}\"\n          -DDIRECTORIES=\"${_get_files_list_DIRECTORIES}\"\n          -DFILES_PATTERNS=\"${_get_files_list_FILES_PATTERNS}\"\n          -P ${_GET_FILES_LIST_SCRIPT}\n        COMMENT\n          \"Searching for files\"\n    )\n\n    if (DEFINED _get_files_list_COPY_TO)\n        # Copy the generated file back to the COPY_TO\n        add_custom_target(${_TARGET_NAME} ALL\n            COMMAND\n              ${CMAKE_COMMAND} -E copy_if_different\n              ${_FILES_LIST_OUTPUT_PATH} ${_get_files_list_COPY_TO}\n            DEPENDS ${_TARGET_NAME}_int\n            COMMENT \"Copying ${_TARGET_NAME} to ${_get_files_list_COPY_TO}\"\n        )\n    else()\n        add_custom_target(${_TARGET_NAME} ALL\n            DEPENDS ${_TARGET_NAME}_int\n        )\n    endif()\n\n    set_target_properties(${_TARGET_NAME}\n        PROPERTIES LIST_FILE ${_FILES_LIST_OUTPUT_PATH}\n    )\n\nendfunction()\n\nfunction(extract_symbols _TARGET_NAME)\n\n    set(one_value_arguments\n        FILTER_PATTERN\n        HEADERS_LIST\n        COPY_TO\n    )\n\n    set(multi_value_arguments\n    )\n\n    cmake_parse_arguments(_extract_symbols\n        \"\"\n        \"${one_value_arguments}\"\n        \"${multi_value_arguments}\"\n        ${ARGN}\n    )\n\n    # The HEADERS_LIST_FILE argument is required\n    if (NOT DEFINED _extract_symbols_HEADERS_LIST)\n        message(FATAL_ERROR \"No target provided in HEADERS_LIST. Provide a\"\n                            \" target with the property LIST_FILE set as the\"\n                            \" path to the file containing the list of headers.\")\n    endif()\n\n    get_filename_component(_SYMBOLS_OUTPUT_PATH\n                           \"${CMAKE_CURRENT_BINARY_DIR}/${_TARGET_NAME}.list\"\n                           ABSOLUTE\n    )\n\n    get_target_property(_HEADERS_LIST_FILE\n        ${_extract_symbols_HEADERS_LIST}\n        LIST_FILE\n    )\n\n    add_custom_target(\n        ${_TARGET_NAME}_int ALL\n        COMMAND ${CMAKE_COMMAND}\n          -DOUTPUT_PATH=\"${_SYMBOLS_OUTPUT_PATH}\"\n          -DHEADERS_LIST_FILE=\"${_HEADERS_LIST_FILE}\"\n          -DFILTER_PATTERN=${_extract_symbols_FILTER_PATTERN}\n          -P ${_EXTRACT_SYMBOLS_SCRIPT}\n        DEPENDS ${_extract_symbols_HEADERS_LIST}\n        COMMENT \"Extracting symbols from headers\"\n    )\n\n    if (DEFINED _extract_symbols_COPY_TO)\n        # Copy the generated file back to the COPY_TO\n        add_custom_target(${_TARGET_NAME} ALL\n            COMMAND\n              ${CMAKE_COMMAND} -E copy_if_different\n              ${_SYMBOLS_OUTPUT_PATH} ${_extract_symbols_COPY_TO}\n            DEPENDS ${_TARGET_NAME}_int\n            COMMENT \"Copying ${_TARGET_NAME} to ${_extract_symbols_COPY_TO}\"\n        )\n    else()\n        add_custom_target(${_TARGET_NAME} ALL\n            DEPENDS ${_TARGET_NAME}_int\n        )\n    endif()\n\n    set_target_properties(${_TARGET_NAME}\n        PROPERTIES LIST_FILE ${_SYMBOLS_OUTPUT_PATH}\n    )\n\nendfunction()\n\nfunction(generate_map_file _TARGET_NAME)\n\n    set(options\n        FINAL\n        BREAK_ABI\n    )\n\n    set(one_value_arguments\n        RELEASE_NAME_VERSION\n        SYMBOLS\n        CURRENT_MAP\n        COPY_TO\n    )\n\n    set(multi_value_arguments\n    )\n\n    cmake_parse_arguments(_generate_map_file\n        \"${options}\"\n        \"${one_value_arguments}\"\n        \"${multi_value_arguments}\"\n        ${ARGN}\n    )\n\n    if (NOT DEFINED _generate_map_file_SYMBOLS)\n        message(FATAL_ERROR \"No target provided in SYMBOLS. Provide a target\"\n                            \" with the property LIST_FILE set as the path to\"\n                            \" the file containing the list of symbols.\")\n    endif()\n\n    if (NOT DEFINED _generate_map_file_RELEASE_NAME_VERSION)\n        message(FATAL_ERROR \"Release name and version not provided.\"\n          \" (e.g. libname_1_0_0)\")\n    endif()\n\n\n    get_target_property(_SYMBOLS_FILE\n        ${_generate_map_file_SYMBOLS}\n        LIST_FILE\n    )\n\n    # Set generated map file path\n    get_filename_component(_MAP_OUTPUT_PATH\n                           \"${CMAKE_CURRENT_BINARY_DIR}/${_TARGET_NAME}\"\n                           ABSOLUTE\n    )\n\n    add_custom_target(\n        ${_TARGET_NAME}_int ALL\n        COMMAND ${CMAKE_COMMAND}\n          -DABIMAP_EXECUTABLE=${ABIMAP_EXECUTABLE}\n          -DSYMBOLS=\"${_SYMBOLS_FILE}\"\n          -DCURRENT_MAP=${_generate_map_file_CURRENT_MAP}\n          -DOUTPUT_PATH=\"${_MAP_OUTPUT_PATH}\"\n          -DFINAL=${_generate_map_file_FINAL}\n          -DBREAK_ABI=${_generate_map_file_BREAK_ABI}\n          -DRELEASE_NAME_VERSION=${_generate_map_file_RELEASE_NAME_VERSION}\n          -P ${_GENERATE_MAP_SCRIPT}\n        DEPENDS ${_generate_map_file_SYMBOLS}\n        COMMENT \"Generating the map ${_TARGET_NAME}\"\n    )\n\n    # Add a custom command setting the map as OUTPUT to allow it to be added as\n    # a generated source\n    add_custom_command(\n        OUTPUT ${_MAP_OUTPUT_PATH}\n        DEPENDS ${_TARGET_NAME}\n    )\n\n    if (DEFINED _generate_map_file_COPY_TO)\n        # Copy the generated map back to the COPY_TO\n        add_custom_target(${_TARGET_NAME} ALL\n            COMMAND\n              ${CMAKE_COMMAND} -E copy_if_different ${_MAP_OUTPUT_PATH}\n              ${_generate_map_file_COPY_TO}\n            DEPENDS ${_TARGET_NAME}_int\n            COMMENT \"Copying ${_MAP_OUTPUT_PATH} to ${_generate_map_file_COPY_TO}\"\n        )\n    else()\n        add_custom_target(${_TARGET_NAME} ALL\n            DEPENDS ${_TARGET_NAME}_int\n        )\n    endif()\nendfunction()\n\nendif (ABIMAP_FOUND)\n"
  },
  {
    "path": "src/libssh/cmake/Modules/FindArgp.cmake",
    "content": "# - Try to find ARGP\n# Once done this will define\n#\n#  ARGP_ROOT_DIR - Set this variable to the root installation of ARGP\n#\n# Read-Only variables:\n#  ARGP_FOUND - system has ARGP\n#  ARGP_INCLUDE_DIR - the ARGP include directory\n#  ARGP_LIBRARIES - Link these to use ARGP\n#  ARGP_DEFINITIONS - Compiler switches required for using ARGP\n#\n#=============================================================================\n#  Copyright (c) 2011-2016 Andreas Schneider <asn@cryptomilk.org>\n#\n#  Distributed under the OSI-approved BSD License (the \"License\");\n#  see accompanying file Copyright.txt for details.\n#\n#  This software is distributed WITHOUT ANY WARRANTY; without even the\n#  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n#  See the License for more information.\n#=============================================================================\n#\n\nset(_ARGP_ROOT_HINTS\n)\n\nset(_ARGP_ROOT_PATHS\n    \"$ENV{PROGRAMFILES}/argp\"\n)\n\nfind_path(ARGP_ROOT_DIR\n    NAMES\n        include/argp.h\n    HINTS\n        ${_ARGP_ROOT_HINTS}\n    PATHS\n        ${_ARGP_ROOT_PATHS}\n)\nmark_as_advanced(ARGP_ROOT_DIR)\n\nfind_path(ARGP_INCLUDE_DIR\n    NAMES\n        argp.h\n    PATHS\n        ${ARGP_ROOT_DIR}/include\n)\n\nfind_library(ARGP_LIBRARY\n    NAMES\n        argp\n    PATHS\n        ${ARGP_ROOT_DIR}/lib\n)\n\nif (ARGP_LIBRARY)\n  set(ARGP_LIBRARIES\n      ${ARGP_LIBRARIES}\n      ${ARGP_LIBRARY}\n  )\nendif (ARGP_LIBRARY)\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(ARGP DEFAULT_MSG ARGP_LIBRARIES ARGP_INCLUDE_DIR)\n\n# show the ARGP_INCLUDE_DIR and ARGP_LIBRARIES variables only in the advanced view\nmark_as_advanced(ARGP_INCLUDE_DIR ARGP_LIBRARIES)\n"
  },
  {
    "path": "src/libssh/cmake/Modules/FindCMocka.cmake",
    "content": "# - Try to find CMocka\n# Once done this will define\n#\n#  CMOCKA_ROOT_DIR - Set this variable to the root installation of CMocka\n#\n# Read-Only variables:\n#  CMOCKA_FOUND - system has CMocka\n#  CMOCKA_INCLUDE_DIR - the CMocka include directory\n#  CMOCKA_LIBRARIES - Link these to use CMocka\n#  CMOCKA_DEFINITIONS - Compiler switches required for using CMocka\n#\n#=============================================================================\n#  Copyright (c) 2011-2012 Andreas Schneider <asn@cryptomilk.org>\n#\n#  Distributed under the OSI-approved BSD License (the \"License\");\n#  see accompanying file Copyright.txt for details.\n#\n#  This software is distributed WITHOUT ANY WARRANTY; without even the\n#  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n#  See the License for more information.\n#=============================================================================\n#\n\nset(_CMOCKA_ROOT_HINTS\n)\n\nset(_CMOCKA_ROOT_PATHS\n    \"$ENV{PROGRAMFILES}/cmocka\"\n)\n\nfind_path(CMOCKA_ROOT_DIR\n    NAMES\n        include/cmocka.h\n    HINTS\n        ${_CMOCKA_ROOT_HINTS}\n    PATHS\n        ${_CMOCKA_ROOT_PATHS}\n)\nmark_as_advanced(CMOCKA_ROOT_DIR)\n\nfind_path(CMOCKA_INCLUDE_DIR\n    NAMES\n        cmocka.h\n    PATHS\n        ${CMOCKA_ROOT_DIR}/include\n)\n\nfind_library(CMOCKA_LIBRARY\n    NAMES\n        cmocka\n    PATHS\n        ${CMOCKA_ROOT_DIR}/lib\n)\n\nif (CMOCKA_LIBRARY)\n  set(CMOCKA_LIBRARIES\n      ${CMOCKA_LIBRARIES}\n      ${CMOCKA_LIBRARY}\n  )\nendif (CMOCKA_LIBRARY)\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(CMocka DEFAULT_MSG CMOCKA_LIBRARIES CMOCKA_INCLUDE_DIR)\n\n# show the CMOCKA_INCLUDE_DIR and CMOCKA_LIBRARIES variables only in the advanced view\nmark_as_advanced(CMOCKA_INCLUDE_DIR CMOCKA_LIBRARIES)\n"
  },
  {
    "path": "src/libssh/cmake/Modules/FindGCrypt.cmake",
    "content": "# - Try to find GCrypt\n# Once done this will define\n#\n#  GCRYPT_FOUND - system has GCrypt\n#  GCRYPT_INCLUDE_DIRS - the GCrypt include directory\n#  GCRYPT_LIBRARIES - Link these to use GCrypt\n#  GCRYPT_DEFINITIONS - Compiler switches required for using GCrypt\n#\n#=============================================================================\n#  Copyright (c) 2009-2012 Andreas Schneider <asn@cryptomilk.org>\n#\n#  Distributed under the OSI-approved BSD License (the \"License\");\n#  see accompanying file Copyright.txt for details.\n#\n#  This software is distributed WITHOUT ANY WARRANTY; without even the\n#  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n#  See the License for more information.\n#=============================================================================\n#\n\nset(_GCRYPT_ROOT_HINTS\n    $ENV{GCRYTPT_ROOT_DIR}\n    ${GCRYPT_ROOT_DIR})\n\nset(_GCRYPT_ROOT_PATHS\n    \"$ENV{PROGRAMFILES}/libgcrypt\")\n\nset(_GCRYPT_ROOT_HINTS_AND_PATHS\n    HINTS ${_GCRYPT_ROOT_HINTS}\n    PATHS ${_GCRYPT_ROOT_PATHS})\n\n\nfind_path(GCRYPT_INCLUDE_DIR\n    NAMES\n        gcrypt.h\n    HINTS\n        ${_GCRYPT_ROOT_HINTS_AND_PATHS}\n    PATH_SUFFIXES\n        include\n)\n\nfind_library(GCRYPT_LIBRARY\n    NAMES\n        gcrypt\n        gcrypt11\n        libgcrypt-11\n    HINTS\n        ${_GCRYPT_ROOT_HINTS_AND_PATHS}\n    PATH_SUFFIXES\n        lib\n)\nfind_library(GCRYPT_ERROR_LIBRARY\n    NAMES\n        gpg-error\n        libgpg-error-0\n        libgpg-error6-0\n    HINTS\n        ${_GCRYPT_ROOT_HINTS_AND_PATHS}\n)\nset(GCRYPT_LIBRARIES ${GCRYPT_LIBRARY}  ${GCRYPT_ERROR_LIBRARY})\n\nif (GCRYPT_INCLUDE_DIR)\n    file(STRINGS \"${GCRYPT_INCLUDE_DIR}/gcrypt.h\" _gcrypt_version_str REGEX \"^#define GCRYPT_VERSION \\\"[0-9]+\\\\.[0-9]+\\\\.[0-9]\")\n\n    string(REGEX REPLACE \"^.*GCRYPT_VERSION.*([0-9]+\\\\.[0-9]+\\\\.[0-9]+).*\" \"\\\\1\" GCRYPT_VERSION \"${_gcrypt_version_str}\")\nendif (GCRYPT_INCLUDE_DIR)\n\ninclude(FindPackageHandleStandardArgs)\nif (GCRYPT_VERSION)\n    find_package_handle_standard_args(GCrypt\n        REQUIRED_VARS\n            GCRYPT_INCLUDE_DIR\n            GCRYPT_LIBRARIES\n        VERSION_VAR\n            GCRYPT_VERSION\n        FAIL_MESSAGE\n            \"Could NOT find GCrypt, try to set the path to GCrypt root folder in the system variable GCRYPT_ROOT_DIR\"\n    )\nelse (GCRYPT_VERSION)\n    find_package_handle_standard_args(GCrypt\n        \"Could NOT find GCrypt, try to set the path to GCrypt root folder in the system variable GCRYPT_ROOT_DIR\"\n        GCRYPT_INCLUDE_DIR\n        GCRYPT_LIBRARIES)\nendif (GCRYPT_VERSION)\n\n# show the GCRYPT_INCLUDE_DIRS and GCRYPT_LIBRARIES variables only in the advanced view\nmark_as_advanced(GCRYPT_INCLUDE_DIR GCRYPT_LIBRARIES)\n"
  },
  {
    "path": "src/libssh/cmake/Modules/FindGSSAPI.cmake",
    "content": "# - Try to find GSSAPI\n# Once done this will define\n#\n#  KRB5_CONFIG - Path to krb5-config\n#  GSSAPI_ROOT_DIR - Set this variable to the root installation of GSSAPI\n#\n# Read-Only variables:\n#  GSSAPI_FLAVOR_MIT - set to TURE if MIT Kerberos has been found\n#  GSSAPI_FLAVOR_HEIMDAL - set to TRUE if Heimdal Keberos has been found\n#  GSSAPI_FOUND - system has GSSAPI\n#  GSSAPI_INCLUDE_DIR - the GSSAPI include directory\n#  GSSAPI_LIBRARIES - Link these to use GSSAPI\n#  GSSAPI_DEFINITIONS - Compiler switches required for using GSSAPI\n#\n#=============================================================================\n#  Copyright (c) 2013 Andreas Schneider <asn@cryptomilk.org>\n#\n#  Distributed under the OSI-approved BSD License (the \"License\");\n#  see accompanying file Copyright.txt for details.\n#\n#  This software is distributed WITHOUT ANY WARRANTY; without even the\n#  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n#  See the License for more information.\n#=============================================================================\n#\n\nfind_path(GSSAPI_ROOT_DIR\n    NAMES\n        include/gssapi.h\n        include/gssapi/gssapi.h\n    HINTS\n        ${_GSSAPI_ROOT_HINTS}\n    PATHS\n        ${_GSSAPI_ROOT_PATHS}\n)\nmark_as_advanced(GSSAPI_ROOT_DIR)\n\nif (UNIX)\n    find_program(KRB5_CONFIG\n        NAMES\n            krb5-config\n        PATHS\n            ${GSSAPI_ROOT_DIR}/bin\n            /opt/local/bin)\n    mark_as_advanced(KRB5_CONFIG)\n\n    if (KRB5_CONFIG)\n        # Check if we have MIT KRB5\n        execute_process(\n            COMMAND\n                ${KRB5_CONFIG} --vendor\n            RESULT_VARIABLE\n                _GSSAPI_VENDOR_RESULT\n            OUTPUT_VARIABLE\n                _GSSAPI_VENDOR_STRING)\n\n        if ((_GSSAPI_VENDOR_STRING MATCHES \".*Massachusetts.*\") OR (_GSSAPI_VENDOR_STRING\n                        MATCHES \".*MITKerberosShim.*\"))\n            set(GSSAPI_FLAVOR_MIT TRUE)\n        else()\n            execute_process(\n                COMMAND\n                    ${KRB5_CONFIG} --libs gssapi\n                RESULT_VARIABLE\n                    _GSSAPI_LIBS_RESULT\n                OUTPUT_VARIABLE\n                    _GSSAPI_LIBS_STRING)\n\n            if (_GSSAPI_LIBS_STRING MATCHES \".*roken.*\")\n                set(GSSAPI_FLAVOR_HEIMDAL TRUE)\n            endif()\n        endif()\n\n        # Get the include dir\n        execute_process(\n            COMMAND\n                ${KRB5_CONFIG} --cflags gssapi\n            RESULT_VARIABLE\n                _GSSAPI_INCLUDE_RESULT\n            OUTPUT_VARIABLE\n                _GSSAPI_INCLUDE_STRING)\n        string(REGEX REPLACE \"(\\r?\\n)+$\" \"\" _GSSAPI_INCLUDE_STRING \"${_GSSAPI_INCLUDE_STRING}\")\n        string(REGEX REPLACE \" *-I\" \"\" _GSSAPI_INCLUDEDIR \"${_GSSAPI_INCLUDE_STRING}\")\n    endif()\n\n    if (NOT GSSAPI_FLAVOR_MIT AND NOT GSSAPI_FLAVOR_HEIMDAL)\n        # Check for HEIMDAL\n        find_package(PkgConfig)\n        if (PKG_CONFIG_FOUND)\n            pkg_check_modules(_GSSAPI heimdal-gssapi)\n        endif (PKG_CONFIG_FOUND)\n\n        if (_GSSAPI_FOUND)\n            set(GSSAPI_FLAVOR_HEIMDAL TRUE)\n        else()\n            find_path(_GSSAPI_ROKEN\n                NAMES\n                    roken.h\n                PATHS\n                    ${GSSAPI_ROOT_DIR}/include\n                    ${_GSSAPI_INCLUDEDIR})\n            if (_GSSAPI_ROKEN)\n                set(GSSAPI_FLAVOR_HEIMDAL TRUE)\n            endif()\n        endif ()\n    endif()\nendif (UNIX)\n\nfind_path(GSSAPI_INCLUDE_DIR\n    NAMES\n        gssapi.h\n        gssapi/gssapi.h\n    PATHS\n        ${GSSAPI_ROOT_DIR}/include\n        ${_GSSAPI_INCLUDEDIR}\n)\n\nif (GSSAPI_FLAVOR_MIT)\n    find_library(GSSAPI_LIBRARY\n        NAMES\n            gssapi_krb5\n        PATHS\n            ${GSSAPI_ROOT_DIR}/lib\n            ${_GSSAPI_LIBDIR}\n    )\n\n    find_library(KRB5_LIBRARY\n        NAMES\n            krb5\n        PATHS\n            ${GSSAPI_ROOT_DIR}/lib\n            ${_GSSAPI_LIBDIR}\n    )\n\n    find_library(K5CRYPTO_LIBRARY\n        NAMES\n            k5crypto\n        PATHS\n            ${GSSAPI_ROOT_DIR}/lib\n            ${_GSSAPI_LIBDIR}\n    )\n\n    find_library(COM_ERR_LIBRARY\n        NAMES\n            com_err\n        PATHS\n            ${GSSAPI_ROOT_DIR}/lib\n            ${_GSSAPI_LIBDIR}\n    )\n\n    if (GSSAPI_LIBRARY)\n        set(GSSAPI_LIBRARIES\n            ${GSSAPI_LIBRARIES}\n            ${GSSAPI_LIBRARY}\n        )\n    endif (GSSAPI_LIBRARY)\n\n    if (KRB5_LIBRARY)\n        set(GSSAPI_LIBRARIES\n            ${GSSAPI_LIBRARIES}\n            ${KRB5_LIBRARY}\n        )\n    endif (KRB5_LIBRARY)\n\n    if (K5CRYPTO_LIBRARY)\n        set(GSSAPI_LIBRARIES\n            ${GSSAPI_LIBRARIES}\n            ${K5CRYPTO_LIBRARY}\n        )\n    endif (K5CRYPTO_LIBRARY)\n\n    if (COM_ERR_LIBRARY)\n        set(GSSAPI_LIBRARIES\n            ${GSSAPI_LIBRARIES}\n            ${COM_ERR_LIBRARY}\n        )\n    endif (COM_ERR_LIBRARY)\nendif (GSSAPI_FLAVOR_MIT)\n\nif (GSSAPI_FLAVOR_HEIMDAL)\n    find_library(GSSAPI_LIBRARY\n        NAMES\n            gssapi\n        PATHS\n            ${GSSAPI_ROOT_DIR}/lib\n            ${_GSSAPI_LIBDIR}\n    )\n\n    find_library(KRB5_LIBRARY\n        NAMES\n            krb5\n        PATHS\n            ${GSSAPI_ROOT_DIR}/lib\n            ${_GSSAPI_LIBDIR}\n    )\n\n    find_library(HCRYPTO_LIBRARY\n        NAMES\n            hcrypto\n        PATHS\n            ${GSSAPI_ROOT_DIR}/lib\n            ${_GSSAPI_LIBDIR}\n    )\n\n    find_library(COM_ERR_LIBRARY\n        NAMES\n            com_err\n        PATHS\n            ${GSSAPI_ROOT_DIR}/lib\n            ${_GSSAPI_LIBDIR}\n    )\n\n    find_library(HEIMNTLM_LIBRARY\n        NAMES\n            heimntlm\n        PATHS\n            ${GSSAPI_ROOT_DIR}/lib\n            ${_GSSAPI_LIBDIR}\n    )\n\n    find_library(HX509_LIBRARY\n        NAMES\n            hx509\n        PATHS\n            ${GSSAPI_ROOT_DIR}/lib\n            ${_GSSAPI_LIBDIR}\n    )\n\n    find_library(ASN1_LIBRARY\n        NAMES\n            asn1\n        PATHS\n            ${GSSAPI_ROOT_DIR}/lib\n            ${_GSSAPI_LIBDIR}\n    )\n\n    find_library(WIND_LIBRARY\n        NAMES\n            wind\n        PATHS\n            ${GSSAPI_ROOT_DIR}/lib\n            ${_GSSAPI_LIBDIR}\n    )\n\n    find_library(ROKEN_LIBRARY\n        NAMES\n            roken\n        PATHS\n            ${GSSAPI_ROOT_DIR}/lib\n            ${_GSSAPI_LIBDIR}\n    )\n\n    if (GSSAPI_LIBRARY)\n        set(GSSAPI_LIBRARIES\n            ${GSSAPI_LIBRARIES}\n            ${GSSAPI_LIBRARY}\n        )\n    endif (GSSAPI_LIBRARY)\n\n    if (KRB5_LIBRARY)\n        set(GSSAPI_LIBRARIES\n            ${GSSAPI_LIBRARIES}\n            ${KRB5_LIBRARY}\n        )\n    endif (KRB5_LIBRARY)\n\n    if (HCRYPTO_LIBRARY)\n        set(GSSAPI_LIBRARIES\n            ${GSSAPI_LIBRARIES}\n            ${HCRYPTO_LIBRARY}\n        )\n    endif (HCRYPTO_LIBRARY)\n\n    if (COM_ERR_LIBRARY)\n        set(GSSAPI_LIBRARIES\n            ${GSSAPI_LIBRARIES}\n            ${COM_ERR_LIBRARY}\n        )\n    endif (COM_ERR_LIBRARY)\n\n    if (HEIMNTLM_LIBRARY)\n        set(GSSAPI_LIBRARIES\n            ${GSSAPI_LIBRARIES}\n            ${HEIMNTLM_LIBRARY}\n        )\n    endif (HEIMNTLM_LIBRARY)\n\n    if (HX509_LIBRARY)\n        set(GSSAPI_LIBRARIES\n            ${GSSAPI_LIBRARIES}\n            ${HX509_LIBRARY}\n        )\n    endif (HX509_LIBRARY)\n\n    if (ASN1_LIBRARY)\n        set(GSSAPI_LIBRARIES\n            ${GSSAPI_LIBRARIES}\n            ${ASN1_LIBRARY}\n        )\n    endif (ASN1_LIBRARY)\n\n    if (WIND_LIBRARY)\n        set(GSSAPI_LIBRARIES\n            ${GSSAPI_LIBRARIES}\n            ${WIND_LIBRARY}\n        )\n    endif (WIND_LIBRARY)\n\n    if (ROKEN_LIBRARY)\n        set(GSSAPI_LIBRARIES\n            ${GSSAPI_LIBRARIES}\n            ${WIND_LIBRARY}\n        )\n    endif (ROKEN_LIBRARY)\nendif (GSSAPI_FLAVOR_HEIMDAL)\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(GSSAPI DEFAULT_MSG GSSAPI_LIBRARIES GSSAPI_INCLUDE_DIR)\n\nif (GSSAPI_INCLUDE_DIRS AND GSSAPI_LIBRARIES)\n    set(GSSAPI_FOUND TRUE)\nendif (GSSAPI_INCLUDE_DIRS AND GSSAPI_LIBRARIES)\n\n# show the GSSAPI_INCLUDE_DIRS and GSSAPI_LIBRARIES variables only in the advanced view\nmark_as_advanced(GSSAPI_INCLUDE_DIRS GSSAPI_LIBRARIES)\n"
  },
  {
    "path": "src/libssh/cmake/Modules/FindMbedTLS.cmake",
    "content": "# - Try to find mbedTLS\n# Once done this will define\n#\n#  MBEDTLS_FOUND - system has mbedTLS\n#  MBEDTLS_INCLUDE_DIRS - the mbedTLS include directory\n#  MBEDTLS_LIBRARIES - Link these to use mbedTLS\n#  MBEDTLS_DEFINITIONS - Compiler switches required for using mbedTLS\n#=============================================================================\n#  Copyright (c) 2017 Sartura d.o.o.\n#\n#  Author: Juraj Vijtiuk <juraj.vijtiuk@sartura.hr>\n#\n#  Distributed under the OSI-approved BSD License (the \"License\");\n#  see accompanying file Copyright.txt for details.\n#\n#  This software is distributed WITHOUT ANY WARRANTY; without even the\n#  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n#  See the License for more information.\n#=============================================================================\n#\n\n\nset(_MBEDTLS_ROOT_HINTS\n    $ENV{MBEDTLS_ROOT_DIR}\n    ${MBEDTLS_ROOT_DIR})\n\nset(_MBEDTLS_ROOT_PATHS\n    \"$ENV{PROGRAMFILES}/libmbedtls\")\n\nset(_MBEDTLS_ROOT_HINTS_AND_PATHS\n    HINTS ${_MBEDTLS_ROOT_HINTS}\n    PATHS ${_MBEDTLS_ROOT_PATHS})\n\n\nfind_path(MBEDTLS_INCLUDE_DIR\n    NAMES\n        mbedtls/config.h\n    HINTS\n        ${_MBEDTLS_ROOT_HINTS_AND_PATHS}\n    PATH_SUFFIXES\n       include\n)\n\nfind_library(MBEDTLS_SSL_LIBRARY\n        NAMES\n            mbedtls\n        HINTS\n            ${_MBEDTLS_ROOT_HINTS_AND_PATHS}\n        PATH_SUFFIXES\n            lib\n\n)\n\nfind_library(MBEDTLS_CRYPTO_LIBRARY\n        NAMES\n            mbedcrypto\n        HINTS\n            ${_MBEDTLS_ROOT_HINTS_AND_PATHS}\n        PATH_SUFFIXES\n            lib\n)\n\nfind_library(MBEDTLS_X509_LIBRARY\n        NAMES\n            mbedx509\n        HINTS\n            ${_MBEDTLS_ROOT_HINTS_AND_PATHS}\n        PATH_SUFFIXES\n            lib\n)\n\nset(MBEDTLS_LIBRARIES ${MBEDTLS_SSL_LIBRARY} ${MBEDTLS_CRYPTO_LIBRARY}\n        ${MBEDTLS_X509_LIBRARY})\n\nif (MBEDTLS_INCLUDE_DIR AND EXISTS \"${MBEDTLS_INCLUDE_DIR}/mbedtls/version.h\")\n    file(STRINGS \"${MBEDTLS_INCLUDE_DIR}/mbedtls/version.h\" _mbedtls_version_str REGEX\n            \"^#[\\t ]*define[\\t ]+MBEDTLS_VERSION_STRING[\\t ]+\\\"[0-9]+.[0-9]+.[0-9]+\\\"\")\n\n    string(REGEX REPLACE \"^.*MBEDTLS_VERSION_STRING.*([0-9]+.[0-9]+.[0-9]+).*\"\n            \"\\\\1\" MBEDTLS_VERSION \"${_mbedtls_version_str}\")\nendif ()\n\ninclude(FindPackageHandleStandardArgs)\nif (MBEDTLS_VERSION)\n    find_package_handle_standard_args(MbedTLS\n        REQUIRED_VARS\n            MBEDTLS_INCLUDE_DIR\n            MBEDTLS_LIBRARIES\n        VERSION_VAR\n            MBEDTLS_VERSION\n        FAIL_MESSAGE\n            \"Could NOT find mbedTLS, try to set the path to mbedTLS root folder\n            in the system variable MBEDTLS_ROOT_DIR\"\n    )\nelse (MBEDTLS_VERSION)\n    find_package_handle_standard_args(MBedTLS\n        \"Could NOT find mbedTLS, try to set the path to mbedLS root folder in\n        the system variable MBEDTLS_ROOT_DIR\"\n        MBEDTLS_INCLUDE_DIR\n        MBEDTLS_LIBRARIES)\nendif (MBEDTLS_VERSION)\n\n# show the MBEDTLS_INCLUDE_DIRS and MBEDTLS_LIBRARIES variables only in the advanced view\nmark_as_advanced(MBEDTLS_INCLUDE_DIR MBEDTLS_LIBRARIES)\n"
  },
  {
    "path": "src/libssh/cmake/Modules/FindNSIS.cmake",
    "content": "# - Try to find NSIS\n# Once done this will define\n#\n#  NSIS_ROOT_PATH - Set this variable to the root installation of NSIS\n#\n# Read-Only variables:\n#\n#  NSIS_FOUND - system has NSIS\n#  NSIS_MAKE - NSIS creator executable\n#\n#=============================================================================\n#  Copyright (c) 2010-2013 Andreas Schneider <asn@cryptomilk.org>\n#\n#  Distributed under the OSI-approved BSD License (the \"License\");\n#  see accompanying file Copyright.txt for details.\n#\n#  This software is distributed WITHOUT ANY WARRANTY; without even the\n#  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n#  See the License for more information.\n#=============================================================================\n#\n\nif (WIN32)\n    set(_x86 \"(x86)\")\n\n    set(_NSIS_ROOT_PATHS\n        \"$ENV{ProgramFiles}/NSIS\"\n        \"$ENV{ProgramFiles${_x86}}/NSIS\"\n        \"[HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\Wow6432Node\\\\NSIS;Default]\")\n\n    find_path(NSIS_ROOT_PATH\n        NAMES\n            Include/Library.nsh\n        PATHS\n            ${_NSIS_ROOT_PATHS}\n        )\n    mark_as_advanced(NSIS_ROOT_PATH)\nendif (WIN32)\n\nfind_program(NSIS_MAKE\n    NAMES\n        makensis\n    PATHS\n        ${NSIS_ROOT_PATH}\n)\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(NSIS DEFAULT_MSG NSIS_MAKE)\n\nif (NSIS_MAKE)\n    set(NSIS_FOUND TRUE)\nendif (NSIS_MAKE)\n\nmark_as_advanced(NSIS_MAKE)\n"
  },
  {
    "path": "src/libssh/cmake/Modules/FindNaCl.cmake",
    "content": "# - Try to find NaCl\n# Once done this will define\n#\n#  NACL_FOUND - system has NaCl\n#  NACL_INCLUDE_DIRS - the NaCl include directory\n#  NACL_LIBRARIES - Link these to use NaCl\n#  NACL_DEFINITIONS - Compiler switches required for using NaCl\n#\n#  Copyright (c) 2010 Andreas Schneider <asn@cryptomilk.org>\n#  Copyright (c) 2013 Aris Adamantiadis <aris@badcode.be>\n#\n#  Redistribution and use is allowed according to the terms of the New\n#  BSD license.\n#  For details see the accompanying COPYING-CMAKE-SCRIPTS file.\n#\n\n\nif (NACL_LIBRARIES AND NACL_INCLUDE_DIRS)\n  # in cache already\n  set(NACL_FOUND TRUE)\nelse (NACL_LIBRARIES AND NACL_INCLUDE_DIRS)\n\n  find_path(NACL_INCLUDE_DIR\n    NAMES\n      nacl/crypto_box_curve25519xsalsa20poly1305.h\n    PATHS\n      /usr/include\n      /usr/local/include\n      /opt/local/include\n      /sw/include\n  )\n\n  find_library(NACL_LIBRARY\n    NAMES\n      nacl\n    PATHS\n      /usr/lib\n      /usr/local/lib\n      /opt/local/lib\n      /sw/lib\n  )\n\n  set(NACL_INCLUDE_DIRS\n    ${NACL_INCLUDE_DIR}\n  )\n\n  if (NACL_LIBRARY)\n    set(NACL_LIBRARIES\n        ${NACL_LIBRARIES}\n        ${NACL_LIBRARY}\n    )\n  endif (NACL_LIBRARY)\n\n  include(FindPackageHandleStandardArgs)\n  find_package_handle_standard_args(NaCl DEFAULT_MSG NACL_LIBRARIES NACL_INCLUDE_DIRS)\n\n  # show the NACL_INCLUDE_DIRS and NACL_LIBRARIES variables only in the advanced view\n  mark_as_advanced(NACL_INCLUDE_DIRS NACL_LIBRARIES)\n\nendif (NACL_LIBRARIES AND NACL_INCLUDE_DIRS)\n\n"
  },
  {
    "path": "src/libssh/cmake/Modules/GenerateMap.cmake",
    "content": "#\n#  Copyright (c) 2018 Anderson Toshiyuki Sasaki <ansasaki@redhat.com>\n#\n#  Redistribution and use is allowed according to the terms of the New\n#  BSD license.\n#  For details see the accompanying COPYING-CMAKE-SCRIPTS file.\n#\n\n#.rst:\n# GenerateMap\n# -----------\n#\n# This is a helper script for FindABImap.cmake.\n#\n# Generates a symbols version script using the abimap tool.\n# This script is run in build time to use the correct command depending on the\n# existence of the file provided ``CURRENT_MAP``.\n#\n# If the file exists, the ``abimap update`` subcommand is used to update the\n# existing map. Otherwise, the ``abimap new`` subcommand is used to create a new\n# map file.\n#\n# If the file provided in ``CURRENT_MAP`` exists, it is copied to the\n# ``OUTPUT_PATH`` before updating.\n# This is required because ``abimap`` do not generate output if no symbols were\n# changed when updating an existing file.\n#\n# Expected defined variables\n# --------------------------\n#\n# ``SYMBOLS``:\n#   Required file containing the symbols to be used as input. Usually this is\n#   the ``OUTPUT`` generated by ``extract_symbols()`` function provided in\n#   FindABImap.cmake\n#\n# ``RELEASE_NAME_VERSION``:\n#   Required, expects the library name and version information to be added to\n#   the symbols in the format ``library_name_1_2_3``\n#\n# ``CURRENT_MAP``:\n#   Required, expects the path to the current map file (or the path were it\n#   should be)\n#\n# ``OUTPUT_PATH``:\n#   Required, expects the output file path.\n#\n# ``ABIMAP_EXECUTABLE``:\n#   Required, expects the path to the ``abimap`` tool.\n#\n# Optionally defined variables\n# ----------------------------\n#\n# ``FINAL``:\n#   If defined, will mark the modified set of symbols in the symbol version\n#   script as final, preventing later changes using ``abimap``.\n#\n# ``BREAK_ABI``:\n#   If defined, the build will not fail if symbols were removed.\n#   If defined and a symbol is removed, a new release is created containing\n#   all symbols from all released versions. This makes an incompatible release.\n#\n\nif (NOT DEFINED RELEASE_NAME_VERSION)\n    message(SEND_ERROR \"RELEASE_NAME_VERSION not defined\")\nendif()\n\nif (NOT DEFINED SYMBOLS)\n    message(SEND_ERROR \"SYMBOLS not defined\")\nendif()\n\nif (NOT DEFINED CURRENT_MAP)\n    message(SEND_ERROR \"CURRENT_MAP not defined\")\nendif()\n\nif (NOT DEFINED OUTPUT_PATH)\n    message(SEND_ERROR \"OUTPUT_PATH not defined\")\nendif()\n\nif (NOT ABIMAP_EXECUTABLE)\n    message(SEND_ERROR \"ABIMAP_EXECUTABLE not defined\")\nendif()\n\nset(ARGS_LIST)\n\nif (FINAL)\n    list(APPEND ARGS_LIST \"--final\")\nendif()\n\nif (EXISTS ${CURRENT_MAP})\n    if (BREAK_ABI)\n        list(APPEND ARGS_LIST \"--allow-abi-break\")\n    endif()\n\n    execute_process(\n      COMMAND\n        ${CMAKE_COMMAND} -E copy_if_different ${CURRENT_MAP} ${OUTPUT_PATH}\n      COMMAND\n        ${ABIMAP_EXECUTABLE} update ${ARGS_LIST}\n        -r ${RELEASE_NAME_VERSION}\n        -i ${SYMBOLS}\n        -o ${OUTPUT_PATH}\n        ${CURRENT_MAP}\n      RESULT_VARIABLE result\n    )\nelse ()\n    execute_process(\n      COMMAND\n        ${ABIMAP_EXECUTABLE} new ${ARGS_LIST}\n        -r ${RELEASE_NAME_VERSION}\n        -i ${SYMBOLS}\n        -o ${OUTPUT_PATH}\n      RESULT_VARIABLE result\n    )\nendif()\n\nif (NOT \"${result}\" STREQUAL \"0\")\n    message(SEND_ERROR \"Map generation failed\")\nendif()\n"
  },
  {
    "path": "src/libssh/cmake/Modules/GetFilesList.cmake",
    "content": "#\n#  Copyright (c) 2018 Anderson Toshiyuki Sasaki <ansasaki@redhat.com>\n#\n#  Redistribution and use is allowed according to the terms of the New\n#  BSD license.\n#  For details see the accompanying COPYING-CMAKE-SCRIPTS file.\n#\n\n#.rst:\n# GetFilesList\n# ------------\n#\n# This is a helper script for FindABImap.cmake.\n#\n# Search in the provided directories for files matching the provided pattern.\n# The list of files is then written to the output file.\n#\n# Expected defined variables\n# --------------------------\n#\n# ``DIRECTORIES``:\n#   Required, expects a list of directories paths.\n#\n# ``FILES_PATTERNS``:\n#   Required, expects a list of patterns to be used to search files\n#\n# ``OUTPUT_PATH``:\n#   Required, expects the output file path.\n\nif (NOT DEFINED DIRECTORIES)\n    message(SEND_ERROR \"DIRECTORIES not defined\")\nendif()\n\nif (NOT DEFINED FILES_PATTERNS)\n    message(SEND_ERROR \"FILES_PATTERNS not defined\")\nendif()\n\nif (NOT DEFINED OUTPUT_PATH)\n    message(SEND_ERROR \"OUTPUT_PATH not defined\")\nendif()\n\nstring(REPLACE \" \" \";\" DIRECTORIES_LIST \"${DIRECTORIES}\")\nstring(REPLACE \" \" \";\" FILES_PATTERNS_LIST \"${FILES_PATTERNS}\")\n\n# Create the list of expressions for the files\nset(glob_expressions)\nforeach(dir ${DIRECTORIES_LIST})\n    foreach(exp ${FILES_PATTERNS_LIST})\n        list(APPEND glob_expressions\n          \"${dir}/${exp}\"\n        )\n    endforeach()\nendforeach()\n\n# Create the list of files\nfile(GLOB files ${glob_expressions})\n\n# Write to the output\nfile(WRITE ${OUTPUT_PATH} \"${files}\")\n"
  },
  {
    "path": "src/libssh/cmake/Modules/MacroEnsureOutOfSourceBuild.cmake",
    "content": "# - MACRO_ENSURE_OUT_OF_SOURCE_BUILD(<errorMessage>)\n# MACRO_ENSURE_OUT_OF_SOURCE_BUILD(<errorMessage>)\n\n# Copyright (c) 2006, Alexander Neundorf, <neundorf@kde.org>\n#\n# Redistribution and use is allowed according to the terms of the BSD license.\n# For details see the accompanying COPYING-CMAKE-SCRIPTS file.\n\nmacro (MACRO_ENSURE_OUT_OF_SOURCE_BUILD _errorMessage)\n\n   string(COMPARE EQUAL \"${CMAKE_SOURCE_DIR}\" \"${CMAKE_BINARY_DIR}\" _insource)\n   if (_insource)\n     message(SEND_ERROR \"${_errorMessage}\")\n     message(FATAL_ERROR \"Remove the file CMakeCache.txt in ${CMAKE_SOURCE_DIR} first.\")\n   endif (_insource)\n\nendmacro (MACRO_ENSURE_OUT_OF_SOURCE_BUILD)\n"
  },
  {
    "path": "src/libssh/cmake/Toolchain-cross-m32.cmake",
    "content": "set(CMAKE_C_FLAGS \"-m32\" CACHE STRING \"C compiler flags\"   FORCE)\nset(CMAKE_CXX_FLAGS \"-m32\" CACHE STRING \"C++ compiler flags\" FORCE)\n\nset(LIB32 /usr/lib) # Fedora\n\nif(EXISTS /usr/lib32)\n    set(LIB32 /usr/lib32) # Arch, Solus\nendif()\n\nset(CMAKE_SYSTEM_LIBRARY_PATH ${LIB32} CACHE STRING \"system library search path\" FORCE)\nset(CMAKE_LIBRARY_PATH        ${LIB32} CACHE STRING \"library search path\"        FORCE)\n\n# this is probably unlikely to be needed, but just in case\nset(CMAKE_EXE_LINKER_FLAGS    \"-m32 -L${LIB32}\" CACHE STRING \"executable linker flags\"     FORCE)\nset(CMAKE_SHARED_LINKER_FLAGS \"-m32 -L${LIB32}\" CACHE STRING \"shared library linker flags\" FORCE)\nset(CMAKE_MODULE_LINKER_FLAGS \"-m32 -L${LIB32}\" CACHE STRING \"module linker flags\"         FORCE)\n\n# on Fedora and Arch and similar, point pkgconfig at 32 bit .pc files. We have\n# to include the regular system .pc files as well (at the end), because some\n# are not always present in the 32 bit directory\nif(EXISTS ${LIB32}/pkgconfig)\n    set(ENV{PKG_CONFIG_LIBDIR} ${LIB32}/pkgconfig:/usr/share/pkgconfig:/usr/lib/pkgconfig:/usr/lib64/pkgconfig)\nendiF()\n"
  },
  {
    "path": "src/libssh/config.h.cmake",
    "content": "/* Name of package */\n#cmakedefine PACKAGE \"${PROJECT_NAME}\"\n\n/* Version number of package */\n#cmakedefine VERSION \"${PROJECT_VERSION}\"\n\n#cmakedefine SYSCONFDIR \"${SYSCONFDIR}\"\n#cmakedefine BINARYDIR \"${BINARYDIR}\"\n#cmakedefine SOURCEDIR \"${SOURCEDIR}\"\n\n/* Global bind configuration file path */\n#cmakedefine GLOBAL_BIND_CONFIG \"${GLOBAL_BIND_CONFIG}\"\n\n/* Global client configuration file path */\n#cmakedefine GLOBAL_CLIENT_CONFIG \"${GLOBAL_CLIENT_CONFIG}\"\n\n/************************** HEADER FILES *************************/\n\n/* Define to 1 if you have the <argp.h> header file. */\n#cmakedefine HAVE_ARGP_H 1\n\n/* Define to 1 if you have the <aprpa/inet.h> header file. */\n#cmakedefine HAVE_ARPA_INET_H 1\n\n/* Define to 1 if you have the <glob.h> header file. */\n#cmakedefine HAVE_GLOB_H 1\n\n/* Define to 1 if you have the <valgrind/valgrind.h> header file. */\n#cmakedefine HAVE_VALGRIND_VALGRIND_H 1\n\n/* Define to 1 if you have the <pty.h> header file. */\n#cmakedefine HAVE_PTY_H 1\n\n/* Define to 1 if you have the <utmp.h> header file. */\n#cmakedefine HAVE_UTMP_H 1\n\n/* Define to 1 if you have the <util.h> header file. */\n#cmakedefine HAVE_UTIL_H 1\n\n/* Define to 1 if you have the <libutil.h> header file. */\n#cmakedefine HAVE_LIBUTIL_H 1\n\n/* Define to 1 if you have the <sys/time.h> header file. */\n#cmakedefine HAVE_SYS_TIME_H 1\n\n/* Define to 1 if you have the <sys/utime.h> header file. */\n#cmakedefine HAVE_SYS_UTIME_H 1\n\n/* Define to 1 if you have the <io.h> header file. */\n#cmakedefine HAVE_IO_H 1\n\n/* Define to 1 if you have the <termios.h> header file. */\n#cmakedefine HAVE_TERMIOS_H 1\n\n/* Define to 1 if you have the <unistd.h> header file. */\n#cmakedefine HAVE_UNISTD_H 1\n\n/* Define to 1 if you have the <stdint.h> header file. */\n#cmakedefine HAVE_STDINT_H 1\n\n/* Define to 1 if you have the <openssl/aes.h> header file. */\n#cmakedefine HAVE_OPENSSL_AES_H 1\n\n/* Define to 1 if you have the <wspiapi.h> header file. */\n#cmakedefine HAVE_WSPIAPI_H 1\n\n/* Define to 1 if you have the <openssl/blowfish.h> header file. */\n#cmakedefine HAVE_OPENSSL_BLOWFISH_H 1\n\n/* Define to 1 if you have the <openssl/des.h> header file. */\n#cmakedefine HAVE_OPENSSL_DES_H 1\n\n/* Define to 1 if you have the <openssl/ecdh.h> header file. */\n#cmakedefine HAVE_OPENSSL_ECDH_H 1\n\n/* Define to 1 if you have the <openssl/ec.h> header file. */\n#cmakedefine HAVE_OPENSSL_EC_H 1\n\n/* Define to 1 if you have the <openssl/ecdsa.h> header file. */\n#cmakedefine HAVE_OPENSSL_ECDSA_H 1\n\n/* Define to 1 if you have the <pthread.h> header file. */\n#cmakedefine HAVE_PTHREAD_H 1\n\n/* Define to 1 if you have eliptic curve cryptography in openssl */\n#cmakedefine HAVE_OPENSSL_ECC 1\n\n/* Define to 1 if you have eliptic curve cryptography in gcrypt */\n#cmakedefine HAVE_GCRYPT_ECC 1\n\n/* Define to 1 if you have eliptic curve cryptography */\n#cmakedefine HAVE_ECC 1\n\n/* Define to 1 if you have DSA */\n#cmakedefine HAVE_DSA 1\n\n/* Define to 1 if you have gl_flags as a glob_t sturct member */\n#cmakedefine HAVE_GLOB_GL_FLAGS_MEMBER 1\n\n/* Define to 1 if you have OpenSSL with Ed25519 support */\n#cmakedefine HAVE_OPENSSL_ED25519 1\n\n/* Define to 1 if you have OpenSSL with X25519 support */\n#cmakedefine HAVE_OPENSSL_X25519 1\n\n/*************************** FUNCTIONS ***************************/\n\n/* Define to 1 if you have the `EVP_aes128_ctr' function. */\n#cmakedefine HAVE_OPENSSL_EVP_AES_CTR 1\n\n/* Define to 1 if you have the `EVP_aes128_cbc' function. */\n#cmakedefine HAVE_OPENSSL_EVP_AES_CBC 1\n\n/* Define to 1 if you have the `EVP_aes128_gcm' function. */\n#cmakedefine HAVE_OPENSSL_EVP_AES_GCM 1\n\n/* Define to 1 if you have the `CRYPTO_THREADID_set_callback' function. */\n#cmakedefine HAVE_OPENSSL_CRYPTO_THREADID_SET_CALLBACK 1\n\n/* Define to 1 if you have the `CRYPTO_ctr128_encrypt' function. */\n#cmakedefine HAVE_OPENSSL_CRYPTO_CTR128_ENCRYPT 1\n\n/* Define to 1 if you have the `EVP_CIPHER_CTX_new' function. */\n#cmakedefine HAVE_OPENSSL_EVP_CIPHER_CTX_NEW 1\n\n/* Define to 1 if you have the `EVP_KDF_CTX_new_id' function. */\n#cmakedefine HAVE_OPENSSL_EVP_KDF_CTX_NEW_ID 1\n\n/* Define to 1 if you have the `FIPS_mode' function. */\n#cmakedefine HAVE_OPENSSL_FIPS_MODE 1\n\n/* Define to 1 if you have the `EVP_DigestSign' function. */\n#cmakedefine HAVE_OPENSSL_EVP_DIGESTSIGN 1\n\n/* Define to 1 if you have the `EVP_DigestVerify' function. */\n#cmakedefine HAVE_OPENSSL_EVP_DIGESTVERIFY 1\n\n/* Define to 1 if you have the `OPENSSL_ia32cap_loc' function. */\n#cmakedefine HAVE_OPENSSL_IA32CAP_LOC 1\n\n/* Define to 1 if you have the `snprintf' function. */\n#cmakedefine HAVE_SNPRINTF 1\n\n/* Define to 1 if you have the `_snprintf' function. */\n#cmakedefine HAVE__SNPRINTF 1\n\n/* Define to 1 if you have the `_snprintf_s' function. */\n#cmakedefine HAVE__SNPRINTF_S 1\n\n/* Define to 1 if you have the `vsnprintf' function. */\n#cmakedefine HAVE_VSNPRINTF 1\n\n/* Define to 1 if you have the `_vsnprintf' function. */\n#cmakedefine HAVE__VSNPRINTF 1\n\n/* Define to 1 if you have the `_vsnprintf_s' function. */\n#cmakedefine HAVE__VSNPRINTF_S 1\n\n/* Define to 1 if you have the `isblank' function. */\n#cmakedefine HAVE_ISBLANK 1\n\n/* Define to 1 if you have the `strncpy' function. */\n#cmakedefine HAVE_STRNCPY 1\n\n/* Define to 1 if you have the `strndup' function. */\n#cmakedefine HAVE_STRNDUP 1\n\n/* Define to 1 if you have the `cfmakeraw' function. */\n#cmakedefine HAVE_CFMAKERAW 1\n\n/* Define to 1 if you have the `getaddrinfo' function. */\n#cmakedefine HAVE_GETADDRINFO 1\n\n/* Define to 1 if you have the `poll' function. */\n#cmakedefine HAVE_POLL 1\n\n/* Define to 1 if you have the `select' function. */\n#cmakedefine HAVE_SELECT 1\n\n/* Define to 1 if you have the `clock_gettime' function. */\n#cmakedefine HAVE_CLOCK_GETTIME 1\n\n/* Define to 1 if you have the `ntohll' function. */\n#cmakedefine HAVE_NTOHLL 1\n\n/* Define to 1 if you have the `htonll' function. */\n#cmakedefine HAVE_HTONLL 1\n\n/* Define to 1 if you have the `strtoull' function. */\n#cmakedefine HAVE_STRTOULL 1\n\n/* Define to 1 if you have the `__strtoull' function. */\n#cmakedefine HAVE___STRTOULL 1\n\n/* Define to 1 if you have the `_strtoui64' function. */\n#cmakedefine HAVE__STRTOUI64 1\n\n/* Define to 1 if you have the `glob' function. */\n#cmakedefine HAVE_GLOB 1\n\n/* Define to 1 if you have the `explicit_bzero' function. */\n#cmakedefine HAVE_EXPLICIT_BZERO 1\n\n/* Define to 1 if you have the `memset_s' function. */\n#cmakedefine HAVE_MEMSET_S 1\n\n/* Define to 1 if you have the `SecureZeroMemory' function. */\n#cmakedefine HAVE_SECURE_ZERO_MEMORY 1\n\n/* Define to 1 if you have the `cmocka_set_test_filter' function. */\n#cmakedefine HAVE_CMOCKA_SET_TEST_FILTER 1\n\n/*************************** LIBRARIES ***************************/\n\n/* Define to 1 if you have the `crypto' library (-lcrypto). */\n#cmakedefine HAVE_LIBCRYPTO 1\n\n/* Define to 1 if you have the `gcrypt' library (-lgcrypt). */\n#cmakedefine HAVE_LIBGCRYPT 1\n\n/* Define to 1 if you have the 'mbedTLS' library (-lmbedtls). */\n#cmakedefine HAVE_LIBMBEDCRYPTO 1\n\n/* Define to 1 if you have the `pthread' library (-lpthread). */\n#cmakedefine HAVE_PTHREAD 1\n\n/* Define to 1 if you have the `cmocka' library (-lcmocka). */\n#cmakedefine HAVE_CMOCKA 1\n\n/**************************** OPTIONS ****************************/\n\n#cmakedefine HAVE_GCC_THREAD_LOCAL_STORAGE 1\n#cmakedefine HAVE_MSC_THREAD_LOCAL_STORAGE 1\n\n#cmakedefine HAVE_FALLTHROUGH_ATTRIBUTE 1\n#cmakedefine HAVE_UNUSED_ATTRIBUTE 1\n\n#cmakedefine HAVE_CONSTRUCTOR_ATTRIBUTE 1\n#cmakedefine HAVE_DESTRUCTOR_ATTRIBUTE 1\n\n#cmakedefine HAVE_GCC_VOLATILE_MEMORY_PROTECTION 1\n\n#cmakedefine HAVE_COMPILER__FUNC__ 1\n#cmakedefine HAVE_COMPILER__FUNCTION__ 1\n\n#cmakedefine HAVE_GCC_BOUNDED_ATTRIBUTE 1\n\n/* Define to 1 if you want to enable GSSAPI */\n#cmakedefine WITH_GSSAPI 1\n\n/* Define to 1 if you want to enable ZLIB */\n#cmakedefine WITH_ZLIB 1\n\n/* Define to 1 if you want to enable SFTP */\n#cmakedefine WITH_SFTP 1\n\n/* Define to 1 if you want to enable server support */\n#cmakedefine WITH_SERVER 1\n\n/* Define to 1 if you want to enable DH group exchange algorithms */\n#cmakedefine WITH_GEX 1\n\n/* Define to 1 if you want to enable blowfish cipher support */\n#cmakedefine WITH_BLOWFISH_CIPHER 1\n\n/* Define to 1 if you want to enable debug output for crypto functions */\n#cmakedefine DEBUG_CRYPTO 1\n\n/* Define to 1 if you want to enable debug output for packet functions */\n#cmakedefine DEBUG_PACKET 1\n\n/* Define to 1 if you want to enable pcap output support (experimental) */\n#cmakedefine WITH_PCAP 1\n\n/* Define to 1 if you want to enable calltrace debug output */\n#cmakedefine DEBUG_CALLTRACE 1\n\n/* Define to 1 if you want to enable NaCl support */\n#cmakedefine WITH_NACL 1\n\n/*************************** ENDIAN *****************************/\n\n/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most\n   significant byte first (like Motorola and SPARC, unlike Intel). */\n#cmakedefine WORDS_BIGENDIAN 1\n"
  },
  {
    "path": "src/libssh/doc/CMakeLists.txt",
    "content": "#\n# Build the documentation\n#\nif (${CMAKE_VERSION} VERSION_GREATER \"3.8.99\")\n\nfind_package(Doxygen)\n\nif (DOXYGEN_FOUND)\n    set(DOXYGEN_PROJECT_NAME ${PROJECT_NAME})\n    set(DOXYGEN_PROJECT_NUMBER ${PROJECT_VERSION})\n    set(DOXYGEN_PROJECT_BRIEF \"The SSH library\")\n\n    set(DOXYGEN_TAB_SIZE 4)\n    set(DOXYGEN_OPTIMIZE_OUTPUT_FOR_C YES)\n    set(DOXYGEN_MARKDOWN_SUPPORT YES)\n    set(DOXYGEN_FULL_PATH_NAMES NO)\n\n    set(DOXYGEN_PREDEFINED DOXYGEN\n                           WITH_SERVER\n                           WITH_SFTP\n                           PRINTF_ATTRIBUTE(x,y))\n\n    set(DOXYGEN_EXCLUDE ${CMAKE_CURRENT_SOURCE_DIR}/that_style)\n    set(DOXYGEN_HTML_HEADER ${CMAKE_CURRENT_SOURCE_DIR}/that_style/header.html)\n    set(DOXYGEN_HTML_EXTRA_STYLESHEET ${CMAKE_CURRENT_SOURCE_DIR}/that_style/that_style.css)\n    set(DOXYGEN_HTML_EXTRA_FILES ${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/nav_edge_left.svg\n                                 ${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/nav_edge_right.svg\n                                 ${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/nav_edge_inter.svg\n                                 ${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/sync_off.png\n                                 ${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/sync_on.png\n                                 ${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/splitbar_handle.svg\n                                 ${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/doc.svg\n                                 ${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/mag_glass.svg\n                                 ${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/folderclosed.svg\n                                 ${CMAKE_CURRENT_SOURCE_DIR}/that_style/img/folderopen.svg\n                                 ${CMAKE_CURRENT_SOURCE_DIR}/that_style/js/striped_bg.js)\n\n    # This updates the Doxyfile if we do changes here\n    set(_doxyfile_template \"${CMAKE_BINARY_DIR}/CMakeDoxyfile.in\")\n    set(_target_doxyfile \"${CMAKE_CURRENT_BINARY_DIR}/Doxyfile.docs\")\n    configure_file(\"${_doxyfile_template}\" \"${_target_doxyfile}\")\n\n    doxygen_add_docs(docs\n                     ${CMAKE_SOURCE_DIR}/include/libssh\n                     ${CMAKE_SOURCE_DIR}/src\n                     ${CMAKE_CURRENT_SOURCE_DIR})\nendif() # DOXYGEN_FOUND\n\nendif() # CMAKE_VERSION\n"
  },
  {
    "path": "src/libssh/doc/authentication.dox",
    "content": "/**\n@page libssh_tutor_authentication Chapter 2: A deeper insight on authentication\n@section authentication_details A deeper insight on authentication\n\nIn our guided tour, we merely mentioned that the user needed to authenticate.\nWe didn't explain much in detail how that was supposed to happen.\nThis chapter explains better the four authentication methods: with public keys,\nwith a password, with challenges and responses (keyboard-interactive), and with\nno authentication at all.\n\nIf your software is supposed to connect to an arbitrary server, then you\nmight need to support all authentication methods. If your software will\nconnect only to a given server, then it might be enough for your software\nto support only the authentication methods used by that server. If you are\nthe administrator of the server, it might be your call to choose those\nauthentication methods.\n\nIt is not the purpose of this document to review in detail the advantages\nand drawbacks of each authentication method. You are therefore invited\nto read the abundant documentation on this topic to fully understand the\nadvantages and security risks linked to each method.\n\n\n@subsection pubkeys Authenticating with public keys\n\nlibssh is fully compatible with the openssh public and private keys. You\ncan either use the automatic public key authentication method provided by\nlibssh, or roll your own using the public key functions.\n\nThe process of authenticating by public key to a server is the following:\n - you scan a list of files that contain public keys. each key is sent to\n   the SSH server, until the server acknowledges a key (a key it knows can be\n   used to authenticate the user).\n - then, you retrieve the private key for this key and send a message\n   proving that you know that private key.\n\nThe function ssh_userauth_autopubkey() does this using the available keys in\n\"~/.ssh/\".  The return values are the following:\n - SSH_AUTH_ERROR: some serious error happened during authentication\n - SSH_AUTH_DENIED: no key matched\n - SSH_AUTH_SUCCESS: you are now authenticated\n - SSH_AUTH_PARTIAL: some key matched but you still have to provide an other\n                     mean of authentication (like a password).\n\nThe ssh_userauth_publickey_auto() function also tries to authenticate using the\nSSH agent, if you have one running, or the \"none\" method otherwise.\n\nIf you wish to authenticate with public key by your own, follow these steps:\n - Retrieve the public key with ssh_pki_import_pubkey_file().\n - Offer the public key to the SSH server using ssh_userauth_try_publickey().\n   If the return value is SSH_AUTH_SUCCESS, the SSH server accepts to\n   authenticate using the public key and you can go to the next step.\n - Retrieve the private key, using the ssh_pki_import_privkey_file() function.\n   If a passphrase is needed, either the passphrase specified as argument or\n   a callback will be used.\n - Authenticate using ssh_userauth_publickey() with your private key.\n - Do not forget cleaning up memory using ssh_key_free().\n\nHere is a minimalistic example of public key authentication:\n\n@code\nint authenticate_pubkey(ssh_session session)\n{\n  int rc;\n\n  rc = ssh_userauth_publickey_auto(session, NULL, NULL);\n\n  if (rc == SSH_AUTH_ERROR)\n  {\n     fprintf(stderr, \"Authentication failed: %s\\n\",\n       ssh_get_error(session));\n     return SSH_AUTH_ERROR;\n  }\n\n  return rc;\n}\n@endcode\n\n@see ssh_userauth_publickey_auto()\n@see ssh_userauth_try_publickey()\n@see ssh_userauth_publickey()\n@see ssh_pki_import_pubkey_file()\n@see ssh_pki_import_privkey_file()\n@see ssh_key_free()\n\n\n@subsection password Authenticating with a password\n\nThe function ssh_userauth_password() serves the purpose of authenticating\nusing a password. It will return SSH_AUTH_SUCCESS if the password worked,\nor one of other constants otherwise. It's your work to ask the password\nand to deallocate it in a secure manner.\n\nIf your server complains that the password is wrong, but you can still\nauthenticate using openssh's client (issuing password), it's probably\nbecause openssh only accept keyboard-interactive. Switch to\nkeyboard-interactive authentication, or try to configure plain text passwords\non the SSH server.\n\nHere is a small example of password authentication:\n\n@code\nint authenticate_password(ssh_session session)\n{\n  char *password;\n  int rc;\n\n  password = getpass(\"Enter your password: \");\n  rc = ssh_userauth_password(session, NULL, password);\n  if (rc == SSH_AUTH_ERROR)\n  {\n     fprintf(stderr, \"Authentication failed: %s\\n\",\n       ssh_get_error(session));\n     return SSH_AUTH_ERROR;\n  }\n\n  return rc;\n}\n@endcode\n\n@see ssh_userauth_password\n\n\n@subsection keyb_int The keyboard-interactive authentication method\n\nThe keyboard-interactive method is, as its name tells, interactive. The\nserver will issue one or more challenges that the user has to answer,\nuntil the server takes an authentication decision.\n\nssh_userauth_kbdint() is the the main keyboard-interactive function.\nIt will return SSH_AUTH_SUCCESS,SSH_AUTH_DENIED, SSH_AUTH_PARTIAL,\nSSH_AUTH_ERROR, or SSH_AUTH_INFO, depending on the result of the request.\n\nThe keyboard-interactive authentication method of SSH2 is a feature that\npermits the server to ask a certain number of questions in an interactive\nmanner to the client, until it decides to accept or deny the login.\n\nTo begin, you call ssh_userauth_kbdint() (just set user and submethods to\nNULL) and store the answer.\n\nIf the answer is SSH_AUTH_INFO, it means that the server has sent a few\nquestions that you should ask the user. You can retrieve these questions\nwith the following functions: ssh_userauth_kbdint_getnprompts(),\nssh_userauth_kbdint_getname(), ssh_userauth_kbdint_getinstruction(), and\nssh_userauth_kbdint_getprompt().\n\nSet the answer for each question in the challenge using\nssh_userauth_kbdint_setanswer().\n\nThen, call again ssh_userauth_kbdint() and start the process again until\nthese functions returns something else than SSH_AUTH_INFO.\n\nHere are a few remarks:\n - Even the first call can return SSH_AUTH_DENIED or SSH_AUTH_SUCCESS.\n - The server can send an empty question set (this is the default behavior\n   on my system) after you have sent the answers to the first questions.\n   You must still parse the answer, it might contain some\n   message from the server saying hello or such things. Just call\n   ssh_userauth_kbdint() until needed.\n - The meaning of \"name\", \"prompt\", \"instruction\" may be a little\n   confusing. An explanation is given in the RFC section that follows.\n\nHere is a little note about how to use the information from\nkeyboard-interactive authentication, coming from the RFC itself (rfc4256):\n\n@verbatim\n\n  3.3 User Interface Upon receiving a request message, the client SHOULD\n  prompt the user as follows: A command line interface (CLI) client SHOULD\n  print the name and instruction (if non-empty), adding newlines. Then for\n  each prompt in turn, the client SHOULD display the prompt and read the\n  user input.\n\n  A graphical user interface (GUI) client has many choices on how to prompt\n  the user. One possibility is to use the name field (possibly prefixed\n  with the application's name) as the title of a dialog window in which\n  the prompt(s) are presented. In that dialog window, the instruction field\n  would be a text message, and the prompts would be labels for text entry\n  fields. All fields SHOULD be presented to the user, for example an\n  implementation SHOULD NOT discard the name field because its windows lack\n  titles; it SHOULD instead find another way to display this information. If\n  prompts are presented in a dialog window, then the client SHOULD NOT\n  present each prompt in a separate window.\n\n  All clients MUST properly handle an instruction field with embedded\n  newlines. They SHOULD also be able to display at least 30 characters for\n  the name and prompts. If the server presents names or prompts longer than 30\n  characters, the client MAY truncate these fields to the length it can\n  display. If the client does truncate any fields, there MUST be an obvious\n  indication that such truncation has occurred.\n\n  The instruction field SHOULD NOT be truncated. Clients SHOULD use control\n  character filtering as discussed in [SSH-ARCH] to avoid attacks by\n  including terminal control characters in the fields to be displayed.\n\n  For each prompt, the corresponding echo field indicates whether or not\n  the user input should be echoed as characters are typed. Clients SHOULD\n  correctly echo/mask user input for each prompt independently of other\n  prompts in the request message. If a client does not honor the echo field\n  for whatever reason, then the client MUST err on the side of\n  masking input. A GUI client might like to have a checkbox toggling\n  echo/mask. Clients SHOULD NOT add any additional characters to the prompt\n  such as \": \" (colon-space); the server is responsible for supplying all\n  text to be displayed to the user. Clients MUST also accept empty responses\n  from the user and pass them on as empty strings.\n@endverbatim\n\nThe following example shows how to perform keyboard-interactive authentication:\n\n@code\nint authenticate_kbdint(ssh_session session)\n{\n  int rc;\n\n  rc = ssh_userauth_kbdint(session, NULL, NULL);\n  while (rc == SSH_AUTH_INFO)\n  {\n    const char *name, *instruction;\n    int nprompts, iprompt;\n\n    name = ssh_userauth_kbdint_getname(session);\n    instruction = ssh_userauth_kbdint_getinstruction(session);\n    nprompts = ssh_userauth_kbdint_getnprompts(session);\n\n    if (strlen(name) > 0)\n      printf(\"%s\\n\", name);\n    if (strlen(instruction) > 0)\n      printf(\"%s\\n\", instruction);\n    for (iprompt = 0; iprompt < nprompts; iprompt++)\n    {\n      const char *prompt;\n      char echo;\n\n      prompt = ssh_userauth_kbdint_getprompt(session, iprompt, &echo);\n      if (echo)\n      {\n        char buffer[128], *ptr;\n\n        printf(\"%s\", prompt);\n        if (fgets(buffer, sizeof(buffer), stdin) == NULL)\n          return SSH_AUTH_ERROR;\n        buffer[sizeof(buffer) - 1] = '\\0';\n        if ((ptr = strchr(buffer, '\\n')) != NULL)\n          *ptr = '\\0';\n        if (ssh_userauth_kbdint_setanswer(session, iprompt, buffer) < 0)\n          return SSH_AUTH_ERROR;\n        memset(buffer, 0, strlen(buffer));\n      }\n      else\n      {\n        char *ptr;\n\n        ptr = getpass(prompt);\n        if (ssh_userauth_kbdint_setanswer(session, iprompt, ptr) < 0)\n          return SSH_AUTH_ERROR;\n      }\n    }\n    rc = ssh_userauth_kbdint(session, NULL, NULL);\n  }\n  return rc;\n}\n@endcode\n\n@see ssh_userauth_kbdint()\n@see ssh_userauth_kbdint_getnprompts()\n@see ssh_userauth_kbdint_getname()\n@see ssh_userauth_kbdint_getinstruction()\n@see ssh_userauth_kbdint_getprompt()\n@see ssh_userauth_kbdint_setanswer()\n\n\n@subsection none Authenticating with \"none\" method\n\nThe primary purpose of the \"none\" method is to get authenticated **without**\nany credential. Don't do that, use one of the other authentication methods,\nunless you really want to grant anonymous access.\n\nIf the account has no password, and if the server is configured to let you\npass, ssh_userauth_none() might answer SSH_AUTH_SUCCESS.\n\nThe following example shows how to perform \"none\" authentication:\n\n@code\nint authenticate_none(ssh_session session)\n{\n  int rc;\n\n  rc = ssh_userauth_none(session, NULL);\n  return rc;\n}\n@endcode\n\n@subsection auth_list Getting the list of supported authentications\n\nYou are not meant to choose a given authentication method, you can\nlet the server tell you which methods are available. Once you know them,\nyou try them one after the other.\n\nThe following example shows how to get the list of available authentication\nmethods with ssh_userauth_list() and how to use the result:\n\n@code\nint test_several_auth_methods(ssh_session session)\n{\n  int method, rc;\n\n  rc = ssh_userauth_none(session, NULL);\n  if (rc == SSH_AUTH_SUCCESS || rc == SSH_AUTH_ERROR) {\n      return rc;\n  }\n\n  method = ssh_userauth_list(session, NULL);\n\n  if (method & SSH_AUTH_METHOD_NONE)\n  { // For the source code of function authenticate_none(),\n    // refer to the corresponding example\n    rc = authenticate_none(session);\n    if (rc == SSH_AUTH_SUCCESS) return rc;\n  }\n  if (method & SSH_AUTH_METHOD_PUBLICKEY)\n  { // For the source code of function authenticate_pubkey(),\n    // refer to the corresponding example\n    rc = authenticate_pubkey(session);\n    if (rc == SSH_AUTH_SUCCESS) return rc;\n  }\n  if (method & SSH_AUTH_METHOD_INTERACTIVE)\n  { // For the source code of function authenticate_kbdint(),\n    // refer to the corresponding example\n    rc = authenticate_kbdint(session);\n    if (rc == SSH_AUTH_SUCCESS) return rc;\n  }\n  if (method & SSH_AUTH_METHOD_PASSWORD)\n  { // For the source code of function authenticate_password(),\n    // refer to the corresponding example\n    rc = authenticate_password(session);\n    if (rc == SSH_AUTH_SUCCESS) return rc;\n  }\n  return SSH_AUTH_ERROR;\n}\n@endcode\n\n\n@subsection banner Getting the banner\n\nThe SSH server might send a banner, which you can retrieve with\nssh_get_issue_banner(), then display to the user.\n\nThe following example shows how to retrieve and dispose the issue banner:\n\n@code\nint display_banner(ssh_session session)\n{\n  int rc;\n  char *banner;\n\n/*\n *** Does not work without calling ssh_userauth_none() first ***\n *** That will be fixed ***\n*/\n  rc = ssh_userauth_none(session, NULL);\n  if (rc == SSH_AUTH_ERROR)\n    return rc;\n\n  banner = ssh_get_issue_banner(session);\n  if (banner)\n  {\n    printf(\"%s\\n\", banner);\n    free(banner);\n  }\n\n  return rc;\n}\n@endcode\n\n*/\n"
  },
  {
    "path": "src/libssh/doc/command.dox",
    "content": "/**\n@page libssh_tutor_command Chapter 4: Passing a remote command\n@section remote_command Passing a remote command\n\nPrevious chapter has shown how to open a full shell session, with an attached\nterminal or not. If you only need to execute a command on the remote end,\nyou don't need all that complexity.\n\nThe method described here is suited for executing only one remote command.\nIf you need to issue several commands in a row, you should consider using\na non-interactive remote shell, as explained in previous chapter.\n\n@see shell\n\n\n@subsection exec_remote Executing a remote command\n\nThe first steps for executing a remote command are identical to those\nfor opening remote shells. You first need a SSH channel, and then\na SSH session that uses this channel:\n\n@code\nint show_remote_files(ssh_session session)\n{\n  ssh_channel channel;\n  int rc;\n\n  channel = ssh_channel_new(session);\n  if (channel == NULL) return SSH_ERROR;\n\n  rc = ssh_channel_open_session(channel);\n  if (rc != SSH_OK)\n  {\n    ssh_channel_free(channel);\n    return rc;\n  }\n@endcode\n\nOnce a session is open, you can start the remote command with\nssh_channel_request_exec():\n\n@code\n  rc = ssh_channel_request_exec(channel, \"ls -l\");\n  if (rc != SSH_OK)\n  {\n    ssh_channel_close(channel);\n    ssh_channel_free(channel);\n    return rc;\n  }\n@endcode\n\nIf the remote command displays data, you get them with ssh_channel_read().\nThis function returns the number of bytes read. If there is no more\ndata to read on the channel, this function returns 0, and you can go to next step.\nIf an error has been encountered, it returns a negative value:\n\n@code\n  char buffer[256];\n  int nbytes;\n\n  nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);\n  while (nbytes > 0)\n  {\n    if (fwrite(buffer, 1, nbytes, stdout) != nbytes)\n    {\n      ssh_channel_close(channel);\n      ssh_channel_free(channel);\n      return SSH_ERROR;\n    }\n    nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);\n  }\n\n  if (nbytes < 0)\n  {\n    ssh_channel_close(channel);\n    ssh_channel_free(channel);\n    return SSH_ERROR;\n  }\n@endcode\n\nOnce you read the result of the remote command, you send an\nend-of-file to the channel, close it, and free the memory\nthat it used:\n\n@code\n  ssh_channel_send_eof(channel);\n  ssh_channel_close(channel);\n  ssh_channel_free(channel);\n\n  return SSH_OK;\n}\n@endcode\n\n*/\n"
  },
  {
    "path": "src/libssh/doc/curve25519-sha256@libssh.org.txt",
    "content": "curve25519-sha256@libssh.org.txt        Aris Adamantiadis <aris@badcode.be>\n                                                                  21/9/2013\n\n1. Introduction\n\nThis document describes the key exchange methode curve25519-sha256@libssh.org\nfor SSH version 2 protocol. It is provided as an alternative to the existing\nkey exchange mechanisms based on either Diffie-Hellman or Elliptic Curve Diffie-\nHellman [RFC5656].\nThe reason is the following : During summer of 2013, revelations from ex-\nconsultant at NSA Edward Snowden gave proof that NSA willingly inserts backdoors\ninto softwares, hardware components and published standards. While it is still\nbelieved that the mathematics behind ECC cryptography are still sound and solid,\nsome people (including Bruce Schneier [SCHNEIER]), showed their lack of confidence\nin NIST-published curves such as nistp256, nistp384, nistp521, for which constant\nparameters (including the generator point) are defined without explanation. It\nis also believed that NSA had a word to say in their definition. These curves\nare not the most secure or fastest possible for their key sizes [DJB], and\nresearchers think it is possible that NSA have ways of cracking NIST curves.\nIt is also interesting to note that SSH belongs to the list of protocols the NSA\nclaims to be able to eavesdrop. Having a secure replacement would make passive\nattacks much harder if such a backdoor exists.\n\nHowever an alternative exists in the form of Curve25519. This algorithm has been\nproposed in 2006 by DJB [Curve25519]. Its main strengths are its speed, its\nconstant-time run time (and resistance against side-channel attacks), and its\nlack of nebulous hard-coded constants.\n\nThe reference version being used in this document is the one described in\n[Curve25519] as implemented in the library NaCl [NaCl].\nThis document does not attempt to provide alternatives to the ecdsa-sha1-*\nauthentication keys.\n\n2. Key exchange\n\nThe key exchange procedure is very similar to the one described chapter 4 of\n[RFC5656]. Public ephemeral keys are transmitted over SSH encapsulated into\nstandard SSH strings.\n\nThe following is an overview of the key exchange process:\n\nClient                                                            Server\n------                                                            ------\nGenerate ephemeral key pair.\nSSH_MSG_KEX_ECDH_INIT          -------->                      \n                                            Verify that client public key \n                                            length is 32 bytes.\n                                             Generate ephemeral key pair.\n                                                   Compute shared secret.\n                                         Generate and sign exchange hash.\n                               <--------           SSH_MSG_KEX_ECDH_REPLY\nVerify that server public key length is 32 bytes.\n* Verify host keys belong to server.\nCompute shared secret.\nGenerate exchange hash.\nVerify server's signature.\n\n*   Optional but strongly recommanded as this protects against MITM attacks.\n\nThis is implemented using the same messages as described in RFC5656 chapter 4\n\n3. Method Name\n\nThe name of this key exchange method is \"curve25519-sha256@libssh.org\".\n\n4. Implementation considerations\n\nThe whole method is based on the curve25519 scalar multiplication. In this\nmethod, a private key is a scalar of 256 bits, and a public key is a point\nof 256 bits.\n\n4.1. Private key generation\n\nA 32 bytes private key should be generated for each new connection,\n using a secure PRNG. The following actions must be done on the private key:\n     mysecret[0] &= 248;\n     mysecret[31] &= 127;\n     mysecret[31] |= 64;\nIn order to keep the key valid. However, many cryptographic libraries will do\nthis automatically.\nIt should be noted that, in opposition to NIST curves, no special validation\nshould be done to ensure the result is a valid and secure private key.\n\n4.2 Public key generation\n\nThe 32 bytes public key of either a client or a server must be generated using\nthe 32 bytes private key and a common generator base. This base is defined as 9\nfollowed by all zeroes:\n     const unsigned char basepoint[32] = {9};\n\nThe public key is calculated using the cryptographic scalar multiplication:\n     const unsigned char privkey[32];\n     unsigned char pubkey[32];\n     crypto_scalarmult (pubkey, privkey, basepoint);\nHowever some cryptographic libraries may provide a combined function:\n     crypto_scalarmult_base (pubkey, privkey);\n\nIt should be noted that, in opposition to NIST curves, no special validation\nshould be done to ensure the received public keys are valid curves point. The\nCurve25519 algorithm ensure that every possible public key maps to a valid\nECC Point.\n\n4.3 Shared secret generation\n\nThe shared secret, k, is defined in SSH specifications to be a big integer.\nThis number is calculated using the following procedure:\n\n     X is the 32 bytes point obtained by the scalar multiplication of the other\n     side's public key and the local private key scalar.\n\n     The whole 32 bytes of the number X are then converted into a big integer k.\n     This conversion follows the network byte order. This step differs from \n     RFC5656.\n\n[RFC5656]    https://tools.ietf.org/html/rfc5656\n[SCHNEIER]   https://www.schneier.com/blog/archives/2013/09/the_nsa_is_brea.html#c1675929\n[DJB]        https://cr.yp.to/talks/2013.05.31/slides-dan+tanja-20130531-4x3.pdf\n[Curve25519] \"Curve25519: new Diffie-Hellman speed records.\"\n             https://cr.yp.to/ecdh/curve25519-20060209.pdf\n"
  },
  {
    "path": "src/libssh/doc/forwarding.dox",
    "content": "/**\n@page libssh_tutor_forwarding Chapter 7: Forwarding connections (tunnel)\n@section forwarding_connections Forwarding connections\n\nPort forwarding comes in SSH protocol in two different flavours:\ndirect or reverse port forwarding. Direct port forwarding is also\nnamed local port forwarding, and reverse port forwarding is also called\nremote port forwarding. SSH also allows X11 tunnels.\n\n\n\n@subsection forwarding_direct Direct port forwarding\n\nDirect port forwarding is from client to server. The client opens a tunnel,\nand forwards whatever data to the server. Then, the server connects to an\nend point. The end point can reside on another machine or on the SSH\nserver itself.\n\nExample of use of direct port forwarding:\n@verbatim\nMail client application   Google Mail\n         |                    ^\n     5555 (arbitrary)         |\n         |                143 (IMAP2)\n         V                    |\n    SSH client   =====>   SSH server\n\nLegend:\n--P-->: port connections through port P\n=====>: SSH tunnel\n@endverbatim\nA mail client connects to port 5555 of a client. An encrypted tunnel is\nestablished to the server. The server connects to port 143 of Google Mail (the\nend point). Now the local mail client can retrieve mail.\n\n\n@subsection forwarding_reverse Reverse port forwarding\n\nThe reverse forwarding is slightly different. It goes from server to client,\neven though the client has the initiative of establishing the tunnel.\nOnce the tunnel is established, the server will listen on a port. Whenever\na connection to this port is made, the server forwards the data to the client.\n\nExample of use of reverse port forwarding:\n@verbatim\n Local mail server    Mail client application\n         ^                     |\n         |               5555 (arbitrary)\n     143 (IMAP2)               |\n         |                     V\n    SSH client   <=====   SSH server\n\nLegend:\n--P-->: port connections through port P\n=====>: SSH tunnel\n@endverbatim\nIn this example, the SSH client establishes the tunnel,\nbut it is used to forward the connections established at\nthe server to the client.\n\n\n@subsection forwarding_x11 X11 tunnels\n\nX11 tunnels allow a remote application to display locally.\n\nExample of use of X11 tunnels:\n@verbatim\n   Local display     Graphical application\n   (X11 server)          (X11 client)\n         ^                     |\n         |                     V\n    SSH client   <=====   SSH server\n\nLegend:\n----->: X11 connection through X11 display number\n=====>: SSH tunnel\n@endverbatim\nThe SSH tunnel is established by the client.\n\nHow to establish X11 tunnels with libssh has already been described in\nthis tutorial.\n\n@see x11\n\n\n@subsection libssh_direct Doing direct port forwarding with libssh\n\nTo do direct port forwarding, call function ssh_channel_open_forward():\n  - you need a separate channel for the tunnel as first parameter;\n  - second and third parameters are the remote endpoint;\n  - fourth and fifth parameters are sent to the remote server\n    so that they can be logged on that server.\n\nIf you don't plan to forward the data you will receive to any local port,\njust put fake values like \"localhost\" and 5555 as your local host and port.\n\nThe example below shows how to open a direct channel that would be\nused to retrieve google's home page from the remote SSH server.\n\n@code\nint direct_forwarding(ssh_session session)\n{\n  ssh_channel forwarding_channel;\n  int rc;\n  char *http_get = \"GET / HTTP/1.1\\nHost: www.google.com\\n\\n\";\n  int nbytes, nwritten;\n\n  forwarding_channel = ssh_channel_new(session);\n  if (forwarding_channel == NULL) {\n      return rc;\n  }\n\n  rc = ssh_channel_open_forward(forwarding_channel,\n                                \"www.google.com\", 80,\n                                \"localhost\", 5555);\n  if (rc != SSH_OK)\n  {\n    ssh_channel_free(forwarding_channel);\n    return rc;\n  }\n\n  nbytes = strlen(http_get);\n  nwritten = ssh_channel_write(forwarding_channel,\n                           http_get,\n                           nbytes);\n  if (nbytes != nwritten)\n  {\n    ssh_channel_free(forwarding_channel);\n    return SSH_ERROR;\n  }\n\n  ...\n\n  ssh_channel_free(forwarding_channel);\n  return SSH_OK;\n}\n@endcode\n\nThe data sent by Google can be retrieved for example with ssh_select()\nand ssh_channel_read(). Goggle's home page can then be displayed on the\nlocal SSH client, saved into a local file, made available on a local port,\nor whatever use you have for it.\n\n\n@subsection libssh_reverse Doing reverse port forwarding with libssh\n\nTo do reverse port forwarding, call ssh_channel_listen_forward(),\nthen ssh_channel_accept_forward().\n\nWhen you call ssh_channel_listen_forward(), you can let the remote server\nchose the non-privileged port it should listen to. Otherwise, you can chose\nyour own privileged or non-privileged port. Beware that you should have\nadministrative privileges on the remote server to open a privileged port\n(port number < 1024).\n\nBelow is an example of a very rough web server waiting for connections on port\n8080 of remote SSH server. The incoming connections are passed to the\nlocal libssh application, which handles them:\n\n@code\nint web_server(ssh_session session)\n{\n  int rc;\n  ssh_channel channel;\n  char buffer[256];\n  int nbytes, nwritten;\n  int port = 0;\n  char *helloworld = \"\"\n\"HTTP/1.1 200 OK\\n\"\n\"Content-Type: text/html\\n\"\n\"Content-Length: 113\\n\"\n\"\\n\"\n\"<html>\\n\"\n\"  <head>\\n\"\n\"    <title>Hello, World!</title>\\n\"\n\"  </head>\\n\"\n\"  <body>\\n\"\n\"    <h1>Hello, World!</h1>\\n\"\n\"  </body>\\n\"\n\"</html>\\n\";\n\n  rc = ssh_channel_listen_forward(session, NULL, 8080, NULL);\n  if (rc != SSH_OK)\n  {\n    fprintf(stderr, \"Error opening remote port: %s\\n\",\n            ssh_get_error(session));\n    return rc;\n  }\n\n  channel = ssh_channel_accept_forward(session, 60000, &port);\n  if (channel == NULL)\n  {\n    fprintf(stderr, \"Error waiting for incoming connection: %s\\n\",\n            ssh_get_error(session));\n    return SSH_ERROR;\n  }\n\n  while (1)\n  {\n    nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);\n    if (nbytes < 0)\n    {\n      fprintf(stderr, \"Error reading incoming data: %s\\n\",\n              ssh_get_error(session));\n      ssh_channel_send_eof(channel);\n      ssh_channel_free(channel);\n      return SSH_ERROR;\n    }\n    if (strncmp(buffer, \"GET /\", 5)) continue;\n\n    nbytes = strlen(helloworld);\n    nwritten = ssh_channel_write(channel, helloworld, nbytes);\n    if (nwritten != nbytes)\n    {\n      fprintf(stderr, \"Error sending answer: %s\\n\",\n              ssh_get_error(session));\n      ssh_channel_send_eof(channel);\n      ssh_channel_free(channel);\n      return SSH_ERROR;\n    }\n    printf(\"Sent answer\\n\");\n  }\n\n  ssh_channel_send_eof(channel);\n  ssh_channel_free(channel);\n  return SSH_OK;\n}\n@endcode\n\n*/\n"
  },
  {
    "path": "src/libssh/doc/guided_tour.dox",
    "content": "/**\n@page libssh_tutor_guided_tour Chapter 1: A typical SSH session\n@section ssh_session A typical SSH session\n\nA SSH session goes through the following steps:\n\n - Before connecting to the server, you can set up if you wish one or other\n   server public key authentication, i.e. DSA or RSA. You can choose\n   cryptographic algorithms you trust and compression algorithms if any. You\n   must of course set up the hostname.\n\n - The connection is established. A secure handshake is made, and resulting from\n   it, a public key from the server is gained. You MUST verify that the public\n   key is legitimate, using for instance the MD5 fingerprint or the known hosts\n   file.\n\n - The client must authenticate: the classical ways are password, or\n   public keys (from dsa and rsa key-pairs generated by openssh).\n   If a SSH agent is running, it is possible to use it.\n\n - Now that the user has been authenticated, you must open one or several\n   channels. Channels are different subways for information into a single ssh\n   connection. Each channel has a standard stream (stdout) and an error stream\n   (stderr). You can theoretically open an infinity of channels.\n\n - With the channel you opened, you can do several things:\n   - Execute a single command.\n   - Open a shell. You may want to request a pseudo-terminal before.\n   - Invoke the sftp subsystem to transfer files.\n   - Invoke the scp subsystem to transfer files.\n   - Invoke your own subsystem. This is outside the scope of this document,\n     but can be done.\n\n - When everything is finished, just close the channels, and then the connection.\n\nThe sftp and scp subsystems use channels, but libssh hides them to\nthe programmer. If you want to use those subsystems, instead of a channel,\nyou'll usually open a \"sftp session\" or a \"scp session\".\n\n\n@subsection setup Creating the session and setting options\n\nThe most important object in a SSH connection is the SSH session. In order\nto allocate a new SSH session, you use ssh_new(). Don't forget to\nalways verify that the allocation succeeded.\n@code\n#include <libssh/libssh.h>\n#include <stdlib.h>\n\nint main()\n{\n  ssh_session my_ssh_session = ssh_new();\n  if (my_ssh_session == NULL)\n    exit(-1);\n  ...\n  ssh_free(my_ssh_session);\n}\n@endcode\n\nlibssh follows the allocate-it-deallocate-it pattern. Each object that you allocate\nusing xxxxx_new() must be deallocated using xxxxx_free(). In this case, ssh_new()\ndoes the allocation and ssh_free() does the contrary.\n\nThe ssh_options_set() function sets the options of the session. The most important options are:\n - SSH_OPTIONS_HOST: the name of the host you want to connect to\n - SSH_OPTIONS_PORT: the used port (default is port 22)\n - SSH_OPTIONS_USER: the system user under which you want to connect\n - SSH_OPTIONS_LOG_VERBOSITY: the quantity of messages that are printed\n\nThe complete list of options can be found in the documentation of ssh_options_set().\nThe only mandatory option is SSH_OPTIONS_HOST. If you don't use SSH_OPTIONS_USER,\nthe local username of your account will be used.\n\nHere is a small example of how to use it:\n\n@code\n#include <libssh/libssh.h>\n#include <stdlib.h>\n\nint main()\n{\n  ssh_session my_ssh_session;\n  int verbosity = SSH_LOG_PROTOCOL;\n  int port = 22;\n\n  my_ssh_session = ssh_new();\n  if (my_ssh_session == NULL)\n    exit(-1);\n\n  ssh_options_set(my_ssh_session, SSH_OPTIONS_HOST, \"localhost\");\n  ssh_options_set(my_ssh_session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity);\n  ssh_options_set(my_ssh_session, SSH_OPTIONS_PORT, &port);\n\n  ...\n\n  ssh_free(my_ssh_session);\n}\n@endcode\n\nPlease notice that all parameters are passed to ssh_options_set() as pointers,\neven if you need to set an integer value.\n\n@see ssh_new\n@see ssh_free\n@see ssh_options_set\n@see ssh_options_parse_config\n@see ssh_options_copy\n@see ssh_options_getopt\n\n\n@subsection connect Connecting to the server\n\nOnce all settings have been made, you can connect using ssh_connect(). That\nfunction will return SSH_OK if the connection worked, SSH_ERROR otherwise.\n\nYou can get the English error string with ssh_get_error() in order to show the\nuser what went wrong. Then, use ssh_disconnect() when you want to stop\nthe session.\n\nHere's an example:\n\n@code\n#include <libssh/libssh.h>\n#include <stdlib.h>\n#include <stdio.h>\n\nint main()\n{\n  ssh_session my_ssh_session;\n  int rc;\n\n  my_ssh_session = ssh_new();\n  if (my_ssh_session == NULL)\n    exit(-1);\n\n  ssh_options_set(my_ssh_session, SSH_OPTIONS_HOST, \"localhost\");\n\n  rc = ssh_connect(my_ssh_session);\n  if (rc != SSH_OK)\n  {\n    fprintf(stderr, \"Error connecting to localhost: %s\\n\",\n            ssh_get_error(my_ssh_session));\n    exit(-1);\n  }\n\n  ...\n\n  ssh_disconnect(my_ssh_session);\n  ssh_free(my_ssh_session);\n}\n@endcode\n\n\n@subsection serverauth Authenticating the server\n\nOnce you're connected, the following step is mandatory: you must check that the server\nyou just connected to is known and safe to use (remember, SSH is about security and\nauthentication).\n\nThere are two ways of doing this:\n - The first way (recommended) is to use the ssh_session_is_known_server()\n   function. This function will look into the known host file\n   (~/.ssh/known_hosts on UNIX), look for the server hostname's pattern,\n   and determine whether this host is present or not in the list.\n - The second way is to use ssh_get_pubkey_hash() to get a binary version\n   of the public key hash value. You can then use your own database to check\n   if this public key is known and secure.\n\nYou can also use the ssh_get_pubkey_hash() to show the public key hash\nvalue to the user, in case he knows what the public key hash value is\n(some paranoid people write their public key hash values on paper before\ngoing abroad, just in case ...).\n\nIf the remote host is being used to for the first time, you can ask the user whether\nhe/she trusts it. Once he/she concluded that the host is valid and worth being\nadded in the known hosts file, you use ssh_write_knownhost() to register it in\nthe known hosts file, or any other way if you use your own database.\n\nThe following example is part of the examples suite available in the\nexamples/ directory:\n\n@code\n#include <errno.h>\n#include <string.h>\n\nint verify_knownhost(ssh_session session)\n{\n    enum ssh_known_hosts_e state;\n    unsigned char *hash = NULL;\n    ssh_key srv_pubkey = NULL;\n    size_t hlen;\n    char buf[10];\n    char *hexa;\n    char *p;\n    int cmp;\n    int rc;\n\n    rc = ssh_get_server_publickey(session, &srv_pubkey);\n    if (rc < 0) {\n        return -1;\n    }\n\n    rc = ssh_get_publickey_hash(srv_pubkey,\n                                SSH_PUBLICKEY_HASH_SHA1,\n                                &hash,\n                                &hlen);\n    ssh_key_free(srv_pubkey);\n    if (rc < 0) {\n        return -1;\n    }\n\n    state = ssh_session_is_known_server(session);\n    switch (state) {\n        case SSH_KNOWN_HOSTS_OK:\n            /* OK */\n\n            break;\n        case SSH_KNOWN_HOSTS_CHANGED:\n            fprintf(stderr, \"Host key for server changed: it is now:\\n\");\n            ssh_print_hexa(\"Public key hash\", hash, hlen);\n            fprintf(stderr, \"For security reasons, connection will be stopped\\n\");\n            ssh_clean_pubkey_hash(&hash);\n\n            return -1;\n        case SSH_KNOWN_HOSTS_OTHER:\n            fprintf(stderr, \"The host key for this server was not found but an other\"\n                    \"type of key exists.\\n\");\n            fprintf(stderr, \"An attacker might change the default server key to\"\n                    \"confuse your client into thinking the key does not exist\\n\");\n            ssh_clean_pubkey_hash(&hash);\n\n            return -1;\n        case SSH_KNOWN_HOSTS_NOT_FOUND:\n            fprintf(stderr, \"Could not find known host file.\\n\");\n            fprintf(stderr, \"If you accept the host key here, the file will be\"\n                    \"automatically created.\\n\");\n\n            /* FALL THROUGH to SSH_SERVER_NOT_KNOWN behavior */\n\n        case SSH_KNOWN_HOSTS_UNKNOWN:\n            hexa = ssh_get_hexa(hash, hlen);\n            fprintf(stderr,\"The server is unknown. Do you trust the host key?\\n\");\n            fprintf(stderr, \"Public key hash: %s\\n\", hexa);\n            ssh_string_free_char(hexa);\n            ssh_clean_pubkey_hash(&hash);\n            p = fgets(buf, sizeof(buf), stdin);\n            if (p == NULL) {\n                return -1;\n            }\n\n            cmp = strncasecmp(buf, \"yes\", 3);\n            if (cmp != 0) {\n                return -1;\n            }\n\n            rc = ssh_session_update_known_hosts(session);\n            if (rc < 0) {\n                fprintf(stderr, \"Error %s\\n\", strerror(errno));\n                return -1;\n            }\n\n            break;\n        case SSH_KNOWN_HOSTS_ERROR:\n            fprintf(stderr, \"Error %s\", ssh_get_error(session));\n            ssh_clean_pubkey_hash(&hash);\n            return -1;\n    }\n\n    ssh_clean_pubkey_hash(&hash);\n    return 0;\n}\n@endcode\n\n@see ssh_connect\n@see ssh_disconnect\n@see ssh_get_error\n@see ssh_get_error_code\n@see ssh_get_server_publickey\n@see ssh_get_publickey_hash\n@see ssh_session_is_known_server\n@see ssh_session_update_known_hosts\n\n\n@subsection auth Authenticating the user\n\nThe authentication process is the way a service provider can identify a\nuser and verify his/her identity. The authorization process is about enabling\nthe authenticated user the access to resources. In SSH, the two concepts\nare linked. After authentication, the server can grant the user access to\nseveral resources such as port forwarding, shell, sftp subsystem, and so on.\n\nlibssh supports several methods of authentication:\n - \"none\" method. This method allows to get the available authentications\n   methods. It also gives the server a chance to authenticate the user with\n   just his/her login. Some very old hardware uses this feature to fallback\n   the user on a \"telnet over SSH\" style of login.\n - password method. A password is sent to the server, which accepts it or not.\n - keyboard-interactive method. The server sends several challenges to the\n   user, who must answer correctly. This makes possible the authentication\n   via a codebook for instance (\"give code at 23:R on page 3\").\n - public key method. The host knows the public key of the user, and the\n   user must prove he knows the associated private key. This can be done\n   manually, or delegated to the SSH agent as we'll see later.\n\nAll these methods can be combined. You can for instance force the user to\nauthenticate with at least two of the authentication methods. In that case,\none speaks of \"Partial authentication\". A partial authentication is a\nresponse from authentication functions stating that your credential was\naccepted, but yet another one is required to get in.\n\nThe example below shows an authentication with password:\n\n@code\n#include <libssh/libssh.h>\n#include <stdlib.h>\n#include <stdio.h>\n\nint main()\n{\n  ssh_session my_ssh_session;\n  int rc;\n  char *password;\n\n  // Open session and set options\n  my_ssh_session = ssh_new();\n  if (my_ssh_session == NULL)\n    exit(-1);\n  ssh_options_set(my_ssh_session, SSH_OPTIONS_HOST, \"localhost\");\n\n  // Connect to server\n  rc = ssh_connect(my_ssh_session);\n  if (rc != SSH_OK)\n  {\n    fprintf(stderr, \"Error connecting to localhost: %s\\n\",\n            ssh_get_error(my_ssh_session));\n    ssh_free(my_ssh_session);\n    exit(-1);\n  }\n\n  // Verify the server's identity\n  // For the source code of verify_knownhost(), check previous example\n  if (verify_knownhost(my_ssh_session) < 0)\n  {\n    ssh_disconnect(my_ssh_session);\n    ssh_free(my_ssh_session);\n    exit(-1);\n  }\n\n  // Authenticate ourselves\n  password = getpass(\"Password: \");\n  rc = ssh_userauth_password(my_ssh_session, NULL, password);\n  if (rc != SSH_AUTH_SUCCESS)\n  {\n    fprintf(stderr, \"Error authenticating with password: %s\\n\",\n            ssh_get_error(my_ssh_session));\n    ssh_disconnect(my_ssh_session);\n    ssh_free(my_ssh_session);\n    exit(-1);\n  }\n\n  ...\n\n  ssh_disconnect(my_ssh_session);\n  ssh_free(my_ssh_session);\n}\n@endcode\n\n@see @ref authentication_details\n\n\n@subsection using_ssh Doing something\n\nAt this point, the authenticity of both server and client is established.\nTime has come to take advantage of the many possibilities offered by the SSH\nprotocol: execute a remote command, open remote shells, transfer files,\nforward ports, etc.\n\nThe example below shows how to execute a remote command:\n\n@code\nint show_remote_processes(ssh_session session)\n{\n  ssh_channel channel;\n  int rc;\n  char buffer[256];\n  int nbytes;\n\n  channel = ssh_channel_new(session);\n  if (channel == NULL)\n    return SSH_ERROR;\n\n  rc = ssh_channel_open_session(channel);\n  if (rc != SSH_OK)\n  {\n    ssh_channel_free(channel);\n    return rc;\n  }\n\n  rc = ssh_channel_request_exec(channel, \"ps aux\");\n  if (rc != SSH_OK)\n  {\n    ssh_channel_close(channel);\n    ssh_channel_free(channel);\n    return rc;\n  }\n\n  nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);\n  while (nbytes > 0)\n  {\n    if (write(1, buffer, nbytes) != (unsigned int) nbytes)\n    {\n      ssh_channel_close(channel);\n      ssh_channel_free(channel);\n      return SSH_ERROR;\n    }\n    nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);\n  }\n\n  if (nbytes < 0)\n  {\n    ssh_channel_close(channel);\n    ssh_channel_free(channel);\n    return SSH_ERROR;\n  }\n\n  ssh_channel_send_eof(channel);\n  ssh_channel_close(channel);\n  ssh_channel_free(channel);\n\n  return SSH_OK;\n}\n@endcode\n\nEach ssh_channel_request_exec() needs to be run on freshly created\nand connected (with ssh_channel_open_session()) channel.\n\n@see @ref opening_shell\n@see @ref remote_command\n@see @ref sftp_subsystem\n@see @ref scp_subsystem\n\n\n@subsection errors Handling the errors\n\nAll the libssh functions which return an error value also set an English error message\ndescribing the problem.\n\nError values are typically SSH_ERROR for integer values, or NULL for pointers.\n\nThe function ssh_get_error() returns a pointer to the static error message.\n\nssh_error_code() returns the error code number : SSH_NO_ERROR,\nSSH_REQUEST_DENIED, SSH_INVALID_REQUEST, SSH_CONNECTION_LOST, SSH_FATAL,\nor SSH_INVALID_DATA. SSH_REQUEST_DENIED means the ssh server refused your\nrequest, but the situation is recoverable. The others mean something happened\nto the connection (some encryption problems, server problems, ...).\nSSH_INVALID_REQUEST means the library got some garbage from server, but\nmight be recoverable. SSH_FATAL means the connection has an important\nproblem and isn't probably recoverable.\n\nMost of time, the error returned are SSH_FATAL, but some functions\n(generally the ssh_request_xxx ones) may fail because of server denying request.\nIn these cases, SSH_REQUEST_DENIED is returned.\n\nFor thread safety, errors are bound to ssh_session objects.\nAs long as your ssh_session object is not NULL, you can retrieve the last error\nmessage and error code from the ssh_session using ssh_get_error() and\nssh_get_error_code() respectively.\n\nThe SFTP subsystem has its own error codes, in addition to libssh ones.\n\n\n*/\n"
  },
  {
    "path": "src/libssh/doc/introduction.dox",
    "content": "/**\n@page libssh_tutorial The Tutorial\n@section introduction Introduction\n\nlibssh is a C library that enables you to write a program that uses the\nSSH protocol. With it, you can remotely execute programs, transfer\nfiles, or use a secure and transparent tunnel for your remote programs.\nThe SSH protocol is encrypted, ensures data integrity, and provides strong\nmeans of authenticating both the server of the client. The library hides\na lot of technical details from the SSH protocol, but this does not\nmean that you should not try to know about and understand these details.\n\nlibssh is a Free Software / Open Source project. The libssh library\nis distributed under LGPL license. The libssh project has nothing to do with\n\"libssh2\", which is a completely different and independent project.\n\nlibssh can run on top of either libgcrypt or libcrypto,\ntwo general-purpose cryptographic libraries.\n\nThis tutorial concentrates for its main part on the \"client\" side of libssh.\nTo learn how to accept incoming SSH connections (how to write a SSH server),\nyou'll have to jump to the end of this document.\n\nThis tutorial describes libssh version 0.5.0. This version is a little different\nfrom the 0.4.X series. However, the examples should work with\nlittle changes on versions like 0.4.2 and later.\n\n\nTable of contents:\n\n@subpage libssh_tutor_guided_tour\n\n@subpage libssh_tutor_authentication\n\n@subpage libssh_tutor_shell\n\n@subpage libssh_tutor_command\n\n@subpage libssh_tutor_sftp\n\n@subpage libssh_tutor_scp\n\n@subpage libssh_tutor_forwarding\n\n@subpage libssh_tutor_threads\n\n@subpage libssh_tutor_todo\n\n*/\n"
  },
  {
    "path": "src/libssh/doc/linking.dox",
    "content": "/**\n\n@page libssh_linking The Linking HowTo\n\n@section dynamic Dynamic Linking\n\nOn UNIX and Windows systems its the same, you need at least the libssh.h\nheader file and the libssh shared library.\n\n@section static Static Linking\n\n@warning <b>The libssh library is licensed under the LGPL! Make sure you\nunderstand what this means to your codebase if you want to distribute\nbinaries and link statically against LGPL code!</b>\n\nOn UNIX systems linking against the static version of the library is the\nsame as linking against the shared library. Both have the same name. Some\nbuild system require to use the full path to the static library.\n\nTo be able to compile the application you're developing you need to either pass\nLIBSSH_STATIC as a define in the compiler command line or define it before you\ninclude libssh.h.  This is required cause the dynamic library needs to specify\nthe dllimport attribute.\n\n@code\n#define LIBSSH_STATIC 1\n#include <libssh/libssh.h>\n@endcode\n\nIf you're are statically linking with OpenSSL, read the \"Linking your\napplication\" section in the NOTES.[OS] in the OpenSSL source tree!\n\n*/\n"
  },
  {
    "path": "src/libssh/doc/mainpage.dox",
    "content": "/**\n\n@mainpage\n\nThis is the online reference for developing with the libssh library. It\ndocuments the libssh C API and the C++ wrapper.\n\n@section main-linking Linking\n\nWe created a small howto how to link libssh against your application, read\n@subpage libssh_linking.\n\n@section main-tutorial Tutorial\n\nYou should start by reading @subpage libssh_tutorial, then reading the documentation of\nthe interesting functions as you go.\n\n@section main-features Features\n\nThe libssh library provides:\n\n - <strong>Key Exchange Methods</strong>: <i>curve25519-sha256, curve25519-sha256@libssh.org, ecdh-sha2-nistp256, ecdh-sha2-nistp384, ecdh-sha2-nistp521</i>, diffie-hellman-group1-sha1, diffie-hellman-group14-sha1\n - <strong>Public Key Algorithms</strong>: ssh-ed25519, ecdsa-sha2-nistp256, ecdsa-sha2-nistp384, ecdsa-sha2-nistp521, ssh-rsa, rsa-sha2-512, rsa-sha2-256,ssh-dss\n - <strong>Ciphers</strong>: <i>aes256-ctr, aes192-ctr, aes128-ctr</i>, aes256-cbc (rijndael-cbc@lysator.liu.se), aes192-cbc, aes128-cbc, 3des-cbc, blowfish-cbc, none\n - <strong>Compression Schemes</strong>: zlib, <i>zlib@openssh.com</i>, none\n - <strong>MAC hashes</strong>: hmac-sha1, hmac-sha2-256, hmac-sha2-512, hmac-md5, none\n - <strong>Authentication</strong>: none, password, public-key, keyboard-interactive, <i>gssapi-with-mic</i>\n - <strong>Channels</strong>: shell, exec (incl. SCP wrapper), direct-tcpip, subsystem, <i>auth-agent-req@openssh.com</i>\n - <strong>Global Requests</strong>: tcpip-forward, forwarded-tcpip\n - <strong>Channel Requests</strong>: x11, pty, <i>exit-status, signal, exit-signal, keepalive@openssh.com, auth-agent-req@openssh.com</i>\n - <strong>Subsystems</strong>: sftp(version 3), <i>OpenSSH Extensions</i>\n - <strong>SFTP</strong>: <i>statvfs@openssh.com, fstatvfs@openssh.com</i>\n - <strong>Thread-safe</strong>: Just don't share sessions\n - <strong>Non-blocking</strong>: it can be used both blocking and non-blocking\n - <strong>Your sockets</strong>: the app hands over the socket, or uses libssh sockets\n - <b>OpenSSL</b> or <b>gcrypt</b>: builds with either\n\n@section main-additional-features Additional Features\n\n - Client <b>and</b> server support\n - SSHv2 and SSHv1 protocol support\n - Supports <a href=\"https://test.libssh.org/\" target=\"_blank\">Linux, UNIX, BSD, Solaris, OS/2 and Windows</a>\n - Automated test cases with nightly <a href=\"https://test.libssh.org/\" target=\"_blank\">tests</a>\n - Event model based on poll(2), or a poll(2)-emulation.\n\n@section main-copyright Copyright Policy\n\nlibssh is a project with distributed copyright ownership, which means we prefer\nthe copyright on parts of libssh to be held by individuals rather than\ncorporations if possible. There are historical legal reasons for this, but one\nof the best ways to explain it is that it’s much easier to work with\nindividuals who have ownership than corporate legal departments if we ever need\nto make reasonable compromises with people using and working with libssh.\n\nWe track the ownership of every part of libssh via git, our source code control\nsystem, so we know the provenance of every piece of code that is committed to\nlibssh.\n\nSo if possible, if you’re doing libssh changes on behalf of a company who\nnormally owns all the work you do please get them to assign personal copyright\nownership of your changes to you as an individual, that makes things very easy\nfor us to work with and avoids bringing corporate legal departments into the\npicture.\n\nIf you can’t do this we can still accept patches from you owned by your\nemployer under a standard employment contract with corporate copyright\nownership. It just requires a simple set-up process first.\n\nWe use a process very similar to the way things are done in the Linux Kernel\ncommunity, so it should be very easy to get a sign off from your corporate\nlegal department. The only changes we’ve made are to accommodate the license we\nuse, which is LGPLv2 (or later) whereas the Linux kernel uses GPLv2.\n\nThe process is called signing.\n\nHow to sign your work\n----------------------\n\nOnce you have permission to contribute to libssh from your employer, simply\nemail a copy of the following text from your corporate email address to:\n\ncontributing@libssh.org\n\n@verbatim\nlibssh Developer's Certificate of Origin. Version 1.0\n\nBy making a contribution to this project, I certify that:\n\n(a) The contribution was created in whole or in part by me and I\n    have the right to submit it under the appropriate\n    version of the GNU General Public License; or\n\n(b) The contribution is based upon previous work that, to the best of\n    my knowledge, is covered under an appropriate open source license\n    and I have the right under that license to submit that work with\n    modifications, whether created in whole or in part by me, under\n    the GNU General Public License, in the appropriate version; or\n\n(c) The contribution was provided directly to me by some other\n    person who certified (a) or (b) and I have not modified it.\n\n(d) I understand and agree that this project and the contribution are\n    public and that a record of the contribution (including all\n    metadata and personal information I submit with it, including my\n    sign-off) is maintained indefinitely and may be redistributed\n    consistent with the libssh Team's policies and the requirements of\n    the GNU GPL where they are relevant.\n\n(e) I am granting this work to this project under the terms of the\n    GNU Lesser General Public License as published by the\n    Free Software Foundation; either version 2.1 of\n    the License, or (at the option of the project) any later version.\n\nhttps://www.gnu.org/licenses/lgpl-2.1.html\n@endverbatim\n\nWe will maintain a copy of that email as a record that you have the rights to\ncontribute code to libssh under the required licenses whilst working for the\ncompany where the email came from.\n\nThen when sending in a patch via the normal mechanisms described above, add a\nline that states:\n\n@verbatim\n   Signed-off-by: Random J Developer <random@developer.example.org>\n@endverbatim\n\nusing your real name and the email address you sent the original email you used\nto send the libssh Developer’s Certificate of Origin to us (sorry, no\npseudonyms or anonymous contributions.)\n\nThat’s it! Such code can then quite happily contain changes that have copyright\nmessages such as:\n\n@verbatim\n   (c) Example Corporation.\n@endverbatim\n\nand can be merged into the libssh codebase in the same way as patches from any\nother individual. You don’t need to send in a copy of the libssh Developer’s\nCertificate of Origin for each patch, or inside each patch. Just the sign-off\nmessage is all that is required once we’ve received the initial email.\n\nHave fun and happy libssh hacking!\n\nThe libssh Team\n\n@section main-rfc Internet standard\n\n@subsection main-rfc-secsh Secure Shell (SSH)\n\nThe following RFC documents described SSH-2 protcol as an Internet standard.\n\n - <a href=\"https://tools.ietf.org/html/rfc4250\" target=\"_blank\">RFC 4250</a>,\n    The Secure Shell (SSH) Protocol Assigned Numbers\n - <a href=\"https://tools.ietf.org/html/rfc4251\" target=\"_blank\">RFC 4251</a>,\n    The Secure Shell (SSH) Protocol Architecture\n - <a href=\"https://tools.ietf.org/html/rfc4252\" target=\"_blank\">RFC 4252</a>,\n    The Secure Shell (SSH) Authentication Protocol\n - <a href=\"https://tools.ietf.org/html/rfc4253\" target=\"_blank\">RFC 4253</a>,\n    The Secure Shell (SSH) Transport Layer Protocol\n - <a href=\"https://tools.ietf.org/html/rfc4254\" target=\"_blank\">RFC 4254</a>,\n    The Secure Shell (SSH) Connection Protocol\n - <a href=\"https://tools.ietf.org/html/rfc4255\" target=\"_blank\">RFC 4255</a>,\n    Using DNS to Securely Publish Secure Shell (SSH) Key Fingerprints\n    (not implemented in libssh)\n - <a href=\"https://tools.ietf.org/html/rfc4256\" target=\"_blank\">RFC 4256</a>,\n    Generic Message Exchange Authentication for the Secure Shell Protocol (SSH)\n - <a href=\"https://tools.ietf.org/html/rfc4335\" target=\"_blank\">RFC 4335</a>,\n    The Secure Shell (SSH) Session Channel Break Extension\n - <a href=\"https://tools.ietf.org/html/rfc4344\" target=\"_blank\">RFC 4344</a>,\n    The Secure Shell (SSH) Transport Layer Encryption Modes\n - <a href=\"https://tools.ietf.org/html/rfc4345\" target=\"_blank\">RFC 4345</a>,\n    Improved Arcfour Modes for the Secure Shell (SSH) Transport Layer Protocol\n\nIt was later modified and expanded by the following RFCs.\n\n - <a href=\"https://tools.ietf.org/html/rfc4419\" target=\"_blank\">RFC 4419</a>,\n    Diffie-Hellman Group Exchange for the Secure Shell (SSH) Transport Layer\n    Protocol\n - <a href=\"https://tools.ietf.org/html/rfc4432\" target=\"_blank\">RFC 4432</a>,\n    RSA Key Exchange for the Secure Shell (SSH) Transport Layer Protocol\n    (not implemented in libssh)\n - <a href=\"https://tools.ietf.org/html/rfc4462\" target=\"_blank\">RFC 4462</a>,\n    Generic Security Service Application Program Interface (GSS-API)\n    Authentication and Key Exchange for the Secure Shell (SSH) Protocol\n    (only the authentication implemented in libssh)\n - <a href=\"https://tools.ietf.org/html/rfc4716\" target=\"_blank\">RFC 4716</a>,\n    The Secure Shell (SSH) Public Key File Format\n    (not implemented in libssh)\n - <a href=\"https://tools.ietf.org/html/rfc5647\" target=\"_blank\">RFC 5647</a>,\n    AES Galois Counter Mode for the Secure Shell Transport Layer Protocol\n    (the algorithm negotiation implemented according to openssh.com)\n - <a href=\"https://tools.ietf.org/html/rfc5656\" target=\"_blank\">RFC 5656</a>,\n    Elliptic Curve Algorithm Integration in the Secure Shell Transport Layer\n - <a href=\"https://tools.ietf.org/html/rfc6594\" target=\"_blank\">RFC 6594</a>,\n    Use of the SHA-256 Algorithm with RSA, DSA, and ECDSA in SSHFP Resource Records\n    (not implemented in libssh)\n - <a href=\"https://tools.ietf.org/html/rfc6668\" target=\"_blank\">RFC 6668</a>,\n    SHA-2 Data Integrity Verification for the Secure Shell (SSH) Transport Layer Protocol\n - <a href=\"https://tools.ietf.org/html/rfc7479\" target=\"_blank\">RFC 7479</a>,\n    Using Ed25519 in SSHFP Resource Records\n    (not implemented in libssh)\n - <a href=\"https://tools.ietf.org/html/rfc8160\" target=\"_blank\">RFC 8160</a>,\n    IUTF8 Terminal Mode in Secure Shell (SSH)\n    (not handled in libssh)\n - <a href=\"https://tools.ietf.org/html/rfc8270\" target=\"_blank\">RFC 8270</a>,\n    Increase the Secure Shell Minimum Recommended Diffie-Hellman Modulus Size to 2048 Bits\n - <a href=\"https://tools.ietf.org/html/rfc8308\" target=\"_blank\">RFC 8308</a>,\n    Extension Negotiation in the Secure Shell (SSH) Protocol\n    (only the \"server-sig-algs\" extension implemented)\n - <a href=\"https://tools.ietf.org/html/rfc8332\" target=\"_blank\">RFC 8332</a>,\n    Use of RSA Keys with SHA-256 and SHA-512 in the Secure Shell (SSH) Protocol\n\nThere are also drafts that are being currently developed and followed.\n\n - <a href=\"https://tools.ietf.org/html/draft-ietf-curdle-ssh-kex-sha2-10\" target=\"_blank\">draft-ietf-curdle-ssh-kex-sha2-10</a>\n    Key Exchange (KEX) Method Updates and Recommendations for Secure Shell (SSH)\n - <a href=\"https://tools.ietf.org/html/draft-miller-ssh-agent-03\" target=\"_blank\">draft-miller-ssh-agent-03</a>\n    SSH Agent Protocol\n - <a href=\"https://tools.ietf.org/html/draft-ietf-curdle-ssh-curves-12\" target=\"_blank\">draft-ietf-curdle-ssh-curves-12</a>\n    Secure Shell (SSH) Key Exchange Method using Curve25519 and Curve448\n\nInteresting cryptography documents:\n\n - <a href=\"https://www.cryptsoft.com/pkcs11doc/\" target=\"_blank\">PKCS #11</a>, PKCS #11 reference documents, describing interface with smartcards.\n\n@subsection main-rfc-sftp Secure Shell File Transfer Protocol (SFTP)\n\nThe protocol is not an Internet standard but it is still widely implemented.\nOpenSSH and most other implementation implement Version 3 of the protocol. We\ndo the same in libssh.\n\n - <a href=\"https://tools.ietf.org/html/draft-ietf-secsh-filexfer-02\" target=\"_blank\">\n   draft-ietf-secsh-filexfer-02.txt</a>,\n   SSH File Transfer Protocol\n\n@subsection main-rfc-extensions Secure Shell Extensions\n\nThe OpenSSH project has defined some extensions to the protocol. We support some of\nthem like the statvfs calls in SFTP or the ssh-agent.\n\n - <a href=\"https://api.libssh.org/rfc/PROTOCOL\" target=\"_blank\">\n    OpenSSH's deviations and extensions</a>\n - <a href=\"https://api.libssh.org/rfc/PROTOCOL.certkeys\" target=\"_blank\">\n    OpenSSH's pubkey certificate authentication</a>\n - <a href=\"https://api.libssh.org/rfc/PROTOCOL.chacha20poly1305\" target=\"_blank\">\n    chacha20-poly1305@openssh.com authenticated encryption mode</a>\n - <a href=\"https://api.libssh.org/rfc/PROTOCOL.key\" target=\"_blank\">\n    OpenSSH private key format (openssh-key-v1)</a>\n\n*/\n"
  },
  {
    "path": "src/libssh/doc/scp.dox",
    "content": "/**\n@page libssh_tutor_scp Chapter 6: The SCP subsystem\n@section scp_subsystem The SCP subsystem\n\nThe SCP subsystem has far less functionality than the SFTP subsystem.\nHowever, if you only need to copy files from and to the remote system,\nit does its job.\n\n\n@subsection scp_session Opening and closing a SCP session\n\nLike in the SFTP subsystem, you don't handle the SSH channels directly.\nInstead, you open a \"SCP session\".\n\nWhen you open your SCP session, you have to choose between read or write mode.\nYou can't do both in the same session. So you specify either SSH_SCP_READ or\nSSH_SCP_WRITE as the second parameter of function ssh_scp_new().\n\nAnother important mode flag for opening your SCP session is SSH_SCP_RECURSIVE.\nWhen you use SSH_SCP_RECURSIVE, you declare that you are willing to emulate\nthe behaviour of \"scp -r\" command in your program, no matter it is for\nreading or for writing.\n\nOnce your session is created, you initialize it with ssh_scp_init(). When\nyou have finished transferring files, you terminate the SCP connection with\nssh_scp_close(). Finally, you can dispose the SCP connection with\nssh_scp_free().\n\nThe example below does the maintenance work to open a SCP connection for writing in\nrecursive mode:\n\n@code\nint scp_write(ssh_session session)\n{\n  ssh_scp scp;\n  int rc;\n\n  scp = ssh_scp_new\n    (session, SSH_SCP_WRITE | SSH_SCP_RECURSIVE, \".\");\n  if (scp == NULL)\n  {\n    fprintf(stderr, \"Error allocating scp session: %s\\n\",\n            ssh_get_error(session));\n    return SSH_ERROR;\n  }\n\n  rc = ssh_scp_init(scp);\n  if (rc != SSH_OK)\n  {\n    fprintf(stderr, \"Error initializing scp session: %s\\n\",\n            ssh_get_error(session));\n    ssh_scp_free(scp);\n    return rc;\n  }\n\n  ...\n\n  ssh_scp_close(scp);\n  ssh_scp_free(scp);\n  return SSH_OK;\n}\n@endcode\n\nThe example below shows how to open a connection to read a single file:\n\n@code\nint scp_read(ssh_session session)\n{\n  ssh_scp scp;\n  int rc;\n\n  scp = ssh_scp_new\n    (session, SSH_SCP_READ, \"helloworld/helloworld.txt\");\n  if (scp == NULL)\n  {\n    fprintf(stderr, \"Error allocating scp session: %s\\n\",\n            ssh_get_error(session));\n    return SSH_ERROR;\n  }\n\n  rc = ssh_scp_init(scp);\n  if (rc != SSH_OK)\n  {\n    fprintf(stderr, \"Error initializing scp session: %s\\n\",\n            ssh_get_error(session));\n    ssh_scp_free(scp);\n    return rc;\n  }\n\n  ...\n\n  ssh_scp_close(scp);\n  ssh_scp_free(scp);\n  return SSH_OK;\n}\n\n@endcode\n\n\n@subsection scp_write Creating files and directories\n\nYou create directories with ssh_scp_push_directory(). In recursive mode,\nyou are placed in this directory once it is created. If the directory\nalready exists and if you are in recursive mode, you simply enter that\ndirectory.\n\nCreating files is done in two steps. First, you prepare the writing with\nssh_scp_push_file(). Then, you write the data with ssh_scp_write().\nThe length of the data to write must be identical between both function calls.\nThere's no need to \"open\" nor \"close\" the file, this is done automatically\non the remote end. If the file already exists, it is overwritten and truncated.\n\nThe following example creates a new directory named \"helloworld/\", then creates\na file named \"helloworld.txt\" in that directory:\n\n@code\nint scp_helloworld(ssh_session session, ssh_scp scp)\n{\n  int rc;\n  const char *helloworld = \"Hello, world!\\n\";\n  int length = strlen(helloworld);\n\n  rc = ssh_scp_push_directory(scp, \"helloworld\", S_IRWXU);\n  if (rc != SSH_OK)\n  {\n    fprintf(stderr, \"Can't create remote directory: %s\\n\",\n            ssh_get_error(session));\n    return rc;\n  }\n\n  rc = ssh_scp_push_file\n    (scp, \"helloworld.txt\", length, S_IRUSR |  S_IWUSR);\n  if (rc != SSH_OK)\n  {\n    fprintf(stderr, \"Can't open remote file: %s\\n\",\n            ssh_get_error(session));\n    return rc;\n  }\n\n  rc = ssh_scp_write(scp, helloworld, length);\n  if (rc != SSH_OK)\n  {\n    fprintf(stderr, \"Can't write to remote file: %s\\n\",\n            ssh_get_error(session));\n    return rc;\n  }\n\n  return SSH_OK;\n}\n@endcode\n\n\n@subsection scp_recursive_write Copying full directory trees to the remote server\n\nLet's say you want to copy the following tree of files to the remote site:\n\n@verbatim\n               +-- file1\n       +-- B --+\n       |       +-- file2\n-- A --+\n       |       +-- file3\n       +-- C --+\n               +-- file4\n@endverbatim\n\nYou would do it that way:\n  - open the session in recursive mode\n  - enter directory A\n  - enter its subdirectory B\n  - create file1 in B\n  - create file2 in B\n  - leave directory B\n  - enter subdirectory C\n  - create file3 in C\n  - create file4 in C\n  - leave directory C\n  - leave directory A\n\nTo leave a directory, call ssh_scp_leave_directory().\n\n\n@subsection scp_read Reading files and directories\n\n\nTo receive files, you pull requests from the other side with ssh_scp_pull_request().\nIf this function returns SSH_SCP_REQUEST_NEWFILE, then you must get ready for\nthe reception. You can get the size of the data to receive with ssh_scp_request_get_size()\nand allocate a buffer accordingly. When you are ready, you accept the request with\nssh_scp_accept_request(), then read the data with ssh_scp_read().\n\nThe following example receives a single file. The name of the file to\nreceive has been given earlier, when the scp session was opened:\n\n@code\nint scp_receive(ssh_session session, ssh_scp scp)\n{\n  int rc;\n  int size, mode;\n  char *filename, *buffer;\n\n  rc = ssh_scp_pull_request(scp);\n  if (rc != SSH_SCP_REQUEST_NEWFILE)\n  {\n    fprintf(stderr, \"Error receiving information about file: %s\\n\",\n            ssh_get_error(session));\n    return SSH_ERROR;\n  }\n\n  size = ssh_scp_request_get_size(scp);\n  filename = strdup(ssh_scp_request_get_filename(scp));\n  mode = ssh_scp_request_get_permissions(scp);\n  printf(\"Receiving file %s, size %d, permissions 0%o\\n\",\n          filename, size, mode);\n  free(filename);\n\n  buffer = malloc(size);\n  if (buffer == NULL)\n  {\n    fprintf(stderr, \"Memory allocation error\\n\");\n    return SSH_ERROR;\n  }\n\n  ssh_scp_accept_request(scp);\n  rc = ssh_scp_read(scp, buffer, size);\n  if (rc == SSH_ERROR)\n  {\n    fprintf(stderr, \"Error receiving file data: %s\\n\",\n            ssh_get_error(session));\n    free(buffer);\n    return rc;\n  }\n  printf(\"Done\\n\");\n\n  write(1, buffer, size);\n  free(buffer);\n\n  rc = ssh_scp_pull_request(scp);\n  if (rc != SSH_SCP_REQUEST_EOF)\n  {\n    fprintf(stderr, \"Unexpected request: %s\\n\",\n            ssh_get_error(session));\n    return SSH_ERROR;\n  }\n\n  return SSH_OK;\n}\n@endcode\n\nIn this example, since we just requested a single file, we expect ssh_scp_request()\nto return SSH_SCP_REQUEST_NEWFILE first, then SSH_SCP_REQUEST_EOF. That's quite a\nnaive approach; for example, the remote server might send a warning as well\n(return code SSH_SCP_REQUEST_WARNING) and the example would fail. A more comprehensive\nreception program would receive the requests in a loop and analyze them carefully\nuntil SSH_SCP_REQUEST_EOF has been received.\n\n\n@subsection scp_recursive_read Receiving full directory trees from the remote server\n\nIf you opened the SCP session in recursive mode, the remote end will be\ntelling you when to change directory.\n\nIn that case, when ssh_scp_pull_request() answers\nSSH_SCP_REQUEST_NEWDIRECTORY, you should make that local directory (if\nit does not exist yet) and enter it. When ssh_scp_pull_request() answers\nSSH_SCP_REQUEST_ENDDIRECTORY, you should leave the current directory.\n\n*/\n"
  },
  {
    "path": "src/libssh/doc/sftp.dox",
    "content": "/**\n@page libssh_tutor_sftp Chapter 5: The SFTP subsystem\n@section sftp_subsystem The SFTP subsystem\n\nSFTP stands for \"Secure File Transfer Protocol\". It enables you to safely\ntransfer files between the local and the remote computer. It reminds a lot\nof the old FTP protocol.\n\nSFTP is a rich protocol. It lets you do over the network almost everything\nthat you can do with local files:\n  - send files\n  - modify only a portion of a file\n  - receive files\n  - receive only a portion of a file\n  - get file owner and group\n  - get file permissions\n  - set file owner and group\n  - set file permissions\n  - remove files\n  - rename files\n  - create a directory\n  - remove a directory\n  - retrieve the list of files in a directory\n  - get the target of a symbolic link\n  - create symbolic links\n  - get information about mounted filesystems.\n\nThe current implemented version of the SFTP protocol is version 3. All functions\naren't implemented yet, but the most important are.\n\n\n@subsection sftp_session Opening and closing a SFTP session\n\nUnlike with remote shells and remote commands, when you use the SFTP subsystem,\nyou don't handle directly the SSH channels. Instead, you open a \"SFTP session\".\n\nThe function sftp_new() creates a new SFTP session. The function sftp_init()\ninitializes it. The function sftp_free() deletes it.\n\nAs you see, all the SFTP-related functions start with the \"sftp_\" prefix\ninstead of the usual \"ssh_\" prefix.\n\nThe example below shows how to use these functions:\n\n@code\n#include <libssh/sftp.h>\n\nint sftp_helloworld(ssh_session session)\n{\n  sftp_session sftp;\n  int rc;\n\n  sftp = sftp_new(session);\n  if (sftp == NULL)\n  {\n    fprintf(stderr, \"Error allocating SFTP session: %s\\n\",\n            ssh_get_error(session));\n    return SSH_ERROR;\n  }\n\n  rc = sftp_init(sftp);\n  if (rc != SSH_OK)\n  {\n    fprintf(stderr, \"Error initializing SFTP session: code %d.\\n\",\n            sftp_get_error(sftp));\n    sftp_free(sftp);\n    return rc;\n  }\n\n  ...\n\n  sftp_free(sftp);\n  return SSH_OK;\n}\n@endcode\n\n\n@subsection sftp_errors Analyzing SFTP errors\n\nIn case of a problem, the function sftp_get_error() returns a SFTP-specific\nerror number, in addition to the regular SSH error number returned by\nssh_get_error_number().\n\nPossible errors are:\n  - SSH_FX_OK: no error\n  - SSH_FX_EOF: end-of-file encountered\n  - SSH_FX_NO_SUCH_FILE: file does not exist\n  - SSH_FX_PERMISSION_DENIED: permission denied\n  - SSH_FX_FAILURE: generic failure\n  - SSH_FX_BAD_MESSAGE: garbage received from server\n  - SSH_FX_NO_CONNECTION: no connection has been set up\n  - SSH_FX_CONNECTION_LOST: there was a connection, but we lost it\n  - SSH_FX_OP_UNSUPPORTED: operation not supported by libssh yet\n  - SSH_FX_INVALID_HANDLE: invalid file handle\n  - SSH_FX_NO_SUCH_PATH: no such file or directory path exists\n  - SSH_FX_FILE_ALREADY_EXISTS: an attempt to create an already existing file or directory has been made\n  - SSH_FX_WRITE_PROTECT: write-protected filesystem\n  - SSH_FX_NO_MEDIA: no media was in remote drive\n\n\n@subsection sftp_mkdir Creating a directory\n\nThe function sftp_mkdir() takes the \"SFTP session\" we just created as\nits first argument. It also needs the name of the file to create, and the\ndesired permissions. The permissions are the same as for the usual mkdir()\nfunction. To get a comprehensive list of the available permissions, use the\n\"man 2 stat\" command. The desired permissions are combined with the remote\nuser's mask to determine the effective permissions.\n\nThe code below creates a directory named \"helloworld\" in the current directory that\ncan be read and written only by its owner:\n\n@code\n#include <libssh/sftp.h>\n#include <sys/stat.h>\n\nint sftp_helloworld(ssh_session session, sftp_session sftp)\n{\n  int rc;\n\n  rc = sftp_mkdir(sftp, \"helloworld\", S_IRWXU);\n  if (rc != SSH_OK)\n  {\n    if (sftp_get_error(sftp) != SSH_FX_FILE_ALREADY_EXISTS)\n    {\n      fprintf(stderr, \"Can't create directory: %s\\n\",\n              ssh_get_error(session));\n        return rc;\n    }\n  }\n\n  ...\n\n  return SSH_OK;\n}\n@endcode\n\nUnlike its equivalent in the SCP subsystem, this function does NOT change the\ncurrent directory to the newly created subdirectory.\n\n\n@subsection sftp_write Copying a file to the remote computer\n\nYou handle the contents of a remote file just like you would do with a\nlocal file: you open the file in a given mode, move the file pointer in it,\nread or write data, and close the file.\n\nThe sftp_open() function is very similar to the regular open() function,\nexcepted that it returns a file handle of type sftp_file. This file handle\nis then used by the other file manipulation functions and remains valid\nuntil you close the remote file with sftp_close().\n\nThe example below creates a new file named \"helloworld.txt\" in the\nnewly created \"helloworld\" directory. If the file already exists, it will\nbe truncated. It then writes the famous \"Hello, World!\" sentence to the\nfile, followed by a new line character. Finally, the file is closed:\n\n@code\n#include <libssh/sftp.h>\n#include <sys/stat.h>\n#include <fcntl.h>\n\nint sftp_helloworld(ssh_session session, sftp_session sftp)\n{\n  int access_type = O_WRONLY | O_CREAT | O_TRUNC;\n  sftp_file file;\n  const char *helloworld = \"Hello, World!\\n\";\n  int length = strlen(helloworld);\n  int rc, nwritten;\n\n  ...\n\n  file = sftp_open(sftp, \"helloworld/helloworld.txt\",\n                   access_type, S_IRWXU);\n  if (file == NULL)\n  {\n    fprintf(stderr, \"Can't open file for writing: %s\\n\",\n            ssh_get_error(session));\n    return SSH_ERROR;\n  }\n\n  nwritten = sftp_write(file, helloworld, length);\n  if (nwritten != length)\n  {\n    fprintf(stderr, \"Can't write data to file: %s\\n\",\n            ssh_get_error(session));\n    sftp_close(file);\n    return SSH_ERROR;\n  }\n\n  rc = sftp_close(file);\n  if (rc != SSH_OK)\n  {\n    fprintf(stderr, \"Can't close the written file: %s\\n\",\n            ssh_get_error(session));\n    return rc;\n  }\n\n  return SSH_OK;\n}\n@endcode\n\n\n@subsection sftp_read Reading a file from the remote computer\n\nThe nice thing with reading a file over the network through SFTP is that it\ncan be done both in a synchronous way or an asynchronous way. If you read the file\nasynchronously, your program can do something else while it waits for the\nresults to come.\n\nSynchronous read is done with sftp_read().\n\nFiles are normally transferred in chunks. A good chunk size is 16 KB. The following\nexample transfers the remote file \"/etc/profile\" in 16 KB chunks. For each chunk we\nrequest, sftp_read blocks till the data has been received:\n\n@code\n// Good chunk size\n#define MAX_XFER_BUF_SIZE 16384\n\nint sftp_read_sync(ssh_session session, sftp_session sftp)\n{\n  int access_type;\n  sftp_file file;\n  char buffer[MAX_XFER_BUF_SIZE];\n  int nbytes, nwritten, rc;\n  int fd;\n\n  access_type = O_RDONLY;\n  file = sftp_open(sftp, \"/etc/profile\",\n                   access_type, 0);\n  if (file == NULL) {\n      fprintf(stderr, \"Can't open file for reading: %s\\n\",\n              ssh_get_error(session));\n      return SSH_ERROR;\n  }\n\n  fd = open(\"/path/to/profile\", O_CREAT);\n  if (fd < 0) {\n      fprintf(stderr, \"Can't open file for writing: %s\\n\",\n              strerror(errno));\n      return SSH_ERROR;\n  }\n\n  for (;;) {\n      nbytes = sftp_read(file, buffer, sizeof(buffer));\n      if (nbytes == 0) {\n          break; // EOF\n      } else if (nbytes < 0) {\n          fprintf(stderr, \"Error while reading file: %s\\n\",\n                  ssh_get_error(session));\n          sftp_close(file);\n          return SSH_ERROR;\n      }\n\n      nwritten = write(fd, buffer, nbytes);\n      if (nwritten != nbytes) {\n          fprintf(stderr, \"Error writing: %s\\n\",\n                  strerror(errno));\n          sftp_close(file);\n          return SSH_ERROR;\n      }\n  }\n\n  rc = sftp_close(file);\n  if (rc != SSH_OK) {\n      fprintf(stderr, \"Can't close the read file: %s\\n\",\n              ssh_get_error(session));\n      return rc;\n  }\n\n  return SSH_OK;\n}\n@endcode\n\nAsynchronous read is done in two steps, first sftp_async_read_begin(), which\nreturns a \"request handle\", and then sftp_async_read(), which uses that request handle.\nIf the file has been opened in nonblocking mode, then sftp_async_read()\nmight return SSH_AGAIN, which means that the request hasn't completed yet\nand that the function should be called again later on. Otherwise,\nsftp_async_read() waits for the data to come. To open a file in nonblocking mode,\ncall sftp_file_set_nonblocking() right after you opened it. Default is blocking mode.\n\nThe example below reads a very big file in asynchronous, nonblocking, mode. Each\ntime the data is not ready yet, a counter is incremented.\n\n@code\n// Good chunk size\n#define MAX_XFER_BUF_SIZE 16384\n\nint sftp_read_async(ssh_session session, sftp_session sftp)\n{\n  int access_type;\n  sftp_file file;\n  char buffer[MAX_XFER_BUF_SIZE];\n  int async_request;\n  int nbytes;\n  long counter;\n  int rc;\n\n  access_type = O_RDONLY;\n  file = sftp_open(sftp, \"some_very_big_file\",\n                   access_type, 0);\n  if (file == NULL) {\n    fprintf(stderr, \"Can't open file for reading: %s\\n\",\n                     ssh_get_error(session));\n    return SSH_ERROR;\n  }\n  sftp_file_set_nonblocking(file);\n\n  async_request = sftp_async_read_begin(file, sizeof(buffer));\n  counter = 0L;\n  usleep(10000);\n  if (async_request >= 0) {\n    nbytes = sftp_async_read(file, buffer, sizeof(buffer),\n                             async_request);\n  } else {\n      nbytes = -1;\n  }\n\n  while (nbytes > 0 || nbytes == SSH_AGAIN) {\n    if (nbytes > 0) {\n      write(1, buffer, nbytes);\n      async_request = sftp_async_read_begin(file, sizeof(buffer));\n    } else {\n        counter++;\n    }\n    usleep(10000);\n\n    if (async_request >= 0) {\n      nbytes = sftp_async_read(file, buffer, sizeof(buffer),\n                               async_request);\n    } else {\n        nbytes = -1;\n    }\n  }\n\n  if (nbytes < 0) {\n    fprintf(stderr, \"Error while reading file: %s\\n\",\n            ssh_get_error(session));\n    sftp_close(file);\n    return SSH_ERROR;\n  }\n\n  printf(\"The counter has reached value: %ld\\n\", counter);\n\n  rc = sftp_close(file);\n  if (rc != SSH_OK) {\n    fprintf(stderr, \"Can't close the read file: %s\\n\",\n            ssh_get_error(session));\n    return rc;\n  }\n\n  return SSH_OK;\n}\n@endcode\n\n@subsection sftp_ls Listing the contents of a directory\n\nThe functions sftp_opendir(), sftp_readdir(), sftp_dir_eof(),\nand sftp_closedir() enable to list the contents of a directory.\nThey use a new handle_type, \"sftp_dir\", which gives access to the\ndirectory being read.\n\nIn addition, sftp_readdir() returns a \"sftp_attributes\" which is a pointer\nto a structure with information about a directory entry:\n  - name: the name of the file or directory\n  - size: its size in bytes\n  - etc.\n\nsftp_readdir() might return NULL under two conditions:\n  - when the end of the directory has been met\n  - when an error occurred\n\nTo tell the difference, call sftp_dir_eof().\n\nThe attributes must be freed with sftp_attributes_free() when no longer\nneeded.\n\nThe following example reads the contents of some remote directory:\n\n@code\nint sftp_list_dir(ssh_session session, sftp_session sftp)\n{\n  sftp_dir dir;\n  sftp_attributes attributes;\n  int rc;\n\n  dir = sftp_opendir(sftp, \"/var/log\");\n  if (!dir)\n  {\n    fprintf(stderr, \"Directory not opened: %s\\n\",\n            ssh_get_error(session));\n    return SSH_ERROR;\n  }\n\n  printf(\"Name                       Size Perms    Owner\\tGroup\\n\");\n\n  while ((attributes = sftp_readdir(sftp, dir)) != NULL)\n  {\n    printf(\"%-20s %10llu %.8o %s(%d)\\t%s(%d)\\n\",\n     attributes->name,\n     (long long unsigned int) attributes->size,\n     attributes->permissions,\n     attributes->owner,\n     attributes->uid,\n     attributes->group,\n     attributes->gid);\n\n     sftp_attributes_free(attributes);\n  }\n\n  if (!sftp_dir_eof(dir))\n  {\n    fprintf(stderr, \"Can't list directory: %s\\n\",\n            ssh_get_error(session));\n    sftp_closedir(dir);\n    return SSH_ERROR;\n  }\n\n  rc = sftp_closedir(dir);\n  if (rc != SSH_OK)\n  {\n    fprintf(stderr, \"Can't close directory: %s\\n\",\n            ssh_get_error(session));\n    return rc;\n  }\n}\n@endcode\n\n*/\n"
  },
  {
    "path": "src/libssh/doc/shell.dox",
    "content": "/**\n@page libssh_tutor_shell Chapter 3: Opening a remote shell\n@section opening_shell Opening a remote shell\n\nWe already mentioned that a single SSH connection can be shared\nbetween several \"channels\". Channels can be used for different purposes.\n\nThis chapter shows how to open one of these channels, and how to use it to\nstart a command interpreter on a remote computer.\n\n\n@subsection open_channel Opening and closing a channel\n\nThe ssh_channel_new() function creates a channel. It returns the channel as\na variable of type ssh_channel.\n\nOnce you have this channel, you open a SSH session that uses it with\nssh_channel_open_session().\n\nOnce you don't need the channel anymore, you can send an end-of-file\nto it with ssh_channel_close(). At this point, you can destroy the channel\nwith ssh_channel_free().\n\nThe code sample below achieves these tasks:\n\n@code\nint shell_session(ssh_session session)\n{\n  ssh_channel channel;\n  int rc;\n\n  channel = ssh_channel_new(session);\n  if (channel == NULL)\n    return SSH_ERROR;\n\n  rc = ssh_channel_open_session(channel);\n  if (rc != SSH_OK)\n  {\n    ssh_channel_free(channel);\n    return rc;\n  }\n\n  ...\n\n  ssh_channel_close(channel);\n  ssh_channel_send_eof(channel);\n  ssh_channel_free(channel);\n\n  return SSH_OK;\n}\n@endcode\n\n\n@subsection interactive Interactive and non-interactive sessions\n\nA \"shell\" is a command interpreter. It is said to be \"interactive\"\nif there is a human user typing the commands, one after the\nother. The contrary, a non-interactive shell, is similar to\nthe execution of commands in the background: there is no attached\nterminal.\n\nIf you plan using an interactive shell, you need to create a\npseud-terminal on the remote side. A remote terminal is usually referred\nto as a \"pty\", for \"pseudo-teletype\". The remote processes won't see the\ndifference with a real text-oriented terminal.\n\nIf needed, you request the pty with the function ssh_channel_request_pty().\nThen you define its dimensions (number of rows and columns)\nwith ssh_channel_change_pty_size().\n\nBe your session interactive or not, the next step is to request a\nshell with ssh_channel_request_shell().\n\n@code\nint interactive_shell_session(ssh_channel channel)\n{\n  int rc;\n\n  rc = ssh_channel_request_pty(channel);\n  if (rc != SSH_OK) return rc;\n\n  rc = ssh_channel_change_pty_size(channel, 80, 24);\n  if (rc != SSH_OK) return rc;\n\n  rc = ssh_channel_request_shell(channel);\n  if (rc != SSH_OK) return rc;\n\n  ...\n\n  return rc;\n}\n@endcode\n\n\n@subsection read_data Displaying the data sent by the remote computer\n\nIn your program, you will usually need to receive all the data \"displayed\"\ninto the remote pty. You will usually analyse, log, or display this data.\n\nssh_channel_read() and ssh_channel_read_nonblocking() are the simplest\nway to read data from a channel. If you only need to read from a single\nchannel, they should be enough.\n\nThe example below shows how to wait for remote data using ssh_channel_read():\n\n@code\nint interactive_shell_session(ssh_channel channel)\n{\n  int rc;\n  char buffer[256];\n  int nbytes;\n\n  rc = ssh_channel_request_pty(channel);\n  if (rc != SSH_OK) return rc;\n\n  rc = ssh_channel_change_pty_size(channel, 80, 24);\n  if (rc != SSH_OK) return rc;\n\n  rc = ssh_channel_request_shell(channel);\n  if (rc != SSH_OK) return rc;\n\n  while (ssh_channel_is_open(channel) &&\n         !ssh_channel_is_eof(channel))\n  {\n    nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);\n    if (nbytes < 0)\n      return SSH_ERROR;\n\n    if (nbytes > 0)\n      write(1, buffer, nbytes);\n  }\n\n  return rc;\n}\n@endcode\n\nUnlike ssh_channel_read(), ssh_channel_read_nonblocking() never waits for\nremote data to be ready. It returns immediately.\n\nIf you plan to use ssh_channel_read_nonblocking() repeatedly in a loop,\nyou should use a \"passive wait\" function like usleep(3) in the same\nloop. Otherwise, your program will consume all the CPU time, and your\ncomputer might become unresponsive.\n\n\n@subsection write_data Sending user input to the remote computer\n\nUser's input is sent to the remote site with ssh_channel_write().\n\nThe following example shows how to combine a nonblocking read from a SSH\nchannel with a nonblocking read from the keyboard. The local input is then\nsent to the remote computer:\n\n@code\n/* Under Linux, this function determines whether a key has been pressed.\n   Under Windows, it is a standard function, so you need not redefine it.\n*/\nint kbhit()\n{\n    struct timeval tv = { 0L, 0L };\n    fd_set fds;\n\n    FD_ZERO(&fds);\n    FD_SET(0, &fds);\n\n    return select(1, &fds, NULL, NULL, &tv);\n}\n\n/* A very simple terminal emulator:\n   - print data received from the remote computer\n   - send keyboard input to the remote computer\n*/\nint interactive_shell_session(ssh_channel channel)\n{\n  /* Session and terminal initialization skipped */\n  ...\n\n  char buffer[256];\n  int nbytes, nwritten;\n\n  while (ssh_channel_is_open(channel) &&\n         !ssh_channel_is_eof(channel))\n  {\n    nbytes = ssh_channel_read_nonblocking(channel, buffer, sizeof(buffer), 0);\n    if (nbytes < 0) return SSH_ERROR;\n    if (nbytes > 0)\n    {\n      nwritten = write(1, buffer, nbytes);\n      if (nwritten != nbytes) return SSH_ERROR;\n\n    if (!kbhit())\n    {\n      usleep(50000L); // 0.05 second\n      continue;\n    }\n\n    nbytes = read(0, buffer, sizeof(buffer));\n    if (nbytes < 0) return SSH_ERROR;\n    if (nbytes > 0)\n    {\n      nwritten = ssh_channel_write(channel, buffer, nbytes);\n      if (nwritten != nbytes) return SSH_ERROR;\n    }\n  }\n\n  return rc;\n}\n@endcode\n\nOf course, this is a poor terminal emulator, since the echo from the keys\npressed should not be done locally, but should be done by the remote side.\nAlso, user's input should not be sent once \"Enter\" key is pressed, but\nimmediately after each key is pressed. This can be accomplished\nby setting the local terminal to \"raw\" mode with the cfmakeraw(3) function.\ncfmakeraw() is a standard function under Linux, on other systems you can\nrecode it with:\n\n@code\nstatic void cfmakeraw(struct termios *termios_p)\n{\n    termios_p->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);\n    termios_p->c_oflag &= ~OPOST;\n    termios_p->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);\n    termios_p->c_cflag &= ~(CSIZE|PARENB);\n    termios_p->c_cflag |= CS8;\n}\n@endcode\n\nIf you are not using a local terminal, but some kind of graphical\nenvironment, the solution to this kind of \"echo\" problems will be different.\n\n\n@subsection select_loop A more elaborate way to get the remote data\n\n*** Warning: ssh_select() and ssh_channel_select() are not relevant anymore,\n    since libssh is about to provide an easier system for asynchronous\n    communications. This subsection should be removed then. ***\n\nssh_channel_read() and ssh_channel_read_nonblocking() functions are simple,\nbut they are not adapted when you expect data from more than one SSH channel,\nor from other file descriptors. Last example showed how getting data from\nthe standard input (the keyboard) at the same time as data from the SSH\nchannel was complicated. The functions ssh_select() and ssh_channel_select()\nprovide a more elegant way to wait for data coming from many sources.\n\nThe functions ssh_select() and ssh_channel_select() remind of the standard\nUNIX select(2) function. The idea is to wait for \"something\" to happen:\nincoming data to be read, outgoing data to block, or an exception to\noccur. Both these functions do a \"passive wait\", i.e. you can safely use\nthem repeatedly in a loop, it will not consume exaggerate processor time\nand make your computer unresponsive. It is quite common to use these\nfunctions in your application's main loop.\n\nThe difference between ssh_select() and ssh_channel_select() is that\nssh_channel_select() is simpler, but allows you only to watch SSH channels.\nssh_select() is more complete and enables watching regular file descriptors\nas well, in the same function call.\n\nBelow is an example of a function that waits both for remote SSH data to come,\nas well as standard input from the keyboard:\n\n@code\nint interactive_shell_session(ssh_session session, ssh_channel channel)\n{\n  /* Session and terminal initialization skipped */\n  ...\n\n  char buffer[256];\n  int nbytes, nwritten;\n\n  while (ssh_channel_is_open(channel) &&\n         !ssh_channel_is_eof(channel))\n  {\n    struct timeval timeout;\n    ssh_channel in_channels[2], out_channels[2];\n    fd_set fds;\n    int maxfd;\n\n    timeout.tv_sec = 30;\n    timeout.tv_usec = 0;\n    in_channels[0] = channel;\n    in_channels[1] = NULL;\n    FD_ZERO(&fds);\n    FD_SET(0, &fds);\n    FD_SET(ssh_get_fd(session), &fds);\n    maxfd = ssh_get_fd(session) + 1;\n\n    ssh_select(in_channels, out_channels, maxfd, &fds, &timeout);\n\n    if (out_channels[0] != NULL)\n    {\n      nbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);\n      if (nbytes < 0) return SSH_ERROR;\n      if (nbytes > 0)\n      {\n        nwritten = write(1, buffer, nbytes);\n        if (nwritten != nbytes) return SSH_ERROR;\n      }\n    }\n\n    if (FD_ISSET(0, &fds))\n    {\n      nbytes = read(0, buffer, sizeof(buffer));\n      if (nbytes < 0) return SSH_ERROR;\n      if (nbytes > 0)\n      {\n        nwritten = ssh_channel_write(channel, buffer, nbytes);\n        if (nbytes != nwritten) return SSH_ERROR;\n      }\n    }\n  }\n\n  return rc;\n}\n@endcode\n\n\n@subsection x11 Using graphical applications on the remote side\n\nIf your remote application is graphical, you can forward the X11 protocol to\nyour local computer.\n\nTo do that, you first declare that you accept X11 connections with\nssh_channel_accept_x11(). Then you create the forwarding tunnel for\nthe X11 protocol with ssh_channel_request_x11().\n\nThe following code performs channel initialization and shell session\nopening, and handles a parallel X11 connection:\n\n@code\nint interactive_shell_session(ssh_channel channel)\n{\n  int rc;\n  ssh_channel x11channel;\n\n  rc = ssh_channel_request_pty(channel);\n  if (rc != SSH_OK) return rc;\n\n  rc = ssh_channel_change_pty_size(channel, 80, 24);\n  if (rc != SSH_OK) return rc;\n\n  rc = ssh_channel_request_x11(channel, 0, NULL, NULL, 0);\n  if (rc != SSH_OK) return rc;\n\n  rc = ssh_channel_request_shell(channel);\n  if (rc != SSH_OK) return rc;\n\n  /* Read the data sent by the remote computer here */\n  ...\n}\n@endcode\n\nDon't forget to set the $DISPLAY environment variable on the remote\nside, or the remote applications won't try using the X11 tunnel:\n\n@code\n$ export DISPLAY=:0\n$ xclock &\n@endcode\n\n*/\n"
  },
  {
    "path": "src/libssh/doc/tbd.dox",
    "content": "/**\n@page libssh_tutor_todo To be done\n\n*** To be written ***\n\n@section sshd Writing a libssh-based server\n\n*** To be written ***\n\n@section cpp The libssh C++ wrapper\n\n*** To be written ***\n\n*/\n"
  },
  {
    "path": "src/libssh/doc/that_style/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2017 Jan-Lukas Wynen\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "src/libssh/doc/that_style/README.md",
    "content": "# that style\nA plain, more modern HTML style for Doxygen\n\n## Requirements\n- Doxygen (tested with version 1.8.13)\n- *optional*: a sass/scss compiler if you want to modify the style\n\n## Simple usage\nTell Doxygen about the files for that style as shown in [doxyfile.conf](doxyfile.conf). You might need to adjust the\npaths depending on where you installed that style.\nWhen you run Doxygen, all files are copied into to generated HTML folder. So you don't need to keep the originals around\nunless you want to re-generate the documentation.\n\n## Advanced\nthat style uses a custom javascript to hack some nice stripes into some tables. It has to be loaded from HTML. Hence you need\nto use the provided custom header. Since its default content may change when Doxygen is updated, there might be syntax error in\nthe generated HTML. If this is the case, you can remove the custom header (adjust your doxyfile.conf). This has no\ndisadvantages other than removing the stripes.\n\n[that_style.css](that_style.css) was generated from the scss files in the folder [sass](sass). If you want to change the style,\nuse those files in order to have better control. For instance, you can easily change most colors by modifying the variables\nin the beginning of [that_style.scss](sass/that_style.scss).\n"
  },
  {
    "path": "src/libssh/doc/that_style/header.html",
    "content": "<!-- HTML header for doxygen 1.8.13-->\n<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset=UTF-8\"/>\n<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9\"/>\n<meta name=\"generator\" content=\"Doxygen $doxygenversion\"/>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"/>\n<!--BEGIN PROJECT_NAME--><title>$projectname: $title</title><!--END PROJECT_NAME-->\n<!--BEGIN !PROJECT_NAME--><title>$title</title><!--END !PROJECT_NAME-->\n<link href=\"$relpath^tabs.css\" rel=\"stylesheet\" type=\"text/css\"/>\n<script type=\"text/javascript\" src=\"$relpath^jquery.js\"></script>\n<script type=\"text/javascript\" src=\"$relpath^dynsections.js\"></script>\n$treeview\n$search\n$mathjax\n<link href=\"$relpath^$stylesheet\" rel=\"stylesheet\" type=\"text/css\" />\n<script src=\"$relpath^striped_bg.js\"></script>\n$extrastylesheet\n</head>\n<body>\n<div id=\"top\"><!-- do not remove this div, it is closed by doxygen! -->\n\n<!--BEGIN TITLEAREA-->\n<div id=\"titlearea\">\n<table cellspacing=\"0\" cellpadding=\"0\">\n <tbody>\n <tr style=\"height: 56px;\">\n  <!--BEGIN PROJECT_LOGO-->\n  <td id=\"projectlogo\"><img alt=\"Logo\" src=\"$relpath^$projectlogo\"/></td>\n  <!--END PROJECT_LOGO-->\n  <!--BEGIN PROJECT_NAME-->\n  <td id=\"projectalign\" style=\"padding-left: 0.5em;\">\n   <div id=\"projectname\">$projectname\n   <!--BEGIN PROJECT_NUMBER-->&#160;<span id=\"projectnumber\">$projectnumber</span><!--END PROJECT_NUMBER-->\n   </div>\n   <!--BEGIN PROJECT_BRIEF--><div id=\"projectbrief\">$projectbrief</div><!--END PROJECT_BRIEF-->\n  </td>\n  <!--END PROJECT_NAME-->\n  <!--BEGIN !PROJECT_NAME-->\n   <!--BEGIN PROJECT_BRIEF-->\n    <td style=\"padding-left: 0.5em;\">\n    <div id=\"projectbrief\">$projectbrief</div>\n    </td>\n   <!--END PROJECT_BRIEF-->\n  <!--END !PROJECT_NAME-->\n  <!--BEGIN DISABLE_INDEX-->\n   <!--BEGIN SEARCHENGINE-->\n   <td>$searchbox</td>\n   <!--END SEARCHENGINE-->\n  <!--END DISABLE_INDEX-->\n </tr>\n </tbody>\n</table>\n</div>\n<!--END TITLEAREA-->\n<!-- end header part -->\n"
  },
  {
    "path": "src/libssh/doc/that_style/js/striped_bg.js",
    "content": "// Adds extra CSS classes \"even\" and \"odd\" to .memberdecls to allow\n// striped backgrounds.\nfunction MemberDeclsStriper () {\n    var counter = 0;\n    \n    this.stripe = function() {\n        $(\".memberdecls tbody\").children().each(function(i) {\n            \n            // reset counter at every heading -> always start with even\n            if ($(this).is(\".heading\")) {\n                counter = 0;\n            }\n\n            // add extra classes\n            if (counter % 2 == 1) {\n                $(this).addClass(\"odd\");\n            }\n            else {\n                $(this).addClass(\"even\");\n            }\n\n            // advance counter at every separator\n            // this is the only way to reliably detect which table rows belong together\n            if ($(this).is('[class^=\"separator\"]')) {\n                counter++;\n            }\n        });\n    }\n}\n\n// execute the function\n$(document).ready(new MemberDeclsStriper().stripe);\n"
  },
  {
    "path": "src/libssh/doc/that_style/that_style.css",
    "content": "@charset \"UTF-8\";\n/*\n * My own little style\n */\nbody, table, div, p, dl {\n  font: 400 14px/22px Roboto,sans-serif; }\n\nh1.groupheader {\n  font-size: 150%; }\n\n.title {\n  font: 400 14px/28px Roboto,sans-serif;\n  font-size: 150%;\n  font-weight: bold;\n  margin: 10px 2px; }\n\nh2.groupheader {\n  border-bottom: 1px solid #555555;\n  color: black;\n  font-size: 200%;\n  font-weight: bold;\n  margin-top: 1.75em;\n  padding-top: 1em;\n  padding-bottom: 4px;\n  width: 100%; }\n\ntr.heading h2 {\n  border-bottom: 1px solid #a5a5a5;\n  font-size: 150%;\n  margin-top: 6px;\n  margin-bottom: 6px;\n  padding-top: 3px;\n  padding-bottom: 7px; }\n\nh2.groupheader a {\n  margin-left: 1%; }\n\nh3.groupheader {\n  font-size: 100%; }\n\nh1, h2, h3, h4, h5, h6 {\n  -webkit-transition: none;\n  -moz-transition: none;\n  -o-transition: none;\n  transition: none;\n  margin-right: 15px; }\n  h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow {\n    text-shadow: none;\n    color: #5f082b; }\n\ndt {\n  font-weight: bold; }\n\ndiv.multicol {\n  -moz-column-gap: 1em;\n  -webkit-column-gap: 1em;\n  -moz-column-count: 3;\n  -webkit-column-count: 3; }\n\np.startli, p.startdd {\n  margin-top: 2px; }\n\np.starttd {\n  margin-top: 0px; }\n\np.endli {\n  margin-bottom: 0px; }\n\np.enddd {\n  margin-bottom: 4px; }\n\np.endtd {\n  margin-bottom: 2px; }\n\n#top {\n  border: none;\n  position: relative;\n  z-index: 100;\n  -moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.4), 0 0 8px rgba(0, 0, 0, 0.3);\n  -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.4), 0 0 8px rgba(0, 0, 0, 0.3);\n  -o-box-shadow: 0 0 4px rgba(0, 0, 0, 0.4), 0 0 8px rgba(0, 0, 0, 0.3);\n  box-shadow: 0 0 4px rgba(0, 0, 0, 0.4), 0 0 8px rgba(0, 0, 0, 0.3); }\n\ncaption {\n  font-weight: bold; }\n\nspan.legend {\n  font-size: 70%;\n  text-align: center; }\n\nh3.version {\n  font-size: 90%;\n  text-align: center; }\n\ndiv.qindex, div.navtab {\n  background-color: #ffffff;\n  border: none;\n  text-align: center; }\n\ndiv.qindex, div.navpath {\n  width: 100%;\n  line-height: 140%; }\n\ndiv.navtab {\n  margin-right: 15px; }\n\na, a:visited {\n  color: #00549f;\n  font-weight: normal;\n  text-decoration: none; }\n\n.contents a:visited {\n  color: #4665A2; }\n\na:hover {\n  text-decoration: underline; }\n\na.qindex {\n  font-weight: bold;\n  text-transform: uppercase; }\n\na.qindexHL {\n  font-weight: bold;\n  background-color: #9CAFD4;\n  color: #ffffff;\n  border: 1px double #869DCA; }\n\n.contents a.qindexHL:visited {\n  color: #ffffff; }\n\na.el, a.el:visited {\n  font-weight: normal;\n  color: #00549f; }\n\na.elRef, a.elRef:visited {\n  font-family: monospace;\n  color: #006bc8; }\n\n/*\n * The main menu at the top\n */\n#main-menu {\n  background-image: none;\n  background: #414141;\n  padding: 0; }\n\n.sm-dox > li:not(:last-child) > a {\n  background-image: none;\n  text-shadow: none;\n  color: white;\n  font-weight: normal;\n  letter-spacing: 1px;\n  font-size: 11pt;\n  text-transform: uppercase; }\n\n.sm-dox > li:not(:last-child) > a:hover,\n.sm-dox > li:not(:last-child) > a.highlighted {\n  background-color: #5f082b; }\n\n.sm-dox a span.sub-arrow {\n  border-color: white transparent transparent; }\n\n.sm-dox ul {\n  border: none;\n  -moz-border-radius: 0 !important;\n  -webkit-border-radius: 0 !important;\n  border-radius: 0 !important;\n  padding: 0;\n  background: #414141;\n  -moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);\n  -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);\n  -o-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);\n  box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2); }\n  .sm-dox ul a {\n    background: inherit;\n    color: white;\n    font-weight: normal;\n    letter-spacing: 1px;\n    font-size: 11pt; }\n  .sm-dox ul a:hover {\n    background: #5f082b;\n    color: white;\n    font-weight: normal;\n    letter-spacing: 1px;\n    font-size: 11pt; }\n  .sm-dox ul a.highlighted {\n    background: #5f082b;\n    color: white;\n    font-weight: normal;\n    letter-spacing: 1px;\n    font-size: 11pt; }\n  .sm-dox ul a span.sub-arrow {\n    /* this sets the color of the arrow */\n    border-color: white transparent transparent; }\n\ndl.el {\n  margin-left: -1cm; }\n\ndiv.ah, span.ah {\n  background: none;\n  color: black;\n  margin-bottom: 3px;\n  margin-top: 3px;\n  padding: 0.2em;\n  border: none;\n  -moz-border-radius: 0;\n  -webkit-border-radius: 0;\n  border-radius: 0;\n  -moz-box-shadow: none;\n  -webkit-box-shadow: none;\n  -o-box-shadow: none;\n  box-shadow: none;\n  font: 14pt monospace;\n  font-weight: bold;\n  text-transform: uppercase; }\n\ndiv.classindex ul {\n  list-style: none;\n  padding-left: 0; }\n\ndiv.classindex span.ai {\n  display: inline-block; }\n\ndiv.groupHeader {\n  margin-left: 16px;\n  margin-top: 12px;\n  font-weight: bold; }\n\ndiv.groupText {\n  margin-left: 16px;\n  font-style: italic; }\n\nbody {\n  background-color: #ffffff;\n  color: black;\n  margin: 0; }\n\n#doc-content {\n  background-color: #111;\n  color: #ffffff; }\n\ndiv.contents {\n  color: black;\n  background-color: #ffffff;\n  padding: 0;\n  margin: 5pt; }\n  div.contents hr {\n    display: none;\n    visibility: hidden; }\n\ndiv.header + div.contents {\n  padding: 1ex;\n  margin: 0 5pt 5pt 5pt; }\n\ndiv.textblock {\n  padding: 1ex 1ex 0 1ex; }\n\ndiv.textblock + ul {\n  padding-bottom: 1%; }\n\nimg.footer {\n  border: 0px;\n  vertical-align: middle; }\n\n/*\n Basic styling for fragments shared by all themes.\n*/\ndiv.fragment {\n  padding: 4px;\n  margin: 4px 8px 4px 2px;\n  color: #bebebe;\n  background-color: #323232;\n  border: 3px solid #e8e8e8;\n  border-radius: 2px;\n  overflow-y: hidden;\n  overflow-x: auto;\n  position: relative; }\n\ndiv.line {\n  font-family: monospace, fixed;\n  font-size: 13px;\n  min-height: 13px;\n  line-height: 1.0;\n  text-indent: -53px;\n  margin: 0px;\n  padding: 1px 0 1px 53px;\n  white-space: pre;\n  -webkit-transition: background-color;\n  -moz-transition: background-color;\n  -o-transition: background-color;\n  transition: background-color;\n  -webkit-duration: 0s;\n  -moz-duration: 0s;\n  -o-duration: 0s;\n  duration: 0s; }\n  div.line:hover {\n    background-color: #1a1a1a; }\n  div.line::after {\n    content: \"\\000A\";\n    white-space: pre; }\n\nspan.lineno {\n  padding-right: 4px;\n  text-align: right;\n  color: black;\n  height: 100px;\n  white-space: pre;\n  border-right: 3px solid #1d7567;\n  background-color: #323232; }\n\nspan.lineno a, span.lineno a:visited {\n  background-color: inherit;\n  color: #1e595a; }\n\nspan.lineno a:hover {\n  background-color: #C8C8C8;\n  text-decoration: none; }\n\n.lineno {\n  -webkit-touch-callout: none;\n  -webkit-user-select: none;\n  -khtml-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none; }\n\ndiv.fragment {\n  color: #bebebe;\n  background-color: #323232; }\n\ndiv.fragment::before {\n  background-color: #1a1a1a;\n  border-right: 1px solid #3e3e3e; }\n\ndiv.line:hover {\n  background-color: #1a1a1a; }\n\nspan.lineno {\n  color: #969696;\n  background-color: #323232;\n  border-right: 1px solid #3e3e3e; }\n\nspan.lineno a, span.lineno a:visited {\n  background-color: inherit;\n  color: #dcdcdc; }\n\nspan.lineno a:hover {\n  background-color: #323232; }\n\na.code, a.code:visited {\n  color: #6cc7eb; }\n\na.codeRef, a.codeRef:visited {\n  color: #3d95e6; }\n\nspan.keyword {\n  color: #98f77a;\n  font-weight: bold; }\n\nspan.keywordtype {\n  color: #ffa0a0; }\n\nspan.keywordflow {\n  color: #98f77a;\n  font-weight: bold; }\n\nspan.comment {\n  color: #999;\n  font-style: oblique; }\n\nspan.preprocessor {\n  color: #cd5c57; }\n\nspan.stringliteral {\n  color: #64b041; }\n\nspan.charliteral {\n  color: #64b041; }\n\nblockquote {\n  background-color: #F7F8FB;\n  border-left: 2px solid #9CAFD4;\n  margin: 0 24px 0 4px;\n  padding: 0 12px 0 16px; }\n\n/*\n * The search box\n */\n.sm-dox > li:last-child {\n  margin-right: 10pt; }\n\n#MSearchBox {\n  border: 2px inset black;\n  display: table;\n  width: 350px;\n  height: 26px;\n  background: white;\n  margin-top: 5px; }\n  #MSearchBox .left {\n    background-image: none;\n    display: table-cell;\n    width: 100%;\n    height: inherit;\n    left: 0; }\n  #MSearchBox .right {\n    background-image: none;\n    width: 0;\n    display: none;\n    visibility: hidden; }\n\nnav > #MSearchBox {\n  border: 2px solid #666666;\n  margin: 5px 10pt 0 0;\n  height: 22px; }\n\n#MSearchSelect, .left #MSearchSelect {\n  left: 0;\n  background-image: url(\"mag_glass.svg\");\n  width: 22px;\n  height: 22px;\n  padding: 22px 22px 0 0;\n  margin: 0 4px 0 4px;\n  box-sizing: border-box; }\n\n#MSearchField {\n  background-image: none;\n  display: table-cell;\n  margin: 0;\n  margin-left: 30px;\n  width: calc(100% - 34px);\n  height: 22px;\n  font: 11pt sans-serif; }\n\n#MSearchSelectWindow {\n  background-color: #414141;\n  padding: 0;\n  border: solid 1px black;\n  -moz-border-radius: 0;\n  -webkit-border-radius: 0;\n  border-radius: 0;\n  -moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);\n  -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);\n  -o-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);\n  box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2); }\n\na.SelectItem {\n  color: white;\n  padding: 3px 4px;\n  font: 10pt sans-serif;\n  letter-spacing: 1px; }\n  a.SelectItem:hover {\n    background-color: #5f082b;\n    color: white; }\n  a.SelectItem:focus, a.SelectItem:active {\n    color: white; }\n\n#MSearchResultsWindow {\n  background-color: white;\n  -moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);\n  -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);\n  -o-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);\n  box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2); }\n\ntable.memberdecls {\n  width: 100%;\n  border-spacing: 0px;\n  padding: 0px;\n  margin-top: 7px;\n  background-color: #ffffff;\n  -moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);\n  -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);\n  -o-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);\n  box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2); }\n\n.memberdecls tbody {\n  background-color: #ffffff; }\n\n.memberdecls .odd {\n  background: #f6f6f6; }\n\n/* all but last separator show a line */\n.memberdecls tr[class^=\"separator\"]:not(:last-child) .memSeparator {\n  border-bottom: 1px solid #c5c5c5;\n  line-height: 1px;\n  margin: 0;\n  padding: 0; }\n\n.memberdecls tr[class^=\"separator\"]:last-child .memSeparator {\n  border-bottom: none;\n  line-height: 0;\n  margin: 0;\n  padding: 0; }\n\ntable.fieldtable {\n  -moz-border-radius: 0;\n  -webkit-border-radius: 0;\n  border-radius: 0;\n  -moz-box-shadow: none;\n  -webkit-box-shadow: none;\n  -o-box-shadow: none;\n  box-shadow: none; }\n\n.memberdecls td, .fieldtable tr {\n  background-color: inherit; }\n\n.fieldtable th {\n  display: none;\n  height: 0;\n  visibility: hidden; }\n\ntd.fieldname {\n  color: #820a32;\n  font-family: monospace;\n  font-weight: bold; }\n\nth.markdownTableHeadLeft, th.markdownTableHeadRight,\nth.markdownTableHeadCenter, th.markdownTableHeadNone {\n  background-color: #414141;\n  color: white; }\n\n.memItemLeft, .memItemRight,\n.memTemplItemLeft, .memTemplItemRight, .memTemplParams {\n  font-family: monospace;\n  background-color: #ffffff;\n  border: none;\n  margin: 4px;\n  padding: 1px 0 0 8px; }\n\n.mdescLeft, .mdescRight {\n  background-color: #ffffff;\n  border: none;\n  margin: 4px;\n  padding: 1px 0 0 8px; }\n\n.mdescLeft, .mdescRight {\n  padding: 0px 8px 4px 8px;\n  color: #555; }\n\n.memItemLeft, .memTemplItemLeft {\n  white-space: nowrap; }\n\n.memItemRight {\n  width: 100%; }\n\n.memTemplParams {\n  color: black;\n  white-space: nowrap;\n  font-size: 100%; }\n\n/* Styles for detailed member documentation */\n.memtitle {\n  padding: 8px;\n  border: none;\n  margin-bottom: -1px;\n  background-image: none;\n  background-color: #f6f6f6;\n  line-height: 1.25;\n  font-weight: bold;\n  color: black;\n  float: left;\n  z-index: 0;\n  position: relative;\n  -moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);\n  -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);\n  -o-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);\n  box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2); }\n\n.permalink {\n  font-size: 100%;\n  display: inline-block;\n  vertical-align: middle; }\n\n/* replace content of permalinks */\n.permalink a {\n  visibility: hidden; }\n\n.permalink a:after {\n  content: \"§\";\n  visibility: visible;\n  display: block;\n  position: absolute;\n  color: black;\n  top: 20%; }\n\n.permalink a:visited {\n  color: black; }\n\n.memtemplate {\n  font-size: 100%;\n  color: black;\n  font-family: monospace;\n  font-weight: normal;\n  margin-left: 9px; }\n\n.memnav {\n  background-color: #EBEFF6;\n  border: 1px solid #A3B4D7;\n  text-align: center;\n  margin: 2px;\n  margin-right: 15px;\n  padding: 2px; }\n\n.mempage {\n  width: 100%; }\n\n.memitem {\n  font-family: monospace;\n  padding: 0;\n  margin-bottom: 10px;\n  margin-right: 5px;\n  -webkit-transition: none;\n  -moz-transition: none;\n  -ms-transition: none;\n  -o-transition: none;\n  transition: none;\n  display: table !important;\n  width: 100%;\n  background-color: #f6f6f6;\n  -moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);\n  -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);\n  -o-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);\n  box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2); }\n\n.memitem.glow {\n  -moz-box-shadow: none;\n  -webkit-box-shadow: none;\n  -o-box-shadow: none;\n  box-shadow: none; }\n\n.memname {\n  font-family: monospace;\n  font-weight: 400;\n  margin-left: 6px; }\n\n.memname td {\n  vertical-align: bottom; }\n\n.memproto, dl.reflist dt {\n  border: none;\n  padding: 6px 0px 6px 0px;\n  color: black;\n  font-weight: bold;\n  text-shadow: none;\n  background-color: #f6f6f6;\n  position: relative;\n  z-index: 1;\n  -moz-box-shadow: none;\n  -webkit-box-shadow: none;\n  -o-box-shadow: none;\n  box-shadow: none; }\n\n.overload {\n  font-family: \"courier new\",courier,monospace;\n  font-size: 65%; }\n\n.memdoc, dl.reflist dd {\n  border: none;\n  border-left: 4px solid #5f082b;\n  border-bottom-left-radius: 0px;\n  border-bottom-right-radius: 0px;\n  -webkit-border-bottom-left-radius: 0px;\n  -webkit-border-bottom-right-radius: 0px;\n  -moz-border-bottom-left-radius: 0px;\n  -moz-border-bottom-right-radius: 0px;\n  padding: 2px 1% 2px 1%;\n  margin: 1%;\n  background-color: #ffffff;\n  background-image: none;\n  -moz-box-shadow: none;\n  -webkit-box-shadow: none;\n  -o-box-shadow: none;\n  box-shadow: none;\n  /* allow movement of elements inside */\n  display: flex;\n  flex-direction: column; }\n\n/* overrides for docs on individual pages */\n.memtitle:nth-child(2) {\n  width: 0;\n  height: 0;\n  display: none;\n  visibility: hidden; }\n\n.memitem:nth-child(3) {\n  margin: 0;\n  margin-top: 0.5%;\n  background-color: #ffffff;\n  -moz-box-shadow: none;\n  -webkit-box-shadow: none;\n  -o-box-shadow: none;\n  box-shadow: none; }\n\n.memitem:nth-child(3) .memproto {\n  padding: 10px;\n  background-color: #ffffff;\n  margin-bottom: 10px; }\n\n.memitem:nth-child(3) .memproto::after {\n  content: \"\";\n  width: 99%;\n  height: 1px;\n  position: absolute;\n  bottom: -10px;\n  left: 0.5%;\n  background: #666; }\n\n.memitem:nth-child(3) .memdoc {\n  border: none;\n  padding: 0; }\n\n.memitem:nth-child(3) table.memname {\n  background-color: #f6f6f6;\n  border-collapse: collapse;\n  border-spacing: initial;\n  border: 1px solid #aaa; }\n\n.memitem:nth-child(3) table.memname tr:not(:last-child) {\n  border-bottom: 1px dashed #aaa; }\n\ndl.reflist dt {\n  padding: 5px;\n  z-index: 0;\n  /* cover the top shadow of dd */\n  position: relative;\n  -moz-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);\n  -webkit-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);\n  -o-box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2);\n  box-shadow: 0 0 4px rgba(0, 0, 0, 0.35), 0 0 8px rgba(0, 0, 0, 0.2); }\n\n/* cover up the shadow at the bottom */\ndl.reflist dt::after {\n  content: \" \";\n  width: 100%;\n  display: block;\n  height: 8px;\n  position: absolute;\n  background-color: #f6f6f6;\n  left: 0;\n  bottom: -8px; }\n\ndl.reflist dd {\n  border-left: 4px solid #5f082b;\n  padding: 2px 1% 2px 1%;\n  margin: 8px 8px 24px 8px;\n  outline: 8px solid #f6f6f6;\n  -moz-box-shadow: 0 0 4px 8px rgba(0, 0, 0, 0.35), 0 0 8px 8px rgba(0, 0, 0, 0.2);\n  -webkit-box-shadow: 0 0 4px 8px rgba(0, 0, 0, 0.35), 0 0 8px 8px rgba(0, 0, 0, 0.2);\n  -o-box-shadow: 0 0 4px 8px rgba(0, 0, 0, 0.35), 0 0 8px 8px rgba(0, 0, 0, 0.2);\n  box-shadow: 0 0 4px 8px rgba(0, 0, 0, 0.35), 0 0 8px 8px rgba(0, 0, 0, 0.2); }\n\ndl.reflist dd p::before {\n  font-size: 85%;\n  content: \"\\25B6\\00A0\\00A0\";\n  display: inline-block;\n  width: 12pt; }\n\ndl.reflist dd p {\n  margin-top: 4px;\n  margin-bottom: 4px; }\n\n.paramkey {\n  text-align: right; }\n\n.paramtype {\n  font-family: monospace;\n  white-space: nowrap;\n  color: #002546; }\n\n.paramname {\n  color: black;\n  font-family: monospace;\n  white-space: nowrap; }\n\n.paramname em {\n  color: #820a32;\n  font-style: normal; }\n\n.paramname code {\n  color: #404040;\n  line-height: 14px; }\n\n.params, .retval, .exception, .tparams {\n  margin-left: 0;\n  padding-left: 0;\n  margin-bottom: -0.25em; }\n\n.params dt, .tparams dt {\n  margin-bottom: 0.5em; }\n\n.params .paramname, .tparams .paramname, .retval .paramname, .exception .paramname {\n  color: #820a32;\n  font-family: monospace;\n  font-weight: bold;\n  vertical-align: top; }\n\n.params .paramtype, .tparams .paramtype {\n  font-family: monospace;\n  font-style: italic;\n  vertical-align: top; }\n\n.params .paramdir, .tparams .paramdir {\n  font-family: \"courier new\",courier,monospace;\n  vertical-align: top; }\n\n/* line over parameters docs */\n.params, .tparams {\n  border-collapse: collapse; }\n\n.params tr, .tparams tr {\n  -moz-box-shadow: 0 -2px 0 -1px #606060;\n  -webkit-box-shadow: 0 -2px 0 -1px #606060;\n  -o-box-shadow: 0 -2px 0 -1px #606060;\n  box-shadow: 0 -2px 0 -1px #606060; }\n\n.params .paramname, .tparams .paramname {\n  border-top: 2px solid #5f082b;\n  padding-right: 5pt; }\n\n.params td, .tparams td {\n  padding-bottom: 1em; }\n\ntable.mlabels {\n  border-spacing: 0px; }\n\ntd.mlabels-left {\n  width: 100%;\n  padding: 0px; }\n\ntd.mlabels-right {\n  vertical-align: bottom;\n  padding: 0px;\n  white-space: nowrap; }\n\nspan.mlabels {\n  margin-left: 8px; }\n\nspan.mlabel {\n  background-color: #444444;\n  border: none;\n  border-radius: 3px;\n  text-shadow: none;\n  color: white;\n  margin-right: 4px;\n  padding: 3px 5px;\n  font-size: 8pt;\n  white-space: nowrap;\n  vertical-align: middle; }\n\n.memdoc .definition {\n  position: relative;\n  padding-top: 0.5em;\n  /* move definition line to bottom of memdoc */\n  order: 3; }\n  .memdoc .definition::before {\n    content: \"\";\n    width: 33%;\n    height: 1px;\n    border-top: 1px solid black;\n    position: absolute;\n    top: 0; }\n\ntable.directory {\n  border-top: 1px solid #c5c5c5;\n  border-bottom: 1px solid #c5c5c5;\n  border-collapse: collapse;\n  width: 100%;\n  font: 400 14px Roboto,sans-serif; }\n  table.directory tr {\n    background-color: white !important; }\n    table.directory tr.even {\n      background-color: #f6f6f6 !important; }\n    table.directory tr:hover {\n      background-color: #e6e6e6 !important; }\n  table.directory td.entry {\n    padding: 1.5pt 3pt 1.5pt 3pt;\n    white-space: normal; }\n\ndiv.directory {\n  border: none; }\n  div.directory table.directory tr {\n    line-height: 17pt; }\n  div.directory table.directory td {\n    margin: 0;\n    padding: 0.5pt 6pt 0.5pt 0;\n    vertical-align: middle; }\n    div.directory table.directory td.entry {\n      white-space: nowrap; }\n    div.directory table.directory td.desc {\n      width: 100%;\n      padding-left: 6pt;\n      border-left: 1px solid rgba(0, 0, 0, 0.05); }\n\n.directory .levels {\n  white-space: nowrap;\n  width: 100%;\n  text-align: right;\n  font-size: 9pt; }\n  .directory .levels span {\n    cursor: pointer;\n    padding-left: 2px;\n    padding-right: 2px;\n    color: #00549f; }\n    .directory .levels span:hover {\n      text-decoration: underline; }\n\n/*\n * The tree view on the left\n */\n.arrow {\n  color: black;\n  cursor: pointer;\n  font-size: 80%;\n  display: inline-block;\n  width: 16px;\n  height: 22px;\n  margin-left: 4px;\n  -webkit-user-select: none;\n  -khtml-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none; }\n  .arrow:hover {\n    color: black; }\n\n#selected .arrow {\n  color: white; }\n  #selected .arrow:hover {\n    color: #d2d2d2; }\n\n#nav-tree {\n  background-image: none;\n  background-color: white; }\n  #nav-tree .item {\n    margin: 0; }\n    #nav-tree .item:hover {\n      background-color: #d2d2d2; }\n  #nav-tree .selected {\n    background-image: none;\n    background-color: #5f082b;\n    color: white;\n    text-shadow: none; }\n    #nav-tree .selected:hover {\n      background-image: none;\n      background-color: #5f082b;\n      color: white;\n      text-shadow: none; }\n  #nav-tree a {\n    color: black; }\n\n.ui-resizable-e {\n  background: #808080 url(\"splitbar_handle.svg\") no-repeat center;\n  border-right: solid 1px #c0c0c0;\n  border-left: solid 1px black; }\n  .ui-resizable-e:hover {\n    background-color: #606060; }\n\n.icon {\n  font-family: monospace;\n  font-weight: bold;\n  font-size: 12px;\n  height: 15px;\n  width: 15px;\n  display: inline-block;\n  background-color: #444444;\n  color: white;\n  text-align: center;\n  border-radius: 3px;\n  margin: 0;\n  padding-top: 1px;\n  text-indent: -1px; }\n\n.icona {\n  width: 0;\n  height: 0;\n  display: none;\n  visibility: hidden; }\n\n.iconfopen {\n  width: 24px;\n  height: 18px;\n  margin-bottom: 4px;\n  background-image: url(\"folderopen.svg\");\n  background-position: 0;\n  background-repeat: no-repeat;\n  vertical-align: top;\n  display: inline-block; }\n\n.iconfclosed {\n  width: 24px;\n  height: 18px;\n  margin-bottom: 4px;\n  background-image: url(\"folderclosed.svg\");\n  background-position: 0;\n  background-repeat: no-repeat;\n  vertical-align: top;\n  display: inline-block; }\n\n.icondoc {\n  width: 24px;\n  height: 18px;\n  margin-bottom: 4px;\n  background-image: url(\"doc.svg\");\n  background-position: 0;\n  background-repeat: no-repeat;\n  vertical-align: top;\n  display: inline-block; }\n\ndiv.dynheader {\n  margin-top: 8px;\n  -webkit-touch-callout: none;\n  -webkit-user-select: none;\n  -khtml-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none; }\n\naddress {\n  font-style: normal;\n  color: #2A3D61; }\n\ntable.doxtable caption {\n  caption-side: top; }\n\ntable.doxtable {\n  border-collapse: collapse;\n  margin-top: 4px;\n  margin-bottom: 4px; }\n\ntable.doxtable td, table.doxtable th {\n  border: 1px solid #444444;\n  padding: 3px 7px 2px; }\n\ntable.doxtable th {\n  background-color: #444444;\n  color: #FFFFFF;\n  font-size: 110%;\n  padding-bottom: 4px;\n  padding-top: 5px; }\n\n/*\n * The line at the bottom\n */\n.navpath {\n  /* intermediate navelems */\n  /* first navelem */\n  /* last navelem */ }\n  .navpath ul {\n    font-size: 11px;\n    background-image: none;\n    height: 30px;\n    line-height: 30px;\n    color: black;\n    border: none;\n    border-top: 1px solid #808080;\n    overflow: hidden;\n    margin: 0px;\n    padding: 0px; }\n  .navpath li:not(:first-child) {\n    list-style-type: none;\n    float: left;\n    padding-left: 18px;\n    padding-right: 10px;\n    color: black;\n    background-color: white;\n    background-image: url(\"nav_edge_inter.svg\");\n    background-repeat: no-repeat;\n    background-position: left -1px;\n    background-size: auto 100%; }\n  .navpath li:first-child {\n    list-style-type: none;\n    float: left;\n    padding-left: 15px;\n    padding-right: 10px;\n    color: black;\n    background-color: white;\n    background-image: none; }\n  .navpath li:nth-last-child(2) {\n    list-style-type: none;\n    float: left;\n    padding-left: 10px;\n    padding-right: 15px;\n    color: white;\n    background-color: #5f082b;\n    background-image: url(\"nav_edge_right.svg\");\n    background-repeat: no-repeat;\n    background-position: right -1px;\n    background-size: auto 100%; }\n  .navpath li:nth-last-child(2):not(:first-child) {\n    list-style-type: none;\n    float: left;\n    padding-left: 15px;\n    padding-right: 15px;\n    color: white;\n    background-color: #5f082b;\n    background-image: url(\"nav_edge_left.svg\"), url(\"nav_edge_right.svg\");\n    background-repeat: no-repeat;\n    background-position: -1px -1px, right -1px;\n    background-size: auto 100%; }\n  .navpath li.navelem a, .navpath .navpath li.navelem b {\n    height: 32px;\n    display: block;\n    text-decoration: none;\n    outline: none;\n    color: inherit;\n    font-family: Roboto,sans-serif;\n    text-shadow: none;\n    text-decoration: none;\n    font-weight: normal; }\n  .navpath li.navelem a:hover {\n    color: inherit;\n    text-decoration: underline; }\n  .navpath li.footer {\n    list-style-type: none;\n    float: right;\n    padding-left: 0;\n    padding-right: 10px;\n    background-color: #d5d5d5;\n    background-image: none;\n    color: black;\n    font-size: 8pt; }\n    .navpath li.footer:before {\n      content: \"\";\n      width: 13px;\n      height: 30px;\n      display: inline-block;\n      float: left;\n      background-image: url(\"nav_edge_right.svg\");\n      background-repeat: no-repeat;\n      background-position: right 0;\n      background-size: auto 100%;\n      /* flip the element horizontally */\n      -moz-transform: scaleX(-1);\n      -o-transform: scaleX(-1);\n      -webkit-transform: scaleX(-1);\n      transform: scaleX(-1);\n      filter: FlipH;\n      -ms-filter: \"FlipH\"; }\n\ndiv.summary {\n  -webkit-order: 2;\n  order: 2;\n  float: right;\n  font-size: 8pt;\n  padding-right: 5px;\n  width: 50%;\n  text-align: right;\n  margin-right: 0.5%; }\n\ndiv.summary a {\n  white-space: nowrap; }\n\ntable.classindex {\n  margin: 10px;\n  white-space: nowrap;\n  margin-left: 1%;\n  margin-right: 1%;\n  width: 98%;\n  border: none;\n  border-top: 1px solid black;\n  border-bottom: 1px solid black;\n  border-spacing: 0.5em;\n  padding: 0; }\n\ndiv.ingroups {\n  font-size: 8pt;\n  width: 50%;\n  text-align: left; }\n\ndiv.ingroups a {\n  white-space: nowrap; }\n\ndiv.header {\n  display: -webkit-flex;\n  display: flex;\n  justify-content: space-between;\n  background-image: none;\n  background-color: #ffffff;\n  color: black;\n  margin: 5pt 5pt 0 5pt;\n  padding: 0 1ex 0 1ex;\n  align-items: center;\n  justify-content: center;\n  border-bottom: none;\n  position: relative; }\n\ndiv.header::after {\n  content: \"\";\n  height: 2px;\n  width: 99%;\n  position: absolute;\n  bottom: -5px;\n  left: 0.5%;\n  background: #666; }\n\ndiv.headertitle {\n  -webkit-order: 1;\n  order: 1;\n  margin-right: auto;\n  text-align: center; }\n\ndl {\n  padding: 0; }\n\ndl.section {\n  margin-left: 0px;\n  padding-left: 0px; }\n\ndl.section > dt {\n  font-weight: bold;\n  font-family: sans-serif; }\n\ndl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant,\ndl.deprecated, dl.todo, dl.test, dl.bug {\n  margin-left: -7px;\n  padding-left: 3px; }\n\ndl.note {\n  padding-left: 7px;\n  border: none; }\n\ndl.warning {\n  background-color: #ffe6ea;\n  border: 1px solid #ff0728;\n  border-left: 4px solid #ff0728;\n  padding-top: 4px;\n  padding-bottom: 3px; }\n\ndl.attention {\n  border-left: 4px solid #ff0728; }\n\ndl.pre, dl.post, dl.invariant {\n  background-color: #f0ffe6;\n  border: 1px solid #5eb82a;\n  border-left: 4px solid #5eb82a; }\n\ndl.deprecated {\n  background-color: #f6f6f6;\n  border: 1px solid black; }\n\ndl.todo {\n  border-left: 4px solid #e8d500; }\n\ndl.test {\n  border-left: 4px solid #00549f; }\n\ndl.bug {\n  background-color: #f6f6f6;\n  border: 1px solid #cc071e;\n  border-left: 4px solid #cc071e; }\n\ndl.section dd {\n  margin-bottom: 6px; }\n\n.memdoc dl dt a.el {\n  font-weight: bold;\n  color: black; }\n\n#projectlogo {\n  text-align: center;\n  vertical-align: bottom;\n  border-collapse: separate; }\n\n#projectlogo img {\n  border: 0px none; }\n\n#projectalign {\n  vertical-align: middle; }\n\n#projectname {\n  font: 300% Tahoma, Arial,sans-serif;\n  margin: 0px;\n  padding: 2px 0px; }\n\n#projectbrief {\n  font: 120% Tahoma, Arial,sans-serif;\n  margin: 0px;\n  padding: 0px; }\n\n#projectnumber {\n  font: 50% Roboto,sans-serif;\n  margin: 0px;\n  padding: 0px; }\n\n#titlearea {\n  padding: 0px;\n  margin: 0px;\n  width: 100%;\n  border-bottom: none; }\n  #titlearea:nth-last-child(2) {\n    border-bottom: 2px solid #444444; }\n\n.image {\n  text-align: center; }\n\n.dotgraph, .mscgraph, .diagraph {\n  text-align: center; }\n\n.caption {\n  font-weight: bold; }\n\ndiv.zoom {\n  border: 1px solid #90A5CE; }\n\ndl.citelist {\n  margin-bottom: 5ex; }\n  dl.citelist dt {\n    color: black;\n    float: left;\n    font-weight: bold;\n    padding: 5px 0;\n    margin: 2px 10pt 2px 0; }\n  dl.citelist dd {\n    margin: 2px 0;\n    padding: 5px 0; }\n  dl.citelist .startdd {\n    margin-top: 0; }\n\ndiv.toc {\n  background-color: transparent;\n  border: 1px solid #414141;\n  -moz-border-radius: 0;\n  -webkit-border-radius: 0;\n  border-radius: 0;\n  float: right;\n  height: auto;\n  margin: 0 8px 10px 10px;\n  padding: 10px 15px 5px 25px;\n  width: auto; }\n  div.toc li {\n    background: transparent;\n    font: 10pt Roboto,DejaVu Sans,sans-serif;\n    padding-left: 0;\n    padding-top: 0.5ex; }\n    div.toc li .level1 {\n      margin-left: 10pt; }\n    div.toc li .level2 {\n      margin-left: 10pt; }\n    div.toc li .level3 {\n      margin-left: 10pt; }\n    div.toc li .level4 {\n      margin-left: 10pt; }\n  div.toc h3 {\n    font: bold 12px/1.2 Roboto,DejaVu Sans,sans-serif;\n    color: black;\n    border-bottom: none;\n    margin: 0;\n    letter-spacing: 1px; }\n  div.toc ul {\n    list-style: disc;\n    border: none;\n    padding: 0; }\n\n.inherit_header {\n  font-weight: bold;\n  color: gray;\n  cursor: pointer;\n  -webkit-touch-callout: none;\n  -webkit-user-select: none;\n  -khtml-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none; }\n\n.inherit_header td {\n  padding: 6px 0px 2px 5px; }\n\n.inherit {\n  display: none; }\n\n/* tooltip related style info */\n.ttc {\n  position: absolute;\n  display: none; }\n\n#powerTip {\n  cursor: default;\n  white-space: nowrap;\n  background-color: #ffffff;\n  border: 1px solid #323232;\n  border-radius: 0;\n  -moz-box-shadow: none;\n  -webkit-box-shadow: none;\n  -o-box-shadow: none;\n  box-shadow: none;\n  display: none;\n  font-size: smaller;\n  max-width: 80%;\n  opacity: 0.9;\n  padding: 1ex 1em 1em 1em;\n  position: absolute;\n  z-index: 2147483647; }\n  #powerTip div.ttdoc {\n    color: grey;\n    font-style: italic; }\n  #powerTip div.ttname a {\n    font-weight: bold; }\n  #powerTip div.ttname {\n    font-weight: bold; }\n  #powerTip div.ttdeci {\n    color: #006318; }\n  #powerTip div {\n    margin: 0px;\n    padding: 0px;\n    font: 12px/16px Roboto,sans-serif; }\n  #powerTip:before, #powerTip:after {\n    content: \"\";\n    position: absolute;\n    margin: 0px; }\n\n@media print {\n  #top {\n    display: none; }\n  #side-nav {\n    display: none; }\n  #nav-path {\n    display: none; }\n  body {\n    overflow: visible; }\n  h1, h2, h3, h4, h5, h6 {\n    page-break-after: avoid; }\n  .summary {\n    display: none; }\n  .memitem {\n    page-break-inside: avoid; }\n  #doc-content {\n    margin-left: 0 !important;\n    height: auto !important;\n    width: auto !important;\n    overflow: inherit;\n    display: inline;\n    background-color: white; } }\n"
  },
  {
    "path": "src/libssh/doc/threading.dox",
    "content": "/**\n@page libssh_tutor_threads Chapter 8: Threads with libssh\n@section threads_with_libssh How to use libssh with threads\n\nlibssh may be used in multithreaded applications, but under several conditions :\n - Your system must support libpthread or, in Windows environment,\n   CriticalSection based mutex control.\n - Since version 0.8.0, threads initialization is called automatically in the\n   library constructor if libssh is dynamically linked. This means it is no\n   longer necessary to call ssh_init()/ssh_finalize().\n - If libssh is statically linked, threading must be initialized by calling\n   ssh_init() before using any of libssh provided functions. This initialization\n   must be done outside of any threading context. Don't forget to call\n   ssh_finalize() to avoid memory leak\n - At all times, you may use different sessions inside threads, make parallel\n   connections, read/write on different sessions and so on. You *cannot* use a\n   single session (or channels for a single session) in several threads at the same\n   time. This will most likely lead to internal state corruption. This limitation is\n   being worked out and will maybe disappear later.\n\n@subsection threads_init Initialization of threads\n\nSince version 0.8.0, it is no longer necessary to call ssh_init()/ssh_finalize()\nif libssh is dynamically linked.\n\nIf libssh is statically linked, call ssh_init() before using any of libssh\nprovided functions.\n\n@subsection threads_pthread Using libpthread with libssh\n\nSince version 0.8.0, libpthread is the default threads library used by libssh.\n\nTo use libpthread, simply link it to you application.\n\nIf you are using libssh statically linked, don't forget to call ssh_init()\nbefore using any of libssh provided functions (and ssh_finalize() in  the end).\n\n@subsection threads_other Using another threading library\n\nSince version 0.8.0, libssh does not support custom threading libraries.\nThe change makes sense since the newer versions for libcrypto (OpenSSL) and\nlibgcrypt don't support custom threading libraries.\n\nThe default used threading library is libpthread.\nAlternatively, in Windows environment, CriticalSection based mutex control can\nbe used.\n\nIf your system does not support libpthread nor CriticalSection based mutex\ncontrol, unfortunately, you cannot use libssh in multithreaded scenarios.\n\nGood luck !\n*/\n"
  },
  {
    "path": "src/libssh/examples/CMakeLists.txt",
    "content": "project(libssh-examples C CXX)\n\nset(examples_SRCS\n  authentication.c\n  knownhosts.c\n  connect_ssh.c\n)\n\ninclude_directories(${libssh_BINARY_DIR}/include ${libssh_BINARY_DIR})\n\nif (ARGP_INCLUDE_DIR)\n    include_directories(${ARGP_INCLUDE_DIR})\nendif()\n\nif (UNIX AND NOT WIN32)\n    add_executable(libssh_scp libssh_scp.c ${examples_SRCS})\n    target_compile_options(libssh_scp PRIVATE ${DEFAULT_C_COMPILE_FLAGS})\n    target_link_libraries(libssh_scp ssh::ssh)\n\n    add_executable(scp_download scp_download.c ${examples_SRCS})\n    target_compile_options(scp_download PRIVATE ${DEFAULT_C_COMPILE_FLAGS})\n    target_link_libraries(scp_download ssh::ssh)\n\n    add_executable(sshnetcat sshnetcat.c ${examples_SRCS})\n    target_compile_options(sshnetcat PRIVATE ${DEFAULT_C_COMPILE_FLAGS})\n    target_link_libraries(sshnetcat ssh::ssh)\n\n    if (WITH_SFTP)\n        add_executable(samplesftp samplesftp.c ${examples_SRCS})\n        target_compile_options(samplesftp PRIVATE ${DEFAULT_C_COMPILE_FLAGS})\n        target_link_libraries(samplesftp ssh::ssh)\n    endif (WITH_SFTP)\n\n    add_executable(ssh-client ssh_client.c ${examples_SRCS})\n    target_compile_options(ssh-client PRIVATE ${DEFAULT_C_COMPILE_FLAGS})\n    target_link_libraries(ssh-client ssh::ssh)\n\n    if (WITH_SERVER AND (ARGP_LIBRARY OR HAVE_ARGP_H))\n        if (HAVE_LIBUTIL)\n            add_executable(ssh_server_fork ssh_server_fork.c)\n            target_compile_options(ssh_server_fork PRIVATE ${DEFAULT_C_COMPILE_FLAGS})\n            target_link_libraries(ssh_server_fork ssh::ssh ${ARGP_LIBRARY} util)\n        endif (HAVE_LIBUTIL)\n\n        if (WITH_GSSAPI AND GSSAPI_FOUND)\n            add_executable(samplesshd-cb samplesshd-cb.c)\n            target_compile_options(samplesshd-cb PRIVATE ${DEFAULT_C_COMPILE_FLAGS})\n            target_link_libraries(samplesshd-cb ssh::ssh ${ARGP_LIBRARY})\n\n            add_executable(proxy proxy.c)\n            target_compile_options(proxy PRIVATE ${DEFAULT_C_COMPILE_FLAGS})\n            target_link_libraries(proxy ssh::ssh ${ARGP_LIBRARY})\n\n            add_executable(sshd_direct-tcpip sshd_direct-tcpip.c)\n            target_compile_options(sshd_direct-tcpip PRIVATE ${DEFAULT_C_COMPILE_FLAGS})\n            target_link_libraries(sshd_direct-tcpip ssh::ssh ${ARGP_LIBRARY})\n        endif (WITH_GSSAPI AND GSSAPI_FOUND)\n\n        add_executable(samplesshd-kbdint samplesshd-kbdint.c)\n        target_compile_options(samplesshd-kbdint PRIVATE ${DEFAULT_C_COMPILE_FLAGS})\n        target_link_libraries(samplesshd-kbdint ssh::ssh ${ARGP_LIBRARY})\n\n    endif()\nendif (UNIX AND NOT WIN32)\n\nadd_executable(exec exec.c ${examples_SRCS})\ntarget_compile_options(exec PRIVATE ${DEFAULT_C_COMPILE_FLAGS})\ntarget_link_libraries(exec ssh::ssh)\n\nadd_executable(senddata senddata.c ${examples_SRCS})\ntarget_compile_options(senddata PRIVATE ${DEFAULT_C_COMPILE_FLAGS})\ntarget_link_libraries(senddata ssh::ssh)\n\nadd_executable(keygen keygen.c)\ntarget_compile_options(keygen PRIVATE ${DEFAULT_C_COMPILE_FLAGS})\ntarget_link_libraries(keygen ssh::ssh)\n\nadd_executable(libsshpp libsshpp.cpp)\ntarget_link_libraries(libsshpp ssh::ssh)\n\nadd_executable(libsshpp_noexcept libsshpp_noexcept.cpp)\ntarget_link_libraries(libsshpp_noexcept ssh::ssh)\n"
  },
  {
    "path": "src/libssh/examples/authentication.c",
    "content": "/*\n * authentication.c\n * This file contains an example of how to do an authentication to a\n * SSH server using libssh\n */\n\n/*\nCopyright 2003-2009 Aris Adamantiadis\n\nThis file is part of the SSH Library\n\nYou are free to copy this file, modify it in any way, consider it being public\ndomain. This does not apply to the rest of the library though, but it is\nallowed to cut-and-paste working code from this file to any license of\nprogram.\nThe goal is to show the API in action. It's not a reference on how terminal\nclients must be made or how a client should react.\n */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include <libssh/libssh.h>\n#include \"examples_common.h\"\n\nint authenticate_kbdint(ssh_session session, const char *password)\n{\n    int err;\n\n    err = ssh_userauth_kbdint(session, NULL, NULL);\n    while (err == SSH_AUTH_INFO) {\n        const char *instruction;\n        const char *name;\n        char buffer[128];\n        int i, n;\n\n        name = ssh_userauth_kbdint_getname(session);\n        instruction = ssh_userauth_kbdint_getinstruction(session);\n        n = ssh_userauth_kbdint_getnprompts(session);\n\n        if (name && strlen(name) > 0) {\n            printf(\"%s\\n\", name);\n        }\n\n        if (instruction && strlen(instruction) > 0) {\n            printf(\"%s\\n\", instruction);\n        }\n\n        for (i = 0; i < n; i++) {\n            const char *answer;\n            const char *prompt;\n            char echo;\n\n            prompt = ssh_userauth_kbdint_getprompt(session, i, &echo);\n            if (prompt == NULL) {\n                break;\n            }\n\n            if (echo) {\n                char *p;\n\n                printf(\"%s\", prompt);\n\n                if (fgets(buffer, sizeof(buffer), stdin) == NULL) {\n                    return SSH_AUTH_ERROR;\n                }\n\n                buffer[sizeof(buffer) - 1] = '\\0';\n                if ((p = strchr(buffer, '\\n'))) {\n                    *p = '\\0';\n                }\n\n                if (ssh_userauth_kbdint_setanswer(session, i, buffer) < 0) {\n                    return SSH_AUTH_ERROR;\n                }\n\n                memset(buffer, 0, strlen(buffer));\n            } else {\n                if (password && strstr(prompt, \"Password:\")) {\n                    answer = password;\n                } else {\n                    buffer[0] = '\\0';\n\n                    if (ssh_getpass(prompt, buffer, sizeof(buffer), 0, 0) < 0) {\n                        return SSH_AUTH_ERROR;\n                    }\n                    answer = buffer;\n                }\n                err = ssh_userauth_kbdint_setanswer(session, i, answer);\n                memset(buffer, 0, sizeof(buffer));\n                if (err < 0) {\n                    return SSH_AUTH_ERROR;\n                }\n            }\n        }\n        err=ssh_userauth_kbdint(session,NULL,NULL);\n    }\n\n    return err;\n}\n\nstatic int auth_keyfile(ssh_session session, char* keyfile)\n{\n    ssh_key key = NULL;\n    char pubkey[132] = {0}; // +\".pub\"\n    int rc;\n\n    snprintf(pubkey, sizeof(pubkey), \"%s.pub\", keyfile);\n\n    rc = ssh_pki_import_pubkey_file( pubkey, &key);\n\n    if (rc != SSH_OK)\n        return SSH_AUTH_DENIED;\n\n    rc = ssh_userauth_try_publickey(session, NULL, key);\n\n    ssh_key_free(key);\n\n    if (rc!=SSH_AUTH_SUCCESS)\n        return SSH_AUTH_DENIED;\n\n    rc = ssh_pki_import_privkey_file(keyfile, NULL, NULL, NULL, &key);\n\n    if (rc != SSH_OK)\n        return SSH_AUTH_DENIED;\n\n    rc = ssh_userauth_publickey(session, NULL, key);\n\n    ssh_key_free(key);\n\n    return rc;\n}\n\n\nstatic void error(ssh_session session)\n{\n    fprintf(stderr,\"Authentication failed: %s\\n\",ssh_get_error(session));\n}\n\nint authenticate_console(ssh_session session)\n{\n    int rc;\n    int method;\n    char password[128] = {0};\n    char *banner;\n\n    // Try to authenticate\n    rc = ssh_userauth_none(session, NULL);\n    if (rc == SSH_AUTH_ERROR) {\n        error(session);\n        return rc;\n    }\n\n    method = ssh_userauth_list(session, NULL);\n    while (rc != SSH_AUTH_SUCCESS) {\n        if (method & SSH_AUTH_METHOD_GSSAPI_MIC){\n            rc = ssh_userauth_gssapi(session);\n            if(rc == SSH_AUTH_ERROR) {\n                error(session);\n                return rc;\n            } else if (rc == SSH_AUTH_SUCCESS) {\n                break;\n            }\n        }\n        // Try to authenticate with public key first\n        if (method & SSH_AUTH_METHOD_PUBLICKEY) {\n            rc = ssh_userauth_publickey_auto(session, NULL, NULL);\n            if (rc == SSH_AUTH_ERROR) {\n                error(session);\n                return rc;\n            } else if (rc == SSH_AUTH_SUCCESS) {\n                break;\n            }\n        }\n        {\n            char buffer[128] = {0};\n            char *p = NULL;\n\n            printf(\"Automatic pubkey failed. \"\n                   \"Do you want to try a specific key? (y/n)\\n\");\n            if (fgets(buffer, sizeof(buffer), stdin) == NULL) {\n                break;\n            }\n            if ((buffer[0]=='Y') || (buffer[0]=='y')) {\n                printf(\"private key filename: \");\n\n                if (fgets(buffer, sizeof(buffer), stdin) == NULL) {\n                    return SSH_AUTH_ERROR;\n                }\n\n                buffer[sizeof(buffer) - 1] = '\\0';\n                if ((p = strchr(buffer, '\\n'))) {\n                    *p = '\\0';\n                }\n\n                rc = auth_keyfile(session, buffer);\n\n                if(rc == SSH_AUTH_SUCCESS) {\n                    break;\n                }\n                fprintf(stderr, \"failed with key\\n\");\n            }\n        }\n\n        // Try to authenticate with keyboard interactive\";\n        if (method & SSH_AUTH_METHOD_INTERACTIVE) {\n            rc = authenticate_kbdint(session, NULL);\n            if (rc == SSH_AUTH_ERROR) {\n                error(session);\n                return rc;\n            } else if (rc == SSH_AUTH_SUCCESS) {\n                break;\n            }\n        }\n\n        if (ssh_getpass(\"Password: \", password, sizeof(password), 0, 0) < 0) {\n            return SSH_AUTH_ERROR;\n        }\n\n        // Try to authenticate with password\n        if (method & SSH_AUTH_METHOD_PASSWORD) {\n            rc = ssh_userauth_password(session, NULL, password);\n            if (rc == SSH_AUTH_ERROR) {\n                error(session);\n                return rc;\n            } else if (rc == SSH_AUTH_SUCCESS) {\n                break;\n            }\n        }\n        memset(password, 0, sizeof(password));\n    }\n\n    banner = ssh_get_issue_banner(session);\n    if (banner) {\n        printf(\"%s\\n\",banner);\n        SSH_STRING_FREE_CHAR(banner);\n    }\n\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/examples/connect_ssh.c",
    "content": "/*\n * connect_ssh.c\n * This file contains an example of how to connect to a\n * SSH server using libssh\n */\n\n/*\nCopyright 2009 Aris Adamantiadis\n\nThis file is part of the SSH Library\n\nYou are free to copy this file, modify it in any way, consider it being public\ndomain. This does not apply to the rest of the library though, but it is\nallowed to cut-and-paste working code from this file to any license of\nprogram.\nThe goal is to show the API in action. It's not a reference on how terminal\nclients must be made or how a client should react.\n */\n\n#include <libssh/libssh.h>\n#include \"examples_common.h\"\n#include <stdio.h>\n\nssh_session connect_ssh(const char *host, const char *user,int verbosity){\n  ssh_session session;\n  int auth=0;\n\n  session=ssh_new();\n  if (session == NULL) {\n    return NULL;\n  }\n\n  if(user != NULL){\n    if (ssh_options_set(session, SSH_OPTIONS_USER, user) < 0) {\n      ssh_free(session);\n      return NULL;\n    }\n  }\n\n  if (ssh_options_set(session, SSH_OPTIONS_HOST, host) < 0) {\n    ssh_free(session);\n    return NULL;\n  }\n  ssh_options_set(session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity);\n  if(ssh_connect(session)){\n    fprintf(stderr,\"Connection failed : %s\\n\",ssh_get_error(session));\n    ssh_disconnect(session);\n    ssh_free(session);\n    return NULL;\n  }\n  if(verify_knownhost(session)<0){\n    ssh_disconnect(session);\n    ssh_free(session);\n    return NULL;\n  }\n  auth=authenticate_console(session);\n  if(auth==SSH_AUTH_SUCCESS){\n    return session;\n  } else if(auth==SSH_AUTH_DENIED){\n    fprintf(stderr,\"Authentication failed\\n\");\n  } else {\n    fprintf(stderr,\"Error while authenticating : %s\\n\",ssh_get_error(session));\n  }\n  ssh_disconnect(session);\n  ssh_free(session);\n  return NULL;\n}\n"
  },
  {
    "path": "src/libssh/examples/examples_common.h",
    "content": "/*\nCopyright 2009 Aris Adamantiadis\n\nThis file is part of the SSH Library\n\nYou are free to copy this file, modify it in any way, consider it being public\ndomain. This does not apply to the rest of the library though, but it is\nallowed to cut-and-paste working code from this file to any license of\nprogram.\nThe goal is to show the API in action. It's not a reference on how terminal\nclients must be made or how a client should react.\n*/\n#ifndef EXAMPLES_COMMON_H_\n#define EXAMPLES_COMMON_H_\n\n#include <libssh/libssh.h>\n\n/** Zero a structure */\n#define ZERO_STRUCT(x) memset((char *)&(x), 0, sizeof(x))\n\nint authenticate_console(ssh_session session);\nint authenticate_kbdint(ssh_session session, const char *password);\nint verify_knownhost(ssh_session session);\nssh_session connect_ssh(const char *hostname, const char *user, int verbosity);\n\n#endif /* EXAMPLES_COMMON_H_ */\n"
  },
  {
    "path": "src/libssh/examples/exec.c",
    "content": "/* simple exec example */\n#include <stdio.h>\n\n#include <libssh/libssh.h>\n#include \"examples_common.h\"\n\nint main(void) {\n    ssh_session session;\n    ssh_channel channel;\n    char buffer[256];\n    int rbytes, wbytes, total = 0;\n    int rc;\n\n    session = connect_ssh(\"localhost\", NULL, 0);\n    if (session == NULL) {\n        ssh_finalize();\n        return 1;\n    }\n\n    channel = ssh_channel_new(session);;\n    if (channel == NULL) {\n        ssh_disconnect(session);\n        ssh_free(session);\n        ssh_finalize();\n        return 1;\n    }\n\n    rc = ssh_channel_open_session(channel);\n    if (rc < 0) {\n        goto failed;\n    }\n\n    rc = ssh_channel_request_exec(channel, \"lsof\");\n    if (rc < 0) {\n        goto failed;\n    }\n\n    rbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);\n    if (rbytes <= 0) {\n        goto failed;\n    }\n\n    do {\n        wbytes = fwrite(buffer + total, 1, rbytes, stdout);\n        if (wbytes <= 0) {\n            goto failed;\n        }\n\n        total += wbytes;\n\n        /* When it was not possible to write the whole buffer to stdout */\n        if (wbytes < rbytes) {\n            rbytes -= wbytes;\n            continue;\n        }\n\n        rbytes = ssh_channel_read(channel, buffer, sizeof(buffer), 0);\n        total = 0;\n    } while (rbytes > 0);\n\n    if (rbytes < 0) {\n        goto failed;\n    }\n\n    ssh_channel_send_eof(channel);\n    ssh_channel_close(channel);\n    ssh_channel_free(channel);\n    ssh_disconnect(session);\n    ssh_free(session);\n    ssh_finalize();\n\n    return 0;\nfailed:\n    ssh_channel_close(channel);\n    ssh_channel_free(channel);\n    ssh_disconnect(session);\n    ssh_free(session);\n    ssh_finalize();\n\n    return 1;\n}\n"
  },
  {
    "path": "src/libssh/examples/keygen.c",
    "content": "/* keygen.c\n * Sample implementation of ssh-keygen using libssh\n */\n\n/*\nCopyright 2019 Red Hat, Inc.\n\nAuthor: Jakub Jelen <jjelen@redhat.com>\n\nThis file is part of the SSH Library\n\nYou are free to copy this file, modify it in any way, consider it being public\ndomain. This does not apply to the rest of the library though, but it is\nallowed to cut-and-paste working code from this file to any license of\nprogram.\n */\n\n#include <libssh/libssh.h>\n#include <stdio.h>\n\nint main(void)\n{\n    ssh_key key = NULL;\n    int rv;\n\n    /* Generate a new ED25519 private key file */\n    rv = ssh_pki_generate(SSH_KEYTYPE_ED25519, 0, &key);\n    if (rv != SSH_OK) {\n        fprintf(stderr, \"Failed to generate private key\");\n\treturn -1;\n    }\n\n    /* Write it to a file testkey in the current dirrectory */\n    rv = ssh_pki_export_privkey_file(key, NULL, NULL, NULL, \"testkey\");\n    if (rv != SSH_OK) {\n        fprintf(stderr, \"Failed to write private key file\");\n\treturn -1;\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "src/libssh/examples/knownhosts.c",
    "content": "/*\n * knownhosts.c\n * This file contains an example of how verify the identity of a\n * SSH server using libssh\n */\n\n/*\nCopyright 2003-2009 Aris Adamantiadis\n\nThis file is part of the SSH Library\n\nYou are free to copy this file, modify it in any way, consider it being public\ndomain. This does not apply to the rest of the library though, but it is\nallowed to cut-and-paste working code from this file to any license of\nprogram.\nThe goal is to show the API in action. It's not a reference on how terminal\nclients must be made or how a client should react.\n */\n\n#include \"config.h\"\n\n#include <errno.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"libssh/priv.h\"\n#include <libssh/libssh.h>\n#include \"examples_common.h\"\n\n#ifdef _WIN32\n#define strncasecmp _strnicmp\n#endif\n\nint verify_knownhost(ssh_session session)\n{\n    enum ssh_known_hosts_e state;\n    char buf[10];\n    unsigned char *hash = NULL;\n    size_t hlen;\n    ssh_key srv_pubkey;\n    int rc;\n\n    rc = ssh_get_server_publickey(session, &srv_pubkey);\n    if (rc < 0) {\n        return -1;\n    }\n\n    rc = ssh_get_publickey_hash(srv_pubkey,\n                                SSH_PUBLICKEY_HASH_SHA256,\n                                &hash,\n                                &hlen);\n    ssh_key_free(srv_pubkey);\n    if (rc < 0) {\n        return -1;\n    }\n\n    state = ssh_session_is_known_server(session);\n\n    switch(state) {\n    case SSH_KNOWN_HOSTS_CHANGED:\n        fprintf(stderr,\"Host key for server changed : server's one is now :\\n\");\n        ssh_print_hash(SSH_PUBLICKEY_HASH_SHA256, hash, hlen);\n        ssh_clean_pubkey_hash(&hash);\n        fprintf(stderr,\"For security reason, connection will be stopped\\n\");\n        return -1;\n    case SSH_KNOWN_HOSTS_OTHER:\n        fprintf(stderr,\"The host key for this server was not found but an other type of key exists.\\n\");\n        fprintf(stderr,\"An attacker might change the default server key to confuse your client\"\n                \"into thinking the key does not exist\\n\"\n                \"We advise you to rerun the client with -d or -r for more safety.\\n\");\n        return -1;\n    case SSH_KNOWN_HOSTS_NOT_FOUND:\n        fprintf(stderr,\"Could not find known host file. If you accept the host key here,\\n\");\n        fprintf(stderr,\"the file will be automatically created.\\n\");\n        /* fallback to SSH_SERVER_NOT_KNOWN behavior */\n        FALL_THROUGH;\n    case SSH_SERVER_NOT_KNOWN:\n        fprintf(stderr,\n                \"The server is unknown. Do you trust the host key (yes/no)?\\n\");\n        ssh_print_hash(SSH_PUBLICKEY_HASH_SHA256, hash, hlen);\n\n        if (fgets(buf, sizeof(buf), stdin) == NULL) {\n            ssh_clean_pubkey_hash(&hash);\n            return -1;\n        }\n        if(strncasecmp(buf,\"yes\",3)!=0){\n            ssh_clean_pubkey_hash(&hash);\n            return -1;\n        }\n        fprintf(stderr,\"This new key will be written on disk for further usage. do you agree ?\\n\");\n        if (fgets(buf, sizeof(buf), stdin) == NULL) {\n            ssh_clean_pubkey_hash(&hash);\n            return -1;\n        }\n        if(strncasecmp(buf,\"yes\",3)==0){\n            rc = ssh_session_update_known_hosts(session);\n            if (rc != SSH_OK) {\n                ssh_clean_pubkey_hash(&hash);\n                fprintf(stderr, \"error %s\\n\", strerror(errno));\n                return -1;\n            }\n        }\n\n        break;\n    case SSH_KNOWN_HOSTS_ERROR:\n        ssh_clean_pubkey_hash(&hash);\n        fprintf(stderr,\"%s\",ssh_get_error(session));\n        return -1;\n    case SSH_KNOWN_HOSTS_OK:\n        break; /* ok */\n    }\n\n    ssh_clean_pubkey_hash(&hash);\n\n    return 0;\n}\n"
  },
  {
    "path": "src/libssh/examples/libssh_scp.c",
    "content": "/* libssh_scp.c\n * Sample implementation of a SCP client\n */\n\n/*\nCopyright 2009 Aris Adamantiadis\n\nThis file is part of the SSH Library\n\nYou are free to copy this file, modify it in any way, consider it being public\ndomain. This does not apply to the rest of the library though, but it is\nallowed to cut-and-paste working code from this file to any license of\nprogram.\n */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <errno.h>\n#include <sys/stat.h>\n\n#include <libssh/libssh.h>\n#include \"examples_common.h\"\n\nstatic char **sources;\nstatic int nsources;\nstatic char *destination;\nstatic int verbosity = 0;\n\nstruct location {\n    int is_ssh;\n    char *user;\n    char *host;\n    char *path;\n    ssh_session session;\n    ssh_scp scp;\n    FILE *file;\n};\n\nenum {\n    READ,\n    WRITE\n};\n\nstatic void usage(const char *argv0) {\n    fprintf(stderr, \"Usage : %s [options] [[user@]host1:]file1 ... \\n\"\n            \"                               [[user@]host2:]destination\\n\"\n            \"sample scp client - libssh-%s\\n\",\n            //      \"Options :\\n\",\n            //      \"  -r : use RSA to verify host public key\\n\",\n            argv0,\n            ssh_version(0));\n    exit(0);\n}\n\nstatic int opts(int argc, char **argv) {\n    int i;\n\n    while((i = getopt(argc, argv, \"v\")) != -1) {\n        switch(i) {\n        case 'v':\n            verbosity++;\n            break;\n        default:\n            fprintf(stderr, \"unknown option %c\\n\", optopt);\n            usage(argv[0]);\n            return -1;\n        }\n    }\n\n    nsources = argc - optind - 1;\n    if (nsources < 1) {\n        usage(argv[0]);\n        return -1;\n    }\n\n    sources = malloc((nsources + 1) * sizeof(char *));\n    if (sources == NULL) {\n        return -1;\n    }\n\n    for(i = 0; i < nsources; ++i) {\n        sources[i] = argv[optind];\n        optind++;\n    }\n\n    sources[i] = NULL;\n    destination = argv[optind];\n    return 0;\n}\n\nstatic void location_free(struct location *loc)\n{\n    if (loc) {\n        if (loc->path) {\n            free(loc->path);\n        }\n        loc->path = NULL;\n        if (loc->is_ssh) {\n            if (loc->host) {\n                free(loc->host);\n            }\n            loc->host = NULL;\n            if (loc->user) {\n                free(loc->user);\n            }\n            loc->user = NULL;\n            if (loc->host) {\n                free(loc->host);\n            }\n            loc->host = NULL;\n        }\n        free(loc);\n    }\n}\n\nstatic struct location *parse_location(char *loc) {\n    struct location *location;\n    char *ptr;\n\n    location = malloc(sizeof(struct location));\n    if (location == NULL) {\n        return NULL;\n    }\n    memset(location, 0, sizeof(struct location));\n\n    location->host = location->user = NULL;\n    ptr = strchr(loc, ':');\n\n    if (ptr != NULL) {\n        location->is_ssh = 1;\n        location->path = strdup(ptr+1);\n        *ptr = '\\0';\n        ptr = strchr(loc, '@');\n\n        if (ptr != NULL) {\n            location->host = strdup(ptr+1);\n            *ptr = '\\0';\n            location->user = strdup(loc);\n        } else {\n            location->host = strdup(loc);\n        }\n    } else {\n        location->is_ssh = 0;\n        location->path = strdup(loc);\n    }\n    return location;\n}\n\nstatic void close_location(struct location *loc) {\n    int rc;\n\n    if (loc) {\n        if (loc->is_ssh) {\n            if (loc->scp) {\n                rc = ssh_scp_close(loc->scp);\n                if (rc == SSH_ERROR) {\n                    fprintf(stderr,\n                            \"Error closing scp: %s\\n\",\n                            ssh_get_error(loc->session));\n                }\n                ssh_scp_free(loc->scp);\n                loc->scp = NULL;\n            }\n            if (loc->session) {\n                ssh_disconnect(loc->session);\n                ssh_free(loc->session);\n                loc->session = NULL;\n            }\n        } else {\n            if (loc->file) {\n                fclose(loc->file);\n                loc->file = NULL;\n            }\n        }\n    }\n}\n\nstatic int open_location(struct location *loc, int flag) {\n    if (loc->is_ssh && flag == WRITE) {\n        loc->session = connect_ssh(loc->host, loc->user, verbosity);\n        if (!loc->session) {\n            fprintf(stderr, \"Couldn't connect to %s\\n\", loc->host);\n            return -1;\n        }\n\n        loc->scp = ssh_scp_new(loc->session, SSH_SCP_WRITE, loc->path);\n        if (!loc->scp) {\n            fprintf(stderr, \"error : %s\\n\", ssh_get_error(loc->session));\n            ssh_disconnect(loc->session);\n            ssh_free(loc->session);\n            loc->session = NULL;\n            return -1;\n        }\n\n        if (ssh_scp_init(loc->scp) == SSH_ERROR) {\n            fprintf(stderr, \"error : %s\\n\", ssh_get_error(loc->session));\n            ssh_scp_free(loc->scp);\n            loc->scp = NULL;\n            ssh_disconnect(loc->session);\n            ssh_free(loc->session);\n            loc->session = NULL;\n            return -1;\n        }\n        return 0;\n    } else if (loc->is_ssh && flag == READ) {\n        loc->session = connect_ssh(loc->host, loc->user, verbosity);\n        if (!loc->session) {\n            fprintf(stderr, \"Couldn't connect to %s\\n\", loc->host);\n            return -1;\n        }\n\n        loc->scp = ssh_scp_new(loc->session, SSH_SCP_READ, loc->path);\n        if (!loc->scp) {\n            fprintf(stderr, \"error : %s\\n\", ssh_get_error(loc->session));\n            ssh_disconnect(loc->session);\n            ssh_free(loc->session);\n            loc->session = NULL;\n            return -1;\n        }\n\n        if (ssh_scp_init(loc->scp) == SSH_ERROR) {\n            fprintf(stderr, \"error : %s\\n\", ssh_get_error(loc->session));\n            ssh_scp_free(loc->scp);\n            loc->scp = NULL;\n            ssh_disconnect(loc->session);\n            ssh_free(loc->session);\n            loc->session = NULL;\n            return -1;\n        }\n        return 0;\n    } else {\n        loc->file = fopen(loc->path, flag == READ ? \"r\":\"w\");\n        if (!loc->file) {\n            if (errno == EISDIR) {\n                if (chdir(loc->path)) {\n                    fprintf(stderr,\n                            \"Error changing directory to %s: %s\\n\",\n                            loc->path, strerror(errno));\n                    return -1;\n                }\n                return 0;\n            }\n            fprintf(stderr,\n                    \"Error opening %s: %s\\n\",\n                    loc->path, strerror(errno));\n            return -1;\n        }\n        return 0;\n    }\n    return -1;\n}\n\n/** @brief copies files from source location to destination\n * @param src source location\n * @param dest destination location\n * @param recursive Copy also directories\n */\nstatic int do_copy(struct location *src, struct location *dest, int recursive) {\n    size_t size;\n    socket_t fd;\n    struct stat s;\n    int w, r;\n    char buffer[16384];\n    size_t total = 0;\n    mode_t mode;\n    char *filename = NULL;\n\n    /* recursive mode doesn't work yet */\n    (void)recursive;\n    /* Get the file name and size*/\n    if (!src->is_ssh) {\n        fd = fileno(src->file);\n        if (fd < 0) {\n            fprintf(stderr,\n                    \"Invalid file pointer, error: %s\\n\",\n                    strerror(errno));\n            return -1;\n        }\n        r = fstat(fd, &s);\n        if (r < 0) {\n            return -1;\n        }\n        size = s.st_size;\n        mode = s.st_mode & ~S_IFMT;\n        filename = ssh_basename(src->path);\n    } else {\n        size = 0;\n        do {\n            r = ssh_scp_pull_request(src->scp);\n            if (r == SSH_SCP_REQUEST_NEWDIR) {\n                ssh_scp_deny_request(src->scp, \"Not in recursive mode\");\n                continue;\n            }\n            if (r == SSH_SCP_REQUEST_NEWFILE) {\n                size = ssh_scp_request_get_size(src->scp);\n                filename = strdup(ssh_scp_request_get_filename(src->scp));\n                mode = ssh_scp_request_get_permissions(src->scp);\n                //ssh_scp_accept_request(src->scp);\n                break;\n            }\n            if (r == SSH_ERROR) {\n                fprintf(stderr,\n                        \"Error: %s\\n\",\n                        ssh_get_error(src->session));\n                SSH_STRING_FREE_CHAR(filename);\n                return -1;\n            }\n        } while(r != SSH_SCP_REQUEST_NEWFILE);\n    }\n\n    if (dest->is_ssh) {\n        r = ssh_scp_push_file(dest->scp, src->path, size, mode);\n        //  snprintf(buffer, sizeof(buffer), \"C0644 %d %s\\n\", size, src->path);\n        if (r == SSH_ERROR) {\n            fprintf(stderr,\n                    \"error: %s\\n\",\n                    ssh_get_error(dest->session));\n            SSH_STRING_FREE_CHAR(filename);\n            ssh_scp_free(dest->scp);\n            dest->scp = NULL;\n            return -1;\n        }\n    } else {\n        if (!dest->file) {\n            dest->file = fopen(filename, \"w\");\n            if (!dest->file) {\n                fprintf(stderr,\n                        \"Cannot open %s for writing: %s\\n\",\n                        filename, strerror(errno));\n                if (src->is_ssh) {\n                    ssh_scp_deny_request(src->scp, \"Cannot open local file\");\n                }\n                SSH_STRING_FREE_CHAR(filename);\n                return -1;\n            }\n        }\n        if (src->is_ssh) {\n            ssh_scp_accept_request(src->scp);\n        }\n    }\n\n    do {\n        if (src->is_ssh) {\n            r = ssh_scp_read(src->scp, buffer, sizeof(buffer));\n            if (r == SSH_ERROR) {\n                fprintf(stderr,\n                        \"Error reading scp: %s\\n\",\n                        ssh_get_error(src->session));\n                SSH_STRING_FREE_CHAR(filename);\n                return -1;\n            }\n\n            if (r == 0) {\n                break;\n            }\n        } else {\n            r = fread(buffer, 1, sizeof(buffer), src->file);\n            if (r == 0) {\n                break;\n            }\n\n            if (r < 0) {\n                fprintf(stderr,\n                        \"Error reading file: %s\\n\",\n                        strerror(errno));\n                SSH_STRING_FREE_CHAR(filename);\n                return -1;\n            }\n        }\n\n        if (dest->is_ssh) {\n            w = ssh_scp_write(dest->scp, buffer, r);\n            if (w == SSH_ERROR) {\n                fprintf(stderr,\n                        \"Error writing in scp: %s\\n\",\n                        ssh_get_error(dest->session));\n                ssh_scp_free(dest->scp);\n                dest->scp = NULL;\n                SSH_STRING_FREE_CHAR(filename);\n                return -1;\n            }\n        } else {\n            w = fwrite(buffer, r, 1, dest->file);\n            if (w <= 0) {\n                fprintf(stderr,\n                        \"Error writing in local file: %s\\n\",\n                        strerror(errno));\n                SSH_STRING_FREE_CHAR(filename);\n                return -1;\n            }\n        }\n        total += r;\n\n    } while(total < size);\n\n    SSH_STRING_FREE_CHAR(filename);\n    printf(\"wrote %zu bytes\\n\", total);\n    return 0;\n}\n\nint main(int argc, char **argv) {\n    struct location *dest, *src;\n    int i;\n    int r;\n    if (opts(argc, argv) < 0) {\n        r = EXIT_FAILURE;\n        goto end;\n    }\n\n    dest = parse_location(destination);\n    if (dest == NULL) {\n        r = EXIT_FAILURE;\n        goto end;\n    }\n\n    if (open_location(dest, WRITE) < 0) {\n        location_free(dest);\n        r = EXIT_FAILURE;\n        goto end;\n    }\n\n    for (i = 0; i < nsources; ++i) {\n        src = parse_location(sources[i]);\n        if (src == NULL) {\n            r = EXIT_FAILURE;\n            goto close_dest;\n        }\n\n        if (open_location(src, READ) < 0) {\n            location_free(src);\n            r = EXIT_FAILURE;\n            goto close_dest;\n        }\n\n        if (do_copy(src, dest, 0) < 0) {\n            close_location(src);\n            location_free(src);\n            break;\n        }\n\n        close_location(src);\n        location_free(src);\n    }\n\n    r = 0;\n\nclose_dest:\n    close_location(dest);\n    location_free(dest);\nend:\n    return r;\n}\n"
  },
  {
    "path": "src/libssh/examples/libsshpp.cpp",
    "content": "/*\nCopyright 2010 Aris Adamantiadis\n\nThis file is part of the SSH Library\n\nYou are free to copy this file, modify it in any way, consider it being public\ndomain. This does not apply to the rest of the library though, but it is\nallowed to cut-and-paste working code from this file to any license of\nprogram.\n*/\n\n/* This file demonstrates the use of the C++ wrapper to libssh */\n\n#include <iostream>\n#include <string>\n#include <libssh/libsshpp.hpp>\n\nint main(int argc, const char **argv){\n  ssh::Session session;\n  try {\n    if(argc>1)\n      session.setOption(SSH_OPTIONS_HOST,argv[1]);\n    else\n      session.setOption(SSH_OPTIONS_HOST,\"localhost\");\n    session.connect();\n    session.userauthPublickeyAuto();\n    session.disconnect();\n  } catch (ssh::SshException e){\n    std::cout << \"Error during connection : \";\n    std::cout << e.getError() << std::endl;\n  }\n  return 0;\n}\n"
  },
  {
    "path": "src/libssh/examples/libsshpp_noexcept.cpp",
    "content": "/*\nCopyright 2010 Aris Adamantiadis\n\nThis file is part of the SSH Library\n\nYou are free to copy this file, modify it in any way, consider it being public\ndomain. This does not apply to the rest of the library though, but it is\nallowed to cut-and-paste working code from this file to any license of\nprogram.\n*/\n\n/* This file demonstrates the use of the C++ wrapper to libssh\n * specifically, without C++ exceptions\n */\n\n#include <iostream>\n#define SSH_NO_CPP_EXCEPTIONS\n#include <libssh/libsshpp.hpp>\n\nint main(int argc, const char **argv){\n\tssh::Session session,s2;\n\tint err;\n\tif(argc>1)\n\t\terr=session.setOption(SSH_OPTIONS_HOST,argv[1]);\n\telse\n\t\terr=session.setOption(SSH_OPTIONS_HOST,\"localhost\");\n\tif(err==SSH_ERROR)\n\t\tgoto error;\n\terr=session.connect();\n\tif(err==SSH_ERROR)\n\t\tgoto error;\n\terr=session.userauthPublickeyAuto();\n\tif(err==SSH_ERROR)\n\t\tgoto error;\n\n\treturn 0;\n\terror:\n\tstd::cout << \"Error during connection : \";\n\tstd::cout << session.getError() << std::endl;\n\treturn 1;\n}\n"
  },
  {
    "path": "src/libssh/examples/proxy.c",
    "content": "/* This is a sample implementation of a libssh based SSH proxy */\n/*\nCopyright 2003-2013 Aris Adamantiadis\n\nThis file is part of the SSH Library\n\nYou are free to copy this file, modify it in any way, consider it being public\ndomain. This does not apply to the rest of the library though, but it is\nallowed to cut-and-paste working code from this file to any license of\nprogram.\nThe goal is to show the API in action. It's not a reference on how terminal\nclients must be made or how a client should react.\n*/\n\n#include \"config.h\"\n\n#include <libssh/libssh.h>\n#include <libssh/server.h>\n#include <libssh/callbacks.h>\n\n#ifdef HAVE_ARGP_H\n#include <argp.h>\n#endif\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n\n#define USER \"myuser\"\n#define PASSWORD \"mypassword\"\n\nstatic int authenticated=0;\nstatic int tries = 0;\nstatic int error = 0;\nstatic ssh_channel chan=NULL;\nstatic char *username;\nstatic ssh_gssapi_creds client_creds = NULL;\n\nstatic int auth_password(ssh_session session, const char *user,\n        const char *password, void *userdata){\n\n    (void)userdata;\n\n    printf(\"Authenticating user %s pwd %s\\n\",user, password);\n    if(strcmp(user,USER) == 0 && strcmp(password, PASSWORD) == 0){\n        authenticated = 1;\n        printf(\"Authenticated\\n\");\n        return SSH_AUTH_SUCCESS;\n    }\n    if (tries >= 3){\n        printf(\"Too many authentication tries\\n\");\n        ssh_disconnect(session);\n        error = 1;\n        return SSH_AUTH_DENIED;\n    }\n    tries++;\n    return SSH_AUTH_DENIED;\n}\n\nstatic int auth_gssapi_mic(ssh_session session, const char *user, const char *principal, void *userdata){\n    (void)userdata;\n    client_creds = ssh_gssapi_get_creds(session);\n    printf(\"Authenticating user %s with gssapi principal %s\\n\",user, principal);\n    if (client_creds != NULL)\n        printf(\"Received some gssapi credentials\\n\");\n    else\n        printf(\"Not received any forwardable creds\\n\");\n    printf(\"authenticated\\n\");\n    authenticated = 1;\n    username = strdup(principal);\n    return SSH_AUTH_SUCCESS;\n}\n\nstatic int pty_request(ssh_session session, ssh_channel channel, const char *term,\n        int x,int y, int px, int py, void *userdata){\n    (void) session;\n    (void) channel;\n    (void) term;\n    (void) x;\n    (void) y;\n    (void) px;\n    (void) py;\n    (void) userdata;\n    printf(\"Allocated terminal\\n\");\n    return 0;\n}\n\nstatic int shell_request(ssh_session session, ssh_channel channel, void *userdata){\n    (void)session;\n    (void)channel;\n    (void)userdata;\n    printf(\"Allocated shell\\n\");\n    return 0;\n}\nstruct ssh_channel_callbacks_struct channel_cb = {\n    .channel_pty_request_function = pty_request,\n    .channel_shell_request_function = shell_request\n};\n\nstatic ssh_channel new_session_channel(ssh_session session, void *userdata){\n    (void) session;\n    (void) userdata;\n    if(chan != NULL)\n        return NULL;\n    printf(\"Allocated session channel\\n\");\n    chan = ssh_channel_new(session);\n    ssh_callbacks_init(&channel_cb);\n    ssh_set_channel_callbacks(chan, &channel_cb);\n    return chan;\n}\n\n\n#ifdef HAVE_ARGP_H\nconst char *argp_program_version = \"libssh proxy example \"\nSSH_STRINGIFY(LIBSSH_VERSION);\nconst char *argp_program_bug_address = \"<libssh@libssh.org>\";\n\n/* Program documentation. */\nstatic char doc[] = \"libssh -- a Secure Shell protocol implementation\";\n\n/* A description of the arguments we accept. */\nstatic char args_doc[] = \"BINDADDR\";\n\n/* The options we understand. */\nstatic struct argp_option options[] = {\n    {\n        .name  = \"port\",\n        .key   = 'p',\n        .arg   = \"PORT\",\n        .flags = 0,\n        .doc   = \"Set the port to bind.\",\n        .group = 0\n    },\n    {\n        .name  = \"hostkey\",\n        .key   = 'k',\n        .arg   = \"FILE\",\n        .flags = 0,\n        .doc   = \"Set the host key.\",\n        .group = 0\n    },\n    {\n        .name  = \"dsakey\",\n        .key   = 'd',\n        .arg   = \"FILE\",\n        .flags = 0,\n        .doc   = \"Set the dsa key.\",\n        .group = 0\n    },\n    {\n        .name  = \"rsakey\",\n        .key   = 'r',\n        .arg   = \"FILE\",\n        .flags = 0,\n        .doc   = \"Set the rsa key.\",\n        .group = 0\n    },\n    {\n        .name  = \"verbose\",\n        .key   = 'v',\n        .arg   = NULL,\n        .flags = 0,\n        .doc   = \"Get verbose output.\",\n        .group = 0\n    },\n    {NULL, 0, NULL, 0, NULL, 0}\n};\n\n/* Parse a single option. */\nstatic error_t parse_opt (int key, char *arg, struct argp_state *state) {\n    /* Get the input argument from argp_parse, which we\n     * know is a pointer to our arguments structure.\n     */\n    ssh_bind sshbind = state->input;\n\n    switch (key) {\n        case 'p':\n            ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_BINDPORT_STR, arg);\n            break;\n        case 'd':\n            ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_DSAKEY, arg);\n            break;\n        case 'k':\n            ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_HOSTKEY, arg);\n            break;\n        case 'r':\n            ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_RSAKEY, arg);\n            break;\n        case 'v':\n            ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_LOG_VERBOSITY_STR, \"3\");\n            break;\n        case ARGP_KEY_ARG:\n            if (state->arg_num >= 1) {\n                /* Too many arguments. */\n                argp_usage (state);\n            }\n            ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_BINDADDR, arg);\n            break;\n        case ARGP_KEY_END:\n            if (state->arg_num < 1) {\n                /* Not enough arguments. */\n                argp_usage (state);\n            }\n            break;\n        default:\n            return ARGP_ERR_UNKNOWN;\n    }\n\n    return 0;\n}\n\n/* Our argp parser. */\nstatic struct argp argp = {options, parse_opt, args_doc, doc, NULL, NULL, NULL};\n#endif /* HAVE_ARGP_H */\n\nint main(int argc, char **argv){\n    ssh_session session;\n    ssh_bind sshbind;\n    ssh_event mainloop;\n    ssh_session client_session;\n\n    struct ssh_server_callbacks_struct cb = {\n        .userdata = NULL,\n        .auth_password_function = auth_password,\n        .auth_gssapi_mic_function = auth_gssapi_mic,\n        .channel_open_request_session_function = new_session_channel\n    };\n\n    char buf[2048];\n    char host[128]=\"\";\n    char *ptr;\n    int i,r, rc;\n\n    sshbind=ssh_bind_new();\n    session=ssh_new();\n\n    ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_RSAKEY, \"sshd_rsa\");\n\n#ifdef HAVE_ARGP_H\n    /*\n     * Parse our arguments; every option seen by parse_opt will\n     * be reflected in arguments.\n     */\n    argp_parse (&argp, argc, argv, 0, 0, sshbind);\n#else\n    (void) argc;\n    (void) argv;\n#endif\n\n    if(ssh_bind_listen(sshbind)<0){\n        printf(\"Error listening to socket: %s\\n\",ssh_get_error(sshbind));\n        return 1;\n    }\n    r=ssh_bind_accept(sshbind,session);\n    if(r==SSH_ERROR){\n        printf(\"error accepting a connection : %s\\n\",ssh_get_error(sshbind));\n        return 1;\n    }\n    ssh_callbacks_init(&cb);\n    ssh_set_server_callbacks(session, &cb);\n\n    if (ssh_handle_key_exchange(session)) {\n        printf(\"ssh_handle_key_exchange: %s\\n\", ssh_get_error(session));\n        return 1;\n    }\n    ssh_set_auth_methods(session,SSH_AUTH_METHOD_PASSWORD | SSH_AUTH_METHOD_GSSAPI_MIC);\n    mainloop = ssh_event_new();\n    ssh_event_add_session(mainloop, session);\n\n    while (!(authenticated && chan != NULL)){\n        if(error)\n            break;\n        r = ssh_event_dopoll(mainloop, -1);\n        if (r == SSH_ERROR){\n            printf(\"Error : %s\\n\",ssh_get_error(session));\n            ssh_disconnect(session);\n            return 1;\n        }\n    }\n    if(error){\n        printf(\"Error, exiting loop\\n\");\n        return 1;\n    } else\n        printf(\"Authenticated and got a channel\\n\");\n    if (!client_creds){\n        snprintf(buf,sizeof(buf), \"Sorry, but you do not have forwardable tickets. Try again with -K\\r\\n\");\n        ssh_channel_write(chan,buf,strlen(buf));\n        printf(\"%s\",buf);\n        ssh_disconnect(session);\n        return 1;\n    }\n    snprintf(buf,sizeof(buf), \"Hello %s, welcome to the Sample SSH proxy.\\r\\nPlease select your destination: \", username);\n    ssh_channel_write(chan, buf, strlen(buf));\n    do{\n        i=ssh_channel_read(chan,buf, 2048, 0);\n        if(i>0) {\n            ssh_channel_write(chan, buf, i);\n            if(strlen(host) + i < sizeof(host)){\n                strncat(host, buf, i);\n            }\n            if (strchr(host, '\\x0d')) {\n                *strchr(host, '\\x0d')='\\0';\n                ssh_channel_write(chan, \"\\n\", 1);\n                break;\n            }\n        } else {\n            printf (\"Error: %s\\n\", ssh_get_error(session) );\n            return 1;\n        }\n    } while (i>0);\n    snprintf(buf,sizeof(buf),\"Trying to connect to \\\"%s\\\"\\r\\n\", host);\n    ssh_channel_write(chan, buf, strlen(buf));\n    printf(\"%s\",buf);\n\n    client_session = ssh_new();\n\n    /* ssh servers expect username without realm */\n    ptr = strchr(username,'@');\n    if(ptr)\n        *ptr= '\\0';\n    ssh_options_set(client_session, SSH_OPTIONS_HOST, host);\n    ssh_options_set(client_session, SSH_OPTIONS_USER, username);\n    ssh_gssapi_set_creds(client_session, client_creds);\n    rc = ssh_connect(client_session);\n    if (rc != SSH_OK){\n        printf(\"Error connecting to %s: %s\", host, ssh_get_error(client_session));\n        return 1;\n    }\n    rc = ssh_userauth_none(client_session, NULL);\n    if(rc == SSH_AUTH_SUCCESS){\n        printf(\"Authenticated using method none\\n\");\n    } else {\n        rc = ssh_userauth_gssapi(client_session);\n        if(rc != SSH_AUTH_SUCCESS){\n            printf(\"GSSAPI Authentication failed: %s\\n\",ssh_get_error(client_session));\n            return 1;\n        }\n    }\n    snprintf(buf,sizeof(buf), \"Authentication success\\r\\n\");\n    printf(\"%s\",buf);\n    ssh_channel_write(chan,buf,strlen(buf));\n    ssh_disconnect(client_session);\n    ssh_disconnect(session);\n    ssh_bind_free(sshbind);\n    ssh_finalize();\n    return 0;\n}\n\n"
  },
  {
    "path": "src/libssh/examples/samplesftp.c",
    "content": "/*\nCopyright 2003-2009 Aris Adamantiadis\n\nThis file is part of the SSH Library\n\nYou are free to copy this file, modify it in any way, consider it being public\ndomain. This does not apply to the rest of the library though, but it is\nallowed to cut-and-paste working code from this file to any license of\nprogram.\nThe goal is to show the API in action. It's not a reference on how terminal\nclients must be made or how a client should react.\n*/\n\n#include \"config.h\"\n\n#include <sys/statvfs.h>\n#include <stdio.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <stdlib.h>\n#include <string.h>\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n\n#include <libssh/libssh.h>\n#include <libssh/sftp.h>\n\n#include \"examples_common.h\"\n#ifdef WITH_SFTP\n\nstatic int verbosity;\nstatic char *destination;\n\n#define DATALEN 65536\n\nstatic void do_sftp(ssh_session session) {\n    sftp_session sftp = sftp_new(session);\n    sftp_dir dir;\n    sftp_attributes file;\n    sftp_statvfs_t sftpstatvfs;\n    struct statvfs sysstatvfs;\n    sftp_file fichier;\n    sftp_file to;\n    int len = 1;\n    unsigned int i;\n    char data[DATALEN] = {0};\n    char *lnk;\n\n    unsigned int count;\n\n    if (!sftp) {\n        fprintf(stderr, \"sftp error initialising channel: %s\\n\",\n                ssh_get_error(session));\n        goto end;\n    }\n\n    if (sftp_init(sftp)) {\n        fprintf(stderr, \"error initialising sftp: %s\\n\",\n                ssh_get_error(session));\n        goto end;\n    }\n\n    printf(\"Additional SFTP extensions provided by the server:\\n\");\n    count = sftp_extensions_get_count(sftp);\n    for (i = 0; i < count; i++) {\n        printf(\"\\t%s, version: %s\\n\",\n               sftp_extensions_get_name(sftp, i),\n               sftp_extensions_get_data(sftp, i));\n    }\n\n    /* test symlink and readlink */\n    if (sftp_symlink(sftp, \"/tmp/this_is_the_link\",\n                     \"/tmp/sftp_symlink_test\") < 0)\n    {\n        fprintf(stderr, \"Could not create link (%s)\\n\",\n                ssh_get_error(session));\n        goto end;\n    }\n\n    lnk = sftp_readlink(sftp, \"/tmp/sftp_symlink_test\");\n    if (lnk == NULL) {\n        fprintf(stderr, \"Could not read link (%s)\\n\", ssh_get_error(session));\n        goto end;\n    }\n    printf(\"readlink /tmp/sftp_symlink_test: %s\\n\", lnk);\n\n    sftp_unlink(sftp, \"/tmp/sftp_symlink_test\");\n\n    if (sftp_extension_supported(sftp, \"statvfs@openssh.com\", \"2\")) {\n        sftpstatvfs = sftp_statvfs(sftp, \"/tmp\");\n        if (sftpstatvfs == NULL) {\n            fprintf(stderr, \"statvfs failed (%s)\\n\", ssh_get_error(session));\n            goto end;\n        }\n\n        printf(\"sftp statvfs:\\n\"\n               \"\\tfile system block size: %llu\\n\"\n               \"\\tfundamental fs block size: %llu\\n\"\n               \"\\tnumber of blocks (unit f_frsize): %llu\\n\"\n               \"\\tfree blocks in file system: %llu\\n\"\n               \"\\tfree blocks for non-root: %llu\\n\"\n               \"\\ttotal file inodes: %llu\\n\"\n               \"\\tfree file inodes: %llu\\n\"\n               \"\\tfree file inodes for to non-root: %llu\\n\"\n               \"\\tfile system id: %llu\\n\"\n               \"\\tbit mask of f_flag values: %llu\\n\"\n               \"\\tmaximum filename length: %llu\\n\",\n               (unsigned long long) sftpstatvfs->f_bsize,\n               (unsigned long long) sftpstatvfs->f_frsize,\n               (unsigned long long) sftpstatvfs->f_blocks,\n               (unsigned long long) sftpstatvfs->f_bfree,\n               (unsigned long long) sftpstatvfs->f_bavail,\n               (unsigned long long) sftpstatvfs->f_files,\n               (unsigned long long) sftpstatvfs->f_ffree,\n               (unsigned long long) sftpstatvfs->f_favail,\n               (unsigned long long) sftpstatvfs->f_fsid,\n               (unsigned long long) sftpstatvfs->f_flag,\n               (unsigned long long) sftpstatvfs->f_namemax);\n\n        sftp_statvfs_free(sftpstatvfs);\n\n        if (statvfs(\"/tmp\", &sysstatvfs) < 0) {\n            fprintf(stderr, \"statvfs failed (%s)\\n\", strerror(errno));\n            goto end;\n        }\n\n        printf(\"sys statvfs:\\n\"\n               \"\\tfile system block size: %llu\\n\"\n               \"\\tfundamental fs block size: %llu\\n\"\n               \"\\tnumber of blocks (unit f_frsize): %llu\\n\"\n               \"\\tfree blocks in file system: %llu\\n\"\n               \"\\tfree blocks for non-root: %llu\\n\"\n               \"\\ttotal file inodes: %llu\\n\"\n               \"\\tfree file inodes: %llu\\n\"\n               \"\\tfree file inodes for to non-root: %llu\\n\"\n               \"\\tfile system id: %llu\\n\"\n               \"\\tbit mask of f_flag values: %llu\\n\"\n               \"\\tmaximum filename length: %llu\\n\",\n               (unsigned long long) sysstatvfs.f_bsize,\n               (unsigned long long) sysstatvfs.f_frsize,\n               (unsigned long long) sysstatvfs.f_blocks,\n               (unsigned long long) sysstatvfs.f_bfree,\n               (unsigned long long) sysstatvfs.f_bavail,\n               (unsigned long long) sysstatvfs.f_files,\n               (unsigned long long) sysstatvfs.f_ffree,\n               (unsigned long long) sysstatvfs.f_favail,\n               (unsigned long long) sysstatvfs.f_fsid,\n               (unsigned long long) sysstatvfs.f_flag,\n               (unsigned long long) sysstatvfs.f_namemax);\n    }\n\n    /* the connection is made */\n    /* opening a directory */\n    dir = sftp_opendir(sftp, \"./\");\n    if (!dir) {\n        fprintf(stderr, \"Directory not opened(%s)\\n\", ssh_get_error(session));\n        goto end;\n    }\n\n    /* reading the whole directory, file by file */\n    while ((file = sftp_readdir(sftp, dir))) {\n        fprintf(stderr, \"%30s(%.8o) : %s(%.5d) %s(%.5d) : %.10llu bytes\\n\",\n                file->name,\n                file->permissions,\n                file->owner,\n                file->uid,\n                file->group,\n                file->gid,\n                (long long unsigned int) file->size);\n        sftp_attributes_free(file);\n    }\n\n    /* when file = NULL, an error has occured OR the directory listing is end of\n     * file */\n    if (!sftp_dir_eof(dir)) {\n        fprintf(stderr, \"Error: %s\\n\", ssh_get_error(session));\n        goto end;\n    }\n\n    if (sftp_closedir(dir)) {\n        fprintf(stderr, \"Error: %s\\n\", ssh_get_error(session));\n        goto end;\n    }\n    /* this will open a file and copy it into your /home directory */\n    /* the small buffer size was intended to stress the library. of course, you\n     * can use a buffer till 20kbytes without problem */\n\n    fichier = sftp_open(sftp, \"/usr/bin/ssh\", O_RDONLY, 0);\n    if (!fichier) {\n        fprintf(stderr, \"Error opening /usr/bin/ssh: %s\\n\",\n                ssh_get_error(session));\n        goto end;\n    }\n\n    /* open a file for writing... */\n    to = sftp_open(sftp, \"ssh-copy\", O_WRONLY | O_CREAT, 0700);\n    if (!to) {\n        fprintf(stderr, \"Error opening ssh-copy for writing: %s\\n\",\n                ssh_get_error(session));\n        sftp_close(fichier);\n        goto end;\n    }\n\n    while ((len = sftp_read(fichier, data, 4096)) > 0) {\n        if (sftp_write(to, data, len) != len) {\n            fprintf(stderr, \"Error writing %d bytes: %s\\n\",\n                    len, ssh_get_error(session));\n            sftp_close(to);\n            sftp_close(fichier);\n            goto end;\n        }\n    }\n\n    printf(\"finished\\n\");\n    if (len < 0) {\n        fprintf(stderr, \"Error reading file: %s\\n\", ssh_get_error(session));\n    }\n\n    sftp_close(fichier);\n    sftp_close(to);\n    printf(\"fichiers ferm\\n\");\n    to = sftp_open(sftp, \"/tmp/grosfichier\", O_WRONLY|O_CREAT, 0644);\n\n    for (i = 0; i < 1000; ++i) {\n        len = sftp_write(to, data, DATALEN);\n        printf(\"wrote %d bytes\\n\", len);\n        if (len != DATALEN) {\n            printf(\"chunk %d : %d (%s)\\n\", i, len, ssh_get_error(session));\n        }\n    }\n\n    sftp_close(to);\nend:\n    /* close the sftp session */\n    sftp_free(sftp);\n    printf(\"sftp session terminated\\n\");\n}\n\nstatic void usage(const char *argv0) {\n    fprintf(stderr, \"Usage : %s [-v] remotehost\\n\"\n            \"sample sftp test client - libssh-%s\\n\"\n            \"Options :\\n\"\n            \"  -v : increase log verbosity\\n\",\n            argv0,\n            ssh_version(0));\n    exit(0);\n}\n\nstatic int opts(int argc, char **argv) {\n    int i;\n\n    while ((i = getopt(argc, argv, \"v\")) != -1) {\n        switch(i) {\n        case 'v':\n            verbosity++;\n            break;\n        default:\n            fprintf(stderr, \"unknown option %c\\n\", optopt);\n            usage(argv[0]);\n            return -1;\n        }\n    }\n\n    destination = argv[optind];\n    if (destination == NULL) {\n        usage(argv[0]);\n        return -1;\n    }\n    return 0;\n}\n\nint main(int argc, char **argv) {\n    ssh_session session;\n\n    if (opts(argc, argv) < 0) {\n        return EXIT_FAILURE;\n    }\n\n    session = connect_ssh(destination, NULL, verbosity);\n    if (session == NULL) {\n        return EXIT_FAILURE;\n    }\n\n    do_sftp(session);\n    ssh_disconnect(session);\n    ssh_free(session);\n    return 0;\n}\n\n#endif\n"
  },
  {
    "path": "src/libssh/examples/samplesshd-cb.c",
    "content": "/* This is a sample implementation of a libssh based SSH server */\n/*\nCopyright 2003-2009 Aris Adamantiadis\n\nThis file is part of the SSH Library\n\nYou are free to copy this file, modify it in any way, consider it being public\ndomain. This does not apply to the rest of the library though, but it is\nallowed to cut-and-paste working code from this file to any license of\nprogram.\nThe goal is to show the API in action. It's not a reference on how terminal\nclients must be made or how a client should react.\n*/\n\n#include \"config.h\"\n\n#include <libssh/libssh.h>\n#include <libssh/server.h>\n#include <libssh/callbacks.h>\n\n#ifdef HAVE_ARGP_H\n#include <argp.h>\n#endif\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n\n#ifndef KEYS_FOLDER\n#ifdef _WIN32\n#define KEYS_FOLDER\n#else\n#define KEYS_FOLDER \"/etc/ssh/\"\n#endif\n#endif\n\n#define USER \"myuser\"\n#define PASSWORD \"mypassword\"\n\nstatic int authenticated=0;\nstatic int tries = 0;\nstatic int error = 0;\nstatic ssh_channel chan=NULL;\n\nstatic int auth_password(ssh_session session, const char *user,\n        const char *password, void *userdata){\n    (void)userdata;\n    printf(\"Authenticating user %s pwd %s\\n\",user, password);\n    if(strcmp(user,USER) == 0 && strcmp(password, PASSWORD) == 0){\n        authenticated = 1;\n        printf(\"Authenticated\\n\");\n        return SSH_AUTH_SUCCESS;\n    }\n    if (tries >= 3){\n        printf(\"Too many authentication tries\\n\");\n        ssh_disconnect(session);\n        error = 1;\n        return SSH_AUTH_DENIED;\n    }\n    tries++;\n    return SSH_AUTH_DENIED;\n}\n\nstatic int auth_gssapi_mic(ssh_session session, const char *user, const char *principal, void *userdata){\n    ssh_gssapi_creds creds = ssh_gssapi_get_creds(session);\n    (void)userdata;\n    printf(\"Authenticating user %s with gssapi principal %s\\n\",user, principal);\n    if (creds != NULL)\n        printf(\"Received some gssapi credentials\\n\");\n    else\n        printf(\"Not received any forwardable creds\\n\");\n    printf(\"authenticated\\n\");\n    authenticated = 1;\n    return SSH_AUTH_SUCCESS;\n}\n\nstatic int pty_request(ssh_session session, ssh_channel channel, const char *term,\n        int x,int y, int px, int py, void *userdata){\n    (void) session;\n    (void) channel;\n    (void) term;\n    (void) x;\n    (void) y;\n    (void) px;\n    (void) py;\n    (void) userdata;\n    printf(\"Allocated terminal\\n\");\n    return 0;\n}\n\nstatic int shell_request(ssh_session session, ssh_channel channel, void *userdata){\n    (void)session;\n    (void)channel;\n    (void)userdata;\n    printf(\"Allocated shell\\n\");\n    return 0;\n}\nstruct ssh_channel_callbacks_struct channel_cb = {\n    .channel_pty_request_function = pty_request,\n    .channel_shell_request_function = shell_request\n};\n\nstatic ssh_channel new_session_channel(ssh_session session, void *userdata){\n    (void) session;\n    (void) userdata;\n    if(chan != NULL)\n        return NULL;\n    printf(\"Allocated session channel\\n\");\n    chan = ssh_channel_new(session);\n    ssh_callbacks_init(&channel_cb);\n    ssh_set_channel_callbacks(chan, &channel_cb);\n    return chan;\n}\n\n\n#ifdef HAVE_ARGP_H\nconst char *argp_program_version = \"libssh server example \"\nSSH_STRINGIFY(LIBSSH_VERSION);\nconst char *argp_program_bug_address = \"<libssh@libssh.org>\";\n\n/* Program documentation. */\nstatic char doc[] = \"libssh -- a Secure Shell protocol implementation\";\n\n/* A description of the arguments we accept. */\nstatic char args_doc[] = \"BINDADDR\";\n\n/* The options we understand. */\nstatic struct argp_option options[] = {\n    {\n        .name  = \"port\",\n        .key   = 'p',\n        .arg   = \"PORT\",\n        .flags = 0,\n        .doc   = \"Set the port to bind.\",\n        .group = 0\n    },\n    {\n        .name  = \"hostkey\",\n        .key   = 'k',\n        .arg   = \"FILE\",\n        .flags = 0,\n        .doc   = \"Set the host key.\",\n        .group = 0\n    },\n    {\n        .name  = \"dsakey\",\n        .key   = 'd',\n        .arg   = \"FILE\",\n        .flags = 0,\n        .doc   = \"Set the dsa key.\",\n        .group = 0\n    },\n    {\n        .name  = \"rsakey\",\n        .key   = 'r',\n        .arg   = \"FILE\",\n        .flags = 0,\n        .doc   = \"Set the rsa key.\",\n        .group = 0\n    },\n    {\n        .name  = \"verbose\",\n        .key   = 'v',\n        .arg   = NULL,\n        .flags = 0,\n        .doc   = \"Get verbose output.\",\n        .group = 0\n    },\n    {NULL, 0, NULL, 0, NULL, 0}\n};\n\n/* Parse a single option. */\nstatic error_t parse_opt (int key, char *arg, struct argp_state *state) {\n    /* Get the input argument from argp_parse, which we\n     * know is a pointer to our arguments structure.\n     */\n    ssh_bind sshbind = state->input;\n\n    switch (key) {\n        case 'p':\n            ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_BINDPORT_STR, arg);\n            break;\n        case 'd':\n            ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_DSAKEY, arg);\n            break;\n        case 'k':\n            ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_HOSTKEY, arg);\n            break;\n        case 'r':\n            ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_RSAKEY, arg);\n            break;\n        case 'v':\n            ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_LOG_VERBOSITY_STR, \"3\");\n            break;\n        case ARGP_KEY_ARG:\n            if (state->arg_num >= 1) {\n                /* Too many arguments. */\n                argp_usage (state);\n            }\n            ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_BINDADDR, arg);\n            break;\n        case ARGP_KEY_END:\n            if (state->arg_num < 1) {\n                /* Not enough arguments. */\n                argp_usage (state);\n            }\n            break;\n        default:\n            return ARGP_ERR_UNKNOWN;\n    }\n\n    return 0;\n}\n\n/* Our argp parser. */\nstatic struct argp argp = {options, parse_opt, args_doc, doc, NULL, NULL, NULL};\n#endif /* HAVE_ARGP_H */\n\nint main(int argc, char **argv){\n    ssh_session session;\n    ssh_bind sshbind;\n    ssh_event mainloop;\n    struct ssh_server_callbacks_struct cb = {\n        .userdata = NULL,\n        .auth_password_function = auth_password,\n        .auth_gssapi_mic_function = auth_gssapi_mic,\n        .channel_open_request_session_function = new_session_channel\n    };\n\n    char buf[2048];\n    int i;\n    int r;\n\n    sshbind=ssh_bind_new();\n    session=ssh_new();\n\n    ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_DSAKEY, KEYS_FOLDER \"ssh_host_dsa_key\");\n    ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_RSAKEY, KEYS_FOLDER \"ssh_host_rsa_key\");\n\n#ifdef HAVE_ARGP_H\n    /*\n     * Parse our arguments; every option seen by parse_opt will\n     * be reflected in arguments.\n     */\n    argp_parse (&argp, argc, argv, 0, 0, sshbind);\n#else\n    (void) argc;\n    (void) argv;\n#endif\n\n    if(ssh_bind_listen(sshbind)<0){\n        printf(\"Error listening to socket: %s\\n\",ssh_get_error(sshbind));\n        return 1;\n    }\n    r=ssh_bind_accept(sshbind,session);\n    if(r==SSH_ERROR){\n        printf(\"error accepting a connection : %s\\n\",ssh_get_error(sshbind));\n        return 1;\n    }\n    ssh_callbacks_init(&cb);\n    ssh_set_server_callbacks(session, &cb);\n\n    if (ssh_handle_key_exchange(session)) {\n        printf(\"ssh_handle_key_exchange: %s\\n\", ssh_get_error(session));\n        return 1;\n    }\n    ssh_set_auth_methods(session,SSH_AUTH_METHOD_PASSWORD | SSH_AUTH_METHOD_GSSAPI_MIC);\n    mainloop = ssh_event_new();\n    ssh_event_add_session(mainloop, session);\n\n    while (!(authenticated && chan != NULL)){\n        if(error)\n            break;\n        r = ssh_event_dopoll(mainloop, -1);\n        if (r == SSH_ERROR){\n            printf(\"Error : %s\\n\",ssh_get_error(session));\n            ssh_disconnect(session);\n            return 1;\n        }\n    }\n    if(error){\n        printf(\"Error, exiting loop\\n\");\n    } else\n        printf(\"Authenticated and got a channel\\n\");\n    do{\n        i=ssh_channel_read(chan,buf, 2048, 0);\n        if(i>0) {\n            ssh_channel_write(chan, buf, i);\n            if (write(1,buf,i) < 0) {\n                printf(\"error writing to buffer\\n\");\n                return 1;\n            }\n            if (buf[0] == '\\x0d') {\n                if (write(1, \"\\n\", 1) < 0) {\n                    printf(\"error writing to buffer\\n\");\n                    return 1;\n                }\n                ssh_channel_write(chan, \"\\n\", 1);\n            }\n        }\n    } while (i>0);\n    ssh_disconnect(session);\n    ssh_bind_free(sshbind);\n    ssh_finalize();\n    return 0;\n}\n\n"
  },
  {
    "path": "src/libssh/examples/samplesshd-kbdint.c",
    "content": "/* This is a sample implementation of a libssh based SSH server */\n/*\nCopyright 2003-2011 Aris Adamantiadis\n\nThis file is part of the SSH Library\n\nYou are free to copy this file, modify it in any way, consider it being public\ndomain. This does not apply to the rest of the library though, but it is\nallowed to cut-and-paste working code from this file to any license of\nprogram.\nThe goal is to show the API in action. It's not a reference on how terminal\nclients must be made or how a client should react.\n*/\n\n#include \"config.h\"\n\n#include <libssh/libssh.h>\n#include <libssh/server.h>\n\n#ifdef HAVE_ARGP_H\n#include <argp.h>\n#endif\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdbool.h>\n\n#define SSHD_USER \"libssh\"\n#define SSHD_PASSWORD \"libssh\"\n\n#ifndef KEYS_FOLDER\n#ifdef _WIN32\n#define KEYS_FOLDER\n#else\n#define KEYS_FOLDER \"/etc/ssh/\"\n#endif\n#endif\n\nstatic int port = 22;\nstatic bool authenticated = false;\n\n#ifdef WITH_PCAP\nstatic const char *pcap_file = \"debug.server.pcap\";\nstatic ssh_pcap_file pcap;\n\nstatic void set_pcap(ssh_session session){\n\tif(!pcap_file)\n\t\treturn;\n\tpcap=ssh_pcap_file_new();\n\tif(ssh_pcap_file_open(pcap,pcap_file) == SSH_ERROR){\n\t\tprintf(\"Error opening pcap file\\n\");\n\t\tssh_pcap_file_free(pcap);\n\t\tpcap=NULL;\n\t\treturn;\n\t}\n\tssh_set_pcap_file(session,pcap);\n}\n\nstatic void cleanup_pcap(void) {\n\tssh_pcap_file_free(pcap);\n\tpcap=NULL;\n}\n#endif\n\n\nstatic int auth_password(const char *user, const char *password)\n{\n    int cmp;\n\n    cmp = strcmp(user, SSHD_USER);\n    if (cmp != 0) {\n        return 0;\n    }\n    cmp = strcmp(password, SSHD_PASSWORD);\n    if (cmp != 0) {\n        return 0;\n    }\n\n    authenticated = true;\n    return 1; // authenticated\n}\n#ifdef HAVE_ARGP_H\nconst char *argp_program_version = \"libssh server example \"\n  SSH_STRINGIFY(LIBSSH_VERSION);\nconst char *argp_program_bug_address = \"<libssh@libssh.org>\";\n\n/* Program documentation. */\nstatic char doc[] = \"libssh -- a Secure Shell protocol implementation\";\n\n/* A description of the arguments we accept. */\nstatic char args_doc[] = \"BINDADDR\";\n\n/* The options we understand. */\nstatic struct argp_option options[] = {\n  {\n    .name  = \"port\",\n    .key   = 'p',\n    .arg   = \"PORT\",\n    .flags = 0,\n    .doc   = \"Set the port to bind.\",\n    .group = 0\n  },\n  {\n    .name  = \"hostkey\",\n    .key   = 'k',\n    .arg   = \"FILE\",\n    .flags = 0,\n    .doc   = \"Set the host key.\",\n    .group = 0\n  },\n  {\n    .name  = \"dsakey\",\n    .key   = 'd',\n    .arg   = \"FILE\",\n    .flags = 0,\n    .doc   = \"Set the dsa key.\",\n    .group = 0\n  },\n  {\n    .name  = \"rsakey\",\n    .key   = 'r',\n    .arg   = \"FILE\",\n    .flags = 0,\n    .doc   = \"Set the rsa key.\",\n    .group = 0\n  },\n  {\n    .name  = \"verbose\",\n    .key   = 'v',\n    .arg   = NULL,\n    .flags = 0,\n    .doc   = \"Get verbose output.\",\n    .group = 0\n  },\n  {NULL, 0, 0, 0, NULL, 0}\n};\n\n/* Parse a single option. */\nstatic error_t parse_opt (int key, char *arg, struct argp_state *state) {\n  /* Get the input argument from argp_parse, which we\n   * know is a pointer to our arguments structure.\n   */\n  ssh_bind sshbind = state->input;\n\n  switch (key) {\n    case 'p':\n      ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_BINDPORT_STR, arg);\n      port = atoi(arg);\n      break;\n    case 'd':\n      ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_DSAKEY, arg);\n      break;\n    case 'k':\n      ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_HOSTKEY, arg);\n      break;\n    case 'r':\n      ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_RSAKEY, arg);\n      break;\n    case 'v':\n      ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_LOG_VERBOSITY_STR, \"3\");\n      break;\n    case ARGP_KEY_ARG:\n      if (state->arg_num >= 1) {\n        /* Too many arguments. */\n        argp_usage (state);\n      }\n      ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_BINDADDR, arg);\n      break;\n    case ARGP_KEY_END:\n      if (state->arg_num < 1) {\n        /* Not enough arguments. */\n        argp_usage (state);\n      }\n      break;\n    default:\n      return ARGP_ERR_UNKNOWN;\n  }\n\n  return 0;\n}\n\n/* Our argp parser. */\nstatic struct argp argp = {options, parse_opt, args_doc, doc, NULL, NULL, NULL};\n#endif /* HAVE_ARGP_H */\n\nstatic const char *name;\nstatic const char *instruction;\nstatic const char *prompts[2];\nstatic char echo[] = { 1, 0 };\n\nstatic int kbdint_check_response(ssh_session session) {\n    int count;\n\n    count = ssh_userauth_kbdint_getnanswers(session);\n    if(count != 2) {\n        instruction = \"Something weird happened :(\";\n        return 0;\n    }\n    if(strcasecmp(\"Arthur Dent\",\n                        ssh_userauth_kbdint_getanswer(session, 0)) != 0) {\n        instruction = \"OK, this is not YOUR name, \"\n                                        \"but it's a reference to the HGTG...\";\n        prompts[0] = \"The main character's full name: \";\n        return 0;\n    }\n    if(strcmp(\"42\", ssh_userauth_kbdint_getanswer(session, 1)) != 0) {\n        instruction = \"Make an effort !!! What is the Answer to the Ultimate \"\n                            \"Question of Life, the Universe, and Everything ?\";\n        prompts[1] = \"Answer to the Ultimate Question of Life, the Universe, \"\n                            \"and Everything: \";\n        return 0;\n    }\n\n    authenticated = true;\n    return 1;\n}\n\nstatic int authenticate(ssh_session session) {\n    ssh_message message;\n\n    name = \"\\n\\nKeyboard-Interactive Fancy Authentication\\n\";\n    instruction = \"Please enter your real name and your password\";\n    prompts[0] = \"Real name: \";\n    prompts[1] = \"Password: \";\n\n    do {\n        message=ssh_message_get(session);\n        if(!message)\n            break;\n        switch(ssh_message_type(message)){\n            case SSH_REQUEST_AUTH:\n                switch(ssh_message_subtype(message)){\n                    case SSH_AUTH_METHOD_PASSWORD:\n                        printf(\"User %s wants to auth with pass %s\\n\",\n                               ssh_message_auth_user(message),\n                               ssh_message_auth_password(message));\n                        if(auth_password(ssh_message_auth_user(message),\n                           ssh_message_auth_password(message))){\n                               ssh_message_auth_reply_success(message,0);\n                               ssh_message_free(message);\n                               return 1;\n                           }\n                        ssh_message_auth_set_methods(message,\n                                                SSH_AUTH_METHOD_PASSWORD |\n                                                SSH_AUTH_METHOD_INTERACTIVE);\n                        // not authenticated, send default message\n                        ssh_message_reply_default(message);\n                        break;\n\n                    case SSH_AUTH_METHOD_INTERACTIVE:\n                        if(!ssh_message_auth_kbdint_is_response(message)) {\n                            printf(\"User %s wants to auth with kbdint\\n\",\n                                   ssh_message_auth_user(message));\n                            ssh_message_auth_interactive_request(message, name,\n                                                    instruction, 2, prompts, echo);\n                        } else {\n                            if(kbdint_check_response(session)) {\n                                ssh_message_auth_reply_success(message,0);\n                                ssh_message_free(message);\n                                return 1;\n                            }\n                            ssh_message_auth_set_methods(message,\n                                                    SSH_AUTH_METHOD_PASSWORD |\n                                                    SSH_AUTH_METHOD_INTERACTIVE);\n                            ssh_message_reply_default(message);\n                        }\n                        break;\n                    case SSH_AUTH_METHOD_NONE:\n                    default:\n                        printf(\"User %s wants to auth with unknown auth %d\\n\",\n                               ssh_message_auth_user(message),\n                               ssh_message_subtype(message));\n                        ssh_message_auth_set_methods(message,\n                                                SSH_AUTH_METHOD_PASSWORD |\n                                                SSH_AUTH_METHOD_INTERACTIVE);\n                        ssh_message_reply_default(message);\n                        break;\n                }\n                break;\n            default:\n                ssh_message_auth_set_methods(message,\n                                                SSH_AUTH_METHOD_PASSWORD |\n                                                SSH_AUTH_METHOD_INTERACTIVE);\n                ssh_message_reply_default(message);\n        }\n        ssh_message_free(message);\n    } while (1);\n    return 0;\n}\n\nint main(int argc, char **argv){\n    ssh_session session;\n    ssh_bind sshbind;\n    ssh_message message;\n    ssh_channel chan=0;\n    char buf[2048];\n    int auth=0;\n    int shell=0;\n    int i;\n    int r;\n\n    sshbind=ssh_bind_new();\n    session=ssh_new();\n\n    ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_DSAKEY,\n                                            KEYS_FOLDER \"ssh_host_dsa_key\");\n    ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_RSAKEY,\n                                            KEYS_FOLDER \"ssh_host_rsa_key\");\n\n#ifdef HAVE_ARGP_H\n    /*\n     * Parse our arguments; every option seen by parse_opt will\n     * be reflected in arguments.\n     */\n    argp_parse (&argp, argc, argv, 0, 0, sshbind);\n#else\n    (void) argc;\n    (void) argv;\n#endif\n#ifdef WITH_PCAP\n    set_pcap(session);\n#endif\n\n    if(ssh_bind_listen(sshbind)<0){\n        printf(\"Error listening to socket: %s\\n\", ssh_get_error(sshbind));\n        return 1;\n    }\n    printf(\"Started sample libssh sshd on port %d\\n\", port);\n    printf(\"You can login as the user %s with the password %s\\n\", SSHD_USER,\n                                                            SSHD_PASSWORD);\n    r = ssh_bind_accept(sshbind, session);\n    if(r==SSH_ERROR){\n      printf(\"Error accepting a connection: %s\\n\", ssh_get_error(sshbind));\n      return 1;\n    }\n    if (ssh_handle_key_exchange(session)) {\n        printf(\"ssh_handle_key_exchange: %s\\n\", ssh_get_error(session));\n        return 1;\n    }\n\n    /* proceed to authentication */\n    auth = authenticate(session);\n    if (!auth || !authenticated) {\n        printf(\"Authentication error: %s\\n\", ssh_get_error(session));\n        ssh_disconnect(session);\n        return 1;\n    }\n\n\n    /* wait for a channel session */\n    do {\n        message = ssh_message_get(session);\n        if(message){\n            if(ssh_message_type(message) == SSH_REQUEST_CHANNEL_OPEN &&\n                    ssh_message_subtype(message) == SSH_CHANNEL_SESSION) {\n                chan = ssh_message_channel_request_open_reply_accept(message);\n                ssh_message_free(message);\n                break;\n            } else {\n                ssh_message_reply_default(message);\n                ssh_message_free(message);\n            }\n        } else {\n            break;\n        }\n    } while(!chan);\n\n    if(!chan) {\n        printf(\"Error: cleint did not ask for a channel session (%s)\\n\",\n                                                    ssh_get_error(session));\n        ssh_finalize();\n        return 1;\n    }\n\n\n    /* wait for a shell */\n    do {\n        message = ssh_message_get(session);\n        if(message != NULL) {\n            if(ssh_message_type(message) == SSH_REQUEST_CHANNEL &&\n                    ssh_message_subtype(message) == SSH_CHANNEL_REQUEST_SHELL) {\n                shell = 1;\n                ssh_message_channel_request_reply_success(message);\n                ssh_message_free(message);\n                break;\n            }\n            ssh_message_reply_default(message);\n            ssh_message_free(message);\n        } else {\n            break;\n        }\n    } while(!shell);\n\n    if(!shell) {\n        printf(\"Error: No shell requested (%s)\\n\", ssh_get_error(session));\n        return 1;\n    }\n\n\n    printf(\"it works !\\n\");\n    do{\n        i=ssh_channel_read(chan,buf, 2048, 0);\n        if(i>0) {\n            if(*buf == '\u0003' || *buf == '\u0004')\n                    break;\n            if(i == 1 && *buf == '\\r')\n                ssh_channel_write(chan, \"\\r\\n\", 2);\n            else\n                ssh_channel_write(chan, buf, i);\n            if (write(1,buf,i) < 0) {\n                printf(\"error writing to buffer\\n\");\n                return 1;\n            }\n        }\n    } while (i>0);\n    ssh_channel_close(chan);\n    ssh_disconnect(session);\n    ssh_bind_free(sshbind);\n#ifdef WITH_PCAP\n    cleanup_pcap();\n#endif\n    ssh_finalize();\n    return 0;\n}\n\n"
  },
  {
    "path": "src/libssh/examples/scp_download.c",
    "content": "/* scp_download.c\n * Sample implementation of a tiny SCP downloader client\n */\n\n/*\nCopyright 2009 Aris Adamantiadis\n\nThis file is part of the SSH Library\n\nYou are free to copy this file, modify it in any way, consider it being public\ndomain. This does not apply to the rest of the library though, but it is\nallowed to cut-and-paste working code from this file to any license of\nprogram.\n */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <errno.h>\n#include <sys/stat.h>\n\n#include <libssh/libssh.h>\n#include \"examples_common.h\"\n\nstatic int verbosity = 0;\nstatic const char *createcommand =\n    \"rm -fr /tmp/libssh_tests && mkdir /tmp/libssh_tests && \"\n    \"cd /tmp/libssh_tests && date > a && date > b && mkdir c && date > d\";\nstatic char *host = NULL;\n\nstatic void usage(const char *argv0){\n  fprintf(stderr,\"Usage : %s [options] host\\n\"\n      \"sample tiny scp downloader client - libssh-%s\\n\"\n\t  \"This program will create files in /tmp and try to fetch them\\n\",\n//      \"Options :\\n\",\n//      \"  -r : use RSA to verify host public key\\n\",\n      argv0,\n      ssh_version(0));\n  exit(0);\n}\n\nstatic int opts(int argc, char **argv){\n  int i;\n  while((i=getopt(argc,argv,\"v\"))!=-1){\n    switch(i){\n      case 'v':\n        verbosity++;\n        break;\n      default:\n        fprintf(stderr,\"unknown option %c\\n\",optopt);\n        usage(argv[0]);\n        return -1;\n    }\n  }\n  host = argv[optind];\n  if(host == NULL)\n\t  usage(argv[0]);\n  return 0;\n}\n\nstatic void create_files(ssh_session session){\n\tssh_channel channel=ssh_channel_new(session);\n\tchar buffer[1];\n        int rc;\n\n\tif(channel == NULL){\n\t\tfprintf(stderr,\"Error creating channel: %s\\n\",ssh_get_error(session));\n\t\texit(EXIT_FAILURE);\n\t}\n\tif(ssh_channel_open_session(channel) != SSH_OK){\n\t\tfprintf(stderr,\"Error creating channel: %s\\n\",ssh_get_error(session));\n\t\tssh_channel_free(channel);\n\t\texit(EXIT_FAILURE);\n\t}\n\tif(ssh_channel_request_exec(channel,createcommand) != SSH_OK){\n\t\tfprintf(stderr,\"Error executing command: %s\\n\",ssh_get_error(session));\n\t\tssh_channel_close(channel);\n\t\tssh_channel_free(channel);\n\t\texit(EXIT_FAILURE);\n\t}\n\twhile(!ssh_channel_is_eof(channel)){\n\t\trc = ssh_channel_read(channel,buffer,1,1);\n                if (rc != 1) {\n                    fprintf(stderr, \"Error reading from channel\\n\");\n                    ssh_channel_close(channel);\n                    ssh_channel_free(channel);\n                    return;\n                }\n\n                rc = write(1, buffer, 1);\n                if (rc < 0) {\n                    fprintf(stderr, \"Error writing to buffer\\n\");\n                    ssh_channel_close(channel);\n                    ssh_channel_free(channel);\n                    return;\n                }\n\t}\n\tssh_channel_close(channel);\n\tssh_channel_free(channel);\n}\n\n\nstatic int fetch_files(ssh_session session){\n  int size;\n  char buffer[16384];\n  int mode;\n  char *filename;\n  int r;\n  ssh_scp scp=ssh_scp_new(session, SSH_SCP_READ | SSH_SCP_RECURSIVE, \"/tmp/libssh_tests/*\");\n  if(ssh_scp_init(scp) != SSH_OK){\n\t  fprintf(stderr,\"error initializing scp: %s\\n\",ssh_get_error(session));\n\t  ssh_scp_free(scp);\n\t  return -1;\n  }\n  printf(\"Trying to download 3 files (a,b,d) and 1 directory (c)\\n\");\n  do {\n\n\t  r=ssh_scp_pull_request(scp);\n\t  switch(r){\n\t  case SSH_SCP_REQUEST_NEWFILE:\n\t\t  size=ssh_scp_request_get_size(scp);\n\t\t  filename=strdup(ssh_scp_request_get_filename(scp));\n\t\t  mode=ssh_scp_request_get_permissions(scp);\n\t\t  printf(\"downloading file %s, size %d, perms 0%o\\n\",filename,size,mode);\n\t\t  free(filename);\n\t\t  ssh_scp_accept_request(scp);\n\t\t  r=ssh_scp_read(scp,buffer,sizeof(buffer));\n\t\t  if(r==SSH_ERROR){\n\t\t\t  fprintf(stderr,\"Error reading scp: %s\\n\",ssh_get_error(session));\n\t\t\t  ssh_scp_close(scp);\n\t\t\t  ssh_scp_free(scp);\n\t\t\t  return -1;\n\t\t  }\n\t\t  printf(\"done\\n\");\n\t\t  break;\n\t  case SSH_ERROR:\n\t\t  fprintf(stderr,\"Error: %s\\n\",ssh_get_error(session));\n\t\t  ssh_scp_close(scp);\n\t\t  ssh_scp_free(scp);\n\t\t  return -1;\n\t  case SSH_SCP_REQUEST_WARNING:\n\t\t  fprintf(stderr,\"Warning: %s\\n\",ssh_scp_request_get_warning(scp));\n\t\t  break;\n\t  case SSH_SCP_REQUEST_NEWDIR:\n\t\t  filename=strdup(ssh_scp_request_get_filename(scp));\n\t\t  mode=ssh_scp_request_get_permissions(scp);\n\t\t  printf(\"downloading directory %s, perms 0%o\\n\",filename,mode);\n\t\t  free(filename);\n\t\t  ssh_scp_accept_request(scp);\n\t\t  break;\n\t  case SSH_SCP_REQUEST_ENDDIR:\n\t\t  printf(\"End of directory\\n\");\n\t\t  break;\n\t  case SSH_SCP_REQUEST_EOF:\n\t\t  printf(\"End of requests\\n\");\n\t\t  goto end;\n\t  }\n  } while (1);\n  end:\n  ssh_scp_close(scp);\n  ssh_scp_free(scp);\n  return 0;\n}\n\nint main(int argc, char **argv){\n  ssh_session session;\n  if(opts(argc,argv)<0)\n    return EXIT_FAILURE;\n  session=connect_ssh(host,NULL,verbosity);\n  if(session == NULL)\n\t  return EXIT_FAILURE;\n  create_files(session);\n  fetch_files(session);\n  ssh_disconnect(session);\n  ssh_free(session);\n  ssh_finalize();\n  return 0;\n}\n"
  },
  {
    "path": "src/libssh/examples/senddata.c",
    "content": "#include <stdio.h>\n\n#include <libssh/libssh.h>\n#include \"examples_common.h\"\n\n#define LIMIT 0x100000000UL\n\nint main(void) {\n  ssh_session session;\n  ssh_channel channel;\n  char buffer[1024*1024];\n  int rc;\n  uint64_t total=0;\n  uint64_t lastshown=4096;\n  session = connect_ssh(\"localhost\", NULL, 0);\n  if (session == NULL) {\n    return 1;\n  }\n\n  channel = ssh_channel_new(session);;\n  if (channel == NULL) {\n    ssh_disconnect(session);\n    return 1;\n  }\n\n  rc = ssh_channel_open_session(channel);\n  if (rc < 0) {\n    ssh_channel_close(channel);\n    ssh_disconnect(session);\n    return 1;\n  }\n\n  rc = ssh_channel_request_exec(channel, \"cat > /dev/null\");\n  if (rc < 0) {\n    ssh_channel_close(channel);\n    ssh_disconnect(session);\n    return 1;\n  }\n\n\n  while ((rc = ssh_channel_write(channel, buffer, sizeof(buffer))) > 0) {\n    total += rc;\n    if(total/2 >= lastshown){\n      printf(\"written %llx\\n\", (long long unsigned int) total);\n      lastshown=total;\n    }\n    if(total > LIMIT)\n      break;\n  }\n    \n  if (rc < 0) {\n    printf(\"error : %s\\n\",ssh_get_error(session));\n    ssh_channel_close(channel);\n    ssh_disconnect(session);\n    return 1;\n  }\n\n  ssh_channel_send_eof(channel);\n  ssh_channel_close(channel);\n\n  ssh_disconnect(session);\n\n  return 0;\n}\n"
  },
  {
    "path": "src/libssh/examples/ssh_client.c",
    "content": "/* ssh_client.c */\n\n/*\n * Copyright 2003-2015 Aris Adamantiadis\n *\n * This file is part of the SSH Library\n *\n * You are free to copy this file, modify it in any way, consider it being public\n * domain. This does not apply to the rest of the library though, but it is\n * allowed to cut-and-paste working code from this file to any license of\n * program.\n * The goal is to show the API in action. It's not a reference on how terminal\n * clients must be made or how a client should react.\n */\n\n#include \"config.h\"\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include <sys/select.h>\n#include <sys/time.h>\n\n#ifdef HAVE_TERMIOS_H\n#include <termios.h>\n#endif\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#ifdef HAVE_PTY_H\n#include <pty.h>\n#endif\n\n#include <sys/ioctl.h>\n#include <signal.h>\n#include <errno.h>\n#include <fcntl.h>\n\n#include <libssh/callbacks.h>\n#include <libssh/libssh.h>\n#include <libssh/sftp.h>\n\n\n#include \"examples_common.h\"\n#define MAXCMD 10\n\nstatic char *host;\nstatic char *user;\nstatic char *cmds[MAXCMD];\nstatic struct termios terminal;\n\nstatic char *pcap_file = NULL;\n\nstatic char *proxycommand;\n\nstatic int auth_callback(const char *prompt,\n                         char *buf,\n                         size_t len,\n                         int echo,\n                         int verify,\n                         void *userdata)\n{\n    (void) verify;\n    (void) userdata;\n\n    return ssh_getpass(prompt, buf, len, echo, verify);\n}\n\nstruct ssh_callbacks_struct cb = {\n    .auth_function = auth_callback,\n    .userdata = NULL,\n};\n\nstatic void add_cmd(char *cmd)\n{\n    int n;\n\n    for (n = 0; (n < MAXCMD) && cmds[n] != NULL; n++);\n\n    if (n == MAXCMD) {\n        return;\n    }\n\n    cmds[n] = strdup(cmd);\n}\n\nstatic void usage(void)\n{\n    fprintf(stderr,\n            \"Usage : ssh [options] [login@]hostname\\n\"\n            \"sample client - libssh-%s\\n\"\n            \"Options :\\n\"\n            \"  -l user : log in as user\\n\"\n            \"  -p port : connect to port\\n\"\n            \"  -d : use DSS to verify host public key\\n\"\n            \"  -r : use RSA to verify host public key\\n\"\n#ifdef WITH_PCAP\n            \"  -P file : create a pcap debugging file\\n\"\n#endif\n#ifndef _WIN32\n            \"  -T proxycommand : command to execute as a socket proxy\\n\"\n#endif\n            \"\\n\",\n            ssh_version(0));\n\n    exit(0);\n}\n\nstatic int opts(int argc, char **argv)\n{\n    int i;\n\n    while((i = getopt(argc,argv,\"T:P:\")) != -1) {\n        switch(i){\n        case 'P':\n            pcap_file = optarg;\n            break;\n#ifndef _WIN32\n        case 'T':\n            proxycommand = optarg;\n            break;\n#endif\n        default:\n            fprintf(stderr, \"Unknown option %c\\n\", optopt);\n            usage();\n        }\n    }\n    if (optind < argc) {\n        host = argv[optind++];\n    }\n\n    while(optind < argc) {\n        add_cmd(argv[optind++]);\n    }\n\n    if (host == NULL) {\n        usage();\n    }\n\n    return 0;\n}\n\n#ifndef HAVE_CFMAKERAW\nstatic void cfmakeraw(struct termios *termios_p)\n{\n    termios_p->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON);\n    termios_p->c_oflag &= ~OPOST;\n    termios_p->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);\n    termios_p->c_cflag &= ~(CSIZE|PARENB);\n    termios_p->c_cflag |= CS8;\n}\n#endif\n\n\nstatic void do_cleanup(int i)\n{\n  /* unused variable */\n  (void) i;\n\n  tcsetattr(0, TCSANOW, &terminal);\n}\n\nstatic void do_exit(int i)\n{\n    /* unused variable */\n    (void) i;\n\n    do_cleanup(0);\n    exit(0);\n}\n\nstatic ssh_channel chan;\nstatic int signal_delayed = 0;\n\nstatic void sigwindowchanged(int i)\n{\n    (void) i;\n    signal_delayed = 1;\n}\n\nstatic void setsignal(void)\n{\n    signal(SIGWINCH, sigwindowchanged);\n    signal_delayed = 0;\n}\n\nstatic void sizechanged(void)\n{\n    struct winsize win = {\n        .ws_row = 0,\n    };\n\n    ioctl(1, TIOCGWINSZ, &win);\n    ssh_channel_change_pty_size(chan,win.ws_col, win.ws_row);\n    setsignal();\n}\n\nstatic void select_loop(ssh_session session,ssh_channel channel)\n{\n    ssh_connector connector_in, connector_out, connector_err;\n    int rc;\n\n    ssh_event event = ssh_event_new();\n\n    /* stdin */\n    connector_in = ssh_connector_new(session);\n    ssh_connector_set_out_channel(connector_in, channel, SSH_CONNECTOR_STDINOUT);\n    ssh_connector_set_in_fd(connector_in, 0);\n    ssh_event_add_connector(event, connector_in);\n\n    /* stdout */\n    connector_out = ssh_connector_new(session);\n    ssh_connector_set_out_fd(connector_out, 1);\n    ssh_connector_set_in_channel(connector_out, channel, SSH_CONNECTOR_STDINOUT);\n    ssh_event_add_connector(event, connector_out);\n\n    /* stderr */\n    connector_err = ssh_connector_new(session);\n    ssh_connector_set_out_fd(connector_err, 2);\n    ssh_connector_set_in_channel(connector_err, channel, SSH_CONNECTOR_STDERR);\n    ssh_event_add_connector(event, connector_err);\n\n    while (ssh_channel_is_open(channel)) {\n        if (signal_delayed) {\n            sizechanged();\n        }\n        rc = ssh_event_dopoll(event, 60000);\n        if (rc == SSH_ERROR) {\n            fprintf(stderr, \"Error in ssh_event_dopoll()\\n\");\n            break;\n        }\n    }\n    ssh_event_remove_connector(event, connector_in);\n    ssh_event_remove_connector(event, connector_out);\n    ssh_event_remove_connector(event, connector_err);\n\n    ssh_connector_free(connector_in);\n    ssh_connector_free(connector_out);\n    ssh_connector_free(connector_err);\n\n    ssh_event_free(event);\n}\n\nstatic void shell(ssh_session session)\n{\n    ssh_channel channel;\n    struct termios terminal_local;\n    int interactive=isatty(0);\n\n    channel = ssh_channel_new(session);\n    if (channel == NULL) {\n        return;\n    }\n\n    if (interactive) {\n        tcgetattr(0, &terminal_local);\n        memcpy(&terminal, &terminal_local, sizeof(struct termios));\n    }\n\n    if (ssh_channel_open_session(channel)) {\n        printf(\"Error opening channel : %s\\n\", ssh_get_error(session));\n        ssh_channel_free(channel);\n        return;\n    }\n    chan = channel;\n    if (interactive) {\n        ssh_channel_request_pty(channel);\n        sizechanged();\n    }\n\n    if (ssh_channel_request_shell(channel)) {\n        printf(\"Requesting shell : %s\\n\", ssh_get_error(session));\n        ssh_channel_free(channel);\n        return;\n    }\n\n    if (interactive) {\n        cfmakeraw(&terminal_local);\n        tcsetattr(0, TCSANOW, &terminal_local);\n        setsignal();\n    }\n    signal(SIGTERM, do_cleanup);\n    select_loop(session, channel);\n    if (interactive) {\n        do_cleanup(0);\n    }\n    ssh_channel_free(channel);\n}\n\nstatic void batch_shell(ssh_session session)\n{\n    ssh_channel channel;\n    char buffer[1024];\n    size_t i;\n    int s = 0;\n\n    for (i = 0; i < MAXCMD && cmds[i]; ++i) {\n        s += snprintf(buffer + s, sizeof(buffer) - s, \"%s \", cmds[i]);\n        free(cmds[i]);\n        cmds[i] = NULL;\n    }\n\n    channel = ssh_channel_new(session);\n    if (channel == NULL) {\n        return;\n    }\n\n    ssh_channel_open_session(channel);\n    if (ssh_channel_request_exec(channel, buffer)) {\n        printf(\"Error executing '%s' : %s\\n\", buffer, ssh_get_error(session));\n        ssh_channel_free(channel);\n        return;\n    }\n    select_loop(session, channel);\n    ssh_channel_free(channel);\n}\n\nstatic int client(ssh_session session)\n{\n    int auth = 0;\n    char *banner;\n    int state;\n\n    if (user) {\n        if (ssh_options_set(session, SSH_OPTIONS_USER, user) < 0) {\n            return -1;\n        }\n    }\n    if (ssh_options_set(session, SSH_OPTIONS_HOST ,host) < 0) {\n        return -1;\n    }\n    if (proxycommand != NULL) {\n        if (ssh_options_set(session, SSH_OPTIONS_PROXYCOMMAND, proxycommand)) {\n            return -1;\n        }\n    }\n    ssh_options_parse_config(session, NULL);\n\n    if (ssh_connect(session)) {\n        fprintf(stderr, \"Connection failed : %s\\n\", ssh_get_error(session));\n        return -1;\n    }\n\n    state = verify_knownhost(session);\n    if (state != 0) {\n        return -1;\n    }\n\n    ssh_userauth_none(session, NULL);\n    banner = ssh_get_issue_banner(session);\n    if (banner) {\n        printf(\"%s\\n\", banner);\n        free(banner);\n    }\n    auth = authenticate_console(session);\n    if (auth != SSH_AUTH_SUCCESS) {\n        return -1;\n    }\n    if (cmds[0] == NULL) {\n        shell(session);\n    } else {\n        batch_shell(session);\n    }\n\n    return 0;\n}\n\nstatic ssh_pcap_file pcap;\nstatic void set_pcap(ssh_session session)\n{\n    if (pcap_file == NULL) {\n        return;\n    }\n\n    pcap = ssh_pcap_file_new();\n    if (pcap == NULL) {\n        return;\n    }\n\n    if (ssh_pcap_file_open(pcap, pcap_file) == SSH_ERROR) {\n        printf(\"Error opening pcap file\\n\");\n        ssh_pcap_file_free(pcap);\n        pcap = NULL;\n        return;\n    }\n    ssh_set_pcap_file(session, pcap);\n}\n\nstatic void cleanup_pcap(void)\n{\n    if (pcap != NULL) {\n        ssh_pcap_file_free(pcap);\n    }\n    pcap = NULL;\n}\n\nint main(int argc, char **argv)\n{\n    ssh_session session;\n\n    session = ssh_new();\n\n    ssh_callbacks_init(&cb);\n    ssh_set_callbacks(session,&cb);\n\n    if (ssh_options_getopt(session, &argc, argv)) {\n        fprintf(stderr,\n                \"Error parsing command line: %s\\n\",\n                ssh_get_error(session));\n        usage();\n    }\n    opts(argc, argv);\n    signal(SIGTERM, do_exit);\n\n    set_pcap(session);\n    client(session);\n\n    ssh_disconnect(session);\n    ssh_free(session);\n    cleanup_pcap();\n\n    ssh_finalize();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/libssh/examples/ssh_server_fork.c",
    "content": "/* This is a sample implementation of a libssh based SSH server */\n/*\nCopyright 2014 Audrius Butkevicius\n\nThis file is part of the SSH Library\n\nYou are free to copy this file, modify it in any way, consider it being public\ndomain. This does not apply to the rest of the library though, but it is\nallowed to cut-and-paste working code from this file to any license of\nprogram.\nThe goal is to show the API in action.\n*/\n\n#include \"config.h\"\n\n#include <libssh/callbacks.h>\n#include <libssh/server.h>\n\n#include <poll.h>\n#ifdef HAVE_ARGP_H\n#include <argp.h>\n#endif\n#include <fcntl.h>\n#ifdef HAVE_LIBUTIL_H\n#include <libutil.h>\n#endif\n#ifdef HAVE_PTY_H\n#include <pty.h>\n#endif\n#include <signal.h>\n#include <stdlib.h>\n#ifdef HAVE_UTMP_H\n#include <utmp.h>\n#endif\n#ifdef HAVE_UTIL_H\n#include <util.h>\n#endif\n#include <sys/ioctl.h>\n#include <sys/wait.h>\n#include <sys/stat.h>\n#include <stdio.h>\n\n#ifndef KEYS_FOLDER\n#ifdef _WIN32\n#define KEYS_FOLDER\n#else\n#define KEYS_FOLDER \"/etc/ssh/\"\n#endif\n#endif\n\n#define USER \"myuser\"\n#define PASS \"mypassword\"\n#define BUF_SIZE 1048576\n#define SESSION_END (SSH_CLOSED | SSH_CLOSED_ERROR)\n#define SFTP_SERVER_PATH \"/usr/lib/sftp-server\"\n\nstatic void set_default_keys(ssh_bind sshbind,\n                             int rsa_already_set,\n                             int dsa_already_set,\n                             int ecdsa_already_set) {\n    if (!rsa_already_set) {\n        ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_RSAKEY,\n                             KEYS_FOLDER \"ssh_host_rsa_key\");\n    }\n    if (!dsa_already_set) {\n        ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_DSAKEY,\n                             KEYS_FOLDER \"ssh_host_dsa_key\");\n    }\n    if (!ecdsa_already_set) {\n        ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_ECDSAKEY,\n                             KEYS_FOLDER \"ssh_host_ecdsa_key\");\n    }\n    ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_HOSTKEY,\n                         KEYS_FOLDER \"ssh_host_ed25519_key\");\n}\n#define DEF_STR_SIZE 1024\nchar authorizedkeys[DEF_STR_SIZE] = {0};\n#ifdef HAVE_ARGP_H\nconst char *argp_program_version = \"libssh server example \"\nSSH_STRINGIFY(LIBSSH_VERSION);\nconst char *argp_program_bug_address = \"<libssh@libssh.org>\";\n\n/* Program documentation. */\nstatic char doc[] = \"libssh -- a Secure Shell protocol implementation\";\n\n/* A description of the arguments we accept. */\nstatic char args_doc[] = \"BINDADDR\";\n\n/* The options we understand. */\nstatic struct argp_option options[] = {\n    {\n        .name  = \"port\",\n        .key   = 'p',\n        .arg   = \"PORT\",\n        .flags = 0,\n        .doc   = \"Set the port to bind.\",\n        .group = 0\n    },\n    {\n        .name  = \"hostkey\",\n        .key   = 'k',\n        .arg   = \"FILE\",\n        .flags = 0,\n        .doc   = \"Set a host key.  Can be used multiple times.  \"\n                 \"Implies no default keys.\",\n        .group = 0\n    },\n    {\n        .name  = \"dsakey\",\n        .key   = 'd',\n        .arg   = \"FILE\",\n        .flags = 0,\n        .doc   = \"Set the dsa key.\",\n        .group = 0\n    },\n    {\n        .name  = \"rsakey\",\n        .key   = 'r',\n        .arg   = \"FILE\",\n        .flags = 0,\n        .doc   = \"Set the rsa key.\",\n        .group = 0\n    },\n    {\n        .name  = \"ecdsakey\",\n        .key   = 'e',\n        .arg   = \"FILE\",\n        .flags = 0,\n        .doc   = \"Set the ecdsa key.\",\n        .group = 0\n    },\n    {\n        .name  = \"authorizedkeys\",\n        .key   = 'a',\n        .arg   = \"FILE\",\n        .flags = 0,\n        .doc   = \"Set the authorized keys file.\",\n        .group = 0\n    },\n    {\n        .name  = \"no-default-keys\",\n        .key   = 'n',\n        .arg   = NULL,\n        .flags = 0,\n        .doc   = \"Do not set default key locations.\",\n        .group = 0\n    },\n    {\n        .name  = \"verbose\",\n        .key   = 'v',\n        .arg   = NULL,\n        .flags = 0,\n        .doc   = \"Get verbose output.\",\n        .group = 0\n    },\n    {NULL, 0, NULL, 0, NULL, 0}\n};\n\n/* Parse a single option. */\nstatic error_t parse_opt (int key, char *arg, struct argp_state *state) {\n    /* Get the input argument from argp_parse, which we\n     * know is a pointer to our arguments structure. */\n    ssh_bind sshbind = state->input;\n    static int no_default_keys = 0;\n    static int rsa_already_set = 0, dsa_already_set = 0, ecdsa_already_set = 0;\n\n    switch (key) {\n        case 'n':\n            no_default_keys = 1;\n            break;\n        case 'p':\n            ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_BINDPORT_STR, arg);\n            break;\n        case 'd':\n            ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_DSAKEY, arg);\n            dsa_already_set = 1;\n            break;\n        case 'k':\n            ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_HOSTKEY, arg);\n            /* We can't track the types of keys being added with this\n               option, so let's ensure we keep the keys we're adding\n               by just not setting the default keys */\n            no_default_keys = 1;\n            break;\n        case 'r':\n            ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_RSAKEY, arg);\n            rsa_already_set = 1;\n            break;\n        case 'e':\n            ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_ECDSAKEY, arg);\n            ecdsa_already_set = 1;\n            break;\n        case 'a':\n            strncpy(authorizedkeys, arg, DEF_STR_SIZE-1);\n            break;\n        case 'v':\n            ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_LOG_VERBOSITY_STR,\n                                 \"3\");\n            break;\n        case ARGP_KEY_ARG:\n            if (state->arg_num >= 1) {\n                /* Too many arguments. */\n                argp_usage (state);\n            }\n            ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_BINDADDR, arg);\n            break;\n        case ARGP_KEY_END:\n            if (state->arg_num < 1) {\n                /* Not enough arguments. */\n                argp_usage (state);\n            }\n\n            if (!no_default_keys) {\n                set_default_keys(sshbind,\n                                 rsa_already_set,\n                                 dsa_already_set,\n                                 ecdsa_already_set);\n            }\n\n            break;\n        default:\n            return ARGP_ERR_UNKNOWN;\n    }\n    return 0;\n}\n\n/* Our argp parser. */\nstatic struct argp argp = {options, parse_opt, args_doc, doc, NULL, NULL, NULL};\n#endif /* HAVE_ARGP_H */\n\n/* A userdata struct for channel. */\nstruct channel_data_struct {\n    /* pid of the child process the channel will spawn. */\n    pid_t pid;\n    /* For PTY allocation */\n    socket_t pty_master;\n    socket_t pty_slave;\n    /* For communication with the child process. */\n    socket_t child_stdin;\n    socket_t child_stdout;\n    /* Only used for subsystem and exec requests. */\n    socket_t child_stderr;\n    /* Event which is used to poll the above descriptors. */\n    ssh_event event;\n    /* Terminal size struct. */\n    struct winsize *winsize;\n};\n\n/* A userdata struct for session. */\nstruct session_data_struct {\n    /* Pointer to the channel the session will allocate. */\n    ssh_channel channel;\n    int auth_attempts;\n    int authenticated;\n};\n\nstatic int data_function(ssh_session session, ssh_channel channel, void *data,\n                         uint32_t len, int is_stderr, void *userdata) {\n    struct channel_data_struct *cdata = (struct channel_data_struct *) userdata;\n\n    (void) session;\n    (void) channel;\n    (void) is_stderr;\n\n    if (len == 0 || cdata->pid < 1 || kill(cdata->pid, 0) < 0) {\n        return 0;\n    }\n\n    return write(cdata->child_stdin, (char *) data, len);\n}\n\nstatic int pty_request(ssh_session session, ssh_channel channel,\n                       const char *term, int cols, int rows, int py, int px,\n                       void *userdata) {\n    struct channel_data_struct *cdata = (struct channel_data_struct *)userdata;\n\n    (void) session;\n    (void) channel;\n    (void) term;\n\n    cdata->winsize->ws_row = rows;\n    cdata->winsize->ws_col = cols;\n    cdata->winsize->ws_xpixel = px;\n    cdata->winsize->ws_ypixel = py;\n\n    if (openpty(&cdata->pty_master, &cdata->pty_slave, NULL, NULL,\n                cdata->winsize) != 0) {\n        fprintf(stderr, \"Failed to open pty\\n\");\n        return SSH_ERROR;\n    }\n    return SSH_OK;\n}\n\nstatic int pty_resize(ssh_session session, ssh_channel channel, int cols,\n                      int rows, int py, int px, void *userdata) {\n    struct channel_data_struct *cdata = (struct channel_data_struct *)userdata;\n\n    (void) session;\n    (void) channel;\n\n    cdata->winsize->ws_row = rows;\n    cdata->winsize->ws_col = cols;\n    cdata->winsize->ws_xpixel = px;\n    cdata->winsize->ws_ypixel = py;\n\n    if (cdata->pty_master != -1) {\n        return ioctl(cdata->pty_master, TIOCSWINSZ, cdata->winsize);\n    }\n\n    return SSH_ERROR;\n}\n\nstatic int exec_pty(const char *mode, const char *command,\n                    struct channel_data_struct *cdata) {\n    switch(cdata->pid = fork()) {\n        case -1:\n            close(cdata->pty_master);\n            close(cdata->pty_slave);\n            fprintf(stderr, \"Failed to fork\\n\");\n            return SSH_ERROR;\n        case 0:\n            close(cdata->pty_master);\n            if (login_tty(cdata->pty_slave) != 0) {\n                exit(1);\n            }\n            execl(\"/bin/sh\", \"sh\", mode, command, NULL);\n            exit(0);\n        default:\n            close(cdata->pty_slave);\n            /* pty fd is bi-directional */\n            cdata->child_stdout = cdata->child_stdin = cdata->pty_master;\n    }\n    return SSH_OK;\n}\n\nstatic int exec_nopty(const char *command, struct channel_data_struct *cdata) {\n    int in[2], out[2], err[2];\n\n    /* Do the plumbing to be able to talk with the child process. */\n    if (pipe(in) != 0) {\n        goto stdin_failed;\n    }\n    if (pipe(out) != 0) {\n        goto stdout_failed;\n    }\n    if (pipe(err) != 0) {\n        goto stderr_failed;\n    }\n\n    switch(cdata->pid = fork()) {\n        case -1:\n            goto fork_failed;\n        case 0:\n            /* Finish the plumbing in the child process. */\n            close(in[1]);\n            close(out[0]);\n            close(err[0]);\n            dup2(in[0], STDIN_FILENO);\n            dup2(out[1], STDOUT_FILENO);\n            dup2(err[1], STDERR_FILENO);\n            close(in[0]);\n            close(out[1]);\n            close(err[1]);\n            /* exec the requested command. */\n            execl(\"/bin/sh\", \"sh\", \"-c\", command, NULL);\n            exit(0);\n    }\n\n    close(in[0]);\n    close(out[1]);\n    close(err[1]);\n\n    cdata->child_stdin = in[1];\n    cdata->child_stdout = out[0];\n    cdata->child_stderr = err[0];\n\n    return SSH_OK;\n\nfork_failed:\n    close(err[0]);\n    close(err[1]);\nstderr_failed:\n    close(out[0]);\n    close(out[1]);\nstdout_failed:\n    close(in[0]);\n    close(in[1]);\nstdin_failed:\n    return SSH_ERROR;\n}\n\nstatic int exec_request(ssh_session session, ssh_channel channel,\n                        const char *command, void *userdata) {\n    struct channel_data_struct *cdata = (struct channel_data_struct *) userdata;\n\n\n    (void) session;\n    (void) channel;\n\n    if(cdata->pid > 0) {\n        return SSH_ERROR;\n    }\n\n    if (cdata->pty_master != -1 && cdata->pty_slave != -1) {\n        return exec_pty(\"-c\", command, cdata);\n    }\n    return exec_nopty(command, cdata);\n}\n\nstatic int shell_request(ssh_session session, ssh_channel channel,\n                         void *userdata) {\n    struct channel_data_struct *cdata = (struct channel_data_struct *) userdata;\n\n    (void) session;\n    (void) channel;\n\n    if(cdata->pid > 0) {\n        return SSH_ERROR;\n    }\n\n    if (cdata->pty_master != -1 && cdata->pty_slave != -1) {\n        return exec_pty(\"-l\", NULL, cdata);\n    }\n    /* Client requested a shell without a pty, let's pretend we allow that */\n    return SSH_OK;\n}\n\nstatic int subsystem_request(ssh_session session, ssh_channel channel,\n                             const char *subsystem, void *userdata) {\n    /* subsystem requests behave simillarly to exec requests. */\n    if (strcmp(subsystem, \"sftp\") == 0) {\n        return exec_request(session, channel, SFTP_SERVER_PATH, userdata);\n    }\n    return SSH_ERROR;\n}\n\nstatic int auth_password(ssh_session session, const char *user,\n                         const char *pass, void *userdata) {\n    struct session_data_struct *sdata = (struct session_data_struct *) userdata;\n\n    (void) session;\n\n    if (strcmp(user, USER) == 0 && strcmp(pass, PASS) == 0) {\n        sdata->authenticated = 1;\n        return SSH_AUTH_SUCCESS;\n    }\n\n    sdata->auth_attempts++;\n    return SSH_AUTH_DENIED;\n}\n\nstatic int auth_publickey(ssh_session session,\n                          const char *user,\n                          struct ssh_key_struct *pubkey,\n                          char signature_state,\n                          void *userdata)\n{\n    struct session_data_struct *sdata = (struct session_data_struct *) userdata;\n\n    (void) user;\n    (void) session;\n\n    if (signature_state == SSH_PUBLICKEY_STATE_NONE) {\n        return SSH_AUTH_SUCCESS;\n    }\n\n    if (signature_state != SSH_PUBLICKEY_STATE_VALID) {\n        return SSH_AUTH_DENIED;\n    }\n\n    // valid so far.  Now look through authorized keys for a match\n    if (authorizedkeys[0]) {\n        ssh_key key = NULL;\n        int result;\n        struct stat buf;\n\n        if (stat(authorizedkeys, &buf) == 0) {\n            result = ssh_pki_import_pubkey_file( authorizedkeys, &key );\n            if ((result != SSH_OK) || (key==NULL)) {\n                fprintf(stderr,\n                        \"Unable to import public key file %s\\n\",\n                        authorizedkeys);\n            } else {\n                result = ssh_key_cmp( key, pubkey, SSH_KEY_CMP_PUBLIC );\n                ssh_key_free(key);\n                if (result == 0) {\n                    sdata->authenticated = 1;\n                    return SSH_AUTH_SUCCESS;\n                }\n            }\n        }\n    }\n\n    // no matches\n    sdata->authenticated = 0;\n    return SSH_AUTH_DENIED;\n}\n\nstatic ssh_channel channel_open(ssh_session session, void *userdata) {\n    struct session_data_struct *sdata = (struct session_data_struct *) userdata;\n\n    sdata->channel = ssh_channel_new(session);\n    return sdata->channel;\n}\n\nstatic int process_stdout(socket_t fd, int revents, void *userdata) {\n    char buf[BUF_SIZE];\n    int n = -1;\n    ssh_channel channel = (ssh_channel) userdata;\n\n    if (channel != NULL && (revents & POLLIN) != 0) {\n        n = read(fd, buf, BUF_SIZE);\n        if (n > 0) {\n            ssh_channel_write(channel, buf, n);\n        }\n    }\n\n    return n;\n}\n\nstatic int process_stderr(socket_t fd, int revents, void *userdata) {\n    char buf[BUF_SIZE];\n    int n = -1;\n    ssh_channel channel = (ssh_channel) userdata;\n\n    if (channel != NULL && (revents & POLLIN) != 0) {\n        n = read(fd, buf, BUF_SIZE);\n        if (n > 0) {\n            ssh_channel_write_stderr(channel, buf, n);\n        }\n    }\n\n    return n;\n}\n\nstatic void handle_session(ssh_event event, ssh_session session) {\n    int n;\n    int rc = 0;\n\n    /* Structure for storing the pty size. */\n    struct winsize wsize = {\n        .ws_row = 0,\n        .ws_col = 0,\n        .ws_xpixel = 0,\n        .ws_ypixel = 0\n    };\n\n    /* Our struct holding information about the channel. */\n    struct channel_data_struct cdata = {\n        .pid = 0,\n        .pty_master = -1,\n        .pty_slave = -1,\n        .child_stdin = -1,\n        .child_stdout = -1,\n        .child_stderr = -1,\n        .event = NULL,\n        .winsize = &wsize\n    };\n\n    /* Our struct holding information about the session. */\n    struct session_data_struct sdata = {\n        .channel = NULL,\n        .auth_attempts = 0,\n        .authenticated = 0\n    };\n\n    struct ssh_channel_callbacks_struct channel_cb = {\n        .userdata = &cdata,\n        .channel_pty_request_function = pty_request,\n        .channel_pty_window_change_function = pty_resize,\n        .channel_shell_request_function = shell_request,\n        .channel_exec_request_function = exec_request,\n        .channel_data_function = data_function,\n        .channel_subsystem_request_function = subsystem_request\n    };\n\n    struct ssh_server_callbacks_struct server_cb = {\n        .userdata = &sdata,\n        .auth_password_function = auth_password,\n        .channel_open_request_session_function = channel_open,\n    };\n\n    if (authorizedkeys[0]) {\n        server_cb.auth_pubkey_function = auth_publickey;\n        ssh_set_auth_methods(session, SSH_AUTH_METHOD_PASSWORD | SSH_AUTH_METHOD_PUBLICKEY);\n    } else\n        ssh_set_auth_methods(session, SSH_AUTH_METHOD_PASSWORD);\n\n    ssh_callbacks_init(&server_cb);\n    ssh_callbacks_init(&channel_cb);\n\n    ssh_set_server_callbacks(session, &server_cb);\n\n    if (ssh_handle_key_exchange(session) != SSH_OK) {\n        fprintf(stderr, \"%s\\n\", ssh_get_error(session));\n        return;\n    }\n\n    ssh_event_add_session(event, session);\n\n    n = 0;\n    while (sdata.authenticated == 0 || sdata.channel == NULL) {\n        /* If the user has used up all attempts, or if he hasn't been able to\n         * authenticate in 10 seconds (n * 100ms), disconnect. */\n        if (sdata.auth_attempts >= 3 || n >= 100) {\n            return;\n        }\n\n        if (ssh_event_dopoll(event, 100) == SSH_ERROR) {\n            fprintf(stderr, \"%s\\n\", ssh_get_error(session));\n            return;\n        }\n        n++;\n    }\n\n    ssh_set_channel_callbacks(sdata.channel, &channel_cb);\n\n    do {\n        /* Poll the main event which takes care of the session, the channel and\n         * even our child process's stdout/stderr (once it's started). */\n        if (ssh_event_dopoll(event, -1) == SSH_ERROR) {\n          ssh_channel_close(sdata.channel);\n        }\n\n        /* If child process's stdout/stderr has been registered with the event,\n         * or the child process hasn't started yet, continue. */\n        if (cdata.event != NULL || cdata.pid == 0) {\n            continue;\n        }\n        /* Executed only once, once the child process starts. */\n        cdata.event = event;\n        /* If stdout valid, add stdout to be monitored by the poll event. */\n        if (cdata.child_stdout != -1) {\n            if (ssh_event_add_fd(event, cdata.child_stdout, POLLIN, process_stdout,\n                                 sdata.channel) != SSH_OK) {\n                fprintf(stderr, \"Failed to register stdout to poll context\\n\");\n                ssh_channel_close(sdata.channel);\n            }\n        }\n\n        /* If stderr valid, add stderr to be monitored by the poll event. */\n        if (cdata.child_stderr != -1){\n            if (ssh_event_add_fd(event, cdata.child_stderr, POLLIN, process_stderr,\n                                 sdata.channel) != SSH_OK) {\n                fprintf(stderr, \"Failed to register stderr to poll context\\n\");\n                ssh_channel_close(sdata.channel);\n            }\n        }\n    } while(ssh_channel_is_open(sdata.channel) &&\n            (cdata.pid == 0 || waitpid(cdata.pid, &rc, WNOHANG) == 0));\n\n    close(cdata.pty_master);\n    close(cdata.child_stdin);\n    close(cdata.child_stdout);\n    close(cdata.child_stderr);\n\n    /* Remove the descriptors from the polling context, since they are now\n     * closed, they will always trigger during the poll calls. */\n    ssh_event_remove_fd(event, cdata.child_stdout);\n    ssh_event_remove_fd(event, cdata.child_stderr);\n\n    /* If the child process exited. */\n    if (kill(cdata.pid, 0) < 0 && WIFEXITED(rc)) {\n        rc = WEXITSTATUS(rc);\n        ssh_channel_request_send_exit_status(sdata.channel, rc);\n    /* If client terminated the channel or the process did not exit nicely,\n     * but only if something has been forked. */\n    } else if (cdata.pid > 0) {\n        kill(cdata.pid, SIGKILL);\n    }\n\n    ssh_channel_send_eof(sdata.channel);\n    ssh_channel_close(sdata.channel);\n\n    /* Wait up to 5 seconds for the client to terminate the session. */\n    for (n = 0; n < 50 && (ssh_get_status(session) & SESSION_END) == 0; n++) {\n        ssh_event_dopoll(event, 100);\n    }\n}\n\n/* SIGCHLD handler for cleaning up dead children. */\nstatic void sigchld_handler(int signo) {\n    (void) signo;\n    while (waitpid(-1, NULL, WNOHANG) > 0);\n}\n\nint main(int argc, char **argv) {\n    ssh_bind sshbind;\n    ssh_session session;\n    ssh_event event;\n    struct sigaction sa;\n    int rc;\n\n    /* Set up SIGCHLD handler. */\n    sa.sa_handler = sigchld_handler;\n    sigemptyset(&sa.sa_mask);\n    sa.sa_flags = SA_RESTART | SA_NOCLDSTOP;\n    if (sigaction(SIGCHLD, &sa, NULL) != 0) {\n        fprintf(stderr, \"Failed to register SIGCHLD handler\\n\");\n        return 1;\n    }\n\n    rc = ssh_init();\n    if (rc < 0) {\n        fprintf(stderr, \"ssh_init failed\\n\");\n        return 1;\n    }\n\n    sshbind = ssh_bind_new();\n    if (sshbind == NULL) {\n        fprintf(stderr, \"ssh_bind_new failed\\n\");\n        return 1;\n    }\n\n#ifdef HAVE_ARGP_H\n    argp_parse(&argp, argc, argv, 0, 0, sshbind);\n#else\n    (void) argc;\n    (void) argv;\n\n    set_default_keys(sshbind, 0, 0, 0);\n#endif /* HAVE_ARGP_H */\n\n    if(ssh_bind_listen(sshbind) < 0) {\n        fprintf(stderr, \"%s\\n\", ssh_get_error(sshbind));\n        return 1;\n    }\n\n    while (1) {\n        session = ssh_new();\n        if (session == NULL) {\n            fprintf(stderr, \"Failed to allocate session\\n\");\n            continue;\n        }\n\n        /* Blocks until there is a new incoming connection. */\n        if(ssh_bind_accept(sshbind, session) != SSH_ERROR) {\n            switch(fork()) {\n                case 0:\n                    /* Remove the SIGCHLD handler inherited from parent. */\n                    sa.sa_handler = SIG_DFL;\n                    sigaction(SIGCHLD, &sa, NULL);\n                    /* Remove socket binding, which allows us to restart the\n                     * parent process, without terminating existing sessions. */\n                    ssh_bind_free(sshbind);\n\n                    event = ssh_event_new();\n                    if (event != NULL) {\n                        /* Blocks until the SSH session ends by either\n                         * child process exiting, or client disconnecting. */\n                        handle_session(event, session);\n                        ssh_event_free(event);\n                    } else {\n                        fprintf(stderr, \"Could not create polling context\\n\");\n                    }\n                    ssh_disconnect(session);\n                    ssh_free(session);\n\n                    exit(0);\n                case -1:\n                    fprintf(stderr, \"Failed to fork\\n\");\n            }\n        } else {\n            fprintf(stderr, \"%s\\n\", ssh_get_error(sshbind));\n        }\n        /* Since the session has been passed to a child fork, do some cleaning\n         * up at the parent process. */\n        ssh_disconnect(session);\n        ssh_free(session);\n    }\n\n    ssh_bind_free(sshbind);\n    ssh_finalize();\n    return 0;\n}\n"
  },
  {
    "path": "src/libssh/examples/sshd_direct-tcpip.c",
    "content": "/* This is a sample implementation of a libssh based SSH server */\n/*\nCopyright 2003-2009 Aris Adamantiadis\nCopyright 2018 T. Wimmer\n\nThis file is part of the SSH Library\n\nYou are free to copy this file, modify it in any way, consider it being public\ndomain. This does not apply to the rest of the library though, but it is\nallowed to cut-and-paste working code from this file to any license of\nprogram.\nThe goal is to show the API in action. It's not a reference on how terminal\nclients must be made or how a client should react.\n*/\n\n/*\n Example:\n  ./sshd_direct-tcpip -v -p 2022 -d serverkey.dsa -r serverkey.rsa 127.0.0.1\n*/\n\n#include \"config.h\"\n\n#include <libssh/libssh.h>\n#include <libssh/server.h>\n#include <libssh/callbacks.h>\n\n#ifdef HAVE_ARGP_H\n#include <argp.h>\n#endif\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <stdbool.h>\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <poll.h>\n\n#define SAFE_FREE(x) do { if ((x) != NULL) {free(x); x=NULL;} } while(0)\n\n#ifndef __unused__\n# ifdef HAVE_UNUSED_ATTRIBUTE\n#  define __unused__ __attribute__((unused))\n# else /* HAVE_UNUSED_ATTRIBUTE */\n#  define __unused__\n# endif /* HAVE_UNUSED_ATTRIBUTE */\n#endif /* __unused__ */\n\n#ifndef UNUSED_PARAM\n#define UNUSED_PARAM(param) param __unused__\n#endif /* UNUSED_PARAM */\n\n#ifndef KEYS_FOLDER\n#ifdef _WIN32\n#define KEYS_FOLDER\n#else\n#define KEYS_FOLDER \"/etc/ssh/\"\n#endif\n#endif\n\n#define USER \"user\"\n#define PASSWORD \"pwd\"\n\nstruct event_fd_data_struct {\n    int *p_fd;\n    ssh_channel channel;\n    struct ssh_channel_callbacks_struct *cb_chan;\n    int stacked;\n};\n\nstruct cleanup_node_struct {\n    struct event_fd_data_struct *data;\n    struct cleanup_node_struct *next;\n};\n\nstatic bool authenticated = false;\nstatic int tries = 0;\nstatic bool error_set = false;\nstatic int sockets_cnt = 0;\nstatic ssh_event mainloop = NULL;\nstatic struct cleanup_node_struct *cleanup_stack = NULL;\n\nstatic void _close_socket(struct event_fd_data_struct event_fd_data);\n\nstatic void\ncleanup_push(struct cleanup_node_struct** head_ref,\n             struct event_fd_data_struct *new_data)\n{\n    // Allocate memory for node\n    struct cleanup_node_struct *new_node = malloc(sizeof *new_node);\n\n    new_node->next = (*head_ref);\n\n    // Copy new_data\n    new_node->data = new_data;\n\n    // Change head pointer as new node is added at the beginning\n    (*head_ref) = new_node;\n}\n\nstatic void\ndo_cleanup(struct cleanup_node_struct **head_ref)\n{\n    struct cleanup_node_struct *current = (*head_ref);\n    struct cleanup_node_struct *previous = NULL, *gone = NULL;\n\n    while (current != NULL) {\n        if (ssh_channel_is_closed(current->data->channel)) {\n            if (current == (*head_ref)) {\n                (*head_ref) = current->next;\n            }\n            if (previous != NULL) {\n                previous->next = current->next;\n            }\n            gone = current;\n            current = current->next;\n\n            if (gone->data->channel) {\n                _close_socket(*gone->data);\n                ssh_remove_channel_callbacks(gone->data->channel, gone->data->cb_chan);\n                ssh_channel_free(gone->data->channel);\n                gone->data->channel = NULL;\n\n                SAFE_FREE(gone->data->p_fd);\n                SAFE_FREE(gone->data->cb_chan);\n                SAFE_FREE(gone->data);\n                SAFE_FREE(gone);\n            }\n            else {\n                fprintf(stderr, \"channel already freed!\\n\");\n            }\n            _ssh_log(SSH_LOG_FUNCTIONS, \"=== do_cleanup\", \"Freed.\");\n        }\n        else {\n            ssh_channel_close(current->data->channel);\n            previous = current;\n            current = current->next;\n        }\n    }\n}\n\nstatic int\nauth_password(ssh_session session,\n              const char *user,\n              const char *password,\n              UNUSED_PARAM(void *userdata))\n{\n    _ssh_log(SSH_LOG_PROTOCOL,\n             \"=== auth_password\", \"Authenticating user %s pwd %s\",\n             user,\n             password);\n    if (strcmp(user, USER) == 0 && strcmp(password, PASSWORD) == 0) {\n        authenticated = true;\n        printf(\"Authenticated\\n\");\n        return SSH_AUTH_SUCCESS;\n    }\n    if (tries >= 3) {\n        printf(\"Too many authentication tries\\n\");\n        ssh_disconnect(session);\n        error_set = true;\n        return SSH_AUTH_DENIED;\n    }\n    tries++;\n    return SSH_AUTH_DENIED;\n}\n\nstatic int\nauth_gssapi_mic(ssh_session session,\n                const char *user,\n                const char *principal,\n                UNUSED_PARAM(void *userdata))\n{\n    ssh_gssapi_creds creds = ssh_gssapi_get_creds(session);\n    printf(\"Authenticating user %s with gssapi principal %s\\n\",\n           user, principal);\n    if (creds != NULL) {\n        printf(\"Received some gssapi credentials\\n\");\n    } else {\n        printf(\"Not received any forwardable creds\\n\");\n    }\n    printf(\"authenticated\\n\");\n    authenticated = true;\n    return SSH_AUTH_SUCCESS;\n}\n\nstatic int\nsubsystem_request(UNUSED_PARAM(ssh_session session),\n                  UNUSED_PARAM(ssh_channel channel),\n                  const char *subsystem,\n                  UNUSED_PARAM(void *userdata))\n{\n    _ssh_log(SSH_LOG_PROTOCOL,\n             \"=== subsystem_request\", \"Channel subsystem reqeuest: %s\",\n             subsystem);\n    return 0;\n}\n\nstruct ssh_channel_callbacks_struct channel_cb = {\n    .channel_subsystem_request_function = subsystem_request\n};\n\nstatic ssh_channel\nnew_session_channel(UNUSED_PARAM(ssh_session session),\n                    UNUSED_PARAM(void *userdata))\n{\n    _ssh_log(SSH_LOG_PROTOCOL, \"=== subsystem_request\", \"Session channel request\");\n    /* For TCP forward only there seems to be no need for a session channel */\n    /*if(chan != NULL)\n        return NULL;\n    printf(\"Session channel request\\n\");\n    chan = ssh_channel_new(session);\n    ssh_callbacks_init(&channel_cb);\n    ssh_set_channel_callbacks(chan, &channel_cb);\n    return chan;*/\n    return NULL;\n}\n\nstatic void\nstack_socket_close(UNUSED_PARAM(ssh_session session),\n                   struct event_fd_data_struct *event_fd_data)\n{\n    if (event_fd_data->stacked != 1) {\n        _ssh_log(SSH_LOG_FUNCTIONS, \"=== stack_socket_close\",\n                 \"Closing fd = %d sockets_cnt = %d\", *event_fd_data->p_fd,\n                 sockets_cnt);\n        event_fd_data->stacked = 1;\n        cleanup_push(&cleanup_stack, event_fd_data);\n    }\n}\n\nstatic void\n_close_socket(struct event_fd_data_struct event_fd_data)\n{\n    _ssh_log(SSH_LOG_FUNCTIONS, \"=== close_socket\",\n             \"Closing fd = %d sockets_cnt = %d\", *event_fd_data.p_fd,\n             sockets_cnt);\n    ssh_event_remove_fd(mainloop, *event_fd_data.p_fd);\n    sockets_cnt--;\n#ifdef _WIN32\n    closesocket(*event_fd_data.p_fd);\n#else\n    close(*event_fd_data.p_fd);\n#endif // _WIN32\n    (*event_fd_data.p_fd) = SSH_INVALID_SOCKET;\n}\n\nstatic int\nservice_request(UNUSED_PARAM(ssh_session session),\n                const char *service,\n                UNUSED_PARAM(void *userdata))\n{\n    _ssh_log(SSH_LOG_PROTOCOL, \"=== service_request\", \"Service request: %s\", service);\n    return 0;\n}\n\nstatic void\nglobal_request(UNUSED_PARAM(ssh_session session),\n               ssh_message message,\n               UNUSED_PARAM(void *userdata))\n{\n    _ssh_log(SSH_LOG_PROTOCOL,\n             \"=== global_request\", \"Global request, message type: %d\",\n             ssh_message_type(message));\n}\n\nstatic void\nmy_channel_close_function(ssh_session session,\n                          UNUSED_PARAM(ssh_channel channel),\n                          void *userdata)\n{\n    struct event_fd_data_struct *event_fd_data = (struct event_fd_data_struct *)userdata;\n\n    _ssh_log(SSH_LOG_PROTOCOL,\n             \"=== my_channel_close_function\",\n             \"Channel closed by remote.\");\n\n    stack_socket_close(session, event_fd_data);\n}\n\nstatic void\nmy_channel_eof_function(ssh_session session,\n                        UNUSED_PARAM(ssh_channel channel),\n                        void *userdata)\n{\n    struct event_fd_data_struct *event_fd_data = (struct event_fd_data_struct *)userdata;\n\n    _ssh_log(SSH_LOG_PROTOCOL,\n             \"=== my_channel_eof_function\",\n             \"Got EOF on channel. Shuting down write on socket (fd = %d).\",\n             *event_fd_data->p_fd);\n\n    stack_socket_close(session, event_fd_data);\n}\n\nstatic void\nmy_channel_exit_status_function(UNUSED_PARAM(ssh_session session),\n                                UNUSED_PARAM(ssh_channel channel),\n                                int exit_status,\n                                void *userdata)\n{\n    struct event_fd_data_struct *event_fd_data = (struct event_fd_data_struct *)userdata;\n\n    _ssh_log(SSH_LOG_PROTOCOL,\n             \"=== my_channel_exit_status_function\",\n             \"Got exit status %d on channel fd = %d.\",\n             exit_status, *event_fd_data->p_fd);\n}\n\nstatic int\nmy_channel_data_function(ssh_session session,\n                         UNUSED_PARAM(ssh_channel channel),\n                         void *data,\n                         uint32_t len,\n                         UNUSED_PARAM(int is_stderr),\n                         void *userdata)\n{\n    int i = 0;\n    struct event_fd_data_struct *event_fd_data = (struct event_fd_data_struct *)userdata;\n\n    if (event_fd_data->channel == NULL) {\n        fprintf(stderr, \"Why we're here? Stacked = %d\\n\", event_fd_data->stacked);\n    }\n\n    _ssh_log(SSH_LOG_PROTOCOL,\n             \"=== my_channel_data_function\",\n             \"%d bytes waiting on channel for reading. Fd = %d\",\n             len,\n             *event_fd_data->p_fd);\n    if (len > 0) {\n        i = send(*event_fd_data->p_fd, data, len, 0);\n    }\n    if (i < 0) {\n        _ssh_log(SSH_LOG_WARNING, \"=== my_channel_data_function\",\n                 \"Writing to tcp socket %d: %s\", *event_fd_data->p_fd,\n                 strerror(errno));\n        stack_socket_close(session, event_fd_data);\n    }\n    else {\n        _ssh_log(SSH_LOG_FUNCTIONS, \"=== my_channel_data_function\", \"Sent %d bytes\", i);\n    }\n    return i;\n}\n\nstatic int\nmy_fd_data_function(UNUSED_PARAM(socket_t fd),\n                    int revents,\n                    void *userdata)\n{\n    struct event_fd_data_struct *event_fd_data = (struct event_fd_data_struct *)userdata;\n    ssh_channel channel = event_fd_data->channel;\n    ssh_session session;\n    int len, i, wr;\n    char buf[16384];\n    int blocking;\n\n    if (channel == NULL) {\n        _ssh_log(SSH_LOG_FUNCTIONS, \"=== my_fd_data_function\", \"channel == NULL!\");\n        return 0;\n    }\n\n    session = ssh_channel_get_session(channel);\n\n    if (ssh_channel_is_closed(channel)) {\n        _ssh_log(SSH_LOG_FUNCTIONS, \"=== my_fd_data_function\", \"channel is closed!\");\n        stack_socket_close(session, event_fd_data);\n        return 0;\n    }\n\n    if (!(revents & POLLIN)) {\n        if (revents & POLLPRI) {\n            _ssh_log(SSH_LOG_PROTOCOL, \"=== my_fd_data_function\", \"poll revents & POLLPRI\");\n        }\n        if (revents & POLLOUT) {\n            _ssh_log(SSH_LOG_PROTOCOL, \"=== my_fd_data_function\", \"poll revents & POLLOUT\");\n        }\n        if (revents & POLLHUP) {\n            _ssh_log(SSH_LOG_PROTOCOL, \"=== my_fd_data_function\", \"poll revents & POLLHUP\");\n        }\n        if (revents & POLLNVAL) {\n            _ssh_log(SSH_LOG_PROTOCOL, \"=== my_fd_data_function\", \"poll revents & POLLNVAL\");\n        }\n        if (revents & POLLERR) {\n            _ssh_log(SSH_LOG_PROTOCOL, \"=== my_fd_data_function\", \"poll revents & POLLERR\");\n        }\n        return 0;\n    }\n\n    blocking = ssh_is_blocking(session);\n    ssh_set_blocking(session, 0);\n\n    _ssh_log(SSH_LOG_FUNCTIONS,\n             \"=== my_fd_data_function\",\n             \"Trying to read from tcp socket fd = %d\",\n             *event_fd_data->p_fd);\n#ifdef _WIN32\n    struct sockaddr from;\n    int fromlen = sizeof(from);\n    len = recvfrom(*event_fd_data->p_fd, buf, sizeof(buf), 0, &from, &fromlen);\n#else\n    len = recv(*event_fd_data->p_fd, buf, sizeof(buf), 0);\n#endif // _WIN32\n    if (len < 0) {\n        _ssh_log(SSH_LOG_WARNING, \"=== my_fd_data_function\", \"Reading from tcp socket: %s\", strerror(errno));\n\n        ssh_channel_send_eof(channel);\n    }\n    else if (len > 0) {\n        if (ssh_channel_is_open(channel)) {\n            wr = 0;\n            do {\n                i = ssh_channel_write(channel, buf, len);\n                if (i < 0) {\n                    _ssh_log(SSH_LOG_WARNING, \"=== my_fd_data_function\", \"Error writing on the direct-tcpip channel: %d\", i);\n                    len = wr;\n                    break;\n                }\n                wr += i;\n                _ssh_log(SSH_LOG_FUNCTIONS, \"=== my_fd_data_function\", \"channel_write (%d from %d)\", wr, len);\n            } while (i > 0 && wr < len);\n        }\n        else {\n            _ssh_log(SSH_LOG_WARNING, \"=== my_fd_data_function\", \"Can't write on closed channel!\");\n        }\n    }\n    else {\n        _ssh_log(SSH_LOG_PROTOCOL, \"=== my_fd_data_function\", \"The destination host has disconnected!\");\n\n        ssh_channel_close(channel);\n#ifdef _WIN32\n        shutdown(*event_fd_data->p_fd, SD_RECEIVE);\n#else\n        shutdown(*event_fd_data->p_fd, SHUT_RD);\n#endif // _WIN32\n    }\n    ssh_set_blocking(session, blocking);\n\n    return len;\n}\n\nstatic int\nopen_tcp_socket(ssh_message msg)\n{\n    struct sockaddr_in sin;\n    int forwardsock = -1;\n    struct hostent *host;\n    const char *dest_hostname;\n    int dest_port;\n\n    forwardsock = socket(AF_INET, SOCK_STREAM, 0);\n    if (forwardsock < 0) {\n        _ssh_log(SSH_LOG_WARNING, \"=== open_tcp_socket\", \"ERROR opening socket: %s\", strerror(errno));\n        return -1;\n    }\n\n    dest_hostname = ssh_message_channel_request_open_destination(msg);\n    dest_port = ssh_message_channel_request_open_destination_port(msg);\n\n    _ssh_log(SSH_LOG_PROTOCOL, \"=== open_tcp_socket\", \"Connecting to %s on port %d\", dest_hostname, dest_port);\n\n    host = gethostbyname(dest_hostname);\n    if (host == NULL) {\n        close(forwardsock);\n        _ssh_log(SSH_LOG_WARNING, \"=== open_tcp_socket\", \"ERROR, no such host: %s\", dest_hostname);\n        return -1;\n    }\n\n    memset((char *)&sin, '\\0', sizeof(sin));\n    sin.sin_family = AF_INET;\n    memcpy((char *)&sin.sin_addr.s_addr, (char *)host->h_addr, host->h_length);\n    sin.sin_port = htons(dest_port);\n\n    if (connect(forwardsock, (struct sockaddr *)&sin, sizeof(sin)) < 0) {\n        close(forwardsock);\n        _ssh_log(SSH_LOG_WARNING, \"=== open_tcp_socket\", \"ERROR connecting: %s\", strerror(errno));\n        return -1;\n    }\n\n    sockets_cnt++;\n    _ssh_log(SSH_LOG_FUNCTIONS, \"=== open_tcp_socket\", \"Connected. sockets_cnt = %d\", sockets_cnt);\n    return forwardsock;\n}\n\nstatic int\nmessage_callback(UNUSED_PARAM(ssh_session session),\n                 ssh_message message,\n                 UNUSED_PARAM(void *userdata))\n{\n    ssh_channel channel;\n    int socket_fd, *pFd;\n    struct ssh_channel_callbacks_struct *cb_chan;\n    struct event_fd_data_struct *event_fd_data;\n\n    _ssh_log(SSH_LOG_PACKET, \"=== message_callback\", \"Message type: %d\",\n             ssh_message_type(message));\n    _ssh_log(SSH_LOG_PACKET, \"=== message_callback\", \"Message Subtype: %d\",\n             ssh_message_subtype(message));\n    if (ssh_message_type(message) == SSH_REQUEST_CHANNEL_OPEN) {\n        _ssh_log(SSH_LOG_PROTOCOL, \"=== message_callback\", \"channel_request_open\");\n\n        if (ssh_message_subtype(message) == SSH_CHANNEL_DIRECT_TCPIP) {\n            channel = ssh_message_channel_request_open_reply_accept(message);\n\n            if (channel == NULL) {\n                _ssh_log(SSH_LOG_WARNING, \"=== message_callback\", \"Accepting direct-tcpip channel failed!\");\n                return 1;\n            }\n            else {\n                _ssh_log(SSH_LOG_PROTOCOL, \"=== message_callback\", \"Connected to channel!\");\n\n                socket_fd = open_tcp_socket(message);\n                if (-1 == socket_fd) {\n                    return 1;\n                }\n\n                pFd = malloc(sizeof *pFd);\n                cb_chan = malloc(sizeof *cb_chan);\n                event_fd_data = malloc(sizeof *event_fd_data);\n\n                (*pFd) = socket_fd;\n                event_fd_data->channel = channel;\n                event_fd_data->p_fd = pFd;\n                event_fd_data->stacked = 0;\n                event_fd_data->cb_chan = cb_chan;\n\n                cb_chan->userdata = event_fd_data;\n                cb_chan->channel_eof_function = my_channel_eof_function;\n                cb_chan->channel_close_function = my_channel_close_function;\n                cb_chan->channel_data_function = my_channel_data_function;\n                cb_chan->channel_exit_status_function = my_channel_exit_status_function;\n\n                ssh_callbacks_init(cb_chan);\n                ssh_set_channel_callbacks(channel, cb_chan);\n\n                ssh_event_add_fd(mainloop, (socket_t)*pFd, POLLIN, my_fd_data_function, event_fd_data);\n\n                return 0;\n            }\n        }\n    }\n    return 1;\n}\n\n#ifdef HAVE_ARGP_H\nconst char *argp_program_version = \"libssh server example \"\nSSH_STRINGIFY(LIBSSH_VERSION);\nconst char *argp_program_bug_address = \"<libssh@libssh.org>\";\n\n/* Program documentation. */\nstatic char doc[] = \"libssh -- a Secure Shell protocol implementation\";\n\n/* A description of the arguments we accept. */\nstatic char args_doc[] = \"BINDADDR\";\n\n/* The options we understand. */\nstatic struct argp_option options[] = {\n    {\n        .name  = \"port\",\n        .key   = 'p',\n        .arg   = \"PORT\",\n        .flags = 0,\n        .doc   = \"Set the port to bind.\",\n        .group = 0\n    },\n    {\n        .name  = \"hostkey\",\n        .key   = 'k',\n        .arg   = \"FILE\",\n        .flags = 0,\n        .doc   = \"Set the host key.\",\n        .group = 0\n    },\n    {\n        .name  = \"dsakey\",\n        .key   = 'd',\n        .arg   = \"FILE\",\n        .flags = 0,\n        .doc   = \"Set the dsa key.\",\n        .group = 0\n    },\n    {\n        .name  = \"rsakey\",\n        .key   = 'r',\n        .arg   = \"FILE\",\n        .flags = 0,\n        .doc   = \"Set the rsa key.\",\n        .group = 0\n    },\n    {\n        .name  = \"verbose\",\n        .key   = 'v',\n        .arg   = NULL,\n        .flags = 0,\n        .doc   = \"Get verbose output.\",\n        .group = 0\n    },\n    {NULL, 0, NULL, 0, NULL, 0}\n};\n\n/* Parse a single option. */\nstatic error_t\nparse_opt (int key, char *arg, struct argp_state *state)\n{\n    /* Get the input argument from argp_parse, which we\n     * know is a pointer to our arguments structure.\n     */\n    ssh_bind sshbind = state->input;\n\n    switch (key) {\n        case 'p':\n            ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_BINDPORT_STR, arg);\n            break;\n        case 'd':\n            ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_DSAKEY, arg);\n            break;\n        case 'k':\n            ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_HOSTKEY, arg);\n            break;\n        case 'r':\n            ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_RSAKEY, arg);\n            break;\n        case 'v':\n            ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_LOG_VERBOSITY_STR, \"1\");\n            break;\n        case ARGP_KEY_ARG:\n            if (state->arg_num >= 1) {\n                /* Too many arguments. */\n                argp_usage (state);\n            }\n            ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_BINDADDR, arg);\n            break;\n        case ARGP_KEY_END:\n            if (state->arg_num < 1) {\n                /* Not enough arguments. */\n                argp_usage (state);\n            }\n            break;\n        default:\n            return ARGP_ERR_UNKNOWN;\n    }\n\n    return 0;\n}\n\n/* Our argp parser. */\nstatic struct argp argp = {options, parse_opt, args_doc, doc, NULL, NULL, NULL};\n#endif /* HAVE_ARGP_H */\n\nint\nmain(int argc, char **argv)\n{\n    ssh_session session;\n    ssh_bind sshbind;\n    struct ssh_server_callbacks_struct cb = {\n        .userdata = NULL,\n        .auth_password_function = auth_password,\n        .auth_gssapi_mic_function = auth_gssapi_mic,\n        .channel_open_request_session_function = new_session_channel,\n        .service_request_function = service_request\n    };\n    struct ssh_callbacks_struct cb_gen = {\n        .userdata = NULL,\n        .global_request_function = global_request\n    };\n\n    int ret = 1;\n\n    sshbind = ssh_bind_new();\n    session = ssh_new();\n    mainloop = ssh_event_new();\n\n    ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_DSAKEY, KEYS_FOLDER \"ssh_host_dsa_key\");\n    ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_RSAKEY, KEYS_FOLDER \"ssh_host_rsa_key\");\n\n#ifdef HAVE_ARGP_H\n    /*\n     * Parse our arguments; every option seen by parse_opt will\n     * be reflected in arguments.\n     */\n    argp_parse (&argp, argc, argv, 0, 0, sshbind);\n#else\n    (void)argc;\n    (void)argv;\n#endif\n\n    if (ssh_bind_listen(sshbind) < 0) {\n        printf(\"Error listening to socket: %s\\n\", ssh_get_error(sshbind));\n        return 1;\n    }\n\n    if (ssh_bind_accept(sshbind, session) == SSH_ERROR) {\n        printf(\"error accepting a connection : %s\\n\", ssh_get_error(sshbind));\n        ret = 1;\n        goto shutdown;\n    }\n\n    ssh_callbacks_init(&cb);\n    ssh_callbacks_init(&cb_gen);\n    ssh_set_server_callbacks(session, &cb);\n    ssh_set_callbacks(session, &cb_gen);\n    ssh_set_message_callback(session, message_callback, (void *)NULL);\n\n    if (ssh_handle_key_exchange(session)) {\n        printf(\"ssh_handle_key_exchange: %s\\n\", ssh_get_error(session));\n        ret = 1;\n        goto shutdown;\n    }\n    ssh_set_auth_methods(session, SSH_AUTH_METHOD_PASSWORD | SSH_AUTH_METHOD_GSSAPI_MIC);\n    ssh_event_add_session(mainloop, session);\n\n    while (!authenticated) {\n        if (error_set) {\n            break;\n        }\n        if (ssh_event_dopoll(mainloop, -1) == SSH_ERROR) {\n            printf(\"Error : %s\\n\", ssh_get_error(session));\n            ret = 1;\n            goto shutdown;\n        }\n    }\n    if (error_set) {\n        printf(\"Error, exiting loop\\n\");\n    } else {\n        printf(\"Authenticated and got a channel\\n\");\n\n        while (!error_set) {\n            if (ssh_event_dopoll(mainloop, 100) == SSH_ERROR) {\n                printf(\"Error : %s\\n\", ssh_get_error(session));\n                ret = 1;\n                goto shutdown;\n            }\n            do_cleanup(&cleanup_stack);\n        }\n    }\n\nshutdown:\n    ssh_disconnect(session);\n    ssh_bind_free(sshbind);\n    ssh_finalize();\n    return ret;\n}\n"
  },
  {
    "path": "src/libssh/examples/sshnetcat.c",
    "content": "/*\nCopyright 2010 Aris Adamantiadis\n\nThis file is part of the SSH Library\n\nYou are free to copy this file, modify it in any way, consider it being public\ndomain. This does not apply to the rest of the library though, but it is\nallowed to cut-and-paste working code from this file to any license of\nprogram.\nThe goal is to show the API in action. It's not a reference on how terminal\nclients must be made or how a client should react.\n*/\n\n#include \"config.h\"\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#ifdef HAVE_TERMIOS_H\n#include <termios.h>\n#endif\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n\n#include <sys/select.h>\n#include <sys/time.h>\n\n#include <sys/ioctl.h>\n#include <errno.h>\n#include <libssh/callbacks.h>\n#include <libssh/libssh.h>\n#include <libssh/sftp.h>\n\n#include <fcntl.h>\n\n#include \"examples_common.h\"\nchar *host;\nconst char *desthost=\"localhost\";\nconst char *port=\"22\";\n\n#ifdef WITH_PCAP\n#include <libssh/pcap.h>\nchar *pcap_file=NULL;\n#endif\n\nstatic void usage(void)\n{\n  fprintf(stderr,\"Usage : sshnetcat [user@]host forwarded_host forwarded_port\\n\");\n  exit(1);\n}\n\nstatic int opts(int argc, char **argv){\n    int i;\n    while((i=getopt(argc,argv,\"P:\"))!=-1){\n        switch(i){\n#ifdef WITH_PCAP\n        \tcase 'P':\n        \t\tpcap_file=optarg;\n        \t\tbreak;\n#endif\n            default:\n                fprintf(stderr,\"unknown option %c\\n\",optopt);\n                usage();\n        }\n    }\n    if(optind < argc)\n        host=argv[optind++];\n    if(optind < argc)\n        desthost=argv[optind++];\n    if(optind < argc)\n        port=argv[optind++];\n    if(host==NULL)\n        usage();\n    return 0;\n}\n\nstatic void select_loop(ssh_session session,ssh_channel channel){\n\tfd_set fds;\n\tstruct timeval timeout;\n\tchar buffer[4096];\n\t/* channels will be set to the channels to poll.\n\t * outchannels will contain the result of the poll\n\t */\n\tssh_channel channels[2], outchannels[2];\n\tint lus;\n\tint eof=0;\n\tint maxfd;\n\tint ret;\n\twhile(channel){\n\t\tdo{\n            int fd;\n\n            ZERO_STRUCT(fds);\n\t\t\tFD_ZERO(&fds);\n\t\t\tif(!eof)\n\t\t\t\tFD_SET(0,&fds);\n\t\t\ttimeout.tv_sec=30;\n\t\t\ttimeout.tv_usec=0;\n\n            fd = ssh_get_fd(session);\n            if (fd == -1) {\n                fprintf(stderr, \"Error getting the session file descriptor: %s\\n\",\n                                ssh_get_error(session));\n                return;\n            }\n            FD_SET(fd, &fds);\n            maxfd = fd + 1;\n\n\t\t\tchannels[0]=channel; // set the first channel we want to read from\n\t\t\tchannels[1]=NULL;\n\t\t\tret=ssh_select(channels,outchannels,maxfd,&fds,&timeout);\n\t\t\tif(ret==EINTR)\n\t\t\t\tcontinue;\n\t\t\tif(FD_ISSET(0,&fds)){\n\t\t\t\tlus=read(0,buffer,sizeof(buffer));\n\t\t\t\tif(lus)\n\t\t\t\t\tssh_channel_write(channel,buffer,lus);\n\t\t\t\telse {\n\t\t\t\t\teof=1;\n\t\t\t\t\tssh_channel_send_eof(channel);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(channel && ssh_channel_is_closed(channel)){\n\t\t\t\tssh_channel_free(channel);\n\t\t\t\tchannel=NULL;\n\t\t\t\tchannels[0]=NULL;\n\t\t\t}\n\t\t\tif(outchannels[0]){\n\t\t\t\twhile(channel && ssh_channel_is_open(channel) && ssh_channel_poll(channel,0)){\n\t\t\t\t\tlus = ssh_channel_read(channel,buffer,sizeof(buffer),0);\n\t\t\t\t\tif(lus==-1){\n\t\t\t\t\t\tfprintf(stderr, \"Error reading channel: %s\\n\",\n\t\t\t\t\t\t\t\tssh_get_error(session));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif(lus==0){\n\t\t\t\t\t\tssh_channel_free(channel);\n\t\t\t\t\t\tchannel=channels[0]=NULL;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tret = write(1, buffer, lus);\n\t\t\t\t\t\tif (ret < 0) {\n\t\t\t\t\t\t\tfprintf(stderr, \"Error writing to stdin: %s\",\n\t\t\t\t\t\t\t\tstrerror(errno));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\twhile(channel && ssh_channel_is_open(channel) && ssh_channel_poll(channel,1)){ /* stderr */\n\t\t\t\t\tlus = ssh_channel_read(channel, buffer, sizeof(buffer), 1);\n\t\t\t\t\tif(lus==-1){\n\t\t\t\t\t\tfprintf(stderr, \"Error reading channel: %s\\n\",\n\t\t\t\t\t\t\t\tssh_get_error(session));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tif(lus==0){\n\t\t\t\t\t\tssh_channel_free(channel);\n\t\t\t\t\t\tchannel=channels[0]=NULL;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tret = write(2, buffer, lus);\n\t\t\t\t\t\tif (ret < 0) {\n\t\t\t\t\t\t\tfprintf(stderr, \"Error writing to stderr: %s\",\n\t\t\t\t\t\t\t\tstrerror(errno));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n                    }\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(channel && ssh_channel_is_closed(channel)){\n\t\t\t\tssh_channel_free(channel);\n\t\t\t\tchannel=NULL;\n\t\t\t}\n\t\t} while (ret==EINTR || ret==SSH_EINTR);\n\n\t}\n}\n\nstatic void forwarding(ssh_session session){\n    ssh_channel channel;\n    int r;\n    channel = ssh_channel_new(session);\n    r = ssh_channel_open_forward(channel, desthost, atoi(port), \"localhost\", 22);\n    if(r<0) {\n        printf(\"error forwarding port : %s\\n\",ssh_get_error(session));\n        return;\n    }\n    select_loop(session,channel);\n}\n\nstatic int client(ssh_session session){\n  int auth=0;\n  char *banner;\n  int state;\n\n  if (ssh_options_set(session, SSH_OPTIONS_HOST ,host) < 0)\n    return -1;\n  ssh_options_parse_config(session, NULL);\n\n  if(ssh_connect(session)){\n      fprintf(stderr,\"Connection failed : %s\\n\",ssh_get_error(session));\n      return -1;\n  }\n  state=verify_knownhost(session);\n  if (state != 0)\n  \treturn -1;\n  ssh_userauth_none(session, NULL);\n  banner=ssh_get_issue_banner(session);\n  if(banner){\n      printf(\"%s\\n\",banner);\n      free(banner);\n  }\n  auth=authenticate_console(session);\n  if(auth != SSH_AUTH_SUCCESS){\n  \treturn -1;\n  }\n \tforwarding(session);\n  return 0;\n}\n\n#ifdef WITH_PCAP\nssh_pcap_file pcap;\nvoid set_pcap(ssh_session session);\nvoid set_pcap(ssh_session session){\n\tif(!pcap_file)\n\t\treturn;\n\tpcap=ssh_pcap_file_new();\n\tif(ssh_pcap_file_open(pcap,pcap_file) == SSH_ERROR){\n\t\tprintf(\"Error opening pcap file\\n\");\n\t\tssh_pcap_file_free(pcap);\n\t\tpcap=NULL;\n\t\treturn;\n\t}\n\tssh_set_pcap_file(session,pcap);\n}\n\nvoid cleanup_pcap(void);\nvoid cleanup_pcap(){\n\tssh_pcap_file_free(pcap);\n\tpcap=NULL;\n}\n#endif\n\nint main(int argc, char **argv){\n    ssh_session session;\n\n    session = ssh_new();\n\n    if(ssh_options_getopt(session, &argc, argv)) {\n      fprintf(stderr, \"error parsing command line :%s\\n\",\n          ssh_get_error(session));\n      usage();\n    }\n    opts(argc,argv);\n#ifdef WITH_PCAP\n    set_pcap(session);\n#endif\n    client(session);\n\n    ssh_disconnect(session);\n    ssh_free(session);\n#ifdef WITH_PCAP\n    cleanup_pcap();\n#endif\n\n    ssh_finalize();\n\n    return 0;\n}\n"
  },
  {
    "path": "src/libssh/include/CMakeLists.txt",
    "content": "project(libssh-headers-x C)\n\nadd_subdirectory(libssh)\n"
  },
  {
    "path": "src/libssh/include/libssh/CMakeLists.txt",
    "content": "project(libssh-headers C)\n\nset(libssh_HDRS\n  callbacks.h\n  libssh.h\n  ssh2.h\n  legacy.h\n  libsshpp.hpp\n)\n\nif (WITH_SFTP)\n  set(libssh_HDRS\n    ${libssh_HDRS}\n    sftp.h\n  )\nendif (WITH_SFTP)\n\nif (WITH_SERVER)\n  set(libssh_HDRS\n    ${libssh_HDRS}\n    server.h\n  )\nendif (WITH_SERVER)\n\ninstall(\n  FILES\n    ${libssh_HDRS}\n  DESTINATION\n    ${CMAKE_INSTALL_INCLUDEDIR}/${APPLICATION_NAME}\n  COMPONENT\n    headers\n)\n\nconfigure_file(${CMAKE_CURRENT_SOURCE_DIR}/libssh_version.h.cmake\n               ${libssh_BINARY_DIR}/include/libssh/libssh_version.h\n               @ONLY)\ninstall(FILES ${libssh_BINARY_DIR}/include/libssh/libssh_version.h\n        DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${APPLICATION_NAME}\n        COMPONENT headers)\n"
  },
  {
    "path": "src/libssh/include/libssh/agent.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2008-2009 Andreas Schneider <asn@cryptomilk.org>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef __AGENT_H\n#define __AGENT_H\n\n#include \"libssh/libssh.h\"\n\n/* Messages for the authentication agent connection. */\n#define SSH_AGENTC_REQUEST_RSA_IDENTITIES        1\n#define SSH_AGENT_RSA_IDENTITIES_ANSWER          2\n#define SSH_AGENTC_RSA_CHALLENGE                 3\n#define SSH_AGENT_RSA_RESPONSE                   4\n#define SSH_AGENT_FAILURE                        5\n#define SSH_AGENT_SUCCESS                        6\n#define SSH_AGENTC_ADD_RSA_IDENTITY              7\n#define SSH_AGENTC_REMOVE_RSA_IDENTITY           8\n#define SSH_AGENTC_REMOVE_ALL_RSA_IDENTITIES     9\n\n/* private OpenSSH extensions for SSH2 */\n#define SSH2_AGENTC_REQUEST_IDENTITIES           11\n#define SSH2_AGENT_IDENTITIES_ANSWER             12\n#define SSH2_AGENTC_SIGN_REQUEST                 13\n#define SSH2_AGENT_SIGN_RESPONSE                 14\n#define SSH2_AGENTC_ADD_IDENTITY                 17\n#define SSH2_AGENTC_REMOVE_IDENTITY              18\n#define SSH2_AGENTC_REMOVE_ALL_IDENTITIES        19\n\n/* smartcard */\n#define SSH_AGENTC_ADD_SMARTCARD_KEY             20\n#define SSH_AGENTC_REMOVE_SMARTCARD_KEY          21\n\n/* lock/unlock the agent */\n#define SSH_AGENTC_LOCK                          22\n#define SSH_AGENTC_UNLOCK                        23\n\n/* add key with constraints */\n#define SSH_AGENTC_ADD_RSA_ID_CONSTRAINED        24\n#define SSH2_AGENTC_ADD_ID_CONSTRAINED           25\n#define SSH_AGENTC_ADD_SMARTCARD_KEY_CONSTRAINED 26\n\n#define SSH_AGENT_CONSTRAIN_LIFETIME             1\n#define SSH_AGENT_CONSTRAIN_CONFIRM              2\n\n/* extended failure messages */\n#define SSH2_AGENT_FAILURE                       30\n\n/* additional error code for ssh.com's ssh-agent2 */\n#define SSH_COM_AGENT2_FAILURE                   102\n\n#define SSH_AGENT_OLD_SIGNATURE                  0x01\n/* Signature flags from draft-miller-ssh-agent-02 */\n#define SSH_AGENT_RSA_SHA2_256                   0x02\n#define SSH_AGENT_RSA_SHA2_512                   0x04\n\nstruct ssh_agent_struct {\n#ifndef _WIN32\n  struct ssh_socket_struct *sock;\n#endif\n  ssh_buffer ident;\n  unsigned int count;\n  ssh_channel channel;\n};\n\n/* agent.c */\n/**\n * @brief Create a new ssh agent structure.\n *\n * @return An allocated ssh agent structure or NULL on error.\n */\nstruct ssh_agent_struct *ssh_agent_new(struct ssh_session_struct *session);\n\nvoid ssh_agent_close(struct ssh_agent_struct *agent);\n\n/**\n * @brief Free an allocated ssh agent structure.\n *\n * @param agent The ssh agent structure to free.\n */\nvoid ssh_agent_free(struct ssh_agent_struct *agent);\n\n/**\n * @brief Check if the ssh agent is running.\n *\n * @param session The ssh session to check for the agent.\n *\n * @return 1 if it is running, 0 if not.\n */\nint ssh_agent_is_running(struct ssh_session_struct *session);\n\nuint32_t ssh_agent_get_ident_count(struct ssh_session_struct *session);\n\nssh_key ssh_agent_get_next_ident(struct ssh_session_struct *session,\n                                 char **comment);\n\nssh_key ssh_agent_get_first_ident(struct ssh_session_struct *session,\n                                  char **comment);\n\nssh_string ssh_agent_sign_data(ssh_session session,\n                               const ssh_key pubkey,\n                               struct ssh_buffer_struct *data);\n\n#endif /* __AGENT_H */\n"
  },
  {
    "path": "src/libssh/include/libssh/auth.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2009 by Aris Adamantiadis\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef AUTH_H_\n#define AUTH_H_\n#include \"config.h\"\n#include \"libssh/callbacks.h\"\n\nSSH_PACKET_CALLBACK(ssh_packet_userauth_banner);\nSSH_PACKET_CALLBACK(ssh_packet_userauth_failure);\nSSH_PACKET_CALLBACK(ssh_packet_userauth_success);\nSSH_PACKET_CALLBACK(ssh_packet_userauth_pk_ok);\nSSH_PACKET_CALLBACK(ssh_packet_userauth_info_request);\nSSH_PACKET_CALLBACK(ssh_packet_userauth_info_response);\n\n/** @internal\n * kdbint structure must be shared with message.c\n * and server.c\n */\nstruct ssh_kbdint_struct {\n    uint32_t nprompts;\n    uint32_t nanswers;\n    char *name;\n    char *instruction;\n    char **prompts;\n    unsigned char *echo; /* bool array */\n    char **answers;\n};\ntypedef struct ssh_kbdint_struct* ssh_kbdint;\n\nssh_kbdint ssh_kbdint_new(void);\nvoid ssh_kbdint_clean(ssh_kbdint kbd);\nvoid ssh_kbdint_free(ssh_kbdint kbd);\n\n/** @internal\n * States of authentication in the client-side. They describe\n * what was the last response from the server\n */\nenum ssh_auth_state_e {\n  /** No authentication asked */\n  SSH_AUTH_STATE_NONE=0,\n  /** Last authentication response was a partial success */\n  SSH_AUTH_STATE_PARTIAL,\n  /** Last authentication response was a success */\n  SSH_AUTH_STATE_SUCCESS,\n  /** Last authentication response was failed */\n  SSH_AUTH_STATE_FAILED,\n  /** Last authentication was erroneous */\n  SSH_AUTH_STATE_ERROR,\n  /** Last state was a keyboard-interactive ask for info */\n  SSH_AUTH_STATE_INFO,\n  /** Last state was a public key accepted for authentication */\n  SSH_AUTH_STATE_PK_OK,\n  /** We asked for a keyboard-interactive authentication */\n  SSH_AUTH_STATE_KBDINT_SENT,\n  /** We have sent an userauth request with gssapi-with-mic */\n  SSH_AUTH_STATE_GSSAPI_REQUEST_SENT,\n  /** We are exchanging tokens until authentication */\n  SSH_AUTH_STATE_GSSAPI_TOKEN,\n  /** We have sent the MIC and expecting to be authenticated */\n  SSH_AUTH_STATE_GSSAPI_MIC_SENT,\n  /** We have offered a pubkey to check if it is supported */\n  SSH_AUTH_STATE_PUBKEY_OFFER_SENT,\n  /** We have sent pubkey and signature expecting to be authenticated */\n  SSH_AUTH_STATE_PUBKEY_AUTH_SENT,\n  /** We have sent a password expecting to be authenticated */\n  SSH_AUTH_STATE_PASSWORD_AUTH_SENT,\n  /** We have sent a request without auth information (method 'none') */\n  SSH_AUTH_STATE_AUTH_NONE_SENT,\n};\n\n/** @internal\n * @brief states of the authentication service request\n */\nenum ssh_auth_service_state_e {\n  /** initial state */\n  SSH_AUTH_SERVICE_NONE=0,\n  /** Authentication service request packet sent */\n  SSH_AUTH_SERVICE_SENT,\n  /** Service accepted */\n  SSH_AUTH_SERVICE_ACCEPTED,\n  /** Access to service denied (fatal) */\n  SSH_AUTH_SERVICE_DENIED,\n};\n\n#endif /* AUTH_H_ */\n"
  },
  {
    "path": "src/libssh/include/libssh/bignum.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2014 by Aris Adamantiadis <aris@badcode.be>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef BIGNUM_H_\n#define BIGNUM_H_\n\n#include \"libssh/libcrypto.h\"\n#include \"libssh/libgcrypt.h\"\n#include \"libssh/libmbedcrypto.h\"\n\nbignum ssh_make_string_bn(ssh_string string);\nssh_string ssh_make_bignum_string(bignum num);\nvoid ssh_print_bignum(const char *which, const_bignum num);\n\n\n#endif /* BIGNUM_H_ */\n"
  },
  {
    "path": "src/libssh/include/libssh/bind.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2010 by Aris Adamantiadis\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef BIND_H_\n#define BIND_H_\n\n#include \"libssh/priv.h\"\n#include \"libssh/kex.h\"\n#include \"libssh/session.h\"\n\nstruct ssh_bind_struct {\n  struct ssh_common_struct common; /* stuff common to ssh_bind and ssh_session */\n  struct ssh_bind_callbacks_struct *bind_callbacks;\n  void *bind_callbacks_userdata;\n\n  struct ssh_poll_handle_struct *poll;\n  /* options */\n  char *wanted_methods[SSH_KEX_METHODS];\n  char *banner;\n  char *ecdsakey;\n  char *dsakey;\n  char *rsakey;\n  char *ed25519key;\n  ssh_key ecdsa;\n  ssh_key dsa;\n  ssh_key rsa;\n  ssh_key ed25519;\n  char *bindaddr;\n  socket_t bindfd;\n  unsigned int bindport;\n  int blocking;\n  int toaccept;\n  bool config_processed;\n  char *config_dir;\n  char *pubkey_accepted_key_types;\n};\n\nstruct ssh_poll_handle_struct *ssh_bind_get_poll(struct ssh_bind_struct\n    *sshbind);\n\n\n#endif /* BIND_H_ */\n"
  },
  {
    "path": "src/libssh/include/libssh/bind_config.h",
    "content": "/*\n * bind_config.h - Parse the SSH server configuration file\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2019 by Red Hat, Inc.\n *\n * Author: Anderson Toshiyuki Sasaki <ansasaki@redhat.com>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#ifndef BIND_CONFIG_H_\n#define BIND_CONFIG_H_\n\n#include \"libssh/server.h\"\n\nenum ssh_bind_config_opcode_e {\n    /* Known but not allowed in Match block */\n    BIND_CFG_NOT_ALLOWED_IN_MATCH = -4,\n    /* Unknown opcode */\n    BIND_CFG_UNKNOWN = -3,\n    /* Known and not applicable to libssh */\n    BIND_CFG_NA = -2,\n    /* Known but not supported by current libssh version */\n    BIND_CFG_UNSUPPORTED = -1,\n    BIND_CFG_INCLUDE,\n    BIND_CFG_HOSTKEY,\n    BIND_CFG_LISTENADDRESS,\n    BIND_CFG_PORT,\n    BIND_CFG_LOGLEVEL,\n    BIND_CFG_CIPHERS,\n    BIND_CFG_MACS,\n    BIND_CFG_KEXALGORITHMS,\n    BIND_CFG_MATCH,\n    BIND_CFG_PUBKEY_ACCEPTED_KEY_TYPES,\n    BIND_CFG_HOSTKEY_ALGORITHMS,\n\n    BIND_CFG_MAX /* Keep this one last in the list */\n};\n\n/* @brief Parse configuration file and set the options to the given ssh_bind\n *\n * @params[in] sshbind   The ssh_bind context to be configured\n * @params[in] filename  The path to the configuration file\n *\n * @returns    0 on successful parsing the configuration file, -1 on error\n */\nint ssh_bind_config_parse_file(ssh_bind sshbind, const char *filename);\n\n#endif /* BIND_CONFIG_H_ */\n"
  },
  {
    "path": "src/libssh/include/libssh/blf.h",
    "content": "/* $OpenBSD: blf.h,v 1.7 2007/03/14 17:59:41 grunk Exp $ */\n/*\n * Blowfish - a fast block cipher designed by Bruce Schneier\n *\n * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n * 3. All advertising materials mentioning features or use of this software\n *    must display the following acknowledgement:\n *      This product includes software developed by Niels Provos.\n * 4. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\n * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifndef _BLF_H_\n#define _BLF_H_\n\n//#include \"includes.h\"\n\n#if !defined(HAVE_BCRYPT_PBKDF) && !defined(HAVE_BLH_H)\n\n/* Schneier specifies a maximum key length of 56 bytes.\n * This ensures that every key bit affects every cipher\n * bit.  However, the subkeys can hold up to 72 bytes.\n * Warning: For normal blowfish encryption only 56 bytes\n * of the key affect all cipherbits.\n */\n\n#define BLF_N\t16\t\t\t/* Number of Subkeys */\n#define BLF_MAXKEYLEN ((BLF_N-2)*4)\t/* 448 bits */\n#define BLF_MAXUTILIZED ((BLF_N+2)*4)\t/* 576 bits */\n\n/* Blowfish context */\ntypedef struct BlowfishContext {\n\tuint32_t S[4][256];\t/* S-Boxes */\n\tuint32_t P[BLF_N + 2];\t/* Subkeys */\n} ssh_blf_ctx;\n\n/* Raw access to customized Blowfish\n *\tblf_key is just:\n *\tBlowfish_initstate( state )\n *\tBlowfish_expand0state( state, key, keylen )\n */\n\nvoid Blowfish_encipher(ssh_blf_ctx *, uint32_t *, uint32_t *);\nvoid Blowfish_decipher(ssh_blf_ctx *, uint32_t *, uint32_t *);\nvoid Blowfish_initstate(ssh_blf_ctx *);\nvoid Blowfish_expand0state(ssh_blf_ctx *, const uint8_t *, uint16_t);\nvoid Blowfish_expandstate\n(ssh_blf_ctx *, const uint8_t *, uint16_t, const uint8_t *, uint16_t);\n\n/* Standard Blowfish */\n\nvoid ssh_blf_key(ssh_blf_ctx *, const uint8_t *, uint16_t);\nvoid ssh_blf_enc(ssh_blf_ctx *, uint32_t *, uint16_t);\nvoid ssh_blf_dec(ssh_blf_ctx *, uint32_t *, uint16_t);\n\nvoid ssh_blf_ecb_encrypt(ssh_blf_ctx *, uint8_t *, uint32_t);\nvoid ssh_blf_ecb_decrypt(ssh_blf_ctx *, uint8_t *, uint32_t);\n\nvoid ssh_blf_cbc_encrypt(ssh_blf_ctx *, uint8_t *, uint8_t *, uint32_t);\nvoid ssh_blf_cbc_decrypt(ssh_blf_ctx *, uint8_t *, uint8_t *, uint32_t);\n\n/* Converts uint8_t to uint32_t */\nuint32_t Blowfish_stream2word(const uint8_t *, uint16_t , uint16_t *);\n\n#endif /* !defined(HAVE_BCRYPT_PBKDF) && !defined(HAVE_BLH_H) */\n#endif /* _BLF_H */\n"
  },
  {
    "path": "src/libssh/include/libssh/buffer.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2009 by Aris Adamantiadis\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef BUFFER_H_\n#define BUFFER_H_\n\n#include <stdarg.h>\n\n#include \"libssh/libssh.h\"\n\n#define SSH_BUFFER_PACK_END ((uint32_t) 0x4f65feb3)\n\nvoid ssh_buffer_set_secure(ssh_buffer buffer);\nint ssh_buffer_add_ssh_string(ssh_buffer buffer, ssh_string string);\nint ssh_buffer_add_u8(ssh_buffer buffer, uint8_t data);\nint ssh_buffer_add_u16(ssh_buffer buffer, uint16_t data);\nint ssh_buffer_add_u32(ssh_buffer buffer, uint32_t data);\nint ssh_buffer_add_u64(ssh_buffer buffer, uint64_t data);\n\nint ssh_buffer_validate_length(struct ssh_buffer_struct *buffer, size_t len);\n\nvoid *ssh_buffer_allocate(struct ssh_buffer_struct *buffer, uint32_t len);\nint ssh_buffer_allocate_size(struct ssh_buffer_struct *buffer, uint32_t len);\nint ssh_buffer_pack_va(struct ssh_buffer_struct *buffer,\n                       const char *format,\n                       size_t argc,\n                       va_list ap);\nint _ssh_buffer_pack(struct ssh_buffer_struct *buffer,\n                     const char *format,\n                     size_t argc,\n                     ...);\n#define ssh_buffer_pack(buffer, format, ...) \\\n    _ssh_buffer_pack((buffer), (format), __VA_NARG__(__VA_ARGS__), __VA_ARGS__, SSH_BUFFER_PACK_END)\n\nint ssh_buffer_unpack_va(struct ssh_buffer_struct *buffer,\n                         const char *format, size_t argc,\n                         va_list ap);\nint _ssh_buffer_unpack(struct ssh_buffer_struct *buffer,\n                       const char *format,\n                       size_t argc,\n                       ...);\n#define ssh_buffer_unpack(buffer, format, ...) \\\n    _ssh_buffer_unpack((buffer), (format), __VA_NARG__(__VA_ARGS__), __VA_ARGS__, SSH_BUFFER_PACK_END)\n\nint ssh_buffer_prepend_data(ssh_buffer buffer, const void *data, uint32_t len);\nint ssh_buffer_add_buffer(ssh_buffer buffer, ssh_buffer source);\n\n/* buffer_read_*() returns the number of bytes read, except for ssh strings */\nint ssh_buffer_get_u8(ssh_buffer buffer, uint8_t *data);\nint ssh_buffer_get_u32(ssh_buffer buffer, uint32_t *data);\nint ssh_buffer_get_u64(ssh_buffer buffer, uint64_t *data);\n\n/* ssh_buffer_get_ssh_string() is an exception. if the String read is too large or invalid, it will answer NULL. */\nssh_string ssh_buffer_get_ssh_string(ssh_buffer buffer);\n\n/* ssh_buffer_pass_bytes acts as if len bytes have been read (used for padding) */\nuint32_t ssh_buffer_pass_bytes_end(ssh_buffer buffer, uint32_t len);\nuint32_t ssh_buffer_pass_bytes(ssh_buffer buffer, uint32_t len);\n\n#endif /* BUFFER_H_ */\n"
  },
  {
    "path": "src/libssh/include/libssh/bytearray.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2018 Andreas Schneider <asn@cryptomilk.org>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n#ifndef _BYTEARRAY_H\n#define _BYTEARRAY_H\n\n#define _DATA_BYTE_CONST(data, pos) \\\n    ((uint8_t)(((const uint8_t *)(data))[(pos)]))\n\n#define _DATA_BYTE(data, pos) \\\n    (((uint8_t *)(data))[(pos)])\n\n/*\n * These macros pull or push integer values from byte arrays stored in\n * little-endian byte order.\n */\n#define PULL_LE_U8(data, pos) \\\n    (_DATA_BYTE_CONST(data, pos))\n\n#define PULL_LE_U16(data, pos) \\\n    ((uint16_t)PULL_LE_U8(data, pos) | ((uint16_t)(PULL_LE_U8(data, (pos) + 1))) << 8)\n\n#define PULL_LE_U32(data, pos) \\\n    ((uint32_t)(PULL_LE_U16(data, pos) | ((uint32_t)PULL_LE_U16(data, (pos) + 2)) << 16))\n\n#define PULL_LE_U64(data, pos) \\\n    ((uint64_t)(PULL_LE_U32(data, pos) | ((uint64_t)PULL_LE_U32(data, (pos) + 4)) << 32))\n\n\n#define PUSH_LE_U8(data, pos, val) \\\n    (_DATA_BYTE(data, pos) = ((uint8_t)(val)))\n\n#define PUSH_LE_U16(data, pos, val) \\\n    (PUSH_LE_U8((data), (pos), (uint8_t)((uint16_t)(val) & 0xff)), PUSH_LE_U8((data), (pos) + 1, (uint8_t)((uint16_t)(val) >> 8)))\n\n#define PUSH_LE_U32(data, pos, val) \\\n    (PUSH_LE_U16((data), (pos), (uint16_t)((uint32_t)(val) & 0xffff)), PUSH_LE_U16((data), (pos) + 2, (uint16_t)((uint32_t)(val) >> 16)))\n\n#define PUSH_LE_U64(data, pos, val) \\\n    (PUSH_LE_U32((data), (pos), (uint32_t)((uint64_t)(val) & 0xffffffff)), PUSH_LE_U32((data), (pos) + 4, (uint32_t)((uint64_t)(val) >> 32)))\n\n\n\n/*\n * These macros pull or push integer values from byte arrays stored in\n * big-endian byte order (network byte order).\n */\n#define PULL_BE_U8(data, pos) \\\n    (_DATA_BYTE_CONST(data, pos))\n\n#define PULL_BE_U16(data, pos) \\\n    ((((uint16_t)(PULL_BE_U8(data, pos))) << 8) | (uint16_t)PULL_BE_U8(data, (pos) + 1))\n\n#define PULL_BE_U32(data, pos) \\\n    ((((uint32_t)PULL_BE_U16(data, pos)) << 16) | (uint32_t)(PULL_BE_U16(data, (pos) + 2)))\n\n#define PULL_BE_U64(data, pos) \\\n    ((((uint64_t)PULL_BE_U32(data, pos)) << 32) | (uint64_t)(PULL_BE_U32(data, (pos) + 4)))\n\n\n\n#define PUSH_BE_U8(data, pos, val) \\\n    (_DATA_BYTE(data, pos) = ((uint8_t)(val)))\n\n#define PUSH_BE_U16(data, pos, val) \\\n    (PUSH_BE_U8((data), (pos), (uint8_t)(((uint16_t)(val)) >> 8)), PUSH_BE_U8((data), (pos) + 1, (uint8_t)((val) & 0xff)))\n\n#define PUSH_BE_U32(data, pos, val) \\\n    (PUSH_BE_U16((data), (pos), (uint16_t)(((uint32_t)(val)) >> 16)), PUSH_BE_U16((data), (pos) + 2, (uint16_t)((val) & 0xffff)))\n\n#define PUSH_BE_U64(data, pos, val) \\\n    (PUSH_BE_U32((data), (pos), (uint32_t)(((uint64_t)(val)) >> 32)), PUSH_BE_U32((data), (pos) + 4, (uint32_t)((val) & 0xffffffff)))\n\n#endif /* _BYTEARRAY_H */\n"
  },
  {
    "path": "src/libssh/include/libssh/callbacks.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2009 Aris Adamantiadis <aris@0xbadc0de.be>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/* callback.h\n * This file includes the public declarations for the libssh callback mechanism\n */\n\n#ifndef _SSH_CALLBACK_H\n#define _SSH_CALLBACK_H\n\n#include <libssh/libssh.h>\n#include <string.h>\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/**\n * @defgroup libssh_callbacks The libssh callbacks\n * @ingroup libssh\n *\n * Callback which can be replaced in libssh.\n *\n * @{\n */\n\n/** @internal\n * @brief callback to process simple codes\n * @param code value to transmit\n * @param user Userdata to pass in callback\n */\ntypedef void (*ssh_callback_int) (int code, void *user);\n\n/** @internal\n * @brief callback for data received messages.\n * @param data data retrieved from the socket or stream\n * @param len number of bytes available from this stream\n * @param user user-supplied pointer sent along with all callback messages\n * @returns number of bytes processed by the callee. The remaining bytes will\n * be sent in the next callback message, when more data is available.\n */\ntypedef int (*ssh_callback_data) (const void *data, size_t len, void *user);\n\ntypedef void (*ssh_callback_int_int) (int code, int errno_code, void *user);\n\ntypedef int (*ssh_message_callback) (ssh_session, ssh_message message, void *user);\ntypedef int (*ssh_channel_callback_int) (ssh_channel channel, int code, void *user);\ntypedef int (*ssh_channel_callback_data) (ssh_channel channel, int code, void *data, size_t len, void *user);\n\n/**\n * @brief SSH log callback. All logging messages will go through this callback\n * @param session Current session handler\n * @param priority Priority of the log, the smaller being the more important\n * @param message the actual message\n * @param userdata Userdata to be passed to the callback function.\n */\ntypedef void (*ssh_log_callback) (ssh_session session, int priority,\n    const char *message, void *userdata);\n\n/**\n * @brief SSH log callback.\n *\n * All logging messages will go through this callback.\n *\n * @param priority  Priority of the log, the smaller being the more important.\n *\n * @param function  The function name calling the the logging fucntions.\n *\n * @param message   The actual message\n *\n * @param userdata Userdata to be passed to the callback function.\n */\ntypedef void (*ssh_logging_callback) (int priority,\n                                      const char *function,\n                                      const char *buffer,\n                                      void *userdata);\n\n/**\n * @brief SSH Connection status callback.\n * @param session Current session handler\n * @param status Percentage of connection status, going from 0.0 to 1.0\n * once connection is done.\n * @param userdata Userdata to be passed to the callback function.\n */\ntypedef void (*ssh_status_callback) (ssh_session session, float status,\n\t\tvoid *userdata);\n\n/**\n * @brief SSH global request callback. All global request will go through this\n * callback.\n * @param session Current session handler\n * @param message the actual message\n * @param userdata Userdata to be passed to the callback function.\n */\ntypedef void (*ssh_global_request_callback) (ssh_session session,\n                                        ssh_message message, void *userdata);\n\n/**\n * @brief Handles an SSH new channel open X11 request. This happens when the server\n * sends back an X11 connection attempt. This is a client-side API\n * @param session current session handler\n * @param userdata Userdata to be passed to the callback function.\n * @returns a valid ssh_channel handle if the request is to be allowed\n * @returns NULL if the request should not be allowed\n * @warning The channel pointer returned by this callback must be closed by the application.\n */\ntypedef ssh_channel (*ssh_channel_open_request_x11_callback) (ssh_session session,\n      const char * originator_address, int originator_port, void *userdata);\n\n/**\n * @brief Handles an SSH new channel open \"auth-agent\" request. This happens when the server\n * sends back an \"auth-agent\" connection attempt. This is a client-side API\n * @param session current session handler\n * @param userdata Userdata to be passed to the callback function.\n * @returns a valid ssh_channel handle if the request is to be allowed\n * @returns NULL if the request should not be allowed\n * @warning The channel pointer returned by this callback must be closed by the application.\n */\ntypedef ssh_channel (*ssh_channel_open_request_auth_agent_callback) (ssh_session session,\n      void *userdata);\n\n/**\n * The structure to replace libssh functions with appropriate callbacks.\n */\nstruct ssh_callbacks_struct {\n  /** DON'T SET THIS use ssh_callbacks_init() instead. */\n  size_t size;\n  /**\n   * User-provided data. User is free to set anything he wants here\n   */\n  void *userdata;\n  /**\n   * This functions will be called if e.g. a keyphrase is needed.\n   */\n  ssh_auth_callback auth_function;\n  /**\n   * This function will be called each time a loggable event happens.\n   */\n  ssh_log_callback log_function;\n  /**\n   * This function gets called during connection time to indicate the\n   * percentage of connection steps completed.\n   */\n  void (*connect_status_function)(void *userdata, float status);\n  /**\n   * This function will be called each time a global request is received.\n   */\n  ssh_global_request_callback global_request_function;\n  /** This function will be called when an incoming X11 request is received.\n   */\n  ssh_channel_open_request_x11_callback channel_open_request_x11_function;\n  /** This function will be called when an incoming \"auth-agent\" request is received.\n   */\n  ssh_channel_open_request_auth_agent_callback channel_open_request_auth_agent_function;\n};\ntypedef struct ssh_callbacks_struct *ssh_callbacks;\n\n/** These are callbacks used specifically in SSH servers.\n */\n\n/**\n * @brief SSH authentication callback.\n * @param session Current session handler\n * @param user User that wants to authenticate\n * @param password Password used for authentication\n * @param userdata Userdata to be passed to the callback function.\n * @returns SSH_AUTH_SUCCESS Authentication is accepted.\n * @returns SSH_AUTH_PARTIAL Partial authentication, more authentication means are needed.\n * @returns SSH_AUTH_DENIED Authentication failed.\n */\ntypedef int (*ssh_auth_password_callback) (ssh_session session, const char *user, const char *password,\n\t\tvoid *userdata);\n\n/**\n * @brief SSH authentication callback. Tries to authenticates user with the \"none\" method\n * which is anonymous or passwordless.\n * @param session Current session handler\n * @param user User that wants to authenticate\n * @param userdata Userdata to be passed to the callback function.\n * @returns SSH_AUTH_SUCCESS Authentication is accepted.\n * @returns SSH_AUTH_PARTIAL Partial authentication, more authentication means are needed.\n * @returns SSH_AUTH_DENIED Authentication failed.\n */\ntypedef int (*ssh_auth_none_callback) (ssh_session session, const char *user, void *userdata);\n\n/**\n * @brief SSH authentication callback. Tries to authenticates user with the \"gssapi-with-mic\" method\n * @param session Current session handler\n * @param user Username of the user (can be spoofed)\n * @param principal Authenticated principal of the user, including realm.\n * @param userdata Userdata to be passed to the callback function.\n * @returns SSH_AUTH_SUCCESS Authentication is accepted.\n * @returns SSH_AUTH_PARTIAL Partial authentication, more authentication means are needed.\n * @returns SSH_AUTH_DENIED Authentication failed.\n * @warning Implementations should verify that parameter user matches in some way the principal.\n * user and principal can be different. Only the latter is guaranteed to be safe.\n */\ntypedef int (*ssh_auth_gssapi_mic_callback) (ssh_session session, const char *user, const char *principal,\n\t\tvoid *userdata);\n\n/**\n * @brief SSH authentication callback.\n * @param session Current session handler\n * @param user User that wants to authenticate\n * @param pubkey public key used for authentication\n * @param signature_state SSH_PUBLICKEY_STATE_NONE if the key is not signed (simple public key probe),\n * \t\t\t\t\t\t\tSSH_PUBLICKEY_STATE_VALID if the signature is valid. Others values should be\n * \t\t\t\t\t\t\treplied with a SSH_AUTH_DENIED.\n * @param userdata Userdata to be passed to the callback function.\n * @returns SSH_AUTH_SUCCESS Authentication is accepted.\n * @returns SSH_AUTH_PARTIAL Partial authentication, more authentication means are needed.\n * @returns SSH_AUTH_DENIED Authentication failed.\n */\ntypedef int (*ssh_auth_pubkey_callback) (ssh_session session, const char *user, struct ssh_key_struct *pubkey,\n\t\tchar signature_state, void *userdata);\n\n\n/**\n * @brief Handles an SSH service request\n * @param session current session handler\n * @param service name of the service (e.g. \"ssh-userauth\") requested\n * @param userdata Userdata to be passed to the callback function.\n * @returns 0 if the request is to be allowed\n * @returns -1 if the request should not be allowed\n */\n\ntypedef int (*ssh_service_request_callback) (ssh_session session, const char *service, void *userdata);\n\n/**\n * @brief Handles an SSH new channel open session request\n * @param session current session handler\n * @param userdata Userdata to be passed to the callback function.\n * @returns a valid ssh_channel handle if the request is to be allowed\n * @returns NULL if the request should not be allowed\n * @warning The channel pointer returned by this callback must be closed by the application.\n */\ntypedef ssh_channel (*ssh_channel_open_request_session_callback) (ssh_session session, void *userdata);\n\n/*\n * @brief handle the beginning of a GSSAPI authentication, server side.\n * @param session current session handler\n * @param user the username of the client\n * @param n_oid number of available oids\n * @param oids OIDs provided by the client\n * @returns an ssh_string containing the chosen OID, that's supported by both\n * client and server.\n * @warning It is not necessary to fill this callback in if libssh is linked\n * with libgssapi.\n */\ntypedef ssh_string (*ssh_gssapi_select_oid_callback) (ssh_session session, const char *user,\n\t\tint n_oid, ssh_string *oids, void *userdata);\n\n/*\n * @brief handle the negociation of a security context, server side.\n * @param session current session handler\n * @param[in] input_token input token provided by client\n * @param[out] output_token output of the gssapi accept_sec_context method,\n * \t\t\t\tNULL after completion.\n * @returns SSH_OK if the token was generated correctly or accept_sec_context\n * returned GSS_S_COMPLETE\n * @returns SSH_ERROR in case of error\n * @warning It is not necessary to fill this callback in if libssh is linked\n * with libgssapi.\n */\ntypedef int (*ssh_gssapi_accept_sec_ctx_callback) (ssh_session session,\n\t\tssh_string input_token, ssh_string *output_token, void *userdata);\n\n/*\n * @brief Verify and authenticates a MIC, server side.\n * @param session current session handler\n * @param[in] mic input mic to be verified provided by client\n * @param[in] mic_buffer buffer of data to be signed.\n * @param[in] mic_buffer_size size of mic_buffer\n * @returns SSH_OK if the MIC was authenticated correctly\n * @returns SSH_ERROR in case of error\n * @warning It is not necessary to fill this callback in if libssh is linked\n * with libgssapi.\n */\ntypedef int (*ssh_gssapi_verify_mic_callback) (ssh_session session,\n\t\tssh_string mic, void *mic_buffer, size_t mic_buffer_size, void *userdata);\n\n\n/**\n * This structure can be used to implement a libssh server, with appropriate callbacks.\n */\n\nstruct ssh_server_callbacks_struct {\n  /** DON'T SET THIS use ssh_callbacks_init() instead. */\n  size_t size;\n  /**\n   * User-provided data. User is free to set anything he wants here\n   */\n  void *userdata;\n  /** This function gets called when a client tries to authenticate through\n   * password method.\n   */\n  ssh_auth_password_callback auth_password_function;\n\n  /** This function gets called when a client tries to authenticate through\n   * none method.\n   */\n  ssh_auth_none_callback auth_none_function;\n\n  /** This function gets called when a client tries to authenticate through\n   * gssapi-mic method.\n   */\n  ssh_auth_gssapi_mic_callback auth_gssapi_mic_function;\n\n  /** this function gets called when a client tries to authenticate or offer\n   * a public key.\n   */\n  ssh_auth_pubkey_callback auth_pubkey_function;\n\n  /** This functions gets called when a service request is issued by the\n   * client\n   */\n  ssh_service_request_callback service_request_function;\n  /** This functions gets called when a new channel request is issued by\n   * the client\n   */\n  ssh_channel_open_request_session_callback channel_open_request_session_function;\n  /** This function will be called when a new gssapi authentication is attempted.\n   */\n  ssh_gssapi_select_oid_callback gssapi_select_oid_function;\n  /** This function will be called when a gssapi token comes in.\n   */\n  ssh_gssapi_accept_sec_ctx_callback gssapi_accept_sec_ctx_function;\n  /* This function will be called when a MIC needs to be verified.\n   */\n  ssh_gssapi_verify_mic_callback gssapi_verify_mic_function;\n};\ntypedef struct ssh_server_callbacks_struct *ssh_server_callbacks;\n\n/**\n * @brief Set the session server callback functions.\n *\n * This functions sets the callback structure to use your own callback\n * functions for user authentication, new channels and requests.\n *\n * @code\n * struct ssh_server_callbacks_struct cb = {\n *   .userdata = data,\n *   .auth_password_function = my_auth_function\n * };\n * ssh_callbacks_init(&cb);\n * ssh_set_server_callbacks(session, &cb);\n * @endcode\n *\n * @param  session      The session to set the callback structure.\n *\n * @param  cb           The callback structure itself.\n *\n * @return SSH_OK on success, SSH_ERROR on error.\n */\nLIBSSH_API int ssh_set_server_callbacks(ssh_session session, ssh_server_callbacks cb);\n\n/**\n * These are the callbacks exported by the socket structure\n * They are called by the socket module when a socket event appears\n */\nstruct ssh_socket_callbacks_struct {\n  /**\n   * User-provided data. User is free to set anything he wants here\n   */\n  void *userdata;\n\t/**\n\t * This function will be called each time data appears on socket. The data\n\t * not consumed will appear on the next data event.\n\t */\n  ssh_callback_data data;\n  /** This function will be called each time a controlflow state changes, i.e.\n   * the socket is available for reading or writing.\n   */\n  ssh_callback_int controlflow;\n  /** This function will be called each time an exception appears on socket. An\n   * exception can be a socket problem (timeout, ...) or an end-of-file.\n   */\n  ssh_callback_int_int exception;\n  /** This function is called when the ssh_socket_connect was used on the socket\n   * on nonblocking state, and the connection successed.\n   */\n  ssh_callback_int_int connected;\n};\ntypedef struct ssh_socket_callbacks_struct *ssh_socket_callbacks;\n\nstruct ssh_socket_external_callbacks_struct {\n  /**\n   * User-provided data. User is free to set anything he wants here\n   */\n  void *userdata;\n  /** This function will be called each time data need send.\n   */\n  ssh_callback_data send;\n};\ntypedef struct ssh_socket_external_callbacks_struct *ssh_socket_external_callbacks;\n\n#define SSH_SOCKET_FLOW_WRITEWILLBLOCK 1\n#define SSH_SOCKET_FLOW_WRITEWONTBLOCK 2\n\n#define SSH_SOCKET_EXCEPTION_EOF \t     1\n#define SSH_SOCKET_EXCEPTION_ERROR     2\n\n#define SSH_SOCKET_CONNECTED_OK \t\t\t1\n#define SSH_SOCKET_CONNECTED_ERROR \t\t2\n#define SSH_SOCKET_CONNECTED_TIMEOUT \t3\n\n/**\n * @brief Initializes an ssh_callbacks_struct\n * A call to this macro is mandatory when you have set a new\n * ssh_callback_struct structure. Its goal is to maintain the binary\n * compatibility with future versions of libssh as the structure\n * evolves with time.\n */\n#define ssh_callbacks_init(p) do {\\\n\t(p)->size=sizeof(*(p)); \\\n} while(0);\n\n/**\n * @internal\n * @brief tests if a callback can be called without crash\n *  verifies that the struct size if big enough\n *  verifies that the callback pointer exists\n * @param p callback pointer\n * @param c callback name\n * @returns nonzero if callback can be called\n */\n#define ssh_callbacks_exists(p,c) (\\\n  (p != NULL) && ( (char *)&((p)-> c) < (char *)(p) + (p)->size ) && \\\n  ((p)-> c != NULL) \\\n  )\n\n/**\n * @internal\n *\n * @brief Iterate through a list of callback structures\n *\n * This tests for their validity and executes them. The userdata argument is\n * automatically passed through.\n *\n * @param list     list of callbacks\n *\n * @param cbtype   type of the callback\n *\n * @param c        callback name\n *\n * @param va_args parameters to be passed\n */\n#define ssh_callbacks_execute_list(list, cbtype, c, ...)      \\\n    do {                                                      \\\n        struct ssh_iterator *i = ssh_list_get_iterator(list); \\\n        cbtype cb;                                            \\\n        while (i != NULL){                                    \\\n            cb = ssh_iterator_value(cbtype, i);               \\\n            if (ssh_callbacks_exists(cb, c))                  \\\n                cb-> c (__VA_ARGS__, cb->userdata);           \\\n            i = i->next;                                      \\\n        }                                                     \\\n    } while(0)\n\n/**\n * @internal\n *\n * @brief iterate through a list of callback structures.\n *\n * This tests for their validity and give control back to the calling code to\n * execute them. Caller can decide to break the loop or continue executing the\n * callbacks with different parameters\n *\n * @code\n * ssh_callbacks_iterate(channel->callbacks, ssh_channel_callbacks,\n *                     channel_eof_function){\n *     rc = ssh_callbacks_iterate_exec(session, channel);\n *     if (rc != SSH_OK){\n *         break;\n *     }\n * }\n * ssh_callbacks_iterate_end();\n * @endcode\n */\n#define ssh_callbacks_iterate(_cb_list, _cb_type, _cb_name)           \\\n    do {                                                              \\\n        struct ssh_iterator *_cb_i = ssh_list_get_iterator(_cb_list); \\\n        _cb_type _cb;                                                 \\\n        for (; _cb_i != NULL; _cb_i = _cb_i->next) {                  \\\n            _cb = ssh_iterator_value(_cb_type, _cb_i);                \\\n            if (ssh_callbacks_exists(_cb, _cb_name))\n\n#define ssh_callbacks_iterate_exec(_cb_name, ...) \\\n                _cb->_cb_name(__VA_ARGS__, _cb->userdata)\n\n#define ssh_callbacks_iterate_end() \\\n        }                           \\\n    } while(0)\n\n/** @brief Prototype for a packet callback, to be called when a new packet arrives\n * @param session The current session of the packet\n * @param type packet type (see ssh2.h)\n * @param packet buffer containing the packet, excluding size, type and padding fields\n * @param user user argument to the callback\n * and are called each time a packet shows up\n * @returns SSH_PACKET_USED Packet was parsed and used\n * @returns SSH_PACKET_NOT_USED Packet was not used or understood, processing must continue\n */\ntypedef int (*ssh_packet_callback) (ssh_session session, uint8_t type, ssh_buffer packet, void *user);\n\n/** return values for a ssh_packet_callback */\n/** Packet was used and should not be parsed by another callback */\n#define SSH_PACKET_USED 1\n/** Packet was not used and should be passed to any other callback\n * available */\n#define SSH_PACKET_NOT_USED 2\n\n\n/** @brief This macro declares a packet callback handler\n * @code\n * SSH_PACKET_CALLBACK(mycallback){\n * ...\n * }\n * @endcode\n */\n#define SSH_PACKET_CALLBACK(name) \\\n\tint name (ssh_session session, uint8_t type, ssh_buffer packet, void *user)\n\nstruct ssh_packet_callbacks_struct {\n\t/** Index of the first packet type being handled */\n\tuint8_t start;\n\t/** Number of packets being handled by this callback struct */\n\tuint8_t n_callbacks;\n\t/** A pointer to n_callbacks packet callbacks */\n\tssh_packet_callback *callbacks;\n  /**\n   * User-provided data. User is free to set anything he wants here\n   */\n\tvoid *user;\n};\n\ntypedef struct ssh_packet_callbacks_struct *ssh_packet_callbacks;\n\n/**\n * @brief Set the session callback functions.\n *\n * This functions sets the callback structure to use your own callback\n * functions for auth, logging and status.\n *\n * @code\n * struct ssh_callbacks_struct cb = {\n *   .userdata = data,\n *   .auth_function = my_auth_function\n * };\n * ssh_callbacks_init(&cb);\n * ssh_set_callbacks(session, &cb);\n * @endcode\n *\n * @param  session      The session to set the callback structure.\n *\n * @param  cb           The callback structure itself.\n *\n * @return SSH_OK on success, SSH_ERROR on error.\n */\nLIBSSH_API int ssh_set_callbacks(ssh_session session, ssh_callbacks cb);\n\n/**\n * @brief SSH channel data callback. Called when data is available on a channel\n * @param session Current session handler\n * @param channel the actual channel\n * @param data the data that has been read on the channel\n * @param len the length of the data\n * @param is_stderr is 0 for stdout or 1 for stderr\n * @param userdata Userdata to be passed to the callback function.\n * @returns number of bytes processed by the callee. The remaining bytes will\n * be sent in the next callback message, when more data is available.\n */\ntypedef int (*ssh_channel_data_callback) (ssh_session session,\n                                           ssh_channel channel,\n                                           void *data,\n                                           uint32_t len,\n                                           int is_stderr,\n                                           void *userdata);\n\n/**\n * @brief SSH channel eof callback. Called when a channel receives EOF\n * @param session Current session handler\n * @param channel the actual channel\n * @param userdata Userdata to be passed to the callback function.\n */\ntypedef void (*ssh_channel_eof_callback) (ssh_session session,\n                                           ssh_channel channel,\n                                           void *userdata);\n\n/**\n * @brief SSH channel close callback. Called when a channel is closed by remote peer\n * @param session Current session handler\n * @param channel the actual channel\n * @param userdata Userdata to be passed to the callback function.\n */\ntypedef void (*ssh_channel_close_callback) (ssh_session session,\n                                            ssh_channel channel,\n                                            void *userdata);\n\n/**\n * @brief SSH channel signal callback. Called when a channel has received a signal\n * @param session Current session handler\n * @param channel the actual channel\n * @param signal the signal name (without the SIG prefix)\n * @param userdata Userdata to be passed to the callback function.\n */\ntypedef void (*ssh_channel_signal_callback) (ssh_session session,\n                                            ssh_channel channel,\n                                            const char *signal,\n                                            void *userdata);\n\n/**\n * @brief SSH channel exit status callback. Called when a channel has received an exit status\n * @param session Current session handler\n * @param channel the actual channel\n * @param userdata Userdata to be passed to the callback function.\n */\ntypedef void (*ssh_channel_exit_status_callback) (ssh_session session,\n                                            ssh_channel channel,\n                                            int exit_status,\n                                            void *userdata);\n\n/**\n * @brief SSH channel exit signal callback. Called when a channel has received an exit signal\n * @param session Current session handler\n * @param channel the actual channel\n * @param signal the signal name (without the SIG prefix)\n * @param core a boolean telling wether a core has been dumped or not\n * @param errmsg the description of the exception\n * @param lang the language of the description (format: RFC 3066)\n * @param userdata Userdata to be passed to the callback function.\n */\ntypedef void (*ssh_channel_exit_signal_callback) (ssh_session session,\n                                            ssh_channel channel,\n                                            const char *signal,\n                                            int core,\n                                            const char *errmsg,\n                                            const char *lang,\n                                            void *userdata);\n\n/**\n * @brief SSH channel PTY request from a client.\n * @param channel the channel\n * @param term The type of terminal emulation\n * @param width width of the terminal, in characters\n * @param height height of the terminal, in characters\n * @param pxwidth width of the terminal, in pixels\n * @param pxheight height of the terminal, in pixels\n * @param userdata Userdata to be passed to the callback function.\n * @returns 0 if the pty request is accepted\n * @returns -1 if the request is denied\n */\ntypedef int (*ssh_channel_pty_request_callback) (ssh_session session,\n                                            ssh_channel channel,\n                                            const char *term,\n                                            int width, int height,\n                                            int pxwidth, int pwheight,\n                                            void *userdata);\n\n/**\n * @brief SSH channel Shell request from a client.\n * @param channel the channel\n * @param userdata Userdata to be passed to the callback function.\n * @returns 0 if the shell request is accepted\n * @returns 1 if the request is denied\n */\ntypedef int (*ssh_channel_shell_request_callback) (ssh_session session,\n                                            ssh_channel channel,\n                                            void *userdata);\n/**\n * @brief SSH auth-agent-request from the client. This request is\n * sent by a client when agent forwarding is available.\n * Server is free to ignore this callback, no answer is expected.\n * @param channel the channel\n * @param userdata Userdata to be passed to the callback function.\n */\ntypedef void (*ssh_channel_auth_agent_req_callback) (ssh_session session,\n                                            ssh_channel channel,\n                                            void *userdata);\n\n/**\n * @brief SSH X11 request from the client. This request is\n * sent by a client when X11 forwarding is requested(and available).\n * Server is free to ignore this callback, no answer is expected.\n * @param channel the channel\n * @param userdata Userdata to be passed to the callback function.\n */\ntypedef void (*ssh_channel_x11_req_callback) (ssh_session session,\n                                            ssh_channel channel,\n                                            int single_connection,\n                                            const char *auth_protocol,\n                                            const char *auth_cookie,\n                                            uint32_t screen_number,\n                                            void *userdata);\n/**\n * @brief SSH channel PTY windows change (terminal size) from a client.\n * @param channel the channel\n * @param width width of the terminal, in characters\n * @param height height of the terminal, in characters\n * @param pxwidth width of the terminal, in pixels\n * @param pxheight height of the terminal, in pixels\n * @param userdata Userdata to be passed to the callback function.\n * @returns 0 if the pty request is accepted\n * @returns -1 if the request is denied\n */\ntypedef int (*ssh_channel_pty_window_change_callback) (ssh_session session,\n                                            ssh_channel channel,\n                                            int width, int height,\n                                            int pxwidth, int pwheight,\n                                            void *userdata);\n\n/**\n * @brief SSH channel Exec request from a client.\n * @param channel the channel\n * @param command the shell command to be executed\n * @param userdata Userdata to be passed to the callback function.\n * @returns 0 if the exec request is accepted\n * @returns 1 if the request is denied\n */\ntypedef int (*ssh_channel_exec_request_callback) (ssh_session session,\n                                            ssh_channel channel,\n                                            const char *command,\n                                            void *userdata);\n\n/**\n * @brief SSH channel environment request from a client.\n * @param channel the channel\n * @param env_name name of the environment value to be set\n * @param env_value value of the environment value to be set\n * @param userdata Userdata to be passed to the callback function.\n * @returns 0 if the env request is accepted\n * @returns 1 if the request is denied\n * @warning some environment variables can be dangerous if changed (e.g.\n * \t\t\tLD_PRELOAD) and should not be fulfilled.\n */\ntypedef int (*ssh_channel_env_request_callback) (ssh_session session,\n                                            ssh_channel channel,\n                                            const char *env_name,\n                                            const char *env_value,\n                                            void *userdata);\n/**\n * @brief SSH channel subsystem request from a client.\n * @param channel the channel\n * @param subsystem the subsystem required\n * @param userdata Userdata to be passed to the callback function.\n * @returns 0 if the subsystem request is accepted\n * @returns 1 if the request is denied\n */\ntypedef int (*ssh_channel_subsystem_request_callback) (ssh_session session,\n                                            ssh_channel channel,\n                                            const char *subsystem,\n                                            void *userdata);\n\n/**\n * @brief SSH channel write will not block (flow control).\n *\n * @param channel the channel\n *\n * @param[in] bytes size of the remote window in bytes. Writing as much data\n *            will not block.\n *\n * @param[in] userdata Userdata to be passed to the callback function.\n *\n * @returns 0 default return value (other return codes may be added in future).\n */\ntypedef int (*ssh_channel_write_wontblock_callback) (ssh_session session,\n                                                     ssh_channel channel,\n                                                     size_t bytes,\n                                                     void *userdata);\n\nstruct ssh_channel_callbacks_struct {\n  /** DON'T SET THIS use ssh_callbacks_init() instead. */\n  size_t size;\n  /**\n   * User-provided data. User is free to set anything he wants here\n   */\n  void *userdata;\n  /**\n   * This functions will be called when there is data available.\n   */\n  ssh_channel_data_callback channel_data_function;\n  /**\n   * This functions will be called when the channel has received an EOF.\n   */\n  ssh_channel_eof_callback channel_eof_function;\n  /**\n   * This functions will be called when the channel has been closed by remote\n   */\n  ssh_channel_close_callback channel_close_function;\n  /**\n   * This functions will be called when a signal has been received\n   */\n  ssh_channel_signal_callback channel_signal_function;\n  /**\n   * This functions will be called when an exit status has been received\n   */\n  ssh_channel_exit_status_callback channel_exit_status_function;\n  /**\n   * This functions will be called when an exit signal has been received\n   */\n  ssh_channel_exit_signal_callback channel_exit_signal_function;\n  /**\n   * This function will be called when a client requests a PTY\n   */\n  ssh_channel_pty_request_callback channel_pty_request_function;\n  /**\n   * This function will be called when a client requests a shell\n   */\n  ssh_channel_shell_request_callback channel_shell_request_function;\n  /** This function will be called when a client requests agent\n   * authentication forwarding.\n   */\n  ssh_channel_auth_agent_req_callback channel_auth_agent_req_function;\n  /** This function will be called when a client requests X11\n   * forwarding.\n   */\n  ssh_channel_x11_req_callback channel_x11_req_function;\n  /** This function will be called when a client requests a\n   * window change.\n   */\n  ssh_channel_pty_window_change_callback channel_pty_window_change_function;\n  /** This function will be called when a client requests a\n   * command execution.\n   */\n  ssh_channel_exec_request_callback channel_exec_request_function;\n  /** This function will be called when a client requests an environment\n   * variable to be set.\n   */\n  ssh_channel_env_request_callback channel_env_request_function;\n  /** This function will be called when a client requests a subsystem\n   * (like sftp).\n   */\n  ssh_channel_subsystem_request_callback channel_subsystem_request_function;\n  /** This function will be called when the channel write is guaranteed\n   * not to block.\n   */\n  ssh_channel_write_wontblock_callback channel_write_wontblock_function;\n};\n\ntypedef struct ssh_channel_callbacks_struct *ssh_channel_callbacks;\n\n/**\n * @brief Set the channel callback functions.\n *\n * This functions sets the callback structure to use your own callback\n * functions for channel data and exceptions\n *\n * @code\n * struct ssh_channel_callbacks_struct cb = {\n *   .userdata = data,\n *   .channel_data_function = my_channel_data_function\n * };\n * ssh_callbacks_init(&cb);\n * ssh_set_channel_callbacks(channel, &cb);\n * @endcode\n *\n * @param  channel      The channel to set the callback structure.\n *\n * @param  cb           The callback structure itself.\n *\n * @return SSH_OK on success, SSH_ERROR on error.\n * @warning this function will not replace existing callbacks but set the\n *          new one atop of them.\n */\nLIBSSH_API int ssh_set_channel_callbacks(ssh_channel channel,\n                                         ssh_channel_callbacks cb);\n\n/**\n * @brief Add channel callback functions\n *\n * This function will add channel callback functions to the channel callback\n * list.\n * Callbacks missing from a callback structure will be probed in the next\n * on the list.\n *\n * @param  channel      The channel to set the callback structure.\n *\n * @param  cb           The callback structure itself.\n *\n * @return SSH_OK on success, SSH_ERROR on error.\n *\n * @see ssh_set_channel_callbacks\n */\nLIBSSH_API int ssh_add_channel_callbacks(ssh_channel channel,\n                                         ssh_channel_callbacks cb);\n\n/**\n * @brief Remove a channel callback.\n *\n * The channel has been added with ssh_add_channel_callbacks or\n * ssh_set_channel_callbacks in this case.\n *\n * @param channel  The channel to remove the callback structure from.\n *\n * @param cb       The callback structure to remove\n *\n * @returns SSH_OK on success, SSH_ERROR on error.\n */\nLIBSSH_API int ssh_remove_channel_callbacks(ssh_channel channel,\n                                            ssh_channel_callbacks cb);\n\n/** @} */\n\n/** @group libssh_threads\n * @{\n */\n\ntypedef int (*ssh_thread_callback) (void **lock);\n\ntypedef unsigned long (*ssh_thread_id_callback) (void);\nstruct ssh_threads_callbacks_struct {\n\tconst char *type;\n  ssh_thread_callback mutex_init;\n  ssh_thread_callback mutex_destroy;\n  ssh_thread_callback mutex_lock;\n  ssh_thread_callback mutex_unlock;\n  ssh_thread_id_callback thread_id;\n};\n\n/**\n * @brief Set the thread callbacks structure.\n *\n * This is necessary if your program is using libssh in a multithreaded fashion.\n * This function must be called first, outside of any threading context (in your\n * main() function for instance), before you call ssh_init().\n *\n * @param[in] cb   A pointer to a ssh_threads_callbacks_struct structure, which\n *                 contains the different callbacks to be set.\n *\n * @returns        Always returns SSH_OK.\n *\n * @see ssh_threads_callbacks_struct\n * @see SSH_THREADS_PTHREAD\n * @bug libgcrypt 1.6 and bigger backend does not support custom callback.\n *      Using anything else than pthreads here will fail.\n */\nLIBSSH_API int ssh_threads_set_callbacks(struct ssh_threads_callbacks_struct\n    *cb);\n\n/**\n * @brief Returns a pointer to the appropriate callbacks structure for the\n * environment, to be used with ssh_threads_set_callbacks.\n *\n * @returns A pointer to a ssh_threads_callbacks_struct to be used with\n * ssh_threads_set_callbacks.\n *\n * @see ssh_threads_set_callbacks\n */\nLIBSSH_API struct ssh_threads_callbacks_struct *ssh_threads_get_default(void);\n\n/**\n * @brief Returns a pointer on the pthread threads callbacks, to be used with\n * ssh_threads_set_callbacks.\n *\n * @see ssh_threads_set_callbacks\n */\nLIBSSH_API struct ssh_threads_callbacks_struct *ssh_threads_get_pthread(void);\n\n/**\n * @brief Get the noop threads callbacks structure\n *\n * This can be used with ssh_threads_set_callbacks. These callbacks do nothing\n * and are being used by default.\n *\n * @return Always returns a valid pointer to the noop callbacks structure.\n *\n * @see ssh_threads_set_callbacks\n */\nLIBSSH_API struct ssh_threads_callbacks_struct *ssh_threads_get_noop(void);\n\n/**\n * @brief Set the logging callback function.\n *\n * @param[in]  cb  The callback to set.\n *\n * @return         0 on success, < 0 on errror.\n */\nLIBSSH_API int ssh_set_log_callback(ssh_logging_callback cb);\n\n/**\n * @brief Get the pointer to the logging callback function.\n *\n * @return The pointer the the callback or NULL if none set.\n */\nLIBSSH_API ssh_logging_callback ssh_get_log_callback(void);\n\n/** @} */\n#ifdef __cplusplus\n}\n#endif\n\n#endif /*_SSH_CALLBACK_H */\n\n/* @} */\n"
  },
  {
    "path": "src/libssh/include/libssh/chacha.h",
    "content": "/* $OpenBSD: chacha.h,v 1.3 2014/05/02 03:27:54 djm Exp $ */\n\n/*\nchacha-merged.c version 20080118\nD. J. Bernstein\nPublic domain.\n*/\n\n#ifndef CHACHA_H\n#define CHACHA_H\n\nstruct chacha_ctx {\n    uint32_t input[16];\n};\n\n#define CHACHA_MINKEYLEN  16\n#define CHACHA_NONCELEN   8\n#define CHACHA_CTRLEN     8\n#define CHACHA_STATELEN   (CHACHA_NONCELEN+CHACHA_CTRLEN)\n#define CHACHA_BLOCKLEN   64\n\nvoid chacha_keysetup(struct chacha_ctx *x, const uint8_t *k, uint32_t kbits)\n#ifdef HAVE_GCC_BOUNDED_ATTRIBUTE\n    __attribute__((__bounded__(__minbytes__, 2, CHACHA_MINKEYLEN)))\n#endif\n    ;\nvoid chacha_ivsetup(struct chacha_ctx *x, const uint8_t *iv, const uint8_t *ctr)\n#ifdef HAVE_GCC_BOUNDED_ATTRIBUTE\n    __attribute__((__bounded__(__minbytes__, 2, CHACHA_NONCELEN)))\n    __attribute__((__bounded__(__minbytes__, 3, CHACHA_CTRLEN)))\n#endif\n    ;\nvoid chacha_encrypt_bytes(struct chacha_ctx *x, const uint8_t *m,\n    uint8_t *c, uint32_t bytes)\n#ifdef HAVE_GCC_BOUNDED_ATTRIBUTE\n    __attribute__((__bounded__(__buffer__, 2, 4)))\n    __attribute__((__bounded__(__buffer__, 3, 4)))\n#endif\n    ;\n\n#endif    /* CHACHA_H */\n"
  },
  {
    "path": "src/libssh/include/libssh/channels.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2009 by Aris Adamantiadis\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef CHANNELS_H_\n#define CHANNELS_H_\n#include \"libssh/priv.h\"\n\n/**  @internal\n * Describes the different possible states in a\n * outgoing (client) channel request\n */\nenum ssh_channel_request_state_e {\n\t/** No request has been made */\n\tSSH_CHANNEL_REQ_STATE_NONE = 0,\n\t/** A request has been made and answer is pending */\n\tSSH_CHANNEL_REQ_STATE_PENDING,\n\t/** A request has been replied and accepted */\n\tSSH_CHANNEL_REQ_STATE_ACCEPTED,\n\t/** A request has been replied and refused */\n\tSSH_CHANNEL_REQ_STATE_DENIED,\n\t/** A request has been replied and an error happend */\n\tSSH_CHANNEL_REQ_STATE_ERROR\n};\n\nenum ssh_channel_state_e {\n  SSH_CHANNEL_STATE_NOT_OPEN = 0,\n  SSH_CHANNEL_STATE_OPENING,\n  SSH_CHANNEL_STATE_OPEN_DENIED,\n  SSH_CHANNEL_STATE_OPEN,\n  SSH_CHANNEL_STATE_CLOSED\n};\n\n/* The channel has been closed by the remote side */\n#define SSH_CHANNEL_FLAG_CLOSED_REMOTE 0x0001\n\n/* The channel has been closed locally */\n#define SSH_CHANNEL_FLAG_CLOSED_LOCAL 0x0002\n\n/* The channel has been freed by the calling program */\n#define SSH_CHANNEL_FLAG_FREED_LOCAL 0x0004\n\n/* the channel has not yet been bound to a remote one */\n#define SSH_CHANNEL_FLAG_NOT_BOUND 0x0008\n\nstruct ssh_channel_struct {\n    ssh_session session; /* SSH_SESSION pointer */\n    uint32_t local_channel;\n    uint32_t local_window;\n    int local_eof;\n    uint32_t local_maxpacket;\n\n    uint32_t remote_channel;\n    uint32_t remote_window;\n    int remote_eof; /* end of file received */\n    uint32_t remote_maxpacket;\n    enum ssh_channel_state_e state;\n    int delayed_close;\n    int flags;\n    ssh_buffer stdout_buffer;\n    ssh_buffer stderr_buffer;\n    void *userarg;\n    int exit_status;\n    enum ssh_channel_request_state_e request_state;\n    struct ssh_list *callbacks; /* list of ssh_channel_callbacks */\n\n    /* counters */\n    ssh_counter counter;\n};\n\nSSH_PACKET_CALLBACK(ssh_packet_channel_open_conf);\nSSH_PACKET_CALLBACK(ssh_packet_channel_open_fail);\nSSH_PACKET_CALLBACK(ssh_packet_channel_success);\nSSH_PACKET_CALLBACK(ssh_packet_channel_failure);\nSSH_PACKET_CALLBACK(ssh_request_success);\nSSH_PACKET_CALLBACK(ssh_request_denied);\n\nSSH_PACKET_CALLBACK(channel_rcv_change_window);\nSSH_PACKET_CALLBACK(channel_rcv_eof);\nSSH_PACKET_CALLBACK(channel_rcv_close);\nSSH_PACKET_CALLBACK(channel_rcv_request);\nSSH_PACKET_CALLBACK(channel_rcv_data);\n\nint channel_default_bufferize(ssh_channel channel,\n                              void *data, size_t len,\n                              bool is_stderr);\nint ssh_channel_flush(ssh_channel channel);\nuint32_t ssh_channel_new_id(ssh_session session);\nssh_channel ssh_channel_from_local(ssh_session session, uint32_t id);\nvoid ssh_channel_do_free(ssh_channel channel);\nint ssh_global_request(ssh_session session,\n                       const char *request,\n                       ssh_buffer buffer,\n                       int reply);\n\n#endif /* CHANNELS_H_ */\n"
  },
  {
    "path": "src/libssh/include/libssh/config.h",
    "content": "/*\n * config.h - parse the ssh config file\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2009-2018    by Andreas Schneider <asn@cryptomilk.org>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#ifndef LIBSSH_CONFIG_H_\n#define LIBSSH_CONFIG_H_\n\n\nenum ssh_config_opcode_e {\n    /* Unknown opcode */\n    SOC_UNKNOWN = -3,\n    /* Known and not applicable to libssh */\n    SOC_NA = -2,\n    /* Known but not supported by current libssh version */\n    SOC_UNSUPPORTED = -1,\n    SOC_HOST,\n    SOC_MATCH,\n    SOC_HOSTNAME,\n    SOC_PORT,\n    SOC_USERNAME,\n    SOC_IDENTITY,\n    SOC_CIPHERS,\n    SOC_MACS,\n    SOC_COMPRESSION,\n    SOC_TIMEOUT,\n    SOC_PROTOCOL,\n    SOC_STRICTHOSTKEYCHECK,\n    SOC_KNOWNHOSTS,\n    SOC_PROXYCOMMAND,\n    SOC_PROXYJUMP,\n    SOC_GSSAPISERVERIDENTITY,\n    SOC_GSSAPICLIENTIDENTITY,\n    SOC_GSSAPIDELEGATECREDENTIALS,\n    SOC_INCLUDE,\n    SOC_BINDADDRESS,\n    SOC_GLOBALKNOWNHOSTSFILE,\n    SOC_LOGLEVEL,\n    SOC_HOSTKEYALGORITHMS,\n    SOC_KEXALGORITHMS,\n    SOC_GSSAPIAUTHENTICATION,\n    SOC_KBDINTERACTIVEAUTHENTICATION,\n    SOC_PASSWORDAUTHENTICATION,\n    SOC_PUBKEYAUTHENTICATION,\n    SOC_PUBKEYACCEPTEDTYPES,\n    SOC_REKEYLIMIT,\n\n    SOC_MAX /* Keep this one last in the list */\n};\n#endif /* LIBSSH_CONFIG_H_ */\n"
  },
  {
    "path": "src/libssh/include/libssh/config_parser.h",
    "content": "/*\n * config_parser.h - Common configuration file parser functions\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2019 by Red Hat, Inc.\n *\n * Author: Anderson Toshiyuki Sasaki <ansasaki@redhat.com>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#ifndef CONFIG_PARSER_H_\n#define CONFIG_PARSER_H_\n\nchar *ssh_config_get_cmd(char **str);\n\nchar *ssh_config_get_token(char **str);\n\nlong ssh_config_get_long(char **str, long notfound);\n\nconst char *ssh_config_get_str_tok(char **str, const char *def);\n\nint ssh_config_get_yesno(char **str, int notfound);\n\n/* @brief Parse SSH URI in format [user@]host[:port] from the given string\n *\n * @param[in]   tok      String to parse\n * @param[out]  username Pointer to the location, where the new username will\n *                       be stored or NULL if we do not care about the result.\n * @param[out]  hostname Pointer to the location, where the new hostname will\n *                       be stored or NULL if we do not care about the result.\n * @param[out]  port     Pointer to the location, where the new port will\n *                       be stored or NULL if we do not care about the result.\n *\n * @returns     SSH_OK if the provided string is in format of SSH URI,\n *              SSH_ERROR on failure\n */\nint ssh_config_parse_uri(const char *tok,\n        char **username,\n        char **hostname,\n        char **port);\n\n#endif /* LIBSSH_CONFIG_H_ */\n"
  },
  {
    "path": "src/libssh/include/libssh/crypto.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2003-2009 by Aris Adamantiadis\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/*\n * crypto.h is an include file for internal cryptographic structures of libssh\n */\n\n#ifndef _CRYPTO_H_\n#define _CRYPTO_H_\n\n#include <stdbool.h>\n#include \"config.h\"\n\n#ifdef HAVE_LIBGCRYPT\n#include <gcrypt.h>\n#elif defined(HAVE_LIBMBEDCRYPTO)\n#include <mbedtls/gcm.h>\n#endif\n#include \"libssh/wrapper.h\"\n\n#ifdef cbc_encrypt\n#undef cbc_encrypt\n#endif\n#ifdef cbc_decrypt\n#undef cbc_decrypt\n#endif\n\n#ifdef HAVE_OPENSSL_ECDH_H\n#include <openssl/ecdh.h>\n#endif\n#include \"libssh/dh.h\"\n#include \"libssh/ecdh.h\"\n#include \"libssh/kex.h\"\n#include \"libssh/curve25519.h\"\n\n#define DIGEST_MAX_LEN 64\n\n#define AES_GCM_TAGLEN 16\n#define AES_GCM_IVLEN  12\n\nenum ssh_key_exchange_e {\n  /* diffie-hellman-group1-sha1 */\n  SSH_KEX_DH_GROUP1_SHA1=1,\n  /* diffie-hellman-group14-sha1 */\n  SSH_KEX_DH_GROUP14_SHA1,\n#ifdef WITH_GEX\n  /* diffie-hellman-group-exchange-sha1 */\n  SSH_KEX_DH_GEX_SHA1,\n  /* diffie-hellman-group-exchange-sha256 */\n  SSH_KEX_DH_GEX_SHA256,\n#endif /* WITH_GEX */\n  /* ecdh-sha2-nistp256 */\n  SSH_KEX_ECDH_SHA2_NISTP256,\n  /* ecdh-sha2-nistp384 */\n  SSH_KEX_ECDH_SHA2_NISTP384,\n  /* ecdh-sha2-nistp521 */\n  SSH_KEX_ECDH_SHA2_NISTP521,\n  /* curve25519-sha256@libssh.org */\n  SSH_KEX_CURVE25519_SHA256_LIBSSH_ORG,\n  /* curve25519-sha256 */\n  SSH_KEX_CURVE25519_SHA256,\n  /* diffie-hellman-group16-sha512 */\n  SSH_KEX_DH_GROUP16_SHA512,\n  /* diffie-hellman-group18-sha512 */\n  SSH_KEX_DH_GROUP18_SHA512,\n  /* diffie-hellman-group14-sha256 */\n  SSH_KEX_DH_GROUP14_SHA256,\n};\n\nenum ssh_cipher_e {\n    SSH_NO_CIPHER=0,\n#ifdef WITH_BLOWFISH_CIPHER\n    SSH_BLOWFISH_CBC,\n#endif /* WITH_BLOWFISH_CIPHER */\n    SSH_3DES_CBC,\n    SSH_AES128_CBC,\n    SSH_AES192_CBC,\n    SSH_AES256_CBC,\n    SSH_AES128_CTR,\n    SSH_AES192_CTR,\n    SSH_AES256_CTR,\n    SSH_AEAD_AES128_GCM,\n    SSH_AEAD_AES256_GCM,\n    SSH_AEAD_CHACHA20_POLY1305\n};\n\nstruct dh_ctx;\n\nstruct ssh_crypto_struct {\n    bignum shared_secret;\n    struct dh_ctx *dh_ctx;\n#ifdef WITH_GEX\n    size_t dh_pmin; size_t dh_pn; size_t dh_pmax; /* preferred group parameters */\n#endif /* WITH_GEX */\n#ifdef HAVE_ECDH\n#ifdef HAVE_OPENSSL_ECC\n    EC_KEY *ecdh_privkey;\n#elif defined HAVE_GCRYPT_ECC\n    gcry_sexp_t ecdh_privkey;\n#elif defined HAVE_LIBMBEDCRYPTO\n    mbedtls_ecp_keypair *ecdh_privkey;\n#endif\n    ssh_string ecdh_client_pubkey;\n    ssh_string ecdh_server_pubkey;\n#endif\n#ifdef HAVE_CURVE25519\n    ssh_curve25519_privkey curve25519_privkey;\n    ssh_curve25519_pubkey curve25519_client_pubkey;\n    ssh_curve25519_pubkey curve25519_server_pubkey;\n#endif\n    ssh_string dh_server_signature; /* information used by dh_handshake. */\n    size_t digest_len; /* len of the two fields below */\n    unsigned char *session_id;\n    unsigned char *secret_hash; /* Secret hash is same as session id until re-kex */\n    unsigned char *encryptIV;\n    unsigned char *decryptIV;\n    unsigned char *decryptkey;\n    unsigned char *encryptkey;\n    unsigned char *encryptMAC;\n    unsigned char *decryptMAC;\n    unsigned char hmacbuf[DIGEST_MAX_LEN];\n    struct ssh_cipher_struct *in_cipher, *out_cipher; /* the cipher structures/objects */\n    enum ssh_hmac_e in_hmac, out_hmac; /* the MAC algorithms used */\n    bool in_hmac_etm, out_hmac_etm; /* Whether EtM mode is used or not */\n\n    ssh_key server_pubkey;\n    int do_compress_out; /* idem */\n    int do_compress_in; /* don't set them, set the option instead */\n    int delayed_compress_in; /* Use of zlib@openssh.org */\n    int delayed_compress_out;\n    void *compress_out_ctx; /* don't touch it */\n    void *compress_in_ctx; /* really, don't */\n    /* kex sent by server, client, and mutually elected methods */\n    struct ssh_kex_struct server_kex;\n    struct ssh_kex_struct client_kex;\n    char *kex_methods[SSH_KEX_METHODS];\n    enum ssh_key_exchange_e kex_type;\n    enum ssh_kdf_digest digest_type; /* Digest type for session keys derivation */\n    enum ssh_crypto_direction_e used; /* Is this crypto still used for either of directions? */\n};\n\nstruct ssh_cipher_struct {\n    const char *name; /* ssh name of the algorithm */\n    unsigned int blocksize; /* blocksize of the algo */\n    enum ssh_cipher_e ciphertype;\n    uint32_t lenfield_blocksize; /* blocksize of the packet length field */\n    size_t keylen; /* length of the key structure */\n#ifdef HAVE_LIBGCRYPT\n    gcry_cipher_hd_t *key;\n    unsigned char last_iv[AES_GCM_IVLEN];\n#elif defined HAVE_LIBCRYPTO\n    struct ssh_3des_key_schedule *des3_key;\n    struct ssh_aes_key_schedule *aes_key;\n    const EVP_CIPHER *cipher;\n    EVP_CIPHER_CTX *ctx;\n#elif defined HAVE_LIBMBEDCRYPTO\n    mbedtls_cipher_context_t encrypt_ctx;\n    mbedtls_cipher_context_t decrypt_ctx;\n    mbedtls_cipher_type_t type;\n#ifdef MBEDTLS_GCM_C\n    mbedtls_gcm_context gcm_ctx;\n    unsigned char last_iv[AES_GCM_IVLEN];\n#endif /* MBEDTLS_GCM_C */\n#endif\n    struct chacha20_poly1305_keysched *chacha20_schedule;\n    unsigned int keysize; /* bytes of key used. != keylen */\n    size_t tag_size; /* overhead required for tag */\n    /* Counters for rekeying initialization */\n    uint32_t packets;\n    uint64_t blocks;\n    /* Rekeying limit for the cipher or manually enforced */\n    uint64_t max_blocks;\n    /* sets the new key for immediate use */\n    int (*set_encrypt_key)(struct ssh_cipher_struct *cipher, void *key, void *IV);\n    int (*set_decrypt_key)(struct ssh_cipher_struct *cipher, void *key, void *IV);\n    void (*encrypt)(struct ssh_cipher_struct *cipher,\n                    void *in,\n                    void *out,\n                    size_t len);\n    void (*decrypt)(struct ssh_cipher_struct *cipher,\n                    void *in,\n                    void *out,\n                    size_t len);\n    void (*aead_encrypt)(struct ssh_cipher_struct *cipher, void *in, void *out,\n        size_t len, uint8_t *mac, uint64_t seq);\n    int (*aead_decrypt_length)(struct ssh_cipher_struct *cipher, void *in,\n        uint8_t *out, size_t len, uint64_t seq);\n    int (*aead_decrypt)(struct ssh_cipher_struct *cipher, void *complete_packet, uint8_t *out,\n        size_t encrypted_size, uint64_t seq);\n    void (*cleanup)(struct ssh_cipher_struct *cipher);\n};\n\nconst struct ssh_cipher_struct *ssh_get_chacha20poly1305_cipher(void);\nint sshkdf_derive_key(struct ssh_crypto_struct *crypto,\n                      unsigned char *key, size_t key_len,\n                      int key_type, unsigned char *output,\n                      size_t requested_len);\n\n#endif /* _CRYPTO_H_ */\n"
  },
  {
    "path": "src/libssh/include/libssh/curve25519.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2013 by Aris Adamantiadis <aris@badcode.be>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation,\n * version 2.1 of the License.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef CURVE25519_H_\n#define CURVE25519_H_\n\n#include \"config.h\"\n#include \"libssh.h\"\n\n#ifdef WITH_NACL\n\n#include <nacl/crypto_scalarmult_curve25519.h>\n#define CURVE25519_PUBKEY_SIZE crypto_scalarmult_curve25519_BYTES\n#define CURVE25519_PRIVKEY_SIZE crypto_scalarmult_curve25519_SCALARBYTES\n#define crypto_scalarmult_base crypto_scalarmult_curve25519_base\n#define crypto_scalarmult crypto_scalarmult_curve25519\n#else\n\n#define CURVE25519_PUBKEY_SIZE 32\n#define CURVE25519_PRIVKEY_SIZE 32\nint crypto_scalarmult_base(unsigned char *q, const unsigned char *n);\nint crypto_scalarmult(unsigned char *q, const unsigned char *n, const unsigned char *p);\n#endif /* WITH_NACL */\n\n#ifdef HAVE_ECC\n#define HAVE_CURVE25519 1\n#endif\n\ntypedef unsigned char ssh_curve25519_pubkey[CURVE25519_PUBKEY_SIZE];\ntypedef unsigned char ssh_curve25519_privkey[CURVE25519_PRIVKEY_SIZE];\n\n\nint ssh_client_curve25519_init(ssh_session session);\n\n#ifdef WITH_SERVER\nvoid ssh_server_curve25519_init(ssh_session session);\n#endif /* WITH_SERVER */\n\n#endif /* CURVE25519_H_ */\n"
  },
  {
    "path": "src/libssh/include/libssh/dh-gex.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2016 by Aris Adamantiadis <aris@0xbadc0de.be>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n\n#ifndef SRC_DH_GEX_H_\n#define SRC_DH_GEX_H_\n\nint ssh_client_dhgex_init(ssh_session session);\n\n#ifdef WITH_SERVER\nvoid ssh_server_dhgex_init(ssh_session session);\n#endif /* WITH_SERVER */\n\n#endif /* SRC_DH_GEX_H_ */\n"
  },
  {
    "path": "src/libssh/include/libssh/dh.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2009 by Aris Adamantiadis\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef DH_H_\n#define DH_H_\n\n#include \"config.h\"\n\n#include \"libssh/crypto.h\"\n\nstruct dh_ctx;\n\n#define DH_CLIENT_KEYPAIR 0\n#define DH_SERVER_KEYPAIR 1\n\n/* functions implemented by crypto backends */\nint ssh_dh_init_common(struct ssh_crypto_struct *crypto);\nvoid ssh_dh_cleanup(struct ssh_crypto_struct *crypto);\n\nint ssh_dh_get_parameters(struct dh_ctx *ctx,\n                          const_bignum *modulus, const_bignum *generator);\nint ssh_dh_set_parameters(struct dh_ctx *ctx,\n                          const bignum modulus, const bignum generator);\n\nint ssh_dh_keypair_gen_keys(struct dh_ctx *ctx, int peer);\nint ssh_dh_keypair_get_keys(struct dh_ctx *ctx, int peer,\n                            const_bignum *priv, const_bignum *pub);\nint ssh_dh_keypair_set_keys(struct dh_ctx *ctx, int peer,\n                            const bignum priv, const bignum pub);\n\nint ssh_dh_compute_shared_secret(struct dh_ctx *ctx, int local, int remote,\n                                 bignum *dest);\n\nvoid ssh_dh_debug_crypto(struct ssh_crypto_struct *c);\n\n/* common functions */\nint ssh_dh_init(void);\nvoid ssh_dh_finalize(void);\n\nint ssh_dh_import_next_pubkey_blob(ssh_session session,\n                                   ssh_string pubkey_blob);\n\nssh_key ssh_dh_get_current_server_publickey(ssh_session session);\nint ssh_dh_get_current_server_publickey_blob(ssh_session session,\n                                             ssh_string *pubkey_blob);\nssh_key ssh_dh_get_next_server_publickey(ssh_session session);\nint ssh_dh_get_next_server_publickey_blob(ssh_session session,\n                                          ssh_string *pubkey_blob);\n\nint ssh_client_dh_init(ssh_session session);\n#ifdef WITH_SERVER\nvoid ssh_server_dh_init(ssh_session session);\n#endif /* WITH_SERVER */\nint ssh_server_dh_process_init(ssh_session session, ssh_buffer packet);\nint ssh_fallback_group(uint32_t pmax, bignum *p, bignum *g);\nbool ssh_dh_is_known_group(bignum modulus, bignum generator);\n\n#endif /* DH_H_ */\n"
  },
  {
    "path": "src/libssh/include/libssh/ecdh.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2011 by Aris Adamantiadis\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef ECDH_H_\n#define ECDH_H_\n\n#include \"config.h\"\n#include \"libssh/callbacks.h\"\n\n#ifdef HAVE_LIBCRYPTO\n#ifdef HAVE_OPENSSL_ECDH_H\n\n#ifdef HAVE_ECC\n#define HAVE_ECDH 1\n#endif\n\n#endif /* HAVE_OPENSSL_ECDH_H */\n#endif /* HAVE_LIBCRYPTO */\n\n#ifdef HAVE_GCRYPT_ECC\n#define HAVE_ECDH 1\n#endif\n\n#ifdef HAVE_LIBMBEDCRYPTO\n#define HAVE_ECDH 1\n#endif\n\nextern struct ssh_packet_callbacks_struct ssh_ecdh_client_callbacks;\n/* Backend-specific functions.  */\nint ssh_client_ecdh_init(ssh_session session);\nint ecdh_build_k(ssh_session session);\n\n#ifdef WITH_SERVER\nextern struct ssh_packet_callbacks_struct ssh_ecdh_server_callbacks;\nvoid ssh_server_ecdh_init(ssh_session session);\nSSH_PACKET_CALLBACK(ssh_packet_server_ecdh_init);\n#endif /* WITH_SERVER */\n\n#endif /* ECDH_H_ */\n"
  },
  {
    "path": "src/libssh/include/libssh/ed25519.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2014 by Aris Adamantiadis\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef ED25519_H_\n#define ED25519_H_\n#include \"libssh/priv.h\"\n\n/**\n * @defgroup ed25519 ed25519 API\n * @internal\n * @brief API for DJB's ed25519\n *\n * @{ */\n\n#define ED25519_PK_LEN 32\n#define ED25519_SK_LEN 64\n#define ED25519_SIG_LEN 64\n\ntypedef uint8_t ed25519_pubkey[ED25519_PK_LEN];\ntypedef uint8_t ed25519_privkey[ED25519_SK_LEN];\ntypedef uint8_t ed25519_signature[ED25519_SIG_LEN];\n\n/** @internal\n * @brief generate an ed25519 key pair\n * @param[out] pk generated public key\n * @param[out] sk generated secret key\n * @return     0 on success, -1 on error.\n * */\nint crypto_sign_ed25519_keypair(ed25519_pubkey pk, ed25519_privkey sk);\n\n/** @internal\n * @brief sign a message with ed25519\n * @param[out] sm location to store the signed message.\n *                Its length should be mlen + 64.\n * @param[out] smlen pointer to the size of the signed message\n * @param[in] m message to be signed\n * @param[in] mlen length of the message to be signed\n * @param[in] sk secret key to sign the message with\n * @return    0 on success.\n */\nint crypto_sign_ed25519(\n    unsigned char *sm, uint64_t *smlen,\n    const unsigned char *m, uint64_t mlen,\n    const ed25519_privkey sk);\n\n/** @internal\n * @brief \"open\" and verify the signature of a signed message\n * @param[out] m location to store the verified message.\n *               Its length should be equal to smlen.\n * @param[out] mlen pointer to the size of the verified message\n * @param[in] sm signed message to verify\n * @param[in] smlen length of the signed message to verify\n * @param[in] pk public key used to sign the message\n * @returns   0 on success (supposedly).\n */\nint crypto_sign_ed25519_open(\n    unsigned char *m, uint64_t *mlen,\n    const unsigned char *sm, uint64_t smlen,\n    const ed25519_pubkey pk);\n\n/** @} */\n#endif /* ED25519_H_ */\n"
  },
  {
    "path": "src/libssh/include/libssh/fe25519.h",
    "content": "/* $OpenBSD: fe25519.h,v 1.3 2013/12/09 11:03:45 markus Exp $ */\n\n/*\n * Public Domain, Authors: Daniel J. Bernstein, Niels Duif, Tanja Lange,\n * Peter Schwabe, Bo-Yin Yang.\n * Copied from supercop-20130419/crypto_sign/ed25519/ref/fe25519.h\n */\n\n#ifndef FE25519_H\n#define FE25519_H\n\n#include \"libssh/priv.h\"\n\n#define fe25519              crypto_sign_ed25519_ref_fe25519\n#define fe25519_freeze       crypto_sign_ed25519_ref_fe25519_freeze\n#define fe25519_unpack       crypto_sign_ed25519_ref_fe25519_unpack\n#define fe25519_pack         crypto_sign_ed25519_ref_fe25519_pack\n#define fe25519_iszero       crypto_sign_ed25519_ref_fe25519_iszero\n#define fe25519_iseq_vartime crypto_sign_ed25519_ref_fe25519_iseq_vartime\n#define fe25519_cmov         crypto_sign_ed25519_ref_fe25519_cmov\n#define fe25519_setone       crypto_sign_ed25519_ref_fe25519_setone\n#define fe25519_setzero      crypto_sign_ed25519_ref_fe25519_setzero\n#define fe25519_neg          crypto_sign_ed25519_ref_fe25519_neg\n#define fe25519_getparity    crypto_sign_ed25519_ref_fe25519_getparity\n#define fe25519_add          crypto_sign_ed25519_ref_fe25519_add\n#define fe25519_sub          crypto_sign_ed25519_ref_fe25519_sub\n#define fe25519_mul          crypto_sign_ed25519_ref_fe25519_mul\n#define fe25519_square       crypto_sign_ed25519_ref_fe25519_square\n#define fe25519_invert       crypto_sign_ed25519_ref_fe25519_invert\n#define fe25519_pow2523      crypto_sign_ed25519_ref_fe25519_pow2523\n\ntypedef struct {\n  uint32_t v[32];\n} fe25519;\n\nvoid fe25519_freeze(fe25519 *r);\n\nvoid fe25519_unpack(fe25519 *r, const unsigned char x[32]);\n\nvoid fe25519_pack(unsigned char r[32], const fe25519 *x);\n\nuint32_t fe25519_iszero(const fe25519 *x);\n\nint fe25519_iseq_vartime(const fe25519 *x, const fe25519 *y);\n\nvoid fe25519_cmov(fe25519 *r, const fe25519 *x, unsigned char b);\n\nvoid fe25519_setone(fe25519 *r);\n\nvoid fe25519_setzero(fe25519 *r);\n\nvoid fe25519_neg(fe25519 *r, const fe25519 *x);\n\nunsigned char fe25519_getparity(const fe25519 *x);\n\nvoid fe25519_add(fe25519 *r, const fe25519 *x, const fe25519 *y);\n\nvoid fe25519_sub(fe25519 *r, const fe25519 *x, const fe25519 *y);\n\nvoid fe25519_mul(fe25519 *r, const fe25519 *x, const fe25519 *y);\n\nvoid fe25519_square(fe25519 *r, const fe25519 *x);\n\nvoid fe25519_invert(fe25519 *r, const fe25519 *x);\n\nvoid fe25519_pow2523(fe25519 *r, const fe25519 *x);\n\n#endif\n"
  },
  {
    "path": "src/libssh/include/libssh/ge25519.h",
    "content": "/* $OpenBSD: ge25519.h,v 1.3 2013/12/09 11:03:45 markus Exp $ */\n\n/*\n * Public Domain, Authors: Daniel J. Bernstein, Niels Duif, Tanja Lange,\n * Peter Schwabe, Bo-Yin Yang.\n * Copied from supercop-20130419/crypto_sign/ed25519/ref/ge25519.h\n */\n\n#ifndef GE25519_H\n#define GE25519_H\n\n#include \"fe25519.h\"\n#include \"sc25519.h\"\n\n#define ge25519                           crypto_sign_ed25519_ref_ge25519\n#define ge25519_base                      crypto_sign_ed25519_ref_ge25519_base\n#define ge25519_unpackneg_vartime         crypto_sign_ed25519_ref_unpackneg_vartime\n#define ge25519_pack                      crypto_sign_ed25519_ref_pack\n#define ge25519_isneutral_vartime         crypto_sign_ed25519_ref_isneutral_vartime\n#define ge25519_double_scalarmult_vartime crypto_sign_ed25519_ref_double_scalarmult_vartime\n#define ge25519_scalarmult_base           crypto_sign_ed25519_ref_scalarmult_base\n\ntypedef struct\n{\n  fe25519 x;\n  fe25519 y;\n  fe25519 z;\n  fe25519 t;\n} ge25519;\n\nextern const ge25519 ge25519_base;\n\nint ge25519_unpackneg_vartime(ge25519 *r, const unsigned char p[32]);\n\nvoid ge25519_pack(unsigned char r[32], const ge25519 *p);\n\nint ge25519_isneutral_vartime(const ge25519 *p);\n\nvoid ge25519_double_scalarmult_vartime(ge25519 *r, const ge25519 *p1, const sc25519 *s1, const ge25519 *p2, const sc25519 *s2);\n\nvoid ge25519_scalarmult_base(ge25519 *r, const sc25519 *s);\n\n#endif\n"
  },
  {
    "path": "src/libssh/include/libssh/gssapi.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2013 by Aris Adamantiadis\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef GSSAPI_H_\n#define GSSAPI_H_\n\n#include \"config.h\"\n#include \"session.h\"\n\n/* all OID begin with the tag identifier + length */\n#define SSH_OID_TAG 06\n\ntypedef struct ssh_gssapi_struct *ssh_gssapi;\n\n#ifdef WITH_SERVER\nint ssh_gssapi_handle_userauth(ssh_session session, const char *user, uint32_t n_oid, ssh_string *oids);\nSSH_PACKET_CALLBACK(ssh_packet_userauth_gssapi_token_server);\nSSH_PACKET_CALLBACK(ssh_packet_userauth_gssapi_mic);\n#endif /* WITH_SERVER */\n\nSSH_PACKET_CALLBACK(ssh_packet_userauth_gssapi_token);\nSSH_PACKET_CALLBACK(ssh_packet_userauth_gssapi_token_client);\nSSH_PACKET_CALLBACK(ssh_packet_userauth_gssapi_response);\n\n\nint ssh_gssapi_auth_mic(ssh_session session);\n\n#endif /* GSSAPI_H */\n"
  },
  {
    "path": "src/libssh/include/libssh/kex.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2009 by Aris Adamantiadis\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef KEX_H_\n#define KEX_H_\n\n#include \"libssh/priv.h\"\n#include \"libssh/callbacks.h\"\n\n#define SSH_KEX_METHODS 10\n\nstruct ssh_kex_struct {\n    unsigned char cookie[16];\n    char *methods[SSH_KEX_METHODS];\n};\n\nSSH_PACKET_CALLBACK(ssh_packet_kexinit);\n\nint ssh_send_kex(ssh_session session, int server_kex);\nvoid ssh_list_kex(struct ssh_kex_struct *kex);\nint ssh_set_client_kex(ssh_session session);\nint ssh_kex_select_methods(ssh_session session);\nint ssh_verify_existing_algo(enum ssh_kex_types_e algo, const char *name);\nchar *ssh_keep_known_algos(enum ssh_kex_types_e algo, const char *list);\nchar *ssh_keep_fips_algos(enum ssh_kex_types_e algo, const char *list);\nchar **ssh_space_tokenize(const char *chain);\nint ssh_get_kex1(ssh_session session);\nchar *ssh_find_matching(const char *in_d, const char *what_d);\nconst char *ssh_kex_get_supported_method(uint32_t algo);\nconst char *ssh_kex_get_default_methods(uint32_t algo);\nconst char *ssh_kex_get_fips_methods(uint32_t algo);\nconst char *ssh_kex_get_description(uint32_t algo);\nchar *ssh_client_select_hostkeys(ssh_session session);\nint ssh_send_rekex(ssh_session session);\nint server_set_kex(ssh_session session);\nint ssh_make_sessionid(ssh_session session);\n/* add data for the final cookie */\nint ssh_hashbufin_add_cookie(ssh_session session, unsigned char *cookie);\nint ssh_hashbufout_add_cookie(ssh_session session);\nint ssh_generate_session_keys(ssh_session session);\n\n#endif /* KEX_H_ */\n"
  },
  {
    "path": "src/libssh/include/libssh/keys.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2009 by Aris Adamantiadis\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef KEYS_H_\n#define KEYS_H_\n\n#include \"config.h\"\n#include \"libssh/libssh.h\"\n#include \"libssh/wrapper.h\"\n\nstruct ssh_public_key_struct {\n    int type;\n    const char *type_c; /* Don't free it ! it is static */\n#if defined(HAVE_LIBGCRYPT)\n    gcry_sexp_t dsa_pub;\n    gcry_sexp_t rsa_pub;\n#elif defined(HAVE_LIBCRYPTO)\n    DSA *dsa_pub;\n    RSA *rsa_pub;\n#elif defined(HAVE_LIBMBEDCRYPTO)\n    mbedtls_pk_context *rsa_pub;\n    void *dsa_pub;\n#endif\n};\n\nstruct ssh_private_key_struct {\n    int type;\n#if defined(HAVE_LIBGCRYPT)\n    gcry_sexp_t dsa_priv;\n    gcry_sexp_t rsa_priv;\n#elif defined(HAVE_LIBCRYPTO)\n    DSA *dsa_priv;\n    RSA *rsa_priv;\n#elif defined(HAVE_LIBMBEDCRYPTO)\n    mbedtls_pk_context *rsa_priv;\n    void *dsa_priv;\n#endif\n};\n\nconst char *ssh_type_to_char(int type);\nint ssh_type_from_name(const char *name);\n\nssh_public_key publickey_from_string(ssh_session session, ssh_string pubkey_s);\n\n#endif /* KEYS_H_ */\n"
  },
  {
    "path": "src/libssh/include/libssh/knownhosts.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 20014 by Aris Adamantiadis <aris@badcode.be>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n\n#ifndef SSH_KNOWNHOSTS_H_\n#define SSH_KNOWNHOSTS_H_\n\nstruct ssh_list *ssh_known_hosts_get_algorithms(ssh_session session);\nchar *ssh_known_hosts_get_algorithms_names(ssh_session session);\nenum ssh_known_hosts_e\nssh_session_get_known_hosts_entry_file(ssh_session session,\n                                       const char *filename,\n                                       struct ssh_knownhosts_entry **pentry);\n\n#endif /* SSH_KNOWNHOSTS_H_ */\n"
  },
  {
    "path": "src/libssh/include/libssh/legacy.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2010 by Aris Adamantiadis\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/* Since libssh.h includes legacy.h, it's important that libssh.h is included\n * first. we don't define LEGACY_H now because we want it to be defined when\n * included from libssh.h\n * All function calls declared in this header are deprecated and meant to be\n * removed in future.\n */\n\n#ifndef LEGACY_H_\n#define LEGACY_H_\n\ntypedef struct ssh_private_key_struct* ssh_private_key;\ntypedef struct ssh_public_key_struct* ssh_public_key;\n\nLIBSSH_API int ssh_auth_list(ssh_session session);\nLIBSSH_API int ssh_userauth_offer_pubkey(ssh_session session, const char *username, int type, ssh_string publickey);\nLIBSSH_API int ssh_userauth_pubkey(ssh_session session, const char *username, ssh_string publickey, ssh_private_key privatekey);\nLIBSSH_API int ssh_userauth_agent_pubkey(ssh_session session, const char *username,\n    ssh_public_key publickey);\nLIBSSH_API int ssh_userauth_autopubkey(ssh_session session, const char *passphrase);\nLIBSSH_API int ssh_userauth_privatekey_file(ssh_session session, const char *username,\n    const char *filename, const char *passphrase);\n\nSSH_DEPRECATED LIBSSH_API void buffer_free(ssh_buffer buffer);\nSSH_DEPRECATED LIBSSH_API void *buffer_get(ssh_buffer buffer);\nSSH_DEPRECATED LIBSSH_API uint32_t buffer_get_len(ssh_buffer buffer);\nSSH_DEPRECATED LIBSSH_API ssh_buffer buffer_new(void);\n\nSSH_DEPRECATED LIBSSH_API ssh_channel channel_accept_x11(ssh_channel channel, int timeout_ms);\nSSH_DEPRECATED LIBSSH_API int channel_change_pty_size(ssh_channel channel,int cols,int rows);\nSSH_DEPRECATED LIBSSH_API ssh_channel channel_forward_accept(ssh_session session, int timeout_ms);\nSSH_DEPRECATED LIBSSH_API int channel_close(ssh_channel channel);\nSSH_DEPRECATED LIBSSH_API int channel_forward_cancel(ssh_session session, const char *address, int port);\nSSH_DEPRECATED LIBSSH_API int channel_forward_listen(ssh_session session, const char *address, int port, int *bound_port);\nSSH_DEPRECATED LIBSSH_API void channel_free(ssh_channel channel);\nSSH_DEPRECATED LIBSSH_API int channel_get_exit_status(ssh_channel channel);\nSSH_DEPRECATED LIBSSH_API ssh_session channel_get_session(ssh_channel channel);\nSSH_DEPRECATED LIBSSH_API int channel_is_closed(ssh_channel channel);\nSSH_DEPRECATED LIBSSH_API int channel_is_eof(ssh_channel channel);\nSSH_DEPRECATED LIBSSH_API int channel_is_open(ssh_channel channel);\nSSH_DEPRECATED LIBSSH_API ssh_channel channel_new(ssh_session session);\nSSH_DEPRECATED LIBSSH_API int channel_open_forward(ssh_channel channel, const char *remotehost,\n    int remoteport, const char *sourcehost, int localport);\nSSH_DEPRECATED LIBSSH_API int channel_open_session(ssh_channel channel);\nSSH_DEPRECATED LIBSSH_API int channel_poll(ssh_channel channel, int is_stderr);\nSSH_DEPRECATED LIBSSH_API int channel_read(ssh_channel channel, void *dest, uint32_t count, int is_stderr);\n\nSSH_DEPRECATED LIBSSH_API int channel_read_buffer(ssh_channel channel, ssh_buffer buffer, uint32_t count,\n    int is_stderr);\n\nSSH_DEPRECATED LIBSSH_API int channel_read_nonblocking(ssh_channel channel, void *dest, uint32_t count,\n    int is_stderr);\nSSH_DEPRECATED LIBSSH_API int channel_request_env(ssh_channel channel, const char *name, const char *value);\nSSH_DEPRECATED LIBSSH_API int channel_request_exec(ssh_channel channel, const char *cmd);\nSSH_DEPRECATED LIBSSH_API int channel_request_pty(ssh_channel channel);\nSSH_DEPRECATED LIBSSH_API int channel_request_pty_size(ssh_channel channel, const char *term,\n    int cols, int rows);\nSSH_DEPRECATED LIBSSH_API int channel_request_shell(ssh_channel channel);\nSSH_DEPRECATED LIBSSH_API int channel_request_send_signal(ssh_channel channel, const char *signum);\nSSH_DEPRECATED LIBSSH_API int channel_request_sftp(ssh_channel channel);\nSSH_DEPRECATED LIBSSH_API int channel_request_subsystem(ssh_channel channel, const char *subsystem);\nSSH_DEPRECATED LIBSSH_API int channel_request_x11(ssh_channel channel, int single_connection, const char *protocol,\n    const char *cookie, int screen_number);\nSSH_DEPRECATED LIBSSH_API int channel_send_eof(ssh_channel channel);\nSSH_DEPRECATED LIBSSH_API int channel_select(ssh_channel *readchans, ssh_channel *writechans, ssh_channel *exceptchans, struct\n        timeval * timeout);\nSSH_DEPRECATED LIBSSH_API void channel_set_blocking(ssh_channel channel, int blocking);\nSSH_DEPRECATED LIBSSH_API int channel_write(ssh_channel channel, const void *data, uint32_t len);\n\nLIBSSH_API void privatekey_free(ssh_private_key prv);\nLIBSSH_API ssh_private_key privatekey_from_file(ssh_session session, const char *filename,\n    int type, const char *passphrase);\nLIBSSH_API void publickey_free(ssh_public_key key);\nLIBSSH_API int ssh_publickey_to_file(ssh_session session, const char *file,\n    ssh_string pubkey, int type);\nLIBSSH_API ssh_string publickey_from_file(ssh_session session, const char *filename,\n    int *type);\nLIBSSH_API ssh_public_key publickey_from_privatekey(ssh_private_key prv);\nLIBSSH_API ssh_string publickey_to_string(ssh_public_key key);\nLIBSSH_API int ssh_try_publickey_from_file(ssh_session session, const char *keyfile,\n    ssh_string *publickey, int *type);\nLIBSSH_API enum ssh_keytypes_e ssh_privatekey_type(ssh_private_key privatekey);\n\nLIBSSH_API ssh_string ssh_get_pubkey(ssh_session session);\n\nLIBSSH_API ssh_message ssh_message_retrieve(ssh_session session, uint32_t packettype);\nLIBSSH_API ssh_public_key ssh_message_auth_publickey(ssh_message msg);\n\nSSH_DEPRECATED LIBSSH_API void string_burn(ssh_string str);\nSSH_DEPRECATED LIBSSH_API ssh_string string_copy(ssh_string str);\nSSH_DEPRECATED LIBSSH_API void *string_data(ssh_string str);\nSSH_DEPRECATED LIBSSH_API int string_fill(ssh_string str, const void *data, size_t len);\nSSH_DEPRECATED LIBSSH_API void string_free(ssh_string str);\nSSH_DEPRECATED LIBSSH_API ssh_string string_from_char(const char *what);\nSSH_DEPRECATED LIBSSH_API size_t string_len(ssh_string str);\nSSH_DEPRECATED LIBSSH_API ssh_string string_new(size_t size);\nSSH_DEPRECATED LIBSSH_API char *string_to_char(ssh_string str);\n\n#endif /* LEGACY_H_ */\n"
  },
  {
    "path": "src/libssh/include/libssh/libcrypto.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2009 by Aris Adamantiadis\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef LIBCRYPTO_H_\n#define LIBCRYPTO_H_\n\n#include \"config.h\"\n\n#ifdef HAVE_LIBCRYPTO\n\n#include <openssl/dsa.h>\n#include <openssl/rsa.h>\n#include <openssl/sha.h>\n#include <openssl/md5.h>\n#include <openssl/hmac.h>\n#include <openssl/evp.h>\n#include <openssl/crypto.h>\n\ntypedef EVP_MD_CTX* SHACTX;\ntypedef EVP_MD_CTX* SHA256CTX;\ntypedef EVP_MD_CTX* SHA384CTX;\ntypedef EVP_MD_CTX* SHA512CTX;\ntypedef EVP_MD_CTX* MD5CTX;\ntypedef HMAC_CTX* HMACCTX;\n#ifdef HAVE_ECC\ntypedef EVP_MD_CTX *EVPCTX;\n#else\ntypedef void *EVPCTX;\n#endif\n\n#define SHA_DIGEST_LEN SHA_DIGEST_LENGTH\n#define SHA256_DIGEST_LEN SHA256_DIGEST_LENGTH\n#define SHA384_DIGEST_LEN SHA384_DIGEST_LENGTH\n#define SHA512_DIGEST_LEN SHA512_DIGEST_LENGTH\n#ifdef MD5_DIGEST_LEN\n    #undef MD5_DIGEST_LEN\n#endif\n#define MD5_DIGEST_LEN MD5_DIGEST_LENGTH\n\n#ifdef HAVE_OPENSSL_ECC\n#define EVP_DIGEST_LEN EVP_MAX_MD_SIZE\n#endif\n\n#include <openssl/bn.h>\n#include <openssl/opensslv.h>\n#define OPENSSL_0_9_7b 0x0090702fL\n#if (OPENSSL_VERSION_NUMBER <= OPENSSL_0_9_7b)\n#define BROKEN_AES_CTR\n#endif\ntypedef BIGNUM*  bignum;\ntypedef const BIGNUM* const_bignum;\ntypedef BN_CTX* bignum_CTX;\n\n#define bignum_new() BN_new()\n#define bignum_safe_free(num) do { \\\n    if ((num) != NULL) { \\\n        BN_clear_free((num)); \\\n        (num)=NULL; \\\n    } \\\n    } while(0)\n#define bignum_set_word(bn,n) BN_set_word(bn,n)\n#define bignum_bin2bn(data, datalen, dest)   \\\n    do {                                     \\\n        (*dest) = BN_new();                  \\\n        if ((*dest) != NULL) {               \\\n            BN_bin2bn(data,datalen,(*dest)); \\\n        }                                    \\\n    } while(0)\n#define bignum_bn2dec(num) BN_bn2dec(num)\n#define bignum_dec2bn(data, bn) BN_dec2bn(bn, data)\n#define bignum_hex2bn(data, bn) BN_hex2bn(bn, data)\n#define bignum_bn2hex(num, dest) (*dest)=(unsigned char *)BN_bn2hex(num)\n#define bignum_rand(rnd, bits) BN_rand(rnd, bits, 0, 1)\n#define bignum_rand_range(rnd, max) BN_rand_range(rnd, max)\n#define bignum_ctx_new() BN_CTX_new()\n#define bignum_ctx_free(num) BN_CTX_free(num)\n#define bignum_ctx_invalid(ctx) ((ctx) == NULL)\n#define bignum_mod_exp(dest,generator,exp,modulo,ctx) BN_mod_exp(dest,generator,exp,modulo,ctx)\n#define bignum_add(dest, a, b) BN_add(dest, a, b)\n#define bignum_sub(dest, a, b) BN_sub(dest, a, b)\n#define bignum_mod(dest, a, b, ctx) BN_mod(dest, a, b, ctx)\n#define bignum_num_bytes(num) (size_t)BN_num_bytes(num)\n#define bignum_num_bits(num) (size_t)BN_num_bits(num)\n#define bignum_is_bit_set(num,bit) BN_is_bit_set(num, (int)bit)\n#define bignum_bn2bin(num,len, ptr) BN_bn2bin(num, ptr)\n#define bignum_cmp(num1,num2) BN_cmp(num1,num2)\n#define bignum_rshift1(dest, src) BN_rshift1(dest, src)\n#define bignum_dup(orig, dest) do { \\\n        if (*(dest) == NULL) { \\\n            *(dest) = BN_dup(orig); \\\n        } else { \\\n            BN_copy(*(dest), orig); \\\n        } \\\n    } while(0)\n\n\n/* Returns true if the OpenSSL is operating in FIPS mode */\n#ifdef HAVE_OPENSSL_FIPS_MODE\n#define ssh_fips_mode() (FIPS_mode() != 0)\n#else\n#define ssh_fips_mode() false\n#endif\n\n#endif /* HAVE_LIBCRYPTO */\n\n#endif /* LIBCRYPTO_H_ */\n"
  },
  {
    "path": "src/libssh/include/libssh/libgcrypt.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2009 by Aris Adamantiadis\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef LIBGCRYPT_H_\n#define LIBGCRYPT_H_\n\n#include \"config.h\"\n\n#ifdef HAVE_LIBGCRYPT\n\n#include <gcrypt.h>\ntypedef gcry_md_hd_t SHACTX;\ntypedef gcry_md_hd_t SHA256CTX;\ntypedef gcry_md_hd_t SHA384CTX;\ntypedef gcry_md_hd_t SHA512CTX;\ntypedef gcry_md_hd_t MD5CTX;\ntypedef gcry_md_hd_t HMACCTX;\ntypedef gcry_md_hd_t EVPCTX;\n#define SHA_DIGEST_LENGTH 20\n#define SHA_DIGEST_LEN SHA_DIGEST_LENGTH\n#define MD5_DIGEST_LEN 16\n#define SHA256_DIGEST_LENGTH 32\n#define SHA256_DIGEST_LEN SHA256_DIGEST_LENGTH\n#define SHA384_DIGEST_LENGTH 48\n#define SHA384_DIGEST_LEN SHA384_DIGEST_LENGTH\n#define SHA512_DIGEST_LENGTH 64\n#define SHA512_DIGEST_LEN SHA512_DIGEST_LENGTH\n\n#ifndef EVP_MAX_MD_SIZE\n#define EVP_MAX_MD_SIZE 64\n#endif\n\n#define EVP_DIGEST_LEN EVP_MAX_MD_SIZE\n\ntypedef gcry_mpi_t bignum;\ntypedef const struct gcry_mpi *const_bignum;\ntypedef void* bignum_CTX;\n\n/* Constants for curves.  */\n#define NID_gcrypt_nistp256 0\n#define NID_gcrypt_nistp384 1\n#define NID_gcrypt_nistp521 2\n\n/* missing gcrypt functions */\nint ssh_gcry_dec2bn(bignum *bn, const char *data);\nchar *ssh_gcry_bn2dec(bignum bn);\nint ssh_gcry_rand_range(bignum rnd, bignum max);\n\n#define bignum_new() gcry_mpi_new(0)\n#define bignum_safe_free(num) do { \\\n    if ((num) != NULL) { \\\n        gcry_mpi_release((num)); \\\n        (num)=NULL; \\\n    } \\\n    } while (0)\n#define bignum_free(num) gcry_mpi_release(num)\n#define bignum_ctx_new() NULL\n#define bignum_ctx_free(ctx) do {(ctx) = NULL;} while(0)\n#define bignum_ctx_invalid(ctx) (ctx != NULL)\n#define bignum_set_word(bn,n) (gcry_mpi_set_ui(bn,n)!=NULL ? 1 : 0)\n#define bignum_bin2bn(data,datalen,dest) gcry_mpi_scan(dest,GCRYMPI_FMT_USG,data,datalen,NULL)\n#define bignum_bn2dec(num) ssh_gcry_bn2dec(num)\n#define bignum_dec2bn(num, data) ssh_gcry_dec2bn(data, num)\n\n#define bignum_bn2hex(num, data) \\\n    gcry_mpi_aprint(GCRYMPI_FMT_HEX, data, NULL, (const gcry_mpi_t)num)\n\n#define bignum_hex2bn(data, num) (gcry_mpi_scan(num,GCRYMPI_FMT_HEX,data,0,NULL)==0?1:0)\n#define bignum_rand(num,bits) 1,gcry_mpi_randomize(num,bits,GCRY_STRONG_RANDOM),gcry_mpi_set_bit(num,bits-1),gcry_mpi_set_bit(num,0)\n#define bignum_mod_exp(dest,generator,exp,modulo, ctx) 1,gcry_mpi_powm(dest,generator,exp,modulo)\n#define bignum_num_bits(num) gcry_mpi_get_nbits(num)\n#define bignum_num_bytes(num) ((gcry_mpi_get_nbits(num)+7)/8)\n#define bignum_is_bit_set(num,bit) gcry_mpi_test_bit(num,bit)\n#define bignum_bn2bin(num,datalen,data) gcry_mpi_print(GCRYMPI_FMT_USG,data,datalen,NULL,num)\n#define bignum_cmp(num1,num2) gcry_mpi_cmp(num1,num2)\n#define bignum_rshift1(dest, src) gcry_mpi_rshift (dest, src, 1)\n#define bignum_add(dst, a, b) gcry_mpi_add(dst, a, b)\n#define bignum_sub(dst, a, b) gcry_mpi_sub(dst, a, b)\n#define bignum_mod(dst, a, b, ctx) 1,gcry_mpi_mod(dst, a, b)\n#define bignum_rand_range(rnd, max) ssh_gcry_rand_range(rnd, max);\n#define bignum_dup(orig, dest) do { \\\n        if (*(dest) == NULL) { \\\n            *(dest) = gcry_mpi_copy(orig); \\\n        } else { \\\n            gcry_mpi_set(*(dest), orig); \\\n        } \\\n    } while(0)\n/* Helper functions for data conversions.  */\n\n/* Extract an MPI from the given s-expression SEXP named NAME which is\n   encoded using INFORMAT and store it in a newly allocated ssh_string\n   encoded using OUTFORMAT.  */\nssh_string ssh_sexp_extract_mpi(const gcry_sexp_t sexp,\n                                const char *name,\n                                enum gcry_mpi_format informat,\n                                enum gcry_mpi_format outformat);\n\n#define ssh_fips_mode() false\n\n#endif /* HAVE_LIBGCRYPT */\n\n#endif /* LIBGCRYPT_H_ */\n"
  },
  {
    "path": "src/libssh/include/libssh/libmbedcrypto.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2017 Sartura d.o.o.\n *\n * Author: Juraj Vijtiuk <juraj.vijtiuk@sartura.hr>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#ifndef LIBMBEDCRYPTO_H_\n#define LIBMBEDCRYPTO_H_\n\n#include \"config.h\"\n\n#ifdef HAVE_LIBMBEDCRYPTO\n\n#include <mbedtls/md.h>\n#include <mbedtls/bignum.h>\n#include <mbedtls/pk.h>\n#include <mbedtls/cipher.h>\n#include <mbedtls/entropy.h>\n#include <mbedtls/ctr_drbg.h>\n\ntypedef mbedtls_md_context_t *SHACTX;\ntypedef mbedtls_md_context_t *SHA256CTX;\ntypedef mbedtls_md_context_t *SHA384CTX;\ntypedef mbedtls_md_context_t *SHA512CTX;\ntypedef mbedtls_md_context_t *MD5CTX;\ntypedef mbedtls_md_context_t *HMACCTX;\ntypedef mbedtls_md_context_t *EVPCTX;\n\n#define SHA_DIGEST_LENGTH 20\n#define SHA_DIGEST_LEN SHA_DIGEST_LENGTH\n#define MD5_DIGEST_LEN 16\n#define SHA256_DIGEST_LENGTH 32\n#define SHA256_DIGEST_LEN SHA256_DIGEST_LENGTH\n#define SHA384_DIGEST_LENGTH 48\n#define SHA384_DIGEST_LEN SHA384_DIGEST_LENGTH\n#define SHA512_DIGEST_LENGTH 64\n#define SHA512_DIGEST_LEN SHA512_DIGEST_LENGTH\n\n#ifndef EVP_MAX_MD_SIZE\n#define EVP_MAX_MD_SIZE 64\n#endif\n\n#define EVP_DIGEST_LEN EVP_MAX_MD_SIZE\n\ntypedef mbedtls_mpi *bignum;\ntypedef const mbedtls_mpi *const_bignum;\ntypedef void* bignum_CTX;\n\n/* Constants for curves */\n#define NID_mbedtls_nistp256 0\n#define NID_mbedtls_nistp384 1\n#define NID_mbedtls_nistp521 2\n\nstruct mbedtls_ecdsa_sig {\n    bignum r;\n    bignum s;\n};\n\nbignum ssh_mbedcry_bn_new(void);\nvoid ssh_mbedcry_bn_free(bignum num);\nunsigned char *ssh_mbedcry_bn2num(const_bignum num, int radix);\nint ssh_mbedcry_rand(bignum rnd, int bits, int top, int bottom);\nint ssh_mbedcry_is_bit_set(bignum num, size_t pos);\nint ssh_mbedcry_rand_range(bignum dest, bignum max);\nint ssh_mbedcry_hex2bn(bignum *dest, char *data);\n\n#define bignum_new() ssh_mbedcry_bn_new()\n#define bignum_safe_free(num) do { \\\n    if ((num) != NULL) { \\\n        ssh_mbedcry_bn_free(num); \\\n        (num)=NULL; \\\n    } \\\n    } while(0)\n#define bignum_ctx_new() NULL\n#define bignum_ctx_free(num) do {(num) = NULL;} while(0)\n#define bignum_ctx_invalid(ctx) (ctx == NULL?0:1)\n#define bignum_set_word(bn, n) (mbedtls_mpi_lset(bn, n)==0?1:0) /* TODO fix\n                                                          overflow/underflow */\n#define bignum_bin2bn(data, datalen, bn) do { \\\n    *(bn) = bignum_new(); \\\n    if (*(bn) != NULL) { \\\n        mbedtls_mpi_read_binary(*(bn), data, datalen); \\\n    } \\\n    } while(0)\n#define bignum_bn2dec(num) ssh_mbedcry_bn2num(num, 10)\n#define bignum_dec2bn(data, bn) mbedtls_mpi_read_string(bn, 10, data)\n#define bignum_bn2hex(num, dest) (*dest)=ssh_mbedcry_bn2num(num, 16)\n#define bignum_hex2bn(data, dest) ssh_mbedcry_hex2bn(dest, data)\n#define bignum_rand(rnd, bits) ssh_mbedcry_rand((rnd), (bits), 0, 1)\n#define bignum_rand_range(rnd, max) ssh_mbedcry_rand_range(rnd, max)\n#define bignum_mod_exp(dest, generator, exp, modulo, ctx) \\\n        (mbedtls_mpi_exp_mod(dest, generator, exp, modulo, NULL)==0?1:0)\n#define bignum_add(dest, a, b) mbedtls_mpi_add_mpi(dest, a, b)\n#define bignum_sub(dest, a, b) mbedtls_mpi_sub_mpi(dest, a, b)\n#define bignum_mod(dest, a, b, ctx) \\\n    (mbedtls_mpi_mod_mpi(dest, a, b) == 0 ? 1 : 0)\n#define bignum_num_bytes(num) mbedtls_mpi_size(num)\n#define bignum_num_bits(num) mbedtls_mpi_bitlen(num)\n#define bignum_is_bit_set(num, bit) ssh_mbedcry_is_bit_set(num, bit)\n#define bignum_bn2bin(num, len, ptr) mbedtls_mpi_write_binary(num, ptr, \\\n        mbedtls_mpi_size(num))\n#define bignum_cmp(num1, num2) mbedtls_mpi_cmp_mpi(num1, num2)\n#define bignum_rshift1(dest, src) mbedtls_mpi_copy(dest, src), mbedtls_mpi_shift_r(dest, 1)\n#define bignum_dup(orig, dest) do { \\\n    if (*(dest) == NULL) { \\\n        *(dest) = bignum_new(); \\\n    } \\\n    if (*(dest) != NULL) { \\\n        mbedtls_mpi_copy(orig, *(dest)); \\\n    } \\\n    } while(0)\n\nmbedtls_ctr_drbg_context *ssh_get_mbedtls_ctr_drbg_context(void);\n\nint ssh_mbedtls_random(void *where, int len, int strong);\n\nssh_string make_ecpoint_string(const mbedtls_ecp_group *g, const\n        mbedtls_ecp_point *p);\n\n#define ssh_fips_mode() false\n\n#endif /* HAVE_LIBMBEDCRYPTO */\n#endif /* LIBMBEDCRYPTO_H_ */\n"
  },
  {
    "path": "src/libssh/include/libssh/libssh.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2003-2009 by Aris Adamantiadis\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef _LIBSSH_H\n#define _LIBSSH_H\n\n#include <libssh/libssh_version.h>\n\n#if defined _WIN32 || defined __CYGWIN__\n  #ifdef LIBSSH_STATIC\n    #define LIBSSH_API\n  #else\n    #ifdef LIBSSH_EXPORTS\n      #ifdef __GNUC__\n        #define LIBSSH_API __attribute__((dllexport))\n      #else\n        #define LIBSSH_API __declspec(dllexport)\n      #endif\n    #else\n      #ifdef __GNUC__\n        #define LIBSSH_API __attribute__((dllimport))\n      #else\n        #define LIBSSH_API __declspec(dllimport)\n      #endif\n    #endif\n  #endif\n#else\n  #if __GNUC__ >= 4 && !defined(__OS2__)\n    #define LIBSSH_API __attribute__((visibility(\"default\")))\n  #else\n    #define LIBSSH_API\n  #endif\n#endif\n\n#ifdef _MSC_VER\n  /* Visual Studio hasn't inttypes.h so it doesn't know uint32_t */\n  typedef int int32_t;\n  typedef unsigned int uint32_t;\n  typedef unsigned short uint16_t;\n  typedef unsigned char uint8_t;\n  typedef unsigned long long uint64_t;\n  typedef int mode_t;\n#else /* _MSC_VER */\n  #include <unistd.h>\n  #include <inttypes.h>\n  #include <sys/types.h>\n#endif /* _MSC_VER */\n\n#ifdef _WIN32\n  #include <winsock2.h>\n#else /* _WIN32 */\n #include <sys/select.h> /* for fd_set * */\n #include <netdb.h>\n#endif /* _WIN32 */\n\n#define SSH_STRINGIFY(s) SSH_TOSTRING(s)\n#define SSH_TOSTRING(s) #s\n\n/* GCC have printf type attribute check.  */\n#ifdef __GNUC__\n#define PRINTF_ATTRIBUTE(a,b) __attribute__ ((__format__ (__printf__, a, b)))\n#else\n#define PRINTF_ATTRIBUTE(a,b)\n#endif /* __GNUC__ */\n\n#ifdef __GNUC__\n#define SSH_DEPRECATED __attribute__ ((deprecated))\n#else\n#define SSH_DEPRECATED\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nstruct ssh_counter_struct {\n    uint64_t in_bytes;\n    uint64_t out_bytes;\n    uint64_t in_packets;\n    uint64_t out_packets;\n};\ntypedef struct ssh_counter_struct *ssh_counter;\n\ntypedef struct ssh_agent_struct* ssh_agent;\ntypedef struct ssh_buffer_struct* ssh_buffer;\ntypedef struct ssh_channel_struct* ssh_channel;\ntypedef struct ssh_message_struct* ssh_message;\ntypedef struct ssh_pcap_file_struct* ssh_pcap_file;\ntypedef struct ssh_key_struct* ssh_key;\ntypedef struct ssh_scp_struct* ssh_scp;\ntypedef struct ssh_session_struct* ssh_session;\ntypedef struct ssh_string_struct* ssh_string;\ntypedef struct ssh_event_struct* ssh_event;\ntypedef struct ssh_connector_struct * ssh_connector;\ntypedef void* ssh_gssapi_creds;\n\n/* Socket type */\n#ifdef _WIN32\n#ifndef socket_t\ntypedef SOCKET socket_t;\n#endif /* socket_t */\n#else /* _WIN32 */\n#ifndef socket_t\ntypedef int socket_t;\n#endif\n#endif /* _WIN32 */\n\n#define SSH_INVALID_SOCKET ((socket_t) -1)\n\n/* the offsets of methods */\nenum ssh_kex_types_e {\n\tSSH_KEX=0,\n\tSSH_HOSTKEYS,\n\tSSH_CRYPT_C_S,\n\tSSH_CRYPT_S_C,\n\tSSH_MAC_C_S,\n\tSSH_MAC_S_C,\n\tSSH_COMP_C_S,\n\tSSH_COMP_S_C,\n\tSSH_LANG_C_S,\n\tSSH_LANG_S_C\n};\n\n#define SSH_CRYPT 2\n#define SSH_MAC 3\n#define SSH_COMP 4\n#define SSH_LANG 5\n\nenum ssh_auth_e {\n\tSSH_AUTH_SUCCESS=0,\n\tSSH_AUTH_DENIED,\n\tSSH_AUTH_PARTIAL,\n\tSSH_AUTH_INFO,\n\tSSH_AUTH_AGAIN,\n\tSSH_AUTH_ERROR=-1\n};\n\n/* auth flags */\n#define SSH_AUTH_METHOD_UNKNOWN     0x0000u\n#define SSH_AUTH_METHOD_NONE        0x0001u\n#define SSH_AUTH_METHOD_PASSWORD    0x0002u\n#define SSH_AUTH_METHOD_PUBLICKEY   0x0004u\n#define SSH_AUTH_METHOD_HOSTBASED   0x0008u\n#define SSH_AUTH_METHOD_INTERACTIVE 0x0010u\n#define SSH_AUTH_METHOD_GSSAPI_MIC  0x0020u\n\n/* messages */\nenum ssh_requests_e {\n\tSSH_REQUEST_AUTH=1,\n\tSSH_REQUEST_CHANNEL_OPEN,\n\tSSH_REQUEST_CHANNEL,\n\tSSH_REQUEST_SERVICE,\n\tSSH_REQUEST_GLOBAL\n};\n\nenum ssh_channel_type_e {\n\tSSH_CHANNEL_UNKNOWN=0,\n\tSSH_CHANNEL_SESSION,\n\tSSH_CHANNEL_DIRECT_TCPIP,\n\tSSH_CHANNEL_FORWARDED_TCPIP,\n\tSSH_CHANNEL_X11,\n\tSSH_CHANNEL_AUTH_AGENT\n};\n\nenum ssh_channel_requests_e {\n\tSSH_CHANNEL_REQUEST_UNKNOWN=0,\n\tSSH_CHANNEL_REQUEST_PTY,\n\tSSH_CHANNEL_REQUEST_EXEC,\n\tSSH_CHANNEL_REQUEST_SHELL,\n\tSSH_CHANNEL_REQUEST_ENV,\n\tSSH_CHANNEL_REQUEST_SUBSYSTEM,\n\tSSH_CHANNEL_REQUEST_WINDOW_CHANGE,\n\tSSH_CHANNEL_REQUEST_X11\n};\n\nenum ssh_global_requests_e {\n\tSSH_GLOBAL_REQUEST_UNKNOWN=0,\n\tSSH_GLOBAL_REQUEST_TCPIP_FORWARD,\n\tSSH_GLOBAL_REQUEST_CANCEL_TCPIP_FORWARD,\n\tSSH_GLOBAL_REQUEST_KEEPALIVE\n};\n\nenum ssh_publickey_state_e {\n\tSSH_PUBLICKEY_STATE_ERROR=-1,\n\tSSH_PUBLICKEY_STATE_NONE=0,\n\tSSH_PUBLICKEY_STATE_VALID=1,\n\tSSH_PUBLICKEY_STATE_WRONG=2\n};\n\n/* Status flags */\n/** Socket is closed */\n#define SSH_CLOSED 0x01\n/** Reading to socket won't block */\n#define SSH_READ_PENDING 0x02\n/** Session was closed due to an error */\n#define SSH_CLOSED_ERROR 0x04\n/** Output buffer not empty */\n#define SSH_WRITE_PENDING 0x08\n\nenum ssh_server_known_e {\n\tSSH_SERVER_ERROR=-1,\n\tSSH_SERVER_NOT_KNOWN=0,\n\tSSH_SERVER_KNOWN_OK,\n\tSSH_SERVER_KNOWN_CHANGED,\n\tSSH_SERVER_FOUND_OTHER,\n\tSSH_SERVER_FILE_NOT_FOUND\n};\n\nenum ssh_known_hosts_e {\n    /**\n     * There had been an error checking the host.\n     */\n    SSH_KNOWN_HOSTS_ERROR = -2,\n\n    /**\n     * The known host file does not exist. The host is thus unknown. File will\n     * be created if host key is accepted.\n     */\n    SSH_KNOWN_HOSTS_NOT_FOUND = -1,\n\n    /**\n     * The server is unknown. User should confirm the public key hash is\n     * correct.\n     */\n    SSH_KNOWN_HOSTS_UNKNOWN = 0,\n\n    /**\n     * The server is known and has not changed.\n     */\n    SSH_KNOWN_HOSTS_OK,\n\n    /**\n     * The server key has changed. Either you are under attack or the\n     * administrator changed the key. You HAVE to warn the user about a\n     * possible attack.\n     */\n    SSH_KNOWN_HOSTS_CHANGED,\n\n    /**\n     * The server gave use a key of a type while we had an other type recorded.\n     * It is a possible attack.\n     */\n    SSH_KNOWN_HOSTS_OTHER,\n};\n\n#ifndef MD5_DIGEST_LEN\n    #define MD5_DIGEST_LEN 16\n#endif\n/* errors */\n\nenum ssh_error_types_e {\n\tSSH_NO_ERROR=0,\n\tSSH_REQUEST_DENIED,\n\tSSH_FATAL,\n\tSSH_EINTR\n};\n\n/* some types for keys */\nenum ssh_keytypes_e{\n  SSH_KEYTYPE_UNKNOWN=0,\n  SSH_KEYTYPE_DSS=1,\n  SSH_KEYTYPE_RSA,\n  SSH_KEYTYPE_RSA1,\n  SSH_KEYTYPE_ECDSA, /* deprecated */\n  SSH_KEYTYPE_ED25519,\n  SSH_KEYTYPE_DSS_CERT01,\n  SSH_KEYTYPE_RSA_CERT01,\n  SSH_KEYTYPE_ECDSA_P256,\n  SSH_KEYTYPE_ECDSA_P384,\n  SSH_KEYTYPE_ECDSA_P521,\n  SSH_KEYTYPE_ECDSA_P256_CERT01,\n  SSH_KEYTYPE_ECDSA_P384_CERT01,\n  SSH_KEYTYPE_ECDSA_P521_CERT01,\n  SSH_KEYTYPE_ED25519_CERT01,\n};\n\nenum ssh_keycmp_e {\n  SSH_KEY_CMP_PUBLIC = 0,\n  SSH_KEY_CMP_PRIVATE\n};\n\n#define SSH_ADDRSTRLEN 46\n\nstruct ssh_knownhosts_entry {\n    char *hostname;\n    char *unparsed;\n    ssh_key publickey;\n    char *comment;\n};\n\n\n/* Error return codes */\n#define SSH_OK 0     /* No error */\n#define SSH_ERROR -1 /* Error of some kind */\n#define SSH_AGAIN -2 /* The nonblocking call must be repeated */\n#define SSH_EOF -127 /* We have already a eof */\n\n/**\n * @addtogroup libssh_log\n *\n * @{\n */\n\nenum {\n\t/** No logging at all\n\t */\n\tSSH_LOG_NOLOG=0,\n\t/** Only warnings\n\t */\n\tSSH_LOG_WARNING,\n\t/** High level protocol information\n\t */\n\tSSH_LOG_PROTOCOL,\n\t/** Lower level protocol infomations, packet level\n\t */\n\tSSH_LOG_PACKET,\n\t/** Every function path\n\t */\n\tSSH_LOG_FUNCTIONS\n};\n/** @} */\n#define SSH_LOG_RARE SSH_LOG_WARNING\n\n/**\n * @name Logging levels\n *\n * @brief Debug levels for logging.\n * @{\n */\n\n/** No logging at all */\n#define SSH_LOG_NONE 0\n/** Show only warnings */\n#define SSH_LOG_WARN 1\n/** Get some information what's going on */\n#define SSH_LOG_INFO 2\n/** Get detailed debuging information **/\n#define SSH_LOG_DEBUG 3\n/** Get trace output, packet information, ... */\n#define SSH_LOG_TRACE 4\n\n/** @} */\n\nenum ssh_options_e {\n  SSH_OPTIONS_HOST,\n  SSH_OPTIONS_PORT,\n  SSH_OPTIONS_PORT_STR,\n  SSH_OPTIONS_PROXY_HOST,\n  SSH_OPTIONS_PROXY_PORT,\n  SSH_OPTIONS_PROXY_PORT_STR,\n  SSH_OPTIONS_FD,\n  SSH_OPTIONS_USER,\n  SSH_OPTIONS_SSH_DIR,\n  SSH_OPTIONS_IDENTITY,\n  SSH_OPTIONS_ADD_IDENTITY,\n  SSH_OPTIONS_KNOWNHOSTS,\n  SSH_OPTIONS_TIMEOUT,\n  SSH_OPTIONS_TIMEOUT_USEC,\n  SSH_OPTIONS_SSH1,\n  SSH_OPTIONS_SSH2,\n  SSH_OPTIONS_LOG_VERBOSITY,\n  SSH_OPTIONS_LOG_VERBOSITY_STR,\n  SSH_OPTIONS_CIPHERS_C_S,\n  SSH_OPTIONS_CIPHERS_S_C,\n  SSH_OPTIONS_COMPRESSION_C_S,\n  SSH_OPTIONS_COMPRESSION_S_C,\n  SSH_OPTIONS_PROXYCOMMAND,\n  SSH_OPTIONS_BINDADDR,\n  SSH_OPTIONS_STRICTHOSTKEYCHECK,\n  SSH_OPTIONS_COMPRESSION,\n  SSH_OPTIONS_COMPRESSION_LEVEL,\n  SSH_OPTIONS_KEY_EXCHANGE,\n  SSH_OPTIONS_HOSTKEYS,\n  SSH_OPTIONS_GSSAPI_SERVER_IDENTITY,\n  SSH_OPTIONS_GSSAPI_CLIENT_IDENTITY,\n  SSH_OPTIONS_GSSAPI_DELEGATE_CREDENTIALS,\n  SSH_OPTIONS_HMAC_C_S,\n  SSH_OPTIONS_HMAC_S_C,\n  SSH_OPTIONS_PASSWORD_AUTH,\n  SSH_OPTIONS_PUBKEY_AUTH,\n  SSH_OPTIONS_KBDINT_AUTH,\n  SSH_OPTIONS_GSSAPI_AUTH,\n  SSH_OPTIONS_GLOBAL_KNOWNHOSTS,\n  SSH_OPTIONS_NODELAY,\n  SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES,\n  SSH_OPTIONS_PROCESS_CONFIG,\n  SSH_OPTIONS_REKEY_DATA,\n  SSH_OPTIONS_REKEY_TIME,\n  SSH_OPTIONS_EXTERNAL_CALLBACKS\n};\n\nenum {\n  /** Code is going to write/create remote files */\n  SSH_SCP_WRITE,\n  /** Code is going to read remote files */\n  SSH_SCP_READ,\n  SSH_SCP_RECURSIVE=0x10\n};\n\nenum ssh_scp_request_types {\n  /** A new directory is going to be pulled */\n  SSH_SCP_REQUEST_NEWDIR=1,\n  /** A new file is going to be pulled */\n  SSH_SCP_REQUEST_NEWFILE,\n  /** End of requests */\n  SSH_SCP_REQUEST_EOF,\n  /** End of directory */\n  SSH_SCP_REQUEST_ENDDIR,\n  /** Warning received */\n  SSH_SCP_REQUEST_WARNING\n};\n\nenum ssh_connector_flags_e {\n    /** Only the standard stream of the channel */\n    SSH_CONNECTOR_STDOUT = 1,\n    SSH_CONNECTOR_STDINOUT = 1,\n    /** Only the exception stream of the channel */\n    SSH_CONNECTOR_STDERR = 2,\n    /** Merge both standard and exception streams */\n    SSH_CONNECTOR_BOTH = 3\n};\n\nLIBSSH_API int ssh_blocking_flush(ssh_session session, int timeout);\nLIBSSH_API ssh_channel ssh_channel_accept_x11(ssh_channel channel, int timeout_ms);\nLIBSSH_API int ssh_channel_change_pty_size(ssh_channel channel,int cols,int rows);\nLIBSSH_API int ssh_channel_close(ssh_channel channel);\nLIBSSH_API void ssh_channel_free(ssh_channel channel);\nLIBSSH_API int ssh_channel_get_exit_status(ssh_channel channel);\nLIBSSH_API ssh_session ssh_channel_get_session(ssh_channel channel);\nLIBSSH_API int ssh_channel_is_closed(ssh_channel channel);\nLIBSSH_API int ssh_channel_is_eof(ssh_channel channel);\nLIBSSH_API int ssh_channel_is_open(ssh_channel channel);\nLIBSSH_API ssh_channel ssh_channel_new(ssh_session session);\nLIBSSH_API int ssh_channel_open_auth_agent(ssh_channel channel);\nLIBSSH_API int ssh_channel_open_forward(ssh_channel channel, const char *remotehost,\n    int remoteport, const char *sourcehost, int localport);\nLIBSSH_API int ssh_channel_open_forward_unix(ssh_channel channel, const char *remotepath,\n    const char *sourcehost, int localport);\nLIBSSH_API int ssh_channel_open_session(ssh_channel channel);\nLIBSSH_API int ssh_channel_open_x11(ssh_channel channel, const char *orig_addr, int orig_port);\nLIBSSH_API int ssh_channel_poll(ssh_channel channel, int is_stderr);\nLIBSSH_API int ssh_channel_poll_timeout(ssh_channel channel, int timeout, int is_stderr);\nLIBSSH_API int ssh_channel_read(ssh_channel channel, void *dest, uint32_t count, int is_stderr);\nLIBSSH_API int ssh_channel_read_timeout(ssh_channel channel, void *dest, uint32_t count, int is_stderr, int timeout_ms);\nLIBSSH_API int ssh_channel_read_nonblocking(ssh_channel channel, void *dest, uint32_t count,\n    int is_stderr);\nLIBSSH_API int ssh_channel_request_env(ssh_channel channel, const char *name, const char *value);\nLIBSSH_API int ssh_channel_request_exec(ssh_channel channel, const char *cmd);\nLIBSSH_API int ssh_channel_request_pty(ssh_channel channel);\nLIBSSH_API int ssh_channel_request_pty_size(ssh_channel channel, const char *term,\n    int cols, int rows);\nLIBSSH_API int ssh_channel_request_shell(ssh_channel channel);\nLIBSSH_API int ssh_channel_request_send_signal(ssh_channel channel, const char *signum);\nLIBSSH_API int ssh_channel_request_send_break(ssh_channel channel, uint32_t length);\nLIBSSH_API int ssh_channel_request_sftp(ssh_channel channel);\nLIBSSH_API int ssh_channel_request_subsystem(ssh_channel channel, const char *subsystem);\nLIBSSH_API int ssh_channel_request_x11(ssh_channel channel, int single_connection, const char *protocol,\n    const char *cookie, int screen_number);\nLIBSSH_API int ssh_channel_request_auth_agent(ssh_channel channel);\nLIBSSH_API int ssh_channel_send_eof(ssh_channel channel);\nLIBSSH_API int ssh_channel_select(ssh_channel *readchans, ssh_channel *writechans, ssh_channel *exceptchans, struct\n        timeval * timeout);\nLIBSSH_API void ssh_channel_set_blocking(ssh_channel channel, int blocking);\nLIBSSH_API void ssh_channel_set_counter(ssh_channel channel,\n                                        ssh_counter counter);\nLIBSSH_API int ssh_channel_write(ssh_channel channel, const void *data, uint32_t len);\nLIBSSH_API int ssh_channel_write_stderr(ssh_channel channel,\n                                        const void *data,\n                                        uint32_t len);\nLIBSSH_API uint32_t ssh_channel_window_size(ssh_channel channel);\n\nLIBSSH_API char *ssh_basename (const char *path);\nLIBSSH_API void ssh_clean_pubkey_hash(unsigned char **hash);\nLIBSSH_API int ssh_connect(ssh_session session);\n\nLIBSSH_API ssh_connector ssh_connector_new(ssh_session session);\nLIBSSH_API void ssh_connector_free(ssh_connector connector);\nLIBSSH_API int ssh_connector_set_in_channel(ssh_connector connector,\n                                            ssh_channel channel,\n                                            enum ssh_connector_flags_e flags);\nLIBSSH_API int ssh_connector_set_out_channel(ssh_connector connector,\n                                             ssh_channel channel,\n                                             enum ssh_connector_flags_e flags);\nLIBSSH_API void ssh_connector_set_in_fd(ssh_connector connector, socket_t fd);\nLIBSSH_API void ssh_connector_set_out_fd(ssh_connector connector, socket_t fd);\n\nLIBSSH_API const char *ssh_copyright(void);\nLIBSSH_API void ssh_disconnect(ssh_session session);\nLIBSSH_API char *ssh_dirname (const char *path);\nLIBSSH_API int ssh_finalize(void);\n\n/* REVERSE PORT FORWARDING */\nLIBSSH_API ssh_channel ssh_channel_accept_forward(ssh_session session,\n                                                  int timeout_ms,\n                                                  int *destination_port);\nLIBSSH_API int ssh_channel_cancel_forward(ssh_session session,\n                                          const char *address,\n                                          int port);\nLIBSSH_API int ssh_channel_listen_forward(ssh_session session,\n                                          const char *address,\n                                          int port,\n                                          int *bound_port);\n\nLIBSSH_API void ssh_free(ssh_session session);\nLIBSSH_API const char *ssh_get_disconnect_message(ssh_session session);\nLIBSSH_API const char *ssh_get_error(void *error);\nLIBSSH_API int ssh_get_error_code(void *error);\nLIBSSH_API socket_t ssh_get_fd(ssh_session session);\nLIBSSH_API char *ssh_get_hexa(const unsigned char *what, size_t len);\nLIBSSH_API char *ssh_get_issue_banner(ssh_session session);\nLIBSSH_API int ssh_get_openssh_version(ssh_session session);\n\nLIBSSH_API int ssh_get_server_publickey(ssh_session session, ssh_key *key);\n\nenum ssh_publickey_hash_type {\n    SSH_PUBLICKEY_HASH_SHA1,\n    SSH_PUBLICKEY_HASH_MD5,\n    SSH_PUBLICKEY_HASH_SHA256\n};\nLIBSSH_API int ssh_get_publickey_hash(const ssh_key key,\n                                      enum ssh_publickey_hash_type type,\n                                      unsigned char **hash,\n                                      size_t *hlen);\n\n/* DEPRECATED FUNCTIONS */\nSSH_DEPRECATED LIBSSH_API int ssh_get_pubkey_hash(ssh_session session, unsigned char **hash);\nSSH_DEPRECATED LIBSSH_API ssh_channel ssh_forward_accept(ssh_session session, int timeout_ms);\nSSH_DEPRECATED LIBSSH_API int ssh_forward_cancel(ssh_session session, const char *address, int port);\nSSH_DEPRECATED LIBSSH_API int ssh_forward_listen(ssh_session session, const char *address, int port, int *bound_port);\nSSH_DEPRECATED LIBSSH_API int ssh_get_publickey(ssh_session session, ssh_key *key);\nSSH_DEPRECATED LIBSSH_API int ssh_write_knownhost(ssh_session session);\nSSH_DEPRECATED LIBSSH_API char *ssh_dump_knownhost(ssh_session session);\nSSH_DEPRECATED LIBSSH_API int ssh_is_server_known(ssh_session session);\nSSH_DEPRECATED LIBSSH_API void ssh_print_hexa(const char *descr, const unsigned char *what, size_t len);\n\n\n\nLIBSSH_API int ssh_get_random(void *where,int len,int strong);\nLIBSSH_API int ssh_get_version(ssh_session session);\nLIBSSH_API int ssh_get_status(ssh_session session);\nLIBSSH_API int ssh_get_poll_flags(ssh_session session);\nLIBSSH_API int ssh_init(void);\nLIBSSH_API int ssh_is_blocking(ssh_session session);\nLIBSSH_API int ssh_is_connected(ssh_session session);\n\n/* KNOWN HOSTS */\nLIBSSH_API void ssh_knownhosts_entry_free(struct ssh_knownhosts_entry *entry);\n#define SSH_KNOWNHOSTS_ENTRY_FREE(e) do { \\\n  if ((e) != NULL) { \\\n    ssh_knownhosts_entry_free(e); \\\n    e = NULL; \\\n  } \\\n} while(0)\n\nLIBSSH_API int ssh_known_hosts_parse_line(const char *host,\n                                          const char *line,\n                                          struct ssh_knownhosts_entry **entry);\nLIBSSH_API enum ssh_known_hosts_e ssh_session_has_known_hosts_entry(ssh_session session);\n\nLIBSSH_API int ssh_session_export_known_hosts_entry(ssh_session session,\n                                                    char **pentry_string);\nLIBSSH_API int ssh_session_update_known_hosts(ssh_session session);\n\nLIBSSH_API enum ssh_known_hosts_e ssh_session_get_known_hosts_entry(ssh_session session,\n        struct ssh_knownhosts_entry **pentry);\nLIBSSH_API enum ssh_known_hosts_e ssh_session_is_known_server(ssh_session session);\n\n/* LOGGING */\nLIBSSH_API int ssh_set_log_level(int level);\nLIBSSH_API int ssh_get_log_level(void);\nLIBSSH_API void *ssh_get_log_userdata(void);\nLIBSSH_API int ssh_set_log_userdata(void *data);\nLIBSSH_API void _ssh_log(int verbosity,\n                         const char *function,\n                         const char *format, ...) PRINTF_ATTRIBUTE(3, 4);\n\n/* legacy */\nSSH_DEPRECATED LIBSSH_API void ssh_log(ssh_session session,\n                                       int prioriry,\n                                       const char *format, ...) PRINTF_ATTRIBUTE(3, 4);\n\nLIBSSH_API ssh_channel ssh_message_channel_request_open_reply_accept(ssh_message msg);\nLIBSSH_API int ssh_message_channel_request_open_reply_accept_channel(ssh_message msg, ssh_channel chan);\nLIBSSH_API int ssh_message_channel_request_reply_success(ssh_message msg);\n#define SSH_MESSAGE_FREE(x) \\\n    do { if ((x) != NULL) { ssh_message_free(x); (x) = NULL; } } while(0)\nLIBSSH_API void ssh_message_free(ssh_message msg);\nLIBSSH_API ssh_message ssh_message_get(ssh_session session);\nLIBSSH_API int ssh_message_subtype(ssh_message msg);\nLIBSSH_API int ssh_message_type(ssh_message msg);\nLIBSSH_API int ssh_mkdir (const char *pathname, mode_t mode);\nLIBSSH_API ssh_session ssh_new(void);\n\nLIBSSH_API int ssh_options_copy(ssh_session src, ssh_session *dest);\nLIBSSH_API int ssh_options_getopt(ssh_session session, int *argcptr, char **argv);\nLIBSSH_API int ssh_options_parse_config(ssh_session session, const char *filename);\nLIBSSH_API int ssh_options_set(ssh_session session, enum ssh_options_e type,\n    const void *value);\nLIBSSH_API int ssh_options_get(ssh_session session, enum ssh_options_e type,\n    char **value);\nLIBSSH_API int ssh_options_get_port(ssh_session session, unsigned int * port_target);\nLIBSSH_API int ssh_pcap_file_close(ssh_pcap_file pcap);\nLIBSSH_API void ssh_pcap_file_free(ssh_pcap_file pcap);\nLIBSSH_API ssh_pcap_file ssh_pcap_file_new(void);\nLIBSSH_API int ssh_pcap_file_open(ssh_pcap_file pcap, const char *filename);\n\n/**\n * @addtogroup libssh_auth\n *\n * @{\n */\n\n/**\n * @brief SSH authentication callback for password and publickey auth.\n *\n * @param prompt        Prompt to be displayed.\n * @param buf           Buffer to save the password. You should null-terminate it.\n * @param len           Length of the buffer.\n * @param echo          Enable or disable the echo of what you type.\n * @param verify        Should the password be verified?\n * @param userdata      Userdata to be passed to the callback function. Useful\n *                      for GUI applications.\n *\n * @return              0 on success, < 0 on error.\n */\ntypedef int (*ssh_auth_callback) (const char *prompt, char *buf, size_t len,\n    int echo, int verify, void *userdata);\n\n/** @} */\n\nLIBSSH_API ssh_key ssh_key_new(void);\n#define SSH_KEY_FREE(x) \\\n    do { if ((x) != NULL) { ssh_key_free(x); x = NULL; } } while(0)\nLIBSSH_API void ssh_key_free (ssh_key key);\nLIBSSH_API enum ssh_keytypes_e ssh_key_type(const ssh_key key);\nLIBSSH_API const char *ssh_key_type_to_char(enum ssh_keytypes_e type);\nLIBSSH_API enum ssh_keytypes_e ssh_key_type_from_name(const char *name);\nLIBSSH_API int ssh_key_is_public(const ssh_key k);\nLIBSSH_API int ssh_key_is_private(const ssh_key k);\nLIBSSH_API int ssh_key_cmp(const ssh_key k1,\n                           const ssh_key k2,\n                           enum ssh_keycmp_e what);\n\nLIBSSH_API int ssh_pki_generate(enum ssh_keytypes_e type, int parameter,\n        ssh_key *pkey);\nLIBSSH_API int ssh_pki_import_privkey_base64(const char *b64_key,\n                                             const char *passphrase,\n                                             ssh_auth_callback auth_fn,\n                                             void *auth_data,\n                                             ssh_key *pkey);\nLIBSSH_API int ssh_pki_export_privkey_base64(const ssh_key privkey,\n                                             const char *passphrase,\n                                             ssh_auth_callback auth_fn,\n                                             void *auth_data,\n                                             char **b64_key);\nLIBSSH_API int ssh_pki_import_privkey_file(const char *filename,\n                                           const char *passphrase,\n                                           ssh_auth_callback auth_fn,\n                                           void *auth_data,\n                                           ssh_key *pkey);\nLIBSSH_API int ssh_pki_export_privkey_file(const ssh_key privkey,\n                                           const char *passphrase,\n                                           ssh_auth_callback auth_fn,\n                                           void *auth_data,\n                                           const char *filename);\n\nLIBSSH_API int ssh_pki_copy_cert_to_privkey(const ssh_key cert_key,\n                                            ssh_key privkey);\n\nLIBSSH_API int ssh_pki_import_pubkey_base64(const char *b64_key,\n                                            enum ssh_keytypes_e type,\n                                            ssh_key *pkey);\nLIBSSH_API int ssh_pki_import_pubkey_file(const char *filename,\n                                          ssh_key *pkey);\n\nLIBSSH_API int ssh_pki_import_cert_base64(const char *b64_cert,\n                                          enum ssh_keytypes_e type,\n                                          ssh_key *pkey);\nLIBSSH_API int ssh_pki_import_cert_file(const char *filename,\n                                        ssh_key *pkey);\n\nLIBSSH_API int ssh_pki_export_privkey_to_pubkey(const ssh_key privkey,\n                                                ssh_key *pkey);\nLIBSSH_API int ssh_pki_export_pubkey_base64(const ssh_key key,\n                                            char **b64_key);\nLIBSSH_API int ssh_pki_export_pubkey_file(const ssh_key key,\n                                          const char *filename);\n\nLIBSSH_API const char *ssh_pki_key_ecdsa_name(const ssh_key key);\n\nLIBSSH_API char *ssh_get_fingerprint_hash(enum ssh_publickey_hash_type type,\n                                          unsigned char *hash,\n                                          size_t len);\nLIBSSH_API void ssh_print_hash(enum ssh_publickey_hash_type type, unsigned char *hash, size_t len);\nLIBSSH_API int ssh_send_ignore (ssh_session session, const char *data);\nLIBSSH_API int ssh_send_debug (ssh_session session, const char *message, int always_display);\nLIBSSH_API void ssh_gssapi_set_creds(ssh_session session, const ssh_gssapi_creds creds);\nLIBSSH_API int ssh_scp_accept_request(ssh_scp scp);\nLIBSSH_API int ssh_scp_close(ssh_scp scp);\nLIBSSH_API int ssh_scp_deny_request(ssh_scp scp, const char *reason);\nLIBSSH_API void ssh_scp_free(ssh_scp scp);\nLIBSSH_API int ssh_scp_init(ssh_scp scp);\nLIBSSH_API int ssh_scp_leave_directory(ssh_scp scp);\nLIBSSH_API ssh_scp ssh_scp_new(ssh_session session, int mode, const char *location);\nLIBSSH_API int ssh_scp_pull_request(ssh_scp scp);\nLIBSSH_API int ssh_scp_push_directory(ssh_scp scp, const char *dirname, int mode);\nLIBSSH_API int ssh_scp_push_file(ssh_scp scp, const char *filename, size_t size, int perms);\nLIBSSH_API int ssh_scp_push_file64(ssh_scp scp, const char *filename, uint64_t size, int perms);\nLIBSSH_API int ssh_scp_read(ssh_scp scp, void *buffer, size_t size);\nLIBSSH_API const char *ssh_scp_request_get_filename(ssh_scp scp);\nLIBSSH_API int ssh_scp_request_get_permissions(ssh_scp scp);\nLIBSSH_API size_t ssh_scp_request_get_size(ssh_scp scp);\nLIBSSH_API uint64_t ssh_scp_request_get_size64(ssh_scp scp);\nLIBSSH_API const char *ssh_scp_request_get_warning(ssh_scp scp);\nLIBSSH_API int ssh_scp_write(ssh_scp scp, const void *buffer, size_t len);\nLIBSSH_API int ssh_select(ssh_channel *channels, ssh_channel *outchannels, socket_t maxfd,\n    fd_set *readfds, struct timeval *timeout);\nLIBSSH_API int ssh_service_request(ssh_session session, const char *service);\nLIBSSH_API int ssh_set_agent_channel(ssh_session session, ssh_channel channel);\n#ifndef _WIN32\nLIBSSH_API int ssh_set_agent_socket(ssh_session session, socket_t fd);\n#endif\nLIBSSH_API void ssh_set_blocking(ssh_session session, int blocking);\nLIBSSH_API void ssh_set_counters(ssh_session session, ssh_counter scounter,\n                                 ssh_counter rcounter);\nLIBSSH_API void ssh_set_fd_except(ssh_session session);\nLIBSSH_API void ssh_set_fd_toread(ssh_session session);\nLIBSSH_API void ssh_set_fd_towrite(ssh_session session);\nLIBSSH_API void ssh_silent_disconnect(ssh_session session);\nLIBSSH_API int ssh_set_pcap_file(ssh_session session, ssh_pcap_file pcapfile);\n\n/* USERAUTH */\nLIBSSH_API int ssh_userauth_none(ssh_session session, const char *username);\nLIBSSH_API int ssh_userauth_list(ssh_session session, const char *username);\nLIBSSH_API int ssh_userauth_try_publickey(ssh_session session,\n                                          const char *username,\n                                          const ssh_key pubkey);\nLIBSSH_API int ssh_userauth_publickey(ssh_session session,\n                                      const char *username,\n                                      const ssh_key privkey);\nLIBSSH_API int ssh_userauth_agent(ssh_session session,\n                                  const char *username);\nLIBSSH_API int ssh_userauth_publickey_auto(ssh_session session,\n                                           const char *username,\n                                           const char *passphrase);\nLIBSSH_API int ssh_userauth_password(ssh_session session,\n                                     const char *username,\n                                     const char *password);\n\nLIBSSH_API int ssh_userauth_kbdint(ssh_session session, const char *user, const char *submethods);\nLIBSSH_API const char *ssh_userauth_kbdint_getinstruction(ssh_session session);\nLIBSSH_API const char *ssh_userauth_kbdint_getname(ssh_session session);\nLIBSSH_API int ssh_userauth_kbdint_getnprompts(ssh_session session);\nLIBSSH_API const char *ssh_userauth_kbdint_getprompt(ssh_session session, unsigned int i, char *echo);\nLIBSSH_API int ssh_userauth_kbdint_getnanswers(ssh_session session);\nLIBSSH_API const char *ssh_userauth_kbdint_getanswer(ssh_session session, unsigned int i);\nLIBSSH_API int ssh_userauth_kbdint_setanswer(ssh_session session, unsigned int i,\n    const char *answer);\nLIBSSH_API int ssh_userauth_gssapi(ssh_session session);\nLIBSSH_API const char *ssh_version(int req_version);\n\nLIBSSH_API void ssh_string_burn(ssh_string str);\nLIBSSH_API ssh_string ssh_string_copy(ssh_string str);\nLIBSSH_API void *ssh_string_data(ssh_string str);\nLIBSSH_API int ssh_string_fill(ssh_string str, const void *data, size_t len);\n#define SSH_STRING_FREE(x) \\\n    do { if ((x) != NULL) { ssh_string_free(x); x = NULL; } } while(0)\nLIBSSH_API void ssh_string_free(ssh_string str);\nLIBSSH_API ssh_string ssh_string_from_char(const char *what);\nLIBSSH_API size_t ssh_string_len(ssh_string str);\nLIBSSH_API ssh_string ssh_string_new(size_t size);\nLIBSSH_API const char *ssh_string_get_char(ssh_string str);\nLIBSSH_API char *ssh_string_to_char(ssh_string str);\n#define SSH_STRING_FREE_CHAR(x) \\\n    do { if ((x) != NULL) { ssh_string_free_char(x); x = NULL; } } while(0)\nLIBSSH_API void ssh_string_free_char(char *s);\n\nLIBSSH_API int ssh_getpass(const char *prompt, char *buf, size_t len, int echo,\n    int verify);\n\n\ntypedef int (*ssh_event_callback)(socket_t fd, int revents, void *userdata);\n\nLIBSSH_API ssh_event ssh_event_new(void);\nLIBSSH_API int ssh_event_add_fd(ssh_event event, socket_t fd, short events,\n                                    ssh_event_callback cb, void *userdata);\nLIBSSH_API int ssh_event_add_session(ssh_event event, ssh_session session);\nLIBSSH_API int ssh_event_add_connector(ssh_event event, ssh_connector connector);\nLIBSSH_API int ssh_event_dopoll(ssh_event event, int timeout);\nLIBSSH_API int ssh_event_remove_fd(ssh_event event, socket_t fd);\nLIBSSH_API int ssh_event_remove_session(ssh_event event, ssh_session session);\nLIBSSH_API int ssh_event_remove_connector(ssh_event event, ssh_connector connector);\nLIBSSH_API void ssh_event_free(ssh_event event);\nLIBSSH_API const char* ssh_get_clientbanner(ssh_session session);\nLIBSSH_API const char* ssh_get_serverbanner(ssh_session session);\nLIBSSH_API const char* ssh_get_kex_algo(ssh_session session);\nLIBSSH_API const char* ssh_get_cipher_in(ssh_session session);\nLIBSSH_API const char* ssh_get_cipher_out(ssh_session session);\nLIBSSH_API const char* ssh_get_hmac_in(ssh_session session);\nLIBSSH_API const char* ssh_get_hmac_out(ssh_session session);\n\nLIBSSH_API ssh_buffer ssh_buffer_new(void);\nLIBSSH_API void ssh_buffer_free(ssh_buffer buffer);\n#define SSH_BUFFER_FREE(x) \\\n    do { if ((x) != NULL) { ssh_buffer_free(x); x = NULL; } } while(0)\nLIBSSH_API int ssh_buffer_reinit(ssh_buffer buffer);\nLIBSSH_API int ssh_buffer_add_data(ssh_buffer buffer, const void *data, uint32_t len);\nLIBSSH_API uint32_t ssh_buffer_get_data(ssh_buffer buffer, void *data, uint32_t requestedlen);\nLIBSSH_API void *ssh_buffer_get(ssh_buffer buffer);\nLIBSSH_API uint32_t ssh_buffer_get_len(ssh_buffer buffer);\n\n#ifndef LIBSSH_LEGACY_0_4\n#include \"libssh/legacy.h\"\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n#endif /* _LIBSSH_H */\n"
  },
  {
    "path": "src/libssh/include/libssh/libssh_version.h.cmake",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2020 by Heiko Thiery\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef _LIBSSH_VERSION_H\n#define _LIBSSH_VERSION_H\n\n/* libssh version macros */\n#define SSH_VERSION_INT(a, b, c) ((a) << 16 | (b) << 8 | (c))\n#define SSH_VERSION_DOT(a, b, c) a ##.## b ##.## c\n#define SSH_VERSION(a, b, c) SSH_VERSION_DOT(a, b, c)\n\n/* libssh version */\n#define LIBSSH_VERSION_MAJOR  @libssh_VERSION_MAJOR@\n#define LIBSSH_VERSION_MINOR  @libssh_VERSION_MINOR@\n#define LIBSSH_VERSION_MICRO  @libssh_VERSION_PATCH@\n\n#define LIBSSH_VERSION_INT SSH_VERSION_INT(LIBSSH_VERSION_MAJOR, \\\n                                           LIBSSH_VERSION_MINOR, \\\n                                           LIBSSH_VERSION_MICRO)\n#define LIBSSH_VERSION     SSH_VERSION(LIBSSH_VERSION_MAJOR, \\\n                                       LIBSSH_VERSION_MINOR, \\\n                                       LIBSSH_VERSION_MICRO)\n\n#endif /* _LIBSSH_VERSION_H */\n"
  },
  {
    "path": "src/libssh/include/libssh/libsshpp.hpp",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2010 by Aris Adamantiadis\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef LIBSSHPP_HPP_\n#define LIBSSHPP_HPP_\n\n/**\n * @defgroup ssh_cpp The libssh C++ wrapper\n *\n * The C++ bindings for libssh are completely embedded in a single .hpp file, and\n * this for two reasons:\n * - C++ is hard to keep binary compatible, C is easy. We try to keep libssh C version\n *   as much as possible binary compatible between releases, while this would be hard for\n *   C++. If you compile your program with these headers, you will only link to the C version\n *   of libssh which will be kept ABI compatible. No need to recompile your C++ program\n *   each time a new binary-compatible version of libssh is out\n * - Most of the functions in this file are really short and are probably worth the \"inline\"\n *   linking mode, which the compiler can decide to do in some case. There would be nearly no\n *   performance penalty of using the wrapper rather than native calls.\n *\n * Please visit the documentation of ssh::Session and ssh::Channel\n * @see ssh::Session\n * @see ssh::Channel\n *\n * If you wish not to use C++ exceptions, please define SSH_NO_CPP_EXCEPTIONS:\n * @code\n * #define SSH_NO_CPP_EXCEPTIONS\n * #include <libssh/libsshpp.hpp>\n * @endcode\n * All functions will then return SSH_ERROR in case of error.\n * @{\n */\n\n/* do not use deprecated functions */\n#define LIBSSH_LEGACY_0_4\n\n#include <libssh/libssh.h>\n#include <libssh/server.h>\n#include <stdlib.h>\n#include <stdarg.h>\n#include <stdio.h>\n#include <string>\n\nnamespace ssh {\n\nclass Channel;\n/** Some people do not like C++ exceptions. With this define, we give\n * the choice to use or not exceptions.\n * @brief if defined, disable C++ exceptions for libssh c++ wrapper\n */\n#ifndef SSH_NO_CPP_EXCEPTIONS\n\n/** @brief This class describes a SSH Exception object. This object can be thrown\n * by several SSH functions that interact with the network, and may fail because of\n * socket, protocol or memory errors.\n */\nclass SshException{\npublic:\n  SshException(ssh_session csession){\n    code=ssh_get_error_code(csession);\n    description=std::string(ssh_get_error(csession));\n  }\n  SshException(const SshException &e){\n    code=e.code;\n    description=e.description;\n  }\n  /** @brief returns the Error code\n   * @returns SSH_FATAL Fatal error happened (not recoverable)\n   * @returns SSH_REQUEST_DENIED Request was denied by remote host\n   * @see ssh_get_error_code\n   */\n  int getCode(){\n    return code;\n  }\n  /** @brief returns the error message of the last exception\n   * @returns pointer to a c string containing the description of error\n   * @see ssh_get_error\n   */\n  std::string getError(){\n    return description;\n  }\nprivate:\n  int code;\n  std::string description;\n};\n\n/** @internal\n * @brief Macro to throw exception if there was an error\n */\n#define ssh_throw(x) if((x)==SSH_ERROR) throw SshException(getCSession())\n#define ssh_throw_null(CSession,x) if((x)==NULL) throw SshException(CSession)\n#define void_throwable void\n#define return_throwable return\n\n#else\n\n/* No exception at all. All functions will return an error code instead\n * of an exception\n */\n#define ssh_throw(x) if((x)==SSH_ERROR) return SSH_ERROR\n#define ssh_throw_null(CSession,x) if((x)==NULL) return NULL\n#define void_throwable int\n#define return_throwable return SSH_OK\n#endif\n\n/**\n * The ssh::Session class contains the state of a SSH connection.\n */\nclass Session {\n  friend class Channel;\npublic:\n  Session(){\n    c_session=ssh_new();\n  }\n  ~Session(){\n    ssh_free(c_session);\n    c_session=NULL;\n  }\n  /** @brief sets an SSH session options\n   * @param type Type of option\n   * @param option cstring containing the value of option\n   * @throws SshException on error\n   * @see ssh_options_set\n   */\n  void_throwable setOption(enum ssh_options_e type, const char *option){\n    ssh_throw(ssh_options_set(c_session,type,option));\n    return_throwable;\n  }\n  /** @brief sets an SSH session options\n   * @param type Type of option\n   * @param option long integer containing the value of option\n   * @throws SshException on error\n   * @see ssh_options_set\n   */\n  void_throwable setOption(enum ssh_options_e type, long int option){\n    ssh_throw(ssh_options_set(c_session,type,&option));\n    return_throwable;\n  }\n  /** @brief sets an SSH session options\n   * @param type Type of option\n   * @param option void pointer containing the value of option\n   * @throws SshException on error\n   * @see ssh_options_set\n   */\n  void_throwable setOption(enum ssh_options_e type, void *option){\n    ssh_throw(ssh_options_set(c_session,type,option));\n    return_throwable;\n  }\n  /** @brief connects to the remote host\n   * @throws SshException on error\n   * @see ssh_connect\n   */\n  void_throwable connect(){\n    int ret=ssh_connect(c_session);\n    ssh_throw(ret);\n    return_throwable;\n  }\n  /** @brief Authenticates automatically using public key\n   * @throws SshException on error\n   * @returns SSH_AUTH_SUCCESS, SSH_AUTH_PARTIAL, SSH_AUTH_DENIED\n   * @see ssh_userauth_autopubkey\n   */\n  int userauthPublickeyAuto(void){\n    int ret=ssh_userauth_publickey_auto(c_session, NULL, NULL);\n    ssh_throw(ret);\n    return ret;\n  }\n  /** @brief Authenticates using the \"none\" method. Prefer using autopubkey if\n   * possible.\n   * @throws SshException on error\n   * @returns SSH_AUTH_SUCCESS, SSH_AUTH_PARTIAL, SSH_AUTH_DENIED\n   * @see ssh_userauth_none\n   * @see Session::userauthAutoPubkey\n   */\n  int userauthNone(){\n    int ret=ssh_userauth_none(c_session,NULL);\n    ssh_throw(ret);\n    return ret;\n  }\n\n  /**\n   * @brief Authenticate through the \"keyboard-interactive\" method.\n   *\n   * @param[in] username The username to authenticate. You can specify NULL if\n   *                     ssh_option_set_username() has been used. You cannot\n   *                     try two different logins in a row.\n   *\n   * @param[in] submethods Undocumented. Set it to NULL.\n   *\n   * @throws SshException on error\n   *\n   * @returns SSH_AUTH_SUCCESS, SSH_AUTH_PARTIAL, SSH_AUTH_DENIED,\n   *          SSH_AUTH_ERROR, SSH_AUTH_INFO, SSH_AUTH_AGAIN\n   *\n   * @see ssh_userauth_kbdint\n   */\n  int userauthKbdint(const char* username, const char* submethods){\n    int ret = ssh_userauth_kbdint(c_session, username, submethods);\n    ssh_throw(ret);\n    return ret;\n  }\n\n  /** @brief Get the number of prompts (questions) the server has given.\n   * @returns The number of prompts.\n   * @see ssh_userauth_kbdint_getnprompts\n   */\n  int userauthKbdintGetNPrompts(){\n    return ssh_userauth_kbdint_getnprompts(c_session);\n  }\n\n  /**\n   * @brief Set the answer for a question from a message block.\n   *\n   * @param[in] index The index number of the prompt.\n   * @param[in] answer The answer to give to the server. The answer MUST be\n   *                   encoded UTF-8. It is up to the server how to interpret\n   *                   the value and validate it. However, if you read the\n   *                   answer in some other encoding, you MUST convert it to\n   *                   UTF-8.\n   *\n   * @throws SshException on error\n   *\n   * @returns 0 on success, < 0 on error\n   *\n   * @see ssh_userauth_kbdint_setanswer\n   */\n  int userauthKbdintSetAnswer(unsigned int index, const char *answer)\n  {\n    int ret = ssh_userauth_kbdint_setanswer(c_session, index, answer);\n    ssh_throw(ret);\n    return ret;\n  }\n\n\n\n  /** @brief Authenticates using the password method.\n   * @param[in] password password to use for authentication\n   * @throws SshException on error\n   * @returns SSH_AUTH_SUCCESS, SSH_AUTH_PARTIAL, SSH_AUTH_DENIED\n   * @see ssh_userauth_password\n   */\n  int userauthPassword(const char *password){\n    int ret=ssh_userauth_password(c_session,NULL,password);\n    ssh_throw(ret);\n    return ret;\n  }\n  /** @brief Try to authenticate using the publickey method.\n   * @param[in] pubkey public key to use for authentication\n   * @throws SshException on error\n   * @returns SSH_AUTH_SUCCESS if the pubkey is accepted,\n   * @returns SSH_AUTH_DENIED if the pubkey is denied\n   * @see ssh_userauth_try_pubkey\n   */\n  int userauthTryPublickey(ssh_key pubkey){\n    int ret=ssh_userauth_try_publickey(c_session, NULL, pubkey);\n    ssh_throw(ret);\n    return ret;\n  }\n  /** @brief Authenticates using the publickey method.\n   * @param[in] privkey private key to use for authentication\n   * @throws SshException on error\n   * @returns SSH_AUTH_SUCCESS, SSH_AUTH_PARTIAL, SSH_AUTH_DENIED\n   * @see ssh_userauth_pubkey\n   */\n  int userauthPublickey(ssh_key privkey){\n    int ret=ssh_userauth_publickey(c_session, NULL, privkey);\n    ssh_throw(ret);\n    return ret;\n  }\n\n  /** @brief Returns the available authentication methods from the server\n   * @throws SshException on error\n   * @returns Bitfield of available methods.\n   * @see ssh_userauth_list\n   */\n  int getAuthList(){\n    int ret=ssh_userauth_list(c_session, NULL);\n    ssh_throw(ret);\n    return ret;\n  }\n  /** @brief Disconnects from the SSH server and closes connection\n   * @see ssh_disconnect\n   */\n  void disconnect(){\n    ssh_disconnect(c_session);\n  }\n  /** @brief Returns the disconnect message from the server, if any\n   * @returns pointer to the message, or NULL. Do not attempt to free\n   * the pointer.\n   */\n  const char *getDisconnectMessage(){\n    const char *msg=ssh_get_disconnect_message(c_session);\n    return msg;\n  }\n  /** @internal\n   * @brief gets error message\n   */\n  const char *getError(){\n    return ssh_get_error(c_session);\n  }\n  /** @internal\n   * @brief returns error code\n   */\n  int getErrorCode(){\n    return ssh_get_error_code(c_session);\n  }\n  /** @brief returns the file descriptor used for the communication\n   * @returns the file descriptor\n   * @warning if a proxycommand is used, this function will only return\n   * one of the two file descriptors being used\n   * @see ssh_get_fd\n   */\n  socket_t getSocket(){\n    return ssh_get_fd(c_session);\n  }\n  /** @brief gets the Issue banner from the ssh server\n   * @returns the issue banner. This is generally a MOTD from server\n   * @see ssh_get_issue_banner\n   */\n  std::string getIssueBanner(){\n    char *banner = ssh_get_issue_banner(c_session);\n    std::string ret = \"\";\n    if (banner != NULL) {\n      ret = std::string(banner);\n      ::free(banner);\n    }\n    return ret;\n  }\n  /** @brief returns the OpenSSH version (server) if possible\n   * @returns openssh version code\n   * @see ssh_get_openssh_version\n   */\n  int getOpensshVersion(){\n    return ssh_get_openssh_version(c_session);\n  }\n  /** @brief returns the version of the SSH protocol being used\n   * @returns the SSH protocol version\n   * @see ssh_get_version\n   */\n  int getVersion(){\n    return ssh_get_version(c_session);\n  }\n  /** @brief verifies that the server is known\n   * @throws SshException on error\n   * @returns Integer value depending on the knowledge of the\n   * server key\n   * @see ssh_session_update_known_hosts\n   */\n  int isServerKnown(){\n    int state = ssh_session_is_known_server(c_session);\n    ssh_throw(state);\n    return state;\n  }\n  void log(int priority, const char *format, ...){\n    char buffer[1024];\n    va_list va;\n\n    va_start(va, format);\n    vsnprintf(buffer, sizeof(buffer), format, va);\n    va_end(va);\n    _ssh_log(priority, \"libsshpp\", \"%s\", buffer);\n  }\n\n  /** @brief copies options from a session to another\n   * @throws SshException on error\n   * @see ssh_options_copy\n   */\n  void_throwable optionsCopy(const Session &source){\n    ssh_throw(ssh_options_copy(source.c_session,&c_session));\n    return_throwable;\n  }\n  /** @brief parses a configuration file for options\n   * @throws SshException on error\n   * @param[in] file configuration file name\n   * @see ssh_options_parse_config\n   */\n  void_throwable optionsParseConfig(const char *file){\n    ssh_throw(ssh_options_parse_config(c_session,file));\n    return_throwable;\n  }\n  /** @brief silently disconnect from remote host\n   * @see ssh_silent_disconnect\n   */\n  void silentDisconnect(){\n    ssh_silent_disconnect(c_session);\n  }\n  /** @brief Writes the known host file with current\n   * host key\n   * @throws SshException on error\n   * @see ssh_write_knownhost\n   */\n  int writeKnownhost(){\n    int ret = ssh_session_update_known_hosts(c_session);\n    ssh_throw(ret);\n    return ret;\n  }\n\n  /** @brief accept an incoming forward connection\n   * @param[in] timeout_ms timeout for waiting, in ms\n   * @returns new Channel pointer on the forward connection\n   * @returns NULL in case of error\n   * @warning you have to delete this pointer after use\n   * @see ssh_channel_forward_accept\n   * @see Session::listenForward\n   */\n  inline Channel *acceptForward(int timeout_ms);\n  /* implemented outside the class due Channel references */\n\n  void_throwable cancelForward(const char *address, int port){\n    int err=ssh_channel_cancel_forward(c_session, address, port);\n    ssh_throw(err);\n    return_throwable;\n  }\n\n  void_throwable listenForward(const char *address, int port,\n      int &boundport){\n    int err=ssh_channel_listen_forward(c_session, address, port, &boundport);\n    ssh_throw(err);\n    return_throwable;\n  }\n\n  ssh_session getCSession(){\n    return c_session;\n  }\n\nprotected:\n  ssh_session c_session;\n\nprivate:\n  /* No copy constructor, no = operator */\n  Session(const Session &);\n  Session& operator=(const Session &);\n};\n\n/** @brief the ssh::Channel class describes the state of an SSH\n * channel.\n * @see ssh_channel\n */\nclass Channel {\n  friend class Session;\npublic:\n  Channel(Session &ssh_session){\n    channel = ssh_channel_new(ssh_session.getCSession());\n    this->session = &ssh_session;\n  }\n  ~Channel(){\n    ssh_channel_free(channel);\n    channel=NULL;\n  }\n\n  /** @brief accept an incoming X11 connection\n   * @param[in] timeout_ms timeout for waiting, in ms\n   * @returns new Channel pointer on the X11 connection\n   * @returns NULL in case of error\n   * @warning you have to delete this pointer after use\n   * @see ssh_channel_accept_x11\n   * @see Channel::requestX11\n   */\n  Channel *acceptX11(int timeout_ms){\n    ssh_channel x11chan = ssh_channel_accept_x11(channel,timeout_ms);\n    ssh_throw_null(getCSession(),x11chan);\n    Channel *newchan = new Channel(getSession(),x11chan);\n    return newchan;\n  }\n  /** @brief change the size of a pseudoterminal\n   * @param[in] cols number of columns\n   * @param[in] rows number of rows\n   * @throws SshException on error\n   * @see ssh_channel_change_pty_size\n   */\n  void_throwable changePtySize(int cols, int rows){\n    int err=ssh_channel_change_pty_size(channel,cols,rows);\n    ssh_throw(err);\n    return_throwable;\n  }\n\n  /** @brief closes a channel\n   * @throws SshException on error\n   * @see ssh_channel_close\n   */\n  void_throwable close(){\n    ssh_throw(ssh_channel_close(channel));\n    return_throwable;\n  }\n\n  int getExitStatus(){\n    return ssh_channel_get_exit_status(channel);\n  }\n  Session &getSession(){\n    return *session;\n  }\n  /** @brief returns true if channel is in closed state\n   * @see ssh_channel_is_closed\n   */\n  bool isClosed(){\n    return ssh_channel_is_closed(channel) != 0;\n  }\n  /** @brief returns true if channel is in EOF state\n   * @see ssh_channel_is_eof\n   */\n  bool isEof(){\n    return ssh_channel_is_eof(channel) != 0;\n  }\n  /** @brief returns true if channel is in open state\n   * @see ssh_channel_is_open\n   */\n  bool isOpen(){\n    return ssh_channel_is_open(channel) != 0;\n  }\n  int openForward(const char *remotehost, int remoteport,\n      const char *sourcehost=NULL, int localport=0){\n    int err=ssh_channel_open_forward(channel,remotehost,remoteport,\n        sourcehost, localport);\n    ssh_throw(err);\n    return err;\n  }\n  /* TODO: completely remove this ? */\n  void_throwable openSession(){\n    int err=ssh_channel_open_session(channel);\n    ssh_throw(err);\n    return_throwable;\n  }\n  int poll(bool is_stderr=false){\n    int err=ssh_channel_poll(channel,is_stderr);\n    ssh_throw(err);\n    return err;\n  }\n  int read(void *dest, size_t count){\n    int err;\n    /* handle int overflow */\n    if(count > 0x7fffffff)\n      count = 0x7fffffff;\n    err=ssh_channel_read_timeout(channel,dest,count,false,-1);\n    ssh_throw(err);\n    return err;\n  }\n  int read(void *dest, size_t count, int timeout){\n    int err;\n    /* handle int overflow */\n    if(count > 0x7fffffff)\n      count = 0x7fffffff;\n    err=ssh_channel_read_timeout(channel,dest,count,false,timeout);\n    ssh_throw(err);\n    return err;\n  }\n  int read(void *dest, size_t count, bool is_stderr=false, int timeout=-1){\n    int err;\n    /* handle int overflow */\n    if(count > 0x7fffffff)\n      count = 0x7fffffff;\n    err=ssh_channel_read_timeout(channel,dest,count,is_stderr,timeout);\n    ssh_throw(err);\n    return err;\n  }\n  int readNonblocking(void *dest, size_t count, bool is_stderr=false){\n    int err;\n    /* handle int overflow */\n    if(count > 0x7fffffff)\n      count = 0x7fffffff;\n    err=ssh_channel_read_nonblocking(channel,dest,count,is_stderr);\n    ssh_throw(err);\n    return err;\n  }\n  void_throwable requestEnv(const char *name, const char *value){\n    int err=ssh_channel_request_env(channel,name,value);\n    ssh_throw(err);\n    return_throwable;\n  }\n\n  void_throwable requestExec(const char *cmd){\n    int err=ssh_channel_request_exec(channel,cmd);\n    ssh_throw(err);\n    return_throwable;\n  }\n  void_throwable requestPty(const char *term=NULL, int cols=0, int rows=0){\n    int err;\n    if(term != NULL && cols != 0 && rows != 0)\n      err=ssh_channel_request_pty_size(channel,term,cols,rows);\n    else\n      err=ssh_channel_request_pty(channel);\n    ssh_throw(err);\n    return_throwable;\n  }\n\n  void_throwable requestShell(){\n    int err=ssh_channel_request_shell(channel);\n    ssh_throw(err);\n    return_throwable;\n  }\n  void_throwable requestSendSignal(const char *signum){\n    int err=ssh_channel_request_send_signal(channel, signum);\n    ssh_throw(err);\n    return_throwable;\n  }\n  void_throwable requestSubsystem(const char *subsystem){\n    int err=ssh_channel_request_subsystem(channel,subsystem);\n    ssh_throw(err);\n    return_throwable;\n  }\n  int requestX11(bool single_connection,\n      const char *protocol, const char *cookie, int screen_number){\n    int err=ssh_channel_request_x11(channel,single_connection,\n        protocol, cookie, screen_number);\n    ssh_throw(err);\n    return err;\n  }\n  void_throwable sendEof(){\n    int err=ssh_channel_send_eof(channel);\n    ssh_throw(err);\n    return_throwable;\n  }\n  /** @brief Writes on a channel\n   * @param data data to write.\n   * @param len number of bytes to write.\n   * @param is_stderr write should be done on the stderr channel (server only)\n   * @returns number of bytes written\n   * @throws SshException in case of error\n   * @see channel_write\n   * @see channel_write_stderr\n   */\n  int write(const void *data, size_t len, bool is_stderr=false){\n    int ret;\n    if(is_stderr){\n      ret=ssh_channel_write_stderr(channel,data,len);\n    } else {\n      ret=ssh_channel_write(channel,data,len);\n    }\n    ssh_throw(ret);\n    return ret;\n  }\n\n  ssh_session getCSession(){\n    return session->getCSession();\n  }\n\n  ssh_channel getCChannel() {\n    return channel;\n  }\n\nprotected:\n  Session *session;\n  ssh_channel channel;\n\nprivate:\n  Channel (Session &ssh_session, ssh_channel c_channel){\n    this->channel=c_channel;\n    this->session = &ssh_session;\n  }\n  /* No copy and no = operator */\n  Channel(const Channel &);\n  Channel &operator=(const Channel &);\n};\n\n\ninline Channel *Session::acceptForward(int timeout_ms){\n    ssh_channel forward =\n        ssh_channel_accept_forward(c_session, timeout_ms, NULL);\n    ssh_throw_null(c_session,forward);\n    Channel *newchan = new Channel(*this,forward);\n    return newchan;\n  }\n\n} // namespace ssh\n\n/** @} */\n#endif /* LIBSSHPP_HPP_ */\n"
  },
  {
    "path": "src/libssh/include/libssh/messages.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2009 by Aris Adamantiadis\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef MESSAGES_H_\n#define MESSAGES_H_\n\n#include \"config.h\"\n\nstruct ssh_auth_request {\n    char *username;\n    int method;\n    char *password;\n    struct ssh_key_struct *pubkey;\n    enum ssh_publickey_state_e signature_state;\n    char kbdint_response;\n};\n\nstruct ssh_channel_request_open {\n    int type;\n    uint32_t sender;\n    uint32_t window;\n    uint32_t packet_size;\n    char *originator;\n    uint16_t originator_port;\n    char *destination;\n    uint16_t destination_port;\n};\n\nstruct ssh_service_request {\n    char *service;\n};\n\nstruct ssh_global_request {\n    int type;\n    uint8_t want_reply;\n    char *bind_address;\n    uint16_t bind_port;\n};\n\nstruct ssh_channel_request {\n    int type;\n    ssh_channel channel;\n    uint8_t want_reply;\n    /* pty-req type specifics */\n    char *TERM;\n    uint32_t width;\n    uint32_t height;\n    uint32_t pxwidth;\n    uint32_t pxheight;\n    ssh_string modes;\n\n    /* env type request */\n    char *var_name;\n    char *var_value;\n    /* exec type request */\n    char *command;\n    /* subsystem */\n    char *subsystem;\n\n    /* X11 */\n    uint8_t x11_single_connection;\n    char *x11_auth_protocol;\n    char *x11_auth_cookie;\n    uint32_t x11_screen_number;\n};\n\nstruct ssh_message_struct {\n    ssh_session session;\n    int type;\n    struct ssh_auth_request auth_request;\n    struct ssh_channel_request_open channel_request_open;\n    struct ssh_channel_request channel_request;\n    struct ssh_service_request service_request;\n    struct ssh_global_request global_request;\n};\n\nSSH_PACKET_CALLBACK(ssh_packet_channel_open);\nSSH_PACKET_CALLBACK(ssh_packet_global_request);\n\n#ifdef WITH_SERVER\nSSH_PACKET_CALLBACK(ssh_packet_service_request);\nSSH_PACKET_CALLBACK(ssh_packet_userauth_request);\n#endif /* WITH_SERVER */\n\nint ssh_message_handle_channel_request(ssh_session session, ssh_channel channel, ssh_buffer packet,\n    const char *request, uint8_t want_reply);\nssh_message ssh_message_pop_head(ssh_session session);\n\n#endif /* MESSAGES_H_ */\n"
  },
  {
    "path": "src/libssh/include/libssh/misc.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2009 by Aris Adamantiadis\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef MISC_H_\n#define MISC_H_\n\n/* in misc.c */\n/* gets the user home dir. */\nchar *ssh_get_user_home_dir(void);\nchar *ssh_get_local_username(void);\nint ssh_file_readaccess_ok(const char *file);\nint ssh_dir_writeable(const char *path);\n\nchar *ssh_path_expand_tilde(const char *d);\nchar *ssh_path_expand_escape(ssh_session session, const char *s);\nint ssh_analyze_banner(ssh_session session, int server);\nint ssh_is_ipaddr_v4(const char *str);\nint ssh_is_ipaddr(const char *str);\n\n/* list processing */\n\nstruct ssh_list {\n  struct ssh_iterator *root;\n  struct ssh_iterator *end;\n};\n\nstruct ssh_iterator {\n  struct ssh_iterator *next;\n  const void *data;\n};\n\nstruct ssh_timestamp {\n  long seconds;\n  long useconds;\n};\n\nenum ssh_quote_state_e {\n    NO_QUOTE,\n    SINGLE_QUOTE,\n    DOUBLE_QUOTE\n};\n\nstruct ssh_list *ssh_list_new(void);\nvoid ssh_list_free(struct ssh_list *list);\nstruct ssh_iterator *ssh_list_get_iterator(const struct ssh_list *list);\nstruct ssh_iterator *ssh_list_find(const struct ssh_list *list, void *value);\nsize_t ssh_list_count(const struct ssh_list *list);\nint ssh_list_append(struct ssh_list *list, const void *data);\nint ssh_list_prepend(struct ssh_list *list, const void *data);\nvoid ssh_list_remove(struct ssh_list *list, struct ssh_iterator *iterator);\nchar *ssh_lowercase(const char* str);\nchar *ssh_hostport(const char *host, int port);\n\nconst void *_ssh_list_pop_head(struct ssh_list *list);\n\n#define ssh_iterator_value(type, iterator)\\\n  ((type)((iterator)->data))\n\n/** @brief fetch the head element of a list and remove it from list\n * @param type type of the element to return\n * @param list the ssh_list to use\n * @return the first element of the list, or NULL if the list is empty\n */\n#define ssh_list_pop_head(type, ssh_list)\\\n  ((type)_ssh_list_pop_head(ssh_list))\n\nint ssh_make_milliseconds(long sec, long usec);\nvoid ssh_timestamp_init(struct ssh_timestamp *ts);\nint ssh_timeout_elapsed(struct ssh_timestamp *ts, int timeout);\nint ssh_timeout_update(struct ssh_timestamp *ts, int timeout);\n\nint ssh_match_group(const char *group, const char *object);\n\nvoid uint64_inc(unsigned char *counter);\n\nvoid ssh_log_hexdump(const char *descr, const unsigned char *what, size_t len);\n\nint ssh_mkdirs(const char *pathname, mode_t mode);\n\nint ssh_quote_file_name(const char *file_name, char *buf, size_t buf_len);\nint ssh_newline_vis(const char *string, char *buf, size_t buf_len);\n\n#endif /* MISC_H_ */\n"
  },
  {
    "path": "src/libssh/include/libssh/options.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2011      Andreas Schneider <asn@cryptomilk.org>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef _OPTIONS_H\n#define _OPTIONS_H\n\nint ssh_config_parse_file(ssh_session session, const char *filename);\nint ssh_options_set_algo(ssh_session session,\n                         enum ssh_kex_types_e algo,\n                         const char *list);\nint ssh_options_apply(ssh_session session);\n\n#endif /* _OPTIONS_H */\n"
  },
  {
    "path": "src/libssh/include/libssh/packet.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2009 by Aris Adamantiadis\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef PACKET_H_\n#define PACKET_H_\n\n#include \"libssh/wrapper.h\"\n\nstruct ssh_socket_struct;\n\n/* this structure should go someday */\ntypedef struct packet_struct {\n\tint valid;\n\tuint32_t len;\n\tuint8_t type;\n} PACKET;\n\n/** different state of packet reading. */\nenum ssh_packet_state_e {\n  /** Packet not initialized, must read the size of packet */\n  PACKET_STATE_INIT,\n  /** Size was read, waiting for the rest of data */\n  PACKET_STATE_SIZEREAD,\n  /** Full packet was read and callbacks are being called. Future packets\n   * should wait for the end of the callback. */\n  PACKET_STATE_PROCESSING\n};\n\nenum ssh_packet_filter_result_e {\n    SSH_PACKET_UNKNOWN,\n    SSH_PACKET_ALLOWED,\n    SSH_PACKET_DENIED\n};\n\nint ssh_packet_send(ssh_session session);\n\nSSH_PACKET_CALLBACK(ssh_packet_unimplemented);\nSSH_PACKET_CALLBACK(ssh_packet_disconnect_callback);\nSSH_PACKET_CALLBACK(ssh_packet_ignore_callback);\nSSH_PACKET_CALLBACK(ssh_packet_dh_reply);\nSSH_PACKET_CALLBACK(ssh_packet_newkeys);\nSSH_PACKET_CALLBACK(ssh_packet_service_accept);\nSSH_PACKET_CALLBACK(ssh_packet_ext_info);\n\n#ifdef WITH_SERVER\nSSH_PACKET_CALLBACK(ssh_packet_kexdh_init);\n#endif\n\nint ssh_packet_send_unimplemented(ssh_session session, uint32_t seqnum);\nint ssh_packet_parse_type(ssh_session session);\n//int packet_flush(ssh_session session, int enforce_blocking);\n\nint ssh_packet_socket_callback(const void *data, size_t len, void *user);\nvoid ssh_packet_register_socket_callback(ssh_session session, struct ssh_socket_struct *s);\nvoid ssh_packet_set_callbacks(ssh_session session, ssh_packet_callbacks callbacks);\nvoid ssh_packet_remove_callbacks(ssh_session session, ssh_packet_callbacks callbacks);\nvoid ssh_packet_set_default_callbacks(ssh_session session);\nvoid ssh_packet_process(ssh_session session, uint8_t type);\n\n/* PACKET CRYPT */\nuint32_t ssh_packet_decrypt_len(ssh_session session, uint8_t *destination, uint8_t *source);\nint ssh_packet_decrypt(ssh_session session, uint8_t *destination, uint8_t *source,\n        size_t start, size_t encrypted_size);\nunsigned char *ssh_packet_encrypt(ssh_session session,\n                                  void *packet,\n                                  unsigned int len);\nint ssh_packet_hmac_verify(ssh_session session, const void *data, size_t len,\n                           unsigned char *mac, enum ssh_hmac_e type);\nint ssh_packet_set_newkeys(ssh_session session,\n                           enum ssh_crypto_direction_e direction);\nstruct ssh_crypto_struct *ssh_packet_get_current_crypto(ssh_session session,\n        enum ssh_crypto_direction_e direction);\n\n#endif /* PACKET_H_ */\n"
  },
  {
    "path": "src/libssh/include/libssh/pcap.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2009 by Aris Adamantiadis\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef PCAP_H_\n#define PCAP_H_\n\n#include \"config.h\"\n#include \"libssh/libssh.h\"\n\n#ifdef WITH_PCAP\ntypedef struct ssh_pcap_context_struct* ssh_pcap_context;\n\nint ssh_pcap_file_write_packet(ssh_pcap_file pcap, ssh_buffer packet, uint32_t original_len);\n\nssh_pcap_context ssh_pcap_context_new(ssh_session session);\nvoid ssh_pcap_context_free(ssh_pcap_context ctx);\n\nenum ssh_pcap_direction{\n\tSSH_PCAP_DIR_IN,\n\tSSH_PCAP_DIR_OUT\n};\nvoid ssh_pcap_context_set_file(ssh_pcap_context, ssh_pcap_file);\nint ssh_pcap_context_write(ssh_pcap_context,enum ssh_pcap_direction direction, void *data,\n\t\tuint32_t len, uint32_t origlen);\n\n\n#endif /* WITH_PCAP */\n#endif /* PCAP_H_ */\n"
  },
  {
    "path": "src/libssh/include/libssh/pki.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2010 by Aris Adamantiadis\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef PKI_H_\n#define PKI_H_\n\n#include \"libssh/priv.h\"\n#ifdef HAVE_OPENSSL_EC_H\n#include <openssl/ec.h>\n#endif\n#ifdef HAVE_OPENSSL_ECDSA_H\n#include <openssl/ecdsa.h>\n#endif\n\n#include \"libssh/crypto.h\"\n#ifdef HAVE_OPENSSL_ED25519\n/* If using OpenSSL implementation, define the signature lenght which would be\n * defined in libssh/ed25519.h otherwise */\n#define ED25519_SIG_LEN 64\n#else\n#include \"libssh/ed25519.h\"\n#endif\n/* This definition is used for both OpenSSL and internal implementations */\n#define ED25519_KEY_LEN 32\n\n#define MAX_PUBKEY_SIZE 0x100000 /* 1M */\n#define MAX_PRIVKEY_SIZE 0x400000 /* 4M */\n\n#define SSH_KEY_FLAG_EMPTY   0x0\n#define SSH_KEY_FLAG_PUBLIC  0x0001\n#define SSH_KEY_FLAG_PRIVATE 0x0002\n\nstruct ssh_key_struct {\n    enum ssh_keytypes_e type;\n    int flags;\n    const char *type_c; /* Don't free it ! it is static */\n    int ecdsa_nid;\n#if defined(HAVE_LIBGCRYPT)\n    gcry_sexp_t dsa;\n    gcry_sexp_t rsa;\n    gcry_sexp_t ecdsa;\n#elif defined(HAVE_LIBMBEDCRYPTO)\n    mbedtls_pk_context *rsa;\n    mbedtls_ecdsa_context *ecdsa;\n    void *dsa;\n#elif defined(HAVE_LIBCRYPTO)\n    DSA *dsa;\n    RSA *rsa;\n# if defined(HAVE_OPENSSL_ECC)\n    EC_KEY *ecdsa;\n# else\n    void *ecdsa;\n# endif /* HAVE_OPENSSL_EC_H */\n#endif /* HAVE_LIBGCRYPT */\n#ifdef HAVE_OPENSSL_ED25519\n    uint8_t *ed25519_pubkey;\n    uint8_t *ed25519_privkey;\n#else\n    ed25519_pubkey *ed25519_pubkey;\n    ed25519_privkey *ed25519_privkey;\n#endif\n    void *cert;\n    enum ssh_keytypes_e cert_type;\n};\n\nstruct ssh_signature_struct {\n    enum ssh_keytypes_e type;\n    enum ssh_digest_e hash_type;\n    const char *type_c;\n#if defined(HAVE_LIBGCRYPT)\n    gcry_sexp_t dsa_sig;\n    gcry_sexp_t rsa_sig;\n    gcry_sexp_t ecdsa_sig;\n#elif defined(HAVE_LIBMBEDCRYPTO)\n    ssh_string rsa_sig;\n    struct mbedtls_ecdsa_sig ecdsa_sig;\n#endif /* HAVE_LIBGCRYPT */\n#ifndef HAVE_OPENSSL_ED25519\n    ed25519_signature *ed25519_sig;\n#endif\n    ssh_string raw_sig;\n};\n\ntypedef struct ssh_signature_struct *ssh_signature;\n\n/* SSH Key Functions */\nssh_key ssh_key_dup(const ssh_key key);\nvoid ssh_key_clean (ssh_key key);\n\nconst char *\nssh_key_get_signature_algorithm(ssh_session session,\n                                enum ssh_keytypes_e type);\nenum ssh_keytypes_e ssh_key_type_from_signature_name(const char *name);\nenum ssh_keytypes_e ssh_key_type_plain(enum ssh_keytypes_e type);\nenum ssh_digest_e ssh_key_type_to_hash(ssh_session session,\n                                       enum ssh_keytypes_e type);\nenum ssh_digest_e ssh_key_hash_from_name(const char *name);\n\n#define is_ecdsa_key_type(t) \\\n    ((t) >= SSH_KEYTYPE_ECDSA_P256 && (t) <= SSH_KEYTYPE_ECDSA_P521)\n\n#define is_cert_type(kt)\\\n      ((kt) == SSH_KEYTYPE_DSS_CERT01 ||\\\n       (kt) == SSH_KEYTYPE_RSA_CERT01 ||\\\n      ((kt) >= SSH_KEYTYPE_ECDSA_P256_CERT01 &&\\\n       (kt) <= SSH_KEYTYPE_ED25519_CERT01))\n\n/* SSH Signature Functions */\nssh_signature ssh_signature_new(void);\nvoid ssh_signature_free(ssh_signature sign);\n\nint ssh_pki_export_signature_blob(const ssh_signature sign,\n                                  ssh_string *sign_blob);\nint ssh_pki_import_signature_blob(const ssh_string sig_blob,\n                                  const ssh_key pubkey,\n                                  ssh_signature *psig);\nint ssh_pki_signature_verify(ssh_session session,\n                             ssh_signature sig,\n                             const ssh_key key,\n                             const unsigned char *digest,\n                             size_t dlen);\n\n/* SSH Public Key Functions */\nint ssh_pki_export_pubkey_blob(const ssh_key key,\n                               ssh_string *pblob);\nint ssh_pki_import_pubkey_blob(const ssh_string key_blob,\n                               ssh_key *pkey);\n\nint ssh_pki_import_cert_blob(const ssh_string cert_blob,\n                             ssh_key *pkey);\n\n\n/* SSH Signing Functions */\nssh_string ssh_pki_do_sign(ssh_session session, ssh_buffer sigbuf,\n    const ssh_key privatekey, enum ssh_digest_e hash_type);\nssh_string ssh_pki_do_sign_agent(ssh_session session,\n                                 struct ssh_buffer_struct *buf,\n                                 const ssh_key pubkey);\nssh_string ssh_srv_pki_do_sign_sessionid(ssh_session session,\n                                         const ssh_key privkey,\n                                         const enum ssh_digest_e digest);\n\n/* Temporary functions, to be removed after migration to ssh_key */\nssh_public_key ssh_pki_convert_key_to_publickey(const ssh_key key);\nssh_private_key ssh_pki_convert_key_to_privatekey(const ssh_key key);\n\nint ssh_key_algorithm_allowed(ssh_session session, const char *type);\n#endif /* PKI_H_ */\n"
  },
  {
    "path": "src/libssh/include/libssh/pki_priv.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2010 by Aris Adamantiadis\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef PKI_PRIV_H_\n#define PKI_PRIV_H_\n\n#include \"libssh/pki.h\"\n\n/* defined in bcrypt_pbkdf.c */\nint bcrypt_pbkdf(const char *pass,\n                 size_t passlen,\n                 const uint8_t *salt,\n                 size_t saltlen,\n                 uint8_t *key,\n                 size_t keylen,\n                 unsigned int rounds);\n\n#define RSA_HEADER_BEGIN \"-----BEGIN RSA PRIVATE KEY-----\"\n#define RSA_HEADER_END \"-----END RSA PRIVATE KEY-----\"\n#define DSA_HEADER_BEGIN \"-----BEGIN DSA PRIVATE KEY-----\"\n#define DSA_HEADER_END \"-----END DSA PRIVATE KEY-----\"\n#define ECDSA_HEADER_BEGIN \"-----BEGIN EC PRIVATE KEY-----\"\n#define ECDSA_HEADER_END \"-----END EC PRIVATE KEY-----\"\n#define OPENSSH_HEADER_BEGIN \"-----BEGIN OPENSSH PRIVATE KEY-----\"\n#define OPENSSH_HEADER_END \"-----END OPENSSH PRIVATE KEY-----\"\n/* Magic defined in OpenSSH/PROTOCOL.key */\n#define OPENSSH_AUTH_MAGIC      \"openssh-key-v1\"\n\nint pki_key_ecdsa_nid_from_name(const char *name);\nconst char *pki_key_ecdsa_nid_to_name(int nid);\nconst char *ssh_key_signature_to_char(enum ssh_keytypes_e type,\n                                      enum ssh_digest_e hash_type);\nenum ssh_digest_e ssh_key_type_to_hash(ssh_session session,\n                                       enum ssh_keytypes_e type);\n\n/* SSH Key Functions */\nssh_key pki_key_dup(const ssh_key key, int demote);\nint pki_key_generate_rsa(ssh_key key, int parameter);\nint pki_key_generate_dss(ssh_key key, int parameter);\nint pki_key_generate_ecdsa(ssh_key key, int parameter);\nint pki_key_generate_ed25519(ssh_key key);\n\nint pki_key_compare(const ssh_key k1,\n                    const ssh_key k2,\n                    enum ssh_keycmp_e what);\n\nint pki_key_check_hash_compatible(ssh_key key,\n                                  enum ssh_digest_e hash_type);\n/* SSH Private Key Functions */\nenum ssh_keytypes_e pki_privatekey_type_from_string(const char *privkey);\nssh_key pki_private_key_from_base64(const char *b64_key,\n                                    const char *passphrase,\n                                    ssh_auth_callback auth_fn,\n                                    void *auth_data);\n\nssh_string pki_private_key_to_pem(const ssh_key key,\n                                  const char *passphrase,\n                                  ssh_auth_callback auth_fn,\n                                  void *auth_data);\nint pki_import_privkey_buffer(enum ssh_keytypes_e type,\n                              ssh_buffer buffer,\n                              ssh_key *pkey);\n\n/* SSH Public Key Functions */\nint pki_pubkey_build_dss(ssh_key key,\n                         ssh_string p,\n                         ssh_string q,\n                         ssh_string g,\n                         ssh_string pubkey);\nint pki_pubkey_build_rsa(ssh_key key,\n                         ssh_string e,\n                         ssh_string n);\nint pki_pubkey_build_ecdsa(ssh_key key, int nid, ssh_string e);\nssh_string pki_publickey_to_blob(const ssh_key key);\n\n/* SSH Private Key Functions */\nint pki_privkey_build_dss(ssh_key key,\n                          ssh_string p,\n                          ssh_string q,\n                          ssh_string g,\n                          ssh_string pubkey,\n                          ssh_string privkey);\nint pki_privkey_build_rsa(ssh_key key,\n                          ssh_string n,\n                          ssh_string e,\n                          ssh_string d,\n                          ssh_string iqmp,\n                          ssh_string p,\n                          ssh_string q);\nint pki_privkey_build_ecdsa(ssh_key key,\n                            int nid,\n                            ssh_string e,\n                            ssh_string exp);\nssh_string pki_publickey_to_blob(const ssh_key key);\n\n/* SSH Signature Functions */\nssh_signature pki_sign_data(const ssh_key privkey,\n                            enum ssh_digest_e hash_type,\n                            const unsigned char *input,\n                            size_t input_len);\nint pki_verify_data_signature(ssh_signature signature,\n                              const ssh_key pubkey,\n                              const unsigned char *input,\n                              size_t input_len);\nssh_string pki_signature_to_blob(const ssh_signature sign);\nssh_signature pki_signature_from_blob(const ssh_key pubkey,\n                                      const ssh_string sig_blob,\n                                      enum ssh_keytypes_e type,\n                                      enum ssh_digest_e hash_type);\n\n/* SSH Signing Functions */\nssh_signature pki_do_sign(const ssh_key privkey,\n                          const unsigned char *input,\n                          size_t input_len,\n                          enum ssh_digest_e hash_type);\nssh_signature pki_do_sign_hash(const ssh_key privkey,\n                               const unsigned char *hash,\n                               size_t hlen,\n                               enum ssh_digest_e hash_type);\nint pki_ed25519_sign(const ssh_key privkey, ssh_signature sig,\n        const unsigned char *hash, size_t hlen);\nint pki_ed25519_verify(const ssh_key pubkey, ssh_signature sig,\n        const unsigned char *hash, size_t hlen);\nint pki_ed25519_key_cmp(const ssh_key k1,\n                const ssh_key k2,\n                enum ssh_keycmp_e what);\nint pki_ed25519_key_dup(ssh_key new, const ssh_key key);\nint pki_ed25519_public_key_to_blob(ssh_buffer buffer, ssh_key key);\nssh_string pki_ed25519_signature_to_blob(ssh_signature sig);\nint pki_signature_from_ed25519_blob(ssh_signature sig, ssh_string sig_blob);\nint pki_privkey_build_ed25519(ssh_key key,\n                              ssh_string pubkey,\n                              ssh_string privkey);\n\n/* PKI Container OpenSSH */\nssh_key ssh_pki_openssh_pubkey_import(const char *text_key);\nssh_key ssh_pki_openssh_privkey_import(const char *text_key,\n        const char *passphrase, ssh_auth_callback auth_fn, void *auth_data);\nssh_string ssh_pki_openssh_privkey_export(const ssh_key privkey,\n        const char *passphrase, ssh_auth_callback auth_fn, void *auth_data);\n\n#endif /* PKI_PRIV_H_ */\n"
  },
  {
    "path": "src/libssh/include/libssh/poll.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2009 by Aris Adamantiadis\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef POLL_H_\n#define POLL_H_\n\n#include \"config.h\"\n\n#ifdef HAVE_POLL\n\n#include <poll.h>\ntypedef struct pollfd ssh_pollfd_t;\n\n#else /* HAVE_POLL */\n\n/* poll emulation support */\n\ntypedef struct ssh_pollfd_struct {\n  socket_t fd;      /* file descriptor */\n  short events;     /* requested events */\n  short revents;    /* returned events */\n} ssh_pollfd_t;\n\ntypedef unsigned long int nfds_t;\n\n#ifdef _WIN32\n\n#ifndef POLLRDNORM\n#define POLLRDNORM  0x0100\n#endif\n#ifndef POLLRDBAND\n#define POLLRDBAND  0x0200\n#endif\n#ifndef POLLIN\n#define POLLIN      (POLLRDNORM | POLLRDBAND)\n#endif\n#ifndef POLLPRI\n#define POLLPRI     0x0400\n#endif\n\n#ifndef POLLWRNORM\n#define POLLWRNORM  0x0010\n#endif\n#ifndef POLLOUT\n#define POLLOUT     (POLLWRNORM)\n#endif\n#ifndef POLLWRBAND\n#define POLLWRBAND  0x0020\n#endif\n\n#ifndef POLLERR\n#define POLLERR     0x0001\n#endif\n#ifndef POLLHUP\n#define POLLHUP     0x0002\n#endif\n#ifndef POLLNVAL\n#define POLLNVAL    0x0004\n#endif\n\n#else /* _WIN32 */\n\n/* poll.c */\n#ifndef POLLIN\n#define POLLIN    0x001  /* There is data to read.  */\n#endif\n#ifndef POLLPRI\n#define POLLPRI   0x002  /* There is urgent data to read.  */\n#endif\n#ifndef POLLOUT\n#define POLLOUT   0x004  /* Writing now will not block.  */\n#endif\n\n#ifndef POLLERR\n#define POLLERR   0x008  /* Error condition.  */\n#endif\n#ifndef POLLHUP\n#define POLLHUP   0x010  /* Hung up.  */\n#endif\n#ifndef POLLNVAL\n#define POLLNVAL  0x020  /* Invalid polling request.  */\n#endif\n\n#ifndef POLLRDNORM\n#define POLLRDNORM  0x040 /* mapped to read fds_set */\n#endif\n#ifndef POLLRDBAND\n#define POLLRDBAND  0x080 /* mapped to exception fds_set */\n#endif\n#ifndef POLLWRNORM\n#define POLLWRNORM  0x100 /* mapped to write fds_set */\n#endif\n#ifndef POLLWRBAND\n#define POLLWRBAND  0x200 /* mapped to write fds_set */\n#endif\n\n#endif /* WIN32 */\n#endif /* HAVE_POLL */\n\nvoid ssh_poll_init(void);\nvoid ssh_poll_cleanup(void);\nint ssh_poll(ssh_pollfd_t *fds, nfds_t nfds, int timeout);\ntypedef struct ssh_poll_ctx_struct *ssh_poll_ctx;\ntypedef struct ssh_poll_handle_struct *ssh_poll_handle;\n\n/**\n * @brief SSH poll callback. This callback will be used when an event\n *                      caught on the socket.\n *\n * @param p             Poll object this callback belongs to.\n * @param fd            The raw socket.\n * @param revents       The current poll events on the socket.\n * @param userdata      Userdata to be passed to the callback function.\n *\n * @return              0 on success, < 0 if you removed the poll object from\n *                      its poll context.\n */\ntypedef int (*ssh_poll_callback)(ssh_poll_handle p, socket_t fd, int revents,\n    void *userdata);\n\nstruct ssh_socket_struct;\n\nssh_poll_handle ssh_poll_new(socket_t fd, short events, ssh_poll_callback cb,\n    void *userdata);\nvoid ssh_poll_free(ssh_poll_handle p);\nssh_poll_ctx ssh_poll_get_ctx(ssh_poll_handle p);\nshort ssh_poll_get_events(ssh_poll_handle p);\nvoid ssh_poll_set_events(ssh_poll_handle p, short events);\nvoid ssh_poll_add_events(ssh_poll_handle p, short events);\nvoid ssh_poll_remove_events(ssh_poll_handle p, short events);\nsocket_t ssh_poll_get_fd(ssh_poll_handle p);\nvoid ssh_poll_set_fd(ssh_poll_handle p, socket_t fd);\nvoid ssh_poll_set_callback(ssh_poll_handle p, ssh_poll_callback cb, void *userdata);\nssh_poll_ctx ssh_poll_ctx_new(size_t chunk_size);\nvoid ssh_poll_ctx_free(ssh_poll_ctx ctx);\nint ssh_poll_ctx_add(ssh_poll_ctx ctx, ssh_poll_handle p);\nint ssh_poll_ctx_add_socket (ssh_poll_ctx ctx, struct ssh_socket_struct *s);\nvoid ssh_poll_ctx_remove(ssh_poll_ctx ctx, ssh_poll_handle p);\nint ssh_poll_ctx_dopoll(ssh_poll_ctx ctx, int timeout);\nssh_poll_ctx ssh_poll_get_default_ctx(ssh_session session);\nint ssh_event_add_poll(ssh_event event, ssh_poll_handle p);\nvoid ssh_event_remove_poll(ssh_event event, ssh_poll_handle p);\n\n#endif /* POLL_H_ */\n"
  },
  {
    "path": "src/libssh/include/libssh/poly1305.h",
    "content": "/*\n * Public Domain poly1305 from Andrew Moon\n * poly1305-donna-unrolled.c from https://github.com/floodyberry/poly1305-donna\n */\n\n#ifndef POLY1305_H\n#define POLY1305_H\n\n#define POLY1305_KEYLEN    32\n#define POLY1305_TAGLEN    16\n\nvoid poly1305_auth(uint8_t out[POLY1305_TAGLEN], const uint8_t *m, size_t inlen,\n    const uint8_t key[POLY1305_KEYLEN])\n#ifdef HAVE_GCC_BOUNDED_ATTRIBUTE\n    __attribute__((__bounded__(__minbytes__, 1, POLY1305_TAGLEN)))\n    __attribute__((__bounded__(__buffer__, 2, 3)))\n    __attribute__((__bounded__(__minbytes__, 4, POLY1305_KEYLEN)))\n#endif\n    ;\n\n#endif\t/* POLY1305_H */\n"
  },
  {
    "path": "src/libssh/include/libssh/priv.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2003-2009 by Aris Adamantiadis\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/*\n * priv.h file\n * This include file contains everything you shouldn't deal with in\n * user programs. Consider that anything in this file might change\n * without notice; libssh.h file will keep backward compatibility\n * on binary & source\n */\n\n#ifndef _LIBSSH_PRIV_H\n#define _LIBSSH_PRIV_H\n\n#include <stdint.h>\n#include <stdlib.h>\n#include <string.h>\n#include <stdbool.h>\n\n#if !defined(HAVE_STRTOULL)\n# if defined(HAVE___STRTOULL)\n#  define strtoull __strtoull\n# elif defined(HAVE__STRTOUI64)\n#  define strtoull _strtoui64\n# elif defined(__hpux) && defined(__LP64__)\n#  define strtoull strtoul\n# else\n#  error \"no strtoull function found\"\n# endif\n#endif /* !defined(HAVE_STRTOULL) */\n\n#if !defined(HAVE_STRNDUP)\nchar *strndup(const char *s, size_t n);\n#endif /* ! HAVE_STRNDUP */\n\n#ifdef HAVE_BYTESWAP_H\n#include <byteswap.h>\n#endif\n\n#ifdef HAVE_ARPA_INET_H\n#include <arpa/inet.h>\n#endif\n\n#ifndef bswap_32\n#define bswap_32(x) \\\n    ((((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >>  8) | \\\n     (((x) & 0x0000ff00) <<  8) | (((x) & 0x000000ff) << 24))\n#endif\n\n#ifdef _WIN32\n\n/* Imitate define of inttypes.h */\n# ifndef PRIdS\n#  define PRIdS \"Id\"\n# endif\n\n# ifndef PRIu64\n#  if __WORDSIZE == 64\n#   define PRIu64 \"lu\"\n#  else\n#   define PRIu64 \"llu\"\n#  endif /* __WORDSIZE */\n# endif /* PRIu64 */\n\n# ifndef PRIu32\n#  define PRIu32 \"u\"\n# endif /* PRIu32 */\n\n# ifndef PRIx64\n#  if __WORDSIZE == 64\n#   define PRIx64 \"lx\"\n#  else\n#   define PRIx64 \"llx\"\n#  endif /* __WORDSIZE */\n# endif /* PRIx64 */\n\n# ifndef PRIx32\n#  define PRIx32 \"x\"\n# endif /* PRIx32 */\n\n# ifdef _MSC_VER\n#  include <stdio.h>\n#  include <stdarg.h> /* va_copy define check */\n\n/* On Microsoft compilers define inline to __inline on all others use inline */\n#  undef inline\n#  define inline __inline\n\n#  ifndef va_copy\n#   define va_copy(dest, src) (dest = src)\n#  endif\n\n#  define strcasecmp _stricmp\n#  define strncasecmp _strnicmp\n#  if ! defined(HAVE_ISBLANK)\n#   define isblank(ch) ((ch) == ' ' || (ch) == '\\t' || (ch) == '\\n' || (ch) == '\\r')\n#  endif\n\n#  define usleep(X) Sleep(((X)+1000)/1000)\n\n#  undef strtok_r\n#  define strtok_r strtok_s\n\n#  if defined(HAVE__SNPRINTF_S)\n#   undef snprintf\n#   define snprintf(d, n, ...) _snprintf_s((d), (n), _TRUNCATE, __VA_ARGS__)\n#  else /* HAVE__SNPRINTF_S */\n#   if defined(HAVE__SNPRINTF)\n#     undef snprintf\n#     define snprintf _snprintf\n#   else /* HAVE__SNPRINTF */\n#    if !defined(HAVE_SNPRINTF)\n#     error \"no snprintf compatible function found\"\n#    endif /* HAVE_SNPRINTF */\n#   endif /* HAVE__SNPRINTF */\n#  endif /* HAVE__SNPRINTF_S */\n\n#  if defined(HAVE__VSNPRINTF_S)\n#   undef vsnprintf\n#   define vsnprintf(s, n, f, v) _vsnprintf_s((s), (n), _TRUNCATE, (f), (v))\n#  else /* HAVE__VSNPRINTF_S */\n#   if defined(HAVE__VSNPRINTF)\n#    undef vsnprintf\n#    define vsnprintf _vsnprintf\n#   else\n#    if !defined(HAVE_VSNPRINTF)\n#     error \"No vsnprintf compatible function found\"\n#    endif /* HAVE_VSNPRINTF */\n#   endif /* HAVE__VSNPRINTF */\n#  endif /* HAVE__VSNPRINTF_S */\n\n#  ifndef _SSIZE_T_DEFINED\n#   undef ssize_t\n#   include <BaseTsd.h>\n    typedef _W64 SSIZE_T ssize_t;\n#   define _SSIZE_T_DEFINED\n#  endif /* _SSIZE_T_DEFINED */\n\n# endif /* _MSC_VER */\n\nstruct timeval;\nint gettimeofday(struct timeval *__p, void *__t);\n\n#define _XCLOSESOCKET closesocket\n\n#else /* _WIN32 */\n\n#include <unistd.h>\n#define PRIdS \"zd\"\n\n#define _XCLOSESOCKET close\n\n#endif /* _WIN32 */\n\n#include \"libssh/libssh.h\"\n#include \"libssh/callbacks.h\"\n\n/* some constants */\n#ifndef MAX_PACKAT_LEN\n#define MAX_PACKET_LEN 262144\n#endif\n#ifndef ERROR_BUFFERLEN\n#define ERROR_BUFFERLEN 1024\n#endif\n\n#ifndef CLIENT_BANNER_SSH2\n#define CLIENT_BANNER_SSH2 \"SSH-2.0-libssh_\" SSH_STRINGIFY(LIBSSH_VERSION)\n#endif /* CLIENT_BANNER_SSH2 */\n\n#ifndef KBDINT_MAX_PROMPT\n#define KBDINT_MAX_PROMPT 256 /* more than openssh's :) */\n#endif\n#ifndef MAX_BUF_SIZE\n#define MAX_BUF_SIZE 4096\n#endif\n\n#ifndef HAVE_COMPILER__FUNC__\n# ifdef HAVE_COMPILER__FUNCTION__\n#  define __func__ __FUNCTION__\n# else\n#  error \"Your system must provide a __func__ macro\"\n# endif\n#endif\n\n#if defined(HAVE_GCC_THREAD_LOCAL_STORAGE)\n# define LIBSSH_THREAD __thread\n#elif defined(HAVE_MSC_THREAD_LOCAL_STORAGE)\n# define LIBSSH_THREAD __declspec(thread)\n#else\n# define LIBSSH_THREAD\n#endif\n\n/*\n * This makes sure that the compiler doesn't optimize out the code\n *\n * Use it in a macro where the provided variable is 'x'.\n */\n#if defined(HAVE_GCC_VOLATILE_MEMORY_PROTECTION)\n# define LIBSSH_MEM_PROTECTION __asm__ volatile(\"\" : : \"r\"(&(x)) : \"memory\")\n#else\n# define LIBSSH_MEM_PROTECTION\n#endif\n\n/* forward declarations */\nstruct ssh_common_struct;\nstruct ssh_kex_struct;\n\nenum ssh_digest_e {\n    SSH_DIGEST_AUTO=0,\n    SSH_DIGEST_SHA1=1,\n    SSH_DIGEST_SHA256,\n    SSH_DIGEST_SHA384,\n    SSH_DIGEST_SHA512,\n};\n\nint ssh_get_key_params(ssh_session session,\n                       ssh_key *privkey,\n                       enum ssh_digest_e *digest);\n\n/* LOGGING */\nvoid ssh_log_function(int verbosity,\n                      const char *function,\n                      const char *buffer);\n#define SSH_LOG(priority, ...) \\\n    _ssh_log(priority, __func__, __VA_ARGS__)\n\n/* LEGACY */\nvoid ssh_log_common(struct ssh_common_struct *common,\n                    int verbosity,\n                    const char *function,\n                    const char *format, ...) PRINTF_ATTRIBUTE(4, 5);\n\n\n/* ERROR HANDLING */\n\n/* error handling structure */\nstruct error_struct {\n    int error_code;\n    char error_buffer[ERROR_BUFFERLEN];\n};\n\n#define ssh_set_error(error, code, ...) \\\n    _ssh_set_error(error, code, __func__, __VA_ARGS__)\nvoid _ssh_set_error(void *error,\n                    int code,\n                    const char *function,\n                    const char *descr, ...) PRINTF_ATTRIBUTE(4, 5);\n\n#define ssh_set_error_oom(error) \\\n    _ssh_set_error_oom(error, __func__)\nvoid _ssh_set_error_oom(void *error, const char *function);\n\n#define ssh_set_error_invalid(error) \\\n    _ssh_set_error_invalid(error, __func__)\nvoid _ssh_set_error_invalid(void *error, const char *function);\n\nvoid ssh_reset_error(void *error);\n\n/* server.c */\n#ifdef WITH_SERVER\nint ssh_auth_reply_default(ssh_session session,int partial);\nint ssh_auth_reply_success(ssh_session session, int partial);\n#endif\n/* client.c */\n\nint ssh_send_banner(ssh_session session, int is_server);\n\n/* connect.c */\nsocket_t ssh_connect_host_nonblocking(ssh_session session, const char *host,\n\t\tconst char *bind_addr, int port);\n\n/* in base64.c */\nssh_buffer base64_to_bin(const char *source);\nuint8_t *bin_to_base64(const uint8_t *source, size_t len);\n\n/* gzip.c */\nint compress_buffer(ssh_session session,ssh_buffer buf);\nint decompress_buffer(ssh_session session,ssh_buffer buf, size_t maxlen);\n\n/* match.c */\nint match_pattern_list(const char *string, const char *pattern,\n    unsigned int len, int dolower);\nint match_hostname(const char *host, const char *pattern, unsigned int len);\n\n/* connector.c */\nint ssh_connector_set_event(ssh_connector connector, ssh_event event);\nint ssh_connector_remove_event(ssh_connector connector);\n\n#ifndef MIN\n#define MIN(a,b) ((a) < (b) ? (a) : (b))\n#endif\n\n#ifndef MAX\n#define MAX(a,b) ((a) > (b) ? (a) : (b))\n#endif\n\n/** Free memory space */\n#define SAFE_FREE(x) do { if ((x) != NULL) {free(x); x=NULL;} } while(0)\n\n/** Zero a structure */\n#define ZERO_STRUCT(x) memset((char *)&(x), 0, sizeof(x))\n\n/** Zero a structure given a pointer to the structure */\n#define ZERO_STRUCTP(x) do { if ((x) != NULL) memset((char *)(x), 0, sizeof(*(x))); } while(0)\n\n/** Get the size of an array */\n#define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0]))\n\n#ifndef HAVE_EXPLICIT_BZERO\nvoid explicit_bzero(void *s, size_t n);\n#endif /* !HAVE_EXPLICIT_BZERO */\n\n/**\n * This is a hack to fix warnings. The idea is to use this everywhere that we\n * get the \"discarding const\" warning by the compiler. That doesn't actually\n * fix the real issue, but marks the place and you can search the code for\n * discard_const.\n *\n * Please use this macro only when there is no other way to fix the warning.\n * We should use this function in only in a very few places.\n *\n * Also, please call this via the discard_const_p() macro interface, as that\n * makes the return type safe.\n */\n#define discard_const(ptr) ((void *)((uintptr_t)(ptr)))\n\n/**\n * Type-safe version of discard_const\n */\n#define discard_const_p(type, ptr) ((type *)discard_const(ptr))\n\n/**\n * Get the argument cound of variadic arguments\n */\n/*\n * Since MSVC 2010 there is a bug in passing __VA_ARGS__ to subsequent\n * macros as a single token, which results in:\n *    warning C4003: not enough actual parameters for macro '_VA_ARG_N'\n *  and incorrect behavior. This fixes issue.\n */\n#define VA_APPLY_VARIADIC_MACRO(macro, tuple) macro tuple\n\n#define __VA_NARG__(...) \\\n        (__VA_NARG_(__VA_ARGS__, __RSEQ_N()))\n#define __VA_NARG_(...) \\\n        VA_APPLY_VARIADIC_MACRO(__VA_ARG_N, (__VA_ARGS__))\n#define __VA_ARG_N( \\\n         _1, _2, _3, _4, _5, _6, _7, _8, _9,_10, \\\n        _11,_12,_13,_14,_15,_16,_17,_18,_19,_20, \\\n        _21,_22,_23,_24,_25,_26,_27,_28,_29,_30, \\\n        _31,_32,_33,_34,_35,_36,_37,_38,_39,_40, \\\n        _41,_42,_43,_44,_45,_46,_47,_48,_49,_50, \\\n        _51,_52,_53,_54,_55,_56,_57,_58,_59,_60, \\\n        _61,_62,_63,N,...) N\n#define __RSEQ_N() \\\n        63, 62, 61, 60,                         \\\n        59, 58, 57, 56, 55, 54, 53, 52, 51, 50, \\\n        49, 48, 47, 46, 45, 44, 43, 42, 41, 40, \\\n        39, 38, 37, 36, 35, 34, 33, 32, 31, 30, \\\n        29, 28, 27, 26, 25, 24, 23, 22, 21, 20, \\\n        19, 18, 17, 16, 15, 14, 13, 12, 11, 10, \\\n         9,  8,  7,  6,  5,  4,  3,  2,  1,  0\n\n#define CLOSE_SOCKET(s) do { if ((s) != SSH_INVALID_SOCKET) { _XCLOSESOCKET(s); (s) = SSH_INVALID_SOCKET;} } while(0)\n\n#ifndef HAVE_HTONLL\n# ifdef WORDS_BIGENDIAN\n#  define htonll(x) (x)\n# else\n#  define htonll(x) \\\n    (((uint64_t)htonl((x) & 0xFFFFFFFF) << 32) | htonl((x) >> 32))\n# endif\n#endif\n\n#ifndef HAVE_NTOHLL\n# ifdef WORDS_BIGENDIAN\n#  define ntohll(x) (x)\n# else\n#  define ntohll(x) \\\n    (((uint64_t)ntohl((x) & 0xFFFFFFFF) << 32) | ntohl((x) >> 32))\n# endif\n#endif\n\n#ifndef FALL_THROUGH\n# ifdef HAVE_FALLTHROUGH_ATTRIBUTE\n#  define FALL_THROUGH __attribute__ ((fallthrough))\n# else /* HAVE_FALLTHROUGH_ATTRIBUTE */\n#  define FALL_THROUGH\n# endif /* HAVE_FALLTHROUGH_ATTRIBUTE */\n#endif /* FALL_THROUGH */\n\n#ifndef __attr_unused__\n# ifdef HAVE_UNUSED_ATTRIBUTE\n#  define __attr_unused__ __attribute__((unused))\n# else /* HAVE_UNUSED_ATTRIBUTE */\n#  define __attr_unused__\n# endif /* HAVE_UNUSED_ATTRIBUTE */\n#endif /* __attr_unused__ */\n\n#ifndef UNUSED_PARAM\n#define UNUSED_PARAM(param) param __attr_unused__\n#endif /* UNUSED_PARAM */\n\n#ifndef UNUSED_VAR\n#define UNUSED_VAR(var) __attr_unused__ var\n#endif /* UNUSED_VAR */\n\nvoid ssh_agent_state_free(void *data);\n\nbool is_ssh_initialized(void);\n\n#endif /* _LIBSSH_PRIV_H */\n"
  },
  {
    "path": "src/libssh/include/libssh/sc25519.h",
    "content": "/* $OpenBSD: sc25519.h,v 1.3 2013/12/09 11:03:45 markus Exp $ */\n\n/*\n * Public Domain, Authors: Daniel J. Bernstein, Niels Duif, Tanja Lange,\n * Peter Schwabe, Bo-Yin Yang.\n * Copied from supercop-20130419/crypto_sign/ed25519/ref/sc25519.h\n */\n\n#ifndef SC25519_H\n#define SC25519_H\n\n#define sc25519                  crypto_sign_ed25519_ref_sc25519\n#define shortsc25519             crypto_sign_ed25519_ref_shortsc25519\n#define sc25519_from32bytes      crypto_sign_ed25519_ref_sc25519_from32bytes\n#define shortsc25519_from16bytes crypto_sign_ed25519_ref_shortsc25519_from16bytes\n#define sc25519_from64bytes      crypto_sign_ed25519_ref_sc25519_from64bytes\n#define sc25519_from_shortsc     crypto_sign_ed25519_ref_sc25519_from_shortsc\n#define sc25519_to32bytes        crypto_sign_ed25519_ref_sc25519_to32bytes\n#define sc25519_iszero_vartime   crypto_sign_ed25519_ref_sc25519_iszero_vartime\n#define sc25519_isshort_vartime  crypto_sign_ed25519_ref_sc25519_isshort_vartime\n#define sc25519_lt_vartime       crypto_sign_ed25519_ref_sc25519_lt_vartime\n#define sc25519_add              crypto_sign_ed25519_ref_sc25519_add\n#define sc25519_sub_nored        crypto_sign_ed25519_ref_sc25519_sub_nored\n#define sc25519_mul              crypto_sign_ed25519_ref_sc25519_mul\n#define sc25519_mul_shortsc      crypto_sign_ed25519_ref_sc25519_mul_shortsc\n#define sc25519_window3          crypto_sign_ed25519_ref_sc25519_window3\n#define sc25519_window5          crypto_sign_ed25519_ref_sc25519_window5\n#define sc25519_2interleave2     crypto_sign_ed25519_ref_sc25519_2interleave2\n\ntypedef struct {\n  uint32_t v[32];\n} sc25519;\n\ntypedef struct {\n  uint32_t v[16];\n} shortsc25519;\n\nvoid sc25519_from32bytes(sc25519 *r, const unsigned char x[32]);\n\nvoid shortsc25519_from16bytes(shortsc25519 *r, const unsigned char x[16]);\n\nvoid sc25519_from64bytes(sc25519 *r, const unsigned char x[64]);\n\nvoid sc25519_from_shortsc(sc25519 *r, const shortsc25519 *x);\n\nvoid sc25519_to32bytes(unsigned char r[32], const sc25519 *x);\n\nint sc25519_iszero_vartime(const sc25519 *x);\n\nint sc25519_isshort_vartime(const sc25519 *x);\n\nint sc25519_lt_vartime(const sc25519 *x, const sc25519 *y);\n\nvoid sc25519_add(sc25519 *r, const sc25519 *x, const sc25519 *y);\n\nvoid sc25519_sub_nored(sc25519 *r, const sc25519 *x, const sc25519 *y);\n\nvoid sc25519_mul(sc25519 *r, const sc25519 *x, const sc25519 *y);\n\nvoid sc25519_mul_shortsc(sc25519 *r, const sc25519 *x, const shortsc25519 *y);\n\n/* Convert s into a representation of the form \\sum_{i=0}^{84}r[i]2^3\n * with r[i] in {-4,...,3}\n */\nvoid sc25519_window3(signed char r[85], const sc25519 *s);\n\n/* Convert s into a representation of the form \\sum_{i=0}^{50}r[i]2^5\n * with r[i] in {-16,...,15}\n */\nvoid sc25519_window5(signed char r[51], const sc25519 *s);\n\nvoid sc25519_2interleave2(unsigned char r[127], const sc25519 *s1, const sc25519 *s2);\n\n#endif\n"
  },
  {
    "path": "src/libssh/include/libssh/scp.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2003-2009 by Aris Adamantiadis\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef _SCP_H\n#define _SCP_H\n\nenum ssh_scp_states {\n  SSH_SCP_NEW,          //Data structure just created\n  SSH_SCP_WRITE_INITED, //Gave our intention to write\n  SSH_SCP_WRITE_WRITING,//File was opened and currently writing\n  SSH_SCP_READ_INITED,  //Gave our intention to read\n  SSH_SCP_READ_REQUESTED, //We got a read request\n  SSH_SCP_READ_READING, //File is opened and reading\n  SSH_SCP_ERROR,         //Something bad happened\n  SSH_SCP_TERMINATED\t//Transfer finished\n};\n\nstruct ssh_scp_struct {\n  ssh_session session;\n  int mode;\n  int recursive;\n  ssh_channel channel;\n  char *location;\n  enum ssh_scp_states state;\n  uint64_t filelen;\n  uint64_t processed;\n  enum ssh_scp_request_types request_type;\n  char *request_name;\n  char *warning;\n  int request_mode;\n};\n\nint ssh_scp_read_string(ssh_scp scp, char *buffer, size_t len);\nint ssh_scp_integer_mode(const char *mode);\nchar *ssh_scp_string_mode(int mode);\nint ssh_scp_response(ssh_scp scp, char **response);\n\n#endif\n"
  },
  {
    "path": "src/libssh/include/libssh/server.h",
    "content": "/* Public include file for server support */\n/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2003-2008 by Aris Adamantiadis\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @defgroup libssh_server The libssh server API\n *\n * @{\n */\n\n#ifndef SERVER_H\n#define SERVER_H\n\n#include \"libssh/libssh.h\"\n#define SERVERBANNER CLIENTBANNER\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nenum ssh_bind_options_e {\n  SSH_BIND_OPTIONS_BINDADDR,\n  SSH_BIND_OPTIONS_BINDPORT,\n  SSH_BIND_OPTIONS_BINDPORT_STR,\n  SSH_BIND_OPTIONS_HOSTKEY,\n  SSH_BIND_OPTIONS_DSAKEY,\n  SSH_BIND_OPTIONS_RSAKEY,\n  SSH_BIND_OPTIONS_BANNER,\n  SSH_BIND_OPTIONS_LOG_VERBOSITY,\n  SSH_BIND_OPTIONS_LOG_VERBOSITY_STR,\n  SSH_BIND_OPTIONS_ECDSAKEY,\n  SSH_BIND_OPTIONS_IMPORT_KEY,\n  SSH_BIND_OPTIONS_KEY_EXCHANGE,\n  SSH_BIND_OPTIONS_CIPHERS_C_S,\n  SSH_BIND_OPTIONS_CIPHERS_S_C,\n  SSH_BIND_OPTIONS_HMAC_C_S,\n  SSH_BIND_OPTIONS_HMAC_S_C,\n  SSH_BIND_OPTIONS_CONFIG_DIR,\n  SSH_BIND_OPTIONS_PUBKEY_ACCEPTED_KEY_TYPES,\n  SSH_BIND_OPTIONS_HOSTKEY_ALGORITHMS,\n  SSH_BIND_OPTIONS_PROCESS_CONFIG,\n};\n\ntypedef struct ssh_bind_struct* ssh_bind;\n\n/* Callback functions */\n\n/**\n * @brief Incoming connection callback. This callback is called when a ssh_bind\n *        has a new incoming connection.\n * @param sshbind Current sshbind session handler\n * @param userdata Userdata to be passed to the callback function.\n */\ntypedef void (*ssh_bind_incoming_connection_callback) (ssh_bind sshbind,\n    void *userdata);\n\n/**\n * @brief These are the callbacks exported by the ssh_bind structure.\n *\n * They are called by the server module when events appear on the network.\n */\nstruct ssh_bind_callbacks_struct {\n  /** DON'T SET THIS use ssh_callbacks_init() instead. */\n  size_t size;\n  /** A new connection is available. */\n  ssh_bind_incoming_connection_callback incoming_connection;\n};\ntypedef struct ssh_bind_callbacks_struct *ssh_bind_callbacks;\n\n/**\n * @brief Creates a new SSH server bind.\n *\n * @return A newly allocated ssh_bind session pointer.\n */\nLIBSSH_API ssh_bind ssh_bind_new(void);\n\nLIBSSH_API int ssh_bind_options_set(ssh_bind sshbind,\n    enum ssh_bind_options_e type, const void *value);\n\nLIBSSH_API int ssh_bind_options_parse_config(ssh_bind sshbind,\n    const char *filename);\n\n/**\n * @brief Start listening to the socket.\n *\n * @param  ssh_bind_o     The ssh server bind to use.\n *\n * @return 0 on success, < 0 on error.\n */\nLIBSSH_API int ssh_bind_listen(ssh_bind ssh_bind_o);\n\n/**\n * @brief Set the callback for this bind.\n *\n * @param[in] sshbind   The bind to set the callback on.\n *\n * @param[in] callbacks An already set up ssh_bind_callbacks instance.\n *\n * @param[in] userdata  A pointer to private data to pass to the callbacks.\n *\n * @return              SSH_OK on success, SSH_ERROR if an error occured.\n *\n * @code\n *     struct ssh_callbacks_struct cb = {\n *         .userdata = data,\n *         .auth_function = my_auth_function\n *     };\n *     ssh_callbacks_init(&cb);\n *     ssh_bind_set_callbacks(session, &cb);\n * @endcode\n */\nLIBSSH_API int ssh_bind_set_callbacks(ssh_bind sshbind, ssh_bind_callbacks callbacks,\n    void *userdata);\n\n/**\n * @brief  Set the session to blocking/nonblocking mode.\n *\n * @param  ssh_bind_o     The ssh server bind to use.\n *\n * @param  blocking     Zero for nonblocking mode.\n */\nLIBSSH_API void ssh_bind_set_blocking(ssh_bind ssh_bind_o, int blocking);\n\n/**\n * @brief Recover the file descriptor from the session.\n *\n * @param  ssh_bind_o     The ssh server bind to get the fd from.\n *\n * @return The file descriptor.\n */\nLIBSSH_API socket_t ssh_bind_get_fd(ssh_bind ssh_bind_o);\n\n/**\n * @brief Set the file descriptor for a session.\n *\n * @param  ssh_bind_o     The ssh server bind to set the fd.\n *\n * @param  fd           The file descriptssh_bind B\n */\nLIBSSH_API void ssh_bind_set_fd(ssh_bind ssh_bind_o, socket_t fd);\n\n/**\n * @brief Allow the file descriptor to accept new sessions.\n *\n * @param  ssh_bind_o     The ssh server bind to use.\n */\nLIBSSH_API void ssh_bind_fd_toaccept(ssh_bind ssh_bind_o);\n\n/**\n * @brief Accept an incoming ssh connection and initialize the session.\n *\n * @param  ssh_bind_o     The ssh server bind to accept a connection.\n * @param  session\t\t\tA preallocated ssh session\n * @see ssh_new\n * @return SSH_OK when a connection is established\n */\nLIBSSH_API int ssh_bind_accept(ssh_bind ssh_bind_o, ssh_session session);\n\n/**\n * @brief Accept an incoming ssh connection on the given file descriptor\n *        and initialize the session.\n *\n * @param  ssh_bind_o     The ssh server bind to accept a connection.\n * @param  session        A preallocated ssh session\n * @param  fd             A file descriptor of an already established TCP\n *                          inbound connection\n * @see ssh_new\n * @see ssh_bind_accept\n * @return SSH_OK when a connection is established\n */\nLIBSSH_API int ssh_bind_accept_fd(ssh_bind ssh_bind_o, ssh_session session,\n        socket_t fd);\n\nLIBSSH_API ssh_gssapi_creds ssh_gssapi_get_creds(ssh_session session);\n\n/**\n * @brief Handles the key exchange and set up encryption\n *\n * @param  session\t\t\tA connected ssh session\n * @see ssh_bind_accept\n * @return SSH_OK if the key exchange was successful\n */\nLIBSSH_API int ssh_handle_key_exchange(ssh_session session);\n\n/**\n * @brief Initialize the set of key exchange, hostkey, ciphers, MACs, and\n *        compression algorithms for the given ssh_session.\n *\n * The selection of algorithms and keys used are determined by the\n * options that are currently set in the given ssh_session structure.\n * May only be called before the initial key exchange has begun.\n *\n * @param session  The session structure to initialize.\n *\n * @see ssh_handle_key_exchange\n * @see ssh_options_set\n *\n * @return SSH_OK if initialization succeeds.\n */\n\nLIBSSH_API int ssh_server_init_kex(ssh_session session);\n\n/**\n * @brief Free a ssh servers bind.\n *\n * @param  ssh_bind_o     The ssh server bind to free.\n */\nLIBSSH_API void ssh_bind_free(ssh_bind ssh_bind_o);\n\n/**\n * @brief Set the acceptable authentication methods to be sent to the client.\n *\n *\n * @param[in]  session  The server session\n *\n * @param[in]  auth_methods The authentication methods we will support, which\n *                          can be bitwise-or'd.\n *\n *                          Supported methods are:\n *\n *                          SSH_AUTH_METHOD_PASSWORD\n *                          SSH_AUTH_METHOD_PUBLICKEY\n *                          SSH_AUTH_METHOD_HOSTBASED\n *                          SSH_AUTH_METHOD_INTERACTIVE\n *                          SSH_AUTH_METHOD_GSSAPI_MIC\n */\nLIBSSH_API void ssh_set_auth_methods(ssh_session session, int auth_methods);\n\n/**********************************************************\n * SERVER MESSAGING\n **********************************************************/\n\n/**\n * @brief Reply with a standard reject message.\n *\n * Use this function if you don't know what to respond or if you want to reject\n * a request.\n *\n * @param[in] msg       The message to use for the reply.\n *\n * @return              0 on success, -1 on error.\n *\n * @see ssh_message_get()\n */\nLIBSSH_API int ssh_message_reply_default(ssh_message msg);\n\n/**\n * @brief Get the name of the authenticated user.\n *\n * @param[in] msg       The message to get the username from.\n *\n * @return              The username or NULL if an error occured.\n *\n * @see ssh_message_get()\n * @see ssh_message_type()\n */\nLIBSSH_API const char *ssh_message_auth_user(ssh_message msg);\n\n/**\n * @brief Get the password of the authenticated user.\n *\n * @param[in] msg       The message to get the password from.\n *\n * @return              The username or NULL if an error occured.\n *\n * @see ssh_message_get()\n * @see ssh_message_type()\n */\nLIBSSH_API const char *ssh_message_auth_password(ssh_message msg);\n\n/**\n * @brief Get the publickey of the authenticated user.\n *\n * If you need the key for later user you should duplicate it.\n *\n * @param[in] msg       The message to get the public key from.\n *\n * @return              The public key or NULL.\n *\n * @see ssh_key_dup()\n * @see ssh_key_cmp()\n * @see ssh_message_get()\n * @see ssh_message_type()\n */\nLIBSSH_API ssh_key ssh_message_auth_pubkey(ssh_message msg);\n\nLIBSSH_API int ssh_message_auth_kbdint_is_response(ssh_message msg);\nLIBSSH_API enum ssh_publickey_state_e ssh_message_auth_publickey_state(ssh_message msg);\nLIBSSH_API int ssh_message_auth_reply_success(ssh_message msg,int partial);\nLIBSSH_API int ssh_message_auth_reply_pk_ok(ssh_message msg, ssh_string algo, ssh_string pubkey);\nLIBSSH_API int ssh_message_auth_reply_pk_ok_simple(ssh_message msg);\n\nLIBSSH_API int ssh_message_auth_set_methods(ssh_message msg, int methods);\n\nLIBSSH_API int ssh_message_auth_interactive_request(ssh_message msg,\n                    const char *name, const char *instruction,\n                    unsigned int num_prompts, const char **prompts, char *echo);\n\nLIBSSH_API int ssh_message_service_reply_success(ssh_message msg);\nLIBSSH_API const char *ssh_message_service_service(ssh_message msg);\n\nLIBSSH_API int ssh_message_global_request_reply_success(ssh_message msg,\n                                                        uint16_t bound_port);\n\nLIBSSH_API void ssh_set_message_callback(ssh_session session,\n    int(*ssh_bind_message_callback)(ssh_session session, ssh_message msg, void *data),\n    void *data);\nLIBSSH_API int ssh_execute_message_callbacks(ssh_session session);\n\nLIBSSH_API const char *ssh_message_channel_request_open_originator(ssh_message msg);\nLIBSSH_API int ssh_message_channel_request_open_originator_port(ssh_message msg);\nLIBSSH_API const char *ssh_message_channel_request_open_destination(ssh_message msg);\nLIBSSH_API int ssh_message_channel_request_open_destination_port(ssh_message msg);\n\nLIBSSH_API ssh_channel ssh_message_channel_request_channel(ssh_message msg);\n\nLIBSSH_API const char *ssh_message_channel_request_pty_term(ssh_message msg);\nLIBSSH_API int ssh_message_channel_request_pty_width(ssh_message msg);\nLIBSSH_API int ssh_message_channel_request_pty_height(ssh_message msg);\nLIBSSH_API int ssh_message_channel_request_pty_pxwidth(ssh_message msg);\nLIBSSH_API int ssh_message_channel_request_pty_pxheight(ssh_message msg);\n\nLIBSSH_API const char *ssh_message_channel_request_env_name(ssh_message msg);\nLIBSSH_API const char *ssh_message_channel_request_env_value(ssh_message msg);\n\nLIBSSH_API const char *ssh_message_channel_request_command(ssh_message msg);\n\nLIBSSH_API const char *ssh_message_channel_request_subsystem(ssh_message msg);\n\nLIBSSH_API int ssh_message_channel_request_x11_single_connection(ssh_message msg);\nLIBSSH_API const char *ssh_message_channel_request_x11_auth_protocol(ssh_message msg);\nLIBSSH_API const char *ssh_message_channel_request_x11_auth_cookie(ssh_message msg);\nLIBSSH_API int ssh_message_channel_request_x11_screen_number(ssh_message msg);\n\nLIBSSH_API const char *ssh_message_global_request_address(ssh_message msg);\nLIBSSH_API int ssh_message_global_request_port(ssh_message msg);\n\nLIBSSH_API int ssh_channel_open_reverse_forward(ssh_channel channel, const char *remotehost,\n    int remoteport, const char *sourcehost, int localport);\nLIBSSH_API int ssh_channel_open_x11(ssh_channel channel, \n                                        const char *orig_addr, int orig_port);\n\nLIBSSH_API int ssh_channel_request_send_exit_status(ssh_channel channel,\n                                                int exit_status);\nLIBSSH_API int ssh_channel_request_send_exit_signal(ssh_channel channel,\n                                                const char *signum,\n                                                int core,\n                                                const char *errmsg,\n                                                const char *lang);\n\nLIBSSH_API int ssh_send_keepalive(ssh_session session);\n\n/* deprecated functions */\nSSH_DEPRECATED LIBSSH_API int ssh_accept(ssh_session session);\nSSH_DEPRECATED LIBSSH_API int channel_write_stderr(ssh_channel channel,\n        const void *data, uint32_t len);\n\n#ifdef __cplusplus\n}\n#endif /* __cplusplus */\n\n#endif /* SERVER_H */\n\n/** @} */\n"
  },
  {
    "path": "src/libssh/include/libssh/session.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2009 by Aris Adamantiadis\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef SESSION_H_\n#define SESSION_H_\n#include <stdbool.h>\n\n#include \"libssh/priv.h\"\n#include \"libssh/kex.h\"\n#include \"libssh/packet.h\"\n#include \"libssh/pcap.h\"\n#include \"libssh/auth.h\"\n#include \"libssh/channels.h\"\n#include \"libssh/poll.h\"\n#include \"libssh/config.h\"\n#include \"libssh/misc.h\"\n\n/* These are the different states a SSH session can be into its life */\nenum ssh_session_state_e {\n\tSSH_SESSION_STATE_NONE=0,\n\tSSH_SESSION_STATE_CONNECTING,\n\tSSH_SESSION_STATE_SOCKET_CONNECTED,\n\tSSH_SESSION_STATE_BANNER_RECEIVED,\n\tSSH_SESSION_STATE_INITIAL_KEX,\n\tSSH_SESSION_STATE_KEXINIT_RECEIVED,\n\tSSH_SESSION_STATE_DH,\n\tSSH_SESSION_STATE_AUTHENTICATING,\n\tSSH_SESSION_STATE_AUTHENTICATED,\n\tSSH_SESSION_STATE_ERROR,\n\tSSH_SESSION_STATE_DISCONNECTED\n};\n\nenum ssh_dh_state_e {\n  DH_STATE_INIT=0,\n  DH_STATE_GROUP_SENT,\n  DH_STATE_REQUEST_SENT,\n  DH_STATE_INIT_SENT,\n  DH_STATE_NEWKEYS_SENT,\n  DH_STATE_FINISHED\n};\n\nenum ssh_pending_call_e {\n\tSSH_PENDING_CALL_NONE = 0,\n\tSSH_PENDING_CALL_CONNECT,\n\tSSH_PENDING_CALL_AUTH_NONE,\n\tSSH_PENDING_CALL_AUTH_PASSWORD,\n\tSSH_PENDING_CALL_AUTH_OFFER_PUBKEY,\n\tSSH_PENDING_CALL_AUTH_PUBKEY,\n\tSSH_PENDING_CALL_AUTH_AGENT,\n\tSSH_PENDING_CALL_AUTH_KBDINT_INIT,\n\tSSH_PENDING_CALL_AUTH_KBDINT_SEND,\n\tSSH_PENDING_CALL_AUTH_GSSAPI_MIC\n};\n\n/* libssh calls may block an undefined amount of time */\n#define SSH_SESSION_FLAG_BLOCKING 1\n\n/* Client successfully authenticated */\n#define SSH_SESSION_FLAG_AUTHENTICATED 2\n\n/* codes to use with ssh_handle_packets*() */\n/* Infinite timeout */\n#define SSH_TIMEOUT_INFINITE -1\n/* Use the timeout defined by user if any. Mostly used with new connections */\n#define SSH_TIMEOUT_USER -2\n/* Use the default timeout, depending on ssh_is_blocking() */\n#define SSH_TIMEOUT_DEFAULT -3\n/* Don't block at all */\n#define SSH_TIMEOUT_NONBLOCKING 0\n\n/* options flags */\n/* Authentication with *** allowed */\n#define SSH_OPT_FLAG_PASSWORD_AUTH 0x1\n#define SSH_OPT_FLAG_PUBKEY_AUTH 0x2\n#define SSH_OPT_FLAG_KBDINT_AUTH 0x4\n#define SSH_OPT_FLAG_GSSAPI_AUTH 0x8\n\n/* extensions flags */\n/* negotiation enabled */\n#define SSH_EXT_NEGOTIATION     0x01\n/* server-sig-algs extension */\n#define SSH_EXT_SIG_RSA_SHA256  0x02\n#define SSH_EXT_SIG_RSA_SHA512  0x04\n\n/* members that are common to ssh_session and ssh_bind */\nstruct ssh_common_struct {\n    struct error_struct error;\n    ssh_callbacks callbacks; /* Callbacks to user functions */\n    int log_verbosity; /* verbosity of the log functions */\n};\n\nstruct ssh_session_struct {\n    struct ssh_common_struct common;\n    struct ssh_socket_struct *socket;\n    char *serverbanner;\n    char *clientbanner;\n    int protoversion;\n    int server;\n    int client;\n    int openssh;\n    uint32_t send_seq;\n    uint32_t recv_seq;\n    struct ssh_timestamp last_rekey_time;\n\n    int connected;\n    /* !=0 when the user got a session handle */\n    int alive;\n    /* two previous are deprecated */\n    /* int auth_service_asked; */\n\n    /* session flags (SSH_SESSION_FLAG_*) */\n    int flags;\n\n    /* Extensions negotiated using RFC 8308 */\n    uint32_t extensions;\n\n    ssh_string banner; /* that's the issue banner from\n                       the server */\n    char *discon_msg; /* disconnect message from\n                         the remote host */\n    ssh_buffer in_buffer;\n    PACKET in_packet;\n    ssh_buffer out_buffer;\n    struct ssh_list *out_queue; /* This list is used for delaying packets\n                                   when rekeying is required */\n\n    /* the states are used by the nonblocking stuff to remember */\n    /* where it was before being interrupted */\n    enum ssh_pending_call_e pending_call_state;\n    enum ssh_session_state_e session_state;\n    enum ssh_packet_state_e packet_state;\n    enum ssh_dh_state_e dh_handshake_state;\n    enum ssh_channel_request_state_e global_req_state;\n    struct ssh_agent_state_struct *agent_state;\n\n    struct {\n        struct ssh_auth_auto_state_struct *auto_state;\n        enum ssh_auth_service_state_e service_state;\n        enum ssh_auth_state_e state;\n        uint32_t supported_methods;\n        uint32_t current_method;\n    } auth;\n\n    /*\n     * RFC 4253, 7.1: if the first_kex_packet_follows flag was set in\n     * the received SSH_MSG_KEXINIT, but the guess was wrong, this\n     * field will be set such that the following guessed packet will\n     * be ignored.  Once that packet has been received and ignored,\n     * this field is cleared.\n     */\n    int first_kex_follows_guess_wrong;\n\n    ssh_buffer in_hashbuf;\n    ssh_buffer out_hashbuf;\n    struct ssh_crypto_struct *current_crypto;\n    struct ssh_crypto_struct *next_crypto;  /* next_crypto is going to be used after a SSH2_MSG_NEWKEYS */\n\n    struct ssh_list *channels; /* linked list of channels */\n    int maxchannel;\n    ssh_agent agent; /* ssh agent */\n\n/* keyb interactive data */\n    struct ssh_kbdint_struct *kbdint;\n    struct ssh_gssapi_struct *gssapi;\n\n    /* server host keys */\n    struct {\n        ssh_key rsa_key;\n        ssh_key dsa_key;\n        ssh_key ecdsa_key;\n        ssh_key ed25519_key;\n        /* The type of host key wanted by client */\n        enum ssh_keytypes_e hostkey;\n        enum ssh_digest_e hostkey_digest;\n    } srv;\n\n    /* auths accepted by server */\n    struct ssh_list *ssh_message_list; /* list of delayed SSH messages */\n    int (*ssh_message_callback)( struct ssh_session_struct *session, ssh_message msg, void *userdata);\n    void *ssh_message_callback_data;\n    ssh_server_callbacks server_callbacks;\n    void (*ssh_connection_callback)( struct ssh_session_struct *session);\n    struct ssh_packet_callbacks_struct default_packet_callbacks;\n    struct ssh_list *packet_callbacks;\n    struct ssh_socket_callbacks_struct socket_callbacks;\n    struct ssh_socket_external_callbacks_struct socket_external_callbacks;\n    ssh_poll_ctx default_poll_ctx;\n    /* options */\n#ifdef WITH_PCAP\n    ssh_pcap_context pcap_ctx; /* pcap debugging context */\n#endif\n    struct {\n        struct ssh_list *identity;\n        char *username;\n        char *host;\n\t\tchar *proxy_host;\n        char *bindaddr; /* bind the client to an ip addr */\n        char *sshdir;\n        char *knownhosts;\n        char *global_knownhosts;\n        char *wanted_methods[SSH_KEX_METHODS];\n        char *pubkey_accepted_types;\n        char *ProxyCommand;\n        char *custombanner;\n        unsigned long timeout; /* seconds */\n        unsigned long timeout_usec;\n        unsigned int port;\n\t\tunsigned int proxy_port;\n        socket_t fd;\n        int StrictHostKeyChecking;\n        char compressionlevel;\n        char *gss_server_identity;\n        char *gss_client_identity;\n        int gss_delegate_creds;\n        int flags;\n        int nodelay;\n        bool config_processed;\n        uint8_t options_seen[SOC_MAX];\n        uint64_t rekey_data;\n        uint32_t rekey_time;\n    } opts;\n    /* counters */\n    ssh_counter socket_counter;\n    ssh_counter raw_counter;\n};\n\n/** @internal\n * @brief a termination function evaluates the status of an object\n * @param user[in] object to evaluate\n * @returns 1 if the polling routine should terminate, 0 instead\n */\ntypedef int (*ssh_termination_function)(void *user);\nint ssh_handle_packets(ssh_session session, int timeout);\nint ssh_handle_packets_termination(ssh_session session,\n                                   long timeout,\n                                   ssh_termination_function fct,\n                                   void *user);\nvoid ssh_socket_exception_callback(int code, int errno_code, void *user);\n\n#endif /* SESSION_H_ */\n"
  },
  {
    "path": "src/libssh/include/libssh/sftp.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2003-2008 by Aris Adamantiadis\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/**\n * @defgroup libssh_sftp The libssh SFTP API\n *\n * @brief SFTP handling functions\n *\n * SFTP commands are channeled by the ssh sftp subsystem. Every packet is\n * sent/read using a sftp_packet type structure. Related to these packets,\n * most of the server answers are messages having an ID and a message\n * specific part. It is described by sftp_message when reading a message,\n * the sftp system puts it into the queue, so the process having asked for\n * it can fetch it, while continuing to read for other messages (it is\n * unspecified in which order messages may be sent back to the client\n *\n * @{\n */\n\n#ifndef SFTP_H\n#define SFTP_H\n\n#include <sys/types.h>\n\n#include \"libssh.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#ifdef _WIN32\n#ifndef uid_t\n  typedef uint32_t uid_t;\n#endif /* uid_t */\n#ifndef gid_t\n  typedef uint32_t gid_t;\n#endif /* gid_t */\n#ifdef _MSC_VER\n\n# ifndef _SSIZE_T_DEFINED\n#  undef ssize_t\n#  include <BaseTsd.h>\n   typedef _W64 SSIZE_T ssize_t;\n#  define _SSIZE_T_DEFINED\n# endif /* _SSIZE_T_DEFINED */\n\n#endif /* _MSC_VER */\n#endif /* _WIN32 */\n\n#define LIBSFTP_VERSION 3\n\ntypedef struct sftp_attributes_struct* sftp_attributes;\ntypedef struct sftp_client_message_struct* sftp_client_message;\ntypedef struct sftp_dir_struct* sftp_dir;\ntypedef struct sftp_ext_struct *sftp_ext;\ntypedef struct sftp_file_struct* sftp_file;\ntypedef struct sftp_message_struct* sftp_message;\ntypedef struct sftp_packet_struct* sftp_packet;\ntypedef struct sftp_request_queue_struct* sftp_request_queue;\ntypedef struct sftp_session_struct* sftp_session;\ntypedef struct sftp_status_message_struct* sftp_status_message;\ntypedef struct sftp_statvfs_struct* sftp_statvfs_t;\n\nstruct sftp_session_struct {\n    ssh_session session;\n    ssh_channel channel;\n    int server_version;\n    int client_version;\n    int version;\n    sftp_request_queue queue;\n    uint32_t id_counter;\n    int errnum;\n    void **handles;\n    sftp_ext ext;\n    sftp_packet read_packet;\n};\n\nstruct sftp_packet_struct {\n    sftp_session sftp;\n    uint8_t type;\n    ssh_buffer payload;\n};\n\n/* file handler */\nstruct sftp_file_struct {\n    sftp_session sftp;\n    char *name;\n    uint64_t offset;\n    ssh_string handle;\n    int eof;\n    int nonblocking;\n};\n\nstruct sftp_dir_struct {\n    sftp_session sftp;\n    char *name;\n    ssh_string handle; /* handle to directory */\n    ssh_buffer buffer; /* contains raw attributes from server which haven't been parsed */\n    uint32_t count; /* counts the number of following attributes structures into buffer */\n    int eof; /* end of directory listing */\n};\n\nstruct sftp_message_struct {\n    sftp_session sftp;\n    uint8_t packet_type;\n    ssh_buffer payload;\n    uint32_t id;\n};\n\n/* this is a bunch of all data that could be into a message */\nstruct sftp_client_message_struct {\n    sftp_session sftp;\n    uint8_t type;\n    uint32_t id;\n    char *filename; /* can be \"path\" */\n    uint32_t flags;\n    sftp_attributes attr;\n    ssh_string handle;\n    uint64_t offset;\n    uint32_t len;\n    int attr_num;\n    ssh_buffer attrbuf; /* used by sftp_reply_attrs */\n    ssh_string data; /* can be newpath of rename() */\n    ssh_buffer complete_message; /* complete message in case of retransmission*/\n    char *str_data; /* cstring version of data */\n    char *submessage; /* for extended messages */\n};\n\nstruct sftp_request_queue_struct {\n    sftp_request_queue next;\n    sftp_message message;\n};\n\n/* SSH_FXP_MESSAGE described into .7 page 26 */\nstruct sftp_status_message_struct {\n    uint32_t id;\n\tuint32_t status;\n    ssh_string error_unused; /* not used anymore */\n    ssh_string lang_unused;  /* not used anymore */\n    char *errormsg;\n    char *langmsg;\n};\n\nstruct sftp_attributes_struct {\n    char *name;\n    char *longname; /* ls -l output on openssh, not reliable else */\n    uint32_t flags;\n    uint8_t type;\n    uint64_t size;\n    uint32_t uid;\n    uint32_t gid;\n    char *owner; /* set if openssh and version 4 */\n    char *group; /* set if openssh and version 4 */\n    uint32_t permissions;\n    uint64_t atime64;\n    uint32_t atime;\n    uint32_t atime_nseconds;\n    uint64_t createtime;\n    uint32_t createtime_nseconds;\n    uint64_t mtime64;\n    uint32_t mtime;\n    uint32_t mtime_nseconds;\n    ssh_string acl;\n    uint32_t extended_count;\n    ssh_string extended_type;\n    ssh_string extended_data;\n};\n\n/**\n * @brief SFTP statvfs structure.\n */\nstruct sftp_statvfs_struct {\n  uint64_t f_bsize;   /** file system block size */\n  uint64_t f_frsize;  /** fundamental fs block size */\n  uint64_t f_blocks;  /** number of blocks (unit f_frsize) */\n  uint64_t f_bfree;   /** free blocks in file system */\n  uint64_t f_bavail;  /** free blocks for non-root */\n  uint64_t f_files;   /** total file inodes */\n  uint64_t f_ffree;   /** free file inodes */\n  uint64_t f_favail;  /** free file inodes for to non-root */\n  uint64_t f_fsid;    /** file system id */\n  uint64_t f_flag;    /** bit mask of f_flag values */\n  uint64_t f_namemax; /** maximum filename length */\n};\n\n/**\n * @brief Creates a new sftp session.\n *\n * This function creates a new sftp session and allocates a new sftp channel\n * with the server inside of the provided ssh session. This function call is\n * usually followed by the sftp_init(), which initializes SFTP protocol itself.\n *\n * @param session       The ssh session to use.\n *\n * @return              A new sftp session or NULL on error.\n *\n * @see sftp_free()\n * @see sftp_init()\n */\nLIBSSH_API sftp_session sftp_new(ssh_session session);\n\n/**\n * @brief Start a new sftp session with an existing channel.\n *\n * @param session       The ssh session to use.\n * @param channel\t\tAn open session channel with subsystem already allocated\n *\n * @return              A new sftp session or NULL on error.\n *\n * @see sftp_free()\n */\nLIBSSH_API sftp_session sftp_new_channel(ssh_session session, ssh_channel channel);\n\n\n/**\n * @brief Close and deallocate a sftp session.\n *\n * @param sftp          The sftp session handle to free.\n */\nLIBSSH_API void sftp_free(sftp_session sftp);\n\n/**\n * @brief Initialize the sftp protocol with the server.\n *\n * This function involves the SFTP protocol initialization (as described\n * in the SFTP specification), including the version and extensions negotiation.\n *\n * @param sftp          The sftp session to initialize.\n *\n * @return              0 on success, < 0 on error with ssh error set.\n *\n * @see sftp_new()\n */\nLIBSSH_API int sftp_init(sftp_session sftp);\n\n/**\n * @brief Get the last sftp error.\n *\n * Use this function to get the latest error set by a posix like sftp function.\n *\n * @param sftp          The sftp session where the error is saved.\n *\n * @return              The saved error (see server responses), < 0 if an error\n *                      in the function occured.\n *\n * @see Server responses\n */\nLIBSSH_API int sftp_get_error(sftp_session sftp);\n\n/**\n * @brief Get the count of extensions provided by the server.\n *\n * @param  sftp         The sftp session to use.\n *\n * @return The count of extensions provided by the server, 0 on error or\n *         not available.\n */\nLIBSSH_API unsigned int sftp_extensions_get_count(sftp_session sftp);\n\n/**\n * @brief Get the name of the extension provided by the server.\n *\n * @param  sftp         The sftp session to use.\n *\n * @param  indexn        The index number of the extension name you want.\n *\n * @return              The name of the extension.\n */\nLIBSSH_API const char *sftp_extensions_get_name(sftp_session sftp, unsigned int indexn);\n\n/**\n * @brief Get the data of the extension provided by the server.\n *\n * This is normally the version number of the extension.\n *\n * @param  sftp         The sftp session to use.\n *\n * @param  indexn        The index number of the extension data you want.\n *\n * @return              The data of the extension.\n */\nLIBSSH_API const char *sftp_extensions_get_data(sftp_session sftp, unsigned int indexn);\n\n/**\n * @brief Check if the given extension is supported.\n *\n * @param  sftp         The sftp session to use.\n *\n * @param  name         The name of the extension.\n *\n * @param  data         The data of the extension.\n *\n * @return 1 if supported, 0 if not.\n *\n * Example:\n *\n * @code\n * sftp_extension_supported(sftp, \"statvfs@openssh.com\", \"2\");\n * @endcode\n */\nLIBSSH_API int sftp_extension_supported(sftp_session sftp, const char *name,\n    const char *data);\n\n/**\n * @brief Open a directory used to obtain directory entries.\n *\n * @param session       The sftp session handle to open the directory.\n * @param path          The path of the directory to open.\n *\n * @return              A sftp directory handle or NULL on error with ssh and\n *                      sftp error set.\n *\n * @see                 sftp_readdir\n * @see                 sftp_closedir\n */\nLIBSSH_API sftp_dir sftp_opendir(sftp_session session, const char *path);\n\n/**\n * @brief Get a single file attributes structure of a directory.\n *\n * @param session      The sftp session handle to read the directory entry.\n * @param dir          The opened sftp directory handle to read from.\n *\n * @return             A file attribute structure or NULL at the end of the\n *                     directory.\n *\n * @see                sftp_opendir()\n * @see                sftp_attribute_free()\n * @see                sftp_closedir()\n */\nLIBSSH_API sftp_attributes sftp_readdir(sftp_session session, sftp_dir dir);\n\n/**\n * @brief Tell if the directory has reached EOF (End Of File).\n *\n * @param dir           The sftp directory handle.\n *\n * @return              1 if the directory is EOF, 0 if not.\n *\n * @see                 sftp_readdir()\n */\nLIBSSH_API int sftp_dir_eof(sftp_dir dir);\n\n/**\n * @brief Get information about a file or directory.\n *\n * @param session       The sftp session handle.\n * @param path          The path to the file or directory to obtain the\n *                      information.\n *\n * @return              The sftp attributes structure of the file or directory,\n *                      NULL on error with ssh and sftp error set.\n *\n * @see sftp_get_error()\n */\nLIBSSH_API sftp_attributes sftp_stat(sftp_session session, const char *path);\n\n/**\n * @brief Get information about a file or directory.\n *\n * Identical to sftp_stat, but if the file or directory is a symbolic link,\n * then the link itself is stated, not the file that it refers to.\n *\n * @param session       The sftp session handle.\n * @param path          The path to the file or directory to obtain the\n *                      information.\n *\n * @return              The sftp attributes structure of the file or directory,\n *                      NULL on error with ssh and sftp error set.\n *\n * @see sftp_get_error()\n */\nLIBSSH_API sftp_attributes sftp_lstat(sftp_session session, const char *path);\n\n/**\n * @brief Get information about a file or directory from a file handle.\n *\n * @param file          The sftp file handle to get the stat information.\n *\n * @return              The sftp attributes structure of the file or directory,\n *                      NULL on error with ssh and sftp error set.\n *\n * @see sftp_get_error()\n */\nLIBSSH_API sftp_attributes sftp_fstat(sftp_file file);\n\n/**\n * @brief Free a sftp attribute structure.\n *\n * @param file          The sftp attribute structure to free.\n */\nLIBSSH_API void sftp_attributes_free(sftp_attributes file);\n\n/**\n * @brief Close a directory handle opened by sftp_opendir().\n *\n * @param dir           The sftp directory handle to close.\n *\n * @return              Returns SSH_NO_ERROR or SSH_ERROR if an error occured.\n */\nLIBSSH_API int sftp_closedir(sftp_dir dir);\n\n/**\n * @brief Close an open file handle.\n *\n * @param file          The open sftp file handle to close.\n *\n * @return              Returns SSH_NO_ERROR or SSH_ERROR if an error occured.\n *\n * @see                 sftp_open()\n */\nLIBSSH_API int sftp_close(sftp_file file);\n\n/**\n * @brief Open a file on the server.\n *\n * @param session       The sftp session handle.\n *\n * @param file          The file to be opened.\n *\n * @param accesstype    Is one of O_RDONLY, O_WRONLY or O_RDWR which request\n *                      opening  the  file  read-only,write-only or read/write.\n *                      Acesss may also be bitwise-or'd with one or  more of\n *                      the following:\n *                      O_CREAT - If the file does not exist it will be\n *                      created.\n *                      O_EXCL - When  used with O_CREAT, if the file already\n *                      exists it is an error and the open will fail.\n *                      O_TRUNC - If the file already exists it will be\n *                      truncated.\n *\n * @param mode          Mode specifies the permissions to use if a new file is\n *                      created.  It  is  modified  by  the process's umask in\n *                      the usual way: The permissions of the created file are\n *                      (mode & ~umask)\n *\n * @return              A sftp file handle, NULL on error with ssh and sftp\n *                      error set.\n *\n * @see sftp_get_error()\n */\nLIBSSH_API sftp_file sftp_open(sftp_session session, const char *file, int accesstype,\n    mode_t mode);\n\n/**\n * @brief Make the sftp communication for this file handle non blocking.\n *\n * @param[in]  handle   The file handle to set non blocking.\n */\nLIBSSH_API void sftp_file_set_nonblocking(sftp_file handle);\n\n/**\n * @brief Make the sftp communication for this file handle blocking.\n *\n * @param[in]  handle   The file handle to set blocking.\n */\nLIBSSH_API void sftp_file_set_blocking(sftp_file handle);\n\n/**\n * @brief Read from a file using an opened sftp file handle.\n *\n * @param file          The opened sftp file handle to be read from.\n *\n * @param buf           Pointer to buffer to recieve read data.\n *\n * @param count         Size of the buffer in bytes.\n *\n * @return              Number of bytes written, < 0 on error with ssh and sftp\n *                      error set.\n *\n * @see sftp_get_error()\n */\nLIBSSH_API ssize_t sftp_read(sftp_file file, void *buf, size_t count);\n\n/**\n * @brief Start an asynchronous read from a file using an opened sftp file handle.\n *\n * Its goal is to avoid the slowdowns related to the request/response pattern\n * of a synchronous read. To do so, you must call 2 functions:\n *\n * sftp_async_read_begin() and sftp_async_read().\n *\n * The first step is to call sftp_async_read_begin(). This function returns a\n * request identifier. The second step is to call sftp_async_read() using the\n * returned identifier.\n *\n * @param file          The opened sftp file handle to be read from.\n *\n * @param len           Size to read in bytes.\n *\n * @return              An identifier corresponding to the sent request, < 0 on\n *                      error.\n *\n * @warning             When calling this function, the internal offset is\n *                      updated corresponding to the len parameter.\n *\n * @warning             A call to sftp_async_read_begin() sends a request to\n *                      the server. When the server answers, libssh allocates\n *                      memory to store it until sftp_async_read() is called.\n *                      Not calling sftp_async_read() will lead to memory\n *                      leaks.\n *\n * @see                 sftp_async_read()\n * @see                 sftp_open()\n */\nLIBSSH_API int sftp_async_read_begin(sftp_file file, uint32_t len);\n\n/**\n * @brief Wait for an asynchronous read to complete and save the data.\n *\n * @param file          The opened sftp file handle to be read from.\n *\n * @param data          Pointer to buffer to recieve read data.\n *\n * @param len           Size of the buffer in bytes. It should be bigger or\n *                      equal to the length parameter of the\n *                      sftp_async_read_begin() call.\n *\n * @param id            The identifier returned by the sftp_async_read_begin()\n *                      function.\n *\n * @return              Number of bytes read, 0 on EOF, SSH_ERROR if an error\n *                      occured, SSH_AGAIN if the file is opened in nonblocking\n *                      mode and the request hasn't been executed yet.\n *\n * @warning             A call to this function with an invalid identifier\n *                      will never return.\n *\n * @see sftp_async_read_begin()\n */\nLIBSSH_API int sftp_async_read(sftp_file file, void *data, uint32_t len, uint32_t id);\n\n/**\n * @brief Write to a file using an opened sftp file handle.\n *\n * @param file          Open sftp file handle to write to.\n *\n * @param buf           Pointer to buffer to write data.\n *\n * @param count         Size of buffer in bytes.\n *\n * @return              Number of bytes written, < 0 on error with ssh and sftp\n *                      error set.\n *\n * @see                 sftp_open()\n * @see                 sftp_read()\n * @see                 sftp_close()\n */\nLIBSSH_API ssize_t sftp_write(sftp_file file, const void *buf, size_t count);\n\n/**\n * @brief Seek to a specific location in a file.\n *\n * @param file         Open sftp file handle to seek in.\n *\n * @param new_offset   Offset in bytes to seek.\n *\n * @return             0 on success, < 0 on error.\n */\nLIBSSH_API int sftp_seek(sftp_file file, uint32_t new_offset);\n\n/**\n * @brief Seek to a specific location in a file. This is the\n * 64bit version.\n *\n * @param file         Open sftp file handle to seek in.\n *\n * @param new_offset   Offset in bytes to seek.\n *\n * @return             0 on success, < 0 on error.\n */\nLIBSSH_API int sftp_seek64(sftp_file file, uint64_t new_offset);\n\n/**\n * @brief Report current byte position in file.\n *\n * @param file          Open sftp file handle.\n *\n * @return              The offset of the current byte relative to the beginning\n *                      of the file associated with the file descriptor. < 0 on\n *                      error.\n */\nLIBSSH_API unsigned long sftp_tell(sftp_file file);\n\n/**\n * @brief Report current byte position in file.\n *\n * @param file          Open sftp file handle.\n *\n * @return              The offset of the current byte relative to the beginning\n *                      of the file associated with the file descriptor. < 0 on\n *                      error.\n */\nLIBSSH_API uint64_t sftp_tell64(sftp_file file);\n\n/**\n * @brief Rewinds the position of the file pointer to the beginning of the\n * file.\n *\n * @param file          Open sftp file handle.\n */\nLIBSSH_API void sftp_rewind(sftp_file file);\n\n/**\n * @brief Unlink (delete) a file.\n *\n * @param sftp          The sftp session handle.\n *\n * @param file          The file to unlink/delete.\n *\n * @return              0 on success, < 0 on error with ssh and sftp error set.\n *\n * @see sftp_get_error()\n */\nLIBSSH_API int sftp_unlink(sftp_session sftp, const char *file);\n\n/**\n * @brief Remove a directoy.\n *\n * @param sftp          The sftp session handle.\n *\n * @param directory     The directory to remove.\n *\n * @return              0 on success, < 0 on error with ssh and sftp error set.\n *\n * @see sftp_get_error()\n */\nLIBSSH_API int sftp_rmdir(sftp_session sftp, const char *directory);\n\n/**\n * @brief Create a directory.\n *\n * @param sftp          The sftp session handle.\n *\n * @param directory     The directory to create.\n *\n * @param mode          Specifies the permissions to use. It is modified by the\n *                      process's umask in the usual way:\n *                      The permissions of the created file are (mode & ~umask)\n *\n * @return              0 on success, < 0 on error with ssh and sftp error set.\n *\n * @see sftp_get_error()\n */\nLIBSSH_API int sftp_mkdir(sftp_session sftp, const char *directory, mode_t mode);\n\n/**\n * @brief Rename or move a file or directory.\n *\n * @param sftp          The sftp session handle.\n *\n * @param original      The original url (source url) of file or directory to\n *                      be moved.\n *\n * @param newname       The new url (destination url) of the file or directory\n *                      after the move.\n *\n * @return              0 on success, < 0 on error with ssh and sftp error set.\n *\n * @see sftp_get_error()\n */\nLIBSSH_API int sftp_rename(sftp_session sftp, const char *original, const  char *newname);\n\n/**\n * @brief Set file attributes on a file, directory or symbolic link.\n *\n * @param sftp          The sftp session handle.\n *\n * @param file          The file which attributes should be changed.\n *\n * @param attr          The file attributes structure with the attributes set\n *                      which should be changed.\n *\n * @return              0 on success, < 0 on error with ssh and sftp error set.\n *\n * @see sftp_get_error()\n */\nLIBSSH_API int sftp_setstat(sftp_session sftp, const char *file, sftp_attributes attr);\n\n/**\n * @brief Change the file owner and group\n *\n * @param sftp          The sftp session handle.\n *\n * @param file          The file which owner and group should be changed.\n *\n * @param owner         The new owner which should be set.\n *\n * @param group         The new group which should be set.\n *\n * @return              0 on success, < 0 on error with ssh and sftp error set.\n *\n * @see sftp_get_error()\n */\nLIBSSH_API int sftp_chown(sftp_session sftp, const char *file, uid_t owner, gid_t group);\n\n/**\n * @brief Change permissions of a file\n *\n * @param sftp          The sftp session handle.\n *\n * @param file          The file which owner and group should be changed.\n *\n * @param mode          Specifies the permissions to use. It is modified by the\n *                      process's umask in the usual way:\n *                      The permissions of the created file are (mode & ~umask)\n *\n * @return              0 on success, < 0 on error with ssh and sftp error set.\n *\n * @see sftp_get_error()\n */\nLIBSSH_API int sftp_chmod(sftp_session sftp, const char *file, mode_t mode);\n\n/**\n * @brief Change the last modification and access time of a file.\n *\n * @param sftp          The sftp session handle.\n *\n * @param file          The file which owner and group should be changed.\n *\n * @param times         A timeval structure which contains the desired access\n *                      and modification time.\n *\n * @return              0 on success, < 0 on error with ssh and sftp error set.\n *\n * @see sftp_get_error()\n */\nLIBSSH_API int sftp_utimes(sftp_session sftp, const char *file, const struct timeval *times);\n\n/**\n * @brief Create a symbolic link.\n *\n * @param  sftp         The sftp session handle.\n *\n * @param  target       Specifies the target of the symlink.\n *\n * @param  dest         Specifies the path name of the symlink to be created.\n *\n * @return              0 on success, < 0 on error with ssh and sftp error set.\n *\n * @see sftp_get_error()\n */\nLIBSSH_API int sftp_symlink(sftp_session sftp, const char *target, const char *dest);\n\n/**\n * @brief Read the value of a symbolic link.\n *\n * @param  sftp         The sftp session handle.\n *\n * @param  path         Specifies the path name of the symlink to be read.\n *\n * @return              The target of the link, NULL on error.\n *\n * @see sftp_get_error()\n */\nLIBSSH_API char *sftp_readlink(sftp_session sftp, const char *path);\n\n/**\n * @brief Get information about a mounted file system.\n *\n * @param  sftp         The sftp session handle.\n *\n * @param  path         The pathname of any file within the mounted file system.\n *\n * @return A statvfs structure or NULL on error.\n *\n * @see sftp_get_error()\n */\nLIBSSH_API sftp_statvfs_t sftp_statvfs(sftp_session sftp, const char *path);\n\n/**\n * @brief Get information about a mounted file system.\n *\n * @param  file         An opened file.\n *\n * @return A statvfs structure or NULL on error.\n *\n * @see sftp_get_error()\n */\nLIBSSH_API sftp_statvfs_t sftp_fstatvfs(sftp_file file);\n\n/**\n * @brief Free the memory of an allocated statvfs.\n *\n * @param  statvfs_o      The statvfs to free.\n */\nLIBSSH_API void sftp_statvfs_free(sftp_statvfs_t statvfs_o);\n\n/**\n * @brief Synchronize a file's in-core state with storage device\n *\n * This calls the \"fsync@openssh.com\" extention. You should check if the\n * extensions is supported using:\n *\n * @code\n * int supported = sftp_extension_supported(sftp, \"fsync@openssh.com\", \"1\");\n * @endcode\n *\n * @param file          The opened sftp file handle to sync\n *\n * @return              0 on success, < 0 on error with ssh and sftp error set.\n */\nLIBSSH_API int sftp_fsync(sftp_file file);\n\n/**\n * @brief Canonicalize a sftp path.\n *\n * @param sftp          The sftp session handle.\n *\n * @param path          The path to be canonicalized.\n *\n * @return              A pointer to the newly allocated canonicalized path,\n *                      NULL on error. The caller needs to free the memory\n *                      using ssh_string_free_char().\n */\nLIBSSH_API char *sftp_canonicalize_path(sftp_session sftp, const char *path);\n\n/**\n * @brief Get the version of the SFTP protocol supported by the server\n *\n * @param sftp          The sftp session handle.\n *\n * @return              The server version.\n */\nLIBSSH_API int sftp_server_version(sftp_session sftp);\n\n#ifdef WITH_SERVER\n/**\n * @brief Create a new sftp server session.\n *\n * @param session       The ssh session to use.\n *\n * @param chan          The ssh channel to use.\n *\n * @return              A new sftp server session.\n */\nLIBSSH_API sftp_session sftp_server_new(ssh_session session, ssh_channel chan);\n\n/**\n * @brief Intialize the sftp server.\n *\n * @param sftp         The sftp session to init.\n *\n * @return             0 on success, < 0 on error.\n */\nLIBSSH_API int sftp_server_init(sftp_session sftp);\n\n/**\n * @brief Close and deallocate a sftp server session.\n *\n * @param sftp          The sftp session handle to free.\n */\nLIBSSH_API void sftp_server_free(sftp_session sftp);\n#endif  /* WITH_SERVER */\n\n/* sftpserver.c */\n\nLIBSSH_API sftp_client_message sftp_get_client_message(sftp_session sftp);\nLIBSSH_API void sftp_client_message_free(sftp_client_message msg);\nLIBSSH_API uint8_t sftp_client_message_get_type(sftp_client_message msg);\nLIBSSH_API const char *sftp_client_message_get_filename(sftp_client_message msg);\nLIBSSH_API void sftp_client_message_set_filename(sftp_client_message msg, const char *newname);\nLIBSSH_API const char *sftp_client_message_get_data(sftp_client_message msg);\nLIBSSH_API uint32_t sftp_client_message_get_flags(sftp_client_message msg);\nLIBSSH_API const char *sftp_client_message_get_submessage(sftp_client_message msg);\nLIBSSH_API int sftp_send_client_message(sftp_session sftp, sftp_client_message msg);\nLIBSSH_API int sftp_reply_name(sftp_client_message msg, const char *name,\n    sftp_attributes attr);\nLIBSSH_API int sftp_reply_handle(sftp_client_message msg, ssh_string handle);\nLIBSSH_API ssh_string sftp_handle_alloc(sftp_session sftp, void *info);\nLIBSSH_API int sftp_reply_attr(sftp_client_message msg, sftp_attributes attr);\nLIBSSH_API void *sftp_handle(sftp_session sftp, ssh_string handle);\nLIBSSH_API int sftp_reply_status(sftp_client_message msg, uint32_t status, const char *message);\nLIBSSH_API int sftp_reply_names_add(sftp_client_message msg, const char *file,\n    const char *longname, sftp_attributes attr);\nLIBSSH_API int sftp_reply_names(sftp_client_message msg);\nLIBSSH_API int sftp_reply_data(sftp_client_message msg, const void *data, int len);\nLIBSSH_API void sftp_handle_remove(sftp_session sftp, void *handle);\n\n/* SFTP commands and constants */\n#define SSH_FXP_INIT 1\n#define SSH_FXP_VERSION 2\n#define SSH_FXP_OPEN 3\n#define SSH_FXP_CLOSE 4\n#define SSH_FXP_READ 5\n#define SSH_FXP_WRITE 6\n#define SSH_FXP_LSTAT 7\n#define SSH_FXP_FSTAT 8\n#define SSH_FXP_SETSTAT 9\n#define SSH_FXP_FSETSTAT 10\n#define SSH_FXP_OPENDIR 11\n#define SSH_FXP_READDIR 12\n#define SSH_FXP_REMOVE 13\n#define SSH_FXP_MKDIR 14\n#define SSH_FXP_RMDIR 15\n#define SSH_FXP_REALPATH 16\n#define SSH_FXP_STAT 17\n#define SSH_FXP_RENAME 18\n#define SSH_FXP_READLINK 19\n#define SSH_FXP_SYMLINK 20\n\n#define SSH_FXP_STATUS 101\n#define SSH_FXP_HANDLE 102\n#define SSH_FXP_DATA 103\n#define SSH_FXP_NAME 104\n#define SSH_FXP_ATTRS 105\n\n#define SSH_FXP_EXTENDED 200\n#define SSH_FXP_EXTENDED_REPLY 201\n\n/* attributes */\n/* sftp draft is completely braindead : version 3 and 4 have different flags for same constants */\n/* and even worst, version 4 has same flag for 2 different constants */\n/* follow up : i won't develop any sftp4 compliant library before having a clarification */\n\n#define SSH_FILEXFER_ATTR_SIZE 0x00000001\n#define SSH_FILEXFER_ATTR_PERMISSIONS 0x00000004\n#define SSH_FILEXFER_ATTR_ACCESSTIME 0x00000008\n#define SSH_FILEXFER_ATTR_ACMODTIME  0x00000008\n#define SSH_FILEXFER_ATTR_CREATETIME 0x00000010\n#define SSH_FILEXFER_ATTR_MODIFYTIME 0x00000020\n#define SSH_FILEXFER_ATTR_ACL 0x00000040\n#define SSH_FILEXFER_ATTR_OWNERGROUP 0x00000080\n#define SSH_FILEXFER_ATTR_SUBSECOND_TIMES 0x00000100\n#define SSH_FILEXFER_ATTR_EXTENDED 0x80000000\n#define SSH_FILEXFER_ATTR_UIDGID 0x00000002\n\n/* types */\n#define SSH_FILEXFER_TYPE_REGULAR 1\n#define SSH_FILEXFER_TYPE_DIRECTORY 2\n#define SSH_FILEXFER_TYPE_SYMLINK 3\n#define SSH_FILEXFER_TYPE_SPECIAL 4\n#define SSH_FILEXFER_TYPE_UNKNOWN 5\n\n/**\n * @name Server responses\n *\n * @brief Responses returned by the sftp server.\n * @{\n */\n\n/** No error */\n#define SSH_FX_OK 0\n/** End-of-file encountered */\n#define SSH_FX_EOF 1\n/** File doesn't exist */\n#define SSH_FX_NO_SUCH_FILE 2\n/** Permission denied */\n#define SSH_FX_PERMISSION_DENIED 3\n/** Generic failure */\n#define SSH_FX_FAILURE 4\n/** Garbage received from server */\n#define SSH_FX_BAD_MESSAGE 5\n/** No connection has been set up */\n#define SSH_FX_NO_CONNECTION 6\n/** There was a connection, but we lost it */\n#define SSH_FX_CONNECTION_LOST 7\n/** Operation not supported by the server */\n#define SSH_FX_OP_UNSUPPORTED 8\n/** Invalid file handle */\n#define SSH_FX_INVALID_HANDLE 9\n/** No such file or directory path exists */\n#define SSH_FX_NO_SUCH_PATH 10\n/** An attempt to create an already existing file or directory has been made */\n#define SSH_FX_FILE_ALREADY_EXISTS 11\n/** We are trying to write on a write-protected filesystem */\n#define SSH_FX_WRITE_PROTECT 12\n/** No media in remote drive */\n#define SSH_FX_NO_MEDIA 13\n\n/** @} */\n\n/* file flags */\n#define SSH_FXF_READ 0x01\n#define SSH_FXF_WRITE 0x02\n#define SSH_FXF_APPEND 0x04\n#define SSH_FXF_CREAT 0x08\n#define SSH_FXF_TRUNC 0x10\n#define SSH_FXF_EXCL 0x20\n#define SSH_FXF_TEXT 0x40\n\n/* file type flags */\n#define SSH_S_IFMT   00170000\n#define SSH_S_IFSOCK 0140000\n#define SSH_S_IFLNK  0120000\n#define SSH_S_IFREG  0100000\n#define SSH_S_IFBLK  0060000\n#define SSH_S_IFDIR  0040000\n#define SSH_S_IFCHR  0020000\n#define SSH_S_IFIFO  0010000\n\n/* rename flags */\n#define SSH_FXF_RENAME_OVERWRITE  0x00000001\n#define SSH_FXF_RENAME_ATOMIC     0x00000002\n#define SSH_FXF_RENAME_NATIVE     0x00000004\n\n#define SFTP_OPEN SSH_FXP_OPEN\n#define SFTP_CLOSE SSH_FXP_CLOSE\n#define SFTP_READ SSH_FXP_READ\n#define SFTP_WRITE SSH_FXP_WRITE\n#define SFTP_LSTAT SSH_FXP_LSTAT\n#define SFTP_FSTAT SSH_FXP_FSTAT\n#define SFTP_SETSTAT SSH_FXP_SETSTAT\n#define SFTP_FSETSTAT SSH_FXP_FSETSTAT\n#define SFTP_OPENDIR SSH_FXP_OPENDIR\n#define SFTP_READDIR SSH_FXP_READDIR\n#define SFTP_REMOVE SSH_FXP_REMOVE\n#define SFTP_MKDIR SSH_FXP_MKDIR\n#define SFTP_RMDIR SSH_FXP_RMDIR\n#define SFTP_REALPATH SSH_FXP_REALPATH\n#define SFTP_STAT SSH_FXP_STAT\n#define SFTP_RENAME SSH_FXP_RENAME\n#define SFTP_READLINK SSH_FXP_READLINK\n#define SFTP_SYMLINK SSH_FXP_SYMLINK\n#define SFTP_EXTENDED SSH_FXP_EXTENDED\n\n/* openssh flags */\n#define SSH_FXE_STATVFS_ST_RDONLY 0x1 /* read-only */\n#define SSH_FXE_STATVFS_ST_NOSUID 0x2 /* no setuid */\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /* SFTP_H */\n\n/** @} */\n"
  },
  {
    "path": "src/libssh/include/libssh/sftp_priv.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2003-2008 by Aris Adamantiadis\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef SFTP_PRIV_H\n#define SFTP_PRIV_H\n\nsftp_packet sftp_packet_read(sftp_session sftp);\nssize_t sftp_packet_write(sftp_session sftp, uint8_t type, ssh_buffer payload);\nvoid sftp_packet_free(sftp_packet packet);\nint buffer_add_attributes(ssh_buffer buffer, sftp_attributes attr);\nsftp_attributes sftp_parse_attr(sftp_session session,\n                                ssh_buffer buf,\n                                int expectname);\n\n#endif /* SFTP_PRIV_H */\n"
  },
  {
    "path": "src/libssh/include/libssh/socket.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2009 by Aris Adamantiadis\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef SOCKET_H_\n#define SOCKET_H_\n\n#include \"libssh/callbacks.h\"\nstruct ssh_poll_handle_struct;\n/* socket.c */\n\nstruct ssh_socket_struct;\ntypedef struct ssh_socket_struct* ssh_socket;\n\nint ssh_socket_init(void);\nvoid ssh_socket_cleanup(void);\nssh_socket ssh_socket_new(ssh_session session);\nvoid ssh_socket_reset(ssh_socket s);\nvoid ssh_socket_free(ssh_socket s);\nvoid ssh_socket_set_fd(ssh_socket s, socket_t fd);\nsocket_t ssh_socket_get_fd(ssh_socket s);\n#ifndef _WIN32\nint ssh_socket_unix(ssh_socket s, const char *path);\nvoid ssh_execute_command(const char *command, socket_t in, socket_t out);\nint ssh_socket_connect_proxycommand(ssh_socket s, const char *command);\n#endif\nvoid ssh_socket_close(ssh_socket s);\nint ssh_socket_write(ssh_socket s,const void *buffer, int len);\nint ssh_socket_is_open(ssh_socket s);\nint ssh_socket_fd_isset(ssh_socket s, fd_set *set);\nvoid ssh_socket_fd_set(ssh_socket s, fd_set *set, socket_t *max_fd);\nvoid ssh_socket_set_fd_in(ssh_socket s, socket_t fd);\nvoid ssh_socket_set_fd_out(ssh_socket s, socket_t fd);\nint ssh_socket_nonblocking_flush(ssh_socket s);\nvoid ssh_socket_set_write_wontblock(ssh_socket s);\nvoid ssh_socket_set_read_wontblock(ssh_socket s);\nvoid ssh_socket_set_except(ssh_socket s);\nint ssh_socket_get_status(ssh_socket s);\nint ssh_socket_get_poll_flags(ssh_socket s);\nint ssh_socket_buffered_write_bytes(ssh_socket s);\nint ssh_socket_data_available(ssh_socket s);\nint ssh_socket_data_writable(ssh_socket s);\nint ssh_socket_set_nonblocking(socket_t fd);\nint ssh_socket_set_blocking(socket_t fd);\n\nvoid ssh_socket_set_callbacks(ssh_socket s, ssh_socket_callbacks callbacks);\nvoid ssh_socket_set_external_callbacks(ssh_socket s, ssh_socket_external_callbacks external_callbacks);\nint ssh_socket_pollcallback(struct ssh_poll_handle_struct *p, socket_t fd, int revents, void *v_s);\nstruct ssh_poll_handle_struct * ssh_socket_get_poll_handle(ssh_socket s);\n\nint ssh_socket_connect(ssh_socket s,\n                       const char *host,\n                       uint16_t port,\n                       const char *bind_addr);\n\n#endif /* SOCKET_H_ */\n"
  },
  {
    "path": "src/libssh/include/libssh/ssh2.h",
    "content": "#ifndef __SSH2_H\n#define __SSH2_H\n\n#define SSH2_MSG_DISCONNECT 1\n#define SSH2_MSG_IGNORE\t 2\n#define SSH2_MSG_UNIMPLEMENTED 3\n#define SSH2_MSG_DEBUG\t4\n#define SSH2_MSG_SERVICE_REQUEST\t5\n#define SSH2_MSG_SERVICE_ACCEPT 6\n#define SSH2_MSG_EXT_INFO 7\n\n#define SSH2_MSG_KEXINIT\t 20\n#define SSH2_MSG_NEWKEYS 21\n\n#define SSH2_MSG_KEXDH_INIT 30\n#define SSH2_MSG_KEXDH_REPLY 31\n#define SSH2_MSG_KEX_ECDH_INIT 30\n#define SSH2_MSG_KEX_ECDH_REPLY 31\n#define SSH2_MSG_ECMQV_INIT 30\n#define SSH2_MSG_ECMQV_REPLY 31\n\n#define SSH2_MSG_KEX_DH_GEX_REQUEST_OLD 30\n#define SSH2_MSG_KEX_DH_GEX_GROUP 31\n#define SSH2_MSG_KEX_DH_GEX_INIT 32\n#define SSH2_MSG_KEX_DH_GEX_REPLY 33\n#define SSH2_MSG_KEX_DH_GEX_REQUEST 34\n#define SSH2_MSG_USERAUTH_REQUEST 50\n#define SSH2_MSG_USERAUTH_FAILURE 51\n#define SSH2_MSG_USERAUTH_SUCCESS 52\n#define SSH2_MSG_USERAUTH_BANNER 53\n#define SSH2_MSG_USERAUTH_PK_OK 60\n#define SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ 60\n#define SSH2_MSG_USERAUTH_INFO_REQUEST\t 60\n#define SSH2_MSG_USERAUTH_GSSAPI_RESPONSE 60\n#define SSH2_MSG_USERAUTH_INFO_RESPONSE 61\n#define SSH2_MSG_USERAUTH_GSSAPI_TOKEN 61\n#define SSH2_MSG_USERAUTH_GSSAPI_EXCHANGE_COMPLETE 63\n#define SSH2_MSG_USERAUTH_GSSAPI_ERROR 64\n#define SSH2_MSG_USERAUTH_GSSAPI_ERRTOK 65\n#define SSH2_MSG_USERAUTH_GSSAPI_MIC 66\n\n#define SSH2_MSG_GLOBAL_REQUEST 80\n#define SSH2_MSG_REQUEST_SUCCESS 81\n#define SSH2_MSG_REQUEST_FAILURE 82\n#define SSH2_MSG_CHANNEL_OPEN 90\n#define SSH2_MSG_CHANNEL_OPEN_CONFIRMATION 91\n#define SSH2_MSG_CHANNEL_OPEN_FAILURE 92\n#define SSH2_MSG_CHANNEL_WINDOW_ADJUST 93\n#define SSH2_MSG_CHANNEL_DATA 94\n#define SSH2_MSG_CHANNEL_EXTENDED_DATA 95\n#define SSH2_MSG_CHANNEL_EOF\t96\n#define SSH2_MSG_CHANNEL_CLOSE 97\n#define SSH2_MSG_CHANNEL_REQUEST 98\n#define SSH2_MSG_CHANNEL_SUCCESS 99\n#define SSH2_MSG_CHANNEL_FAILURE 100\n\n#define SSH2_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT 1\n#define SSH2_DISCONNECT_PROTOCOL_ERROR 2\n#define SSH2_DISCONNECT_KEY_EXCHANGE_FAILED 3\n#define SSH2_DISCONNECT_HOST_AUTHENTICATION_FAILED 4\n#define SSH2_DISCONNECT_RESERVED\t 4\n#define SSH2_DISCONNECT_MAC_ERROR 5\n#define SSH2_DISCONNECT_COMPRESSION_ERROR 6\n#define SSH2_DISCONNECT_SERVICE_NOT_AVAILABLE 7\n#define SSH2_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED 8\n#define SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE 9\n#define SSH2_DISCONNECT_CONNECTION_LOST 10\n#define SSH2_DISCONNECT_BY_APPLICATION 11\n#define SSH2_DISCONNECT_TOO_MANY_CONNECTIONS 12\n#define SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER 13\n#define SSH2_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE 14\n#define SSH2_DISCONNECT_ILLEGAL_USER_NAME 15\n\n#define SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED\t\t1\n#define SSH2_OPEN_CONNECT_FAILED\t\t\t2\n#define SSH2_OPEN_UNKNOWN_CHANNEL_TYPE\t\t\t3\n#define SSH2_OPEN_RESOURCE_SHORTAGE\t\t\t4\n\n#define SSH2_EXTENDED_DATA_STDERR\t\t\t1\n\n#endif\n"
  },
  {
    "path": "src/libssh/include/libssh/string.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2009 by Aris Adamantiadis\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef STRING_H_\n#define STRING_H_\n#include \"libssh/priv.h\"\n\n/* must be 32 bits number + immediately our data */\n#ifdef _MSC_VER\n#pragma pack(1)\n#endif\nstruct ssh_string_struct {\n\tuint32_t size;\n\tunsigned char data[1];\n}\n#if defined(__GNUC__)\n__attribute__ ((packed))\n#endif\n#ifdef _MSC_VER\n#pragma pack()\n#endif\n;\n\n#endif /* STRING_H_ */\n"
  },
  {
    "path": "src/libssh/include/libssh/threads.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2010 by Aris Adamantiadis\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef THREADS_H_\n#define THREADS_H_\n\n#include <libssh/libssh.h>\n#include <libssh/callbacks.h>\n\n#if HAVE_PTHREAD\n\n#include <pthread.h>\n#define SSH_MUTEX pthread_mutex_t\n\n#if defined(PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP)\n#define SSH_MUTEX_STATIC_INIT PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP\n#else\n#define SSH_MUTEX_STATIC_INIT PTHREAD_MUTEX_INITIALIZER\n#endif\n\n#elif (defined _WIN32) || (defined _WIN64)\n\n#include <windows.h>\n#include <winbase.h>\n#define SSH_MUTEX CRITICAL_SECTION *\n#define SSH_MUTEX_STATIC_INIT NULL\n\n#else\n\n# define SSH_MUTEX void *\n#define SSH_MUTEX_STATIC_INIT NULL\n\n#endif\n\nint ssh_threads_init(void);\nvoid ssh_threads_finalize(void);\nconst char *ssh_threads_get_type(void);\n\nvoid ssh_mutex_lock(SSH_MUTEX *mutex);\nvoid ssh_mutex_unlock(SSH_MUTEX *mutex);\n\nstruct ssh_threads_callbacks_struct *ssh_threads_get_default(void);\nint crypto_thread_init(struct ssh_threads_callbacks_struct *user_callbacks);\nvoid crypto_thread_finalize(void);\n\n#endif /* THREADS_H_ */\n"
  },
  {
    "path": "src/libssh/include/libssh/token.h",
    "content": "/*\n * token.h - Tokens list handling\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2019 by Red Hat, Inc.\n *\n * Author: Anderson Toshiyuki Sasaki <ansasaki@redhat.com>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#ifndef TOKEN_H_\n#define TOKEN_H_\n\nstruct ssh_tokens_st {\n    char *buffer;\n    char **tokens;\n};\n\nstruct ssh_tokens_st *ssh_tokenize(const char *chain, char separator);\n\nvoid ssh_tokens_free(struct ssh_tokens_st *tokens);\n\nchar *ssh_find_matching(const char *available_d,\n                        const char *preferred_d);\n\nchar *ssh_find_all_matching(const char *available_d,\n                            const char *preferred_d);\n\nchar *ssh_remove_duplicates(const char *list);\n\nchar *ssh_append_without_duplicates(const char *list,\n                                    const char *appended_list);\n#endif /* TOKEN_H_ */\n"
  },
  {
    "path": "src/libssh/include/libssh/wrapper.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2009 by Aris Adamantiadis\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#ifndef WRAPPER_H_\n#define WRAPPER_H_\n\n#include <stdbool.h>\n\n#include \"config.h\"\n#include \"libssh/libssh.h\"\n#include \"libssh/libcrypto.h\"\n#include \"libssh/libgcrypt.h\"\n#include \"libssh/libmbedcrypto.h\"\n\nenum ssh_kdf_digest {\n    SSH_KDF_SHA1=1,\n    SSH_KDF_SHA256,\n    SSH_KDF_SHA384,\n    SSH_KDF_SHA512\n};\n\nenum ssh_hmac_e {\n  SSH_HMAC_SHA1 = 1,\n  SSH_HMAC_SHA1_96,\n  SSH_HMAC_SHA256,\n  SSH_HMAC_SHA512,\n  SSH_HMAC_MD5,\n  SSH_HMAC_MD5_96,\n  SSH_HMAC_AEAD_POLY1305,\n  SSH_HMAC_AEAD_GCM\n};\n\nenum ssh_des_e {\n  SSH_3DES,\n  SSH_DES\n};\n\nstruct ssh_hmac_struct {\n  const char* name;\n  enum ssh_hmac_e hmac_type;\n  bool etm;\n};\n\nenum ssh_crypto_direction_e {\n    SSH_DIRECTION_IN = 1,\n    SSH_DIRECTION_OUT = 2,\n    SSH_DIRECTION_BOTH = 3,\n};\n\nstruct ssh_cipher_struct;\nstruct ssh_crypto_struct;\n\ntypedef struct ssh_mac_ctx_struct *ssh_mac_ctx;\nMD5CTX md5_init(void);\nvoid md5_update(MD5CTX c, const void *data, unsigned long len);\nvoid md5_final(unsigned char *md,MD5CTX c);\n\nSHACTX sha1_init(void);\nvoid sha1_update(SHACTX c, const void *data, unsigned long len);\nvoid sha1_final(unsigned char *md,SHACTX c);\nvoid sha1(const unsigned char *digest,int len,unsigned char *hash);\n\nSHA256CTX sha256_init(void);\nvoid sha256_update(SHA256CTX c, const void *data, unsigned long len);\nvoid sha256_final(unsigned char *md,SHA256CTX c);\nvoid sha256(const unsigned char *digest, int len, unsigned char *hash);\n\nSHA384CTX sha384_init(void);\nvoid sha384_update(SHA384CTX c, const void *data, unsigned long len);\nvoid sha384_final(unsigned char *md,SHA384CTX c);\nvoid sha384(const unsigned char *digest, int len, unsigned char *hash);\n\nSHA512CTX sha512_init(void);\nvoid sha512_update(SHA512CTX c, const void *data, unsigned long len);\nvoid sha512_final(unsigned char *md,SHA512CTX c);\nvoid sha512(const unsigned char *digest, int len, unsigned char *hash);\n\nvoid evp(int nid, unsigned char *digest, int len, unsigned char *hash, unsigned int *hlen);\nEVPCTX evp_init(int nid);\nvoid evp_update(EVPCTX ctx, const void *data, unsigned long len);\nvoid evp_final(EVPCTX ctx, unsigned char *md, unsigned int *mdlen);\n\nHMACCTX hmac_init(const void *key,int len, enum ssh_hmac_e type);\nvoid hmac_update(HMACCTX c, const void *data, unsigned long len);\nvoid hmac_final(HMACCTX ctx,unsigned char *hashmacbuf,unsigned int *len, enum ssh_hmac_e type);\nsize_t hmac_digest_len(enum ssh_hmac_e type);\nsize_t hmac_key_len(enum ssh_hmac_e type);\n\nint ssh_kdf(struct ssh_crypto_struct *crypto,\n            unsigned char *key, size_t key_len,\n            int key_type, unsigned char *output,\n            size_t requested_len);\n\nint crypt_set_algorithms_client(ssh_session session);\nint crypt_set_algorithms_server(ssh_session session);\nstruct ssh_crypto_struct *crypto_new(void);\nvoid crypto_free(struct ssh_crypto_struct *crypto);\n\nvoid ssh_reseed(void);\nint ssh_crypto_init(void);\nvoid ssh_crypto_finalize(void);\n\nvoid ssh_cipher_clear(struct ssh_cipher_struct *cipher);\nstruct ssh_hmac_struct *ssh_get_hmactab(void);\nstruct ssh_cipher_struct *ssh_get_ciphertab(void);\nconst char *ssh_hmac_type_to_string(enum ssh_hmac_e hmac_type, bool etm);\n\n#endif /* WRAPPER_H_ */\n"
  },
  {
    "path": "src/libssh/libssh.pc.cmake",
    "content": "Name: ${PROJECT_NAME}\nDescription: The SSH Library\nVersion: ${PROJECT_VERSION}\nLibs: -L${CMAKE_INSTALL_FULL_LIBDIR} -lssh\nCflags: -I${CMAKE_INSTALL_FULL_INCLUDEDIR}\n\n"
  },
  {
    "path": "src/libssh/src/ABI/current",
    "content": "4.8.6"
  },
  {
    "path": "src/libssh/src/ABI/libssh-4.5.0.symbols",
    "content": "ssh_set_server_callbacks\nssh_set_callbacks\nssh_set_channel_callbacks\nssh_add_channel_callbacks\nssh_remove_channel_callbacks\nssh_threads_set_callbacks\nssh_threads_get_pthread\nssh_threads_get_noop\nssh_set_log_callback\nssh_get_log_callback\nssh_auth_list\nssh_userauth_offer_pubkey\nssh_userauth_pubkey\nssh_userauth_agent_pubkey\nssh_userauth_autopubkey\nssh_userauth_privatekey_file\nbuffer_free\nbuffer_get\nbuffer_get_len\nbuffer_new\nchannel_accept_x11\nchannel_change_pty_size\nchannel_forward_accept\nchannel_close\nchannel_forward_cancel\nchannel_forward_listen\nchannel_free\nchannel_get_exit_status\nchannel_get_session\nchannel_is_closed\nchannel_is_eof\nchannel_is_open\nchannel_new\nchannel_open_forward\nchannel_open_session\nchannel_poll\nchannel_read\nchannel_read_buffer\nchannel_read_nonblocking\nchannel_request_env\nchannel_request_exec\nchannel_request_pty\nchannel_request_pty_size\nchannel_request_shell\nchannel_request_send_signal\nchannel_request_sftp\nchannel_request_subsystem\nchannel_request_x11\nchannel_send_eof\nchannel_select\nchannel_set_blocking\nchannel_write\nprivatekey_free\nprivatekey_from_file\npublickey_free\nssh_publickey_to_file\npublickey_from_file\npublickey_from_privatekey\npublickey_to_string\nssh_try_publickey_from_file\nssh_privatekey_type\nssh_get_pubkey\nssh_message_retrieve\nssh_message_auth_publickey\nstring_burn\nstring_copy\nstring_data\nstring_fill\nstring_free\nstring_from_char\nstring_len\nstring_new\nstring_to_char\nssh_blocking_flush\nssh_channel_accept_x11\nssh_channel_change_pty_size\nssh_channel_close\nssh_channel_free\nssh_channel_get_exit_status\nssh_channel_get_session\nssh_channel_is_closed\nssh_channel_is_eof\nssh_channel_is_open\nssh_channel_new\nssh_channel_open_auth_agent\nssh_channel_open_forward\nssh_channel_open_session\nssh_channel_open_x11\nssh_channel_poll\nssh_channel_poll_timeout\nssh_channel_read\nssh_channel_read_timeout\nssh_channel_read_nonblocking\nssh_channel_request_env\nssh_channel_request_exec\nssh_channel_request_pty\nssh_channel_request_pty_size\nssh_channel_request_shell\nssh_channel_request_send_signal\nssh_channel_request_send_break\nssh_channel_request_sftp\nssh_channel_request_subsystem\nssh_channel_request_x11\nssh_channel_request_auth_agent\nssh_channel_send_eof\nssh_channel_select\nssh_channel_set_blocking\nssh_channel_set_counter\nssh_channel_write\nssh_channel_write_stderr\nssh_channel_window_size\nssh_basename\nssh_clean_pubkey_hash\nssh_connect\nssh_connector_new\nssh_connector_free\nssh_connector_set_in_channel\nssh_connector_set_out_channel\nssh_connector_set_in_fd\nssh_connector_set_out_fd\nssh_copyright\nssh_disconnect\nssh_dirname\nssh_finalize\nssh_channel_accept_forward\nssh_channel_cancel_forward\nssh_channel_listen_forward\nssh_free\nssh_get_disconnect_message\nssh_get_error\nssh_get_error_code\nssh_get_fd\nssh_get_hexa\nssh_get_issue_banner\nssh_get_openssh_version\nssh_get_server_publickey\nssh_get_publickey_hash\nssh_get_pubkey_hash\nssh_forward_accept\nssh_forward_cancel\nssh_forward_listen\nssh_get_publickey\nssh_get_random\nssh_get_version\nssh_get_status\nssh_get_poll_flags\nssh_init\nssh_is_blocking\nssh_is_connected\nssh_is_server_known\nssh_knownhosts_entry_free\nssh_known_hosts_parse_line\nssh_session_has_known_hosts_entry\nssh_session_export_known_hosts_entry\nssh_session_update_known_hosts\nssh_session_is_known_server\nssh_set_log_level\nssh_get_log_level\nssh_get_log_userdata\nssh_set_log_userdata\n_ssh_log\nssh_log\nssh_message_channel_request_open_reply_accept\nssh_message_channel_request_reply_success\nssh_message_free\nssh_message_get\nssh_message_subtype\nssh_message_type\nssh_mkdir\nssh_new\nssh_options_copy\nssh_options_getopt\nssh_options_parse_config\nssh_options_set\nssh_options_get\nssh_options_get_port\nssh_pcap_file_close\nssh_pcap_file_free\nssh_pcap_file_new\nssh_pcap_file_open\nssh_key_new\nssh_key_free\nssh_key_type\nssh_key_type_to_char\nssh_key_type_from_name\nssh_key_is_public\nssh_key_is_private\nssh_key_cmp\nssh_pki_generate\nssh_pki_import_privkey_base64\nssh_pki_import_privkey_file\nssh_pki_export_privkey_file\nssh_pki_copy_cert_to_privkey\nssh_pki_import_pubkey_base64\nssh_pki_import_pubkey_file\nssh_pki_import_cert_base64\nssh_pki_import_cert_file\nssh_pki_export_privkey_to_pubkey\nssh_pki_export_pubkey_base64\nssh_pki_export_pubkey_file\nssh_pki_key_ecdsa_name\nssh_print_hexa\nssh_send_ignore\nssh_send_debug\nssh_gssapi_set_creds\nssh_scp_accept_request\nssh_scp_close\nssh_scp_deny_request\nssh_scp_free\nssh_scp_init\nssh_scp_leave_directory\nssh_scp_new\nssh_scp_pull_request\nssh_scp_push_directory\nssh_scp_push_file\nssh_scp_push_file64\nssh_scp_read\nssh_scp_request_get_filename\nssh_scp_request_get_permissions\nssh_scp_request_get_size\nssh_scp_request_get_size64\nssh_scp_request_get_warning\nssh_scp_write\nssh_select\nssh_service_request\nssh_set_agent_channel\nssh_set_agent_socket\nssh_set_blocking\nssh_set_counters\nssh_set_fd_except\nssh_set_fd_toread\nssh_set_fd_towrite\nssh_silent_disconnect\nssh_set_pcap_file\nssh_userauth_none\nssh_userauth_list\nssh_userauth_try_publickey\nssh_userauth_publickey\nssh_userauth_agent\nssh_userauth_publickey_auto\nssh_userauth_password\nssh_userauth_kbdint\nssh_userauth_kbdint_getinstruction\nssh_userauth_kbdint_getname\nssh_userauth_kbdint_getnprompts\nssh_userauth_kbdint_getprompt\nssh_userauth_kbdint_getnanswers\nssh_userauth_kbdint_getanswer\nssh_userauth_kbdint_setanswer\nssh_userauth_gssapi\nssh_version\nssh_write_knownhost\nssh_dump_knownhost\nssh_string_burn\nssh_string_copy\nssh_string_data\nssh_string_fill\nssh_string_free\nssh_string_from_char\nssh_string_len\nssh_string_new\nssh_string_get_char\nssh_string_to_char\nssh_string_free_char\nssh_getpass\nssh_event_new\nssh_event_add_fd\nssh_event_add_session\nssh_event_add_connector\nssh_event_dopoll\nssh_event_remove_fd\nssh_event_remove_session\nssh_event_remove_connector\nssh_event_free\nssh_get_clientbanner\nssh_get_serverbanner\nssh_get_kex_algo\nssh_get_cipher_in\nssh_get_cipher_out\nssh_get_hmac_in\nssh_get_hmac_out\nssh_buffer_new\nssh_buffer_free\nssh_buffer_reinit\nssh_buffer_add_data\nssh_buffer_get_data\nssh_buffer_get\nssh_buffer_get_len\nssh_bind_new\nssh_bind_options_set\nssh_bind_listen\nssh_bind_set_callbacks\nssh_bind_set_blocking\nssh_bind_get_fd\nssh_bind_set_fd\nssh_bind_fd_toaccept\nssh_bind_accept\nssh_bind_accept_fd\nssh_gssapi_get_creds\nssh_handle_key_exchange\nssh_server_init_kex\nssh_bind_free\nssh_set_auth_methods\nssh_message_reply_default\nssh_message_auth_user\nssh_message_auth_password\nssh_message_auth_pubkey\nssh_message_auth_kbdint_is_response\nssh_message_auth_publickey_state\nssh_message_auth_reply_success\nssh_message_auth_reply_pk_ok\nssh_message_auth_reply_pk_ok_simple\nssh_message_auth_set_methods\nssh_message_auth_interactive_request\nssh_message_service_reply_success\nssh_message_service_service\nssh_message_global_request_reply_success\nssh_set_message_callback\nssh_execute_message_callbacks\nssh_message_channel_request_open_originator\nssh_message_channel_request_open_originator_port\nssh_message_channel_request_open_destination\nssh_message_channel_request_open_destination_port\nssh_message_channel_request_channel\nssh_message_channel_request_pty_term\nssh_message_channel_request_pty_width\nssh_message_channel_request_pty_height\nssh_message_channel_request_pty_pxwidth\nssh_message_channel_request_pty_pxheight\nssh_message_channel_request_env_name\nssh_message_channel_request_env_value\nssh_message_channel_request_command\nssh_message_channel_request_subsystem\nssh_message_channel_request_x11_single_connection\nssh_message_channel_request_x11_auth_protocol\nssh_message_channel_request_x11_auth_cookie\nssh_message_channel_request_x11_screen_number\nssh_message_global_request_address\nssh_message_global_request_port\nssh_channel_open_reverse_forward\nssh_channel_request_send_exit_status\nssh_channel_request_send_exit_signal\nssh_send_keepalive\nssh_accept\nchannel_write_stderr\nsftp_new\nsftp_new_channel\nsftp_free\nsftp_init\nsftp_get_error\nsftp_extensions_get_count\nsftp_extensions_get_name\nsftp_extensions_get_data\nsftp_extension_supported\nsftp_opendir\nsftp_readdir\nsftp_dir_eof\nsftp_stat\nsftp_lstat\nsftp_fstat\nsftp_attributes_free\nsftp_closedir\nsftp_close\nsftp_open\nsftp_file_set_nonblocking\nsftp_file_set_blocking\nsftp_read\nsftp_async_read_begin\nsftp_async_read\nsftp_write\nsftp_seek\nsftp_seek64\nsftp_tell\nsftp_tell64\nsftp_rewind\nsftp_unlink\nsftp_rmdir\nsftp_mkdir\nsftp_rename\nsftp_setstat\nsftp_chown\nsftp_chmod\nsftp_utimes\nsftp_symlink\nsftp_readlink\nsftp_statvfs\nsftp_fstatvfs\nsftp_statvfs_free\nsftp_fsync\nsftp_canonicalize_path\nsftp_server_version\nsftp_server_new\nsftp_server_init\nsftp_get_client_message\nsftp_client_message_free\nsftp_client_message_get_type\nsftp_client_message_get_filename\nsftp_client_message_set_filename\nsftp_client_message_get_data\nsftp_client_message_get_flags\nsftp_send_client_message\nsftp_reply_name\nsftp_reply_handle\nsftp_handle_alloc\nsftp_reply_attr\nsftp_handle\nsftp_reply_status\nsftp_reply_names_add\nsftp_reply_names\nsftp_reply_data\nsftp_handle_remove"
  },
  {
    "path": "src/libssh/src/ABI/libssh-4.5.1.symbols",
    "content": ""
  },
  {
    "path": "src/libssh/src/ABI/libssh-4.6.0.symbols",
    "content": "_ssh_log\nbuffer_free\nbuffer_get\nbuffer_get_len\nbuffer_new\nchannel_accept_x11\nchannel_change_pty_size\nchannel_close\nchannel_forward_accept\nchannel_forward_cancel\nchannel_forward_listen\nchannel_free\nchannel_get_exit_status\nchannel_get_session\nchannel_is_closed\nchannel_is_eof\nchannel_is_open\nchannel_new\nchannel_open_forward\nchannel_open_session\nchannel_poll\nchannel_read\nchannel_read_buffer\nchannel_read_nonblocking\nchannel_request_env\nchannel_request_exec\nchannel_request_pty\nchannel_request_pty_size\nchannel_request_send_signal\nchannel_request_sftp\nchannel_request_shell\nchannel_request_subsystem\nchannel_request_x11\nchannel_select\nchannel_send_eof\nchannel_set_blocking\nchannel_write\nchannel_write_stderr\nprivatekey_free\nprivatekey_from_file\npublickey_free\npublickey_from_file\npublickey_from_privatekey\npublickey_to_string\nsftp_async_read\nsftp_async_read_begin\nsftp_attributes_free\nsftp_canonicalize_path\nsftp_chmod\nsftp_chown\nsftp_client_message_free\nsftp_client_message_get_data\nsftp_client_message_get_filename\nsftp_client_message_get_flags\nsftp_client_message_get_type\nsftp_client_message_set_filename\nsftp_close\nsftp_closedir\nsftp_dir_eof\nsftp_extension_supported\nsftp_extensions_get_count\nsftp_extensions_get_data\nsftp_extensions_get_name\nsftp_file_set_blocking\nsftp_file_set_nonblocking\nsftp_free\nsftp_fstat\nsftp_fstatvfs\nsftp_fsync\nsftp_get_client_message\nsftp_get_error\nsftp_handle\nsftp_handle_alloc\nsftp_handle_remove\nsftp_init\nsftp_lstat\nsftp_mkdir\nsftp_new\nsftp_new_channel\nsftp_open\nsftp_opendir\nsftp_read\nsftp_readdir\nsftp_readlink\nsftp_rename\nsftp_reply_attr\nsftp_reply_data\nsftp_reply_handle\nsftp_reply_name\nsftp_reply_names\nsftp_reply_names_add\nsftp_reply_status\nsftp_rewind\nsftp_rmdir\nsftp_seek\nsftp_seek64\nsftp_send_client_message\nsftp_server_init\nsftp_server_new\nsftp_server_version\nsftp_setstat\nsftp_stat\nsftp_statvfs\nsftp_statvfs_free\nsftp_symlink\nsftp_tell\nsftp_tell64\nsftp_unlink\nsftp_utimes\nsftp_write\nssh_accept\nssh_add_channel_callbacks\nssh_auth_list\nssh_basename\nssh_bind_accept\nssh_bind_accept_fd\nssh_bind_fd_toaccept\nssh_bind_free\nssh_bind_get_fd\nssh_bind_listen\nssh_bind_new\nssh_bind_options_set\nssh_bind_set_blocking\nssh_bind_set_callbacks\nssh_bind_set_fd\nssh_blocking_flush\nssh_buffer_add_data\nssh_buffer_free\nssh_buffer_get\nssh_buffer_get_data\nssh_buffer_get_len\nssh_buffer_new\nssh_buffer_reinit\nssh_channel_accept_forward\nssh_channel_accept_x11\nssh_channel_cancel_forward\nssh_channel_change_pty_size\nssh_channel_close\nssh_channel_free\nssh_channel_get_exit_status\nssh_channel_get_session\nssh_channel_is_closed\nssh_channel_is_eof\nssh_channel_is_open\nssh_channel_listen_forward\nssh_channel_new\nssh_channel_open_auth_agent\nssh_channel_open_forward\nssh_channel_open_reverse_forward\nssh_channel_open_session\nssh_channel_open_x11\nssh_channel_poll\nssh_channel_poll_timeout\nssh_channel_read\nssh_channel_read_nonblocking\nssh_channel_read_timeout\nssh_channel_request_auth_agent\nssh_channel_request_env\nssh_channel_request_exec\nssh_channel_request_pty\nssh_channel_request_pty_size\nssh_channel_request_send_break\nssh_channel_request_send_exit_signal\nssh_channel_request_send_exit_status\nssh_channel_request_send_signal\nssh_channel_request_sftp\nssh_channel_request_shell\nssh_channel_request_subsystem\nssh_channel_request_x11\nssh_channel_select\nssh_channel_send_eof\nssh_channel_set_blocking\nssh_channel_set_counter\nssh_channel_window_size\nssh_channel_write\nssh_channel_write_stderr\nssh_clean_pubkey_hash\nssh_connect\nssh_connector_free\nssh_connector_new\nssh_connector_set_in_channel\nssh_connector_set_in_fd\nssh_connector_set_out_channel\nssh_connector_set_out_fd\nssh_copyright\nssh_dirname\nssh_disconnect\nssh_dump_knownhost\nssh_event_add_connector\nssh_event_add_fd\nssh_event_add_session\nssh_event_dopoll\nssh_event_free\nssh_event_new\nssh_event_remove_connector\nssh_event_remove_fd\nssh_event_remove_session\nssh_execute_message_callbacks\nssh_finalize\nssh_forward_accept\nssh_forward_cancel\nssh_forward_listen\nssh_free\nssh_get_cipher_in\nssh_get_cipher_out\nssh_get_clientbanner\nssh_get_disconnect_message\nssh_get_error\nssh_get_error_code\nssh_get_fd\nssh_get_hexa\nssh_get_hmac_in\nssh_get_hmac_out\nssh_get_issue_banner\nssh_get_kex_algo\nssh_get_log_callback\nssh_get_log_level\nssh_get_log_userdata\nssh_get_openssh_version\nssh_get_poll_flags\nssh_get_pubkey\nssh_get_pubkey_hash\nssh_get_publickey\nssh_get_publickey_hash\nssh_get_random\nssh_get_server_publickey\nssh_get_serverbanner\nssh_get_status\nssh_get_version\nssh_getpass\nssh_gssapi_get_creds\nssh_gssapi_set_creds\nssh_handle_key_exchange\nssh_init\nssh_is_blocking\nssh_is_connected\nssh_is_server_known\nssh_key_cmp\nssh_key_free\nssh_key_is_private\nssh_key_is_public\nssh_key_new\nssh_key_type\nssh_key_type_from_name\nssh_key_type_to_char\nssh_known_hosts_parse_line\nssh_knownhosts_entry_free\nssh_log\nssh_message_auth_interactive_request\nssh_message_auth_kbdint_is_response\nssh_message_auth_password\nssh_message_auth_pubkey\nssh_message_auth_publickey\nssh_message_auth_publickey_state\nssh_message_auth_reply_pk_ok\nssh_message_auth_reply_pk_ok_simple\nssh_message_auth_reply_success\nssh_message_auth_set_methods\nssh_message_auth_user\nssh_message_channel_request_channel\nssh_message_channel_request_command\nssh_message_channel_request_env_name\nssh_message_channel_request_env_value\nssh_message_channel_request_open_destination\nssh_message_channel_request_open_destination_port\nssh_message_channel_request_open_originator\nssh_message_channel_request_open_originator_port\nssh_message_channel_request_open_reply_accept\nssh_message_channel_request_pty_height\nssh_message_channel_request_pty_pxheight\nssh_message_channel_request_pty_pxwidth\nssh_message_channel_request_pty_term\nssh_message_channel_request_pty_width\nssh_message_channel_request_reply_success\nssh_message_channel_request_subsystem\nssh_message_channel_request_x11_auth_cookie\nssh_message_channel_request_x11_auth_protocol\nssh_message_channel_request_x11_screen_number\nssh_message_channel_request_x11_single_connection\nssh_message_free\nssh_message_get\nssh_message_global_request_address\nssh_message_global_request_port\nssh_message_global_request_reply_success\nssh_message_reply_default\nssh_message_retrieve\nssh_message_service_reply_success\nssh_message_service_service\nssh_message_subtype\nssh_message_type\nssh_mkdir\nssh_new\nssh_options_copy\nssh_options_get\nssh_options_get_port\nssh_options_getopt\nssh_options_parse_config\nssh_options_set\nssh_pcap_file_close\nssh_pcap_file_free\nssh_pcap_file_new\nssh_pcap_file_open\nssh_pki_copy_cert_to_privkey\nssh_pki_export_privkey_file\nssh_pki_export_privkey_to_pubkey\nssh_pki_export_pubkey_base64\nssh_pki_export_pubkey_file\nssh_pki_generate\nssh_pki_import_cert_base64\nssh_pki_import_cert_file\nssh_pki_import_privkey_base64\nssh_pki_import_privkey_file\nssh_pki_import_pubkey_base64\nssh_pki_import_pubkey_file\nssh_pki_key_ecdsa_name\nssh_print_hash\nssh_print_hexa\nssh_privatekey_type\nssh_publickey_to_file\nssh_remove_channel_callbacks\nssh_scp_accept_request\nssh_scp_close\nssh_scp_deny_request\nssh_scp_free\nssh_scp_init\nssh_scp_leave_directory\nssh_scp_new\nssh_scp_pull_request\nssh_scp_push_directory\nssh_scp_push_file\nssh_scp_push_file64\nssh_scp_read\nssh_scp_request_get_filename\nssh_scp_request_get_permissions\nssh_scp_request_get_size\nssh_scp_request_get_size64\nssh_scp_request_get_warning\nssh_scp_write\nssh_select\nssh_send_debug\nssh_send_ignore\nssh_send_keepalive\nssh_server_init_kex\nssh_service_request\nssh_session_export_known_hosts_entry\nssh_session_has_known_hosts_entry\nssh_session_is_known_server\nssh_session_update_known_hosts\nssh_set_agent_channel\nssh_set_agent_socket\nssh_set_auth_methods\nssh_set_blocking\nssh_set_callbacks\nssh_set_channel_callbacks\nssh_set_counters\nssh_set_fd_except\nssh_set_fd_toread\nssh_set_fd_towrite\nssh_set_log_callback\nssh_set_log_level\nssh_set_log_userdata\nssh_set_message_callback\nssh_set_pcap_file\nssh_set_server_callbacks\nssh_silent_disconnect\nssh_string_burn\nssh_string_copy\nssh_string_data\nssh_string_fill\nssh_string_free\nssh_string_free_char\nssh_string_from_char\nssh_string_get_char\nssh_string_len\nssh_string_new\nssh_string_to_char\nssh_threads_get_noop\nssh_threads_get_pthread\nssh_threads_set_callbacks\nssh_try_publickey_from_file\nssh_userauth_agent\nssh_userauth_agent_pubkey\nssh_userauth_autopubkey\nssh_userauth_gssapi\nssh_userauth_kbdint\nssh_userauth_kbdint_getanswer\nssh_userauth_kbdint_getinstruction\nssh_userauth_kbdint_getname\nssh_userauth_kbdint_getnanswers\nssh_userauth_kbdint_getnprompts\nssh_userauth_kbdint_getprompt\nssh_userauth_kbdint_setanswer\nssh_userauth_list\nssh_userauth_none\nssh_userauth_offer_pubkey\nssh_userauth_password\nssh_userauth_privatekey_file\nssh_userauth_pubkey\nssh_userauth_publickey\nssh_userauth_publickey_auto\nssh_userauth_try_publickey\nssh_version\nssh_write_knownhost\nstring_burn\nstring_copy\nstring_data\nstring_fill\nstring_free\nstring_from_char\nstring_len\nstring_new\nstring_to_char"
  },
  {
    "path": "src/libssh/src/ABI/libssh-4.7.0.symbols",
    "content": "_ssh_log\nbuffer_free\nbuffer_get\nbuffer_get_len\nbuffer_new\nchannel_accept_x11\nchannel_change_pty_size\nchannel_close\nchannel_forward_accept\nchannel_forward_cancel\nchannel_forward_listen\nchannel_free\nchannel_get_exit_status\nchannel_get_session\nchannel_is_closed\nchannel_is_eof\nchannel_is_open\nchannel_new\nchannel_open_forward\nchannel_open_session\nchannel_poll\nchannel_read\nchannel_read_buffer\nchannel_read_nonblocking\nchannel_request_env\nchannel_request_exec\nchannel_request_pty\nchannel_request_pty_size\nchannel_request_send_signal\nchannel_request_sftp\nchannel_request_shell\nchannel_request_subsystem\nchannel_request_x11\nchannel_select\nchannel_send_eof\nchannel_set_blocking\nchannel_write\nchannel_write_stderr\nprivatekey_free\nprivatekey_from_file\npublickey_free\npublickey_from_file\npublickey_from_privatekey\npublickey_to_string\nsftp_async_read\nsftp_async_read_begin\nsftp_attributes_free\nsftp_canonicalize_path\nsftp_chmod\nsftp_chown\nsftp_client_message_free\nsftp_client_message_get_data\nsftp_client_message_get_filename\nsftp_client_message_get_flags\nsftp_client_message_get_submessage\nsftp_client_message_get_type\nsftp_client_message_set_filename\nsftp_close\nsftp_closedir\nsftp_dir_eof\nsftp_extension_supported\nsftp_extensions_get_count\nsftp_extensions_get_data\nsftp_extensions_get_name\nsftp_file_set_blocking\nsftp_file_set_nonblocking\nsftp_free\nsftp_fstat\nsftp_fstatvfs\nsftp_fsync\nsftp_get_client_message\nsftp_get_error\nsftp_handle\nsftp_handle_alloc\nsftp_handle_remove\nsftp_init\nsftp_lstat\nsftp_mkdir\nsftp_new\nsftp_new_channel\nsftp_open\nsftp_opendir\nsftp_read\nsftp_readdir\nsftp_readlink\nsftp_rename\nsftp_reply_attr\nsftp_reply_data\nsftp_reply_handle\nsftp_reply_name\nsftp_reply_names\nsftp_reply_names_add\nsftp_reply_status\nsftp_rewind\nsftp_rmdir\nsftp_seek\nsftp_seek64\nsftp_send_client_message\nsftp_server_init\nsftp_server_new\nsftp_server_version\nsftp_setstat\nsftp_stat\nsftp_statvfs\nsftp_statvfs_free\nsftp_symlink\nsftp_tell\nsftp_tell64\nsftp_unlink\nsftp_utimes\nsftp_write\nssh_accept\nssh_add_channel_callbacks\nssh_auth_list\nssh_basename\nssh_bind_accept\nssh_bind_accept_fd\nssh_bind_fd_toaccept\nssh_bind_free\nssh_bind_get_fd\nssh_bind_listen\nssh_bind_new\nssh_bind_options_set\nssh_bind_set_blocking\nssh_bind_set_callbacks\nssh_bind_set_fd\nssh_blocking_flush\nssh_buffer_add_data\nssh_buffer_free\nssh_buffer_get\nssh_buffer_get_data\nssh_buffer_get_len\nssh_buffer_new\nssh_buffer_reinit\nssh_channel_accept_forward\nssh_channel_accept_x11\nssh_channel_cancel_forward\nssh_channel_change_pty_size\nssh_channel_close\nssh_channel_free\nssh_channel_get_exit_status\nssh_channel_get_session\nssh_channel_is_closed\nssh_channel_is_eof\nssh_channel_is_open\nssh_channel_listen_forward\nssh_channel_new\nssh_channel_open_auth_agent\nssh_channel_open_forward\nssh_channel_open_reverse_forward\nssh_channel_open_session\nssh_channel_open_x11\nssh_channel_poll\nssh_channel_poll_timeout\nssh_channel_read\nssh_channel_read_nonblocking\nssh_channel_read_timeout\nssh_channel_request_auth_agent\nssh_channel_request_env\nssh_channel_request_exec\nssh_channel_request_pty\nssh_channel_request_pty_size\nssh_channel_request_send_break\nssh_channel_request_send_exit_signal\nssh_channel_request_send_exit_status\nssh_channel_request_send_signal\nssh_channel_request_sftp\nssh_channel_request_shell\nssh_channel_request_subsystem\nssh_channel_request_x11\nssh_channel_select\nssh_channel_send_eof\nssh_channel_set_blocking\nssh_channel_set_counter\nssh_channel_window_size\nssh_channel_write\nssh_channel_write_stderr\nssh_clean_pubkey_hash\nssh_connect\nssh_connector_free\nssh_connector_new\nssh_connector_set_in_channel\nssh_connector_set_in_fd\nssh_connector_set_out_channel\nssh_connector_set_out_fd\nssh_copyright\nssh_dirname\nssh_disconnect\nssh_dump_knownhost\nssh_event_add_connector\nssh_event_add_fd\nssh_event_add_session\nssh_event_dopoll\nssh_event_free\nssh_event_new\nssh_event_remove_connector\nssh_event_remove_fd\nssh_event_remove_session\nssh_execute_message_callbacks\nssh_finalize\nssh_forward_accept\nssh_forward_cancel\nssh_forward_listen\nssh_free\nssh_get_cipher_in\nssh_get_cipher_out\nssh_get_clientbanner\nssh_get_disconnect_message\nssh_get_error\nssh_get_error_code\nssh_get_fd\nssh_get_fingerprint_hash\nssh_get_hexa\nssh_get_hmac_in\nssh_get_hmac_out\nssh_get_issue_banner\nssh_get_kex_algo\nssh_get_log_callback\nssh_get_log_level\nssh_get_log_userdata\nssh_get_openssh_version\nssh_get_poll_flags\nssh_get_pubkey\nssh_get_pubkey_hash\nssh_get_publickey\nssh_get_publickey_hash\nssh_get_random\nssh_get_server_publickey\nssh_get_serverbanner\nssh_get_status\nssh_get_version\nssh_getpass\nssh_gssapi_get_creds\nssh_gssapi_set_creds\nssh_handle_key_exchange\nssh_init\nssh_is_blocking\nssh_is_connected\nssh_is_server_known\nssh_key_cmp\nssh_key_free\nssh_key_is_private\nssh_key_is_public\nssh_key_new\nssh_key_type\nssh_key_type_from_name\nssh_key_type_to_char\nssh_known_hosts_parse_line\nssh_knownhosts_entry_free\nssh_log\nssh_message_auth_interactive_request\nssh_message_auth_kbdint_is_response\nssh_message_auth_password\nssh_message_auth_pubkey\nssh_message_auth_publickey\nssh_message_auth_publickey_state\nssh_message_auth_reply_pk_ok\nssh_message_auth_reply_pk_ok_simple\nssh_message_auth_reply_success\nssh_message_auth_set_methods\nssh_message_auth_user\nssh_message_channel_request_channel\nssh_message_channel_request_command\nssh_message_channel_request_env_name\nssh_message_channel_request_env_value\nssh_message_channel_request_open_destination\nssh_message_channel_request_open_destination_port\nssh_message_channel_request_open_originator\nssh_message_channel_request_open_originator_port\nssh_message_channel_request_open_reply_accept\nssh_message_channel_request_pty_height\nssh_message_channel_request_pty_pxheight\nssh_message_channel_request_pty_pxwidth\nssh_message_channel_request_pty_term\nssh_message_channel_request_pty_width\nssh_message_channel_request_reply_success\nssh_message_channel_request_subsystem\nssh_message_channel_request_x11_auth_cookie\nssh_message_channel_request_x11_auth_protocol\nssh_message_channel_request_x11_screen_number\nssh_message_channel_request_x11_single_connection\nssh_message_free\nssh_message_get\nssh_message_global_request_address\nssh_message_global_request_port\nssh_message_global_request_reply_success\nssh_message_reply_default\nssh_message_retrieve\nssh_message_service_reply_success\nssh_message_service_service\nssh_message_subtype\nssh_message_type\nssh_mkdir\nssh_new\nssh_options_copy\nssh_options_get\nssh_options_get_port\nssh_options_getopt\nssh_options_parse_config\nssh_options_set\nssh_pcap_file_close\nssh_pcap_file_free\nssh_pcap_file_new\nssh_pcap_file_open\nssh_pki_copy_cert_to_privkey\nssh_pki_export_privkey_base64\nssh_pki_export_privkey_file\nssh_pki_export_privkey_to_pubkey\nssh_pki_export_pubkey_base64\nssh_pki_export_pubkey_file\nssh_pki_generate\nssh_pki_import_cert_base64\nssh_pki_import_cert_file\nssh_pki_import_privkey_base64\nssh_pki_import_privkey_file\nssh_pki_import_pubkey_base64\nssh_pki_import_pubkey_file\nssh_pki_key_ecdsa_name\nssh_print_hash\nssh_print_hexa\nssh_privatekey_type\nssh_publickey_to_file\nssh_remove_channel_callbacks\nssh_scp_accept_request\nssh_scp_close\nssh_scp_deny_request\nssh_scp_free\nssh_scp_init\nssh_scp_leave_directory\nssh_scp_new\nssh_scp_pull_request\nssh_scp_push_directory\nssh_scp_push_file\nssh_scp_push_file64\nssh_scp_read\nssh_scp_request_get_filename\nssh_scp_request_get_permissions\nssh_scp_request_get_size\nssh_scp_request_get_size64\nssh_scp_request_get_warning\nssh_scp_write\nssh_select\nssh_send_debug\nssh_send_ignore\nssh_send_keepalive\nssh_server_init_kex\nssh_service_request\nssh_session_export_known_hosts_entry\nssh_session_has_known_hosts_entry\nssh_session_is_known_server\nssh_session_update_known_hosts\nssh_set_agent_channel\nssh_set_agent_socket\nssh_set_auth_methods\nssh_set_blocking\nssh_set_callbacks\nssh_set_channel_callbacks\nssh_set_counters\nssh_set_fd_except\nssh_set_fd_toread\nssh_set_fd_towrite\nssh_set_log_callback\nssh_set_log_level\nssh_set_log_userdata\nssh_set_message_callback\nssh_set_pcap_file\nssh_set_server_callbacks\nssh_silent_disconnect\nssh_string_burn\nssh_string_copy\nssh_string_data\nssh_string_fill\nssh_string_free\nssh_string_free_char\nssh_string_from_char\nssh_string_get_char\nssh_string_len\nssh_string_new\nssh_string_to_char\nssh_threads_get_noop\nssh_threads_get_pthread\nssh_threads_set_callbacks\nssh_try_publickey_from_file\nssh_userauth_agent\nssh_userauth_agent_pubkey\nssh_userauth_autopubkey\nssh_userauth_gssapi\nssh_userauth_kbdint\nssh_userauth_kbdint_getanswer\nssh_userauth_kbdint_getinstruction\nssh_userauth_kbdint_getname\nssh_userauth_kbdint_getnanswers\nssh_userauth_kbdint_getnprompts\nssh_userauth_kbdint_getprompt\nssh_userauth_kbdint_setanswer\nssh_userauth_list\nssh_userauth_none\nssh_userauth_offer_pubkey\nssh_userauth_password\nssh_userauth_privatekey_file\nssh_userauth_pubkey\nssh_userauth_publickey\nssh_userauth_publickey_auto\nssh_userauth_try_publickey\nssh_version\nssh_write_knownhost\nstring_burn\nstring_copy\nstring_data\nstring_fill\nstring_free\nstring_from_char\nstring_len\nstring_new\nstring_to_char"
  },
  {
    "path": "src/libssh/src/ABI/libssh-4.7.1.symbols",
    "content": "_ssh_log\nbuffer_free\nbuffer_get\nbuffer_get_len\nbuffer_new\nchannel_accept_x11\nchannel_change_pty_size\nchannel_close\nchannel_forward_accept\nchannel_forward_cancel\nchannel_forward_listen\nchannel_free\nchannel_get_exit_status\nchannel_get_session\nchannel_is_closed\nchannel_is_eof\nchannel_is_open\nchannel_new\nchannel_open_forward\nchannel_open_session\nchannel_poll\nchannel_read\nchannel_read_buffer\nchannel_read_nonblocking\nchannel_request_env\nchannel_request_exec\nchannel_request_pty\nchannel_request_pty_size\nchannel_request_send_signal\nchannel_request_sftp\nchannel_request_shell\nchannel_request_subsystem\nchannel_request_x11\nchannel_select\nchannel_send_eof\nchannel_set_blocking\nchannel_write\nchannel_write_stderr\nprivatekey_free\nprivatekey_from_file\npublickey_free\npublickey_from_file\npublickey_from_privatekey\npublickey_to_string\nsftp_async_read\nsftp_async_read_begin\nsftp_attributes_free\nsftp_canonicalize_path\nsftp_chmod\nsftp_chown\nsftp_client_message_free\nsftp_client_message_get_data\nsftp_client_message_get_filename\nsftp_client_message_get_flags\nsftp_client_message_get_submessage\nsftp_client_message_get_type\nsftp_client_message_set_filename\nsftp_close\nsftp_closedir\nsftp_dir_eof\nsftp_extension_supported\nsftp_extensions_get_count\nsftp_extensions_get_data\nsftp_extensions_get_name\nsftp_file_set_blocking\nsftp_file_set_nonblocking\nsftp_free\nsftp_fstat\nsftp_fstatvfs\nsftp_fsync\nsftp_get_client_message\nsftp_get_error\nsftp_handle\nsftp_handle_alloc\nsftp_handle_remove\nsftp_init\nsftp_lstat\nsftp_mkdir\nsftp_new\nsftp_new_channel\nsftp_open\nsftp_opendir\nsftp_read\nsftp_readdir\nsftp_readlink\nsftp_rename\nsftp_reply_attr\nsftp_reply_data\nsftp_reply_handle\nsftp_reply_name\nsftp_reply_names\nsftp_reply_names_add\nsftp_reply_status\nsftp_rewind\nsftp_rmdir\nsftp_seek\nsftp_seek64\nsftp_send_client_message\nsftp_server_init\nsftp_server_new\nsftp_server_version\nsftp_setstat\nsftp_stat\nsftp_statvfs\nsftp_statvfs_free\nsftp_symlink\nsftp_tell\nsftp_tell64\nsftp_unlink\nsftp_utimes\nsftp_write\nssh_accept\nssh_add_channel_callbacks\nssh_auth_list\nssh_basename\nssh_bind_accept\nssh_bind_accept_fd\nssh_bind_fd_toaccept\nssh_bind_free\nssh_bind_get_fd\nssh_bind_listen\nssh_bind_new\nssh_bind_options_set\nssh_bind_set_blocking\nssh_bind_set_callbacks\nssh_bind_set_fd\nssh_blocking_flush\nssh_buffer_add_data\nssh_buffer_free\nssh_buffer_get\nssh_buffer_get_data\nssh_buffer_get_len\nssh_buffer_new\nssh_buffer_reinit\nssh_channel_accept_forward\nssh_channel_accept_x11\nssh_channel_cancel_forward\nssh_channel_change_pty_size\nssh_channel_close\nssh_channel_free\nssh_channel_get_exit_status\nssh_channel_get_session\nssh_channel_is_closed\nssh_channel_is_eof\nssh_channel_is_open\nssh_channel_listen_forward\nssh_channel_new\nssh_channel_open_auth_agent\nssh_channel_open_forward\nssh_channel_open_reverse_forward\nssh_channel_open_session\nssh_channel_open_x11\nssh_channel_poll\nssh_channel_poll_timeout\nssh_channel_read\nssh_channel_read_nonblocking\nssh_channel_read_timeout\nssh_channel_request_auth_agent\nssh_channel_request_env\nssh_channel_request_exec\nssh_channel_request_pty\nssh_channel_request_pty_size\nssh_channel_request_send_break\nssh_channel_request_send_exit_signal\nssh_channel_request_send_exit_status\nssh_channel_request_send_signal\nssh_channel_request_sftp\nssh_channel_request_shell\nssh_channel_request_subsystem\nssh_channel_request_x11\nssh_channel_select\nssh_channel_send_eof\nssh_channel_set_blocking\nssh_channel_set_counter\nssh_channel_window_size\nssh_channel_write\nssh_channel_write_stderr\nssh_clean_pubkey_hash\nssh_connect\nssh_connector_free\nssh_connector_new\nssh_connector_set_in_channel\nssh_connector_set_in_fd\nssh_connector_set_out_channel\nssh_connector_set_out_fd\nssh_copyright\nssh_dirname\nssh_disconnect\nssh_dump_knownhost\nssh_event_add_connector\nssh_event_add_fd\nssh_event_add_session\nssh_event_dopoll\nssh_event_free\nssh_event_new\nssh_event_remove_connector\nssh_event_remove_fd\nssh_event_remove_session\nssh_execute_message_callbacks\nssh_finalize\nssh_forward_accept\nssh_forward_cancel\nssh_forward_listen\nssh_free\nssh_get_cipher_in\nssh_get_cipher_out\nssh_get_clientbanner\nssh_get_disconnect_message\nssh_get_error\nssh_get_error_code\nssh_get_fd\nssh_get_fingerprint_hash\nssh_get_hexa\nssh_get_hmac_in\nssh_get_hmac_out\nssh_get_issue_banner\nssh_get_kex_algo\nssh_get_log_callback\nssh_get_log_level\nssh_get_log_userdata\nssh_get_openssh_version\nssh_get_poll_flags\nssh_get_pubkey\nssh_get_pubkey_hash\nssh_get_publickey\nssh_get_publickey_hash\nssh_get_random\nssh_get_server_publickey\nssh_get_serverbanner\nssh_get_status\nssh_get_version\nssh_getpass\nssh_gssapi_get_creds\nssh_gssapi_set_creds\nssh_handle_key_exchange\nssh_init\nssh_is_blocking\nssh_is_connected\nssh_is_server_known\nssh_key_cmp\nssh_key_free\nssh_key_is_private\nssh_key_is_public\nssh_key_new\nssh_key_type\nssh_key_type_from_name\nssh_key_type_to_char\nssh_known_hosts_parse_line\nssh_knownhosts_entry_free\nssh_log\nssh_message_auth_interactive_request\nssh_message_auth_kbdint_is_response\nssh_message_auth_password\nssh_message_auth_pubkey\nssh_message_auth_publickey\nssh_message_auth_publickey_state\nssh_message_auth_reply_pk_ok\nssh_message_auth_reply_pk_ok_simple\nssh_message_auth_reply_success\nssh_message_auth_set_methods\nssh_message_auth_user\nssh_message_channel_request_channel\nssh_message_channel_request_command\nssh_message_channel_request_env_name\nssh_message_channel_request_env_value\nssh_message_channel_request_open_destination\nssh_message_channel_request_open_destination_port\nssh_message_channel_request_open_originator\nssh_message_channel_request_open_originator_port\nssh_message_channel_request_open_reply_accept\nssh_message_channel_request_pty_height\nssh_message_channel_request_pty_pxheight\nssh_message_channel_request_pty_pxwidth\nssh_message_channel_request_pty_term\nssh_message_channel_request_pty_width\nssh_message_channel_request_reply_success\nssh_message_channel_request_subsystem\nssh_message_channel_request_x11_auth_cookie\nssh_message_channel_request_x11_auth_protocol\nssh_message_channel_request_x11_screen_number\nssh_message_channel_request_x11_single_connection\nssh_message_free\nssh_message_get\nssh_message_global_request_address\nssh_message_global_request_port\nssh_message_global_request_reply_success\nssh_message_reply_default\nssh_message_retrieve\nssh_message_service_reply_success\nssh_message_service_service\nssh_message_subtype\nssh_message_type\nssh_mkdir\nssh_new\nssh_options_copy\nssh_options_get\nssh_options_get_port\nssh_options_getopt\nssh_options_parse_config\nssh_options_set\nssh_pcap_file_close\nssh_pcap_file_free\nssh_pcap_file_new\nssh_pcap_file_open\nssh_pki_copy_cert_to_privkey\nssh_pki_export_privkey_base64\nssh_pki_export_privkey_file\nssh_pki_export_privkey_to_pubkey\nssh_pki_export_pubkey_base64\nssh_pki_export_pubkey_file\nssh_pki_generate\nssh_pki_import_cert_base64\nssh_pki_import_cert_file\nssh_pki_import_privkey_base64\nssh_pki_import_privkey_file\nssh_pki_import_pubkey_base64\nssh_pki_import_pubkey_file\nssh_pki_key_ecdsa_name\nssh_print_hash\nssh_print_hexa\nssh_privatekey_type\nssh_publickey_to_file\nssh_remove_channel_callbacks\nssh_scp_accept_request\nssh_scp_close\nssh_scp_deny_request\nssh_scp_free\nssh_scp_init\nssh_scp_leave_directory\nssh_scp_new\nssh_scp_pull_request\nssh_scp_push_directory\nssh_scp_push_file\nssh_scp_push_file64\nssh_scp_read\nssh_scp_request_get_filename\nssh_scp_request_get_permissions\nssh_scp_request_get_size\nssh_scp_request_get_size64\nssh_scp_request_get_warning\nssh_scp_write\nssh_select\nssh_send_debug\nssh_send_ignore\nssh_send_keepalive\nssh_server_init_kex\nssh_service_request\nssh_session_export_known_hosts_entry\nssh_session_has_known_hosts_entry\nssh_session_is_known_server\nssh_session_update_known_hosts\nssh_set_agent_channel\nssh_set_agent_socket\nssh_set_auth_methods\nssh_set_blocking\nssh_set_callbacks\nssh_set_channel_callbacks\nssh_set_counters\nssh_set_fd_except\nssh_set_fd_toread\nssh_set_fd_towrite\nssh_set_log_callback\nssh_set_log_level\nssh_set_log_userdata\nssh_set_message_callback\nssh_set_pcap_file\nssh_set_server_callbacks\nssh_silent_disconnect\nssh_string_burn\nssh_string_copy\nssh_string_data\nssh_string_fill\nssh_string_free\nssh_string_free_char\nssh_string_from_char\nssh_string_get_char\nssh_string_len\nssh_string_new\nssh_string_to_char\nssh_threads_get_noop\nssh_threads_get_pthread\nssh_threads_set_callbacks\nssh_try_publickey_from_file\nssh_userauth_agent\nssh_userauth_agent_pubkey\nssh_userauth_autopubkey\nssh_userauth_gssapi\nssh_userauth_kbdint\nssh_userauth_kbdint_getanswer\nssh_userauth_kbdint_getinstruction\nssh_userauth_kbdint_getname\nssh_userauth_kbdint_getnanswers\nssh_userauth_kbdint_getnprompts\nssh_userauth_kbdint_getprompt\nssh_userauth_kbdint_setanswer\nssh_userauth_list\nssh_userauth_none\nssh_userauth_offer_pubkey\nssh_userauth_password\nssh_userauth_privatekey_file\nssh_userauth_pubkey\nssh_userauth_publickey\nssh_userauth_publickey_auto\nssh_userauth_try_publickey\nssh_version\nssh_write_knownhost\nstring_burn\nstring_copy\nstring_data\nstring_fill\nstring_free\nstring_from_char\nstring_len\nstring_new\nstring_to_char"
  },
  {
    "path": "src/libssh/src/ABI/libssh-4.7.2.symbols",
    "content": "_ssh_log\nbuffer_free\nbuffer_get\nbuffer_get_len\nbuffer_new\nchannel_accept_x11\nchannel_change_pty_size\nchannel_close\nchannel_forward_accept\nchannel_forward_cancel\nchannel_forward_listen\nchannel_free\nchannel_get_exit_status\nchannel_get_session\nchannel_is_closed\nchannel_is_eof\nchannel_is_open\nchannel_new\nchannel_open_forward\nchannel_open_session\nchannel_poll\nchannel_read\nchannel_read_buffer\nchannel_read_nonblocking\nchannel_request_env\nchannel_request_exec\nchannel_request_pty\nchannel_request_pty_size\nchannel_request_send_signal\nchannel_request_sftp\nchannel_request_shell\nchannel_request_subsystem\nchannel_request_x11\nchannel_select\nchannel_send_eof\nchannel_set_blocking\nchannel_write\nchannel_write_stderr\nprivatekey_free\nprivatekey_from_file\npublickey_free\npublickey_from_file\npublickey_from_privatekey\npublickey_to_string\nsftp_async_read\nsftp_async_read_begin\nsftp_attributes_free\nsftp_canonicalize_path\nsftp_chmod\nsftp_chown\nsftp_client_message_free\nsftp_client_message_get_data\nsftp_client_message_get_filename\nsftp_client_message_get_flags\nsftp_client_message_get_submessage\nsftp_client_message_get_type\nsftp_client_message_set_filename\nsftp_close\nsftp_closedir\nsftp_dir_eof\nsftp_extension_supported\nsftp_extensions_get_count\nsftp_extensions_get_data\nsftp_extensions_get_name\nsftp_file_set_blocking\nsftp_file_set_nonblocking\nsftp_free\nsftp_fstat\nsftp_fstatvfs\nsftp_fsync\nsftp_get_client_message\nsftp_get_error\nsftp_handle\nsftp_handle_alloc\nsftp_handle_remove\nsftp_init\nsftp_lstat\nsftp_mkdir\nsftp_new\nsftp_new_channel\nsftp_open\nsftp_opendir\nsftp_read\nsftp_readdir\nsftp_readlink\nsftp_rename\nsftp_reply_attr\nsftp_reply_data\nsftp_reply_handle\nsftp_reply_name\nsftp_reply_names\nsftp_reply_names_add\nsftp_reply_status\nsftp_rewind\nsftp_rmdir\nsftp_seek\nsftp_seek64\nsftp_send_client_message\nsftp_server_init\nsftp_server_new\nsftp_server_version\nsftp_setstat\nsftp_stat\nsftp_statvfs\nsftp_statvfs_free\nsftp_symlink\nsftp_tell\nsftp_tell64\nsftp_unlink\nsftp_utimes\nsftp_write\nssh_accept\nssh_add_channel_callbacks\nssh_auth_list\nssh_basename\nssh_bind_accept\nssh_bind_accept_fd\nssh_bind_fd_toaccept\nssh_bind_free\nssh_bind_get_fd\nssh_bind_listen\nssh_bind_new\nssh_bind_options_set\nssh_bind_set_blocking\nssh_bind_set_callbacks\nssh_bind_set_fd\nssh_blocking_flush\nssh_buffer_add_data\nssh_buffer_free\nssh_buffer_get\nssh_buffer_get_data\nssh_buffer_get_len\nssh_buffer_new\nssh_buffer_reinit\nssh_channel_accept_forward\nssh_channel_accept_x11\nssh_channel_cancel_forward\nssh_channel_change_pty_size\nssh_channel_close\nssh_channel_free\nssh_channel_get_exit_status\nssh_channel_get_session\nssh_channel_is_closed\nssh_channel_is_eof\nssh_channel_is_open\nssh_channel_listen_forward\nssh_channel_new\nssh_channel_open_auth_agent\nssh_channel_open_forward\nssh_channel_open_reverse_forward\nssh_channel_open_session\nssh_channel_open_x11\nssh_channel_poll\nssh_channel_poll_timeout\nssh_channel_read\nssh_channel_read_nonblocking\nssh_channel_read_timeout\nssh_channel_request_auth_agent\nssh_channel_request_env\nssh_channel_request_exec\nssh_channel_request_pty\nssh_channel_request_pty_size\nssh_channel_request_send_break\nssh_channel_request_send_exit_signal\nssh_channel_request_send_exit_status\nssh_channel_request_send_signal\nssh_channel_request_sftp\nssh_channel_request_shell\nssh_channel_request_subsystem\nssh_channel_request_x11\nssh_channel_select\nssh_channel_send_eof\nssh_channel_set_blocking\nssh_channel_set_counter\nssh_channel_window_size\nssh_channel_write\nssh_channel_write_stderr\nssh_clean_pubkey_hash\nssh_connect\nssh_connector_free\nssh_connector_new\nssh_connector_set_in_channel\nssh_connector_set_in_fd\nssh_connector_set_out_channel\nssh_connector_set_out_fd\nssh_copyright\nssh_dirname\nssh_disconnect\nssh_dump_knownhost\nssh_event_add_connector\nssh_event_add_fd\nssh_event_add_session\nssh_event_dopoll\nssh_event_free\nssh_event_new\nssh_event_remove_connector\nssh_event_remove_fd\nssh_event_remove_session\nssh_execute_message_callbacks\nssh_finalize\nssh_forward_accept\nssh_forward_cancel\nssh_forward_listen\nssh_free\nssh_get_cipher_in\nssh_get_cipher_out\nssh_get_clientbanner\nssh_get_disconnect_message\nssh_get_error\nssh_get_error_code\nssh_get_fd\nssh_get_fingerprint_hash\nssh_get_hexa\nssh_get_hmac_in\nssh_get_hmac_out\nssh_get_issue_banner\nssh_get_kex_algo\nssh_get_log_callback\nssh_get_log_level\nssh_get_log_userdata\nssh_get_openssh_version\nssh_get_poll_flags\nssh_get_pubkey\nssh_get_pubkey_hash\nssh_get_publickey\nssh_get_publickey_hash\nssh_get_random\nssh_get_server_publickey\nssh_get_serverbanner\nssh_get_status\nssh_get_version\nssh_getpass\nssh_gssapi_get_creds\nssh_gssapi_set_creds\nssh_handle_key_exchange\nssh_init\nssh_is_blocking\nssh_is_connected\nssh_is_server_known\nssh_key_cmp\nssh_key_free\nssh_key_is_private\nssh_key_is_public\nssh_key_new\nssh_key_type\nssh_key_type_from_name\nssh_key_type_to_char\nssh_known_hosts_parse_line\nssh_knownhosts_entry_free\nssh_log\nssh_message_auth_interactive_request\nssh_message_auth_kbdint_is_response\nssh_message_auth_password\nssh_message_auth_pubkey\nssh_message_auth_publickey\nssh_message_auth_publickey_state\nssh_message_auth_reply_pk_ok\nssh_message_auth_reply_pk_ok_simple\nssh_message_auth_reply_success\nssh_message_auth_set_methods\nssh_message_auth_user\nssh_message_channel_request_channel\nssh_message_channel_request_command\nssh_message_channel_request_env_name\nssh_message_channel_request_env_value\nssh_message_channel_request_open_destination\nssh_message_channel_request_open_destination_port\nssh_message_channel_request_open_originator\nssh_message_channel_request_open_originator_port\nssh_message_channel_request_open_reply_accept\nssh_message_channel_request_pty_height\nssh_message_channel_request_pty_pxheight\nssh_message_channel_request_pty_pxwidth\nssh_message_channel_request_pty_term\nssh_message_channel_request_pty_width\nssh_message_channel_request_reply_success\nssh_message_channel_request_subsystem\nssh_message_channel_request_x11_auth_cookie\nssh_message_channel_request_x11_auth_protocol\nssh_message_channel_request_x11_screen_number\nssh_message_channel_request_x11_single_connection\nssh_message_free\nssh_message_get\nssh_message_global_request_address\nssh_message_global_request_port\nssh_message_global_request_reply_success\nssh_message_reply_default\nssh_message_retrieve\nssh_message_service_reply_success\nssh_message_service_service\nssh_message_subtype\nssh_message_type\nssh_mkdir\nssh_new\nssh_options_copy\nssh_options_get\nssh_options_get_port\nssh_options_getopt\nssh_options_parse_config\nssh_options_set\nssh_pcap_file_close\nssh_pcap_file_free\nssh_pcap_file_new\nssh_pcap_file_open\nssh_pki_copy_cert_to_privkey\nssh_pki_export_privkey_base64\nssh_pki_export_privkey_file\nssh_pki_export_privkey_to_pubkey\nssh_pki_export_pubkey_base64\nssh_pki_export_pubkey_file\nssh_pki_generate\nssh_pki_import_cert_base64\nssh_pki_import_cert_file\nssh_pki_import_privkey_base64\nssh_pki_import_privkey_file\nssh_pki_import_pubkey_base64\nssh_pki_import_pubkey_file\nssh_pki_key_ecdsa_name\nssh_print_hash\nssh_print_hexa\nssh_privatekey_type\nssh_publickey_to_file\nssh_remove_channel_callbacks\nssh_scp_accept_request\nssh_scp_close\nssh_scp_deny_request\nssh_scp_free\nssh_scp_init\nssh_scp_leave_directory\nssh_scp_new\nssh_scp_pull_request\nssh_scp_push_directory\nssh_scp_push_file\nssh_scp_push_file64\nssh_scp_read\nssh_scp_request_get_filename\nssh_scp_request_get_permissions\nssh_scp_request_get_size\nssh_scp_request_get_size64\nssh_scp_request_get_warning\nssh_scp_write\nssh_select\nssh_send_debug\nssh_send_ignore\nssh_send_keepalive\nssh_server_init_kex\nssh_service_request\nssh_session_export_known_hosts_entry\nssh_session_has_known_hosts_entry\nssh_session_is_known_server\nssh_session_update_known_hosts\nssh_set_agent_channel\nssh_set_agent_socket\nssh_set_auth_methods\nssh_set_blocking\nssh_set_callbacks\nssh_set_channel_callbacks\nssh_set_counters\nssh_set_fd_except\nssh_set_fd_toread\nssh_set_fd_towrite\nssh_set_log_callback\nssh_set_log_level\nssh_set_log_userdata\nssh_set_message_callback\nssh_set_pcap_file\nssh_set_server_callbacks\nssh_silent_disconnect\nssh_string_burn\nssh_string_copy\nssh_string_data\nssh_string_fill\nssh_string_free\nssh_string_free_char\nssh_string_from_char\nssh_string_get_char\nssh_string_len\nssh_string_new\nssh_string_to_char\nssh_threads_get_noop\nssh_threads_get_pthread\nssh_threads_set_callbacks\nssh_try_publickey_from_file\nssh_userauth_agent\nssh_userauth_agent_pubkey\nssh_userauth_autopubkey\nssh_userauth_gssapi\nssh_userauth_kbdint\nssh_userauth_kbdint_getanswer\nssh_userauth_kbdint_getinstruction\nssh_userauth_kbdint_getname\nssh_userauth_kbdint_getnanswers\nssh_userauth_kbdint_getnprompts\nssh_userauth_kbdint_getprompt\nssh_userauth_kbdint_setanswer\nssh_userauth_list\nssh_userauth_none\nssh_userauth_offer_pubkey\nssh_userauth_password\nssh_userauth_privatekey_file\nssh_userauth_pubkey\nssh_userauth_publickey\nssh_userauth_publickey_auto\nssh_userauth_try_publickey\nssh_version\nssh_write_knownhost\nstring_burn\nstring_copy\nstring_data\nstring_fill\nstring_free\nstring_from_char\nstring_len\nstring_new\nstring_to_char"
  },
  {
    "path": "src/libssh/src/ABI/libssh-4.7.3.symbols",
    "content": "_ssh_log\nbuffer_free\nbuffer_get\nbuffer_get_len\nbuffer_new\nchannel_accept_x11\nchannel_change_pty_size\nchannel_close\nchannel_forward_accept\nchannel_forward_cancel\nchannel_forward_listen\nchannel_free\nchannel_get_exit_status\nchannel_get_session\nchannel_is_closed\nchannel_is_eof\nchannel_is_open\nchannel_new\nchannel_open_forward\nchannel_open_session\nchannel_poll\nchannel_read\nchannel_read_buffer\nchannel_read_nonblocking\nchannel_request_env\nchannel_request_exec\nchannel_request_pty\nchannel_request_pty_size\nchannel_request_send_signal\nchannel_request_sftp\nchannel_request_shell\nchannel_request_subsystem\nchannel_request_x11\nchannel_select\nchannel_send_eof\nchannel_set_blocking\nchannel_write\nchannel_write_stderr\nprivatekey_free\nprivatekey_from_file\npublickey_free\npublickey_from_file\npublickey_from_privatekey\npublickey_to_string\nsftp_async_read\nsftp_async_read_begin\nsftp_attributes_free\nsftp_canonicalize_path\nsftp_chmod\nsftp_chown\nsftp_client_message_free\nsftp_client_message_get_data\nsftp_client_message_get_filename\nsftp_client_message_get_flags\nsftp_client_message_get_submessage\nsftp_client_message_get_type\nsftp_client_message_set_filename\nsftp_close\nsftp_closedir\nsftp_dir_eof\nsftp_extension_supported\nsftp_extensions_get_count\nsftp_extensions_get_data\nsftp_extensions_get_name\nsftp_file_set_blocking\nsftp_file_set_nonblocking\nsftp_free\nsftp_fstat\nsftp_fstatvfs\nsftp_fsync\nsftp_get_client_message\nsftp_get_error\nsftp_handle\nsftp_handle_alloc\nsftp_handle_remove\nsftp_init\nsftp_lstat\nsftp_mkdir\nsftp_new\nsftp_new_channel\nsftp_open\nsftp_opendir\nsftp_read\nsftp_readdir\nsftp_readlink\nsftp_rename\nsftp_reply_attr\nsftp_reply_data\nsftp_reply_handle\nsftp_reply_name\nsftp_reply_names\nsftp_reply_names_add\nsftp_reply_status\nsftp_rewind\nsftp_rmdir\nsftp_seek\nsftp_seek64\nsftp_send_client_message\nsftp_server_init\nsftp_server_new\nsftp_server_version\nsftp_setstat\nsftp_stat\nsftp_statvfs\nsftp_statvfs_free\nsftp_symlink\nsftp_tell\nsftp_tell64\nsftp_unlink\nsftp_utimes\nsftp_write\nssh_accept\nssh_add_channel_callbacks\nssh_auth_list\nssh_basename\nssh_bind_accept\nssh_bind_accept_fd\nssh_bind_fd_toaccept\nssh_bind_free\nssh_bind_get_fd\nssh_bind_listen\nssh_bind_new\nssh_bind_options_set\nssh_bind_set_blocking\nssh_bind_set_callbacks\nssh_bind_set_fd\nssh_blocking_flush\nssh_buffer_add_data\nssh_buffer_free\nssh_buffer_get\nssh_buffer_get_data\nssh_buffer_get_len\nssh_buffer_new\nssh_buffer_reinit\nssh_channel_accept_forward\nssh_channel_accept_x11\nssh_channel_cancel_forward\nssh_channel_change_pty_size\nssh_channel_close\nssh_channel_free\nssh_channel_get_exit_status\nssh_channel_get_session\nssh_channel_is_closed\nssh_channel_is_eof\nssh_channel_is_open\nssh_channel_listen_forward\nssh_channel_new\nssh_channel_open_auth_agent\nssh_channel_open_forward\nssh_channel_open_reverse_forward\nssh_channel_open_session\nssh_channel_open_x11\nssh_channel_poll\nssh_channel_poll_timeout\nssh_channel_read\nssh_channel_read_nonblocking\nssh_channel_read_timeout\nssh_channel_request_auth_agent\nssh_channel_request_env\nssh_channel_request_exec\nssh_channel_request_pty\nssh_channel_request_pty_size\nssh_channel_request_send_break\nssh_channel_request_send_exit_signal\nssh_channel_request_send_exit_status\nssh_channel_request_send_signal\nssh_channel_request_sftp\nssh_channel_request_shell\nssh_channel_request_subsystem\nssh_channel_request_x11\nssh_channel_select\nssh_channel_send_eof\nssh_channel_set_blocking\nssh_channel_set_counter\nssh_channel_window_size\nssh_channel_write\nssh_channel_write_stderr\nssh_clean_pubkey_hash\nssh_connect\nssh_connector_free\nssh_connector_new\nssh_connector_set_in_channel\nssh_connector_set_in_fd\nssh_connector_set_out_channel\nssh_connector_set_out_fd\nssh_copyright\nssh_dirname\nssh_disconnect\nssh_dump_knownhost\nssh_event_add_connector\nssh_event_add_fd\nssh_event_add_session\nssh_event_dopoll\nssh_event_free\nssh_event_new\nssh_event_remove_connector\nssh_event_remove_fd\nssh_event_remove_session\nssh_execute_message_callbacks\nssh_finalize\nssh_forward_accept\nssh_forward_cancel\nssh_forward_listen\nssh_free\nssh_get_cipher_in\nssh_get_cipher_out\nssh_get_clientbanner\nssh_get_disconnect_message\nssh_get_error\nssh_get_error_code\nssh_get_fd\nssh_get_fingerprint_hash\nssh_get_hexa\nssh_get_hmac_in\nssh_get_hmac_out\nssh_get_issue_banner\nssh_get_kex_algo\nssh_get_log_callback\nssh_get_log_level\nssh_get_log_userdata\nssh_get_openssh_version\nssh_get_poll_flags\nssh_get_pubkey\nssh_get_pubkey_hash\nssh_get_publickey\nssh_get_publickey_hash\nssh_get_random\nssh_get_server_publickey\nssh_get_serverbanner\nssh_get_status\nssh_get_version\nssh_getpass\nssh_gssapi_get_creds\nssh_gssapi_set_creds\nssh_handle_key_exchange\nssh_init\nssh_is_blocking\nssh_is_connected\nssh_is_server_known\nssh_key_cmp\nssh_key_free\nssh_key_is_private\nssh_key_is_public\nssh_key_new\nssh_key_type\nssh_key_type_from_name\nssh_key_type_to_char\nssh_known_hosts_parse_line\nssh_knownhosts_entry_free\nssh_log\nssh_message_auth_interactive_request\nssh_message_auth_kbdint_is_response\nssh_message_auth_password\nssh_message_auth_pubkey\nssh_message_auth_publickey\nssh_message_auth_publickey_state\nssh_message_auth_reply_pk_ok\nssh_message_auth_reply_pk_ok_simple\nssh_message_auth_reply_success\nssh_message_auth_set_methods\nssh_message_auth_user\nssh_message_channel_request_channel\nssh_message_channel_request_command\nssh_message_channel_request_env_name\nssh_message_channel_request_env_value\nssh_message_channel_request_open_destination\nssh_message_channel_request_open_destination_port\nssh_message_channel_request_open_originator\nssh_message_channel_request_open_originator_port\nssh_message_channel_request_open_reply_accept\nssh_message_channel_request_pty_height\nssh_message_channel_request_pty_pxheight\nssh_message_channel_request_pty_pxwidth\nssh_message_channel_request_pty_term\nssh_message_channel_request_pty_width\nssh_message_channel_request_reply_success\nssh_message_channel_request_subsystem\nssh_message_channel_request_x11_auth_cookie\nssh_message_channel_request_x11_auth_protocol\nssh_message_channel_request_x11_screen_number\nssh_message_channel_request_x11_single_connection\nssh_message_free\nssh_message_get\nssh_message_global_request_address\nssh_message_global_request_port\nssh_message_global_request_reply_success\nssh_message_reply_default\nssh_message_retrieve\nssh_message_service_reply_success\nssh_message_service_service\nssh_message_subtype\nssh_message_type\nssh_mkdir\nssh_new\nssh_options_copy\nssh_options_get\nssh_options_get_port\nssh_options_getopt\nssh_options_parse_config\nssh_options_set\nssh_pcap_file_close\nssh_pcap_file_free\nssh_pcap_file_new\nssh_pcap_file_open\nssh_pki_copy_cert_to_privkey\nssh_pki_export_privkey_base64\nssh_pki_export_privkey_file\nssh_pki_export_privkey_to_pubkey\nssh_pki_export_pubkey_base64\nssh_pki_export_pubkey_file\nssh_pki_generate\nssh_pki_import_cert_base64\nssh_pki_import_cert_file\nssh_pki_import_privkey_base64\nssh_pki_import_privkey_file\nssh_pki_import_pubkey_base64\nssh_pki_import_pubkey_file\nssh_pki_key_ecdsa_name\nssh_print_hash\nssh_print_hexa\nssh_privatekey_type\nssh_publickey_to_file\nssh_remove_channel_callbacks\nssh_scp_accept_request\nssh_scp_close\nssh_scp_deny_request\nssh_scp_free\nssh_scp_init\nssh_scp_leave_directory\nssh_scp_new\nssh_scp_pull_request\nssh_scp_push_directory\nssh_scp_push_file\nssh_scp_push_file64\nssh_scp_read\nssh_scp_request_get_filename\nssh_scp_request_get_permissions\nssh_scp_request_get_size\nssh_scp_request_get_size64\nssh_scp_request_get_warning\nssh_scp_write\nssh_select\nssh_send_debug\nssh_send_ignore\nssh_send_keepalive\nssh_server_init_kex\nssh_service_request\nssh_session_export_known_hosts_entry\nssh_session_has_known_hosts_entry\nssh_session_is_known_server\nssh_session_update_known_hosts\nssh_set_agent_channel\nssh_set_agent_socket\nssh_set_auth_methods\nssh_set_blocking\nssh_set_callbacks\nssh_set_channel_callbacks\nssh_set_counters\nssh_set_fd_except\nssh_set_fd_toread\nssh_set_fd_towrite\nssh_set_log_callback\nssh_set_log_level\nssh_set_log_userdata\nssh_set_message_callback\nssh_set_pcap_file\nssh_set_server_callbacks\nssh_silent_disconnect\nssh_string_burn\nssh_string_copy\nssh_string_data\nssh_string_fill\nssh_string_free\nssh_string_free_char\nssh_string_from_char\nssh_string_get_char\nssh_string_len\nssh_string_new\nssh_string_to_char\nssh_threads_get_noop\nssh_threads_get_pthread\nssh_threads_set_callbacks\nssh_try_publickey_from_file\nssh_userauth_agent\nssh_userauth_agent_pubkey\nssh_userauth_autopubkey\nssh_userauth_gssapi\nssh_userauth_kbdint\nssh_userauth_kbdint_getanswer\nssh_userauth_kbdint_getinstruction\nssh_userauth_kbdint_getname\nssh_userauth_kbdint_getnanswers\nssh_userauth_kbdint_getnprompts\nssh_userauth_kbdint_getprompt\nssh_userauth_kbdint_setanswer\nssh_userauth_list\nssh_userauth_none\nssh_userauth_offer_pubkey\nssh_userauth_password\nssh_userauth_privatekey_file\nssh_userauth_pubkey\nssh_userauth_publickey\nssh_userauth_publickey_auto\nssh_userauth_try_publickey\nssh_version\nssh_write_knownhost\nstring_burn\nstring_copy\nstring_data\nstring_fill\nstring_free\nstring_from_char\nstring_len\nstring_new\nstring_to_char"
  },
  {
    "path": "src/libssh/src/ABI/libssh-4.7.4.symbols",
    "content": "_ssh_log\nbuffer_free\nbuffer_get\nbuffer_get_len\nbuffer_new\nchannel_accept_x11\nchannel_change_pty_size\nchannel_close\nchannel_forward_accept\nchannel_forward_cancel\nchannel_forward_listen\nchannel_free\nchannel_get_exit_status\nchannel_get_session\nchannel_is_closed\nchannel_is_eof\nchannel_is_open\nchannel_new\nchannel_open_forward\nchannel_open_session\nchannel_poll\nchannel_read\nchannel_read_buffer\nchannel_read_nonblocking\nchannel_request_env\nchannel_request_exec\nchannel_request_pty\nchannel_request_pty_size\nchannel_request_send_signal\nchannel_request_sftp\nchannel_request_shell\nchannel_request_subsystem\nchannel_request_x11\nchannel_select\nchannel_send_eof\nchannel_set_blocking\nchannel_write\nchannel_write_stderr\nprivatekey_free\nprivatekey_from_file\npublickey_free\npublickey_from_file\npublickey_from_privatekey\npublickey_to_string\nsftp_async_read\nsftp_async_read_begin\nsftp_attributes_free\nsftp_canonicalize_path\nsftp_chmod\nsftp_chown\nsftp_client_message_free\nsftp_client_message_get_data\nsftp_client_message_get_filename\nsftp_client_message_get_flags\nsftp_client_message_get_submessage\nsftp_client_message_get_type\nsftp_client_message_set_filename\nsftp_close\nsftp_closedir\nsftp_dir_eof\nsftp_extension_supported\nsftp_extensions_get_count\nsftp_extensions_get_data\nsftp_extensions_get_name\nsftp_file_set_blocking\nsftp_file_set_nonblocking\nsftp_free\nsftp_fstat\nsftp_fstatvfs\nsftp_fsync\nsftp_get_client_message\nsftp_get_error\nsftp_handle\nsftp_handle_alloc\nsftp_handle_remove\nsftp_init\nsftp_lstat\nsftp_mkdir\nsftp_new\nsftp_new_channel\nsftp_open\nsftp_opendir\nsftp_read\nsftp_readdir\nsftp_readlink\nsftp_rename\nsftp_reply_attr\nsftp_reply_data\nsftp_reply_handle\nsftp_reply_name\nsftp_reply_names\nsftp_reply_names_add\nsftp_reply_status\nsftp_rewind\nsftp_rmdir\nsftp_seek\nsftp_seek64\nsftp_send_client_message\nsftp_server_init\nsftp_server_new\nsftp_server_version\nsftp_setstat\nsftp_stat\nsftp_statvfs\nsftp_statvfs_free\nsftp_symlink\nsftp_tell\nsftp_tell64\nsftp_unlink\nsftp_utimes\nsftp_write\nssh_accept\nssh_add_channel_callbacks\nssh_auth_list\nssh_basename\nssh_bind_accept\nssh_bind_accept_fd\nssh_bind_fd_toaccept\nssh_bind_free\nssh_bind_get_fd\nssh_bind_listen\nssh_bind_new\nssh_bind_options_set\nssh_bind_set_blocking\nssh_bind_set_callbacks\nssh_bind_set_fd\nssh_blocking_flush\nssh_buffer_add_data\nssh_buffer_free\nssh_buffer_get\nssh_buffer_get_data\nssh_buffer_get_len\nssh_buffer_new\nssh_buffer_reinit\nssh_channel_accept_forward\nssh_channel_accept_x11\nssh_channel_cancel_forward\nssh_channel_change_pty_size\nssh_channel_close\nssh_channel_free\nssh_channel_get_exit_status\nssh_channel_get_session\nssh_channel_is_closed\nssh_channel_is_eof\nssh_channel_is_open\nssh_channel_listen_forward\nssh_channel_new\nssh_channel_open_auth_agent\nssh_channel_open_forward\nssh_channel_open_reverse_forward\nssh_channel_open_session\nssh_channel_open_x11\nssh_channel_poll\nssh_channel_poll_timeout\nssh_channel_read\nssh_channel_read_nonblocking\nssh_channel_read_timeout\nssh_channel_request_auth_agent\nssh_channel_request_env\nssh_channel_request_exec\nssh_channel_request_pty\nssh_channel_request_pty_size\nssh_channel_request_send_break\nssh_channel_request_send_exit_signal\nssh_channel_request_send_exit_status\nssh_channel_request_send_signal\nssh_channel_request_sftp\nssh_channel_request_shell\nssh_channel_request_subsystem\nssh_channel_request_x11\nssh_channel_select\nssh_channel_send_eof\nssh_channel_set_blocking\nssh_channel_set_counter\nssh_channel_window_size\nssh_channel_write\nssh_channel_write_stderr\nssh_clean_pubkey_hash\nssh_connect\nssh_connector_free\nssh_connector_new\nssh_connector_set_in_channel\nssh_connector_set_in_fd\nssh_connector_set_out_channel\nssh_connector_set_out_fd\nssh_copyright\nssh_dirname\nssh_disconnect\nssh_dump_knownhost\nssh_event_add_connector\nssh_event_add_fd\nssh_event_add_session\nssh_event_dopoll\nssh_event_free\nssh_event_new\nssh_event_remove_connector\nssh_event_remove_fd\nssh_event_remove_session\nssh_execute_message_callbacks\nssh_finalize\nssh_forward_accept\nssh_forward_cancel\nssh_forward_listen\nssh_free\nssh_get_cipher_in\nssh_get_cipher_out\nssh_get_clientbanner\nssh_get_disconnect_message\nssh_get_error\nssh_get_error_code\nssh_get_fd\nssh_get_fingerprint_hash\nssh_get_hexa\nssh_get_hmac_in\nssh_get_hmac_out\nssh_get_issue_banner\nssh_get_kex_algo\nssh_get_log_callback\nssh_get_log_level\nssh_get_log_userdata\nssh_get_openssh_version\nssh_get_poll_flags\nssh_get_pubkey\nssh_get_pubkey_hash\nssh_get_publickey\nssh_get_publickey_hash\nssh_get_random\nssh_get_server_publickey\nssh_get_serverbanner\nssh_get_status\nssh_get_version\nssh_getpass\nssh_gssapi_get_creds\nssh_gssapi_set_creds\nssh_handle_key_exchange\nssh_init\nssh_is_blocking\nssh_is_connected\nssh_is_server_known\nssh_key_cmp\nssh_key_free\nssh_key_is_private\nssh_key_is_public\nssh_key_new\nssh_key_type\nssh_key_type_from_name\nssh_key_type_to_char\nssh_known_hosts_parse_line\nssh_knownhosts_entry_free\nssh_log\nssh_message_auth_interactive_request\nssh_message_auth_kbdint_is_response\nssh_message_auth_password\nssh_message_auth_pubkey\nssh_message_auth_publickey\nssh_message_auth_publickey_state\nssh_message_auth_reply_pk_ok\nssh_message_auth_reply_pk_ok_simple\nssh_message_auth_reply_success\nssh_message_auth_set_methods\nssh_message_auth_user\nssh_message_channel_request_channel\nssh_message_channel_request_command\nssh_message_channel_request_env_name\nssh_message_channel_request_env_value\nssh_message_channel_request_open_destination\nssh_message_channel_request_open_destination_port\nssh_message_channel_request_open_originator\nssh_message_channel_request_open_originator_port\nssh_message_channel_request_open_reply_accept\nssh_message_channel_request_pty_height\nssh_message_channel_request_pty_pxheight\nssh_message_channel_request_pty_pxwidth\nssh_message_channel_request_pty_term\nssh_message_channel_request_pty_width\nssh_message_channel_request_reply_success\nssh_message_channel_request_subsystem\nssh_message_channel_request_x11_auth_cookie\nssh_message_channel_request_x11_auth_protocol\nssh_message_channel_request_x11_screen_number\nssh_message_channel_request_x11_single_connection\nssh_message_free\nssh_message_get\nssh_message_global_request_address\nssh_message_global_request_port\nssh_message_global_request_reply_success\nssh_message_reply_default\nssh_message_retrieve\nssh_message_service_reply_success\nssh_message_service_service\nssh_message_subtype\nssh_message_type\nssh_mkdir\nssh_new\nssh_options_copy\nssh_options_get\nssh_options_get_port\nssh_options_getopt\nssh_options_parse_config\nssh_options_set\nssh_pcap_file_close\nssh_pcap_file_free\nssh_pcap_file_new\nssh_pcap_file_open\nssh_pki_copy_cert_to_privkey\nssh_pki_export_privkey_base64\nssh_pki_export_privkey_file\nssh_pki_export_privkey_to_pubkey\nssh_pki_export_pubkey_base64\nssh_pki_export_pubkey_file\nssh_pki_generate\nssh_pki_import_cert_base64\nssh_pki_import_cert_file\nssh_pki_import_privkey_base64\nssh_pki_import_privkey_file\nssh_pki_import_pubkey_base64\nssh_pki_import_pubkey_file\nssh_pki_key_ecdsa_name\nssh_print_hash\nssh_print_hexa\nssh_privatekey_type\nssh_publickey_to_file\nssh_remove_channel_callbacks\nssh_scp_accept_request\nssh_scp_close\nssh_scp_deny_request\nssh_scp_free\nssh_scp_init\nssh_scp_leave_directory\nssh_scp_new\nssh_scp_pull_request\nssh_scp_push_directory\nssh_scp_push_file\nssh_scp_push_file64\nssh_scp_read\nssh_scp_request_get_filename\nssh_scp_request_get_permissions\nssh_scp_request_get_size\nssh_scp_request_get_size64\nssh_scp_request_get_warning\nssh_scp_write\nssh_select\nssh_send_debug\nssh_send_ignore\nssh_send_keepalive\nssh_server_init_kex\nssh_service_request\nssh_session_export_known_hosts_entry\nssh_session_has_known_hosts_entry\nssh_session_is_known_server\nssh_session_update_known_hosts\nssh_set_agent_channel\nssh_set_agent_socket\nssh_set_auth_methods\nssh_set_blocking\nssh_set_callbacks\nssh_set_channel_callbacks\nssh_set_counters\nssh_set_fd_except\nssh_set_fd_toread\nssh_set_fd_towrite\nssh_set_log_callback\nssh_set_log_level\nssh_set_log_userdata\nssh_set_message_callback\nssh_set_pcap_file\nssh_set_server_callbacks\nssh_silent_disconnect\nssh_string_burn\nssh_string_copy\nssh_string_data\nssh_string_fill\nssh_string_free\nssh_string_free_char\nssh_string_from_char\nssh_string_get_char\nssh_string_len\nssh_string_new\nssh_string_to_char\nssh_threads_get_noop\nssh_threads_get_pthread\nssh_threads_set_callbacks\nssh_try_publickey_from_file\nssh_userauth_agent\nssh_userauth_agent_pubkey\nssh_userauth_autopubkey\nssh_userauth_gssapi\nssh_userauth_kbdint\nssh_userauth_kbdint_getanswer\nssh_userauth_kbdint_getinstruction\nssh_userauth_kbdint_getname\nssh_userauth_kbdint_getnanswers\nssh_userauth_kbdint_getnprompts\nssh_userauth_kbdint_getprompt\nssh_userauth_kbdint_setanswer\nssh_userauth_list\nssh_userauth_none\nssh_userauth_offer_pubkey\nssh_userauth_password\nssh_userauth_privatekey_file\nssh_userauth_pubkey\nssh_userauth_publickey\nssh_userauth_publickey_auto\nssh_userauth_try_publickey\nssh_version\nssh_write_knownhost\nstring_burn\nstring_copy\nstring_data\nstring_fill\nstring_free\nstring_from_char\nstring_len\nstring_new\nstring_to_char"
  },
  {
    "path": "src/libssh/src/ABI/libssh-4.8.0.symbols",
    "content": "_ssh_log\nbuffer_free\nbuffer_get\nbuffer_get_len\nbuffer_new\nchannel_accept_x11\nchannel_change_pty_size\nchannel_close\nchannel_forward_accept\nchannel_forward_cancel\nchannel_forward_listen\nchannel_free\nchannel_get_exit_status\nchannel_get_session\nchannel_is_closed\nchannel_is_eof\nchannel_is_open\nchannel_new\nchannel_open_forward\nchannel_open_session\nchannel_poll\nchannel_read\nchannel_read_buffer\nchannel_read_nonblocking\nchannel_request_env\nchannel_request_exec\nchannel_request_pty\nchannel_request_pty_size\nchannel_request_send_signal\nchannel_request_sftp\nchannel_request_shell\nchannel_request_subsystem\nchannel_request_x11\nchannel_select\nchannel_send_eof\nchannel_set_blocking\nchannel_write\nchannel_write_stderr\nprivatekey_free\nprivatekey_from_file\npublickey_free\npublickey_from_file\npublickey_from_privatekey\npublickey_to_string\nsftp_async_read\nsftp_async_read_begin\nsftp_attributes_free\nsftp_canonicalize_path\nsftp_chmod\nsftp_chown\nsftp_client_message_free\nsftp_client_message_get_data\nsftp_client_message_get_filename\nsftp_client_message_get_flags\nsftp_client_message_get_submessage\nsftp_client_message_get_type\nsftp_client_message_set_filename\nsftp_close\nsftp_closedir\nsftp_dir_eof\nsftp_extension_supported\nsftp_extensions_get_count\nsftp_extensions_get_data\nsftp_extensions_get_name\nsftp_file_set_blocking\nsftp_file_set_nonblocking\nsftp_free\nsftp_fstat\nsftp_fstatvfs\nsftp_fsync\nsftp_get_client_message\nsftp_get_error\nsftp_handle\nsftp_handle_alloc\nsftp_handle_remove\nsftp_init\nsftp_lstat\nsftp_mkdir\nsftp_new\nsftp_new_channel\nsftp_open\nsftp_opendir\nsftp_read\nsftp_readdir\nsftp_readlink\nsftp_rename\nsftp_reply_attr\nsftp_reply_data\nsftp_reply_handle\nsftp_reply_name\nsftp_reply_names\nsftp_reply_names_add\nsftp_reply_status\nsftp_rewind\nsftp_rmdir\nsftp_seek\nsftp_seek64\nsftp_send_client_message\nsftp_server_free\nsftp_server_init\nsftp_server_new\nsftp_server_version\nsftp_setstat\nsftp_stat\nsftp_statvfs\nsftp_statvfs_free\nsftp_symlink\nsftp_tell\nsftp_tell64\nsftp_unlink\nsftp_utimes\nsftp_write\nssh_accept\nssh_add_channel_callbacks\nssh_auth_list\nssh_basename\nssh_bind_accept\nssh_bind_accept_fd\nssh_bind_fd_toaccept\nssh_bind_free\nssh_bind_get_fd\nssh_bind_listen\nssh_bind_new\nssh_bind_options_parse_config\nssh_bind_options_set\nssh_bind_set_blocking\nssh_bind_set_callbacks\nssh_bind_set_fd\nssh_blocking_flush\nssh_buffer_add_data\nssh_buffer_free\nssh_buffer_get\nssh_buffer_get_data\nssh_buffer_get_len\nssh_buffer_new\nssh_buffer_reinit\nssh_channel_accept_forward\nssh_channel_accept_x11\nssh_channel_cancel_forward\nssh_channel_change_pty_size\nssh_channel_close\nssh_channel_free\nssh_channel_get_exit_status\nssh_channel_get_session\nssh_channel_is_closed\nssh_channel_is_eof\nssh_channel_is_open\nssh_channel_listen_forward\nssh_channel_new\nssh_channel_open_auth_agent\nssh_channel_open_forward\nssh_channel_open_forward_unix\nssh_channel_open_reverse_forward\nssh_channel_open_session\nssh_channel_open_x11\nssh_channel_poll\nssh_channel_poll_timeout\nssh_channel_read\nssh_channel_read_nonblocking\nssh_channel_read_timeout\nssh_channel_request_auth_agent\nssh_channel_request_env\nssh_channel_request_exec\nssh_channel_request_pty\nssh_channel_request_pty_size\nssh_channel_request_send_break\nssh_channel_request_send_exit_signal\nssh_channel_request_send_exit_status\nssh_channel_request_send_signal\nssh_channel_request_sftp\nssh_channel_request_shell\nssh_channel_request_subsystem\nssh_channel_request_x11\nssh_channel_select\nssh_channel_send_eof\nssh_channel_set_blocking\nssh_channel_set_counter\nssh_channel_window_size\nssh_channel_write\nssh_channel_write_stderr\nssh_clean_pubkey_hash\nssh_connect\nssh_connector_free\nssh_connector_new\nssh_connector_set_in_channel\nssh_connector_set_in_fd\nssh_connector_set_out_channel\nssh_connector_set_out_fd\nssh_copyright\nssh_dirname\nssh_disconnect\nssh_dump_knownhost\nssh_event_add_connector\nssh_event_add_fd\nssh_event_add_session\nssh_event_dopoll\nssh_event_free\nssh_event_new\nssh_event_remove_connector\nssh_event_remove_fd\nssh_event_remove_session\nssh_execute_message_callbacks\nssh_finalize\nssh_forward_accept\nssh_forward_cancel\nssh_forward_listen\nssh_free\nssh_get_cipher_in\nssh_get_cipher_out\nssh_get_clientbanner\nssh_get_disconnect_message\nssh_get_error\nssh_get_error_code\nssh_get_fd\nssh_get_fingerprint_hash\nssh_get_hexa\nssh_get_hmac_in\nssh_get_hmac_out\nssh_get_issue_banner\nssh_get_kex_algo\nssh_get_log_callback\nssh_get_log_level\nssh_get_log_userdata\nssh_get_openssh_version\nssh_get_poll_flags\nssh_get_pubkey\nssh_get_pubkey_hash\nssh_get_publickey\nssh_get_publickey_hash\nssh_get_random\nssh_get_server_publickey\nssh_get_serverbanner\nssh_get_status\nssh_get_version\nssh_getpass\nssh_gssapi_get_creds\nssh_gssapi_set_creds\nssh_handle_key_exchange\nssh_init\nssh_is_blocking\nssh_is_connected\nssh_is_server_known\nssh_key_cmp\nssh_key_free\nssh_key_is_private\nssh_key_is_public\nssh_key_new\nssh_key_type\nssh_key_type_from_name\nssh_key_type_to_char\nssh_known_hosts_parse_line\nssh_knownhosts_entry_free\nssh_log\nssh_message_auth_interactive_request\nssh_message_auth_kbdint_is_response\nssh_message_auth_password\nssh_message_auth_pubkey\nssh_message_auth_publickey\nssh_message_auth_publickey_state\nssh_message_auth_reply_pk_ok\nssh_message_auth_reply_pk_ok_simple\nssh_message_auth_reply_success\nssh_message_auth_set_methods\nssh_message_auth_user\nssh_message_channel_request_channel\nssh_message_channel_request_command\nssh_message_channel_request_env_name\nssh_message_channel_request_env_value\nssh_message_channel_request_open_destination\nssh_message_channel_request_open_destination_port\nssh_message_channel_request_open_originator\nssh_message_channel_request_open_originator_port\nssh_message_channel_request_open_reply_accept\nssh_message_channel_request_open_reply_accept_channel\nssh_message_channel_request_pty_height\nssh_message_channel_request_pty_pxheight\nssh_message_channel_request_pty_pxwidth\nssh_message_channel_request_pty_term\nssh_message_channel_request_pty_width\nssh_message_channel_request_reply_success\nssh_message_channel_request_subsystem\nssh_message_channel_request_x11_auth_cookie\nssh_message_channel_request_x11_auth_protocol\nssh_message_channel_request_x11_screen_number\nssh_message_channel_request_x11_single_connection\nssh_message_free\nssh_message_get\nssh_message_global_request_address\nssh_message_global_request_port\nssh_message_global_request_reply_success\nssh_message_reply_default\nssh_message_retrieve\nssh_message_service_reply_success\nssh_message_service_service\nssh_message_subtype\nssh_message_type\nssh_mkdir\nssh_new\nssh_options_copy\nssh_options_get\nssh_options_get_port\nssh_options_getopt\nssh_options_parse_config\nssh_options_set\nssh_pcap_file_close\nssh_pcap_file_free\nssh_pcap_file_new\nssh_pcap_file_open\nssh_pki_copy_cert_to_privkey\nssh_pki_export_privkey_base64\nssh_pki_export_privkey_file\nssh_pki_export_privkey_to_pubkey\nssh_pki_export_pubkey_base64\nssh_pki_export_pubkey_file\nssh_pki_generate\nssh_pki_import_cert_base64\nssh_pki_import_cert_file\nssh_pki_import_privkey_base64\nssh_pki_import_privkey_file\nssh_pki_import_pubkey_base64\nssh_pki_import_pubkey_file\nssh_pki_key_ecdsa_name\nssh_print_hash\nssh_print_hexa\nssh_privatekey_type\nssh_publickey_to_file\nssh_remove_channel_callbacks\nssh_scp_accept_request\nssh_scp_close\nssh_scp_deny_request\nssh_scp_free\nssh_scp_init\nssh_scp_leave_directory\nssh_scp_new\nssh_scp_pull_request\nssh_scp_push_directory\nssh_scp_push_file\nssh_scp_push_file64\nssh_scp_read\nssh_scp_request_get_filename\nssh_scp_request_get_permissions\nssh_scp_request_get_size\nssh_scp_request_get_size64\nssh_scp_request_get_warning\nssh_scp_write\nssh_select\nssh_send_debug\nssh_send_ignore\nssh_send_keepalive\nssh_server_init_kex\nssh_service_request\nssh_session_export_known_hosts_entry\nssh_session_has_known_hosts_entry\nssh_session_is_known_server\nssh_session_update_known_hosts\nssh_set_agent_channel\nssh_set_agent_socket\nssh_set_auth_methods\nssh_set_blocking\nssh_set_callbacks\nssh_set_channel_callbacks\nssh_set_counters\nssh_set_fd_except\nssh_set_fd_toread\nssh_set_fd_towrite\nssh_set_log_callback\nssh_set_log_level\nssh_set_log_userdata\nssh_set_message_callback\nssh_set_pcap_file\nssh_set_server_callbacks\nssh_silent_disconnect\nssh_string_burn\nssh_string_copy\nssh_string_data\nssh_string_fill\nssh_string_free\nssh_string_free_char\nssh_string_from_char\nssh_string_get_char\nssh_string_len\nssh_string_new\nssh_string_to_char\nssh_threads_get_noop\nssh_threads_get_pthread\nssh_threads_set_callbacks\nssh_try_publickey_from_file\nssh_userauth_agent\nssh_userauth_agent_pubkey\nssh_userauth_autopubkey\nssh_userauth_gssapi\nssh_userauth_kbdint\nssh_userauth_kbdint_getanswer\nssh_userauth_kbdint_getinstruction\nssh_userauth_kbdint_getname\nssh_userauth_kbdint_getnanswers\nssh_userauth_kbdint_getnprompts\nssh_userauth_kbdint_getprompt\nssh_userauth_kbdint_setanswer\nssh_userauth_list\nssh_userauth_none\nssh_userauth_offer_pubkey\nssh_userauth_password\nssh_userauth_privatekey_file\nssh_userauth_pubkey\nssh_userauth_publickey\nssh_userauth_publickey_auto\nssh_userauth_try_publickey\nssh_version\nssh_write_knownhost\nstring_burn\nstring_copy\nstring_data\nstring_fill\nstring_free\nstring_from_char\nstring_len\nstring_new\nstring_to_char"
  },
  {
    "path": "src/libssh/src/ABI/libssh-4.8.1.symbols",
    "content": "_ssh_log\nbuffer_free\nbuffer_get\nbuffer_get_len\nbuffer_new\nchannel_accept_x11\nchannel_change_pty_size\nchannel_close\nchannel_forward_accept\nchannel_forward_cancel\nchannel_forward_listen\nchannel_free\nchannel_get_exit_status\nchannel_get_session\nchannel_is_closed\nchannel_is_eof\nchannel_is_open\nchannel_new\nchannel_open_forward\nchannel_open_session\nchannel_poll\nchannel_read\nchannel_read_buffer\nchannel_read_nonblocking\nchannel_request_env\nchannel_request_exec\nchannel_request_pty\nchannel_request_pty_size\nchannel_request_send_signal\nchannel_request_sftp\nchannel_request_shell\nchannel_request_subsystem\nchannel_request_x11\nchannel_select\nchannel_send_eof\nchannel_set_blocking\nchannel_write\nchannel_write_stderr\nprivatekey_free\nprivatekey_from_file\npublickey_free\npublickey_from_file\npublickey_from_privatekey\npublickey_to_string\nsftp_async_read\nsftp_async_read_begin\nsftp_attributes_free\nsftp_canonicalize_path\nsftp_chmod\nsftp_chown\nsftp_client_message_free\nsftp_client_message_get_data\nsftp_client_message_get_filename\nsftp_client_message_get_flags\nsftp_client_message_get_submessage\nsftp_client_message_get_type\nsftp_client_message_set_filename\nsftp_close\nsftp_closedir\nsftp_dir_eof\nsftp_extension_supported\nsftp_extensions_get_count\nsftp_extensions_get_data\nsftp_extensions_get_name\nsftp_file_set_blocking\nsftp_file_set_nonblocking\nsftp_free\nsftp_fstat\nsftp_fstatvfs\nsftp_fsync\nsftp_get_client_message\nsftp_get_error\nsftp_handle\nsftp_handle_alloc\nsftp_handle_remove\nsftp_init\nsftp_lstat\nsftp_mkdir\nsftp_new\nsftp_new_channel\nsftp_open\nsftp_opendir\nsftp_read\nsftp_readdir\nsftp_readlink\nsftp_rename\nsftp_reply_attr\nsftp_reply_data\nsftp_reply_handle\nsftp_reply_name\nsftp_reply_names\nsftp_reply_names_add\nsftp_reply_status\nsftp_rewind\nsftp_rmdir\nsftp_seek\nsftp_seek64\nsftp_send_client_message\nsftp_server_free\nsftp_server_init\nsftp_server_new\nsftp_server_version\nsftp_setstat\nsftp_stat\nsftp_statvfs\nsftp_statvfs_free\nsftp_symlink\nsftp_tell\nsftp_tell64\nsftp_unlink\nsftp_utimes\nsftp_write\nssh_accept\nssh_add_channel_callbacks\nssh_auth_list\nssh_basename\nssh_bind_accept\nssh_bind_accept_fd\nssh_bind_fd_toaccept\nssh_bind_free\nssh_bind_get_fd\nssh_bind_listen\nssh_bind_new\nssh_bind_options_parse_config\nssh_bind_options_set\nssh_bind_set_blocking\nssh_bind_set_callbacks\nssh_bind_set_fd\nssh_blocking_flush\nssh_buffer_add_data\nssh_buffer_free\nssh_buffer_get\nssh_buffer_get_data\nssh_buffer_get_len\nssh_buffer_new\nssh_buffer_reinit\nssh_channel_accept_forward\nssh_channel_accept_x11\nssh_channel_cancel_forward\nssh_channel_change_pty_size\nssh_channel_close\nssh_channel_free\nssh_channel_get_exit_status\nssh_channel_get_session\nssh_channel_is_closed\nssh_channel_is_eof\nssh_channel_is_open\nssh_channel_listen_forward\nssh_channel_new\nssh_channel_open_auth_agent\nssh_channel_open_forward\nssh_channel_open_forward_unix\nssh_channel_open_reverse_forward\nssh_channel_open_session\nssh_channel_open_x11\nssh_channel_poll\nssh_channel_poll_timeout\nssh_channel_read\nssh_channel_read_nonblocking\nssh_channel_read_timeout\nssh_channel_request_auth_agent\nssh_channel_request_env\nssh_channel_request_exec\nssh_channel_request_pty\nssh_channel_request_pty_size\nssh_channel_request_send_break\nssh_channel_request_send_exit_signal\nssh_channel_request_send_exit_status\nssh_channel_request_send_signal\nssh_channel_request_sftp\nssh_channel_request_shell\nssh_channel_request_subsystem\nssh_channel_request_x11\nssh_channel_select\nssh_channel_send_eof\nssh_channel_set_blocking\nssh_channel_set_counter\nssh_channel_window_size\nssh_channel_write\nssh_channel_write_stderr\nssh_clean_pubkey_hash\nssh_connect\nssh_connector_free\nssh_connector_new\nssh_connector_set_in_channel\nssh_connector_set_in_fd\nssh_connector_set_out_channel\nssh_connector_set_out_fd\nssh_copyright\nssh_dirname\nssh_disconnect\nssh_dump_knownhost\nssh_event_add_connector\nssh_event_add_fd\nssh_event_add_session\nssh_event_dopoll\nssh_event_free\nssh_event_new\nssh_event_remove_connector\nssh_event_remove_fd\nssh_event_remove_session\nssh_execute_message_callbacks\nssh_finalize\nssh_forward_accept\nssh_forward_cancel\nssh_forward_listen\nssh_free\nssh_get_cipher_in\nssh_get_cipher_out\nssh_get_clientbanner\nssh_get_disconnect_message\nssh_get_error\nssh_get_error_code\nssh_get_fd\nssh_get_fingerprint_hash\nssh_get_hexa\nssh_get_hmac_in\nssh_get_hmac_out\nssh_get_issue_banner\nssh_get_kex_algo\nssh_get_log_callback\nssh_get_log_level\nssh_get_log_userdata\nssh_get_openssh_version\nssh_get_poll_flags\nssh_get_pubkey\nssh_get_pubkey_hash\nssh_get_publickey\nssh_get_publickey_hash\nssh_get_random\nssh_get_server_publickey\nssh_get_serverbanner\nssh_get_status\nssh_get_version\nssh_getpass\nssh_gssapi_get_creds\nssh_gssapi_set_creds\nssh_handle_key_exchange\nssh_init\nssh_is_blocking\nssh_is_connected\nssh_is_server_known\nssh_key_cmp\nssh_key_free\nssh_key_is_private\nssh_key_is_public\nssh_key_new\nssh_key_type\nssh_key_type_from_name\nssh_key_type_to_char\nssh_known_hosts_parse_line\nssh_knownhosts_entry_free\nssh_log\nssh_message_auth_interactive_request\nssh_message_auth_kbdint_is_response\nssh_message_auth_password\nssh_message_auth_pubkey\nssh_message_auth_publickey\nssh_message_auth_publickey_state\nssh_message_auth_reply_pk_ok\nssh_message_auth_reply_pk_ok_simple\nssh_message_auth_reply_success\nssh_message_auth_set_methods\nssh_message_auth_user\nssh_message_channel_request_channel\nssh_message_channel_request_command\nssh_message_channel_request_env_name\nssh_message_channel_request_env_value\nssh_message_channel_request_open_destination\nssh_message_channel_request_open_destination_port\nssh_message_channel_request_open_originator\nssh_message_channel_request_open_originator_port\nssh_message_channel_request_open_reply_accept\nssh_message_channel_request_open_reply_accept_channel\nssh_message_channel_request_pty_height\nssh_message_channel_request_pty_pxheight\nssh_message_channel_request_pty_pxwidth\nssh_message_channel_request_pty_term\nssh_message_channel_request_pty_width\nssh_message_channel_request_reply_success\nssh_message_channel_request_subsystem\nssh_message_channel_request_x11_auth_cookie\nssh_message_channel_request_x11_auth_protocol\nssh_message_channel_request_x11_screen_number\nssh_message_channel_request_x11_single_connection\nssh_message_free\nssh_message_get\nssh_message_global_request_address\nssh_message_global_request_port\nssh_message_global_request_reply_success\nssh_message_reply_default\nssh_message_retrieve\nssh_message_service_reply_success\nssh_message_service_service\nssh_message_subtype\nssh_message_type\nssh_mkdir\nssh_new\nssh_options_copy\nssh_options_get\nssh_options_get_port\nssh_options_getopt\nssh_options_parse_config\nssh_options_set\nssh_pcap_file_close\nssh_pcap_file_free\nssh_pcap_file_new\nssh_pcap_file_open\nssh_pki_copy_cert_to_privkey\nssh_pki_export_privkey_base64\nssh_pki_export_privkey_file\nssh_pki_export_privkey_to_pubkey\nssh_pki_export_pubkey_base64\nssh_pki_export_pubkey_file\nssh_pki_generate\nssh_pki_import_cert_base64\nssh_pki_import_cert_file\nssh_pki_import_privkey_base64\nssh_pki_import_privkey_file\nssh_pki_import_pubkey_base64\nssh_pki_import_pubkey_file\nssh_pki_key_ecdsa_name\nssh_print_hash\nssh_print_hexa\nssh_privatekey_type\nssh_publickey_to_file\nssh_remove_channel_callbacks\nssh_scp_accept_request\nssh_scp_close\nssh_scp_deny_request\nssh_scp_free\nssh_scp_init\nssh_scp_leave_directory\nssh_scp_new\nssh_scp_pull_request\nssh_scp_push_directory\nssh_scp_push_file\nssh_scp_push_file64\nssh_scp_read\nssh_scp_request_get_filename\nssh_scp_request_get_permissions\nssh_scp_request_get_size\nssh_scp_request_get_size64\nssh_scp_request_get_warning\nssh_scp_write\nssh_select\nssh_send_debug\nssh_send_ignore\nssh_send_keepalive\nssh_server_init_kex\nssh_service_request\nssh_session_export_known_hosts_entry\nssh_session_get_known_hosts_entry\nssh_session_has_known_hosts_entry\nssh_session_is_known_server\nssh_session_update_known_hosts\nssh_set_agent_channel\nssh_set_agent_socket\nssh_set_auth_methods\nssh_set_blocking\nssh_set_callbacks\nssh_set_channel_callbacks\nssh_set_counters\nssh_set_fd_except\nssh_set_fd_toread\nssh_set_fd_towrite\nssh_set_log_callback\nssh_set_log_level\nssh_set_log_userdata\nssh_set_message_callback\nssh_set_pcap_file\nssh_set_server_callbacks\nssh_silent_disconnect\nssh_string_burn\nssh_string_copy\nssh_string_data\nssh_string_fill\nssh_string_free\nssh_string_free_char\nssh_string_from_char\nssh_string_get_char\nssh_string_len\nssh_string_new\nssh_string_to_char\nssh_threads_get_default\nssh_threads_get_noop\nssh_threads_get_pthread\nssh_threads_set_callbacks\nssh_try_publickey_from_file\nssh_userauth_agent\nssh_userauth_agent_pubkey\nssh_userauth_autopubkey\nssh_userauth_gssapi\nssh_userauth_kbdint\nssh_userauth_kbdint_getanswer\nssh_userauth_kbdint_getinstruction\nssh_userauth_kbdint_getname\nssh_userauth_kbdint_getnanswers\nssh_userauth_kbdint_getnprompts\nssh_userauth_kbdint_getprompt\nssh_userauth_kbdint_setanswer\nssh_userauth_list\nssh_userauth_none\nssh_userauth_offer_pubkey\nssh_userauth_password\nssh_userauth_privatekey_file\nssh_userauth_pubkey\nssh_userauth_publickey\nssh_userauth_publickey_auto\nssh_userauth_try_publickey\nssh_version\nssh_write_knownhost\nstring_burn\nstring_copy\nstring_data\nstring_fill\nstring_free\nstring_from_char\nstring_len\nstring_new\nstring_to_char"
  },
  {
    "path": "src/libssh/src/ABI/libssh-4.8.2.symbols",
    "content": "_ssh_log\nbuffer_free\nbuffer_get\nbuffer_get_len\nbuffer_new\nchannel_accept_x11\nchannel_change_pty_size\nchannel_close\nchannel_forward_accept\nchannel_forward_cancel\nchannel_forward_listen\nchannel_free\nchannel_get_exit_status\nchannel_get_session\nchannel_is_closed\nchannel_is_eof\nchannel_is_open\nchannel_new\nchannel_open_forward\nchannel_open_session\nchannel_poll\nchannel_read\nchannel_read_buffer\nchannel_read_nonblocking\nchannel_request_env\nchannel_request_exec\nchannel_request_pty\nchannel_request_pty_size\nchannel_request_send_signal\nchannel_request_sftp\nchannel_request_shell\nchannel_request_subsystem\nchannel_request_x11\nchannel_select\nchannel_send_eof\nchannel_set_blocking\nchannel_write\nchannel_write_stderr\nprivatekey_free\nprivatekey_from_file\npublickey_free\npublickey_from_file\npublickey_from_privatekey\npublickey_to_string\nsftp_async_read\nsftp_async_read_begin\nsftp_attributes_free\nsftp_canonicalize_path\nsftp_chmod\nsftp_chown\nsftp_client_message_free\nsftp_client_message_get_data\nsftp_client_message_get_filename\nsftp_client_message_get_flags\nsftp_client_message_get_submessage\nsftp_client_message_get_type\nsftp_client_message_set_filename\nsftp_close\nsftp_closedir\nsftp_dir_eof\nsftp_extension_supported\nsftp_extensions_get_count\nsftp_extensions_get_data\nsftp_extensions_get_name\nsftp_file_set_blocking\nsftp_file_set_nonblocking\nsftp_free\nsftp_fstat\nsftp_fstatvfs\nsftp_fsync\nsftp_get_client_message\nsftp_get_error\nsftp_handle\nsftp_handle_alloc\nsftp_handle_remove\nsftp_init\nsftp_lstat\nsftp_mkdir\nsftp_new\nsftp_new_channel\nsftp_open\nsftp_opendir\nsftp_read\nsftp_readdir\nsftp_readlink\nsftp_rename\nsftp_reply_attr\nsftp_reply_data\nsftp_reply_handle\nsftp_reply_name\nsftp_reply_names\nsftp_reply_names_add\nsftp_reply_status\nsftp_rewind\nsftp_rmdir\nsftp_seek\nsftp_seek64\nsftp_send_client_message\nsftp_server_free\nsftp_server_init\nsftp_server_new\nsftp_server_version\nsftp_setstat\nsftp_stat\nsftp_statvfs\nsftp_statvfs_free\nsftp_symlink\nsftp_tell\nsftp_tell64\nsftp_unlink\nsftp_utimes\nsftp_write\nssh_accept\nssh_add_channel_callbacks\nssh_auth_list\nssh_basename\nssh_bind_accept\nssh_bind_accept_fd\nssh_bind_fd_toaccept\nssh_bind_free\nssh_bind_get_fd\nssh_bind_listen\nssh_bind_new\nssh_bind_options_parse_config\nssh_bind_options_set\nssh_bind_set_blocking\nssh_bind_set_callbacks\nssh_bind_set_fd\nssh_blocking_flush\nssh_buffer_add_data\nssh_buffer_free\nssh_buffer_get\nssh_buffer_get_data\nssh_buffer_get_len\nssh_buffer_new\nssh_buffer_reinit\nssh_channel_accept_forward\nssh_channel_accept_x11\nssh_channel_cancel_forward\nssh_channel_change_pty_size\nssh_channel_close\nssh_channel_free\nssh_channel_get_exit_status\nssh_channel_get_session\nssh_channel_is_closed\nssh_channel_is_eof\nssh_channel_is_open\nssh_channel_listen_forward\nssh_channel_new\nssh_channel_open_auth_agent\nssh_channel_open_forward\nssh_channel_open_forward_unix\nssh_channel_open_reverse_forward\nssh_channel_open_session\nssh_channel_open_x11\nssh_channel_poll\nssh_channel_poll_timeout\nssh_channel_read\nssh_channel_read_nonblocking\nssh_channel_read_timeout\nssh_channel_request_auth_agent\nssh_channel_request_env\nssh_channel_request_exec\nssh_channel_request_pty\nssh_channel_request_pty_size\nssh_channel_request_send_break\nssh_channel_request_send_exit_signal\nssh_channel_request_send_exit_status\nssh_channel_request_send_signal\nssh_channel_request_sftp\nssh_channel_request_shell\nssh_channel_request_subsystem\nssh_channel_request_x11\nssh_channel_select\nssh_channel_send_eof\nssh_channel_set_blocking\nssh_channel_set_counter\nssh_channel_window_size\nssh_channel_write\nssh_channel_write_stderr\nssh_clean_pubkey_hash\nssh_connect\nssh_connector_free\nssh_connector_new\nssh_connector_set_in_channel\nssh_connector_set_in_fd\nssh_connector_set_out_channel\nssh_connector_set_out_fd\nssh_copyright\nssh_dirname\nssh_disconnect\nssh_dump_knownhost\nssh_event_add_connector\nssh_event_add_fd\nssh_event_add_session\nssh_event_dopoll\nssh_event_free\nssh_event_new\nssh_event_remove_connector\nssh_event_remove_fd\nssh_event_remove_session\nssh_execute_message_callbacks\nssh_finalize\nssh_forward_accept\nssh_forward_cancel\nssh_forward_listen\nssh_free\nssh_get_cipher_in\nssh_get_cipher_out\nssh_get_clientbanner\nssh_get_disconnect_message\nssh_get_error\nssh_get_error_code\nssh_get_fd\nssh_get_fingerprint_hash\nssh_get_hexa\nssh_get_hmac_in\nssh_get_hmac_out\nssh_get_issue_banner\nssh_get_kex_algo\nssh_get_log_callback\nssh_get_log_level\nssh_get_log_userdata\nssh_get_openssh_version\nssh_get_poll_flags\nssh_get_pubkey\nssh_get_pubkey_hash\nssh_get_publickey\nssh_get_publickey_hash\nssh_get_random\nssh_get_server_publickey\nssh_get_serverbanner\nssh_get_status\nssh_get_version\nssh_getpass\nssh_gssapi_get_creds\nssh_gssapi_set_creds\nssh_handle_key_exchange\nssh_init\nssh_is_blocking\nssh_is_connected\nssh_is_server_known\nssh_key_cmp\nssh_key_free\nssh_key_is_private\nssh_key_is_public\nssh_key_new\nssh_key_type\nssh_key_type_from_name\nssh_key_type_to_char\nssh_known_hosts_parse_line\nssh_knownhosts_entry_free\nssh_log\nssh_message_auth_interactive_request\nssh_message_auth_kbdint_is_response\nssh_message_auth_password\nssh_message_auth_pubkey\nssh_message_auth_publickey\nssh_message_auth_publickey_state\nssh_message_auth_reply_pk_ok\nssh_message_auth_reply_pk_ok_simple\nssh_message_auth_reply_success\nssh_message_auth_set_methods\nssh_message_auth_user\nssh_message_channel_request_channel\nssh_message_channel_request_command\nssh_message_channel_request_env_name\nssh_message_channel_request_env_value\nssh_message_channel_request_open_destination\nssh_message_channel_request_open_destination_port\nssh_message_channel_request_open_originator\nssh_message_channel_request_open_originator_port\nssh_message_channel_request_open_reply_accept\nssh_message_channel_request_open_reply_accept_channel\nssh_message_channel_request_pty_height\nssh_message_channel_request_pty_pxheight\nssh_message_channel_request_pty_pxwidth\nssh_message_channel_request_pty_term\nssh_message_channel_request_pty_width\nssh_message_channel_request_reply_success\nssh_message_channel_request_subsystem\nssh_message_channel_request_x11_auth_cookie\nssh_message_channel_request_x11_auth_protocol\nssh_message_channel_request_x11_screen_number\nssh_message_channel_request_x11_single_connection\nssh_message_free\nssh_message_get\nssh_message_global_request_address\nssh_message_global_request_port\nssh_message_global_request_reply_success\nssh_message_reply_default\nssh_message_retrieve\nssh_message_service_reply_success\nssh_message_service_service\nssh_message_subtype\nssh_message_type\nssh_mkdir\nssh_new\nssh_options_copy\nssh_options_get\nssh_options_get_port\nssh_options_getopt\nssh_options_parse_config\nssh_options_set\nssh_pcap_file_close\nssh_pcap_file_free\nssh_pcap_file_new\nssh_pcap_file_open\nssh_pki_copy_cert_to_privkey\nssh_pki_export_privkey_base64\nssh_pki_export_privkey_file\nssh_pki_export_privkey_to_pubkey\nssh_pki_export_pubkey_base64\nssh_pki_export_pubkey_file\nssh_pki_generate\nssh_pki_import_cert_base64\nssh_pki_import_cert_file\nssh_pki_import_privkey_base64\nssh_pki_import_privkey_file\nssh_pki_import_pubkey_base64\nssh_pki_import_pubkey_file\nssh_pki_key_ecdsa_name\nssh_print_hash\nssh_print_hexa\nssh_privatekey_type\nssh_publickey_to_file\nssh_remove_channel_callbacks\nssh_scp_accept_request\nssh_scp_close\nssh_scp_deny_request\nssh_scp_free\nssh_scp_init\nssh_scp_leave_directory\nssh_scp_new\nssh_scp_pull_request\nssh_scp_push_directory\nssh_scp_push_file\nssh_scp_push_file64\nssh_scp_read\nssh_scp_request_get_filename\nssh_scp_request_get_permissions\nssh_scp_request_get_size\nssh_scp_request_get_size64\nssh_scp_request_get_warning\nssh_scp_write\nssh_select\nssh_send_debug\nssh_send_ignore\nssh_send_keepalive\nssh_server_init_kex\nssh_service_request\nssh_session_export_known_hosts_entry\nssh_session_get_known_hosts_entry\nssh_session_has_known_hosts_entry\nssh_session_is_known_server\nssh_session_update_known_hosts\nssh_set_agent_channel\nssh_set_agent_socket\nssh_set_auth_methods\nssh_set_blocking\nssh_set_callbacks\nssh_set_channel_callbacks\nssh_set_counters\nssh_set_fd_except\nssh_set_fd_toread\nssh_set_fd_towrite\nssh_set_log_callback\nssh_set_log_level\nssh_set_log_userdata\nssh_set_message_callback\nssh_set_pcap_file\nssh_set_server_callbacks\nssh_silent_disconnect\nssh_string_burn\nssh_string_copy\nssh_string_data\nssh_string_fill\nssh_string_free\nssh_string_free_char\nssh_string_from_char\nssh_string_get_char\nssh_string_len\nssh_string_new\nssh_string_to_char\nssh_threads_get_default\nssh_threads_get_noop\nssh_threads_get_pthread\nssh_threads_set_callbacks\nssh_try_publickey_from_file\nssh_userauth_agent\nssh_userauth_agent_pubkey\nssh_userauth_autopubkey\nssh_userauth_gssapi\nssh_userauth_kbdint\nssh_userauth_kbdint_getanswer\nssh_userauth_kbdint_getinstruction\nssh_userauth_kbdint_getname\nssh_userauth_kbdint_getnanswers\nssh_userauth_kbdint_getnprompts\nssh_userauth_kbdint_getprompt\nssh_userauth_kbdint_setanswer\nssh_userauth_list\nssh_userauth_none\nssh_userauth_offer_pubkey\nssh_userauth_password\nssh_userauth_privatekey_file\nssh_userauth_pubkey\nssh_userauth_publickey\nssh_userauth_publickey_auto\nssh_userauth_try_publickey\nssh_version\nssh_write_knownhost\nstring_burn\nstring_copy\nstring_data\nstring_fill\nstring_free\nstring_from_char\nstring_len\nstring_new\nstring_to_char"
  },
  {
    "path": "src/libssh/src/ABI/libssh-4.8.3.symbols",
    "content": "_ssh_log\nbuffer_free\nbuffer_get\nbuffer_get_len\nbuffer_new\nchannel_accept_x11\nchannel_change_pty_size\nchannel_close\nchannel_forward_accept\nchannel_forward_cancel\nchannel_forward_listen\nchannel_free\nchannel_get_exit_status\nchannel_get_session\nchannel_is_closed\nchannel_is_eof\nchannel_is_open\nchannel_new\nchannel_open_forward\nchannel_open_session\nchannel_poll\nchannel_read\nchannel_read_buffer\nchannel_read_nonblocking\nchannel_request_env\nchannel_request_exec\nchannel_request_pty\nchannel_request_pty_size\nchannel_request_send_signal\nchannel_request_sftp\nchannel_request_shell\nchannel_request_subsystem\nchannel_request_x11\nchannel_select\nchannel_send_eof\nchannel_set_blocking\nchannel_write\nchannel_write_stderr\nprivatekey_free\nprivatekey_from_file\npublickey_free\npublickey_from_file\npublickey_from_privatekey\npublickey_to_string\nsftp_async_read\nsftp_async_read_begin\nsftp_attributes_free\nsftp_canonicalize_path\nsftp_chmod\nsftp_chown\nsftp_client_message_free\nsftp_client_message_get_data\nsftp_client_message_get_filename\nsftp_client_message_get_flags\nsftp_client_message_get_submessage\nsftp_client_message_get_type\nsftp_client_message_set_filename\nsftp_close\nsftp_closedir\nsftp_dir_eof\nsftp_extension_supported\nsftp_extensions_get_count\nsftp_extensions_get_data\nsftp_extensions_get_name\nsftp_file_set_blocking\nsftp_file_set_nonblocking\nsftp_free\nsftp_fstat\nsftp_fstatvfs\nsftp_fsync\nsftp_get_client_message\nsftp_get_error\nsftp_handle\nsftp_handle_alloc\nsftp_handle_remove\nsftp_init\nsftp_lstat\nsftp_mkdir\nsftp_new\nsftp_new_channel\nsftp_open\nsftp_opendir\nsftp_read\nsftp_readdir\nsftp_readlink\nsftp_rename\nsftp_reply_attr\nsftp_reply_data\nsftp_reply_handle\nsftp_reply_name\nsftp_reply_names\nsftp_reply_names_add\nsftp_reply_status\nsftp_rewind\nsftp_rmdir\nsftp_seek\nsftp_seek64\nsftp_send_client_message\nsftp_server_free\nsftp_server_init\nsftp_server_new\nsftp_server_version\nsftp_setstat\nsftp_stat\nsftp_statvfs\nsftp_statvfs_free\nsftp_symlink\nsftp_tell\nsftp_tell64\nsftp_unlink\nsftp_utimes\nsftp_write\nssh_accept\nssh_add_channel_callbacks\nssh_auth_list\nssh_basename\nssh_bind_accept\nssh_bind_accept_fd\nssh_bind_fd_toaccept\nssh_bind_free\nssh_bind_get_fd\nssh_bind_listen\nssh_bind_new\nssh_bind_options_parse_config\nssh_bind_options_set\nssh_bind_set_blocking\nssh_bind_set_callbacks\nssh_bind_set_fd\nssh_blocking_flush\nssh_buffer_add_data\nssh_buffer_free\nssh_buffer_get\nssh_buffer_get_data\nssh_buffer_get_len\nssh_buffer_new\nssh_buffer_reinit\nssh_channel_accept_forward\nssh_channel_accept_x11\nssh_channel_cancel_forward\nssh_channel_change_pty_size\nssh_channel_close\nssh_channel_free\nssh_channel_get_exit_status\nssh_channel_get_session\nssh_channel_is_closed\nssh_channel_is_eof\nssh_channel_is_open\nssh_channel_listen_forward\nssh_channel_new\nssh_channel_open_auth_agent\nssh_channel_open_forward\nssh_channel_open_forward_unix\nssh_channel_open_reverse_forward\nssh_channel_open_session\nssh_channel_open_x11\nssh_channel_poll\nssh_channel_poll_timeout\nssh_channel_read\nssh_channel_read_nonblocking\nssh_channel_read_timeout\nssh_channel_request_auth_agent\nssh_channel_request_env\nssh_channel_request_exec\nssh_channel_request_pty\nssh_channel_request_pty_size\nssh_channel_request_send_break\nssh_channel_request_send_exit_signal\nssh_channel_request_send_exit_status\nssh_channel_request_send_signal\nssh_channel_request_sftp\nssh_channel_request_shell\nssh_channel_request_subsystem\nssh_channel_request_x11\nssh_channel_select\nssh_channel_send_eof\nssh_channel_set_blocking\nssh_channel_set_counter\nssh_channel_window_size\nssh_channel_write\nssh_channel_write_stderr\nssh_clean_pubkey_hash\nssh_connect\nssh_connector_free\nssh_connector_new\nssh_connector_set_in_channel\nssh_connector_set_in_fd\nssh_connector_set_out_channel\nssh_connector_set_out_fd\nssh_copyright\nssh_dirname\nssh_disconnect\nssh_dump_knownhost\nssh_event_add_connector\nssh_event_add_fd\nssh_event_add_session\nssh_event_dopoll\nssh_event_free\nssh_event_new\nssh_event_remove_connector\nssh_event_remove_fd\nssh_event_remove_session\nssh_execute_message_callbacks\nssh_finalize\nssh_forward_accept\nssh_forward_cancel\nssh_forward_listen\nssh_free\nssh_get_cipher_in\nssh_get_cipher_out\nssh_get_clientbanner\nssh_get_disconnect_message\nssh_get_error\nssh_get_error_code\nssh_get_fd\nssh_get_fingerprint_hash\nssh_get_hexa\nssh_get_hmac_in\nssh_get_hmac_out\nssh_get_issue_banner\nssh_get_kex_algo\nssh_get_log_callback\nssh_get_log_level\nssh_get_log_userdata\nssh_get_openssh_version\nssh_get_poll_flags\nssh_get_pubkey\nssh_get_pubkey_hash\nssh_get_publickey\nssh_get_publickey_hash\nssh_get_random\nssh_get_server_publickey\nssh_get_serverbanner\nssh_get_status\nssh_get_version\nssh_getpass\nssh_gssapi_get_creds\nssh_gssapi_set_creds\nssh_handle_key_exchange\nssh_init\nssh_is_blocking\nssh_is_connected\nssh_is_server_known\nssh_key_cmp\nssh_key_free\nssh_key_is_private\nssh_key_is_public\nssh_key_new\nssh_key_type\nssh_key_type_from_name\nssh_key_type_to_char\nssh_known_hosts_parse_line\nssh_knownhosts_entry_free\nssh_log\nssh_message_auth_interactive_request\nssh_message_auth_kbdint_is_response\nssh_message_auth_password\nssh_message_auth_pubkey\nssh_message_auth_publickey\nssh_message_auth_publickey_state\nssh_message_auth_reply_pk_ok\nssh_message_auth_reply_pk_ok_simple\nssh_message_auth_reply_success\nssh_message_auth_set_methods\nssh_message_auth_user\nssh_message_channel_request_channel\nssh_message_channel_request_command\nssh_message_channel_request_env_name\nssh_message_channel_request_env_value\nssh_message_channel_request_open_destination\nssh_message_channel_request_open_destination_port\nssh_message_channel_request_open_originator\nssh_message_channel_request_open_originator_port\nssh_message_channel_request_open_reply_accept\nssh_message_channel_request_open_reply_accept_channel\nssh_message_channel_request_pty_height\nssh_message_channel_request_pty_pxheight\nssh_message_channel_request_pty_pxwidth\nssh_message_channel_request_pty_term\nssh_message_channel_request_pty_width\nssh_message_channel_request_reply_success\nssh_message_channel_request_subsystem\nssh_message_channel_request_x11_auth_cookie\nssh_message_channel_request_x11_auth_protocol\nssh_message_channel_request_x11_screen_number\nssh_message_channel_request_x11_single_connection\nssh_message_free\nssh_message_get\nssh_message_global_request_address\nssh_message_global_request_port\nssh_message_global_request_reply_success\nssh_message_reply_default\nssh_message_retrieve\nssh_message_service_reply_success\nssh_message_service_service\nssh_message_subtype\nssh_message_type\nssh_mkdir\nssh_new\nssh_options_copy\nssh_options_get\nssh_options_get_port\nssh_options_getopt\nssh_options_parse_config\nssh_options_set\nssh_pcap_file_close\nssh_pcap_file_free\nssh_pcap_file_new\nssh_pcap_file_open\nssh_pki_copy_cert_to_privkey\nssh_pki_export_privkey_base64\nssh_pki_export_privkey_file\nssh_pki_export_privkey_to_pubkey\nssh_pki_export_pubkey_base64\nssh_pki_export_pubkey_file\nssh_pki_generate\nssh_pki_import_cert_base64\nssh_pki_import_cert_file\nssh_pki_import_privkey_base64\nssh_pki_import_privkey_file\nssh_pki_import_pubkey_base64\nssh_pki_import_pubkey_file\nssh_pki_key_ecdsa_name\nssh_print_hash\nssh_print_hexa\nssh_privatekey_type\nssh_publickey_to_file\nssh_remove_channel_callbacks\nssh_scp_accept_request\nssh_scp_close\nssh_scp_deny_request\nssh_scp_free\nssh_scp_init\nssh_scp_leave_directory\nssh_scp_new\nssh_scp_pull_request\nssh_scp_push_directory\nssh_scp_push_file\nssh_scp_push_file64\nssh_scp_read\nssh_scp_request_get_filename\nssh_scp_request_get_permissions\nssh_scp_request_get_size\nssh_scp_request_get_size64\nssh_scp_request_get_warning\nssh_scp_write\nssh_select\nssh_send_debug\nssh_send_ignore\nssh_send_keepalive\nssh_server_init_kex\nssh_service_request\nssh_session_export_known_hosts_entry\nssh_session_get_known_hosts_entry\nssh_session_has_known_hosts_entry\nssh_session_is_known_server\nssh_session_update_known_hosts\nssh_set_agent_channel\nssh_set_agent_socket\nssh_set_auth_methods\nssh_set_blocking\nssh_set_callbacks\nssh_set_channel_callbacks\nssh_set_counters\nssh_set_fd_except\nssh_set_fd_toread\nssh_set_fd_towrite\nssh_set_log_callback\nssh_set_log_level\nssh_set_log_userdata\nssh_set_message_callback\nssh_set_pcap_file\nssh_set_server_callbacks\nssh_silent_disconnect\nssh_string_burn\nssh_string_copy\nssh_string_data\nssh_string_fill\nssh_string_free\nssh_string_free_char\nssh_string_from_char\nssh_string_get_char\nssh_string_len\nssh_string_new\nssh_string_to_char\nssh_threads_get_default\nssh_threads_get_noop\nssh_threads_get_pthread\nssh_threads_set_callbacks\nssh_try_publickey_from_file\nssh_userauth_agent\nssh_userauth_agent_pubkey\nssh_userauth_autopubkey\nssh_userauth_gssapi\nssh_userauth_kbdint\nssh_userauth_kbdint_getanswer\nssh_userauth_kbdint_getinstruction\nssh_userauth_kbdint_getname\nssh_userauth_kbdint_getnanswers\nssh_userauth_kbdint_getnprompts\nssh_userauth_kbdint_getprompt\nssh_userauth_kbdint_setanswer\nssh_userauth_list\nssh_userauth_none\nssh_userauth_offer_pubkey\nssh_userauth_password\nssh_userauth_privatekey_file\nssh_userauth_pubkey\nssh_userauth_publickey\nssh_userauth_publickey_auto\nssh_userauth_try_publickey\nssh_version\nssh_write_knownhost\nstring_burn\nstring_copy\nstring_data\nstring_fill\nstring_free\nstring_from_char\nstring_len\nstring_new\nstring_to_char"
  },
  {
    "path": "src/libssh/src/ABI/libssh-4.8.4.symbols",
    "content": "_ssh_log\nbuffer_free\nbuffer_get\nbuffer_get_len\nbuffer_new\nchannel_accept_x11\nchannel_change_pty_size\nchannel_close\nchannel_forward_accept\nchannel_forward_cancel\nchannel_forward_listen\nchannel_free\nchannel_get_exit_status\nchannel_get_session\nchannel_is_closed\nchannel_is_eof\nchannel_is_open\nchannel_new\nchannel_open_forward\nchannel_open_session\nchannel_poll\nchannel_read\nchannel_read_buffer\nchannel_read_nonblocking\nchannel_request_env\nchannel_request_exec\nchannel_request_pty\nchannel_request_pty_size\nchannel_request_send_signal\nchannel_request_sftp\nchannel_request_shell\nchannel_request_subsystem\nchannel_request_x11\nchannel_select\nchannel_send_eof\nchannel_set_blocking\nchannel_write\nchannel_write_stderr\nprivatekey_free\nprivatekey_from_file\npublickey_free\npublickey_from_file\npublickey_from_privatekey\npublickey_to_string\nsftp_async_read\nsftp_async_read_begin\nsftp_attributes_free\nsftp_canonicalize_path\nsftp_chmod\nsftp_chown\nsftp_client_message_free\nsftp_client_message_get_data\nsftp_client_message_get_filename\nsftp_client_message_get_flags\nsftp_client_message_get_submessage\nsftp_client_message_get_type\nsftp_client_message_set_filename\nsftp_close\nsftp_closedir\nsftp_dir_eof\nsftp_extension_supported\nsftp_extensions_get_count\nsftp_extensions_get_data\nsftp_extensions_get_name\nsftp_file_set_blocking\nsftp_file_set_nonblocking\nsftp_free\nsftp_fstat\nsftp_fstatvfs\nsftp_fsync\nsftp_get_client_message\nsftp_get_error\nsftp_handle\nsftp_handle_alloc\nsftp_handle_remove\nsftp_init\nsftp_lstat\nsftp_mkdir\nsftp_new\nsftp_new_channel\nsftp_open\nsftp_opendir\nsftp_read\nsftp_readdir\nsftp_readlink\nsftp_rename\nsftp_reply_attr\nsftp_reply_data\nsftp_reply_handle\nsftp_reply_name\nsftp_reply_names\nsftp_reply_names_add\nsftp_reply_status\nsftp_rewind\nsftp_rmdir\nsftp_seek\nsftp_seek64\nsftp_send_client_message\nsftp_server_free\nsftp_server_init\nsftp_server_new\nsftp_server_version\nsftp_setstat\nsftp_stat\nsftp_statvfs\nsftp_statvfs_free\nsftp_symlink\nsftp_tell\nsftp_tell64\nsftp_unlink\nsftp_utimes\nsftp_write\nssh_accept\nssh_add_channel_callbacks\nssh_auth_list\nssh_basename\nssh_bind_accept\nssh_bind_accept_fd\nssh_bind_fd_toaccept\nssh_bind_free\nssh_bind_get_fd\nssh_bind_listen\nssh_bind_new\nssh_bind_options_parse_config\nssh_bind_options_set\nssh_bind_set_blocking\nssh_bind_set_callbacks\nssh_bind_set_fd\nssh_blocking_flush\nssh_buffer_add_data\nssh_buffer_free\nssh_buffer_get\nssh_buffer_get_data\nssh_buffer_get_len\nssh_buffer_new\nssh_buffer_reinit\nssh_channel_accept_forward\nssh_channel_accept_x11\nssh_channel_cancel_forward\nssh_channel_change_pty_size\nssh_channel_close\nssh_channel_free\nssh_channel_get_exit_status\nssh_channel_get_session\nssh_channel_is_closed\nssh_channel_is_eof\nssh_channel_is_open\nssh_channel_listen_forward\nssh_channel_new\nssh_channel_open_auth_agent\nssh_channel_open_forward\nssh_channel_open_forward_unix\nssh_channel_open_reverse_forward\nssh_channel_open_session\nssh_channel_open_x11\nssh_channel_poll\nssh_channel_poll_timeout\nssh_channel_read\nssh_channel_read_nonblocking\nssh_channel_read_timeout\nssh_channel_request_auth_agent\nssh_channel_request_env\nssh_channel_request_exec\nssh_channel_request_pty\nssh_channel_request_pty_size\nssh_channel_request_send_break\nssh_channel_request_send_exit_signal\nssh_channel_request_send_exit_status\nssh_channel_request_send_signal\nssh_channel_request_sftp\nssh_channel_request_shell\nssh_channel_request_subsystem\nssh_channel_request_x11\nssh_channel_select\nssh_channel_send_eof\nssh_channel_set_blocking\nssh_channel_set_counter\nssh_channel_window_size\nssh_channel_write\nssh_channel_write_stderr\nssh_clean_pubkey_hash\nssh_connect\nssh_connector_free\nssh_connector_new\nssh_connector_set_in_channel\nssh_connector_set_in_fd\nssh_connector_set_out_channel\nssh_connector_set_out_fd\nssh_copyright\nssh_dirname\nssh_disconnect\nssh_dump_knownhost\nssh_event_add_connector\nssh_event_add_fd\nssh_event_add_session\nssh_event_dopoll\nssh_event_free\nssh_event_new\nssh_event_remove_connector\nssh_event_remove_fd\nssh_event_remove_session\nssh_execute_message_callbacks\nssh_finalize\nssh_forward_accept\nssh_forward_cancel\nssh_forward_listen\nssh_free\nssh_get_cipher_in\nssh_get_cipher_out\nssh_get_clientbanner\nssh_get_disconnect_message\nssh_get_error\nssh_get_error_code\nssh_get_fd\nssh_get_fingerprint_hash\nssh_get_hexa\nssh_get_hmac_in\nssh_get_hmac_out\nssh_get_issue_banner\nssh_get_kex_algo\nssh_get_log_callback\nssh_get_log_level\nssh_get_log_userdata\nssh_get_openssh_version\nssh_get_poll_flags\nssh_get_pubkey\nssh_get_pubkey_hash\nssh_get_publickey\nssh_get_publickey_hash\nssh_get_random\nssh_get_server_publickey\nssh_get_serverbanner\nssh_get_status\nssh_get_version\nssh_getpass\nssh_gssapi_get_creds\nssh_gssapi_set_creds\nssh_handle_key_exchange\nssh_init\nssh_is_blocking\nssh_is_connected\nssh_is_server_known\nssh_key_cmp\nssh_key_free\nssh_key_is_private\nssh_key_is_public\nssh_key_new\nssh_key_type\nssh_key_type_from_name\nssh_key_type_to_char\nssh_known_hosts_parse_line\nssh_knownhosts_entry_free\nssh_log\nssh_message_auth_interactive_request\nssh_message_auth_kbdint_is_response\nssh_message_auth_password\nssh_message_auth_pubkey\nssh_message_auth_publickey\nssh_message_auth_publickey_state\nssh_message_auth_reply_pk_ok\nssh_message_auth_reply_pk_ok_simple\nssh_message_auth_reply_success\nssh_message_auth_set_methods\nssh_message_auth_user\nssh_message_channel_request_channel\nssh_message_channel_request_command\nssh_message_channel_request_env_name\nssh_message_channel_request_env_value\nssh_message_channel_request_open_destination\nssh_message_channel_request_open_destination_port\nssh_message_channel_request_open_originator\nssh_message_channel_request_open_originator_port\nssh_message_channel_request_open_reply_accept\nssh_message_channel_request_open_reply_accept_channel\nssh_message_channel_request_pty_height\nssh_message_channel_request_pty_pxheight\nssh_message_channel_request_pty_pxwidth\nssh_message_channel_request_pty_term\nssh_message_channel_request_pty_width\nssh_message_channel_request_reply_success\nssh_message_channel_request_subsystem\nssh_message_channel_request_x11_auth_cookie\nssh_message_channel_request_x11_auth_protocol\nssh_message_channel_request_x11_screen_number\nssh_message_channel_request_x11_single_connection\nssh_message_free\nssh_message_get\nssh_message_global_request_address\nssh_message_global_request_port\nssh_message_global_request_reply_success\nssh_message_reply_default\nssh_message_retrieve\nssh_message_service_reply_success\nssh_message_service_service\nssh_message_subtype\nssh_message_type\nssh_mkdir\nssh_new\nssh_options_copy\nssh_options_get\nssh_options_get_port\nssh_options_getopt\nssh_options_parse_config\nssh_options_set\nssh_pcap_file_close\nssh_pcap_file_free\nssh_pcap_file_new\nssh_pcap_file_open\nssh_pki_copy_cert_to_privkey\nssh_pki_export_privkey_base64\nssh_pki_export_privkey_file\nssh_pki_export_privkey_to_pubkey\nssh_pki_export_pubkey_base64\nssh_pki_export_pubkey_file\nssh_pki_generate\nssh_pki_import_cert_base64\nssh_pki_import_cert_file\nssh_pki_import_privkey_base64\nssh_pki_import_privkey_file\nssh_pki_import_pubkey_base64\nssh_pki_import_pubkey_file\nssh_pki_key_ecdsa_name\nssh_print_hash\nssh_print_hexa\nssh_privatekey_type\nssh_publickey_to_file\nssh_remove_channel_callbacks\nssh_scp_accept_request\nssh_scp_close\nssh_scp_deny_request\nssh_scp_free\nssh_scp_init\nssh_scp_leave_directory\nssh_scp_new\nssh_scp_pull_request\nssh_scp_push_directory\nssh_scp_push_file\nssh_scp_push_file64\nssh_scp_read\nssh_scp_request_get_filename\nssh_scp_request_get_permissions\nssh_scp_request_get_size\nssh_scp_request_get_size64\nssh_scp_request_get_warning\nssh_scp_write\nssh_select\nssh_send_debug\nssh_send_ignore\nssh_send_keepalive\nssh_server_init_kex\nssh_service_request\nssh_session_export_known_hosts_entry\nssh_session_get_known_hosts_entry\nssh_session_has_known_hosts_entry\nssh_session_is_known_server\nssh_session_update_known_hosts\nssh_set_agent_channel\nssh_set_agent_socket\nssh_set_auth_methods\nssh_set_blocking\nssh_set_callbacks\nssh_set_channel_callbacks\nssh_set_counters\nssh_set_fd_except\nssh_set_fd_toread\nssh_set_fd_towrite\nssh_set_log_callback\nssh_set_log_level\nssh_set_log_userdata\nssh_set_message_callback\nssh_set_pcap_file\nssh_set_server_callbacks\nssh_silent_disconnect\nssh_string_burn\nssh_string_copy\nssh_string_data\nssh_string_fill\nssh_string_free\nssh_string_free_char\nssh_string_from_char\nssh_string_get_char\nssh_string_len\nssh_string_new\nssh_string_to_char\nssh_threads_get_default\nssh_threads_get_noop\nssh_threads_get_pthread\nssh_threads_set_callbacks\nssh_try_publickey_from_file\nssh_userauth_agent\nssh_userauth_agent_pubkey\nssh_userauth_autopubkey\nssh_userauth_gssapi\nssh_userauth_kbdint\nssh_userauth_kbdint_getanswer\nssh_userauth_kbdint_getinstruction\nssh_userauth_kbdint_getname\nssh_userauth_kbdint_getnanswers\nssh_userauth_kbdint_getnprompts\nssh_userauth_kbdint_getprompt\nssh_userauth_kbdint_setanswer\nssh_userauth_list\nssh_userauth_none\nssh_userauth_offer_pubkey\nssh_userauth_password\nssh_userauth_privatekey_file\nssh_userauth_pubkey\nssh_userauth_publickey\nssh_userauth_publickey_auto\nssh_userauth_try_publickey\nssh_version\nssh_write_knownhost\nstring_burn\nstring_copy\nstring_data\nstring_fill\nstring_free\nstring_from_char\nstring_len\nstring_new\nstring_to_char"
  },
  {
    "path": "src/libssh/src/ABI/libssh-4.8.5.symbols",
    "content": "_ssh_log\nbuffer_free\nbuffer_get\nbuffer_get_len\nbuffer_new\nchannel_accept_x11\nchannel_change_pty_size\nchannel_close\nchannel_forward_accept\nchannel_forward_cancel\nchannel_forward_listen\nchannel_free\nchannel_get_exit_status\nchannel_get_session\nchannel_is_closed\nchannel_is_eof\nchannel_is_open\nchannel_new\nchannel_open_forward\nchannel_open_session\nchannel_poll\nchannel_read\nchannel_read_buffer\nchannel_read_nonblocking\nchannel_request_env\nchannel_request_exec\nchannel_request_pty\nchannel_request_pty_size\nchannel_request_send_signal\nchannel_request_sftp\nchannel_request_shell\nchannel_request_subsystem\nchannel_request_x11\nchannel_select\nchannel_send_eof\nchannel_set_blocking\nchannel_write\nchannel_write_stderr\nprivatekey_free\nprivatekey_from_file\npublickey_free\npublickey_from_file\npublickey_from_privatekey\npublickey_to_string\nsftp_async_read\nsftp_async_read_begin\nsftp_attributes_free\nsftp_canonicalize_path\nsftp_chmod\nsftp_chown\nsftp_client_message_free\nsftp_client_message_get_data\nsftp_client_message_get_filename\nsftp_client_message_get_flags\nsftp_client_message_get_submessage\nsftp_client_message_get_type\nsftp_client_message_set_filename\nsftp_close\nsftp_closedir\nsftp_dir_eof\nsftp_extension_supported\nsftp_extensions_get_count\nsftp_extensions_get_data\nsftp_extensions_get_name\nsftp_file_set_blocking\nsftp_file_set_nonblocking\nsftp_free\nsftp_fstat\nsftp_fstatvfs\nsftp_fsync\nsftp_get_client_message\nsftp_get_error\nsftp_handle\nsftp_handle_alloc\nsftp_handle_remove\nsftp_init\nsftp_lstat\nsftp_mkdir\nsftp_new\nsftp_new_channel\nsftp_open\nsftp_opendir\nsftp_read\nsftp_readdir\nsftp_readlink\nsftp_rename\nsftp_reply_attr\nsftp_reply_data\nsftp_reply_handle\nsftp_reply_name\nsftp_reply_names\nsftp_reply_names_add\nsftp_reply_status\nsftp_rewind\nsftp_rmdir\nsftp_seek\nsftp_seek64\nsftp_send_client_message\nsftp_server_free\nsftp_server_init\nsftp_server_new\nsftp_server_version\nsftp_setstat\nsftp_stat\nsftp_statvfs\nsftp_statvfs_free\nsftp_symlink\nsftp_tell\nsftp_tell64\nsftp_unlink\nsftp_utimes\nsftp_write\nssh_accept\nssh_add_channel_callbacks\nssh_auth_list\nssh_basename\nssh_bind_accept\nssh_bind_accept_fd\nssh_bind_fd_toaccept\nssh_bind_free\nssh_bind_get_fd\nssh_bind_listen\nssh_bind_new\nssh_bind_options_parse_config\nssh_bind_options_set\nssh_bind_set_blocking\nssh_bind_set_callbacks\nssh_bind_set_fd\nssh_blocking_flush\nssh_buffer_add_data\nssh_buffer_free\nssh_buffer_get\nssh_buffer_get_data\nssh_buffer_get_len\nssh_buffer_new\nssh_buffer_reinit\nssh_channel_accept_forward\nssh_channel_accept_x11\nssh_channel_cancel_forward\nssh_channel_change_pty_size\nssh_channel_close\nssh_channel_free\nssh_channel_get_exit_status\nssh_channel_get_session\nssh_channel_is_closed\nssh_channel_is_eof\nssh_channel_is_open\nssh_channel_listen_forward\nssh_channel_new\nssh_channel_open_auth_agent\nssh_channel_open_forward\nssh_channel_open_forward_unix\nssh_channel_open_reverse_forward\nssh_channel_open_session\nssh_channel_open_x11\nssh_channel_poll\nssh_channel_poll_timeout\nssh_channel_read\nssh_channel_read_nonblocking\nssh_channel_read_timeout\nssh_channel_request_auth_agent\nssh_channel_request_env\nssh_channel_request_exec\nssh_channel_request_pty\nssh_channel_request_pty_size\nssh_channel_request_send_break\nssh_channel_request_send_exit_signal\nssh_channel_request_send_exit_status\nssh_channel_request_send_signal\nssh_channel_request_sftp\nssh_channel_request_shell\nssh_channel_request_subsystem\nssh_channel_request_x11\nssh_channel_select\nssh_channel_send_eof\nssh_channel_set_blocking\nssh_channel_set_counter\nssh_channel_window_size\nssh_channel_write\nssh_channel_write_stderr\nssh_clean_pubkey_hash\nssh_connect\nssh_connector_free\nssh_connector_new\nssh_connector_set_in_channel\nssh_connector_set_in_fd\nssh_connector_set_out_channel\nssh_connector_set_out_fd\nssh_copyright\nssh_dirname\nssh_disconnect\nssh_dump_knownhost\nssh_event_add_connector\nssh_event_add_fd\nssh_event_add_session\nssh_event_dopoll\nssh_event_free\nssh_event_new\nssh_event_remove_connector\nssh_event_remove_fd\nssh_event_remove_session\nssh_execute_message_callbacks\nssh_finalize\nssh_forward_accept\nssh_forward_cancel\nssh_forward_listen\nssh_free\nssh_get_cipher_in\nssh_get_cipher_out\nssh_get_clientbanner\nssh_get_disconnect_message\nssh_get_error\nssh_get_error_code\nssh_get_fd\nssh_get_fingerprint_hash\nssh_get_hexa\nssh_get_hmac_in\nssh_get_hmac_out\nssh_get_issue_banner\nssh_get_kex_algo\nssh_get_log_callback\nssh_get_log_level\nssh_get_log_userdata\nssh_get_openssh_version\nssh_get_poll_flags\nssh_get_pubkey\nssh_get_pubkey_hash\nssh_get_publickey\nssh_get_publickey_hash\nssh_get_random\nssh_get_server_publickey\nssh_get_serverbanner\nssh_get_status\nssh_get_version\nssh_getpass\nssh_gssapi_get_creds\nssh_gssapi_set_creds\nssh_handle_key_exchange\nssh_init\nssh_is_blocking\nssh_is_connected\nssh_is_server_known\nssh_key_cmp\nssh_key_free\nssh_key_is_private\nssh_key_is_public\nssh_key_new\nssh_key_type\nssh_key_type_from_name\nssh_key_type_to_char\nssh_known_hosts_parse_line\nssh_knownhosts_entry_free\nssh_log\nssh_message_auth_interactive_request\nssh_message_auth_kbdint_is_response\nssh_message_auth_password\nssh_message_auth_pubkey\nssh_message_auth_publickey\nssh_message_auth_publickey_state\nssh_message_auth_reply_pk_ok\nssh_message_auth_reply_pk_ok_simple\nssh_message_auth_reply_success\nssh_message_auth_set_methods\nssh_message_auth_user\nssh_message_channel_request_channel\nssh_message_channel_request_command\nssh_message_channel_request_env_name\nssh_message_channel_request_env_value\nssh_message_channel_request_open_destination\nssh_message_channel_request_open_destination_port\nssh_message_channel_request_open_originator\nssh_message_channel_request_open_originator_port\nssh_message_channel_request_open_reply_accept\nssh_message_channel_request_open_reply_accept_channel\nssh_message_channel_request_pty_height\nssh_message_channel_request_pty_pxheight\nssh_message_channel_request_pty_pxwidth\nssh_message_channel_request_pty_term\nssh_message_channel_request_pty_width\nssh_message_channel_request_reply_success\nssh_message_channel_request_subsystem\nssh_message_channel_request_x11_auth_cookie\nssh_message_channel_request_x11_auth_protocol\nssh_message_channel_request_x11_screen_number\nssh_message_channel_request_x11_single_connection\nssh_message_free\nssh_message_get\nssh_message_global_request_address\nssh_message_global_request_port\nssh_message_global_request_reply_success\nssh_message_reply_default\nssh_message_retrieve\nssh_message_service_reply_success\nssh_message_service_service\nssh_message_subtype\nssh_message_type\nssh_mkdir\nssh_new\nssh_options_copy\nssh_options_get\nssh_options_get_port\nssh_options_getopt\nssh_options_parse_config\nssh_options_set\nssh_pcap_file_close\nssh_pcap_file_free\nssh_pcap_file_new\nssh_pcap_file_open\nssh_pki_copy_cert_to_privkey\nssh_pki_export_privkey_base64\nssh_pki_export_privkey_file\nssh_pki_export_privkey_to_pubkey\nssh_pki_export_pubkey_base64\nssh_pki_export_pubkey_file\nssh_pki_generate\nssh_pki_import_cert_base64\nssh_pki_import_cert_file\nssh_pki_import_privkey_base64\nssh_pki_import_privkey_file\nssh_pki_import_pubkey_base64\nssh_pki_import_pubkey_file\nssh_pki_key_ecdsa_name\nssh_print_hash\nssh_print_hexa\nssh_privatekey_type\nssh_publickey_to_file\nssh_remove_channel_callbacks\nssh_scp_accept_request\nssh_scp_close\nssh_scp_deny_request\nssh_scp_free\nssh_scp_init\nssh_scp_leave_directory\nssh_scp_new\nssh_scp_pull_request\nssh_scp_push_directory\nssh_scp_push_file\nssh_scp_push_file64\nssh_scp_read\nssh_scp_request_get_filename\nssh_scp_request_get_permissions\nssh_scp_request_get_size\nssh_scp_request_get_size64\nssh_scp_request_get_warning\nssh_scp_write\nssh_select\nssh_send_debug\nssh_send_ignore\nssh_send_keepalive\nssh_server_init_kex\nssh_service_request\nssh_session_export_known_hosts_entry\nssh_session_get_known_hosts_entry\nssh_session_has_known_hosts_entry\nssh_session_is_known_server\nssh_session_update_known_hosts\nssh_set_agent_channel\nssh_set_agent_socket\nssh_set_auth_methods\nssh_set_blocking\nssh_set_callbacks\nssh_set_channel_callbacks\nssh_set_counters\nssh_set_fd_except\nssh_set_fd_toread\nssh_set_fd_towrite\nssh_set_log_callback\nssh_set_log_level\nssh_set_log_userdata\nssh_set_message_callback\nssh_set_pcap_file\nssh_set_server_callbacks\nssh_silent_disconnect\nssh_string_burn\nssh_string_copy\nssh_string_data\nssh_string_fill\nssh_string_free\nssh_string_free_char\nssh_string_from_char\nssh_string_get_char\nssh_string_len\nssh_string_new\nssh_string_to_char\nssh_threads_get_default\nssh_threads_get_noop\nssh_threads_get_pthread\nssh_threads_set_callbacks\nssh_try_publickey_from_file\nssh_userauth_agent\nssh_userauth_agent_pubkey\nssh_userauth_autopubkey\nssh_userauth_gssapi\nssh_userauth_kbdint\nssh_userauth_kbdint_getanswer\nssh_userauth_kbdint_getinstruction\nssh_userauth_kbdint_getname\nssh_userauth_kbdint_getnanswers\nssh_userauth_kbdint_getnprompts\nssh_userauth_kbdint_getprompt\nssh_userauth_kbdint_setanswer\nssh_userauth_list\nssh_userauth_none\nssh_userauth_offer_pubkey\nssh_userauth_password\nssh_userauth_privatekey_file\nssh_userauth_pubkey\nssh_userauth_publickey\nssh_userauth_publickey_auto\nssh_userauth_try_publickey\nssh_version\nssh_write_knownhost\nstring_burn\nstring_copy\nstring_data\nstring_fill\nstring_free\nstring_from_char\nstring_len\nstring_new\nstring_to_char"
  },
  {
    "path": "src/libssh/src/ABI/libssh-4.8.6.symbols",
    "content": "_ssh_log\nbuffer_free\nbuffer_get\nbuffer_get_len\nbuffer_new\nchannel_accept_x11\nchannel_change_pty_size\nchannel_close\nchannel_forward_accept\nchannel_forward_cancel\nchannel_forward_listen\nchannel_free\nchannel_get_exit_status\nchannel_get_session\nchannel_is_closed\nchannel_is_eof\nchannel_is_open\nchannel_new\nchannel_open_forward\nchannel_open_session\nchannel_poll\nchannel_read\nchannel_read_buffer\nchannel_read_nonblocking\nchannel_request_env\nchannel_request_exec\nchannel_request_pty\nchannel_request_pty_size\nchannel_request_send_signal\nchannel_request_sftp\nchannel_request_shell\nchannel_request_subsystem\nchannel_request_x11\nchannel_select\nchannel_send_eof\nchannel_set_blocking\nchannel_write\nchannel_write_stderr\nprivatekey_free\nprivatekey_from_file\npublickey_free\npublickey_from_file\npublickey_from_privatekey\npublickey_to_string\nsftp_async_read\nsftp_async_read_begin\nsftp_attributes_free\nsftp_canonicalize_path\nsftp_chmod\nsftp_chown\nsftp_client_message_free\nsftp_client_message_get_data\nsftp_client_message_get_filename\nsftp_client_message_get_flags\nsftp_client_message_get_submessage\nsftp_client_message_get_type\nsftp_client_message_set_filename\nsftp_close\nsftp_closedir\nsftp_dir_eof\nsftp_extension_supported\nsftp_extensions_get_count\nsftp_extensions_get_data\nsftp_extensions_get_name\nsftp_file_set_blocking\nsftp_file_set_nonblocking\nsftp_free\nsftp_fstat\nsftp_fstatvfs\nsftp_fsync\nsftp_get_client_message\nsftp_get_error\nsftp_handle\nsftp_handle_alloc\nsftp_handle_remove\nsftp_init\nsftp_lstat\nsftp_mkdir\nsftp_new\nsftp_new_channel\nsftp_open\nsftp_opendir\nsftp_read\nsftp_readdir\nsftp_readlink\nsftp_rename\nsftp_reply_attr\nsftp_reply_data\nsftp_reply_handle\nsftp_reply_name\nsftp_reply_names\nsftp_reply_names_add\nsftp_reply_status\nsftp_rewind\nsftp_rmdir\nsftp_seek\nsftp_seek64\nsftp_send_client_message\nsftp_server_free\nsftp_server_init\nsftp_server_new\nsftp_server_version\nsftp_setstat\nsftp_stat\nsftp_statvfs\nsftp_statvfs_free\nsftp_symlink\nsftp_tell\nsftp_tell64\nsftp_unlink\nsftp_utimes\nsftp_write\nssh_accept\nssh_add_channel_callbacks\nssh_auth_list\nssh_basename\nssh_bind_accept\nssh_bind_accept_fd\nssh_bind_fd_toaccept\nssh_bind_free\nssh_bind_get_fd\nssh_bind_listen\nssh_bind_new\nssh_bind_options_parse_config\nssh_bind_options_set\nssh_bind_set_blocking\nssh_bind_set_callbacks\nssh_bind_set_fd\nssh_blocking_flush\nssh_buffer_add_data\nssh_buffer_free\nssh_buffer_get\nssh_buffer_get_data\nssh_buffer_get_len\nssh_buffer_new\nssh_buffer_reinit\nssh_channel_accept_forward\nssh_channel_accept_x11\nssh_channel_cancel_forward\nssh_channel_change_pty_size\nssh_channel_close\nssh_channel_free\nssh_channel_get_exit_status\nssh_channel_get_session\nssh_channel_is_closed\nssh_channel_is_eof\nssh_channel_is_open\nssh_channel_listen_forward\nssh_channel_new\nssh_channel_open_auth_agent\nssh_channel_open_forward\nssh_channel_open_forward_unix\nssh_channel_open_reverse_forward\nssh_channel_open_session\nssh_channel_open_x11\nssh_channel_poll\nssh_channel_poll_timeout\nssh_channel_read\nssh_channel_read_nonblocking\nssh_channel_read_timeout\nssh_channel_request_auth_agent\nssh_channel_request_env\nssh_channel_request_exec\nssh_channel_request_pty\nssh_channel_request_pty_size\nssh_channel_request_send_break\nssh_channel_request_send_exit_signal\nssh_channel_request_send_exit_status\nssh_channel_request_send_signal\nssh_channel_request_sftp\nssh_channel_request_shell\nssh_channel_request_subsystem\nssh_channel_request_x11\nssh_channel_select\nssh_channel_send_eof\nssh_channel_set_blocking\nssh_channel_set_counter\nssh_channel_window_size\nssh_channel_write\nssh_channel_write_stderr\nssh_clean_pubkey_hash\nssh_connect\nssh_connector_free\nssh_connector_new\nssh_connector_set_in_channel\nssh_connector_set_in_fd\nssh_connector_set_out_channel\nssh_connector_set_out_fd\nssh_copyright\nssh_dirname\nssh_disconnect\nssh_dump_knownhost\nssh_event_add_connector\nssh_event_add_fd\nssh_event_add_session\nssh_event_dopoll\nssh_event_free\nssh_event_new\nssh_event_remove_connector\nssh_event_remove_fd\nssh_event_remove_session\nssh_execute_message_callbacks\nssh_finalize\nssh_forward_accept\nssh_forward_cancel\nssh_forward_listen\nssh_free\nssh_get_cipher_in\nssh_get_cipher_out\nssh_get_clientbanner\nssh_get_disconnect_message\nssh_get_error\nssh_get_error_code\nssh_get_fd\nssh_get_fingerprint_hash\nssh_get_hexa\nssh_get_hmac_in\nssh_get_hmac_out\nssh_get_issue_banner\nssh_get_kex_algo\nssh_get_log_callback\nssh_get_log_level\nssh_get_log_userdata\nssh_get_openssh_version\nssh_get_poll_flags\nssh_get_pubkey\nssh_get_pubkey_hash\nssh_get_publickey\nssh_get_publickey_hash\nssh_get_random\nssh_get_server_publickey\nssh_get_serverbanner\nssh_get_status\nssh_get_version\nssh_getpass\nssh_gssapi_get_creds\nssh_gssapi_set_creds\nssh_handle_key_exchange\nssh_init\nssh_is_blocking\nssh_is_connected\nssh_is_server_known\nssh_key_cmp\nssh_key_free\nssh_key_is_private\nssh_key_is_public\nssh_key_new\nssh_key_type\nssh_key_type_from_name\nssh_key_type_to_char\nssh_known_hosts_parse_line\nssh_knownhosts_entry_free\nssh_log\nssh_message_auth_interactive_request\nssh_message_auth_kbdint_is_response\nssh_message_auth_password\nssh_message_auth_pubkey\nssh_message_auth_publickey\nssh_message_auth_publickey_state\nssh_message_auth_reply_pk_ok\nssh_message_auth_reply_pk_ok_simple\nssh_message_auth_reply_success\nssh_message_auth_set_methods\nssh_message_auth_user\nssh_message_channel_request_channel\nssh_message_channel_request_command\nssh_message_channel_request_env_name\nssh_message_channel_request_env_value\nssh_message_channel_request_open_destination\nssh_message_channel_request_open_destination_port\nssh_message_channel_request_open_originator\nssh_message_channel_request_open_originator_port\nssh_message_channel_request_open_reply_accept\nssh_message_channel_request_open_reply_accept_channel\nssh_message_channel_request_pty_height\nssh_message_channel_request_pty_pxheight\nssh_message_channel_request_pty_pxwidth\nssh_message_channel_request_pty_term\nssh_message_channel_request_pty_width\nssh_message_channel_request_reply_success\nssh_message_channel_request_subsystem\nssh_message_channel_request_x11_auth_cookie\nssh_message_channel_request_x11_auth_protocol\nssh_message_channel_request_x11_screen_number\nssh_message_channel_request_x11_single_connection\nssh_message_free\nssh_message_get\nssh_message_global_request_address\nssh_message_global_request_port\nssh_message_global_request_reply_success\nssh_message_reply_default\nssh_message_retrieve\nssh_message_service_reply_success\nssh_message_service_service\nssh_message_subtype\nssh_message_type\nssh_mkdir\nssh_new\nssh_options_copy\nssh_options_get\nssh_options_get_port\nssh_options_getopt\nssh_options_parse_config\nssh_options_set\nssh_pcap_file_close\nssh_pcap_file_free\nssh_pcap_file_new\nssh_pcap_file_open\nssh_pki_copy_cert_to_privkey\nssh_pki_export_privkey_base64\nssh_pki_export_privkey_file\nssh_pki_export_privkey_to_pubkey\nssh_pki_export_pubkey_base64\nssh_pki_export_pubkey_file\nssh_pki_generate\nssh_pki_import_cert_base64\nssh_pki_import_cert_file\nssh_pki_import_privkey_base64\nssh_pki_import_privkey_file\nssh_pki_import_pubkey_base64\nssh_pki_import_pubkey_file\nssh_pki_key_ecdsa_name\nssh_print_hash\nssh_print_hexa\nssh_privatekey_type\nssh_publickey_to_file\nssh_remove_channel_callbacks\nssh_scp_accept_request\nssh_scp_close\nssh_scp_deny_request\nssh_scp_free\nssh_scp_init\nssh_scp_leave_directory\nssh_scp_new\nssh_scp_pull_request\nssh_scp_push_directory\nssh_scp_push_file\nssh_scp_push_file64\nssh_scp_read\nssh_scp_request_get_filename\nssh_scp_request_get_permissions\nssh_scp_request_get_size\nssh_scp_request_get_size64\nssh_scp_request_get_warning\nssh_scp_write\nssh_select\nssh_send_debug\nssh_send_ignore\nssh_send_keepalive\nssh_server_init_kex\nssh_service_request\nssh_session_export_known_hosts_entry\nssh_session_get_known_hosts_entry\nssh_session_has_known_hosts_entry\nssh_session_is_known_server\nssh_session_update_known_hosts\nssh_set_agent_channel\nssh_set_agent_socket\nssh_set_auth_methods\nssh_set_blocking\nssh_set_callbacks\nssh_set_channel_callbacks\nssh_set_counters\nssh_set_fd_except\nssh_set_fd_toread\nssh_set_fd_towrite\nssh_set_log_callback\nssh_set_log_level\nssh_set_log_userdata\nssh_set_message_callback\nssh_set_pcap_file\nssh_set_server_callbacks\nssh_silent_disconnect\nssh_string_burn\nssh_string_copy\nssh_string_data\nssh_string_fill\nssh_string_free\nssh_string_free_char\nssh_string_from_char\nssh_string_get_char\nssh_string_len\nssh_string_new\nssh_string_to_char\nssh_threads_get_default\nssh_threads_get_noop\nssh_threads_get_pthread\nssh_threads_set_callbacks\nssh_try_publickey_from_file\nssh_userauth_agent\nssh_userauth_agent_pubkey\nssh_userauth_autopubkey\nssh_userauth_gssapi\nssh_userauth_kbdint\nssh_userauth_kbdint_getanswer\nssh_userauth_kbdint_getinstruction\nssh_userauth_kbdint_getname\nssh_userauth_kbdint_getnanswers\nssh_userauth_kbdint_getnprompts\nssh_userauth_kbdint_getprompt\nssh_userauth_kbdint_setanswer\nssh_userauth_list\nssh_userauth_none\nssh_userauth_offer_pubkey\nssh_userauth_password\nssh_userauth_privatekey_file\nssh_userauth_pubkey\nssh_userauth_publickey\nssh_userauth_publickey_auto\nssh_userauth_try_publickey\nssh_version\nssh_write_knownhost\nstring_burn\nstring_copy\nstring_data\nstring_fill\nstring_free\nstring_from_char\nstring_len\nstring_new\nstring_to_char"
  },
  {
    "path": "src/libssh/src/CMakeLists.txt",
    "content": "set(LIBSSH_PUBLIC_INCLUDE_DIRS ${libssh_SOURCE_DIR}/include)\n\nset(LIBSSH_PRIVATE_INCLUDE_DIRS\n  ${libssh_BINARY_DIR}/include\n  ${libssh_BINARY_DIR}\n)\n\nset(LIBSSH_LINK_LIBRARIES\n  ${LIBSSH_REQUIRED_LIBRARIES}\n)\n\nif (WIN32)\n  set(LIBSSH_LINK_LIBRARIES\n    ${LIBSSH_LINK_LIBRARIES}\n    ws2_32\n  )\nendif (WIN32)\n\nif (OPENSSL_CRYPTO_LIBRARY)\n  set(LIBSSH_PRIVATE_INCLUDE_DIRS\n    ${LIBSSH_PRIVATE_INCLUDE_DIRS}\n    ${OPENSSL_INCLUDE_DIR}\n  )\n\n  set(LIBSSH_LINK_LIBRARIES\n    ${LIBSSH_LINK_LIBRARIES}\n    ${OPENSSL_CRYPTO_LIBRARY}\n  )\nendif (OPENSSL_CRYPTO_LIBRARY)\n\nif (MBEDTLS_CRYPTO_LIBRARY)\n    set(LIBSSH_PRIVATE_INCLUDE_DIRS\n      ${LIBSSH_PRIVATE_INCLUDE_DIRS}\n      ${MBEDTLS_INCLUDE_DIR}\n    )\n  set(LIBSSH_LINK_LIBRARIES\n    ${LIBSSH_LINK_LIBRARIES}\n    ${MBEDTLS_CRYPTO_LIBRARY}\n  )\nendif (MBEDTLS_CRYPTO_LIBRARY)\n\nif (GCRYPT_LIBRARIES)\n  set(LIBSSH_PRIVATE_INCLUDE_DIRS\n    ${LIBSSH_PRIVATE_INCLUDE_DIRS}\n    ${GCRYPT_INCLUDE_DIR}\n  )\n\n  set(LIBSSH_LINK_LIBRARIES\n    ${LIBSSH_LINK_LIBRARIES}\n    ${GCRYPT_LIBRARIES})\nendif()\n\nif (WITH_ZLIB)\n  set(LIBSSH_PRIVATE_INCLUDE_DIRS\n    ${LIBSSH_PRIVATE_INCLUDE_DIRS}\n    ${ZLIB_INCLUDE_DIR}\n  )\n\n  set(LIBSSH_LINK_LIBRARIES\n    ${LIBSSH_LINK_LIBRARIES}\n    ${ZLIB_LIBRARY}\n  )\nendif (WITH_ZLIB)\n\nif (WITH_GSSAPI AND GSSAPI_FOUND)\n  set(LIBSSH_PRIVATE_INCLUDE_DIRS\n    ${LIBSSH_PRIVATE_INCLUDE_DIRS}\n    ${GSSAPI_INCLUDE_DIR}\n  )\n\n  set(LIBSSH_LINK_LIBRARIES\n    ${LIBSSH_LINK_LIBRARIES}\n    ${GSSAPI_LIBRARIES}\n  )\nendif (WITH_GSSAPI AND GSSAPI_FOUND)\n\nif (WITH_NACL AND NACL_FOUND)\n  set(LIBSSH_PRIVATE_INCLUDE_DIRS\n    ${LIBSSH_PRIVATE_INCLUDE_DIRS}\n    ${NACL_INCLUDE_DIR}\n  )\n\n  set(LIBSSH_LINK_LIBRARIES\n    ${LIBSSH_LINK_LIBRARIES}\n    ${NACL_LIBRARY}\n  )\nendif (WITH_NACL AND NACL_FOUND)\n\nif (MINGW AND Threads_FOUND)\n  set(LIBSSH_LINK_LIBRARIES\n    ${LIBSSH_LINK_LIBRARIES}\n    Threads::Threads\n  )\nendif()\n\nif (BUILD_STATIC_LIB)\n  set(LIBSSH_STATIC_LIBRARY\n    ssh_static\n    CACHE INTERNAL \"libssh static library\"\n  )\nendif (BUILD_STATIC_LIB)\n\nset(libssh_SRCS\n  agent.c\n  auth.c\n  base64.c\n  bignum.c\n  buffer.c\n  callbacks.c\n  channels.c\n  client.c\n  config.c\n  connect.c\n  connector.c\n  curve25519.c\n  dh.c\n  ecdh.c\n  error.c\n  getpass.c\n  init.c\n  kdf.c\n  kex.c\n  known_hosts.c\n  knownhosts.c\n  legacy.c\n  log.c\n  match.c\n  messages.c\n  misc.c\n  options.c\n  packet.c\n  packet_cb.c\n  packet_crypt.c\n  pcap.c\n  pki.c\n  pki_container_openssh.c\n  poll.c\n  session.c\n  scp.c\n  socket.c\n  string.c\n  threads.c\n  wrapper.c\n  external/bcrypt_pbkdf.c\n  external/blowfish.c\n  external/chacha.c\n  external/poly1305.c\n  chachapoly.c\n  config_parser.c\n  token.c\n  pki_ed25519_common.c\n)\n\nif (DEFAULT_C_NO_DEPRECATION_FLAGS)\n    set_source_files_properties(known_hosts.c\n                                PROPERTIES\n                                    COMPILE_FLAGS ${DEFAULT_C_NO_DEPRECATION_FLAGS})\nendif()\n\nif (CMAKE_USE_PTHREADS_INIT)\n    set(libssh_SRCS\n        ${libssh_SRCS}\n        threads/noop.c\n        threads/pthread.c\n    )\nelseif (CMAKE_USE_WIN32_THREADS_INIT)\n        set(libssh_SRCS\n            ${libssh_SRCS}\n            threads/noop.c\n            threads/winlocks.c\n        )\nelse()\n    set(libssh_SRCS\n        ${libssh_SRCS}\n        threads/noop.c\n    )\nendif()\n\nif (WITH_GCRYPT)\n    set(libssh_SRCS\n        ${libssh_SRCS}\n        threads/libgcrypt.c\n        libgcrypt.c\n        gcrypt_missing.c\n        pki_gcrypt.c\n        ecdh_gcrypt.c\n        dh_key.c\n        pki_ed25519.c\n        external/ed25519.c\n        external/fe25519.c\n        external/ge25519.c\n        external/sc25519.c\n       )\nelseif (WITH_MBEDTLS)\n    set(libssh_SRCS\n        ${libssh_SRCS}\n        threads/mbedtls.c\n        libmbedcrypto.c\n        mbedcrypto_missing.c\n        pki_mbedcrypto.c\n        ecdh_mbedcrypto.c\n        dh_key.c\n        pki_ed25519.c\n        external/ed25519.c\n        external/fe25519.c\n        external/ge25519.c\n        external/sc25519.c\n       )\nelse (WITH_GCRYPT)\n    set(libssh_SRCS\n        ${libssh_SRCS}\n        threads/libcrypto.c\n        pki_crypto.c\n        ecdh_crypto.c\n        libcrypto.c\n        dh_crypto.c\n       )\n    if (NOT HAVE_OPENSSL_ED25519)\n        set(libssh_SRCS\n            ${libssh_SRCS}\n            pki_ed25519.c\n            external/ed25519.c\n            external/fe25519.c\n            external/ge25519.c\n            external/sc25519.c\n           )\n    endif (NOT HAVE_OPENSSL_ED25519)\n    if(OPENSSL_VERSION VERSION_LESS \"1.1.0\")\n        set(libssh_SRCS ${libssh_SRCS} libcrypto-compat.c)\n    endif()\nendif (WITH_GCRYPT)\n\nif (WITH_SFTP)\n  set(libssh_SRCS\n    ${libssh_SRCS}\n    sftp.c\n  )\n\n  if (WITH_SERVER)\n    set(libssh_SRCS\n      ${libssh_SRCS}\n      sftpserver.c\n    )\n  endif (WITH_SERVER)\nendif (WITH_SFTP)\n\nif (WITH_SERVER)\n  set(libssh_SRCS\n    ${libssh_SRCS}\n    server.c\n    bind.c\n    bind_config.c\n  )\nendif (WITH_SERVER)\n\nif (WITH_GEX)\n  set(libssh_SRCS\n    ${libssh_SRCS}\n    dh-gex.c\n  )\nendif (WITH_GEX)\n\nif (WITH_ZLIB)\n  set(libssh_SRCS\n    ${libssh_SRCS}\n    gzip.c\n  )\nendif(WITH_ZLIB)\n\nif (WITH_GSSAPI AND GSSAPI_FOUND)\n  set(libssh_SRCS\n    ${libssh_SRCS}\n    gssapi.c\n  )\nendif (WITH_GSSAPI AND GSSAPI_FOUND)\n\nif (NOT WITH_NACL)\n    if (NOT HAVE_OPENSSL_ED25519)\n        set(libssh_SRCS\n            ${libssh_SRCS}\n            external/curve25519_ref.c\n           )\n    endif (NOT HAVE_OPENSSL_ED25519)\nendif (NOT WITH_NACL)\n\n# Set the path to the default map file\nset(MAP_PATH \"${CMAKE_CURRENT_SOURCE_DIR}/${PROJECT_NAME}.map\")\n\nif (WITH_SYMBOL_VERSIONING AND HAVE_LD_VERSION_SCRIPT AND ABIMAP_FOUND)\n    # Get the list of header files\n    get_file_list(dev_header_list\n                  DIRECTORIES \"${LIBSSH_PUBLIC_INCLUDE_DIRS}/libssh\"\n                  FILES_PATTERNS \"*.h\")\n\n    # Extract the symbols marked as \"LIBSSH_API\" from the header files\n    extract_symbols(\"${PROJECT_NAME}_dev.symbols\"\n                    HEADERS_LIST dev_header_list\n                    FILTER_PATTERN \"LIBSSH_API\")\n\n    if (WITH_ABI_BREAK)\n        set(ALLOW_ABI_BREAK \"BREAK_ABI\")\n    endif()\n\n    # Generate the symbol version map file\n    generate_map_file(\"${PROJECT_NAME}_dev.map\"\n                      SYMBOLS \"${PROJECT_NAME}_dev.symbols\"\n                      RELEASE_NAME_VERSION ${PROJECT_NAME}_AFTER_${LIBRARY_VERSION}\n                      CURRENT_MAP ${MAP_PATH}\n                      ${ALLOW_ABI_BREAK})\n\n    set(libssh_SRCS\n      ${libssh_SRCS}\n      ${PROJECT_NAME}_dev.map\n    )\nendif (WITH_SYMBOL_VERSIONING AND HAVE_LD_VERSION_SCRIPT AND ABIMAP_FOUND)\n\n# This gets built as a static library, if -DBUILD_SHARED_LIBS=OFF is passed to\n# cmake.\nadd_library(ssh ${libssh_SRCS})\ntarget_compile_options(ssh\n                       PRIVATE\n                           ${DEFAULT_C_COMPILE_FLAGS}\n                           -D_GNU_SOURCE)\ntarget_include_directories(ssh\n                           PUBLIC\n                               $<BUILD_INTERFACE:${libssh_SOURCE_DIR}/include>\n                               $<INSTALL_INTERFACE:include>\n                           PRIVATE ${LIBSSH_PRIVATE_INCLUDE_DIRS})\n\ntarget_link_libraries(ssh\n                      PRIVATE ${LIBSSH_LINK_LIBRARIES})\n\nif (WIN32 AND NOT BUILD_SHARED_LIBS)\n    set_target_properties(ssh PROPERTIES COMPILE_FLAGS \"-DLIBSSH_STATIC\")\nendif ()\n\nadd_library(ssh::ssh ALIAS ssh)\n\nif (WITH_SYMBOL_VERSIONING AND HAVE_LD_VERSION_SCRIPT)\n    if (ABIMAP_FOUND)\n        # Change path to devel map file\n        set(MAP_PATH \"${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}_dev.map\")\n    endif (ABIMAP_FOUND)\n\n    set_target_properties(ssh\n                          PROPERTIES LINK_FLAGS\n                          \"-Wl,--version-script,\\\"${MAP_PATH}\\\"\")\nendif (WITH_SYMBOL_VERSIONING AND HAVE_LD_VERSION_SCRIPT)\n\nset_target_properties(ssh\n    PROPERTIES\n      VERSION\n        ${LIBRARY_VERSION}\n      SOVERSION\n        ${LIBRARY_SOVERSION}\n      DEFINE_SYMBOL\n        LIBSSH_EXPORTS\n)\n\nif (WITH_VISIBILITY_HIDDEN)\n  set_target_properties(ssh PROPERTIES COMPILE_FLAGS \"-fvisibility=hidden\")\nendif (WITH_VISIBILITY_HIDDEN)\n\nif (MINGW)\n    set_target_properties(ssh PROPERTIES LINK_FLAGS \"-Wl,--enable-stdcall-fixup\")\n    set_target_properties(ssh PROPERTIES COMPILE_FLAGS \"-D_POSIX_SOURCE\")\nendif ()\n\n\ninstall(TARGETS ssh\n        EXPORT libssh-config\n        RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}\n        LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}\n        ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}\n        COMPONENT libraries)\n\ninstall(EXPORT libssh-config\n        DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})\n\nif (BUILD_STATIC_LIB)\n  add_library(ssh-static STATIC ${libssh_SRCS})\n  target_compile_options(ssh-static\n                         PRIVATE\n                            ${DEFAULT_C_COMPILE_FLAGS}\n                            -D_GNU_SOURCE)\n\n  target_include_directories(ssh-static\n                             PUBLIC\n                                 $<BUILD_INTERFACE:${libssh_SOURCE_DIR}/include>\n                                 $<INSTALL_INTERFACE:include>\n                             PRIVATE ${LIBSSH_PRIVATE_INCLUDE_DIRS})\n  target_link_libraries(ssh-static\n                        PUBLIC ${LIBSSH_LINK_LIBRARIES})\n  add_library(ssh::static ALIAS ssh-static)\n\n  if (MSVC)\n    set(OUTPUT_SUFFIX static)\n  else (MSVC)\n    set(OUTPUT_SUFFIX )\n  endif (MSVC)\n  set_target_properties(\n    ssh-static\n      PROPERTIES\n        VERSION\n          ${LIBRARY_VERSION}\n        SOVERSION\n          ${LIBRARY_SOVERSION}\n        OUTPUT_NAME\n          ssh\n        ARCHIVE_OUTPUT_DIRECTORY\n          ${CMAKE_CURRENT_BINARY_DIR}/${OUTPUT_SUFFIX}\n  )\n\n  if (WIN32)\n    set_target_properties(\n      ssh-static\n        PROPERTIES\n          COMPILE_FLAGS\n            \"-DLIBSSH_STATIC\"\n    )\n  endif (WIN32)\nendif (BUILD_STATIC_LIB)\n\nmessage(STATUS \"Threads_FOUND=${Threads_FOUND}\")\n"
  },
  {
    "path": "src/libssh/src/agent.c",
    "content": "/*\n * agent.c - ssh agent functions\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2008-2013 by Andreas Schneider <asn@cryptomilk.org>\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n/* This file is based on authfd.c from OpenSSH */\n\n/*\n * How does the ssh-agent work?\n *\n * a) client sends a request to get a list of all keys\n *    the agent returns the count and all public keys\n * b) iterate over them to check if the server likes one\n * c) the client sends a sign request to the agent\n *    type, pubkey as blob, data to sign, flags\n *    the agent returns the signed data\n */\n\n\n#include \"config.h\"\n\n#include <stdlib.h>\n#include <errno.h>\n#include <string.h>\n#include <stdio.h>\n\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n\n#include \"libssh/agent.h\"\n#include \"libssh/priv.h\"\n#include \"libssh/socket.h\"\n#include \"libssh/buffer.h\"\n#include \"libssh/session.h\"\n#include \"libssh/poll.h\"\n#include \"libssh/pki.h\"\n#include \"libssh/bytearray.h\"\n\n#ifndef _WIN32\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#else\n#include <Windows.h>\n#endif\n\n#define AGENT_MSG_MAXLEN 256 * 1024\n\n/* macro to check for \"agent failure\" message */\n#define agent_failed(x) \\\n  (((x) == SSH_AGENT_FAILURE) || ((x) == SSH_COM_AGENT2_FAILURE) || \\\n   ((x) == SSH2_AGENT_FAILURE))\n\n#ifndef _WIN32\nstatic size_t atomicio(struct ssh_agent_struct *agent, void *buf, size_t n, int do_read) {\n  char *b = buf;\n  size_t pos = 0;\n  ssize_t res;\n  ssh_pollfd_t pfd;\n  ssh_channel channel = agent->channel;\n  socket_t fd;\n\n  /* Using a socket ? */\n  if (channel == NULL) {\n    fd = ssh_socket_get_fd(agent->sock);\n    pfd.fd = fd;\n    pfd.events = do_read ? POLLIN : POLLOUT;\n\n    while (n > pos) {\n      if (do_read) {\n        res = read(fd, b + pos, n - pos);\n      } else {\n        res = write(fd, b + pos, n - pos);\n      }\n      switch (res) {\n      case -1:\n        if (errno == EINTR) {\n          continue;\n        }\n#ifdef EWOULDBLOCK\n        if (errno == EAGAIN || errno == EWOULDBLOCK) {\n#else\n          if (errno == EAGAIN) {\n#endif\n            (void) ssh_poll(&pfd, 1, -1);\n            continue;\n          }\n          return 0;\n      case 0:\n        /* read returns 0 on end-of-file */\n        errno = do_read ? 0 : EPIPE;\n        return pos;\n      default:\n        pos += (size_t) res;\n        }\n      }\n      return pos;\n    } else {\n      /* using an SSH channel */\n      while (n > pos){\n        if (do_read)\n          res = ssh_channel_read(channel,b + pos, n-pos, 0);\n        else\n          res = ssh_channel_write(channel, b+pos, n-pos);\n        if (res == SSH_AGAIN)\n          continue;\n        if (res == SSH_ERROR)\n          return 0;\n        pos += (size_t)res;\n      }\n      return pos;\n    }\n}\n#endif\n\nssh_agent ssh_agent_new(struct ssh_session_struct *session) {\n  ssh_agent agent = NULL;\n\n  agent = malloc(sizeof(struct ssh_agent_struct));\n  if (agent == NULL) {\n    return NULL;\n  }\n  ZERO_STRUCTP(agent);\n\n  agent->count = 0;\n\n#ifndef _WIN32\n  agent->sock = ssh_socket_new(session);\n  if (agent->sock == NULL) {\n    SAFE_FREE(agent);\n    return NULL;\n  }\n  agent->channel = NULL;\n#endif\n\n  return agent;\n}\n\nstatic void agent_set_channel(struct ssh_agent_struct *agent, ssh_channel channel){\n  agent->channel = channel;\n}\n\n/** @brief sets the SSH agent channel.\n * The SSH agent channel will be used to authenticate this client using\n * an agent through a channel, from another session. The most likely use\n * is to implement SSH Agent forwarding into a SSH proxy.\n * @param[in] channel a SSH channel from another session.\n * @returns SSH_OK in case of success\n *          SSH_ERROR in case of an error\n */\nint ssh_set_agent_channel(ssh_session session, ssh_channel channel){\n  if (!session)\n    return SSH_ERROR;\n  if (!session->agent){\n    ssh_set_error(session, SSH_REQUEST_DENIED, \"Session has no active agent\");\n    return SSH_ERROR;\n  }\n  agent_set_channel(session->agent, channel);\n  return SSH_OK;\n}\n\n#ifndef _WIN32\n/** @brief sets the SSH agent socket.\n * The SSH agent will be used to authenticate this client using\n * the given socket to communicate with the ssh-agent. The caller\n * is responsible for connecting to the socket prior to calling\n * this function.\n * @returns SSH_OK in case of success\n *          SSH_ERROR in case of an error\n */\nint ssh_set_agent_socket(ssh_session session, socket_t fd){\n  if (!session)\n    return SSH_ERROR;\n  if (!session->agent){\n    ssh_set_error(session, SSH_REQUEST_DENIED, \"Session has no active agent\");\n    return SSH_ERROR;\n  }\n\n  ssh_socket_set_fd(session->agent->sock, fd);\n  return SSH_OK;\n}\n\nvoid ssh_agent_close(struct ssh_agent_struct *agent) {\n  if (agent == NULL) {\n    return;\n  }\n\n  ssh_socket_close(agent->sock);\n}\n#endif\n\nvoid ssh_agent_free(ssh_agent agent) {\n  if (agent) {\n    if (agent->ident) {\n      SSH_BUFFER_FREE(agent->ident);\n    }\n#ifndef _WIN32\n    if (agent->sock) {\n      ssh_agent_close(agent);\n      ssh_socket_free(agent->sock);\n    }\n#endif\n    SAFE_FREE(agent);\n  }\n}\n\n#ifndef _WIN32\nstatic int agent_connect(ssh_session session) {\n  const char *auth_sock = NULL;\n\n  if (session == NULL || session->agent == NULL) {\n    return -1;\n  }\n\n  if (session->agent->channel != NULL)\n    return 0;\n\n  auth_sock = getenv(\"SSH_AUTH_SOCK\");\n\n  if (auth_sock && *auth_sock) {\n    if (ssh_socket_unix(session->agent->sock, auth_sock) < 0) {\n      return -1;\n    }\n    return 0;\n  }\n\n  return -1;\n}\n#endif\n\n#if 0\nstatic int agent_decode_reply(struct ssh_session_struct *session, int type) {\n  switch (type) {\n    case SSH_AGENT_FAILURE:\n    case SSH2_AGENT_FAILURE:\n    case SSH_COM_AGENT2_FAILURE:\n      ssh_log(session, SSH_LOG_RARE, \"SSH_AGENT_FAILURE\");\n      return 0;\n    case SSH_AGENT_SUCCESS:\n      return 1;\n    default:\n      ssh_set_error(session, SSH_FATAL,\n          \"Bad response from authentication agent: %d\", type);\n      break;\n  }\n\n  return -1;\n}\n#endif\n\n#ifndef _WIN32\n\nstatic int agent_talk(struct ssh_session_struct *session,\n    struct ssh_buffer_struct *request, struct ssh_buffer_struct *reply) {\n  uint32_t len = 0;\n  uint8_t payload[1024] = {0};\n\n  len = ssh_buffer_get_len(request);\n  SSH_LOG(SSH_LOG_TRACE, \"Request length: %u\", len);\n  PUSH_BE_U32(payload, 0, len);\n\n  /* send length and then the request packet */\n  if (atomicio(session->agent, payload, 4, 0) == 4) {\n    if (atomicio(session->agent, ssh_buffer_get(request), len, 0)\n        != len) {\n      SSH_LOG(SSH_LOG_WARN, \"atomicio sending request failed: %s\",\n          strerror(errno));\n      return -1;\n    }\n  } else {\n    SSH_LOG(SSH_LOG_WARN,\n        \"atomicio sending request length failed: %s\",\n        strerror(errno));\n    return -1;\n  }\n\n  /* wait for response, read the length of the response packet */\n  if (atomicio(session->agent, payload, 4, 1) != 4) {\n    SSH_LOG(SSH_LOG_WARN, \"atomicio read response length failed: %s\",\n        strerror(errno));\n    return -1;\n  }\n\n  len = PULL_BE_U32(payload, 0);\n  if (len > AGENT_MSG_MAXLEN) {\n    ssh_set_error(session, SSH_FATAL,\n        \"Authentication response too long: %u\", len);\n    return -1;\n  }\n  SSH_LOG(SSH_LOG_TRACE, \"Response length: %u\", len);\n\n  while (len > 0) {\n    size_t n = len;\n    if (n > sizeof(payload)) {\n      n = sizeof(payload);\n    }\n    if (atomicio(session->agent, payload, n, 1) != n) {\n      SSH_LOG(SSH_LOG_WARN,\n          \"Error reading response from authentication socket.\");\n      return -1;\n    }\n    if (ssh_buffer_add_data(reply, payload, n) < 0) {\n      SSH_LOG(SSH_LOG_WARN, \"Not enough space\");\n      return -1;\n    }\n    len -= n;\n  }\n\n  return 0;\n}\n\n#else\n\n#define AGENT_COPYDATA_ID 0x804e50ba;\n\nstatic int agent_talk(struct ssh_session_struct *session,\n    struct ssh_buffer_struct *request, struct ssh_buffer_struct *reply) {\n  HWND hwnd = FindWindow(\"Pageant\", \"Pageant\");\n  if (hwnd == NULL) {\n    ssh_set_error(session, SSH_FATAL,\n        \"Pageant message window not found: %u\", GetLastError());\n    return -1;\n  }\n\n  char map_name[39];\n  sprintf(map_name, \"libssh_agent_%08x_%016zx\",\n      GetCurrentProcessId(), (size_t)session->agent);\n\n  HANDLE hmap = CreateFileMapping(NULL, NULL, PAGE_READWRITE,\n      0, AGENT_MSG_MAXLEN + sizeof(uint32_t), map_name);\n  if (hmap == NULL) {\n    ssh_set_error(session, SSH_FATAL,\n        \"Failed to create file mapping: %u\", GetLastError());\n    return -1;\n  }\n\n  char *buf = MapViewOfFile(hmap, FILE_MAP_ALL_ACCESS, 0, 0, 0);\n  if (buf == NULL) {\n    ssh_set_error(session, SSH_FATAL,\n        \"Failed to map the file mapping into memory: %u\", GetLastError());\n    CloseHandle(hmap);\n    return -1;\n  }\n\n  uint32_t len = ssh_buffer_get_len(request);\n  SSH_LOG(SSH_LOG_TRACE, \"Request length: %u\", len);\n  PUSH_BE_U32(buf, 0, len);\n  memcpy(buf + sizeof(uint32_t), ssh_buffer_get(request), len);\n\n  COPYDATASTRUCT data;\n  data.dwData = AGENT_COPYDATA_ID;\n  data.cbData = strlen(map_name) + 1;\n  data.lpData = map_name;\n  if (SendMessage(hwnd, WM_COPYDATA, 0, (LPARAM)&data) < 0) {\n    ssh_set_error(session, SSH_FATAL, \"Pageant returned an error\");\n    UnmapViewOfFile(buf);\n    CloseHandle(hmap);\n    return -1;\n  }\n\n  len = PULL_BE_U32(buf, 0);\n  if (len > AGENT_MSG_MAXLEN) {\n    ssh_set_error(session, SSH_FATAL,\n        \"Authentication response too long: %u\", len);\n    UnmapViewOfFile(buf);\n    CloseHandle(hmap);\n    return -1;\n  }\n  SSH_LOG(SSH_LOG_TRACE, \"Response length: %u\", len);\n\n  int rc = ssh_buffer_add_data(reply, buf + sizeof(uint32_t), len);\n  UnmapViewOfFile(buf);\n  CloseHandle(hmap);\n  if (rc < 0) {\n    SSH_LOG(SSH_LOG_WARN, \"Not enough space\");\n    return -1;\n  }\n\n  return 0;\n}\n\n#endif /* _WIN32 */\n\nuint32_t ssh_agent_get_ident_count(struct ssh_session_struct *session)\n{\n    ssh_buffer request = NULL;\n    ssh_buffer reply = NULL;\n    unsigned int type = 0;\n    uint32_t count = 0;\n    int rc;\n\n    /* send message to the agent requesting the list of identities */\n    request = ssh_buffer_new();\n    if (request == NULL) {\n        ssh_set_error_oom(session);\n        return 0;\n    }\n    if (ssh_buffer_add_u8(request, SSH2_AGENTC_REQUEST_IDENTITIES) < 0) {\n        ssh_set_error_oom(session);\n        SSH_BUFFER_FREE(request);\n        return 0;\n    }\n\n    reply = ssh_buffer_new();\n    if (reply == NULL) {\n        SSH_BUFFER_FREE(request);\n        ssh_set_error(session, SSH_FATAL, \"Not enough space\");\n        return 0;\n    }\n\n    if (agent_talk(session, request, reply) < 0) {\n        SSH_BUFFER_FREE(request);\n        SSH_BUFFER_FREE(reply);\n        return 0;\n    }\n    SSH_BUFFER_FREE(request);\n\n    /* get message type and verify the answer */\n    rc = ssh_buffer_get_u8(reply, (uint8_t *) &type);\n    if (rc != sizeof(uint8_t)) {\n        ssh_set_error(session, SSH_FATAL,\n                \"Bad authentication reply size: %d\", rc);\n        SSH_BUFFER_FREE(reply);\n        return 0;\n    }\n#ifdef WORDS_BIGENDIAN\n    type = bswap_32(type);\n#endif\n\n    SSH_LOG(SSH_LOG_WARN,\n            \"Answer type: %d, expected answer: %d\",\n            type, SSH2_AGENT_IDENTITIES_ANSWER);\n\n    if (agent_failed(type)) {\n        SSH_BUFFER_FREE(reply);\n        return 0;\n    } else if (type != SSH2_AGENT_IDENTITIES_ANSWER) {\n        ssh_set_error(session, SSH_FATAL,\n                \"Bad authentication reply message type: %u\", type);\n        SSH_BUFFER_FREE(reply);\n        return 0;\n    }\n\n    rc = ssh_buffer_get_u32(reply, &count);\n    if (rc != 4) {\n        ssh_set_error(session,\n                SSH_FATAL,\n                \"Failed to read count\");\n        SSH_BUFFER_FREE(reply);\n        return 0;\n    }\n    session->agent->count = ntohl(count);\n    SSH_LOG(SSH_LOG_DEBUG, \"Agent count: %d\",\n            session->agent->count);\n    if (session->agent->count > 1024) {\n        ssh_set_error(session, SSH_FATAL,\n                \"Too many identities in authentication reply: %d\",\n                session->agent->count);\n        SSH_BUFFER_FREE(reply);\n        return 0;\n    }\n\n    if (session->agent->ident) {\n        ssh_buffer_reinit(session->agent->ident);\n    }\n    session->agent->ident = reply;\n\n    return session->agent->count;\n}\n\n/* caller has to free commment */\nssh_key ssh_agent_get_first_ident(struct ssh_session_struct *session,\n                              char **comment) {\n    if (ssh_agent_get_ident_count(session) > 0) {\n        return ssh_agent_get_next_ident(session, comment);\n    }\n\n    return NULL;\n}\n\n/* caller has to free commment */\nssh_key ssh_agent_get_next_ident(struct ssh_session_struct *session,\n    char **comment) {\n    struct ssh_key_struct *key;\n    struct ssh_string_struct *blob = NULL;\n    struct ssh_string_struct *tmp = NULL;\n    int rc;\n\n    if (session->agent->count == 0) {\n        return NULL;\n    }\n\n    /* get the blob */\n    blob = ssh_buffer_get_ssh_string(session->agent->ident);\n    if (blob == NULL) {\n        return NULL;\n    }\n\n    /* get the comment */\n    tmp = ssh_buffer_get_ssh_string(session->agent->ident);\n    if (tmp == NULL) {\n        SSH_STRING_FREE(blob);\n\n        return NULL;\n    }\n\n    if (comment) {\n        *comment = ssh_string_to_char(tmp);\n    } else {\n        SSH_STRING_FREE(blob);\n        SSH_STRING_FREE(tmp);\n\n        return NULL;\n    }\n    SSH_STRING_FREE(tmp);\n\n    /* get key from blob */\n    rc = ssh_pki_import_pubkey_blob(blob, &key);\n    if (rc == SSH_ERROR) {\n        /* Try again as a cert. */\n        rc = ssh_pki_import_cert_blob(blob, &key);\n    }\n    SSH_STRING_FREE(blob);\n    if (rc == SSH_ERROR) {\n        return NULL;\n    }\n\n    return key;\n}\n\nint ssh_agent_is_running(ssh_session session) {\n  if (session == NULL || session->agent == NULL) {\n    return 0;\n  }\n\n#ifndef _WIN32\n  if (ssh_socket_is_open(session->agent->sock)) {\n    return 1;\n  } else {\n    if (agent_connect(session) < 0) {\n      return 0;\n    } else {\n      return 1;\n    }\n  }\n\n  return 0;\n#else\n  HWND hwnd = FindWindow(\"Pageant\", \"Pageant\");\n  return hwnd != NULL;\n#endif\n}\n\nssh_string ssh_agent_sign_data(ssh_session session,\n                               const ssh_key pubkey,\n                               struct ssh_buffer_struct *data)\n{\n    ssh_buffer request;\n    ssh_buffer reply;\n    ssh_string key_blob;\n    ssh_string sig_blob;\n    unsigned int type = 0;\n    unsigned int flags = 0;\n    uint32_t dlen;\n    int rc;\n\n    request = ssh_buffer_new();\n    if (request == NULL) {\n        return NULL;\n    }\n\n    /* create request */\n    if (ssh_buffer_add_u8(request, SSH2_AGENTC_SIGN_REQUEST) < 0) {\n        SSH_BUFFER_FREE(request);\n        return NULL;\n    }\n\n    rc = ssh_pki_export_pubkey_blob(pubkey, &key_blob);\n    if (rc < 0) {\n        SSH_BUFFER_FREE(request);\n        return NULL;\n    }\n\n    /*\n     * make sure it already can contain all the expected content:\n     * - 1 x uint8_t\n     * - 2 x uint32_t\n     * - 1 x ssh_string (uint8_t + data)\n     */\n    rc = ssh_buffer_allocate_size(request,\n                                  sizeof(uint8_t) * 2 +\n                                  sizeof(uint32_t) * 2 +\n                                  ssh_string_len(key_blob));\n    if (rc < 0) {\n        SSH_BUFFER_FREE(request);\n        return NULL;\n    }\n\n    /* adds len + blob */\n    rc = ssh_buffer_add_ssh_string(request, key_blob);\n    SSH_STRING_FREE(key_blob);\n    if (rc < 0) {\n        SSH_BUFFER_FREE(request);\n        return NULL;\n    }\n\n    /* Add data */\n    dlen = ssh_buffer_get_len(data);\n    if (ssh_buffer_add_u32(request, htonl(dlen)) < 0) {\n        SSH_BUFFER_FREE(request);\n        return NULL;\n    }\n    if (ssh_buffer_add_data(request, ssh_buffer_get(data), dlen) < 0) {\n        SSH_BUFFER_FREE(request);\n        return NULL;\n    }\n\n    /* Add Flags: SHA2 extension (RFC 8332) if negotiated */\n    if (ssh_key_type_plain(pubkey->type) == SSH_KEYTYPE_RSA) {\n        if (session->extensions & SSH_EXT_SIG_RSA_SHA512) {\n            flags |= SSH_AGENT_RSA_SHA2_512;\n        } else if (session->extensions & SSH_EXT_SIG_RSA_SHA256) {\n            flags |= SSH_AGENT_RSA_SHA2_256;\n        }\n    }\n    if (ssh_buffer_add_u32(request, htonl(flags)) < 0) {\n        SSH_BUFFER_FREE(request);\n        return NULL;\n    }\n\n    reply = ssh_buffer_new();\n    if (reply == NULL) {\n        SSH_BUFFER_FREE(request);\n        return NULL;\n    }\n\n    /* send the request */\n    if (agent_talk(session, request, reply) < 0) {\n        SSH_BUFFER_FREE(request);\n        SSH_BUFFER_FREE(reply);\n        return NULL;\n    }\n    SSH_BUFFER_FREE(request);\n\n    /* check if reply is valid */\n    if (ssh_buffer_get_u8(reply, (uint8_t *) &type) != sizeof(uint8_t)) {\n        SSH_BUFFER_FREE(reply);\n        return NULL;\n    }\n#ifdef WORDS_BIGENDIAN\n    type = bswap_32(type);\n#endif\n\n    if (agent_failed(type)) {\n        SSH_LOG(SSH_LOG_WARN, \"Agent reports failure in signing the key\");\n        SSH_BUFFER_FREE(reply);\n        return NULL;\n    } else if (type != SSH2_AGENT_SIGN_RESPONSE) {\n        ssh_set_error(session,\n                      SSH_FATAL,\n                      \"Bad authentication response: %u\",\n                      type);\n        SSH_BUFFER_FREE(reply);\n        return NULL;\n    }\n\n    sig_blob = ssh_buffer_get_ssh_string(reply);\n    SSH_BUFFER_FREE(reply);\n\n    return sig_blob;\n}\n\n"
  },
  {
    "path": "src/libssh/src/auth.c",
    "content": "/*\n * auth.c - Authentication with SSH protocols\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2003-2013 by Aris Adamantiadis <aris@0xbadc0de.be>\n * Copyright (c) 2008-2013 Andreas Schneider <asn@cryptomilk.org>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <stdio.h>\n#include <string.h>\n\n#ifndef _WIN32\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#endif\n\n#include \"libssh/priv.h\"\n#include \"libssh/crypto.h\"\n#include \"libssh/ssh2.h\"\n#include \"libssh/buffer.h\"\n#include \"libssh/agent.h\"\n#include \"libssh/misc.h\"\n#include \"libssh/packet.h\"\n#include \"libssh/session.h\"\n#include \"libssh/keys.h\"\n#include \"libssh/auth.h\"\n#include \"libssh/pki.h\"\n#include \"libssh/gssapi.h\"\n#include \"libssh/legacy.h\"\n\n/**\n * @defgroup libssh_auth The SSH authentication functions.\n * @ingroup libssh\n *\n * Functions to authenticate with a server.\n *\n * @{\n */\n\n/**\n * @internal\n *\n * @brief Ask access to the ssh-userauth service.\n *\n * @param[in] session   The SSH session handle.\n *\n * @returns SSH_OK on success, SSH_ERROR on error.\n * @returns SSH_AGAIN on nonblocking mode, if calling that function\n * again is necessary\n */\nstatic int ssh_userauth_request_service(ssh_session session) {\n    int rc;\n\n    rc = ssh_service_request(session, \"ssh-userauth\");\n    if ((rc != SSH_OK) && (rc != SSH_AGAIN)) {\n        SSH_LOG(SSH_LOG_WARN,\n                \"Failed to request \\\"ssh-userauth\\\" service\");\n    }\n\n    return rc;\n}\n\nstatic int ssh_auth_response_termination(void *user) {\n    ssh_session session = (ssh_session)user;\n    switch (session->auth.state) {\n        case SSH_AUTH_STATE_NONE:\n        case SSH_AUTH_STATE_KBDINT_SENT:\n        case SSH_AUTH_STATE_GSSAPI_REQUEST_SENT:\n        case SSH_AUTH_STATE_GSSAPI_TOKEN:\n        case SSH_AUTH_STATE_GSSAPI_MIC_SENT:\n        case SSH_AUTH_STATE_PUBKEY_AUTH_SENT:\n        case SSH_AUTH_STATE_PUBKEY_OFFER_SENT:\n        case SSH_AUTH_STATE_PASSWORD_AUTH_SENT:\n        case SSH_AUTH_STATE_AUTH_NONE_SENT:\n            return 0;\n        default:\n            return 1;\n    }\n}\n\nstatic const char *ssh_auth_get_current_method(ssh_session session)\n{\n    const char *method = \"unknown\";\n\n    switch (session->auth.current_method) {\n    case SSH_AUTH_METHOD_NONE:\n        method = \"none\";\n        break;\n    case SSH_AUTH_METHOD_PASSWORD:\n        method = \"password\";\n        break;\n    case SSH_AUTH_METHOD_PUBLICKEY:\n        method = \"publickey\";\n        break;\n    case SSH_AUTH_METHOD_HOSTBASED:\n        method = \"hostbased\";\n        break;\n    case SSH_AUTH_METHOD_INTERACTIVE:\n        method = \"keyboard interactive\";\n        break;\n    case SSH_AUTH_METHOD_GSSAPI_MIC:\n        method = \"gssapi\";\n        break;\n    default:\n        break;\n    }\n\n    return method;\n}\n\n/**\n * @internal\n * @brief Wait for a response of an authentication function.\n *\n * @param[in] session   The SSH session.\n *\n * @returns SSH_AUTH_SUCCESS Authentication success, or pubkey accepted\n *          SSH_AUTH_PARTIAL Authentication succeeded but another mean\n *                           of authentication is needed.\n *          SSH_AUTH_INFO    Data for keyboard-interactive\n *          SSH_AUTH_AGAIN   In nonblocking mode, call has to be made again\n *          SSH_AUTH_ERROR   Error during the process.\n */\nstatic int ssh_userauth_get_response(ssh_session session) {\n    int rc = SSH_AUTH_ERROR;\n\n    rc = ssh_handle_packets_termination(session, SSH_TIMEOUT_USER,\n        ssh_auth_response_termination, session);\n    if (rc == SSH_ERROR) {\n        return SSH_AUTH_ERROR;\n    }\n    if (!ssh_auth_response_termination(session)) {\n        return SSH_AUTH_AGAIN;\n    }\n\n    switch(session->auth.state) {\n        case SSH_AUTH_STATE_ERROR:\n            rc = SSH_AUTH_ERROR;\n            break;\n        case SSH_AUTH_STATE_FAILED:\n            rc = SSH_AUTH_DENIED;\n            break;\n        case SSH_AUTH_STATE_INFO:\n            rc = SSH_AUTH_INFO;\n            break;\n        case SSH_AUTH_STATE_PARTIAL:\n            rc = SSH_AUTH_PARTIAL;\n            break;\n        case SSH_AUTH_STATE_PK_OK:\n        case SSH_AUTH_STATE_SUCCESS:\n            rc = SSH_AUTH_SUCCESS;\n            break;\n        case SSH_AUTH_STATE_KBDINT_SENT:\n        case SSH_AUTH_STATE_GSSAPI_REQUEST_SENT:\n        case SSH_AUTH_STATE_GSSAPI_TOKEN:\n        case SSH_AUTH_STATE_GSSAPI_MIC_SENT:\n        case SSH_AUTH_STATE_PUBKEY_OFFER_SENT:\n        case SSH_AUTH_STATE_PUBKEY_AUTH_SENT:\n        case SSH_AUTH_STATE_PASSWORD_AUTH_SENT:\n        case SSH_AUTH_STATE_AUTH_NONE_SENT:\n        case SSH_AUTH_STATE_NONE:\n            /* not reached */\n            rc = SSH_AUTH_ERROR;\n            break;\n    }\n\n    return rc;\n}\n\n/**\n * @internal\n *\n * @brief Handles a SSH_USERAUTH_BANNER packet.\n *\n * This banner should be shown to user prior to authentication\n */\nSSH_PACKET_CALLBACK(ssh_packet_userauth_banner) {\n    ssh_string banner;\n    (void)type;\n    (void)user;\n\n    banner = ssh_buffer_get_ssh_string(packet);\n    if (banner == NULL) {\n        SSH_LOG(SSH_LOG_WARN,\n                \"Invalid SSH_USERAUTH_BANNER packet\");\n    } else {\n        SSH_LOG(SSH_LOG_DEBUG,\n                \"Received SSH_USERAUTH_BANNER packet\");\n        if (session->banner != NULL)\n            SSH_STRING_FREE(session->banner);\n        session->banner = banner;\n    }\n\n    return SSH_PACKET_USED;\n}\n\n/**\n * @internal\n *\n * @brief Handles a SSH_USERAUTH_FAILURE packet.\n *\n * This handles the complete or partial authentication failure.\n */\nSSH_PACKET_CALLBACK(ssh_packet_userauth_failure) {\n    const char *current_method = ssh_auth_get_current_method(session);\n    char *auth_methods = NULL;\n    uint8_t partial = 0;\n    int rc;\n    (void) type;\n    (void) user;\n\n    rc = ssh_buffer_unpack(packet, \"sb\", &auth_methods, &partial);\n    if (rc != SSH_OK) {\n        ssh_set_error(session, SSH_FATAL,\n                      \"Invalid SSH_MSG_USERAUTH_FAILURE message\");\n        session->auth.state = SSH_AUTH_STATE_ERROR;\n        goto end;\n    }\n\n    if (partial) {\n        session->auth.state = SSH_AUTH_STATE_PARTIAL;\n        SSH_LOG(SSH_LOG_INFO,\n                \"Partial success for '%s'. Authentication that can continue: %s\",\n                current_method,\n                auth_methods);\n    } else {\n        session->auth.state = SSH_AUTH_STATE_FAILED;\n        ssh_set_error(session, SSH_REQUEST_DENIED,\n                      \"Access denied for '%s'. Authentication that can continue: %s\",\n                      current_method,\n                      auth_methods);\n        SSH_LOG(SSH_LOG_INFO,\n                \"%s\",\n                ssh_get_error(session));\n\n    }\n    session->auth.supported_methods = 0;\n    if (strstr(auth_methods, \"password\") != NULL) {\n        session->auth.supported_methods |= SSH_AUTH_METHOD_PASSWORD;\n    }\n    if (strstr(auth_methods, \"keyboard-interactive\") != NULL) {\n        session->auth.supported_methods |= SSH_AUTH_METHOD_INTERACTIVE;\n    }\n    if (strstr(auth_methods, \"publickey\") != NULL) {\n        session->auth.supported_methods |= SSH_AUTH_METHOD_PUBLICKEY;\n    }\n    if (strstr(auth_methods, \"hostbased\") != NULL) {\n        session->auth.supported_methods |= SSH_AUTH_METHOD_HOSTBASED;\n    }\n    if (strstr(auth_methods, \"gssapi-with-mic\") != NULL) {\n        session->auth.supported_methods |= SSH_AUTH_METHOD_GSSAPI_MIC;\n    }\n\nend:\n    session->auth.current_method = SSH_AUTH_METHOD_UNKNOWN;\n    SAFE_FREE(auth_methods);\n\n    return SSH_PACKET_USED;\n}\n\n/**\n * @internal\n *\n * @brief Handles a SSH_USERAUTH_SUCCESS packet.\n *\n * It is also used to communicate the new to the upper levels.\n */\nSSH_PACKET_CALLBACK(ssh_packet_userauth_success)\n{\n  struct ssh_crypto_struct *crypto = NULL;\n\n  (void)packet;\n  (void)type;\n  (void)user;\n\n  SSH_LOG(SSH_LOG_DEBUG, \"Authentication successful\");\n  SSH_LOG(SSH_LOG_TRACE, \"Received SSH_USERAUTH_SUCCESS\");\n\n  session->auth.state = SSH_AUTH_STATE_SUCCESS;\n  session->session_state = SSH_SESSION_STATE_AUTHENTICATED;\n  session->flags |= SSH_SESSION_FLAG_AUTHENTICATED;\n\n  crypto = ssh_packet_get_current_crypto(session, SSH_DIRECTION_OUT);\n  if (crypto != NULL && crypto->delayed_compress_out) {\n      SSH_LOG(SSH_LOG_DEBUG, \"Enabling delayed compression OUT\");\n      crypto->do_compress_out = 1;\n  }\n\n  crypto = ssh_packet_get_current_crypto(session, SSH_DIRECTION_IN);\n  if (crypto != NULL && crypto->delayed_compress_in) {\n      SSH_LOG(SSH_LOG_DEBUG, \"Enabling delayed compression IN\");\n      crypto->do_compress_in = 1;\n  }\n\n    /* Reset errors by previous authentication methods. */\n    ssh_reset_error(session);\n    session->auth.current_method = SSH_AUTH_METHOD_UNKNOWN;\n  return SSH_PACKET_USED;\n}\n\n/**\n * @internal\n *\n * @brief Handles a SSH_USERAUTH_PK_OK or SSH_USERAUTH_INFO_REQUEST packet.\n *\n * Since the two types of packets share the same code, additional work is done\n * to understand if we are in a public key or keyboard-interactive context.\n */\nSSH_PACKET_CALLBACK(ssh_packet_userauth_pk_ok) {\n    int rc;\n\n    SSH_LOG(SSH_LOG_TRACE,\n            \"Received SSH_USERAUTH_PK_OK/INFO_REQUEST/GSSAPI_RESPONSE\");\n\n    if (session->auth.state == SSH_AUTH_STATE_KBDINT_SENT) {\n        /* Assuming we are in keyboard-interactive context */\n        SSH_LOG(SSH_LOG_TRACE,\n                \"keyboard-interactive context, \"\n                \"assuming SSH_USERAUTH_INFO_REQUEST\");\n        rc = ssh_packet_userauth_info_request(session,type,packet,user);\n#ifdef WITH_GSSAPI\n    } else if (session->auth.state == SSH_AUTH_STATE_GSSAPI_REQUEST_SENT) {\n        rc = ssh_packet_userauth_gssapi_response(session, type, packet, user);\n#endif\n    } else if (session->auth.state == SSH_AUTH_STATE_PUBKEY_OFFER_SENT) {\n        session->auth.state = SSH_AUTH_STATE_PK_OK;\n        SSH_LOG(SSH_LOG_TRACE, \"Assuming SSH_USERAUTH_PK_OK\");\n        rc = SSH_PACKET_USED;\n    } else {\n        session->auth.state = SSH_AUTH_STATE_ERROR;\n        SSH_LOG(SSH_LOG_TRACE, \"SSH_USERAUTH_PK_OK received in wrong state\");\n        rc = SSH_PACKET_USED;\n    }\n\n    return rc;\n}\n\n/**\n * @brief Get available authentication methods from the server.\n *\n * This requires the function ssh_userauth_none() to be called before the\n * methods are available. The server MAY return a list of methods that may\n * continue.\n *\n * @param[in] session   The SSH session.\n *\n * @param[in] username  Deprecated, set to NULL.\n *\n * @returns             A bitfield of the fllowing values:\n *                      - SSH_AUTH_METHOD_PASSWORD\n *                      - SSH_AUTH_METHOD_PUBLICKEY\n *                      - SSH_AUTH_METHOD_HOSTBASED\n *                      - SSH_AUTH_METHOD_INTERACTIVE\n *\n * @warning Other reserved flags may appear in future versions.\n * @see ssh_userauth_none()\n */\nint ssh_userauth_list(ssh_session session, const char *username)\n{\n    (void) username; /* unused */\n\n    if (session == NULL) {\n        return 0;\n    }\n\n    return session->auth.supported_methods;\n}\n\n/**\n * @brief Try to authenticate through the \"none\" method.\n *\n * @param[in] session   The ssh session to use.\n *\n * @param[in] username    The username, this SHOULD be NULL.\n *\n * @returns SSH_AUTH_ERROR:   A serious error happened.\\n\n *          SSH_AUTH_DENIED:  Authentication failed: use another method\\n\n *          SSH_AUTH_PARTIAL: You've been partially authenticated, you still\n *                            have to use another method\\n\n *          SSH_AUTH_SUCCESS: Authentication success\\n\n *          SSH_AUTH_AGAIN:   In nonblocking mode, you've got to call this again\n *                            later.\n *\n * @note Most server implementations do not permit changing the username during\n * authentication. The username should only be set with ssh_options_set() only\n * before you connect to the server.\n */\nint ssh_userauth_none(ssh_session session, const char *username) {\n    int rc;\n\n    switch(session->pending_call_state) {\n        case SSH_PENDING_CALL_NONE:\n            break;\n        case SSH_PENDING_CALL_AUTH_NONE:\n            goto pending;\n        default:\n            ssh_set_error(session, SSH_FATAL,\n                          \"Wrong state (%d) during pending SSH call\",\n                          session->pending_call_state);\n            return SSH_AUTH_ERROR;\n    }\n\n    rc = ssh_userauth_request_service(session);\n    if (rc == SSH_AGAIN) {\n        return SSH_AUTH_AGAIN;\n    } else if (rc == SSH_ERROR) {\n        return SSH_AUTH_ERROR;\n    }\n\n    /* request */\n    rc = ssh_buffer_pack(session->out_buffer, \"bsss\",\n            SSH2_MSG_USERAUTH_REQUEST,\n            username ? username : session->opts.username,\n            \"ssh-connection\",\n            \"none\"\n            );\n    if (rc < 0) {\n        goto fail;\n    }\n\n    session->auth.current_method = SSH_AUTH_METHOD_NONE;\n    session->auth.state = SSH_AUTH_STATE_AUTH_NONE_SENT;\n    session->pending_call_state = SSH_PENDING_CALL_AUTH_NONE;\n    rc = ssh_packet_send(session);\n    if (rc == SSH_ERROR) {\n        return SSH_AUTH_ERROR;\n    }\n\npending:\n    rc = ssh_userauth_get_response(session);\n    if (rc != SSH_AUTH_AGAIN) {\n        session->pending_call_state = SSH_PENDING_CALL_NONE;\n    }\n\n    return rc;\nfail:\n    ssh_set_error_oom(session);\n    ssh_buffer_reinit(session->out_buffer);\n\n    return SSH_AUTH_ERROR;\n}\n\n/**\n * @brief Try to authenticate with the given public key.\n *\n * To avoid unnecessary processing and user interaction, the following method\n * is provided for querying whether authentication using the 'pubkey' would\n * be possible.\n *\n * @param[in] session     The SSH session.\n *\n * @param[in] username    The username, this SHOULD be NULL.\n *\n * @param[in] pubkey      The public key to try.\n *\n * @return  SSH_AUTH_ERROR:   A serious error happened.\\n\n *          SSH_AUTH_DENIED:  The server doesn't accept that public key as an\n *                            authentication token. Try another key or another\n *                            method.\\n\n *          SSH_AUTH_PARTIAL: You've been partially authenticated, you still\n *                            have to use another method.\\n\n *          SSH_AUTH_SUCCESS: The public key is accepted, you want now to use\n *                            ssh_userauth_publickey().\\n\n *          SSH_AUTH_AGAIN:   In nonblocking mode, you've got to call this again\n *                            later.\n *\n * @note Most server implementations do not permit changing the username during\n * authentication. The username should only be set with ssh_options_set() only\n * before you connect to the server.\n */\nint ssh_userauth_try_publickey(ssh_session session,\n                               const char *username,\n                               const ssh_key pubkey)\n{\n    ssh_string pubkey_s = NULL;\n    const char *sig_type_c = NULL;\n    int rc;\n\n    if (session == NULL) {\n        return SSH_AUTH_ERROR;\n    }\n\n    if (pubkey == NULL || !ssh_key_is_public(pubkey)) {\n        ssh_set_error(session, SSH_FATAL, \"Invalid pubkey\");\n        return SSH_AUTH_ERROR;\n    }\n\n    switch(session->pending_call_state) {\n        case SSH_PENDING_CALL_NONE:\n            break;\n        case SSH_PENDING_CALL_AUTH_OFFER_PUBKEY:\n            goto pending;\n        default:\n            ssh_set_error(session,\n                          SSH_FATAL,\n                          \"Wrong state (%d) during pending SSH call\",\n                          session->pending_call_state);\n            return SSH_ERROR;\n    }\n\n    /* Check if the given public key algorithm is allowed */\n    sig_type_c = ssh_key_get_signature_algorithm(session, pubkey->type);\n    if (sig_type_c == NULL) {\n        ssh_set_error(session, SSH_REQUEST_DENIED,\n                      \"Invalid key type (unknown)\");\n        return SSH_AUTH_DENIED;\n    }\n    if (!ssh_key_algorithm_allowed(session, sig_type_c)) {\n        ssh_set_error(session, SSH_REQUEST_DENIED,\n                      \"The key algorithm '%s' is not allowed to be used by\"\n                      \" PUBLICKEY_ACCEPTED_TYPES configuration option\",\n                      sig_type_c);\n        return SSH_AUTH_DENIED;\n    }\n\n    rc = ssh_userauth_request_service(session);\n    if (rc == SSH_AGAIN) {\n        return SSH_AUTH_AGAIN;\n    } else if (rc == SSH_ERROR) {\n        return SSH_AUTH_ERROR;\n    }\n\n    /* public key */\n    rc = ssh_pki_export_pubkey_blob(pubkey, &pubkey_s);\n    if (rc < 0) {\n        goto fail;\n    }\n\n    /* request */\n    rc = ssh_buffer_pack(session->out_buffer, \"bsssbsS\",\n            SSH2_MSG_USERAUTH_REQUEST,\n            username ? username : session->opts.username,\n            \"ssh-connection\",\n            \"publickey\",\n            0, /* private key ? */\n            sig_type_c, /* algo */\n            pubkey_s /* public key */\n            );\n    if (rc < 0) {\n        goto fail;\n    }\n\n    SSH_STRING_FREE(pubkey_s);\n\n    session->auth.current_method = SSH_AUTH_METHOD_PUBLICKEY;\n    session->auth.state = SSH_AUTH_STATE_PUBKEY_OFFER_SENT;\n    session->pending_call_state = SSH_PENDING_CALL_AUTH_OFFER_PUBKEY;\n    rc = ssh_packet_send(session);\n    if (rc == SSH_ERROR) {\n        return SSH_AUTH_ERROR;\n    }\n\npending:\n    rc = ssh_userauth_get_response(session);\n    if (rc != SSH_AUTH_AGAIN) {\n        session->pending_call_state = SSH_PENDING_CALL_NONE;\n    }\n\n    return rc;\nfail:\n    SSH_STRING_FREE(pubkey_s);\n    ssh_set_error_oom(session);\n    ssh_buffer_reinit(session->out_buffer);\n\n    return SSH_AUTH_ERROR;\n}\n\n/**\n * @brief Authenticate with public/private key or certificate.\n *\n * @param[in] session     The SSH session.\n *\n * @param[in] username    The username, this SHOULD be NULL.\n *\n * @param[in] privkey     The private key for authentication.\n *\n * @return  SSH_AUTH_ERROR:   A serious error happened.\\n\n *          SSH_AUTH_DENIED:  The server doesn't accept that public key as an\n *                            authentication token. Try another key or another\n *                            method.\\n\n *          SSH_AUTH_PARTIAL: You've been partially authenticated, you still\n *                            have to use another method.\\n\n *          SSH_AUTH_SUCCESS: The public key is accepted.\\n\n *          SSH_AUTH_AGAIN:   In nonblocking mode, you've got to call this again\n *                            later.\n *\n * @note Most server implementations do not permit changing the username during\n * authentication. The username should only be set with ssh_options_set() only\n * before you connect to the server.\n */\nint ssh_userauth_publickey(ssh_session session,\n                           const char *username,\n                           const ssh_key privkey)\n{\n    ssh_string str = NULL;\n    int rc;\n    const char *sig_type_c = NULL;\n    enum ssh_keytypes_e key_type;\n    enum ssh_digest_e hash_type;\n\n    if (session == NULL) {\n        return SSH_AUTH_ERROR;\n    }\n\n    if (privkey == NULL || !ssh_key_is_private(privkey)) {\n        ssh_set_error(session, SSH_FATAL, \"Invalid private key\");\n        return SSH_AUTH_ERROR;\n    }\n\n    switch(session->pending_call_state) {\n        case SSH_PENDING_CALL_NONE:\n            break;\n        case SSH_PENDING_CALL_AUTH_PUBKEY:\n            goto pending;\n        default:\n            ssh_set_error(session,\n                          SSH_FATAL,\n                          \"Bad call during pending SSH call in ssh_userauth_try_publickey\");\n            return SSH_AUTH_ERROR;\n    }\n\n    /* Cert auth requires presenting the cert type name (*-cert@openssh.com) */\n    key_type = privkey->cert != NULL ? privkey->cert_type : privkey->type;\n\n    /* Check if the given public key algorithm is allowed */\n    sig_type_c = ssh_key_get_signature_algorithm(session, key_type);\n    if (sig_type_c == NULL) {\n        ssh_set_error(session, SSH_REQUEST_DENIED,\n                      \"Invalid key type (unknown)\");\n        return SSH_AUTH_DENIED;\n    }\n    if (!ssh_key_algorithm_allowed(session, sig_type_c)) {\n        ssh_set_error(session, SSH_REQUEST_DENIED,\n                      \"The key algorithm '%s' is not allowed to be used by\"\n                      \" PUBLICKEY_ACCEPTED_TYPES configuration option\",\n                      sig_type_c);\n        return SSH_AUTH_DENIED;\n    }\n\n    rc = ssh_userauth_request_service(session);\n    if (rc == SSH_AGAIN) {\n        return SSH_AUTH_AGAIN;\n    } else if (rc == SSH_ERROR) {\n        return SSH_AUTH_ERROR;\n    }\n\n    /* get public key or cert */\n    rc = ssh_pki_export_pubkey_blob(privkey, &str);\n    if (rc < 0) {\n        goto fail;\n    }\n\n    /* request */\n    rc = ssh_buffer_pack(session->out_buffer, \"bsssbsS\",\n            SSH2_MSG_USERAUTH_REQUEST,\n            username ? username : session->opts.username,\n            \"ssh-connection\",\n            \"publickey\",\n            1, /* private key */\n            sig_type_c, /* algo */\n            str /* public key or cert */\n            );\n    if (rc < 0) {\n        goto fail;\n    }\n    SSH_STRING_FREE(str);\n\n    /* Get the hash type to be used in the signature based on the key type */\n    hash_type = ssh_key_type_to_hash(session, privkey->type);\n\n    /* sign the buffer with the private key */\n    str = ssh_pki_do_sign(session, session->out_buffer, privkey, hash_type);\n    if (str == NULL) {\n        goto fail;\n    }\n\n    rc = ssh_buffer_add_ssh_string(session->out_buffer, str);\n    SSH_STRING_FREE(str);\n    str = NULL;\n    if (rc < 0) {\n        goto fail;\n    }\n\n    session->auth.current_method = SSH_AUTH_METHOD_PUBLICKEY;\n    session->auth.state = SSH_AUTH_STATE_PUBKEY_AUTH_SENT;\n    session->pending_call_state = SSH_PENDING_CALL_AUTH_PUBKEY;\n    rc = ssh_packet_send(session);\n    if (rc == SSH_ERROR) {\n        return SSH_AUTH_ERROR;\n    }\n\npending:\n    rc = ssh_userauth_get_response(session);\n    if (rc != SSH_AUTH_AGAIN) {\n        session->pending_call_state = SSH_PENDING_CALL_NONE;\n    }\n\n    return rc;\nfail:\n    SSH_STRING_FREE(str);\n    ssh_set_error_oom(session);\n    ssh_buffer_reinit(session->out_buffer);\n\n    return SSH_AUTH_ERROR;\n}\n\nstatic int ssh_userauth_agent_publickey(ssh_session session,\n                                        const char *username,\n                                        ssh_key pubkey)\n{\n    ssh_string pubkey_s = NULL;\n    ssh_string sig_blob = NULL;\n    const char *sig_type_c = NULL;\n    int rc;\n\n    switch(session->pending_call_state) {\n        case SSH_PENDING_CALL_NONE:\n            break;\n        case SSH_PENDING_CALL_AUTH_AGENT:\n            goto pending;\n        default:\n            ssh_set_error(session,\n                          SSH_FATAL,\n                          \"Bad call during pending SSH call in ssh_userauth_try_publickey\");\n            return SSH_ERROR;\n    }\n\n    rc = ssh_userauth_request_service(session);\n    if (rc == SSH_AGAIN) {\n        return SSH_AUTH_AGAIN;\n    } else if (rc == SSH_ERROR) {\n        return SSH_AUTH_ERROR;\n    }\n\n    /* public key */\n    rc = ssh_pki_export_pubkey_blob(pubkey, &pubkey_s);\n    if (rc < 0) {\n        goto fail;\n    }\n\n    /* Check if the given public key algorithm is allowed */\n    sig_type_c = ssh_key_get_signature_algorithm(session, pubkey->type);\n    if (sig_type_c == NULL) {\n        ssh_set_error(session, SSH_REQUEST_DENIED,\n                      \"Invalid key type (unknown)\");\n        SSH_STRING_FREE(pubkey_s);\n        return SSH_AUTH_DENIED;\n    }\n    if (!ssh_key_algorithm_allowed(session, sig_type_c)) {\n        ssh_set_error(session, SSH_REQUEST_DENIED,\n                      \"The key algorithm '%s' is not allowed to be used by\"\n                      \" PUBLICKEY_ACCEPTED_TYPES configuration option\",\n                      sig_type_c);\n        SSH_STRING_FREE(pubkey_s);\n        return SSH_AUTH_DENIED;\n    }\n\n    /* request */\n    rc = ssh_buffer_pack(session->out_buffer, \"bsssbsS\",\n            SSH2_MSG_USERAUTH_REQUEST,\n            username ? username : session->opts.username,\n            \"ssh-connection\",\n            \"publickey\",\n            1, /* private key */\n            sig_type_c, /* algo */\n            pubkey_s /* public key */\n            );\n    SSH_STRING_FREE(pubkey_s);\n    if (rc < 0) {\n        goto fail;\n    }\n\n    /* sign the buffer with the private key */\n    sig_blob = ssh_pki_do_sign_agent(session, session->out_buffer, pubkey);\n    if (sig_blob == NULL) {\n        goto fail;\n    }\n\n    rc = ssh_buffer_add_ssh_string(session->out_buffer, sig_blob);\n    SSH_STRING_FREE(sig_blob);\n    if (rc < 0) {\n        goto fail;\n    }\n\n    session->auth.current_method = SSH_AUTH_METHOD_PUBLICKEY;\n    session->auth.state = SSH_AUTH_STATE_PUBKEY_AUTH_SENT;\n    session->pending_call_state = SSH_PENDING_CALL_AUTH_AGENT;\n    rc = ssh_packet_send(session);\n    if (rc == SSH_ERROR) {\n        return SSH_AUTH_ERROR;\n    }\n\npending:\n    rc = ssh_userauth_get_response(session);\n    if (rc != SSH_AUTH_AGAIN) {\n        session->pending_call_state = SSH_PENDING_CALL_NONE;\n    }\n\n    return rc;\nfail:\n    ssh_set_error_oom(session);\n    ssh_buffer_reinit(session->out_buffer);\n    SSH_STRING_FREE(pubkey_s);\n\n    return SSH_AUTH_ERROR;\n}\n\nenum ssh_agent_state_e {\n    SSH_AGENT_STATE_NONE = 0,\n    SSH_AGENT_STATE_PUBKEY,\n    SSH_AGENT_STATE_AUTH\n};\n\nstruct ssh_agent_state_struct {\n    enum ssh_agent_state_e state;\n    ssh_key pubkey;\n    char *comment;\n};\n\n/* Internal function */\nvoid ssh_agent_state_free(void *data) {\n    struct ssh_agent_state_struct *state = data;\n\n    if (state) {\n        SSH_STRING_FREE_CHAR(state->comment);\n        ssh_key_free(state->pubkey);\n        free (state);\n    }\n}\n\n/**\n * @brief Try to do public key authentication with ssh agent.\n *\n * @param[in]  session  The ssh session to use.\n *\n * @param[in]  username The username, this SHOULD be NULL.\n *\n * @return  SSH_AUTH_ERROR:   A serious error happened.\\n\n *          SSH_AUTH_DENIED:  The server doesn't accept that public key as an\n *                            authentication token. Try another key or another\n *                            method.\\n\n *          SSH_AUTH_PARTIAL: You've been partially authenticated, you still\n *                            have to use another method.\\n\n *          SSH_AUTH_SUCCESS: The public key is accepted, you want now to use\n *                            ssh_userauth_publickey().\\n\n *          SSH_AUTH_AGAIN:   In nonblocking mode, you've got to call this again\n *                            later.\n *\n * @note Most server implementations do not permit changing the username during\n * authentication. The username should only be set with ssh_options_set() only\n * before you connect to the server.\n */\nint ssh_userauth_agent(ssh_session session,\n                       const char *username) {\n    int rc = SSH_AUTH_ERROR;\n    struct ssh_agent_state_struct *state;\n\n    if (session == NULL) {\n        return SSH_AUTH_ERROR;\n    }\n\n    if (!ssh_agent_is_running(session)) {\n        return SSH_AUTH_DENIED;\n    }\n\n    if (!session->agent_state) {\n        session->agent_state = malloc(sizeof(struct ssh_agent_state_struct));\n        if (!session->agent_state) {\n            ssh_set_error_oom(session);\n            return SSH_AUTH_ERROR;\n        }\n        ZERO_STRUCTP(session->agent_state);\n        session->agent_state->state=SSH_AGENT_STATE_NONE;\n    }\n\n    state = session->agent_state;\n    if (state->pubkey == NULL) {\n        state->pubkey = ssh_agent_get_first_ident(session, &state->comment);\n    }\n\n    if (state->pubkey == NULL) {\n        return SSH_AUTH_DENIED;\n    }\n\n    while (state->pubkey != NULL) {\n        if (state->state == SSH_AGENT_STATE_NONE) {\n            SSH_LOG(SSH_LOG_DEBUG,\n                    \"Trying identity %s\", state->comment);\n        }\n        if (state->state == SSH_AGENT_STATE_NONE ||\n                state->state == SSH_AGENT_STATE_PUBKEY) {\n            rc = ssh_userauth_try_publickey(session, username, state->pubkey);\n            if (rc == SSH_AUTH_ERROR) {\n                ssh_agent_state_free (state);\n                session->agent_state = NULL;\n                return rc;\n            } else if (rc == SSH_AUTH_AGAIN) {\n                state->state = SSH_AGENT_STATE_PUBKEY;\n                return rc;\n            } else if (rc != SSH_AUTH_SUCCESS) {\n                SSH_LOG(SSH_LOG_DEBUG,\n                        \"Public key of %s refused by server\", state->comment);\n                SSH_STRING_FREE_CHAR(state->comment);\n                state->comment = NULL;\n                ssh_key_free(state->pubkey);\n                state->pubkey = ssh_agent_get_next_ident(session, &state->comment);\n                state->state = SSH_AGENT_STATE_NONE;\n                continue;\n            }\n\n            SSH_LOG(SSH_LOG_DEBUG,\n                    \"Public key of %s accepted by server\", state->comment);\n            state->state = SSH_AGENT_STATE_AUTH;\n        }\n        if (state->state == SSH_AGENT_STATE_AUTH) {\n            rc = ssh_userauth_agent_publickey(session, username, state->pubkey);\n            if (rc == SSH_AUTH_AGAIN)\n                return rc;\n            SSH_STRING_FREE_CHAR(state->comment);\n            state->comment = NULL;\n            if (rc == SSH_AUTH_ERROR || rc == SSH_AUTH_PARTIAL) {\n                ssh_agent_state_free (session->agent_state);\n                session->agent_state = NULL;\n                return rc;\n            } else if (rc != SSH_AUTH_SUCCESS) {\n                SSH_LOG(SSH_LOG_INFO,\n                        \"Server accepted public key but refused the signature\");\n                ssh_key_free(state->pubkey);\n                state->pubkey = ssh_agent_get_next_ident(session, &state->comment);\n                state->state = SSH_AGENT_STATE_NONE;\n                continue;\n            }\n            ssh_agent_state_free (session->agent_state);\n            session->agent_state = NULL;\n            return SSH_AUTH_SUCCESS;\n        }\n    }\n\n    ssh_agent_state_free (session->agent_state);\n    session->agent_state = NULL;\n    return rc;\n}\n\nenum ssh_auth_auto_state_e {\n    SSH_AUTH_AUTO_STATE_NONE = 0,\n    SSH_AUTH_AUTO_STATE_PUBKEY,\n    SSH_AUTH_AUTO_STATE_KEY_IMPORTED,\n    SSH_AUTH_AUTO_STATE_PUBKEY_ACCEPTED\n};\n\nstruct ssh_auth_auto_state_struct {\n    enum ssh_auth_auto_state_e state;\n    struct ssh_iterator *it;\n    ssh_key privkey;\n    ssh_key pubkey;\n};\n\n/**\n * @brief Tries to automatically authenticate with public key and \"none\"\n *\n * It may fail, for instance it doesn't ask for a password and uses a default\n * asker for passphrases (in case the private key is encrypted).\n *\n * @param[in]  session     The SSH session.\n *\n * @param[in]  username    The username, this SHOULD be NULL.\n *\n * @param[in]  passphrase  Use this passphrase to unlock the privatekey. Use NULL\n *                         if you don't want to use a passphrase or the user\n *                         should be asked.\n *\n * @return  SSH_AUTH_ERROR:   A serious error happened.\\n\n *          SSH_AUTH_DENIED:  The server doesn't accept that public key as an\n *                            authentication token. Try another key or another\n *                            method.\\n\n *          SSH_AUTH_PARTIAL: You've been partially authenticated, you still\n *                            have to use another method.\\n\n *          SSH_AUTH_SUCCESS: The public key is accepted, you want now to use\n *                            ssh_userauth_publickey().\\n\n *          SSH_AUTH_AGAIN:   In nonblocking mode, you've got to call this again\n *                            later.\n *\n * @note Most server implementations do not permit changing the username during\n * authentication. The username should only be set with ssh_options_set() only\n * before you connect to the server.\n */\nint ssh_userauth_publickey_auto(ssh_session session,\n                                const char *username,\n                                const char *passphrase)\n{\n    ssh_auth_callback auth_fn = NULL;\n    void *auth_data = NULL;\n    struct ssh_auth_auto_state_struct *state;\n    int rc;\n\n    if (session == NULL) {\n        return SSH_AUTH_ERROR;\n    }\n    if (! (session->opts.flags & SSH_OPT_FLAG_PUBKEY_AUTH)) {\n        session->auth.supported_methods &= ~SSH_AUTH_METHOD_PUBLICKEY;\n        return SSH_AUTH_DENIED;\n    }\n    if (session->common.callbacks) {\n        auth_fn = session->common.callbacks->auth_function;\n        auth_data = session->common.callbacks->userdata;\n    }\n    if (!session->auth.auto_state) {\n        session->auth.auto_state =\n                calloc(1, sizeof(struct ssh_auth_auto_state_struct));\n        if (!session->auth.auto_state) {\n            ssh_set_error_oom(session);\n            return SSH_AUTH_ERROR;\n        }\n\n        /* Set state explicitly */\n        session->auth.auto_state->state = SSH_AUTH_AUTO_STATE_NONE;\n    }\n    state = session->auth.auto_state;\n    if (state->state == SSH_AUTH_AUTO_STATE_NONE) {\n        /* Try authentication with ssh-agent first */\n        rc = ssh_userauth_agent(session, username);\n        if (rc == SSH_AUTH_SUCCESS ||\n            rc == SSH_AUTH_PARTIAL ||\n            rc == SSH_AUTH_AGAIN ) {\n            return rc;\n        }\n        state->state = SSH_AUTH_AUTO_STATE_PUBKEY;\n    }\n    if (state->it == NULL) {\n        state->it = ssh_list_get_iterator(session->opts.identity);\n    }\n\n    while (state->it != NULL) {\n        const char *privkey_file = state->it->data;\n        char pubkey_file[1024] = {0};\n        if (state->state == SSH_AUTH_AUTO_STATE_PUBKEY) {\n            SSH_LOG(SSH_LOG_DEBUG,\n                    \"Trying to authenticate with %s\", privkey_file);\n            state->privkey = NULL;\n            state->pubkey = NULL;\n            snprintf(pubkey_file, sizeof(pubkey_file), \"%s.pub\", privkey_file);\n\n            rc = ssh_pki_import_pubkey_file(pubkey_file, &state->pubkey);\n            if (rc == SSH_ERROR) {\n                ssh_set_error(session,\n                        SSH_FATAL,\n                        \"Failed to import public key: %s\",\n                        pubkey_file);\n                SAFE_FREE(session->auth.auto_state);\n                return SSH_AUTH_ERROR;\n            } else if (rc == SSH_EOF) {\n                /* Read the private key and save the public key to file */\n                rc = ssh_pki_import_privkey_file(privkey_file,\n                        passphrase,\n                        auth_fn,\n                        auth_data,\n                        &state->privkey);\n                if (rc == SSH_ERROR) {\n                    ssh_set_error(session,\n                            SSH_FATAL,\n                            \"Failed to read private key: %s\",\n                            privkey_file);\n                    state->it=state->it->next;\n                    continue;\n                } else if (rc == SSH_EOF) {\n                    /* If the file doesn't exist, continue */\n                    SSH_LOG(SSH_LOG_DEBUG,\n                            \"Private key %s doesn't exist.\",\n                            privkey_file);\n                    state->it=state->it->next;\n                    continue;\n                }\n\n                rc = ssh_pki_export_privkey_to_pubkey(state->privkey, &state->pubkey);\n                if (rc == SSH_ERROR) {\n                    ssh_key_free(state->privkey);\n                    SAFE_FREE(session->auth.auto_state);\n                    return SSH_AUTH_ERROR;\n                }\n\n                rc = ssh_pki_export_pubkey_file(state->pubkey, pubkey_file);\n                if (rc == SSH_ERROR) {\n                    SSH_LOG(SSH_LOG_WARN,\n                            \"Could not write public key to file: %s\",\n                            pubkey_file);\n                }\n            }\n            state->state = SSH_AUTH_AUTO_STATE_KEY_IMPORTED;\n        }\n        if (state->state == SSH_AUTH_AUTO_STATE_KEY_IMPORTED) {\n            rc = ssh_userauth_try_publickey(session, username, state->pubkey);\n            if (rc == SSH_AUTH_ERROR) {\n                SSH_LOG(SSH_LOG_WARN,\n                        \"Public key authentication error for %s\",\n                        privkey_file);\n                ssh_key_free(state->privkey);\n                state->privkey = NULL;\n                ssh_key_free(state->pubkey);\n                state->pubkey = NULL;\n                SAFE_FREE(session->auth.auto_state);\n                return rc;\n            } else if (rc == SSH_AUTH_AGAIN) {\n                return rc;\n            } else if (rc != SSH_AUTH_SUCCESS) {\n                SSH_LOG(SSH_LOG_DEBUG,\n                        \"Public key for %s refused by server\",\n                        privkey_file);\n                ssh_key_free(state->privkey);\n                state->privkey = NULL;\n                ssh_key_free(state->pubkey);\n                state->pubkey = NULL;\n                state->it=state->it->next;\n                state->state = SSH_AUTH_AUTO_STATE_PUBKEY;\n                continue;\n            }\n            state->state = SSH_AUTH_AUTO_STATE_PUBKEY_ACCEPTED;\n        }\n        if (state->state == SSH_AUTH_AUTO_STATE_PUBKEY_ACCEPTED) {\n            /* Public key has been accepted by the server */\n            if (state->privkey == NULL) {\n                rc = ssh_pki_import_privkey_file(privkey_file,\n                        passphrase,\n                        auth_fn,\n                        auth_data,\n                        &state->privkey);\n                if (rc == SSH_ERROR) {\n                    ssh_key_free(state->pubkey);\n                    state->pubkey=NULL;\n                    ssh_set_error(session,\n                            SSH_FATAL,\n                            \"Failed to read private key: %s\",\n                            privkey_file);\n                    state->it=state->it->next;\n                    state->state = SSH_AUTH_AUTO_STATE_PUBKEY;\n                    continue;\n                } else if (rc == SSH_EOF) {\n                    /* If the file doesn't exist, continue */\n                    ssh_key_free(state->pubkey);\n                    state->pubkey = NULL;\n                    SSH_LOG(SSH_LOG_INFO,\n                            \"Private key %s doesn't exist.\",\n                            privkey_file);\n                    state->it = state->it->next;\n                    state->state = SSH_AUTH_AUTO_STATE_PUBKEY;\n                    continue;\n                }\n            }\n\n            rc = ssh_userauth_publickey(session, username, state->privkey);\n            if (rc != SSH_AUTH_AGAIN && rc != SSH_AUTH_DENIED) {\n                ssh_key_free(state->privkey);\n                ssh_key_free(state->pubkey);\n                SAFE_FREE(session->auth.auto_state);\n                if (rc == SSH_AUTH_SUCCESS) {\n                    SSH_LOG(SSH_LOG_INFO,\n                            \"Successfully authenticated using %s\",\n                            privkey_file);\n                }\n                return rc;\n            }\n            if (rc == SSH_AUTH_AGAIN) {\n                return rc;\n            }\n\n            ssh_key_free(state->privkey);\n            ssh_key_free(state->pubkey);\n\n            SSH_LOG(SSH_LOG_WARN,\n                    \"The server accepted the public key but refused the signature\");\n            state->it = state->it->next;\n            state->state = SSH_AUTH_AUTO_STATE_PUBKEY;\n            /* continue */\n        }\n    }\n    SSH_LOG(SSH_LOG_INFO,\n            \"Tried every public key, none matched\");\n    SAFE_FREE(session->auth.auto_state);\n    return SSH_AUTH_DENIED;\n}\n\n/**\n * @brief Try to authenticate by password.\n *\n * This authentication method is normally disabled on SSHv2 server. You should\n * use keyboard-interactive mode.\n *\n * The 'password' value MUST be encoded UTF-8.  It is up to the server how to\n * interpret the password and validate it against the password database.\n * However, if you read the password in some other encoding, you MUST convert\n * the password to UTF-8.\n *\n * @param[in] session   The ssh session to use.\n *\n * @param[in] username  The username, this SHOULD be NULL.\n *\n * @param[in] password  The password to authenticate in UTF-8.\n *\n * @returns SSH_AUTH_ERROR:   A serious error happened.\\n\n *          SSH_AUTH_DENIED:  Authentication failed: use another method\\n\n *          SSH_AUTH_PARTIAL: You've been partially authenticated, you still\n *                            have to use another method\\n\n *          SSH_AUTH_SUCCESS: Authentication success\\n\n *          SSH_AUTH_AGAIN:   In nonblocking mode, you've got to call this again\n *                            later.\n *\n * @note Most server implementations do not permit changing the username during\n * authentication. The username should only be set with ssh_options_set() only\n * before you connect to the server.\n *\n * @see ssh_userauth_none()\n * @see ssh_userauth_kbdint()\n */\nint ssh_userauth_password(ssh_session session,\n                          const char *username,\n                          const char *password) {\n    int rc;\n\n    switch(session->pending_call_state) {\n        case SSH_PENDING_CALL_NONE:\n            break;\n        case SSH_PENDING_CALL_AUTH_PASSWORD:\n            goto pending;\n        default:\n            ssh_set_error(session,\n                          SSH_FATAL,\n                          \"Wrong state (%d) during pending SSH call\",\n                          session->pending_call_state);\n            return SSH_ERROR;\n    }\n\n    rc = ssh_userauth_request_service(session);\n    if (rc == SSH_AGAIN) {\n        return SSH_AUTH_AGAIN;\n    } else if (rc == SSH_ERROR) {\n        return SSH_AUTH_ERROR;\n    }\n\n    /* request */\n    rc = ssh_buffer_pack(session->out_buffer, \"bsssbs\",\n            SSH2_MSG_USERAUTH_REQUEST,\n            username ? username : session->opts.username,\n            \"ssh-connection\",\n            \"password\",\n            0, /* false */\n            password\n    );\n    if (rc < 0) {\n        goto fail;\n    }\n\n    /* Set the buffer as secure to be explicitly zeroed when freed */\n    ssh_buffer_set_secure(session->out_buffer);\n\n    session->auth.current_method = SSH_AUTH_METHOD_PASSWORD;\n    session->auth.state = SSH_AUTH_STATE_PASSWORD_AUTH_SENT;\n    session->pending_call_state = SSH_PENDING_CALL_AUTH_PASSWORD;\n    rc = ssh_packet_send(session);\n    if (rc == SSH_ERROR) {\n        return SSH_AUTH_ERROR;\n    }\n\npending:\n    rc = ssh_userauth_get_response(session);\n    if (rc != SSH_AUTH_AGAIN) {\n        session->pending_call_state = SSH_PENDING_CALL_NONE;\n    }\n\n    return rc;\nfail:\n    ssh_set_error_oom(session);\n    ssh_buffer_reinit(session->out_buffer);\n\n    return SSH_AUTH_ERROR;\n}\n\n/* LEGACY */\nint ssh_userauth_agent_pubkey(ssh_session session,\n                              const char *username,\n                              ssh_public_key publickey)\n{\n    ssh_key key;\n    int rc;\n\n    key = ssh_key_new();\n    if (key == NULL) {\n        return SSH_AUTH_ERROR;\n    }\n\n    key->type = publickey->type;\n    key->type_c = ssh_key_type_to_char(key->type);\n    key->flags = SSH_KEY_FLAG_PUBLIC;\n    key->dsa = publickey->dsa_pub;\n    key->rsa = publickey->rsa_pub;\n\n    rc = ssh_userauth_agent_publickey(session, username, key);\n\n    key->dsa = NULL;\n    key->rsa = NULL;\n    ssh_key_free(key);\n\n    return rc;\n}\n\nssh_kbdint ssh_kbdint_new(void) {\n    ssh_kbdint kbd;\n\n    kbd = calloc(1, sizeof(struct ssh_kbdint_struct));\n    if (kbd == NULL) {\n        return NULL;\n    }\n\n    return kbd;\n}\n\n\nvoid ssh_kbdint_free(ssh_kbdint kbd) {\n    size_t i, n;\n\n    if (kbd == NULL) {\n        return;\n    }\n\n    SAFE_FREE(kbd->name);\n    SAFE_FREE(kbd->instruction);\n    SAFE_FREE(kbd->echo);\n\n    n = kbd->nprompts;\n    if (kbd->prompts) {\n        for (i = 0; i < n; i++) {\n            if (kbd->prompts[i] != NULL) {\n                explicit_bzero(kbd->prompts[i], strlen(kbd->prompts[i]));\n            }\n            SAFE_FREE(kbd->prompts[i]);\n        }\n        SAFE_FREE(kbd->prompts);\n    }\n\n    n = kbd->nanswers;\n    if (kbd->answers) {\n        for (i = 0; i < n; i++) {\n            if (kbd->answers[i] != NULL) {\n                explicit_bzero(kbd->answers[i], strlen(kbd->answers[i]));\n            }\n            SAFE_FREE(kbd->answers[i]);\n        }\n        SAFE_FREE(kbd->answers);\n    }\n\n    SAFE_FREE(kbd);\n}\n\nvoid ssh_kbdint_clean(ssh_kbdint kbd) {\n    size_t i, n;\n\n    if (kbd == NULL) {\n        return;\n    }\n\n    SAFE_FREE(kbd->name);\n    SAFE_FREE(kbd->instruction);\n    SAFE_FREE(kbd->echo);\n\n    n = kbd->nprompts;\n    if (kbd->prompts) {\n        for (i = 0; i < n; i++) {\n            explicit_bzero(kbd->prompts[i], strlen(kbd->prompts[i]));\n            SAFE_FREE(kbd->prompts[i]);\n        }\n        SAFE_FREE(kbd->prompts);\n    }\n\n    n = kbd->nanswers;\n\n    if (kbd->answers) {\n        for (i = 0; i < n; i++) {\n            explicit_bzero(kbd->answers[i], strlen(kbd->answers[i]));\n            SAFE_FREE(kbd->answers[i]);\n        }\n        SAFE_FREE(kbd->answers);\n    }\n\n    kbd->nprompts = 0;\n    kbd->nanswers = 0;\n}\n\n/*\n * This function sends the first packet as explained in RFC 3066 section 3.1.\n */\nstatic int ssh_userauth_kbdint_init(ssh_session session,\n                                    const char *username,\n                                    const char *submethods)\n{\n    int rc;\n\n    if (session->pending_call_state == SSH_PENDING_CALL_AUTH_KBDINT_INIT) {\n        goto pending;\n    }\n    if (session->pending_call_state != SSH_PENDING_CALL_NONE) {\n        ssh_set_error_invalid(session);\n        return SSH_ERROR;\n    }\n\n    rc = ssh_userauth_request_service(session);\n    if (rc == SSH_AGAIN) {\n        return SSH_AUTH_AGAIN;\n    }\n    if (rc != SSH_OK) {\n        return SSH_AUTH_ERROR;\n    }\n\n    /* request */\n    rc = ssh_buffer_pack(session->out_buffer, \"bsssss\",\n            SSH2_MSG_USERAUTH_REQUEST,\n            username ? username : session->opts.username,\n            \"ssh-connection\",\n            \"keyboard-interactive\",\n            \"\", /* lang (ignore it) */\n            submethods ? submethods : \"\"\n    );\n    if (rc < 0) {\n        goto fail;\n    }\n\n\n    session->auth.state = SSH_AUTH_STATE_KBDINT_SENT;\n    session->pending_call_state = SSH_PENDING_CALL_AUTH_KBDINT_INIT;\n\n    SSH_LOG(SSH_LOG_DEBUG,\n            \"Sending keyboard-interactive init request\");\n\n    rc = ssh_packet_send(session);\n    if (rc == SSH_ERROR) {\n        return SSH_AUTH_ERROR;\n    }\npending:\n    rc = ssh_userauth_get_response(session);\n    if (rc != SSH_AUTH_AGAIN)\n        session->pending_call_state = SSH_PENDING_CALL_NONE;\n    return rc;\nfail:\n    ssh_set_error_oom(session);\n    ssh_buffer_reinit(session->out_buffer);\n\n    return SSH_AUTH_ERROR;\n}\n\n/**\n * @internal\n *\n * @brief Send the current challenge response and wait for a reply from the\n *        server.\n *\n * @returns SSH_AUTH_INFO if more info is needed\n * @returns SSH_AUTH_SUCCESS\n * @returns SSH_AUTH_FAILURE\n * @returns SSH_AUTH_PARTIAL\n */\nstatic int ssh_userauth_kbdint_send(ssh_session session)\n{\n    uint32_t i;\n    int rc;\n    if (session->pending_call_state == SSH_PENDING_CALL_AUTH_KBDINT_SEND)\n        goto pending;\n    if (session->pending_call_state != SSH_PENDING_CALL_NONE) {\n        ssh_set_error_invalid(session);\n        return SSH_ERROR;\n    }\n    rc = ssh_buffer_pack(session->out_buffer, \"bd\",\n            SSH2_MSG_USERAUTH_INFO_RESPONSE,\n            session->kbdint->nprompts);\n    if (rc < 0) {\n        goto fail;\n    }\n\n    for (i = 0; i < session->kbdint->nprompts; i++) {\n        rc = ssh_buffer_pack(session->out_buffer, \"s\",\n                session->kbdint->answers && session->kbdint->answers[i] ?\n                        session->kbdint->answers[i]:\"\");\n        if (rc < 0) {\n            goto fail;\n        }\n    }\n\n    session->auth.current_method = SSH_AUTH_METHOD_INTERACTIVE;\n    session->auth.state = SSH_AUTH_STATE_KBDINT_SENT;\n    session->pending_call_state = SSH_PENDING_CALL_AUTH_KBDINT_SEND;\n    ssh_kbdint_free(session->kbdint);\n    session->kbdint = NULL;\n\n    SSH_LOG(SSH_LOG_DEBUG,\n            \"Sending keyboard-interactive response packet\");\n\n    rc = ssh_packet_send(session);\n    if (rc == SSH_ERROR) {\n        return SSH_AUTH_ERROR;\n    }\npending:\n    rc = ssh_userauth_get_response(session);\n    if (rc != SSH_AUTH_AGAIN)\n        session->pending_call_state = SSH_PENDING_CALL_NONE;\n    return rc;\nfail:\n    ssh_set_error_oom(session);\n    ssh_buffer_reinit(session->out_buffer);\n\n    return SSH_AUTH_ERROR;\n}\n\n/**\n * @internal\n * @brief handles a SSH_USERAUTH_INFO_REQUEST packet, as used in\n *        keyboard-interactive authentication, and changes the\n *        authentication state.\n */\nSSH_PACKET_CALLBACK(ssh_packet_userauth_info_request) {\n    ssh_string tmp = NULL;\n    uint32_t nprompts;\n    uint32_t i;\n    int rc;\n    (void)user;\n    (void)type;\n\n\n    if (session->kbdint == NULL) {\n        session->kbdint = ssh_kbdint_new();\n        if (session->kbdint == NULL) {\n            ssh_set_error_oom(session);\n            return SSH_PACKET_USED;\n        }\n    } else {\n        ssh_kbdint_clean(session->kbdint);\n    }\n\n    rc = ssh_buffer_unpack(packet, \"ssSd\",\n            &session->kbdint->name, /* name of the \"asking\" window shown to client */\n            &session->kbdint->instruction,\n            &tmp, /* to ignore */\n            &nprompts\n            );\n\n    /* We don't care about tmp */\n    SSH_STRING_FREE(tmp);\n\n    if (rc != SSH_OK) {\n        ssh_set_error(session, SSH_FATAL, \"Invalid USERAUTH_INFO_REQUEST msg\");\n        ssh_kbdint_free(session->kbdint);\n        session->kbdint = NULL;\n        return SSH_PACKET_USED;\n    }\n\n    SSH_LOG(SSH_LOG_DEBUG,\n            \"%d keyboard-interactive prompts\", nprompts);\n    if (nprompts > KBDINT_MAX_PROMPT) {\n        ssh_set_error(session, SSH_FATAL,\n                \"Too much prompts requested by the server: %u (0x%.4x)\",\n                nprompts, nprompts);\n        ssh_kbdint_free(session->kbdint);\n        session->kbdint = NULL;\n\n        return SSH_PACKET_USED;\n    }\n\n    session->kbdint->nprompts = nprompts;\n    session->kbdint->nanswers = nprompts;\n    session->kbdint->prompts = calloc(nprompts, sizeof(char *));\n    if (session->kbdint->prompts == NULL) {\n        session->kbdint->nprompts = 0;\n        ssh_set_error_oom(session);\n        ssh_kbdint_free(session->kbdint);\n        session->kbdint = NULL;\n\n        return SSH_PACKET_USED;\n    }\n\n    session->kbdint->echo = calloc(nprompts, sizeof(unsigned char));\n    if (session->kbdint->echo == NULL) {\n        session->kbdint->nprompts = 0;\n        ssh_set_error_oom(session);\n        ssh_kbdint_free(session->kbdint);\n        session->kbdint = NULL;\n\n        return SSH_PACKET_USED;\n    }\n\n    for (i = 0; i < nprompts; i++) {\n        rc = ssh_buffer_unpack(packet, \"sb\",\n                &session->kbdint->prompts[i],\n                &session->kbdint->echo[i]);\n        if (rc == SSH_ERROR) {\n            ssh_set_error(session, SSH_FATAL, \"Short INFO_REQUEST packet\");\n            ssh_kbdint_free(session->kbdint);\n            session->kbdint = NULL;\n\n            return SSH_PACKET_USED;\n        }\n    }\n    session->auth.state=SSH_AUTH_STATE_INFO;\n\n    return SSH_PACKET_USED;\n}\n\n/**\n * @brief Try to authenticate through the \"keyboard-interactive\" method.\n *\n * @param[in]  session  The ssh session to use.\n *\n * @param[in]  user     The username to authenticate. You can specify NULL if\n *                      ssh_option_set_username() has been used. You cannot try\n *                      two different logins in a row.\n *\n * @param[in]  submethods Undocumented. Set it to NULL.\n *\n * @returns SSH_AUTH_ERROR:   A serious error happened\\n\n *          SSH_AUTH_DENIED:  Authentication failed : use another method\\n\n *          SSH_AUTH_PARTIAL: You've been partially authenticated, you still\n *                            have to use another method\\n\n *          SSH_AUTH_SUCCESS: Authentication success\\n\n *          SSH_AUTH_INFO:    The server asked some questions. Use\n *                            ssh_userauth_kbdint_getnprompts() and such.\\n\n *          SSH_AUTH_AGAIN:   In nonblocking mode, you've got to call this again\n *                            later.\n *\n * @see ssh_userauth_kbdint_getnprompts()\n * @see ssh_userauth_kbdint_getname()\n * @see ssh_userauth_kbdint_getinstruction()\n * @see ssh_userauth_kbdint_getprompt()\n * @see ssh_userauth_kbdint_setanswer()\n */\nint ssh_userauth_kbdint(ssh_session session, const char *user,\n    const char *submethods) {\n    int rc = SSH_AUTH_ERROR;\n\n    if (session == NULL) {\n        return SSH_AUTH_ERROR;\n    }\n\n    if ((session->pending_call_state == SSH_PENDING_CALL_NONE && session->kbdint == NULL) ||\n            session->pending_call_state == SSH_PENDING_CALL_AUTH_KBDINT_INIT)\n        rc = ssh_userauth_kbdint_init(session, user, submethods);\n    else if (session->pending_call_state == SSH_PENDING_CALL_AUTH_KBDINT_SEND ||\n            session->kbdint != NULL) {\n        /*\n         * If we are at this point, it is because session->kbdint exists.\n         * It means the user has set some information there we need to send\n         * the server and then we need to ack the status (new questions or ok\n         * pass in).\n         * It is possible that session->kbdint is NULL while we're waiting for\n         * a reply, hence the test for the pending call.\n         */\n        rc = ssh_userauth_kbdint_send(session);\n    } else {\n        /* We are here because session->kbdint == NULL & state != NONE.\n         * This should not happen\n         */\n        rc = SSH_AUTH_ERROR;\n        ssh_set_error(session, SSH_FATAL, \"Invalid state in %s\", __func__);\n    }\n    return rc;\n}\n\n/**\n * @brief Get the number of prompts (questions) the server has given.\n *\n * Once you have called ssh_userauth_kbdint() and received SSH_AUTH_INFO return\n * code, this function can be used to retrieve information about the keyboard\n * interactive authentication questions sent by the remote host.\n *\n * @param[in]  session  The ssh session to use.\n *\n * @returns             The number of prompts.\n */\nint ssh_userauth_kbdint_getnprompts(ssh_session session) {\n    if (session == NULL) {\n        return SSH_ERROR;\n    }\n    if (session->kbdint == NULL) {\n        ssh_set_error_invalid(session);\n        return SSH_ERROR;\n    }\n    return session->kbdint->nprompts;\n}\n\n/**\n * @brief Get the \"name\" of the message block.\n *\n * Once you have called ssh_userauth_kbdint() and received SSH_AUTH_INFO return\n * code, this function can be used to retrieve information about the keyboard\n * interactive authentication questions sent by the remote host.\n *\n * @param[in]  session  The ssh session to use.\n *\n * @returns             The name of the message block. Do not free it.\n */\nconst char *ssh_userauth_kbdint_getname(ssh_session session) {\n    if (session == NULL) {\n        return NULL;\n    }\n    if (session->kbdint == NULL) {\n        ssh_set_error_invalid(session);\n        return NULL;\n    }\n    return session->kbdint->name;\n}\n\n/**\n * @brief Get the \"instruction\" of the message block.\n *\n * Once you have called ssh_userauth_kbdint() and received SSH_AUTH_INFO return\n * code, this function can be used to retrieve information about the keyboard\n * interactive authentication questions sent by the remote host.\n *\n * @param[in]  session  The ssh session to use.\n *\n * @returns             The instruction of the message block.\n */\n\nconst char *ssh_userauth_kbdint_getinstruction(ssh_session session) {\n    if (session == NULL)\n        return NULL;\n    if (session->kbdint == NULL) {\n        ssh_set_error_invalid(session);\n        return NULL;\n    }\n    return session->kbdint->instruction;\n}\n\n/**\n * @brief Get a prompt from a message block.\n *\n * Once you have called ssh_userauth_kbdint() and received SSH_AUTH_INFO return\n * code, this function can be used to retrieve information about the keyboard\n * interactive authentication questions sent by the remote host.\n *\n * @param[in]  session  The ssh session to use.\n *\n * @param[in]  i        The index number of the i'th prompt.\n *\n * @param[out] echo     This is an optional variable. You can obtain a\n *                      boolean if the user input should be echoed or\n *                      hidden. For passwords it is usually hidden.\n *\n * @returns             A pointer to the prompt. Do not free it.\n *\n * @code\n *   const char prompt;\n *   char echo;\n *\n *   prompt = ssh_userauth_kbdint_getprompt(session, 0, &echo);\n *   if (echo) ...\n * @endcode\n */\nconst char *ssh_userauth_kbdint_getprompt(ssh_session session, unsigned int i,\n    char *echo) {\n    if (session == NULL)\n        return NULL;\n    if (session->kbdint == NULL) {\n        ssh_set_error_invalid(session);\n        return NULL;\n    }\n    if (i > session->kbdint->nprompts) {\n        ssh_set_error_invalid(session);\n        return NULL;\n    }\n\n    if (echo) {\n        *echo = (char)session->kbdint->echo[i];\n    }\n\n    return session->kbdint->prompts[i];\n}\n\n#ifdef WITH_SERVER\n/**\n * @brief Get the number of answers the client has given.\n *\n * @param[in]  session  The ssh session to use.\n *\n * @returns             The number of answers.\n */\nint ssh_userauth_kbdint_getnanswers(ssh_session session) {\n    if (session == NULL || session->kbdint == NULL) {\n        return SSH_ERROR;\n    }\n    return session->kbdint->nanswers;\n}\n\n/**\n * @brief Get the answer for a question from a message block.\n *\n * @param[in]  session  The ssh session to use.\n *\n * @param[in]  i index  The number of the ith answer.\n *\n * @return              0 on success, < 0 on error.\n */\nconst char *ssh_userauth_kbdint_getanswer(ssh_session session, unsigned int i) {\n    if (session == NULL || session->kbdint == NULL\n            || session->kbdint->answers == NULL) {\n        return NULL;\n    }\n    if (i >= session->kbdint->nanswers) {\n        return NULL;\n    }\n\n    return session->kbdint->answers[i];\n}\n#endif\n\n/**\n * @brief Set the answer for a question from a message block.\n *\n * If you have called ssh_userauth_kbdint() and got SSH_AUTH_INFO, this\n * function returns the questions from the server.\n *\n * @param[in]  session  The ssh session to use.\n *\n * @param[in]  i index  The number of the ith prompt.\n *\n * @param[in]  answer   The answer to give to the server. The answer MUST be\n *                      encoded UTF-8. It is up to the server how to interpret\n *                      the value and validate it. However, if you read the\n *                      answer in some other encoding, you MUST convert it to\n *                      UTF-8.\n *\n * @return              0 on success, < 0 on error.\n */\nint ssh_userauth_kbdint_setanswer(ssh_session session, unsigned int i,\n    const char *answer) {\n    if (session == NULL) {\n        return -1;\n    }\n    if (answer == NULL || session->kbdint == NULL ||\n            i >= session->kbdint->nprompts) {\n        ssh_set_error_invalid(session);\n        return -1;\n    }\n\n    if (session->kbdint->answers == NULL) {\n        session->kbdint->answers = calloc(session->kbdint->nprompts, sizeof(char *));\n        if (session->kbdint->answers == NULL) {\n            ssh_set_error_oom(session);\n            return -1;\n        }\n    }\n\n    if (session->kbdint->answers[i]) {\n        explicit_bzero(session->kbdint->answers[i],\n                strlen(session->kbdint->answers[i]));\n        SAFE_FREE(session->kbdint->answers[i]);\n    }\n\n    session->kbdint->answers[i] = strdup(answer);\n    if (session->kbdint->answers[i] == NULL) {\n        ssh_set_error_oom(session);\n        return -1;\n    }\n\n    return 0;\n}\n\n/**\n * @brief Try to authenticate through the \"gssapi-with-mic\" method.\n *\n * @param[in]  session  The ssh session to use.\n *\n * @returns SSH_AUTH_ERROR:   A serious error happened\\n\n *          SSH_AUTH_DENIED:  Authentication failed : use another method\\n\n *          SSH_AUTH_PARTIAL: You've been partially authenticated, you still\n *                            have to use another method\\n\n *          SSH_AUTH_SUCCESS: Authentication success\\n\n *          SSH_AUTH_AGAIN:   In nonblocking mode, you've got to call this again\n *                            later.\n */\nint ssh_userauth_gssapi(ssh_session session) {\n    int rc = SSH_AUTH_DENIED;\n#ifdef WITH_GSSAPI\n    switch(session->pending_call_state) {\n    case SSH_PENDING_CALL_NONE:\n        break;\n    case SSH_PENDING_CALL_AUTH_GSSAPI_MIC:\n        goto pending;\n    default:\n        ssh_set_error(session,\n                SSH_FATAL,\n                \"Wrong state (%d) during pending SSH call\",\n                session->pending_call_state);\n        return SSH_ERROR;\n    }\n\n    rc = ssh_userauth_request_service(session);\n    if (rc == SSH_AGAIN) {\n        return SSH_AUTH_AGAIN;\n    } else if (rc == SSH_ERROR) {\n        return SSH_AUTH_ERROR;\n    }\n    SSH_LOG(SSH_LOG_PROTOCOL, \"Authenticating with gssapi-with-mic\");\n\n    session->auth.current_method = SSH_AUTH_METHOD_GSSAPI_MIC;\n    session->auth.state = SSH_AUTH_STATE_NONE;\n    session->pending_call_state = SSH_PENDING_CALL_AUTH_GSSAPI_MIC;\n    rc = ssh_gssapi_auth_mic(session);\n\n    if (rc == SSH_AUTH_ERROR || rc == SSH_AUTH_DENIED) {\n        session->auth.state = SSH_AUTH_STATE_NONE;\n        session->pending_call_state = SSH_PENDING_CALL_NONE;\n        return rc;\n    }\n\npending:\n    rc = ssh_userauth_get_response(session);\n    if (rc != SSH_AUTH_AGAIN) {\n        session->pending_call_state = SSH_PENDING_CALL_NONE;\n    }\n#else\n    (void) session; /* unused */\n#endif\n    return rc;\n}\n\n/** @} */\n"
  },
  {
    "path": "src/libssh/src/base64.c",
    "content": "/*\n * base64.c - support for base64 alphabet system, described in RFC1521\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2005-2005 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n/* just the dirtiest part of code i ever made */\n#include \"config.h\"\n\n#include <stdio.h>\n\n#include \"libssh/priv.h\"\n#include \"libssh/buffer.h\"\n\nstatic\nconst uint8_t alphabet[] = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n                         \"abcdefghijklmnopqrstuvwxyz\"\n                         \"0123456789+/\";\n\n/* Transformations */\n#define SET_A(n, i) do { (n) |= ((i) & 63) <<18; } while (0)\n#define SET_B(n, i) do { (n) |= ((i) & 63) <<12; } while (0)\n#define SET_C(n, i) do { (n) |= ((i) & 63) << 6; } while (0)\n#define SET_D(n, i) do { (n) |= ((i) & 63); } while (0)\n\n#define GET_A(n) (unsigned char) (((n) & 0xff0000) >> 16)\n#define GET_B(n) (unsigned char) (((n) & 0xff00) >> 8)\n#define GET_C(n) (unsigned char) ((n) & 0xff)\n\nstatic int _base64_to_bin(unsigned char dest[3], const char *source, int num);\nstatic int get_equals(char *string);\n\n/* First part: base64 to binary */\n\n/**\n * @internal\n *\n * @brief Translates a base64 string into a binary one.\n *\n * @returns A buffer containing the decoded string, NULL if something went\n *          wrong (e.g. incorrect char).\n */\nssh_buffer base64_to_bin(const char *source) {\n  ssh_buffer buffer = NULL;\n  unsigned char block[3];\n  char *base64;\n  char *ptr;\n  size_t len;\n  int equals;\n\n  base64 = strdup(source);\n  if (base64 == NULL) {\n    return NULL;\n  }\n  ptr = base64;\n\n  /* Get the number of equals signs, which mirrors the padding */\n  equals = get_equals(ptr);\n  if (equals > 2) {\n    SAFE_FREE(base64);\n    return NULL;\n  }\n\n  buffer = ssh_buffer_new();\n  if (buffer == NULL) {\n    SAFE_FREE(base64);\n    return NULL;\n  }\n  /*\n   * The base64 buffer often contains sensitive data. Make sure we don't leak\n   * sensitive data\n   */\n  ssh_buffer_set_secure(buffer);\n\n  len = strlen(ptr);\n  while (len > 4) {\n    if (_base64_to_bin(block, ptr, 3) < 0) {\n      goto error;\n    }\n    if (ssh_buffer_add_data(buffer, block, 3) < 0) {\n      goto error;\n    }\n    len -= 4;\n    ptr += 4;\n  }\n\n  /*\n   * Depending on the number of bytes resting, there are 3 possibilities\n   * from the RFC.\n   */\n  switch (len) {\n    /*\n     * (1) The final quantum of encoding input is an integral multiple of\n     *     24 bits. Here, the final unit of encoded output will be an integral\n     *     multiple of 4 characters with no \"=\" padding\n     */\n    case 4:\n      if (equals != 0) {\n        goto error;\n      }\n      if (_base64_to_bin(block, ptr, 3) < 0) {\n        goto error;\n      }\n      if (ssh_buffer_add_data(buffer, block, 3) < 0) {\n        goto error;\n      }\n      SAFE_FREE(base64);\n\n      return buffer;\n    /*\n     * (2) The final quantum of encoding input is exactly 8 bits; here, the\n     *     final unit of encoded output will be two characters followed by\n     *     two \"=\" padding characters.\n     */\n    case 2:\n      if (equals != 2){\n        goto error;\n      }\n\n      if (_base64_to_bin(block, ptr, 1) < 0) {\n        goto error;\n      }\n      if (ssh_buffer_add_data(buffer, block, 1) < 0) {\n        goto error;\n      }\n      SAFE_FREE(base64);\n\n      return buffer;\n    /*\n     * The final quantum of encoding input is exactly 16 bits. Here, the final\n     * unit of encoded output will be three characters followed by one \"=\"\n     * padding character.\n     */\n    case 3:\n      if (equals != 1) {\n        goto error;\n      }\n      if (_base64_to_bin(block, ptr, 2) < 0) {\n        goto error;\n      }\n      if (ssh_buffer_add_data(buffer,block,2) < 0) {\n        goto error;\n      }\n      SAFE_FREE(base64);\n\n      return buffer;\n    default:\n      /* 4,3,2 are the only padding size allowed */\n      goto error;\n  }\n\nerror:\n  SAFE_FREE(base64);\n  SSH_BUFFER_FREE(buffer);\n  return NULL;\n}\n\n#define BLOCK(letter, n) do {ptr = strchr((const char *)alphabet, source[n]); \\\n                             if(!ptr) return -1; \\\n                             i = ptr - (const char *)alphabet; \\\n                             SET_##letter(*block, i); \\\n                         } while(0)\n\n/* Returns 0 if ok, -1 if not (ie invalid char into the stuff) */\nstatic int to_block4(unsigned long *block, const char *source, int num) {\n  const char *ptr = NULL;\n  unsigned int i;\n\n  *block = 0;\n  if (num < 1) {\n    return 0;\n  }\n\n  BLOCK(A, 0); /* 6 bit */\n  BLOCK(B,1); /* 12 bit */\n\n  if (num < 2) {\n    return 0;\n  }\n\n  BLOCK(C, 2); /* 18 bit */\n\n  if (num < 3) {\n    return 0;\n  }\n\n  BLOCK(D, 3); /* 24 bit */\n\n  return 0;\n}\n\n/* num = numbers of final bytes to be decoded */\nstatic int _base64_to_bin(unsigned char dest[3], const char *source, int num) {\n  unsigned long block;\n\n  if (to_block4(&block, source, num) < 0) {\n    return -1;\n  }\n  dest[0] = GET_A(block);\n  dest[1] = GET_B(block);\n  dest[2] = GET_C(block);\n\n  return 0;\n}\n\n/* Count the number of \"=\" signs and replace them by zeroes */\nstatic int get_equals(char *string) {\n  char *ptr = string;\n  int num = 0;\n\n  while ((ptr=strchr(ptr,'=')) != NULL) {\n    num++;\n    *ptr = '\\0';\n    ptr++;\n  }\n\n  return num;\n}\n\n/* thanks sysk for debugging my mess :) */\nstatic void _bin_to_base64(uint8_t *dest,\n                           const uint8_t source[3],\n                           size_t len)\n{\n#define BITS(n) ((1 << (n)) - 1)\n    switch (len) {\n        case 1:\n            dest[0] = alphabet[(source[0] >> 2)];\n            dest[1] = alphabet[((source[0] & BITS(2)) << 4)];\n            dest[2] = '=';\n            dest[3] = '=';\n            break;\n        case 2:\n            dest[0] = alphabet[source[0] >> 2];\n            dest[1] = alphabet[(source[1] >> 4) | ((source[0] & BITS(2)) << 4)];\n            dest[2] = alphabet[(source[1] & BITS(4)) << 2];\n            dest[3] = '=';\n            break;\n        case 3:\n            dest[0] = alphabet[(source[0] >> 2)];\n            dest[1] = alphabet[(source[1] >> 4) | ((source[0] & BITS(2)) << 4)];\n            dest[2] = alphabet[(source[2] >> 6) | (source[1] & BITS(4)) << 2];\n            dest[3] = alphabet[source[2] & BITS(6)];\n            break;\n    }\n#undef BITS\n}\n\n/**\n * @internal\n *\n * @brief Converts binary data to a base64 string.\n *\n * @returns the converted string\n */\nuint8_t *bin_to_base64(const uint8_t *source, size_t len)\n{\n    uint8_t *base64 = NULL;\n    uint8_t *ptr = NULL;\n    size_t flen = len + (3 - (len % 3)); /* round to upper 3 multiple */\n    flen = (4 * flen) / 3 + 1;\n\n    base64 = malloc(flen);\n    if (base64 == NULL) {\n        return NULL;\n    }\n    ptr = base64;\n\n    while(len > 0){\n        _bin_to_base64(ptr, source, len > 3 ? 3 : len);\n        ptr += 4;\n        if (len < 3) {\n            break;\n        }\n        source += 3;\n        len -= 3;\n    }\n    ptr[0] = '\\0';\n\n    return base64;\n}\n"
  },
  {
    "path": "src/libssh/src/bignum.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2014 by Aris Adamantiadis <aris@badcode.be>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <stdio.h>\n\n#include \"libssh/priv.h\"\n#include \"libssh/bignum.h\"\n#include \"libssh/string.h\"\n\nssh_string ssh_make_bignum_string(bignum num) {\n  ssh_string ptr = NULL;\n  size_t pad = 0;\n  size_t len = bignum_num_bytes(num);\n  size_t bits = bignum_num_bits(num);\n\n  if (len == 0) {\n      return NULL;\n  }\n\n  /* If the first bit is set we have a negative number */\n  if (!(bits % 8) && bignum_is_bit_set(num, bits - 1)) {\n    pad++;\n  }\n\n#ifdef DEBUG_CRYPTO\n  SSH_LOG(SSH_LOG_TRACE,\n          \"%zu bits, %zu bytes, %zu padding\\n\",\n          bits, len, pad);\n#endif /* DEBUG_CRYPTO */\n\n  ptr = ssh_string_new(len + pad);\n  if (ptr == NULL) {\n    return NULL;\n  }\n\n  /* We have a negative number so we need a leading zero */\n  if (pad) {\n    ptr->data[0] = 0;\n  }\n\n  bignum_bn2bin(num, len, ptr->data + pad);\n\n  return ptr;\n}\n\nbignum ssh_make_string_bn(ssh_string string)\n{\n    bignum bn = NULL;\n    size_t len = ssh_string_len(string);\n\n#ifdef DEBUG_CRYPTO\n    SSH_LOG(SSH_LOG_TRACE,\n            \"Importing a %zu bits, %zu bytes object ...\\n\",\n            len * 8, len);\n#endif /* DEBUG_CRYPTO */\n\n    bignum_bin2bn(string->data, len, &bn);\n\n    return bn;\n}\n\n/* prints the bignum on stderr */\nvoid ssh_print_bignum(const char *name, const_bignum num)\n{\n    unsigned char *hex = NULL;\n    if (num != NULL) {\n        bignum_bn2hex(num, &hex);\n    }\n    fprintf(stderr, \"%s value: %s\\n\", name, (hex == NULL) ? \"(null)\" : (char *) hex);\n#ifdef HAVE_LIBGCRYPT\n    SAFE_FREE(hex);\n#elif defined HAVE_LIBCRYPTO\n    OPENSSL_free(hex);\n#elif defined HAVE_LIBMBEDCRYPTO\n    SAFE_FREE(hex);\n#endif\n}\n"
  },
  {
    "path": "src/libssh/src/bind.c",
    "content": "/*\n * bind.c : all ssh_bind functions\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2004-2005 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n\n#include \"config.h\"\n\n#include <errno.h>\n#include <fcntl.h>\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n\n#include \"libssh/priv.h\"\n#include \"libssh/bind.h\"\n#include \"libssh/libssh.h\"\n#include \"libssh/server.h\"\n#include \"libssh/pki.h\"\n#include \"libssh/buffer.h\"\n#include \"libssh/socket.h\"\n#include \"libssh/session.h\"\n#include \"libssh/token.h\"\n\n/**\n * @addtogroup libssh_server\n *\n * @{\n */\n\n\n#ifdef _WIN32\n#include <io.h>\n#include <winsock2.h>\n#include <ws2tcpip.h>\n\n/*\n * <wspiapi.h> is necessary for getaddrinfo before Windows XP, but it isn't\n * available on some platforms like MinGW.\n */\n#ifdef HAVE_WSPIAPI_H\n# include <wspiapi.h>\n#endif\n\n#define SOCKOPT_TYPE_ARG4 char\n\n#else /* _WIN32 */\n\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <netdb.h>\n#define SOCKOPT_TYPE_ARG4 int\n\n#endif /* _WIN32 */\n\nstatic socket_t bind_socket(ssh_bind sshbind, const char *hostname,\n    int port) {\n    char port_c[6];\n    struct addrinfo *ai;\n    struct addrinfo hints;\n    int opt = 1;\n    socket_t s;\n    int rc;\n\n    ZERO_STRUCT(hints);\n\n    hints.ai_flags = AI_PASSIVE;\n    hints.ai_socktype = SOCK_STREAM;\n\n    snprintf(port_c, 6, \"%d\", port);\n    rc = getaddrinfo(hostname, port_c, &hints, &ai);\n    if (rc != 0) {\n        ssh_set_error(sshbind,\n                      SSH_FATAL,\n                      \"Resolving %s: %s\", hostname, gai_strerror(rc));\n        return -1;\n    }\n\n    s = socket (ai->ai_family,\n                           ai->ai_socktype,\n                           ai->ai_protocol);\n    if (s == SSH_INVALID_SOCKET) {\n        ssh_set_error(sshbind, SSH_FATAL, \"%s\", strerror(errno));\n        freeaddrinfo (ai);\n        return -1;\n    }\n\n    if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR,\n                   (char *)&opt, sizeof(opt)) < 0) {\n        ssh_set_error(sshbind,\n                      SSH_FATAL,\n                      \"Setting socket options failed: %s\",\n                      strerror(errno));\n        freeaddrinfo (ai);\n        CLOSE_SOCKET(s);\n        return -1;\n    }\n\n    if (bind(s, ai->ai_addr, ai->ai_addrlen) != 0) {\n        ssh_set_error(sshbind,\n                      SSH_FATAL,\n                      \"Binding to %s:%d: %s\",\n                      hostname,\n                      port,\n                      strerror(errno));\n        freeaddrinfo (ai);\n        CLOSE_SOCKET(s);\n        return -1;\n    }\n\n    freeaddrinfo (ai);\n    return s;\n}\n\nssh_bind ssh_bind_new(void) {\n    ssh_bind ptr;\n\n    ptr = calloc(1, sizeof(struct ssh_bind_struct));\n    if (ptr == NULL) {\n        return NULL;\n    }\n    ptr->bindfd = SSH_INVALID_SOCKET;\n    ptr->bindport = 22;\n    ptr->common.log_verbosity = 0;\n\n    return ptr;\n}\n\nstatic int ssh_bind_import_keys(ssh_bind sshbind) {\n  int rc;\n\n  if (sshbind->ecdsakey == NULL &&\n      sshbind->dsakey == NULL &&\n      sshbind->rsakey == NULL &&\n      sshbind->ed25519key == NULL) {\n      ssh_set_error(sshbind, SSH_FATAL,\n                    \"ECDSA, ED25519, DSA, or RSA host key file must be set\");\n      return SSH_ERROR;\n  }\n\n#ifdef HAVE_ECC\n  if (sshbind->ecdsa == NULL && sshbind->ecdsakey != NULL) {\n      rc = ssh_pki_import_privkey_file(sshbind->ecdsakey,\n                                       NULL,\n                                       NULL,\n                                       NULL,\n                                       &sshbind->ecdsa);\n      if (rc == SSH_ERROR || rc == SSH_EOF) {\n          ssh_set_error(sshbind, SSH_FATAL,\n                  \"Failed to import private ECDSA host key\");\n          return SSH_ERROR;\n      }\n\n      if (!is_ecdsa_key_type(ssh_key_type(sshbind->ecdsa))) {\n          ssh_set_error(sshbind, SSH_FATAL,\n                  \"The ECDSA host key has the wrong type\");\n          ssh_key_free(sshbind->ecdsa);\n          sshbind->ecdsa = NULL;\n          return SSH_ERROR;\n      }\n  }\n#endif\n\n#ifdef HAVE_DSA\n  if (sshbind->dsa == NULL && sshbind->dsakey != NULL) {\n      rc = ssh_pki_import_privkey_file(sshbind->dsakey,\n                                       NULL,\n                                       NULL,\n                                       NULL,\n                                       &sshbind->dsa);\n      if (rc == SSH_ERROR || rc == SSH_EOF) {\n          ssh_set_error(sshbind, SSH_FATAL,\n                  \"Failed to import private DSA host key\");\n          return SSH_ERROR;\n      }\n\n      if (ssh_key_type(sshbind->dsa) != SSH_KEYTYPE_DSS) {\n          ssh_set_error(sshbind, SSH_FATAL,\n                  \"The DSA host key has the wrong type: %d\",\n                  ssh_key_type(sshbind->dsa));\n          ssh_key_free(sshbind->dsa);\n          sshbind->dsa = NULL;\n          return SSH_ERROR;\n      }\n  }\n#endif\n\n  if (sshbind->rsa == NULL && sshbind->rsakey != NULL) {\n      rc = ssh_pki_import_privkey_file(sshbind->rsakey,\n                                       NULL,\n                                       NULL,\n                                       NULL,\n                                       &sshbind->rsa);\n      if (rc == SSH_ERROR || rc == SSH_EOF) {\n          ssh_set_error(sshbind, SSH_FATAL,\n                  \"Failed to import private RSA host key\");\n          return SSH_ERROR;\n      }\n\n      if (ssh_key_type(sshbind->rsa) != SSH_KEYTYPE_RSA) {\n          ssh_set_error(sshbind, SSH_FATAL,\n                  \"The RSA host key has the wrong type\");\n          ssh_key_free(sshbind->rsa);\n          sshbind->rsa = NULL;\n          return SSH_ERROR;\n      }\n  }\n\n  if (sshbind->ed25519 == NULL && sshbind->ed25519key != NULL) {\n      rc = ssh_pki_import_privkey_file(sshbind->ed25519key,\n                                       NULL,\n                                       NULL,\n                                       NULL,\n                                       &sshbind->ed25519);\n      if (rc == SSH_ERROR || rc == SSH_EOF) {\n          ssh_set_error(sshbind, SSH_FATAL,\n                  \"Failed to import private ED25519 host key\");\n          return SSH_ERROR;\n      }\n\n      if (ssh_key_type(sshbind->ed25519) != SSH_KEYTYPE_ED25519) {\n          ssh_set_error(sshbind, SSH_FATAL,\n                  \"The ED25519 host key has the wrong type\");\n          ssh_key_free(sshbind->ed25519);\n          sshbind->ed25519 = NULL;\n          return SSH_ERROR;\n      }\n  }\n\n  return SSH_OK;\n}\n\nint ssh_bind_listen(ssh_bind sshbind) {\n  const char *host;\n  socket_t fd;\n  int rc;\n\n  if (sshbind->rsa == NULL &&\n      sshbind->dsa == NULL &&\n      sshbind->ecdsa == NULL &&\n      sshbind->ed25519 == NULL) {\n      rc = ssh_bind_import_keys(sshbind);\n      if (rc != SSH_OK) {\n          return SSH_ERROR;\n      }\n  }\n\n  if (sshbind->bindfd == SSH_INVALID_SOCKET) {\n      host = sshbind->bindaddr;\n      if (host == NULL) {\n          host = \"0.0.0.0\";\n      }\n\n      fd = bind_socket(sshbind, host, sshbind->bindport);\n      if (fd == SSH_INVALID_SOCKET) {\n          ssh_key_free(sshbind->dsa);\n          sshbind->dsa = NULL;\n          ssh_key_free(sshbind->rsa);\n          sshbind->rsa = NULL;\n          /* XXX should this clear also other structures that were allocated */\n          return -1;\n      }\n\n      if (listen(fd, 10) < 0) {\n          ssh_set_error(sshbind, SSH_FATAL,\n                  \"Listening to socket %d: %s\",\n                  fd, strerror(errno));\n          CLOSE_SOCKET(fd);\n          ssh_key_free(sshbind->dsa);\n          sshbind->dsa = NULL;\n          ssh_key_free(sshbind->rsa);\n          sshbind->rsa = NULL;\n          /* XXX should this clear also other structures that were allocated */\n          return -1;\n      }\n\n      sshbind->bindfd = fd;\n  } else {\n      SSH_LOG(SSH_LOG_INFO, \"Using app-provided bind socket\");\n  }\n  return 0;\n}\n\nint ssh_bind_set_callbacks(ssh_bind sshbind, ssh_bind_callbacks callbacks,\n    void *userdata){\n  if (sshbind == NULL) {\n    return SSH_ERROR;\n  }\n  if (callbacks == NULL) {\n    ssh_set_error_invalid(sshbind);\n    return SSH_ERROR;\n  }\n  if(callbacks->size <= 0 || callbacks->size > 1024 * sizeof(void *)){\n    ssh_set_error(sshbind,SSH_FATAL,\n        \"Invalid callback passed in (badly initialized)\");\n    return SSH_ERROR;\n  }\n  sshbind->bind_callbacks = callbacks;\n  sshbind->bind_callbacks_userdata=userdata;\n  return 0;\n}\n\n/** @internal\n * @brief callback being called by poll when an event happens\n *\n */\nstatic int ssh_bind_poll_callback(ssh_poll_handle sshpoll,\n    socket_t fd, int revents, void *user){\n  ssh_bind sshbind=(ssh_bind)user;\n  (void)sshpoll;\n  (void)fd;\n\n  if(revents & POLLIN){\n    /* new incoming connection */\n    if(ssh_callbacks_exists(sshbind->bind_callbacks,incoming_connection)){\n      sshbind->bind_callbacks->incoming_connection(sshbind,\n          sshbind->bind_callbacks_userdata);\n    }\n  }\n  return 0;\n}\n\n/** @internal\n * @brief returns the current poll handle, or create it\n * @param sshbind the ssh_bind object\n * @returns a ssh_poll handle suitable for operation\n */\nssh_poll_handle ssh_bind_get_poll(ssh_bind sshbind)\n{\n    short events = POLLIN;\n\n    if (sshbind->poll) {\n        return sshbind->poll;\n    }\n\n#ifdef POLLRDHUP\n    events |= POLLRDHUP;\n#endif /* POLLRDHUP */\n\n    sshbind->poll = ssh_poll_new(sshbind->bindfd,\n                                 events,\n                                 ssh_bind_poll_callback,\n                                 sshbind);\n\n    return sshbind->poll;\n}\n\nvoid ssh_bind_set_blocking(ssh_bind sshbind, int blocking) {\n  sshbind->blocking = blocking ? 1 : 0;\n}\n\nsocket_t ssh_bind_get_fd(ssh_bind sshbind) {\n  return sshbind->bindfd;\n}\n\nvoid ssh_bind_set_fd(ssh_bind sshbind, socket_t fd) {\n  sshbind->bindfd = fd;\n}\n\nvoid ssh_bind_fd_toaccept(ssh_bind sshbind) {\n  sshbind->toaccept = 1;\n}\n\nvoid ssh_bind_free(ssh_bind sshbind){\n  int i;\n\n  if (sshbind == NULL) {\n    return;\n  }\n\n  if (sshbind->bindfd >= 0) {\n      CLOSE_SOCKET(sshbind->bindfd);\n  }\n  sshbind->bindfd = SSH_INVALID_SOCKET;\n\n  /* options */\n  SAFE_FREE(sshbind->banner);\n  SAFE_FREE(sshbind->bindaddr);\n  SAFE_FREE(sshbind->config_dir);\n  SAFE_FREE(sshbind->pubkey_accepted_key_types);\n\n  SAFE_FREE(sshbind->dsakey);\n  SAFE_FREE(sshbind->rsakey);\n  SAFE_FREE(sshbind->ecdsakey);\n  SAFE_FREE(sshbind->ed25519key);\n\n  ssh_key_free(sshbind->dsa);\n  sshbind->dsa = NULL;\n  ssh_key_free(sshbind->rsa);\n  sshbind->rsa = NULL;\n  ssh_key_free(sshbind->ecdsa);\n  sshbind->ecdsa = NULL;\n  ssh_key_free(sshbind->ed25519);\n  sshbind->ed25519 = NULL;\n\n  for (i = 0; i < SSH_KEX_METHODS; i++) {\n    if (sshbind->wanted_methods[i]) {\n      SAFE_FREE(sshbind->wanted_methods[i]);\n    }\n  }\n\n  SAFE_FREE(sshbind);\n}\n\nint ssh_bind_accept_fd(ssh_bind sshbind, ssh_session session, socket_t fd){\n    int i, rc;\n\n    if (sshbind == NULL) {\n        return SSH_ERROR;\n    }\n\n    if (session == NULL){\n        ssh_set_error(sshbind, SSH_FATAL,\"session is null\");\n        return SSH_ERROR;\n    }\n\n    /* Apply global bind configurations, if it hasn't been applied before */\n    rc = ssh_bind_options_parse_config(sshbind, NULL);\n    if (rc != 0) {\n        ssh_set_error(sshbind, SSH_FATAL,\"Could not parse global config\");\n        return SSH_ERROR;\n    }\n\n    session->server = 1;\n\n    /* Copy options from bind to session */\n    for (i = 0; i < SSH_KEX_METHODS; i++) {\n      if (sshbind->wanted_methods[i]) {\n        session->opts.wanted_methods[i] = strdup(sshbind->wanted_methods[i]);\n        if (session->opts.wanted_methods[i] == NULL) {\n          return SSH_ERROR;\n        }\n      }\n    }\n\n    if (sshbind->bindaddr == NULL)\n      session->opts.bindaddr = NULL;\n    else {\n      SAFE_FREE(session->opts.bindaddr);\n      session->opts.bindaddr = strdup(sshbind->bindaddr);\n      if (session->opts.bindaddr == NULL) {\n        return SSH_ERROR;\n      }\n    }\n\n    if (sshbind->pubkey_accepted_key_types != NULL) {\n        if (session->opts.pubkey_accepted_types == NULL) {\n            session->opts.pubkey_accepted_types = strdup(sshbind->pubkey_accepted_key_types);\n            if (session->opts.pubkey_accepted_types == NULL) {\n                ssh_set_error_oom(sshbind);\n                return SSH_ERROR;\n            }\n        } else {\n            char *p;\n            /* If something was set to the session prior to calling this\n             * function, keep only what is allowed by the options set in\n             * sshbind */\n            p = ssh_find_all_matching(sshbind->pubkey_accepted_key_types,\n                                      session->opts.pubkey_accepted_types);\n            if (p == NULL) {\n                return SSH_ERROR;\n            }\n\n            SAFE_FREE(session->opts.pubkey_accepted_types);\n            session->opts.pubkey_accepted_types = p;\n        }\n    }\n\n    session->common.log_verbosity = sshbind->common.log_verbosity;\n    if(sshbind->banner != NULL)\n    \tsession->opts.custombanner = strdup(sshbind->banner);\n    ssh_socket_free(session->socket);\n    session->socket = ssh_socket_new(session);\n    if (session->socket == NULL) {\n      /* perhaps it may be better to copy the error from session to sshbind */\n      ssh_set_error_oom(sshbind);\n      return SSH_ERROR;\n    }\n    ssh_socket_set_fd(session->socket, fd);\n    ssh_socket_get_poll_handle(session->socket);\n\n    /* We must try to import any keys that could be imported in case\n     * we are not using ssh_bind_listen (which is the other place\n     * where keys can be imported) on this ssh_bind and are instead\n     * only using ssh_bind_accept_fd to manage sockets ourselves.\n     */\n    if (sshbind->rsa == NULL &&\n        sshbind->dsa == NULL &&\n        sshbind->ecdsa == NULL &&\n        sshbind->ed25519 == NULL) {\n        rc = ssh_bind_import_keys(sshbind);\n        if (rc != SSH_OK) {\n            return SSH_ERROR;\n        }\n    }\n\n#ifdef HAVE_ECC\n    if (sshbind->ecdsa) {\n        session->srv.ecdsa_key = ssh_key_dup(sshbind->ecdsa);\n        if (session->srv.ecdsa_key == NULL) {\n          ssh_set_error_oom(sshbind);\n          return SSH_ERROR;\n        }\n    }\n#endif\n#ifdef HAVE_DSA\n    if (sshbind->dsa) {\n        session->srv.dsa_key = ssh_key_dup(sshbind->dsa);\n        if (session->srv.dsa_key == NULL) {\n          ssh_set_error_oom(sshbind);\n          return SSH_ERROR;\n        }\n    }\n#endif\n    if (sshbind->rsa) {\n        session->srv.rsa_key = ssh_key_dup(sshbind->rsa);\n        if (session->srv.rsa_key == NULL) {\n          ssh_set_error_oom(sshbind);\n          return SSH_ERROR;\n        }\n    }\n    if (sshbind->ed25519 != NULL) {\n        session->srv.ed25519_key = ssh_key_dup(sshbind->ed25519);\n        if (session->srv.ed25519_key == NULL){\n            ssh_set_error_oom(sshbind);\n            return SSH_ERROR;\n        }\n    }\n\n    /* force PRNG to change state in case we fork after ssh_bind_accept */\n    ssh_reseed();\n    return SSH_OK;\n}\n\nint ssh_bind_accept(ssh_bind sshbind, ssh_session session) {\n  socket_t fd = SSH_INVALID_SOCKET;\n  int rc;\n  if (sshbind->bindfd == SSH_INVALID_SOCKET) {\n    ssh_set_error(sshbind, SSH_FATAL,\n        \"Can't accept new clients on a not bound socket.\");\n    return SSH_ERROR;\n  }\n\n  if (session == NULL){\n      ssh_set_error(sshbind, SSH_FATAL,\"session is null\");\n      return SSH_ERROR;\n  }\n\n  fd = accept(sshbind->bindfd, NULL, NULL);\n  if (fd == SSH_INVALID_SOCKET) {\n    ssh_set_error(sshbind, SSH_FATAL,\n        \"Accepting a new connection: %s\",\n        strerror(errno));\n    return SSH_ERROR;\n  }\n  rc = ssh_bind_accept_fd(sshbind, session, fd);\n\n  if(rc == SSH_ERROR){\n      CLOSE_SOCKET(fd);\n      ssh_socket_free(session->socket);\n  }\n  return rc;\n}\n\n\n/**\n * @}\n */\n"
  },
  {
    "path": "src/libssh/src/bind_config.c",
    "content": "/*\n * bind_config.c - Parse the SSH server configuration file\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2019 by Red Hat, Inc.\n *\n * Author: Anderson Toshiyuki Sasaki <ansasaki@redhat.com>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <ctype.h>\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n#ifdef HAVE_GLOB_H\n# include <glob.h>\n#endif\n\n#include \"libssh/bind.h\"\n#include \"libssh/bind_config.h\"\n#include \"libssh/config_parser.h\"\n#include \"libssh/priv.h\"\n#include \"libssh/server.h\"\n#include \"libssh/options.h\"\n\n#define MAX_LINE_SIZE 1024\n\n/* Flags used for the parser state */\n#define PARSING     1\n#define IN_MATCH    (1<<1)\n\nstruct ssh_bind_config_keyword_table_s {\n  const char *name;\n  enum ssh_bind_config_opcode_e opcode;\n  bool allowed_in_match;\n};\n\nstatic struct ssh_bind_config_keyword_table_s\nssh_bind_config_keyword_table[] = {\n    {\n        .name   = \"include\",\n        .opcode = BIND_CFG_INCLUDE\n    },\n    {\n        .name   = \"hostkey\",\n        .opcode = BIND_CFG_HOSTKEY\n    },\n    {\n        .name   = \"listenaddress\",\n        .opcode = BIND_CFG_LISTENADDRESS\n    },\n    {\n        .name   = \"port\",\n        .opcode = BIND_CFG_PORT\n    },\n    {\n        .name   = \"loglevel\",\n        .opcode = BIND_CFG_LOGLEVEL,\n        .allowed_in_match = true,\n    },\n    {\n        .name   = \"ciphers\",\n        .opcode = BIND_CFG_CIPHERS\n    },\n    {\n        .name   = \"macs\",\n        .opcode = BIND_CFG_MACS\n    },\n    {\n        .name   = \"kexalgorithms\",\n        .opcode = BIND_CFG_KEXALGORITHMS\n    },\n    {\n        .name   = \"match\",\n        .opcode = BIND_CFG_MATCH,\n        .allowed_in_match = true\n    },\n    {\n        .name   = \"pubkeyacceptedkeytypes\",\n        .opcode = BIND_CFG_PUBKEY_ACCEPTED_KEY_TYPES,\n        .allowed_in_match = true\n    },\n    {\n        .name   = \"hostkeyalgorithms\",\n        .opcode = BIND_CFG_HOSTKEY_ALGORITHMS,\n        .allowed_in_match = true\n    },\n    {\n        .opcode = BIND_CFG_UNKNOWN,\n    }\n};\n\nenum ssh_bind_config_match_e {\n    BIND_MATCH_UNKNOWN = -1,\n    BIND_MATCH_ALL,\n    BIND_MATCH_USER,\n    BIND_MATCH_GROUP,\n    BIND_MATCH_HOST,\n    BIND_MATCH_LOCALADDRESS,\n    BIND_MATCH_LOCALPORT,\n    BIND_MATCH_RDOMAIN,\n    BIND_MATCH_ADDRESS,\n};\n\nstruct ssh_bind_config_match_keyword_table_s {\n    const char *name;\n    enum ssh_bind_config_match_e opcode;\n};\n\nstatic struct ssh_bind_config_match_keyword_table_s\nssh_bind_config_match_keyword_table[] = {\n    {\n        .name   = \"all\",\n        .opcode = BIND_MATCH_ALL\n    },\n    {\n        .name   = \"user\",\n        .opcode = BIND_MATCH_USER\n    },\n    {\n        .name   = \"group\",\n        .opcode = BIND_MATCH_GROUP\n    },\n    {\n        .name   = \"host\",\n        .opcode = BIND_MATCH_HOST\n    },\n    {\n        .name   = \"localaddress\",\n        .opcode = BIND_MATCH_LOCALADDRESS\n    },\n    {\n        .name   = \"localport\",\n        .opcode = BIND_MATCH_LOCALPORT\n    },\n    {\n        .name   = \"rdomain\",\n        .opcode = BIND_MATCH_RDOMAIN\n    },\n    {\n        .name   = \"address\",\n        .opcode = BIND_MATCH_ADDRESS\n    },\n    {\n        .opcode = BIND_MATCH_UNKNOWN\n    },\n};\n\nstatic enum ssh_bind_config_opcode_e\nssh_bind_config_get_opcode(char *keyword, uint32_t *parser_flags)\n{\n    int i;\n\n    for (i = 0; ssh_bind_config_keyword_table[i].name != NULL; i++) {\n        if (strcasecmp(keyword, ssh_bind_config_keyword_table[i].name) == 0) {\n            if ((*parser_flags & IN_MATCH) &&\n                !(ssh_bind_config_keyword_table[i].allowed_in_match))\n            {\n                return BIND_CFG_NOT_ALLOWED_IN_MATCH;\n            }\n            return ssh_bind_config_keyword_table[i].opcode;\n        }\n    }\n\n    return BIND_CFG_UNKNOWN;\n}\n\nstatic int\nssh_bind_config_parse_line(ssh_bind bind,\n                           const char *line,\n                           unsigned int count,\n                           uint32_t *parser_flags,\n                           uint8_t *seen);\n\nstatic void local_parse_file(ssh_bind bind,\n                             const char *filename,\n                             uint32_t *parser_flags,\n                             uint8_t *seen)\n{\n    FILE *f;\n    char line[MAX_LINE_SIZE] = {0};\n    unsigned int count = 0;\n    int rv;\n\n    f = fopen(filename, \"r\");\n    if (f == NULL) {\n        SSH_LOG(SSH_LOG_RARE, \"Cannot find file %s to load\",\n                filename);\n        return;\n    }\n\n    SSH_LOG(SSH_LOG_PACKET, \"Reading additional configuration data from %s\",\n            filename);\n\n    while (fgets(line, sizeof(line), f)) {\n        count++;\n        rv = ssh_bind_config_parse_line(bind, line, count, parser_flags, seen);\n        if (rv < 0) {\n            fclose(f);\n            return;\n        }\n    }\n\n    fclose(f);\n    return;\n}\n\n#if defined(HAVE_GLOB) && defined(HAVE_GLOB_GL_FLAGS_MEMBER)\nstatic void local_parse_glob(ssh_bind bind,\n                             const char *fileglob,\n                             uint32_t *parser_flags,\n                             uint8_t *seen)\n{\n    glob_t globbuf = {\n        .gl_flags = 0,\n    };\n    int rt;\n    u_int i;\n\n    rt = glob(fileglob, GLOB_TILDE, NULL, &globbuf);\n    if (rt == GLOB_NOMATCH) {\n        globfree(&globbuf);\n        return;\n    } else if (rt != 0) {\n        SSH_LOG(SSH_LOG_RARE, \"Glob error: %s\",\n                fileglob);\n        globfree(&globbuf);\n        return;\n    }\n\n    for (i = 0; i < globbuf.gl_pathc; i++) {\n        local_parse_file(bind, globbuf.gl_pathv[i], parser_flags, seen);\n    }\n\n    globfree(&globbuf);\n}\n#endif /* HAVE_GLOB HAVE_GLOB_GL_FLAGS_MEMBER */\n\nstatic enum ssh_bind_config_match_e\nssh_bind_config_get_match_opcode(const char *keyword)\n{\n    size_t i;\n\n    for (i = 0; ssh_bind_config_match_keyword_table[i].name != NULL; i++) {\n        if (strcasecmp(keyword, ssh_bind_config_match_keyword_table[i].name) == 0) {\n            return ssh_bind_config_match_keyword_table[i].opcode;\n        }\n    }\n\n    return BIND_MATCH_UNKNOWN;\n}\n\nstatic int\nssh_bind_config_parse_line(ssh_bind bind,\n                           const char *line,\n                           unsigned int count,\n                           uint32_t *parser_flags,\n                           uint8_t *seen)\n{\n    enum ssh_bind_config_opcode_e opcode;\n    const char *p = NULL;\n    char *s = NULL, *x = NULL;\n    char *keyword = NULL;\n    size_t len;\n\n    int rc = 0;\n\n    if (bind == NULL) {\n        return -1;\n    }\n\n    if ((line == NULL) || (parser_flags == NULL)) {\n        ssh_set_error_invalid(bind);\n        return -1;\n    }\n\n    x = s = strdup(line);\n    if (s == NULL) {\n        ssh_set_error_oom(bind);\n        return -1;\n    }\n\n    /* Remove trailing spaces */\n    for (len = strlen(s) - 1; len > 0; len--) {\n        if (! isspace(s[len])) {\n            break;\n        }\n        s[len] = '\\0';\n    }\n\n    keyword = ssh_config_get_token(&s);\n    if (keyword == NULL || *keyword == '#' ||\n            *keyword == '\\0' || *keyword == '\\n') {\n        SAFE_FREE(x);\n        return 0;\n    }\n\n    opcode = ssh_bind_config_get_opcode(keyword, parser_flags);\n    if ((*parser_flags & PARSING) &&\n            opcode != BIND_CFG_HOSTKEY &&\n            opcode != BIND_CFG_INCLUDE &&\n            opcode != BIND_CFG_MATCH &&\n            opcode > BIND_CFG_UNSUPPORTED) { /* Ignore all unknown types here */\n        /* Skip all the options that were already applied */\n        if (seen[opcode] != 0) {\n            SAFE_FREE(x);\n            return 0;\n        }\n        seen[opcode] = 1;\n    }\n\n    switch (opcode) {\n    case BIND_CFG_INCLUDE:\n        p = ssh_config_get_str_tok(&s, NULL);\n        if (p && (*parser_flags & PARSING)) {\n#if defined(HAVE_GLOB) && defined(HAVE_GLOB_GL_FLAGS_MEMBER)\n            local_parse_glob(bind, p, parser_flags, seen);\n#else\n            local_parse_file(bind, p, parser_flags, seen);\n#endif /* HAVE_GLOB */\n        }\n        break;\n\n    case BIND_CFG_HOSTKEY:\n        p = ssh_config_get_str_tok(&s, NULL);\n        if (p && (*parser_flags & PARSING)) {\n            rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_HOSTKEY, p);\n            if (rc != 0) {\n                SSH_LOG(SSH_LOG_WARN,\n                        \"line %d: Failed to set Hostkey value '%s'\",\n                        count, p);\n            }\n        }\n        break;\n    case BIND_CFG_LISTENADDRESS:\n        p = ssh_config_get_str_tok(&s, NULL);\n        if (p && (*parser_flags & PARSING)) {\n            rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_BINDADDR, p);\n            if (rc != 0) {\n                SSH_LOG(SSH_LOG_WARN,\n                        \"line %d: Failed to set ListenAddress value '%s'\",\n                        count, p);\n            }\n        }\n        break;\n    case BIND_CFG_PORT:\n        p = ssh_config_get_str_tok(&s, NULL);\n        if (p && (*parser_flags & PARSING)) {\n            rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_BINDPORT_STR, p);\n            if (rc != 0) {\n                SSH_LOG(SSH_LOG_WARN,\n                        \"line %d: Failed to set Port value '%s'\",\n                        count, p);\n            }\n        }\n        break;\n    case BIND_CFG_CIPHERS:\n        p = ssh_config_get_str_tok(&s, NULL);\n        if (p && (*parser_flags & PARSING)) {\n            rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_CIPHERS_C_S, p);\n            if (rc != 0) {\n                SSH_LOG(SSH_LOG_WARN,\n                        \"line %d: Failed to set C->S Ciphers value '%s'\",\n                        count, p);\n                break;\n            }\n\n            rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_CIPHERS_S_C, p);\n            if (rc != 0) {\n                SSH_LOG(SSH_LOG_WARN,\n                        \"line %d: Failed to set S->C Ciphers value '%s'\",\n                        count, p);\n            }\n        }\n        break;\n    case BIND_CFG_MACS:\n        p = ssh_config_get_str_tok(&s, NULL);\n        if (p && (*parser_flags & PARSING)) {\n            rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_HMAC_C_S, p);\n            if (rc != 0) {\n                SSH_LOG(SSH_LOG_WARN,\n                        \"line %d: Failed to set C->S MAC value '%s'\",\n                        count, p);\n                break;\n            }\n\n            rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_HMAC_S_C, p);\n            if (rc != 0) {\n                SSH_LOG(SSH_LOG_WARN,\n                        \"line %d: Failed to set S->C MAC value '%s'\",\n                        count, p);\n            }\n        }\n        break;\n    case BIND_CFG_LOGLEVEL:\n        p = ssh_config_get_str_tok(&s, NULL);\n        if (p && (*parser_flags & PARSING)) {\n            int value = -1;\n\n            if (strcasecmp(p, \"quiet\") == 0) {\n                value = SSH_LOG_NONE;\n            } else if (strcasecmp(p, \"fatal\") == 0 ||\n                    strcasecmp(p, \"error\")== 0 ||\n                    strcasecmp(p, \"info\") == 0) {\n                value = SSH_LOG_WARN;\n            } else if (strcasecmp(p, \"verbose\") == 0) {\n                value = SSH_LOG_INFO;\n            } else if (strcasecmp(p, \"DEBUG\") == 0 ||\n                    strcasecmp(p, \"DEBUG1\") == 0) {\n                value = SSH_LOG_DEBUG;\n            } else if (strcasecmp(p, \"DEBUG2\") == 0 ||\n                    strcasecmp(p, \"DEBUG3\") == 0) {\n                value = SSH_LOG_TRACE;\n            }\n            if (value != -1) {\n                rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_LOG_VERBOSITY,\n                        &value);\n                if (rc != 0) {\n                    SSH_LOG(SSH_LOG_WARN,\n                            \"line %d: Failed to set LogLevel value '%s'\",\n                            count, p);\n                }\n            }\n        }\n        break;\n    case BIND_CFG_KEXALGORITHMS:\n        p = ssh_config_get_str_tok(&s, NULL);\n        if (p && (*parser_flags & PARSING)) {\n            rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_KEY_EXCHANGE, p);\n            if (rc != 0) {\n                SSH_LOG(SSH_LOG_WARN,\n                        \"line %d: Failed to set KexAlgorithms value '%s'\",\n                        count, p);\n            }\n        }\n        break;\n    case BIND_CFG_MATCH: {\n        bool negate;\n        int result = PARSING;\n        size_t args = 0;\n        enum ssh_bind_config_match_e opt;\n        const char *p2 = NULL;\n\n        /* The options set in Match blocks should be applied when a connection\n         * is accepted, and not right away when parsing the file (as it is\n         * currently done). This means the configuration files should be parsed\n         * again or the options set in the Match blocks should be stored and\n         * applied as necessary. */\n\n        /* If this is the first Match block, erase the seen table to allow\n         * options to be overridden. Erasing the seen table was the easiest way\n         * to allow overriding an option, but only for the first occurrence of\n         * an option in a Match block. This is sufficient for the current\n         * implementation which supports only the 'All' criterion, meaning the\n         * options can be applied right away. */\n        if (!(*parser_flags & IN_MATCH)) {\n            memset(seen, 0x00, BIND_CFG_MAX * sizeof(uint8_t));\n        }\n\n        /* In this line the PARSING bit is cleared from the flags */\n        *parser_flags = IN_MATCH;\n        do {\n            p = p2 = ssh_config_get_str_tok(&s, NULL);\n            if (p == NULL || p[0] == '\\0') {\n                break;\n            }\n            args++;\n            SSH_LOG(SSH_LOG_TRACE, \"line %d: Processing Match keyword '%s'\",\n                    count, p);\n\n            /* If the option is prefixed with ! the result should be negated */\n            negate = false;\n            if (p[0] == '!') {\n                negate = true;\n                p++;\n            }\n\n            opt = ssh_bind_config_get_match_opcode(p);\n            switch (opt) {\n            case BIND_MATCH_ALL:\n                p = ssh_config_get_str_tok(&s, NULL);\n                if ((args == 1) && (p == NULL || p[0] == '\\0')) {\n                    /* The \"all\" keyword does not accept arguments or modifiers\n                     */\n                    if (negate == true) {\n                        result = 0;\n                    }\n                    break;\n                }\n                ssh_set_error(bind, SSH_FATAL,\n                              \"line %d: ERROR - Match all cannot be combined with \"\n                              \"other Match attributes\", count);\n                SAFE_FREE(x);\n                return -1;\n            case BIND_MATCH_USER:\n            case BIND_MATCH_GROUP:\n            case BIND_MATCH_HOST:\n            case BIND_MATCH_LOCALADDRESS:\n            case BIND_MATCH_LOCALPORT:\n            case BIND_MATCH_RDOMAIN:\n            case BIND_MATCH_ADDRESS:\n                /* Only \"All\" is supported for now */\n                /* Skip one argument */\n                p = ssh_config_get_str_tok(&s, NULL);\n                if (p == NULL || p[0] == '\\0') {\n                    SSH_LOG(SSH_LOG_WARN, \"line %d: Match keyword \"\n                            \"'%s' requires argument\\n\", count, p2);\n                    SAFE_FREE(x);\n                    return -1;\n                }\n                args++;\n                SSH_LOG(SSH_LOG_WARN,\n                        \"line %d: Unsupported Match keyword '%s', ignoring\\n\",\n                        count,\n                        p2);\n                result = 0;\n                break;\n            case BIND_MATCH_UNKNOWN:\n            default:\n                ssh_set_error(bind, SSH_FATAL,\n                              \"ERROR - Unknown argument '%s' for Match keyword\", p);\n                SAFE_FREE(x);\n                return -1;\n            }\n        } while (p != NULL && p[0] != '\\0');\n        if (args == 0) {\n            ssh_set_error(bind, SSH_FATAL,\n                          \"ERROR - Match keyword requires an argument\");\n            SAFE_FREE(x);\n            return -1;\n        }\n        /* This line only sets the PARSING flag if all checks passed */\n        *parser_flags |= result;\n        break;\n    }\n    case BIND_CFG_PUBKEY_ACCEPTED_KEY_TYPES:\n        p = ssh_config_get_str_tok(&s, NULL);\n        if (p && (*parser_flags & PARSING)) {\n            rc = ssh_bind_options_set(bind,\n                                 SSH_BIND_OPTIONS_PUBKEY_ACCEPTED_KEY_TYPES, p);\n            if (rc != 0) {\n                SSH_LOG(SSH_LOG_WARN,\n                        \"line %d: Failed to set PubKeyAcceptedKeyTypes value '%s'\",\n                        count, p);\n            }\n        }\n        break;\n    case BIND_CFG_HOSTKEY_ALGORITHMS:\n        p = ssh_config_get_str_tok(&s, NULL);\n        if (p && (*parser_flags & PARSING)) {\n            rc = ssh_bind_options_set(bind,\n                                 SSH_BIND_OPTIONS_HOSTKEY_ALGORITHMS, p);\n            if (rc != 0) {\n                SSH_LOG(SSH_LOG_WARN,\n                        \"line %d: Failed to set HostkeyAlgorithms value '%s'\",\n                        count, p);\n            }\n        }\n        break;\n    case BIND_CFG_NOT_ALLOWED_IN_MATCH:\n        SSH_LOG(SSH_LOG_WARN, \"Option not allowed in Match block: %s, line: %d\",\n                keyword, count);\n        break;\n    case BIND_CFG_UNKNOWN:\n        SSH_LOG(SSH_LOG_WARN, \"Unknown option: %s, line: %d\",\n                keyword, count);\n        break;\n    case BIND_CFG_UNSUPPORTED:\n        SSH_LOG(SSH_LOG_WARN, \"Unsupported option: %s, line: %d\",\n                keyword, count);\n        break;\n    case BIND_CFG_NA:\n        SSH_LOG(SSH_LOG_WARN, \"Option not applicable: %s, line: %d\",\n                keyword, count);\n        break;\n    default:\n        ssh_set_error(bind, SSH_FATAL, \"ERROR - unimplemented opcode: %d\",\n                opcode);\n        SAFE_FREE(x);\n        return -1;\n        break;\n    }\n\n    SAFE_FREE(x);\n    return rc;\n}\n\nint ssh_bind_config_parse_file(ssh_bind bind, const char *filename)\n{\n    char line[MAX_LINE_SIZE] = {0};\n    unsigned int count = 0;\n    FILE *f;\n    uint32_t parser_flags;\n    int rv;\n\n    /* This local table is used during the parsing of the current file (and\n     * files included recursively in this file) to prevent an option to be\n     * redefined, i.e. the first value set is kept. But this DO NOT prevent the\n     * option to be redefined later by another file. */\n    uint8_t seen[BIND_CFG_MAX] = {0};\n\n    f = fopen(filename, \"r\");\n    if (f == NULL) {\n        return 0;\n    }\n\n    SSH_LOG(SSH_LOG_PACKET, \"Reading configuration data from %s\", filename);\n\n    parser_flags = PARSING;\n    while (fgets(line, sizeof(line), f)) {\n        count++;\n        rv = ssh_bind_config_parse_line(bind, line, count, &parser_flags, seen);\n        if (rv) {\n            fclose(f);\n            return -1;\n        }\n    }\n\n    fclose(f);\n    return 0;\n}\n"
  },
  {
    "path": "src/libssh/src/buffer.c",
    "content": "/*\n * buffer.c - buffer functions\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2003-2009 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <limits.h>\n#include <stdarg.h>\n#include <stdbool.h>\n\n#ifndef _WIN32\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#endif\n\n#include \"libssh/priv.h\"\n#include \"libssh/buffer.h\"\n#include \"libssh/misc.h\"\n#include \"libssh/bignum.h\"\n\n/*\n * Describes a buffer state\n * [XXXXXXXXXXXXDATA PAYLOAD       XXXXXXXXXXXXXXXXXXXXXXXX]\n * ^            ^                  ^                       ^]\n * \\_data points\\_pos points here  \\_used points here |    /\n *   here                                          Allocated\n */\nstruct ssh_buffer_struct {\n    bool secure;\n    size_t used;\n    size_t allocated;\n    size_t pos;\n    uint8_t *data;\n};\n\n/* Buffer size maximum is 256M */\n#define BUFFER_SIZE_MAX 0x10000000\n\n/**\n * @defgroup libssh_buffer The SSH buffer functions.\n * @ingroup libssh\n *\n * Functions to handle SSH buffers.\n *\n * @{\n */\n\n\n#ifdef DEBUG_BUFFER\n/**\n * @internal\n *\n * @brief Check that preconditions and postconditions are valid.\n *\n * @param[in]  buf      The buffer to check.\n */\nstatic void buffer_verify(ssh_buffer buf)\n{\n    bool do_abort = false;\n\n    if (buf->data == NULL) {\n        return;\n    }\n\n    if (buf->used > buf->allocated) {\n        fprintf(stderr,\n                \"BUFFER ERROR: allocated %zu, used %zu\\n\",\n                buf->allocated,\n                buf->used);\n        do_abort = true;\n    }\n    if (buf->pos > buf->used) {\n        fprintf(stderr,\n                \"BUFFER ERROR: position %zu, used %zu\\n\",\n                buf->pos,\n                buf->used);\n        do_abort = true;\n    }\n    if (buf->pos > buf->allocated) {\n        fprintf(stderr,\n                \"BUFFER ERROR: position %zu, allocated %zu\\n\",\n                buf->pos,\n                buf->allocated);\n        do_abort = true;\n    }\n    if (do_abort) {\n        abort();\n    }\n}\n\n#else\n#define buffer_verify(x)\n#endif\n\n/**\n * @brief Create a new SSH buffer.\n *\n * @return A newly initialized SSH buffer, NULL on error.\n */\nstruct ssh_buffer_struct *ssh_buffer_new(void)\n{\n    struct ssh_buffer_struct *buf = NULL;\n    int rc;\n\n    buf = calloc(1, sizeof(struct ssh_buffer_struct));\n    if (buf == NULL) {\n        return NULL;\n    }\n\n    /*\n     * Always preallocate 64 bytes.\n     *\n     * -1 for ralloc_buffer magic.\n     */\n    rc = ssh_buffer_allocate_size(buf, 64 - 1);\n    if (rc != 0) {\n        SAFE_FREE(buf);\n        return NULL;\n    }\n    buffer_verify(buf);\n\n    return buf;\n}\n\n/**\n * @brief Deallocate a SSH buffer.\n *\n * \\param[in]  buffer   The buffer to free.\n */\nvoid ssh_buffer_free(struct ssh_buffer_struct *buffer)\n{\n    if (buffer == NULL) {\n        return;\n    }\n    buffer_verify(buffer);\n\n    if (buffer->secure && buffer->allocated > 0) {\n        /* burn the data */\n        explicit_bzero(buffer->data, buffer->allocated);\n        SAFE_FREE(buffer->data);\n\n        explicit_bzero(buffer, sizeof(struct ssh_buffer_struct));\n    } else {\n        SAFE_FREE(buffer->data);\n    }\n    SAFE_FREE(buffer);\n}\n\n/**\n * @brief Sets the buffer as secure.\n *\n * A secure buffer will never leave cleartext data in the heap\n * after being reallocated or freed.\n *\n * @param[in] buffer buffer to set secure.\n */\nvoid ssh_buffer_set_secure(ssh_buffer buffer)\n{\n    buffer->secure = true;\n}\n\nstatic int realloc_buffer(struct ssh_buffer_struct *buffer, size_t needed)\n{\n    size_t smallest = 1;\n    uint8_t *new = NULL;\n\n    buffer_verify(buffer);\n\n    /* Find the smallest power of two which is greater or equal to needed */\n    while(smallest <= needed) {\n        if (smallest == 0) {\n            return -1;\n        }\n        smallest <<= 1;\n    }\n    needed = smallest;\n\n    if (needed > BUFFER_SIZE_MAX) {\n        return -1;\n    }\n\n    if (buffer->secure) {\n        new = malloc(needed);\n        if (new == NULL) {\n            return -1;\n        }\n        memcpy(new, buffer->data, buffer->used);\n        explicit_bzero(buffer->data, buffer->used);\n        SAFE_FREE(buffer->data);\n    } else {\n        new = realloc(buffer->data, needed);\n        if (new == NULL) {\n            return -1;\n        }\n    }\n    buffer->data = new;\n    buffer->allocated = needed;\n\n    buffer_verify(buffer);\n    return 0;\n}\n\n/** @internal\n * @brief shifts a buffer to remove unused data in the beginning\n * @param buffer SSH buffer\n */\nstatic void buffer_shift(ssh_buffer buffer)\n{\n    size_t burn_pos = buffer->pos;\n\n    buffer_verify(buffer);\n\n    if (buffer->pos == 0) {\n        return;\n    }\n    memmove(buffer->data,\n            buffer->data + buffer->pos,\n            buffer->used - buffer->pos);\n    buffer->used -= buffer->pos;\n    buffer->pos = 0;\n\n    if (buffer->secure) {\n        void *ptr = buffer->data + buffer->used;\n        explicit_bzero(ptr, burn_pos);\n    }\n\n    buffer_verify(buffer);\n}\n\n/**\n * @brief Reinitialize a SSH buffer.\n *\n * In case the buffer has exceeded 64K in size, the buffer will be reallocated\n * to 64K.\n *\n * @param[in]  buffer   The buffer to reinitialize.\n *\n * @return              0 on success, < 0 on error.\n */\nint ssh_buffer_reinit(struct ssh_buffer_struct *buffer)\n{\n    if (buffer == NULL) {\n        return -1;\n    }\n\n    buffer_verify(buffer);\n\n    if (buffer->secure && buffer->allocated > 0) {\n        explicit_bzero(buffer->data, buffer->allocated);\n    }\n    buffer->used = 0;\n    buffer->pos = 0;\n\n    /* If the buffer is bigger then 64K, reset it to 64K */\n    if (buffer->allocated > 65536) {\n        int rc;\n\n        /* -1 for realloc_buffer magic */\n        rc = realloc_buffer(buffer, 65536 - 1);\n        if (rc != 0) {\n            return -1;\n        }\n    }\n\n    buffer_verify(buffer);\n\n    return 0;\n}\n\n/**\n * @brief Add data at the tail of a buffer.\n *\n * @param[in]  buffer   The buffer to add the data.\n *\n * @param[in]  data     A pointer to the data to add.\n *\n * @param[in]  len      The length of the data to add.\n *\n * @return              0 on success, < 0 on error.\n */\nint ssh_buffer_add_data(struct ssh_buffer_struct *buffer, const void *data, uint32_t len)\n{\n    if (buffer == NULL) {\n        return -1;\n    }\n\n    buffer_verify(buffer);\n\n    if (data == NULL) {\n        return -1;\n    }\n\n    if (buffer->used + len < len) {\n        return -1;\n    }\n\n    if (buffer->allocated < (buffer->used + len)) {\n        if (buffer->pos > 0) {\n            buffer_shift(buffer);\n        }\n        if (realloc_buffer(buffer, buffer->used + len) < 0) {\n            return -1;\n        }\n    }\n\n    memcpy(buffer->data + buffer->used, data, len);\n    buffer->used += len;\n    buffer_verify(buffer);\n    return 0;\n}\n\n/**\n * @brief Ensure the buffer has at least a certain preallocated size.\n *\n * @param[in]  buffer   The buffer to enlarge.\n *\n * @param[in]  len      The length to ensure as allocated.\n *\n * @return              0 on success, < 0 on error.\n */\nint ssh_buffer_allocate_size(struct ssh_buffer_struct *buffer,\n                             uint32_t len)\n{\n    buffer_verify(buffer);\n\n    if (buffer->allocated < len) {\n        if (buffer->pos > 0) {\n            buffer_shift(buffer);\n        }\n        if (realloc_buffer(buffer, len) < 0) {\n            return -1;\n        }\n    }\n\n    buffer_verify(buffer);\n\n    return 0;\n}\n\n/**\n * @internal\n *\n * @brief Allocate space for data at the tail of a buffer.\n *\n * @param[in]  buffer   The buffer to add the data.\n *\n * @param[in]  len      The length of the data to add.\n *\n * @return              Pointer on the allocated space\n *                      NULL on error.\n */\nvoid *ssh_buffer_allocate(struct ssh_buffer_struct *buffer, uint32_t len)\n{\n    void *ptr;\n    buffer_verify(buffer);\n\n    if (buffer->used + len < len) {\n        return NULL;\n    }\n\n    if (buffer->allocated < (buffer->used + len)) {\n        if (buffer->pos > 0) {\n            buffer_shift(buffer);\n        }\n\n        if (realloc_buffer(buffer, buffer->used + len) < 0) {\n            return NULL;\n        }\n    }\n\n    ptr = buffer->data + buffer->used;\n    buffer->used+=len;\n    buffer_verify(buffer);\n\n    return ptr;\n}\n\n/**\n * @internal\n *\n * @brief Add a SSH string to the tail of a buffer.\n *\n * @param[in]  buffer   The buffer to add the string.\n *\n * @param[in]  string   The SSH String to add.\n *\n * @return              0 on success, < 0 on error.\n */\nint ssh_buffer_add_ssh_string(struct ssh_buffer_struct *buffer,\n    struct ssh_string_struct *string) {\n  uint32_t len = 0;\n\n  if (string == NULL) {\n      return -1;\n  }\n\n  len = ssh_string_len(string);\n  if (ssh_buffer_add_data(buffer, string, len + sizeof(uint32_t)) < 0) {\n    return -1;\n  }\n\n  return 0;\n}\n\n/**\n * @internal\n *\n * @brief Add a 32 bits unsigned integer to the tail of a buffer.\n *\n * @param[in]  buffer   The buffer to add the integer.\n *\n * @param[in]  data     The 32 bits integer to add.\n *\n * @return              0 on success, -1 on error.\n */\nint ssh_buffer_add_u32(struct ssh_buffer_struct *buffer,uint32_t data)\n{\n    int rc;\n\n    rc = ssh_buffer_add_data(buffer, &data, sizeof(data));\n    if (rc < 0) {\n        return -1;\n    }\n\n    return 0;\n}\n\n/**\n * @internal\n *\n * @brief Add a 16 bits unsigned integer to the tail of a buffer.\n *\n * @param[in]  buffer   The buffer to add the integer.\n *\n * @param[in]  data     The 16 bits integer to add.\n *\n * @return              0 on success, -1 on error.\n */\nint ssh_buffer_add_u16(struct ssh_buffer_struct *buffer,uint16_t data)\n{\n    int rc;\n\n    rc = ssh_buffer_add_data(buffer, &data, sizeof(data));\n    if (rc < 0) {\n        return -1;\n    }\n\n    return 0;\n}\n\n/**\n * @internal\n *\n * @brief Add a 64 bits unsigned integer to the tail of a buffer.\n *\n * @param[in]  buffer   The buffer to add the integer.\n *\n * @param[in]  data     The 64 bits integer to add.\n *\n * @return              0 on success, -1 on error.\n */\nint ssh_buffer_add_u64(struct ssh_buffer_struct *buffer, uint64_t data)\n{\n    int rc;\n\n    rc = ssh_buffer_add_data(buffer, &data, sizeof(data));\n    if (rc < 0) {\n        return -1;\n    }\n\n    return 0;\n}\n\n/**\n * @internal\n *\n * @brief Add a 8 bits unsigned integer to the tail of a buffer.\n *\n * @param[in]  buffer   The buffer to add the integer.\n *\n * @param[in]  data     The 8 bits integer to add.\n *\n * @return              0 on success, -1 on error.\n */\nint ssh_buffer_add_u8(struct ssh_buffer_struct *buffer,uint8_t data)\n{\n    int rc;\n\n    rc = ssh_buffer_add_data(buffer, &data, sizeof(uint8_t));\n    if (rc < 0) {\n        return -1;\n    }\n\n    return 0;\n}\n\n/**\n * @internal\n *\n * @brief Add data at the head of a buffer.\n *\n * @param[in]  buffer   The buffer to add the data.\n *\n * @param[in]  data     The data to prepend.\n *\n * @param[in]  len      The length of data to prepend.\n *\n * @return              0 on success, -1 on error.\n */\nint ssh_buffer_prepend_data(struct ssh_buffer_struct *buffer, const void *data,\n    uint32_t len) {\n  buffer_verify(buffer);\n\n  if(len <= buffer->pos){\n    /* It's possible to insert data between begin and pos */\n    memcpy(buffer->data + (buffer->pos - len), data, len);\n    buffer->pos -= len;\n    buffer_verify(buffer);\n    return 0;\n  }\n  /* pos isn't high enough */\n  if (buffer->used - buffer->pos + len < len) {\n    return -1;\n  }\n\n  if (buffer->allocated < (buffer->used - buffer->pos + len)) {\n    if (realloc_buffer(buffer, buffer->used - buffer->pos + len) < 0) {\n      return -1;\n    }\n  }\n  memmove(buffer->data + len, buffer->data + buffer->pos, buffer->used - buffer->pos);\n  memcpy(buffer->data, data, len);\n  buffer->used += len - buffer->pos;\n  buffer->pos = 0;\n  buffer_verify(buffer);\n  return 0;\n}\n\n/**\n * @internal\n *\n * @brief Append data from a buffer to the tail of another buffer.\n *\n * @param[in]  buffer   The destination buffer.\n *\n * @param[in]  source   The source buffer to append. It doesn't take the\n *                      position of the buffer into account.\n *\n * @return              0 on success, -1 on error.\n */\nint ssh_buffer_add_buffer(struct ssh_buffer_struct *buffer,\n    struct ssh_buffer_struct *source)\n{\n    int rc;\n\n    rc = ssh_buffer_add_data(buffer,\n                             ssh_buffer_get(source),\n                             ssh_buffer_get_len(source));\n    if (rc < 0) {\n        return -1;\n    }\n\n    return 0;\n}\n\n/**\n * @brief Get a pointer to the head of a buffer at the current position.\n *\n * @param[in]  buffer   The buffer to get the head pointer.\n *\n * @return              A pointer to the data from current position.\n *\n * @see ssh_buffer_get_len()\n */\nvoid *ssh_buffer_get(struct ssh_buffer_struct *buffer){\n    return buffer->data + buffer->pos;\n}\n\n/**\n * @brief Get the length of the buffer from the current position.\n *\n * @param[in]  buffer   The buffer to get the length from.\n *\n * @return              The length of the buffer.\n *\n * @see ssh_buffer_get()\n */\nuint32_t ssh_buffer_get_len(struct ssh_buffer_struct *buffer){\n  buffer_verify(buffer);\n  return buffer->used - buffer->pos;\n}\n\n/**\n * @internal\n *\n * @brief Advance the position in the buffer.\n *\n * This has effect to \"eat\" bytes at head of the buffer.\n *\n * @param[in]  buffer   The buffer to advance the position.\n *\n * @param[in]  len      The number of bytes to eat.\n *\n * @return              The new size of the buffer.\n */\nuint32_t ssh_buffer_pass_bytes(struct ssh_buffer_struct *buffer, uint32_t len){\n    buffer_verify(buffer);\n\n    if (buffer->pos + len < len || buffer->used < buffer->pos + len) {\n        return 0;\n    }\n\n    buffer->pos+=len;\n    /* if the buffer is empty after having passed the whole bytes into it, we can clean it */\n    if(buffer->pos==buffer->used){\n        buffer->pos=0;\n        buffer->used=0;\n    }\n    buffer_verify(buffer);\n    return len;\n}\n\n/**\n * @internal\n *\n * @brief Cut the end of the buffer.\n *\n * @param[in]  buffer   The buffer to cut.\n *\n * @param[in]  len      The number of bytes to remove from the tail.\n *\n * @return              The new size of the buffer.\n */\nuint32_t ssh_buffer_pass_bytes_end(struct ssh_buffer_struct *buffer, uint32_t len){\n  buffer_verify(buffer);\n\n  if (buffer->used < len) {\n      return 0;\n  }\n\n  buffer->used-=len;\n  buffer_verify(buffer);\n  return len;\n}\n\n/**\n * @brief Get the remaining data out of the buffer and adjust the read pointer.\n *\n * @param[in]  buffer   The buffer to read.\n *\n * @param[in]  data     The data buffer where to store the data.\n *\n * @param[in]  len      The length to read from the buffer.\n *\n * @returns             0 if there is not enough data in buffer, len otherwise.\n */\nuint32_t ssh_buffer_get_data(struct ssh_buffer_struct *buffer, void *data, uint32_t len)\n{\n    int rc;\n\n    /*\n     * Check for a integer overflow first, then check if not enough data is in\n     * the buffer.\n     */\n    rc = ssh_buffer_validate_length(buffer, len);\n    if (rc != SSH_OK) {\n        return 0;\n    }\n    memcpy(data,buffer->data+buffer->pos,len);\n    buffer->pos+=len;\n    return len;   /* no yet support for partial reads (is it really needed ?? ) */\n}\n\n/**\n * @internal\n *\n * @brief Get a 8 bits unsigned int out of the buffer and adjusts the read\n * pointer.\n *\n * @param[in]  buffer   The buffer to read.\n *\n * @param[in]  data     A pointer to a uint8_t where to store the data.\n *\n * @returns             0 if there is not enough data in buffer, 1 otherwise.\n */\nint ssh_buffer_get_u8(struct ssh_buffer_struct *buffer, uint8_t *data){\n    return ssh_buffer_get_data(buffer,data,sizeof(uint8_t));\n}\n\n/**\n * @internal\n *\n * @brief gets a 32 bits unsigned int out of the buffer. Adjusts the read pointer.\n *\n * @param[in]  buffer   The buffer to read.\n *\n * @param[in]  data     A pointer to a uint32_t where to store the data.\n *\n * @returns             0 if there is not enough data in buffer, 4 otherwise.\n */\nint ssh_buffer_get_u32(struct ssh_buffer_struct *buffer, uint32_t *data){\n    return ssh_buffer_get_data(buffer,data,sizeof(uint32_t));\n}\n/**\n * @internal\n *\n * @brief Get a 64 bits unsigned int out of the buffer and adjusts the read\n * pointer.\n *\n * @param[in]  buffer   The buffer to read.\n *\n * @param[in]  data     A pointer to a uint64_t where to store the data.\n *\n * @returns             0 if there is not enough data in buffer, 8 otherwise.\n */\nint ssh_buffer_get_u64(struct ssh_buffer_struct *buffer, uint64_t *data){\n    return ssh_buffer_get_data(buffer,data,sizeof(uint64_t));\n}\n\n/**\n * @brief Valdiates that the given length can be obtained from the buffer.\n *\n * @param[in]  buffer  The buffer to read from.\n *\n * @param[in]  len     The length to be checked.\n *\n * @return             SSH_OK if the length is valid, SSH_ERROR otherwise.\n */\nint ssh_buffer_validate_length(struct ssh_buffer_struct *buffer, size_t len)\n{\n    if (buffer->pos + len < len || buffer->pos + len > buffer->used) {\n        return SSH_ERROR;\n    }\n\n    return SSH_OK;\n}\n\n/**\n * @internal\n *\n * @brief Get a SSH String out of the buffer and adjusts the read pointer.\n *\n * @param[in]  buffer   The buffer to read.\n *\n * @returns             The SSH String, NULL on error.\n */\nstruct ssh_string_struct *\nssh_buffer_get_ssh_string(struct ssh_buffer_struct *buffer)\n{\n    uint32_t stringlen;\n    uint32_t hostlen;\n    struct ssh_string_struct *str = NULL;\n    int rc;\n\n    rc = ssh_buffer_get_u32(buffer, &stringlen);\n    if (rc == 0) {\n        return NULL;\n    }\n    hostlen = ntohl(stringlen);\n    /* verify if there is enough space in buffer to get it */\n    rc = ssh_buffer_validate_length(buffer, hostlen);\n    if (rc != SSH_OK) {\n      return NULL; /* it is indeed */\n    }\n    str = ssh_string_new(hostlen);\n    if (str == NULL) {\n        return NULL;\n    }\n\n    stringlen = ssh_buffer_get_data(buffer, ssh_string_data(str), hostlen);\n    if (stringlen != hostlen) {\n        /* should never happen */\n        SAFE_FREE(str);\n        return NULL;\n    }\n\n    return str;\n}\n\n/**\n * @brief Pre-calculate the size we need for packing the buffer.\n *\n * This makes sure that enough memory is allocated for packing the buffer and\n * we only have to do one memory allocation.\n *\n * @param[in]  buffer    The buffer to allocate\n *\n * @param[in]  format    A format string of arguments.\n *\n * @param[in]  argc      The number of arguments.\n *\n * @param[in]  ap        The va_list of arguments.\n *\n * @return SSH_OK on success, SSH_ERROR on error.\n */\nstatic int ssh_buffer_pack_allocate_va(struct ssh_buffer_struct *buffer,\n                                       const char *format,\n                                       size_t argc,\n                                       va_list ap)\n{\n    const char *p = NULL;\n    ssh_string string = NULL;\n    char *cstring = NULL;\n    size_t needed_size = 0;\n    size_t len;\n    size_t count;\n    int rc = SSH_OK;\n\n    for (p = format, count = 0; *p != '\\0'; p++, count++) {\n        /* Invalid number of arguments passed */\n        if (count > argc) {\n            return SSH_ERROR;\n        }\n\n        switch(*p) {\n        case 'b':\n            va_arg(ap, unsigned int);\n            needed_size += sizeof(uint8_t);\n            break;\n        case 'w':\n            va_arg(ap, unsigned int);\n            needed_size += sizeof(uint16_t);\n            break;\n        case 'd':\n            va_arg(ap, uint32_t);\n            needed_size += sizeof(uint32_t);\n            break;\n        case 'q':\n            va_arg(ap, uint64_t);\n            needed_size += sizeof(uint64_t);\n            break;\n        case 'S':\n            string = va_arg(ap, ssh_string);\n            needed_size += 4 + ssh_string_len(string);\n            string = NULL;\n            break;\n        case 's':\n            cstring = va_arg(ap, char *);\n            needed_size += sizeof(uint32_t) + strlen(cstring);\n            cstring = NULL;\n            break;\n        case 'P':\n            len = va_arg(ap, size_t);\n            needed_size += len;\n            va_arg(ap, void *);\n            count++; /* increase argument count */\n            break;\n        case 'B':\n            va_arg(ap, bignum);\n            /*\n             * Use a fixed size for a bignum\n             * (they should normaly be around 32)\n             */\n            needed_size += 64;\n            break;\n        case 't':\n            cstring = va_arg(ap, char *);\n            needed_size += strlen(cstring);\n            cstring = NULL;\n            break;\n        default:\n            SSH_LOG(SSH_LOG_WARN, \"Invalid buffer format %c\", *p);\n            rc = SSH_ERROR;\n        }\n        if (rc != SSH_OK){\n            break;\n        }\n    }\n\n    if (argc != count) {\n        return SSH_ERROR;\n    }\n\n    if (rc != SSH_ERROR){\n        /*\n         * Check if our canary is intact, if not, something really bad happened.\n         */\n        uint32_t canary = va_arg(ap, uint32_t);\n        if (canary != SSH_BUFFER_PACK_END) {\n            abort();\n        }\n    }\n\n    rc = ssh_buffer_allocate_size(buffer, needed_size);\n    if (rc != 0) {\n        return SSH_ERROR;\n    }\n\n    return SSH_OK;\n}\n\n/** @internal\n * @brief Add multiple values in a buffer on a single function call\n * @param[in] buffer    The buffer to add to\n * @param[in] format    A format string of arguments.\n * @param[in] ap        A va_list of arguments.\n * @returns             SSH_OK on success\n *                      SSH_ERROR on error\n * @see ssh_buffer_add_format() for format list values.\n */\nint ssh_buffer_pack_va(struct ssh_buffer_struct *buffer,\n                       const char *format,\n                       size_t argc,\n                       va_list ap)\n{\n    int rc = SSH_ERROR;\n    const char *p;\n    union {\n        uint8_t byte;\n        uint16_t word;\n        uint32_t dword;\n        uint64_t qword;\n        ssh_string string;\n        void *data;\n    } o;\n    char *cstring;\n    bignum b;\n    size_t len;\n    size_t count;\n\n    if (argc > 256) {\n        return SSH_ERROR;\n    }\n\n    for (p = format, count = 0; *p != '\\0'; p++, count++) {\n        /* Invalid number of arguments passed */\n        if (count > argc) {\n            return SSH_ERROR;\n        }\n\n        switch(*p) {\n        case 'b':\n            o.byte = (uint8_t)va_arg(ap, unsigned int);\n            rc = ssh_buffer_add_u8(buffer, o.byte);\n            break;\n        case 'w':\n            o.word = (uint16_t)va_arg(ap, unsigned int);\n            o.word = htons(o.word);\n            rc = ssh_buffer_add_u16(buffer, o.word);\n            break;\n        case 'd':\n            o.dword = va_arg(ap, uint32_t);\n            o.dword = htonl(o.dword);\n            rc = ssh_buffer_add_u32(buffer, o.dword);\n            break;\n        case 'q':\n            o.qword = va_arg(ap, uint64_t);\n            o.qword = htonll(o.qword);\n            rc = ssh_buffer_add_u64(buffer, o.qword);\n            break;\n        case 'S':\n            o.string = va_arg(ap, ssh_string);\n            rc = ssh_buffer_add_ssh_string(buffer, o.string);\n            o.string = NULL;\n            break;\n        case 's':\n            cstring = va_arg(ap, char *);\n            len = strlen(cstring);\n            rc = ssh_buffer_add_u32(buffer, htonl(len));\n            if (rc == SSH_OK){\n                rc = ssh_buffer_add_data(buffer, cstring, len);\n            }\n            cstring = NULL;\n            break;\n        case 'P':\n            len = va_arg(ap, size_t);\n\n            o.data = va_arg(ap, void *);\n            count++; /* increase argument count */\n\n            rc = ssh_buffer_add_data(buffer, o.data, len);\n            o.data = NULL;\n            break;\n        case 'B':\n            b = va_arg(ap, bignum);\n            o.string = ssh_make_bignum_string(b);\n            if(o.string == NULL){\n                rc = SSH_ERROR;\n                break;\n            }\n            rc = ssh_buffer_add_ssh_string(buffer, o.string);\n            SAFE_FREE(o.string);\n            break;\n        case 't':\n            cstring = va_arg(ap, char *);\n            len = strlen(cstring);\n            rc = ssh_buffer_add_data(buffer, cstring, len);\n            cstring = NULL;\n            break;\n        default:\n            SSH_LOG(SSH_LOG_WARN, \"Invalid buffer format %c\", *p);\n            rc = SSH_ERROR;\n        }\n        if (rc != SSH_OK){\n            break;\n        }\n    }\n\n    if (argc != count) {\n        return SSH_ERROR;\n    }\n\n    if (rc != SSH_ERROR){\n        /* Check if our canary is intact, if not something really bad happened */\n        uint32_t canary = va_arg(ap, uint32_t);\n        if (canary != SSH_BUFFER_PACK_END) {\n            abort();\n        }\n    }\n    return rc;\n}\n\n/** @internal\n * @brief Add multiple values in a buffer on a single function call\n * @param[in] buffer    The buffer to add to\n * @param[in] format    A format string of arguments. This string contains single\n *                      letters describing the order and type of arguments:\n *                         'b': uint8_t  (pushed in network byte order)\n *                         'w': uint16_t (pushed in network byte order)\n *                         'd': uint32_t (pushed in network byte order)\n *                         'q': uint64_t (pushed in network byte order)\n *                         'S': ssh_string\n *                         's': char * (C string, pushed as SSH string)\n *                         't': char * (C string, pushed as free text)\n *                         'P': size_t, void * (len of data, pointer to data)\n *                              only pushes data.\n *                         'B': bignum (pushed as SSH string)\n * @returns             SSH_OK on success\n *                      SSH_ERROR on error\n * @warning             when using 'P' with a constant size (e.g. 8), do not\n *                      forget to cast to (size_t).\n */\nint _ssh_buffer_pack(struct ssh_buffer_struct *buffer,\n                     const char *format,\n                     size_t argc,\n                     ...)\n{\n    va_list ap;\n    int rc;\n\n    if (argc > 256) {\n        return SSH_ERROR;\n    }\n\n    va_start(ap, argc);\n    rc = ssh_buffer_pack_allocate_va(buffer, format, argc, ap);\n    va_end(ap);\n\n    if (rc != SSH_OK) {\n        return rc;\n    }\n\n    va_start(ap, argc);\n    rc = ssh_buffer_pack_va(buffer, format, argc, ap);\n    va_end(ap);\n\n    return rc;\n}\n\n/** @internal\n * @brief Get multiple values from a buffer on a single function call\n * @param[in] buffer    The buffer to get from\n * @param[in] format    A format string of arguments.\n * @param[in] ap        A va_list of arguments.\n * @returns             SSH_OK on success\n *                      SSH_ERROR on error\n * @see ssh_buffer_get_format() for format list values.\n */\nint ssh_buffer_unpack_va(struct ssh_buffer_struct *buffer,\n                         const char *format,\n                         size_t argc,\n                         va_list ap)\n{\n    int rc = SSH_ERROR;\n    const char *p = format, *last;\n    union {\n        uint8_t *byte;\n        uint16_t *word;\n        uint32_t *dword;\n        uint64_t *qword;\n        ssh_string *string;\n        char **cstring;\n        bignum *bignum;\n        void **data;\n    } o;\n    size_t len, rlen, max_len;\n    ssh_string tmp_string = NULL;\n    va_list ap_copy;\n    size_t count;\n\n    max_len = ssh_buffer_get_len(buffer);\n\n    /* copy the argument list in case a rollback is needed */\n    va_copy(ap_copy, ap);\n\n    if (argc > 256) {\n        rc = SSH_ERROR;\n        goto cleanup;\n    }\n\n    for (count = 0; *p != '\\0'; p++, count++) {\n        /* Invalid number of arguments passed */\n        if (count > argc) {\n            rc = SSH_ERROR;\n            goto cleanup;\n        }\n\n        rc = SSH_ERROR;\n        switch (*p) {\n        case 'b':\n            o.byte = va_arg(ap, uint8_t *);\n            rlen = ssh_buffer_get_u8(buffer, o.byte);\n            rc = rlen==1 ? SSH_OK : SSH_ERROR;\n            break;\n        case 'w':\n            o.word = va_arg(ap,  uint16_t *);\n            rlen = ssh_buffer_get_data(buffer, o.word, sizeof(uint16_t));\n            if (rlen == 2) {\n                *o.word = ntohs(*o.word);\n                rc = SSH_OK;\n            }\n            break;\n        case 'd':\n            o.dword = va_arg(ap, uint32_t *);\n            rlen = ssh_buffer_get_u32(buffer, o.dword);\n            if (rlen == 4) {\n                *o.dword = ntohl(*o.dword);\n                rc = SSH_OK;\n            }\n            break;\n        case 'q':\n            o.qword = va_arg(ap, uint64_t*);\n            rlen = ssh_buffer_get_u64(buffer, o.qword);\n            if (rlen == 8) {\n                *o.qword = ntohll(*o.qword);\n                rc = SSH_OK;\n            }\n            break;\n        case 'B':\n            o.bignum = va_arg(ap, bignum *);\n            *o.bignum = NULL;\n            tmp_string = ssh_buffer_get_ssh_string(buffer);\n            if (tmp_string == NULL) {\n                break;\n            }\n            *o.bignum = ssh_make_string_bn(tmp_string);\n            ssh_string_burn(tmp_string);\n            SSH_STRING_FREE(tmp_string);\n            rc = (*o.bignum != NULL) ? SSH_OK : SSH_ERROR;\n            break;\n        case 'S':\n            o.string = va_arg(ap, ssh_string *);\n            *o.string = ssh_buffer_get_ssh_string(buffer);\n            rc = *o.string != NULL ? SSH_OK : SSH_ERROR;\n            o.string = NULL;\n            break;\n        case 's': {\n            uint32_t u32len = 0;\n\n            o.cstring = va_arg(ap, char **);\n            *o.cstring = NULL;\n            rlen = ssh_buffer_get_u32(buffer, &u32len);\n            if (rlen != 4){\n                break;\n            }\n            len = ntohl(u32len);\n            if (len > max_len - 1) {\n                break;\n            }\n\n            rc = ssh_buffer_validate_length(buffer, len);\n            if (rc != SSH_OK) {\n                break;\n            }\n\n            *o.cstring = malloc(len + 1);\n            if (*o.cstring == NULL){\n                rc = SSH_ERROR;\n                break;\n            }\n            rlen = ssh_buffer_get_data(buffer, *o.cstring, len);\n            if (rlen != len){\n                SAFE_FREE(*o.cstring);\n                rc = SSH_ERROR;\n                break;\n            }\n            (*o.cstring)[len] = '\\0';\n            o.cstring = NULL;\n            rc = SSH_OK;\n            break;\n        }\n        case 'P':\n            len = va_arg(ap, size_t);\n            if (len > max_len - 1) {\n                rc = SSH_ERROR;\n                break;\n            }\n\n            rc = ssh_buffer_validate_length(buffer, len);\n            if (rc != SSH_OK) {\n                break;\n            }\n\n            o.data = va_arg(ap, void **);\n            count++;\n\n            *o.data = malloc(len);\n            if(*o.data == NULL){\n                rc = SSH_ERROR;\n                break;\n            }\n            rlen = ssh_buffer_get_data(buffer, *o.data, len);\n            if (rlen != len){\n                SAFE_FREE(*o.data);\n                rc = SSH_ERROR;\n                break;\n            }\n            o.data = NULL;\n            rc = SSH_OK;\n            break;\n        default:\n            SSH_LOG(SSH_LOG_WARN, \"Invalid buffer format %c\", *p);\n        }\n        if (rc != SSH_OK) {\n            break;\n        }\n    }\n\n    if (argc != count) {\n        rc = SSH_ERROR;\n    }\n\ncleanup:\n    if (rc != SSH_ERROR){\n        /* Check if our canary is intact, if not something really bad happened */\n        uint32_t canary = va_arg(ap, uint32_t);\n        if (canary != SSH_BUFFER_PACK_END){\n            abort();\n        }\n    }\n\n    if (rc != SSH_OK){\n        /* Reset the format string and erase everything that was allocated */\n        last = p;\n        for(p=format;p<last;++p){\n            switch(*p){\n            case 'b':\n                o.byte = va_arg(ap_copy, uint8_t *);\n                if (buffer->secure) {\n                    explicit_bzero(o.byte, sizeof(uint8_t));\n                    break;\n                }\n                break;\n            case 'w':\n                o.word = va_arg(ap_copy, uint16_t *);\n                if (buffer->secure) {\n                    explicit_bzero(o.word, sizeof(uint16_t));\n                    break;\n                }\n                break;\n            case 'd':\n                o.dword = va_arg(ap_copy, uint32_t *);\n                if (buffer->secure) {\n                    explicit_bzero(o.dword, sizeof(uint32_t));\n                    break;\n                }\n                break;\n            case 'q':\n                o.qword = va_arg(ap_copy, uint64_t *);\n                if (buffer->secure) {\n                    explicit_bzero(o.qword, sizeof(uint64_t));\n                    break;\n                }\n                break;\n            case 'B':\n                o.bignum = va_arg(ap_copy, bignum *);\n                bignum_safe_free(*o.bignum);\n                break;\n            case 'S':\n                o.string = va_arg(ap_copy, ssh_string *);\n                if (buffer->secure) {\n                    ssh_string_burn(*o.string);\n                }\n                SAFE_FREE(*o.string);\n                break;\n            case 's':\n                o.cstring = va_arg(ap_copy, char **);\n                if (buffer->secure) {\n                    explicit_bzero(*o.cstring, strlen(*o.cstring));\n                }\n                SAFE_FREE(*o.cstring);\n                break;\n            case 'P':\n                len = va_arg(ap_copy, size_t);\n                o.data = va_arg(ap_copy, void **);\n                if (buffer->secure) {\n                    explicit_bzero(*o.data, len);\n                }\n                SAFE_FREE(*o.data);\n                break;\n            default:\n                (void)va_arg(ap_copy, void *);\n                break;\n            }\n        }\n    }\n    va_end(ap_copy);\n\n    return rc;\n}\n\n/** @internal\n * @brief Get multiple values from a buffer on a single function call\n * @param[in] buffer    The buffer to get from\n * @param[in] format    A format string of arguments. This string contains single\n *                      letters describing the order and type of arguments:\n *                         'b': uint8_t *  (pulled in network byte order)\n *                         'w': uint16_t * (pulled in network byte order)\n *                         'd': uint32_t * (pulled in network byte order)\n *                         'q': uint64_t * (pulled in network byte order)\n *                         'S': ssh_string *\n *                         's': char ** (C string, pulled as SSH string)\n *                         'P': size_t, void ** (len of data, pointer to data)\n *                              only pulls data.\n *                         'B': bignum * (pulled as SSH string)\n * @returns             SSH_OK on success\n *                      SSH_ERROR on error\n * @warning             when using 'P' with a constant size (e.g. 8), do not\n *                      forget to cast to (size_t).\n */\nint _ssh_buffer_unpack(struct ssh_buffer_struct *buffer,\n                       const char *format,\n                       size_t argc,\n                       ...)\n{\n    va_list ap;\n    int rc;\n\n    va_start(ap, argc);\n    rc = ssh_buffer_unpack_va(buffer, format, argc, ap);\n    va_end(ap);\n    return rc;\n}\n\n/** @} */\n"
  },
  {
    "path": "src/libssh/src/callbacks.c",
    "content": "/*\n * callbacks.c - callback functions\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2009-2013  by Andreas Schneider <asn@cryptomilk.org>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include \"libssh/callbacks.h\"\n#include \"libssh/session.h\"\n#include \"libssh/misc.h\"\n\n#define is_callback_valid(session, cb) \\\n    (cb->size <= 0 || cb->size > 1024 * sizeof(void *))\n\n/* LEGACY */\nstatic void ssh_legacy_log_callback(int priority,\n                                    const char *function,\n                                    const char *buffer,\n                                    void *userdata)\n{\n    ssh_session session = (ssh_session)userdata;\n    ssh_log_callback log_fn = session->common.callbacks->log_function;\n    void *log_data = session->common.callbacks->userdata;\n\n    (void)function; /* unused */\n\n    log_fn(session, priority, buffer, log_data);\n}\n\nint ssh_set_callbacks(ssh_session session, ssh_callbacks cb) {\n  if (session == NULL || cb == NULL) {\n    return SSH_ERROR;\n  }\n\n  if (is_callback_valid(session, cb)) {\n      ssh_set_error(session,\n                    SSH_FATAL,\n                    \"Invalid callback passed in (badly initialized)\");\n      return SSH_ERROR;\n  };\n  session->common.callbacks = cb;\n\n  /* LEGACY */\n  if (ssh_get_log_callback() == NULL && cb->log_function) {\n      ssh_set_log_callback(ssh_legacy_log_callback);\n      ssh_set_log_userdata(session);\n  }\n\n  return 0;\n}\n\nstatic int ssh_add_set_channel_callbacks(ssh_channel channel,\n                                         ssh_channel_callbacks cb,\n                                         int prepend)\n{\n    ssh_session session = NULL;\n    int rc;\n\n    if (channel == NULL || cb == NULL) {\n      return SSH_ERROR;\n    }\n    session = channel->session;\n\n    if (is_callback_valid(session, cb)) {\n        ssh_set_error(session,\n                      SSH_FATAL,\n                      \"Invalid callback passed in (badly initialized)\");\n        return SSH_ERROR;\n    };\n    if (channel->callbacks == NULL) {\n        channel->callbacks = ssh_list_new();\n        if (channel->callbacks == NULL){\n            ssh_set_error_oom(session);\n            return SSH_ERROR;\n        }\n    }\n    if (prepend) {\n        rc = ssh_list_prepend(channel->callbacks, cb);\n    } else {\n        rc = ssh_list_append(channel->callbacks, cb);\n    }\n\n    return rc;\n}\n\nint ssh_set_channel_callbacks(ssh_channel channel, ssh_channel_callbacks cb)\n{\n    return ssh_add_set_channel_callbacks(channel, cb, 1);\n}\n\nint ssh_add_channel_callbacks(ssh_channel channel, ssh_channel_callbacks cb)\n{\n    return ssh_add_set_channel_callbacks(channel, cb, 0);\n}\n\nint ssh_remove_channel_callbacks(ssh_channel channel, ssh_channel_callbacks cb)\n{\n    struct ssh_iterator *it;\n\n    if (channel == NULL || channel->callbacks == NULL){\n        return SSH_ERROR;\n    }\n\n    it = ssh_list_find(channel->callbacks, cb);\n    if (it == NULL){\n        return SSH_ERROR;\n    }\n\n    ssh_list_remove(channel->callbacks, it);\n\n    return SSH_OK;\n}\n\n\nint ssh_set_server_callbacks(ssh_session session, ssh_server_callbacks cb){\n\tif (session == NULL || cb == NULL) {\n\t\treturn SSH_ERROR;\n\t}\n\n    if (is_callback_valid(session, cb)) {\n        ssh_set_error(session,\n                      SSH_FATAL,\n                      \"Invalid callback passed in (badly initialized)\");\n        return SSH_ERROR;\n    };\n\tsession->server_callbacks = cb;\n\n\treturn 0;\n}\n"
  },
  {
    "path": "src/libssh/src/chachapoly.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2015 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include \"libssh/libssh.h\"\n#include \"libssh/crypto.h\"\n#include \"libssh/chacha.h\"\n#include \"libssh/poly1305.h\"\n#include \"libssh/misc.h\"\n\n/* size of the keys k1 and k2 as defined in specs */\n#define CHACHA20_KEYLEN 32\nstruct chacha20_poly1305_keysched {\n    /* key used for encrypting the length field*/\n    struct chacha_ctx k1;\n    /* key used for encrypting the packets */\n    struct chacha_ctx k2;\n};\n\n#pragma pack(push, 1)\nstruct ssh_packet_header {\n    uint32_t length;\n    uint8_t payload[];\n};\n#pragma pack(pop)\n\nstatic const uint8_t zero_block_counter[8] = {0, 0, 0, 0, 0, 0, 0, 0};\nstatic const uint8_t payload_block_counter[8] = {1, 0, 0, 0, 0, 0, 0, 0};\n\nstatic int chacha20_set_encrypt_key(struct ssh_cipher_struct *cipher,\n                                    void *key,\n                                    void *IV)\n{\n    struct chacha20_poly1305_keysched *sched;\n    uint8_t *u8key = key;\n    (void)IV;\n\n    if (cipher->chacha20_schedule == NULL) {\n        sched = malloc(sizeof *sched);\n        if (sched == NULL){\n            return -1;\n        }\n    } else {\n        sched = cipher->chacha20_schedule;\n    }\n\n    chacha_keysetup(&sched->k2, u8key, CHACHA20_KEYLEN * 8);\n    chacha_keysetup(&sched->k1, u8key + CHACHA20_KEYLEN, CHACHA20_KEYLEN * 8);\n    cipher->chacha20_schedule = sched;\n\n    return 0;\n}\n\n/**\n * @internal\n *\n * @brief encrypts an outgoing packet with chacha20 and authenticate it\n * with poly1305.\n */\nstatic void chacha20_poly1305_aead_encrypt(struct ssh_cipher_struct *cipher,\n                                           void *in,\n                                           void *out,\n                                           size_t len,\n                                           uint8_t *tag,\n                                           uint64_t seq)\n{\n    struct ssh_packet_header *in_packet = in, *out_packet = out;\n    uint8_t poly1305_ctx[POLY1305_KEYLEN] = {0};\n    struct chacha20_poly1305_keysched *keys = cipher->chacha20_schedule;\n\n    seq = htonll(seq);\n    /* step 1, prepare the poly1305 key */\n    chacha_ivsetup(&keys->k2, (uint8_t *)&seq, zero_block_counter);\n    chacha_encrypt_bytes(&keys->k2,\n                         poly1305_ctx,\n                         poly1305_ctx,\n                         POLY1305_KEYLEN);\n\n    /* step 2, encrypt length field */\n    chacha_ivsetup(&keys->k1, (uint8_t *)&seq, zero_block_counter);\n    chacha_encrypt_bytes(&keys->k1,\n                         (uint8_t *)&in_packet->length,\n                         (uint8_t *)&out_packet->length,\n                         sizeof(uint32_t));\n\n    /* step 3, encrypt packet payload */\n    chacha_ivsetup(&keys->k2, (uint8_t *)&seq, payload_block_counter);\n    chacha_encrypt_bytes(&keys->k2,\n                         in_packet->payload,\n                         out_packet->payload,\n                         len - sizeof(uint32_t));\n\n    /* ssh_log_hexdump(\"poly1305_ctx\", poly1305_ctx, sizeof(poly1305_ctx)); */\n    /* step 4, compute the MAC */\n    poly1305_auth(tag, (uint8_t *)out_packet, len, poly1305_ctx);\n    /* ssh_log_hexdump(\"poly1305 src\", (uint8_t *)out_packet, len);\n    ssh_log_hexdump(\"poly1305 tag\", tag, POLY1305_TAGLEN); */\n}\n\nstatic int chacha20_poly1305_aead_decrypt_length(\n        struct ssh_cipher_struct *cipher,\n        void *in,\n        uint8_t *out,\n        size_t len,\n        uint64_t seq)\n{\n    struct chacha20_poly1305_keysched *keys = cipher->chacha20_schedule;\n\n    if (len < sizeof(uint32_t)) {\n        return SSH_ERROR;\n    }\n    seq = htonll(seq);\n\n    chacha_ivsetup(&keys->k1, (uint8_t *)&seq, zero_block_counter);\n    chacha_encrypt_bytes(&keys->k1,\n                         in,\n                         (uint8_t *)out,\n                         sizeof(uint32_t));\n    return SSH_OK;\n}\n\nstatic int chacha20_poly1305_aead_decrypt(struct ssh_cipher_struct *cipher,\n                                          void *complete_packet,\n                                          uint8_t *out,\n                                          size_t encrypted_size,\n                                          uint64_t seq)\n{\n    uint8_t poly1305_ctx[POLY1305_KEYLEN] = {0};\n    uint8_t tag[POLY1305_TAGLEN] = {0};\n    struct chacha20_poly1305_keysched *keys = cipher->chacha20_schedule;\n    uint8_t *mac = (uint8_t *)complete_packet + sizeof(uint32_t) + encrypted_size;\n    int cmp;\n\n    seq = htonll(seq);\n\n    ZERO_STRUCT(poly1305_ctx);\n    chacha_ivsetup(&keys->k2, (uint8_t *)&seq, zero_block_counter);\n    chacha_encrypt_bytes(&keys->k2,\n                         poly1305_ctx,\n                         poly1305_ctx,\n                         POLY1305_KEYLEN);\n#if 0\n    ssh_log_hexdump(\"poly1305_ctx\", poly1305_ctx, sizeof(poly1305_ctx));\n#endif\n\n    poly1305_auth(tag, (uint8_t *)complete_packet, encrypted_size +\n            sizeof(uint32_t), poly1305_ctx);\n#if 0\n    ssh_log_hexdump(\"poly1305 src\",\n                   (uint8_t*)complete_packet,\n                   encrypted_size + 4);\n    ssh_log_hexdump(\"poly1305 tag\", tag, POLY1305_TAGLEN);\n    ssh_log_hexdump(\"received tag\", mac, POLY1305_TAGLEN);\n#endif\n\n    cmp = memcmp(tag, mac, POLY1305_TAGLEN);\n    if(cmp != 0) {\n        /* mac error */\n        SSH_LOG(SSH_LOG_PACKET,\"poly1305 verify error\");\n        return SSH_ERROR;\n    }\n    chacha_ivsetup(&keys->k2, (uint8_t *)&seq, payload_block_counter);\n    chacha_encrypt_bytes(&keys->k2,\n                         (uint8_t *)complete_packet + sizeof(uint32_t),\n                         out,\n                         encrypted_size);\n\n    return SSH_OK;\n}\n\nstatic void chacha20_cleanup(struct ssh_cipher_struct *cipher) {\n    SAFE_FREE(cipher->chacha20_schedule);\n}\n\nconst struct ssh_cipher_struct chacha20poly1305_cipher = {\n    .ciphertype = SSH_AEAD_CHACHA20_POLY1305,\n    .name = \"chacha20-poly1305@openssh.com\",\n    .blocksize = 8,\n    .lenfield_blocksize = 4,\n    .keylen = sizeof(struct chacha20_poly1305_keysched),\n    .keysize = 512,\n    .tag_size = POLY1305_TAGLEN,\n    .set_encrypt_key = chacha20_set_encrypt_key,\n    .set_decrypt_key = chacha20_set_encrypt_key,\n    .aead_encrypt = chacha20_poly1305_aead_encrypt,\n    .aead_decrypt_length = chacha20_poly1305_aead_decrypt_length,\n    .aead_decrypt = chacha20_poly1305_aead_decrypt,\n    .cleanup = chacha20_cleanup\n};\n\nconst struct ssh_cipher_struct *ssh_get_chacha20poly1305_cipher(void)\n{\n    return &chacha20poly1305_cipher;\n}\n"
  },
  {
    "path": "src/libssh/src/channels.c",
    "content": "/*\n * channels.c - SSH channel functions\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2003-2013 by Aris Adamantiadis\n * Copyright (c) 2009-2013 by Andreas Schneider <asn@cryptomilk.org>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <limits.h>\n#include <stdio.h>\n#include <errno.h>\n#include <time.h>\n#include <stdbool.h>\n\n#ifndef _WIN32\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#endif\n\n#include \"libssh/priv.h\"\n#include \"libssh/ssh2.h\"\n#include \"libssh/buffer.h\"\n#include \"libssh/packet.h\"\n#include \"libssh/socket.h\"\n#include \"libssh/channels.h\"\n#include \"libssh/session.h\"\n#include \"libssh/misc.h\"\n#include \"libssh/messages.h\"\n#if WITH_SERVER\n#include \"libssh/server.h\"\n#endif\n\n#define WINDOWBASE 1280000\n#define WINDOWLIMIT (WINDOWBASE/2)\n\n/*\n * All implementations MUST be able to process packets with an\n * uncompressed payload length of 32768 bytes or less and a total packet\n * size of 35000 bytes or less.\n */\n#define CHANNEL_MAX_PACKET 32768\n#define CHANNEL_INITIAL_WINDOW 64000\n\n/**\n * @defgroup libssh_channel The SSH channel functions\n * @ingroup libssh\n *\n * Functions that manage a SSH channel.\n *\n * @{\n */\n\nstatic ssh_channel channel_from_msg(ssh_session session, ssh_buffer packet);\n\n/**\n * @brief Allocate a new channel.\n *\n * @param[in]  session  The ssh session to use.\n *\n * @return              A pointer to a newly allocated channel, NULL on error.\n */\nssh_channel ssh_channel_new(ssh_session session)\n{\n    ssh_channel channel = NULL;\n\n    if (session == NULL) {\n        return NULL;\n    }\n\n    /* Check if we have an authenticated session */\n    if (!(session->flags & SSH_SESSION_FLAG_AUTHENTICATED)) {\n        return NULL;\n    }\n\n    channel = calloc(1, sizeof(struct ssh_channel_struct));\n    if (channel == NULL) {\n        ssh_set_error_oom(session);\n        return NULL;\n    }\n\n    channel->stdout_buffer = ssh_buffer_new();\n    if (channel->stdout_buffer == NULL) {\n        ssh_set_error_oom(session);\n        SAFE_FREE(channel);\n        return NULL;\n    }\n\n    channel->stderr_buffer = ssh_buffer_new();\n    if (channel->stderr_buffer == NULL) {\n        ssh_set_error_oom(session);\n        SSH_BUFFER_FREE(channel->stdout_buffer);\n        SAFE_FREE(channel);\n        return NULL;\n    }\n\n    channel->session = session;\n    channel->exit_status = -1;\n    channel->flags = SSH_CHANNEL_FLAG_NOT_BOUND;\n\n    if (session->channels == NULL) {\n        session->channels = ssh_list_new();\n    }\n\n    ssh_list_prepend(session->channels, channel);\n\n    /* Set states explicitly */\n    channel->state = SSH_CHANNEL_STATE_NOT_OPEN;\n    channel->request_state = SSH_CHANNEL_REQ_STATE_NONE;\n\n    return channel;\n}\n\n/**\n * @internal\n *\n * @brief Create a new channel identifier.\n *\n * @param[in]  session  The SSH session to use.\n *\n * @return              The new channel identifier.\n */\nuint32_t ssh_channel_new_id(ssh_session session) {\n  return ++(session->maxchannel);\n}\n\n/**\n * @internal\n *\n * @brief Handle a SSH_PACKET_CHANNEL_OPEN_CONFIRMATION packet.\n *\n * Constructs the channel object.\n */\nSSH_PACKET_CALLBACK(ssh_packet_channel_open_conf){\n  uint32_t channelid=0;\n  ssh_channel channel;\n  int rc;\n  (void)type;\n  (void)user;\n\n  SSH_LOG(SSH_LOG_PACKET,\"Received SSH2_MSG_CHANNEL_OPEN_CONFIRMATION\");\n\n  rc = ssh_buffer_unpack(packet, \"d\", &channelid);\n  if (rc != SSH_OK)\n      goto error;\n  channel=ssh_channel_from_local(session,channelid);\n  if(channel==NULL){\n    ssh_set_error(session, SSH_FATAL,\n        \"Unknown channel id %\"PRIu32,\n        (uint32_t) channelid);\n    /* TODO: Set error marking in channel object */\n\n    return SSH_PACKET_USED;\n  }\n\n  rc = ssh_buffer_unpack(packet, \"ddd\",\n          &channel->remote_channel,\n          &channel->remote_window,\n          &channel->remote_maxpacket);\n  if (rc != SSH_OK)\n      goto error;\n\n  SSH_LOG(SSH_LOG_PROTOCOL,\n      \"Received a CHANNEL_OPEN_CONFIRMATION for channel %d:%d\",\n      channel->local_channel,\n      channel->remote_channel);\n\n  if (channel->state != SSH_CHANNEL_STATE_OPENING) {\n      SSH_LOG(SSH_LOG_RARE,\n              \"SSH2_MSG_CHANNEL_OPEN_CONFIRMATION received in incorrect \"\n              \"channel state %d\",\n              channel->state);\n      goto error;\n  }\n\n  SSH_LOG(SSH_LOG_PROTOCOL,\n      \"Remote window : %\"PRIu32\", maxpacket : %\"PRIu32,\n      (uint32_t) channel->remote_window,\n      (uint32_t) channel->remote_maxpacket);\n\n  channel->state = SSH_CHANNEL_STATE_OPEN;\n  channel->flags &= ~SSH_CHANNEL_FLAG_NOT_BOUND;\n  return SSH_PACKET_USED;\n\nerror:\n  ssh_set_error(session, SSH_FATAL, \"Invalid packet\");\n  return SSH_PACKET_USED;\n}\n\n/**\n * @internal\n *\n * @brief Handle a SSH_CHANNEL_OPEN_FAILURE and set the state of the channel.\n */\nSSH_PACKET_CALLBACK(ssh_packet_channel_open_fail){\n\n  ssh_channel channel;\n  char *error = NULL;\n  uint32_t code;\n  int rc;\n  (void)user;\n  (void)type;\n\n  channel=channel_from_msg(session,packet);\n  if(channel==NULL){\n    SSH_LOG(SSH_LOG_RARE,\"Invalid channel in packet\");\n    return SSH_PACKET_USED;\n  }\n\n  rc = ssh_buffer_unpack(packet, \"ds\", &code, &error);\n  if (rc != SSH_OK){\n      ssh_set_error(session, SSH_FATAL, \"Invalid packet\");\n      return SSH_PACKET_USED;\n  }\n\n  if (channel->state != SSH_CHANNEL_STATE_OPENING) {\n      SSH_LOG(SSH_LOG_RARE,\n              \"SSH2_MSG_CHANNEL_OPEN_FAILURE received in incorrect channel \"\n              \"state %d\",\n              channel->state);\n      goto error;\n  }\n\n  ssh_set_error(session, SSH_REQUEST_DENIED,\n      \"Channel opening failure: channel %u error (%\"PRIu32\") %s\",\n      channel->local_channel,\n      (uint32_t) code,\n      error);\n  SAFE_FREE(error);\n  channel->state=SSH_CHANNEL_STATE_OPEN_DENIED;\n  return SSH_PACKET_USED;\n\nerror:\n  ssh_set_error(session, SSH_FATAL, \"Invalid packet\");\n  return SSH_PACKET_USED;\n}\n\nstatic int ssh_channel_open_termination(void *c){\n  ssh_channel channel = (ssh_channel) c;\n  if (channel->state != SSH_CHANNEL_STATE_OPENING ||\n      channel->session->session_state == SSH_SESSION_STATE_ERROR)\n    return 1;\n  else\n    return 0;\n}\n\n/**\n * @internal\n *\n * @brief Open a channel by sending a SSH_OPEN_CHANNEL message and\n *        wait for the reply.\n *\n * @param[in]  channel  The current channel.\n *\n * @param[in]  type   A C string describing the kind of channel (e.g. \"exec\").\n *\n * @param[in]  window   The receiving window of the channel. The window is the\n *                      maximum size of data that can stay in buffers and\n *                      network.\n *\n * @param[in]  maxpacket The maximum packet size allowed (like MTU).\n *\n * @param[in]  payload   The buffer containing additional payload for the query.\n *\n * @return             SSH_OK if successful; SSH_ERROR otherwise.\n */\nstatic int\nchannel_open(ssh_channel channel,\n             const char *type,\n             uint32_t window,\n             uint32_t maxpacket,\n             ssh_buffer payload)\n{\n    ssh_session session = channel->session;\n    int err = SSH_ERROR;\n    int rc;\n\n    switch (channel->state) {\n    case SSH_CHANNEL_STATE_NOT_OPEN:\n        break;\n    case SSH_CHANNEL_STATE_OPENING:\n        goto pending;\n    case SSH_CHANNEL_STATE_OPEN:\n    case SSH_CHANNEL_STATE_CLOSED:\n    case SSH_CHANNEL_STATE_OPEN_DENIED:\n        goto end;\n    default:\n        ssh_set_error(session, SSH_FATAL, \"Bad state in channel_open: %d\",\n                      channel->state);\n    }\n\n    channel->local_channel = ssh_channel_new_id(session);\n    channel->local_maxpacket = maxpacket;\n    channel->local_window = window;\n\n    SSH_LOG(SSH_LOG_PROTOCOL,\n            \"Creating a channel %d with %d window and %d max packet\",\n            channel->local_channel, window, maxpacket);\n\n    rc = ssh_buffer_pack(session->out_buffer,\n                         \"bsddd\",\n                         SSH2_MSG_CHANNEL_OPEN,\n                         type,\n                         channel->local_channel,\n                         channel->local_window,\n                         channel->local_maxpacket);\n    if (rc != SSH_OK) {\n        ssh_set_error_oom(session);\n        return err;\n    }\n\n    if (payload != NULL) {\n        if (ssh_buffer_add_buffer(session->out_buffer, payload) < 0) {\n            ssh_set_error_oom(session);\n\n            return err;\n        }\n    }\n    channel->state = SSH_CHANNEL_STATE_OPENING;\n    if (ssh_packet_send(session) == SSH_ERROR) {\n        return err;\n    }\n\n    SSH_LOG(SSH_LOG_PACKET,\n            \"Sent a SSH_MSG_CHANNEL_OPEN type %s for channel %d\",\n            type, channel->local_channel);\n\npending:\n    /* wait until channel is opened by server */\n    err = ssh_handle_packets_termination(session,\n                                         SSH_TIMEOUT_DEFAULT,\n                                         ssh_channel_open_termination,\n                                         channel);\n\n    if (session->session_state == SSH_SESSION_STATE_ERROR) {\n        err = SSH_ERROR;\n    }\n\nend:\n    /* This needs to pass the SSH_AGAIN from the above,\n     * but needs to catch failed channel states */\n    if (channel->state == SSH_CHANNEL_STATE_OPEN) {\n        err = SSH_OK;\n    } else if (err != SSH_AGAIN) {\n        /* Messages were handled correctly, but he channel state is invalid */\n        err = SSH_ERROR;\n    }\n\n    return err;\n}\n\n/* return channel with corresponding local id, or NULL if not found */\nssh_channel ssh_channel_from_local(ssh_session session, uint32_t id) {\n  struct ssh_iterator *it;\n  ssh_channel channel;\n\n  for (it = ssh_list_get_iterator(session->channels); it != NULL ; it=it->next) {\n    channel = ssh_iterator_value(ssh_channel, it);\n    if (channel == NULL) {\n      continue;\n    }\n    if (channel->local_channel == id) {\n      return channel;\n    }\n  }\n\n  return NULL;\n}\n\n/**\n * @internal\n * @brief grows the local window and send a packet to the other party\n * @param session SSH session\n * @param channel SSH channel\n * @param minimumsize The minimum acceptable size for the new window.\n * @return            SSH_OK if successful; SSH_ERROR otherwise.\n */\nstatic int grow_window(ssh_session session,\n                       ssh_channel channel,\n                       uint32_t minimumsize)\n{\n  uint32_t new_window = minimumsize > WINDOWBASE ? minimumsize : WINDOWBASE;\n  int rc;\n\n  if(new_window <= channel->local_window){\n    SSH_LOG(SSH_LOG_PROTOCOL,\n        \"growing window (channel %d:%d) to %d bytes : not needed (%d bytes)\",\n        channel->local_channel, channel->remote_channel, new_window,\n        channel->local_window);\n\n    return SSH_OK;\n  }\n  /* WINDOW_ADJUST packet needs a relative increment rather than an absolute\n   * value, so we give here the missing bytes needed to reach new_window\n   */\n  rc = ssh_buffer_pack(session->out_buffer,\n                       \"bdd\",\n                       SSH2_MSG_CHANNEL_WINDOW_ADJUST,\n                       channel->remote_channel,\n                       new_window - channel->local_window);\n  if (rc != SSH_OK) {\n    ssh_set_error_oom(session);\n    goto error;\n  }\n\n  if (ssh_packet_send(session) == SSH_ERROR) {\n    goto error;\n  }\n\n  SSH_LOG(SSH_LOG_PROTOCOL,\n      \"growing window (channel %d:%d) to %d bytes\",\n      channel->local_channel,\n      channel->remote_channel,\n      new_window);\n\n  channel->local_window = new_window;\n\n  return SSH_OK;\nerror:\n  ssh_buffer_reinit(session->out_buffer);\n\n  return SSH_ERROR;\n}\n\n/**\n * @internal\n *\n * @brief Parse a channel-related packet to resolve it to a ssh_channel.\n *\n * @param[in]  session  The current SSH session.\n *\n * @param[in]  packet   The buffer to parse packet from. The read pointer will\n *                      be moved after the call.\n *\n * @return              The related ssh_channel, or NULL if the channel is\n *                      unknown or the packet is invalid.\n */\nstatic ssh_channel channel_from_msg(ssh_session session, ssh_buffer packet) {\n  ssh_channel channel;\n  uint32_t chan;\n  int rc;\n\n  rc = ssh_buffer_unpack(packet,\"d\",&chan);\n  if (rc != SSH_OK) {\n    ssh_set_error(session, SSH_FATAL,\n        \"Getting channel from message: short read\");\n    return NULL;\n  }\n\n  channel = ssh_channel_from_local(session, chan);\n  if (channel == NULL) {\n    ssh_set_error(session, SSH_FATAL,\n        \"Server specified invalid channel %\"PRIu32,\n        (uint32_t) chan);\n  }\n\n  return channel;\n}\n\nSSH_PACKET_CALLBACK(channel_rcv_change_window) {\n  ssh_channel channel;\n  uint32_t bytes;\n  int rc;\n  (void)user;\n  (void)type;\n\n  channel = channel_from_msg(session,packet);\n  if (channel == NULL) {\n    SSH_LOG(SSH_LOG_FUNCTIONS, \"%s\", ssh_get_error(session));\n  }\n\n  rc = ssh_buffer_unpack(packet, \"d\", &bytes);\n  if (channel == NULL || rc != SSH_OK) {\n    SSH_LOG(SSH_LOG_PACKET,\n        \"Error getting a window adjust message: invalid packet\");\n\n    return SSH_PACKET_USED;\n  }\n\n  SSH_LOG(SSH_LOG_PROTOCOL,\n      \"Adding %d bytes to channel (%d:%d) (from %d bytes)\",\n      bytes,\n      channel->local_channel,\n      channel->remote_channel,\n      channel->remote_window);\n\n  channel->remote_window += bytes;\n\n  return SSH_PACKET_USED;\n}\n\n/* is_stderr is set to 1 if the data are extended, ie stderr */\nSSH_PACKET_CALLBACK(channel_rcv_data){\n  ssh_channel channel;\n  ssh_string str;\n  ssh_buffer buf;\n  size_t len;\n  int is_stderr;\n  int rest;\n  (void)user;\n\n  if(type==SSH2_MSG_CHANNEL_DATA)\n\t  is_stderr=0;\n  else\n\t  is_stderr=1;\n\n  channel = channel_from_msg(session,packet);\n  if (channel == NULL) {\n    SSH_LOG(SSH_LOG_FUNCTIONS,\n        \"%s\", ssh_get_error(session));\n\n    return SSH_PACKET_USED;\n  }\n\n  if (is_stderr) {\n    uint32_t ignore;\n    /* uint32 data type code. we can ignore it */\n    ssh_buffer_get_u32(packet, &ignore);\n  }\n\n  str = ssh_buffer_get_ssh_string(packet);\n  if (str == NULL) {\n    SSH_LOG(SSH_LOG_PACKET, \"Invalid data packet!\");\n\n    return SSH_PACKET_USED;\n  }\n  len = ssh_string_len(str);\n\n  SSH_LOG(SSH_LOG_PACKET,\n      \"Channel receiving %\" PRIdS \" bytes data in %d (local win=%d remote win=%d)\",\n      len,\n      is_stderr,\n      channel->local_window,\n      channel->remote_window);\n\n  /* What shall we do in this case? Let's accept it anyway */\n  if (len > channel->local_window) {\n    SSH_LOG(SSH_LOG_RARE,\n        \"Data packet too big for our window(%\" PRIdS \" vs %d)\",\n        len,\n        channel->local_window);\n  }\n\n  if (channel_default_bufferize(channel, ssh_string_data(str), len,\n        is_stderr) < 0) {\n    SSH_STRING_FREE(str);\n\n    return SSH_PACKET_USED;\n  }\n\n  if (len <= channel->local_window) {\n    channel->local_window -= len;\n  } else {\n    channel->local_window = 0; /* buggy remote */\n  }\n\n  SSH_LOG(SSH_LOG_PACKET,\n      \"Channel windows are now (local win=%d remote win=%d)\",\n      channel->local_window,\n      channel->remote_window);\n\n  SSH_STRING_FREE(str);\n\n  if (is_stderr) {\n      buf = channel->stderr_buffer;\n  } else {\n      buf = channel->stdout_buffer;\n  }\n\n  ssh_callbacks_iterate(channel->callbacks,\n                        ssh_channel_callbacks,\n                        channel_data_function) {\n      if (ssh_buffer_get(buf) == NULL) {\n          break;\n      }\n      rest = ssh_callbacks_iterate_exec(channel_data_function,\n                                        channel->session,\n                                        channel,\n                                        ssh_buffer_get(buf),\n                                        ssh_buffer_get_len(buf),\n                                        is_stderr);\n      if (rest > 0) {\n          if (channel->counter != NULL) {\n              channel->counter->in_bytes += rest;\n          }\n          ssh_buffer_pass_bytes(buf, rest);\n      }\n  }\n  ssh_callbacks_iterate_end();\n\n  if (channel->local_window + ssh_buffer_get_len(buf) < WINDOWLIMIT) {\n      if (grow_window(session, channel, 0) < 0) {\n          return -1;\n      }\n  }\n  return SSH_PACKET_USED;\n}\n\nSSH_PACKET_CALLBACK(channel_rcv_eof) {\n  ssh_channel channel;\n  (void)user;\n  (void)type;\n\n  channel = channel_from_msg(session,packet);\n  if (channel == NULL) {\n    SSH_LOG(SSH_LOG_FUNCTIONS, \"%s\", ssh_get_error(session));\n\n    return SSH_PACKET_USED;\n  }\n\n  SSH_LOG(SSH_LOG_PACKET,\n      \"Received eof on channel (%d:%d)\",\n      channel->local_channel,\n      channel->remote_channel);\n  /* channel->remote_window = 0; */\n  channel->remote_eof = 1;\n\n  ssh_callbacks_execute_list(channel->callbacks,\n                             ssh_channel_callbacks,\n                             channel_eof_function,\n                             channel->session,\n                             channel);\n\n  return SSH_PACKET_USED;\n}\n\nSSH_PACKET_CALLBACK(channel_rcv_close) {\n\tssh_channel channel;\n\t(void)user;\n\t(void)type;\n\n\tchannel = channel_from_msg(session,packet);\n\tif (channel == NULL) {\n\t\tSSH_LOG(SSH_LOG_FUNCTIONS, \"%s\", ssh_get_error(session));\n\n\t\treturn SSH_PACKET_USED;\n\t}\n\n\tSSH_LOG(SSH_LOG_PACKET,\n\t\t\t\"Received close on channel (%d:%d)\",\n\t\t\tchannel->local_channel,\n\t\t\tchannel->remote_channel);\n\n\tif ((channel->stdout_buffer &&\n\t\t\tssh_buffer_get_len(channel->stdout_buffer) > 0) ||\n\t\t\t(channel->stderr_buffer &&\n\t\t\t\t\tssh_buffer_get_len(channel->stderr_buffer) > 0)) {\n\t\tchannel->delayed_close = 1;\n\t} else {\n\t\tchannel->state = SSH_CHANNEL_STATE_CLOSED;\n\t}\n\tif (channel->remote_eof == 0) {\n\t\tSSH_LOG(SSH_LOG_PACKET,\n\t\t\t\t\"Remote host not polite enough to send an eof before close\");\n\t}\n\tchannel->remote_eof = 1;\n\t/*\n\t * The remote eof doesn't break things if there was still data into read\n\t * buffer because the eof is ignored until the buffer is empty.\n\t */\n\n    ssh_callbacks_execute_list(channel->callbacks,\n                               ssh_channel_callbacks,\n                               channel_close_function,\n                               channel->session,\n                               channel);\n\n\tchannel->flags |= SSH_CHANNEL_FLAG_CLOSED_REMOTE;\n\tif(channel->flags & SSH_CHANNEL_FLAG_FREED_LOCAL)\n\t  ssh_channel_do_free(channel);\n\n\treturn SSH_PACKET_USED;\n}\n\nSSH_PACKET_CALLBACK(channel_rcv_request) {\n\tssh_channel channel;\n\tchar *request=NULL;\n    uint8_t status;\n    int rc;\n\t(void)user;\n\t(void)type;\n\n\tchannel = channel_from_msg(session,packet);\n\tif (channel == NULL) {\n\t\tSSH_LOG(SSH_LOG_FUNCTIONS,\"%s\", ssh_get_error(session));\n\t\treturn SSH_PACKET_USED;\n\t}\n\n\trc = ssh_buffer_unpack(packet, \"sb\",\n\t        &request,\n\t        &status);\n\tif (rc != SSH_OK) {\n\t\tSSH_LOG(SSH_LOG_PACKET, \"Invalid MSG_CHANNEL_REQUEST\");\n\t\treturn SSH_PACKET_USED;\n\t}\n\n\tif (strcmp(request,\"exit-status\") == 0) {\n        SAFE_FREE(request);\n        rc = ssh_buffer_unpack(packet, \"d\", &channel->exit_status);\n        if (rc != SSH_OK) {\n            SSH_LOG(SSH_LOG_PACKET, \"Invalid exit-status packet\");\n            return SSH_PACKET_USED;\n        }\n        SSH_LOG(SSH_LOG_PACKET, \"received exit-status %d\", channel->exit_status);\n\n        ssh_callbacks_execute_list(channel->callbacks,\n                                   ssh_channel_callbacks,\n                                   channel_exit_status_function,\n                                   channel->session,\n                                   channel,\n                                   channel->exit_status);\n\n\t\treturn SSH_PACKET_USED;\n\t}\n\n\tif (strcmp(request,\"signal\") == 0) {\n        char *sig = NULL;\n\n\t\tSAFE_FREE(request);\n\t\tSSH_LOG(SSH_LOG_PACKET, \"received signal\");\n\n\t\trc = ssh_buffer_unpack(packet, \"s\", &sig);\n\t\tif (rc != SSH_OK) {\n\t\t\tSSH_LOG(SSH_LOG_PACKET, \"Invalid MSG_CHANNEL_REQUEST\");\n\t\t\treturn SSH_PACKET_USED;\n\t\t}\n\n\t\tSSH_LOG(SSH_LOG_PACKET,\n\t\t\t\t\"Remote connection sent a signal SIG %s\", sig);\n        ssh_callbacks_execute_list(channel->callbacks,\n                                   ssh_channel_callbacks,\n                                   channel_signal_function,\n                                   channel->session,\n                                   channel,\n                                   sig);\n\t\tSAFE_FREE(sig);\n\n\t\treturn SSH_PACKET_USED;\n\t}\n\n\tif (strcmp(request, \"exit-signal\") == 0) {\n\t\tconst char *core = \"(core dumped)\";\n\t\tchar *sig = NULL;\n\t\tchar *errmsg = NULL;\n\t\tchar *lang = NULL;\n\t\tuint8_t core_dumped;\n\n\t\tSAFE_FREE(request);\n\n\t\trc = ssh_buffer_unpack(packet, \"sbss\",\n\t\t        &sig, /* signal name */\n\t\t        &core_dumped,    /* core dumped */\n\t\t        &errmsg, /* error message */\n\t\t        &lang);\n\t\tif (rc != SSH_OK) {\n\t\t\tSSH_LOG(SSH_LOG_PACKET, \"Invalid MSG_CHANNEL_REQUEST\");\n\t\t\treturn SSH_PACKET_USED;\n\t\t}\n\n\t\tif (core_dumped == 0) {\n\t\t\tcore = \"\";\n\t\t}\n\n\t\tSSH_LOG(SSH_LOG_PACKET,\n\t\t\t\t\"Remote connection closed by signal SIG %s %s\", sig, core);\n\t\tssh_callbacks_execute_list(channel->callbacks,\n                                   ssh_channel_callbacks,\n                                   channel_exit_signal_function,\n                                   channel->session,\n                                   channel,\n                                   sig,\n                                   core_dumped,\n                                   errmsg,\n                                   lang);\n\n        SAFE_FREE(lang);\n        SAFE_FREE(errmsg);\n\t\tSAFE_FREE(sig);\n\n\t\treturn SSH_PACKET_USED;\n\t}\n\tif(strcmp(request,\"keepalive@openssh.com\")==0){\n\t  SAFE_FREE(request);\n\t  SSH_LOG(SSH_LOG_PROTOCOL,\"Responding to Openssh's keepalive\");\n\n      rc = ssh_buffer_pack(session->out_buffer,\n                           \"bd\",\n                           SSH2_MSG_CHANNEL_FAILURE,\n                           channel->remote_channel);\n      if (rc != SSH_OK) {\n          return SSH_PACKET_USED;\n      }\n\t  ssh_packet_send(session);\n\n\t  return SSH_PACKET_USED;\n\t}\n\n  if (strcmp(request, \"auth-agent-req@openssh.com\") == 0) {\n    SAFE_FREE(request);\n    SSH_LOG(SSH_LOG_PROTOCOL, \"Received an auth-agent-req request\");\n    ssh_callbacks_execute_list(channel->callbacks,\n                               ssh_channel_callbacks,\n                               channel_auth_agent_req_function,\n                               channel->session,\n                               channel);\n\n    return SSH_PACKET_USED;\n  }\n#ifdef WITH_SERVER\n\t/* If we are here, that means we have a request that is not in the understood\n\t * client requests. That means we need to create a ssh message to be passed\n\t * to the user code handling ssh messages\n\t */\n\tssh_message_handle_channel_request(session,channel,packet,request,status);\n#else\n    SSH_LOG(SSH_LOG_WARNING, \"Unhandled channel request %s\", request);\n#endif\n\t\n\tSAFE_FREE(request);\n\n\treturn SSH_PACKET_USED;\n}\n\n/*\n * When data has been received from the ssh server, it can be applied to the\n * known user function, with help of the callback, or inserted here\n *\n * FIXME is the window changed?\n */\nint channel_default_bufferize(ssh_channel channel,\n                              void *data, size_t len,\n                              bool is_stderr)\n{\n  ssh_session session;\n\n  if(channel == NULL) {\n      return -1;\n  }\n\n  session = channel->session;\n\n  if(data == NULL) {\n      ssh_set_error_invalid(session);\n      return -1;\n  }\n\n  SSH_LOG(SSH_LOG_PACKET,\n          \"placing %zu bytes into channel buffer (%s)\",\n          len,\n          is_stderr ? \"stderr\" : \"stdout\");\n  if (!is_stderr) {\n    /* stdout */\n    if (channel->stdout_buffer == NULL) {\n      channel->stdout_buffer = ssh_buffer_new();\n      if (channel->stdout_buffer == NULL) {\n        ssh_set_error_oom(session);\n        return -1;\n      }\n    }\n\n    if (ssh_buffer_add_data(channel->stdout_buffer, data, len) < 0) {\n      ssh_set_error_oom(session);\n      SSH_BUFFER_FREE(channel->stdout_buffer);\n      channel->stdout_buffer = NULL;\n      return -1;\n    }\n  } else {\n    /* stderr */\n    if (channel->stderr_buffer == NULL) {\n      channel->stderr_buffer = ssh_buffer_new();\n      if (channel->stderr_buffer == NULL) {\n        ssh_set_error_oom(session);\n        return -1;\n      }\n    }\n\n    if (ssh_buffer_add_data(channel->stderr_buffer, data, len) < 0) {\n      ssh_set_error_oom(session);\n      SSH_BUFFER_FREE(channel->stderr_buffer);\n      channel->stderr_buffer = NULL;\n      return -1;\n    }\n  }\n\n  return 0;\n}\n\n/**\n * @brief Open a session channel (suited for a shell, not TCP forwarding).\n *\n * @param[in]  channel  An allocated channel.\n *\n * @return              SSH_OK on success,\n *                      SSH_ERROR if an error occurred,\n *                      SSH_AGAIN if in nonblocking mode and call has\n *                      to be done again.\n *\n * @see ssh_channel_open_forward()\n * @see ssh_channel_request_env()\n * @see ssh_channel_request_shell()\n * @see ssh_channel_request_exec()\n */\nint ssh_channel_open_session(ssh_channel channel) {\n  if(channel == NULL) {\n      return SSH_ERROR;\n  }\n\n  return channel_open(channel,\n                      \"session\",\n                      CHANNEL_INITIAL_WINDOW,\n                      CHANNEL_MAX_PACKET,\n                      NULL);\n}\n\n/**\n * @brief Open an agent authentication forwarding channel. This type of channel\n * can be opened by a server towards a client in order to provide SSH-Agent services\n * to the server-side process. This channel can only be opened if the client\n * claimed support by sending a channel request beforehand.\n *\n * @param[in]  channel  An allocated channel.\n *\n * @return              SSH_OK on success,\n *                      SSH_ERROR if an error occurred,\n *                      SSH_AGAIN if in nonblocking mode and call has\n *                      to be done again.\n *\n * @see ssh_channel_open_forward()\n */\nint ssh_channel_open_auth_agent(ssh_channel channel){\n  if(channel == NULL) {\n      return SSH_ERROR;\n  }\n\n  return channel_open(channel,\n                      \"auth-agent@openssh.com\",\n                      CHANNEL_INITIAL_WINDOW,\n                      CHANNEL_MAX_PACKET,\n                      NULL);\n}\n\n\n/**\n * @brief Open a TCP/IP forwarding channel.\n *\n * @param[in]  channel  An allocated channel.\n *\n * @param[in]  remotehost The remote host to connected (host name or IP).\n *\n * @param[in]  remoteport The remote port.\n *\n * @param[in]  sourcehost The numeric IP address of the machine from where the\n *                        connection request originates. This is mostly for\n *                        logging purposes.\n *\n * @param[in]  localport  The port on the host from where the connection\n *                        originated. This is mostly for logging purposes.\n *\n * @return              SSH_OK on success,\n *                      SSH_ERROR if an error occurred,\n *                      SSH_AGAIN if in nonblocking mode and call has\n *                      to be done again.\n *\n * @warning This function does not bind the local port and does not automatically\n *          forward the content of a socket to the channel. You still have to\n *          use channel_read and channel_write for this.\n */\nint ssh_channel_open_forward(ssh_channel channel, const char *remotehost,\n    int remoteport, const char *sourcehost, int localport) {\n  ssh_session session;\n  ssh_buffer payload = NULL;\n  ssh_string str = NULL;\n  int rc = SSH_ERROR;\n\n  if(channel == NULL) {\n      return rc;\n  }\n\n  session = channel->session;\n\n  if(remotehost == NULL || sourcehost == NULL) {\n      ssh_set_error_invalid(session);\n      return rc;\n  }\n\n  payload = ssh_buffer_new();\n  if (payload == NULL) {\n    ssh_set_error_oom(session);\n    goto error;\n  }\n\n  rc = ssh_buffer_pack(payload,\n                       \"sdsd\",\n                       remotehost,\n                       remoteport,\n                       sourcehost,\n                       localport);\n  if (rc != SSH_OK) {\n    ssh_set_error_oom(session);\n    goto error;\n  }\n\n  rc = channel_open(channel,\n                    \"direct-tcpip\",\n                    CHANNEL_INITIAL_WINDOW,\n                    CHANNEL_MAX_PACKET,\n                    payload);\n\nerror:\n  SSH_BUFFER_FREE(payload);\n  SSH_STRING_FREE(str);\n\n  return rc;\n}\n\n/**\n * @brief Open a TCP/IP - UNIX domain socket forwarding channel.\n *\n * @param[in]  channel  An allocated channel.\n *\n * @param[in]  remotepath   The UNIX socket path on the remote machine\n *\n * @param[in]  sourcehost   The numeric IP address of the machine from where the\n *                          connection request originates. This is mostly for\n *                          logging purposes.\n *\n * @param[in]  localport    The port on the host from where the connection\n *                          originated. This is mostly for logging purposes.\n *\n * @return              SSH_OK on success,\n *                      SSH_ERROR if an error occurred,\n *                      SSH_AGAIN if in nonblocking mode and call has\n *                      to be done again.\n *\n * @warning This function does not bind the local port and does not\n *          automatically forward the content of a socket to the channel.\n *          You still have to use channel_read and channel_write for this.\n * @warning Requires support of OpenSSH for UNIX domain socket forwarding.\n  */\nint ssh_channel_open_forward_unix(ssh_channel channel,\n                                  const char *remotepath,\n                                  const char *sourcehost,\n                                  int localport)\n{\n    ssh_session session = NULL;\n    ssh_buffer payload = NULL;\n    ssh_string str = NULL;\n    int rc = SSH_ERROR;\n    int version;\n\n    if (channel == NULL) {\n        return rc;\n    }\n\n    session = channel->session;\n\n    version = ssh_get_openssh_version(session);\n    if (version == 0) {\n        ssh_set_error(session,\n                      SSH_REQUEST_DENIED,\n                      \"We're not connected to an OpenSSH server!\");\n        return SSH_ERROR;\n    }\n\n    if (remotepath == NULL || sourcehost == NULL) {\n        ssh_set_error_invalid(session);\n        return rc;\n    }\n\n    payload = ssh_buffer_new();\n    if (payload == NULL) {\n        ssh_set_error_oom(session);\n        goto error;\n    }\n\n    rc = ssh_buffer_pack(payload,\n                         \"ssd\",\n                         remotepath,\n                         sourcehost,\n                         localport);\n    if (rc != SSH_OK) {\n        ssh_set_error_oom(session);\n        goto error;\n    }\n\n    rc = channel_open(channel,\n                      \"direct-streamlocal@openssh.com\",\n                      CHANNEL_INITIAL_WINDOW,\n                      CHANNEL_MAX_PACKET,\n                      payload);\n\nerror:\n    SSH_BUFFER_FREE(payload);\n    SSH_STRING_FREE(str);\n\n    return rc;\n}\n\n/**\n * @brief Close and free a channel.\n *\n * @param[in]  channel  The channel to free.\n *\n * @warning Any data unread on this channel will be lost.\n */\nvoid ssh_channel_free(ssh_channel channel)\n{\n    ssh_session session;\n\n    if (channel == NULL) {\n        return;\n    }\n\n    session = channel->session;\n    if (session->alive) {\n        bool send_close = false;\n\n        switch (channel->state) {\n        case SSH_CHANNEL_STATE_OPEN:\n            send_close = true;\n            break;\n        case SSH_CHANNEL_STATE_CLOSED:\n            if (channel->flags & SSH_CHANNEL_FLAG_CLOSED_REMOTE) {\n                send_close = true;\n            }\n            if (channel->flags & SSH_CHANNEL_FLAG_CLOSED_LOCAL) {\n                send_close = false;\n            }\n            break;\n        default:\n            send_close = false;\n            break;\n        }\n\n        if (send_close) {\n            ssh_channel_close(channel);\n        }\n    }\n    channel->flags |= SSH_CHANNEL_FLAG_FREED_LOCAL;\n\n    /* The idea behind the flags is the following : it is well possible\n     * that a client closes a channel that stills exists on the server side.\n     * We definitively close the channel when we receive a close message *and*\n     * the user closed it.\n     */\n    if ((channel->flags & SSH_CHANNEL_FLAG_CLOSED_REMOTE) ||\n        (channel->flags & SSH_CHANNEL_FLAG_NOT_BOUND)) {\n        ssh_channel_do_free(channel);\n    }\n}\n\n/**\n * @internal\n * @brief Effectively free a channel, without caring about flags\n */\n\nvoid ssh_channel_do_free(ssh_channel channel)\n{\n    struct ssh_iterator *it = NULL;\n    ssh_session session = channel->session;\n\n    it = ssh_list_find(session->channels, channel);\n    if (it != NULL) {\n        ssh_list_remove(session->channels, it);\n    }\n\n    SSH_BUFFER_FREE(channel->stdout_buffer);\n    SSH_BUFFER_FREE(channel->stderr_buffer);\n\n    if (channel->callbacks != NULL) {\n        ssh_list_free(channel->callbacks);\n        channel->callbacks = NULL;\n    }\n\n    channel->session = NULL;\n    SAFE_FREE(channel);\n}\n\n/**\n * @brief Send an end of file on the channel.\n *\n * This doesn't close the channel. You may still read from it but not write.\n *\n * @param[in]  channel  The channel to send the eof to.\n *\n * @return              SSH_OK on success, SSH_ERROR if an error occurred.\n *\n * Example:\n@code\n   rc = ssh_channel_send_eof(channel);\n   if (rc == SSH_ERROR) {\n       return -1;\n   }\n   while(!ssh_channel_is_eof(channel)) {\n       rc = ssh_channel_read(channel, buf, sizeof(buf), 0);\n       if (rc == SSH_ERROR) {\n           return -1;\n       }\n   }\n   ssh_channel_close(channel);\n@endcode\n *\n * @see ssh_channel_close()\n * @see ssh_channel_free()\n * @see ssh_channel_is_eof()\n */\nint ssh_channel_send_eof(ssh_channel channel)\n{\n    ssh_session session;\n    int rc = SSH_ERROR;\n    int err;\n\n    if (channel == NULL || channel->session == NULL) {\n        return rc;\n    }\n\n    /* If the EOF has already been sent we're done here. */\n    if (channel->local_eof != 0) {\n        return SSH_OK;\n    }\n\n    session = channel->session;\n\n    err = ssh_buffer_pack(session->out_buffer,\n                          \"bd\",\n                          SSH2_MSG_CHANNEL_EOF,\n                          channel->remote_channel);\n    if (err != SSH_OK) {\n        ssh_set_error_oom(session);\n        goto error;\n    }\n\n    rc = ssh_packet_send(session);\n    SSH_LOG(SSH_LOG_PACKET,\n        \"Sent a EOF on client channel (%d:%d)\",\n        channel->local_channel,\n        channel->remote_channel);\n    if (rc != SSH_OK) {\n        goto error;\n    }\n\n    rc = ssh_channel_flush(channel);\n    if (rc == SSH_ERROR) {\n        goto error;\n    }\n    channel->local_eof = 1;\n\n    return rc;\nerror:\n    ssh_buffer_reinit(session->out_buffer);\n\n    return rc;\n}\n\n/**\n * @brief Close a channel.\n *\n * This sends an end of file and then closes the channel. You won't be able\n * to recover any data the server was going to send or was in buffers.\n *\n * @param[in]  channel  The channel to close.\n *\n * @return              SSH_OK on success, SSH_ERROR if an error occurred.\n *\n * @see ssh_channel_free()\n * @see ssh_channel_is_eof()\n */\nint ssh_channel_close(ssh_channel channel)\n{\n    ssh_session session;\n    int rc = 0;\n\n    if(channel == NULL) {\n        return SSH_ERROR;\n    }\n\n    /* If the channel close has already been sent we're done here. */\n    if (channel->flags & SSH_CHANNEL_FLAG_CLOSED_LOCAL) {\n        return SSH_OK;\n    }\n\n    session = channel->session;\n\n    rc = ssh_channel_send_eof(channel);\n    if (rc != SSH_OK) {\n        return rc;\n    }\n\n    rc = ssh_buffer_pack(session->out_buffer,\n                         \"bd\",\n                         SSH2_MSG_CHANNEL_CLOSE,\n                         channel->remote_channel);\n    if (rc != SSH_OK) {\n        ssh_set_error_oom(session);\n        goto error;\n    }\n\n    rc = ssh_packet_send(session);\n    SSH_LOG(SSH_LOG_PACKET,\n            \"Sent a close on client channel (%d:%d)\",\n            channel->local_channel,\n            channel->remote_channel);\n\n    if (rc == SSH_OK) {\n        channel->state = SSH_CHANNEL_STATE_CLOSED;\n        channel->flags |= SSH_CHANNEL_FLAG_CLOSED_LOCAL;\n    }\n\n    rc = ssh_channel_flush(channel);\n    if(rc == SSH_ERROR) {\n        goto error;\n    }\n\n    return rc;\nerror:\n    ssh_buffer_reinit(session->out_buffer);\n\n    return rc;\n}\n\n/* this termination function waits for a window growing condition */\nstatic int ssh_channel_waitwindow_termination(void *c){\n  ssh_channel channel = (ssh_channel) c;\n  if (channel->remote_window > 0 ||\n      channel->session->session_state == SSH_SESSION_STATE_ERROR ||\n      channel->state == SSH_CHANNEL_STATE_CLOSED)\n    return 1;\n  else\n    return 0;\n}\n\n/* This termination function waits until the session is not in blocked status\n * anymore, e.g. because of a key re-exchange.\n */\nstatic int ssh_waitsession_unblocked(void *s){\n    ssh_session session = (ssh_session)s;\n    switch (session->session_state){\n        case SSH_SESSION_STATE_DH:\n        case SSH_SESSION_STATE_INITIAL_KEX:\n        case SSH_SESSION_STATE_KEXINIT_RECEIVED:\n            return 0;\n        default:\n            return 1;\n    }\n}\n/**\n * @internal\n * @brief Flushes a channel (and its session) until the output buffer\n *        is empty, or timeout elapsed.\n * @param channel SSH channel\n * @return  SSH_OK On success,\n *          SSH_ERROR On error.\n *          SSH_AGAIN Timeout elapsed (or in nonblocking mode).\n */\nint ssh_channel_flush(ssh_channel channel){\n  return ssh_blocking_flush(channel->session, SSH_TIMEOUT_DEFAULT);\n}\n\nstatic int channel_write_common(ssh_channel channel,\n                                const void *data,\n                                uint32_t len, int is_stderr)\n{\n  ssh_session session;\n  uint32_t origlen = len;\n  size_t effectivelen;\n  size_t maxpacketlen;\n  int rc;\n\n  if(channel == NULL) {\n      return -1;\n  }\n  session = channel->session;\n  if(data == NULL) {\n      ssh_set_error_invalid(session);\n      return -1;\n  }\n\n  if (len > INT_MAX) {\n      SSH_LOG(SSH_LOG_PROTOCOL,\n              \"Length (%u) is bigger than INT_MAX\", len);\n      return SSH_ERROR;\n  }\n\n  /*\n   * Handle the max packet len from remote side, be nice\n   * 10 bytes for the headers\n   */\n  maxpacketlen = channel->remote_maxpacket - 10;\n\n  if (channel->local_eof) {\n    ssh_set_error(session, SSH_REQUEST_DENIED,\n        \"Can't write to channel %d:%d  after EOF was sent\",\n        channel->local_channel,\n        channel->remote_channel);\n    return -1;\n  }\n\n  if (channel->state != SSH_CHANNEL_STATE_OPEN || channel->delayed_close != 0) {\n    ssh_set_error(session, SSH_REQUEST_DENIED, \"Remote channel is closed\");\n\n    return -1;\n  }\n\n  if (session->session_state == SSH_SESSION_STATE_ERROR) {\n    return SSH_ERROR;\n  }\n\n  if (ssh_waitsession_unblocked(session) == 0){\n    rc = ssh_handle_packets_termination(session, SSH_TIMEOUT_DEFAULT,\n            ssh_waitsession_unblocked, session);\n    if (rc == SSH_ERROR || !ssh_waitsession_unblocked(session))\n        goto out;\n  }\n  while (len > 0) {\n    if (channel->remote_window < len) {\n      SSH_LOG(SSH_LOG_PROTOCOL,\n          \"Remote window is %d bytes. going to write %d bytes\",\n          channel->remote_window,\n          len);\n      /* What happens when the channel window is zero? */\n      if(channel->remote_window == 0) {\n          /* nothing can be written */\n          SSH_LOG(SSH_LOG_PROTOCOL,\n                \"Wait for a growing window message...\");\n          rc = ssh_handle_packets_termination(session, SSH_TIMEOUT_DEFAULT,\n              ssh_channel_waitwindow_termination,channel);\n          if (rc == SSH_ERROR ||\n              !ssh_channel_waitwindow_termination(channel) ||\n              session->session_state == SSH_SESSION_STATE_ERROR ||\n              channel->state == SSH_CHANNEL_STATE_CLOSED)\n            goto out;\n          continue;\n      }\n      effectivelen = MIN(len, channel->remote_window);\n    } else {\n      effectivelen = len;\n    }\n\n    effectivelen = MIN(effectivelen, maxpacketlen);;\n\n    rc = ssh_buffer_pack(session->out_buffer,\n                         \"bd\",\n                         is_stderr ? SSH2_MSG_CHANNEL_EXTENDED_DATA : SSH2_MSG_CHANNEL_DATA,\n                         channel->remote_channel);\n    if (rc != SSH_OK) {\n        ssh_set_error_oom(session);\n        goto error;\n    }\n\n    /* stderr message has an extra field */\n    if (is_stderr) {\n        rc = ssh_buffer_pack(session->out_buffer,\n                             \"d\",\n                             SSH2_EXTENDED_DATA_STDERR);\n        if (rc != SSH_OK) {\n            ssh_set_error_oom(session);\n            goto error;\n        }\n    }\n\n    /* append payload data */\n    rc = ssh_buffer_pack(session->out_buffer,\n                         \"dP\",\n                         effectivelen,\n                         (size_t)effectivelen, data);\n    if (rc != SSH_OK) {\n        ssh_set_error_oom(session);\n        goto error;\n    }\n\n    rc = ssh_packet_send(session);\n    if (rc == SSH_ERROR) {\n        return SSH_ERROR;\n    }\n\n    SSH_LOG(SSH_LOG_PACKET,\n        \"channel_write wrote %ld bytes\", (long int) effectivelen);\n\n    channel->remote_window -= effectivelen;\n    len -= effectivelen;\n    data = ((uint8_t*)data + effectivelen);\n    if (channel->counter != NULL) {\n        channel->counter->out_bytes += effectivelen;\n    }\n  }\n\n  /* it's a good idea to flush the socket now */\n  rc = ssh_channel_flush(channel);\n  if (rc == SSH_ERROR) {\n      goto error;\n  }\n\nout:\n  return (int)(origlen - len);\n\nerror:\n  ssh_buffer_reinit(session->out_buffer);\n\n  return SSH_ERROR;\n}\n\n/**\n * @brief Get the remote window size.\n *\n * This is the maximum amounts of bytes the remote side expects us to send\n * before growing the window again.\n *\n * @param[in] channel The channel to query.\n *\n * @return            The remote window size\n *\n * @warning A nonzero return value does not guarantee the socket is ready\n *          to send that much data. Buffering may happen in the local SSH\n *          packet buffer, so beware of really big window sizes.\n *\n * @warning A zero return value means ssh_channel_write (default settings)\n *          will block until the window grows back.\n */\nuint32_t ssh_channel_window_size(ssh_channel channel) {\n    return channel->remote_window;\n}\n\n/**\n * @brief Blocking write on a channel.\n *\n * @param[in]  channel  The channel to write to.\n *\n * @param[in]  data     A pointer to the data to write.\n *\n * @param[in]  len      The length of the buffer to write to.\n *\n * @return              The number of bytes written, SSH_ERROR on error.\n *\n * @see ssh_channel_read()\n */\nint ssh_channel_write(ssh_channel channel, const void *data, uint32_t len) {\n  return channel_write_common(channel, data, len, 0);\n}\n\n/**\n * @brief Check if the channel is open or not.\n *\n * @param[in]  channel  The channel to check.\n *\n * @return              0 if channel is closed, nonzero otherwise.\n *\n * @see ssh_channel_is_closed()\n */\nint ssh_channel_is_open(ssh_channel channel) {\n    if(channel == NULL) {\n        return 0;\n    }\n    return (channel->state == SSH_CHANNEL_STATE_OPEN && channel->session->alive != 0);\n}\n\n/**\n * @brief Check if the channel is closed or not.\n *\n * @param[in]  channel  The channel to check.\n *\n * @return              0 if channel is opened, nonzero otherwise.\n *\n * @see ssh_channel_is_open()\n */\nint ssh_channel_is_closed(ssh_channel channel) {\n    if(channel == NULL) {\n        return SSH_ERROR;\n    }\n    return (channel->state != SSH_CHANNEL_STATE_OPEN || channel->session->alive == 0);\n}\n\n/**\n * @brief Check if remote has sent an EOF.\n *\n * @param[in]  channel  The channel to check.\n *\n * @return              0 if there is no EOF, nonzero otherwise.\n */\nint ssh_channel_is_eof(ssh_channel channel) {\n  if(channel == NULL) {\n      return SSH_ERROR;\n  }\n  if ((channel->stdout_buffer &&\n        ssh_buffer_get_len(channel->stdout_buffer) > 0) ||\n      (channel->stderr_buffer &&\n       ssh_buffer_get_len(channel->stderr_buffer) > 0)) {\n    return 0;\n  }\n\n  return (channel->remote_eof != 0);\n}\n\n/**\n * @brief Put the channel into blocking or nonblocking mode.\n *\n * @param[in]  channel  The channel to use.\n *\n * @param[in]  blocking A boolean for blocking or nonblocking.\n *\n * @warning    A side-effect of this is to put the whole session\n *             in non-blocking mode.\n * @see ssh_set_blocking()\n */\nvoid ssh_channel_set_blocking(ssh_channel channel, int blocking) {\n  if(channel == NULL) {\n      return;\n  }\n  ssh_set_blocking(channel->session,blocking);\n}\n\n/**\n * @internal\n *\n * @brief handle a SSH_CHANNEL_SUCCESS packet and set the channel state.\n */\nSSH_PACKET_CALLBACK(ssh_packet_channel_success){\n  ssh_channel channel;\n  (void)type;\n  (void)user;\n\n  channel=channel_from_msg(session,packet);\n  if (channel == NULL) {\n    SSH_LOG(SSH_LOG_FUNCTIONS, \"%s\", ssh_get_error(session));\n    return SSH_PACKET_USED;\n  }\n\n  SSH_LOG(SSH_LOG_PACKET,\n      \"Received SSH_CHANNEL_SUCCESS on channel (%d:%d)\",\n      channel->local_channel,\n      channel->remote_channel);\n  if(channel->request_state != SSH_CHANNEL_REQ_STATE_PENDING){\n    SSH_LOG(SSH_LOG_RARE, \"SSH_CHANNEL_SUCCESS received in incorrect state %d\",\n        channel->request_state);\n  } else {\n    channel->request_state=SSH_CHANNEL_REQ_STATE_ACCEPTED;\n  }\n\n  return SSH_PACKET_USED;\n}\n\n/**\n * @internal\n *\n * @brief Handle a SSH_CHANNEL_FAILURE packet and set the channel state.\n */\nSSH_PACKET_CALLBACK(ssh_packet_channel_failure){\n  ssh_channel channel;\n  (void)type;\n  (void)user;\n\n  channel=channel_from_msg(session,packet);\n  if (channel == NULL) {\n    SSH_LOG(SSH_LOG_FUNCTIONS, \"%s\", ssh_get_error(session));\n\n    return SSH_PACKET_USED;\n  }\n\n  SSH_LOG(SSH_LOG_PACKET,\n      \"Received SSH_CHANNEL_FAILURE on channel (%d:%d)\",\n      channel->local_channel,\n      channel->remote_channel);\n  if(channel->request_state != SSH_CHANNEL_REQ_STATE_PENDING){\n    SSH_LOG(SSH_LOG_RARE, \"SSH_CHANNEL_FAILURE received in incorrect state %d\",\n        channel->request_state);\n  } else {\n    channel->request_state=SSH_CHANNEL_REQ_STATE_DENIED;\n  }\n\n  return SSH_PACKET_USED;\n}\n\nstatic int ssh_channel_request_termination(void *c){\n  ssh_channel channel = (ssh_channel)c;\n  if(channel->request_state != SSH_CHANNEL_REQ_STATE_PENDING ||\n      channel->session->session_state == SSH_SESSION_STATE_ERROR)\n    return 1;\n  else\n    return 0;\n}\n\nstatic int channel_request(ssh_channel channel, const char *request,\n    ssh_buffer buffer, int reply) {\n  ssh_session session = channel->session;\n  int rc = SSH_ERROR;\n  int ret;\n\n  switch(channel->request_state){\n  case SSH_CHANNEL_REQ_STATE_NONE:\n    break;\n  default:\n    goto pending;\n  }\n\n  ret = ssh_buffer_pack(session->out_buffer,\n                        \"bdsb\",\n                        SSH2_MSG_CHANNEL_REQUEST,\n                        channel->remote_channel,\n                        request,\n                        reply == 0 ? 0 : 1);\n  if (ret != SSH_OK) {\n    ssh_set_error_oom(session);\n    goto error;\n  }\n\n  if (buffer != NULL) {\n    if (ssh_buffer_add_data(session->out_buffer, ssh_buffer_get(buffer),\n        ssh_buffer_get_len(buffer)) < 0) {\n      ssh_set_error_oom(session);\n      goto error;\n    }\n  }\n  channel->request_state = SSH_CHANNEL_REQ_STATE_PENDING;\n  if (ssh_packet_send(session) == SSH_ERROR) {\n    return rc;\n  }\n\n  SSH_LOG(SSH_LOG_PACKET,\n      \"Sent a SSH_MSG_CHANNEL_REQUEST %s\", request);\n  if (reply == 0) {\n    channel->request_state = SSH_CHANNEL_REQ_STATE_NONE;\n    return SSH_OK;\n  }\npending:\n  rc = ssh_handle_packets_termination(session,\n                                      SSH_TIMEOUT_DEFAULT,\n                                      ssh_channel_request_termination,\n                                      channel);\n\n  if(session->session_state == SSH_SESSION_STATE_ERROR || rc == SSH_ERROR) {\n      channel->request_state = SSH_CHANNEL_REQ_STATE_ERROR;\n  }\n  /* we received something */\n  switch (channel->request_state){\n    case SSH_CHANNEL_REQ_STATE_ERROR:\n      rc=SSH_ERROR;\n      break;\n    case SSH_CHANNEL_REQ_STATE_DENIED:\n      ssh_set_error(session, SSH_REQUEST_DENIED,\n          \"Channel request %s failed\", request);\n      rc=SSH_ERROR;\n      break;\n    case SSH_CHANNEL_REQ_STATE_ACCEPTED:\n      SSH_LOG(SSH_LOG_PROTOCOL,\n          \"Channel request %s success\",request);\n      rc=SSH_OK;\n      break;\n    case SSH_CHANNEL_REQ_STATE_PENDING:\n      rc = SSH_AGAIN;\n      return rc;\n    case SSH_CHANNEL_REQ_STATE_NONE:\n      /* Never reached */\n      ssh_set_error(session, SSH_FATAL, \"Invalid state in channel_request()\");\n      rc=SSH_ERROR;\n      break;\n  }\n  channel->request_state=SSH_CHANNEL_REQ_STATE_NONE;\n\n  return rc;\nerror:\n  ssh_buffer_reinit(session->out_buffer);\n\n  return rc;\n}\n\n/**\n * @brief Request a pty with a specific type and size.\n *\n * @param[in]  channel  The channel to sent the request.\n *\n * @param[in]  terminal The terminal type (\"vt100, xterm,...\").\n *\n * @param[in]  col      The number of columns.\n *\n * @param[in]  row      The number of rows.\n *\n * @return              SSH_OK on success,\n *                      SSH_ERROR if an error occurred,\n *                      SSH_AGAIN if in nonblocking mode and call has\n *                      to be done again.\n */\nint ssh_channel_request_pty_size(ssh_channel channel, const char *terminal,\n    int col, int row) {\n  ssh_session session;\n  ssh_buffer buffer = NULL;\n  int rc = SSH_ERROR;\n\n  if(channel == NULL) {\n      return SSH_ERROR;\n  }\n  session = channel->session;\n\n  if(terminal == NULL) {\n      ssh_set_error_invalid(channel->session);\n      return rc;\n  }\n\n  switch(channel->request_state){\n  case SSH_CHANNEL_REQ_STATE_NONE:\n    break;\n  default:\n    goto pending;\n  }\n\n  buffer = ssh_buffer_new();\n  if (buffer == NULL) {\n    ssh_set_error_oom(session);\n    goto error;\n  }\n\n  rc = ssh_buffer_pack(buffer,\n                       \"sdddddb\",\n                       terminal,\n                       col,\n                       row,\n                       0, /* pix */\n                       0, /* pix */\n                       1, /* add a 0byte string */\n                       0);\n\n  if (rc != SSH_OK) {\n    ssh_set_error_oom(session);\n    goto error;\n  }\npending:\n  rc = channel_request(channel, \"pty-req\", buffer, 1);\nerror:\n  SSH_BUFFER_FREE(buffer);\n\n  return rc;\n}\n\n/**\n * @brief Request a PTY.\n *\n * @param[in]  channel  The channel to send the request.\n *\n * @return              SSH_OK on success,\n *                      SSH_ERROR if an error occurred,\n *                      SSH_AGAIN if in nonblocking mode and call has\n *                      to be done again.\n *\n * @see ssh_channel_request_pty_size()\n */\nint ssh_channel_request_pty(ssh_channel channel) {\n  return ssh_channel_request_pty_size(channel, \"xterm\", 80, 24);\n}\n\n/**\n * @brief Change the size of the terminal associated to a channel.\n *\n * @param[in]  channel  The channel to change the size.\n *\n * @param[in]  cols     The new number of columns.\n *\n * @param[in]  rows     The new number of rows.\n *\n * @return              SSH_OK on success, SSH_ERROR if an error occurred.\n *\n * @warning Do not call it from a signal handler if you are not sure any other\n *          libssh function using the same channel/session is running at same\n *          time (not 100% threadsafe).\n */\nint ssh_channel_change_pty_size(ssh_channel channel, int cols, int rows) {\n  ssh_session session = channel->session;\n  ssh_buffer buffer = NULL;\n  int rc = SSH_ERROR;\n\n  buffer = ssh_buffer_new();\n  if (buffer == NULL) {\n    ssh_set_error_oom(session);\n    goto error;\n  }\n\n  rc = ssh_buffer_pack(buffer,\n                       \"dddd\",\n                       cols,\n                       rows,\n                       0, /* pix */\n                       0 /* pix */);\n  if (rc != SSH_OK) {\n    ssh_set_error_oom(session);\n    goto error;\n  }\n\n  rc = channel_request(channel, \"window-change\", buffer, 0);\nerror:\n  SSH_BUFFER_FREE(buffer);\n\n  return rc;\n}\n\n/**\n * @brief Request a shell.\n *\n * @param[in]  channel  The channel to send the request.\n *\n * @return              SSH_OK on success,\n *                      SSH_ERROR if an error occurred,\n *                      SSH_AGAIN if in nonblocking mode and call has\n *                      to be done again.\n */\nint ssh_channel_request_shell(ssh_channel channel) {\n    if(channel == NULL) {\n        return SSH_ERROR;\n    }\n\n    return channel_request(channel, \"shell\", NULL, 1);\n}\n\n/**\n * @brief Request a subsystem (for example \"sftp\").\n *\n * @param[in]  channel  The channel to send the request.\n *\n * @param[in]  subsys   The subsystem to request (for example \"sftp\").\n *\n * @return              SSH_OK on success,\n *                      SSH_ERROR if an error occurred,\n *                      SSH_AGAIN if in nonblocking mode and call has\n *                      to be done again.\n *\n * @warning You normally don't have to call it for sftp, see sftp_new().\n */\nint ssh_channel_request_subsystem(ssh_channel channel, const char *subsys) {\n  ssh_buffer buffer = NULL;\n  int rc = SSH_ERROR;\n\n  if(channel == NULL) {\n      return SSH_ERROR;\n  }\n  if(subsys == NULL) {\n      ssh_set_error_invalid(channel->session);\n      return rc;\n  }\n  switch(channel->request_state){\n  case SSH_CHANNEL_REQ_STATE_NONE:\n    break;\n  default:\n    goto pending;\n  }\n\n  buffer = ssh_buffer_new();\n  if (buffer == NULL) {\n    ssh_set_error_oom(channel->session);\n    goto error;\n  }\n\n  rc = ssh_buffer_pack(buffer, \"s\", subsys);\n  if (rc != SSH_OK) {\n    ssh_set_error_oom(channel->session);\n    goto error;\n  }\npending:\n  rc = channel_request(channel, \"subsystem\", buffer, 1);\nerror:\n  SSH_BUFFER_FREE(buffer);\n\n  return rc;\n}\n\n/**\n * @brief Request sftp subsystem on the channel\n *\n * @param[in]  channel The channel to request the sftp subsystem.\n *\n * @return              SSH_OK on success,\n *                      SSH_ERROR if an error occurred,\n *                      SSH_AGAIN if in nonblocking mode and call has\n *                      to be done again.\n *\n * @note You should use sftp_new() which does this for you.\n */\nint ssh_channel_request_sftp( ssh_channel channel){\n    if(channel == NULL) {\n        return SSH_ERROR;\n    }\n    return ssh_channel_request_subsystem(channel, \"sftp\");\n}\n\nstatic char *generate_cookie(void) {\n  static const char *hex = \"0123456789abcdef\";\n  char s[36];\n  unsigned char rnd[16];\n  int ok;\n  int i;\n\n  ok = ssh_get_random(rnd, sizeof(rnd), 0);\n  if (!ok) {\n      return NULL;\n  }\n\n  for (i = 0; i < 16; i++) {\n    s[i*2] = hex[rnd[i] & 0x0f];\n    s[i*2+1] = hex[rnd[i] >> 4];\n  }\n  s[32] = '\\0';\n  return strdup(s);\n}\n\n/**\n * @brief Sends the \"x11-req\" channel request over an existing session channel.\n *\n * This will enable redirecting the display of the remote X11 applications to\n * local X server over an secure tunnel.\n *\n * @param[in]  channel  An existing session channel where the remote X11\n *                      applications are going to be executed.\n *\n * @param[in]  single_connection A boolean to mark only one X11 app will be\n *                               redirected.\n *\n * @param[in]  protocol A x11 authentication protocol. Pass NULL to use the\n *                      default value MIT-MAGIC-COOKIE-1.\n *\n * @param[in]  cookie   A x11 authentication cookie. Pass NULL to generate\n *                      a random cookie.\n *\n * @param[in] screen_number The screen number.\n *\n * @return              SSH_OK on success,\n *                      SSH_ERROR if an error occurred,\n *                      SSH_AGAIN if in nonblocking mode and call has\n *                      to be done again.\n */\nint ssh_channel_request_x11(ssh_channel channel, int single_connection, const char *protocol,\n    const char *cookie, int screen_number) {\n  ssh_buffer buffer = NULL;\n  char *c = NULL;\n  int rc = SSH_ERROR;\n\n  if(channel == NULL) {\n      return SSH_ERROR;\n  }\n  switch(channel->request_state){\n  case SSH_CHANNEL_REQ_STATE_NONE:\n    break;\n  default:\n    goto pending;\n  }\n\n  buffer = ssh_buffer_new();\n  if (buffer == NULL) {\n    ssh_set_error_oom(channel->session);\n    goto error;\n  }\n\n  if (cookie == NULL) {\n    c = generate_cookie();\n    if (c == NULL) {\n      ssh_set_error_oom(channel->session);\n      goto error;\n    }\n  }\n\n  rc = ssh_buffer_pack(buffer,\n                       \"bssd\",\n                       single_connection == 0 ? 0 : 1,\n                       protocol ? protocol : \"MIT-MAGIC-COOKIE-1\",\n                       cookie ? cookie : c,\n                       screen_number);\n  if (c != NULL){\n      SAFE_FREE(c);\n  }\n  if (rc != SSH_OK) {\n    ssh_set_error_oom(channel->session);\n    goto error;\n  }\npending:\n  rc = channel_request(channel, \"x11-req\", buffer, 1);\n\nerror:\n  SSH_BUFFER_FREE(buffer);\n  return rc;\n}\n\nstatic ssh_channel ssh_channel_accept(ssh_session session, int channeltype,\n    int timeout_ms, int *destination_port) {\n#ifndef _WIN32\n  static const struct timespec ts = {\n    .tv_sec = 0,\n    .tv_nsec = 50000000 /* 50ms */\n  };\n#endif\n  ssh_message msg = NULL;\n  ssh_channel channel = NULL;\n  struct ssh_iterator *iterator;\n  int t;\n\n  /*\n   * We sleep for 50 ms in ssh_handle_packets() and later sleep for\n   * 50 ms. So we need to decrement by 100 ms.\n   */\n  for (t = timeout_ms; t >= 0; t -= 100) {\n    if (timeout_ms == 0) {\n        ssh_handle_packets(session, 0);\n    } else {\n        ssh_handle_packets(session, 50);\n    }\n\n    if (session->ssh_message_list) {\n      iterator = ssh_list_get_iterator(session->ssh_message_list);\n      while (iterator) {\n        msg = (ssh_message)iterator->data;\n        if (ssh_message_type(msg) == SSH_REQUEST_CHANNEL_OPEN &&\n            ssh_message_subtype(msg) == channeltype) {\n          ssh_list_remove(session->ssh_message_list, iterator);\n          channel = ssh_message_channel_request_open_reply_accept(msg);\n          if(destination_port) {\n            *destination_port=msg->channel_request_open.destination_port;\n          }\n\n          ssh_message_free(msg);\n          return channel;\n        }\n        iterator = iterator->next;\n      }\n    }\n    if(t>0){\n#ifdef _WIN32\n      Sleep(50); /* 50ms */\n#else\n      nanosleep(&ts, NULL);\n#endif\n    }\n  }\n\n  ssh_set_error(session, SSH_NO_ERROR, \"No channel request of this type from server\");\n  return NULL;\n}\n\n/**\n * @brief Accept an X11 forwarding channel.\n *\n * @param[in]  channel  An x11-enabled session channel.\n *\n * @param[in]  timeout_ms Timeout in milliseconds.\n *\n * @return              A newly created channel, or NULL if no X11 request from\n *                      the server.\n */\nssh_channel ssh_channel_accept_x11(ssh_channel channel, int timeout_ms) {\n  return ssh_channel_accept(channel->session, SSH_CHANNEL_X11, timeout_ms, NULL);\n}\n\n/**\n * @brief Send an \"auth-agent-req\" channel request over an existing session channel.\n *\n * This client-side request will enable forwarding the agent over an secure tunnel.\n * When the server is ready to open one authentication agent channel, an\n * ssh_channel_open_request_auth_agent_callback event will be generated.\n *\n * @param[in]  channel  The channel to send signal.\n *\n * @return              SSH_OK on success, SSH_ERROR if an error occurred\n */\nint ssh_channel_request_auth_agent(ssh_channel channel) {\n  if (channel == NULL) {\n    return SSH_ERROR;\n  }\n\n  return channel_request(channel, \"auth-agent-req@openssh.com\", NULL, 0);\n}\n\n/**\n * @internal\n *\n * @brief Handle a SSH_REQUEST_SUCCESS packet normally sent after a global\n * request.\n */\nSSH_PACKET_CALLBACK(ssh_request_success){\n  (void)type;\n  (void)user;\n  (void)packet;\n\n  SSH_LOG(SSH_LOG_PACKET,\n      \"Received SSH_REQUEST_SUCCESS\");\n  if(session->global_req_state != SSH_CHANNEL_REQ_STATE_PENDING){\n    SSH_LOG(SSH_LOG_RARE, \"SSH_REQUEST_SUCCESS received in incorrect state %d\",\n        session->global_req_state);\n  } else {\n    session->global_req_state=SSH_CHANNEL_REQ_STATE_ACCEPTED;\n  }\n\n  return SSH_PACKET_USED;\n}\n\n/**\n * @internal\n *\n * @brief Handle a SSH_REQUEST_DENIED packet normally sent after a global\n * request.\n */\nSSH_PACKET_CALLBACK(ssh_request_denied){\n  (void)type;\n  (void)user;\n  (void)packet;\n\n  SSH_LOG(SSH_LOG_PACKET,\n      \"Received SSH_REQUEST_FAILURE\");\n  if(session->global_req_state != SSH_CHANNEL_REQ_STATE_PENDING){\n    SSH_LOG(SSH_LOG_RARE, \"SSH_REQUEST_DENIED received in incorrect state %d\",\n        session->global_req_state);\n  } else {\n    session->global_req_state=SSH_CHANNEL_REQ_STATE_DENIED;\n  }\n\n  return SSH_PACKET_USED;\n\n}\n\nstatic int ssh_global_request_termination(void *s){\n  ssh_session session = (ssh_session) s;\n  if (session->global_req_state != SSH_CHANNEL_REQ_STATE_PENDING ||\n      session->session_state == SSH_SESSION_STATE_ERROR)\n    return 1;\n  else\n    return 0;\n}\n\n/**\n * @internal\n *\n * @brief Send a global request (needed for forward listening) and wait for the\n * result.\n *\n * @param[in]  session  The SSH session handle.\n *\n * @param[in]  request  The type of request (defined in RFC).\n *\n * @param[in]  buffer   Additional data to put in packet.\n *\n * @param[in]  reply    Set if you expect a reply from server.\n *\n * @return              SSH_OK on success,\n *                      SSH_ERROR if an error occurred,\n *                      SSH_AGAIN if in nonblocking mode and call has\n *                      to be done again.\n */\nint ssh_global_request(ssh_session session,\n                       const char *request,\n                       ssh_buffer buffer,\n                       int reply)\n{\n  int rc;\n\n  switch (session->global_req_state) {\n  case SSH_CHANNEL_REQ_STATE_NONE:\n    break;\n  default:\n    goto pending;\n  }\n\n  rc = ssh_buffer_pack(session->out_buffer,\n                       \"bsb\",\n                       SSH2_MSG_GLOBAL_REQUEST,\n                       request,\n                       reply == 0 ? 0 : 1);\n  if (rc != SSH_OK){\n      ssh_set_error_oom(session);\n      rc = SSH_ERROR;\n      goto error;\n  }\n\n  if (buffer != NULL) {\n      rc = ssh_buffer_add_data(session->out_buffer,\n                           ssh_buffer_get(buffer),\n                           ssh_buffer_get_len(buffer));\n      if (rc < 0) {\n          ssh_set_error_oom(session);\n          rc = SSH_ERROR;\n          goto error;\n      }\n  }\n\n  session->global_req_state = SSH_CHANNEL_REQ_STATE_PENDING;\n  rc = ssh_packet_send(session);\n  if (rc == SSH_ERROR) {\n      return rc;\n  }\n\n  SSH_LOG(SSH_LOG_PACKET,\n      \"Sent a SSH_MSG_GLOBAL_REQUEST %s\", request);\n\n  if (reply == 0) {\n      session->global_req_state = SSH_CHANNEL_REQ_STATE_NONE;\n\n      return SSH_OK;\n  }\npending:\n  rc = ssh_handle_packets_termination(session,\n                                      SSH_TIMEOUT_DEFAULT,\n                                      ssh_global_request_termination,\n                                      session);\n\n  if(rc==SSH_ERROR || session->session_state == SSH_SESSION_STATE_ERROR){\n    session->global_req_state = SSH_CHANNEL_REQ_STATE_ERROR;\n  }\n  switch(session->global_req_state){\n    case SSH_CHANNEL_REQ_STATE_ACCEPTED:\n      SSH_LOG(SSH_LOG_PROTOCOL, \"Global request %s success\",request);\n      rc=SSH_OK;\n      break;\n    case SSH_CHANNEL_REQ_STATE_DENIED:\n      SSH_LOG(SSH_LOG_PACKET,\n          \"Global request %s failed\", request);\n      ssh_set_error(session, SSH_REQUEST_DENIED,\n          \"Global request %s failed\", request);\n      rc=SSH_ERROR;\n      break;\n    case SSH_CHANNEL_REQ_STATE_ERROR:\n    case SSH_CHANNEL_REQ_STATE_NONE:\n      rc = SSH_ERROR;\n      break;\n    case SSH_CHANNEL_REQ_STATE_PENDING:\n      return SSH_AGAIN;\n  }\n  session->global_req_state = SSH_CHANNEL_REQ_STATE_NONE;\n\n  return rc;\nerror:\n  ssh_buffer_reinit(session->out_buffer);\n\n  return rc;\n}\n\n/**\n * @brief Sends the \"tcpip-forward\" global request to ask the server to begin\n *        listening for inbound connections.\n *\n * @param[in]  session  The ssh session to send the request.\n *\n * @param[in]  address  The address to bind to on the server. Pass NULL to bind\n *                      to all available addresses on all protocol families\n *                      supported by the server.\n *\n * @param[in]  port     The port to bind to on the server. Pass 0 to ask the\n *                      server to allocate the next available unprivileged port\n *                      number\n *\n * @param[in]  bound_port The pointer to get actual bound port. Pass NULL to\n *                        ignore.\n *\n * @return              SSH_OK on success,\n *                      SSH_ERROR if an error occurred,\n *                      SSH_AGAIN if in nonblocking mode and call has\n *                      to be done again.\n **/\nint ssh_channel_listen_forward(ssh_session session,\n                               const char *address,\n                               int port,\n                               int *bound_port)\n{\n  ssh_buffer buffer = NULL;\n  int rc = SSH_ERROR;\n\n  if(session->global_req_state != SSH_CHANNEL_REQ_STATE_NONE)\n    goto pending;\n\n  buffer = ssh_buffer_new();\n  if (buffer == NULL) {\n    ssh_set_error_oom(session);\n    goto error;\n  }\n\n  rc = ssh_buffer_pack(buffer,\n                       \"sd\",\n                       address ? address : \"\",\n                       port);\n  if (rc != SSH_OK){\n    ssh_set_error_oom(session);\n    goto error;\n  }\npending:\n  rc = ssh_global_request(session, \"tcpip-forward\", buffer, 1);\n\n  /* TODO: FIXME no guarantee the last packet we received contains\n   * that info */\n  if (rc == SSH_OK && port == 0 && bound_port != NULL) {\n    rc = ssh_buffer_unpack(session->in_buffer, \"d\", bound_port);\n    if (rc != SSH_OK)\n        *bound_port = 0;\n  }\n\nerror:\n  SSH_BUFFER_FREE(buffer);\n  return rc;\n}\n\n/* DEPRECATED */\nint ssh_forward_listen(ssh_session session, const char *address, int port, int *bound_port) {\n  return ssh_channel_listen_forward(session, address, port, bound_port);\n}\n\n/* DEPRECATED */\nssh_channel ssh_forward_accept(ssh_session session, int timeout_ms) {\n  return ssh_channel_accept(session, SSH_CHANNEL_FORWARDED_TCPIP, timeout_ms, NULL);\n}\n\n/**\n * @brief Accept an incoming TCP/IP forwarding channel and get information\n * about incomming connection\n * @param[in]  session    The ssh session to use.\n *\n * @param[in]  timeout_ms A timeout in milliseconds.\n *\n * @param[in]  destination_port A pointer to destination port or NULL.\n *\n * @return Newly created channel, or NULL if no incoming channel request from\n *         the server\n */\nssh_channel ssh_channel_accept_forward(ssh_session session, int timeout_ms, int* destination_port) {\n  return ssh_channel_accept(session, SSH_CHANNEL_FORWARDED_TCPIP, timeout_ms, destination_port);\n}\n\n/**\n * @brief Sends the \"cancel-tcpip-forward\" global request to ask the server to\n *        cancel the tcpip-forward request.\n *\n * @param[in]  session  The ssh session to send the request.\n *\n * @param[in]  address  The bound address on the server.\n *\n * @param[in]  port     The bound port on the server.\n *\n * @return              SSH_OK on success,\n *                      SSH_ERROR if an error occurred,\n *                      SSH_AGAIN if in nonblocking mode and call has\n *                      to be done again.\n */\nint ssh_channel_cancel_forward(ssh_session session,\n                               const char *address,\n                               int port)\n{\n  ssh_buffer buffer = NULL;\n  int rc = SSH_ERROR;\n\n  if(session->global_req_state != SSH_CHANNEL_REQ_STATE_NONE)\n    goto pending;\n\n  buffer = ssh_buffer_new();\n  if (buffer == NULL) {\n    ssh_set_error_oom(session);\n    goto error;\n  }\n\n  rc = ssh_buffer_pack(buffer, \"sd\",\n                       address ? address : \"\",\n                       port);\n  if (rc != SSH_OK){\n      ssh_set_error_oom(session);\n      goto error;\n  }\npending:\n  rc = ssh_global_request(session, \"cancel-tcpip-forward\", buffer, 1);\n\nerror:\n  SSH_BUFFER_FREE(buffer);\n  return rc;\n}\n\n/* DEPRECATED */\nint ssh_forward_cancel(ssh_session session, const char *address, int port) {\n    return ssh_channel_cancel_forward(session, address, port);\n}\n\n/**\n * @brief Set environment variables.\n *\n * @param[in]  channel  The channel to set the environment variables.\n *\n * @param[in]  name     The name of the variable.\n *\n * @param[in]  value    The value to set.\n *\n * @return              SSH_OK on success,\n *                      SSH_ERROR if an error occurred,\n *                      SSH_AGAIN if in nonblocking mode and call has\n *                      to be done again.\n * @warning Some environment variables may be refused by security reasons.\n */\nint ssh_channel_request_env(ssh_channel channel, const char *name, const char *value) {\n  ssh_buffer buffer = NULL;\n  int rc = SSH_ERROR;\n\n  if(channel == NULL) {\n      return SSH_ERROR;\n  }\n  if(name == NULL || value == NULL) {\n      ssh_set_error_invalid(channel->session);\n      return rc;\n  }\n  switch(channel->request_state){\n  case SSH_CHANNEL_REQ_STATE_NONE:\n    break;\n  default:\n    goto pending;\n  }\n  buffer = ssh_buffer_new();\n  if (buffer == NULL) {\n    ssh_set_error_oom(channel->session);\n    goto error;\n  }\n\n  rc = ssh_buffer_pack(buffer,\n                       \"ss\",\n                       name,\n                       value);\n  if (rc != SSH_OK){\n    ssh_set_error_oom(channel->session);\n    goto error;\n  }\npending:\n  rc = channel_request(channel, \"env\", buffer,1);\nerror:\n  SSH_BUFFER_FREE(buffer);\n\n  return rc;\n}\n\n/**\n * @brief Run a shell command without an interactive shell.\n *\n * This is similar to 'sh -c command'.\n *\n * @param[in]  channel  The channel to execute the command.\n *\n * @param[in]  cmd      The command to execute\n *                      (e.g. \"ls ~/ -al | grep -i reports\").\n *\n * @return              SSH_OK on success,\n *                      SSH_ERROR if an error occurred,\n *                      SSH_AGAIN if in nonblocking mode and call has\n *                      to be done again.\n *\n * Example:\n@code\n   rc = ssh_channel_request_exec(channel, \"ps aux\");\n   if (rc > 0) {\n       return -1;\n   }\n\n   while ((rc = ssh_channel_read(channel, buffer, sizeof(buffer), 0)) > 0) {\n       if (fwrite(buffer, 1, rc, stdout) != (unsigned int) rc) {\n           return -1;\n       }\n   }\n@endcode\n *\n * @see ssh_channel_request_shell()\n */\nint ssh_channel_request_exec(ssh_channel channel, const char *cmd) {\n  ssh_buffer buffer = NULL;\n  int rc = SSH_ERROR;\n\n  if(channel == NULL) {\n      return SSH_ERROR;\n  }\n  if(cmd == NULL) {\n      ssh_set_error_invalid(channel->session);\n      return rc;\n  }\n\n  switch(channel->request_state){\n  case SSH_CHANNEL_REQ_STATE_NONE:\n    break;\n  default:\n    goto pending;\n  }\n  buffer = ssh_buffer_new();\n  if (buffer == NULL) {\n    ssh_set_error_oom(channel->session);\n    goto error;\n  }\n\n  rc = ssh_buffer_pack(buffer, \"s\", cmd);\n\n  if (rc != SSH_OK) {\n    ssh_set_error_oom(channel->session);\n    goto error;\n  }\npending:\n  rc = channel_request(channel, \"exec\", buffer, 1);\nerror:\n  SSH_BUFFER_FREE(buffer);\n  return rc;\n}\n\n\n/**\n * @brief Send a signal to remote process (as described in RFC 4254, section 6.9).\n *\n * Sends a signal 'sig' to the remote process.\n * Note, that remote system may not support signals concept.\n * In such a case this request will be silently ignored.\n * Only SSH-v2 is supported (I'm not sure about SSH-v1).\n *\n * OpenSSH doesn't support signals yet, see:\n * https://bugzilla.mindrot.org/show_bug.cgi?id=1424\n *\n * @param[in]  channel  The channel to send signal.\n *\n * @param[in]  sig      The signal to send (without SIG prefix)\n *                      \\n\\n\n *                      SIGABRT  -> ABRT \\n\n *                      SIGALRM  -> ALRM \\n\n *                      SIGFPE   -> FPE  \\n\n *                      SIGHUP   -> HUP  \\n\n *                      SIGILL   -> ILL  \\n\n *                      SIGINT   -> INT  \\n\n *                      SIGKILL  -> KILL \\n\n *                      SIGPIPE  -> PIPE \\n\n *                      SIGQUIT  -> QUIT \\n\n *                      SIGSEGV  -> SEGV \\n\n *                      SIGTERM  -> TERM \\n\n *                      SIGUSR1  -> USR1 \\n\n *                      SIGUSR2  -> USR2 \\n\n *\n * @return              SSH_OK on success, SSH_ERROR if an error occurred\n *                      (including attempts to send signal via SSH-v1 session).\n */\nint ssh_channel_request_send_signal(ssh_channel channel, const char *sig) {\n  ssh_buffer buffer = NULL;\n  int rc = SSH_ERROR;\n\n  if(channel == NULL) {\n      return SSH_ERROR;\n  }\n  if(sig == NULL) {\n      ssh_set_error_invalid(channel->session);\n      return rc;\n  }\n\n  buffer = ssh_buffer_new();\n  if (buffer == NULL) {\n    ssh_set_error_oom(channel->session);\n    goto error;\n  }\n\n  rc = ssh_buffer_pack(buffer, \"s\", sig);\n  if (rc != SSH_OK) {\n    ssh_set_error_oom(channel->session);\n    goto error;\n  }\n\n  rc = channel_request(channel, \"signal\", buffer, 0);\nerror:\n  SSH_BUFFER_FREE(buffer);\n  return rc;\n}\n\n\n/**\n * @brief Send a break signal to the server (as described in RFC 4335).\n *\n * Sends a break signal to the remote process.\n * Note, that remote system may not support breaks.\n * In such a case this request will be silently ignored.\n * Only SSH-v2 is supported.\n *\n * @param[in]  channel  The channel to send the break to.\n *\n * @param[in]  length   The break-length in milliseconds to send.\n *\n * @return              SSH_OK on success, SSH_ERROR if an error occurred\n *                      (including attempts to send signal via SSH-v1 session).\n */\nint ssh_channel_request_send_break(ssh_channel channel, uint32_t length) {\n    ssh_buffer buffer = NULL;\n    int rc = SSH_ERROR;\n\n    if (channel == NULL) {\n        return SSH_ERROR;\n    }\n\n    buffer = ssh_buffer_new();\n    if (buffer == NULL) {\n        ssh_set_error_oom(channel->session);\n        goto error;\n    }\n\n    rc = ssh_buffer_pack(buffer, \"d\", length);\n    if (rc != SSH_OK) {\n        ssh_set_error_oom(channel->session);\n        goto error;\n    }\n\n    rc = channel_request(channel, \"break\", buffer, 0);\n\nerror:\n    SSH_BUFFER_FREE(buffer);\n    return rc;\n}\n\n\n/**\n * @brief Read data from a channel into a buffer.\n *\n * @param[in]  channel  The channel to read from.\n *\n * @param[in]  buffer   The buffer which will get the data.\n *\n * @param[in]  count    The count of bytes to be read. If it is bigger than 0,\n *                      the exact size will be read, else (bytes=0) it will\n *                      return once anything is available.\n *\n * @param is_stderr     A boolean value to mark reading from the stderr stream.\n *\n * @return              The number of bytes read, 0 on end of file or SSH_ERROR\n *                      on error.\n * @deprecated          Please use ssh_channel_read instead\n * @warning             This function doesn't work in nonblocking/timeout mode\n * @see ssh_channel_read\n */\nint channel_read_buffer(ssh_channel channel, ssh_buffer buffer, uint32_t count,\n    int is_stderr) {\n  ssh_session session;\n  char buffer_tmp[8192];\n  int r;\n  uint32_t total=0;\n\n  if(channel == NULL) {\n      return SSH_ERROR;\n  }\n  session = channel->session;\n\n  if(buffer == NULL) {\n      ssh_set_error_invalid(channel->session);\n      return SSH_ERROR;\n  }\n\n  ssh_buffer_reinit(buffer);\n  if(count==0){\n    do {\n      r=ssh_channel_poll(channel, is_stderr);\n      if(r < 0){\n        return r;\n      }\n      if(r > 0){\n        r=ssh_channel_read(channel, buffer_tmp, r, is_stderr);\n        if(r < 0){\n          return r;\n        }\n        if(ssh_buffer_add_data(buffer,buffer_tmp,r) < 0){\n          ssh_set_error_oom(session);\n          r = SSH_ERROR;\n        }\n\n        return r;\n      }\n      if(ssh_channel_is_eof(channel)){\n        return 0;\n      }\n      ssh_handle_packets(channel->session, SSH_TIMEOUT_INFINITE);\n    } while (r == 0);\n  }\n  while(total < count){\n    r=ssh_channel_read(channel, buffer_tmp, sizeof(buffer_tmp), is_stderr);\n    if(r<0){\n      return r;\n    }\n    if(r==0){\n      return total;\n    }\n    if (ssh_buffer_add_data(buffer,buffer_tmp,r) < 0) {\n      ssh_set_error_oom(session);\n\n      return SSH_ERROR;\n    }\n    total += r;\n  }\n\n  return total;\n}\n\nstruct ssh_channel_read_termination_struct {\n  ssh_channel channel;\n  uint32_t count;\n  ssh_buffer buffer;\n};\n\nstatic int ssh_channel_read_termination(void *s){\n  struct ssh_channel_read_termination_struct *ctx = s;\n  if (ssh_buffer_get_len(ctx->buffer) >= ctx->count ||\n      ctx->channel->remote_eof ||\n      ctx->channel->session->session_state == SSH_SESSION_STATE_ERROR)\n    return 1;\n  else\n    return 0;\n}\n\n/* TODO FIXME Fix the delayed close thing */\n/* TODO FIXME Fix the blocking behaviours */\n\n/**\n * @brief Reads data from a channel.\n *\n * @param[in]  channel  The channel to read from.\n *\n * @param[in]  dest     The destination buffer which will get the data.\n *\n * @param[in]  count    The count of bytes to be read.\n *\n * @param[in]  is_stderr A boolean value to mark reading from the stderr flow.\n *\n * @return              The number of bytes read, 0 on end of file or SSH_ERROR\n *                      on error. In nonblocking mode it Can return 0 if no data\n *                      is available or SSH_AGAIN.\n *\n * @warning This function may return less than count bytes of data, and won't\n *          block until count bytes have been read.\n * @warning The read function using a buffer has been renamed to\n *          channel_read_buffer().\n */\nint ssh_channel_read(ssh_channel channel, void *dest, uint32_t count, int is_stderr)\n{\n    return ssh_channel_read_timeout(channel,\n                                    dest,\n                                    count,\n                                    is_stderr,\n                                    SSH_TIMEOUT_DEFAULT);\n}\n\n/**\n * @brief Reads data from a channel.\n *\n * @param[in]  channel     The channel to read from.\n *\n * @param[in]  dest        The destination buffer which will get the data.\n *\n * @param[in]  count       The count of bytes to be read.\n *\n * @param[in]  is_stderr   A boolean value to mark reading from the stderr flow.\n *\n * @param[in]  timeout_ms  A timeout in milliseconds. A value of -1 means\n *                         infinite timeout.\n *\n * @return              The number of bytes read, 0 on end of file or SSH_ERROR\n *                      on error. In nonblocking mode it Can return 0 if no data\n *                      is available or SSH_AGAIN.\n *\n * @warning This function may return less than count bytes of data, and won't\n *          block until count bytes have been read.\n * @warning The read function using a buffer has been renamed to\n *          channel_read_buffer().\n */\nint ssh_channel_read_timeout(ssh_channel channel,\n                             void *dest,\n                             uint32_t count,\n                             int is_stderr,\n                             int timeout_ms)\n{\n  ssh_session session;\n  ssh_buffer stdbuf;\n  uint32_t len;\n  struct ssh_channel_read_termination_struct ctx;\n  int rc;\n\n  if(channel == NULL) {\n      return SSH_ERROR;\n  }\n  if(dest == NULL) {\n      ssh_set_error_invalid(channel->session);\n      return SSH_ERROR;\n  }\n\n  session = channel->session;\n  stdbuf = channel->stdout_buffer;\n\n  if (count == 0) {\n    return 0;\n  }\n\n  if (is_stderr) {\n    stdbuf=channel->stderr_buffer;\n  }\n\n  /*\n   * We may have problem if the window is too small to accept as much data\n   * as asked\n   */\n  SSH_LOG(SSH_LOG_PACKET,\n      \"Read (%d) buffered : %d bytes. Window: %d\",\n      count,\n      ssh_buffer_get_len(stdbuf),\n      channel->local_window);\n\n  if (count > ssh_buffer_get_len(stdbuf) + channel->local_window) {\n    if (grow_window(session, channel, count - ssh_buffer_get_len(stdbuf)) < 0) {\n      return -1;\n    }\n  }\n\n  /* block reading until at least one byte has been read\n  *  and ignore the trivial case count=0\n  */\n  ctx.channel = channel;\n  ctx.buffer = stdbuf;\n  ctx.count = 1;\n\n  if (timeout_ms < SSH_TIMEOUT_DEFAULT) {\n      timeout_ms = SSH_TIMEOUT_INFINITE;\n  }\n\n  rc = ssh_handle_packets_termination(session,\n                                      timeout_ms,\n                                      ssh_channel_read_termination,\n                                      &ctx);\n\n  if (rc == SSH_AGAIN && ssh_is_blocking(session)) {\n\t  ssh_set_error(session, SSH_FATAL, \"Handle packets timeout.\");\n\t  return rc;\n  }\n\n  if (rc == SSH_ERROR){\n    return rc;\n  }\n\n  /*\n   * If the channel is closed or in an error state, reading from it is an error\n   */\n  if (session->session_state == SSH_SESSION_STATE_ERROR) {\n      return SSH_ERROR;\n  }\n  /* If the server closed the channel properly, there is nothing to do */\n  if (channel->remote_eof && ssh_buffer_get_len(stdbuf) == 0) {\n      return 0;\n  }\n  if (channel->state == SSH_CHANNEL_STATE_CLOSED) {\n      ssh_set_error(session,\n                    SSH_FATAL,\n                    \"Remote channel is closed.\");\n      return SSH_ERROR;\n  }\n  len = ssh_buffer_get_len(stdbuf);\n  /* Read count bytes if len is greater, everything otherwise */\n  len = (len > count ? count : len);\n  memcpy(dest, ssh_buffer_get(stdbuf), len);\n  ssh_buffer_pass_bytes(stdbuf,len);\n  if (channel->counter != NULL) {\n      channel->counter->in_bytes += len;\n  }\n  /* Authorize some buffering while userapp is busy */\n  if (channel->local_window < WINDOWLIMIT) {\n    if (grow_window(session, channel, 0) < 0) {\n      return -1;\n    }\n  }\n\n  return len;\n}\n\n/**\n * @brief Do a nonblocking read on the channel.\n *\n * A nonblocking read on the specified channel. it will return <= count bytes of\n * data read atomically.\n *\n * @param[in]  channel  The channel to read from.\n *\n * @param[in]  dest     A pointer to a destination buffer.\n *\n * @param[in]  count    The count of bytes of data to be read.\n *\n * @param[in]  is_stderr A boolean to select the stderr stream.\n *\n * @return              The number of bytes read, 0 if nothing is available or\n *                      SSH_ERROR on error.\n *\n * @warning Don't forget to check for EOF as it would return 0 here.\n *\n * @see ssh_channel_is_eof()\n */\nint ssh_channel_read_nonblocking(ssh_channel channel,\n                                 void *dest,\n                                 uint32_t count,\n                                 int is_stderr)\n{\n    ssh_session session;\n    ssize_t to_read;\n    int rc;\n    int blocking;\n\n    if(channel == NULL) {\n        return SSH_ERROR;\n    }\n    if(dest == NULL) {\n        ssh_set_error_invalid(channel->session);\n        return SSH_ERROR;\n    }\n\n    session = channel->session;\n\n    to_read = ssh_channel_poll(channel, is_stderr);\n\n    if (to_read <= 0) {\n        if (session->session_state == SSH_SESSION_STATE_ERROR){\n            return SSH_ERROR;\n        }\n\n        return to_read; /* may be an error code */\n    }\n\n    if ((size_t)to_read > count) {\n        to_read = (ssize_t)count;\n    }\n    blocking = ssh_is_blocking(session);\n    ssh_set_blocking(session, 0);\n    rc = ssh_channel_read(channel, dest, (uint32_t)to_read, is_stderr);\n    ssh_set_blocking(session,blocking);\n\n    return rc;\n}\n\n/**\n * @brief Polls a channel for data to read.\n *\n * @param[in]  channel  The channel to poll.\n *\n * @param[in]  is_stderr A boolean to select the stderr stream.\n *\n * @return              The number of bytes available for reading, 0 if nothing\n *                      is available or SSH_ERROR on error.\n *\n * @warning When the channel is in EOF state, the function returns SSH_EOF.\n *\n * @see ssh_channel_is_eof()\n */\nint ssh_channel_poll(ssh_channel channel, int is_stderr){\n  ssh_buffer stdbuf;\n\n  if(channel == NULL) {\n      return SSH_ERROR;\n  }\n\n  stdbuf = channel->stdout_buffer;\n\n  if (is_stderr) {\n    stdbuf = channel->stderr_buffer;\n  }\n\n  if (ssh_buffer_get_len(stdbuf) == 0 && channel->remote_eof == 0) {\n    if (channel->session->session_state == SSH_SESSION_STATE_ERROR){\n      return SSH_ERROR;\n    }\n    if (ssh_handle_packets(channel->session, SSH_TIMEOUT_NONBLOCKING)==SSH_ERROR) {\n      return SSH_ERROR;\n    }\n  }\n\n  if (ssh_buffer_get_len(stdbuf) > 0){\n  \treturn ssh_buffer_get_len(stdbuf);\n  }\n\n  if (channel->remote_eof) {\n    return SSH_EOF;\n  }\n\n  return ssh_buffer_get_len(stdbuf);\n}\n\n/**\n * @brief Polls a channel for data to read, waiting for a certain timeout.\n *\n * @param[in]  channel   The channel to poll.\n * @param[in]  timeout   Set an upper limit on the time for which this function\n *                       will block, in milliseconds. Specifying a negative value\n *                       means an infinite timeout. This parameter is passed to\n *                       the poll() function.\n * @param[in]  is_stderr A boolean to select the stderr stream.\n *\n * @return              The number of bytes available for reading,\n *                      0 if nothing is available (timeout elapsed),\n *                      SSH_EOF on end of file,\n *                      SSH_ERROR on error.\n *\n * @warning When the channel is in EOF state, the function returns SSH_EOF.\n *\n * @see ssh_channel_is_eof()\n */\nint ssh_channel_poll_timeout(ssh_channel channel, int timeout, int is_stderr)\n{\n    ssh_session session;\n    ssh_buffer stdbuf;\n    struct ssh_channel_read_termination_struct ctx;\n    size_t len;\n    int rc;\n\n    if (channel == NULL) {\n        return SSH_ERROR;\n    }\n\n    session = channel->session;\n    stdbuf = channel->stdout_buffer;\n\n    if (is_stderr) {\n        stdbuf = channel->stderr_buffer;\n    }\n    ctx.buffer = stdbuf;\n    ctx.channel = channel;\n    ctx.count = 1;\n    rc = ssh_handle_packets_termination(channel->session,\n                                        timeout,\n                                        ssh_channel_read_termination,\n                                        &ctx);\n    if (rc == SSH_ERROR ||\n        session->session_state == SSH_SESSION_STATE_ERROR) {\n        rc = SSH_ERROR;\n        goto out;\n    } else if (rc == SSH_AGAIN) {\n        /* If the above timeout expired, it is ok and we do not need to\n         * attempt to check the read buffer. The calling functions do not\n         * expect us to return SSH_AGAIN either here. */\n        rc = SSH_OK;\n        goto out;\n    }\n    len = ssh_buffer_get_len(stdbuf);\n    if (len > 0) {\n        if (len > INT_MAX) {\n            rc = SSH_ERROR;\n        } else {\n            rc = (int)len;\n        }\n        goto out;\n    }\n    if (channel->remote_eof) {\n        rc = SSH_EOF;\n    }\n\nout:\n    return rc;\n}\n\n/**\n * @brief Recover the session in which belongs a channel.\n *\n * @param[in]  channel  The channel to recover the session from.\n *\n * @return              The session pointer.\n */\nssh_session ssh_channel_get_session(ssh_channel channel) {\n  if(channel == NULL) {\n      return NULL;\n  }\n\n  return channel->session;\n}\n\nstatic int ssh_channel_exit_status_termination(void *c){\n  ssh_channel channel = c;\n  if(channel->exit_status != -1 ||\n      /* When a channel is closed, no exit status message can\n       * come anymore */\n      (channel->flags & SSH_CHANNEL_FLAG_CLOSED_REMOTE) ||\n      channel->session->session_state == SSH_SESSION_STATE_ERROR)\n    return 1;\n  else\n    return 0;\n}\n\n/**\n * @brief Get the exit status of the channel (error code from the executed\n *        instruction).\n *\n * @param[in]  channel  The channel to get the status from.\n *\n * @return              The exit status, -1 if no exit status has been returned\n *                      (yet), or SSH_ERROR on error.\n * @warning             This function may block until a timeout (or never)\n *                      if the other side is not willing to close the channel.\n *\n * If you're looking for an async handling of this register a callback for the\n * exit status.\n *\n * @see ssh_channel_exit_status_callback\n */\nint ssh_channel_get_exit_status(ssh_channel channel) {\n  int rc;\n  if(channel == NULL) {\n      return SSH_ERROR;\n  }\n  rc = ssh_handle_packets_termination(channel->session,\n                                      SSH_TIMEOUT_DEFAULT,\n                                      ssh_channel_exit_status_termination,\n                                      channel);\n  if (rc == SSH_ERROR || channel->session->session_state ==\n      SSH_SESSION_STATE_ERROR)\n    return SSH_ERROR;\n  return channel->exit_status;\n}\n\n/*\n * This function acts as a meta select.\n *\n * First, channels are analyzed to seek potential can-write or can-read ones,\n * then if no channel has been elected, it goes in a loop with the posix\n * select(2).\n * This is made in two parts: protocol select and network select. The protocol\n * select does not use the network functions at all\n */\nstatic int channel_protocol_select(ssh_channel *rchans, ssh_channel *wchans,\n    ssh_channel *echans, ssh_channel *rout, ssh_channel *wout, ssh_channel *eout) {\n  ssh_channel chan;\n  int i;\n  int j = 0;\n\n  for (i = 0; rchans[i] != NULL; i++) {\n    chan = rchans[i];\n\n    while (ssh_channel_is_open(chan) && ssh_socket_data_available(chan->session->socket)) {\n      ssh_handle_packets(chan->session, SSH_TIMEOUT_NONBLOCKING);\n    }\n\n    if ((chan->stdout_buffer && ssh_buffer_get_len(chan->stdout_buffer) > 0) ||\n        (chan->stderr_buffer && ssh_buffer_get_len(chan->stderr_buffer) > 0) ||\n        chan->remote_eof) {\n      rout[j] = chan;\n      j++;\n    }\n  }\n  rout[j] = NULL;\n\n  j = 0;\n  for(i = 0; wchans[i] != NULL; i++) {\n    chan = wchans[i];\n    /* It's not our business to seek if the file descriptor is writable */\n    if (ssh_socket_data_writable(chan->session->socket) &&\n        ssh_channel_is_open(chan) && (chan->remote_window > 0)) {\n      wout[j] = chan;\n      j++;\n    }\n  }\n  wout[j] = NULL;\n\n  j = 0;\n  for (i = 0; echans[i] != NULL; i++) {\n    chan = echans[i];\n\n    if (!ssh_socket_is_open(chan->session->socket) || ssh_channel_is_closed(chan)) {\n      eout[j] = chan;\n      j++;\n    }\n  }\n  eout[j] = NULL;\n\n  return 0;\n}\n\n/* Just count number of pointers in the array */\nstatic size_t count_ptrs(ssh_channel *ptrs)\n{\n  size_t c;\n  for (c = 0; ptrs[c] != NULL; c++)\n    ;\n\n  return c;\n}\n\n/**\n * @brief Act like the standard select(2) on channels.\n *\n * The list of pointers are then actualized and will only contain pointers to\n * channels that are respectively readable, writable or have an exception to\n * trap.\n *\n * @param[in]  readchans A NULL pointer or an array of channel pointers,\n *                       terminated by a NULL.\n *\n * @param[in]  writechans A NULL pointer or an array of channel pointers,\n *                        terminated by a NULL.\n *\n * @param[in]  exceptchans A NULL pointer or an array of channel pointers,\n *                         terminated by a NULL.\n *\n * @param[in]  timeout  Timeout as defined by select(2).\n *\n * @return             SSH_OK on a successful operation, SSH_EINTR if the\n *                     select(2) syscall was interrupted, then relaunch the\n *                     function, or SSH_ERROR on error.\n */\nint ssh_channel_select(ssh_channel *readchans, ssh_channel *writechans,\n    ssh_channel *exceptchans, struct timeval * timeout) {\n  ssh_channel *rchans, *wchans, *echans;\n  ssh_channel dummy = NULL;\n  ssh_event event = NULL;\n  int rc;\n  int i;\n  int tm, tm_base;\n  int firstround=1;\n  struct ssh_timestamp ts;\n\n  if (timeout != NULL)\n    tm_base = timeout->tv_sec * 1000 + timeout->tv_usec/1000;\n  else\n    tm_base = SSH_TIMEOUT_INFINITE;\n  ssh_timestamp_init(&ts);\n  tm = tm_base;\n  /* don't allow NULL pointers */\n  if (readchans == NULL) {\n    readchans = &dummy;\n  }\n\n  if (writechans == NULL) {\n    writechans = &dummy;\n  }\n\n  if (exceptchans == NULL) {\n    exceptchans = &dummy;\n  }\n\n  if (readchans[0] == NULL && writechans[0] == NULL && exceptchans[0] == NULL) {\n    /* No channel to poll?? Go away! */\n    return 0;\n  }\n\n  /* Prepare the outgoing temporary arrays */\n  rchans = calloc(count_ptrs(readchans) + 1, sizeof(ssh_channel));\n  if (rchans == NULL) {\n    return SSH_ERROR;\n  }\n\n  wchans = calloc(count_ptrs(writechans) + 1, sizeof(ssh_channel));\n  if (wchans == NULL) {\n    SAFE_FREE(rchans);\n    return SSH_ERROR;\n  }\n\n  echans = calloc(count_ptrs(exceptchans) + 1, sizeof(ssh_channel));\n  if (echans == NULL) {\n    SAFE_FREE(rchans);\n    SAFE_FREE(wchans);\n    return SSH_ERROR;\n  }\n\n  /*\n   * First, try without doing network stuff then, use the ssh_poll\n   * infrastructure to poll on all sessions.\n   */\n  do {\n    channel_protocol_select(readchans, writechans, exceptchans,\n        rchans, wchans, echans);\n    if (rchans[0] != NULL || wchans[0] != NULL || echans[0] != NULL) {\n      /* At least one channel has an event */\n      break;\n    }\n    /* Add all channels' sessions right into an event object */\n    if (event == NULL) {\n      event = ssh_event_new();\n      if (event == NULL) {\n          SAFE_FREE(rchans);\n          SAFE_FREE(wchans);\n          SAFE_FREE(echans);\n\n          return SSH_ERROR;\n      }\n      for (i = 0; readchans[i] != NULL; i++) {\n        ssh_poll_get_default_ctx(readchans[i]->session);\n        ssh_event_add_session(event, readchans[i]->session);\n      }\n      for (i = 0; writechans[i] != NULL; i++) {\n        ssh_poll_get_default_ctx(writechans[i]->session);\n        ssh_event_add_session(event, writechans[i]->session);\n      }\n      for (i = 0; exceptchans[i] != NULL; i++) {\n        ssh_poll_get_default_ctx(exceptchans[i]->session);\n        ssh_event_add_session(event, exceptchans[i]->session);\n      }\n    }\n    /* Get out if the timeout has elapsed */\n    if (!firstround && ssh_timeout_elapsed(&ts, tm_base)){\n      break;\n    }\n    /* Here we go */\n    rc = ssh_event_dopoll(event,tm);\n    if (rc != SSH_OK){\n      SAFE_FREE(rchans);\n      SAFE_FREE(wchans);\n      SAFE_FREE(echans);\n      ssh_event_free(event);\n      return rc;\n    }\n    tm = ssh_timeout_update(&ts, tm_base);\n    firstround=0;\n  } while(1);\n\n  memcpy(readchans, rchans, (count_ptrs(rchans) + 1) * sizeof(ssh_channel ));\n  memcpy(writechans, wchans, (count_ptrs(wchans) + 1) * sizeof(ssh_channel ));\n  memcpy(exceptchans, echans, (count_ptrs(echans) + 1) * sizeof(ssh_channel ));\n  SAFE_FREE(rchans);\n  SAFE_FREE(wchans);\n  SAFE_FREE(echans);\n  if(event)\n    ssh_event_free(event);\n  return 0;\n}\n\n/**\n * @brief Set the channel data counter.\n *\n * @code\n * struct ssh_counter_struct counter = {\n *     .in_bytes = 0,\n *     .out_bytes = 0,\n *     .in_packets = 0,\n *     .out_packets = 0\n * };\n *\n * ssh_channel_set_counter(channel, &counter);\n * @endcode\n *\n * @param[in] channel The SSH channel.\n *\n * @param[in] counter Counter for bytes handled by the channel.\n */\nvoid ssh_channel_set_counter(ssh_channel channel,\n                             ssh_counter counter) {\n    if (channel != NULL) {\n        channel->counter = counter;\n    }\n}\n\n/**\n * @brief Blocking write on a channel stderr.\n *\n * @param[in]  channel  The channel to write to.\n *\n * @param[in]  data     A pointer to the data to write.\n *\n * @param[in]  len      The length of the buffer to write to.\n *\n * @return              The number of bytes written, SSH_ERROR on error.\n *\n * @see ssh_channel_read()\n */\nint ssh_channel_write_stderr(ssh_channel channel, const void *data, uint32_t len) {\n  return channel_write_common(channel, data, len, 1);\n}\n\n#if WITH_SERVER\n\n/**\n * @brief Open a TCP/IP reverse forwarding channel.\n *\n * @param[in]  channel  An allocated channel.\n *\n * @param[in]  remotehost The remote host to connected (host name or IP).\n *\n * @param[in]  remoteport The remote port.\n *\n * @param[in]  sourcehost The source host (your local computer). It's optional\n *                        and for logging purpose.\n *\n * @param[in]  localport  The source port (your local computer). It's optional\n *                        and for logging purpose.\n *\n * @return              SSH_OK on success,\n *                      SSH_ERROR if an error occurred,\n *                      SSH_AGAIN if in nonblocking mode and call has\n *                      to be done again.\n *\n * @warning This function does not bind the local port and does not automatically\n *          forward the content of a socket to the channel. You still have to\n *          use channel_read and channel_write for this.\n */\nint ssh_channel_open_reverse_forward(ssh_channel channel, const char *remotehost,\n    int remoteport, const char *sourcehost, int localport) {\n  ssh_session session;\n  ssh_buffer payload = NULL;\n  int rc = SSH_ERROR;\n\n  if(channel == NULL) {\n      return rc;\n  }\n  if(remotehost == NULL || sourcehost == NULL) {\n      ssh_set_error_invalid(channel->session);\n      return rc;\n  }\n\n  session = channel->session;\n\n  if(channel->state != SSH_CHANNEL_STATE_NOT_OPEN)\n    goto pending;\n  payload = ssh_buffer_new();\n  if (payload == NULL) {\n    ssh_set_error_oom(session);\n    goto error;\n  }\n  rc = ssh_buffer_pack(payload,\n                       \"sdsd\",\n                       remotehost,\n                       remoteport,\n                       sourcehost,\n                       localport);\n  if (rc != SSH_OK){\n    ssh_set_error_oom(session);\n    goto error;\n  }\npending:\n  rc = channel_open(channel,\n                    \"forwarded-tcpip\",\n                    CHANNEL_INITIAL_WINDOW,\n                    CHANNEL_MAX_PACKET,\n                    payload);\n\nerror:\n  SSH_BUFFER_FREE(payload);\n\n  return rc;\n}\n\n/**\n * @brief Open a X11 channel.\n *\n * @param[in]  channel      An allocated channel.\n *\n * @param[in]  orig_addr    The source host (the local server).\n *\n * @param[in]  orig_port    The source port (the local server).\n *\n * @return              SSH_OK on success,\n *                      SSH_ERROR if an error occurred,\n *                      SSH_AGAIN if in nonblocking mode and call has\n *                      to be done again.\n * @warning This function does not bind the local port and does not automatically\n *          forward the content of a socket to the channel. You still have to\n *          use channel_read and channel_write for this.\n */\nint ssh_channel_open_x11(ssh_channel channel, \n        const char *orig_addr, int orig_port) {\n  ssh_session session;\n  ssh_buffer payload = NULL;\n  int rc = SSH_ERROR;\n\n  if(channel == NULL) {\n      return rc;\n  }\n  if(orig_addr == NULL) {\n      ssh_set_error_invalid(channel->session);\n      return rc;\n  }\n  session = channel->session;\n\n  if(channel->state != SSH_CHANNEL_STATE_NOT_OPEN)\n    goto pending;\n\n  payload = ssh_buffer_new();\n  if (payload == NULL) {\n    ssh_set_error_oom(session);\n    goto error;\n  }\n\n  rc = ssh_buffer_pack(payload,\n                       \"sd\",\n                       orig_addr,\n                       orig_port);\n  if (rc != SSH_OK) {\n    ssh_set_error_oom(session);\n    goto error;\n  }\npending:\n  rc = channel_open(channel,\n                    \"x11\",\n                    CHANNEL_INITIAL_WINDOW,\n                    CHANNEL_MAX_PACKET,\n                    payload);\n\nerror:\n  SSH_BUFFER_FREE(payload);\n\n  return rc;\n}\n\n/**\n * @brief Send the exit status to the remote process\n *\n * Sends the exit status to the remote process (as described in RFC 4254,\n * section 6.10).\n * Only SSH-v2 is supported (I'm not sure about SSH-v1).\n *\n * @param[in]  channel  The channel to send exit status.\n *\n * @param[in]  exit_status  The exit status to send\n *\n * @return     SSH_OK on success, SSH_ERROR if an error occurred.\n *             (including attempts to send exit status via SSH-v1 session).\n */\nint ssh_channel_request_send_exit_status(ssh_channel channel, int exit_status) {\n  ssh_buffer buffer = NULL;\n  int rc = SSH_ERROR;\n\n  if(channel == NULL) {\n      return SSH_ERROR;\n  }\n\n  buffer = ssh_buffer_new();\n  if (buffer == NULL) {\n    ssh_set_error_oom(channel->session);\n    goto error;\n  }\n\n  rc = ssh_buffer_pack(buffer, \"d\", exit_status);\n  if (rc != SSH_OK) {\n    ssh_set_error_oom(channel->session);\n    goto error;\n  }\n\n  rc = channel_request(channel, \"exit-status\", buffer, 0);\nerror:\n  SSH_BUFFER_FREE(buffer);\n  return rc;\n}\n\n/**\n * @brief Send an exit signal to remote process (RFC 4254, section 6.10).\n *\n * This sends the exit status of the remote process.\n * Note, that remote system may not support signals concept.\n * In such a case this request will be silently ignored.\n * Only SSH-v2 is supported (I'm not sure about SSH-v1).\n *\n * @param[in]  channel  The channel to send signal.\n *\n * @param[in]  sig      The signal to send (without SIG prefix)\n *                      (e.g. \"TERM\" or \"KILL\").\n * @param[in]  core     A boolean to tell if a core was dumped\n * @param[in]  errmsg   A CRLF explanation text about the error condition\n * @param[in]  lang     The language used in the message (format: RFC 3066)\n *\n * @return              SSH_OK on success, SSH_ERROR if an error occurred\n *                      (including attempts to send signal via SSH-v1 session).\n */\nint ssh_channel_request_send_exit_signal(ssh_channel channel, const char *sig,\n                            int core, const char *errmsg, const char *lang) {\n  ssh_buffer buffer = NULL;\n  int rc = SSH_ERROR;\n\n  if(channel == NULL) {\n      return rc;\n  }\n  if(sig == NULL || errmsg == NULL || lang == NULL) {\n      ssh_set_error_invalid(channel->session);\n      return rc;\n  }\n\n  buffer = ssh_buffer_new();\n  if (buffer == NULL) {\n    ssh_set_error_oom(channel->session);\n    goto error;\n  }\n\n  rc = ssh_buffer_pack(buffer,\n                       \"sbss\",\n                       sig,\n                       core ? 1 : 0,\n                       errmsg,\n                       lang);\n  if (rc != SSH_OK) {\n    ssh_set_error_oom(channel->session);\n    goto error;\n  }\n\n  rc = channel_request(channel, \"exit-signal\", buffer, 0);\nerror:\n  SSH_BUFFER_FREE(buffer);\n  return rc;\n}\n\n#endif\n\n/* @} */\n"
  },
  {
    "path": "src/libssh/src/client.c",
    "content": "/*\n * client.c - SSH client functions\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2003-2013 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <stdio.h>\n\n#ifndef _WIN32\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#endif\n\n#include \"libssh/priv.h\"\n#include \"libssh/ssh2.h\"\n#include \"libssh/buffer.h\"\n#include \"libssh/packet.h\"\n#include \"libssh/options.h\"\n#include \"libssh/socket.h\"\n#include \"libssh/session.h\"\n#include \"libssh/dh.h\"\n#ifdef WITH_GEX\n#include \"libssh/dh-gex.h\"\n#endif /* WITH_GEX */\n#include \"libssh/ecdh.h\"\n#include \"libssh/threads.h\"\n#include \"libssh/misc.h\"\n#include \"libssh/pki.h\"\n#include \"libssh/kex.h\"\n\n#define set_status(session, status) do {\\\n        if (session->common.callbacks && session->common.callbacks->connect_status_function) \\\n            session->common.callbacks->connect_status_function(session->common.callbacks->userdata, status); \\\n    } while (0)\n\n/**\n * @internal\n * @brief Callback to be called when the socket is connected or had a\n * connection error. Changes the state of the session and updates the error\n * message.\n * @param code one of SSH_SOCKET_CONNECTED_OK or SSH_SOCKET_CONNECTED_ERROR\n * @param user is a pointer to session\n */\nstatic void socket_callback_connected(int code, int errno_code, void *user){\n\tssh_session session=(ssh_session)user;\n\n\tif (session->session_state != SSH_SESSION_STATE_CONNECTING &&\n\t    session->session_state != SSH_SESSION_STATE_SOCKET_CONNECTED)\n\t{\n\t\tssh_set_error(session,SSH_FATAL, \"Wrong state in socket_callback_connected : %d\",\n\t\t\t\tsession->session_state);\n\n\t\treturn;\n\t}\n\n\tSSH_LOG(SSH_LOG_RARE,\"Socket connection callback: %d (%d)\",code, errno_code);\n\tif(code == SSH_SOCKET_CONNECTED_OK)\n\t\tsession->session_state=SSH_SESSION_STATE_SOCKET_CONNECTED;\n\telse {\n\t\tsession->session_state=SSH_SESSION_STATE_ERROR;\n\t\tssh_set_error(session,SSH_FATAL,\"%s\",strerror(errno_code));\n\t}\n\tsession->ssh_connection_callback(session);\n}\n\n/**\n * @internal\n *\n * @brief Gets the banner from socket and saves it in session.\n * Updates the session state\n *\n * @param  data pointer to the beginning of header\n * @param  len size of the banner\n * @param  user is a pointer to session\n * @returns Number of bytes processed, or zero if the banner is not complete.\n */\nstatic int callback_receive_banner(const void *data, size_t len, void *user)\n{\n    char *buffer = (char *)data;\n    ssh_session session=(ssh_session) user;\n    char *str = NULL;\n    size_t i;\n    int ret=0;\n\n    if (session->session_state != SSH_SESSION_STATE_SOCKET_CONNECTED) {\n        ssh_set_error(session,SSH_FATAL,\n                      \"Wrong state in callback_receive_banner : %d\",\n                      session->session_state);\n\n        return SSH_ERROR;\n    }\n    for (i = 0; i < len; ++i) {\n#ifdef WITH_PCAP\n        if (session->pcap_ctx && buffer[i] == '\\n') {\n            ssh_pcap_context_write(session->pcap_ctx,\n                                   SSH_PCAP_DIR_IN,\n                                   buffer,i+1,\n                                   i+1);\n        }\n#endif\n        if (buffer[i] == '\\r') {\n            buffer[i] = '\\0';\n        }\n        if (buffer[i] == '\\n') {\n            int cmp;\n\n            buffer[i] = '\\0';\n\n            /* The server MAY send other lines of data... */\n            cmp = strncmp(buffer, \"SSH-\", 4);\n            if (cmp == 0) {\n                str = strdup(buffer);\n                if (str == NULL) {\n                    return SSH_ERROR;\n                }\n                /* number of bytes read */\n                ret = i + 1;\n                session->serverbanner = str;\n                session->session_state = SSH_SESSION_STATE_BANNER_RECEIVED;\n                SSH_LOG(SSH_LOG_PACKET, \"Received banner: %s\", str);\n                session->ssh_connection_callback(session);\n\n                return ret;\n            } else {\n                SSH_LOG(SSH_LOG_DEBUG,\n                        \"ssh_protocol_version_exchange: %s\",\n                        buffer);\n                ret = i + 1;\n                break;\n            }\n        }\n        /* According to RFC 4253 the max banner length is 255 */\n        if (i > 255) {\n            /* Too big banner */\n            session->session_state=SSH_SESSION_STATE_ERROR;\n            ssh_set_error(session,\n                          SSH_FATAL,\n                          \"Receiving banner: too large banner\");\n\n            return 0;\n        }\n    }\n\n    return ret;\n}\n\n/** @internal\n * @brief Sends a SSH banner to the server.\n *\n * @param session      The SSH session to use.\n *\n * @param server       Send client or server banner.\n *\n * @return 0 on success, < 0 on error.\n */\nint ssh_send_banner(ssh_session session, int server)\n{\n    const char *banner = CLIENT_BANNER_SSH2;\n    const char *terminator = \"\\r\\n\";\n    /* The maximum banner length is 255 for SSH2 */\n    char buffer[256] = {0};\n    size_t len;\n    int rc = SSH_ERROR;\n\n    if (server == 1) {\n        if (session->opts.custombanner == NULL){\n            session->serverbanner = strdup(banner);\n            if (session->serverbanner == NULL) {\n                goto end;\n            }\n        } else {\n            len = strlen(session->opts.custombanner);\n            session->serverbanner = malloc(len + 8 + 1);\n            if(session->serverbanner == NULL) {\n                goto end;\n            }\n            snprintf(session->serverbanner,\n                     len + 8 + 1,\n                     \"SSH-2.0-%s\",\n                     session->opts.custombanner);\n        }\n\n        snprintf(buffer,\n                 sizeof(buffer),\n                 \"%s%s\",\n                 session->serverbanner,\n                 terminator);\n    } else {\n        session->clientbanner = strdup(banner);\n        if (session->clientbanner == NULL) {\n            goto end;\n        }\n\n        snprintf(buffer,\n                 sizeof(buffer),\n                 \"%s%s\",\n                 session->clientbanner,\n                 terminator);\n    }\n\n    rc = ssh_socket_write(session->socket, buffer, strlen(buffer));\n    if (rc == SSH_ERROR) {\n        goto end;\n    }\n#ifdef WITH_PCAP\n    if (session->pcap_ctx != NULL) {\n        ssh_pcap_context_write(session->pcap_ctx,\n                               SSH_PCAP_DIR_OUT,\n                               buffer,\n                               strlen(buffer),\n                               strlen(buffer));\n    }\n#endif\n\n    rc = SSH_OK;\nend:\n    return rc;\n}\n\n/** @internal\n * @brief launches the DH handshake state machine\n * @param session session handle\n * @returns SSH_OK or SSH_ERROR\n * @warning this function returning is no proof that DH handshake is\n * completed\n */\nstatic int dh_handshake(ssh_session session) {\n\n  int rc = SSH_AGAIN;\n\n  switch (session->dh_handshake_state) {\n    case DH_STATE_INIT:\n      switch(session->next_crypto->kex_type){\n        case SSH_KEX_DH_GROUP1_SHA1:\n        case SSH_KEX_DH_GROUP14_SHA1:\n        case SSH_KEX_DH_GROUP14_SHA256:\n        case SSH_KEX_DH_GROUP16_SHA512:\n        case SSH_KEX_DH_GROUP18_SHA512:\n          rc = ssh_client_dh_init(session);\n          break;\n#ifdef WITH_GEX\n        case SSH_KEX_DH_GEX_SHA1:\n        case SSH_KEX_DH_GEX_SHA256:\n          rc = ssh_client_dhgex_init(session);\n          break;\n#endif /* WITH_GEX */\n#ifdef HAVE_ECDH\n        case SSH_KEX_ECDH_SHA2_NISTP256:\n        case SSH_KEX_ECDH_SHA2_NISTP384:\n        case SSH_KEX_ECDH_SHA2_NISTP521:\n          rc = ssh_client_ecdh_init(session);\n          break;\n#endif\n#ifdef HAVE_CURVE25519\n        case SSH_KEX_CURVE25519_SHA256:\n        case SSH_KEX_CURVE25519_SHA256_LIBSSH_ORG:\n          rc = ssh_client_curve25519_init(session);\n          break;\n#endif\n        default:\n          rc = SSH_ERROR;\n      }\n\n      break;\n    case DH_STATE_INIT_SENT:\n    \t/* wait until ssh_packet_dh_reply is called */\n    \tbreak;\n    case DH_STATE_NEWKEYS_SENT:\n    \t/* wait until ssh_packet_newkeys is called */\n    \tbreak;\n    case DH_STATE_FINISHED:\n      return SSH_OK;\n    default:\n      ssh_set_error(session, SSH_FATAL, \"Invalid state in dh_handshake(): %d\",\n          session->dh_handshake_state);\n\n      return SSH_ERROR;\n  }\n\n  return rc;\n}\n\nstatic int ssh_service_request_termination(void *s){\n  ssh_session session = (ssh_session)s;\n  if(session->session_state == SSH_SESSION_STATE_ERROR ||\n      session->auth.service_state != SSH_AUTH_SERVICE_SENT)\n    return 1;\n  else\n    return 0;\n}\n\n/**\n * @internal\n *\n * @brief Request a service from the SSH server.\n *\n * Service requests are for example: ssh-userauth, ssh-connection, etc.\n *\n * @param  session      The session to use to ask for a service request.\n * @param  service      The service request.\n *\n * @return SSH_OK on success\n * @return SSH_ERROR on error\n * @return SSH_AGAIN No response received yet\n * @bug actually only works with ssh-userauth\n */\nint ssh_service_request(ssh_session session, const char *service) {\n  int rc=SSH_ERROR;\n\n  if(session->auth.service_state != SSH_AUTH_SERVICE_NONE)\n    goto pending;\n\n  rc = ssh_buffer_pack(session->out_buffer,\n                       \"bs\",\n                       SSH2_MSG_SERVICE_REQUEST,\n                       service);\n  if (rc != SSH_OK){\n      ssh_set_error_oom(session);\n      return SSH_ERROR;\n  }\n  session->auth.service_state = SSH_AUTH_SERVICE_SENT;\n  if (ssh_packet_send(session) == SSH_ERROR) {\n    ssh_set_error(session, SSH_FATAL,\n        \"Sending SSH2_MSG_SERVICE_REQUEST failed.\");\n      return SSH_ERROR;\n  }\n\n  SSH_LOG(SSH_LOG_PACKET,\n      \"Sent SSH_MSG_SERVICE_REQUEST (service %s)\", service);\npending:\n  rc=ssh_handle_packets_termination(session,SSH_TIMEOUT_USER,\n      ssh_service_request_termination, session);\n  if (rc == SSH_ERROR) {\n      return SSH_ERROR;\n  }\n  switch(session->auth.service_state) {\n  case SSH_AUTH_SERVICE_DENIED:\n    ssh_set_error(session,SSH_FATAL,\"ssh_auth_service request denied\");\n    break;\n  case SSH_AUTH_SERVICE_ACCEPTED:\n    rc=SSH_OK;\n    break;\n  case SSH_AUTH_SERVICE_SENT:\n    rc=SSH_AGAIN;\n    break;\n  case SSH_AUTH_SERVICE_NONE:\n    rc=SSH_ERROR;\n    break;\n  }\n\n  return rc;\n}\n\n/**\n * @addtogroup libssh_session\n *\n * @{\n */\n\n/**\n * @internal\n *\n * @brief A function to be called each time a step has been done in the\n * connection.\n */\nstatic void ssh_client_connection_callback(ssh_session session)\n{\n    int rc;\n\n    switch(session->session_state) {\n        case SSH_SESSION_STATE_NONE:\n        case SSH_SESSION_STATE_CONNECTING:\n            break;\n        case SSH_SESSION_STATE_SOCKET_CONNECTED:\n            ssh_set_fd_towrite(session);\n            ssh_send_banner(session, 0);\n\n            break;\n        case SSH_SESSION_STATE_BANNER_RECEIVED:\n            if (session->serverbanner == NULL) {\n                goto error;\n            }\n            set_status(session, 0.4f);\n            SSH_LOG(SSH_LOG_PROTOCOL,\n                    \"SSH server banner: %s\", session->serverbanner);\n\n            /* Here we analyze the different protocols the server allows. */\n            rc = ssh_analyze_banner(session, 0);\n            if (rc < 0) {\n                ssh_set_error(session, SSH_FATAL,\n                        \"No version of SSH protocol usable (banner: %s)\",\n                        session->serverbanner);\n                goto error;\n            }\n\n            ssh_packet_register_socket_callback(session, session->socket);\n\n            ssh_packet_set_default_callbacks(session);\n            session->session_state = SSH_SESSION_STATE_INITIAL_KEX;\n            rc = ssh_set_client_kex(session);\n            if (rc != SSH_OK) {\n                goto error;\n            }\n            rc = ssh_send_kex(session, 0);\n            if (rc < 0) {\n                goto error;\n            }\n            set_status(session, 0.5f);\n\n            break;\n        case SSH_SESSION_STATE_INITIAL_KEX:\n            /* TODO: This state should disappear in favor of get_key handle */\n            break;\n        case SSH_SESSION_STATE_KEXINIT_RECEIVED:\n            set_status(session,0.6f);\n            ssh_list_kex(&session->next_crypto->server_kex);\n            if (session->next_crypto->client_kex.methods[0] == NULL) {\n                /* in rekeying state if next_crypto client_kex is empty */\n                rc = ssh_set_client_kex(session);\n                if (rc != SSH_OK) {\n                    goto error;\n                }\n                rc = ssh_send_kex(session, 0);\n                if (rc < 0) {\n                    goto error;\n                }\n            }\n            if (ssh_kex_select_methods(session) == SSH_ERROR)\n                goto error;\n            set_status(session,0.8f);\n            session->session_state=SSH_SESSION_STATE_DH;\n            if (dh_handshake(session) == SSH_ERROR) {\n                goto error;\n            }\n            FALL_THROUGH;\n        case SSH_SESSION_STATE_DH:\n            if(session->dh_handshake_state==DH_STATE_FINISHED){\n                set_status(session,1.0f);\n                session->connected = 1;\n                if (session->flags & SSH_SESSION_FLAG_AUTHENTICATED)\n                    session->session_state = SSH_SESSION_STATE_AUTHENTICATED;\n                else\n                    session->session_state=SSH_SESSION_STATE_AUTHENTICATING;\n            }\n            break;\n        case SSH_SESSION_STATE_AUTHENTICATING:\n            break;\n        case SSH_SESSION_STATE_ERROR:\n            goto error;\n        default:\n            ssh_set_error(session,SSH_FATAL,\"Invalid state %d\",session->session_state);\n    }\n\n    return;\nerror:\n    ssh_socket_close(session->socket);\n    session->alive = 0;\n    session->session_state=SSH_SESSION_STATE_ERROR;\n\n}\n\n/** @internal\n * @brief describe under which conditions the ssh_connect function may stop\n */\nstatic int ssh_connect_termination(void *user){\n  ssh_session session = (ssh_session)user;\n  switch(session->session_state){\n    case SSH_SESSION_STATE_ERROR:\n    case SSH_SESSION_STATE_AUTHENTICATING:\n    case SSH_SESSION_STATE_DISCONNECTED:\n      return 1;\n    default:\n      return 0;\n  }\n}\n\n/**\n * @brief Connect to the ssh server.\n *\n * @param[in]  session  The ssh session to connect.\n *\n * @returns             SSH_OK on success, SSH_ERROR on error.\n * @returns             SSH_AGAIN, if the session is in nonblocking mode,\n *                      and call must be done again.\n *\n * @see ssh_new()\n * @see ssh_disconnect()\n */\nint ssh_connect(ssh_session session)\n{\n    int ret;\n\n    if (!is_ssh_initialized()) {\n        ssh_set_error(session, SSH_FATAL,\n                      \"Library not initialized.\");\n\n        return SSH_ERROR;\n    }\n\n    if (session == NULL) {\n        return SSH_ERROR;\n    }\n\n    switch(session->pending_call_state) {\n    case SSH_PENDING_CALL_NONE:\n        break;\n    case SSH_PENDING_CALL_CONNECT:\n        goto pending;\n    default:\n        ssh_set_error(session, SSH_FATAL,\n                      \"Bad call during pending SSH call in ssh_connect\");\n\n        return SSH_ERROR;\n    }\n    session->alive = 0;\n    session->client = 1;\n\n    if (session->opts.fd == SSH_INVALID_SOCKET &&\n        session->opts.host == NULL &&\n        session->opts.ProxyCommand == NULL)\n    {\n        ssh_set_error(session, SSH_FATAL, \"Hostname required\");\n        return SSH_ERROR;\n    }\n\n    /* If the system configuration files were not yet processed, do it now */\n    if (!session->opts.config_processed) {\n        ret = ssh_options_parse_config(session, NULL);\n        if (ret != 0) {\n            ssh_set_error(session, SSH_FATAL,\n                          \"Failed to process system configuration files\");\n            return SSH_ERROR;\n        }\n    }\n\n    ret = ssh_options_apply(session);\n    if (ret < 0) {\n        ssh_set_error(session, SSH_FATAL, \"Couldn't apply options\");\n        return SSH_ERROR;\n    }\n\n    SSH_LOG(SSH_LOG_PROTOCOL,\n            \"libssh %s, using threading %s\",\n            ssh_copyright(),\n            ssh_threads_get_type());\n\n    session->ssh_connection_callback = ssh_client_connection_callback;\n    session->session_state = SSH_SESSION_STATE_CONNECTING;\n    ssh_socket_set_callbacks(session->socket, &session->socket_callbacks);\n    session->socket_callbacks.connected = socket_callback_connected;\n    session->socket_callbacks.data = callback_receive_banner;\n    session->socket_callbacks.exception = ssh_socket_exception_callback;\n    session->socket_callbacks.userdata = session;\n\n    ssh_socket_set_external_callbacks(session->socket, &session->socket_external_callbacks);\n\n    if (session->opts.fd != SSH_INVALID_SOCKET) {\n        session->session_state = SSH_SESSION_STATE_SOCKET_CONNECTED;\n        ssh_socket_set_fd(session->socket, session->opts.fd);\n        ret = SSH_OK;\n#ifndef _WIN32\n    } else if (session->opts.ProxyCommand != NULL) {\n        ret = ssh_socket_connect_proxycommand(session->socket,\n                session->opts.ProxyCommand);\n#endif\n    } else {\n\t\tif (session->opts.proxy_host != NULL) {\n          ret = ssh_socket_connect(session->socket,\n                                   session->opts.proxy_host,\n                                   session->opts.proxy_port > 0 ? session->opts.proxy_port : 22,\n                                   session->opts.bindaddr);\n\t\t} else {\n          ret = ssh_socket_connect(session->socket,\n                                   session->opts.host,\n                                   session->opts.port > 0 ? session->opts.port : 22,\n                                   session->opts.bindaddr);\n\t\t}\n    }\n    if (ret == SSH_ERROR) {\n        return SSH_ERROR;\n    }\n\n    set_status(session, 0.2f);\n\n    session->alive = 1;\n    SSH_LOG(SSH_LOG_PROTOCOL,\n            \"Socket connecting, now waiting for the callbacks to work\");\n\npending:\n    session->pending_call_state = SSH_PENDING_CALL_CONNECT;\n    if(ssh_is_blocking(session)) {\n        int timeout = (session->opts.timeout * 1000) +\n            (session->opts.timeout_usec / 1000);\n        if (timeout == 0) {\n            timeout = 10 * 1000;\n        }\n        SSH_LOG(SSH_LOG_PACKET, \"Actual timeout : %d\", timeout);\n        ret = ssh_handle_packets_termination(session, timeout,\n                                             ssh_connect_termination, session);\n        if (session->session_state != SSH_SESSION_STATE_ERROR &&\n            (ret == SSH_ERROR || !ssh_connect_termination(session)))\n        {\n            ssh_set_error(session, SSH_FATAL,\n                          \"Timeout connecting to %s\", session->opts.host);\n            session->session_state = SSH_SESSION_STATE_ERROR;\n        }\n    } else {\n        ret = ssh_handle_packets_termination(session,\n                                             SSH_TIMEOUT_NONBLOCKING,\n                                             ssh_connect_termination,\n                                             session);\n        if (ret == SSH_ERROR) {\n            session->session_state = SSH_SESSION_STATE_ERROR;\n        }\n    }\n\n    SSH_LOG(SSH_LOG_PACKET, \"current state : %d\", session->session_state);\n    if (!ssh_is_blocking(session) && !ssh_connect_termination(session)) {\n        return SSH_AGAIN;\n    }\n\n    session->pending_call_state = SSH_PENDING_CALL_NONE;\n    if (session->session_state == SSH_SESSION_STATE_ERROR ||\n        session->session_state == SSH_SESSION_STATE_DISCONNECTED)\n    {\n        return SSH_ERROR;\n    }\n\n    return SSH_OK;\n}\n\n/**\n * @brief Get the issue banner from the server.\n *\n * This is the banner showing a disclaimer to users who log in,\n * typically their right or the fact that they will be monitored.\n *\n * @param[in]  session  The SSH session to use.\n *\n * @return A newly allocated string with the banner, NULL on error.\n */\nchar *ssh_get_issue_banner(ssh_session session) {\n  if (session == NULL || session->banner == NULL) {\n    return NULL;\n  }\n\n  return ssh_string_to_char(session->banner);\n}\n\n/**\n * @brief Get the version of the OpenSSH server, if it is not an OpenSSH server\n * then 0 will be returned.\n *\n * You can use the SSH_VERSION_INT macro to compare version numbers.\n *\n * @param[in]  session  The SSH session to use.\n *\n * @return The version number if available, 0 otherwise.\n *\n * @code\n * int openssh = ssh_get_openssh_version();\n *\n * if (openssh == SSH_INT_VERSION(6, 1, 0)) {\n *     printf(\"Version match!\\m\");\n * }\n * @endcode\n */\nint ssh_get_openssh_version(ssh_session session) {\n  if (session == NULL) {\n    return 0;\n  }\n\n  return session->openssh;\n}\n\n/**\n * @brief Disconnect from a session (client or server).\n * The session can then be reused to open a new session.\n *\n * @param[in]  session  The SSH session to use.\n */\nvoid ssh_disconnect(ssh_session session) {\n  struct ssh_iterator *it;\n  int rc;\n\n  if (session == NULL) {\n    return;\n  }\n\n  if (session->socket != NULL && ssh_socket_is_open(session->socket)) {\n    rc = ssh_buffer_pack(session->out_buffer,\n                         \"bdss\",\n                         SSH2_MSG_DISCONNECT,\n                         SSH2_DISCONNECT_BY_APPLICATION,\n                         \"Bye Bye\",\n                         \"\"); /* language tag */\n    if (rc != SSH_OK){\n      ssh_set_error_oom(session);\n      goto error;\n    }\n\n    ssh_packet_send(session);\n    ssh_socket_close(session->socket);\n  }\nerror:\n  session->recv_seq = 0;\n  session->send_seq = 0;\n  session->alive = 0;\n  if (session->socket != NULL){\n    ssh_socket_reset(session->socket);\n  }\n  session->opts.fd = SSH_INVALID_SOCKET;\n  session->session_state=SSH_SESSION_STATE_DISCONNECTED;\n\n  while ((it=ssh_list_get_iterator(session->channels)) != NULL) {\n    ssh_channel_do_free(ssh_iterator_value(ssh_channel,it));\n    ssh_list_remove(session->channels, it);\n  }\n  if(session->current_crypto){\n    crypto_free(session->current_crypto);\n    session->current_crypto=NULL;\n  }\n  if (session->next_crypto) {\n    crypto_free(session->next_crypto);\n    session->next_crypto = crypto_new();\n    if (session->next_crypto == NULL) {\n      ssh_set_error_oom(session);\n    }\n  }\n  if (session->in_buffer) {\n    ssh_buffer_reinit(session->in_buffer);\n  }\n  if (session->out_buffer) {\n    ssh_buffer_reinit(session->out_buffer);\n  }\n  if (session->in_hashbuf) {\n    ssh_buffer_reinit(session->in_hashbuf);\n  }\n  if (session->out_hashbuf) {\n    ssh_buffer_reinit(session->out_hashbuf);\n  }\n  session->auth.supported_methods = 0;\n  SAFE_FREE(session->serverbanner);\n  SAFE_FREE(session->clientbanner);\n\n  if(session->ssh_message_list){\n    ssh_message msg;\n    while((msg=ssh_list_pop_head(ssh_message ,session->ssh_message_list))\n        != NULL){\n      ssh_message_free(msg);\n    }\n    ssh_list_free(session->ssh_message_list);\n    session->ssh_message_list=NULL;\n  }\n\n  if (session->packet_callbacks){\n    ssh_list_free(session->packet_callbacks);\n    session->packet_callbacks=NULL;\n  }\n}\n\nconst char *ssh_copyright(void) {\n    return SSH_STRINGIFY(LIBSSH_VERSION) \" (c) 2003-2019 \"\n           \"Aris Adamantiadis, Andreas Schneider \"\n           \"and libssh contributors. \"\n           \"Distributed under the LGPL, please refer to COPYING \"\n           \"file for information about your rights\";\n}\n/** @} */\n"
  },
  {
    "path": "src/libssh/src/config.c",
    "content": "/*\n * config.c - parse the ssh config file\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2009-2013    by Andreas Schneider <asn@cryptomilk.org>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <ctype.h>\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n#ifdef HAVE_GLOB_H\n# include <glob.h>\n#endif\n#include <stdbool.h>\n#include <limits.h>\n\n#include \"libssh/config_parser.h\"\n#include \"libssh/config.h\"\n#include \"libssh/priv.h\"\n#include \"libssh/session.h\"\n#include \"libssh/misc.h\"\n#include \"libssh/options.h\"\n\n#define MAX_LINE_SIZE 1024\n\nstruct ssh_config_keyword_table_s {\n  const char *name;\n  enum ssh_config_opcode_e opcode;\n};\n\nstatic struct ssh_config_keyword_table_s ssh_config_keyword_table[] = {\n  { \"host\", SOC_HOST },\n  { \"match\", SOC_MATCH },\n  { \"hostname\", SOC_HOSTNAME },\n  { \"port\", SOC_PORT },\n  { \"user\", SOC_USERNAME },\n  { \"identityfile\", SOC_IDENTITY },\n  { \"ciphers\", SOC_CIPHERS },\n  { \"macs\", SOC_MACS },\n  { \"compression\", SOC_COMPRESSION },\n  { \"connecttimeout\", SOC_TIMEOUT },\n  { \"protocol\", SOC_PROTOCOL },\n  { \"stricthostkeychecking\", SOC_STRICTHOSTKEYCHECK },\n  { \"userknownhostsfile\", SOC_KNOWNHOSTS },\n  { \"proxycommand\", SOC_PROXYCOMMAND },\n  { \"gssapiserveridentity\", SOC_GSSAPISERVERIDENTITY },\n  { \"gssapiclientidentity\", SOC_GSSAPICLIENTIDENTITY },\n  { \"gssapidelegatecredentials\", SOC_GSSAPIDELEGATECREDENTIALS },\n  { \"include\", SOC_INCLUDE },\n  { \"bindaddress\", SOC_BINDADDRESS},\n  { \"globalknownhostsfile\", SOC_GLOBALKNOWNHOSTSFILE},\n  { \"loglevel\", SOC_LOGLEVEL},\n  { \"hostkeyalgorithms\", SOC_HOSTKEYALGORITHMS},\n  { \"kexalgorithms\", SOC_KEXALGORITHMS},\n  { \"mac\", SOC_UNSUPPORTED}, /* SSHv1 */\n  { \"gssapiauthentication\", SOC_GSSAPIAUTHENTICATION},\n  { \"kbdinteractiveauthentication\", SOC_KBDINTERACTIVEAUTHENTICATION},\n  { \"passwordauthentication\", SOC_PASSWORDAUTHENTICATION},\n  { \"pubkeyauthentication\", SOC_PUBKEYAUTHENTICATION},\n  { \"addkeystoagent\", SOC_UNSUPPORTED},\n  { \"addressfamily\", SOC_UNSUPPORTED},\n  { \"batchmode\", SOC_UNSUPPORTED},\n  { \"canonicaldomains\", SOC_UNSUPPORTED},\n  { \"canonicalizefallbacklocal\", SOC_UNSUPPORTED},\n  { \"canonicalizehostname\", SOC_UNSUPPORTED},\n  { \"canonicalizemaxdots\", SOC_UNSUPPORTED},\n  { \"canonicalizepermittedcnames\", SOC_UNSUPPORTED},\n  { \"certificatefile\", SOC_UNSUPPORTED},\n  { \"challengeresponseauthentication\", SOC_UNSUPPORTED},\n  { \"checkhostip\", SOC_UNSUPPORTED},\n  { \"cipher\", SOC_UNSUPPORTED}, /* SSHv1 */\n  { \"compressionlevel\", SOC_UNSUPPORTED}, /* SSHv1 */\n  { \"connectionattempts\", SOC_UNSUPPORTED},\n  { \"enablesshkeysign\", SOC_UNSUPPORTED},\n  { \"fingerprinthash\", SOC_UNSUPPORTED},\n  { \"forwardagent\", SOC_UNSUPPORTED},\n  { \"gssapikeyexchange\", SOC_UNSUPPORTED},\n  { \"gssapirenewalforcesrekey\", SOC_UNSUPPORTED},\n  { \"gssapitrustdns\", SOC_UNSUPPORTED},\n  { \"hashknownhosts\", SOC_UNSUPPORTED},\n  { \"hostbasedauthentication\", SOC_UNSUPPORTED},\n  { \"hostbasedkeytypes\", SOC_UNSUPPORTED},\n  { \"hostkeyalias\", SOC_UNSUPPORTED},\n  { \"identitiesonly\", SOC_UNSUPPORTED},\n  { \"identityagent\", SOC_UNSUPPORTED},\n  { \"ipqos\", SOC_UNSUPPORTED},\n  { \"kbdinteractivedevices\", SOC_UNSUPPORTED},\n  { \"nohostauthenticationforlocalhost\", SOC_UNSUPPORTED},\n  { \"numberofpasswordprompts\", SOC_UNSUPPORTED},\n  { \"pkcs11provider\", SOC_UNSUPPORTED},\n  { \"preferredauthentications\", SOC_UNSUPPORTED},\n  { \"proxyjump\", SOC_PROXYJUMP},\n  { \"proxyusefdpass\", SOC_UNSUPPORTED},\n  { \"pubkeyacceptedtypes\", SOC_PUBKEYACCEPTEDTYPES},\n  { \"rekeylimit\", SOC_REKEYLIMIT},\n  { \"remotecommand\", SOC_UNSUPPORTED},\n  { \"revokedhostkeys\", SOC_UNSUPPORTED},\n  { \"rhostsrsaauthentication\", SOC_UNSUPPORTED},\n  { \"rsaauthentication\", SOC_UNSUPPORTED}, /* SSHv1 */\n  { \"serveralivecountmax\", SOC_UNSUPPORTED},\n  { \"serveraliveinterval\", SOC_UNSUPPORTED},\n  { \"streamlocalbindmask\", SOC_UNSUPPORTED},\n  { \"streamlocalbindunlink\", SOC_UNSUPPORTED},\n  { \"syslogfacility\", SOC_UNSUPPORTED},\n  { \"tcpkeepalive\", SOC_UNSUPPORTED},\n  { \"updatehostkeys\", SOC_UNSUPPORTED},\n  { \"useprivilegedport\", SOC_UNSUPPORTED},\n  { \"verifyhostkeydns\", SOC_UNSUPPORTED},\n  { \"visualhostkey\", SOC_UNSUPPORTED},\n  { \"clearallforwardings\", SOC_NA},\n  { \"controlmaster\", SOC_NA},\n  { \"controlpersist\", SOC_NA},\n  { \"controlpath\", SOC_NA},\n  { \"dynamicforward\", SOC_NA},\n  { \"escapechar\", SOC_NA},\n  { \"exitonforwardfailure\", SOC_NA},\n  { \"forwardx11\", SOC_NA},\n  { \"forwardx11timeout\", SOC_NA},\n  { \"forwardx11trusted\", SOC_NA},\n  { \"gatewayports\", SOC_NA},\n  { \"ignoreunknown\", SOC_NA},\n  { \"localcommand\", SOC_NA},\n  { \"localforward\", SOC_NA},\n  { \"permitlocalcommand\", SOC_NA},\n  { \"remoteforward\", SOC_NA},\n  { \"requesttty\", SOC_NA},\n  { \"sendenv\", SOC_NA},\n  { \"tunnel\", SOC_NA},\n  { \"tunneldevice\", SOC_NA},\n  { \"xauthlocation\", SOC_NA},\n  { \"pubkeyacceptedkeytypes\", SOC_PUBKEYACCEPTEDTYPES},\n  { NULL, SOC_UNKNOWN }\n};\n\nenum ssh_config_match_e {\n    MATCH_UNKNOWN = -1,\n    MATCH_ALL,\n    MATCH_FINAL,\n    MATCH_CANONICAL,\n    MATCH_EXEC,\n    MATCH_HOST,\n    MATCH_ORIGINALHOST,\n    MATCH_USER,\n    MATCH_LOCALUSER\n};\n\nstruct ssh_config_match_keyword_table_s {\n    const char *name;\n    enum ssh_config_match_e opcode;\n};\n\nstatic struct ssh_config_match_keyword_table_s ssh_config_match_keyword_table[] = {\n    { \"all\", MATCH_ALL },\n    { \"canonical\", MATCH_CANONICAL },\n    { \"final\", MATCH_FINAL },\n    { \"exec\", MATCH_EXEC },\n    { \"host\", MATCH_HOST },\n    { \"originalhost\", MATCH_ORIGINALHOST },\n    { \"user\", MATCH_USER },\n    { \"localuser\", MATCH_LOCALUSER },\n    { NULL, MATCH_UNKNOWN },\n};\n\nstatic int ssh_config_parse_line(ssh_session session, const char *line,\n    unsigned int count, int *parsing);\n\nstatic enum ssh_config_opcode_e ssh_config_get_opcode(char *keyword) {\n  int i;\n\n  for (i = 0; ssh_config_keyword_table[i].name != NULL; i++) {\n    if (strcasecmp(keyword, ssh_config_keyword_table[i].name) == 0) {\n      return ssh_config_keyword_table[i].opcode;\n    }\n  }\n\n  return SOC_UNKNOWN;\n}\n\nstatic void\nlocal_parse_file(ssh_session session,\n                 const char *filename,\n                 int *parsing)\n{\n    FILE *f;\n    char line[MAX_LINE_SIZE] = {0};\n    unsigned int count = 0;\n    int rv;\n\n    f = fopen(filename, \"r\");\n    if (f == NULL) {\n        SSH_LOG(SSH_LOG_RARE, \"Cannot find file %s to load\",\n                filename);\n        return;\n    }\n\n    SSH_LOG(SSH_LOG_PACKET, \"Reading additional configuration data from %s\", filename);\n    while (fgets(line, sizeof(line), f)) {\n        count++;\n        rv = ssh_config_parse_line(session, line, count, parsing);\n        if (rv < 0) {\n            fclose(f);\n            return;\n        }\n    }\n\n    fclose(f);\n    return;\n}\n\n#if defined(HAVE_GLOB) && defined(HAVE_GLOB_GL_FLAGS_MEMBER)\nstatic void local_parse_glob(ssh_session session,\n                             const char *fileglob,\n                             int *parsing)\n{\n    glob_t globbuf = {\n        .gl_flags = 0,\n    };\n    int rt;\n    size_t i;\n\n    rt = glob(fileglob, GLOB_TILDE, NULL, &globbuf);\n    if (rt == GLOB_NOMATCH) {\n        globfree(&globbuf);\n        return;\n    } else if (rt != 0) {\n        SSH_LOG(SSH_LOG_RARE, \"Glob error: %s\",\n                fileglob);\n        globfree(&globbuf);\n        return;\n    }\n\n    for (i = 0; i < globbuf.gl_pathc; i++) {\n        local_parse_file(session, globbuf.gl_pathv[i], parsing);\n    }\n\n    globfree(&globbuf);\n}\n#endif /* HAVE_GLOB HAVE_GLOB_GL_FLAGS_MEMBER */\n\nstatic enum ssh_config_match_e\nssh_config_get_match_opcode(const char *keyword)\n{\n    size_t i;\n\n    for (i = 0; ssh_config_match_keyword_table[i].name != NULL; i++) {\n        if (strcasecmp(keyword, ssh_config_match_keyword_table[i].name) == 0) {\n            return ssh_config_match_keyword_table[i].opcode;\n        }\n    }\n\n    return MATCH_UNKNOWN;\n}\n\nstatic int\nssh_config_match(char *value, const char *pattern, bool negate)\n{\n    int ok, result = 0;\n\n    ok = match_pattern_list(value, pattern, strlen(pattern), 0);\n    if (ok <= 0 && negate == true) {\n        result = 1;\n    } else if (ok > 0 && negate == false) {\n        result = 1;\n    }\n    SSH_LOG(SSH_LOG_TRACE, \"%s '%s' against pattern '%s'%s (ok=%d)\",\n            result == 1 ? \"Matched\" : \"Not matched\", value, pattern,\n            negate == true ? \" (negated)\" : \"\", ok);\n    return result;\n}\n\n/* @brief: Parse the ProxyJump configuration line and if parsing,\n * stores the result in the configuration option\n */\nstatic int\nssh_config_parse_proxy_jump(ssh_session session, const char *s, bool do_parsing)\n{\n    char *c = NULL, *cp = NULL, *endp = NULL;\n    char *username = NULL;\n    char *hostname = NULL;\n    char *port = NULL;\n    char *next = NULL;\n    int cmp, rv = SSH_ERROR;\n    bool parse_entry = do_parsing;\n\n    /* Special value none disables the proxy */\n    cmp = strcasecmp(s, \"none\");\n    if (cmp == 0 && do_parsing) {\n        ssh_options_set(session, SSH_OPTIONS_PROXYCOMMAND, s);\n        return SSH_OK;\n    }\n\n    /* This is comma-separated list of [user@]host[:port] entries */\n    c = strdup(s);\n    if (c == NULL) {\n        ssh_set_error_oom(session);\n        return SSH_ERROR;\n    }\n\n    cp = c;\n    do {\n        endp = strchr(cp, ',');\n        if (endp != NULL) {\n            /* Split out the token */\n            *endp = '\\0';\n        }\n        if (parse_entry) {\n            /* We actually care only about the first item */\n            rv = ssh_config_parse_uri(cp, &username, &hostname, &port);\n            /* The rest of the list needs to be passed on */\n            if (endp != NULL) {\n                next = strdup(endp + 1);\n                if (next == NULL) {\n                    ssh_set_error_oom(session);\n                    rv = SSH_ERROR;\n                }\n            }\n        } else {\n            /* The rest is just sanity-checked to avoid failures later */\n            rv = ssh_config_parse_uri(cp, NULL, NULL, NULL);\n        }\n        if (rv != SSH_OK) {\n            goto out;\n        }\n        parse_entry = 0;\n        if (endp != NULL) {\n            cp = endp + 1;\n        } else {\n            cp = NULL; /* end */\n        }\n    } while (cp != NULL);\n\n    if (hostname != NULL && do_parsing) {\n        char com[512] = {0};\n\n        rv = snprintf(com, sizeof(com), \"ssh%s%s%s%s%s%s -W [%%h]:%%p %s\",\n                      username ? \" -l \" : \"\",\n                      username ? username : \"\",\n                      port ? \" -p \" : \"\",\n                      port ? port : \"\",\n                      next ? \" -J \" : \"\",\n                      next ? next : \"\",\n                      hostname);\n        if (rv < 0 || rv >= (int)sizeof(com)) {\n            SSH_LOG(SSH_LOG_WARN, \"Too long ProxyJump configuration line\");\n            rv = SSH_ERROR;\n            goto out;\n        }\n        ssh_options_set(session, SSH_OPTIONS_PROXYCOMMAND, com);\n    }\n    rv = SSH_OK;\n\nout:\n    SAFE_FREE(username);\n    SAFE_FREE(hostname);\n    SAFE_FREE(port);\n    SAFE_FREE(next);\n    SAFE_FREE(c);\n    return rv;\n}\n\nstatic int\nssh_config_parse_line(ssh_session session,\n                      const char *line,\n                      unsigned int count,\n                      int *parsing)\n{\n  enum ssh_config_opcode_e opcode;\n  const char *p = NULL, *p2 = NULL;\n  char *s = NULL, *x = NULL;\n  char *keyword = NULL;\n  char *lowerhost = NULL;\n  size_t len;\n  int i, rv;\n  uint8_t *seen = session->opts.options_seen;\n  long l;\n  int64_t ll;\n\n  /* Ignore empty lines */\n  if (line == NULL || *line == '\\0') {\n    return 0;\n  }\n\n  x = s = strdup(line);\n  if (s == NULL) {\n    ssh_set_error_oom(session);\n    return -1;\n  }\n\n  /* Remove trailing spaces */\n  for (len = strlen(s) - 1; len > 0; len--) {\n    if (! isspace(s[len])) {\n      break;\n    }\n    s[len] = '\\0';\n  }\n\n  keyword = ssh_config_get_token(&s);\n  if (keyword == NULL || *keyword == '#' ||\n      *keyword == '\\0' || *keyword == '\\n') {\n    SAFE_FREE(x);\n    return 0;\n  }\n\n  opcode = ssh_config_get_opcode(keyword);\n  if (*parsing == 1 &&\n      opcode != SOC_HOST &&\n      opcode != SOC_MATCH &&\n      opcode != SOC_INCLUDE &&\n      opcode > SOC_UNSUPPORTED) { /* Ignore all unknown types here */\n      /* Skip all the options that were already applied */\n      if (seen[opcode] != 0) {\n          SAFE_FREE(x);\n          return 0;\n      }\n      seen[opcode] = 1;\n  }\n\n  switch (opcode) {\n    case SOC_INCLUDE: /* recursive include of other files */\n\n      p = ssh_config_get_str_tok(&s, NULL);\n      if (p && *parsing) {\n#if defined(HAVE_GLOB) && defined(HAVE_GLOB_GL_FLAGS_MEMBER)\n        local_parse_glob(session, p, parsing);\n#else\n        local_parse_file(session, p, parsing);\n#endif /* HAVE_GLOB */\n      }\n      break;\n\n    case SOC_MATCH: {\n        bool negate;\n        int result = 1;\n        size_t args = 0;\n        enum ssh_config_match_e opt;\n        char *localuser = NULL;\n\n        *parsing = 0;\n        do {\n            p = p2 = ssh_config_get_str_tok(&s, NULL);\n            if (p == NULL || p[0] == '\\0') {\n                break;\n            }\n            args++;\n            SSH_LOG(SSH_LOG_TRACE, \"line %d: Processing Match keyword '%s'\",\n                    count, p);\n\n            /* If the option is prefixed with ! the result should be negated */\n            negate = false;\n            if (p[0] == '!') {\n                negate = true;\n                p++;\n            }\n\n            opt = ssh_config_get_match_opcode(p);\n            switch (opt) {\n            case MATCH_ALL:\n                p = ssh_config_get_str_tok(&s, NULL);\n                if (args <= 2 && (p == NULL || p[0] == '\\0')) {\n                    /* The first or second, but last argument. The \"all\" keyword\n                     * can be prefixed with either \"final\" or \"canonical\"\n                     * keywords which do not have any effect here. */\n                    if (negate == true) {\n                        result = 0;\n                    }\n                    break;\n                }\n\n                ssh_set_error(session, SSH_FATAL,\n                              \"line %d: ERROR - Match all cannot be combined with \"\n                              \"other Match attributes\", count);\n                SAFE_FREE(x);\n                return -1;\n\n            case MATCH_FINAL:\n            case MATCH_CANONICAL:\n                SSH_LOG(SSH_LOG_WARN,\n                        \"line %d: Unsupported Match keyword '%s', skipping\",\n                        count,\n                        p);\n                /* Not set any result here -- the result is dependent on the\n                 * following matches after this keyword */\n                break;\n\n            case MATCH_EXEC:\n                /* Skip to the end of line as unsupported */\n                p = ssh_config_get_cmd(&s);\n                if (p == NULL || p[0] == '\\0') {\n                    SSH_LOG(SSH_LOG_WARN, \"line %d: Match keyword \"\n                            \"'%s' requires argument\", count, p2);\n                    SAFE_FREE(x);\n                    return -1;\n                }\n                args++;\n                SSH_LOG(SSH_LOG_WARN,\n                        \"line %d: Unsupported Match keyword '%s', ignoring\",\n                        count,\n                        p2);\n                result = 0;\n                break;\n\n            case MATCH_LOCALUSER:\n                /* Here we match only one argument */\n                p = ssh_config_get_str_tok(&s, NULL);\n                if (p == NULL || p[0] == '\\0') {\n                    ssh_set_error(session, SSH_FATAL,\n                                  \"line %d: ERROR - Match user keyword \"\n                                  \"requires argument\", count);\n                    SAFE_FREE(x);\n                    return -1;\n                }\n                localuser = ssh_get_local_username();\n                if (localuser == NULL) {\n                    SSH_LOG(SSH_LOG_WARN, \"line %d: Can not get local username \"\n                            \"for conditional matching.\", count);\n                    SAFE_FREE(x);\n                    return -1;\n                }\n                result &= ssh_config_match(localuser, p, negate);\n                SAFE_FREE(localuser);\n                args++;\n                break;\n\n            case MATCH_ORIGINALHOST:\n                /* Skip one argument */\n                p = ssh_config_get_str_tok(&s, NULL);\n                if (p == NULL || p[0] == '\\0') {\n                    SSH_LOG(SSH_LOG_WARN, \"line %d: Match keyword \"\n                            \"'%s' requires argument\", count, p2);\n                    SAFE_FREE(x);\n                    return -1;\n                }\n                args++;\n                SSH_LOG(SSH_LOG_WARN,\n                        \"line %d: Unsupported Match keyword '%s', ignoring\",\n                        count,\n                        p2);\n                result = 0;\n                break;\n\n            case MATCH_HOST:\n                /* Here we match only one argument */\n                p = ssh_config_get_str_tok(&s, NULL);\n                if (p == NULL || p[0] == '\\0') {\n                    ssh_set_error(session, SSH_FATAL,\n                                  \"line %d: ERROR - Match host keyword \"\n                                  \"requires argument\", count);\n                    SAFE_FREE(x);\n                    return -1;\n                }\n                result &= ssh_config_match(session->opts.host, p, negate);\n                args++;\n                break;\n\n            case MATCH_USER:\n                /* Here we match only one argument */\n                p = ssh_config_get_str_tok(&s, NULL);\n                if (p == NULL || p[0] == '\\0') {\n                    ssh_set_error(session, SSH_FATAL,\n                                  \"line %d: ERROR - Match user keyword \"\n                                  \"requires argument\", count);\n                    SAFE_FREE(x);\n                    return -1;\n                }\n                result &= ssh_config_match(session->opts.username, p, negate);\n                args++;\n                break;\n\n            case MATCH_UNKNOWN:\n            default:\n                ssh_set_error(session, SSH_FATAL,\n                              \"ERROR - Unknown argument '%s' for Match keyword\", p);\n                SAFE_FREE(x);\n                return -1;\n            }\n        } while (p != NULL && p[0] != '\\0');\n        if (args == 0) {\n            ssh_set_error(session, SSH_FATAL,\n                          \"ERROR - Match keyword requires an argument\");\n            SAFE_FREE(x);\n            return -1;\n        }\n        *parsing = result;\n        break;\n    }\n    case SOC_HOST: {\n        int ok = 0, result = -1;\n\n        *parsing = 0;\n        lowerhost = (session->opts.host) ? ssh_lowercase(session->opts.host) : NULL;\n        for (p = ssh_config_get_str_tok(&s, NULL);\n             p != NULL && p[0] != '\\0';\n             p = ssh_config_get_str_tok(&s, NULL)) {\n             if (ok >= 0) {\n               ok = match_hostname(lowerhost, p, strlen(p));\n               if (result == -1 && ok < 0) {\n                   result = 0;\n               } else if (result == -1 && ok > 0) {\n                   result = 1;\n               }\n            }\n        }\n        SAFE_FREE(lowerhost);\n        if (result != -1) {\n            *parsing = result;\n        }\n        break;\n    }\n    case SOC_HOSTNAME:\n      p = ssh_config_get_str_tok(&s, NULL);\n      if (p && *parsing) {\n        char *z = ssh_path_expand_escape(session, p);\n        if (z == NULL) {\n            z = strdup(p);\n        }\n        ssh_options_set(session, SSH_OPTIONS_HOST, z);\n        free(z);\n      }\n      break;\n    case SOC_PORT:\n        p = ssh_config_get_str_tok(&s, NULL);\n        if (p && *parsing) {\n            ssh_options_set(session, SSH_OPTIONS_PORT_STR, p);\n        }\n        break;\n    case SOC_USERNAME:\n      if (session->opts.username == NULL) {\n          p = ssh_config_get_str_tok(&s, NULL);\n          if (p && *parsing) {\n            ssh_options_set(session, SSH_OPTIONS_USER, p);\n         }\n      }\n      break;\n    case SOC_IDENTITY:\n      p = ssh_config_get_str_tok(&s, NULL);\n      if (p && *parsing) {\n        ssh_options_set(session, SSH_OPTIONS_ADD_IDENTITY, p);\n      }\n      break;\n    case SOC_CIPHERS:\n      p = ssh_config_get_str_tok(&s, NULL);\n      if (p && *parsing) {\n        ssh_options_set(session, SSH_OPTIONS_CIPHERS_C_S, p);\n        ssh_options_set(session, SSH_OPTIONS_CIPHERS_S_C, p);\n      }\n      break;\n    case SOC_MACS:\n      p = ssh_config_get_str_tok(&s, NULL);\n      if (p && *parsing) {\n        ssh_options_set(session, SSH_OPTIONS_HMAC_C_S, p);\n        ssh_options_set(session, SSH_OPTIONS_HMAC_S_C, p);\n      }\n      break;\n    case SOC_COMPRESSION:\n      i = ssh_config_get_yesno(&s, -1);\n      if (i >= 0 && *parsing) {\n        if (i) {\n          ssh_options_set(session, SSH_OPTIONS_COMPRESSION, \"yes\");\n        } else {\n          ssh_options_set(session, SSH_OPTIONS_COMPRESSION, \"no\");\n        }\n      }\n      break;\n    case SOC_PROTOCOL:\n      p = ssh_config_get_str_tok(&s, NULL);\n      if (p && *parsing) {\n        char *a, *b;\n        b = strdup(p);\n        if (b == NULL) {\n          SAFE_FREE(x);\n          ssh_set_error_oom(session);\n          return -1;\n        }\n        i = 0;\n        ssh_options_set(session, SSH_OPTIONS_SSH2, &i);\n\n        for (a = strtok(b, \",\"); a; a = strtok(NULL, \",\")) {\n          switch (atoi(a)) {\n            case 1:\n              break;\n            case 2:\n              i = 1;\n              ssh_options_set(session, SSH_OPTIONS_SSH2, &i);\n              break;\n            default:\n              break;\n          }\n        }\n        SAFE_FREE(b);\n      }\n      break;\n    case SOC_TIMEOUT:\n      l = ssh_config_get_long(&s, -1);\n      if (l >= 0 && *parsing) {\n        ssh_options_set(session, SSH_OPTIONS_TIMEOUT, &l);\n      }\n      break;\n    case SOC_STRICTHOSTKEYCHECK:\n      i = ssh_config_get_yesno(&s, -1);\n      if (i >= 0 && *parsing) {\n        ssh_options_set(session, SSH_OPTIONS_STRICTHOSTKEYCHECK, &i);\n      }\n      break;\n    case SOC_KNOWNHOSTS:\n      p = ssh_config_get_str_tok(&s, NULL);\n      if (p && *parsing) {\n        ssh_options_set(session, SSH_OPTIONS_KNOWNHOSTS, p);\n      }\n      break;\n    case SOC_PROXYCOMMAND:\n      p = ssh_config_get_cmd(&s);\n      /* We share the seen value with the ProxyJump */\n      if (p && *parsing && !seen[SOC_PROXYJUMP]) {\n        ssh_options_set(session, SSH_OPTIONS_PROXYCOMMAND, p);\n      }\n      break;\n    case SOC_PROXYJUMP:\n        p = ssh_config_get_str_tok(&s, NULL);\n        if (p == NULL) {\n            SAFE_FREE(x);\n            return -1;\n        }\n        /* We share the seen value with the ProxyCommand */\n        rv = ssh_config_parse_proxy_jump(session, p,\n                                         (*parsing && !seen[SOC_PROXYCOMMAND]));\n        if (rv != SSH_OK) {\n            SAFE_FREE(x);\n            return -1;\n        }\n        break;\n    case SOC_GSSAPISERVERIDENTITY:\n      p = ssh_config_get_str_tok(&s, NULL);\n      if (p && *parsing) {\n        ssh_options_set(session, SSH_OPTIONS_GSSAPI_SERVER_IDENTITY, p);\n      }\n      break;\n    case SOC_GSSAPICLIENTIDENTITY:\n      p = ssh_config_get_str_tok(&s, NULL);\n      if (p && *parsing) {\n        ssh_options_set(session, SSH_OPTIONS_GSSAPI_CLIENT_IDENTITY, p);\n      }\n      break;\n    case SOC_GSSAPIDELEGATECREDENTIALS:\n      i = ssh_config_get_yesno(&s, -1);\n      if (i >=0 && *parsing) {\n        ssh_options_set(session, SSH_OPTIONS_GSSAPI_DELEGATE_CREDENTIALS, &i);\n      }\n      break;\n    case SOC_BINDADDRESS:\n        p = ssh_config_get_str_tok(&s, NULL);\n        if (p && *parsing) {\n            ssh_options_set(session, SSH_OPTIONS_BINDADDR, p);\n        }\n        break;\n    case SOC_GLOBALKNOWNHOSTSFILE:\n        p = ssh_config_get_str_tok(&s, NULL);\n        if (p && *parsing) {\n            ssh_options_set(session, SSH_OPTIONS_GLOBAL_KNOWNHOSTS, p);\n        }\n        break;\n    case SOC_LOGLEVEL:\n        p = ssh_config_get_str_tok(&s, NULL);\n        if (p && *parsing) {\n            int value = -1;\n\n            if (strcasecmp(p, \"quiet\") == 0) {\n                value = SSH_LOG_NONE;\n            } else if (strcasecmp(p, \"fatal\") == 0 ||\n                    strcasecmp(p, \"error\")== 0 ||\n                    strcasecmp(p, \"info\") == 0) {\n                value = SSH_LOG_WARN;\n            } else if (strcasecmp(p, \"verbose\") == 0) {\n                value = SSH_LOG_INFO;\n            } else if (strcasecmp(p, \"DEBUG\") == 0 ||\n                    strcasecmp(p, \"DEBUG1\") == 0) {\n                value = SSH_LOG_DEBUG;\n            } else if (strcasecmp(p, \"DEBUG2\") == 0 ||\n                    strcasecmp(p, \"DEBUG3\") == 0) {\n                value = SSH_LOG_TRACE;\n            }\n            if (value != -1) {\n                ssh_options_set(session, SSH_OPTIONS_LOG_VERBOSITY, &value);\n            }\n        }\n        break;\n    case SOC_HOSTKEYALGORITHMS:\n        p = ssh_config_get_str_tok(&s, NULL);\n        if (p && *parsing) {\n            ssh_options_set(session, SSH_OPTIONS_HOSTKEYS, p);\n        }\n        break;\n    case SOC_PUBKEYACCEPTEDTYPES:\n        p = ssh_config_get_str_tok(&s, NULL);\n        if (p && *parsing) {\n            ssh_options_set(session, SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES, p);\n        }\n        break;\n    case SOC_KEXALGORITHMS:\n        p = ssh_config_get_str_tok(&s, NULL);\n        if (p && *parsing) {\n            ssh_options_set(session, SSH_OPTIONS_KEY_EXCHANGE, p);\n        }\n        break;\n    case SOC_REKEYLIMIT:\n        /* Parse the data limit */\n        p = ssh_config_get_str_tok(&s, NULL);\n        if (p == NULL) {\n            break;\n        } else if (strcmp(p, \"default\") == 0) {\n            /* Default rekey limits enforced automaticaly */\n            ll = 0;\n        } else {\n            char *endp = NULL;\n            ll = strtoll(p, &endp, 10);\n            if (p == endp || ll < 0) {\n                /* No number or negative */\n                SSH_LOG(SSH_LOG_WARN, \"Invalid argument to rekey limit\");\n                break;\n            }\n            switch (*endp) {\n            case 'G':\n                if (ll > LLONG_MAX / 1024) {\n                    SSH_LOG(SSH_LOG_WARN, \"Possible overflow of rekey limit\");\n                    ll = -1;\n                    break;\n                }\n                ll = ll * 1024;\n                FALL_THROUGH;\n            case 'M':\n                if (ll > LLONG_MAX / 1024) {\n                    SSH_LOG(SSH_LOG_WARN, \"Possible overflow of rekey limit\");\n                    ll = -1;\n                    break;\n                }\n                ll = ll * 1024;\n                FALL_THROUGH;\n            case 'K':\n                if (ll > LLONG_MAX / 1024) {\n                    SSH_LOG(SSH_LOG_WARN, \"Possible overflow of rekey limit\");\n                    ll = -1;\n                    break;\n                }\n                ll = ll * 1024;\n                endp++;\n                FALL_THROUGH;\n            case '\\0':\n                /* just the number */\n                break;\n            default:\n                /* Invalid suffix */\n                ll = -1;\n                break;\n            }\n            if (*endp != ' ' && *endp != '\\0') {\n                SSH_LOG(SSH_LOG_WARN,\n                        \"Invalid trailing characters after the rekey limit: %s\",\n                        endp);\n                break;\n            }\n        }\n        if (ll > -1 && *parsing) {\n            uint64_t v = (uint64_t)ll;\n            ssh_options_set(session, SSH_OPTIONS_REKEY_DATA, &v);\n        }\n        /* Parse the time limit */\n        p = ssh_config_get_str_tok(&s, NULL);\n        if (p == NULL) {\n            break;\n        } else if (strcmp(p, \"none\") == 0) {\n            ll = 0;\n        } else {\n            char *endp = NULL;\n            ll = strtoll(p, &endp, 10);\n            if (p == endp || ll < 0) {\n                /* No number or negative */\n                SSH_LOG(SSH_LOG_WARN, \"Invalid argument to rekey limit\");\n                break;\n            }\n            switch (*endp) {\n            case 'w':\n            case 'W':\n                if (ll > LLONG_MAX / 7) {\n                    SSH_LOG(SSH_LOG_WARN, \"Possible overflow of rekey limit\");\n                    ll = -1;\n                    break;\n                }\n                ll = ll * 7;\n                FALL_THROUGH;\n            case 'd':\n            case 'D':\n                if (ll > LLONG_MAX / 24) {\n                    SSH_LOG(SSH_LOG_WARN, \"Possible overflow of rekey limit\");\n                    ll = -1;\n                    break;\n                }\n                ll = ll * 24;\n                FALL_THROUGH;\n            case 'h':\n            case 'H':\n                if (ll > LLONG_MAX / 60) {\n                    SSH_LOG(SSH_LOG_WARN, \"Possible overflow of rekey limit\");\n                    ll = -1;\n                    break;\n                }\n                ll = ll * 60;\n                FALL_THROUGH;\n            case 'm':\n            case 'M':\n                if (ll > LLONG_MAX / 60) {\n                    SSH_LOG(SSH_LOG_WARN, \"Possible overflow of rekey limit\");\n                    ll = -1;\n                    break;\n                }\n                ll = ll * 60;\n                FALL_THROUGH;\n            case 's':\n            case 'S':\n                endp++;\n                FALL_THROUGH;\n            case '\\0':\n                /* just the number */\n                break;\n            default:\n                /* Invalid suffix */\n                ll = -1;\n                break;\n            }\n            if (*endp != '\\0') {\n                SSH_LOG(SSH_LOG_WARN, \"Invalid trailing characters after the\"\n                        \" rekey limit: %s\", endp);\n                break;\n            }\n        }\n        if (ll > -1 && *parsing) {\n            uint32_t v = (uint32_t)ll;\n            ssh_options_set(session, SSH_OPTIONS_REKEY_TIME, &v);\n        }\n        break;\n    case SOC_GSSAPIAUTHENTICATION:\n    case SOC_KBDINTERACTIVEAUTHENTICATION:\n    case SOC_PASSWORDAUTHENTICATION:\n    case SOC_PUBKEYAUTHENTICATION:\n        i = ssh_config_get_yesno(&s, 0);\n        if (i>=0 && *parsing) {\n            switch(opcode){\n            case SOC_GSSAPIAUTHENTICATION:\n                ssh_options_set(session, SSH_OPTIONS_GSSAPI_AUTH, &i);\n                break;\n            case SOC_KBDINTERACTIVEAUTHENTICATION:\n                ssh_options_set(session, SSH_OPTIONS_KBDINT_AUTH, &i);\n                break;\n            case SOC_PASSWORDAUTHENTICATION:\n                ssh_options_set(session, SSH_OPTIONS_PASSWORD_AUTH, &i);\n                break;\n            case SOC_PUBKEYAUTHENTICATION:\n                ssh_options_set(session, SSH_OPTIONS_PUBKEY_AUTH, &i);\n                break;\n            /* make gcc happy */\n            default:\n                break;\n            }\n        }\n        break;\n    case SOC_NA:\n      SSH_LOG(SSH_LOG_INFO, \"Unapplicable option: %s, line: %d\",\n              keyword, count);\n      break;\n    case SOC_UNSUPPORTED:\n      SSH_LOG(SSH_LOG_RARE, \"Unsupported option: %s, line: %d\",\n              keyword, count);\n      break;\n    case SOC_UNKNOWN:\n      SSH_LOG(SSH_LOG_WARN, \"Unknown option: %s, line: %d\",\n              keyword, count);\n      break;\n    default:\n      ssh_set_error(session, SSH_FATAL, \"ERROR - unimplemented opcode: %d\",\n              opcode);\n      SAFE_FREE(x);\n      return -1;\n      break;\n  }\n\n  SAFE_FREE(x);\n  return 0;\n}\n\n/* @brief Parse configuration file and set the options to the given session\n *\n * @params[in] session   The ssh session\n * @params[in] filename  The path to the ssh configuration file\n *\n * @returns    0 on successful parsing the configuration file, -1 on error\n */\nint ssh_config_parse_file(ssh_session session, const char *filename)\n{\n    char line[MAX_LINE_SIZE] = {0};\n    unsigned int count = 0;\n    FILE *f;\n    int parsing, rv;\n\n    f = fopen(filename, \"r\");\n    if (f == NULL) {\n        return 0;\n    }\n\n    SSH_LOG(SSH_LOG_PACKET, \"Reading configuration data from %s\", filename);\n\n    parsing = 1;\n    while (fgets(line, sizeof(line), f)) {\n        count++;\n        rv = ssh_config_parse_line(session, line, count, &parsing);\n        if (rv < 0) {\n            fclose(f);\n            return -1;\n        }\n    }\n\n    fclose(f);\n    return 0;\n}\n"
  },
  {
    "path": "src/libssh/src/config_parser.c",
    "content": "/*\n * config_parser.c - Common configuration file parser functions\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2009-2013    by Andreas Schneider <asn@cryptomilk.org>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <ctype.h>\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n\n#include \"libssh/config_parser.h\"\n#include \"libssh/priv.h\"\n\nchar *ssh_config_get_cmd(char **str)\n{\n    register char *c;\n    char *r;\n\n    /* Ignore leading spaces */\n    for (c = *str; *c; c++) {\n        if (! isblank(*c)) {\n            break;\n        }\n    }\n\n    if (*c == '\\\"') {\n        for (r = ++c; *c; c++) {\n            if (*c == '\\\"') {\n                *c = '\\0';\n                goto out;\n            }\n        }\n    }\n\n    for (r = c; *c; c++) {\n        if (*c == '\\n') {\n            *c = '\\0';\n            goto out;\n        }\n    }\n\nout:\n    *str = c + 1;\n\n    return r;\n}\n\nchar *ssh_config_get_token(char **str)\n{\n    register char *c;\n    char *r;\n\n    c = ssh_config_get_cmd(str);\n\n    for (r = c; *c; c++) {\n        if (isblank(*c) || *c == '=') {\n            *c = '\\0';\n            goto out;\n        }\n    }\n\nout:\n    *str = c + 1;\n\n    return r;\n}\n\nlong ssh_config_get_long(char **str, long notfound)\n{\n    char *p, *endp;\n    long i;\n\n    p = ssh_config_get_token(str);\n    if (p && *p) {\n        i = strtol(p, &endp, 10);\n        if (p == endp) {\n            return notfound;\n        }\n        return i;\n    }\n\n    return notfound;\n}\n\nconst char *ssh_config_get_str_tok(char **str, const char *def)\n{\n    char *p;\n\n    p = ssh_config_get_token(str);\n    if (p && *p) {\n        return p;\n    }\n\n    return def;\n}\n\nint ssh_config_get_yesno(char **str, int notfound)\n{\n    const char *p;\n\n    p = ssh_config_get_str_tok(str, NULL);\n    if (p == NULL) {\n        return notfound;\n    }\n\n    if (strncasecmp(p, \"yes\", 3) == 0) {\n        return 1;\n    } else if (strncasecmp(p, \"no\", 2) == 0) {\n        return 0;\n    }\n\n    return notfound;\n}\n\nint ssh_config_parse_uri(const char *tok,\n        char **username,\n        char **hostname,\n        char **port)\n{\n    char *endp = NULL;\n    long port_n;\n\n    /* Sanitize inputs */\n    if (username != NULL) {\n        *username = NULL;\n    }\n    if (hostname != NULL) {\n        *hostname = NULL;\n    }\n    if (port != NULL) {\n        *port = NULL;\n    }\n\n    /* Username part (optional) */\n    endp = strchr(tok, '@');\n    if (endp != NULL) {\n        /* Zero-length username is not valid */\n        if (tok == endp) {\n            goto error;\n        }\n        if (username != NULL) {\n            *username = strndup(tok, endp - tok);\n            if (*username == NULL) {\n                goto error;\n            }\n        }\n        tok = endp + 1;\n        /* If there is second @ character, this does not look like our URI */\n        endp = strchr(tok, '@');\n        if (endp != NULL) {\n            goto error;\n        }\n    }\n\n    /* Hostname */\n    if (*tok == '[') {\n        /* IPv6 address is enclosed with square brackets */\n        tok++;\n        endp = strchr(tok, ']');\n        if (endp == NULL) {\n            goto error;\n        }\n    } else {\n        /* Hostnames or aliases expand to the last colon or to the end */\n        endp = strrchr(tok, ':');\n        if (endp == NULL) {\n            endp = strchr(tok, '\\0');\n        }\n    }\n    if (tok == endp) {\n        /* Zero-length hostnames are not valid */\n        goto error;\n    }\n    if (hostname != NULL) {\n        *hostname = strndup(tok, endp - tok);\n        if (*hostname == NULL) {\n            goto error;\n        }\n    }\n    /* Skip also the closing bracket */\n    if (*endp == ']') {\n        endp++;\n    }\n\n    /* Port (optional) */\n    if (*endp != '\\0') {\n        char *port_end = NULL;\n\n        /* Verify the port is valid positive number */\n        port_n = strtol(endp + 1, &port_end, 10);\n        if (port_n < 1 || *port_end != '\\0') {\n            SSH_LOG(SSH_LOG_WARN, \"Failed to parse port number.\"\n                    \" The value '%ld' is invalid or there are some\"\n                    \" trailing characters: '%s'\", port_n, port_end);\n            goto error;\n        }\n        if (port != NULL) {\n            *port = strdup(endp + 1);\n            if (*port == NULL) {\n                goto error;\n            }\n        }\n    }\n\n    return SSH_OK;\n\nerror:\n    if (username != NULL) {\n        SAFE_FREE(*username);\n    }\n    if (hostname != NULL) {\n        SAFE_FREE(*hostname);\n    }\n    if (port != NULL) {\n        SAFE_FREE(*port);\n    }\n    return SSH_ERROR;\n}\n"
  },
  {
    "path": "src/libssh/src/connect.c",
    "content": "/*\n * connect.c - handles connections to ssh servers\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2003-2013 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <errno.h>\n#include <fcntl.h>\n#include <stdbool.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"libssh/libssh.h\"\n#include \"libssh/misc.h\"\n\n#ifdef _WIN32\n/*\n * Only use Windows API functions available on Windows 2000 SP4 or later.\n * The available constants are in <sdkddkver.h>.\n *  http://msdn.microsoft.com/en-us/library/aa383745.aspx\n *  http://blogs.msdn.com/oldnewthing/archive/2007/04/11/2079137.aspx\n */\n#undef _WIN32_WINNT\n#ifdef HAVE_WSPIAPI_H\n#define _WIN32_WINNT 0x0500 /* _WIN32_WINNT_WIN2K */\n#undef NTDDI_VERSION\n#define NTDDI_VERSION 0x05000400 /* NTDDI_WIN2KSP4 */\n#else\n#define _WIN32_WINNT 0x0501 /* _WIN32_WINNT_WINXP */\n#undef NTDDI_VERSION\n#define NTDDI_VERSION 0x05010000 /* NTDDI_WINXP */\n#endif\n\n#if _MSC_VER >= 1400\n#include <io.h>\n#undef close\n#define close _close\n#endif /* _MSC_VER */\n#include <winsock2.h>\n#include <ws2tcpip.h>\n\n/* <wspiapi.h> is necessary for getaddrinfo before Windows XP, but it isn't\n * available on some platforms like MinGW. */\n#ifdef HAVE_WSPIAPI_H\n#include <wspiapi.h>\n#endif\n\n#ifndef EINPROGRESS\n#define EINPROGRESS WSAEINPROGRESS\n#endif\n\n#else /* _WIN32 */\n\n#include <netdb.h>\n#include <sys/socket.h>\n#include <sys/select.h>\n#include <netinet/in.h>\n#include <netinet/tcp.h>\n\n#endif /* _WIN32 */\n\n#include \"libssh/priv.h\"\n#include \"libssh/socket.h\"\n#include \"libssh/channels.h\"\n#include \"libssh/session.h\"\n#include \"libssh/poll.h\"\n\n#ifndef HAVE_GETADDRINFO\n#error \"Your system must have getaddrinfo()\"\n#endif\n\n#ifdef _WIN32\n#ifndef gai_strerror\nchar WSAAPI *gai_strerrorA(int code)\n{\n    static char buf[256];\n\n    snprintf(buf, sizeof(buf), \"Undetermined error code (%d)\", code);\n\n    return buf;\n}\n#endif /* gai_strerror */\n#endif /* _WIN32 */\n\nstatic int ssh_connect_socket_close(socket_t s)\n{\n#ifdef _WIN32\n    return closesocket(s);\n#else\n    return close(s);\n#endif\n}\n\nstatic int getai(const char *host, int port, struct addrinfo **ai)\n{\n    const char *service = NULL;\n    struct addrinfo hints;\n    char s_port[10];\n\n    ZERO_STRUCT(hints);\n\n    hints.ai_protocol = IPPROTO_TCP;\n    hints.ai_family = PF_UNSPEC;\n    hints.ai_socktype = SOCK_STREAM;\n\n    if (port == 0) {\n        hints.ai_flags = AI_PASSIVE;\n    } else {\n        snprintf(s_port, sizeof(s_port), \"%hu\", (unsigned short)port);\n        service = s_port;\n#ifdef AI_NUMERICSERV\n        hints.ai_flags = AI_NUMERICSERV;\n#endif\n    }\n\n    if (ssh_is_ipaddr(host)) {\n        /* this is an IP address */\n        SSH_LOG(SSH_LOG_PACKET, \"host %s matches an IP address\", host);\n        hints.ai_flags |= AI_NUMERICHOST;\n    }\n\n    return getaddrinfo(host, service, &hints, ai);\n}\n\nstatic int set_tcp_nodelay(socket_t socket)\n{\n    int opt = 1;\n\n    return setsockopt(socket,\n                      IPPROTO_TCP,\n                      TCP_NODELAY,\n                      (void *)&opt,\n                      sizeof(opt));\n}\n\n/**\n * @internal\n *\n * @brief Launches a nonblocking connect to an IPv4 or IPv6 host\n * specified by its IP address or hostname.\n *\n * @returns A file descriptor, < 0 on error.\n * @warning very ugly !!!\n */\nsocket_t ssh_connect_host_nonblocking(ssh_session session, const char *host,\n                                      const char *bind_addr, int port)\n{\n    socket_t s = -1;\n    int rc;\n    struct addrinfo *ai = NULL;\n    struct addrinfo *itr = NULL;\n\n    rc = getai(host, port, &ai);\n    if (rc != 0) {\n        ssh_set_error(session, SSH_FATAL,\n                      \"Failed to resolve hostname %s (%s)\",\n                      host, gai_strerror(rc));\n\n        return -1;\n    }\n\n    for (itr = ai; itr != NULL; itr = itr->ai_next) {\n        /* create socket */\n        s = socket(itr->ai_family, itr->ai_socktype, itr->ai_protocol);\n        if (s < 0) {\n            ssh_set_error(session, SSH_FATAL,\n                          \"Socket create failed: %s\", strerror(errno));\n            continue;\n        }\n\n        if (bind_addr) {\n            struct addrinfo *bind_ai;\n            struct addrinfo *bind_itr;\n\n            SSH_LOG(SSH_LOG_PACKET, \"Resolving %s\", bind_addr);\n\n            rc = getai(bind_addr, 0, &bind_ai);\n            if (rc != 0) {\n                ssh_set_error(session, SSH_FATAL,\n                              \"Failed to resolve bind address %s (%s)\",\n                              bind_addr,\n                              gai_strerror(rc));\n                ssh_connect_socket_close(s);\n                s = -1;\n                break;\n            }\n\n            for (bind_itr = bind_ai;\n                 bind_itr != NULL;\n                 bind_itr = bind_itr->ai_next)\n            {\n                if (bind(s, bind_itr->ai_addr, bind_itr->ai_addrlen) < 0) {\n                    ssh_set_error(session, SSH_FATAL,\n                                  \"Binding local address: %s\", strerror(errno));\n                    continue;\n                } else {\n                    break;\n                }\n            }\n            freeaddrinfo(bind_ai);\n\n            /* Cannot bind to any local addresses */\n            if (bind_itr == NULL) {\n                ssh_connect_socket_close(s);\n                s = -1;\n                continue;\n            }\n        }\n\n        rc = ssh_socket_set_nonblocking(s);\n        if (rc < 0) {\n            ssh_set_error(session, SSH_FATAL,\n                          \"Failed to set socket non-blocking for %s:%d\",\n                          host, port);\n            ssh_connect_socket_close(s);\n            s = -1;\n            continue;\n        }\n\n        if (session->opts.nodelay) {\n            /* For winsock, socket options are only effective before connect */\n            rc = set_tcp_nodelay(s);\n            if (rc < 0) {\n                ssh_set_error(session, SSH_FATAL,\n                              \"Failed to set TCP_NODELAY on socket: %s\",\n                              strerror(errno));\n                ssh_connect_socket_close(s);\n                s = -1;\n                continue;\n            }\n        }\n\n        errno = 0;\n        rc = connect(s, itr->ai_addr, itr->ai_addrlen);\n        if (rc == -1 && (errno != 0) && (errno != EINPROGRESS)) {\n            ssh_set_error(session, SSH_FATAL,\n                          \"Failed to connect: %s\", strerror(errno));\n            ssh_connect_socket_close(s);\n            s = -1;\n            continue;\n        }\n\n        break;\n    }\n\n    freeaddrinfo(ai);\n\n    return s;\n}\n\n/**\n * @addtogroup libssh_session\n *\n * @{\n */\n\nstatic int ssh_select_cb (socket_t fd, int revents, void *userdata)\n{\n    fd_set *set = (fd_set *)userdata;\n    if (revents & POLLIN) {\n        FD_SET(fd, set);\n    }\n    return 0;\n}\n\n/**\n * @brief A wrapper for the select syscall\n *\n * This functions acts more or less like the select(2) syscall.\\n\n * There is no support for writing or exceptions.\\n\n *\n * @param[in]  channels Arrays of channels pointers terminated by a NULL.\n *                      It is never rewritten.\n *\n * @param[out] outchannels Arrays of same size that \"channels\", there is no need\n *                         to initialize it.\n *\n * @param[in]  maxfd    Maximum +1 file descriptor from readfds.\n *\n * @param[in]  readfds  A fd_set of file descriptors to be select'ed for\n *                      reading.\n *\n * @param[in]  timeout  The timeout in milliseconds.\n *\n * @return              SSH_OK on success,\n *                      SSH_ERROR on error,\n *                      SSH_EINTR if it was interrupted. In that case,\n *                      just restart it.\n *\n * @warning libssh is not reentrant here. That means that if a signal is caught\n *          during the processing of this function, you cannot call libssh\n *          functions on sessions that are busy with ssh_select().\n *\n * @see select(2)\n */\nint ssh_select(ssh_channel *channels, ssh_channel *outchannels, socket_t maxfd,\n               fd_set *readfds, struct timeval *timeout)\n{\n    fd_set origfds;\n    socket_t fd;\n    size_t i, j;\n    int rc;\n    int base_tm, tm;\n    struct ssh_timestamp ts;\n    ssh_event event = ssh_event_new();\n    int firstround = 1;\n\n    base_tm = tm = (timeout->tv_sec * 1000) + (timeout->tv_usec / 1000);\n    for (i = 0 ; channels[i] != NULL; ++i) {\n        ssh_event_add_session(event, channels[i]->session);\n    }\n\n    ZERO_STRUCT(origfds);\n    FD_ZERO(&origfds);\n    for (fd = 0; fd < maxfd ; fd++) {\n        if (FD_ISSET(fd, readfds)) {\n            ssh_event_add_fd(event, fd, POLLIN, ssh_select_cb, readfds);\n            FD_SET(fd, &origfds);\n        }\n    }\n    outchannels[0] = NULL;\n    FD_ZERO(readfds);\n    ssh_timestamp_init(&ts);\n    do {\n        /* Poll every channel */\n        j = 0;\n        for (i = 0; channels[i]; i++) {\n            rc = ssh_channel_poll(channels[i], 0);\n            if (rc != 0) {\n                outchannels[j] = channels[i];\n                j++;\n            } else {\n                rc = ssh_channel_poll(channels[i], 1);\n                if (rc != 0) {\n                    outchannels[j] = channels[i];\n                    j++;\n                }\n            }\n        }\n\n        outchannels[j] = NULL;\n        if (j != 0) {\n            break;\n        }\n\n        /* watch if a user socket was triggered */\n        for (fd = 0; fd < maxfd; fd++) {\n            if (FD_ISSET(fd, readfds)) {\n                goto out;\n            }\n        }\n\n        /* If the timeout is elapsed, we should go out */\n        if (!firstround && ssh_timeout_elapsed(&ts, base_tm)) {\n            goto out;\n        }\n\n        /* since there's nothing, let's fire the polling */\n        rc = ssh_event_dopoll(event,tm);\n        if (rc == SSH_ERROR) {\n            goto out;\n        }\n\n        tm = ssh_timeout_update(&ts, base_tm);\n        firstround = 0;\n    } while (1);\nout:\n    for (fd = 0; fd < maxfd; fd++) {\n        if (FD_ISSET(fd, &origfds)) {\n            ssh_event_remove_fd(event, fd);\n        }\n    }\n    ssh_event_free(event);\n    return SSH_OK;\n}\n\n/** @} */\n"
  },
  {
    "path": "src/libssh/src/connector.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2015 by Aris Adamantiadis <aris@badcode.be>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include \"libssh/priv.h\"\n#include \"libssh/poll.h\"\n#include \"libssh/callbacks.h\"\n#include \"libssh/session.h\"\n#include <stdlib.h>\n#include <errno.h>\n#include <stdbool.h>\n#include <sys/stat.h>\n\n#define CHUNKSIZE 4096\n\n#ifdef _WIN32\n# ifdef HAVE_IO_H\n#  include <io.h>\n#  undef open\n#  define open _open\n#  undef close\n#  define close _close\n#  undef read\n#  define read _read\n#  undef unlink\n#  define unlink _unlink\n# endif /* HAVE_IO_H */\n#else\n# include <sys/types.h>\n# include <sys/socket.h>\n#endif\n\nstruct ssh_connector_struct {\n    ssh_session session;\n\n    ssh_channel in_channel;\n    ssh_channel out_channel;\n\n    socket_t in_fd;\n    socket_t out_fd;\n\n    bool fd_is_socket;\n\n    ssh_poll_handle in_poll;\n    ssh_poll_handle out_poll;\n\n    ssh_event event;\n\n    int in_available;\n    int out_wontblock;\n\n    struct ssh_channel_callbacks_struct in_channel_cb;\n    struct ssh_channel_callbacks_struct out_channel_cb;\n\n    enum ssh_connector_flags_e in_flags;\n    enum ssh_connector_flags_e out_flags;\n};\n\nstatic int ssh_connector_channel_data_cb(ssh_session session,\n                                         ssh_channel channel,\n                                         void *data,\n                                         uint32_t len,\n                                         int is_stderr,\n                                         void *userdata);\nstatic int ssh_connector_channel_write_wontblock_cb(ssh_session session,\n                                                    ssh_channel channel,\n                                                    size_t bytes,\n                                                    void *userdata);\nstatic ssize_t ssh_connector_fd_read(ssh_connector connector,\n                                     void *buffer,\n                                     uint32_t len);\nstatic ssize_t ssh_connector_fd_write(ssh_connector connector,\n                                      const void *buffer,\n                                      uint32_t len);\nstatic bool ssh_connector_fd_is_socket(socket_t socket);\n\nssh_connector ssh_connector_new(ssh_session session)\n{\n    ssh_connector connector;\n\n    connector = calloc(1, sizeof(struct ssh_connector_struct));\n    if (connector == NULL){\n        ssh_set_error_oom(session);\n        return NULL;\n    }\n\n    connector->session = session;\n    connector->in_fd = SSH_INVALID_SOCKET;\n    connector->out_fd = SSH_INVALID_SOCKET;\n\n    connector->fd_is_socket = false;\n\n    ssh_callbacks_init(&connector->in_channel_cb);\n    ssh_callbacks_init(&connector->out_channel_cb);\n\n    connector->in_channel_cb.userdata = connector;\n    connector->in_channel_cb.channel_data_function = ssh_connector_channel_data_cb;\n\n    connector->out_channel_cb.userdata = connector;\n    connector->out_channel_cb.channel_write_wontblock_function =\n            ssh_connector_channel_write_wontblock_cb;\n\n    return connector;\n}\n\nvoid ssh_connector_free (ssh_connector connector)\n{\n    if (connector->in_channel != NULL) {\n        ssh_remove_channel_callbacks(connector->in_channel,\n                                     &connector->in_channel_cb);\n    }\n    if (connector->out_channel != NULL) {\n        ssh_remove_channel_callbacks(connector->out_channel,\n                                     &connector->out_channel_cb);\n    }\n\n    if (connector->event != NULL){\n        ssh_connector_remove_event(connector);\n    }\n\n    if (connector->in_poll != NULL) {\n        ssh_poll_free(connector->in_poll);\n        connector->in_poll = NULL;\n    }\n\n    if (connector->out_poll != NULL) {\n        ssh_poll_free(connector->out_poll);\n        connector->out_poll = NULL;\n    }\n\n    free(connector);\n}\n\nint ssh_connector_set_in_channel(ssh_connector connector,\n                                  ssh_channel channel,\n                                  enum ssh_connector_flags_e flags)\n{\n    connector->in_channel = channel;\n    connector->in_fd = SSH_INVALID_SOCKET;\n    connector->in_flags = flags;\n\n    /* Fallback to default value for invalid flags */\n    if (!(flags & SSH_CONNECTOR_STDOUT) && !(flags & SSH_CONNECTOR_STDERR)) {\n        connector->in_flags = SSH_CONNECTOR_STDOUT;\n    }\n\n    return ssh_add_channel_callbacks(channel, &connector->in_channel_cb);\n}\n\nint ssh_connector_set_out_channel(ssh_connector connector,\n                                  ssh_channel channel,\n                                  enum ssh_connector_flags_e flags)\n{\n    connector->out_channel = channel;\n    connector->out_fd = SSH_INVALID_SOCKET;\n    connector->out_flags = flags;\n\n    /* Fallback to default value for invalid flags */\n    if (!(flags & SSH_CONNECTOR_STDOUT) && !(flags & SSH_CONNECTOR_STDERR)) {\n        connector->in_flags = SSH_CONNECTOR_STDOUT;\n    }\n\n    return ssh_add_channel_callbacks(channel, &connector->out_channel_cb);\n}\n\nvoid ssh_connector_set_in_fd(ssh_connector connector, socket_t fd)\n{\n    connector->in_fd = fd;\n    connector->fd_is_socket = ssh_connector_fd_is_socket(fd);\n    connector->in_channel = NULL;\n}\n\nvoid ssh_connector_set_out_fd(ssh_connector connector, socket_t fd)\n{\n    connector->out_fd = fd;\n    connector->fd_is_socket = ssh_connector_fd_is_socket(fd);\n    connector->out_channel = NULL;\n}\n\n/* TODO */\nstatic void ssh_connector_except(ssh_connector connector, socket_t fd)\n{\n    (void) connector;\n    (void) fd;\n}\n\n/* TODO */\nstatic void ssh_connector_except_channel(ssh_connector connector,\n                                         ssh_channel channel)\n{\n    (void) connector;\n    (void) channel;\n}\n\n/**\n * @internal\n *\n * @brief Reset the poll events to be followed for each file descriptors.\n */\nstatic void ssh_connector_reset_pollevents(ssh_connector connector)\n{\n    if (connector->in_fd != SSH_INVALID_SOCKET) {\n        if (connector->in_available) {\n            ssh_poll_remove_events(connector->in_poll, POLLIN);\n        } else {\n            ssh_poll_add_events(connector->in_poll, POLLIN);\n        }\n    }\n\n    if (connector->out_fd != SSH_INVALID_SOCKET) {\n        if (connector->out_wontblock) {\n            ssh_poll_remove_events(connector->out_poll, POLLOUT);\n        } else {\n            ssh_poll_add_events(connector->out_poll, POLLOUT);\n        }\n    }\n}\n\n/**\n * @internal\n *\n * @brief Callback called when a poll event is received on an input fd.\n */\nstatic void ssh_connector_fd_in_cb(ssh_connector connector)\n{\n    unsigned char buffer[CHUNKSIZE];\n    uint32_t toread = CHUNKSIZE;\n    ssize_t r;\n    ssize_t w;\n    int total = 0;\n    int rc;\n\n    SSH_LOG(SSH_LOG_TRACE, \"connector POLLIN event for fd %d\", connector->in_fd);\n\n    if (connector->out_wontblock) {\n        if (connector->out_channel != NULL) {\n            size_t size = ssh_channel_window_size(connector->out_channel);\n\n            /* Don't attempt reading more than the window */\n            toread = MIN(size, CHUNKSIZE);\n        }\n\n        r = ssh_connector_fd_read(connector, buffer, toread);\n        if (r < 0) {\n            ssh_connector_except(connector, connector->in_fd);\n            return;\n        }\n\n        if (connector->out_channel != NULL) {\n            if (r == 0) {\n                SSH_LOG(SSH_LOG_TRACE, \"input fd %d is EOF\", connector->in_fd);\n                if (connector->out_channel->local_eof == 0) {\n                    rc = ssh_channel_send_eof(connector->out_channel);\n                    (void)rc; /* TODO Handle rc? */\n                }\n                connector->in_available = 1; /* Don't poll on it */\n                return;\n            } else if (r> 0) {\n                /* loop around ssh_channel_write in case our window reduced due to a race */\n                while (total != r){\n                    if (connector->out_flags & SSH_CONNECTOR_STDOUT) {\n                        w = ssh_channel_write(connector->out_channel,\n                                              buffer + total,\n                                              r - total);\n                    } else {\n                        w = ssh_channel_write_stderr(connector->out_channel,\n                                                     buffer + total,\n                                                     r - total);\n                    }\n                    if (w == SSH_ERROR) {\n                        return;\n                    }\n                    total += w;\n                }\n            }\n        } else if (connector->out_fd != SSH_INVALID_SOCKET) {\n            if (r == 0){\n                close(connector->out_fd);\n                connector->out_fd = SSH_INVALID_SOCKET;\n            } else {\n                /*\n                 * Loop around write in case the write blocks even for CHUNKSIZE\n                 * bytes\n                 */\n                while (total != r) {\n                    w = ssh_connector_fd_write(connector, buffer + total, r - total);\n                    if (w < 0){\n                        ssh_connector_except(connector, connector->out_fd);\n                        return;\n                    }\n                    total += w;\n                }\n            }\n        } else {\n            ssh_set_error(connector->session, SSH_FATAL, \"output socket or channel closed\");\n            return;\n        }\n        connector->out_wontblock = 0;\n        connector->in_available = 0;\n    } else {\n        connector->in_available = 1;\n    }\n}\n\n/** @internal\n * @brief Callback called when a poll event is received on an output fd\n */\nstatic void ssh_connector_fd_out_cb(ssh_connector connector){\n    unsigned char buffer[CHUNKSIZE];\n    int r;\n    int w;\n    int total = 0;\n    SSH_LOG(SSH_LOG_TRACE, \"connector POLLOUT event for fd %d\", connector->out_fd);\n\n    if(connector->in_available){\n        if (connector->in_channel != NULL){\n            r = ssh_channel_read_nonblocking(connector->in_channel, buffer, CHUNKSIZE, 0);\n            if(r == SSH_ERROR){\n                ssh_connector_except_channel(connector, connector->in_channel);\n                return;\n            } else if(r == 0 && ssh_channel_is_eof(connector->in_channel)){\n                close(connector->out_fd);\n                connector->out_fd = SSH_INVALID_SOCKET;\n                return;\n            } else if(r>0) {\n                /* loop around write in case the write blocks even for CHUNKSIZE bytes */\n                while (total != r){\n                        w = ssh_connector_fd_write(connector, buffer + total, r - total);\n                    if (w < 0){\n                        ssh_connector_except(connector, connector->out_fd);\n                        return;\n                    }\n                    total += w;\n                }\n            }\n        } else if (connector->in_fd != SSH_INVALID_SOCKET){\n            /* fallback on the socket input callback */\n            connector->out_wontblock = 1;\n            ssh_connector_fd_in_cb(connector);\n        } else {\n            ssh_set_error(connector->session,\n                          SSH_FATAL,\n                          \"Output socket or channel closed\");\n            return;\n        }\n        connector->in_available = 0;\n        connector->out_wontblock = 0;\n    } else {\n        connector->out_wontblock = 1;\n    }\n}\n\n/**\n * @internal\n *\n * @brief Callback called when a poll event is received on a file descriptor.\n *\n * This is for (input or output.\n *\n * @param[in] fd file descriptor receiving the event\n *\n * @param[in] revents received Poll(2) events\n *\n * @param[in] userdata connector\n *\n * @returns 0\n */\nstatic int ssh_connector_fd_cb(ssh_poll_handle p,\n                               socket_t fd,\n                               int revents,\n                               void *userdata)\n{\n    ssh_connector connector = userdata;\n\n    (void)p;\n\n    if (revents & POLLERR) {\n        ssh_connector_except(connector, fd);\n    } else if((revents & (POLLIN|POLLHUP)) && fd == connector->in_fd) {\n        ssh_connector_fd_in_cb(connector);\n    } else if(((revents & POLLOUT) || (revents & POLLHUP)) &&\n              fd == connector->out_fd) {\n        ssh_connector_fd_out_cb(connector);\n    }\n    ssh_connector_reset_pollevents(connector);\n\n    return 0;\n}\n\n/**\n * @internal\n *\n * @brief Callback called when data is received on channel.\n *\n * @param[in] data Pointer to the data\n *\n * @param[in] len Length of data\n *\n * @param[in] is_stderr Set to 1 if the data are out of band\n *\n * @param[in] userdata The ssh connector\n *\n * @returns Amount of data bytes consumed\n */\nstatic int ssh_connector_channel_data_cb(ssh_session session,\n                                         ssh_channel channel,\n                                         void *data,\n                                         uint32_t len,\n                                         int is_stderr,\n                                         void *userdata)\n{\n    ssh_connector connector = userdata;\n    int w;\n    size_t window;\n\n    (void) session;\n    (void) channel;\n    (void) is_stderr;\n\n    SSH_LOG(SSH_LOG_TRACE,\"connector data on channel\");\n\n    if (is_stderr && !(connector->in_flags & SSH_CONNECTOR_STDERR)) {\n        /* ignore stderr */\n        return 0;\n    } else if (!is_stderr && !(connector->in_flags & SSH_CONNECTOR_STDOUT)) {\n        /* ignore stdout */\n        return 0;\n    }\n\n    if (connector->out_wontblock) {\n        if (connector->out_channel != NULL) {\n            int window_len;\n\n            window = ssh_channel_window_size(connector->out_channel);\n            window_len = MIN(window, len);\n\n            /* Route the data to the right exception channel */\n            if (is_stderr && (connector->out_flags & SSH_CONNECTOR_STDERR)) {\n                w = ssh_channel_write_stderr(connector->out_channel,\n                                             data,\n                                             window_len);\n            } else if (!is_stderr &&\n                       (connector->out_flags & SSH_CONNECTOR_STDOUT)) {\n                w = ssh_channel_write(connector->out_channel,\n                                      data,\n                                      window_len);\n            } else if (connector->out_flags & SSH_CONNECTOR_STDOUT) {\n                w = ssh_channel_write(connector->out_channel,\n                                      data,\n                                      window_len);\n            } else {\n                w = ssh_channel_write_stderr(connector->out_channel,\n                                             data,\n                                             window_len);\n            }\n            if (w == SSH_ERROR) {\n                ssh_connector_except_channel(connector, connector->out_channel);\n            }\n        } else if (connector->out_fd != SSH_INVALID_SOCKET) {\n                w = ssh_connector_fd_write(connector, data, len);\n            if (w < 0)\n                ssh_connector_except(connector, connector->out_fd);\n        } else {\n            ssh_set_error(session, SSH_FATAL, \"output socket or channel closed\");\n            return SSH_ERROR;\n        }\n\n        connector->out_wontblock = 0;\n        connector->in_available = 0;\n        if ((unsigned int)w < len) {\n            connector->in_available = 1;\n        }\n        ssh_connector_reset_pollevents(connector);\n\n        return w;\n    } else {\n        connector->in_available = 1;\n\n        return 0;\n    }\n}\n\n/**\n * @internal\n *\n * @brief Callback called when the channel is free to write.\n *\n * @param[in] bytes Amount of bytes that can be written without blocking\n *\n * @param[in] userdata The ssh connector\n *\n * @returns Amount of data bytes consumed\n */\nstatic int ssh_connector_channel_write_wontblock_cb(ssh_session session,\n                                                    ssh_channel channel,\n                                                    size_t bytes,\n                                                    void *userdata)\n{\n    ssh_connector connector = userdata;\n    uint8_t buffer[CHUNKSIZE];\n    int r, w;\n\n    (void) channel;\n\n    SSH_LOG(SSH_LOG_TRACE, \"Channel write won't block\");\n    if (connector->in_available) {\n        if (connector->in_channel != NULL) {\n            size_t len = MIN(CHUNKSIZE, bytes);\n\n            r = ssh_channel_read_nonblocking(connector->in_channel,\n                                             buffer,\n                                             len,\n                                             0);\n            if (r == SSH_ERROR) {\n                ssh_connector_except_channel(connector, connector->in_channel);\n            } else if(r == 0 && ssh_channel_is_eof(connector->in_channel)){\n                ssh_channel_send_eof(connector->out_channel);\n            } else if (r > 0) {\n                w = ssh_channel_write(connector->out_channel, buffer, r);\n                if (w == SSH_ERROR) {\n                    ssh_connector_except_channel(connector,\n                                                 connector->out_channel);\n                }\n            }\n        } else if (connector->in_fd != SSH_INVALID_SOCKET) {\n            /* fallback on on the socket input callback */\n            connector->out_wontblock = 1;\n            ssh_connector_fd_in_cb(connector);\n            ssh_connector_reset_pollevents(connector);\n        } else {\n            ssh_set_error(session,\n                          SSH_FATAL,\n                          \"Output socket or channel closed\");\n\n            return 0;\n        }\n        connector->in_available = 0;\n        connector->out_wontblock = 0;\n    } else {\n        connector->out_wontblock = 1;\n    }\n\n    return 0;\n}\n\nint ssh_connector_set_event(ssh_connector connector, ssh_event event)\n{\n    int rc = SSH_OK;\n\n    if ((connector->in_fd == SSH_INVALID_SOCKET &&\n         connector->in_channel == NULL)\n        || (connector->out_fd == SSH_INVALID_SOCKET &&\n            connector->out_channel == NULL)) {\n        rc = SSH_ERROR;\n        ssh_set_error(connector->session,SSH_FATAL,\"Connector not complete\");\n        goto error;\n    }\n\n    connector->event = event;\n    if (connector->in_fd != SSH_INVALID_SOCKET) {\n        if (connector->in_poll == NULL) {\n            connector->in_poll = ssh_poll_new(connector->in_fd,\n                                              POLLIN|POLLERR,\n                                              ssh_connector_fd_cb,\n                                              connector);\n        }\n        rc = ssh_event_add_poll(event, connector->in_poll);\n        if (rc != SSH_OK) {\n            goto error;\n        }\n    }\n\n    if (connector->out_fd != SSH_INVALID_SOCKET) {\n        if (connector->out_poll == NULL) {\n            connector->out_poll = ssh_poll_new(connector->out_fd,\n                                               POLLOUT|POLLERR,\n                                               ssh_connector_fd_cb,\n                                               connector);\n        }\n\n        rc = ssh_event_add_poll(event, connector->out_poll);\n        if (rc != SSH_OK) {\n            goto error;\n        }\n    }\n    if (connector->in_channel != NULL) {\n        rc = ssh_event_add_session(event,\n                ssh_channel_get_session(connector->in_channel));\n        if (rc != SSH_OK)\n            goto error;\n        if (ssh_channel_poll_timeout(connector->in_channel, 0, 0) > 0){\n            connector->in_available = 1;\n        }\n    }\n    if(connector->out_channel != NULL) {\n        ssh_session session = ssh_channel_get_session(connector->out_channel);\n\n        rc =  ssh_event_add_session(event, session);\n        if (rc != SSH_OK) {\n            goto error;\n        }\n        if (ssh_channel_window_size(connector->out_channel) > 0) {\n            connector->out_wontblock = 1;\n        }\n    }\n\nerror:\n    return rc;\n}\n\nint ssh_connector_remove_event(ssh_connector connector) {\n    ssh_session session;\n\n    if (connector->in_poll != NULL) {\n        ssh_event_remove_poll(connector->event, connector->in_poll);\n        ssh_poll_free(connector->in_poll);\n        connector->in_poll = NULL;\n    }\n\n    if (connector->out_poll != NULL) {\n        ssh_event_remove_poll(connector->event, connector->out_poll);\n        ssh_poll_free(connector->out_poll);\n        connector->out_poll = NULL;\n    }\n\n    if (connector->in_channel != NULL) {\n        session = ssh_channel_get_session(connector->in_channel);\n\n        ssh_event_remove_session(connector->event, session);\n    }\n\n    if (connector->out_channel != NULL) {\n        session = ssh_channel_get_session(connector->out_channel);\n\n        ssh_event_remove_session(connector->event, session);\n    }\n    connector->event = NULL;\n\n    return SSH_OK;\n}\n\n/**\n * @internal\n *\n * @brief Check the file descriptor to check if it is a Windows socket handle.\n *\n */\nstatic bool ssh_connector_fd_is_socket(socket_t s)\n{\n#ifdef _WIN32\n    struct sockaddr_storage ss;\n    int len = sizeof(struct sockaddr_storage);\n    int rc;\n\n    rc = getsockname(s, (struct sockaddr *)&ss, &len);\n    if (rc == 0) {\n        return true;\n    }\n\n    SSH_LOG(SSH_LOG_TRACE,\n            \"Error %i in getsockname() for fd %d\",\n            WSAGetLastError(),\n            s);\n\n    return false;\n#else\n    struct stat sb;\n    int rc;\n\n    rc = fstat(s, &sb);\n    if (rc != 0) {\n        SSH_LOG(SSH_LOG_TRACE,\n                \"error %i in fstat() for fd %d\",\n                errno,\n                s);\n        return false;\n    }\n\n    /* The descriptor is a socket */\n    if (S_ISSOCK(sb.st_mode)) {\n          return true;\n    }\n\n    return false;\n#endif /* _WIN32 */\n}\n\n/**\n * @internal\n *\n * @brief read len bytes from socket into buffer\n *\n */\nstatic ssize_t ssh_connector_fd_read(ssh_connector connector,\n                                     void *buffer,\n                                     uint32_t len)\n{\n    ssize_t nread = -1;\n\n    if (connector->fd_is_socket) {\n        nread = recv(connector->in_fd,buffer, len, 0);\n    } else {\n        nread = read(connector->in_fd,buffer, len);\n    }\n\n    return nread;\n}\n\n/**\n * @internal\n *\n * @brief brief writes len bytes from buffer to socket\n *\n */\nstatic ssize_t ssh_connector_fd_write(ssh_connector connector,\n                                      const void *buffer,\n                                      uint32_t len)\n{\n    ssize_t bwritten = -1;\n    int flags = 0;\n\n#ifdef MSG_NOSIGNAL\n    flags |= MSG_NOSIGNAL;\n#endif\n\n    if (connector->fd_is_socket) {\n        bwritten = send(connector->out_fd,buffer, len, flags);\n    } else {\n        bwritten = write(connector->out_fd, buffer, len);\n    }\n\n    return bwritten;\n}\n"
  },
  {
    "path": "src/libssh/src/curve25519.c",
    "content": "/*\n * curve25519.c - Curve25519 ECDH functions for key exchange\n * curve25519-sha256@libssh.org and curve25519-sha256\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2013      by Aris Adamantiadis <aris@badcode.be>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation, version 2.1 of the License.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include \"libssh/curve25519.h\"\n#ifdef HAVE_CURVE25519\n\n#ifdef WITH_NACL\n#include \"nacl/crypto_scalarmult_curve25519.h\"\n#endif\n\n#include \"libssh/ssh2.h\"\n#include \"libssh/buffer.h\"\n#include \"libssh/priv.h\"\n#include \"libssh/session.h\"\n#include \"libssh/crypto.h\"\n#include \"libssh/dh.h\"\n#include \"libssh/pki.h\"\n#include \"libssh/bignum.h\"\n\n#ifdef HAVE_OPENSSL_X25519\n#include <openssl/err.h>\n#endif\n\nstatic SSH_PACKET_CALLBACK(ssh_packet_client_curve25519_reply);\n\nstatic ssh_packet_callback dh_client_callbacks[] = {\n    ssh_packet_client_curve25519_reply\n};\n\nstatic struct ssh_packet_callbacks_struct ssh_curve25519_client_callbacks = {\n    .start = SSH2_MSG_KEX_ECDH_REPLY,\n    .n_callbacks = 1,\n    .callbacks = dh_client_callbacks,\n    .user = NULL\n};\n\nstatic int ssh_curve25519_init(ssh_session session)\n{\n    int rc;\n#ifdef HAVE_OPENSSL_X25519\n    EVP_PKEY_CTX *pctx = NULL;\n    EVP_PKEY *pkey = NULL;\n    size_t pubkey_len = CURVE25519_PUBKEY_SIZE;\n    size_t pkey_len = CURVE25519_PRIVKEY_SIZE;\n\n    pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_X25519, NULL);\n    if (pctx == NULL) {\n        SSH_LOG(SSH_LOG_TRACE,\n                \"Failed to initialize X25519 context: %s\",\n                ERR_error_string(ERR_get_error(), NULL));\n        return SSH_ERROR;\n    }\n\n    rc = EVP_PKEY_keygen_init(pctx);\n    if (rc != 1) {\n        SSH_LOG(SSH_LOG_TRACE,\n                \"Failed to initialize X25519 keygen: %s\",\n                ERR_error_string(ERR_get_error(), NULL));\n        EVP_PKEY_CTX_free(pctx);\n        return SSH_ERROR;\n    }\n\n    rc = EVP_PKEY_keygen(pctx, &pkey);\n    EVP_PKEY_CTX_free(pctx);\n    if (rc != 1) {\n        SSH_LOG(SSH_LOG_TRACE,\n                \"Failed to generate X25519 keys: %s\",\n                ERR_error_string(ERR_get_error(), NULL));\n        return SSH_ERROR;\n    }\n\n    if (session->server) {\n        rc = EVP_PKEY_get_raw_public_key(pkey,\n                                         session->next_crypto->curve25519_server_pubkey,\n                                         &pubkey_len);\n    } else {\n        rc = EVP_PKEY_get_raw_public_key(pkey,\n                                         session->next_crypto->curve25519_client_pubkey,\n                                         &pubkey_len);\n    }\n\n    if (rc != 1) {\n        SSH_LOG(SSH_LOG_TRACE,\n                \"Failed to get X25519 raw public key: %s\",\n                ERR_error_string(ERR_get_error(), NULL));\n        EVP_PKEY_free(pkey);\n        return SSH_ERROR;\n    }\n\n    rc = EVP_PKEY_get_raw_private_key(pkey,\n                                      session->next_crypto->curve25519_privkey,\n                                      &pkey_len);\n    if (rc != 1) {\n        SSH_LOG(SSH_LOG_TRACE,\n                \"Failed to get X25519 raw private key: %s\",\n                ERR_error_string(ERR_get_error(), NULL));\n        EVP_PKEY_free(pkey);\n        return SSH_ERROR;\n    }\n\n    EVP_PKEY_free(pkey);\n#else\n    rc = ssh_get_random(session->next_crypto->curve25519_privkey,\n                        CURVE25519_PRIVKEY_SIZE, 1);\n    if (rc != 1) {\n        ssh_set_error(session, SSH_FATAL, \"PRNG error\");\n        return SSH_ERROR;\n    }\n\n    if (session->server) {\n        crypto_scalarmult_base(session->next_crypto->curve25519_server_pubkey,\n                               session->next_crypto->curve25519_privkey);\n    } else {\n        crypto_scalarmult_base(session->next_crypto->curve25519_client_pubkey,\n                               session->next_crypto->curve25519_privkey);\n    }\n#endif /* HAVE_OPENSSL_X25519 */\n\n    return SSH_OK;\n}\n\n/** @internal\n * @brief Starts curve25519-sha256@libssh.org / curve25519-sha256 key exchange\n */\nint ssh_client_curve25519_init(ssh_session session)\n{\n    int rc;\n\n    rc = ssh_curve25519_init(session);\n    if (rc != SSH_OK) {\n        return rc;\n    }\n\n    rc = ssh_buffer_pack(session->out_buffer,\n                         \"bdP\",\n                         SSH2_MSG_KEX_ECDH_INIT,\n                         CURVE25519_PUBKEY_SIZE,\n                         (size_t)CURVE25519_PUBKEY_SIZE,\n                         session->next_crypto->curve25519_client_pubkey);\n    if (rc != SSH_OK) {\n        ssh_set_error_oom(session);\n        return SSH_ERROR;\n    }\n\n    /* register the packet callbacks */\n    ssh_packet_set_callbacks(session, &ssh_curve25519_client_callbacks);\n    session->dh_handshake_state = DH_STATE_INIT_SENT;\n    rc = ssh_packet_send(session);\n\n    return rc;\n}\n\nstatic int ssh_curve25519_build_k(ssh_session session)\n{\n    ssh_curve25519_pubkey k;\n\n#ifdef HAVE_OPENSSL_X25519\n    EVP_PKEY_CTX *pctx = NULL;\n    EVP_PKEY *pkey = NULL, *pubkey = NULL;\n    size_t shared_key_len = sizeof(k);\n    int rc, ret = SSH_ERROR;\n\n    pkey = EVP_PKEY_new_raw_private_key(EVP_PKEY_X25519, NULL,\n                                        session->next_crypto->curve25519_privkey,\n                                        CURVE25519_PRIVKEY_SIZE);\n    if (pkey == NULL) {\n        SSH_LOG(SSH_LOG_TRACE,\n                \"Failed to create X25519 EVP_PKEY: %s\",\n                ERR_error_string(ERR_get_error(), NULL));\n        return SSH_ERROR;\n    }\n\n    pctx = EVP_PKEY_CTX_new(pkey, NULL);\n    if (pctx == NULL) {\n        SSH_LOG(SSH_LOG_TRACE,\n                \"Failed to initialize X25519 context: %s\",\n                ERR_error_string(ERR_get_error(), NULL));\n        goto out;\n    }\n\n    rc = EVP_PKEY_derive_init(pctx);\n    if (rc != 1) {\n        SSH_LOG(SSH_LOG_TRACE,\n                \"Failed to initialize X25519 key derivation: %s\",\n                ERR_error_string(ERR_get_error(), NULL));\n        goto out;\n    }\n\n    if (session->server) {\n        pubkey = EVP_PKEY_new_raw_public_key(EVP_PKEY_X25519, NULL,\n                                             session->next_crypto->curve25519_client_pubkey,\n                                             CURVE25519_PUBKEY_SIZE);\n    } else {\n        pubkey = EVP_PKEY_new_raw_public_key(EVP_PKEY_X25519, NULL,\n                                             session->next_crypto->curve25519_server_pubkey,\n                                             CURVE25519_PUBKEY_SIZE);\n    }\n    if (pubkey == NULL) {\n        SSH_LOG(SSH_LOG_TRACE,\n                \"Failed to create X25519 public key EVP_PKEY: %s\",\n                ERR_error_string(ERR_get_error(), NULL));\n        goto out;\n    }\n\n    rc = EVP_PKEY_derive_set_peer(pctx, pubkey);\n    if (rc != 1) {\n        SSH_LOG(SSH_LOG_TRACE,\n                \"Failed to set peer X25519 public key: %s\",\n                ERR_error_string(ERR_get_error(), NULL));\n        goto out;\n    }\n\n    rc = EVP_PKEY_derive(pctx, k, &shared_key_len);\n    if (rc != 1) {\n        SSH_LOG(SSH_LOG_TRACE,\n                \"Failed to derive X25519 shared secret: %s\",\n                ERR_error_string(ERR_get_error(), NULL));\n        goto out;\n    }\n    ret = SSH_OK;\nout:\n    EVP_PKEY_free(pkey);\n    EVP_PKEY_free(pubkey);\n    EVP_PKEY_CTX_free(pctx);\n    if (ret == SSH_ERROR) {\n        return ret;\n    }\n#else\n    if (session->server) {\n        crypto_scalarmult(k, session->next_crypto->curve25519_privkey,\n                          session->next_crypto->curve25519_client_pubkey);\n    } else {\n        crypto_scalarmult(k, session->next_crypto->curve25519_privkey,\n                          session->next_crypto->curve25519_server_pubkey);\n    }\n#endif /* HAVE_OPENSSL_X25519 */\n\n    bignum_bin2bn(k, CURVE25519_PUBKEY_SIZE, &session->next_crypto->shared_secret);\n    if (session->next_crypto->shared_secret == NULL) {\n        return SSH_ERROR;\n    }\n\n#ifdef DEBUG_CRYPTO\n    ssh_log_hexdump(\"Session server cookie\",\n                   session->next_crypto->server_kex.cookie, 16);\n    ssh_log_hexdump(\"Session client cookie\",\n                   session->next_crypto->client_kex.cookie, 16);\n    ssh_print_bignum(\"Shared secret key\", session->next_crypto->shared_secret);\n#endif\n\n  return 0;\n}\n\n/** @internal\n * @brief parses a SSH_MSG_KEX_ECDH_REPLY packet and sends back\n * a SSH_MSG_NEWKEYS\n */\nstatic SSH_PACKET_CALLBACK(ssh_packet_client_curve25519_reply){\n  ssh_string q_s_string = NULL;\n  ssh_string pubkey_blob = NULL;\n  ssh_string signature = NULL;\n  int rc;\n  (void)type;\n  (void)user;\n\n  ssh_packet_remove_callbacks(session, &ssh_curve25519_client_callbacks);\n\n  pubkey_blob = ssh_buffer_get_ssh_string(packet);\n  if (pubkey_blob == NULL) {\n    ssh_set_error(session,SSH_FATAL, \"No public key in packet\");\n    goto error;\n  }\n\n  rc = ssh_dh_import_next_pubkey_blob(session, pubkey_blob);\n  SSH_STRING_FREE(pubkey_blob);\n  if (rc != 0) {\n      ssh_set_error(session,\n                    SSH_FATAL,\n                    \"Failed to import next public key\");\n      goto error;\n  }\n\n  q_s_string = ssh_buffer_get_ssh_string(packet);\n  if (q_s_string == NULL) {\n\t  ssh_set_error(session,SSH_FATAL, \"No Q_S ECC point in packet\");\n\t  goto error;\n  }\n  if (ssh_string_len(q_s_string) != CURVE25519_PUBKEY_SIZE){\n\t  ssh_set_error(session, SSH_FATAL, \"Incorrect size for server Curve25519 public key: %d\",\n\t\t\t  (int)ssh_string_len(q_s_string));\n\t  SSH_STRING_FREE(q_s_string);\n\t  goto error;\n  }\n  memcpy(session->next_crypto->curve25519_server_pubkey, ssh_string_data(q_s_string), CURVE25519_PUBKEY_SIZE);\n  SSH_STRING_FREE(q_s_string);\n\n  signature = ssh_buffer_get_ssh_string(packet);\n  if (signature == NULL) {\n    ssh_set_error(session, SSH_FATAL, \"No signature in packet\");\n    goto error;\n  }\n  session->next_crypto->dh_server_signature = signature;\n  signature=NULL; /* ownership changed */\n  /* TODO: verify signature now instead of waiting for NEWKEYS */\n  if (ssh_curve25519_build_k(session) < 0) {\n    ssh_set_error(session, SSH_FATAL, \"Cannot build k number\");\n    goto error;\n  }\n\n  /* Send the MSG_NEWKEYS */\n  if (ssh_buffer_add_u8(session->out_buffer, SSH2_MSG_NEWKEYS) < 0) {\n    goto error;\n  }\n\n  rc=ssh_packet_send(session);\n  if (rc == SSH_ERROR) {\n    goto error;\n  }\n\n  SSH_LOG(SSH_LOG_PROTOCOL, \"SSH_MSG_NEWKEYS sent\");\n  session->dh_handshake_state = DH_STATE_NEWKEYS_SENT;\n\n  return SSH_PACKET_USED;\n\nerror:\n  session->session_state=SSH_SESSION_STATE_ERROR;\n  return SSH_PACKET_USED;\n}\n\n#ifdef WITH_SERVER\n\nstatic SSH_PACKET_CALLBACK(ssh_packet_server_curve25519_init);\n\nstatic ssh_packet_callback dh_server_callbacks[]= {\n    ssh_packet_server_curve25519_init\n};\n\nstatic struct ssh_packet_callbacks_struct ssh_curve25519_server_callbacks = {\n    .start = SSH2_MSG_KEX_ECDH_INIT,\n    .n_callbacks = 1,\n    .callbacks = dh_server_callbacks,\n    .user = NULL\n};\n\n/** @internal\n * @brief sets up the curve25519-sha256@libssh.org kex callbacks\n */\nvoid ssh_server_curve25519_init(ssh_session session){\n    /* register the packet callbacks */\n    ssh_packet_set_callbacks(session, &ssh_curve25519_server_callbacks);\n}\n\n/** @brief Parse a SSH_MSG_KEXDH_INIT packet (server) and send a\n * SSH_MSG_KEXDH_REPLY\n */\nstatic SSH_PACKET_CALLBACK(ssh_packet_server_curve25519_init){\n    /* ECDH keys */\n    ssh_string q_c_string;\n    ssh_string q_s_string;\n    ssh_string server_pubkey_blob = NULL;\n\n    /* SSH host keys (rsa,dsa,ecdsa) */\n    ssh_key privkey;\n    enum ssh_digest_e digest = SSH_DIGEST_AUTO;\n    ssh_string sig_blob = NULL;\n    int rc;\n    (void)type;\n    (void)user;\n\n    ssh_packet_remove_callbacks(session, &ssh_curve25519_server_callbacks);\n\n    /* Extract the client pubkey from the init packet */\n    q_c_string = ssh_buffer_get_ssh_string(packet);\n    if (q_c_string == NULL) {\n        ssh_set_error(session,SSH_FATAL, \"No Q_C ECC point in packet\");\n        goto error;\n    }\n    if (ssh_string_len(q_c_string) != CURVE25519_PUBKEY_SIZE){\n        ssh_set_error(session,\n                      SSH_FATAL,\n                      \"Incorrect size for server Curve25519 public key: %zu\",\n                      ssh_string_len(q_c_string));\n        SSH_STRING_FREE(q_c_string);\n        goto error;\n    }\n\n    memcpy(session->next_crypto->curve25519_client_pubkey,\n           ssh_string_data(q_c_string), CURVE25519_PUBKEY_SIZE);\n    SSH_STRING_FREE(q_c_string);\n    /* Build server's keypair */\n\n    rc = ssh_curve25519_init(session);\n    if (rc != SSH_OK) {\n        ssh_set_error(session, SSH_FATAL, \"Failed to generate curve25519 keys\");\n        goto error;\n    }\n\n    rc = ssh_buffer_add_u8(session->out_buffer, SSH2_MSG_KEX_ECDH_REPLY);\n    if (rc < 0) {\n        ssh_set_error_oom(session);\n        goto error;\n    }\n\n    /* build k and session_id */\n    rc = ssh_curve25519_build_k(session);\n    if (rc < 0) {\n        ssh_set_error(session, SSH_FATAL, \"Cannot build k number\");\n        goto error;\n    }\n\n    /* privkey is not allocated */\n    rc = ssh_get_key_params(session, &privkey, &digest);\n    if (rc == SSH_ERROR) {\n        goto error;\n    }\n\n    rc = ssh_make_sessionid(session);\n    if (rc != SSH_OK) {\n        ssh_set_error(session, SSH_FATAL, \"Could not create a session id\");\n        goto error;\n    }\n\n    rc = ssh_dh_get_next_server_publickey_blob(session, &server_pubkey_blob);\n    if (rc != 0) {\n        ssh_set_error(session, SSH_FATAL, \"Could not export server public key\");\n        goto error;\n    }\n\n    /* add host's public key */\n    rc = ssh_buffer_add_ssh_string(session->out_buffer,\n                                   server_pubkey_blob);\n    SSH_STRING_FREE(server_pubkey_blob);\n    if (rc < 0) {\n        ssh_set_error_oom(session);\n        goto error;\n    }\n\n    /* add ecdh public key */\n    q_s_string = ssh_string_new(CURVE25519_PUBKEY_SIZE);\n    if (q_s_string == NULL) {\n        goto error;\n    }\n\n    ssh_string_fill(q_s_string,\n                    session->next_crypto->curve25519_server_pubkey,\n                    CURVE25519_PUBKEY_SIZE);\n\n    rc = ssh_buffer_add_ssh_string(session->out_buffer, q_s_string);\n    SSH_STRING_FREE(q_s_string);\n    if (rc < 0) {\n        ssh_set_error_oom(session);\n        goto error;\n    }\n    /* add signature blob */\n    sig_blob = ssh_srv_pki_do_sign_sessionid(session, privkey, digest);\n    if (sig_blob == NULL) {\n        ssh_set_error(session, SSH_FATAL, \"Could not sign the session id\");\n        goto error;\n    }\n\n    rc = ssh_buffer_add_ssh_string(session->out_buffer, sig_blob);\n    SSH_STRING_FREE(sig_blob);\n    if (rc < 0) {\n        ssh_set_error_oom(session);\n        goto error;\n    }\n\n    SSH_LOG(SSH_LOG_PROTOCOL, \"SSH_MSG_KEX_ECDH_REPLY sent\");\n    rc = ssh_packet_send(session);\n    if (rc == SSH_ERROR) {\n        return SSH_ERROR;\n    }\n\n    /* Send the MSG_NEWKEYS */\n    rc = ssh_buffer_add_u8(session->out_buffer, SSH2_MSG_NEWKEYS);\n    if (rc < 0) {\n        goto error;\n    }\n\n    session->dh_handshake_state = DH_STATE_NEWKEYS_SENT;\n    rc = ssh_packet_send(session);\n    if (rc == SSH_ERROR) {\n        goto error;\n    }\n    SSH_LOG(SSH_LOG_PROTOCOL, \"SSH_MSG_NEWKEYS sent\");\n\n    return SSH_PACKET_USED;\nerror:\n    ssh_buffer_reinit(session->out_buffer);\n    session->session_state=SSH_SESSION_STATE_ERROR;\n    return SSH_PACKET_USED;\n}\n\n#endif /* WITH_SERVER */\n\n#endif /* HAVE_CURVE25519 */\n"
  },
  {
    "path": "src/libssh/src/dh-gex.c",
    "content": "/*\n * dh-gex.c - diffie-hellman group exchange\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2016 by Aris Adamantiadis <aris@0xbadc0de.be>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <errno.h>\n#include <stdbool.h>\n#include <string.h>\n#include <stdio.h>\n\n#include \"libssh/priv.h\"\n#include \"libssh/dh-gex.h\"\n#include \"libssh/libssh.h\"\n#include \"libssh/ssh2.h\"\n#include \"libssh/callbacks.h\"\n#include \"libssh/dh.h\"\n#include \"libssh/buffer.h\"\n#include \"libssh/session.h\"\n\n/* Minimum, recommanded and maximum size of DH group */\n#define DH_PMIN 2048\n#define DH_PREQ 2048\n#define DH_PMAX 8192\n\nstatic SSH_PACKET_CALLBACK(ssh_packet_client_dhgex_group);\nstatic SSH_PACKET_CALLBACK(ssh_packet_client_dhgex_reply);\n\nstatic ssh_packet_callback dhgex_client_callbacks[] = {\n    ssh_packet_client_dhgex_group, /* SSH_MSG_KEX_DH_GEX_GROUP */\n    NULL,                          /* SSH_MSG_KEX_DH_GEX_INIT */\n    ssh_packet_client_dhgex_reply  /* SSH_MSG_KEX_DH_GEX_REPLY */\n};\n\nstatic struct ssh_packet_callbacks_struct ssh_dhgex_client_callbacks = {\n    .start = SSH2_MSG_KEX_DH_GEX_GROUP,\n    .n_callbacks = 3,\n    .callbacks = dhgex_client_callbacks,\n    .user = NULL\n};\n\n/** @internal\n * @brief initiates a diffie-hellman-group-exchange kex\n */\nint ssh_client_dhgex_init(ssh_session session)\n{\n    int rc;\n\n    rc = ssh_dh_init_common(session->next_crypto);\n    if (rc != SSH_OK){\n        goto error;\n    }\n\n    session->next_crypto->dh_pmin = DH_PMIN;\n    session->next_crypto->dh_pn = DH_PREQ;\n    session->next_crypto->dh_pmax = DH_PMAX;\n    /* Minimum group size, preferred group size, maximum group size */\n    rc = ssh_buffer_pack(session->out_buffer,\n                         \"bddd\",\n                         SSH2_MSG_KEX_DH_GEX_REQUEST,\n                         session->next_crypto->dh_pmin,\n                         session->next_crypto->dh_pn,\n                         session->next_crypto->dh_pmax);\n    if (rc != SSH_OK) {\n        goto error;\n    }\n\n    /* register the packet callbacks */\n    ssh_packet_set_callbacks(session, &ssh_dhgex_client_callbacks);\n    session->dh_handshake_state = DH_STATE_REQUEST_SENT;\n    rc = ssh_packet_send(session);\n    if (rc == SSH_ERROR) {\n        goto error;\n    }\n    return rc;\nerror:\n    ssh_dh_cleanup(session->next_crypto);\n    return SSH_ERROR;\n}\n\n/** @internal\n *  @brief handle a DH_GEX_GROUP packet, client side. This packet contains\n *         the group parameters.\n */\nSSH_PACKET_CALLBACK(ssh_packet_client_dhgex_group)\n{\n    int rc;\n    int blen;\n    bignum pmin1 = NULL, one = NULL;\n    bignum_CTX ctx = bignum_ctx_new();\n    bignum modulus = NULL, generator = NULL;\n    const_bignum pubkey;\n    (void) type;\n    (void) user;\n\n    SSH_LOG(SSH_LOG_PROTOCOL, \"SSH_MSG_KEX_DH_GEX_GROUP received\");\n\n    if (bignum_ctx_invalid(ctx)) {\n        goto error;\n    }\n\n    if (session->dh_handshake_state != DH_STATE_REQUEST_SENT) {\n        ssh_set_error(session,\n                      SSH_FATAL,\n                      \"Received DH_GEX_GROUP in invalid state\");\n        goto error;\n    }\n    one = bignum_new();\n    pmin1 = bignum_new();\n    if (one == NULL || pmin1 == NULL) {\n        ssh_set_error_oom(session);\n        goto error;\n    }\n    rc = ssh_buffer_unpack(packet,\n                           \"BB\",\n                           &modulus,\n                           &generator);\n    if (rc != SSH_OK) {\n        ssh_set_error(session, SSH_FATAL, \"Invalid DH_GEX_GROUP packet\");\n        goto error;\n    }\n    /* basic checks */\n    if (ssh_fips_mode() &&\n        !ssh_dh_is_known_group(modulus, generator)) {\n        ssh_set_error(session,\n                      SSH_FATAL,\n                      \"The received DH group is not FIPS approved\");\n        goto error;\n    }\n    rc = bignum_set_word(one, 1);\n    if (rc != 1) {\n        goto error;\n    }\n    blen = bignum_num_bits(modulus);\n    if (blen < DH_PMIN || blen > DH_PMAX) {\n        ssh_set_error(session,\n                SSH_FATAL,\n                \"Invalid dh group parameter p: %d not in [%d:%d]\",\n                blen,\n                DH_PMIN,\n                DH_PMAX);\n        goto error;\n    }\n    if (bignum_cmp(modulus, one) <= 0) {\n        /* p must be positive and preferably bigger than one */\n        ssh_set_error(session, SSH_FATAL, \"Invalid dh group parameter p\");\n    }\n    if (!bignum_is_bit_set(modulus, 0)) {\n        /* p must be a prime and therefore not divisible by 2 */\n        ssh_set_error(session, SSH_FATAL, \"Invalid dh group parameter p\");\n        goto error;\n    }\n    bignum_sub(pmin1, modulus, one);\n    if (bignum_cmp(generator, one) <= 0 ||\n        bignum_cmp(generator, pmin1) > 0) {\n        /* generator must be at least 2 and smaller than p-1*/\n        ssh_set_error(session, SSH_FATAL, \"Invalid dh group parameter g\");\n        goto error;\n    }\n    bignum_ctx_free(ctx);\n    ctx = NULL;\n\n    /* all checks passed, set parameters (the BNs are copied in openssl backend) */\n    rc = ssh_dh_set_parameters(session->next_crypto->dh_ctx,\n                               modulus, generator);\n    if (rc != SSH_OK) {\n        goto error;\n    }\n#ifdef HAVE_LIBCRYPTO\n    bignum_safe_free(modulus);\n    bignum_safe_free(generator);\n#endif\n    modulus = NULL;\n    generator = NULL;\n\n    /* compute and send DH public parameter */\n    rc = ssh_dh_keypair_gen_keys(session->next_crypto->dh_ctx,\n                                 DH_CLIENT_KEYPAIR);\n    if (rc == SSH_ERROR) {\n        goto error;\n    }\n\n    rc = ssh_dh_keypair_get_keys(session->next_crypto->dh_ctx,\n                                 DH_CLIENT_KEYPAIR, NULL, &pubkey);\n    if (rc != SSH_OK) {\n        goto error;\n    }\n\n    rc = ssh_buffer_pack(session->out_buffer,\n                         \"bB\",\n                         SSH2_MSG_KEX_DH_GEX_INIT,\n                         pubkey);\n    if (rc != SSH_OK) {\n        goto error;\n    }\n\n    session->dh_handshake_state = DH_STATE_INIT_SENT;\n\n    rc = ssh_packet_send(session);\n    if (rc == SSH_ERROR) {\n        goto error;\n    }\n\n    bignum_safe_free(one);\n    bignum_safe_free(pmin1);\n    return SSH_PACKET_USED;\n\nerror:\n    bignum_safe_free(modulus);\n    bignum_safe_free(generator);\n    bignum_safe_free(one);\n    bignum_safe_free(pmin1);\n    if(!bignum_ctx_invalid(ctx)) {\n        bignum_ctx_free(ctx);\n    }\n    ssh_dh_cleanup(session->next_crypto);\n    session->session_state = SSH_SESSION_STATE_ERROR;\n\n    return SSH_PACKET_USED;\n}\n\nstatic SSH_PACKET_CALLBACK(ssh_packet_client_dhgex_reply)\n{\n    struct ssh_crypto_struct *crypto=session->next_crypto;\n    int rc;\n    ssh_string pubkey_blob = NULL;\n    bignum server_pubkey = NULL;\n    (void)type;\n    (void)user;\n    SSH_LOG(SSH_LOG_PROTOCOL, \"SSH_MSG_KEX_DH_GEX_REPLY received\");\n\n    ssh_packet_remove_callbacks(session, &ssh_dhgex_client_callbacks);\n    rc = ssh_buffer_unpack(packet,\n                           \"SBS\",\n                           &pubkey_blob, &server_pubkey,\n                           &crypto->dh_server_signature);\n    if (rc == SSH_ERROR) {\n        ssh_set_error(session, SSH_FATAL, \"Invalid DH_GEX_REPLY packet\");\n        goto error;\n    }\n    rc = ssh_dh_keypair_set_keys(crypto->dh_ctx, DH_SERVER_KEYPAIR,\n                                 NULL, server_pubkey);\n    if (rc != SSH_OK) {\n        bignum_safe_free(server_pubkey);\n        goto error;\n    }\n\n    rc = ssh_dh_import_next_pubkey_blob(session, pubkey_blob);\n    SSH_STRING_FREE(pubkey_blob);\n    if (rc != 0) {\n        goto error;\n    }\n\n    rc = ssh_dh_compute_shared_secret(session->next_crypto->dh_ctx,\n                                      DH_CLIENT_KEYPAIR, DH_SERVER_KEYPAIR,\n                                      &session->next_crypto->shared_secret);\n    ssh_dh_debug_crypto(session->next_crypto);\n    if (rc == SSH_ERROR) {\n        ssh_set_error(session, SSH_FATAL, \"Could not generate shared secret\");\n        goto error;\n    }\n\n    /* Send the MSG_NEWKEYS */\n    if (ssh_buffer_add_u8(session->out_buffer, SSH2_MSG_NEWKEYS) < 0) {\n        goto error;\n    }\n\n    rc = ssh_packet_send(session);\n    if (rc == SSH_ERROR) {\n        goto error;\n    }\n    SSH_LOG(SSH_LOG_PROTOCOL, \"SSH_MSG_NEWKEYS sent\");\n    session->dh_handshake_state = DH_STATE_NEWKEYS_SENT;\n\n    return SSH_PACKET_USED;\nerror:\n    ssh_dh_cleanup(session->next_crypto);\n    session->session_state = SSH_SESSION_STATE_ERROR;\n\n    return SSH_PACKET_USED;\n}\n\n#ifdef WITH_SERVER\n\n#define MODULI_FILE \"/etc/ssh/moduli\"\n/* 2     \"Safe\" prime; (p-1)/2 is also prime. */\n#define SAFE_PRIME 2\n/* 0x04  Probabilistic Miller-Rabin primality tests. */\n#define PRIM_TEST_REQUIRED 0x04\n\n/**\n * @internal\n *\n * @brief Determines if the proposed modulus size is more appropriate than the\n * current one.\n *\n * @returns 1 if it's more appropriate. Returns 0 if same or less appropriate\n */\nstatic bool dhgroup_better_size(uint32_t pmin,\n                                uint32_t pn,\n                                uint32_t pmax,\n                                size_t current_size,\n                                size_t proposed_size)\n{\n    if (current_size == proposed_size) {\n        return false;\n    }\n\n    if (current_size == pn) {\n        /* can't do better */\n        return false;\n    }\n\n    if (current_size == 0 && proposed_size >= pmin && proposed_size <= pmax) {\n        return true;\n    }\n\n    if (proposed_size < pmin || proposed_size > pmax) {\n        /* out of bounds */\n        return false;\n    }\n\n    if (current_size == 0) {\n        /* not in the allowed window */\n        return false;\n    }\n\n    if (proposed_size >= pn && proposed_size < current_size) {\n        return true;\n    }\n\n    if (proposed_size <= pn && proposed_size > current_size) {\n        return true;\n    }\n\n    if (proposed_size >= pn && current_size < pn) {\n        return true;\n    }\n\n    /* We're in the allowed window but a better match already exists. */\n    return false;\n}\n\n/** @internal\n * @brief returns 1 with 1/n probability\n * @returns 1 on with P(1/n), 0 with P(n-1/n).\n */\nstatic bool invn_chance(int n)\n{\n    uint32_t nounce = 0;\n    int ok;\n\n    ok = ssh_get_random(&nounce, sizeof(nounce), 0);\n    if (!ok) {\n        return false;\n    }\n    return (nounce % n) == 0;\n}\n\n/** @internal\n * @brief retrieves a DH group from an open moduli file.\n */\nstatic int ssh_retrieve_dhgroup_file(FILE *moduli,\n                                     uint32_t pmin,\n                                     uint32_t pn,\n                                     uint32_t pmax,\n                                     size_t *best_size,\n                                     char **best_generator,\n                                     char **best_modulus)\n{\n    char timestamp[32] = {0};\n    char generator[32] = {0};\n    char modulus[4096] = {0};\n    size_t type, tests, tries, size, proposed_size;\n    int firstbyte;\n    int rc;\n    size_t line = 0;\n    size_t best_nlines = 0;\n\n    for(;;) {\n        line++;\n        firstbyte = getc(moduli);\n        if (firstbyte == '#'){\n            do {\n                firstbyte = getc(moduli);\n            } while(firstbyte != '\\n' && firstbyte != EOF);\n            continue;\n        }\n        if (firstbyte == EOF) {\n            break;\n        }\n        ungetc(firstbyte, moduli);\n        rc = fscanf(moduli,\n                    \"%31s %zu %zu %zu %zu %31s %4095s\\n\",\n                    timestamp,\n                    &type,\n                    &tests,\n                    &tries,\n                    &size,\n                    generator,\n                    modulus);\n        if (rc != 7){\n            if (rc == EOF) {\n                break;\n            }\n            SSH_LOG(SSH_LOG_INFO, \"Invalid moduli entry line %zu\", line);\n            do {\n                firstbyte = getc(moduli);\n            } while(firstbyte != '\\n' && firstbyte != EOF);\n            continue;\n        }\n\n        /* we only want safe primes that were tested */\n        if (type != SAFE_PRIME || !(tests & PRIM_TEST_REQUIRED)) {\n            continue;\n        }\n\n        proposed_size = size + 1;\n        if (proposed_size != *best_size &&\n            dhgroup_better_size(pmin, pn, pmax, *best_size, proposed_size)) {\n            best_nlines = 0;\n            *best_size = proposed_size;\n        }\n        if (proposed_size == *best_size) {\n            best_nlines++;\n        }\n\n        /* Use reservoir sampling algorithm */\n        if (proposed_size == *best_size && invn_chance(best_nlines)) {\n            SAFE_FREE(*best_generator);\n            SAFE_FREE(*best_modulus);\n            *best_generator = strdup(generator);\n            if (*best_generator == NULL) {\n                return SSH_ERROR;\n            }\n            *best_modulus = strdup(modulus);\n            if (*best_modulus == NULL) {\n                SAFE_FREE(*best_generator);\n                return SSH_ERROR;\n            }\n        }\n    }\n    if (*best_size != 0) {\n        SSH_LOG(SSH_LOG_INFO,\n                \"Selected %zu bits modulus out of %zu candidates in %zu lines\",\n                *best_size,\n                best_nlines - 1,\n                line);\n    } else {\n        SSH_LOG(SSH_LOG_WARNING,\n                \"No moduli found for [%u:%u:%u]\",\n                pmin,\n                pn,\n                pmax);\n    }\n\n    return SSH_OK;\n}\n\n/** @internal\n * @brief retrieves a DH group from the moduli file based on bits len parameters\n * @param[in] pmin minimum group size in bits\n * @param[in] pn preferred group size\n * @param[in] pmax maximum group size\n * @param[out] size size of the chosen modulus\n * @param[out] p modulus\n * @param[out] g generator\n * @return SSH_OK on success, SSH_ERROR otherwise.\n */\nstatic int ssh_retrieve_dhgroup(uint32_t pmin,\n                                uint32_t pn,\n                                uint32_t pmax,\n                                size_t *size,\n                                bignum *p,\n                                bignum *g)\n{\n    FILE *moduli = NULL;\n    char *generator = NULL;\n    char *modulus = NULL;\n    int rc;\n\n    /* In FIPS mode, we can not negotiate arbitrary primes,\n     * but just the approved ones */\n    if (ssh_fips_mode()) {\n        SSH_LOG(SSH_LOG_TRACE, \"In FIPS mode, using built-in primes\");\n        return ssh_fallback_group(pmax, p, g);\n    }\n\n    moduli = fopen(MODULI_FILE, \"r\");\n    if (moduli == NULL) {\n        SSH_LOG(SSH_LOG_WARNING,\n                \"Unable to open moduli file: %s\",\n                strerror(errno));\n        return ssh_fallback_group(pmax, p, g);\n    }\n\n    *size = 0;\n    *p = NULL;\n    *g = NULL;\n\n    rc = ssh_retrieve_dhgroup_file(moduli,\n                                   pmin,\n                                   pn,\n                                   pmax,\n                                   size,\n                                   &generator,\n                                   &modulus);\n    fclose(moduli);\n    if (rc == SSH_ERROR || *size == 0) {\n        goto error;\n    }\n    rc = bignum_hex2bn(generator, g);\n    if (rc == 0) {\n        goto error;\n    }\n    rc = bignum_hex2bn(modulus, p);\n    if (rc == 0) {\n        goto error;\n    }\n    SAFE_FREE(generator);\n    SAFE_FREE(modulus);\n\n    return SSH_OK;\n\nerror:\n    bignum_safe_free(*g);\n    bignum_safe_free(*p);\n    SAFE_FREE(generator);\n    SAFE_FREE(modulus);\n\n    return SSH_ERROR;\n}\n\nstatic SSH_PACKET_CALLBACK(ssh_packet_server_dhgex_request);\nstatic SSH_PACKET_CALLBACK(ssh_packet_server_dhgex_init);\n\nstatic ssh_packet_callback dhgex_server_callbacks[]= {\n    NULL, /* SSH_MSG_KEX_DH_GEX_REQUEST_OLD */\n    NULL, /* SSH_MSG_KEX_DH_GEX_GROUP */\n    ssh_packet_server_dhgex_init,   /* SSH_MSG_KEX_DH_GEX_INIT */\n    NULL,                           /* SSH_MSG_KEX_DH_GEX_REPLY */\n    ssh_packet_server_dhgex_request /* SSH_MSG_GEX_DH_GEX_REQUEST */\n\n};\n\nstatic struct ssh_packet_callbacks_struct ssh_dhgex_server_callbacks = {\n    .start = SSH2_MSG_KEX_DH_GEX_REQUEST_OLD,\n    .n_callbacks = 5,\n    .callbacks = dhgex_server_callbacks,\n    .user = NULL\n};\n\n/** @internal\n * @brief sets up the diffie-hellman-groupx kex callbacks\n */\nvoid ssh_server_dhgex_init(ssh_session session){\n    /* register the packet callbacks */\n    ssh_packet_set_callbacks(session, &ssh_dhgex_server_callbacks);\n    ssh_dh_init_common(session->next_crypto);\n    session->dh_handshake_state = DH_STATE_INIT;\n}\n\nstatic SSH_PACKET_CALLBACK(ssh_packet_server_dhgex_request)\n{\n    bignum modulus = NULL, generator = NULL;\n    uint32_t pmin, pn, pmax;\n    size_t size = 0;\n    int rc;\n\n    (void) type;\n    (void) user;\n\n    if (session->dh_handshake_state != DH_STATE_INIT) {\n        ssh_set_error(session,\n                      SSH_FATAL,\n                      \"Received DH_GEX_REQUEST in invalid state\");\n        goto error;\n    }\n\n    /* Minimum group size, preferred group size, maximum group size */\n    rc = ssh_buffer_unpack(packet, \"ddd\", &pmin, &pn, &pmax);\n    if (rc != SSH_OK){\n        ssh_set_error_invalid(session);\n        goto error;\n    }\n    SSH_LOG(SSH_LOG_INFO, \"dh-gex: DHGEX_REQUEST[%u:%u:%u]\", pmin, pn, pmax);\n\n    if (pmin > pn || pn > pmax || pn > DH_PMAX || pmax < DH_PMIN) {\n        ssh_set_error(session,\n                      SSH_FATAL,\n                      \"Invalid dh-gex arguments [%u:%u:%u]\",\n                      pmin,\n                      pn,\n                      pmax);\n        goto error;\n    }\n    session->next_crypto->dh_pmin = pmin;\n    session->next_crypto->dh_pn = pn;\n    session->next_crypto->dh_pmax = pmax;\n\n    /* ensure safe parameters */\n    if (pmin < DH_PMIN) {\n        pmin = DH_PMIN;\n        if (pn < pmin) {\n            pn = pmin;\n        }\n    }\n    rc = ssh_retrieve_dhgroup(pmin,\n                              pn,\n                              pmax,\n                              &size,\n                              &modulus,\n                              &generator);\n    if (rc == SSH_ERROR) {\n        ssh_set_error(session,\n                      SSH_FATAL,\n                      \"Couldn't find DH group for [%u:%u:%u]\",\n                      pmin,\n                      pn,\n                      pmax);\n        goto error;\n    }\n    rc = ssh_dh_set_parameters(session->next_crypto->dh_ctx,\n                               modulus, generator);\n    if (rc != SSH_OK) {\n        bignum_safe_free(generator);\n        bignum_safe_free(modulus);\n        goto error;\n    }\n    rc = ssh_buffer_pack(session->out_buffer,\n                         \"bBB\",\n                         SSH2_MSG_KEX_DH_GEX_GROUP,\n                         modulus,\n                         generator);\n\n#ifdef HAVE_LIBCRYPTO\n    bignum_safe_free(generator);\n    bignum_safe_free(modulus);\n#endif\n\n    if (rc != SSH_OK) {\n        ssh_set_error_invalid(session);\n        goto error;\n    }\n\n    session->dh_handshake_state = DH_STATE_GROUP_SENT;\n\n    rc = ssh_packet_send(session);\n    if (rc == SSH_ERROR) {\n        goto error;\n    }\n\nerror:\n    return SSH_PACKET_USED;\n}\n\n/** @internal\n * @brief parse an incoming SSH_MSG_KEX_DH_GEX_INIT packet and complete\n *        Diffie-Hellman key exchange\n **/\nstatic SSH_PACKET_CALLBACK(ssh_packet_server_dhgex_init){\n    (void) type;\n    (void) user;\n    SSH_LOG(SSH_LOG_DEBUG, \"Received SSH_MSG_KEX_DHGEX_INIT\");\n    ssh_packet_remove_callbacks(session, &ssh_dhgex_server_callbacks);\n    ssh_server_dh_process_init(session, packet);\n    return SSH_PACKET_USED;\n}\n\n#endif /* WITH_SERVER */\n"
  },
  {
    "path": "src/libssh/src/dh.c",
    "content": "/*\n * dh.c - Diffie-Helman algorithm code against SSH 2\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2003-2018 by Aris Adamantiadis\n * Copyright (c) 2009-2013 by Andreas Schneider <asn@cryptomilk.org>\n * Copyright (c) 2012      by Dmitriy Kuznetsov <dk@yandex.ru>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include \"libssh/priv.h\"\n#include \"libssh/crypto.h\"\n#include \"libssh/buffer.h\"\n#include \"libssh/session.h\"\n#include \"libssh/misc.h\"\n#include \"libssh/dh.h\"\n#include \"libssh/ssh2.h\"\n#include \"libssh/pki.h\"\n#include \"libssh/bignum.h\"\n\nstatic unsigned char p_group1_value[] = {\n        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x0F, 0xDA, 0xA2,\n        0x21, 0x68, 0xC2, 0x34, 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,\n        0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, 0x02, 0x0B, 0xBE, 0xA6,\n        0x3B, 0x13, 0x9B, 0x22, 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,\n        0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, 0x30, 0x2B, 0x0A, 0x6D,\n        0xF2, 0x5F, 0x14, 0x37, 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,\n        0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, 0xF4, 0x4C, 0x42, 0xE9,\n        0xA6, 0x37, 0xED, 0x6B, 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,\n        0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, 0xAE, 0x9F, 0x24, 0x11,\n        0x7C, 0x4B, 0x1F, 0xE6, 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE6, 0x53, 0x81,\n        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};\n#define P_GROUP1_LEN 128\t/* Size in bytes of the p number */\n\nstatic unsigned char p_group14_value[] = {\n        0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x0F, 0xDA, 0xA2,\n        0x21, 0x68, 0xC2, 0x34, 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,\n        0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, 0x02, 0x0B, 0xBE, 0xA6,\n        0x3B, 0x13, 0x9B, 0x22, 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,\n        0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, 0x30, 0x2B, 0x0A, 0x6D,\n        0xF2, 0x5F, 0x14, 0x37, 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,\n        0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, 0xF4, 0x4C, 0x42, 0xE9,\n        0xA6, 0x37, 0xED, 0x6B, 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,\n        0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, 0xAE, 0x9F, 0x24, 0x11,\n        0x7C, 0x4B, 0x1F, 0xE6, 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,\n        0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, 0x98, 0xDA, 0x48, 0x36,\n        0x1C, 0x55, 0xD3, 0x9A, 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,\n        0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, 0x1C, 0x62, 0xF3, 0x56,\n        0x20, 0x85, 0x52, 0xBB, 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,\n        0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, 0xF1, 0x74, 0x6C, 0x08,\n        0xCA, 0x18, 0x21, 0x7C, 0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B,\n        0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03, 0x9B, 0x27, 0x83, 0xA2,\n        0xEC, 0x07, 0xA2, 0x8F, 0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9,\n        0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18, 0x39, 0x95, 0x49, 0x7C,\n        0xEA, 0x95, 0x6A, 0xE5, 0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10,\n        0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAC, 0xAA, 0x68, 0xFF, 0xFF, 0xFF, 0xFF,\n        0xFF, 0xFF, 0xFF, 0xFF};\n\n#define P_GROUP14_LEN 256 /* Size in bytes of the p number for group 14 */\n\nstatic unsigned char p_group16_value[] = {\n    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x0F, 0xDA, 0xA2,\n    0x21, 0x68, 0xC2, 0x34, 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,\n    0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, 0x02, 0x0B, 0xBE, 0xA6,\n    0x3B, 0x13, 0x9B, 0x22, 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,\n    0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, 0x30, 0x2B, 0x0A, 0x6D,\n    0xF2, 0x5F, 0x14, 0x37, 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,\n    0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, 0xF4, 0x4C, 0x42, 0xE9,\n    0xA6, 0x37, 0xED, 0x6B, 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,\n    0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, 0xAE, 0x9F, 0x24, 0x11,\n    0x7C, 0x4B, 0x1F, 0xE6, 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,\n    0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, 0x98, 0xDA, 0x48, 0x36,\n    0x1C, 0x55, 0xD3, 0x9A, 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,\n    0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, 0x1C, 0x62, 0xF3, 0x56,\n    0x20, 0x85, 0x52, 0xBB, 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,\n    0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, 0xF1, 0x74, 0x6C, 0x08,\n    0xCA, 0x18, 0x21, 0x7C, 0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B,\n    0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03, 0x9B, 0x27, 0x83, 0xA2,\n    0xEC, 0x07, 0xA2, 0x8F, 0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9,\n    0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18, 0x39, 0x95, 0x49, 0x7C,\n    0xEA, 0x95, 0x6A, 0xE5, 0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10,\n    0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D, 0xAD, 0x33, 0x17, 0x0D,\n    0x04, 0x50, 0x7A, 0x33, 0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64,\n    0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A, 0x8A, 0xEA, 0x71, 0x57,\n    0x5D, 0x06, 0x0C, 0x7D, 0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7,\n    0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7, 0x1E, 0x8C, 0x94, 0xE0,\n    0x4A, 0x25, 0x61, 0x9D, 0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B,\n    0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64, 0xD8, 0x76, 0x02, 0x73,\n    0x3E, 0xC8, 0x6A, 0x64, 0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C,\n    0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C, 0x77, 0x09, 0x88, 0xC0,\n    0xBA, 0xD9, 0x46, 0xE2, 0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31,\n    0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E, 0x4B, 0x82, 0xD1, 0x20,\n    0xA9, 0x21, 0x08, 0x01, 0x1A, 0x72, 0x3C, 0x12, 0xA7, 0x87, 0xE6, 0xD7,\n    0x88, 0x71, 0x9A, 0x10, 0xBD, 0xBA, 0x5B, 0x26, 0x99, 0xC3, 0x27, 0x18,\n    0x6A, 0xF4, 0xE2, 0x3C, 0x1A, 0x94, 0x68, 0x34, 0xB6, 0x15, 0x0B, 0xDA,\n    0x25, 0x83, 0xE9, 0xCA, 0x2A, 0xD4, 0x4C, 0xE8, 0xDB, 0xBB, 0xC2, 0xDB,\n    0x04, 0xDE, 0x8E, 0xF9, 0x2E, 0x8E, 0xFC, 0x14, 0x1F, 0xBE, 0xCA, 0xA6,\n    0x28, 0x7C, 0x59, 0x47, 0x4E, 0x6B, 0xC0, 0x5D, 0x99, 0xB2, 0x96, 0x4F,\n    0xA0, 0x90, 0xC3, 0xA2, 0x23, 0x3B, 0xA1, 0x86, 0x51, 0x5B, 0xE7, 0xED,\n    0x1F, 0x61, 0x29, 0x70, 0xCE, 0xE2, 0xD7, 0xAF, 0xB8, 0x1B, 0xDD, 0x76,\n    0x21, 0x70, 0x48, 0x1C, 0xD0, 0x06, 0x91, 0x27, 0xD5, 0xB0, 0x5A, 0xA9,\n    0x93, 0xB4, 0xEA, 0x98, 0x8D, 0x8F, 0xDD, 0xC1, 0x86, 0xFF, 0xB7, 0xDC,\n    0x90, 0xA6, 0xC0, 0x8F, 0x4D, 0xF4, 0x35, 0xC9, 0x34, 0x06, 0x31, 0x99,\n    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};\n\n#define P_GROUP16_LEN 512 /* Size in bytes of the p number for group 16 */\n\nstatic unsigned char p_group18_value[] = {\n    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x0F, 0xDA, 0xA2,\n    0x21, 0x68, 0xC2, 0x34, 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1,\n    0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, 0x02, 0x0B, 0xBE, 0xA6,\n    0x3B, 0x13, 0x9B, 0x22, 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD,\n    0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, 0x30, 0x2B, 0x0A, 0x6D,\n    0xF2, 0x5F, 0x14, 0x37, 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45,\n    0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, 0xF4, 0x4C, 0x42, 0xE9,\n    0xA6, 0x37, 0xED, 0x6B, 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED,\n    0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, 0xAE, 0x9F, 0x24, 0x11,\n    0x7C, 0x4B, 0x1F, 0xE6, 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D,\n    0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, 0x98, 0xDA, 0x48, 0x36,\n    0x1C, 0x55, 0xD3, 0x9A, 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F,\n    0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, 0x1C, 0x62, 0xF3, 0x56,\n    0x20, 0x85, 0x52, 0xBB, 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D,\n    0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, 0xF1, 0x74, 0x6C, 0x08,\n    0xCA, 0x18, 0x21, 0x7C, 0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B,\n    0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03, 0x9B, 0x27, 0x83, 0xA2,\n    0xEC, 0x07, 0xA2, 0x8F, 0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9,\n    0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18, 0x39, 0x95, 0x49, 0x7C,\n    0xEA, 0x95, 0x6A, 0xE5, 0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10,\n    0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAA, 0xC4, 0x2D, 0xAD, 0x33, 0x17, 0x0D,\n    0x04, 0x50, 0x7A, 0x33, 0xA8, 0x55, 0x21, 0xAB, 0xDF, 0x1C, 0xBA, 0x64,\n    0xEC, 0xFB, 0x85, 0x04, 0x58, 0xDB, 0xEF, 0x0A, 0x8A, 0xEA, 0x71, 0x57,\n    0x5D, 0x06, 0x0C, 0x7D, 0xB3, 0x97, 0x0F, 0x85, 0xA6, 0xE1, 0xE4, 0xC7,\n    0xAB, 0xF5, 0xAE, 0x8C, 0xDB, 0x09, 0x33, 0xD7, 0x1E, 0x8C, 0x94, 0xE0,\n    0x4A, 0x25, 0x61, 0x9D, 0xCE, 0xE3, 0xD2, 0x26, 0x1A, 0xD2, 0xEE, 0x6B,\n    0xF1, 0x2F, 0xFA, 0x06, 0xD9, 0x8A, 0x08, 0x64, 0xD8, 0x76, 0x02, 0x73,\n    0x3E, 0xC8, 0x6A, 0x64, 0x52, 0x1F, 0x2B, 0x18, 0x17, 0x7B, 0x20, 0x0C,\n    0xBB, 0xE1, 0x17, 0x57, 0x7A, 0x61, 0x5D, 0x6C, 0x77, 0x09, 0x88, 0xC0,\n    0xBA, 0xD9, 0x46, 0xE2, 0x08, 0xE2, 0x4F, 0xA0, 0x74, 0xE5, 0xAB, 0x31,\n    0x43, 0xDB, 0x5B, 0xFC, 0xE0, 0xFD, 0x10, 0x8E, 0x4B, 0x82, 0xD1, 0x20,\n    0xA9, 0x21, 0x08, 0x01, 0x1A, 0x72, 0x3C, 0x12, 0xA7, 0x87, 0xE6, 0xD7,\n    0x88, 0x71, 0x9A, 0x10, 0xBD, 0xBA, 0x5B, 0x26, 0x99, 0xC3, 0x27, 0x18,\n    0x6A, 0xF4, 0xE2, 0x3C, 0x1A, 0x94, 0x68, 0x34, 0xB6, 0x15, 0x0B, 0xDA,\n    0x25, 0x83, 0xE9, 0xCA, 0x2A, 0xD4, 0x4C, 0xE8, 0xDB, 0xBB, 0xC2, 0xDB,\n    0x04, 0xDE, 0x8E, 0xF9, 0x2E, 0x8E, 0xFC, 0x14, 0x1F, 0xBE, 0xCA, 0xA6,\n    0x28, 0x7C, 0x59, 0x47, 0x4E, 0x6B, 0xC0, 0x5D, 0x99, 0xB2, 0x96, 0x4F,\n    0xA0, 0x90, 0xC3, 0xA2, 0x23, 0x3B, 0xA1, 0x86, 0x51, 0x5B, 0xE7, 0xED,\n    0x1F, 0x61, 0x29, 0x70, 0xCE, 0xE2, 0xD7, 0xAF, 0xB8, 0x1B, 0xDD, 0x76,\n    0x21, 0x70, 0x48, 0x1C, 0xD0, 0x06, 0x91, 0x27, 0xD5, 0xB0, 0x5A, 0xA9,\n    0x93, 0xB4, 0xEA, 0x98, 0x8D, 0x8F, 0xDD, 0xC1, 0x86, 0xFF, 0xB7, 0xDC,\n    0x90, 0xA6, 0xC0, 0x8F, 0x4D, 0xF4, 0x35, 0xC9, 0x34, 0x02, 0x84, 0x92,\n    0x36, 0xC3, 0xFA, 0xB4, 0xD2, 0x7C, 0x70, 0x26, 0xC1, 0xD4, 0xDC, 0xB2,\n    0x60, 0x26, 0x46, 0xDE, 0xC9, 0x75, 0x1E, 0x76, 0x3D, 0xBA, 0x37, 0xBD,\n    0xF8, 0xFF, 0x94, 0x06, 0xAD, 0x9E, 0x53, 0x0E, 0xE5, 0xDB, 0x38, 0x2F,\n    0x41, 0x30, 0x01, 0xAE, 0xB0, 0x6A, 0x53, 0xED, 0x90, 0x27, 0xD8, 0x31,\n    0x17, 0x97, 0x27, 0xB0, 0x86, 0x5A, 0x89, 0x18, 0xDA, 0x3E, 0xDB, 0xEB,\n    0xCF, 0x9B, 0x14, 0xED, 0x44, 0xCE, 0x6C, 0xBA, 0xCE, 0xD4, 0xBB, 0x1B,\n    0xDB, 0x7F, 0x14, 0x47, 0xE6, 0xCC, 0x25, 0x4B, 0x33, 0x20, 0x51, 0x51,\n    0x2B, 0xD7, 0xAF, 0x42, 0x6F, 0xB8, 0xF4, 0x01, 0x37, 0x8C, 0xD2, 0xBF,\n    0x59, 0x83, 0xCA, 0x01, 0xC6, 0x4B, 0x92, 0xEC, 0xF0, 0x32, 0xEA, 0x15,\n    0xD1, 0x72, 0x1D, 0x03, 0xF4, 0x82, 0xD7, 0xCE, 0x6E, 0x74, 0xFE, 0xF6,\n    0xD5, 0x5E, 0x70, 0x2F, 0x46, 0x98, 0x0C, 0x82, 0xB5, 0xA8, 0x40, 0x31,\n    0x90, 0x0B, 0x1C, 0x9E, 0x59, 0xE7, 0xC9, 0x7F, 0xBE, 0xC7, 0xE8, 0xF3,\n    0x23, 0xA9, 0x7A, 0x7E, 0x36, 0xCC, 0x88, 0xBE, 0x0F, 0x1D, 0x45, 0xB7,\n    0xFF, 0x58, 0x5A, 0xC5, 0x4B, 0xD4, 0x07, 0xB2, 0x2B, 0x41, 0x54, 0xAA,\n    0xCC, 0x8F, 0x6D, 0x7E, 0xBF, 0x48, 0xE1, 0xD8, 0x14, 0xCC, 0x5E, 0xD2,\n    0x0F, 0x80, 0x37, 0xE0, 0xA7, 0x97, 0x15, 0xEE, 0xF2, 0x9B, 0xE3, 0x28,\n    0x06, 0xA1, 0xD5, 0x8B, 0xB7, 0xC5, 0xDA, 0x76, 0xF5, 0x50, 0xAA, 0x3D,\n    0x8A, 0x1F, 0xBF, 0xF0, 0xEB, 0x19, 0xCC, 0xB1, 0xA3, 0x13, 0xD5, 0x5C,\n    0xDA, 0x56, 0xC9, 0xEC, 0x2E, 0xF2, 0x96, 0x32, 0x38, 0x7F, 0xE8, 0xD7,\n    0x6E, 0x3C, 0x04, 0x68, 0x04, 0x3E, 0x8F, 0x66, 0x3F, 0x48, 0x60, 0xEE,\n    0x12, 0xBF, 0x2D, 0x5B, 0x0B, 0x74, 0x74, 0xD6, 0xE6, 0x94, 0xF9, 0x1E,\n    0x6D, 0xBE, 0x11, 0x59, 0x74, 0xA3, 0x92, 0x6F, 0x12, 0xFE, 0xE5, 0xE4,\n    0x38, 0x77, 0x7C, 0xB6, 0xA9, 0x32, 0xDF, 0x8C, 0xD8, 0xBE, 0xC4, 0xD0,\n    0x73, 0xB9, 0x31, 0xBA, 0x3B, 0xC8, 0x32, 0xB6, 0x8D, 0x9D, 0xD3, 0x00,\n    0x74, 0x1F, 0xA7, 0xBF, 0x8A, 0xFC, 0x47, 0xED, 0x25, 0x76, 0xF6, 0x93,\n    0x6B, 0xA4, 0x24, 0x66, 0x3A, 0xAB, 0x63, 0x9C, 0x5A, 0xE4, 0xF5, 0x68,\n    0x34, 0x23, 0xB4, 0x74, 0x2B, 0xF1, 0xC9, 0x78, 0x23, 0x8F, 0x16, 0xCB,\n    0xE3, 0x9D, 0x65, 0x2D, 0xE3, 0xFD, 0xB8, 0xBE, 0xFC, 0x84, 0x8A, 0xD9,\n    0x22, 0x22, 0x2E, 0x04, 0xA4, 0x03, 0x7C, 0x07, 0x13, 0xEB, 0x57, 0xA8,\n    0x1A, 0x23, 0xF0, 0xC7, 0x34, 0x73, 0xFC, 0x64, 0x6C, 0xEA, 0x30, 0x6B,\n    0x4B, 0xCB, 0xC8, 0x86, 0x2F, 0x83, 0x85, 0xDD, 0xFA, 0x9D, 0x4B, 0x7F,\n    0xA2, 0xC0, 0x87, 0xE8, 0x79, 0x68, 0x33, 0x03, 0xED, 0x5B, 0xDD, 0x3A,\n    0x06, 0x2B, 0x3C, 0xF5, 0xB3, 0xA2, 0x78, 0xA6, 0x6D, 0x2A, 0x13, 0xF8,\n    0x3F, 0x44, 0xF8, 0x2D, 0xDF, 0x31, 0x0E, 0xE0, 0x74, 0xAB, 0x6A, 0x36,\n    0x45, 0x97, 0xE8, 0x99, 0xA0, 0x25, 0x5D, 0xC1, 0x64, 0xF3, 0x1C, 0xC5,\n    0x08, 0x46, 0x85, 0x1D, 0xF9, 0xAB, 0x48, 0x19, 0x5D, 0xED, 0x7E, 0xA1,\n    0xB1, 0xD5, 0x10, 0xBD, 0x7E, 0xE7, 0x4D, 0x73, 0xFA, 0xF3, 0x6B, 0xC3,\n    0x1E, 0xCF, 0xA2, 0x68, 0x35, 0x90, 0x46, 0xF4, 0xEB, 0x87, 0x9F, 0x92,\n    0x40, 0x09, 0x43, 0x8B, 0x48, 0x1C, 0x6C, 0xD7, 0x88, 0x9A, 0x00, 0x2E,\n    0xD5, 0xEE, 0x38, 0x2B, 0xC9, 0x19, 0x0D, 0xA6, 0xFC, 0x02, 0x6E, 0x47,\n    0x95, 0x58, 0xE4, 0x47, 0x56, 0x77, 0xE9, 0xAA, 0x9E, 0x30, 0x50, 0xE2,\n    0x76, 0x56, 0x94, 0xDF, 0xC8, 0x1F, 0x56, 0xE8, 0x80, 0xB9, 0x6E, 0x71,\n    0x60, 0xC9, 0x80, 0xDD, 0x98, 0xED, 0xD3, 0xDF, 0xFF, 0xFF, 0xFF, 0xFF,\n    0xFF, 0xFF, 0xFF, 0xFF};\n\n#define P_GROUP18_LEN 1024 /* Size in bytes of the p number for group 18 */\n\nbignum ssh_dh_generator;\nbignum ssh_dh_group1;\nbignum ssh_dh_group14;\nbignum ssh_dh_group16;\nbignum ssh_dh_group18;\nstatic int dh_crypto_initialized;\n\n/**\n * @internal\n * @brief Initialize global constants used in DH key agreement\n * @return SSH_OK on success, SSH_ERROR otherwise.\n */\nint ssh_dh_init(void)\n{\n    unsigned long g_int = 2 ;\t/* G is defined as 2 by the ssh2 standards */\n    int rc;\n    if (dh_crypto_initialized) {\n        return SSH_OK;\n    }\n    dh_crypto_initialized = 1;\n\n    ssh_dh_generator = bignum_new();\n    if (ssh_dh_generator == NULL) {\n        goto error;\n    }\n    rc = bignum_set_word(ssh_dh_generator, g_int);\n    if (rc != 1) {\n        goto error;\n    }\n\n    bignum_bin2bn(p_group1_value, P_GROUP1_LEN, &ssh_dh_group1);\n    if (ssh_dh_group1 == NULL) {\n        goto error;\n    }\n    bignum_bin2bn(p_group14_value, P_GROUP14_LEN, &ssh_dh_group14);\n    if (ssh_dh_group14 == NULL) {\n        goto error;\n    }\n    bignum_bin2bn(p_group16_value, P_GROUP16_LEN, &ssh_dh_group16);\n    if (ssh_dh_group16 == NULL) {\n        goto error;\n    }\n    bignum_bin2bn(p_group18_value, P_GROUP18_LEN, &ssh_dh_group18);\n    if (ssh_dh_group18 == NULL) {\n        goto error;\n    }\n\n    return 0;\nerror:\n    ssh_dh_finalize();\n    return SSH_ERROR;\n}\n\n/**\n * @internal\n * @brief Finalize and free global constants used in DH key agreement\n */\nvoid ssh_dh_finalize(void)\n{\n    if (!dh_crypto_initialized) {\n        return;\n    }\n\n    bignum_safe_free(ssh_dh_generator);\n    bignum_safe_free(ssh_dh_group1);\n    bignum_safe_free(ssh_dh_group14);\n    bignum_safe_free(ssh_dh_group16);\n    bignum_safe_free(ssh_dh_group18);\n\n    dh_crypto_initialized = 0;\n}\n\nint ssh_dh_import_next_pubkey_blob(ssh_session session, ssh_string pubkey_blob)\n{\n    return ssh_pki_import_pubkey_blob(pubkey_blob,\n                                      &session->next_crypto->server_pubkey);\n\n}\n\nstatic SSH_PACKET_CALLBACK(ssh_packet_client_dh_reply);\n\nstatic ssh_packet_callback dh_client_callbacks[]= {\n    ssh_packet_client_dh_reply\n};\n\nstatic struct ssh_packet_callbacks_struct ssh_dh_client_callbacks = {\n    .start = SSH2_MSG_KEXDH_REPLY,\n    .n_callbacks = 1,\n    .callbacks = dh_client_callbacks,\n    .user = NULL\n};\n\n/** @internal\n * @brief Starts diffie-hellman-group1 key exchange\n */\nint ssh_client_dh_init(ssh_session session){\n  struct ssh_crypto_struct *crypto = session->next_crypto;\n  const_bignum pubkey;\n  int rc;\n\n  rc = ssh_dh_init_common(crypto);\n  if (rc == SSH_ERROR) {\n    goto error;\n  }\n\n  rc = ssh_dh_keypair_gen_keys(crypto->dh_ctx, DH_CLIENT_KEYPAIR);\n  if (rc == SSH_ERROR){\n      goto error;\n  }\n  rc = ssh_dh_keypair_get_keys(crypto->dh_ctx, DH_CLIENT_KEYPAIR,\n                               NULL, &pubkey);\n  if (rc != SSH_OK) {\n    goto error;\n  }\n  rc = ssh_buffer_pack(session->out_buffer, \"bB\", SSH2_MSG_KEXDH_INIT, pubkey);\n  if (rc != SSH_OK) {\n    goto error;\n  }\n\n  /* register the packet callbacks */\n  ssh_packet_set_callbacks(session, &ssh_dh_client_callbacks);\n  session->dh_handshake_state = DH_STATE_INIT_SENT;\n\n  rc = ssh_packet_send(session);\n  return rc;\nerror:\n  ssh_dh_cleanup(crypto);\n  return SSH_ERROR;\n}\n\nSSH_PACKET_CALLBACK(ssh_packet_client_dh_reply){\n  struct ssh_crypto_struct *crypto=session->next_crypto;\n  ssh_string pubkey_blob = NULL;\n  bignum server_pubkey;\n  int rc;\n\n  (void)type;\n  (void)user;\n\n  ssh_packet_remove_callbacks(session, &ssh_dh_client_callbacks);\n\n  rc = ssh_buffer_unpack(packet, \"SBS\", &pubkey_blob, &server_pubkey,\n          &crypto->dh_server_signature);\n  if (rc == SSH_ERROR) {\n      goto error;\n  }\n  rc = ssh_dh_keypair_set_keys(crypto->dh_ctx, DH_SERVER_KEYPAIR,\n                               NULL, server_pubkey);\n  if (rc != SSH_OK) {\n      bignum_safe_free(server_pubkey);\n      goto error;\n  }\n  rc = ssh_dh_import_next_pubkey_blob(session, pubkey_blob);\n  SSH_STRING_FREE(pubkey_blob);\n  if (rc != 0) {\n      goto error;\n  }\n  \n  rc = ssh_dh_compute_shared_secret(session->next_crypto->dh_ctx,\n                                    DH_CLIENT_KEYPAIR, DH_SERVER_KEYPAIR,\n                                    &session->next_crypto->shared_secret);\n  ssh_dh_debug_crypto(session->next_crypto);\n  if (rc == SSH_ERROR){\n    ssh_set_error(session, SSH_FATAL, \"Could not generate shared secret\");\n    goto error;\n  }\n\n  /* Send the MSG_NEWKEYS */\n  if (ssh_buffer_add_u8(session->out_buffer, SSH2_MSG_NEWKEYS) < 0) {\n    goto error;\n  }\n\n  rc=ssh_packet_send(session);\n  if (rc == SSH_ERROR) {\n    goto error;\n  }\n\n  SSH_LOG(SSH_LOG_PROTOCOL, \"SSH_MSG_NEWKEYS sent\");\n  session->dh_handshake_state = DH_STATE_NEWKEYS_SENT;\n  return SSH_PACKET_USED;\nerror:\n  ssh_dh_cleanup(session->next_crypto);\n  session->session_state=SSH_SESSION_STATE_ERROR;\n  return SSH_PACKET_USED;\n}\n\n#ifdef WITH_SERVER\n\nstatic SSH_PACKET_CALLBACK(ssh_packet_server_dh_init);\n\nstatic ssh_packet_callback dh_server_callbacks[] = {\n    ssh_packet_server_dh_init,\n};\n\nstatic struct ssh_packet_callbacks_struct ssh_dh_server_callbacks = {\n    .start = SSH2_MSG_KEXDH_INIT,\n    .n_callbacks = 1,\n    .callbacks = dh_server_callbacks,\n    .user = NULL\n};\n\n/** @internal\n * @brief sets up the diffie-hellman-groupx kex callbacks\n */\nvoid ssh_server_dh_init(ssh_session session){\n    /* register the packet callbacks */\n    ssh_packet_set_callbacks(session, &ssh_dh_server_callbacks);\n\n    ssh_dh_init_common(session->next_crypto);\n}\n\n/** @internal\n * @brief processes a SSH_MSG_KEXDH_INIT or SSH_MSG_KEX_DH_GEX_INIT packet and sends\n * the appropriate SSH_MSG_KEXDH_REPLY or SSH_MSG_KEX_DH_GEX_REPLY\n */\nint ssh_server_dh_process_init(ssh_session session, ssh_buffer packet)\n{\n    struct ssh_crypto_struct *crypto = session->next_crypto;\n    ssh_key privkey = NULL;\n    enum ssh_digest_e digest = SSH_DIGEST_AUTO;\n    ssh_string sig_blob = NULL;\n    ssh_string pubkey_blob = NULL;\n    bignum client_pubkey;\n    const_bignum server_pubkey;\n    int packet_type;\n    int rc;\n\n    rc = ssh_buffer_unpack(packet, \"B\", &client_pubkey);\n    if (rc == SSH_ERROR) {\n        ssh_set_error(session, SSH_FATAL, \"No e number in client request\");\n        goto error;\n    }\n\n    rc = ssh_dh_keypair_set_keys(crypto->dh_ctx, DH_CLIENT_KEYPAIR,\n                                 NULL, client_pubkey);\n    if (rc != SSH_OK) {\n        bignum_safe_free(client_pubkey);\n        goto error;\n    }\n\n    rc = ssh_dh_keypair_gen_keys(crypto->dh_ctx, DH_SERVER_KEYPAIR);\n    if (rc == SSH_ERROR) {\n        goto error;\n    }\n\n    rc = ssh_get_key_params(session, &privkey, &digest);\n    if (rc != SSH_OK) {\n        goto error;\n    }\n    rc = ssh_dh_compute_shared_secret(crypto->dh_ctx,\n                                      DH_SERVER_KEYPAIR, DH_CLIENT_KEYPAIR,\n                                      &crypto->shared_secret);\n    ssh_dh_debug_crypto(crypto);\n    if (rc == SSH_ERROR) {\n        ssh_set_error(session, SSH_FATAL, \"Could not generate shared secret\");\n        goto error;\n    }\n    rc = ssh_make_sessionid(session);\n    if (rc != SSH_OK) {\n        ssh_set_error(session, SSH_FATAL, \"Could not create a session id\");\n        goto error;\n    }\n    sig_blob = ssh_srv_pki_do_sign_sessionid(session, privkey, digest);\n    if (sig_blob == NULL) {\n        ssh_set_error(session, SSH_FATAL, \"Could not sign the session id\");\n        goto error;\n    }\n    switch (crypto->kex_type){\n    case SSH_KEX_DH_GROUP1_SHA1:\n    case SSH_KEX_DH_GROUP14_SHA1:\n    case SSH_KEX_DH_GROUP14_SHA256:\n    case SSH_KEX_DH_GROUP16_SHA512:\n    case SSH_KEX_DH_GROUP18_SHA512:\n        packet_type = SSH2_MSG_KEXDH_REPLY;\n        break;\n#ifdef WITH_GEX\n    case SSH_KEX_DH_GEX_SHA1:\n    case SSH_KEX_DH_GEX_SHA256:\n        packet_type = SSH2_MSG_KEX_DH_GEX_REPLY;\n        break;\n#endif /* WITH_GEX */\n    default:\n        ssh_set_error(session, SSH_FATAL, \"Invalid kex type\");\n        goto error;\n    }\n    rc = ssh_dh_keypair_get_keys(crypto->dh_ctx, DH_SERVER_KEYPAIR,\n                                 NULL, &server_pubkey);\n    if (rc != SSH_OK){\n        goto error;\n    }\n    rc = ssh_dh_get_next_server_publickey_blob(session, &pubkey_blob);\n    if (rc != SSH_OK){\n        ssh_set_error_oom(session);\n        goto error;\n    }\n    rc = ssh_buffer_pack(session->out_buffer,\n                         \"bSBS\",\n                         packet_type,\n                         pubkey_blob,\n                         server_pubkey,\n                         sig_blob);\n    SSH_STRING_FREE(sig_blob);\n    SSH_STRING_FREE(pubkey_blob);\n    if(rc != SSH_OK) {\n        ssh_set_error_oom(session);\n        ssh_buffer_reinit(session->out_buffer);\n        goto error;\n    }\n    rc = ssh_packet_send(session);\n    if (rc == SSH_ERROR) {\n        goto error;\n    }\n    SSH_LOG(SSH_LOG_DEBUG, \"Sent KEX_DH_[GEX]_REPLY\");\n\n    if (ssh_buffer_add_u8(session->out_buffer, SSH2_MSG_NEWKEYS) < 0) {\n        ssh_buffer_reinit(session->out_buffer);\n        goto error;\n    }\n    session->dh_handshake_state=DH_STATE_NEWKEYS_SENT;\n    if (ssh_packet_send(session) == SSH_ERROR) {\n        goto error;\n    }\n    SSH_LOG(SSH_LOG_PACKET, \"SSH_MSG_NEWKEYS sent\");\n\n    return SSH_OK;\nerror:\n    SSH_STRING_FREE(sig_blob);\n    SSH_STRING_FREE(pubkey_blob);\n\n    session->session_state = SSH_SESSION_STATE_ERROR;\n    ssh_dh_cleanup(session->next_crypto);\n    return SSH_ERROR;\n}\n\n/** @internal\n * @brief parse an incoming SSH_MSG_KEXDH_INIT packet and complete\n *        Diffie-Hellman key exchange\n **/\nstatic SSH_PACKET_CALLBACK(ssh_packet_server_dh_init){\n    (void)type;\n    (void)user;\n    SSH_LOG(SSH_LOG_DEBUG, \"Received SSH_MSG_KEXDH_INIT\");\n    ssh_packet_remove_callbacks(session, &ssh_dh_server_callbacks);\n    ssh_server_dh_process_init(session, packet);\n    return SSH_PACKET_USED;\n}\n\n/** @internal\n * @brief Choose a fallback group for the DH Group exchange if the\n * moduli file is not readable\n * @param[in] pmax maximum requestsd group size\n * @param[out] modulus\n * @param[out] generator\n * @returns SSH_OK on success, SSH_ERROR otherwise\n */\nint ssh_fallback_group(uint32_t pmax,\n                       bignum *modulus,\n                       bignum *generator)\n{\n    *modulus = NULL;\n    *generator = NULL;\n\n    if (pmax < 3072) {\n        bignum_dup(ssh_dh_group14, modulus);\n    } else if (pmax < 6144) {\n        bignum_dup(ssh_dh_group16, modulus);\n    } else {\n        bignum_dup(ssh_dh_group18, modulus);\n    }\n    if (*modulus == NULL) {\n        return SSH_ERROR;\n    }\n\n    bignum_dup(ssh_dh_generator, generator);\n    if (*generator == NULL) {\n        bignum_safe_free((*modulus));\n        return SSH_ERROR;\n    }\n\n    return SSH_OK;\n}\n\n#endif /* WITH_SERVER */\n\n/**\n * @addtogroup libssh_session\n *\n * @{\n */\n\nbool ssh_dh_is_known_group(bignum modulus, bignum generator)\n{\n    int cmp, bits;\n    bignum m = NULL;\n\n    bits = bignum_num_bits(modulus);\n    if (bits < 3072) {\n        m = ssh_dh_group14;\n    } else if (bits < 6144) {\n        m = ssh_dh_group16;\n    } else {\n        m = ssh_dh_group18;\n    }\n\n    cmp = bignum_cmp(m, modulus);\n    if (cmp != 0) {\n        return false;\n    }\n\n    cmp = bignum_cmp(ssh_dh_generator, generator);\n    if (cmp != 0) {\n        return false;\n    }\n\n    SSH_LOG(SSH_LOG_TRACE, \"The received primes in FIPS are known\");\n    return true;\n}\n\nssh_key ssh_dh_get_current_server_publickey(ssh_session session)\n{\n    if (session->current_crypto == NULL) {\n        return NULL;\n    }\n\n    return session->current_crypto->server_pubkey;\n}\n\n/* Caller need to free the blob */\nint ssh_dh_get_current_server_publickey_blob(ssh_session session,\n                                     ssh_string *pubkey_blob)\n{\n    const ssh_key pubkey = ssh_dh_get_current_server_publickey(session);\n\n    return ssh_pki_export_pubkey_blob(pubkey, pubkey_blob);\n}\n\nssh_key ssh_dh_get_next_server_publickey(ssh_session session)\n{\n    return session->next_crypto->server_pubkey;\n}\n\n/* Caller need to free the blob */\nint ssh_dh_get_next_server_publickey_blob(ssh_session session,\n                                          ssh_string *pubkey_blob)\n{\n    const ssh_key pubkey = ssh_dh_get_next_server_publickey(session);\n\n    return ssh_pki_export_pubkey_blob(pubkey, pubkey_blob);\n}\n\n/**\n * @internal\n *\n * @brief Convert a buffer into an unpadded base64 string.\n * The caller has to free the memory.\n *\n * @param  hash         What should be converted to a base64 string.\n *\n * @param  len          Length of the buffer to convert.\n *\n * @return              The base64 string or NULL on error.\n *\n * @see ssh_string_free_char()\n */\nstatic char *ssh_get_b64_unpadded(const unsigned char *hash, size_t len)\n{\n    char *b64_padded = NULL;\n    char *b64_unpadded = NULL;\n    size_t k;\n\n    b64_padded = (char *)bin_to_base64(hash, (int)len);\n    if (b64_padded == NULL) {\n        return NULL;\n    }\n    for (k = strlen(b64_padded); k != 0 && b64_padded[k-1] == '='; k--);\n\n    b64_unpadded = strndup(b64_padded, k);\n    SAFE_FREE(b64_padded);\n\n    return b64_unpadded;\n}\n\n/**\n * @brief Get a hash as a human-readable hex- or base64-string.\n *\n * This gets an allocated fingerprint hash.  If it is a SHA sum, it will\n * return an unpadded base64 strings.  If it is a MD5 sum, it will return hex\n * string. Either way, the output is prepended by the hash-type.\n *\n * @warning Do NOT use MD5 or SHA1! Those hash functions are being deprecated.\n *\n * @param  type         Which sort of hash is given, use\n *                      SSH_PUBLICKEY_HASH_SHA256 or better.\n *\n * @param  hash         The hash to be converted to fingerprint.\n *\n * @param  len          Length of the buffer to convert.\n *\n * @return Returns the allocated fingerprint hash or NULL on error.\n *\n * @see ssh_string_free_char()\n */\nchar *ssh_get_fingerprint_hash(enum ssh_publickey_hash_type type,\n                               unsigned char *hash,\n                               size_t len)\n{\n    const char *prefix = \"UNKNOWN\";\n    char *fingerprint = NULL;\n    char *str = NULL;\n    size_t str_len;\n    int rc;\n\n    switch (type) {\n    case SSH_PUBLICKEY_HASH_SHA1:\n    case SSH_PUBLICKEY_HASH_SHA256:\n        fingerprint = ssh_get_b64_unpadded(hash, len);\n        break;\n    case SSH_PUBLICKEY_HASH_MD5:\n        fingerprint = ssh_get_hexa(hash, len);\n        break;\n    }\n    if (fingerprint == NULL) {\n        return NULL;\n    }\n\n    switch (type) {\n    case SSH_PUBLICKEY_HASH_MD5:\n        prefix = \"MD5\";\n        break;\n    case SSH_PUBLICKEY_HASH_SHA1:\n        prefix = \"SHA1\";\n        break;\n    case SSH_PUBLICKEY_HASH_SHA256:\n        prefix = \"SHA256\";\n        break;\n    }\n\n    str_len = strlen(prefix);\n    if (str_len + 1 + strlen(fingerprint) + 1 < str_len) {\n        SAFE_FREE(fingerprint);\n        return NULL;\n    }\n    str_len += 1 + strlen(fingerprint) + 1;\n\n    str = malloc(str_len);\n    if (str == NULL) {\n        SAFE_FREE(fingerprint);\n        return NULL;\n    }\n    rc = snprintf(str, str_len, \"%s:%s\", prefix, fingerprint);\n    SAFE_FREE(fingerprint);\n    if (rc < 0 || rc < (int)(str_len - 1)) {\n        SAFE_FREE(str);\n    }\n\n    return str;\n}\n\n/**\n * @brief Print a hash as a human-readable hex- or base64-string.\n *\n * This prints an unpadded base64 strings for SHA sums and hex strings for MD5\n * sum.  Either way, the output is prepended by the hash-type.\n *\n * @param  type         Which sort of hash is given. Use\n *                      SSH_PUBLICKEY_HASH_SHA256 or better.\n *\n * @param  hash         The hash to be converted to fingerprint.\n *\n * @param  len          Length of the buffer to convert.\n *\n * @see ssh_get_publickey_hash()\n * @see ssh_get_fingerprint_hash()\n */\nvoid ssh_print_hash(enum ssh_publickey_hash_type type,\n                    unsigned char *hash,\n                    size_t len)\n{\n    char *fingerprint = NULL;\n\n    fingerprint = ssh_get_fingerprint_hash(type,\n                                           hash,\n                                           len);\n    if (fingerprint == NULL) {\n        return;\n    }\n\n    fprintf(stderr, \"%s\\n\", fingerprint);\n\n    SAFE_FREE(fingerprint);\n}\n\n/** @} */\n"
  },
  {
    "path": "src/libssh/src/dh_crypto.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2019 by Simo Sorce - Red Hat, Inc.\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n#include \"libssh/session.h\"\n#include \"libssh/dh.h\"\n#include \"libssh/buffer.h\"\n#include \"libssh/ssh2.h\"\n#include \"libssh/pki.h\"\n#include \"libssh/bignum.h\"\n\n#include \"openssl/crypto.h\"\n#include \"openssl/dh.h\"\n#include \"libcrypto-compat.h\"\n\nextern bignum ssh_dh_generator;\nextern bignum ssh_dh_group1;\nextern bignum ssh_dh_group14;\nextern bignum ssh_dh_group16;\nextern bignum ssh_dh_group18;\n\nstruct dh_ctx {\n    DH *keypair[2];\n};\n\nvoid ssh_dh_debug_crypto(struct ssh_crypto_struct *c)\n{\n#ifdef DEBUG_CRYPTO\n    const_bignum x = NULL, y = NULL, e = NULL, f = NULL;\n\n    ssh_dh_keypair_get_keys(c->dh_ctx, DH_CLIENT_KEYPAIR, &x, &e);\n    ssh_dh_keypair_get_keys(c->dh_ctx, DH_SERVER_KEYPAIR, &y, &f);\n    ssh_print_bignum(\"x\", x);\n    ssh_print_bignum(\"y\", y);\n    ssh_print_bignum(\"e\", e);\n    ssh_print_bignum(\"f\", f);\n\n    ssh_log_hexdump(\"Session server cookie\", c->server_kex.cookie, 16);\n    ssh_log_hexdump(\"Session client cookie\", c->client_kex.cookie, 16);\n    ssh_print_bignum(\"k\", c->shared_secret);\n\n#else\n    (void)c; /* UNUSED_PARAM */\n#endif\n}\n\nint ssh_dh_keypair_get_keys(struct dh_ctx *ctx, int peer,\n                            const_bignum *priv, const_bignum *pub)\n{\n    if (((peer != DH_CLIENT_KEYPAIR) && (peer != DH_SERVER_KEYPAIR)) ||\n        ((priv == NULL) && (pub == NULL)) || (ctx == NULL) ||\n        (ctx->keypair[peer] == NULL)) {\n        return SSH_ERROR;\n    }\n    DH_get0_key(ctx->keypair[peer], pub, priv);\n    if (priv && (*priv == NULL || bignum_num_bits(*priv) == 0)) {\n        return SSH_ERROR;\n    }\n    if (pub && (*pub == NULL || bignum_num_bits(*pub) == 0)) {\n        return SSH_ERROR;\n    }\n\n    return SSH_OK;\n}\n\nint ssh_dh_keypair_set_keys(struct dh_ctx *ctx, int peer,\n                            const bignum priv, const bignum pub)\n{\n    bignum priv_key = NULL;\n    bignum pub_key = NULL;\n\n    if (((peer != DH_CLIENT_KEYPAIR) && (peer != DH_SERVER_KEYPAIR)) ||\n        ((priv == NULL) && (pub == NULL)) || (ctx == NULL) ||\n        (ctx->keypair[peer] == NULL)) {\n        return SSH_ERROR;\n    }\n\n    if (priv) {\n        priv_key = priv;\n    }\n    if (pub) {\n        pub_key = pub;\n    }\n    (void)DH_set0_key(ctx->keypair[peer], pub_key, priv_key);\n\n    return SSH_OK;\n}\n\nint ssh_dh_get_parameters(struct dh_ctx *ctx,\n                          const_bignum *modulus, const_bignum *generator)\n{\n    if (ctx == NULL || ctx->keypair[0] == NULL) {\n        return SSH_ERROR;\n    }\n    DH_get0_pqg(ctx->keypair[0], modulus, NULL, generator);\n    return SSH_OK;\n}\n\nint ssh_dh_set_parameters(struct dh_ctx *ctx,\n                          const bignum modulus, const bignum generator)\n{\n    size_t i;\n    int rc;\n\n    if ((ctx == NULL) || (modulus == NULL) || (generator == NULL)) {\n        return SSH_ERROR;\n    }\n\n    for (i = 0; i < 2; i++) {\n        bignum p = NULL;\n        bignum g = NULL;\n\n        /* when setting modulus or generator,\n         * make sure to invalidate existing keys */\n        DH_free(ctx->keypair[i]);\n        ctx->keypair[i] = DH_new();\n        if (ctx->keypair[i] == NULL) {\n            rc = SSH_ERROR;\n            goto done;\n        }\n\n        p = BN_dup(modulus);\n        g = BN_dup(generator);\n        rc = DH_set0_pqg(ctx->keypair[i], p, NULL, g);\n        if (rc != 1) {\n            BN_free(p);\n            BN_free(g);\n            rc = SSH_ERROR;\n            goto done;\n        }\n    }\n\n    rc = SSH_OK;\ndone:\n    if (rc != SSH_OK) {\n        DH_free(ctx->keypair[0]);\n        DH_free(ctx->keypair[1]);\n        ctx->keypair[0] = NULL;\n        ctx->keypair[1] = NULL;\n    }\n    return rc;\n}\n\n/**\n * @internal\n * @brief allocate and initialize ephemeral values used in dh kex\n */\nint ssh_dh_init_common(struct ssh_crypto_struct *crypto)\n{\n    struct dh_ctx *ctx;\n    int rc;\n\n    ctx = calloc(1, sizeof(*ctx));\n    if (ctx == NULL) {\n        return SSH_ERROR;\n    }\n    crypto->dh_ctx = ctx;\n\n    switch (crypto->kex_type) {\n    case SSH_KEX_DH_GROUP1_SHA1:\n        rc = ssh_dh_set_parameters(ctx, ssh_dh_group1, ssh_dh_generator);\n        break;\n    case SSH_KEX_DH_GROUP14_SHA1:\n    case SSH_KEX_DH_GROUP14_SHA256:\n        rc = ssh_dh_set_parameters(ctx, ssh_dh_group14, ssh_dh_generator);\n        break;\n    case SSH_KEX_DH_GROUP16_SHA512:\n        rc = ssh_dh_set_parameters(ctx, ssh_dh_group16, ssh_dh_generator);\n        break;\n    case SSH_KEX_DH_GROUP18_SHA512:\n        rc = ssh_dh_set_parameters(ctx, ssh_dh_group18, ssh_dh_generator);\n        break;\n    default:\n        rc = SSH_OK;\n        break;\n    }\n\n    if (rc != SSH_OK) {\n        ssh_dh_cleanup(crypto);\n    }\n    return rc;\n}\n\nvoid ssh_dh_cleanup(struct ssh_crypto_struct *crypto)\n{\n    if (crypto->dh_ctx != NULL) {\n        DH_free(crypto->dh_ctx->keypair[0]);\n        DH_free(crypto->dh_ctx->keypair[1]);\n        free(crypto->dh_ctx);\n        crypto->dh_ctx = NULL;\n    }\n}\n\n/** @internal\n * @brief generates a secret DH parameter of at least DH_SECURITY_BITS\n *        security as well as the corresponding public key.\n * @param[out] parms a dh_ctx that will hold the new keys.\n * @param peer Select either client or server key storage. Valid values are:\n *        DH_CLIENT_KEYPAIR or DH_SERVER_KEYPAIR\n *\n * @return SSH_OK on success, SSH_ERROR on error\n */\nint ssh_dh_keypair_gen_keys(struct dh_ctx *dh_ctx, int peer)\n{\n    int rc;\n\n    if ((dh_ctx == NULL) || (dh_ctx->keypair[peer] == NULL)) {\n        return SSH_ERROR;\n    }\n    rc = DH_generate_key(dh_ctx->keypair[peer]);\n    if (rc != 1) {\n        return SSH_ERROR;\n    }\n    return SSH_OK;\n}\n\n/** @internal\n * @brief generates a shared secret between the local peer and the remote\n *        peer. The local peer must have been initialized using either the\n *        ssh_dh_keypair_gen_keys() function or by seetting manually both\n *        the private and public keys. The remote peer only needs to have\n *        the remote's peer public key set.\n * @param[in] local peer identifier (DH_CLIENT_KEYPAIR or DH_SERVER_KEYPAIR)\n * @param[in] remote peer identifier (DH_CLIENT_KEYPAIR or DH_SERVER_KEYPAIR)\n * @param[out] dest a new bignum with the shared secret value is returned.\n * @return SSH_OK on success, SSH_ERROR on error\n */\nint ssh_dh_compute_shared_secret(struct dh_ctx *dh_ctx, int local, int remote,\n                                 bignum *dest)\n{\n    unsigned char *kstring = NULL;\n    const_bignum pub_key = NULL;\n    int klen, rc;\n\n    if ((dh_ctx == NULL) ||\n        (dh_ctx->keypair[local] == NULL) ||\n        (dh_ctx->keypair[remote] == NULL)) {\n        return SSH_ERROR;\n    }\n\n    kstring = malloc(DH_size(dh_ctx->keypair[local]));\n    if (kstring == NULL) {\n        rc = SSH_ERROR;\n        goto done;\n    }\n\n    rc = ssh_dh_keypair_get_keys(dh_ctx, remote, NULL, &pub_key);\n    if (rc != SSH_OK) {\n        rc = SSH_ERROR;\n        goto done;\n    }\n\n    klen = DH_compute_key(kstring, pub_key, dh_ctx->keypair[local]);\n    if (klen == -1) {\n        rc = SSH_ERROR;\n        goto done;\n    }\n\n    *dest = BN_bin2bn(kstring, klen, NULL);\n    if (*dest == NULL) {\n        rc = SSH_ERROR;\n        goto done;\n    }\n\n    rc = SSH_OK;\ndone:\n    free(kstring);\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/src/dh_key.c",
    "content": "/*\n * dh-int.c - Diffie-Helman algorithm code against SSH 2\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2003-2018 by Aris Adamantiadis\n * Copyright (c) 2009-2013 by Andreas Schneider <asn@cryptomilk.org>\n * Copyright (c) 2012      by Dmitriy Kuznetsov <dk@yandex.ru>\n * Copyright (c) 2019      by Simo Sorce <simo@redhat.com>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include \"libssh/priv.h\"\n#include \"libssh/crypto.h\"\n#include \"libssh/buffer.h\"\n#include \"libssh/session.h\"\n#include \"libssh/misc.h\"\n#include \"libssh/dh.h\"\n#include \"libssh/ssh2.h\"\n#include \"libssh/pki.h\"\n#include \"libssh/bignum.h\"\n\nextern bignum ssh_dh_generator;\nextern bignum ssh_dh_group1;\nextern bignum ssh_dh_group14;\nextern bignum ssh_dh_group16;\nextern bignum ssh_dh_group18;\n\n/*\n * How many bits of security we want for fast DH. DH private key size must be\n * twice that size.\n */\n#define DH_SECURITY_BITS 512\n\nstruct dh_keypair {\n    bignum priv_key;\n    bignum pub_key;\n};\n\nstruct dh_ctx {\n    /* 0 is client, 1 is server */\n    struct dh_keypair keypair[2];\n    bignum generator;\n    bignum modulus;\n};\n\nvoid ssh_dh_debug_crypto(struct ssh_crypto_struct *c)\n{\n#ifdef DEBUG_CRYPTO\n    const_bignum x = NULL, y = NULL, e = NULL, f = NULL;\n\n    ssh_dh_keypair_get_keys(c->dh_ctx, DH_CLIENT_KEYPAIR, &x, &e);\n    ssh_dh_keypair_get_keys(c->dh_ctx, DH_SERVER_KEYPAIR, &y, &f);\n    ssh_print_bignum(\"p\", c->dh_ctx->modulus);\n    ssh_print_bignum(\"g\", c->dh_ctx->generator);\n    ssh_print_bignum(\"x\", x);\n    ssh_print_bignum(\"y\", y);\n    ssh_print_bignum(\"e\", e);\n    ssh_print_bignum(\"f\", f);\n\n    ssh_log_hexdump(\"Session server cookie\", c->server_kex.cookie, 16);\n    ssh_log_hexdump(\"Session client cookie\", c->client_kex.cookie, 16);\n    ssh_print_bignum(\"k\", c->shared_secret);\n#else\n    (void)c; /* UNUSED_PARAM */\n#endif\n}\n\nstatic void ssh_dh_free_modulus(struct dh_ctx *ctx)\n{\n    if ((ctx->modulus != ssh_dh_group1) &&\n        (ctx->modulus != ssh_dh_group14) &&\n        (ctx->modulus != ssh_dh_group16) &&\n        (ctx->modulus != ssh_dh_group18)) {\n        bignum_safe_free(ctx->modulus);\n    }\n    ctx->modulus = NULL;\n}\n\nstatic void ssh_dh_free_generator(struct dh_ctx *ctx)\n{\n    if (ctx->generator != ssh_dh_generator) {\n        bignum_safe_free(ctx->generator);\n    }\n}\n\nstatic void ssh_dh_free_dh_keypair(struct dh_keypair *keypair)\n{\n    bignum_safe_free(keypair->priv_key);\n    bignum_safe_free(keypair->pub_key);\n}\n\nstatic int ssh_dh_init_dh_keypair(struct dh_keypair *keypair)\n{\n    int rc;\n\n    keypair->priv_key = bignum_new();\n    if (keypair->priv_key == NULL) {\n        rc = SSH_ERROR;\n        goto done;\n    }\n    keypair->pub_key = bignum_new();\n    if (keypair->pub_key == NULL) {\n        rc = SSH_ERROR;\n        goto done;\n    }\n\n    rc = SSH_OK;\ndone:\n    if (rc != SSH_OK) {\n        ssh_dh_free_dh_keypair(keypair);\n    }\n    return rc;\n}\n\nint ssh_dh_keypair_get_keys(struct dh_ctx *ctx, int peer,\n                            const_bignum *priv, const_bignum *pub)\n{\n    if (((peer != DH_CLIENT_KEYPAIR) && (peer != DH_SERVER_KEYPAIR)) ||\n        ((priv == NULL) && (pub == NULL)) || (ctx == NULL)) {\n        return SSH_ERROR;\n    }\n\n    if (priv) {\n        /* check that we have something in it */\n        if (bignum_num_bits(ctx->keypair[peer].priv_key)) {\n            *priv = ctx->keypair[peer].priv_key;\n        } else {\n            return SSH_ERROR;\n        }\n    }\n\n    if (pub) {\n        /* check that we have something in it */\n        if (bignum_num_bits(ctx->keypair[peer].pub_key)) {\n            *pub = ctx->keypair[peer].pub_key;\n        } else {\n            return SSH_ERROR;\n        }\n    }\n\n    return SSH_OK;\n}\n\nint ssh_dh_keypair_set_keys(struct dh_ctx *ctx, int peer,\n                            bignum priv, bignum pub)\n{\n    if (((peer != DH_CLIENT_KEYPAIR) && (peer != DH_SERVER_KEYPAIR)) ||\n        ((priv == NULL) && (pub == NULL)) || (ctx == NULL)) {\n        return SSH_ERROR;\n    }\n\n    if (priv) {\n        bignum_safe_free(ctx->keypair[peer].priv_key);\n        ctx->keypair[peer].priv_key = priv;\n    }\n    if (pub) {\n        bignum_safe_free(ctx->keypair[peer].pub_key);\n        ctx->keypair[peer].pub_key = pub;\n    }\n    return SSH_OK;\n}\n\nint ssh_dh_get_parameters(struct dh_ctx *ctx,\n                          const_bignum *modulus, const_bignum *generator)\n{\n    if (ctx == NULL) {\n        return SSH_ERROR;\n    }\n    if (modulus) {\n        *modulus = ctx->modulus;\n    }\n    if (generator) {\n        *generator = ctx->generator;\n    }\n\n    return SSH_OK;\n}\n\nint ssh_dh_set_parameters(struct dh_ctx *ctx,\n                          bignum modulus, bignum generator)\n{\n    int rc;\n\n    if ((ctx == NULL) || ((modulus == NULL) && (generator == NULL))) {\n        return SSH_ERROR;\n    }\n    /* when setting modulus or generator,\n     * make sure to invalidate existing keys */\n    ssh_dh_free_dh_keypair(&ctx->keypair[DH_CLIENT_KEYPAIR]);\n    ssh_dh_free_dh_keypair(&ctx->keypair[DH_SERVER_KEYPAIR]);\n\n    rc = ssh_dh_init_dh_keypair(&ctx->keypair[DH_CLIENT_KEYPAIR]);\n    if (rc != SSH_OK) {\n        goto done;\n    }\n    rc = ssh_dh_init_dh_keypair(&ctx->keypair[DH_SERVER_KEYPAIR]);\n    if (rc != SSH_OK) {\n        goto done;\n    }\n\n    if (modulus) {\n        ssh_dh_free_modulus(ctx);\n        ctx->modulus = modulus;\n    }\n    if (generator) {\n        ssh_dh_free_generator(ctx);\n        ctx->generator = generator;\n    }\n\ndone:\n    return rc;\n}\n\n/**\n * @internal\n * @brief allocate and initialize ephemeral values used in dh kex\n */\nint ssh_dh_init_common(struct ssh_crypto_struct *crypto)\n{\n    struct dh_ctx *ctx = NULL;\n    int rc;\n\n    ctx = calloc(1, sizeof(*ctx));\n    if (ctx == NULL) {\n        return SSH_ERROR;\n    }\n\n    switch (crypto->kex_type) {\n    case SSH_KEX_DH_GROUP1_SHA1:\n        rc = ssh_dh_set_parameters(ctx, ssh_dh_group1, ssh_dh_generator);\n        break;\n    case SSH_KEX_DH_GROUP14_SHA1:\n    case SSH_KEX_DH_GROUP14_SHA256:\n        rc = ssh_dh_set_parameters(ctx, ssh_dh_group14, ssh_dh_generator);\n        break;\n    case SSH_KEX_DH_GROUP16_SHA512:\n        rc = ssh_dh_set_parameters(ctx, ssh_dh_group16, ssh_dh_generator);\n        break;\n    case SSH_KEX_DH_GROUP18_SHA512:\n        rc = ssh_dh_set_parameters(ctx, ssh_dh_group18, ssh_dh_generator);\n        break;\n    default:\n        rc = SSH_OK;\n        break;\n    }\n\n    crypto->dh_ctx = ctx;\n\n    if (rc != SSH_OK) {\n        ssh_dh_cleanup(crypto);\n    }\n    return rc;\n}\n\nvoid ssh_dh_cleanup(struct ssh_crypto_struct *crypto)\n{\n    struct dh_ctx *ctx = crypto->dh_ctx;\n\n    if (ctx == NULL) {\n        return;\n    }\n\n    ssh_dh_free_dh_keypair(&ctx->keypair[DH_CLIENT_KEYPAIR]);\n    ssh_dh_free_dh_keypair(&ctx->keypair[DH_SERVER_KEYPAIR]);\n\n    ssh_dh_free_modulus(ctx);\n    ssh_dh_free_generator(ctx);\n    free(ctx);\n    crypto->dh_ctx = NULL;\n}\n\n/** @internal\n * @brief generates a secret DH parameter of at least DH_SECURITY_BITS\n *        security as well as the corresponding public key.\n * @param[out] parms a dh_kex paramters structure with preallocated bignum\n *             where to store the parameters\n * @return SSH_OK on success, SSH_ERROR on error\n */\nint ssh_dh_keypair_gen_keys(struct dh_ctx *dh_ctx, int peer)\n{\n    bignum tmp = NULL;\n    bignum_CTX ctx = NULL;\n    int rc = 0;\n    int bits = 0;\n    int p_bits = 0;\n\n    ctx = bignum_ctx_new();\n    if (bignum_ctx_invalid(ctx)){\n        goto error;\n    }\n    tmp = bignum_new();\n    if (tmp == NULL) {\n        goto error;\n    }\n    p_bits = bignum_num_bits(dh_ctx->modulus);\n    /* we need at most DH_SECURITY_BITS */\n    bits = MIN(DH_SECURITY_BITS * 2, p_bits);\n    /* ensure we're not too close of p so rnd()%p stays uniform */\n    if (bits <= p_bits && bits + 64 > p_bits) {\n        bits += 64;\n    }\n    rc = bignum_rand(tmp, bits);\n    if (rc != 1) {\n        goto error;\n    }\n    rc = bignum_mod(dh_ctx->keypair[peer].priv_key, tmp, dh_ctx->modulus, ctx);\n    if (rc != 1) {\n        goto error;\n    }\n    /* Now compute the corresponding public key */\n    rc = bignum_mod_exp(dh_ctx->keypair[peer].pub_key, dh_ctx->generator,\n                        dh_ctx->keypair[peer].priv_key, dh_ctx->modulus, ctx);\n    if (rc != 1) {\n        goto error;\n    }\n    bignum_safe_free(tmp);\n    bignum_ctx_free(ctx);\n    return SSH_OK;\nerror:\n    bignum_safe_free(tmp);\n    bignum_ctx_free(ctx);\n    return SSH_ERROR;\n}\n\n/** @internal\n * @brief generates a shared secret between the local peer and the remote peer\n * @param[in] local peer identifier\n * @param[in] remote peer identifier\n * @param[out] dest a preallocated bignum where to store parameter\n * @return SSH_OK on success, SSH_ERROR on error\n */\nint ssh_dh_compute_shared_secret(struct dh_ctx *dh_ctx, int local, int remote,\n                                 bignum *dest)\n{\n    int rc;\n    bignum_CTX ctx = bignum_ctx_new();\n    if (bignum_ctx_invalid(ctx)) {\n        return -1;\n    }\n\n    if (*dest == NULL) {\n        *dest = bignum_new();\n        if (*dest == NULL) {\n            rc = 0;\n            goto done;\n        }\n    }\n\n    rc = bignum_mod_exp(*dest, dh_ctx->keypair[remote].pub_key,\n                        dh_ctx->keypair[local].priv_key,\n                        dh_ctx->modulus, ctx);\n\ndone:\n    bignum_ctx_free(ctx);\n    if (rc != 1) {\n        return SSH_ERROR;\n    }\n    return SSH_OK;\n}\n"
  },
  {
    "path": "src/libssh/src/ecdh.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2011-2013 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n#include \"libssh/session.h\"\n#include \"libssh/ecdh.h\"\n#include \"libssh/dh.h\"\n#include \"libssh/buffer.h\"\n#include \"libssh/ssh2.h\"\n#include \"libssh/pki.h\"\n#include \"libssh/bignum.h\"\n\n#ifdef HAVE_ECDH\n\nstatic SSH_PACKET_CALLBACK(ssh_packet_client_ecdh_reply);\n\nstatic ssh_packet_callback ecdh_client_callbacks[]= {\n    ssh_packet_client_ecdh_reply\n};\n\nstruct ssh_packet_callbacks_struct ssh_ecdh_client_callbacks = {\n    .start = SSH2_MSG_KEX_ECDH_REPLY,\n    .n_callbacks = 1,\n    .callbacks = ecdh_client_callbacks,\n    .user = NULL\n};\n\n/** @internal\n * @brief parses a SSH_MSG_KEX_ECDH_REPLY packet and sends back\n * a SSH_MSG_NEWKEYS\n */\nSSH_PACKET_CALLBACK(ssh_packet_client_ecdh_reply){\n  ssh_string q_s_string = NULL;\n  ssh_string pubkey_blob = NULL;\n  ssh_string signature = NULL;\n  int rc;\n  (void)type;\n  (void)user;\n\n  ssh_packet_remove_callbacks(session, &ssh_ecdh_client_callbacks);\n  pubkey_blob = ssh_buffer_get_ssh_string(packet);\n  if (pubkey_blob == NULL) {\n    ssh_set_error(session,SSH_FATAL, \"No public key in packet\");\n    goto error;\n  }\n\n  rc = ssh_dh_import_next_pubkey_blob(session, pubkey_blob);\n  SSH_STRING_FREE(pubkey_blob);\n  if (rc != 0) {\n      goto error;\n  }\n\n  q_s_string = ssh_buffer_get_ssh_string(packet);\n  if (q_s_string == NULL) {\n    ssh_set_error(session,SSH_FATAL, \"No Q_S ECC point in packet\");\n    goto error;\n  }\n  session->next_crypto->ecdh_server_pubkey = q_s_string;\n  signature = ssh_buffer_get_ssh_string(packet);\n  if (signature == NULL) {\n    ssh_set_error(session, SSH_FATAL, \"No signature in packet\");\n    goto error;\n  }\n  session->next_crypto->dh_server_signature = signature;\n  signature=NULL; /* ownership changed */\n  /* TODO: verify signature now instead of waiting for NEWKEYS */\n  if (ecdh_build_k(session) < 0) {\n    ssh_set_error(session, SSH_FATAL, \"Cannot build k number\");\n    goto error;\n  }\n\n  /* Send the MSG_NEWKEYS */\n  if (ssh_buffer_add_u8(session->out_buffer, SSH2_MSG_NEWKEYS) < 0) {\n    goto error;\n  }\n\n  rc=ssh_packet_send(session);\n  if (rc == SSH_ERROR) {\n    goto error;\n  }\n\n  SSH_LOG(SSH_LOG_PROTOCOL, \"SSH_MSG_NEWKEYS sent\");\n  session->dh_handshake_state = DH_STATE_NEWKEYS_SENT;\n\n  return SSH_PACKET_USED;\n\nerror:\n  session->session_state=SSH_SESSION_STATE_ERROR;\n  return SSH_PACKET_USED;\n}\n\n#ifdef WITH_SERVER\n\nstatic ssh_packet_callback ecdh_server_callbacks[] = {\n    ssh_packet_server_ecdh_init\n};\n\nstruct ssh_packet_callbacks_struct ssh_ecdh_server_callbacks = {\n    .start = SSH2_MSG_KEX_ECDH_INIT,\n    .n_callbacks = 1,\n    .callbacks = ecdh_server_callbacks,\n    .user = NULL\n};\n\n/** @internal\n * @brief sets up the ecdh kex callbacks\n */\nvoid ssh_server_ecdh_init(ssh_session session){\n    ssh_packet_set_callbacks(session, &ssh_ecdh_server_callbacks);\n}\n\n#endif /* WITH_SERVER */\n#endif /* HAVE_ECDH */\n"
  },
  {
    "path": "src/libssh/src/ecdh_crypto.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2011-2013 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n#include \"libssh/session.h\"\n#include \"libssh/ecdh.h\"\n#include \"libssh/dh.h\"\n#include \"libssh/buffer.h\"\n#include \"libssh/ssh2.h\"\n#include \"libssh/pki.h\"\n#include \"libssh/bignum.h\"\n\n#ifdef HAVE_ECDH\n#include <openssl/ecdh.h>\n\n#define NISTP256 NID_X9_62_prime256v1\n#define NISTP384 NID_secp384r1\n#define NISTP521 NID_secp521r1\n\n/** @internal\n * @brief Map the given key exchange enum value to its curve name.\n */\nstatic int ecdh_kex_type_to_curve(enum ssh_key_exchange_e kex_type) {\n    if (kex_type == SSH_KEX_ECDH_SHA2_NISTP256) {\n        return NISTP256;\n    } else if (kex_type == SSH_KEX_ECDH_SHA2_NISTP384) {\n        return NISTP384;\n    } else if (kex_type == SSH_KEX_ECDH_SHA2_NISTP521) {\n        return NISTP521;\n    }\n    return SSH_ERROR;\n}\n\n/** @internal\n * @brief Starts ecdh-sha2-nistp256 key exchange\n */\nint ssh_client_ecdh_init(ssh_session session){\n  EC_KEY *key;\n  const EC_GROUP *group;\n  const EC_POINT *pubkey;\n  ssh_string client_pubkey;\n  int curve;\n  int len;\n  int rc;\n  bignum_CTX ctx = BN_CTX_new();\n\n  rc = ssh_buffer_add_u8(session->out_buffer, SSH2_MSG_KEX_ECDH_INIT);\n  if (rc < 0) {\n      BN_CTX_free(ctx);\n      return SSH_ERROR;\n  }\n\n  curve = ecdh_kex_type_to_curve(session->next_crypto->kex_type);\n  if (curve == SSH_ERROR) {\n      BN_CTX_free(ctx);\n      return SSH_ERROR;\n  }\n\n  key = EC_KEY_new_by_curve_name(curve);\n  if (key == NULL) {\n      BN_CTX_free(ctx);\n      return SSH_ERROR;\n  }\n  group = EC_KEY_get0_group(key);\n\n  EC_KEY_generate_key(key);\n\n  pubkey=EC_KEY_get0_public_key(key);\n  len = EC_POINT_point2oct(group,pubkey,POINT_CONVERSION_UNCOMPRESSED,\n      NULL,0,ctx);\n\n  client_pubkey = ssh_string_new(len);\n  if (client_pubkey == NULL) {\n      BN_CTX_free(ctx);\n      EC_KEY_free(key);\n      return SSH_ERROR;\n  }\n\n  EC_POINT_point2oct(group,pubkey,POINT_CONVERSION_UNCOMPRESSED,\n      ssh_string_data(client_pubkey),len,ctx);\n  BN_CTX_free(ctx);\n\n  rc = ssh_buffer_add_ssh_string(session->out_buffer,client_pubkey);\n  if (rc < 0) {\n      EC_KEY_free(key);\n      SSH_STRING_FREE(client_pubkey);\n      return SSH_ERROR;\n  }\n\n  session->next_crypto->ecdh_privkey = key;\n  session->next_crypto->ecdh_client_pubkey = client_pubkey;\n\n  /* register the packet callbacks */\n  ssh_packet_set_callbacks(session, &ssh_ecdh_client_callbacks);\n  session->dh_handshake_state = DH_STATE_INIT_SENT;\n\n  rc = ssh_packet_send(session);\n\n  return rc;\n}\n\nint ecdh_build_k(ssh_session session) {\n  const EC_GROUP *group = EC_KEY_get0_group(session->next_crypto->ecdh_privkey);\n  EC_POINT *pubkey;\n  void *buffer;\n  int rc;\n  int len = (EC_GROUP_get_degree(group) + 7) / 8;\n  bignum_CTX ctx = bignum_ctx_new();\n  if (ctx == NULL) {\n    return -1;\n  }\n\n  pubkey = EC_POINT_new(group);\n  if (pubkey == NULL) {\n    bignum_ctx_free(ctx);\n    return -1;\n  }\n\n  if (session->server) {\n      rc = EC_POINT_oct2point(group,\n                              pubkey,\n                              ssh_string_data(session->next_crypto->ecdh_client_pubkey),\n                              ssh_string_len(session->next_crypto->ecdh_client_pubkey),\n                              ctx);\n  } else {\n      rc = EC_POINT_oct2point(group,\n                              pubkey,\n                              ssh_string_data(session->next_crypto->ecdh_server_pubkey),\n                              ssh_string_len(session->next_crypto->ecdh_server_pubkey),\n                              ctx);\n  }\n  bignum_ctx_free(ctx);\n  if (rc <= 0) {\n      EC_POINT_clear_free(pubkey);\n      return -1;\n  }\n\n  buffer = malloc(len);\n  if (buffer == NULL) {\n      EC_POINT_clear_free(pubkey);\n      return -1;\n  }\n\n  rc = ECDH_compute_key(buffer,\n                        len,\n                        pubkey,\n                        session->next_crypto->ecdh_privkey,\n                        NULL);\n  EC_POINT_clear_free(pubkey);\n  if (rc <= 0) {\n      free(buffer);\n      return -1;\n  }\n\n  bignum_bin2bn(buffer, len, &session->next_crypto->shared_secret);\n  free(buffer);\n  if (session->next_crypto->shared_secret == NULL) {\n      EC_KEY_free(session->next_crypto->ecdh_privkey);\n      session->next_crypto->ecdh_privkey = NULL;\n      return -1;\n  }\n  EC_KEY_free(session->next_crypto->ecdh_privkey);\n  session->next_crypto->ecdh_privkey = NULL;\n\n#ifdef DEBUG_CRYPTO\n    ssh_log_hexdump(\"Session server cookie\",\n                   session->next_crypto->server_kex.cookie, 16);\n    ssh_log_hexdump(\"Session client cookie\",\n                   session->next_crypto->client_kex.cookie, 16);\n    ssh_print_bignum(\"Shared secret key\", session->next_crypto->shared_secret);\n#endif\n\n  return 0;\n}\n\n#ifdef WITH_SERVER\n\n/** @brief Handle a SSH_MSG_KEXDH_INIT packet (server) and send a\n * SSH_MSG_KEXDH_REPLY\n */\nSSH_PACKET_CALLBACK(ssh_packet_server_ecdh_init){\n    /* ECDH keys */\n    ssh_string q_c_string;\n    ssh_string q_s_string;\n    EC_KEY *ecdh_key;\n    const EC_GROUP *group;\n    const EC_POINT *ecdh_pubkey;\n    bignum_CTX ctx;\n    /* SSH host keys (rsa,dsa,ecdsa) */\n    ssh_key privkey;\n    enum ssh_digest_e digest = SSH_DIGEST_AUTO;\n    ssh_string sig_blob = NULL;\n    ssh_string pubkey_blob = NULL;\n    int curve;\n    int len;\n    int rc;\n    (void)type;\n    (void)user;\n\n    ssh_packet_remove_callbacks(session, &ssh_ecdh_server_callbacks);\n    /* Extract the client pubkey from the init packet */\n    q_c_string = ssh_buffer_get_ssh_string(packet);\n    if (q_c_string == NULL) {\n        ssh_set_error(session,SSH_FATAL, \"No Q_C ECC point in packet\");\n        goto error;\n    }\n    session->next_crypto->ecdh_client_pubkey = q_c_string;\n\n    /* Build server's keypair */\n\n    ctx = BN_CTX_new();\n\n    curve = ecdh_kex_type_to_curve(session->next_crypto->kex_type);\n    if (curve == SSH_ERROR) {\n        BN_CTX_free(ctx);\n        return SSH_ERROR;\n    }\n\n    ecdh_key = EC_KEY_new_by_curve_name(curve);\n    if (ecdh_key == NULL) {\n        ssh_set_error_oom(session);\n        BN_CTX_free(ctx);\n        goto error;\n    }\n\n    group = EC_KEY_get0_group(ecdh_key);\n    EC_KEY_generate_key(ecdh_key);\n\n    ecdh_pubkey = EC_KEY_get0_public_key(ecdh_key);\n    len = EC_POINT_point2oct(group,\n                             ecdh_pubkey,\n                             POINT_CONVERSION_UNCOMPRESSED,\n                             NULL,\n                             0,\n                             ctx);\n\n    q_s_string = ssh_string_new(len);\n    if (q_s_string == NULL) {\n        EC_KEY_free(ecdh_key);\n        BN_CTX_free(ctx);\n        goto error;\n    }\n\n    EC_POINT_point2oct(group,\n                       ecdh_pubkey,\n                       POINT_CONVERSION_UNCOMPRESSED,\n                       ssh_string_data(q_s_string),\n                       len,\n                       ctx);\n    BN_CTX_free(ctx);\n\n    session->next_crypto->ecdh_privkey = ecdh_key;\n    session->next_crypto->ecdh_server_pubkey = q_s_string;\n\n    /* build k and session_id */\n    rc = ecdh_build_k(session);\n    if (rc < 0) {\n        ssh_set_error(session, SSH_FATAL, \"Cannot build k number\");\n        goto error;\n    }\n\n    /* privkey is not allocated */\n    rc = ssh_get_key_params(session, &privkey, &digest);\n    if (rc == SSH_ERROR) {\n        goto error;\n    }\n\n    rc = ssh_make_sessionid(session);\n    if (rc != SSH_OK) {\n        ssh_set_error(session, SSH_FATAL, \"Could not create a session id\");\n        goto error;\n    }\n\n    sig_blob = ssh_srv_pki_do_sign_sessionid(session, privkey, digest);\n    if (sig_blob == NULL) {\n        ssh_set_error(session, SSH_FATAL, \"Could not sign the session id\");\n        goto error;\n    }\n\n    rc = ssh_dh_get_next_server_publickey_blob(session, &pubkey_blob);\n    if (rc != SSH_OK) {\n        ssh_set_error(session, SSH_FATAL, \"Could not export server public key\");\n        SSH_STRING_FREE(sig_blob);\n        return SSH_ERROR;\n    }\n\n    rc = ssh_buffer_pack(session->out_buffer,\n                         \"bSSS\",\n                         SSH2_MSG_KEXDH_REPLY,\n                         pubkey_blob, /* host's pubkey */\n                         q_s_string, /* ecdh public key */\n                         sig_blob); /* signature blob */\n\n    SSH_STRING_FREE(sig_blob);\n    SSH_STRING_FREE(pubkey_blob);\n\n    if (rc != SSH_OK) {\n        ssh_set_error_oom(session);\n        goto error;\n    }\n\n    SSH_LOG(SSH_LOG_PROTOCOL, \"SSH_MSG_KEXDH_REPLY sent\");\n    rc = ssh_packet_send(session);\n    if (rc == SSH_ERROR) {\n        goto error;\n    }\n\n    /* Send the MSG_NEWKEYS */\n    rc = ssh_buffer_add_u8(session->out_buffer, SSH2_MSG_NEWKEYS);\n    if (rc < 0) {\n        goto error;\n    }\n\n    session->dh_handshake_state = DH_STATE_NEWKEYS_SENT;\n    rc = ssh_packet_send(session);\n    if (rc == SSH_ERROR){\n        goto error;\n    }\n    SSH_LOG(SSH_LOG_PROTOCOL, \"SSH_MSG_NEWKEYS sent\");\n\n    return SSH_PACKET_USED;\nerror:\n    ssh_buffer_reinit(session->out_buffer);\n    session->session_state = SSH_SESSION_STATE_ERROR;\n    return SSH_PACKET_USED;\n}\n\n#endif /* WITH_SERVER */\n\n#endif /* HAVE_ECDH */\n"
  },
  {
    "path": "src/libssh/src/ecdh_gcrypt.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2011-2013 by Aris Adamantiadis\n * Copyright (C) 2016 g10 Code GmbH\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n#include \"libssh/session.h\"\n#include \"libssh/ecdh.h\"\n#include \"libssh/dh.h\"\n#include \"libssh/buffer.h\"\n#include \"libssh/ssh2.h\"\n#include \"libssh/pki.h\"\n#include \"libssh/bignum.h\"\n#include \"libssh/libgcrypt.h\"\n\n#ifdef HAVE_ECDH\n#include <gcrypt.h>\n\n/** @internal\n * @brief Map the given key exchange enum value to its curve name.\n */\nstatic const char *ecdh_kex_type_to_curve(enum ssh_key_exchange_e kex_type) {\n    if (kex_type == SSH_KEX_ECDH_SHA2_NISTP256) {\n        return \"NIST P-256\";\n    } else if (kex_type == SSH_KEX_ECDH_SHA2_NISTP384) {\n        return \"NIST P-384\";\n    } else if (kex_type == SSH_KEX_ECDH_SHA2_NISTP521) {\n        return \"NIST P-521\";\n    }\n    return NULL;\n}\n\n/** @internal\n * @brief Starts ecdh-sha2-nistp{256,384,521} key exchange.\n */\nint ssh_client_ecdh_init(ssh_session session)\n{\n    int rc;\n    gpg_error_t err;\n    ssh_string client_pubkey = NULL;\n    gcry_sexp_t param = NULL;\n    gcry_sexp_t key = NULL;\n    const char *curve = NULL;\n\n    curve = ecdh_kex_type_to_curve(session->next_crypto->kex_type);\n    if (curve == NULL) {\n        rc = SSH_ERROR;\n        goto out;\n    }\n\n    rc = ssh_buffer_add_u8(session->out_buffer, SSH2_MSG_KEX_ECDH_INIT);\n    if (rc < 0) {\n        rc = SSH_ERROR;\n        goto out;\n    }\n\n    err = gcry_sexp_build(&param,\n                          NULL,\n                          \"(genkey(ecdh(curve %s)))\",\n                          curve);\n    if (err) {\n        rc = SSH_ERROR;\n        goto out;\n    }\n\n    err = gcry_pk_genkey(&key, param);\n    if (err) {\n        rc = SSH_ERROR;\n        goto out;\n    }\n\n    client_pubkey = ssh_sexp_extract_mpi(key,\n                                         \"q\",\n                                         GCRYMPI_FMT_USG,\n                                         GCRYMPI_FMT_STD);\n    if (client_pubkey == NULL) {\n        rc = SSH_ERROR;\n        goto out;\n    }\n\n    rc = ssh_buffer_add_ssh_string(session->out_buffer, client_pubkey);\n    if (rc < 0) {\n        rc = SSH_ERROR;\n        goto out;\n    }\n\n    session->next_crypto->ecdh_privkey = key;\n    key = NULL;\n    session->next_crypto->ecdh_client_pubkey = client_pubkey;\n    client_pubkey = NULL;\n\n    /* register the packet callbacks */\n    ssh_packet_set_callbacks(session, &ssh_ecdh_client_callbacks);\n    session->dh_handshake_state = DH_STATE_INIT_SENT;\n\n    rc = ssh_packet_send(session);\n\n out:\n    gcry_sexp_release(param);\n    gcry_sexp_release(key);\n    SSH_STRING_FREE(client_pubkey);\n    return rc;\n}\n\nint ecdh_build_k(ssh_session session)\n{\n    gpg_error_t err;\n    gcry_sexp_t data = NULL;\n    gcry_sexp_t result = NULL;\n    /* We need to get the x coordinate.  Libgcrypt 1.7 and above\n       offers a suitable API for that.  */\n#if (GCRYPT_VERSION_NUMBER >= 0x010700)\n    gcry_mpi_t s = NULL;\n    gcry_mpi_point_t point;\n#else\n    size_t k_len = 0;\n    enum ssh_key_exchange_e kex_type = session->next_crypto->kex_type;\n    ssh_string s;\n#endif\n    ssh_string pubkey_raw;\n    gcry_sexp_t pubkey = NULL;\n    ssh_string privkey = NULL;\n    int rc = SSH_ERROR;\n    const char *curve = NULL;\n\n    curve = ecdh_kex_type_to_curve(session->next_crypto->kex_type);\n    if (curve == NULL) {\n        goto out;\n    }\n\n    pubkey_raw = session->server\n        ? session->next_crypto->ecdh_client_pubkey\n        : session->next_crypto->ecdh_server_pubkey;\n\n    err = gcry_sexp_build(&pubkey,\n                          NULL,\n                          \"(key-data(public-key(ecdh(curve %s)(q %b))))\",\n                          curve,\n                          ssh_string_len(pubkey_raw),\n                          ssh_string_data(pubkey_raw));\n    if (err) {\n        goto out;\n    }\n\n    privkey = ssh_sexp_extract_mpi(session->next_crypto->ecdh_privkey,\n                                   \"d\",\n                                   GCRYMPI_FMT_USG,\n                                   GCRYMPI_FMT_STD);\n    if (privkey == NULL) {\n        goto out;\n    }\n\n    err = gcry_sexp_build(&data, NULL,\n                          \"(data(flags raw)(value %b))\",\n                          ssh_string_len(privkey),\n                          ssh_string_data(privkey));\n    if (err) {\n        goto out;\n    }\n\n    err = gcry_pk_encrypt(&result, data, pubkey);\n    if (err) {\n        goto out;\n    }\n\n#if (GCRYPT_VERSION_NUMBER >= 0x010700)\n    err = gcry_sexp_extract_param(result, \"\", \"s\", &s, NULL);\n    if (err) {\n        goto out;\n    }\n\n    point = gcry_mpi_point_new(0);\n    if (point == NULL) {\n        gcry_mpi_release(s);\n        goto out;\n    }\n\n    err = gcry_mpi_ec_decode_point(point, s, NULL);\n    gcry_mpi_release(s);\n    if (err) {\n        goto out;\n    }\n\n    session->next_crypto->shared_secret = gcry_mpi_new(0);\n    gcry_mpi_point_snatch_get(session->next_crypto->shared_secret,\n                              NULL, NULL, point);\n#else\n    s = ssh_sexp_extract_mpi(result, \"s\", GCRYMPI_FMT_USG, GCRYMPI_FMT_USG);\n    if (s == NULL) {\n        goto out;\n    }\n\n    if (kex_type == SSH_KEX_ECDH_SHA2_NISTP256) {\n        k_len = 65;\n    } else if (kex_type == SSH_KEX_ECDH_SHA2_NISTP384) {\n        k_len = 97;\n    } else if (kex_type == SSH_KEX_ECDH_SHA2_NISTP521) {\n        k_len = 133;\n    } else {\n        ssh_string_burn(s);\n        SSH_STRING_FREE(s);\n        goto out;\n    }\n\n    if (ssh_string_len(s) != k_len) {\n        ssh_string_burn(s);\n        SSH_STRING_FREE(s);\n        goto out;\n    }\n\n    err = gcry_mpi_scan(&session->next_crypto->shared_secret,\n                        GCRYMPI_FMT_USG,\n                        (const char *)ssh_string_data(s) + 1,\n                        k_len / 2,\n                        NULL);\n    ssh_string_burn(s);\n    SSH_STRING_FREE(s);\n    if (err) {\n        goto out;\n    }\n#endif\n\n    rc = SSH_OK;\n    gcry_sexp_release(session->next_crypto->ecdh_privkey);\n    session->next_crypto->ecdh_privkey = NULL;\n\n#ifdef DEBUG_CRYPTO\n    ssh_log_hexdump(\"Session server cookie\",\n                   session->next_crypto->server_kex.cookie, 16);\n    ssh_log_hexdump(\"Session client cookie\",\n                   session->next_crypto->client_kex.cookie, 16);\n    ssh_print_bignum(\"Shared secret key\", session->next_crypto->shared_secret);\n#endif\n\n out:\n    gcry_sexp_release(pubkey);\n    gcry_sexp_release(data);\n    gcry_sexp_release(result);\n    ssh_string_burn(privkey);\n    SSH_STRING_FREE(privkey);\n    return rc;\n}\n\n#ifdef WITH_SERVER\n\n\n/** @brief Handle a SSH_MSG_KEXDH_INIT packet (server) and send a\n * SSH_MSG_KEXDH_REPLY\n */\nSSH_PACKET_CALLBACK(ssh_packet_server_ecdh_init){\n    gpg_error_t err;\n    /* ECDH keys */\n    ssh_string q_c_string;\n    ssh_string q_s_string;\n    gcry_sexp_t param = NULL;\n    gcry_sexp_t key = NULL;\n    /* SSH host keys (rsa,dsa,ecdsa) */\n    ssh_key privkey;\n    enum ssh_digest_e digest = SSH_DIGEST_AUTO;\n    ssh_string sig_blob = NULL;\n    ssh_string pubkey_blob = NULL;\n    int rc = SSH_ERROR;\n    const char *curve = NULL;\n    (void)type;\n    (void)user;\n\n    ssh_packet_remove_callbacks(session, &ssh_ecdh_server_callbacks);\n    curve = ecdh_kex_type_to_curve(session->next_crypto->kex_type);\n    if (curve == NULL) {\n        goto out;\n    }\n\n    /* Extract the client pubkey from the init packet */\n    q_c_string = ssh_buffer_get_ssh_string(packet);\n    if (q_c_string == NULL) {\n        ssh_set_error(session, SSH_FATAL, \"No Q_C ECC point in packet\");\n        goto out;\n    }\n    session->next_crypto->ecdh_client_pubkey = q_c_string;\n\n    /* Build server's keypair */\n    err = gcry_sexp_build(&param, NULL, \"(genkey(ecdh(curve %s) (flags transient-key)))\",\n                          curve);\n    if (err) {\n        goto out;\n    }\n\n    err = gcry_pk_genkey(&key, param);\n    if (err)\n        goto out;\n\n    q_s_string = ssh_sexp_extract_mpi(key,\n                                      \"q\",\n                                      GCRYMPI_FMT_USG,\n                                      GCRYMPI_FMT_STD);\n    if (q_s_string == NULL) {\n        goto out;\n    }\n\n    session->next_crypto->ecdh_privkey = key;\n    key = NULL;\n    session->next_crypto->ecdh_server_pubkey = q_s_string;\n\n    /* build k and session_id */\n    rc = ecdh_build_k(session);\n    if (rc != SSH_OK) {\n        ssh_set_error(session, SSH_FATAL, \"Cannot build k number\");\n        goto out;\n    }\n\n    /* privkey is not allocated */\n    rc = ssh_get_key_params(session, &privkey, &digest);\n    if (rc != SSH_OK) {\n        goto out;\n    }\n\n    rc = ssh_make_sessionid(session);\n    if (rc != SSH_OK) {\n        ssh_set_error(session, SSH_FATAL, \"Could not create a session id\");\n        goto out;\n    }\n\n    sig_blob = ssh_srv_pki_do_sign_sessionid(session, privkey, digest);\n    if (sig_blob == NULL) {\n        ssh_set_error(session, SSH_FATAL, \"Could not sign the session id\");\n        rc = SSH_ERROR;\n        goto out;\n    }\n\n    rc = ssh_dh_get_next_server_publickey_blob(session, &pubkey_blob);\n    if (rc != SSH_OK) {\n        ssh_set_error(session, SSH_FATAL, \"Could not export server public key\");\n        SSH_STRING_FREE(sig_blob);\n        goto out;\n    }\n\n    rc = ssh_buffer_pack(session->out_buffer,\n                         \"bSSS\",\n                         SSH2_MSG_KEXDH_REPLY,\n                         pubkey_blob, /* host's pubkey */\n                         q_s_string, /* ecdh public key */\n                         sig_blob); /* signature blob */\n\n    SSH_STRING_FREE(sig_blob);\n    SSH_STRING_FREE(pubkey_blob);\n\n    if (rc != SSH_OK) {\n        ssh_set_error_oom(session);\n        goto out;\n    }\n\n    SSH_LOG(SSH_LOG_PROTOCOL, \"SSH_MSG_KEXDH_REPLY sent\");\n    rc = ssh_packet_send(session);\n    if (rc != SSH_OK) {\n        goto out;\n    }\n\n\n    /* Send the MSG_NEWKEYS */\n    rc = ssh_buffer_add_u8(session->out_buffer, SSH2_MSG_NEWKEYS);\n    if (rc != SSH_OK) {\n        goto out;\n    }\n\n    session->dh_handshake_state = DH_STATE_NEWKEYS_SENT;\n    rc = ssh_packet_send(session);\n    SSH_LOG(SSH_LOG_PROTOCOL, \"SSH_MSG_NEWKEYS sent\");\n\n out:\n    gcry_sexp_release(param);\n    gcry_sexp_release(key);\n    if (rc == SSH_ERROR) {\n        ssh_buffer_reinit(session->out_buffer);\n        session->session_state = SSH_SESSION_STATE_ERROR;\n    }\n    return SSH_PACKET_USED;\n}\n\n#endif /* WITH_SERVER */\n\n#endif /* HAVE_ECDH */\n"
  },
  {
    "path": "src/libssh/src/ecdh_mbedcrypto.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2017 Sartura d.o.o.\n *\n * Author: Juraj Vijtiuk <juraj.vijtiuk@sartura.hr>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include \"libssh/session.h\"\n#include \"libssh/ecdh.h\"\n#include \"libssh/buffer.h\"\n#include \"libssh/ssh2.h\"\n#include \"libssh/dh.h\"\n#include \"libssh/pki.h\"\n#include \"libssh/bignum.h\"\n#include \"libssh/libmbedcrypto.h\"\n\n#include <mbedtls/ecdh.h>\n#include <mbedtls/ecp.h>\n\n#ifdef HAVE_ECDH\n\nstatic mbedtls_ecp_group_id ecdh_kex_type_to_curve(enum ssh_key_exchange_e kex_type) {\n    if (kex_type == SSH_KEX_ECDH_SHA2_NISTP256) {\n        return MBEDTLS_ECP_DP_SECP256R1;\n    } else if (kex_type == SSH_KEX_ECDH_SHA2_NISTP384) {\n        return MBEDTLS_ECP_DP_SECP384R1;\n    } else if (kex_type == SSH_KEX_ECDH_SHA2_NISTP521) {\n        return MBEDTLS_ECP_DP_SECP521R1;\n    }\n\n    return MBEDTLS_ECP_DP_NONE;\n}\nint ssh_client_ecdh_init(ssh_session session)\n{\n    ssh_string client_pubkey = NULL;\n    mbedtls_ecp_group grp;\n    int rc;\n    mbedtls_ecp_group_id curve;\n\n    curve = ecdh_kex_type_to_curve(session->next_crypto->kex_type);\n    if (curve == MBEDTLS_ECP_DP_NONE) {\n        return SSH_ERROR;\n    }\n\n    rc = ssh_buffer_add_u8(session->out_buffer, SSH2_MSG_KEX_ECDH_INIT);\n    if (rc < 0) {\n        return SSH_ERROR;\n    }\n\n    session->next_crypto->ecdh_privkey = malloc(sizeof(mbedtls_ecp_keypair));\n    if (session->next_crypto->ecdh_privkey == NULL) {\n        return SSH_ERROR;\n    }\n\n    mbedtls_ecp_keypair_init(session->next_crypto->ecdh_privkey);\n    mbedtls_ecp_group_init(&grp);\n\n    rc = mbedtls_ecp_group_load(&grp, curve);\n    if (rc != 0) {\n        rc = SSH_ERROR;\n        goto out;\n    }\n\n    rc = mbedtls_ecp_gen_keypair(&grp,\n                                 &session->next_crypto->ecdh_privkey->d,\n                                 &session->next_crypto->ecdh_privkey->Q,\n                                 mbedtls_ctr_drbg_random,\n                                 ssh_get_mbedtls_ctr_drbg_context());\n\n    if (rc != 0) {\n        rc = SSH_ERROR;\n        goto out;\n    }\n\n    client_pubkey = make_ecpoint_string(&grp,\n            &session->next_crypto->ecdh_privkey->Q);\n    if (client_pubkey == NULL) {\n        rc = SSH_ERROR;\n        goto out;\n    }\n\n    rc = ssh_buffer_add_ssh_string(session->out_buffer, client_pubkey);\n    if (rc < 0) {\n        rc = SSH_ERROR;\n        goto out;\n    }\n\n    session->next_crypto->ecdh_client_pubkey = client_pubkey;\n    client_pubkey = NULL;\n\n    /* register the packet callbacks */\n    ssh_packet_set_callbacks(session, &ssh_ecdh_client_callbacks);\n    session->dh_handshake_state = DH_STATE_INIT_SENT;\n    rc = ssh_packet_send(session);\n\nout:\n    mbedtls_ecp_group_free(&grp);\n    SSH_STRING_FREE(client_pubkey);\n\n    return rc;\n}\n\nint ecdh_build_k(ssh_session session)\n{\n    mbedtls_ecp_group grp;\n    mbedtls_ecp_point pubkey;\n    int rc;\n    mbedtls_ecp_group_id curve;\n\n    curve = ecdh_kex_type_to_curve(session->next_crypto->kex_type);\n    if (curve == MBEDTLS_ECP_DP_NONE) {\n        return SSH_ERROR;\n    }\n\n    mbedtls_ecp_group_init(&grp);\n    mbedtls_ecp_point_init(&pubkey);\n\n    rc = mbedtls_ecp_group_load(&grp, curve);\n    if (rc != 0) {\n        rc = SSH_ERROR;\n        goto out;\n    }\n\n    if (session->server) {\n        rc = mbedtls_ecp_point_read_binary(&grp, &pubkey,\n                ssh_string_data(session->next_crypto->ecdh_client_pubkey),\n                ssh_string_len(session->next_crypto->ecdh_client_pubkey));\n    } else {\n        rc = mbedtls_ecp_point_read_binary(&grp, &pubkey,\n                ssh_string_data(session->next_crypto->ecdh_server_pubkey),\n                ssh_string_len(session->next_crypto->ecdh_server_pubkey));\n    }\n\n    if (rc != 0) {\n        rc = SSH_ERROR;\n        goto out;\n    }\n\n    session->next_crypto->shared_secret = malloc(sizeof(mbedtls_mpi));\n    if (session->next_crypto->shared_secret == NULL) {\n        rc = SSH_ERROR;\n        goto out;\n    }\n\n    mbedtls_mpi_init(session->next_crypto->shared_secret);\n\n    rc = mbedtls_ecdh_compute_shared(&grp,\n                                     session->next_crypto->shared_secret,\n                                     &pubkey,\n                                     &session->next_crypto->ecdh_privkey->d,\n                                     mbedtls_ctr_drbg_random,\n                                     ssh_get_mbedtls_ctr_drbg_context());\n    if (rc != 0) {\n        rc = SSH_ERROR;\n        goto out;\n    }\n\nout:\n    mbedtls_ecp_keypair_free(session->next_crypto->ecdh_privkey);\n    SAFE_FREE(session->next_crypto->ecdh_privkey);\n    mbedtls_ecp_group_free(&grp);\n    mbedtls_ecp_point_free(&pubkey);\n    return rc;\n}\n\n#ifdef WITH_SERVER\n\nSSH_PACKET_CALLBACK(ssh_packet_server_ecdh_init){\n    ssh_string q_c_string = NULL;\n    ssh_string q_s_string = NULL;\n    mbedtls_ecp_group grp;\n    ssh_key privkey = NULL;\n    enum ssh_digest_e digest = SSH_DIGEST_AUTO;\n    ssh_string sig_blob = NULL;\n    ssh_string pubkey_blob = NULL;\n    int rc;\n    mbedtls_ecp_group_id curve;\n    (void)type;\n    (void)user;\n\n    ssh_packet_remove_callbacks(session, &ssh_ecdh_server_callbacks);\n    curve = ecdh_kex_type_to_curve(session->next_crypto->kex_type);\n    if (curve == MBEDTLS_ECP_DP_NONE) {\n        return SSH_ERROR;\n    }\n\n    q_c_string = ssh_buffer_get_ssh_string(packet);\n    if (q_c_string == NULL) {\n        ssh_set_error(session, SSH_FATAL, \"No Q_C ECC point in packet\");\n        return SSH_ERROR;\n    }\n\n    session->next_crypto->ecdh_privkey = malloc(sizeof(mbedtls_ecp_keypair));\n    if (session->next_crypto->ecdh_privkey == NULL) {\n        ssh_set_error_oom(session);\n        return SSH_ERROR;\n    }\n\n    session->next_crypto->ecdh_client_pubkey = q_c_string;\n\n    mbedtls_ecp_group_init(&grp);\n    mbedtls_ecp_keypair_init(session->next_crypto->ecdh_privkey);\n\n    rc = mbedtls_ecp_group_load(&grp, curve);\n    if (rc != 0) {\n        rc = SSH_ERROR;\n        goto out;\n    }\n\n    rc = mbedtls_ecp_gen_keypair(&grp,\n                                 &session->next_crypto->ecdh_privkey->d,\n                                 &session->next_crypto->ecdh_privkey->Q,\n                                 mbedtls_ctr_drbg_random,\n                                 ssh_get_mbedtls_ctr_drbg_context());\n    if (rc != 0) {\n        rc = SSH_ERROR;\n        goto out;\n    }\n\n    q_s_string = make_ecpoint_string(&grp, &session->next_crypto->ecdh_privkey->Q);\n    if (q_s_string == NULL) {\n        rc = SSH_ERROR;\n        goto out;\n    }\n\n    session->next_crypto->ecdh_server_pubkey = q_s_string;\n\n    /* build k and session_id */\n    rc = ecdh_build_k(session);\n    if (rc != SSH_OK) {\n        ssh_set_error(session, SSH_FATAL, \"Cannot build k number\");\n        goto out;\n    }\n\n    /* privkey is not allocated */\n    rc = ssh_get_key_params(session, &privkey, &digest);\n    if (rc == SSH_ERROR) {\n        rc = SSH_ERROR;\n        goto out;\n    }\n\n    rc = ssh_make_sessionid(session);\n    if (rc != SSH_OK) {\n        ssh_set_error(session, SSH_FATAL, \"Could not create a session id\");\n        rc = SSH_ERROR;\n        goto out;\n    }\n\n    sig_blob = ssh_srv_pki_do_sign_sessionid(session, privkey, digest);\n    if (sig_blob == NULL) {\n        ssh_set_error(session, SSH_FATAL, \"Could not sign the session id\");\n        rc = SSH_ERROR;\n        goto out;\n    }\n\n    rc = ssh_dh_get_next_server_publickey_blob(session, &pubkey_blob);\n    if (rc != SSH_OK) {\n        ssh_set_error(session, SSH_FATAL, \"Could not export server public key\");\n        SSH_STRING_FREE(sig_blob);\n        goto out;\n    }\n\n    rc = ssh_buffer_pack(session->out_buffer, \"bSSS\",\n                         SSH2_MSG_KEXDH_REPLY,\n                         pubkey_blob, /* host's pubkey */\n                         q_s_string, /* ecdh public key */\n                         sig_blob); /* signature blob */\n\n    SSH_STRING_FREE(sig_blob);\n    SSH_STRING_FREE(pubkey_blob);\n\n    if (rc != SSH_OK) {\n        ssh_set_error_oom(session);\n        rc = SSH_ERROR;\n        goto out;\n    }\n\n    SSH_LOG(SSH_LOG_PROTOCOL, \"SSH_MSG_KEXDH_REPLY sent\");\n    rc = ssh_packet_send(session);\n    if (rc != SSH_OK) {\n        rc = SSH_ERROR;\n        goto out;\n    }\n\n    rc = ssh_buffer_add_u8(session->out_buffer, SSH2_MSG_NEWKEYS);\n    if (rc < 0) {\n        rc = SSH_ERROR;\n        goto out;\n    }\n\n    session->dh_handshake_state = DH_STATE_NEWKEYS_SENT;\n    rc = ssh_packet_send(session);\n    SSH_LOG(SSH_LOG_PROTOCOL, \"SSH_MSG_NEWKEYS sent\");\n\nout:\n    mbedtls_ecp_group_free(&grp);\n    if (rc == SSH_ERROR) {\n        ssh_buffer_reinit(session->out_buffer);\n        session->session_state = SSH_SESSION_STATE_ERROR;\n    }\n    return SSH_PACKET_USED;\n}\n\n#endif /* WITH_SERVER */\n#endif\n"
  },
  {
    "path": "src/libssh/src/error.c",
    "content": "/*\n * error.c - functions for ssh error handling\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2003-2008 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <stdio.h>\n#include <stdarg.h>\n#include \"libssh/priv.h\"\n#include \"libssh/session.h\"\n\n/**\n * @defgroup libssh_error The SSH error functions.\n * @ingroup libssh\n *\n * Functions for error handling.\n *\n * @{\n */\n\n/**\n * @internal\n *\n * @brief Registers an error with a description.\n *\n * @param  error       The place to store the error.\n *\n * @param  code        The class of error.\n *\n * @param  descr       The description, which can be a format string.\n *\n * @param  ...         The arguments for the format string.\n */\nvoid _ssh_set_error(void *error,\n                    int code,\n                    const char *function,\n                    const char *descr, ...)\n{\n    struct ssh_common_struct *err = error;\n    va_list va;\n\n    va_start(va, descr);\n    vsnprintf(err->error.error_buffer, ERROR_BUFFERLEN, descr, va);\n    va_end(va);\n\n    err->error.error_code = code;\n    if (ssh_get_log_level() >= SSH_LOG_WARN) {\n        ssh_log_function(SSH_LOG_WARN,\n                         function,\n                         err->error.error_buffer);\n    }\n}\n\n/**\n * @internal\n *\n * @brief Registers an out of memory error\n *\n * @param  error       The place to store the error.\n *\n */\nvoid _ssh_set_error_oom(void *error, const char *function)\n{\n    struct error_struct *err = error;\n\n    snprintf(err->error_buffer, sizeof(err->error_buffer),\n            \"%s: Out of memory\", function);\n    err->error_code = SSH_FATAL;\n}\n\n/**\n * @internal\n *\n * @brief Registers an invalid argument error\n *\n * @param  error       The place to store the error.\n *\n * @param  function    The function the error happened in.\n *\n */\nvoid _ssh_set_error_invalid(void *error, const char *function)\n{\n    _ssh_set_error(error, SSH_FATAL, function,\n                   \"Invalid argument in %s\", function);\n}\n\n/**\n * @internal\n *\n * @brief Reset the error code and message\n *\n * @param  error       The place to reset the error.\n */\nvoid ssh_reset_error(void *error)\n{\n    struct ssh_common_struct *err = error;\n\n    ZERO_STRUCT(err->error.error_buffer);\n    err->error.error_code = 0;\n}\n\n/**\n * @brief Retrieve the error text message from the last error.\n *\n * @param  error        An ssh_session or ssh_bind.\n *\n * @return A static string describing the error.\n */\nconst char *ssh_get_error(void *error) {\n  struct error_struct *err = error;\n\n  return err->error_buffer;\n}\n\n/**\n * @brief Retrieve the error code from the last error.\n *\n * @param  error        An ssh_session or ssh_bind.\n *\n * \\return SSH_NO_ERROR       No error occurred\\n\n *         SSH_REQUEST_DENIED The last request was denied but situation is\n *                            recoverable\\n\n *         SSH_FATAL          A fatal error occurred. This could be an unexpected\n *                            disconnection\\n\n *\n *         Other error codes are internal but can be considered same than\n *         SSH_FATAL.\n */\nint ssh_get_error_code(void *error) {\n  struct error_struct *err = error;\n\n  return err->error_code;\n}\n\n/** @} */\n"
  },
  {
    "path": "src/libssh/src/external/bcrypt_pbkdf.c",
    "content": "/* $OpenBSD: bcrypt_pbkdf.c,v 1.4 2013/07/29 00:55:53 tedu Exp $ */\n/*\n * Copyright (c) 2013 Ted Unangst <tedu@openbsd.org>\n *\n * Permission to use, copy, modify, and distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n//#include \"includes.h\"\n\n#ifndef HAVE_BCRYPT_PBKDF\n\n#include \"config.h\"\n\n#include \"libssh/priv.h\"\n#include \"libssh/wrapper.h\"\n#include <stdlib.h>\n#include <sys/types.h>\n#ifdef HAVE_SYS_PARAM_H\n#include <sys/param.h>\n#endif\n\n#include \"libssh/blf.h\"\n#include \"libssh/pki_priv.h\"\n#ifndef SHA512_DIGEST_LENGTH\n#define SHA512_DIGEST_LENGTH SHA512_DIGEST_LEN\n#endif\n\n/*\n * pkcs #5 pbkdf2 implementation using the \"bcrypt\" hash\n *\n * The bcrypt hash function is derived from the bcrypt password hashing\n * function with the following modifications:\n * 1. The input password and salt are preprocessed with SHA512.\n * 2. The output length is expanded to 256 bits.\n * 3. Subsequently the magic string to be encrypted is lengthened and modifed\n *    to \"OxychromaticBlowfishSwatDynamite\"\n * 4. The hash function is defined to perform 64 rounds of initial state\n *    expansion. (More rounds are performed by iterating the hash.)\n *\n * Note that this implementation pulls the SHA512 operations into the caller\n * as a performance optimization.\n *\n * One modification from official pbkdf2. Instead of outputting key material\n * linearly, we mix it. pbkdf2 has a known weakness where if one uses it to\n * generate (i.e.) 512 bits of key material for use as two 256 bit keys, an\n * attacker can merely run once through the outer loop below, but the user\n * always runs it twice. Shuffling output bytes requires computing the\n * entirety of the key material to assemble any subkey. This is something a\n * wise caller could do; we just do it for you.\n */\n\n#define BCRYPT_BLOCKS 8\n#define BCRYPT_HASHSIZE (BCRYPT_BLOCKS * 4)\n\nstatic void\nbcrypt_hash(uint8_t *sha2pass, uint8_t *sha2salt, uint8_t *out)\n{\n\tssh_blf_ctx state;\n\tuint8_t ciphertext[BCRYPT_HASHSIZE] =\n\t    \"OxychromaticBlowfishSwatDynamite\";\n\tuint32_t cdata[BCRYPT_BLOCKS];\n\tint i;\n\tuint16_t j;\n\tuint16_t shalen = SHA512_DIGEST_LENGTH;\n\n\t/* key expansion */\n\tBlowfish_initstate(&state);\n\tBlowfish_expandstate(&state, sha2salt, shalen, sha2pass, shalen);\n\tfor (i = 0; i < 64; i++) {\n\t\tBlowfish_expand0state(&state, sha2salt, shalen);\n\t\tBlowfish_expand0state(&state, sha2pass, shalen);\n\t}\n\n\t/* encryption */\n\tj = 0;\n\tfor (i = 0; i < BCRYPT_BLOCKS; i++)\n\t\tcdata[i] = Blowfish_stream2word(ciphertext, sizeof(ciphertext),\n\t\t    &j);\n\tfor (i = 0; i < 64; i++)\n\t\tssh_blf_enc(&state, cdata, BCRYPT_BLOCKS/2);\n\n\t/* copy out */\n\tfor (i = 0; i < BCRYPT_BLOCKS; i++) {\n\t\tout[4 * i + 3] = (cdata[i] >> 24) & 0xff;\n\t\tout[4 * i + 2] = (cdata[i] >> 16) & 0xff;\n\t\tout[4 * i + 1] = (cdata[i] >> 8) & 0xff;\n\t\tout[4 * i + 0] = cdata[i] & 0xff;\n\t}\n\n\t/* zap */\n\texplicit_bzero(ciphertext, sizeof(ciphertext));\n\texplicit_bzero(cdata, sizeof(cdata));\n\tZERO_STRUCT(state);\n}\n\nint\nbcrypt_pbkdf(const char *pass, size_t passlen, const uint8_t *salt, size_t saltlen,\n    uint8_t *key, size_t keylen, unsigned int rounds)\n{\n\tuint8_t sha2pass[SHA512_DIGEST_LENGTH];\n\tuint8_t sha2salt[SHA512_DIGEST_LENGTH];\n\tuint8_t out[BCRYPT_HASHSIZE];\n\tuint8_t tmpout[BCRYPT_HASHSIZE];\n\tuint8_t *countsalt;\n\tsize_t i, j, amt, stride;\n\tuint32_t count;\n\tsize_t origkeylen = keylen;\n\tSHA512CTX ctx;\n\n\t/* nothing crazy */\n\tif (rounds < 1)\n\t\treturn -1;\n\tif (passlen == 0 || saltlen == 0 || keylen == 0 ||\n\t    keylen > sizeof(out) * sizeof(out) || saltlen > 1<<20)\n\t\treturn -1;\n\tif ((countsalt = calloc(1, saltlen + 4)) == NULL)\n\t\treturn -1;\n\tstride = (keylen + sizeof(out) - 1) / sizeof(out);\n\tamt = (keylen + stride - 1) / stride;\n\n\tmemcpy(countsalt, salt, saltlen);\n\n\t/* collapse password */\n\tctx = sha512_init();\n\tsha512_update(ctx, pass, passlen);\n\tsha512_final(sha2pass, ctx);\n\n\t/* generate key, sizeof(out) at a time */\n\tfor (count = 1; keylen > 0; count++) {\n\t\tcountsalt[saltlen + 0] = (count >> 24) & 0xff;\n\t\tcountsalt[saltlen + 1] = (count >> 16) & 0xff;\n\t\tcountsalt[saltlen + 2] = (count >> 8) & 0xff;\n\t\tcountsalt[saltlen + 3] = count & 0xff;\n\n\t\t/* first round, salt is salt */\n\t\tctx = sha512_init();\n\t\tsha512_update(ctx, countsalt, saltlen + 4);\n\t\tsha512_final(sha2salt, ctx);\n\n\t\tbcrypt_hash(sha2pass, sha2salt, tmpout);\n\t\tmemcpy(out, tmpout, sizeof(out));\n\n\t\tfor (i = 1; i < rounds; i++) {\n\t\t\t/* subsequent rounds, salt is previous output */\n\t\t\tctx = sha512_init();\n\t\t\tsha512_update(ctx, tmpout, sizeof(tmpout));\n\t\t\tsha512_final(sha2salt, ctx);\n\t\t\tbcrypt_hash(sha2pass, sha2salt, tmpout);\n\t\t\tfor (j = 0; j < sizeof(out); j++)\n\t\t\t\tout[j] ^= tmpout[j];\n\t\t}\n\n\t\t/*\n\t\t * pbkdf2 deviation: ouput the key material non-linearly.\n\t\t */\n\t\tamt = MIN(amt, keylen);\n\t\tfor (i = 0; i < amt; i++) {\n\t\t\tsize_t dest = i * stride + (count - 1);\n\t\t\tif (dest >= origkeylen) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tkey[dest] = out[i];\n\t\t}\n\t\tkeylen -= i;\n\t}\n\n\t/* zap */\n\texplicit_bzero(out, sizeof(out));\n\tfree(countsalt);\n\n\treturn 0;\n}\n#endif /* HAVE_BCRYPT_PBKDF */\n"
  },
  {
    "path": "src/libssh/src/external/blowfish.c",
    "content": "/* $OpenBSD: blowfish.c,v 1.18 2004/11/02 17:23:26 hshoexer Exp $ */\n/*\n * Blowfish block cipher for OpenBSD\n * Copyright 1997 Niels Provos <provos@physnet.uni-hamburg.de>\n * All rights reserved.\n *\n * Implementation advice by David Mazieres <dm@lcs.mit.edu>.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n * 3. All advertising materials mentioning features or use of this software\n *    must display the following acknowledgement:\n *      This product includes software developed by Niels Provos.\n * 4. The name of the author may not be used to endorse or promote products\n *    derived from this software without specific prior written permission.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\n * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n/*\n * This code is derived from section 14.3 and the given source\n * in section V of Applied Cryptography, second edition.\n * Blowfish is an unpatented fast block cipher designed by\n * Bruce Schneier.\n */\n\n\n#if !defined(HAVE_BCRYPT_PBKDF) && (!defined(HAVE_BLOWFISH_INITSTATE) || \\\n    !defined(HAVE_BLOWFISH_EXPAND0STATE) || !defined(HAVE_BLF_ENC))\n\n#if 0\n#include <stdio.h>\t\t/* used for debugging */\n#include <string.h>\n#endif\n\n#include <sys/types.h>\n#include <stdint.h>\n\n#include \"libssh/blf.h\"\n\n#undef inline\n#ifdef __GNUC__\n#define inline __inline\n#else\t\t\t\t/* !__GNUC__ */\n#define inline\n#endif\t\t\t\t/* !__GNUC__ */\n\n/* Function for Feistel Networks */\n\n#define F(s, x) ((((s)[        (((x)>>24)&0xFF)]  \\\n\t\t + (s)[0x100 + (((x)>>16)&0xFF)]) \\\n\t\t ^ (s)[0x200 + (((x)>> 8)&0xFF)]) \\\n\t\t + (s)[0x300 + ( (x)     &0xFF)])\n\n#define BLFRND(s,p,i,j,n) (i ^= F(s,j) ^ (p)[n])\n\nvoid\nBlowfish_encipher(ssh_blf_ctx *c, uint32_t *xl, uint32_t *xr)\n{\n\tuint32_t Xl;\n\tuint32_t Xr;\n\tuint32_t *s = c->S[0];\n\tuint32_t *p = c->P;\n\n\tXl = *xl;\n\tXr = *xr;\n\n\tXl ^= p[0];\n\tBLFRND(s, p, Xr, Xl, 1); BLFRND(s, p, Xl, Xr, 2);\n\tBLFRND(s, p, Xr, Xl, 3); BLFRND(s, p, Xl, Xr, 4);\n\tBLFRND(s, p, Xr, Xl, 5); BLFRND(s, p, Xl, Xr, 6);\n\tBLFRND(s, p, Xr, Xl, 7); BLFRND(s, p, Xl, Xr, 8);\n\tBLFRND(s, p, Xr, Xl, 9); BLFRND(s, p, Xl, Xr, 10);\n\tBLFRND(s, p, Xr, Xl, 11); BLFRND(s, p, Xl, Xr, 12);\n\tBLFRND(s, p, Xr, Xl, 13); BLFRND(s, p, Xl, Xr, 14);\n\tBLFRND(s, p, Xr, Xl, 15); BLFRND(s, p, Xl, Xr, 16);\n\n\t*xl = Xr ^ p[17];\n\t*xr = Xl;\n}\n\nvoid\nBlowfish_decipher(ssh_blf_ctx *c, uint32_t *xl, uint32_t *xr)\n{\n\tuint32_t Xl;\n\tuint32_t Xr;\n\tuint32_t *s = c->S[0];\n\tuint32_t *p = c->P;\n\n\tXl = *xl;\n\tXr = *xr;\n\n\tXl ^= p[17];\n\tBLFRND(s, p, Xr, Xl, 16); BLFRND(s, p, Xl, Xr, 15);\n\tBLFRND(s, p, Xr, Xl, 14); BLFRND(s, p, Xl, Xr, 13);\n\tBLFRND(s, p, Xr, Xl, 12); BLFRND(s, p, Xl, Xr, 11);\n\tBLFRND(s, p, Xr, Xl, 10); BLFRND(s, p, Xl, Xr, 9);\n\tBLFRND(s, p, Xr, Xl, 8); BLFRND(s, p, Xl, Xr, 7);\n\tBLFRND(s, p, Xr, Xl, 6); BLFRND(s, p, Xl, Xr, 5);\n\tBLFRND(s, p, Xr, Xl, 4); BLFRND(s, p, Xl, Xr, 3);\n\tBLFRND(s, p, Xr, Xl, 2); BLFRND(s, p, Xl, Xr, 1);\n\n\t*xl = Xr ^ p[0];\n\t*xr = Xl;\n}\n\nvoid\nBlowfish_initstate(ssh_blf_ctx *c)\n{\n\t/* P-box and S-box tables initialized with digits of Pi */\n\n\tstatic const ssh_blf_ctx initstate =\n\t{ {\n\t\t{\n\t\t\t0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,\n\t\t\t0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,\n\t\t\t0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,\n\t\t\t0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,\n\t\t\t0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,\n\t\t\t0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,\n\t\t\t0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,\n\t\t\t0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,\n\t\t\t0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,\n\t\t\t0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,\n\t\t\t0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,\n\t\t\t0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,\n\t\t\t0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,\n\t\t\t0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,\n\t\t\t0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,\n\t\t\t0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,\n\t\t\t0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,\n\t\t\t0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,\n\t\t\t0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,\n\t\t\t0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,\n\t\t\t0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,\n\t\t\t0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,\n\t\t\t0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,\n\t\t\t0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,\n\t\t\t0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,\n\t\t\t0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,\n\t\t\t0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,\n\t\t\t0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,\n\t\t\t0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,\n\t\t\t0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,\n\t\t\t0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,\n\t\t\t0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,\n\t\t\t0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,\n\t\t\t0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,\n\t\t\t0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,\n\t\t\t0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,\n\t\t\t0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,\n\t\t\t0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,\n\t\t\t0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,\n\t\t\t0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,\n\t\t\t0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,\n\t\t\t0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,\n\t\t\t0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,\n\t\t\t0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,\n\t\t\t0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,\n\t\t\t0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,\n\t\t\t0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,\n\t\t\t0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,\n\t\t\t0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,\n\t\t\t0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,\n\t\t\t0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,\n\t\t\t0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,\n\t\t\t0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,\n\t\t\t0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,\n\t\t\t0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,\n\t\t\t0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,\n\t\t\t0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,\n\t\t\t0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,\n\t\t\t0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,\n\t\t\t0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,\n\t\t\t0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,\n\t\t\t0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,\n\t\t\t0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,\n\t\t0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a},\n\t\t{\n\t\t\t0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,\n\t\t\t0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,\n\t\t\t0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,\n\t\t\t0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,\n\t\t\t0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,\n\t\t\t0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,\n\t\t\t0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,\n\t\t\t0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,\n\t\t\t0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,\n\t\t\t0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,\n\t\t\t0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,\n\t\t\t0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,\n\t\t\t0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,\n\t\t\t0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,\n\t\t\t0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,\n\t\t\t0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,\n\t\t\t0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,\n\t\t\t0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,\n\t\t\t0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,\n\t\t\t0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,\n\t\t\t0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,\n\t\t\t0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,\n\t\t\t0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,\n\t\t\t0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,\n\t\t\t0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,\n\t\t\t0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,\n\t\t\t0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,\n\t\t\t0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,\n\t\t\t0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,\n\t\t\t0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,\n\t\t\t0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,\n\t\t\t0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,\n\t\t\t0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,\n\t\t\t0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,\n\t\t\t0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,\n\t\t\t0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,\n\t\t\t0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,\n\t\t\t0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,\n\t\t\t0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,\n\t\t\t0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,\n\t\t\t0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,\n\t\t\t0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,\n\t\t\t0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,\n\t\t\t0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,\n\t\t\t0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,\n\t\t\t0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,\n\t\t\t0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,\n\t\t\t0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,\n\t\t\t0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,\n\t\t\t0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,\n\t\t\t0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,\n\t\t\t0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,\n\t\t\t0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,\n\t\t\t0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,\n\t\t\t0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,\n\t\t\t0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,\n\t\t\t0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,\n\t\t\t0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,\n\t\t\t0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,\n\t\t\t0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,\n\t\t\t0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,\n\t\t\t0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,\n\t\t\t0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,\n\t\t0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7},\n\t\t{\n\t\t\t0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,\n\t\t\t0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,\n\t\t\t0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,\n\t\t\t0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,\n\t\t\t0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,\n\t\t\t0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,\n\t\t\t0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,\n\t\t\t0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,\n\t\t\t0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,\n\t\t\t0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,\n\t\t\t0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,\n\t\t\t0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,\n\t\t\t0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,\n\t\t\t0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,\n\t\t\t0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,\n\t\t\t0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,\n\t\t\t0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,\n\t\t\t0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,\n\t\t\t0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,\n\t\t\t0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,\n\t\t\t0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,\n\t\t\t0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,\n\t\t\t0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,\n\t\t\t0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,\n\t\t\t0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,\n\t\t\t0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,\n\t\t\t0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,\n\t\t\t0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,\n\t\t\t0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,\n\t\t\t0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,\n\t\t\t0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,\n\t\t\t0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,\n\t\t\t0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,\n\t\t\t0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,\n\t\t\t0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,\n\t\t\t0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,\n\t\t\t0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,\n\t\t\t0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,\n\t\t\t0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,\n\t\t\t0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,\n\t\t\t0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,\n\t\t\t0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,\n\t\t\t0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,\n\t\t\t0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,\n\t\t\t0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,\n\t\t\t0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,\n\t\t\t0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,\n\t\t\t0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,\n\t\t\t0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,\n\t\t\t0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,\n\t\t\t0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,\n\t\t\t0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,\n\t\t\t0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,\n\t\t\t0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,\n\t\t\t0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,\n\t\t\t0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,\n\t\t\t0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,\n\t\t\t0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,\n\t\t\t0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,\n\t\t\t0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,\n\t\t\t0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,\n\t\t\t0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,\n\t\t\t0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,\n\t\t0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0},\n\t\t{\n\t\t\t0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,\n\t\t\t0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,\n\t\t\t0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,\n\t\t\t0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,\n\t\t\t0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,\n\t\t\t0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,\n\t\t\t0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,\n\t\t\t0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,\n\t\t\t0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,\n\t\t\t0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,\n\t\t\t0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,\n\t\t\t0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,\n\t\t\t0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,\n\t\t\t0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,\n\t\t\t0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,\n\t\t\t0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,\n\t\t\t0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,\n\t\t\t0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,\n\t\t\t0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,\n\t\t\t0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,\n\t\t\t0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,\n\t\t\t0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,\n\t\t\t0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,\n\t\t\t0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,\n\t\t\t0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,\n\t\t\t0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,\n\t\t\t0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,\n\t\t\t0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,\n\t\t\t0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,\n\t\t\t0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,\n\t\t\t0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,\n\t\t\t0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,\n\t\t\t0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,\n\t\t\t0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,\n\t\t\t0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,\n\t\t\t0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,\n\t\t\t0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,\n\t\t\t0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,\n\t\t\t0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,\n\t\t\t0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,\n\t\t\t0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,\n\t\t\t0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,\n\t\t\t0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,\n\t\t\t0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,\n\t\t\t0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,\n\t\t\t0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,\n\t\t\t0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,\n\t\t\t0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,\n\t\t\t0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,\n\t\t\t0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,\n\t\t\t0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,\n\t\t\t0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,\n\t\t\t0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,\n\t\t\t0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,\n\t\t\t0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,\n\t\t\t0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,\n\t\t\t0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,\n\t\t\t0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,\n\t\t\t0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,\n\t\t\t0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,\n\t\t\t0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,\n\t\t\t0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,\n\t\t\t0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,\n\t\t0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6}\n\t},\n\t{\n\t\t0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,\n\t\t0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,\n\t\t0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,\n\t\t0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,\n\t\t0x9216d5d9, 0x8979fb1b\n\t} };\n\n\t*c = initstate;\n}\n\nuint32_t\nBlowfish_stream2word(const uint8_t *data, uint16_t databytes,\n    uint16_t *current)\n{\n\tuint8_t i;\n\tuint16_t j;\n\tuint32_t temp;\n\n\ttemp = 0x00000000;\n\tj = *current;\n\n\tfor (i = 0; i < 4; i++, j++) {\n\t\tif (j >= databytes)\n\t\t\tj = 0;\n\t\ttemp = (temp << 8) | data[j];\n\t}\n\n\t*current = j;\n\treturn temp;\n}\n\nvoid\nBlowfish_expand0state(ssh_blf_ctx *c, const uint8_t *key, uint16_t keybytes)\n{\n\tuint16_t i;\n\tuint16_t j;\n\tuint16_t k;\n\tuint32_t temp;\n\tuint32_t datal;\n\tuint32_t datar;\n\n\tj = 0;\n\tfor (i = 0; i < BLF_N + 2; i++) {\n\t\t/* Extract 4 int8 to 1 int32 from keystream */\n\t\ttemp = Blowfish_stream2word(key, keybytes, &j);\n\t\tc->P[i] = c->P[i] ^ temp;\n\t}\n\n\tj = 0;\n\tdatal = 0x00000000;\n\tdatar = 0x00000000;\n\tfor (i = 0; i < BLF_N + 2; i += 2) {\n\t\tBlowfish_encipher(c, &datal, &datar);\n\n\t\tc->P[i] = datal;\n\t\tc->P[i + 1] = datar;\n\t}\n\n\tfor (i = 0; i < 4; i++) {\n\t\tfor (k = 0; k < 256; k += 2) {\n\t\t\tBlowfish_encipher(c, &datal, &datar);\n\n\t\t\tc->S[i][k] = datal;\n\t\t\tc->S[i][k + 1] = datar;\n\t\t}\n\t}\n}\n\n\nvoid\nBlowfish_expandstate(ssh_blf_ctx *c, const uint8_t *data, uint16_t databytes,\n    const uint8_t *key, uint16_t keybytes)\n{\n\tuint16_t i;\n\tuint16_t j;\n\tuint16_t k;\n\tuint32_t temp;\n\tuint32_t datal;\n\tuint32_t datar;\n\n\tj = 0;\n\tfor (i = 0; i < BLF_N + 2; i++) {\n\t\t/* Extract 4 int8 to 1 int32 from keystream */\n\t\ttemp = Blowfish_stream2word(key, keybytes, &j);\n\t\tc->P[i] = c->P[i] ^ temp;\n\t}\n\n\tj = 0;\n\tdatal = 0x00000000;\n\tdatar = 0x00000000;\n\tfor (i = 0; i < BLF_N + 2; i += 2) {\n\t\tdatal ^= Blowfish_stream2word(data, databytes, &j);\n\t\tdatar ^= Blowfish_stream2word(data, databytes, &j);\n\t\tBlowfish_encipher(c, &datal, &datar);\n\n\t\tc->P[i] = datal;\n\t\tc->P[i + 1] = datar;\n\t}\n\n\tfor (i = 0; i < 4; i++) {\n\t\tfor (k = 0; k < 256; k += 2) {\n\t\t\tdatal ^= Blowfish_stream2word(data, databytes, &j);\n\t\t\tdatar ^= Blowfish_stream2word(data, databytes, &j);\n\t\t\tBlowfish_encipher(c, &datal, &datar);\n\n\t\t\tc->S[i][k] = datal;\n\t\t\tc->S[i][k + 1] = datar;\n\t\t}\n\t}\n\n}\n\nvoid\nssh_blf_key(ssh_blf_ctx *c, const uint8_t *k, uint16_t len)\n{\n\t/* Initialize S-boxes and subkeys with Pi */\n\tBlowfish_initstate(c);\n\n\t/* Transform S-boxes and subkeys with key */\n\tBlowfish_expand0state(c, k, len);\n}\n\nvoid\nssh_blf_enc(ssh_blf_ctx *c, uint32_t *data, uint16_t blocks)\n{\n\tuint32_t *d;\n\tuint16_t i;\n\n\td = data;\n\tfor (i = 0; i < blocks; i++) {\n\t\tBlowfish_encipher(c, d, d + 1);\n\t\td += 2;\n\t}\n}\n\nvoid\nssh_blf_dec(ssh_blf_ctx *c, uint32_t *data, uint16_t blocks)\n{\n\tuint32_t *d;\n\tuint16_t i;\n\n\td = data;\n\tfor (i = 0; i < blocks; i++) {\n\t\tBlowfish_decipher(c, d, d + 1);\n\t\td += 2;\n\t}\n}\n\nvoid\nssh_blf_ecb_encrypt(ssh_blf_ctx *c, uint8_t *data, uint32_t len)\n{\n\tuint32_t l, r;\n\tuint32_t i;\n\n\tfor (i = 0; i < len; i += 8) {\n\t\tl = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];\n\t\tr = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];\n\t\tBlowfish_encipher(c, &l, &r);\n\t\tdata[0] = l >> 24 & 0xff;\n\t\tdata[1] = l >> 16 & 0xff;\n\t\tdata[2] = l >> 8 & 0xff;\n\t\tdata[3] = l & 0xff;\n\t\tdata[4] = r >> 24 & 0xff;\n\t\tdata[5] = r >> 16 & 0xff;\n\t\tdata[6] = r >> 8 & 0xff;\n\t\tdata[7] = r & 0xff;\n\t\tdata += 8;\n\t}\n}\n\nvoid\nssh_blf_ecb_decrypt(ssh_blf_ctx *c, uint8_t *data, uint32_t len)\n{\n\tuint32_t l, r;\n\tuint32_t i;\n\n\tfor (i = 0; i < len; i += 8) {\n\t\tl = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];\n\t\tr = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];\n\t\tBlowfish_decipher(c, &l, &r);\n\t\tdata[0] = l >> 24 & 0xff;\n\t\tdata[1] = l >> 16 & 0xff;\n\t\tdata[2] = l >> 8 & 0xff;\n\t\tdata[3] = l & 0xff;\n\t\tdata[4] = r >> 24 & 0xff;\n\t\tdata[5] = r >> 16 & 0xff;\n\t\tdata[6] = r >> 8 & 0xff;\n\t\tdata[7] = r & 0xff;\n\t\tdata += 8;\n\t}\n}\n\nvoid\nssh_blf_cbc_encrypt(ssh_blf_ctx *c, uint8_t *iv, uint8_t *data, uint32_t len)\n{\n\tuint32_t l, r;\n\tuint32_t i, j;\n\n\tfor (i = 0; i < len; i += 8) {\n\t\tfor (j = 0; j < 8; j++)\n\t\t\tdata[j] ^= iv[j];\n\t\tl = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];\n\t\tr = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];\n\t\tBlowfish_encipher(c, &l, &r);\n\t\tdata[0] = l >> 24 & 0xff;\n\t\tdata[1] = l >> 16 & 0xff;\n\t\tdata[2] = l >> 8 & 0xff;\n\t\tdata[3] = l & 0xff;\n\t\tdata[4] = r >> 24 & 0xff;\n\t\tdata[5] = r >> 16 & 0xff;\n\t\tdata[6] = r >> 8 & 0xff;\n\t\tdata[7] = r & 0xff;\n\t\tiv = data;\n\t\tdata += 8;\n\t}\n}\n\nvoid\nssh_blf_cbc_decrypt(ssh_blf_ctx *c, uint8_t *iva, uint8_t *data, uint32_t len)\n{\n\tuint32_t l, r;\n\tuint8_t *iv;\n\tuint32_t i, j;\n\n\tiv = data + len - 16;\n\tdata = data + len - 8;\n\tfor (i = len - 8; i >= 8; i -= 8) {\n\t\tl = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];\n\t\tr = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];\n\t\tBlowfish_decipher(c, &l, &r);\n\t\tdata[0] = l >> 24 & 0xff;\n\t\tdata[1] = l >> 16 & 0xff;\n\t\tdata[2] = l >> 8 & 0xff;\n\t\tdata[3] = l & 0xff;\n\t\tdata[4] = r >> 24 & 0xff;\n\t\tdata[5] = r >> 16 & 0xff;\n\t\tdata[6] = r >> 8 & 0xff;\n\t\tdata[7] = r & 0xff;\n\t\tfor (j = 0; j < 8; j++)\n\t\t\tdata[j] ^= iv[j];\n\t\tiv -= 8;\n\t\tdata -= 8;\n\t}\n\tl = data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3];\n\tr = data[4] << 24 | data[5] << 16 | data[6] << 8 | data[7];\n\tBlowfish_decipher(c, &l, &r);\n\tdata[0] = l >> 24 & 0xff;\n\tdata[1] = l >> 16 & 0xff;\n\tdata[2] = l >> 8 & 0xff;\n\tdata[3] = l & 0xff;\n\tdata[4] = r >> 24 & 0xff;\n\tdata[5] = r >> 16 & 0xff;\n\tdata[6] = r >> 8 & 0xff;\n\tdata[7] = r & 0xff;\n\tfor (j = 0; j < 8; j++)\n\t\tdata[j] ^= iva[j];\n}\n\n#if 0\nvoid\nreport(uint32_t data[], uint16_t len)\n{\n\tuint16_t i;\n\tfor (i = 0; i < len; i += 2)\n\t\tprintf(\"Block %0hd: %08lx %08lx.\\n\",\n\t\t    i / 2, data[i], data[i + 1]);\n}\nvoid\nmain(void)\n{\n\n\tssh_blf_ctx c;\n\tchar    key[] = \"AAAAA\";\n\tchar    key2[] = \"abcdefghijklmnopqrstuvwxyz\";\n\n\tuint32_t data[10];\n\tuint32_t data2[] =\n\t{0x424c4f57l, 0x46495348l};\n\n\tuint16_t i;\n\n\t/* First test */\n\tfor (i = 0; i < 10; i++)\n\t\tdata[i] = i;\n\n\tssh_blf_key(&c, (uint8_t *) key, 5);\n\tssh_blf_enc(&c, data, 5);\n\tssh_blf_dec(&c, data, 1);\n\tssh_blf_dec(&c, data + 2, 4);\n\tprintf(\"Should read as 0 - 9.\\n\");\n\treport(data, 10);\n\n\t/* Second test */\n\tssh_blf_key(&c, (uint8_t *) key2, strlen(key2));\n\tssh_blf_enc(&c, data2, 1);\n\tprintf(\"\\nShould read as: 0x324ed0fe 0xf413a203.\\n\");\n\treport(data2, 2);\n\tssh_blf_dec(&c, data2, 1);\n\treport(data2, 2);\n}\n#endif\n\n#endif /* !defined(HAVE_BCRYPT_PBKDF) && (!defined(HAVE_BLOWFISH_INITSTATE) || \\\n    !defined(HAVE_BLOWFISH_EXPAND0STATE) || !defined(HAVE_BLF_ENC)) */\n"
  },
  {
    "path": "src/libssh/src/external/chacha.c",
    "content": "/*\nchacha-merged.c version 20080118\nD. J. Bernstein\nPublic domain.\n */\n\n#include <stdint.h>\n#include <stddef.h>\n#include <sys/types.h>\n\n#include \"libssh/chacha.h\"\n\ntypedef struct chacha_ctx chacha_ctx;\n\n#define U8C(v) (v##U)\n#define U32C(v) (v##U)\n\n#define U8V(v) ((uint8_t)(v) & U8C(0xFF))\n#define U32V(v) ((uint32_t)(v) & U32C(0xFFFFFFFF))\n\n#define ROTL32(v, n) \\\n        (U32V((v) << (n)) | ((v) >> (32 - (n))))\n\n#define U8TO32_LITTLE(p) \\\n        (((uint32_t)((p)[0])      ) | \\\n         ((uint32_t)((p)[1]) <<  8) | \\\n         ((uint32_t)((p)[2]) << 16) | \\\n         ((uint32_t)((p)[3]) << 24))\n\n#define U32TO8_LITTLE(p, v) \\\n        do { \\\n            (p)[0] = U8V((v)      ); \\\n            (p)[1] = U8V((v) >>  8); \\\n            (p)[2] = U8V((v) >> 16); \\\n            (p)[3] = U8V((v) >> 24); \\\n        } while (0)\n\n#define ROTATE(v,c) (ROTL32(v,c))\n#define XOR(v,w) ((v) ^ (w))\n#define PLUS(v,w) (U32V((v) + (w)))\n#define PLUSONE(v) (PLUS((v),1))\n\n#define QUARTERROUND(a,b,c,d) \\\n        a = PLUS(a,b); d = ROTATE(XOR(d,a),16); \\\n        c = PLUS(c,d); b = ROTATE(XOR(b,c),12); \\\n        a = PLUS(a,b); d = ROTATE(XOR(d,a), 8); \\\n        c = PLUS(c,d); b = ROTATE(XOR(b,c), 7);\n\nstatic const char sigma[16] = \"expand 32-byte k\";\nstatic const char tau[16] = \"expand 16-byte k\";\n\nvoid\nchacha_keysetup(chacha_ctx *x,const uint8_t *k,uint32_t kbits)\n{\n    const char *constants;\n\n    x->input[4] = U8TO32_LITTLE(k + 0);\n    x->input[5] = U8TO32_LITTLE(k + 4);\n    x->input[6] = U8TO32_LITTLE(k + 8);\n    x->input[7] = U8TO32_LITTLE(k + 12);\n    if (kbits == 256) { /* recommended */\n        k += 16;\n        constants = sigma;\n    } else { /* kbits == 128 */\n        constants = tau;\n    }\n    x->input[8] = U8TO32_LITTLE(k + 0);\n    x->input[9] = U8TO32_LITTLE(k + 4);\n    x->input[10] = U8TO32_LITTLE(k + 8);\n    x->input[11] = U8TO32_LITTLE(k + 12);\n    x->input[0] = U8TO32_LITTLE(constants + 0);\n    x->input[1] = U8TO32_LITTLE(constants + 4);\n    x->input[2] = U8TO32_LITTLE(constants + 8);\n    x->input[3] = U8TO32_LITTLE(constants + 12);\n}\n\nvoid\nchacha_ivsetup(chacha_ctx *x, const uint8_t *iv, const uint8_t *counter)\n{\n    x->input[12] = counter == NULL ? 0 : U8TO32_LITTLE(counter + 0);\n    x->input[13] = counter == NULL ? 0 : U8TO32_LITTLE(counter + 4);\n    x->input[14] = U8TO32_LITTLE(iv + 0);\n    x->input[15] = U8TO32_LITTLE(iv + 4);\n}\n\nvoid\nchacha_encrypt_bytes(chacha_ctx *x,const uint8_t *m,uint8_t *c,uint32_t bytes)\n{\n    uint32_t x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15;\n    uint32_t j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12, j13, j14, j15;\n    uint8_t *ctarget = NULL;\n    uint8_t tmp[64];\n    uint32_t i;\n\n    if (!bytes) return;\n\n    j0 = x->input[0];\n    j1 = x->input[1];\n    j2 = x->input[2];\n    j3 = x->input[3];\n    j4 = x->input[4];\n    j5 = x->input[5];\n    j6 = x->input[6];\n    j7 = x->input[7];\n    j8 = x->input[8];\n    j9 = x->input[9];\n    j10 = x->input[10];\n    j11 = x->input[11];\n    j12 = x->input[12];\n    j13 = x->input[13];\n    j14 = x->input[14];\n    j15 = x->input[15];\n\n    for (;;) {\n        if (bytes < 64) {\n            for (i = 0;i < bytes;++i) tmp[i] = m[i];\n            m = tmp;\n            ctarget = c;\n            c = tmp;\n        }\n        x0 = j0;\n        x1 = j1;\n        x2 = j2;\n        x3 = j3;\n        x4 = j4;\n        x5 = j5;\n        x6 = j6;\n        x7 = j7;\n        x8 = j8;\n        x9 = j9;\n        x10 = j10;\n        x11 = j11;\n        x12 = j12;\n        x13 = j13;\n        x14 = j14;\n        x15 = j15;\n        for (i = 20;i > 0;i -= 2) {\n            QUARTERROUND( x0, x4, x8,x12)\n                      QUARTERROUND( x1, x5, x9,x13)\n                      QUARTERROUND( x2, x6,x10,x14)\n                      QUARTERROUND( x3, x7,x11,x15)\n                      QUARTERROUND( x0, x5,x10,x15)\n                      QUARTERROUND( x1, x6,x11,x12)\n                      QUARTERROUND( x2, x7, x8,x13)\n                      QUARTERROUND( x3, x4, x9,x14)\n        }\n        x0 = PLUS(x0,j0);\n        x1 = PLUS(x1,j1);\n        x2 = PLUS(x2,j2);\n        x3 = PLUS(x3,j3);\n        x4 = PLUS(x4,j4);\n        x5 = PLUS(x5,j5);\n        x6 = PLUS(x6,j6);\n        x7 = PLUS(x7,j7);\n        x8 = PLUS(x8,j8);\n        x9 = PLUS(x9,j9);\n        x10 = PLUS(x10,j10);\n        x11 = PLUS(x11,j11);\n        x12 = PLUS(x12,j12);\n        x13 = PLUS(x13,j13);\n        x14 = PLUS(x14,j14);\n        x15 = PLUS(x15,j15);\n\n        x0 = XOR(x0,U8TO32_LITTLE(m + 0));\n        x1 = XOR(x1,U8TO32_LITTLE(m + 4));\n        x2 = XOR(x2,U8TO32_LITTLE(m + 8));\n        x3 = XOR(x3,U8TO32_LITTLE(m + 12));\n        x4 = XOR(x4,U8TO32_LITTLE(m + 16));\n        x5 = XOR(x5,U8TO32_LITTLE(m + 20));\n        x6 = XOR(x6,U8TO32_LITTLE(m + 24));\n        x7 = XOR(x7,U8TO32_LITTLE(m + 28));\n        x8 = XOR(x8,U8TO32_LITTLE(m + 32));\n        x9 = XOR(x9,U8TO32_LITTLE(m + 36));\n        x10 = XOR(x10,U8TO32_LITTLE(m + 40));\n        x11 = XOR(x11,U8TO32_LITTLE(m + 44));\n        x12 = XOR(x12,U8TO32_LITTLE(m + 48));\n        x13 = XOR(x13,U8TO32_LITTLE(m + 52));\n        x14 = XOR(x14,U8TO32_LITTLE(m + 56));\n        x15 = XOR(x15,U8TO32_LITTLE(m + 60));\n\n        j12 = PLUSONE(j12);\n        if (!j12) {\n            j13 = PLUSONE(j13);\n            /* stopping at 2^70 bytes per nonce is user's responsibility */\n        }\n\n        U32TO8_LITTLE(c + 0,x0);\n        U32TO8_LITTLE(c + 4,x1);\n        U32TO8_LITTLE(c + 8,x2);\n        U32TO8_LITTLE(c + 12,x3);\n        U32TO8_LITTLE(c + 16,x4);\n        U32TO8_LITTLE(c + 20,x5);\n        U32TO8_LITTLE(c + 24,x6);\n        U32TO8_LITTLE(c + 28,x7);\n        U32TO8_LITTLE(c + 32,x8);\n        U32TO8_LITTLE(c + 36,x9);\n        U32TO8_LITTLE(c + 40,x10);\n        U32TO8_LITTLE(c + 44,x11);\n        U32TO8_LITTLE(c + 48,x12);\n        U32TO8_LITTLE(c + 52,x13);\n        U32TO8_LITTLE(c + 56,x14);\n        U32TO8_LITTLE(c + 60,x15);\n\n        if (bytes <= 64) {\n            if (bytes < 64) {\n                for (i = 0;i < bytes;++i) ctarget[i] = c[i];\n            }\n            x->input[12] = j12;\n            x->input[13] = j13;\n            return;\n        }\n        bytes -= 64;\n        c += 64;\n        m += 64;\n    }\n}\n"
  },
  {
    "path": "src/libssh/src/external/curve25519_ref.c",
    "content": "/*\nversion 20081011\nMatthew Dempsky\nPublic domain.\nDerived from public domain code by D. J. Bernstein.\n*/\n\n#include \"libssh/curve25519.h\"\nstatic const unsigned char base[32] = {9};\n\nint crypto_scalarmult_base(unsigned char *q,\n  const unsigned char *n)\n{\n  return crypto_scalarmult(q,n,base);\n}\n\nstatic void add(unsigned int out[32],const unsigned int a[32],const unsigned int b[32])\n{\n  unsigned int j;\n  unsigned int u;\n  u = 0;\n  for (j = 0;j < 31;++j) { u += a[j] + b[j]; out[j] = u & 255; u >>= 8; }\n  u += a[31] + b[31]; out[31] = u;\n}\n\nstatic void sub(unsigned int out[32],const unsigned int a[32],const unsigned int b[32])\n{\n  unsigned int j;\n  unsigned int u;\n  u = 218;\n  for (j = 0;j < 31;++j) {\n    u += a[j] + 65280 - b[j];\n    out[j] = u & 255;\n    u >>= 8;\n  }\n  u += a[31] - b[31];\n  out[31] = u;\n}\n\nstatic void squeeze(unsigned int a[32])\n{\n  unsigned int j;\n  unsigned int u;\n  u = 0;\n  for (j = 0;j < 31;++j) { u += a[j]; a[j] = u & 255; u >>= 8; }\n  u += a[31]; a[31] = u & 127;\n  u = 19 * (u >> 7);\n  for (j = 0;j < 31;++j) { u += a[j]; a[j] = u & 255; u >>= 8; }\n  u += a[31]; a[31] = u;\n}\n\nstatic const unsigned int minusp[32] = {\n 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128\n} ;\n\nstatic void freeze(unsigned int a[32])\n{\n  unsigned int aorig[32];\n  unsigned int j;\n  unsigned int negative;\n\n  for (j = 0;j < 32;++j) aorig[j] = a[j];\n  add(a,a,minusp);\n  negative = -((a[31] >> 7) & 1);\n  for (j = 0;j < 32;++j) a[j] ^= negative & (aorig[j] ^ a[j]);\n}\n\nstatic void mult(unsigned int out[32],const unsigned int a[32],const unsigned int b[32])\n{\n  unsigned int i;\n  unsigned int j;\n  unsigned int u;\n\n  for (i = 0;i < 32;++i) {\n    u = 0;\n    for (j = 0;j <= i;++j) u += a[j] * b[i - j];\n    for (j = i + 1;j < 32;++j) u += 38 * a[j] * b[i + 32 - j];\n    out[i] = u;\n  }\n  squeeze(out);\n}\n\nstatic void mult121665(unsigned int out[32],const unsigned int a[32])\n{\n  unsigned int j;\n  unsigned int u;\n\n  u = 0;\n  for (j = 0;j < 31;++j) { u += 121665 * a[j]; out[j] = u & 255; u >>= 8; }\n  u += 121665 * a[31]; out[31] = u & 127;\n  u = 19 * (u >> 7);\n  for (j = 0;j < 31;++j) { u += out[j]; out[j] = u & 255; u >>= 8; }\n  u += out[j]; out[j] = u;\n}\n\nstatic void square(unsigned int out[32],const unsigned int a[32])\n{\n  unsigned int i;\n  unsigned int j;\n  unsigned int u;\n\n  for (i = 0;i < 32;++i) {\n    u = 0;\n    for (j = 0;j < i - j;++j) u += a[j] * a[i - j];\n    for (j = i + 1;j < i + 32 - j;++j) u += 38 * a[j] * a[i + 32 - j];\n    u *= 2;\n    if ((i & 1) == 0) {\n      u += a[i / 2] * a[i / 2];\n      u += 38 * a[i / 2 + 16] * a[i / 2 + 16];\n    }\n    out[i] = u;\n  }\n  squeeze(out);\n}\n\nstatic void c_select(unsigned int p[64],unsigned int q[64],const unsigned int r[64],const unsigned int s[64],unsigned int b)\n{\n  unsigned int j;\n  unsigned int t;\n  unsigned int bminus1;\n\n  bminus1 = b - 1;\n  for (j = 0;j < 64;++j) {\n    t = bminus1 & (r[j] ^ s[j]);\n    p[j] = s[j] ^ t;\n    q[j] = r[j] ^ t;\n  }\n}\n\nstatic void mainloop(unsigned int work[64],const unsigned char e[32])\n{\n  unsigned int xzm1[64];\n  unsigned int xzm[64];\n  unsigned int xzmb[64];\n  unsigned int xzm1b[64];\n  unsigned int xznb[64];\n  unsigned int xzn1b[64];\n  unsigned int a0[64];\n  unsigned int a1[64];\n  unsigned int b0[64];\n  unsigned int b1[64];\n  unsigned int c1[64];\n  unsigned int r[32];\n  unsigned int s[32];\n  unsigned int t[32];\n  unsigned int u[32];\n  unsigned int j;\n  unsigned int b;\n  int pos;\n\n  for (j = 0;j < 32;++j) xzm1[j] = work[j];\n  xzm1[32] = 1;\n  for (j = 33;j < 64;++j) xzm1[j] = 0;\n\n  xzm[0] = 1;\n  for (j = 1;j < 64;++j) xzm[j] = 0;\n\n  for (pos = 254;pos >= 0;--pos) {\n    b = e[pos / 8] >> (pos & 7);\n    b &= 1;\n    c_select(xzmb,xzm1b,xzm,xzm1,b);\n    add(a0,xzmb,xzmb + 32);\n    sub(a0 + 32,xzmb,xzmb + 32);\n    add(a1,xzm1b,xzm1b + 32);\n    sub(a1 + 32,xzm1b,xzm1b + 32);\n    square(b0,a0);\n    square(b0 + 32,a0 + 32);\n    mult(b1,a1,a0 + 32);\n    mult(b1 + 32,a1 + 32,a0);\n    add(c1,b1,b1 + 32);\n    sub(c1 + 32,b1,b1 + 32);\n    square(r,c1 + 32);\n    sub(s,b0,b0 + 32);\n    mult121665(t,s);\n    add(u,t,b0);\n    mult(xznb,b0,b0 + 32);\n    mult(xznb + 32,s,u);\n    square(xzn1b,c1);\n    mult(xzn1b + 32,r,work);\n    c_select(xzm,xzm1,xznb,xzn1b,b);\n  }\n\n  for (j = 0;j < 64;++j) work[j] = xzm[j];\n}\n\nstatic void recip(unsigned int out[32],const unsigned int z[32])\n{\n  unsigned int z2[32];\n  unsigned int z9[32];\n  unsigned int z11[32];\n  unsigned int z2_5_0[32];\n  unsigned int z2_10_0[32];\n  unsigned int z2_20_0[32];\n  unsigned int z2_50_0[32];\n  unsigned int z2_100_0[32];\n  unsigned int t0[32];\n  unsigned int t1[32];\n  int i;\n\n  /* 2 */ square(z2,z);\n  /* 4 */ square(t1,z2);\n  /* 8 */ square(t0,t1);\n  /* 9 */ mult(z9,t0,z);\n  /* 11 */ mult(z11,z9,z2);\n  /* 22 */ square(t0,z11);\n  /* 2^5 - 2^0 = 31 */ mult(z2_5_0,t0,z9);\n\n  /* 2^6 - 2^1 */ square(t0,z2_5_0);\n  /* 2^7 - 2^2 */ square(t1,t0);\n  /* 2^8 - 2^3 */ square(t0,t1);\n  /* 2^9 - 2^4 */ square(t1,t0);\n  /* 2^10 - 2^5 */ square(t0,t1);\n  /* 2^10 - 2^0 */ mult(z2_10_0,t0,z2_5_0);\n\n  /* 2^11 - 2^1 */ square(t0,z2_10_0);\n  /* 2^12 - 2^2 */ square(t1,t0);\n  /* 2^20 - 2^10 */ for (i = 2;i < 10;i += 2) { square(t0,t1); square(t1,t0); }\n  /* 2^20 - 2^0 */ mult(z2_20_0,t1,z2_10_0);\n\n  /* 2^21 - 2^1 */ square(t0,z2_20_0);\n  /* 2^22 - 2^2 */ square(t1,t0);\n  /* 2^40 - 2^20 */ for (i = 2;i < 20;i += 2) { square(t0,t1); square(t1,t0); }\n  /* 2^40 - 2^0 */ mult(t0,t1,z2_20_0);\n\n  /* 2^41 - 2^1 */ square(t1,t0);\n  /* 2^42 - 2^2 */ square(t0,t1);\n  /* 2^50 - 2^10 */ for (i = 2;i < 10;i += 2) { square(t1,t0); square(t0,t1); }\n  /* 2^50 - 2^0 */ mult(z2_50_0,t0,z2_10_0);\n\n  /* 2^51 - 2^1 */ square(t0,z2_50_0);\n  /* 2^52 - 2^2 */ square(t1,t0);\n  /* 2^100 - 2^50 */ for (i = 2;i < 50;i += 2) { square(t0,t1); square(t1,t0); }\n  /* 2^100 - 2^0 */ mult(z2_100_0,t1,z2_50_0);\n\n  /* 2^101 - 2^1 */ square(t1,z2_100_0);\n  /* 2^102 - 2^2 */ square(t0,t1);\n  /* 2^200 - 2^100 */ for (i = 2;i < 100;i += 2) { square(t1,t0); square(t0,t1); }\n  /* 2^200 - 2^0 */ mult(t1,t0,z2_100_0);\n\n  /* 2^201 - 2^1 */ square(t0,t1);\n  /* 2^202 - 2^2 */ square(t1,t0);\n  /* 2^250 - 2^50 */ for (i = 2;i < 50;i += 2) { square(t0,t1); square(t1,t0); }\n  /* 2^250 - 2^0 */ mult(t0,t1,z2_50_0);\n\n  /* 2^251 - 2^1 */ square(t1,t0);\n  /* 2^252 - 2^2 */ square(t0,t1);\n  /* 2^253 - 2^3 */ square(t1,t0);\n  /* 2^254 - 2^4 */ square(t0,t1);\n  /* 2^255 - 2^5 */ square(t1,t0);\n  /* 2^255 - 21 */ mult(out,t1,z11);\n}\n\nint crypto_scalarmult(unsigned char *q,\n  const unsigned char *n,\n  const unsigned char *p)\n{\n  unsigned int work[96];\n  unsigned char e[32];\n  unsigned int i;\n  for (i = 0;i < 32;++i) e[i] = n[i];\n  e[0] &= 248;\n  e[31] &= 127;\n  e[31] |= 64;\n  for (i = 0;i < 32;++i) work[i] = p[i];\n  mainloop(work,e);\n  recip(work + 32,work + 32);\n  mult(work + 64,work,work + 32);\n  freeze(work + 64);\n  for (i = 0;i < 32;++i) q[i] = work[64 + i];\n  return 0;\n}\n"
  },
  {
    "path": "src/libssh/src/external/ed25519.c",
    "content": "/* $OpenBSD: ed25519.c,v 1.3 2013/12/09 11:03:45 markus Exp $ */\n\n/*\n * Public Domain, Authors: Daniel J. Bernstein, Niels Duif, Tanja Lange,\n * Peter Schwabe, Bo-Yin Yang.\n * Copied from supercop-20130419/crypto_sign/ed25519/ref/ed25519.c\n */\n\n#include \"config.h\"\n\n#include \"libssh/libcrypto.h\"\n#include \"libssh/wrapper.h\"\n#include \"libssh/ge25519.h\"\n#include \"libssh/sc25519.h\"\n#include \"libssh/ed25519.h\"\n\n/*\n * Public Domain, Author: Daniel J. Bernstein\n * Copied from nacl-20110221/crypto_verify/32/ref/verify.c\n */\n\nstatic int crypto_verify_32(const unsigned char *x,const unsigned char *y)\n{\n    unsigned int differentbits = 0;\n#define F(i) differentbits |= x[i] ^ y[i];\n    F(0)\n    F(1)\n    F(2)\n    F(3)\n    F(4)\n    F(5)\n    F(6)\n    F(7)\n    F(8)\n    F(9)\n    F(10)\n    F(11)\n    F(12)\n    F(13)\n    F(14)\n    F(15)\n    F(16)\n    F(17)\n    F(18)\n    F(19)\n    F(20)\n    F(21)\n    F(22)\n    F(23)\n    F(24)\n    F(25)\n    F(26)\n    F(27)\n    F(28)\n    F(29)\n    F(30)\n    F(31)\n\n    return (1 & ((differentbits - 1) >> 8)) - 1;\n}\n\nstatic void get_hram(unsigned char *hram,\n                     const unsigned char *sm,\n                     const unsigned char *pk,\n                     unsigned char *playground,\n                     uint64_t smlen)\n{\n    uint64_t i;\n    SHA512CTX ctx;\n    for (i =  0;i < 32;++i)    playground[i] = sm[i];\n    for (i = 32;i < 64;++i)    playground[i] = pk[i-32];\n    for (i = 64;i < smlen;++i) playground[i] = sm[i];\n\n    ctx = sha512_init();\n    sha512_update(ctx, playground, smlen);\n    sha512_final(hram, ctx);\n}\n\n\nint crypto_sign_ed25519_keypair(unsigned char *pk,\n                                unsigned char *sk)\n{\n    sc25519 scsk;\n    ge25519 gepk;\n    SHA512CTX ctx;\n    unsigned char extsk[64];\n    int i;\n    int ok;\n\n    ok = ssh_get_random(sk, 32, 0);\n    if (!ok) {\n        return -1;\n    }\n\n    ctx = sha512_init();\n    sha512_update(ctx, sk, 32);\n    sha512_final(extsk, ctx);\n    extsk[0] &= 248;\n    extsk[31] &= 127;\n    extsk[31] |= 64;\n\n    sc25519_from32bytes(&scsk,extsk);\n\n    ge25519_scalarmult_base(&gepk, &scsk);\n    ge25519_pack(pk, &gepk);\n    for(i=0;i<32;i++) {\n        sk[32 + i] = pk[i];\n    }\n\n    return 0;\n}\n\nint crypto_sign_ed25519(unsigned char *sm,\n                        uint64_t *smlen,\n                        const unsigned char *m,\n                        uint64_t mlen,\n                        const unsigned char *sk)\n{\n    sc25519 sck, scs, scsk;\n    ge25519 ger;\n    SHA512CTX ctx;\n    unsigned char r[32];\n    unsigned char s[32];\n    unsigned char extsk[64];\n    uint64_t i;\n    unsigned char hmg[SHA512_DIGEST_LEN];\n    unsigned char hram[SHA512_DIGEST_LEN];\n\n    ctx = sha512_init();\n    sha512_update(ctx, sk, 32);\n    sha512_final(extsk, ctx);\n\n    extsk[0] &= 248;\n    extsk[31] &= 127;\n    extsk[31] |= 64;\n\n    *smlen = mlen + 64;\n    for (i = 0;i < mlen; i++) {\n        sm[64 + i] = m[i];\n    }\n    for (i = 0;i < 32; i++) {\n        sm[32 + i] = extsk[32+i];\n    }\n\n    /* Generate k as h(extsk[32],...,extsk[63],m) */\n    ctx = sha512_init();\n    sha512_update(ctx, sm + 32, mlen + 32);\n    sha512_final(hmg, ctx);\n\n    /* Computation of R */\n    sc25519_from64bytes(&sck, hmg);\n    ge25519_scalarmult_base(&ger, &sck);\n    ge25519_pack(r, &ger);\n\n    /* Computation of s */\n    for (i = 0; i < 32; i++) {\n        sm[i] = r[i];\n    }\n\n    get_hram(hram, sm, sk+32, sm, mlen+64);\n\n    sc25519_from64bytes(&scs, hram);\n    sc25519_from32bytes(&scsk, extsk);\n    sc25519_mul(&scs, &scs, &scsk);\n\n    sc25519_add(&scs, &scs, &sck);\n\n    sc25519_to32bytes(s,&scs); /* cat s */\n    for (i = 0;i < 32; i++) {\n        sm[32 + i] = s[i];\n    }\n\n    return 0;\n}\n\nint crypto_sign_ed25519_open(unsigned char *m,\n                             uint64_t *mlen,\n                             const unsigned char *sm,\n                             uint64_t smlen,\n                             const unsigned char *pk)\n{\n    unsigned int i;\n    int ret;\n    unsigned char t2[32];\n    ge25519 get1, get2;\n    sc25519 schram, scs;\n    unsigned char hram[SHA512_DIGEST_LEN];\n\n    *mlen = (uint64_t) -1;\n    if (smlen < 64) return -1;\n\n    if (ge25519_unpackneg_vartime(&get1, pk)) {\n        return -1;\n    }\n\n    get_hram(hram,sm,pk,m,smlen);\n\n    sc25519_from64bytes(&schram, hram);\n\n    sc25519_from32bytes(&scs, sm+32);\n\n    ge25519_double_scalarmult_vartime(&get2,\n                                      &get1,\n                                      &schram,\n                                      &ge25519_base,\n                                      &scs);\n    ge25519_pack(t2, &get2);\n\n    ret = crypto_verify_32(sm, t2);\n    if (ret != 0) {\n        for (i = 0; i < smlen - 64; i++) {\n            m[i] = sm[i + 64];\n        }\n        *mlen = smlen-64;\n    } else {\n        for (i = 0; i < smlen - 64; i++) {\n            m[i] = 0;\n        }\n    }\n\n    return ret;\n}\n"
  },
  {
    "path": "src/libssh/src/external/fe25519.c",
    "content": "/*\n * Public Domain, Authors: Daniel J. Bernstein, Niels Duif, Tanja Lange,\n * Peter Schwabe, Bo-Yin Yang.\n * Copied from supercop-20130419/crypto_sign/ed25519/ref/fe25519.c\n */\n\n#include \"config.h\"\n\n#define WINDOWSIZE 1 /* Should be 1,2, or 4 */\n#define WINDOWMASK ((1<<WINDOWSIZE)-1)\n\n#include \"libssh/fe25519.h\"\n\nstatic uint32_t equal(uint32_t a,uint32_t b) /* 16-bit inputs */\n{\n    uint32_t x = a ^ b; /* 0: yes; 1..65535: no */\n    x -= 1; /* 4294967295: yes; 0..65534: no */\n    x >>= 31; /* 1: yes; 0: no */\n    return x;\n}\n\nstatic uint32_t ge(uint32_t a,uint32_t b) /* 16-bit inputs */\n{\n    unsigned int x = a;\n\n    x -= (unsigned int) b; /* 0..65535: yes; 4294901761..4294967295: no */\n    x >>= 31; /* 0: yes; 1: no */\n    x ^= 1; /* 1: yes; 0: no */\n\n    return x;\n}\n\nstatic uint32_t times19(uint32_t a)\n{\n    return (a << 4) + (a << 1) + a;\n}\n\nstatic uint32_t times38(uint32_t a)\n{\n    return (a << 5) + (a << 2) + (a << 1);\n}\n\nstatic void reduce_add_sub(fe25519 *r)\n{\n    uint32_t t;\n    int i,rep;\n\n    for(rep = 0; rep < 4; rep++) {\n        t = r->v[31] >> 7;\n        r->v[31] &= 127;\n        t = times19(t);\n        r->v[0] += t;\n        for(i = 0; i < 31; i++) {\n            t = r->v[i] >> 8;\n            r->v[i+1] += t;\n            r->v[i] &= 255;\n        }\n    }\n}\n\nstatic void reduce_mul(fe25519 *r)\n{\n    uint32_t t;\n    int i,rep;\n\n    for(rep = 0; rep < 2; rep++) {\n        t = r->v[31] >> 7;\n        r->v[31] &= 127;\n        t = times19(t);\n        r->v[0] += t;\n        for(i = 0; i < 31; i++) {\n            t = r->v[i] >> 8;\n            r->v[i+1] += t;\n            r->v[i] &= 255;\n        }\n    }\n}\n\n/* reduction modulo 2^255-19 */\nvoid fe25519_freeze(fe25519 *r)\n{\n    int i;\n    uint32_t m = equal(r->v[31],127);\n\n    for (i = 30; i > 0; i--) {\n        m &= equal(r->v[i],255);\n    }\n    m &= ge(r->v[0],237);\n\n    m = -m;\n\n    r->v[31] -= m&127;\n    for (i = 30; i > 0; i--) {\n        r->v[i] -= m&255;\n    }\n    r->v[0] -= m&237;\n}\n\nvoid fe25519_unpack(fe25519 *r, const unsigned char x[32])\n{\n    int i;\n\n    for (i = 0;i < 32; i++) {\n        r->v[i] = x[i];\n    }\n\n    r->v[31] &= 127;\n}\n\n/* Assumes input x being reduced below 2^255 */\nvoid fe25519_pack(unsigned char r[32], const fe25519 *x)\n{\n    int i;\n\n    fe25519 y = *x;\n    fe25519_freeze(&y);\n\n    for (i = 0; i < 32; i++) {\n        r[i] = y.v[i];\n    }\n}\n\nuint32_t fe25519_iszero(const fe25519 *x)\n{\n    int i;\n    uint32_t r;\n\n    fe25519 t = *x;\n    fe25519_freeze(&t);\n\n    r = equal(t.v[0],0);\n    for (i = 1; i < 32; i++) {\n        r &= equal(t.v[i],0);\n    }\n\n    return r;\n}\n\nint fe25519_iseq_vartime(const fe25519 *x, const fe25519 *y)\n{\n    int i;\n\n    fe25519 t1 = *x;\n    fe25519 t2 = *y;\n    fe25519_freeze(&t1);\n    fe25519_freeze(&t2);\n\n    for (i = 0; i < 32; i++) {\n        if(t1.v[i] != t2.v[i]) {\n            return 0;\n        }\n    }\n\n    return 1;\n}\n\nvoid fe25519_cmov(fe25519 *r, const fe25519 *x, unsigned char b)\n{\n    int i;\n    uint32_t mask = b;\n\n    mask = -mask;\n\n    for (i = 0; i < 32; i++) {\n        r->v[i] ^= mask & (x->v[i] ^ r->v[i]);\n    }\n}\n\nunsigned char fe25519_getparity(const fe25519 *x)\n{\n    fe25519 t = *x;\n    fe25519_freeze(&t);\n\n    return t.v[0] & 1;\n}\n\nvoid fe25519_setone(fe25519 *r)\n{\n    int i;\n\n    r->v[0] = 1;\n    for (i = 1; i < 32; i++) {\n        r->v[i]=0;\n    }\n}\n\nvoid fe25519_setzero(fe25519 *r)\n{\n    int i;\n\n    for (i = 0; i < 32; i++) {\n        r->v[i]=0;\n    }\n}\n\nvoid fe25519_neg(fe25519 *r, const fe25519 *x)\n{\n    fe25519 t;\n    int i;\n\n    for (i = 0; i < 32; i++) {\n        t.v[i]=x->v[i];\n    }\n\n    fe25519_setzero(r);\n    fe25519_sub(r, r, &t);\n}\n\nvoid fe25519_add(fe25519 *r, const fe25519 *x, const fe25519 *y)\n{\n    int i;\n\n    for (i = 0; i < 32; i++) {\n        r->v[i] = x->v[i] + y->v[i];\n    }\n\n    reduce_add_sub(r);\n}\n\nvoid fe25519_sub(fe25519 *r, const fe25519 *x, const fe25519 *y)\n{\n    int i;\n    uint32_t t[32];\n\n    t[0] = x->v[0] + 0x1da;\n    t[31] = x->v[31] + 0xfe;\n\n    for (i = 1; i < 31; i++) {\n        t[i] = x->v[i] + 0x1fe;\n    }\n\n    for (i = 0; i < 32; i++) {\n        r->v[i] = t[i] - y->v[i];\n    }\n\n    reduce_add_sub(r);\n}\n\nvoid fe25519_mul(fe25519 *r, const fe25519 *x, const fe25519 *y)\n{\n    int i,j;\n    uint32_t t[63];\n\n    for (i = 0; i < 63; i++) {\n        t[i] = 0;\n    }\n\n    for (i = 0; i < 32; i++) {\n        for (j = 0; j < 32; j++) {\n            t[i+j] += x->v[i] * y->v[j];\n        }\n    }\n\n    for (i = 32; i < 63; i++) {\n        r->v[i-32] = t[i-32] + times38(t[i]);\n    }\n    r->v[31] = t[31]; /* result now in r[0]...r[31] */\n\n    reduce_mul(r);\n}\n\nvoid fe25519_square(fe25519 *r, const fe25519 *x)\n{\n    fe25519_mul(r, x, x);\n}\n\nvoid fe25519_invert(fe25519 *r, const fe25519 *x)\n{\n    fe25519 z2;\n    fe25519 z9;\n    fe25519 z11;\n    fe25519 z2_5_0;\n    fe25519 z2_10_0;\n    fe25519 z2_20_0;\n    fe25519 z2_50_0;\n    fe25519 z2_100_0;\n    fe25519 t0;\n    fe25519 t1;\n    int i;\n\n    /* 2 */ fe25519_square(&z2, x);\n    /* 4 */ fe25519_square(&t1, &z2);\n    /* 8 */ fe25519_square(&t0, &t1);\n    /* 9 */ fe25519_mul(&z9, &t0, x);\n    /* 11 */ fe25519_mul(&z11, &z9, &z2);\n    /* 22 */ fe25519_square(&t0, &z11);\n    /* 2^5 - 2^0 = 31 */ fe25519_mul(&z2_5_0, &t0, &z9);\n\n    /* 2^6 - 2^1 */ fe25519_square(&t0, &z2_5_0);\n    /* 2^7 - 2^2 */ fe25519_square(&t1, &t0);\n    /* 2^8 - 2^3 */ fe25519_square(&t0, &t1);\n    /* 2^9 - 2^4 */ fe25519_square(&t1, &t0);\n    /* 2^10 - 2^5 */ fe25519_square(&t0, &t1);\n    /* 2^10 - 2^0 */ fe25519_mul(&z2_10_0, &t0, &z2_5_0);\n\n    /* 2^11 - 2^1 */ fe25519_square(&t0, &z2_10_0);\n    /* 2^12 - 2^2 */ fe25519_square(&t1, &t0);\n    /* 2^20 - 2^10 */ for (i = 2;i < 10;i += 2) {\n                          fe25519_square(&t0, &t1);\n                          fe25519_square(&t1, &t0);\n    }\n    /* 2^20 - 2^0 */ fe25519_mul(&z2_20_0, &t1, &z2_10_0);\n\n    /* 2^21 - 2^1 */ fe25519_square(&t0, &z2_20_0);\n    /* 2^22 - 2^2 */ fe25519_square(&t1, &t0);\n    /* 2^40 - 2^20 */ for (i = 2;i < 20;i += 2) {\n                          fe25519_square(&t0, &t1);\n                          fe25519_square(&t1,&t0);\n    }\n    /* 2^40 - 2^0 */ fe25519_mul(&t0, &t1, &z2_20_0);\n\n    /* 2^41 - 2^1 */ fe25519_square(&t1, &t0);\n    /* 2^42 - 2^2 */ fe25519_square(&t0, &t1);\n    /* 2^50 - 2^10 */ for (i = 2; i < 10;i += 2) {\n                          fe25519_square(&t1, &t0);\n                          fe25519_square(&t0, &t1);\n    }\n    /* 2^50 - 2^0 */ fe25519_mul(&z2_50_0,&t0,&z2_10_0);\n\n    /* 2^51 - 2^1 */ fe25519_square(&t0, &z2_50_0);\n    /* 2^52 - 2^2 */ fe25519_square(&t1, &t0);\n    /* 2^100 - 2^50 */ for (i = 2; i < 50; i += 2) {\n                           fe25519_square(&t0, &t1);\n                           fe25519_square(&t1,&t0);\n    }\n    /* 2^100 - 2^0 */ fe25519_mul(&z2_100_0, &t1, &z2_50_0);\n\n    /* 2^101 - 2^1 */ fe25519_square(&t1, &z2_100_0);\n    /* 2^102 - 2^2 */ fe25519_square(&t0, &t1);\n    /* 2^200 - 2^100 */ for (i = 2; i < 100; i += 2) {\n                            fe25519_square(&t1, &t0);\n                            fe25519_square(&t0,&t1);\n    }\n    /* 2^200 - 2^0 */ fe25519_mul(&t1, &t0, &z2_100_0);\n\n    /* 2^201 - 2^1 */ fe25519_square(&t0, &t1);\n    /* 2^202 - 2^2 */ fe25519_square(&t1, &t0);\n    /* 2^250 - 2^50 */ for (i = 2;i < 50;i += 2) {\n                           fe25519_square(&t0, &t1);\n                           fe25519_square(&t1,&t0);\n    }\n    /* 2^250 - 2^0 */ fe25519_mul(&t0, &t1, &z2_50_0);\n\n    /* 2^251 - 2^1 */ fe25519_square(&t1, &t0);\n    /* 2^252 - 2^2 */ fe25519_square(&t0, &t1);\n    /* 2^253 - 2^3 */ fe25519_square(&t1, &t0);\n    /* 2^254 - 2^4 */ fe25519_square(&t0, &t1);\n    /* 2^255 - 2^5 */ fe25519_square(&t1, &t0);\n    /* 2^255 - 21 */  fe25519_mul(r, &t1, &z11);\n}\n\nvoid fe25519_pow2523(fe25519 *r, const fe25519 *x)\n{\n    fe25519 z2;\n    fe25519 z9;\n    fe25519 z11;\n    fe25519 z2_5_0;\n    fe25519 z2_10_0;\n    fe25519 z2_20_0;\n    fe25519 z2_50_0;\n    fe25519 z2_100_0;\n    fe25519 t;\n    int i;\n\n    /* 2 */ fe25519_square(&z2, x);\n    /* 4 */ fe25519_square(&t, &z2);\n    /* 8 */ fe25519_square(&t, &t);\n    /* 9 */ fe25519_mul(&z9, &t, x);\n    /* 11 */ fe25519_mul(&z11, &z9, &z2);\n    /* 22 */ fe25519_square(&t, &z11);\n    /* 2^5 - 2^0 = 31 */ fe25519_mul(&z2_5_0, &t, &z9);\n\n    /* 2^6 - 2^1 */ fe25519_square(&t, &z2_5_0);\n    /* 2^10 - 2^5 */ for (i = 1; i < 5; i++) {\n                         fe25519_square(&t,&t);\n    }\n    /* 2^10 - 2^0 */ fe25519_mul(&z2_10_0, &t, &z2_5_0);\n\n    /* 2^11 - 2^1 */ fe25519_square(&t, &z2_10_0);\n    /* 2^20 - 2^10 */ for (i = 1; i < 10; i++) {\n                          fe25519_square(&t, &t);\n    }\n    /* 2^20 - 2^0 */ fe25519_mul(&z2_20_0, &t, &z2_10_0);\n\n    /* 2^21 - 2^1 */ fe25519_square(&t, &z2_20_0);\n    /* 2^40 - 2^20 */ for (i = 1; i < 20; i++) {\n                          fe25519_square(&t,&t);\n    }\n    /* 2^40 - 2^0 */ fe25519_mul(&t, &t, &z2_20_0);\n\n    /* 2^41 - 2^1 */ fe25519_square(&t, &t);\n    /* 2^50 - 2^10 */ for (i = 1; i < 10; i++) {\n                          fe25519_square(&t,&t);\n    }\n    /* 2^50 - 2^0 */ fe25519_mul(&z2_50_0, &t, &z2_10_0);\n\n    /* 2^51 - 2^1 */ fe25519_square(&t, &z2_50_0);\n    /* 2^100 - 2^50 */ for (i = 1; i < 50; i++) {\n                           fe25519_square(&t, &t);\n    }\n    /* 2^100 - 2^0 */ fe25519_mul(&z2_100_0, &t, &z2_50_0);\n\n    /* 2^101 - 2^1 */ fe25519_square(&t, &z2_100_0);\n    /* 2^200 - 2^100 */ for (i = 1; i < 100; i++) {\n                            fe25519_square(&t, &t);\n    }\n    /* 2^200 - 2^0 */ fe25519_mul(&t, &t, &z2_100_0);\n\n    /* 2^201 - 2^1 */ fe25519_square(&t, &t);\n    /* 2^250 - 2^50 */ for (i = 1; i < 50; i++) {\n                           fe25519_square(&t, &t);\n    }\n    /* 2^250 - 2^0 */ fe25519_mul(&t, &t, &z2_50_0);\n\n    /* 2^251 - 2^1 */ fe25519_square(&t, &t);\n    /* 2^252 - 2^2 */ fe25519_square(&t, &t);\n    /* 2^252 - 3 */ fe25519_mul(r, &t, x);\n}\n"
  },
  {
    "path": "src/libssh/src/external/ge25519.c",
    "content": "/* $OpenBSD: ge25519.c,v 1.3 2013/12/09 11:03:45 markus Exp $ */\n\n/*\n * Public Domain, Authors: Daniel J. Bernstein, Niels Duif, Tanja Lange,\n * Peter Schwabe, Bo-Yin Yang.\n * Copied from supercop-20130419/crypto_sign/ed25519/ref/ge25519.c\n */\n\n#include \"config.h\"\n\n#include \"libssh/fe25519.h\"\n#include \"libssh/sc25519.h\"\n#include \"libssh/ge25519.h\"\n\n/*\n * Arithmetic on the twisted Edwards curve -x^2 + y^2 = 1 + dx^2y^2\n * with d = -(121665/121666) = 37095705934669439343138083508754565189542113879843219016388785533085940283555\n * Base point: (15112221349535400772501151409588531511454012693041857206046113283949847762202,46316835694926478169428394003475163141307993866256225615783033603165251855960);\n */\n\n/* d */\nstatic const fe25519 ge25519_ecd = {\n    {0xA3, 0x78, 0x59, 0x13, 0xCA, 0x4D, 0xEB, 0x75,\n     0xAB, 0xD8, 0x41, 0x41, 0x4D, 0x0A, 0x70, 0x00,\n     0x98, 0xE8, 0x79, 0x77, 0x79, 0x40, 0xC7, 0x8C,\n     0x73, 0xFE, 0x6F, 0x2B, 0xEE, 0x6C, 0x03, 0x52}\n};\n\n/* 2*d */\nstatic const fe25519 ge25519_ec2d = {\n    {0x59, 0xF1, 0xB2, 0x26, 0x94, 0x9B, 0xD6, 0xEB,\n     0x56, 0xB1, 0x83, 0x82, 0x9A, 0x14, 0xE0, 0x00,\n     0x30, 0xD1, 0xF3, 0xEE, 0xF2, 0x80, 0x8E, 0x19,\n     0xE7, 0xFC, 0xDF, 0x56, 0xDC, 0xD9, 0x06, 0x24}\n};\n\n/* sqrt(-1) */\nstatic const fe25519 ge25519_sqrtm1 = {\n    {0xB0, 0xA0, 0x0E, 0x4A, 0x27, 0x1B, 0xEE, 0xC4,\n     0x78, 0xE4, 0x2F, 0xAD, 0x06, 0x18, 0x43, 0x2F,\n     0xA7, 0xD7, 0xFB, 0x3D, 0x99, 0x00, 0x4D, 0x2B,\n     0x0B, 0xDF, 0xC1, 0x4F, 0x80, 0x24, 0x83, 0x2B}\n};\n\n#define ge25519_p3 ge25519\n\ntypedef struct {\n  fe25519 x;\n  fe25519 z;\n  fe25519 y;\n  fe25519 t;\n} ge25519_p1p1;\n\ntypedef struct {\n  fe25519 x;\n  fe25519 y;\n  fe25519 z;\n} ge25519_p2;\n\ntypedef struct {\n  fe25519 x;\n  fe25519 y;\n} ge25519_aff;\n\n\n/* Packed coordinates of the base point */\nconst ge25519 ge25519_base = {\n    {{0x1A, 0xD5, 0x25, 0x8F, 0x60, 0x2D, 0x56, 0xC9,\n      0xB2, 0xA7, 0x25, 0x95, 0x60, 0xC7, 0x2C, 0x69,\n      0x5C, 0xDC, 0xD6, 0xFD, 0x31, 0xE2, 0xA4, 0xC0,\n      0xFE, 0x53, 0x6E, 0xCD, 0xD3, 0x36, 0x69, 0x21}},\n    {{0x58, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,\n      0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,\n      0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,\n      0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66}},\n    {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n      0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n    {{0xA3, 0xDD, 0xB7, 0xA5, 0xB3, 0x8A, 0xDE, 0x6D,\n      0xF5, 0x52, 0x51, 0x77, 0x80, 0x9F, 0xF0, 0x20,\n      0x7D, 0xE3, 0xAB, 0x64, 0x8E, 0x4E, 0xEA, 0x66,\n      0x65, 0x76, 0x8B, 0xD7, 0x0F, 0x5F, 0x87, 0x67}}\n};\n\n/* Multiples of the base point in affine representation */\nstatic const ge25519_aff ge25519_base_multiples_affine[425] = {\n#include \"ge25519_base.data\"\n};\n\nstatic void p1p1_to_p2(ge25519_p2 *r, const ge25519_p1p1 *p)\n{\n    fe25519_mul(&r->x, &p->x, &p->t);\n    fe25519_mul(&r->y, &p->y, &p->z);\n    fe25519_mul(&r->z, &p->z, &p->t);\n}\n\nstatic void p1p1_to_p3(ge25519_p3 *r, const ge25519_p1p1 *p)\n{\n    p1p1_to_p2((ge25519_p2 *)r, p);\n    fe25519_mul(&r->t, &p->x, &p->y);\n}\n\nstatic void ge25519_mixadd2(ge25519_p3 *r, const ge25519_aff *q)\n{\n    fe25519 a,b,t1,t2,c,d,e,f,g,h,qt;\n    fe25519_mul(&qt, &q->x, &q->y);\n    fe25519_sub(&a, &r->y, &r->x); /* A = (Y1-X1)*(Y2-X2) */\n    fe25519_add(&b, &r->y, &r->x); /* B = (Y1+X1)*(Y2+X2) */\n    fe25519_sub(&t1, &q->y, &q->x);\n    fe25519_add(&t2, &q->y, &q->x);\n    fe25519_mul(&a, &a, &t1);\n    fe25519_mul(&b, &b, &t2);\n    fe25519_sub(&e, &b, &a); /* E = B-A */\n    fe25519_add(&h, &b, &a); /* H = B+A */\n    fe25519_mul(&c, &r->t, &qt); /* C = T1*k*T2 */\n    fe25519_mul(&c, &c, &ge25519_ec2d);\n    fe25519_add(&d, &r->z, &r->z); /* D = Z1*2 */\n    fe25519_sub(&f, &d, &c); /* F = D-C */\n    fe25519_add(&g, &d, &c); /* G = D+C */\n    fe25519_mul(&r->x, &e, &f);\n    fe25519_mul(&r->y, &h, &g);\n    fe25519_mul(&r->z, &g, &f);\n    fe25519_mul(&r->t, &e, &h);\n}\n\nstatic void add_p1p1(ge25519_p1p1 *r, const ge25519_p3 *p, const ge25519_p3 *q)\n{\n    fe25519 a, b, c, d, t;\n\n    fe25519_sub(&a, &p->y, &p->x); /* A = (Y1-X1)*(Y2-X2) */\n    fe25519_sub(&t, &q->y, &q->x);\n    fe25519_mul(&a, &a, &t);\n    fe25519_add(&b, &p->x, &p->y); /* B = (Y1+X1)*(Y2+X2) */\n    fe25519_add(&t, &q->x, &q->y);\n    fe25519_mul(&b, &b, &t);\n    fe25519_mul(&c, &p->t, &q->t); /* C = T1*k*T2 */\n    fe25519_mul(&c, &c, &ge25519_ec2d);\n    fe25519_mul(&d, &p->z, &q->z); /* D = Z1*2*Z2 */\n    fe25519_add(&d, &d, &d);\n    fe25519_sub(&r->x, &b, &a); /* E = B-A */\n    fe25519_sub(&r->t, &d, &c); /* F = D-C */\n    fe25519_add(&r->z, &d, &c); /* G = D+C */\n    fe25519_add(&r->y, &b, &a); /* H = B+A */\n}\n\n/* See http://www.hyperelliptic.org/EFD/g1p/auto-twisted-extended-1.html#doubling-dbl-2008-hwcd */\nstatic void dbl_p1p1(ge25519_p1p1 *r, const ge25519_p2 *p)\n{\n    fe25519 a,b,c,d;\n    fe25519_square(&a, &p->x);\n    fe25519_square(&b, &p->y);\n    fe25519_square(&c, &p->z);\n    fe25519_add(&c, &c, &c);\n    fe25519_neg(&d, &a);\n\n    fe25519_add(&r->x, &p->x, &p->y);\n    fe25519_square(&r->x, &r->x);\n    fe25519_sub(&r->x, &r->x, &a);\n    fe25519_sub(&r->x, &r->x, &b);\n    fe25519_add(&r->z, &d, &b);\n    fe25519_sub(&r->t, &r->z, &c);\n    fe25519_sub(&r->y, &d, &b);\n}\n\n/* Constant-time version of: if(b) r = p */\nstatic void cmov_aff(ge25519_aff *r, const ge25519_aff *p, unsigned char b)\n{\n    fe25519_cmov(&r->x, &p->x, b);\n    fe25519_cmov(&r->y, &p->y, b);\n}\n\nstatic unsigned char equal(signed char b,signed char c)\n{\n    unsigned char ub = b;\n    unsigned char uc = c;\n    unsigned char x = ub ^ uc; /* 0: yes; 1..255: no */\n    uint32_t y = x; /* 0: yes; 1..255: no */\n\n    y -= 1; /* 4294967295: yes; 0..254: no */\n    y >>= 31; /* 1: yes; 0: no */\n\n    return y;\n}\n\nstatic unsigned char negative(signed char b)\n{\n    unsigned long long x = b; /* 18446744073709551361..18446744073709551615: yes; 0..255: no */\n\n    x >>= 63; /* 1: yes; 0: no */\n\n    return x;\n}\n\nstatic void choose_t(ge25519_aff *t, unsigned long long pos, signed char b)\n{\n    /* constant time */\n    fe25519 v;\n\n    *t = ge25519_base_multiples_affine[5 * pos + 0];\n\n    cmov_aff(t, &ge25519_base_multiples_affine[5 * pos + 1],\n             equal(b,1) | equal(b,-1));\n    cmov_aff(t, &ge25519_base_multiples_affine[5 * pos + 2],\n             equal(b,2) | equal(b,-2));\n    cmov_aff(t, &ge25519_base_multiples_affine[5 * pos + 3],\n             equal(b,3) | equal(b,-3));\n    cmov_aff(t, &ge25519_base_multiples_affine[5 * pos + 4],\n             equal(b,-4));\n\n    fe25519_neg(&v, &t->x);\n    fe25519_cmov(&t->x, &v, negative(b));\n}\n\nstatic void setneutral(ge25519 *r)\n{\n    fe25519_setzero(&r->x);\n    fe25519_setone(&r->y);\n    fe25519_setone(&r->z);\n    fe25519_setzero(&r->t);\n}\n\n/* ********************************************************************\n *                    EXPORTED FUNCTIONS\n ******************************************************************** */\n\n/* return 0 on success, -1 otherwise */\nint ge25519_unpackneg_vartime(ge25519_p3 *r, const unsigned char p[32])\n{\n    unsigned char par;\n\n    fe25519 t, chk, num, den, den2, den4, den6;\n    fe25519_setone(&r->z);\n    par = p[31] >> 7;\n    fe25519_unpack(&r->y, p);\n    fe25519_square(&num, &r->y); /* x = y^2 */\n    fe25519_mul(&den, &num, &ge25519_ecd); /* den = dy^2 */\n    fe25519_sub(&num, &num, &r->z); /* x = y^2-1 */\n    fe25519_add(&den, &r->z, &den); /* den = dy^2+1 */\n\n    /* Computation of sqrt(num/den) */\n    /* 1.: computation of num^((p-5)/8)*den^((7p-35)/8) = (num*den^7)^((p-5)/8) */\n    fe25519_square(&den2, &den);\n    fe25519_square(&den4, &den2);\n    fe25519_mul(&den6, &den4, &den2);\n    fe25519_mul(&t, &den6, &num);\n    fe25519_mul(&t, &t, &den);\n\n    fe25519_pow2523(&t, &t);\n    /* 2. computation of r->x = t * num * den^3 */\n    fe25519_mul(&t, &t, &num);\n    fe25519_mul(&t, &t, &den);\n    fe25519_mul(&t, &t, &den);\n    fe25519_mul(&r->x, &t, &den);\n\n    /* 3. Check whether sqrt computation gave correct result, multiply by sqrt(-1) if not: */\n    fe25519_square(&chk, &r->x);\n    fe25519_mul(&chk, &chk, &den);\n    if (!fe25519_iseq_vartime(&chk, &num)) {\n        fe25519_mul(&r->x, &r->x, &ge25519_sqrtm1);\n    }\n\n    /* 4. Now we have one of the two square roots, except if input was not a square */\n    fe25519_square(&chk, &r->x);\n    fe25519_mul(&chk, &chk, &den);\n    if (!fe25519_iseq_vartime(&chk, &num)) {\n        return -1;\n    }\n\n    /* 5. Choose the desired square root according to parity: */\n    if(fe25519_getparity(&r->x) != (1-par)) {\n        fe25519_neg(&r->x, &r->x);\n    }\n\n    fe25519_mul(&r->t, &r->x, &r->y);\n\n    return 0;\n}\n\nvoid ge25519_pack(unsigned char r[32], const ge25519_p3 *p)\n{\n    fe25519 tx, ty, zi;\n\n    fe25519_invert(&zi, &p->z);\n    fe25519_mul(&tx, &p->x, &zi);\n    fe25519_mul(&ty, &p->y, &zi);\n    fe25519_pack(r, &ty);\n\n    r[31] ^= fe25519_getparity(&tx) << 7;\n}\n\nint ge25519_isneutral_vartime(const ge25519_p3 *p)\n{\n    int ret = 1;\n\n    if (!fe25519_iszero(&p->x)) {\n        ret = 0;\n    }\n\n    if (!fe25519_iseq_vartime(&p->y, &p->z)) {\n        ret = 0;\n    }\n\n    return ret;\n}\n\n/* computes [s1]p1 + [s2]p2 */\nvoid ge25519_double_scalarmult_vartime(ge25519_p3 *r, const ge25519_p3 *p1, const sc25519 *s1, const ge25519_p3 *p2, const sc25519 *s2)\n{\n    ge25519_p1p1 tp1p1;\n    ge25519_p3 pre[16];\n    unsigned char b[127];\n    int i;\n\n    /* precomputation                                                        s2 s1 */\n    setneutral(pre);                                                      /* 00 00 */\n    pre[1] = *p1;                                                         /* 00 01 */\n    dbl_p1p1(&tp1p1,(ge25519_p2 *)p1);      p1p1_to_p3( &pre[2], &tp1p1); /* 00 10 */\n    add_p1p1(&tp1p1,&pre[1], &pre[2]);      p1p1_to_p3( &pre[3], &tp1p1); /* 00 11 */\n    pre[4] = *p2;                                                         /* 01 00 */\n    add_p1p1(&tp1p1,&pre[1], &pre[4]);      p1p1_to_p3( &pre[5], &tp1p1); /* 01 01 */\n    add_p1p1(&tp1p1,&pre[2], &pre[4]);      p1p1_to_p3( &pre[6], &tp1p1); /* 01 10 */\n    add_p1p1(&tp1p1,&pre[3], &pre[4]);      p1p1_to_p3( &pre[7], &tp1p1); /* 01 11 */\n    dbl_p1p1(&tp1p1,(ge25519_p2 *)p2);      p1p1_to_p3( &pre[8], &tp1p1); /* 10 00 */\n    add_p1p1(&tp1p1,&pre[1], &pre[8]);      p1p1_to_p3( &pre[9], &tp1p1); /* 10 01 */\n    dbl_p1p1(&tp1p1,(ge25519_p2 *)&pre[5]); p1p1_to_p3(&pre[10], &tp1p1); /* 10 10 */\n    add_p1p1(&tp1p1,&pre[3], &pre[8]);      p1p1_to_p3(&pre[11], &tp1p1); /* 10 11 */\n    add_p1p1(&tp1p1,&pre[4], &pre[8]);      p1p1_to_p3(&pre[12], &tp1p1); /* 11 00 */\n    add_p1p1(&tp1p1,&pre[1],&pre[12]);      p1p1_to_p3(&pre[13], &tp1p1); /* 11 01 */\n    add_p1p1(&tp1p1,&pre[2],&pre[12]);      p1p1_to_p3(&pre[14], &tp1p1); /* 11 10 */\n    add_p1p1(&tp1p1,&pre[3],&pre[12]);      p1p1_to_p3(&pre[15], &tp1p1); /* 11 11 */\n\n    sc25519_2interleave2(b,s1,s2);\n\n    /* scalar multiplication */\n    *r = pre[b[126]];\n\n    for (i = 125; i >= 0; i--) {\n        dbl_p1p1(&tp1p1, (ge25519_p2 *)r);\n        p1p1_to_p2((ge25519_p2 *) r, &tp1p1);\n        dbl_p1p1(&tp1p1, (ge25519_p2 *)r);\n        if(b[i] != 0) {\n            p1p1_to_p3(r, &tp1p1);\n            add_p1p1(&tp1p1, r, &pre[b[i]]);\n        }\n        if (i != 0) {\n            p1p1_to_p2((ge25519_p2 *)r, &tp1p1);\n        } else {\n            p1p1_to_p3(r, &tp1p1);\n        }\n    }\n}\n\nvoid ge25519_scalarmult_base(ge25519_p3 *r, const sc25519 *s)\n{\n    signed char b[85];\n    int i;\n    ge25519_aff t;\n\n    sc25519_window3(b,s);\n\n    choose_t((ge25519_aff *)r, 0, b[0]);\n    fe25519_setone(&r->z);\n    fe25519_mul(&r->t, &r->x, &r->y);\n    for (i = 1; i < 85; i++) {\n        choose_t(&t, (unsigned long long) i, b[i]);\n        ge25519_mixadd2(r, &t);\n    }\n}\n"
  },
  {
    "path": "src/libssh/src/external/ge25519_base.data",
    "content": "/* $OpenBSD: ge25519_base.data,v 1.3 2013/12/09 11:03:45 markus Exp $ */\n\n/*\n * Public Domain, Authors: Daniel J. Bernstein, Niels Duif, Tanja Lange,\n * Peter Schwabe, Bo-Yin Yang.\n * Copied from supercop-20130419/crypto_sign/ed25519/ref/ge25519_base.data\n */\n\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x1a, 0xd5, 0x25, 0x8f, 0x60, 0x2d, 0x56, 0xc9, 0xb2, 0xa7, 0x25, 0x95, 0x60, 0xc7, 0x2c, 0x69, 0x5c, 0xdc, 0xd6, 0xfd, 0x31, 0xe2, 0xa4, 0xc0, 0xfe, 0x53, 0x6e, 0xcd, 0xd3, 0x36, 0x69, 0x21}} ,\n {{0x58, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66}}},\n{{{0x0e, 0xce, 0x43, 0x28, 0x4e, 0xa1, 0xc5, 0x83, 0x5f, 0xa4, 0xd7, 0x15, 0x45, 0x8e, 0x0d, 0x08, 0xac, 0xe7, 0x33, 0x18, 0x7d, 0x3b, 0x04, 0x3d, 0x6c, 0x04, 0x5a, 0x9f, 0x4c, 0x38, 0xab, 0x36}} ,\n {{0xc9, 0xa3, 0xf8, 0x6a, 0xae, 0x46, 0x5f, 0x0e, 0x56, 0x51, 0x38, 0x64, 0x51, 0x0f, 0x39, 0x97, 0x56, 0x1f, 0xa2, 0xc9, 0xe8, 0x5e, 0xa2, 0x1d, 0xc2, 0x29, 0x23, 0x09, 0xf3, 0xcd, 0x60, 0x22}}},\n{{{0x5c, 0xe2, 0xf8, 0xd3, 0x5f, 0x48, 0x62, 0xac, 0x86, 0x48, 0x62, 0x81, 0x19, 0x98, 0x43, 0x63, 0x3a, 0xc8, 0xda, 0x3e, 0x74, 0xae, 0xf4, 0x1f, 0x49, 0x8f, 0x92, 0x22, 0x4a, 0x9c, 0xae, 0x67}} ,\n {{0xd4, 0xb4, 0xf5, 0x78, 0x48, 0x68, 0xc3, 0x02, 0x04, 0x03, 0x24, 0x67, 0x17, 0xec, 0x16, 0x9f, 0xf7, 0x9e, 0x26, 0x60, 0x8e, 0xa1, 0x26, 0xa1, 0xab, 0x69, 0xee, 0x77, 0xd1, 0xb1, 0x67, 0x12}}},\n{{{0x70, 0xf8, 0xc9, 0xc4, 0x57, 0xa6, 0x3a, 0x49, 0x47, 0x15, 0xce, 0x93, 0xc1, 0x9e, 0x73, 0x1a, 0xf9, 0x20, 0x35, 0x7a, 0xb8, 0xd4, 0x25, 0x83, 0x46, 0xf1, 0xcf, 0x56, 0xdb, 0xa8, 0x3d, 0x20}} ,\n {{0x2f, 0x11, 0x32, 0xca, 0x61, 0xab, 0x38, 0xdf, 0xf0, 0x0f, 0x2f, 0xea, 0x32, 0x28, 0xf2, 0x4c, 0x6c, 0x71, 0xd5, 0x80, 0x85, 0xb8, 0x0e, 0x47, 0xe1, 0x95, 0x15, 0xcb, 0x27, 0xe8, 0xd0, 0x47}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0xc8, 0x84, 0xa5, 0x08, 0xbc, 0xfd, 0x87, 0x3b, 0x99, 0x8b, 0x69, 0x80, 0x7b, 0xc6, 0x3a, 0xeb, 0x93, 0xcf, 0x4e, 0xf8, 0x5c, 0x2d, 0x86, 0x42, 0xb6, 0x71, 0xd7, 0x97, 0x5f, 0xe1, 0x42, 0x67}} ,\n {{0xb4, 0xb9, 0x37, 0xfc, 0xa9, 0x5b, 0x2f, 0x1e, 0x93, 0xe4, 0x1e, 0x62, 0xfc, 0x3c, 0x78, 0x81, 0x8f, 0xf3, 0x8a, 0x66, 0x09, 0x6f, 0xad, 0x6e, 0x79, 0x73, 0xe5, 0xc9, 0x00, 0x06, 0xd3, 0x21}}},\n{{{0xf8, 0xf9, 0x28, 0x6c, 0x6d, 0x59, 0xb2, 0x59, 0x74, 0x23, 0xbf, 0xe7, 0x33, 0x8d, 0x57, 0x09, 0x91, 0x9c, 0x24, 0x08, 0x15, 0x2b, 0xe2, 0xb8, 0xee, 0x3a, 0xe5, 0x27, 0x06, 0x86, 0xa4, 0x23}} ,\n {{0xeb, 0x27, 0x67, 0xc1, 0x37, 0xab, 0x7a, 0xd8, 0x27, 0x9c, 0x07, 0x8e, 0xff, 0x11, 0x6a, 0xb0, 0x78, 0x6e, 0xad, 0x3a, 0x2e, 0x0f, 0x98, 0x9f, 0x72, 0xc3, 0x7f, 0x82, 0xf2, 0x96, 0x96, 0x70}}},\n{{{0x81, 0x6b, 0x88, 0xe8, 0x1e, 0xc7, 0x77, 0x96, 0x0e, 0xa1, 0xa9, 0x52, 0xe0, 0xd8, 0x0e, 0x61, 0x9e, 0x79, 0x2d, 0x95, 0x9c, 0x8d, 0x96, 0xe0, 0x06, 0x40, 0x5d, 0x87, 0x28, 0x5f, 0x98, 0x70}} ,\n {{0xf1, 0x79, 0x7b, 0xed, 0x4f, 0x44, 0xb2, 0xe7, 0x08, 0x0d, 0xc2, 0x08, 0x12, 0xd2, 0x9f, 0xdf, 0xcd, 0x93, 0x20, 0x8a, 0xcf, 0x33, 0xca, 0x6d, 0x89, 0xb9, 0x77, 0xc8, 0x93, 0x1b, 0x4e, 0x60}}},\n{{{0x26, 0x4f, 0x7e, 0x97, 0xf6, 0x40, 0xdd, 0x4f, 0xfc, 0x52, 0x78, 0xf9, 0x90, 0x31, 0x03, 0xe6, 0x7d, 0x56, 0x39, 0x0b, 0x1d, 0x56, 0x82, 0x85, 0xf9, 0x1a, 0x42, 0x17, 0x69, 0x6c, 0xcf, 0x39}} ,\n {{0x69, 0xd2, 0x06, 0x3a, 0x4f, 0x39, 0x2d, 0xf9, 0x38, 0x40, 0x8c, 0x4c, 0xe7, 0x05, 0x12, 0xb4, 0x78, 0x8b, 0xf8, 0xc0, 0xec, 0x93, 0xde, 0x7a, 0x6b, 0xce, 0x2c, 0xe1, 0x0e, 0xa9, 0x34, 0x44}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x0b, 0xa4, 0x3c, 0xb0, 0x0f, 0x7a, 0x51, 0xf1, 0x78, 0xd6, 0xd9, 0x6a, 0xfd, 0x46, 0xe8, 0xb8, 0xa8, 0x79, 0x1d, 0x87, 0xf9, 0x90, 0xf2, 0x9c, 0x13, 0x29, 0xf8, 0x0b, 0x20, 0x64, 0xfa, 0x05}} ,\n {{0x26, 0x09, 0xda, 0x17, 0xaf, 0x95, 0xd6, 0xfb, 0x6a, 0x19, 0x0d, 0x6e, 0x5e, 0x12, 0xf1, 0x99, 0x4c, 0xaa, 0xa8, 0x6f, 0x79, 0x86, 0xf4, 0x72, 0x28, 0x00, 0x26, 0xf9, 0xea, 0x9e, 0x19, 0x3d}}},\n{{{0x87, 0xdd, 0xcf, 0xf0, 0x5b, 0x49, 0xa2, 0x5d, 0x40, 0x7a, 0x23, 0x26, 0xa4, 0x7a, 0x83, 0x8a, 0xb7, 0x8b, 0xd2, 0x1a, 0xbf, 0xea, 0x02, 0x24, 0x08, 0x5f, 0x7b, 0xa9, 0xb1, 0xbe, 0x9d, 0x37}} ,\n {{0xfc, 0x86, 0x4b, 0x08, 0xee, 0xe7, 0xa0, 0xfd, 0x21, 0x45, 0x09, 0x34, 0xc1, 0x61, 0x32, 0x23, 0xfc, 0x9b, 0x55, 0x48, 0x53, 0x99, 0xf7, 0x63, 0xd0, 0x99, 0xce, 0x01, 0xe0, 0x9f, 0xeb, 0x28}}},\n{{{0x47, 0xfc, 0xab, 0x5a, 0x17, 0xf0, 0x85, 0x56, 0x3a, 0x30, 0x86, 0x20, 0x28, 0x4b, 0x8e, 0x44, 0x74, 0x3a, 0x6e, 0x02, 0xf1, 0x32, 0x8f, 0x9f, 0x3f, 0x08, 0x35, 0xe9, 0xca, 0x16, 0x5f, 0x6e}} ,\n {{0x1c, 0x59, 0x1c, 0x65, 0x5d, 0x34, 0xa4, 0x09, 0xcd, 0x13, 0x9c, 0x70, 0x7d, 0xb1, 0x2a, 0xc5, 0x88, 0xaf, 0x0b, 0x60, 0xc7, 0x9f, 0x34, 0x8d, 0xd6, 0xb7, 0x7f, 0xea, 0x78, 0x65, 0x8d, 0x77}}},\n{{{0x56, 0xa5, 0xc2, 0x0c, 0xdd, 0xbc, 0xb8, 0x20, 0x6d, 0x57, 0x61, 0xb5, 0xfb, 0x78, 0xb5, 0xd4, 0x49, 0x54, 0x90, 0x26, 0xc1, 0xcb, 0xe9, 0xe6, 0xbf, 0xec, 0x1d, 0x4e, 0xed, 0x07, 0x7e, 0x5e}} ,\n {{0xc7, 0xf6, 0x6c, 0x56, 0x31, 0x20, 0x14, 0x0e, 0xa8, 0xd9, 0x27, 0xc1, 0x9a, 0x3d, 0x1b, 0x7d, 0x0e, 0x26, 0xd3, 0x81, 0xaa, 0xeb, 0xf5, 0x6b, 0x79, 0x02, 0xf1, 0x51, 0x5c, 0x75, 0x55, 0x0f}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x0a, 0x34, 0xcd, 0x82, 0x3c, 0x33, 0x09, 0x54, 0xd2, 0x61, 0x39, 0x30, 0x9b, 0xfd, 0xef, 0x21, 0x26, 0xd4, 0x70, 0xfa, 0xee, 0xf9, 0x31, 0x33, 0x73, 0x84, 0xd0, 0xb3, 0x81, 0xbf, 0xec, 0x2e}} ,\n {{0xe8, 0x93, 0x8b, 0x00, 0x64, 0xf7, 0x9c, 0xb8, 0x74, 0xe0, 0xe6, 0x49, 0x48, 0x4d, 0x4d, 0x48, 0xb6, 0x19, 0xa1, 0x40, 0xb7, 0xd9, 0x32, 0x41, 0x7c, 0x82, 0x37, 0xa1, 0x2d, 0xdc, 0xd2, 0x54}}},\n{{{0x68, 0x2b, 0x4a, 0x5b, 0xd5, 0xc7, 0x51, 0x91, 0x1d, 0xe1, 0x2a, 0x4b, 0xc4, 0x47, 0xf1, 0xbc, 0x7a, 0xb3, 0xcb, 0xc8, 0xb6, 0x7c, 0xac, 0x90, 0x05, 0xfd, 0xf3, 0xf9, 0x52, 0x3a, 0x11, 0x6b}} ,\n {{0x3d, 0xc1, 0x27, 0xf3, 0x59, 0x43, 0x95, 0x90, 0xc5, 0x96, 0x79, 0xf5, 0xf4, 0x95, 0x65, 0x29, 0x06, 0x9c, 0x51, 0x05, 0x18, 0xda, 0xb8, 0x2e, 0x79, 0x7e, 0x69, 0x59, 0x71, 0x01, 0xeb, 0x1a}}},\n{{{0x15, 0x06, 0x49, 0xb6, 0x8a, 0x3c, 0xea, 0x2f, 0x34, 0x20, 0x14, 0xc3, 0xaa, 0xd6, 0xaf, 0x2c, 0x3e, 0xbd, 0x65, 0x20, 0xe2, 0x4d, 0x4b, 0x3b, 0xeb, 0x9f, 0x4a, 0xc3, 0xad, 0xa4, 0x3b, 0x60}} ,\n {{0xbc, 0x58, 0xe6, 0xc0, 0x95, 0x2a, 0x2a, 0x81, 0x9a, 0x7a, 0xf3, 0xd2, 0x06, 0xbe, 0x48, 0xbc, 0x0c, 0xc5, 0x46, 0xe0, 0x6a, 0xd4, 0xac, 0x0f, 0xd9, 0xcc, 0x82, 0x34, 0x2c, 0xaf, 0xdb, 0x1f}}},\n{{{0xf7, 0x17, 0x13, 0xbd, 0xfb, 0xbc, 0xd2, 0xec, 0x45, 0xb3, 0x15, 0x31, 0xe9, 0xaf, 0x82, 0x84, 0x3d, 0x28, 0xc6, 0xfc, 0x11, 0xf5, 0x41, 0xb5, 0x8b, 0xd3, 0x12, 0x76, 0x52, 0xe7, 0x1a, 0x3c}} ,\n {{0x4e, 0x36, 0x11, 0x07, 0xa2, 0x15, 0x20, 0x51, 0xc4, 0x2a, 0xc3, 0x62, 0x8b, 0x5e, 0x7f, 0xa6, 0x0f, 0xf9, 0x45, 0x85, 0x6c, 0x11, 0x86, 0xb7, 0x7e, 0xe5, 0xd7, 0xf9, 0xc3, 0x91, 0x1c, 0x05}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0xea, 0xd6, 0xde, 0x29, 0x3a, 0x00, 0xb9, 0x02, 0x59, 0xcb, 0x26, 0xc4, 0xba, 0x99, 0xb1, 0x97, 0x2f, 0x8e, 0x00, 0x92, 0x26, 0x4f, 0x52, 0xeb, 0x47, 0x1b, 0x89, 0x8b, 0x24, 0xc0, 0x13, 0x7d}} ,\n {{0xd5, 0x20, 0x5b, 0x80, 0xa6, 0x80, 0x20, 0x95, 0xc3, 0xe9, 0x9f, 0x8e, 0x87, 0x9e, 0x1e, 0x9e, 0x7a, 0xc7, 0xcc, 0x75, 0x6c, 0xa5, 0xf1, 0x91, 0x1a, 0xa8, 0x01, 0x2c, 0xab, 0x76, 0xa9, 0x59}}},\n{{{0xde, 0xc9, 0xb1, 0x31, 0x10, 0x16, 0xaa, 0x35, 0x14, 0x6a, 0xd4, 0xb5, 0x34, 0x82, 0x71, 0xd2, 0x4a, 0x5d, 0x9a, 0x1f, 0x53, 0x26, 0x3c, 0xe5, 0x8e, 0x8d, 0x33, 0x7f, 0xff, 0xa9, 0xd5, 0x17}} ,\n {{0x89, 0xaf, 0xf6, 0xa4, 0x64, 0xd5, 0x10, 0xe0, 0x1d, 0xad, 0xef, 0x44, 0xbd, 0xda, 0x83, 0xac, 0x7a, 0xa8, 0xf0, 0x1c, 0x07, 0xf9, 0xc3, 0x43, 0x6c, 0x3f, 0xb7, 0xd3, 0x87, 0x22, 0x02, 0x73}}},\n{{{0x64, 0x1d, 0x49, 0x13, 0x2f, 0x71, 0xec, 0x69, 0x87, 0xd0, 0x42, 0xee, 0x13, 0xec, 0xe3, 0xed, 0x56, 0x7b, 0xbf, 0xbd, 0x8c, 0x2f, 0x7d, 0x7b, 0x9d, 0x28, 0xec, 0x8e, 0x76, 0x2f, 0x6f, 0x08}} ,\n {{0x22, 0xf5, 0x5f, 0x4d, 0x15, 0xef, 0xfc, 0x4e, 0x57, 0x03, 0x36, 0x89, 0xf0, 0xeb, 0x5b, 0x91, 0xd6, 0xe2, 0xca, 0x01, 0xa5, 0xee, 0x52, 0xec, 0xa0, 0x3c, 0x8f, 0x33, 0x90, 0x5a, 0x94, 0x72}}},\n{{{0x8a, 0x4b, 0xe7, 0x38, 0xbc, 0xda, 0xc2, 0xb0, 0x85, 0xe1, 0x4a, 0xfe, 0x2d, 0x44, 0x84, 0xcb, 0x20, 0x6b, 0x2d, 0xbf, 0x11, 0x9c, 0xd7, 0xbe, 0xd3, 0x3e, 0x5f, 0xbf, 0x68, 0xbc, 0xa8, 0x07}} ,\n {{0x01, 0x89, 0x28, 0x22, 0x6a, 0x78, 0xaa, 0x29, 0x03, 0xc8, 0x74, 0x95, 0x03, 0x3e, 0xdc, 0xbd, 0x07, 0x13, 0xa8, 0xa2, 0x20, 0x2d, 0xb3, 0x18, 0x70, 0x42, 0xfd, 0x7a, 0xc4, 0xd7, 0x49, 0x72}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x02, 0xff, 0x32, 0x2b, 0x5c, 0x93, 0x54, 0x32, 0xe8, 0x57, 0x54, 0x1a, 0x8b, 0x33, 0x60, 0x65, 0xd3, 0x67, 0xa4, 0xc1, 0x26, 0xc4, 0xa4, 0x34, 0x1f, 0x9b, 0xa7, 0xa9, 0xf4, 0xd9, 0x4f, 0x5b}} ,\n {{0x46, 0x8d, 0xb0, 0x33, 0x54, 0x26, 0x5b, 0x68, 0xdf, 0xbb, 0xc5, 0xec, 0xc2, 0xf9, 0x3c, 0x5a, 0x37, 0xc1, 0x8e, 0x27, 0x47, 0xaa, 0x49, 0x5a, 0xf8, 0xfb, 0x68, 0x04, 0x23, 0xd1, 0xeb, 0x40}}},\n{{{0x65, 0xa5, 0x11, 0x84, 0x8a, 0x67, 0x9d, 0x9e, 0xd1, 0x44, 0x68, 0x7a, 0x34, 0xe1, 0x9f, 0xa3, 0x54, 0xcd, 0x07, 0xca, 0x79, 0x1f, 0x54, 0x2f, 0x13, 0x70, 0x4e, 0xee, 0xa2, 0xfa, 0xe7, 0x5d}} ,\n {{0x36, 0xec, 0x54, 0xf8, 0xce, 0xe4, 0x85, 0xdf, 0xf6, 0x6f, 0x1d, 0x90, 0x08, 0xbc, 0xe8, 0xc0, 0x92, 0x2d, 0x43, 0x6b, 0x92, 0xa9, 0x8e, 0xab, 0x0a, 0x2e, 0x1c, 0x1e, 0x64, 0x23, 0x9f, 0x2c}}},\n{{{0xa7, 0xd6, 0x2e, 0xd5, 0xcc, 0xd4, 0xcb, 0x5a, 0x3b, 0xa7, 0xf9, 0x46, 0x03, 0x1d, 0xad, 0x2b, 0x34, 0x31, 0x90, 0x00, 0x46, 0x08, 0x82, 0x14, 0xc4, 0xe0, 0x9c, 0xf0, 0xe3, 0x55, 0x43, 0x31}} ,\n {{0x60, 0xd6, 0xdd, 0x78, 0xe6, 0xd4, 0x22, 0x42, 0x1f, 0x00, 0xf9, 0xb1, 0x6a, 0x63, 0xe2, 0x92, 0x59, 0xd1, 0x1a, 0xb7, 0x00, 0x54, 0x29, 0xc9, 0xc1, 0xf6, 0x6f, 0x7a, 0xc5, 0x3c, 0x5f, 0x65}}},\n{{{0x27, 0x4f, 0xd0, 0x72, 0xb1, 0x11, 0x14, 0x27, 0x15, 0x94, 0x48, 0x81, 0x7e, 0x74, 0xd8, 0x32, 0xd5, 0xd1, 0x11, 0x28, 0x60, 0x63, 0x36, 0x32, 0x37, 0xb5, 0x13, 0x1c, 0xa0, 0x37, 0xe3, 0x74}} ,\n {{0xf1, 0x25, 0x4e, 0x11, 0x96, 0x67, 0xe6, 0x1c, 0xc2, 0xb2, 0x53, 0xe2, 0xda, 0x85, 0xee, 0xb2, 0x9f, 0x59, 0xf3, 0xba, 0xbd, 0xfa, 0xcf, 0x6e, 0xf9, 0xda, 0xa4, 0xb3, 0x02, 0x8f, 0x64, 0x08}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x34, 0x94, 0xf2, 0x64, 0x54, 0x47, 0x37, 0x07, 0x40, 0x8a, 0x20, 0xba, 0x4a, 0x55, 0xd7, 0x3f, 0x47, 0xba, 0x25, 0x23, 0x14, 0xb0, 0x2c, 0xe8, 0x55, 0xa8, 0xa6, 0xef, 0x51, 0xbd, 0x6f, 0x6a}} ,\n {{0x71, 0xd6, 0x16, 0x76, 0xb2, 0x06, 0xea, 0x79, 0xf5, 0xc4, 0xc3, 0x52, 0x7e, 0x61, 0xd1, 0xe1, 0xad, 0x70, 0x78, 0x1d, 0x16, 0x11, 0xf8, 0x7c, 0x2b, 0xfc, 0x55, 0x9f, 0x52, 0xf8, 0xf5, 0x16}}},\n{{{0x34, 0x96, 0x9a, 0xf6, 0xc5, 0xe0, 0x14, 0x03, 0x24, 0x0e, 0x4c, 0xad, 0x9e, 0x9a, 0x70, 0x23, 0x96, 0xb2, 0xf1, 0x2e, 0x9d, 0xc3, 0x32, 0x9b, 0x54, 0xa5, 0x73, 0xde, 0x88, 0xb1, 0x3e, 0x24}} ,\n {{0xf6, 0xe2, 0x4c, 0x1f, 0x5b, 0xb2, 0xaf, 0x82, 0xa5, 0xcf, 0x81, 0x10, 0x04, 0xef, 0xdb, 0xa2, 0xcc, 0x24, 0xb2, 0x7e, 0x0b, 0x7a, 0xeb, 0x01, 0xd8, 0x52, 0xf4, 0x51, 0x89, 0x29, 0x79, 0x37}}},\n{{{0x74, 0xde, 0x12, 0xf3, 0x68, 0xb7, 0x66, 0xc3, 0xee, 0x68, 0xdc, 0x81, 0xb5, 0x55, 0x99, 0xab, 0xd9, 0x28, 0x63, 0x6d, 0x8b, 0x40, 0x69, 0x75, 0x6c, 0xcd, 0x5c, 0x2a, 0x7e, 0x32, 0x7b, 0x29}} ,\n {{0x02, 0xcc, 0x22, 0x74, 0x4d, 0x19, 0x07, 0xc0, 0xda, 0xb5, 0x76, 0x51, 0x2a, 0xaa, 0xa6, 0x0a, 0x5f, 0x26, 0xd4, 0xbc, 0xaf, 0x48, 0x88, 0x7f, 0x02, 0xbc, 0xf2, 0xe1, 0xcf, 0xe9, 0xdd, 0x15}}},\n{{{0xed, 0xb5, 0x9a, 0x8c, 0x9a, 0xdd, 0x27, 0xf4, 0x7f, 0x47, 0xd9, 0x52, 0xa7, 0xcd, 0x65, 0xa5, 0x31, 0x22, 0xed, 0xa6, 0x63, 0x5b, 0x80, 0x4a, 0xad, 0x4d, 0xed, 0xbf, 0xee, 0x49, 0xb3, 0x06}} ,\n {{0xf8, 0x64, 0x8b, 0x60, 0x90, 0xe9, 0xde, 0x44, 0x77, 0xb9, 0x07, 0x36, 0x32, 0xc2, 0x50, 0xf5, 0x65, 0xdf, 0x48, 0x4c, 0x37, 0xaa, 0x68, 0xab, 0x9a, 0x1f, 0x3e, 0xff, 0x89, 0x92, 0xa0, 0x07}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x7d, 0x4f, 0x9c, 0x19, 0xc0, 0x4a, 0x31, 0xec, 0xf9, 0xaa, 0xeb, 0xb2, 0x16, 0x9c, 0xa3, 0x66, 0x5f, 0xd1, 0xd4, 0xed, 0xb8, 0x92, 0x1c, 0xab, 0xda, 0xea, 0xd9, 0x57, 0xdf, 0x4c, 0x2a, 0x48}} ,\n {{0x4b, 0xb0, 0x4e, 0x6e, 0x11, 0x3b, 0x51, 0xbd, 0x6a, 0xfd, 0xe4, 0x25, 0xa5, 0x5f, 0x11, 0x3f, 0x98, 0x92, 0x51, 0x14, 0xc6, 0x5f, 0x3c, 0x0b, 0xa8, 0xf7, 0xc2, 0x81, 0x43, 0xde, 0x91, 0x73}}},\n{{{0x3c, 0x8f, 0x9f, 0x33, 0x2a, 0x1f, 0x43, 0x33, 0x8f, 0x68, 0xff, 0x1f, 0x3d, 0x73, 0x6b, 0xbf, 0x68, 0xcc, 0x7d, 0x13, 0x6c, 0x24, 0x4b, 0xcc, 0x4d, 0x24, 0x0d, 0xfe, 0xde, 0x86, 0xad, 0x3b}} ,\n {{0x79, 0x51, 0x81, 0x01, 0xdc, 0x73, 0x53, 0xe0, 0x6e, 0x9b, 0xea, 0x68, 0x3f, 0x5c, 0x14, 0x84, 0x53, 0x8d, 0x4b, 0xc0, 0x9f, 0x9f, 0x89, 0x2b, 0x8c, 0xba, 0x86, 0xfa, 0xf2, 0xcd, 0xe3, 0x2d}}},\n{{{0x06, 0xf9, 0x29, 0x5a, 0xdb, 0x3d, 0x84, 0x52, 0xab, 0xcc, 0x6b, 0x60, 0x9d, 0xb7, 0x4a, 0x0e, 0x36, 0x63, 0x91, 0xad, 0xa0, 0x95, 0xb0, 0x97, 0x89, 0x4e, 0xcf, 0x7d, 0x3c, 0xe5, 0x7c, 0x28}} ,\n {{0x2e, 0x69, 0x98, 0xfd, 0xc6, 0xbd, 0xcc, 0xca, 0xdf, 0x9a, 0x44, 0x7e, 0x9d, 0xca, 0x89, 0x6d, 0xbf, 0x27, 0xc2, 0xf8, 0xcd, 0x46, 0x00, 0x2b, 0xb5, 0x58, 0x4e, 0xb7, 0x89, 0x09, 0xe9, 0x2d}}},\n{{{0x54, 0xbe, 0x75, 0xcb, 0x05, 0xb0, 0x54, 0xb7, 0xe7, 0x26, 0x86, 0x4a, 0xfc, 0x19, 0xcf, 0x27, 0x46, 0xd4, 0x22, 0x96, 0x5a, 0x11, 0xe8, 0xd5, 0x1b, 0xed, 0x71, 0xc5, 0x5d, 0xc8, 0xaf, 0x45}} ,\n {{0x40, 0x7b, 0x77, 0x57, 0x49, 0x9e, 0x80, 0x39, 0x23, 0xee, 0x81, 0x0b, 0x22, 0xcf, 0xdb, 0x7a, 0x2f, 0x14, 0xb8, 0x57, 0x8f, 0xa1, 0x39, 0x1e, 0x77, 0xfc, 0x0b, 0xa6, 0xbf, 0x8a, 0x0c, 0x6c}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x77, 0x3a, 0xd4, 0xd8, 0x27, 0xcf, 0xe8, 0xa1, 0x72, 0x9d, 0xca, 0xdd, 0x0d, 0x96, 0xda, 0x79, 0xed, 0x56, 0x42, 0x15, 0x60, 0xc7, 0x1c, 0x6b, 0x26, 0x30, 0xf6, 0x6a, 0x95, 0x67, 0xf3, 0x0a}} ,\n {{0xc5, 0x08, 0xa4, 0x2b, 0x2f, 0xbd, 0x31, 0x81, 0x2a, 0xa6, 0xb6, 0xe4, 0x00, 0x91, 0xda, 0x3d, 0xb2, 0xb0, 0x96, 0xce, 0x8a, 0xd2, 0x8d, 0x70, 0xb3, 0xd3, 0x34, 0x01, 0x90, 0x8d, 0x10, 0x21}}},\n{{{0x33, 0x0d, 0xe7, 0xba, 0x4f, 0x07, 0xdf, 0x8d, 0xea, 0x7d, 0xa0, 0xc5, 0xd6, 0xb1, 0xb0, 0xe5, 0x57, 0x1b, 0x5b, 0xf5, 0x45, 0x13, 0x14, 0x64, 0x5a, 0xeb, 0x5c, 0xfc, 0x54, 0x01, 0x76, 0x2b}} ,\n {{0x02, 0x0c, 0xc2, 0xaf, 0x96, 0x36, 0xfe, 0x4a, 0xe2, 0x54, 0x20, 0x6a, 0xeb, 0xb2, 0x9f, 0x62, 0xd7, 0xce, 0xa2, 0x3f, 0x20, 0x11, 0x34, 0x37, 0xe0, 0x42, 0xed, 0x6f, 0xf9, 0x1a, 0xc8, 0x7d}}},\n{{{0xd8, 0xb9, 0x11, 0xe8, 0x36, 0x3f, 0x42, 0xc1, 0xca, 0xdc, 0xd3, 0xf1, 0xc8, 0x23, 0x3d, 0x4f, 0x51, 0x7b, 0x9d, 0x8d, 0xd8, 0xe4, 0xa0, 0xaa, 0xf3, 0x04, 0xd6, 0x11, 0x93, 0xc8, 0x35, 0x45}} ,\n {{0x61, 0x36, 0xd6, 0x08, 0x90, 0xbf, 0xa7, 0x7a, 0x97, 0x6c, 0x0f, 0x84, 0xd5, 0x33, 0x2d, 0x37, 0xc9, 0x6a, 0x80, 0x90, 0x3d, 0x0a, 0xa2, 0xaa, 0xe1, 0xb8, 0x84, 0xba, 0x61, 0x36, 0xdd, 0x69}}},\n{{{0x6b, 0xdb, 0x5b, 0x9c, 0xc6, 0x92, 0xbc, 0x23, 0xaf, 0xc5, 0xb8, 0x75, 0xf8, 0x42, 0xfa, 0xd6, 0xb6, 0x84, 0x94, 0x63, 0x98, 0x93, 0x48, 0x78, 0x38, 0xcd, 0xbb, 0x18, 0x34, 0xc3, 0xdb, 0x67}} ,\n {{0x96, 0xf3, 0x3a, 0x09, 0x56, 0xb0, 0x6f, 0x7c, 0x51, 0x1e, 0x1b, 0x39, 0x48, 0xea, 0xc9, 0x0c, 0x25, 0xa2, 0x7a, 0xca, 0xe7, 0x92, 0xfc, 0x59, 0x30, 0xa3, 0x89, 0x85, 0xdf, 0x6f, 0x43, 0x38}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x79, 0x84, 0x44, 0x19, 0xbd, 0xe9, 0x54, 0xc4, 0xc0, 0x6e, 0x2a, 0xa8, 0xa8, 0x9b, 0x43, 0xd5, 0x71, 0x22, 0x5f, 0xdc, 0x01, 0xfa, 0xdf, 0xb3, 0xb8, 0x47, 0x4b, 0x0a, 0xa5, 0x44, 0xea, 0x29}} ,\n {{0x05, 0x90, 0x50, 0xaf, 0x63, 0x5f, 0x9d, 0x9e, 0xe1, 0x9d, 0x38, 0x97, 0x1f, 0x6c, 0xac, 0x30, 0x46, 0xb2, 0x6a, 0x19, 0xd1, 0x4b, 0xdb, 0xbb, 0x8c, 0xda, 0x2e, 0xab, 0xc8, 0x5a, 0x77, 0x6c}}},\n{{{0x2b, 0xbe, 0xaf, 0xa1, 0x6d, 0x2f, 0x0b, 0xb1, 0x8f, 0xe3, 0xe0, 0x38, 0xcd, 0x0b, 0x41, 0x1b, 0x4a, 0x15, 0x07, 0xf3, 0x6f, 0xdc, 0xb8, 0xe9, 0xde, 0xb2, 0xa3, 0x40, 0x01, 0xa6, 0x45, 0x1e}} ,\n {{0x76, 0x0a, 0xda, 0x8d, 0x2c, 0x07, 0x3f, 0x89, 0x7d, 0x04, 0xad, 0x43, 0x50, 0x6e, 0xd2, 0x47, 0xcb, 0x8a, 0xe6, 0x85, 0x1a, 0x24, 0xf3, 0xd2, 0x60, 0xfd, 0xdf, 0x73, 0xa4, 0x0d, 0x73, 0x0e}}},\n{{{0xfd, 0x67, 0x6b, 0x71, 0x9b, 0x81, 0x53, 0x39, 0x39, 0xf4, 0xb8, 0xd5, 0xc3, 0x30, 0x9b, 0x3b, 0x7c, 0xa3, 0xf0, 0xd0, 0x84, 0x21, 0xd6, 0xbf, 0xb7, 0x4c, 0x87, 0x13, 0x45, 0x2d, 0xa7, 0x55}} ,\n {{0x5d, 0x04, 0xb3, 0x40, 0x28, 0x95, 0x2d, 0x30, 0x83, 0xec, 0x5e, 0xe4, 0xff, 0x75, 0xfe, 0x79, 0x26, 0x9d, 0x1d, 0x36, 0xcd, 0x0a, 0x15, 0xd2, 0x24, 0x14, 0x77, 0x71, 0xd7, 0x8a, 0x1b, 0x04}}},\n{{{0x5d, 0x93, 0xc9, 0xbe, 0xaa, 0x90, 0xcd, 0x9b, 0xfb, 0x73, 0x7e, 0xb0, 0x64, 0x98, 0x57, 0x44, 0x42, 0x41, 0xb1, 0xaf, 0xea, 0xc1, 0xc3, 0x22, 0xff, 0x60, 0x46, 0xcb, 0x61, 0x81, 0x70, 0x61}} ,\n {{0x0d, 0x82, 0xb9, 0xfe, 0x21, 0xcd, 0xc4, 0xf5, 0x98, 0x0c, 0x4e, 0x72, 0xee, 0x87, 0x49, 0xf8, 0xa1, 0x95, 0xdf, 0x8f, 0x2d, 0xbd, 0x21, 0x06, 0x7c, 0x15, 0xe8, 0x12, 0x6d, 0x93, 0xd6, 0x38}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x91, 0xf7, 0x51, 0xd9, 0xef, 0x7d, 0x42, 0x01, 0x13, 0xe9, 0xb8, 0x7f, 0xa6, 0x49, 0x17, 0x64, 0x21, 0x80, 0x83, 0x2c, 0x63, 0x4c, 0x60, 0x09, 0x59, 0x91, 0x92, 0x77, 0x39, 0x51, 0xf4, 0x48}} ,\n {{0x60, 0xd5, 0x22, 0x83, 0x08, 0x2f, 0xff, 0x99, 0x3e, 0x69, 0x6d, 0x88, 0xda, 0xe7, 0x5b, 0x52, 0x26, 0x31, 0x2a, 0xe5, 0x89, 0xde, 0x68, 0x90, 0xb6, 0x22, 0x5a, 0xbd, 0xd3, 0x85, 0x53, 0x31}}},\n{{{0xd8, 0xce, 0xdc, 0xf9, 0x3c, 0x4b, 0xa2, 0x1d, 0x2c, 0x2f, 0x36, 0xbe, 0x7a, 0xfc, 0xcd, 0xbc, 0xdc, 0xf9, 0x30, 0xbd, 0xff, 0x05, 0xc7, 0xe4, 0x8e, 0x17, 0x62, 0xf8, 0x4d, 0xa0, 0x56, 0x79}} ,\n {{0x82, 0xe7, 0xf6, 0xba, 0x53, 0x84, 0x0a, 0xa3, 0x34, 0xff, 0x3c, 0xa3, 0x6a, 0xa1, 0x37, 0xea, 0xdd, 0xb6, 0x95, 0xb3, 0x78, 0x19, 0x76, 0x1e, 0x55, 0x2f, 0x77, 0x2e, 0x7f, 0xc1, 0xea, 0x5e}}},\n{{{0x83, 0xe1, 0x6e, 0xa9, 0x07, 0x33, 0x3e, 0x83, 0xff, 0xcb, 0x1c, 0x9f, 0xb1, 0xa3, 0xb4, 0xc9, 0xe1, 0x07, 0x97, 0xff, 0xf8, 0x23, 0x8f, 0xce, 0x40, 0xfd, 0x2e, 0x5e, 0xdb, 0x16, 0x43, 0x2d}} ,\n {{0xba, 0x38, 0x02, 0xf7, 0x81, 0x43, 0x83, 0xa3, 0x20, 0x4f, 0x01, 0x3b, 0x8a, 0x04, 0x38, 0x31, 0xc6, 0x0f, 0xc8, 0xdf, 0xd7, 0xfa, 0x2f, 0x88, 0x3f, 0xfc, 0x0c, 0x76, 0xc4, 0xa6, 0x45, 0x72}}},\n{{{0xbb, 0x0c, 0xbc, 0x6a, 0xa4, 0x97, 0x17, 0x93, 0x2d, 0x6f, 0xde, 0x72, 0x10, 0x1c, 0x08, 0x2c, 0x0f, 0x80, 0x32, 0x68, 0x27, 0xd4, 0xab, 0xdd, 0xc5, 0x58, 0x61, 0x13, 0x6d, 0x11, 0x1e, 0x4d}} ,\n {{0x1a, 0xb9, 0xc9, 0x10, 0xfb, 0x1e, 0x4e, 0xf4, 0x84, 0x4b, 0x8a, 0x5e, 0x7b, 0x4b, 0xe8, 0x43, 0x8c, 0x8f, 0x00, 0xb5, 0x54, 0x13, 0xc5, 0x5c, 0xb6, 0x35, 0x4e, 0x9d, 0xe4, 0x5b, 0x41, 0x6d}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x15, 0x7d, 0x12, 0x48, 0x82, 0x14, 0x42, 0xcd, 0x32, 0xd4, 0x4b, 0xc1, 0x72, 0x61, 0x2a, 0x8c, 0xec, 0xe2, 0xf8, 0x24, 0x45, 0x94, 0xe3, 0xbe, 0xdd, 0x67, 0xa8, 0x77, 0x5a, 0xae, 0x5b, 0x4b}} ,\n {{0xcb, 0x77, 0x9a, 0x20, 0xde, 0xb8, 0x23, 0xd9, 0xa0, 0x0f, 0x8c, 0x7b, 0xa5, 0xcb, 0xae, 0xb6, 0xec, 0x42, 0x67, 0x0e, 0x58, 0xa4, 0x75, 0x98, 0x21, 0x71, 0x84, 0xb3, 0xe0, 0x76, 0x94, 0x73}}},\n{{{0xdf, 0xfc, 0x69, 0x28, 0x23, 0x3f, 0x5b, 0xf8, 0x3b, 0x24, 0x37, 0xf3, 0x1d, 0xd5, 0x22, 0x6b, 0xd0, 0x98, 0xa8, 0x6c, 0xcf, 0xff, 0x06, 0xe1, 0x13, 0xdf, 0xb9, 0xc1, 0x0c, 0xa9, 0xbf, 0x33}} ,\n {{0xd9, 0x81, 0xda, 0xb2, 0x4f, 0x82, 0x9d, 0x43, 0x81, 0x09, 0xf1, 0xd2, 0x01, 0xef, 0xac, 0xf4, 0x2d, 0x7d, 0x01, 0x09, 0xf1, 0xff, 0xa5, 0x9f, 0xe5, 0xca, 0x27, 0x63, 0xdb, 0x20, 0xb1, 0x53}}},\n{{{0x67, 0x02, 0xe8, 0xad, 0xa9, 0x34, 0xd4, 0xf0, 0x15, 0x81, 0xaa, 0xc7, 0x4d, 0x87, 0x94, 0xea, 0x75, 0xe7, 0x4c, 0x94, 0x04, 0x0e, 0x69, 0x87, 0xe7, 0x51, 0x91, 0x10, 0x03, 0xc7, 0xbe, 0x56}} ,\n {{0x32, 0xfb, 0x86, 0xec, 0x33, 0x6b, 0x2e, 0x51, 0x2b, 0xc8, 0xfa, 0x6c, 0x70, 0x47, 0x7e, 0xce, 0x05, 0x0c, 0x71, 0xf3, 0xb4, 0x56, 0xa6, 0xdc, 0xcc, 0x78, 0x07, 0x75, 0xd0, 0xdd, 0xb2, 0x6a}}},\n{{{0xc6, 0xef, 0xb9, 0xc0, 0x2b, 0x22, 0x08, 0x1e, 0x71, 0x70, 0xb3, 0x35, 0x9c, 0x7a, 0x01, 0x92, 0x44, 0x9a, 0xf6, 0xb0, 0x58, 0x95, 0xc1, 0x9b, 0x02, 0xed, 0x2d, 0x7c, 0x34, 0x29, 0x49, 0x44}} ,\n {{0x45, 0x62, 0x1d, 0x2e, 0xff, 0x2a, 0x1c, 0x21, 0xa4, 0x25, 0x7b, 0x0d, 0x8c, 0x15, 0x39, 0xfc, 0x8f, 0x7c, 0xa5, 0x7d, 0x1e, 0x25, 0xa3, 0x45, 0xd6, 0xab, 0xbd, 0xcb, 0xc5, 0x5e, 0x78, 0x77}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0xd0, 0xd3, 0x42, 0xed, 0x1d, 0x00, 0x3c, 0x15, 0x2c, 0x9c, 0x77, 0x81, 0xd2, 0x73, 0xd1, 0x06, 0xd5, 0xc4, 0x7f, 0x94, 0xbb, 0x92, 0x2d, 0x2c, 0x4b, 0x45, 0x4b, 0xe9, 0x2a, 0x89, 0x6b, 0x2b}} ,\n {{0xd2, 0x0c, 0x88, 0xc5, 0x48, 0x4d, 0xea, 0x0d, 0x4a, 0xc9, 0x52, 0x6a, 0x61, 0x79, 0xe9, 0x76, 0xf3, 0x85, 0x52, 0x5c, 0x1b, 0x2c, 0xe1, 0xd6, 0xc4, 0x0f, 0x18, 0x0e, 0x4e, 0xf6, 0x1c, 0x7f}}},\n{{{0xb4, 0x04, 0x2e, 0x42, 0xcb, 0x1f, 0x2b, 0x11, 0x51, 0x7b, 0x08, 0xac, 0xaa, 0x3e, 0x9e, 0x52, 0x60, 0xb7, 0xc2, 0x61, 0x57, 0x8c, 0x84, 0xd5, 0x18, 0xa6, 0x19, 0xfc, 0xb7, 0x75, 0x91, 0x1b}} ,\n {{0xe8, 0x68, 0xca, 0x44, 0xc8, 0x38, 0x38, 0xcc, 0x53, 0x0a, 0x32, 0x35, 0xcc, 0x52, 0xcb, 0x0e, 0xf7, 0xc5, 0xe7, 0xec, 0x3d, 0x85, 0xcc, 0x58, 0xe2, 0x17, 0x47, 0xff, 0x9f, 0xa5, 0x30, 0x17}}},\n{{{0xe3, 0xae, 0xc8, 0xc1, 0x71, 0x75, 0x31, 0x00, 0x37, 0x41, 0x5c, 0x0e, 0x39, 0xda, 0x73, 0xa0, 0xc7, 0x97, 0x36, 0x6c, 0x5b, 0xf2, 0xee, 0x64, 0x0a, 0x3d, 0x89, 0x1e, 0x1d, 0x49, 0x8c, 0x37}} ,\n {{0x4c, 0xe6, 0xb0, 0xc1, 0xa5, 0x2a, 0x82, 0x09, 0x08, 0xad, 0x79, 0x9c, 0x56, 0xf6, 0xf9, 0xc1, 0xd7, 0x7c, 0x39, 0x7f, 0x93, 0xca, 0x11, 0x55, 0xbf, 0x07, 0x1b, 0x82, 0x29, 0x69, 0x95, 0x5c}}},\n{{{0x87, 0xee, 0xa6, 0x56, 0x9e, 0xc2, 0x9a, 0x56, 0x24, 0x42, 0x85, 0x4d, 0x98, 0x31, 0x1e, 0x60, 0x4d, 0x87, 0x85, 0x04, 0xae, 0x46, 0x12, 0xf9, 0x8e, 0x7f, 0xe4, 0x7f, 0xf6, 0x1c, 0x37, 0x01}} ,\n {{0x73, 0x4c, 0xb6, 0xc5, 0xc4, 0xe9, 0x6c, 0x85, 0x48, 0x4a, 0x5a, 0xac, 0xd9, 0x1f, 0x43, 0xf8, 0x62, 0x5b, 0xee, 0x98, 0x2a, 0x33, 0x8e, 0x79, 0xce, 0x61, 0x06, 0x35, 0xd8, 0xd7, 0xca, 0x71}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x72, 0xd3, 0xae, 0xa6, 0xca, 0x8f, 0xcd, 0xcc, 0x78, 0x8e, 0x19, 0x4d, 0xa7, 0xd2, 0x27, 0xe9, 0xa4, 0x3c, 0x16, 0x5b, 0x84, 0x80, 0xf9, 0xd0, 0xcc, 0x6a, 0x1e, 0xca, 0x1e, 0x67, 0xbd, 0x63}} ,\n {{0x7b, 0x6e, 0x2a, 0xd2, 0x87, 0x48, 0xff, 0xa1, 0xca, 0xe9, 0x15, 0x85, 0xdc, 0xdb, 0x2c, 0x39, 0x12, 0x91, 0xa9, 0x20, 0xaa, 0x4f, 0x29, 0xf4, 0x15, 0x7a, 0xd2, 0xf5, 0x32, 0xcc, 0x60, 0x04}}},\n{{{0xe5, 0x10, 0x47, 0x3b, 0xfa, 0x90, 0xfc, 0x30, 0xb5, 0xea, 0x6f, 0x56, 0x8f, 0xfb, 0x0e, 0xa7, 0x3b, 0xc8, 0xb2, 0xff, 0x02, 0x7a, 0x33, 0x94, 0x93, 0x2a, 0x03, 0xe0, 0x96, 0x3a, 0x6c, 0x0f}} ,\n {{0x5a, 0x63, 0x67, 0xe1, 0x9b, 0x47, 0x78, 0x9f, 0x38, 0x79, 0xac, 0x97, 0x66, 0x1d, 0x5e, 0x51, 0xee, 0x24, 0x42, 0xe8, 0x58, 0x4b, 0x8a, 0x03, 0x75, 0x86, 0x37, 0x86, 0xe2, 0x97, 0x4e, 0x3d}}},\n{{{0x3f, 0x75, 0x8e, 0xb4, 0xff, 0xd8, 0xdd, 0xd6, 0x37, 0x57, 0x9d, 0x6d, 0x3b, 0xbd, 0xd5, 0x60, 0x88, 0x65, 0x9a, 0xb9, 0x4a, 0x68, 0x84, 0xa2, 0x67, 0xdd, 0x17, 0x25, 0x97, 0x04, 0x8b, 0x5e}} ,\n {{0xbb, 0x40, 0x5e, 0xbc, 0x16, 0x92, 0x05, 0xc4, 0xc0, 0x4e, 0x72, 0x90, 0x0e, 0xab, 0xcf, 0x8a, 0xed, 0xef, 0xb9, 0x2d, 0x3b, 0xf8, 0x43, 0x5b, 0xba, 0x2d, 0xeb, 0x2f, 0x52, 0xd2, 0xd1, 0x5a}}},\n{{{0x40, 0xb4, 0xab, 0xe6, 0xad, 0x9f, 0x46, 0x69, 0x4a, 0xb3, 0x8e, 0xaa, 0xea, 0x9c, 0x8a, 0x20, 0x16, 0x5d, 0x8c, 0x13, 0xbd, 0xf6, 0x1d, 0xc5, 0x24, 0xbd, 0x90, 0x2a, 0x1c, 0xc7, 0x13, 0x3b}} ,\n {{0x54, 0xdc, 0x16, 0x0d, 0x18, 0xbe, 0x35, 0x64, 0x61, 0x52, 0x02, 0x80, 0xaf, 0x05, 0xf7, 0xa6, 0x42, 0xd3, 0x8f, 0x2e, 0x79, 0x26, 0xa8, 0xbb, 0xb2, 0x17, 0x48, 0xb2, 0x7a, 0x0a, 0x89, 0x14}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x20, 0xa8, 0x88, 0xe3, 0x91, 0xc0, 0x6e, 0xbb, 0x8a, 0x27, 0x82, 0x51, 0x83, 0xb2, 0x28, 0xa9, 0x83, 0xeb, 0xa6, 0xa9, 0x4d, 0x17, 0x59, 0x22, 0x54, 0x00, 0x50, 0x45, 0xcb, 0x48, 0x4b, 0x18}} ,\n {{0x33, 0x7c, 0xe7, 0x26, 0xba, 0x4d, 0x32, 0xfe, 0x53, 0xf4, 0xfa, 0x83, 0xe3, 0xa5, 0x79, 0x66, 0x73, 0xef, 0x80, 0x23, 0x68, 0xc2, 0x60, 0xdd, 0xa9, 0x33, 0xdc, 0x03, 0x7a, 0xe0, 0xe0, 0x3e}}},\n{{{0x34, 0x5c, 0x13, 0xfb, 0xc0, 0xe3, 0x78, 0x2b, 0x54, 0x58, 0x22, 0x9b, 0x76, 0x81, 0x7f, 0x93, 0x9c, 0x25, 0x3c, 0xd2, 0xe9, 0x96, 0x21, 0x26, 0x08, 0xf5, 0xed, 0x95, 0x11, 0xae, 0x04, 0x5a}} ,\n {{0xb9, 0xe8, 0xc5, 0x12, 0x97, 0x1f, 0x83, 0xfe, 0x3e, 0x94, 0x99, 0xd4, 0x2d, 0xf9, 0x52, 0x59, 0x5c, 0x82, 0xa6, 0xf0, 0x75, 0x7e, 0xe8, 0xec, 0xcc, 0xac, 0x18, 0x21, 0x09, 0x67, 0x66, 0x67}}},\n{{{0xb3, 0x40, 0x29, 0xd1, 0xcb, 0x1b, 0x08, 0x9e, 0x9c, 0xb7, 0x53, 0xb9, 0x3b, 0x71, 0x08, 0x95, 0x12, 0x1a, 0x58, 0xaf, 0x7e, 0x82, 0x52, 0x43, 0x4f, 0x11, 0x39, 0xf4, 0x93, 0x1a, 0x26, 0x05}} ,\n {{0x6e, 0x44, 0xa3, 0xf9, 0x64, 0xaf, 0xe7, 0x6d, 0x7d, 0xdf, 0x1e, 0xac, 0x04, 0xea, 0x3b, 0x5f, 0x9b, 0xe8, 0x24, 0x9d, 0x0e, 0xe5, 0x2e, 0x3e, 0xdf, 0xa9, 0xf7, 0xd4, 0x50, 0x71, 0xf0, 0x78}}},\n{{{0x3e, 0xa8, 0x38, 0xc2, 0x57, 0x56, 0x42, 0x9a, 0xb1, 0xe2, 0xf8, 0x45, 0xaa, 0x11, 0x48, 0x5f, 0x17, 0xc4, 0x54, 0x27, 0xdc, 0x5d, 0xaa, 0xdd, 0x41, 0xbc, 0xdf, 0x81, 0xb9, 0x53, 0xee, 0x52}} ,\n {{0xc3, 0xf1, 0xa7, 0x6d, 0xb3, 0x5f, 0x92, 0x6f, 0xcc, 0x91, 0xb8, 0x95, 0x05, 0xdf, 0x3c, 0x64, 0x57, 0x39, 0x61, 0x51, 0xad, 0x8c, 0x38, 0x7b, 0xc8, 0xde, 0x00, 0x34, 0xbe, 0xa1, 0xb0, 0x7e}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x25, 0x24, 0x1d, 0x8a, 0x67, 0x20, 0xee, 0x42, 0xeb, 0x38, 0xed, 0x0b, 0x8b, 0xcd, 0x46, 0x9d, 0x5e, 0x6b, 0x1e, 0x24, 0x9d, 0x12, 0x05, 0x1a, 0xcc, 0x05, 0x4e, 0x92, 0x38, 0xe1, 0x1f, 0x50}} ,\n {{0x4e, 0xee, 0x1c, 0x91, 0xe6, 0x11, 0xbd, 0x8e, 0x55, 0x1a, 0x18, 0x75, 0x66, 0xaf, 0x4d, 0x7b, 0x0f, 0xae, 0x6d, 0x85, 0xca, 0x82, 0x58, 0x21, 0x9c, 0x18, 0xe0, 0xed, 0xec, 0x22, 0x80, 0x2f}}},\n{{{0x68, 0x3b, 0x0a, 0x39, 0x1d, 0x6a, 0x15, 0x57, 0xfc, 0xf0, 0x63, 0x54, 0xdb, 0x39, 0xdb, 0xe8, 0x5c, 0x64, 0xff, 0xa0, 0x09, 0x4f, 0x3b, 0xb7, 0x32, 0x60, 0x99, 0x94, 0xfd, 0x94, 0x82, 0x2d}} ,\n {{0x24, 0xf6, 0x5a, 0x44, 0xf1, 0x55, 0x2c, 0xdb, 0xea, 0x7c, 0x84, 0x7c, 0x01, 0xac, 0xe3, 0xfd, 0xc9, 0x27, 0xc1, 0x5a, 0xb9, 0xde, 0x4f, 0x5a, 0x90, 0xdd, 0xc6, 0x67, 0xaa, 0x6f, 0x8a, 0x3a}}},\n{{{0x78, 0x52, 0x87, 0xc9, 0x97, 0x63, 0xb1, 0xdd, 0x54, 0x5f, 0xc1, 0xf8, 0xf1, 0x06, 0xa6, 0xa8, 0xa3, 0x88, 0x82, 0xd4, 0xcb, 0xa6, 0x19, 0xdd, 0xd1, 0x11, 0x87, 0x08, 0x17, 0x4c, 0x37, 0x2a}} ,\n {{0xa1, 0x0c, 0xf3, 0x08, 0x43, 0xd9, 0x24, 0x1e, 0x83, 0xa7, 0xdf, 0x91, 0xca, 0xbd, 0x69, 0x47, 0x8d, 0x1b, 0xe2, 0xb9, 0x4e, 0xb5, 0xe1, 0x76, 0xb3, 0x1c, 0x93, 0x03, 0xce, 0x5f, 0xb3, 0x5a}}},\n{{{0x1d, 0xda, 0xe4, 0x61, 0x03, 0x50, 0xa9, 0x8b, 0x68, 0x18, 0xef, 0xb2, 0x1c, 0x84, 0x3b, 0xa2, 0x44, 0x95, 0xa3, 0x04, 0x3b, 0xd6, 0x99, 0x00, 0xaf, 0x76, 0x42, 0x67, 0x02, 0x7d, 0x85, 0x56}} ,\n {{0xce, 0x72, 0x0e, 0x29, 0x84, 0xb2, 0x7d, 0xd2, 0x45, 0xbe, 0x57, 0x06, 0xed, 0x7f, 0xcf, 0xed, 0xcd, 0xef, 0x19, 0xd6, 0xbc, 0x15, 0x79, 0x64, 0xd2, 0x18, 0xe3, 0x20, 0x67, 0x3a, 0x54, 0x0b}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x52, 0xfd, 0x04, 0xc5, 0xfb, 0x99, 0xe7, 0xe8, 0xfb, 0x8c, 0xe1, 0x42, 0x03, 0xef, 0x9d, 0xd9, 0x9e, 0x4d, 0xf7, 0x80, 0xcf, 0x2e, 0xcc, 0x9b, 0x45, 0xc9, 0x7b, 0x7a, 0xbc, 0x37, 0xa8, 0x52}} ,\n {{0x96, 0x11, 0x41, 0x8a, 0x47, 0x91, 0xfe, 0xb6, 0xda, 0x7a, 0x54, 0x63, 0xd1, 0x14, 0x35, 0x05, 0x86, 0x8c, 0xa9, 0x36, 0x3f, 0xf2, 0x85, 0x54, 0x4e, 0x92, 0xd8, 0x85, 0x01, 0x46, 0xd6, 0x50}}},\n{{{0x53, 0xcd, 0xf3, 0x86, 0x40, 0xe6, 0x39, 0x42, 0x95, 0xd6, 0xcb, 0x45, 0x1a, 0x20, 0xc8, 0x45, 0x4b, 0x32, 0x69, 0x04, 0xb1, 0xaf, 0x20, 0x46, 0xc7, 0x6b, 0x23, 0x5b, 0x69, 0xee, 0x30, 0x3f}} ,\n {{0x70, 0x83, 0x47, 0xc0, 0xdb, 0x55, 0x08, 0xa8, 0x7b, 0x18, 0x6d, 0xf5, 0x04, 0x5a, 0x20, 0x0c, 0x4a, 0x8c, 0x60, 0xae, 0xae, 0x0f, 0x64, 0x55, 0x55, 0x2e, 0xd5, 0x1d, 0x53, 0x31, 0x42, 0x41}}},\n{{{0xca, 0xfc, 0x88, 0x6b, 0x96, 0x78, 0x0a, 0x8b, 0x83, 0xdc, 0xbc, 0xaf, 0x40, 0xb6, 0x8d, 0x7f, 0xef, 0xb4, 0xd1, 0x3f, 0xcc, 0xa2, 0x74, 0xc9, 0xc2, 0x92, 0x55, 0x00, 0xab, 0xdb, 0xbf, 0x4f}} ,\n {{0x93, 0x1c, 0x06, 0x2d, 0x66, 0x65, 0x02, 0xa4, 0x97, 0x18, 0xfd, 0x00, 0xe7, 0xab, 0x03, 0xec, 0xce, 0xc1, 0xbf, 0x37, 0xf8, 0x13, 0x53, 0xa5, 0xe5, 0x0c, 0x3a, 0xa8, 0x55, 0xb9, 0xff, 0x68}}},\n{{{0xe4, 0xe6, 0x6d, 0x30, 0x7d, 0x30, 0x35, 0xc2, 0x78, 0x87, 0xf9, 0xfc, 0x6b, 0x5a, 0xc3, 0xb7, 0x65, 0xd8, 0x2e, 0xc7, 0xa5, 0x0c, 0xc6, 0xdc, 0x12, 0xaa, 0xd6, 0x4f, 0xc5, 0x38, 0xbc, 0x0e}} ,\n {{0xe2, 0x3c, 0x76, 0x86, 0x38, 0xf2, 0x7b, 0x2c, 0x16, 0x78, 0x8d, 0xf5, 0xa4, 0x15, 0xda, 0xdb, 0x26, 0x85, 0xa0, 0x56, 0xdd, 0x1d, 0xe3, 0xb3, 0xfd, 0x40, 0xef, 0xf2, 0xd9, 0xa1, 0xb3, 0x04}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0xdb, 0x49, 0x0e, 0xe6, 0x58, 0x10, 0x7a, 0x52, 0xda, 0xb5, 0x7d, 0x37, 0x6a, 0x3e, 0xa1, 0x78, 0xce, 0xc7, 0x1c, 0x24, 0x23, 0xdb, 0x7d, 0xfb, 0x8c, 0x8d, 0xdc, 0x30, 0x67, 0x69, 0x75, 0x3b}} ,\n {{0xa9, 0xea, 0x6d, 0x16, 0x16, 0x60, 0xf4, 0x60, 0x87, 0x19, 0x44, 0x8c, 0x4a, 0x8b, 0x3e, 0xfb, 0x16, 0x00, 0x00, 0x54, 0xa6, 0x9e, 0x9f, 0xef, 0xcf, 0xd9, 0xd2, 0x4c, 0x74, 0x31, 0xd0, 0x34}}},\n{{{0xa4, 0xeb, 0x04, 0xa4, 0x8c, 0x8f, 0x71, 0x27, 0x95, 0x85, 0x5d, 0x55, 0x4b, 0xb1, 0x26, 0x26, 0xc8, 0xae, 0x6a, 0x7d, 0xa2, 0x21, 0xca, 0xce, 0x38, 0xab, 0x0f, 0xd0, 0xd5, 0x2b, 0x6b, 0x00}} ,\n {{0xe5, 0x67, 0x0c, 0xf1, 0x3a, 0x9a, 0xea, 0x09, 0x39, 0xef, 0xd1, 0x30, 0xbc, 0x33, 0xba, 0xb1, 0x6a, 0xc5, 0x27, 0x08, 0x7f, 0x54, 0x80, 0x3d, 0xab, 0xf6, 0x15, 0x7a, 0xc2, 0x40, 0x73, 0x72}}},\n{{{0x84, 0x56, 0x82, 0xb6, 0x12, 0x70, 0x7f, 0xf7, 0xf0, 0xbd, 0x5b, 0xa9, 0xd5, 0xc5, 0x5f, 0x59, 0xbf, 0x7f, 0xb3, 0x55, 0x22, 0x02, 0xc9, 0x44, 0x55, 0x87, 0x8f, 0x96, 0x98, 0x64, 0x6d, 0x15}} ,\n {{0xb0, 0x8b, 0xaa, 0x1e, 0xec, 0xc7, 0xa5, 0x8f, 0x1f, 0x92, 0x04, 0xc6, 0x05, 0xf6, 0xdf, 0xa1, 0xcc, 0x1f, 0x81, 0xf5, 0x0e, 0x9c, 0x57, 0xdc, 0xe3, 0xbb, 0x06, 0x87, 0x1e, 0xfe, 0x23, 0x6c}}},\n{{{0xd8, 0x2b, 0x5b, 0x16, 0xea, 0x20, 0xf1, 0xd3, 0x68, 0x8f, 0xae, 0x5b, 0xd0, 0xa9, 0x1a, 0x19, 0xa8, 0x36, 0xfb, 0x2b, 0x57, 0x88, 0x7d, 0x90, 0xd5, 0xa6, 0xf3, 0xdc, 0x38, 0x89, 0x4e, 0x1f}} ,\n {{0xcc, 0x19, 0xda, 0x9b, 0x3b, 0x43, 0x48, 0x21, 0x2e, 0x23, 0x4d, 0x3d, 0xae, 0xf8, 0x8c, 0xfc, 0xdd, 0xa6, 0x74, 0x37, 0x65, 0xca, 0xee, 0x1a, 0x19, 0x8e, 0x9f, 0x64, 0x6f, 0x0c, 0x8b, 0x5a}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x25, 0xb9, 0xc2, 0xf0, 0x72, 0xb8, 0x15, 0x16, 0xcc, 0x8d, 0x3c, 0x6f, 0x25, 0xed, 0xf4, 0x46, 0x2e, 0x0c, 0x60, 0x0f, 0xe2, 0x84, 0x34, 0x55, 0x89, 0x59, 0x34, 0x1b, 0xf5, 0x8d, 0xfe, 0x08}} ,\n {{0xf8, 0xab, 0x93, 0xbc, 0x44, 0xba, 0x1b, 0x75, 0x4b, 0x49, 0x6f, 0xd0, 0x54, 0x2e, 0x63, 0xba, 0xb5, 0xea, 0xed, 0x32, 0x14, 0xc9, 0x94, 0xd8, 0xc5, 0xce, 0xf4, 0x10, 0x68, 0xe0, 0x38, 0x27}}},\n{{{0x74, 0x1c, 0x14, 0x9b, 0xd4, 0x64, 0x61, 0x71, 0x5a, 0xb6, 0x21, 0x33, 0x4f, 0xf7, 0x8e, 0xba, 0xa5, 0x48, 0x9a, 0xc7, 0xfa, 0x9a, 0xf0, 0xb4, 0x62, 0xad, 0xf2, 0x5e, 0xcc, 0x03, 0x24, 0x1a}} ,\n {{0xf5, 0x76, 0xfd, 0xe4, 0xaf, 0xb9, 0x03, 0x59, 0xce, 0x63, 0xd2, 0x3b, 0x1f, 0xcd, 0x21, 0x0c, 0xad, 0x44, 0xa5, 0x97, 0xac, 0x80, 0x11, 0x02, 0x9b, 0x0c, 0xe5, 0x8b, 0xcd, 0xfb, 0x79, 0x77}}},\n{{{0x15, 0xbe, 0x9a, 0x0d, 0xba, 0x38, 0x72, 0x20, 0x8a, 0xf5, 0xbe, 0x59, 0x93, 0x79, 0xb7, 0xf6, 0x6a, 0x0c, 0x38, 0x27, 0x1a, 0x60, 0xf4, 0x86, 0x3b, 0xab, 0x5a, 0x00, 0xa0, 0xce, 0x21, 0x7d}} ,\n {{0x6c, 0xba, 0x14, 0xc5, 0xea, 0x12, 0x9e, 0x2e, 0x82, 0x63, 0xce, 0x9b, 0x4a, 0xe7, 0x1d, 0xec, 0xf1, 0x2e, 0x51, 0x1c, 0xf4, 0xd0, 0x69, 0x15, 0x42, 0x9d, 0xa3, 0x3f, 0x0e, 0xbf, 0xe9, 0x5c}}},\n{{{0xe4, 0x0d, 0xf4, 0xbd, 0xee, 0x31, 0x10, 0xed, 0xcb, 0x12, 0x86, 0xad, 0xd4, 0x2f, 0x90, 0x37, 0x32, 0xc3, 0x0b, 0x73, 0xec, 0x97, 0x85, 0xa4, 0x01, 0x1c, 0x76, 0x35, 0xfe, 0x75, 0xdd, 0x71}} ,\n {{0x11, 0xa4, 0x88, 0x9f, 0x3e, 0x53, 0x69, 0x3b, 0x1b, 0xe0, 0xf7, 0xba, 0x9b, 0xad, 0x4e, 0x81, 0x5f, 0xb5, 0x5c, 0xae, 0xbe, 0x67, 0x86, 0x37, 0x34, 0x8e, 0x07, 0x32, 0x45, 0x4a, 0x67, 0x39}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x90, 0x70, 0x58, 0x20, 0x03, 0x1e, 0x67, 0xb2, 0xc8, 0x9b, 0x58, 0xc5, 0xb1, 0xeb, 0x2d, 0x4a, 0xde, 0x82, 0x8c, 0xf2, 0xd2, 0x14, 0xb8, 0x70, 0x61, 0x4e, 0x73, 0xd6, 0x0b, 0x6b, 0x0d, 0x30}} ,\n {{0x81, 0xfc, 0x55, 0x5c, 0xbf, 0xa7, 0xc4, 0xbd, 0xe2, 0xf0, 0x4b, 0x8f, 0xe9, 0x7d, 0x99, 0xfa, 0xd3, 0xab, 0xbc, 0xc7, 0x83, 0x2b, 0x04, 0x7f, 0x0c, 0x19, 0x43, 0x03, 0x3d, 0x07, 0xca, 0x40}}},\n{{{0xf9, 0xc8, 0xbe, 0x8c, 0x16, 0x81, 0x39, 0x96, 0xf6, 0x17, 0x58, 0xc8, 0x30, 0x58, 0xfb, 0xc2, 0x03, 0x45, 0xd2, 0x52, 0x76, 0xe0, 0x6a, 0x26, 0x28, 0x5c, 0x88, 0x59, 0x6a, 0x5a, 0x54, 0x42}} ,\n {{0x07, 0xb5, 0x2e, 0x2c, 0x67, 0x15, 0x9b, 0xfb, 0x83, 0x69, 0x1e, 0x0f, 0xda, 0xd6, 0x29, 0xb1, 0x60, 0xe0, 0xb2, 0xba, 0x69, 0xa2, 0x9e, 0xbd, 0xbd, 0xe0, 0x1c, 0xbd, 0xcd, 0x06, 0x64, 0x70}}},\n{{{0x41, 0xfa, 0x8c, 0xe1, 0x89, 0x8f, 0x27, 0xc8, 0x25, 0x8f, 0x6f, 0x5f, 0x55, 0xf8, 0xde, 0x95, 0x6d, 0x2f, 0x75, 0x16, 0x2b, 0x4e, 0x44, 0xfd, 0x86, 0x6e, 0xe9, 0x70, 0x39, 0x76, 0x97, 0x7e}} ,\n {{0x17, 0x62, 0x6b, 0x14, 0xa1, 0x7c, 0xd0, 0x79, 0x6e, 0xd8, 0x8a, 0xa5, 0x6d, 0x8c, 0x93, 0xd2, 0x3f, 0xec, 0x44, 0x8d, 0x6e, 0x91, 0x01, 0x8c, 0x8f, 0xee, 0x01, 0x8f, 0xc0, 0xb4, 0x85, 0x0e}}},\n{{{0x02, 0x3a, 0x70, 0x41, 0xe4, 0x11, 0x57, 0x23, 0xac, 0xe6, 0xfc, 0x54, 0x7e, 0xcd, 0xd7, 0x22, 0xcb, 0x76, 0x9f, 0x20, 0xce, 0xa0, 0x73, 0x76, 0x51, 0x3b, 0xa4, 0xf8, 0xe3, 0x62, 0x12, 0x6c}} ,\n {{0x7f, 0x00, 0x9c, 0x26, 0x0d, 0x6f, 0x48, 0x7f, 0x3a, 0x01, 0xed, 0xc5, 0x96, 0xb0, 0x1f, 0x4f, 0xa8, 0x02, 0x62, 0x27, 0x8a, 0x50, 0x8d, 0x9a, 0x8b, 0x52, 0x0f, 0x1e, 0xcf, 0x41, 0x38, 0x19}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0xf5, 0x6c, 0xd4, 0x2f, 0x0f, 0x69, 0x0f, 0x87, 0x3f, 0x61, 0x65, 0x1e, 0x35, 0x34, 0x85, 0xba, 0x02, 0x30, 0xac, 0x25, 0x3d, 0xe2, 0x62, 0xf1, 0xcc, 0xe9, 0x1b, 0xc2, 0xef, 0x6a, 0x42, 0x57}} ,\n {{0x34, 0x1f, 0x2e, 0xac, 0xd1, 0xc7, 0x04, 0x52, 0x32, 0x66, 0xb2, 0x33, 0x73, 0x21, 0x34, 0x54, 0xf7, 0x71, 0xed, 0x06, 0xb0, 0xff, 0xa6, 0x59, 0x6f, 0x8a, 0x4e, 0xfb, 0x02, 0xb0, 0x45, 0x6b}}},\n{{{0xf5, 0x48, 0x0b, 0x03, 0xc5, 0x22, 0x7d, 0x80, 0x08, 0x53, 0xfe, 0x32, 0xb1, 0xa1, 0x8a, 0x74, 0x6f, 0xbd, 0x3f, 0x85, 0xf4, 0xcf, 0xf5, 0x60, 0xaf, 0x41, 0x7e, 0x3e, 0x46, 0xa3, 0x5a, 0x20}} ,\n {{0xaa, 0x35, 0x87, 0x44, 0x63, 0x66, 0x97, 0xf8, 0x6e, 0x55, 0x0c, 0x04, 0x3e, 0x35, 0x50, 0xbf, 0x93, 0x69, 0xd2, 0x8b, 0x05, 0x55, 0x99, 0xbe, 0xe2, 0x53, 0x61, 0xec, 0xe8, 0x08, 0x0b, 0x32}}},\n{{{0xb3, 0x10, 0x45, 0x02, 0x69, 0x59, 0x2e, 0x97, 0xd9, 0x64, 0xf8, 0xdb, 0x25, 0x80, 0xdc, 0xc4, 0xd5, 0x62, 0x3c, 0xed, 0x65, 0x91, 0xad, 0xd1, 0x57, 0x81, 0x94, 0xaa, 0xa1, 0x29, 0xfc, 0x68}} ,\n {{0xdd, 0xb5, 0x7d, 0xab, 0x5a, 0x21, 0x41, 0x53, 0xbb, 0x17, 0x79, 0x0d, 0xd1, 0xa8, 0x0c, 0x0c, 0x20, 0x88, 0x09, 0xe9, 0x84, 0xe8, 0x25, 0x11, 0x67, 0x7a, 0x8b, 0x1a, 0xe4, 0x5d, 0xe1, 0x5d}}},\n{{{0x37, 0xea, 0xfe, 0x65, 0x3b, 0x25, 0xe8, 0xe1, 0xc2, 0xc5, 0x02, 0xa4, 0xbe, 0x98, 0x0a, 0x2b, 0x61, 0xc1, 0x9b, 0xe2, 0xd5, 0x92, 0xe6, 0x9e, 0x7d, 0x1f, 0xca, 0x43, 0x88, 0x8b, 0x2c, 0x59}} ,\n {{0xe0, 0xb5, 0x00, 0x1d, 0x2a, 0x6f, 0xaf, 0x79, 0x86, 0x2f, 0xa6, 0x5a, 0x93, 0xd1, 0xfe, 0xae, 0x3a, 0xee, 0xdb, 0x7c, 0x61, 0xbe, 0x7c, 0x01, 0xf9, 0xfe, 0x52, 0xdc, 0xd8, 0x52, 0xa3, 0x42}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x22, 0xaf, 0x13, 0x37, 0xbd, 0x37, 0x71, 0xac, 0x04, 0x46, 0x63, 0xac, 0xa4, 0x77, 0xed, 0x25, 0x38, 0xe0, 0x15, 0xa8, 0x64, 0x00, 0x0d, 0xce, 0x51, 0x01, 0xa9, 0xbc, 0x0f, 0x03, 0x1c, 0x04}} ,\n {{0x89, 0xf9, 0x80, 0x07, 0xcf, 0x3f, 0xb3, 0xe9, 0xe7, 0x45, 0x44, 0x3d, 0x2a, 0x7c, 0xe9, 0xe4, 0x16, 0x5c, 0x5e, 0x65, 0x1c, 0xc7, 0x7d, 0xc6, 0x7a, 0xfb, 0x43, 0xee, 0x25, 0x76, 0x46, 0x72}}},\n{{{0x02, 0xa2, 0xed, 0xf4, 0x8f, 0x6b, 0x0b, 0x3e, 0xeb, 0x35, 0x1a, 0xd5, 0x7e, 0xdb, 0x78, 0x00, 0x96, 0x8a, 0xa0, 0xb4, 0xcf, 0x60, 0x4b, 0xd4, 0xd5, 0xf9, 0x2d, 0xbf, 0x88, 0xbd, 0x22, 0x62}} ,\n {{0x13, 0x53, 0xe4, 0x82, 0x57, 0xfa, 0x1e, 0x8f, 0x06, 0x2b, 0x90, 0xba, 0x08, 0xb6, 0x10, 0x54, 0x4f, 0x7c, 0x1b, 0x26, 0xed, 0xda, 0x6b, 0xdd, 0x25, 0xd0, 0x4e, 0xea, 0x42, 0xbb, 0x25, 0x03}}},\n{{{0x51, 0x16, 0x50, 0x7c, 0xd5, 0x5d, 0xf6, 0x99, 0xe8, 0x77, 0x72, 0x4e, 0xfa, 0x62, 0xcb, 0x76, 0x75, 0x0c, 0xe2, 0x71, 0x98, 0x92, 0xd5, 0xfa, 0x45, 0xdf, 0x5c, 0x6f, 0x1e, 0x9e, 0x28, 0x69}} ,\n {{0x0d, 0xac, 0x66, 0x6d, 0xc3, 0x8b, 0xba, 0x16, 0xb5, 0xe2, 0xa0, 0x0d, 0x0c, 0xbd, 0xa4, 0x8e, 0x18, 0x6c, 0xf2, 0xdc, 0xf9, 0xdc, 0x4a, 0x86, 0x25, 0x95, 0x14, 0xcb, 0xd8, 0x1a, 0x04, 0x0f}}},\n{{{0x97, 0xa5, 0xdb, 0x8b, 0x2d, 0xaa, 0x42, 0x11, 0x09, 0xf2, 0x93, 0xbb, 0xd9, 0x06, 0x84, 0x4e, 0x11, 0xa8, 0xa0, 0x25, 0x2b, 0xa6, 0x5f, 0xae, 0xc4, 0xb4, 0x4c, 0xc8, 0xab, 0xc7, 0x3b, 0x02}} ,\n {{0xee, 0xc9, 0x29, 0x0f, 0xdf, 0x11, 0x85, 0xed, 0xce, 0x0d, 0x62, 0x2c, 0x8f, 0x4b, 0xf9, 0x04, 0xe9, 0x06, 0x72, 0x1d, 0x37, 0x20, 0x50, 0xc9, 0x14, 0xeb, 0xec, 0x39, 0xa7, 0x97, 0x2b, 0x4d}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x69, 0xd1, 0x39, 0xbd, 0xfb, 0x33, 0xbe, 0xc4, 0xf0, 0x5c, 0xef, 0xf0, 0x56, 0x68, 0xfc, 0x97, 0x47, 0xc8, 0x72, 0xb6, 0x53, 0xa4, 0x0a, 0x98, 0xa5, 0xb4, 0x37, 0x71, 0xcf, 0x66, 0x50, 0x6d}} ,\n {{0x17, 0xa4, 0x19, 0x52, 0x11, 0x47, 0xb3, 0x5c, 0x5b, 0xa9, 0x2e, 0x22, 0xb4, 0x00, 0x52, 0xf9, 0x57, 0x18, 0xb8, 0xbe, 0x5a, 0xe3, 0xab, 0x83, 0xc8, 0x87, 0x0a, 0x2a, 0xd8, 0x8c, 0xbb, 0x54}}},\n{{{0xa9, 0x62, 0x93, 0x85, 0xbe, 0xe8, 0x73, 0x4a, 0x0e, 0xb0, 0xb5, 0x2d, 0x94, 0x50, 0xaa, 0xd3, 0xb2, 0xea, 0x9d, 0x62, 0x76, 0x3b, 0x07, 0x34, 0x4e, 0x2d, 0x70, 0xc8, 0x9a, 0x15, 0x66, 0x6b}} ,\n {{0xc5, 0x96, 0xca, 0xc8, 0x22, 0x1a, 0xee, 0x5f, 0xe7, 0x31, 0x60, 0x22, 0x83, 0x08, 0x63, 0xce, 0xb9, 0x32, 0x44, 0x58, 0x5d, 0x3a, 0x9b, 0xe4, 0x04, 0xd5, 0xef, 0x38, 0xef, 0x4b, 0xdd, 0x19}}},\n{{{0x4d, 0xc2, 0x17, 0x75, 0xa1, 0x68, 0xcd, 0xc3, 0xc6, 0x03, 0x44, 0xe3, 0x78, 0x09, 0x91, 0x47, 0x3f, 0x0f, 0xe4, 0x92, 0x58, 0xfa, 0x7d, 0x1f, 0x20, 0x94, 0x58, 0x5e, 0xbc, 0x19, 0x02, 0x6f}} ,\n {{0x20, 0xd6, 0xd8, 0x91, 0x54, 0xa7, 0xf3, 0x20, 0x4b, 0x34, 0x06, 0xfa, 0x30, 0xc8, 0x6f, 0x14, 0x10, 0x65, 0x74, 0x13, 0x4e, 0xf0, 0x69, 0x26, 0xce, 0xcf, 0x90, 0xf4, 0xd0, 0xc5, 0xc8, 0x64}}},\n{{{0x26, 0xa2, 0x50, 0x02, 0x24, 0x72, 0xf1, 0xf0, 0x4e, 0x2d, 0x93, 0xd5, 0x08, 0xe7, 0xae, 0x38, 0xf7, 0x18, 0xa5, 0x32, 0x34, 0xc2, 0xf0, 0xa6, 0xec, 0xb9, 0x61, 0x7b, 0x64, 0x99, 0xac, 0x71}} ,\n {{0x25, 0xcf, 0x74, 0x55, 0x1b, 0xaa, 0xa9, 0x38, 0x41, 0x40, 0xd5, 0x95, 0x95, 0xab, 0x1c, 0x5e, 0xbc, 0x41, 0x7e, 0x14, 0x30, 0xbe, 0x13, 0x89, 0xf4, 0xe5, 0xeb, 0x28, 0xc0, 0xc2, 0x96, 0x3a}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x2b, 0x77, 0x45, 0xec, 0x67, 0x76, 0x32, 0x4c, 0xb9, 0xdf, 0x25, 0x32, 0x6b, 0xcb, 0xe7, 0x14, 0x61, 0x43, 0xee, 0xba, 0x9b, 0x71, 0xef, 0xd2, 0x48, 0x65, 0xbb, 0x1b, 0x8a, 0x13, 0x1b, 0x22}} ,\n {{0x84, 0xad, 0x0c, 0x18, 0x38, 0x5a, 0xba, 0xd0, 0x98, 0x59, 0xbf, 0x37, 0xb0, 0x4f, 0x97, 0x60, 0x20, 0xb3, 0x9b, 0x97, 0xf6, 0x08, 0x6c, 0xa4, 0xff, 0xfb, 0xb7, 0xfa, 0x95, 0xb2, 0x51, 0x79}}},\n{{{0x28, 0x5c, 0x3f, 0xdb, 0x6b, 0x18, 0x3b, 0x5c, 0xd1, 0x04, 0x28, 0xde, 0x85, 0x52, 0x31, 0xb5, 0xbb, 0xf6, 0xa9, 0xed, 0xbe, 0x28, 0x4f, 0xb3, 0x7e, 0x05, 0x6a, 0xdb, 0x95, 0x0d, 0x1b, 0x1c}} ,\n {{0xd5, 0xc5, 0xc3, 0x9a, 0x0a, 0xd0, 0x31, 0x3e, 0x07, 0x36, 0x8e, 0xc0, 0x8a, 0x62, 0xb1, 0xca, 0xd6, 0x0e, 0x1e, 0x9d, 0xef, 0xab, 0x98, 0x4d, 0xbb, 0x6c, 0x05, 0xe0, 0xe4, 0x5d, 0xbd, 0x57}}},\n{{{0xcc, 0x21, 0x27, 0xce, 0xfd, 0xa9, 0x94, 0x8e, 0xe1, 0xab, 0x49, 0xe0, 0x46, 0x26, 0xa1, 0xa8, 0x8c, 0xa1, 0x99, 0x1d, 0xb4, 0x27, 0x6d, 0x2d, 0xc8, 0x39, 0x30, 0x5e, 0x37, 0x52, 0xc4, 0x6e}} ,\n {{0xa9, 0x85, 0xf4, 0xe7, 0xb0, 0x15, 0x33, 0x84, 0x1b, 0x14, 0x1a, 0x02, 0xd9, 0x3b, 0xad, 0x0f, 0x43, 0x6c, 0xea, 0x3e, 0x0f, 0x7e, 0xda, 0xdd, 0x6b, 0x4c, 0x7f, 0x6e, 0xd4, 0x6b, 0xbf, 0x0f}}},\n{{{0x47, 0x9f, 0x7c, 0x56, 0x7c, 0x43, 0x91, 0x1c, 0xbb, 0x4e, 0x72, 0x3e, 0x64, 0xab, 0xa0, 0xa0, 0xdf, 0xb4, 0xd8, 0x87, 0x3a, 0xbd, 0xa8, 0x48, 0xc9, 0xb8, 0xef, 0x2e, 0xad, 0x6f, 0x84, 0x4f}} ,\n {{0x2d, 0x2d, 0xf0, 0x1b, 0x7e, 0x2a, 0x6c, 0xf8, 0xa9, 0x6a, 0xe1, 0xf0, 0x99, 0xa1, 0x67, 0x9a, 0xd4, 0x13, 0xca, 0xca, 0xba, 0x27, 0x92, 0xaa, 0xa1, 0x5d, 0x50, 0xde, 0xcc, 0x40, 0x26, 0x0a}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x9f, 0x3e, 0xf2, 0xb2, 0x90, 0xce, 0xdb, 0x64, 0x3e, 0x03, 0xdd, 0x37, 0x36, 0x54, 0x70, 0x76, 0x24, 0xb5, 0x69, 0x03, 0xfc, 0xa0, 0x2b, 0x74, 0xb2, 0x05, 0x0e, 0xcc, 0xd8, 0x1f, 0x6a, 0x1f}} ,\n {{0x19, 0x5e, 0x60, 0x69, 0x58, 0x86, 0xa0, 0x31, 0xbd, 0x32, 0xe9, 0x2c, 0x5c, 0xd2, 0x85, 0xba, 0x40, 0x64, 0xa8, 0x74, 0xf8, 0x0e, 0x1c, 0xb3, 0xa9, 0x69, 0xe8, 0x1e, 0x40, 0x64, 0x99, 0x77}}},\n{{{0x6c, 0x32, 0x4f, 0xfd, 0xbb, 0x5c, 0xbb, 0x8d, 0x64, 0x66, 0x4a, 0x71, 0x1f, 0x79, 0xa3, 0xad, 0x8d, 0xf9, 0xd4, 0xec, 0xcf, 0x67, 0x70, 0xfa, 0x05, 0x4a, 0x0f, 0x6e, 0xaf, 0x87, 0x0a, 0x6f}} ,\n {{0xc6, 0x36, 0x6e, 0x6c, 0x8c, 0x24, 0x09, 0x60, 0xbe, 0x26, 0xd2, 0x4c, 0x5e, 0x17, 0xca, 0x5f, 0x1d, 0xcc, 0x87, 0xe8, 0x42, 0x6a, 0xcb, 0xcb, 0x7d, 0x92, 0x05, 0x35, 0x81, 0x13, 0x60, 0x6b}}},\n{{{0xf4, 0x15, 0xcd, 0x0f, 0x0a, 0xaf, 0x4e, 0x6b, 0x51, 0xfd, 0x14, 0xc4, 0x2e, 0x13, 0x86, 0x74, 0x44, 0xcb, 0x66, 0x6b, 0xb6, 0x9d, 0x74, 0x56, 0x32, 0xac, 0x8d, 0x8e, 0x8c, 0x8c, 0x8c, 0x39}} ,\n {{0xca, 0x59, 0x74, 0x1a, 0x11, 0xef, 0x6d, 0xf7, 0x39, 0x5c, 0x3b, 0x1f, 0xfa, 0xe3, 0x40, 0x41, 0x23, 0x9e, 0xf6, 0xd1, 0x21, 0xa2, 0xbf, 0xad, 0x65, 0x42, 0x6b, 0x59, 0x8a, 0xe8, 0xc5, 0x7f}}},\n{{{0x64, 0x05, 0x7a, 0x84, 0x4a, 0x13, 0xc3, 0xf6, 0xb0, 0x6e, 0x9a, 0x6b, 0x53, 0x6b, 0x32, 0xda, 0xd9, 0x74, 0x75, 0xc4, 0xba, 0x64, 0x3d, 0x3b, 0x08, 0xdd, 0x10, 0x46, 0xef, 0xc7, 0x90, 0x1f}} ,\n {{0x7b, 0x2f, 0x3a, 0xce, 0xc8, 0xa1, 0x79, 0x3c, 0x30, 0x12, 0x44, 0x28, 0xf6, 0xbc, 0xff, 0xfd, 0xf4, 0xc0, 0x97, 0xb0, 0xcc, 0xc3, 0x13, 0x7a, 0xb9, 0x9a, 0x16, 0xe4, 0xcb, 0x4c, 0x34, 0x63}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x07, 0x4e, 0xd3, 0x2d, 0x09, 0x33, 0x0e, 0xd2, 0x0d, 0xbe, 0x3e, 0xe7, 0xe4, 0xaa, 0xb7, 0x00, 0x8b, 0xe8, 0xad, 0xaa, 0x7a, 0x8d, 0x34, 0x28, 0xa9, 0x81, 0x94, 0xc5, 0xe7, 0x42, 0xac, 0x47}} ,\n {{0x24, 0x89, 0x7a, 0x8f, 0xb5, 0x9b, 0xf0, 0xc2, 0x03, 0x64, 0xd0, 0x1e, 0xf5, 0xa4, 0xb2, 0xf3, 0x74, 0xe9, 0x1a, 0x16, 0xfd, 0xcb, 0x15, 0xea, 0xeb, 0x10, 0x6c, 0x35, 0xd1, 0xc1, 0xa6, 0x28}}},\n{{{0xcc, 0xd5, 0x39, 0xfc, 0xa5, 0xa4, 0xad, 0x32, 0x15, 0xce, 0x19, 0xe8, 0x34, 0x2b, 0x1c, 0x60, 0x91, 0xfc, 0x05, 0xa9, 0xb3, 0xdc, 0x80, 0x29, 0xc4, 0x20, 0x79, 0x06, 0x39, 0xc0, 0xe2, 0x22}} ,\n {{0xbb, 0xa8, 0xe1, 0x89, 0x70, 0x57, 0x18, 0x54, 0x3c, 0xf6, 0x0d, 0x82, 0x12, 0x05, 0x87, 0x96, 0x06, 0x39, 0xe3, 0xf8, 0xb3, 0x95, 0xe5, 0xd7, 0x26, 0xbf, 0x09, 0x5a, 0x94, 0xf9, 0x1c, 0x63}}},\n{{{0x2b, 0x8c, 0x2d, 0x9a, 0x8b, 0x84, 0xf2, 0x56, 0xfb, 0xad, 0x2e, 0x7f, 0xb7, 0xfc, 0x30, 0xe1, 0x35, 0x89, 0xba, 0x4d, 0xa8, 0x6d, 0xce, 0x8c, 0x8b, 0x30, 0xe0, 0xda, 0x29, 0x18, 0x11, 0x17}} ,\n {{0x19, 0xa6, 0x5a, 0x65, 0x93, 0xc3, 0xb5, 0x31, 0x22, 0x4f, 0xf3, 0xf6, 0x0f, 0xeb, 0x28, 0xc3, 0x7c, 0xeb, 0xce, 0x86, 0xec, 0x67, 0x76, 0x6e, 0x35, 0x45, 0x7b, 0xd8, 0x6b, 0x92, 0x01, 0x65}}},\n{{{0x3d, 0xd5, 0x9a, 0x64, 0x73, 0x36, 0xb1, 0xd6, 0x86, 0x98, 0x42, 0x3f, 0x8a, 0xf1, 0xc7, 0xf5, 0x42, 0xa8, 0x9c, 0x52, 0xa8, 0xdc, 0xf9, 0x24, 0x3f, 0x4a, 0xa1, 0xa4, 0x5b, 0xe8, 0x62, 0x1a}} ,\n {{0xc5, 0xbd, 0xc8, 0x14, 0xd5, 0x0d, 0xeb, 0xe1, 0xa5, 0xe6, 0x83, 0x11, 0x09, 0x00, 0x1d, 0x55, 0x83, 0x51, 0x7e, 0x75, 0x00, 0x81, 0xb9, 0xcb, 0xd8, 0xc5, 0xe5, 0xa1, 0xd9, 0x17, 0x6d, 0x1f}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0xea, 0xf9, 0xe4, 0xe9, 0xe1, 0x52, 0x3f, 0x51, 0x19, 0x0d, 0xdd, 0xd9, 0x9d, 0x93, 0x31, 0x87, 0x23, 0x09, 0xd5, 0x83, 0xeb, 0x92, 0x09, 0x76, 0x6e, 0xe3, 0xf8, 0xc0, 0xa2, 0x66, 0xb5, 0x36}} ,\n {{0x3a, 0xbb, 0x39, 0xed, 0x32, 0x02, 0xe7, 0x43, 0x7a, 0x38, 0x14, 0x84, 0xe3, 0x44, 0xd2, 0x5e, 0x94, 0xdd, 0x78, 0x89, 0x55, 0x4c, 0x73, 0x9e, 0xe1, 0xe4, 0x3e, 0x43, 0xd0, 0x4a, 0xde, 0x1b}}},\n{{{0xb2, 0xe7, 0x8f, 0xe3, 0xa3, 0xc5, 0xcb, 0x72, 0xee, 0x79, 0x41, 0xf8, 0xdf, 0xee, 0x65, 0xc5, 0x45, 0x77, 0x27, 0x3c, 0xbd, 0x58, 0xd3, 0x75, 0xe2, 0x04, 0x4b, 0xbb, 0x65, 0xf3, 0xc8, 0x0f}} ,\n {{0x24, 0x7b, 0x93, 0x34, 0xb5, 0xe2, 0x74, 0x48, 0xcd, 0xa0, 0x0b, 0x92, 0x97, 0x66, 0x39, 0xf4, 0xb0, 0xe2, 0x5d, 0x39, 0x6a, 0x5b, 0x45, 0x17, 0x78, 0x1e, 0xdb, 0x91, 0x81, 0x1c, 0xf9, 0x16}}},\n{{{0x16, 0xdf, 0xd1, 0x5a, 0xd5, 0xe9, 0x4e, 0x58, 0x95, 0x93, 0x5f, 0x51, 0x09, 0xc3, 0x2a, 0xc9, 0xd4, 0x55, 0x48, 0x79, 0xa4, 0xa3, 0xb2, 0xc3, 0x62, 0xaa, 0x8c, 0xe8, 0xad, 0x47, 0x39, 0x1b}} ,\n {{0x46, 0xda, 0x9e, 0x51, 0x3a, 0xe6, 0xd1, 0xa6, 0xbb, 0x4d, 0x7b, 0x08, 0xbe, 0x8c, 0xd5, 0xf3, 0x3f, 0xfd, 0xf7, 0x44, 0x80, 0x2d, 0x53, 0x4b, 0xd0, 0x87, 0x68, 0xc1, 0xb5, 0xd8, 0xf7, 0x07}}},\n{{{0xf4, 0x10, 0x46, 0xbe, 0xb7, 0xd2, 0xd1, 0xce, 0x5e, 0x76, 0xa2, 0xd7, 0x03, 0xdc, 0xe4, 0x81, 0x5a, 0xf6, 0x3c, 0xde, 0xae, 0x7a, 0x9d, 0x21, 0x34, 0xa5, 0xf6, 0xa9, 0x73, 0xe2, 0x8d, 0x60}} ,\n {{0xfa, 0x44, 0x71, 0xf6, 0x41, 0xd8, 0xc6, 0x58, 0x13, 0x37, 0xeb, 0x84, 0x0f, 0x96, 0xc7, 0xdc, 0xc8, 0xa9, 0x7a, 0x83, 0xb2, 0x2f, 0x31, 0xb1, 0x1a, 0xd8, 0x98, 0x3f, 0x11, 0xd0, 0x31, 0x3b}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x81, 0xd5, 0x34, 0x16, 0x01, 0xa3, 0x93, 0xea, 0x52, 0x94, 0xec, 0x93, 0xb7, 0x81, 0x11, 0x2d, 0x58, 0xf9, 0xb5, 0x0a, 0xaa, 0x4f, 0xf6, 0x2e, 0x3f, 0x36, 0xbf, 0x33, 0x5a, 0xe7, 0xd1, 0x08}} ,\n {{0x1a, 0xcf, 0x42, 0xae, 0xcc, 0xb5, 0x77, 0x39, 0xc4, 0x5b, 0x5b, 0xd0, 0x26, 0x59, 0x27, 0xd0, 0x55, 0x71, 0x12, 0x9d, 0x88, 0x3d, 0x9c, 0xea, 0x41, 0x6a, 0xf0, 0x50, 0x93, 0x93, 0xdd, 0x47}}},\n{{{0x6f, 0xc9, 0x51, 0x6d, 0x1c, 0xaa, 0xf5, 0xa5, 0x90, 0x3f, 0x14, 0xe2, 0x6e, 0x8e, 0x64, 0xfd, 0xac, 0xe0, 0x4e, 0x22, 0xe5, 0xc1, 0xbc, 0x29, 0x0a, 0x6a, 0x9e, 0xa1, 0x60, 0xcb, 0x2f, 0x0b}} ,\n {{0xdc, 0x39, 0x32, 0xf3, 0xa1, 0x44, 0xe9, 0xc5, 0xc3, 0x78, 0xfb, 0x95, 0x47, 0x34, 0x35, 0x34, 0xe8, 0x25, 0xde, 0x93, 0xc6, 0xb4, 0x76, 0x6d, 0x86, 0x13, 0xc6, 0xe9, 0x68, 0xb5, 0x01, 0x63}}},\n{{{0x1f, 0x9a, 0x52, 0x64, 0x97, 0xd9, 0x1c, 0x08, 0x51, 0x6f, 0x26, 0x9d, 0xaa, 0x93, 0x33, 0x43, 0xfa, 0x77, 0xe9, 0x62, 0x9b, 0x5d, 0x18, 0x75, 0xeb, 0x78, 0xf7, 0x87, 0x8f, 0x41, 0xb4, 0x4d}} ,\n {{0x13, 0xa8, 0x82, 0x3e, 0xe9, 0x13, 0xad, 0xeb, 0x01, 0xca, 0xcf, 0xda, 0xcd, 0xf7, 0x6c, 0xc7, 0x7a, 0xdc, 0x1e, 0x6e, 0xc8, 0x4e, 0x55, 0x62, 0x80, 0xea, 0x78, 0x0c, 0x86, 0xb9, 0x40, 0x51}}},\n{{{0x27, 0xae, 0xd3, 0x0d, 0x4c, 0x8f, 0x34, 0xea, 0x7d, 0x3c, 0xe5, 0x8a, 0xcf, 0x5b, 0x92, 0xd8, 0x30, 0x16, 0xb4, 0xa3, 0x75, 0xff, 0xeb, 0x27, 0xc8, 0x5c, 0x6c, 0xc2, 0xee, 0x6c, 0x21, 0x0b}} ,\n {{0xc3, 0xba, 0x12, 0x53, 0x2a, 0xaa, 0x77, 0xad, 0x19, 0x78, 0x55, 0x8a, 0x2e, 0x60, 0x87, 0xc2, 0x6e, 0x91, 0x38, 0x91, 0x3f, 0x7a, 0xc5, 0x24, 0x8f, 0x51, 0xc5, 0xde, 0xb0, 0x53, 0x30, 0x56}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x02, 0xfe, 0x54, 0x12, 0x18, 0xca, 0x7d, 0xa5, 0x68, 0x43, 0xa3, 0x6d, 0x14, 0x2a, 0x6a, 0xa5, 0x8e, 0x32, 0xe7, 0x63, 0x4f, 0xe3, 0xc6, 0x44, 0x3e, 0xab, 0x63, 0xca, 0x17, 0x86, 0x74, 0x3f}} ,\n {{0x1e, 0x64, 0xc1, 0x7d, 0x52, 0xdc, 0x13, 0x5a, 0xa1, 0x9c, 0x4e, 0xee, 0x99, 0x28, 0xbb, 0x4c, 0xee, 0xac, 0xa9, 0x1b, 0x89, 0xa2, 0x38, 0x39, 0x7b, 0xc4, 0x0f, 0x42, 0xe6, 0x89, 0xed, 0x0f}}},\n{{{0xf3, 0x3c, 0x8c, 0x80, 0x83, 0x10, 0x8a, 0x37, 0x50, 0x9c, 0xb4, 0xdf, 0x3f, 0x8c, 0xf7, 0x23, 0x07, 0xd6, 0xff, 0xa0, 0x82, 0x6c, 0x75, 0x3b, 0xe4, 0xb5, 0xbb, 0xe4, 0xe6, 0x50, 0xf0, 0x08}} ,\n {{0x62, 0xee, 0x75, 0x48, 0x92, 0x33, 0xf2, 0xf4, 0xad, 0x15, 0x7a, 0xa1, 0x01, 0x46, 0xa9, 0x32, 0x06, 0x88, 0xb6, 0x36, 0x47, 0x35, 0xb9, 0xb4, 0x42, 0x85, 0x76, 0xf0, 0x48, 0x00, 0x90, 0x38}}},\n{{{0x51, 0x15, 0x9d, 0xc3, 0x95, 0xd1, 0x39, 0xbb, 0x64, 0x9d, 0x15, 0x81, 0xc1, 0x68, 0xd0, 0xb6, 0xa4, 0x2c, 0x7d, 0x5e, 0x02, 0x39, 0x00, 0xe0, 0x3b, 0xa4, 0xcc, 0xca, 0x1d, 0x81, 0x24, 0x10}} ,\n {{0xe7, 0x29, 0xf9, 0x37, 0xd9, 0x46, 0x5a, 0xcd, 0x70, 0xfe, 0x4d, 0x5b, 0xbf, 0xa5, 0xcf, 0x91, 0xf4, 0xef, 0xee, 0x8a, 0x29, 0xd0, 0xe7, 0xc4, 0x25, 0x92, 0x8a, 0xff, 0x36, 0xfc, 0xe4, 0x49}}},\n{{{0xbd, 0x00, 0xb9, 0x04, 0x7d, 0x35, 0xfc, 0xeb, 0xd0, 0x0b, 0x05, 0x32, 0x52, 0x7a, 0x89, 0x24, 0x75, 0x50, 0xe1, 0x63, 0x02, 0x82, 0x8e, 0xe7, 0x85, 0x0c, 0xf2, 0x56, 0x44, 0x37, 0x83, 0x25}} ,\n {{0x8f, 0xa1, 0xce, 0xcb, 0x60, 0xda, 0x12, 0x02, 0x1e, 0x29, 0x39, 0x2a, 0x03, 0xb7, 0xeb, 0x77, 0x40, 0xea, 0xc9, 0x2b, 0x2c, 0xd5, 0x7d, 0x7e, 0x2c, 0xc7, 0x5a, 0xfd, 0xff, 0xc4, 0xd1, 0x62}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x1d, 0x88, 0x98, 0x5b, 0x4e, 0xfc, 0x41, 0x24, 0x05, 0xe6, 0x50, 0x2b, 0xae, 0x96, 0x51, 0xd9, 0x6b, 0x72, 0xb2, 0x33, 0x42, 0x98, 0x68, 0xbb, 0x10, 0x5a, 0x7a, 0x8c, 0x9d, 0x07, 0xb4, 0x05}} ,\n {{0x2f, 0x61, 0x9f, 0xd7, 0xa8, 0x3f, 0x83, 0x8c, 0x10, 0x69, 0x90, 0xe6, 0xcf, 0xd2, 0x63, 0xa3, 0xe4, 0x54, 0x7e, 0xe5, 0x69, 0x13, 0x1c, 0x90, 0x57, 0xaa, 0xe9, 0x53, 0x22, 0x43, 0x29, 0x23}}},\n{{{0xe5, 0x1c, 0xf8, 0x0a, 0xfd, 0x2d, 0x7e, 0xf5, 0xf5, 0x70, 0x7d, 0x41, 0x6b, 0x11, 0xfe, 0xbe, 0x99, 0xd1, 0x55, 0x29, 0x31, 0xbf, 0xc0, 0x97, 0x6c, 0xd5, 0x35, 0xcc, 0x5e, 0x8b, 0xd9, 0x69}} ,\n {{0x8e, 0x4e, 0x9f, 0x25, 0xf8, 0x81, 0x54, 0x2d, 0x0e, 0xd5, 0x54, 0x81, 0x9b, 0xa6, 0x92, 0xce, 0x4b, 0xe9, 0x8f, 0x24, 0x3b, 0xca, 0xe0, 0x44, 0xab, 0x36, 0xfe, 0xfb, 0x87, 0xd4, 0x26, 0x3e}}},\n{{{0x0f, 0x93, 0x9c, 0x11, 0xe7, 0xdb, 0xf1, 0xf0, 0x85, 0x43, 0x28, 0x15, 0x37, 0xdd, 0xde, 0x27, 0xdf, 0xad, 0x3e, 0x49, 0x4f, 0xe0, 0x5b, 0xf6, 0x80, 0x59, 0x15, 0x3c, 0x85, 0xb7, 0x3e, 0x12}} ,\n {{0xf5, 0xff, 0xcc, 0xf0, 0xb4, 0x12, 0x03, 0x5f, 0xc9, 0x84, 0xcb, 0x1d, 0x17, 0xe0, 0xbc, 0xcc, 0x03, 0x62, 0xa9, 0x8b, 0x94, 0xa6, 0xaa, 0x18, 0xcb, 0x27, 0x8d, 0x49, 0xa6, 0x17, 0x15, 0x07}}},\n{{{0xd9, 0xb6, 0xd4, 0x9d, 0xd4, 0x6a, 0xaf, 0x70, 0x07, 0x2c, 0x10, 0x9e, 0xbd, 0x11, 0xad, 0xe4, 0x26, 0x33, 0x70, 0x92, 0x78, 0x1c, 0x74, 0x9f, 0x75, 0x60, 0x56, 0xf4, 0x39, 0xa8, 0xa8, 0x62}} ,\n {{0x3b, 0xbf, 0x55, 0x35, 0x61, 0x8b, 0x44, 0x97, 0xe8, 0x3a, 0x55, 0xc1, 0xc8, 0x3b, 0xfd, 0x95, 0x29, 0x11, 0x60, 0x96, 0x1e, 0xcb, 0x11, 0x9d, 0xc2, 0x03, 0x8a, 0x1b, 0xc6, 0xd6, 0x45, 0x3d}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x7e, 0x0e, 0x50, 0xb2, 0xcc, 0x0d, 0x6b, 0xa6, 0x71, 0x5b, 0x42, 0xed, 0xbd, 0xaf, 0xac, 0xf0, 0xfc, 0x12, 0xa2, 0x3f, 0x4e, 0xda, 0xe8, 0x11, 0xf3, 0x23, 0xe1, 0x04, 0x62, 0x03, 0x1c, 0x4e}} ,\n {{0xc8, 0xb1, 0x1b, 0x6f, 0x73, 0x61, 0x3d, 0x27, 0x0d, 0x7d, 0x7a, 0x25, 0x5f, 0x73, 0x0e, 0x2f, 0x93, 0xf6, 0x24, 0xd8, 0x4f, 0x90, 0xac, 0xa2, 0x62, 0x0a, 0xf0, 0x61, 0xd9, 0x08, 0x59, 0x6a}}},\n{{{0x6f, 0x2d, 0x55, 0xf8, 0x2f, 0x8e, 0xf0, 0x18, 0x3b, 0xea, 0xdd, 0x26, 0x72, 0xd1, 0xf5, 0xfe, 0xe5, 0xb8, 0xe6, 0xd3, 0x10, 0x48, 0x46, 0x49, 0x3a, 0x9f, 0x5e, 0x45, 0x6b, 0x90, 0xe8, 0x7f}} ,\n {{0xd3, 0x76, 0x69, 0x33, 0x7b, 0xb9, 0x40, 0x70, 0xee, 0xa6, 0x29, 0x6b, 0xdd, 0xd0, 0x5d, 0x8d, 0xc1, 0x3e, 0x4a, 0xea, 0x37, 0xb1, 0x03, 0x02, 0x03, 0x35, 0xf1, 0x28, 0x9d, 0xff, 0x00, 0x13}}},\n{{{0x7a, 0xdb, 0x12, 0xd2, 0x8a, 0x82, 0x03, 0x1b, 0x1e, 0xaf, 0xf9, 0x4b, 0x9c, 0xbe, 0xae, 0x7c, 0xe4, 0x94, 0x2a, 0x23, 0xb3, 0x62, 0x86, 0xe7, 0xfd, 0x23, 0xaa, 0x99, 0xbd, 0x2b, 0x11, 0x6c}} ,\n {{0x8d, 0xa6, 0xd5, 0xac, 0x9d, 0xcc, 0x68, 0x75, 0x7f, 0xc3, 0x4d, 0x4b, 0xdd, 0x6c, 0xbb, 0x11, 0x5a, 0x60, 0xe5, 0xbd, 0x7d, 0x27, 0x8b, 0xda, 0xb4, 0x95, 0xf6, 0x03, 0x27, 0xa4, 0x92, 0x3f}}},\n{{{0x22, 0xd6, 0xb5, 0x17, 0x84, 0xbf, 0x12, 0xcc, 0x23, 0x14, 0x4a, 0xdf, 0x14, 0x31, 0xbc, 0xa1, 0xac, 0x6e, 0xab, 0xfa, 0x57, 0x11, 0x53, 0xb3, 0x27, 0xe6, 0xf9, 0x47, 0x33, 0x44, 0x34, 0x1e}} ,\n {{0x79, 0xfc, 0xa6, 0xb4, 0x0b, 0x35, 0x20, 0xc9, 0x4d, 0x22, 0x84, 0xc4, 0xa9, 0x20, 0xec, 0x89, 0x94, 0xba, 0x66, 0x56, 0x48, 0xb9, 0x87, 0x7f, 0xca, 0x1e, 0x06, 0xed, 0xa5, 0x55, 0x59, 0x29}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x56, 0xe1, 0xf5, 0xf1, 0xd5, 0xab, 0xa8, 0x2b, 0xae, 0x89, 0xf3, 0xcf, 0x56, 0x9f, 0xf2, 0x4b, 0x31, 0xbc, 0x18, 0xa9, 0x06, 0x5b, 0xbe, 0xb4, 0x61, 0xf8, 0xb2, 0x06, 0x9c, 0x81, 0xab, 0x4c}} ,\n {{0x1f, 0x68, 0x76, 0x01, 0x16, 0x38, 0x2b, 0x0f, 0x77, 0x97, 0x92, 0x67, 0x4e, 0x86, 0x6a, 0x8b, 0xe5, 0xe8, 0x0c, 0xf7, 0x36, 0x39, 0xb5, 0x33, 0xe6, 0xcf, 0x5e, 0xbd, 0x18, 0xfb, 0x10, 0x1f}}},\n{{{0x83, 0xf0, 0x0d, 0x63, 0xef, 0x53, 0x6b, 0xb5, 0x6b, 0xf9, 0x83, 0xcf, 0xde, 0x04, 0x22, 0x9b, 0x2c, 0x0a, 0xe0, 0xa5, 0xd8, 0xc7, 0x9c, 0xa5, 0xa3, 0xf6, 0x6f, 0xcf, 0x90, 0x6b, 0x68, 0x7c}} ,\n {{0x33, 0x15, 0xd7, 0x7f, 0x1a, 0xd5, 0x21, 0x58, 0xc4, 0x18, 0xa5, 0xf0, 0xcc, 0x73, 0xa8, 0xfd, 0xfa, 0x18, 0xd1, 0x03, 0x91, 0x8d, 0x52, 0xd2, 0xa3, 0xa4, 0xd3, 0xb1, 0xea, 0x1d, 0x0f, 0x00}}},\n{{{0xcc, 0x48, 0x83, 0x90, 0xe5, 0xfd, 0x3f, 0x84, 0xaa, 0xf9, 0x8b, 0x82, 0x59, 0x24, 0x34, 0x68, 0x4f, 0x1c, 0x23, 0xd9, 0xcc, 0x71, 0xe1, 0x7f, 0x8c, 0xaf, 0xf1, 0xee, 0x00, 0xb6, 0xa0, 0x77}} ,\n {{0xf5, 0x1a, 0x61, 0xf7, 0x37, 0x9d, 0x00, 0xf4, 0xf2, 0x69, 0x6f, 0x4b, 0x01, 0x85, 0x19, 0x45, 0x4d, 0x7f, 0x02, 0x7c, 0x6a, 0x05, 0x47, 0x6c, 0x1f, 0x81, 0x20, 0xd4, 0xe8, 0x50, 0x27, 0x72}}},\n{{{0x2c, 0x3a, 0xe5, 0xad, 0xf4, 0xdd, 0x2d, 0xf7, 0x5c, 0x44, 0xb5, 0x5b, 0x21, 0xa3, 0x89, 0x5f, 0x96, 0x45, 0xca, 0x4d, 0xa4, 0x21, 0x99, 0x70, 0xda, 0xc4, 0xc4, 0xa0, 0xe5, 0xf4, 0xec, 0x0a}} ,\n {{0x07, 0x68, 0x21, 0x65, 0xe9, 0x08, 0xa0, 0x0b, 0x6a, 0x4a, 0xba, 0xb5, 0x80, 0xaf, 0xd0, 0x1b, 0xc5, 0xf5, 0x4b, 0x73, 0x50, 0x60, 0x2d, 0x71, 0x69, 0x61, 0x0e, 0xc0, 0x20, 0x40, 0x30, 0x19}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0xd0, 0x75, 0x57, 0x3b, 0xeb, 0x5c, 0x14, 0x56, 0x50, 0xc9, 0x4f, 0xb8, 0xb8, 0x1e, 0xa3, 0xf4, 0xab, 0xf5, 0xa9, 0x20, 0x15, 0x94, 0x82, 0xda, 0x96, 0x1c, 0x9b, 0x59, 0x8c, 0xff, 0xf4, 0x51}} ,\n {{0xc1, 0x3a, 0x86, 0xd7, 0xb0, 0x06, 0x84, 0x7f, 0x1b, 0xbd, 0xd4, 0x07, 0x78, 0x80, 0x2e, 0xb1, 0xb4, 0xee, 0x52, 0x38, 0xee, 0x9a, 0xf9, 0xf6, 0xf3, 0x41, 0x6e, 0xd4, 0x88, 0x95, 0xac, 0x35}}},\n{{{0x41, 0x97, 0xbf, 0x71, 0x6a, 0x9b, 0x72, 0xec, 0xf3, 0xf8, 0x6b, 0xe6, 0x0e, 0x6c, 0x69, 0xa5, 0x2f, 0x68, 0x52, 0xd8, 0x61, 0x81, 0xc0, 0x63, 0x3f, 0xa6, 0x3c, 0x13, 0x90, 0xe6, 0x8d, 0x56}} ,\n {{0xe8, 0x39, 0x30, 0x77, 0x23, 0xb1, 0xfd, 0x1b, 0x3d, 0x3e, 0x74, 0x4d, 0x7f, 0xae, 0x5b, 0x3a, 0xb4, 0x65, 0x0e, 0x3a, 0x43, 0xdc, 0xdc, 0x41, 0x47, 0xe6, 0xe8, 0x92, 0x09, 0x22, 0x48, 0x4c}}},\n{{{0x85, 0x57, 0x9f, 0xb5, 0xc8, 0x06, 0xb2, 0x9f, 0x47, 0x3f, 0xf0, 0xfa, 0xe6, 0xa9, 0xb1, 0x9b, 0x6f, 0x96, 0x7d, 0xf9, 0xa4, 0x65, 0x09, 0x75, 0x32, 0xa6, 0x6c, 0x7f, 0x47, 0x4b, 0x2f, 0x4f}} ,\n {{0x34, 0xe9, 0x59, 0x93, 0x9d, 0x26, 0x80, 0x54, 0xf2, 0xcc, 0x3c, 0xc2, 0x25, 0x85, 0xe3, 0x6a, 0xc1, 0x62, 0x04, 0xa7, 0x08, 0x32, 0x6d, 0xa1, 0x39, 0x84, 0x8a, 0x3b, 0x87, 0x5f, 0x11, 0x13}}},\n{{{0xda, 0x03, 0x34, 0x66, 0xc4, 0x0c, 0x73, 0x6e, 0xbc, 0x24, 0xb5, 0xf9, 0x70, 0x81, 0x52, 0xe9, 0xf4, 0x7c, 0x23, 0xdd, 0x9f, 0xb8, 0x46, 0xef, 0x1d, 0x22, 0x55, 0x7d, 0x71, 0xc4, 0x42, 0x33}} ,\n {{0xc5, 0x37, 0x69, 0x5b, 0xa8, 0xc6, 0x9d, 0xa4, 0xfc, 0x61, 0x6e, 0x68, 0x46, 0xea, 0xd7, 0x1c, 0x67, 0xd2, 0x7d, 0xfa, 0xf1, 0xcc, 0x54, 0x8d, 0x36, 0x35, 0xc9, 0x00, 0xdf, 0x6c, 0x67, 0x50}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x9a, 0x4d, 0x42, 0x29, 0x5d, 0xa4, 0x6b, 0x6f, 0xa8, 0x8a, 0x4d, 0x91, 0x7b, 0xd2, 0xdf, 0x36, 0xef, 0x01, 0x22, 0xc5, 0xcc, 0x8d, 0xeb, 0x58, 0x3d, 0xb3, 0x50, 0xfc, 0x8b, 0x97, 0x96, 0x33}} ,\n {{0x93, 0x33, 0x07, 0xc8, 0x4a, 0xca, 0xd0, 0xb1, 0xab, 0xbd, 0xdd, 0xa7, 0x7c, 0xac, 0x3e, 0x45, 0xcb, 0xcc, 0x07, 0x91, 0xbf, 0x35, 0x9d, 0xcb, 0x7d, 0x12, 0x3c, 0x11, 0x59, 0x13, 0xcf, 0x5c}}},\n{{{0x45, 0xb8, 0x41, 0xd7, 0xab, 0x07, 0x15, 0x00, 0x8e, 0xce, 0xdf, 0xb2, 0x43, 0x5c, 0x01, 0xdc, 0xf4, 0x01, 0x51, 0x95, 0x10, 0x5a, 0xf6, 0x24, 0x24, 0xa0, 0x19, 0x3a, 0x09, 0x2a, 0xaa, 0x3f}} ,\n {{0xdc, 0x8e, 0xeb, 0xc6, 0xbf, 0xdd, 0x11, 0x7b, 0xe7, 0x47, 0xe6, 0xce, 0xe7, 0xb6, 0xc5, 0xe8, 0x8a, 0xdc, 0x4b, 0x57, 0x15, 0x3b, 0x66, 0xca, 0x89, 0xa3, 0xfd, 0xac, 0x0d, 0xe1, 0x1d, 0x7a}}},\n{{{0x89, 0xef, 0xbf, 0x03, 0x75, 0xd0, 0x29, 0x50, 0xcb, 0x7d, 0xd6, 0xbe, 0xad, 0x5f, 0x7b, 0x00, 0x32, 0xaa, 0x98, 0xed, 0x3f, 0x8f, 0x92, 0xcb, 0x81, 0x56, 0x01, 0x63, 0x64, 0xa3, 0x38, 0x39}} ,\n {{0x8b, 0xa4, 0xd6, 0x50, 0xb4, 0xaa, 0x5d, 0x64, 0x64, 0x76, 0x2e, 0xa1, 0xa6, 0xb3, 0xb8, 0x7c, 0x7a, 0x56, 0xf5, 0x5c, 0x4e, 0x84, 0x5c, 0xfb, 0xdd, 0xca, 0x48, 0x8b, 0x48, 0xb9, 0xba, 0x34}}},\n{{{0xc5, 0xe3, 0xe8, 0xae, 0x17, 0x27, 0xe3, 0x64, 0x60, 0x71, 0x47, 0x29, 0x02, 0x0f, 0x92, 0x5d, 0x10, 0x93, 0xc8, 0x0e, 0xa1, 0xed, 0xba, 0xa9, 0x96, 0x1c, 0xc5, 0x76, 0x30, 0xcd, 0xf9, 0x30}} ,\n {{0x95, 0xb0, 0xbd, 0x8c, 0xbc, 0xa7, 0x4f, 0x7e, 0xfd, 0x4e, 0x3a, 0xbf, 0x5f, 0x04, 0x79, 0x80, 0x2b, 0x5a, 0x9f, 0x4f, 0x68, 0x21, 0x19, 0x71, 0xc6, 0x20, 0x01, 0x42, 0xaa, 0xdf, 0xae, 0x2c}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x90, 0x6e, 0x7e, 0x4b, 0x71, 0x93, 0xc0, 0x72, 0xed, 0xeb, 0x71, 0x24, 0x97, 0x26, 0x9c, 0xfe, 0xcb, 0x3e, 0x59, 0x19, 0xa8, 0x0f, 0x75, 0x7d, 0xbe, 0x18, 0xe6, 0x96, 0x1e, 0x95, 0x70, 0x60}} ,\n {{0x89, 0x66, 0x3e, 0x1d, 0x4c, 0x5f, 0xfe, 0xc0, 0x04, 0x43, 0xd6, 0x44, 0x19, 0xb5, 0xad, 0xc7, 0x22, 0xdc, 0x71, 0x28, 0x64, 0xde, 0x41, 0x38, 0x27, 0x8f, 0x2c, 0x6b, 0x08, 0xb8, 0xb8, 0x7b}}},\n{{{0x3d, 0x70, 0x27, 0x9d, 0xd9, 0xaf, 0xb1, 0x27, 0xaf, 0xe3, 0x5d, 0x1e, 0x3a, 0x30, 0x54, 0x61, 0x60, 0xe8, 0xc3, 0x26, 0x3a, 0xbc, 0x7e, 0xf5, 0x81, 0xdd, 0x64, 0x01, 0x04, 0xeb, 0xc0, 0x1e}} ,\n {{0xda, 0x2c, 0xa4, 0xd1, 0xa1, 0xc3, 0x5c, 0x6e, 0x32, 0x07, 0x1f, 0xb8, 0x0e, 0x19, 0x9e, 0x99, 0x29, 0x33, 0x9a, 0xae, 0x7a, 0xed, 0x68, 0x42, 0x69, 0x7c, 0x07, 0xb3, 0x38, 0x2c, 0xf6, 0x3d}}},\n{{{0x64, 0xaa, 0xb5, 0x88, 0x79, 0x65, 0x38, 0x8c, 0x94, 0xd6, 0x62, 0x37, 0x7d, 0x64, 0xcd, 0x3a, 0xeb, 0xff, 0xe8, 0x81, 0x09, 0xc7, 0x6a, 0x50, 0x09, 0x0d, 0x28, 0x03, 0x0d, 0x9a, 0x93, 0x0a}} ,\n {{0x42, 0xa3, 0xf1, 0xc5, 0xb4, 0x0f, 0xd8, 0xc8, 0x8d, 0x15, 0x31, 0xbd, 0xf8, 0x07, 0x8b, 0xcd, 0x08, 0x8a, 0xfb, 0x18, 0x07, 0xfe, 0x8e, 0x52, 0x86, 0xef, 0xbe, 0xec, 0x49, 0x52, 0x99, 0x08}}},\n{{{0x0f, 0xa9, 0xd5, 0x01, 0xaa, 0x48, 0x4f, 0x28, 0x66, 0x32, 0x1a, 0xba, 0x7c, 0xea, 0x11, 0x80, 0x17, 0x18, 0x9b, 0x56, 0x88, 0x25, 0x06, 0x69, 0x12, 0x2c, 0xea, 0x56, 0x69, 0x41, 0x24, 0x19}} ,\n {{0xde, 0x21, 0xf0, 0xda, 0x8a, 0xfb, 0xb1, 0xb8, 0xcd, 0xc8, 0x6a, 0x82, 0x19, 0x73, 0xdb, 0xc7, 0xcf, 0x88, 0xeb, 0x96, 0xee, 0x6f, 0xfb, 0x06, 0xd2, 0xcd, 0x7d, 0x7b, 0x12, 0x28, 0x8e, 0x0c}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x93, 0x44, 0x97, 0xce, 0x28, 0xff, 0x3a, 0x40, 0xc4, 0xf5, 0xf6, 0x9b, 0xf4, 0x6b, 0x07, 0x84, 0xfb, 0x98, 0xd8, 0xec, 0x8c, 0x03, 0x57, 0xec, 0x49, 0xed, 0x63, 0xb6, 0xaa, 0xff, 0x98, 0x28}} ,\n {{0x3d, 0x16, 0x35, 0xf3, 0x46, 0xbc, 0xb3, 0xf4, 0xc6, 0xb6, 0x4f, 0xfa, 0xf4, 0xa0, 0x13, 0xe6, 0x57, 0x45, 0x93, 0xb9, 0xbc, 0xd6, 0x59, 0xe7, 0x77, 0x94, 0x6c, 0xab, 0x96, 0x3b, 0x4f, 0x09}}},\n{{{0x5a, 0xf7, 0x6b, 0x01, 0x12, 0x4f, 0x51, 0xc1, 0x70, 0x84, 0x94, 0x47, 0xb2, 0x01, 0x6c, 0x71, 0xd7, 0xcc, 0x17, 0x66, 0x0f, 0x59, 0x5d, 0x5d, 0x10, 0x01, 0x57, 0x11, 0xf5, 0xdd, 0xe2, 0x34}} ,\n {{0x26, 0xd9, 0x1f, 0x5c, 0x58, 0xac, 0x8b, 0x03, 0xd2, 0xc3, 0x85, 0x0f, 0x3a, 0xc3, 0x7f, 0x6d, 0x8e, 0x86, 0xcd, 0x52, 0x74, 0x8f, 0x55, 0x77, 0x17, 0xb7, 0x8e, 0xb7, 0x88, 0xea, 0xda, 0x1b}}},\n{{{0xb6, 0xea, 0x0e, 0x40, 0x93, 0x20, 0x79, 0x35, 0x6a, 0x61, 0x84, 0x5a, 0x07, 0x6d, 0xf9, 0x77, 0x6f, 0xed, 0x69, 0x1c, 0x0d, 0x25, 0x76, 0xcc, 0xf0, 0xdb, 0xbb, 0xc5, 0xad, 0xe2, 0x26, 0x57}} ,\n {{0xcf, 0xe8, 0x0e, 0x6b, 0x96, 0x7d, 0xed, 0x27, 0xd1, 0x3c, 0xa9, 0xd9, 0x50, 0xa9, 0x98, 0x84, 0x5e, 0x86, 0xef, 0xd6, 0xf0, 0xf8, 0x0e, 0x89, 0x05, 0x2f, 0xd9, 0x5f, 0x15, 0x5f, 0x73, 0x79}}},\n{{{0xc8, 0x5c, 0x16, 0xfe, 0xed, 0x9f, 0x26, 0x56, 0xf6, 0x4b, 0x9f, 0xa7, 0x0a, 0x85, 0xfe, 0xa5, 0x8c, 0x87, 0xdd, 0x98, 0xce, 0x4e, 0xc3, 0x58, 0x55, 0xb2, 0x7b, 0x3d, 0xd8, 0x6b, 0xb5, 0x4c}} ,\n {{0x65, 0x38, 0xa0, 0x15, 0xfa, 0xa7, 0xb4, 0x8f, 0xeb, 0xc4, 0x86, 0x9b, 0x30, 0xa5, 0x5e, 0x4d, 0xea, 0x8a, 0x9a, 0x9f, 0x1a, 0xd8, 0x5b, 0x53, 0x14, 0x19, 0x25, 0x63, 0xb4, 0x6f, 0x1f, 0x5d}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0xac, 0x8f, 0xbc, 0x1e, 0x7d, 0x8b, 0x5a, 0x0b, 0x8d, 0xaf, 0x76, 0x2e, 0x71, 0xe3, 0x3b, 0x6f, 0x53, 0x2f, 0x3e, 0x90, 0x95, 0xd4, 0x35, 0x14, 0x4f, 0x8c, 0x3c, 0xce, 0x57, 0x1c, 0x76, 0x49}} ,\n {{0xa8, 0x50, 0xe1, 0x61, 0x6b, 0x57, 0x35, 0xeb, 0x44, 0x0b, 0x0c, 0x6e, 0xf9, 0x25, 0x80, 0x74, 0xf2, 0x8f, 0x6f, 0x7a, 0x3e, 0x7f, 0x2d, 0xf3, 0x4e, 0x09, 0x65, 0x10, 0x5e, 0x03, 0x25, 0x32}}},\n{{{0xa9, 0x60, 0xdc, 0x0f, 0x64, 0xe5, 0x1d, 0xe2, 0x8d, 0x4f, 0x79, 0x2f, 0x0e, 0x24, 0x02, 0x00, 0x05, 0x77, 0x43, 0x25, 0x3d, 0x6a, 0xc7, 0xb7, 0xbf, 0x04, 0x08, 0x65, 0xf4, 0x39, 0x4b, 0x65}} ,\n {{0x96, 0x19, 0x12, 0x6b, 0x6a, 0xb7, 0xe3, 0xdc, 0x45, 0x9b, 0xdb, 0xb4, 0xa8, 0xae, 0xdc, 0xa8, 0x14, 0x44, 0x65, 0x62, 0xce, 0x34, 0x9a, 0x84, 0x18, 0x12, 0x01, 0xf1, 0xe2, 0x7b, 0xce, 0x50}}},\n{{{0x41, 0x21, 0x30, 0x53, 0x1b, 0x47, 0x01, 0xb7, 0x18, 0xd8, 0x82, 0x57, 0xbd, 0xa3, 0x60, 0xf0, 0x32, 0xf6, 0x5b, 0xf0, 0x30, 0x88, 0x91, 0x59, 0xfd, 0x90, 0xa2, 0xb9, 0x55, 0x93, 0x21, 0x34}} ,\n {{0x97, 0x67, 0x9e, 0xeb, 0x6a, 0xf9, 0x6e, 0xd6, 0x73, 0xe8, 0x6b, 0x29, 0xec, 0x63, 0x82, 0x00, 0xa8, 0x99, 0x1c, 0x1d, 0x30, 0xc8, 0x90, 0x52, 0x90, 0xb6, 0x6a, 0x80, 0x4e, 0xff, 0x4b, 0x51}}},\n{{{0x0f, 0x7d, 0x63, 0x8c, 0x6e, 0x5c, 0xde, 0x30, 0xdf, 0x65, 0xfa, 0x2e, 0xb0, 0xa3, 0x25, 0x05, 0x54, 0xbd, 0x25, 0xba, 0x06, 0xae, 0xdf, 0x8b, 0xd9, 0x1b, 0xea, 0x38, 0xb3, 0x05, 0x16, 0x09}} ,\n {{0xc7, 0x8c, 0xbf, 0x64, 0x28, 0xad, 0xf8, 0xa5, 0x5a, 0x6f, 0xc9, 0xba, 0xd5, 0x7f, 0xd5, 0xd6, 0xbd, 0x66, 0x2f, 0x3d, 0xaa, 0x54, 0xf6, 0xba, 0x32, 0x22, 0x9a, 0x1e, 0x52, 0x05, 0xf4, 0x1d}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0xaa, 0x1f, 0xbb, 0xeb, 0xfe, 0xe4, 0x87, 0xfc, 0xb1, 0x2c, 0xb7, 0x88, 0xf4, 0xc6, 0xb9, 0xf5, 0x24, 0x46, 0xf2, 0xa5, 0x9f, 0x8f, 0x8a, 0x93, 0x70, 0x69, 0xd4, 0x56, 0xec, 0xfd, 0x06, 0x46}} ,\n {{0x4e, 0x66, 0xcf, 0x4e, 0x34, 0xce, 0x0c, 0xd9, 0xa6, 0x50, 0xd6, 0x5e, 0x95, 0xaf, 0xe9, 0x58, 0xfa, 0xee, 0x9b, 0xb8, 0xa5, 0x0f, 0x35, 0xe0, 0x43, 0x82, 0x6d, 0x65, 0xe6, 0xd9, 0x00, 0x0f}}},\n{{{0x7b, 0x75, 0x3a, 0xfc, 0x64, 0xd3, 0x29, 0x7e, 0xdd, 0x49, 0x9a, 0x59, 0x53, 0xbf, 0xb4, 0xa7, 0x52, 0xb3, 0x05, 0xab, 0xc3, 0xaf, 0x16, 0x1a, 0x85, 0x42, 0x32, 0xa2, 0x86, 0xfa, 0x39, 0x43}} ,\n {{0x0e, 0x4b, 0xa3, 0x63, 0x8a, 0xfe, 0xa5, 0x58, 0xf1, 0x13, 0xbd, 0x9d, 0xaa, 0x7f, 0x76, 0x40, 0x70, 0x81, 0x10, 0x75, 0x99, 0xbb, 0xbe, 0x0b, 0x16, 0xe9, 0xba, 0x62, 0x34, 0xcc, 0x07, 0x6d}}},\n{{{0xc3, 0xf1, 0xc6, 0x93, 0x65, 0xee, 0x0b, 0xbc, 0xea, 0x14, 0xf0, 0xc1, 0xf8, 0x84, 0x89, 0xc2, 0xc9, 0xd7, 0xea, 0x34, 0xca, 0xa7, 0xc4, 0x99, 0xd5, 0x50, 0x69, 0xcb, 0xd6, 0x21, 0x63, 0x7c}} ,\n {{0x99, 0xeb, 0x7c, 0x31, 0x73, 0x64, 0x67, 0x7f, 0x0c, 0x66, 0xaa, 0x8c, 0x69, 0x91, 0xe2, 0x26, 0xd3, 0x23, 0xe2, 0x76, 0x5d, 0x32, 0x52, 0xdf, 0x5d, 0xc5, 0x8f, 0xb7, 0x7c, 0x84, 0xb3, 0x70}}},\n{{{0xeb, 0x01, 0xc7, 0x36, 0x97, 0x4e, 0xb6, 0xab, 0x5f, 0x0d, 0x2c, 0xba, 0x67, 0x64, 0x55, 0xde, 0xbc, 0xff, 0xa6, 0xec, 0x04, 0xd3, 0x8d, 0x39, 0x56, 0x5e, 0xee, 0xf8, 0xe4, 0x2e, 0x33, 0x62}} ,\n {{0x65, 0xef, 0xb8, 0x9f, 0xc8, 0x4b, 0xa7, 0xfd, 0x21, 0x49, 0x9b, 0x92, 0x35, 0x82, 0xd6, 0x0a, 0x9b, 0xf2, 0x79, 0xf1, 0x47, 0x2f, 0x6a, 0x7e, 0x9f, 0xcf, 0x18, 0x02, 0x3c, 0xfb, 0x1b, 0x3e}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x2f, 0x8b, 0xc8, 0x40, 0x51, 0xd1, 0xac, 0x1a, 0x0b, 0xe4, 0xa9, 0xa2, 0x42, 0x21, 0x19, 0x2f, 0x7b, 0x97, 0xbf, 0xf7, 0x57, 0x6d, 0x3f, 0x3d, 0x4f, 0x0f, 0xe2, 0xb2, 0x81, 0x00, 0x9e, 0x7b}} ,\n {{0x8c, 0x85, 0x2b, 0xc4, 0xfc, 0xf1, 0xab, 0xe8, 0x79, 0x22, 0xc4, 0x84, 0x17, 0x3a, 0xfa, 0x86, 0xa6, 0x7d, 0xf9, 0xf3, 0x6f, 0x03, 0x57, 0x20, 0x4d, 0x79, 0xf9, 0x6e, 0x71, 0x54, 0x38, 0x09}}},\n{{{0x40, 0x29, 0x74, 0xa8, 0x2f, 0x5e, 0xf9, 0x79, 0xa4, 0xf3, 0x3e, 0xb9, 0xfd, 0x33, 0x31, 0xac, 0x9a, 0x69, 0x88, 0x1e, 0x77, 0x21, 0x2d, 0xf3, 0x91, 0x52, 0x26, 0x15, 0xb2, 0xa6, 0xcf, 0x7e}} ,\n {{0xc6, 0x20, 0x47, 0x6c, 0xa4, 0x7d, 0xcb, 0x63, 0xea, 0x5b, 0x03, 0xdf, 0x3e, 0x88, 0x81, 0x6d, 0xce, 0x07, 0x42, 0x18, 0x60, 0x7e, 0x7b, 0x55, 0xfe, 0x6a, 0xf3, 0xda, 0x5c, 0x8b, 0x95, 0x10}}},\n{{{0x62, 0xe4, 0x0d, 0x03, 0xb4, 0xd7, 0xcd, 0xfa, 0xbd, 0x46, 0xdf, 0x93, 0x71, 0x10, 0x2c, 0xa8, 0x3b, 0xb6, 0x09, 0x05, 0x70, 0x84, 0x43, 0x29, 0xa8, 0x59, 0xf5, 0x8e, 0x10, 0xe4, 0xd7, 0x20}} ,\n {{0x57, 0x82, 0x1c, 0xab, 0xbf, 0x62, 0x70, 0xe8, 0xc4, 0xcf, 0xf0, 0x28, 0x6e, 0x16, 0x3c, 0x08, 0x78, 0x89, 0x85, 0x46, 0x0f, 0xf6, 0x7f, 0xcf, 0xcb, 0x7e, 0xb8, 0x25, 0xe9, 0x5a, 0xfa, 0x03}}},\n{{{0xfb, 0x95, 0x92, 0x63, 0x50, 0xfc, 0x62, 0xf0, 0xa4, 0x5e, 0x8c, 0x18, 0xc2, 0x17, 0x24, 0xb7, 0x78, 0xc2, 0xa9, 0xe7, 0x6a, 0x32, 0xd6, 0x29, 0x85, 0xaf, 0xcb, 0x8d, 0x91, 0x13, 0xda, 0x6b}} ,\n {{0x36, 0x0a, 0xc2, 0xb6, 0x4b, 0xa5, 0x5d, 0x07, 0x17, 0x41, 0x31, 0x5f, 0x62, 0x46, 0xf8, 0x92, 0xf9, 0x66, 0x48, 0x73, 0xa6, 0x97, 0x0d, 0x7d, 0x88, 0xee, 0x62, 0xb1, 0x03, 0xa8, 0x3f, 0x2c}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x4a, 0xb1, 0x70, 0x8a, 0xa9, 0xe8, 0x63, 0x79, 0x00, 0xe2, 0x25, 0x16, 0xca, 0x4b, 0x0f, 0xa4, 0x66, 0xad, 0x19, 0x9f, 0x88, 0x67, 0x0c, 0x8b, 0xc2, 0x4a, 0x5b, 0x2b, 0x6d, 0x95, 0xaf, 0x19}} ,\n {{0x8b, 0x9d, 0xb6, 0xcc, 0x60, 0xb4, 0x72, 0x4f, 0x17, 0x69, 0x5a, 0x4a, 0x68, 0x34, 0xab, 0xa1, 0x45, 0x32, 0x3c, 0x83, 0x87, 0x72, 0x30, 0x54, 0x77, 0x68, 0xae, 0xfb, 0xb5, 0x8b, 0x22, 0x5e}}},\n{{{0xf1, 0xb9, 0x87, 0x35, 0xc5, 0xbb, 0xb9, 0xcf, 0xf5, 0xd6, 0xcd, 0xd5, 0x0c, 0x7c, 0x0e, 0xe6, 0x90, 0x34, 0xfb, 0x51, 0x42, 0x1e, 0x6d, 0xac, 0x9a, 0x46, 0xc4, 0x97, 0x29, 0x32, 0xbf, 0x45}} ,\n {{0x66, 0x9e, 0xc6, 0x24, 0xc0, 0xed, 0xa5, 0x5d, 0x88, 0xd4, 0xf0, 0x73, 0x97, 0x7b, 0xea, 0x7f, 0x42, 0xff, 0x21, 0xa0, 0x9b, 0x2f, 0x9a, 0xfd, 0x53, 0x57, 0x07, 0x84, 0x48, 0x88, 0x9d, 0x52}}},\n{{{0xc6, 0x96, 0x48, 0x34, 0x2a, 0x06, 0xaf, 0x94, 0x3d, 0xf4, 0x1a, 0xcf, 0xf2, 0xc0, 0x21, 0xc2, 0x42, 0x5e, 0xc8, 0x2f, 0x35, 0xa2, 0x3e, 0x29, 0xfa, 0x0c, 0x84, 0xe5, 0x89, 0x72, 0x7c, 0x06}} ,\n {{0x32, 0x65, 0x03, 0xe5, 0x89, 0xa6, 0x6e, 0xb3, 0x5b, 0x8e, 0xca, 0xeb, 0xfe, 0x22, 0x56, 0x8b, 0x5d, 0x14, 0x4b, 0x4d, 0xf9, 0xbe, 0xb5, 0xf5, 0xe6, 0x5c, 0x7b, 0x8b, 0xf4, 0x13, 0x11, 0x34}}},\n{{{0x07, 0xc6, 0x22, 0x15, 0xe2, 0x9c, 0x60, 0xa2, 0x19, 0xd9, 0x27, 0xae, 0x37, 0x4e, 0xa6, 0xc9, 0x80, 0xa6, 0x91, 0x8f, 0x12, 0x49, 0xe5, 0x00, 0x18, 0x47, 0xd1, 0xd7, 0x28, 0x22, 0x63, 0x39}} ,\n {{0xe8, 0xe2, 0x00, 0x7e, 0xf2, 0x9e, 0x1e, 0x99, 0x39, 0x95, 0x04, 0xbd, 0x1e, 0x67, 0x7b, 0xb2, 0x26, 0xac, 0xe6, 0xaa, 0xe2, 0x46, 0xd5, 0xe4, 0xe8, 0x86, 0xbd, 0xab, 0x7c, 0x55, 0x59, 0x6f}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x24, 0x64, 0x6e, 0x9b, 0x35, 0x71, 0x78, 0xce, 0x33, 0x03, 0x21, 0x33, 0x36, 0xf1, 0x73, 0x9b, 0xb9, 0x15, 0x8b, 0x2c, 0x69, 0xcf, 0x4d, 0xed, 0x4f, 0x4d, 0x57, 0x14, 0x13, 0x82, 0xa4, 0x4d}} ,\n {{0x65, 0x6e, 0x0a, 0xa4, 0x59, 0x07, 0x17, 0xf2, 0x6b, 0x4a, 0x1f, 0x6e, 0xf6, 0xb5, 0xbc, 0x62, 0xe4, 0xb6, 0xda, 0xa2, 0x93, 0xbc, 0x29, 0x05, 0xd2, 0xd2, 0x73, 0x46, 0x03, 0x16, 0x40, 0x31}}},\n{{{0x4c, 0x73, 0x6d, 0x15, 0xbd, 0xa1, 0x4d, 0x5c, 0x13, 0x0b, 0x24, 0x06, 0x98, 0x78, 0x1c, 0x5b, 0xeb, 0x1f, 0x18, 0x54, 0x43, 0xd9, 0x55, 0x66, 0xda, 0x29, 0x21, 0xe8, 0xb8, 0x3c, 0x42, 0x22}} ,\n {{0xb4, 0xcd, 0x08, 0x6f, 0x15, 0x23, 0x1a, 0x0b, 0x22, 0xed, 0xd1, 0xf1, 0xa7, 0xc7, 0x73, 0x45, 0xf3, 0x9e, 0xce, 0x76, 0xb7, 0xf6, 0x39, 0xb6, 0x8e, 0x79, 0xbe, 0xe9, 0x9b, 0xcf, 0x7d, 0x62}}},\n{{{0x92, 0x5b, 0xfc, 0x72, 0xfd, 0xba, 0xf1, 0xfd, 0xa6, 0x7c, 0x95, 0xe3, 0x61, 0x3f, 0xe9, 0x03, 0xd4, 0x2b, 0xd4, 0x20, 0xd9, 0xdb, 0x4d, 0x32, 0x3e, 0xf5, 0x11, 0x64, 0xe3, 0xb4, 0xbe, 0x32}} ,\n {{0x86, 0x17, 0x90, 0xe7, 0xc9, 0x1f, 0x10, 0xa5, 0x6a, 0x2d, 0x39, 0xd0, 0x3b, 0xc4, 0xa6, 0xe9, 0x59, 0x13, 0xda, 0x1a, 0xe6, 0xa0, 0xb9, 0x3c, 0x50, 0xb8, 0x40, 0x7c, 0x15, 0x36, 0x5a, 0x42}}},\n{{{0xb4, 0x0b, 0x32, 0xab, 0xdc, 0x04, 0x51, 0x55, 0x21, 0x1e, 0x0b, 0x75, 0x99, 0x89, 0x73, 0x35, 0x3a, 0x91, 0x2b, 0xfe, 0xe7, 0x49, 0xea, 0x76, 0xc1, 0xf9, 0x46, 0xb9, 0x53, 0x02, 0x23, 0x04}} ,\n {{0xfc, 0x5a, 0x1e, 0x1d, 0x74, 0x58, 0x95, 0xa6, 0x8f, 0x7b, 0x97, 0x3e, 0x17, 0x3b, 0x79, 0x2d, 0xa6, 0x57, 0xef, 0x45, 0x02, 0x0b, 0x4d, 0x6e, 0x9e, 0x93, 0x8d, 0x2f, 0xd9, 0x9d, 0xdb, 0x04}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0xc0, 0xd7, 0x56, 0x97, 0x58, 0x91, 0xde, 0x09, 0x4f, 0x9f, 0xbe, 0x63, 0xb0, 0x83, 0x86, 0x43, 0x5d, 0xbc, 0xe0, 0xf3, 0xc0, 0x75, 0xbf, 0x8b, 0x8e, 0xaa, 0xf7, 0x8b, 0x64, 0x6e, 0xb0, 0x63}} ,\n {{0x16, 0xae, 0x8b, 0xe0, 0x9b, 0x24, 0x68, 0x5c, 0x44, 0xc2, 0xd0, 0x08, 0xb7, 0x7b, 0x62, 0xfd, 0x7f, 0xd8, 0xd4, 0xb7, 0x50, 0xfd, 0x2c, 0x1b, 0xbf, 0x41, 0x95, 0xd9, 0x8e, 0xd8, 0x17, 0x1b}}},\n{{{0x86, 0x55, 0x37, 0x8e, 0xc3, 0x38, 0x48, 0x14, 0xb5, 0x97, 0xd2, 0xa7, 0x54, 0x45, 0xf1, 0x35, 0x44, 0x38, 0x9e, 0xf1, 0x1b, 0xb6, 0x34, 0x00, 0x3c, 0x96, 0xee, 0x29, 0x00, 0xea, 0x2c, 0x0b}} ,\n {{0xea, 0xda, 0x99, 0x9e, 0x19, 0x83, 0x66, 0x6d, 0xe9, 0x76, 0x87, 0x50, 0xd1, 0xfd, 0x3c, 0x60, 0x87, 0xc6, 0x41, 0xd9, 0x8e, 0xdb, 0x5e, 0xde, 0xaa, 0x9a, 0xd3, 0x28, 0xda, 0x95, 0xea, 0x47}}},\n{{{0xd0, 0x80, 0xba, 0x19, 0xae, 0x1d, 0xa9, 0x79, 0xf6, 0x3f, 0xac, 0x5d, 0x6f, 0x96, 0x1f, 0x2a, 0xce, 0x29, 0xb2, 0xff, 0x37, 0xf1, 0x94, 0x8f, 0x0c, 0xb5, 0x28, 0xba, 0x9a, 0x21, 0xf6, 0x66}} ,\n {{0x02, 0xfb, 0x54, 0xb8, 0x05, 0xf3, 0x81, 0x52, 0x69, 0x34, 0x46, 0x9d, 0x86, 0x76, 0x8f, 0xd7, 0xf8, 0x6a, 0x66, 0xff, 0xe6, 0xa7, 0x90, 0xf7, 0x5e, 0xcd, 0x6a, 0x9b, 0x55, 0xfc, 0x9d, 0x48}}},\n{{{0xbd, 0xaa, 0x13, 0xe6, 0xcd, 0x45, 0x4a, 0xa4, 0x59, 0x0a, 0x64, 0xb1, 0x98, 0xd6, 0x34, 0x13, 0x04, 0xe6, 0x97, 0x94, 0x06, 0xcb, 0xd4, 0x4e, 0xbb, 0x96, 0xcd, 0xd1, 0x57, 0xd1, 0xe3, 0x06}} ,\n {{0x7a, 0x6c, 0x45, 0x27, 0xc4, 0x93, 0x7f, 0x7d, 0x7c, 0x62, 0x50, 0x38, 0x3a, 0x6b, 0xb5, 0x88, 0xc6, 0xd9, 0xf1, 0x78, 0x19, 0xb9, 0x39, 0x93, 0x3d, 0xc9, 0xe0, 0x9c, 0x3c, 0xce, 0xf5, 0x72}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x24, 0xea, 0x23, 0x7d, 0x56, 0x2c, 0xe2, 0x59, 0x0e, 0x85, 0x60, 0x04, 0x88, 0x5a, 0x74, 0x1e, 0x4b, 0xef, 0x13, 0xda, 0x4c, 0xff, 0x83, 0x45, 0x85, 0x3f, 0x08, 0x95, 0x2c, 0x20, 0x13, 0x1f}} ,\n {{0x48, 0x5f, 0x27, 0x90, 0x5c, 0x02, 0x42, 0xad, 0x78, 0x47, 0x5c, 0xb5, 0x7e, 0x08, 0x85, 0x00, 0xfa, 0x7f, 0xfd, 0xfd, 0xe7, 0x09, 0x11, 0xf2, 0x7e, 0x1b, 0x38, 0x6c, 0x35, 0x6d, 0x33, 0x66}}},\n{{{0x93, 0x03, 0x36, 0x81, 0xac, 0xe4, 0x20, 0x09, 0x35, 0x4c, 0x45, 0xb2, 0x1e, 0x4c, 0x14, 0x21, 0xe6, 0xe9, 0x8a, 0x7b, 0x8d, 0xfe, 0x1e, 0xc6, 0x3e, 0xc1, 0x35, 0xfa, 0xe7, 0x70, 0x4e, 0x1d}} ,\n {{0x61, 0x2e, 0xc2, 0xdd, 0x95, 0x57, 0xd1, 0xab, 0x80, 0xe8, 0x63, 0x17, 0xb5, 0x48, 0xe4, 0x8a, 0x11, 0x9e, 0x72, 0xbe, 0x85, 0x8d, 0x51, 0x0a, 0xf2, 0x9f, 0xe0, 0x1c, 0xa9, 0x07, 0x28, 0x7b}}},\n{{{0xbb, 0x71, 0x14, 0x5e, 0x26, 0x8c, 0x3d, 0xc8, 0xe9, 0x7c, 0xd3, 0xd6, 0xd1, 0x2f, 0x07, 0x6d, 0xe6, 0xdf, 0xfb, 0x79, 0xd6, 0x99, 0x59, 0x96, 0x48, 0x40, 0x0f, 0x3a, 0x7b, 0xb2, 0xa0, 0x72}} ,\n {{0x4e, 0x3b, 0x69, 0xc8, 0x43, 0x75, 0x51, 0x6c, 0x79, 0x56, 0xe4, 0xcb, 0xf7, 0xa6, 0x51, 0xc2, 0x2c, 0x42, 0x0b, 0xd4, 0x82, 0x20, 0x1c, 0x01, 0x08, 0x66, 0xd7, 0xbf, 0x04, 0x56, 0xfc, 0x02}}},\n{{{0x24, 0xe8, 0xb7, 0x60, 0xae, 0x47, 0x80, 0xfc, 0xe5, 0x23, 0xe7, 0xc2, 0xc9, 0x85, 0xe6, 0x98, 0xa0, 0x29, 0x4e, 0xe1, 0x84, 0x39, 0x2d, 0x95, 0x2c, 0xf3, 0x45, 0x3c, 0xff, 0xaf, 0x27, 0x4c}} ,\n {{0x6b, 0xa6, 0xf5, 0x4b, 0x11, 0xbd, 0xba, 0x5b, 0x9e, 0xc4, 0xa4, 0x51, 0x1e, 0xbe, 0xd0, 0x90, 0x3a, 0x9c, 0xc2, 0x26, 0xb6, 0x1e, 0xf1, 0x95, 0x7d, 0xc8, 0x6d, 0x52, 0xe6, 0x99, 0x2c, 0x5f}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x85, 0xe0, 0x24, 0x32, 0xb4, 0xd1, 0xef, 0xfc, 0x69, 0xa2, 0xbf, 0x8f, 0x72, 0x2c, 0x95, 0xf6, 0xe4, 0x6e, 0x7d, 0x90, 0xf7, 0x57, 0x81, 0xa0, 0xf7, 0xda, 0xef, 0x33, 0x07, 0xe3, 0x6b, 0x78}} ,\n {{0x36, 0x27, 0x3e, 0xc6, 0x12, 0x07, 0xab, 0x4e, 0xbe, 0x69, 0x9d, 0xb3, 0xbe, 0x08, 0x7c, 0x2a, 0x47, 0x08, 0xfd, 0xd4, 0xcd, 0x0e, 0x27, 0x34, 0x5b, 0x98, 0x34, 0x2f, 0x77, 0x5f, 0x3a, 0x65}}},\n{{{0x13, 0xaa, 0x2e, 0x4c, 0xf0, 0x22, 0xb8, 0x6c, 0xb3, 0x19, 0x4d, 0xeb, 0x6b, 0xd0, 0xa4, 0xc6, 0x9c, 0xdd, 0xc8, 0x5b, 0x81, 0x57, 0x89, 0xdf, 0x33, 0xa9, 0x68, 0x49, 0x80, 0xe4, 0xfe, 0x21}} ,\n {{0x00, 0x17, 0x90, 0x30, 0xe9, 0xd3, 0x60, 0x30, 0x31, 0xc2, 0x72, 0x89, 0x7a, 0x36, 0xa5, 0xbd, 0x39, 0x83, 0x85, 0x50, 0xa1, 0x5d, 0x6c, 0x41, 0x1d, 0xb5, 0x2c, 0x07, 0x40, 0x77, 0x0b, 0x50}}},\n{{{0x64, 0x34, 0xec, 0xc0, 0x9e, 0x44, 0x41, 0xaf, 0xa0, 0x36, 0x05, 0x6d, 0xea, 0x30, 0x25, 0x46, 0x35, 0x24, 0x9d, 0x86, 0xbd, 0x95, 0xf1, 0x6a, 0x46, 0xd7, 0x94, 0x54, 0xf9, 0x3b, 0xbd, 0x5d}} ,\n {{0x77, 0x5b, 0xe2, 0x37, 0xc7, 0xe1, 0x7c, 0x13, 0x8c, 0x9f, 0x7b, 0x7b, 0x2a, 0xce, 0x42, 0xa3, 0xb9, 0x2a, 0x99, 0xa8, 0xc0, 0xd8, 0x3c, 0x86, 0xb0, 0xfb, 0xe9, 0x76, 0x77, 0xf7, 0xf5, 0x56}}},\n{{{0xdf, 0xb3, 0x46, 0x11, 0x6e, 0x13, 0xb7, 0x28, 0x4e, 0x56, 0xdd, 0xf1, 0xac, 0xad, 0x58, 0xc3, 0xf8, 0x88, 0x94, 0x5e, 0x06, 0x98, 0xa1, 0xe4, 0x6a, 0xfb, 0x0a, 0x49, 0x5d, 0x8a, 0xfe, 0x77}} ,\n {{0x46, 0x02, 0xf5, 0xa5, 0xaf, 0xc5, 0x75, 0x6d, 0xba, 0x45, 0x35, 0x0a, 0xfe, 0xc9, 0xac, 0x22, 0x91, 0x8d, 0x21, 0x95, 0x33, 0x03, 0xc0, 0x8a, 0x16, 0xf3, 0x39, 0xe0, 0x01, 0x0f, 0x53, 0x3c}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x34, 0x75, 0x37, 0x1f, 0x34, 0x4e, 0xa9, 0x1d, 0x68, 0x67, 0xf8, 0x49, 0x98, 0x96, 0xfc, 0x4c, 0x65, 0x97, 0xf7, 0x02, 0x4a, 0x52, 0x6c, 0x01, 0xbd, 0x48, 0xbb, 0x1b, 0xed, 0xa4, 0xe2, 0x53}} ,\n {{0x59, 0xd5, 0x9b, 0x5a, 0xa2, 0x90, 0xd3, 0xb8, 0x37, 0x4c, 0x55, 0x82, 0x28, 0x08, 0x0f, 0x7f, 0xaa, 0x81, 0x65, 0xe0, 0x0c, 0x52, 0xc9, 0xa3, 0x32, 0x27, 0x64, 0xda, 0xfd, 0x34, 0x23, 0x5a}}},\n{{{0xb5, 0xb0, 0x0c, 0x4d, 0xb3, 0x7b, 0x23, 0xc8, 0x1f, 0x8a, 0x39, 0x66, 0xe6, 0xba, 0x4c, 0x10, 0x37, 0xca, 0x9c, 0x7c, 0x05, 0x9e, 0xff, 0xc0, 0xf8, 0x8e, 0xb1, 0x8f, 0x6f, 0x67, 0x18, 0x26}} ,\n {{0x4b, 0x41, 0x13, 0x54, 0x23, 0x1a, 0xa4, 0x4e, 0xa9, 0x8b, 0x1e, 0x4b, 0xfc, 0x15, 0x24, 0xbb, 0x7e, 0xcb, 0xb6, 0x1e, 0x1b, 0xf5, 0xf2, 0xc8, 0x56, 0xec, 0x32, 0xa2, 0x60, 0x5b, 0xa0, 0x2a}}},\n{{{0xa4, 0x29, 0x47, 0x86, 0x2e, 0x92, 0x4f, 0x11, 0x4f, 0xf3, 0xb2, 0x5c, 0xd5, 0x3e, 0xa6, 0xb9, 0xc8, 0xe2, 0x33, 0x11, 0x1f, 0x01, 0x8f, 0xb0, 0x9b, 0xc7, 0xa5, 0xff, 0x83, 0x0f, 0x1e, 0x28}} ,\n {{0x1d, 0x29, 0x7a, 0xa1, 0xec, 0x8e, 0xb5, 0xad, 0xea, 0x02, 0x68, 0x60, 0x74, 0x29, 0x1c, 0xa5, 0xcf, 0xc8, 0x3b, 0x7d, 0x8b, 0x2b, 0x7c, 0xad, 0xa4, 0x40, 0x17, 0x51, 0x59, 0x7c, 0x2e, 0x5d}}},\n{{{0x0a, 0x6c, 0x4f, 0xbc, 0x3e, 0x32, 0xe7, 0x4a, 0x1a, 0x13, 0xc1, 0x49, 0x38, 0xbf, 0xf7, 0xc2, 0xd3, 0x8f, 0x6b, 0xad, 0x52, 0xf7, 0xcf, 0xbc, 0x27, 0xcb, 0x40, 0x67, 0x76, 0xcd, 0x6d, 0x56}} ,\n {{0xe5, 0xb0, 0x27, 0xad, 0xbe, 0x9b, 0xf2, 0xb5, 0x63, 0xde, 0x3a, 0x23, 0x95, 0xb7, 0x0a, 0x7e, 0xf3, 0x9e, 0x45, 0x6f, 0x19, 0x39, 0x75, 0x8f, 0x39, 0x3d, 0x0f, 0xc0, 0x9f, 0xf1, 0xe9, 0x51}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x88, 0xaa, 0x14, 0x24, 0x86, 0x94, 0x11, 0x12, 0x3e, 0x1a, 0xb5, 0xcc, 0xbb, 0xe0, 0x9c, 0xd5, 0x9c, 0x6d, 0xba, 0x58, 0x72, 0x8d, 0xfb, 0x22, 0x7b, 0x9f, 0x7c, 0x94, 0x30, 0xb3, 0x51, 0x21}} ,\n {{0xf6, 0x74, 0x3d, 0xf2, 0xaf, 0xd0, 0x1e, 0x03, 0x7c, 0x23, 0x6b, 0xc9, 0xfc, 0x25, 0x70, 0x90, 0xdc, 0x9a, 0xa4, 0xfb, 0x49, 0xfc, 0x3d, 0x0a, 0x35, 0x38, 0x6f, 0xe4, 0x7e, 0x50, 0x01, 0x2a}}},\n{{{0xd6, 0xe3, 0x96, 0x61, 0x3a, 0xfd, 0xef, 0x9b, 0x1f, 0x90, 0xa4, 0x24, 0x14, 0x5b, 0xc8, 0xde, 0x50, 0xb1, 0x1d, 0xaf, 0xe8, 0x55, 0x8a, 0x87, 0x0d, 0xfe, 0xaa, 0x3b, 0x82, 0x2c, 0x8d, 0x7b}} ,\n {{0x85, 0x0c, 0xaf, 0xf8, 0x83, 0x44, 0x49, 0xd9, 0x45, 0xcf, 0xf7, 0x48, 0xd9, 0x53, 0xb4, 0xf1, 0x65, 0xa0, 0xe1, 0xc3, 0xb3, 0x15, 0xed, 0x89, 0x9b, 0x4f, 0x62, 0xb3, 0x57, 0xa5, 0x45, 0x1c}}},\n{{{0x8f, 0x12, 0xea, 0xaf, 0xd1, 0x1f, 0x79, 0x10, 0x0b, 0xf6, 0xa3, 0x7b, 0xea, 0xac, 0x8b, 0x57, 0x32, 0x62, 0xe7, 0x06, 0x12, 0x51, 0xa0, 0x3b, 0x43, 0x5e, 0xa4, 0x20, 0x78, 0x31, 0xce, 0x0d}} ,\n {{0x84, 0x7c, 0xc2, 0xa6, 0x91, 0x23, 0xce, 0xbd, 0xdc, 0xf9, 0xce, 0xd5, 0x75, 0x30, 0x22, 0xe6, 0xf9, 0x43, 0x62, 0x0d, 0xf7, 0x75, 0x9d, 0x7f, 0x8c, 0xff, 0x7d, 0xe4, 0x72, 0xac, 0x9f, 0x1c}}},\n{{{0x88, 0xc1, 0x99, 0xd0, 0x3c, 0x1c, 0x5d, 0xb4, 0xef, 0x13, 0x0f, 0x90, 0xb9, 0x36, 0x2f, 0x95, 0x95, 0xc6, 0xdc, 0xde, 0x0a, 0x51, 0xe2, 0x8d, 0xf3, 0xbc, 0x51, 0xec, 0xdf, 0xb1, 0xa2, 0x5f}} ,\n {{0x2e, 0x68, 0xa1, 0x23, 0x7d, 0x9b, 0x40, 0x69, 0x85, 0x7b, 0x42, 0xbf, 0x90, 0x4b, 0xd6, 0x40, 0x2f, 0xd7, 0x52, 0x52, 0xb2, 0x21, 0xde, 0x64, 0xbd, 0x88, 0xc3, 0x6d, 0xa5, 0xfa, 0x81, 0x3f}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0xfb, 0xfd, 0x47, 0x7b, 0x8a, 0x66, 0x9e, 0x79, 0x2e, 0x64, 0x82, 0xef, 0xf7, 0x21, 0xec, 0xf6, 0xd8, 0x86, 0x09, 0x31, 0x7c, 0xdd, 0x03, 0x6a, 0x58, 0xa0, 0x77, 0xb7, 0x9b, 0x8c, 0x87, 0x1f}} ,\n {{0x55, 0x47, 0xe4, 0xa8, 0x3d, 0x55, 0x21, 0x34, 0xab, 0x1d, 0xae, 0xe0, 0xf4, 0xea, 0xdb, 0xc5, 0xb9, 0x58, 0xbf, 0xc4, 0x2a, 0x89, 0x31, 0x1a, 0xf4, 0x2d, 0xe1, 0xca, 0x37, 0x99, 0x47, 0x59}}},\n{{{0xc7, 0xca, 0x63, 0xc1, 0x49, 0xa9, 0x35, 0x45, 0x55, 0x7e, 0xda, 0x64, 0x32, 0x07, 0x50, 0xf7, 0x32, 0xac, 0xde, 0x75, 0x58, 0x9b, 0x11, 0xb2, 0x3a, 0x1f, 0xf5, 0xf7, 0x79, 0x04, 0xe6, 0x08}} ,\n {{0x46, 0xfa, 0x22, 0x4b, 0xfa, 0xe1, 0xfe, 0x96, 0xfc, 0x67, 0xba, 0x67, 0x97, 0xc4, 0xe7, 0x1b, 0x86, 0x90, 0x5f, 0xee, 0xf4, 0x5b, 0x11, 0xb2, 0xcd, 0xad, 0xee, 0xc2, 0x48, 0x6c, 0x2b, 0x1b}}},\n{{{0xe3, 0x39, 0x62, 0xb4, 0x4f, 0x31, 0x04, 0xc9, 0xda, 0xd5, 0x73, 0x51, 0x57, 0xc5, 0xb8, 0xf3, 0xa3, 0x43, 0x70, 0xe4, 0x61, 0x81, 0x84, 0xe2, 0xbb, 0xbf, 0x4f, 0x9e, 0xa4, 0x5e, 0x74, 0x06}} ,\n {{0x29, 0xac, 0xff, 0x27, 0xe0, 0x59, 0xbe, 0x39, 0x9c, 0x0d, 0x83, 0xd7, 0x10, 0x0b, 0x15, 0xb7, 0xe1, 0xc2, 0x2c, 0x30, 0x73, 0x80, 0x3a, 0x7d, 0x5d, 0xab, 0x58, 0x6b, 0xc1, 0xf0, 0xf4, 0x22}}},\n{{{0xfe, 0x7f, 0xfb, 0x35, 0x7d, 0xc6, 0x01, 0x23, 0x28, 0xc4, 0x02, 0xac, 0x1f, 0x42, 0xb4, 0x9d, 0xfc, 0x00, 0x94, 0xa5, 0xee, 0xca, 0xda, 0x97, 0x09, 0x41, 0x77, 0x87, 0x5d, 0x7b, 0x87, 0x78}} ,\n {{0xf5, 0xfb, 0x90, 0x2d, 0x81, 0x19, 0x9e, 0x2f, 0x6d, 0x85, 0x88, 0x8c, 0x40, 0x5c, 0x77, 0x41, 0x4d, 0x01, 0x19, 0x76, 0x60, 0xe8, 0x4c, 0x48, 0xe4, 0x33, 0x83, 0x32, 0x6c, 0xb4, 0x41, 0x03}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0xff, 0x10, 0xc2, 0x09, 0x4f, 0x6e, 0xf4, 0xd2, 0xdf, 0x7e, 0xca, 0x7b, 0x1c, 0x1d, 0xba, 0xa3, 0xb6, 0xda, 0x67, 0x33, 0xd4, 0x87, 0x36, 0x4b, 0x11, 0x20, 0x05, 0xa6, 0x29, 0xc1, 0x87, 0x17}} ,\n {{0xf6, 0x96, 0xca, 0x2f, 0xda, 0x38, 0xa7, 0x1b, 0xfc, 0xca, 0x7d, 0xfe, 0x08, 0x89, 0xe2, 0x47, 0x2b, 0x6a, 0x5d, 0x4b, 0xfa, 0xa1, 0xb4, 0xde, 0xb6, 0xc2, 0x31, 0x51, 0xf5, 0xe0, 0xa4, 0x0b}}},\n{{{0x5c, 0xe5, 0xc6, 0x04, 0x8e, 0x2b, 0x57, 0xbe, 0x38, 0x85, 0x23, 0xcb, 0xb7, 0xbe, 0x4f, 0xa9, 0xd3, 0x6e, 0x12, 0xaa, 0xd5, 0xb2, 0x2e, 0x93, 0x29, 0x9a, 0x4a, 0x88, 0x18, 0x43, 0xf5, 0x01}} ,\n {{0x50, 0xfc, 0xdb, 0xa2, 0x59, 0x21, 0x8d, 0xbd, 0x7e, 0x33, 0xae, 0x2f, 0x87, 0x1a, 0xd0, 0x97, 0xc7, 0x0d, 0x4d, 0x63, 0x01, 0xef, 0x05, 0x84, 0xec, 0x40, 0xdd, 0xa8, 0x0a, 0x4f, 0x70, 0x0b}}},\n{{{0x41, 0x69, 0x01, 0x67, 0x5c, 0xd3, 0x8a, 0xc5, 0xcf, 0x3f, 0xd1, 0x57, 0xd1, 0x67, 0x3e, 0x01, 0x39, 0xb5, 0xcb, 0x81, 0x56, 0x96, 0x26, 0xb6, 0xc2, 0xe7, 0x5c, 0xfb, 0x63, 0x97, 0x58, 0x06}} ,\n {{0x0c, 0x0e, 0xf3, 0xba, 0xf0, 0xe5, 0xba, 0xb2, 0x57, 0x77, 0xc6, 0x20, 0x9b, 0x89, 0x24, 0xbe, 0xf2, 0x9c, 0x8a, 0xba, 0x69, 0xc1, 0xf1, 0xb0, 0x4f, 0x2a, 0x05, 0x9a, 0xee, 0x10, 0x7e, 0x36}}},\n{{{0x3f, 0x26, 0xe9, 0x40, 0xe9, 0x03, 0xad, 0x06, 0x69, 0x91, 0xe0, 0xd1, 0x89, 0x60, 0x84, 0x79, 0xde, 0x27, 0x6d, 0xe6, 0x76, 0xbd, 0xea, 0xe6, 0xae, 0x48, 0xc3, 0x67, 0xc0, 0x57, 0xcd, 0x2f}} ,\n {{0x7f, 0xc1, 0xdc, 0xb9, 0xc7, 0xbc, 0x86, 0x3d, 0x55, 0x4b, 0x28, 0x7a, 0xfb, 0x4d, 0xc7, 0xf8, 0xbc, 0x67, 0x2a, 0x60, 0x4d, 0x8f, 0x07, 0x0b, 0x1a, 0x17, 0xbf, 0xfa, 0xac, 0xa7, 0x3d, 0x1a}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x91, 0x3f, 0xed, 0x5e, 0x18, 0x78, 0x3f, 0x23, 0x2c, 0x0d, 0x8c, 0x44, 0x00, 0xe8, 0xfb, 0xe9, 0x8e, 0xd6, 0xd1, 0x36, 0x58, 0x57, 0x9e, 0xae, 0x4b, 0x5c, 0x0b, 0x07, 0xbc, 0x6b, 0x55, 0x2b}} ,\n {{0x6f, 0x4d, 0x17, 0xd7, 0xe1, 0x84, 0xd9, 0x78, 0xb1, 0x90, 0xfd, 0x2e, 0xb3, 0xb5, 0x19, 0x3f, 0x1b, 0xfa, 0xc0, 0x68, 0xb3, 0xdd, 0x00, 0x2e, 0x89, 0xbd, 0x7e, 0x80, 0x32, 0x13, 0xa0, 0x7b}}},\n{{{0x1a, 0x6f, 0x40, 0xaf, 0x44, 0x44, 0xb0, 0x43, 0x8f, 0x0d, 0xd0, 0x1e, 0xc4, 0x0b, 0x19, 0x5d, 0x8e, 0xfe, 0xc1, 0xf3, 0xc5, 0x5c, 0x91, 0xf8, 0x04, 0x4e, 0xbe, 0x90, 0xb4, 0x47, 0x5c, 0x3f}} ,\n {{0xb0, 0x3b, 0x2c, 0xf3, 0xfe, 0x32, 0x71, 0x07, 0x3f, 0xaa, 0xba, 0x45, 0x60, 0xa8, 0x8d, 0xea, 0x54, 0xcb, 0x39, 0x10, 0xb4, 0xf2, 0x8b, 0xd2, 0x14, 0x82, 0x42, 0x07, 0x8e, 0xe9, 0x7c, 0x53}}},\n{{{0xb0, 0xae, 0xc1, 0x8d, 0xc9, 0x8f, 0xb9, 0x7a, 0x77, 0xef, 0xba, 0x79, 0xa0, 0x3c, 0xa8, 0xf5, 0x6a, 0xe2, 0x3f, 0x5d, 0x00, 0xe3, 0x4b, 0x45, 0x24, 0x7b, 0x43, 0x78, 0x55, 0x1d, 0x2b, 0x1e}} ,\n {{0x01, 0xb8, 0xd6, 0x16, 0x67, 0xa0, 0x15, 0xb9, 0xe1, 0x58, 0xa4, 0xa7, 0x31, 0x37, 0x77, 0x2f, 0x8b, 0x12, 0x9f, 0xf4, 0x3f, 0xc7, 0x36, 0x66, 0xd2, 0xa8, 0x56, 0xf7, 0x7f, 0x74, 0xc6, 0x41}}},\n{{{0x5d, 0xf8, 0xb4, 0xa8, 0x30, 0xdd, 0xcc, 0x38, 0xa5, 0xd3, 0xca, 0xd8, 0xd1, 0xf8, 0xb2, 0x31, 0x91, 0xd4, 0x72, 0x05, 0x57, 0x4a, 0x3b, 0x82, 0x4a, 0xc6, 0x68, 0x20, 0xe2, 0x18, 0x41, 0x61}} ,\n {{0x19, 0xd4, 0x8d, 0x47, 0x29, 0x12, 0x65, 0xb0, 0x11, 0x78, 0x47, 0xb5, 0xcb, 0xa3, 0xa5, 0xfa, 0x05, 0x85, 0x54, 0xa9, 0x33, 0x97, 0x8d, 0x2b, 0xc2, 0xfe, 0x99, 0x35, 0x28, 0xe5, 0xeb, 0x63}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0xb1, 0x3f, 0x3f, 0xef, 0xd8, 0xf4, 0xfc, 0xb3, 0xa0, 0x60, 0x50, 0x06, 0x2b, 0x29, 0x52, 0x70, 0x15, 0x0b, 0x24, 0x24, 0xf8, 0x5f, 0x79, 0x18, 0xcc, 0xff, 0x89, 0x99, 0x84, 0xa1, 0xae, 0x13}} ,\n {{0x44, 0x1f, 0xb8, 0xc2, 0x01, 0xc1, 0x30, 0x19, 0x55, 0x05, 0x60, 0x10, 0xa4, 0x6c, 0x2d, 0x67, 0x70, 0xe5, 0x25, 0x1b, 0xf2, 0xbf, 0xdd, 0xfb, 0x70, 0x2b, 0xa1, 0x8c, 0x9c, 0x94, 0x84, 0x08}}},\n{{{0xe7, 0xc4, 0x43, 0x4d, 0xc9, 0x2b, 0x69, 0x5d, 0x1d, 0x3c, 0xaf, 0xbb, 0x43, 0x38, 0x4e, 0x98, 0x3d, 0xed, 0x0d, 0x21, 0x03, 0xfd, 0xf0, 0x99, 0x47, 0x04, 0xb0, 0x98, 0x69, 0x55, 0x72, 0x0f}} ,\n {{0x5e, 0xdf, 0x15, 0x53, 0x3b, 0x86, 0x80, 0xb0, 0xf1, 0x70, 0x68, 0x8f, 0x66, 0x7c, 0x0e, 0x49, 0x1a, 0xd8, 0x6b, 0xfe, 0x4e, 0xef, 0xca, 0x47, 0xd4, 0x03, 0xc1, 0x37, 0x50, 0x9c, 0xc1, 0x16}}},\n{{{0xcd, 0x24, 0xc6, 0x3e, 0x0c, 0x82, 0x9b, 0x91, 0x2b, 0x61, 0x4a, 0xb2, 0x0f, 0x88, 0x55, 0x5f, 0x5a, 0x57, 0xff, 0xe5, 0x74, 0x0b, 0x13, 0x43, 0x00, 0xd8, 0x6b, 0xcf, 0xd2, 0x15, 0x03, 0x2c}} ,\n {{0xdc, 0xff, 0x15, 0x61, 0x2f, 0x4a, 0x2f, 0x62, 0xf2, 0x04, 0x2f, 0xb5, 0x0c, 0xb7, 0x1e, 0x3f, 0x74, 0x1a, 0x0f, 0xd7, 0xea, 0xcd, 0xd9, 0x7d, 0xf6, 0x12, 0x0e, 0x2f, 0xdb, 0x5a, 0x3b, 0x16}}},\n{{{0x1b, 0x37, 0x47, 0xe3, 0xf5, 0x9e, 0xea, 0x2c, 0x2a, 0xe7, 0x82, 0x36, 0xf4, 0x1f, 0x81, 0x47, 0x92, 0x4b, 0x69, 0x0e, 0x11, 0x8c, 0x5d, 0x53, 0x5b, 0x81, 0x27, 0x08, 0xbc, 0xa0, 0xae, 0x25}} ,\n {{0x69, 0x32, 0xa1, 0x05, 0x11, 0x42, 0x00, 0xd2, 0x59, 0xac, 0x4d, 0x62, 0x8b, 0x13, 0xe2, 0x50, 0x5d, 0xa0, 0x9d, 0x9b, 0xfd, 0xbb, 0x12, 0x41, 0x75, 0x41, 0x9e, 0xcc, 0xdc, 0xc7, 0xdc, 0x5d}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0xd9, 0xe3, 0x38, 0x06, 0x46, 0x70, 0x82, 0x5e, 0x28, 0x49, 0x79, 0xff, 0x25, 0xd2, 0x4e, 0x29, 0x8d, 0x06, 0xb0, 0x23, 0xae, 0x9b, 0x66, 0xe4, 0x7d, 0xc0, 0x70, 0x91, 0xa3, 0xfc, 0xec, 0x4e}} ,\n {{0x62, 0x12, 0x37, 0x6a, 0x30, 0xf6, 0x1e, 0xfb, 0x14, 0x5c, 0x0d, 0x0e, 0xb7, 0x81, 0x6a, 0xe7, 0x08, 0x05, 0xac, 0xaa, 0x38, 0x46, 0xe2, 0x73, 0xea, 0x4b, 0x07, 0x81, 0x43, 0x7c, 0x9e, 0x5e}}},\n{{{0xfc, 0xf9, 0x21, 0x4f, 0x2e, 0x76, 0x9b, 0x1f, 0x28, 0x60, 0x77, 0x43, 0x32, 0x9d, 0xbe, 0x17, 0x30, 0x2a, 0xc6, 0x18, 0x92, 0x66, 0x62, 0x30, 0x98, 0x40, 0x11, 0xa6, 0x7f, 0x18, 0x84, 0x28}} ,\n {{0x3f, 0xab, 0xd3, 0xf4, 0x8a, 0x76, 0xa1, 0x3c, 0xca, 0x2d, 0x49, 0xc3, 0xea, 0x08, 0x0b, 0x85, 0x17, 0x2a, 0xc3, 0x6c, 0x08, 0xfd, 0x57, 0x9f, 0x3d, 0x5f, 0xdf, 0x67, 0x68, 0x42, 0x00, 0x32}}},\n{{{0x51, 0x60, 0x1b, 0x06, 0x4f, 0x8a, 0x21, 0xba, 0x38, 0xa8, 0xba, 0xd6, 0x40, 0xf6, 0xe9, 0x9b, 0x76, 0x4d, 0x56, 0x21, 0x5b, 0x0a, 0x9b, 0x2e, 0x4f, 0x3d, 0x81, 0x32, 0x08, 0x9f, 0x97, 0x5b}} ,\n {{0xe5, 0x44, 0xec, 0x06, 0x9d, 0x90, 0x79, 0x9f, 0xd3, 0xe0, 0x79, 0xaf, 0x8f, 0x10, 0xfd, 0xdd, 0x04, 0xae, 0x27, 0x97, 0x46, 0x33, 0x79, 0xea, 0xb8, 0x4e, 0xca, 0x5a, 0x59, 0x57, 0xe1, 0x0e}}},\n{{{0x1a, 0xda, 0xf3, 0xa5, 0x41, 0x43, 0x28, 0xfc, 0x7e, 0xe7, 0x71, 0xea, 0xc6, 0x3b, 0x59, 0xcc, 0x2e, 0xd3, 0x40, 0xec, 0xb3, 0x13, 0x6f, 0x44, 0xcd, 0x13, 0xb2, 0x37, 0xf2, 0x6e, 0xd9, 0x1c}} ,\n {{0xe3, 0xdb, 0x60, 0xcd, 0x5c, 0x4a, 0x18, 0x0f, 0xef, 0x73, 0x36, 0x71, 0x8c, 0xf6, 0x11, 0xb4, 0xd8, 0xce, 0x17, 0x5e, 0x4f, 0x26, 0x77, 0x97, 0x5f, 0xcb, 0xef, 0x91, 0xeb, 0x6a, 0x62, 0x7a}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x18, 0x4a, 0xa2, 0x97, 0x08, 0x81, 0x2d, 0x83, 0xc4, 0xcc, 0xf0, 0x83, 0x7e, 0xec, 0x0d, 0x95, 0x4c, 0x5b, 0xfb, 0xfa, 0x98, 0x80, 0x4a, 0x66, 0x56, 0x0c, 0x51, 0xb3, 0xf2, 0x04, 0x5d, 0x27}} ,\n {{0x3b, 0xb9, 0xb8, 0x06, 0x5a, 0x2e, 0xfe, 0xc3, 0x82, 0x37, 0x9c, 0xa3, 0x11, 0x1f, 0x9c, 0xa6, 0xda, 0x63, 0x48, 0x9b, 0xad, 0xde, 0x2d, 0xa6, 0xbc, 0x6e, 0x32, 0xda, 0x27, 0x65, 0xdd, 0x57}}},\n{{{0x84, 0x4f, 0x37, 0x31, 0x7d, 0x2e, 0xbc, 0xad, 0x87, 0x07, 0x2a, 0x6b, 0x37, 0xfc, 0x5f, 0xeb, 0x4e, 0x75, 0x35, 0xa6, 0xde, 0xab, 0x0a, 0x19, 0x3a, 0xb7, 0xb1, 0xef, 0x92, 0x6a, 0x3b, 0x3c}} ,\n {{0x3b, 0xb2, 0x94, 0x6d, 0x39, 0x60, 0xac, 0xee, 0xe7, 0x81, 0x1a, 0x3b, 0x76, 0x87, 0x5c, 0x05, 0x94, 0x2a, 0x45, 0xb9, 0x80, 0xe9, 0x22, 0xb1, 0x07, 0xcb, 0x40, 0x9e, 0x70, 0x49, 0x6d, 0x12}}},\n{{{0xfd, 0x18, 0x78, 0x84, 0xa8, 0x4c, 0x7d, 0x6e, 0x59, 0xa6, 0xe5, 0x74, 0xf1, 0x19, 0xa6, 0x84, 0x2e, 0x51, 0xc1, 0x29, 0x13, 0xf2, 0x14, 0x6b, 0x5d, 0x53, 0x51, 0xf7, 0xef, 0xbf, 0x01, 0x22}} ,\n {{0xa4, 0x4b, 0x62, 0x4c, 0xe6, 0xfd, 0x72, 0x07, 0xf2, 0x81, 0xfc, 0xf2, 0xbd, 0x12, 0x7c, 0x68, 0x76, 0x2a, 0xba, 0xf5, 0x65, 0xb1, 0x1f, 0x17, 0x0a, 0x38, 0xb0, 0xbf, 0xc0, 0xf8, 0xf4, 0x2a}}},\n{{{0x55, 0x60, 0x55, 0x5b, 0xe4, 0x1d, 0x71, 0x4c, 0x9d, 0x5b, 0x9f, 0x70, 0xa6, 0x85, 0x9a, 0x2c, 0xa0, 0xe2, 0x32, 0x48, 0xce, 0x9e, 0x2a, 0xa5, 0x07, 0x3b, 0xc7, 0x6c, 0x86, 0x77, 0xde, 0x3c}} ,\n {{0xf7, 0x18, 0x7a, 0x96, 0x7e, 0x43, 0x57, 0xa9, 0x55, 0xfc, 0x4e, 0xb6, 0x72, 0x00, 0xf2, 0xe4, 0xd7, 0x52, 0xd3, 0xd3, 0xb6, 0x85, 0xf6, 0x71, 0xc7, 0x44, 0x3f, 0x7f, 0xd7, 0xb3, 0xf2, 0x79}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x46, 0xca, 0xa7, 0x55, 0x7b, 0x79, 0xf3, 0xca, 0x5a, 0x65, 0xf6, 0xed, 0x50, 0x14, 0x7b, 0xe4, 0xc4, 0x2a, 0x65, 0x9e, 0xe2, 0xf9, 0xca, 0xa7, 0x22, 0x26, 0x53, 0xcb, 0x21, 0x5b, 0xa7, 0x31}} ,\n {{0x90, 0xd7, 0xc5, 0x26, 0x08, 0xbd, 0xb0, 0x53, 0x63, 0x58, 0xc3, 0x31, 0x5e, 0x75, 0x46, 0x15, 0x91, 0xa6, 0xf8, 0x2f, 0x1a, 0x08, 0x65, 0x88, 0x2f, 0x98, 0x04, 0xf1, 0x7c, 0x6e, 0x00, 0x77}}},\n{{{0x81, 0x21, 0x61, 0x09, 0xf6, 0x4e, 0xf1, 0x92, 0xee, 0x63, 0x61, 0x73, 0x87, 0xc7, 0x54, 0x0e, 0x42, 0x4b, 0xc9, 0x47, 0xd1, 0xb8, 0x7e, 0x91, 0x75, 0x37, 0x99, 0x28, 0xb8, 0xdd, 0x7f, 0x50}} ,\n {{0x89, 0x8f, 0xc0, 0xbe, 0x5d, 0xd6, 0x9f, 0xa0, 0xf0, 0x9d, 0x81, 0xce, 0x3a, 0x7b, 0x98, 0x58, 0xbb, 0xd7, 0x78, 0xc8, 0x3f, 0x13, 0xf1, 0x74, 0x19, 0xdf, 0xf8, 0x98, 0x89, 0x5d, 0xfa, 0x5f}}},\n{{{0x9e, 0x35, 0x85, 0x94, 0x47, 0x1f, 0x90, 0x15, 0x26, 0xd0, 0x84, 0xed, 0x8a, 0x80, 0xf7, 0x63, 0x42, 0x86, 0x27, 0xd7, 0xf4, 0x75, 0x58, 0xdc, 0x9c, 0xc0, 0x22, 0x7e, 0x20, 0x35, 0xfd, 0x1f}} ,\n {{0x68, 0x0e, 0x6f, 0x97, 0xba, 0x70, 0xbb, 0xa3, 0x0e, 0xe5, 0x0b, 0x12, 0xf4, 0xa2, 0xdc, 0x47, 0xf8, 0xe6, 0xd0, 0x23, 0x6c, 0x33, 0xa8, 0x99, 0x46, 0x6e, 0x0f, 0x44, 0xba, 0x76, 0x48, 0x0f}}},\n{{{0xa3, 0x2a, 0x61, 0x37, 0xe2, 0x59, 0x12, 0x0e, 0x27, 0xba, 0x64, 0x43, 0xae, 0xc0, 0x42, 0x69, 0x79, 0xa4, 0x1e, 0x29, 0x8b, 0x15, 0xeb, 0xf8, 0xaf, 0xd4, 0xa2, 0x68, 0x33, 0xb5, 0x7a, 0x24}} ,\n {{0x2c, 0x19, 0x33, 0xdd, 0x1b, 0xab, 0xec, 0x01, 0xb0, 0x23, 0xf8, 0x42, 0x2b, 0x06, 0x88, 0xea, 0x3d, 0x2d, 0x00, 0x2a, 0x78, 0x45, 0x4d, 0x38, 0xed, 0x2e, 0x2e, 0x44, 0x49, 0xed, 0xcb, 0x33}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0xa0, 0x68, 0xe8, 0x41, 0x8f, 0x91, 0xf8, 0x11, 0x13, 0x90, 0x2e, 0xa7, 0xab, 0x30, 0xef, 0xad, 0xa0, 0x61, 0x00, 0x88, 0xef, 0xdb, 0xce, 0x5b, 0x5c, 0xbb, 0x62, 0xc8, 0x56, 0xf9, 0x00, 0x73}} ,\n {{0x3f, 0x60, 0xc1, 0x82, 0x2d, 0xa3, 0x28, 0x58, 0x24, 0x9e, 0x9f, 0xe3, 0x70, 0xcc, 0x09, 0x4e, 0x1a, 0x3f, 0x11, 0x11, 0x15, 0x07, 0x3c, 0xa4, 0x41, 0xe0, 0x65, 0xa3, 0x0a, 0x41, 0x6d, 0x11}}},\n{{{0x31, 0x40, 0x01, 0x52, 0x56, 0x94, 0x5b, 0x28, 0x8a, 0xaa, 0x52, 0xee, 0xd8, 0x0a, 0x05, 0x8d, 0xcd, 0xb5, 0xaa, 0x2e, 0x38, 0xaa, 0xb7, 0x87, 0xf7, 0x2b, 0xfb, 0x04, 0xcb, 0x84, 0x3d, 0x54}} ,\n {{0x20, 0xef, 0x59, 0xde, 0xa4, 0x2b, 0x93, 0x6e, 0x2e, 0xec, 0x42, 0x9a, 0xd4, 0x2d, 0xf4, 0x46, 0x58, 0x27, 0x2b, 0x18, 0x8f, 0x83, 0x3d, 0x69, 0x9e, 0xd4, 0x3e, 0xb6, 0xc5, 0xfd, 0x58, 0x03}}},\n{{{0x33, 0x89, 0xc9, 0x63, 0x62, 0x1c, 0x17, 0xb4, 0x60, 0xc4, 0x26, 0x68, 0x09, 0xc3, 0x2e, 0x37, 0x0f, 0x7b, 0xb4, 0x9c, 0xb6, 0xf9, 0xfb, 0xd4, 0x51, 0x78, 0xc8, 0x63, 0xea, 0x77, 0x47, 0x07}} ,\n {{0x32, 0xb4, 0x18, 0x47, 0x79, 0xcb, 0xd4, 0x5a, 0x07, 0x14, 0x0f, 0xa0, 0xd5, 0xac, 0xd0, 0x41, 0x40, 0xab, 0x61, 0x23, 0xe5, 0x2a, 0x2a, 0x6f, 0xf7, 0xa8, 0xd4, 0x76, 0xef, 0xe7, 0x45, 0x6c}}},\n{{{0xa1, 0x5e, 0x60, 0x4f, 0xfb, 0xe1, 0x70, 0x6a, 0x1f, 0x55, 0x4f, 0x09, 0xb4, 0x95, 0x33, 0x36, 0xc6, 0x81, 0x01, 0x18, 0x06, 0x25, 0x27, 0xa4, 0xb4, 0x24, 0xa4, 0x86, 0x03, 0x4c, 0xac, 0x02}} ,\n {{0x77, 0x38, 0xde, 0xd7, 0x60, 0x48, 0x07, 0xf0, 0x74, 0xa8, 0xff, 0x54, 0xe5, 0x30, 0x43, 0xff, 0x77, 0xfb, 0x21, 0x07, 0xff, 0xb2, 0x07, 0x6b, 0xe4, 0xe5, 0x30, 0xfc, 0x19, 0x6c, 0xa3, 0x01}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x13, 0xc5, 0x2c, 0xac, 0xd3, 0x83, 0x82, 0x7c, 0x29, 0xf7, 0x05, 0xa5, 0x00, 0xb6, 0x1f, 0x86, 0x55, 0xf4, 0xd6, 0x2f, 0x0c, 0x99, 0xd0, 0x65, 0x9b, 0x6b, 0x46, 0x0d, 0x43, 0xf8, 0x16, 0x28}} ,\n {{0x1e, 0x7f, 0xb4, 0x74, 0x7e, 0xb1, 0x89, 0x4f, 0x18, 0x5a, 0xab, 0x64, 0x06, 0xdf, 0x45, 0x87, 0xe0, 0x6a, 0xc6, 0xf0, 0x0e, 0xc9, 0x24, 0x35, 0x38, 0xea, 0x30, 0x54, 0xb4, 0xc4, 0x52, 0x54}}},\n{{{0xe9, 0x9f, 0xdc, 0x3f, 0xc1, 0x89, 0x44, 0x74, 0x27, 0xe4, 0xc1, 0x90, 0xff, 0x4a, 0xa7, 0x3c, 0xee, 0xcd, 0xf4, 0x1d, 0x25, 0x94, 0x7f, 0x63, 0x16, 0x48, 0xbc, 0x64, 0xfe, 0x95, 0xc4, 0x0c}} ,\n {{0x8b, 0x19, 0x75, 0x6e, 0x03, 0x06, 0x5e, 0x6a, 0x6f, 0x1a, 0x8c, 0xe3, 0xd3, 0x28, 0xf2, 0xe0, 0xb9, 0x7a, 0x43, 0x69, 0xe6, 0xd3, 0xc0, 0xfe, 0x7e, 0x97, 0xab, 0x6c, 0x7b, 0x8e, 0x13, 0x42}}},\n{{{0xd4, 0xca, 0x70, 0x3d, 0xab, 0xfb, 0x5f, 0x5e, 0x00, 0x0c, 0xcc, 0x77, 0x22, 0xf8, 0x78, 0x55, 0xae, 0x62, 0x35, 0xfb, 0x9a, 0xc6, 0x03, 0xe4, 0x0c, 0xee, 0xab, 0xc7, 0xc0, 0x89, 0x87, 0x54}} ,\n {{0x32, 0xad, 0xae, 0x85, 0x58, 0x43, 0xb8, 0xb1, 0xe6, 0x3e, 0x00, 0x9c, 0x78, 0x88, 0x56, 0xdb, 0x9c, 0xfc, 0x79, 0xf6, 0xf9, 0x41, 0x5f, 0xb7, 0xbc, 0x11, 0xf9, 0x20, 0x36, 0x1c, 0x53, 0x2b}}},\n{{{0x5a, 0x20, 0x5b, 0xa1, 0xa5, 0x44, 0x91, 0x24, 0x02, 0x63, 0x12, 0x64, 0xb8, 0x55, 0xf6, 0xde, 0x2c, 0xdb, 0x47, 0xb8, 0xc6, 0x0a, 0xc3, 0x00, 0x78, 0x93, 0xd8, 0xf5, 0xf5, 0x18, 0x28, 0x0a}} ,\n {{0xd6, 0x1b, 0x9a, 0x6c, 0xe5, 0x46, 0xea, 0x70, 0x96, 0x8d, 0x4e, 0x2a, 0x52, 0x21, 0x26, 0x4b, 0xb1, 0xbb, 0x0f, 0x7c, 0xa9, 0x9b, 0x04, 0xbb, 0x51, 0x08, 0xf1, 0x9a, 0xa4, 0x76, 0x7c, 0x18}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0xfa, 0x94, 0xf7, 0x40, 0xd0, 0xd7, 0xeb, 0xa9, 0x82, 0x36, 0xd5, 0x15, 0xb9, 0x33, 0x7a, 0xbf, 0x8a, 0xf2, 0x63, 0xaa, 0x37, 0xf5, 0x59, 0xac, 0xbd, 0xbb, 0x32, 0x36, 0xbe, 0x73, 0x99, 0x38}} ,\n {{0x2c, 0xb3, 0xda, 0x7a, 0xd8, 0x3d, 0x99, 0xca, 0xd2, 0xf4, 0xda, 0x99, 0x8e, 0x4f, 0x98, 0xb7, 0xf4, 0xae, 0x3e, 0x9f, 0x8e, 0x35, 0x60, 0xa4, 0x33, 0x75, 0xa4, 0x04, 0x93, 0xb1, 0x6b, 0x4d}}},\n{{{0x97, 0x9d, 0xa8, 0xcd, 0x97, 0x7b, 0x9d, 0xb9, 0xe7, 0xa5, 0xef, 0xfd, 0xa8, 0x42, 0x6b, 0xc3, 0x62, 0x64, 0x7d, 0xa5, 0x1b, 0xc9, 0x9e, 0xd2, 0x45, 0xb9, 0xee, 0x03, 0xb0, 0xbf, 0xc0, 0x68}} ,\n {{0xed, 0xb7, 0x84, 0x2c, 0xf6, 0xd3, 0xa1, 0x6b, 0x24, 0x6d, 0x87, 0x56, 0x97, 0x59, 0x79, 0x62, 0x9f, 0xac, 0xed, 0xf3, 0xc9, 0x89, 0x21, 0x2e, 0x04, 0xb3, 0xcc, 0x2f, 0xbe, 0xd6, 0x0a, 0x4b}}},\n{{{0x39, 0x61, 0x05, 0xed, 0x25, 0x89, 0x8b, 0x5d, 0x1b, 0xcb, 0x0c, 0x55, 0xf4, 0x6a, 0x00, 0x8a, 0x46, 0xe8, 0x1e, 0xc6, 0x83, 0xc8, 0x5a, 0x76, 0xdb, 0xcc, 0x19, 0x7a, 0xcc, 0x67, 0x46, 0x0b}} ,\n {{0x53, 0xcf, 0xc2, 0xa1, 0xad, 0x6a, 0xf3, 0xcd, 0x8f, 0xc9, 0xde, 0x1c, 0xf8, 0x6c, 0x8f, 0xf8, 0x76, 0x42, 0xe7, 0xfe, 0xb2, 0x72, 0x21, 0x0a, 0x66, 0x74, 0x8f, 0xb7, 0xeb, 0xe4, 0x6f, 0x01}}},\n{{{0x22, 0x8c, 0x6b, 0xbe, 0xfc, 0x4d, 0x70, 0x62, 0x6e, 0x52, 0x77, 0x99, 0x88, 0x7e, 0x7b, 0x57, 0x7a, 0x0d, 0xfe, 0xdc, 0x72, 0x92, 0xf1, 0x68, 0x1d, 0x97, 0xd7, 0x7c, 0x8d, 0x53, 0x10, 0x37}} ,\n {{0x53, 0x88, 0x77, 0x02, 0xca, 0x27, 0xa8, 0xe5, 0x45, 0xe2, 0xa8, 0x48, 0x2a, 0xab, 0x18, 0xca, 0xea, 0x2d, 0x2a, 0x54, 0x17, 0x37, 0x32, 0x09, 0xdc, 0xe0, 0x4a, 0xb7, 0x7d, 0x82, 0x10, 0x7d}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x8a, 0x64, 0x1e, 0x14, 0x0a, 0x57, 0xd4, 0xda, 0x5c, 0x96, 0x9b, 0x01, 0x4c, 0x67, 0xbf, 0x8b, 0x30, 0xfe, 0x08, 0xdb, 0x0d, 0xd5, 0xa8, 0xd7, 0x09, 0x11, 0x85, 0xa2, 0xd3, 0x45, 0xfb, 0x7e}} ,\n {{0xda, 0x8c, 0xc2, 0xd0, 0xac, 0x18, 0xe8, 0x52, 0x36, 0xd4, 0x21, 0xa3, 0xdd, 0x57, 0x22, 0x79, 0xb7, 0xf8, 0x71, 0x9d, 0xc6, 0x91, 0x70, 0x86, 0x56, 0xbf, 0xa1, 0x11, 0x8b, 0x19, 0xe1, 0x0f}}},\n{{{0x18, 0x32, 0x98, 0x2c, 0x8f, 0x91, 0xae, 0x12, 0xf0, 0x8c, 0xea, 0xf3, 0x3c, 0xb9, 0x5d, 0xe4, 0x69, 0xed, 0xb2, 0x47, 0x18, 0xbd, 0xce, 0x16, 0x52, 0x5c, 0x23, 0xe2, 0xa5, 0x25, 0x52, 0x5d}} ,\n {{0xb9, 0xb1, 0xe7, 0x5d, 0x4e, 0xbc, 0xee, 0xbb, 0x40, 0x81, 0x77, 0x82, 0x19, 0xab, 0xb5, 0xc6, 0xee, 0xab, 0x5b, 0x6b, 0x63, 0x92, 0x8a, 0x34, 0x8d, 0xcd, 0xee, 0x4f, 0x49, 0xe5, 0xc9, 0x7e}}},\n{{{0x21, 0xac, 0x8b, 0x22, 0xcd, 0xc3, 0x9a, 0xe9, 0x5e, 0x78, 0xbd, 0xde, 0xba, 0xad, 0xab, 0xbf, 0x75, 0x41, 0x09, 0xc5, 0x58, 0xa4, 0x7d, 0x92, 0xb0, 0x7f, 0xf2, 0xa1, 0xd1, 0xc0, 0xb3, 0x6d}} ,\n {{0x62, 0x4f, 0xd0, 0x75, 0x77, 0xba, 0x76, 0x77, 0xd7, 0xb8, 0xd8, 0x92, 0x6f, 0x98, 0x34, 0x3d, 0xd6, 0x4e, 0x1c, 0x0f, 0xf0, 0x8f, 0x2e, 0xf1, 0xb3, 0xbd, 0xb1, 0xb9, 0xec, 0x99, 0xb4, 0x07}}},\n{{{0x60, 0x57, 0x2e, 0x9a, 0x72, 0x1d, 0x6b, 0x6e, 0x58, 0x33, 0x24, 0x8c, 0x48, 0x39, 0x46, 0x8e, 0x89, 0x6a, 0x88, 0x51, 0x23, 0x62, 0xb5, 0x32, 0x09, 0x36, 0xe3, 0x57, 0xf5, 0x98, 0xde, 0x6f}} ,\n {{0x8b, 0x2c, 0x00, 0x48, 0x4a, 0xf9, 0x5b, 0x87, 0x69, 0x52, 0xe5, 0x5b, 0xd1, 0xb1, 0xe5, 0x25, 0x25, 0xe0, 0x9c, 0xc2, 0x13, 0x44, 0xe8, 0xb9, 0x0a, 0x70, 0xad, 0xbd, 0x0f, 0x51, 0x94, 0x69}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0xa2, 0xdc, 0xab, 0xa9, 0x25, 0x2d, 0xac, 0x5f, 0x03, 0x33, 0x08, 0xe7, 0x7e, 0xfe, 0x95, 0x36, 0x3c, 0x5b, 0x3a, 0xd3, 0x05, 0x82, 0x1c, 0x95, 0x2d, 0xd8, 0x77, 0x7e, 0x02, 0xd9, 0x5b, 0x70}} ,\n {{0xc2, 0xfe, 0x1b, 0x0c, 0x67, 0xcd, 0xd6, 0xe0, 0x51, 0x8e, 0x2c, 0xe0, 0x79, 0x88, 0xf0, 0xcf, 0x41, 0x4a, 0xad, 0x23, 0xd4, 0x46, 0xca, 0x94, 0xa1, 0xc3, 0xeb, 0x28, 0x06, 0xfa, 0x17, 0x14}}},\n{{{0x7b, 0xaa, 0x70, 0x0a, 0x4b, 0xfb, 0xf5, 0xbf, 0x80, 0xc5, 0xcf, 0x08, 0x7a, 0xdd, 0xa1, 0xf4, 0x9d, 0x54, 0x50, 0x53, 0x23, 0x77, 0x23, 0xf5, 0x34, 0xa5, 0x22, 0xd1, 0x0d, 0x96, 0x2e, 0x47}} ,\n {{0xcc, 0xb7, 0x32, 0x89, 0x57, 0xd0, 0x98, 0x75, 0xe4, 0x37, 0x99, 0xa9, 0xe8, 0xba, 0xed, 0xba, 0xeb, 0xc7, 0x4f, 0x15, 0x76, 0x07, 0x0c, 0x4c, 0xef, 0x9f, 0x52, 0xfc, 0x04, 0x5d, 0x58, 0x10}}},\n{{{0xce, 0x82, 0xf0, 0x8f, 0x79, 0x02, 0xa8, 0xd1, 0xda, 0x14, 0x09, 0x48, 0xee, 0x8a, 0x40, 0x98, 0x76, 0x60, 0x54, 0x5a, 0xde, 0x03, 0x24, 0xf5, 0xe6, 0x2f, 0xe1, 0x03, 0xbf, 0x68, 0x82, 0x7f}} ,\n {{0x64, 0xe9, 0x28, 0xc7, 0xa4, 0xcf, 0x2a, 0xf9, 0x90, 0x64, 0x72, 0x2c, 0x8b, 0xeb, 0xec, 0xa0, 0xf2, 0x7d, 0x35, 0xb5, 0x90, 0x4d, 0x7f, 0x5b, 0x4a, 0x49, 0xe4, 0xb8, 0x3b, 0xc8, 0xa1, 0x2f}}},\n{{{0x8b, 0xc5, 0xcc, 0x3d, 0x69, 0xa6, 0xa1, 0x18, 0x44, 0xbc, 0x4d, 0x77, 0x37, 0xc7, 0x86, 0xec, 0x0c, 0xc9, 0xd6, 0x44, 0xa9, 0x23, 0x27, 0xb9, 0x03, 0x34, 0xa7, 0x0a, 0xd5, 0xc7, 0x34, 0x37}} ,\n {{0xf9, 0x7e, 0x3e, 0x66, 0xee, 0xf9, 0x99, 0x28, 0xff, 0xad, 0x11, 0xd8, 0xe2, 0x66, 0xc5, 0xcd, 0x0f, 0x0d, 0x0b, 0x6a, 0xfc, 0x7c, 0x24, 0xa8, 0x4f, 0xa8, 0x5e, 0x80, 0x45, 0x8b, 0x6c, 0x41}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0xef, 0x1e, 0xec, 0xf7, 0x8d, 0x77, 0xf2, 0xea, 0xdb, 0x60, 0x03, 0x21, 0xc0, 0xff, 0x5e, 0x67, 0xc3, 0x71, 0x0b, 0x21, 0xb4, 0x41, 0xa0, 0x68, 0x38, 0xc6, 0x01, 0xa3, 0xd3, 0x51, 0x3c, 0x3c}} ,\n {{0x92, 0xf8, 0xd6, 0x4b, 0xef, 0x42, 0x13, 0xb2, 0x4a, 0xc4, 0x2e, 0x72, 0x3f, 0xc9, 0x11, 0xbd, 0x74, 0x02, 0x0e, 0xf5, 0x13, 0x9d, 0x83, 0x1a, 0x1b, 0xd5, 0x54, 0xde, 0xc4, 0x1e, 0x16, 0x6c}}},\n{{{0x27, 0x52, 0xe4, 0x63, 0xaa, 0x94, 0xe6, 0xc3, 0x28, 0x9c, 0xc6, 0x56, 0xac, 0xfa, 0xb6, 0xbd, 0xe2, 0xcc, 0x76, 0xc6, 0x27, 0x27, 0xa2, 0x8e, 0x78, 0x2b, 0x84, 0x72, 0x10, 0xbd, 0x4e, 0x2a}} ,\n {{0xea, 0xa7, 0x23, 0xef, 0x04, 0x61, 0x80, 0x50, 0xc9, 0x6e, 0xa5, 0x96, 0xd1, 0xd1, 0xc8, 0xc3, 0x18, 0xd7, 0x2d, 0xfd, 0x26, 0xbd, 0xcb, 0x7b, 0x92, 0x51, 0x0e, 0x4a, 0x65, 0x57, 0xb8, 0x49}}},\n{{{0xab, 0x55, 0x36, 0xc3, 0xec, 0x63, 0x55, 0x11, 0x55, 0xf6, 0xa5, 0xc7, 0x01, 0x5f, 0xfe, 0x79, 0xd8, 0x0a, 0xf7, 0x03, 0xd8, 0x98, 0x99, 0xf5, 0xd0, 0x00, 0x54, 0x6b, 0x66, 0x28, 0xf5, 0x25}} ,\n {{0x7a, 0x8d, 0xa1, 0x5d, 0x70, 0x5d, 0x51, 0x27, 0xee, 0x30, 0x65, 0x56, 0x95, 0x46, 0xde, 0xbd, 0x03, 0x75, 0xb4, 0x57, 0x59, 0x89, 0xeb, 0x02, 0x9e, 0xcc, 0x89, 0x19, 0xa7, 0xcb, 0x17, 0x67}}},\n{{{0x6a, 0xeb, 0xfc, 0x9a, 0x9a, 0x10, 0xce, 0xdb, 0x3a, 0x1c, 0x3c, 0x6a, 0x9d, 0xea, 0x46, 0xbc, 0x45, 0x49, 0xac, 0xe3, 0x41, 0x12, 0x7c, 0xf0, 0xf7, 0x4f, 0xf9, 0xf7, 0xff, 0x2c, 0x89, 0x04}} ,\n {{0x30, 0x31, 0x54, 0x1a, 0x46, 0xca, 0xe6, 0xc6, 0xcb, 0xe2, 0xc3, 0xc1, 0x8b, 0x75, 0x81, 0xbe, 0xee, 0xf8, 0xa3, 0x11, 0x1c, 0x25, 0xa3, 0xa7, 0x35, 0x51, 0x55, 0xe2, 0x25, 0xaa, 0xe2, 0x3a}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0xb4, 0x48, 0x10, 0x9f, 0x8a, 0x09, 0x76, 0xfa, 0xf0, 0x7a, 0xb0, 0x70, 0xf7, 0x83, 0x80, 0x52, 0x84, 0x2b, 0x26, 0xa2, 0xc4, 0x5d, 0x4f, 0xba, 0xb1, 0xc8, 0x40, 0x0d, 0x78, 0x97, 0xc4, 0x60}} ,\n {{0xd4, 0xb1, 0x6c, 0x08, 0xc7, 0x40, 0x38, 0x73, 0x5f, 0x0b, 0xf3, 0x76, 0x5d, 0xb2, 0xa5, 0x2f, 0x57, 0x57, 0x07, 0xed, 0x08, 0xa2, 0x6c, 0x4f, 0x08, 0x02, 0xb5, 0x0e, 0xee, 0x44, 0xfa, 0x22}}},\n{{{0x0f, 0x00, 0x3f, 0xa6, 0x04, 0x19, 0x56, 0x65, 0x31, 0x7f, 0x8b, 0xeb, 0x0d, 0xe1, 0x47, 0x89, 0x97, 0x16, 0x53, 0xfa, 0x81, 0xa7, 0xaa, 0xb2, 0xbf, 0x67, 0xeb, 0x72, 0x60, 0x81, 0x0d, 0x48}} ,\n {{0x7e, 0x13, 0x33, 0xcd, 0xa8, 0x84, 0x56, 0x1e, 0x67, 0xaf, 0x6b, 0x43, 0xac, 0x17, 0xaf, 0x16, 0xc0, 0x52, 0x99, 0x49, 0x5b, 0x87, 0x73, 0x7e, 0xb5, 0x43, 0xda, 0x6b, 0x1d, 0x0f, 0x2d, 0x55}}},\n{{{0xe9, 0x58, 0x1f, 0xff, 0x84, 0x3f, 0x93, 0x1c, 0xcb, 0xe1, 0x30, 0x69, 0xa5, 0x75, 0x19, 0x7e, 0x14, 0x5f, 0xf8, 0xfc, 0x09, 0xdd, 0xa8, 0x78, 0x9d, 0xca, 0x59, 0x8b, 0xd1, 0x30, 0x01, 0x13}} ,\n {{0xff, 0x76, 0x03, 0xc5, 0x4b, 0x89, 0x99, 0x70, 0x00, 0x59, 0x70, 0x9c, 0xd5, 0xd9, 0x11, 0x89, 0x5a, 0x46, 0xfe, 0xef, 0xdc, 0xd9, 0x55, 0x2b, 0x45, 0xa7, 0xb0, 0x2d, 0xfb, 0x24, 0xc2, 0x29}}},\n{{{0x38, 0x06, 0xf8, 0x0b, 0xac, 0x82, 0xc4, 0x97, 0x2b, 0x90, 0xe0, 0xf7, 0xa8, 0xab, 0x6c, 0x08, 0x80, 0x66, 0x90, 0x46, 0xf7, 0x26, 0x2d, 0xf8, 0xf1, 0xc4, 0x6b, 0x4a, 0x82, 0x98, 0x8e, 0x37}} ,\n {{0x8e, 0xb4, 0xee, 0xb8, 0xd4, 0x3f, 0xb2, 0x1b, 0xe0, 0x0a, 0x3d, 0x75, 0x34, 0x28, 0xa2, 0x8e, 0xc4, 0x92, 0x7b, 0xfe, 0x60, 0x6e, 0x6d, 0xb8, 0x31, 0x1d, 0x62, 0x0d, 0x78, 0x14, 0x42, 0x11}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x5e, 0xa8, 0xd8, 0x04, 0x9b, 0x73, 0xc9, 0xc9, 0xdc, 0x0d, 0x73, 0xbf, 0x0a, 0x0a, 0x73, 0xff, 0x18, 0x1f, 0x9c, 0x51, 0xaa, 0xc6, 0xf1, 0x83, 0x25, 0xfd, 0xab, 0xa3, 0x11, 0xd3, 0x01, 0x24}} ,\n {{0x4d, 0xe3, 0x7e, 0x38, 0x62, 0x5e, 0x64, 0xbb, 0x2b, 0x53, 0xb5, 0x03, 0x68, 0xc4, 0xf2, 0x2b, 0x5a, 0x03, 0x32, 0x99, 0x4a, 0x41, 0x9a, 0xe1, 0x1a, 0xae, 0x8c, 0x48, 0xf3, 0x24, 0x32, 0x65}}},\n{{{0xe8, 0xdd, 0xad, 0x3a, 0x8c, 0xea, 0xf4, 0xb3, 0xb2, 0xe5, 0x73, 0xf2, 0xed, 0x8b, 0xbf, 0xed, 0xb1, 0x0c, 0x0c, 0xfb, 0x2b, 0xf1, 0x01, 0x48, 0xe8, 0x26, 0x03, 0x8e, 0x27, 0x4d, 0x96, 0x72}} ,\n {{0xc8, 0x09, 0x3b, 0x60, 0xc9, 0x26, 0x4d, 0x7c, 0xf2, 0x9c, 0xd4, 0xa1, 0x3b, 0x26, 0xc2, 0x04, 0x33, 0x44, 0x76, 0x3c, 0x02, 0xbb, 0x11, 0x42, 0x0c, 0x22, 0xb7, 0xc6, 0xe1, 0xac, 0xb4, 0x0e}}},\n{{{0x6f, 0x85, 0xe7, 0xef, 0xde, 0x67, 0x30, 0xfc, 0xbf, 0x5a, 0xe0, 0x7b, 0x7a, 0x2a, 0x54, 0x6b, 0x5d, 0x62, 0x85, 0xa1, 0xf8, 0x16, 0x88, 0xec, 0x61, 0xb9, 0x96, 0xb5, 0xef, 0x2d, 0x43, 0x4d}} ,\n {{0x7c, 0x31, 0x33, 0xcc, 0xe4, 0xcf, 0x6c, 0xff, 0x80, 0x47, 0x77, 0xd1, 0xd8, 0xe9, 0x69, 0x97, 0x98, 0x7f, 0x20, 0x57, 0x1d, 0x1d, 0x4f, 0x08, 0x27, 0xc8, 0x35, 0x57, 0x40, 0xc6, 0x21, 0x0c}}},\n{{{0xd2, 0x8e, 0x9b, 0xfa, 0x42, 0x8e, 0xdf, 0x8f, 0xc7, 0x86, 0xf9, 0xa4, 0xca, 0x70, 0x00, 0x9d, 0x21, 0xbf, 0xec, 0x57, 0x62, 0x30, 0x58, 0x8c, 0x0d, 0x35, 0xdb, 0x5d, 0x8b, 0x6a, 0xa0, 0x5a}} ,\n {{0xc1, 0x58, 0x7c, 0x0d, 0x20, 0xdd, 0x11, 0x26, 0x5f, 0x89, 0x3b, 0x97, 0x58, 0xf8, 0x8b, 0xe3, 0xdf, 0x32, 0xe2, 0xfc, 0xd8, 0x67, 0xf2, 0xa5, 0x37, 0x1e, 0x6d, 0xec, 0x7c, 0x27, 0x20, 0x79}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0xd0, 0xe9, 0xc0, 0xfa, 0x95, 0x45, 0x23, 0x96, 0xf1, 0x2c, 0x79, 0x25, 0x14, 0xce, 0x40, 0x14, 0x44, 0x2c, 0x36, 0x50, 0xd9, 0x63, 0x56, 0xb7, 0x56, 0x3b, 0x9e, 0xa7, 0xef, 0x89, 0xbb, 0x0e}} ,\n {{0xce, 0x7f, 0xdc, 0x0a, 0xcc, 0x82, 0x1c, 0x0a, 0x78, 0x71, 0xe8, 0x74, 0x8d, 0x01, 0x30, 0x0f, 0xa7, 0x11, 0x4c, 0xdf, 0x38, 0xd7, 0xa7, 0x0d, 0xf8, 0x48, 0x52, 0x00, 0x80, 0x7b, 0x5f, 0x0e}}},\n{{{0x25, 0x83, 0xe6, 0x94, 0x7b, 0x81, 0xb2, 0x91, 0xae, 0x0e, 0x05, 0xc9, 0xa3, 0x68, 0x2d, 0xd9, 0x88, 0x25, 0x19, 0x2a, 0x61, 0x61, 0x21, 0x97, 0x15, 0xa1, 0x35, 0xa5, 0x46, 0xc8, 0xa2, 0x0e}} ,\n {{0x1b, 0x03, 0x0d, 0x8b, 0x5a, 0x1b, 0x97, 0x4b, 0xf2, 0x16, 0x31, 0x3d, 0x1f, 0x33, 0xa0, 0x50, 0x3a, 0x18, 0xbe, 0x13, 0xa1, 0x76, 0xc1, 0xba, 0x1b, 0xf1, 0x05, 0x7b, 0x33, 0xa8, 0x82, 0x3b}}},\n{{{0xba, 0x36, 0x7b, 0x6d, 0xa9, 0xea, 0x14, 0x12, 0xc5, 0xfa, 0x91, 0x00, 0xba, 0x9b, 0x99, 0xcc, 0x56, 0x02, 0xe9, 0xa0, 0x26, 0x40, 0x66, 0x8c, 0xc4, 0xf8, 0x85, 0x33, 0x68, 0xe7, 0x03, 0x20}} ,\n {{0x50, 0x5b, 0xff, 0xa9, 0xb2, 0xf1, 0xf1, 0x78, 0xcf, 0x14, 0xa4, 0xa9, 0xfc, 0x09, 0x46, 0x94, 0x54, 0x65, 0x0d, 0x9c, 0x5f, 0x72, 0x21, 0xe2, 0x97, 0xa5, 0x2d, 0x81, 0xce, 0x4a, 0x5f, 0x79}}},\n{{{0x3d, 0x5f, 0x5c, 0xd2, 0xbc, 0x7d, 0x77, 0x0e, 0x2a, 0x6d, 0x22, 0x45, 0x84, 0x06, 0xc4, 0xdd, 0xc6, 0xa6, 0xc6, 0xd7, 0x49, 0xad, 0x6d, 0x87, 0x91, 0x0e, 0x3a, 0x67, 0x1d, 0x2c, 0x1d, 0x56}} ,\n {{0xfe, 0x7a, 0x74, 0xcf, 0xd4, 0xd2, 0xe5, 0x19, 0xde, 0xd0, 0xdb, 0x70, 0x23, 0x69, 0xe6, 0x6d, 0xec, 0xec, 0xcc, 0x09, 0x33, 0x6a, 0x77, 0xdc, 0x6b, 0x22, 0x76, 0x5d, 0x92, 0x09, 0xac, 0x2d}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x23, 0x15, 0x17, 0xeb, 0xd3, 0xdb, 0x12, 0x5e, 0x01, 0xf0, 0x91, 0xab, 0x2c, 0x41, 0xce, 0xac, 0xed, 0x1b, 0x4b, 0x2d, 0xbc, 0xdb, 0x17, 0x66, 0x89, 0x46, 0xad, 0x4b, 0x1e, 0x6f, 0x0b, 0x14}} ,\n {{0x11, 0xce, 0xbf, 0xb6, 0x77, 0x2d, 0x48, 0x22, 0x18, 0x4f, 0xa3, 0x5d, 0x4a, 0xb0, 0x70, 0x12, 0x3e, 0x54, 0xd7, 0xd8, 0x0e, 0x2b, 0x27, 0xdc, 0x53, 0xff, 0xca, 0x8c, 0x59, 0xb3, 0x4e, 0x44}}},\n{{{0x07, 0x76, 0x61, 0x0f, 0x66, 0xb2, 0x21, 0x39, 0x7e, 0xc0, 0xec, 0x45, 0x28, 0x82, 0xa1, 0x29, 0x32, 0x44, 0x35, 0x13, 0x5e, 0x61, 0x5e, 0x54, 0xcb, 0x7c, 0xef, 0xf6, 0x41, 0xcf, 0x9f, 0x0a}} ,\n {{0xdd, 0xf9, 0xda, 0x84, 0xc3, 0xe6, 0x8a, 0x9f, 0x24, 0xd2, 0x96, 0x5d, 0x39, 0x6f, 0x58, 0x8c, 0xc1, 0x56, 0x93, 0xab, 0xb5, 0x79, 0x3b, 0xd2, 0xa8, 0x73, 0x16, 0xed, 0xfa, 0xb4, 0x2f, 0x73}}},\n{{{0x8b, 0xb1, 0x95, 0xe5, 0x92, 0x50, 0x35, 0x11, 0x76, 0xac, 0xf4, 0x4d, 0x24, 0xc3, 0x32, 0xe6, 0xeb, 0xfe, 0x2c, 0x87, 0xc4, 0xf1, 0x56, 0xc4, 0x75, 0x24, 0x7a, 0x56, 0x85, 0x5a, 0x3a, 0x13}} ,\n {{0x0d, 0x16, 0xac, 0x3c, 0x4a, 0x58, 0x86, 0x3a, 0x46, 0x7f, 0x6c, 0xa3, 0x52, 0x6e, 0x37, 0xe4, 0x96, 0x9c, 0xe9, 0x5c, 0x66, 0x41, 0x67, 0xe4, 0xfb, 0x79, 0x0c, 0x05, 0xf6, 0x64, 0xd5, 0x7c}}},\n{{{0x28, 0xc1, 0xe1, 0x54, 0x73, 0xf2, 0xbf, 0x76, 0x74, 0x19, 0x19, 0x1b, 0xe4, 0xb9, 0xa8, 0x46, 0x65, 0x73, 0xf3, 0x77, 0x9b, 0x29, 0x74, 0x5b, 0xc6, 0x89, 0x6c, 0x2c, 0x7c, 0xf8, 0xb3, 0x0f}} ,\n {{0xf7, 0xd5, 0xe9, 0x74, 0x5d, 0xb8, 0x25, 0x16, 0xb5, 0x30, 0xbc, 0x84, 0xc5, 0xf0, 0xad, 0xca, 0x12, 0x28, 0xbc, 0x9d, 0xd4, 0xfa, 0x82, 0xe6, 0xe3, 0xbf, 0xa2, 0x15, 0x2c, 0xd4, 0x34, 0x10}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x61, 0xb1, 0x46, 0xba, 0x0e, 0x31, 0xa5, 0x67, 0x6c, 0x7f, 0xd6, 0xd9, 0x27, 0x85, 0x0f, 0x79, 0x14, 0xc8, 0x6c, 0x2f, 0x5f, 0x5b, 0x9c, 0x35, 0x3d, 0x38, 0x86, 0x77, 0x65, 0x55, 0x6a, 0x7b}} ,\n {{0xd3, 0xb0, 0x3a, 0x66, 0x60, 0x1b, 0x43, 0xf1, 0x26, 0x58, 0x99, 0x09, 0x8f, 0x2d, 0xa3, 0x14, 0x71, 0x85, 0xdb, 0xed, 0xf6, 0x26, 0xd5, 0x61, 0x9a, 0x73, 0xac, 0x0e, 0xea, 0xac, 0xb7, 0x0c}}},\n{{{0x5e, 0xf4, 0xe5, 0x17, 0x0e, 0x10, 0x9f, 0xe7, 0x43, 0x5f, 0x67, 0x5c, 0xac, 0x4b, 0xe5, 0x14, 0x41, 0xd2, 0xbf, 0x48, 0xf5, 0x14, 0xb0, 0x71, 0xc6, 0x61, 0xc1, 0xb2, 0x70, 0x58, 0xd2, 0x5a}} ,\n {{0x2d, 0xba, 0x16, 0x07, 0x92, 0x94, 0xdc, 0xbd, 0x50, 0x2b, 0xc9, 0x7f, 0x42, 0x00, 0xba, 0x61, 0xed, 0xf8, 0x43, 0xed, 0xf5, 0xf9, 0x40, 0x60, 0xb2, 0xb0, 0x82, 0xcb, 0xed, 0x75, 0xc7, 0x65}}},\n{{{0x80, 0xba, 0x0d, 0x09, 0x40, 0xa7, 0x39, 0xa6, 0x67, 0x34, 0x7e, 0x66, 0xbe, 0x56, 0xfb, 0x53, 0x78, 0xc4, 0x46, 0xe8, 0xed, 0x68, 0x6c, 0x7f, 0xce, 0xe8, 0x9f, 0xce, 0xa2, 0x64, 0x58, 0x53}} ,\n {{0xe8, 0xc1, 0xa9, 0xc2, 0x7b, 0x59, 0x21, 0x33, 0xe2, 0x43, 0x73, 0x2b, 0xac, 0x2d, 0xc1, 0x89, 0x3b, 0x15, 0xe2, 0xd5, 0xc0, 0x97, 0x8a, 0xfd, 0x6f, 0x36, 0x33, 0xb7, 0xb9, 0xc3, 0x88, 0x09}}},\n{{{0xd0, 0xb6, 0x56, 0x30, 0x5c, 0xae, 0xb3, 0x75, 0x44, 0xa4, 0x83, 0x51, 0x6e, 0x01, 0x65, 0xef, 0x45, 0x76, 0xe6, 0xf5, 0xa2, 0x0d, 0xd4, 0x16, 0x3b, 0x58, 0x2f, 0xf2, 0x2f, 0x36, 0x18, 0x3f}} ,\n {{0xfd, 0x2f, 0xe0, 0x9b, 0x1e, 0x8c, 0xc5, 0x18, 0xa9, 0xca, 0xd4, 0x2b, 0x35, 0xb6, 0x95, 0x0a, 0x9f, 0x7e, 0xfb, 0xc4, 0xef, 0x88, 0x7b, 0x23, 0x43, 0xec, 0x2f, 0x0d, 0x0f, 0x7a, 0xfc, 0x5c}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x8d, 0xd2, 0xda, 0xc7, 0x44, 0xd6, 0x7a, 0xdb, 0x26, 0x7d, 0x1d, 0xb8, 0xe1, 0xde, 0x9d, 0x7a, 0x7d, 0x17, 0x7e, 0x1c, 0x37, 0x04, 0x8d, 0x2d, 0x7c, 0x5e, 0x18, 0x38, 0x1e, 0xaf, 0xc7, 0x1b}} ,\n {{0x33, 0x48, 0x31, 0x00, 0x59, 0xf6, 0xf2, 0xca, 0x0f, 0x27, 0x1b, 0x63, 0x12, 0x7e, 0x02, 0x1d, 0x49, 0xc0, 0x5d, 0x79, 0x87, 0xef, 0x5e, 0x7a, 0x2f, 0x1f, 0x66, 0x55, 0xd8, 0x09, 0xd9, 0x61}}},\n{{{0x54, 0x83, 0x02, 0x18, 0x82, 0x93, 0x99, 0x07, 0xd0, 0xa7, 0xda, 0xd8, 0x75, 0x89, 0xfa, 0xf2, 0xd9, 0xa3, 0xb8, 0x6b, 0x5a, 0x35, 0x28, 0xd2, 0x6b, 0x59, 0xc2, 0xf8, 0x45, 0xe2, 0xbc, 0x06}} ,\n {{0x65, 0xc0, 0xa3, 0x88, 0x51, 0x95, 0xfc, 0x96, 0x94, 0x78, 0xe8, 0x0d, 0x8b, 0x41, 0xc9, 0xc2, 0x58, 0x48, 0x75, 0x10, 0x2f, 0xcd, 0x2a, 0xc9, 0xa0, 0x6d, 0x0f, 0xdd, 0x9c, 0x98, 0x26, 0x3d}}},\n{{{0x2f, 0x66, 0x29, 0x1b, 0x04, 0x89, 0xbd, 0x7e, 0xee, 0x6e, 0xdd, 0xb7, 0x0e, 0xef, 0xb0, 0x0c, 0xb4, 0xfc, 0x7f, 0xc2, 0xc9, 0x3a, 0x3c, 0x64, 0xef, 0x45, 0x44, 0xaf, 0x8a, 0x90, 0x65, 0x76}} ,\n {{0xa1, 0x4c, 0x70, 0x4b, 0x0e, 0xa0, 0x83, 0x70, 0x13, 0xa4, 0xaf, 0xb8, 0x38, 0x19, 0x22, 0x65, 0x09, 0xb4, 0x02, 0x4f, 0x06, 0xf8, 0x17, 0xce, 0x46, 0x45, 0xda, 0x50, 0x7c, 0x8a, 0xd1, 0x4e}}},\n{{{0xf7, 0xd4, 0x16, 0x6c, 0x4e, 0x95, 0x9d, 0x5d, 0x0f, 0x91, 0x2b, 0x52, 0xfe, 0x5c, 0x34, 0xe5, 0x30, 0xe6, 0xa4, 0x3b, 0xf3, 0xf3, 0x34, 0x08, 0xa9, 0x4a, 0xa0, 0xb5, 0x6e, 0xb3, 0x09, 0x0a}} ,\n {{0x26, 0xd9, 0x5e, 0xa3, 0x0f, 0xeb, 0xa2, 0xf3, 0x20, 0x3b, 0x37, 0xd4, 0xe4, 0x9e, 0xce, 0x06, 0x3d, 0x53, 0xed, 0xae, 0x2b, 0xeb, 0xb6, 0x24, 0x0a, 0x11, 0xa3, 0x0f, 0xd6, 0x7f, 0xa4, 0x3a}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0xdb, 0x9f, 0x2c, 0xfc, 0xd6, 0xb2, 0x1e, 0x2e, 0x52, 0x7a, 0x06, 0x87, 0x2d, 0x86, 0x72, 0x2b, 0x6d, 0x90, 0x77, 0x46, 0x43, 0xb5, 0x7a, 0xf8, 0x60, 0x7d, 0x91, 0x60, 0x5b, 0x9d, 0x9e, 0x07}} ,\n {{0x97, 0x87, 0xc7, 0x04, 0x1c, 0x38, 0x01, 0x39, 0x58, 0xc7, 0x85, 0xa3, 0xfc, 0x64, 0x00, 0x64, 0x25, 0xa2, 0xbf, 0x50, 0x94, 0xca, 0x26, 0x31, 0x45, 0x0a, 0x24, 0xd2, 0x51, 0x29, 0x51, 0x16}}},\n{{{0x4d, 0x4a, 0xd7, 0x98, 0x71, 0x57, 0xac, 0x7d, 0x8b, 0x37, 0xbd, 0x63, 0xff, 0x87, 0xb1, 0x49, 0x95, 0x20, 0x7c, 0xcf, 0x7c, 0x59, 0xc4, 0x91, 0x9c, 0xef, 0xd0, 0xdb, 0x60, 0x09, 0x9d, 0x46}} ,\n {{0xcb, 0x78, 0x94, 0x90, 0xe4, 0x45, 0xb3, 0xf6, 0xd9, 0xf6, 0x57, 0x74, 0xd5, 0xf8, 0x83, 0x4f, 0x39, 0xc9, 0xbd, 0x88, 0xc2, 0x57, 0x21, 0x1f, 0x24, 0x32, 0x68, 0xf8, 0xc7, 0x21, 0x5f, 0x0b}}},\n{{{0x2a, 0x36, 0x68, 0xfc, 0x5f, 0xb6, 0x4f, 0xa5, 0xe3, 0x9d, 0x24, 0x2f, 0xc0, 0x93, 0x61, 0xcf, 0xf8, 0x0a, 0xed, 0xe1, 0xdb, 0x27, 0xec, 0x0e, 0x14, 0x32, 0x5f, 0x8e, 0xa1, 0x62, 0x41, 0x16}} ,\n {{0x95, 0x21, 0x01, 0xce, 0x95, 0x5b, 0x0e, 0x57, 0xc7, 0xb9, 0x62, 0xb5, 0x28, 0xca, 0x11, 0xec, 0xb4, 0x46, 0x06, 0x73, 0x26, 0xff, 0xfb, 0x66, 0x7d, 0xee, 0x5f, 0xb2, 0x56, 0xfd, 0x2a, 0x08}}},\n{{{0x92, 0x67, 0x77, 0x56, 0xa1, 0xff, 0xc4, 0xc5, 0x95, 0xf0, 0xe3, 0x3a, 0x0a, 0xca, 0x94, 0x4d, 0x9e, 0x7e, 0x3d, 0xb9, 0x6e, 0xb6, 0xb0, 0xce, 0xa4, 0x30, 0x89, 0x99, 0xe9, 0xad, 0x11, 0x59}} ,\n {{0xf6, 0x48, 0x95, 0xa1, 0x6f, 0x5f, 0xb7, 0xa5, 0xbb, 0x30, 0x00, 0x1c, 0xd2, 0x8a, 0xd6, 0x25, 0x26, 0x1b, 0xb2, 0x0d, 0x37, 0x6a, 0x05, 0xf4, 0x9d, 0x3e, 0x17, 0x2a, 0x43, 0xd2, 0x3a, 0x06}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x32, 0x99, 0x93, 0xd1, 0x9a, 0x72, 0xf3, 0xa9, 0x16, 0xbd, 0xb4, 0x4c, 0xdd, 0xf9, 0xd4, 0xb2, 0x64, 0x9a, 0xd3, 0x05, 0xe4, 0xa3, 0x73, 0x1c, 0xcb, 0x7e, 0x57, 0x67, 0xff, 0x04, 0xb3, 0x10}} ,\n {{0xb9, 0x4b, 0xa4, 0xad, 0xd0, 0x6d, 0x61, 0x23, 0xb4, 0xaf, 0x34, 0xa9, 0xaa, 0x65, 0xec, 0xd9, 0x69, 0xe3, 0x85, 0xcd, 0xcc, 0xe7, 0xb0, 0x9b, 0x41, 0xc1, 0x1c, 0xf9, 0xa0, 0xfa, 0xb7, 0x13}}},\n{{{0x04, 0xfd, 0x88, 0x3c, 0x0c, 0xd0, 0x09, 0x52, 0x51, 0x4f, 0x06, 0x19, 0xcc, 0xc3, 0xbb, 0xde, 0x80, 0xc5, 0x33, 0xbc, 0xf9, 0xf3, 0x17, 0x36, 0xdd, 0xc6, 0xde, 0xe8, 0x9b, 0x5d, 0x79, 0x1b}} ,\n {{0x65, 0x0a, 0xbe, 0x51, 0x57, 0xad, 0x50, 0x79, 0x08, 0x71, 0x9b, 0x07, 0x95, 0x8f, 0xfb, 0xae, 0x4b, 0x38, 0xba, 0xcf, 0x53, 0x2a, 0x86, 0x1e, 0xc0, 0x50, 0x5c, 0x67, 0x1b, 0xf6, 0x87, 0x6c}}},\n{{{0x4f, 0x00, 0xb2, 0x66, 0x55, 0xed, 0x4a, 0xed, 0x8d, 0xe1, 0x66, 0x18, 0xb2, 0x14, 0x74, 0x8d, 0xfd, 0x1a, 0x36, 0x0f, 0x26, 0x5c, 0x8b, 0x89, 0xf3, 0xab, 0xf2, 0xf3, 0x24, 0x67, 0xfd, 0x70}} ,\n {{0xfd, 0x4e, 0x2a, 0xc1, 0x3a, 0xca, 0x8f, 0x00, 0xd8, 0xec, 0x74, 0x67, 0xef, 0x61, 0xe0, 0x28, 0xd0, 0x96, 0xf4, 0x48, 0xde, 0x81, 0xe3, 0xef, 0xdc, 0xaa, 0x7d, 0xf3, 0xb6, 0x55, 0xa6, 0x65}}},\n{{{0xeb, 0xcb, 0xc5, 0x70, 0x91, 0x31, 0x10, 0x93, 0x0d, 0xc8, 0xd0, 0xef, 0x62, 0xe8, 0x6f, 0x82, 0xe3, 0x69, 0x3d, 0x91, 0x7f, 0x31, 0xe1, 0x26, 0x35, 0x3c, 0x4a, 0x2f, 0xab, 0xc4, 0x9a, 0x5e}} ,\n {{0xab, 0x1b, 0xb5, 0xe5, 0x2b, 0xc3, 0x0e, 0x29, 0xb0, 0xd0, 0x73, 0xe6, 0x4f, 0x64, 0xf2, 0xbc, 0xe4, 0xe4, 0xe1, 0x9a, 0x52, 0x33, 0x2f, 0xbd, 0xcc, 0x03, 0xee, 0x8a, 0xfa, 0x00, 0x5f, 0x50}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0xf6, 0xdb, 0x0d, 0x22, 0x3d, 0xb5, 0x14, 0x75, 0x31, 0xf0, 0x81, 0xe2, 0xb9, 0x37, 0xa2, 0xa9, 0x84, 0x11, 0x9a, 0x07, 0xb5, 0x53, 0x89, 0x78, 0xa9, 0x30, 0x27, 0xa1, 0xf1, 0x4e, 0x5c, 0x2e}} ,\n {{0x8b, 0x00, 0x54, 0xfb, 0x4d, 0xdc, 0xcb, 0x17, 0x35, 0x40, 0xff, 0xb7, 0x8c, 0xfe, 0x4a, 0xe4, 0x4e, 0x99, 0x4e, 0xa8, 0x74, 0x54, 0x5d, 0x5c, 0x96, 0xa3, 0x12, 0x55, 0x36, 0x31, 0x17, 0x5c}}},\n{{{0xce, 0x24, 0xef, 0x7b, 0x86, 0xf2, 0x0f, 0x77, 0xe8, 0x5c, 0x7d, 0x87, 0x38, 0x2d, 0xef, 0xaf, 0xf2, 0x8c, 0x72, 0x2e, 0xeb, 0xb6, 0x55, 0x4b, 0x6e, 0xf1, 0x4e, 0x8a, 0x0e, 0x9a, 0x6c, 0x4c}} ,\n {{0x25, 0xea, 0x86, 0xc2, 0xd1, 0x4f, 0xb7, 0x3e, 0xa8, 0x5c, 0x8d, 0x66, 0x81, 0x25, 0xed, 0xc5, 0x4c, 0x05, 0xb9, 0xd8, 0xd6, 0x70, 0xbe, 0x73, 0x82, 0xe8, 0xa1, 0xe5, 0x1e, 0x71, 0xd5, 0x26}}},\n{{{0x4e, 0x6d, 0xc3, 0xa7, 0x4f, 0x22, 0x45, 0x26, 0xa2, 0x7e, 0x16, 0xf7, 0xf7, 0x63, 0xdc, 0x86, 0x01, 0x2a, 0x71, 0x38, 0x5c, 0x33, 0xc3, 0xce, 0x30, 0xff, 0xf9, 0x2c, 0x91, 0x71, 0x8a, 0x72}} ,\n {{0x8c, 0x44, 0x09, 0x28, 0xd5, 0x23, 0xc9, 0x8f, 0xf3, 0x84, 0x45, 0xc6, 0x9a, 0x5e, 0xff, 0xd2, 0xc7, 0x57, 0x93, 0xa3, 0xc1, 0x69, 0xdd, 0x62, 0x0f, 0xda, 0x5c, 0x30, 0x59, 0x5d, 0xe9, 0x4c}}},\n{{{0x92, 0x7e, 0x50, 0x27, 0x72, 0xd7, 0x0c, 0xd6, 0x69, 0x96, 0x81, 0x35, 0x84, 0x94, 0x35, 0x8b, 0x6c, 0xaa, 0x62, 0x86, 0x6e, 0x1c, 0x15, 0xf3, 0x6c, 0xb3, 0xff, 0x65, 0x1b, 0xa2, 0x9b, 0x59}} ,\n {{0xe2, 0xa9, 0x65, 0x88, 0xc4, 0x50, 0xfa, 0xbb, 0x3b, 0x6e, 0x5f, 0x44, 0x01, 0xca, 0x97, 0xd4, 0xdd, 0xf6, 0xcd, 0x3f, 0x3f, 0xe5, 0x97, 0x67, 0x2b, 0x8c, 0x66, 0x0f, 0x35, 0x9b, 0xf5, 0x07}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0xf1, 0x59, 0x27, 0xd8, 0xdb, 0x5a, 0x11, 0x5e, 0x82, 0xf3, 0x38, 0xff, 0x1c, 0xed, 0xfe, 0x3f, 0x64, 0x54, 0x3f, 0x7f, 0xd1, 0x81, 0xed, 0xef, 0x65, 0xc5, 0xcb, 0xfd, 0xe1, 0x80, 0xcd, 0x11}} ,\n {{0xe0, 0xdb, 0x22, 0x28, 0xe6, 0xff, 0x61, 0x9d, 0x41, 0x14, 0x2d, 0x3b, 0x26, 0x22, 0xdf, 0xf1, 0x34, 0x81, 0xe9, 0x45, 0xee, 0x0f, 0x98, 0x8b, 0xa6, 0x3f, 0xef, 0xf7, 0x43, 0x19, 0xf1, 0x43}}},\n{{{0xee, 0xf3, 0x00, 0xa1, 0x50, 0xde, 0xc0, 0xb6, 0x01, 0xe3, 0x8c, 0x3c, 0x4d, 0x31, 0xd2, 0xb0, 0x58, 0xcd, 0xed, 0x10, 0x4a, 0x7a, 0xef, 0x80, 0xa9, 0x19, 0x32, 0xf3, 0xd8, 0x33, 0x8c, 0x06}} ,\n {{0xcb, 0x7d, 0x4f, 0xff, 0x30, 0xd8, 0x12, 0x3b, 0x39, 0x1c, 0x06, 0xf9, 0x4c, 0x34, 0x35, 0x71, 0xb5, 0x16, 0x94, 0x67, 0xdf, 0xee, 0x11, 0xde, 0xa4, 0x1d, 0x88, 0x93, 0x35, 0xa9, 0x32, 0x10}}},\n{{{0xe9, 0xc3, 0xbc, 0x7b, 0x5c, 0xfc, 0xb2, 0xf9, 0xc9, 0x2f, 0xe5, 0xba, 0x3a, 0x0b, 0xab, 0x64, 0x38, 0x6f, 0x5b, 0x4b, 0x93, 0xda, 0x64, 0xec, 0x4d, 0x3d, 0xa0, 0xf5, 0xbb, 0xba, 0x47, 0x48}} ,\n {{0x60, 0xbc, 0x45, 0x1f, 0x23, 0xa2, 0x3b, 0x70, 0x76, 0xe6, 0x97, 0x99, 0x4f, 0x77, 0x54, 0x67, 0x30, 0x9a, 0xe7, 0x66, 0xd6, 0xcd, 0x2e, 0x51, 0x24, 0x2c, 0x42, 0x4a, 0x11, 0xfe, 0x6f, 0x7e}}},\n{{{0x87, 0xc0, 0xb1, 0xf0, 0xa3, 0x6f, 0x0c, 0x93, 0xa9, 0x0a, 0x72, 0xef, 0x5c, 0xbe, 0x65, 0x35, 0xa7, 0x6a, 0x4e, 0x2c, 0xbf, 0x21, 0x23, 0xe8, 0x2f, 0x97, 0xc7, 0x3e, 0xc8, 0x17, 0xac, 0x1e}} ,\n {{0x7b, 0xef, 0x21, 0xe5, 0x40, 0xcc, 0x1e, 0xdc, 0xd6, 0xbd, 0x97, 0x7a, 0x7c, 0x75, 0x86, 0x7a, 0x25, 0x5a, 0x6e, 0x7c, 0xe5, 0x51, 0x3c, 0x1b, 0x5b, 0x82, 0x9a, 0x07, 0x60, 0xa1, 0x19, 0x04}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x96, 0x88, 0xa6, 0xab, 0x8f, 0xe3, 0x3a, 0x49, 0xf8, 0xfe, 0x34, 0xe7, 0x6a, 0xb2, 0xfe, 0x40, 0x26, 0x74, 0x57, 0x4c, 0xf6, 0xd4, 0x99, 0xce, 0x5d, 0x7b, 0x2f, 0x67, 0xd6, 0x5a, 0xe4, 0x4e}} ,\n {{0x5c, 0x82, 0xb3, 0xbd, 0x55, 0x25, 0xf6, 0x6a, 0x93, 0xa4, 0x02, 0xc6, 0x7d, 0x5c, 0xb1, 0x2b, 0x5b, 0xff, 0xfb, 0x56, 0xf8, 0x01, 0x41, 0x90, 0xc6, 0xb6, 0xac, 0x4f, 0xfe, 0xa7, 0x41, 0x70}}},\n{{{0xdb, 0xfa, 0x9b, 0x2c, 0xd4, 0x23, 0x67, 0x2c, 0x8a, 0x63, 0x6c, 0x07, 0x26, 0x48, 0x4f, 0xc2, 0x03, 0xd2, 0x53, 0x20, 0x28, 0xed, 0x65, 0x71, 0x47, 0xa9, 0x16, 0x16, 0x12, 0xbc, 0x28, 0x33}} ,\n {{0x39, 0xc0, 0xfa, 0xfa, 0xcd, 0x33, 0x43, 0xc7, 0x97, 0x76, 0x9b, 0x93, 0x91, 0x72, 0xeb, 0xc5, 0x18, 0x67, 0x4c, 0x11, 0xf0, 0xf4, 0xe5, 0x73, 0xb2, 0x5c, 0x1b, 0xc2, 0x26, 0x3f, 0xbf, 0x2b}}},\n{{{0x86, 0xe6, 0x8c, 0x1d, 0xdf, 0xca, 0xfc, 0xd5, 0xf8, 0x3a, 0xc3, 0x44, 0x72, 0xe6, 0x78, 0x9d, 0x2b, 0x97, 0xf8, 0x28, 0x45, 0xb4, 0x20, 0xc9, 0x2a, 0x8c, 0x67, 0xaa, 0x11, 0xc5, 0x5b, 0x2f}} ,\n {{0x17, 0x0f, 0x86, 0x52, 0xd7, 0x9d, 0xc3, 0x44, 0x51, 0x76, 0x32, 0x65, 0xb4, 0x37, 0x81, 0x99, 0x46, 0x37, 0x62, 0xed, 0xcf, 0x64, 0x9d, 0x72, 0x40, 0x7a, 0x4c, 0x0b, 0x76, 0x2a, 0xfb, 0x56}}},\n{{{0x33, 0xa7, 0x90, 0x7c, 0xc3, 0x6f, 0x17, 0xa5, 0xa0, 0x67, 0x72, 0x17, 0xea, 0x7e, 0x63, 0x14, 0x83, 0xde, 0xc1, 0x71, 0x2d, 0x41, 0x32, 0x7a, 0xf3, 0xd1, 0x2b, 0xd8, 0x2a, 0xa6, 0x46, 0x36}} ,\n {{0xac, 0xcc, 0x6b, 0x7c, 0xf9, 0xb8, 0x8b, 0x08, 0x5c, 0xd0, 0x7d, 0x8f, 0x73, 0xea, 0x20, 0xda, 0x86, 0xca, 0x00, 0xc7, 0xad, 0x73, 0x4d, 0xe9, 0xe8, 0xa9, 0xda, 0x1f, 0x03, 0x06, 0xdd, 0x24}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x9c, 0xb2, 0x61, 0x0a, 0x98, 0x2a, 0xa5, 0xd7, 0xee, 0xa9, 0xac, 0x65, 0xcb, 0x0a, 0x1e, 0xe2, 0xbe, 0xdc, 0x85, 0x59, 0x0f, 0x9c, 0xa6, 0x57, 0x34, 0xa5, 0x87, 0xeb, 0x7b, 0x1e, 0x0c, 0x3c}} ,\n {{0x2f, 0xbd, 0x84, 0x63, 0x0d, 0xb5, 0xa0, 0xf0, 0x4b, 0x9e, 0x93, 0xc6, 0x34, 0x9a, 0x34, 0xff, 0x73, 0x19, 0x2f, 0x6e, 0x54, 0x45, 0x2c, 0x92, 0x31, 0x76, 0x34, 0xf1, 0xb2, 0x26, 0xe8, 0x74}}},\n{{{0x0a, 0x67, 0x90, 0x6d, 0x0c, 0x4c, 0xcc, 0xc0, 0xe6, 0xbd, 0xa7, 0x5e, 0x55, 0x8c, 0xcd, 0x58, 0x9b, 0x11, 0xa2, 0xbb, 0x4b, 0xb1, 0x43, 0x04, 0x3c, 0x55, 0xed, 0x23, 0xfe, 0xcd, 0xb1, 0x53}} ,\n {{0x05, 0xfb, 0x75, 0xf5, 0x01, 0xaf, 0x38, 0x72, 0x58, 0xfc, 0x04, 0x29, 0x34, 0x7a, 0x67, 0xa2, 0x08, 0x50, 0x6e, 0xd0, 0x2b, 0x73, 0xd5, 0xb8, 0xe4, 0x30, 0x96, 0xad, 0x45, 0xdf, 0xa6, 0x5c}}},\n{{{0x0d, 0x88, 0x1a, 0x90, 0x7e, 0xdc, 0xd8, 0xfe, 0xc1, 0x2f, 0x5d, 0x67, 0xee, 0x67, 0x2f, 0xed, 0x6f, 0x55, 0x43, 0x5f, 0x87, 0x14, 0x35, 0x42, 0xd3, 0x75, 0xae, 0xd5, 0xd3, 0x85, 0x1a, 0x76}} ,\n {{0x87, 0xc8, 0xa0, 0x6e, 0xe1, 0xb0, 0xad, 0x6a, 0x4a, 0x34, 0x71, 0xed, 0x7c, 0xd6, 0x44, 0x03, 0x65, 0x4a, 0x5c, 0x5c, 0x04, 0xf5, 0x24, 0x3f, 0xb0, 0x16, 0x5e, 0x8c, 0xb2, 0xd2, 0xc5, 0x20}}},\n{{{0x98, 0x83, 0xc2, 0x37, 0xa0, 0x41, 0xa8, 0x48, 0x5c, 0x5f, 0xbf, 0xc8, 0xfa, 0x24, 0xe0, 0x59, 0x2c, 0xbd, 0xf6, 0x81, 0x7e, 0x88, 0xe6, 0xca, 0x04, 0xd8, 0x5d, 0x60, 0xbb, 0x74, 0xa7, 0x0b}} ,\n {{0x21, 0x13, 0x91, 0xbf, 0x77, 0x7a, 0x33, 0xbc, 0xe9, 0x07, 0x39, 0x0a, 0xdd, 0x7d, 0x06, 0x10, 0x9a, 0xee, 0x47, 0x73, 0x1b, 0x15, 0x5a, 0xfb, 0xcd, 0x4d, 0xd0, 0xd2, 0x3a, 0x01, 0xba, 0x54}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x48, 0xd5, 0x39, 0x4a, 0x0b, 0x20, 0x6a, 0x43, 0xa0, 0x07, 0x82, 0x5e, 0x49, 0x7c, 0xc9, 0x47, 0xf1, 0x7c, 0x37, 0xb9, 0x23, 0xef, 0x6b, 0x46, 0x45, 0x8c, 0x45, 0x76, 0xdf, 0x14, 0x6b, 0x6e}} ,\n {{0x42, 0xc9, 0xca, 0x29, 0x4c, 0x76, 0x37, 0xda, 0x8a, 0x2d, 0x7c, 0x3a, 0x58, 0xf2, 0x03, 0xb4, 0xb5, 0xb9, 0x1a, 0x13, 0x2d, 0xde, 0x5f, 0x6b, 0x9d, 0xba, 0x52, 0xc9, 0x5d, 0xb3, 0xf3, 0x30}}},\n{{{0x4c, 0x6f, 0xfe, 0x6b, 0x0c, 0x62, 0xd7, 0x48, 0x71, 0xef, 0xb1, 0x85, 0x79, 0xc0, 0xed, 0x24, 0xb1, 0x08, 0x93, 0x76, 0x8e, 0xf7, 0x38, 0x8e, 0xeb, 0xfe, 0x80, 0x40, 0xaf, 0x90, 0x64, 0x49}} ,\n {{0x4a, 0x88, 0xda, 0xc1, 0x98, 0x44, 0x3c, 0x53, 0x4e, 0xdb, 0x4b, 0xb9, 0x12, 0x5f, 0xcd, 0x08, 0x04, 0xef, 0x75, 0xe7, 0xb1, 0x3a, 0xe5, 0x07, 0xfa, 0xca, 0x65, 0x7b, 0x72, 0x10, 0x64, 0x7f}}},\n{{{0x3d, 0x81, 0xf0, 0xeb, 0x16, 0xfd, 0x58, 0x33, 0x8d, 0x7c, 0x1a, 0xfb, 0x20, 0x2c, 0x8a, 0xee, 0x90, 0xbb, 0x33, 0x6d, 0x45, 0xe9, 0x8e, 0x99, 0x85, 0xe1, 0x08, 0x1f, 0xc5, 0xf1, 0xb5, 0x46}} ,\n {{0xe4, 0xe7, 0x43, 0x4b, 0xa0, 0x3f, 0x2b, 0x06, 0xba, 0x17, 0xae, 0x3d, 0xe6, 0xce, 0xbd, 0xb8, 0xed, 0x74, 0x11, 0x35, 0xec, 0x96, 0xfe, 0x31, 0xe3, 0x0e, 0x7a, 0x4e, 0xc9, 0x1d, 0xcb, 0x20}}},\n{{{0xe0, 0x67, 0xe9, 0x7b, 0xdb, 0x96, 0x5c, 0xb0, 0x32, 0xd0, 0x59, 0x31, 0x90, 0xdc, 0x92, 0x97, 0xac, 0x09, 0x38, 0x31, 0x0f, 0x7e, 0xd6, 0x5d, 0xd0, 0x06, 0xb6, 0x1f, 0xea, 0xf0, 0x5b, 0x07}} ,\n {{0x81, 0x9f, 0xc7, 0xde, 0x6b, 0x41, 0x22, 0x35, 0x14, 0x67, 0x77, 0x3e, 0x90, 0x81, 0xb0, 0xd9, 0x85, 0x4c, 0xca, 0x9b, 0x3f, 0x04, 0x59, 0xd6, 0xaa, 0x17, 0xc3, 0x88, 0x34, 0x37, 0xba, 0x43}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x4c, 0xb6, 0x69, 0xc8, 0x81, 0x95, 0x94, 0x33, 0x92, 0x34, 0xe9, 0x3c, 0x84, 0x0d, 0x3d, 0x5a, 0x37, 0x9c, 0x22, 0xa0, 0xaa, 0x65, 0xce, 0xb4, 0xc2, 0x2d, 0x66, 0x67, 0x02, 0xff, 0x74, 0x10}} ,\n {{0x22, 0xb0, 0xd5, 0xe6, 0xc7, 0xef, 0xb1, 0xa7, 0x13, 0xda, 0x60, 0xb4, 0x80, 0xc1, 0x42, 0x7d, 0x10, 0x70, 0x97, 0x04, 0x4d, 0xda, 0x23, 0x89, 0xc2, 0x0e, 0x68, 0xcb, 0xde, 0xe0, 0x9b, 0x29}}},\n{{{0x33, 0xfe, 0x42, 0x2a, 0x36, 0x2b, 0x2e, 0x36, 0x64, 0x5c, 0x8b, 0xcc, 0x81, 0x6a, 0x15, 0x08, 0xa1, 0x27, 0xe8, 0x57, 0xe5, 0x78, 0x8e, 0xf2, 0x58, 0x19, 0x12, 0x42, 0xae, 0xc4, 0x63, 0x3e}} ,\n {{0x78, 0x96, 0x9c, 0xa7, 0xca, 0x80, 0xae, 0x02, 0x85, 0xb1, 0x7c, 0x04, 0x5c, 0xc1, 0x5b, 0x26, 0xc1, 0xba, 0xed, 0xa5, 0x59, 0x70, 0x85, 0x8c, 0x8c, 0xe8, 0x87, 0xac, 0x6a, 0x28, 0x99, 0x35}}},\n{{{0x9f, 0x04, 0x08, 0x28, 0xbe, 0x87, 0xda, 0x80, 0x28, 0x38, 0xde, 0x9f, 0xcd, 0xe4, 0xe3, 0x62, 0xfb, 0x2e, 0x46, 0x8d, 0x01, 0xb3, 0x06, 0x51, 0xd4, 0x19, 0x3b, 0x11, 0xfa, 0xe2, 0xad, 0x1e}} ,\n {{0xa0, 0x20, 0x99, 0x69, 0x0a, 0xae, 0xa3, 0x70, 0x4e, 0x64, 0x80, 0xb7, 0x85, 0x9c, 0x87, 0x54, 0x43, 0x43, 0x55, 0x80, 0x6d, 0x8d, 0x7c, 0xa9, 0x64, 0xca, 0x6c, 0x2e, 0x21, 0xd8, 0xc8, 0x6c}}},\n{{{0x91, 0x4a, 0x07, 0xad, 0x08, 0x75, 0xc1, 0x4f, 0xa4, 0xb2, 0xc3, 0x6f, 0x46, 0x3e, 0xb1, 0xce, 0x52, 0xab, 0x67, 0x09, 0x54, 0x48, 0x6b, 0x6c, 0xd7, 0x1d, 0x71, 0x76, 0xcb, 0xff, 0xdd, 0x31}} ,\n {{0x36, 0x88, 0xfa, 0xfd, 0xf0, 0x36, 0x6f, 0x07, 0x74, 0x88, 0x50, 0xd0, 0x95, 0x38, 0x4a, 0x48, 0x2e, 0x07, 0x64, 0x97, 0x11, 0x76, 0x01, 0x1a, 0x27, 0x4d, 0x8e, 0x25, 0x9a, 0x9b, 0x1c, 0x22}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0xbe, 0x57, 0xbd, 0x0e, 0x0f, 0xac, 0x5e, 0x76, 0xa3, 0x71, 0xad, 0x2b, 0x10, 0x45, 0x02, 0xec, 0x59, 0xd5, 0x5d, 0xa9, 0x44, 0xcc, 0x25, 0x4c, 0xb3, 0x3c, 0x5b, 0x69, 0x07, 0x55, 0x26, 0x6b}} ,\n {{0x30, 0x6b, 0xd4, 0xa7, 0x51, 0x29, 0xe3, 0xf9, 0x7a, 0x75, 0x2a, 0x82, 0x2f, 0xd6, 0x1d, 0x99, 0x2b, 0x80, 0xd5, 0x67, 0x1e, 0x15, 0x9d, 0xca, 0xfd, 0xeb, 0xac, 0x97, 0x35, 0x09, 0x7f, 0x3f}}},\n{{{0x35, 0x0d, 0x34, 0x0a, 0xb8, 0x67, 0x56, 0x29, 0x20, 0xf3, 0x19, 0x5f, 0xe2, 0x83, 0x42, 0x73, 0x53, 0xa8, 0xc5, 0x02, 0x19, 0x33, 0xb4, 0x64, 0xbd, 0xc3, 0x87, 0x8c, 0xd7, 0x76, 0xed, 0x25}} ,\n {{0x47, 0x39, 0x37, 0x76, 0x0d, 0x1d, 0x0c, 0xf5, 0x5a, 0x6d, 0x43, 0x88, 0x99, 0x15, 0xb4, 0x52, 0x0f, 0x2a, 0xb3, 0xb0, 0x3f, 0xa6, 0xb3, 0x26, 0xb3, 0xc7, 0x45, 0xf5, 0x92, 0x5f, 0x9b, 0x17}}},\n{{{0x9d, 0x23, 0xbd, 0x15, 0xfe, 0x52, 0x52, 0x15, 0x26, 0x79, 0x86, 0xba, 0x06, 0x56, 0x66, 0xbb, 0x8c, 0x2e, 0x10, 0x11, 0xd5, 0x4a, 0x18, 0x52, 0xda, 0x84, 0x44, 0xf0, 0x3e, 0xe9, 0x8c, 0x35}} ,\n {{0xad, 0xa0, 0x41, 0xec, 0xc8, 0x4d, 0xb9, 0xd2, 0x6e, 0x96, 0x4e, 0x5b, 0xc5, 0xc2, 0xa0, 0x1b, 0xcf, 0x0c, 0xbf, 0x17, 0x66, 0x57, 0xc1, 0x17, 0x90, 0x45, 0x71, 0xc2, 0xe1, 0x24, 0xeb, 0x27}}},\n{{{0x2c, 0xb9, 0x42, 0xa4, 0xaf, 0x3b, 0x42, 0x0e, 0xc2, 0x0f, 0xf2, 0xea, 0x83, 0xaf, 0x9a, 0x13, 0x17, 0xb0, 0xbd, 0x89, 0x17, 0xe3, 0x72, 0xcb, 0x0e, 0x76, 0x7e, 0x41, 0x63, 0x04, 0x88, 0x71}} ,\n {{0x75, 0x78, 0x38, 0x86, 0x57, 0xdd, 0x9f, 0xee, 0x54, 0x70, 0x65, 0xbf, 0xf1, 0x2c, 0xe0, 0x39, 0x0d, 0xe3, 0x89, 0xfd, 0x8e, 0x93, 0x4f, 0x43, 0xdc, 0xd5, 0x5b, 0xde, 0xf9, 0x98, 0xe5, 0x7b}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0xe7, 0x3b, 0x65, 0x11, 0xdf, 0xb2, 0xf2, 0x63, 0x94, 0x12, 0x6f, 0x5c, 0x9e, 0x77, 0xc1, 0xb6, 0xd8, 0xab, 0x58, 0x7a, 0x1d, 0x95, 0x73, 0xdd, 0xe7, 0xe3, 0x6f, 0xf2, 0x03, 0x1d, 0xdb, 0x76}} ,\n {{0xae, 0x06, 0x4e, 0x2c, 0x52, 0x1b, 0xbc, 0x5a, 0x5a, 0xa5, 0xbe, 0x27, 0xbd, 0xeb, 0xe1, 0x14, 0x17, 0x68, 0x26, 0x07, 0x03, 0xd1, 0x18, 0x0b, 0xdf, 0xf1, 0x06, 0x5c, 0xa6, 0x1b, 0xb9, 0x24}}},\n{{{0xc5, 0x66, 0x80, 0x13, 0x0e, 0x48, 0x8c, 0x87, 0x31, 0x84, 0xb4, 0x60, 0xed, 0xc5, 0xec, 0xb6, 0xc5, 0x05, 0x33, 0x5f, 0x2f, 0x7d, 0x40, 0xb6, 0x32, 0x1d, 0x38, 0x74, 0x1b, 0xf1, 0x09, 0x3d}} ,\n {{0xd4, 0x69, 0x82, 0xbc, 0x8d, 0xf8, 0x34, 0x36, 0x75, 0x55, 0x18, 0x55, 0x58, 0x3c, 0x79, 0xaf, 0x26, 0x80, 0xab, 0x9b, 0x95, 0x00, 0xf1, 0xcb, 0xda, 0xc1, 0x9f, 0xf6, 0x2f, 0xa2, 0xf4, 0x45}}},\n{{{0x17, 0xbe, 0xeb, 0x85, 0xed, 0x9e, 0xcd, 0x56, 0xf5, 0x17, 0x45, 0x42, 0xb4, 0x1f, 0x44, 0x4c, 0x05, 0x74, 0x15, 0x47, 0x00, 0xc6, 0x6a, 0x3d, 0x24, 0x09, 0x0d, 0x58, 0xb1, 0x42, 0xd7, 0x04}} ,\n {{0x8d, 0xbd, 0xa3, 0xc4, 0x06, 0x9b, 0x1f, 0x90, 0x58, 0x60, 0x74, 0xb2, 0x00, 0x3b, 0x3c, 0xd2, 0xda, 0x82, 0xbb, 0x10, 0x90, 0x69, 0x92, 0xa9, 0xb4, 0x30, 0x81, 0xe3, 0x7c, 0xa8, 0x89, 0x45}}},\n{{{0x3f, 0xdc, 0x05, 0xcb, 0x41, 0x3c, 0xc8, 0x23, 0x04, 0x2c, 0x38, 0x99, 0xe3, 0x68, 0x55, 0xf9, 0xd3, 0x32, 0xc7, 0xbf, 0xfa, 0xd4, 0x1b, 0x5d, 0xde, 0xdc, 0x10, 0x42, 0xc0, 0x42, 0xd9, 0x75}} ,\n {{0x2d, 0xab, 0x35, 0x4e, 0x87, 0xc4, 0x65, 0x97, 0x67, 0x24, 0xa4, 0x47, 0xad, 0x3f, 0x8e, 0xf3, 0xcb, 0x31, 0x17, 0x77, 0xc5, 0xe2, 0xd7, 0x8f, 0x3c, 0xc1, 0xcd, 0x56, 0x48, 0xc1, 0x6c, 0x69}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x14, 0xae, 0x5f, 0x88, 0x7b, 0xa5, 0x90, 0xdf, 0x10, 0xb2, 0x8b, 0x5e, 0x24, 0x17, 0xc3, 0xa3, 0xd4, 0x0f, 0x92, 0x61, 0x1a, 0x19, 0x5a, 0xad, 0x76, 0xbd, 0xd8, 0x1c, 0xdd, 0xe0, 0x12, 0x6d}} ,\n {{0x8e, 0xbd, 0x70, 0x8f, 0x02, 0xa3, 0x24, 0x4d, 0x5a, 0x67, 0xc4, 0xda, 0xf7, 0x20, 0x0f, 0x81, 0x5b, 0x7a, 0x05, 0x24, 0x67, 0x83, 0x0b, 0x2a, 0x80, 0xe7, 0xfd, 0x74, 0x4b, 0x9e, 0x5c, 0x0d}}},\n{{{0x94, 0xd5, 0x5f, 0x1f, 0xa2, 0xfb, 0xeb, 0xe1, 0x07, 0x34, 0xf8, 0x20, 0xad, 0x81, 0x30, 0x06, 0x2d, 0xa1, 0x81, 0x95, 0x36, 0xcf, 0x11, 0x0b, 0xaf, 0xc1, 0x2b, 0x9a, 0x6c, 0x55, 0xc1, 0x16}} ,\n {{0x36, 0x4f, 0xf1, 0x5e, 0x74, 0x35, 0x13, 0x28, 0xd7, 0x11, 0xcf, 0xb8, 0xde, 0x93, 0xb3, 0x05, 0xb8, 0xb5, 0x73, 0xe9, 0xeb, 0xad, 0x19, 0x1e, 0x89, 0x0f, 0x8b, 0x15, 0xd5, 0x8c, 0xe3, 0x23}}},\n{{{0x33, 0x79, 0xe7, 0x18, 0xe6, 0x0f, 0x57, 0x93, 0x15, 0xa0, 0xa7, 0xaa, 0xc4, 0xbf, 0x4f, 0x30, 0x74, 0x95, 0x5e, 0x69, 0x4a, 0x5b, 0x45, 0xe4, 0x00, 0xeb, 0x23, 0x74, 0x4c, 0xdf, 0x6b, 0x45}} ,\n {{0x97, 0x29, 0x6c, 0xc4, 0x42, 0x0b, 0xdd, 0xc0, 0x29, 0x5c, 0x9b, 0x34, 0x97, 0xd0, 0xc7, 0x79, 0x80, 0x63, 0x74, 0xe4, 0x8e, 0x37, 0xb0, 0x2b, 0x7c, 0xe8, 0x68, 0x6c, 0xc3, 0x82, 0x97, 0x57}}},\n{{{0x22, 0xbe, 0x83, 0xb6, 0x4b, 0x80, 0x6b, 0x43, 0x24, 0x5e, 0xef, 0x99, 0x9b, 0xa8, 0xfc, 0x25, 0x8d, 0x3b, 0x03, 0x94, 0x2b, 0x3e, 0xe7, 0x95, 0x76, 0x9b, 0xcc, 0x15, 0xdb, 0x32, 0xe6, 0x66}} ,\n {{0x84, 0xf0, 0x4a, 0x13, 0xa6, 0xd6, 0xfa, 0x93, 0x46, 0x07, 0xf6, 0x7e, 0x5c, 0x6d, 0x5e, 0xf6, 0xa6, 0xe7, 0x48, 0xf0, 0x06, 0xea, 0xff, 0x90, 0xc1, 0xcc, 0x4c, 0x19, 0x9c, 0x3c, 0x4e, 0x53}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x2a, 0x50, 0xe3, 0x07, 0x15, 0x59, 0xf2, 0x8b, 0x81, 0xf2, 0xf3, 0xd3, 0x6c, 0x99, 0x8c, 0x70, 0x67, 0xec, 0xcc, 0xee, 0x9e, 0x59, 0x45, 0x59, 0x7d, 0x47, 0x75, 0x69, 0xf5, 0x24, 0x93, 0x5d}} ,\n {{0x6a, 0x4f, 0x1b, 0xbe, 0x6b, 0x30, 0xcf, 0x75, 0x46, 0xe3, 0x7b, 0x9d, 0xfc, 0xcd, 0xd8, 0x5c, 0x1f, 0xb4, 0xc8, 0xe2, 0x24, 0xec, 0x1a, 0x28, 0x05, 0x32, 0x57, 0xfd, 0x3c, 0x5a, 0x98, 0x10}}},\n{{{0xa3, 0xdb, 0xf7, 0x30, 0xd8, 0xc2, 0x9a, 0xe1, 0xd3, 0xce, 0x22, 0xe5, 0x80, 0x1e, 0xd9, 0xe4, 0x1f, 0xab, 0xc0, 0x71, 0x1a, 0x86, 0x0e, 0x27, 0x99, 0x5b, 0xfa, 0x76, 0x99, 0xb0, 0x08, 0x3c}} ,\n {{0x2a, 0x93, 0xd2, 0x85, 0x1b, 0x6a, 0x5d, 0xa6, 0xee, 0xd1, 0xd1, 0x33, 0xbd, 0x6a, 0x36, 0x73, 0x37, 0x3a, 0x44, 0xb4, 0xec, 0xa9, 0x7a, 0xde, 0x83, 0x40, 0xd7, 0xdf, 0x28, 0xba, 0xa2, 0x30}}},\n{{{0xd3, 0xb5, 0x6d, 0x05, 0x3f, 0x9f, 0xf3, 0x15, 0x8d, 0x7c, 0xca, 0xc9, 0xfc, 0x8a, 0x7c, 0x94, 0xb0, 0x63, 0x36, 0x9b, 0x78, 0xd1, 0x91, 0x1f, 0x93, 0xd8, 0x57, 0x43, 0xde, 0x76, 0xa3, 0x43}} ,\n {{0x9b, 0x35, 0xe2, 0xa9, 0x3d, 0x32, 0x1e, 0xbb, 0x16, 0x28, 0x70, 0xe9, 0x45, 0x2f, 0x8f, 0x70, 0x7f, 0x08, 0x7e, 0x53, 0xc4, 0x7a, 0xbf, 0xf7, 0xe1, 0xa4, 0x6a, 0xd8, 0xac, 0x64, 0x1b, 0x11}}},\n{{{0xb2, 0xeb, 0x47, 0x46, 0x18, 0x3e, 0x1f, 0x99, 0x0c, 0xcc, 0xf1, 0x2c, 0xe0, 0xe7, 0x8f, 0xe0, 0x01, 0x7e, 0x65, 0xb8, 0x0c, 0xd0, 0xfb, 0xc8, 0xb9, 0x90, 0x98, 0x33, 0x61, 0x3b, 0xd8, 0x27}} ,\n {{0xa0, 0xbe, 0x72, 0x3a, 0x50, 0x4b, 0x74, 0xab, 0x01, 0xc8, 0x93, 0xc5, 0xe4, 0xc7, 0x08, 0x6c, 0xb4, 0xca, 0xee, 0xeb, 0x8e, 0xd7, 0x4e, 0x26, 0xc6, 0x1d, 0xe2, 0x71, 0xaf, 0x89, 0xa0, 0x2a}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x98, 0x0b, 0xe4, 0xde, 0xdb, 0xa8, 0xfa, 0x82, 0x74, 0x06, 0x52, 0x6d, 0x08, 0x52, 0x8a, 0xff, 0x62, 0xc5, 0x6a, 0x44, 0x0f, 0x51, 0x8c, 0x1f, 0x6e, 0xb6, 0xc6, 0x2c, 0x81, 0xd3, 0x76, 0x46}} ,\n {{0xf4, 0x29, 0x74, 0x2e, 0x80, 0xa7, 0x1a, 0x8f, 0xf6, 0xbd, 0xd6, 0x8e, 0xbf, 0xc1, 0x95, 0x2a, 0xeb, 0xa0, 0x7f, 0x45, 0xa0, 0x50, 0x14, 0x05, 0xb1, 0x57, 0x4c, 0x74, 0xb7, 0xe2, 0x89, 0x7d}}},\n{{{0x07, 0xee, 0xa7, 0xad, 0xb7, 0x09, 0x0b, 0x49, 0x4e, 0xbf, 0xca, 0xe5, 0x21, 0xe6, 0xe6, 0xaf, 0xd5, 0x67, 0xf3, 0xce, 0x7e, 0x7c, 0x93, 0x7b, 0x5a, 0x10, 0x12, 0x0e, 0x6c, 0x06, 0x11, 0x75}} ,\n {{0xd5, 0xfc, 0x86, 0xa3, 0x3b, 0xa3, 0x3e, 0x0a, 0xfb, 0x0b, 0xf7, 0x36, 0xb1, 0x5b, 0xda, 0x70, 0xb7, 0x00, 0xa7, 0xda, 0x88, 0x8f, 0x84, 0xa8, 0xbc, 0x1c, 0x39, 0xb8, 0x65, 0xf3, 0x4d, 0x60}}},\n{{{0x96, 0x9d, 0x31, 0xf4, 0xa2, 0xbe, 0x81, 0xb9, 0xa5, 0x59, 0x9e, 0xba, 0x07, 0xbe, 0x74, 0x58, 0xd8, 0xeb, 0xc5, 0x9f, 0x3d, 0xd1, 0xf4, 0xae, 0xce, 0x53, 0xdf, 0x4f, 0xc7, 0x2a, 0x89, 0x4d}} ,\n {{0x29, 0xd8, 0xf2, 0xaa, 0xe9, 0x0e, 0xf7, 0x2e, 0x5f, 0x9d, 0x8a, 0x5b, 0x09, 0xed, 0xc9, 0x24, 0x22, 0xf4, 0x0f, 0x25, 0x8f, 0x1c, 0x84, 0x6e, 0x34, 0x14, 0x6c, 0xea, 0xb3, 0x86, 0x5d, 0x04}}},\n{{{0x07, 0x98, 0x61, 0xe8, 0x6a, 0xd2, 0x81, 0x49, 0x25, 0xd5, 0x5b, 0x18, 0xc7, 0x35, 0x52, 0x51, 0xa4, 0x46, 0xad, 0x18, 0x0d, 0xc9, 0x5f, 0x18, 0x91, 0x3b, 0xb4, 0xc0, 0x60, 0x59, 0x8d, 0x66}} ,\n {{0x03, 0x1b, 0x79, 0x53, 0x6e, 0x24, 0xae, 0x57, 0xd9, 0x58, 0x09, 0x85, 0x48, 0xa2, 0xd3, 0xb5, 0xe2, 0x4d, 0x11, 0x82, 0xe6, 0x86, 0x3c, 0xe9, 0xb1, 0x00, 0x19, 0xc2, 0x57, 0xf7, 0x66, 0x7a}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x0f, 0xe3, 0x89, 0x03, 0xd7, 0x22, 0x95, 0x9f, 0xca, 0xb4, 0x8d, 0x9e, 0x6d, 0x97, 0xff, 0x8d, 0x21, 0x59, 0x07, 0xef, 0x03, 0x2d, 0x5e, 0xf8, 0x44, 0x46, 0xe7, 0x85, 0x80, 0xc5, 0x89, 0x50}} ,\n {{0x8b, 0xd8, 0x53, 0x86, 0x24, 0x86, 0x29, 0x52, 0x01, 0xfa, 0x20, 0xc3, 0x4e, 0x95, 0xcb, 0xad, 0x7b, 0x34, 0x94, 0x30, 0xb7, 0x7a, 0xfa, 0x96, 0x41, 0x60, 0x2b, 0xcb, 0x59, 0xb9, 0xca, 0x50}}},\n{{{0xc2, 0x5b, 0x9b, 0x78, 0x23, 0x1b, 0x3a, 0x88, 0x94, 0x5f, 0x0a, 0x9b, 0x98, 0x2b, 0x6e, 0x53, 0x11, 0xf6, 0xff, 0xc6, 0x7d, 0x42, 0xcc, 0x02, 0x80, 0x40, 0x0d, 0x1e, 0xfb, 0xaf, 0x61, 0x07}} ,\n {{0xb0, 0xe6, 0x2f, 0x81, 0x70, 0xa1, 0x2e, 0x39, 0x04, 0x7c, 0xc4, 0x2c, 0x87, 0x45, 0x4a, 0x5b, 0x69, 0x97, 0xac, 0x6d, 0x2c, 0x10, 0x42, 0x7c, 0x3b, 0x15, 0x70, 0x60, 0x0e, 0x11, 0x6d, 0x3a}}},\n{{{0x9b, 0x18, 0x80, 0x5e, 0xdb, 0x05, 0xbd, 0xc6, 0xb7, 0x3c, 0xc2, 0x40, 0x4d, 0x5d, 0xce, 0x97, 0x8a, 0x34, 0x15, 0xab, 0x28, 0x5d, 0x10, 0xf0, 0x37, 0x0c, 0xcc, 0x16, 0xfa, 0x1f, 0x33, 0x0d}} ,\n {{0x19, 0xf9, 0x35, 0xaa, 0x59, 0x1a, 0x0c, 0x5c, 0x06, 0xfc, 0x6a, 0x0b, 0x97, 0x53, 0x36, 0xfc, 0x2a, 0xa5, 0x5a, 0x9b, 0x30, 0xef, 0x23, 0xaf, 0x39, 0x5d, 0x9a, 0x6b, 0x75, 0x57, 0x48, 0x0b}}},\n{{{0x26, 0xdc, 0x76, 0x3b, 0xfc, 0xf9, 0x9c, 0x3f, 0x89, 0x0b, 0x62, 0x53, 0xaf, 0x83, 0x01, 0x2e, 0xbc, 0x6a, 0xc6, 0x03, 0x0d, 0x75, 0x2a, 0x0d, 0xe6, 0x94, 0x54, 0xcf, 0xb3, 0xe5, 0x96, 0x25}} ,\n {{0xfe, 0x82, 0xb1, 0x74, 0x31, 0x8a, 0xa7, 0x6f, 0x56, 0xbd, 0x8d, 0xf4, 0xe0, 0x94, 0x51, 0x59, 0xde, 0x2c, 0x5a, 0xf4, 0x84, 0x6b, 0x4a, 0x88, 0x93, 0xc0, 0x0c, 0x9a, 0xac, 0xa7, 0xa0, 0x68}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x25, 0x0d, 0xd6, 0xc7, 0x23, 0x47, 0x10, 0xad, 0xc7, 0x08, 0x5c, 0x87, 0x87, 0x93, 0x98, 0x18, 0xb8, 0xd3, 0x9c, 0xac, 0x5a, 0x3d, 0xc5, 0x75, 0xf8, 0x49, 0x32, 0x14, 0xcc, 0x51, 0x96, 0x24}} ,\n {{0x65, 0x9c, 0x5d, 0xf0, 0x37, 0x04, 0xf0, 0x34, 0x69, 0x2a, 0xf0, 0xa5, 0x64, 0xca, 0xde, 0x2b, 0x5b, 0x15, 0x10, 0xd2, 0xab, 0x06, 0xdd, 0xc4, 0xb0, 0xb6, 0x5b, 0xc1, 0x17, 0xdf, 0x8f, 0x02}}},\n{{{0xbd, 0x59, 0x3d, 0xbf, 0x5c, 0x31, 0x44, 0x2c, 0x32, 0x94, 0x04, 0x60, 0x84, 0x0f, 0xad, 0x00, 0xb6, 0x8f, 0xc9, 0x1d, 0xcc, 0x5c, 0xa2, 0x49, 0x0e, 0x50, 0x91, 0x08, 0x9a, 0x43, 0x55, 0x05}} ,\n {{0x5d, 0x93, 0x55, 0xdf, 0x9b, 0x12, 0x19, 0xec, 0x93, 0x85, 0x42, 0x9e, 0x66, 0x0f, 0x9d, 0xaf, 0x99, 0xaf, 0x26, 0x89, 0xbc, 0x61, 0xfd, 0xff, 0xce, 0x4b, 0xf4, 0x33, 0x95, 0xc9, 0x35, 0x58}}},\n{{{0x12, 0x55, 0xf9, 0xda, 0xcb, 0x44, 0xa7, 0xdc, 0x57, 0xe2, 0xf9, 0x9a, 0xe6, 0x07, 0x23, 0x60, 0x54, 0xa7, 0x39, 0xa5, 0x9b, 0x84, 0x56, 0x6e, 0xaa, 0x8b, 0x8f, 0xb0, 0x2c, 0x87, 0xaf, 0x67}} ,\n {{0x00, 0xa9, 0x4c, 0xb2, 0x12, 0xf8, 0x32, 0xa8, 0x7a, 0x00, 0x4b, 0x49, 0x32, 0xba, 0x1f, 0x5d, 0x44, 0x8e, 0x44, 0x7a, 0xdc, 0x11, 0xfb, 0x39, 0x08, 0x57, 0x87, 0xa5, 0x12, 0x42, 0x93, 0x0e}}},\n{{{0x17, 0xb4, 0xae, 0x72, 0x59, 0xd0, 0xaa, 0xa8, 0x16, 0x8b, 0x63, 0x11, 0xb3, 0x43, 0x04, 0xda, 0x0c, 0xa8, 0xb7, 0x68, 0xdd, 0x4e, 0x54, 0xe7, 0xaf, 0x5d, 0x5d, 0x05, 0x76, 0x36, 0xec, 0x0d}} ,\n {{0x6d, 0x7c, 0x82, 0x32, 0x38, 0x55, 0x57, 0x74, 0x5b, 0x7d, 0xc3, 0xc4, 0xfb, 0x06, 0x29, 0xf0, 0x13, 0x55, 0x54, 0xc6, 0xa7, 0xdc, 0x4c, 0x9f, 0x98, 0x49, 0x20, 0xa8, 0xc3, 0x8d, 0xfa, 0x48}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x87, 0x47, 0x9d, 0xe9, 0x25, 0xd5, 0xe3, 0x47, 0x78, 0xdf, 0x85, 0xa7, 0x85, 0x5e, 0x7a, 0x4c, 0x5f, 0x79, 0x1a, 0xf3, 0xa2, 0xb2, 0x28, 0xa0, 0x9c, 0xdd, 0x30, 0x40, 0xd4, 0x38, 0xbd, 0x28}} ,\n {{0xfc, 0xbb, 0xd5, 0x78, 0x6d, 0x1d, 0xd4, 0x99, 0xb4, 0xaa, 0x44, 0x44, 0x7a, 0x1b, 0xd8, 0xfe, 0xb4, 0x99, 0xb9, 0xcc, 0xe7, 0xc4, 0xd3, 0x3a, 0x73, 0x83, 0x41, 0x5c, 0x40, 0xd7, 0x2d, 0x55}}},\n{{{0x26, 0xe1, 0x7b, 0x5f, 0xe5, 0xdc, 0x3f, 0x7d, 0xa1, 0xa7, 0x26, 0x44, 0x22, 0x23, 0xc0, 0x8f, 0x7d, 0xf1, 0xb5, 0x11, 0x47, 0x7b, 0x19, 0xd4, 0x75, 0x6f, 0x1e, 0xa5, 0x27, 0xfe, 0xc8, 0x0e}} ,\n {{0xd3, 0x11, 0x3d, 0xab, 0xef, 0x2c, 0xed, 0xb1, 0x3d, 0x7c, 0x32, 0x81, 0x6b, 0xfe, 0xf8, 0x1c, 0x3c, 0x7b, 0xc0, 0x61, 0xdf, 0xb8, 0x75, 0x76, 0x7f, 0xaa, 0xd8, 0x93, 0xaf, 0x3d, 0xe8, 0x3d}}},\n{{{0xfd, 0x5b, 0x4e, 0x8d, 0xb6, 0x7e, 0x82, 0x9b, 0xef, 0xce, 0x04, 0x69, 0x51, 0x52, 0xff, 0xef, 0xa0, 0x52, 0xb5, 0x79, 0x17, 0x5e, 0x2f, 0xde, 0xd6, 0x3c, 0x2d, 0xa0, 0x43, 0xb4, 0x0b, 0x19}} ,\n {{0xc0, 0x61, 0x48, 0x48, 0x17, 0xf4, 0x9e, 0x18, 0x51, 0x2d, 0xea, 0x2f, 0xf2, 0xf2, 0xe0, 0xa3, 0x14, 0xb7, 0x8b, 0x3a, 0x30, 0xf5, 0x81, 0xc1, 0x5d, 0x71, 0x39, 0x62, 0x55, 0x1f, 0x60, 0x5a}}},\n{{{0xe5, 0x89, 0x8a, 0x76, 0x6c, 0xdb, 0x4d, 0x0a, 0x5b, 0x72, 0x9d, 0x59, 0x6e, 0x63, 0x63, 0x18, 0x7c, 0xe3, 0xfa, 0xe2, 0xdb, 0xa1, 0x8d, 0xf4, 0xa5, 0xd7, 0x16, 0xb2, 0xd0, 0xb3, 0x3f, 0x39}} ,\n {{0xce, 0x60, 0x09, 0x6c, 0xf5, 0x76, 0x17, 0x24, 0x80, 0x3a, 0x96, 0xc7, 0x94, 0x2e, 0xf7, 0x6b, 0xef, 0xb5, 0x05, 0x96, 0xef, 0xd3, 0x7b, 0x51, 0xda, 0x05, 0x44, 0x67, 0xbc, 0x07, 0x21, 0x4e}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0xe9, 0x73, 0x6f, 0x21, 0xb9, 0xde, 0x22, 0x7d, 0xeb, 0x97, 0x31, 0x10, 0xa3, 0xea, 0xe1, 0xc6, 0x37, 0xeb, 0x8f, 0x43, 0x58, 0xde, 0x41, 0x64, 0x0e, 0x3e, 0x07, 0x99, 0x3d, 0xf1, 0xdf, 0x1e}} ,\n {{0xf8, 0xad, 0x43, 0xc2, 0x17, 0x06, 0xe2, 0xe4, 0xa9, 0x86, 0xcd, 0x18, 0xd7, 0x78, 0xc8, 0x74, 0x66, 0xd2, 0x09, 0x18, 0xa5, 0xf1, 0xca, 0xa6, 0x62, 0x92, 0xc1, 0xcb, 0x00, 0xeb, 0x42, 0x2e}}},\n{{{0x7b, 0x34, 0x24, 0x4c, 0xcf, 0x38, 0xe5, 0x6c, 0x0a, 0x01, 0x2c, 0x22, 0x0b, 0x24, 0x38, 0xad, 0x24, 0x7e, 0x19, 0xf0, 0x6c, 0xf9, 0x31, 0xf4, 0x35, 0x11, 0xf6, 0x46, 0x33, 0x3a, 0x23, 0x59}} ,\n {{0x20, 0x0b, 0xa1, 0x08, 0x19, 0xad, 0x39, 0x54, 0xea, 0x3e, 0x23, 0x09, 0xb6, 0xe2, 0xd2, 0xbc, 0x4d, 0xfc, 0x9c, 0xf0, 0x13, 0x16, 0x22, 0x3f, 0xb9, 0xd2, 0x11, 0x86, 0x90, 0x55, 0xce, 0x3c}}},\n{{{0xc4, 0x0b, 0x4b, 0x62, 0x99, 0x37, 0x84, 0x3f, 0x74, 0xa2, 0xf9, 0xce, 0xe2, 0x0b, 0x0f, 0x2a, 0x3d, 0xa3, 0xe3, 0xdb, 0x5a, 0x9d, 0x93, 0xcc, 0xa5, 0xef, 0x82, 0x91, 0x1d, 0xe6, 0x6c, 0x68}} ,\n {{0xa3, 0x64, 0x17, 0x9b, 0x8b, 0xc8, 0x3a, 0x61, 0xe6, 0x9d, 0xc6, 0xed, 0x7b, 0x03, 0x52, 0x26, 0x9d, 0x3a, 0xb3, 0x13, 0xcc, 0x8a, 0xfd, 0x2c, 0x1a, 0x1d, 0xed, 0x13, 0xd0, 0x55, 0x57, 0x0e}}},\n{{{0x1a, 0xea, 0xbf, 0xfd, 0x4a, 0x3c, 0x8e, 0xec, 0x29, 0x7e, 0x77, 0x77, 0x12, 0x99, 0xd7, 0x84, 0xf9, 0x55, 0x7f, 0xf1, 0x8b, 0xb4, 0xd2, 0x95, 0xa3, 0x8d, 0xf0, 0x8a, 0xa7, 0xeb, 0x82, 0x4b}} ,\n {{0x2c, 0x28, 0xf4, 0x3a, 0xf6, 0xde, 0x0a, 0xe0, 0x41, 0x44, 0x23, 0xf8, 0x3f, 0x03, 0x64, 0x9f, 0xc3, 0x55, 0x4c, 0xc6, 0xc1, 0x94, 0x1c, 0x24, 0x5d, 0x5f, 0x92, 0x45, 0x96, 0x57, 0x37, 0x14}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0xc1, 0xcd, 0x90, 0x66, 0xb9, 0x76, 0xa0, 0x5b, 0xa5, 0x85, 0x75, 0x23, 0xf9, 0x89, 0xa5, 0x82, 0xb2, 0x6f, 0xb1, 0xeb, 0xc4, 0x69, 0x6f, 0x18, 0x5a, 0xed, 0x94, 0x3d, 0x9d, 0xd9, 0x2c, 0x1a}} ,\n {{0x35, 0xb0, 0xe6, 0x73, 0x06, 0xb7, 0x37, 0xe0, 0xf8, 0xb0, 0x22, 0xe8, 0xd2, 0xed, 0x0b, 0xef, 0xe6, 0xc6, 0x5a, 0x99, 0x9e, 0x1a, 0x9f, 0x04, 0x97, 0xe4, 0x4d, 0x0b, 0xbe, 0xba, 0x44, 0x40}}},\n{{{0xc1, 0x56, 0x96, 0x91, 0x5f, 0x1f, 0xbb, 0x54, 0x6f, 0x88, 0x89, 0x0a, 0xb2, 0xd6, 0x41, 0x42, 0x6a, 0x82, 0xee, 0x14, 0xaa, 0x76, 0x30, 0x65, 0x0f, 0x67, 0x39, 0xa6, 0x51, 0x7c, 0x49, 0x24}} ,\n {{0x35, 0xa3, 0x78, 0xd1, 0x11, 0x0f, 0x75, 0xd3, 0x70, 0x46, 0xdb, 0x20, 0x51, 0xcb, 0x92, 0x80, 0x54, 0x10, 0x74, 0x36, 0x86, 0xa9, 0xd7, 0xa3, 0x08, 0x78, 0xf1, 0x01, 0x29, 0xf8, 0x80, 0x3b}}},\n{{{0xdb, 0xa7, 0x9d, 0x9d, 0xbf, 0xa0, 0xcc, 0xed, 0x53, 0xa2, 0xa2, 0x19, 0x39, 0x48, 0x83, 0x19, 0x37, 0x58, 0xd1, 0x04, 0x28, 0x40, 0xf7, 0x8a, 0xc2, 0x08, 0xb7, 0xa5, 0x42, 0xcf, 0x53, 0x4c}} ,\n {{0xa7, 0xbb, 0xf6, 0x8e, 0xad, 0xdd, 0xf7, 0x90, 0xdd, 0x5f, 0x93, 0x89, 0xae, 0x04, 0x37, 0xe6, 0x9a, 0xb7, 0xe8, 0xc0, 0xdf, 0x16, 0x2a, 0xbf, 0xc4, 0x3a, 0x3c, 0x41, 0xd5, 0x89, 0x72, 0x5a}}},\n{{{0x1f, 0x96, 0xff, 0x34, 0x2c, 0x13, 0x21, 0xcb, 0x0a, 0x89, 0x85, 0xbe, 0xb3, 0x70, 0x9e, 0x1e, 0xde, 0x97, 0xaf, 0x96, 0x30, 0xf7, 0x48, 0x89, 0x40, 0x8d, 0x07, 0xf1, 0x25, 0xf0, 0x30, 0x58}} ,\n {{0x1e, 0xd4, 0x93, 0x57, 0xe2, 0x17, 0xe7, 0x9d, 0xab, 0x3c, 0x55, 0x03, 0x82, 0x2f, 0x2b, 0xdb, 0x56, 0x1e, 0x30, 0x2e, 0x24, 0x47, 0x6e, 0xe6, 0xff, 0x33, 0x24, 0x2c, 0x75, 0x51, 0xd4, 0x67}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0x2b, 0x06, 0xd9, 0xa1, 0x5d, 0xe1, 0xf4, 0xd1, 0x1e, 0x3c, 0x9a, 0xc6, 0x29, 0x2b, 0x13, 0x13, 0x78, 0xc0, 0xd8, 0x16, 0x17, 0x2d, 0x9e, 0xa9, 0xc9, 0x79, 0x57, 0xab, 0x24, 0x91, 0x92, 0x19}} ,\n {{0x69, 0xfb, 0xa1, 0x9c, 0xa6, 0x75, 0x49, 0x7d, 0x60, 0x73, 0x40, 0x42, 0xc4, 0x13, 0x0a, 0x95, 0x79, 0x1e, 0x04, 0x83, 0x94, 0x99, 0x9b, 0x1e, 0x0c, 0xe8, 0x1f, 0x54, 0xef, 0xcb, 0xc0, 0x52}}},\n{{{0x14, 0x89, 0x73, 0xa1, 0x37, 0x87, 0x6a, 0x7a, 0xcf, 0x1d, 0xd9, 0x2e, 0x1a, 0x67, 0xed, 0x74, 0xc0, 0xf0, 0x9c, 0x33, 0xdd, 0xdf, 0x08, 0xbf, 0x7b, 0xd1, 0x66, 0xda, 0xe6, 0xc9, 0x49, 0x08}} ,\n {{0xe9, 0xdd, 0x5e, 0x55, 0xb0, 0x0a, 0xde, 0x21, 0x4c, 0x5a, 0x2e, 0xd4, 0x80, 0x3a, 0x57, 0x92, 0x7a, 0xf1, 0xc4, 0x2c, 0x40, 0xaf, 0x2f, 0xc9, 0x92, 0x03, 0xe5, 0x5a, 0xbc, 0xdc, 0xf4, 0x09}}},\n{{{0xf3, 0xe1, 0x2b, 0x7c, 0x05, 0x86, 0x80, 0x93, 0x4a, 0xad, 0xb4, 0x8f, 0x7e, 0x99, 0x0c, 0xfd, 0xcd, 0xef, 0xd1, 0xff, 0x2c, 0x69, 0x34, 0x13, 0x41, 0x64, 0xcf, 0x3b, 0xd0, 0x90, 0x09, 0x1e}} ,\n {{0x9d, 0x45, 0xd6, 0x80, 0xe6, 0x45, 0xaa, 0xf4, 0x15, 0xaa, 0x5c, 0x34, 0x87, 0x99, 0xa2, 0x8c, 0x26, 0x84, 0x62, 0x7d, 0xb6, 0x29, 0xc0, 0x52, 0xea, 0xf5, 0x81, 0x18, 0x0f, 0x35, 0xa9, 0x0e}}},\n{{{0xe7, 0x20, 0x72, 0x7c, 0x6d, 0x94, 0x5f, 0x52, 0x44, 0x54, 0xe3, 0xf1, 0xb2, 0xb0, 0x36, 0x46, 0x0f, 0xae, 0x92, 0xe8, 0x70, 0x9d, 0x6e, 0x79, 0xb1, 0xad, 0x37, 0xa9, 0x5f, 0xc0, 0xde, 0x03}} ,\n {{0x15, 0x55, 0x37, 0xc6, 0x1c, 0x27, 0x1c, 0x6d, 0x14, 0x4f, 0xca, 0xa4, 0xc4, 0x88, 0x25, 0x46, 0x39, 0xfc, 0x5a, 0xe5, 0xfe, 0x29, 0x11, 0x69, 0xf5, 0x72, 0x84, 0x4d, 0x78, 0x9f, 0x94, 0x15}}},\n{{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}},\n {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}},\n{{{0xec, 0xd3, 0xff, 0x57, 0x0b, 0xb0, 0xb2, 0xdc, 0xf8, 0x4f, 0xe2, 0x12, 0xd5, 0x36, 0xbe, 0x6b, 0x09, 0x43, 0x6d, 0xa3, 0x4d, 0x90, 0x2d, 0xb8, 0x74, 0xe8, 0x71, 0x45, 0x19, 0x8b, 0x0c, 0x6a}} ,\n {{0xb8, 0x42, 0x1c, 0x03, 0xad, 0x2c, 0x03, 0x8e, 0xac, 0xd7, 0x98, 0x29, 0x13, 0xc6, 0x02, 0x29, 0xb5, 0xd4, 0xe7, 0xcf, 0xcc, 0x8b, 0x83, 0xec, 0x35, 0xc7, 0x9c, 0x74, 0xb7, 0xad, 0x85, 0x5f}}},\n{{{0x78, 0x84, 0xe1, 0x56, 0x45, 0x69, 0x68, 0x5a, 0x4f, 0xb8, 0xb1, 0x29, 0xff, 0x33, 0x03, 0x31, 0xb7, 0xcb, 0x96, 0x25, 0xe6, 0xe6, 0x41, 0x98, 0x1a, 0xbb, 0x03, 0x56, 0xf2, 0xb2, 0x91, 0x34}} ,\n {{0x2c, 0x6c, 0xf7, 0x66, 0xa4, 0x62, 0x6b, 0x39, 0xb3, 0xba, 0x65, 0xd3, 0x1c, 0xf8, 0x11, 0xaa, 0xbe, 0xdc, 0x80, 0x59, 0x87, 0xf5, 0x7b, 0xe5, 0xe3, 0xb3, 0x3e, 0x39, 0xda, 0xbe, 0x88, 0x09}}},\n{{{0x8b, 0xf1, 0xa0, 0xf5, 0xdc, 0x29, 0xb4, 0xe2, 0x07, 0xc6, 0x7a, 0x00, 0xd0, 0x89, 0x17, 0x51, 0xd4, 0xbb, 0xd4, 0x22, 0xea, 0x7e, 0x7d, 0x7c, 0x24, 0xea, 0xf2, 0xe8, 0x22, 0x12, 0x95, 0x06}} ,\n {{0xda, 0x7c, 0xa4, 0x0c, 0xf4, 0xba, 0x6e, 0xe1, 0x89, 0xb5, 0x59, 0xca, 0xf1, 0xc0, 0x29, 0x36, 0x09, 0x44, 0xe2, 0x7f, 0xd1, 0x63, 0x15, 0x99, 0xea, 0x25, 0xcf, 0x0c, 0x9d, 0xc0, 0x44, 0x6f}}},\n{{{0x1d, 0x86, 0x4e, 0xcf, 0xf7, 0x37, 0x10, 0x25, 0x8f, 0x12, 0xfb, 0x19, 0xfb, 0xe0, 0xed, 0x10, 0xc8, 0xe2, 0xf5, 0x75, 0xb1, 0x33, 0xc0, 0x96, 0x0d, 0xfb, 0x15, 0x6c, 0x0d, 0x07, 0x5f, 0x05}} ,\n {{0x69, 0x3e, 0x47, 0x97, 0x2c, 0xaf, 0x52, 0x7c, 0x78, 0x83, 0xad, 0x1b, 0x39, 0x82, 0x2f, 0x02, 0x6f, 0x47, 0xdb, 0x2a, 0xb0, 0xe1, 0x91, 0x99, 0x55, 0xb8, 0x99, 0x3a, 0xa0, 0x44, 0x11, 0x51}}}\n"
  },
  {
    "path": "src/libssh/src/external/poly1305.c",
    "content": "/*\n * Public Domain poly1305 from Andrew Moon\n * poly1305-donna-unrolled.c from https://github.com/floodyberry/poly1305-donna\n */\n\n#include \"config.h\"\n\n#include <stdint.h>\n#include <sys/types.h>\n\n#include \"libssh/poly1305.h\"\n\n#define mul32x32_64(a,b) ((uint64_t)(a) * (b))\n\n#define U8TO32_LE(p) \\\n    (((uint32_t)((p)[0])) | \\\n     ((uint32_t)((p)[1]) <<  8) | \\\n     ((uint32_t)((p)[2]) << 16) | \\\n     ((uint32_t)((p)[3]) << 24))\n\n#define U32TO8_LE(p, v) \\\n    do { \\\n        (p)[0] = (uint8_t)((v)); \\\n        (p)[1] = (uint8_t)((v) >>  8); \\\n        (p)[2] = (uint8_t)((v) >> 16); \\\n        (p)[3] = (uint8_t)((v) >> 24); \\\n    } while (0)\n\nvoid\npoly1305_auth(unsigned char out[POLY1305_TAGLEN], const unsigned char *m, size_t inlen, const unsigned char key[POLY1305_KEYLEN]) {\n    uint32_t t0,t1,t2,t3;\n    uint32_t h0,h1,h2,h3,h4;\n    uint32_t r0,r1,r2,r3,r4;\n    uint32_t s1,s2,s3,s4;\n    uint32_t b, nb;\n    size_t j;\n    uint64_t t[5];\n    uint64_t f0,f1,f2,f3;\n    uint32_t g0,g1,g2,g3,g4;\n    uint64_t c;\n    unsigned char mp[16];\n\n    /* clamp key */\n    t0 = U8TO32_LE(key+0);\n    t1 = U8TO32_LE(key+4);\n    t2 = U8TO32_LE(key+8);\n    t3 = U8TO32_LE(key+12);\n\n    /* precompute multipliers */\n    r0 = t0 & 0x3ffffff; t0 >>= 26; t0 |= t1 << 6;\n    r1 = t0 & 0x3ffff03; t1 >>= 20; t1 |= t2 << 12;\n    r2 = t1 & 0x3ffc0ff; t2 >>= 14; t2 |= t3 << 18;\n    r3 = t2 & 0x3f03fff; t3 >>= 8;\n    r4 = t3 & 0x00fffff;\n\n    s1 = r1 * 5;\n    s2 = r2 * 5;\n    s3 = r3 * 5;\n    s4 = r4 * 5;\n\n    /* init state */\n    h0 = 0;\n    h1 = 0;\n    h2 = 0;\n    h3 = 0;\n    h4 = 0;\n\n    /* full blocks */\n    if (inlen < 16) goto poly1305_donna_atmost15bytes;\npoly1305_donna_16bytes:\n    m += 16;\n    inlen -= 16;\n\n    t0 = U8TO32_LE(m-16);\n    t1 = U8TO32_LE(m-12);\n    t2 = U8TO32_LE(m-8);\n    t3 = U8TO32_LE(m-4);\n\n    h0 += t0 & 0x3ffffff;\n    h1 += ((((uint64_t)t1 << 32) | t0) >> 26) & 0x3ffffff;\n    h2 += ((((uint64_t)t2 << 32) | t1) >> 20) & 0x3ffffff;\n    h3 += ((((uint64_t)t3 << 32) | t2) >> 14) & 0x3ffffff;\n    h4 += (t3 >> 8) | (1 << 24);\n\n\npoly1305_donna_mul:\n    t[0]  = mul32x32_64(h0,r0) + mul32x32_64(h1,s4) + mul32x32_64(h2,s3) + mul32x32_64(h3,s2) + mul32x32_64(h4,s1);\n    t[1]  = mul32x32_64(h0,r1) + mul32x32_64(h1,r0) + mul32x32_64(h2,s4) + mul32x32_64(h3,s3) + mul32x32_64(h4,s2);\n    t[2]  = mul32x32_64(h0,r2) + mul32x32_64(h1,r1) + mul32x32_64(h2,r0) + mul32x32_64(h3,s4) + mul32x32_64(h4,s3);\n    t[3]  = mul32x32_64(h0,r3) + mul32x32_64(h1,r2) + mul32x32_64(h2,r1) + mul32x32_64(h3,r0) + mul32x32_64(h4,s4);\n    t[4]  = mul32x32_64(h0,r4) + mul32x32_64(h1,r3) + mul32x32_64(h2,r2) + mul32x32_64(h3,r1) + mul32x32_64(h4,r0);\n\n                    h0 = (uint32_t)t[0] & 0x3ffffff; c =           (t[0] >> 26);\n    t[1] += c;      h1 = (uint32_t)t[1] & 0x3ffffff; b = (uint32_t)(t[1] >> 26);\n    t[2] += b;      h2 = (uint32_t)t[2] & 0x3ffffff; b = (uint32_t)(t[2] >> 26);\n    t[3] += b;      h3 = (uint32_t)t[3] & 0x3ffffff; b = (uint32_t)(t[3] >> 26);\n    t[4] += b;      h4 = (uint32_t)t[4] & 0x3ffffff; b = (uint32_t)(t[4] >> 26);\n    h0 += b * 5;\n\n    if (inlen >= 16) goto poly1305_donna_16bytes;\n\n    /* final bytes */\npoly1305_donna_atmost15bytes:\n    if (!inlen) goto poly1305_donna_finish;\n\n    for (j = 0; j < inlen; j++) mp[j] = m[j];\n    mp[j++] = 1;\n    for (; j < 16; j++)    mp[j] = 0;\n    inlen = 0;\n\n    t0 = U8TO32_LE(mp+0);\n    t1 = U8TO32_LE(mp+4);\n    t2 = U8TO32_LE(mp+8);\n    t3 = U8TO32_LE(mp+12);\n\n    h0 += t0 & 0x3ffffff;\n    h1 += ((((uint64_t)t1 << 32) | t0) >> 26) & 0x3ffffff;\n    h2 += ((((uint64_t)t2 << 32) | t1) >> 20) & 0x3ffffff;\n    h3 += ((((uint64_t)t3 << 32) | t2) >> 14) & 0x3ffffff;\n    h4 += (t3 >> 8);\n\n    goto poly1305_donna_mul;\n\npoly1305_donna_finish:\n                 b = h0 >> 26; h0 = h0 & 0x3ffffff;\n    h1 +=     b; b = h1 >> 26; h1 = h1 & 0x3ffffff;\n    h2 +=     b; b = h2 >> 26; h2 = h2 & 0x3ffffff;\n    h3 +=     b; b = h3 >> 26; h3 = h3 & 0x3ffffff;\n    h4 +=     b; b = h4 >> 26; h4 = h4 & 0x3ffffff;\n    h0 += b * 5; b = h0 >> 26; h0 = h0 & 0x3ffffff;\n    h1 +=     b;\n\n    g0 = h0 + 5; b = g0 >> 26; g0 &= 0x3ffffff;\n    g1 = h1 + b; b = g1 >> 26; g1 &= 0x3ffffff;\n    g2 = h2 + b; b = g2 >> 26; g2 &= 0x3ffffff;\n    g3 = h3 + b; b = g3 >> 26; g3 &= 0x3ffffff;\n    g4 = h4 + b - (1 << 26);\n\n    b = (g4 >> 31) - 1;\n    nb = ~b;\n    h0 = (h0 & nb) | (g0 & b);\n    h1 = (h1 & nb) | (g1 & b);\n    h2 = (h2 & nb) | (g2 & b);\n    h3 = (h3 & nb) | (g3 & b);\n    h4 = (h4 & nb) | (g4 & b);\n\n    f0 = ((h0      ) | (h1 << 26)) + (uint64_t)U8TO32_LE(&key[16]);\n    f1 = ((h1 >>  6) | (h2 << 20)) + (uint64_t)U8TO32_LE(&key[20]);\n    f2 = ((h2 >> 12) | (h3 << 14)) + (uint64_t)U8TO32_LE(&key[24]);\n    f3 = ((h3 >> 18) | (h4 <<  8)) + (uint64_t)U8TO32_LE(&key[28]);\n\n    U32TO8_LE(&out[ 0], f0); f1 += (f0 >> 32);\n    U32TO8_LE(&out[ 4], f1); f2 += (f1 >> 32);\n    U32TO8_LE(&out[ 8], f2); f3 += (f2 >> 32);\n    U32TO8_LE(&out[12], f3);\n}\n"
  },
  {
    "path": "src/libssh/src/external/sc25519.c",
    "content": "/*\n * Public Domain, Authors: Daniel J. Bernstein, Niels Duif, Tanja Lange,\n * Peter Schwabe, Bo-Yin Yang.\n * Copied from supercop-20130419/crypto_sign/ed25519/ref/sc25519.c\n */\n\n#include \"config.h\"\n\n#include \"libssh/priv.h\"\n#include \"libssh/sc25519.h\"\n\n/*Arithmetic modulo the group order m = 2^252 +  27742317777372353535851937790883648493 = 7237005577332262213973186563042994240857116359379907606001950938285454250989 */\n\nstatic const uint32_t m[32] = {\n    0xED, 0xD3, 0xF5, 0x5C, 0x1A, 0x63, 0x12, 0x58,\n    0xD6, 0x9C, 0xF7, 0xA2, 0xDE, 0xF9, 0xDE, 0x14,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10\n};\n\nstatic const uint32_t mu[33] = {\n    0x1B, 0x13, 0x2C, 0x0A, 0xA3, 0xE5, 0x9C, 0xED,\n    0xA7, 0x29, 0x63, 0x08, 0x5D, 0x21, 0x06, 0x21,\n    0xEB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F\n};\n\nstatic uint32_t lt(uint32_t a,uint32_t b) /* 16-bit inputs */\n{\n    unsigned int x = a;\n\n    x -= (unsigned int) b; /* 0..65535: no; 4294901761..4294967295: yes */\n    x >>= 31; /* 0: no; 1: yes */\n\n    return x;\n}\n\n/* Reduce coefficients of r before calling reduce_add_sub */\nstatic void reduce_add_sub(sc25519 *r)\n{\n    uint32_t pb = 0;\n    uint32_t b;\n    uint32_t mask;\n    int i;\n    unsigned char t[32];\n\n    for (i = 0; i < 32; i++) {\n        pb += m[i];\n        b = lt(r->v[i],pb);\n        t[i] = r->v[i]-pb+(b<<8);\n        pb = b;\n    }\n    mask = b - 1;\n    for (i = 0; i < 32; i++) {\n        r->v[i] ^= mask & (r->v[i] ^ t[i]);\n    }\n}\n\n/* Reduce coefficients of x before calling barrett_reduce */\nstatic void barrett_reduce(sc25519 *r, const uint32_t x[64])\n{\n    /* See HAC, Alg. 14.42 */\n    int i,j;\n    uint32_t q2[66];\n    uint32_t *q3 = q2 + 33;\n    uint32_t r1[33];\n    uint32_t r2[33];\n    uint32_t carry;\n    uint32_t pb = 0;\n    uint32_t b;\n\n    for (i = 0; i < 66; i++) {\n        q2[i] = 0;\n    }\n    for (i = 0; i < 33; i++) {\n        r2[i] = 0;\n    }\n\n    for (i = 0; i < 33; i++) {\n        for (j = 0; j < 33; j++) {\n            if (i + j >= 31) {\n                q2[i+j] += mu[i]*x[j+31];\n            }\n        }\n    }\n\n    carry = q2[31] >> 8;\n    q2[32] += carry;\n    carry = q2[32] >> 8;\n    q2[33] += carry;\n\n    for (i = 0; i < 33; i++) {\n        r1[i] = x[i];\n    }\n\n    for (i = 0; i < 32; i++) {\n        for (j = 0; j < 33; j++) {\n            if (i + j < 33) {\n                r2[i+j] += m[i]*q3[j];\n            }\n        }\n    }\n\n    for (i = 0; i < 32; i++) {\n        carry = r2[i] >> 8;\n        r2[i+1] += carry;\n        r2[i] &= 0xff;\n    }\n\n    for (i = 0; i < 32; i++) {\n        pb += r2[i];\n        b = lt(r1[i],pb);\n        r->v[i] = r1[i]-pb+(b<<8);\n        pb = b;\n    }\n\n    /* XXX: Can it really happen that r<0?, See HAC, Alg 14.42, Step 3\n     * If so: Handle  it here!\n     */\n\n    reduce_add_sub(r);\n    reduce_add_sub(r);\n}\n\nvoid sc25519_from32bytes(sc25519 *r, const unsigned char x[32])\n{\n    int i;\n    uint32_t t[64];\n\n    for (i = 0; i < 32; i++) {\n        t[i] = x[i];\n    }\n    for (i = 32; i < 64; i++) {\n        t[i] = 0;\n    }\n\n    barrett_reduce(r, t);\n}\n\nvoid shortsc25519_from16bytes(shortsc25519 *r, const unsigned char x[16])\n{\n    int i;\n\n    for (i = 0; i < 16; i++) {\n        r->v[i] = x[i];\n    }\n}\n\nvoid sc25519_from64bytes(sc25519 *r, const unsigned char x[64])\n{\n    int i;\n    uint32_t t[64];\n\n    for (i = 0; i < 64; i++) {\n        t[i] = x[i];\n    }\n\n    barrett_reduce(r, t);\n}\n\nvoid sc25519_from_shortsc(sc25519 *r, const shortsc25519 *x)\n{\n    int i;\n\n    for (i = 0; i < 16; i++) {\n        r->v[i] = x->v[i];\n    }\n    for (i = 0; i < 16; i++) {\n        r->v[16+i] = 0;\n    }\n}\n\nvoid sc25519_to32bytes(unsigned char r[32], const sc25519 *x)\n{\n    int i;\n\n    for (i = 0; i < 32; i++) {\n        r[i] = x->v[i];\n    }\n}\n\nint sc25519_iszero_vartime(const sc25519 *x)\n{\n    int i;\n\n    for (i = 0; i < 32; i++) {\n        if(x->v[i] != 0) {\n            return 0;\n        }\n    }\n\n    return 1;\n}\n\nint sc25519_isshort_vartime(const sc25519 *x)\n{\n    int i;\n\n    for (i = 31; i > 15; i--) {\n        if (x->v[i] != 0) {\n            return 0;\n        }\n    }\n\n    return 1;\n}\n\nint sc25519_lt_vartime(const sc25519 *x, const sc25519 *y)\n{\n    int i;\n\n    for (i = 31; i >= 0; i--) {\n        if (x->v[i] < y->v[i]) {\n            return 1;\n        }\n        if (x->v[i] > y->v[i]) {\n            return 0;\n        }\n    }\n\n    return 0;\n}\n\nvoid sc25519_add(sc25519 *r, const sc25519 *x, const sc25519 *y)\n{\n    uint32_t i, carry;\n\n    for (i = 0; i < 32; i++) {\n        r->v[i] = x->v[i] + y->v[i];\n    }\n\n    for (i = 0;i < 31; i++) {\n        carry = r->v[i] >> 8;\n        r->v[i+1] += carry;\n        r->v[i] &= 0xff;\n    }\n\n    reduce_add_sub(r);\n}\n\nvoid sc25519_sub_nored(sc25519 *r, const sc25519 *x, const sc25519 *y)\n{\n    uint32_t b = 0;\n    uint32_t t;\n    int i;\n\n    for (i = 0; i < 32; i++) {\n        t = x->v[i] - y->v[i] - b;\n        r->v[i] = t & 255;\n        b = (t >> 8) & 1;\n    }\n}\n\nvoid sc25519_mul(sc25519 *r, const sc25519 *x, const sc25519 *y)\n{\n    uint32_t i,j,carry;\n    uint32_t t[64];\n\n    for (i = 0; i < 64; i++) {\n        t[i] = 0;\n    }\n\n    for (i = 0; i < 32; i++) {\n        for (j = 0; j < 32; j++) {\n            t[i+j] += x->v[i] * y->v[j];\n        }\n    }\n\n    /* Reduce coefficients */\n    for (i = 0; i < 63; i++) {\n        carry = t[i] >> 8;\n        t[i+1] += carry;\n        t[i] &= 0xff;\n    }\n\n    barrett_reduce(r, t);\n}\n\nvoid sc25519_mul_shortsc(sc25519 *r, const sc25519 *x, const shortsc25519 *y)\n{\n    sc25519 t;\n    sc25519_from_shortsc(&t, y);\n    sc25519_mul(r, x, &t);\n}\n\nvoid sc25519_window3(signed char r[85], const sc25519 *s)\n{\n    char carry;\n    int i;\n\n    for (i = 0; i < 10; i++) {\n        r[8*i+0]  =  s->v[3*i+0]       & 7;\n        r[8*i+1]  = (s->v[3*i+0] >> 3) & 7;\n        r[8*i+2]  = (s->v[3*i+0] >> 6) & 7;\n        r[8*i+2] ^= (s->v[3*i+1] << 2) & 7;\n        r[8*i+3]  = (s->v[3*i+1] >> 1) & 7;\n        r[8*i+4]  = (s->v[3*i+1] >> 4) & 7;\n        r[8*i+5]  = (s->v[3*i+1] >> 7) & 7;\n        r[8*i+5] ^= (s->v[3*i+2] << 1) & 7;\n        r[8*i+6]  = (s->v[3*i+2] >> 2) & 7;\n        r[8*i+7]  = (s->v[3*i+2] >> 5) & 7;\n    }\n    r[8*i+0]  =  s->v[3*i+0]       & 7;\n    r[8*i+1]  = (s->v[3*i+0] >> 3) & 7;\n    r[8*i+2]  = (s->v[3*i+0] >> 6) & 7;\n    r[8*i+2] ^= (s->v[3*i+1] << 2) & 7;\n    r[8*i+3]  = (s->v[3*i+1] >> 1) & 7;\n    r[8*i+4]  = (s->v[3*i+1] >> 4) & 7;\n\n    /* Making it signed */\n    carry = 0;\n    for (i = 0; i < 84; i++) {\n        r[i] += carry;\n        r[i+1] += r[i] >> 3;\n        r[i] &= 7;\n        carry = r[i] >> 2;\n        r[i] -= carry<<3;\n    }\n\n    r[84] += carry;\n}\n\nvoid sc25519_window5(signed char r[51], const sc25519 *s)\n{\n    char carry;\n    int i;\n\n    for (i = 0; i < 6; i++) {\n        r[8*i+0]  =  s->v[5*i+0]       & 31;\n        r[8*i+1]  = (s->v[5*i+0] >> 5) & 31;\n        r[8*i+1] ^= (s->v[5*i+1] << 3) & 31;\n        r[8*i+2]  = (s->v[5*i+1] >> 2) & 31;\n        r[8*i+3]  = (s->v[5*i+1] >> 7) & 31;\n        r[8*i+3] ^= (s->v[5*i+2] << 1) & 31;\n        r[8*i+4]  = (s->v[5*i+2] >> 4) & 31;\n        r[8*i+4] ^= (s->v[5*i+3] << 4) & 31;\n        r[8*i+5]  = (s->v[5*i+3] >> 1) & 31;\n        r[8*i+6]  = (s->v[5*i+3] >> 6) & 31;\n        r[8*i+6] ^= (s->v[5*i+4] << 2) & 31;\n        r[8*i+7]  = (s->v[5*i+4] >> 3) & 31;\n    }\n    r[8*i+0]  =  s->v[5*i+0]       & 31;\n    r[8*i+1]  = (s->v[5*i+0] >> 5) & 31;\n    r[8*i+1] ^= (s->v[5*i+1] << 3) & 31;\n    r[8*i+2]  = (s->v[5*i+1] >> 2) & 31;\n\n    /* Making it signed */\n    carry = 0;\n    for (i = 0; i < 50; i++) {\n        r[i] += carry;\n        r[i+1] += r[i] >> 5;\n        r[i] &= 31;\n        carry = r[i] >> 4;\n        r[i] -= carry<<5;\n    }\n\n    r[50] += carry;\n}\n\nvoid sc25519_2interleave2(unsigned char r[127],\n                          const sc25519 *s1,\n                          const sc25519 *s2)\n{\n    int i;\n\n    for (i = 0; i < 31; i++) {\n        r[4*i]   = ( s1->v[i]       & 3) ^ (( s2->v[i]       & 3) << 2);\n        r[4*i+1] = ((s1->v[i] >> 2) & 3) ^ (((s2->v[i] >> 2) & 3) << 2);\n        r[4*i+2] = ((s1->v[i] >> 4) & 3) ^ (((s2->v[i] >> 4) & 3) << 2);\n        r[4*i+3] = ((s1->v[i] >> 6) & 3) ^ (((s2->v[i] >> 6) & 3) << 2);\n    }\n    r[124] = ( s1->v[31]       & 3) ^ (( s2->v[31]       & 3) << 2);\n    r[125] = ((s1->v[31] >> 2) & 3) ^ (((s2->v[31] >> 2) & 3) << 2);\n    r[126] = ((s1->v[31] >> 4) & 3) ^ (((s2->v[31] >> 4) & 3) << 2);\n}\n"
  },
  {
    "path": "src/libssh/src/gcrypt_missing.c",
    "content": "/*\n * gcrypt_missing.c - routines that are in OpenSSL but not in libgcrypt.\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2003-2006 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <stdlib.h>\n\n#include \"libssh/priv.h\"\n#include \"libssh/libgcrypt.h\"\n\n#ifdef HAVE_LIBGCRYPT\nint ssh_gcry_dec2bn(bignum *bn, const char *data) {\n  int count;\n\n  *bn = bignum_new();\n  if (*bn == NULL) {\n    return 0;\n  }\n  gcry_mpi_set_ui(*bn, 0);\n  for (count = 0; data[count]; count++) {\n    gcry_mpi_mul_ui(*bn, *bn, 10);\n    gcry_mpi_add_ui(*bn, *bn, data[count] - '0');\n  }\n\n  return count;\n}\n\nchar *ssh_gcry_bn2dec(bignum bn) {\n  bignum bndup, num, ten;\n  char *ret;\n  int count, count2;\n  int size, rsize;\n  char decnum;\n\n  size = gcry_mpi_get_nbits(bn) * 3;\n  rsize = size / 10 + size / 1000 + 2;\n\n  ret = malloc(rsize + 1);\n  if (ret == NULL) {\n    return NULL;\n  }\n\n  if (!gcry_mpi_cmp_ui(bn, 0)) {\n    strcpy(ret, \"0\");\n  } else {\n    ten = bignum_new();\n    if (ten == NULL) {\n      SAFE_FREE(ret);\n      return NULL;\n    }\n\n    num = bignum_new();\n    if (num == NULL) {\n      SAFE_FREE(ret);\n      bignum_safe_free(ten);\n      return NULL;\n    }\n\n    for (bndup = gcry_mpi_copy(bn), bignum_set_word(ten, 10), count = rsize;\n        count; count--) {\n      gcry_mpi_div(bndup, num, bndup, ten, 0);\n      for (decnum = 0, count2 = gcry_mpi_get_nbits(num); count2;\n          decnum *= 2, decnum += (gcry_mpi_test_bit(num, count2 - 1) ? 1 : 0),\n          count2--)\n        ;\n      ret[count - 1] = decnum + '0';\n    }\n    for (count = 0; count < rsize && ret[count] == '0'; count++)\n      ;\n    for (count2 = 0; count2 < rsize - count; ++count2) {\n      ret[count2] = ret[count2 + count];\n    }\n    ret[count2] = 0;\n    bignum_safe_free(num);\n    bignum_safe_free(bndup);\n    bignum_safe_free(ten);\n  }\n\n  return ret;\n}\n\n/** @brief generates a random integer between 0 and max\n * @returns 1 in case of success, 0 otherwise\n */\nint ssh_gcry_rand_range(bignum dest, bignum max)\n{\n    size_t bits;\n    bignum rnd;\n    int rc;\n\n    bits = bignum_num_bits(max) + 64;\n    rnd = bignum_new();\n    if (rnd == NULL) {\n        return 0;\n    }\n    rc = bignum_rand(rnd, bits);\n    if (rc != 1) {\n        return rc;\n    }\n    gcry_mpi_mod(dest, rnd, max);\n    bignum_safe_free(rnd);\n    return 1;\n}\n#endif\n"
  },
  {
    "path": "src/libssh/src/getpass.c",
    "content": "/*\n * getpass.c - platform independent getpass function.\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2011-2013    by Andreas Schneider <mail@cryptomilk.org>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n\n#include <libssh/priv.h>\n\n/**\n * @internal\n *\n * @brief Get the password from the console.\n *\n * @param[in]  prompt   The prompt to display.\n *\n * @param[in]  buf      The buffer to fill.\n *\n * @param[in]  len      The length of the buffer.\n *\n * @param[in]  verify   Should the password be verified?\n *\n * @return              1 on success, 0 on error.\n */\nstatic int ssh_gets(const char *prompt, char *buf, size_t len, int verify) {\n    char *tmp;\n    char *ptr = NULL;\n    int ok = 0;\n\n    tmp = calloc(1, len);\n    if (tmp == NULL) {\n        return 0;\n    }\n\n    /* read the password */\n    while (!ok) {\n        if (buf[0] != '\\0') {\n            fprintf(stdout, \"%s[%s] \", prompt, buf);\n        } else {\n            fprintf(stdout, \"%s\", prompt);\n        }\n        fflush(stdout);\n        if (fgets(tmp, len, stdin) == NULL) {\n            free(tmp);\n            return 0;\n        }\n\n        if ((ptr = strchr(tmp, '\\n'))) {\n            *ptr = '\\0';\n        }\n        fprintf(stdout, \"\\n\");\n\n        if (*tmp) {\n            strncpy(buf, tmp, len);\n        }\n\n        if (verify) {\n            char *key_string;\n\n            key_string = calloc(1, len);\n            if (key_string == NULL) {\n                break;\n            }\n\n            fprintf(stdout, \"\\nVerifying, please re-enter. %s\", prompt);\n            fflush(stdout);\n            if (! fgets(key_string, len, stdin)) {\n                explicit_bzero(key_string, len);\n                SAFE_FREE(key_string);\n                clearerr(stdin);\n                continue;\n            }\n            if ((ptr = strchr(key_string, '\\n'))) {\n                *ptr = '\\0';\n            }\n            fprintf(stdout, \"\\n\");\n            if (strcmp(buf, key_string)) {\n                printf(\"\\n\\07\\07Mismatch - try again\\n\");\n                explicit_bzero(key_string, len);\n                SAFE_FREE(key_string);\n                fflush(stdout);\n                continue;\n            }\n            explicit_bzero(key_string, len);\n            SAFE_FREE(key_string);\n        }\n        ok = 1;\n    }\n    explicit_bzero(tmp, len);\n    free(tmp);\n\n    return ok;\n}\n\n#ifdef _WIN32\n#include <windows.h>\n\nint ssh_getpass(const char *prompt,\n                char *buf,\n                size_t len,\n                int echo,\n                int verify) {\n    HANDLE h;\n    DWORD mode = 0;\n    int ok;\n\n    /* fgets needs at least len - 1 */\n    if (prompt == NULL || buf == NULL || len < 2) {\n        return -1;\n    }\n\n    /* get stdin and mode */\n    h = GetStdHandle(STD_INPUT_HANDLE);\n    if (!GetConsoleMode(h, &mode)) {\n        return -1;\n    }\n\n    /* disable echo */\n    if (!echo) {\n        if (!SetConsoleMode(h, mode & ~ENABLE_ECHO_INPUT)) {\n            return -1;\n        }\n    }\n\n    ok = ssh_gets(prompt, buf, len, verify);\n\n    /* reset echo */\n    SetConsoleMode(h, mode);\n\n    if (!ok) {\n        explicit_bzero(buf, len);\n        return -1;\n    }\n\n    /* force termination */\n    buf[len - 1] = '\\0';\n\n    return 0;\n}\n\n#else\n\n#include <fcntl.h>\n#ifdef HAVE_TERMIOS_H\n#include <termios.h>\n#endif\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n\n/**\n * @ingroup libssh_misc\n *\n * @brief Get a password from the console.\n *\n * You should make sure that the buffer is an empty string!\n *\n * You can also use this function to ask for a username. Then you can fill the\n * buffer with the username and it is shows to the users. If the users just\n * presses enter the buffer will be untouched.\n *\n * @code\n *   char username[128];\n *\n *   snprintf(username, sizeof(username), \"john\");\n *\n *   ssh_getpass(\"Username:\", username, sizeof(username), 1, 0);\n * @endcode\n *\n * The prompt will look like this:\n *\n *   Username: [john]\n *\n * If you press enter then john is used as the username, or you can type it in\n * to change it.\n *\n * @param[in]  prompt   The prompt to show to ask for the password.\n *\n * @param[out] buf    The buffer the password should be stored. It NEEDS to be\n *                      empty or filled out.\n *\n * @param[in]  len      The length of the buffer.\n *\n * @param[in]  echo     Should we echo what you type.\n *\n * @param[in]  verify   Should we ask for the password twice.\n *\n * @return              0 on success, -1 on error.\n */\nint ssh_getpass(const char *prompt,\n                char *buf,\n                size_t len,\n                int echo,\n                int verify) {\n    struct termios attr;\n    struct termios old_attr;\n    int ok = 0;\n    int fd = -1;\n\n    /* fgets needs at least len - 1 */\n    if (prompt == NULL || buf == NULL || len < 2) {\n        return -1;\n    }\n\n    if (isatty(STDIN_FILENO)) {\n        ZERO_STRUCT(attr);\n        ZERO_STRUCT(old_attr);\n\n        /* get local terminal attributes */\n        if (tcgetattr(STDIN_FILENO, &attr) < 0) {\n            perror(\"tcgetattr\");\n            return -1;\n        }\n\n        /* save terminal attributes */\n        memcpy(&old_attr, &attr, sizeof(attr));\n        if((fd = fcntl(0, F_GETFL, 0)) < 0) {\n            perror(\"fcntl\");\n            return -1;\n        }\n\n        /* disable echo */\n        if (!echo) {\n            attr.c_lflag &= ~(ECHO);\n        }\n\n        /* write attributes to terminal */\n        if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &attr) < 0) {\n            perror(\"tcsetattr\");\n            return -1;\n        }\n    }\n\n    /* disable nonblocking I/O */\n    if (fd & O_NDELAY) {\n        fcntl(0, F_SETFL, fd & ~O_NDELAY);\n    }\n\n    ok = ssh_gets(prompt, buf, len, verify);\n\n    if (isatty(STDIN_FILENO)) {\n        /* reset terminal */\n        tcsetattr(STDIN_FILENO, TCSANOW, &old_attr);\n    }\n\n    /* close fd */\n    if (fd & O_NDELAY) {\n        fcntl(0, F_SETFL, fd);\n    }\n\n    if (!ok) {\n        explicit_bzero(buf, len);\n        return -1;\n    }\n\n    /* force termination */\n    buf[len - 1] = '\\0';\n\n    return 0;\n}\n\n#endif\n"
  },
  {
    "path": "src/libssh/src/gssapi.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2013 by Aris Adamantiadis <aris@badcode.be>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n\n#include <gssapi/gssapi.h>\n\n#include <libssh/gssapi.h>\n#include <libssh/libssh.h>\n#include <libssh/ssh2.h>\n#include <libssh/buffer.h>\n#include <libssh/crypto.h>\n#include <libssh/callbacks.h>\n#include <libssh/string.h>\n#include <libssh/server.h>\n\n/** current state of an GSSAPI authentication */\nenum ssh_gssapi_state_e {\n    SSH_GSSAPI_STATE_NONE, /* no status */\n    SSH_GSSAPI_STATE_RCV_TOKEN, /* Expecting a token */\n    SSH_GSSAPI_STATE_RCV_MIC, /* Expecting a MIC */\n};\n\nstruct ssh_gssapi_struct{\n    enum ssh_gssapi_state_e state; /* current state */\n    struct gss_OID_desc_struct mech; /* mechanism being elected for auth */\n    gss_cred_id_t server_creds; /* credentials of server */\n    gss_cred_id_t client_creds; /* creds delegated by the client */\n    gss_ctx_id_t ctx; /* the authentication context */\n    gss_name_t client_name; /* Identity of the client */\n    char *user; /* username of client */\n    char *canonic_user; /* canonic form of the client's username */\n    char *service; /* name of the service */\n    struct {\n        gss_name_t server_name; /* identity of server */\n        OM_uint32 flags; /* flags used for init context */\n        gss_OID oid; /* mech being used for authentication */\n        gss_cred_id_t creds; /* creds used to initialize context */\n        gss_cred_id_t client_deleg_creds; /* delegated creds (const, not freeable) */\n    } client;\n};\n\n\n/** @internal\n * @initializes a gssapi context for authentication\n */\nstatic int ssh_gssapi_init(ssh_session session){\n    if (session->gssapi != NULL)\n        return SSH_OK;\n    session->gssapi = malloc(sizeof(struct ssh_gssapi_struct));\n    if(!session->gssapi){\n        ssh_set_error_oom(session);\n        return SSH_ERROR;\n    }\n    ZERO_STRUCTP(session->gssapi);\n    session->gssapi->server_creds = GSS_C_NO_CREDENTIAL;\n    session->gssapi->client_creds = GSS_C_NO_CREDENTIAL;\n    session->gssapi->ctx = GSS_C_NO_CONTEXT;\n    session->gssapi->state = SSH_GSSAPI_STATE_NONE;\n    return SSH_OK;\n}\n\n/** @internal\n * @frees a gssapi context\n */\nstatic void ssh_gssapi_free(ssh_session session){\n    OM_uint32 min;\n    if (session->gssapi == NULL)\n        return;\n    SAFE_FREE(session->gssapi->user);\n    SAFE_FREE(session->gssapi->mech.elements);\n    gss_release_cred(&min,&session->gssapi->server_creds);\n    if (session->gssapi->client.creds !=\n                    session->gssapi->client.client_deleg_creds) {\n        gss_release_cred(&min, &session->gssapi->client.creds);\n    }\n    SAFE_FREE(session->gssapi);\n}\n\nSSH_PACKET_CALLBACK(ssh_packet_userauth_gssapi_token){\n#ifdef WITH_SERVER\n    if(session->server)\n        return ssh_packet_userauth_gssapi_token_server(session, type, packet, user);\n#endif\n    return ssh_packet_userauth_gssapi_token_client(session, type, packet, user);\n}\n#ifdef WITH_SERVER\n\n/** @internal\n * @brief sends a SSH_MSG_USERAUTH_GSSAPI_RESPONSE packet\n * @param[in] oid the OID that was selected for authentication\n */\nstatic int ssh_gssapi_send_response(ssh_session session, ssh_string oid){\n    if (ssh_buffer_add_u8(session->out_buffer, SSH2_MSG_USERAUTH_GSSAPI_RESPONSE) < 0 ||\n            ssh_buffer_add_ssh_string(session->out_buffer,oid) < 0) {\n        ssh_set_error_oom(session);\n        return SSH_ERROR;\n    }\n    session->auth.state = SSH_AUTH_STATE_GSSAPI_TOKEN;\n\n    ssh_packet_send(session);\n    SSH_LOG(SSH_LOG_PACKET,\n            \"Sent SSH_MSG_USERAUTH_GSSAPI_RESPONSE\");\n    return SSH_OK;\n}\n\n#endif /* WITH_SERVER */\n\nstatic void ssh_gssapi_log_error(int verb,\n                                 const char *msg,\n                                 int maj_stat,\n                                 int min_stat)\n{\n    gss_buffer_desc msg_maj = {\n        .length = 0,\n    };\n    gss_buffer_desc msg_min = {\n        .length = 0,\n    };\n    OM_uint32 dummy_maj, dummy_min;\n    OM_uint32 message_context = 0;\n\n    dummy_maj = gss_display_status(&dummy_min,\n                                   maj_stat,\n                                   GSS_C_GSS_CODE,\n                                   GSS_C_NO_OID,\n                                   &message_context,\n                                   &msg_maj);\n    if (dummy_maj != 0) {\n        goto out;\n    }\n\n    dummy_maj = gss_display_status(&dummy_min,\n                                   min_stat,\n                                   GSS_C_MECH_CODE,\n                                   GSS_C_NO_OID,\n                                   &message_context,\n                                   &msg_min);\n    if (dummy_maj != 0) {\n        goto out;\n    }\n\n    SSH_LOG(verb,\n            \"GSSAPI(%s): %s - %s\",\n            msg,\n            (const char *)msg_maj.value,\n            (const char *)msg_min.value);\n\nout:\n    if (msg_maj.value) {\n        gss_release_buffer(&dummy_min, &msg_maj);\n    }\n    if (msg_min.value) {\n        gss_release_buffer(&dummy_min, &msg_min);\n    }\n}\n\n#ifdef WITH_SERVER\n\n/** @internal\n * @brief handles an user authentication using GSSAPI\n */\nint ssh_gssapi_handle_userauth(ssh_session session, const char *user, uint32_t n_oid, ssh_string *oids){\n    char service_name[]=\"host\";\n    gss_buffer_desc name_buf;\n    gss_name_t server_name; /* local server fqdn */\n    OM_uint32 maj_stat, min_stat;\n    size_t i;\n    char *ptr;\n    gss_OID_set supported; /* oids supported by server */\n    gss_OID_set both_supported; /* oids supported by both client and server */\n    gss_OID_set selected; /* oid selected for authentication */\n    int present=0;\n    size_t oid_count=0;\n    struct gss_OID_desc_struct oid;\n    int rc;\n\n    if (ssh_callbacks_exists(session->server_callbacks, gssapi_select_oid_function)){\n        ssh_string oid_s = session->server_callbacks->gssapi_select_oid_function(session,\n                user, n_oid, oids,\n                session->server_callbacks->userdata);\n        if (oid_s != NULL){\n            if (ssh_gssapi_init(session) == SSH_ERROR)\n                return SSH_ERROR;\n            session->gssapi->state = SSH_GSSAPI_STATE_RCV_TOKEN;\n            rc = ssh_gssapi_send_response(session, oid_s);\n            SSH_STRING_FREE(oid_s);\n            return rc;\n        } else {\n            return ssh_auth_reply_default(session,0);\n        }\n    }\n    gss_create_empty_oid_set(&min_stat, &both_supported);\n\n    maj_stat = gss_indicate_mechs(&min_stat, &supported);\n    if (maj_stat != GSS_S_COMPLETE) {\n        SSH_LOG(SSH_LOG_WARNING, \"indicate mecks %d, %d\", maj_stat, min_stat);\n        ssh_gssapi_log_error(SSH_LOG_WARNING,\n                             \"indicate mechs\",\n                             maj_stat,\n                             min_stat);\n        return SSH_ERROR;\n    }\n\n    for (i=0; i < supported->count; ++i){\n        ptr = ssh_get_hexa(supported->elements[i].elements, supported->elements[i].length);\n        SSH_LOG(SSH_LOG_DEBUG, \"Supported mech %zu: %s\", i, ptr);\n        free(ptr);\n    }\n\n    for (i=0 ; i< n_oid ; ++i){\n        unsigned char *oid_s = (unsigned char *) ssh_string_data(oids[i]);\n        size_t len = ssh_string_len(oids[i]);\n\n        if (oid_s == NULL) {\n            continue;\n        }\n        if(len < 2 || oid_s[0] != SSH_OID_TAG || ((size_t)oid_s[1]) != len - 2){\n            SSH_LOG(SSH_LOG_WARNING,\"GSSAPI: received invalid OID\");\n            continue;\n        }\n        oid.elements = &oid_s[2];\n        oid.length = len - 2;\n        gss_test_oid_set_member(&min_stat,&oid,supported,&present);\n        if(present){\n            gss_add_oid_set_member(&min_stat,&oid,&both_supported);\n            oid_count++;\n        }\n    }\n    gss_release_oid_set(&min_stat, &supported);\n    if (oid_count == 0){\n        SSH_LOG(SSH_LOG_PROTOCOL,\"GSSAPI: no OID match\");\n        ssh_auth_reply_default(session, 0);\n        gss_release_oid_set(&min_stat, &both_supported);\n        return SSH_OK;\n    }\n    /* from now we have room for context */\n    if (ssh_gssapi_init(session) == SSH_ERROR)\n        return SSH_ERROR;\n\n    name_buf.value = service_name;\n    name_buf.length = strlen(name_buf.value) + 1;\n    maj_stat = gss_import_name(&min_stat, &name_buf,\n            (gss_OID) GSS_C_NT_HOSTBASED_SERVICE, &server_name);\n    if (maj_stat != GSS_S_COMPLETE) {\n        SSH_LOG(SSH_LOG_WARNING, \"importing name %d, %d\", maj_stat, min_stat);\n        ssh_gssapi_log_error(SSH_LOG_WARNING,\n                             \"importing name\",\n                             maj_stat,\n                             min_stat);\n        return -1;\n    }\n\n    maj_stat = gss_acquire_cred(&min_stat, server_name, 0,\n            both_supported, GSS_C_ACCEPT,\n            &session->gssapi->server_creds, &selected, NULL);\n    gss_release_name(&min_stat, &server_name);\n    gss_release_oid_set(&min_stat, &both_supported);\n\n    if (maj_stat != GSS_S_COMPLETE) {\n        SSH_LOG(SSH_LOG_WARNING, \"error acquiring credentials %d, %d\", maj_stat, min_stat);\n        ssh_gssapi_log_error(SSH_LOG_WARNING,\n                             \"acquiring creds\",\n                             maj_stat,\n                             min_stat);\n        ssh_auth_reply_default(session,0);\n        return SSH_ERROR;\n    }\n\n    SSH_LOG(SSH_LOG_PROTOCOL, \"acquiring credentials %d, %d\", maj_stat, min_stat);\n\n    /* finding which OID from client we selected */\n    for (i=0 ; i< n_oid ; ++i){\n        unsigned char *oid_s = (unsigned char *) ssh_string_data(oids[i]);\n        size_t len = ssh_string_len(oids[i]);\n\n        if (oid_s == NULL) {\n            continue;\n        }\n        if(len < 2 || oid_s[0] != SSH_OID_TAG || ((size_t)oid_s[1]) != len - 2){\n            SSH_LOG(SSH_LOG_WARNING,\"GSSAPI: received invalid OID\");\n            continue;\n        }\n        oid.elements = &oid_s[2];\n        oid.length = len - 2;\n        gss_test_oid_set_member(&min_stat,&oid,selected,&present);\n        if(present){\n            SSH_LOG(SSH_LOG_PACKET, \"Selected oid %zu\", i);\n            break;\n        }\n    }\n    session->gssapi->mech.length = oid.length;\n    session->gssapi->mech.elements = malloc(oid.length);\n    if (session->gssapi->mech.elements == NULL){\n        ssh_set_error_oom(session);\n        return SSH_ERROR;\n    }\n    memcpy(session->gssapi->mech.elements, oid.elements, oid.length);\n    gss_release_oid_set(&min_stat, &selected);\n    session->gssapi->user = strdup(user);\n    session->gssapi->service = service_name;\n    session->gssapi->state = SSH_GSSAPI_STATE_RCV_TOKEN;\n    return ssh_gssapi_send_response(session, oids[i]);\n}\n\nstatic char *ssh_gssapi_name_to_char(gss_name_t name){\n    gss_buffer_desc buffer;\n    OM_uint32 maj_stat, min_stat;\n    char *ptr;\n    maj_stat = gss_display_name(&min_stat, name, &buffer, NULL);\n    ssh_gssapi_log_error(SSH_LOG_WARNING,\n                         \"converting name\",\n                         maj_stat,\n                         min_stat);\n    ptr = malloc(buffer.length + 1);\n    if (ptr == NULL) {\n        return NULL;\n    }\n    memcpy(ptr, buffer.value, buffer.length);\n    ptr[buffer.length] = '\\0';\n    gss_release_buffer(&min_stat, &buffer);\n    return ptr;\n\n}\n\nSSH_PACKET_CALLBACK(ssh_packet_userauth_gssapi_token_server){\n    ssh_string token;\n    char *hexa;\n    OM_uint32 maj_stat, min_stat;\n    gss_buffer_desc input_token, output_token = GSS_C_EMPTY_BUFFER;\n    gss_name_t client_name = GSS_C_NO_NAME;\n    OM_uint32 ret_flags=0;\n    gss_channel_bindings_t input_bindings=GSS_C_NO_CHANNEL_BINDINGS;\n    int rc;\n\n    (void)user;\n    (void)type;\n\n    SSH_LOG(SSH_LOG_PACKET,\"Received SSH_MSG_USERAUTH_GSSAPI_TOKEN\");\n    if (!session->gssapi || session->gssapi->state != SSH_GSSAPI_STATE_RCV_TOKEN){\n        ssh_set_error(session, SSH_FATAL, \"Received SSH_MSG_USERAUTH_GSSAPI_TOKEN in invalid state\");\n        return SSH_PACKET_USED;\n    }\n    token = ssh_buffer_get_ssh_string(packet);\n\n    if (token == NULL){\n        ssh_set_error(session, SSH_REQUEST_DENIED, \"ssh_packet_userauth_gssapi_token: invalid packet\");\n        return SSH_PACKET_USED;\n    }\n\n    if (ssh_callbacks_exists(session->server_callbacks, gssapi_accept_sec_ctx_function)){\n        ssh_string out_token=NULL;\n        rc = session->server_callbacks->gssapi_accept_sec_ctx_function(session,\n                token, &out_token, session->server_callbacks->userdata);\n        if (rc == SSH_ERROR){\n            ssh_auth_reply_default(session, 0);\n            ssh_gssapi_free(session);\n            session->gssapi=NULL;\n            return SSH_PACKET_USED;\n        }\n        if (ssh_string_len(out_token) != 0){\n            rc = ssh_buffer_pack(session->out_buffer,\n                                 \"bS\",\n                                 SSH2_MSG_USERAUTH_GSSAPI_TOKEN,\n                                 out_token);\n            if (rc != SSH_OK) {\n                ssh_set_error_oom(session);\n                return SSH_PACKET_USED;\n            }\n            ssh_packet_send(session);\n            SSH_STRING_FREE(out_token);\n        } else {\n            session->gssapi->state = SSH_GSSAPI_STATE_RCV_MIC;\n        }\n        return SSH_PACKET_USED;\n    }\n    hexa = ssh_get_hexa(ssh_string_data(token),ssh_string_len(token));\n    SSH_LOG(SSH_LOG_PACKET, \"GSSAPI Token : %s\",hexa);\n    SAFE_FREE(hexa);\n    input_token.length = ssh_string_len(token);\n    input_token.value = ssh_string_data(token);\n\n    maj_stat = gss_accept_sec_context(&min_stat, &session->gssapi->ctx, session->gssapi->server_creds,\n            &input_token, input_bindings, &client_name, NULL /*mech_oid*/, &output_token, &ret_flags,\n            NULL /*time*/, &session->gssapi->client_creds);\n    ssh_gssapi_log_error(SSH_LOG_PROTOCOL,\n                         \"accepting token\",\n                         maj_stat,\n                         min_stat);\n    SSH_STRING_FREE(token);\n    if (client_name != GSS_C_NO_NAME){\n        session->gssapi->client_name = client_name;\n        session->gssapi->canonic_user = ssh_gssapi_name_to_char(client_name);\n    }\n    if (GSS_ERROR(maj_stat)){\n        ssh_gssapi_log_error(SSH_LOG_WARNING,\n                             \"Gssapi error\",\n                             maj_stat,\n                             min_stat);\n        ssh_auth_reply_default(session,0);\n        ssh_gssapi_free(session);\n        session->gssapi=NULL;\n        return SSH_PACKET_USED;\n    }\n\n    if (output_token.length != 0){\n        hexa = ssh_get_hexa(output_token.value, output_token.length);\n        SSH_LOG(SSH_LOG_PACKET, \"GSSAPI: sending token %s\",hexa);\n        SAFE_FREE(hexa);\n        ssh_buffer_pack(session->out_buffer,\n                        \"bdP\",\n                        SSH2_MSG_USERAUTH_GSSAPI_TOKEN,\n                        output_token.length,\n                        (size_t)output_token.length, output_token.value);\n        ssh_packet_send(session);\n    }\n    if(maj_stat == GSS_S_COMPLETE){\n        session->gssapi->state = SSH_GSSAPI_STATE_RCV_MIC;\n    }\n    return SSH_PACKET_USED;\n}\n\n#endif /* WITH_SERVER */\n\nstatic ssh_buffer ssh_gssapi_build_mic(ssh_session session)\n{\n    struct ssh_crypto_struct *crypto = NULL;\n    ssh_buffer mic_buffer = NULL;\n    int rc;\n\n    crypto = ssh_packet_get_current_crypto(session, SSH_DIRECTION_BOTH);\n    if (crypto == NULL) {\n        return NULL;\n    }\n\n    mic_buffer = ssh_buffer_new();\n    if (mic_buffer == NULL) {\n        ssh_set_error_oom(session);\n        return NULL;\n    }\n\n    rc = ssh_buffer_pack(mic_buffer,\n                         \"dPbsss\",\n                         crypto->digest_len,\n                         (size_t)crypto->digest_len, crypto->session_id,\n                         SSH2_MSG_USERAUTH_REQUEST,\n                         session->gssapi->user,\n                         \"ssh-connection\",\n                         \"gssapi-with-mic\");\n    if (rc != SSH_OK) {\n        ssh_set_error_oom(session);\n        SSH_BUFFER_FREE(mic_buffer);\n        return NULL;\n    }\n\n    return mic_buffer;\n}\n\n#ifdef WITH_SERVER\n\nSSH_PACKET_CALLBACK(ssh_packet_userauth_gssapi_mic)\n{\n    ssh_string mic_token;\n    OM_uint32 maj_stat, min_stat;\n    gss_buffer_desc mic_buf = GSS_C_EMPTY_BUFFER;\n    gss_buffer_desc mic_token_buf = GSS_C_EMPTY_BUFFER;\n    ssh_buffer mic_buffer = NULL;\n\n    (void)user;\n    (void)type;\n\n    SSH_LOG(SSH_LOG_PACKET,\"Received SSH_MSG_USERAUTH_GSSAPI_MIC\");\n    mic_token = ssh_buffer_get_ssh_string(packet);\n    if (mic_token == NULL) {\n        ssh_set_error(session, SSH_FATAL, \"Missing MIC in packet\");\n        goto error;\n    }\n    if (session->gssapi == NULL\n        || session->gssapi->state != SSH_GSSAPI_STATE_RCV_MIC) {\n        ssh_set_error(session, SSH_FATAL, \"Received SSH_MSG_USERAUTH_GSSAPI_MIC in invalid state\");\n        goto error;\n    }\n\n    mic_buffer = ssh_gssapi_build_mic(session);\n    if (mic_buffer == NULL) {\n        ssh_set_error_oom(session);\n        goto error;\n    }\n    if (ssh_callbacks_exists(session->server_callbacks, gssapi_verify_mic_function)){\n        int rc = session->server_callbacks->gssapi_verify_mic_function(session, mic_token,\n                ssh_buffer_get(mic_buffer), ssh_buffer_get_len(mic_buffer),\n                session->server_callbacks->userdata);\n        if (rc != SSH_OK) {\n            goto error;\n        }\n    } else {\n        mic_buf.length = ssh_buffer_get_len(mic_buffer);\n        mic_buf.value = ssh_buffer_get(mic_buffer);\n        mic_token_buf.length = ssh_string_len(mic_token);\n        mic_token_buf.value = ssh_string_data(mic_token);\n\n        maj_stat = gss_verify_mic(&min_stat, session->gssapi->ctx, &mic_buf, &mic_token_buf, NULL);\n        ssh_gssapi_log_error(SSH_LOG_PROTOCOL,\n                             \"verifying MIC\",\n                             maj_stat,\n                             min_stat);\n        if (maj_stat == GSS_S_DEFECTIVE_TOKEN || GSS_ERROR(maj_stat)) {\n            goto error;\n        }\n    }\n\n    if (ssh_callbacks_exists(session->server_callbacks, auth_gssapi_mic_function)){\n        switch(session->server_callbacks->auth_gssapi_mic_function(session,\n                    session->gssapi->user, session->gssapi->canonic_user,\n                    session->server_callbacks->userdata)){\n            case SSH_AUTH_SUCCESS:\n                ssh_auth_reply_success(session, 0);\n                break;\n            case SSH_AUTH_PARTIAL:\n                ssh_auth_reply_success(session, 1);\n                break;\n            default:\n                ssh_auth_reply_default(session, 0);\n                break;\n        }\n    }\n\n    goto end;\n\nerror:\n    ssh_auth_reply_default(session,0);\n\nend:\n    ssh_gssapi_free(session);\n    if (mic_buffer != NULL) {\n        SSH_BUFFER_FREE(mic_buffer);\n    }\n    if (mic_token != NULL) {\n        SSH_STRING_FREE(mic_token);\n    }\n\n    return SSH_PACKET_USED;\n}\n\n/** @brief returns the client credentials of the connected client.\n * If the client has given a forwardable token, the SSH server will\n * retrieve it.\n * @returns gssapi credentials handle.\n * @returns NULL if no forwardable token is available.\n */\nssh_gssapi_creds ssh_gssapi_get_creds(ssh_session session){\n    if (!session || !session->gssapi || session->gssapi->client_creds == GSS_C_NO_CREDENTIAL)\n        return NULL;\n    return (ssh_gssapi_creds)session->gssapi->client_creds;\n}\n\n#endif /* SERVER */\n\n/**\n * @brief Set the forwadable ticket to be given to the server for authentication.\n * Unlike ssh_gssapi_get_creds() this is called on the client side of an ssh\n * connection.\n *\n * @param[in] creds gssapi credentials handle.\n */\nvoid ssh_gssapi_set_creds(ssh_session session, const ssh_gssapi_creds creds)\n{\n    if (session == NULL) {\n        return;\n    }\n    if (session->gssapi == NULL) {\n        ssh_gssapi_init(session);\n        if (session->gssapi == NULL) {\n            return;\n        }\n    }\n\n    session->gssapi->client.client_deleg_creds = (gss_cred_id_t)creds;\n}\n\nstatic int ssh_gssapi_send_auth_mic(ssh_session session, ssh_string *oid_set, int n_oid){\n    int rc;\n    int i;\n\n    rc = ssh_buffer_pack(session->out_buffer,\n                         \"bsssd\",\n                         SSH2_MSG_USERAUTH_REQUEST,\n                         session->opts.username,\n                         \"ssh-connection\",\n                         \"gssapi-with-mic\",\n                         n_oid);\n\n    if (rc != SSH_OK) {\n        ssh_set_error_oom(session);\n        goto fail;\n    }\n\n    for (i=0; i<n_oid; ++i){\n        rc = ssh_buffer_add_ssh_string(session->out_buffer, oid_set[i]);\n        if (rc < 0) {\n            goto fail;\n        }\n    }\n\n    session->auth.state = SSH_AUTH_STATE_GSSAPI_REQUEST_SENT;\n    return ssh_packet_send(session);\nfail:\n    ssh_buffer_reinit(session->out_buffer);\n    return SSH_ERROR;\n}\n\n/** @brief returns the OIDs of the mechs that have usable credentials\n */\nstatic int ssh_gssapi_match(ssh_session session, gss_OID_set *valid_oids)\n{\n    OM_uint32 maj_stat, min_stat, lifetime;\n    gss_OID_set actual_mechs;\n    gss_buffer_desc namebuf;\n    gss_name_t client_id = GSS_C_NO_NAME;\n    gss_OID oid;\n    unsigned int i;\n    char *ptr;\n    int ret;\n\n    if (session->gssapi->client.client_deleg_creds == NULL) {\n        if (session->opts.gss_client_identity != NULL) {\n            namebuf.value = (void *)session->opts.gss_client_identity;\n            namebuf.length = strlen(session->opts.gss_client_identity);\n\n            maj_stat = gss_import_name(&min_stat, &namebuf,\n                                       GSS_C_NT_USER_NAME, &client_id);\n            if (GSS_ERROR(maj_stat)) {\n                ret = SSH_ERROR;\n                goto end;\n            }\n        }\n\n        maj_stat = gss_acquire_cred(&min_stat, client_id, GSS_C_INDEFINITE,\n                                    GSS_C_NO_OID_SET, GSS_C_INITIATE,\n                                    &session->gssapi->client.creds,\n                                    &actual_mechs, NULL);\n        if (GSS_ERROR(maj_stat)) {\n            ret = SSH_ERROR;\n            goto end;\n        }\n    } else {\n        session->gssapi->client.creds =\n                                    session->gssapi->client.client_deleg_creds;\n\n        maj_stat = gss_inquire_cred(&min_stat, session->gssapi->client.creds,\n                                    &client_id, NULL, NULL, &actual_mechs);\n        if (GSS_ERROR(maj_stat)) {\n            ret = SSH_ERROR;\n            goto end;\n        }\n    }\n\n    gss_create_empty_oid_set(&min_stat, valid_oids);\n\n    /* double check each single cred */\n    for (i = 0; i < actual_mechs->count; i++) {\n        /* check lifetime is not 0 or skip */\n        lifetime = 0;\n        oid = &actual_mechs->elements[i];\n        maj_stat = gss_inquire_cred_by_mech(&min_stat,\n                                            session->gssapi->client.creds,\n                                            oid, NULL, &lifetime, NULL, NULL);\n        if (maj_stat == GSS_S_COMPLETE && lifetime > 0) {\n            gss_add_oid_set_member(&min_stat, oid, valid_oids);\n            ptr = ssh_get_hexa(oid->elements, oid->length);\n            SSH_LOG(SSH_LOG_DEBUG, \"GSSAPI valid oid %d : %s\", i, ptr);\n            SAFE_FREE(ptr);\n        }\n    }\n\n    ret = SSH_OK;\n\nend:\n    gss_release_name(&min_stat, &client_id);\n    return ret;\n}\n\n/**\n * @brief launches a gssapi-with-mic auth request\n * @returns SSH_AUTH_ERROR:   A serious error happened\\n\n *          SSH_AUTH_DENIED:  Authentication failed : use another method\\n\n *          SSH_AUTH_AGAIN:   In nonblocking mode, you've got to call this again\n *                            later.\n */\nint ssh_gssapi_auth_mic(ssh_session session){\n    size_t i;\n    gss_OID_set selected; /* oid selected for authentication */\n    ssh_string *oids = NULL;\n    int rc;\n    size_t n_oids = 0;\n    OM_uint32 maj_stat, min_stat;\n    char name_buf[256] = {0};\n    gss_buffer_desc hostname;\n    const char *gss_host = session->opts.host;\n\n    rc = ssh_gssapi_init(session);\n    if (rc == SSH_ERROR) {\n        return SSH_AUTH_ERROR;\n    }\n\n    if (session->opts.gss_server_identity != NULL) {\n        gss_host = session->opts.gss_server_identity;\n    }\n    /* import target host name */\n    snprintf(name_buf, sizeof(name_buf), \"host@%s\", gss_host);\n\n    hostname.value = name_buf;\n    hostname.length = strlen(name_buf) + 1;\n    maj_stat = gss_import_name(&min_stat, &hostname,\n                               (gss_OID)GSS_C_NT_HOSTBASED_SERVICE,\n                               &session->gssapi->client.server_name);\n    if (maj_stat != GSS_S_COMPLETE) {\n        SSH_LOG(SSH_LOG_WARNING, \"importing name %d, %d\", maj_stat, min_stat);\n        ssh_gssapi_log_error(SSH_LOG_WARNING,\n                             \"importing name\",\n                             maj_stat,\n                             min_stat);\n        return SSH_AUTH_DENIED;\n    }\n\n    /* copy username */\n    session->gssapi->user = strdup(session->opts.username);\n    if (session->gssapi->user == NULL) {\n        ssh_set_error_oom(session);\n        return SSH_AUTH_ERROR;\n    }\n\n    SSH_LOG(SSH_LOG_PROTOCOL, \"Authenticating with gssapi to host %s with user %s\",\n            session->opts.host, session->gssapi->user);\n    rc = ssh_gssapi_match(session, &selected);\n    if (rc == SSH_ERROR) {\n        return SSH_AUTH_DENIED;\n    }\n\n    n_oids = selected->count;\n    SSH_LOG(SSH_LOG_PROTOCOL, \"Sending %zu oids\", n_oids);\n\n    oids = calloc(n_oids, sizeof(ssh_string));\n    if (oids == NULL) {\n        ssh_set_error_oom(session);\n        return SSH_AUTH_ERROR;\n    }\n\n    for (i=0; i<n_oids; ++i){\n        oids[i] = ssh_string_new(selected->elements[i].length + 2);\n        if (oids[i] == NULL) {\n            ssh_set_error_oom(session);\n            rc = SSH_ERROR;\n            goto out;\n        }\n        ((unsigned char *)oids[i]->data)[0] = SSH_OID_TAG;\n        ((unsigned char *)oids[i]->data)[1] = selected->elements[i].length;\n        memcpy((unsigned char *)oids[i]->data + 2, selected->elements[i].elements,\n                selected->elements[i].length);\n    }\n\n    rc = ssh_gssapi_send_auth_mic(session, oids, n_oids);\n\nout:\n    for (i = 0; i < n_oids; i++) {\n        SSH_STRING_FREE(oids[i]);\n    }\n    free(oids);\n    if (rc != SSH_ERROR) {\n        return SSH_AUTH_AGAIN;\n    }\n\n    return SSH_AUTH_ERROR;\n}\n\nstatic gss_OID ssh_gssapi_oid_from_string(ssh_string oid_s)\n{\n    gss_OID ret = NULL;\n    unsigned char *data = ssh_string_data(oid_s);\n    size_t len = ssh_string_len(oid_s);\n\n    if (data == NULL) {\n        return NULL;\n    }\n\n    if (len > 256 || len <= 2) {\n        SAFE_FREE(ret);\n        return NULL;\n    }\n\n    if (data[0] != SSH_OID_TAG || data[1] != len - 2) {\n        SAFE_FREE(ret);\n        return NULL;\n    }\n\n    ret = malloc(sizeof(gss_OID_desc));\n    if (ret == NULL) {\n        return NULL;\n    }\n\n    ret->elements = malloc(len - 2);\n    if (ret->elements == NULL) {\n        SAFE_FREE(ret);\n        return NULL;\n    }\n    memcpy(ret->elements, &data[2], len-2);\n    ret->length = len-2;\n\n    return ret;\n}\n\nSSH_PACKET_CALLBACK(ssh_packet_userauth_gssapi_response){\n    ssh_string oid_s;\n    gss_uint32 maj_stat, min_stat;\n    gss_buffer_desc input_token = GSS_C_EMPTY_BUFFER;\n    gss_buffer_desc output_token = GSS_C_EMPTY_BUFFER;\n    char *hexa;\n    (void)type;\n    (void)user;\n\n    SSH_LOG(SSH_LOG_PACKET, \"Received SSH_USERAUTH_GSSAPI_RESPONSE\");\n    if (session->auth.state != SSH_AUTH_STATE_GSSAPI_REQUEST_SENT){\n        ssh_set_error(session, SSH_FATAL, \"Invalid state in ssh_packet_userauth_gssapi_response\");\n        goto error;\n    }\n\n    oid_s = ssh_buffer_get_ssh_string(packet);\n    if (!oid_s){\n        ssh_set_error(session, SSH_FATAL, \"Missing OID\");\n        goto error;\n    }\n    session->gssapi->client.oid = ssh_gssapi_oid_from_string(oid_s);\n    SSH_STRING_FREE(oid_s);\n    if (!session->gssapi->client.oid) {\n        ssh_set_error(session, SSH_FATAL, \"Invalid OID\");\n        goto error;\n    }\n\n    session->gssapi->client.flags = GSS_C_MUTUAL_FLAG | GSS_C_INTEG_FLAG;\n    if (session->opts.gss_delegate_creds) {\n        session->gssapi->client.flags |= GSS_C_DELEG_FLAG;\n    }\n\n    /* prepare the first TOKEN response */\n    maj_stat = gss_init_sec_context(&min_stat,\n                                    session->gssapi->client.creds,\n                                    &session->gssapi->ctx,\n                                    session->gssapi->client.server_name,\n                                    session->gssapi->client.oid,\n                                    session->gssapi->client.flags,\n                                    0, NULL, &input_token, NULL,\n                                    &output_token, NULL, NULL);\n    if(GSS_ERROR(maj_stat)){\n        ssh_gssapi_log_error(SSH_LOG_WARNING,\n                             \"Initializing gssapi context\",\n                             maj_stat,\n                             min_stat);\n        goto error;\n    }\n    if (output_token.length != 0){\n        hexa = ssh_get_hexa(output_token.value, output_token.length);\n        SSH_LOG(SSH_LOG_PACKET, \"GSSAPI: sending token %s\", hexa);\n        SAFE_FREE(hexa);\n        ssh_buffer_pack(session->out_buffer,\n                        \"bdP\",\n                        SSH2_MSG_USERAUTH_GSSAPI_TOKEN,\n                        output_token.length,\n                        (size_t)output_token.length, output_token.value);\n        ssh_packet_send(session);\n        session->auth.state = SSH_AUTH_STATE_GSSAPI_TOKEN;\n    }\n    return SSH_PACKET_USED;\n\nerror:\n    session->auth.state = SSH_AUTH_STATE_ERROR;\n    ssh_gssapi_free(session);\n    session->gssapi = NULL;\n    return SSH_PACKET_USED;\n}\n\nstatic int ssh_gssapi_send_mic(ssh_session session){\n    OM_uint32 maj_stat, min_stat;\n    gss_buffer_desc mic_buf = GSS_C_EMPTY_BUFFER;\n    gss_buffer_desc mic_token_buf = GSS_C_EMPTY_BUFFER;\n    ssh_buffer mic_buffer;\n    int rc;\n\n    SSH_LOG(SSH_LOG_PACKET,\"Sending SSH_MSG_USERAUTH_GSSAPI_MIC\");\n\n    mic_buffer = ssh_gssapi_build_mic(session);\n    if (mic_buffer == NULL) {\n        ssh_set_error_oom(session);\n        return SSH_ERROR;\n    }\n    mic_buf.length = ssh_buffer_get_len(mic_buffer);\n    mic_buf.value = ssh_buffer_get(mic_buffer);\n\n    maj_stat = gss_get_mic(&min_stat,session->gssapi->ctx, GSS_C_QOP_DEFAULT,\n                           &mic_buf, &mic_token_buf);\n    if (GSS_ERROR(maj_stat)){\n        SSH_BUFFER_FREE(mic_buffer);\n        ssh_gssapi_log_error(SSH_LOG_PROTOCOL,\n                             \"generating MIC\",\n                             maj_stat,\n                             min_stat);\n        return SSH_ERROR;\n    }\n\n    rc = ssh_buffer_pack(session->out_buffer,\n                         \"bdP\",\n                         SSH2_MSG_USERAUTH_GSSAPI_MIC,\n                         mic_token_buf.length,\n                         (size_t)mic_token_buf.length, mic_token_buf.value);\n    if (rc != SSH_OK) {\n        SSH_BUFFER_FREE(mic_buffer);\n        ssh_set_error_oom(session);\n        return SSH_ERROR;\n    }\n\n    return ssh_packet_send(session);\n}\n\nSSH_PACKET_CALLBACK(ssh_packet_userauth_gssapi_token_client){\n    ssh_string token;\n    char *hexa;\n    OM_uint32 maj_stat, min_stat;\n    gss_buffer_desc input_token, output_token = GSS_C_EMPTY_BUFFER;\n    (void)user;\n    (void)type;\n\n    SSH_LOG(SSH_LOG_PACKET,\"Received SSH_MSG_USERAUTH_GSSAPI_TOKEN\");\n    if (!session->gssapi || session->auth.state != SSH_AUTH_STATE_GSSAPI_TOKEN) {\n        ssh_set_error(session, SSH_FATAL,\n                      \"Received SSH_MSG_USERAUTH_GSSAPI_TOKEN in invalid state\");\n        goto error;\n    }\n    token = ssh_buffer_get_ssh_string(packet);\n\n    if (token == NULL){\n        ssh_set_error(session, SSH_REQUEST_DENIED,\n                      \"ssh_packet_userauth_gssapi_token: invalid packet\");\n        goto error;\n    }\n\n    hexa = ssh_get_hexa(ssh_string_data(token),ssh_string_len(token));\n    SSH_LOG(SSH_LOG_PACKET, \"GSSAPI Token : %s\",hexa);\n    SAFE_FREE(hexa);\n    input_token.length = ssh_string_len(token);\n    input_token.value = ssh_string_data(token);\n    maj_stat = gss_init_sec_context(&min_stat,\n                                    session->gssapi->client.creds,\n                                    &session->gssapi->ctx,\n                                    session->gssapi->client.server_name,\n                                    session->gssapi->client.oid,\n                                    session->gssapi->client.flags,\n                                    0, NULL, &input_token, NULL,\n                                    &output_token, NULL, NULL);\n\n    ssh_gssapi_log_error(SSH_LOG_PROTOCOL,\n                         \"accepting token\",\n                         maj_stat,\n                         min_stat);\n    SSH_STRING_FREE(token);\n    if (GSS_ERROR(maj_stat)){\n        ssh_gssapi_log_error(SSH_LOG_PROTOCOL,\n                             \"Gssapi error\",\n                             maj_stat,\n                             min_stat);\n        goto error;\n    }\n\n    if (output_token.length != 0) {\n        hexa = ssh_get_hexa(output_token.value, output_token.length);\n        SSH_LOG(SSH_LOG_PACKET, \"GSSAPI: sending token %s\",hexa);\n        SAFE_FREE(hexa);\n        ssh_buffer_pack(session->out_buffer,\n                        \"bdP\",\n                        SSH2_MSG_USERAUTH_GSSAPI_TOKEN,\n                        output_token.length,\n                        (size_t)output_token.length, output_token.value);\n        ssh_packet_send(session);\n    }\n\n    if (maj_stat == GSS_S_COMPLETE) {\n        ssh_gssapi_send_mic(session);\n        session->auth.state = SSH_AUTH_STATE_GSSAPI_MIC_SENT;\n    }\n\n    return SSH_PACKET_USED;\n\nerror:\n    session->auth.state = SSH_AUTH_STATE_ERROR;\n    ssh_gssapi_free(session);\n    session->gssapi = NULL;\n    return SSH_PACKET_USED;\n}\n"
  },
  {
    "path": "src/libssh/src/gzip.c",
    "content": "/*\n * gzip.c - hooks for compression of packets\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2003      by Aris Adamantiadis\n * Copyright (c) 2009      by Andreas Schneider <asn@cryptomilk.org>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <string.h>\n#include <stdlib.h>\n#include <zlib.h>\n\n#include \"libssh/priv.h\"\n#include \"libssh/buffer.h\"\n#include \"libssh/crypto.h\"\n#include \"libssh/session.h\"\n\n#define BLOCKSIZE 4092\n\nstatic z_stream *initcompress(ssh_session session, int level) {\n  z_stream *stream = NULL;\n  int status;\n\n  stream = calloc(1, sizeof(z_stream));\n  if (stream == NULL) {\n    return NULL;\n  }\n\n  status = deflateInit(stream, level);\n  if (status != Z_OK) {\n    SAFE_FREE(stream);\n    ssh_set_error(session, SSH_FATAL,\n        \"status %d inititalising zlib deflate\", status);\n    return NULL;\n  }\n\n  return stream;\n}\n\nstatic ssh_buffer gzip_compress(ssh_session session, ssh_buffer source, int level)\n{\n  struct ssh_crypto_struct *crypto = NULL;\n  z_stream *zout = NULL;\n  void *in_ptr = ssh_buffer_get(source);\n  unsigned long in_size = ssh_buffer_get_len(source);\n  ssh_buffer dest = NULL;\n  unsigned char out_buf[BLOCKSIZE] = {0};\n  unsigned long len;\n  int status;\n\n  crypto = ssh_packet_get_current_crypto(session, SSH_DIRECTION_OUT);\n  if (crypto == NULL) {\n      return NULL;\n  }\n  zout = crypto->compress_out_ctx;\n  if (zout == NULL) {\n    zout = crypto->compress_out_ctx = initcompress(session, level);\n    if (zout == NULL) {\n      return NULL;\n    }\n  }\n\n  dest = ssh_buffer_new();\n  if (dest == NULL) {\n    return NULL;\n  }\n\n  zout->next_out = out_buf;\n  zout->next_in = in_ptr;\n  zout->avail_in = in_size;\n  do {\n    zout->avail_out = BLOCKSIZE;\n    status = deflate(zout, Z_PARTIAL_FLUSH);\n    if (status != Z_OK) {\n      SSH_BUFFER_FREE(dest);\n      ssh_set_error(session, SSH_FATAL,\n          \"status %d deflating zlib packet\", status);\n      return NULL;\n    }\n    len = BLOCKSIZE - zout->avail_out;\n    if (ssh_buffer_add_data(dest, out_buf, len) < 0) {\n      SSH_BUFFER_FREE(dest);\n      return NULL;\n    }\n    zout->next_out = out_buf;\n  } while (zout->avail_out == 0);\n\n  return dest;\n}\n\nint compress_buffer(ssh_session session, ssh_buffer buf) {\n  ssh_buffer dest = NULL;\n\n  dest = gzip_compress(session, buf, session->opts.compressionlevel);\n  if (dest == NULL) {\n    return -1;\n  }\n\n  if (ssh_buffer_reinit(buf) < 0) {\n    SSH_BUFFER_FREE(dest);\n    return -1;\n  }\n\n  if (ssh_buffer_add_data(buf, ssh_buffer_get(dest), ssh_buffer_get_len(dest)) < 0) {\n    SSH_BUFFER_FREE(dest);\n    return -1;\n  }\n\n  SSH_BUFFER_FREE(dest);\n  return 0;\n}\n\n/* decompression */\n\nstatic z_stream *initdecompress(ssh_session session) {\n  z_stream *stream = NULL;\n  int status;\n\n  stream = calloc(1, sizeof(z_stream));\n  if (stream == NULL) {\n    return NULL;\n  }\n\n  status = inflateInit(stream);\n  if (status != Z_OK) {\n    SAFE_FREE(stream);\n    ssh_set_error(session, SSH_FATAL,\n        \"Status = %d initiating inflate context!\", status);\n    return NULL;\n  }\n\n  return stream;\n}\n\nstatic ssh_buffer gzip_decompress(ssh_session session, ssh_buffer source, size_t maxlen)\n{\n  struct ssh_crypto_struct *crypto = NULL;\n  z_stream *zin = NULL;\n  void *in_ptr = ssh_buffer_get(source);\n  unsigned long in_size = ssh_buffer_get_len(source);\n  unsigned char out_buf[BLOCKSIZE] = {0};\n  ssh_buffer dest = NULL;\n  unsigned long len;\n  int status;\n\n  crypto = ssh_packet_get_current_crypto(session, SSH_DIRECTION_IN);\n  if (crypto == NULL) {\n      return NULL;\n  }\n\n  zin = crypto->compress_in_ctx;\n  if (zin == NULL) {\n    zin = crypto->compress_in_ctx = initdecompress(session);\n    if (zin == NULL) {\n      return NULL;\n    }\n  }\n\n  dest = ssh_buffer_new();\n  if (dest == NULL) {\n    return NULL;\n  }\n\n  zin->next_out = out_buf;\n  zin->next_in = in_ptr;\n  zin->avail_in = in_size;\n\n  do {\n    zin->avail_out = BLOCKSIZE;\n    status = inflate(zin, Z_PARTIAL_FLUSH);\n    if (status != Z_OK && status != Z_BUF_ERROR) {\n      ssh_set_error(session, SSH_FATAL,\n          \"status %d inflating zlib packet\", status);\n      SSH_BUFFER_FREE(dest);\n      return NULL;\n    }\n\n    len = BLOCKSIZE - zin->avail_out;\n    if (ssh_buffer_add_data(dest,out_buf,len) < 0) {\n      SSH_BUFFER_FREE(dest);\n      return NULL;\n    }\n    if (ssh_buffer_get_len(dest) > maxlen){\n      /* Size of packet exceeded, avoid a denial of service attack */\n      SSH_BUFFER_FREE(dest);\n      return NULL;\n    }\n    zin->next_out = out_buf;\n  } while (zin->avail_out == 0);\n\n  return dest;\n}\n\nint decompress_buffer(ssh_session session,ssh_buffer buf, size_t maxlen){\n  ssh_buffer dest = NULL;\n\n  dest = gzip_decompress(session,buf, maxlen);\n  if (dest == NULL) {\n    return -1;\n  }\n\n  if (ssh_buffer_reinit(buf) < 0) {\n    SSH_BUFFER_FREE(dest);\n    return -1;\n  }\n\n  if (ssh_buffer_add_data(buf, ssh_buffer_get(dest), ssh_buffer_get_len(dest)) < 0) {\n    SSH_BUFFER_FREE(dest);\n    return -1;\n  }\n\n  SSH_BUFFER_FREE(dest);\n  return 0;\n}\n"
  },
  {
    "path": "src/libssh/src/init.c",
    "content": "/*\n * init.c - initialization and finalization of the library\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2003-2009 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n#include \"libssh/priv.h\"\n#include \"libssh/socket.h\"\n#include \"libssh/dh.h\"\n#include \"libssh/poll.h\"\n#include \"libssh/threads.h\"\n\n#ifdef _WIN32\n#include <winsock2.h>\n#endif\n\n#ifdef HAVE_CONSTRUCTOR_ATTRIBUTE\n#define CONSTRUCTOR_ATTRIBUTE __attribute__((constructor))\n#else\n#define CONSTRUCTOR_ATTRIBUTE\n#endif /* HAVE_CONSTRUCTOR_ATTRIBUTE */\n\n#ifdef HAVE_DESTRUCTOR_ATTRIBUTE\n#define DESTRUCTOR_ATTRIBUTE __attribute__((destructor))\n#else\n#define DESTRUCTOR_ATTRIBUTE\n#endif /* HAVE_DESTRUCTOR_ATTRIBUTE */\n\n/* Declare static mutex */\nstatic SSH_MUTEX ssh_init_mutex = SSH_MUTEX_STATIC_INIT;\n\n/* Counter for initializations */\nstatic int _ssh_initialized = 0;\n\n/* Cache the returned value */\nstatic int _ssh_init_ret = 0;\n\nvoid libssh_constructor(void) CONSTRUCTOR_ATTRIBUTE;\nvoid libssh_destructor(void) DESTRUCTOR_ATTRIBUTE;\n\nstatic int _ssh_init(unsigned constructor) {\n\n    int rc = 0;\n\n    if (!constructor) {\n        ssh_mutex_lock(&ssh_init_mutex);\n    }\n\n    _ssh_initialized++;\n\n    if (_ssh_initialized > 1) {\n        rc = _ssh_init_ret;\n        goto _ret;\n    }\n\n    rc = ssh_threads_init();\n    if (rc) {\n        goto _ret;\n    }\n\n    rc = ssh_crypto_init();\n    if (rc) {\n        goto _ret;\n    }\n\n    rc = ssh_dh_init();\n    if (rc) {\n        goto _ret;\n    }\n\n    rc = ssh_socket_init();\n    if (rc) {\n        goto _ret;\n    }\n\n_ret:\n    _ssh_init_ret = rc;\n\n    if (!constructor) {\n        ssh_mutex_unlock(&ssh_init_mutex);\n    }\n\n    return rc;\n}\n\n/**\n * @brief Initialize global cryptographic data structures.\n *\n * This functions is automatically called when the library is loaded.\n *\n */\nvoid libssh_constructor(void)\n{\n\n    int rc;\n\n    rc = _ssh_init(1);\n\n    if (rc < 0) {\n        fprintf(stderr, \"Error in auto_init()\\n\");\n    }\n\n    return;\n}\n\n/**\n * @defgroup libssh The libssh API\n *\n * The libssh library is implementing the SSH protocols and some of its\n * extensions. This group of functions is mostly used to implement an SSH\n * client.\n * Some function are needed to implement an SSH server too.\n *\n * @{\n */\n\n/**\n * @brief Initialize global cryptographic data structures.\n *\n * Since version 0.8.0, when libssh is dynamically linked, it is not necessary\n * to call this function on systems which are fully supported with regards to\n * threading (that is, system with pthreads available).\n *\n * If libssh is statically linked, it is necessary to explicitly call ssh_init()\n * before calling any other provided API, and it is necessary to explicitly call\n * ssh_finalize() to free the allocated resources before exiting.\n *\n * If the library is already initialized, increments the _ssh_initialized\n * counter and return the error code cached in _ssh_init_ret.\n *\n * @returns             SSH_OK on success, SSH_ERROR if an error occurred.\n *\n * @see ssh_finalize()\n */\nint ssh_init(void) {\n    return _ssh_init(0);\n}\n\nstatic int _ssh_finalize(unsigned destructor) {\n\n    if (!destructor) {\n        ssh_mutex_lock(&ssh_init_mutex);\n\n        if (_ssh_initialized > 1) {\n            _ssh_initialized--;\n            goto _ret;\n        }\n\n        if (_ssh_initialized == 1) {\n            if (_ssh_init_ret < 0) {\n                goto _ret;\n            }\n        }\n    }\n\n    /* If the counter reaches zero or it is the destructor calling, finalize */\n    ssh_dh_finalize();\n    ssh_crypto_finalize();\n    ssh_socket_cleanup();\n    /* It is important to finalize threading after CRYPTO because\n     * it still depends on it */\n    ssh_threads_finalize();\n\n    _ssh_initialized = 0;\n\n_ret:\n    if (!destructor) {\n        ssh_mutex_unlock(&ssh_init_mutex);\n    }\n    return 0;\n}\n\n/**\n * @brief Finalize and cleanup all libssh and cryptographic data structures.\n *\n * This function is automatically called when the library is unloaded.\n *\n */\nvoid libssh_destructor(void)\n{\n    int rc;\n\n    rc = _ssh_finalize(1);\n\n    if (rc < 0) {\n        fprintf(stderr, \"Error in libssh_destructor()\\n\");\n    }\n}\n\n/**\n * @brief Finalize and cleanup all libssh and cryptographic data structures.\n *\n * Since version 0.8.0, when libssh is dynamically linked, it is not necessary\n * to call this function, since it is automatically called when the library is\n * unloaded.\n *\n * If libssh is statically linked, it is necessary to explicitly call ssh_init()\n * before calling any other provided API, and it is necessary to explicitly call\n * ssh_finalize() to free the allocated resources before exiting.\n *\n * If ssh_init() is called explicitly, then ssh_finalize() must be called\n * explicitly.\n *\n * When called, decrements the counter _ssh_initialized. If the counter reaches\n * zero, then the libssh and cryptographic data structures are cleaned up.\n *\n * @returns             0 on success, -1 if an error occurred.\n *\n * @see ssh_init()\n */\nint ssh_finalize(void) {\n    return _ssh_finalize(0);\n}\n\n#ifdef _WIN32\n\n#if defined(_MSC_VER) && !defined(LIBSSH_STATIC)\n/* Library constructor and destructor */\nBOOL WINAPI DllMain(HINSTANCE hinstDLL,\n                    DWORD fdwReason,\n                    LPVOID lpvReserved)\n{\n    int rc = 0;\n\n    switch(fdwReason) {\n    case DLL_PROCESS_ATTACH:\n        rc = _ssh_init(1);\n        if (rc != 0) {\n            fprintf(stderr, \"DllMain: ssh_init failed!\");\n            return FALSE;\n        }\n        break;\n    case DLL_PROCESS_DETACH:\n        _ssh_finalize(1);\n        break;\n    default:\n        break;\n    }\n\n    return TRUE;\n}\n#endif /* _MSC_VER && !LIBSSH_STATIC */\n\n#endif /* _WIN32 */\n\n/**\n * @internal\n * @brief Return whether the library is initialized\n *\n * @returns true if the library is initialized; false otherwise.\n *\n * @see ssh_init()\n */\nbool is_ssh_initialized() {\n\n    bool is_initialized = false;\n\n    ssh_mutex_lock(&ssh_init_mutex);\n    is_initialized = _ssh_initialized > 0;\n    ssh_mutex_unlock(&ssh_init_mutex);\n\n    return is_initialized;\n}\n\n/** @} */\n"
  },
  {
    "path": "src/libssh/src/kdf.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2009 by Aris Adamantiadis\n * Copyrihgt (c) 2018 Red Hat, Inc.\n *\n * This library is free software; you can redistribute it and/or\n * modify it under the terms of the GNU Lesser General Public\n * License as published by the Free Software Foundation; either\n * version 2.1 of the License, or (at your option) any later version.\n *\n * This library is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n * Lesser General Public License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public\n * License along with this library; if not, write to the Free Software\n * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n */\n\n#include \"config.h\"\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <limits.h>\n\n#include \"libssh/priv.h\"\n#include \"libssh/crypto.h\"\n#include \"libssh/buffer.h\"\n#include \"libssh/session.h\"\n#include \"libssh/misc.h\"\n#include \"libssh/dh.h\"\n#include \"libssh/ssh2.h\"\n#include \"libssh/pki.h\"\n#include \"libssh/bignum.h\"\n\n#include \"libssh/string.h\"\n\n\n/* The following implements the SSHKDF for crypto backend that\n * do not have a native implementations */\nstruct ssh_mac_ctx_struct {\n    enum ssh_kdf_digest digest_type;\n    union {\n        SHACTX sha1_ctx;\n        SHA256CTX sha256_ctx;\n        SHA384CTX sha384_ctx;\n        SHA512CTX sha512_ctx;\n    } ctx;\n};\n\nstatic ssh_mac_ctx ssh_mac_ctx_init(enum ssh_kdf_digest type)\n{\n    ssh_mac_ctx ctx = malloc(sizeof(struct ssh_mac_ctx_struct));\n    if (ctx == NULL) {\n        return NULL;\n    }\n\n    ctx->digest_type = type;\n    switch(type){\n    case SSH_KDF_SHA1:\n        ctx->ctx.sha1_ctx = sha1_init();\n        return ctx;\n    case SSH_KDF_SHA256:\n        ctx->ctx.sha256_ctx = sha256_init();\n        return ctx;\n    case SSH_KDF_SHA384:\n        ctx->ctx.sha384_ctx = sha384_init();\n        return ctx;\n    case SSH_KDF_SHA512:\n        ctx->ctx.sha512_ctx = sha512_init();\n        return ctx;\n    default:\n        SAFE_FREE(ctx);\n        return NULL;\n    }\n}\n\nstatic void ssh_mac_update(ssh_mac_ctx ctx, const void *data, size_t len)\n{\n    switch(ctx->digest_type){\n    case SSH_KDF_SHA1:\n        sha1_update(ctx->ctx.sha1_ctx, data, len);\n        break;\n    case SSH_KDF_SHA256:\n        sha256_update(ctx->ctx.sha256_ctx, data, len);\n        break;\n    case SSH_KDF_SHA384:\n        sha384_update(ctx->ctx.sha384_ctx, data, len);\n        break;\n    case SSH_KDF_SHA512:\n        sha512_update(ctx->ctx.sha512_ctx, data, len);\n        break;\n    }\n}\n\nstatic void ssh_mac_final(unsigned char *md, ssh_mac_ctx ctx)\n{\n    switch(ctx->digest_type){\n    case SSH_KDF_SHA1:\n        sha1_final(md,ctx->ctx.sha1_ctx);\n        break;\n    case SSH_KDF_SHA256:\n        sha256_final(md,ctx->ctx.sha256_ctx);\n        break;\n    case SSH_KDF_SHA384:\n        sha384_final(md,ctx->ctx.sha384_ctx);\n        break;\n    case SSH_KDF_SHA512:\n        sha512_final(md,ctx->ctx.sha512_ctx);\n        break;\n    }\n    SAFE_FREE(ctx);\n}\n\nint sshkdf_derive_key(struct ssh_crypto_struct *crypto,\n                      unsigned char *key, size_t key_len,\n                      int key_type, unsigned char *output,\n                      size_t requested_len)\n{\n    /* Can't use VLAs with Visual Studio, so allocate the biggest\n     * digest buffer we can possibly need */\n    unsigned char digest[DIGEST_MAX_LEN];\n    size_t output_len = crypto->digest_len;\n    char letter = key_type;\n    ssh_mac_ctx ctx;\n\n    if (DIGEST_MAX_LEN < crypto->digest_len) {\n        return -1;\n    }\n\n    ctx = ssh_mac_ctx_init(crypto->digest_type);\n    if (ctx == NULL) {\n        return -1;\n    }\n\n    ssh_mac_update(ctx, key, key_len);\n    ssh_mac_update(ctx, crypto->secret_hash, crypto->digest_len);\n    ssh_mac_update(ctx, &letter, 1);\n    ssh_mac_update(ctx, crypto->session_id, crypto->digest_len);\n    ssh_mac_final(digest, ctx);\n\n    if (requested_len < output_len) {\n        output_len = requested_len;\n    }\n    memcpy(output, digest, output_len);\n\n    while (requested_len > output_len) {\n        ctx = ssh_mac_ctx_init(crypto->digest_type);\n        if (ctx == NULL) {\n            return -1;\n        }\n        ssh_mac_update(ctx, key, key_len);\n        ssh_mac_update(ctx, crypto->secret_hash, crypto->digest_len);\n        ssh_mac_update(ctx, output, output_len);\n        ssh_mac_final(digest, ctx);\n        if (requested_len < output_len + crypto->digest_len) {\n            memcpy(output + output_len, digest, requested_len - output_len);\n        } else {\n            memcpy(output + output_len, digest, crypto->digest_len);\n        }\n        output_len += crypto->digest_len;\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "src/libssh/src/kex.c",
    "content": "/*\n * kex.c - key exchange\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2003-2008 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <string.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <stdbool.h>\n\n#include \"libssh/priv.h\"\n#include \"libssh/buffer.h\"\n#include \"libssh/dh.h\"\n#ifdef WITH_GEX\n#include \"libssh/dh-gex.h\"\n#endif /* WITH_GEX */\n#include \"libssh/kex.h\"\n#include \"libssh/session.h\"\n#include \"libssh/ssh2.h\"\n#include \"libssh/string.h\"\n#include \"libssh/curve25519.h\"\n#include \"libssh/knownhosts.h\"\n#include \"libssh/misc.h\"\n#include \"libssh/pki.h\"\n#include \"libssh/bignum.h\"\n#include \"libssh/token.h\"\n\n#ifdef WITH_BLOWFISH_CIPHER\n# if defined(HAVE_OPENSSL_BLOWFISH_H) || defined(HAVE_LIBGCRYPT) || defined(HAVE_LIBMBEDCRYPTO)\n#  define BLOWFISH \"blowfish-cbc,\"\n# else\n#  define BLOWFISH \"\"\n# endif\n#else\n# define BLOWFISH \"\"\n#endif\n\n#ifdef HAVE_LIBGCRYPT\n# define AES \"aes256-gcm@openssh.com,aes128-gcm@openssh.com,\" \\\n             \"aes256-ctr,aes192-ctr,aes128-ctr,\" \\\n             \"aes256-cbc,aes192-cbc,aes128-cbc,\"\n# define DES \"3des-cbc\"\n# define DES_SUPPORTED \"3des-cbc\"\n\n#elif defined(HAVE_LIBMBEDCRYPTO)\n# ifdef MBEDTLS_GCM_C\n#  define GCM \"aes256-gcm@openssh.com,aes128-gcm@openssh.com,\"\n# else\n#  define GCM \"\"\n# endif /* MBEDTLS_GCM_C */\n# define AES GCM \"aes256-ctr,aes192-ctr,aes128-ctr,\" \\\n             \"aes256-cbc,aes192-cbc,aes128-cbc,\"\n# define DES \"3des-cbc\"\n# define DES_SUPPORTED \"3des-cbc\"\n\n#elif defined(HAVE_LIBCRYPTO)\n# ifdef HAVE_OPENSSL_AES_H\n#  ifdef HAVE_OPENSSL_EVP_AES_GCM\n#   define GCM \"aes256-gcm@openssh.com,aes128-gcm@openssh.com,\"\n#  else\n#   define GCM \"\"\n#  endif /* HAVE_OPENSSL_EVP_AES_GCM */\n#  ifdef BROKEN_AES_CTR\n#   define AES GCM \"aes256-cbc,aes192-cbc,aes128-cbc,\"\n#  else /* BROKEN_AES_CTR */\n#   define AES GCM \"aes256-ctr,aes192-ctr,aes128-ctr,aes256-cbc,aes192-cbc,aes128-cbc,\"\n#  endif /* BROKEN_AES_CTR */\n# else /* HAVE_OPENSSL_AES_H */\n#  define AES \"\"\n# endif /* HAVE_OPENSSL_AES_H */\n\n# define DES \"3des-cbc\"\n# define DES_SUPPORTED \"3des-cbc\"\n#endif /* HAVE_LIBCRYPTO */\n\n#ifdef WITH_ZLIB\n#define ZLIB \"none,zlib,zlib@openssh.com\"\n#else\n#define ZLIB \"none\"\n#endif\n\n#ifdef HAVE_CURVE25519\n#define CURVE25519 \"curve25519-sha256,curve25519-sha256@libssh.org,\"\n#else\n#define CURVE25519 \"\"\n#endif\n\n#ifdef HAVE_ECDH\n#define ECDH \"ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,\"\n#define EC_HOSTKEYS \"ecdsa-sha2-nistp521,ecdsa-sha2-nistp384,ecdsa-sha2-nistp256,\"\n#define EC_PUBLIC_KEY_ALGORITHMS \"ecdsa-sha2-nistp521-cert-v01@openssh.com,\" \\\n                                 \"ecdsa-sha2-nistp384-cert-v01@openssh.com,\" \\\n                                 \"ecdsa-sha2-nistp256-cert-v01@openssh.com,\"\n#else\n#define EC_HOSTKEYS \"\"\n#define EC_PUBLIC_KEY_ALGORITHMS \"\"\n#define ECDH \"\"\n#endif\n\n#ifdef HAVE_DSA\n#define DSA_HOSTKEYS \",ssh-dss\"\n#define DSA_PUBLIC_KEY_ALGORITHMS \",ssh-dss-cert-v01@openssh.com\"\n#else\n#define DSA_HOSTKEYS \"\"\n#define DSA_PUBLIC_KEY_ALGORITHMS \"\"\n#endif\n\n#define HOSTKEYS \"ssh-ed25519,\" \\\n                 EC_HOSTKEYS \\\n                 \"rsa-sha2-512,\" \\\n                 \"rsa-sha2-256,\" \\\n                 \"ssh-rsa\" \\\n                 DSA_HOSTKEYS\n#define PUBLIC_KEY_ALGORITHMS \"ssh-ed25519-cert-v01@openssh.com,\" \\\n                              EC_PUBLIC_KEY_ALGORITHMS \\\n                              \"rsa-sha2-512-cert-v01@openssh.com,\" \\\n                              \"rsa-sha2-256-cert-v01@openssh.com,\" \\\n                              \"ssh-rsa-cert-v01@openssh.com\" \\\n                              DSA_PUBLIC_KEY_ALGORITHMS \",\" \\\n                              HOSTKEYS\n\n#ifdef WITH_GEX\n#define GEX_SHA256 \"diffie-hellman-group-exchange-sha256,\"\n#define GEX_SHA1 \"diffie-hellman-group-exchange-sha1,\"\n#else\n#define GEX_SHA256\n#define GEX_SHA1\n#endif /* WITH_GEX */\n\n#define CHACHA20 \"chacha20-poly1305@openssh.com,\"\n\n#define KEY_EXCHANGE \\\n    CURVE25519 \\\n    ECDH \\\n    \"diffie-hellman-group18-sha512,diffie-hellman-group16-sha512,\" \\\n    GEX_SHA256 \\\n    \"diffie-hellman-group14-sha256,\" \\\n    \"diffie-hellman-group14-sha1,diffie-hellman-group1-sha1\"\n#define KEY_EXCHANGE_SUPPORTED \\\n    GEX_SHA1 \\\n    KEY_EXCHANGE\n\n/* RFC 8308 */\n#define KEX_EXTENSION_CLIENT \"ext-info-c\"\n\n/* Allowed algorithms in FIPS mode */\n#define FIPS_ALLOWED_CIPHERS \"aes256-gcm@openssh.com,\"\\\n                             \"aes256-ctr,\"\\\n                             \"aes256-cbc,\"\\\n                             \"aes128-gcm@openssh.com,\"\\\n                             \"aes128-ctr,\"\\\n                             \"aes128-cbc\"\n\n#define FIPS_ALLOWED_HOSTKEYS EC_HOSTKEYS \\\n                              \"rsa-sha2-512,\" \\\n                              \"rsa-sha2-256\"\n\n#define FIPS_ALLOWED_PUBLIC_KEY_ALGORITHMS EC_PUBLIC_KEY_ALGORITHMS \\\n                                           \"rsa-sha2-512-cert-v01@openssh.com,\" \\\n                                           \"rsa-sha2-256-cert-v01@openssh.com,\" \\\n                                           FIPS_ALLOWED_HOSTKEYS\n\n#define FIPS_ALLOWED_KEX \"ecdh-sha2-nistp256,\"\\\n                         \"ecdh-sha2-nistp384,\"\\\n                         \"ecdh-sha2-nistp521,\"\\\n                         \"diffie-hellman-group-exchange-sha256,\"\\\n                         \"diffie-hellman-group14-sha256,\"\\\n                         \"diffie-hellman-group16-sha512,\"\\\n                         \"diffie-hellman-group18-sha512\"\n\n#define FIPS_ALLOWED_MACS \"hmac-sha2-256-etm@openssh.com,\"\\\n                          \"hmac-sha1-etm@openssh.com,\"\\\n                          \"hmac-sha2-512-etm@openssh.com,\"\\\n                          \"hmac-sha2-256,\"\\\n                          \"hmac-sha1,\"\\\n                          \"hmac-sha2-512\"\n\n/* NOTE: This is a fixed API and the index is defined by ssh_kex_types_e */\nstatic const char *fips_methods[] = {\n    FIPS_ALLOWED_KEX,\n    FIPS_ALLOWED_PUBLIC_KEY_ALGORITHMS,\n    FIPS_ALLOWED_CIPHERS,\n    FIPS_ALLOWED_CIPHERS,\n    FIPS_ALLOWED_MACS,\n    FIPS_ALLOWED_MACS,\n    ZLIB,\n    ZLIB,\n    \"\",\n    \"\",\n    NULL\n};\n\n/* NOTE: This is a fixed API and the index is defined by ssh_kex_types_e */\nstatic const char *default_methods[] = {\n  KEY_EXCHANGE,\n  PUBLIC_KEY_ALGORITHMS,\n  AES BLOWFISH DES,\n  AES BLOWFISH DES,\n  \"hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,hmac-sha1-96-etm@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1,hmac-sha1-96\",\n  \"hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,hmac-sha1-96-etm@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1,hmac-sha1-96\",\n  \"none\",\n  \"none\",\n  \"\",\n  \"\",\n  NULL\n};\n\n/* NOTE: This is a fixed API and the index is defined by ssh_kex_types_e */\nstatic const char *supported_methods[] = {\n  KEY_EXCHANGE_SUPPORTED,\n  PUBLIC_KEY_ALGORITHMS,\n  CHACHA20 AES BLOWFISH DES_SUPPORTED,\n  CHACHA20 AES BLOWFISH DES_SUPPORTED,\n  \"hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,hmac-sha1-96-etm@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1,hmac-sha1-96\",\n  \"hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com,hmac-sha1-etm@openssh.com,hmac-sha1-96-etm@openssh.com,hmac-sha2-256,hmac-sha2-512,hmac-sha1,hmac-sha1-96\",\n  ZLIB,\n  ZLIB,\n  \"\",\n  \"\",\n  NULL\n};\n\n/* descriptions of the key exchange packet */\nstatic const char *ssh_kex_descriptions[] = {\n  \"kex algos\",\n  \"server host key algo\",\n  \"encryption client->server\",\n  \"encryption server->client\",\n  \"mac algo client->server\",\n  \"mac algo server->client\",\n  \"compression algo client->server\",\n  \"compression algo server->client\",\n  \"languages client->server\",\n  \"languages server->client\",\n  NULL\n};\n\nconst char *ssh_kex_get_default_methods(uint32_t algo)\n{\n    if (algo >= SSH_KEX_METHODS) {\n        return NULL;\n    }\n\n    return default_methods[algo];\n}\n\nconst char *ssh_kex_get_supported_method(uint32_t algo)\n{\n    if (algo >= SSH_KEX_METHODS) {\n        return NULL;\n    }\n\n    return supported_methods[algo];\n}\n\nconst char *ssh_kex_get_description(uint32_t algo) {\n  if (algo >= SSH_KEX_METHODS) {\n    return NULL;\n  }\n\n  return ssh_kex_descriptions[algo];\n}\n\nconst char *ssh_kex_get_fips_methods(uint32_t algo) {\n  if (algo >= SSH_KEX_METHODS) {\n    return NULL;\n  }\n\n  return fips_methods[algo];\n}\n\n/**\n * @internal\n * @brief returns whether the first client key exchange algorithm or\n *        hostkey type matches its server counterpart\n * @returns whether the first client key exchange algorithm or hostkey type\n *          matches its server counterpart\n */\nstatic int cmp_first_kex_algo(const char *client_str,\n                              const char *server_str) {\n    size_t client_kex_len;\n    size_t server_kex_len;\n\n    char *colon;\n\n    int is_wrong = 1;\n\n    colon = strchr(client_str, ',');\n    if (colon == NULL) {\n        client_kex_len = strlen(client_str);\n    } else {\n        client_kex_len = colon - client_str;\n    }\n\n    colon = strchr(server_str, ',');\n    if (colon == NULL) {\n        server_kex_len = strlen(server_str);\n    } else {\n        server_kex_len = colon - server_str;\n    }\n\n    if (client_kex_len != server_kex_len) {\n        return is_wrong;\n    }\n\n    is_wrong = (strncmp(client_str, server_str, client_kex_len) != 0);\n\n    return is_wrong;\n}\n\nSSH_PACKET_CALLBACK(ssh_packet_kexinit)\n{\n    int i, ok;\n    int server_kex = session->server;\n    ssh_string str = NULL;\n    char *strings[SSH_KEX_METHODS] = {0};\n    char *rsa_sig_ext = NULL;\n    int rc = SSH_ERROR;\n    size_t len;\n\n    uint8_t first_kex_packet_follows = 0;\n    uint32_t kexinit_reserved = 0;\n\n    (void)type;\n    (void)user;\n\n    if (session->session_state == SSH_SESSION_STATE_AUTHENTICATED) {\n        SSH_LOG(SSH_LOG_INFO, \"Initiating key re-exchange\");\n    } else if (session->session_state != SSH_SESSION_STATE_INITIAL_KEX) {\n        ssh_set_error(session,SSH_FATAL,\"SSH_KEXINIT received in wrong state\");\n        goto error;\n    }\n\n    if (server_kex) {\n        len = ssh_buffer_get_data(packet,session->next_crypto->client_kex.cookie, 16);\n        if (len != 16) {\n            ssh_set_error(session, SSH_FATAL, \"ssh_packet_kexinit: no cookie in packet\");\n            goto error;\n        }\n\n        ok = ssh_hashbufin_add_cookie(session, session->next_crypto->client_kex.cookie);\n        if (ok < 0) {\n            ssh_set_error(session, SSH_FATAL, \"ssh_packet_kexinit: adding cookie failed\");\n            goto error;\n        }\n    } else {\n        len = ssh_buffer_get_data(packet,session->next_crypto->server_kex.cookie, 16);\n        if (len != 16) {\n            ssh_set_error(session, SSH_FATAL, \"ssh_packet_kexinit: no cookie in packet\");\n            goto error;\n        }\n\n        ok = ssh_hashbufin_add_cookie(session, session->next_crypto->server_kex.cookie);\n        if (ok < 0) {\n            ssh_set_error(session, SSH_FATAL, \"ssh_packet_kexinit: adding cookie failed\");\n            goto error;\n        }\n    }\n\n    for (i = 0; i < SSH_KEX_METHODS; i++) {\n        str = ssh_buffer_get_ssh_string(packet);\n        if (str == NULL) {\n          goto error;\n        }\n\n        rc = ssh_buffer_add_ssh_string(session->in_hashbuf, str);\n        if (rc < 0) {\n            ssh_set_error(session, SSH_FATAL, \"Error adding string in hash buffer\");\n            goto error;\n        }\n\n        strings[i] = ssh_string_to_char(str);\n        if (strings[i] == NULL) {\n            ssh_set_error_oom(session);\n            goto error;\n        }\n        SSH_STRING_FREE(str);\n        str = NULL;\n    }\n\n    /* copy the server kex info into an array of strings */\n    if (server_kex) {\n        for (i = 0; i < SSH_KEX_METHODS; i++) {\n            session->next_crypto->client_kex.methods[i] = strings[i];\n        }\n    } else { /* client */\n        for (i = 0; i < SSH_KEX_METHODS; i++) {\n            session->next_crypto->server_kex.methods[i] = strings[i];\n        }\n    }\n\n    /*\n     * Handle the two final fields for the KEXINIT message (RFC 4253 7.1):\n     *\n     *      boolean      first_kex_packet_follows\n     *      uint32       0 (reserved for future extension)\n     *\n     * Notably if clients set 'first_kex_packet_follows', it is expected\n     * that its value is included when computing the session ID (see\n     * 'make_sessionid').\n     */\n    if (server_kex) {\n        rc = ssh_buffer_get_u8(packet, &first_kex_packet_follows);\n        if (rc != 1) {\n            goto error;\n        }\n\n        rc = ssh_buffer_add_u8(session->in_hashbuf, first_kex_packet_follows);\n        if (rc < 0) {\n            goto error;\n        }\n\n        rc = ssh_buffer_add_u32(session->in_hashbuf, kexinit_reserved);\n        if (rc < 0) {\n            goto error;\n        }\n\n        /*\n         * If client sent a ext-info-c message in the kex list, it supports\n         * RFC 8308 extension negotiation.\n         */\n        ok = ssh_match_group(session->next_crypto->client_kex.methods[SSH_KEX],\n                             KEX_EXTENSION_CLIENT);\n        if (ok) {\n            const char *hostkeys = NULL;\n\n            /* The client supports extension negotiation */\n            session->extensions |= SSH_EXT_NEGOTIATION;\n            /*\n             * RFC 8332 Section 3.1: Use for Server Authentication\n             * Check what algorithms were provided in the SSH_HOSTKEYS list\n             * by the client and enable the respective extensions to provide\n             * correct signature in the next packet if RSA is negotiated\n             */\n            hostkeys = session->next_crypto->client_kex.methods[SSH_HOSTKEYS];\n            ok = ssh_match_group(hostkeys, \"rsa-sha2-512\");\n            if (ok) {\n                /* Check if rsa-sha2-512 is allowed by config */\n                if (session->opts.wanted_methods[SSH_HOSTKEYS] != NULL) {\n                    char *is_allowed =\n                        ssh_find_matching(session->opts.wanted_methods[SSH_HOSTKEYS],\n                                          \"rsa-sha2-512\");\n                    if (is_allowed != NULL) {\n                        session->extensions |= SSH_EXT_SIG_RSA_SHA512;\n                    }\n                    SAFE_FREE(is_allowed);\n                }\n            }\n            ok = ssh_match_group(hostkeys, \"rsa-sha2-256\");\n            if (ok) {\n                /* Check if rsa-sha2-256 is allowed by config */\n                if (session->opts.wanted_methods[SSH_HOSTKEYS] != NULL) {\n                    char *is_allowed =\n                        ssh_find_matching(session->opts.wanted_methods[SSH_HOSTKEYS],\n                                          \"rsa-sha2-256\");\n                    if (is_allowed != NULL) {\n                        session->extensions |= SSH_EXT_SIG_RSA_SHA256;\n                    }\n                    SAFE_FREE(is_allowed);\n                }\n            }\n\n            /*\n             * Ensure that the client preference is honored for the case\n             * both signature types are enabled.\n             */\n            if ((session->extensions & SSH_EXT_SIG_RSA_SHA256) &&\n                (session->extensions & SSH_EXT_SIG_RSA_SHA512)) {\n                session->extensions &= ~(SSH_EXT_SIG_RSA_SHA256 | SSH_EXT_SIG_RSA_SHA512);\n                rsa_sig_ext = ssh_find_matching(\"rsa-sha2-512,rsa-sha2-256\",\n                                                session->next_crypto->client_kex.methods[SSH_HOSTKEYS]);\n                if (rsa_sig_ext == NULL) {\n                    goto error; /* should never happen */\n                } else if (strcmp(rsa_sig_ext, \"rsa-sha2-512\") == 0) {\n                    session->extensions |= SSH_EXT_SIG_RSA_SHA512;\n                } else if (strcmp(rsa_sig_ext, \"rsa-sha2-256\") == 0) {\n                    session->extensions |= SSH_EXT_SIG_RSA_SHA256;\n                } else {\n                    SAFE_FREE(rsa_sig_ext);\n                    goto error; /* should never happen */\n                }\n                SAFE_FREE(rsa_sig_ext);\n            }\n\n            SSH_LOG(SSH_LOG_DEBUG, \"The client supports extension \"\n                    \"negotiation. Enabled signature algorithms: %s%s\",\n                    session->extensions & SSH_EXT_SIG_RSA_SHA256 ? \"SHA256\" : \"\",\n                    session->extensions & SSH_EXT_SIG_RSA_SHA512 ? \" SHA512\" : \"\");\n        }\n\n        /*\n         * Remember whether 'first_kex_packet_follows' was set and the client\n         * guess was wrong: in this case the next SSH_MSG_KEXDH_INIT message\n         * must be ignored.\n         */\n        if (first_kex_packet_follows) {\n          session->first_kex_follows_guess_wrong =\n            cmp_first_kex_algo(session->next_crypto->client_kex.methods[SSH_KEX],\n                               session->next_crypto->server_kex.methods[SSH_KEX]) ||\n            cmp_first_kex_algo(session->next_crypto->client_kex.methods[SSH_HOSTKEYS],\n                               session->next_crypto->server_kex.methods[SSH_HOSTKEYS]);\n        }\n    }\n\n    /* Note, that his overwrites authenticated state in case of rekeying */\n    session->session_state = SSH_SESSION_STATE_KEXINIT_RECEIVED;\n    session->dh_handshake_state = DH_STATE_INIT;\n    session->ssh_connection_callback(session);\n    return SSH_PACKET_USED;\n\nerror:\n    SSH_STRING_FREE(str);\n    for (i = 0; i < SSH_KEX_METHODS; i++) {\n        if (server_kex) {\n            session->next_crypto->client_kex.methods[i] = NULL;\n        } else { /* client */\n            session->next_crypto->server_kex.methods[i] = NULL;\n        }\n        SAFE_FREE(strings[i]);\n    }\n\n    session->session_state = SSH_SESSION_STATE_ERROR;\n\n    return SSH_PACKET_USED;\n}\n\nvoid ssh_list_kex(struct ssh_kex_struct *kex) {\n  int i = 0;\n\n#ifdef DEBUG_CRYPTO\n  ssh_log_hexdump(\"session cookie\", kex->cookie, 16);\n#endif\n\n  for(i = 0; i < SSH_KEX_METHODS; i++) {\n    if (kex->methods[i] == NULL) {\n      continue;\n    }\n    SSH_LOG(SSH_LOG_FUNCTIONS, \"%s: %s\",\n        ssh_kex_descriptions[i], kex->methods[i]);\n  }\n}\n\n/**\n * @internal\n *\n * @brief selects the hostkey mechanisms to be chosen for the key exchange,\n * as some hostkey mechanisms may be present in known_hosts files.\n *\n * @returns a cstring containing a comma-separated list of hostkey methods.\n *          NULL if no method matches\n */\nchar *ssh_client_select_hostkeys(ssh_session session)\n{\n    const char *wanted = NULL;\n    char *wanted_without_certs = NULL;\n    char *known_hosts_algorithms = NULL;\n    char *known_hosts_ordered = NULL;\n    char *new_hostkeys = NULL;\n    char *fips_hostkeys = NULL;\n\n    wanted = session->opts.wanted_methods[SSH_HOSTKEYS];\n    if (wanted == NULL) {\n        if (ssh_fips_mode()) {\n            wanted = ssh_kex_get_fips_methods(SSH_HOSTKEYS);\n        } else {\n            wanted = ssh_kex_get_default_methods(SSH_HOSTKEYS);\n        }\n    }\n\n    /* This removes the certificate types, unsupported for now */\n    wanted_without_certs = ssh_find_all_matching(HOSTKEYS, wanted);\n    if (wanted_without_certs == NULL) {\n        SSH_LOG(SSH_LOG_WARNING,\n                \"List of allowed host key algorithms is empty or contains only \"\n                \"unsupported algorithms\");\n        return NULL;\n    }\n\n    SSH_LOG(SSH_LOG_DEBUG,\n            \"Order of wanted host keys: \\\"%s\\\"\",\n            wanted_without_certs);\n\n    known_hosts_algorithms = ssh_known_hosts_get_algorithms_names(session);\n    if (known_hosts_algorithms == NULL) {\n        SSH_LOG(SSH_LOG_DEBUG,\n                \"No key found in known_hosts; \"\n                \"changing host key method to \\\"%s\\\"\",\n                wanted_without_certs);\n\n        return wanted_without_certs;\n    }\n\n    SSH_LOG(SSH_LOG_DEBUG,\n            \"Algorithms found in known_hosts files: \\\"%s\\\"\",\n            known_hosts_algorithms);\n\n    /* Filter and order the keys from known_hosts according to wanted list */\n    known_hosts_ordered = ssh_find_all_matching(known_hosts_algorithms,\n                                                wanted_without_certs);\n    SAFE_FREE(known_hosts_algorithms);\n    if (known_hosts_ordered == NULL) {\n        SSH_LOG(SSH_LOG_DEBUG,\n                \"No key found in known_hosts is allowed; \"\n                \"changing host key method to \\\"%s\\\"\",\n                wanted_without_certs);\n\n        return wanted_without_certs;\n    }\n\n    /* Append the other supported keys after the preferred ones\n     * This function tolerates NULL pointers in parameters */\n    new_hostkeys = ssh_append_without_duplicates(known_hosts_ordered,\n                                                 wanted_without_certs);\n    SAFE_FREE(known_hosts_ordered);\n    SAFE_FREE(wanted_without_certs);\n    if (new_hostkeys == NULL) {\n        ssh_set_error_oom(session);\n        return NULL;\n    }\n\n    if (ssh_fips_mode()) {\n        /* Filter out algorithms not allowed in FIPS mode */\n        fips_hostkeys = ssh_keep_fips_algos(SSH_HOSTKEYS, new_hostkeys);\n        SAFE_FREE(new_hostkeys);\n        if (fips_hostkeys == NULL) {\n            SSH_LOG(SSH_LOG_WARNING,\n                    \"None of the wanted host keys or keys in known_hosts files \"\n                    \"is allowed in FIPS mode.\");\n            return NULL;\n        }\n        new_hostkeys = fips_hostkeys;\n    }\n\n    SSH_LOG(SSH_LOG_DEBUG,\n            \"Changing host key method to \\\"%s\\\"\",\n            new_hostkeys);\n\n    return new_hostkeys;\n}\n\n/**\n * @brief sets the key exchange parameters to be sent to the server,\n *        in function of the options and available methods.\n */\nint ssh_set_client_kex(ssh_session session)\n{\n    struct ssh_kex_struct *client = &session->next_crypto->client_kex;\n    const char *wanted;\n    char *kex = NULL;\n    char *kex_tmp = NULL;\n    int ok;\n    int i;\n    size_t kex_len, len;\n\n    ok = ssh_get_random(client->cookie, 16, 0);\n    if (!ok) {\n        ssh_set_error(session, SSH_FATAL, \"PRNG error\");\n        return SSH_ERROR;\n    }\n\n    memset(client->methods, 0, SSH_KEX_METHODS * sizeof(char **));\n\n    /* Set the list of allowed algorithms in order of preference, if it hadn't\n     * been set yet. */\n    for (i = 0; i < SSH_KEX_METHODS; i++) {\n        if (i == SSH_HOSTKEYS) {\n            /* Set the hostkeys in the following order:\n             * - First: keys present in known_hosts files ordered by preference\n             * - Next: other wanted algorithms ordered by preference */\n            client->methods[i] = ssh_client_select_hostkeys(session);\n            if (client->methods[i] == NULL) {\n                ssh_set_error_oom(session);\n                return SSH_ERROR;\n            }\n            continue;\n        }\n\n        wanted = session->opts.wanted_methods[i];\n        if (wanted == NULL) {\n            if (ssh_fips_mode()) {\n                wanted = fips_methods[i];\n            } else {\n                wanted = default_methods[i];\n            }\n        }\n        client->methods[i] = strdup(wanted);\n        if (client->methods[i] == NULL) {\n            ssh_set_error_oom(session);\n            return SSH_ERROR;\n        }\n    }\n\n    /* For rekeying, skip the extension negotiation */\n    if (session->flags & SSH_SESSION_FLAG_AUTHENTICATED) {\n        return SSH_OK;\n    }\n\n    /* Here we append  ext-info-c  to the list of kex algorithms */\n    kex = client->methods[SSH_KEX];\n    len = strlen(kex);\n    if (len + strlen(KEX_EXTENSION_CLIENT) + 2 < len) {\n        /* Overflow */\n        return SSH_ERROR;\n    }\n    kex_len = len + strlen(KEX_EXTENSION_CLIENT) + 2; /* comma, NULL */\n    kex_tmp = realloc(kex, kex_len);\n    if (kex_tmp == NULL) {\n        free(kex);\n        ssh_set_error_oom(session);\n        return SSH_ERROR;\n    }\n    snprintf(kex_tmp + len, kex_len - len, \",%s\", KEX_EXTENSION_CLIENT);\n    client->methods[SSH_KEX] = kex_tmp;\n\n    return SSH_OK;\n}\n\n/** @brief Select the different methods on basis of client's and\n * server's kex messages, and watches out if a match is possible.\n */\nint ssh_kex_select_methods (ssh_session session){\n    struct ssh_kex_struct *server = &session->next_crypto->server_kex;\n    struct ssh_kex_struct *client = &session->next_crypto->client_kex;\n    char *ext_start = NULL;\n    int i;\n\n    /* Here we should drop the  ext-info-c  from the list so we avoid matching.\n     * it. We added it to the end, so we can just truncate the string here */\n    ext_start = strstr(client->methods[SSH_KEX], \",\"KEX_EXTENSION_CLIENT);\n    if (ext_start != NULL) {\n        ext_start[0] = '\\0';\n    }\n\n    for (i = 0; i < SSH_KEX_METHODS; i++) {\n        session->next_crypto->kex_methods[i]=ssh_find_matching(server->methods[i],client->methods[i]);\n        if(session->next_crypto->kex_methods[i] == NULL && i < SSH_LANG_C_S){\n            ssh_set_error(session,SSH_FATAL,\"kex error : no match for method %s: server [%s], client [%s]\",\n                    ssh_kex_descriptions[i],server->methods[i],client->methods[i]);\n            return SSH_ERROR;\n        } else if ((i >= SSH_LANG_C_S) && (session->next_crypto->kex_methods[i] == NULL)) {\n            /* we can safely do that for languages */\n            session->next_crypto->kex_methods[i] = strdup(\"\");\n        }\n    }\n    if(strcmp(session->next_crypto->kex_methods[SSH_KEX], \"diffie-hellman-group1-sha1\") == 0){\n      session->next_crypto->kex_type=SSH_KEX_DH_GROUP1_SHA1;\n    } else if(strcmp(session->next_crypto->kex_methods[SSH_KEX], \"diffie-hellman-group14-sha1\") == 0){\n      session->next_crypto->kex_type=SSH_KEX_DH_GROUP14_SHA1;\n    } else if(strcmp(session->next_crypto->kex_methods[SSH_KEX], \"diffie-hellman-group14-sha256\") == 0){\n      session->next_crypto->kex_type=SSH_KEX_DH_GROUP14_SHA256;\n    } else if(strcmp(session->next_crypto->kex_methods[SSH_KEX], \"diffie-hellman-group16-sha512\") == 0){\n      session->next_crypto->kex_type=SSH_KEX_DH_GROUP16_SHA512;\n    } else if(strcmp(session->next_crypto->kex_methods[SSH_KEX], \"diffie-hellman-group18-sha512\") == 0){\n      session->next_crypto->kex_type=SSH_KEX_DH_GROUP18_SHA512;\n#ifdef WITH_GEX\n    } else if(strcmp(session->next_crypto->kex_methods[SSH_KEX], \"diffie-hellman-group-exchange-sha1\") == 0){\n      session->next_crypto->kex_type=SSH_KEX_DH_GEX_SHA1;\n    } else if(strcmp(session->next_crypto->kex_methods[SSH_KEX], \"diffie-hellman-group-exchange-sha256\") == 0){\n        session->next_crypto->kex_type=SSH_KEX_DH_GEX_SHA256;\n#endif /* WITH_GEX */\n    } else if(strcmp(session->next_crypto->kex_methods[SSH_KEX], \"ecdh-sha2-nistp256\") == 0){\n      session->next_crypto->kex_type=SSH_KEX_ECDH_SHA2_NISTP256;\n    } else if(strcmp(session->next_crypto->kex_methods[SSH_KEX], \"ecdh-sha2-nistp384\") == 0){\n      session->next_crypto->kex_type=SSH_KEX_ECDH_SHA2_NISTP384;\n    } else if(strcmp(session->next_crypto->kex_methods[SSH_KEX], \"ecdh-sha2-nistp521\") == 0){\n      session->next_crypto->kex_type=SSH_KEX_ECDH_SHA2_NISTP521;\n    } else if(strcmp(session->next_crypto->kex_methods[SSH_KEX], \"curve25519-sha256@libssh.org\") == 0){\n      session->next_crypto->kex_type=SSH_KEX_CURVE25519_SHA256_LIBSSH_ORG;\n    } else if(strcmp(session->next_crypto->kex_methods[SSH_KEX], \"curve25519-sha256\") == 0){\n      session->next_crypto->kex_type=SSH_KEX_CURVE25519_SHA256;\n    }\n    SSH_LOG(SSH_LOG_INFO, \"Negotiated %s,%s,%s,%s,%s,%s,%s,%s,%s,%s\",\n            session->next_crypto->kex_methods[SSH_KEX],\n            session->next_crypto->kex_methods[SSH_HOSTKEYS],\n            session->next_crypto->kex_methods[SSH_CRYPT_C_S],\n            session->next_crypto->kex_methods[SSH_CRYPT_S_C],\n            session->next_crypto->kex_methods[SSH_MAC_C_S],\n            session->next_crypto->kex_methods[SSH_MAC_S_C],\n            session->next_crypto->kex_methods[SSH_COMP_C_S],\n            session->next_crypto->kex_methods[SSH_COMP_S_C],\n            session->next_crypto->kex_methods[SSH_LANG_C_S],\n            session->next_crypto->kex_methods[SSH_LANG_S_C]\n    );\n    return SSH_OK;\n}\n\n\n/* this function only sends the predefined set of kex methods */\nint ssh_send_kex(ssh_session session, int server_kex) {\n  struct ssh_kex_struct *kex = (server_kex ? &session->next_crypto->server_kex :\n      &session->next_crypto->client_kex);\n  ssh_string str = NULL;\n  int i;\n  int rc;\n\n  rc = ssh_buffer_pack(session->out_buffer,\n                       \"bP\",\n                       SSH2_MSG_KEXINIT,\n                       16,\n                       kex->cookie); /* cookie */\n  if (rc != SSH_OK)\n    goto error;\n  if (ssh_hashbufout_add_cookie(session) < 0) {\n    goto error;\n  }\n\n  ssh_list_kex(kex);\n\n  for (i = 0; i < SSH_KEX_METHODS; i++) {\n    str = ssh_string_from_char(kex->methods[i]);\n    if (str == NULL) {\n      goto error;\n    }\n\n    if (ssh_buffer_add_ssh_string(session->out_hashbuf, str) < 0) {\n      goto error;\n    }\n    if (ssh_buffer_add_ssh_string(session->out_buffer, str) < 0) {\n      goto error;\n    }\n    SSH_STRING_FREE(str);\n    str = NULL;\n  }\n\n  rc = ssh_buffer_pack(session->out_buffer,\n                       \"bd\",\n                       0,\n                       0);\n  if (rc != SSH_OK) {\n    goto error;\n  }\n\n  if (ssh_packet_send(session) == SSH_ERROR) {\n    return -1;\n  }\n\n  SSH_LOG(SSH_LOG_PACKET, \"SSH_MSG_KEXINIT sent\");\n  return 0;\nerror:\n  ssh_buffer_reinit(session->out_buffer);\n  ssh_buffer_reinit(session->out_hashbuf);\n  SSH_STRING_FREE(str);\n\n  return -1;\n}\n\n/*\n * Key re-exchange (rekey) is triggered by this function.\n * It can not be called again after the rekey is initialized!\n */\nint ssh_send_rekex(ssh_session session)\n{\n    int rc;\n\n    if (session->dh_handshake_state != DH_STATE_FINISHED) {\n        /* Rekey/Key exchange is already in progress */\n        SSH_LOG(SSH_LOG_PACKET, \"Attempting rekey in bad state\");\n        return SSH_ERROR;\n    }\n\n    if (session->current_crypto == NULL) {\n        /* No current crypto used -- can not exchange it */\n        SSH_LOG(SSH_LOG_PACKET, \"No crypto to rekey\");\n        return SSH_ERROR;\n    }\n\n    if (session->client) {\n        rc = ssh_set_client_kex(session);\n        if (rc != SSH_OK) {\n            SSH_LOG(SSH_LOG_PACKET, \"Failed to set client kex\");\n            return rc;\n        }\n    } else {\n#ifdef WITH_SERVER\n        rc = server_set_kex(session);\n        if (rc == SSH_ERROR) {\n            SSH_LOG(SSH_LOG_PACKET, \"Failed to set server kex\");\n            return rc;\n        }\n#else\n        SSH_LOG(SSH_LOG_PACKET, \"Invalid session state.\");\n        return SSH_ERROR;\n#endif /* WITH_SERVER */\n    }\n\n    session->dh_handshake_state = DH_STATE_INIT;\n    rc = ssh_send_kex(session, session->server);\n    if (rc < 0) {\n        SSH_LOG(SSH_LOG_PACKET, \"Failed to send kex\");\n        return rc;\n    }\n\n    /* Reset the handshake state */\n    session->dh_handshake_state = DH_STATE_INIT_SENT;\n    return SSH_OK;\n}\n\n/* returns a copy of the provided list if everything is supported,\n * otherwise a new list of the supported algorithms */\nchar *ssh_keep_known_algos(enum ssh_kex_types_e algo, const char *list)\n{\n    if (algo > SSH_LANG_S_C) {\n        return NULL;\n    }\n\n    return ssh_find_all_matching(supported_methods[algo], list);\n}\n\n/**\n * @internal\n *\n * @brief Return a new allocated string containing only the FIPS allowed\n * algorithms from the list.\n *\n * @param[in] algo  The type of the methods to filter\n * @param[in] list  The list to be filtered\n *\n * @return A new allocated list containing only the FIPS allowed algorithms from\n * the list; NULL in case of error.\n */\nchar *ssh_keep_fips_algos(enum ssh_kex_types_e algo, const char *list)\n{\n    if (algo > SSH_LANG_S_C) {\n        return NULL;\n    }\n\n    return ssh_find_all_matching(fips_methods[algo], list);\n}\n\nint ssh_make_sessionid(ssh_session session)\n{\n    ssh_string num = NULL;\n    ssh_buffer server_hash = NULL;\n    ssh_buffer client_hash = NULL;\n    ssh_buffer buf = NULL;\n    ssh_string server_pubkey_blob = NULL;\n    const_bignum client_pubkey, server_pubkey;\n#ifdef WITH_GEX\n    const_bignum modulus, generator;\n#endif\n    int rc = SSH_ERROR;\n\n    buf = ssh_buffer_new();\n    if (buf == NULL) {\n        return rc;\n    }\n\n    rc = ssh_buffer_pack(buf,\n                         \"ss\",\n                         session->clientbanner,\n                         session->serverbanner);\n    if (rc == SSH_ERROR) {\n        goto error;\n    }\n\n    if (session->client) {\n        server_hash = session->in_hashbuf;\n        client_hash = session->out_hashbuf;\n    } else {\n        server_hash = session->out_hashbuf;\n        client_hash = session->in_hashbuf;\n    }\n\n    /*\n     * Handle the two final fields for the KEXINIT message (RFC 4253 7.1):\n     *\n     *      boolean      first_kex_packet_follows\n     *      uint32       0 (reserved for future extension)\n     */\n    rc = ssh_buffer_add_u8(server_hash, 0);\n    if (rc < 0) {\n        goto error;\n    }\n    rc = ssh_buffer_add_u32(server_hash, 0);\n    if (rc < 0) {\n        goto error;\n    }\n\n    /* These fields are handled for the server case in ssh_packet_kexinit. */\n    if (session->client) {\n        rc = ssh_buffer_add_u8(client_hash, 0);\n        if (rc < 0) {\n            goto error;\n        }\n        rc = ssh_buffer_add_u32(client_hash, 0);\n        if (rc < 0) {\n            goto error;\n        }\n    }\n\n    rc = ssh_dh_get_next_server_publickey_blob(session, &server_pubkey_blob);\n    if (rc != SSH_OK) {\n        goto error;\n    }\n\n    rc = ssh_buffer_pack(buf,\n                         \"dPdPS\",\n                         ssh_buffer_get_len(client_hash),\n                         ssh_buffer_get_len(client_hash),\n                         ssh_buffer_get(client_hash),\n                         ssh_buffer_get_len(server_hash),\n                         ssh_buffer_get_len(server_hash),\n                         ssh_buffer_get(server_hash),\n                         server_pubkey_blob);\n    SSH_STRING_FREE(server_pubkey_blob);\n    if(rc != SSH_OK){\n        goto error;\n    }\n\n    switch(session->next_crypto->kex_type) {\n    case SSH_KEX_DH_GROUP1_SHA1:\n    case SSH_KEX_DH_GROUP14_SHA1:\n    case SSH_KEX_DH_GROUP14_SHA256:\n    case SSH_KEX_DH_GROUP16_SHA512:\n    case SSH_KEX_DH_GROUP18_SHA512:\n        rc = ssh_dh_keypair_get_keys(session->next_crypto->dh_ctx,\n                                     DH_CLIENT_KEYPAIR, NULL, &client_pubkey);\n        if (rc != SSH_OK) {\n            goto error;\n        }\n        rc = ssh_dh_keypair_get_keys(session->next_crypto->dh_ctx,\n                                     DH_SERVER_KEYPAIR, NULL, &server_pubkey);\n        if (rc != SSH_OK) {\n            goto error;\n        }\n        rc = ssh_buffer_pack(buf,\n                             \"BB\",\n                             client_pubkey,\n                             server_pubkey);\n        if (rc != SSH_OK) {\n            goto error;\n        }\n        break;\n#ifdef WITH_GEX\n    case SSH_KEX_DH_GEX_SHA1:\n    case SSH_KEX_DH_GEX_SHA256:\n        rc = ssh_dh_keypair_get_keys(session->next_crypto->dh_ctx,\n                                     DH_CLIENT_KEYPAIR, NULL, &client_pubkey);\n        if (rc != SSH_OK) {\n            goto error;\n        }\n        rc = ssh_dh_keypair_get_keys(session->next_crypto->dh_ctx,\n                                     DH_SERVER_KEYPAIR, NULL, &server_pubkey);\n        if (rc != SSH_OK) {\n            goto error;\n        }\n        rc = ssh_dh_get_parameters(session->next_crypto->dh_ctx,\n                                   &modulus, &generator);\n        if (rc != SSH_OK) {\n            goto error;\n        }\n        rc = ssh_buffer_pack(buf,\n                    \"dddBBBB\",\n                    session->next_crypto->dh_pmin,\n                    session->next_crypto->dh_pn,\n                    session->next_crypto->dh_pmax,\n                    modulus,\n                    generator,\n                    client_pubkey,\n                    server_pubkey);\n        if (rc != SSH_OK) {\n            goto error;\n        }\n        break;\n#endif /* WITH_GEX */\n#ifdef HAVE_ECDH\n    case SSH_KEX_ECDH_SHA2_NISTP256:\n    case SSH_KEX_ECDH_SHA2_NISTP384:\n    case SSH_KEX_ECDH_SHA2_NISTP521:\n        if (session->next_crypto->ecdh_client_pubkey == NULL ||\n            session->next_crypto->ecdh_server_pubkey == NULL) {\n            SSH_LOG(SSH_LOG_WARNING, \"ECDH parameted missing\");\n            goto error;\n        }\n        rc = ssh_buffer_pack(buf,\n                             \"SS\",\n                             session->next_crypto->ecdh_client_pubkey,\n                             session->next_crypto->ecdh_server_pubkey);\n        if (rc != SSH_OK) {\n            goto error;\n        }\n        break;\n#endif\n#ifdef HAVE_CURVE25519\n    case SSH_KEX_CURVE25519_SHA256:\n    case SSH_KEX_CURVE25519_SHA256_LIBSSH_ORG:\n        rc = ssh_buffer_pack(buf,\n                             \"dPdP\",\n                             CURVE25519_PUBKEY_SIZE,\n                             (size_t)CURVE25519_PUBKEY_SIZE, session->next_crypto->curve25519_client_pubkey,\n                             CURVE25519_PUBKEY_SIZE,\n                             (size_t)CURVE25519_PUBKEY_SIZE, session->next_crypto->curve25519_server_pubkey);\n\n        if (rc != SSH_OK) {\n            goto error;\n        }\n        break;\n#endif\n    }\n    rc = ssh_buffer_pack(buf, \"B\", session->next_crypto->shared_secret);\n    if (rc != SSH_OK) {\n        goto error;\n    }\n\n#ifdef DEBUG_CRYPTO\n    ssh_log_hexdump(\"hash buffer\", ssh_buffer_get(buf), ssh_buffer_get_len(buf));\n#endif\n\n    switch (session->next_crypto->kex_type) {\n    case SSH_KEX_DH_GROUP1_SHA1:\n    case SSH_KEX_DH_GROUP14_SHA1:\n#ifdef WITH_GEX\n    case SSH_KEX_DH_GEX_SHA1:\n#endif /* WITH_GEX */\n        session->next_crypto->digest_len = SHA_DIGEST_LENGTH;\n        session->next_crypto->digest_type = SSH_KDF_SHA1;\n        session->next_crypto->secret_hash = malloc(session->next_crypto->digest_len);\n        if (session->next_crypto->secret_hash == NULL) {\n            ssh_set_error_oom(session);\n            goto error;\n        }\n        sha1(ssh_buffer_get(buf), ssh_buffer_get_len(buf),\n                                   session->next_crypto->secret_hash);\n        break;\n    case SSH_KEX_DH_GROUP14_SHA256:\n    case SSH_KEX_ECDH_SHA2_NISTP256:\n    case SSH_KEX_CURVE25519_SHA256:\n    case SSH_KEX_CURVE25519_SHA256_LIBSSH_ORG:\n#ifdef WITH_GEX\n    case SSH_KEX_DH_GEX_SHA256:\n#endif /* WITH_GEX */\n        session->next_crypto->digest_len = SHA256_DIGEST_LENGTH;\n        session->next_crypto->digest_type = SSH_KDF_SHA256;\n        session->next_crypto->secret_hash = malloc(session->next_crypto->digest_len);\n        if (session->next_crypto->secret_hash == NULL) {\n            ssh_set_error_oom(session);\n            goto error;\n        }\n        sha256(ssh_buffer_get(buf), ssh_buffer_get_len(buf),\n                                     session->next_crypto->secret_hash);\n        break;\n    case SSH_KEX_ECDH_SHA2_NISTP384:\n        session->next_crypto->digest_len = SHA384_DIGEST_LENGTH;\n        session->next_crypto->digest_type = SSH_KDF_SHA384;\n        session->next_crypto->secret_hash = malloc(session->next_crypto->digest_len);\n        if (session->next_crypto->secret_hash == NULL) {\n            ssh_set_error_oom(session);\n            goto error;\n        }\n        sha384(ssh_buffer_get(buf), ssh_buffer_get_len(buf),\n                                     session->next_crypto->secret_hash);\n        break;\n    case SSH_KEX_DH_GROUP16_SHA512:\n    case SSH_KEX_DH_GROUP18_SHA512:\n    case SSH_KEX_ECDH_SHA2_NISTP521:\n        session->next_crypto->digest_len = SHA512_DIGEST_LENGTH;\n        session->next_crypto->digest_type = SSH_KDF_SHA512;\n        session->next_crypto->secret_hash = malloc(session->next_crypto->digest_len);\n        if (session->next_crypto->secret_hash == NULL) {\n            ssh_set_error_oom(session);\n            goto error;\n        }\n        sha512(ssh_buffer_get(buf),\n               ssh_buffer_get_len(buf),\n               session->next_crypto->secret_hash);\n        break;\n    }\n    /* During the first kex, secret hash and session ID are equal. However, after\n     * a key re-exchange, a new secret hash is calculated. This hash will not replace\n     * but complement existing session id.\n     */\n    if (!session->next_crypto->session_id) {\n        session->next_crypto->session_id = malloc(session->next_crypto->digest_len);\n        if (session->next_crypto->session_id == NULL) {\n            ssh_set_error_oom(session);\n            goto error;\n        }\n        memcpy(session->next_crypto->session_id, session->next_crypto->secret_hash,\n                session->next_crypto->digest_len);\n    }\n#ifdef DEBUG_CRYPTO\n    printf(\"Session hash: \\n\");\n    ssh_log_hexdump(\"secret hash\", session->next_crypto->secret_hash, session->next_crypto->digest_len);\n    ssh_log_hexdump(\"session id\", session->next_crypto->session_id, session->next_crypto->digest_len);\n#endif\n\n    rc = SSH_OK;\nerror:\n    SSH_BUFFER_FREE(buf);\n    SSH_BUFFER_FREE(client_hash);\n    SSH_BUFFER_FREE(server_hash);\n\n    session->in_hashbuf = NULL;\n    session->out_hashbuf = NULL;\n\n    SSH_STRING_FREE(num);\n\n    return rc;\n}\n\nint ssh_hashbufout_add_cookie(ssh_session session)\n{\n    int rc;\n\n    session->out_hashbuf = ssh_buffer_new();\n    if (session->out_hashbuf == NULL) {\n        return -1;\n    }\n\n    rc = ssh_buffer_allocate_size(session->out_hashbuf,\n            sizeof(uint8_t) + 16);\n    if (rc < 0) {\n        ssh_buffer_reinit(session->out_hashbuf);\n        return -1;\n    }\n\n    if (ssh_buffer_add_u8(session->out_hashbuf, 20) < 0) {\n        ssh_buffer_reinit(session->out_hashbuf);\n        return -1;\n    }\n\n    if (session->server) {\n        if (ssh_buffer_add_data(session->out_hashbuf,\n                    session->next_crypto->server_kex.cookie, 16) < 0) {\n            ssh_buffer_reinit(session->out_hashbuf);\n            return -1;\n        }\n    } else {\n        if (ssh_buffer_add_data(session->out_hashbuf,\n                    session->next_crypto->client_kex.cookie, 16) < 0) {\n            ssh_buffer_reinit(session->out_hashbuf);\n            return -1;\n        }\n    }\n\n    return 0;\n}\n\nint ssh_hashbufin_add_cookie(ssh_session session, unsigned char *cookie)\n{\n    int rc;\n\n    session->in_hashbuf = ssh_buffer_new();\n    if (session->in_hashbuf == NULL) {\n        return -1;\n    }\n\n    rc = ssh_buffer_allocate_size(session->in_hashbuf,\n            sizeof(uint8_t) + 20 + 16);\n    if (rc < 0) {\n        ssh_buffer_reinit(session->in_hashbuf);\n        return -1;\n    }\n\n    if (ssh_buffer_add_u8(session->in_hashbuf, 20) < 0) {\n        ssh_buffer_reinit(session->in_hashbuf);\n        return -1;\n    }\n    if (ssh_buffer_add_data(session->in_hashbuf,cookie, 16) < 0) {\n        ssh_buffer_reinit(session->in_hashbuf);\n        return -1;\n    }\n\n    return 0;\n}\n\nint ssh_generate_session_keys(ssh_session session)\n{\n    ssh_string k_string = NULL;\n    struct ssh_crypto_struct *crypto = session->next_crypto;\n    unsigned char *key = NULL;\n    unsigned char *IV_cli_to_srv = NULL;\n    unsigned char *IV_srv_to_cli = NULL;\n    unsigned char *enckey_cli_to_srv = NULL;\n    unsigned char *enckey_srv_to_cli = NULL;\n    unsigned char *intkey_cli_to_srv = NULL;\n    unsigned char *intkey_srv_to_cli = NULL;\n    size_t key_len = 0;\n    size_t IV_len = 0;\n    size_t enckey_cli_to_srv_len = 0;\n    size_t enckey_srv_to_cli_len = 0;\n    size_t intkey_cli_to_srv_len = 0;\n    size_t intkey_srv_to_cli_len = 0;\n    int rc = -1;\n\n    k_string = ssh_make_bignum_string(crypto->shared_secret);\n    if (k_string == NULL) {\n        ssh_set_error_oom(session);\n        goto error;\n    }\n    /* See RFC4251 Section 5 for the definition of mpint which is the\n     * encoding we need to use for key in the SSH KDF */\n    key = (unsigned char *)k_string;\n    key_len = ssh_string_len(k_string) + 4;\n\n    IV_len = crypto->digest_len;\n    if (session->client) {\n        enckey_cli_to_srv_len = crypto->out_cipher->keysize / 8;\n        enckey_srv_to_cli_len = crypto->in_cipher->keysize / 8;\n\t\tintkey_cli_to_srv_len = hmac_key_len(crypto->out_hmac);\n\t\tintkey_srv_to_cli_len = hmac_key_len(crypto->in_hmac);\n    } else {\n        enckey_cli_to_srv_len = crypto->in_cipher->keysize / 8;\n        enckey_srv_to_cli_len = crypto->out_cipher->keysize / 8;\n\t\tintkey_cli_to_srv_len = hmac_key_len(crypto->in_hmac);\n\t\tintkey_srv_to_cli_len = hmac_key_len(crypto->out_hmac);\n    }\n\n    IV_cli_to_srv = malloc(IV_len);\n    IV_srv_to_cli = malloc(IV_len);\n    enckey_cli_to_srv = malloc(enckey_cli_to_srv_len);\n    enckey_srv_to_cli = malloc(enckey_srv_to_cli_len);\n    intkey_cli_to_srv = malloc(intkey_cli_to_srv_len);\n    intkey_srv_to_cli = malloc(intkey_srv_to_cli_len);\n    if (IV_cli_to_srv == NULL || IV_srv_to_cli == NULL ||\n        enckey_cli_to_srv == NULL || enckey_srv_to_cli == NULL ||\n        intkey_cli_to_srv == NULL || intkey_srv_to_cli == NULL) {\n        ssh_set_error_oom(session);\n        goto error;\n    }\n\n    /* IV */\n    rc = ssh_kdf(crypto, key, key_len, 'A', IV_cli_to_srv, IV_len);\n    if (rc < 0) {\n        goto error;\n    }\n    rc = ssh_kdf(crypto, key, key_len, 'B', IV_srv_to_cli, IV_len);\n    if (rc < 0) {\n        goto error;\n    }\n    /* Encryption Key */\n    rc = ssh_kdf(crypto, key, key_len, 'C', enckey_cli_to_srv,\n                 enckey_cli_to_srv_len);\n    if (rc < 0) {\n        goto error;\n    }\n    rc = ssh_kdf(crypto, key, key_len, 'D', enckey_srv_to_cli,\n                 enckey_srv_to_cli_len);\n    if (rc < 0) {\n        goto error;\n    }\n    /* Integrity Key */\n    rc = ssh_kdf(crypto, key, key_len, 'E', intkey_cli_to_srv,\n                 intkey_cli_to_srv_len);\n    if (rc < 0) {\n        goto error;\n    }\n    rc = ssh_kdf(crypto, key, key_len, 'F', intkey_srv_to_cli,\n                 intkey_srv_to_cli_len);\n    if (rc < 0) {\n        goto error;\n    }\n\n    if (session->client) {\n        crypto->encryptIV = IV_cli_to_srv;\n        crypto->decryptIV = IV_srv_to_cli;\n        crypto->encryptkey = enckey_cli_to_srv;\n        crypto->decryptkey = enckey_srv_to_cli;\n        crypto->encryptMAC = intkey_cli_to_srv;\n        crypto->decryptMAC = intkey_srv_to_cli;\n    } else {\n        crypto->encryptIV = IV_srv_to_cli;\n        crypto->decryptIV = IV_cli_to_srv;\n        crypto->encryptkey = enckey_srv_to_cli;\n        crypto->decryptkey = enckey_cli_to_srv;\n        crypto->encryptMAC = intkey_srv_to_cli;\n        crypto->decryptMAC = intkey_cli_to_srv;\n    }\n\n#ifdef DEBUG_CRYPTO\n    ssh_log_hexdump(\"Client to Server IV\", IV_cli_to_srv, IV_len);\n    ssh_log_hexdump(\"Server to Client IV\", IV_srv_to_cli, IV_len);\n    ssh_log_hexdump(\"Client to Server Encryption Key\", enckey_cli_to_srv,\n                   enckey_cli_to_srv_len);\n    ssh_log_hexdump(\"Server to Client Encryption Key\", enckey_srv_to_cli,\n                   enckey_srv_to_cli_len);\n    ssh_log_hexdump(\"Client to Server Integrity Key\", intkey_cli_to_srv,\n                   intkey_cli_to_srv_len);\n    ssh_log_hexdump(\"Server to Client Integrity Key\", intkey_srv_to_cli,\n                   intkey_srv_to_cli_len);\n#endif\n\n    rc = 0;\nerror:\n    ssh_string_burn(k_string);\n    SSH_STRING_FREE(k_string);\n    if (rc != 0) {\n        free(IV_cli_to_srv);\n        free(IV_srv_to_cli);\n        free(enckey_cli_to_srv);\n        free(enckey_srv_to_cli);\n        free(intkey_cli_to_srv);\n        free(intkey_srv_to_cli);\n    }\n\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/src/known_hosts.c",
    "content": "/*\n * keyfiles.c - private and public key handling for authentication.\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2003-2009 by Aris Adamantiadis\n * Copyright (c) 2009      by Andreas Schneider <asn@cryptomilk.org>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <ctype.h>\n#include <errno.h>\n#include <stdio.h>\n\n#include \"libssh/priv.h\"\n#include \"libssh/session.h\"\n#include \"libssh/buffer.h\"\n#include \"libssh/misc.h\"\n#include \"libssh/dh.h\"\n#include \"libssh/pki.h\"\n#include \"libssh/options.h\"\n#include \"libssh/knownhosts.h\"\n/*todo: remove this include */\n#include \"libssh/string.h\"\n#include \"libssh/token.h\"\n\n#ifndef _WIN32\n# include <netinet/in.h>\n# include <arpa/inet.h>\n#endif\n\n/**\n * @addtogroup libssh_session\n *\n * @{\n */\n\n/**\n * @internal\n *\n * @brief Return one line of known host file.\n *\n * This will return a token array containing (host|ip), keytype and key.\n *\n * @param[out] file     A pointer to the known host file. Could be pointing to\n *                      NULL at start.\n *\n * @param[in]  filename The file name of the known host file.\n *\n * @param[out] found_type A pointer to a string to be set with the found key\n *                        type.\n *\n * @returns             The found_type type of key (ie \"dsa\",\"ssh-rsa\"). Don't\n *                      free that value. NULL if no match was found or the file\n *                      was not found.\n */\nstatic struct ssh_tokens_st *ssh_get_knownhost_line(FILE **file,\n                                                    const char *filename,\n                                                    const char **found_type)\n{\n    char buffer[4096] = {0};\n    char *ptr;\n    struct ssh_tokens_st *tokens;\n\n    if (*file == NULL) {\n        *file = fopen(filename,\"r\");\n        if (*file == NULL) {\n            return NULL;\n        }\n    }\n\n    while (fgets(buffer, sizeof(buffer), *file)) {\n        ptr = strchr(buffer, '\\n');\n        if (ptr) {\n            *ptr =  '\\0';\n        }\n\n        ptr = strchr(buffer,'\\r');\n        if (ptr) {\n            *ptr = '\\0';\n        }\n\n        if (buffer[0] == '\\0' || buffer[0] == '#') {\n            continue; /* skip empty lines */\n        }\n\n        tokens = ssh_tokenize(buffer, ' ');\n        if (tokens == NULL) {\n            fclose(*file);\n            *file = NULL;\n\n            return NULL;\n        }\n\n        if (tokens->tokens[0] == NULL ||\n            tokens->tokens[1] == NULL ||\n            tokens->tokens[2] == NULL)\n        {\n            /* it should have at least 3 tokens */\n            ssh_tokens_free(tokens);\n            continue;\n        }\n\n        *found_type = tokens->tokens[1];\n\n        return tokens;\n    }\n\n    fclose(*file);\n    *file = NULL;\n\n    /* we did not find anything, end of file*/\n    return NULL;\n}\n\n/**\n * @internal\n *\n * @brief Check the public key in the known host line matches the public key of\n * the currently connected server.\n *\n * @param[in] session   The SSH session to use.\n *\n * @param[in] tokens    A list of tokens in the known_hosts line.\n *\n * @returns             1 if the key matches, 0 if the key doesn't match and -1\n *                      on error.\n */\nstatic int check_public_key(ssh_session session, char **tokens) {\n  ssh_string pubkey_blob = NULL;\n  ssh_buffer pubkey_buffer;\n  char *pubkey_64;\n  int rc;\n\n    /* ssh-dss or ssh-rsa */\n    pubkey_64 = tokens[2];\n    pubkey_buffer = base64_to_bin(pubkey_64);\n\n  if (pubkey_buffer == NULL) {\n    ssh_set_error(session, SSH_FATAL,\n        \"Verifying that server is a known host: base64 error\");\n    return -1;\n  }\n\n  rc = ssh_dh_get_current_server_publickey_blob(session, &pubkey_blob);\n  if (rc != 0) {\n      ssh_buffer_free(pubkey_buffer);\n      return -1;\n  }\n\n  if (ssh_buffer_get_len(pubkey_buffer) != ssh_string_len(pubkey_blob)) {\n    ssh_string_free(pubkey_blob);\n    ssh_buffer_free(pubkey_buffer);\n    return 0;\n  }\n\n  /* now test that they are identical */\n  if (memcmp(ssh_buffer_get(pubkey_buffer), ssh_string_data(pubkey_blob),\n        ssh_buffer_get_len(pubkey_buffer)) != 0) {\n    ssh_string_free(pubkey_blob);\n    ssh_buffer_free(pubkey_buffer);\n    return 0;\n  }\n\n  ssh_string_free(pubkey_blob);\n  ssh_buffer_free(pubkey_buffer);\n  return 1;\n}\n\n/**\n * @internal\n * @brief Check if a hostname matches a openssh-style hashed known host.\n *\n * @param[in]  host     The host to check.\n *\n * @param[in]  hashed   The hashed value.\n *\n * @returns             1 if it matches, 0 otherwise.\n */\nstatic int match_hashed_host(const char *host, const char *sourcehash)\n{\n  /* Openssh hash structure :\n   * |1|base64 encoded salt|base64 encoded hash\n   * hash is produced that way :\n   * hash := HMAC_SHA1(key=salt,data=host)\n   */\n  unsigned char buffer[256] = {0};\n  ssh_buffer salt;\n  ssh_buffer hash;\n  HMACCTX mac;\n  char *source;\n  char *b64hash;\n  int match;\n  unsigned int size;\n\n  if (strncmp(sourcehash, \"|1|\", 3) != 0) {\n    return 0;\n  }\n\n  source = strdup(sourcehash + 3);\n  if (source == NULL) {\n    return 0;\n  }\n\n  b64hash = strchr(source, '|');\n  if (b64hash == NULL) {\n    /* Invalid hash */\n    SAFE_FREE(source);\n\n    return 0;\n  }\n\n  *b64hash = '\\0';\n  b64hash++;\n\n  salt = base64_to_bin(source);\n  if (salt == NULL) {\n    SAFE_FREE(source);\n\n    return 0;\n  }\n\n  hash = base64_to_bin(b64hash);\n  SAFE_FREE(source);\n  if (hash == NULL) {\n    ssh_buffer_free(salt);\n\n    return 0;\n  }\n\n  mac = hmac_init(ssh_buffer_get(salt), ssh_buffer_get_len(salt), SSH_HMAC_SHA1);\n  if (mac == NULL) {\n    ssh_buffer_free(salt);\n    ssh_buffer_free(hash);\n\n    return 0;\n  }\n  size = sizeof(buffer);\n  hmac_update(mac, host, strlen(host));\n  hmac_final(mac, buffer, &size, SSH_HMAC_SHA1);\n\n  if (size == ssh_buffer_get_len(hash) &&\n      memcmp(buffer, ssh_buffer_get(hash), size) == 0) {\n    match = 1;\n  } else {\n    match = 0;\n  }\n\n  ssh_buffer_free(salt);\n  ssh_buffer_free(hash);\n\n  SSH_LOG(SSH_LOG_PACKET,\n      \"Matching a hashed host: %s match=%d\", host, match);\n\n  return match;\n}\n\n/* How it's working :\n * 1- we open the known host file and bitch if it doesn't exist\n * 2- we need to examine each line of the file, until going on state SSH_SERVER_KNOWN_OK:\n *  - there's a match. if the key is good, state is SSH_SERVER_KNOWN_OK,\n *    else it's SSH_SERVER_KNOWN_CHANGED (or SSH_SERVER_FOUND_OTHER)\n *  - there's no match : no change\n */\n\n/**\n * @brief This function is deprecated\n *\n * @deprecated          Please use ssh_session_is_known_server()\n * @see ssh_session_is_known_server()\n */\nint ssh_is_server_known(ssh_session session)\n{\n    FILE *file = NULL;\n    char *host;\n    char *hostport;\n    const char *type;\n    int match;\n    int i = 0;\n    char *files[3];\n\n    struct ssh_tokens_st *tokens;\n\n    int ret = SSH_SERVER_NOT_KNOWN;\n\n    if (session->opts.knownhosts == NULL) {\n        if (ssh_options_apply(session) < 0) {\n            ssh_set_error(session, SSH_REQUEST_DENIED,\n                    \"Can't find a known_hosts file\");\n\n            return SSH_SERVER_FILE_NOT_FOUND;\n        }\n    }\n\n    if (session->opts.host == NULL) {\n        ssh_set_error(session, SSH_FATAL,\n                \"Can't verify host in known hosts if the hostname isn't known\");\n\n        return SSH_SERVER_ERROR;\n    }\n\n    if (session->current_crypto == NULL){\n        ssh_set_error(session, SSH_FATAL,\n                \"ssh_is_host_known called without cryptographic context\");\n\n        return SSH_SERVER_ERROR;\n    }\n\n    host = ssh_lowercase(session->opts.host);\n    hostport = ssh_hostport(host, session->opts.port > 0 ? session->opts.port : 22);\n    if (host == NULL || hostport == NULL) {\n        ssh_set_error_oom(session);\n        SAFE_FREE(host);\n        SAFE_FREE(hostport);\n\n        return SSH_SERVER_ERROR;\n    }\n\n    /* Set the list of known hosts files */\n    i = 0;\n    if (session->opts.global_knownhosts != NULL){\n        files[i++] = session->opts.global_knownhosts;\n    }\n    files[i++] = session->opts.knownhosts;\n    files[i] = NULL;\n    i = 0;\n\n    do {\n        tokens = ssh_get_knownhost_line(&file,\n                                        files[i],\n                                        &type);\n\n        /* End of file, return the current state or use next file */\n        if (tokens == NULL) {\n            ++i;\n            if(files[i] == NULL)\n                break;\n            else\n                continue;\n        }\n        match = match_hashed_host(host, tokens->tokens[0]);\n        if (match == 0){\n            match = match_hostname(hostport, tokens->tokens[0],\n                                   strlen(tokens->tokens[0]));\n        }\n        if (match == 0) {\n            match = match_hostname(host, tokens->tokens[0],\n                                   strlen(tokens->tokens[0]));\n        }\n        if (match == 0) {\n            match = match_hashed_host(hostport, tokens->tokens[0]);\n        }\n        if (match) {\n            ssh_key pubkey = ssh_dh_get_current_server_publickey(session);\n            const char *pubkey_type = ssh_key_type_to_char(ssh_key_type(pubkey));\n\n            /* We got a match. Now check the key type */\n            if (strcmp(pubkey_type, type) != 0) {\n                SSH_LOG(SSH_LOG_PACKET,\n                        \"ssh_is_server_known: server type [%s] doesn't match the \"\n                        \"type [%s] in known_hosts file\",\n                        pubkey_type,\n                        type);\n                /* Different type. We don't override the known_changed error which is\n                 * more important */\n                if (ret != SSH_SERVER_KNOWN_CHANGED)\n                    ret = SSH_SERVER_FOUND_OTHER;\n                ssh_tokens_free(tokens);\n                continue;\n            }\n            /* so we know the key type is good. We may get a good key or a bad key. */\n            match = check_public_key(session, tokens->tokens);\n            ssh_tokens_free(tokens);\n\n            if (match < 0) {\n                ret = SSH_SERVER_ERROR;\n                break;\n            } else if (match == 1) {\n                ret = SSH_SERVER_KNOWN_OK;\n                break;\n            } else if(match == 0) {\n                /* We override the status with the wrong key state */\n                ret = SSH_SERVER_KNOWN_CHANGED;\n            }\n        } else {\n            ssh_tokens_free(tokens);\n        }\n    } while (1);\n\n    if ((ret == SSH_SERVER_NOT_KNOWN) &&\n            (session->opts.StrictHostKeyChecking == 0)) {\n        int rv = ssh_session_update_known_hosts(session);\n        if (rv != SSH_OK) {\n            ret = SSH_SERVER_ERROR;\n        } else {\n            ret = SSH_SERVER_KNOWN_OK;\n        }\n    }\n\n    SAFE_FREE(host);\n    SAFE_FREE(hostport);\n    if (file != NULL) {\n        fclose(file);\n    }\n\n    /* Return the current state at end of file */\n    return ret;\n}\n\n/**\n * @deprecated Please use ssh_session_export_known_hosts_entry()\n * @brief This function is deprecated.\n */\nchar * ssh_dump_knownhost(ssh_session session) {\n    ssh_key server_pubkey = NULL;\n    char *host;\n    char *hostport;\n    size_t len = 4096;\n    char *buffer;\n    char *b64_key;\n    int rc;\n\n    if (session->opts.host == NULL) {\n        ssh_set_error(session, SSH_FATAL,\n                \"Can't write host in known hosts if the hostname isn't known\");\n        return NULL;\n    }\n\n    host = ssh_lowercase(session->opts.host);\n    /* If using a nonstandard port, save the host in the [host]:port format */\n    if (session->opts.port > 0 && session->opts.port != 22) {\n        hostport = ssh_hostport(host, session->opts.port);\n        SAFE_FREE(host);\n        if (hostport == NULL) {\n            return NULL;\n        }\n        host = hostport;\n        hostport = NULL;\n    }\n\n    if (session->current_crypto==NULL) {\n        ssh_set_error(session, SSH_FATAL, \"No current crypto context\");\n        SAFE_FREE(host);\n        return NULL;\n    }\n\n    server_pubkey = ssh_dh_get_current_server_publickey(session);\n    if (server_pubkey == NULL){\n        ssh_set_error(session, SSH_FATAL, \"No public key present\");\n        SAFE_FREE(host);\n        return NULL;\n    }\n\n    buffer = calloc (1, 4096);\n    if (!buffer) {\n        SAFE_FREE(host);\n        return NULL;\n    }\n\n    rc = ssh_pki_export_pubkey_base64(server_pubkey, &b64_key);\n    if (rc < 0) {\n        SAFE_FREE(buffer);\n        SAFE_FREE(host);\n        return NULL;\n    }\n\n    snprintf(buffer, len,\n            \"%s %s %s\\n\",\n            host,\n            server_pubkey->type_c,\n            b64_key);\n\n    SAFE_FREE(host);\n    SAFE_FREE(b64_key);\n\n    return buffer;\n}\n\n/**\n * @deprecated Please use ssh_session_update_known_hosts()\n * @brief This function is deprecated\n */\nint ssh_write_knownhost(ssh_session session)\n{\n    FILE *file;\n    char *buffer = NULL;\n    char *dir;\n    int rc;\n\n    if (session->opts.knownhosts == NULL) {\n        if (ssh_options_apply(session) < 0) {\n            ssh_set_error(session, SSH_FATAL, \"Can't find a known_hosts file\");\n            return SSH_ERROR;\n        }\n    }\n\n    errno = 0;\n    file = fopen(session->opts.knownhosts, \"a\");\n    if (file == NULL) {\n        if (errno == ENOENT) {\n            dir = ssh_dirname(session->opts.knownhosts);\n            if (dir == NULL) {\n                ssh_set_error(session, SSH_FATAL, \"%s\", strerror(errno));\n                return SSH_ERROR;\n            }\n\n            rc = ssh_mkdirs(dir, 0700);\n            if (rc < 0) {\n                ssh_set_error(session, SSH_FATAL,\n                              \"Cannot create %s directory: %s\",\n                              dir, strerror(errno));\n                SAFE_FREE(dir);\n                return SSH_ERROR;\n            }\n            SAFE_FREE(dir);\n\n            errno = 0;\n            file = fopen(session->opts.knownhosts, \"a\");\n            if (file == NULL) {\n                ssh_set_error(session, SSH_FATAL,\n                              \"Couldn't open known_hosts file %s\"\n                              \" for appending: %s\",\n                              session->opts.knownhosts, strerror(errno));\n                return SSH_ERROR;\n            }\n        } else {\n            ssh_set_error(session, SSH_FATAL,\n                          \"Couldn't open known_hosts file %s for appending: %s\",\n                          session->opts.knownhosts, strerror(errno));\n            return SSH_ERROR;\n        }\n    }\n\n    rc = ssh_session_export_known_hosts_entry(session, &buffer);\n    if (rc != SSH_OK) {\n        fclose(file);\n        return SSH_ERROR;\n    }\n\n    if (fwrite(buffer, strlen(buffer), 1, file) != 1 || ferror(file)) {\n        SAFE_FREE(buffer);\n        fclose(file);\n        return -1;\n    }\n\n    SAFE_FREE(buffer);\n    fclose(file);\n    return 0;\n}\n\n#define KNOWNHOSTS_MAXTYPES 10\n\n/** @} */\n"
  },
  {
    "path": "src/libssh/src/knownhosts.c",
    "content": "/*\n * known_hosts: Host and public key verification.\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2003-2009 by Aris Adamantiadis\n * Copyright (c) 2009-2017 by Andreas Schneider <asn@cryptomilk.org>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <ctype.h>\n#include <errno.h>\n#include <stdio.h>\n#include <stdlib.h>\n\n#ifndef _WIN32\n#include <arpa/inet.h>\n#include <netinet/in.h>\n#endif\n\n#include \"libssh/priv.h\"\n#include \"libssh/dh.h\"\n#include \"libssh/session.h\"\n#include \"libssh/options.h\"\n#include \"libssh/misc.h\"\n#include \"libssh/pki.h\"\n#include \"libssh/dh.h\"\n#include \"libssh/knownhosts.h\"\n#include \"libssh/token.h\"\n\n/**\n * @addtogroup libssh_session\n *\n * @{\n */\n\nstatic int hash_hostname(const char *name,\n                         unsigned char *salt,\n                         unsigned int salt_size,\n                         unsigned char **hash,\n                         unsigned int *hash_size)\n{\n    HMACCTX mac_ctx;\n\n    mac_ctx = hmac_init(salt, salt_size, SSH_HMAC_SHA1);\n    if (mac_ctx == NULL) {\n        return SSH_ERROR;\n    }\n\n    hmac_update(mac_ctx, name, strlen(name));\n    hmac_final(mac_ctx, *hash, hash_size, SSH_HMAC_SHA1);\n\n    return SSH_OK;\n}\n\nstatic int match_hashed_hostname(const char *host, const char *hashed_host)\n{\n    char *hashed;\n    char *b64_hash;\n    ssh_buffer salt = NULL;\n    ssh_buffer hash = NULL;\n    unsigned char hashed_buf[256] = {0};\n    unsigned char *hashed_buf_ptr = hashed_buf;\n    unsigned int hashed_buf_size = sizeof(hashed_buf);\n    int cmp;\n    int rc;\n    int match = 0;\n\n    cmp = strncmp(hashed_host, \"|1|\", 3);\n    if (cmp != 0) {\n        return 0;\n    }\n\n    hashed = strdup(hashed_host + 3);\n    if (hashed == NULL) {\n        return 0;\n    }\n\n    b64_hash = strchr(hashed, '|');\n    if (b64_hash == NULL) {\n        goto error;\n    }\n    *b64_hash = '\\0';\n    b64_hash++;\n\n    salt = base64_to_bin(hashed);\n    if (salt == NULL) {\n        goto error;\n    }\n\n    hash = base64_to_bin(b64_hash);\n    if (hash == NULL) {\n        goto error;\n    }\n\n    rc = hash_hostname(host,\n                       ssh_buffer_get(salt),\n                       ssh_buffer_get_len(salt),\n                       &hashed_buf_ptr,\n                       &hashed_buf_size);\n    if (rc != SSH_OK) {\n        goto error;\n    }\n\n    if (hashed_buf_size != ssh_buffer_get_len(hash)) {\n        goto error;\n    }\n\n    cmp = memcmp(hashed_buf, ssh_buffer_get(hash), hashed_buf_size);\n    if (cmp == 0) {\n        match = 1;\n    }\n\nerror:\n    free(hashed);\n    SSH_BUFFER_FREE(salt);\n    SSH_BUFFER_FREE(hash);\n\n    return match;\n}\n\n/**\n * @brief Free an allocated ssh_knownhosts_entry.\n *\n * Use SSH_KNOWNHOSTS_ENTRY_FREE() to set the pointer to NULL.\n *\n * @param[in]  entry     The entry to free.\n */\nvoid ssh_knownhosts_entry_free(struct ssh_knownhosts_entry *entry)\n{\n    if (entry == NULL) {\n        return;\n    }\n\n    SAFE_FREE(entry->hostname);\n    SAFE_FREE(entry->unparsed);\n    ssh_key_free(entry->publickey);\n    SAFE_FREE(entry->comment);\n    SAFE_FREE(entry);\n}\n\nstatic int known_hosts_read_line(FILE *fp,\n                                 char *buf,\n                                 size_t buf_size,\n                                 size_t *buf_len,\n                                 size_t *lineno)\n{\n    while (fgets(buf, buf_size, fp) != NULL) {\n        size_t len;\n        if (buf[0] == '\\0') {\n            continue;\n        }\n\n        *lineno += 1;\n        len = strlen(buf);\n        if (buf_len != NULL) {\n            *buf_len = len;\n        }\n        if (buf[len - 1] == '\\n' || feof(fp)) {\n            return 0;\n        } else {\n            errno = E2BIG;\n            return -1;\n        }\n    }\n\n    return -1;\n}\n\nstatic int\nssh_known_hosts_entries_compare(struct ssh_knownhosts_entry *k1,\n                                struct ssh_knownhosts_entry *k2)\n{\n    int cmp;\n\n    if (k1 == NULL || k2 == NULL) {\n        return 1;\n    }\n\n    cmp = strcmp(k1->hostname, k2->hostname);\n    if (cmp != 0) {\n        return cmp;\n    }\n\n    cmp = ssh_key_cmp(k1->publickey, k2->publickey, SSH_KEY_CMP_PUBLIC);\n    if (cmp != 0) {\n        return cmp;\n    }\n\n    return 0;\n}\n\n/* This method reads the known_hosts file referenced by the path\n * in  filename  argument, and entries matching the  match  argument\n * will be added to the list in  entries  argument.\n * If the  entries  list is NULL, it will allocate a new list. Caller\n * is responsible to free it even if an error occurs.\n */\nstatic int ssh_known_hosts_read_entries(const char *match,\n                                        const char *filename,\n                                        struct ssh_list **entries)\n{\n    char line[8192];\n    size_t lineno = 0;\n    size_t len = 0;\n    FILE *fp;\n    int rc;\n\n    fp = fopen(filename, \"r\");\n    if (fp == NULL) {\n        SSH_LOG(SSH_LOG_WARN, \"Failed to open the known_hosts file '%s': %s\",\n                filename, strerror(errno));\n        /* The missing file is not an error here */\n        return SSH_OK;\n    }\n\n    if (*entries == NULL) {\n        *entries = ssh_list_new();\n        if (*entries == NULL) {\n            fclose(fp);\n            return SSH_ERROR;\n        }\n    }\n\n    for (rc = known_hosts_read_line(fp, line, sizeof(line), &len, &lineno);\n         rc == 0;\n         rc = known_hosts_read_line(fp, line, sizeof(line), &len, &lineno)) {\n        struct ssh_knownhosts_entry *entry = NULL;\n        struct ssh_iterator *it = NULL;\n        char *p = NULL;\n\n        if (line[len] != '\\n') {\n            len = strcspn(line, \"\\n\");\n        }\n        line[len] = '\\0';\n\n        /* Skip leading spaces */\n        for (p = line; isspace((int)p[0]); p++);\n\n        /* Skip comments and empty lines */\n        if (p[0] == '\\0' || p[0] == '#') {\n            continue;\n        }\n\n        /* Skip lines starting with markers (@cert-authority, @revoked):\n         * we do not completely support them anyway */\n        if (p[0] == '@') {\n            continue;\n        }\n\n        rc = ssh_known_hosts_parse_line(match,\n                                        line,\n                                        &entry);\n        if (rc == SSH_AGAIN) {\n            continue;\n        } else if (rc != SSH_OK) {\n            goto error;\n        }\n\n        /* Check for duplicates */\n        for (it = ssh_list_get_iterator(*entries);\n             it != NULL;\n             it = it->next) {\n            struct ssh_knownhosts_entry *entry2;\n            int cmp;\n            entry2 = ssh_iterator_value(struct ssh_knownhosts_entry *, it);\n            cmp = ssh_known_hosts_entries_compare(entry, entry2);\n            if (cmp == 0) {\n                ssh_knownhosts_entry_free(entry);\n                entry = NULL;\n                break;\n            }\n        }\n        if (entry != NULL) {\n            ssh_list_append(*entries, entry);\n        }\n    }\n\n    fclose(fp);\n    return SSH_OK;\nerror:\n    fclose(fp);\n    return SSH_ERROR;\n}\n\nstatic char *ssh_session_get_host_port(ssh_session session)\n{\n    char *host_port;\n    char *host;\n\n    if (session->opts.host == NULL) {\n        ssh_set_error(session,\n                      SSH_FATAL,\n                      \"Can't verify server in known hosts if the host we \"\n                      \"should connect to has not been set\");\n\n        return NULL;\n    }\n\n    host = ssh_lowercase(session->opts.host);\n    if (host == NULL) {\n        ssh_set_error_oom(session);\n        return NULL;\n    }\n\n    if (session->opts.port == 0 || session->opts.port == 22) {\n        host_port = host;\n    } else {\n        host_port = ssh_hostport(host, session->opts.port);\n        SAFE_FREE(host);\n        if (host_port == NULL) {\n            ssh_set_error_oom(session);\n            return NULL;\n        }\n    }\n\n    return host_port;\n}\n\n/**\n * @internal\n * @brief Check which host keys should be preferred for the session.\n *\n * This checks the known_hosts file to find out which algorithms should be\n * preferred for the connection we are going to establish.\n *\n * @param[in]  session  The ssh session to use.\n *\n * @return A list of supported key types, NULL on error.\n */\nstruct ssh_list *ssh_known_hosts_get_algorithms(ssh_session session)\n{\n    struct ssh_list *entry_list = NULL;\n    struct ssh_iterator *it = NULL;\n    char *host_port = NULL;\n    size_t count;\n    struct ssh_list *list = NULL;\n    int list_error = 0;\n    int rc;\n\n    if (session->opts.knownhosts == NULL ||\n        session->opts.global_knownhosts == NULL) {\n        if (ssh_options_apply(session) < 0) {\n            ssh_set_error(session,\n                          SSH_REQUEST_DENIED,\n                          \"Can't find a known_hosts file\");\n\n            return NULL;\n        }\n    }\n\n    host_port = ssh_session_get_host_port(session);\n    if (host_port == NULL) {\n        return NULL;\n    }\n\n    list = ssh_list_new();\n    if (list == NULL) {\n        SAFE_FREE(host_port);\n        return NULL;\n    }\n\n    rc = ssh_known_hosts_read_entries(host_port,\n                                      session->opts.knownhosts,\n                                      &entry_list);\n    if (rc != 0) {\n        ssh_list_free(entry_list);\n        ssh_list_free(list);\n        return NULL;\n    }\n\n    rc = ssh_known_hosts_read_entries(host_port,\n                                      session->opts.global_knownhosts,\n                                      &entry_list);\n    SAFE_FREE(host_port);\n    if (rc != 0) {\n        ssh_list_free(entry_list);\n        ssh_list_free(list);\n        return NULL;\n    }\n\n    if (entry_list == NULL) {\n        ssh_list_free(list);\n        return NULL;\n    }\n\n    count = ssh_list_count(entry_list);\n    if (count == 0) {\n        ssh_list_free(list);\n        ssh_list_free(entry_list);\n        return NULL;\n    }\n\n    for (it = ssh_list_get_iterator(entry_list);\n         it != NULL;\n         it = ssh_list_get_iterator(entry_list)) {\n        struct ssh_iterator *it2 = NULL;\n        struct ssh_knownhosts_entry *entry = NULL;\n        const char *algo = NULL;\n        bool present = false;\n\n        entry = ssh_iterator_value(struct ssh_knownhosts_entry *, it);\n        algo = entry->publickey->type_c;\n\n        /* Check for duplicates */\n        for (it2 = ssh_list_get_iterator(list);\n             it2 != NULL;\n             it2 = it2->next) {\n            char *alg2 = ssh_iterator_value(char *, it2);\n            int cmp = strcmp(alg2, algo);\n            if (cmp == 0) {\n                present = true;\n                break;\n            }\n        }\n\n        /* Add to the new list only if it is unique */\n        if (!present) {\n            rc = ssh_list_append(list, algo);\n            if (rc != SSH_OK) {\n               list_error = 1;\n            }\n        }\n\n        ssh_knownhosts_entry_free(entry);\n        ssh_list_remove(entry_list, it);\n    }\n    ssh_list_free(entry_list);\n    if (list_error) {\n        goto error;\n    }\n\n    return list;\nerror:\n    ssh_list_free(list);\n    return NULL;\n}\n\n/**\n * @internal\n *\n * @brief   Returns a static string containing a list of the signature types the\n * given key type can generate.\n *\n * @returns A static cstring containing the signature types the key is able to\n * generate separated by commas; NULL in case of error\n */\nstatic const char *ssh_known_host_sigs_from_hostkey_type(enum ssh_keytypes_e type)\n{\n    switch (type) {\n    case SSH_KEYTYPE_RSA:\n        return \"rsa-sha2-512,rsa-sha2-256,ssh-rsa\";\n    case SSH_KEYTYPE_ED25519:\n        return \"ssh-ed25519\";\n#ifdef HAVE_DSA\n    case SSH_KEYTYPE_DSS:\n        return \"ssh-dss\";\n#endif\n#ifdef HAVE_ECDH\n    case SSH_KEYTYPE_ECDSA_P256:\n        return \"ecdsa-sha2-nistp256\";\n    case SSH_KEYTYPE_ECDSA_P384:\n        return \"ecdsa-sha2-nistp384\";\n    case SSH_KEYTYPE_ECDSA_P521:\n        return \"ecdsa-sha2-nistp521\";\n#endif\n    case SSH_KEYTYPE_UNKNOWN:\n    default:\n        SSH_LOG(SSH_LOG_WARN, \"The given type %d is not a base private key type \"\n                \"or is unsupported\", type);\n        return NULL;\n    }\n}\n\n/**\n * @internal\n * @brief Get the host keys algorithms identifiers from the known_hosts files\n *\n * This expands the signatures types that can be generated from the keys types\n * present in the known_hosts files\n *\n * @param[in]  session  The ssh session to use.\n *\n * @return A newly allocated cstring containing a list of signature algorithms\n * that can be generated by the host using the keys listed in the known_hosts\n * files, NULL on error.\n */\nchar *ssh_known_hosts_get_algorithms_names(ssh_session session)\n{\n    char methods_buffer[256 + 1] = {0};\n    struct ssh_list *entry_list = NULL;\n    struct ssh_iterator *it = NULL;\n    char *host_port = NULL;\n    size_t count;\n    bool needcomma = false;\n    char *names;\n\n    int rc;\n\n    if (session->opts.knownhosts == NULL ||\n        session->opts.global_knownhosts == NULL) {\n        if (ssh_options_apply(session) < 0) {\n            ssh_set_error(session,\n                          SSH_REQUEST_DENIED,\n                          \"Can't find a known_hosts file\");\n\n            return NULL;\n        }\n    }\n\n    host_port = ssh_session_get_host_port(session);\n    if (host_port == NULL) {\n        return NULL;\n    }\n\n    rc = ssh_known_hosts_read_entries(host_port,\n                                      session->opts.knownhosts,\n                                      &entry_list);\n    if (rc != 0) {\n        SAFE_FREE(host_port);\n        ssh_list_free(entry_list);\n        return NULL;\n    }\n\n    rc = ssh_known_hosts_read_entries(host_port,\n                                      session->opts.global_knownhosts,\n                                      &entry_list);\n    SAFE_FREE(host_port);\n    if (rc != 0) {\n        ssh_list_free(entry_list);\n        return NULL;\n    }\n\n    if (entry_list == NULL) {\n        return NULL;\n    }\n\n    count = ssh_list_count(entry_list);\n    if (count == 0) {\n        ssh_list_free(entry_list);\n        return NULL;\n    }\n\n    for (it = ssh_list_get_iterator(entry_list);\n         it != NULL;\n         it = ssh_list_get_iterator(entry_list))\n    {\n        struct ssh_knownhosts_entry *entry = NULL;\n        const char *algo = NULL;\n\n        entry = ssh_iterator_value(struct ssh_knownhosts_entry *, it);\n        algo = ssh_known_host_sigs_from_hostkey_type(entry->publickey->type);\n        if (algo == NULL) {\n            continue;\n        }\n\n        if (needcomma) {\n            strncat(methods_buffer,\n                    \",\",\n                    sizeof(methods_buffer) - strlen(methods_buffer) - 1);\n        }\n\n        strncat(methods_buffer,\n                algo,\n                sizeof(methods_buffer) - strlen(methods_buffer) - 1);\n        needcomma = true;\n\n        ssh_knownhosts_entry_free(entry);\n        ssh_list_remove(entry_list, it);\n    }\n\n    ssh_list_free(entry_list);\n\n    names = ssh_remove_duplicates(methods_buffer);\n\n    return names;\n}\n\n/**\n * @brief Parse a line from a known_hosts entry into a structure\n *\n * This parses an known_hosts entry into a structure with the key in a libssh\n * consumeable form. You can use the PKI key function to further work with it.\n *\n * @param[in]  hostname     The hostname to match the line to\n *\n * @param[in]  line         The line to compare and parse if we have a hostname\n *                          match.\n *\n * @param[in]  entry        A pointer to store the the allocated known_hosts\n *                          entry structure. The user needs to free the memory\n *                          using SSH_KNOWNHOSTS_ENTRY_FREE().\n *\n * @return SSH_OK on success, SSH_ERROR otherwise.\n */\nint ssh_known_hosts_parse_line(const char *hostname,\n                               const char *line,\n                               struct ssh_knownhosts_entry **entry)\n{\n    struct ssh_knownhosts_entry *e = NULL;\n    char *known_host = NULL;\n    char *p;\n    enum ssh_keytypes_e key_type;\n    int match = 0;\n    int rc = SSH_OK;\n\n    known_host = strdup(line);\n    if (known_host == NULL) {\n        return SSH_ERROR;\n    }\n\n    /* match pattern for hostname or hashed hostname */\n    p = strtok(known_host, \" \");\n    if (p == NULL ) {\n        free(known_host);\n        return SSH_ERROR;\n    }\n\n    e = calloc(1, sizeof(struct ssh_knownhosts_entry));\n    if (e == NULL) {\n        free(known_host);\n        return SSH_ERROR;\n    }\n\n    if (hostname != NULL) {\n        char *host_port = NULL;\n        char *q = NULL;\n\n        /* Hashed */\n        if (p[0] == '|') {\n            match = match_hashed_hostname(hostname, p);\n        }\n\n        for (q = strtok(p, \",\");\n             q != NULL;\n             q = strtok(NULL, \",\")) {\n            int cmp;\n\n            if (q[0] == '[' && hostname[0] != '[') {\n                /* Corner case: We have standard port so we do not have\n                 * hostname in square braces. But the patern is enclosed\n                 * in braces with, possibly standard or wildcard, port.\n                 * We need to test against [host]:port pair here.\n                 */\n                if (host_port == NULL) {\n                    host_port = ssh_hostport(hostname, 22);\n                    if (host_port == NULL) {\n                        rc = SSH_ERROR;\n                        goto out;\n                    }\n                }\n\n                cmp = match_hostname(host_port, q, strlen(q));\n            } else {\n                cmp = match_hostname(hostname, q, strlen(q));\n            }\n            if (cmp == 1) {\n                match = 1;\n                break;\n            }\n        }\n        free(host_port);\n\n        if (match == 0) {\n            rc = SSH_AGAIN;\n            goto out;\n        }\n\n        e->hostname = strdup(hostname);\n        if (e->hostname == NULL) {\n            rc = SSH_ERROR;\n            goto out;\n        }\n    }\n\n    /* Restart parsing */\n    SAFE_FREE(known_host);\n    known_host = strdup(line);\n    if (known_host == NULL) {\n        rc = SSH_ERROR;\n        goto out;\n    }\n\n    p = strtok(known_host, \" \");\n    if (p == NULL ) {\n        rc = SSH_ERROR;\n        goto out;\n    }\n\n    e->unparsed = strdup(p);\n    if (e->unparsed == NULL) {\n        rc = SSH_ERROR;\n        goto out;\n    }\n\n    /* pubkey type */\n    p = strtok(NULL, \" \");\n    if (p == NULL) {\n        rc = SSH_ERROR;\n        goto out;\n    }\n\n    key_type = ssh_key_type_from_name(p);\n    if (key_type == SSH_KEYTYPE_UNKNOWN) {\n        SSH_LOG(SSH_LOG_WARN, \"key type '%s' unknown!\", p);\n        rc = SSH_ERROR;\n        goto out;\n    }\n\n    /* public key */\n    p = strtok(NULL, \" \");\n    if (p == NULL) {\n        rc = SSH_ERROR;\n        goto out;\n    }\n\n    rc = ssh_pki_import_pubkey_base64(p,\n                                      key_type,\n                                      &e->publickey);\n    if (rc != SSH_OK) {\n        SSH_LOG(SSH_LOG_WARN,\n                \"Failed to parse %s key for entry: %s!\",\n                ssh_key_type_to_char(key_type),\n                e->unparsed);\n        goto out;\n    }\n\n    /* comment */\n    p = strtok(NULL, \" \");\n    if (p != NULL) {\n        p = strstr(line, p);\n        if (p != NULL) {\n            e->comment = strdup(p);\n            if (e->comment == NULL) {\n                rc = SSH_ERROR;\n                goto out;\n            }\n        }\n    }\n\n    *entry = e;\n    SAFE_FREE(known_host);\n\n    return SSH_OK;\nout:\n    SAFE_FREE(known_host);\n    ssh_knownhosts_entry_free(e);\n    return rc;\n}\n\n/**\n * @brief Check if the set hostname and port matches an entry in known_hosts.\n *\n * This check if the set hostname and port has an entry in the known_hosts file.\n * You need to set at least the hostname using ssh_options_set().\n *\n * @param[in]  session  The session with with the values set to check.\n *\n * @return A ssh_known_hosts_e return value.\n */\nenum ssh_known_hosts_e ssh_session_has_known_hosts_entry(ssh_session session)\n{\n    struct ssh_list *entry_list = NULL;\n    struct ssh_iterator *it = NULL;\n    char *host_port = NULL;\n    bool global_known_hosts_found = false;\n    bool known_hosts_found = false;\n    int rc;\n\n    if (session->opts.knownhosts == NULL) {\n        if (ssh_options_apply(session) < 0) {\n            ssh_set_error(session,\n                          SSH_REQUEST_DENIED,\n                          \"Cannot find a known_hosts file\");\n\n            return SSH_KNOWN_HOSTS_NOT_FOUND;\n        }\n    }\n\n    if (session->opts.knownhosts == NULL &&\n        session->opts.global_knownhosts == NULL) {\n            ssh_set_error(session,\n                          SSH_REQUEST_DENIED,\n                          \"No path set for a known_hosts file\");\n\n            return SSH_KNOWN_HOSTS_NOT_FOUND;\n    }\n\n    if (session->opts.knownhosts != NULL) {\n        known_hosts_found = ssh_file_readaccess_ok(session->opts.knownhosts);\n        if (!known_hosts_found) {\n            SSH_LOG(SSH_LOG_WARN, \"Cannot access file %s\",\n                    session->opts.knownhosts);\n        }\n    }\n\n    if (session->opts.global_knownhosts != NULL) {\n        global_known_hosts_found =\n                ssh_file_readaccess_ok(session->opts.global_knownhosts);\n        if (!global_known_hosts_found) {\n            SSH_LOG(SSH_LOG_WARN, \"Cannot access file %s\",\n                    session->opts.global_knownhosts);\n        }\n    }\n\n    if ((!known_hosts_found) && (!global_known_hosts_found)) {\n        ssh_set_error(session,\n                      SSH_REQUEST_DENIED,\n                      \"Cannot find a known_hosts file\");\n\n        return SSH_KNOWN_HOSTS_NOT_FOUND;\n    }\n\n    host_port = ssh_session_get_host_port(session);\n    if (host_port == NULL) {\n        return SSH_KNOWN_HOSTS_ERROR;\n    }\n\n    if (known_hosts_found) {\n        rc = ssh_known_hosts_read_entries(host_port,\n                                          session->opts.knownhosts,\n                                          &entry_list);\n        if (rc != 0) {\n            SAFE_FREE(host_port);\n            ssh_list_free(entry_list);\n            return SSH_KNOWN_HOSTS_ERROR;\n        }\n    }\n\n    if (global_known_hosts_found) {\n        rc = ssh_known_hosts_read_entries(host_port,\n                                          session->opts.global_knownhosts,\n                                          &entry_list);\n        if (rc != 0) {\n            SAFE_FREE(host_port);\n            ssh_list_free(entry_list);\n            return SSH_KNOWN_HOSTS_ERROR;\n        }\n    }\n\n    SAFE_FREE(host_port);\n\n    if (ssh_list_count(entry_list) == 0) {\n        ssh_list_free(entry_list);\n        return SSH_KNOWN_HOSTS_UNKNOWN;\n    }\n\n    for (it = ssh_list_get_iterator(entry_list);\n         it != NULL;\n         it = ssh_list_get_iterator(entry_list)) {\n        struct ssh_knownhosts_entry *entry = NULL;\n\n        entry = ssh_iterator_value(struct ssh_knownhosts_entry *, it);\n        ssh_knownhosts_entry_free(entry);\n        ssh_list_remove(entry_list, it);\n    }\n    ssh_list_free(entry_list);\n\n    return SSH_KNOWN_HOSTS_OK;\n}\n\n/**\n * @brief Export the current session information to a known_hosts string.\n *\n * This exports the current information of a session which is connected so a\n * ssh server into an entry line which can be added to a known_hosts file.\n *\n * @param[in]  session  The session with information to export.\n *\n * @param[in]  pentry_string A pointer to a string to store the alloocated\n *                           line of the entry. The user must free it using\n *                           ssh_string_free_char().\n *\n * @return SSH_OK on succcess, SSH_ERROR otherwise.\n */\nint ssh_session_export_known_hosts_entry(ssh_session session,\n                                         char **pentry_string)\n{\n    ssh_key server_pubkey = NULL;\n    char *host = NULL;\n    char entry_buf[4096] = {0};\n    char *b64_key = NULL;\n    int rc;\n\n    if (pentry_string == NULL) {\n        ssh_set_error_invalid(session);\n        return SSH_ERROR;\n    }\n\n    if (session->opts.host == NULL) {\n        ssh_set_error(session, SSH_FATAL,\n                      \"Can't create known_hosts entry - hostname unknown\");\n        return SSH_ERROR;\n    }\n\n    host = ssh_session_get_host_port(session);\n    if (host == NULL) {\n        return SSH_ERROR;\n    }\n\n    if (session->current_crypto == NULL) {\n        ssh_set_error(session, SSH_FATAL,\n                      \"No current crypto context, please connect first\");\n        SAFE_FREE(host);\n        return SSH_ERROR;\n    }\n\n    server_pubkey = ssh_dh_get_current_server_publickey(session);\n    if (server_pubkey == NULL){\n        ssh_set_error(session, SSH_FATAL, \"No public key present\");\n        SAFE_FREE(host);\n        return SSH_ERROR;\n    }\n\n    rc = ssh_pki_export_pubkey_base64(server_pubkey, &b64_key);\n    if (rc < 0) {\n        SAFE_FREE(host);\n        return SSH_ERROR;\n    }\n\n    snprintf(entry_buf, sizeof(entry_buf),\n                \"%s %s %s\\n\",\n                host,\n                server_pubkey->type_c,\n                b64_key);\n\n    SAFE_FREE(host);\n    SAFE_FREE(b64_key);\n\n    *pentry_string = strdup(entry_buf);\n    if (*pentry_string == NULL) {\n        return SSH_ERROR;\n    }\n\n    return SSH_OK;\n}\n\n/**\n * @brief Add the current connected server to the user known_hosts file.\n *\n * This adds the currently connected server to the known_hosts file by\n * appending a new line at the end. The global known_hosts file is considered\n * read-only so it is not touched by this function.\n *\n * @param[in]  session  The session to use to write the entry.\n *\n * @return SSH_OK on success, SSH_ERROR otherwise.\n */\nint ssh_session_update_known_hosts(ssh_session session)\n{\n    FILE *fp = NULL;\n    char *entry = NULL;\n    char *dir = NULL;\n    size_t nwritten;\n    size_t len;\n    int rc;\n\n    if (session->opts.knownhosts == NULL) {\n        rc = ssh_options_apply(session);\n        if (rc != SSH_OK) {\n            ssh_set_error(session, SSH_FATAL, \"Can't find a known_hosts file\");\n            return SSH_ERROR;\n        }\n    }\n\n    errno = 0;\n    fp = fopen(session->opts.knownhosts, \"a\");\n    if (fp == NULL) {\n        if (errno == ENOENT) {\n            dir = ssh_dirname(session->opts.knownhosts);\n            if (dir == NULL) {\n                ssh_set_error(session, SSH_FATAL, \"%s\", strerror(errno));\n                return SSH_ERROR;\n            }\n\n            rc = ssh_mkdirs(dir, 0700);\n            if (rc < 0) {\n                ssh_set_error(session, SSH_FATAL,\n                              \"Cannot create %s directory: %s\",\n                              dir, strerror(errno));\n                SAFE_FREE(dir);\n                return SSH_ERROR;\n            }\n            SAFE_FREE(dir);\n\n            errno = 0;\n            fp = fopen(session->opts.knownhosts, \"a\");\n            if (fp == NULL) {\n                ssh_set_error(session, SSH_FATAL,\n                              \"Couldn't open known_hosts file %s\"\n                              \" for appending: %s\",\n                              session->opts.knownhosts, strerror(errno));\n                return SSH_ERROR;\n            }\n        } else {\n            ssh_set_error(session, SSH_FATAL,\n                          \"Couldn't open known_hosts file %s for appending: %s\",\n                          session->opts.knownhosts, strerror(errno));\n            return SSH_ERROR;\n        }\n    }\n\n    rc = ssh_session_export_known_hosts_entry(session, &entry);\n    if (rc != SSH_OK) {\n        fclose(fp);\n        return rc;\n    }\n\n    len = strlen(entry);\n    nwritten = fwrite(entry, sizeof(char), len, fp);\n    SAFE_FREE(entry);\n    if (nwritten != len || ferror(fp)) {\n        ssh_set_error(session, SSH_FATAL,\n                      \"Couldn't append to known_hosts file %s: %s\",\n                      session->opts.knownhosts, strerror(errno));\n        fclose(fp);\n        return SSH_ERROR;\n    }\n\n    fclose(fp);\n    return SSH_OK;\n}\n\nstatic enum ssh_known_hosts_e\nssh_known_hosts_check_server_key(const char *hosts_entry,\n                                 const char *filename,\n                                 ssh_key server_key,\n                                 struct ssh_knownhosts_entry **pentry)\n{\n    struct ssh_list *entry_list = NULL;\n    struct ssh_iterator *it = NULL;\n    enum ssh_known_hosts_e found = SSH_KNOWN_HOSTS_UNKNOWN;\n    int rc;\n\n    rc = ssh_known_hosts_read_entries(hosts_entry,\n                                      filename,\n                                      &entry_list);\n    if (rc != 0) {\n        ssh_list_free(entry_list);\n        return SSH_KNOWN_HOSTS_UNKNOWN;\n    }\n\n    it = ssh_list_get_iterator(entry_list);\n    if (it == NULL) {\n        ssh_list_free(entry_list);\n        return SSH_KNOWN_HOSTS_UNKNOWN;\n    }\n\n    for (;it != NULL; it = it->next) {\n        struct ssh_knownhosts_entry *entry = NULL;\n        int cmp;\n\n        entry = ssh_iterator_value(struct ssh_knownhosts_entry *, it);\n\n        cmp = ssh_key_cmp(server_key, entry->publickey, SSH_KEY_CMP_PUBLIC);\n        if (cmp == 0) {\n            found = SSH_KNOWN_HOSTS_OK;\n            if (pentry != NULL) {\n                *pentry = entry;\n                ssh_list_remove(entry_list, it);\n            }\n            break;\n        }\n\n        if (ssh_key_type(server_key) == ssh_key_type(entry->publickey)) {\n            found = SSH_KNOWN_HOSTS_CHANGED;\n            continue;\n        }\n\n        if (found != SSH_KNOWN_HOSTS_CHANGED) {\n            found = SSH_KNOWN_HOSTS_OTHER;\n        }\n    }\n\n    for (it = ssh_list_get_iterator(entry_list);\n         it != NULL;\n         it = ssh_list_get_iterator(entry_list)) {\n        struct ssh_knownhosts_entry *entry = NULL;\n\n        entry = ssh_iterator_value(struct ssh_knownhosts_entry *, it);\n        ssh_knownhosts_entry_free(entry);\n        ssh_list_remove(entry_list, it);\n    }\n    ssh_list_free(entry_list);\n\n    return found;\n}\n\n/**\n * @brief Get the known_hosts entry for the current connected session.\n *\n * @param[in]  session  The session to validate.\n *\n * @param[in]  pentry   A pointer to store the allocated known hosts entry.\n *\n * @returns SSH_KNOWN_HOSTS_OK:        The server is known and has not changed.\\n\n *          SSH_KNOWN_HOSTS_CHANGED:   The server key has changed. Either you\n *                                     are under attack or the administrator\n *                                     changed the key. You HAVE to warn the\n *                                     user about a possible attack.\\n\n *          SSH_KNOWN_HOSTS_OTHER:     The server gave use a key of a type while\n *                                     we had an other type recorded. It is a\n *                                     possible attack.\\n\n *          SSH_KNOWN_HOSTS_UNKNOWN:   The server is unknown. User should\n *                                     confirm the public key hash is correct.\\n\n *          SSH_KNOWN_HOSTS_NOT_FOUND: The known host file does not exist. The\n *                                     host is thus unknown. File will be\n *                                     created if host key is accepted.\\n\n *          SSH_KNOWN_HOSTS_ERROR:     There had been an eror checking the host.\n *\n * @see ssh_knownhosts_entry_free()\n */\nenum ssh_known_hosts_e\nssh_session_get_known_hosts_entry(ssh_session session,\n                                  struct ssh_knownhosts_entry **pentry)\n{\n    enum ssh_known_hosts_e old_rv, rv = SSH_KNOWN_HOSTS_UNKNOWN;\n\n    if (session->opts.knownhosts == NULL) {\n        if (ssh_options_apply(session) < 0) {\n            ssh_set_error(session,\n                          SSH_REQUEST_DENIED,\n                          \"Can't find a known_hosts file\");\n\n            return SSH_KNOWN_HOSTS_NOT_FOUND;\n        }\n    }\n\n    rv = ssh_session_get_known_hosts_entry_file(session,\n                                                session->opts.knownhosts,\n                                                pentry);\n    if (rv == SSH_KNOWN_HOSTS_OK) {\n        /* We already found a match in the first file: return */\n        return rv;\n    }\n\n    old_rv = rv;\n    rv = ssh_session_get_known_hosts_entry_file(session,\n                                                session->opts.global_knownhosts,\n                                                pentry);\n\n    /* If we did not find any match at all:  we report the previous result */\n    if (rv == SSH_KNOWN_HOSTS_UNKNOWN) {\n        if (session->opts.StrictHostKeyChecking == 0) {\n            return SSH_KNOWN_HOSTS_OK;\n        }\n        return old_rv;\n    }\n\n    /* We found some match: return it */\n    return rv;\n\n}\n\n/**\n * @brief Get the known_hosts entry for the current connected session\n *        from the given known_hosts file.\n *\n * @param[in]  session  The session to validate.\n *\n * @param[in]  filename The filename to parse.\n *\n * @param[in]  pentry   A pointer to store the allocated known hosts entry.\n *\n * @returns SSH_KNOWN_HOSTS_OK:        The server is known and has not changed.\\n\n *          SSH_KNOWN_HOSTS_CHANGED:   The server key has changed. Either you\n *                                     are under attack or the administrator\n *                                     changed the key. You HAVE to warn the\n *                                     user about a possible attack.\\n\n *          SSH_KNOWN_HOSTS_OTHER:     The server gave use a key of a type while\n *                                     we had an other type recorded. It is a\n *                                     possible attack.\\n\n *          SSH_KNOWN_HOSTS_UNKNOWN:   The server is unknown. User should\n *                                     confirm the public key hash is correct.\\n\n *          SSH_KNOWN_HOSTS_NOT_FOUND: The known host file does not exist. The\n *                                     host is thus unknown. File will be\n *                                     created if host key is accepted.\\n\n *          SSH_KNOWN_HOSTS_ERROR:     There had been an eror checking the host.\n *\n * @see ssh_knownhosts_entry_free()\n */\nenum ssh_known_hosts_e\nssh_session_get_known_hosts_entry_file(ssh_session session,\n                                       const char *filename,\n                                       struct ssh_knownhosts_entry **pentry)\n{\n    ssh_key server_pubkey = NULL;\n    char *host_port = NULL;\n    enum ssh_known_hosts_e found = SSH_KNOWN_HOSTS_UNKNOWN;\n\n    server_pubkey = ssh_dh_get_current_server_publickey(session);\n    if (server_pubkey == NULL) {\n        ssh_set_error(session,\n                      SSH_FATAL,\n                      \"ssh_session_is_known_host called without a \"\n                      \"server_key!\");\n\n        return SSH_KNOWN_HOSTS_ERROR;\n    }\n\n    host_port = ssh_session_get_host_port(session);\n    if (host_port == NULL) {\n        return SSH_KNOWN_HOSTS_ERROR;\n    }\n\n    found = ssh_known_hosts_check_server_key(host_port,\n                                             filename,\n                                             server_pubkey,\n                                             pentry);\n    SAFE_FREE(host_port);\n\n    return found;\n}\n\n/**\n * @brief Check if the servers public key for the connected session is known.\n *\n * This checks if we already know the public key of the server we want to\n * connect to. This allows to detect if there is a MITM attach going on\n * of if there have been changes on the server we don't know about.\n *\n * @param[in]  session  The SSH to validate.\n *\n * @returns SSH_KNOWN_HOSTS_OK:        The server is known and has not changed.\\n\n *          SSH_KNOWN_HOSTS_CHANGED:   The server key has changed. Either you\n *                                     are under attack or the administrator\n *                                     changed the key. You HAVE to warn the\n *                                     user about a possible attack.\\n\n *          SSH_KNOWN_HOSTS_OTHER:     The server gave use a key of a type while\n *                                     we had an other type recorded. It is a\n *                                     possible attack.\\n\n *          SSH_KNOWN_HOSTS_UNKNOWN:   The server is unknown. User should\n *                                     confirm the public key hash is correct.\\n\n *          SSH_KNOWN_HOSTS_NOT_FOUND: The known host file does not exist. The\n *                                     host is thus unknown. File will be\n *                                     created if host key is accepted.\\n\n *          SSH_KNOWN_HOSTS_ERROR:     There had been an error checking the host.\n */\nenum ssh_known_hosts_e ssh_session_is_known_server(ssh_session session)\n{\n    return ssh_session_get_known_hosts_entry(session, NULL);\n}\n\n/** @} */\n"
  },
  {
    "path": "src/libssh/src/legacy.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2010 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n/** functions in that file are wrappers to the newly named functions. All\n * of them are depreciated, but these wrapper will avoid breaking backward\n * compatibility\n */\n\n#include \"config.h\"\n\n#include <errno.h>\n#include <stdio.h>\n\n#include <libssh/priv.h>\n#include <libssh/session.h>\n#include <libssh/server.h>\n#include <libssh/buffer.h>\n#include <libssh/dh.h>\n#include <libssh/pki.h>\n#include \"libssh/pki_priv.h\"\n#include <libssh/misc.h>\n#include <libssh/keys.h>\n#include \"libssh/options.h\"\n\n/* AUTH FUNCTIONS */\nint ssh_auth_list(ssh_session session) {\n  return ssh_userauth_list(session, NULL);\n}\n\nint ssh_userauth_offer_pubkey(ssh_session session, const char *username,\n    int type, ssh_string publickey)\n{\n    ssh_key key;\n    int rc;\n\n    (void) type; /* unused */\n\n    rc = ssh_pki_import_pubkey_blob(publickey, &key);\n    if (rc < 0) {\n        ssh_set_error(session, SSH_FATAL, \"Failed to convert public key\");\n        return SSH_AUTH_ERROR;\n    }\n\n    rc = ssh_userauth_try_publickey(session, username, key);\n    ssh_key_free(key);\n\n    return rc;\n}\n\nint ssh_userauth_pubkey(ssh_session session,\n                        const char *username,\n                        ssh_string publickey,\n                        ssh_private_key privatekey)\n{\n    ssh_key key;\n    int rc;\n\n    (void) publickey; /* unused */\n\n    key = ssh_key_new();\n    if (key == NULL) {\n        return SSH_AUTH_ERROR;\n    }\n\n    key->type = privatekey->type;\n    key->type_c = ssh_key_type_to_char(key->type);\n    key->flags = SSH_KEY_FLAG_PRIVATE|SSH_KEY_FLAG_PUBLIC;\n    key->dsa = privatekey->dsa_priv;\n    key->rsa = privatekey->rsa_priv;\n\n    rc = ssh_userauth_publickey(session, username, key);\n    key->dsa = NULL;\n    key->rsa = NULL;\n    ssh_key_free(key);\n\n    return rc;\n}\n\nint ssh_userauth_autopubkey(ssh_session session, const char *passphrase) {\n    return ssh_userauth_publickey_auto(session, NULL, passphrase);\n}\n\nint ssh_userauth_privatekey_file(ssh_session session,\n                                 const char *username,\n                                 const char *filename,\n                                 const char *passphrase) {\n  char *pubkeyfile = NULL;\n  ssh_string pubkey = NULL;\n  ssh_private_key privkey = NULL;\n  int type = 0;\n  int rc = SSH_AUTH_ERROR;\n  size_t klen = strlen(filename) + 4 + 1;\n\n  pubkeyfile = malloc(klen);\n  if (pubkeyfile == NULL) {\n    ssh_set_error_oom(session);\n\n    return SSH_AUTH_ERROR;\n  }\n  snprintf(pubkeyfile, klen, \"%s.pub\", filename);\n\n  pubkey = publickey_from_file(session, pubkeyfile, &type);\n  if (pubkey == NULL) {\n    SSH_LOG(SSH_LOG_RARE, \"Public key file %s not found. Trying to generate it.\", pubkeyfile);\n    /* auto-detect the key type with type=0 */\n    privkey = privatekey_from_file(session, filename, 0, passphrase);\n  } else {\n    SSH_LOG(SSH_LOG_RARE, \"Public key file %s loaded.\", pubkeyfile);\n    privkey = privatekey_from_file(session, filename, type, passphrase);\n  }\n  if (privkey == NULL) {\n    goto error;\n  }\n  /* ssh_userauth_pubkey is responsible for taking care of null-pubkey */\n  rc = ssh_userauth_pubkey(session, username, pubkey, privkey);\n  privatekey_free(privkey);\n\nerror:\n  SAFE_FREE(pubkeyfile);\n  ssh_string_free(pubkey);\n\n  return rc;\n}\n\n/* BUFFER FUNCTIONS */\n\nvoid buffer_free(ssh_buffer buffer){\n  ssh_buffer_free(buffer);\n}\nvoid *buffer_get(ssh_buffer buffer){\n  return ssh_buffer_get(buffer);\n}\nuint32_t buffer_get_len(ssh_buffer buffer){\n  return ssh_buffer_get_len(buffer);\n}\nssh_buffer buffer_new(void){\n  return ssh_buffer_new();\n}\n\nssh_channel channel_accept_x11(ssh_channel channel, int timeout_ms){\n  return ssh_channel_accept_x11(channel, timeout_ms);\n}\n\nint channel_change_pty_size(ssh_channel channel,int cols,int rows){\n  return ssh_channel_change_pty_size(channel,cols,rows);\n}\n\nssh_channel channel_forward_accept(ssh_session session, int timeout_ms){\n  return ssh_channel_accept_forward(session, timeout_ms, NULL);\n}\n\nint channel_close(ssh_channel channel){\n  return ssh_channel_close(channel);\n}\n\nint channel_forward_cancel(ssh_session session, const char *address, int port){\n  return ssh_channel_cancel_forward(session, address, port);\n}\n\nint channel_forward_listen(ssh_session session, const char *address,\n    int port, int *bound_port){\n  return ssh_channel_listen_forward(session, address, port, bound_port);\n}\n\nvoid channel_free(ssh_channel channel){\n  ssh_channel_free(channel);\n}\n\nint channel_get_exit_status(ssh_channel channel){\n  return ssh_channel_get_exit_status(channel);\n}\n\nssh_session channel_get_session(ssh_channel channel){\n  return ssh_channel_get_session(channel);\n}\n\nint channel_is_closed(ssh_channel channel){\n  return ssh_channel_is_closed(channel);\n}\n\nint channel_is_eof(ssh_channel channel){\n  return ssh_channel_is_eof(channel);\n}\n\nint channel_is_open(ssh_channel channel){\n  return ssh_channel_is_open(channel);\n}\n\nssh_channel channel_new(ssh_session session){\n  return ssh_channel_new(session);\n}\n\nint channel_open_forward(ssh_channel channel, const char *remotehost,\n    int remoteport, const char *sourcehost, int localport){\n  return ssh_channel_open_forward(channel, remotehost, remoteport,\n      sourcehost,localport);\n}\n\nint channel_open_session(ssh_channel channel){\n  return ssh_channel_open_session(channel);\n}\n\nint channel_poll(ssh_channel channel, int is_stderr){\n  return ssh_channel_poll(channel, is_stderr);\n}\n\nint channel_read(ssh_channel channel, void *dest, uint32_t count, int is_stderr){\n  return ssh_channel_read(channel, dest, count, is_stderr);\n}\n\n/*\n * This function will completely be depreciated. The old implementation was not\n * renamed.\n * int channel_read_buffer(ssh_channel channel, ssh_buffer buffer, uint32_t count,\n *   int is_stderr);\n */\n\nint channel_read_nonblocking(ssh_channel channel, void *dest, uint32_t count,\n    int is_stderr){\n  return ssh_channel_read_nonblocking(channel, dest, count, is_stderr);\n}\n\nint channel_request_env(ssh_channel channel, const char *name, const char *value){\n  return ssh_channel_request_env(channel, name, value);\n}\n\nint channel_request_exec(ssh_channel channel, const char *cmd){\n  return ssh_channel_request_exec(channel, cmd);\n}\n\nint channel_request_pty(ssh_channel channel){\n  return ssh_channel_request_pty(channel);\n}\n\nint channel_request_pty_size(ssh_channel channel, const char *term,\n    int cols, int rows){\n  return ssh_channel_request_pty_size(channel, term, cols, rows);\n}\n\nint channel_request_shell(ssh_channel channel){\n  return ssh_channel_request_shell(channel);\n}\n\nint channel_request_send_signal(ssh_channel channel, const char *signum){\n  return ssh_channel_request_send_signal(channel, signum);\n}\n\nint channel_request_sftp(ssh_channel channel){\n  return ssh_channel_request_sftp(channel);\n}\n\nint channel_request_subsystem(ssh_channel channel, const char *subsystem){\n  return ssh_channel_request_subsystem(channel, subsystem);\n}\n\nint channel_request_x11(ssh_channel channel, int single_connection, const char *protocol,\n    const char *cookie, int screen_number){\n  return ssh_channel_request_x11(channel, single_connection, protocol, cookie,\n      screen_number);\n}\n\nint channel_send_eof(ssh_channel channel){\n  return ssh_channel_send_eof(channel);\n}\n\nint channel_select(ssh_channel *readchans, ssh_channel *writechans, ssh_channel *exceptchans, struct\n    timeval * timeout){\n  return ssh_channel_select(readchans, writechans, exceptchans, timeout);\n}\n\nvoid channel_set_blocking(ssh_channel channel, int blocking){\n  ssh_channel_set_blocking(channel, blocking);\n}\n\nint channel_write(ssh_channel channel, const void *data, uint32_t len){\n  return ssh_channel_write(channel, data, len);\n}\n\n/*\n * These functions have to be wrapped around the pki.c functions.\n\nvoid privatekey_free(ssh_private_key prv);\nssh_private_key privatekey_from_file(ssh_session session, const char *filename,\n    int type, const char *passphrase);\nint ssh_publickey_to_file(ssh_session session, const char *file,\n    ssh_string pubkey, int type);\nssh_string publickey_to_string(ssh_public_key key);\n *\n */\n\nvoid string_burn(ssh_string str){\n  ssh_string_burn(str);\n}\n\nssh_string string_copy(ssh_string str){\n  return ssh_string_copy(str);\n}\n\nvoid *string_data(ssh_string str){\n  return ssh_string_data(str);\n}\n\nint string_fill(ssh_string str, const void *data, size_t len){\n  return ssh_string_fill(str,data,len);\n}\n\nvoid string_free(ssh_string str){\n  ssh_string_free(str);\n}\n\nssh_string string_from_char(const char *what){\n  return ssh_string_from_char(what);\n}\n\nsize_t string_len(ssh_string str){\n  return ssh_string_len(str);\n}\n\nssh_string string_new(size_t size){\n  return ssh_string_new(size);\n}\n\nchar *string_to_char(ssh_string str){\n  return ssh_string_to_char(str);\n}\n\n/* OLD PKI FUNCTIONS */\n\nvoid publickey_free(ssh_public_key key) {\n  if (key == NULL) {\n    return;\n  }\n\n  switch(key->type) {\n    case SSH_KEYTYPE_DSS:\n#ifdef HAVE_LIBGCRYPT\n      gcry_sexp_release(key->dsa_pub);\n#elif defined HAVE_LIBCRYPTO\n      DSA_free(key->dsa_pub);\n#endif\n      break;\n    case SSH_KEYTYPE_RSA:\n#ifdef HAVE_LIBGCRYPT\n      gcry_sexp_release(key->rsa_pub);\n#elif defined HAVE_LIBCRYPTO\n      RSA_free(key->rsa_pub);\n#elif defined HAVE_LIBMBEDCRYPTO\n      mbedtls_pk_free(key->rsa_pub);\n      SAFE_FREE(key->rsa_pub);\n#endif\n      break;\n    default:\n      break;\n  }\n  SAFE_FREE(key);\n}\n\nssh_public_key publickey_from_privatekey(ssh_private_key prv) {\n    struct ssh_public_key_struct *p;\n    ssh_key privkey;\n    ssh_key pubkey;\n    int rc;\n\n    privkey = ssh_key_new();\n    if (privkey == NULL) {\n        return NULL;\n    }\n\n    privkey->type = prv->type;\n    privkey->type_c = ssh_key_type_to_char(privkey->type);\n    privkey->flags = SSH_KEY_FLAG_PRIVATE | SSH_KEY_FLAG_PUBLIC;\n    privkey->dsa = prv->dsa_priv;\n    privkey->rsa = prv->rsa_priv;\n\n    rc = ssh_pki_export_privkey_to_pubkey(privkey, &pubkey);\n    privkey->dsa = NULL;\n    privkey->rsa = NULL;\n    ssh_key_free(privkey);\n    if (rc < 0) {\n        return NULL;\n    }\n\n    p = ssh_pki_convert_key_to_publickey(pubkey);\n    ssh_key_free(pubkey);\n\n    return p;\n}\n\nssh_private_key privatekey_from_file(ssh_session session,\n                                     const char *filename,\n                                     int type,\n                                     const char *passphrase) {\n    ssh_auth_callback auth_fn = NULL;\n    void *auth_data = NULL;\n    ssh_private_key privkey;\n    ssh_key key;\n    int rc;\n\n    (void) type; /* unused */\n\n    if (session->common.callbacks) {\n        auth_fn = session->common.callbacks->auth_function;\n        auth_data = session->common.callbacks->userdata;\n    }\n\n\n    rc = ssh_pki_import_privkey_file(filename,\n                                     passphrase,\n                                     auth_fn,\n                                     auth_data,\n                                     &key);\n    if (rc == SSH_ERROR) {\n        return NULL;\n    }\n\n    privkey = malloc(sizeof(struct ssh_private_key_struct));\n    if (privkey == NULL) {\n        ssh_key_free(key);\n        return NULL;\n    }\n\n    privkey->type = key->type;\n    privkey->dsa_priv = key->dsa;\n    privkey->rsa_priv = key->rsa;\n\n    key->dsa = NULL;\n    key->rsa = NULL;\n\n    ssh_key_free(key);\n\n    return privkey;\n}\n\nenum ssh_keytypes_e ssh_privatekey_type(ssh_private_key privatekey){\n  if (privatekey==NULL)\n    return SSH_KEYTYPE_UNKNOWN;\n  return privatekey->type;\n}\n\nvoid privatekey_free(ssh_private_key prv) {\n  if (prv == NULL) {\n    return;\n  }\n\n#ifdef HAVE_LIBGCRYPT\n  gcry_sexp_release(prv->dsa_priv);\n  gcry_sexp_release(prv->rsa_priv);\n#elif defined HAVE_LIBCRYPTO\n  DSA_free(prv->dsa_priv);\n  RSA_free(prv->rsa_priv);\n#elif defined HAVE_LIBMBEDCRYPTO\n  mbedtls_pk_free(prv->rsa_priv);\n  SAFE_FREE(prv->rsa_priv);\n#endif\n  memset(prv, 0, sizeof(struct ssh_private_key_struct));\n  SAFE_FREE(prv);\n}\n\nssh_string publickey_from_file(ssh_session session, const char *filename,\n    int *type) {\n    ssh_key key;\n    ssh_string key_str = NULL;\n    int rc;\n\n    (void) session; /* unused */\n\n    rc = ssh_pki_import_pubkey_file(filename, &key);\n    if (rc < 0) {\n        return NULL;\n    }\n\n    rc = ssh_pki_export_pubkey_blob(key, &key_str);\n    if (rc < 0) {\n        ssh_key_free(key);\n        return NULL;\n    }\n\n    if (type) {\n        *type = key->type;\n    }\n    ssh_key_free(key);\n\n    return key_str;\n}\n\nconst char *ssh_type_to_char(int type) {\n    return ssh_key_type_to_char(type);\n}\n\nint ssh_type_from_name(const char *name) {\n    return ssh_key_type_from_name(name);\n}\n\nssh_public_key publickey_from_string(ssh_session session, ssh_string pubkey_s) {\n    struct ssh_public_key_struct *pubkey;\n    ssh_key key;\n    int rc;\n\n    (void) session; /* unused */\n\n    rc = ssh_pki_import_pubkey_blob(pubkey_s, &key);\n    if (rc < 0) {\n        return NULL;\n    }\n\n    pubkey = malloc(sizeof(struct ssh_public_key_struct));\n    if (pubkey == NULL) {\n        ssh_key_free(key);\n        return NULL;\n    }\n\n    pubkey->type = key->type;\n    pubkey->type_c = key->type_c;\n\n    pubkey->dsa_pub = key->dsa;\n    key->dsa = NULL;\n    pubkey->rsa_pub = key->rsa;\n    key->rsa = NULL;\n\n    ssh_key_free(key);\n\n    return pubkey;\n}\n\nssh_string publickey_to_string(ssh_public_key pubkey) {\n    ssh_key key;\n    ssh_string key_blob;\n    int rc;\n\n    if (pubkey == NULL) {\n        return NULL;\n    }\n\n    key = ssh_key_new();\n    if (key == NULL) {\n        return NULL;\n    }\n\n    key->type = pubkey->type;\n    key->type_c = pubkey->type_c;\n\n    key->dsa = pubkey->dsa_pub;\n    key->rsa = pubkey->rsa_pub;\n\n    rc = ssh_pki_export_pubkey_blob(key, &key_blob);\n    if (rc < 0) {\n        key_blob = NULL;\n    }\n\n    key->dsa = NULL;\n    key->rsa = NULL;\n    ssh_key_free(key);\n\n    return key_blob;\n}\n\nint ssh_publickey_to_file(ssh_session session,\n                          const char *file,\n                          ssh_string pubkey,\n                          int type)\n{\n    FILE *fp;\n    char *user;\n    char buffer[1024];\n    char host[256];\n    unsigned char *pubkey_64;\n    size_t len;\n    int rc;\n    if(session==NULL)\n        return SSH_ERROR;\n    if(file==NULL || pubkey==NULL){\n        ssh_set_error(session, SSH_FATAL, \"Invalid parameters\");\n        return SSH_ERROR;\n    }\n    pubkey_64 = bin_to_base64(ssh_string_data(pubkey), ssh_string_len(pubkey));\n    if (pubkey_64 == NULL) {\n        return SSH_ERROR;\n    }\n\n    user = ssh_get_local_username();\n    if (user == NULL) {\n        SAFE_FREE(pubkey_64);\n        return SSH_ERROR;\n    }\n\n    rc = gethostname(host, sizeof(host));\n    if (rc < 0) {\n        SAFE_FREE(user);\n        SAFE_FREE(pubkey_64);\n        return SSH_ERROR;\n    }\n\n    snprintf(buffer, sizeof(buffer), \"%s %s %s@%s\\n\",\n            ssh_type_to_char(type),\n            pubkey_64,\n            user,\n            host);\n\n    SAFE_FREE(pubkey_64);\n    SAFE_FREE(user);\n\n    SSH_LOG(SSH_LOG_RARE, \"Trying to write public key file: %s\", file);\n    SSH_LOG(SSH_LOG_PACKET, \"public key file content: %s\", buffer);\n\n    fp = fopen(file, \"w+\");\n    if (fp == NULL) {\n        ssh_set_error(session, SSH_REQUEST_DENIED,\n                \"Error opening %s: %s\", file, strerror(errno));\n        return SSH_ERROR;\n    }\n\n    len = strlen(buffer);\n    if (fwrite(buffer, len, 1, fp) != 1 || ferror(fp)) {\n        ssh_set_error(session, SSH_REQUEST_DENIED,\n                \"Unable to write to %s\", file);\n        fclose(fp);\n        unlink(file);\n        return SSH_ERROR;\n    }\n\n    fclose(fp);\n    return SSH_OK;\n}\n\nint ssh_try_publickey_from_file(ssh_session session,\n                                const char *keyfile,\n                                ssh_string *publickey,\n                                int *type) {\n    char *pubkey_file;\n    size_t len;\n    ssh_string pubkey_string;\n    int pubkey_type;\n\n    if (session == NULL || keyfile == NULL || publickey == NULL || type == NULL) {\n        return -1;\n    }\n\n    if (session->opts.sshdir == NULL) {\n        if (ssh_options_apply(session) < 0) {\n            return -1;\n        }\n    }\n\n    SSH_LOG(SSH_LOG_PACKET, \"Trying to open privatekey %s\", keyfile);\n    if (!ssh_file_readaccess_ok(keyfile)) {\n        SSH_LOG(SSH_LOG_PACKET, \"Failed to open privatekey %s\", keyfile);\n        return -1;\n    }\n\n    len = strlen(keyfile) + 5;\n    pubkey_file = malloc(len);\n    if (pubkey_file == NULL) {\n        return -1;\n    }\n    snprintf(pubkey_file, len, \"%s.pub\", keyfile);\n\n    SSH_LOG(SSH_LOG_PACKET, \"Trying to open publickey %s\",\n            pubkey_file);\n    if (!ssh_file_readaccess_ok(pubkey_file)) {\n        SSH_LOG(SSH_LOG_PACKET, \"Failed to open publickey %s\",\n                pubkey_file);\n        SAFE_FREE(pubkey_file);\n        return 1;\n    }\n\n    SSH_LOG(SSH_LOG_PACKET, \"Success opening public and private key\");\n\n    /*\n     * We are sure both the private and public key file is readable. We return\n     * the public as a string, and the private filename as an argument\n     */\n    pubkey_string = publickey_from_file(session, pubkey_file, &pubkey_type);\n    if (pubkey_string == NULL) {\n        SSH_LOG(SSH_LOG_PACKET,\n                \"Wasn't able to open public key file %s: %s\",\n                pubkey_file,\n                ssh_get_error(session));\n        SAFE_FREE(pubkey_file);\n        return -1;\n    }\n\n    SAFE_FREE(pubkey_file);\n\n    *publickey = pubkey_string;\n    *type = pubkey_type;\n\n    return 0;\n}\n\nssh_string ssh_get_pubkey(ssh_session session)\n{\n    ssh_string pubkey_blob = NULL;\n    int rc;\n\n    if (session == NULL ||\n        session->current_crypto == NULL ||\n        session->current_crypto->server_pubkey == NULL) {\n        return NULL;\n    }\n\n    rc = ssh_dh_get_current_server_publickey_blob(session,\n                                                  &pubkey_blob);\n    if (rc != 0) {\n        return NULL;\n    }\n\n    return pubkey_blob;\n}\n\n/****************************************************************************\n * SERVER SUPPORT\n ****************************************************************************/\n\n#ifdef WITH_SERVER\nint ssh_accept(ssh_session session) {\n    return ssh_handle_key_exchange(session);\n}\n\nint channel_write_stderr(ssh_channel channel, const void *data, uint32_t len) {\n    return ssh_channel_write(channel, data, len);\n}\n\n/** @deprecated\n * @brief Interface previously exported by error.\n */\nssh_message ssh_message_retrieve(ssh_session session, uint32_t packettype){\n\t(void) packettype;\n\tssh_set_error(session, SSH_FATAL, \"ssh_message_retrieve: obsolete libssh call\");\n\treturn NULL;\n}\n\n#endif /* WITH_SERVER */\n"
  },
  {
    "path": "src/libssh/src/libcrypto-compat.c",
    "content": "/*\n * Copyright 2016 The OpenSSL Project Authors. All Rights Reserved.\n *\n * Licensed under the OpenSSL license (the \"License\").  You may not use\n * this file except in compliance with the License.  You can obtain a copy\n * in the file LICENSE in the source distribution or at\n * https://www.openssl.org/source/license.html\n */\n\n#include \"config.h\"\n\n#include <string.h>\n#include \"libcrypto-compat.h\"\n\n#ifndef OPENSSL_NO_ENGINE\n#include <openssl/engine.h>\n#endif\n\nstatic void *OPENSSL_zalloc(size_t num)\n{\n    void *ret = OPENSSL_malloc(num);\n\n    if (ret != NULL)\n        memset(ret, 0, num);\n    return ret;\n}\n\nint RSA_set0_key(RSA *r, BIGNUM *n, BIGNUM *e, BIGNUM *d)\n{\n    /* If the fields n and e in r are NULL, the corresponding input\n     * parameters MUST be non-NULL for n and e.  d may be\n     * left NULL (in case only the public key is used).\n     */\n    if ((r->n == NULL && n == NULL)\n        || (r->e == NULL && e == NULL))\n        return 0;\n\n    if (n != NULL) {\n        BN_free(r->n);\n        r->n = n;\n    }\n    if (e != NULL) {\n        BN_free(r->e);\n        r->e = e;\n    }\n    if (d != NULL) {\n        BN_free(r->d);\n        r->d = d;\n    }\n\n    return 1;\n}\n\nint RSA_set0_factors(RSA *r, BIGNUM *p, BIGNUM *q)\n{\n    /* If the fields p and q in r are NULL, the corresponding input\n     * parameters MUST be non-NULL.\n     */\n    if ((r->p == NULL && p == NULL)\n        || (r->q == NULL && q == NULL))\n        return 0;\n\n    if (p != NULL) {\n        BN_free(r->p);\n        r->p = p;\n    }\n    if (q != NULL) {\n        BN_free(r->q);\n        r->q = q;\n    }\n\n    return 1;\n}\n\nint RSA_set0_crt_params(RSA *r, BIGNUM *dmp1, BIGNUM *dmq1, BIGNUM *iqmp)\n{\n    /* If the fields dmp1, dmq1 and iqmp in r are NULL, the corresponding input\n     * parameters MUST be non-NULL.\n     */\n    if ((r->dmp1 == NULL && dmp1 == NULL)\n        || (r->dmq1 == NULL && dmq1 == NULL)\n        || (r->iqmp == NULL && iqmp == NULL))\n        return 0;\n\n    if (dmp1 != NULL) {\n        BN_free(r->dmp1);\n        r->dmp1 = dmp1;\n    }\n    if (dmq1 != NULL) {\n        BN_free(r->dmq1);\n        r->dmq1 = dmq1;\n    }\n    if (iqmp != NULL) {\n        BN_free(r->iqmp);\n        r->iqmp = iqmp;\n    }\n\n    return 1;\n}\n\nvoid RSA_get0_key(const RSA *r,\n                  const BIGNUM **n, const BIGNUM **e, const BIGNUM **d)\n{\n    if (n != NULL)\n        *n = r->n;\n    if (e != NULL)\n        *e = r->e;\n    if (d != NULL)\n        *d = r->d;\n}\n\nvoid RSA_get0_factors(const RSA *r, const BIGNUM **p, const BIGNUM **q)\n{\n    if (p != NULL)\n        *p = r->p;\n    if (q != NULL)\n        *q = r->q;\n}\n\nvoid RSA_get0_crt_params(const RSA *r,\n                         const BIGNUM **dmp1, const BIGNUM **dmq1,\n                         const BIGNUM **iqmp)\n{\n    if (dmp1 != NULL)\n        *dmp1 = r->dmp1;\n    if (dmq1 != NULL)\n        *dmq1 = r->dmq1;\n    if (iqmp != NULL)\n        *iqmp = r->iqmp;\n}\n\nvoid DSA_get0_pqg(const DSA *d,\n                  const BIGNUM **p, const BIGNUM **q, const BIGNUM **g)\n{\n    if (p != NULL)\n        *p = d->p;\n    if (q != NULL)\n        *q = d->q;\n    if (g != NULL)\n        *g = d->g;\n}\n\nint DSA_set0_pqg(DSA *d, BIGNUM *p, BIGNUM *q, BIGNUM *g)\n{\n    /* If the fields p, q and g in d are NULL, the corresponding input\n     * parameters MUST be non-NULL.\n     */\n    if ((d->p == NULL && p == NULL)\n        || (d->q == NULL && q == NULL)\n        || (d->g == NULL && g == NULL))\n        return 0;\n\n    if (p != NULL) {\n        BN_free(d->p);\n        d->p = p;\n    }\n    if (q != NULL) {\n        BN_free(d->q);\n        d->q = q;\n    }\n    if (g != NULL) {\n        BN_free(d->g);\n        d->g = g;\n    }\n\n    return 1;\n}\n\nvoid DSA_get0_key(const DSA *d,\n                  const BIGNUM **pub_key, const BIGNUM **priv_key)\n{\n    if (pub_key != NULL)\n        *pub_key = d->pub_key;\n    if (priv_key != NULL)\n        *priv_key = d->priv_key;\n}\n\nint DSA_set0_key(DSA *d, BIGNUM *pub_key, BIGNUM *priv_key)\n{\n    /* If the field pub_key in d is NULL, the corresponding input\n     * parameters MUST be non-NULL.  The priv_key field may\n     * be left NULL.\n     */\n    if (d->pub_key == NULL && pub_key == NULL)\n        return 0;\n\n    if (pub_key != NULL) {\n        BN_free(d->pub_key);\n        d->pub_key = pub_key;\n    }\n    if (priv_key != NULL) {\n        BN_free(d->priv_key);\n        d->priv_key = priv_key;\n    }\n\n    return 1;\n}\n\nvoid DSA_SIG_get0(const DSA_SIG *sig, const BIGNUM **pr, const BIGNUM **ps)\n{\n    if (pr != NULL)\n        *pr = sig->r;\n    if (ps != NULL)\n        *ps = sig->s;\n}\n\nint DSA_SIG_set0(DSA_SIG *sig, BIGNUM *r, BIGNUM *s)\n{\n    if (r == NULL || s == NULL)\n        return 0;\n    BN_clear_free(sig->r);\n    BN_clear_free(sig->s);\n    sig->r = r;\n    sig->s = s;\n    return 1;\n}\n\nvoid ECDSA_SIG_get0(const ECDSA_SIG *sig, const BIGNUM **pr, const BIGNUM **ps)\n{\n    if (pr != NULL)\n        *pr = sig->r;\n    if (ps != NULL)\n        *ps = sig->s;\n}\n\nint ECDSA_SIG_set0(ECDSA_SIG *sig, BIGNUM *r, BIGNUM *s)\n{\n    if (r == NULL || s == NULL)\n        return 0;\n    BN_clear_free(sig->r);\n    BN_clear_free(sig->s);\n    sig->r = r;\n    sig->s = s;\n    return 1;\n}\n\nEVP_MD_CTX *EVP_MD_CTX_new(void)\n{\n    return OPENSSL_zalloc(sizeof(EVP_MD_CTX));\n}\n\nstatic void OPENSSL_clear_free(void *str, size_t num)\n{\n    if (str == NULL)\n        return;\n    if (num)\n        OPENSSL_cleanse(str, num);\n    OPENSSL_free(str);\n}\n\n/* This call frees resources associated with the context */\nint EVP_MD_CTX_reset(EVP_MD_CTX *ctx)\n{\n    if (ctx == NULL)\n        return 1;\n\n    /*\n     * Don't assume ctx->md_data was cleaned in EVP_Digest_Final, because\n     * sometimes only copies of the context are ever finalised.\n     */\n    if (ctx->digest && ctx->digest->cleanup\n        && !EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_CLEANED))\n        ctx->digest->cleanup(ctx);\n    if (ctx->digest && ctx->digest->ctx_size && ctx->md_data\n        && !EVP_MD_CTX_test_flags(ctx, EVP_MD_CTX_FLAG_REUSE)) {\n        OPENSSL_clear_free(ctx->md_data, ctx->digest->ctx_size);\n    }\n    EVP_PKEY_CTX_free(ctx->pctx);\n#ifndef OPENSSL_NO_ENGINE\n    ENGINE_finish(ctx->engine);\n#endif\n    OPENSSL_cleanse(ctx, sizeof(*ctx));\n\n    return 1;\n}\n\nvoid EVP_MD_CTX_free(EVP_MD_CTX *ctx)\n{\n    EVP_MD_CTX_reset(ctx);\n    OPENSSL_free(ctx);\n}\n\nint EVP_CIPHER_CTX_reset(EVP_CIPHER_CTX *ctx)\n{\n    EVP_CIPHER_CTX_init(ctx);\n    return 1;\n}\n\nHMAC_CTX *HMAC_CTX_new(void)\n{\n    HMAC_CTX *ctx = OPENSSL_zalloc(sizeof(HMAC_CTX));\n\n    if (ctx != NULL) {\n        if (!HMAC_CTX_reset(ctx)) {\n            HMAC_CTX_free(ctx);\n            return NULL;\n        }\n    }\n    return ctx;\n}\n\nstatic void hmac_ctx_cleanup(HMAC_CTX *ctx)\n{\n    EVP_MD_CTX_reset(&ctx->i_ctx);\n    EVP_MD_CTX_reset(&ctx->o_ctx);\n    EVP_MD_CTX_reset(&ctx->md_ctx);\n    ctx->md = NULL;\n    ctx->key_length = 0;\n    OPENSSL_cleanse(ctx->key, sizeof(ctx->key));\n}\n\nvoid HMAC_CTX_free(HMAC_CTX *ctx)\n{\n    if (ctx != NULL) {\n        hmac_ctx_cleanup(ctx);\n#if OPENSSL_VERSION_NUMBER > 0x10100000L\n        EVP_MD_CTX_free(&ctx->i_ctx);\n        EVP_MD_CTX_free(&ctx->o_ctx);\n        EVP_MD_CTX_free(&ctx->md_ctx);\n#endif\n        OPENSSL_free(ctx);\n    }\n}\n\nint HMAC_CTX_reset(HMAC_CTX *ctx)\n{\n    HMAC_CTX_init(ctx);\n    return 1;\n}\n\n#ifndef HAVE_OPENSSL_EVP_CIPHER_CTX_NEW\nEVP_CIPHER_CTX *EVP_CIPHER_CTX_new(void)\n{\n    return OPENSSL_zalloc(sizeof(EVP_CIPHER_CTX));\n}\n\nvoid EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *ctx)\n{\n    /* EVP_CIPHER_CTX_reset(ctx); alias */\n    EVP_CIPHER_CTX_init(ctx);\n    OPENSSL_free(ctx);\n}\n#endif\n\nvoid DH_get0_pqg(const DH *dh,\n                 const BIGNUM **p, const BIGNUM **q, const BIGNUM **g)\n{\n    if (p) {\n        *p = dh->p;\n    }\n    if (q) {\n        *q = NULL;\n    }\n    if (g) {\n        *g = dh->g;\n    }\n}\n\nint DH_set0_pqg(DH *dh, BIGNUM *p, BIGNUM *q, BIGNUM *g)\n{\n    if (p) {\n        if (dh->p) {\n            BN_free(dh->p);\n        }\n        dh->p = p;\n    }\n    if (g) {\n        if (dh->g) {\n            BN_free(dh->g);\n        }\n        dh->g = g;\n    }\n    return 1;\n}\n\nvoid DH_get0_key(const DH *dh,\n                 const BIGNUM **pub_key, const BIGNUM **priv_key)\n{\n    if (pub_key) {\n        *pub_key = dh->pub_key;\n    }\n    if (priv_key) {\n        *priv_key = dh->priv_key;\n    }\n}\n\nint DH_set0_key(DH *dh, BIGNUM *pub_key, BIGNUM *priv_key)\n{\n    if (pub_key) {\n        if (dh->pub_key) {\n            BN_free(dh->pub_key);\n        }\n        dh->pub_key = pub_key;\n    }\n    if (priv_key) {\n        if (dh->priv_key) {\n            BN_free(dh->priv_key);\n        }\n        dh->priv_key = priv_key;\n    }\n    return 1;\n}\n\nconst char *OpenSSL_version(int type)\n{\n    return SSLeay_version(type);\n}\nunsigned long OpenSSL_version_num(void)\n{\n    return SSLeay();\n}\n"
  },
  {
    "path": "src/libssh/src/libcrypto-compat.h",
    "content": "#ifndef LIBCRYPTO_COMPAT_H\n#define LIBCRYPTO_COMPAT_H\n\n#include <openssl/opensslv.h>\n#if OPENSSL_VERSION_NUMBER < 0x10100000L\n\n#include <openssl/rsa.h>\n#include <openssl/dsa.h>\n#include <openssl/ecdsa.h>\n#include <openssl/dh.h>\n#include <openssl/evp.h>\n#include <openssl/hmac.h>\n#include <openssl/bn.h>\n\nint RSA_set0_key(RSA *r, BIGNUM *n, BIGNUM *e, BIGNUM *d);\nint RSA_set0_factors(RSA *r, BIGNUM *p, BIGNUM *q);\nint RSA_set0_crt_params(RSA *r, BIGNUM *dmp1, BIGNUM *dmq1, BIGNUM *iqmp);\nvoid RSA_get0_key(const RSA *r, const BIGNUM **n, const BIGNUM **e, const BIGNUM **d);\nvoid RSA_get0_factors(const RSA *r, const BIGNUM **p, const BIGNUM **q);\nvoid RSA_get0_crt_params(const RSA *r, const BIGNUM **dmp1, const BIGNUM **dmq1, const BIGNUM **iqmp);\n\nvoid DSA_get0_pqg(const DSA *d, const BIGNUM **p, const BIGNUM **q, const BIGNUM **g);\nint DSA_set0_pqg(DSA *d, BIGNUM *p, BIGNUM *q, BIGNUM *g);\nvoid DSA_get0_key(const DSA *d, const BIGNUM **pub_key, const BIGNUM **priv_key);\nint DSA_set0_key(DSA *d, BIGNUM *pub_key, BIGNUM *priv_key);\n\nvoid DSA_SIG_get0(const DSA_SIG *sig, const BIGNUM **pr, const BIGNUM **ps);\nint DSA_SIG_set0(DSA_SIG *sig, BIGNUM *r, BIGNUM *s);\n\nvoid ECDSA_SIG_get0(const ECDSA_SIG *sig, const BIGNUM **pr, const BIGNUM **ps);\nint ECDSA_SIG_set0(ECDSA_SIG *sig, BIGNUM *r, BIGNUM *s);\n\nint EVP_MD_CTX_reset(EVP_MD_CTX *ctx);\nEVP_MD_CTX *EVP_MD_CTX_new(void);\nvoid EVP_MD_CTX_free(EVP_MD_CTX *ctx);\n\nint EVP_CIPHER_CTX_reset(EVP_CIPHER_CTX *ctx);\n\nHMAC_CTX *HMAC_CTX_new(void);\nint HMAC_CTX_reset(HMAC_CTX *ctx);\nvoid HMAC_CTX_free(HMAC_CTX *ctx);\n\nvoid DH_get0_pqg(const DH *dh,\n                 const BIGNUM **p, const BIGNUM **q, const BIGNUM **g);\nint DH_set0_pqg(DH *dh, BIGNUM *p, BIGNUM *q, BIGNUM *g);\nvoid DH_get0_key(const DH *dh,\n                 const BIGNUM **pub_key, const BIGNUM **priv_key);\nint DH_set0_key(DH *dh, BIGNUM *pub_key, BIGNUM *priv_key);\n\nconst char *OpenSSL_version(int type);\nunsigned long OpenSSL_version_num(void);\n\n#endif /* OPENSSL_VERSION_NUMBER */\n\n#endif /* LIBCRYPTO_COMPAT_H */\n"
  },
  {
    "path": "src/libssh/src/libcrypto.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2009 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#ifdef HAVE_SYS_TIME_H\n#include <sys/time.h>\n#endif\n\n#include \"libssh/priv.h\"\n#include \"libssh/session.h\"\n#include \"libssh/crypto.h\"\n#include \"libssh/wrapper.h\"\n#include \"libssh/libcrypto.h\"\n\n#ifdef HAVE_LIBCRYPTO\n\n#include <openssl/sha.h>\n#include <openssl/md5.h>\n#include <openssl/dsa.h>\n#include <openssl/rsa.h>\n#include <openssl/hmac.h>\n#include <openssl/opensslv.h>\n#include <openssl/rand.h>\n\n#include \"libcrypto-compat.h\"\n\n#ifdef HAVE_OPENSSL_AES_H\n#define HAS_AES\n#include <openssl/aes.h>\n#endif\n#ifdef HAVE_OPENSSL_DES_H\n#define HAS_DES\n#include <openssl/des.h>\n#endif\n\n#if (defined(HAVE_VALGRIND_VALGRIND_H) && defined(HAVE_OPENSSL_IA32CAP_LOC))\n#include <valgrind/valgrind.h>\n#define CAN_DISABLE_AESNI\n#endif\n\n#include \"libssh/crypto.h\"\n\n#ifdef HAVE_OPENSSL_EVP_KDF_CTX_NEW_ID\n#include <openssl/kdf.h>\n#endif\n\n#ifdef HAVE_OPENSSL_CRYPTO_CTR128_ENCRYPT\n#include <openssl/modes.h>\n#endif\n\n#include \"libssh/crypto.h\"\n\nstatic int libcrypto_initialized = 0;\n\nvoid ssh_reseed(void){\n#ifndef _WIN32\n    struct timeval tv;\n    gettimeofday(&tv, NULL);\n    RAND_add(&tv, sizeof(tv), 0.0);\n#endif\n}\n\n/**\n * @brief Get random bytes\n *\n * Make sure to always check the return code of this function!\n *\n * @param[in]  where    The buffer to fill with random bytes\n *\n * @param[in]  len      The size of the buffer to fill.\n *\n * @param[in]  strong   Use a strong or private RNG source.\n *\n * @return 1 on success, 0 on error.\n */\nint ssh_get_random(void *where, int len, int strong)\n{\n#ifdef HAVE_OPENSSL_RAND_PRIV_BYTES\n    if (strong) {\n        /* Returns -1 when not supported, 0 on error, 1 on success */\n        return !!RAND_priv_bytes(where, len);\n    }\n#else\n    (void)strong;\n#endif /* HAVE_RAND_PRIV_BYTES */\n\n    /* Returns -1 when not supported, 0 on error, 1 on success */\n    return !!RAND_bytes(where, len);\n}\n\nSHACTX sha1_init(void)\n{\n    int rc;\n    SHACTX c = EVP_MD_CTX_create();\n    if (c == NULL) {\n        return NULL;\n    }\n    EVP_MD_CTX_init(c);\n    rc = EVP_DigestInit_ex(c, EVP_sha1(), NULL);\n    if (rc == 0) {\n        EVP_MD_CTX_destroy(c);\n        c = NULL;\n    }\n    return c;\n}\n\nvoid sha1_update(SHACTX c, const void *data, unsigned long len)\n{\n    EVP_DigestUpdate(c, data, len);\n}\n\nvoid sha1_final(unsigned char *md, SHACTX c)\n{\n    unsigned int mdlen = 0;\n\n    EVP_DigestFinal(c, md, &mdlen);\n    EVP_MD_CTX_destroy(c);\n}\n\nvoid sha1(const unsigned char *digest, int len, unsigned char *hash)\n{\n    SHACTX c = sha1_init();\n    if (c != NULL) {\n        sha1_update(c, digest, len);\n        sha1_final(hash, c);\n    }\n}\n\n#ifdef HAVE_OPENSSL_ECC\nstatic const EVP_MD *nid_to_evpmd(int nid)\n{\n    switch (nid) {\n        case NID_X9_62_prime256v1:\n            return EVP_sha256();\n        case NID_secp384r1:\n            return EVP_sha384();\n        case NID_secp521r1:\n            return EVP_sha512();\n        default:\n            return NULL;\n    }\n\n    return NULL;\n}\n\nvoid evp(int nid, unsigned char *digest, int len, unsigned char *hash, unsigned int *hlen)\n{\n    const EVP_MD *evp_md = nid_to_evpmd(nid);\n    EVP_MD_CTX *md = EVP_MD_CTX_new();\n\n    EVP_DigestInit(md, evp_md);\n    EVP_DigestUpdate(md, digest, len);\n    EVP_DigestFinal(md, hash, hlen);\n    EVP_MD_CTX_free(md);\n}\n\nEVPCTX evp_init(int nid)\n{\n    const EVP_MD *evp_md = nid_to_evpmd(nid);\n\n    EVPCTX ctx = EVP_MD_CTX_new();\n    if (ctx == NULL) {\n        return NULL;\n    }\n\n    EVP_DigestInit(ctx, evp_md);\n\n    return ctx;\n}\n\nvoid evp_update(EVPCTX ctx, const void *data, unsigned long len)\n{\n    EVP_DigestUpdate(ctx, data, len);\n}\n\nvoid evp_final(EVPCTX ctx, unsigned char *md, unsigned int *mdlen)\n{\n    EVP_DigestFinal(ctx, md, mdlen);\n    EVP_MD_CTX_free(ctx);\n}\n#endif\n\nSHA256CTX sha256_init(void)\n{\n    int rc;\n    SHA256CTX c = EVP_MD_CTX_create();\n    if (c == NULL) {\n        return NULL;\n    }\n    EVP_MD_CTX_init(c);\n    rc = EVP_DigestInit_ex(c, EVP_sha256(), NULL);\n    if (rc == 0) {\n        EVP_MD_CTX_destroy(c);\n        c = NULL;\n    }\n    return c;\n}\n\nvoid sha256_update(SHA256CTX c, const void *data, unsigned long len)\n{\n    EVP_DigestUpdate(c, data, len);\n}\n\nvoid sha256_final(unsigned char *md, SHA256CTX c)\n{\n    unsigned int mdlen = 0;\n\n    EVP_DigestFinal(c, md, &mdlen);\n    EVP_MD_CTX_destroy(c);\n}\n\nvoid sha256(const unsigned char *digest, int len, unsigned char *hash)\n{\n    SHA256CTX c = sha256_init();\n    if (c != NULL) {\n        sha256_update(c, digest, len);\n        sha256_final(hash, c);\n    }\n}\n\nSHA384CTX sha384_init(void)\n{\n    int rc;\n    SHA384CTX c = EVP_MD_CTX_create();\n    if (c == NULL) {\n        return NULL;\n    }\n    EVP_MD_CTX_init(c);\n    rc = EVP_DigestInit_ex(c, EVP_sha384(), NULL);\n    if (rc == 0) {\n        EVP_MD_CTX_destroy(c);\n        c = NULL;\n    }\n    return c;\n}\n\nvoid sha384_update(SHA384CTX c, const void *data, unsigned long len)\n{\n    EVP_DigestUpdate(c, data, len);\n}\n\nvoid sha384_final(unsigned char *md, SHA384CTX c)\n{\n    unsigned int mdlen = 0;\n\n    EVP_DigestFinal(c, md, &mdlen);\n    EVP_MD_CTX_destroy(c);\n}\n\nvoid sha384(const unsigned char *digest, int len, unsigned char *hash)\n{\n    SHA384CTX c = sha384_init();\n    if (c != NULL) {\n        sha384_update(c, digest, len);\n        sha384_final(hash, c);\n    }\n}\n\nSHA512CTX sha512_init(void)\n{\n    int rc = 0;\n    SHA512CTX c = EVP_MD_CTX_create();\n    if (c == NULL) {\n        return NULL;\n    }\n    EVP_MD_CTX_init(c);\n    rc = EVP_DigestInit_ex(c, EVP_sha512(), NULL);\n    if (rc == 0) {\n        EVP_MD_CTX_destroy(c);\n        c = NULL;\n    }\n    return c;\n}\n\nvoid sha512_update(SHA512CTX c, const void *data, unsigned long len)\n{\n    EVP_DigestUpdate(c, data, len);\n}\n\nvoid sha512_final(unsigned char *md, SHA512CTX c)\n{\n    unsigned int mdlen = 0;\n\n    EVP_DigestFinal(c, md, &mdlen);\n    EVP_MD_CTX_destroy(c);\n}\n\nvoid sha512(const unsigned char *digest, int len, unsigned char *hash)\n{\n    SHA512CTX c = sha512_init();\n    if (c != NULL) {\n        sha512_update(c, digest, len);\n        sha512_final(hash, c);\n    }\n}\n\nMD5CTX md5_init(void)\n{\n    int rc;\n    MD5CTX c = EVP_MD_CTX_create();\n    if (c == NULL) {\n        return NULL;\n    }\n    EVP_MD_CTX_init(c);\n    rc = EVP_DigestInit_ex(c, EVP_md5(), NULL);\n    if(rc == 0) {\n        EVP_MD_CTX_destroy(c);\n        c = NULL;\n    }\n    return c;\n}\n\nvoid md5_update(MD5CTX c, const void *data, unsigned long len)\n{\n    EVP_DigestUpdate(c, data, len);\n}\n\nvoid md5_final(unsigned char *md, MD5CTX c)\n{\n    unsigned int mdlen = 0;\n\n    EVP_DigestFinal(c, md, &mdlen);\n    EVP_MD_CTX_destroy(c);\n}\n\n#ifdef HAVE_OPENSSL_EVP_KDF_CTX_NEW_ID\nstatic const EVP_MD *sshkdf_digest_to_md(enum ssh_kdf_digest digest_type)\n{\n    switch (digest_type) {\n    case SSH_KDF_SHA1:\n        return EVP_sha1();\n    case SSH_KDF_SHA256:\n        return EVP_sha256();\n    case SSH_KDF_SHA384:\n        return EVP_sha384();\n    case SSH_KDF_SHA512:\n        return EVP_sha512();\n    }\n    return NULL;\n}\n\nint ssh_kdf(struct ssh_crypto_struct *crypto,\n            unsigned char *key, size_t key_len,\n            int key_type, unsigned char *output,\n            size_t requested_len)\n{\n    EVP_KDF_CTX *ctx = EVP_KDF_CTX_new_id(EVP_KDF_SSHKDF);\n    int rc;\n\n    if (ctx == NULL) {\n        return -1;\n    }\n\n    rc = EVP_KDF_ctrl(ctx, EVP_KDF_CTRL_SET_MD,\n                      sshkdf_digest_to_md(crypto->digest_type));\n    if (rc != 1) {\n        goto out;\n    }\n    rc = EVP_KDF_ctrl(ctx, EVP_KDF_CTRL_SET_KEY, key, key_len);\n    if (rc != 1) {\n        goto out;\n    }\n    rc = EVP_KDF_ctrl(ctx, EVP_KDF_CTRL_SET_SSHKDF_XCGHASH,\n                      crypto->secret_hash, crypto->digest_len);\n    if (rc != 1) {\n        goto out;\n    }\n    rc = EVP_KDF_ctrl(ctx, EVP_KDF_CTRL_SET_SSHKDF_TYPE, key_type);\n    if (rc != 1) {\n        goto out;\n    }\n    rc = EVP_KDF_ctrl(ctx, EVP_KDF_CTRL_SET_SSHKDF_SESSION_ID,\n                      crypto->session_id, crypto->digest_len);\n    if (rc != 1) {\n        goto out;\n    }\n    rc = EVP_KDF_derive(ctx, output, requested_len);\n    if (rc != 1) {\n        goto out;\n    }\n\nout:\n    EVP_KDF_CTX_free(ctx);\n    if (rc < 0) {\n        return rc;\n    }\n    return 0;\n}\n\n#else\nint ssh_kdf(struct ssh_crypto_struct *crypto,\n            unsigned char *key, size_t key_len,\n            int key_type, unsigned char *output,\n            size_t requested_len)\n{\n    return sshkdf_derive_key(crypto, key, key_len,\n                             key_type, output, requested_len);\n}\n#endif\n\nHMACCTX hmac_init(const void *key, int len, enum ssh_hmac_e type) {\n  HMACCTX ctx = NULL;\n\n  ctx = HMAC_CTX_new();\n  if (ctx == NULL) {\n    return NULL;\n  }\n\n\n  switch(type) {\n    case SSH_HMAC_SHA1:\n    case SSH_HMAC_SHA1_96:\n      HMAC_Init_ex(ctx, key, len, EVP_sha1(), NULL);\n      break;\n    case SSH_HMAC_SHA256:\n      HMAC_Init_ex(ctx, key, len, EVP_sha256(), NULL);\n      break;\n    case SSH_HMAC_SHA512:\n      HMAC_Init_ex(ctx, key, len, EVP_sha512(), NULL);\n      break;\n    case SSH_HMAC_MD5:\n    case SSH_HMAC_MD5_96:\n      HMAC_Init_ex(ctx, key, len, EVP_md5(), NULL);\n      break;\n    default:\n      HMAC_CTX_free(ctx);\n      ctx = NULL;\n  }\n\n  return ctx;\n}\n\nvoid hmac_update(HMACCTX ctx, const void *data, unsigned long len) {\n  HMAC_Update(ctx, data, len);\n}\n\nvoid hmac_final(HMACCTX ctx, unsigned char *hashmacbuf, unsigned int *len, enum ssh_hmac_e type) {\n  HMAC_Final(ctx,hashmacbuf,len);\n\n  switch (type) {\n    case SSH_HMAC_SHA1_96:\n    case SSH_HMAC_MD5_96:\n      *len = hmac_digest_len(type);\n      break;\n  }\n\n#if OPENSSL_VERSION_NUMBER > 0x10100000L\n  HMAC_CTX_free(ctx);\n  ctx = NULL;\n#else\n  HMAC_cleanup(ctx);\n  SAFE_FREE(ctx);\n  ctx = NULL;\n#endif\n}\n\nstatic void evp_cipher_init(struct ssh_cipher_struct *cipher) {\n    if (cipher->ctx == NULL) {\n        cipher->ctx = EVP_CIPHER_CTX_new();\n    }\n\n    switch(cipher->ciphertype){\n    case SSH_AES128_CBC:\n        cipher->cipher = EVP_aes_128_cbc();\n        break;\n    case SSH_AES192_CBC:\n        cipher->cipher = EVP_aes_192_cbc();\n        break;\n    case SSH_AES256_CBC:\n        cipher->cipher = EVP_aes_256_cbc();\n        break;\n#ifdef HAVE_OPENSSL_EVP_AES_CTR\n    case SSH_AES128_CTR:\n        cipher->cipher = EVP_aes_128_ctr();\n        break;\n    case SSH_AES192_CTR:\n        cipher->cipher = EVP_aes_192_ctr();\n        break;\n    case SSH_AES256_CTR:\n        cipher->cipher = EVP_aes_256_ctr();\n        break;\n#else\n    case SSH_AES128_CTR:\n    case SSH_AES192_CTR:\n    case SSH_AES256_CTR:\n        SSH_LOG(SSH_LOG_WARNING, \"This cipher is not available in evp_cipher_init\");\n        break;\n#endif\n#ifdef HAVE_OPENSSL_EVP_AES_GCM\n    case SSH_AEAD_AES128_GCM:\n        cipher->cipher = EVP_aes_128_gcm();\n        break;\n    case SSH_AEAD_AES256_GCM:\n        cipher->cipher = EVP_aes_256_gcm();\n        break;\n#else\n    case SSH_AEAD_AES128_GCM:\n    case SSH_AEAD_AES256_GCM:\n        SSH_LOG(SSH_LOG_WARNING, \"This cipher is not available in evp_cipher_init\");\n        break;\n#endif /* HAVE_OPENSSL_EVP_AES_GCM */\n    case SSH_3DES_CBC:\n        cipher->cipher = EVP_des_ede3_cbc();\n        break;\n#ifdef WITH_BLOWFISH_CIPHER\n    case SSH_BLOWFISH_CBC:\n        cipher->cipher = EVP_bf_cbc();\n        break;\n        /* ciphers not using EVP */\n#endif\n    case SSH_AEAD_CHACHA20_POLY1305:\n        SSH_LOG(SSH_LOG_WARNING, \"The ChaCha cipher cannot be handled here\");\n        break;\n    case SSH_NO_CIPHER:\n        SSH_LOG(SSH_LOG_WARNING, \"No valid ciphertype found\");\n        break;\n    }\n}\n\nstatic int evp_cipher_set_encrypt_key(struct ssh_cipher_struct *cipher,\n            void *key, void *IV)\n{\n    int rc;\n\n    evp_cipher_init(cipher);\n    EVP_CIPHER_CTX_reset(cipher->ctx);\n\n    rc = EVP_EncryptInit_ex(cipher->ctx, cipher->cipher, NULL, key, IV);\n    if (rc != 1){\n        SSH_LOG(SSH_LOG_WARNING, \"EVP_EncryptInit_ex failed\");\n        return SSH_ERROR;\n    }\n\n#ifdef HAVE_OPENSSL_EVP_AES_GCM\n    /* For AES-GCM we need to set IV in specific way */\n    if (cipher->ciphertype == SSH_AEAD_AES128_GCM ||\n        cipher->ciphertype == SSH_AEAD_AES256_GCM) {\n        rc = EVP_CIPHER_CTX_ctrl(cipher->ctx,\n                                 EVP_CTRL_GCM_SET_IV_FIXED,\n                                 -1,\n                                 (uint8_t *)IV);\n        if (rc != 1) {\n            SSH_LOG(SSH_LOG_WARNING, \"EVP_CTRL_GCM_SET_IV_FIXED failed\");\n            return SSH_ERROR;\n        }\n    }\n#endif /* HAVE_OPENSSL_EVP_AES_GCM */\n\n    EVP_CIPHER_CTX_set_padding(cipher->ctx, 0);\n\n    return SSH_OK;\n}\n\nstatic int evp_cipher_set_decrypt_key(struct ssh_cipher_struct *cipher,\n            void *key, void *IV) {\n    int rc;\n\n    evp_cipher_init(cipher);\n    EVP_CIPHER_CTX_reset(cipher->ctx);\n\n    rc = EVP_DecryptInit_ex(cipher->ctx, cipher->cipher, NULL, key, IV);\n    if (rc != 1){\n        SSH_LOG(SSH_LOG_WARNING, \"EVP_DecryptInit_ex failed\");\n        return SSH_ERROR;\n    }\n\n#ifdef HAVE_OPENSSL_EVP_AES_GCM\n    /* For AES-GCM we need to set IV in specific way */\n    if (cipher->ciphertype == SSH_AEAD_AES128_GCM ||\n        cipher->ciphertype == SSH_AEAD_AES256_GCM) {\n        rc = EVP_CIPHER_CTX_ctrl(cipher->ctx,\n                                 EVP_CTRL_GCM_SET_IV_FIXED,\n                                 -1,\n                                 (uint8_t *)IV);\n        if (rc != 1) {\n            SSH_LOG(SSH_LOG_WARNING, \"EVP_CTRL_GCM_SET_IV_FIXED failed\");\n            return SSH_ERROR;\n        }\n    }\n#endif /* HAVE_OPENSSL_EVP_AES_GCM */\n\n    EVP_CIPHER_CTX_set_padding(cipher->ctx, 0);\n\n    return SSH_OK;\n}\n\n/* EVP wrapper function for encrypt/decrypt */\nstatic void evp_cipher_encrypt(struct ssh_cipher_struct *cipher,\n                               void *in,\n                               void *out,\n                               size_t len)\n{\n    int outlen = 0;\n    int rc = 0;\n\n    rc = EVP_EncryptUpdate(cipher->ctx,\n                           (unsigned char *)out,\n                           &outlen,\n                           (unsigned char *)in,\n                           (int)len);\n    if (rc != 1){\n        SSH_LOG(SSH_LOG_WARNING, \"EVP_EncryptUpdate failed\");\n        return;\n    }\n    if (outlen != (int)len){\n        SSH_LOG(SSH_LOG_WARNING,\n                \"EVP_EncryptUpdate: output size %d for %zu in\",\n                outlen,\n                len);\n        return;\n    }\n}\n\nstatic void evp_cipher_decrypt(struct ssh_cipher_struct *cipher,\n                               void *in,\n                               void *out,\n                               size_t len)\n{\n    int outlen = 0;\n    int rc = 0;\n\n    rc = EVP_DecryptUpdate(cipher->ctx,\n                           (unsigned char *)out,\n                           &outlen,\n                           (unsigned char *)in,\n                           (int)len);\n    if (rc != 1){\n        SSH_LOG(SSH_LOG_WARNING, \"EVP_DecryptUpdate failed\");\n        return;\n    }\n    if (outlen != (int)len){\n        SSH_LOG(SSH_LOG_WARNING,\n                \"EVP_DecryptUpdate: output size %d for %zu in\",\n                outlen,\n                len);\n        return;\n    }\n}\n\nstatic void evp_cipher_cleanup(struct ssh_cipher_struct *cipher) {\n    if (cipher->ctx != NULL) {\n        EVP_CIPHER_CTX_free(cipher->ctx);\n    }\n}\n\n#ifndef HAVE_OPENSSL_EVP_AES_CTR\n/* Some OS (osx, OpenIndiana, ...) have no support for CTR ciphers in EVP_aes */\n\nstruct ssh_aes_key_schedule {\n    AES_KEY key;\n    uint8_t IV[AES_BLOCK_SIZE];\n};\n\nstatic int aes_ctr_set_key(struct ssh_cipher_struct *cipher, void *key,\n    void *IV) {\n    int rc;\n\n    if (cipher->aes_key == NULL) {\n        cipher->aes_key = malloc(sizeof (struct ssh_aes_key_schedule));\n    }\n    if (cipher->aes_key == NULL) {\n        return SSH_ERROR;\n    }\n    ZERO_STRUCTP(cipher->aes_key);\n    /* CTR doesn't need a decryption key */\n    rc = AES_set_encrypt_key(key, cipher->keysize, &cipher->aes_key->key);\n    if (rc < 0) {\n        SAFE_FREE(cipher->aes_key);\n        return SSH_ERROR;\n    }\n    memcpy(cipher->aes_key->IV, IV, AES_BLOCK_SIZE);\n    return SSH_OK;\n}\n\nstatic void\naes_ctr_encrypt(struct ssh_cipher_struct *cipher,\n                void *in,\n                void *out,\n                size_t len)\n{\n  unsigned char tmp_buffer[AES_BLOCK_SIZE];\n  unsigned int num=0;\n  /* Some things are special with ctr128 :\n   * In this case, tmp_buffer is not being used, because it is used to store temporary data\n   * when an encryption is made on lengths that are not multiple of blocksize.\n   * Same for num, which is being used to store the current offset in blocksize in CTR\n   * function.\n   */\n#ifdef HAVE_OPENSSL_CRYPTO_CTR128_ENCRYPT\n  CRYPTO_ctr128_encrypt(in, out, len, &cipher->aes_key->key, cipher->aes_key->IV, tmp_buffer, &num, (block128_f)AES_encrypt);\n#else\n  AES_ctr128_encrypt(in, out, len, &cipher->aes_key->key, cipher->aes_key->IV, tmp_buffer, &num);\n#endif /* HAVE_OPENSSL_CRYPTO_CTR128_ENCRYPT */\n}\n\nstatic void aes_ctr_cleanup(struct ssh_cipher_struct *cipher){\n    if (cipher != NULL) {\n        if (cipher->aes_key != NULL) {\n            explicit_bzero(cipher->aes_key, sizeof(*cipher->aes_key));\n        }\n        SAFE_FREE(cipher->aes_key);\n    }\n}\n\n#endif /* HAVE_OPENSSL_EVP_AES_CTR */\n\n#ifdef HAVE_OPENSSL_EVP_AES_GCM\nstatic int\nevp_cipher_aead_get_length(struct ssh_cipher_struct *cipher,\n                           void *in,\n                           uint8_t *out,\n                           size_t len,\n                           uint64_t seq)\n{\n    (void)cipher;\n    (void)seq;\n\n    /* The length is not encrypted: Copy it to the result buffer */\n    memcpy(out, in, len);\n\n    return SSH_OK;\n}\n\nstatic void\nevp_cipher_aead_encrypt(struct ssh_cipher_struct *cipher,\n                        void *in,\n                        void *out,\n                        size_t len,\n                        uint8_t *tag,\n                        uint64_t seq)\n{\n    size_t authlen, aadlen;\n    uint8_t lastiv[1];\n    int tmplen = 0;\n    size_t outlen;\n    int rc;\n\n    (void) seq;\n\n    aadlen = cipher->lenfield_blocksize;\n    authlen = cipher->tag_size;\n\n    /* increment IV */\n    rc = EVP_CIPHER_CTX_ctrl(cipher->ctx,\n                             EVP_CTRL_GCM_IV_GEN,\n                             1,\n                             lastiv);\n    if (rc == 0) {\n        SSH_LOG(SSH_LOG_WARNING, \"EVP_CTRL_GCM_IV_GEN failed\");\n        return;\n    }\n\n    /* Pass over the authenticated data (not encrypted) */\n    rc = EVP_EncryptUpdate(cipher->ctx,\n                           NULL,\n                           &tmplen,\n                           (unsigned char *)in,\n                           (int)aadlen);\n    outlen = tmplen;\n    if (rc == 0 || outlen != aadlen) {\n        SSH_LOG(SSH_LOG_WARNING, \"Failed to pass authenticated data\");\n        return;\n    }\n    memcpy(out, in, aadlen);\n\n    /* Encrypt the rest of the data */\n    rc = EVP_EncryptUpdate(cipher->ctx,\n                           (unsigned char *)out + aadlen,\n                           &tmplen,\n                           (unsigned char *)in + aadlen,\n                           (int)len - aadlen);\n    outlen = tmplen;\n    if (rc != 1 || outlen != (int)len - aadlen) {\n        SSH_LOG(SSH_LOG_WARNING, \"EVP_EncryptUpdate failed\");\n        return;\n    }\n\n    /* compute tag */\n    rc = EVP_EncryptFinal(cipher->ctx,\n                          NULL,\n                          &tmplen);\n    if (rc < 0) {\n        SSH_LOG(SSH_LOG_WARNING, \"EVP_EncryptFinal failed: Failed to create a tag\");\n        return;\n    }\n\n    rc = EVP_CIPHER_CTX_ctrl(cipher->ctx,\n                             EVP_CTRL_GCM_GET_TAG,\n                             authlen,\n                             (unsigned char *)tag);\n    if (rc != 1) {\n        SSH_LOG(SSH_LOG_WARNING, \"EVP_CTRL_GCM_GET_TAG failed\");\n        return;\n    }\n}\n\nstatic int\nevp_cipher_aead_decrypt(struct ssh_cipher_struct *cipher,\n                        void *complete_packet,\n                        uint8_t *out,\n                        size_t encrypted_size,\n                        uint64_t seq)\n{\n    size_t authlen, aadlen;\n    uint8_t lastiv[1];\n    int outlen = 0;\n    int rc = 0;\n\n    (void)seq;\n\n    aadlen = cipher->lenfield_blocksize;\n    authlen = cipher->tag_size;\n\n    /* increment IV */\n    rc = EVP_CIPHER_CTX_ctrl(cipher->ctx,\n                             EVP_CTRL_GCM_IV_GEN,\n                             1,\n                             lastiv);\n    if (rc == 0) {\n        SSH_LOG(SSH_LOG_WARNING, \"EVP_CTRL_GCM_IV_GEN failed\");\n        return SSH_ERROR;\n    }\n\n    /* set tag for authentication */\n    rc = EVP_CIPHER_CTX_ctrl(cipher->ctx,\n                             EVP_CTRL_GCM_SET_TAG,\n                             authlen,\n                             (unsigned char *)complete_packet + aadlen + encrypted_size);\n    if (rc == 0) {\n        SSH_LOG(SSH_LOG_WARNING, \"EVP_CTRL_GCM_SET_TAG failed\");\n        return SSH_ERROR;\n    }\n\n    /* Pass over the authenticated data (not encrypted) */\n    rc = EVP_DecryptUpdate(cipher->ctx,\n                           NULL,\n                           &outlen,\n                           (unsigned char *)complete_packet,\n                           (int)aadlen);\n    if (rc == 0) {\n        SSH_LOG(SSH_LOG_WARNING, \"Failed to pass authenticated data\");\n        return SSH_ERROR;\n    }\n    /* Do not copy the length to the target buffer, because it is already processed */\n    //memcpy(out, complete_packet, aadlen);\n\n    /* Decrypt the rest of the data */\n    rc = EVP_DecryptUpdate(cipher->ctx,\n                           (unsigned char *)out,\n                           &outlen,\n                           (unsigned char *)complete_packet + aadlen,\n                           encrypted_size /* already substracted aadlen*/);\n    if (rc != 1) {\n        SSH_LOG(SSH_LOG_WARNING, \"EVP_DecryptUpdate failed\");\n        return SSH_ERROR;\n    }\n\n    if (outlen != (int)encrypted_size) {\n        SSH_LOG(SSH_LOG_WARNING,\n                \"EVP_DecryptUpdate: output size %d for %zd in\",\n                outlen,\n                encrypted_size);\n        return SSH_ERROR;\n    }\n\n    /* verify tag */\n    rc = EVP_DecryptFinal(cipher->ctx,\n                          NULL,\n                          &outlen);\n    if (rc < 0) {\n        SSH_LOG(SSH_LOG_WARNING, \"EVP_DecryptFinal failed: Failed authentication\");\n        return SSH_ERROR;\n    }\n\n    return SSH_OK;\n}\n\n#endif /* HAVE_OPENSSL_EVP_AES_GCM */\n\n/*\n * The table of supported ciphers\n */\nstatic struct ssh_cipher_struct ssh_ciphertab[] = {\n#ifdef WITH_BLOWFISH_CIPHER\n  {\n    .name = \"blowfish-cbc\",\n    .blocksize = 8,\n    .ciphertype = SSH_BLOWFISH_CBC,\n    .keysize = 128,\n    .set_encrypt_key = evp_cipher_set_encrypt_key,\n    .set_decrypt_key = evp_cipher_set_decrypt_key,\n    .encrypt = evp_cipher_encrypt,\n    .decrypt = evp_cipher_decrypt,\n    .cleanup = evp_cipher_cleanup\n  },\n#endif\n#ifdef HAS_AES\n#ifndef BROKEN_AES_CTR\n/* OpenSSL until 0.9.7c has a broken AES_ctr128_encrypt implementation which\n * increments the counter from 2^64 instead of 1. It's better not to use it\n */\n#ifdef HAVE_OPENSSL_EVP_AES_CTR\n  {\n    .name = \"aes128-ctr\",\n    .blocksize = AES_BLOCK_SIZE,\n    .ciphertype = SSH_AES128_CTR,\n    .keysize = 128,\n    .set_encrypt_key = evp_cipher_set_encrypt_key,\n    .set_decrypt_key = evp_cipher_set_decrypt_key,\n    .encrypt = evp_cipher_encrypt,\n    .decrypt = evp_cipher_decrypt,\n    .cleanup = evp_cipher_cleanup\n  },\n  {\n    .name = \"aes192-ctr\",\n    .blocksize = AES_BLOCK_SIZE,\n    .ciphertype = SSH_AES192_CTR,\n    .keysize = 192,\n    .set_encrypt_key = evp_cipher_set_encrypt_key,\n    .set_decrypt_key = evp_cipher_set_decrypt_key,\n    .encrypt = evp_cipher_encrypt,\n    .decrypt = evp_cipher_decrypt,\n    .cleanup = evp_cipher_cleanup\n  },\n  {\n    .name = \"aes256-ctr\",\n    .blocksize = AES_BLOCK_SIZE,\n    .ciphertype = SSH_AES256_CTR,\n    .keysize = 256,\n    .set_encrypt_key = evp_cipher_set_encrypt_key,\n    .set_decrypt_key = evp_cipher_set_decrypt_key,\n    .encrypt = evp_cipher_encrypt,\n    .decrypt = evp_cipher_decrypt,\n    .cleanup = evp_cipher_cleanup\n  },\n#else /* HAVE_OPENSSL_EVP_AES_CTR */\n  {\n    .name = \"aes128-ctr\",\n    .blocksize = AES_BLOCK_SIZE,\n    .ciphertype = SSH_AES128_CTR,\n    .keysize = 128,\n    .set_encrypt_key = aes_ctr_set_key,\n    .set_decrypt_key = aes_ctr_set_key,\n    .encrypt = aes_ctr_encrypt,\n    .decrypt = aes_ctr_encrypt,\n    .cleanup = aes_ctr_cleanup\n  },\n  {\n    .name = \"aes192-ctr\",\n    .blocksize = AES_BLOCK_SIZE,\n    .ciphertype = SSH_AES192_CTR,\n    .keysize = 192,\n    .set_encrypt_key = aes_ctr_set_key,\n    .set_decrypt_key = aes_ctr_set_key,\n    .encrypt = aes_ctr_encrypt,\n    .decrypt = aes_ctr_encrypt,\n    .cleanup = aes_ctr_cleanup\n  },\n  {\n    .name = \"aes256-ctr\",\n    .blocksize = AES_BLOCK_SIZE,\n    .ciphertype = SSH_AES256_CTR,\n    .keysize = 256,\n    .set_encrypt_key = aes_ctr_set_key,\n    .set_decrypt_key = aes_ctr_set_key,\n    .encrypt = aes_ctr_encrypt,\n    .decrypt = aes_ctr_encrypt,\n    .cleanup = aes_ctr_cleanup\n  },\n#endif /* HAVE_OPENSSL_EVP_AES_CTR */\n#endif /* BROKEN_AES_CTR */\n  {\n    .name = \"aes128-cbc\",\n    .blocksize = AES_BLOCK_SIZE,\n    .ciphertype = SSH_AES128_CBC,\n    .keysize = 128,\n    .set_encrypt_key = evp_cipher_set_encrypt_key,\n    .set_decrypt_key = evp_cipher_set_decrypt_key,\n    .encrypt = evp_cipher_encrypt,\n    .decrypt = evp_cipher_decrypt,\n    .cleanup = evp_cipher_cleanup\n  },\n  {\n    .name = \"aes192-cbc\",\n    .blocksize = AES_BLOCK_SIZE,\n    .ciphertype = SSH_AES192_CBC,\n    .keysize = 192,\n    .set_encrypt_key = evp_cipher_set_encrypt_key,\n    .set_decrypt_key = evp_cipher_set_decrypt_key,\n    .encrypt = evp_cipher_encrypt,\n    .decrypt = evp_cipher_decrypt,\n    .cleanup = evp_cipher_cleanup\n  },\n  {\n    .name = \"aes256-cbc\",\n    .blocksize = AES_BLOCK_SIZE,\n    .ciphertype = SSH_AES256_CBC,\n    .keysize = 256,\n    .set_encrypt_key = evp_cipher_set_encrypt_key,\n    .set_decrypt_key = evp_cipher_set_decrypt_key,\n    .encrypt = evp_cipher_encrypt,\n    .decrypt = evp_cipher_decrypt,\n    .cleanup = evp_cipher_cleanup\n  },\n#ifdef HAVE_OPENSSL_EVP_AES_GCM\n  {\n    .name = \"aes128-gcm@openssh.com\",\n    .blocksize = AES_BLOCK_SIZE,\n    .lenfield_blocksize = 4, /* not encrypted, but authenticated */\n    .ciphertype = SSH_AEAD_AES128_GCM,\n    .keysize = 128,\n    .tag_size = AES_GCM_TAGLEN,\n    .set_encrypt_key = evp_cipher_set_encrypt_key,\n    .set_decrypt_key = evp_cipher_set_decrypt_key,\n    .aead_encrypt = evp_cipher_aead_encrypt,\n    .aead_decrypt_length = evp_cipher_aead_get_length,\n    .aead_decrypt = evp_cipher_aead_decrypt,\n    .cleanup = evp_cipher_cleanup\n  },\n  {\n    .name = \"aes256-gcm@openssh.com\",\n    .blocksize = AES_BLOCK_SIZE,\n    .lenfield_blocksize = 4, /* not encrypted, but authenticated */\n    .ciphertype = SSH_AEAD_AES256_GCM,\n    .keysize = 256,\n    .tag_size = AES_GCM_TAGLEN,\n    .set_encrypt_key = evp_cipher_set_encrypt_key,\n    .set_decrypt_key = evp_cipher_set_decrypt_key,\n    .aead_encrypt = evp_cipher_aead_encrypt,\n    .aead_decrypt_length = evp_cipher_aead_get_length,\n    .aead_decrypt = evp_cipher_aead_decrypt,\n    .cleanup = evp_cipher_cleanup\n  },\n#endif /* HAVE_OPENSSL_EVP_AES_GCM */\n#endif /* HAS_AES */\n#ifdef HAS_DES\n  {\n    .name = \"3des-cbc\",\n    .blocksize = 8,\n    .ciphertype = SSH_3DES_CBC,\n    .keysize = 192,\n    .set_encrypt_key = evp_cipher_set_encrypt_key,\n    .set_decrypt_key = evp_cipher_set_decrypt_key,\n    .encrypt = evp_cipher_encrypt,\n    .decrypt = evp_cipher_decrypt,\n    .cleanup = evp_cipher_cleanup\n  },\n#endif /* HAS_DES */\n  {\n    .name = \"chacha20-poly1305@openssh.com\"\n  },\n  {\n    .name = NULL\n  }\n};\n\nstruct ssh_cipher_struct *ssh_get_ciphertab(void)\n{\n  return ssh_ciphertab;\n}\n\n/**\n * @internal\n * @brief Initialize libcrypto's subsystem\n */\nint ssh_crypto_init(void)\n{\n    size_t i;\n\n    if (libcrypto_initialized) {\n        return SSH_OK;\n    }\n    if (OpenSSL_version_num() != OPENSSL_VERSION_NUMBER){\n        SSH_LOG(SSH_LOG_WARNING, \"libssh compiled with %s \"\n            \"headers, currently running with %s.\",\n            OPENSSL_VERSION_TEXT,\n            OpenSSL_version(OpenSSL_version_num())\n        );\n    }\n#ifdef CAN_DISABLE_AESNI\n    /*\n     * disable AES-NI when running within Valgrind, because they generate\n     * too many \"uninitialized memory access\" false positives\n     */\n    if (RUNNING_ON_VALGRIND){\n        SSH_LOG(SSH_LOG_INFO, \"Running within Valgrind, disabling AES-NI\");\n        /* Bit #57 denotes AES-NI instruction set extension */\n        OPENSSL_ia32cap &= ~(1LL << 57);\n    }\n#endif\n#if OPENSSL_VERSION_NUMBER < 0x10100000L\n    OpenSSL_add_all_algorithms();\n#endif\n\n    for (i = 0; ssh_ciphertab[i].name != NULL; i++) {\n        int cmp;\n\n        cmp = strcmp(ssh_ciphertab[i].name, \"chacha20-poly1305@openssh.com\");\n        if (cmp == 0) {\n            memcpy(&ssh_ciphertab[i],\n                   ssh_get_chacha20poly1305_cipher(),\n                   sizeof(struct ssh_cipher_struct));\n            break;\n        }\n    }\n\n    libcrypto_initialized = 1;\n\n    return SSH_OK;\n}\n\n/**\n * @internal\n * @brief Finalize libcrypto's subsystem\n */\nvoid ssh_crypto_finalize(void)\n{\n    if (!libcrypto_initialized) {\n        return;\n    }\n\n#if OPENSSL_VERSION_NUMBER < 0x10100000L\n    EVP_cleanup();\n    CRYPTO_cleanup_all_ex_data();\n#endif\n\n    libcrypto_initialized = 0;\n}\n\n#endif /* LIBCRYPTO */\n"
  },
  {
    "path": "src/libssh/src/libgcrypt.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2009 by Aris Adamantiadis\n * Copyright (C) 2016 g10 Code GmbH\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"libssh/priv.h\"\n#include \"libssh/session.h\"\n#include \"libssh/crypto.h\"\n#include \"libssh/wrapper.h\"\n#include \"libssh/string.h\"\n#include \"libssh/misc.h\"\n\n#ifdef HAVE_LIBGCRYPT\n#include <gcrypt.h>\n\nstatic int libgcrypt_initialized = 0;\n\nstatic int alloc_key(struct ssh_cipher_struct *cipher) {\n    cipher->key = malloc(cipher->keylen);\n    if (cipher->key == NULL) {\n      return -1;\n    }\n\n    return 0;\n}\n\nvoid ssh_reseed(void){\n}\n\nint ssh_get_random(void *where, int len, int strong)\n{\n    /* variable not used in gcrypt */\n    (void) strong;\n\n    /* not using GCRY_VERY_STRONG_RANDOM which is a bit overkill */\n    gcry_randomize(where,len,GCRY_STRONG_RANDOM);\n\n    return 1;\n}\n\nSHACTX sha1_init(void) {\n  SHACTX ctx = NULL;\n  gcry_md_open(&ctx, GCRY_MD_SHA1, 0);\n\n  return ctx;\n}\n\nvoid sha1_update(SHACTX c, const void *data, unsigned long len) {\n  gcry_md_write(c, data, len);\n}\n\nvoid sha1_final(unsigned char *md, SHACTX c) {\n  gcry_md_final(c);\n  memcpy(md, gcry_md_read(c, 0), SHA_DIGEST_LEN);\n  gcry_md_close(c);\n}\n\nvoid sha1(const unsigned char *digest, int len, unsigned char *hash) {\n  gcry_md_hash_buffer(GCRY_MD_SHA1, hash, digest, len);\n}\n\n#ifdef HAVE_GCRYPT_ECC\nstatic int nid_to_md_algo(int nid)\n{\n    switch (nid) {\n    case NID_gcrypt_nistp256:\n        return GCRY_MD_SHA256;\n    case NID_gcrypt_nistp384:\n        return GCRY_MD_SHA384;\n    case NID_gcrypt_nistp521:\n        return GCRY_MD_SHA512;\n    }\n    return GCRY_MD_NONE;\n}\n\nvoid evp(int nid, unsigned char *digest, int len,\n         unsigned char *hash, unsigned int *hlen)\n{\n    int algo = nid_to_md_algo(nid);\n\n    /* Note: What gcrypt calls 'hash' is called 'digest' here and\n       vice-versa.  */\n    gcry_md_hash_buffer(algo, hash, digest, len);\n    *hlen = gcry_md_get_algo_dlen(algo);\n}\n\nEVPCTX evp_init(int nid)\n{\n    gcry_error_t err;\n    int algo = nid_to_md_algo(nid);\n    EVPCTX ctx;\n\n    err = gcry_md_open(&ctx, algo, 0);\n    if (err) {\n        return NULL;\n    }\n\n    return ctx;\n}\n\nvoid evp_update(EVPCTX ctx, const void *data, unsigned long len)\n{\n    gcry_md_write(ctx, data, len);\n}\n\nvoid evp_final(EVPCTX ctx, unsigned char *md, unsigned int *mdlen)\n{\n    int algo = gcry_md_get_algo(ctx);\n    *mdlen = gcry_md_get_algo_dlen(algo);\n    memcpy(md, gcry_md_read(ctx, algo), *mdlen);\n    gcry_md_close(ctx);\n}\n#endif\n\nSHA256CTX sha256_init(void) {\n  SHA256CTX ctx = NULL;\n  gcry_md_open(&ctx, GCRY_MD_SHA256, 0);\n\n  return ctx;\n}\n\nvoid sha256_update(SHACTX c, const void *data, unsigned long len) {\n  gcry_md_write(c, data, len);\n}\n\nvoid sha256_final(unsigned char *md, SHACTX c) {\n  gcry_md_final(c);\n  memcpy(md, gcry_md_read(c, 0), SHA256_DIGEST_LEN);\n  gcry_md_close(c);\n}\n\nvoid sha256(const unsigned char *digest, int len, unsigned char *hash){\n  gcry_md_hash_buffer(GCRY_MD_SHA256, hash, digest, len);\n}\n\nSHA384CTX sha384_init(void) {\n  SHA384CTX ctx = NULL;\n  gcry_md_open(&ctx, GCRY_MD_SHA384, 0);\n\n  return ctx;\n}\n\nvoid sha384_update(SHACTX c, const void *data, unsigned long len) {\n  gcry_md_write(c, data, len);\n}\n\nvoid sha384_final(unsigned char *md, SHACTX c) {\n  gcry_md_final(c);\n  memcpy(md, gcry_md_read(c, 0), SHA384_DIGEST_LEN);\n  gcry_md_close(c);\n}\n\nvoid sha384(const unsigned char *digest, int len, unsigned char *hash) {\n  gcry_md_hash_buffer(GCRY_MD_SHA384, hash, digest, len);\n}\n\nSHA512CTX sha512_init(void) {\n  SHA512CTX ctx = NULL;\n  gcry_md_open(&ctx, GCRY_MD_SHA512, 0);\n\n  return ctx;\n}\n\nvoid sha512_update(SHACTX c, const void *data, unsigned long len) {\n  gcry_md_write(c, data, len);\n}\n\nvoid sha512_final(unsigned char *md, SHACTX c) {\n  gcry_md_final(c);\n  memcpy(md, gcry_md_read(c, 0), SHA512_DIGEST_LEN);\n  gcry_md_close(c);\n}\n\nvoid sha512(const unsigned char *digest, int len, unsigned char *hash) {\n  gcry_md_hash_buffer(GCRY_MD_SHA512, hash, digest, len);\n}\n\nMD5CTX md5_init(void) {\n  MD5CTX c = NULL;\n  gcry_md_open(&c, GCRY_MD_MD5, 0);\n\n  return c;\n}\n\nvoid md5_update(MD5CTX c, const void *data, unsigned long len) {\n    gcry_md_write(c,data,len);\n}\n\nvoid md5_final(unsigned char *md, MD5CTX c) {\n  gcry_md_final(c);\n  memcpy(md, gcry_md_read(c, 0), MD5_DIGEST_LEN);\n  gcry_md_close(c);\n}\n\nint ssh_kdf(struct ssh_crypto_struct *crypto,\n            unsigned char *key, size_t key_len,\n            int key_type, unsigned char *output,\n            size_t requested_len)\n{\n    return sshkdf_derive_key(crypto, key, key_len,\n                             key_type, output, requested_len);\n}\n\nHMACCTX hmac_init(const void *key, int len, enum ssh_hmac_e type) {\n  HMACCTX c = NULL;\n\n  switch(type) {\n    case SSH_HMAC_SHA1:\n      gcry_md_open(&c, GCRY_MD_SHA1, GCRY_MD_FLAG_HMAC);\n      break;\n    case SSH_HMAC_SHA256:\n      gcry_md_open(&c, GCRY_MD_SHA256, GCRY_MD_FLAG_HMAC);\n      break;\n    case SSH_HMAC_SHA512:\n      gcry_md_open(&c, GCRY_MD_SHA512, GCRY_MD_FLAG_HMAC);\n      break;\n    case SSH_HMAC_MD5:\n      gcry_md_open(&c, GCRY_MD_MD5, GCRY_MD_FLAG_HMAC);\n      break;\n    default:\n      c = NULL;\n  }\n\n  gcry_md_setkey(c, key, len);\n\n  return c;\n}\n\nvoid hmac_update(HMACCTX c, const void *data, unsigned long len) {\n  gcry_md_write(c, data, len);\n}\n\nvoid hmac_final(HMACCTX c, unsigned char *hashmacbuf, unsigned int *len) {\n  *len = gcry_md_get_algo_dlen(gcry_md_get_algo(c));\n  memcpy(hashmacbuf, gcry_md_read(c, 0), *len);\n  gcry_md_close(c);\n}\n\n#ifdef WITH_BLOWFISH_CIPHER\n/* the wrapper functions for blowfish */\nstatic int blowfish_set_key(struct ssh_cipher_struct *cipher, void *key, void *IV){\n  if (cipher->key == NULL) {\n    if (alloc_key(cipher) < 0) {\n      return -1;\n    }\n\n    if (gcry_cipher_open(&cipher->key[0], GCRY_CIPHER_BLOWFISH,\n        GCRY_CIPHER_MODE_CBC, 0)) {\n      SAFE_FREE(cipher->key);\n      return -1;\n    }\n    if (gcry_cipher_setkey(cipher->key[0], key, 16)) {\n      SAFE_FREE(cipher->key);\n      return -1;\n    }\n    if (gcry_cipher_setiv(cipher->key[0], IV, 8)) {\n      SAFE_FREE(cipher->key);\n      return -1;\n    }\n  }\n\n  return 0;\n}\n\nstatic void blowfish_encrypt(struct ssh_cipher_struct *cipher, void *in,\n    void *out, unsigned long len) {\n  gcry_cipher_encrypt(cipher->key[0], out, len, in, len);\n}\n\nstatic void blowfish_decrypt(struct ssh_cipher_struct *cipher, void *in,\n    void *out, unsigned long len) {\n  gcry_cipher_decrypt(cipher->key[0], out, len, in, len);\n}\n#endif /* WITH_BLOWFISH_CIPHER */\n\nstatic int aes_set_key(struct ssh_cipher_struct *cipher, void *key, void *IV) {\n  int mode=GCRY_CIPHER_MODE_CBC;\n  if (cipher->key == NULL) {\n    if (alloc_key(cipher) < 0) {\n      return -1;\n    }\n    if(strstr(cipher->name,\"-ctr\"))\n      mode=GCRY_CIPHER_MODE_CTR;\n    if (strstr(cipher->name, \"-gcm\"))\n      mode = GCRY_CIPHER_MODE_GCM;\n    switch (cipher->keysize) {\n      case 128:\n        if (gcry_cipher_open(&cipher->key[0], GCRY_CIPHER_AES128,\n              mode, 0)) {\n          SAFE_FREE(cipher->key);\n          return -1;\n        }\n        break;\n      case 192:\n        if (gcry_cipher_open(&cipher->key[0], GCRY_CIPHER_AES192,\n              mode, 0)) {\n          SAFE_FREE(cipher->key);\n          return -1;\n        }\n        break;\n      case 256:\n        if (gcry_cipher_open(&cipher->key[0], GCRY_CIPHER_AES256,\n              mode, 0)) {\n          SAFE_FREE(cipher->key);\n          return -1;\n        }\n        break;\n      default:\n        SSH_LOG(SSH_LOG_WARNING, \"Unksupported key length %u.\", cipher->keysize);\n        SAFE_FREE(cipher->key);\n        return -1;\n    }\n    if (gcry_cipher_setkey(cipher->key[0], key, cipher->keysize / 8)) {\n      SAFE_FREE(cipher->key);\n      return -1;\n    }\n    if(mode == GCRY_CIPHER_MODE_CBC){\n      if (gcry_cipher_setiv(cipher->key[0], IV, 16)) {\n\n        SAFE_FREE(cipher->key);\n        return -1;\n      }\n    } else if (mode == GCRY_CIPHER_MODE_GCM) {\n      /* Store the IV so we can handle the packet counter increments later\n       * The IV is passed to the cipher context later.\n       */\n      memcpy(cipher->last_iv, IV, AES_GCM_IVLEN);\n    } else {\n      if(gcry_cipher_setctr(cipher->key[0],IV,16)){\n        SAFE_FREE(cipher->key);\n        return -1;\n      }\n    }\n  }\n\n  return 0;\n}\n\nstatic void aes_encrypt(struct ssh_cipher_struct *cipher,\n                        void *in,\n                        void *out,\n                        size_t len)\n{\n    gcry_cipher_encrypt(cipher->key[0], out, len, in, len);\n}\n\nstatic void aes_decrypt(struct ssh_cipher_struct *cipher,\n                        void *in,\n                        void *out,\n                        size_t len)\n{\n    gcry_cipher_decrypt(cipher->key[0], out, len, in, len);\n}\n\nstatic int\naes_aead_get_length(struct ssh_cipher_struct *cipher,\n                    void *in,\n                    uint8_t *out,\n                    size_t len,\n                    uint64_t seq)\n{\n    (void)cipher;\n    (void)seq;\n\n    /* The length is not encrypted: Copy it to the result buffer */\n    memcpy(out, in, len);\n\n    return SSH_OK;\n}\n\nstatic void\naes_gcm_encrypt(struct ssh_cipher_struct *cipher,\n                void *in,\n                void *out,\n                size_t len,\n                uint8_t *tag,\n                uint64_t seq)\n{\n    gpg_error_t err;\n    size_t aadlen, authlen;\n\n    (void)seq;\n\n    aadlen = cipher->lenfield_blocksize;\n    authlen = cipher->tag_size;\n\n    /* increment IV */\n    err = gcry_cipher_setiv(cipher->key[0],\n                            cipher->last_iv,\n                            AES_GCM_IVLEN);\n    /* This actualy does not increment the packet counter for the\n     * current encryption operation, but for the next one. The first\n     * operation needs to be completed with the derived IV.\n     *\n     * The IV buffer has the following structure:\n     * [ 4B static IV ][ 8B packet counter ][ 4B block counter ]\n     */\n    uint64_inc(cipher->last_iv + 4);\n    if (err) {\n        SSH_LOG(SSH_LOG_WARNING, \"gcry_cipher_setiv failed: %s\",\n                gpg_strerror(err));\n        return;\n    }\n\n    /* Pass the authenticated data (packet_length) */\n    err = gcry_cipher_authenticate(cipher->key[0], in, aadlen);\n    if (err) {\n        SSH_LOG(SSH_LOG_WARNING, \"gcry_cipher_authenticate failed: %s\",\n                gpg_strerror(err));\n        return;\n    }\n    memcpy(out, in, aadlen);\n\n    /* Encrypt the rest of the data */\n    err = gcry_cipher_encrypt(cipher->key[0],\n                              (unsigned char *)out + aadlen,\n                              len - aadlen,\n                              (unsigned char *)in + aadlen,\n                              len - aadlen);\n    if (err) {\n        SSH_LOG(SSH_LOG_WARNING, \"gcry_cipher_encrypt failed: %s\",\n                gpg_strerror(err));\n        return;\n    }\n\n    /* Calculate the tag */\n    err = gcry_cipher_gettag(cipher->key[0],\n                             (void *)tag,\n                             authlen);\n    if (err) {\n        SSH_LOG(SSH_LOG_WARNING, \"gcry_cipher_gettag failed: %s\",\n                gpg_strerror(err));\n        return;\n    }\n}\n\nstatic int\naes_gcm_decrypt(struct ssh_cipher_struct *cipher,\n                void *complete_packet,\n                uint8_t *out,\n                size_t encrypted_size,\n                uint64_t seq)\n{\n    gpg_error_t err;\n    size_t aadlen, authlen;\n\n    (void)seq;\n\n    aadlen = cipher->lenfield_blocksize;\n    authlen = cipher->tag_size;\n\n    /* increment IV */\n    err = gcry_cipher_setiv(cipher->key[0],\n                            cipher->last_iv,\n                            AES_GCM_IVLEN);\n    /* This actualy does not increment the packet counter for the\n     * current encryption operation, but for the next one. The first\n     * operation needs to be completed with the derived IV.\n     *\n     * The IV buffer has the following structure:\n     * [ 4B static IV ][ 8B packet counter ][ 4B block counter ]\n     */\n    uint64_inc(cipher->last_iv + 4);\n    if (err) {\n        SSH_LOG(SSH_LOG_WARNING, \"gcry_cipher_setiv failed: %s\",\n                gpg_strerror(err));\n        return SSH_ERROR;\n    }\n\n    /* Pass the authenticated data (packet_length) */\n    err = gcry_cipher_authenticate(cipher->key[0],\n                                   complete_packet,\n                                   aadlen);\n    if (err) {\n        SSH_LOG(SSH_LOG_WARNING, \"gcry_cipher_authenticate failed: %s\",\n                gpg_strerror(err));\n        return SSH_ERROR;\n    }\n    /* Do not copy the length to the target buffer, because it is already processed */\n    //memcpy(out, complete_packet, aadlen);\n\n    /* Encrypt the rest of the data */\n    err = gcry_cipher_decrypt(cipher->key[0],\n                              out,\n                              encrypted_size,\n                              (unsigned char *)complete_packet + aadlen,\n                              encrypted_size);\n    if (err) {\n        SSH_LOG(SSH_LOG_WARNING, \"gcry_cipher_decrypt failed: %s\",\n                gpg_strerror(err));\n        return SSH_ERROR;\n    }\n\n    /* Check the tag */\n    err = gcry_cipher_checktag(cipher->key[0],\n                               (unsigned char *)complete_packet + aadlen + encrypted_size,\n                               authlen);\n    if (gpg_err_code(err) == GPG_ERR_CHECKSUM) {\n        SSH_LOG(SSH_LOG_WARNING, \"The authentication tag does not match\");\n        return SSH_ERROR;\n    } else if (err != GPG_ERR_NO_ERROR) {\n        SSH_LOG(SSH_LOG_WARNING, \"General error while decryption: %s\",\n                gpg_strerror(err));\n        return SSH_ERROR;\n    }\n    return SSH_OK;\n}\n\nstatic int des3_set_key(struct ssh_cipher_struct *cipher, void *key, void *IV) {\n  if (cipher->key == NULL) {\n    if (alloc_key(cipher) < 0) {\n      return -1;\n    }\n    if (gcry_cipher_open(&cipher->key[0], GCRY_CIPHER_3DES,\n          GCRY_CIPHER_MODE_CBC, 0)) {\n      SAFE_FREE(cipher->key);\n      return -1;\n    }\n    if (gcry_cipher_setkey(cipher->key[0], key, 24)) {\n      SAFE_FREE(cipher->key);\n      return -1;\n    }\n    if (gcry_cipher_setiv(cipher->key[0], IV, 8)) {\n      SAFE_FREE(cipher->key);\n      return -1;\n    }\n  }\n\n  return 0;\n}\n\nstatic void des3_encrypt(struct ssh_cipher_struct *cipher, void *in,\n    void *out, unsigned long len) {\n  gcry_cipher_encrypt(cipher->key[0], out, len, in, len);\n}\n\nstatic void des3_decrypt(struct ssh_cipher_struct *cipher, void *in,\n    void *out, unsigned long len) {\n  gcry_cipher_decrypt(cipher->key[0], out, len, in, len);\n}\n\n/* the table of supported ciphers */\nstatic struct ssh_cipher_struct ssh_ciphertab[] = {\n#ifdef WITH_BLOWFISH_CIPHER\n  {\n    .name            = \"blowfish-cbc\",\n    .blocksize       = 8,\n    .keylen          = sizeof(gcry_cipher_hd_t),\n    .key             = NULL,\n    .keysize         = 128,\n    .set_encrypt_key = blowfish_set_key,\n    .set_decrypt_key = blowfish_set_key,\n    .encrypt     = blowfish_encrypt,\n    .decrypt     = blowfish_decrypt\n  },\n#endif /* WITH_BLOWFISH_CIPHER */\n  {\n    .name            = \"aes128-ctr\",\n    .blocksize       = 16,\n    .keylen          = sizeof(gcry_cipher_hd_t),\n    .key             = NULL,\n    .keysize         = 128,\n    .set_encrypt_key = aes_set_key,\n    .set_decrypt_key = aes_set_key,\n    .encrypt     = aes_encrypt,\n    .decrypt     = aes_encrypt\n  },\n  {\n      .name            = \"aes192-ctr\",\n      .blocksize       = 16,\n      .keylen          = sizeof(gcry_cipher_hd_t),\n      .key             = NULL,\n      .keysize         = 192,\n      .set_encrypt_key = aes_set_key,\n      .set_decrypt_key = aes_set_key,\n      .encrypt     = aes_encrypt,\n      .decrypt     = aes_encrypt\n  },\n  {\n      .name            = \"aes256-ctr\",\n      .blocksize       = 16,\n      .keylen          = sizeof(gcry_cipher_hd_t),\n      .key             = NULL,\n      .keysize         = 256,\n      .set_encrypt_key = aes_set_key,\n      .set_decrypt_key = aes_set_key,\n      .encrypt     = aes_encrypt,\n      .decrypt     = aes_encrypt\n  },\n  {\n    .name            = \"aes128-cbc\",\n    .blocksize       = 16,\n    .keylen          = sizeof(gcry_cipher_hd_t),\n    .key             = NULL,\n    .keysize         = 128,\n    .set_encrypt_key = aes_set_key,\n    .set_decrypt_key = aes_set_key,\n    .encrypt     = aes_encrypt,\n    .decrypt     = aes_decrypt\n  },\n  {\n    .name            = \"aes192-cbc\",\n    .blocksize       = 16,\n    .keylen          = sizeof(gcry_cipher_hd_t),\n    .key             = NULL,\n    .keysize         = 192,\n    .set_encrypt_key = aes_set_key,\n    .set_decrypt_key = aes_set_key,\n    .encrypt     = aes_encrypt,\n    .decrypt     = aes_decrypt\n  },\n  {\n    .name            = \"aes256-cbc\",\n    .blocksize       = 16,\n    .keylen          = sizeof(gcry_cipher_hd_t),\n    .key             = NULL,\n    .keysize         = 256,\n    .set_encrypt_key = aes_set_key,\n    .set_decrypt_key = aes_set_key,\n    .encrypt     = aes_encrypt,\n    .decrypt     = aes_decrypt\n  },\n  {\n    .name            = \"aes128-gcm@openssh.com\",\n    .blocksize       = 16,\n    .lenfield_blocksize = 4, /* not encrypted, but authenticated */\n    .keylen          = sizeof(gcry_cipher_hd_t),\n    .key             = NULL,\n    .keysize         = 128,\n    .tag_size        = AES_GCM_TAGLEN,\n    .set_encrypt_key = aes_set_key,\n    .set_decrypt_key = aes_set_key,\n    .aead_encrypt    = aes_gcm_encrypt,\n    .aead_decrypt_length = aes_aead_get_length,\n    .aead_decrypt    = aes_gcm_decrypt,\n  },\n  {\n    .name            = \"aes256-gcm@openssh.com\",\n    .blocksize       = 16,\n    .lenfield_blocksize = 4, /* not encrypted, but authenticated */\n    .keylen          = sizeof(gcry_cipher_hd_t),\n    .key             = NULL,\n    .keysize         = 256,\n    .tag_size        = AES_GCM_TAGLEN,\n    .set_encrypt_key = aes_set_key,\n    .set_decrypt_key = aes_set_key,\n    .aead_encrypt    = aes_gcm_encrypt,\n    .aead_decrypt_length = aes_aead_get_length,\n    .aead_decrypt    = aes_gcm_decrypt,\n  },\n  {\n    .name            = \"3des-cbc\",\n    .blocksize       = 8,\n    .keylen          = sizeof(gcry_cipher_hd_t),\n    .key             = NULL,\n    .keysize         = 192,\n    .set_encrypt_key = des3_set_key,\n    .set_decrypt_key = des3_set_key,\n    .encrypt     = des3_encrypt,\n    .decrypt     = des3_decrypt\n  },\n  {\n    .name = \"chacha20-poly1305@openssh.com\"\n  },\n  {\n    .name            = NULL,\n    .blocksize       = 0,\n    .keylen          = 0,\n    .key             = NULL,\n    .keysize         = 0,\n    .set_encrypt_key = NULL,\n    .set_decrypt_key = NULL,\n    .encrypt     = NULL,\n    .decrypt     = NULL\n  }\n};\n\nstruct ssh_cipher_struct *ssh_get_ciphertab(void)\n{\n  return ssh_ciphertab;\n}\n\n/*\n * Extract an MPI from the given s-expression SEXP named NAME which is\n * encoded using INFORMAT and store it in a newly allocated ssh_string\n * encoded using OUTFORMAT.\n */\nssh_string ssh_sexp_extract_mpi(const gcry_sexp_t sexp,\n                                const char *name,\n                                enum gcry_mpi_format informat,\n                                enum gcry_mpi_format outformat)\n{\n    gpg_error_t err;\n    ssh_string result = NULL;\n    gcry_sexp_t fragment = NULL;\n    gcry_mpi_t mpi = NULL;\n    size_t size;\n\n    fragment = gcry_sexp_find_token(sexp, name, 0);\n    if (fragment == NULL) {\n        goto fail;\n    }\n\n    mpi = gcry_sexp_nth_mpi(fragment, 1, informat);\n    if (mpi == NULL) {\n        goto fail;\n    }\n\n    err = gcry_mpi_print(outformat, NULL, 0, &size, mpi);\n    if (err != 0) {\n        goto fail;\n    }\n\n    result = ssh_string_new(size);\n    if (result == NULL) {\n        goto fail;\n    }\n\n    err = gcry_mpi_print(outformat, ssh_string_data(result), size, NULL, mpi);\n    if (err != 0) {\n        ssh_string_burn(result);\n        SSH_STRING_FREE(result);\n        result = NULL;\n        goto fail;\n    }\n\nfail:\n    gcry_sexp_release(fragment);\n    gcry_mpi_release(mpi);\n    return result;\n}\n\n\n/**\n * @internal\n *\n * @brief Initialize libgcrypt's subsystem\n */\nint ssh_crypto_init(void)\n{\n    size_t i;\n\n    if (libgcrypt_initialized) {\n        return SSH_OK;\n    }\n\n    gcry_check_version(NULL);\n\n    /* While the secure memory is not set up */\n    gcry_control (GCRYCTL_SUSPEND_SECMEM_WARN);\n\n    if (!gcry_control(GCRYCTL_INITIALIZATION_FINISHED_P, 0)) {\n        gcry_control(GCRYCTL_INIT_SECMEM, 4096);\n        gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0);\n    }\n\n    /* Re-enable warning */\n    gcry_control (GCRYCTL_RESUME_SECMEM_WARN);\n\n    for (i = 0; ssh_ciphertab[i].name != NULL; i++) {\n        int cmp;\n        cmp = strcmp(ssh_ciphertab[i].name, \"chacha20-poly1305@openssh.com\");\n        if (cmp == 0) {\n            memcpy(&ssh_ciphertab[i],\n                   ssh_get_chacha20poly1305_cipher(),\n                   sizeof(struct ssh_cipher_struct));\n            break;\n        }\n    }\n\n    libgcrypt_initialized = 1;\n\n    return SSH_OK;\n}\n\n/**\n * @internal\n *\n * @brief Finalize libgcrypt's subsystem\n */\nvoid ssh_crypto_finalize(void)\n{\n    if (!libgcrypt_initialized) {\n        return;\n    }\n\n    gcry_control(GCRYCTL_TERM_SECMEM);\n\n    libgcrypt_initialized = 0;\n}\n\n#endif\n"
  },
  {
    "path": "src/libssh/src/libmbedcrypto.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2017 Sartura d.o.o.\n *\n * Author: Juraj Vijtiuk <juraj.vijtiuk@sartura.hr>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include \"libssh/wrapper.h\"\n#include \"libssh/crypto.h\"\n#include \"libssh/priv.h\"\n#include \"libssh/misc.h\"\n\n#ifdef HAVE_LIBMBEDCRYPTO\n#include <mbedtls/md.h>\n#ifdef MBEDTLS_GCM_C\n#include <mbedtls/gcm.h>\n#endif /* MBEDTLS_GCM_C */\n\nstatic mbedtls_entropy_context ssh_mbedtls_entropy;\nstatic mbedtls_ctr_drbg_context ssh_mbedtls_ctr_drbg;\n\nstatic int libmbedcrypto_initialized = 0;\n\nvoid ssh_reseed(void)\n{\n    mbedtls_ctr_drbg_reseed(&ssh_mbedtls_ctr_drbg, NULL, 0);\n}\n\nint ssh_get_random(void *where, int len, int strong)\n{\n    return ssh_mbedtls_random(where, len, strong);\n}\n\nSHACTX sha1_init(void)\n{\n    SHACTX ctx = NULL;\n    int rc;\n    const mbedtls_md_info_t *md_info =\n        mbedtls_md_info_from_type(MBEDTLS_MD_SHA1);\n\n    if (md_info == NULL) {\n        return NULL;\n    }\n\n    ctx = malloc(sizeof(mbedtls_md_context_t));\n    if (ctx == NULL) {\n        return NULL;\n    }\n\n    mbedtls_md_init(ctx);\n\n    rc = mbedtls_md_setup(ctx, md_info, 0);\n    if (rc != 0) {\n        SAFE_FREE(ctx);\n        return NULL;\n    }\n\n    rc = mbedtls_md_starts(ctx);\n    if (rc != 0) {\n        SAFE_FREE(ctx);\n        return NULL;\n    }\n\n    return ctx;\n}\n\nvoid sha1_update(SHACTX c, const void *data, unsigned long len)\n{\n    mbedtls_md_update(c, data, len);\n}\n\nvoid sha1_final(unsigned char *md, SHACTX c)\n{\n    mbedtls_md_finish(c, md);\n    mbedtls_md_free(c);\n    SAFE_FREE(c);\n}\n\nvoid sha1(const unsigned char *digest, int len, unsigned char *hash)\n{\n    const mbedtls_md_info_t *md_info =\n        mbedtls_md_info_from_type(MBEDTLS_MD_SHA1);\n    if (md_info != NULL) {\n        mbedtls_md(md_info, digest, len, hash);\n    }\n}\n\nstatic mbedtls_md_type_t nid_to_md_algo(int nid)\n{\n    switch (nid) {\n        case NID_mbedtls_nistp256:\n            return MBEDTLS_MD_SHA256;\n        case NID_mbedtls_nistp384:\n            return MBEDTLS_MD_SHA384;\n        case NID_mbedtls_nistp521:\n            return MBEDTLS_MD_SHA512;\n    }\n    return MBEDTLS_MD_NONE;\n}\n\nvoid evp(int nid, unsigned char *digest, int len,\n        unsigned char *hash, unsigned int *hlen)\n{\n    mbedtls_md_type_t algo = nid_to_md_algo(nid);\n    const mbedtls_md_info_t *md_info =\n        mbedtls_md_info_from_type(algo);\n\n\n    if (md_info != NULL) {\n        *hlen = mbedtls_md_get_size(md_info);\n        mbedtls_md(md_info, digest, len, hash);\n    }\n}\n\nEVPCTX evp_init(int nid)\n{\n    EVPCTX ctx = NULL;\n    int rc;\n    mbedtls_md_type_t algo = nid_to_md_algo(nid);\n    const mbedtls_md_info_t *md_info =\n        mbedtls_md_info_from_type(algo);\n\n    if (md_info == NULL) {\n        return NULL;\n    }\n\n    ctx = malloc(sizeof(mbedtls_md_context_t));\n    if (ctx == NULL) {\n        return NULL;\n    }\n\n    mbedtls_md_init(ctx);\n\n    rc = mbedtls_md_setup(ctx, md_info, 0);\n    if (rc != 0) {\n        SAFE_FREE(ctx);\n        return NULL;\n    }\n\n    rc = mbedtls_md_starts(ctx);\n    if (rc != 0) {\n        SAFE_FREE(ctx);\n        return NULL;\n    }\n\n    return ctx;\n}\n\nvoid evp_update(EVPCTX ctx, const void *data, unsigned long len)\n{\n    mbedtls_md_update(ctx, data, len);\n}\n\nvoid evp_final(EVPCTX ctx, unsigned char *md, unsigned int *mdlen)\n{\n    *mdlen = mbedtls_md_get_size(ctx->md_info);\n    mbedtls_md_finish(ctx, md);\n    mbedtls_md_free(ctx);\n    SAFE_FREE(ctx);\n}\n\nSHA256CTX sha256_init(void)\n{\n    SHA256CTX ctx = NULL;\n    int rc;\n    const mbedtls_md_info_t *md_info =\n        mbedtls_md_info_from_type(MBEDTLS_MD_SHA256);\n\n    if (md_info == NULL) {\n        return NULL;\n    }\n\n    ctx = malloc(sizeof(mbedtls_md_context_t));\n    if(ctx == NULL) {\n        return NULL;\n    }\n\n    mbedtls_md_init(ctx);\n\n    rc = mbedtls_md_setup(ctx, md_info, 0);\n    if (rc != 0) {\n        SAFE_FREE(ctx);\n        return NULL;\n    }\n\n    rc = mbedtls_md_starts(ctx);\n    if (rc != 0) {\n        SAFE_FREE(ctx);\n        return NULL;\n    }\n\n    return ctx;\n}\n\nvoid sha256_update(SHA256CTX c, const void *data, unsigned long len)\n{\n    mbedtls_md_update(c, data, len);\n}\n\nvoid sha256_final(unsigned char *md, SHA256CTX c)\n{\n    mbedtls_md_finish(c, md);\n    mbedtls_md_free(c);\n    SAFE_FREE(c);\n}\n\nvoid sha256(const unsigned char *digest, int len, unsigned char *hash)\n{\n    const mbedtls_md_info_t *md_info =\n        mbedtls_md_info_from_type(MBEDTLS_MD_SHA256);\n    if (md_info != NULL) {\n        mbedtls_md(md_info, digest, len, hash);\n    }\n}\n\nSHA384CTX sha384_init(void)\n{\n    SHA384CTX ctx = NULL;\n    int rc;\n    const mbedtls_md_info_t *md_info =\n        mbedtls_md_info_from_type(MBEDTLS_MD_SHA384);\n\n    if (md_info == NULL) {\n        return NULL;\n    }\n\n    ctx = malloc(sizeof(mbedtls_md_context_t));\n    if (ctx == NULL) {\n        return NULL;\n    }\n\n    mbedtls_md_init(ctx);\n\n    rc = mbedtls_md_setup(ctx, md_info, 0);\n    if (rc != 0) {\n        SAFE_FREE(ctx);\n        return NULL;\n    }\n\n    rc = mbedtls_md_starts(ctx);\n    if (rc != 0) {\n        SAFE_FREE(ctx);\n        return NULL;\n    }\n\n    return ctx;\n}\n\nvoid sha384_update(SHA384CTX c, const void *data, unsigned long len)\n{\n    mbedtls_md_update(c, data, len);\n}\n\nvoid sha384_final(unsigned char *md, SHA384CTX c)\n{\n    mbedtls_md_finish(c, md);\n    mbedtls_md_free(c);\n    SAFE_FREE(c);\n}\n\nvoid sha384(const unsigned char *digest, int len, unsigned char *hash)\n{\n    const mbedtls_md_info_t *md_info =\n        mbedtls_md_info_from_type(MBEDTLS_MD_SHA384);\n    if (md_info != NULL) {\n        mbedtls_md(md_info, digest, len, hash);\n    }\n}\n\nSHA512CTX sha512_init(void)\n{\n    SHA512CTX ctx = NULL;\n    int rc;\n    const mbedtls_md_info_t *md_info =\n        mbedtls_md_info_from_type(MBEDTLS_MD_SHA512);\n    if (md_info == NULL) {\n        return NULL;\n    }\n\n    ctx = malloc(sizeof(mbedtls_md_context_t));\n    if (ctx == NULL) {\n        return NULL;\n    }\n\n    mbedtls_md_init(ctx);\n\n    rc = mbedtls_md_setup(ctx, md_info, 0);\n    if (rc != 0) {\n        SAFE_FREE(ctx);\n        return NULL;\n    }\n\n    rc = mbedtls_md_starts(ctx);\n    if (rc != 0) {\n        SAFE_FREE(ctx);\n        return NULL;\n    }\n\n    return ctx;\n}\n\nvoid sha512_update(SHA512CTX c, const void *data, unsigned long len)\n{\n    mbedtls_md_update(c, data, len);\n}\n\nvoid sha512_final(unsigned char *md, SHA512CTX c)\n{\n    mbedtls_md_finish(c, md);\n    mbedtls_md_free(c);\n    SAFE_FREE(c);\n}\n\nvoid sha512(const unsigned char *digest, int len, unsigned char *hash)\n{\n    const mbedtls_md_info_t *md_info =\n        mbedtls_md_info_from_type(MBEDTLS_MD_SHA512);\n    if (md_info != NULL) {\n        mbedtls_md(md_info, digest, len, hash);\n    }\n}\n\nMD5CTX md5_init(void)\n{\n    MD5CTX ctx = NULL;\n    int rc;\n    const mbedtls_md_info_t *md_info =\n        mbedtls_md_info_from_type(MBEDTLS_MD_MD5);\n    if (md_info == NULL) {\n        return NULL;\n    }\n\n    ctx = malloc(sizeof(mbedtls_md_context_t));\n    if (ctx == NULL) {\n        return NULL;\n    }\n\n    mbedtls_md_init(ctx);\n\n    rc = mbedtls_md_setup(ctx, md_info, 0);\n    if (rc != 0) {\n        SAFE_FREE(ctx);\n        return NULL;\n    }\n\n    rc = mbedtls_md_starts(ctx);\n    if (rc != 0) {\n        SAFE_FREE(ctx);\n        return NULL;\n    }\n\n    return ctx;\n}\n\n\nvoid md5_update(MD5CTX c, const void *data, unsigned long len) {\n    mbedtls_md_update(c, data, len);\n}\n\nvoid md5_final(unsigned char *md, MD5CTX c)\n{\n    mbedtls_md_finish(c, md);\n    mbedtls_md_free(c);\n    SAFE_FREE(c);\n}\n\nint ssh_kdf(struct ssh_crypto_struct *crypto,\n            unsigned char *key, size_t key_len,\n            int key_type, unsigned char *output,\n            size_t requested_len)\n{\n    return sshkdf_derive_key(crypto, key, key_len,\n                             key_type, output, requested_len);\n}\n\nHMACCTX hmac_init(const void *key, int len, enum ssh_hmac_e type)\n{\n    HMACCTX ctx = NULL;\n    const mbedtls_md_info_t *md_info = NULL;\n    int rc;\n\n    ctx = malloc(sizeof(mbedtls_md_context_t));\n    if (ctx == NULL) {\n        return NULL;\n    }\n\n    switch (type) {\n        case SSH_HMAC_SHA1:\n            md_info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA1);\n            break;\n        case SSH_HMAC_SHA256:\n            md_info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA256);\n            break;\n        case SSH_HMAC_SHA512:\n            md_info = mbedtls_md_info_from_type(MBEDTLS_MD_SHA512);\n            break;\n        default:\n            goto error;\n    }\n\n    mbedtls_md_init(ctx);\n\n    if (md_info == NULL) {\n        goto error;\n    }\n\n    rc = mbedtls_md_setup(ctx, md_info, 1);\n    if (rc != 0) {\n        goto error;\n    }\n\n    rc = mbedtls_md_hmac_starts(ctx, key, len);\n    if (rc != 0) {\n        goto error;\n    }\n\n    return ctx;\n\nerror:\n    mbedtls_md_free(ctx);\n    SAFE_FREE(ctx);\n    return NULL;\n}\n\nvoid hmac_update(HMACCTX c, const void *data, unsigned long len)\n{\n    mbedtls_md_hmac_update(c, data, len);\n}\n\nvoid hmac_final(HMACCTX c, unsigned char *hashmacbuf, unsigned int *len)\n{\n    *len = mbedtls_md_get_size(c->md_info);\n    mbedtls_md_hmac_finish(c, hashmacbuf);\n    mbedtls_md_free(c);\n    SAFE_FREE(c);\n}\n\nstatic int\ncipher_init(struct ssh_cipher_struct *cipher,\n            mbedtls_operation_t operation,\n            void *key,\n            void *IV)\n{\n    const mbedtls_cipher_info_t *cipher_info = NULL;\n    mbedtls_cipher_context_t *ctx;\n    int rc;\n\n    if (operation == MBEDTLS_ENCRYPT) {\n        ctx = &cipher->encrypt_ctx;\n    } else if (operation == MBEDTLS_DECRYPT) {\n        ctx = &cipher->decrypt_ctx;\n    } else {\n        SSH_LOG(SSH_LOG_WARNING, \"unknown operation\");\n        return 1;\n    }\n\n    mbedtls_cipher_init(ctx);\n    cipher_info = mbedtls_cipher_info_from_type(cipher->type);\n\n    rc = mbedtls_cipher_setup(ctx, cipher_info);\n    if (rc != 0) {\n        SSH_LOG(SSH_LOG_WARNING, \"mbedtls_cipher_setup failed\");\n        goto error;\n    }\n\n    rc = mbedtls_cipher_setkey(ctx, key,\n                               cipher_info->key_bitlen,\n                               operation);\n    if (rc != 0) {\n        SSH_LOG(SSH_LOG_WARNING, \"mbedtls_cipher_setkey failed\");\n        goto error;\n    }\n\n    rc = mbedtls_cipher_set_iv(ctx, IV, cipher_info->iv_size);\n    if (rc != 0) {\n        SSH_LOG(SSH_LOG_WARNING, \"mbedtls_cipher_set_iv failed\");\n        goto error;\n    }\n\n    return 0;\nerror:\n    mbedtls_cipher_free(ctx);\n    return 1;\n}\n\nstatic int\ncipher_set_encrypt_key(struct ssh_cipher_struct *cipher,\n                       void *key,\n                       void *IV)\n{\n    int rc;\n\n    rc = cipher_init(cipher, MBEDTLS_ENCRYPT, key, IV);\n    if (rc != 0) {\n        SSH_LOG(SSH_LOG_WARNING, \"cipher_init failed\");\n        goto error;\n    }\n\n    rc = mbedtls_cipher_reset(&cipher->encrypt_ctx);\n    if (rc != 0) {\n        SSH_LOG(SSH_LOG_WARNING, \"mbedtls_cipher_reset failed\");\n        goto error;\n    }\n\n    return SSH_OK;\nerror:\n    return SSH_ERROR;\n}\n\nstatic int\ncipher_set_encrypt_key_cbc(struct ssh_cipher_struct *cipher,\n                           void *key,\n                           void *IV)\n{\n    int rc;\n\n    rc = cipher_init(cipher, MBEDTLS_ENCRYPT, key, IV);\n    if (rc != 0) {\n        SSH_LOG(SSH_LOG_WARNING, \"cipher_init failed\");\n        goto error;\n    }\n\n    /* libssh only encypts and decrypts packets that are multiples of a block\n     * size, and no padding is used */\n    rc = mbedtls_cipher_set_padding_mode(&cipher->encrypt_ctx,\n            MBEDTLS_PADDING_NONE);\n\n    if (rc != 0) {\n        SSH_LOG(SSH_LOG_WARNING, \"mbedtls_cipher_set_padding_mode failed\");\n        goto error;\n    }\n\n    rc = mbedtls_cipher_reset(&cipher->encrypt_ctx);\n    if (rc != 0) {\n        SSH_LOG(SSH_LOG_WARNING, \"mbedtls_cipher_reset failed\");\n        goto error;\n    }\n\n    return SSH_OK;\nerror:\n    mbedtls_cipher_free(&cipher->encrypt_ctx);\n    return SSH_ERROR;\n}\n\n#ifdef MBEDTLS_GCM_C\nstatic int\ncipher_set_key_gcm(struct ssh_cipher_struct *cipher,\n                   void *key,\n                   void *IV)\n{\n    const mbedtls_cipher_info_t *cipher_info = NULL;\n    int rc;\n\n    mbedtls_gcm_init(&cipher->gcm_ctx);\n    cipher_info = mbedtls_cipher_info_from_type(cipher->type);\n\n    rc = mbedtls_gcm_setkey(&cipher->gcm_ctx,\n                            MBEDTLS_CIPHER_ID_AES,\n                            key,\n                            cipher_info->key_bitlen);\n    if (rc != 0) {\n        SSH_LOG(SSH_LOG_WARNING, \"mbedtls_gcm_setkey failed\");\n        goto error;\n    }\n\n    /* Store the IV so we can increment the packet counter later */\n    memcpy(cipher->last_iv, IV, AES_GCM_IVLEN);\n\n    return 0;\nerror:\n    mbedtls_gcm_free(&cipher->gcm_ctx);\n    return 1;\n}\n#endif /* MBEDTLS_GCM_C */\n\nstatic int\ncipher_set_decrypt_key(struct ssh_cipher_struct *cipher,\n                       void *key,\n                       void *IV)\n{\n    int rc;\n\n    rc = cipher_init(cipher, MBEDTLS_DECRYPT, key, IV);\n    if (rc != 0) {\n        SSH_LOG(SSH_LOG_WARNING, \"cipher_init failed\");\n        goto error;\n    }\n\n    mbedtls_cipher_reset(&cipher->decrypt_ctx);\n    if (rc != 0) {\n        SSH_LOG(SSH_LOG_WARNING, \"mbedtls_cipher_reset failed\");\n        goto error;\n    }\n\n    return SSH_OK;\nerror:\n    mbedtls_cipher_free(&cipher->decrypt_ctx);\n    return SSH_ERROR;\n}\n\nstatic int\ncipher_set_decrypt_key_cbc(struct ssh_cipher_struct *cipher,\n                           void *key,\n                           void *IV)\n{\n    int rc;\n\n    rc = cipher_init(cipher, MBEDTLS_DECRYPT, key, IV);\n    if (rc != 0) {\n        SSH_LOG(SSH_LOG_WARNING, \"cipher_init failed\");\n        goto error;\n    }\n\n    rc = mbedtls_cipher_set_padding_mode(&cipher->decrypt_ctx,\n            MBEDTLS_PADDING_NONE);\n    if (rc != 0) {\n        SSH_LOG(SSH_LOG_WARNING, \"mbedtls_cipher_set_padding_mode failed\");\n        goto error;\n    }\n\n    mbedtls_cipher_reset(&cipher->decrypt_ctx);\n    if (rc != 0) {\n        SSH_LOG(SSH_LOG_WARNING, \"mbedtls_cipher_reset failed\");\n        goto error;\n    }\n\n    return SSH_OK;\nerror:\n    mbedtls_cipher_free(&cipher->decrypt_ctx);\n    return SSH_ERROR;\n}\n\nstatic void cipher_encrypt(struct ssh_cipher_struct *cipher,\n                           void *in,\n                           void *out,\n                           size_t len)\n{\n    size_t outlen = 0;\n    size_t total_len = 0;\n    int rc = 0;\n    rc = mbedtls_cipher_update(&cipher->encrypt_ctx, in, len, out, &outlen);\n    if (rc != 0) {\n        SSH_LOG(SSH_LOG_WARNING, \"mbedtls_cipher_update failed during encryption\");\n        return;\n    }\n\n    total_len += outlen;\n\n    if (total_len == len) {\n        return;\n    }\n\n    rc = mbedtls_cipher_finish(&cipher->encrypt_ctx, (unsigned char *) out + outlen,\n            &outlen);\n\n    total_len += outlen;\n\n    if (rc != 0) {\n        SSH_LOG(SSH_LOG_WARNING, \"mbedtls_cipher_finish failed during encryption\");\n        return;\n    }\n\n    if (total_len != len) {\n        SSH_LOG(SSH_LOG_WARNING, \"mbedtls_cipher_update: output size %zu for %zu\",\n                outlen, len);\n        return;\n    }\n\n}\n\nstatic void cipher_encrypt_cbc(struct ssh_cipher_struct *cipher, void *in, void *out,\n        unsigned long len)\n{\n    size_t outlen = 0;\n    int rc = 0;\n    rc = mbedtls_cipher_update(&cipher->encrypt_ctx, in, len, out, &outlen);\n    if (rc != 0) {\n        SSH_LOG(SSH_LOG_WARNING, \"mbedtls_cipher_update failed during encryption\");\n        return;\n    }\n\n    if (outlen != len) {\n        SSH_LOG(SSH_LOG_WARNING, \"mbedtls_cipher_update: output size %zu for %zu\",\n                outlen, len);\n        return;\n    }\n\n}\n\nstatic void cipher_decrypt(struct ssh_cipher_struct *cipher,\n                           void *in,\n                           void *out,\n                           size_t len)\n{\n    size_t outlen = 0;\n    int rc = 0;\n    size_t total_len = 0;\n\n    rc = mbedtls_cipher_update(&cipher->decrypt_ctx, in, len, out, &outlen);\n    if (rc != 0) {\n        SSH_LOG(SSH_LOG_WARNING, \"mbedtls_cipher_update failed during decryption\");\n        return;\n    }\n\n    total_len += outlen;\n\n    if (total_len == len) {\n        return;\n    }\n\n    rc = mbedtls_cipher_finish(&cipher->decrypt_ctx, (unsigned char *) out +\n            outlen, &outlen);\n\n    if (rc != 0) {\n        SSH_LOG(SSH_LOG_WARNING, \"mbedtls_cipher_reset failed during decryption\");\n        return;\n    }\n\n    total_len += outlen;\n\n    if (total_len != len) {\n        SSH_LOG(SSH_LOG_WARNING, \"mbedtls_cipher_update: output size %zu for %zu\",\n                outlen, len);\n        return;\n    }\n\n}\n\nstatic void cipher_decrypt_cbc(struct ssh_cipher_struct *cipher, void *in, void *out,\n        unsigned long len)\n{\n    size_t outlen = 0;\n    int rc = 0;\n    rc = mbedtls_cipher_update(&cipher->decrypt_ctx, in, len, out, &outlen);\n    if (rc != 0) {\n        SSH_LOG(SSH_LOG_WARNING, \"mbedtls_cipher_update failed during decryption\");\n        return;\n    }\n\n    /* MbedTLS caches the last block when decrypting with cbc.\n     * By calling finish the block is flushed to out, however the unprocessed\n     * data counter is not reset.\n     * Calling mbedtls_cipher_reset resets the unprocessed data counter.\n     */\n    if (outlen == 0) {\n        rc = mbedtls_cipher_finish(&cipher->decrypt_ctx, out, &outlen);\n    } else if (outlen == len) {\n        return;\n    } else {\n        rc = mbedtls_cipher_finish(&cipher->decrypt_ctx, (unsigned char *) out +\n                outlen , &outlen);\n    }\n\n    if (rc != 0) {\n        SSH_LOG(SSH_LOG_WARNING, \"mbedtls_cipher_finish failed during decryption\");\n        return;\n    }\n\n    rc = mbedtls_cipher_reset(&cipher->decrypt_ctx);\n\n    if (rc != 0) {\n        SSH_LOG(SSH_LOG_WARNING, \"mbedtls_cipher_reset failed during decryption\");\n        return;\n    }\n\n    if (outlen != len) {\n        SSH_LOG(SSH_LOG_WARNING, \"mbedtls_cipher_update: output size %zu for %zu\",\n                outlen, len);\n        return;\n    }\n\n}\n\n#ifdef MBEDTLS_GCM_C\nstatic int\ncipher_gcm_get_length(struct ssh_cipher_struct *cipher,\n                      void *in,\n                      uint8_t *out,\n                      size_t len,\n                      uint64_t seq)\n{\n    (void)cipher;\n    (void)seq;\n\n    /* The length is not encrypted: Copy it to the result buffer */\n    memcpy(out, in, len);\n\n    return SSH_OK;\n}\n\nstatic void\ncipher_encrypt_gcm(struct ssh_cipher_struct *cipher,\n                   void *in,\n                   void *out,\n                   size_t len,\n                   uint8_t *tag,\n                   uint64_t seq)\n{\n    size_t authlen, aadlen;\n    int rc;\n\n    (void) seq;\n\n    aadlen = cipher->lenfield_blocksize;\n    authlen = cipher->tag_size;\n\n    /* The length is not encrypted */\n    memcpy(out, in, aadlen);\n    rc = mbedtls_gcm_crypt_and_tag(&cipher->gcm_ctx,\n                                   MBEDTLS_GCM_ENCRYPT,\n                                   len - aadlen, /* encrypted data len */\n                                   cipher->last_iv, /* IV */\n                                   AES_GCM_IVLEN,\n                                   in, /* aad */\n                                   aadlen,\n                                   (const unsigned char *)in + aadlen, /* input */\n                                   (unsigned char *)out + aadlen, /* output */\n                                   authlen,\n                                   tag); /* tag */\n    if (rc != 0) {\n        SSH_LOG(SSH_LOG_WARNING, \"mbedtls_gcm_crypt_and_tag failed\");\n        return;\n    }\n\n    /* Increment the IV for the next invocation */\n    uint64_inc(cipher->last_iv + 4);\n}\n\nstatic int\ncipher_decrypt_gcm(struct ssh_cipher_struct *cipher,\n                   void *complete_packet,\n                   uint8_t *out,\n                   size_t encrypted_size,\n                   uint64_t seq)\n{\n    size_t authlen, aadlen;\n    int rc;\n\n    (void) seq;\n\n    aadlen = cipher->lenfield_blocksize;\n    authlen = cipher->tag_size;\n\n    rc = mbedtls_gcm_auth_decrypt(&cipher->gcm_ctx,\n                                  encrypted_size, /* encrypted data len */\n                                  cipher->last_iv, /* IV */\n                                  AES_GCM_IVLEN,\n                                  complete_packet, /* aad */\n                                  aadlen,\n                                  (const uint8_t *)complete_packet + aadlen + encrypted_size, /* tag */\n                                  authlen,\n                                  (const uint8_t *)complete_packet + aadlen, /* input */\n                                  (unsigned char *)out); /* output */\n    if (rc != 0) {\n        SSH_LOG(SSH_LOG_WARNING, \"mbedtls_gcm_auth_decrypt failed\");\n        return SSH_ERROR;\n    }\n\n    /* Increment the IV for the next invocation */\n    uint64_inc(cipher->last_iv + 4);\n\n    return SSH_OK;\n}\n#endif /* MBEDTLS_GCM_C */\n\nstatic void cipher_cleanup(struct ssh_cipher_struct *cipher)\n{\n    mbedtls_cipher_free(&cipher->encrypt_ctx);\n    mbedtls_cipher_free(&cipher->decrypt_ctx);\n#ifdef MBEDTLS_GCM_C\n    mbedtls_gcm_free(&cipher->gcm_ctx);\n#endif /* MBEDTLS_GCM_C */\n}\n\nstatic struct ssh_cipher_struct ssh_ciphertab[] = {\n#ifdef WITH_BLOWFISH_CIPHER\n    {\n        .name = \"blowfish-cbc\",\n        .blocksize = 8,\n        .keysize = 128,\n        .type = MBEDTLS_CIPHER_BLOWFISH_CBC,\n        .set_encrypt_key = cipher_set_encrypt_key_cbc,\n        .set_decrypt_key = cipher_set_decrypt_key_cbc,\n        .encrypt = cipher_encrypt_cbc,\n        .decrypt = cipher_decrypt_cbc,\n        .cleanup = cipher_cleanup\n    },\n#endif /* WITH_BLOWFISH_CIPHER */\n    {\n        .name = \"aes128-ctr\",\n        .blocksize = 16,\n        .keysize = 128,\n        .type = MBEDTLS_CIPHER_AES_128_CTR,\n        .set_encrypt_key = cipher_set_encrypt_key,\n        .set_decrypt_key = cipher_set_decrypt_key,\n        .encrypt = cipher_encrypt,\n        .decrypt = cipher_decrypt,\n        .cleanup = cipher_cleanup\n    },\n    {\n        .name = \"aes192-ctr\",\n        .blocksize = 16,\n        .keysize = 192,\n        .type = MBEDTLS_CIPHER_AES_192_CTR,\n        .set_encrypt_key = cipher_set_encrypt_key,\n        .set_decrypt_key = cipher_set_decrypt_key,\n        .encrypt = cipher_encrypt,\n        .decrypt = cipher_decrypt,\n        .cleanup = cipher_cleanup\n    },\n    {\n        .name = \"aes256-ctr\",\n        .blocksize = 16,\n        .keysize = 256,\n        .type = MBEDTLS_CIPHER_AES_256_CTR,\n        .set_encrypt_key = cipher_set_encrypt_key,\n        .set_decrypt_key = cipher_set_decrypt_key,\n        .encrypt = cipher_encrypt,\n        .decrypt = cipher_decrypt,\n        .cleanup = cipher_cleanup\n    },\n    {\n        .name = \"aes128-cbc\",\n        .blocksize = 16,\n        .keysize = 128,\n        .type = MBEDTLS_CIPHER_AES_128_CBC,\n        .set_encrypt_key = cipher_set_encrypt_key_cbc,\n        .set_decrypt_key = cipher_set_decrypt_key_cbc,\n        .encrypt = cipher_encrypt_cbc,\n        .decrypt = cipher_decrypt_cbc,\n        .cleanup = cipher_cleanup\n    },\n    {\n        .name = \"aes192-cbc\",\n        .blocksize = 16,\n        .keysize = 192,\n        .type = MBEDTLS_CIPHER_AES_192_CBC,\n        .set_encrypt_key = cipher_set_encrypt_key_cbc,\n        .set_decrypt_key = cipher_set_decrypt_key_cbc,\n        .encrypt = cipher_encrypt_cbc,\n        .decrypt = cipher_decrypt_cbc,\n        .cleanup = cipher_cleanup\n    },\n    {\n        .name = \"aes256-cbc\",\n        .blocksize = 16,\n        .keysize = 256,\n        .type = MBEDTLS_CIPHER_AES_256_CBC,\n        .set_encrypt_key = cipher_set_encrypt_key_cbc,\n        .set_decrypt_key = cipher_set_decrypt_key_cbc,\n        .encrypt = cipher_encrypt_cbc,\n        .decrypt = cipher_decrypt_cbc,\n        .cleanup = cipher_cleanup\n    },\n#ifdef MBEDTLS_GCM_C\n    {\n        .name = \"aes128-gcm@openssh.com\",\n        .blocksize = 16,\n        .lenfield_blocksize = 4, /* not encrypted, but authenticated */\n        .keysize = 128,\n        .tag_size = AES_GCM_TAGLEN,\n        .type = MBEDTLS_CIPHER_AES_128_GCM,\n        .set_encrypt_key = cipher_set_key_gcm,\n        .set_decrypt_key = cipher_set_key_gcm,\n        .aead_encrypt = cipher_encrypt_gcm,\n        .aead_decrypt_length = cipher_gcm_get_length,\n        .aead_decrypt = cipher_decrypt_gcm,\n        .cleanup = cipher_cleanup\n    },\n    {\n        .name = \"aes256-gcm@openssh.com\",\n        .blocksize = 16,\n        .lenfield_blocksize = 4, /* not encrypted, but authenticated */\n        .keysize = 256,\n        .tag_size = AES_GCM_TAGLEN,\n        .type = MBEDTLS_CIPHER_AES_256_GCM,\n        .set_encrypt_key = cipher_set_key_gcm,\n        .set_decrypt_key = cipher_set_key_gcm,\n        .aead_encrypt = cipher_encrypt_gcm,\n        .aead_decrypt_length = cipher_gcm_get_length,\n        .aead_decrypt = cipher_decrypt_gcm,\n        .cleanup = cipher_cleanup\n    },\n#endif /* MBEDTLS_GCM_C */\n    {\n        .name = \"3des-cbc\",\n        .blocksize = 8,\n        .keysize = 192,\n        .type = MBEDTLS_CIPHER_DES_EDE3_CBC,\n        .set_encrypt_key = cipher_set_encrypt_key_cbc,\n        .set_decrypt_key = cipher_set_decrypt_key_cbc,\n        .encrypt = cipher_encrypt_cbc,\n        .decrypt = cipher_decrypt_cbc,\n        .cleanup = cipher_cleanup\n    },\n    {\n        .name = \"chacha20-poly1305@openssh.com\"\n    },\n    {\n        .name = NULL,\n        .blocksize = 0,\n        .keysize = 0,\n        .set_encrypt_key = NULL,\n        .set_decrypt_key = NULL,\n        .encrypt = NULL,\n        .decrypt = NULL,\n        .cleanup = NULL\n    }\n};\n\nstruct ssh_cipher_struct *ssh_get_ciphertab(void)\n{\n    return ssh_ciphertab;\n}\n\nint ssh_crypto_init(void)\n{\n    size_t i;\n    int rc;\n\n    if (libmbedcrypto_initialized) {\n        return SSH_OK;\n    }\n\n    mbedtls_entropy_init(&ssh_mbedtls_entropy);\n    mbedtls_ctr_drbg_init(&ssh_mbedtls_ctr_drbg);\n\n    rc = mbedtls_ctr_drbg_seed(&ssh_mbedtls_ctr_drbg, mbedtls_entropy_func,\n            &ssh_mbedtls_entropy, NULL, 0);\n    if (rc != 0) {\n        mbedtls_ctr_drbg_free(&ssh_mbedtls_ctr_drbg);\n    }\n\n    for (i = 0; ssh_ciphertab[i].name != NULL; i++) {\n        int cmp;\n\n        cmp = strcmp(ssh_ciphertab[i].name, \"chacha20-poly1305@openssh.com\");\n        if (cmp == 0) {\n            memcpy(&ssh_ciphertab[i],\n                   ssh_get_chacha20poly1305_cipher(),\n                   sizeof(struct ssh_cipher_struct));\n            break;\n        }\n    }\n\n    libmbedcrypto_initialized = 1;\n\n    return SSH_OK;\n}\n\nint ssh_mbedtls_random(void *where, int len, int strong)\n{\n    int rc = 0;\n    if (strong) {\n        mbedtls_ctr_drbg_set_prediction_resistance(&ssh_mbedtls_ctr_drbg,\n                MBEDTLS_CTR_DRBG_PR_ON);\n        rc = mbedtls_ctr_drbg_random(&ssh_mbedtls_ctr_drbg, where, len);\n        mbedtls_ctr_drbg_set_prediction_resistance(&ssh_mbedtls_ctr_drbg,\n                MBEDTLS_CTR_DRBG_PR_OFF);\n    } else {\n        rc = mbedtls_ctr_drbg_random(&ssh_mbedtls_ctr_drbg, where, len);\n    }\n\n    return !rc;\n}\n\nmbedtls_ctr_drbg_context *ssh_get_mbedtls_ctr_drbg_context(void)\n{\n    return &ssh_mbedtls_ctr_drbg;\n}\n\nvoid ssh_crypto_finalize(void)\n{\n    if (!libmbedcrypto_initialized) {\n        return;\n    }\n\n    mbedtls_ctr_drbg_free(&ssh_mbedtls_ctr_drbg);\n    mbedtls_entropy_free(&ssh_mbedtls_entropy);\n\n    libmbedcrypto_initialized = 0;\n}\n\n#endif /* HAVE_LIBMBEDCRYPTO */\n"
  },
  {
    "path": "src/libssh/src/log.c",
    "content": "/*\n * log.c - logging and debugging functions\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2008-2013   by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <stdio.h>\n#include <stdarg.h>\n#include <string.h>\n#ifdef HAVE_SYS_TIME_H\n#include <sys/time.h>\n#endif /* HAVE_SYS_TIME_H */\n#ifdef HAVE_SYS_UTIME_H\n#include <sys/utime.h>\n#endif /* HAVE_SYS_UTIME_H */\n#include <time.h>\n\n#include \"libssh/priv.h\"\n#include \"libssh/misc.h\"\n#include \"libssh/session.h\"\n\nstatic LIBSSH_THREAD int ssh_log_level;\nstatic LIBSSH_THREAD ssh_logging_callback ssh_log_cb;\nstatic LIBSSH_THREAD void *ssh_log_userdata;\n\n/**\n * @defgroup libssh_log The SSH logging functions.\n * @ingroup libssh\n *\n * Logging functions for debugging and problem resolving.\n *\n * @{\n */\n\nstatic int current_timestring(int hires, char *buf, size_t len)\n{\n    char tbuf[64];\n    struct timeval tv;\n    struct tm *tm;\n    time_t t;\n\n    gettimeofday(&tv, NULL);\n    t = (time_t) tv.tv_sec;\n\n    tm = localtime(&t);\n    if (tm == NULL) {\n        return -1;\n    }\n\n    if (hires) {\n        strftime(tbuf, sizeof(tbuf) - 1, \"%Y/%m/%d %H:%M:%S\", tm);\n        snprintf(buf, len, \"%s.%06ld\", tbuf, (long)tv.tv_usec);\n    } else {\n        strftime(tbuf, sizeof(tbuf) - 1, \"%Y/%m/%d %H:%M:%S\", tm);\n        snprintf(buf, len, \"%s\", tbuf);\n    }\n\n    return 0;\n}\n\nstatic void ssh_log_stderr(int verbosity,\n                           const char *function,\n                           const char *buffer)\n{\n    char date[128] = {0};\n    int rc;\n\n    rc = current_timestring(1, date, sizeof(date));\n    if (rc == 0) {\n        fprintf(stderr, \"[%s, %d] %s:\", date, verbosity, function);\n    } else {\n        fprintf(stderr, \"[%d] %s\", verbosity, function);\n    }\n\n    fprintf(stderr, \"  %s\\n\", buffer);\n}\n\nvoid ssh_log_function(int verbosity,\n                      const char *function,\n                      const char *buffer)\n{\n    ssh_logging_callback log_fn = ssh_get_log_callback();\n    if (log_fn) {\n        char buf[1024];\n\n        snprintf(buf, sizeof(buf), \"%s: %s\", function, buffer);\n\n        log_fn(verbosity,\n               function,\n               buf,\n               ssh_get_log_userdata());\n        return;\n    }\n\n    ssh_log_stderr(verbosity, function, buffer);\n}\n\nvoid _ssh_log(int verbosity,\n              const char *function,\n              const char *format, ...)\n{\n    char buffer[1024];\n    va_list va;\n\n    if (verbosity <= ssh_get_log_level()) {\n        va_start(va, format);\n        vsnprintf(buffer, sizeof(buffer), format, va);\n        va_end(va);\n        ssh_log_function(verbosity, function, buffer);\n    }\n}\n\n/* LEGACY */\n\nvoid ssh_log(ssh_session session,\n             int verbosity,\n             const char *format, ...)\n{\n  char buffer[1024];\n  va_list va;\n\n  if (verbosity <= session->common.log_verbosity) {\n    va_start(va, format);\n    vsnprintf(buffer, sizeof(buffer), format, va);\n    va_end(va);\n    ssh_log_function(verbosity, \"\", buffer);\n  }\n}\n\n/** @internal\n * @brief log a SSH event with a common pointer\n * @param common       The SSH/bind session.\n * @param verbosity     The verbosity of the event.\n * @param format        The format string of the log entry.\n */\nvoid ssh_log_common(struct ssh_common_struct *common,\n                    int verbosity,\n                    const char *function,\n                    const char *format, ...)\n{\n    char buffer[1024];\n    va_list va;\n\n    if (verbosity <= common->log_verbosity) {\n        va_start(va, format);\n        vsnprintf(buffer, sizeof(buffer), format, va);\n        va_end(va);\n        ssh_log_function(verbosity, function, buffer);\n    }\n}\n\n\n/* PUBLIC */\n\n/**\n * @brief Set the log level of the library.\n *\n * @param[in]  level    The level to set.\n *\n * @return              SSH_OK on success, SSH_ERROR on error.\n */\nint ssh_set_log_level(int level) {\n  if (level < 0) {\n    return SSH_ERROR;\n  }\n\n  ssh_log_level = level;\n\n  return SSH_OK;\n}\n\n/**\n * @brief Get the log level of the library.\n *\n * @return    The value of the log level.\n */\nint ssh_get_log_level(void) {\n  return ssh_log_level;\n}\n\nint ssh_set_log_callback(ssh_logging_callback cb) {\n  if (cb == NULL) {\n    return SSH_ERROR;\n  }\n\n  ssh_log_cb = cb;\n\n  return SSH_OK;\n}\n\nssh_logging_callback ssh_get_log_callback(void) {\n  return ssh_log_cb;\n}\n\n/**\n * @brief Get the userdata of the logging function.\n *\n * @return    The userdata if set or NULL.\n */\nvoid *ssh_get_log_userdata(void)\n{\n    if (ssh_log_userdata == NULL) {\n        return NULL;\n    }\n\n    return ssh_log_userdata;\n}\n\n/**\n * @brief Set the userdata for the logging function.\n *\n * @param[in]  data     The userdata to set.\n *\n * @return              SSH_OK on success.\n */\nint ssh_set_log_userdata(void *data)\n{\n    ssh_log_userdata = data;\n\n    return 0;\n}\n\n/** @} */\n"
  },
  {
    "path": "src/libssh/src/match.c",
    "content": "/*\n * Author: Tatu Ylonen <ylo@cs.hut.fi>\n * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland\n *                    All rights reserved\n * Simple pattern matching, with '*' and '?' as wildcards.\n *\n * As far as I am concerned, the code I have written for this software\n * can be used freely for any purpose.  Any derived versions of this\n * software must be clearly marked as such, and if the derived work is\n * incompatible with the protocol description in the RFC file, it must be\n * called by a name other than \"ssh\" or \"Secure Shell\".\n */\n\n/*\n * Copyright (c) 2000 Markus Friedl.  All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\n * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n\n#include \"config.h\"\n\n#include <ctype.h>\n#include <stdbool.h>\n#include <sys/types.h>\n\n#include \"libssh/priv.h\"\n\n#define MAX_MATCH_RECURSION 32\n\n/*\n * Returns true if the given string matches the pattern (which may contain ?\n * and * as wildcards), and zero if it does not match.\n */\nstatic int match_pattern(const char *s, const char *pattern, size_t limit)\n{\n  bool had_asterisk = false;\n  if (s == NULL || pattern == NULL || limit <= 0) {\n    return 0;\n  }\n\n  for (;;) {\n    /* If at end of pattern, accept if also at end of string. */\n    if (*pattern == '\\0') {\n        return (*s == '\\0');\n    }\n\n    while (*pattern == '*') {\n      /* Skip the asterisk. */\n      had_asterisk = true;\n      pattern++;\n    }\n\n    if (had_asterisk) {\n      /* If at end of pattern, accept immediately. */\n      if (!*pattern)\n        return 1;\n\n      /* If next character in pattern is known, optimize. */\n      if (*pattern != '?') {\n        /*\n         * Look instances of the next character in\n         * pattern, and try to match starting from\n         * those.\n         */\n        for (; *s; s++)\n          if (*s == *pattern && match_pattern(s + 1, pattern + 1, limit - 1)) {\n            return 1;\n          }\n        /* Failed. */\n        return 0;\n      }\n      /*\n       * Move ahead one character at a time and try to\n       * match at each position.\n       */\n      for (; *s; s++) {\n        if (match_pattern(s, pattern, limit - 1)) {\n          return 1;\n        }\n      }\n      /* Failed. */\n      return 0;\n    }\n    /*\n     * There must be at least one more character in the string.\n     * If we are at the end, fail.\n     */\n    if (!*s) {\n      return 0;\n    }\n\n    /* Check if the next character of the string is acceptable. */\n    if (*pattern != '?' && *pattern != *s) {\n      return 0;\n    }\n\n    /* Move to the next character, both in string and in pattern. */\n    s++;\n    pattern++;\n  }\n\n  /* NOTREACHED */\n  return 0;\n}\n\n/*\n * Tries to match the string against the comma-separated sequence of subpatterns\n * (each possibly preceded by ! to indicate negation).\n * Returns -1 if negation matches, 1 if there is a positive match, 0 if there is\n * no match at all.\n */\nint match_pattern_list(const char *string, const char *pattern,\n    unsigned int len, int dolower) {\n  char sub[1024];\n  int negated;\n  int got_positive;\n  unsigned int i, subi;\n\n  got_positive = 0;\n  for (i = 0; i < len;) {\n    /* Check if the subpattern is negated. */\n    if (pattern[i] == '!') {\n      negated = 1;\n      i++;\n    } else {\n      negated = 0;\n    }\n\n    /*\n     * Extract the subpattern up to a comma or end.  Convert the\n     * subpattern to lowercase.\n     */\n    for (subi = 0;\n        i < len && subi < sizeof(sub) - 1 && pattern[i] != ',';\n        subi++, i++) {\n      sub[subi] = dolower && isupper(pattern[i]) ?\n        (char)tolower(pattern[i]) : pattern[i];\n    }\n\n    /* If subpattern too long, return failure (no match). */\n    if (subi >= sizeof(sub) - 1) {\n      return 0;\n    }\n\n    /* If the subpattern was terminated by a comma, skip the comma. */\n    if (i < len && pattern[i] == ',') {\n      i++;\n    }\n\n    /* Null-terminate the subpattern. */\n    sub[subi] = '\\0';\n\n    /* Try to match the subpattern against the string. */\n    if (match_pattern(string, sub, MAX_MATCH_RECURSION)) {\n      if (negated) {\n        return -1;        /* Negative */\n      } else {\n        got_positive = 1; /* Positive */\n      }\n    }\n  }\n\n  /*\n   * Return success if got a positive match.  If there was a negative\n   * match, we have already returned -1 and never get here.\n   */\n  return got_positive;\n}\n\n/*\n * Tries to match the host name (which must be in all lowercase) against the\n * comma-separated sequence of subpatterns (each possibly preceded by ! to\n * indicate negation).\n * Returns -1 if negation matches, 1 if there is a positive match, 0 if there\n * is no match at all.\n */\nint match_hostname(const char *host, const char *pattern, unsigned int len) {\n  return match_pattern_list(host, pattern, len, 1);\n}\n"
  },
  {
    "path": "src/libssh/src/mbedcrypto_missing.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2017 Sartura d.o.o.\n *\n * Author: Juraj Vijtiuk <juraj.vijtiuk@sartura.hr>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include \"libssh/priv.h\"\n#include \"libssh/libmbedcrypto.h\"\n\n#ifdef HAVE_LIBMBEDCRYPTO\nbignum ssh_mbedcry_bn_new(void)\n{\n    bignum bn;\n\n    bn = malloc(sizeof(mbedtls_mpi));\n    if (bn) {\n        mbedtls_mpi_init(bn);\n    }\n\n    return bn;\n}\n\nvoid ssh_mbedcry_bn_free(bignum bn)\n{\n    mbedtls_mpi_free(bn);\n    SAFE_FREE(bn);\n}\n\nunsigned char *ssh_mbedcry_bn2num(const_bignum num, int radix)\n{\n    char *buf = NULL;\n    size_t olen;\n    int rc;\n\n    rc = mbedtls_mpi_write_string(num, radix, buf, 0, &olen);\n    if (rc != 0 && rc != MBEDTLS_ERR_MPI_BUFFER_TOO_SMALL) {\n        return NULL;\n    }\n\n    buf = malloc(olen);\n    if (buf == NULL) {\n        return NULL;\n    }\n\n    rc = mbedtls_mpi_write_string(num, radix, buf, olen, &olen);\n    if (rc != 0) {\n        SAFE_FREE(buf);\n        return NULL;\n    }\n\n    return (unsigned char *) buf;\n}\n\nint ssh_mbedcry_rand(bignum rnd, int bits, int top, int bottom)\n{\n    size_t len;\n    int rc;\n    int i;\n\n    if (bits <= 0) {\n        return 0;\n    }\n\n    len = bits / 8 + 1;\n    /* FIXME weird bug: over 1024, fill_random function returns an error code\n     * MBEDTLS_ERR_MPI_BAD_INPUT_DATA   -0x0004\n     */\n    if (len > 1024){\n        len = 1024;\n    }\n    rc = mbedtls_mpi_fill_random(rnd,\n                                 len,\n                                 mbedtls_ctr_drbg_random,\n                                 ssh_get_mbedtls_ctr_drbg_context());\n    if (rc != 0) {\n        return 0;\n    }\n\n    for (i = len * 8 - 1; i >= bits; i--) {\n        rc = mbedtls_mpi_set_bit(rnd, i, 0);\n        if (rc != 0) {\n            return 0;\n        }\n    }\n\n    if (top == 0) {\n        rc = mbedtls_mpi_set_bit(rnd, bits - 1, 0);\n        if (rc != 0) {\n            return 0;\n        }\n    }\n\n    if (top == 1) {\n        if (bits < 2) {\n            return 0;\n        }\n\n        rc = mbedtls_mpi_set_bit(rnd, bits - 2, 0);\n        if (rc != 0) {\n            return 0;\n        }\n    }\n\n    if (bottom) {\n        rc = mbedtls_mpi_set_bit(rnd, 0, 1);\n        if (rc != 0) {\n            return 0;\n        }\n    }\n\n    return 1;\n}\n\nint ssh_mbedcry_is_bit_set(bignum num, size_t pos)\n{\n    int bit;\n    bit = mbedtls_mpi_get_bit(num, pos);\n    return bit;\n}\n\n/** @brief generates a random integer between 0 and max\n * @returns 1 in case of success, 0 otherwise\n */\nint ssh_mbedcry_rand_range(bignum dest, bignum max)\n{\n    size_t bits;\n    bignum rnd;\n    int rc;\n\n    bits = bignum_num_bits(max) + 64;\n    rnd = bignum_new();\n    if (rnd == NULL){\n        return 0;\n    }\n    rc = bignum_rand(rnd, bits);\n    if (rc != 1) {\n        bignum_safe_free(rnd);\n        return rc;\n    }\n    mbedtls_mpi_mod_mpi(dest, rnd, max);\n    bignum_safe_free(rnd);\n    return 1;\n}\n\nint ssh_mbedcry_hex2bn(bignum *dest, char *data)\n{\n    int rc;\n\n    *dest = bignum_new();\n    if (*dest == NULL){\n        return 0;\n    }\n    rc = mbedtls_mpi_read_string(*dest, 16, data);\n    if (rc == 0) {\n        return 1;\n    }\n\n    return 0;\n}\n\n#endif\n"
  },
  {
    "path": "src/libssh/src/messages.c",
    "content": "/*\n * messages.c - message parsing for client and server\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2003-2013 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <string.h>\n#include <stdlib.h>\n\n#ifndef _WIN32\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#endif\n\n#include \"libssh/libssh.h\"\n#include \"libssh/priv.h\"\n#include \"libssh/ssh2.h\"\n#include \"libssh/buffer.h\"\n#include \"libssh/packet.h\"\n#include \"libssh/channels.h\"\n#include \"libssh/session.h\"\n#include \"libssh/misc.h\"\n#include \"libssh/pki.h\"\n#include \"libssh/dh.h\"\n#include \"libssh/messages.h\"\n#ifdef WITH_SERVER\n#include \"libssh/server.h\"\n#include \"libssh/gssapi.h\"\n#endif\n\n/**\n * @defgroup libssh_messages The SSH message functions\n * @ingroup libssh\n *\n * This file contains the message parsing utilities for client and server\n * programs using libssh.\n *\n * On the server the the main loop of the program will call\n * ssh_message_get(session) to get messages as they come. They are not 1-1 with\n * the protocol messages. Then, the user will know what kind of a message it is\n * and use the appropriate functions to handle it (or use the default handlers\n * if you don't know what to do).\n *\n * @{\n */\n\nstatic ssh_message ssh_message_new(ssh_session session)\n{\n    ssh_message msg = calloc(1, sizeof(struct ssh_message_struct));\n    if (msg == NULL) {\n        return NULL;\n    }\n    msg->session = session;\n\n    /* Set states explicitly */\n    msg->auth_request.signature_state = SSH_PUBLICKEY_STATE_NONE;\n\n    return msg;\n}\n\n#ifndef WITH_SERVER\n\n/* Reduced version of the reply default that only reply with\n * SSH_MSG_UNIMPLEMENTED\n */\nstatic int ssh_message_reply_default(ssh_message msg) {\n  SSH_LOG(SSH_LOG_FUNCTIONS, \"Reporting unknown packet\");\n\n  if (ssh_buffer_add_u8(msg->session->out_buffer, SSH2_MSG_UNIMPLEMENTED) < 0)\n    goto error;\n  if (ssh_buffer_add_u32(msg->session->out_buffer,\n      htonl(msg->session->recv_seq-1)) < 0)\n    goto error;\n  return ssh_packet_send(msg->session);\n  error:\n  return SSH_ERROR;\n}\n\n#endif\n\n#ifdef WITH_SERVER\n\nstatic int ssh_execute_server_request(ssh_session session, ssh_message msg)\n{\n    ssh_channel channel = NULL;\n    int rc;\n\n    switch(msg->type) {\n        case SSH_REQUEST_AUTH:\n            if (msg->auth_request.method == SSH_AUTH_METHOD_PASSWORD &&\n                ssh_callbacks_exists(session->server_callbacks, auth_password_function)) {\n                rc = session->server_callbacks->auth_password_function(session,\n                        msg->auth_request.username, msg->auth_request.password,\n                        session->server_callbacks->userdata);\n                if (rc == SSH_AUTH_SUCCESS || rc == SSH_AUTH_PARTIAL) {\n                    ssh_message_auth_reply_success(msg, rc == SSH_AUTH_PARTIAL);\n                } else {\n                    ssh_message_reply_default(msg);\n                }\n\n                return SSH_OK;\n            } else if(msg->auth_request.method == SSH_AUTH_METHOD_PUBLICKEY &&\n                      ssh_callbacks_exists(session->server_callbacks, auth_pubkey_function)) {\n               rc = session->server_callbacks->auth_pubkey_function(session,\n                       msg->auth_request.username, msg->auth_request.pubkey,\n                       msg->auth_request.signature_state,\n                       session->server_callbacks->userdata);\n               if (msg->auth_request.signature_state != SSH_PUBLICKEY_STATE_NONE) {\n                 if (rc == SSH_AUTH_SUCCESS || rc == SSH_AUTH_PARTIAL) {\n                   ssh_message_auth_reply_success(msg, rc == SSH_AUTH_PARTIAL);\n                 } else {\n                   ssh_message_reply_default(msg);\n                 }\n               } else {\n                 if (rc == SSH_AUTH_SUCCESS) {\n                   ssh_message_auth_reply_pk_ok_simple(msg);\n                 } else {\n                   ssh_message_reply_default(msg);\n                 }\n               }\n\n               return SSH_OK;\n            } else if (msg->auth_request.method == SSH_AUTH_METHOD_NONE &&\n                       ssh_callbacks_exists(session->server_callbacks, auth_none_function)) {\n                rc = session->server_callbacks->auth_none_function(session,\n                    msg->auth_request.username, session->server_callbacks->userdata);\n                if (rc == SSH_AUTH_SUCCESS || rc == SSH_AUTH_PARTIAL){\n                    ssh_message_auth_reply_success(msg, rc == SSH_AUTH_PARTIAL);\n                } else {\n                    ssh_message_reply_default(msg);\n                }\n\n                return SSH_OK;\n            }\n            break;\n        case SSH_REQUEST_CHANNEL_OPEN:\n            if (msg->channel_request_open.type == SSH_CHANNEL_SESSION &&\n                ssh_callbacks_exists(session->server_callbacks, channel_open_request_session_function)) {\n                channel = session->server_callbacks->channel_open_request_session_function(session,\n                        session->server_callbacks->userdata);\n                if (channel != NULL) {\n                    rc = ssh_message_channel_request_open_reply_accept_channel(msg, channel);\n                    if (rc != SSH_OK) {\n                        SSH_LOG(SSH_LOG_WARNING,\n                                \"Failed to send reply for accepting a channel \"\n                                \"open\");\n                    }\n                    return SSH_OK;\n                } else {\n                    ssh_message_reply_default(msg);\n                }\n\n                return SSH_OK;\n            }\n            break;\n        case SSH_REQUEST_CHANNEL:\n            channel = msg->channel_request.channel;\n\n            if (msg->channel_request.type == SSH_CHANNEL_REQUEST_PTY){\n                ssh_callbacks_iterate(channel->callbacks,\n                                      ssh_channel_callbacks,\n                                      channel_pty_request_function) {\n                    rc = ssh_callbacks_iterate_exec(channel_pty_request_function,\n                                                    session,\n                                                    channel,\n                                                    msg->channel_request.TERM,\n                                                    msg->channel_request.width,\n                                                    msg->channel_request.height,\n                                                    msg->channel_request.pxwidth,\n                                                    msg->channel_request.pxheight);\n                    if (rc == 0) {\n                        ssh_message_channel_request_reply_success(msg);\n                    } else {\n                        ssh_message_reply_default(msg);\n                    }\n                    return SSH_OK;\n                }\n                ssh_callbacks_iterate_end();\n            } else if (msg->channel_request.type == SSH_CHANNEL_REQUEST_SHELL){\n                ssh_callbacks_iterate(channel->callbacks,\n                                      ssh_channel_callbacks,\n                                      channel_shell_request_function) {\n                    rc = ssh_callbacks_iterate_exec(channel_shell_request_function,\n                                                    session,\n                                                    channel);\n                    if (rc == 0) {\n                        ssh_message_channel_request_reply_success(msg);\n                    } else {\n                        ssh_message_reply_default(msg);\n                    }\n                    return SSH_OK;\n                }\n                ssh_callbacks_iterate_end();\n            } else if (msg->channel_request.type == SSH_CHANNEL_REQUEST_X11){\n                ssh_callbacks_iterate(channel->callbacks,\n                                      ssh_channel_callbacks,\n                                      channel_x11_req_function) {\n                    ssh_callbacks_iterate_exec(channel_x11_req_function,\n                                               session,\n                                               channel,\n                                               msg->channel_request.x11_single_connection,\n                                               msg->channel_request.x11_auth_protocol,\n                                               msg->channel_request.x11_auth_cookie,\n                                               msg->channel_request.x11_screen_number);\n                    ssh_message_channel_request_reply_success(msg);\n                    return SSH_OK;\n                }\n                ssh_callbacks_iterate_end();\n            } else if (msg->channel_request.type == SSH_CHANNEL_REQUEST_WINDOW_CHANGE){\n                ssh_callbacks_iterate(channel->callbacks,\n                                      ssh_channel_callbacks,\n                                      channel_pty_window_change_function) {\n                    rc = ssh_callbacks_iterate_exec(channel_pty_window_change_function,\n                                                    session,\n                                                    channel,\n                                                    msg->channel_request.width,\n                                                    msg->channel_request.height,\n                                                    msg->channel_request.pxwidth,\n                                                    msg->channel_request.pxheight);\n                    if (rc != SSH_OK) {\n                        SSH_LOG(SSH_LOG_WARNING,\n                                \"Failed to iterate callbacks for window change\");\n                    }\n                    return SSH_OK;\n                }\n                ssh_callbacks_iterate_end();\n            } else if (msg->channel_request.type == SSH_CHANNEL_REQUEST_EXEC){\n                ssh_callbacks_iterate(channel->callbacks,\n                                      ssh_channel_callbacks,\n                                      channel_exec_request_function) {\n                    rc = ssh_callbacks_iterate_exec(channel_exec_request_function,\n                                                    session,\n                                                    channel,\n                                                    msg->channel_request.command);\n                    if (rc == 0) {\n                        ssh_message_channel_request_reply_success(msg);\n                    } else {\n                        ssh_message_reply_default(msg);\n                    }\n\n                    return SSH_OK;\n                }\n                ssh_callbacks_iterate_end();\n            } else if (msg->channel_request.type == SSH_CHANNEL_REQUEST_ENV){\n                ssh_callbacks_iterate(channel->callbacks,\n                                      ssh_channel_callbacks,\n                                      channel_env_request_function) {\n                    rc = ssh_callbacks_iterate_exec(channel_env_request_function,\n                                                    session,\n                                                    channel,\n                                                    msg->channel_request.var_name,\n                                                    msg->channel_request.var_value);\n                    if (rc == 0) {\n                        ssh_message_channel_request_reply_success(msg);\n                    } else {\n                        ssh_message_reply_default(msg);\n                    }\n                    return SSH_OK;\n                }\n                ssh_callbacks_iterate_end();\n            } else if (msg->channel_request.type == SSH_CHANNEL_REQUEST_SUBSYSTEM){\n                ssh_callbacks_iterate(channel->callbacks,\n                                      ssh_channel_callbacks,\n                                      channel_subsystem_request_function) {\n                    rc = ssh_callbacks_iterate_exec(channel_subsystem_request_function,\n                                                    session,\n                                                    channel,\n                                                    msg->channel_request.subsystem);\n                    if (rc == 0) {\n                        ssh_message_channel_request_reply_success(msg);\n                    } else {\n                        ssh_message_reply_default(msg);\n                    }\n\n                    return SSH_OK;\n                }\n                ssh_callbacks_iterate_end();\n            }\n            break;\n        case SSH_REQUEST_SERVICE:\n            if (ssh_callbacks_exists(session->server_callbacks, service_request_function)) {\n                rc = session->server_callbacks->service_request_function(session,\n                        msg->service_request.service, session->server_callbacks->userdata);\n                if (rc == 0) {\n                    ssh_message_reply_default(msg);\n                } else {\n                    ssh_disconnect(session);\n                }\n\n                return SSH_OK;\n            }\n\n            return SSH_AGAIN;\n        case SSH_REQUEST_GLOBAL:\n            break;\n    }\n\n    return SSH_AGAIN;\n}\n\nstatic int ssh_execute_client_request(ssh_session session, ssh_message msg)\n{\n    ssh_channel channel = NULL;\n    int rc = SSH_AGAIN;\n\n    if (msg->type == SSH_REQUEST_CHANNEL_OPEN\n        && msg->channel_request_open.type == SSH_CHANNEL_X11\n        && ssh_callbacks_exists(session->common.callbacks, channel_open_request_x11_function)) {\n        channel = session->common.callbacks->channel_open_request_x11_function (session,\n                msg->channel_request_open.originator,\n                msg->channel_request_open.originator_port,\n                session->common.callbacks->userdata);\n        if (channel != NULL) {\n            rc = ssh_message_channel_request_open_reply_accept_channel(msg, channel);\n\n            return rc;\n        } else {\n            ssh_message_reply_default(msg);\n        }\n\n        return SSH_OK;\n    } else if (msg->type == SSH_REQUEST_CHANNEL_OPEN\n               && msg->channel_request_open.type == SSH_CHANNEL_AUTH_AGENT\n               && ssh_callbacks_exists(session->common.callbacks, channel_open_request_auth_agent_function)) {\n        channel = session->common.callbacks->channel_open_request_auth_agent_function (session,\n                session->common.callbacks->userdata);\n\n        if (channel != NULL) {\n            rc = ssh_message_channel_request_open_reply_accept_channel(msg, channel);\n\n            return rc;\n        } else {\n            ssh_message_reply_default(msg);\n        }\n\n        return SSH_OK;\n    }\n\n    return rc;\n}\n\n/** @internal\n * Executes the callbacks defined in session->server_callbacks, out of an ssh_message\n * I don't like ssh_message interface but it works.\n * @returns SSH_OK if the message has been handled, or SSH_AGAIN otherwise.\n */\nstatic int ssh_execute_server_callbacks(ssh_session session, ssh_message msg){\n    int rc = SSH_AGAIN;\n\n    if (session->server_callbacks != NULL){\n        rc = ssh_execute_server_request(session, msg);\n    } else if (session->common.callbacks != NULL) {\n        /* This one is in fact a client callback... */\n        rc = ssh_execute_client_request(session, msg);\n    }\n\n    return rc;\n}\n\n#endif /* WITH_SERVER */\n\nstatic int ssh_execute_message_callback(ssh_session session, ssh_message msg) {\n\tint ret;\n    if(session->ssh_message_callback != NULL) {\n        ret = session->ssh_message_callback(session, msg,\n                session->ssh_message_callback_data);\n        if(ret == 1) {\n            ret = ssh_message_reply_default(msg);\n            SSH_MESSAGE_FREE(msg);\n            if(ret != SSH_OK) {\n                return ret;\n            }\n        } else {\n            SSH_MESSAGE_FREE(msg);\n        }\n    } else {\n        ret = ssh_message_reply_default(msg);\n        SSH_MESSAGE_FREE(msg);\n        if(ret != SSH_OK) {\n            return ret;\n        }\n    }\n    return SSH_OK;\n}\n\n/**\n * @internal\n *\n * @brief Add a message to the current queue of messages to be parsed and/or call\n * the various callback functions.\n *\n * @param[in]  session  The SSH session to add the message.\n *\n * @param[in]  message  The message to add to the queue.\n */\nstatic void ssh_message_queue(ssh_session session, ssh_message message)\n{\n#ifdef WITH_SERVER\n    int ret;\n#endif\n\n    if (message == NULL) {\n        return;\n    }\n\n#ifdef WITH_SERVER\n    /* probably not the best place to execute server callbacks, but still better\n     * than nothing.\n     */\n    ret = ssh_execute_server_callbacks(session, message);\n    if (ret == SSH_OK) {\n        SSH_MESSAGE_FREE(message);\n        return;\n    }\n#endif /* WITH_SERVER */\n\n    if (session->ssh_message_callback != NULL) {\n        /* This will transfer the message, do not free. */\n        ssh_execute_message_callback(session, message);\n        return;\n    }\n\n    if (session->server_callbacks != NULL) {\n        /* if we have server callbacks, but nothing was executed, it means we are\n         * in non-synchronous mode, and we just don't care about the message we\n         * received. Just send a default response. Do not queue it.\n         */\n        ssh_message_reply_default(message);\n        SSH_MESSAGE_FREE(message);\n        return;\n    }\n\n    if (session->ssh_message_list == NULL) {\n        session->ssh_message_list = ssh_list_new();\n        if (session->ssh_message_list == NULL) {\n            /*\n             * If the message list couldn't be allocated, the message can't be\n             * enqueued\n             */\n            ssh_message_reply_default(message);\n            ssh_set_error_oom(session);\n            SSH_MESSAGE_FREE(message);\n            return;\n        }\n    }\n\n    /* This will transfer the message, do not free. */\n    ssh_list_append(session->ssh_message_list, message);\n    return;\n}\n\n/**\n * @internal\n *\n * @brief Pop a message from the message list and dequeue it.\n *\n * @param[in]  session  The SSH session to pop the message.\n *\n * @returns             The head message or NULL if it doesn't exist.\n */\nssh_message ssh_message_pop_head(ssh_session session){\n  ssh_message msg=NULL;\n  struct ssh_iterator *i;\n  if(session->ssh_message_list == NULL)\n    return NULL;\n  i=ssh_list_get_iterator(session->ssh_message_list);\n  if(i != NULL){\n    msg=ssh_iterator_value(ssh_message,i);\n    ssh_list_remove(session->ssh_message_list,i);\n  }\n  return msg;\n}\n\n/* Returns 1 if there is a message available */\nstatic int ssh_message_termination(void *s){\n  ssh_session session = s;\n  struct ssh_iterator *it;\n  if(session->session_state == SSH_SESSION_STATE_ERROR)\n    return 1;\n  it = ssh_list_get_iterator(session->ssh_message_list);\n  if(!it)\n    return 0;\n  else\n    return 1;\n}\n/**\n * @brief Retrieve a SSH message from a SSH session.\n *\n * @param[in]  session  The SSH session to get the message.\n *\n * @returns             The SSH message received, NULL in case of error, or timeout\n *                      elapsed.\n *\n * @warning This function blocks until a message has been received. Betterset up\n *          a callback if this behavior is unwanted.\n */\nssh_message ssh_message_get(ssh_session session) {\n  ssh_message msg = NULL;\n  int rc;\n\n  msg=ssh_message_pop_head(session);\n  if(msg) {\n      return msg;\n  }\n  if(session->ssh_message_list == NULL) {\n      session->ssh_message_list = ssh_list_new();\n  }\n  rc = ssh_handle_packets_termination(session, SSH_TIMEOUT_USER,\n      ssh_message_termination, session);\n  if(rc || session->session_state == SSH_SESSION_STATE_ERROR)\n    return NULL;\n  msg=ssh_list_pop_head(ssh_message, session->ssh_message_list);\n\n  return msg;\n}\n\n/**\n * @brief Get the type of the message.\n *\n * @param[in] msg       The message to get the type from.\n *\n * @return              The message type or -1 on error.\n */\nint ssh_message_type(ssh_message msg) {\n  if (msg == NULL) {\n    return -1;\n  }\n\n  return msg->type;\n}\n\n/**\n * @brief Get the subtype of the message.\n *\n * @param[in] msg       The message to get the subtype from.\n *\n * @return              The message type or -1 on error.\n */\nint ssh_message_subtype(ssh_message msg) {\n  if (msg == NULL) {\n    return -1;\n  }\n\n  switch(msg->type) {\n    case SSH_REQUEST_AUTH:\n      return msg->auth_request.method;\n    case SSH_REQUEST_CHANNEL_OPEN:\n      return msg->channel_request_open.type;\n    case SSH_REQUEST_CHANNEL:\n      return msg->channel_request.type;\n    case SSH_REQUEST_GLOBAL:\n      return msg->global_request.type;\n  }\n\n  return -1;\n}\n\n/**\n * @brief Free a SSH message.\n *\n * @param[in] msg       The message to release the memory.\n */\nvoid ssh_message_free(ssh_message msg){\n  if (msg == NULL) {\n    return;\n  }\n\n  switch(msg->type) {\n    case SSH_REQUEST_AUTH:\n      SAFE_FREE(msg->auth_request.username);\n      if (msg->auth_request.password) {\n        explicit_bzero(msg->auth_request.password,\n                       strlen(msg->auth_request.password));\n        SAFE_FREE(msg->auth_request.password);\n      }\n      ssh_key_free(msg->auth_request.pubkey);\n      break;\n    case SSH_REQUEST_CHANNEL_OPEN:\n      SAFE_FREE(msg->channel_request_open.originator);\n      SAFE_FREE(msg->channel_request_open.destination);\n      break;\n    case SSH_REQUEST_CHANNEL:\n      SAFE_FREE(msg->channel_request.TERM);\n      SAFE_FREE(msg->channel_request.modes);\n      SAFE_FREE(msg->channel_request.var_name);\n      SAFE_FREE(msg->channel_request.var_value);\n      SAFE_FREE(msg->channel_request.command);\n      SAFE_FREE(msg->channel_request.subsystem);\n      switch (msg->channel_request.type) {\n      case SSH_CHANNEL_REQUEST_EXEC:\n          SAFE_FREE(msg->channel_request.command);\n          break;\n      case SSH_CHANNEL_REQUEST_ENV:\n          SAFE_FREE(msg->channel_request.var_name);\n          SAFE_FREE(msg->channel_request.var_value);\n          break;\n      case SSH_CHANNEL_REQUEST_PTY:\n          SAFE_FREE(msg->channel_request.TERM);\n          break;\n      case SSH_CHANNEL_REQUEST_SUBSYSTEM:\n          SAFE_FREE(msg->channel_request.subsystem);\n          break;\n      case SSH_CHANNEL_REQUEST_X11:\n          SAFE_FREE(msg->channel_request.x11_auth_protocol);\n          SAFE_FREE(msg->channel_request.x11_auth_cookie);\n          break;\n      }\n      break;\n    case SSH_REQUEST_SERVICE:\n      SAFE_FREE(msg->service_request.service);\n      break;\n    case SSH_REQUEST_GLOBAL:\n      SAFE_FREE(msg->global_request.bind_address);\n      break;\n  }\n  ZERO_STRUCTP(msg);\n  SAFE_FREE(msg);\n}\n\n#ifdef WITH_SERVER\n\nSSH_PACKET_CALLBACK(ssh_packet_service_request)\n{\n    char *service_c = NULL;\n    ssh_message msg = NULL;\n    int rc;\n\n    (void)type;\n    (void)user;\n\n    rc = ssh_buffer_unpack(packet,\n                           \"s\",\n                           &service_c);\n    if (rc != SSH_OK) {\n        ssh_set_error(session,\n                      SSH_FATAL,\n                      \"Invalid SSH_MSG_SERVICE_REQUEST packet\");\n        goto error;\n    }\n\n    SSH_LOG(SSH_LOG_PACKET,\n            \"Received a SERVICE_REQUEST for service %s\",\n            service_c);\n\n    msg = ssh_message_new(session);\n    if (msg == NULL) {\n        SAFE_FREE(service_c);\n        goto error;\n    }\n\n    msg->type = SSH_REQUEST_SERVICE;\n    msg->service_request.service = service_c;\n\n    ssh_message_queue(session, msg);\nerror:\n\n    return SSH_PACKET_USED;\n}\n\n\n/*\n * This function concats in a buffer the values needed to do a signature\n * verification.\n */\nstatic ssh_buffer ssh_msg_userauth_build_digest(ssh_session session,\n                                                ssh_message msg,\n                                                const char *service,\n                                                ssh_string algo)\n{\n    struct ssh_crypto_struct *crypto = NULL;\n    ssh_buffer buffer;\n    ssh_string str=NULL;\n    int rc;\n\n    crypto = ssh_packet_get_current_crypto(session, SSH_DIRECTION_IN);\n    if (crypto == NULL) {\n        return NULL;\n    }\n\n    buffer = ssh_buffer_new();\n    if (buffer == NULL) {\n        return NULL;\n    }\n    rc = ssh_pki_export_pubkey_blob(msg->auth_request.pubkey, &str);\n    if (rc < 0) {\n        SSH_BUFFER_FREE(buffer);\n        return NULL;\n    }\n\n    rc = ssh_buffer_pack(buffer,\n                         \"dPbsssbsS\",\n                         crypto->digest_len, /* session ID string */\n                         (size_t)crypto->digest_len, crypto->session_id,\n                         SSH2_MSG_USERAUTH_REQUEST, /* type */\n                         msg->auth_request.username,\n                         service,\n                         \"publickey\", /* method */\n                         1, /* has to be signed (true) */\n                         ssh_string_get_char(algo), /* pubkey algorithm */\n                         str); /* public key as a blob */\n\n    SSH_STRING_FREE(str);\n    if (rc != SSH_OK) {\n        ssh_set_error_oom(session);\n        SSH_BUFFER_FREE(buffer);\n        return NULL;\n    }\n\n    return buffer;\n}\n\n/**\n * @internal\n *\n * @brief Handle a SSH_MSG_MSG_USERAUTH_REQUEST packet and queue a\n * SSH Message\n */\nSSH_PACKET_CALLBACK(ssh_packet_userauth_request){\n  ssh_message msg = NULL;\n  ssh_signature sig = NULL;\n  char *service = NULL;\n  char *method = NULL;\n  int cmp;\n  int rc;\n\n  (void)user;\n  (void)type;\n\n  msg = ssh_message_new(session);\n  if (msg == NULL) {\n    ssh_set_error_oom(session);\n    goto error;\n  }\n  msg->type = SSH_REQUEST_AUTH;\n  rc = ssh_buffer_unpack(packet,\n                         \"sss\",\n                         &msg->auth_request.username,\n                         &service,\n                         &method);\n\n  if (rc != SSH_OK) {\n      goto error;\n  }\n\n  SSH_LOG(SSH_LOG_PACKET,\n      \"Auth request for service %s, method %s for user '%s'\",\n      service, method,\n      msg->auth_request.username);\n\n  cmp = strcmp(service, \"ssh-connection\");\n  if (cmp != 0) {\n      SSH_LOG(SSH_LOG_WARNING,\n              \"Invalid service request: %s\",\n              service);\n      goto end;\n  }\n\n  if (strcmp(method, \"none\") == 0) {\n    msg->auth_request.method = SSH_AUTH_METHOD_NONE;\n    goto end;\n  }\n\n  if (strcmp(method, \"password\") == 0) {\n    uint8_t tmp;\n\n    msg->auth_request.method = SSH_AUTH_METHOD_PASSWORD;\n    rc = ssh_buffer_unpack(packet, \"bs\", &tmp, &msg->auth_request.password);\n    if (rc != SSH_OK) {\n      goto error;\n    }\n    goto end;\n  }\n\n  if (strcmp(method, \"keyboard-interactive\") == 0) {\n    ssh_string lang = NULL;\n    ssh_string submethods = NULL;\n\n    msg->auth_request.method = SSH_AUTH_METHOD_INTERACTIVE;\n    lang = ssh_buffer_get_ssh_string(packet);\n    if (lang == NULL) {\n      goto error;\n    }\n    /* from the RFC 4256\n     * 3.1.  Initial Exchange\n     * \"The language tag is deprecated and SHOULD be the empty string.\"\n     */\n    SSH_STRING_FREE(lang);\n\n    submethods = ssh_buffer_get_ssh_string(packet);\n    if (submethods == NULL) {\n      goto error;\n    }\n    /* from the RFC 4256\n     * 3.1.  Initial Exchange\n     * \"One possible implementation strategy of the submethods field on the\n     *  server is that, unless the user may use multiple different\n     *  submethods, the server ignores this field.\"\n     */\n    SSH_STRING_FREE(submethods);\n\n    goto end;\n  }\n\n  if (strcmp(method, \"publickey\") == 0) {\n    ssh_string algo = NULL;\n    ssh_string pubkey_blob = NULL;\n    uint8_t has_sign;\n\n    msg->auth_request.method = SSH_AUTH_METHOD_PUBLICKEY;\n    SAFE_FREE(method);\n    rc = ssh_buffer_unpack(packet, \"bSS\",\n            &has_sign,\n            &algo,\n            &pubkey_blob\n            );\n\n    if (rc != SSH_OK) {\n      goto error;\n    }\n\n    rc = ssh_pki_import_pubkey_blob(pubkey_blob, &msg->auth_request.pubkey);\n    SSH_STRING_FREE(pubkey_blob);\n    pubkey_blob = NULL;\n    if (rc < 0) {\n        SSH_STRING_FREE(algo);\n        algo = NULL;\n        goto error;\n    }\n    msg->auth_request.signature_state = SSH_PUBLICKEY_STATE_NONE;\n    // has a valid signature ?\n    if(has_sign) {\n        ssh_string sig_blob = NULL;\n        ssh_buffer digest = NULL;\n\n        sig_blob = ssh_buffer_get_ssh_string(packet);\n        if(sig_blob == NULL) {\n            SSH_LOG(SSH_LOG_PACKET, \"Invalid signature packet from peer\");\n            msg->auth_request.signature_state = SSH_PUBLICKEY_STATE_ERROR;\n            SSH_STRING_FREE(algo);\n            algo = NULL;\n            goto error;\n        }\n\n        digest = ssh_msg_userauth_build_digest(session, msg, service, algo);\n        SSH_STRING_FREE(algo);\n        algo = NULL;\n        if (digest == NULL) {\n            SSH_STRING_FREE(sig_blob);\n            SSH_LOG(SSH_LOG_PACKET, \"Failed to get digest\");\n            msg->auth_request.signature_state = SSH_PUBLICKEY_STATE_WRONG;\n            goto error;\n        }\n\n        rc = ssh_pki_import_signature_blob(sig_blob,\n                                           msg->auth_request.pubkey,\n                                           &sig);\n        if (rc == SSH_OK) {\n            /* Check if the signature from client matches server preferences */\n            if (session->opts.pubkey_accepted_types) {\n                if (!ssh_match_group(session->opts.pubkey_accepted_types,\n                            sig->type_c))\n                {\n                    ssh_set_error(session,\n                            SSH_FATAL,\n                            \"Public key from client (%s) doesn't match server \"\n                            \"preference (%s)\",\n                            sig->type_c,\n                            session->opts.pubkey_accepted_types);\n                    rc = SSH_ERROR;\n                }\n            }\n\n            if (rc == SSH_OK) {\n                rc = ssh_pki_signature_verify(session,\n                                              sig,\n                                              msg->auth_request.pubkey,\n                                              ssh_buffer_get(digest),\n                                              ssh_buffer_get_len(digest));\n            }\n        }\n        SSH_STRING_FREE(sig_blob);\n        SSH_BUFFER_FREE(digest);\n        ssh_signature_free(sig);\n        if (rc < 0) {\n            SSH_LOG(\n                    SSH_LOG_PACKET,\n                    \"Received an invalid signature from peer\");\n            msg->auth_request.signature_state = SSH_PUBLICKEY_STATE_WRONG;\n            goto error;\n        }\n\n        SSH_LOG(SSH_LOG_PACKET, \"Valid signature received\");\n\n        msg->auth_request.signature_state = SSH_PUBLICKEY_STATE_VALID;\n    }\n    SSH_STRING_FREE(algo);\n    goto end;\n  }\n#ifdef WITH_GSSAPI\n  if (strcmp(method, \"gssapi-with-mic\") == 0) {\n     uint32_t n_oid;\n     ssh_string *oids;\n     ssh_string oid;\n     char *hexa;\n     int i;\n     ssh_buffer_get_u32(packet, &n_oid);\n     n_oid=ntohl(n_oid);\n     if(n_oid > 100){\n    \t ssh_set_error(session, SSH_FATAL, \"USERAUTH_REQUEST: gssapi-with-mic OID count too big (%d)\",n_oid);\n    \t goto error;\n     }\n     SSH_LOG(SSH_LOG_PACKET, \"gssapi: %d OIDs\", n_oid);\n     oids = calloc(n_oid, sizeof(ssh_string));\n     if (oids == NULL){\n    \t ssh_set_error_oom(session);\n    \t goto error;\n     }\n     for (i=0;i<(int) n_oid;++i){\n    \t oid=ssh_buffer_get_ssh_string(packet);\n    \t if(oid == NULL){\n    \t\t for(i=i-1;i>=0;--i){\n    \t\t\t SAFE_FREE(oids[i]);\n    \t\t }\n    \t\t SAFE_FREE(oids);\n    \t\t ssh_set_error(session, SSH_LOG_PACKET, \"USERAUTH_REQUEST: gssapi-with-mic missing OID\");\n    \t\t goto error;\n    \t }\n    \t oids[i] = oid;\n    \t if(session->common.log_verbosity >= SSH_LOG_PACKET){\n    \t\t hexa = ssh_get_hexa(ssh_string_data(oid), ssh_string_len(oid));\n    \t\t SSH_LOG(SSH_LOG_PACKET,\"gssapi: OID %d: %s\",i, hexa);\n    \t\t SAFE_FREE(hexa);\n    \t }\n     }\n     ssh_gssapi_handle_userauth(session, msg->auth_request.username, n_oid, oids);\n\n     for(i=0;i<(int)n_oid;++i){\n    \t SAFE_FREE(oids[i]);\n     }\n     SAFE_FREE(oids);\n     /* bypass the message queue thing */\n     SAFE_FREE(service);\n     SAFE_FREE(method);\n     SSH_MESSAGE_FREE(msg);\n\n     return SSH_PACKET_USED;\n  }\n#endif\n\n  msg->auth_request.method = SSH_AUTH_METHOD_UNKNOWN;\n  SAFE_FREE(method);\n  goto end;\nerror:\n  SAFE_FREE(service);\n  SAFE_FREE(method);\n\n  SSH_MESSAGE_FREE(msg);\n\n  return SSH_PACKET_USED;\nend:\n  SAFE_FREE(service);\n  SAFE_FREE(method);\n\n  ssh_message_queue(session,msg);\n\n  return SSH_PACKET_USED;\n}\n\n#endif /* WITH_SERVER */\n/**\n * @internal\n *\n * @brief Handle a SSH_MSG_MSG_USERAUTH_INFO_RESPONSE packet and queue a\n * SSH Message\n */\n#ifndef WITH_SERVER\nSSH_PACKET_CALLBACK(ssh_packet_userauth_info_response){\n    (void)session;\n    (void)type;\n    (void)packet;\n    (void)user;\n    return SSH_PACKET_USED;\n}\n#else /* WITH_SERVER */\nSSH_PACKET_CALLBACK(ssh_packet_userauth_info_response){\n  uint32_t nanswers;\n  uint32_t i;\n  ssh_string tmp;\n  int rc;\n\n  ssh_message msg = NULL;\n\n  /* GSSAPI_TOKEN has same packed number. XXX fix this */\n#ifdef WITH_GSSAPI\n  if (session->gssapi != NULL) {\n      return ssh_packet_userauth_gssapi_token(session, type, packet, user);\n  }\n#endif\n  (void)user;\n  (void)type;\n\n  msg = ssh_message_new(session);\n  if (msg == NULL) {\n    ssh_set_error_oom(session);\n    goto error;\n  }\n\n  /* HACK: we forge a message to be able to handle it in the\n   * same switch() as other auth methods */\n  msg->type = SSH_REQUEST_AUTH;\n  msg->auth_request.method = SSH_AUTH_METHOD_INTERACTIVE;\n  msg->auth_request.kbdint_response = 1;\n#if 0 // should we wipe the username ?\n  msg->auth_request.username = NULL;\n#endif\n\n  rc = ssh_buffer_unpack(packet, \"d\", &nanswers);\n  if (rc != SSH_OK) {\n      ssh_set_error_invalid(session);\n      goto error;\n  }\n\n  if (session->kbdint == NULL) {\n    SSH_LOG(SSH_LOG_PROTOCOL, \"Warning: Got a keyboard-interactive \"\n                        \"response but it seems we didn't send the request.\");\n\n    session->kbdint = ssh_kbdint_new();\n    if (session->kbdint == NULL) {\n      ssh_set_error_oom(session);\n\n      goto error;\n    }\n  } else if (session->kbdint->answers != NULL) {\n      uint32_t n;\n\n      for (n = 0; n < session->kbdint->nanswers; n++) {\n            explicit_bzero(session->kbdint->answers[n],\n                           strlen(session->kbdint->answers[n]));\n            SAFE_FREE(session->kbdint->answers[n]);\n      }\n      SAFE_FREE(session->kbdint->answers);\n      session->kbdint->nanswers = 0;\n  }\n\n  SSH_LOG(SSH_LOG_PACKET,\"kbdint: %d answers\",nanswers);\n  if (nanswers > KBDINT_MAX_PROMPT) {\n    ssh_set_error(session, SSH_FATAL,\n        \"Too much answers received from client: %u (0x%.4x)\",\n        nanswers, nanswers);\n    ssh_kbdint_free(session->kbdint);\n    session->kbdint = NULL;\n\n    goto error;\n  }\n\n  if(nanswers != session->kbdint->nprompts) {\n    /* warn but let the application handle this case */\n    SSH_LOG(SSH_LOG_PROTOCOL, \"Warning: Number of prompts and answers\"\n                \" mismatch: p=%u a=%u\", session->kbdint->nprompts, nanswers);\n  }\n  session->kbdint->nanswers = nanswers;\n\n  session->kbdint->answers = calloc(nanswers, sizeof(char *));\n  if (session->kbdint->answers == NULL) {\n    session->kbdint->nanswers = 0;\n    ssh_set_error_oom(session);\n    ssh_kbdint_free(session->kbdint);\n    session->kbdint = NULL;\n\n    goto error;\n  }\n\n  for (i = 0; i < nanswers; i++) {\n    tmp = ssh_buffer_get_ssh_string(packet);\n    if (tmp == NULL) {\n      ssh_set_error(session, SSH_FATAL, \"Short INFO_RESPONSE packet\");\n      session->kbdint->nanswers = i;\n      ssh_kbdint_free(session->kbdint);\n      session->kbdint = NULL;\n\n      goto error;\n    }\n    session->kbdint->answers[i] = ssh_string_to_char(tmp);\n    SSH_STRING_FREE(tmp);\n    if (session->kbdint->answers[i] == NULL) {\n      ssh_set_error_oom(session);\n      session->kbdint->nanswers = i;\n      ssh_kbdint_free(session->kbdint);\n      session->kbdint = NULL;\n\n      goto error;\n    }\n  }\n\n  ssh_message_queue(session,msg);\n\n  return SSH_PACKET_USED;\n\nerror:\n  SSH_MESSAGE_FREE(msg);\n\n  return SSH_PACKET_USED;\n}\n#endif /* WITH_SERVER */\n\nSSH_PACKET_CALLBACK(ssh_packet_channel_open){\n  ssh_message msg = NULL;\n  char *type_c = NULL;\n  uint32_t originator_port, destination_port;\n  int rc;\n\n  (void)type;\n  (void)user;\n  msg = ssh_message_new(session);\n  if (msg == NULL) {\n    ssh_set_error_oom(session);\n    goto error;\n  }\n\n  msg->type = SSH_REQUEST_CHANNEL_OPEN;\n  rc = ssh_buffer_unpack(packet, \"s\", &type_c);\n  if (rc != SSH_OK){\n      goto error;\n  }\n\n  SSH_LOG(SSH_LOG_PACKET,\n      \"Clients wants to open a %s channel\", type_c);\n\n  ssh_buffer_unpack(packet,\"ddd\",\n          &msg->channel_request_open.sender,\n          &msg->channel_request_open.window,\n          &msg->channel_request_open.packet_size);\n\n  if (session->session_state != SSH_SESSION_STATE_AUTHENTICATED){\n    ssh_set_error(session,SSH_FATAL, \"Invalid state when receiving channel open request (must be authenticated)\");\n    goto error;\n  }\n  \n  if (strcmp(type_c,\"session\") == 0) {\n    msg->channel_request_open.type = SSH_CHANNEL_SESSION;\n    SAFE_FREE(type_c);\n    goto end;\n  }\n\n  if (strcmp(type_c,\"direct-tcpip\") == 0) {\n    rc = ssh_buffer_unpack(packet,\n                           \"sdsd\",\n                           &msg->channel_request_open.destination,\n                           &destination_port,\n                           &msg->channel_request_open.originator,\n                           &originator_port);\n\tif (rc != SSH_OK) {\n\t\tgoto error;\n\t}\n\n    msg->channel_request_open.destination_port = (uint16_t) destination_port;\n    msg->channel_request_open.originator_port = (uint16_t) originator_port;\n    msg->channel_request_open.type = SSH_CHANNEL_DIRECT_TCPIP;\n    goto end;\n  }\n\n  if (strcmp(type_c,\"forwarded-tcpip\") == 0) {\n    rc = ssh_buffer_unpack(packet, \"sdsd\",\n            &msg->channel_request_open.destination,\n            &destination_port,\n            &msg->channel_request_open.originator,\n            &originator_port\n        );\n    if (rc != SSH_OK){\n        goto error;\n    }\n    msg->channel_request_open.destination_port = (uint16_t) destination_port;\n    msg->channel_request_open.originator_port = (uint16_t) originator_port;\n    msg->channel_request_open.type = SSH_CHANNEL_FORWARDED_TCPIP;\n    goto end;\n  }\n\n  if (strcmp(type_c,\"x11\") == 0) {\n    rc = ssh_buffer_unpack(packet, \"sd\",\n            &msg->channel_request_open.originator,\n            &originator_port);\n    if (rc != SSH_OK){\n        goto error;\n    }\n    msg->channel_request_open.originator_port = (uint16_t) originator_port;\n    msg->channel_request_open.type = SSH_CHANNEL_X11;\n    goto end;\n  }\n\n  if (strcmp(type_c,\"auth-agent@openssh.com\") == 0) {\n    msg->channel_request_open.type = SSH_CHANNEL_AUTH_AGENT;\n    goto end;\n  }\n\n  msg->channel_request_open.type = SSH_CHANNEL_UNKNOWN;\n  goto end;\n\nerror:\n  SSH_MESSAGE_FREE(msg);\nend:\n  SAFE_FREE(type_c);\n  if(msg != NULL)\n    ssh_message_queue(session,msg);\n\n  return SSH_PACKET_USED;\n}\n\n/**\n * @internal\n *\n * @brief This function accepts a channel open request for the specified channel.\n *\n * @param[in]  msg      The message.\n *\n * @param[in]  chan     The channel the request is made on.\n *\n * @returns             SSH_OK on success, SSH_ERROR if an error occured.\n */\nint ssh_message_channel_request_open_reply_accept_channel(ssh_message msg, ssh_channel chan) {\n    ssh_session session;\n    int rc;\n\n    if (msg == NULL) {\n        return SSH_ERROR;\n    }\n\n    session = msg->session;\n\n    chan->local_channel = ssh_channel_new_id(session);\n    chan->local_maxpacket = 35000;\n    chan->local_window = 32000;\n    chan->remote_channel = msg->channel_request_open.sender;\n    chan->remote_maxpacket = msg->channel_request_open.packet_size;\n    chan->remote_window = msg->channel_request_open.window;\n    chan->state = SSH_CHANNEL_STATE_OPEN;\n    chan->flags &= ~SSH_CHANNEL_FLAG_NOT_BOUND;\n\n    rc = ssh_buffer_pack(session->out_buffer,\n                         \"bdddd\",\n                         SSH2_MSG_CHANNEL_OPEN_CONFIRMATION,\n                         chan->remote_channel,\n                         chan->local_channel,\n                         chan->local_window,\n                         chan->local_maxpacket);\n    if (rc != SSH_OK) {\n        ssh_set_error_oom(session);\n        return SSH_ERROR;\n    }\n\n    SSH_LOG(SSH_LOG_PACKET,\n            \"Accepting a channel request_open for chan %d\",\n            chan->remote_channel);\n\n    rc = ssh_packet_send(session);\n\n    return rc;\n}\n\n/**\n * @internal\n *\n * @brief This function accepts a channel open request.\n *\n * @param[in]  msg      The message.\n *\n * @returns a valid ssh_channel handle if the request is to be allowed\n *\n * @returns NULL in case of error\n */\nssh_channel ssh_message_channel_request_open_reply_accept(ssh_message msg) {\n\tssh_channel chan;\n\tint rc;\n\n\tif (msg == NULL) {\n\t    return NULL;\n\t}\n\n\tchan = ssh_channel_new(msg->session);\n\tif (chan == NULL) {\n\t\treturn NULL;\n\t}\n\trc = ssh_message_channel_request_open_reply_accept_channel(msg, chan);\n\tif (rc < 0) {\n\t\tssh_channel_free(chan);\n\t\tchan = NULL;\n\t}\n\treturn chan;\n\n}\n\n/**\n * @internal\n *\n * @brief This function parses the last end of a channel request packet.\n *\n * This is normally converted to a SSH message and placed in the queue.\n *\n * @param[in]  session  The SSH session.\n *\n * @param[in]  channel  The channel the request is made on.\n *\n * @param[in]  packet   The rest of the packet to be parsed.\n *\n * @param[in]  request  The type of request.\n *\n * @param[in]  want_reply The want_reply field from the request.\n *\n * @returns             SSH_OK on success, SSH_ERROR if an error occured.\n */\nint ssh_message_handle_channel_request(ssh_session session, ssh_channel channel, ssh_buffer packet,\n    const char *request, uint8_t want_reply) {\n  ssh_message msg = NULL;\n  int rc;\n\n  msg = ssh_message_new(session);\n  if (msg == NULL) {\n    ssh_set_error_oom(session);\n    goto error;\n  }\n\n  SSH_LOG(SSH_LOG_PACKET,\n      \"Received a %s channel_request for channel (%d:%d) (want_reply=%hhd)\",\n      request, channel->local_channel, channel->remote_channel, want_reply);\n\n  msg->type = SSH_REQUEST_CHANNEL;\n  msg->channel_request.channel = channel;\n  msg->channel_request.want_reply = want_reply;\n\n  if (strcmp(request, \"pty-req\") == 0) {\n    rc = ssh_buffer_unpack(packet, \"sddddS\",\n            &msg->channel_request.TERM,\n            &msg->channel_request.width,\n            &msg->channel_request.height,\n            &msg->channel_request.pxwidth,\n            &msg->channel_request.pxheight,\n            &msg->channel_request.modes\n            );\n\n    msg->channel_request.type = SSH_CHANNEL_REQUEST_PTY;\n\n    if (rc != SSH_OK) {\n      goto error;\n    }\n    goto end;\n  }\n\n  if (strcmp(request, \"window-change\") == 0) {\n    msg->channel_request.type = SSH_CHANNEL_REQUEST_WINDOW_CHANGE;\n    rc = ssh_buffer_unpack(packet, \"dddd\",\n            &msg->channel_request.width,\n            &msg->channel_request.height,\n            &msg->channel_request.pxwidth,\n            &msg->channel_request.pxheight);\n    if (rc != SSH_OK){\n        goto error;\n    }\n    goto end;\n  }\n\n  if (strcmp(request, \"subsystem\") == 0) {\n    rc = ssh_buffer_unpack(packet, \"s\",\n            &msg->channel_request.subsystem);\n    msg->channel_request.type = SSH_CHANNEL_REQUEST_SUBSYSTEM;\n    if (rc != SSH_OK){\n        goto error;\n    }\n    goto end;\n  }\n\n  if (strcmp(request, \"shell\") == 0) {\n    msg->channel_request.type = SSH_CHANNEL_REQUEST_SHELL;\n    goto end;\n  }\n\n  if (strcmp(request, \"exec\") == 0) {\n    rc = ssh_buffer_unpack(packet, \"s\",\n            &msg->channel_request.command);\n    msg->channel_request.type = SSH_CHANNEL_REQUEST_EXEC;\n    if (rc != SSH_OK) {\n      goto error;\n    }\n    goto end;\n  }\n\n  if (strcmp(request, \"env\") == 0) {\n    rc = ssh_buffer_unpack(packet, \"ss\",\n            &msg->channel_request.var_name,\n            &msg->channel_request.var_value);\n    msg->channel_request.type = SSH_CHANNEL_REQUEST_ENV;\n    if (rc != SSH_OK) {\n      goto error;\n    }\n    goto end;\n  }\n\n  if (strcmp(request, \"x11-req\") == 0) {\n    rc = ssh_buffer_unpack(packet, \"bssd\",\n            &msg->channel_request.x11_single_connection,\n            &msg->channel_request.x11_auth_protocol,\n            &msg->channel_request.x11_auth_cookie,\n            &msg->channel_request.x11_screen_number);\n\n    msg->channel_request.type = SSH_CHANNEL_REQUEST_X11;\n    if (rc != SSH_OK) {\n      goto error;\n    }\n\n    goto end;\n  }\n\n  msg->channel_request.type = SSH_CHANNEL_REQUEST_UNKNOWN;\nend:\n  ssh_message_queue(session,msg);\n\n  return SSH_OK;\nerror:\n  SSH_MESSAGE_FREE(msg);\n\n  return SSH_ERROR;\n}\n\nint ssh_message_channel_request_reply_success(ssh_message msg) {\n  uint32_t channel;\n  int rc;\n\n  if (msg == NULL) {\n    return SSH_ERROR;\n  }\n\n  if (msg->channel_request.want_reply) {\n    channel = msg->channel_request.channel->remote_channel;\n\n    SSH_LOG(SSH_LOG_PACKET,\n        \"Sending a channel_request success to channel %d\", channel);\n\n    rc = ssh_buffer_pack(msg->session->out_buffer,\n                         \"bd\",\n                         SSH2_MSG_CHANNEL_SUCCESS,\n                         channel);\n    if (rc != SSH_OK){\n      ssh_set_error_oom(msg->session);\n      return SSH_ERROR;\n    }\n\n    return ssh_packet_send(msg->session);\n  }\n\n  SSH_LOG(SSH_LOG_PACKET,\n      \"The client doesn't want to know the request succeeded\");\n\n  return SSH_OK;\n}\n\n#ifdef WITH_SERVER\nSSH_PACKET_CALLBACK(ssh_packet_global_request){\n    ssh_message msg = NULL;\n    char *request=NULL;\n    uint8_t want_reply;\n    int rc = SSH_PACKET_USED;\n    int r;\n    (void)user;\n    (void)type;\n    (void)packet;\n\n    SSH_LOG(SSH_LOG_PROTOCOL,\"Received SSH_MSG_GLOBAL_REQUEST packet\");\n    r = ssh_buffer_unpack(packet, \"sb\",\n            &request,\n            &want_reply);\n    if (r != SSH_OK){\n        goto error;\n    }\n\n    msg = ssh_message_new(session);\n    if (msg == NULL) {\n        ssh_set_error_oom(session);\n        goto error;\n    }\n    msg->type = SSH_REQUEST_GLOBAL;\n\n    if (strcmp(request, \"tcpip-forward\") == 0) {\n\n        /* According to RFC4254, the client SHOULD reject this message */\n        if (session->client) {\n            goto reply_with_failure;\n        }\n\n        r = ssh_buffer_unpack(packet, \"sd\",\n                &msg->global_request.bind_address,\n                &msg->global_request.bind_port\n                );\n        if (r != SSH_OK){\n            goto reply_with_failure;\n        }\n        msg->global_request.type = SSH_GLOBAL_REQUEST_TCPIP_FORWARD;\n        msg->global_request.want_reply = want_reply;\n\n        SSH_LOG(SSH_LOG_PROTOCOL, \"Received SSH_MSG_GLOBAL_REQUEST %s %d %s:%d\", request, want_reply,\n                msg->global_request.bind_address,\n                msg->global_request.bind_port);\n\n        if(ssh_callbacks_exists(session->common.callbacks, global_request_function)) {\n            SSH_LOG(SSH_LOG_PROTOCOL, \"Calling callback for SSH_MSG_GLOBAL_REQUEST %s %d %s:%d\", request,\n                    want_reply, msg->global_request.bind_address,\n                    msg->global_request.bind_port);\n            session->common.callbacks->global_request_function(session, msg, session->common.callbacks->userdata);\n        } else {\n            SAFE_FREE(request);\n            ssh_message_queue(session, msg);\n            return rc;\n        }\n    } else if (strcmp(request, \"cancel-tcpip-forward\") == 0) {\n\n        /* According to RFC4254, the client SHOULD reject this message */\n        if (session->client) {\n            goto reply_with_failure;\n        }\n\n        r = ssh_buffer_unpack(packet, \"sd\",\n                &msg->global_request.bind_address,\n                &msg->global_request.bind_port);\n        if (r != SSH_OK){\n            goto reply_with_failure;\n        }\n        msg->global_request.type = SSH_GLOBAL_REQUEST_CANCEL_TCPIP_FORWARD;\n        msg->global_request.want_reply = want_reply;\n\n        SSH_LOG(SSH_LOG_PROTOCOL, \"Received SSH_MSG_GLOBAL_REQUEST %s %d %s:%d\", request, want_reply,\n                msg->global_request.bind_address,\n                msg->global_request.bind_port);\n\n        if(ssh_callbacks_exists(session->common.callbacks, global_request_function)) {\n            session->common.callbacks->global_request_function(session, msg, session->common.callbacks->userdata);\n        } else {\n            SAFE_FREE(request);\n            ssh_message_queue(session, msg);\n            return rc;\n        }\n    } else if(strcmp(request, \"keepalive@openssh.com\") == 0) {\n        msg->global_request.type = SSH_GLOBAL_REQUEST_KEEPALIVE;\n        msg->global_request.want_reply = want_reply;\n        SSH_LOG(SSH_LOG_PROTOCOL, \"Received keepalive@openssh.com %d\", want_reply);\n        if(ssh_callbacks_exists(session->common.callbacks, global_request_function)) {\n            session->common.callbacks->global_request_function(session, msg, session->common.callbacks->userdata);\n        } else {\n            ssh_message_global_request_reply_success(msg, 0);\n        }\n    } else {\n        SSH_LOG(SSH_LOG_PROTOCOL, \"UNKNOWN SSH_MSG_GLOBAL_REQUEST %s, \"\n                \"want_reply = %d\", request, want_reply);\n        goto reply_with_failure;\n    }\n\n    SAFE_FREE(msg);\n    SAFE_FREE(request);\n    return rc;\n\nreply_with_failure:\n    /* Only report the failure if requested */\n    if (want_reply) {\n        r = ssh_buffer_add_u8(session->out_buffer,\n                SSH2_MSG_REQUEST_FAILURE);\n        if (r < 0) {\n            ssh_set_error_oom(session);\n            goto error;\n        }\n\n        r = ssh_packet_send(session);\n        if (r != SSH_OK) {\n            goto error;\n        }\n    } else {\n        SSH_LOG(SSH_LOG_PACKET,\n                \"The requester doesn't want to know the request failed!\");\n    }\n\n    /* Consume the message to avoid sending UNIMPLEMENTED later */\n    rc = SSH_PACKET_USED;\nerror:\n    SAFE_FREE(msg);\n    SAFE_FREE(request);\n    SSH_LOG(SSH_LOG_WARNING, \"Invalid SSH_MSG_GLOBAL_REQUEST packet\");\n    return rc;\n}\n\n#endif /* WITH_SERVER */\n\n/** @} */\n"
  },
  {
    "path": "src/libssh/src/misc.c",
    "content": "/*\n * misc.c - useful client functions\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2003-2009 by Aris Adamantiadis\n * Copyright (c) 2008-2009 by Andreas Schneider <asn@cryptomilk.org>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#ifndef _WIN32\n/* This is needed for a standard getpwuid_r on opensolaris */\n#define _POSIX_PTHREAD_SEMANTICS\n#include <pwd.h>\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n\n#endif /* _WIN32 */\n\n#include <errno.h>\n#include <limits.h>\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <ctype.h>\n#include <time.h>\n#ifdef HAVE_SYS_TIME_H\n#include <sys/time.h>\n#endif /* HAVE_SYS_TIME_H */\n\n\n#ifdef _WIN32\n\n#ifndef _WIN32_IE\n# define _WIN32_IE 0x0501 // SHGetSpecialFolderPath\n#endif\n\n#include <winsock2.h> // Must be the first to include\n#include <ws2tcpip.h>\n#include <shlobj.h>\n#include <direct.h>\n\n#ifdef HAVE_IO_H\n#include <io.h>\n#endif /* HAVE_IO_H */\n\n#endif /* _WIN32 */\n\n#include \"libssh/priv.h\"\n#include \"libssh/misc.h\"\n#include \"libssh/session.h\"\n\n#ifdef HAVE_LIBGCRYPT\n#define GCRYPT_STRING \"/gnutls\"\n#else\n#define GCRYPT_STRING \"\"\n#endif\n\n#ifdef HAVE_LIBCRYPTO\n#define CRYPTO_STRING \"/openssl\"\n#else\n#define CRYPTO_STRING \"\"\n#endif\n\n#ifdef HAVE_LIBMBEDCRYPTO\n#define MBED_STRING \"/mbedtls\"\n#else\n#define MBED_STRING \"\"\n#endif\n\n#ifdef WITH_ZLIB\n#define ZLIB_STRING \"/zlib\"\n#else\n#define ZLIB_STRING \"\"\n#endif\n\n/**\n * @defgroup libssh_misc The SSH helper functions.\n * @ingroup libssh\n *\n * Different helper functions used in the SSH Library.\n *\n * @{\n */\n\n#ifdef _WIN32\nchar *ssh_get_user_home_dir(void) {\n  char tmp[MAX_PATH] = {0};\n  char *szPath = NULL;\n\n  if (SHGetSpecialFolderPathA(NULL, tmp, CSIDL_PROFILE, TRUE)) {\n    szPath = malloc(strlen(tmp) + 1);\n    if (szPath == NULL) {\n      return NULL;\n    }\n\n    strcpy(szPath, tmp);\n    return szPath;\n  }\n\n  return NULL;\n}\n\n/* we have read access on file */\nint ssh_file_readaccess_ok(const char *file) {\n  if (_access(file, 4) < 0) {\n    return 0;\n  }\n\n  return 1;\n}\n\n/**\n * @brief Check if the given path is an existing directory and that is\n * accessible for writing.\n *\n * @param[in] path Path to the directory to be checked\n *\n * @return Return 1 if the directory exists and is accessible; 0 otherwise\n * */\nint ssh_dir_writeable(const char *path)\n{\n    struct _stat buffer;\n    int rc;\n\n    rc = _stat(path, &buffer);\n    if (rc < 0) {\n        return 0;\n    }\n\n    if ((buffer.st_mode & _S_IFDIR) && (buffer.st_mode & _S_IWRITE)) {\n        return 1;\n    }\n\n    return 0;\n}\n\n#define SSH_USEC_IN_SEC         1000000LL\n#define SSH_SECONDS_SINCE_1601  11644473600LL\n\nint gettimeofday(struct timeval *__p, void *__t) {\n  union {\n    unsigned long long ns100; /* time since 1 Jan 1601 in 100ns units */\n    FILETIME ft;\n  } now;\n\n  GetSystemTimeAsFileTime (&now.ft);\n  __p->tv_usec = (long) ((now.ns100 / 10LL) % SSH_USEC_IN_SEC);\n  __p->tv_sec  = (long)(((now.ns100 / 10LL ) / SSH_USEC_IN_SEC) - SSH_SECONDS_SINCE_1601);\n\n  return (0);\n}\n\nchar *ssh_get_local_username(void) {\n    DWORD size = 0;\n    char *user;\n\n    /* get the size */\n    GetUserName(NULL, &size);\n\n    user = (char *) malloc(size);\n    if (user == NULL) {\n        return NULL;\n    }\n\n    if (GetUserName(user, &size)) {\n        return user;\n    }\n\n    return NULL;\n}\n\nint ssh_is_ipaddr_v4(const char *str) {\n    struct sockaddr_storage ss;\n    int sslen = sizeof(ss);\n    int rc = SOCKET_ERROR;\n\n    /* WSAStringToAddressA thinks that 0.0.0 is a valid IP */\n    if (strlen(str) < 7) {\n        return 0;\n    }\n\n    rc = WSAStringToAddressA((LPSTR) str,\n                             AF_INET,\n                             NULL,\n                             (struct sockaddr*)&ss,\n                             &sslen);\n    if (rc == 0) {\n        return 1;\n    }\n\n    return 0;\n}\n\nint ssh_is_ipaddr(const char *str) {\n    int rc = SOCKET_ERROR;\n\n    if (strchr(str, ':')) {\n        struct sockaddr_storage ss;\n        int sslen = sizeof(ss);\n\n        /* TODO link-local (IP:v6:addr%ifname). */\n        rc = WSAStringToAddressA((LPSTR) str,\n                                 AF_INET6,\n                                 NULL,\n                                 (struct sockaddr*)&ss,\n                                 &sslen);\n        if (rc == 0) {\n            return 1;\n        }\n    }\n\n    return ssh_is_ipaddr_v4(str);\n}\n#else /* _WIN32 */\n\n#ifndef NSS_BUFLEN_PASSWD\n#define NSS_BUFLEN_PASSWD 4096\n#endif /* NSS_BUFLEN_PASSWD */\n\nchar *ssh_get_user_home_dir(void)\n{\n    char *szPath = NULL;\n    struct passwd pwd;\n    struct passwd *pwdbuf = NULL;\n    char buf[NSS_BUFLEN_PASSWD] = {0};\n    int rc;\n\n    rc = getpwuid_r(getuid(), &pwd, buf, NSS_BUFLEN_PASSWD, &pwdbuf);\n    if (rc != 0 || pwdbuf == NULL ) {\n        szPath = getenv(\"HOME\");\n        if (szPath == NULL) {\n            return NULL;\n        }\n        snprintf(buf, sizeof(buf), \"%s\", szPath);\n\n        return strdup(buf);\n    }\n\n    szPath = strdup(pwd.pw_dir);\n\n    return szPath;\n}\n\n/* we have read access on file */\nint ssh_file_readaccess_ok(const char *file)\n{\n    if (access(file, R_OK) < 0) {\n        return 0;\n    }\n\n    return 1;\n}\n\n/**\n * @brief Check if the given path is an existing directory and that is\n * accessible for writing.\n *\n * @param[in] path Path to the directory to be checked\n *\n * @return Return 1 if the directory exists and is accessible; 0 otherwise\n * */\nint ssh_dir_writeable(const char *path)\n{\n    struct stat buffer;\n    int rc;\n\n    rc = stat(path, &buffer);\n    if (rc < 0) {\n        return 0;\n    }\n\n    if (S_ISDIR(buffer.st_mode) && (buffer.st_mode & S_IWRITE)) {\n        return 1;\n    }\n\n    return 0;\n}\n\nchar *ssh_get_local_username(void)\n{\n    struct passwd pwd;\n    struct passwd *pwdbuf = NULL;\n    char buf[NSS_BUFLEN_PASSWD];\n    char *name;\n    int rc;\n\n    rc = getpwuid_r(getuid(), &pwd, buf, NSS_BUFLEN_PASSWD, &pwdbuf);\n    if (rc != 0 || pwdbuf == NULL) {\n        return NULL;\n    }\n\n    name = strdup(pwd.pw_name);\n\n    if (name == NULL) {\n        return NULL;\n    }\n\n    return name;\n}\n\nint ssh_is_ipaddr_v4(const char *str) {\n    int rc = -1;\n    struct in_addr dest;\n\n    rc = inet_pton(AF_INET, str, &dest);\n    if (rc > 0) {\n        return 1;\n    }\n\n    return 0;\n}\n\nint ssh_is_ipaddr(const char *str) {\n    int rc = -1;\n\n    if (strchr(str, ':')) {\n        struct in6_addr dest6;\n\n        /* TODO link-local (IP:v6:addr%ifname). */\n        rc = inet_pton(AF_INET6, str, &dest6);\n        if (rc > 0) {\n            return 1;\n        }\n    }\n\n    return ssh_is_ipaddr_v4(str);\n}\n\n#endif /* _WIN32 */\n\nchar *ssh_lowercase(const char* str) {\n  char *new, *p;\n\n  if (str == NULL) {\n    return NULL;\n  }\n\n  new = strdup(str);\n  if (new == NULL) {\n    return NULL;\n  }\n\n  for (p = new; *p; p++) {\n    *p = tolower(*p);\n  }\n\n  return new;\n}\n\nchar *ssh_hostport(const char *host, int port)\n{\n    char *dest = NULL;\n    size_t len;\n\n    if (host == NULL) {\n        return NULL;\n    }\n\n    /* 3 for []:, 5 for 65536 and 1 for nul */\n    len = strlen(host) + 3 + 5 + 1;\n    dest = malloc(len);\n    if (dest == NULL) {\n        return NULL;\n    }\n    snprintf(dest, len, \"[%s]:%d\", host, port);\n\n    return dest;\n}\n\n/**\n * @brief Convert a buffer into a colon separated hex string.\n * The caller has to free the memory.\n *\n * @param  what         What should be converted to a hex string.\n *\n * @param  len          Length of the buffer to convert.\n *\n * @return              The hex string or NULL on error.\n *\n * @see ssh_string_free_char()\n */\nchar *ssh_get_hexa(const unsigned char *what, size_t len) {\n    const char h[] = \"0123456789abcdef\";\n    char *hexa;\n    size_t i;\n    size_t hlen = len * 3;\n\n    if (len > (UINT_MAX - 1) / 3) {\n        return NULL;\n    }\n\n    hexa = malloc(hlen + 1);\n    if (hexa == NULL) {\n        return NULL;\n    }\n\n    for (i = 0; i < len; i++) {\n        hexa[i * 3] = h[(what[i] >> 4) & 0xF];\n        hexa[i * 3 + 1] = h[what[i] & 0xF];\n        hexa[i * 3 + 2] = ':';\n    }\n    hexa[hlen - 1] = '\\0';\n\n    return hexa;\n}\n\n/**\n * @deprecated          Please use ssh_print_hash() instead\n */\nvoid ssh_print_hexa(const char *descr, const unsigned char *what, size_t len) {\n    char *hexa = ssh_get_hexa(what, len);\n\n    if (hexa == NULL) {\n      return;\n    }\n    fprintf(stderr, \"%s: %s\\n\", descr, hexa);\n\n    free(hexa);\n}\n\n/**\n * @brief Log the content of a buffer in hexadecimal format, similar to the\n * output of 'hexdump -C' command.\n *\n * The first logged line is the given description followed by the length.\n * Then the content of the buffer is logged 16 bytes per line in the following\n * format:\n *\n * (offset) (first 8 bytes) (last 8 bytes) (the 16 bytes as ASCII char values)\n *\n * The output for a 16 bytes array containing values from 0x00 to 0x0f would be:\n *\n * \"Example (16 bytes):\"\n * \"  00000000  00 01 02 03 04 05 06 07  08 09 0a 0b 0c 0d 0e 0f  ................\"\n *\n * The value for each byte as corresponding ASCII character is printed at the\n * end if the value is printable. Otherwise it is replace with '.'.\n *\n * @param[in] descr A description for the content to be logged\n * @param[in] what  The buffer to be logged\n * @param[in] len   The length of the buffer given in what\n *\n * @note If a too long description is provided (which would result in a first\n * line longer than 80 bytes), the function will fail.\n */\nvoid ssh_log_hexdump(const char *descr, const unsigned char *what, size_t len)\n{\n    size_t i;\n    char ascii[17];\n    const unsigned char *pc = NULL;\n    size_t count = 0;\n    ssize_t printed = 0;\n\n    /* The required buffer size is calculated from:\n     *\n     *  2 bytes for spaces at the beginning\n     *  8 bytes for the offset\n     *  2 bytes for spaces\n     * 24 bytes to print the first 8 bytes + spaces\n     *  1 byte for an extra space\n     * 24 bytes to print next 8 bytes + spaces\n     *  2 bytes for extra spaces\n     * 16 bytes for the content as ASCII characters at the end\n     *  1 byte for the ending '\\0'\n     *\n     * Resulting in 80 bytes.\n     *\n     * Except for the first line (description + size), all lines have fixed\n     * length. If a too long description is used, the function will fail.\n     * */\n    char buffer[80];\n\n    /* Print description */\n    if (descr != NULL) {\n        printed = snprintf(buffer, sizeof(buffer), \"%s \", descr);\n        if (printed < 0) {\n            goto error;\n        }\n        count += printed;\n    } else {\n        printed = snprintf(buffer, sizeof(buffer), \"(NULL description) \");\n        if (printed < 0) {\n            goto error;\n        }\n        count += printed;\n    }\n\n    if (len == 0) {\n        printed = snprintf(buffer + count, sizeof(buffer) - count,\n                           \"(zero length):\");\n        if (printed < 0) {\n            goto error;\n        }\n        SSH_LOG(SSH_LOG_DEBUG, \"%s\", buffer);\n        return;\n    } else {\n        printed = snprintf(buffer + count, sizeof(buffer) - count,\n                           \"(%zu bytes):\", len);\n        if (printed < 0) {\n            goto error;\n        }\n        count += printed;\n    }\n\n    if (what == NULL) {\n        printed = snprintf(buffer + count, sizeof(buffer) - count,\n                           \"(NULL)\");\n        if (printed < 0) {\n            goto error;\n        }\n        SSH_LOG(SSH_LOG_DEBUG, \"%s\", buffer);\n        return;\n    }\n\n    SSH_LOG(SSH_LOG_DEBUG, \"%s\", buffer);\n\n    /* Reset state */\n    count = 0;\n    pc = what;\n\n    for (i = 0; i < len; i++) {\n        /* Add one space after printing 8 bytes */\n        if ((i % 8) == 0) {\n            if (i != 0) {\n                printed = snprintf(buffer + count, sizeof(buffer) - count, \" \");\n                if (printed < 0) {\n                    goto error;\n                }\n                count += printed;\n            }\n        }\n\n        /* Log previous line and reset state for new line */\n        if ((i % 16) == 0) {\n            if (i != 0) {\n                printed = snprintf(buffer + count, sizeof(buffer) - count,\n                                   \"  %s\", ascii);\n                if (printed < 0) {\n                    goto error;\n                }\n                SSH_LOG(SSH_LOG_DEBUG, \"%s\", buffer);\n                count = 0;\n            }\n\n            /* Start a new line with the offset */\n            printed = snprintf(buffer, sizeof(buffer),\n                               \"  %08zx \", i);\n            if (printed < 0) {\n                goto error;\n            }\n            count += printed;\n        }\n\n        /* Print the current byte hexadecimal representation */\n        printed = snprintf(buffer + count, sizeof(buffer) - count,\n                           \" %02x\", pc[i]);\n        if (printed < 0) {\n            goto error;\n        }\n        count += printed;\n\n        /* If printable, store the ASCII character */\n        if (isprint(pc[i])) {\n            ascii[i % 16] = pc[i];\n        } else {\n            ascii[i % 16] = '.';\n        }\n        ascii[(i % 16) + 1] = '\\0';\n    }\n\n    /* Add padding if not exactly 16 characters */\n    while ((i % 16) != 0) {\n        /* Add one space after printing 8 bytes */\n        if ((i % 8) == 0) {\n            if (i != 0) {\n                printed = snprintf(buffer + count, sizeof(buffer) - count, \" \");\n                if (printed < 0) {\n                    goto error;\n                }\n                count += printed;\n            }\n        }\n\n        printed = snprintf(buffer + count, sizeof(buffer) - count, \"   \");\n        if (printed < 0) {\n            goto error;\n        }\n        count += printed;\n        i++;\n    }\n\n    /* Print the last printable part */\n    printed = snprintf(buffer + count, sizeof(buffer) - count,\n                       \"   %s\", ascii);\n    if (printed < 0) {\n        goto error;\n    }\n\n    SSH_LOG(SSH_LOG_DEBUG, \"%s\", buffer);\n\n    return;\n\nerror:\n    SSH_LOG(SSH_LOG_WARN, \"Could not print to buffer\");\n    return;\n}\n\n/**\n * @brief Check if libssh is the required version or get the version\n * string.\n *\n * @param[in]  req_version The version required.\n *\n * @return              If the version of libssh is newer than the version\n *                      required it will return a version string.\n *                      NULL if the version is older.\n *\n * Example:\n *\n * @code\n *  if (ssh_version(SSH_VERSION_INT(0,2,1)) == NULL) {\n *    fprintf(stderr, \"libssh version is too old!\\n\");\n *    exit(1);\n *  }\n *\n *  if (debug) {\n *    printf(\"libssh %s\\n\", ssh_version(0));\n *  }\n * @endcode\n */\nconst char *ssh_version(int req_version) {\n  if (req_version <= LIBSSH_VERSION_INT) {\n    return SSH_STRINGIFY(LIBSSH_VERSION) GCRYPT_STRING CRYPTO_STRING MBED_STRING\n      ZLIB_STRING;\n  }\n\n  return NULL;\n}\n\nstruct ssh_list *ssh_list_new(void) {\n  struct ssh_list *ret=malloc(sizeof(struct ssh_list));\n  if(!ret)\n    return NULL;\n  ret->root=ret->end=NULL;\n  return ret;\n}\n\nvoid ssh_list_free(struct ssh_list *list){\n  struct ssh_iterator *ptr,*next;\n  if(!list)\n    return;\n  ptr=list->root;\n  while(ptr){\n    next=ptr->next;\n    SAFE_FREE(ptr);\n    ptr=next;\n  }\n  SAFE_FREE(list);\n}\n\nstruct ssh_iterator *ssh_list_get_iterator(const struct ssh_list *list){\n  if(!list)\n    return NULL;\n  return list->root;\n}\n\nstruct ssh_iterator *ssh_list_find(const struct ssh_list *list, void *value){\n  struct ssh_iterator *it;\n  for(it = ssh_list_get_iterator(list); it != NULL ;it=it->next)\n    if(it->data==value)\n      return it;\n  return NULL;\n}\n\n/**\n * @brief Get the number of elements in the list\n *\n * @param[in]  list     The list to count.\n *\n * @return The number of elements in the list.\n */\nsize_t ssh_list_count(const struct ssh_list *list)\n{\n  struct ssh_iterator *it = NULL;\n  int count = 0;\n\n  for (it = ssh_list_get_iterator(list); it != NULL ; it = it->next) {\n      count++;\n  }\n\n  return count;\n}\n\nstatic struct ssh_iterator *ssh_iterator_new(const void *data){\n  struct ssh_iterator *iterator=malloc(sizeof(struct ssh_iterator));\n  if(!iterator)\n    return NULL;\n  iterator->next=NULL;\n  iterator->data=data;\n  return iterator;\n}\n\nint ssh_list_append(struct ssh_list *list,const void *data){\n  struct ssh_iterator *iterator = NULL;\n\n  if (list == NULL) {\n      return SSH_ERROR;\n  }\n\n  iterator = ssh_iterator_new(data);\n  if (iterator == NULL) {\n      return SSH_ERROR;\n  }\n\n  if(!list->end){\n    /* list is empty */\n    list->root=list->end=iterator;\n  } else {\n    /* put it on end of list */\n    list->end->next=iterator;\n    list->end=iterator;\n  }\n  return SSH_OK;\n}\n\nint ssh_list_prepend(struct ssh_list *list, const void *data){\n  struct ssh_iterator *it = NULL;\n\n  if (list == NULL) {\n      return SSH_ERROR;\n  }\n\n  it = ssh_iterator_new(data);\n  if (it == NULL) {\n    return SSH_ERROR;\n  }\n\n  if (list->end == NULL) {\n    /* list is empty */\n    list->root = list->end = it;\n  } else {\n    /* set as new root */\n    it->next = list->root;\n    list->root = it;\n  }\n\n  return SSH_OK;\n}\n\nvoid ssh_list_remove(struct ssh_list *list, struct ssh_iterator *iterator){\n  struct ssh_iterator *ptr,*prev;\n\n  if (list == NULL) {\n      return;\n  }\n\n  prev=NULL;\n  ptr=list->root;\n  while(ptr && ptr != iterator){\n    prev=ptr;\n    ptr=ptr->next;\n  }\n  if(!ptr){\n    /* we did not find the element */\n    return;\n  }\n  /* unlink it */\n  if(prev)\n    prev->next=ptr->next;\n  /* if iterator was the head */\n  if(list->root == iterator)\n    list->root=iterator->next;\n  /* if iterator was the tail */\n  if(list->end == iterator)\n    list->end = prev;\n  SAFE_FREE(iterator);\n}\n\n/**\n * @internal\n *\n * @brief Removes the top element of the list and returns the data value\n * attached to it.\n *\n * @param[in[  list     The ssh_list to remove the element.\n *\n * @returns             A pointer to the element being stored in head, or NULL\n *                      if the list is empty.\n */\nconst void *_ssh_list_pop_head(struct ssh_list *list){\n  struct ssh_iterator *iterator = NULL;\n  const void *data = NULL;\n\n  if (list == NULL) {\n      return NULL;\n  }\n\n  iterator = list->root;\n  if (iterator == NULL) {\n      return NULL;\n  }\n  data=iterator->data;\n  list->root=iterator->next;\n  if(list->end==iterator)\n    list->end=NULL;\n  SAFE_FREE(iterator);\n  return data;\n}\n\n/**\n * @brief Parse directory component.\n *\n * dirname breaks a null-terminated pathname string into a directory component.\n * In the usual case, ssh_dirname() returns the string up to, but not including,\n * the final '/'. Trailing '/' characters are  not  counted as part of the\n * pathname. The caller must free the memory.\n *\n * @param[in]  path     The path to parse.\n *\n * @return              The dirname of path or NULL if we can't allocate memory.\n *                      If path does not contain a slash, c_dirname() returns\n *                      the string \".\".  If path is the string \"/\", it returns\n *                      the string \"/\". If path is NULL or an empty string,\n *                      \".\" is returned.\n */\nchar *ssh_dirname (const char *path) {\n  char *new = NULL;\n  size_t len;\n\n  if (path == NULL || *path == '\\0') {\n    return strdup(\".\");\n  }\n\n  len = strlen(path);\n\n  /* Remove trailing slashes */\n  while(len > 0 && path[len - 1] == '/') --len;\n\n  /* We have only slashes */\n  if (len == 0) {\n    return strdup(\"/\");\n  }\n\n  /* goto next slash */\n  while(len > 0 && path[len - 1] != '/') --len;\n\n  if (len == 0) {\n    return strdup(\".\");\n  } else if (len == 1) {\n    return strdup(\"/\");\n  }\n\n  /* Remove slashes again */\n  while(len > 0 && path[len - 1] == '/') --len;\n\n  new = malloc(len + 1);\n  if (new == NULL) {\n    return NULL;\n  }\n\n  strncpy(new, path, len);\n  new[len] = '\\0';\n\n  return new;\n}\n\n/**\n * @brief basename - parse filename component.\n *\n * basename breaks a null-terminated pathname string into a filename component.\n * ssh_basename() returns the component following the final '/'.  Trailing '/'\n * characters are not counted as part of the pathname.\n *\n * @param[in]  path     The path to parse.\n *\n * @return              The filename of path or NULL if we can't allocate\n *                      memory. If path is a the string \"/\", basename returns\n *                      the string \"/\". If path is NULL or an empty string,\n *                      \".\" is returned.\n */\nchar *ssh_basename (const char *path) {\n  char *new = NULL;\n  const char *s;\n  size_t len;\n\n  if (path == NULL || *path == '\\0') {\n    return strdup(\".\");\n  }\n\n  len = strlen(path);\n  /* Remove trailing slashes */\n  while(len > 0 && path[len - 1] == '/') --len;\n\n  /* We have only slashes */\n  if (len == 0) {\n    return strdup(\"/\");\n  }\n\n  while(len > 0 && path[len - 1] != '/') --len;\n\n  if (len > 0) {\n    s = path + len;\n    len = strlen(s);\n\n    while(len > 0 && s[len - 1] == '/') --len;\n  } else {\n    return strdup(path);\n  }\n\n  new = malloc(len + 1);\n  if (new == NULL) {\n    return NULL;\n  }\n\n  strncpy(new, s, len);\n  new[len] = '\\0';\n\n  return new;\n}\n\n/**\n * @brief Attempts to create a directory with the given pathname.\n *\n * This is the portable version of mkdir, mode is ignored on Windows systems.\n *\n * @param[in]  pathname The path name to create the directory.\n *\n * @param[in]  mode     The permissions to use.\n *\n * @return              0 on success, < 0 on error with errno set.\n */\nint ssh_mkdir(const char *pathname, mode_t mode)\n{\n    int r;\n#ifdef _WIN32\n    r = _mkdir(pathname);\n#else\n    r = mkdir(pathname, mode);\n#endif\n\n    return r;\n}\n\n/**\n * @brief Attempts to create a directory with the given pathname. The missing\n * directories in the given pathname are created recursively.\n *\n * @param[in]  pathname The path name to create the directory.\n *\n * @param[in]  mode     The permissions to use.\n *\n * @return              0 on success, < 0 on error with errno set.\n *\n * @note mode is ignored on Windows systems.\n */\nint ssh_mkdirs(const char *pathname, mode_t mode)\n{\n    int rc = 0;\n    char *parent = NULL;\n\n    if (pathname == NULL ||\n        pathname[0] == '\\0' ||\n        !strcmp(pathname, \"/\") ||\n        !strcmp(pathname, \".\"))\n    {\n        errno = EINVAL;\n        return -1;\n    }\n\n    errno = 0;\n\n#ifdef _WIN32\n    rc = _mkdir(pathname);\n#else\n    rc = mkdir(pathname, mode);\n#endif\n\n    if (rc < 0) {\n        /* If a directory was missing, try to create the parent */\n        if (errno == ENOENT) {\n            parent = ssh_dirname(pathname);\n            if (parent == NULL) {\n                errno = ENOMEM;\n                return -1;\n            }\n\n            rc = ssh_mkdirs(parent, mode);\n            if (rc < 0) {\n                /* We could not create the parent */\n                SAFE_FREE(parent);\n                return -1;\n            }\n\n            SAFE_FREE(parent);\n\n            /* Try again */\n            errno = 0;\n#ifdef _WIN32\n            rc = _mkdir(pathname);\n#else\n            rc = mkdir(pathname, mode);\n#endif\n        }\n    }\n\n    return rc;\n}\n\n/**\n * @brief Expand a directory starting with a tilde '~'\n *\n * @param[in]  d        The directory to expand.\n *\n * @return              The expanded directory, NULL on error.\n */\nchar *ssh_path_expand_tilde(const char *d) {\n    char *h = NULL, *r;\n    const char *p;\n    size_t ld;\n    size_t lh = 0;\n\n    if (d[0] != '~') {\n        return strdup(d);\n    }\n    d++;\n\n    /* handle ~user/path */\n    p = strchr(d, '/');\n    if (p != NULL && p > d) {\n#ifdef _WIN32\n        return strdup(d);\n#else\n        struct passwd *pw;\n        size_t s = p - d;\n        char u[128];\n\n        if (s >= sizeof(u)) {\n            return NULL;\n        }\n        memcpy(u, d, s);\n        u[s] = '\\0';\n        pw = getpwnam(u);\n        if (pw == NULL) {\n            return NULL;\n        }\n        ld = strlen(p);\n        h = strdup(pw->pw_dir);\n#endif\n    } else {\n        ld = strlen(d);\n        p = (char *) d;\n        h = ssh_get_user_home_dir();\n    }\n    if (h == NULL) {\n        return NULL;\n    }\n    lh = strlen(h);\n\n    r = malloc(ld + lh + 1);\n    if (r == NULL) {\n        SAFE_FREE(h);\n        return NULL;\n    }\n\n    if (lh > 0) {\n        memcpy(r, h, lh);\n    }\n    SAFE_FREE(h);\n    memcpy(r + lh, p, ld + 1);\n\n    return r;\n}\n\n/** @internal\n * @brief expands a string in function of session options\n * @param[in] s Format string to expand. Known parameters:\n *              %d SSH configuration directory (~/.ssh)\n *              %h target host name\n *              %u local username\n *              %l local hostname\n *              %r remote username\n *              %p remote port\n * @returns Expanded string.\n */\nchar *ssh_path_expand_escape(ssh_session session, const char *s) {\n    char host[NI_MAXHOST];\n    char buf[MAX_BUF_SIZE];\n    char *r, *x = NULL;\n    const char *p;\n    size_t i, l;\n\n    r = ssh_path_expand_tilde(s);\n    if (r == NULL) {\n        ssh_set_error_oom(session);\n        return NULL;\n    }\n\n    if (strlen(r) > MAX_BUF_SIZE) {\n        ssh_set_error(session, SSH_FATAL, \"string to expand too long\");\n        free(r);\n        return NULL;\n    }\n\n    p = r;\n    buf[0] = '\\0';\n\n    for (i = 0; *p != '\\0'; p++) {\n        if (*p != '%') {\n        escape:\n            buf[i] = *p;\n            i++;\n            if (i >= MAX_BUF_SIZE) {\n                free(r);\n                return NULL;\n            }\n            buf[i] = '\\0';\n            continue;\n        }\n\n        p++;\n        if (*p == '\\0') {\n            break;\n        }\n\n        switch (*p) {\n            case '%':\n                goto escape;\n            case 'd':\n                x = strdup(session->opts.sshdir);\n                break;\n            case 'u':\n                x = ssh_get_local_username();\n                break;\n            case 'l':\n                if (gethostname(host, sizeof(host) == 0)) {\n                    x = strdup(host);\n                }\n                break;\n            case 'h':\n                x = strdup(session->opts.host);\n                break;\n            case 'r':\n                x = strdup(session->opts.username);\n                break;\n            case 'p':\n                if (session->opts.port < 65536) {\n                    char tmp[6];\n\n                    snprintf(tmp,\n                             sizeof(tmp),\n                             \"%u\",\n                             session->opts.port > 0 ? session->opts.port : 22);\n                    x = strdup(tmp);\n                }\n                break;\n            default:\n                ssh_set_error(session, SSH_FATAL,\n                        \"Wrong escape sequence detected\");\n                free(r);\n                return NULL;\n        }\n\n        if (x == NULL) {\n            ssh_set_error_oom(session);\n            free(r);\n            return NULL;\n        }\n\n        i += strlen(x);\n        if (i >= MAX_BUF_SIZE) {\n            ssh_set_error(session, SSH_FATAL,\n                    \"String too long\");\n            free(x);\n            free(r);\n            return NULL;\n        }\n        l = strlen(buf);\n        strncpy(buf + l, x, sizeof(buf) - l - 1);\n        buf[i] = '\\0';\n        SAFE_FREE(x);\n    }\n\n    free(r);\n    return strdup(buf);\n#undef MAX_BUF_SIZE\n}\n\n/**\n * @internal\n *\n * @brief Analyze the SSH banner to extract version information.\n *\n * @param  session      The session to analyze the banner from.\n * @param  server       0 means we are a client, 1 a server.\n *\n * @return 0 on success, < 0 on error.\n *\n * @see ssh_get_issue_banner()\n */\nint ssh_analyze_banner(ssh_session session, int server)\n{\n    const char *banner;\n    const char *openssh;\n\n    if (server) {\n        banner = session->clientbanner;\n    } else {\n        banner = session->serverbanner;\n    }\n\n    if (banner == NULL) {\n        ssh_set_error(session, SSH_FATAL, \"Invalid banner\");\n        return -1;\n    }\n\n    /*\n     * Typical banners e.g. are:\n     *\n     * SSH-1.5-openSSH_5.4\n     * SSH-1.99-openSSH_3.0\n     *\n     * SSH-2.0-something\n     * 012345678901234567890\n     */\n    if (strlen(banner) < 6 ||\n        strncmp(banner, \"SSH-\", 4) != 0) {\n          ssh_set_error(session, SSH_FATAL, \"Protocol mismatch: %s\", banner);\n          return -1;\n    }\n\n    SSH_LOG(SSH_LOG_PROTOCOL, \"Analyzing banner: %s\", banner);\n\n    switch (banner[4]) {\n        case '2':\n            break;\n        case '1':\n            if (strlen(banner) > 6) {\n                if (banner[6] == '9') {\n                    break;\n                }\n            }\n            FALL_THROUGH;\n        default:\n            ssh_set_error(session, SSH_FATAL, \"Protocol mismatch: %s\", banner);\n            return -1;\n    }\n\n    /* Make a best-effort to extract OpenSSH version numbers. */\n    openssh = strstr(banner, \"OpenSSH\");\n    if (openssh != NULL) {\n        char *tmp = NULL;\n        unsigned long int major = 0UL;\n        unsigned long int minor = 0UL;\n\n        /*\n         * The banner is typical:\n         * OpenSSH_5.4\n         * 012345678901234567890\n         */\n        if (strlen(openssh) > 9) {\n            major = strtoul(openssh + 8, &tmp, 10);\n            if ((tmp == (openssh + 8)) ||\n                ((errno == ERANGE) && (major == ULONG_MAX)) ||\n                ((errno != 0) && (major == 0)) ||\n                ((major < 1) || (major > 100))) {\n                /* invalid major */\n                goto done;\n            }\n\n            minor = strtoul(openssh + 10, &tmp, 10);\n            if ((tmp == (openssh + 10)) ||\n                ((errno == ERANGE) && (major == ULONG_MAX)) ||\n                ((errno != 0) && (major == 0)) ||\n                (minor > 100)) {\n                /* invalid minor */\n                goto done;\n            }\n\n            session->openssh = SSH_VERSION_INT(((int) major), ((int) minor), 0);\n\n            SSH_LOG(SSH_LOG_PROTOCOL,\n                    \"We are talking to an OpenSSH client version: %lu.%lu (%x)\",\n                    major, minor, session->openssh);\n        }\n    }\n\ndone:\n    return 0;\n}\n\n/* try the Monotonic clock if possible for perfs reasons */\n#ifdef _POSIX_MONOTONIC_CLOCK\n#define CLOCK CLOCK_MONOTONIC\n#else\n#define CLOCK CLOCK_REALTIME\n#endif\n\n/**\n * @internal\n * @brief initializes a timestamp to the current time\n * @param[out] ts pointer to an allocated ssh_timestamp structure\n */\nvoid ssh_timestamp_init(struct ssh_timestamp *ts){\n#ifdef HAVE_CLOCK_GETTIME\n  struct timespec tp;\n  clock_gettime(CLOCK, &tp);\n  ts->useconds = tp.tv_nsec / 1000;\n#else\n  struct timeval tp;\n  gettimeofday(&tp, NULL);\n  ts->useconds = tp.tv_usec;\n#endif\n  ts->seconds = tp.tv_sec;\n}\n\n#undef CLOCK\n\n/**\n * @internal\n * @brief gets the time difference between two timestamps in ms\n * @param[in] old older value\n * @param[in] new newer value\n * @returns difference in milliseconds\n */\n\nstatic int ssh_timestamp_difference(struct ssh_timestamp *old,\n    struct ssh_timestamp *new){\n  long seconds, usecs, msecs;\n  seconds = new->seconds - old->seconds;\n  usecs = new->useconds - old->useconds;\n  if (usecs < 0){\n    seconds--;\n    usecs += 1000000;\n  }\n  msecs = seconds * 1000 + usecs/1000;\n  return msecs;\n}\n\n/**\n * @internal\n * @brief turn seconds and microseconds pair (as provided by user-set options)\n * into millisecond value\n * @param[in] sec number of seconds\n * @param[in] usec number of microseconds\n * @returns milliseconds, or 10000 if user supplied values are equal to zero\n */\nint ssh_make_milliseconds(long sec, long usec) {\n\tint res = usec ? (usec / 1000) : 0;\n\tres += (sec * 1000);\n\tif (res == 0) {\n\t\tres = 10 * 1000; /* use a reasonable default value in case\n\t\t\t\t* SSH_OPTIONS_TIMEOUT is not set in options. */\n\t}\n\treturn res;\n}\n\n/**\n * @internal\n * @brief Checks if a timeout is elapsed, in function of a previous\n * timestamp and an assigned timeout\n * @param[in] ts pointer to an existing timestamp\n * @param[in] timeout timeout in milliseconds. Negative values mean infinite\n *                   timeout\n * @returns 1 if timeout is elapsed\n *          0 otherwise\n */\nint ssh_timeout_elapsed(struct ssh_timestamp *ts, int timeout) {\n    struct ssh_timestamp now;\n\n    switch(timeout) {\n        case -2: /*\n                  * -2 means user-defined timeout as available in\n                  * session->timeout, session->timeout_usec.\n                  */\n            SSH_LOG(SSH_LOG_WARN, \"ssh_timeout_elapsed called with -2. this needs to \"\n                            \"be fixed. please set a breakpoint on misc.c:%d and \"\n                            \"fix the caller\\n\", __LINE__);\n            return 0;\n        case -1: /* -1 means infinite timeout */\n            return 0;\n        case 0: /* 0 means no timeout */\n            return 1;\n        default:\n            break;\n    }\n\n    ssh_timestamp_init(&now);\n\n    return (ssh_timestamp_difference(ts,&now) >= timeout);\n}\n\n/**\n * @brief updates a timeout value so it reflects the remaining time\n * @param[in] ts pointer to an existing timestamp\n * @param[in] timeout timeout in milliseconds. Negative values mean infinite\n *             timeout\n * @returns   remaining time in milliseconds, 0 if elapsed, -1 if never.\n */\nint ssh_timeout_update(struct ssh_timestamp *ts, int timeout){\n  struct ssh_timestamp now;\n  int ms, ret;\n  if (timeout <= 0) {\n      return timeout;\n  }\n  ssh_timestamp_init(&now);\n  ms = ssh_timestamp_difference(ts,&now);\n  if(ms < 0)\n    ms = 0;\n  ret = timeout - ms;\n  return ret >= 0 ? ret: 0;\n}\n\n\nint ssh_match_group(const char *group, const char *object)\n{\n    const char *a;\n    const char *z;\n\n    z = group;\n    do {\n        a = strchr(z, ',');\n        if (a == NULL) {\n            if (strcmp(z, object) == 0) {\n                return 1;\n            }\n            return 0;\n        } else {\n            if (strncmp(z, object, a - z) == 0) {\n                return 1;\n            }\n        }\n        z = a + 1;\n    } while(1);\n\n    /* not reached */\n    return 0;\n}\n\n#if !defined(HAVE_EXPLICIT_BZERO)\nvoid explicit_bzero(void *s, size_t n)\n{\n#if defined(HAVE_MEMSET_S)\n    memset_s(s, n, '\\0', n);\n#elif defined(HAVE_SECURE_ZERO_MEMORY)\n    SecureZeroMemory(s, n);\n#else\n    memset(s, '\\0', n);\n#if defined(HAVE_GCC_VOLATILE_MEMORY_PROTECTION)\n    /* See http://llvm.org/bugs/show_bug.cgi?id=15495 */\n    __asm__ volatile(\"\" : : \"g\"(s) : \"memory\");\n#endif /* HAVE_GCC_VOLATILE_MEMORY_PROTECTION */\n#endif\n}\n#endif /* !HAVE_EXPLICIT_BZERO */\n\n#if !defined(HAVE_STRNDUP)\nchar *strndup(const char *s, size_t n)\n{\n    char *x = NULL;\n\n    if (n + 1 < n) {\n        return NULL;\n    }\n\n    x = malloc(n + 1);\n    if (x == NULL) {\n        return NULL;\n    }\n\n    memcpy(x, s, n);\n    x[n] = '\\0';\n\n    return x;\n}\n#endif /* ! HAVE_STRNDUP */\n\n/* Increment 64b integer in network byte order */\nvoid\nuint64_inc(unsigned char *counter)\n{\n    int i;\n\n    for (i = 7; i >= 0; i--) {\n        counter[i]++;\n        if (counter[i])\n          return;\n    }\n}\n\n/**\n * @internal\n *\n * @brief Quote file name to be used on shell.\n *\n * Try to put the given file name between single quotes. There are special\n * cases:\n *\n * - When the '\\'' char is found in the file name, it is double quoted\n *   - example:\n *     input: a'b\n *     output: 'a'\"'\"'b'\n * - When the '!' char is found in the file name, it is replaced by an unquoted\n *   verbatim char \"\\!\"\n *   - example:\n *     input: a!b\n *     output 'a'\\!'b'\n *\n * @param[in]   file_name  File name string to be quoted before used on shell\n * @param[out]  buf       Buffer to receive the final quoted file name.  Must\n *                        have room for the final quoted string.  The maximum\n *                        output length would be (3 * strlen(file_name) + 1)\n *                        since in the worst case each character would be\n *                        replaced by 3 characters, plus the terminating '\\0'.\n * @param[in]   buf_len   The size of the provided output buffer\n *\n * @returns SSH_ERROR on error; length of the resulting string not counting the\n * string terminator '\\0'\n * */\nint ssh_quote_file_name(const char *file_name, char *buf, size_t buf_len)\n{\n    const char *src = NULL;\n    char *dst = NULL;\n    size_t required_buf_len;\n\n    enum ssh_quote_state_e state = NO_QUOTE;\n\n    if (file_name == NULL || buf == NULL || buf_len == 0) {\n        SSH_LOG(SSH_LOG_WARNING, \"Invalid parameter\");\n        return SSH_ERROR;\n    }\n\n    /* Only allow file names smaller than 32kb. */\n    if (strlen(file_name) > 32 * 1024) {\n        SSH_LOG(SSH_LOG_WARNING, \"File name too long\");\n        return SSH_ERROR;\n    }\n\n    /* Paranoia check */\n    required_buf_len = (size_t)3 * strlen(file_name) + 1;\n    if (required_buf_len > buf_len) {\n        SSH_LOG(SSH_LOG_WARNING, \"Buffer too small\");\n        return SSH_ERROR;\n    }\n\n    src = file_name;\n    dst = buf;\n\n    while ((*src != '\\0')) {\n        switch (*src) {\n\n        /* The '\\'' char is double quoted */\n\n        case '\\'':\n            switch (state) {\n            case NO_QUOTE:\n                /* Start a new double quoted string. The '\\'' char will be\n                 * copied to the beginning of it at the end of the loop. */\n                *dst++ = '\"';\n                break;\n            case SINGLE_QUOTE:\n                /* Close the current single quoted string and start a new double\n                 * quoted string. The '\\'' char will be copied to the beginning\n                 * of it at the end of the loop. */\n                *dst++ = '\\'';\n                *dst++ = '\"';\n                break;\n            case DOUBLE_QUOTE:\n                /* If already in the double quoted string, keep copying the\n                 * sequence of chars. */\n                break;\n            default:\n                /* Should never be reached */\n                goto error;\n            }\n\n            /* When the '\\'' char is found, the resulting state will be\n             * DOUBLE_QUOTE in any case*/\n            state = DOUBLE_QUOTE;\n            break;\n\n        /* The '!' char is replaced by unquoted \"\\!\" */\n\n        case '!':\n            switch (state) {\n            case NO_QUOTE:\n                /* The '!' char is interpreted in some shells (e.g. CSH) even\n                 * when is quoted with single quotes.  Replace it with unquoted\n                 * \"\\!\" which is correctly interpreted as the '!' character. */\n                *dst++ = '\\\\';\n                break;\n            case SINGLE_QUOTE:\n                /* Close the current quoted string and replace '!' for unquoted\n                 * \"\\!\" */\n                *dst++ = '\\'';\n                *dst++ = '\\\\';\n                break;\n            case DOUBLE_QUOTE:\n                /* Close current quoted string and replace  \"!\" for unquoted\n                 * \"\\!\" */\n                *dst++ = '\"';\n                *dst++ = '\\\\';\n                break;\n            default:\n                /* Should never be reached */\n                goto error;\n            }\n\n            /* When the '!' char is found, the resulting state will be NO_QUOTE\n             * in any case*/\n            state = NO_QUOTE;\n            break;\n\n        /* Ordinary chars are single quoted */\n\n        default:\n            switch (state) {\n            case NO_QUOTE:\n                /* Start a new single quoted string */\n                *dst++ = '\\'';\n                break;\n            case SINGLE_QUOTE:\n                /* If already in the single quoted string, keep copying the\n                 * sequence of chars. */\n                break;\n            case DOUBLE_QUOTE:\n                /* Close current double quoted string and start a new single\n                 * quoted string. */\n                *dst++ = '\"';\n                *dst++ = '\\'';\n                break;\n            default:\n                /* Should never be reached */\n                goto error;\n            }\n\n            /* When an ordinary char is found, the resulting state will be\n             * SINGLE_QUOTE in any case*/\n            state = SINGLE_QUOTE;\n            break;\n        }\n\n        /* Copy the current char to output */\n        *dst++ = *src++;\n    }\n\n    /* Close the quoted string when necessary */\n\n    switch (state) {\n    case NO_QUOTE:\n        /* No open string */\n        break;\n    case SINGLE_QUOTE:\n        /* Close current single quoted string */\n        *dst++ = '\\'';\n        break;\n    case DOUBLE_QUOTE:\n        /* Close current double quoted string */\n        *dst++ = '\"';\n        break;\n    default:\n        /* Should never be reached */\n        goto error;\n    }\n\n    /* Put the string terminator */\n    *dst = '\\0';\n\n    return dst - buf;\n\nerror:\n    return SSH_ERROR;\n}\n\n/**\n * @internal\n *\n * @brief Given a string, encode existing newlines as the string \"\\\\n\"\n *\n * @param[in]  string   Input string\n * @param[out] buf      Output buffer. This buffer must be at least (2 *\n *                      strlen(string)) + 1 long.  In the worst case,\n *                      each character can be encoded as 2 characters plus the\n *                      terminating '\\0'.\n * @param[in]  buf_len  Size of the provided output buffer\n *\n * @returns SSH_ERROR on error; length of the resulting string not counting the\n * terminating '\\0' otherwise\n */\nint ssh_newline_vis(const char *string, char *buf, size_t buf_len)\n{\n    const char *in = NULL;\n    char *out = NULL;\n\n    if (string == NULL || buf == NULL || buf_len == 0) {\n        return SSH_ERROR;\n    }\n\n    if ((2 * strlen(string) + 1) > buf_len) {\n        SSH_LOG(SSH_LOG_WARNING, \"Buffer too small\");\n        return SSH_ERROR;\n    }\n\n    out = buf;\n    for (in = string; *in != '\\0'; in++) {\n        if (*in == '\\n') {\n            *out++ = '\\\\';\n            *out++ = 'n';\n        } else {\n            *out++ = *in;\n        }\n    }\n    *out = '\\0';\n\n    return out - buf;\n}\n\n/** @} */\n"
  },
  {
    "path": "src/libssh/src/options.c",
    "content": "/*\n * options.c - handle pre-connection options\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2003-2008 by Aris Adamantiadis\n * Copyright (c) 2009-2013 by Andreas Schneider <asn@cryptomilk.org>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#ifndef _WIN32\n#include <pwd.h>\n#else\n#include <winsock2.h>\n#endif\n#include <sys/types.h>\n#include \"libssh/priv.h\"\n#include \"libssh/session.h\"\n#include \"libssh/misc.h\"\n#include \"libssh/options.h\"\n#ifdef WITH_SERVER\n#include \"libssh/server.h\"\n#include \"libssh/bind.h\"\n#include \"libssh/bind_config.h\"\n#endif\n\n/**\n * @addtogroup libssh_session\n * @{\n */\n\n/**\n * @brief Duplicate the options of a session structure.\n *\n * If you make several sessions with the same options this is useful. You\n * cannot use twice the same option structure in ssh_session_connect.\n *\n * @param src           The session to use to copy the options.\n *\n * @param dest          A pointer to store the allocated session with duplicated\n *                      options. You have to free the memory.\n *\n * @returns             0 on sucess, -1 on error with errno set.\n *\n * @see ssh_session_connect()\n */\nint ssh_options_copy(ssh_session src, ssh_session *dest)\n{\n    ssh_session new;\n    struct ssh_iterator *it = NULL;\n    char *id = NULL;\n    int i;\n\n    if (src == NULL || dest == NULL) {\n        return -1;\n    }\n\n    new = ssh_new();\n    if (new == NULL) {\n        return -1;\n    }\n\n    if (src->opts.username != NULL) {\n        new->opts.username = strdup(src->opts.username);\n        if (new->opts.username == NULL) {\n            ssh_free(new);\n            return -1;\n        }\n    }\n\n    if (src->opts.host != NULL) {\n        new->opts.host = strdup(src->opts.host);\n        if (new->opts.host == NULL) {\n            ssh_free(new);\n            return -1;\n        }\n    }\n\n    if (src->opts.bindaddr != NULL) {\n        new->opts.bindaddr = strdup(src->opts.bindaddr);\n        if (new->opts.bindaddr == NULL) {\n            ssh_free(new);\n            return -1;\n        }\n    }\n\n    /* Remove the default identities */\n    for (id = ssh_list_pop_head(char *, new->opts.identity);\n         id != NULL;\n         id = ssh_list_pop_head(char *, new->opts.identity)) {\n        SAFE_FREE(id);\n    }\n    /* Copy the new identities from the source list */\n    if (src->opts.identity != NULL) {\n        it = ssh_list_get_iterator(src->opts.identity);\n        while (it) {\n            int rc;\n\n            id = strdup((char *) it->data);\n            if (id == NULL) {\n                ssh_free(new);\n                return -1;\n            }\n\n            rc = ssh_list_append(new->opts.identity, id);\n            if (rc < 0) {\n                free(id);\n                ssh_free(new);\n                return -1;\n            }\n            it = it->next;\n        }\n    }\n\n    if (src->opts.sshdir != NULL) {\n        new->opts.sshdir = strdup(src->opts.sshdir);\n        if (new->opts.sshdir == NULL) {\n            ssh_free(new);\n            return -1;\n        }\n    }\n\n    if (src->opts.knownhosts != NULL) {\n        new->opts.knownhosts = strdup(src->opts.knownhosts);\n        if (new->opts.knownhosts == NULL) {\n            ssh_free(new);\n            return -1;\n        }\n    }\n\n    if (src->opts.global_knownhosts != NULL) {\n        new->opts.global_knownhosts = strdup(src->opts.global_knownhosts);\n        if (new->opts.global_knownhosts == NULL) {\n            ssh_free(new);\n            return -1;\n        }\n    }\n\n    for (i = 0; i < SSH_KEX_METHODS; i++) {\n        if (src->opts.wanted_methods[i] != NULL) {\n            new->opts.wanted_methods[i] = strdup(src->opts.wanted_methods[i]);\n            if (new->opts.wanted_methods[i] == NULL) {\n                ssh_free(new);\n                return -1;\n            }\n        }\n    }\n\n    if (src->opts.ProxyCommand != NULL) {\n        new->opts.ProxyCommand = strdup(src->opts.ProxyCommand);\n        if (new->opts.ProxyCommand == NULL) {\n            ssh_free(new);\n            return -1;\n        }\n    }\n\n    if (src->opts.pubkey_accepted_types != NULL) {\n        new->opts.pubkey_accepted_types = strdup(src->opts.pubkey_accepted_types);\n        if (new->opts.pubkey_accepted_types == NULL) {\n            ssh_free(new);\n            return -1;\n        }\n    }\n\n    if (src->opts.gss_server_identity != NULL) {\n        new->opts.gss_server_identity = strdup(src->opts.gss_server_identity);\n        if (new->opts.gss_server_identity == NULL) {\n            ssh_free(new);\n            return -1;\n        }\n    }\n\n    if (src->opts.gss_client_identity != NULL) {\n        new->opts.gss_client_identity = strdup(src->opts.gss_client_identity);\n        if (new->opts.gss_client_identity == NULL) {\n            ssh_free(new);\n            return -1;\n        }\n    }\n\n    memcpy(new->opts.options_seen, src->opts.options_seen,\n           sizeof(new->opts.options_seen));\n\n    new->opts.fd                    = src->opts.fd;\n    new->opts.port                  = src->opts.port;\n    new->opts.timeout               = src->opts.timeout;\n    new->opts.timeout_usec          = src->opts.timeout_usec;\n    new->opts.compressionlevel      = src->opts.compressionlevel;\n    new->opts.StrictHostKeyChecking = src->opts.StrictHostKeyChecking;\n    new->opts.gss_delegate_creds    = src->opts.gss_delegate_creds;\n    new->opts.flags                 = src->opts.flags;\n    new->opts.nodelay               = src->opts.nodelay;\n    new->opts.config_processed      = src->opts.config_processed;\n    new->common.log_verbosity       = src->common.log_verbosity;\n    new->common.callbacks           = src->common.callbacks;\n\n    *dest = new;\n\n    return 0;\n}\n\nint ssh_options_set_algo(ssh_session session,\n                         enum ssh_kex_types_e algo,\n                         const char *list)\n{\n    char *p = NULL;\n\n    if (ssh_fips_mode()) {\n        p = ssh_keep_fips_algos(algo, list);\n    } else {\n        p = ssh_keep_known_algos(algo, list);\n    }\n\n    if (p == NULL) {\n        ssh_set_error(session, SSH_REQUEST_DENIED,\n                \"Setting method: no allowed algorithm for method \\\"%s\\\" (%s)\",\n                ssh_kex_get_description(algo), list);\n        return -1;\n    }\n\n    SAFE_FREE(session->opts.wanted_methods[algo]);\n    session->opts.wanted_methods[algo] = p;\n\n    return 0;\n}\n\n/**\n * @brief This function can set all possible ssh options.\n *\n * @param  session An allocated SSH session structure.\n *\n * @param  type The option type to set. This could be one of the\n *              following:\n *\n *              - SSH_OPTIONS_HOST:\n *                The hostname or ip address to connect to (const char *).\n *\n *              - SSH_OPTIONS_PORT:\n *                The port to connect to (unsigned int *).\n *\n *              - SSH_OPTIONS_PORT_STR:\n *                The port to connect to (const char *).\n *\n *              - SSH_OPTIONS_FD:\n *                The file descriptor to use (socket_t).\\n\n *                \\n\n *                If you wish to open the socket yourself for a reason\n *                or another, set the file descriptor. Don't forget to\n *                set the hostname as the hostname is used as a key in\n *                the known_host mechanism.\n *\n *              - SSH_OPTIONS_BINDADDR:\n *                The address to bind the client to (const char *).\n *\n *              - SSH_OPTIONS_USER:\n *                The username for authentication (const char *).\\n\n *                \\n\n *                If the value is NULL, the username is set to the\n *                default username.\n *\n *              - SSH_OPTIONS_SSH_DIR:\n *                Set the ssh directory (const char *,format string).\\n\n *                \\n\n *                If the value is NULL, the directory is set to the\n *                default ssh directory.\\n\n *                \\n\n *                The ssh directory is used for files like known_hosts\n *                and identity (private and public key). It may include\n *                \"%s\" which will be replaced by the user home\n *                directory.\n *\n *              - SSH_OPTIONS_KNOWNHOSTS:\n *                Set the known hosts file name (const char *,format string).\\n\n *                \\n\n *                If the value is NULL, the directory is set to the\n *                default known hosts file, normally\n *                ~/.ssh/known_hosts.\\n\n *                \\n\n *                The known hosts file is used to certify remote hosts\n *                are genuine. It may include \"%d\" which will be\n *                replaced by the user home directory.\n *\n *              - SSH_OPTIONS_GLOBAL_KNOWNHOSTS:\n *                Set the global known hosts file name (const char *,format string).\\n\n *                \\n\n *                If the value is NULL, the directory is set to the\n *                default global known hosts file, normally\n *                /etc/ssh/ssh_known_hosts.\\n\n *                \\n\n *                The known hosts file is used to certify remote hosts\n *                are genuine.\n *\n *              - SSH_OPTIONS_ADD_IDENTITY (or SSH_OPTIONS_IDENTITY):\n *                Add a new identity file (const char *, format string) to\n *                the identity list.\\n\n *                \\n\n *                By default identity, id_dsa and id_rsa are checked.\\n\n *                \\n\n *                The identity used to authenticate with public key will be\n *                prepended to the list.\n *                It may include \"%s\" which will be replaced by the\n *                user home directory.\n *\n *              - SSH_OPTIONS_TIMEOUT:\n *                Set a timeout for the connection in seconds (long).\n *\n *              - SSH_OPTIONS_TIMEOUT_USEC:\n *                Set a timeout for the connection in micro seconds\n *                        (long).\n *\n *              - SSH_OPTIONS_SSH1:\n *                Deprecated\n *\n *              - SSH_OPTIONS_SSH2:\n *                Unused\n *\n *              - SSH_OPTIONS_LOG_VERBOSITY:\n *                Set the session logging verbosity (int).\\n\n *                \\n\n *                The verbosity of the messages. Every log smaller or\n *                equal to verbosity will be shown.\n *                - SSH_LOG_NOLOG: No logging\n *                - SSH_LOG_WARNING: Only warnings\n *                - SSH_LOG_PROTOCOL: High level protocol information\n *                - SSH_LOG_PACKET: Lower level protocol infomations, packet level\n *                - SSH_LOG_FUNCTIONS: Every function path\n *\n *              - SSH_OPTIONS_LOG_VERBOSITY_STR:\n *                Set the session logging verbosity via a\n *                string that will be converted to a numerical\n *                value (e.g. \"3\") and interpreted according\n *                to the values of\n *                SSH_OPTIONS_LOG_VERBOSITY above (const\n *                char *).\n *\n *              - SSH_OPTIONS_CIPHERS_C_S:\n *                Set the symmetric cipher client to server (const char *,\n *                comma-separated list).\n *\n *              - SSH_OPTIONS_CIPHERS_S_C:\n *                Set the symmetric cipher server to client (const char *,\n *                comma-separated list).\n *\n *              - SSH_OPTIONS_KEY_EXCHANGE:\n *                Set the key exchange method to be used (const char *,\n *                comma-separated list). ex:\n *                \"ecdh-sha2-nistp256,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1\"\n *\n *              - SSH_OPTIONS_HMAC_C_S:\n *                Set the Message Authentication Code algorithm client to server\n *                (const char *, comma-separated list).\n *\n *              - SSH_OPTIONS_HMAC_S_C:\n *                Set the Message Authentication Code algorithm server to client\n *                (const char *, comma-separated list).\n *\n *              - SSH_OPTIONS_HOSTKEYS:\n *                Set the preferred server host key types (const char *,\n *                comma-separated list). ex:\n *                \"ssh-rsa,ssh-dss,ecdh-sha2-nistp256\"\n *\n *              - SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES:\n *                Set the preferred public key algorithms to be used for\n *                authentication (const char *, comma-separated list). ex:\n *                \"ssh-rsa,rsa-sha2-256,ssh-dss,ecdh-sha2-nistp256\"\n *\n *              - SSH_OPTIONS_COMPRESSION_C_S:\n *                Set the compression to use for client to server\n *                communication (const char *, \"yes\", \"no\" or a specific\n *                algorithm name if needed (\"zlib\",\"zlib@openssh.com\",\"none\").\n *\n *              - SSH_OPTIONS_COMPRESSION_S_C:\n *                Set the compression to use for server to client\n *                communication (const char *, \"yes\", \"no\" or a specific\n *                algorithm name if needed (\"zlib\",\"zlib@openssh.com\",\"none\").\n *\n *              - SSH_OPTIONS_COMPRESSION:\n *                Set the compression to use for both directions\n *                communication (const char *, \"yes\", \"no\" or a specific\n *                algorithm name if needed (\"zlib\",\"zlib@openssh.com\",\"none\").\n *\n *              - SSH_OPTIONS_COMPRESSION_LEVEL:\n *                Set the compression level to use for zlib functions. (int,\n *                value from 1 to 9, 9 being the most efficient but slower).\n *\n *              - SSH_OPTIONS_STRICTHOSTKEYCHECK:\n *                Set the parameter StrictHostKeyChecking to avoid\n *                asking about a fingerprint (int, 0 = false).\n *\n *              - SSH_OPTIONS_PROXYCOMMAND:\n *                Set the command to be executed in order to connect to\n *                server (const char *).\n *\n *              - SSH_OPTIONS_GSSAPI_SERVER_IDENTITY\n *                Set it to specify the GSSAPI server identity that libssh\n *                should expect when connecting to the server (const char *).\n *\n *              - SSH_OPTIONS_GSSAPI_CLIENT_IDENTITY\n *                Set it to specify the GSSAPI client identity that libssh\n *                should expect when connecting to the server (const char *).\n *\n *              - SSH_OPTIONS_GSSAPI_DELEGATE_CREDENTIALS\n *                Set it to specify that GSSAPI should delegate credentials\n *                to the server (int, 0 = false).\n *\n *              - SSH_OPTIONS_PASSWORD_AUTH\n *                Set it if password authentication should be used\n *                in ssh_userauth_auto_pubkey(). (int, 0=false).\n *                Currently without effect (ssh_userauth_auto_pubkey doesn't use\n *                password authentication).\n *\n *              - SSH_OPTIONS_PUBKEY_AUTH\n *                Set it if pubkey authentication should be used\n *                in ssh_userauth_auto_pubkey(). (int, 0=false).\n *\n *              - SSH_OPTIONS_KBDINT_AUTH\n *                Set it if keyboard-interactive authentication should be used\n *                in ssh_userauth_auto_pubkey(). (int, 0=false).\n *                Currently without effect (ssh_userauth_auto_pubkey doesn't use\n *                keyboard-interactive authentication).\n *\n *              - SSH_OPTIONS_GSSAPI_AUTH\n *                Set it if gssapi authentication should be used\n *                in ssh_userauth_auto_pubkey(). (int, 0=false).\n *                Currently without effect (ssh_userauth_auto_pubkey doesn't use\n *                gssapi authentication).\n *\n *              - SSH_OPTIONS_NODELAY\n *                Set it to disable Nagle's Algorithm (TCP_NODELAY) on the\n *                session socket. (int, 0=false)\n *\n *              - SSH_OPTIONS_PROCESS_CONFIG\n *                Set it to false to disable automatic processing of per-user\n *                and system-wide OpenSSH configuration files. LibSSH\n *                automatically uses these configuration files unless\n *                you provide it with this option or with different file (bool).\n *\n *              - SSH_OPTIONS_REKEY_DATA\n *                Set the data limit that can be transferred with a single\n *                key in bytes. RFC 4253 Section 9 recommends 1GB of data, while\n *                RFC 4344 provides more specific restrictions, that are applied\n *                automatically. When specified, the lower value will be used.\n *                (uint64_t, 0=default)\n *\n *              - SSH_OPTIONS_REKEY_TIME\n *                Set the time limit for a session before intializing a rekey\n *                in seconds. RFC 4253 Section 9 recommends one hour.\n *                (uint32_t, 0=off)\n *\n * @param  value The value to set. This is a generic pointer and the\n *               datatype which is used should be set according to the\n *               type set.\n *\n * @return       0 on success, < 0 on error.\n */\nint ssh_options_set(ssh_session session, enum ssh_options_e type,\n    const void *value) {\n    const char *v;\n    char *p, *q;\n    long int i;\n    unsigned int u;\n    int rc;\n\n    if (session == NULL) {\n        return -1;\n    }\n\n    switch (type) {\n        case SSH_OPTIONS_HOST:\n            v = value;\n            if (v == NULL || v[0] == '\\0') {\n                ssh_set_error_invalid(session);\n                return -1;\n            } else {\n                q = strdup(value);\n                if (q == NULL) {\n                    ssh_set_error_oom(session);\n                    return -1;\n                }\n                p = strchr(q, '@');\n\n                SAFE_FREE(session->opts.host);\n\n                if (p) {\n                    *p = '\\0';\n                    session->opts.host = strdup(p + 1);\n                    if (session->opts.host == NULL) {\n                        SAFE_FREE(q);\n                        ssh_set_error_oom(session);\n                        return -1;\n                    }\n\n                    SAFE_FREE(session->opts.username);\n                    session->opts.username = strdup(q);\n                    SAFE_FREE(q);\n                    if (session->opts.username == NULL) {\n                        ssh_set_error_oom(session);\n                        return -1;\n                    }\n                } else {\n                    session->opts.host = q;\n                }\n            }\n            break;\n        case SSH_OPTIONS_PROXY_HOST:\n            v = value;\n            if (v == NULL || v[0] == '\\0') {\n                ssh_set_error_invalid(session);\n                return -1;\n            } else {\n                q = strdup(value);\n                if (q == NULL) {\n                    ssh_set_error_oom(session);\n                    return -1;\n                }\n                p = strchr(q, '@');\n\n                SAFE_FREE(session->opts.proxy_host);\n\n                if (p) {\n                    *p = '\\0';\n                    session->opts.proxy_host = strdup(p + 1);\n                    if (session->opts.proxy_host == NULL) {\n                        SAFE_FREE(q);\n                        ssh_set_error_oom(session);\n                        return -1;\n                    }\n\n                    SAFE_FREE(session->opts.username);\n                    session->opts.username = strdup(q);\n                    SAFE_FREE(q);\n                    if (session->opts.username == NULL) {\n                        ssh_set_error_oom(session);\n                        return -1;\n                    }\n                } else {\n                    session->opts.proxy_host = q;\n                }\n            }\n            break;\n        case SSH_OPTIONS_PORT:\n        case SSH_OPTIONS_PROXY_PORT:\n            if (value == NULL) {\n                ssh_set_error_invalid(session);\n                return -1;\n            } else {\n                int *x = (int *) value;\n                if (*x <= 0) {\n                    ssh_set_error_invalid(session);\n                    return -1;\n                }\n\n                if (type == SSH_OPTIONS_PORT) {\n                    session->opts.port = *x & 0xffffU;\n                } else if (type == SSH_OPTIONS_PROXY_PORT) {\n                    session->opts.proxy_port = *x & 0xffffU;\n                }\n            }\n            break;\n        case SSH_OPTIONS_PORT_STR:\n        case SSH_OPTIONS_PROXY_PORT_STR:\n            v = value;\n            if (v == NULL || v[0] == '\\0') {\n                ssh_set_error_invalid(session);\n                return -1;\n            } else {\n                q = strdup(v);\n                if (q == NULL) {\n                    ssh_set_error_oom(session);\n                    return -1;\n                }\n                i = strtol(q, &p, 10);\n                if (q == p) {\n                    SAFE_FREE(q);\n                }\n                SAFE_FREE(q);\n                if (i <= 0) {\n                    ssh_set_error_invalid(session);\n                    return -1;\n                }\n\n                if (type == SSH_OPTIONS_PORT_STR) {\n                    session->opts.port = i & 0xffffU;\n                } else if (type == SSH_OPTIONS_PROXY_PORT_STR) {\n                    session->opts.proxy_port = i & 0xffffU;\n                }\n            }\n            break;\n        case SSH_OPTIONS_FD:\n            if (value == NULL) {\n                session->opts.fd = SSH_INVALID_SOCKET;\n                ssh_set_error_invalid(session);\n                return -1;\n            } else {\n                socket_t *x = (socket_t *) value;\n                if (*x < 0) {\n                    session->opts.fd = SSH_INVALID_SOCKET;\n                    ssh_set_error_invalid(session);\n                    return -1;\n                }\n\n                session->opts.fd = *x & 0xffff;\n            }\n            break;\n        case SSH_OPTIONS_BINDADDR:\n            v = value;\n            if (v == NULL || v[0] == '\\0') {\n                ssh_set_error_invalid(session);\n                return -1;\n            }\n\n            q = strdup(v);\n            if (q == NULL) {\n                return -1;\n            }\n            SAFE_FREE(session->opts.bindaddr);\n            session->opts.bindaddr = q;\n            break;\n        case SSH_OPTIONS_USER:\n            v = value;\n            SAFE_FREE(session->opts.username);\n            if (v == NULL) {\n                q = ssh_get_local_username();\n                if (q == NULL) {\n                    ssh_set_error_oom(session);\n                    return -1;\n                }\n                session->opts.username = q;\n            } else if (v[0] == '\\0') {\n                ssh_set_error_invalid(session);\n                return -1;\n            } else { /* username provided */\n                session->opts.username = strdup(value);\n                if (session->opts.username == NULL) {\n                    ssh_set_error_oom(session);\n                    return -1;\n                }\n            }\n            break;\n        case SSH_OPTIONS_SSH_DIR:\n            v = value;\n            SAFE_FREE(session->opts.sshdir);\n            if (v == NULL) {\n                session->opts.sshdir = ssh_path_expand_tilde(\"~/.ssh\");\n                if (session->opts.sshdir == NULL) {\n                    return -1;\n                }\n            } else if (v[0] == '\\0') {\n                ssh_set_error_invalid(session);\n                return -1;\n            } else {\n                session->opts.sshdir = ssh_path_expand_tilde(v);\n                if (session->opts.sshdir == NULL) {\n                    ssh_set_error_oom(session);\n                    return -1;\n                }\n            }\n            break;\n        case SSH_OPTIONS_IDENTITY:\n        case SSH_OPTIONS_ADD_IDENTITY:\n            v = value;\n            if (v == NULL || v[0] == '\\0') {\n                ssh_set_error_invalid(session);\n                return -1;\n            }\n            q = strdup(v);\n            if (q == NULL) {\n                return -1;\n            }\n            rc = ssh_list_prepend(session->opts.identity, q);\n            if (rc < 0) {\n                free(q);\n                return -1;\n            }\n            break;\n        case SSH_OPTIONS_KNOWNHOSTS:\n            v = value;\n            SAFE_FREE(session->opts.knownhosts);\n            if (v == NULL) {\n                /* The default value will be set by the ssh_options_apply() */\n            } else if (v[0] == '\\0') {\n                ssh_set_error_invalid(session);\n                return -1;\n            } else {\n                session->opts.knownhosts = strdup(v);\n                if (session->opts.knownhosts == NULL) {\n                    ssh_set_error_oom(session);\n                    return -1;\n                }\n            }\n            break;\n        case SSH_OPTIONS_GLOBAL_KNOWNHOSTS:\n            v = value;\n            SAFE_FREE(session->opts.global_knownhosts);\n            if (v == NULL) {\n                session->opts.global_knownhosts =\n                    strdup(\"/etc/ssh/ssh_known_hosts\");\n                if (session->opts.global_knownhosts == NULL) {\n                    ssh_set_error_oom(session);\n                    return -1;\n                }\n            } else if (v[0] == '\\0') {\n                ssh_set_error_invalid(session);\n                return -1;\n            } else {\n                session->opts.global_knownhosts = strdup(v);\n                if (session->opts.global_knownhosts == NULL) {\n                    ssh_set_error_oom(session);\n                    return -1;\n                }\n            }\n            break;\n        case SSH_OPTIONS_TIMEOUT:\n            if (value == NULL) {\n                ssh_set_error_invalid(session);\n                return -1;\n            } else {\n                long *x = (long *) value;\n                if (*x < 0) {\n                    ssh_set_error_invalid(session);\n                    return -1;\n                }\n\n                session->opts.timeout = *x & 0xffffffffU;\n            }\n            break;\n        case SSH_OPTIONS_TIMEOUT_USEC:\n            if (value == NULL) {\n                ssh_set_error_invalid(session);\n                return -1;\n            } else {\n                long *x = (long *) value;\n                if (*x < 0) {\n                    ssh_set_error_invalid(session);\n                    return -1;\n                }\n\n                session->opts.timeout_usec = *x & 0xffffffffU;\n            }\n            break;\n        case SSH_OPTIONS_SSH1:\n            break;\n        case SSH_OPTIONS_SSH2:\n            break;\n        case SSH_OPTIONS_LOG_VERBOSITY:\n            if (value == NULL) {\n                ssh_set_error_invalid(session);\n                return -1;\n            } else {\n                int *x = (int *) value;\n                if (*x < 0) {\n                    ssh_set_error_invalid(session);\n                    return -1;\n                }\n\n                session->common.log_verbosity = *x & 0xffffU;\n                ssh_set_log_level(*x & 0xffffU);\n            }\n            break;\n        case SSH_OPTIONS_LOG_VERBOSITY_STR:\n            v = value;\n            if (v == NULL || v[0] == '\\0') {\n                session->common.log_verbosity = 0;\n                ssh_set_error_invalid(session);\n                return -1;\n            } else {\n                q = strdup(v);\n                if (q == NULL) {\n                    ssh_set_error_oom(session);\n                    return -1;\n                }\n                i = strtol(q, &p, 10);\n                if (q == p) {\n                    SAFE_FREE(q);\n                }\n                SAFE_FREE(q);\n                if (i < 0) {\n                    ssh_set_error_invalid(session);\n                    return -1;\n                }\n\n                session->common.log_verbosity = i & 0xffffU;\n                ssh_set_log_level(i & 0xffffU);\n            }\n            break;\n        case SSH_OPTIONS_CIPHERS_C_S:\n            v = value;\n            if (v == NULL || v[0] == '\\0') {\n                ssh_set_error_invalid(session);\n                return -1;\n            } else {\n                if (ssh_options_set_algo(session, SSH_CRYPT_C_S, v) < 0)\n                    return -1;\n            }\n            break;\n        case SSH_OPTIONS_CIPHERS_S_C:\n            v = value;\n            if (v == NULL || v[0] == '\\0') {\n                ssh_set_error_invalid(session);\n                return -1;\n            } else {\n                if (ssh_options_set_algo(session, SSH_CRYPT_S_C, v) < 0)\n                    return -1;\n            }\n            break;\n        case SSH_OPTIONS_KEY_EXCHANGE:\n            v = value;\n            if (v == NULL || v[0] == '\\0') {\n                ssh_set_error_invalid(session);\n                return -1;\n            } else {\n                if (ssh_options_set_algo(session, SSH_KEX, v) < 0)\n                    return -1;\n            }\n            break;\n        case SSH_OPTIONS_HOSTKEYS:\n            v = value;\n            if (v == NULL || v[0] == '\\0') {\n                ssh_set_error_invalid(session);\n                return -1;\n            } else {\n                if (ssh_options_set_algo(session, SSH_HOSTKEYS, v) < 0)\n                    return -1;\n            }\n            break;\n        case SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES:\n            v = value;\n            if (v == NULL || v[0] == '\\0') {\n                ssh_set_error_invalid(session);\n                return -1;\n            } else {\n                if (ssh_fips_mode()) {\n                    p = ssh_keep_fips_algos(SSH_HOSTKEYS, v);\n                } else {\n                    p = ssh_keep_known_algos(SSH_HOSTKEYS, v);\n                }\n                if (p == NULL) {\n                    ssh_set_error(session, SSH_REQUEST_DENIED,\n                        \"Setting method: no known public key algorithm (%s)\",\n                         v);\n                    return -1;\n                }\n\n                SAFE_FREE(session->opts.pubkey_accepted_types);\n                session->opts.pubkey_accepted_types = p;\n            }\n            break;\n        case SSH_OPTIONS_HMAC_C_S:\n            v = value;\n            if (v == NULL || v[0] == '\\0') {\n                ssh_set_error_invalid(session);\n                return -1;\n            } else {\n                if (ssh_options_set_algo(session, SSH_MAC_C_S, v) < 0)\n                    return -1;\n            }\n            break;\n         case SSH_OPTIONS_HMAC_S_C:\n            v = value;\n            if (v == NULL || v[0] == '\\0') {\n                ssh_set_error_invalid(session);\n                return -1;\n            } else {\n                if (ssh_options_set_algo(session, SSH_MAC_S_C, v) < 0)\n                    return -1;\n            }\n            break;\n        case SSH_OPTIONS_COMPRESSION_C_S:\n            v = value;\n            if (v == NULL || v[0] == '\\0') {\n                ssh_set_error_invalid(session);\n                return -1;\n            } else {\n                if (strcasecmp(value,\"yes\")==0){\n                    if(ssh_options_set_algo(session,SSH_COMP_C_S,\"zlib@openssh.com,zlib\") < 0)\n                        return -1;\n                } else if (strcasecmp(value,\"no\")==0){\n                    if(ssh_options_set_algo(session,SSH_COMP_C_S,\"none\") < 0)\n                        return -1;\n                } else {\n                    if (ssh_options_set_algo(session, SSH_COMP_C_S, v) < 0)\n                        return -1;\n                }\n            }\n            break;\n        case SSH_OPTIONS_COMPRESSION_S_C:\n            v = value;\n            if (v == NULL || v[0] == '\\0') {\n                ssh_set_error_invalid(session);\n                return -1;\n            } else {\n                if (strcasecmp(value,\"yes\")==0){\n                    if(ssh_options_set_algo(session,SSH_COMP_S_C,\"zlib@openssh.com,zlib\") < 0)\n                        return -1;\n                } else if (strcasecmp(value,\"no\")==0){\n                    if(ssh_options_set_algo(session,SSH_COMP_S_C,\"none\") < 0)\n                        return -1;\n                } else {\n                    if (ssh_options_set_algo(session, SSH_COMP_S_C, v) < 0)\n                        return -1;\n                }\n            }\n            break;\n        case SSH_OPTIONS_COMPRESSION:\n            v = value;\n            if (v == NULL || v[0] == '\\0') {\n                ssh_set_error_invalid(session);\n                return -1;\n            }\n            if(ssh_options_set(session,SSH_OPTIONS_COMPRESSION_C_S, v) < 0)\n                return -1;\n            if(ssh_options_set(session,SSH_OPTIONS_COMPRESSION_S_C, v) < 0)\n                return -1;\n            break;\n        case SSH_OPTIONS_COMPRESSION_LEVEL:\n            if (value == NULL) {\n                ssh_set_error_invalid(session);\n                return -1;\n            } else {\n                int *x = (int *)value;\n                if (*x < 1 || *x > 9) {\n                    ssh_set_error_invalid(session);\n                    return -1;\n                }\n                session->opts.compressionlevel = *x & 0xff;\n            }\n            break;\n        case SSH_OPTIONS_STRICTHOSTKEYCHECK:\n            if (value == NULL) {\n                ssh_set_error_invalid(session);\n                return -1;\n            } else {\n                int *x = (int *) value;\n\n                session->opts.StrictHostKeyChecking = (*x & 0xff) > 0 ? 1 : 0;\n            }\n            session->opts.StrictHostKeyChecking = *(int*)value;\n            break;\n        case SSH_OPTIONS_PROXYCOMMAND:\n            v = value;\n            if (v == NULL || v[0] == '\\0') {\n                ssh_set_error_invalid(session);\n                return -1;\n            } else {\n                SAFE_FREE(session->opts.ProxyCommand);\n                /* Setting the command to 'none' disables this option. */\n                rc = strcasecmp(v, \"none\");\n                if (rc != 0) {\n                    q = strdup(v);\n                    if (q == NULL) {\n                        return -1;\n                    }\n                    session->opts.ProxyCommand = q;\n                }\n            }\n            break;\n        case SSH_OPTIONS_GSSAPI_SERVER_IDENTITY:\n            v = value;\n            if (v == NULL || v[0] == '\\0') {\n                ssh_set_error_invalid(session);\n                return -1;\n            } else {\n                SAFE_FREE(session->opts.gss_server_identity);\n                session->opts.gss_server_identity = strdup(v);\n                if (session->opts.gss_server_identity == NULL) {\n                    ssh_set_error_oom(session);\n                    return -1;\n                }\n            }\n            break;\n        case SSH_OPTIONS_GSSAPI_CLIENT_IDENTITY:\n            v = value;\n            if (v == NULL || v[0] == '\\0') {\n                ssh_set_error_invalid(session);\n                return -1;\n            } else {\n                SAFE_FREE(session->opts.gss_client_identity);\n                session->opts.gss_client_identity = strdup(v);\n                if (session->opts.gss_client_identity == NULL) {\n                    ssh_set_error_oom(session);\n                    return -1;\n                }\n            }\n            break;\n        case SSH_OPTIONS_GSSAPI_DELEGATE_CREDENTIALS:\n            if (value == NULL) {\n                ssh_set_error_invalid(session);\n                return -1;\n            } else {\n                int x = *(int *)value;\n\n                session->opts.gss_delegate_creds = (x & 0xff);\n            }\n            break;\n        case SSH_OPTIONS_PASSWORD_AUTH:\n        case SSH_OPTIONS_PUBKEY_AUTH:\n        case SSH_OPTIONS_KBDINT_AUTH:\n        case SSH_OPTIONS_GSSAPI_AUTH:\n            if (value == NULL) {\n                ssh_set_error_invalid(session);\n                return -1;\n            } else {\n                int x = *(int *)value;\n                u = type == SSH_OPTIONS_PASSWORD_AUTH ?\n                    SSH_OPT_FLAG_PASSWORD_AUTH:\n                    type == SSH_OPTIONS_PUBKEY_AUTH ?\n                        SSH_OPT_FLAG_PUBKEY_AUTH:\n                        type == SSH_OPTIONS_KBDINT_AUTH ?\n                            SSH_OPT_FLAG_KBDINT_AUTH:\n                            SSH_OPT_FLAG_GSSAPI_AUTH;\n                if (x != 0){\n                    session->opts.flags |= u;\n                } else {\n                    session->opts.flags &= ~u;\n                }\n            }\n            break;\n        case SSH_OPTIONS_NODELAY:\n            if (value == NULL) {\n                ssh_set_error_invalid(session);\n                return -1;\n            } else {\n                int *x = (int *) value;\n                session->opts.nodelay = (*x & 0xff) > 0 ? 1 : 0;\n            }\n            break;\n        case SSH_OPTIONS_PROCESS_CONFIG:\n            if (value == NULL) {\n                ssh_set_error_invalid(session);\n                return -1;\n            } else {\n                bool *x = (bool *)value;\n                session->opts.config_processed = !(*x);\n            }\n            break;\n        case SSH_OPTIONS_REKEY_DATA:\n            if (value == NULL) {\n                ssh_set_error_invalid(session);\n                return -1;\n            } else {\n                uint64_t *x = (uint64_t *)value;\n                session->opts.rekey_data = *x;\n            }\n            break;\n        case SSH_OPTIONS_REKEY_TIME:\n            if (value == NULL) {\n                ssh_set_error_invalid(session);\n                return -1;\n            } else {\n                uint32_t *x = (uint32_t *)value;\n                if ((*x * 1000) < *x) {\n                    ssh_set_error(session, SSH_REQUEST_DENIED,\n                                  \"The provided value (%\" PRIu32 \") for rekey\"\n                                  \" time is too large\", *x);\n                    return -1;\n                }\n                session->opts.rekey_time = (*x) * 1000;\n            }\n            break;\n        case SSH_OPTIONS_EXTERNAL_CALLBACKS:\n            if (value == NULL) {\n                session->socket_external_callbacks.send = NULL;\n                session->socket_external_callbacks.userdata = NULL;\n            } else {\n                ssh_socket_external_callbacks external_callbacks = (ssh_socket_external_callbacks) value;\n                session->socket_external_callbacks.send = external_callbacks->send;\n                session->socket_external_callbacks.userdata = external_callbacks->userdata;\n            }\n            break;\n        default:\n            ssh_set_error(session, SSH_REQUEST_DENIED, \"Unknown ssh option %d\", type);\n            return -1;\n            break;\n    }\n\n    return 0;\n}\n\n/**\n * @brief This function can get ssh the ssh port. It must only be used on\n *        a valid ssh session. This function is useful when the session\n *        options have been automatically inferred from the environment\n *        or configuration files and one\n *\n * @param  session An allocated SSH session structure.\n *\n * @param  port_target An unsigned integer into which the\n *         port will be set from the ssh session.\n *\n * @return       0 on success, < 0 on error.\n *\n */\nint ssh_options_get_port(ssh_session session, unsigned int* port_target) {\n    if (session == NULL) {\n        return -1;\n    }\n\n    if (session->opts.port == 0) {\n        *port_target = 22;\n        return 0;\n    }\n\n    *port_target = session->opts.port;\n\n    return 0;\n}\n\n/**\n * @brief This function can get ssh options, it does not support all options provided for\n *        ssh options set, but mostly those which a user-space program may care about having\n *        trusted the ssh driver to infer these values from underlaying configuration files.\n *        It operates only on those SSH_OPTIONS_* which return char*. If you wish to receive\n *        the port then please use ssh_options_get_port() which returns an unsigned int.\n *\n * @param  session An allocated SSH session structure.\n *\n * @param  type The option type to get. This could be one of the\n *              following:\n *\n *              - SSH_OPTIONS_HOST:\n *                The hostname or ip address to connect to (const char *).\n *\n *              - SSH_OPTIONS_USER:\n *                The username for authentication (const char *).\\n\n *                \\n when not explicitly set this will be inferred from the\n *                ~/.ssh/config file.\n *\n *              - SSH_OPTIONS_IDENTITY:\n *                Get the first identity file name (const char *).\\n\n *                \\n\n *                By default identity, id_dsa and id_rsa are checked.\n *\n *              - SSH_OPTIONS_PROXYCOMMAND:\n *                Get the proxycommand necessary to log into the\n *                remote host. When not explicitly set, it will be read\n *                from the ~/.ssh/config file.\n *\n *              - SSH_OPTIONS_GLOBAL_KNOWNHOSTS:\n *                Get the path to the global known_hosts file being used.\n *\n *              - SSH_OPTIONS_KNOWNHOSTS:\n *                Get the path to the known_hosts file being used.\n *\n * @param  value The value to get into. As a char**, space will be\n *               allocated by the function for the value, it is\n *               your responsibility to free the memory using\n *               ssh_string_free_char().\n *\n * @return       SSH_OK on success, SSH_ERROR on error.\n */\nint ssh_options_get(ssh_session session, enum ssh_options_e type, char** value)\n{\n    char* src = NULL;\n\n    if (session == NULL) {\n        return SSH_ERROR;\n    }\n\n    if (value == NULL) {\n        ssh_set_error_invalid(session);\n        return SSH_ERROR;\n    }\n\n    switch(type)\n    {\n        case SSH_OPTIONS_HOST: {\n            src = session->opts.host;\n            break;\n        }\n        case SSH_OPTIONS_USER: {\n            src = session->opts.username;\n            break;\n        }\n        case SSH_OPTIONS_IDENTITY: {\n            struct ssh_iterator *it = ssh_list_get_iterator(session->opts.identity);\n            if (it == NULL) {\n                return SSH_ERROR;\n            }\n            src = ssh_iterator_value(char *, it);\n            break;\n        }\n        case SSH_OPTIONS_PROXYCOMMAND: {\n            src = session->opts.ProxyCommand;\n            break;\n        }\n        case SSH_OPTIONS_KNOWNHOSTS: {\n            src = session->opts.knownhosts;\n            break;\n        }\n        case SSH_OPTIONS_GLOBAL_KNOWNHOSTS: {\n            src = session->opts.global_knownhosts;\n            break;\n        }\n        default:\n            ssh_set_error(session, SSH_REQUEST_DENIED, \"Unknown ssh option %d\", type);\n            return SSH_ERROR;\n        break;\n    }\n    if (src == NULL) {\n        return SSH_ERROR;\n    }\n    *value = strdup(src);\n    if (*value == NULL) {\n        ssh_set_error_oom(session);\n        return SSH_ERROR;\n    }\n    return SSH_OK;\n}\n\n/**\n * @brief Parse command line arguments.\n *\n * This is a helper for your application to generate the appropriate\n * options from the command line arguments.\\n\n * The argv array and argc value are changed so that the parsed\n * arguments wont appear anymore in them.\\n\n * The single arguments (without switches) are not parsed. thus,\n * myssh -l user localhost\\n\n * The command wont set the hostname value of options to localhost.\n *\n * @param session       The session to configure.\n *\n * @param argcptr       The pointer to the argument count.\n *\n * @param argv          The arguments list pointer.\n *\n * @returns 0 on success, < 0 on error.\n *\n * @see ssh_session_new()\n */\nint ssh_options_getopt(ssh_session session, int *argcptr, char **argv)\n{\n#ifdef _MSC_VER\n    (void)session;\n    (void)argcptr;\n    (void)argv;\n    /* Not supported with a Microsoft compiler */\n    return -1;\n#else\n    char *user = NULL;\n    char *cipher = NULL;\n    char *identity = NULL;\n    char *port = NULL;\n    char **save = NULL;\n    char **tmp = NULL;\n    size_t i = 0;\n    int argc = *argcptr;\n    int debuglevel = 0;\n    int usersa = 0;\n    int usedss = 0;\n    int compress = 0;\n    int cont = 1;\n    size_t current = 0;\n    int saveoptind = optind; /* need to save 'em */\n    int saveopterr = opterr;\n    int opt;\n\n    opterr = 0; /* shut up getopt */\n    while((opt = getopt(argc, argv, \"c:i:Cl:p:vb:rd12\")) != -1) {\n        switch(opt) {\n        case 'l':\n            user = optarg;\n            break;\n        case 'p':\n            port = optarg;\n            break;\n        case 'v':\n            debuglevel++;\n            break;\n        case 'r':\n            usersa++;\n            break;\n        case 'd':\n            usedss++;\n            break;\n        case 'c':\n            cipher = optarg;\n            break;\n        case 'i':\n            identity = optarg;\n            break;\n        case 'C':\n            compress++;\n            break;\n        case '2':\n            break;\n        case '1':\n            break;\n        default:\n            {\n                char optv[3] = \"- \";\n                optv[1] = optopt;\n                tmp = realloc(save, (current + 1) * sizeof(char*));\n                if (tmp == NULL) {\n                    SAFE_FREE(save);\n                    ssh_set_error_oom(session);\n                    return -1;\n                }\n                save = tmp;\n                save[current] = strdup(optv);\n                if (save[current] == NULL) {\n                    SAFE_FREE(save);\n                    ssh_set_error_oom(session);\n                    return -1;\n                }\n                current++;\n                if (optarg) {\n                    save[current++] = argv[optind + 1];\n                }\n            }\n        } /* switch */\n    } /* while */\n    opterr = saveopterr;\n    tmp = realloc(save, (current + (argc - optind)) * sizeof(char*));\n    if (tmp == NULL) {\n        SAFE_FREE(save);\n        ssh_set_error_oom(session);\n        return -1;\n    }\n    save = tmp;\n    while (optind < argc) {\n        tmp = realloc(save, (current + 1) * sizeof(char*));\n        if (tmp == NULL) {\n            SAFE_FREE(save);\n            ssh_set_error_oom(session);\n            return -1;\n        }\n        save = tmp;\n        save[current] = argv[optind];\n        current++;\n        optind++;\n    }\n\n    if (usersa && usedss) {\n        ssh_set_error(session, SSH_FATAL, \"Either RSA or DSS must be chosen\");\n        cont = 0;\n    }\n\n    ssh_set_log_level(debuglevel);\n\n    optind = saveoptind;\n\n    if(!cont) {\n        SAFE_FREE(save);\n        return -1;\n    }\n\n    /* first recopy the save vector into the original's */\n    for (i = 0; i < current; i++) {\n        /* don't erase argv[0] */\n        argv[ i + 1] = save[i];\n    }\n    argv[current + 1] = NULL;\n    *argcptr = current + 1;\n    SAFE_FREE(save);\n\n    /* set a new option struct */\n    if (compress) {\n        if (ssh_options_set(session, SSH_OPTIONS_COMPRESSION, \"yes\") < 0) {\n            cont = 0;\n        }\n    }\n\n    if (cont && cipher) {\n        if (ssh_options_set(session, SSH_OPTIONS_CIPHERS_C_S, cipher) < 0) {\n            cont = 0;\n        }\n        if (cont && ssh_options_set(session, SSH_OPTIONS_CIPHERS_S_C, cipher) < 0) {\n            cont = 0;\n        }\n    }\n\n    if (cont && user) {\n        if (ssh_options_set(session, SSH_OPTIONS_USER, user) < 0) {\n            cont = 0;\n        }\n    }\n\n    if (cont && identity) {\n        if (ssh_options_set(session, SSH_OPTIONS_IDENTITY, identity) < 0) {\n            cont = 0;\n        }\n    }\n\n    if (port != NULL) {\n        ssh_options_set(session, SSH_OPTIONS_PORT_STR, port);\n    }\n\n    if (!cont) {\n        return SSH_ERROR;\n    }\n\n    return SSH_OK;\n#endif\n}\n\n/**\n * @brief Parse the ssh config file.\n *\n * This should be the last call of all options, it may overwrite options which\n * are already set. It requires that the host name is already set with\n * ssh_options_set_host().\n *\n * @param  session      SSH session handle\n *\n * @param  filename     The options file to use, if NULL the default\n *                      ~/.ssh/config will be used.\n *\n * @return 0 on success, < 0 on error.\n *\n * @see ssh_options_set_host()\n */\nint ssh_options_parse_config(ssh_session session, const char *filename) {\n  char *expanded_filename;\n  int r;\n\n  if (session == NULL) {\n    return -1;\n  }\n  if (session->opts.host == NULL) {\n    ssh_set_error_invalid(session);\n    return -1;\n  }\n\n  if (session->opts.sshdir == NULL) {\n      r = ssh_options_set(session, SSH_OPTIONS_SSH_DIR, NULL);\n      if (r < 0) {\n          ssh_set_error_oom(session);\n          return -1;\n      }\n  }\n\n  /* set default filename */\n  if (filename == NULL) {\n    expanded_filename = ssh_path_expand_escape(session, \"%d/config\");\n  } else {\n    expanded_filename = ssh_path_expand_escape(session, filename);\n  }\n  if (expanded_filename == NULL) {\n    return -1;\n  }\n\n  r = ssh_config_parse_file(session, expanded_filename);\n  if (r < 0) {\n      goto out;\n  }\n  if (filename == NULL) {\n      r = ssh_config_parse_file(session, GLOBAL_CLIENT_CONFIG);\n  }\n\n  /* Do not process the default configuration as part of connection again */\n  session->opts.config_processed = true;\nout:\n  free(expanded_filename);\n  return r;\n}\n\nint ssh_options_apply(ssh_session session) {\n    struct ssh_iterator *it;\n    char *tmp;\n    int rc;\n\n    if (session->opts.sshdir == NULL) {\n        rc = ssh_options_set(session, SSH_OPTIONS_SSH_DIR, NULL);\n        if (rc < 0) {\n            return -1;\n        }\n    }\n\n    if (session->opts.username == NULL) {\n        rc = ssh_options_set(session, SSH_OPTIONS_USER, NULL);\n        if (rc < 0) {\n            return -1;\n        }\n    }\n\n    if (session->opts.knownhosts == NULL) {\n        tmp = ssh_path_expand_escape(session, \"%d/known_hosts\");\n    } else {\n        tmp = ssh_path_expand_escape(session, session->opts.knownhosts);\n    }\n    if (tmp == NULL) {\n        return -1;\n    }\n    free(session->opts.knownhosts);\n    session->opts.knownhosts = tmp;\n\n    if (session->opts.global_knownhosts == NULL) {\n        tmp = strdup(\"/etc/ssh/ssh_known_hosts\");\n    } else {\n        tmp = ssh_path_expand_escape(session, session->opts.global_knownhosts);\n    }\n    if (tmp == NULL) {\n        return -1;\n    }\n    free(session->opts.global_knownhosts);\n    session->opts.global_knownhosts = tmp;\n\n    if (session->opts.ProxyCommand != NULL) {\n        tmp = ssh_path_expand_escape(session, session->opts.ProxyCommand);\n        if (tmp == NULL) {\n            return -1;\n        }\n        free(session->opts.ProxyCommand);\n        session->opts.ProxyCommand = tmp;\n    }\n\n    for (it = ssh_list_get_iterator(session->opts.identity);\n         it != NULL;\n         it = it->next) {\n        char *id = (char *) it->data;\n        if (strncmp(id, \"pkcs11:\", 6) == 0) {\n            /* PKCS#11 URIs are using percent-encoding so we can not mix\n             * it with ssh expansion of ssh escape characters.\n             * Skip these identities now, before we will have PKCS#11 support\n             */\n             continue;\n        }\n        tmp = ssh_path_expand_escape(session, id);\n        if (tmp == NULL) {\n            return -1;\n        }\n        free(id);\n        it->data = tmp;\n    }\n\n    return 0;\n}\n\n/** @} */\n\n#ifdef WITH_SERVER\n/**\n * @addtogroup libssh_server\n * @{\n */\nstatic int ssh_bind_set_key(ssh_bind sshbind, char **key_loc,\n                            const void *value) {\n    if (value == NULL) {\n        ssh_set_error_invalid(sshbind);\n        return -1;\n    } else {\n        SAFE_FREE(*key_loc);\n        *key_loc = strdup(value);\n        if (*key_loc == NULL) {\n            ssh_set_error_oom(sshbind);\n            return -1;\n        }\n    }\n    return 0;\n}\n\nstatic int ssh_bind_set_algo(ssh_bind sshbind,\n                             enum ssh_kex_types_e algo,\n                             const char *list)\n{\n    char *p = NULL;\n\n    if (ssh_fips_mode()) {\n        p = ssh_keep_fips_algos(algo, list);\n    } else {\n        p = ssh_keep_known_algos(algo, list);\n    }\n    if (p == NULL) {\n        ssh_set_error(sshbind, SSH_REQUEST_DENIED,\n                      \"Setting method: no algorithm for method \\\"%s\\\" (%s)\",\n                      ssh_kex_get_description(algo), list);\n        return -1;\n    }\n\n    SAFE_FREE(sshbind->wanted_methods[algo]);\n    sshbind->wanted_methods[algo] = p;\n\n    return 0;\n}\n\n/**\n * @brief Set options for an SSH server bind.\n *\n * @param  sshbind      The ssh server bind to configure.\n *\n * @param  type         The option type to set. This should be one of the\n *                      following:\n *\n *                      - SSH_BIND_OPTIONS_HOSTKEY:\n *                        Set the path to an ssh host key, regardless\n *                        of type.  Only one key from per key type\n *                        (RSA, DSA, ECDSA) is allowed in an ssh_bind\n *                        at a time, and later calls to this function\n *                        with this option for the same key type will\n *                        override prior calls (const char *).\n *\n *                      - SSH_BIND_OPTIONS_BINDADDR:\n *                        Set the IP address to bind (const char *).\n *\n *                      - SSH_BIND_OPTIONS_BINDPORT:\n *                        Set the port to bind (unsigned int *).\n *\n *                      - SSH_BIND_OPTIONS_BINDPORT_STR:\n *                        Set the port to bind (const char *).\n *\n *                      - SSH_BIND_OPTIONS_LOG_VERBOSITY:\n *                        Set the session logging verbosity (int *).\n *                        The logging verbosity should have one of the\n *                        following values, which are listed in order\n *                        of increasing verbosity.  Every log message\n *                        with verbosity less than or equal to the\n *                        logging verbosity will be shown.\n *                        - SSH_LOG_NOLOG: No logging\n *                        - SSH_LOG_WARNING: Only warnings\n *                        - SSH_LOG_PROTOCOL: High level protocol information\n *                        - SSH_LOG_PACKET: Lower level protocol infomations, packet level\n *                        - SSH_LOG_FUNCTIONS: Every function path\n *\n *                      - SSH_BIND_OPTIONS_LOG_VERBOSITY_STR:\n *                        Set the session logging verbosity via a\n *                        string that will be converted to a numerical\n *                        value (e.g. \"3\") and interpreted according\n *                        to the values of\n *                        SSH_BIND_OPTIONS_LOG_VERBOSITY above (const\n *                        char *).\n *\n *                      - SSH_BIND_OPTIONS_DSAKEY:\n *                        Set the path to the ssh host dsa key, SSHv2\n *                        only (const char *).\n *\n *                      - SSH_BIND_OPTIONS_RSAKEY:\n *                        Set the path to the ssh host rsa key, SSHv2\n *                        only (const char *).\n *\n *                      - SSH_BIND_OPTIONS_ECDSAKEY:\n *                        Set the path to the ssh host ecdsa key,\n *                        SSHv2 only (const char *).\n *\n *                      - SSH_BIND_OPTIONS_BANNER:\n *                        Set the server banner sent to clients (const char *).\n *\n *                      - SSH_BIND_OPTIONS_IMPORT_KEY:\n *                        Set the Private Key for the server directly (ssh_key)\n *\n *                      - SSH_BIND_OPTIONS_CIPHERS_C_S:\n *                        Set the symmetric cipher client to server (const char *,\n *                        comma-separated list).\n *\n *                      - SSH_BIND_OPTIONS_CIPHERS_S_C:\n *                        Set the symmetric cipher server to client (const char *,\n *                        comma-separated list).\n *\n *                      - SSH_BIND_OPTIONS_KEY_EXCHANGE:\n *                        Set the key exchange method to be used (const char *,\n *                        comma-separated list). ex:\n *                        \"ecdh-sha2-nistp256,diffie-hellman-group14-sha1\"\n *\n *                      - SSH_BIND_OPTIONS_HMAC_C_S:\n *                        Set the Message Authentication Code algorithm client\n *                        to server (const char *, comma-separated list).\n *\n *                      - SSH_BIND_OPTIONS_HMAC_S_C:\n *                        Set the Message Authentication Code algorithm server\n *                        to client (const char *, comma-separated list).\n *\n *                      - SSH_BIND_OPTIONS_CONFIG_DIR:\n *                        Set the directory (const char *, format string)\n *                        to be used when the \"%d\" scape is used when providing\n *                        paths of configuration files to\n *                        ssh_bind_options_parse_config().\n *\n *                      - SSH_BIND_OPTIONS_PROCESS_CONFIG\n *                        Set it to false to disable automatic processing of\n *                        system-wide configuration files. LibSSH automatically\n *                        uses these configuration files otherwise. This\n *                        option will only have effect if set before any call\n *                        to ssh_bind_options_parse_config() (bool).\n *\n *                      - SSH_BIND_OPTIONS_PUBKEY_ACCEPTED_KEY_TYPES:\n *                        Set the public key algorithm accepted by the server\n *                        (const char *, comma-separated list).\n *\n *                      - SSH_BIND_OPTIONS_HOSTKEY_ALGORITHMS:\n *                        Set the list of allowed hostkey signatures algorithms\n *                        to offer to the client, ordered by preference. This\n *                        list is used as a filter when creating the list of\n *                        algorithms to offer to the client: first the list of\n *                        possible algorithms is created from the list of keys\n *                        set and then filtered against this list.\n *                        (const char *, comma-separated list).\n *\n * @param  value        The value to set. This is a generic pointer and the\n *                      datatype which should be used is described at the\n *                      corresponding value of type above.\n *\n * @return              0 on success, < 0 on error, invalid option, or parameter.\n */\nint ssh_bind_options_set(ssh_bind sshbind, enum ssh_bind_options_e type,\n    const void *value)\n{\n  char *p, *q;\n  const char *v;\n  int i, rc;\n\n  if (sshbind == NULL) {\n    return -1;\n  }\n\n  switch (type) {\n    case SSH_BIND_OPTIONS_HOSTKEY:\n      if (value == NULL) {\n        ssh_set_error_invalid(sshbind);\n        return -1;\n      } else {\n          int key_type;\n          ssh_key key;\n          ssh_key *bind_key_loc = NULL;\n          char **bind_key_path_loc;\n\n          rc = ssh_pki_import_privkey_file(value, NULL, NULL, NULL, &key);\n          if (rc != SSH_OK) {\n              return -1;\n          }\n          key_type = ssh_key_type(key);\n          switch (key_type) {\n          case SSH_KEYTYPE_DSS:\n#ifdef HAVE_DSA\n              bind_key_loc = &sshbind->dsa;\n              bind_key_path_loc = &sshbind->dsakey;\n#else\n              ssh_set_error(sshbind,\n                      SSH_FATAL,\n                      \"DSS key used and libssh compiled \"\n                      \"without DSA support\");\n#endif\n              break;\n          case SSH_KEYTYPE_ECDSA_P256:\n          case SSH_KEYTYPE_ECDSA_P384:\n          case SSH_KEYTYPE_ECDSA_P521:\n#ifdef HAVE_ECC\n              bind_key_loc = &sshbind->ecdsa;\n              bind_key_path_loc = &sshbind->ecdsakey;\n#else\n              ssh_set_error(sshbind,\n                            SSH_FATAL,\n                            \"ECDSA key used and libssh compiled \"\n                            \"without ECDSA support\");\n#endif\n              break;\n          case SSH_KEYTYPE_RSA:\n              bind_key_loc = &sshbind->rsa;\n              bind_key_path_loc = &sshbind->rsakey;\n              break;\n          case SSH_KEYTYPE_ED25519:\n\t\t  bind_key_loc = &sshbind->ed25519;\n\t\t  bind_key_path_loc = &sshbind->ed25519key;\n\t\t  break;\n          default:\n              ssh_set_error(sshbind,\n                            SSH_FATAL,\n                            \"Unsupported key type %d\", key_type);\n          }\n\n          if (bind_key_loc == NULL) {\n              ssh_key_free(key);\n              return -1;\n          }\n\n          /* Set the location of the key on disk even though we don't\n             need it in case some other function wants it */\n          rc = ssh_bind_set_key(sshbind, bind_key_path_loc, value);\n          if (rc < 0) {\n              ssh_key_free(key);\n              return -1;\n          }\n          ssh_key_free(*bind_key_loc);\n          *bind_key_loc = key;\n      }\n      break;\n    case SSH_BIND_OPTIONS_IMPORT_KEY:\n        if (value == NULL) {\n            ssh_set_error_invalid(sshbind);\n            return -1;\n        } else {\n            int key_type;\n            ssh_key *bind_key_loc = NULL;\n            ssh_key key = (ssh_key)value;\n\n            key_type = ssh_key_type(key);\n            switch (key_type) {\n                case SSH_KEYTYPE_DSS:\n#ifdef HAVE_DSA\n                    bind_key_loc = &sshbind->dsa;\n#else\n                    ssh_set_error(sshbind,\n                                  SSH_FATAL,\n                                  \"DSA key used and libssh compiled \"\n                                  \"without DSA support\");\n#endif\n                    break;\n                case SSH_KEYTYPE_ECDSA_P256:\n                case SSH_KEYTYPE_ECDSA_P384:\n                case SSH_KEYTYPE_ECDSA_P521:\n#ifdef HAVE_ECC\n                    bind_key_loc = &sshbind->ecdsa;\n#else\n                    ssh_set_error(sshbind,\n                                  SSH_FATAL,\n                                  \"ECDSA key used and libssh compiled \"\n                                  \"without ECDSA support\");\n#endif\n                    break;\n                case SSH_KEYTYPE_RSA:\n                    bind_key_loc = &sshbind->rsa;\n                    break;\n                case SSH_KEYTYPE_ED25519:\n                    bind_key_loc = &sshbind->ed25519;\n                    break;\n                default:\n                    ssh_set_error(sshbind,\n                                  SSH_FATAL,\n                                  \"Unsupported key type %d\", key_type);\n            }\n            if (bind_key_loc == NULL)\n                return -1;\n            ssh_key_free(*bind_key_loc);\n            *bind_key_loc = key;\n        }\n        break;\n    case SSH_BIND_OPTIONS_BINDADDR:\n      if (value == NULL) {\n        ssh_set_error_invalid(sshbind);\n        return -1;\n      } else {\n        SAFE_FREE(sshbind->bindaddr);\n        sshbind->bindaddr = strdup(value);\n        if (sshbind->bindaddr == NULL) {\n          ssh_set_error_oom(sshbind);\n          return -1;\n        }\n      }\n      break;\n    case SSH_BIND_OPTIONS_BINDPORT:\n      if (value == NULL) {\n        ssh_set_error_invalid(sshbind);\n        return -1;\n      } else {\n        int *x = (int *) value;\n        sshbind->bindport = *x & 0xffffU;\n      }\n      break;\n    case SSH_BIND_OPTIONS_BINDPORT_STR:\n      if (value == NULL) {\n        sshbind->bindport = 22 & 0xffffU;\n      } else {\n        q = strdup(value);\n        if (q == NULL) {\n          ssh_set_error_oom(sshbind);\n          return -1;\n        }\n        i = strtol(q, &p, 10);\n        if (q == p) {\n          SAFE_FREE(q);\n        }\n        SAFE_FREE(q);\n\n        sshbind->bindport = i & 0xffffU;\n      }\n      break;\n    case SSH_BIND_OPTIONS_LOG_VERBOSITY:\n      if (value == NULL) {\n        ssh_set_error_invalid(sshbind);\n        return -1;\n      } else {\n        int *x = (int *) value;\n        ssh_set_log_level(*x & 0xffffU);\n      }\n      break;\n    case SSH_BIND_OPTIONS_LOG_VERBOSITY_STR:\n      if (value == NULL) {\n      \tssh_set_log_level(0);\n      } else {\n        q = strdup(value);\n        if (q == NULL) {\n          ssh_set_error_oom(sshbind);\n          return -1;\n        }\n        i = strtol(q, &p, 10);\n        if (q == p) {\n          SAFE_FREE(q);\n        }\n        SAFE_FREE(q);\n\n        ssh_set_log_level(i & 0xffffU);\n      }\n      break;\n    case SSH_BIND_OPTIONS_DSAKEY:\n        rc = ssh_bind_set_key(sshbind, &sshbind->dsakey, value);\n        if (rc < 0) {\n            return -1;\n        }\n        break;\n    case SSH_BIND_OPTIONS_RSAKEY:\n        rc = ssh_bind_set_key(sshbind, &sshbind->rsakey, value);\n        if (rc < 0) {\n            return -1;\n        }\n        break;\n    case SSH_BIND_OPTIONS_ECDSAKEY:\n        rc = ssh_bind_set_key(sshbind, &sshbind->ecdsakey, value);\n        if (rc < 0) {\n            return -1;\n        }\n        break;\n    case SSH_BIND_OPTIONS_BANNER:\n      if (value == NULL) {\n        ssh_set_error_invalid(sshbind);\n        return -1;\n      } else {\n        SAFE_FREE(sshbind->banner);\n        sshbind->banner = strdup(value);\n        if (sshbind->banner == NULL) {\n          ssh_set_error_oom(sshbind);\n          return -1;\n        }\n      }\n      break;\n    case SSH_BIND_OPTIONS_CIPHERS_C_S:\n        v = value;\n        if (v == NULL || v[0] == '\\0') {\n            ssh_set_error_invalid(sshbind);\n            return -1;\n        } else {\n            if (ssh_bind_set_algo(sshbind, SSH_CRYPT_C_S, v) < 0)\n                return -1;\n        }\n        break;\n    case SSH_BIND_OPTIONS_CIPHERS_S_C:\n        v = value;\n        if (v == NULL || v[0] == '\\0') {\n            ssh_set_error_invalid(sshbind);\n            return -1;\n        } else {\n            if (ssh_bind_set_algo(sshbind, SSH_CRYPT_S_C, v) < 0)\n                return -1;\n        }\n        break;\n    case SSH_BIND_OPTIONS_KEY_EXCHANGE:\n        v = value;\n        if (v == NULL || v[0] == '\\0') {\n            ssh_set_error_invalid(sshbind);\n            return -1;\n        } else {\n            rc = ssh_bind_set_algo(sshbind, SSH_KEX, v);\n            if (rc < 0) {\n                return -1;\n            }\n        }\n        break;\n    case SSH_BIND_OPTIONS_HMAC_C_S:\n        v = value;\n        if (v == NULL || v[0] == '\\0') {\n            ssh_set_error_invalid(sshbind);\n            return -1;\n        } else {\n            if (ssh_bind_set_algo(sshbind, SSH_MAC_C_S, v) < 0)\n                return -1;\n        }\n        break;\n     case SSH_BIND_OPTIONS_HMAC_S_C:\n        v = value;\n        if (v == NULL || v[0] == '\\0') {\n            ssh_set_error_invalid(sshbind);\n            return -1;\n        } else {\n            if (ssh_bind_set_algo(sshbind, SSH_MAC_S_C, v) < 0)\n                return -1;\n        }\n        break;\n    case SSH_BIND_OPTIONS_CONFIG_DIR:\n        v = value;\n        SAFE_FREE(sshbind->config_dir);\n        if (v == NULL) {\n            break;\n        } else if (v[0] == '\\0') {\n            ssh_set_error_invalid(sshbind);\n            return -1;\n        } else {\n            sshbind->config_dir = ssh_path_expand_tilde(v);\n            if (sshbind->config_dir == NULL) {\n                ssh_set_error_oom(sshbind);\n                return -1;\n            }\n        }\n        break;\n    case SSH_BIND_OPTIONS_PUBKEY_ACCEPTED_KEY_TYPES:\n        v = value;\n        if (v == NULL || v[0] == '\\0') {\n            ssh_set_error_invalid(sshbind);\n            return -1;\n        } else {\n            if (ssh_fips_mode()) {\n                p = ssh_keep_fips_algos(SSH_HOSTKEYS, v);\n            } else {\n                p = ssh_keep_known_algos(SSH_HOSTKEYS, v);\n            }\n            if (p == NULL) {\n                ssh_set_error(sshbind, SSH_REQUEST_DENIED,\n                    \"Setting method: no known public key algorithm (%s)\",\n                     v);\n                return -1;\n            }\n\n            SAFE_FREE(sshbind->pubkey_accepted_key_types);\n            sshbind->pubkey_accepted_key_types = p;\n        }\n        break;\n    case SSH_BIND_OPTIONS_HOSTKEY_ALGORITHMS:\n        v = value;\n        if (v == NULL || v[0] == '\\0') {\n            ssh_set_error_invalid(sshbind);\n            return -1;\n        } else {\n            rc = ssh_bind_set_algo(sshbind, SSH_HOSTKEYS, v);\n            if (rc < 0) {\n                return -1;\n            }\n        }\n        break;\n    case SSH_BIND_OPTIONS_PROCESS_CONFIG:\n        if (value == NULL) {\n            ssh_set_error_invalid(sshbind);\n            return -1;\n        } else {\n            bool *x = (bool *)value;\n            sshbind->config_processed = !(*x);\n        }\n        break;\n    default:\n      ssh_set_error(sshbind, SSH_REQUEST_DENIED, \"Unknown ssh option %d\", type);\n      return -1;\n    break;\n  }\n\n  return 0;\n}\n\nstatic char *ssh_bind_options_expand_escape(ssh_bind sshbind, const char *s)\n{\n    char buf[MAX_BUF_SIZE];\n    char *r, *x = NULL;\n    const char *p;\n    size_t i, l;\n\n    r = ssh_path_expand_tilde(s);\n    if (r == NULL) {\n        ssh_set_error_oom(sshbind);\n        return NULL;\n    }\n\n    if (strlen(r) > MAX_BUF_SIZE) {\n        ssh_set_error(sshbind, SSH_FATAL, \"string to expand too long\");\n        free(r);\n        return NULL;\n    }\n\n    p = r;\n    buf[0] = '\\0';\n\n    for (i = 0; *p != '\\0'; p++) {\n        if (*p != '%') {\n            buf[i] = *p;\n            i++;\n            if (i >= MAX_BUF_SIZE) {\n                free(r);\n                return NULL;\n            }\n            buf[i] = '\\0';\n            continue;\n        }\n\n        p++;\n        if (*p == '\\0') {\n            break;\n        }\n\n        switch (*p) {\n            case 'd':\n                x = strdup(sshbind->config_dir);\n                break;\n            default:\n                ssh_set_error(sshbind, SSH_FATAL,\n                        \"Wrong escape sequence detected\");\n                free(r);\n                return NULL;\n        }\n\n        if (x == NULL) {\n            ssh_set_error_oom(sshbind);\n            free(r);\n            return NULL;\n        }\n\n        i += strlen(x);\n        if (i >= MAX_BUF_SIZE) {\n            ssh_set_error(sshbind, SSH_FATAL,\n                    \"String too long\");\n            free(x);\n            free(r);\n            return NULL;\n        }\n        l = strlen(buf);\n        strncpy(buf + l, x, sizeof(buf) - l - 1);\n        buf[i] = '\\0';\n        SAFE_FREE(x);\n    }\n\n    free(r);\n    return strdup(buf);\n}\n\n/**\n * @brief Parse a ssh bind options configuration file.\n *\n * This parses the options file and set them to the ssh_bind handle provided. If\n * an option was previously set, it is overridden. If the global configuration\n * hasn't been processed yet, it is processed prior to the provided file.\n *\n * @param  sshbind      SSH bind handle\n *\n * @param  filename     The options file to use; if NULL only the global\n *                      configuration is parsed and applied (if it haven't been\n *                      processed before).\n *\n * @return 0 on success, < 0 on error.\n */\nint ssh_bind_options_parse_config(ssh_bind sshbind, const char *filename)\n{\n    int rc = 0;\n    char *expanded_filename;\n\n    if (sshbind == NULL) {\n        return -1;\n    }\n\n    /* If the global default configuration hasn't been processed yet, process it\n     * before the provided configuration. */\n    if (!(sshbind->config_processed)) {\n        rc = ssh_bind_config_parse_file(sshbind, GLOBAL_BIND_CONFIG);\n        if (rc != 0) {\n            return rc;\n        }\n        sshbind->config_processed = true;\n    }\n\n    if (filename != NULL) {\n        expanded_filename = ssh_bind_options_expand_escape(sshbind, filename);\n        if (expanded_filename == NULL) {\n            return -1;\n        }\n\n        /* Apply the user provided configuration */\n        rc = ssh_bind_config_parse_file(sshbind, expanded_filename);\n        free(expanded_filename);\n    }\n\n    return rc;\n}\n\n#endif\n\n/** @} */\n"
  },
  {
    "path": "src/libssh/src/packet.c",
    "content": "/*\n * packet.c - packet building functions\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2003-2013 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <errno.h>\n\n#ifndef _WIN32\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#endif\n\n#include \"libssh/priv.h\"\n#include \"libssh/ssh2.h\"\n#include \"libssh/crypto.h\"\n#include \"libssh/buffer.h\"\n#include \"libssh/packet.h\"\n#include \"libssh/socket.h\"\n#include \"libssh/channels.h\"\n#include \"libssh/misc.h\"\n#include \"libssh/session.h\"\n#include \"libssh/messages.h\"\n#include \"libssh/pcap.h\"\n#include \"libssh/kex.h\"\n#include \"libssh/auth.h\"\n#include \"libssh/gssapi.h\"\n#include \"libssh/bytearray.h\"\n#include \"libssh/dh.h\"\n\nstatic ssh_packet_callback default_packet_handlers[]= {\n  ssh_packet_disconnect_callback,          // SSH2_MSG_DISCONNECT                 1\n  ssh_packet_ignore_callback,              // SSH2_MSG_IGNORE\t                    2\n  ssh_packet_unimplemented,                // SSH2_MSG_UNIMPLEMENTED              3\n  ssh_packet_ignore_callback,              // SSH2_MSG_DEBUG\t                    4\n#if WITH_SERVER\n  ssh_packet_service_request,              // SSH2_MSG_SERVICE_REQUEST\t          5\n#else\n  NULL,\n#endif\n  ssh_packet_service_accept,               // SSH2_MSG_SERVICE_ACCEPT             6\n  ssh_packet_ext_info,                     // SSH2_MSG_EXT_INFO                   7\n  NULL, NULL, NULL, NULL, NULL, NULL,\n  NULL, NULL, NULL, NULL, NULL, NULL,      //                                     8-19\n  ssh_packet_kexinit,                      // SSH2_MSG_KEXINIT\t                  20\n  ssh_packet_newkeys,                      // SSH2_MSG_NEWKEYS                    21\n  NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n  NULL,                                    //                                     22-29\n#if WITH_SERVER\n  ssh_packet_kexdh_init,                   // SSH2_MSG_KEXDH_INIT                 30\n                                           // SSH2_MSG_KEX_DH_GEX_REQUEST_OLD     30\n#else\n  NULL,\n#endif\n  NULL,                                    // SSH2_MSG_KEXDH_REPLY                31\n                                           // SSH2_MSG_KEX_DH_GEX_GROUP           31\n  NULL,                                    // SSH2_MSG_KEX_DH_GEX_INIT            32\n  NULL,                                    // SSH2_MSG_KEX_DH_GEX_REPLY           33\n  NULL,                                    // SSH2_MSG_KEX_DH_GEX_REQUEST         34\n  NULL, NULL, NULL, NULL, NULL, NULL,\tNULL,\n  NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n  NULL,                                    //                                     35-49\n#if WITH_SERVER\n  ssh_packet_userauth_request,             // SSH2_MSG_USERAUTH_REQUEST           50\n#else\n  NULL,\n#endif\n  ssh_packet_userauth_failure,             // SSH2_MSG_USERAUTH_FAILURE           51\n  ssh_packet_userauth_success,             // SSH2_MSG_USERAUTH_SUCCESS           52\n  ssh_packet_userauth_banner,              // SSH2_MSG_USERAUTH_BANNER            53\n  NULL,NULL,NULL,NULL,NULL,NULL,           //                                     54-59\n  ssh_packet_userauth_pk_ok,               // SSH2_MSG_USERAUTH_PK_OK             60\n                                           // SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ  60\n                                           // SSH2_MSG_USERAUTH_INFO_REQUEST\t  60\n                                           // SSH2_MSG_USERAUTH_GSSAPI_RESPONSE   60\n  ssh_packet_userauth_info_response,       // SSH2_MSG_USERAUTH_INFO_RESPONSE     61\n                                           // SSH2_MSG_USERAUTH_GSSAPI_TOKEN      61\n  NULL,                                    //                                     62\n  NULL,                             // SSH2_MSG_USERAUTH_GSSAPI_EXCHANGE_COMPLETE 63\n  NULL,                                    // SSH2_MSG_USERAUTH_GSSAPI_ERROR      64\n  NULL,                                    // SSH2_MSG_USERAUTH_GSSAPI_ERRTOK     65\n#if defined(WITH_GSSAPI) && defined(WITH_SERVER)\n  ssh_packet_userauth_gssapi_mic,          // SSH2_MSG_USERAUTH_GSSAPI_MIC        66\n#else /* WITH_GSSAPI && WITH_SERVER */\n  NULL,\n#endif /* WITH_GSSAPI && WITH_SERVER */\n  NULL, NULL,\n  NULL, NULL, NULL, NULL, NULL, NULL, NULL,\n  NULL, NULL, NULL, NULL,                  //                                     67-79\n#ifdef WITH_SERVER\n  ssh_packet_global_request,               // SSH2_MSG_GLOBAL_REQUEST             80\n#else /* WITH_SERVER */\n  NULL,\n#endif /* WITH_SERVER */ \n  ssh_request_success,                     // SSH2_MSG_REQUEST_SUCCESS            81\n  ssh_request_denied,                      // SSH2_MSG_REQUEST_FAILURE            82\n  NULL, NULL, NULL, NULL, NULL, NULL, NULL,//                                     83-89\n  ssh_packet_channel_open,                 // SSH2_MSG_CHANNEL_OPEN               90\n  ssh_packet_channel_open_conf,            // SSH2_MSG_CHANNEL_OPEN_CONFIRMATION  91\n  ssh_packet_channel_open_fail,            // SSH2_MSG_CHANNEL_OPEN_FAILURE       92\n  channel_rcv_change_window,               // SSH2_MSG_CHANNEL_WINDOW_ADJUST      93\n  channel_rcv_data,                        // SSH2_MSG_CHANNEL_DATA               94\n  channel_rcv_data,                        // SSH2_MSG_CHANNEL_EXTENDED_DATA      95\n  channel_rcv_eof,                         // SSH2_MSG_CHANNEL_EOF\t              96\n  channel_rcv_close,                       // SSH2_MSG_CHANNEL_CLOSE              97\n  channel_rcv_request,                     // SSH2_MSG_CHANNEL_REQUEST            98\n  ssh_packet_channel_success,              // SSH2_MSG_CHANNEL_SUCCESS            99\n  ssh_packet_channel_failure,              // SSH2_MSG_CHANNEL_FAILURE            100\n};\n\n/** @internal\n * @brief check if the received packet is allowed for the current session state\n * @param session current ssh_session\n * @returns SSH_PACKET_ALLOWED if the packet is allowed; SSH_PACKET_DENIED\n * if the packet arrived in wrong state; SSH_PACKET_UNKNOWN if the packet type\n * is unknown\n */\nstatic enum ssh_packet_filter_result_e ssh_packet_incoming_filter(ssh_session session)\n{\n    enum ssh_packet_filter_result_e rc;\n\n#ifdef DEBUG_PACKET\n    SSH_LOG(SSH_LOG_PACKET, \"Filtering packet type %d\",\n            session->in_packet.type);\n#endif\n\n    switch(session->in_packet.type) {\n    case SSH2_MSG_DISCONNECT:                         // 1\n        /*\n         * States required:\n         * - None\n         *\n         * Transitions:\n         * - session->socket->state = SSH_SOCKET_CLOSED\n         * - session->session_state = SSH_SESSION_STATE_ERROR\n         * */\n\n        /* Always allowed */\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_IGNORE:                             // 2\n        /*\n         * States required:\n         * - None\n         *\n         * Transitions:\n         * - None\n         * */\n\n        /* Always allowed */\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_UNIMPLEMENTED:                      // 3\n        /*\n         * States required:\n         * - None\n         *\n         * Transitions:\n         * - None\n         * */\n\n        /* Always allowed */\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_DEBUG:                              // 4\n        /*\n         * States required:\n         * - None\n         *\n         * Transitions:\n         * - None\n         * */\n\n        /* Always allowed */\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_SERVICE_REQUEST:                    // 5\n        /* Server only */\n\n        /*\n         * States required:\n         * - session->session_state == SSH_SESSION_STATE_AUTHENTICATING\n         *   or session->session_state == SSH_SESSION_STATE_AUTHENTICATED\n         * - session->dh_handshake_state == DH_STATE_FINISHED\n         *\n         * Transitions:\n         * - None\n         * */\n\n        /* If this is a client, reject the message */\n        if (session->client) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        if ((session->session_state != SSH_SESSION_STATE_AUTHENTICATING) &&\n            (session->session_state != SSH_SESSION_STATE_AUTHENTICATED))\n        {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        if (session->dh_handshake_state != DH_STATE_FINISHED) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_SERVICE_ACCEPT:                     // 6\n        /*\n         * States required:\n         * - session->session_state == SSH_SESSION_STATE_AUTHENTICATING\n         *   or session->session_state == SSH_SESSION_STATE_AUTHENTICATED\n         * - session->dh_handshake_state == DH_STATE_FINISHED\n         * - session->auth.service_state == SSH_AUTH_SERVICE_SENT\n         *\n         * Transitions:\n         * - auth.service_state = SSH_AUTH_SERVICE_ACCEPTED\n         * */\n\n        if ((session->session_state != SSH_SESSION_STATE_AUTHENTICATING) &&\n            (session->session_state != SSH_SESSION_STATE_AUTHENTICATED))\n        {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        if (session->dh_handshake_state != DH_STATE_FINISHED) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        /* TODO check if only auth service can be requested */\n        if (session->auth.service_state != SSH_AUTH_SERVICE_SENT) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_EXT_INFO:                           // 7\n        /*\n         * States required:\n         * - session_state == SSH_SESSION_STATE_AUTHENTICATING\n         *   or session->session_state == SSH_SESSION_STATE_AUTHENTICATED\n         *   (re-exchange)\n         * - dh_handshake_state == DH_STATE_FINISHED\n         *\n         * Transitions:\n         * - None\n         * */\n\n        if ((session->session_state != SSH_SESSION_STATE_AUTHENTICATING) &&\n            (session->session_state != SSH_SESSION_STATE_AUTHENTICATED))\n        {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        if (session->dh_handshake_state != DH_STATE_FINISHED) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_KEXINIT:                            // 20\n        /*\n         * States required:\n         * - session_state == SSH_SESSION_STATE_AUTHENTICATED\n         *   or session_state == SSH_SESSION_STATE_INITIAL_KEX\n         * - dh_handshake_state == DH_STATE_INIT\n         *   or dh_handshake_state == DH_STATE_INIT_SENT (re-exchange)\n         *   or dh_handshake_state == DH_STATE_FINISHED (re-exchange)\n         *\n         * Transitions:\n         * - session->dh_handshake_state = DH_STATE_INIT\n         * - session->session_state = SSH_SESSION_STATE_KEXINIT_RECEIVED\n         *\n         * On server:\n         * - session->session_state = SSH_SESSION_STATE_DH\n         * */\n\n        if ((session->session_state != SSH_SESSION_STATE_AUTHENTICATED) &&\n            (session->session_state != SSH_SESSION_STATE_INITIAL_KEX))\n        {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        if ((session->dh_handshake_state != DH_STATE_INIT) &&\n            (session->dh_handshake_state != DH_STATE_INIT_SENT) &&\n            (session->dh_handshake_state != DH_STATE_FINISHED))\n        {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_NEWKEYS:                            // 21\n        /*\n         * States required:\n         * - session_state == SSH_SESSION_STATE_DH\n         * - dh_handshake_state == DH_STATE_NEWKEYS_SENT\n         *\n         * Transitions:\n         * - session->dh_handshake_state = DH_STATE_FINISHED\n         * - session->session_state = SSH_SESSION_STATE_AUTHENTICATING\n         * if session->flags & SSH_SESSION_FLAG_AUTHENTICATED\n         * - session->session_state = SSH_SESSION_STATE_AUTHENTICATED\n         * */\n\n        /* If DH has not been started, reject message */\n        if (session->session_state != SSH_SESSION_STATE_DH) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        /* Only allowed if dh_handshake_state is in NEWKEYS_SENT state */\n        if (session->dh_handshake_state != DH_STATE_NEWKEYS_SENT) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_KEXDH_INIT:                         // 30\n      // SSH2_MSG_KEX_ECDH_INIT:                      // 30\n      // SSH2_MSG_ECMQV_INIT:                         // 30\n      // SSH2_MSG_KEX_DH_GEX_REQUEST_OLD:             // 30\n\n        /* Server only */\n\n        /*\n         * States required:\n         * - session_state == SSH_SESSION_STATE_DH\n         * - dh_handshake_state == DH_STATE_INIT\n         *\n         * Transitions:\n         * - session->dh_handshake_state = DH_STATE_INIT_SENT\n         * then calls dh_handshake_server which triggers:\n         * - session->dh_handhsake_state = DH_STATE_NEWKEYS_SENT\n         * */\n\n        if (session->session_state != SSH_SESSION_STATE_DH) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        /* Only allowed if dh_handshake_state is in initial state */\n        if (session->dh_handshake_state != DH_STATE_INIT) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_KEXDH_REPLY:                        // 31\n      // SSH2_MSG_KEX_ECDH_REPLY:                     // 31\n      // SSH2_MSG_ECMQV_REPLY:                        // 31\n      // SSH2_MSG_KEX_DH_GEX_GROUP:                   // 31\n\n        /*\n         * States required:\n         * - session_state == SSH_SESSION_STATE_DH\n         * - dh_handshake_state == DH_STATE_INIT_SENT\n         *   or dh_handshake_state == DH_STATE_REQUEST_SENT (dh-gex)\n         *\n         * Transitions:\n         * - session->dh_handhsake_state = DH_STATE_NEWKEYS_SENT\n         * */\n\n        if (session->session_state != SSH_SESSION_STATE_DH) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        if (session->dh_handshake_state != DH_STATE_INIT_SENT &&\n            session->dh_handshake_state != DH_STATE_REQUEST_SENT) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_KEX_DH_GEX_INIT:                    // 32\n        /* TODO Not filtered */\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_KEX_DH_GEX_REPLY:                   // 33\n        /* TODO Not filtered */\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_KEX_DH_GEX_REQUEST:                 // 34\n        /* TODO Not filtered */\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_USERAUTH_REQUEST:                   // 50\n        /* Server only */\n\n        /*\n         * States required:\n         * - session_state == SSH_SESSION_STATE_AUTHENTICATING\n         * - dh_hanshake_state == DH_STATE_FINISHED\n         *\n         * Transitions:\n         * - if authentication was successful:\n         *   - session_state = SSH_SESSION_STATE_AUTHENTICATED\n         * */\n\n        /* If this is a client, reject the message */\n        if (session->client) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        if (session->dh_handshake_state != DH_STATE_FINISHED) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        if (session->session_state != SSH_SESSION_STATE_AUTHENTICATING) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_USERAUTH_FAILURE:                   // 51\n        /*\n         * States required:\n         * - session_state == SSH_SESSION_STATE_AUTHENTICATING\n         * - dh_hanshake_state == DH_STATE_FINISHED\n         * - session->auth.state == SSH_AUTH_STATE_KBDINT_SENT\n         *   or session->auth.state == SSH_AUTH_STATE_PUBKEY_OFFER_SENT\n         *   or session->auth.state == SSH_AUTH_STATE_PUBKEY_AUTH_SENT\n         *   or session->auth.state == SSH_AUTH_STATE_PASSWORD_AUTH_SENT\n         *   or session->auth.state == SSH_AUTH_STATE_GSSAPI_MIC_SENT\n         *\n         * Transitions:\n         * - if unpacking failed:\n         *   - session->auth.state = SSH_AUTH_ERROR\n         * - if failure was partial:\n         *   - session->auth.state = SSH_AUTH_PARTIAL\n         * - else:\n         *   - session->auth.state = SSH_AUTH_STATE_FAILED\n         * */\n\n        /* If this is a server, reject the message */\n        if (session->server) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        if (session->dh_handshake_state != DH_STATE_FINISHED) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        if (session->session_state != SSH_SESSION_STATE_AUTHENTICATING) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_USERAUTH_SUCCESS:                   // 52\n        /*\n         * States required:\n         * - session_state == SSH_SESSION_STATE_AUTHENTICATING\n         * - dh_hanshake_state == DH_STATE_FINISHED\n         * - session->auth.state == SSH_AUTH_STATE_KBDINT_SENT\n         *   or session->auth.state == SSH_AUTH_STATE_PUBKEY_AUTH_SENT\n         *   or session->auth.state == SSH_AUTH_STATE_PASSWORD_AUTH_SENT\n         *   or session->auth.state == SSH_AUTH_STATE_GSSAPI_MIC_SENT\n         *   or session->auth.state == SSH_AUTH_STATE_AUTH_NONE_SENT\n         *\n         * Transitions:\n         * - session->auth.state = SSH_AUTH_STATE_SUCCESS\n         * - session->session_state = SSH_SESSION_STATE_AUTHENTICATED\n         * - session->flags |= SSH_SESSION_FLAG_AUTHENTICATED\n         * - sessions->auth.current_method = SSH_AUTH_METHOD_UNKNOWN\n         * */\n\n        /* If this is a server, reject the message */\n        if (session->server) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        if (session->dh_handshake_state != DH_STATE_FINISHED) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        if (session->session_state != SSH_SESSION_STATE_AUTHENTICATING) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        if ((session->auth.state != SSH_AUTH_STATE_KBDINT_SENT) &&\n            (session->auth.state != SSH_AUTH_STATE_PUBKEY_AUTH_SENT) &&\n            (session->auth.state != SSH_AUTH_STATE_PASSWORD_AUTH_SENT) &&\n            (session->auth.state != SSH_AUTH_STATE_GSSAPI_MIC_SENT) &&\n            (session->auth.state != SSH_AUTH_STATE_AUTH_NONE_SENT))\n        {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_USERAUTH_BANNER:                    // 53\n        /*\n         * States required:\n         * - session_state == SSH_SESSION_STATE_AUTHENTICATING\n         *\n         * Transitions:\n         * - None\n         * */\n\n        if (session->session_state != SSH_SESSION_STATE_AUTHENTICATING) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_USERAUTH_PK_OK:                     // 60\n      // SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ:          // 60\n      // SSH2_MSG_USERAUTH_INFO_REQUEST:              // 60\n      // SSH2_MSG_USERAUTH_GSSAPI_RESPONSE:           // 60\n\n        /*\n         * States required:\n         * - session_state == SSH_SESSION_STATE_AUTHENTICATING\n         * - session->auth.state == SSH_AUTH_STATE_KBDINT_SENT\n         *   or\n         *   session->auth.state == SSH_AUTH_STATE_GSSAPI_REQUEST_SENT\n         *   or\n         *   session->auth.state == SSH_AUTH_STATE_PUBKEY_OFFER_SENT\n         *\n         * Transitions:\n         * Depending on the current state, the message is treated\n         * differently:\n         * - session->auth.state == SSH_AUTH_STATE_KBDINT_SENT\n         *   - session->auth.state = SSH_AUTH_STATE_INFO\n         * - session->auth.state == SSH_AUTH_STATE_GSSAPI_REQUEST_SENT\n         *   - session->auth.state = SSH_AUTH_STATE_GSSAPI_TOKEN\n         * - session->auth.state == SSH_AUTH_STATE_PUBKEY_OFFER_SENT\n         *   - session->auth.state = SSH_AUTH_STATE_PK_OK\n         * */\n\n        if (session->session_state != SSH_SESSION_STATE_AUTHENTICATING) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        if ((session->auth.state != SSH_AUTH_STATE_KBDINT_SENT) &&\n            (session->auth.state != SSH_AUTH_STATE_PUBKEY_OFFER_SENT) &&\n            (session->auth.state != SSH_AUTH_STATE_GSSAPI_REQUEST_SENT))\n        {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_USERAUTH_INFO_RESPONSE:             // 61\n      // SSH2_MSG_USERAUTH_GSSAPI_TOKEN:              // 61\n\n        /*\n         * States required:\n         * - session_state == SSH_SESSION_STATE_AUTHENTICATING\n         * - session_state->auth.state == SSH_SESSION_STATE_GSSAPI_TOKEN\n         *   or\n         *   session_state->auth.state == SSH_SESSION_STATE_INFO\n         *\n         * Transitions:\n         * - None\n         * */\n\n        if (session->session_state != SSH_SESSION_STATE_AUTHENTICATING) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        if ((session->auth.state != SSH_AUTH_STATE_INFO) &&\n            (session->auth.state != SSH_AUTH_STATE_GSSAPI_TOKEN))\n        {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_USERAUTH_GSSAPI_EXCHANGE_COMPLETE:  // 63\n        /* TODO Not filtered */\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_USERAUTH_GSSAPI_ERROR:              // 64\n        /* TODO Not filtered */\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_USERAUTH_GSSAPI_ERRTOK:             // 65\n        /* TODO Not filtered */\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_USERAUTH_GSSAPI_MIC:                // 66\n        /* Server only */\n\n        /*\n         * States required:\n         * - session_state == SSH_SESSION_STATE_AUTHENTICATING\n         * - session->gssapi->state == SSH_GSSAPI_STATE_RCV_MIC\n         *\n         * Transitions:\n         * Depending on the result of the verification, the states are\n         * changed:\n         * - SSH_AUTH_SUCCESS:\n         *   - session->session_state = SSH_SESSION_STATE_AUTHENTICATED\n         *   - session->flags != SSH_SESSION_FLAG_AUTHENTICATED\n         * - SSH_AUTH_PARTIAL:\n         *   - None\n         * - any other case:\n         *   - None\n         * */\n\n        /* If this is a client, reject the message */\n        if (session->client) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        if (session->dh_handshake_state != DH_STATE_FINISHED) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        if (session->session_state != SSH_SESSION_STATE_AUTHENTICATING) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_GLOBAL_REQUEST:                     // 80\n        /*\n         * States required:\n         * - session_state == SSH_SESSION_STATE_AUTHENTICATED\n         *\n         * Transitions:\n         * - None\n         * */\n\n        if (session->session_state != SSH_SESSION_STATE_AUTHENTICATED) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_REQUEST_SUCCESS:                    // 81\n        /*\n         * States required:\n         * - session_state == SSH_SESSION_STATE_AUTHENTICATED\n         * - session->global_req_state == SSH_CHANNEL_REQ_STATE_PENDING\n         *\n         * Transitions:\n         * - session->global_req_state == SSH_CHANNEL_REQ_STATE_ACCEPTED\n         * */\n\n        if (session->session_state != SSH_SESSION_STATE_AUTHENTICATED) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        if (session->global_req_state != SSH_CHANNEL_REQ_STATE_PENDING) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_REQUEST_FAILURE:                    // 82\n        /*\n         * States required:\n         * - session_state == SSH_SESSION_STATE_AUTHENTICATED\n         * - session->global_req_state == SSH_CHANNEL_REQ_STATE_PENDING\n         *\n         * Transitions:\n         * - session->global_req_state == SSH_CHANNEL_REQ_STATE_DENIED\n         * */\n\n        if (session->session_state != SSH_SESSION_STATE_AUTHENTICATED) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        if (session->global_req_state != SSH_CHANNEL_REQ_STATE_PENDING) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_CHANNEL_OPEN:                       // 90\n        /*\n         * States required:\n         * - session_state == SSH_SESSION_STATE_AUTHENTICATED\n         *\n         * Transitions:\n         * - None\n         * */\n\n        if (session->session_state != SSH_SESSION_STATE_AUTHENTICATED) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_CHANNEL_OPEN_CONFIRMATION:          // 91\n        /*\n         * States required:\n         * - session_state == SSH_SESSION_STATE_AUTHENTICATED\n         *\n         * Transitions:\n         * - channel->state = SSH_CHANNEL_STATE_OPEN\n         * - channel->flags &= ~SSH_CHANNEL_FLAG_NOT_BOUND\n         * */\n\n        if (session->session_state != SSH_SESSION_STATE_AUTHENTICATED) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_CHANNEL_OPEN_FAILURE:               // 92\n        /*\n         * States required:\n         * - session_state == SSH_SESSION_STATE_AUTHENTICATED\n         *\n         * Transitions:\n         * - channel->state = SSH_CHANNEL_STATE_OPEN_DENIED\n         * */\n\n        if (session->session_state != SSH_SESSION_STATE_AUTHENTICATED) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_CHANNEL_WINDOW_ADJUST:              // 93\n        /*\n         * States required:\n         * - session_state == SSH_SESSION_STATE_AUTHENTICATED\n         *\n         * Transitions:\n         * - None\n         * */\n\n        if (session->session_state != SSH_SESSION_STATE_AUTHENTICATED) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_CHANNEL_DATA:                       // 94\n        /*\n         * States required:\n         * - session_state == SSH_SESSION_STATE_AUTHENTICATED\n         *\n         * Transitions:\n         * - None\n         * */\n\n        if (session->session_state != SSH_SESSION_STATE_AUTHENTICATED) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_CHANNEL_EXTENDED_DATA:              // 95\n        /*\n         * States required:\n         * - session_state == SSH_SESSION_STATE_AUTHENTICATED\n         *\n         * Transitions:\n         * - None\n         * */\n\n        if (session->session_state != SSH_SESSION_STATE_AUTHENTICATED) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_CHANNEL_EOF:                        // 96\n        /*\n         * States required:\n         * - session_state == SSH_SESSION_STATE_AUTHENTICATED\n         *\n         * Transitions:\n         * - None\n         * */\n\n        if (session->session_state != SSH_SESSION_STATE_AUTHENTICATED) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_CHANNEL_CLOSE:                      // 97\n        /*\n         * States required:\n         * - session_state == SSH_SESSION_STATE_AUTHENTICATED\n         *\n         * Transitions:\n         * - channel->state = SSH_CHANNEL_STATE_CLOSED\n         * - channel->flags |= SSH_CHANNEL_FLAG_CLOSED_REMOTE\n         * */\n\n        if (session->session_state != SSH_SESSION_STATE_AUTHENTICATED) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_CHANNEL_REQUEST:                    // 98\n        /*\n         * States required:\n         * - session_state == SSH_SESSION_STATE_AUTHENTICATED\n         *\n         * Transitions:\n         * - Depends on the request\n         * */\n\n        if (session->session_state != SSH_SESSION_STATE_AUTHENTICATED) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_CHANNEL_SUCCESS:                    // 99\n        /*\n         * States required:\n         * - session_state == SSH_SESSION_STATE_AUTHENTICATED\n         * - channel->request_state == SSH_CHANNEL_REQ_STATE_PENDING\n         *\n         * Transitions:\n         * - channel->request_state = SSH_CHANNEL_REQ_STATE_ACCEPTED\n         * */\n\n        if (session->session_state != SSH_SESSION_STATE_AUTHENTICATED) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    case SSH2_MSG_CHANNEL_FAILURE:                    // 100\n        /*\n         * States required:\n         * - session_state == SSH_SESSION_STATE_AUTHENTICATED\n         * - channel->request_state == SSH_CHANNEL_REQ_STATE_PENDING\n         *\n         * Transitions:\n         * - channel->request_state = SSH_CHANNEL_REQ_STATE_DENIED\n         * */\n\n        if (session->session_state != SSH_SESSION_STATE_AUTHENTICATED) {\n            rc = SSH_PACKET_DENIED;\n            break;\n        }\n\n        rc = SSH_PACKET_ALLOWED;\n        break;\n    default:\n        /* Unknown message, do not filter */\n        rc = SSH_PACKET_UNKNOWN;\n        goto end;\n    }\n\nend:\n#ifdef DEBUG_PACKET\n    if (rc == SSH_PACKET_DENIED) {\n        SSH_LOG(SSH_LOG_PACKET, \"REJECTED packet type %d: \",\n                session->in_packet.type);\n    }\n\n    if (rc == SSH_PACKET_UNKNOWN) {\n        SSH_LOG(SSH_LOG_PACKET, \"UNKNOWN packet type %d\",\n                session->in_packet.type);\n    }\n#endif\n\n    return rc;\n}\n\n/* Returns current_crypto structure from the session.\n * During key exchange (or rekey), after one of the sides\n * sending NEWKEYS packet, this might return next_crypto for one\n * of the directions that is ahead to send already queued packets\n */\nstruct ssh_crypto_struct *\nssh_packet_get_current_crypto(ssh_session session,\n                              enum ssh_crypto_direction_e direction)\n{\n    struct ssh_crypto_struct *crypto = NULL;\n\n    if (session == NULL) {\n        return NULL;\n    }\n\n    if (session->current_crypto != NULL &&\n        session->current_crypto->used & direction) {\n        crypto = session->current_crypto;\n    } else if (session->next_crypto != NULL &&\n               session->next_crypto->used & direction) {\n        crypto = session->next_crypto;\n    } else {\n        return NULL;\n    }\n\n    switch (direction) {\n    case SSH_DIRECTION_IN:\n        if (crypto->in_cipher != NULL) {\n            return crypto;\n        }\n        break;\n    case SSH_DIRECTION_OUT:\n        if (crypto->out_cipher != NULL) {\n            return crypto;\n        }\n        break;\n    case SSH_DIRECTION_BOTH:\n        if (crypto->in_cipher != NULL &&\n            crypto->out_cipher != NULL) {\n            return crypto;\n        }\n    }\n\n    return NULL;\n}\n\n#define MAX_PACKETS    (1UL<<31)\n\nstatic bool ssh_packet_need_rekey(ssh_session session,\n                                  const uint32_t payloadsize)\n{\n    bool data_rekey_needed = false;\n    struct ssh_crypto_struct *crypto = NULL;\n    struct ssh_cipher_struct *out_cipher = NULL, *in_cipher = NULL;\n    uint32_t next_blocks;\n\n    /* We can safely rekey only in authenticated state */\n    if ((session->flags & SSH_SESSION_FLAG_AUTHENTICATED) == 0) {\n        return false;\n    }\n\n    /* Do not rekey if the rekey/key-exchange is in progress */\n    if (session->dh_handshake_state != DH_STATE_FINISHED) {\n        return false;\n    }\n\n    crypto = ssh_packet_get_current_crypto(session, SSH_DIRECTION_BOTH);\n    if (crypto == NULL) {\n        return false;\n    }\n\n    out_cipher = crypto->out_cipher;\n    in_cipher = crypto->in_cipher;\n\n    /* Make sure we can send at least something for very small limits */\n    if ((out_cipher->packets == 0) && (in_cipher->packets == 0)) {\n        return false;\n    }\n\n    /* Time based rekeying */\n    if (session->opts.rekey_time != 0 &&\n        ssh_timeout_elapsed(&session->last_rekey_time,\n                            session->opts.rekey_time)) {\n        return true;\n    }\n\n    /* RFC4344, Section 3.1 Recommends rekeying after 2^31 packets in either\n     * direction to avoid possible information leakage through the MAC tag\n     */\n    if (out_cipher->packets > MAX_PACKETS ||\n        in_cipher->packets > MAX_PACKETS) {\n        return true;\n    }\n\n    /* Data-based rekeying:\n     *  * For outgoing packets we can still delay them\n     *  * Incoming packets need to be processed anyway, but we can\n     *    signalize our intention to rekey\n     */\n    next_blocks = payloadsize / out_cipher->blocksize;\n    data_rekey_needed = (out_cipher->max_blocks != 0 &&\n                         out_cipher->blocks + next_blocks > out_cipher->max_blocks) ||\n                         (in_cipher->max_blocks != 0 &&\n                         in_cipher->blocks + next_blocks > in_cipher->max_blocks);\n\n    SSH_LOG(SSH_LOG_PACKET,\n            \"packet: [data_rekey_needed=%d, out_blocks=%\" PRIu64 \", in_blocks=%\" PRIu64,\n            data_rekey_needed,\n            out_cipher->blocks + next_blocks,\n            in_cipher->blocks + next_blocks);\n\n    return data_rekey_needed;\n}\n\n/* in nonblocking mode, socket_read will read as much as it can, and return */\n/* SSH_OK if it has read at least len bytes, otherwise, SSH_AGAIN. */\n/* in blocking mode, it will read at least len bytes and will block until it's ok. */\n\n/** @internal\n * @handles a data received event. It then calls the handlers for the different packet types\n * or and exception handler callback.\n * @param user pointer to current ssh_session\n * @param data pointer to the data received\n * @len length of data received. It might not be enough for a complete packet\n * @returns number of bytes read and processed.\n */\nint ssh_packet_socket_callback(const void *data, size_t receivedlen, void *user)\n{\n    ssh_session session = (ssh_session)user;\n    uint32_t blocksize = 8;\n    uint32_t lenfield_blocksize = 8;\n    size_t current_macsize = 0;\n    uint8_t *ptr = NULL;\n    int to_be_read;\n    int rc;\n    uint8_t *cleartext_packet = NULL;\n    uint8_t *packet_second_block = NULL;\n    uint8_t *mac = NULL;\n    size_t packet_remaining;\n    uint32_t packet_len, compsize, payloadsize;\n    uint8_t padding;\n    size_t processed = 0; /* number of byte processed from the callback */\n    enum ssh_packet_filter_result_e filter_result;\n    struct ssh_crypto_struct *crypto = NULL;\n    bool etm = false;\n    uint32_t etm_packet_offset = 0;\n    bool ok;\n\n    crypto = ssh_packet_get_current_crypto(session, SSH_DIRECTION_IN);\n    if (crypto != NULL) {\n        current_macsize = hmac_digest_len(crypto->in_hmac);\n        blocksize = crypto->in_cipher->blocksize;\n        lenfield_blocksize = crypto->in_cipher->lenfield_blocksize;\n        etm = crypto->in_hmac_etm;\n    }\n\n    if (etm) {\n        /* In EtM mode packet size is unencrypted. This means\n         * we need to use this offset and set the block size\n         * that is part of the encrypted part to 0.\n         */\n        etm_packet_offset = sizeof(uint32_t);\n        lenfield_blocksize = 0;\n    } else if (lenfield_blocksize == 0) {\n        lenfield_blocksize = blocksize;\n    }\n    if (data == NULL) {\n        goto error;\n    }\n\n    if (session->session_state == SSH_SESSION_STATE_ERROR) {\n        goto error;\n    }\n#ifdef DEBUG_PACKET\n    SSH_LOG(SSH_LOG_PACKET,\n            \"rcv packet cb (len=%zu, state=%s)\",\n            receivedlen,\n            session->packet_state == PACKET_STATE_INIT ?\n                \"INIT\" :\n                session->packet_state == PACKET_STATE_SIZEREAD ?\n                    \"SIZE_READ\" :\n                    session->packet_state == PACKET_STATE_PROCESSING ?\n                    \"PROCESSING\" : \"unknown\");\n#endif\n    switch(session->packet_state) {\n        case PACKET_STATE_INIT:\n            if (receivedlen < lenfield_blocksize + etm_packet_offset) {\n                /*\n                 * We didn't receive enough data to read either at least one\n                 * block size or the unencrypted length in EtM mode.\n                 */\n#ifdef DEBUG_PACKET\n                SSH_LOG(SSH_LOG_PACKET,\n                        \"Waiting for more data (%zu < %u)\",\n                        receivedlen,\n                        lenfield_blocksize);\n#endif\n                return 0;\n            }\n\n            session->in_packet = (struct packet_struct) {\n                .type = 0,\n            };\n\n            if (session->in_buffer) {\n                rc = ssh_buffer_reinit(session->in_buffer);\n                if (rc < 0) {\n                    goto error;\n                }\n            } else {\n                session->in_buffer = ssh_buffer_new();\n                if (session->in_buffer == NULL) {\n                    goto error;\n                }\n            }\n\n            if (!etm) {\n                ptr = ssh_buffer_allocate(session->in_buffer, lenfield_blocksize);\n                if (ptr == NULL) {\n                    goto error;\n                }\n                packet_len = ssh_packet_decrypt_len(session, ptr, (uint8_t *)data);\n                to_be_read = packet_len - lenfield_blocksize + sizeof(uint32_t);\n            } else {\n                /* Length is unencrypted in case of Encrypt-then-MAC */\n                packet_len = PULL_BE_U32(data, 0);\n                to_be_read = packet_len - etm_packet_offset;\n            }\n\n            processed += lenfield_blocksize + etm_packet_offset;\n            if (packet_len > MAX_PACKET_LEN) {\n                ssh_set_error(session,\n                              SSH_FATAL,\n                              \"read_packet(): Packet len too high(%u %.4x)\",\n                              packet_len, packet_len);\n                goto error;\n            }\n            if (to_be_read < 0) {\n                /* remote sshd sends invalid sizes? */\n                ssh_set_error(session,\n                              SSH_FATAL,\n                              \"Given numbers of bytes left to be read < 0 (%d)!\",\n                              to_be_read);\n                goto error;\n            }\n\n            session->in_packet.len = packet_len;\n            session->packet_state = PACKET_STATE_SIZEREAD;\n            FALL_THROUGH;\n        case PACKET_STATE_SIZEREAD:\n            packet_len = session->in_packet.len;\n            processed = lenfield_blocksize + etm_packet_offset;\n            to_be_read = packet_len + sizeof(uint32_t) + current_macsize;\n            /* if to_be_read is zero, the whole packet was blocksize bytes. */\n            if (to_be_read != 0) {\n                if (receivedlen  < (unsigned int)to_be_read) {\n                    /* give up, not enough data in buffer */\n                    SSH_LOG(SSH_LOG_PACKET,\n                            \"packet: partial packet (read len) \"\n                            \"[len=%d, receivedlen=%d, to_be_read=%d]\",\n                            packet_len,\n                            (int)receivedlen,\n                            to_be_read);\n                    return 0;\n                }\n\n                packet_second_block = (uint8_t*)data + lenfield_blocksize + etm_packet_offset;\n                processed = to_be_read - current_macsize;\n            }\n\n            /* remaining encrypted bytes from the packet, MAC not included */\n            packet_remaining =\n                packet_len - (lenfield_blocksize - sizeof(uint32_t) + etm_packet_offset);\n            cleartext_packet = ssh_buffer_allocate(session->in_buffer,\n                                                   packet_remaining);\n            if (cleartext_packet == NULL) {\n                goto error;\n            }\n\n            if (packet_second_block != NULL) {\n                if (crypto != NULL) {\n                    mac = packet_second_block + packet_remaining;\n\n                    if (etm) {\n                        rc = ssh_packet_hmac_verify(session,\n                                                    data,\n                                                    processed,\n                                                    mac,\n                                                    crypto->in_hmac);\n                        if (rc < 0) {\n                            ssh_set_error(session, SSH_FATAL, \"HMAC error\");\n                            goto error;\n                        }\n                    }\n                    /*\n                     * Decrypt the packet. In case of EtM mode, the length is already\n                     * known as it's unencrypted. In the other case, lenfield_blocksize bytes\n                     * already have been decrypted.\n                     */\n                    if (packet_remaining > 0) {\n                        rc = ssh_packet_decrypt(session,\n                                                cleartext_packet,\n                                                (uint8_t *)data,\n                                                lenfield_blocksize + etm_packet_offset,\n                                                processed - (lenfield_blocksize + etm_packet_offset));\n                        if (rc < 0) {\n                            ssh_set_error(session,\n                                          SSH_FATAL,\n                                          \"Decryption error\");\n                            goto error;\n                        }\n                    }\n\n                    if (!etm) {\n                        rc = ssh_packet_hmac_verify(session,\n                                                    ssh_buffer_get(session->in_buffer),\n                                                    ssh_buffer_get_len(session->in_buffer),\n                                                    mac,\n                                                    crypto->in_hmac);\n                        if (rc < 0) {\n                            ssh_set_error(session, SSH_FATAL, \"HMAC error\");\n                            goto error;\n                        }\n                    }\n                    processed += current_macsize;\n                } else {\n                    memcpy(cleartext_packet,\n                           packet_second_block,\n                           packet_remaining);\n                }\n            }\n\n#ifdef WITH_PCAP\n            if (session->pcap_ctx != NULL) {\n                ssh_pcap_context_write(session->pcap_ctx,\n                                       SSH_PCAP_DIR_IN,\n                                       ssh_buffer_get(session->in_buffer),\n                                       ssh_buffer_get_len(session->in_buffer),\n                                       ssh_buffer_get_len(session->in_buffer));\n            }\n#endif\n\n            if (!etm) {\n                /* skip the size field which has been processed before */\n                ssh_buffer_pass_bytes(session->in_buffer, sizeof(uint32_t));\n            }\n\n            rc = ssh_buffer_get_u8(session->in_buffer, &padding);\n            if (rc == 0) {\n                ssh_set_error(session,\n                              SSH_FATAL,\n                              \"Packet too short to read padding\");\n                goto error;\n            }\n\n            if (padding > ssh_buffer_get_len(session->in_buffer)) {\n                ssh_set_error(session,\n                              SSH_FATAL,\n                              \"Invalid padding: %d (%d left)\",\n                              padding,\n                              ssh_buffer_get_len(session->in_buffer));\n                goto error;\n            }\n            ssh_buffer_pass_bytes_end(session->in_buffer, padding);\n            compsize = ssh_buffer_get_len(session->in_buffer);\n\n#ifdef WITH_ZLIB\n            if (crypto && crypto->do_compress_in\n                && ssh_buffer_get_len(session->in_buffer) > 0) {\n                rc = decompress_buffer(session, session->in_buffer,MAX_PACKET_LEN);\n                if (rc < 0) {\n                    goto error;\n                }\n            }\n#endif /* WITH_ZLIB */\n            payloadsize = ssh_buffer_get_len(session->in_buffer);\n            session->recv_seq++;\n            if (crypto != NULL) {\n                struct ssh_cipher_struct *cipher = NULL;\n\n                cipher = crypto->in_cipher;\n                cipher->packets++;\n                cipher->blocks += payloadsize / cipher->blocksize;\n            }\n            if (session->raw_counter != NULL) {\n                session->raw_counter->in_bytes += payloadsize;\n                session->raw_counter->in_packets++;\n            }\n\n            /*\n             * We don't want to rewrite a new packet while still executing the\n             * packet callbacks\n             */\n            session->packet_state = PACKET_STATE_PROCESSING;\n            ssh_packet_parse_type(session);\n            SSH_LOG(SSH_LOG_PACKET,\n                    \"packet: read type %hhd [len=%d,padding=%hhd,comp=%d,payload=%d]\",\n                    session->in_packet.type, packet_len, padding, compsize, payloadsize);\n\n            /* Check if the packet is expected */\n            filter_result = ssh_packet_incoming_filter(session);\n\n            switch(filter_result) {\n            case SSH_PACKET_ALLOWED:\n                /* Execute callbacks */\n                ssh_packet_process(session, session->in_packet.type);\n                break;\n            case SSH_PACKET_DENIED:\n                ssh_set_error(session,\n                              SSH_FATAL,\n                              \"Packet filter: rejected packet (type %d)\",\n                              session->in_packet.type);\n                goto error;\n            case SSH_PACKET_UNKNOWN:\n                ssh_packet_send_unimplemented(session, session->recv_seq - 1);\n                break;\n            }\n\n            session->packet_state = PACKET_STATE_INIT;\n            if (processed < receivedlen) {\n                /* Handle a potential packet left in socket buffer */\n                SSH_LOG(SSH_LOG_PACKET,\n                        \"Processing %\" PRIdS \" bytes left in socket buffer\",\n                        receivedlen-processed);\n\n                ptr = ((uint8_t*)data) + processed;\n\n                rc = ssh_packet_socket_callback(ptr, receivedlen - processed,user);\n                processed += rc;\n            }\n\n            ok = ssh_packet_need_rekey(session, 0);\n            if (ok) {\n                SSH_LOG(SSH_LOG_PACKET, \"Incoming packet triggered rekey\");\n                rc = ssh_send_rekex(session);\n                if (rc != SSH_OK) {\n                    SSH_LOG(SSH_LOG_PACKET, \"Rekey failed: rc = %d\", rc);\n                    return rc;\n                }\n            }\n\n            return processed;\n        case PACKET_STATE_PROCESSING:\n            SSH_LOG(SSH_LOG_PACKET, \"Nested packet processing. Delaying.\");\n            return 0;\n    }\n\n    ssh_set_error(session,\n                  SSH_FATAL,\n                  \"Invalid state into packet_read2(): %d\",\n                  session->packet_state);\n\nerror:\n    session->session_state= SSH_SESSION_STATE_ERROR;\n    SSH_LOG(SSH_LOG_PACKET,\"Packet: processed %\" PRIdS \" bytes\", processed);\n    return processed;\n}\n\nstatic void ssh_packet_socket_controlflow_callback(int code, void *userdata)\n{\n    ssh_session session = userdata;\n    struct ssh_iterator *it;\n    ssh_channel channel;\n\n    if (code == SSH_SOCKET_FLOW_WRITEWONTBLOCK) {\n        SSH_LOG(SSH_LOG_TRACE, \"sending channel_write_wontblock callback\");\n\n        /* the out pipe is empty so we can forward this to channels */\n        it = ssh_list_get_iterator(session->channels);\n        while (it != NULL) {\n            channel = ssh_iterator_value(ssh_channel, it);\n            ssh_callbacks_execute_list(channel->callbacks,\n                                       ssh_channel_callbacks,\n                                       channel_write_wontblock_function,\n                                       session,\n                                       channel,\n                                       channel->remote_window);\n            it = it->next;\n        }\n    }\n}\n\nvoid ssh_packet_register_socket_callback(ssh_session session, ssh_socket s){\n\tsession->socket_callbacks.data=ssh_packet_socket_callback;\n\tsession->socket_callbacks.connected=NULL;\n    session->socket_callbacks.controlflow = ssh_packet_socket_controlflow_callback;\n\tsession->socket_callbacks.userdata=session;\n\tssh_socket_set_callbacks(s,&session->socket_callbacks);\n}\n\n/** @internal\n * @brief sets the callbacks for the packet layer\n */\nvoid ssh_packet_set_callbacks(ssh_session session, ssh_packet_callbacks callbacks){\n  if(session->packet_callbacks == NULL){\n    session->packet_callbacks = ssh_list_new();\n  }\n  if (session->packet_callbacks != NULL) {\n    ssh_list_append(session->packet_callbacks, callbacks);\n  }\n}\n\n/** @internal\n * @brief remove the callbacks from the packet layer\n */\nvoid ssh_packet_remove_callbacks(ssh_session session, ssh_packet_callbacks callbacks){\n    struct ssh_iterator *it = NULL;\n    it = ssh_list_find(session->packet_callbacks, callbacks);\n    if (it != NULL) {\n        ssh_list_remove(session->packet_callbacks, it);\n    }\n}\n\n/** @internal\n * @brief sets the default packet handlers\n */\nvoid ssh_packet_set_default_callbacks(ssh_session session){\n\tsession->default_packet_callbacks.start=1;\n\tsession->default_packet_callbacks.n_callbacks=sizeof(default_packet_handlers)/sizeof(ssh_packet_callback);\n\tsession->default_packet_callbacks.user=session;\n\tsession->default_packet_callbacks.callbacks=default_packet_handlers;\n\tssh_packet_set_callbacks(session, &session->default_packet_callbacks);\n}\n\n/** @internal\n * @brief dispatch the call of packet handlers callbacks for a received packet\n * @param type type of packet\n */\nvoid ssh_packet_process(ssh_session session, uint8_t type)\n{\n    struct ssh_iterator *i = NULL;\n    int rc = SSH_PACKET_NOT_USED;\n    ssh_packet_callbacks cb;\n\n    SSH_LOG(SSH_LOG_PACKET, \"Dispatching handler for packet type %d\", type);\n    if (session->packet_callbacks == NULL) {\n        SSH_LOG(SSH_LOG_RARE, \"Packet callback is not initialized !\");\n        return;\n    }\n\n    i = ssh_list_get_iterator(session->packet_callbacks);\n    while (i != NULL) {\n        cb = ssh_iterator_value(ssh_packet_callbacks, i);\n        i = i->next;\n\n        if (!cb) {\n            continue;\n        }\n\n        if (cb->start > type) {\n            continue;\n        }\n\n        if (cb->start + cb->n_callbacks <= type) {\n            continue;\n        }\n\n        if (cb->callbacks[type - cb->start] == NULL) {\n            continue;\n        }\n\n        rc = cb->callbacks[type - cb->start](session, type, session->in_buffer,\n                                             cb->user);\n        if (rc == SSH_PACKET_USED) {\n            break;\n        }\n    }\n\n    if (rc == SSH_PACKET_NOT_USED) {\n        SSH_LOG(SSH_LOG_RARE, \"Couldn't do anything with packet type %d\", type);\n        rc = ssh_packet_send_unimplemented(session, session->recv_seq - 1);\n        if (rc != SSH_OK) {\n            SSH_LOG(SSH_LOG_RARE, \"Failed to send unimplemented: %s\",\n                    ssh_get_error(session));\n        }\n    }\n}\n\n/** @internal\n * @brief sends a SSH_MSG_UNIMPLEMENTED answer to an unhandled packet\n * @param session the SSH session\n * @param seqnum the sequence number of the unknown packet\n * @return SSH_ERROR on error, else SSH_OK\n */\nint ssh_packet_send_unimplemented(ssh_session session, uint32_t seqnum){\n    int rc;\n\n    rc = ssh_buffer_pack(session->out_buffer,\n                         \"bd\",\n                         SSH2_MSG_UNIMPLEMENTED,\n                         seqnum);\n    if (rc != SSH_OK) {\n        ssh_set_error_oom(session);\n        return SSH_ERROR;\n    }\n    rc = ssh_packet_send(session);\n\n    return rc;\n}\n\n/** @internal\n * @brief handles a SSH_MSG_UNIMPLEMENTED packet\n */\nSSH_PACKET_CALLBACK(ssh_packet_unimplemented){\n    uint32_t seq;\n    int rc;\n\n    (void)session; /* unused */\n    (void)type;\n    (void)user;\n\n    rc = ssh_buffer_unpack(packet, \"d\", &seq);\n    if (rc != SSH_OK) {\n        SSH_LOG(SSH_LOG_WARNING,\n                \"Could not unpack SSH_MSG_UNIMPLEMENTED packet\");\n    }\n\n    SSH_LOG(SSH_LOG_RARE,\n            \"Received SSH_MSG_UNIMPLEMENTED (sequence number %d)\",seq);\n\n    return SSH_PACKET_USED;\n}\n\n/** @internal\n * @parse the \"Type\" header field of a packet and updates the session\n */\nint ssh_packet_parse_type(struct ssh_session_struct *session)\n{\n    session->in_packet = (struct packet_struct) {\n        .type = 0,\n    };\n\n    if (session->in_buffer == NULL) {\n        return SSH_ERROR;\n    }\n\n    if (ssh_buffer_get_u8(session->in_buffer, &session->in_packet.type) == 0) {\n        ssh_set_error(session, SSH_FATAL, \"Packet too short to read type\");\n        return SSH_ERROR;\n    }\n\n    session->in_packet.valid = 1;\n\n    return SSH_OK;\n}\n\n/*\n * This function places the outgoing packet buffer into an outgoing\n * socket buffer\n */\nstatic int ssh_packet_write(ssh_session session) {\n  int rc = SSH_ERROR;\n\n  rc=ssh_socket_write(session->socket,\n      ssh_buffer_get(session->out_buffer),\n      ssh_buffer_get_len(session->out_buffer));\n\n  return rc;\n}\n\nstatic int packet_send2(ssh_session session)\n{\n    unsigned int blocksize = 8;\n    unsigned int lenfield_blocksize = 0;\n    enum ssh_hmac_e hmac_type;\n    uint32_t currentlen = ssh_buffer_get_len(session->out_buffer);\n    struct ssh_crypto_struct *crypto = NULL;\n    unsigned char *hmac = NULL;\n    uint8_t padding_data[32] = { 0 };\n    uint8_t padding_size;\n    uint32_t finallen, payloadsize, compsize;\n    uint8_t header[5] = {0};\n    uint8_t type, *payload;\n    int rc = SSH_ERROR;\n    bool etm = false;\n    int etm_packet_offset = 0;\n\n    crypto = ssh_packet_get_current_crypto(session, SSH_DIRECTION_OUT);\n    if (crypto) {\n        blocksize = crypto->out_cipher->blocksize;\n        lenfield_blocksize = crypto->out_cipher->lenfield_blocksize;\n        hmac_type = crypto->out_hmac;\n        etm = crypto->out_hmac_etm;\n    } else {\n        hmac_type = session->next_crypto->out_hmac;\n    }\n\n    payload = (uint8_t *)ssh_buffer_get(session->out_buffer);\n    type = payload[0]; /* type is the first byte of the packet now */\n\n    payloadsize = currentlen;\n    if (etm) {\n        etm_packet_offset = sizeof(uint32_t);\n        lenfield_blocksize = 0;\n    }\n\n#ifdef WITH_ZLIB\n    if (crypto != NULL && crypto->do_compress_out &&\n        ssh_buffer_get_len(session->out_buffer) > 0) {\n        rc = compress_buffer(session,session->out_buffer);\n        if (rc < 0) {\n            goto error;\n        }\n        currentlen = ssh_buffer_get_len(session->out_buffer);\n    }\n#endif /* WITH_ZLIB */\n    compsize = currentlen;\n    /* compressed payload + packet len (4) + padding_size len (1) */\n    /* totallen - lenfield_blocksize - etm_packet_offset must be equal to 0 (mod blocksize) */\n    padding_size = (blocksize - ((blocksize - lenfield_blocksize - etm_packet_offset + currentlen + 5) % blocksize));\n    if (padding_size < 4) {\n        padding_size += blocksize;\n    }\n\n    if (crypto != NULL) {\n        int ok;\n\n        ok = ssh_get_random(padding_data, padding_size, 0);\n        if (!ok) {\n            ssh_set_error(session, SSH_FATAL, \"PRNG error\");\n            goto error;\n        }\n    }\n\n    finallen = currentlen - etm_packet_offset + padding_size + 1;\n\n    PUSH_BE_U32(header, 0, finallen);\n    PUSH_BE_U8(header, 4, padding_size);\n\n    rc = ssh_buffer_prepend_data(session->out_buffer,\n                                 header,\n                                 sizeof(header));\n    if (rc < 0) {\n        goto error;\n    }\n\n    rc = ssh_buffer_add_data(session->out_buffer, padding_data, padding_size);\n    if (rc < 0) {\n        goto error;\n    }\n\n#ifdef WITH_PCAP\n    if (session->pcap_ctx != NULL) {\n        ssh_pcap_context_write(session->pcap_ctx,\n                               SSH_PCAP_DIR_OUT,\n                               ssh_buffer_get(session->out_buffer),\n                               ssh_buffer_get_len(session->out_buffer),\n                               ssh_buffer_get_len(session->out_buffer));\n    }\n#endif\n\n    hmac = ssh_packet_encrypt(session,\n                              ssh_buffer_get(session->out_buffer),\n                              ssh_buffer_get_len(session->out_buffer));\n    if (hmac != NULL) {\n        rc = ssh_buffer_add_data(session->out_buffer,\n                                 hmac,\n                                 hmac_digest_len(hmac_type));\n        if (rc < 0) {\n            goto error;\n        }\n    }\n\n    rc = ssh_packet_write(session);\n    if (rc == SSH_ERROR) {\n        goto error;\n    }\n    session->send_seq++;\n    if (crypto != NULL) {\n        struct ssh_cipher_struct *cipher = NULL;\n\n        cipher = crypto->out_cipher;\n        cipher->packets++;\n        cipher->blocks += payloadsize / cipher->blocksize;\n    }\n    if (session->raw_counter != NULL) {\n        session->raw_counter->out_bytes += payloadsize;\n        session->raw_counter->out_packets++;\n    }\n\n    SSH_LOG(SSH_LOG_PACKET,\n            \"packet: wrote [type=%u, len=%u, padding_size=%hhd, comp=%u, \"\n            \"payload=%u]\",\n            type,\n            finallen,\n            padding_size,\n            compsize,\n            payloadsize);\n\n    rc = ssh_buffer_reinit(session->out_buffer);\n    if (rc < 0) {\n        rc = SSH_ERROR;\n        goto error;\n    }\n\n    /* We sent the NEWKEYS so any further packet needs to be encrypted\n     * with the new keys. We can not switch both directions (need to decrypt\n     * peer NEWKEYS) and we do not want to wait for the peer NEWKEYS\n     * too, so we will switch only the OUT direction now.\n     */\n    if (type == SSH2_MSG_NEWKEYS) {\n        rc = ssh_packet_set_newkeys(session, SSH_DIRECTION_OUT);\n    }\nerror:\n    return rc; /* SSH_OK, AGAIN or ERROR */\n}\n\nstatic bool\nssh_packet_is_kex(unsigned char type)\n{\n    return type >= SSH2_MSG_DISCONNECT &&\n           type <= SSH2_MSG_KEX_DH_GEX_REQUEST &&\n           type != SSH2_MSG_SERVICE_REQUEST &&\n           type != SSH2_MSG_SERVICE_ACCEPT &&\n           type != SSH2_MSG_IGNORE &&\n           type != SSH2_MSG_EXT_INFO;\n}\n\nstatic bool\nssh_packet_in_rekey(ssh_session session)\n{\n    /* We know we are rekeying if we are authenticated and the DH\n     * status is not finished\n     */\n    return (session->flags & SSH_SESSION_FLAG_AUTHENTICATED) &&\n           (session->dh_handshake_state != DH_STATE_FINISHED);\n}\n\nint ssh_packet_send(ssh_session session)\n{\n    uint32_t payloadsize;\n    uint8_t type, *payload;\n    bool need_rekey, in_rekey;\n    int rc;\n\n    payloadsize = ssh_buffer_get_len(session->out_buffer);\n    if (payloadsize < 1) {\n        return SSH_ERROR;\n    }\n\n    payload = (uint8_t *)ssh_buffer_get(session->out_buffer);\n    type = payload[0]; /* type is the first byte of the packet now */\n    need_rekey = ssh_packet_need_rekey(session, payloadsize);\n    in_rekey = ssh_packet_in_rekey(session);\n\n    /* The rekey is triggered here. After that, only the key exchange\n     * packets can be sent, until we send our NEWKEYS.\n     */\n    if (need_rekey || (in_rekey && !ssh_packet_is_kex(type))) {\n        if (need_rekey) {\n            SSH_LOG(SSH_LOG_PACKET, \"Outgoing packet triggered rekey\");\n        }\n        /* Queue the current packet -- we will send it after the rekey */\n        SSH_LOG(SSH_LOG_PACKET, \"Queuing packet type %d\", type);\n        rc = ssh_list_append(session->out_queue, session->out_buffer);\n        if (rc != SSH_OK) {\n            return SSH_ERROR;\n        }\n        session->out_buffer = ssh_buffer_new();\n        if (session->out_buffer == NULL) {\n            ssh_set_error_oom(session);\n            return SSH_ERROR;\n        }\n\n        if (need_rekey) {\n            /* Send the KEXINIT packet instead.\n             * This recursivelly calls the packet_send(), but it should\n             * not get into rekeying again.\n             * After that we need to handle the key exchange responses\n             * up to the point where we can send the rest of the queue.\n             */\n            return ssh_send_rekex(session);\n        }\n        return SSH_OK;\n    }\n\n    /* Send the packet normally */\n    rc = packet_send2(session);\n\n    /* We finished the key exchange so we can try to send our queue now */\n    if (rc == SSH_OK && type == SSH2_MSG_NEWKEYS) {\n        struct ssh_iterator *it;\n\n        for (it = ssh_list_get_iterator(session->out_queue);\n             it != NULL;\n             it = ssh_list_get_iterator(session->out_queue)) {\n            struct ssh_buffer_struct *next_buffer = NULL;\n\n            /* Peek only -- do not remove from queue yet */\n            next_buffer = (struct ssh_buffer_struct *)it->data;\n            payloadsize = ssh_buffer_get_len(next_buffer);\n            if (ssh_packet_need_rekey(session, payloadsize)) {\n                /* Sigh ... we still can not send this packet. Repeat. */\n                SSH_LOG(SSH_LOG_PACKET, \"Queued packet triggered rekey\");\n                return ssh_send_rekex(session);\n            }\n            SSH_BUFFER_FREE(session->out_buffer);\n            session->out_buffer = ssh_list_pop_head(struct ssh_buffer_struct *,\n                                                    session->out_queue);\n            payload = (uint8_t *)ssh_buffer_get(session->out_buffer);\n            type = payload[0];\n            SSH_LOG(SSH_LOG_PACKET, \"Dequeue packet type %d\", type);\n            rc = packet_send2(session);\n            if (rc != SSH_OK) {\n                return rc;\n            }\n        }\n    }\n\n    return rc;\n}\n\nstatic void\nssh_init_rekey_state(struct ssh_session_struct *session,\n                     struct ssh_cipher_struct *cipher)\n{\n    /* Reset the counters: should be NOOP */\n    cipher->packets = 0;\n    cipher->blocks = 0;\n\n    /* Default rekey limits for ciphers as specified in RFC4344, Section 3.2 */\n    if (cipher->blocksize >= 16) {\n        /* For larger block size (L bits) use maximum of 2**(L/4) blocks */\n        cipher->max_blocks = (uint64_t)1 << (cipher->blocksize*2);\n    } else {\n        /* For smaller blocks use limit of 1 GB as recommended in RFC4253 */\n        cipher->max_blocks = ((uint64_t)1 << 30) / cipher->blocksize;\n    }\n    /* If we have limit provided by user, use the smaller one */\n    if (session->opts.rekey_data != 0) {\n        cipher->max_blocks = MIN(cipher->max_blocks,\n                                 session->opts.rekey_data / cipher->blocksize);\n    }\n\n    SSH_LOG(SSH_LOG_PROTOCOL,\n            \"Set rekey after %\" PRIu64 \" blocks\",\n            cipher->max_blocks);\n}\n\n/*\n * Once we got SSH2_MSG_NEWKEYS we can switch next_crypto and\n * current_crypto for our desired direction\n */\nint\nssh_packet_set_newkeys(ssh_session session,\n                       enum ssh_crypto_direction_e direction)\n{\n    int rc;\n\n    SSH_LOG(SSH_LOG_TRACE,\n            \"called, direction =%s%s\",\n            direction & SSH_DIRECTION_IN ? \" IN \" : \"\",\n            direction & SSH_DIRECTION_OUT ? \" OUT \" : \"\");\n\n    if (session->next_crypto == NULL) {\n        return SSH_ERROR;\n    }\n\n    session->next_crypto->used |= direction;\n    if (session->current_crypto != NULL) {\n        if (session->current_crypto->used & direction) {\n            SSH_LOG(SSH_LOG_WARNING, \"This direction isn't used anymore.\");\n        }\n        /* Mark the current requested direction unused */\n        session->current_crypto->used &= ~direction;\n    }\n\n    /* Both sides switched: do the actual switch now */\n    if (session->next_crypto->used == SSH_DIRECTION_BOTH) {\n        size_t digest_len;\n\n        if (session->current_crypto != NULL) {\n            crypto_free(session->current_crypto);\n            session->current_crypto = NULL;\n        }\n\n        session->current_crypto = session->next_crypto;\n        session->current_crypto->used = SSH_DIRECTION_BOTH;\n\n        /* Initialize the next_crypto structure */\n        session->next_crypto = crypto_new();\n        if (session->next_crypto == NULL) {\n            ssh_set_error_oom(session);\n            return SSH_ERROR;\n        }\n\n        digest_len = session->current_crypto->digest_len;\n        session->next_crypto->session_id = malloc(digest_len);\n        if (session->next_crypto->session_id == NULL) {\n            ssh_set_error_oom(session);\n            return SSH_ERROR;\n        }\n\n        memcpy(session->next_crypto->session_id,\n               session->current_crypto->session_id,\n               digest_len);\n\n        return SSH_OK;\n    }\n\n    /* Initialize common structures so the next context can be used in\n     * either direction */\n    if (session->client) {\n        /* The server has this part already done */\n        rc = ssh_make_sessionid(session);\n        if (rc != SSH_OK) {\n            return SSH_ERROR;\n        }\n\n        /*\n         * Set the cryptographic functions for the next crypto\n         * (it is needed for ssh_generate_session_keys for key lengths)\n         */\n        rc = crypt_set_algorithms_client(session);\n        if (rc < 0) {\n            return SSH_ERROR;\n        }\n    }\n\n    if (ssh_generate_session_keys(session) < 0) {\n        return SSH_ERROR;\n    }\n\n    if (session->next_crypto->in_cipher == NULL ||\n        session->next_crypto->out_cipher == NULL) {\n        return SSH_ERROR;\n    }\n\n    /* Initialize rekeying states */\n    ssh_init_rekey_state(session,\n                         session->next_crypto->out_cipher);\n    ssh_init_rekey_state(session,\n                         session->next_crypto->in_cipher);\n    if (session->opts.rekey_time != 0) {\n        ssh_timestamp_init(&session->last_rekey_time);\n        SSH_LOG(SSH_LOG_PROTOCOL, \"Set rekey after %\" PRIu32 \" seconds\",\n                session->opts.rekey_time/1000);\n    }\n\n    /* Initialize the encryption and decryption keys in next_crypto */\n    rc = session->next_crypto->in_cipher->set_decrypt_key(\n        session->next_crypto->in_cipher,\n        session->next_crypto->decryptkey,\n        session->next_crypto->decryptIV);\n    if (rc < 0) {\n        /* On error, make sure it is not used */\n        session->next_crypto->used = 0;\n        return SSH_ERROR;\n    }\n\n    rc = session->next_crypto->out_cipher->set_encrypt_key(\n        session->next_crypto->out_cipher,\n        session->next_crypto->encryptkey,\n        session->next_crypto->encryptIV);\n    if (rc < 0) {\n        /* On error, make sure it is not used */\n        session->next_crypto->used = 0;\n        return SSH_ERROR;\n    }\n\n    return SSH_OK;\n}\n"
  },
  {
    "path": "src/libssh/src/packet_cb.c",
    "content": "/*\n * packet.c - packet building functions\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2011      Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <stdlib.h>\n#ifdef HAVE_ARPA_INET_H\n#include <arpa/inet.h>\n#endif\n\n#include \"libssh/priv.h\"\n#include \"libssh/buffer.h\"\n#include \"libssh/crypto.h\"\n#include \"libssh/dh.h\"\n#include \"libssh/misc.h\"\n#include \"libssh/packet.h\"\n#include \"libssh/pki.h\"\n#include \"libssh/session.h\"\n#include \"libssh/socket.h\"\n#include \"libssh/ssh2.h\"\n#include \"libssh/curve25519.h\"\n\n/**\n * @internal\n *\n * @brief Handle a SSH_DISCONNECT packet.\n */\nSSH_PACKET_CALLBACK(ssh_packet_disconnect_callback){\n  int rc;\n  uint32_t code = 0;\n  char *error = NULL;\n  ssh_string error_s;\n  (void)user;\n  (void)type;\n\n  rc = ssh_buffer_get_u32(packet, &code);\n  if (rc != 0) {\n    code = ntohl(code);\n  }\n\n  error_s = ssh_buffer_get_ssh_string(packet);\n  if (error_s != NULL) {\n    error = ssh_string_to_char(error_s);\n    SSH_STRING_FREE(error_s);\n  }\n  SSH_LOG(SSH_LOG_PACKET, \"Received SSH_MSG_DISCONNECT %d:%s\",\n                          code, error != NULL ? error : \"no error\");\n  ssh_set_error(session, SSH_FATAL,\n      \"Received SSH_MSG_DISCONNECT: %d:%s\",\n      code, error != NULL ? error : \"no error\");\n  SAFE_FREE(error);\n\n  ssh_socket_close(session->socket);\n  session->alive = 0;\n  session->session_state = SSH_SESSION_STATE_ERROR;\n  /* TODO: handle a graceful disconnect */\n  return SSH_PACKET_USED;\n}\n\n/**\n * @internal\n *\n * @brief Handle a SSH_IGNORE and SSH_DEBUG packet.\n */\nSSH_PACKET_CALLBACK(ssh_packet_ignore_callback){\n    (void)session; /* unused */\n\t(void)user;\n\t(void)type;\n\t(void)packet;\n\tSSH_LOG(SSH_LOG_PROTOCOL,\"Received %s packet\",type==SSH2_MSG_IGNORE ? \"SSH_MSG_IGNORE\" : \"SSH_MSG_DEBUG\");\n\t/* TODO: handle a graceful disconnect */\n\treturn SSH_PACKET_USED;\n}\n\nSSH_PACKET_CALLBACK(ssh_packet_newkeys){\n  ssh_string sig_blob = NULL;\n  ssh_signature sig = NULL;\n  int rc;\n  (void)packet;\n  (void)user;\n  (void)type;\n  SSH_LOG(SSH_LOG_PROTOCOL, \"Received SSH_MSG_NEWKEYS\");\n\n  if (session->session_state != SSH_SESSION_STATE_DH ||\n      session->dh_handshake_state != DH_STATE_NEWKEYS_SENT) {\n      ssh_set_error(session,\n                    SSH_FATAL,\n                    \"ssh_packet_newkeys called in wrong state : %d:%d\",\n                    session->session_state,session->dh_handshake_state);\n      goto error;\n  }\n\n  if(session->server){\n    /* server things are done in server.c */\n    session->dh_handshake_state=DH_STATE_FINISHED;\n  } else {\n    ssh_key server_key;\n\n    /* client */\n\n    /* Verify the host's signature. FIXME do it sooner */\n    sig_blob = session->next_crypto->dh_server_signature;\n    session->next_crypto->dh_server_signature = NULL;\n\n    /* get the server public key */\n    server_key = ssh_dh_get_next_server_publickey(session);\n    if (server_key == NULL) {\n        goto error;\n    }\n\n    rc = ssh_pki_import_signature_blob(sig_blob, server_key, &sig);\n    if (rc != SSH_OK) {\n        goto error;\n    }\n\n    /* Check if signature from server matches user preferences */\n    if (session->opts.wanted_methods[SSH_HOSTKEYS]) {\n        if (!ssh_match_group(session->opts.wanted_methods[SSH_HOSTKEYS],\n                             sig->type_c)) {\n            ssh_set_error(session,\n                          SSH_FATAL,\n                          \"Public key from server (%s) doesn't match user \"\n                          \"preference (%s)\",\n                          sig->type_c,\n                          session->opts.wanted_methods[SSH_HOSTKEYS]);\n            goto error;\n        }\n    }\n\n    rc = ssh_pki_signature_verify(session,\n                                  sig,\n                                  server_key,\n                                  session->next_crypto->secret_hash,\n                                  session->next_crypto->digest_len);\n    ssh_string_burn(sig_blob);\n    SSH_STRING_FREE(sig_blob);\n    ssh_signature_free(sig);\n    if (rc == SSH_ERROR) {\n      goto error;\n    }\n    SSH_LOG(SSH_LOG_PROTOCOL,\"Signature verified and valid\");\n\n    /* When receiving this packet, we switch on the incomming crypto. */\n    rc = ssh_packet_set_newkeys(session, SSH_DIRECTION_IN);\n    if (rc != SSH_OK) {\n        goto error;\n    }\n  }\n  session->dh_handshake_state = DH_STATE_FINISHED;\n  session->ssh_connection_callback(session);\n  return SSH_PACKET_USED;\nerror:\n  session->session_state = SSH_SESSION_STATE_ERROR;\n  return SSH_PACKET_USED;\n}\n\n/**\n * @internal\n * @brief handles a SSH_SERVICE_ACCEPT packet\n *\n */\nSSH_PACKET_CALLBACK(ssh_packet_service_accept){\n\t(void)packet;\n\t(void)type;\n\t(void)user;\n\n    session->auth.service_state = SSH_AUTH_SERVICE_ACCEPTED;\n\tSSH_LOG(SSH_LOG_PACKET,\n\t      \"Received SSH_MSG_SERVICE_ACCEPT\");\n\n\treturn SSH_PACKET_USED;\n}\n\n/**\n * @internal\n * @brief handles a SSH2_MSG_EXT_INFO packet defined in RFC 8308\n *\n */\nSSH_PACKET_CALLBACK(ssh_packet_ext_info)\n{\n    int rc;\n    uint32_t nr_extensions = 0;\n    uint32_t i;\n    (void)type;\n    (void)user;\n\n    SSH_LOG(SSH_LOG_PACKET, \"Received SSH_MSG_EXT_INFO\");\n\n    rc = ssh_buffer_get_u32(packet, &nr_extensions);\n    if (rc == 0) {\n        SSH_LOG(SSH_LOG_PACKET, \"Failed to read number of extensions\");\n        return SSH_PACKET_USED;\n    }\n\n    nr_extensions = ntohl(nr_extensions);\n    if (nr_extensions > 128) {\n        SSH_LOG(SSH_LOG_PACKET, \"Invalid number of extensions\");\n        return SSH_PACKET_USED;\n    }\n\n    SSH_LOG(SSH_LOG_PACKET, \"Follows %u extensions\", nr_extensions);\n\n    for (i = 0; i < nr_extensions; i++) {\n        char *name = NULL;\n        char *value = NULL;\n        int cmp;\n\n        rc = ssh_buffer_unpack(packet, \"ss\", &name, &value);\n        if (rc != SSH_OK) {\n            SSH_LOG(SSH_LOG_PACKET, \"Error reading extension name-value pair\");\n            return SSH_PACKET_USED;\n        }\n\n        cmp = strcmp(name, \"server-sig-algs\");\n        if (cmp == 0) {\n            /* TODO check for NULL bytes */\n            SSH_LOG(SSH_LOG_PACKET, \"Extension: %s=<%s>\", name, value);\n            if (ssh_match_group(value, \"rsa-sha2-512\")) {\n                session->extensions |= SSH_EXT_SIG_RSA_SHA512;\n            }\n            if (ssh_match_group(value, \"rsa-sha2-256\")) {\n                session->extensions |= SSH_EXT_SIG_RSA_SHA256;\n            }\n        }\n        free(name);\n        free(value);\n    }\n\n    return SSH_PACKET_USED;\n}\n"
  },
  {
    "path": "src/libssh/src/packet_crypt.c",
    "content": "/*\n * crypt.c - blowfish-cbc code\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2003 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n#include <assert.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#ifndef _WIN32\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#endif\n\n#ifdef OPENSSL_CRYPTO\n#include <openssl/evp.h>\n#include <openssl/hmac.h>\n#endif\n\n#include \"libssh/priv.h\"\n#include \"libssh/session.h\"\n#include \"libssh/wrapper.h\"\n#include \"libssh/crypto.h\"\n#include \"libssh/buffer.h\"\n#include \"libssh/bytearray.h\"\n\n/** @internal\n * @brief decrypt the packet length from a raw encrypted packet, and store the first decrypted\n * blocksize.\n * @returns native byte-ordered decrypted length of the upcoming packet\n */\nuint32_t ssh_packet_decrypt_len(ssh_session session,\n                                uint8_t *destination,\n                                uint8_t *source)\n{\n    struct ssh_crypto_struct *crypto = NULL;\n    uint32_t decrypted;\n    int rc;\n\n    crypto = ssh_packet_get_current_crypto(session, SSH_DIRECTION_IN);\n    if (crypto != NULL) {\n        if (crypto->in_cipher->aead_decrypt_length != NULL) {\n            rc = crypto->in_cipher->aead_decrypt_length(\n                    crypto->in_cipher, source, destination,\n                    crypto->in_cipher->lenfield_blocksize,\n                    session->recv_seq);\n        } else {\n            rc = ssh_packet_decrypt(\n                    session,\n                    destination,\n                    source,\n                    0,\n                    crypto->in_cipher->blocksize);\n        }\n        if (rc < 0) {\n            return 0;\n        }\n    } else {\n        memcpy(destination, source, 8);\n    }\n    memcpy(&decrypted,destination,sizeof(decrypted));\n\n    return ntohl(decrypted);\n}\n\n/** @internal\n * @brief decrypts the content of an SSH packet.\n * @param[source] source packet, including the encrypted length field\n * @param[start] index in the packet that was not decrypted yet.\n * @param[encrypted_size] size of the encrypted data to be decrypted after start.\n */\nint ssh_packet_decrypt(ssh_session session,\n                       uint8_t *destination,\n                       uint8_t *source,\n                       size_t start,\n                       size_t encrypted_size)\n{\n    struct ssh_crypto_struct *crypto = NULL;\n    struct ssh_cipher_struct *cipher = NULL;\n\n    if (encrypted_size <= 0) {\n        return SSH_ERROR;\n    }\n\n    crypto = ssh_packet_get_current_crypto(session, SSH_DIRECTION_IN);\n    if (crypto == NULL) {\n        return SSH_ERROR;\n    }\n    cipher = crypto->in_cipher;\n\n    if (encrypted_size % cipher->blocksize != 0) {\n        ssh_set_error(session,\n                      SSH_FATAL,\n                      \"Cryptographic functions must be used on multiple of \"\n                      \"blocksize (received %\" PRIdS \")\",\n                      encrypted_size);\n        return SSH_ERROR;\n    }\n\n    if (cipher->aead_decrypt != NULL) {\n        return cipher->aead_decrypt(cipher,\n                                    source,\n                                    destination,\n                                    encrypted_size,\n                                    session->recv_seq);\n    } else {\n        cipher->decrypt(cipher, source + start, destination, encrypted_size);\n    }\n\n    return 0;\n}\n\nunsigned char *ssh_packet_encrypt(ssh_session session, void *data, uint32_t len)\n{\n  struct ssh_crypto_struct *crypto = NULL;\n  struct ssh_cipher_struct *cipher = NULL;\n  HMACCTX ctx = NULL;\n  char *out = NULL;\n  int etm_packet_offset = 0;\n  unsigned int finallen, blocksize;\n  uint32_t seq, lenfield_blocksize;\n  enum ssh_hmac_e type;\n  bool etm;\n\n  assert(len);\n\n  crypto = ssh_packet_get_current_crypto(session, SSH_DIRECTION_OUT);\n  if (crypto == NULL) {\n      return NULL; /* nothing to do here */\n  }\n\n  blocksize = crypto->out_cipher->blocksize;\n  lenfield_blocksize = crypto->out_cipher->lenfield_blocksize;\n\n  type = crypto->out_hmac;\n  etm = crypto->out_hmac_etm;\n\n  if (etm) {\n      etm_packet_offset = sizeof(uint32_t);\n  }\n\n  if ((len - lenfield_blocksize - etm_packet_offset) % blocksize != 0) {\n      ssh_set_error(session, SSH_FATAL, \"Cryptographic functions must be set\"\n                    \" on at least one blocksize (received %d)\", len);\n      return NULL;\n  }\n  out = calloc(1, len);\n  if (out == NULL) {\n    return NULL;\n  }\n\n  seq = ntohl(session->send_seq);\n  cipher = crypto->out_cipher;\n\n  if (cipher->aead_encrypt != NULL) {\n      cipher->aead_encrypt(cipher, data, out, len,\n            crypto->hmacbuf, session->send_seq);\n      memcpy(data, out, len);\n  } else {\n      ctx = hmac_init(crypto->encryptMAC, hmac_key_len(type), type);\n      if (ctx == NULL) {\n        SAFE_FREE(out);\n        return NULL;\n      }\n\n      if (!etm) {\n          hmac_update(ctx, (unsigned char *)&seq, sizeof(uint32_t));\n          hmac_update(ctx, data, len);\n          hmac_final(ctx, crypto->hmacbuf, &finallen, type);\n      }\n\n      cipher->encrypt(cipher, (uint8_t*)data + etm_packet_offset, out, len - etm_packet_offset);\n      memcpy((uint8_t*)data + etm_packet_offset, out, len - etm_packet_offset);\n\n      if (etm) {\n          PUSH_BE_U32(data, 0, len - etm_packet_offset);\n          hmac_update(ctx, (unsigned char *)&seq, sizeof(uint32_t));\n          hmac_update(ctx, data, len);\n          hmac_final(ctx, crypto->hmacbuf, &finallen, type);\n      }\n#ifdef DEBUG_CRYPTO\n      ssh_log_hexdump(\"mac: \", data, len);\n      if (finallen != hmac_digest_len(type)) {\n          printf(\"Final len is %d\\n\", finallen);\n      }\n      ssh_log_hexdump(\"Packet hmac\", crypto->hmacbuf, hmac_digest_len(type));\n#endif\n  }\n  explicit_bzero(out, len);\n  SAFE_FREE(out);\n\n  return crypto->hmacbuf;\n}\n\nstatic int secure_memcmp(const void *s1, const void *s2, size_t n)\n{\n    int rc = 0;\n    const unsigned char *p1 = s1;\n    const unsigned char *p2 = s2;\n    for (; n > 0; --n) {\n        rc |= *p1++ ^ *p2++;\n    }\n    return (rc != 0);\n}\n\n/**\n * @internal\n *\n * @brief Verify the hmac of a packet\n *\n * @param  session      The session to use.\n * @param  data         The pointer to the data to verify the hmac from.\n * @param  len          The length of the given data.\n * @param  mac          The mac to compare with the hmac.\n *\n * @return              0 if hmac and mac are equal, < 0 if not or an error\n *                      occurred.\n */\nint ssh_packet_hmac_verify(ssh_session session,\n                           const void *data,\n                           size_t len,\n                           uint8_t *mac,\n                           enum ssh_hmac_e type)\n{\n  struct ssh_crypto_struct *crypto = NULL;\n  unsigned char hmacbuf[DIGEST_MAX_LEN] = {0};\n  HMACCTX ctx;\n  unsigned int hmaclen;\n  uint32_t seq;\n\n  /* AEAD types have no mac checking */\n  if (type == SSH_HMAC_AEAD_POLY1305 ||\n      type == SSH_HMAC_AEAD_GCM) {\n      return SSH_OK;\n  }\n\n  crypto = ssh_packet_get_current_crypto(session, SSH_DIRECTION_IN);\n  if (crypto == NULL) {\n      return SSH_ERROR;\n  }\n\n  ctx = hmac_init(crypto->decryptMAC, hmac_key_len(type), type);\n  if (ctx == NULL) {\n    return -1;\n  }\n\n  seq = htonl(session->recv_seq);\n\n  hmac_update(ctx, (unsigned char *) &seq, sizeof(uint32_t));\n  hmac_update(ctx, data, len);\n  hmac_final(ctx, hmacbuf, &hmaclen, type);\n\n#ifdef DEBUG_CRYPTO\n  ssh_log_hexdump(\"received mac\",mac,hmaclen);\n  ssh_log_hexdump(\"Computed mac\",hmacbuf,hmaclen);\n  ssh_log_hexdump(\"seq\",(unsigned char *)&seq,sizeof(uint32_t));\n#endif\n  if (secure_memcmp(mac, hmacbuf, hmaclen) == 0) {\n    return 0;\n  }\n\n  return -1;\n}\n"
  },
  {
    "path": "src/libssh/src/pcap.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2009 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n/* pcap.c */\n#include \"config.h\"\n#ifdef WITH_PCAP\n\n#include <stdio.h>\n#ifdef _WIN32\n#include <winsock2.h>\n#include <ws2tcpip.h>\n#else\n#include <netinet/in.h>\n#include <sys/socket.h>\n#endif\n#ifdef HAVE_SYS_TIME_H\n#include <sys/time.h>\n#endif /* HAVE_SYS_TIME_H */\n#include <errno.h>\n#include <stdlib.h>\n\n#include \"libssh/libssh.h\"\n#include \"libssh/pcap.h\"\n#include \"libssh/session.h\"\n#include \"libssh/buffer.h\"\n#include \"libssh/socket.h\"\n\n/**\n * @internal\n *\n * @defgroup libssh_pcap The libssh pcap functions\n * @ingroup libssh\n *\n * The pcap file generation\n *\n *\n * @{\n */\n\n/* The header of a pcap file is the following. We are not going to make it\n * very complicated.\n * Just for information.\n */\nstruct pcap_hdr_s {\n\tuint32_t magic_number;   /* magic number */\n\tuint16_t version_major;  /* major version number */\n\tuint16_t version_minor;  /* minor version number */\n\tint32_t   thiszone;       /* GMT to local correction */\n\tuint32_t sigfigs;        /* accuracy of timestamps */\n\tuint32_t snaplen;        /* max length of captured packets, in octets */\n\tuint32_t network;        /* data link type */\n};\n\n#define PCAP_MAGIC 0xa1b2c3d4\n#define PCAP_VERSION_MAJOR 2\n#define PCAP_VERSION_MINOR 4\n\n#define DLT_RAW         12      /* raw IP */\n\n/* TCP flags */\n#define TH_FIN        0x01\n#define TH_SYN        0x02\n#define TH_RST        0x04\n#define TH_PUSH       0x08\n#define TH_ACK        0x10\n#define TH_URG        0x20\n\n/* The header of a pcap packet.\n * Just for information.\n */\nstruct pcaprec_hdr_s {\n\tuint32_t ts_sec;         /* timestamp seconds */\n\tuint32_t ts_usec;        /* timestamp microseconds */\n\tuint32_t incl_len;       /* number of octets of packet saved in file */\n\tuint32_t orig_len;       /* actual length of packet */\n};\n\n/** @private\n * @brief a pcap context expresses the state of a pcap dump\n * in a SSH session only. Multiple pcap contexts may be used into\n * a single pcap file.\n */\n\nstruct ssh_pcap_context_struct {\n\tssh_session session;\n\tssh_pcap_file file;\n\tint connected;\n\t/* All of these information are useful to generate\n\t * the dummy IP and TCP packets\n\t */\n\tuint32_t ipsource;\n\tuint32_t ipdest;\n\tuint16_t portsource;\n\tuint16_t portdest;\n\tuint32_t outsequence;\n\tuint32_t insequence;\n};\n\n/** @private\n * @brief a pcap file expresses the state of a pcap file which may\n * contain several streams.\n */\nstruct ssh_pcap_file_struct {\n\tFILE *output;\n\tuint16_t ipsequence;\n};\n\n/**\n * @brief create a new ssh_pcap_file object\n */\nssh_pcap_file ssh_pcap_file_new(void) {\n    struct ssh_pcap_file_struct *pcap;\n\n    pcap = (struct ssh_pcap_file_struct *) malloc(sizeof(struct ssh_pcap_file_struct));\n    if (pcap == NULL) {\n        return NULL;\n    }\n    ZERO_STRUCTP(pcap);\n\n    return pcap;\n}\n\n/** @internal\n * @brief writes a packet on file\n */\nstatic int ssh_pcap_file_write(ssh_pcap_file pcap, ssh_buffer packet){\n\tint err;\n\tuint32_t len;\n\tif(pcap == NULL || pcap->output==NULL)\n\t\treturn SSH_ERROR;\n\tlen=ssh_buffer_get_len(packet);\n\terr=fwrite(ssh_buffer_get(packet),len,1,pcap->output);\n\tif(err<0)\n\t\treturn SSH_ERROR;\n\telse\n\t\treturn SSH_OK;\n}\n\n/** @internal\n * @brief prepends a packet with the pcap header and writes packet\n * on file\n */\nint ssh_pcap_file_write_packet(ssh_pcap_file pcap, ssh_buffer packet, uint32_t original_len){\n\tssh_buffer header=ssh_buffer_new();\n\tstruct timeval now;\n\tint err;\n\tif(header == NULL)\n\t\treturn SSH_ERROR;\n\tgettimeofday(&now,NULL);\n    err = ssh_buffer_allocate_size(header,\n                                   sizeof(uint32_t) * 4 +\n                                   ssh_buffer_get_len(packet));\n    if (err < 0) {\n        goto error;\n    }\n    err = ssh_buffer_add_u32(header,htonl(now.tv_sec));\n    if (err < 0) {\n        goto error;\n    }\n    err = ssh_buffer_add_u32(header,htonl(now.tv_usec));\n    if (err < 0) {\n        goto error;\n    }\n    err = ssh_buffer_add_u32(header,htonl(ssh_buffer_get_len(packet)));\n    if (err < 0) {\n        goto error;\n    }\n    err = ssh_buffer_add_u32(header,htonl(original_len));\n    if (err < 0) {\n        goto error;\n    }\n    err = ssh_buffer_add_buffer(header,packet);\n    if (err < 0) {\n        goto error;\n    }\n\terr=ssh_pcap_file_write(pcap,header);\nerror:\n\tSSH_BUFFER_FREE(header);\n\treturn err;\n}\n\n/**\n * @brief opens a new pcap file and create header\n */\nint ssh_pcap_file_open(ssh_pcap_file pcap, const char *filename){\n\tssh_buffer header;\n\tint err;\n\tif(pcap == NULL)\n\t\treturn SSH_ERROR;\n\tif(pcap->output){\n\t\tfclose(pcap->output);\n\t\tpcap->output=NULL;\n\t}\n\tpcap->output=fopen(filename,\"wb\");\n\tif(pcap->output==NULL)\n\t\treturn SSH_ERROR;\n\theader=ssh_buffer_new();\n\tif(header==NULL)\n\t\treturn SSH_ERROR;\n    err = ssh_buffer_allocate_size(header,\n                                   sizeof(uint32_t) * 5 +\n                                   sizeof(uint16_t) * 2);\n    if (err < 0) {\n        goto error;\n    }\n    err = ssh_buffer_add_u32(header,htonl(PCAP_MAGIC));\n    if (err < 0) {\n        goto error;\n    }\n    err = ssh_buffer_add_u16(header,htons(PCAP_VERSION_MAJOR));\n    if (err < 0) {\n        goto error;\n    }\n    err = ssh_buffer_add_u16(header,htons(PCAP_VERSION_MINOR));\n    if (err < 0) {\n        goto error;\n    }\n\t/* currently hardcode GMT to 0 */\n    err = ssh_buffer_add_u32(header,htonl(0));\n    if (err < 0) {\n        goto error;\n    }\n\t/* accuracy */\n    err = ssh_buffer_add_u32(header,htonl(0));\n    if (err < 0) {\n        goto error;\n    }\n\t/* size of the biggest packet */\n    err = ssh_buffer_add_u32(header,htonl(MAX_PACKET_LEN));\n    if (err < 0) {\n        goto error;\n    }\n\t/* we will write sort-of IP */\n    err = ssh_buffer_add_u32(header,htonl(DLT_RAW));\n    if (err < 0) {\n        goto error;\n    }\n\terr=ssh_pcap_file_write(pcap,header);\nerror:\n\tSSH_BUFFER_FREE(header);\n\treturn err;\n}\n\nint ssh_pcap_file_close(ssh_pcap_file pcap){\n\tint err;\n\tif(pcap ==NULL || pcap->output==NULL)\n\t\treturn SSH_ERROR;\n\terr=fclose(pcap->output);\n\tpcap->output=NULL;\n\tif(err != 0)\n\t\treturn SSH_ERROR;\n\telse\n\t\treturn SSH_OK;\n}\n\nvoid ssh_pcap_file_free(ssh_pcap_file pcap){\n\tssh_pcap_file_close(pcap);\n\tSAFE_FREE(pcap);\n}\n\n\n/** @internal\n * @brief allocates a new ssh_pcap_context object\n */\n\nssh_pcap_context ssh_pcap_context_new(ssh_session session){\n\tssh_pcap_context ctx = (struct ssh_pcap_context_struct *) malloc(sizeof(struct ssh_pcap_context_struct));\n\tif(ctx==NULL){\n\t\tssh_set_error_oom(session);\n\t\treturn NULL;\n\t}\n\tZERO_STRUCTP(ctx);\n\tctx->session=session;\n\treturn ctx;\n}\n\nvoid ssh_pcap_context_free(ssh_pcap_context ctx){\n\tSAFE_FREE(ctx);\n}\n\nvoid ssh_pcap_context_set_file(ssh_pcap_context ctx, ssh_pcap_file pcap){\n\tctx->file=pcap;\n}\n\n/** @internal\n * @brief sets the IP and port parameters in the connection\n */\nstatic int ssh_pcap_context_connect(ssh_pcap_context ctx)\n{\n    ssh_session session=ctx->session;\n    struct sockaddr_in local = {\n        .sin_family = AF_UNSPEC,\n    };\n    struct sockaddr_in remote = {\n        .sin_family = AF_UNSPEC,\n    };\n    socket_t fd;\n    socklen_t len;\n    int rc;\n\n    if (session == NULL) {\n        return SSH_ERROR;\n    }\n\n    if (session->socket == NULL) {\n        return SSH_ERROR;\n    }\n\n    fd = ssh_socket_get_fd(session->socket);\n\n    /* TODO: adapt for windows */\n    if (fd < 0) {\n        return SSH_ERROR;\n    }\n\n    len = sizeof(local);\n    rc = getsockname(fd, (struct sockaddr *)&local, &len);\n    if (rc < 0) {\n        ssh_set_error(session,\n                      SSH_REQUEST_DENIED,\n                      \"Getting local IP address: %s\",\n                      strerror(errno));\n        return SSH_ERROR;\n    }\n\n    len = sizeof(remote);\n    rc = getpeername(fd, (struct sockaddr *)&remote, &len);\n    if (rc < 0) {\n        ssh_set_error(session,\n                      SSH_REQUEST_DENIED,\n                      \"Getting remote IP address: %s\",\n                      strerror(errno));\n        return SSH_ERROR;\n    }\n\n    if (local.sin_family != AF_INET) {\n        ssh_set_error(session,\n                      SSH_REQUEST_DENIED,\n                      \"Only IPv4 supported for pcap logging\");\n        return SSH_ERROR;\n    }\n\n    memcpy(&ctx->ipsource, &local.sin_addr, sizeof(ctx->ipsource));\n    memcpy(&ctx->ipdest, &remote.sin_addr, sizeof(ctx->ipdest));\n    memcpy(&ctx->portsource, &local.sin_port, sizeof(ctx->portsource));\n    memcpy(&ctx->portdest, &remote.sin_port, sizeof(ctx->portdest));\n\n    ctx->connected = 1;\n    return SSH_OK;\n}\n\n#define IPHDR_LEN 20\n#define TCPHDR_LEN 20\n#define TCPIPHDR_LEN (IPHDR_LEN + TCPHDR_LEN)\n/** @internal\n * @brief write a SSH packet as a TCP over IP in a pcap file\n * @param ctx open pcap context\n * @param direction SSH_PCAP_DIRECTION_IN if the packet has been received\n * @param direction SSH_PCAP_DIRECTION_OUT if the packet has been emitted\n * @param data pointer to the data to write\n * @param len data to write in the pcap file. May be smaller than origlen.\n * @param origlen number of bytes of complete data.\n * @returns SSH_OK write is successful\n * @returns SSH_ERROR an error happened.\n */\nint ssh_pcap_context_write(ssh_pcap_context ctx,\n                           enum ssh_pcap_direction direction,\n\t\t           void *data,\n                           uint32_t len,\n                           uint32_t origlen)\n{\n    ssh_buffer ip;\n    int rc;\n\n    if (ctx == NULL || ctx->file == NULL) {\n        return SSH_ERROR;\n    }\n    if (ctx->connected == 0) {\n        if (ssh_pcap_context_connect(ctx) == SSH_ERROR) {\n            return SSH_ERROR;\n        }\n    }\n    ip = ssh_buffer_new();\n    if (ip == NULL) {\n        ssh_set_error_oom(ctx->session);\n        return SSH_ERROR;\n    }\n\n    /* build an IP packet */\n    rc = ssh_buffer_pack(ip,\n                         \"bbwwwbbw\",\n                         4 << 4 | 5, /* V4, 20 bytes */\n                         0,          /* tos */\n                         origlen + TCPIPHDR_LEN, /* total len */\n                         ctx->file->ipsequence,  /* IP id number */\n                         0,          /* fragment offset */\n                         64,         /* TTL */\n                         6,          /* protocol TCP=6 */\n                         0);         /* checksum */\n\n    ctx->file->ipsequence++;\n    if (rc != SSH_OK){\n        goto error;\n    }\n    if (direction == SSH_PCAP_DIR_OUT) {\n        rc = ssh_buffer_add_u32(ip, ctx->ipsource);\n        if (rc < 0) {\n            goto error;\n        }\n        rc = ssh_buffer_add_u32(ip, ctx->ipdest);\n        if (rc < 0) {\n            goto error;\n        }\n    } else {\n        rc = ssh_buffer_add_u32(ip, ctx->ipdest);\n        if (rc < 0) {\n            goto error;\n        }\n        rc = ssh_buffer_add_u32(ip, ctx->ipsource);\n        if (rc < 0) {\n            goto error;\n        }\n    }\n    /* TCP */\n    if (direction == SSH_PCAP_DIR_OUT) {\n        rc = ssh_buffer_add_u16(ip, ctx->portsource);\n        if (rc < 0) {\n            goto error;\n        }\n        rc = ssh_buffer_add_u16(ip, ctx->portdest);\n        if (rc < 0) {\n            goto error;\n        }\n    } else {\n        rc = ssh_buffer_add_u16(ip, ctx->portdest);\n        if (rc < 0) {\n            goto error;\n        }\n        rc = ssh_buffer_add_u16(ip, ctx->portsource);\n        if (rc < 0) {\n            goto error;\n        }\n    }\n    /* sequence number */\n    if (direction == SSH_PCAP_DIR_OUT) {\n        rc = ssh_buffer_pack(ip, \"d\", ctx->outsequence);\n        if (rc != SSH_OK) {\n            goto error;\n        }\n        ctx->outsequence += origlen;\n    } else {\n        rc = ssh_buffer_pack(ip, \"d\", ctx->insequence);\n        if (rc != SSH_OK) {\n            goto error;\n        }\n        ctx->insequence += origlen;\n    }\n    /* ack number */\n    if (direction == SSH_PCAP_DIR_OUT) {\n        rc = ssh_buffer_pack(ip, \"d\", ctx->insequence);\n        if (rc != SSH_OK) {\n            goto error;\n        }\n    } else {\n        rc = ssh_buffer_pack(ip, \"d\", ctx->outsequence);\n        if (rc != SSH_OK) {\n            goto error;\n        }\n    }\n\n    rc = ssh_buffer_pack(ip,\n                         \"bbwwwP\",\n                         5 << 4,             /* header len = 20 = 5 * 32 bits, at offset 4*/\n                         TH_PUSH | TH_ACK,   /* flags */\n                         65535,              /* window */\n                         0,                  /* checksum */\n                         0,                  /* urgent data ptr */\n                         (size_t)len, data); /* actual data */\n    if (rc != SSH_OK) {\n        goto error;\n    }\n    rc = ssh_pcap_file_write_packet(ctx->file, ip, origlen + TCPIPHDR_LEN);\n\nerror:\n    SSH_BUFFER_FREE(ip);\n    return rc;\n}\n\n/** @brief sets the pcap file used to trace the session\n * @param current session\n * @param pcap an handler to a pcap file. A pcap file may be used in several\n * sessions.\n * @returns SSH_ERROR in case of error, SSH_OK otherwise.\n */\nint ssh_set_pcap_file(ssh_session session, ssh_pcap_file pcap){\n\tssh_pcap_context ctx=ssh_pcap_context_new(session);\n\tif(ctx==NULL){\n\t\tssh_set_error_oom(session);\n\t\treturn SSH_ERROR;\n\t}\n\tctx->file=pcap;\n\tif(session->pcap_ctx)\n\t\tssh_pcap_context_free(session->pcap_ctx);\n\tsession->pcap_ctx=ctx;\n\treturn SSH_OK;\n}\n\n\n#else /* WITH_PCAP */\n\n/* Simple stub returning errors when no pcap compiled in */\n\n#include \"libssh/libssh.h\"\n#include \"libssh/priv.h\"\n\nint ssh_pcap_file_close(ssh_pcap_file pcap){\n\t(void) pcap;\n\treturn SSH_ERROR;\n}\n\nvoid ssh_pcap_file_free(ssh_pcap_file pcap){\n\t(void) pcap;\n}\n\nssh_pcap_file ssh_pcap_file_new(void){\n\treturn NULL;\n}\nint ssh_pcap_file_open(ssh_pcap_file pcap, const char *filename){\n\t(void) pcap;\n\t(void) filename;\n\treturn SSH_ERROR;\n}\n\nint ssh_set_pcap_file(ssh_session session, ssh_pcap_file pcapfile){\n\t(void) pcapfile;\n\tssh_set_error(session,SSH_REQUEST_DENIED,\"Pcap support not compiled in\");\n\treturn SSH_ERROR;\n}\n\n#endif\n\n/** @} */\n"
  },
  {
    "path": "src/libssh/src/pki.c",
    "content": "/*\n * pki.c\n * This file is part of the SSH Library\n *\n * Copyright (c) 2010 by Aris Adamantiadis\n * Copyright (c) 2011-2013 Andreas Schneider <asn@cryptomilk.org>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n/**\n * @defgroup libssh_pki The SSH Public Key Infrastructure\n * @ingroup libssh\n *\n * Functions for the creation, importation and manipulation of public and\n * private keys in the context of the SSH protocol\n *\n * @{\n */\n\n#include \"config.h\"\n\n#include <errno.h>\n#include <ctype.h>\n#include <stdio.h>\n#include <fcntl.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n\n#ifdef _WIN32\n# ifdef HAVE_IO_H\n#  include <io.h>\n#  undef open\n#  define open _open\n#  undef close\n#  define close _close\n#  undef read\n#  define read _read\n#  undef unlink\n#  define unlink _unlink\n# endif /* HAVE_IO_H */\n#endif\n\n#include \"libssh/libssh.h\"\n#include \"libssh/session.h\"\n#include \"libssh/priv.h\"\n#include \"libssh/pki.h\"\n#include \"libssh/pki_priv.h\"\n#include \"libssh/keys.h\"\n#include \"libssh/buffer.h\"\n#include \"libssh/misc.h\"\n#include \"libssh/agent.h\"\n\nenum ssh_keytypes_e pki_privatekey_type_from_string(const char *privkey)\n{\n    char *start = NULL;\n\n    start = strstr(privkey, DSA_HEADER_BEGIN);\n    if (start != NULL) {\n        return SSH_KEYTYPE_DSS;\n    }\n\n    start = strstr(privkey, RSA_HEADER_BEGIN);\n    if (start != NULL) {\n        return SSH_KEYTYPE_RSA;\n    }\n\n    start = strstr(privkey, ECDSA_HEADER_BEGIN);\n    if (start != 0) {\n        /* We don't know what the curve is at this point, so we don't actually\n         * know the type. We figure out the actual curve and fix things up in\n         * pki_private_key_from_base64 */\n        return SSH_KEYTYPE_ECDSA_P256;\n    }\n\n    return SSH_KEYTYPE_UNKNOWN;\n}\n\n/**\n * @brief returns the ECDSA key name (\"ecdsa-sha2-nistp256\" for example)\n *\n * @param[in] key the ssh_key whose ECDSA name to get\n *\n * @returns the ECDSA key name (\"ecdsa-sha2-nistp256\" for example)\n *\n * @returns \"unknown\" if the ECDSA key name is not known\n */\nconst char *ssh_pki_key_ecdsa_name(const ssh_key key)\n{\n    if (key == NULL) {\n        return NULL;\n    }\n\n#ifdef HAVE_ECC /* FIXME Better ECC check needed */\n    return pki_key_ecdsa_nid_to_name(key->ecdsa_nid);\n#else\n    return NULL;\n#endif\n}\n\n/**\n * @brief creates a new empty SSH key\n * @returns an empty ssh_key handle, or NULL on error.\n */\nssh_key ssh_key_new (void) {\n  ssh_key ptr = malloc (sizeof (struct ssh_key_struct));\n  if (ptr == NULL) {\n      return NULL;\n  }\n  ZERO_STRUCTP(ptr);\n  return ptr;\n}\n\nssh_key ssh_key_dup(const ssh_key key)\n{\n    if (key == NULL) {\n        return NULL;\n    }\n\n    return pki_key_dup(key, 0);\n}\n\n/**\n * @brief clean up the key and deallocate all existing keys\n * @param[in] key ssh_key to clean\n */\nvoid ssh_key_clean (ssh_key key){\n    if(key == NULL)\n        return;\n#ifdef HAVE_LIBGCRYPT\n    if(key->dsa) gcry_sexp_release(key->dsa);\n    if(key->rsa) gcry_sexp_release(key->rsa);\n    if(key->ecdsa) gcry_sexp_release(key->ecdsa);\n#elif defined HAVE_LIBCRYPTO\n    if(key->dsa) DSA_free(key->dsa);\n    if(key->rsa) RSA_free(key->rsa);\n#ifdef HAVE_OPENSSL_ECC\n    if(key->ecdsa) EC_KEY_free(key->ecdsa);\n#endif /* HAVE_OPENSSL_ECC */\n#elif defined HAVE_LIBMBEDCRYPTO\n    if (key->rsa != NULL) {\n        mbedtls_pk_free(key->rsa);\n        SAFE_FREE(key->rsa);\n    }\n\n    if (key->ecdsa != NULL) {\n        mbedtls_ecdsa_free(key->ecdsa);\n        SAFE_FREE(key->ecdsa);\n    }\n#endif\n    if (key->ed25519_privkey != NULL){\n#ifdef HAVE_OPENSSL_ED25519\n        /* In OpenSSL implementation the private key is only the private\n         * original seed. In the internal implementation the private key is the\n         * concatenation of the original private seed with the public key.*/\n        explicit_bzero(key->ed25519_privkey, ED25519_KEY_LEN);\n#else\n        explicit_bzero(key->ed25519_privkey, sizeof(ed25519_privkey));\n#endif\n        SAFE_FREE(key->ed25519_privkey);\n    }\n    SAFE_FREE(key->ed25519_pubkey);\n    if (key->cert != NULL) {\n        SSH_BUFFER_FREE(key->cert);\n    }\n    key->cert_type = SSH_KEYTYPE_UNKNOWN;\n    key->flags=SSH_KEY_FLAG_EMPTY;\n    key->type=SSH_KEYTYPE_UNKNOWN;\n    key->ecdsa_nid = 0;\n    key->type_c=NULL;\n    key->dsa = NULL;\n    key->rsa = NULL;\n    key->ecdsa = NULL;\n}\n\n/**\n * @brief deallocate a SSH key\n * @param[in] key ssh_key handle to free\n */\nvoid ssh_key_free (ssh_key key){\n    if(key){\n        ssh_key_clean(key);\n        SAFE_FREE(key);\n    }\n}\n\n/**\n * @brief returns the type of a ssh key\n * @param[in] key the ssh_key handle\n * @returns one of SSH_KEYTYPE_RSA, SSH_KEYTYPE_DSS,\n *          SSH_KEYTYPE_ECDSA_P256, SSH_KEYTYPE_ECDSA_P384,\n *          SSH_KEYTYPE_ECDSA_P521, SSH_KEYTYPE_ED25519, SSH_KEYTYPE_DSS_CERT01,\n *          SSH_KEYTYPE_RSA_CERT01, SSH_KEYTYPE_ECDSA_P256_CERT01,\n *          SSH_KEYTYPE_ECDSA_P384_CERT01, SSH_KEYTYPE_ECDSA_P521_CERT01, or\n *          SSH_KEYTYPE_ED25519_CERT01.\n * @returns SSH_KEYTYPE_UNKNOWN if the type is unknown\n */\nenum ssh_keytypes_e ssh_key_type(const ssh_key key){\n    if (key == NULL) {\n        return SSH_KEYTYPE_UNKNOWN;\n    }\n    return key->type;\n}\n\n/**\n * @brief Convert a signature type to a string.\n *\n * @param[in]  type     The algorithm type to convert.\n *\n * @return              A string for the keytype or NULL if unknown.\n */\nconst char *\nssh_key_signature_to_char(enum ssh_keytypes_e type,\n                          enum ssh_digest_e hash_type)\n{\n    switch (type) {\n    case SSH_KEYTYPE_RSA:\n        switch (hash_type) {\n        case SSH_DIGEST_SHA256:\n            return \"rsa-sha2-256\";\n        case SSH_DIGEST_SHA512:\n            return \"rsa-sha2-512\";\n        case SSH_DIGEST_SHA1:\n        case SSH_DIGEST_AUTO:\n            return \"ssh-rsa\";\n        default:\n            return NULL;\n        }\n        break;\n    case SSH_KEYTYPE_RSA_CERT01:\n        switch (hash_type) {\n        case SSH_DIGEST_SHA256:\n            return \"rsa-sha2-256-cert-v01@openssh.com\";\n        case SSH_DIGEST_SHA512:\n            return \"rsa-sha2-512-cert-v01@openssh.com\";\n        case SSH_DIGEST_SHA1:\n        case SSH_DIGEST_AUTO:\n            return \"ssh-rsa-cert-v01@openssh.com\";\n        default:\n            return NULL;\n        }\n        break;\n    default:\n        return ssh_key_type_to_char(type);\n    }\n\n    /* We should never reach this */\n    return NULL;\n}\n\n/**\n * @brief Convert a key type to a string.\n *\n * @param[in]  type     The type to convert.\n *\n * @return              A string for the keytype or NULL if unknown.\n */\nconst char *ssh_key_type_to_char(enum ssh_keytypes_e type) {\n  switch (type) {\n    case SSH_KEYTYPE_DSS:\n      return \"ssh-dss\";\n    case SSH_KEYTYPE_RSA:\n      return \"ssh-rsa\";\n    case SSH_KEYTYPE_ECDSA:\n      return \"ssh-ecdsa\"; /* deprecated. invalid value */\n    case SSH_KEYTYPE_ECDSA_P256:\n      return \"ecdsa-sha2-nistp256\";\n    case SSH_KEYTYPE_ECDSA_P384:\n      return \"ecdsa-sha2-nistp384\";\n    case SSH_KEYTYPE_ECDSA_P521:\n      return \"ecdsa-sha2-nistp521\";\n    case SSH_KEYTYPE_ED25519:\n      return \"ssh-ed25519\";\n    case SSH_KEYTYPE_DSS_CERT01:\n      return \"ssh-dss-cert-v01@openssh.com\";\n    case SSH_KEYTYPE_RSA_CERT01:\n      return \"ssh-rsa-cert-v01@openssh.com\";\n    case SSH_KEYTYPE_ECDSA_P256_CERT01:\n      return \"ecdsa-sha2-nistp256-cert-v01@openssh.com\";\n    case SSH_KEYTYPE_ECDSA_P384_CERT01:\n      return \"ecdsa-sha2-nistp384-cert-v01@openssh.com\";\n    case SSH_KEYTYPE_ECDSA_P521_CERT01:\n      return \"ecdsa-sha2-nistp521-cert-v01@openssh.com\";\n    case SSH_KEYTYPE_ED25519_CERT01:\n      return \"ssh-ed25519-cert-v01@openssh.com\";\n    case SSH_KEYTYPE_RSA1:\n    case SSH_KEYTYPE_UNKNOWN:\n      return NULL;\n  }\n\n  /* We should never reach this */\n  return NULL;\n}\n\nenum ssh_digest_e ssh_key_hash_from_name(const char *name)\n{\n    if (name == NULL) {\n        /* TODO we should rather fail */\n        return SSH_DIGEST_AUTO;\n    }\n\n    if (strcmp(name, \"ssh-rsa\") == 0) {\n        return SSH_DIGEST_SHA1;\n    } else if (strcmp(name, \"ssh-dss\") == 0) {\n        return SSH_DIGEST_SHA1;\n    } else if (strcmp(name, \"rsa-sha2-256\") == 0) {\n        return SSH_DIGEST_SHA256;\n    } else if (strcmp(name, \"rsa-sha2-512\") == 0) {\n        return SSH_DIGEST_SHA512;\n    } else if (strcmp(name, \"ecdsa-sha2-nistp256\") == 0) {\n        return SSH_DIGEST_SHA256;\n    } else if (strcmp(name, \"ecdsa-sha2-nistp384\") == 0) {\n        return SSH_DIGEST_SHA384;\n    } else if (strcmp(name, \"ecdsa-sha2-nistp521\") == 0) {\n        return SSH_DIGEST_SHA512;\n    } else if (strcmp(name, \"ssh-ed25519\") == 0) {\n        return SSH_DIGEST_AUTO;\n    }\n\n    SSH_LOG(SSH_LOG_WARN, \"Unknown signature name %s\", name);\n\n    /* TODO we should rather fail */\n    return SSH_DIGEST_AUTO;\n}\n\n/**\n * @brief Checks the given key against the configured allowed\n * public key algorithm types\n *\n * @param[in] session The SSH session\n * @param[in] type    The key algorithm to check\n * @returns           1 if the key algorithm is allowed, 0 otherwise\n */\nint ssh_key_algorithm_allowed(ssh_session session, const char *type)\n{\n    const char *allowed_list;\n\n    if (session->client) {\n        allowed_list = session->opts.pubkey_accepted_types;\n        if (allowed_list == NULL) {\n            if (ssh_fips_mode()) {\n                allowed_list = ssh_kex_get_fips_methods(SSH_HOSTKEYS);\n            } else {\n                allowed_list = ssh_kex_get_default_methods(SSH_HOSTKEYS);\n            }\n        }\n    }\n#ifdef WITH_SERVER\n    else if (session->server) {\n        allowed_list = session->opts.wanted_methods[SSH_HOSTKEYS];\n        if (allowed_list == NULL) {\n            SSH_LOG(SSH_LOG_WARN, \"Session invalid: no host key available\");\n            return 0;\n        }\n    }\n#endif\n    else {\n        SSH_LOG(SSH_LOG_WARN, \"Session invalid: not set as client nor server\");\n        return 0;\n    }\n\n    SSH_LOG(SSH_LOG_DEBUG, \"Checking %s with list <%s>\", type, allowed_list);\n    return ssh_match_group(allowed_list, type);\n}\n\n/**\n * @brief Convert a key type to a hash type. This is usually unambiguous\n * for all the key types, unless the SHA2 extension (RFC 8332) is\n * negotiated during key exchange.\n *\n * @param[in]  session  SSH Session.\n *\n * @param[in]  type     The type to convert.\n *\n * @return              A hash type to be used.\n */\nenum ssh_digest_e ssh_key_type_to_hash(ssh_session session,\n                                       enum ssh_keytypes_e type)\n{\n    switch (type) {\n    case SSH_KEYTYPE_DSS_CERT01:\n    case SSH_KEYTYPE_DSS:\n        return SSH_DIGEST_SHA1;\n    case SSH_KEYTYPE_RSA_CERT01:\n        /* If we are talking to an old OpenSSH version which does not support\n         * SHA2 in certificates */\n        if ((session->openssh > 0) &&\n            (session->openssh < SSH_VERSION_INT(7, 2, 0)))\n        {\n            SSH_LOG(SSH_LOG_DEBUG,\n                    \"We are talking to an old OpenSSH (%x); \"\n                    \"returning SSH_DIGEST_SHA1\",\n                    session->openssh);\n\n            return SSH_DIGEST_SHA1;\n        }\n        FALL_THROUGH;\n    case SSH_KEYTYPE_RSA:\n        if (ssh_key_algorithm_allowed(session, \"rsa-sha2-512\") &&\n            (session->extensions & SSH_EXT_SIG_RSA_SHA512)) {\n            return SSH_DIGEST_SHA512;\n        }\n\n        if (ssh_key_algorithm_allowed(session, \"rsa-sha2-256\") &&\n            (session->extensions & SSH_EXT_SIG_RSA_SHA256)) {\n            return SSH_DIGEST_SHA256;\n        }\n\n        /* Default algorithm for RSA is SHA1 */\n        return SSH_DIGEST_SHA1;\n\n    case SSH_KEYTYPE_ECDSA_P256_CERT01:\n    case SSH_KEYTYPE_ECDSA_P256:\n        return SSH_DIGEST_SHA256;\n    case SSH_KEYTYPE_ECDSA_P384_CERT01:\n    case SSH_KEYTYPE_ECDSA_P384:\n        return SSH_DIGEST_SHA384;\n    case SSH_KEYTYPE_ECDSA_P521_CERT01:\n    case SSH_KEYTYPE_ECDSA_P521:\n        return SSH_DIGEST_SHA512;\n    case SSH_KEYTYPE_ED25519_CERT01:\n    case SSH_KEYTYPE_ED25519:\n        return SSH_DIGEST_AUTO;\n    case SSH_KEYTYPE_RSA1:\n    case SSH_KEYTYPE_ECDSA:\n    case SSH_KEYTYPE_UNKNOWN:\n    default:\n        SSH_LOG(SSH_LOG_WARN, \"Digest algorithm to be used with key type %u \"\n                \"is not defined\", type);\n    }\n\n    /* We should never reach this */\n    return SSH_DIGEST_AUTO;\n}\n\n/**\n * @brief Gets signature algorithm name to be used with the given\n *        key type.\n *\n * @param[in]  session  SSH session.\n * @param[in]  type     The algorithm type to convert.\n *\n * @return              A string for the keytype or NULL if unknown.\n */\nconst char *\nssh_key_get_signature_algorithm(ssh_session session,\n                                enum ssh_keytypes_e type)\n{\n    enum ssh_digest_e hash_type;\n\n    if (type == SSH_KEYTYPE_RSA_CERT01) {\n        /* If we are talking to an old OpenSSH version which does not support\n         * rsa-sha2-{256,512}-cert-v01@openssh.com */\n        if ((session->openssh > 0) &&\n            (session->openssh < SSH_VERSION_INT(7, 8, 0)))\n        {\n            SSH_LOG(SSH_LOG_DEBUG,\n                    \"We are talking to an old OpenSSH (%x); \"\n                    \"using old cert format\",\n                    session->openssh);\n\n            return \"ssh-rsa-cert-v01@openssh.com\";\n        }\n    }\n\n    hash_type = ssh_key_type_to_hash(session, type);\n\n    return ssh_key_signature_to_char(type, hash_type);\n}\n\n/**\n * @brief Convert a ssh key algorithm name to a ssh key algorithm type.\n *\n * @param[in] name      The name to convert.\n *\n * @return              The enum ssh key algorithm type.\n */\nenum ssh_keytypes_e ssh_key_type_from_signature_name(const char *name) {\n    if (name == NULL) {\n        return SSH_KEYTYPE_UNKNOWN;\n    }\n\n    if ((strcmp(name, \"rsa-sha2-256\") == 0) ||\n        (strcmp(name, \"rsa-sha2-512\") == 0)) {\n        return SSH_KEYTYPE_RSA;\n    }\n\n    /* Otherwise the key type matches the signature type */\n    return ssh_key_type_from_name(name);\n}\n\n/**\n * @brief Convert a ssh key name to a ssh key type.\n *\n * @param[in] name      The name to convert.\n *\n * @return              The enum ssh key type.\n */\nenum ssh_keytypes_e ssh_key_type_from_name(const char *name) {\n    if (name == NULL) {\n        return SSH_KEYTYPE_UNKNOWN;\n    }\n\n    if (strcmp(name, \"rsa\") == 0) {\n        return SSH_KEYTYPE_RSA;\n    } else if (strcmp(name, \"dsa\") == 0) {\n        return SSH_KEYTYPE_DSS;\n    } else if (strcmp(name, \"ssh-rsa\") == 0) {\n        return SSH_KEYTYPE_RSA;\n    } else if (strcmp(name, \"ssh-dss\") == 0) {\n        return SSH_KEYTYPE_DSS;\n    } else if (strcmp(name, \"ssh-ecdsa\") == 0\n            || strcmp(name, \"ecdsa\") == 0\n            || strcmp(name, \"ecdsa-sha2-nistp256\") == 0) {\n        return SSH_KEYTYPE_ECDSA_P256;\n    } else if (strcmp(name, \"ecdsa-sha2-nistp384\") == 0) {\n        return SSH_KEYTYPE_ECDSA_P384;\n    } else if (strcmp(name, \"ecdsa-sha2-nistp521\") == 0) {\n        return SSH_KEYTYPE_ECDSA_P521;\n    } else if (strcmp(name, \"ssh-ed25519\") == 0){\n        return SSH_KEYTYPE_ED25519;\n    } else if (strcmp(name, \"ssh-dss-cert-v01@openssh.com\") == 0) {\n        return SSH_KEYTYPE_DSS_CERT01;\n    } else if (strcmp(name, \"ssh-rsa-cert-v01@openssh.com\") == 0) {\n        return SSH_KEYTYPE_RSA_CERT01;\n    } else if (strcmp(name, \"ecdsa-sha2-nistp256-cert-v01@openssh.com\") == 0) {\n        return SSH_KEYTYPE_ECDSA_P256_CERT01;\n    } else if (strcmp(name, \"ecdsa-sha2-nistp384-cert-v01@openssh.com\") == 0) {\n        return SSH_KEYTYPE_ECDSA_P384_CERT01;\n    } else if (strcmp(name, \"ecdsa-sha2-nistp521-cert-v01@openssh.com\") == 0) {\n        return SSH_KEYTYPE_ECDSA_P521_CERT01;\n    } else if (strcmp(name, \"ssh-ed25519-cert-v01@openssh.com\") == 0) {\n        return SSH_KEYTYPE_ED25519_CERT01;\n    }\n\n    return SSH_KEYTYPE_UNKNOWN;\n}\n\n/**\n * @brief Get the pubic key type corresponding to a certificate type.\n *\n * @param[in] type   The certificate or public key type.\n *\n * @return           The matching public key type.\n */\nenum ssh_keytypes_e ssh_key_type_plain(enum ssh_keytypes_e type) {\n    switch (type) {\n        case SSH_KEYTYPE_DSS_CERT01:\n            return SSH_KEYTYPE_DSS;\n        case SSH_KEYTYPE_RSA_CERT01:\n            return SSH_KEYTYPE_RSA;\n        case SSH_KEYTYPE_ECDSA_P256_CERT01:\n            return SSH_KEYTYPE_ECDSA_P256;\n        case SSH_KEYTYPE_ECDSA_P384_CERT01:\n            return SSH_KEYTYPE_ECDSA_P384;\n        case SSH_KEYTYPE_ECDSA_P521_CERT01:\n            return SSH_KEYTYPE_ECDSA_P521;\n        case SSH_KEYTYPE_ED25519_CERT01:\n            return SSH_KEYTYPE_ED25519;\n        default:\n            return type;\n    }\n}\n\n/**\n * @brief Check if the key has/is a public key.\n *\n * @param[in] k         The key to check.\n *\n * @return              1 if it is a public key, 0 if not.\n */\nint ssh_key_is_public(const ssh_key k) {\n    if (k == NULL) {\n        return 0;\n    }\n\n    return (k->flags & SSH_KEY_FLAG_PUBLIC) == SSH_KEY_FLAG_PUBLIC;\n}\n\n/**\n * @brief Check if the key is a private key.\n *\n * @param[in] k         The key to check.\n *\n * @return              1 if it is a private key, 0 if not.\n */\nint ssh_key_is_private(const ssh_key k) {\n    if (k == NULL) {\n        return 0;\n    }\n\n    return (k->flags & SSH_KEY_FLAG_PRIVATE) == SSH_KEY_FLAG_PRIVATE;\n}\n\n/**\n * @brief Compare keys if they are equal.\n *\n * @param[in] k1        The first key to compare.\n *\n * @param[in] k2        The second key to compare.\n *\n * @param[in] what      What part or type of the key do you want to compare.\n *\n * @return              0 if equal, 1 if not.\n */\nint ssh_key_cmp(const ssh_key k1,\n                const ssh_key k2,\n                enum ssh_keycmp_e what)\n{\n    if (k1 == NULL || k2 == NULL) {\n        return 1;\n    }\n\n    if (k1->type != k2->type) {\n        SSH_LOG(SSH_LOG_WARN, \"key types don't match!\");\n        return 1;\n    }\n\n    if (what == SSH_KEY_CMP_PRIVATE) {\n        if (!ssh_key_is_private(k1) ||\n            !ssh_key_is_private(k2)) {\n            return 1;\n        }\n    }\n\n    if (k1->type == SSH_KEYTYPE_ED25519) {\n        return pki_ed25519_key_cmp(k1, k2, what);\n    }\n\n    return pki_key_compare(k1, k2, what);\n}\n\nssh_signature ssh_signature_new(void)\n{\n    struct ssh_signature_struct *sig;\n\n    sig = malloc(sizeof(struct ssh_signature_struct));\n    if (sig == NULL) {\n        return NULL;\n    }\n    ZERO_STRUCTP(sig);\n\n    return sig;\n}\n\nvoid ssh_signature_free(ssh_signature sig)\n{\n    if (sig == NULL) {\n        return;\n    }\n\n    switch(sig->type) {\n        case SSH_KEYTYPE_DSS:\n#ifdef HAVE_LIBGCRYPT\n            gcry_sexp_release(sig->dsa_sig);\n#endif\n            break;\n        case SSH_KEYTYPE_RSA:\n#ifdef HAVE_LIBGCRYPT\n            gcry_sexp_release(sig->rsa_sig);\n#elif defined HAVE_LIBMBEDCRYPTO\n            SAFE_FREE(sig->rsa_sig);\n#endif\n            break;\n        case SSH_KEYTYPE_ECDSA_P256:\n        case SSH_KEYTYPE_ECDSA_P384:\n        case SSH_KEYTYPE_ECDSA_P521:\n#ifdef HAVE_GCRYPT_ECC\n            gcry_sexp_release(sig->ecdsa_sig);\n#elif defined HAVE_LIBMBEDCRYPTO\n            bignum_safe_free(sig->ecdsa_sig.r);\n            bignum_safe_free(sig->ecdsa_sig.s);\n#endif\n            break;\n        case SSH_KEYTYPE_ED25519:\n#ifndef HAVE_OPENSSL_ED25519\n            /* When using OpenSSL, the signature is stored in sig->raw_sig */\n            SAFE_FREE(sig->ed25519_sig);\n#endif\n            break;\n        case SSH_KEYTYPE_DSS_CERT01:\n        case SSH_KEYTYPE_RSA_CERT01:\n        case SSH_KEYTYPE_ECDSA_P256_CERT01:\n        case SSH_KEYTYPE_ECDSA_P384_CERT01:\n        case SSH_KEYTYPE_ECDSA_P521_CERT01:\n        case SSH_KEYTYPE_ED25519_CERT01:\n        case SSH_KEYTYPE_RSA1:\n        case SSH_KEYTYPE_ECDSA:\n        case SSH_KEYTYPE_UNKNOWN:\n            break;\n    }\n\n    /* Explicitly zero the signature content before free */\n    ssh_string_burn(sig->raw_sig);\n    SSH_STRING_FREE(sig->raw_sig);\n    SAFE_FREE(sig);\n}\n\n/**\n * @brief import a base64 formated key from a memory c-string\n *\n * @param[in]  b64_key  The c-string holding the base64 encoded key\n *\n * @param[in]  passphrase The passphrase to decrypt the key, or NULL\n *\n * @param[in]  auth_fn  An auth function you may want to use or NULL.\n *\n * @param[in]  auth_data Private data passed to the auth function.\n *\n * @param[out] pkey     A pointer where the allocated key can be stored. You\n *                      need to free the memory.\n *\n * @return  SSH_ERROR in case of error, SSH_OK otherwise.\n *\n * @see ssh_key_free()\n */\nint ssh_pki_import_privkey_base64(const char *b64_key,\n                                  const char *passphrase,\n                                  ssh_auth_callback auth_fn,\n                                  void *auth_data,\n                                  ssh_key *pkey)\n{\n    ssh_key key;\n    char *openssh_header = NULL;\n\n    if (b64_key == NULL || pkey == NULL) {\n        return SSH_ERROR;\n    }\n\n    if (b64_key == NULL || !*b64_key) {\n        return SSH_ERROR;\n    }\n\n    SSH_LOG(SSH_LOG_INFO,\n            \"Trying to decode privkey passphrase=%s\",\n            passphrase ? \"true\" : \"false\");\n\n    /* Test for OpenSSH key format first */\n    openssh_header = strstr(b64_key, OPENSSH_HEADER_BEGIN);\n    if (openssh_header != NULL) {\n        key = ssh_pki_openssh_privkey_import(openssh_header,\n                                             passphrase,\n                                             auth_fn,\n                                             auth_data);\n    } else {\n        /* fallback on PEM decoder */\n        key = pki_private_key_from_base64(b64_key,\n                                          passphrase,\n                                          auth_fn,\n                                          auth_data);\n    }\n    if (key == NULL) {\n        return SSH_ERROR;\n    }\n\n    *pkey = key;\n\n    return SSH_OK;\n}\n /**\n * @brief Convert a private key to a pem base64 encoded key, or OpenSSH format for\n *        keytype ssh-ed25519\n *\n * @param[in]  privkey  The private key to export.\n *\n * @param[in]  passphrase The passphrase to use to encrypt the key with or\n *             NULL. An empty string means no passphrase.\n *\n * @param[in]  auth_fn  An auth function you may want to use or NULL.\n *\n * @param[in]  auth_data Private data passed to the auth function.\n *\n * @param[out] b64_key  A pointer to store the allocated base64 encoded key. You\n *                      need to free the buffer.\n *\n * @return     SSH_OK on success, SSH_ERROR on error.\n */\nint ssh_pki_export_privkey_base64(const ssh_key privkey,\n                                  const char *passphrase,\n                                  ssh_auth_callback auth_fn,\n                                  void *auth_data,\n                                  char **b64_key)\n{\n    ssh_string blob = NULL;\n    char *b64 = NULL;\n\n    if (privkey == NULL || !ssh_key_is_private(privkey)) {\n        return SSH_ERROR;\n    }\n\n    if (privkey->type == SSH_KEYTYPE_ED25519){\n        blob = ssh_pki_openssh_privkey_export(privkey,\n                                              passphrase,\n                                              auth_fn,\n                                              auth_data);\n    } else {\n        blob = pki_private_key_to_pem(privkey,\n                                      passphrase,\n                                      auth_fn,\n                                      auth_data);\n    }\n    if (blob == NULL) {\n        return SSH_ERROR;\n    }\n\n    b64 = strndup(ssh_string_data(blob), ssh_string_len(blob));\n    SSH_STRING_FREE(blob);\n    if (b64 == NULL) {\n        return SSH_ERROR;\n    }\n\n    *b64_key = b64;\n\n    return SSH_OK;\n}\n\n/**\n * @brief Import a key from a file.\n *\n * @param[in]  filename The filename of the the private key.\n *\n * @param[in]  passphrase The passphrase to decrypt the private key. Set to NULL\n *                        if none is needed or it is unknown.\n *\n * @param[in]  auth_fn  An auth function you may want to use or NULL.\n *\n * @param[in]  auth_data Private data passed to the auth function.\n *\n * @param[out] pkey     A pointer to store the allocated ssh_key. You need to\n *                      free the key.\n *\n * @returns SSH_OK on success, SSH_EOF if the file doesn't exist or permission\n *          denied, SSH_ERROR otherwise.\n *\n * @see ssh_key_free()\n **/\nint ssh_pki_import_privkey_file(const char *filename,\n                                const char *passphrase,\n                                ssh_auth_callback auth_fn,\n                                void *auth_data,\n                                ssh_key *pkey) {\n    struct stat sb;\n    char *key_buf;\n    FILE *file;\n    off_t size;\n    int rc;\n\n    if (pkey == NULL || filename == NULL || *filename == '\\0') {\n        return SSH_ERROR;\n    }\n\n    file = fopen(filename, \"rb\");\n    if (file == NULL) {\n        SSH_LOG(SSH_LOG_WARN,\n                \"Error opening %s: %s\",\n                filename,\n                strerror(errno));\n        return SSH_EOF;\n    }\n\n    rc = fstat(fileno(file), &sb);\n    if (rc < 0) {\n        fclose(file);\n        SSH_LOG(SSH_LOG_WARN,\n                \"Error getting stat of %s: %s\",\n                filename,\n                strerror(errno));\n        switch (errno) {\n            case ENOENT:\n            case EACCES:\n                return SSH_EOF;\n        }\n\n        return SSH_ERROR;\n    }\n\n    if (sb.st_size > MAX_PRIVKEY_SIZE) {\n        SSH_LOG(SSH_LOG_WARN,\n                \"Private key is bigger than 4M.\");\n        fclose(file);\n        return SSH_ERROR;\n    }\n\n    key_buf = malloc(sb.st_size + 1);\n    if (key_buf == NULL) {\n        fclose(file);\n        SSH_LOG(SSH_LOG_WARN, \"Out of memory!\");\n        return SSH_ERROR;\n    }\n\n    size = fread(key_buf, 1, sb.st_size, file);\n    fclose(file);\n\n    if (size != sb.st_size) {\n        SAFE_FREE(key_buf);\n        SSH_LOG(SSH_LOG_WARN,\n                \"Error reading %s: %s\",\n                filename,\n                strerror(errno));\n        return SSH_ERROR;\n    }\n    key_buf[size] = 0;\n\n    rc = ssh_pki_import_privkey_base64(key_buf,\n                                       passphrase,\n                                       auth_fn,\n                                       auth_data,\n                                       pkey);\n\n    SAFE_FREE(key_buf);\n    return rc;\n}\n\n/**\n * @brief Export a private key to a pem file on disk, or OpenSSH format for\n *        keytype ssh-ed25519\n *\n * @param[in]  privkey  The private key to export.\n *\n * @param[in]  passphrase The passphrase to use to encrypt the key with or\n *             NULL. An empty string means no passphrase.\n *\n * @param[in]  auth_fn  An auth function you may want to use or NULL.\n *\n * @param[in]  auth_data Private data passed to the auth function.\n *\n * @param[in]  filename  The path where to store the pem file.\n *\n * @return     SSH_OK on success, SSH_ERROR on error.\n */\nint ssh_pki_export_privkey_file(const ssh_key privkey,\n                                const char *passphrase,\n                                ssh_auth_callback auth_fn,\n                                void *auth_data,\n                                const char *filename)\n{\n    ssh_string blob;\n    FILE *fp;\n    int rc;\n\n    if (privkey == NULL || !ssh_key_is_private(privkey)) {\n        return SSH_ERROR;\n    }\n\n    fp = fopen(filename, \"wb\");\n    if (fp == NULL) {\n        SSH_LOG(SSH_LOG_FUNCTIONS, \"Error opening %s: %s\",\n                filename, strerror(errno));\n        return SSH_EOF;\n    }\n\n    if (privkey->type == SSH_KEYTYPE_ED25519){\n        blob = ssh_pki_openssh_privkey_export(privkey,\n                                              passphrase,\n                                              auth_fn,\n                                              auth_data);\n    } else {\n        blob = pki_private_key_to_pem(privkey,\n                                      passphrase,\n                                      auth_fn,\n                                      auth_data);\n    }\n    if (blob == NULL) {\n        fclose(fp);\n        return -1;\n    }\n\n    rc = fwrite(ssh_string_data(blob), ssh_string_len(blob), 1, fp);\n    SSH_STRING_FREE(blob);\n    if (rc != 1 || ferror(fp)) {\n        fclose(fp);\n        unlink(filename);\n        return SSH_ERROR;\n    }\n    fclose(fp);\n\n    return SSH_OK;\n}\n\n/* temporary function to migrate seemlessly to ssh_key */\nssh_public_key ssh_pki_convert_key_to_publickey(const ssh_key key) {\n    ssh_public_key pub;\n    ssh_key tmp;\n\n    if(key == NULL) {\n        return NULL;\n    }\n\n    tmp = ssh_key_dup(key);\n    if (tmp == NULL) {\n        return NULL;\n    }\n\n    pub = malloc(sizeof(struct ssh_public_key_struct));\n    if (pub == NULL) {\n        ssh_key_free(tmp);\n        return NULL;\n    }\n    ZERO_STRUCTP(pub);\n\n    pub->type = tmp->type;\n    pub->type_c = tmp->type_c;\n\n    pub->dsa_pub = tmp->dsa;\n    tmp->dsa = NULL;\n    pub->rsa_pub = tmp->rsa;\n    tmp->rsa = NULL;\n\n    ssh_key_free(tmp);\n\n    return pub;\n}\n\nssh_private_key ssh_pki_convert_key_to_privatekey(const ssh_key key) {\n    ssh_private_key privkey;\n\n    privkey = malloc(sizeof(struct ssh_private_key_struct));\n    if (privkey == NULL) {\n        ssh_key_free(key);\n        return NULL;\n    }\n\n    privkey->type = key->type;\n    privkey->dsa_priv = key->dsa;\n    privkey->rsa_priv = key->rsa;\n\n    return privkey;\n}\n\nint pki_import_privkey_buffer(enum ssh_keytypes_e type,\n                              ssh_buffer buffer,\n                              ssh_key *pkey)\n{\n    ssh_key key = NULL;\n    int rc;\n\n    key = ssh_key_new();\n    if (key == NULL) {\n        return SSH_ERROR;\n    }\n\n    key->type = type;\n    key->type_c = ssh_key_type_to_char(type);\n    key->flags = SSH_KEY_FLAG_PRIVATE | SSH_KEY_FLAG_PUBLIC;\n\n    switch (type) {\n        case SSH_KEYTYPE_DSS:\n            {\n                ssh_string p = NULL;\n                ssh_string q = NULL;\n                ssh_string g = NULL;\n                ssh_string pubkey = NULL;\n                ssh_string privkey = NULL;\n\n                rc = ssh_buffer_unpack(buffer, \"SSSSS\", &p, &q, &g,\n                                       &pubkey, &privkey);\n                if (rc != SSH_OK) {\n                    SSH_LOG(SSH_LOG_WARN, \"Unpack error\");\n                    goto fail;\n                }\n\n                rc = pki_privkey_build_dss(key, p, q, g, pubkey, privkey);\n#ifdef DEBUG_CRYPTO\n                ssh_log_hexdump(\"p\", ssh_string_data(p), ssh_string_len(p));\n                ssh_log_hexdump(\"q\", ssh_string_data(q), ssh_string_len(q));\n                ssh_log_hexdump(\"g\", ssh_string_data(g), ssh_string_len(g));\n                ssh_log_hexdump(\"pubkey\", ssh_string_data(pubkey),\n                               ssh_string_len(pubkey));\n                ssh_log_hexdump(\"privkey\", ssh_string_data(privkey),\n                               ssh_string_len(privkey));\n#endif\n                ssh_string_burn(p);\n                SSH_STRING_FREE(p);\n                ssh_string_burn(q);\n                SSH_STRING_FREE(q);\n                ssh_string_burn(g);\n                SSH_STRING_FREE(g);\n                ssh_string_burn(pubkey);\n                SSH_STRING_FREE(pubkey);\n                ssh_string_burn(privkey);\n                SSH_STRING_FREE(privkey);\n                if (rc == SSH_ERROR) {\n                    goto fail;\n                }\n            }\n            break;\n        case SSH_KEYTYPE_RSA:\n            {\n                ssh_string n = NULL;\n                ssh_string e = NULL;\n                ssh_string d = NULL;\n                ssh_string iqmp = NULL;\n                ssh_string p = NULL;\n                ssh_string q = NULL;\n\n                rc = ssh_buffer_unpack(buffer, \"SSSSSS\", &n, &e, &d,\n                                       &iqmp, &p, &q);\n                if (rc != SSH_OK) {\n                    SSH_LOG(SSH_LOG_WARN, \"Unpack error\");\n                    goto fail;\n                }\n\n                rc = pki_privkey_build_rsa(key, n, e, d, iqmp, p, q);\n#ifdef DEBUG_CRYPTO\n                ssh_log_hexdump(\"n\", ssh_string_data(n), ssh_string_len(n));\n                ssh_log_hexdump(\"e\", ssh_string_data(e), ssh_string_len(e));\n                ssh_log_hexdump(\"d\", ssh_string_data(d), ssh_string_len(d));\n                ssh_log_hexdump(\"iqmp\", ssh_string_data(iqmp),\n                               ssh_string_len(iqmp));\n                ssh_log_hexdump(\"p\", ssh_string_data(p), ssh_string_len(p));\n                ssh_log_hexdump(\"q\", ssh_string_data(q), ssh_string_len(q));\n#endif\n                ssh_string_burn(n);\n                SSH_STRING_FREE(n);\n                ssh_string_burn(e);\n                SSH_STRING_FREE(e);\n                ssh_string_burn(d);\n                SSH_STRING_FREE(d);\n                ssh_string_burn(iqmp);\n                SSH_STRING_FREE(iqmp);\n                ssh_string_burn(p);\n                SSH_STRING_FREE(p);\n                ssh_string_burn(q);\n                SSH_STRING_FREE(q);\n                if (rc == SSH_ERROR) {\n                    SSH_LOG(SSH_LOG_WARN, \"Failed to build RSA private key\");\n                    goto fail;\n                }\n            }\n            break;\n#ifdef HAVE_ECC\n        case SSH_KEYTYPE_ECDSA_P256:\n        case SSH_KEYTYPE_ECDSA_P384:\n        case SSH_KEYTYPE_ECDSA_P521:\n            {\n                ssh_string e = NULL;\n                ssh_string exp = NULL;\n                ssh_string i = NULL;\n                int nid;\n\n                rc = ssh_buffer_unpack(buffer, \"SSS\", &i, &e, &exp);\n                if (rc != SSH_OK) {\n                    SSH_LOG(SSH_LOG_WARN, \"Unpack error\");\n                    goto fail;\n                }\n\n                nid = pki_key_ecdsa_nid_from_name(ssh_string_get_char(i));\n                SSH_STRING_FREE(i);\n                if (nid == -1) {\n                    goto fail;\n                }\n\n                rc = pki_privkey_build_ecdsa(key, nid, e, exp);\n                ssh_string_burn(e);\n                SSH_STRING_FREE(e);\n                ssh_string_burn(exp);\n                SSH_STRING_FREE(exp);\n                if (rc < 0) {\n                    SSH_LOG(SSH_LOG_WARN, \"Failed to build ECDSA private key\");\n                    goto fail;\n                }\n            }\n            break;\n#endif\n        case SSH_KEYTYPE_ED25519:\n            {\n                ssh_string pubkey = NULL, privkey = NULL;\n\n                rc = ssh_buffer_unpack(buffer, \"SS\", &pubkey, &privkey);\n                if (rc != SSH_OK){\n                    SSH_LOG(SSH_LOG_WARN, \"Unpack error\");\n                    goto fail;\n                }\n\n                rc = pki_privkey_build_ed25519(key, pubkey, privkey);\n                ssh_string_burn(privkey);\n                SSH_STRING_FREE(privkey);\n                SSH_STRING_FREE(pubkey);\n                if (rc != SSH_OK) {\n                    SSH_LOG(SSH_LOG_WARN, \"Failed to build ed25519 key\");\n                    goto fail;\n                }\n            }\n            break;\n        case SSH_KEYTYPE_DSS_CERT01:\n        case SSH_KEYTYPE_RSA_CERT01:\n        case SSH_KEYTYPE_ECDSA_P256_CERT01:\n        case SSH_KEYTYPE_ECDSA_P384_CERT01:\n        case SSH_KEYTYPE_ECDSA_P521_CERT01:\n        case SSH_KEYTYPE_ED25519_CERT01:\n        case SSH_KEYTYPE_RSA1:\n        case SSH_KEYTYPE_UNKNOWN:\n        default:\n            SSH_LOG(SSH_LOG_WARN, \"Unknown private key type (%d)\", type);\n            goto fail;\n    }\n\n    *pkey = key;\n    return SSH_OK;\nfail:\n    ssh_key_free(key);\n\n    return SSH_ERROR;\n}\n\nstatic int pki_import_pubkey_buffer(ssh_buffer buffer,\n                                    enum ssh_keytypes_e type,\n                                    ssh_key *pkey) {\n    ssh_key key = NULL;\n    int rc;\n\n    key = ssh_key_new();\n    if (key == NULL) {\n        return SSH_ERROR;\n    }\n\n    key->type = type;\n    key->type_c = ssh_key_type_to_char(type);\n    key->flags = SSH_KEY_FLAG_PUBLIC;\n\n    switch (type) {\n        case SSH_KEYTYPE_DSS:\n            {\n                ssh_string p = NULL;\n                ssh_string q = NULL;\n                ssh_string g = NULL;\n                ssh_string pubkey = NULL;\n\n                rc = ssh_buffer_unpack(buffer, \"SSSS\", &p, &q, &g, &pubkey);\n                if (rc != SSH_OK) {\n                    SSH_LOG(SSH_LOG_WARN, \"Unpack error\");\n                    goto fail;\n                }\n\n                rc = pki_pubkey_build_dss(key, p, q, g, pubkey);\n#ifdef DEBUG_CRYPTO\n                ssh_log_hexdump(\"p\", ssh_string_data(p), ssh_string_len(p));\n                ssh_log_hexdump(\"q\", ssh_string_data(q), ssh_string_len(q));\n                ssh_log_hexdump(\"g\", ssh_string_data(g), ssh_string_len(g));\n#endif\n                ssh_string_burn(p);\n                SSH_STRING_FREE(p);\n                ssh_string_burn(q);\n                SSH_STRING_FREE(q);\n                ssh_string_burn(g);\n                SSH_STRING_FREE(g);\n                ssh_string_burn(pubkey);\n                SSH_STRING_FREE(pubkey);\n                if (rc == SSH_ERROR) {\n                    SSH_LOG(SSH_LOG_WARN, \"Failed to build DSA public key\");\n                    goto fail;\n                }\n            }\n            break;\n        case SSH_KEYTYPE_RSA:\n            {\n                ssh_string e = NULL;\n                ssh_string n = NULL;\n\n                rc = ssh_buffer_unpack(buffer, \"SS\", &e, &n);\n                if (rc != SSH_OK) {\n                    SSH_LOG(SSH_LOG_WARN, \"Unpack error\");\n                    goto fail;\n                }\n\n                rc = pki_pubkey_build_rsa(key, e, n);\n#ifdef DEBUG_CRYPTO\n                ssh_log_hexdump(\"e\", ssh_string_data(e), ssh_string_len(e));\n                ssh_log_hexdump(\"n\", ssh_string_data(n), ssh_string_len(n));\n#endif\n                ssh_string_burn(e);\n                SSH_STRING_FREE(e);\n                ssh_string_burn(n);\n                SSH_STRING_FREE(n);\n                if (rc == SSH_ERROR) {\n                    SSH_LOG(SSH_LOG_WARN, \"Failed to build RSA public key\");\n                    goto fail;\n                }\n            }\n            break;\n#ifdef HAVE_ECC\n        case SSH_KEYTYPE_ECDSA: /* deprecated */\n        case SSH_KEYTYPE_ECDSA_P256:\n        case SSH_KEYTYPE_ECDSA_P384:\n        case SSH_KEYTYPE_ECDSA_P521:\n            {\n                ssh_string e = NULL;\n                ssh_string i = NULL;\n                int nid;\n\n                rc = ssh_buffer_unpack(buffer, \"SS\", &i, &e);\n                if (rc != SSH_OK) {\n                    SSH_LOG(SSH_LOG_WARN, \"Unpack error\");\n                    goto fail;\n                }\n\n                nid = pki_key_ecdsa_nid_from_name(ssh_string_get_char(i));\n                SSH_STRING_FREE(i);\n                if (nid == -1) {\n                    goto fail;\n                }\n\n                rc = pki_pubkey_build_ecdsa(key, nid, e);\n                ssh_string_burn(e);\n                SSH_STRING_FREE(e);\n                if (rc < 0) {\n                    SSH_LOG(SSH_LOG_WARN, \"Failed to build ECDSA public key\");\n                    goto fail;\n                }\n\n                /* Update key type */\n                if (type == SSH_KEYTYPE_ECDSA) {\n                    key->type_c = ssh_pki_key_ecdsa_name(key);\n                }\n            }\n            break;\n#endif\n        case SSH_KEYTYPE_ED25519:\n        {\n            ssh_string pubkey = ssh_buffer_get_ssh_string(buffer);\n            if (ssh_string_len(pubkey) != ED25519_KEY_LEN) {\n                SSH_LOG(SSH_LOG_WARN, \"Invalid public key length\");\n                ssh_string_burn(pubkey);\n                SSH_STRING_FREE(pubkey);\n                goto fail;\n            }\n\n            key->ed25519_pubkey = malloc(ED25519_KEY_LEN);\n            if (key->ed25519_pubkey == NULL) {\n                ssh_string_burn(pubkey);\n                SSH_STRING_FREE(pubkey);\n                goto fail;\n            }\n\n            memcpy(key->ed25519_pubkey, ssh_string_data(pubkey), ED25519_KEY_LEN);\n            ssh_string_burn(pubkey);\n            SSH_STRING_FREE(pubkey);\n        }\n        break;\n        case SSH_KEYTYPE_DSS_CERT01:\n        case SSH_KEYTYPE_RSA_CERT01:\n        case SSH_KEYTYPE_ECDSA_P256_CERT01:\n        case SSH_KEYTYPE_ECDSA_P384_CERT01:\n        case SSH_KEYTYPE_ECDSA_P521_CERT01:\n        case SSH_KEYTYPE_ED25519_CERT01:\n        case SSH_KEYTYPE_RSA1:\n        case SSH_KEYTYPE_UNKNOWN:\n        default:\n            SSH_LOG(SSH_LOG_WARN, \"Unknown public key protocol %d\", type);\n            goto fail;\n    }\n\n    *pkey = key;\n    return SSH_OK;\nfail:\n    ssh_key_free(key);\n\n    return SSH_ERROR;\n}\n\nstatic int pki_import_cert_buffer(ssh_buffer buffer,\n                                  enum ssh_keytypes_e type,\n                                  ssh_key *pkey) {\n    ssh_buffer cert;\n    ssh_string tmp_s;\n    const char *type_c;\n    ssh_key key = NULL;\n    int rc;\n\n    /*\n     * The cert blob starts with the key type as an ssh_string, but this\n     * string has been read out of the buffer to identify the key type.\n     * Simply add it again as first element before copying the rest.\n     */\n    cert = ssh_buffer_new();\n    if (cert == NULL) {\n        goto fail;\n    }\n    type_c = ssh_key_type_to_char(type);\n    tmp_s = ssh_string_from_char(type_c);\n    if (tmp_s == NULL) {\n        goto fail;\n    }\n    rc = ssh_buffer_add_ssh_string(cert, tmp_s);\n    SSH_STRING_FREE(tmp_s);\n    if (rc != 0) {\n        goto fail;\n    }\n    rc = ssh_buffer_add_buffer(cert, buffer);\n    if (rc != 0) {\n        goto fail;\n    }\n\n    /*\n     * After the key type, comes an ssh_string nonce. Just after this comes the\n     * cert public key, which can be parsed out of the buffer.\n     */\n    tmp_s = ssh_buffer_get_ssh_string(buffer);\n    if (tmp_s == NULL) {\n        goto fail;\n    }\n    SSH_STRING_FREE(tmp_s);\n\n    switch (type) {\n        case SSH_KEYTYPE_DSS_CERT01:\n            rc = pki_import_pubkey_buffer(buffer, SSH_KEYTYPE_DSS, &key);\n            break;\n        case SSH_KEYTYPE_RSA_CERT01:\n            rc = pki_import_pubkey_buffer(buffer, SSH_KEYTYPE_RSA, &key);\n            break;\n        case SSH_KEYTYPE_ECDSA_P256_CERT01:\n            rc = pki_import_pubkey_buffer(buffer, SSH_KEYTYPE_ECDSA_P256, &key);\n            break;\n        case SSH_KEYTYPE_ECDSA_P384_CERT01:\n            rc = pki_import_pubkey_buffer(buffer, SSH_KEYTYPE_ECDSA_P384, &key);\n            break;\n        case SSH_KEYTYPE_ECDSA_P521_CERT01:\n            rc = pki_import_pubkey_buffer(buffer, SSH_KEYTYPE_ECDSA_P521, &key);\n            break;\n        case SSH_KEYTYPE_ED25519_CERT01:\n            rc = pki_import_pubkey_buffer(buffer, SSH_KEYTYPE_ED25519, &key);\n            break;\n        default:\n            key = ssh_key_new();\n    }\n    if (rc != 0 || key == NULL) {\n        goto fail;\n    }\n\n    key->type = type;\n    key->type_c = type_c;\n    key->cert = (void*) cert;\n\n    *pkey = key;\n    return SSH_OK;\n\nfail:\n    ssh_key_free(key);\n    SSH_BUFFER_FREE(cert);\n    return SSH_ERROR;\n}\n\n/**\n * @brief Import a base64 formated public key from a memory c-string.\n *\n * @param[in]  b64_key  The base64 key to format.\n *\n * @param[in]  type     The type of the key to format.\n *\n * @param[out] pkey     A pointer where the allocated key can be stored. You\n *                      need to free the memory.\n *\n * @return              SSH_OK on success, SSH_ERROR on error.\n *\n * @see ssh_key_free()\n */\nint ssh_pki_import_pubkey_base64(const char *b64_key,\n                                 enum ssh_keytypes_e type,\n                                 ssh_key *pkey) {\n    ssh_buffer buffer = NULL;\n    ssh_string type_s = NULL;\n    int rc;\n\n    if (b64_key == NULL || pkey == NULL) {\n        return SSH_ERROR;\n    }\n\n    buffer = base64_to_bin(b64_key);\n    if (buffer == NULL) {\n        return SSH_ERROR;\n    }\n\n    type_s = ssh_buffer_get_ssh_string(buffer);\n    if (type_s == NULL) {\n        SSH_BUFFER_FREE(buffer);\n        return SSH_ERROR;\n    }\n    SSH_STRING_FREE(type_s);\n\n    if (is_cert_type(type)) {\n        rc = pki_import_cert_buffer(buffer, type, pkey);\n    } else {\n        rc = pki_import_pubkey_buffer(buffer, type, pkey);\n    }\n    SSH_BUFFER_FREE(buffer);\n\n    return rc;\n}\n\n/**\n * @internal\n *\n * @brief Import a public key from a ssh string.\n *\n * @param[in]  key_blob The key blob to import as specified in RFC 4253 section\n *                      6.6 \"Public Key Algorithms\".\n *\n * @param[out] pkey     A pointer where the allocated key can be stored. You\n *                      need to free the memory.\n *\n * @return              SSH_OK on success, SSH_ERROR on error.\n *\n * @see ssh_key_free()\n */\nint ssh_pki_import_pubkey_blob(const ssh_string key_blob,\n                               ssh_key *pkey) {\n    ssh_buffer buffer = NULL;\n    ssh_string type_s = NULL;\n    enum ssh_keytypes_e type;\n    int rc;\n\n    if (key_blob == NULL || pkey == NULL) {\n        return SSH_ERROR;\n    }\n\n    buffer = ssh_buffer_new();\n    if (buffer == NULL) {\n        SSH_LOG(SSH_LOG_WARN, \"Out of memory!\");\n        return SSH_ERROR;\n    }\n\n    rc = ssh_buffer_add_data(buffer, ssh_string_data(key_blob),\n            ssh_string_len(key_blob));\n    if (rc < 0) {\n        SSH_LOG(SSH_LOG_WARN, \"Out of memory!\");\n        goto fail;\n    }\n\n    type_s = ssh_buffer_get_ssh_string(buffer);\n    if (type_s == NULL) {\n        SSH_LOG(SSH_LOG_WARN, \"Out of memory!\");\n        goto fail;\n    }\n\n    type = ssh_key_type_from_name(ssh_string_get_char(type_s));\n    if (type == SSH_KEYTYPE_UNKNOWN) {\n        SSH_LOG(SSH_LOG_WARN, \"Unknown key type found!\");\n        goto fail;\n    }\n    SSH_STRING_FREE(type_s);\n\n    if (is_cert_type(type)) {\n        rc = pki_import_cert_buffer(buffer, type, pkey);\n    } else {\n        rc = pki_import_pubkey_buffer(buffer, type, pkey);\n    }\n\n    SSH_BUFFER_FREE(buffer);\n\n    return rc;\nfail:\n    SSH_BUFFER_FREE(buffer);\n    SSH_STRING_FREE(type_s);\n\n    return SSH_ERROR;\n}\n\n/**\n * @brief Import a public key from the given filename.\n *\n * @param[in]  filename The path to the public key.\n *\n * @param[out] pkey     A pointer to store the allocated public key. You need to\n *                      free the memory.\n *\n * @returns SSH_OK on success, SSH_EOF if the file doesn't exist or permission\n *          denied, SSH_ERROR otherwise.\n *\n * @see ssh_key_free()\n */\nint ssh_pki_import_pubkey_file(const char *filename, ssh_key *pkey)\n{\n    enum ssh_keytypes_e type;\n    struct stat sb;\n    char *key_buf, *p;\n    size_t buflen, i;\n    const char *q;\n    FILE *file;\n    off_t size;\n    int rc, cmp;\n\n    if (pkey == NULL || filename == NULL || *filename == '\\0') {\n        return SSH_ERROR;\n    }\n\n    file = fopen(filename, \"rb\");\n    if (file == NULL) {\n        SSH_LOG(SSH_LOG_WARN, \"Error opening %s: %s\",\n                    filename, strerror(errno));\n        return SSH_EOF;\n    }\n\n    rc = fstat(fileno(file), &sb);\n    if (rc < 0) {\n        fclose(file);\n        SSH_LOG(SSH_LOG_WARN, \"Error gettint stat of %s: %s\",\n                    filename, strerror(errno));\n        switch (errno) {\n            case ENOENT:\n            case EACCES:\n                return SSH_EOF;\n        }\n        return SSH_ERROR;\n    }\n\n    if (sb.st_size > MAX_PUBKEY_SIZE) {\n        fclose(file);\n        return SSH_ERROR;\n    }\n\n    key_buf = malloc(sb.st_size + 1);\n    if (key_buf == NULL) {\n        fclose(file);\n        SSH_LOG(SSH_LOG_WARN, \"Out of memory!\");\n        return SSH_ERROR;\n    }\n\n    size = fread(key_buf, 1, sb.st_size, file);\n    fclose(file);\n\n    if (size != sb.st_size) {\n        SAFE_FREE(key_buf);\n        SSH_LOG(SSH_LOG_WARN, \"Error reading %s: %s\",\n                    filename, strerror(errno));\n        return SSH_ERROR;\n    }\n    key_buf[size] = '\\0';\n    buflen = strlen(key_buf);\n\n    /* Test for new OpenSSH key format first */\n    cmp = strncmp(key_buf, OPENSSH_HEADER_BEGIN, strlen(OPENSSH_HEADER_BEGIN));\n    if (cmp == 0) {\n        *pkey = ssh_pki_openssh_pubkey_import(key_buf);\n        SAFE_FREE(key_buf);\n        if (*pkey == NULL) {\n            SSH_LOG(SSH_LOG_WARN, \"Failed to import public key from OpenSSH\"\n                                  \" private key file\");\n            return SSH_ERROR;\n        }\n        return SSH_OK;\n    }\n\n    /* This the old one-line public key format */\n    q = p = key_buf;\n    for (i = 0; i < buflen; i++) {\n        if (isspace((int)p[i])) {\n            p[i] = '\\0';\n            break;\n        }\n    }\n\n    type = ssh_key_type_from_name(q);\n    if (type == SSH_KEYTYPE_UNKNOWN) {\n        SAFE_FREE(key_buf);\n        return SSH_ERROR;\n    }\n\n    q = &p[i + 1];\n    for (; i < buflen; i++) {\n        if (isspace((int)p[i])) {\n            p[i] = '\\0';\n            break;\n        }\n    }\n\n    rc = ssh_pki_import_pubkey_base64(q, type, pkey);\n    SAFE_FREE(key_buf);\n\n    return rc;\n}\n\n/**\n * @brief Import a base64 formated certificate from a memory c-string.\n *\n * @param[in]  b64_cert  The base64 cert to format.\n *\n * @param[in]  type     The type of the cert to format.\n *\n * @param[out] pkey     A pointer where the allocated key can be stored. You\n *                      need to free the memory.\n *\n * @return              SSH_OK on success, SSH_ERROR on error.\n *\n * @see ssh_key_free()\n */\nint ssh_pki_import_cert_base64(const char *b64_cert,\n                               enum ssh_keytypes_e type,\n                               ssh_key *pkey) {\n    return ssh_pki_import_pubkey_base64(b64_cert, type, pkey);\n}\n\n/**\n * @internal\n *\n * @brief Import a certificate from a ssh string.\n *\n * @param[in]  cert_blob The cert blob to import as specified in RFC 4253 section\n *                      6.6 \"Public Key Algorithms\".\n *\n * @param[out] pkey     A pointer where the allocated key can be stored. You\n *                      need to free the memory.\n *\n * @return              SSH_OK on success, SSH_ERROR on error.\n *\n * @see ssh_key_free()\n */\nint ssh_pki_import_cert_blob(const ssh_string cert_blob,\n                             ssh_key *pkey) {\n    return ssh_pki_import_pubkey_blob(cert_blob, pkey);\n}\n\n/**\n * @brief Import a certificate from the given filename.\n *\n * @param[in]  filename The path to the certificate.\n *\n * @param[out] pkey     A pointer to store the allocated certificate. You need to\n *                      free the memory.\n *\n * @returns SSH_OK on success, SSH_EOF if the file doesn't exist or permission\n *          denied, SSH_ERROR otherwise.\n *\n * @see ssh_key_free()\n */\nint ssh_pki_import_cert_file(const char *filename, ssh_key *pkey)\n{\n    return ssh_pki_import_pubkey_file(filename, pkey);\n}\n\n/**\n * @brief Generates a keypair.\n *\n * @param[in] type      Type of key to create\n *\n * @param[in] parameter Parameter to the creation of key:\n *                      rsa : length of the key in bits (e.g. 1024, 2048, 4096)\n *                      dsa : length of the key in bits (e.g. 1024, 2048, 3072)\n * @param[out] pkey     A pointer to store the allocated private key. You need\n *                      to free the memory.\n *\n * @return              SSH_OK on success, SSH_ERROR on error.\n *\n * @warning             Generating a key pair may take some time.\n */\nint ssh_pki_generate(enum ssh_keytypes_e type, int parameter,\n        ssh_key *pkey){\n    int rc;\n    ssh_key key = ssh_key_new();\n\n    if (key == NULL) {\n        return SSH_ERROR;\n    }\n\n    key->type = type;\n    key->type_c = ssh_key_type_to_char(type);\n    key->flags = SSH_KEY_FLAG_PRIVATE | SSH_KEY_FLAG_PUBLIC;\n\n    switch(type){\n        case SSH_KEYTYPE_RSA:\n            rc = pki_key_generate_rsa(key, parameter);\n            if(rc == SSH_ERROR)\n                goto error;\n            break;\n        case SSH_KEYTYPE_DSS:\n            rc = pki_key_generate_dss(key, parameter);\n            if(rc == SSH_ERROR)\n                goto error;\n            break;\n#ifdef HAVE_ECC\n        case SSH_KEYTYPE_ECDSA: /* deprecated */\n            rc = pki_key_generate_ecdsa(key, parameter);\n            if (rc == SSH_ERROR) {\n                goto error;\n            }\n\n            /* Update key type */\n            key->type_c = ssh_pki_key_ecdsa_name(key);\n            break;\n        case SSH_KEYTYPE_ECDSA_P256:\n            rc = pki_key_generate_ecdsa(key, 256);\n            if (rc == SSH_ERROR) {\n                goto error;\n            }\n            break;\n        case SSH_KEYTYPE_ECDSA_P384:\n            rc = pki_key_generate_ecdsa(key, 384);\n            if (rc == SSH_ERROR) {\n                goto error;\n            }\n            break;\n        case SSH_KEYTYPE_ECDSA_P521:\n            rc = pki_key_generate_ecdsa(key, 521);\n            if (rc == SSH_ERROR) {\n                goto error;\n            }\n            break;\n#endif\n        case SSH_KEYTYPE_ED25519:\n            rc = pki_key_generate_ed25519(key);\n            if (rc == SSH_ERROR) {\n                goto error;\n            }\n            break;\n        case SSH_KEYTYPE_DSS_CERT01:\n        case SSH_KEYTYPE_RSA_CERT01:\n        case SSH_KEYTYPE_ECDSA_P256_CERT01:\n        case SSH_KEYTYPE_ECDSA_P384_CERT01:\n        case SSH_KEYTYPE_ECDSA_P521_CERT01:\n        case SSH_KEYTYPE_ED25519_CERT01:\n        case SSH_KEYTYPE_RSA1:\n        case SSH_KEYTYPE_UNKNOWN:\n        default:\n            goto error;\n    }\n\n    *pkey = key;\n    return SSH_OK;\nerror:\n    ssh_key_free(key);\n    return SSH_ERROR;\n}\n\n/**\n * @brief Create a public key from a private key.\n *\n * @param[in]  privkey  The private key to get the public key from.\n *\n * @param[out] pkey     A pointer to store the newly allocated public key. You\n *                      NEED to free the key.\n *\n * @return              SSH_OK on success, SSH_ERROR on error.\n *\n * @see ssh_key_free()\n */\nint ssh_pki_export_privkey_to_pubkey(const ssh_key privkey,\n                                     ssh_key *pkey)\n{\n    ssh_key pubkey;\n\n    if (privkey == NULL || !ssh_key_is_private(privkey)) {\n        return SSH_ERROR;\n    }\n\n    pubkey = pki_key_dup(privkey, 1);\n    if (pubkey == NULL) {\n        return SSH_ERROR;\n    }\n\n    *pkey = pubkey;\n    return SSH_OK;\n}\n\n/**\n * @internal\n *\n * @brief Create a key_blob from a public key.\n *\n * The \"key_blob\" is encoded as per RFC 4253 section 6.6 \"Public Key\n * Algorithms\" for any of the supported protocol 2 key types.\n * Encoding of EC keys is described in RFC 5656 section 3.1 \"Key\n * Format\".\n *\n * @param[in]  key      A public or private key to create the public ssh_string\n *                      from.\n *\n * @param[out] pblob    A pointer to store the newly allocated key blob. You\n *                      NEED to free it.\n *\n * @return              SSH_OK on success, SSH_ERROR otherwise.\n *\n * @see SSH_STRING_FREE()\n */\nint ssh_pki_export_pubkey_blob(const ssh_key key,\n                               ssh_string *pblob)\n{\n    ssh_string blob;\n\n    if (key == NULL) {\n        return SSH_OK;\n    }\n\n    blob = pki_publickey_to_blob(key);\n    if (blob == NULL) {\n        return SSH_ERROR;\n    }\n\n    *pblob = blob;\n    return SSH_OK;\n}\n\n/**\n * @brief Convert a public key to a base64 encoded key.\n *\n * @param[in] key       The key to hash\n *\n * @param[out] b64_key  A pointer to store the allocated base64 encoded key. You\n *                      need to free the buffer.\n *\n * @return              SSH_OK on success, SSH_ERROR on error.\n *\n * @see SSH_STRING_FREE_CHAR()\n */\nint ssh_pki_export_pubkey_base64(const ssh_key key,\n                                 char **b64_key)\n{\n    ssh_string key_blob;\n    unsigned char *b64;\n\n    if (key == NULL || b64_key == NULL) {\n        return SSH_ERROR;\n    }\n\n    key_blob = pki_publickey_to_blob(key);\n    if (key_blob == NULL) {\n        return SSH_ERROR;\n    }\n\n    b64 = bin_to_base64(ssh_string_data(key_blob), ssh_string_len(key_blob));\n    SSH_STRING_FREE(key_blob);\n    if (b64 == NULL) {\n        return SSH_ERROR;\n    }\n\n    *b64_key = (char *)b64;\n\n    return SSH_OK;\n}\n\nint ssh_pki_export_pubkey_file(const ssh_key key,\n                               const char *filename)\n{\n    char key_buf[4096];\n    char host[256];\n    char *b64_key;\n    char *user;\n    FILE *fp;\n    int rc;\n\n    if (key == NULL || filename == NULL || *filename == '\\0') {\n        return SSH_ERROR;\n    }\n\n    user = ssh_get_local_username();\n    if (user == NULL) {\n        return SSH_ERROR;\n    }\n\n    rc = gethostname(host, sizeof(host));\n    if (rc < 0) {\n        free(user);\n        return SSH_ERROR;\n    }\n\n    rc = ssh_pki_export_pubkey_base64(key, &b64_key);\n    if (rc < 0) {\n        free(user);\n        return SSH_ERROR;\n    }\n\n    rc = snprintf(key_buf, sizeof(key_buf),\n                  \"%s %s %s@%s\\n\",\n                  key->type_c,\n                  b64_key,\n                  user,\n                  host);\n    free(user);\n    free(b64_key);\n    if (rc < 0) {\n        return SSH_ERROR;\n    }\n\n    fp = fopen(filename, \"wb+\");\n    if (fp == NULL) {\n        return SSH_ERROR;\n    }\n    rc = fwrite(key_buf, strlen(key_buf), 1, fp);\n    if (rc != 1 || ferror(fp)) {\n        fclose(fp);\n        unlink(filename);\n        return SSH_ERROR;\n    }\n    fclose(fp);\n\n    return SSH_OK;\n}\n\n/**\n * @brief Copy the certificate part of a public key into a private key.\n *\n * @param[in]  certkey  The certificate key.\n *\n * @param[in]  privkey  The target private key to copy the certificate to.\n *\n * @returns SSH_OK on success, SSH_ERROR otherwise.\n **/\nint ssh_pki_copy_cert_to_privkey(const ssh_key certkey, ssh_key privkey) {\n  ssh_buffer cert_buffer;\n  int rc;\n\n  if (certkey == NULL || privkey == NULL) {\n      return SSH_ERROR;\n  }\n\n  if (privkey->cert != NULL) {\n      return SSH_ERROR;\n  }\n\n  if (certkey->cert == NULL) {\n      return SSH_ERROR;\n  }\n\n  cert_buffer = ssh_buffer_new();\n  if (cert_buffer == NULL) {\n      return SSH_ERROR;\n  }\n\n  rc = ssh_buffer_add_buffer(cert_buffer, certkey->cert);\n  if (rc != 0) {\n      SSH_BUFFER_FREE(cert_buffer);\n      return SSH_ERROR;\n  }\n\n  privkey->cert = cert_buffer;\n  privkey->cert_type = certkey->type;\n  return SSH_OK;\n}\n\nint ssh_pki_export_signature_blob(const ssh_signature sig,\n                                  ssh_string *sig_blob)\n{\n    ssh_buffer buf = NULL;\n    ssh_string str;\n    int rc;\n\n    if (sig == NULL || sig_blob == NULL) {\n        return SSH_ERROR;\n    }\n\n    buf = ssh_buffer_new();\n    if (buf == NULL) {\n        return SSH_ERROR;\n    }\n\n    str = ssh_string_from_char(sig->type_c);\n    if (str == NULL) {\n        SSH_BUFFER_FREE(buf);\n        return SSH_ERROR;\n    }\n\n    rc = ssh_buffer_add_ssh_string(buf, str);\n    SSH_STRING_FREE(str);\n    if (rc < 0) {\n        SSH_BUFFER_FREE(buf);\n        return SSH_ERROR;\n    }\n\n    str = pki_signature_to_blob(sig);\n    if (str == NULL) {\n        SSH_BUFFER_FREE(buf);\n        return SSH_ERROR;\n    }\n\n    rc = ssh_buffer_add_ssh_string(buf, str);\n    SSH_STRING_FREE(str);\n    if (rc < 0) {\n        SSH_BUFFER_FREE(buf);\n        return SSH_ERROR;\n    }\n\n    str = ssh_string_new(ssh_buffer_get_len(buf));\n    if (str == NULL) {\n        SSH_BUFFER_FREE(buf);\n        return SSH_ERROR;\n    }\n\n    ssh_string_fill(str, ssh_buffer_get(buf), ssh_buffer_get_len(buf));\n    SSH_BUFFER_FREE(buf);\n\n    *sig_blob = str;\n\n    return SSH_OK;\n}\n\nint ssh_pki_import_signature_blob(const ssh_string sig_blob,\n                                  const ssh_key pubkey,\n                                  ssh_signature *psig)\n{\n    ssh_signature sig = NULL;\n    enum ssh_keytypes_e type;\n    enum ssh_digest_e hash_type;\n    ssh_string algorithm = NULL, blob = NULL;\n    ssh_buffer buf;\n    const char *alg = NULL;\n    int rc;\n\n    if (sig_blob == NULL || psig == NULL) {\n        return SSH_ERROR;\n    }\n\n    buf = ssh_buffer_new();\n    if (buf == NULL) {\n        return SSH_ERROR;\n    }\n\n    rc = ssh_buffer_add_data(buf,\n                             ssh_string_data(sig_blob),\n                             ssh_string_len(sig_blob));\n    if (rc < 0) {\n        SSH_BUFFER_FREE(buf);\n        return SSH_ERROR;\n    }\n\n    algorithm = ssh_buffer_get_ssh_string(buf);\n    if (algorithm == NULL) {\n        SSH_BUFFER_FREE(buf);\n        return SSH_ERROR;\n    }\n\n    alg = ssh_string_get_char(algorithm);\n    type = ssh_key_type_from_signature_name(alg);\n    hash_type = ssh_key_hash_from_name(alg);\n    SSH_STRING_FREE(algorithm);\n\n    blob = ssh_buffer_get_ssh_string(buf);\n    SSH_BUFFER_FREE(buf);\n    if (blob == NULL) {\n        return SSH_ERROR;\n    }\n\n    sig = pki_signature_from_blob(pubkey, blob, type, hash_type);\n    SSH_STRING_FREE(blob);\n    if (sig == NULL) {\n        return SSH_ERROR;\n    }\n\n    *psig = sig;\n    return SSH_OK;\n}\n\n/**\n * @internal\n *\n * @brief Check if the provided key can be used with the provided hash type for\n * data signing or signature verification.\n *\n * @param[in]   key         The key to be checked.\n * @param[in]   hash_type   The digest algorithm to be checked.\n *\n * @return  SSH_OK if compatible; SSH_ERROR otherwise\n */\nint pki_key_check_hash_compatible(ssh_key key,\n                                  enum ssh_digest_e hash_type)\n{\n    if (key == NULL) {\n        SSH_LOG(SSH_LOG_TRACE, \"Null pointer provided as key to \"\n                               \"pki_key_check_hash_compatible()\");\n        return SSH_ERROR;\n    }\n\n    switch(key->type) {\n    case SSH_KEYTYPE_DSS_CERT01:\n    case SSH_KEYTYPE_DSS:\n        if (hash_type == SSH_DIGEST_SHA1) {\n            if (ssh_fips_mode()) {\n                SSH_LOG(SSH_LOG_WARN, \"SHA1 is not allowed in FIPS mode\");\n                return SSH_ERROR;\n            } else {\n                return SSH_OK;\n            }\n        }\n        break;\n    case SSH_KEYTYPE_RSA_CERT01:\n    case SSH_KEYTYPE_RSA:\n        if (hash_type == SSH_DIGEST_SHA1) {\n            if (ssh_fips_mode()) {\n                SSH_LOG(SSH_LOG_WARN, \"SHA1 is not allowed in FIPS mode\");\n                return SSH_ERROR;\n            } else {\n                return SSH_OK;\n            }\n        }\n\n        if (hash_type == SSH_DIGEST_SHA256 ||\n            hash_type == SSH_DIGEST_SHA512)\n        {\n            return SSH_OK;\n        }\n        break;\n    case SSH_KEYTYPE_ECDSA_P256_CERT01:\n    case SSH_KEYTYPE_ECDSA_P256:\n        if (hash_type == SSH_DIGEST_SHA256) {\n            return SSH_OK;\n        }\n        break;\n    case SSH_KEYTYPE_ECDSA_P384_CERT01:\n    case SSH_KEYTYPE_ECDSA_P384:\n        if (hash_type == SSH_DIGEST_SHA384) {\n            return SSH_OK;\n        }\n        break;\n    case SSH_KEYTYPE_ECDSA_P521_CERT01:\n    case SSH_KEYTYPE_ECDSA_P521:\n        if (hash_type == SSH_DIGEST_SHA512) {\n            return SSH_OK;\n        }\n        break;\n    case SSH_KEYTYPE_ED25519_CERT01:\n    case SSH_KEYTYPE_ED25519:\n        if (hash_type == SSH_DIGEST_AUTO) {\n            return SSH_OK;\n        }\n        break;\n    case SSH_KEYTYPE_RSA1:\n    case SSH_KEYTYPE_ECDSA:\n    case SSH_KEYTYPE_UNKNOWN:\n        SSH_LOG(SSH_LOG_WARN, \"Unknown key type %d\", key->type);\n        return SSH_ERROR;\n    }\n\n    SSH_LOG(SSH_LOG_WARN, \"Key type %d incompatible with hash type  %d\",\n            key->type, hash_type);\n\n    return SSH_ERROR;\n}\n\nint ssh_pki_signature_verify(ssh_session session,\n                             ssh_signature sig,\n                             const ssh_key key,\n                             const unsigned char *input,\n                             size_t input_len)\n{\n    int rc;\n    enum ssh_keytypes_e key_type;\n\n    if (session == NULL || sig == NULL || key == NULL || input == NULL) {\n        SSH_LOG(SSH_LOG_TRACE, \"Bad parameter provided to \"\n                               \"ssh_pki_signature_verify()\");\n        return SSH_ERROR;\n    }\n    key_type = ssh_key_type_plain(key->type);\n\n    SSH_LOG(SSH_LOG_FUNCTIONS,\n            \"Going to verify a %s type signature\",\n            sig->type_c);\n\n    if (key_type != sig->type) {\n        SSH_LOG(SSH_LOG_WARN,\n                \"Can not verify %s signature with %s key\",\n                sig->type_c, key->type_c);\n        return SSH_ERROR;\n    }\n\n    /* Check if public key and hash type are compatible */\n    rc = pki_key_check_hash_compatible(key, sig->hash_type);\n    if (rc != SSH_OK) {\n        return SSH_ERROR;\n    }\n\n    rc = pki_verify_data_signature(sig, key, input, input_len);\n\n    return rc;\n}\n\nssh_signature pki_do_sign(const ssh_key privkey,\n                          const unsigned char *input,\n                          size_t input_len,\n                          enum ssh_digest_e hash_type)\n{\n    int rc;\n\n    if (privkey == NULL || input == NULL) {\n        SSH_LOG(SSH_LOG_TRACE, \"Bad parameter provided to \"\n                               \"pki_do_sign()\");\n        return NULL;\n    }\n\n    /* Check if public key and hash type are compatible */\n    rc = pki_key_check_hash_compatible(privkey, hash_type);\n    if (rc != SSH_OK) {\n        return NULL;\n    }\n\n    return pki_sign_data(privkey, hash_type, input, input_len);\n}\n\n/*\n * This function signs the session id as a string then\n * the content of sigbuf */\nssh_string ssh_pki_do_sign(ssh_session session,\n                           ssh_buffer sigbuf,\n                           const ssh_key privkey,\n                           enum ssh_digest_e hash_type)\n{\n    struct ssh_crypto_struct *crypto = NULL;\n\n    ssh_signature sig = NULL;\n    ssh_string sig_blob = NULL;\n\n    ssh_string session_id = NULL;\n    ssh_buffer sign_input = NULL;\n\n    int rc;\n\n    if (session == NULL || sigbuf == NULL || privkey == NULL ||\n        !ssh_key_is_private(privkey))\n    {\n        SSH_LOG(SSH_LOG_TRACE, \"Bad parameter provided to \"\n                               \"ssh_pki_do_sign()\");\n        return NULL;\n    }\n\n    crypto = ssh_packet_get_current_crypto(session, SSH_DIRECTION_BOTH);\n    if (crypto == NULL) {\n        return NULL;\n    }\n\n    /* Get the session ID */\n    session_id = ssh_string_new(crypto->digest_len);\n    if (session_id == NULL) {\n        return NULL;\n    }\n    ssh_string_fill(session_id, crypto->session_id, crypto->digest_len);\n\n    /* Fill the input */\n    sign_input = ssh_buffer_new();\n    if (sign_input == NULL) {\n        goto end;\n    }\n    ssh_buffer_set_secure(sign_input);\n\n    rc = ssh_buffer_pack(sign_input,\n                         \"SP\",\n                         session_id,\n                         ssh_buffer_get_len(sigbuf), ssh_buffer_get(sigbuf));\n    if (rc != SSH_OK) {\n        goto end;\n    }\n\n    /* Generate the signature */\n    sig = pki_do_sign(privkey,\n            ssh_buffer_get(sign_input),\n            ssh_buffer_get_len(sign_input),\n            hash_type);\n    if (sig == NULL) {\n        goto end;\n    }\n\n    /* Convert the signature to blob */\n    rc = ssh_pki_export_signature_blob(sig, &sig_blob);\n    if (rc < 0) {\n        sig_blob = NULL;\n    }\n\nend:\n    ssh_signature_free(sig);\n    SSH_BUFFER_FREE(sign_input);\n    SSH_STRING_FREE(session_id);\n\n    return sig_blob;\n}\n\nssh_string ssh_pki_do_sign_agent(ssh_session session,\n                                 struct ssh_buffer_struct *buf,\n                                 const ssh_key pubkey)\n{\n    struct ssh_crypto_struct *crypto = NULL;\n    ssh_string session_id;\n    ssh_string sig_blob;\n    ssh_buffer sig_buf;\n    int rc;\n\n    crypto = ssh_packet_get_current_crypto(session, SSH_DIRECTION_BOTH);\n    if (crypto == NULL) {\n        return NULL;\n    }\n\n    /* prepend session identifier */\n    session_id = ssh_string_new(crypto->digest_len);\n    if (session_id == NULL) {\n        return NULL;\n    }\n    ssh_string_fill(session_id, crypto->session_id, crypto->digest_len);\n\n    sig_buf = ssh_buffer_new();\n    if (sig_buf == NULL) {\n        SSH_STRING_FREE(session_id);\n        return NULL;\n    }\n\n    rc = ssh_buffer_add_ssh_string(sig_buf, session_id);\n    if (rc < 0) {\n        SSH_STRING_FREE(session_id);\n        SSH_BUFFER_FREE(sig_buf);\n        return NULL;\n    }\n    SSH_STRING_FREE(session_id);\n\n    /* append out buffer */\n    if (ssh_buffer_add_buffer(sig_buf, buf) < 0) {\n        SSH_BUFFER_FREE(sig_buf);\n        return NULL;\n    }\n\n    /* create signature */\n    sig_blob = ssh_agent_sign_data(session, pubkey, sig_buf);\n\n    SSH_BUFFER_FREE(sig_buf);\n\n    return sig_blob;\n}\n\n#ifdef WITH_SERVER\nssh_string ssh_srv_pki_do_sign_sessionid(ssh_session session,\n                                         const ssh_key privkey,\n                                         const enum ssh_digest_e digest)\n{\n    struct ssh_crypto_struct *crypto = NULL;\n\n    ssh_signature sig = NULL;\n    ssh_string sig_blob = NULL;\n\n    ssh_buffer sign_input = NULL;\n\n    int rc;\n\n    if (session == NULL || privkey == NULL || !ssh_key_is_private(privkey)) {\n        return NULL;\n    }\n\n    crypto = session->next_crypto ? session->next_crypto :\n                                    session->current_crypto;\n\n    if (crypto->secret_hash == NULL){\n        ssh_set_error(session,SSH_FATAL,\"Missing secret_hash\");\n        return NULL;\n    }\n\n    /* Fill the input */\n    sign_input = ssh_buffer_new();\n    if (sign_input == NULL) {\n        goto end;\n    }\n    ssh_buffer_set_secure(sign_input);\n\n    rc = ssh_buffer_pack(sign_input,\n                         \"P\",\n                         crypto->digest_len,\n                         crypto->secret_hash);\n    if (rc != SSH_OK) {\n        goto end;\n    }\n\n    /* Generate the signature */\n    sig = pki_do_sign(privkey,\n            ssh_buffer_get(sign_input),\n            ssh_buffer_get_len(sign_input),\n            digest);\n    if (sig == NULL) {\n        goto end;\n    }\n\n    /* Convert the signature to blob */\n    rc = ssh_pki_export_signature_blob(sig, &sig_blob);\n    if (rc < 0) {\n        sig_blob = NULL;\n    }\n\nend:\n    ssh_signature_free(sig);\n    SSH_BUFFER_FREE(sign_input);\n\n    return sig_blob;\n}\n#endif /* WITH_SERVER */\n\n/**\n * @}\n */\n"
  },
  {
    "path": "src/libssh/src/pki_container_openssh.c",
    "content": "/*\n * pki_container_openssh.c\n * This file is part of the SSH Library\n *\n * Copyright (c) 2013,2014 Aris Adamantiadis <aris@badcode.be>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n/**\n * @ingroup libssh_pki\n * *\n * @{\n */\n\n#include \"config.h\"\n\n#include <ctype.h>\n#include <string.h>\n#include <stdbool.h>\n\n#include \"libssh/libssh.h\"\n#include \"libssh/priv.h\"\n#include \"libssh/pki.h\"\n#include \"libssh/pki_priv.h\"\n#include \"libssh/buffer.h\"\n\n\n/**\n * @internal\n *\n * @brief Import a private key from a ssh buffer.\n *\n * @param[in] key_blob_buffer The key blob to import as specified in\n *                            key.c:key_private_serialize in OpenSSH source\n *                            code.\n *\n * @param[out] pkey     A pointer where the allocated key can be stored. You\n *                      need to free the memory.\n *\n * @return              SSH_OK on success, SSH_ERROR on error.\n *\n * @see ssh_key_free()\n */\nstatic int pki_openssh_import_privkey_blob(ssh_buffer key_blob_buffer,\n                                           ssh_key *pkey)\n{\n    enum ssh_keytypes_e type;\n    char *type_s = NULL;\n    ssh_key key = NULL;\n    int rc;\n\n    if (pkey == NULL) {\n        return SSH_ERROR;\n    }\n\n    rc = ssh_buffer_unpack(key_blob_buffer, \"s\", &type_s);\n    if (rc == SSH_ERROR){\n        SSH_LOG(SSH_LOG_WARN, \"Unpack error\");\n        return SSH_ERROR;\n    }\n\n    type = ssh_key_type_from_name(type_s);\n    if (type == SSH_KEYTYPE_UNKNOWN) {\n        SSH_LOG(SSH_LOG_WARN, \"Unknown key type '%s' found!\", type_s);\n        return SSH_ERROR;\n    }\n    SAFE_FREE(type_s);\n\n    rc = pki_import_privkey_buffer(type, key_blob_buffer, &key);\n    if (rc != SSH_OK) {\n        SSH_LOG(SSH_LOG_WARN, \"Failed to read key in OpenSSH format\");\n        goto fail;\n    }\n\n    *pkey = key;\n    return SSH_OK;\nfail:\n    ssh_key_free(key);\n\n    return SSH_ERROR;\n}\n\n/**\n * @brief decrypts an encrypted private key blob in OpenSSH format.\n *\n */\nstatic int pki_private_key_decrypt(ssh_string blob,\n                                   const char* passphrase,\n                                   const char *ciphername,\n                                   const char *kdfname,\n                                   ssh_string kdfoptions,\n                                   ssh_auth_callback auth_fn,\n                                   void *auth_data)\n{\n    struct ssh_cipher_struct *ciphers = ssh_get_ciphertab();\n    struct ssh_cipher_struct cipher;\n    uint8_t key_material[128] = {0};\n    char passphrase_buffer[128] = {0};\n    size_t key_material_len;\n    ssh_buffer buffer = NULL;\n    ssh_string salt = NULL;\n    uint32_t rounds;\n    int cmp;\n    int rc;\n    int i;\n\n    cmp = strcmp(ciphername, \"none\");\n    if (cmp == 0){\n        /* no decryption required */\n        return SSH_OK;\n    }\n\n    for (i = 0; ciphers[i].name != NULL; i++) {\n        cmp = strcmp(ciphername, ciphers[i].name);\n        if (cmp == 0){\n            memcpy(&cipher, &ciphers[i], sizeof(cipher));\n            break;\n        }\n    }\n\n    if (ciphers[i].name == NULL){\n        SSH_LOG(SSH_LOG_WARN, \"Unsupported cipher %s\", ciphername);\n        return SSH_ERROR;\n    }\n\n    cmp = strcmp(kdfname, \"bcrypt\");\n    if (cmp != 0) {\n        SSH_LOG(SSH_LOG_WARN, \"Unsupported KDF %s\", kdfname);\n        return SSH_ERROR;\n    }\n    if (ssh_string_len(blob) % cipher.blocksize != 0) {\n        SSH_LOG(SSH_LOG_WARN,\n                \"Encrypted string not multiple of blocksize: %zu\",\n                ssh_string_len(blob));\n        return SSH_ERROR;\n    }\n\n    buffer = ssh_buffer_new();\n    if (buffer == NULL){\n        return SSH_ERROR;\n    }\n    rc = ssh_buffer_add_data(buffer,\n                             ssh_string_data(kdfoptions),\n                             ssh_string_len(kdfoptions));\n    if (rc != SSH_ERROR){\n        rc = ssh_buffer_unpack(buffer, \"Sd\", &salt, &rounds);\n    }\n    SSH_BUFFER_FREE(buffer);\n    if (rc == SSH_ERROR){\n        return SSH_ERROR;\n    }\n\n    /* We need material for key (keysize bits / 8) and IV (blocksize)  */\n    key_material_len =  cipher.keysize/8 + cipher.blocksize;\n    if (key_material_len > sizeof(key_material)) {\n        SSH_LOG(SSH_LOG_WARN, \"Key material too big\");\n        return SSH_ERROR;\n    }\n\n    SSH_LOG(SSH_LOG_DEBUG,\n            \"Decryption: %d key, %d IV, %d rounds, %zu bytes salt\",\n            cipher.keysize/8,\n            cipher.blocksize,\n            rounds,\n            ssh_string_len(salt));\n\n    if (passphrase == NULL) {\n        if (auth_fn == NULL) {\n            SAFE_FREE(salt);\n            SSH_LOG(SSH_LOG_WARN, \"No passphrase provided\");\n            return SSH_ERROR;\n        }\n        rc = auth_fn(\"Passphrase\",\n                     passphrase_buffer,\n                     sizeof(passphrase_buffer),\n                     0,\n                     0,\n                     auth_data);\n        if (rc != SSH_OK) {\n            SAFE_FREE(salt);\n            return SSH_ERROR;\n        }\n        passphrase = passphrase_buffer;\n    }\n\n    rc = bcrypt_pbkdf(passphrase,\n                      strlen(passphrase),\n                      ssh_string_data(salt),\n                      ssh_string_len(salt),\n                      key_material,\n                      key_material_len,\n                      rounds);\n    SAFE_FREE(salt);\n    if (rc < 0){\n        return SSH_ERROR;\n    }\n    explicit_bzero(passphrase_buffer, sizeof(passphrase_buffer));\n\n    cipher.set_decrypt_key(&cipher,\n                           key_material,\n                           key_material + cipher.keysize/8);\n    cipher.decrypt(&cipher,\n                   ssh_string_data(blob),\n                   ssh_string_data(blob),\n                   ssh_string_len(blob));\n    ssh_cipher_clear(&cipher);\n    return SSH_OK;\n}\n\n\n/** @internal\n * @brief Import a private key in OpenSSH (new) format. This format is\n * typically used with ed25519 keys but can be used for others.\n */\nstatic ssh_key\nssh_pki_openssh_import(const char *text_key,\n                       const char *passphrase,\n                       ssh_auth_callback auth_fn,\n                       void *auth_data,\n                       bool private)\n{\n    const char *ptr = text_key;\n    const char *end;\n    char *base64;\n    int cmp;\n    int rc;\n    int i;\n    ssh_buffer buffer = NULL, privkey_buffer=NULL;\n    char *magic = NULL, *ciphername = NULL, *kdfname = NULL;\n    uint32_t nkeys = 0, checkint1 = 0, checkint2 = 0xFFFF;\n    ssh_string kdfoptions = NULL;\n    ssh_string pubkey0 = NULL;\n    ssh_string privkeys = NULL;\n    ssh_string comment = NULL;\n    ssh_key key = NULL;\n    uint8_t padding;\n\n    cmp = strncmp(ptr, OPENSSH_HEADER_BEGIN, strlen(OPENSSH_HEADER_BEGIN));\n    if (cmp != 0) {\n        SSH_LOG(SSH_LOG_WARN, \"Not an OpenSSH private key (no header)\");\n        goto out;\n    }\n    ptr += strlen(OPENSSH_HEADER_BEGIN);\n    while(ptr[0] != '\\0' && !isspace((int)ptr[0])) {\n        ptr++;\n    }\n    end = strstr(ptr, OPENSSH_HEADER_END);\n    if (end == NULL) {\n        SSH_LOG(SSH_LOG_WARN, \"Not an OpenSSH private key (no footer)\");\n        goto out;\n    }\n    base64 = malloc(end - ptr + 1);\n    if (base64 == NULL) {\n        goto out;\n    }\n    for (i = 0; ptr < end; ptr++) {\n        if (!isspace((int)ptr[0])) {\n            base64[i] = ptr[0];\n            i++;\n        }\n    }\n    base64[i] = '\\0';\n    buffer = base64_to_bin(base64);\n    SAFE_FREE(base64);\n    if (buffer == NULL) {\n        SSH_LOG(SSH_LOG_WARN, \"Not an OpenSSH private key (base64 error)\");\n        goto out;\n    }\n    rc = ssh_buffer_unpack(buffer, \"PssSdSS\",\n                           strlen(OPENSSH_AUTH_MAGIC) + 1,\n                           &magic,\n                           &ciphername,\n                           &kdfname,\n                           &kdfoptions,\n                           &nkeys,\n                           &pubkey0,\n                           &privkeys);\n    if (rc == SSH_ERROR) {\n        SSH_LOG(SSH_LOG_WARN, \"Not an OpenSSH private key (unpack error)\");\n        goto out;\n    }\n    cmp = strncmp(magic, OPENSSH_AUTH_MAGIC, strlen(OPENSSH_AUTH_MAGIC));\n    if (cmp != 0) {\n        SSH_LOG(SSH_LOG_WARN, \"Not an OpenSSH private key (bad magic)\");\n        goto out;\n    }\n    SSH_LOG(SSH_LOG_INFO,\n            \"Opening OpenSSH private key: ciphername: %s, kdf: %s, nkeys: %d\",\n            ciphername,\n            kdfname,\n            nkeys);\n    if (nkeys != 1) {\n        SSH_LOG(SSH_LOG_WARN, \"Opening OpenSSH private key: only 1 key supported (%d available)\", nkeys);\n        goto out;\n    }\n\n    /* If we are interested only in public key do not progress\n     * to the key decryption later\n     */\n    if (!private) {\n        rc = ssh_pki_import_pubkey_blob(pubkey0, &key);\n        if (rc != SSH_OK) {\n            SSH_LOG(SSH_LOG_WARN, \"Failed to import public key blob\");\n        }\n        /* in either case we clean up here */\n        goto out;\n    }\n\n    rc = pki_private_key_decrypt(privkeys,\n                                 passphrase,\n                                 ciphername,\n                                 kdfname,\n                                 kdfoptions,\n                                 auth_fn,\n                                 auth_data);\n    if (rc == SSH_ERROR) {\n        goto out;\n    }\n\n    privkey_buffer = ssh_buffer_new();\n    if (privkey_buffer == NULL) {\n        goto out;\n    }\n\n    ssh_buffer_set_secure(privkey_buffer);\n    ssh_buffer_add_data(privkey_buffer,\n                        ssh_string_data(privkeys),\n                        ssh_string_len(privkeys));\n\n    rc = ssh_buffer_unpack(privkey_buffer, \"dd\", &checkint1, &checkint2);\n    if (rc == SSH_ERROR || checkint1 != checkint2) {\n        SSH_LOG(SSH_LOG_WARN, \"OpenSSH private key unpack error (correct password?)\");\n        goto out;\n    }\n    rc = pki_openssh_import_privkey_blob(privkey_buffer, &key);\n    if (rc == SSH_ERROR) {\n        goto out;\n    }\n    comment = ssh_buffer_get_ssh_string(privkey_buffer);\n    SAFE_FREE(comment);\n    /* verify that the remaining data is correct padding */\n    for (i = 1; ssh_buffer_get_len(privkey_buffer) > 0; ++i) {\n        ssh_buffer_get_u8(privkey_buffer, &padding);\n        if (padding != i) {\n            ssh_key_free(key);\n            key = NULL;\n            SSH_LOG(SSH_LOG_WARN, \"Invalid padding\");\n            goto out;\n        }\n    }\nout:\n    if (buffer != NULL) {\n        SSH_BUFFER_FREE(buffer);\n        buffer = NULL;\n    }\n    if (privkey_buffer != NULL) {\n        SSH_BUFFER_FREE(privkey_buffer);\n        privkey_buffer = NULL;\n    }\n    SAFE_FREE(magic);\n    SAFE_FREE(ciphername);\n    SAFE_FREE(kdfname);\n    SAFE_FREE(kdfoptions);\n    SAFE_FREE(pubkey0);\n    SAFE_FREE(privkeys);\n    return key;\n}\n\nssh_key ssh_pki_openssh_privkey_import(const char *text_key,\n                                       const char *passphrase,\n                                       ssh_auth_callback auth_fn,\n                                       void *auth_data)\n{\n    return ssh_pki_openssh_import(text_key, passphrase, auth_fn, auth_data, true);\n}\n\nssh_key ssh_pki_openssh_pubkey_import(const char *text_key)\n{\n    return ssh_pki_openssh_import(text_key, NULL, NULL, NULL, false);\n}\n\n\n/** @internal\n * @brief exports a private key to a string blob.\n * @param[in] privkey private key to convert\n * @param[out] buffer buffer to write the blob in.\n * @returns SSH_OK on success\n * @warning only supports ed25519 key type at the moment.\n */\nstatic int pki_openssh_export_privkey_blob(const ssh_key privkey,\n                                           ssh_buffer buffer)\n{\n    int rc;\n\n    if (privkey->type != SSH_KEYTYPE_ED25519) {\n        SSH_LOG(SSH_LOG_WARN, \"Type %s not supported\", privkey->type_c);\n        return SSH_ERROR;\n    }\n    if (privkey->ed25519_privkey == NULL ||\n        privkey->ed25519_pubkey == NULL) {\n        return SSH_ERROR;\n    }\n    rc = ssh_buffer_pack(buffer,\n                         \"sdPdPP\",\n                         privkey->type_c,\n                         (uint32_t)ED25519_KEY_LEN,\n                         (size_t)ED25519_KEY_LEN, privkey->ed25519_pubkey,\n                         (uint32_t)(2 * ED25519_KEY_LEN),\n                         (size_t)ED25519_KEY_LEN, privkey->ed25519_privkey,\n                         (size_t)ED25519_KEY_LEN, privkey->ed25519_pubkey);\n    return rc;\n}\n\n/** @internal\n * @brief encrypts an ed25519 private key blob\n *\n */\nstatic int pki_private_key_encrypt(ssh_buffer privkey_buffer,\n                                   const char* passphrase,\n                                   const char *ciphername,\n                                   const char *kdfname,\n                                   ssh_auth_callback auth_fn,\n                                   void *auth_data,\n                                   uint32_t rounds,\n                                   ssh_string salt)\n{\n    struct ssh_cipher_struct *ciphers = ssh_get_ciphertab();\n    struct ssh_cipher_struct cipher;\n    uint8_t key_material[128] = {0};\n    size_t key_material_len;\n    char passphrase_buffer[128] = {0};\n    int rc;\n    int i;\n    int cmp;\n\n    cmp = strcmp(ciphername, \"none\");\n    if (cmp == 0){\n        /* no encryption required */\n        return SSH_OK;\n    }\n\n    for (i = 0; ciphers[i].name != NULL; i++) {\n        cmp = strcmp(ciphername, ciphers[i].name);\n        if (cmp == 0){\n            memcpy(&cipher, &ciphers[i], sizeof(cipher));\n            break;\n        }\n    }\n\n    if (ciphers[i].name == NULL){\n        SSH_LOG(SSH_LOG_WARN, \"Unsupported cipher %s\", ciphername);\n        return SSH_ERROR;\n    }\n\n    cmp = strcmp(kdfname, \"bcrypt\");\n    if (cmp != 0){\n        SSH_LOG(SSH_LOG_WARN, \"Unsupported KDF %s\", kdfname);\n        return SSH_ERROR;\n    }\n    /* We need material for key (keysize bits / 8) and IV (blocksize)  */\n    key_material_len =  cipher.keysize/8 + cipher.blocksize;\n    if (key_material_len > sizeof(key_material)){\n        SSH_LOG(SSH_LOG_WARN, \"Key material too big\");\n        return SSH_ERROR;\n    }\n\n    SSH_LOG(SSH_LOG_WARN, \"Encryption: %d key, %d IV, %d rounds, %zu bytes salt\",\n                cipher.keysize/8,\n                cipher.blocksize, rounds, ssh_string_len(salt));\n\n    if (passphrase == NULL){\n        if (auth_fn == NULL){\n            SSH_LOG(SSH_LOG_WARN, \"No passphrase provided\");\n            return SSH_ERROR;\n        }\n        rc = auth_fn(\"Passphrase\",\n                     passphrase_buffer,\n                     sizeof(passphrase_buffer),\n                     0,\n                     0,\n                     auth_data);\n        if (rc != SSH_OK){\n            return SSH_ERROR;\n        }\n        passphrase = passphrase_buffer;\n    }\n\n    rc = bcrypt_pbkdf(passphrase,\n                      strlen(passphrase),\n                      ssh_string_data(salt),\n                      ssh_string_len(salt),\n                      key_material,\n                      key_material_len,\n                      rounds);\n    if (rc < 0){\n        return SSH_ERROR;\n    }\n\n    cipher.set_encrypt_key(&cipher,\n                           key_material,\n                           key_material + cipher.keysize/8);\n    cipher.encrypt(&cipher,\n                   ssh_buffer_get(privkey_buffer),\n                   ssh_buffer_get(privkey_buffer),\n                   ssh_buffer_get_len(privkey_buffer));\n    ssh_cipher_clear(&cipher);\n    explicit_bzero(passphrase_buffer, sizeof(passphrase_buffer));\n\n    return SSH_OK;\n}\n\n\n/** @internal\n * generate an OpenSSH private key (defined in PROTOCOL.key) and output it in text format.\n * @param privkey[in] private key to export\n * @returns an SSH string containing the text representation of the exported key.\n * @warning currently only supports ED25519 key types.\n */\n\nssh_string ssh_pki_openssh_privkey_export(const ssh_key privkey,\n                                          const char *passphrase,\n                                          ssh_auth_callback auth_fn,\n                                          void *auth_data)\n{\n    ssh_buffer buffer;\n    ssh_string str = NULL;\n    ssh_string pubkey_s=NULL;\n    ssh_buffer privkey_buffer = NULL;\n    uint32_t rnd;\n    uint32_t rounds = 16;\n    ssh_string salt=NULL;\n    ssh_string kdf_options=NULL;\n    int to_encrypt=0;\n    unsigned char *b64;\n    uint32_t str_len, len;\n    uint8_t padding = 1;\n    int ok;\n    int rc;\n\n    if (privkey == NULL) {\n        return NULL;\n    }\n    if (privkey->type != SSH_KEYTYPE_ED25519){\n        SSH_LOG(SSH_LOG_WARN, \"Unsupported key type %s\", privkey->type_c);\n        return NULL;\n    }\n    if (passphrase != NULL || auth_fn != NULL){\n        SSH_LOG(SSH_LOG_INFO, \"Enabling encryption for private key export\");\n        to_encrypt = 1;\n    }\n    buffer = ssh_buffer_new();\n    pubkey_s = pki_publickey_to_blob(privkey);\n    if(buffer == NULL || pubkey_s == NULL){\n        goto error;\n    }\n\n    ok = ssh_get_random(&rnd, sizeof(rnd), 0);\n    if (!ok) {\n        goto error;\n    }\n\n    privkey_buffer = ssh_buffer_new();\n    if (privkey_buffer == NULL) {\n        goto error;\n    }\n\n    /* checkint1 & 2 */\n    rc = ssh_buffer_pack(privkey_buffer,\n                         \"dd\",\n                         rnd,\n                         rnd);\n    if (rc == SSH_ERROR){\n        goto error;\n    }\n\n    rc = pki_openssh_export_privkey_blob(privkey, privkey_buffer);\n    if (rc == SSH_ERROR){\n        goto error;\n    }\n\n    /* comment */\n    rc = ssh_buffer_pack(privkey_buffer, \"s\", \"\" /* comment */);\n    if (rc == SSH_ERROR){\n        goto error;\n    }\n\n    /* Add padding regardless encryption because it is expected\n     * by OpenSSH tools.\n     * XXX Using 16 B as we use only AES cipher below anyway.\n     */\n    while (ssh_buffer_get_len(privkey_buffer) % 16 != 0) {\n        rc = ssh_buffer_add_u8(privkey_buffer, padding);\n        if (rc < 0) {\n            goto error;\n        }\n        padding++;\n    }\n\n    if (to_encrypt){\n        ssh_buffer kdf_buf;\n\n        kdf_buf = ssh_buffer_new();\n        if (kdf_buf == NULL) {\n            goto error;\n        }\n\n        salt = ssh_string_new(16);\n        if (salt == NULL){\n            SSH_BUFFER_FREE(kdf_buf);\n            goto error;\n        }\n\n        ok = ssh_get_random(ssh_string_data(salt), 16, 0);\n        if (!ok) {\n            SSH_BUFFER_FREE(kdf_buf);\n            goto error;\n        }\n\n        ssh_buffer_pack(kdf_buf, \"Sd\", salt, rounds);\n        kdf_options = ssh_string_new(ssh_buffer_get_len(kdf_buf));\n        if (kdf_options == NULL){\n            SSH_BUFFER_FREE(kdf_buf);\n            goto error;\n        }\n        memcpy(ssh_string_data(kdf_options),\n               ssh_buffer_get(kdf_buf),\n               ssh_buffer_get_len(kdf_buf));\n        SSH_BUFFER_FREE(kdf_buf);\n        rc = pki_private_key_encrypt(privkey_buffer,\n                                     passphrase,\n                                     \"aes128-cbc\",\n                                     \"bcrypt\",\n                                     auth_fn,\n                                     auth_data,\n                                     rounds,\n                                     salt);\n        if (rc != SSH_OK){\n            goto error;\n        }\n    } else {\n        kdf_options = ssh_string_new(0);\n    }\n\n    rc = ssh_buffer_pack(buffer,\n                         \"PssSdSdP\",\n                         (size_t)strlen(OPENSSH_AUTH_MAGIC) + 1, OPENSSH_AUTH_MAGIC,\n                         to_encrypt ? \"aes128-cbc\" : \"none\", /* ciphername */\n                         to_encrypt ? \"bcrypt\" : \"none\", /* kdfname */\n                         kdf_options, /* kdfoptions */\n                         (uint32_t) 1, /* nkeys */\n                         pubkey_s,\n                         (uint32_t)ssh_buffer_get_len(privkey_buffer),\n                         /* rest of buffer is a string */\n                         (size_t)ssh_buffer_get_len(privkey_buffer), ssh_buffer_get(privkey_buffer));\n    if (rc != SSH_OK) {\n        goto error;\n    }\n\n    b64 = bin_to_base64(ssh_buffer_get(buffer),\n                        ssh_buffer_get_len(buffer));\n    if (b64 == NULL){\n        goto error;\n    }\n\n    /* we can reuse the buffer */\n    ssh_buffer_reinit(buffer);\n    rc = ssh_buffer_pack(buffer,\n                         \"tttttt\",\n                         OPENSSH_HEADER_BEGIN,\n                         \"\\n\",\n                         b64,\n                         \"\\n\",\n                         OPENSSH_HEADER_END,\n                         \"\\n\");\n    explicit_bzero(b64, strlen((char *)b64));\n    SAFE_FREE(b64);\n\n    if (rc != SSH_OK){\n        goto error;\n    }\n\n    str = ssh_string_new(ssh_buffer_get_len(buffer));\n    if (str == NULL){\n        goto error;\n    }\n\n    str_len = ssh_buffer_get_len(buffer);\n    len = ssh_buffer_get_data(buffer, ssh_string_data(str), str_len);\n    if (str_len != len) {\n        SSH_STRING_FREE(str);\n        str = NULL;\n    }\n\nerror:\n    if (privkey_buffer != NULL) {\n        void *bufptr = ssh_buffer_get(privkey_buffer);\n        explicit_bzero(bufptr, ssh_buffer_get_len(privkey_buffer));\n        SSH_BUFFER_FREE(privkey_buffer);\n    }\n    SAFE_FREE(pubkey_s);\n    SAFE_FREE(kdf_options);\n    SAFE_FREE(salt);\n    if (buffer != NULL) {\n        SSH_BUFFER_FREE(buffer);\n    }\n\n    return str;\n}\n\n\n/**\n * @}\n */\n"
  },
  {
    "path": "src/libssh/src/pki_crypto.c",
    "content": "/*\n * pki_crypto.c - PKI infrastructure using OpenSSL\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2003-2009 by Aris Adamantiadis\n * Copyright (c) 2009-2013 by Andreas Schneider <asn@cryptomilk.org>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#ifndef _PKI_CRYPTO_H\n#define _PKI_CRYPTO_H\n\n#include \"config.h\"\n\n#include \"libssh/priv.h\"\n\n#include <openssl/pem.h>\n#include <openssl/dsa.h>\n#include <openssl/err.h>\n#include <openssl/rsa.h>\n#include \"libcrypto-compat.h\"\n\n#ifdef HAVE_OPENSSL_EC_H\n#include <openssl/ec.h>\n#endif\n#ifdef HAVE_OPENSSL_ECDSA_H\n#include <openssl/ecdsa.h>\n#endif\n\n#include \"libssh/libssh.h\"\n#include \"libssh/buffer.h\"\n#include \"libssh/session.h\"\n#include \"libssh/pki.h\"\n#include \"libssh/pki_priv.h\"\n#include \"libssh/bignum.h\"\n\nstruct pem_get_password_struct {\n    ssh_auth_callback fn;\n    void *data;\n};\n\nstatic int pem_get_password(char *buf, int size, int rwflag, void *userdata) {\n    struct pem_get_password_struct *pgp = userdata;\n\n    (void) rwflag; /* unused */\n\n    if (buf == NULL) {\n        return 0;\n    }\n\n    memset(buf, '\\0', size);\n    if (pgp) {\n        int rc;\n\n        rc = pgp->fn(\"Passphrase for private key:\",\n                     buf, size, 0, 0,\n                     pgp->data);\n        if (rc == 0) {\n            return strlen(buf);\n        }\n    }\n\n    return 0;\n}\n\n#ifdef HAVE_OPENSSL_ECC\nstatic int pki_key_ecdsa_to_nid(EC_KEY *k)\n{\n    const EC_GROUP *g = EC_KEY_get0_group(k);\n    int nid;\n\n    nid = EC_GROUP_get_curve_name(g);\n    if (nid) {\n        return nid;\n    }\n\n    return -1;\n}\n\nstatic enum ssh_keytypes_e pki_key_ecdsa_to_key_type(EC_KEY *k)\n{\n    int nid;\n\n    nid = pki_key_ecdsa_to_nid(k);\n\n    switch (nid) {\n        case NID_X9_62_prime256v1:\n            return SSH_KEYTYPE_ECDSA_P256;\n        case NID_secp384r1:\n            return SSH_KEYTYPE_ECDSA_P384;\n        case NID_secp521r1:\n            return SSH_KEYTYPE_ECDSA_P521;\n        default:\n            return SSH_KEYTYPE_UNKNOWN;\n    }\n}\n\nconst char *pki_key_ecdsa_nid_to_name(int nid)\n{\n    switch (nid) {\n        case NID_X9_62_prime256v1:\n            return \"ecdsa-sha2-nistp256\";\n        case NID_secp384r1:\n            return \"ecdsa-sha2-nistp384\";\n        case NID_secp521r1:\n            return \"ecdsa-sha2-nistp521\";\n        default:\n            break;\n    }\n\n    return \"unknown\";\n}\n\nstatic const char *pki_key_ecdsa_nid_to_char(int nid)\n{\n    switch (nid) {\n        case NID_X9_62_prime256v1:\n            return \"nistp256\";\n        case NID_secp384r1:\n            return \"nistp384\";\n        case NID_secp521r1:\n            return \"nistp521\";\n        default:\n            break;\n    }\n\n    return \"unknown\";\n}\n\nint pki_key_ecdsa_nid_from_name(const char *name)\n{\n    if (strcmp(name, \"nistp256\") == 0) {\n        return NID_X9_62_prime256v1;\n    } else if (strcmp(name, \"nistp384\") == 0) {\n        return NID_secp384r1;\n    } else if (strcmp(name, \"nistp521\") == 0) {\n        return NID_secp521r1;\n    }\n\n    return -1;\n}\n\nstatic ssh_string make_ecpoint_string(const EC_GROUP *g,\n                                      const EC_POINT *p)\n{\n    ssh_string s;\n    size_t len;\n\n    len = EC_POINT_point2oct(g,\n                             p,\n                             POINT_CONVERSION_UNCOMPRESSED,\n                             NULL,\n                             0,\n                             NULL);\n    if (len == 0) {\n        return NULL;\n    }\n\n    s = ssh_string_new(len);\n    if (s == NULL) {\n        return NULL;\n    }\n\n    len = EC_POINT_point2oct(g,\n                             p,\n                             POINT_CONVERSION_UNCOMPRESSED,\n                             ssh_string_data(s),\n                             ssh_string_len(s),\n                             NULL);\n    if (len != ssh_string_len(s)) {\n        SSH_STRING_FREE(s);\n        return NULL;\n    }\n\n    return s;\n}\n\nint pki_privkey_build_ecdsa(ssh_key key, int nid, ssh_string e, ssh_string exp)\n{\n    EC_POINT *p = NULL;\n    const EC_GROUP *g = NULL;\n    int ok;\n    BIGNUM *bexp = NULL;\n\n    key->ecdsa_nid = nid;\n    key->type_c = pki_key_ecdsa_nid_to_name(nid);\n\n    key->ecdsa = EC_KEY_new_by_curve_name(key->ecdsa_nid);\n    if (key->ecdsa == NULL) {\n        return -1;\n    }\n\n    g = EC_KEY_get0_group(key->ecdsa);\n\n    p = EC_POINT_new(g);\n    if (p == NULL) {\n        return -1;\n    }\n\n    ok = EC_POINT_oct2point(g,\n                            p,\n                            ssh_string_data(e),\n                            ssh_string_len(e),\n                            NULL);\n    if (!ok) {\n        EC_POINT_free(p);\n        return -1;\n    }\n\n    /* EC_KEY_set_public_key duplicates p */\n    ok = EC_KEY_set_public_key(key->ecdsa, p);\n    EC_POINT_free(p);\n    if (!ok) {\n        return -1;\n    }\n\n    bexp = ssh_make_string_bn(exp);\n    if (bexp == NULL) {\n        EC_KEY_free(key->ecdsa);\n        return -1;\n    }\n    /* EC_KEY_set_private_key duplicates exp */\n    ok = EC_KEY_set_private_key(key->ecdsa, bexp);\n    BN_free(bexp);\n    if (!ok) {\n        EC_KEY_free(key->ecdsa);\n        return -1;\n    }\n\n    return 0;\n}\n\nint pki_pubkey_build_ecdsa(ssh_key key, int nid, ssh_string e)\n{\n    EC_POINT *p = NULL;\n    const EC_GROUP *g = NULL;\n    int ok;\n\n    key->ecdsa_nid = nid;\n    key->type_c = pki_key_ecdsa_nid_to_name(nid);\n\n    key->ecdsa = EC_KEY_new_by_curve_name(key->ecdsa_nid);\n    if (key->ecdsa == NULL) {\n        return -1;\n    }\n\n    g = EC_KEY_get0_group(key->ecdsa);\n\n    p = EC_POINT_new(g);\n    if (p == NULL) {\n        return -1;\n    }\n\n    ok = EC_POINT_oct2point(g,\n                            p,\n                            ssh_string_data(e),\n                            ssh_string_len(e),\n                            NULL);\n    if (!ok) {\n        EC_POINT_free(p);\n        return -1;\n    }\n\n    /* EC_KEY_set_public_key duplicates p */\n    ok = EC_KEY_set_public_key(key->ecdsa, p);\n    EC_POINT_free(p);\n    if (!ok) {\n        return -1;\n    }\n\n    return 0;\n}\n#endif\n\nssh_key pki_key_dup(const ssh_key key, int demote)\n{\n    ssh_key new;\n    int rc;\n\n    new = ssh_key_new();\n    if (new == NULL) {\n        return NULL;\n    }\n\n    new->type = key->type;\n    new->type_c = key->type_c;\n    if (demote) {\n        new->flags = SSH_KEY_FLAG_PUBLIC;\n    } else {\n        new->flags = key->flags;\n    }\n\n    switch (key->type) {\n    case SSH_KEYTYPE_DSS: {\n        const BIGNUM *p = NULL, *q = NULL, *g = NULL,\n          *pub_key = NULL, *priv_key = NULL;\n        BIGNUM *np, *nq, *ng, *npub_key, *npriv_key;\n        new->dsa = DSA_new();\n        if (new->dsa == NULL) {\n            goto fail;\n        }\n\n        /*\n         * p        = public prime number\n         * q        = public 160-bit subprime, q | p-1\n         * g        = public generator of subgroup\n         * pub_key  = public key y = g^x\n         * priv_key = private key x\n         */\n        DSA_get0_pqg(key->dsa, &p, &q, &g);\n        np = BN_dup(p);\n        nq = BN_dup(q);\n        ng = BN_dup(g);\n        if (np == NULL || nq == NULL || ng == NULL) {\n            BN_free(np);\n            BN_free(nq);\n            BN_free(ng);\n            goto fail;\n        }\n\n        /* Memory management of np, nq and ng is transferred to DSA object */\n        rc = DSA_set0_pqg(new->dsa, np, nq, ng);\n        if (rc == 0) {\n            BN_free(np);\n            BN_free(nq);\n            BN_free(ng);\n            goto fail;\n        }\n\n        DSA_get0_key(key->dsa, &pub_key, &priv_key);\n        npub_key = BN_dup(pub_key);\n        if (npub_key == NULL) {\n            goto fail;\n        }\n\n        /* Memory management of npubkey is transferred to DSA object */\n        rc = DSA_set0_key(new->dsa, npub_key, NULL);\n        if (rc == 0) {\n            goto fail;\n        }\n\n        if (!demote && (key->flags & SSH_KEY_FLAG_PRIVATE)) {\n            npriv_key = BN_dup(priv_key);\n            if (npriv_key == NULL) {\n                goto fail;\n            }\n\n            /* Memory management of npriv_key is transferred to DSA object */\n            rc = DSA_set0_key(new->dsa, NULL, npriv_key);\n            if (rc == 0) {\n                goto fail;\n            }\n        }\n\n        break;\n    }\n    case SSH_KEYTYPE_RSA:\n    case SSH_KEYTYPE_RSA1: {\n        const BIGNUM *n = NULL, *e = NULL, *d = NULL;\n        BIGNUM *nn, *ne, *nd;\n        new->rsa = RSA_new();\n        if (new->rsa == NULL) {\n            goto fail;\n        }\n\n        /*\n         * n    = public modulus\n         * e    = public exponent\n         * d    = private exponent\n         * p    = secret prime factor\n         * q    = secret prime factor\n         * dmp1 = d mod (p-1)\n         * dmq1 = d mod (q-1)\n         * iqmp = q^-1 mod p\n         */\n        RSA_get0_key(key->rsa, &n, &e, &d);\n        nn = BN_dup(n);\n        ne = BN_dup(e);\n        if (nn == NULL || ne == NULL) {\n            BN_free(nn);\n            BN_free(ne);\n            goto fail;\n        }\n\n        /* Memory management of nn and ne is transferred to RSA object */\n        rc = RSA_set0_key(new->rsa, nn, ne, NULL);\n        if (rc == 0) {\n            BN_free(nn);\n            BN_free(ne);\n            goto fail;\n        }\n\n        if (!demote && (key->flags & SSH_KEY_FLAG_PRIVATE)) {\n            const BIGNUM *p = NULL, *q = NULL, *dmp1 = NULL,\n              *dmq1 = NULL, *iqmp = NULL;\n            BIGNUM *np, *nq, *ndmp1, *ndmq1, *niqmp;\n\n            nd = BN_dup(d);\n            if (nd == NULL) {\n                goto fail;\n            }\n\n            /* Memory management of nd is transferred to RSA object */\n            rc = RSA_set0_key(new->rsa, NULL, NULL, nd);\n            if (rc == 0) {\n                goto fail;\n            }\n\n            /* p, q, dmp1, dmq1 and iqmp may be NULL in private keys, but the\n             * RSA operations are much faster when these values are available.\n             */\n            RSA_get0_factors(key->rsa, &p, &q);\n            if (p != NULL && q != NULL) { /* need to set both of them */\n                np = BN_dup(p);\n                nq = BN_dup(q);\n                if (np == NULL || nq == NULL) {\n                    BN_free(np);\n                    BN_free(nq);\n                    goto fail;\n                }\n\n                /* Memory management of np and nq is transferred to RSA object */\n                rc = RSA_set0_factors(new->rsa, np, nq);\n                if (rc == 0) {\n                    BN_free(np);\n                    BN_free(nq);\n                    goto fail;\n                }\n            }\n\n            RSA_get0_crt_params(key->rsa, &dmp1, &dmq1, &iqmp);\n            if (dmp1 != NULL || dmq1 != NULL || iqmp != NULL) {\n                ndmp1 = BN_dup(dmp1);\n                ndmq1 = BN_dup(dmq1);\n                niqmp = BN_dup(iqmp);\n                if (ndmp1 == NULL || ndmq1 == NULL || niqmp == NULL) {\n                    BN_free(ndmp1);\n                    BN_free(ndmq1);\n                    BN_free(niqmp);\n                    goto fail;\n                }\n\n                /* Memory management of ndmp1, ndmq1 and niqmp is transferred\n                 * to RSA object */\n                rc =  RSA_set0_crt_params(new->rsa, ndmp1, ndmq1, niqmp);\n                if (rc == 0) {\n                    BN_free(ndmp1);\n                    BN_free(ndmq1);\n                    BN_free(niqmp);\n                    goto fail;\n                }\n            }\n        }\n\n        break;\n    }\n    case SSH_KEYTYPE_ECDSA_P256:\n    case SSH_KEYTYPE_ECDSA_P384:\n    case SSH_KEYTYPE_ECDSA_P521:\n#ifdef HAVE_OPENSSL_ECC\n        new->ecdsa_nid = key->ecdsa_nid;\n\n        /* privkey -> pubkey */\n        if (demote && ssh_key_is_private(key)) {\n            const EC_POINT *p;\n            int ok;\n\n            new->ecdsa = EC_KEY_new_by_curve_name(key->ecdsa_nid);\n            if (new->ecdsa == NULL) {\n                goto fail;\n            }\n\n            p = EC_KEY_get0_public_key(key->ecdsa);\n            if (p == NULL) {\n                goto fail;\n            }\n\n            ok = EC_KEY_set_public_key(new->ecdsa, p);\n            if (!ok) {\n                goto fail;\n            }\n        } else {\n            new->ecdsa = EC_KEY_dup(key->ecdsa);\n        }\n        break;\n#endif\n    case SSH_KEYTYPE_ED25519:\n        rc = pki_ed25519_key_dup(new, key);\n        if (rc != SSH_OK) {\n            goto fail;\n        }\n        break;\n    case SSH_KEYTYPE_UNKNOWN:\n    default:\n        ssh_key_free(new);\n        return NULL;\n    }\n\n    return new;\nfail:\n    ssh_key_free(new);\n    return NULL;\n}\n\nint pki_key_generate_rsa(ssh_key key, int parameter){\n\tBIGNUM *e;\n\tint rc;\n\n\te = BN_new();\n\tkey->rsa = RSA_new();\n\n\tBN_set_word(e, 65537);\n\trc = RSA_generate_key_ex(key->rsa, parameter, e, NULL);\n\n\tBN_free(e);\n\n\tif (rc <= 0 || key->rsa == NULL)\n\t\treturn SSH_ERROR;\n\treturn SSH_OK;\n}\n\nint pki_key_generate_dss(ssh_key key, int parameter){\n    int rc;\n#if OPENSSL_VERSION_NUMBER > 0x00908000L\n    key->dsa = DSA_new();\n    if (key->dsa == NULL) {\n        return SSH_ERROR;\n    }\n    rc = DSA_generate_parameters_ex(key->dsa,\n                                    parameter,\n                                    NULL,  /* seed */\n                                    0,     /* seed_len */\n                                    NULL,  /* counter_ret */\n                                    NULL,  /* h_ret */\n                                    NULL); /* cb */\n    if (rc != 1) {\n        DSA_free(key->dsa);\n        key->dsa = NULL;\n        return SSH_ERROR;\n    }\n#else\n    key->dsa = DSA_generate_parameters(parameter, NULL, 0, NULL, NULL,\n            NULL, NULL);\n    if(key->dsa == NULL){\n        return SSH_ERROR;\n    }\n#endif\n    rc = DSA_generate_key(key->dsa);\n    if (rc != 1){\n        DSA_free(key->dsa);\n        key->dsa=NULL;\n        return SSH_ERROR;\n    }\n    return SSH_OK;\n}\n\n#ifdef HAVE_OPENSSL_ECC\nint pki_key_generate_ecdsa(ssh_key key, int parameter) {\n    int ok;\n\n    switch (parameter) {\n        case 384:\n            key->ecdsa_nid = NID_secp384r1;\n            key->type = SSH_KEYTYPE_ECDSA_P384;\n            break;\n        case 521:\n            key->ecdsa_nid = NID_secp521r1;\n            key->type = SSH_KEYTYPE_ECDSA_P521;\n            break;\n        case 256:\n            key->ecdsa_nid = NID_X9_62_prime256v1;\n            key->type = SSH_KEYTYPE_ECDSA_P256;\n            break;\n        default:\n            SSH_LOG(SSH_LOG_WARN, \"Invalid parameter %d for ECDSA key \"\n                    \"generation\", parameter);\n            return SSH_ERROR;\n    }\n\n    key->ecdsa = EC_KEY_new_by_curve_name(key->ecdsa_nid);\n    if (key->ecdsa == NULL) {\n        return SSH_ERROR;\n    }\n\n    ok = EC_KEY_generate_key(key->ecdsa);\n    if (!ok) {\n        EC_KEY_free(key->ecdsa);\n        return SSH_ERROR;\n    }\n\n    EC_KEY_set_asn1_flag(key->ecdsa, OPENSSL_EC_NAMED_CURVE);\n\n    return SSH_OK;\n}\n#endif\n\nint pki_key_compare(const ssh_key k1,\n                    const ssh_key k2,\n                    enum ssh_keycmp_e what)\n{\n    switch (k1->type) {\n        case SSH_KEYTYPE_DSS: {\n            const BIGNUM *p1, *p2, *q1, *q2, *g1, *g2,\n                *pub_key1, *pub_key2, *priv_key1, *priv_key2;\n            if (DSA_size(k1->dsa) != DSA_size(k2->dsa)) {\n                return 1;\n            }\n            DSA_get0_pqg(k1->dsa, &p1, &q1, &g1);\n            DSA_get0_pqg(k2->dsa, &p2, &q2, &g2);\n            if (bignum_cmp(p1, p2) != 0) {\n                return 1;\n            }\n            if (bignum_cmp(q1, q2) != 0) {\n                return 1;\n            }\n            if (bignum_cmp(g1, g2) != 0) {\n                return 1;\n            }\n            DSA_get0_key(k1->dsa, &pub_key1, &priv_key1);\n            DSA_get0_key(k2->dsa, &pub_key2, &priv_key2);\n            if (bignum_cmp(pub_key1, pub_key2) != 0) {\n                return 1;\n            }\n\n            if (what == SSH_KEY_CMP_PRIVATE) {\n                if (bignum_cmp(priv_key1, priv_key2) != 0) {\n                    return 1;\n                }\n            }\n            break;\n        }\n        case SSH_KEYTYPE_RSA:\n        case SSH_KEYTYPE_RSA1: {\n            const BIGNUM *e1, *e2, *n1, *n2, *p1, *p2, *q1, *q2;\n            if (RSA_size(k1->rsa) != RSA_size(k2->rsa)) {\n                return 1;\n            }\n            RSA_get0_key(k1->rsa, &n1, &e1, NULL);\n            RSA_get0_key(k2->rsa, &n2, &e2, NULL);\n            if (bignum_cmp(e1, e2) != 0) {\n                return 1;\n            }\n            if (bignum_cmp(n1, n2) != 0) {\n                return 1;\n            }\n\n            if (what == SSH_KEY_CMP_PRIVATE) {\n                RSA_get0_factors(k1->rsa, &p1, &q1);\n                RSA_get0_factors(k2->rsa, &p2, &q2);\n                if (bignum_cmp(p1, p2) != 0) {\n                    return 1;\n                }\n\n                if (bignum_cmp(q1, q2) != 0) {\n                    return 1;\n                }\n            }\n            break;\n        }\n        case SSH_KEYTYPE_ECDSA_P256:\n        case SSH_KEYTYPE_ECDSA_P384:\n        case SSH_KEYTYPE_ECDSA_P521:\n#ifdef HAVE_OPENSSL_ECC\n            {\n                const EC_POINT *p1 = EC_KEY_get0_public_key(k1->ecdsa);\n                const EC_POINT *p2 = EC_KEY_get0_public_key(k2->ecdsa);\n                const EC_GROUP *g1 = EC_KEY_get0_group(k1->ecdsa);\n                const EC_GROUP *g2 = EC_KEY_get0_group(k2->ecdsa);\n\n                if (p1 == NULL || p2 == NULL) {\n                    return 1;\n                }\n\n                if (EC_GROUP_cmp(g1, g2, NULL) != 0) {\n                    return 1;\n                }\n\n                if (EC_POINT_cmp(g1, p1, p2, NULL) != 0) {\n                    return 1;\n                }\n\n                if (what == SSH_KEY_CMP_PRIVATE) {\n                    if (bignum_cmp(EC_KEY_get0_private_key(k1->ecdsa),\n                                   EC_KEY_get0_private_key(k2->ecdsa))) {\n                        return 1;\n                    }\n                }\n\n                break;\n            }\n#endif\n        case SSH_KEYTYPE_ED25519:\n            /* ed25519 keys handled globaly */\n        case SSH_KEYTYPE_UNKNOWN:\n        default:\n            return 1;\n    }\n\n    return 0;\n}\n\nssh_string pki_private_key_to_pem(const ssh_key key,\n                                  const char *passphrase,\n                                  ssh_auth_callback auth_fn,\n                                  void *auth_data)\n{\n    ssh_string blob = NULL;\n    BUF_MEM *buf = NULL;\n    BIO *mem = NULL;\n    EVP_PKEY *pkey = NULL;\n    int rc;\n\n    mem = BIO_new(BIO_s_mem());\n    if (mem == NULL) {\n        return NULL;\n    }\n\n    switch (key->type) {\n        case SSH_KEYTYPE_DSS:\n            pkey = EVP_PKEY_new();\n            if (pkey == NULL) {\n                goto err;\n            }\n\n            rc = EVP_PKEY_set1_DSA(pkey, key->dsa);\n            break;\n        case SSH_KEYTYPE_RSA:\n        case SSH_KEYTYPE_RSA1:\n            pkey = EVP_PKEY_new();\n            if (pkey == NULL) {\n                goto err;\n            }\n\n            rc = EVP_PKEY_set1_RSA(pkey, key->rsa);\n            break;\n#ifdef HAVE_ECC\n        case SSH_KEYTYPE_ECDSA_P256:\n        case SSH_KEYTYPE_ECDSA_P384:\n        case SSH_KEYTYPE_ECDSA_P521:\n            pkey = EVP_PKEY_new();\n            if (pkey == NULL) {\n                goto err;\n            }\n\n            rc = EVP_PKEY_set1_EC_KEY(pkey, key->ecdsa);\n            break;\n#endif\n        case SSH_KEYTYPE_ED25519:\n#ifdef HAVE_OPENSSL_ED25519\n            /* In OpenSSL, the input is the private key seed only, which means\n             * the first half of the SSH private key (the second half is the\n             * public key) */\n            pkey = EVP_PKEY_new_raw_private_key(EVP_PKEY_ED25519, NULL,\n                    (const uint8_t *)key->ed25519_privkey,\n                    ED25519_KEY_LEN);\n            if (pkey == NULL) {\n                SSH_LOG(SSH_LOG_TRACE,\n                        \"Failed to create ed25519 EVP_PKEY: %s\",\n                        ERR_error_string(ERR_get_error(), NULL));\n                goto err;\n            }\n\n            /* Mark the operation as successful as for the other key types */\n            rc = 1;\n            break;\n#else\n            SSH_LOG(SSH_LOG_WARN, \"PEM output not supported for key type ssh-ed25519\");\n            goto err;\n#endif\n        case SSH_KEYTYPE_DSS_CERT01:\n        case SSH_KEYTYPE_RSA_CERT01:\n        case SSH_KEYTYPE_ECDSA_P256_CERT01:\n        case SSH_KEYTYPE_ECDSA_P384_CERT01:\n        case SSH_KEYTYPE_ECDSA_P521_CERT01:\n        case SSH_KEYTYPE_ED25519_CERT01:\n        case SSH_KEYTYPE_UNKNOWN:\n        default:\n            SSH_LOG(SSH_LOG_WARN, \"Unknown or invalid private key type %d\", key->type);\n            goto err;\n    }\n    if (rc != 1) {\n        SSH_LOG(SSH_LOG_WARN, \"Failed to initialize EVP_PKEY structure\");\n        goto err;\n    }\n\n    if (passphrase == NULL) {\n        struct pem_get_password_struct pgp = { auth_fn, auth_data };\n\n        rc = PEM_write_bio_PrivateKey(mem,\n                                      pkey,\n                                      NULL, /* cipher */\n                                      NULL, /* kstr */\n                                      0, /* klen */\n                                      pem_get_password,\n                                      &pgp);\n    } else {\n        rc = PEM_write_bio_PrivateKey(mem,\n                                      pkey,\n                                      EVP_aes_128_cbc(),\n                                      NULL, /* kstr */\n                                      0, /* klen */\n                                      NULL, /* auth_fn */\n                                      (void*) passphrase);\n    }\n    EVP_PKEY_free(pkey);\n    pkey = NULL;\n\n    if (rc != 1) {\n        goto err;\n    }\n\n    BIO_get_mem_ptr(mem, &buf);\n\n    blob = ssh_string_new(buf->length);\n    if (blob == NULL) {\n        goto err;\n    }\n\n    ssh_string_fill(blob, buf->data, buf->length);\n    BIO_free(mem);\n\n    return blob;\n\nerr:\n    EVP_PKEY_free(pkey);\n    BIO_free(mem);\n    return NULL;\n}\n\nssh_key pki_private_key_from_base64(const char *b64_key,\n                                    const char *passphrase,\n                                    ssh_auth_callback auth_fn,\n                                    void *auth_data)\n{\n    BIO *mem = NULL;\n    DSA *dsa = NULL;\n    RSA *rsa = NULL;\n#ifdef HAVE_OPENSSL_ED25519\n    uint8_t *ed25519 = NULL;\n#else\n    ed25519_privkey *ed25519 = NULL;\n#endif\n    ssh_key key = NULL;\n    enum ssh_keytypes_e type = SSH_KEYTYPE_UNKNOWN;\n#ifdef HAVE_OPENSSL_ECC\n    EC_KEY *ecdsa = NULL;\n#else\n    void *ecdsa = NULL;\n#endif\n    EVP_PKEY *pkey = NULL;\n\n    mem = BIO_new_mem_buf((void*)b64_key, -1);\n\n    if (passphrase == NULL) {\n        if (auth_fn) {\n            struct pem_get_password_struct pgp = { auth_fn, auth_data };\n\n            pkey = PEM_read_bio_PrivateKey(mem, NULL, pem_get_password, &pgp);\n        } else {\n            /* openssl uses its own callback to get the passphrase here */\n            pkey = PEM_read_bio_PrivateKey(mem, NULL, NULL, NULL);\n        }\n    } else {\n        pkey = PEM_read_bio_PrivateKey(mem, NULL, NULL, (void *) passphrase);\n    }\n\n    BIO_free(mem);\n\n    if (pkey == NULL) {\n        SSH_LOG(SSH_LOG_WARN,\n                \"Parsing private key: %s\",\n                ERR_error_string(ERR_get_error(), NULL));\n        return NULL;\n    }\n    switch (EVP_PKEY_base_id(pkey)) {\n    case EVP_PKEY_DSA:\n        dsa = EVP_PKEY_get1_DSA(pkey);\n        if (dsa == NULL) {\n            SSH_LOG(SSH_LOG_WARN,\n                    \"Parsing private key: %s\",\n                    ERR_error_string(ERR_get_error(),NULL));\n            goto fail;\n        }\n        type = SSH_KEYTYPE_DSS;\n        break;\n    case EVP_PKEY_RSA:\n        rsa = EVP_PKEY_get1_RSA(pkey);\n        if (rsa == NULL) {\n            SSH_LOG(SSH_LOG_WARN,\n                    \"Parsing private key: %s\",\n                    ERR_error_string(ERR_get_error(),NULL));\n            goto fail;\n        }\n        type = SSH_KEYTYPE_RSA;\n        break;\n    case EVP_PKEY_EC:\n#ifdef HAVE_OPENSSL_ECC\n        ecdsa = EVP_PKEY_get1_EC_KEY(pkey);\n        if (ecdsa == NULL) {\n            SSH_LOG(SSH_LOG_WARN,\n                    \"Parsing private key: %s\",\n                    ERR_error_string(ERR_get_error(), NULL));\n            goto fail;\n        }\n\n        /* pki_privatekey_type_from_string always returns P256 for ECDSA\n         * keys, so we need to figure out the correct type here */\n        type = pki_key_ecdsa_to_key_type(ecdsa);\n        if (type == SSH_KEYTYPE_UNKNOWN) {\n            SSH_LOG(SSH_LOG_WARN, \"Invalid private key.\");\n            goto fail;\n        }\n\n        break;\n#endif\n#ifdef HAVE_OPENSSL_ED25519\n    case EVP_PKEY_ED25519:\n    {\n        size_t key_len;\n        int evp_rc = 0;\n\n        /* Get the key length */\n        evp_rc = EVP_PKEY_get_raw_private_key(pkey, NULL, &key_len);\n        if (evp_rc != 1) {\n            SSH_LOG(SSH_LOG_TRACE,\n                    \"Failed to get ed25519 raw private key length:  %s\",\n                    ERR_error_string(ERR_get_error(), NULL));\n            goto fail;\n        }\n\n        if (key_len != ED25519_KEY_LEN) {\n            goto fail;\n        }\n\n        ed25519 = malloc(key_len);\n        if (ed25519 == NULL) {\n            SSH_LOG(SSH_LOG_WARN, \"Out of memory\");\n            goto fail;\n        }\n\n        evp_rc = EVP_PKEY_get_raw_private_key(pkey, (uint8_t *)ed25519,\n                                              &key_len);\n        if (evp_rc != 1) {\n            SSH_LOG(SSH_LOG_TRACE,\n                    \"Failed to get ed25519 raw private key:  %s\",\n                    ERR_error_string(ERR_get_error(), NULL));\n            goto fail;\n        }\n        type = SSH_KEYTYPE_ED25519;\n    }\n    break;\n#endif\n    default:\n        EVP_PKEY_free(pkey);\n        SSH_LOG(SSH_LOG_WARN, \"Unknown or invalid private key type %d\",\n                EVP_PKEY_base_id(pkey));\n        return NULL;\n    }\n    EVP_PKEY_free(pkey);\n\n    key = ssh_key_new();\n    if (key == NULL) {\n        goto fail;\n    }\n\n    key->type = type;\n    key->type_c = ssh_key_type_to_char(type);\n    key->flags = SSH_KEY_FLAG_PRIVATE | SSH_KEY_FLAG_PUBLIC;\n    key->dsa = dsa;\n    key->rsa = rsa;\n    key->ecdsa = ecdsa;\n    key->ed25519_privkey = ed25519;\n#ifdef HAVE_OPENSSL_ECC\n    if (is_ecdsa_key_type(key->type)) {\n        key->ecdsa_nid = pki_key_ecdsa_to_nid(key->ecdsa);\n    }\n#endif\n\n    return key;\nfail:\n    EVP_PKEY_free(pkey);\n    ssh_key_free(key);\n    DSA_free(dsa);\n    RSA_free(rsa);\n#ifdef HAVE_OPENSSL_ECC\n    EC_KEY_free(ecdsa);\n#endif\n#ifdef HAVE_OPENSSL_ED25519\n    SAFE_FREE(ed25519);\n#endif\n    return NULL;\n}\n\nint pki_privkey_build_dss(ssh_key key,\n                          ssh_string p,\n                          ssh_string q,\n                          ssh_string g,\n                          ssh_string pubkey,\n                          ssh_string privkey)\n{\n    int rc;\n    BIGNUM *bp, *bq, *bg, *bpub_key, *bpriv_key;\n\n    key->dsa = DSA_new();\n    if (key->dsa == NULL) {\n        return SSH_ERROR;\n    }\n\n    bp = ssh_make_string_bn(p);\n    bq = ssh_make_string_bn(q);\n    bg = ssh_make_string_bn(g);\n    bpub_key = ssh_make_string_bn(pubkey);\n    bpriv_key = ssh_make_string_bn(privkey);\n    if (bp == NULL || bq == NULL ||\n        bg == NULL || bpub_key == NULL) {\n        goto fail;\n    }\n\n    /* Memory management of bp, qq and bg is transferred to DSA object */\n    rc = DSA_set0_pqg(key->dsa, bp, bq, bg);\n    if (rc == 0) {\n        goto fail;\n    }\n\n    /* Memory management of bpub_key and bpriv_key is transferred to DSA object */\n    rc = DSA_set0_key(key->dsa, bpub_key, bpriv_key);\n    if (rc == 0) {\n        goto fail;\n    }\n\n    return SSH_OK;\nfail:\n    DSA_free(key->dsa);\n    return SSH_ERROR;\n}\n\nint pki_pubkey_build_dss(ssh_key key,\n                         ssh_string p,\n                         ssh_string q,\n                         ssh_string g,\n                         ssh_string pubkey) {\n    int rc;\n    BIGNUM *bp = NULL, *bq = NULL, *bg = NULL, *bpub_key = NULL;\n\n    key->dsa = DSA_new();\n    if (key->dsa == NULL) {\n        return SSH_ERROR;\n    }\n\n    bp = ssh_make_string_bn(p);\n    bq = ssh_make_string_bn(q);\n    bg = ssh_make_string_bn(g);\n    bpub_key = ssh_make_string_bn(pubkey);\n    if (bp == NULL || bq == NULL ||\n        bg == NULL || bpub_key == NULL) {\n        goto fail;\n    }\n\n    /* Memory management of bp, bq and bg is transferred to DSA object */\n    rc = DSA_set0_pqg(key->dsa, bp, bq, bg);\n    if (rc == 0) {\n        goto fail;\n    }\n\n    /* Memory management of npub_key is transferred to DSA object */\n    rc = DSA_set0_key(key->dsa, bpub_key, NULL);\n    if (rc == 0) {\n        goto fail;\n    }\n\n    return SSH_OK;\nfail:\n    DSA_free(key->dsa);\n    return SSH_ERROR;\n}\n\nint pki_privkey_build_rsa(ssh_key key,\n                          ssh_string n,\n                          ssh_string e,\n                          ssh_string d,\n                          UNUSED_PARAM(ssh_string iqmp),\n                          ssh_string p,\n                          ssh_string q)\n{\n    int rc;\n    BIGNUM *be, *bn, *bd/*, *biqmp*/, *bp, *bq;\n\n    key->rsa = RSA_new();\n    if (key->rsa == NULL) {\n        return SSH_ERROR;\n    }\n\n    bn = ssh_make_string_bn(n);\n    be = ssh_make_string_bn(e);\n    bd = ssh_make_string_bn(d);\n    /*biqmp = ssh_make_string_bn(iqmp);*/\n    bp = ssh_make_string_bn(p);\n    bq = ssh_make_string_bn(q);\n    if (be == NULL || bn == NULL || bd == NULL ||\n        /*biqmp == NULL ||*/ bp == NULL || bq == NULL) {\n        goto fail;\n    }\n\n    /* Memory management of be, bn and bd is transferred to RSA object */\n    rc = RSA_set0_key(key->rsa, bn, be, bd);\n    if (rc == 0) {\n        goto fail;\n    }\n\n    /* Memory management of bp and bq is transferred to RSA object */\n    rc = RSA_set0_factors(key->rsa, bp, bq);\n    if (rc == 0) {\n        goto fail;\n    }\n\n    /* p, q, dmp1, dmq1 and iqmp may be NULL in private keys, but the RSA\n     * operations are much faster when these values are available.\n     * https://www.openssl.org/docs/man1.0.2/crypto/rsa.html\n     */\n    /* RSA_set0_crt_params(key->rsa, biqmp, NULL, NULL);\n    TODO calculate missing crt_params */\n\n    return SSH_OK;\nfail:\n    RSA_free(key->rsa);\n    return SSH_ERROR;\n}\n\nint pki_pubkey_build_rsa(ssh_key key,\n                         ssh_string e,\n                         ssh_string n) {\n    int rc;\n    BIGNUM *be = NULL, *bn = NULL;\n\n    key->rsa = RSA_new();\n    if (key->rsa == NULL) {\n        return SSH_ERROR;\n    }\n\n    be = ssh_make_string_bn(e);\n    bn = ssh_make_string_bn(n);\n    if (be == NULL || bn == NULL) {\n        goto fail;\n    }\n\n    /* Memory management of bn and be is transferred to RSA object */\n    rc = RSA_set0_key(key->rsa, bn, be, NULL);\n    if (rc == 0) {\n        goto fail;\n    }\n\n    return SSH_OK;\nfail:\n    RSA_free(key->rsa);\n    return SSH_ERROR;\n}\n\nssh_string pki_publickey_to_blob(const ssh_key key)\n{\n    ssh_buffer buffer;\n    ssh_string type_s;\n    ssh_string str = NULL;\n    ssh_string e = NULL;\n    ssh_string n = NULL;\n    ssh_string p = NULL;\n    ssh_string g = NULL;\n    ssh_string q = NULL;\n    int rc;\n\n    buffer = ssh_buffer_new();\n    if (buffer == NULL) {\n        return NULL;\n    }\n\n    if (key->cert != NULL) {\n        rc = ssh_buffer_add_buffer(buffer, key->cert);\n        if (rc < 0) {\n            SSH_BUFFER_FREE(buffer);\n            return NULL;\n        }\n        goto makestring;\n    }\n\n    type_s = ssh_string_from_char(key->type_c);\n    if (type_s == NULL) {\n        SSH_BUFFER_FREE(buffer);\n        return NULL;\n    }\n\n    rc = ssh_buffer_add_ssh_string(buffer, type_s);\n    SSH_STRING_FREE(type_s);\n    if (rc < 0) {\n        SSH_BUFFER_FREE(buffer);\n        return NULL;\n    }\n\n    switch (key->type) {\n        case SSH_KEYTYPE_DSS: {\n            const BIGNUM *bp, *bq, *bg, *bpub_key;\n            DSA_get0_pqg(key->dsa, &bp, &bq, &bg);\n            p = ssh_make_bignum_string((BIGNUM *)bp);\n            if (p == NULL) {\n                goto fail;\n            }\n\n            q = ssh_make_bignum_string((BIGNUM *)bq);\n            if (q == NULL) {\n                goto fail;\n            }\n\n            g = ssh_make_bignum_string((BIGNUM *)bg);\n            if (g == NULL) {\n                goto fail;\n            }\n\n            DSA_get0_key(key->dsa, &bpub_key, NULL);\n            n = ssh_make_bignum_string((BIGNUM *)bpub_key);\n            if (n == NULL) {\n                goto fail;\n            }\n\n            if (ssh_buffer_add_ssh_string(buffer, p) < 0) {\n                goto fail;\n            }\n            if (ssh_buffer_add_ssh_string(buffer, q) < 0) {\n                goto fail;\n            }\n            if (ssh_buffer_add_ssh_string(buffer, g) < 0) {\n                goto fail;\n            }\n            if (ssh_buffer_add_ssh_string(buffer, n) < 0) {\n                goto fail;\n            }\n\n            ssh_string_burn(p);\n            SSH_STRING_FREE(p);\n            p = NULL;\n            ssh_string_burn(g);\n            SSH_STRING_FREE(g);\n            g = NULL;\n            ssh_string_burn(q);\n            SSH_STRING_FREE(q);\n            q = NULL;\n            ssh_string_burn(n);\n            SSH_STRING_FREE(n);\n            n = NULL;\n\n            break;\n        }\n        case SSH_KEYTYPE_RSA:\n        case SSH_KEYTYPE_RSA1: {\n            const BIGNUM *be, *bn;\n            RSA_get0_key(key->rsa, &bn, &be, NULL);\n            e = ssh_make_bignum_string((BIGNUM *)be);\n            if (e == NULL) {\n                goto fail;\n            }\n\n            n = ssh_make_bignum_string((BIGNUM *)bn);\n            if (n == NULL) {\n                goto fail;\n            }\n\n            if (ssh_buffer_add_ssh_string(buffer, e) < 0) {\n                goto fail;\n            }\n            if (ssh_buffer_add_ssh_string(buffer, n) < 0) {\n                goto fail;\n            }\n\n            ssh_string_burn(e);\n            SSH_STRING_FREE(e);\n            e = NULL;\n            ssh_string_burn(n);\n            SSH_STRING_FREE(n);\n            n = NULL;\n\n            break;\n        }\n        case SSH_KEYTYPE_ED25519:\n            rc = pki_ed25519_public_key_to_blob(buffer, key);\n            if (rc == SSH_ERROR){\n                goto fail;\n            }\n            break;\n        case SSH_KEYTYPE_ECDSA_P256:\n        case SSH_KEYTYPE_ECDSA_P384:\n        case SSH_KEYTYPE_ECDSA_P521:\n#ifdef HAVE_OPENSSL_ECC\n            type_s = ssh_string_from_char(pki_key_ecdsa_nid_to_char(key->ecdsa_nid));\n            if (type_s == NULL) {\n                SSH_BUFFER_FREE(buffer);\n                return NULL;\n            }\n\n            rc = ssh_buffer_add_ssh_string(buffer, type_s);\n            SSH_STRING_FREE(type_s);\n            if (rc < 0) {\n                SSH_BUFFER_FREE(buffer);\n                return NULL;\n            }\n\n            e = make_ecpoint_string(EC_KEY_get0_group(key->ecdsa),\n                                    EC_KEY_get0_public_key(key->ecdsa));\n            if (e == NULL) {\n                SSH_BUFFER_FREE(buffer);\n                return NULL;\n            }\n\n            rc = ssh_buffer_add_ssh_string(buffer, e);\n            if (rc < 0) {\n                goto fail;\n            }\n\n            ssh_string_burn(e);\n            SSH_STRING_FREE(e);\n            e = NULL;\n\n            break;\n#endif\n        case SSH_KEYTYPE_UNKNOWN:\n        default:\n            goto fail;\n    }\n\nmakestring:\n    str = ssh_string_new(ssh_buffer_get_len(buffer));\n    if (str == NULL) {\n        goto fail;\n    }\n\n    rc = ssh_string_fill(str, ssh_buffer_get(buffer), ssh_buffer_get_len(buffer));\n    if (rc < 0) {\n        goto fail;\n    }\n    SSH_BUFFER_FREE(buffer);\n\n    return str;\nfail:\n    SSH_BUFFER_FREE(buffer);\n    ssh_string_burn(str);\n    SSH_STRING_FREE(str);\n    ssh_string_burn(e);\n    SSH_STRING_FREE(e);\n    ssh_string_burn(p);\n    SSH_STRING_FREE(p);\n    ssh_string_burn(g);\n    SSH_STRING_FREE(g);\n    ssh_string_burn(q);\n    SSH_STRING_FREE(q);\n    ssh_string_burn(n);\n    SSH_STRING_FREE(n);\n\n    return NULL;\n}\n\nstatic ssh_string pki_dsa_signature_to_blob(const ssh_signature sig)\n{\n    char buffer[40] = { 0 };\n    ssh_string sig_blob = NULL;\n    const BIGNUM *pr = NULL, *ps = NULL;\n\n    ssh_string r = NULL;\n    int r_len, r_offset_in, r_offset_out;\n\n    ssh_string s = NULL;\n    int s_len, s_offset_in, s_offset_out;\n\n    const unsigned char *raw_sig_data = NULL;\n    size_t raw_sig_len;\n\n    DSA_SIG *dsa_sig;\n\n    if (sig == NULL || sig->raw_sig == NULL) {\n        return NULL;\n    }\n    raw_sig_data = ssh_string_data(sig->raw_sig);\n    if (raw_sig_data == NULL) {\n        return NULL;\n    }\n    raw_sig_len = ssh_string_len(sig->raw_sig);\n\n    dsa_sig = d2i_DSA_SIG(NULL, &raw_sig_data, raw_sig_len);\n    if (dsa_sig == NULL) {\n        return NULL;\n    }\n\n    DSA_SIG_get0(dsa_sig, &pr, &ps);\n    if (pr == NULL || ps == NULL) {\n        goto error;\n    }\n\n    r = ssh_make_bignum_string((BIGNUM *)pr);\n    if (r == NULL) {\n        goto error;\n    }\n\n    s = ssh_make_bignum_string((BIGNUM *)ps);\n    if (s == NULL) {\n        goto error;\n    }\n\n    r_len = ssh_string_len(r);\n    r_offset_in  = (r_len > 20) ? (r_len - 20) : 0;\n    r_offset_out = (r_len < 20) ? (20 - r_len) : 0;\n\n    s_len = ssh_string_len(s);\n    s_offset_in  = (s_len > 20) ? (s_len - 20) : 0;\n    s_offset_out = (s_len < 20) ? (20 - s_len) : 0;\n\n    memcpy(buffer + r_offset_out,\n           ((char *)ssh_string_data(r)) + r_offset_in,\n           r_len - r_offset_in);\n    memcpy(buffer + 20 + s_offset_out,\n           ((char *)ssh_string_data(s)) + s_offset_in,\n           s_len - s_offset_in);\n\n    DSA_SIG_free(dsa_sig);\n    SSH_STRING_FREE(r);\n    SSH_STRING_FREE(s);\n\n    sig_blob = ssh_string_new(40);\n    if (sig_blob == NULL) {\n        return NULL;\n    }\n\n    ssh_string_fill(sig_blob, buffer, 40);\n\n    return sig_blob;\n\nerror:\n    DSA_SIG_free(dsa_sig);\n    SSH_STRING_FREE(r);\n    SSH_STRING_FREE(s);\n    return NULL;\n}\n\nstatic ssh_string pki_ecdsa_signature_to_blob(const ssh_signature sig)\n{\n    ssh_string r = NULL;\n    ssh_string s = NULL;\n\n    ssh_buffer buf = NULL;\n    ssh_string sig_blob = NULL;\n\n    const BIGNUM *pr = NULL, *ps = NULL;\n\n    const unsigned char *raw_sig_data = NULL;\n    size_t raw_sig_len;\n\n    ECDSA_SIG *ecdsa_sig;\n\n    int rc;\n\n    if (sig == NULL || sig->raw_sig == NULL) {\n        return NULL;\n    }\n    raw_sig_data = ssh_string_data(sig->raw_sig);\n    if (raw_sig_data == NULL) {\n        return NULL;\n    }\n    raw_sig_len = ssh_string_len(sig->raw_sig);\n\n    ecdsa_sig = d2i_ECDSA_SIG(NULL, &raw_sig_data, raw_sig_len);\n    if (ecdsa_sig == NULL) {\n        return NULL;\n    }\n\n    ECDSA_SIG_get0(ecdsa_sig, &pr, &ps);\n    if (pr == NULL || ps == NULL) {\n        goto error;\n    }\n\n    r = ssh_make_bignum_string((BIGNUM *)pr);\n    if (r == NULL) {\n        goto error;\n    }\n\n    s = ssh_make_bignum_string((BIGNUM *)ps);\n    if (s == NULL) {\n        goto error;\n    }\n\n    buf = ssh_buffer_new();\n    if (buf == NULL) {\n        goto error;\n    }\n\n    rc = ssh_buffer_add_ssh_string(buf, r);\n    if (rc < 0) {\n        goto error;\n    }\n\n    rc = ssh_buffer_add_ssh_string(buf, s);\n    if (rc < 0) {\n        goto error;\n    }\n\n    sig_blob = ssh_string_new(ssh_buffer_get_len(buf));\n    if (sig_blob == NULL) {\n        goto error;\n    }\n\n    ssh_string_fill(sig_blob, ssh_buffer_get(buf), ssh_buffer_get_len(buf));\n\n    SSH_STRING_FREE(r);\n    SSH_STRING_FREE(s);\n    ECDSA_SIG_free(ecdsa_sig);\n    SSH_BUFFER_FREE(buf);\n\n    return sig_blob;\n\nerror:\n    SSH_STRING_FREE(r);\n    SSH_STRING_FREE(s);\n    ECDSA_SIG_free(ecdsa_sig);\n    SSH_BUFFER_FREE(buf);\n    return NULL;\n}\n\nssh_string pki_signature_to_blob(const ssh_signature sig)\n{\n    ssh_string sig_blob = NULL;\n\n    switch(sig->type) {\n        case SSH_KEYTYPE_DSS:\n            sig_blob = pki_dsa_signature_to_blob(sig);\n            break;\n        case SSH_KEYTYPE_RSA:\n        case SSH_KEYTYPE_RSA1:\n            sig_blob = ssh_string_copy(sig->raw_sig);\n            break;\n        case SSH_KEYTYPE_ED25519:\n            sig_blob = pki_ed25519_signature_to_blob(sig);\n            break;\n        case SSH_KEYTYPE_ECDSA_P256:\n        case SSH_KEYTYPE_ECDSA_P384:\n        case SSH_KEYTYPE_ECDSA_P521:\n#ifdef HAVE_OPENSSL_ECC\n            sig_blob = pki_ecdsa_signature_to_blob(sig);\n            break;\n#endif\n        default:\n        case SSH_KEYTYPE_UNKNOWN:\n            SSH_LOG(SSH_LOG_WARN, \"Unknown signature key type: %s\", sig->type_c);\n            return NULL;\n    }\n\n    return sig_blob;\n}\n\nstatic int pki_signature_from_rsa_blob(const ssh_key pubkey,\n                                       const ssh_string sig_blob,\n                                       ssh_signature sig)\n{\n    uint32_t pad_len = 0;\n    char *blob_orig = NULL;\n    char *blob_padded_data = NULL;\n    ssh_string sig_blob_padded = NULL;\n\n    size_t rsalen = 0;\n    size_t len = ssh_string_len(sig_blob);\n\n    if (pubkey->rsa == NULL) {\n        SSH_LOG(SSH_LOG_WARN, \"Pubkey RSA field NULL\");\n        goto errout;\n    }\n\n    rsalen = RSA_size(pubkey->rsa);\n    if (len > rsalen) {\n        SSH_LOG(SSH_LOG_WARN,\n                \"Signature is too big: %lu > %lu\",\n                (unsigned long)len,\n                (unsigned long)rsalen);\n        goto errout;\n    }\n\n#ifdef DEBUG_CRYPTO\n    SSH_LOG(SSH_LOG_WARN, \"RSA signature len: %lu\", (unsigned long)len);\n    ssh_log_hexdump(\"RSA signature\", ssh_string_data(sig_blob), len);\n#endif\n\n    if (len == rsalen) {\n        sig->raw_sig = ssh_string_copy(sig_blob);\n    } else {\n        /* pad the blob to the expected rsalen size */\n        SSH_LOG(SSH_LOG_DEBUG,\n                \"RSA signature len %lu < %lu\",\n                (unsigned long)len,\n                (unsigned long)rsalen);\n\n        pad_len = rsalen - len;\n\n        sig_blob_padded = ssh_string_new(rsalen);\n        if (sig_blob_padded == NULL) {\n            goto errout;\n        }\n\n        blob_padded_data = (char *) ssh_string_data(sig_blob_padded);\n        blob_orig = (char *) ssh_string_data(sig_blob);\n\n        if (blob_padded_data == NULL || blob_orig == NULL) {\n            goto errout;\n        }\n\n        /* front-pad the buffer with zeroes */\n        explicit_bzero(blob_padded_data, pad_len);\n        /* fill the rest with the actual signature blob */\n        memcpy(blob_padded_data + pad_len, blob_orig, len);\n\n        sig->raw_sig = sig_blob_padded;\n    }\n\n    return SSH_OK;\n\nerrout:\n    SSH_STRING_FREE(sig_blob_padded);\n    return SSH_ERROR;\n}\n\nstatic int pki_signature_from_dsa_blob(UNUSED_PARAM(const ssh_key pubkey),\n                                       const ssh_string sig_blob,\n                                       ssh_signature sig)\n{\n    DSA_SIG *dsa_sig = NULL;\n    BIGNUM *pr = NULL, *ps = NULL;\n\n    ssh_string r;\n    ssh_string s;\n\n    size_t len;\n\n    int raw_sig_len = 0;\n    unsigned char *raw_sig_data = NULL;\n    unsigned char *temp_raw_sig = NULL;\n\n    int rc;\n\n    len = ssh_string_len(sig_blob);\n\n    /* 40 is the dual signature blob len. */\n    if (len != 40) {\n        SSH_LOG(SSH_LOG_WARN,\n                \"Signature has wrong size: %lu\",\n                (unsigned long)len);\n        goto error;\n    }\n\n#ifdef DEBUG_CRYPTO\n    ssh_log_hexdump(\"r\", ssh_string_data(sig_blob), 20);\n    ssh_log_hexdump(\"s\", (unsigned char *)ssh_string_data(sig_blob) + 20, 20);\n#endif\n\n    r = ssh_string_new(20);\n    if (r == NULL) {\n        goto error;\n    }\n    ssh_string_fill(r, ssh_string_data(sig_blob), 20);\n\n    pr = ssh_make_string_bn(r);\n    ssh_string_burn(r);\n    SSH_STRING_FREE(r);\n    if (pr == NULL) {\n        goto error;\n    }\n\n    s = ssh_string_new(20);\n    if (s == NULL) {\n        goto error;\n    }\n    ssh_string_fill(s, (char *)ssh_string_data(sig_blob) + 20, 20);\n\n    ps = ssh_make_string_bn(s);\n    ssh_string_burn(s);\n    SSH_STRING_FREE(s);\n    if (ps == NULL) {\n        goto error;\n    }\n\n    dsa_sig = DSA_SIG_new();\n    if (dsa_sig == NULL) {\n        goto error;\n    }\n\n    /* Memory management of pr and ps is transferred to DSA signature\n     * object */\n    rc = DSA_SIG_set0(dsa_sig, pr, ps);\n    if (rc == 0) {\n        goto error;\n    }\n    ps = NULL;\n    pr = NULL;\n\n    /* Get the expected size of the buffer */\n    rc = i2d_DSA_SIG(dsa_sig, NULL);\n    if (rc <= 0) {\n        goto error;\n    }\n    raw_sig_len = rc;\n\n    raw_sig_data = (unsigned char *)calloc(1, raw_sig_len);\n    if (raw_sig_data == NULL) {\n        goto error;\n    }\n    temp_raw_sig = raw_sig_data;\n\n    /* It is necessary to use a temporary pointer as i2d_* \"advances\" the\n     * pointer */\n    raw_sig_len = i2d_DSA_SIG(dsa_sig, &temp_raw_sig);\n    if (raw_sig_len <= 0) {\n        goto error;\n    }\n\n    sig->raw_sig = ssh_string_new(raw_sig_len);\n    if (sig->raw_sig == NULL) {\n        explicit_bzero(raw_sig_data, raw_sig_len);\n        goto error;\n    }\n\n    rc = ssh_string_fill(sig->raw_sig, raw_sig_data, raw_sig_len);\n    if (rc < 0) {\n        explicit_bzero(raw_sig_data, raw_sig_len);\n        goto error;\n    }\n\n    explicit_bzero(raw_sig_data, raw_sig_len);\n    SAFE_FREE(raw_sig_data);\n    DSA_SIG_free(dsa_sig);\n\n    return SSH_OK;\n\nerror:\n    bignum_safe_free(ps);\n    bignum_safe_free(pr);\n    SAFE_FREE(raw_sig_data);\n    DSA_SIG_free(dsa_sig);\n    return SSH_ERROR;\n}\n\nstatic int pki_signature_from_ecdsa_blob(UNUSED_PARAM(const ssh_key pubkey),\n                                         const ssh_string sig_blob,\n                                         ssh_signature sig)\n{\n    ECDSA_SIG *ecdsa_sig = NULL;\n    BIGNUM *pr = NULL, *ps = NULL;\n\n    ssh_string r;\n    ssh_string s;\n\n    ssh_buffer buf = NULL;\n    uint32_t rlen;\n\n    unsigned char *raw_sig_data = NULL;\n    unsigned char *temp_raw_sig = NULL;\n    size_t raw_sig_len = 0;\n\n    int rc;\n\n    /* build ecdsa signature */\n    buf = ssh_buffer_new();\n    if (buf == NULL) {\n        return SSH_ERROR;\n    }\n\n    rc = ssh_buffer_add_data(buf,\n                             ssh_string_data(sig_blob),\n                             ssh_string_len(sig_blob));\n    if (rc < 0) {\n        goto error;\n    }\n\n    r = ssh_buffer_get_ssh_string(buf);\n    if (r == NULL) {\n        goto error;\n    }\n\n#ifdef DEBUG_CRYPTO\n    ssh_log_hexdump(\"r\", ssh_string_data(r), ssh_string_len(r));\n#endif\n\n    pr = ssh_make_string_bn(r);\n    ssh_string_burn(r);\n    SSH_STRING_FREE(r);\n    if (pr == NULL) {\n        goto error;\n    }\n\n    s = ssh_buffer_get_ssh_string(buf);\n    rlen = ssh_buffer_get_len(buf);\n    SSH_BUFFER_FREE(buf);\n    if (s == NULL) {\n        goto error;\n    }\n\n    if (rlen != 0) {\n        ssh_string_burn(s);\n        SSH_STRING_FREE(s);\n        SSH_LOG(SSH_LOG_WARN,\n                \"Signature has remaining bytes in inner \"\n                \"sigblob: %lu\",\n                (unsigned long)rlen);\n        goto error;\n    }\n\n#ifdef DEBUG_CRYPTO\n    ssh_log_hexdump(\"s\", ssh_string_data(s), ssh_string_len(s));\n#endif\n\n    ps = ssh_make_string_bn(s);\n    ssh_string_burn(s);\n    SSH_STRING_FREE(s);\n    if (ps == NULL) {\n        goto error;\n    }\n\n    ecdsa_sig = ECDSA_SIG_new();\n    if (ecdsa_sig == NULL) {\n        goto error;\n    }\n\n    /* Memory management of pr and ps is transferred to\n     * ECDSA signature object */\n    rc = ECDSA_SIG_set0(ecdsa_sig, pr, ps);\n    if (rc == 0) {\n        goto error;\n    }\n    pr = NULL;\n    ps = NULL;\n\n    /* Get the expected size of the buffer */\n    rc = i2d_ECDSA_SIG(ecdsa_sig, NULL);\n    if (rc <= 0) {\n        goto error;\n    }\n    raw_sig_len = rc;\n\n    raw_sig_data = (unsigned char *)calloc(1, raw_sig_len);\n    if (raw_sig_data == NULL) {\n        goto error;\n    }\n    temp_raw_sig = raw_sig_data;\n\n    /* It is necessary to use a temporary pointer as i2d_* \"advances\" the\n     * pointer */\n    rc = i2d_ECDSA_SIG(ecdsa_sig, &temp_raw_sig);\n    if (rc <= 0) {\n        goto error;\n    }\n\n    sig->raw_sig = ssh_string_new(raw_sig_len);\n    if (sig->raw_sig == NULL) {\n        explicit_bzero(raw_sig_data, raw_sig_len);\n        goto error;\n    }\n\n    rc = ssh_string_fill(sig->raw_sig, raw_sig_data, raw_sig_len);\n    if (rc < 0) {\n        explicit_bzero(raw_sig_data, raw_sig_len);\n        goto error;\n    }\n\n    explicit_bzero(raw_sig_data, raw_sig_len);\n    SAFE_FREE(raw_sig_data);\n    ECDSA_SIG_free(ecdsa_sig);\n    return SSH_OK;\n\nerror:\n    SSH_BUFFER_FREE(buf);\n    bignum_safe_free(ps);\n    bignum_safe_free(pr);\n    SAFE_FREE(raw_sig_data);\n    if (ecdsa_sig != NULL) {\n        ECDSA_SIG_free(ecdsa_sig);\n    }\n    return SSH_ERROR;\n}\n\nssh_signature pki_signature_from_blob(const ssh_key pubkey,\n                                      const ssh_string sig_blob,\n                                      enum ssh_keytypes_e type,\n                                      enum ssh_digest_e hash_type)\n{\n    ssh_signature sig;\n    int rc;\n\n    if (ssh_key_type_plain(pubkey->type) != type) {\n        SSH_LOG(SSH_LOG_WARN,\n                \"Incompatible public key provided (%d) expecting (%d)\",\n                type,\n                pubkey->type);\n        return NULL;\n    }\n\n    sig = ssh_signature_new();\n    if (sig == NULL) {\n        return NULL;\n    }\n\n    sig->type = type;\n    sig->type_c = ssh_key_signature_to_char(type, hash_type);\n    sig->hash_type = hash_type;\n\n    switch(type) {\n        case SSH_KEYTYPE_DSS:\n            rc = pki_signature_from_dsa_blob(pubkey, sig_blob, sig);\n            if (rc != SSH_OK) {\n                goto error;\n            }\n            break;\n        case SSH_KEYTYPE_RSA:\n        case SSH_KEYTYPE_RSA1:\n            rc = pki_signature_from_rsa_blob(pubkey, sig_blob, sig);\n            if (rc != SSH_OK) {\n                goto error;\n            }\n            break;\n        case SSH_KEYTYPE_ED25519:\n            rc = pki_signature_from_ed25519_blob(sig, sig_blob);\n            if (rc != SSH_OK){\n                goto error;\n            }\n            break;\n        case SSH_KEYTYPE_ECDSA_P256:\n        case SSH_KEYTYPE_ECDSA_P384:\n        case SSH_KEYTYPE_ECDSA_P521:\n        case SSH_KEYTYPE_ECDSA_P256_CERT01:\n        case SSH_KEYTYPE_ECDSA_P384_CERT01:\n        case SSH_KEYTYPE_ECDSA_P521_CERT01:\n#ifdef HAVE_OPENSSL_ECC\n            rc = pki_signature_from_ecdsa_blob(pubkey, sig_blob, sig);\n            if (rc != SSH_OK) {\n                goto error;\n            }\n            break;\n#endif\n        default:\n        case SSH_KEYTYPE_UNKNOWN:\n            SSH_LOG(SSH_LOG_WARN, \"Unknown signature type\");\n            goto error;\n    }\n\n    return sig;\n\nerror:\n    ssh_signature_free(sig);\n    return NULL;\n}\n\nstatic const EVP_MD *pki_digest_to_md(enum ssh_digest_e hash_type)\n{\n    const EVP_MD *md = NULL;\n\n    switch (hash_type) {\n    case SSH_DIGEST_SHA256:\n        md = EVP_sha256();\n        break;\n    case SSH_DIGEST_SHA384:\n        md = EVP_sha384();\n        break;\n    case SSH_DIGEST_SHA512:\n        md = EVP_sha512();\n        break;\n    case SSH_DIGEST_SHA1:\n        md = EVP_sha1();\n        break;\n    case SSH_DIGEST_AUTO:\n        md = NULL;\n        break;\n    default:\n        SSH_LOG(SSH_LOG_TRACE, \"Unknown hash algorithm for type: %d\",\n                hash_type);\n        return NULL;\n    }\n\n    return md;\n}\n\nstatic EVP_PKEY *pki_key_to_pkey(ssh_key key)\n{\n    EVP_PKEY *pkey = NULL;\n\n    switch(key->type) {\n    case SSH_KEYTYPE_DSS:\n    case SSH_KEYTYPE_DSS_CERT01:\n        if (key->dsa == NULL) {\n            SSH_LOG(SSH_LOG_TRACE, \"NULL key->dsa\");\n            goto error;\n        }\n        pkey = EVP_PKEY_new();\n        if (pkey == NULL) {\n            SSH_LOG(SSH_LOG_TRACE, \"Out of memory\");\n            return NULL;\n        }\n\n        EVP_PKEY_set1_DSA(pkey, key->dsa);\n        break;\n    case SSH_KEYTYPE_RSA:\n    case SSH_KEYTYPE_RSA1:\n    case SSH_KEYTYPE_RSA_CERT01:\n        if (key->rsa == NULL) {\n            SSH_LOG(SSH_LOG_TRACE, \"NULL key->rsa\");\n            goto error;\n        }\n        pkey = EVP_PKEY_new();\n        if (pkey == NULL) {\n            SSH_LOG(SSH_LOG_TRACE, \"Out of memory\");\n            return NULL;\n        }\n\n        EVP_PKEY_set1_RSA(pkey, key->rsa);\n        break;\n    case SSH_KEYTYPE_ECDSA_P256:\n    case SSH_KEYTYPE_ECDSA_P384:\n    case SSH_KEYTYPE_ECDSA_P521:\n    case SSH_KEYTYPE_ECDSA_P256_CERT01:\n    case SSH_KEYTYPE_ECDSA_P384_CERT01:\n    case SSH_KEYTYPE_ECDSA_P521_CERT01:\n# if defined(HAVE_OPENSSL_ECC)\n        if (key->ecdsa == NULL) {\n            SSH_LOG(SSH_LOG_TRACE, \"NULL key->ecdsa\");\n            goto error;\n        }\n        pkey = EVP_PKEY_new();\n        if (pkey == NULL) {\n            SSH_LOG(SSH_LOG_TRACE, \"Out of memory\");\n            return NULL;\n        }\n\n        EVP_PKEY_set1_EC_KEY(pkey, key->ecdsa);\n        break;\n# endif\n    case SSH_KEYTYPE_ED25519:\n    case SSH_KEYTYPE_ED25519_CERT01:\n# if defined(HAVE_OPENSSL_ED25519)\n        if (ssh_key_is_private(key)) {\n            if (key->ed25519_privkey == NULL) {\n                SSH_LOG(SSH_LOG_TRACE, \"NULL key->ed25519_privkey\");\n                goto error;\n            }\n            /* In OpenSSL, the input is the private key seed only, which means\n             * the first half of the SSH private key (the second half is the\n             * public key). Both keys have the same length (32 bytes) */\n            pkey = EVP_PKEY_new_raw_private_key(EVP_PKEY_ED25519, NULL,\n                    (const uint8_t *)key->ed25519_privkey,\n                    ED25519_KEY_LEN);\n        } else {\n            if (key->ed25519_pubkey == NULL) {\n                SSH_LOG(SSH_LOG_TRACE, \"NULL key->ed25519_pubkey\");\n                goto error;\n            }\n            pkey = EVP_PKEY_new_raw_public_key(EVP_PKEY_ED25519, NULL,\n                    (const uint8_t *)key->ed25519_pubkey,\n                    ED25519_KEY_LEN);\n        }\n        if (pkey == NULL) {\n            SSH_LOG(SSH_LOG_TRACE,\n                    \"Failed to create ed25519 EVP_PKEY: %s\",\n                    ERR_error_string(ERR_get_error(), NULL));\n            return NULL;\n        }\n        break;\n#endif\n    case SSH_KEYTYPE_UNKNOWN:\n    default:\n        SSH_LOG(SSH_LOG_TRACE, \"Unknown private key algorithm for type: %d\",\n                key->type);\n        goto error;\n    }\n\n    return pkey;\n\nerror:\n    EVP_PKEY_free(pkey);\n    return NULL;\n}\n\n/**\n * @internal\n *\n * @brief Sign the given input data. The digest of to be signed is calculated\n * internally as necessary.\n *\n * @param[in]   privkey     The private key to be used for signing.\n * @param[in]   hash_type   The digest algorithm to be used.\n * @param[in]   input       The data to be signed.\n * @param[in]   input_len   The length of the data to be signed.\n *\n * @return  a newly allocated ssh_signature or NULL on error.\n */\nssh_signature pki_sign_data(const ssh_key privkey,\n                            enum ssh_digest_e hash_type,\n                            const unsigned char *input,\n                            size_t input_len)\n{\n    const EVP_MD *md = NULL;\n    EVP_MD_CTX *ctx = NULL;\n    EVP_PKEY *pkey = NULL;\n\n    unsigned char *raw_sig_data = NULL;\n    size_t raw_sig_len;\n\n    ssh_signature sig = NULL;\n\n    int rc;\n\n    if (privkey == NULL || !ssh_key_is_private(privkey) || input == NULL) {\n        SSH_LOG(SSH_LOG_TRACE, \"Bad parameter provided to \"\n                               \"pki_sign_data()\");\n        return NULL;\n    }\n\n    /* Check if public key and hash type are compatible */\n    rc = pki_key_check_hash_compatible(privkey, hash_type);\n    if (rc != SSH_OK) {\n        return NULL;\n    }\n\n#ifndef HAVE_OPENSSL_ED25519\n    if (privkey->type == SSH_KEYTYPE_ED25519 ||\n        privkey->type == SSH_KEYTYPE_ED25519_CERT01)\n    {\n        return pki_do_sign_hash(privkey, input, input_len, hash_type);\n    }\n#endif\n\n    /* Set hash algorithm to be used */\n    md = pki_digest_to_md(hash_type);\n    if (md == NULL) {\n        if (hash_type != SSH_DIGEST_AUTO) {\n            return NULL;\n        }\n    }\n\n    /* Setup private key EVP_PKEY */\n    pkey = pki_key_to_pkey(privkey);\n    if (pkey == NULL) {\n        return NULL;\n    }\n\n    /* Allocate buffer for signature */\n    raw_sig_len = (size_t)EVP_PKEY_size(pkey);\n    raw_sig_data = (unsigned char *)malloc(raw_sig_len);\n    if (raw_sig_data == NULL) {\n        SSH_LOG(SSH_LOG_TRACE, \"Out of memory\");\n        goto out;\n    }\n\n    /* Create the context */\n    ctx = EVP_MD_CTX_create();\n    if (ctx == NULL) {\n        SSH_LOG(SSH_LOG_TRACE, \"Out of memory\");\n        goto out;\n    }\n\n    /* Sign the data */\n    rc = EVP_DigestSignInit(ctx, NULL, md, NULL, pkey);\n    if (rc != 1){\n        SSH_LOG(SSH_LOG_TRACE,\n                \"EVP_DigestSignInit() failed: %s\",\n                ERR_error_string(ERR_get_error(), NULL));\n        goto out;\n    }\n\n#ifdef HAVE_OPENSSL_EVP_DIGESTSIGN\n    rc = EVP_DigestSign(ctx, raw_sig_data, &raw_sig_len, input, input_len);\n    if (rc != 1) {\n        SSH_LOG(SSH_LOG_TRACE,\n                \"EVP_DigestSign() failed: %s\",\n                ERR_error_string(ERR_get_error(), NULL));\n        goto out;\n    }\n#else\n    rc = EVP_DigestSignUpdate(ctx, input, input_len);\n    if (rc != 1) {\n        SSH_LOG(SSH_LOG_TRACE,\n                \"EVP_DigestSignUpdate() failed: %s\",\n                ERR_error_string(ERR_get_error(), NULL));\n        goto out;\n    }\n\n    rc = EVP_DigestSignFinal(ctx, raw_sig_data, &raw_sig_len);\n    if (rc != 1) {\n        SSH_LOG(SSH_LOG_TRACE,\n                \"EVP_DigestSignFinal() failed: %s\",\n                ERR_error_string(ERR_get_error(), NULL));\n        goto out;\n    }\n#endif\n\n#ifdef DEBUG_CRYPTO\n        ssh_log_hexdump(\"Generated signature\", raw_sig_data, raw_sig_len);\n#endif\n\n    /* Allocate and fill output signature */\n    sig = ssh_signature_new();\n    if (sig == NULL) {\n        goto out;\n    }\n\n    sig->raw_sig = ssh_string_new(raw_sig_len);\n    if (sig->raw_sig == NULL) {\n        ssh_signature_free(sig);\n        sig = NULL;\n        goto out;\n    }\n\n    rc = ssh_string_fill(sig->raw_sig, raw_sig_data, raw_sig_len);\n    if (rc < 0) {\n        ssh_signature_free(sig);\n        sig = NULL;\n        goto out;\n    }\n\n    sig->type = privkey->type;\n    sig->hash_type = hash_type;\n    sig->type_c = ssh_key_signature_to_char(privkey->type, hash_type);\n\nout:\n    if (ctx != NULL) {\n        EVP_MD_CTX_free(ctx);\n    }\n    if (raw_sig_data != NULL) {\n        explicit_bzero(raw_sig_data, raw_sig_len);\n    }\n    SAFE_FREE(raw_sig_data);\n    if (pkey != NULL) {\n        EVP_PKEY_free(pkey);\n    }\n    return sig;\n}\n\n/**\n * @internal\n *\n * @brief Verify the signature of a given input. The digest of the input is\n * calculated internally as necessary.\n *\n * @param[in]   signature   The signature to be verified.\n * @param[in]   pubkey      The public key used to verify the signature.\n * @param[in]   input       The signed data.\n * @param[in]   input_len   The length of the signed data.\n *\n * @return  SSH_OK if the signature is valid; SSH_ERROR otherwise.\n */\nint pki_verify_data_signature(ssh_signature signature,\n                              const ssh_key pubkey,\n                              const unsigned char *input,\n                              size_t input_len)\n{\n    const EVP_MD *md = NULL;\n    EVP_MD_CTX *ctx = NULL;\n    EVP_PKEY *pkey = NULL;\n\n    unsigned char *raw_sig_data = NULL;\n    unsigned int raw_sig_len;\n\n    int rc = SSH_ERROR;\n    int evp_rc;\n\n    if (pubkey == NULL || ssh_key_is_private(pubkey) || input == NULL ||\n        signature == NULL || (signature->raw_sig == NULL\n#ifndef HAVE_OPENSSL_ED25519\n        && signature->ed25519_sig == NULL\n#endif\n        ))\n    {\n        SSH_LOG(SSH_LOG_TRACE, \"Bad parameter provided to \"\n                               \"pki_verify_data_signature()\");\n        return SSH_ERROR;\n    }\n\n    /* Check if public key and hash type are compatible */\n    rc = pki_key_check_hash_compatible(pubkey, signature->hash_type);\n    if (rc != SSH_OK) {\n        return SSH_ERROR;\n    }\n\n#ifndef HAVE_OPENSSL_ED25519\n    if (pubkey->type == SSH_KEYTYPE_ED25519 ||\n        pubkey->type == SSH_KEYTYPE_ED25519_CERT01)\n    {\n        return pki_ed25519_verify(pubkey, signature, input, input_len);\n    }\n#endif\n\n    /* Get the signature to be verified */\n    raw_sig_data = ssh_string_data(signature->raw_sig);\n    raw_sig_len = ssh_string_len(signature->raw_sig);\n    if (raw_sig_data == NULL) {\n        return SSH_ERROR;\n    }\n\n    /* Set hash algorithm to be used */\n    md = pki_digest_to_md(signature->hash_type);\n    if (md == NULL) {\n        if (signature->hash_type != SSH_DIGEST_AUTO) {\n            return SSH_ERROR;\n        }\n    }\n\n    /* Setup public key EVP_PKEY */\n    pkey = pki_key_to_pkey(pubkey);\n    if (pkey == NULL) {\n        return SSH_ERROR;\n    }\n\n    /* Create the context */\n    ctx = EVP_MD_CTX_create();\n    if (ctx == NULL) {\n        SSH_LOG(SSH_LOG_TRACE,\n                \"Failed to create EVP_MD_CTX: %s\",\n                ERR_error_string(ERR_get_error(), NULL));\n        goto out;\n    }\n\n    /* Verify the signature */\n    evp_rc = EVP_DigestVerifyInit(ctx, NULL, md, NULL, pkey);\n    if (evp_rc != 1){\n        SSH_LOG(SSH_LOG_TRACE,\n                \"EVP_DigestVerifyInit() failed: %s\",\n                ERR_error_string(ERR_get_error(), NULL));\n        goto out;\n    }\n\n#ifdef HAVE_OPENSSL_EVP_DIGESTVERIFY\n    evp_rc = EVP_DigestVerify(ctx, raw_sig_data, raw_sig_len, input, input_len);\n#else\n    evp_rc = EVP_DigestVerifyUpdate(ctx, input, input_len);\n    if (evp_rc != 1) {\n        SSH_LOG(SSH_LOG_TRACE,\n                \"EVP_DigestVerifyUpdate() failed: %s\",\n                ERR_error_string(ERR_get_error(), NULL));\n        goto out;\n    }\n\n    evp_rc = EVP_DigestVerifyFinal(ctx, raw_sig_data, raw_sig_len);\n#endif\n    if (evp_rc == 1) {\n        SSH_LOG(SSH_LOG_TRACE, \"Signature valid\");\n        rc = SSH_OK;\n    } else {\n        SSH_LOG(SSH_LOG_TRACE,\n                \"Signature invalid: %s\",\n                ERR_error_string(ERR_get_error(), NULL));\n        rc = SSH_ERROR;\n    }\n\nout:\n    if (ctx != NULL) {\n        EVP_MD_CTX_free(ctx);\n    }\n    if (pkey != NULL) {\n        EVP_PKEY_free(pkey);\n    }\n    return rc;\n}\n\n#ifdef HAVE_OPENSSL_ED25519\nint pki_key_generate_ed25519(ssh_key key)\n{\n    int evp_rc;\n    EVP_PKEY_CTX *pctx = NULL;\n    EVP_PKEY *pkey = NULL;\n    size_t privkey_len = ED25519_KEY_LEN;\n    size_t pubkey_len = ED25519_KEY_LEN;\n\n    if (key == NULL) {\n        return SSH_ERROR;\n    }\n\n    pctx = EVP_PKEY_CTX_new_id(EVP_PKEY_ED25519, NULL);\n    if (pctx == NULL) {\n        SSH_LOG(SSH_LOG_TRACE,\n                \"Failed to create ed25519 EVP_PKEY_CTX: %s\",\n                ERR_error_string(ERR_get_error(), NULL));\n        goto error;\n    }\n\n    evp_rc = EVP_PKEY_keygen_init(pctx);\n    if (evp_rc != 1) {\n        SSH_LOG(SSH_LOG_TRACE,\n                \"Failed to initialize ed25519 key generation: %s\",\n                ERR_error_string(ERR_get_error(), NULL));\n        goto error;\n    }\n\n    evp_rc = EVP_PKEY_keygen(pctx, &pkey);\n    if (evp_rc != 1) {\n        SSH_LOG(SSH_LOG_TRACE,\n                \"Failed to generate ed25519 key: %s\",\n                ERR_error_string(ERR_get_error(), NULL));\n        goto error;\n    }\n\n    key->ed25519_privkey = malloc(ED25519_KEY_LEN);\n    if (key->ed25519_privkey == NULL) {\n        SSH_LOG(SSH_LOG_TRACE,\n                \"Failed to allocate memory for ed25519 private key\");\n        goto error;\n    }\n\n    key->ed25519_pubkey = malloc(ED25519_KEY_LEN);\n    if (key->ed25519_pubkey == NULL) {\n        SSH_LOG(SSH_LOG_TRACE,\n                \"Failed to allocate memory for ed25519 public key\");\n        goto error;\n    }\n\n    evp_rc = EVP_PKEY_get_raw_private_key(pkey, (uint8_t *)key->ed25519_privkey,\n                                          &privkey_len);\n    if (evp_rc != 1) {\n        SSH_LOG(SSH_LOG_TRACE,\n                \"Failed to get ed25519 raw private key: %s\",\n                ERR_error_string(ERR_get_error(), NULL));\n        goto error;\n    }\n\n    evp_rc = EVP_PKEY_get_raw_public_key(pkey, (uint8_t *)key->ed25519_pubkey,\n                                         &pubkey_len);\n    if (evp_rc != 1) {\n        SSH_LOG(SSH_LOG_TRACE,\n                \"Failed to get ed25519 raw public key: %s\",\n                ERR_error_string(ERR_get_error(), NULL));\n        goto error;\n    }\n\n    EVP_PKEY_CTX_free(pctx);\n    EVP_PKEY_free(pkey);\n    return SSH_OK;\n\nerror:\n    if (pctx != NULL) {\n        EVP_PKEY_CTX_free(pctx);\n    }\n    if (pkey != NULL) {\n        EVP_PKEY_free(pkey);\n    }\n    SAFE_FREE(key->ed25519_privkey);\n    SAFE_FREE(key->ed25519_pubkey);\n\n    return SSH_ERROR;\n}\n#else\nssh_signature pki_do_sign_hash(const ssh_key privkey,\n                               const unsigned char *hash,\n                               size_t hlen,\n                               enum ssh_digest_e hash_type)\n{\n    ssh_signature sig = NULL;\n    int rc;\n\n    sig = ssh_signature_new();\n    if (sig == NULL) {\n        return NULL;\n    }\n\n    sig->type = privkey->type;\n    sig->type_c = ssh_key_signature_to_char(privkey->type, hash_type);\n    sig->hash_type = hash_type;\n\n    switch(privkey->type) {\n        case SSH_KEYTYPE_ED25519:\n            rc = pki_ed25519_sign(privkey, sig, hash, hlen);\n            if (rc != SSH_OK) {\n                ssh_signature_free(sig);\n                return NULL;\n            }\n            break;\n        default:\n            ssh_signature_free(sig);\n            return NULL;\n    }\n\n    return sig;\n}\n#endif /* HAVE_OPENSSL_ED25519 */\n\n#endif /* _PKI_CRYPTO_H */\n"
  },
  {
    "path": "src/libssh/src/pki_ed25519.c",
    "content": "/*\n * pki_ed25519 .c - PKI infrastructure using ed25519\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2014 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include \"libssh/pki.h\"\n#include \"libssh/pki_priv.h\"\n#include \"libssh/ed25519.h\"\n#include \"libssh/buffer.h\"\n\nint pki_key_generate_ed25519(ssh_key key)\n{\n    int rc;\n\n    key->ed25519_privkey = malloc(sizeof (ed25519_privkey));\n    if (key->ed25519_privkey == NULL) {\n        goto error;\n    }\n\n    key->ed25519_pubkey = malloc(sizeof (ed25519_pubkey));\n    if (key->ed25519_pubkey == NULL) {\n        goto error;\n    }\n\n    rc = crypto_sign_ed25519_keypair(*key->ed25519_pubkey,\n                                     *key->ed25519_privkey);\n    if (rc != 0) {\n        goto error;\n    }\n\n    return SSH_OK;\nerror:\n    SAFE_FREE(key->ed25519_privkey);\n    SAFE_FREE(key->ed25519_pubkey);\n\n    return SSH_ERROR;\n}\n\nint pki_ed25519_sign(const ssh_key privkey,\n                     ssh_signature sig,\n                     const unsigned char *hash,\n                     size_t hlen)\n{\n    int rc;\n    uint8_t *buffer;\n    uint64_t dlen = 0;\n\n    buffer = malloc(hlen + ED25519_SIG_LEN);\n    if (buffer == NULL) {\n        return SSH_ERROR;\n    }\n\n    rc = crypto_sign_ed25519(buffer,\n                             &dlen,\n                             hash,\n                             hlen,\n                             *privkey->ed25519_privkey);\n    if (rc != 0) {\n        goto error;\n    }\n\n    /* This shouldn't happen */\n    if (dlen - hlen != ED25519_SIG_LEN) {\n        goto error;\n    }\n\n    sig->ed25519_sig = malloc(ED25519_SIG_LEN);\n    if (sig->ed25519_sig == NULL) {\n        goto error;\n    }\n\n    memcpy(sig->ed25519_sig, buffer, ED25519_SIG_LEN);\n    SAFE_FREE(buffer);\n\n    return SSH_OK;\nerror:\n    SAFE_FREE(buffer);\n    return SSH_ERROR;\n}\n\nint pki_ed25519_verify(const ssh_key pubkey,\n                       ssh_signature sig,\n                       const unsigned char *hash,\n                       size_t hlen)\n{\n    uint64_t mlen = 0;\n    uint8_t *buffer;\n    uint8_t *buffer2;\n    int rc;\n\n    if (pubkey == NULL || sig == NULL ||\n        hash == NULL || sig->ed25519_sig == NULL) {\n        return SSH_ERROR;\n    }\n\n    buffer = malloc(hlen + ED25519_SIG_LEN);\n    if (buffer == NULL) {\n        return SSH_ERROR;\n    }\n\n    buffer2 = malloc(hlen + ED25519_SIG_LEN);\n    if (buffer2 == NULL) {\n        goto error;\n    }\n\n    memcpy(buffer, sig->ed25519_sig, ED25519_SIG_LEN);\n    memcpy(buffer + ED25519_SIG_LEN, hash, hlen);\n\n    rc = crypto_sign_ed25519_open(buffer2,\n                                  &mlen,\n                                  buffer,\n                                  hlen + ED25519_SIG_LEN,\n                                  *pubkey->ed25519_pubkey);\n\n    explicit_bzero(buffer, hlen + ED25519_SIG_LEN);\n    explicit_bzero(buffer2, hlen);\n    SAFE_FREE(buffer);\n    SAFE_FREE(buffer2);\n    if (rc == 0) {\n        return SSH_OK;\n    } else {\n        return SSH_ERROR;\n    }\nerror:\n    SAFE_FREE(buffer);\n    SAFE_FREE(buffer2);\n\n    return SSH_ERROR;\n}\n\n"
  },
  {
    "path": "src/libssh/src/pki_ed25519_common.c",
    "content": "/*\n * pki_ed25519_common.c - Common ed25519 functions\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2014 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include \"libssh/pki.h\"\n#include \"libssh/pki_priv.h\"\n#include \"libssh/buffer.h\"\n\nint pki_privkey_build_ed25519(ssh_key key,\n                              ssh_string pubkey,\n                              ssh_string privkey)\n{\n    if (ssh_string_len(pubkey) != ED25519_KEY_LEN ||\n        ssh_string_len(privkey) != (2 * ED25519_KEY_LEN))\n    {\n        SSH_LOG(SSH_LOG_WARN, \"Invalid ed25519 key len\");\n        return SSH_ERROR;\n    }\n\n#ifdef HAVE_OPENSSL_ED25519\n    /* In OpenSSL implementation, the private key is the original private seed,\n     * without the public key. */\n    key->ed25519_privkey = malloc(ED25519_KEY_LEN);\n#else\n    /* In the internal implementation, the private key is the concatenation of\n     * the private seed with the public key. */\n    key->ed25519_privkey = malloc(2 * ED25519_KEY_LEN);\n#endif\n    if (key->ed25519_privkey == NULL) {\n        goto error;\n    }\n\n    key->ed25519_pubkey = malloc(ED25519_KEY_LEN);\n    if (key->ed25519_pubkey == NULL) {\n        goto error;\n    }\n\n#ifdef HAVE_OPENSSL_ED25519\n    memcpy(key->ed25519_privkey, ssh_string_data(privkey),\n           ED25519_KEY_LEN);\n#else\n    memcpy(key->ed25519_privkey, ssh_string_data(privkey),\n           2 * ED25519_KEY_LEN);\n#endif\n    memcpy(key->ed25519_pubkey, ssh_string_data(pubkey),\n           ED25519_KEY_LEN);\n\n    return SSH_OK;\n\nerror:\n    SAFE_FREE(key->ed25519_privkey);\n    SAFE_FREE(key->ed25519_pubkey);\n\n    return SSH_ERROR;\n}\n\n/**\n * @internal\n *\n * @brief Compare ed25519 keys if they are equal.\n *\n * @param[in] k1        The first key to compare.\n *\n * @param[in] k2        The second key to compare.\n *\n * @param[in] what      What part or type of the key do you want to compare.\n *\n * @return              0 if equal, 1 if not.\n */\nint pki_ed25519_key_cmp(const ssh_key k1,\n                        const ssh_key k2,\n                        enum ssh_keycmp_e what)\n{\n    int cmp;\n\n    switch(what) {\n    case SSH_KEY_CMP_PRIVATE:\n        if (k1->ed25519_privkey == NULL || k2->ed25519_privkey == NULL) {\n            return 1;\n        }\n#ifdef HAVE_OPENSSL_ED25519\n        /* In OpenSSL implementation, the private key is the original private\n         * seed, without the public key. */\n        cmp = memcmp(k1->ed25519_privkey, k2->ed25519_privkey, ED25519_KEY_LEN);\n#else\n        /* In the internal implementation, the private key is the concatenation\n         * of the private seed with the public key. */\n        cmp = memcmp(k1->ed25519_privkey, k2->ed25519_privkey,\n                     2 * ED25519_KEY_LEN);\n#endif\n        if (cmp != 0) {\n            return 1;\n        }\n        FALL_THROUGH;\n    case SSH_KEY_CMP_PUBLIC:\n        if (k1->ed25519_pubkey == NULL || k2->ed25519_pubkey == NULL) {\n            return 1;\n        }\n        cmp = memcmp(k1->ed25519_pubkey, k2->ed25519_pubkey, ED25519_KEY_LEN);\n        if (cmp != 0) {\n            return 1;\n        }\n    }\n\n    return 0;\n}\n\n/**\n * @internal\n *\n * @brief Duplicate an Ed25519 key\n *\n * @param[out] new Pre-initialized ssh_key structure\n *\n * @param[in] key Key to copy\n *\n * @return SSH_ERROR on error, SSH_OK on success\n */\nint pki_ed25519_key_dup(ssh_key new, const ssh_key key)\n{\n    if (key->ed25519_privkey == NULL && key->ed25519_pubkey == NULL) {\n        return SSH_ERROR;\n    }\n\n    if (key->ed25519_privkey != NULL) {\n#ifdef HAVE_OPENSSL_ED25519\n        /* In OpenSSL implementation, the private key is the original private\n         * seed, without the public key. */\n        new->ed25519_privkey = malloc(ED25519_KEY_LEN);\n#else\n        /* In the internal implementation, the private key is the concatenation\n         * of the private seed with the public key. */\n        new->ed25519_privkey = malloc(2 * ED25519_KEY_LEN);\n#endif\n        if (new->ed25519_privkey == NULL) {\n            return SSH_ERROR;\n        }\n#ifdef HAVE_OPENSSL_ED25519\n        memcpy(new->ed25519_privkey, key->ed25519_privkey, ED25519_KEY_LEN);\n#else\n        memcpy(new->ed25519_privkey, key->ed25519_privkey, 2 * ED25519_KEY_LEN);\n#endif\n    }\n\n    if (key->ed25519_pubkey != NULL) {\n        new->ed25519_pubkey = malloc(ED25519_KEY_LEN);\n        if (new->ed25519_pubkey == NULL) {\n            SAFE_FREE(new->ed25519_privkey);\n            return SSH_ERROR;\n        }\n        memcpy(new->ed25519_pubkey, key->ed25519_pubkey, ED25519_KEY_LEN);\n    }\n\n    return SSH_OK;\n}\n\n/**\n * @internal\n *\n * @brief Outputs an Ed25519 public key in a blob buffer.\n *\n * @param[out] buffer Output buffer\n *\n * @param[in] key Key to output\n *\n * @return SSH_ERROR on error, SSH_OK on success\n */\nint pki_ed25519_public_key_to_blob(ssh_buffer buffer, ssh_key key)\n{\n    int rc;\n\n    if (key->ed25519_pubkey == NULL){\n        return SSH_ERROR;\n    }\n\n    rc = ssh_buffer_pack(buffer,\n                         \"dP\",\n                         (uint32_t)ED25519_KEY_LEN,\n                         (size_t)ED25519_KEY_LEN, key->ed25519_pubkey);\n\n    return rc;\n}\n\n/**\n * @internal\n *\n * @brief output a signature blob from an ed25519 signature\n *\n * @param[in] sig signature to convert\n *\n * @return Signature blob in SSH string, or NULL on error\n */\nssh_string pki_ed25519_signature_to_blob(ssh_signature sig)\n{\n    ssh_string sig_blob;\n\n#ifdef HAVE_OPENSSL_ED25519\n    /* When using the OpenSSL implementation, the signature is stored in raw_sig\n     * which is shared by all algorithms.*/\n    if (sig->raw_sig == NULL) {\n        return NULL;\n    }\n#else\n    /* When using the internal implementation, the signature is stored in an\n     * algorithm specific field. */\n    if (sig->ed25519_sig == NULL) {\n        return NULL;\n    }\n#endif\n\n    sig_blob = ssh_string_new(ED25519_SIG_LEN);\n    if (sig_blob == NULL) {\n        return NULL;\n    }\n\n#ifdef HAVE_OPENSSL_ED25519\n    ssh_string_fill(sig_blob, ssh_string_data(sig->raw_sig),\n                    ssh_string_len(sig->raw_sig));\n#else\n    ssh_string_fill(sig_blob, sig->ed25519_sig, ED25519_SIG_LEN);\n#endif\n\n    return sig_blob;\n}\n\n/**\n * @internal\n *\n * @brief Convert a signature blob in an ed25519 signature.\n *\n * @param[out] sig a preinitialized signature\n *\n * @param[in] sig_blob a signature blob\n *\n * @return SSH_ERROR on error, SSH_OK on success\n */\nint pki_signature_from_ed25519_blob(ssh_signature sig, ssh_string sig_blob)\n{\n    size_t len;\n\n    len = ssh_string_len(sig_blob);\n    if (len != ED25519_SIG_LEN){\n        SSH_LOG(SSH_LOG_WARN, \"Invalid ssh-ed25519 signature len: %zu\", len);\n        return SSH_ERROR;\n    }\n\n#ifdef HAVE_OPENSSL_ED25519\n    sig->raw_sig = ssh_string_copy(sig_blob);\n#else\n    sig->ed25519_sig = malloc(ED25519_SIG_LEN);\n    if (sig->ed25519_sig == NULL){\n        return SSH_ERROR;\n    }\n    memcpy(sig->ed25519_sig, ssh_string_data(sig_blob), ED25519_SIG_LEN);\n#endif\n\n    return SSH_OK;\n}\n\n"
  },
  {
    "path": "src/libssh/src/pki_gcrypt.c",
    "content": "/*\n * pki_gcrypt.c private and public key handling using gcrypt.\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2003-2009 Aris Adamantiadis\n * Copyright (c) 2009-2011 Andreas Schneider <asn@cryptomilk.org>\n * Copyright (C) 2016 g10 Code GmbH\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#ifdef HAVE_LIBGCRYPT\n\n#include <assert.h>\n#include <stdbool.h>\n#include <string.h>\n#include <stdlib.h>\n#include <gcrypt.h>\n#include <stdio.h>\n\n#include \"libssh/priv.h\"\n#include \"libssh/buffer.h\"\n#include \"libssh/session.h\"\n#include \"libssh/wrapper.h\"\n#include \"libssh/misc.h\"\n#include \"libssh/pki.h\"\n#include \"libssh/pki_priv.h\"\n\n#define MAXLINESIZE 80\n#define RSA_HEADER_BEGIN \"-----BEGIN RSA PRIVATE KEY-----\"\n#define RSA_HEADER_END \"-----END RSA PRIVATE KEY-----\"\n#define DSA_HEADER_BEGIN \"-----BEGIN DSA PRIVATE KEY-----\"\n#define DSA_HEADER_END \"-----END DSA PRIVATE KEY-----\"\n#define ECDSA_HEADER_BEGIN \"-----BEGIN EC PRIVATE KEY-----\"\n#define ECDSA_HEADER_END \"-----END EC PRIVATE KEY-----\"\n\n#define MAX_KEY_SIZE 32\n#define MAX_PASSPHRASE_SIZE 1024\n#define ASN1_INTEGER 2\n#define ASN1_BIT_STRING 3\n#define ASN1_OCTET_STRING 4\n#define ASN1_OBJECT_IDENTIFIER 6\n#define ASN1_SEQUENCE 48\n#define PKCS5_SALT_LEN 8\n\nstatic int load_iv(const char *header, unsigned char *iv, int iv_len) {\n  int i;\n  int j;\n  int k;\n\n  memset(iv, 0, iv_len);\n  for (i = 0; i < iv_len; i++) {\n    if ((header[2*i] >= '0') && (header[2*i] <= '9'))\n      j = header[2*i] - '0';\n    else if ((header[2*i] >= 'A') && (header[2*i] <= 'F'))\n      j = header[2*i] - 'A' + 10;\n    else if ((header[2*i] >= 'a') && (header[2*i] <= 'f'))\n      j = header[2*i] - 'a' + 10;\n    else\n      return -1;\n    if ((header[2*i+1] >= '0') && (header[2*i+1] <= '9'))\n      k = header[2*i+1] - '0';\n    else if ((header[2*i+1] >= 'A') && (header[2*i+1] <= 'F'))\n      k = header[2*i+1] - 'A' + 10;\n    else if ((header[2*i+1] >= 'a') && (header[2*i+1] <= 'f'))\n      k = header[2*i+1] - 'a' + 10;\n    else\n      return -1;\n    iv[i] = (j << 4) + k;\n  }\n  return 0;\n}\n\nstatic uint32_t char_to_u32(unsigned char *data, uint32_t size) {\n  uint32_t ret;\n  uint32_t i;\n\n  for (i = 0, ret = 0; i < size; ret = ret << 8, ret += data[i++])\n    ;\n  return ret;\n}\n\nstatic uint32_t asn1_get_len(ssh_buffer buffer) {\n  uint32_t len;\n  unsigned char tmp[4];\n\n  if (ssh_buffer_get_data(buffer,tmp,1) == 0) {\n    return 0;\n  }\n\n  if (tmp[0] > 127) {\n    len = tmp[0] & 127;\n    if (len > 4) {\n      return 0; /* Length doesn't fit in u32. Can this really happen? */\n    }\n    if (ssh_buffer_get_data(buffer,tmp,len) == 0) {\n      return 0;\n    }\n    len = char_to_u32(tmp, len);\n  } else {\n    len = char_to_u32(tmp, 1);\n  }\n\n  return len;\n}\n\nstatic ssh_string asn1_get(ssh_buffer buffer, unsigned char want) {\n  ssh_string str;\n  unsigned char type;\n  uint32_t size;\n\n  if (ssh_buffer_get_data(buffer, &type, 1) == 0 || type != want) {\n    return NULL;\n  }\n  size = asn1_get_len(buffer);\n  if (size == 0) {\n    return NULL;\n  }\n\n  str = ssh_string_new(size);\n  if (str == NULL) {\n    return NULL;\n  }\n\n  if (ssh_buffer_get_data(buffer, ssh_string_data(str), size) == 0) {\n    SSH_STRING_FREE(str);\n    return NULL;\n  }\n\n  return str;\n}\n\nstatic ssh_string asn1_get_int(ssh_buffer buffer) {\n  return asn1_get(buffer, ASN1_INTEGER);\n}\n\nstatic ssh_string asn1_get_bit_string(ssh_buffer buffer)\n{\n    ssh_string str;\n    unsigned char type;\n    uint32_t size;\n    unsigned char unused, last, *p;\n    uint32_t len;\n\n    len = ssh_buffer_get_data(buffer, &type, 1);\n    if (len == 0 || type != ASN1_BIT_STRING) {\n        return NULL;\n    }\n    size = asn1_get_len(buffer);\n    if (size == 0) {\n        return NULL;\n    }\n\n    /* The first octet encodes the number of unused bits.  */\n    size -= 1;\n\n    str = ssh_string_new(size);\n    if (str == NULL) {\n        return NULL;\n    }\n\n    len = ssh_buffer_get_data(buffer, &unused, 1);\n    if (len == 0) {\n        SSH_STRING_FREE(str);\n        return NULL;\n    }\n\n    if (unused == 0) {\n        len = ssh_buffer_get_data(buffer, ssh_string_data(str), size);\n        if (len == 0) {\n            SSH_STRING_FREE(str);\n            return NULL;\n        }\n        return str;\n    }\n\n    /* The bit string is padded at the end, we must shift the whole\n       string by UNUSED bits.  */\n    for (p = ssh_string_data(str), last = 0; size; size--, p++) {\n        unsigned char c;\n\n        len = ssh_buffer_get_data(buffer, &c, 1);\n        if (len == 0) {\n            SSH_STRING_FREE(str);\n            return NULL;\n        }\n        *p = last | (c >> unused);\n        last = c << (8 - unused);\n    }\n\n    return str;\n}\n\nstatic int asn1_check_sequence(ssh_buffer buffer) {\n  unsigned char *j = NULL;\n  unsigned char tmp;\n  int i;\n  uint32_t size;\n  uint32_t padding;\n\n  if (ssh_buffer_get_data(buffer, &tmp, 1) == 0 || tmp != ASN1_SEQUENCE) {\n    return 0;\n  }\n\n  size = asn1_get_len(buffer);\n  if ((padding = ssh_buffer_get_len(buffer) - size) > 0) {\n    for (i = ssh_buffer_get_len(buffer) - size,\n         j = (unsigned char*)ssh_buffer_get(buffer) + size;\n         i;\n         i--, j++)\n    {\n      if (*j != padding) {                   /* padding is allowed */\n        return 0;                            /* but nothing else */\n      }\n    }\n  }\n\n  return 1;\n}\n\nstatic int asn1_check_tag(ssh_buffer buffer, unsigned char tag) {\n    unsigned char tmp;\n    uint32_t len;\n\n    len = ssh_buffer_get_data(buffer, &tmp, 1);\n    if (len == 0 || tmp != tag) {\n        return 0;\n    }\n\n    (void) asn1_get_len(buffer);\n    return 1;\n}\n\nstatic int passphrase_to_key(char *data, unsigned int datalen,\n    unsigned char *salt, unsigned char *key, unsigned int keylen) {\n  MD5CTX md;\n  unsigned char digest[MD5_DIGEST_LEN] = {0};\n  unsigned int i;\n  unsigned int j;\n  unsigned int md_not_empty;\n\n  for (j = 0, md_not_empty = 0; j < keylen; ) {\n    md = md5_init();\n    if (md == NULL) {\n      return -1;\n    }\n\n    if (md_not_empty) {\n      md5_update(md, digest, MD5_DIGEST_LEN);\n    } else {\n      md_not_empty = 1;\n    }\n\n    md5_update(md, data, datalen);\n    if (salt) {\n      md5_update(md, salt, PKCS5_SALT_LEN);\n    }\n    md5_final(digest, md);\n\n    for (i = 0; j < keylen && i < MD5_DIGEST_LEN; j++, i++) {\n      if (key) {\n        key[j] = digest[i];\n      }\n    }\n  }\n\n  return 0;\n}\n\nstatic int privatekey_decrypt(int algo, int mode, unsigned int key_len,\n                       unsigned char *iv, unsigned int iv_len,\n                       ssh_buffer data, ssh_auth_callback cb,\n                       void *userdata,\n                       const char *desc)\n{\n  char passphrase[MAX_PASSPHRASE_SIZE] = {0};\n  unsigned char key[MAX_KEY_SIZE] = {0};\n  unsigned char *tmp = NULL;\n  gcry_cipher_hd_t cipher;\n  int rc = -1;\n\n  if (!algo) {\n    return -1;\n  }\n\n  if (cb) {\n    rc = (*cb)(desc, passphrase, MAX_PASSPHRASE_SIZE, 0, 0, userdata);\n    if (rc < 0) {\n      return -1;\n    }\n  } else if (cb == NULL && userdata != NULL) {\n    snprintf(passphrase, MAX_PASSPHRASE_SIZE, \"%s\", (char *) userdata);\n  }\n\n  if (passphrase_to_key(passphrase, strlen(passphrase), iv, key, key_len) < 0) {\n    return -1;\n  }\n\n  if (gcry_cipher_open(&cipher, algo, mode, 0)\n      || gcry_cipher_setkey(cipher, key, key_len)\n      || gcry_cipher_setiv(cipher, iv, iv_len)\n      || (tmp = calloc(ssh_buffer_get_len(data), sizeof(unsigned char))) == NULL\n      || gcry_cipher_decrypt(cipher, tmp, ssh_buffer_get_len(data),\n                       ssh_buffer_get(data), ssh_buffer_get_len(data))) {\n    gcry_cipher_close(cipher);\n    return -1;\n  }\n\n  memcpy(ssh_buffer_get(data), tmp, ssh_buffer_get_len(data));\n\n  SAFE_FREE(tmp);\n  gcry_cipher_close(cipher);\n\n  return 0;\n}\n\nstatic int privatekey_dek_header(const char *header, unsigned int header_len,\n    int *algo, int *mode, unsigned int *key_len, unsigned char **iv,\n    unsigned int *iv_len) {\n  unsigned int iv_pos;\n\n  if (header_len > 13 && !strncmp(\"DES-EDE3-CBC\", header, 12))\n  {\n    *algo = GCRY_CIPHER_3DES;\n    iv_pos = 13;\n    *mode = GCRY_CIPHER_MODE_CBC;\n    *key_len = 24;\n    *iv_len = 8;\n  }\n  else if (header_len > 8 && !strncmp(\"DES-CBC\", header, 7))\n  {\n    *algo = GCRY_CIPHER_DES;\n    iv_pos = 8;\n    *mode = GCRY_CIPHER_MODE_CBC;\n    *key_len = 8;\n    *iv_len = 8;\n  }\n  else if (header_len > 12 && !strncmp(\"AES-128-CBC\", header, 11))\n  {\n    *algo = GCRY_CIPHER_AES128;\n    iv_pos = 12;\n    *mode = GCRY_CIPHER_MODE_CBC;\n    *key_len = 16;\n    *iv_len = 16;\n  }\n  else if (header_len > 12 && !strncmp(\"AES-192-CBC\", header, 11))\n  {\n    *algo = GCRY_CIPHER_AES192;\n    iv_pos = 12;\n    *mode = GCRY_CIPHER_MODE_CBC;\n    *key_len = 24;\n    *iv_len = 16;\n  }\n  else if (header_len > 12 && !strncmp(\"AES-256-CBC\", header, 11))\n  {\n    *algo = GCRY_CIPHER_AES256;\n    iv_pos = 12;\n    *mode = GCRY_CIPHER_MODE_CBC;\n    *key_len = 32;\n    *iv_len = 16;\n  } else {\n    return -1;\n  }\n\n  *iv = malloc(*iv_len);\n  if (*iv == NULL) {\n    return -1;\n  }\n\n  return load_iv(header + iv_pos, *iv, *iv_len);\n}\n\n#define get_next_line(p, len) {                                         \\\n        while(p[len] == '\\n' || p[len] == '\\r') /* skip empty lines */  \\\n            len++;                                                      \\\n        if(p[len] == '\\0')    /* EOL */                                 \\\n            eol = true;                                                 \\\n        else                  /* calculate length */                    \\\n            for(p += len, len = 0; p[len] && p[len] != '\\n'             \\\n                                          && p[len] != '\\r'; len++);    \\\n    }\n\nstatic ssh_buffer privatekey_string_to_buffer(const char *pkey, int type,\n                ssh_auth_callback cb, void *userdata, const char *desc) {\n    ssh_buffer buffer = NULL;\n    ssh_buffer out = NULL;\n    const char *p;\n    unsigned char *iv = NULL;\n    const char *header_begin;\n    const char *header_end;\n    unsigned int header_begin_size;\n    unsigned int header_end_size;\n    unsigned int key_len = 0;\n    unsigned int iv_len = 0;\n    int algo = 0;\n    int mode = 0;\n    bool eol = false;\n    size_t len;\n\n    buffer = ssh_buffer_new();\n    if (buffer == NULL) {\n        return NULL;\n    }\n\n    switch(type) {\n        case SSH_KEYTYPE_DSS:\n            header_begin = DSA_HEADER_BEGIN;\n            header_end = DSA_HEADER_END;\n            break;\n        case SSH_KEYTYPE_RSA:\n            header_begin = RSA_HEADER_BEGIN;\n            header_end = RSA_HEADER_END;\n            break;\n        case SSH_KEYTYPE_ECDSA_P256:\n        case SSH_KEYTYPE_ECDSA_P384:\n        case SSH_KEYTYPE_ECDSA_P521:\n            header_begin = ECDSA_HEADER_BEGIN;\n            header_end = ECDSA_HEADER_END;\n            break;\n        default:\n            SSH_BUFFER_FREE(buffer);\n            return NULL;\n    }\n\n    header_begin_size = strlen(header_begin);\n    header_end_size = strlen(header_end);\n\n    p = pkey;\n    len = 0;\n    get_next_line(p, len);\n\n    while(!eol && strncmp(p, header_begin, header_begin_size)) {\n        /* skip line */\n        get_next_line(p, len);\n    }\n    if (eol) {\n        SSH_BUFFER_FREE(buffer);\n        return NULL;\n    }\n\n    /* skip header line */\n    get_next_line(p, len);\n    if (eol) {\n        SSH_BUFFER_FREE(buffer);\n        return NULL;\n    }\n\n    if (len > 11 && strncmp(\"Proc-Type: 4,ENCRYPTED\", p, 11) == 0) {\n        /* skip line */\n        get_next_line(p, len);\n        if (eol) {\n            SSH_BUFFER_FREE(buffer);\n            return NULL;\n        }\n\n        if (len > 10 && strncmp(\"DEK-Info: \", p, 10) == 0) {\n            p += 10;\n            len = 0;\n            get_next_line(p, len);\n            if (eol) {\n                SSH_BUFFER_FREE(buffer);\n                return NULL;\n            }\n            if (privatekey_dek_header(p, len, &algo, &mode, &key_len,\n                        &iv, &iv_len) < 0) {\n                SSH_BUFFER_FREE(buffer);\n                SAFE_FREE(iv);\n                return NULL;\n            }\n        } else {\n            SSH_BUFFER_FREE(buffer);\n            SAFE_FREE(iv);\n            return NULL;\n        }\n    } else {\n        if(len > 0) {\n            if (ssh_buffer_add_data(buffer, p, len) < 0) {\n                SSH_BUFFER_FREE(buffer);\n                SAFE_FREE(iv);\n                return NULL;\n            }\n        }\n    }\n\n    get_next_line(p, len);\n    while(!eol && strncmp(p, header_end, header_end_size) != 0) {\n        if (ssh_buffer_add_data(buffer, p, len) < 0) {\n            SSH_BUFFER_FREE(buffer);\n            SAFE_FREE(iv);\n            return NULL;\n        }\n        get_next_line(p, len);\n    }\n\n    if (eol || strncmp(p, header_end, header_end_size) != 0) {\n        SSH_BUFFER_FREE(buffer);\n        SAFE_FREE(iv);\n        return NULL;\n    }\n\n    if (ssh_buffer_add_data(buffer, \"\\0\", 1) < 0) {\n        SSH_BUFFER_FREE(buffer);\n        SAFE_FREE(iv);\n        return NULL;\n    }\n\n    out = base64_to_bin(ssh_buffer_get(buffer));\n    SSH_BUFFER_FREE(buffer);\n    if (out == NULL) {\n        SAFE_FREE(iv);\n        return NULL;\n    }\n\n    if (algo) {\n        if (privatekey_decrypt(algo, mode, key_len, iv, iv_len, out,\n                    cb, userdata, desc) < 0) {\n            SSH_BUFFER_FREE(out);\n            SAFE_FREE(iv);\n            return NULL;\n        }\n    }\n    SAFE_FREE(iv);\n\n    return out;\n}\n\nstatic int b64decode_rsa_privatekey(const char *pkey, gcry_sexp_t *r,\n    ssh_auth_callback cb, void *userdata, const char *desc) {\n  const unsigned char *data;\n  ssh_string n = NULL;\n  ssh_string e = NULL;\n  ssh_string d = NULL;\n  ssh_string p = NULL;\n  ssh_string q = NULL;\n  ssh_string unused1 = NULL;\n  ssh_string unused2 = NULL;\n  ssh_string u = NULL;\n  ssh_string v = NULL;\n  ssh_buffer buffer = NULL;\n  int rc = 1;\n\n  buffer = privatekey_string_to_buffer(pkey, SSH_KEYTYPE_RSA, cb, userdata, desc);\n  if (buffer == NULL) {\n    return 0;\n  }\n\n  if (!asn1_check_sequence(buffer)) {\n    SSH_BUFFER_FREE(buffer);\n    return 0;\n  }\n\n  v = asn1_get_int(buffer);\n  if (v == NULL) {\n    SSH_BUFFER_FREE(buffer);\n    return 0;\n  }\n\n  data = ssh_string_data(v);\n  if (ssh_string_len(v) != 1 || data[0] != 0) {\n    SSH_STRING_FREE(v);\n    SSH_BUFFER_FREE(buffer);\n    return 0;\n  }\n\n  n = asn1_get_int(buffer);\n  e = asn1_get_int(buffer);\n  d = asn1_get_int(buffer);\n  q = asn1_get_int(buffer);\n  p = asn1_get_int(buffer);\n  unused1 = asn1_get_int(buffer);\n  unused2 = asn1_get_int(buffer);\n  u = asn1_get_int(buffer);\n\n  SSH_BUFFER_FREE(buffer);\n\n  if (n == NULL || e == NULL || d == NULL || p == NULL || q == NULL ||\n      unused1 == NULL || unused2 == NULL|| u == NULL) {\n    rc = 0;\n    goto error;\n  }\n\n  if (gcry_sexp_build(r, NULL,\n      \"(private-key(rsa(n %b)(e %b)(d %b)(p %b)(q %b)(u %b)))\",\n      ssh_string_len(n), ssh_string_data(n),\n      ssh_string_len(e), ssh_string_data(e),\n      ssh_string_len(d), ssh_string_data(d),\n      ssh_string_len(p), ssh_string_data(p),\n      ssh_string_len(q), ssh_string_data(q),\n      ssh_string_len(u), ssh_string_data(u))) {\n    rc = 0;\n  }\n\nerror:\n  ssh_string_burn(n);\n  SSH_STRING_FREE(n);\n  ssh_string_burn(e);\n  SSH_STRING_FREE(e);\n  ssh_string_burn(d);\n  SSH_STRING_FREE(d);\n  ssh_string_burn(p);\n  SSH_STRING_FREE(p);\n  ssh_string_burn(q);\n  SSH_STRING_FREE(q);\n  SSH_STRING_FREE(unused1);\n  SSH_STRING_FREE(unused2);\n  ssh_string_burn(u);\n  SSH_STRING_FREE(u);\n  SSH_STRING_FREE(v);\n\n  return rc;\n}\n\nstatic int b64decode_dsa_privatekey(const char *pkey, gcry_sexp_t *r, ssh_auth_callback cb,\n    void *userdata, const char *desc) {\n  const unsigned char *data;\n  ssh_buffer buffer = NULL;\n  ssh_string p = NULL;\n  ssh_string q = NULL;\n  ssh_string g = NULL;\n  ssh_string y = NULL;\n  ssh_string x = NULL;\n  ssh_string v = NULL;\n  int rc = 1;\n\n  buffer = privatekey_string_to_buffer(pkey, SSH_KEYTYPE_DSS, cb, userdata, desc);\n  if (buffer == NULL) {\n    return 0;\n  }\n\n  if (!asn1_check_sequence(buffer)) {\n    SSH_BUFFER_FREE(buffer);\n    return 0;\n  }\n\n  v = asn1_get_int(buffer);\n  if (v == NULL) {\n    SSH_BUFFER_FREE(buffer);\n    return 0;\n  }\n\n  data = ssh_string_data(v);\n  if (ssh_string_len(v) != 1 || data[0] != 0) {\n    SSH_STRING_FREE(v);\n    SSH_BUFFER_FREE(buffer);\n    return 0;\n  }\n\n  p = asn1_get_int(buffer);\n  q = asn1_get_int(buffer);\n  g = asn1_get_int(buffer);\n  y = asn1_get_int(buffer);\n  x = asn1_get_int(buffer);\n  SSH_BUFFER_FREE(buffer);\n\n  if (p == NULL || q == NULL || g == NULL || y == NULL || x == NULL) {\n    rc = 0;\n    goto error;\n  }\n\n  if (gcry_sexp_build(r, NULL,\n        \"(private-key(dsa(p %b)(q %b)(g %b)(y %b)(x %b)))\",\n        ssh_string_len(p), ssh_string_data(p),\n        ssh_string_len(q), ssh_string_data(q),\n        ssh_string_len(g), ssh_string_data(g),\n        ssh_string_len(y), ssh_string_data(y),\n        ssh_string_len(x), ssh_string_data(x))) {\n    rc = 0;\n  }\n\nerror:\n  ssh_string_burn(p);\n  SSH_STRING_FREE(p);\n  ssh_string_burn(q);\n  SSH_STRING_FREE(q);\n  ssh_string_burn(g);\n  SSH_STRING_FREE(g);\n  ssh_string_burn(y);\n  SSH_STRING_FREE(y);\n  ssh_string_burn(x);\n  SSH_STRING_FREE(x);\n  SSH_STRING_FREE(v);\n\n  return rc;\n}\n\n#ifdef HAVE_GCRYPT_ECC\nstatic int pki_key_ecdsa_to_nid(gcry_sexp_t k)\n{\n    gcry_sexp_t sexp;\n    const char *tmp;\n    size_t size;\n\n    sexp = gcry_sexp_find_token(k, \"curve\", 0);\n    if (sexp == NULL) {\n        return -1;\n    }\n\n    tmp = gcry_sexp_nth_data(sexp, 1, &size);\n\n    if (size == 10) {\n        int cmp;\n\n        cmp = memcmp(\"NIST P-256\", tmp, size);\n        if (cmp == 0) {\n            gcry_sexp_release(sexp);\n            return NID_gcrypt_nistp256;\n        }\n\n        cmp = memcmp(\"NIST P-384\", tmp, size);\n        if (cmp == 0) {\n            gcry_sexp_release(sexp);\n            return NID_gcrypt_nistp384;\n        }\n\n        cmp = memcmp(\"NIST P-521\", tmp, size);\n        if (cmp == 0) {\n            gcry_sexp_release(sexp);\n            return NID_gcrypt_nistp521;\n        }\n    }\n\n    gcry_sexp_release(sexp);\n    return -1;\n}\n\nstatic enum ssh_keytypes_e pki_key_ecdsa_to_key_type(gcry_sexp_t k)\n{\n    int nid;\n\n    nid = pki_key_ecdsa_to_nid(k);\n\n    switch (nid) {\n        case NID_gcrypt_nistp256:\n            return SSH_KEYTYPE_ECDSA_P256;\n        case NID_gcrypt_nistp384:\n            return SSH_KEYTYPE_ECDSA_P384;\n        case NID_gcrypt_nistp521:\n            return SSH_KEYTYPE_ECDSA_P521;\n        default:\n            return SSH_KEYTYPE_UNKNOWN;\n    }\n}\n\nstatic const char *pki_key_ecdsa_nid_to_gcrypt_name(int nid)\n{\n    switch (nid) {\n    case NID_gcrypt_nistp256:\n        return \"NIST P-256\";\n    case NID_gcrypt_nistp384:\n        return \"NIST P-384\";\n    case NID_gcrypt_nistp521:\n        return \"NIST P-521\";\n    }\n\n    return \"unknown\";\n}\n\n\nconst char *pki_key_ecdsa_nid_to_name(int nid)\n{\n    switch (nid) {\n    case NID_gcrypt_nistp256:\n        return \"ecdsa-sha2-nistp256\";\n    case NID_gcrypt_nistp384:\n        return \"ecdsa-sha2-nistp384\";\n    case NID_gcrypt_nistp521:\n        return \"ecdsa-sha2-nistp521\";\n    }\n\n    return \"unknown\";\n}\n\nstatic const char *pki_key_ecdsa_nid_to_char(int nid)\n{\n    switch (nid) {\n    case NID_gcrypt_nistp256:\n        return \"nistp256\";\n    case NID_gcrypt_nistp384:\n        return \"nistp384\";\n    case NID_gcrypt_nistp521:\n        return \"nistp521\";\n    default:\n        break;\n    }\n\n    return \"unknown\";\n}\n\nint pki_key_ecdsa_nid_from_name(const char *name)\n{\n    int cmp;\n\n    cmp = strcmp(name, \"nistp256\");\n    if (cmp == 0) {\n        return NID_gcrypt_nistp256;\n    }\n\n    cmp = strcmp(name, \"nistp384\");\n    if (cmp == 0) {\n        return NID_gcrypt_nistp384;\n    }\n\n    cmp = strcmp(name, \"nistp521\");\n    if (cmp == 0) {\n        return NID_gcrypt_nistp521;\n    }\n\n    return -1;\n}\n\nstatic int asn1_oi_to_nid(const ssh_string oi)\n{\n    static const struct {\n        int nid;\n        size_t length;\n        const char *identifier;\n    } *e, mapping[] = {\n        {NID_gcrypt_nistp256, 8, \"\\x2a\\x86\\x48\\xce\\x3d\\x03\\x01\\x07\"},\n        {NID_gcrypt_nistp384, 5, \"\\x2b\\x81\\x04\\x00\\x22\"},\n        {NID_gcrypt_nistp521, 5, \"\\x2b\\x81\\x04\\x00\\x23\"},\n        {0},\n    };\n    size_t len = ssh_string_len(oi);\n    for (e = mapping; e->length; e++) {\n        if (len == e->length\n            && memcmp(ssh_string_data(oi), e->identifier, len) == 0) {\n            return e->nid;\n        }\n    }\n    return -1;\n}\n\nstatic int b64decode_ecdsa_privatekey(const char *pkey, gcry_sexp_t *r,\n                                      ssh_auth_callback cb,\n                                      void *userdata,\n                                      const char *desc)\n{\n    const unsigned char *data;\n    ssh_buffer buffer = NULL;\n    gcry_error_t err = 0;\n    ssh_string v = NULL;\n    ssh_string d = NULL;\n    ssh_string oi = NULL;\n    int nid;\n    ssh_string q = NULL;\n    int valid = 0;\n    int ok;\n\n    buffer = privatekey_string_to_buffer(pkey,\n                                         SSH_KEYTYPE_ECDSA_P256,\n                                         cb,\n                                         userdata,\n                                         desc);\n    if (buffer == NULL) {\n        goto error;\n    }\n\n    ok = asn1_check_sequence(buffer);\n    if (!ok) {\n        goto error;\n    }\n\n    /* RFC5915 specifies version 1.  */\n    v = asn1_get_int(buffer);\n    if (v == NULL) {\n        goto error;\n    }\n\n    data = ssh_string_data(v);\n    if (ssh_string_len(v) != 1 || data[0] != 1) {\n        goto error;\n    }\n\n    d = asn1_get(buffer, ASN1_OCTET_STRING);\n    if (!asn1_check_tag(buffer, 0xa0)) {\n        goto error;\n    }\n    oi = asn1_get(buffer, ASN1_OBJECT_IDENTIFIER);\n    nid = asn1_oi_to_nid(oi);\n    ok = asn1_check_tag(buffer, 0xa1);\n    if (!ok) {\n        goto error;\n    }\n    q = asn1_get_bit_string(buffer);\n\n    if (d == NULL || oi == NULL || nid == -1 || q == NULL) {\n        goto error;\n    }\n\n    err = gcry_sexp_build(r,\n                          NULL,\n                          \"(private-key(ecdsa(curve %s)(d %b)(q %b)))\",\n                          pki_key_ecdsa_nid_to_gcrypt_name(nid),\n                          ssh_string_len(d),\n                          ssh_string_data(d),\n                          ssh_string_len(q),\n                          ssh_string_data(q));\n    if (err == 0) {\n        valid = 1;\n    }\n\n error:\n    SSH_BUFFER_FREE(buffer);\n    SSH_STRING_FREE(v);\n    ssh_string_burn(d);\n    SSH_STRING_FREE(d);\n    SSH_STRING_FREE(oi);\n    ssh_string_burn(q);\n    SSH_STRING_FREE(q);\n\n    return valid;\n}\n#endif\n\nssh_string pki_private_key_to_pem(const ssh_key key,\n                                  const char *passphrase,\n                                  ssh_auth_callback auth_fn,\n                                  void *auth_data)\n{\n    (void) key;\n    (void) passphrase;\n    (void) auth_fn;\n    (void) auth_data;\n\n    SSH_LOG(SSH_LOG_WARN, \"PEM export not supported by gcrypt backend!\");\n\n    return NULL;\n}\n\nssh_key pki_private_key_from_base64(const char *b64_key,\n                                    const char *passphrase,\n                                    ssh_auth_callback auth_fn,\n                                    void *auth_data)\n{\n    gcry_sexp_t dsa = NULL;\n    gcry_sexp_t rsa = NULL;\n    gcry_sexp_t ecdsa = NULL;\n    ssh_key key = NULL;\n    enum ssh_keytypes_e type;\n    int valid;\n\n    type = pki_privatekey_type_from_string(b64_key);\n    if (type == SSH_KEYTYPE_UNKNOWN) {\n        SSH_LOG(SSH_LOG_WARN, \"Unknown or invalid private key.\");\n        return NULL;\n    }\n\n    switch (type) {\n        case SSH_KEYTYPE_DSS:\n            if (passphrase == NULL) {\n                if (auth_fn) {\n                    valid = b64decode_dsa_privatekey(b64_key, &dsa, auth_fn,\n                            auth_data, \"Passphrase for private key:\");\n                } else {\n                    valid = b64decode_dsa_privatekey(b64_key, &dsa, NULL, NULL,\n                            NULL);\n                }\n            } else {\n                valid = b64decode_dsa_privatekey(b64_key, &dsa, NULL, (void *)\n                        passphrase, NULL);\n            }\n\n            if (!valid) {\n                SSH_LOG(SSH_LOG_WARN, \"Parsing private key\");\n                goto fail;\n            }\n            break;\n        case SSH_KEYTYPE_RSA:\n            if (passphrase == NULL) {\n                if (auth_fn) {\n                    valid = b64decode_rsa_privatekey(b64_key, &rsa, auth_fn,\n                            auth_data, \"Passphrase for private key:\");\n                } else {\n                    valid = b64decode_rsa_privatekey(b64_key, &rsa, NULL, NULL,\n                            NULL);\n                }\n            } else {\n                valid = b64decode_rsa_privatekey(b64_key, &rsa, NULL,\n                        (void *)passphrase, NULL);\n            }\n\n            if (!valid) {\n                SSH_LOG(SSH_LOG_WARN, \"Parsing private key\");\n                goto fail;\n            }\n            break;\n        case SSH_KEYTYPE_ECDSA_P256:\n        case SSH_KEYTYPE_ECDSA_P384:\n        case SSH_KEYTYPE_ECDSA_P521:\n#if HAVE_GCRYPT_ECC\n            if (passphrase == NULL) {\n                if (auth_fn != NULL) {\n                    valid = b64decode_ecdsa_privatekey(b64_key,\n                                                       &ecdsa,\n                                                       auth_fn,\n                                                       auth_data,\n                                                       \"Passphrase for private key:\");\n                } else {\n                    valid = b64decode_ecdsa_privatekey(b64_key,\n                                                       &ecdsa,\n                                                       NULL,\n                                                       NULL,\n                                                       NULL);\n                }\n            } else {\n                valid = b64decode_ecdsa_privatekey(b64_key,\n                                                   &ecdsa,\n                                                   NULL,\n                                                   (void *)passphrase,\n                                                   NULL);\n            }\n\n            if (!valid) {\n                SSH_LOG(SSH_LOG_WARN, \"Parsing private key\");\n                goto fail;\n            }\n\n            /* pki_privatekey_type_from_string always returns P256 for ECDSA\n             * keys, so we need to figure out the correct type here */\n            type = pki_key_ecdsa_to_key_type(ecdsa);\n            if (type == SSH_KEYTYPE_UNKNOWN) {\n                SSH_LOG(SSH_LOG_WARN, \"Invalid private key.\");\n                goto fail;\n            }\n            break;\n#endif\n        case SSH_KEYTYPE_ED25519:\n            /* Cannot open ed25519 keys with libgcrypt */\n        case SSH_KEYTYPE_RSA1:\n        case SSH_KEYTYPE_UNKNOWN:\n        default:\n            SSH_LOG(SSH_LOG_WARN, \"Unknown or invalid private key type %d\", type);\n            return NULL;\n    }\n\n    key = ssh_key_new();\n    if (key == NULL) {\n        goto fail;\n    }\n\n    key->type = type;\n    key->type_c = ssh_key_type_to_char(type);\n    key->flags = SSH_KEY_FLAG_PRIVATE | SSH_KEY_FLAG_PUBLIC;\n    key->dsa = dsa;\n    key->rsa = rsa;\n    key->ecdsa = ecdsa;\n#ifdef HAVE_GCRYPT_ECC\n    if (is_ecdsa_key_type(key->type)) {\n        key->ecdsa_nid = pki_key_ecdsa_to_nid(key->ecdsa);\n    }\n#endif\n\n    return key;\nfail:\n    ssh_key_free(key);\n    gcry_sexp_release(dsa);\n    gcry_sexp_release(rsa);\n    gcry_sexp_release(ecdsa);\n\n    return NULL;\n}\n\nint pki_privkey_build_dss(ssh_key key,\n                          ssh_string p,\n                          ssh_string q,\n                          ssh_string g,\n                          ssh_string pubkey,\n                          ssh_string privkey)\n{\n    gcry_sexp_build(&key->dsa, NULL,\n            \"(private-key(dsa(p %b)(q %b)(g %b)(y %b)(x %b)))\",\n            ssh_string_len(p), ssh_string_data(p),\n            ssh_string_len(q), ssh_string_data(q),\n            ssh_string_len(g), ssh_string_data(g),\n            ssh_string_len(pubkey), ssh_string_data(pubkey),\n            ssh_string_len(privkey), ssh_string_data(privkey));\n    if (key->dsa == NULL) {\n        return SSH_ERROR;\n    }\n\n    return SSH_OK;\n}\n\nint pki_pubkey_build_dss(ssh_key key,\n                         ssh_string p,\n                         ssh_string q,\n                         ssh_string g,\n                         ssh_string pubkey) {\n    gcry_sexp_build(&key->dsa, NULL,\n            \"(public-key(dsa(p %b)(q %b)(g %b)(y %b)))\",\n            ssh_string_len(p), ssh_string_data(p),\n            ssh_string_len(q), ssh_string_data(q),\n            ssh_string_len(g), ssh_string_data(g),\n            ssh_string_len(pubkey), ssh_string_data(pubkey));\n    if (key->dsa == NULL) {\n        return SSH_ERROR;\n    }\n\n    return SSH_OK;\n}\n\nint pki_privkey_build_rsa(ssh_key key,\n                          ssh_string n,\n                          ssh_string e,\n                          ssh_string d,\n                          ssh_string iqmp,\n                          ssh_string p,\n                          ssh_string q)\n{\n    /* in gcrypt, there is no iqmp (inverse of q mod p) argument,\n     * but it is ipmq (inverse of p mod q) so we need to swap\n     * the p and q arguments */\n    gcry_sexp_build(&key->rsa, NULL,\n            \"(private-key(rsa(n %b)(e %b)(d %b)(p %b)(q %b)(u %b)))\",\n            ssh_string_len(n), ssh_string_data(n),\n            ssh_string_len(e), ssh_string_data(e),\n            ssh_string_len(d), ssh_string_data(d),\n            ssh_string_len(q), ssh_string_data(q),\n            ssh_string_len(p), ssh_string_data(p),\n            ssh_string_len(iqmp), ssh_string_data(iqmp));\n    if (key->rsa == NULL) {\n        return SSH_ERROR;\n    }\n\n    return SSH_OK;\n}\n\nint pki_pubkey_build_rsa(ssh_key key,\n                         ssh_string e,\n                         ssh_string n) {\n    gcry_sexp_build(&key->rsa, NULL,\n            \"(public-key(rsa(n %b)(e %b)))\",\n            ssh_string_len(n), ssh_string_data(n),\n            ssh_string_len(e),ssh_string_data(e));\n    if (key->rsa == NULL) {\n        return SSH_ERROR;\n    }\n\n    return SSH_OK;\n}\n\n#ifdef HAVE_GCRYPT_ECC\nint pki_privkey_build_ecdsa(ssh_key key, int nid, ssh_string e, ssh_string exp)\n{\n    gpg_error_t err;\n\n    key->ecdsa_nid = nid;\n    key->type_c = pki_key_ecdsa_nid_to_name(nid);\n\n    err = gcry_sexp_build(&key->ecdsa, NULL,\n                          \"(private-key(ecdsa(curve %s)(d %b)(q %b)))\",\n                          pki_key_ecdsa_nid_to_gcrypt_name(nid),\n                          ssh_string_len(exp), ssh_string_data(exp),\n                          ssh_string_len(e), ssh_string_data(e));\n    if (err) {\n        return SSH_ERROR;\n    }\n\n    return SSH_OK;\n}\n\nint pki_pubkey_build_ecdsa(ssh_key key, int nid, ssh_string e)\n{\n    gpg_error_t err;\n\n    key->ecdsa_nid = nid;\n    key->type_c = pki_key_ecdsa_nid_to_name(nid);\n\n    err = gcry_sexp_build(&key->ecdsa, NULL,\n                          \"(public-key(ecdsa(curve %s)(q %b)))\",\n                          pki_key_ecdsa_nid_to_gcrypt_name(nid),\n                          ssh_string_len(e), ssh_string_data(e));\n    if (err) {\n        return SSH_ERROR;\n    }\n\n    return SSH_OK;\n}\n#endif\n\nssh_key pki_key_dup(const ssh_key key, int demote)\n{\n    ssh_key new;\n    gcry_error_t err = 0;\n    int rc;\n\n    gcry_mpi_t p = NULL;\n    gcry_mpi_t q = NULL;\n    gcry_mpi_t g = NULL;\n    gcry_mpi_t y = NULL;\n    gcry_mpi_t x = NULL;\n\n    gcry_mpi_t e = NULL;\n    gcry_mpi_t n = NULL;\n    gcry_mpi_t d = NULL;\n    gcry_mpi_t u = NULL;\n\n    gcry_sexp_t curve = NULL;\n\n    new = ssh_key_new();\n    if (new == NULL) {\n        return NULL;\n    }\n    new->type = key->type;\n    new->type_c = key->type_c;\n    if (demote) {\n        new->flags = SSH_KEY_FLAG_PUBLIC;\n    } else {\n        new->flags = key->flags;\n    }\n\n    switch(key->type) {\n        case SSH_KEYTYPE_DSS:\n            err = gcry_sexp_extract_param(key->dsa,\n                                          NULL,\n                                          \"pqgyx?\",\n                                          &p,\n                                          &q,\n                                          &g,\n                                          &y,\n                                          &x,\n                                          NULL);\n            if (err != 0) {\n                break;\n            }\n\n            if (!demote && (key->flags & SSH_KEY_FLAG_PRIVATE)) {\n                err = gcry_sexp_build(&new->dsa,\n                        NULL,\n                        \"(private-key(dsa(p %m)(q %m)(g %m)(y %m)(x %m)))\",\n                        p, q, g, y, x);\n            } else {\n                err = gcry_sexp_build(&new->dsa,\n                        NULL,\n                        \"(public-key(dsa(p %m)(q %m)(g %m)(y %m)))\",\n                        p, q, g, y);\n            }\n            break;\n        case SSH_KEYTYPE_RSA:\n            err = gcry_sexp_extract_param(key->rsa,\n                                          NULL,\n                                          \"ned?p?q?u?\",\n                                          &n,\n                                          &e,\n                                          &d,\n                                          &p,\n                                          &q,\n                                          &u,\n                                          NULL);\n            if (err != 0) {\n                break;\n            }\n\n            if (!demote && (key->flags & SSH_KEY_FLAG_PRIVATE)) {\n                err = gcry_sexp_build(&new->rsa,\n                        NULL,\n                        \"(private-key(rsa(n %m)(e %m)(d %m)(p %m)(q %m)(u %m)))\",\n                        n, e, d, p, q, u);\n            } else {\n                err = gcry_sexp_build(&new->rsa,\n                                      NULL,\n                                      \"(public-key(rsa(n %m)(e %m)))\",\n                                      n, e);\n            }\n            break;\n        case SSH_KEYTYPE_ED25519:\n\t\trc = pki_ed25519_key_dup(new, key);\n\t\tif (rc != SSH_OK) {\n                    ssh_key_free(new);\n                    return NULL;\n\t\t}\n\t\tbreak;\n\n        case SSH_KEYTYPE_ECDSA_P256:\n        case SSH_KEYTYPE_ECDSA_P384:\n        case SSH_KEYTYPE_ECDSA_P521:\n#ifdef HAVE_GCRYPT_ECC\n            new->ecdsa_nid = key->ecdsa_nid;\n\n            err = gcry_sexp_extract_param(key->ecdsa,\n                                          NULL,\n                                          \"qd?\",\n                                          &q,\n                                          &d,\n                                          NULL);\n            if (err) {\n                break;\n            }\n\n            curve = gcry_sexp_find_token(key->ecdsa, \"curve\", 0);\n            if (curve == NULL) {\n              break;\n            }\n\n            if (!demote && (key->flags & SSH_KEY_FLAG_PRIVATE)) {\n                err = gcry_sexp_build(&new->ecdsa,\n                                      NULL,\n                                      \"(private-key(ecdsa %S (d %m)(q %m)))\",\n                                      curve,\n                                      d,\n                                      q);\n            } else {\n                err = gcry_sexp_build(&new->ecdsa,\n                                      NULL,\n                                      \"(private-key(ecdsa %S (q %m)))\",\n                                      curve,\n                                      q);\n            }\n            break;\n#endif\n        case SSH_KEYTYPE_RSA1:\n        case SSH_KEYTYPE_UNKNOWN:\n        default:\n            ssh_key_free(new);\n            return NULL;\n    }\n\n    if (err) {\n        ssh_key_free(new);\n        new = NULL;\n    }\n\n    gcry_mpi_release(p);\n    gcry_mpi_release(q);\n    gcry_mpi_release(g);\n    gcry_mpi_release(y);\n    gcry_mpi_release(x);\n\n    gcry_mpi_release(e);\n    gcry_mpi_release(n);\n    gcry_mpi_release(d);\n    gcry_mpi_release(u);\n\n    gcry_sexp_release(curve);\n\n    return new;\n}\n\nstatic int pki_key_generate(ssh_key key, int parameter, const char *type_s, int type){\n    gcry_sexp_t parms;\n    int rc;\n    rc = gcry_sexp_build(&parms,\n            NULL,\n            \"(genkey(%s(nbits %d)(transient-key)))\",\n            type_s,\n            parameter);\n    if (rc != 0)\n        return SSH_ERROR;\n    switch (type) {\n    case SSH_KEYTYPE_RSA:\n        rc = gcry_pk_genkey(&key->rsa, parms);\n        break;\n    case SSH_KEYTYPE_DSS:\n        rc = gcry_pk_genkey(&key->dsa, parms);\n        break;\n    case SSH_KEYTYPE_ECDSA_P256:\n    case SSH_KEYTYPE_ECDSA_P384:\n    case SSH_KEYTYPE_ECDSA_P521:\n        rc = gcry_pk_genkey(&key->ecdsa, parms);\n        break;\n    default:\n        assert (! \"reached\");\n    }\n    gcry_sexp_release(parms);\n    if (rc != 0)\n        return SSH_ERROR;\n    return SSH_OK;\n}\n\nint pki_key_generate_rsa(ssh_key key, int parameter){\n    return pki_key_generate(key, parameter, \"rsa\", SSH_KEYTYPE_RSA);\n}\nint pki_key_generate_dss(ssh_key key, int parameter){\n    return pki_key_generate(key, parameter, \"dsa\", SSH_KEYTYPE_DSS);\n}\n\n#ifdef HAVE_GCRYPT_ECC\nint pki_key_generate_ecdsa(ssh_key key, int parameter) {\n    switch (parameter) {\n        case 384:\n            key->ecdsa_nid = NID_gcrypt_nistp384;\n            key->type = SSH_KEYTYPE_ECDSA_P384;\n            return pki_key_generate(key, parameter, \"ecdsa\",\n                                    SSH_KEYTYPE_ECDSA_P384);\n        case 521:\n            key->ecdsa_nid = NID_gcrypt_nistp521;\n            key->type = SSH_KEYTYPE_ECDSA_P521;\n            return pki_key_generate(key, parameter, \"ecdsa\",\n                                    SSH_KEYTYPE_ECDSA_P521);\n        case 256:\n        default:\n            key->ecdsa_nid = NID_gcrypt_nistp256;\n            key->type = SSH_KEYTYPE_ECDSA_P256;\n            return pki_key_generate(key, parameter, \"ecdsa\",\n                                    SSH_KEYTYPE_ECDSA_P256);\n    }\n}\n#endif\n\nstatic int _bignum_cmp(const gcry_sexp_t s1,\n                       const gcry_sexp_t s2,\n                       const char *what)\n{\n    gcry_sexp_t sexp;\n    bignum b1;\n    bignum b2;\n    int result;\n\n    sexp = gcry_sexp_find_token(s1, what, 0);\n    if (sexp == NULL) {\n        return 1;\n    }\n    b1 = gcry_sexp_nth_mpi(sexp, 1, GCRYMPI_FMT_USG);\n    gcry_sexp_release(sexp);\n    if (b1 == NULL) {\n        return 1;\n    }\n\n    sexp = gcry_sexp_find_token(s2, what, 0);\n    if (sexp == NULL) {\n        bignum_safe_free(b1);\n        return 1;\n    }\n    b2 = gcry_sexp_nth_mpi(sexp, 1, GCRYMPI_FMT_USG);\n    gcry_sexp_release(sexp);\n    if (b2 == NULL) {\n        bignum_safe_free(b1);\n        return 1;\n    }\n\n    result = !! bignum_cmp(b1, b2);\n    bignum_safe_free(b1);\n    bignum_safe_free(b2);\n    return result;\n}\n\nint pki_key_compare(const ssh_key k1,\n                    const ssh_key k2,\n                    enum ssh_keycmp_e what)\n{\n    switch (k1->type) {\n        case SSH_KEYTYPE_DSS:\n            if (_bignum_cmp(k1->dsa, k2->dsa, \"p\") != 0) {\n                return 1;\n            }\n\n            if (_bignum_cmp(k1->dsa, k2->dsa, \"q\") != 0) {\n                return 1;\n            }\n\n            if (_bignum_cmp(k1->dsa, k2->dsa, \"g\") != 0) {\n                return 1;\n            }\n\n            if (_bignum_cmp(k1->dsa, k2->dsa, \"y\") != 0) {\n                return 1;\n            }\n\n            if (what == SSH_KEY_CMP_PRIVATE) {\n                if (_bignum_cmp(k1->dsa, k2->dsa, \"x\") != 0) {\n                    return 1;\n                }\n            }\n            break;\n        case SSH_KEYTYPE_RSA:\n            if (_bignum_cmp(k1->rsa, k2->rsa, \"e\") != 0) {\n                return 1;\n            }\n\n            if (_bignum_cmp(k1->rsa, k2->rsa, \"n\") != 0) {\n                return 1;\n            }\n\n            if (what == SSH_KEY_CMP_PRIVATE) {\n                if (_bignum_cmp(k1->rsa, k2->rsa, \"d\") != 0) {\n                    return 1;\n                }\n\n                if (_bignum_cmp(k1->rsa, k2->rsa, \"p\") != 0) {\n                    return 1;\n                }\n\n                if (_bignum_cmp(k1->rsa, k2->rsa, \"q\") != 0) {\n                    return 1;\n                }\n\n                if (_bignum_cmp(k1->rsa, k2->rsa, \"u\") != 0) {\n                    return 1;\n                }\n            }\n            break;\n        case SSH_KEYTYPE_ED25519:\n\t\t/* ed25519 keys handled globaly */\n\t\treturn 0;\n        case SSH_KEYTYPE_ECDSA_P256:\n        case SSH_KEYTYPE_ECDSA_P384:\n        case SSH_KEYTYPE_ECDSA_P521:\n#ifdef HAVE_GCRYPT_ECC\n            if (k1->ecdsa_nid != k2->ecdsa_nid) {\n                return 1;\n            }\n\n            if (_bignum_cmp(k1->ecdsa, k2->ecdsa, \"q\") != 0) {\n                return 1;\n            }\n\n            if (what == SSH_KEY_CMP_PRIVATE) {\n                if (_bignum_cmp(k1->ecdsa, k2->ecdsa, \"d\") != 0) {\n                    return 1;\n                }\n            }\n            break;\n#endif\n        case SSH_KEYTYPE_DSS_CERT01:\n        case SSH_KEYTYPE_RSA_CERT01:\n        case SSH_KEYTYPE_ECDSA:\n        case SSH_KEYTYPE_ECDSA_P256_CERT01:\n        case SSH_KEYTYPE_ECDSA_P384_CERT01:\n        case SSH_KEYTYPE_ECDSA_P521_CERT01:\n        case SSH_KEYTYPE_ED25519_CERT01:\n        case SSH_KEYTYPE_RSA1:\n        case SSH_KEYTYPE_UNKNOWN:\n            return 1;\n    }\n\n    return 0;\n}\n\nssh_string pki_publickey_to_blob(const ssh_key key)\n{\n    ssh_buffer buffer;\n    ssh_string type_s;\n    ssh_string str = NULL;\n    ssh_string e = NULL;\n    ssh_string n = NULL;\n    ssh_string p = NULL;\n    ssh_string g = NULL;\n    ssh_string q = NULL;\n    int rc;\n\n    buffer = ssh_buffer_new();\n    if (buffer == NULL) {\n        return NULL;\n    }\n\n    if (key->cert != NULL) {\n        rc = ssh_buffer_add_buffer(buffer, key->cert);\n        if (rc < 0) {\n            SSH_BUFFER_FREE(buffer);\n            return NULL;\n        }\n        goto makestring;\n    }\n\n    type_s = ssh_string_from_char(key->type_c);\n    if (type_s == NULL) {\n        SSH_BUFFER_FREE(buffer);\n        return NULL;\n    }\n\n    rc = ssh_buffer_add_ssh_string(buffer, type_s);\n    SSH_STRING_FREE(type_s);\n    if (rc < 0) {\n        SSH_BUFFER_FREE(buffer);\n        return NULL;\n    }\n\n    switch (key->type) {\n        case SSH_KEYTYPE_DSS:\n            p = ssh_sexp_extract_mpi(key->dsa,\n                                     \"p\",\n                                     GCRYMPI_FMT_USG,\n                                     GCRYMPI_FMT_STD);\n            if (p == NULL) {\n                goto fail;\n            }\n\n            q = ssh_sexp_extract_mpi(key->dsa,\n                                     \"q\",\n                                     GCRYMPI_FMT_USG,\n                                     GCRYMPI_FMT_STD);\n            if (q == NULL) {\n                goto fail;\n            }\n\n            g = ssh_sexp_extract_mpi(key->dsa,\n                                     \"g\",\n                                     GCRYMPI_FMT_USG,\n                                     GCRYMPI_FMT_STD);\n            if (g == NULL) {\n                goto fail;\n            }\n\n            n = ssh_sexp_extract_mpi(key->dsa,\n                                     \"y\",\n                                     GCRYMPI_FMT_USG,\n                                     GCRYMPI_FMT_STD);\n            if (n == NULL) {\n                goto fail;\n            }\n\n            rc = ssh_buffer_add_ssh_string(buffer, p);\n            if (rc < 0) {\n                goto fail;\n            }\n            rc = ssh_buffer_add_ssh_string(buffer, q);\n            if (rc < 0) {\n                goto fail;\n            }\n            rc = ssh_buffer_add_ssh_string(buffer, g);\n            if (rc < 0) {\n                goto fail;\n            }\n            rc = ssh_buffer_add_ssh_string(buffer, n);\n            if (rc < 0) {\n                goto fail;\n            }\n\n            ssh_string_burn(p);\n            SSH_STRING_FREE(p);\n            ssh_string_burn(g);\n            SSH_STRING_FREE(g);\n            ssh_string_burn(q);\n            SSH_STRING_FREE(q);\n            ssh_string_burn(n);\n            SSH_STRING_FREE(n);\n\n            break;\n        case SSH_KEYTYPE_RSA:\n            e = ssh_sexp_extract_mpi(key->rsa,\n                                     \"e\",\n                                     GCRYMPI_FMT_USG,\n                                     GCRYMPI_FMT_STD);\n            if (e == NULL) {\n                goto fail;\n            }\n\n            n = ssh_sexp_extract_mpi(key->rsa,\n                                     \"n\",\n                                     GCRYMPI_FMT_USG,\n                                     GCRYMPI_FMT_STD);\n            if (n == NULL) {\n                goto fail;\n            }\n\n            rc = ssh_buffer_add_ssh_string(buffer, e);\n            if (rc < 0) {\n                goto fail;\n            }\n            rc = ssh_buffer_add_ssh_string(buffer, n);\n            if (rc < 0) {\n                goto fail;\n            }\n\n            ssh_string_burn(e);\n            SSH_STRING_FREE(e);\n            ssh_string_burn(n);\n            SSH_STRING_FREE(n);\n\n            break;\n        case SSH_KEYTYPE_ED25519:\n\t\trc = pki_ed25519_public_key_to_blob(buffer, key);\n\t\tif (rc != SSH_OK){\n\t\t\tgoto fail;\n\t\t}\n\t\tbreak;\n        case SSH_KEYTYPE_ECDSA_P256:\n        case SSH_KEYTYPE_ECDSA_P384:\n        case SSH_KEYTYPE_ECDSA_P521:\n#ifdef HAVE_GCRYPT_ECC\n            type_s = ssh_string_from_char(\n                       pki_key_ecdsa_nid_to_char(key->ecdsa_nid));\n            if (type_s == NULL) {\n                SSH_BUFFER_FREE(buffer);\n                return NULL;\n            }\n\n            rc = ssh_buffer_add_ssh_string(buffer, type_s);\n            SSH_STRING_FREE(type_s);\n            if (rc < 0) {\n                SSH_BUFFER_FREE(buffer);\n                return NULL;\n            }\n\n            e = ssh_sexp_extract_mpi(key->ecdsa, \"q\", GCRYMPI_FMT_STD,\n                                     GCRYMPI_FMT_STD);\n            if (e == NULL) {\n                SSH_BUFFER_FREE(buffer);\n                return NULL;\n            }\n\n            rc = ssh_buffer_add_ssh_string(buffer, e);\n            if (rc < 0) {\n                goto fail;\n            }\n\n            ssh_string_burn(e);\n            SSH_STRING_FREE(e);\n            e = NULL;\n            break;\n#endif\n        case SSH_KEYTYPE_RSA1:\n        case SSH_KEYTYPE_UNKNOWN:\n        default:\n            goto fail;\n    }\n\nmakestring:\n    str = ssh_string_new(ssh_buffer_get_len(buffer));\n    if (str == NULL) {\n        goto fail;\n    }\n\n    rc = ssh_string_fill(str, ssh_buffer_get(buffer), ssh_buffer_get_len(buffer));\n    if (rc < 0) {\n        goto fail;\n    }\n    SSH_BUFFER_FREE(buffer);\n\n    return str;\nfail:\n    SSH_BUFFER_FREE(buffer);\n    ssh_string_burn(str);\n    SSH_STRING_FREE(str);\n    ssh_string_burn(e);\n    SSH_STRING_FREE(e);\n    ssh_string_burn(p);\n    SSH_STRING_FREE(p);\n    ssh_string_burn(g);\n    SSH_STRING_FREE(g);\n    ssh_string_burn(q);\n    SSH_STRING_FREE(q);\n    ssh_string_burn(n);\n    SSH_STRING_FREE(n);\n\n    return NULL;\n}\n\nssh_string pki_signature_to_blob(const ssh_signature sig)\n{\n    char buffer[40] = { 0 };\n\n    const char *r = NULL;\n    size_t r_len, r_offset_in, r_offset_out;\n\n    const char *s = NULL;\n    size_t s_len, s_offset_in, s_offset_out;\n\n    gcry_sexp_t sexp;\n    size_t size = 0;\n    ssh_string sig_blob = NULL;\n\n    switch(sig->type) {\n        case SSH_KEYTYPE_DSS:\n            sexp = gcry_sexp_find_token(sig->dsa_sig, \"r\", 0);\n            if (sexp == NULL) {\n                return NULL;\n            }\n            r = gcry_sexp_nth_data(sexp, 1, &size);\n            /* libgcrypt put 0 when first bit is set */\n            if (*r == 0) {\n                size--;\n                r++;\n            }\n\n            r_len = size;\n            r_offset_in  = (r_len > 20) ? (r_len - 20) : 0;\n            r_offset_out = (r_len < 20) ? (20 - r_len) : 0;\n            memcpy(buffer + r_offset_out,\n                   r + r_offset_in,\n                   r_len - r_offset_in);\n\n            gcry_sexp_release(sexp);\n\n            sexp = gcry_sexp_find_token(sig->dsa_sig, \"s\", 0);\n            if (sexp == NULL) {\n                return NULL;\n            }\n            s = gcry_sexp_nth_data(sexp,1,&size);\n            if (*s == 0) {\n                size--;\n                s++;\n            }\n\n            s_len = size;\n            s_offset_in  = (s_len > 20) ? (s_len - 20) : 0;\n            s_offset_out = (s_len < 20) ? (20 - s_len) : 0;\n            memcpy(buffer + 20 + s_offset_out,\n                   s + s_offset_in,\n                   s_len - s_offset_in);\n\n            gcry_sexp_release(sexp);\n\n            sig_blob = ssh_string_new(40);\n            if (sig_blob == NULL) {\n                return NULL;\n            }\n\n            ssh_string_fill(sig_blob, buffer, 40);\n            break;\n        case SSH_KEYTYPE_RSA:\n            sexp = gcry_sexp_find_token(sig->rsa_sig, \"s\", 0);\n            if (sexp == NULL) {\n                return NULL;\n            }\n            s = gcry_sexp_nth_data(sexp, 1, &size);\n            if (*s == 0) {\n                size--;\n                s++;\n            }\n\n            sig_blob = ssh_string_new(size);\n            if (sig_blob == NULL) {\n                return NULL;\n            }\n            ssh_string_fill(sig_blob, discard_const_p(char, s), size);\n\n            gcry_sexp_release(sexp);\n            break;\n        case SSH_KEYTYPE_ED25519:\n\t\tsig_blob = pki_ed25519_signature_to_blob(sig);\n\t\tbreak;\n        case SSH_KEYTYPE_ECDSA_P256:\n        case SSH_KEYTYPE_ECDSA_P384:\n        case SSH_KEYTYPE_ECDSA_P521:\n#ifdef HAVE_GCRYPT_ECC\n            {\n                ssh_string R;\n                ssh_string S;\n                ssh_buffer b;\n                int rc;\n\n                b = ssh_buffer_new();\n                if (b == NULL) {\n                    return NULL;\n                }\n\n                R = ssh_sexp_extract_mpi(sig->ecdsa_sig, \"r\",\n                                         GCRYMPI_FMT_USG, GCRYMPI_FMT_STD);\n                if (R == NULL) {\n                    SSH_BUFFER_FREE(b);\n                    return NULL;\n                }\n\n                rc = ssh_buffer_add_ssh_string(b, R);\n                SSH_STRING_FREE(R);\n                if (rc < 0) {\n                    SSH_BUFFER_FREE(b);\n                    return NULL;\n                }\n\n                S = ssh_sexp_extract_mpi(sig->ecdsa_sig, \"s\",\n                                         GCRYMPI_FMT_USG, GCRYMPI_FMT_STD);\n                if (S == NULL) {\n                    SSH_BUFFER_FREE(b);\n                    return NULL;\n                }\n\n                rc = ssh_buffer_add_ssh_string(b, S);\n                SSH_STRING_FREE(S);\n                if (rc < 0) {\n                    SSH_BUFFER_FREE(b);\n                    return NULL;\n                }\n\n                sig_blob = ssh_string_new(ssh_buffer_get_len(b));\n                if (sig_blob == NULL) {\n                    SSH_BUFFER_FREE(b);\n                    return NULL;\n                }\n\n                ssh_string_fill(sig_blob,\n                                ssh_buffer_get(b), ssh_buffer_get_len(b));\n                SSH_BUFFER_FREE(b);\n                break;\n            }\n#endif\n        case SSH_KEYTYPE_RSA1:\n        case SSH_KEYTYPE_UNKNOWN:\n        default:\n            SSH_LOG(SSH_LOG_WARN, \"Unknown signature key type: %d\", sig->type);\n            return NULL;\n            break;\n    }\n\n    return sig_blob;\n}\n\nssh_signature pki_signature_from_blob(const ssh_key pubkey,\n                                      const ssh_string sig_blob,\n                                      enum ssh_keytypes_e type,\n                                      enum ssh_digest_e hash_type)\n{\n    ssh_signature sig;\n    gcry_error_t err;\n    size_t len;\n    size_t rsalen;\n    int rc;\n\n    if (ssh_key_type_plain(pubkey->type) != type) {\n        SSH_LOG(SSH_LOG_WARN,\n                \"Incompatible public key provided (%d) expecting (%d)\",\n                type,\n                pubkey->type);\n        return NULL;\n    }\n\n    sig = ssh_signature_new();\n    if (sig == NULL) {\n        return NULL;\n    }\n\n    sig->type = type;\n    sig->type_c = ssh_key_signature_to_char(type, hash_type);\n    sig->hash_type = hash_type;\n\n    len = ssh_string_len(sig_blob);\n\n    switch(type) {\n        case SSH_KEYTYPE_DSS:\n            /* 40 is the dual signature blob len. */\n            if (len != 40) {\n                SSH_LOG(SSH_LOG_WARN,\n                        \"Signature has wrong size: %lu\",\n                        (unsigned long)len);\n                ssh_signature_free(sig);\n                return NULL;\n            }\n\n#ifdef DEBUG_CRYPTO\n            SSH_LOG(SSH_LOG_DEBUG,\n                    \"DSA signature len: %lu\",\n                    (unsigned long)len);\n            ssh_log_hexdump(\"DSA signature\", ssh_string_data(sig_blob), len);\n#endif\n\n            err = gcry_sexp_build(&sig->dsa_sig,\n                                  NULL,\n                                  \"(sig-val(dsa(r %b)(s %b)))\",\n                                  20,\n                                  ssh_string_data(sig_blob),\n                                  20,\n                                  (unsigned char *)ssh_string_data(sig_blob) + 20);\n            if (err) {\n                ssh_signature_free(sig);\n                return NULL;\n            }\n            break;\n        case SSH_KEYTYPE_RSA:\n            rsalen = (gcry_pk_get_nbits(pubkey->rsa) + 7) / 8;\n\n            if (len > rsalen) {\n                SSH_LOG(SSH_LOG_WARN,\n                        \"Signature is to big size: %lu\",\n                        (unsigned long)len);\n                ssh_signature_free(sig);\n                return NULL;\n            }\n\n            if (len < rsalen) {\n                SSH_LOG(SSH_LOG_DEBUG,\n                        \"RSA signature len %lu < %lu\",\n                        (unsigned long)len,\n                        (unsigned long)rsalen);\n            }\n\n#ifdef DEBUG_CRYPTO\n            SSH_LOG(SSH_LOG_DEBUG, \"RSA signature len: %lu\", (unsigned long)len);\n            ssh_log_hexdump(\"RSA signature\", ssh_string_data(sig_blob), len);\n#endif\n\n            err = gcry_sexp_build(&sig->rsa_sig,\n                                  NULL,\n                                  \"(sig-val(rsa(s %b)))\",\n                                  ssh_string_len(sig_blob),\n                                  ssh_string_data(sig_blob));\n            if (err) {\n                ssh_signature_free(sig);\n                return NULL;\n            }\n            break;\n        case SSH_KEYTYPE_ED25519:\n\t\trc = pki_signature_from_ed25519_blob(sig, sig_blob);\n\t\tif (rc != SSH_OK){\n\t\t\tssh_signature_free(sig);\n\t\t\treturn NULL;\n\t\t}\n\t\tbreak;\n        case SSH_KEYTYPE_ECDSA_P256:\n        case SSH_KEYTYPE_ECDSA_P384:\n        case SSH_KEYTYPE_ECDSA_P521:\n#ifdef HAVE_GCRYPT_ECC\n            { /* build ecdsa siganature */\n                ssh_buffer b;\n                ssh_string r, s;\n                uint32_t rlen;\n\n                b = ssh_buffer_new();\n                if (b == NULL) {\n                    ssh_signature_free(sig);\n                    return NULL;\n                }\n\n                rc = ssh_buffer_add_data(b,\n                                         ssh_string_data(sig_blob),\n                                         ssh_string_len(sig_blob));\n                if (rc < 0) {\n                    SSH_BUFFER_FREE(b);\n                    ssh_signature_free(sig);\n                    return NULL;\n                }\n\n                r = ssh_buffer_get_ssh_string(b);\n                if (r == NULL) {\n                    SSH_BUFFER_FREE(b);\n                    ssh_signature_free(sig);\n                    return NULL;\n                }\n\n                s = ssh_buffer_get_ssh_string(b);\n                rlen = ssh_buffer_get_len(b);\n                SSH_BUFFER_FREE(b);\n                if (s == NULL) {\n                    ssh_string_burn(r);\n                    SSH_STRING_FREE(r);\n                    ssh_signature_free(sig);\n                    return NULL;\n                }\n\n                if (rlen != 0) {\n                    SSH_LOG(SSH_LOG_WARN,\n                            \"Signature has remaining bytes in inner \"\n                            \"sigblob: %lu\",\n                            (unsigned long)rlen);\n                    ssh_string_burn(r);\n                    SSH_STRING_FREE(r);\n                    ssh_string_burn(s);\n                    SSH_STRING_FREE(s);\n                    ssh_signature_free(sig);\n                    return NULL;\n                }\n\n#ifdef DEBUG_CRYPTO\n                ssh_log_hexdump(\"r\", ssh_string_data(r), ssh_string_len(r));\n                ssh_log_hexdump(\"s\", ssh_string_data(s), ssh_string_len(s));\n#endif\n\n                err = gcry_sexp_build(&sig->ecdsa_sig,\n                                      NULL,\n                                      \"(sig-val(ecdsa(r %b)(s %b)))\",\n                                      ssh_string_len(r),\n                                      ssh_string_data(r),\n                                      ssh_string_len(s),\n                                      ssh_string_data(s));\n                ssh_string_burn(r);\n                SSH_STRING_FREE(r);\n                ssh_string_burn(s);\n                SSH_STRING_FREE(s);\n                if (err) {\n                    ssh_signature_free(sig);\n                    return NULL;\n                }\n            }\n            break;\n#endif\n        case SSH_KEYTYPE_RSA1:\n        case SSH_KEYTYPE_UNKNOWN:\n        default:\n            SSH_LOG(SSH_LOG_WARN, \"Unknown signature type\");\n            return NULL;\n    }\n\n    return sig;\n}\n\nssh_signature pki_do_sign_hash(const ssh_key privkey,\n                               const unsigned char *hash,\n                               size_t hlen,\n                               enum ssh_digest_e hash_type)\n{\n    unsigned char ghash[hlen + 1];\n    const char *hash_c = NULL;\n    ssh_signature sig;\n    gcry_sexp_t sexp;\n    gcry_error_t err;\n\n    sig = ssh_signature_new();\n    if (sig == NULL) {\n        return NULL;\n    }\n    sig->type = privkey->type;\n    sig->type_c = ssh_key_signature_to_char(privkey->type, hash_type);\n    sig->hash_type = hash_type;\n    switch (privkey->type) {\n        case SSH_KEYTYPE_DSS:\n            /* That is to mark the number as positive */\n            if(hash[0] >= 0x80) {\n                memcpy(ghash + 1, hash, hlen);\n                ghash[0] = 0;\n                hash = ghash;\n                hlen += 1;\n            }\n\n            err = gcry_sexp_build(&sexp, NULL, \"%b\", hlen, hash);\n            if (err) {\n                ssh_signature_free(sig);\n                return NULL;\n            }\n\n            err = gcry_pk_sign(&sig->dsa_sig, sexp, privkey->dsa);\n            gcry_sexp_release(sexp);\n            if (err) {\n                ssh_signature_free(sig);\n                return NULL;\n            }\n            break;\n        case SSH_KEYTYPE_RSA:\n            switch (hash_type) {\n            case SSH_DIGEST_SHA1:\n                hash_c = \"sha1\";\n                break;\n            case SSH_DIGEST_SHA256:\n                hash_c = \"sha256\";\n                break;\n            case SSH_DIGEST_SHA512:\n                hash_c = \"sha512\";\n                break;\n            case SSH_DIGEST_AUTO:\n            default:\n                SSH_LOG(SSH_LOG_WARN, \"Incompatible key algorithm\");\n                return NULL;\n            }\n            err = gcry_sexp_build(&sexp,\n                                  NULL,\n                                  \"(data(flags pkcs1)(hash %s %b))\",\n                                  hash_c,\n                                  hlen,\n                                  hash);\n            if (err) {\n                ssh_signature_free(sig);\n                return NULL;\n            }\n\n            err = gcry_pk_sign(&sig->rsa_sig, sexp, privkey->rsa);\n            gcry_sexp_release(sexp);\n            if (err) {\n                ssh_signature_free(sig);\n                return NULL;\n            }\n            break;\n        case SSH_KEYTYPE_ED25519:\n\t\terr = pki_ed25519_sign(privkey, sig, hash, hlen);\n\t\tif (err != SSH_OK){\n\t\t\tssh_signature_free(sig);\n\t\t\treturn NULL;\n\t\t}\n\t\tbreak;\n        case SSH_KEYTYPE_ECDSA_P256:\n        case SSH_KEYTYPE_ECDSA_P384:\n        case SSH_KEYTYPE_ECDSA_P521:\n#ifdef HAVE_GCRYPT_ECC\n            err = gcry_sexp_build(&sexp,\n                                  NULL,\n                                  \"(data(flags raw)(value %b))\",\n                                  hlen,\n                                  hash);\n            if (err) {\n                ssh_signature_free(sig);\n                return NULL;\n            }\n\n            err = gcry_pk_sign(&sig->ecdsa_sig, sexp, privkey->ecdsa);\n            gcry_sexp_release(sexp);\n            if (err) {\n                ssh_signature_free(sig);\n                return NULL;\n            }\n            break;\n#endif\n        case SSH_KEYTYPE_RSA1:\n        case SSH_KEYTYPE_UNKNOWN:\n        default:\n            ssh_signature_free(sig);\n            return NULL;\n    }\n\n    return sig;\n}\n\n/**\n * @internal\n *\n * @brief Sign the given input data. The digest of to be signed is calculated\n * internally as necessary.\n *\n * @param[in]   privkey     The private key to be used for signing.\n * @param[in]   hash_type   The digest algorithm to be used.\n * @param[in]   input       The data to be signed.\n * @param[in]   input_len   The length of the data to be signed.\n *\n * @return  a newly allocated ssh_signature or NULL on error.\n */\nssh_signature pki_sign_data(const ssh_key privkey,\n                            enum ssh_digest_e hash_type,\n                            const unsigned char *input,\n                            size_t input_len)\n{\n    unsigned char hash[SHA512_DIGEST_LEN] = {0};\n    const unsigned char *sign_input = NULL;\n    uint32_t hlen = 0;\n    int rc;\n\n    if (privkey == NULL || !ssh_key_is_private(privkey) || input == NULL) {\n        SSH_LOG(SSH_LOG_TRACE, \"Bad parameter provided to \"\n                               \"pki_sign_data()\");\n        return NULL;\n    }\n\n    /* Check if public key and hash type are compatible */\n    rc = pki_key_check_hash_compatible(privkey, hash_type);\n    if (rc != SSH_OK) {\n        return NULL;\n    }\n\n    switch (hash_type) {\n    case SSH_DIGEST_SHA256:\n        sha256(input, input_len, hash);\n        hlen = SHA256_DIGEST_LEN;\n        sign_input = hash;\n        break;\n    case SSH_DIGEST_SHA384:\n        sha384(input, input_len, hash);\n        hlen = SHA384_DIGEST_LEN;\n        sign_input = hash;\n        break;\n    case SSH_DIGEST_SHA512:\n        sha512(input, input_len, hash);\n        hlen = SHA512_DIGEST_LEN;\n        sign_input = hash;\n        break;\n    case SSH_DIGEST_SHA1:\n        sha1(input, input_len, hash);\n        hlen = SHA_DIGEST_LEN;\n        sign_input = hash;\n        break;\n    case SSH_DIGEST_AUTO:\n        if (privkey->type == SSH_KEYTYPE_ED25519) {\n            /* SSH_DIGEST_AUTO should only be used with ed25519 */\n            sign_input = input;\n            hlen = input_len;\n            break;\n        }\n        FALL_THROUGH;\n    default:\n        SSH_LOG(SSH_LOG_TRACE, \"Unknown hash algorithm for type: %d\",\n                hash_type);\n        return NULL;\n    }\n\n    return pki_do_sign_hash(privkey, sign_input, hlen, hash_type);\n}\n\n/**\n * @internal\n *\n * @brief Verify the signature of a given input. The digest of the input is\n * calculated internally as necessary.\n *\n * @param[in]   signature   The signature to be verified.\n * @param[in]   pubkey      The public key used to verify the signature.\n * @param[in]   input       The signed data.\n * @param[in]   input_len   The length of the signed data.\n *\n * @return  SSH_OK if the signature is valid; SSH_ERROR otherwise.\n */\nint pki_verify_data_signature(ssh_signature signature,\n                              const ssh_key pubkey,\n                              const unsigned char *input,\n                              size_t input_len)\n{\n    const char *hash_type = NULL;\n    gcry_sexp_t sexp;\n    gcry_error_t err;\n\n    unsigned char ghash[SHA512_DIGEST_LEN + 1] = {0};\n    unsigned char *hash = ghash + 1;\n    uint32_t hlen = 0;\n\n    const unsigned char *verify_input = NULL;\n\n    int rc;\n\n    if (pubkey == NULL || ssh_key_is_private(pubkey) || input == NULL ||\n        signature == NULL)\n    {\n        SSH_LOG(SSH_LOG_TRACE, \"Bad parameter provided to \"\n                               \"pki_verify_data_signature()\");\n        return SSH_ERROR;\n    }\n\n    /* Check if public key and hash type are compatible */\n    rc = pki_key_check_hash_compatible(pubkey, signature->hash_type);\n    if (rc != SSH_OK) {\n        return SSH_ERROR;\n    }\n\n    switch (signature->hash_type) {\n    case SSH_DIGEST_SHA256:\n        sha256(input, input_len, hash);\n        hlen = SHA256_DIGEST_LEN;\n        hash_type = \"sha256\";\n        verify_input = hash;\n        break;\n    case SSH_DIGEST_SHA384:\n        sha384(input, input_len, hash);\n        hlen = SHA384_DIGEST_LEN;\n        hash_type = \"sha384\";\n        verify_input = hash;\n        break;\n    case SSH_DIGEST_SHA512:\n        sha512(input, input_len, hash);\n        hlen = SHA512_DIGEST_LEN;\n        hash_type = \"sha512\";\n        verify_input = hash;\n        break;\n    case SSH_DIGEST_SHA1:\n        sha1(input, input_len, hash);\n        hlen = SHA_DIGEST_LEN;\n        hash_type = \"sha1\";\n        verify_input = hash;\n        break;\n    case SSH_DIGEST_AUTO:\n        if (pubkey->type == SSH_KEYTYPE_ED25519 ||\n            pubkey->type == SSH_KEYTYPE_ED25519_CERT01)\n        {\n            verify_input = input;\n            hlen = input_len;\n            break;\n        }\n        FALL_THROUGH;\n    default:\n        SSH_LOG(SSH_LOG_TRACE, \"Unknown sig->hash_type: %d\", signature->hash_type);\n        return SSH_ERROR;\n    }\n\n    switch(pubkey->type) {\n        case SSH_KEYTYPE_DSS:\n        case SSH_KEYTYPE_DSS_CERT01:\n            /* That is to mark the number as positive */\n            if(hash[0] >= 0x80) {\n                hash = ghash;\n                hlen += 1;\n            }\n\n            err = gcry_sexp_build(&sexp, NULL, \"%b\", hlen, hash);\n            if (err) {\n                SSH_LOG(SSH_LOG_TRACE,\n                        \"DSA hash error: %s\", gcry_strerror(err));\n                return SSH_ERROR;\n            }\n            err = gcry_pk_verify(signature->dsa_sig, sexp, pubkey->dsa);\n            gcry_sexp_release(sexp);\n            if (err) {\n                SSH_LOG(SSH_LOG_TRACE, \"Invalid DSA signature\");\n                if (gcry_err_code(err) != GPG_ERR_BAD_SIGNATURE) {\n                    SSH_LOG(SSH_LOG_TRACE,\n                            \"DSA verify error: %s\",\n                            gcry_strerror(err));\n                }\n                return SSH_ERROR;\n            }\n            break;\n        case SSH_KEYTYPE_RSA:\n        case SSH_KEYTYPE_RSA_CERT01:\n            err = gcry_sexp_build(&sexp,\n                                  NULL,\n                                  \"(data(flags pkcs1)(hash %s %b))\",\n                                  hash_type, hlen, hash);\n            if (err) {\n                SSH_LOG(SSH_LOG_TRACE,\n                              \"RSA hash error: %s\",\n                              gcry_strerror(err));\n                return SSH_ERROR;\n            }\n            err = gcry_pk_verify(signature->rsa_sig, sexp, pubkey->rsa);\n            gcry_sexp_release(sexp);\n            if (err) {\n                SSH_LOG(SSH_LOG_TRACE, \"Invalid RSA signature\");\n                if (gcry_err_code(err) != GPG_ERR_BAD_SIGNATURE) {\n                    SSH_LOG(SSH_LOG_TRACE,\n                            \"RSA verify error: %s\",\n                            gcry_strerror(err));\n                }\n                return SSH_ERROR;\n            }\n            break;\n        case SSH_KEYTYPE_ECDSA_P256:\n        case SSH_KEYTYPE_ECDSA_P384:\n        case SSH_KEYTYPE_ECDSA_P521:\n        case SSH_KEYTYPE_ECDSA_P256_CERT01:\n        case SSH_KEYTYPE_ECDSA_P384_CERT01:\n        case SSH_KEYTYPE_ECDSA_P521_CERT01:\n#ifdef HAVE_GCRYPT_ECC\n            err = gcry_sexp_build(&sexp,\n                                  NULL,\n                                  \"(data(flags raw)(value %b))\",\n                                  hlen,\n                                  hash);\n            if (err) {\n                SSH_LOG(SSH_LOG_TRACE,\n                        \"ECDSA hash error: %s\",\n                        gcry_strerror(err));\n                return SSH_ERROR;\n            }\n            err = gcry_pk_verify(signature->ecdsa_sig, sexp, pubkey->ecdsa);\n            gcry_sexp_release(sexp);\n            if (err) {\n                SSH_LOG(SSH_LOG_TRACE, \"Invalid ECDSA signature\");\n                if (gcry_err_code(err) != GPG_ERR_BAD_SIGNATURE) {\n                    SSH_LOG(SSH_LOG_TRACE,\n                            \"ECDSA verify error: %s\",\n                            gcry_strerror(err));\n                }\n                return SSH_ERROR;\n            }\n            break;\n#endif\n        case SSH_KEYTYPE_ED25519:\n        case SSH_KEYTYPE_ED25519_CERT01:\n            rc = pki_ed25519_verify(pubkey, signature, verify_input, hlen);\n            if (rc != SSH_OK) {\n                SSH_LOG(SSH_LOG_TRACE, \"ED25519 error: Signature invalid\");\n                return SSH_ERROR;\n            }\n            break;\n        case SSH_KEYTYPE_RSA1:\n        case SSH_KEYTYPE_UNKNOWN:\n        default:\n            SSH_LOG(SSH_LOG_TRACE, \"Unknown public key type\");\n            return SSH_ERROR;\n    }\n\n    return SSH_OK;\n}\n\n#endif /* HAVE_LIBGCRYPT */\n"
  },
  {
    "path": "src/libssh/src/pki_mbedcrypto.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2017 Sartura d.o.o.\n *\n * Author: Juraj Vijtiuk <juraj.vijtiuk@sartura.hr>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#ifdef HAVE_LIBMBEDCRYPTO\n#include <mbedtls/pk.h>\n#include <mbedtls/error.h>\n\n#include \"libssh/priv.h\"\n#include \"libssh/pki.h\"\n#include \"libssh/pki_priv.h\"\n#include \"libssh/buffer.h\"\n#include \"libssh/bignum.h\"\n#include \"libssh/misc.h\"\n\n#define MAX_PASSPHRASE_SIZE 1024\n#define MAX_KEY_SIZE 32\n\nssh_string pki_private_key_to_pem(const ssh_key key, const char *passphrase,\n        ssh_auth_callback auth_fn, void *auth_data)\n{\n    (void) key;\n    (void) passphrase;\n    (void) auth_fn;\n    (void) auth_data; return NULL;\n}\n\nstatic int pki_key_ecdsa_to_nid(mbedtls_ecdsa_context *ecdsa)\n{\n    mbedtls_ecp_group_id id;\n\n    id = ecdsa->grp.id;\n    if (id == MBEDTLS_ECP_DP_SECP256R1) {\n        return NID_mbedtls_nistp256;\n    } else if (id == MBEDTLS_ECP_DP_SECP384R1) {\n        return NID_mbedtls_nistp384;\n    } else if (id == MBEDTLS_ECP_DP_SECP521R1) {\n        return NID_mbedtls_nistp521;\n    }\n\n    return -1;\n}\n\nstatic enum ssh_keytypes_e pki_key_ecdsa_to_key_type(mbedtls_ecdsa_context *ecdsa)\n{\n    int nid;\n\n    nid = pki_key_ecdsa_to_nid(ecdsa);\n\n    switch (nid) {\n        case NID_mbedtls_nistp256:\n            return SSH_KEYTYPE_ECDSA_P256;\n        case NID_mbedtls_nistp384:\n            return SSH_KEYTYPE_ECDSA_P384;\n        case NID_mbedtls_nistp521:\n            return SSH_KEYTYPE_ECDSA_P521;\n        default:\n            return SSH_KEYTYPE_UNKNOWN;\n    }\n}\n\nssh_key pki_private_key_from_base64(const char *b64_key, const char *passphrase,\n        ssh_auth_callback auth_fn, void *auth_data)\n{\n    ssh_key key = NULL;\n    mbedtls_pk_context *rsa = NULL;\n    mbedtls_pk_context *ecdsa = NULL;\n    ed25519_privkey *ed25519 = NULL;\n    enum ssh_keytypes_e type;\n    int valid;\n    /* mbedtls pk_parse_key expects strlen to count the 0 byte */\n    size_t b64len = strlen(b64_key) + 1;\n    unsigned char tmp[MAX_PASSPHRASE_SIZE] = {0};\n\n    type = pki_privatekey_type_from_string(b64_key);\n    if (type == SSH_KEYTYPE_UNKNOWN) {\n        SSH_LOG(SSH_LOG_WARN, \"Unknown or invalid private key.\");\n        return NULL;\n    }\n\n    switch (type) {\n        case SSH_KEYTYPE_RSA:\n            rsa = malloc(sizeof(mbedtls_pk_context));\n            if (rsa == NULL) {\n                return NULL;\n            }\n\n            mbedtls_pk_init(rsa);\n\n            if (passphrase == NULL) {\n                if (auth_fn) {\n                    valid = auth_fn(\"Passphrase for private key:\", (char *) tmp,\n                            MAX_PASSPHRASE_SIZE, 0, 0, auth_data);\n                    if (valid < 0) {\n                        goto fail;\n                    }\n                    /* TODO fix signedness and strlen */\n                    valid = mbedtls_pk_parse_key(rsa,\n                            (const unsigned char *) b64_key,\n                            b64len, tmp,\n                            strnlen((const char *) tmp, MAX_PASSPHRASE_SIZE));\n                } else {\n                    valid = mbedtls_pk_parse_key(rsa,\n                            (const unsigned char *) b64_key,\n                            b64len, NULL,\n                            0);\n                }\n            } else {\n                valid = mbedtls_pk_parse_key(rsa,\n                        (const unsigned char *) b64_key, b64len,\n                        (const unsigned char *) passphrase,\n                        strnlen(passphrase, MAX_PASSPHRASE_SIZE));\n            }\n\n            if (valid != 0) {\n                char error_buf[100];\n                mbedtls_strerror(valid, error_buf, 100);\n                SSH_LOG(SSH_LOG_WARN,\"Parsing private key %s\", error_buf);\n                goto fail;\n            }\n            break;\n        case SSH_KEYTYPE_ECDSA_P256:\n        case SSH_KEYTYPE_ECDSA_P384:\n        case SSH_KEYTYPE_ECDSA_P521:\n            ecdsa = malloc(sizeof(mbedtls_pk_context));\n            if (ecdsa == NULL) {\n                return NULL;\n            }\n\n            mbedtls_pk_init(ecdsa);\n\n            if (passphrase == NULL) {\n                if (auth_fn) {\n                    valid = auth_fn(\"Passphrase for private key:\", (char *) tmp,\n                            MAX_PASSPHRASE_SIZE, 0, 0, auth_data);\n                    if (valid < 0) {\n                        goto fail;\n                    }\n                    valid = mbedtls_pk_parse_key(ecdsa,\n                            (const unsigned char *) b64_key,\n                            b64len, tmp,\n                            strnlen((const char *) tmp, MAX_PASSPHRASE_SIZE));\n                } else {\n                    valid = mbedtls_pk_parse_key(ecdsa,\n                            (const unsigned char *) b64_key,\n                            b64len, NULL,\n                            0);\n                }\n            } else {\n                valid = mbedtls_pk_parse_key(ecdsa,\n                        (const unsigned char *) b64_key, b64len,\n                        (const unsigned char *) passphrase,\n                        strnlen(passphrase, MAX_PASSPHRASE_SIZE));\n            }\n\n            if (valid != 0) {\n                char error_buf[100];\n                mbedtls_strerror(valid, error_buf, 100);\n                SSH_LOG(SSH_LOG_WARN,\"Parsing private key %s\", error_buf);\n                goto fail;\n            }\n            break;\n        case SSH_KEYTYPE_ED25519:\n            /* Cannot open ed25519 keys with libmbedcrypto */\n        default:\n            SSH_LOG(SSH_LOG_WARN, \"Unknown or invalid private key type %d\",\n                    type);\n            return NULL;\n    }\n\n    key = ssh_key_new();\n    if (key == NULL) {\n        goto fail;\n    }\n\n    if (ecdsa != NULL) {\n        mbedtls_ecp_keypair *keypair = mbedtls_pk_ec(*ecdsa);\n\n        key->ecdsa = malloc(sizeof(mbedtls_ecdsa_context));\n        if (key->ecdsa == NULL) {\n            goto fail;\n        }\n\n        mbedtls_ecdsa_init(key->ecdsa);\n        mbedtls_ecdsa_from_keypair(key->ecdsa, keypair);\n        mbedtls_pk_free(ecdsa);\n        SAFE_FREE(ecdsa);\n\n        key->ecdsa_nid = pki_key_ecdsa_to_nid(key->ecdsa);\n\n        /* pki_privatekey_type_from_string always returns P256 for ECDSA\n        * keys, so we need to figure out the correct type here */\n        type = pki_key_ecdsa_to_key_type(key->ecdsa);\n        if (type == SSH_KEYTYPE_UNKNOWN) {\n            SSH_LOG(SSH_LOG_WARN, \"Invalid private key.\");\n            goto fail;\n        }\n    } else {\n        key->ecdsa = NULL;\n    }\n\n    key->type = type;\n    key->type_c = ssh_key_type_to_char(type);\n    key->flags = SSH_KEY_FLAG_PRIVATE | SSH_KEY_FLAG_PUBLIC;\n    key->rsa = rsa;\n    key->ed25519_privkey = ed25519;\n    rsa = NULL;\n    ecdsa = NULL;\n\n    return key;\nfail:\n    ssh_key_free(key);\n    if (rsa != NULL) {\n        mbedtls_pk_free(rsa);\n        SAFE_FREE(rsa);\n    }\n    if (ecdsa != NULL) {\n        mbedtls_pk_free(ecdsa);\n        SAFE_FREE(ecdsa);\n    }\n    return NULL;\n}\n\nint pki_privkey_build_rsa(ssh_key key,\n                          ssh_string n,\n                          ssh_string e,\n                          ssh_string d,\n                          UNUSED_PARAM(ssh_string iqmp),\n                          ssh_string p,\n                          ssh_string q)\n{\n    mbedtls_rsa_context *rsa = NULL;\n    const mbedtls_pk_info_t *pk_info = NULL;\n    int rc;\n\n    key->rsa = malloc(sizeof(mbedtls_pk_context));\n    if (key->rsa == NULL) {\n        return SSH_ERROR;\n    }\n\n    mbedtls_pk_init(key->rsa);\n    pk_info = mbedtls_pk_info_from_type(MBEDTLS_PK_RSA);\n    mbedtls_pk_setup(key->rsa, pk_info);\n\n    rc = mbedtls_pk_can_do(key->rsa, MBEDTLS_PK_RSA);\n    if (rc == 0) {\n        goto fail;\n    }\n\n    rsa = mbedtls_pk_rsa(*key->rsa);\n    rc = mbedtls_rsa_import_raw(rsa,\n                                ssh_string_data(n), ssh_string_len(n),\n                                ssh_string_data(p), ssh_string_len(p),\n                                ssh_string_data(q), ssh_string_len(q),\n                                ssh_string_data(d), ssh_string_len(d),\n                                ssh_string_data(e), ssh_string_len(e));\n    if (rc != 0) {\n        SSH_LOG(SSH_LOG_WARN, \"Failed to import private RSA key\");\n        goto fail;\n    }\n\n    rc = mbedtls_rsa_complete(rsa);\n    if (rc != 0) {\n        SSH_LOG(SSH_LOG_WARN, \"Failed to complete private RSA key\");\n        goto fail;\n    }\n\n    rc = mbedtls_rsa_check_privkey(rsa);\n    if (rc != 0) {\n        SSH_LOG(SSH_LOG_WARN, \"Inconsistent private RSA key\");\n        goto fail;\n    }\n\n    return SSH_OK;\n\nfail:\n    mbedtls_pk_free(key->rsa);\n    SAFE_FREE(key->rsa);\n    return SSH_ERROR;\n}\n\nint pki_pubkey_build_rsa(ssh_key key, ssh_string e, ssh_string n)\n{\n    mbedtls_rsa_context *rsa = NULL;\n    const mbedtls_pk_info_t *pk_info = NULL;\n    int rc;\n\n    key->rsa = malloc(sizeof(mbedtls_pk_context));\n    if (key->rsa == NULL) {\n        return SSH_ERROR;\n    }\n\n    mbedtls_pk_init(key->rsa);\n    pk_info = mbedtls_pk_info_from_type(MBEDTLS_PK_RSA);\n    mbedtls_pk_setup(key->rsa, pk_info);\n\n    rc = mbedtls_pk_can_do(key->rsa, MBEDTLS_PK_RSA);\n    if (rc == 0) {\n        goto fail;\n    }\n\n    rsa = mbedtls_pk_rsa(*key->rsa);\n    rc = mbedtls_mpi_read_binary(&rsa->N, ssh_string_data(n),\n                                 ssh_string_len(n));\n    if (rc != 0) {\n        goto fail;\n    }\n    rc = mbedtls_mpi_read_binary(&rsa->E, ssh_string_data(e),\n                                 ssh_string_len(e));\n    if (rc != 0) {\n        goto fail;\n    }\n\n    rsa->len = (mbedtls_mpi_bitlen(&rsa->N) + 7) >> 3;\n\n    return SSH_OK;\n\nfail:\n    mbedtls_pk_free(key->rsa);\n    SAFE_FREE(key->rsa);\n    return SSH_ERROR;\n}\n\nssh_key pki_key_dup(const ssh_key key, int demote)\n{\n    ssh_key new = NULL;\n    int rc;\n    const mbedtls_pk_info_t *pk_info = NULL;\n\n\n    new = ssh_key_new();\n    if (new == NULL) {\n        return NULL;\n    }\n\n    new->type = key->type;\n    new->type_c = key->type_c;\n    if (demote) {\n        new->flags = SSH_KEY_FLAG_PUBLIC;\n    } else {\n        new->flags = key->flags;\n    }\n\n\n    switch(key->type) {\n        case SSH_KEYTYPE_RSA: {\n            mbedtls_rsa_context *rsa, *new_rsa;\n\n            new->rsa = malloc(sizeof(mbedtls_pk_context));\n            if (new->rsa == NULL) {\n                goto fail;\n            }\n\n            mbedtls_pk_init(new->rsa);\n            pk_info = mbedtls_pk_info_from_type(MBEDTLS_PK_RSA);\n            mbedtls_pk_setup(new->rsa, pk_info);\n\n            if (mbedtls_pk_can_do(key->rsa, MBEDTLS_PK_RSA) &&\n                        mbedtls_pk_can_do(new->rsa, MBEDTLS_PK_RSA)) {\n                rsa = mbedtls_pk_rsa(*key->rsa);\n                new_rsa = mbedtls_pk_rsa(*new->rsa);\n\n                rc = mbedtls_mpi_copy(&new_rsa->N, &rsa->N);\n                if (rc != 0) {\n                    goto fail;\n                }\n\n                rc = mbedtls_mpi_copy(&new_rsa->E, &rsa->E);\n                if (rc != 0) {\n                    goto fail;\n                }\n                new_rsa->len = (mbedtls_mpi_bitlen(&new_rsa->N) + 7) >> 3;\n\n                if (!demote && (key->flags & SSH_KEY_FLAG_PRIVATE)) {\n                    rc = mbedtls_mpi_copy(&new_rsa->D, &rsa->D);\n                    if (rc != 0) {\n                        goto fail;\n                    }\n\n                    rc = mbedtls_mpi_copy(&new_rsa->P, &rsa->P);\n                    if (rc != 0) {\n                        goto fail;\n                    }\n\n                    rc = mbedtls_mpi_copy(&new_rsa->Q, &rsa->Q);\n                    if (rc != 0) {\n                        goto fail;\n                    }\n\n                    rc = mbedtls_mpi_copy(&new_rsa->DP, &rsa->DP);\n                    if (rc != 0) {\n                        goto fail;\n                    }\n\n                    rc = mbedtls_mpi_copy(&new_rsa->DQ, &rsa->DQ);\n                    if (rc != 0) {\n                        goto fail;\n                    }\n\n                    rc = mbedtls_mpi_copy(&new_rsa->QP, &rsa->QP);\n                    if (rc != 0) {\n                        goto fail;\n                    }\n                }\n            } else {\n                goto fail;\n            }\n\n            break;\n        }\n        case SSH_KEYTYPE_ECDSA_P256:\n        case SSH_KEYTYPE_ECDSA_P384:\n        case SSH_KEYTYPE_ECDSA_P521:\n            new->ecdsa_nid = key->ecdsa_nid;\n\n            new->ecdsa = malloc(sizeof(mbedtls_ecdsa_context));\n\n            if (new->ecdsa == NULL) {\n                goto fail;\n            }\n\n            mbedtls_ecdsa_init(new->ecdsa);\n\n            if (demote && ssh_key_is_private(key)) {\n                rc = mbedtls_ecp_copy(&new->ecdsa->Q, &key->ecdsa->Q);\n                if (rc != 0) {\n                    goto fail;\n                }\n\n                rc = mbedtls_ecp_group_copy(&new->ecdsa->grp, &key->ecdsa->grp);\n                if (rc != 0) {\n                    goto fail;\n                }\n            } else {\n                mbedtls_ecdsa_from_keypair(new->ecdsa, key->ecdsa);\n            }\n\n            break;\n        case SSH_KEYTYPE_ED25519:\n            rc = pki_ed25519_key_dup(new, key);\n            if (rc != SSH_OK) {\n                goto fail;\n            }\n            break;\n        default:\n            goto fail;\n    }\n\n    return new;\nfail:\n    ssh_key_free(new);\n    return NULL;\n}\n\nint pki_key_generate_rsa(ssh_key key, int parameter)\n{\n    int rc;\n    const mbedtls_pk_info_t *info = NULL;\n\n    key->rsa = malloc(sizeof(mbedtls_pk_context));\n    if (key->rsa == NULL) {\n        return SSH_ERROR;\n    }\n\n    mbedtls_pk_init(key->rsa);\n\n    info = mbedtls_pk_info_from_type(MBEDTLS_PK_RSA);\n    rc = mbedtls_pk_setup(key->rsa, info);\n    if (rc != 0) {\n        return SSH_ERROR;\n    }\n\n    if (mbedtls_pk_can_do(key->rsa, MBEDTLS_PK_RSA)) {\n        rc = mbedtls_rsa_gen_key(mbedtls_pk_rsa(*key->rsa),\n                                 mbedtls_ctr_drbg_random,\n                                 ssh_get_mbedtls_ctr_drbg_context(),\n                                 parameter,\n                                 65537);\n        if (rc != 0) {\n            mbedtls_pk_free(key->rsa);\n            return SSH_ERROR;\n        }\n    }\n\n    return SSH_OK;\n}\n\nint pki_key_compare(const ssh_key k1, const ssh_key k2, enum ssh_keycmp_e what)\n{\n    switch (k1->type) {\n        case SSH_KEYTYPE_RSA: {\n            mbedtls_rsa_context *rsa1, *rsa2;\n            if (mbedtls_pk_can_do(k1->rsa, MBEDTLS_PK_RSA) &&\n                    mbedtls_pk_can_do(k2->rsa, MBEDTLS_PK_RSA)) {\n                if (mbedtls_pk_get_type(k1->rsa) != mbedtls_pk_get_type(k2->rsa) ||\n                        mbedtls_pk_get_bitlen(k1->rsa) !=\n                        mbedtls_pk_get_bitlen(k2->rsa)) {\n                    return 1;\n                }\n\n                rsa1 = mbedtls_pk_rsa(*k1->rsa);\n                rsa2 = mbedtls_pk_rsa(*k2->rsa);\n                if (mbedtls_mpi_cmp_mpi(&rsa1->N, &rsa2->N) != 0) {\n                    return 1;\n                }\n\n                if (mbedtls_mpi_cmp_mpi(&rsa1->E, &rsa2->E) != 0) {\n                    return 1;\n                }\n\n                if (what == SSH_KEY_CMP_PRIVATE) {\n                    if (mbedtls_mpi_cmp_mpi(&rsa1->P, &rsa2->P) != 0) {\n                        return 1;\n                    }\n\n                    if (mbedtls_mpi_cmp_mpi(&rsa1->Q, &rsa2->Q) != 0) {\n                        return 1;\n                    }\n                }\n            }\n            break;\n        }\n        case SSH_KEYTYPE_ECDSA_P256:\n        case SSH_KEYTYPE_ECDSA_P384:\n        case SSH_KEYTYPE_ECDSA_P521: {\n            mbedtls_ecp_keypair *ecdsa1 = k1->ecdsa;\n            mbedtls_ecp_keypair *ecdsa2 = k2->ecdsa;\n\n            if (ecdsa1->grp.id != ecdsa2->grp.id) {\n                return 1;\n            }\n\n            if (mbedtls_mpi_cmp_mpi(&ecdsa1->Q.X, &ecdsa2->Q.X)) {\n                return 1;\n            }\n\n            if (mbedtls_mpi_cmp_mpi(&ecdsa1->Q.Y, &ecdsa2->Q.Y)) {\n                return 1;\n            }\n\n            if (mbedtls_mpi_cmp_mpi(&ecdsa1->Q.Z, &ecdsa2->Q.Z)) {\n                return 1;\n            }\n\n            if (what == SSH_KEY_CMP_PRIVATE) {\n                if (mbedtls_mpi_cmp_mpi(&ecdsa1->d, &ecdsa2->d)) {\n                    return 1;\n                }\n            }\n\n            break;\n        }\n        case SSH_KEYTYPE_ED25519:\n            /* ed25519 keys handled globally */\n            return 0;\n        default:\n            return 1;\n    }\n\n    return 0;\n}\n\nssh_string make_ecpoint_string(const mbedtls_ecp_group *g, const\n        mbedtls_ecp_point *p)\n{\n    ssh_string s = NULL;\n    size_t len = 1;\n    int rc;\n\n    s = ssh_string_new(len);\n    if (s == NULL) {\n        return NULL;\n    }\n\n    rc = mbedtls_ecp_point_write_binary(g, p, MBEDTLS_ECP_PF_UNCOMPRESSED,\n                &len, ssh_string_data(s), ssh_string_len(s));\n    if (rc == MBEDTLS_ERR_ECP_BUFFER_TOO_SMALL) {\n        SSH_STRING_FREE(s);\n\n        s = ssh_string_new(len);\n        if (s == NULL) {\n            return NULL;\n        }\n\n        rc = mbedtls_ecp_point_write_binary(g, p, MBEDTLS_ECP_PF_UNCOMPRESSED,\n                &len, ssh_string_data(s), ssh_string_len(s));\n    }\n\n    if (rc != 0) {\n        SSH_STRING_FREE(s);\n        return NULL;\n    }\n\n    if (len != ssh_string_len(s)) {\n        SSH_STRING_FREE(s);\n        return NULL;\n    }\n\n    return s;\n}\n\nstatic const char* pki_key_ecdsa_nid_to_char(int nid)\n{\n    switch (nid) {\n        case NID_mbedtls_nistp256:\n            return \"nistp256\";\n        case NID_mbedtls_nistp384:\n            return \"nistp384\";\n        case NID_mbedtls_nistp521:\n            return \"nistp521\";\n        default:\n            break;\n    }\n\n    return \"unknown\";\n}\n\nssh_string pki_publickey_to_blob(const ssh_key key)\n{\n    ssh_buffer buffer = NULL;\n    ssh_string type_s = NULL;\n    ssh_string e = NULL;\n    ssh_string n = NULL;\n    ssh_string str = NULL;\n    int rc;\n\n    buffer = ssh_buffer_new();\n    if (buffer == NULL) {\n        return NULL;\n    }\n\n    if (key->cert != NULL) {\n        rc = ssh_buffer_add_buffer(buffer, key->cert);\n        if (rc < 0) {\n            SSH_BUFFER_FREE(buffer);\n            return NULL;\n        }\n\n        goto makestring;\n    }\n\n    type_s = ssh_string_from_char(key->type_c);\n    if (type_s == NULL) {\n        SSH_BUFFER_FREE(buffer);\n        return NULL;\n    }\n\n    rc = ssh_buffer_add_ssh_string(buffer, type_s);\n    SSH_STRING_FREE(type_s);\n    if (rc < 0) {\n        SSH_BUFFER_FREE(buffer);\n        return NULL;\n    }\n\n    switch (key->type) {\n        case SSH_KEYTYPE_RSA: {\n            mbedtls_rsa_context *rsa;\n            if (mbedtls_pk_can_do(key->rsa, MBEDTLS_PK_RSA) == 0) {\n                SSH_BUFFER_FREE(buffer);\n                return NULL;\n            }\n\n            rsa = mbedtls_pk_rsa(*key->rsa);\n\n            e = ssh_make_bignum_string(&rsa->E);\n            if (e == NULL) {\n                goto fail;\n            }\n\n            n = ssh_make_bignum_string(&rsa->N);\n            if (n == NULL) {\n                goto fail;\n            }\n\n            if (ssh_buffer_add_ssh_string(buffer, e) < 0) {\n                goto fail;\n            }\n\n            if (ssh_buffer_add_ssh_string(buffer, n) < 0) {\n                goto fail;\n            }\n\n            ssh_string_burn(e);\n            SSH_STRING_FREE(e);\n            e = NULL;\n            ssh_string_burn(n);\n            SSH_STRING_FREE(n);\n            n = NULL;\n\n            break;\n        }\n        case SSH_KEYTYPE_ECDSA_P256:\n        case SSH_KEYTYPE_ECDSA_P384:\n        case SSH_KEYTYPE_ECDSA_P521:\n            type_s =\n                ssh_string_from_char(pki_key_ecdsa_nid_to_char(key->ecdsa_nid));\n            if (type_s == NULL) {\n                SSH_BUFFER_FREE(buffer);\n                return NULL;\n            }\n\n            rc = ssh_buffer_add_ssh_string(buffer, type_s);\n            SSH_STRING_FREE(type_s);\n            if (rc < 0) {\n                SSH_BUFFER_FREE(buffer);\n                return NULL;\n            }\n\n            e = make_ecpoint_string(&key->ecdsa->grp, &key->ecdsa->Q);\n\n            if (e == NULL) {\n                SSH_BUFFER_FREE(buffer);\n                return NULL;\n            }\n\n            rc = ssh_buffer_add_ssh_string(buffer, e);\n            if (rc < 0) {\n                goto fail;\n            }\n\n            ssh_string_burn(e);\n            SSH_STRING_FREE(e);\n            e = NULL;\n\n            break;\n        case SSH_KEYTYPE_ED25519:\n            rc = pki_ed25519_public_key_to_blob(buffer, key);\n            if (rc != SSH_OK) {\n                goto fail;\n            }\n            break;\n        default:\n            goto fail;\n    }\nmakestring:\n    str = ssh_string_new(ssh_buffer_get_len(buffer));\n    if (str == NULL) {\n        goto fail;\n    }\n\n    rc = ssh_string_fill(str, ssh_buffer_get(buffer),\n            ssh_buffer_get_len(buffer));\n    if (rc < 0) {\n        goto fail;\n    }\n\n    SSH_BUFFER_FREE(buffer);\n    return str;\nfail:\n    SSH_BUFFER_FREE(buffer);\n    ssh_string_burn(str);\n    SSH_STRING_FREE(str);\n    ssh_string_burn(e);\n    SSH_STRING_FREE(e);\n    ssh_string_burn(n);\n    SSH_STRING_FREE(n);\n\n    return NULL;\n}\n\nssh_string pki_signature_to_blob(const ssh_signature sig)\n{\n    ssh_string sig_blob = NULL;\n\n    switch(sig->type) {\n        case SSH_KEYTYPE_RSA:\n            sig_blob = ssh_string_copy(sig->rsa_sig);\n            break;\n        case SSH_KEYTYPE_ECDSA_P256:\n        case SSH_KEYTYPE_ECDSA_P384:\n        case SSH_KEYTYPE_ECDSA_P521: {\n            ssh_string r;\n            ssh_string s;\n            ssh_buffer b;\n            int rc;\n\n            b = ssh_buffer_new();\n            if (b == NULL) {\n                return NULL;\n            }\n\n            r = ssh_make_bignum_string(sig->ecdsa_sig.r);\n            if (r == NULL) {\n                SSH_BUFFER_FREE(b);\n                return NULL;\n            }\n\n            rc = ssh_buffer_add_ssh_string(b, r);\n            SSH_STRING_FREE(r);\n            if (rc < 0) {\n                SSH_BUFFER_FREE(b);\n                return NULL;\n            }\n\n            s = ssh_make_bignum_string(sig->ecdsa_sig.s);\n            if (s == NULL) {\n                SSH_BUFFER_FREE(b);\n                return NULL;\n            }\n\n            rc = ssh_buffer_add_ssh_string(b, s);\n            SSH_STRING_FREE(s);\n            if (rc < 0) {\n                SSH_BUFFER_FREE(b);\n                return NULL;\n            }\n\n            sig_blob = ssh_string_new(ssh_buffer_get_len(b));\n            if (sig_blob == NULL) {\n                SSH_BUFFER_FREE(b);\n                return NULL;\n            }\n\n            ssh_string_fill(sig_blob, ssh_buffer_get(b), ssh_buffer_get_len(b));\n            SSH_BUFFER_FREE(b);\n            break;\n        }\n        case SSH_KEYTYPE_ED25519:\n            sig_blob = pki_ed25519_signature_to_blob(sig);\n            break;\n        default:\n            SSH_LOG(SSH_LOG_WARN, \"Unknown signature key type: %s\",\n                    sig->type_c);\n            return NULL;\n    }\n\n    return sig_blob;\n}\n\nstatic ssh_signature pki_signature_from_rsa_blob(const ssh_key pubkey, const\n        ssh_string sig_blob, ssh_signature sig)\n{\n    size_t pad_len = 0;\n    char *blob_orig = NULL;\n    char *blob_padded_data = NULL;\n    ssh_string sig_blob_padded = NULL;\n\n    size_t rsalen = 0;\n    size_t len = ssh_string_len(sig_blob);\n\n    if (pubkey->rsa == NULL) {\n        SSH_LOG(SSH_LOG_WARN, \"Pubkey RSA field NULL\");\n        goto errout;\n    }\n\n    rsalen = mbedtls_pk_get_bitlen(pubkey->rsa) / 8;\n    if (len > rsalen) {\n        SSH_LOG(SSH_LOG_WARN,\n                \"Signature is too big: %lu > %lu\",\n                (unsigned long) len,\n                (unsigned long) rsalen);\n        goto errout;\n    }\n#ifdef DEBUG_CRYPTO\n    SSH_LOG(SSH_LOG_WARN, \"RSA signature len: %lu\", (unsigned long)len);\n    ssh_log_hexdump(\"RSA signature\", ssh_string_data(sig_blob), len);\n#endif\n\n    if (len == rsalen) {\n        sig->rsa_sig = ssh_string_copy(sig_blob);\n    } else {\n        SSH_LOG(SSH_LOG_DEBUG, \"RSA signature len %lu < %lu\",\n                (unsigned long) len,\n                (unsigned long) rsalen);\n        pad_len = rsalen - len;\n\n        sig_blob_padded = ssh_string_new(rsalen);\n        if (sig_blob_padded == NULL) {\n            goto errout;\n        }\n\n        blob_padded_data = (char *) ssh_string_data(sig_blob_padded);\n        blob_orig = (char *) ssh_string_data(sig_blob);\n\n        explicit_bzero(blob_padded_data, pad_len);\n        memcpy(blob_padded_data + pad_len, blob_orig, len);\n\n        sig->rsa_sig = sig_blob_padded;\n    }\n\n    return sig;\n\nerrout:\n    ssh_signature_free(sig);\n    return NULL;\n}\nssh_signature pki_signature_from_blob(const ssh_key pubkey,\n                                      const ssh_string sig_blob,\n                                      enum ssh_keytypes_e type,\n                                      enum ssh_digest_e hash_type)\n{\n    ssh_signature sig = NULL;\n    int rc;\n\n    if (ssh_key_type_plain(pubkey->type) != type) {\n        SSH_LOG(SSH_LOG_WARN,\n                \"Incompatible public key provided (%d) expecting (%d)\",\n                type,\n                pubkey->type);\n        return NULL;\n    }\n\n    sig = ssh_signature_new();\n    if (sig == NULL) {\n        return NULL;\n    }\n\n    sig->type = type;\n    sig->type_c = ssh_key_signature_to_char(type, hash_type);\n    sig->hash_type = hash_type;\n\n    switch(type) {\n        case SSH_KEYTYPE_RSA:\n            sig = pki_signature_from_rsa_blob(pubkey, sig_blob, sig);\n            if (sig == NULL) {\n                return NULL;\n            }\n            break;\n        case SSH_KEYTYPE_ECDSA_P256:\n        case SSH_KEYTYPE_ECDSA_P384:\n        case SSH_KEYTYPE_ECDSA_P521: {\n            ssh_buffer b;\n            ssh_string r;\n            ssh_string s;\n            size_t rlen;\n\n            b = ssh_buffer_new();\n            if (b == NULL) {\n                ssh_signature_free(sig);\n                return NULL;\n            }\n\n            rc = ssh_buffer_add_data(b, ssh_string_data(sig_blob),\n                    ssh_string_len(sig_blob));\n\n            if (rc < 0) {\n                SSH_BUFFER_FREE(b);\n                ssh_signature_free(sig);\n                return NULL;\n            }\n\n            r = ssh_buffer_get_ssh_string(b);\n            if (r == NULL) {\n                SSH_BUFFER_FREE(b);\n                ssh_signature_free(sig);\n                return NULL;\n            }\n#ifdef DEBUG_CRYPTO\n            ssh_log_hexdump(\"r\", ssh_string_data(r), ssh_string_len(r));\n#endif\n            sig->ecdsa_sig.r = ssh_make_string_bn(r);\n            ssh_string_burn(r);\n            SSH_STRING_FREE(r);\n            if (sig->ecdsa_sig.r == NULL) {\n                SSH_BUFFER_FREE(b);\n                ssh_signature_free(sig);\n                return NULL;\n            }\n\n            s = ssh_buffer_get_ssh_string(b);\n            rlen = ssh_buffer_get_len(b);\n            SSH_BUFFER_FREE(b);\n            if (s == NULL) {\n                ssh_signature_free(sig);\n                return NULL;\n            }\n\n#ifdef DEBUG_CRYPTO\n            ssh_log_hexdump(\"s\", ssh_string_data(s), ssh_string_len(s));\n#endif\n            sig->ecdsa_sig.s = ssh_make_string_bn(s);\n            ssh_string_burn(s);\n            SSH_STRING_FREE(s);\n            if (sig->ecdsa_sig.s == NULL) {\n                ssh_signature_free(sig);\n                return NULL;\n            }\n\n            if (rlen != 0) {\n                SSH_LOG(SSH_LOG_WARN, \"Signature has remaining bytes in inner \"\n                        \"sigblob: %lu\",\n                        (unsigned long)rlen);\n                ssh_signature_free(sig);\n                return NULL;\n            }\n\n            break;\n        }\n        case SSH_KEYTYPE_ED25519:\n            rc = pki_signature_from_ed25519_blob(sig, sig_blob);\n            if (rc == SSH_ERROR) {\n                ssh_signature_free(sig);\n                return NULL;\n            }\n            break;\n        default:\n            SSH_LOG(SSH_LOG_WARN, \"Unknown signature type\");\n            return NULL;\n    }\n\n    return sig;\n}\n\nstatic ssh_string rsa_do_sign_hash(const unsigned char *digest,\n                                   int dlen,\n                                   mbedtls_pk_context *privkey,\n                                   enum ssh_digest_e hash_type)\n{\n    ssh_string sig_blob = NULL;\n    mbedtls_md_type_t md = 0;\n    unsigned char *sig = NULL;\n    size_t slen;\n    int ok;\n\n    switch (hash_type) {\n    case SSH_DIGEST_SHA1:\n        md = MBEDTLS_MD_SHA1;\n        break;\n    case SSH_DIGEST_SHA256:\n        md = MBEDTLS_MD_SHA256;\n        break;\n    case SSH_DIGEST_SHA512:\n        md = MBEDTLS_MD_SHA512;\n        break;\n    case SSH_DIGEST_AUTO:\n    default:\n        SSH_LOG(SSH_LOG_WARN, \"Incompatible key algorithm\");\n        return NULL;\n    }\n\n    sig = malloc(mbedtls_pk_get_bitlen(privkey) / 8);\n    if (sig == NULL) {\n        return NULL;\n    }\n\n    ok = mbedtls_pk_sign(privkey,\n                         md,\n                         digest,\n                         dlen,\n                         sig,\n                         &slen,\n                         mbedtls_ctr_drbg_random,\n                         ssh_get_mbedtls_ctr_drbg_context());\n\n    if (ok != 0) {\n        SAFE_FREE(sig);\n        return NULL;\n    }\n\n    sig_blob = ssh_string_new(slen);\n    if (sig_blob == NULL) {\n        SAFE_FREE(sig);\n        return NULL;\n    }\n\n    ssh_string_fill(sig_blob, sig, slen);\n    explicit_bzero(sig, slen);\n    SAFE_FREE(sig);\n\n    return sig_blob;\n}\n\n\nssh_signature pki_do_sign_hash(const ssh_key privkey,\n                               const unsigned char *hash,\n                               size_t hlen,\n                               enum ssh_digest_e hash_type)\n{\n    ssh_signature sig = NULL;\n    int rc;\n\n    sig = ssh_signature_new();\n    if (sig == NULL) {\n        return NULL;\n    }\n\n    sig->type = privkey->type;\n    sig->type_c = ssh_key_signature_to_char(privkey->type, hash_type);\n    sig->hash_type = hash_type;\n\n    switch(privkey->type) {\n        case SSH_KEYTYPE_RSA:\n            sig->rsa_sig = rsa_do_sign_hash(hash, hlen, privkey->rsa, hash_type);\n            if (sig->rsa_sig == NULL) {\n                ssh_signature_free(sig);\n                return NULL;\n            }\n            break;\n        case SSH_KEYTYPE_ECDSA_P256:\n        case SSH_KEYTYPE_ECDSA_P384:\n        case SSH_KEYTYPE_ECDSA_P521:\n            sig->ecdsa_sig.r = bignum_new();\n            if (sig->ecdsa_sig.r == NULL) {\n                return NULL;\n            }\n\n            sig->ecdsa_sig.s = bignum_new();\n            if (sig->ecdsa_sig.s == NULL) {\n                bignum_safe_free(sig->ecdsa_sig.r);\n                return NULL;\n            }\n\n            rc = mbedtls_ecdsa_sign(&privkey->ecdsa->grp,\n                                    sig->ecdsa_sig.r,\n                                    sig->ecdsa_sig.s,\n                                    &privkey->ecdsa->d,\n                                    hash,\n                                    hlen,\n                                    mbedtls_ctr_drbg_random,\n                                    ssh_get_mbedtls_ctr_drbg_context());\n            if (rc != 0) {\n                ssh_signature_free(sig);\n                return NULL;\n            }\n            break;\n        case SSH_KEYTYPE_ED25519:\n            rc = pki_ed25519_sign(privkey, sig, hash, hlen);\n            if (rc != SSH_OK) {\n                ssh_signature_free(sig);\n                return NULL;\n            }\n            break;\n        default:\n            ssh_signature_free(sig);\n            return NULL;\n\n    }\n\n    return sig;\n}\n\n/**\n * @internal\n *\n * @brief Sign the given input data. The digest of to be signed is calculated\n * internally as necessary.\n *\n * @param[in]   privkey     The private key to be used for signing.\n * @param[in]   hash_type   The digest algorithm to be used.\n * @param[in]   input       The data to be signed.\n * @param[in]   input_len   The length of the data to be signed.\n *\n * @return  a newly allocated ssh_signature or NULL on error.\n */\nssh_signature pki_sign_data(const ssh_key privkey,\n                            enum ssh_digest_e hash_type,\n                            const unsigned char *input,\n                            size_t input_len)\n{\n    unsigned char hash[SHA512_DIGEST_LEN] = {0};\n    const unsigned char *sign_input = NULL;\n    uint32_t hlen = 0;\n    int rc;\n\n    if (privkey == NULL || !ssh_key_is_private(privkey) || input == NULL) {\n        SSH_LOG(SSH_LOG_TRACE, \"Bad parameter provided to \"\n                               \"pki_sign_data()\");\n        return NULL;\n    }\n\n    /* Check if public key and hash type are compatible */\n    rc = pki_key_check_hash_compatible(privkey, hash_type);\n    if (rc != SSH_OK) {\n        return NULL;\n    }\n\n    switch (hash_type) {\n    case SSH_DIGEST_SHA256:\n        sha256(input, input_len, hash);\n        hlen = SHA256_DIGEST_LEN;\n        sign_input = hash;\n        break;\n    case SSH_DIGEST_SHA384:\n        sha384(input, input_len, hash);\n        hlen = SHA384_DIGEST_LEN;\n        sign_input = hash;\n        break;\n    case SSH_DIGEST_SHA512:\n        sha512(input, input_len, hash);\n        hlen = SHA512_DIGEST_LEN;\n        sign_input = hash;\n        break;\n    case SSH_DIGEST_SHA1:\n        sha1(input, input_len, hash);\n        hlen = SHA_DIGEST_LEN;\n        sign_input = hash;\n        break;\n    case SSH_DIGEST_AUTO:\n        if (privkey->type == SSH_KEYTYPE_ED25519) {\n            /* SSH_DIGEST_AUTO should only be used with ed25519 */\n            sign_input = input;\n            hlen = input_len;\n            break;\n        }\n        FALL_THROUGH;\n    default:\n        SSH_LOG(SSH_LOG_TRACE, \"Unknown hash algorithm for type: %d\",\n                hash_type);\n        return NULL;\n    }\n\n    return pki_do_sign_hash(privkey, sign_input, hlen, hash_type);\n}\n\n/**\n * @internal\n *\n * @brief Verify the signature of a given input. The digest of the input is\n * calculated internally as necessary.\n *\n * @param[in]   signature   The signature to be verified.\n * @param[in]   pubkey      The public key used to verify the signature.\n * @param[in]   input       The signed data.\n * @param[in]   input_len   The length of the signed data.\n *\n * @return  SSH_OK if the signature is valid; SSH_ERROR otherwise.\n */\nint pki_verify_data_signature(ssh_signature signature,\n                              const ssh_key pubkey,\n                              const unsigned char *input,\n                              size_t input_len)\n{\n\n    unsigned char hash[SHA512_DIGEST_LEN] = {0};\n    const unsigned char *verify_input = NULL;\n    uint32_t hlen = 0;\n\n    mbedtls_md_type_t md = 0;\n\n    int rc;\n\n    if (pubkey == NULL || ssh_key_is_private(pubkey) || input == NULL ||\n        signature == NULL)\n    {\n        SSH_LOG(SSH_LOG_TRACE, \"Bad parameter provided to \"\n                               \"pki_verify_data_signature()\");\n        return SSH_ERROR;\n    }\n\n    /* Check if public key and hash type are compatible */\n    rc = pki_key_check_hash_compatible(pubkey, signature->hash_type);\n    if (rc != SSH_OK) {\n        return SSH_ERROR;\n    }\n\n    switch (signature->hash_type) {\n    case SSH_DIGEST_SHA256:\n        sha256(input, input_len, hash);\n        hlen = SHA256_DIGEST_LEN;\n        md = MBEDTLS_MD_SHA256;\n        verify_input = hash;\n        break;\n    case SSH_DIGEST_SHA384:\n        sha384(input, input_len, hash);\n        hlen = SHA384_DIGEST_LEN;\n        md = MBEDTLS_MD_SHA384;\n        verify_input = hash;\n        break;\n    case SSH_DIGEST_SHA512:\n        sha512(input, input_len, hash);\n        hlen = SHA512_DIGEST_LEN;\n        md = MBEDTLS_MD_SHA512;\n        verify_input = hash;\n        break;\n    case SSH_DIGEST_SHA1:\n        sha1(input, input_len, hash);\n        hlen = SHA_DIGEST_LEN;\n        md = MBEDTLS_MD_SHA1;\n        verify_input = hash;\n        break;\n    case SSH_DIGEST_AUTO:\n        if (pubkey->type == SSH_KEYTYPE_ED25519 ||\n            pubkey->type == SSH_KEYTYPE_ED25519_CERT01)\n        {\n            verify_input = input;\n            hlen = input_len;\n            break;\n        }\n        FALL_THROUGH;\n    default:\n        SSH_LOG(SSH_LOG_TRACE, \"Unknown sig->hash_type: %d\",\n                signature->hash_type);\n        return SSH_ERROR;\n    }\n\n    switch (pubkey->type) {\n        case SSH_KEYTYPE_RSA:\n        case SSH_KEYTYPE_RSA_CERT01:\n            rc = mbedtls_pk_verify(pubkey->rsa, md, hash, hlen,\n                    ssh_string_data(signature->rsa_sig),\n                    ssh_string_len(signature->rsa_sig));\n            if (rc != 0) {\n                char error_buf[100];\n                mbedtls_strerror(rc, error_buf, 100);\n                SSH_LOG(SSH_LOG_TRACE, \"RSA error: %s\", error_buf);\n                return SSH_ERROR;\n            }\n            break;\n        case SSH_KEYTYPE_ECDSA_P256:\n        case SSH_KEYTYPE_ECDSA_P384:\n        case SSH_KEYTYPE_ECDSA_P521:\n        case SSH_KEYTYPE_ECDSA_P256_CERT01:\n        case SSH_KEYTYPE_ECDSA_P384_CERT01:\n        case SSH_KEYTYPE_ECDSA_P521_CERT01:\n            rc = mbedtls_ecdsa_verify(&pubkey->ecdsa->grp, hash, hlen,\n                    &pubkey->ecdsa->Q, signature->ecdsa_sig.r,\n                    signature->ecdsa_sig.s);\n            if (rc != 0) {\n                char error_buf[100];\n                mbedtls_strerror(rc, error_buf, 100);\n                SSH_LOG(SSH_LOG_TRACE, \"ECDSA error: %s\", error_buf);\n                return SSH_ERROR;\n\n            }\n            break;\n        case SSH_KEYTYPE_ED25519:\n        case SSH_KEYTYPE_ED25519_CERT01:\n            rc = pki_ed25519_verify(pubkey, signature, verify_input, hlen);\n            if (rc != SSH_OK) {\n                SSH_LOG(SSH_LOG_TRACE, \"ED25519 error: Signature invalid\");\n                return SSH_ERROR;\n            }\n            break;\n        default:\n            SSH_LOG(SSH_LOG_TRACE, \"Unknown public key type\");\n            return SSH_ERROR;\n    }\n\n    return SSH_OK;\n}\n\nconst char *pki_key_ecdsa_nid_to_name(int nid)\n{\n    switch (nid) {\n        case NID_mbedtls_nistp256:\n            return \"ecdsa-sha2-nistp256\";\n        case NID_mbedtls_nistp384:\n            return \"ecdsa-sha2-nistp384\";\n        case NID_mbedtls_nistp521:\n            return \"ecdsa-sha2-nistp521\";\n        default:\n            break;\n    }\n\n    return \"unknown\";\n}\n\nint pki_key_ecdsa_nid_from_name(const char *name)\n{\n    if (strcmp(name, \"nistp256\") == 0) {\n        return NID_mbedtls_nistp256;\n    } else if (strcmp(name, \"nistp384\") == 0) {\n        return NID_mbedtls_nistp384;\n    } else if (strcmp(name, \"nistp521\") == 0) {\n        return NID_mbedtls_nistp521;\n    }\n\n    return -1;\n}\n\nstatic mbedtls_ecp_group_id pki_key_ecdsa_nid_to_mbed_gid(int nid)\n{\n    switch (nid) {\n        case NID_mbedtls_nistp256:\n            return MBEDTLS_ECP_DP_SECP256R1;\n        case NID_mbedtls_nistp384:\n            return MBEDTLS_ECP_DP_SECP384R1;\n        case NID_mbedtls_nistp521:\n            return MBEDTLS_ECP_DP_SECP521R1;\n    }\n\n    return MBEDTLS_ECP_DP_NONE;\n}\n\nint pki_privkey_build_ecdsa(ssh_key key, int nid, ssh_string e, ssh_string exp)\n{\n    int rc;\n    mbedtls_ecp_keypair keypair;\n    mbedtls_ecp_group group;\n    mbedtls_ecp_point Q;\n\n    key->ecdsa_nid = nid;\n    key->type_c = pki_key_ecdsa_nid_to_name(nid);\n\n    key->ecdsa = malloc(sizeof(mbedtls_ecdsa_context));\n    if (key->ecdsa == NULL) {\n        return SSH_ERROR;\n    }\n\n    mbedtls_ecdsa_init(key->ecdsa);\n    mbedtls_ecp_keypair_init(&keypair);\n    mbedtls_ecp_group_init(&group);\n    mbedtls_ecp_point_init(&Q);\n\n    rc = mbedtls_ecp_group_load(&group,\n                                pki_key_ecdsa_nid_to_mbed_gid(nid));\n    if (rc != 0) {\n        goto fail;\n    }\n\n    rc = mbedtls_ecp_point_read_binary(&group, &Q, ssh_string_data(e),\n                                       ssh_string_len(e));\n    if (rc != 0) {\n        goto fail;\n    }\n\n    rc = mbedtls_ecp_copy(&keypair.Q, &Q);\n    if (rc != 0) {\n        goto fail;\n    }\n\n    rc = mbedtls_ecp_group_copy(&keypair.grp, &group);\n    if (rc != 0) {\n        goto fail;\n    }\n\n    rc = mbedtls_mpi_read_binary(&keypair.d, ssh_string_data(exp),\n                                 ssh_string_len(exp));\n    if (rc != 0) {\n        goto fail;\n    }\n\n    rc = mbedtls_ecdsa_from_keypair(key->ecdsa, &keypair);\n    if (rc != 0) {\n        goto fail;\n    }\n\n    mbedtls_ecp_point_free(&Q);\n    mbedtls_ecp_group_free(&group);\n    mbedtls_ecp_keypair_free(&keypair);\n    return SSH_OK;\n\nfail:\n    mbedtls_ecdsa_free(key->ecdsa);\n    mbedtls_ecp_point_free(&Q);\n    mbedtls_ecp_group_free(&group);\n    mbedtls_ecp_keypair_free(&keypair);\n    SAFE_FREE(key->ecdsa);\n    return SSH_ERROR;\n}\n\nint pki_pubkey_build_ecdsa(ssh_key key, int nid, ssh_string e)\n{\n    int rc;\n    mbedtls_ecp_keypair keypair;\n    mbedtls_ecp_group group;\n    mbedtls_ecp_point Q;\n\n    key->ecdsa_nid = nid;\n    key->type_c = pki_key_ecdsa_nid_to_name(nid);\n\n    key->ecdsa = malloc(sizeof(mbedtls_ecdsa_context));\n    if (key->ecdsa == NULL) {\n        return SSH_ERROR;\n    }\n\n    mbedtls_ecdsa_init(key->ecdsa);\n    mbedtls_ecp_keypair_init(&keypair);\n    mbedtls_ecp_group_init(&group);\n    mbedtls_ecp_point_init(&Q);\n\n    rc = mbedtls_ecp_group_load(&group,\n            pki_key_ecdsa_nid_to_mbed_gid(nid));\n    if (rc != 0) {\n        goto fail;\n    }\n\n    rc = mbedtls_ecp_point_read_binary(&group, &Q, ssh_string_data(e),\n            ssh_string_len(e));\n    if (rc != 0) {\n        goto fail;\n    }\n\n    rc = mbedtls_ecp_copy(&keypair.Q, &Q);\n    if (rc != 0) {\n        goto fail;\n    }\n\n    rc = mbedtls_ecp_group_copy(&keypair.grp, &group);\n    if (rc != 0) {\n        goto fail;\n    }\n\n    mbedtls_mpi_init(&keypair.d);\n\n    rc = mbedtls_ecdsa_from_keypair(key->ecdsa, &keypair);\n    if (rc != 0) {\n        goto fail;\n    }\n\n    mbedtls_ecp_point_free(&Q);\n    mbedtls_ecp_group_free(&group);\n    mbedtls_ecp_keypair_free(&keypair);\n    return SSH_OK;\nfail:\n    mbedtls_ecdsa_free(key->ecdsa);\n    mbedtls_ecp_point_free(&Q);\n    mbedtls_ecp_group_free(&group);\n    mbedtls_ecp_keypair_free(&keypair);\n    SAFE_FREE(key->ecdsa);\n    return SSH_ERROR;\n}\n\nint pki_key_generate_ecdsa(ssh_key key, int parameter)\n{\n    int ok;\n\n    switch (parameter) {\n        case 384:\n            key->ecdsa_nid = NID_mbedtls_nistp384;\n            key->type = SSH_KEYTYPE_ECDSA_P384;\n            break;\n        case 521:\n            key->ecdsa_nid = NID_mbedtls_nistp521;\n            key->type = SSH_KEYTYPE_ECDSA_P521;\n            break;\n        case 256:\n        default:\n            key->ecdsa_nid = NID_mbedtls_nistp256;\n            key->type = SSH_KEYTYPE_ECDSA_P256;\n            break;\n    }\n\n    key->ecdsa = malloc(sizeof(mbedtls_ecdsa_context));\n    if (key->ecdsa == NULL) {\n        return SSH_ERROR;\n    }\n\n    mbedtls_ecdsa_init(key->ecdsa);\n\n    ok = mbedtls_ecdsa_genkey(key->ecdsa,\n                              pki_key_ecdsa_nid_to_mbed_gid(key->ecdsa_nid),\n                              mbedtls_ctr_drbg_random,\n                              ssh_get_mbedtls_ctr_drbg_context());\n\n    if (ok != 0) {\n        mbedtls_ecdsa_free(key->ecdsa);\n        SAFE_FREE(key->ecdsa);\n    }\n\n    return SSH_OK;\n}\n\nint pki_privkey_build_dss(ssh_key key, ssh_string p, ssh_string q, ssh_string g,\n        ssh_string pubkey, ssh_string privkey)\n{\n    (void) key;\n    (void) p;\n    (void) q;\n    (void) g;\n    (void) pubkey;\n    (void) privkey;\n    return SSH_ERROR;\n}\n\nint pki_pubkey_build_dss(ssh_key key, ssh_string p, ssh_string q, ssh_string g,\n        ssh_string pubkey)\n{\n    (void) key;\n    (void) p;\n    (void) q;\n    (void) g;\n    (void) pubkey;\n    return SSH_ERROR;\n}\n\nint pki_key_generate_dss(ssh_key key, int parameter)\n{\n    (void) key;\n    (void) parameter;\n    return SSH_ERROR;\n}\n#endif /* HAVE_LIBMBEDCRYPTO */\n"
  },
  {
    "path": "src/libssh/src/poll.c",
    "content": "/*\n * poll.c - poll wrapper\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2009-2013 by Andreas Schneider <asn@cryptomilk.org>\n * Copyright (c) 2003-2013 by Aris Adamantiadis\n * Copyright (c) 2009 Aleksandar Kanchev\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <errno.h>\n#include <stdlib.h>\n\n#include \"libssh/priv.h\"\n#include \"libssh/libssh.h\"\n#include \"libssh/poll.h\"\n#include \"libssh/socket.h\"\n#include \"libssh/session.h\"\n#include \"libssh/misc.h\"\n#ifdef WITH_SERVER\n#include \"libssh/server.h\"\n#endif\n\n\n#ifndef SSH_POLL_CTX_CHUNK\n#define SSH_POLL_CTX_CHUNK\t\t\t5\n#endif\n\n/**\n * @defgroup libssh_poll The SSH poll functions.\n * @ingroup libssh\n *\n * Add a generic way to handle sockets asynchronously.\n *\n * It's based on poll objects, each of which store a socket, its events and a\n * callback, which gets called whenever an event is set. The poll objects are\n * attached to a poll context, which should be allocated on per thread basis.\n *\n * Polling the poll context will poll all the attached poll objects and call\n * their callbacks (handlers) if any of the socket events are set. This should\n * be done within the main loop of an application.\n *\n * @{\n */\n\nstruct ssh_poll_handle_struct {\n  ssh_poll_ctx ctx;\n  ssh_session session;\n  union {\n    socket_t fd;\n    size_t idx;\n  } x;\n  short events;\n  int lock;\n  ssh_poll_callback cb;\n  void *cb_data;\n};\n\nstruct ssh_poll_ctx_struct {\n  ssh_poll_handle *pollptrs;\n  ssh_pollfd_t *pollfds;\n  size_t polls_allocated;\n  size_t polls_used;\n  size_t chunk_size;\n};\n\n#ifdef HAVE_POLL\n#include <poll.h>\n\nvoid ssh_poll_init(void) {\n    return;\n}\n\nvoid ssh_poll_cleanup(void) {\n    return;\n}\n\nint ssh_poll(ssh_pollfd_t *fds, nfds_t nfds, int timeout) {\n  return poll((struct pollfd *) fds, nfds, timeout);\n}\n\n#else /* HAVE_POLL */\n\ntypedef int (*poll_fn)(ssh_pollfd_t *, nfds_t, int);\nstatic poll_fn ssh_poll_emu;\n\n#include <sys/types.h>\n#include <stdbool.h>\n\n#ifdef _WIN32\n#ifndef STRICT\n#define STRICT\n#endif /* STRICT */\n\n#include <time.h>\n#include <windows.h>\n#include <winsock2.h>\n#else /* _WIN32 */\n#include <sys/select.h>\n#include <sys/socket.h>\n\n# ifdef HAVE_SYS_TIME_H\n#  include <sys/time.h>\n# endif\n\n#endif /* _WIN32 */\n\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n\nstatic bool bsd_socket_not_connected(int sock_err)\n{\n    switch (sock_err) {\n#ifdef _WIN32\n    case WSAENOTCONN:\n#else\n    case ENOTCONN:\n#endif\n        return true;\n    default:\n        return false;\n    }\n\n    return false;\n}\n\nstatic bool bsd_socket_reset(int sock_err)\n{\n    switch (sock_err) {\n#ifdef _WIN32\n    case WSAECONNABORTED:\n    case WSAECONNRESET:\n    case WSAENETRESET:\n    case WSAESHUTDOWN:\n    case WSAECONNREFUSED:\n    case WSAETIMEDOUT:\n#else\n    case ECONNABORTED:\n    case ECONNRESET:\n    case ENETRESET:\n    case ESHUTDOWN:\n#endif\n        return true;\n    default:\n        return false;\n    }\n\n    return false;\n}\n\nstatic short bsd_socket_compute_revents(int fd, short events)\n{\n    int save_errno = errno;\n    int sock_errno = errno;\n    char data[64] = {0};\n    short revents = 0;\n    int flags = MSG_PEEK;\n    int ret;\n\n#ifdef MSG_NOSIGNAL\n    flags |= MSG_NOSIGNAL;\n#endif\n\n    /* support for POLLHUP */\n#ifdef _WIN32\n    WSASetLastError(0);\n#endif\n\n    ret = recv(fd, data, 64, flags);\n\n    errno = save_errno;\n\n#ifdef _WIN32\n    sock_errno = WSAGetLastError();\n    WSASetLastError(0);\n#endif\n\n    if (ret > 0 || bsd_socket_not_connected(sock_errno)) {\n        revents = (POLLIN | POLLRDNORM) & events;\n    } else if (ret == 0 || bsd_socket_reset(sock_errno)) {\n        errno = sock_errno;\n        revents = POLLHUP;\n    } else {\n        revents = POLLERR;\n    }\n\n    return revents;\n}\n\n/*\n * This is a poll(2)-emulation using select for systems not providing a native\n * poll implementation.\n *\n * Keep in mind that select is terribly inefficient. The interface is simply not\n * meant to be used with maximum descriptor value greater, say, 32 or so.  With\n * a value as high as 1024 on Linux you'll pay dearly in every single call.\n * poll() will be orders of magnitude faster.\n */\nstatic int bsd_poll(ssh_pollfd_t *fds, nfds_t nfds, int timeout)\n{\n    fd_set readfds, writefds, exceptfds;\n    struct timeval tv, *ptv = NULL;\n    socket_t max_fd;\n    int rc;\n    nfds_t i;\n\n    if (fds == NULL) {\n        errno = EFAULT;\n        return -1;\n    }\n\n    ZERO_STRUCT(readfds);\n    FD_ZERO(&readfds);\n    ZERO_STRUCT(writefds);\n    FD_ZERO(&writefds);\n    ZERO_STRUCT(exceptfds);\n    FD_ZERO(&exceptfds);\n\n    /* compute fd_sets and find largest descriptor */\n    for (rc = -1, max_fd = 0, i = 0; i < nfds; i++) {\n        if (fds[i].fd == SSH_INVALID_SOCKET) {\n            continue;\n        }\n#ifndef _WIN32\n        if (fds[i].fd >= FD_SETSIZE) {\n            rc = -1;\n            break;\n        }\n#endif\n\n        if (fds[i].events & (POLLIN | POLLRDNORM)) {\n            FD_SET (fds[i].fd, &readfds);\n        }\n        if (fds[i].events & (POLLOUT | POLLWRNORM | POLLWRBAND)) {\n            FD_SET (fds[i].fd, &writefds);\n        }\n        if (fds[i].events & (POLLPRI | POLLRDBAND)) {\n            FD_SET (fds[i].fd, &exceptfds);\n        }\n        if (fds[i].fd > max_fd &&\n                (fds[i].events & (POLLIN | POLLOUT | POLLPRI |\n                                  POLLRDNORM | POLLRDBAND |\n                                  POLLWRNORM | POLLWRBAND))) {\n            max_fd = fds[i].fd;\n            rc = 0;\n        }\n    }\n\n    if (max_fd == SSH_INVALID_SOCKET || rc == -1) {\n        errno = EINVAL;\n        return -1;\n    }\n\n    if (timeout < 0) {\n        ptv = NULL;\n    } else {\n        ptv = &tv;\n        if (timeout == 0) {\n            tv.tv_sec = 0;\n            tv.tv_usec = 0;\n        } else {\n            tv.tv_sec = timeout / 1000;\n            tv.tv_usec = (timeout % 1000) * 1000;\n        }\n    }\n\n    rc = select(max_fd + 1, &readfds, &writefds, &exceptfds, ptv);\n    if (rc < 0) {\n        return -1;\n    }\n    /* A timeout occured */\n    if (rc == 0) {\n        return 0;\n    }\n\n    for (rc = 0, i = 0; i < nfds; i++) {\n        if (fds[i].fd >= 0) {\n            fds[i].revents = 0;\n\n            if (FD_ISSET(fds[i].fd, &readfds)) {\n                fds[i].revents = bsd_socket_compute_revents(fds[i].fd,\n                                                            fds[i].events);\n            }\n            if (FD_ISSET(fds[i].fd, &writefds)) {\n                fds[i].revents |= fds[i].events & (POLLOUT | POLLWRNORM | POLLWRBAND);\n            }\n\n            if (FD_ISSET(fds[i].fd, &exceptfds)) {\n                fds[i].revents |= fds[i].events & (POLLPRI | POLLRDBAND);\n            }\n\n            if (fds[i].revents != 0) {\n                rc++;\n            }\n        } else {\n            fds[i].revents = POLLNVAL;\n        }\n    }\n\n    return rc;\n}\n\nvoid ssh_poll_init(void) {\n    ssh_poll_emu = bsd_poll;\n}\n\nvoid ssh_poll_cleanup(void) {\n    ssh_poll_emu = bsd_poll;\n}\n\nint ssh_poll(ssh_pollfd_t *fds, nfds_t nfds, int timeout) {\n    return (ssh_poll_emu)(fds, nfds, timeout);\n}\n\n#endif /* HAVE_POLL */\n\n/**\n * @brief  Allocate a new poll object, which could be used within a poll context.\n *\n * @param  fd           Socket that will be polled.\n * @param  events       Poll events that will be monitored for the socket. i.e.\n *                      POLLIN, POLLPRI, POLLOUT\n * @param  cb           Function to be called if any of the events are set.\n *                      The prototype of cb is:\n *                      int (*ssh_poll_callback)(ssh_poll_handle p, socket_t fd,\n *                                                 int revents, void *userdata);\n * @param  userdata     Userdata to be passed to the callback function. NULL if\n *                      not needed.\n *\n * @return              A new poll object, NULL on error\n */\n\nssh_poll_handle ssh_poll_new(socket_t fd, short events, ssh_poll_callback cb,\n    void *userdata) {\n    ssh_poll_handle p;\n\n    p = malloc(sizeof(struct ssh_poll_handle_struct));\n    if (p == NULL) {\n        return NULL;\n    }\n    ZERO_STRUCTP(p);\n\n    p->x.fd = fd;\n    p->events = events;\n    p->cb = cb;\n    p->cb_data = userdata;\n\n    return p;\n}\n\n\n/**\n * @brief  Free a poll object.\n *\n * @param  p            Pointer to an already allocated poll object.\n */\n\nvoid ssh_poll_free(ssh_poll_handle p) {\n\tif(p->ctx != NULL){\n\t\tssh_poll_ctx_remove(p->ctx,p);\n\t\tp->ctx=NULL;\n\t}\n  SAFE_FREE(p);\n}\n\n/**\n * @brief  Get the poll context of a poll object.\n *\n * @param  p            Pointer to an already allocated poll object.\n *\n * @return              Poll context or NULL if the poll object isn't attached.\n */\nssh_poll_ctx ssh_poll_get_ctx(ssh_poll_handle p) {\n  return p->ctx;\n}\n\n/**\n * @brief  Get the events of a poll object.\n *\n * @param  p            Pointer to an already allocated poll object.\n *\n * @return              Poll events.\n */\nshort ssh_poll_get_events(ssh_poll_handle p) {\n  return p->events;\n}\n\n/**\n * @brief  Set the events of a poll object. The events will also be propagated\n *         to an associated poll context.\n *\n * @param  p            Pointer to an already allocated poll object.\n * @param  events       Poll events.\n */\nvoid ssh_poll_set_events(ssh_poll_handle p, short events) {\n  p->events = events;\n  if (p->ctx != NULL && !p->lock) {\n    p->ctx->pollfds[p->x.idx].events = events;\n  }\n}\n\n/**\n * @brief  Set the file descriptor of a poll object. The FD will also be propagated\n *         to an associated poll context.\n *\n * @param  p            Pointer to an already allocated poll object.\n * @param  fd       New file descriptor.\n */\nvoid ssh_poll_set_fd(ssh_poll_handle p, socket_t fd) {\n  if (p->ctx != NULL) {\n    p->ctx->pollfds[p->x.idx].fd = fd;\n  } else {\n  \tp->x.fd = fd;\n  }\n}\n\n/**\n * @brief  Add extra events to a poll object. Duplicates are ignored.\n *         The events will also be propagated to an associated poll context.\n *\n * @param  p            Pointer to an already allocated poll object.\n * @param  events       Poll events.\n */\nvoid ssh_poll_add_events(ssh_poll_handle p, short events) {\n  ssh_poll_set_events(p, ssh_poll_get_events(p) | events);\n}\n\n/**\n * @brief  Remove events from a poll object. Non-existent are ignored.\n *         The events will also be propagated to an associated poll context.\n *\n * @param  p            Pointer to an already allocated poll object.\n * @param  events       Poll events.\n */\nvoid ssh_poll_remove_events(ssh_poll_handle p, short events) {\n  ssh_poll_set_events(p, ssh_poll_get_events(p) & ~events);\n}\n\n/**\n * @brief  Get the raw socket of a poll object.\n *\n * @param  p            Pointer to an already allocated poll object.\n *\n * @return              Raw socket.\n */\n\nsocket_t ssh_poll_get_fd(ssh_poll_handle p) {\n  if (p->ctx != NULL) {\n    return p->ctx->pollfds[p->x.idx].fd;\n  }\n\n  return p->x.fd;\n}\n/**\n * @brief  Set the callback of a poll object.\n *\n * @param  p            Pointer to an already allocated poll object.\n * @param  cb           Function to be called if any of the events are set.\n * @param  userdata     Userdata to be passed to the callback function. NULL if\n *                      not needed.\n */\nvoid ssh_poll_set_callback(ssh_poll_handle p, ssh_poll_callback cb, void *userdata) {\n  if (cb != NULL) {\n    p->cb = cb;\n    p->cb_data = userdata;\n  }\n}\n\n/**\n * @brief  Create a new poll context. It could be associated with many poll object\n *         which are going to be polled at the same time as the poll context. You\n *         would need a single poll context per thread.\n *\n * @param  chunk_size   The size of the memory chunk that will be allocated, when\n *                      more memory is needed. This is for efficiency reasons,\n *                      i.e. don't allocate memory for each new poll object, but\n *                      for the next 5. Set it to 0 if you want to use the\n *                      library's default value.\n */\nssh_poll_ctx ssh_poll_ctx_new(size_t chunk_size) {\n    ssh_poll_ctx ctx;\n\n    ctx = malloc(sizeof(struct ssh_poll_ctx_struct));\n    if (ctx == NULL) {\n        return NULL;\n    }\n    ZERO_STRUCTP(ctx);\n\n    if (chunk_size == 0) {\n        chunk_size = SSH_POLL_CTX_CHUNK;\n    }\n\n    ctx->chunk_size = chunk_size;\n\n    return ctx;\n}\n\n/**\n * @brief  Free a poll context.\n *\n * @param  ctx          Pointer to an already allocated poll context.\n */\nvoid ssh_poll_ctx_free(ssh_poll_ctx ctx) {\n  if (ctx->polls_allocated > 0) {\n    while (ctx->polls_used > 0){\n      ssh_poll_handle p = ctx->pollptrs[0];\n      /*\n       * The free function calls ssh_poll_ctx_remove() and decrements\n       * ctx->polls_used\n       */\n      ssh_poll_free(p);\n    }\n\n    SAFE_FREE(ctx->pollptrs);\n    SAFE_FREE(ctx->pollfds);\n  }\n\n  SAFE_FREE(ctx);\n}\n\nstatic int ssh_poll_ctx_resize(ssh_poll_ctx ctx, size_t new_size) {\n  ssh_poll_handle *pollptrs;\n  ssh_pollfd_t *pollfds;\n\n  pollptrs = realloc(ctx->pollptrs, sizeof(ssh_poll_handle) * new_size);\n  if (pollptrs == NULL) {\n    return -1;\n  }\n  ctx->pollptrs = pollptrs;\n\n  pollfds = realloc(ctx->pollfds, sizeof(ssh_pollfd_t) * new_size);\n  if (pollfds == NULL) {\n    pollptrs = realloc(ctx->pollptrs, sizeof(ssh_poll_handle) * ctx->polls_allocated);\n    if (pollptrs == NULL) {\n        return -1;\n    }\n    ctx->pollptrs = pollptrs;\n    return -1;\n  }\n\n  ctx->pollfds = pollfds;\n  ctx->polls_allocated = new_size;\n\n  return 0;\n}\n\n/**\n * @brief  Add a poll object to a poll context.\n *\n * @param  ctx          Pointer to an already allocated poll context.\n * @param  p            Pointer to an already allocated poll object.\n *\n * @return              0 on success, < 0 on error\n */\nint ssh_poll_ctx_add(ssh_poll_ctx ctx, ssh_poll_handle p) {\n  socket_t fd;\n\n  if (p->ctx != NULL) {\n    /* already attached to a context */\n    return -1;\n  }\n\n  if (ctx->polls_used == ctx->polls_allocated &&\n      ssh_poll_ctx_resize(ctx, ctx->polls_allocated + ctx->chunk_size) < 0) {\n    return -1;\n  }\n\n  fd = p->x.fd;\n  p->x.idx = ctx->polls_used++;\n  ctx->pollptrs[p->x.idx] = p;\n  ctx->pollfds[p->x.idx].fd = fd;\n  ctx->pollfds[p->x.idx].events = p->events;\n  ctx->pollfds[p->x.idx].revents = 0;\n  p->ctx = ctx;\n\n  return 0;\n}\n\n/**\n * @brief  Add a socket object to a poll context.\n *\n * @param  ctx          Pointer to an already allocated poll context.\n * @param  s            A SSH socket handle\n *\n * @return              0 on success, < 0 on error\n */\nint ssh_poll_ctx_add_socket (ssh_poll_ctx ctx, ssh_socket s)\n{\n    ssh_poll_handle p;\n    int ret;\n\n    p = ssh_socket_get_poll_handle(s);\n    if (p == NULL) {\n        return -1;\n    }\n    ret = ssh_poll_ctx_add(ctx,p);\n    return ret;\n}\n\n\n/**\n * @brief  Remove a poll object from a poll context.\n *\n * @param  ctx          Pointer to an already allocated poll context.\n * @param  p            Pointer to an already allocated poll object.\n */\nvoid ssh_poll_ctx_remove(ssh_poll_ctx ctx, ssh_poll_handle p) {\n  size_t i;\n\n  i = p->x.idx;\n  p->x.fd = ctx->pollfds[i].fd;\n  p->ctx = NULL;\n\n  ctx->polls_used--;\n\n  /* fill the empty poll slot with the last one */\n  if (ctx->polls_used > 0 && ctx->polls_used != i) {\n    ctx->pollfds[i] = ctx->pollfds[ctx->polls_used];\n    ctx->pollptrs[i] = ctx->pollptrs[ctx->polls_used];\n    ctx->pollptrs[i]->x.idx = i;\n  }\n\n  /* this will always leave at least chunk_size polls allocated */\n  if (ctx->polls_allocated - ctx->polls_used > ctx->chunk_size) {\n    ssh_poll_ctx_resize(ctx, ctx->polls_allocated - ctx->chunk_size);\n  }\n}\n\n/**\n * @brief  Poll all the sockets associated through a poll object with a\n *         poll context. If any of the events are set after the poll, the\n *         call back function of the socket will be called.\n *         This function should be called once within the programs main loop.\n *\n * @param  ctx          Pointer to an already allocated poll context.\n * @param  timeout      An upper limit on the time for which ssh_poll_ctx() will\n *                      block, in milliseconds. Specifying a negative value\n *                      means an infinite timeout. This parameter is passed to\n *                      the poll() function.\n * @returns SSH_OK      No error.\n *          SSH_ERROR   Error happened during the poll.\n *          SSH_AGAIN   Timeout occured\n */\n\nint ssh_poll_ctx_dopoll(ssh_poll_ctx ctx, int timeout)\n{\n    int rc;\n    size_t i, used;\n    ssh_poll_handle p;\n    socket_t fd;\n    int revents;\n    struct ssh_timestamp ts;\n\n    if (ctx->polls_used == 0) {\n        return SSH_ERROR;\n    }\n\n    ssh_timestamp_init(&ts);\n    do {\n        int tm = ssh_timeout_update(&ts, timeout);\n        rc = ssh_poll(ctx->pollfds, ctx->polls_used, tm);\n    } while (rc == -1 && errno == EINTR);\n\n    if (rc < 0) {\n        return SSH_ERROR;\n    }\n    if (rc == 0) {\n        return SSH_AGAIN;\n    }\n\n    used = ctx->polls_used;\n    for (i = 0; i < used && rc > 0; ) {\n        if (!ctx->pollfds[i].revents || ctx->pollptrs[i]->lock) {\n            i++;\n        } else {\n            int ret;\n\n            p = ctx->pollptrs[i];\n            fd = ctx->pollfds[i].fd;\n            revents = ctx->pollfds[i].revents;\n            /* avoid having any event caught during callback */\n            ctx->pollfds[i].events = 0;\n            p->lock = 1;\n            if (p->cb && (ret = p->cb(p, fd, revents, p->cb_data)) < 0) {\n                if (ret == -2) {\n                    return -1;\n                }\n                /* the poll was removed, reload the used counter and start again */\n                used = ctx->polls_used;\n                i = 0;\n            } else {\n                ctx->pollfds[i].revents = 0;\n                ctx->pollfds[i].events = p->events;\n                p->lock = 0;\n                i++;\n            }\n\n            rc--;\n        }\n    }\n\n    return rc;\n}\n\n/**\n * @internal\n * @brief gets the default poll structure for the current session,\n * when used in blocking mode.\n * @param session SSH session\n * @returns the default ssh_poll_ctx\n */\nssh_poll_ctx ssh_poll_get_default_ctx(ssh_session session){\n\tif(session->default_poll_ctx != NULL)\n\t\treturn session->default_poll_ctx;\n\t/* 2 is enough for the default one */\n\tsession->default_poll_ctx = ssh_poll_ctx_new(2);\n\treturn session->default_poll_ctx;\n}\n\n/* public event API */\n\nstruct ssh_event_fd_wrapper {\n    ssh_event_callback cb;\n    void * userdata;\n};\n\nstruct ssh_event_struct {\n    ssh_poll_ctx ctx;\n#ifdef WITH_SERVER\n    struct ssh_list *sessions;\n#endif\n};\n\n/**\n * @brief  Create a new event context. It could be associated with many\n *         ssh_session objects and socket fd which are going to be polled at the\n *         same time as the event context. You would need a single event context\n *         per thread.\n * \n * @return  The ssh_event object on success, NULL on failure.\n */\nssh_event ssh_event_new(void) {\n    ssh_event event;\n\n    event = malloc(sizeof(struct ssh_event_struct));\n    if (event == NULL) {\n        return NULL;\n    }\n    ZERO_STRUCTP(event);\n\n    event->ctx = ssh_poll_ctx_new(2);\n    if(event->ctx == NULL) {\n        free(event);\n        return NULL;\n    }\n\n#ifdef WITH_SERVER\n    event->sessions = ssh_list_new();\n    if(event->sessions == NULL) {\n        ssh_poll_ctx_free(event->ctx);\n        free(event);\n        return NULL;\n    }\n#endif\n\n    return event;\n}\n\nstatic int ssh_event_fd_wrapper_callback(ssh_poll_handle p, socket_t fd, int revents,\n                                                            void *userdata) {\n    struct ssh_event_fd_wrapper *pw = (struct ssh_event_fd_wrapper *)userdata;\n\n    (void)p;\n    if(pw->cb != NULL) {\n        return pw->cb(fd, revents, pw->userdata);\n    }\n    return 0;\n}\n\n/**\n * @brief Add a fd to the event and assign it a callback,\n * when used in blocking mode.\n * @param event         The ssh_event\n * @param  fd           Socket that will be polled.\n * @param  events       Poll events that will be monitored for the socket. i.e.\n *                      POLLIN, POLLPRI, POLLOUT\n * @param  cb           Function to be called if any of the events are set.\n *                      The prototype of cb is:\n *                      int (*ssh_event_callback)(socket_t fd, int revents,\n *                                                          void *userdata);\n * @param  userdata     Userdata to be passed to the callback function. NULL if\n *                      not needed.\n *\n * @returns SSH_OK      on success\n *          SSH_ERROR   on failure\n */\nint ssh_event_add_fd(ssh_event event, socket_t fd, short events,\n                                    ssh_event_callback cb, void *userdata) {\n    ssh_poll_handle p;\n    struct ssh_event_fd_wrapper *pw;\n    \n    if(event == NULL || event->ctx == NULL || cb == NULL\n                                           || fd == SSH_INVALID_SOCKET) {\n        return SSH_ERROR;\n    }\n    pw = malloc(sizeof(struct ssh_event_fd_wrapper));\n    if(pw == NULL) {\n        return SSH_ERROR;\n    }\n\n    pw->cb = cb;\n    pw->userdata = userdata;\n\n    /* pw is freed by ssh_event_remove_fd */\n    p = ssh_poll_new(fd, events, ssh_event_fd_wrapper_callback, pw);\n    if(p == NULL) {\n        free(pw);\n        return SSH_ERROR;\n    }\n\n    if(ssh_poll_ctx_add(event->ctx, p) < 0) {\n        free(pw);\n        ssh_poll_free(p);\n        return SSH_ERROR;\n    }\n    return SSH_OK;\n}\n\n/**\n * @brief Add a poll handle to the event.\n *\n * @param   event     the ssh_event\n *\n * @param   p         the poll handle\n *\n * @returns SSH_OK    on success\n *          SSH_ERROR on failure\n */\nint ssh_event_add_poll(ssh_event event, ssh_poll_handle p)\n{\n    return ssh_poll_ctx_add(event->ctx, p);\n}\n\n/**\n * @brief remove a poll handle to the event.\n *\n * @param   event     the ssh_event\n *\n * @param   p         the poll handle\n */\nvoid ssh_event_remove_poll(ssh_event event, ssh_poll_handle p)\n{\n    ssh_poll_ctx_remove(event->ctx,p);\n}\n\n/**\n * @brief remove the poll handle from session and assign them to a event,\n * when used in blocking mode.\n *\n * @param event     The ssh_event object\n * @param session   The session to add to the event.\n *\n * @returns SSH_OK      on success\n *          SSH_ERROR   on failure\n */\nint ssh_event_add_session(ssh_event event, ssh_session session) {\n    ssh_poll_handle p;\n#ifdef WITH_SERVER\n    struct ssh_iterator *iterator;\n#endif\n\n    if(event == NULL || event->ctx == NULL || session == NULL) {\n        return SSH_ERROR;\n    }\n    if(session->default_poll_ctx == NULL) {\n        return SSH_ERROR;\n    }\n    while (session->default_poll_ctx->polls_used > 0) {\n        p = session->default_poll_ctx->pollptrs[0];\n        /*\n         * ssh_poll_ctx_remove() decrements\n         * session->default_poll_ctx->polls_used\n         */\n        ssh_poll_ctx_remove(session->default_poll_ctx, p);\n        ssh_poll_ctx_add(event->ctx, p);\n        /* associate the pollhandler with a session so we can put it back\n         * at ssh_event_free()\n         */\n        p->session = session;\n    }\n#ifdef WITH_SERVER\n    iterator = ssh_list_get_iterator(event->sessions);\n    while(iterator != NULL) {\n        if((ssh_session)iterator->data == session) {\n            /* allow only one instance of this session */\n            return SSH_OK;\n        }\n        iterator = iterator->next;\n    }\n    if(ssh_list_append(event->sessions, session) == SSH_ERROR) {\n        return SSH_ERROR;\n    }\n#endif\n    return SSH_OK;\n}\n\n/**\n * @brief Add a connector to the SSH event loop\n *\n * @param[in] event The SSH event loop\n *\n * @param[in] connector The connector object\n *\n * @return SSH_OK\n *\n * @return SSH_ERROR in case of error\n */\nint ssh_event_add_connector(ssh_event event, ssh_connector connector){\n    return ssh_connector_set_event(connector, event);\n}\n\n/**\n * @brief Poll all the sockets and sessions associated through an event object.i\n *\n * If any of the events are set after the poll, the call back functions of the\n * sessions or sockets will be called.\n * This function should be called once within the programs main loop.\n *\n * @param  event        The ssh_event object to poll.\n *\n * @param  timeout      An upper limit on the time for which the poll will\n *                      block, in milliseconds. Specifying a negative value\n *                      means an infinite timeout. This parameter is passed to\n *                      the poll() function.\n * @returns SSH_OK      on success.\n *          SSH_ERROR   Error happened during the poll.\n *          SSH_AGAIN   Timeout occured\n */\nint ssh_event_dopoll(ssh_event event, int timeout) {\n    int rc;\n\n    if(event == NULL || event->ctx == NULL) {\n        return SSH_ERROR;\n    }\n    rc = ssh_poll_ctx_dopoll(event->ctx, timeout);\n    return rc;\n}\n\n/**\n * @brief  Remove a socket fd from an event context.\n *\n * @param  event        The ssh_event object.\n * @param  fd           The fd to remove.\n *\n * @returns SSH_OK      on success\n *          SSH_ERROR   on failure\n */\nint ssh_event_remove_fd(ssh_event event, socket_t fd) {\n    register size_t i, used;\n    int rc = SSH_ERROR;\n\n    if(event == NULL || event->ctx == NULL) {\n        return SSH_ERROR;\n    }\n\n    used = event->ctx->polls_used;\n    for (i = 0; i < used; i++) {\n        if(fd == event->ctx->pollfds[i].fd) {\n            ssh_poll_handle p = event->ctx->pollptrs[i];\n            if (p->session != NULL){\n            \t/* we cannot free that handle, it's owned by its session */\n            \tcontinue;\n            }\n            if (p->cb == ssh_event_fd_wrapper_callback) {\n                struct ssh_event_fd_wrapper *pw = p->cb_data;\n                SAFE_FREE(pw);\n            }\n\n            /*\n             * The free function calls ssh_poll_ctx_remove() and decrements\n             * event->ctx->polls_used.\n             */\n            ssh_poll_free(p);\n            rc = SSH_OK;\n\n            /* restart the loop */\n            used = event->ctx->polls_used;\n            i = 0;\n        }\n    }\n\n    return rc;\n}\n\n/**\n * @brief  Remove a session object from an event context.\n *\n * @param  event        The ssh_event object.\n * @param  session      The session to remove.\n *\n * @returns SSH_OK      on success\n *          SSH_ERROR   on failure\n */\nint ssh_event_remove_session(ssh_event event, ssh_session session) {\n    ssh_poll_handle p;\n    register size_t i, used;\n    int rc = SSH_ERROR;\n#ifdef WITH_SERVER\n    struct ssh_iterator *iterator;\n#endif\n\n    if(event == NULL || event->ctx == NULL || session == NULL) {\n        return SSH_ERROR;\n    }\n\n    used = event->ctx->polls_used;\n    for(i = 0; i < used; i++) {\n    \tp = event->ctx->pollptrs[i];\n    \tif(p->session == session){\n            /*\n             * ssh_poll_ctx_remove() decrements\n             * event->ctx->polls_used\n             */\n            ssh_poll_ctx_remove(event->ctx, p);\n            p->session = NULL;\n            ssh_poll_ctx_add(session->default_poll_ctx, p);\n            rc = SSH_OK;\n            /*\n             * Restart the loop!\n             * A session can initially have two pollhandlers.\n             */\n            used = event->ctx->polls_used;\n            i = 0;\n\n        }\n    }\n#ifdef WITH_SERVER\n    iterator = ssh_list_get_iterator(event->sessions);\n    while(iterator != NULL) {\n        if((ssh_session)iterator->data == session) {\n            ssh_list_remove(event->sessions, iterator);\n            /* there should be only one instance of this session */\n            break;\n        }\n        iterator = iterator->next;\n    }\n#endif\n\n    return rc;\n}\n\n/** @brief Remove a connector from an event context\n * @param[in] event The ssh_event object.\n * @param[in] connector connector object to remove\n * @return SSH_OK on success\n * @return SSH_ERROR on failure\n */\nint ssh_event_remove_connector(ssh_event event, ssh_connector connector){\n    (void)event;\n    return ssh_connector_remove_event(connector);\n}\n\n/**\n * @brief  Free an event context.\n *\n * @param  event        The ssh_event object to free.\n *                      Note: you have to manually remove sessions and socket\n *                      fds before freeing the event object.\n *\n */\nvoid ssh_event_free(ssh_event event)\n{\n    size_t used, i;\n    ssh_poll_handle p;\n\n    if(event == NULL) {\n        return;\n    }\n\n    if (event->ctx != NULL) {\n        used = event->ctx->polls_used;\n        for(i = 0; i < used; i++) {\n            p = event->ctx->pollptrs[i];\n            if (p->session != NULL) {\n                ssh_poll_ctx_remove(event->ctx, p);\n                ssh_poll_ctx_add(p->session->default_poll_ctx, p);\n                p->session = NULL;\n                used = 0;\n            }\n        }\n\n        ssh_poll_ctx_free(event->ctx);\n    }\n#ifdef WITH_SERVER\n    if(event->sessions != NULL) {\n        ssh_list_free(event->sessions);\n    }\n#endif\n    free(event);\n}\n\n/** @} */\n"
  },
  {
    "path": "src/libssh/src/scp.c",
    "content": "/*\n * scp - SSH scp wrapper functions\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2009 by Aris Adamantiadis <aris@0xbadc0de.be>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n\n#include \"libssh/priv.h\"\n#include \"libssh/scp.h\"\n#include \"libssh/misc.h\"\n\n/**\n * @defgroup libssh_scp The SSH scp functions\n * @ingroup libssh\n *\n * SCP protocol over SSH functions\n *\n * @{\n */\n\n/**\n * @brief Create a new scp session.\n *\n * @param[in]  session  The SSH session to use.\n *\n * @param[in]  mode     One of SSH_SCP_WRITE or SSH_SCP_READ, depending if you\n *                      need to drop files remotely or read them.\n *                      It is not possible to combine read and write.\n *                      SSH_SCP_RECURSIVE Flag can be or'ed to this to indicate\n *                      that you're going to use recursion. Browsing through\n *                      directories is not possible without this.\n *\n * @param[in]  location The directory in which write or read will be done. Any\n *                      push or pull will be relative to this place.\n *                      This can also be a pattern of files to download (read).\n *\n * @returns             A ssh_scp handle, NULL if the creation was impossible.\n */\nssh_scp ssh_scp_new(ssh_session session, int mode, const char *location)\n{\n    ssh_scp scp = NULL;\n\n    if (session == NULL) {\n        goto error;\n    }\n\n    scp = (ssh_scp)calloc(1, sizeof(struct ssh_scp_struct));\n    if (scp == NULL) {\n        ssh_set_error(session, SSH_FATAL,\n                      \"Error allocating memory for ssh_scp\");\n        goto error;\n    }\n\n    if ((mode & ~SSH_SCP_RECURSIVE) != SSH_SCP_WRITE &&\n        (mode & ~SSH_SCP_RECURSIVE) != SSH_SCP_READ)\n    {\n        ssh_set_error(session, SSH_FATAL,\n                      \"Invalid mode %d for ssh_scp_new()\", mode);\n        goto error;\n    }\n\n    if (strlen(location) > 32 * 1024) {\n        ssh_set_error(session, SSH_FATAL,\n                      \"Location path is too long\");\n        goto error;\n    }\n\n    scp->location = strdup(location);\n    if (scp->location == NULL) {\n        ssh_set_error(session, SSH_FATAL,\n                      \"Error allocating memory for ssh_scp\");\n        goto error;\n    }\n\n    scp->session = session;\n    scp->mode = mode & ~SSH_SCP_RECURSIVE;\n    scp->recursive = (mode & SSH_SCP_RECURSIVE) != 0;\n    scp->channel = NULL;\n    scp->state = SSH_SCP_NEW;\n\n    return scp;\n\nerror:\n    ssh_scp_free(scp);\n    return NULL;\n}\n\n/**\n * @brief Initialize the scp channel.\n *\n * @param[in]  scp      The scp context to initialize.\n *\n * @return SSH_OK on success or an SSH error code.\n *\n * @see ssh_scp_new()\n */\nint ssh_scp_init(ssh_scp scp)\n{\n    int rc;\n    char execbuffer[1024] = {0};\n    char *quoted_location = NULL;\n    size_t quoted_location_len = 0;\n    size_t scp_location_len;\n\n    if (scp == NULL) {\n        return SSH_ERROR;\n    }\n\n    if (scp->state != SSH_SCP_NEW) {\n        ssh_set_error(scp->session, SSH_FATAL,\n                      \"ssh_scp_init called under invalid state\");\n        return SSH_ERROR;\n    }\n\n    if (scp->location == NULL) {\n        ssh_set_error(scp->session, SSH_FATAL,\n                      \"Invalid scp context: location is NULL\");\n        return SSH_ERROR;\n    }\n\n    SSH_LOG(SSH_LOG_PROTOCOL, \"Initializing scp session %s %son location '%s'\",\n            scp->mode == SSH_SCP_WRITE?\"write\":\"read\",\n            scp->recursive ? \"recursive \" : \"\",\n            scp->location);\n\n    scp->channel = ssh_channel_new(scp->session);\n    if (scp->channel == NULL) {\n        ssh_set_error(scp->session, SSH_FATAL,\n                      \"Channel creation failed for scp\");\n        scp->state = SSH_SCP_ERROR;\n        return SSH_ERROR;\n    }\n\n    rc = ssh_channel_open_session(scp->channel);\n    if (rc == SSH_ERROR) {\n        ssh_set_error(scp->session, SSH_FATAL,\n                      \"Failed to open channel for scp\");\n        scp->state = SSH_SCP_ERROR;\n        return SSH_ERROR;\n    }\n\n    /* In the worst case, each character would be replaced by 3 plus the string\n     * terminator '\\0' */\n    scp_location_len = strlen(scp->location);\n    quoted_location_len = ((size_t)3 * scp_location_len) + 1;\n    /* Paranoia check */\n    if (quoted_location_len < scp_location_len) {\n        ssh_set_error(scp->session, SSH_FATAL,\n                      \"Buffer overflow detected\");\n        scp->state = SSH_SCP_ERROR;\n        return SSH_ERROR;\n    }\n\n    quoted_location = (char *)calloc(1, quoted_location_len);\n    if (quoted_location == NULL) {\n        ssh_set_error(scp->session, SSH_FATAL,\n                      \"Failed to allocate memory for quoted location\");\n        scp->state = SSH_SCP_ERROR;\n        return SSH_ERROR;\n    }\n\n    rc = ssh_quote_file_name(scp->location, quoted_location,\n                             quoted_location_len);\n    if (rc <= 0) {\n        ssh_set_error(scp->session, SSH_FATAL,\n                      \"Failed to single quote command location\");\n        SAFE_FREE(quoted_location);\n        scp->state = SSH_SCP_ERROR;\n        return SSH_ERROR;\n    }\n\n    if (scp->mode == SSH_SCP_WRITE) {\n        snprintf(execbuffer, sizeof(execbuffer), \"scp -t %s %s\",\n                scp->recursive ? \"-r\" : \"\", quoted_location);\n    } else {\n        snprintf(execbuffer, sizeof(execbuffer), \"scp -f %s %s\",\n                scp->recursive ? \"-r\" : \"\", quoted_location);\n    }\n\n    SAFE_FREE(quoted_location);\n\n    SSH_LOG(SSH_LOG_DEBUG, \"Executing command: %s\", execbuffer);\n\n    rc = ssh_channel_request_exec(scp->channel, execbuffer);\n    if (rc == SSH_ERROR){\n        ssh_set_error(scp->session, SSH_FATAL,\n                      \"Failed executing command: %s\", execbuffer);\n        scp->state = SSH_SCP_ERROR;\n        return SSH_ERROR;\n    }\n\n    if (scp->mode == SSH_SCP_WRITE) {\n        rc = ssh_scp_response(scp, NULL);\n        if (rc != 0) {\n            return SSH_ERROR;\n        }\n    } else {\n        ssh_channel_write(scp->channel, \"\", 1);\n    }\n\n    if (scp->mode == SSH_SCP_WRITE) {\n        scp->state = SSH_SCP_WRITE_INITED;\n    } else {\n        scp->state = SSH_SCP_READ_INITED;\n    }\n\n    return SSH_OK;\n}\n\n/**\n * @brief Close the scp channel.\n *\n * @param[in]  scp      The scp context to close.\n *\n * @return SSH_OK on success or an SSH error code.\n *\n * @see ssh_scp_init()\n */\nint ssh_scp_close(ssh_scp scp)\n{\n    char buffer[128] = {0};\n    int rc;\n\n    if (scp == NULL) {\n        return SSH_ERROR;\n    }\n\n    if (scp->channel != NULL) {\n        if (ssh_channel_send_eof(scp->channel) == SSH_ERROR) {\n            scp->state = SSH_SCP_ERROR;\n            return SSH_ERROR;\n        }\n        /* avoid situations where data are buffered and\n         * not yet stored on disk. This can happen if the close is sent\n         * before we got the EOF back\n         */\n        while (!ssh_channel_is_eof(scp->channel)) {\n            rc = ssh_channel_read(scp->channel, buffer, sizeof(buffer), 0);\n            if (rc == SSH_ERROR || rc == 0) {\n                break;\n            }\n        }\n\n        if (ssh_channel_close(scp->channel) == SSH_ERROR) {\n            scp->state = SSH_SCP_ERROR;\n            return SSH_ERROR;\n        }\n\n        ssh_channel_free(scp->channel);\n        scp->channel = NULL;\n    }\n\n    scp->state = SSH_SCP_NEW;\n    return SSH_OK;\n}\n\n/**\n * @brief Free a scp context.\n *\n * @param[in]  scp      The context to free.\n *\n * @see ssh_scp_new()\n */\nvoid ssh_scp_free(ssh_scp scp)\n{\n    if (scp == NULL) {\n        return;\n    }\n\n    if (scp->state != SSH_SCP_NEW) {\n        ssh_scp_close(scp);\n    }\n\n    if (scp->channel) {\n        ssh_channel_free(scp->channel);\n    }\n\n    SAFE_FREE(scp->location);\n    SAFE_FREE(scp->request_name);\n    SAFE_FREE(scp->warning);\n    SAFE_FREE(scp);\n}\n\n/**\n * @brief Create a directory in a scp in sink mode.\n *\n * @param[in]  scp      The scp handle.\n *\n * @param[in]  dirname  The name of the directory being created.\n *\n * @param[in]  mode     The UNIX permissions for the new directory, e.g. 0755.\n *\n * @returns             SSH_OK if the directory has been created, SSH_ERROR if\n *                      an error occured.\n *\n * @see ssh_scp_leave_directory()\n */\nint ssh_scp_push_directory(ssh_scp scp, const char *dirname, int mode)\n{\n    char buffer[1024] = {0};\n    int rc;\n    char *dir = NULL;\n    char *perms = NULL;\n    char *vis_encoded = NULL;\n    size_t vis_encoded_len;\n\n    if (scp == NULL) {\n        return SSH_ERROR;\n    }\n\n    if (scp->state != SSH_SCP_WRITE_INITED) {\n        ssh_set_error(scp->session, SSH_FATAL,\n                      \"ssh_scp_push_directory called under invalid state\");\n        return SSH_ERROR;\n    }\n\n    dir = ssh_basename(dirname);\n    if (dir == NULL) {\n        ssh_set_error_oom(scp->session);\n        return SSH_ERROR;\n    }\n\n    vis_encoded_len = (2 * strlen(dir)) + 1;\n    vis_encoded = (char *)calloc(1, vis_encoded_len);\n    if (vis_encoded == NULL) {\n        ssh_set_error(scp->session, SSH_FATAL,\n                      \"Failed to allocate buffer to vis encode directory name\");\n        goto error;\n    }\n\n    rc = ssh_newline_vis(dir, vis_encoded, vis_encoded_len);\n    if (rc <= 0) {\n        ssh_set_error(scp->session, SSH_FATAL,\n                      \"Failed to vis encode directory name\");\n        goto error;\n    }\n\n    perms = ssh_scp_string_mode(mode);\n    if (perms == NULL) {\n        ssh_set_error(scp->session, SSH_FATAL,\n                      \"Failed to get directory permission string\");\n        goto error;\n    }\n\n    SSH_LOG(SSH_LOG_PROTOCOL,\n            \"SCP pushing directory %s with permissions '%s'\",\n            vis_encoded, perms);\n\n    /* Use vis encoded directory name */\n    snprintf(buffer, sizeof(buffer),\n             \"D%s 0 %s\\n\",\n             perms, vis_encoded);\n\n    SAFE_FREE(dir);\n    SAFE_FREE(perms);\n    SAFE_FREE(vis_encoded);\n\n    rc = ssh_channel_write(scp->channel, buffer, strlen(buffer));\n    if (rc == SSH_ERROR) {\n        scp->state = SSH_SCP_ERROR;\n        return SSH_ERROR;\n    }\n\n    rc = ssh_scp_response(scp, NULL);\n    if (rc != 0) {\n        return SSH_ERROR;\n    }\n\n    return SSH_OK;\n\nerror:\n    SAFE_FREE(dir);\n    SAFE_FREE(perms);\n    SAFE_FREE(vis_encoded);\n\n    return SSH_ERROR;\n}\n\n/**\n * @brief Leave a directory.\n *\n * @returns             SSH_OK if the directory has been left, SSH_ERROR if an\n *                      error occured.\n *\n * @see ssh_scp_push_directory()\n */\nint ssh_scp_leave_directory(ssh_scp scp)\n{\n    char buffer[] = \"E\\n\";\n    int rc;\n\n    if (scp == NULL) {\n        return SSH_ERROR;\n    }\n\n    if (scp->state != SSH_SCP_WRITE_INITED) {\n        ssh_set_error(scp->session, SSH_FATAL,\n                      \"ssh_scp_leave_directory called under invalid state\");\n        return SSH_ERROR;\n    }\n\n    rc = ssh_channel_write(scp->channel, buffer, strlen(buffer));\n    if (rc == SSH_ERROR) {\n        scp->state = SSH_SCP_ERROR;\n        return SSH_ERROR;\n    }\n\n    rc = ssh_scp_response(scp, NULL);\n    if (rc != 0) {\n        return SSH_ERROR;\n    }\n\n    return SSH_OK;\n}\n\n/**\n * @brief Initialize the sending of a file to a scp in sink mode, using a 64-bit\n * size.\n *\n * @param[in]  scp      The scp handle.\n *\n * @param[in]  filename The name of the file being sent. It should not contain\n *                      any path indicator\n *\n * @param[in]  size     Exact size in bytes of the file being sent.\n *\n * @param[in]  mode     The UNIX permissions for the new file, e.g. 0644.\n *\n * @returns             SSH_OK if the file is ready to be sent, SSH_ERROR if an\n *                      error occured.\n *\n * @see ssh_scp_push_file()\n */\nint ssh_scp_push_file64(ssh_scp scp, const char *filename, uint64_t size,\n                        int mode)\n{\n    char buffer[1024] = {0};\n    int rc;\n    char *file = NULL;\n    char *perms = NULL;\n    char *vis_encoded = NULL;\n    size_t vis_encoded_len;\n\n    if (scp == NULL) {\n        return SSH_ERROR;\n    }\n\n    if (scp->state != SSH_SCP_WRITE_INITED) {\n        ssh_set_error(scp->session, SSH_FATAL,\n                      \"ssh_scp_push_file called under invalid state\");\n        return SSH_ERROR;\n    }\n\n    file = ssh_basename(filename);\n    if (file == NULL) {\n        ssh_set_error_oom(scp->session);\n        return SSH_ERROR;\n    }\n\n    vis_encoded_len = (2 * strlen(file)) + 1;\n    vis_encoded = (char *)calloc(1, vis_encoded_len);\n    if (vis_encoded == NULL) {\n        ssh_set_error(scp->session, SSH_FATAL,\n                      \"Failed to allocate buffer to vis encode file name\");\n        goto error;\n    }\n\n    rc = ssh_newline_vis(file, vis_encoded, vis_encoded_len);\n    if (rc <= 0) {\n        ssh_set_error(scp->session, SSH_FATAL,\n                      \"Failed to vis encode file name\");\n        goto error;\n    }\n\n    perms = ssh_scp_string_mode(mode);\n    if (perms == NULL) {\n        ssh_set_error(scp->session, SSH_FATAL,\n                      \"Failed to get file permission string\");\n        goto error;\n    }\n\n    SSH_LOG(SSH_LOG_PROTOCOL,\n            \"SCP pushing file %s, size %\" PRIu64 \" with permissions '%s'\",\n            vis_encoded, size, perms);\n\n    /* Use vis encoded file name */\n    snprintf(buffer, sizeof(buffer),\n             \"C%s %\" PRIu64 \" %s\\n\",\n             perms, size, vis_encoded);\n\n    SAFE_FREE(file);\n    SAFE_FREE(perms);\n    SAFE_FREE(vis_encoded);\n\n    rc = ssh_channel_write(scp->channel, buffer, strlen(buffer));\n    if (rc == SSH_ERROR) {\n        scp->state = SSH_SCP_ERROR;\n        return SSH_ERROR;\n    }\n\n    rc = ssh_scp_response(scp, NULL);\n    if (rc != 0) {\n        return SSH_ERROR;\n    }\n\n    scp->filelen = size;\n    scp->processed = 0;\n    scp->state = SSH_SCP_WRITE_WRITING;\n\n    return SSH_OK;\n\nerror:\n    SAFE_FREE(file);\n    SAFE_FREE(perms);\n    SAFE_FREE(vis_encoded);\n\n    return SSH_ERROR;\n}\n\n/**\n * @brief Initialize the sending of a file to a scp in sink mode.\n *\n * @param[in]  scp      The scp handle.\n *\n * @param[in]  filename The name of the file being sent. It should not contain\n *                      any path indicator\n *\n * @param[in]  size     Exact size in bytes of the file being sent.\n *\n * @param[in]  mode     The UNIX permissions for the new file, e.g. 0644.\n *\n * @returns             SSH_OK if the file is ready to be sent, SSH_ERROR if an\n *                      error occured.\n */\nint ssh_scp_push_file(ssh_scp scp, const char *filename, size_t size, int mode)\n{\n    return ssh_scp_push_file64(scp, filename, (uint64_t) size, mode);\n}\n\n/**\n * @internal\n *\n * @brief Wait for a response of the scp server.\n *\n * @param[in]  scp      The scp handle.\n *\n * @param[out] response A pointer where the response message must be copied if\n *                      any. This pointer must then be free'd.\n *\n * @returns             The return code, SSH_ERROR a error occured.\n */\nint ssh_scp_response(ssh_scp scp, char **response)\n{\n    unsigned char code;\n    int rc;\n    char msg[128] = {0};\n\n    if (scp == NULL) {\n        return SSH_ERROR;\n    }\n\n    rc = ssh_channel_read(scp->channel, &code, 1, 0);\n    if (rc == SSH_ERROR) {\n        return SSH_ERROR;\n    }\n\n    if (code == 0) {\n        return 0;\n    }\n\n    if (code > 2) {\n        ssh_set_error(scp->session, SSH_FATAL,\n                      \"SCP: invalid status code %u received\", code);\n        scp->state = SSH_SCP_ERROR;\n        return SSH_ERROR;\n    }\n\n    rc = ssh_scp_read_string(scp, msg, sizeof(msg));\n    if (rc == SSH_ERROR) {\n        return rc;\n    }\n\n    /* Warning */\n    if (code == 1) {\n        ssh_set_error(scp->session, SSH_REQUEST_DENIED,\n                      \"SCP: Warning: status code 1 received: %s\", msg);\n        SSH_LOG(SSH_LOG_RARE,\n                \"SCP: Warning: status code 1 received: %s\", msg);\n        if (response) {\n            *response = strdup(msg);\n        }\n        return 1;\n    }\n\n    if (code == 2) {\n        ssh_set_error(scp->session, SSH_FATAL,\n                      \"SCP: Error: status code 2 received: %s\", msg);\n        if (response) {\n            *response = strdup(msg);\n        }\n        return 2;\n    }\n\n    /* Not reached */\n    return SSH_ERROR;\n}\n\n/**\n * @brief Write into a remote scp file.\n *\n * @param[in]  scp      The scp handle.\n *\n * @param[in]  buffer   The buffer to write.\n *\n * @param[in]  len      The number of bytes to write.\n *\n * @returns             SSH_OK if the write was successful, SSH_ERROR an error\n *                      occured while writing.\n */\nint ssh_scp_write(ssh_scp scp, const void *buffer, size_t len)\n{\n    int w;\n    int rc;\n    uint8_t code;\n\n    if (scp == NULL) {\n        return SSH_ERROR;\n    }\n\n    if (scp->state != SSH_SCP_WRITE_WRITING) {\n        ssh_set_error(scp->session, SSH_FATAL,\n                      \"ssh_scp_write called under invalid state\");\n        return SSH_ERROR;\n    }\n\n    if (scp->processed + len > scp->filelen) {\n        len = (size_t) (scp->filelen - scp->processed);\n    }\n\n    /* hack to avoid waiting for window change */\n    rc = ssh_channel_poll(scp->channel, 0);\n    if (rc == SSH_ERROR) {\n        scp->state = SSH_SCP_ERROR;\n        return SSH_ERROR;\n    }\n\n    w = ssh_channel_write(scp->channel, buffer, len);\n    if (w != SSH_ERROR) {\n        scp->processed += w;\n    } else {\n        scp->state = SSH_SCP_ERROR;\n        //return = channel_get_exit_status(scp->channel);\n        return SSH_ERROR;\n    }\n\n    /* Far end sometimes send a status message, which we need to read\n     * and handle */\n    rc = ssh_channel_poll(scp->channel, 0);\n    if (rc > 0) {\n        rc = ssh_scp_response(scp, NULL);\n        if (rc != 0) {\n            return SSH_ERROR;\n        }\n    }\n\n    /* Check if we arrived at end of file */\n    if (scp->processed == scp->filelen) {\n        code = 0;\n        w = ssh_channel_write(scp->channel, &code, 1);\n        if (w == SSH_ERROR) {\n            scp->state = SSH_SCP_ERROR;\n            return SSH_ERROR;\n        }\n\n        scp->processed = scp->filelen = 0;\n        scp->state = SSH_SCP_WRITE_INITED;\n    }\n\n    return SSH_OK;\n}\n\n/**\n * @brief Read a string on a channel, terminated by '\\n'\n *\n * @param[in]  scp      The scp handle.\n *\n * @param[out] buffer   A pointer to a buffer to place the string.\n *\n * @param[in]  len      The size of the buffer in bytes. If the string is bigger\n *                      than len-1, only len-1 bytes are read and the string is\n *                      null-terminated.\n *\n * @returns             SSH_OK if the string was read, SSH_ERROR if an error\n *                      occured while reading.\n */\nint ssh_scp_read_string(ssh_scp scp, char *buffer, size_t len)\n{\n    size_t read = 0;\n    int err = SSH_OK;\n\n    if (scp == NULL) {\n        return SSH_ERROR;\n    }\n\n    while (read < len - 1) {\n        err = ssh_channel_read(scp->channel, &buffer[read], 1, 0);\n        if (err == SSH_ERROR) {\n            break;\n        }\n\n        if (err == 0) {\n            ssh_set_error(scp->session, SSH_FATAL,\n                          \"End of file while reading string\");\n            err = SSH_ERROR;\n            break;\n        }\n\n        read++;\n        if (buffer[read - 1] == '\\n') {\n            break;\n        }\n    }\n\n    buffer[read] = 0;\n    return err;\n}\n\n/**\n * @brief Wait for a scp request (file, directory).\n *\n * @returns             SSH_SCP_REQUEST_NEWFILE:       The other side is sending\n *                                                     a file\n *                      SSH_SCP_REQUEST_NEWDIR:  The other side is sending\n *                                                     a directory\n *                      SSH_SCP_REQUEST_ENDDIR: The other side has\n *                                                     finished with the current\n *                                                     directory\n *                      SSH_SCP_REQUEST_WARNING: The other side sent us a warning\n *                      SSH_SCP_REQUEST_EOF: The other side finished sending us\n *                                           files and data.\n *                      SSH_ERROR:                     Some error happened\n *\n * @see ssh_scp_read()\n * @see ssh_scp_deny_request()\n * @see ssh_scp_accept_request()\n * @see ssh_scp_request_get_warning()\n */\nint ssh_scp_pull_request(ssh_scp scp)\n{\n    char buffer[MAX_BUF_SIZE] = {0};\n    char *mode = NULL;\n    char *p, *tmp;\n    uint64_t size;\n    char *name = NULL;\n    int rc;\n\n    if (scp == NULL) {\n        return SSH_ERROR;\n    }\n\n    if (scp->state != SSH_SCP_READ_INITED) {\n        ssh_set_error(scp->session, SSH_FATAL,\n                      \"ssh_scp_pull_request called under invalid state\");\n        return SSH_ERROR;\n    }\n\n    rc = ssh_scp_read_string(scp, buffer, sizeof(buffer));\n    if (rc == SSH_ERROR) {\n        if (ssh_channel_is_eof(scp->channel)) {\n            scp->state = SSH_SCP_TERMINATED;\n            return SSH_SCP_REQUEST_EOF;\n        }\n        return rc;\n    }\n\n    p = strchr(buffer, '\\n');\n    if (p != NULL) {\n        *p = '\\0';\n    }\n\n    SSH_LOG(SSH_LOG_PROTOCOL, \"Received SCP request: '%s'\", buffer);\n    switch(buffer[0]) {\n    case 'C':\n        /* File */\n    case 'D':\n        /* Directory */\n        p = strchr(buffer, ' ');\n        if (p == NULL) {\n            goto error;\n        }\n        *p = '\\0';\n        p++;\n        //mode = strdup(&buffer[1]);\n        scp->request_mode = ssh_scp_integer_mode(&buffer[1]);\n        tmp = p;\n        p = strchr(p, ' ');\n        if (p == NULL) {\n            goto error;\n        }\n        *p = 0;\n        size = strtoull(tmp, NULL, 10);\n        p++;\n        name = strdup(p);\n        SAFE_FREE(scp->request_name);\n        scp->request_name = name;\n        if (buffer[0] == 'C') {\n            scp->filelen = size;\n            scp->request_type = SSH_SCP_REQUEST_NEWFILE;\n        } else {\n            scp->filelen = '0';\n            scp->request_type = SSH_SCP_REQUEST_NEWDIR;\n        }\n        scp->state = SSH_SCP_READ_REQUESTED;\n        scp->processed = 0;\n        return scp->request_type;\n        break;\n    case 'E':\n        scp->request_type = SSH_SCP_REQUEST_ENDDIR;\n        ssh_channel_write(scp->channel, \"\", 1);\n        return scp->request_type;\n    case 0x1:\n        ssh_set_error(scp->session, SSH_REQUEST_DENIED,\n                      \"SCP: Warning: %s\", &buffer[1]);\n        scp->request_type = SSH_SCP_REQUEST_WARNING;\n        SAFE_FREE(scp->warning);\n        scp->warning = strdup(&buffer[1]);\n        return scp->request_type;\n    case 0x2:\n        ssh_set_error(scp->session, SSH_FATAL,\n                      \"SCP: Error: %s\", &buffer[1]);\n        return SSH_ERROR;\n    case 'T':\n        /* Timestamp */\n    default:\n        ssh_set_error(scp->session, SSH_FATAL,\n                      \"Unhandled message: (%d)%s\", buffer[0], buffer);\n        return SSH_ERROR;\n    }\n\n    /* a parsing error occured */\nerror:\n    SAFE_FREE(name);\n    SAFE_FREE(mode);\n    ssh_set_error(scp->session, SSH_FATAL,\n                  \"Parsing error while parsing message: %s\", buffer);\n    return SSH_ERROR;\n}\n\n/**\n * @brief Deny the transfer of a file or creation of a directory coming from the\n * remote party.\n *\n * @param[in]  scp      The scp handle.\n * @param[in]  reason   A nul-terminated string with a human-readable\n *                      explanation of the deny.\n *\n * @returns             SSH_OK if the message was sent, SSH_ERROR if the sending\n *                      the message failed, or sending it in a bad state.\n */\nint ssh_scp_deny_request(ssh_scp scp, const char *reason)\n{\n    char buffer[MAX_BUF_SIZE] = {0};\n    int rc;\n\n    if (scp == NULL) {\n        return SSH_ERROR;\n    }\n\n    if (scp->state != SSH_SCP_READ_REQUESTED) {\n        ssh_set_error(scp->session, SSH_FATAL,\n                      \"ssh_scp_deny_request called under invalid state\");\n        return SSH_ERROR;\n    }\n\n    snprintf(buffer, sizeof(buffer), \"%c%s\\n\", 2, reason);\n    rc = ssh_channel_write(scp->channel, buffer, strlen(buffer));\n    if (rc == SSH_ERROR) {\n        return SSH_ERROR;\n    }\n\n    else {\n        scp->state = SSH_SCP_READ_INITED;\n        return SSH_OK;\n    }\n}\n\n/**\n * @brief Accepts transfer of a file or creation of a directory coming from the\n * remote party.\n *\n * @param[in]  scp      The scp handle.\n *\n * @returns             SSH_OK if the message was sent, SSH_ERROR if sending the\n *                      message failed, or sending it in a bad state.\n */\nint ssh_scp_accept_request(ssh_scp scp)\n{\n    char buffer[] = {0x00};\n    int rc;\n    if (scp == NULL) {\n        return SSH_ERROR;\n    }\n\n    if (scp->state != SSH_SCP_READ_REQUESTED) {\n        ssh_set_error(scp->session, SSH_FATAL,\n                      \"ssh_scp_deny_request called under invalid state\");\n        return SSH_ERROR;\n    }\n\n    rc = ssh_channel_write(scp->channel, buffer, 1);\n    if (rc == SSH_ERROR) {\n        return SSH_ERROR;\n    }\n\n    if (scp->request_type == SSH_SCP_REQUEST_NEWFILE) {\n        scp->state = SSH_SCP_READ_READING;\n    } else {\n        scp->state = SSH_SCP_READ_INITED;\n    }\n\n    return SSH_OK;\n}\n\n/** @brief Read from a remote scp file\n * @param[in]  scp      The scp handle.\n *\n * @param[in]  buffer   The destination buffer.\n *\n * @param[in]  size     The size of the buffer.\n *\n * @returns             The nNumber of bytes read, SSH_ERROR if an error occured\n *                      while reading.\n */\nint ssh_scp_read(ssh_scp scp, void *buffer, size_t size)\n{\n    int rc;\n    int code;\n\n    if (scp == NULL) {\n        return SSH_ERROR;\n    }\n\n    if (scp->state == SSH_SCP_READ_REQUESTED &&\n        scp->request_type == SSH_SCP_REQUEST_NEWFILE)\n    {\n        rc = ssh_scp_accept_request(scp);\n        if (rc == SSH_ERROR) {\n            return rc;\n        }\n    }\n\n    if (scp->state != SSH_SCP_READ_READING) {\n        ssh_set_error(scp->session, SSH_FATAL,\n                      \"ssh_scp_read called under invalid state\");\n        return SSH_ERROR;\n    }\n\n    if (scp->processed + size > scp->filelen) {\n        size = (size_t) (scp->filelen - scp->processed);\n    }\n\n    if (size > 65536) {\n        size = 65536; /* avoid too large reads */\n    }\n\n    rc = ssh_channel_read(scp->channel, buffer, size, 0);\n    if (rc != SSH_ERROR) {\n        scp->processed += rc;\n    } else {\n        scp->state = SSH_SCP_ERROR;\n        return SSH_ERROR;\n    }\n\n    /* Check if we arrived at end of file */\n    if (scp->processed == scp->filelen) {\n        scp->processed = scp->filelen = 0;\n        ssh_channel_write(scp->channel, \"\", 1);\n        code = ssh_scp_response(scp, NULL);\n        if (code == 0) {\n            scp->state = SSH_SCP_READ_INITED;\n            return rc;\n        }\n        if (code == 1) {\n            scp->state = SSH_SCP_READ_INITED;\n            return SSH_ERROR;\n        }\n        scp->state = SSH_SCP_ERROR;\n        return SSH_ERROR;\n    }\n\n    return rc;\n}\n\n/**\n * @brief Get the name of the directory or file being pushed from the other\n * party.\n *\n * @returns             The file name, NULL on error. The string should not be\n *                      freed.\n */\nconst char *ssh_scp_request_get_filename(ssh_scp scp)\n{\n    if (scp == NULL) {\n        return NULL;\n    }\n\n    return scp->request_name;\n}\n\n/**\n * @brief Get the permissions of the directory or file being pushed from the\n * other party.\n *\n * @returns             The UNIX permission, e.g 0644, -1 on error.\n */\nint ssh_scp_request_get_permissions(ssh_scp scp)\n{\n    if (scp == NULL) {\n        return -1;\n    }\n\n    return scp->request_mode;\n}\n\n/** @brief Get the size of the file being pushed from the other party.\n *\n * @returns             The numeric size of the file being read.\n * @warning             The real size may not fit in a 32 bits field and may\n *                      be truncated.\n * @see ssh_scp_request_get_size64()\n */\nsize_t ssh_scp_request_get_size(ssh_scp scp)\n{\n    if (scp == NULL) {\n        return 0;\n    }\n    return (size_t)scp->filelen;\n}\n\n/** @brief Get the size of the file being pushed from the other party.\n *\n * @returns             The numeric size of the file being read.\n */\nuint64_t ssh_scp_request_get_size64(ssh_scp scp)\n{\n    if (scp == NULL) {\n        return 0;\n    }\n    return scp->filelen;\n}\n\n/**\n * @brief Convert a scp text mode to an integer.\n *\n * @param[in]  mode     The mode to convert, e.g. \"0644\".\n *\n * @returns             An integer value, e.g. 420 for \"0644\".\n */\nint ssh_scp_integer_mode(const char *mode)\n{\n    int value = strtoul(mode, NULL, 8) & 0xffff;\n    return value;\n}\n\n/**\n * @brief Convert a unix mode into a scp string.\n *\n * @param[in]  mode     The mode to convert, e.g. 420 or 0644.\n *\n * @returns             A pointer to a malloc'ed string containing the scp mode,\n *                      e.g. \"0644\".\n */\nchar *ssh_scp_string_mode(int mode)\n{\n    char buffer[16] = {0};\n    snprintf(buffer, sizeof(buffer), \"%.4o\", mode);\n    return strdup(buffer);\n}\n\n/**\n * @brief Get the warning string from a scp handle.\n *\n * @param[in]  scp      The scp handle.\n *\n * @returns             A warning string, or NULL on error. The string should\n *                      not be freed.\n */\nconst char *ssh_scp_request_get_warning(ssh_scp scp)\n{\n    if (scp == NULL) {\n        return NULL;\n    }\n\n    return scp->warning;\n}\n\n/** @} */\n"
  },
  {
    "path": "src/libssh/src/server.c",
    "content": "/*\n * server.c - functions for creating a SSH server\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2004-2013 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <errno.h>\n#include <fcntl.h>\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n\n#ifdef _WIN32\n# include <winsock2.h>\n# include <ws2tcpip.h>\n\n  /*\n   * <wspiapi.h> is necessary for getaddrinfo before Windows XP, but it isn't\n   * available on some platforms like MinGW.\n   */\n# ifdef HAVE_WSPIAPI_H\n#  include <wspiapi.h>\n# endif\n#else\n# include <netinet/in.h>\n#endif\n\n#include \"libssh/priv.h\"\n#include \"libssh/libssh.h\"\n#include \"libssh/server.h\"\n#include \"libssh/ssh2.h\"\n#include \"libssh/buffer.h\"\n#include \"libssh/packet.h\"\n#include \"libssh/socket.h\"\n#include \"libssh/session.h\"\n#include \"libssh/kex.h\"\n#include \"libssh/misc.h\"\n#include \"libssh/pki.h\"\n#include \"libssh/dh.h\"\n#include \"libssh/messages.h\"\n#include \"libssh/options.h\"\n#include \"libssh/curve25519.h\"\n#include \"libssh/token.h\"\n\n#define set_status(session, status) do {\\\n        if (session->common.callbacks && session->common.callbacks->connect_status_function) \\\n            session->common.callbacks->connect_status_function(session->common.callbacks->userdata, status); \\\n    } while (0)\n\n/**\n * @addtogroup libssh_server\n *\n * @{\n */\n\n/** @internal\n *\n * @brief initialize the set of key exchange, hostkey, ciphers, MACs, and\n *        compression algorithms for the given ssh_session\n *\n * The selection of algorithms and keys used are determined by the\n * options that are currently set in the given ssh_session structure.\n */\n\nint server_set_kex(ssh_session session)\n{\n    struct ssh_kex_struct *server = &session->next_crypto->server_kex;\n    int i, j, rc;\n    const char *wanted, *allowed;\n    char *kept;\n    char hostkeys[128] = {0};\n    enum ssh_keytypes_e keytype;\n    size_t len;\n    int ok;\n\n    ZERO_STRUCTP(server);\n\n    ok = ssh_get_random(server->cookie, 16, 0);\n    if (!ok) {\n        ssh_set_error(session, SSH_FATAL, \"PRNG error\");\n        return -1;\n    }\n\n    if (session->srv.ed25519_key != NULL) {\n        snprintf(hostkeys,\n                 sizeof(hostkeys),\n                 \"%s\",\n                 ssh_key_type_to_char(ssh_key_type(session->srv.ed25519_key)));\n    }\n#ifdef HAVE_ECC\n    if (session->srv.ecdsa_key != NULL) {\n        len = strlen(hostkeys);\n        snprintf(hostkeys + len, sizeof(hostkeys) - len,\n                 \",%s\", session->srv.ecdsa_key->type_c);\n    }\n#endif\n#ifdef HAVE_DSA\n    if (session->srv.dsa_key != NULL) {\n        len = strlen(hostkeys);\n        keytype = ssh_key_type(session->srv.dsa_key);\n\n        snprintf(hostkeys + len, sizeof(hostkeys) - len,\n                 \",%s\", ssh_key_type_to_char(keytype));\n    }\n#endif\n    if (session->srv.rsa_key != NULL) {\n        /* We support also the SHA2 variants */\n        len = strlen(hostkeys);\n        snprintf(hostkeys + len, sizeof(hostkeys) - len,\n                 \",rsa-sha2-512,rsa-sha2-256\");\n\n        len = strlen(hostkeys);\n        keytype = ssh_key_type(session->srv.rsa_key);\n\n        snprintf(hostkeys + len, sizeof(hostkeys) - len,\n                 \",%s\", ssh_key_type_to_char(keytype));\n    }\n\n    if (strlen(hostkeys) == 0) {\n        return -1;\n    }\n\n    if (session->opts.wanted_methods[SSH_HOSTKEYS]) {\n        allowed = session->opts.wanted_methods[SSH_HOSTKEYS];\n    } else {\n        if (ssh_fips_mode()) {\n            allowed = ssh_kex_get_fips_methods(SSH_HOSTKEYS);\n        } else {\n            allowed = ssh_kex_get_default_methods(SSH_HOSTKEYS);\n        }\n    }\n\n    /* It is expected for the list of allowed hostkeys to be ordered by\n     * preference */\n    kept = ssh_find_all_matching(hostkeys[0] == ',' ? hostkeys + 1 : hostkeys,\n                                 allowed);\n    if (kept == NULL) {\n        /* Nothing was allowed */\n        return -1;\n    }\n\n    rc = ssh_options_set_algo(session,\n                              SSH_HOSTKEYS,\n                              kept);\n    SAFE_FREE(kept);\n    if (rc < 0) {\n        return -1;\n    }\n\n    for (i = 0; i < SSH_KEX_METHODS; i++) {\n        wanted = session->opts.wanted_methods[i];\n        if (wanted == NULL) {\n            if (ssh_fips_mode()) {\n                wanted = ssh_kex_get_fips_methods(i);\n            } else {\n                wanted = ssh_kex_get_default_methods(i);\n            }\n        }\n        if (wanted == NULL) {\n            for (j = 0; j < i; j++) {\n                SAFE_FREE(server->methods[j]);\n            }\n            return -1;\n        }\n\n        server->methods[i] = strdup(wanted);\n        if (server->methods[i] == NULL) {\n            for (j = 0; j < i; j++) {\n                SAFE_FREE(server->methods[j]);\n            }\n            return -1;\n        }\n    }\n\n    return 0;\n}\n\nint ssh_server_init_kex(ssh_session session) {\n    int i;\n\n    if (session->session_state > SSH_SESSION_STATE_BANNER_RECEIVED) {\n        return SSH_ERROR;\n    }\n\n    /* free any currently-set methods: server_set_kex will allocate new ones */\n    for (i = 0; i < SSH_KEX_METHODS; i++) {\n        SAFE_FREE(session->next_crypto->server_kex.methods[i]);\n    }\n\n    return server_set_kex(session);\n}\n\nstatic int ssh_server_send_extensions(ssh_session session) {\n    int rc;\n    const char *hostkey_algorithms;\n\n    SSH_LOG(SSH_LOG_PACKET, \"Sending SSH_MSG_EXT_INFO\");\n\n    if (session->opts.pubkey_accepted_types) {\n        hostkey_algorithms = session->opts.pubkey_accepted_types;\n    } else {\n        if (ssh_fips_mode()) {\n            hostkey_algorithms = ssh_kex_get_fips_methods(SSH_HOSTKEYS);\n        } else {\n            /* There are no restrictions to the accepted public keys */\n            hostkey_algorithms = ssh_kex_get_default_methods(SSH_HOSTKEYS);\n        }\n    }\n\n    rc = ssh_buffer_pack(session->out_buffer,\n                         \"bdss\",\n                         SSH2_MSG_EXT_INFO,\n                         1, /* nr. of extensions */\n                         \"server-sig-algs\",\n                         hostkey_algorithms);\n    if (rc != SSH_OK) {\n        goto error;\n    }\n\n    if (ssh_packet_send(session) == SSH_ERROR) {\n        goto error;\n    }\n\n    return 0;\nerror:\n    ssh_buffer_reinit(session->out_buffer);\n\n    return -1;\n}\n\nSSH_PACKET_CALLBACK(ssh_packet_kexdh_init){\n  (void)packet;\n  (void)type;\n  (void)user;\n\n  SSH_LOG(SSH_LOG_PACKET,\"Received SSH_MSG_KEXDH_INIT\");\n  if(session->dh_handshake_state != DH_STATE_INIT){\n    SSH_LOG(SSH_LOG_RARE,\"Invalid state for SSH_MSG_KEXDH_INIT\");\n    session->session_state = SSH_SESSION_STATE_ERROR;\n    return SSH_PACKET_USED;\n  }\n\n  /* If first_kex_packet_follows guess was wrong, ignore this message. */\n  if (session->first_kex_follows_guess_wrong != 0) {\n    SSH_LOG(SSH_LOG_RARE, \"first_kex_packet_follows guess was wrong, \"\n                          \"ignoring first SSH_MSG_KEXDH_INIT message\");\n    session->first_kex_follows_guess_wrong = 0;\n\n    return SSH_PACKET_USED;\n  }\n  SSH_LOG(SSH_LOG_DEBUG, \"Calling next KEXDH handler\");\n  return SSH_PACKET_NOT_USED;\n}\n\nint\nssh_get_key_params(ssh_session session,\n                   ssh_key *privkey,\n                   enum ssh_digest_e *digest)\n{\n    ssh_key pubkey;\n    ssh_string pubkey_blob;\n    int rc;\n\n    switch(session->srv.hostkey) {\n      case SSH_KEYTYPE_DSS:\n        *privkey = session->srv.dsa_key;\n        break;\n      case SSH_KEYTYPE_RSA:\n        *privkey = session->srv.rsa_key;\n        break;\n      case SSH_KEYTYPE_ECDSA_P256:\n      case SSH_KEYTYPE_ECDSA_P384:\n      case SSH_KEYTYPE_ECDSA_P521:\n        *privkey = session->srv.ecdsa_key;\n        break;\n      case SSH_KEYTYPE_ED25519:\n        *privkey = session->srv.ed25519_key;\n        break;\n      case SSH_KEYTYPE_RSA1:\n      case SSH_KEYTYPE_UNKNOWN:\n      default:\n        *privkey = NULL;\n    }\n\n    *digest = session->srv.hostkey_digest;\n    rc = ssh_pki_export_privkey_to_pubkey(*privkey, &pubkey);\n    if (rc < 0) {\n      ssh_set_error(session, SSH_FATAL,\n          \"Could not get the public key from the private key\");\n\n      return -1;\n    }\n\n    rc = ssh_pki_export_pubkey_blob(pubkey, &pubkey_blob);\n    ssh_key_free(pubkey);\n    if (rc < 0) {\n      ssh_set_error_oom(session);\n      return -1;\n    }\n\n    rc = ssh_dh_import_next_pubkey_blob(session, pubkey_blob);\n    SSH_STRING_FREE(pubkey_blob);\n    if (rc != 0) {\n        ssh_set_error(session,\n                      SSH_FATAL,\n                      \"Could not import server public key\");\n        return -1;\n    }\n\n    return SSH_OK;\n}\n\n/**\n * @internal\n *\n * @brief A function to be called each time a step has been done in the\n * connection.\n */\nstatic void ssh_server_connection_callback(ssh_session session){\n    int rc;\n\n    switch(session->session_state){\n        case SSH_SESSION_STATE_NONE:\n        case SSH_SESSION_STATE_CONNECTING:\n        case SSH_SESSION_STATE_SOCKET_CONNECTED:\n            break;\n        case SSH_SESSION_STATE_BANNER_RECEIVED:\n            if (session->clientbanner == NULL) {\n                goto error;\n            }\n            set_status(session, 0.4f);\n            SSH_LOG(SSH_LOG_PROTOCOL,\n                    \"SSH client banner: %s\", session->clientbanner);\n\n            /* Here we analyze the different protocols the server allows. */\n            rc = ssh_analyze_banner(session, 1);\n            if (rc < 0) {\n                ssh_set_error(session, SSH_FATAL,\n                        \"No version of SSH protocol usable (banner: %s)\",\n                        session->clientbanner);\n                goto error;\n            }\n\n            /* from now, the packet layer is handling incoming packets */\n            session->socket_callbacks.data=ssh_packet_socket_callback;\n            ssh_packet_register_socket_callback(session, session->socket);\n\n            ssh_packet_set_default_callbacks(session);\n            set_status(session, 0.5f);\n            session->session_state=SSH_SESSION_STATE_INITIAL_KEX;\n            if (ssh_send_kex(session, 1) < 0) {\n                goto error;\n            }\n            break;\n        case SSH_SESSION_STATE_INITIAL_KEX:\n            /* TODO: This state should disappear in favor of get_key handle */\n            break;\n        case SSH_SESSION_STATE_KEXINIT_RECEIVED:\n            set_status(session,0.6f);\n            if(session->next_crypto->server_kex.methods[0]==NULL){\n                if(server_set_kex(session) == SSH_ERROR)\n                    goto error;\n                /* We are in a rekeying, so we need to send the server kex */\n                if(ssh_send_kex(session, 1) < 0)\n                    goto error;\n            }\n            ssh_list_kex(&session->next_crypto->client_kex); // log client kex\n            if (ssh_kex_select_methods(session) < 0) {\n                goto error;\n            }\n            if (crypt_set_algorithms_server(session) == SSH_ERROR)\n                goto error;\n            set_status(session,0.8f);\n            session->session_state=SSH_SESSION_STATE_DH;\n            break;\n        case SSH_SESSION_STATE_DH:\n            if(session->dh_handshake_state==DH_STATE_FINISHED){\n\n                rc = ssh_packet_set_newkeys(session, SSH_DIRECTION_IN);\n                if (rc != SSH_OK) {\n                    goto error;\n                }\n\n                /*\n                 * If the client supports extension negotiation, we will send\n                 * our supported extensions now. This is the first message after\n                 * sending NEWKEYS message and after turning on crypto.\n                 */\n                if (session->extensions & SSH_EXT_NEGOTIATION &&\n                    session->session_state != SSH_SESSION_STATE_AUTHENTICATED) {\n\n                    /*\n                     * Only send an SSH_MSG_EXT_INFO message the first time the client\n                     * undergoes NEWKEYS.  It is unexpected for this message to be sent\n                     * upon rekey, and may cause clients to log error messages.\n                     *\n                     * The session_state can not be used for this purpose because it is\n                     * re-set to SSH_SESSION_STATE_KEXINIT_RECEIVED during rekey.  So,\n                     * use the connected flag which transitions from non-zero below.\n                     *\n                     * See also:\n                     * - https://bugzilla.mindrot.org/show_bug.cgi?id=2929\n                     */\n                    if (session->connected == 0) {\n                        ssh_server_send_extensions(session);\n                    }\n                }\n\n                set_status(session,1.0f);\n                session->connected = 1;\n                session->session_state=SSH_SESSION_STATE_AUTHENTICATING;\n                if (session->flags & SSH_SESSION_FLAG_AUTHENTICATED)\n                    session->session_state = SSH_SESSION_STATE_AUTHENTICATED;\n\n            }\n            break;\n        case SSH_SESSION_STATE_AUTHENTICATING:\n            break;\n        case SSH_SESSION_STATE_ERROR:\n            goto error;\n        default:\n            ssh_set_error(session,SSH_FATAL,\"Invalid state %d\",session->session_state);\n    }\n\n    return;\nerror:\n    ssh_socket_close(session->socket);\n    session->alive = 0;\n    session->session_state=SSH_SESSION_STATE_ERROR;\n}\n\n/**\n * @internal\n *\n * @brief Gets the banner from socket and saves it in session.\n * Updates the session state\n *\n * @param  data pointer to the beginning of header\n * @param  len size of the banner\n * @param  user is a pointer to session\n * @returns Number of bytes processed, or zero if the banner is not complete.\n */\nstatic int callback_receive_banner(const void *data, size_t len, void *user) {\n    char *buffer = (char *) data;\n    ssh_session session = (ssh_session) user;\n    char *str = NULL;\n    size_t i;\n    int ret=0;\n\n    for (i = 0; i < len; i++) {\n#ifdef WITH_PCAP\n        if(session->pcap_ctx && buffer[i] == '\\n') {\n            ssh_pcap_context_write(session->pcap_ctx,\n                                   SSH_PCAP_DIR_IN,\n                                   buffer,\n                                   i + 1,\n                                   i + 1);\n        }\n#endif\n        if (buffer[i] == '\\r') {\n            buffer[i]='\\0';\n        }\n\n        if (buffer[i] == '\\n') {\n            buffer[i]='\\0';\n\n            str = strdup(buffer);\n            /* number of bytes read */\n            ret = i + 1;\n            session->clientbanner = str;\n            session->session_state = SSH_SESSION_STATE_BANNER_RECEIVED;\n            SSH_LOG(SSH_LOG_PACKET, \"Received banner: %s\", str);\n            session->ssh_connection_callback(session);\n\n            return ret;\n        }\n\n        if(i > 127) {\n            /* Too big banner */\n            session->session_state = SSH_SESSION_STATE_ERROR;\n            ssh_set_error(session, SSH_FATAL, \"Receiving banner: too large banner\");\n\n            return 0;\n        }\n    }\n\n    return ret;\n}\n\n/* returns 0 until the key exchange is not finished */\nstatic int ssh_server_kex_termination(void *s){\n  ssh_session session = s;\n  if (session->session_state != SSH_SESSION_STATE_ERROR &&\n      session->session_state != SSH_SESSION_STATE_AUTHENTICATING &&\n      session->session_state != SSH_SESSION_STATE_DISCONNECTED)\n    return 0;\n  else\n    return 1;\n}\n\n/* FIXME: auth_methods should be unsigned */\nvoid ssh_set_auth_methods(ssh_session session, int auth_methods)\n{\n    /* accept only methods in range */\n    session->auth.supported_methods = (uint32_t)auth_methods & 0x3fU;\n}\n\n/* Do the banner and key exchange */\nint ssh_handle_key_exchange(ssh_session session) {\n    int rc;\n    if (session->session_state != SSH_SESSION_STATE_NONE)\n      goto pending;\n    rc = ssh_send_banner(session, 1);\n    if (rc < 0) {\n        return SSH_ERROR;\n    }\n\n    session->alive = 1;\n\n    session->ssh_connection_callback = ssh_server_connection_callback;\n    session->session_state = SSH_SESSION_STATE_SOCKET_CONNECTED;\n    ssh_socket_set_callbacks(session->socket,&session->socket_callbacks);\n    session->socket_callbacks.data=callback_receive_banner;\n    session->socket_callbacks.exception=ssh_socket_exception_callback;\n    session->socket_callbacks.userdata=session;\n\n    rc = server_set_kex(session);\n    if (rc < 0) {\n        return SSH_ERROR;\n    }\n    pending:\n    rc = ssh_handle_packets_termination(session, SSH_TIMEOUT_USER,\n        ssh_server_kex_termination,session);\n    SSH_LOG(SSH_LOG_PACKET, \"ssh_handle_key_exchange: current state : %d\",\n        session->session_state);\n    if (rc != SSH_OK)\n      return rc;\n    if (session->session_state == SSH_SESSION_STATE_ERROR ||\n        session->session_state == SSH_SESSION_STATE_DISCONNECTED) {\n      return SSH_ERROR;\n    }\n\n  return SSH_OK;\n}\n\n/* messages */\n\n/** @internal\n * replies to an SSH_AUTH packet with a default (denied) response.\n */\nint ssh_auth_reply_default(ssh_session session,int partial) {\n  char methods_c[128] = {0};\n  int rc = SSH_ERROR;\n\n\n  if (session->auth.supported_methods == 0) {\n    session->auth.supported_methods = SSH_AUTH_METHOD_PUBLICKEY | SSH_AUTH_METHOD_PASSWORD;\n  }\n  if (session->auth.supported_methods & SSH_AUTH_METHOD_PUBLICKEY) {\n    strncat(methods_c, \"publickey,\",\n            sizeof(methods_c) - strlen(methods_c) - 1);\n  }\n  if (session->auth.supported_methods & SSH_AUTH_METHOD_GSSAPI_MIC){\n\t  strncat(methods_c,\"gssapi-with-mic,\",\n\t\t\t  sizeof(methods_c) - strlen(methods_c) - 1);\n  }\n  if (session->auth.supported_methods & SSH_AUTH_METHOD_INTERACTIVE) {\n    strncat(methods_c, \"keyboard-interactive,\",\n            sizeof(methods_c) - strlen(methods_c) - 1);\n  }\n  if (session->auth.supported_methods & SSH_AUTH_METHOD_PASSWORD) {\n    strncat(methods_c, \"password,\",\n            sizeof(methods_c) - strlen(methods_c) - 1);\n  }\n  if (session->auth.supported_methods & SSH_AUTH_METHOD_HOSTBASED) {\n    strncat(methods_c, \"hostbased,\",\n            sizeof(methods_c) - strlen(methods_c) - 1);\n  }\n\n  if (methods_c[0] == '\\0' || methods_c[strlen(methods_c)-1] != ',') {\n      return SSH_ERROR;\n  }\n\n  /* Strip the comma. */\n  methods_c[strlen(methods_c) - 1] = '\\0'; // strip the comma. We are sure there is at\n\n  SSH_LOG(SSH_LOG_PACKET,\n      \"Sending a auth failure. methods that can continue: %s\", methods_c);\n\n  rc = ssh_buffer_pack(session->out_buffer,\n                       \"bsb\",\n                       SSH2_MSG_USERAUTH_FAILURE,\n                       methods_c,\n                       partial ? 1 : 0);\n  if (rc != SSH_OK){\n      ssh_set_error_oom(session);\n      return SSH_ERROR;\n  }\n  rc = ssh_packet_send(session);\n  return rc;\n}\n\nstatic int ssh_message_channel_request_open_reply_default(ssh_message msg) {\n    int rc;\n\n    SSH_LOG(SSH_LOG_FUNCTIONS, \"Refusing a channel\");\n\n    rc = ssh_buffer_pack(msg->session->out_buffer,\n                         \"bdddd\",\n                         SSH2_MSG_CHANNEL_OPEN_FAILURE,\n                         msg->channel_request_open.sender,\n                         SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED,\n                         0,    /* reason is empty string */\n                         0);   /* language string */\n    if (rc != SSH_OK){\n        ssh_set_error_oom(msg->session);\n        return SSH_ERROR;\n    }\n\n    rc = ssh_packet_send(msg->session);\n    return rc;\n}\n\nstatic int ssh_message_channel_request_reply_default(ssh_message msg) {\n  uint32_t channel;\n  int rc;\n\n  if (msg->channel_request.want_reply) {\n    channel = msg->channel_request.channel->remote_channel;\n\n    SSH_LOG(SSH_LOG_PACKET,\n        \"Sending a default channel_request denied to channel %d\", channel);\n\n    rc = ssh_buffer_pack(msg->session->out_buffer,\n                         \"bd\",\n                         SSH2_MSG_CHANNEL_FAILURE,\n                         channel);\n    if (rc != SSH_OK){\n        ssh_set_error_oom(msg->session);\n        return SSH_ERROR;\n    }\n    return ssh_packet_send(msg->session);\n  }\n\n  SSH_LOG(SSH_LOG_PACKET,\n      \"The client doesn't want to know the request failed!\");\n\n  return SSH_OK;\n}\n\nstatic int ssh_message_service_request_reply_default(ssh_message msg) {\n  /* The only return code accepted by specifications are success or disconnect */\n  return ssh_message_service_reply_success(msg);\n}\n\nint ssh_message_service_reply_success(ssh_message msg) {\n    ssh_session session;\n    int rc;\n\n    if (msg == NULL) {\n        return SSH_ERROR;\n    }\n    session = msg->session;\n\n    SSH_LOG(SSH_LOG_PACKET,\n            \"Sending a SERVICE_ACCEPT for service %s\", msg->service_request.service);\n\n    rc = ssh_buffer_pack(session->out_buffer,\n                         \"bs\",\n                         SSH2_MSG_SERVICE_ACCEPT,\n                         msg->service_request.service);\n    if (rc != SSH_OK){\n        ssh_set_error_oom(session);\n        return SSH_ERROR;\n    }\n    rc = ssh_packet_send(msg->session);\n    return rc;\n}\n\nint ssh_message_global_request_reply_success(ssh_message msg, uint16_t bound_port) {\n    int rc;\n\n    SSH_LOG(SSH_LOG_FUNCTIONS, \"Accepting a global request\");\n\n    if (msg->global_request.want_reply) {\n        if (ssh_buffer_add_u8(msg->session->out_buffer\n                    , SSH2_MSG_REQUEST_SUCCESS) < 0) {\n            goto error;\n        }\n\n        if(msg->global_request.type == SSH_GLOBAL_REQUEST_TCPIP_FORWARD \n                                && msg->global_request.bind_port == 0) {\n            rc = ssh_buffer_pack(msg->session->out_buffer, \"d\", bound_port);\n            if (rc != SSH_OK) {\n                ssh_set_error_oom(msg->session);\n                goto error;\n            }\n        }\n\n        return ssh_packet_send(msg->session);\n    }\n\n    if(msg->global_request.type == SSH_GLOBAL_REQUEST_TCPIP_FORWARD \n                                && msg->global_request.bind_port == 0) {\n        SSH_LOG(SSH_LOG_PACKET,\n                \"The client doesn't want to know the remote port!\");\n    }\n\n    return SSH_OK;\nerror:\n    return SSH_ERROR;\n}\n\nstatic int ssh_message_global_request_reply_default(ssh_message msg) {\n    SSH_LOG(SSH_LOG_FUNCTIONS, \"Refusing a global request\");\n\n    if (msg->global_request.want_reply) {\n        if (ssh_buffer_add_u8(msg->session->out_buffer\n                    , SSH2_MSG_REQUEST_FAILURE) < 0) {\n            goto error;\n        }\n        return ssh_packet_send(msg->session);\n    }\n    SSH_LOG(SSH_LOG_PACKET,\n            \"The client doesn't want to know the request failed!\");\n\n    return SSH_OK;\nerror:\n    return SSH_ERROR;\n}\n\nint ssh_message_reply_default(ssh_message msg) {\n  if (msg == NULL) {\n    return -1;\n  }\n\n  switch(msg->type) {\n    case SSH_REQUEST_AUTH:\n      return ssh_auth_reply_default(msg->session, 0);\n    case SSH_REQUEST_CHANNEL_OPEN:\n      return ssh_message_channel_request_open_reply_default(msg);\n    case SSH_REQUEST_CHANNEL:\n      return ssh_message_channel_request_reply_default(msg);\n    case SSH_REQUEST_SERVICE:\n      return ssh_message_service_request_reply_default(msg);\n    case SSH_REQUEST_GLOBAL:\n      return ssh_message_global_request_reply_default(msg);\n    default:\n      SSH_LOG(SSH_LOG_PACKET,\n          \"Don't know what to default reply to %d type\",\n          msg->type);\n      break;\n  }\n\n  return -1;\n}\n\nconst char *ssh_message_service_service(ssh_message msg){\n  if (msg == NULL) {\n    return NULL;\n  }\n  return msg->service_request.service;\n}\n\nconst char *ssh_message_auth_user(ssh_message msg) {\n  if (msg == NULL) {\n    return NULL;\n  }\n\n  return msg->auth_request.username;\n}\n\nconst char *ssh_message_auth_password(ssh_message msg){\n  if (msg == NULL) {\n    return NULL;\n  }\n\n  return msg->auth_request.password;\n}\n\nssh_key ssh_message_auth_pubkey(ssh_message msg) {\n  if (msg == NULL) {\n    return NULL;\n  }\n\n  return msg->auth_request.pubkey;\n}\n\n/* Get the publickey of an auth request */\nssh_public_key ssh_message_auth_publickey(ssh_message msg){\n  if (msg == NULL) {\n    return NULL;\n  }\n\n  return ssh_pki_convert_key_to_publickey(msg->auth_request.pubkey);\n}\n\nenum ssh_publickey_state_e ssh_message_auth_publickey_state(ssh_message msg){\n\tif (msg == NULL) {\n\t    return -1;\n\t  }\n\t  return msg->auth_request.signature_state;\n}\n\nint ssh_message_auth_kbdint_is_response(ssh_message msg) {\n  if (msg == NULL) {\n    return -1;\n  }\n\n  return msg->auth_request.kbdint_response != 0;\n}\n\n/* FIXME: methods should be unsigned */\nint ssh_message_auth_set_methods(ssh_message msg, int methods) {\n  if (msg == NULL || msg->session == NULL) {\n    return -1;\n  }\n\n  if (methods < 0) {\n      return -1;\n  }\n\n  msg->session->auth.supported_methods = (uint32_t)methods;\n\n  return 0;\n}\n\nint ssh_message_auth_interactive_request(ssh_message msg, const char *name,\n                            const char *instruction, unsigned int num_prompts,\n                            const char **prompts, char *echo) {\n  int rc;\n  unsigned int i = 0;\n\n  if(name == NULL || instruction == NULL) {\n    return SSH_ERROR;\n  }\n  if(num_prompts > 0 && (prompts == NULL || echo == NULL)) {\n    return SSH_ERROR;\n  }\n\n  rc = ssh_buffer_pack(msg->session->out_buffer,\n                       \"bsssd\",\n                       SSH2_MSG_USERAUTH_INFO_REQUEST,\n                       name,\n                       instruction,\n                       \"\",           /* language tag */\n                       num_prompts);\n  if (rc != SSH_OK){\n    ssh_set_error_oom(msg->session);\n    return SSH_ERROR;\n  }\n\n  for(i = 0; i < num_prompts; i++) {\n    rc = ssh_buffer_pack(msg->session->out_buffer,\n                         \"sb\",\n                         prompts[i],\n                         echo[i] ? 1 : 0);\n    if (rc != SSH_OK){\n        ssh_set_error_oom(msg->session);\n        return SSH_ERROR;\n    }\n  }\n\n  rc = ssh_packet_send(msg->session);\n\n  /* fill in the kbdint structure */\n  if (msg->session->kbdint == NULL) {\n    SSH_LOG(SSH_LOG_PROTOCOL, \"Warning: Got a \"\n                                        \"keyboard-interactive response but it \"\n                                        \"seems we didn't send the request.\");\n\n    msg->session->kbdint = ssh_kbdint_new();\n    if (msg->session->kbdint == NULL) {\n      ssh_set_error_oom(msg->session);\n\n      return SSH_ERROR;\n    }\n  } else {\n    ssh_kbdint_clean(msg->session->kbdint);\n  }\n\n  msg->session->kbdint->name = strdup(name);\n  if(msg->session->kbdint->name == NULL) {\n      ssh_set_error_oom(msg->session);\n      ssh_kbdint_free(msg->session->kbdint);\n      msg->session->kbdint = NULL;\n      return SSH_PACKET_USED;\n  }\n  msg->session->kbdint->instruction = strdup(instruction);\n  if(msg->session->kbdint->instruction == NULL) {\n      ssh_set_error_oom(msg->session);\n      ssh_kbdint_free(msg->session->kbdint);\n      msg->session->kbdint = NULL;\n      return SSH_PACKET_USED;\n  }\n\n  msg->session->kbdint->nprompts = num_prompts;\n  if(num_prompts > 0) {\n    msg->session->kbdint->prompts = calloc(num_prompts, sizeof(char *));\n    if (msg->session->kbdint->prompts == NULL) {\n      msg->session->kbdint->nprompts = 0;\n      ssh_set_error_oom(msg->session);\n      ssh_kbdint_free(msg->session->kbdint);\n      msg->session->kbdint = NULL;\n      return SSH_ERROR;\n    }\n    msg->session->kbdint->echo = calloc(num_prompts, sizeof(unsigned char));\n    if (msg->session->kbdint->echo == NULL) {\n      ssh_set_error_oom(msg->session);\n      ssh_kbdint_free(msg->session->kbdint);\n      msg->session->kbdint = NULL;\n      return SSH_ERROR;\n    }\n    for (i = 0; i < num_prompts; i++) {\n      msg->session->kbdint->echo[i] = echo[i];\n      msg->session->kbdint->prompts[i] = strdup(prompts[i]);\n      if (msg->session->kbdint->prompts[i] == NULL) {\n        ssh_set_error_oom(msg->session);\n        msg->session->kbdint->nprompts = i;\n        ssh_kbdint_free(msg->session->kbdint);\n        msg->session->kbdint = NULL;\n        return SSH_PACKET_USED;\n      }\n    }\n  } else {\n    msg->session->kbdint->prompts = NULL;\n    msg->session->kbdint->echo = NULL;\n  }\n  msg->session->auth.state = SSH_AUTH_STATE_INFO;\n\n  return rc;\n}\n\nint ssh_auth_reply_success(ssh_session session, int partial)\n{\n    struct ssh_crypto_struct *crypto = NULL;\n    int r;\n\n    if (session == NULL) {\n        return SSH_ERROR;\n    }\n\n    if (partial) {\n        return ssh_auth_reply_default(session, partial);\n    }\n\n    r = ssh_buffer_add_u8(session->out_buffer,SSH2_MSG_USERAUTH_SUCCESS);\n    if (r < 0) {\n        return SSH_ERROR;\n    }\n\n    r = ssh_packet_send(session);\n\n    /*\n     * Consider the session as having been authenticated only after sending\n     * the USERAUTH_SUCCESS message.  Setting these flags after ssh_packet_send\n     * ensures that a rekey is not triggered prematurely, causing the message\n     * to be queued.\n     */\n    session->session_state = SSH_SESSION_STATE_AUTHENTICATED;\n    session->flags |= SSH_SESSION_FLAG_AUTHENTICATED;\n\n    crypto = ssh_packet_get_current_crypto(session, SSH_DIRECTION_OUT);\n    if (crypto != NULL && crypto->delayed_compress_out) {\n        SSH_LOG(SSH_LOG_PROTOCOL, \"Enabling delayed compression OUT\");\n        crypto->do_compress_out = 1;\n    }\n\n    crypto = ssh_packet_get_current_crypto(session, SSH_DIRECTION_IN);\n    if (crypto != NULL && crypto->delayed_compress_in) {\n        SSH_LOG(SSH_LOG_PROTOCOL, \"Enabling delayed compression IN\");\n        crypto->do_compress_in = 1;\n    }\n    return r;\n}\n\nint ssh_message_auth_reply_success(ssh_message msg, int partial) {\n\tif(msg == NULL)\n\t\treturn SSH_ERROR;\n\treturn ssh_auth_reply_success(msg->session, partial);\n}\n\n/* Answer OK to a pubkey auth request */\nint ssh_message_auth_reply_pk_ok(ssh_message msg, ssh_string algo, ssh_string pubkey) {\n    int rc;\n    if (msg == NULL) {\n        return SSH_ERROR;\n    }\n\n    rc = ssh_buffer_pack(msg->session->out_buffer,\n                         \"bSS\",\n                         SSH2_MSG_USERAUTH_PK_OK,\n                         algo,\n                         pubkey);\n    if(rc != SSH_OK){\n        ssh_set_error_oom(msg->session);\n        return SSH_ERROR;\n    }\n\n    rc = ssh_packet_send(msg->session);\n    return rc;\n}\n\nint ssh_message_auth_reply_pk_ok_simple(ssh_message msg) {\n    ssh_string algo;\n    ssh_string pubkey_blob = NULL;\n    int ret;\n\n    algo = ssh_string_from_char(msg->auth_request.pubkey->type_c);\n    if (algo == NULL) {\n        return SSH_ERROR;\n    }\n\n    ret = ssh_pki_export_pubkey_blob(msg->auth_request.pubkey, &pubkey_blob);\n    if (ret < 0) {\n        SSH_STRING_FREE(algo);\n        return SSH_ERROR;\n    }\n\n    ret = ssh_message_auth_reply_pk_ok(msg, algo, pubkey_blob);\n\n    SSH_STRING_FREE(algo);\n    SSH_STRING_FREE(pubkey_blob);\n\n    return ret;\n}\n\n\nconst char *ssh_message_channel_request_open_originator(ssh_message msg){\n    return msg->channel_request_open.originator;\n}\n\nint ssh_message_channel_request_open_originator_port(ssh_message msg){\n    return msg->channel_request_open.originator_port;\n}\n\nconst char *ssh_message_channel_request_open_destination(ssh_message msg){\n    return msg->channel_request_open.destination;\n}\n\nint ssh_message_channel_request_open_destination_port(ssh_message msg){\n    return msg->channel_request_open.destination_port;\n}\n\nssh_channel ssh_message_channel_request_channel(ssh_message msg){\n    return msg->channel_request.channel;\n}\n\nconst char *ssh_message_channel_request_pty_term(ssh_message msg){\n    return msg->channel_request.TERM;\n}\n\nint ssh_message_channel_request_pty_width(ssh_message msg){\n    return msg->channel_request.width;\n}\n\nint ssh_message_channel_request_pty_height(ssh_message msg){\n    return msg->channel_request.height;\n}\n\nint ssh_message_channel_request_pty_pxwidth(ssh_message msg){\n    return msg->channel_request.pxwidth;\n}\n\nint ssh_message_channel_request_pty_pxheight(ssh_message msg){\n    return msg->channel_request.pxheight;\n}\n\nconst char *ssh_message_channel_request_env_name(ssh_message msg){\n    return msg->channel_request.var_name;\n}\n\nconst char *ssh_message_channel_request_env_value(ssh_message msg){\n    return msg->channel_request.var_value;\n}\n\nconst char *ssh_message_channel_request_command(ssh_message msg){\n    return msg->channel_request.command;\n}\n\nconst char *ssh_message_channel_request_subsystem(ssh_message msg){\n    return msg->channel_request.subsystem;\n}\n\nint ssh_message_channel_request_x11_single_connection(ssh_message msg){\n    return msg->channel_request.x11_single_connection ? 1 : 0;\n}\n\nconst char *ssh_message_channel_request_x11_auth_protocol(ssh_message msg){\n    return msg->channel_request.x11_auth_protocol;\n}\n\nconst char *ssh_message_channel_request_x11_auth_cookie(ssh_message msg){\n    return msg->channel_request.x11_auth_cookie;\n}\n\nint ssh_message_channel_request_x11_screen_number(ssh_message msg){\n    return msg->channel_request.x11_screen_number;\n}\n\nconst char *ssh_message_global_request_address(ssh_message msg){\n    return msg->global_request.bind_address;\n}\n\nint ssh_message_global_request_port(ssh_message msg){\n    return msg->global_request.bind_port;\n}\n\n/** @brief defines the ssh_message callback\n * @param session the current ssh session\n * @param[in] ssh_bind_message_callback a function pointer to a callback taking the\n * current ssh session and received message as parameters. the function returns\n * 0 if the message has been parsed and treated successfully, 1 otherwise (libssh\n * must take care of the response).\n * @param[in] data void pointer to be passed to callback functions\n */\nvoid ssh_set_message_callback(ssh_session session,\n        int(*ssh_bind_message_callback)(ssh_session session, ssh_message msg, void *data),\n        void *data) {\n  session->ssh_message_callback = ssh_bind_message_callback;\n  session->ssh_message_callback_data = data;\n}\n\nint ssh_execute_message_callbacks(ssh_session session){\n  ssh_message msg=NULL;\n  int ret;\n  ssh_handle_packets(session, SSH_TIMEOUT_NONBLOCKING);\n  if(!session->ssh_message_list)\n    return SSH_OK;\n  if(session->ssh_message_callback){\n    while((msg=ssh_message_pop_head(session)) != NULL) {\n      ret=session->ssh_message_callback(session,msg,\n                                        session->ssh_message_callback_data);\n      if(ret==1){\n        ret = ssh_message_reply_default(msg);\n        ssh_message_free(msg);\n        if(ret != SSH_OK)\n          return ret;\n      } else {\n        ssh_message_free(msg);\n      }\n    }\n  } else {\n    while((msg=ssh_message_pop_head(session)) != NULL) {\n      ret = ssh_message_reply_default(msg);\n      ssh_message_free(msg);\n      if(ret != SSH_OK)\n        return ret;\n    }\n  }\n  return SSH_OK;\n}\n\nint ssh_send_keepalive(ssh_session session)\n{\n    /* Client denies the request, so the error code is not meaningful */\n    (void)ssh_global_request(session, \"keepalive@openssh.com\", NULL, 1);\n\n    return SSH_OK;\n}\n\n/** @} */\n"
  },
  {
    "path": "src/libssh/src/session.c",
    "content": "/*\n * session.c - non-networking functions\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2005-2013 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <string.h>\n#include <stdlib.h>\n\n#include \"libssh/priv.h\"\n#include \"libssh/libssh.h\"\n#include \"libssh/crypto.h\"\n#include \"libssh/server.h\"\n#include \"libssh/socket.h\"\n#include \"libssh/ssh2.h\"\n#include \"libssh/agent.h\"\n#include \"libssh/packet.h\"\n#include \"libssh/session.h\"\n#include \"libssh/misc.h\"\n#include \"libssh/buffer.h\"\n#include \"libssh/poll.h\"\n#include \"libssh/pki.h\"\n\n#define FIRST_CHANNEL 42 // why not ? it helps to find bugs.\n\n/**\n * @defgroup libssh_session The SSH session functions.\n * @ingroup libssh\n *\n * Functions that manage a session.\n *\n * @{\n */\n\n/**\n * @brief Create a new ssh session.\n *\n * @returns             A new ssh_session pointer, NULL on error.\n */\nssh_session ssh_new(void)\n{\n    ssh_session session;\n    char *id = NULL;\n    int rc;\n\n    session = calloc(1, sizeof (struct ssh_session_struct));\n    if (session == NULL) {\n        return NULL;\n    }\n\n    session->next_crypto = crypto_new();\n    if (session->next_crypto == NULL) {\n        goto err;\n    }\n\n    session->socket = ssh_socket_new(session);\n    if (session->socket == NULL) {\n        goto err;\n    }\n\n    session->out_buffer = ssh_buffer_new();\n    if (session->out_buffer == NULL) {\n        goto err;\n    }\n\n    session->in_buffer = ssh_buffer_new();\n    if (session->in_buffer == NULL) {\n        goto err;\n    }\n\n    session->out_queue = ssh_list_new();\n    if (session->out_queue == NULL) {\n        goto err;\n    }\n\n    session->alive = 0;\n    session->auth.supported_methods = 0;\n    ssh_set_blocking(session, 1);\n    session->maxchannel = FIRST_CHANNEL;\n\n    session->agent = ssh_agent_new(session);\n    if (session->agent == NULL) {\n        goto err;\n    }\n\n    /* OPTIONS */\n    session->opts.StrictHostKeyChecking = 1;\n    session->opts.port = 0;\n    session->opts.fd = -1;\n    session->opts.compressionlevel = 7;\n    session->opts.nodelay = 0;\n\n    session->opts.flags = SSH_OPT_FLAG_PASSWORD_AUTH |\n                          SSH_OPT_FLAG_PUBKEY_AUTH |\n                          SSH_OPT_FLAG_KBDINT_AUTH |\n                          SSH_OPT_FLAG_GSSAPI_AUTH;\n\n    session->opts.identity = ssh_list_new();\n    if (session->opts.identity == NULL) {\n        goto err;\n    }\n\n    id = strdup(\"%d/id_ed25519\");\n    if (id == NULL) {\n        goto err;\n    }\n\n    rc = ssh_list_append(session->opts.identity, id);\n    if (rc == SSH_ERROR) {\n        goto err;\n    }\n\n#ifdef HAVE_ECC\n    id = strdup(\"%d/id_ecdsa\");\n    if (id == NULL) {\n        goto err;\n    }\n    rc = ssh_list_append(session->opts.identity, id);\n    if (rc == SSH_ERROR) {\n        goto err;\n    }\n#endif\n\n    id = strdup(\"%d/id_rsa\");\n    if (id == NULL) {\n        goto err;\n    }\n    rc = ssh_list_append(session->opts.identity, id);\n    if (rc == SSH_ERROR) {\n        goto err;\n    }\n\n#ifdef HAVE_DSA\n    id = strdup(\"%d/id_dsa\");\n    if (id == NULL) {\n        goto err;\n    }\n    rc = ssh_list_append(session->opts.identity, id);\n    if (rc == SSH_ERROR) {\n        goto err;\n    }\n#endif\n\n    /* Explicitly initialize states */\n    session->session_state = SSH_SESSION_STATE_NONE;\n    session->pending_call_state = SSH_PENDING_CALL_NONE;\n    session->packet_state = PACKET_STATE_INIT;\n    session->dh_handshake_state = DH_STATE_INIT;\n    session->global_req_state = SSH_CHANNEL_REQ_STATE_NONE;\n\n    session->auth.state = SSH_AUTH_STATE_NONE;\n    session->auth.service_state = SSH_AUTH_SERVICE_NONE;\n\n    return session;\n\nerr:\n    free(id);\n    ssh_free(session);\n    return NULL;\n}\n\n/**\n * @brief Deallocate a SSH session handle.\n *\n * @param[in] session   The SSH session to free.\n *\n * @see ssh_disconnect()\n * @see ssh_new()\n */\nvoid ssh_free(ssh_session session)\n{\n  int i;\n  struct ssh_iterator *it = NULL;\n  struct ssh_buffer_struct *b = NULL;\n\n  if (session == NULL) {\n    return;\n  }\n\n  /*\n   * Delete all channels\n   *\n   * This needs the first thing we clean up cause if there is still an open\n   * channel we call ssh_channel_close() first. So we need a working socket\n   * and poll context for it.\n   */\n  for (it = ssh_list_get_iterator(session->channels);\n       it != NULL;\n       it = ssh_list_get_iterator(session->channels)) {\n      ssh_channel_do_free(ssh_iterator_value(ssh_channel,it));\n      ssh_list_remove(session->channels, it);\n  }\n  ssh_list_free(session->channels);\n  session->channels = NULL;\n\n#ifdef WITH_PCAP\n  if (session->pcap_ctx) {\n      ssh_pcap_context_free(session->pcap_ctx);\n      session->pcap_ctx = NULL;\n  }\n#endif\n\n  ssh_socket_free(session->socket);\n  session->socket = NULL;\n\n  if (session->default_poll_ctx) {\n      ssh_poll_ctx_free(session->default_poll_ctx);\n  }\n\n  SSH_BUFFER_FREE(session->in_buffer);\n  SSH_BUFFER_FREE(session->out_buffer);\n  session->in_buffer = session->out_buffer = NULL;\n\n  if (session->in_hashbuf != NULL) {\n      SSH_BUFFER_FREE(session->in_hashbuf);\n  }\n  if (session->out_hashbuf != NULL) {\n      SSH_BUFFER_FREE(session->out_hashbuf);\n  }\n\n  crypto_free(session->current_crypto);\n  crypto_free(session->next_crypto);\n\n  ssh_agent_free(session->agent);\n\n  ssh_key_free(session->srv.dsa_key);\n  session->srv.dsa_key = NULL;\n  ssh_key_free(session->srv.rsa_key);\n  session->srv.rsa_key = NULL;\n  ssh_key_free(session->srv.ecdsa_key);\n  session->srv.ecdsa_key = NULL;\n  ssh_key_free(session->srv.ed25519_key);\n  session->srv.ed25519_key = NULL;\n\n  if (session->ssh_message_list) {\n      ssh_message msg;\n\n      for (msg = ssh_list_pop_head(ssh_message, session->ssh_message_list);\n           msg != NULL;\n           msg = ssh_list_pop_head(ssh_message, session->ssh_message_list)) {\n          ssh_message_free(msg);\n      }\n      ssh_list_free(session->ssh_message_list);\n  }\n\n  if (session->kbdint != NULL) {\n    ssh_kbdint_free(session->kbdint);\n  }\n\n  if (session->packet_callbacks) {\n    ssh_list_free(session->packet_callbacks);\n  }\n\n  /* options */\n  if (session->opts.identity) {\n      char *id;\n\n      for (id = ssh_list_pop_head(char *, session->opts.identity);\n           id != NULL;\n           id = ssh_list_pop_head(char *, session->opts.identity)) {\n          SAFE_FREE(id);\n      }\n      ssh_list_free(session->opts.identity);\n  }\n\n    while ((b = ssh_list_pop_head(struct ssh_buffer_struct *,\n                                  session->out_queue)) != NULL) {\n        SSH_BUFFER_FREE(b);\n    }\n    ssh_list_free(session->out_queue);\n\n  ssh_agent_state_free (session->agent_state);\n  session->agent_state = NULL;\n\n  SAFE_FREE(session->auth.auto_state);\n  SAFE_FREE(session->serverbanner);\n  SAFE_FREE(session->clientbanner);\n  SAFE_FREE(session->banner);\n\n  SAFE_FREE(session->opts.bindaddr);\n  SAFE_FREE(session->opts.custombanner);\n  SAFE_FREE(session->opts.username);\n  SAFE_FREE(session->opts.host);\n  SAFE_FREE(session->opts.proxy_host);\n  SAFE_FREE(session->opts.sshdir);\n  SAFE_FREE(session->opts.knownhosts);\n  SAFE_FREE(session->opts.global_knownhosts);\n  SAFE_FREE(session->opts.ProxyCommand);\n  SAFE_FREE(session->opts.gss_server_identity);\n  SAFE_FREE(session->opts.gss_client_identity);\n  SAFE_FREE(session->opts.pubkey_accepted_types);\n\n  for (i = 0; i < SSH_KEX_METHODS; i++) {\n      if (session->opts.wanted_methods[i]) {\n          SAFE_FREE(session->opts.wanted_methods[i]);\n      }\n  }\n\n  /* burn connection, it could contain sensitive data */\n  explicit_bzero(session, sizeof(struct ssh_session_struct));\n  SAFE_FREE(session);\n}\n\n/**\n * @brief get the client banner\n *\n * @param[in] session   The SSH session\n *\n * @return Returns the client banner string or NULL.\n */\nconst char* ssh_get_clientbanner(ssh_session session) {\n    if (session == NULL) {\n        return NULL;\n    }\n\n    return session->clientbanner;\n}\n\n/**\n * @brief get the server banner\n *\n * @param[in] session   The SSH session\n *\n * @return Returns the server banner string or NULL.\n */\nconst char* ssh_get_serverbanner(ssh_session session) {\n\tif(!session) {\n\t\treturn NULL;\n\t}\n\treturn session->serverbanner;\n}\n\n/**\n * @brief get the name of the current key exchange algorithm.\n *\n * @param[in] session   The SSH session\n *\n * @return Returns the key exchange algorithm string or NULL.\n */\nconst char* ssh_get_kex_algo(ssh_session session) {\n    if ((session == NULL) ||\n        (session->current_crypto == NULL)) {\n        return NULL;\n    }\n\n    switch (session->current_crypto->kex_type) {\n        case SSH_KEX_DH_GROUP1_SHA1:\n            return \"diffie-hellman-group1-sha1\";\n        case SSH_KEX_DH_GROUP14_SHA1:\n            return \"diffie-hellman-group14-sha1\";\n        case SSH_KEX_DH_GROUP14_SHA256:\n            return \"diffie-hellman-group14-sha256\";\n        case SSH_KEX_DH_GROUP16_SHA512:\n            return \"diffie-hellman-group16-sha512\";\n        case SSH_KEX_DH_GROUP18_SHA512:\n            return \"diffie-hellman-group18-sha512\";\n        case SSH_KEX_ECDH_SHA2_NISTP256:\n            return \"ecdh-sha2-nistp256\";\n        case SSH_KEX_ECDH_SHA2_NISTP384:\n            return \"ecdh-sha2-nistp384\";\n        case SSH_KEX_ECDH_SHA2_NISTP521:\n            return \"ecdh-sha2-nistp521\";\n        case SSH_KEX_CURVE25519_SHA256:\n           return \"curve25519-sha256\";\n        case SSH_KEX_CURVE25519_SHA256_LIBSSH_ORG:\n            return \"curve25519-sha256@libssh.org\";\n        default:\n            break;\n    }\n\n    return NULL;\n}\n\n/**\n * @brief get the name of the input cipher for the given session.\n *\n * @param[in] session The SSH session.\n *\n * @return Returns cipher name or NULL.\n */\nconst char* ssh_get_cipher_in(ssh_session session) {\n    if ((session != NULL) &&\n        (session->current_crypto != NULL) &&\n        (session->current_crypto->in_cipher != NULL)) {\n        return session->current_crypto->in_cipher->name;\n    }\n    return NULL;\n}\n\n/**\n * @brief get the name of the output cipher for the given session.\n *\n * @param[in] session The SSH session.\n *\n * @return Returns cipher name or NULL.\n */\nconst char* ssh_get_cipher_out(ssh_session session) {\n    if ((session != NULL) &&\n        (session->current_crypto != NULL) &&\n        (session->current_crypto->out_cipher != NULL)) {\n        return session->current_crypto->out_cipher->name;\n    }\n    return NULL;\n}\n\n/**\n * @brief get the name of the input HMAC algorithm for the given session.\n *\n * @param[in] session The SSH session.\n *\n * @return Returns HMAC algorithm name or NULL if unknown.\n */\nconst char* ssh_get_hmac_in(ssh_session session) {\n    if ((session != NULL) &&\n        (session->current_crypto != NULL)) {\n        return ssh_hmac_type_to_string(session->current_crypto->in_hmac, session->current_crypto->in_hmac_etm);\n    }\n    return NULL;\n}\n\n/**\n * @brief get the name of the output HMAC algorithm for the given session.\n *\n * @param[in] session The SSH session.\n *\n * @return Returns HMAC algorithm name or NULL if unknown.\n */\nconst char* ssh_get_hmac_out(ssh_session session) {\n    if ((session != NULL) &&\n        (session->current_crypto != NULL)) {\n        return ssh_hmac_type_to_string(session->current_crypto->out_hmac, session->current_crypto->out_hmac_etm);\n    }\n    return NULL;\n}\n\n/**\n * @brief Disconnect impolitely from a remote host by closing the socket.\n *\n * Suitable if you forked and want to destroy this session.\n *\n * @param[in]  session  The SSH session to disconnect.\n */\nvoid ssh_silent_disconnect(ssh_session session) {\n  if (session == NULL) {\n    return;\n  }\n\n  ssh_socket_close(session->socket);\n  session->alive = 0;\n  ssh_disconnect(session);\n}\n\n/**\n * @brief Set the session in blocking/nonblocking mode.\n *\n * @param[in]  session  The ssh session to change.\n *\n * @param[in]  blocking Zero for nonblocking mode.\n */\nvoid ssh_set_blocking(ssh_session session, int blocking)\n{\n    if (session == NULL) {\n        return;\n    }\n    session->flags &= ~SSH_SESSION_FLAG_BLOCKING;\n    session->flags |= blocking ? SSH_SESSION_FLAG_BLOCKING : 0;\n}\n\n/**\n * @brief Return the blocking mode of libssh\n * @param[in] session The SSH session\n * @returns 0 if the session is nonblocking,\n * @returns 1 if the functions may block.\n */\nint ssh_is_blocking(ssh_session session)\n{\n    return (session->flags & SSH_SESSION_FLAG_BLOCKING) ? 1 : 0;\n}\n\n/* Waits until the output socket is empty */\nstatic int ssh_flush_termination(void *c){\n  ssh_session session = c;\n  if (ssh_socket_buffered_write_bytes(session->socket) == 0 ||\n      session->session_state == SSH_SESSION_STATE_ERROR)\n    return 1;\n  else\n    return 0;\n}\n\n/**\n * @brief Blocking flush of the outgoing buffer\n * @param[in] session The SSH session\n * @param[in] timeout Set an upper limit on the time for which this function\n *                    will block, in milliseconds. Specifying -1\n *                    means an infinite timeout. This parameter is passed to\n *                    the poll() function.\n * @returns           SSH_OK on success, SSH_AGAIN if timeout occurred,\n *                    SSH_ERROR otherwise.\n */\n\nint ssh_blocking_flush(ssh_session session, int timeout){\n    int rc;\n    if (session == NULL) {\n        return SSH_ERROR;\n    }\n\n    rc = ssh_handle_packets_termination(session, timeout,\n            ssh_flush_termination, session);\n    if (rc == SSH_ERROR) {\n        return rc;\n    }\n    if (!ssh_flush_termination(session)) {\n        rc = SSH_AGAIN;\n    }\n\n    return rc;\n}\n\n/**\n * @brief Check if we are connected.\n *\n * @param[in]  session  The session to check if it is connected.\n *\n * @return              1 if we are connected, 0 if not.\n */\nint ssh_is_connected(ssh_session session) {\n    if (session == NULL) {\n        return 0;\n    }\n\n    return session->alive;\n}\n\n/**\n * @brief Get the fd of a connection.\n *\n * In case you'd need the file descriptor of the connection to the server/client.\n *\n * @param[in] session   The ssh session to use.\n *\n * @return              The file descriptor of the connection, or -1 if it is\n *                      not connected\n */\nsocket_t ssh_get_fd(ssh_session session) {\n  if (session == NULL) {\n    return -1;\n  }\n\n  return ssh_socket_get_fd(session->socket);\n}\n\n/**\n * @brief Tell the session it has data to read on the file descriptor without\n * blocking.\n *\n * @param[in] session   The ssh session to use.\n */\nvoid ssh_set_fd_toread(ssh_session session) {\n  if (session == NULL) {\n    return;\n  }\n\n  ssh_socket_set_read_wontblock(session->socket);\n}\n\n/**\n * @brief Tell the session it may write to the file descriptor without blocking.\n *\n * @param[in] session   The ssh session to use.\n */\nvoid ssh_set_fd_towrite(ssh_session session) {\n  if (session == NULL) {\n    return;\n  }\n\n  ssh_socket_set_write_wontblock(session->socket);\n}\n\n/**\n * @brief Tell the session it has an exception to catch on the file descriptor.\n *\n * \\param[in] session   The ssh session to use.\n */\nvoid ssh_set_fd_except(ssh_session session) {\n  if (session == NULL) {\n    return;\n  }\n\n  ssh_socket_set_except(session->socket);\n}\n\n/**\n * @internal\n *\n * @brief Poll the current session for an event and call the appropriate\n * callbacks. This function will not loop until the timeout is expired.\n *\n * This will block until one event happens.\n *\n * @param[in] session   The session handle to use.\n *\n * @param[in] timeout   Set an upper limit on the time for which this function\n *                      will block, in milliseconds. Specifying SSH_TIMEOUT_INFINITE\n *                      (-1) means an infinite timeout.\n *                      Specifying SSH_TIMEOUT_USER means to use the timeout\n *                      specified in options. 0 means poll will return immediately.\n *                      This parameter is passed to the poll() function.\n *\n * @return              SSH_OK on success, SSH_ERROR otherwise.\n */\nint ssh_handle_packets(ssh_session session, int timeout) {\n    ssh_poll_handle spoll;\n    ssh_poll_ctx ctx;\n    int tm = timeout;\n    int rc;\n\n    if (session == NULL || session->socket == NULL) {\n        return SSH_ERROR;\n    }\n\n    spoll = ssh_socket_get_poll_handle(session->socket);\n    ssh_poll_add_events(spoll, POLLIN);\n    ctx = ssh_poll_get_ctx(spoll);\n\n    if (!ctx) {\n        ctx = ssh_poll_get_default_ctx(session);\n        ssh_poll_ctx_add(ctx, spoll);\n    }\n\n    if (timeout == SSH_TIMEOUT_USER) {\n        if (ssh_is_blocking(session))\n          tm = ssh_make_milliseconds(session->opts.timeout,\n                                     session->opts.timeout_usec);\n        else\n          tm = 0;\n    }\n    rc = ssh_poll_ctx_dopoll(ctx, tm);\n    if (rc == SSH_ERROR) {\n        session->session_state = SSH_SESSION_STATE_ERROR;\n    }\n\n    return rc;\n}\n\n/**\n * @internal\n *\n * @brief Poll the current session for an event and call the appropriate\n * callbacks.\n *\n * This will block until termination function returns true, or timeout expired.\n *\n * @param[in] session   The session handle to use.\n *\n * @param[in] timeout   Set an upper limit on the time for which this function\n *                      will block, in milliseconds. Specifying\n *                      SSH_TIMEOUT_INFINITE (-1) means an infinite timeout.\n *                      Specifying SSH_TIMEOUT_USER means to use the timeout\n *                      specified in options. 0 means poll will return\n *                      immediately.\n *                      SSH_TIMEOUT_DEFAULT uses the session timeout if set or\n *                      uses blocking parameters of the session.\n *                      This parameter is passed to the poll() function.\n *\n * @param[in] fct       Termination function to be used to determine if it is\n *                      possible to stop polling.\n * @param[in] user      User parameter to be passed to fct termination function.\n * @returns             SSH_OK on success, SSH_AGAIN if timeout occurred,\n *                      SSH_ERROR otherwise.\n */\nint ssh_handle_packets_termination(ssh_session session,\n                                   long timeout,\n                                   ssh_termination_function fct,\n                                   void *user)\n{\n    struct ssh_timestamp ts;\n    long timeout_ms = SSH_TIMEOUT_INFINITE;\n    long tm;\n    int ret = SSH_OK;\n\n    /* If a timeout has been provided, use it */\n    if (timeout >= 0) {\n        timeout_ms = timeout;\n    } else {\n        if (ssh_is_blocking(session)) {\n            if (timeout == SSH_TIMEOUT_USER || timeout == SSH_TIMEOUT_DEFAULT) {\n                if (session->opts.timeout > 0 ||\n                    session->opts.timeout_usec > 0) {\n                    timeout_ms =\n                        ssh_make_milliseconds(session->opts.timeout,\n                                              session->opts.timeout_usec);\n                }\n            }\n        } else {\n            timeout_ms = SSH_TIMEOUT_NONBLOCKING;\n        }\n    }\n\n    /* avoid unnecessary syscall for the SSH_TIMEOUT_NONBLOCKING case */\n    if (timeout_ms != SSH_TIMEOUT_NONBLOCKING) {\n        ssh_timestamp_init(&ts);\n    }\n\n    tm = timeout_ms;\n    while(!fct(user)) {\n        ret = ssh_handle_packets(session, tm);\n        if (ret == SSH_ERROR) {\n            break;\n        }\n        if (ssh_timeout_elapsed(&ts, timeout_ms)) {\n            ret = fct(user) ? SSH_OK : SSH_AGAIN;\n            break;\n        }\n\n        tm = ssh_timeout_update(&ts, timeout_ms);\n    }\n\n    return ret;\n}\n\n/**\n * @brief Get session status\n *\n * @param session       The ssh session to use.\n *\n * @returns A bitmask including SSH_CLOSED, SSH_READ_PENDING, SSH_WRITE_PENDING\n *          or SSH_CLOSED_ERROR which respectively means the session is closed,\n *          has data to read on the connection socket and session was closed\n *          due to an error.\n */\nint ssh_get_status(ssh_session session) {\n  int socketstate;\n  int r = 0;\n\n  if (session == NULL) {\n    return 0;\n  }\n\n  socketstate = ssh_socket_get_status(session->socket);\n\n  if (session->session_state == SSH_SESSION_STATE_DISCONNECTED) {\n    r |= SSH_CLOSED;\n  }\n  if (socketstate & SSH_READ_PENDING) {\n    r |= SSH_READ_PENDING;\n  }\n  if (socketstate & SSH_WRITE_PENDING) {\n      r |= SSH_WRITE_PENDING;\n  }\n  if ((session->session_state == SSH_SESSION_STATE_DISCONNECTED &&\n       (socketstate & SSH_CLOSED_ERROR)) ||\n      session->session_state == SSH_SESSION_STATE_ERROR) {\n    r |= SSH_CLOSED_ERROR;\n  }\n\n  return r;\n}\n\n/**\n * @brief Get poll flags for an external mainloop\n *\n * @param session       The ssh session to use.\n *\n * @returns A bitmask including SSH_READ_PENDING or SSH_WRITE_PENDING.\n *          For SSH_READ_PENDING, your invocation of poll() should include\n *          POLLIN.  For SSH_WRITE_PENDING, your invocation of poll() should\n *          include POLLOUT.\n */\nint ssh_get_poll_flags(ssh_session session)\n{\n  if (session == NULL) {\n    return 0;\n  }\n\n  return ssh_socket_get_poll_flags (session->socket);\n}\n\n/**\n * @brief Get the disconnect message from the server.\n *\n * @param[in] session   The ssh session to use.\n *\n * @return              The message sent by the server along with the\n *                      disconnect, or NULL in which case the reason of the\n *                      disconnect may be found with ssh_get_error.\n *\n * @see ssh_get_error()\n */\nconst char *ssh_get_disconnect_message(ssh_session session) {\n  if (session == NULL) {\n    return NULL;\n  }\n\n  if (session->session_state != SSH_SESSION_STATE_DISCONNECTED) {\n    ssh_set_error(session, SSH_REQUEST_DENIED,\n        \"Connection not closed yet\");\n  } else if(!session->discon_msg) {\n    ssh_set_error(session, SSH_FATAL,\n        \"Connection correctly closed but no disconnect message\");\n  } else {\n    return session->discon_msg;\n  }\n\n  return NULL;\n}\n\n/**\n * @brief Get the protocol version of the session.\n *\n * @param session       The ssh session to use.\n *\n * @return The SSH version as integer, < 0 on error.\n */\nint ssh_get_version(ssh_session session) {\n    if (session == NULL) {\n        return -1;\n    }\n\n    return 2;\n}\n\n/**\n * @internal\n * @brief Callback to be called when the socket received an exception code.\n * @param user is a pointer to session\n */\nvoid ssh_socket_exception_callback(int code, int errno_code, void *user){\n    ssh_session session=(ssh_session)user;\n\n    SSH_LOG(SSH_LOG_RARE,\"Socket exception callback: %d (%d)\",code, errno_code);\n    session->session_state = SSH_SESSION_STATE_ERROR;\n    if (errno_code == 0 && code == SSH_SOCKET_EXCEPTION_EOF) {\n        ssh_set_error(session, SSH_FATAL, \"Socket error: disconnected\");\n    } else {\n        ssh_set_error(session, SSH_FATAL, \"Socket error: %s\", strerror(errno_code));\n    }\n\n    session->ssh_connection_callback(session);\n}\n\n/**\n * @brief Send a message that should be ignored\n *\n * @param[in] session   The SSH session\n * @param[in] data      Data to be sent\n *\n * @return              SSH_OK on success, SSH_ERROR otherwise.\n */\nint ssh_send_ignore (ssh_session session, const char *data) {\n    const int type = SSH2_MSG_IGNORE;\n    int rc;\n\n    if (ssh_socket_is_open(session->socket)) {\n        rc = ssh_buffer_pack(session->out_buffer,\n                             \"bs\",\n                             type,\n                             data);\n        if (rc != SSH_OK){\n            ssh_set_error_oom(session);\n            goto error;\n        }\n        ssh_packet_send(session);\n        ssh_handle_packets(session, 0);\n    }\n\n    return SSH_OK;\n\nerror:\n    ssh_buffer_reinit(session->out_buffer);\n    return SSH_ERROR;\n}\n\n/**\n * @brief Send a debug message\n *\n * @param[in] session          The SSH session\n * @param[in] message          Data to be sent\n * @param[in] always_display   Message SHOULD be displayed by the server. It\n *                             SHOULD NOT be displayed unless debugging\n *                             information has been explicitly requested.\n *\n * @return                     SSH_OK on success, SSH_ERROR otherwise.\n */\nint ssh_send_debug (ssh_session session, const char *message, int always_display) {\n    int rc;\n\n    if (ssh_socket_is_open(session->socket)) {\n        rc = ssh_buffer_pack(session->out_buffer,\n                             \"bbsd\",\n                             SSH2_MSG_DEBUG,\n                             always_display != 0 ? 1 : 0,\n                             message,\n                             0); /* empty language tag */\n        if (rc != SSH_OK) {\n            ssh_set_error_oom(session);\n            goto error;\n        }\n        ssh_packet_send(session);\n        ssh_handle_packets(session, 0);\n    }\n\n    return SSH_OK;\n\nerror:\n    ssh_buffer_reinit(session->out_buffer);\n    return SSH_ERROR;\n}\n\n /**\n * @brief Set the session data counters.\n *\n * This functions sets the counter structures to be used to calculate data\n * which comes in and goes out through the session at different levels.\n *\n * @code\n * struct ssh_counter_struct scounter = {\n *     .in_bytes = 0,\n *     .out_bytes = 0,\n *     .in_packets = 0,\n *     .out_packets = 0\n * };\n *\n * struct ssh_counter_struct rcounter = {\n *     .in_bytes = 0,\n *     .out_bytes = 0,\n *     .in_packets = 0,\n *     .out_packets = 0\n * };\n *\n * ssh_set_counters(session, &scounter, &rcounter);\n * @endcode\n *\n * @param[in] session   The SSH session.\n *\n * @param[in] scounter  Counter for byte data handled by the session sockets.\n *\n * @param[in] rcounter  Counter for byte and packet data handled by the session,\n *                      prior compression and SSH overhead.\n */\nvoid ssh_set_counters(ssh_session session, ssh_counter scounter,\n                              ssh_counter rcounter) {\n    if (session != NULL) {\n        session->socket_counter = scounter;\n        session->raw_counter = rcounter;\n    }\n}\n\n/**\n * @deprecated Use ssh_get_publickey_hash()\n */\nint ssh_get_pubkey_hash(ssh_session session, unsigned char **hash)\n{\n    ssh_key pubkey = NULL;\n    ssh_string pubkey_blob = NULL;\n    MD5CTX ctx;\n    unsigned char *h;\n    int rc;\n\n    if (session == NULL || hash == NULL) {\n        return SSH_ERROR;\n    }\n\n    /* In FIPS mode, we cannot use MD5 */\n    if (ssh_fips_mode()) {\n        ssh_set_error(session,\n                      SSH_FATAL,\n                      \"In FIPS mode MD5 is not allowed.\"\n                      \"Try ssh_get_publickey_hash() with\"\n                      \"SSH_PUBLICKEY_HASH_SHA256\");\n        return SSH_ERROR;\n    }\n\n    *hash = NULL;\n    if (session->current_crypto == NULL ||\n        session->current_crypto->server_pubkey == NULL) {\n        ssh_set_error(session,SSH_FATAL,\"No current cryptographic context\");\n        return SSH_ERROR;\n    }\n\n    h = calloc(MD5_DIGEST_LEN, sizeof(unsigned char));\n    if (h == NULL) {\n        return SSH_ERROR;\n    }\n\n    ctx = md5_init();\n    if (ctx == NULL) {\n        SAFE_FREE(h);\n        return SSH_ERROR;\n    }\n\n    rc = ssh_get_server_publickey(session, &pubkey);\n    if (rc != SSH_OK) {\n        md5_final(h, ctx);\n        SAFE_FREE(h);\n        return SSH_ERROR;\n    }\n\n    rc = ssh_pki_export_pubkey_blob(pubkey, &pubkey_blob);\n    ssh_key_free(pubkey);\n    if (rc != SSH_OK) {\n        md5_final(h, ctx);\n        SAFE_FREE(h);\n        return SSH_ERROR;\n    }\n\n    md5_update(ctx, ssh_string_data(pubkey_blob), ssh_string_len(pubkey_blob));\n    SSH_STRING_FREE(pubkey_blob);\n    md5_final(h, ctx);\n\n    *hash = h;\n\n    return MD5_DIGEST_LEN;\n}\n\n/**\n * @brief Deallocate the hash obtained by ssh_get_pubkey_hash.\n *\n * This is required under Microsoft platform as this library might use a \n * different C library than your software, hence a different heap.\n *\n * @param[in] hash      The buffer to deallocate.\n *\n * @see ssh_get_pubkey_hash()\n */\nvoid ssh_clean_pubkey_hash(unsigned char **hash) {\n    SAFE_FREE(*hash);\n}\n\n/**\n * @brief Get the server public key from a session.\n *\n * @param[in]  session  The session to get the key from.\n *\n * @param[out] key      A pointer to store the allocated key. You need to free\n *                      the key.\n *\n * @return              SSH_OK on success, SSH_ERROR on errror.\n *\n * @see ssh_key_free()\n */\nint ssh_get_server_publickey(ssh_session session, ssh_key *key)\n{\n    ssh_key pubkey = NULL;\n\n    if (session == NULL ||\n        session->current_crypto == NULL ||\n        session->current_crypto->server_pubkey == NULL) {\n        return SSH_ERROR;\n    }\n\n    pubkey = ssh_key_dup(session->current_crypto->server_pubkey);\n    if (pubkey == NULL) {\n        return SSH_ERROR;\n    }\n\n    *key = pubkey;\n    return SSH_OK;\n}\n\n/**\n * @deprecated Use ssh_get_server_publickey()\n */\nint ssh_get_publickey(ssh_session session, ssh_key *key)\n{\n    return ssh_get_server_publickey(session, key);\n}\n\n/**\n * @brief Allocates a buffer with the hash of the public key.\n *\n * This function allows you to get a hash of the public key. You can then\n * print this hash in a human-readable form to the user so that he is able to\n * verify it. Use ssh_get_hexa() or ssh_print_hash() to display it.\n *\n * @param[in]  key      The public key to create the hash for.\n *\n * @param[in]  type     The type of the hash you want.\n *\n * @param[in]  hash     A pointer to store the allocated buffer. It can be\n *                      freed using ssh_clean_pubkey_hash().\n *\n * @param[in]  hlen     The length of the hash.\n *\n * @return 0 on success, -1 if an error occured.\n *\n * @warning It is very important that you verify at some moment that the hash\n *          matches a known server. If you don't do it, cryptography wont help\n *          you at making things secure.\n *          OpenSSH uses SHA256 to print public key digests.\n *\n * @see ssh_session_update_known_hosts()\n * @see ssh_get_hexa()\n * @see ssh_print_hash()\n * @see ssh_clean_pubkey_hash()\n */\nint ssh_get_publickey_hash(const ssh_key key,\n                           enum ssh_publickey_hash_type type,\n                           unsigned char **hash,\n                           size_t *hlen)\n{\n    ssh_string blob;\n    unsigned char *h;\n    int rc;\n\n    rc = ssh_pki_export_pubkey_blob(key, &blob);\n    if (rc < 0) {\n        return rc;\n    }\n\n    switch (type) {\n    case SSH_PUBLICKEY_HASH_SHA1:\n        {\n            SHACTX ctx;\n\n            h = calloc(1, SHA_DIGEST_LEN);\n            if (h == NULL) {\n                rc = -1;\n                goto out;\n            }\n\n            ctx = sha1_init();\n            if (ctx == NULL) {\n                free(h);\n                rc = -1;\n                goto out;\n            }\n\n            sha1_update(ctx, ssh_string_data(blob), ssh_string_len(blob));\n            sha1_final(h, ctx);\n\n            *hlen = SHA_DIGEST_LEN;\n        }\n        break;\n    case SSH_PUBLICKEY_HASH_SHA256:\n        {\n            SHA256CTX ctx;\n\n            h = calloc(1, SHA256_DIGEST_LEN);\n            if (h == NULL) {\n                rc = -1;\n                goto out;\n            }\n\n            ctx = sha256_init();\n            if (ctx == NULL) {\n                free(h);\n                rc = -1;\n                goto out;\n            }\n\n            sha256_update(ctx, ssh_string_data(blob), ssh_string_len(blob));\n            sha256_final(h, ctx);\n\n            *hlen = SHA256_DIGEST_LEN;\n        }\n        break;\n    case SSH_PUBLICKEY_HASH_MD5:\n        {\n            MD5CTX ctx;\n\n            /* In FIPS mode, we cannot use MD5 */\n            if (ssh_fips_mode()) {\n                SSH_LOG(SSH_LOG_WARN, \"In FIPS mode MD5 is not allowed.\"\n                                      \"Try using SSH_PUBLICKEY_HASH_SHA256\");\n                rc = SSH_ERROR;\n                goto out;\n            }\n\n            h = calloc(1, MD5_DIGEST_LEN);\n            if (h == NULL) {\n                rc = -1;\n                goto out;\n            }\n\n            ctx = md5_init();\n            if (ctx == NULL) {\n                free(h);\n                rc = -1;\n                goto out;\n            }\n\n            md5_update(ctx, ssh_string_data(blob), ssh_string_len(blob));\n            md5_final(h, ctx);\n\n            *hlen = MD5_DIGEST_LEN;\n        }\n        break;\n    default:\n        rc = -1;\n        goto out;\n    }\n\n    *hash = h;\n    rc = 0;\nout:\n    SSH_STRING_FREE(blob);\n    return rc;\n}\n\n/** @} */\n"
  },
  {
    "path": "src/libssh/src/sftp.c",
    "content": "/*\n * sftp.c - Secure FTP functions\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2005-2008 by Aris Adamantiadis\n * Copyright (c) 2008-2018 by Andreas Schneider <asn@cryptomilk.org>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n/* This file contains code written by Nick Zitzmann */\n\n#include \"config.h\"\n\n#include <stdbool.h>\n#include <errno.h>\n#include <ctype.h>\n#include <fcntl.h>\n#include <stdio.h>\n#include <stdint.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <limits.h>\n\n#ifndef _WIN32\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#endif\n\n#include \"libssh/priv.h\"\n#include \"libssh/ssh2.h\"\n#include \"libssh/sftp.h\"\n#include \"libssh/sftp_priv.h\"\n#include \"libssh/buffer.h\"\n#include \"libssh/channels.h\"\n#include \"libssh/session.h\"\n#include \"libssh/misc.h\"\n#include \"libssh/bytearray.h\"\n\n#ifdef WITH_SFTP\n\n/* Buffer size maximum is 256M */\n#define SFTP_PACKET_SIZE_MAX 0x10000000\n#define SFTP_BUFFER_SIZE_MAX 16384\n\nstruct sftp_ext_struct {\n  uint32_t count;\n  char **name;\n  char **data;\n};\n\n/* functions */\nstatic int sftp_enqueue(sftp_session session, sftp_message msg);\nstatic void sftp_message_free(sftp_message msg);\nstatic void sftp_set_error(sftp_session sftp, int errnum);\nstatic void status_msg_free(sftp_status_message status);\n\nstatic sftp_ext sftp_ext_new(void) {\n  sftp_ext ext;\n\n  ext = calloc(1, sizeof(struct sftp_ext_struct));\n  if (ext == NULL) {\n    return NULL;\n  }\n\n  return ext;\n}\n\nstatic void sftp_ext_free(sftp_ext ext)\n{\n    size_t i;\n\n    if (ext == NULL) {\n        return;\n    }\n\n    if (ext->count > 0) {\n        if (ext->name != NULL) {\n            for (i = 0; i < ext->count; i++) {\n                SAFE_FREE(ext->name[i]);\n            }\n            SAFE_FREE(ext->name);\n        }\n\n        if (ext->data != NULL) {\n            for (i = 0; i < ext->count; i++) {\n                SAFE_FREE(ext->data[i]);\n            }\n            SAFE_FREE(ext->data);\n        }\n    }\n\n    SAFE_FREE(ext);\n}\n\nsftp_session sftp_new(ssh_session session)\n{\n    sftp_session sftp;\n\n    if (session == NULL) {\n        return NULL;\n    }\n\n    sftp = calloc(1, sizeof(struct sftp_session_struct));\n    if (sftp == NULL) {\n        ssh_set_error_oom(session);\n\n        return NULL;\n    }\n\n    sftp->ext = sftp_ext_new();\n    if (sftp->ext == NULL) {\n        ssh_set_error_oom(session);\n        goto error;\n    }\n\n    sftp->read_packet = calloc(1, sizeof(struct sftp_packet_struct));\n    if (sftp->read_packet == NULL) {\n        ssh_set_error_oom(session);\n        goto error;\n    }\n\n    sftp->read_packet->payload = ssh_buffer_new();\n    if (sftp->read_packet->payload == NULL) {\n        ssh_set_error_oom(session);\n        goto error;\n    }\n\n    sftp->session = session;\n    sftp->channel = ssh_channel_new(session);\n    if (sftp->channel == NULL) {\n        ssh_set_error_oom(session);\n        goto error;\n    }\n\n    if (ssh_channel_open_session(sftp->channel)) {\n        goto error;\n    }\n\n    if (ssh_channel_request_sftp(sftp->channel)) {\n        goto error;\n    }\n\n    return sftp;\nerror:\n    if (sftp->ext != NULL) {\n        sftp_ext_free(sftp->ext);\n    }\n    if (sftp->channel != NULL) {\n        ssh_channel_free(sftp->channel);\n    }\n    if (sftp->read_packet != NULL) {\n        if (sftp->read_packet->payload != NULL) {\n            SSH_BUFFER_FREE(sftp->read_packet->payload);\n        }\n        SAFE_FREE(sftp->read_packet);\n    }\n    SAFE_FREE(sftp);\n    return NULL;\n}\n\nsftp_session sftp_new_channel(ssh_session session, ssh_channel channel){\n  sftp_session sftp;\n\n  if (session == NULL) {\n    return NULL;\n  }\n\n  sftp = calloc(1, sizeof(struct sftp_session_struct));\n  if (sftp == NULL) {\n    ssh_set_error_oom(session);\n\n    return NULL;\n  }\n\n  sftp->ext = sftp_ext_new();\n  if (sftp->ext == NULL) {\n    ssh_set_error_oom(session);\n    SAFE_FREE(sftp);\n\n    return NULL;\n  }\n\n  sftp->session = session;\n  sftp->channel = channel;\n\n  return sftp;\n}\n\n#ifdef WITH_SERVER\nsftp_session sftp_server_new(ssh_session session, ssh_channel chan){\n  sftp_session sftp = NULL;\n\n  sftp = calloc(1, sizeof(struct sftp_session_struct));\n  if (sftp == NULL) {\n    ssh_set_error_oom(session);\n    return NULL;\n  }\n\n  sftp->read_packet = calloc(1, sizeof(struct sftp_packet_struct));\n  if (sftp->read_packet == NULL) {\n    goto error;\n  }\n\n  sftp->read_packet->payload = ssh_buffer_new();\n  if (sftp->read_packet->payload == NULL) {\n    goto error;\n  }\n\n  sftp->session = session;\n  sftp->channel = chan;\n\n  return sftp;\n\nerror:\n  ssh_set_error_oom(session);\n  if (sftp->read_packet != NULL) {\n    if (sftp->read_packet->payload != NULL) {\n      SSH_BUFFER_FREE(sftp->read_packet->payload);\n    }\n    SAFE_FREE(sftp->read_packet);\n  }\n  SAFE_FREE(sftp);\n  return NULL;\n}\n\nint sftp_server_init(sftp_session sftp){\n  ssh_session session = sftp->session;\n  sftp_packet packet = NULL;\n  ssh_buffer reply = NULL;\n  uint32_t version;\n  int rc;\n\n  packet = sftp_packet_read(sftp);\n  if (packet == NULL) {\n    return -1;\n  }\n\n  if (packet->type != SSH_FXP_INIT) {\n    ssh_set_error(session, SSH_FATAL,\n        \"Packet read of type %d instead of SSH_FXP_INIT\",\n        packet->type);\n\n    return -1;\n  }\n\n  SSH_LOG(SSH_LOG_PACKET, \"Received SSH_FXP_INIT\");\n\n  ssh_buffer_get_u32(packet->payload, &version);\n  version = ntohl(version);\n  SSH_LOG(SSH_LOG_PACKET, \"Client version: %d\", version);\n  sftp->client_version = (int)version;\n\n  reply = ssh_buffer_new();\n  if (reply == NULL) {\n    ssh_set_error_oom(session);\n    return -1;\n  }\n\n  rc = ssh_buffer_pack(reply, \"dssss\",\n                      LIBSFTP_VERSION,\n                      \"posix-rename@openssh.com\",\n                      \"1\",\n                      \"hardlink@openssh.com\",\n                      \"1\");\n  if (rc != SSH_OK) {\n    ssh_set_error_oom(session);\n    SSH_BUFFER_FREE(reply);\n    return -1;\n  }\n\n  if (sftp_packet_write(sftp, SSH_FXP_VERSION, reply) < 0) {\n    SSH_BUFFER_FREE(reply);\n    return -1;\n  }\n  SSH_BUFFER_FREE(reply);\n\n  SSH_LOG(SSH_LOG_PROTOCOL, \"Server version sent\");\n\n  if (version > LIBSFTP_VERSION) {\n    sftp->version = LIBSFTP_VERSION;\n  } else {\n    sftp->version = (int)version;\n  }\n\n  return 0;\n}\n\nvoid sftp_server_free(sftp_session sftp)\n{\n    sftp_request_queue ptr;\n\n    if (sftp == NULL) {\n        return;\n    }\n\n    ptr = sftp->queue;\n    while(ptr) {\n        sftp_request_queue old;\n        sftp_message_free(ptr->message);\n        old = ptr->next;\n        SAFE_FREE(ptr);\n        ptr = old;\n    }\n\n    SAFE_FREE(sftp->handles);\n    SSH_BUFFER_FREE(sftp->read_packet->payload);\n    SAFE_FREE(sftp->read_packet);\n\n    sftp_ext_free(sftp->ext);\n\n    SAFE_FREE(sftp);\n}\n#endif /* WITH_SERVER */\n\nvoid sftp_free(sftp_session sftp)\n{\n    sftp_request_queue ptr;\n\n    if (sftp == NULL) {\n        return;\n    }\n\n    if (sftp->channel != NULL) {\n        ssh_channel_send_eof(sftp->channel);\n        ptr = sftp->queue;\n        while(ptr) {\n            sftp_request_queue old;\n            sftp_message_free(ptr->message);\n            old = ptr->next;\n            SAFE_FREE(ptr);\n            ptr = old;\n        }\n\n        ssh_channel_free(sftp->channel);\n        sftp->channel = NULL;\n    }\n\n    SAFE_FREE(sftp->handles);\n    SSH_BUFFER_FREE(sftp->read_packet->payload);\n    SAFE_FREE(sftp->read_packet);\n\n    sftp_ext_free(sftp->ext);\n\n    SAFE_FREE(sftp);\n}\n\nssize_t sftp_packet_write(sftp_session sftp, uint8_t type, ssh_buffer payload)\n{\n    uint8_t header[5] = {0};\n    uint32_t payload_size;\n    ssize_t size;\n    int rc;\n\n    /* Add size of type */\n    payload_size = ssh_buffer_get_len(payload) + sizeof(uint8_t);\n    PUSH_BE_U32(header, 0, payload_size);\n    PUSH_BE_U8(header, 4, type);\n\n    rc = ssh_buffer_prepend_data(payload, header, sizeof(header));\n    if (rc < 0) {\n        ssh_set_error_oom(sftp->session);\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        return -1;\n    }\n\n    size = ssh_channel_write(sftp->channel,\n                             ssh_buffer_get(payload),\n                             ssh_buffer_get_len(payload));\n    if (size < 0) {\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        return -1;\n    }\n\n    if ((uint32_t)size != ssh_buffer_get_len(payload)) {\n        SSH_LOG(SSH_LOG_PACKET,\n                \"Had to write %d bytes, wrote only %zd\",\n                ssh_buffer_get_len(payload),\n                size);\n    }\n\n    return size;\n}\n\nsftp_packet sftp_packet_read(sftp_session sftp)\n{\n    uint8_t buffer[SFTP_BUFFER_SIZE_MAX];\n    sftp_packet packet = sftp->read_packet;\n    uint32_t size;\n    int nread;\n    bool is_eof;\n    int rc;\n\n    packet->sftp = sftp;\n\n    /*\n     * If the packet has a payload, then just reinit the buffer, otherwise\n     * allocate a new one.\n     */\n    if (packet->payload != NULL) {\n        rc = ssh_buffer_reinit(packet->payload);\n        if (rc != 0) {\n            ssh_set_error_oom(sftp->session);\n            sftp_set_error(sftp, SSH_FX_FAILURE);\n            return NULL;\n        }\n    } else {\n        packet->payload = ssh_buffer_new();\n        if (packet->payload == NULL) {\n            ssh_set_error_oom(sftp->session);\n            sftp_set_error(sftp, SSH_FX_FAILURE);\n            return NULL;\n        }\n    }\n\n    nread = 0;\n    do {\n        int s;\n\n        // read from channel until 4 bytes have been read or an error occurs\n        s = ssh_channel_read(sftp->channel, buffer + nread, 4 - nread, 0);\n        if (s < 0) {\n            goto error;\n        } else if (s == 0) {\n            is_eof = ssh_channel_is_eof(sftp->channel);\n            if (is_eof) {\n                ssh_set_error(sftp->session,\n                              SSH_FATAL,\n                              \"Received EOF while reading sftp packet size\");\n                sftp_set_error(sftp, SSH_FX_EOF);\n                goto error;\n            }\n        } else {\n            nread += s;\n        }\n    } while (nread < 4);\n\n    size = PULL_BE_U32(buffer, 0);\n    if (size == 0 || size > SFTP_PACKET_SIZE_MAX) {\n        ssh_set_error(sftp->session, SSH_FATAL, \"Invalid sftp packet size!\");\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        goto error;\n    }\n\n    do {\n        nread = ssh_channel_read(sftp->channel, buffer, 1, 0);\n        if (nread < 0) {\n            goto error;\n        } else if (nread == 0) {\n            is_eof = ssh_channel_is_eof(sftp->channel);\n            if (is_eof) {\n                ssh_set_error(sftp->session,\n                              SSH_FATAL,\n                              \"Received EOF while reading sftp packet type\");\n                sftp_set_error(sftp, SSH_FX_EOF);\n                goto error;\n            }\n        }\n    } while (nread < 1);\n\n    packet->type = buffer[0];\n\n    /* Remove the packet type size */\n    size -= sizeof(uint8_t);\n\n    nread = ssh_buffer_allocate_size(packet->payload, size);\n    if (nread < 0) {\n        ssh_set_error_oom(sftp->session);\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        goto error;\n    }\n    while (size > 0 && size < SFTP_PACKET_SIZE_MAX) {\n        nread = ssh_channel_read(sftp->channel,\n                             buffer,\n                             sizeof(buffer) > size ? size : sizeof(buffer),\n                             0);\n        if (nread < 0) {\n            /* TODO: check if there are cases where an error needs to be set here */\n            goto error;\n        }\n\n        if (nread > 0) {\n            rc = ssh_buffer_add_data(packet->payload, buffer, nread);\n            if (rc != 0) {\n                ssh_set_error_oom(sftp->session);\n                sftp_set_error(sftp, SSH_FX_FAILURE);\n                goto error;\n            }\n        } else { /* nread == 0 */\n            /* Retry the reading unless the remote was closed */\n            is_eof = ssh_channel_is_eof(sftp->channel);\n            if (is_eof) {\n                ssh_set_error(sftp->session,\n                              SSH_REQUEST_DENIED,\n                              \"Received EOF while reading sftp packet\");\n                sftp_set_error(sftp, SSH_FX_EOF);\n                goto error;\n            }\n        }\n\n        size -= nread;\n    }\n\n    return packet;\nerror:\n    ssh_buffer_reinit(packet->payload);\n    return NULL;\n}\n\nstatic void sftp_set_error(sftp_session sftp, int errnum) {\n  if (sftp != NULL) {\n    sftp->errnum = errnum;\n  }\n}\n\n/* Get the last sftp error */\nint sftp_get_error(sftp_session sftp) {\n  if (sftp == NULL) {\n    return -1;\n  }\n\n  return sftp->errnum;\n}\n\nstatic void sftp_message_free(sftp_message msg)\n{\n    if (msg == NULL) {\n        return;\n    }\n\n    SSH_BUFFER_FREE(msg->payload);\n    SAFE_FREE(msg);\n}\n\nstatic sftp_message sftp_get_message(sftp_packet packet)\n{\n    sftp_session sftp = packet->sftp;\n    sftp_message msg = NULL;\n    int rc;\n\n    switch(packet->type) {\n    case SSH_FXP_STATUS:\n    case SSH_FXP_HANDLE:\n    case SSH_FXP_DATA:\n    case SSH_FXP_ATTRS:\n    case SSH_FXP_NAME:\n    case SSH_FXP_EXTENDED_REPLY:\n        break;\n    default:\n        ssh_set_error(packet->sftp->session,\n                      SSH_FATAL,\n                      \"Unknown packet type %d\",\n                      packet->type);\n        sftp_set_error(packet->sftp, SSH_FX_FAILURE);\n        return NULL;\n    }\n\n    msg = calloc(1, sizeof(struct sftp_message_struct));\n    if (msg == NULL) {\n        ssh_set_error_oom(sftp->session);\n        sftp_set_error(packet->sftp, SSH_FX_FAILURE);\n        return NULL;\n    }\n\n    msg->sftp = packet->sftp;\n    msg->packet_type = packet->type;\n\n    /* Move the payload from the packet to the message */\n    msg->payload = packet->payload;\n    packet->payload = NULL;\n\n    rc = ssh_buffer_unpack(msg->payload, \"d\", &msg->id);\n    if (rc != SSH_OK) {\n        ssh_set_error(packet->sftp->session, SSH_FATAL,\n                \"Invalid packet %d: no ID\", packet->type);\n        sftp_message_free(msg);\n        sftp_set_error(packet->sftp, SSH_FX_FAILURE);\n        return NULL;\n    }\n\n    SSH_LOG(SSH_LOG_PACKET,\n            \"Packet with id %d type %d\",\n            msg->id,\n            msg->packet_type);\n\n    return msg;\n}\n\nstatic int sftp_read_and_dispatch(sftp_session sftp)\n{\n    sftp_packet packet = NULL;\n    sftp_message msg = NULL;\n\n    packet = sftp_packet_read(sftp);\n    if (packet == NULL) {\n        /* something nasty happened reading the packet */\n        return -1;\n    }\n\n    msg = sftp_get_message(packet);\n    if (msg == NULL) {\n        return -1;\n    }\n\n    if (sftp_enqueue(sftp, msg) < 0) {\n        sftp_message_free(msg);\n        return -1;\n    }\n\n    return 0;\n}\n\nvoid sftp_packet_free(sftp_packet packet)\n{\n  if (packet == NULL) {\n    return;\n  }\n\n  SSH_BUFFER_FREE(packet->payload);\n  free(packet);\n}\n\n/* Initialize the sftp session with the server. */\nint sftp_init(sftp_session sftp) {\n  sftp_packet packet = NULL;\n  ssh_buffer buffer = NULL;\n  char *ext_name = NULL;\n  char *ext_data = NULL;\n  uint32_t version;\n  int rc;\n\n  buffer = ssh_buffer_new();\n  if (buffer == NULL) {\n    ssh_set_error_oom(sftp->session);\n    sftp_set_error(sftp, SSH_FX_FAILURE);\n    return -1;\n  }\n\n  rc = ssh_buffer_pack(buffer, \"d\", LIBSFTP_VERSION);\n  if (rc != SSH_OK) {\n    ssh_set_error_oom(sftp->session);\n    SSH_BUFFER_FREE(buffer);\n    sftp_set_error(sftp, SSH_FX_FAILURE);\n    return -1;\n  }\n  if (sftp_packet_write(sftp, SSH_FXP_INIT, buffer) < 0) {\n    SSH_BUFFER_FREE(buffer);\n    return -1;\n  }\n  SSH_BUFFER_FREE(buffer);\n\n  packet = sftp_packet_read(sftp);\n  if (packet == NULL) {\n    return -1;\n  }\n\n  if (packet->type != SSH_FXP_VERSION) {\n    ssh_set_error(sftp->session, SSH_FATAL,\n        \"Received a %d messages instead of SSH_FXP_VERSION\", packet->type);\n    return -1;\n  }\n\n  /* TODO: are we sure there are 4 bytes ready? */\n  rc = ssh_buffer_unpack(packet->payload, \"d\", &version);\n  if (rc != SSH_OK){\n      sftp_set_error(sftp, SSH_FX_FAILURE);\n      return -1;\n  }\n  SSH_LOG(SSH_LOG_PROTOCOL,\n      \"SFTP server version %d\",\n      version);\n  rc = ssh_buffer_unpack(packet->payload, \"s\", &ext_name);\n  while (rc == SSH_OK) {\n    uint32_t count = sftp->ext->count;\n    char **tmp;\n\n    rc = ssh_buffer_unpack(packet->payload, \"s\", &ext_data);\n    if (rc == SSH_ERROR) {\n      break;\n    }\n\n    SSH_LOG(SSH_LOG_PROTOCOL,\n        \"SFTP server extension: %s, version: %s\",\n        ext_name, ext_data);\n\n    count++;\n    tmp = realloc(sftp->ext->name, count * sizeof(char *));\n    if (tmp == NULL) {\n      ssh_set_error_oom(sftp->session);\n      SAFE_FREE(ext_name);\n      SAFE_FREE(ext_data);\n      sftp_set_error(sftp, SSH_FX_FAILURE);\n      return -1;\n    }\n    tmp[count - 1] = ext_name;\n    sftp->ext->name = tmp;\n\n    tmp = realloc(sftp->ext->data, count * sizeof(char *));\n    if (tmp == NULL) {\n      ssh_set_error_oom(sftp->session);\n      SAFE_FREE(ext_name);\n      SAFE_FREE(ext_data);\n      sftp_set_error(sftp, SSH_FX_FAILURE);\n      return -1;\n    }\n    tmp[count - 1] = ext_data;\n    sftp->ext->data = tmp;\n\n    sftp->ext->count = count;\n\n    rc = ssh_buffer_unpack(packet->payload, \"s\", &ext_name);\n  }\n\n  sftp->version = sftp->server_version = (int)version;\n\n\n  return 0;\n}\n\nunsigned int sftp_extensions_get_count(sftp_session sftp) {\n  if (sftp == NULL || sftp->ext == NULL) {\n    return 0;\n  }\n\n  return sftp->ext->count;\n}\n\nconst char *sftp_extensions_get_name(sftp_session sftp, unsigned int idx) {\n  if (sftp == NULL)\n    return NULL;\n  if (sftp->ext == NULL || sftp->ext->name == NULL) {\n    ssh_set_error_invalid(sftp->session);\n    return NULL;\n  }\n\n  if (idx > sftp->ext->count) {\n    ssh_set_error_invalid(sftp->session);\n    return NULL;\n  }\n\n  return sftp->ext->name[idx];\n}\n\nconst char *sftp_extensions_get_data(sftp_session sftp, unsigned int idx) {\n  if (sftp == NULL)\n    return NULL;\n  if (sftp->ext == NULL || sftp->ext->name == NULL) {\n    ssh_set_error_invalid(sftp->session);\n    return NULL;\n  }\n\n  if (idx > sftp->ext->count) {\n    ssh_set_error_invalid(sftp->session);\n    return NULL;\n  }\n\n  return sftp->ext->data[idx];\n}\n\nint sftp_extension_supported(sftp_session sftp, const char *name,\n    const char *data) {\n  size_t i, n;\n\n  if (sftp == NULL || name == NULL || data == NULL) {\n    return 0;\n  }\n\n  n = sftp_extensions_get_count(sftp);\n  for (i = 0; i < n; i++) {\n    const char *ext_name = sftp_extensions_get_name(sftp, i);\n    const char *ext_data = sftp_extensions_get_data(sftp, i);\n\n    if (ext_name != NULL && ext_data != NULL &&\n        strcmp(ext_name, name) == 0 &&\n        strcmp(ext_data, data) == 0) {\n      return 1;\n    }\n  }\n\n  return 0;\n}\n\nstatic sftp_request_queue request_queue_new(sftp_message msg) {\n  sftp_request_queue queue = NULL;\n\n  queue = calloc(1, sizeof(struct sftp_request_queue_struct));\n  if (queue == NULL) {\n    ssh_set_error_oom(msg->sftp->session);\n    sftp_set_error(msg->sftp, SSH_FX_FAILURE);\n    return NULL;\n  }\n\n  queue->message = msg;\n\n  return queue;\n}\n\nstatic void request_queue_free(sftp_request_queue queue) {\n  if (queue == NULL) {\n    return;\n  }\n\n  ZERO_STRUCTP(queue);\n  SAFE_FREE(queue);\n}\n\nstatic int sftp_enqueue(sftp_session sftp, sftp_message msg) {\n  sftp_request_queue queue = NULL;\n  sftp_request_queue ptr;\n\n  queue = request_queue_new(msg);\n  if (queue == NULL) {\n    return -1;\n  }\n\n  SSH_LOG(SSH_LOG_PACKET,\n      \"Queued msg id %d type %d\",\n      msg->id, msg->packet_type);\n\n  if(sftp->queue == NULL) {\n    sftp->queue = queue;\n  } else {\n    ptr = sftp->queue;\n    while(ptr->next) {\n      ptr=ptr->next; /* find end of linked list */\n    }\n    ptr->next = queue; /* add it on bottom */\n  }\n\n  return 0;\n}\n\n/*\n * Pulls of a message from the queue based on the ID.\n * Returns NULL if no message has been found.\n */\nstatic sftp_message sftp_dequeue(sftp_session sftp, uint32_t id){\n  sftp_request_queue prev = NULL;\n  sftp_request_queue queue;\n  sftp_message msg;\n\n  if(sftp->queue == NULL) {\n    return NULL;\n  }\n\n  queue = sftp->queue;\n  while (queue) {\n    if(queue->message->id == id) {\n      /* remove from queue */\n      if (prev == NULL) {\n        sftp->queue = queue->next;\n      } else {\n        prev->next = queue->next;\n      }\n      msg = queue->message;\n      request_queue_free(queue);\n      SSH_LOG(SSH_LOG_PACKET,\n          \"Dequeued msg id %d type %d\",\n          msg->id,\n          msg->packet_type);\n      return msg;\n    }\n    prev = queue;\n    queue = queue->next;\n  }\n\n  return NULL;\n}\n\n/*\n * Assigns a new SFTP ID for new requests and assures there is no collision\n * between them.\n * Returns a new ID ready to use in a request\n */\nstatic inline uint32_t sftp_get_new_id(sftp_session session) {\n  return ++session->id_counter;\n}\n\nstatic sftp_status_message parse_status_msg(sftp_message msg){\n  sftp_status_message status;\n  int rc;\n\n  if (msg->packet_type != SSH_FXP_STATUS) {\n    ssh_set_error(msg->sftp->session, SSH_FATAL,\n        \"Not a ssh_fxp_status message passed in!\");\n    sftp_set_error(msg->sftp, SSH_FX_BAD_MESSAGE);\n    return NULL;\n  }\n\n  status = calloc(1, sizeof(struct sftp_status_message_struct));\n  if (status == NULL) {\n    ssh_set_error_oom(msg->sftp->session);\n    sftp_set_error(msg->sftp, SSH_FX_FAILURE);\n    return NULL;\n  }\n\n  status->id = msg->id;\n  rc = ssh_buffer_unpack(msg->payload, \"d\",\n          &status->status);\n  if (rc != SSH_OK){\n    SAFE_FREE(status);\n    ssh_set_error(msg->sftp->session, SSH_FATAL,\n        \"Invalid SSH_FXP_STATUS message\");\n    sftp_set_error(msg->sftp, SSH_FX_FAILURE);\n    return NULL;\n  }\n  rc = ssh_buffer_unpack(msg->payload, \"ss\",\n          &status->errormsg,\n          &status->langmsg);\n\n  if(rc != SSH_OK && msg->sftp->version >=3){\n      /* These are mandatory from version 3 */\n      SAFE_FREE(status);\n      ssh_set_error(msg->sftp->session, SSH_FATAL,\n        \"Invalid SSH_FXP_STATUS message\");\n      sftp_set_error(msg->sftp, SSH_FX_FAILURE);\n      return NULL;\n  }\n  if (status->errormsg == NULL)\n    status->errormsg = strdup(\"No error message in packet\");\n  if (status->langmsg == NULL)\n    status->langmsg = strdup(\"\");\n  if (status->errormsg == NULL || status->langmsg == NULL) {\n    ssh_set_error_oom(msg->sftp->session);\n    sftp_set_error(msg->sftp, SSH_FX_FAILURE);\n    status_msg_free(status);\n    return NULL;\n  }\n\n  return status;\n}\n\nstatic void status_msg_free(sftp_status_message status){\n  if (status == NULL) {\n    return;\n  }\n\n  SAFE_FREE(status->errormsg);\n  SAFE_FREE(status->langmsg);\n  SAFE_FREE(status);\n}\n\nstatic sftp_file parse_handle_msg(sftp_message msg){\n  sftp_file file;\n\n  if(msg->packet_type != SSH_FXP_HANDLE) {\n    ssh_set_error(msg->sftp->session, SSH_FATAL,\n        \"Not a ssh_fxp_handle message passed in!\");\n    return NULL;\n  }\n\n  file = calloc(1, sizeof(struct sftp_file_struct));\n  if (file == NULL) {\n    ssh_set_error_oom(msg->sftp->session);\n    sftp_set_error(msg->sftp, SSH_FX_FAILURE);\n    return NULL;\n  }\n\n  file->handle = ssh_buffer_get_ssh_string(msg->payload);\n  if (file->handle == NULL) {\n    ssh_set_error(msg->sftp->session, SSH_FATAL,\n        \"Invalid SSH_FXP_HANDLE message\");\n    SAFE_FREE(file);\n    sftp_set_error(msg->sftp, SSH_FX_FAILURE);\n    return NULL;\n  }\n\n  file->sftp = msg->sftp;\n  file->offset = 0;\n  file->eof = 0;\n\n  return file;\n}\n\n/* Open a directory */\nsftp_dir sftp_opendir(sftp_session sftp, const char *path)\n{\n    sftp_message msg = NULL;\n    sftp_file file = NULL;\n    sftp_dir dir = NULL;\n    sftp_status_message status;\n    ssh_buffer payload;\n    uint32_t id;\n    int rc;\n\n    if (sftp == NULL) {\n        return NULL;\n    }\n\n    payload = ssh_buffer_new();\n    if (payload == NULL) {\n        ssh_set_error_oom(sftp->session);\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        return NULL;\n    }\n\n    id = sftp_get_new_id(sftp);\n\n    rc = ssh_buffer_pack(payload,\n                         \"ds\",\n                         id,\n                         path);\n    if (rc != SSH_OK) {\n        ssh_set_error_oom(sftp->session);\n        SSH_BUFFER_FREE(payload);\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        return NULL;\n    }\n\n    rc = sftp_packet_write(sftp, SSH_FXP_OPENDIR, payload);\n    SSH_BUFFER_FREE(payload);\n    if (rc < 0) {\n        return NULL;\n    }\n\n    while (msg == NULL) {\n        if (sftp_read_and_dispatch(sftp) < 0) {\n            /* something nasty has happened */\n            return NULL;\n        }\n        msg = sftp_dequeue(sftp, id);\n    }\n\n    switch (msg->packet_type) {\n        case SSH_FXP_STATUS:\n            status = parse_status_msg(msg);\n            sftp_message_free(msg);\n            if (status == NULL) {\n                return NULL;\n            }\n            sftp_set_error(sftp, status->status);\n            ssh_set_error(sftp->session, SSH_REQUEST_DENIED,\n                    \"SFTP server: %s\", status->errormsg);\n            status_msg_free(status);\n            return NULL;\n        case SSH_FXP_HANDLE:\n            file = parse_handle_msg(msg);\n            sftp_message_free(msg);\n            if (file != NULL) {\n                dir = calloc(1, sizeof(struct sftp_dir_struct));\n                if (dir == NULL) {\n                    ssh_set_error_oom(sftp->session);\n                    free(file);\n                    return NULL;\n                }\n\n                dir->sftp = sftp;\n                dir->name = strdup(path);\n                if (dir->name == NULL) {\n                    SAFE_FREE(dir);\n                    SAFE_FREE(file);\n                    return NULL;\n                }\n                dir->handle = file->handle;\n                SAFE_FREE(file);\n            }\n            return dir;\n        default:\n            ssh_set_error(sftp->session, SSH_FATAL,\n                    \"Received message %d during opendir!\", msg->packet_type);\n            sftp_message_free(msg);\n    }\n\n    return NULL;\n}\n\n/*\n * Parse the attributes from a payload from some messages. It is coded on\n * baselines from the protocol version 4.\n * This code is more or less dead but maybe we need it in future.\n */\nstatic sftp_attributes sftp_parse_attr_4(sftp_session sftp, ssh_buffer buf,\n    int expectnames) {\n  sftp_attributes attr;\n  ssh_string owner = NULL;\n  ssh_string group = NULL;\n  uint32_t flags = 0;\n  int ok = 0;\n\n  /* unused member variable */\n  (void) expectnames;\n\n  attr = calloc(1, sizeof(struct sftp_attributes_struct));\n  if (attr == NULL) {\n    ssh_set_error_oom(sftp->session);\n    sftp_set_error(sftp, SSH_FX_FAILURE);\n    return NULL;\n  }\n\n  /* This isn't really a loop, but it is like a try..catch.. */\n  do {\n    if (ssh_buffer_get_u32(buf, &flags) != 4) {\n      break;\n    }\n\n    flags = ntohl(flags);\n    attr->flags = flags;\n\n    if (flags & SSH_FILEXFER_ATTR_SIZE) {\n      if (ssh_buffer_get_u64(buf, &attr->size) != 8) {\n        break;\n      }\n      attr->size = ntohll(attr->size);\n    }\n\n    if (flags & SSH_FILEXFER_ATTR_OWNERGROUP) {\n      owner = ssh_buffer_get_ssh_string(buf);\n      if (owner == NULL) {\n        break;\n      }\n      attr->owner = ssh_string_to_char(owner);\n      SSH_STRING_FREE(owner);\n      if (attr->owner == NULL) {\n        break;\n      }\n\n      group = ssh_buffer_get_ssh_string(buf);\n      if (group == NULL) {\n        break;\n      }\n      attr->group = ssh_string_to_char(group);\n      SSH_STRING_FREE(group);\n      if (attr->group == NULL) {\n        break;\n      }\n    }\n\n    if (flags & SSH_FILEXFER_ATTR_PERMISSIONS) {\n      if (ssh_buffer_get_u32(buf, &attr->permissions) != 4) {\n        break;\n      }\n      attr->permissions = ntohl(attr->permissions);\n\n      /* FIXME on windows! */\n      switch (attr->permissions & SSH_S_IFMT) {\n        case SSH_S_IFSOCK:\n        case SSH_S_IFBLK:\n        case SSH_S_IFCHR:\n        case SSH_S_IFIFO:\n          attr->type = SSH_FILEXFER_TYPE_SPECIAL;\n          break;\n        case SSH_S_IFLNK:\n          attr->type = SSH_FILEXFER_TYPE_SYMLINK;\n          break;\n        case SSH_S_IFREG:\n          attr->type = SSH_FILEXFER_TYPE_REGULAR;\n          break;\n        case SSH_S_IFDIR:\n          attr->type = SSH_FILEXFER_TYPE_DIRECTORY;\n          break;\n        default:\n          attr->type = SSH_FILEXFER_TYPE_UNKNOWN;\n          break;\n      }\n    }\n\n    if (flags & SSH_FILEXFER_ATTR_ACCESSTIME) {\n      if (ssh_buffer_get_u64(buf, &attr->atime64) != 8) {\n        break;\n      }\n      attr->atime64 = ntohll(attr->atime64);\n\n      if (flags & SSH_FILEXFER_ATTR_SUBSECOND_TIMES) {\n        if (ssh_buffer_get_u32(buf, &attr->atime_nseconds) != 4) {\n          break;\n        }\n        attr->atime_nseconds = ntohl(attr->atime_nseconds);\n      }\n    }\n\n    if (flags & SSH_FILEXFER_ATTR_CREATETIME) {\n      if (ssh_buffer_get_u64(buf, &attr->createtime) != 8) {\n        break;\n      }\n      attr->createtime = ntohll(attr->createtime);\n\n      if (flags & SSH_FILEXFER_ATTR_SUBSECOND_TIMES) {\n        if (ssh_buffer_get_u32(buf, &attr->createtime_nseconds) != 4) {\n          break;\n        }\n        attr->createtime_nseconds = ntohl(attr->createtime_nseconds);\n      }\n    }\n\n    if (flags & SSH_FILEXFER_ATTR_MODIFYTIME) {\n      if (ssh_buffer_get_u64(buf, &attr->mtime64) != 8) {\n        break;\n      }\n      attr->mtime64 = ntohll(attr->mtime64);\n\n      if (flags & SSH_FILEXFER_ATTR_SUBSECOND_TIMES) {\n        if (ssh_buffer_get_u32(buf, &attr->mtime_nseconds) != 4) {\n          break;\n        }\n        attr->mtime_nseconds = ntohl(attr->mtime_nseconds);\n      }\n    }\n\n    if (flags & SSH_FILEXFER_ATTR_ACL) {\n      if ((attr->acl = ssh_buffer_get_ssh_string(buf)) == NULL) {\n        break;\n      }\n    }\n\n    if (flags & SSH_FILEXFER_ATTR_EXTENDED) {\n      if (ssh_buffer_get_u32(buf,&attr->extended_count) != 4) {\n        break;\n      }\n      attr->extended_count = ntohl(attr->extended_count);\n\n      while(attr->extended_count &&\n          (attr->extended_type = ssh_buffer_get_ssh_string(buf)) &&\n          (attr->extended_data = ssh_buffer_get_ssh_string(buf))){\n        attr->extended_count--;\n      }\n\n      if (attr->extended_count) {\n        break;\n      }\n    }\n    ok = 1;\n  } while (0);\n\n  if (ok == 0) {\n    /* break issued somewhere */\n    SSH_STRING_FREE(attr->acl);\n    SSH_STRING_FREE(attr->extended_type);\n    SSH_STRING_FREE(attr->extended_data);\n    SAFE_FREE(attr->owner);\n    SAFE_FREE(attr->group);\n    SAFE_FREE(attr);\n\n    ssh_set_error(sftp->session, SSH_FATAL, \"Invalid ATTR structure\");\n\n    return NULL;\n  }\n\n  return attr;\n}\n\nenum sftp_longname_field_e {\n  SFTP_LONGNAME_PERM = 0,\n  SFTP_LONGNAME_FIXME,\n  SFTP_LONGNAME_OWNER,\n  SFTP_LONGNAME_GROUP,\n  SFTP_LONGNAME_SIZE,\n  SFTP_LONGNAME_DATE,\n  SFTP_LONGNAME_TIME,\n  SFTP_LONGNAME_NAME,\n};\n\nstatic char *sftp_parse_longname(const char *longname,\n        enum sftp_longname_field_e longname_field) {\n    const char *p, *q;\n    size_t len, field = 0;\n\n    p = longname;\n    /* Find the beginning of the field which is specified by sftp_longanme_field_e. */\n    while(field != longname_field) {\n        if(isspace(*p)) {\n            field++;\n            p++;\n            while(*p && isspace(*p)) {\n                p++;\n            }\n        } else {\n            p++;\n        }\n    }\n\n    q = p;\n    while (! isspace(*q)) {\n        q++;\n    }\n\n    len = q - p;\n\n    return strndup(p, len);\n}\n\n/* sftp version 0-3 code. It is different from the v4 */\n/* maybe a paste of the draft is better than the code */\n/*\n        uint32   flags\n        uint64   size           present only if flag SSH_FILEXFER_ATTR_SIZE\n        uint32   uid            present only if flag SSH_FILEXFER_ATTR_UIDGID\n        uint32   gid            present only if flag SSH_FILEXFER_ATTR_UIDGID\n        uint32   permissions    present only if flag SSH_FILEXFER_ATTR_PERMISSIONS\n        uint32   atime          present only if flag SSH_FILEXFER_ACMODTIME\n        uint32   mtime          present only if flag SSH_FILEXFER_ACMODTIME\n        uint32   extended_count present only if flag SSH_FILEXFER_ATTR_EXTENDED\n        string   extended_type\n        string   extended_data\n        ...      more extended data (extended_type - extended_data pairs),\n                   so that number of pairs equals extended_count              */\nstatic sftp_attributes sftp_parse_attr_3(sftp_session sftp, ssh_buffer buf,\n        int expectname) {\n    sftp_attributes attr;\n    int rc;\n\n    attr = calloc(1, sizeof(struct sftp_attributes_struct));\n    if (attr == NULL) {\n        ssh_set_error_oom(sftp->session);\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        return NULL;\n    }\n\n    if (expectname) {\n        rc = ssh_buffer_unpack(buf, \"ss\",\n                &attr->name,\n                &attr->longname);\n        if (rc != SSH_OK){\n            goto error;\n        }\n        SSH_LOG(SSH_LOG_PROTOCOL, \"Name: %s\", attr->name);\n\n        /* Set owner and group if we talk to openssh and have the longname */\n        if (ssh_get_openssh_version(sftp->session)) {\n            attr->owner = sftp_parse_longname(attr->longname, SFTP_LONGNAME_OWNER);\n            if (attr->owner == NULL) {\n                goto error;\n            }\n\n            attr->group = sftp_parse_longname(attr->longname, SFTP_LONGNAME_GROUP);\n            if (attr->group == NULL) {\n                goto error;\n            }\n        }\n    }\n\n    rc = ssh_buffer_unpack(buf, \"d\", &attr->flags);\n    if (rc != SSH_OK){\n        goto error;\n    }\n    SSH_LOG(SSH_LOG_PROTOCOL,\n            \"Flags: %.8\"PRIx32\"\\n\", (uint32_t) attr->flags);\n\n    if (attr->flags & SSH_FILEXFER_ATTR_SIZE) {\n        rc = ssh_buffer_unpack(buf, \"q\", &attr->size);\n        if(rc != SSH_OK) {\n            goto error;\n        }\n        SSH_LOG(SSH_LOG_PROTOCOL,\n                \"Size: %\"PRIu64\"\\n\",\n                (uint64_t) attr->size);\n    }\n\n    if (attr->flags & SSH_FILEXFER_ATTR_UIDGID) {\n        rc = ssh_buffer_unpack(buf, \"dd\",\n                &attr->uid,\n                &attr->gid);\n        if (rc != SSH_OK){\n            goto error;\n        }\n    }\n\n    if (attr->flags & SSH_FILEXFER_ATTR_PERMISSIONS) {\n        rc = ssh_buffer_unpack(buf, \"d\", &attr->permissions);\n        if (rc != SSH_OK){\n            goto error;\n        }\n\n        switch (attr->permissions & SSH_S_IFMT) {\n        case SSH_S_IFSOCK:\n        case SSH_S_IFBLK:\n        case SSH_S_IFCHR:\n        case SSH_S_IFIFO:\n            attr->type = SSH_FILEXFER_TYPE_SPECIAL;\n            break;\n        case SSH_S_IFLNK:\n            attr->type = SSH_FILEXFER_TYPE_SYMLINK;\n            break;\n        case SSH_S_IFREG:\n            attr->type = SSH_FILEXFER_TYPE_REGULAR;\n            break;\n        case SSH_S_IFDIR:\n            attr->type = SSH_FILEXFER_TYPE_DIRECTORY;\n            break;\n        default:\n            attr->type = SSH_FILEXFER_TYPE_UNKNOWN;\n            break;\n        }\n    }\n\n    if (attr->flags & SSH_FILEXFER_ATTR_ACMODTIME) {\n        rc = ssh_buffer_unpack(buf, \"dd\",\n                &attr->atime,\n                &attr->mtime);\n        if (rc != SSH_OK){\n            goto error;\n        }\n    }\n\n    if (attr->flags & SSH_FILEXFER_ATTR_EXTENDED) {\n        rc = ssh_buffer_unpack(buf, \"d\", &attr->extended_count);\n        if (rc != SSH_OK){\n            goto error;\n        }\n\n        if (attr->extended_count > 0){\n            rc = ssh_buffer_unpack(buf, \"ss\",\n                    &attr->extended_type,\n                    &attr->extended_data);\n            if (rc != SSH_OK){\n                goto error;\n            }\n            attr->extended_count--;\n        }\n        /* just ignore the remaining extensions */\n\n        while (attr->extended_count > 0){\n            ssh_string tmp1,tmp2;\n            rc = ssh_buffer_unpack(buf, \"SS\", &tmp1, &tmp2);\n            if (rc != SSH_OK){\n                goto error;\n            }\n            SAFE_FREE(tmp1);\n            SAFE_FREE(tmp2);\n            attr->extended_count--;\n        }\n    }\n\n    return attr;\n\n    error:\n    SSH_STRING_FREE(attr->extended_type);\n    SSH_STRING_FREE(attr->extended_data);\n    SAFE_FREE(attr->name);\n    SAFE_FREE(attr->longname);\n    SAFE_FREE(attr->owner);\n    SAFE_FREE(attr->group);\n    SAFE_FREE(attr);\n    ssh_set_error(sftp->session, SSH_FATAL, \"Invalid ATTR structure\");\n    sftp_set_error(sftp, SSH_FX_FAILURE);\n\n    return NULL;\n}\n\nint buffer_add_attributes(ssh_buffer buffer, sftp_attributes attr)\n{\n  uint32_t flags = (attr ? attr->flags : 0);\n  int rc;\n\n  flags &= (SSH_FILEXFER_ATTR_SIZE | SSH_FILEXFER_ATTR_UIDGID |\n      SSH_FILEXFER_ATTR_PERMISSIONS | SSH_FILEXFER_ATTR_ACMODTIME);\n\n  rc = ssh_buffer_pack(buffer, \"d\", flags);\n  if (rc != SSH_OK) {\n    return -1;\n  }\n\n  if (attr != NULL) {\n    if (flags & SSH_FILEXFER_ATTR_SIZE) {\n      rc = ssh_buffer_pack(buffer, \"q\", attr->size);\n      if (rc != SSH_OK) {\n        return -1;\n      }\n    }\n\n    if (flags & SSH_FILEXFER_ATTR_UIDGID) {\n      rc = ssh_buffer_pack(buffer, \"dd\", attr->uid, attr->gid);\n      if (rc != SSH_OK) {\n        return -1;\n      }\n    }\n\n    if (flags & SSH_FILEXFER_ATTR_PERMISSIONS) {\n      rc = ssh_buffer_pack(buffer, \"d\", attr->permissions);\n      if (rc != SSH_OK) {\n        return -1;\n      }\n    }\n\n    if (flags & SSH_FILEXFER_ATTR_ACMODTIME) {\n      rc = ssh_buffer_pack(buffer, \"dd\", attr->atime, attr->mtime);\n      if (rc != SSH_OK) {\n        return -1;\n      }\n    }\n  }\n  return 0;\n}\n\n\nsftp_attributes sftp_parse_attr(sftp_session session,\n                                ssh_buffer buf,\n                                int expectname)\n{\n  switch(session->version) {\n    case 4:\n      return sftp_parse_attr_4(session, buf, expectname);\n    case 3:\n    case 2:\n    case 1:\n    case 0:\n      return sftp_parse_attr_3(session, buf, expectname);\n    default:\n      ssh_set_error(session->session, SSH_FATAL,\n          \"Version %d unsupported by client\", session->server_version);\n      return NULL;\n  }\n\n  return NULL;\n}\n\n/* Get the version of the SFTP protocol supported by the server */\nint sftp_server_version(sftp_session sftp) {\n  return sftp->server_version;\n}\n\n/* Get a single file attributes structure of a directory. */\nsftp_attributes sftp_readdir(sftp_session sftp, sftp_dir dir)\n{\n    sftp_message msg = NULL;\n    sftp_status_message status;\n    sftp_attributes attr;\n    ssh_buffer payload;\n    uint32_t id;\n    int rc;\n\n    if (dir->buffer == NULL) {\n        payload = ssh_buffer_new();\n        if (payload == NULL) {\n            ssh_set_error_oom(sftp->session);\n            sftp_set_error(sftp, SSH_FX_FAILURE);\n            return NULL;\n        }\n\n        id = sftp_get_new_id(sftp);\n\n        rc = ssh_buffer_pack(payload,\n                             \"dS\",\n                             id,\n                             dir->handle);\n        if (rc != 0) {\n            ssh_set_error_oom(sftp->session);\n            sftp_set_error(sftp, SSH_FX_FAILURE);\n            SSH_BUFFER_FREE(payload);\n            return NULL;\n        }\n\n        rc = sftp_packet_write(sftp, SSH_FXP_READDIR, payload);\n        SSH_BUFFER_FREE(payload);\n        if (rc < 0) {\n            return NULL;\n        }\n\n        SSH_LOG(SSH_LOG_PACKET,\n                \"Sent a ssh_fxp_readdir with id %d\", id);\n\n        while (msg == NULL) {\n            if (sftp_read_and_dispatch(sftp) < 0) {\n                /* something nasty has happened */\n                return NULL;\n            }\n            msg = sftp_dequeue(sftp, id);\n        }\n\n        switch (msg->packet_type){\n            case SSH_FXP_STATUS:\n                status = parse_status_msg(msg);\n                sftp_message_free(msg);\n                if (status == NULL) {\n                    return NULL;\n                }\n                sftp_set_error(sftp, status->status);\n                switch (status->status) {\n                    case SSH_FX_EOF:\n                        dir->eof = 1;\n                        status_msg_free(status);\n                        return NULL;\n                    default:\n                        break;\n                }\n\n                ssh_set_error(sftp->session, SSH_FATAL,\n                        \"Unknown error status: %d\", status->status);\n                status_msg_free(status);\n\n                return NULL;\n            case SSH_FXP_NAME:\n                ssh_buffer_get_u32(msg->payload, &dir->count);\n                dir->count = ntohl(dir->count);\n                dir->buffer = msg->payload;\n                msg->payload = NULL;\n                sftp_message_free(msg);\n                break;\n            default:\n                ssh_set_error(sftp->session, SSH_FATAL,\n                        \"Unsupported message back %d\", msg->packet_type);\n                sftp_message_free(msg);\n                sftp_set_error(sftp, SSH_FX_BAD_MESSAGE);\n\n                return NULL;\n        }\n    }\n\n    /* now dir->buffer contains a buffer and dir->count != 0 */\n    if (dir->count == 0) {\n        ssh_set_error(sftp->session, SSH_FATAL,\n                \"Count of files sent by the server is zero, which is invalid, or \"\n                \"libsftp bug\");\n        return NULL;\n    }\n\n    SSH_LOG(SSH_LOG_PROTOCOL, \"Count is %d\", dir->count);\n\n    attr = sftp_parse_attr(sftp, dir->buffer, 1);\n    if (attr == NULL) {\n        ssh_set_error(sftp->session, SSH_FATAL,\n                \"Couldn't parse the SFTP attributes\");\n        return NULL;\n    }\n\n    dir->count--;\n    if (dir->count == 0) {\n        SSH_BUFFER_FREE(dir->buffer);\n        dir->buffer = NULL;\n    }\n\n    return attr;\n}\n\n/* Tell if the directory has reached EOF (End Of File). */\nint sftp_dir_eof(sftp_dir dir) {\n  return dir->eof;\n}\n\n/* Free a SFTP_ATTRIBUTE handle */\nvoid sftp_attributes_free(sftp_attributes file){\n  if (file == NULL) {\n    return;\n  }\n\n  SSH_STRING_FREE(file->acl);\n  SSH_STRING_FREE(file->extended_data);\n  SSH_STRING_FREE(file->extended_type);\n\n  SAFE_FREE(file->name);\n  SAFE_FREE(file->longname);\n  SAFE_FREE(file->group);\n  SAFE_FREE(file->owner);\n\n  SAFE_FREE(file);\n}\n\nstatic int sftp_handle_close(sftp_session sftp, ssh_string handle)\n{\n    sftp_status_message status;\n    sftp_message msg = NULL;\n    ssh_buffer buffer = NULL;\n    uint32_t id;\n    int rc;\n\n    buffer = ssh_buffer_new();\n    if (buffer == NULL) {\n        ssh_set_error_oom(sftp->session);\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        return -1;\n    }\n\n    id = sftp_get_new_id(sftp);\n\n    rc = ssh_buffer_pack(buffer,\n                         \"dS\",\n                         id,\n                         handle);\n    if (rc != SSH_OK) {\n        ssh_set_error_oom(sftp->session);\n        SSH_BUFFER_FREE(buffer);\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        return -1;\n    }\n\n    rc = sftp_packet_write(sftp, SSH_FXP_CLOSE, buffer);\n    SSH_BUFFER_FREE(buffer);\n    if (rc < 0) {\n        return -1;\n    }\n\n    while (msg == NULL) {\n        if (sftp_read_and_dispatch(sftp) < 0) {\n            /* something nasty has happened */\n            return -1;\n        }\n        msg = sftp_dequeue(sftp,id);\n    }\n\n    switch (msg->packet_type) {\n        case SSH_FXP_STATUS:\n            status = parse_status_msg(msg);\n            sftp_message_free(msg);\n            if(status == NULL) {\n                return -1;\n            }\n            sftp_set_error(sftp, status->status);\n            switch (status->status) {\n                case SSH_FX_OK:\n                    status_msg_free(status);\n                    return 0;\n                    break;\n                default:\n                    break;\n            }\n            ssh_set_error(sftp->session, SSH_REQUEST_DENIED,\n                    \"SFTP server: %s\", status->errormsg);\n            status_msg_free(status);\n            return -1;\n        default:\n            ssh_set_error(sftp->session, SSH_FATAL,\n                    \"Received message %d during sftp_handle_close!\", msg->packet_type);\n            sftp_message_free(msg);\n            sftp_set_error(sftp, SSH_FX_BAD_MESSAGE);\n    }\n\n    return -1;\n}\n\n/* Close an open file handle. */\nint sftp_close(sftp_file file){\n  int err = SSH_NO_ERROR;\n\n  SAFE_FREE(file->name);\n  if (file->handle){\n    err = sftp_handle_close(file->sftp,file->handle);\n    SSH_STRING_FREE(file->handle);\n  }\n  /* FIXME: check server response and implement errno */\n  SAFE_FREE(file);\n\n  return err;\n}\n\n/* Close an open directory. */\nint sftp_closedir(sftp_dir dir){\n  int err = SSH_NO_ERROR;\n\n  SAFE_FREE(dir->name);\n  if (dir->handle) {\n    err = sftp_handle_close(dir->sftp, dir->handle);\n    SSH_STRING_FREE(dir->handle);\n  }\n  /* FIXME: check server response and implement errno */\n  SSH_BUFFER_FREE(dir->buffer);\n  SAFE_FREE(dir);\n\n  return err;\n}\n\n/* Open a file on the server. */\nsftp_file sftp_open(sftp_session sftp,\n                    const char *file,\n                    int flags,\n                    mode_t mode)\n{\n    sftp_message msg = NULL;\n    sftp_status_message status;\n    struct sftp_attributes_struct attr;\n    sftp_file handle;\n    ssh_buffer buffer;\n    sftp_attributes stat_data;\n    uint32_t sftp_flags = 0;\n    uint32_t id;\n    int rc;\n\n    buffer = ssh_buffer_new();\n    if (buffer == NULL) {\n        ssh_set_error_oom(sftp->session);\n        return NULL;\n    }\n\n    ZERO_STRUCT(attr);\n    attr.permissions = mode;\n    attr.flags = SSH_FILEXFER_ATTR_PERMISSIONS;\n\n    if ((flags & O_RDWR) == O_RDWR) {\n        sftp_flags |= (SSH_FXF_WRITE | SSH_FXF_READ);\n    } else if ((flags & O_WRONLY) == O_WRONLY) {\n        sftp_flags |= SSH_FXF_WRITE;\n    } else {\n        sftp_flags |= SSH_FXF_READ;\n    }\n    if ((flags & O_CREAT) == O_CREAT)\n        sftp_flags |= SSH_FXF_CREAT;\n    if ((flags & O_TRUNC) == O_TRUNC)\n        sftp_flags |= SSH_FXF_TRUNC;\n    if ((flags & O_EXCL) == O_EXCL)\n        sftp_flags |= SSH_FXF_EXCL;\n    if ((flags & O_APPEND) == O_APPEND) {\n        sftp_flags |= SSH_FXF_APPEND;\n    }\n    SSH_LOG(SSH_LOG_PACKET,\"Opening file %s with sftp flags %x\",file,sftp_flags);\n    id = sftp_get_new_id(sftp);\n\n    rc = ssh_buffer_pack(buffer,\n                         \"dsd\",\n                         id,\n                         file,\n                         sftp_flags);\n    if (rc != SSH_OK) {\n        ssh_set_error_oom(sftp->session);\n        SSH_BUFFER_FREE(buffer);\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        return NULL;\n    }\n\n    rc = buffer_add_attributes(buffer, &attr);\n    if (rc < 0) {\n        ssh_set_error_oom(sftp->session);\n        SSH_BUFFER_FREE(buffer);\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        return NULL;\n    }\n\n    rc = sftp_packet_write(sftp, SSH_FXP_OPEN, buffer);\n    SSH_BUFFER_FREE(buffer);\n    if (rc < 0) {\n        return NULL;\n    }\n\n    while (msg == NULL) {\n        if (sftp_read_and_dispatch(sftp) < 0) {\n            /* something nasty has happened */\n            return NULL;\n        }\n        msg = sftp_dequeue(sftp, id);\n    }\n\n    switch (msg->packet_type) {\n        case SSH_FXP_STATUS:\n            status = parse_status_msg(msg);\n            sftp_message_free(msg);\n            if (status == NULL) {\n                return NULL;\n            }\n            sftp_set_error(sftp, status->status);\n            ssh_set_error(sftp->session, SSH_REQUEST_DENIED,\n                    \"SFTP server: %s\", status->errormsg);\n            status_msg_free(status);\n\n            return NULL;\n        case SSH_FXP_HANDLE:\n            handle = parse_handle_msg(msg);\n            if (handle == NULL) {\n                return NULL;\n            }\n            sftp_message_free(msg);\n            if ((flags & O_APPEND) == O_APPEND) {\n                stat_data = sftp_stat(sftp, file);\n                if (stat_data == NULL) {\n                    sftp_close(handle);\n                    return NULL;\n                }\n                if ((stat_data->flags & SSH_FILEXFER_ATTR_SIZE) != SSH_FILEXFER_ATTR_SIZE) {\n                    ssh_set_error(sftp->session,\n                            SSH_FATAL,\n                            \"Cannot open in append mode. Unknown file size.\");\n                    sftp_close(handle);\n                    sftp_set_error(sftp, SSH_FX_FAILURE);\n                    return NULL;\n                }\n\n                handle->offset = stat_data->size;\n            }\n            return handle;\n        default:\n            ssh_set_error(sftp->session, SSH_FATAL,\n                    \"Received message %d during open!\", msg->packet_type);\n            sftp_message_free(msg);\n            sftp_set_error(sftp, SSH_FX_BAD_MESSAGE);\n    }\n\n    return NULL;\n}\n\nvoid sftp_file_set_nonblocking(sftp_file handle){\n    handle->nonblocking=1;\n}\nvoid sftp_file_set_blocking(sftp_file handle){\n    handle->nonblocking=0;\n}\n\n/* Read from a file using an opened sftp file handle. */\nssize_t sftp_read(sftp_file handle, void *buf, size_t count) {\n  sftp_session sftp = handle->sftp;\n  sftp_message msg = NULL;\n  sftp_status_message status;\n  ssh_string datastring;\n  size_t datalen;\n  ssh_buffer buffer;\n  uint32_t id;\n  int rc;\n\n  if (handle->eof) {\n    return 0;\n  }\n\n  buffer = ssh_buffer_new();\n  if (buffer == NULL) {\n    ssh_set_error_oom(sftp->session);\n    return -1;\n  }\n\n  id = sftp_get_new_id(handle->sftp);\n\n  rc = ssh_buffer_pack(buffer,\n                       \"dSqd\",\n                       id,\n                       handle->handle,\n                       handle->offset,\n                       count);\n  if (rc != SSH_OK){\n    ssh_set_error_oom(sftp->session);\n    SSH_BUFFER_FREE(buffer);\n    sftp_set_error(sftp, SSH_FX_FAILURE);\n    return -1;\n  }\n  if (sftp_packet_write(handle->sftp, SSH_FXP_READ, buffer) < 0) {\n    SSH_BUFFER_FREE(buffer);\n    return -1;\n  }\n  SSH_BUFFER_FREE(buffer);\n\n  while (msg == NULL) {\n    if (handle->nonblocking) {\n      if (ssh_channel_poll(handle->sftp->channel, 0) == 0) {\n        /* we cannot block */\n        return 0;\n      }\n    }\n    if (sftp_read_and_dispatch(handle->sftp) < 0) {\n      /* something nasty has happened */\n      return -1;\n    }\n    msg = sftp_dequeue(handle->sftp, id);\n  }\n\n  switch (msg->packet_type) {\n    case SSH_FXP_STATUS:\n      status = parse_status_msg(msg);\n      sftp_message_free(msg);\n      if (status == NULL) {\n        return -1;\n      }\n      sftp_set_error(sftp, status->status);\n      switch (status->status) {\n        case SSH_FX_EOF:\n          handle->eof = 1;\n          status_msg_free(status);\n          return 0;\n        default:\n          break;\n      }\n      ssh_set_error(sftp->session,SSH_REQUEST_DENIED,\n          \"SFTP server: %s\", status->errormsg);\n      status_msg_free(status);\n      return -1;\n    case SSH_FXP_DATA:\n      datastring = ssh_buffer_get_ssh_string(msg->payload);\n      sftp_message_free(msg);\n      if (datastring == NULL) {\n        ssh_set_error(sftp->session, SSH_FATAL,\n            \"Received invalid DATA packet from sftp server\");\n        return -1;\n      }\n\n      datalen = ssh_string_len(datastring);\n      if (datalen > count) {\n        ssh_set_error(sftp->session, SSH_FATAL,\n            \"Received a too big DATA packet from sftp server: \"\n            \"%\" PRIdS \" and asked for %\" PRIdS,\n            datalen, count);\n        SSH_STRING_FREE(datastring);\n        return -1;\n      }\n      handle->offset += (uint64_t)datalen;\n      memcpy(buf, ssh_string_data(datastring), datalen);\n      SSH_STRING_FREE(datastring);\n      return datalen;\n    default:\n      ssh_set_error(sftp->session, SSH_FATAL,\n          \"Received message %d during read!\", msg->packet_type);\n      sftp_message_free(msg);\n      sftp_set_error(sftp, SSH_FX_BAD_MESSAGE);\n      return -1;\n  }\n\n  return -1; /* not reached */\n}\n\n/* Start an asynchronous read from a file using an opened sftp file handle. */\nint sftp_async_read_begin(sftp_file file, uint32_t len){\n  sftp_session sftp = file->sftp;\n  ssh_buffer buffer;\n  uint32_t id;\n  int rc;\n\n  buffer = ssh_buffer_new();\n  if (buffer == NULL) {\n    ssh_set_error_oom(sftp->session);\n    sftp_set_error(sftp, SSH_FX_FAILURE);\n    return -1;\n  }\n\n  id = sftp_get_new_id(sftp);\n\n  rc = ssh_buffer_pack(buffer,\n                       \"dSqd\",\n                       id,\n                       file->handle,\n                       file->offset,\n                       len);\n  if (rc != SSH_OK) {\n    ssh_set_error_oom(sftp->session);\n    SSH_BUFFER_FREE(buffer);\n    sftp_set_error(sftp, SSH_FX_FAILURE);\n    return -1;\n  }\n  if (sftp_packet_write(sftp, SSH_FXP_READ, buffer) < 0) {\n    SSH_BUFFER_FREE(buffer);\n    return -1;\n  }\n  SSH_BUFFER_FREE(buffer);\n\n  file->offset += len; /* assume we'll read len bytes */\n\n  return id;\n}\n\n/* Wait for an asynchronous read to complete and save the data. */\nint sftp_async_read(sftp_file file, void *data, uint32_t size, uint32_t id){\n  sftp_session sftp;\n  sftp_message msg = NULL;\n  sftp_status_message status;\n  ssh_string datastring;\n  int err = SSH_OK;\n  uint32_t len;\n\n  if (file == NULL) {\n    return SSH_ERROR;\n  }\n  sftp = file->sftp;\n\n  if (file->eof) {\n    return 0;\n  }\n\n  /* handle an existing request */\n  while (msg == NULL) {\n    if (file->nonblocking){\n      if (ssh_channel_poll(sftp->channel, 0) == 0) {\n        /* we cannot block */\n        return SSH_AGAIN;\n      }\n    }\n\n    if (sftp_read_and_dispatch(sftp) < 0) {\n      /* something nasty has happened */\n      return SSH_ERROR;\n    }\n\n    msg = sftp_dequeue(sftp,id);\n  }\n\n  switch (msg->packet_type) {\n    case SSH_FXP_STATUS:\n      status = parse_status_msg(msg);\n      sftp_message_free(msg);\n      if (status == NULL) {\n        return -1;\n      }\n      sftp_set_error(sftp, status->status);\n      if (status->status != SSH_FX_EOF) {\n        ssh_set_error(sftp->session, SSH_REQUEST_DENIED,\n            \"SFTP server : %s\", status->errormsg);\n        err = SSH_ERROR;\n      } else {\n        file->eof = 1;\n      }\n      status_msg_free(status);\n      return err;\n    case SSH_FXP_DATA:\n      datastring = ssh_buffer_get_ssh_string(msg->payload);\n      sftp_message_free(msg);\n      if (datastring == NULL) {\n        ssh_set_error(sftp->session, SSH_FATAL,\n            \"Received invalid DATA packet from sftp server\");\n        return SSH_ERROR;\n      }\n      if (ssh_string_len(datastring) > size) {\n        ssh_set_error(sftp->session, SSH_FATAL,\n            \"Received a too big DATA packet from sftp server: \"\n            \"%\" PRIdS \" and asked for %u\",\n            ssh_string_len(datastring), size);\n        SSH_STRING_FREE(datastring);\n        return SSH_ERROR;\n      }\n      len = ssh_string_len(datastring);\n      /* Update the offset with the correct value */\n      file->offset = file->offset - (size - len);\n      memcpy(data, ssh_string_data(datastring), len);\n      SSH_STRING_FREE(datastring);\n      return len;\n    default:\n      ssh_set_error(sftp->session,SSH_FATAL,\"Received message %d during read!\",msg->packet_type);\n      sftp_message_free(msg);\n      sftp_set_error(sftp, SSH_FX_BAD_MESSAGE);\n      return SSH_ERROR;\n  }\n\n  return SSH_ERROR;\n}\n\nssize_t sftp_write(sftp_file file, const void *buf, size_t count) {\n  sftp_session sftp = file->sftp;\n  sftp_message msg = NULL;\n  sftp_status_message status;\n  ssh_buffer buffer;\n  uint32_t id;\n  ssize_t len;\n  size_t packetlen;\n  int rc;\n\n  buffer = ssh_buffer_new();\n  if (buffer == NULL) {\n    ssh_set_error_oom(sftp->session);\n    sftp_set_error(sftp, SSH_FX_FAILURE);\n    return -1;\n  }\n\n  id = sftp_get_new_id(file->sftp);\n\n  rc = ssh_buffer_pack(buffer,\n                       \"dSqdP\",\n                       id,\n                       file->handle,\n                       file->offset,\n                       count, /* len of datastring */\n                       (size_t)count, buf);\n  if (rc != SSH_OK){\n    ssh_set_error_oom(sftp->session);\n    SSH_BUFFER_FREE(buffer);\n    sftp_set_error(sftp, SSH_FX_FAILURE);\n    return -1;\n  }\n  packetlen=ssh_buffer_get_len(buffer);\n  len = sftp_packet_write(file->sftp, SSH_FXP_WRITE, buffer);\n  SSH_BUFFER_FREE(buffer);\n  if (len < 0) {\n    return -1;\n  } else  if ((size_t)len != packetlen) {\n    SSH_LOG(SSH_LOG_PACKET,\n        \"Could not write as much data as expected\");\n  }\n\n  while (msg == NULL) {\n    if (sftp_read_and_dispatch(file->sftp) < 0) {\n      /* something nasty has happened */\n      return -1;\n    }\n    msg = sftp_dequeue(file->sftp, id);\n  }\n\n  switch (msg->packet_type) {\n    case SSH_FXP_STATUS:\n      status = parse_status_msg(msg);\n      sftp_message_free(msg);\n      if (status == NULL) {\n        return -1;\n      }\n      sftp_set_error(sftp, status->status);\n      switch (status->status) {\n        case SSH_FX_OK:\n          file->offset += count;\n          status_msg_free(status);\n          return count;\n        default:\n          break;\n      }\n      ssh_set_error(sftp->session, SSH_REQUEST_DENIED,\n          \"SFTP server: %s\", status->errormsg);\n      file->offset += count;\n      status_msg_free(status);\n      return -1;\n    default:\n      ssh_set_error(sftp->session, SSH_FATAL,\n          \"Received message %d during write!\", msg->packet_type);\n      sftp_message_free(msg);\n      sftp_set_error(sftp, SSH_FX_BAD_MESSAGE);\n      return -1;\n  }\n\n  return -1; /* not reached */\n}\n\n/* Seek to a specific location in a file. */\nint sftp_seek(sftp_file file, uint32_t new_offset) {\n  if (file == NULL) {\n    return -1;\n  }\n\n  file->offset = new_offset;\n  file->eof = 0;\n\n  return 0;\n}\n\nint sftp_seek64(sftp_file file, uint64_t new_offset) {\n  if (file == NULL) {\n    return -1;\n  }\n\n  file->offset = new_offset;\n  file->eof = 0;\n\n  return 0;\n}\n\n/* Report current byte position in file. */\nunsigned long sftp_tell(sftp_file file) {\n  return (unsigned long)file->offset;\n}\n/* Report current byte position in file. */\nuint64_t sftp_tell64(sftp_file file) {\n  return (uint64_t) file->offset;\n}\n\n/* Rewinds the position of the file pointer to the beginning of the file.*/\nvoid sftp_rewind(sftp_file file) {\n  file->offset = 0;\n  file->eof = 0;\n}\n\n/* code written by Nick */\nint sftp_unlink(sftp_session sftp, const char *file) {\n  sftp_status_message status = NULL;\n  sftp_message msg = NULL;\n  ssh_buffer buffer;\n  uint32_t id;\n  int rc;\n\n  buffer = ssh_buffer_new();\n  if (buffer == NULL) {\n    ssh_set_error_oom(sftp->session);\n    sftp_set_error(sftp, SSH_FX_FAILURE);\n    return -1;\n  }\n\n  id = sftp_get_new_id(sftp);\n\n  rc = ssh_buffer_pack(buffer,\n                       \"ds\",\n                       id,\n                       file);\n  if (rc != SSH_OK) {\n    ssh_set_error_oom(sftp->session);\n    SSH_BUFFER_FREE(buffer);\n    sftp_set_error(sftp, SSH_FX_FAILURE);\n    return -1;\n  }\n\n  if (sftp_packet_write(sftp, SSH_FXP_REMOVE, buffer) < 0) {\n    SSH_BUFFER_FREE(buffer);\n    return -1;\n  }\n  SSH_BUFFER_FREE(buffer);\n\n  while (msg == NULL) {\n    if (sftp_read_and_dispatch(sftp)) {\n      return -1;\n    }\n    msg = sftp_dequeue(sftp, id);\n  }\n\n  if (msg->packet_type == SSH_FXP_STATUS) {\n    /* by specification, this command's only supposed to return SSH_FXP_STATUS */\n    status = parse_status_msg(msg);\n    sftp_message_free(msg);\n    if (status == NULL) {\n      return -1;\n    }\n    sftp_set_error(sftp, status->status);\n    switch (status->status) {\n      case SSH_FX_OK:\n        status_msg_free(status);\n        return 0;\n      default:\n        break;\n    }\n\n    /*\n     * The status should be SSH_FX_OK if the command was successful, if it\n     * didn't, then there was an error\n     */\n    ssh_set_error(sftp->session, SSH_REQUEST_DENIED,\n        \"SFTP server: %s\", status->errormsg);\n    status_msg_free(status);\n    return -1;\n  } else {\n    ssh_set_error(sftp->session,SSH_FATAL,\n        \"Received message %d when attempting to remove file\", msg->packet_type);\n    sftp_message_free(msg);\n    sftp_set_error(sftp, SSH_FX_BAD_MESSAGE);\n  }\n\n  return -1;\n}\n\n/* code written by Nick */\nint sftp_rmdir(sftp_session sftp, const char *directory) {\n  sftp_status_message status = NULL;\n  sftp_message msg = NULL;\n  ssh_buffer buffer;\n  uint32_t id;\n  int rc;\n\n  buffer = ssh_buffer_new();\n  if (buffer == NULL) {\n    ssh_set_error_oom(sftp->session);\n    sftp_set_error(sftp, SSH_FX_FAILURE);\n    return -1;\n  }\n\n  id = sftp_get_new_id(sftp);\n\n  rc = ssh_buffer_pack(buffer,\n                       \"ds\",\n                       id,\n                       directory);\n  if (rc != SSH_OK) {\n    ssh_set_error_oom(sftp->session);\n    SSH_BUFFER_FREE(buffer);\n    sftp_set_error(sftp, SSH_FX_FAILURE);\n    return -1;\n  }\n  if (sftp_packet_write(sftp, SSH_FXP_RMDIR, buffer) < 0) {\n    SSH_BUFFER_FREE(buffer);\n    return -1;\n  }\n  SSH_BUFFER_FREE(buffer);\n\n  while (msg == NULL) {\n    if (sftp_read_and_dispatch(sftp) < 0) {\n      return -1;\n    }\n    msg = sftp_dequeue(sftp, id);\n  }\n\n  /* By specification, this command returns SSH_FXP_STATUS */\n  if (msg->packet_type == SSH_FXP_STATUS) {\n    status = parse_status_msg(msg);\n    sftp_message_free(msg);\n    if (status == NULL) {\n      return -1;\n    }\n    sftp_set_error(sftp, status->status);\n    switch (status->status) {\n      case SSH_FX_OK:\n        status_msg_free(status);\n        return 0;\n      default:\n        break;\n    }\n    ssh_set_error(sftp->session, SSH_REQUEST_DENIED,\n        \"SFTP server: %s\", status->errormsg);\n    status_msg_free(status);\n    return -1;\n  } else {\n    ssh_set_error(sftp->session, SSH_FATAL,\n        \"Received message %d when attempting to remove directory\",\n        msg->packet_type);\n    sftp_message_free(msg);\n    sftp_set_error(sftp, SSH_FX_BAD_MESSAGE);\n  }\n\n  return -1;\n}\n\n/* Code written by Nick */\nint sftp_mkdir(sftp_session sftp, const char *directory, mode_t mode)\n{\n    sftp_status_message status = NULL;\n    sftp_message msg = NULL;\n    sftp_attributes errno_attr = NULL;\n    struct sftp_attributes_struct attr;\n    ssh_buffer buffer;\n    uint32_t id;\n    int rc;\n\n    buffer = ssh_buffer_new();\n    if (buffer == NULL) {\n        ssh_set_error_oom(sftp->session);\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        return -1;\n    }\n\n    ZERO_STRUCT(attr);\n    attr.permissions = mode;\n    attr.flags = SSH_FILEXFER_ATTR_PERMISSIONS;\n\n    id = sftp_get_new_id(sftp);\n\n    rc = ssh_buffer_pack(buffer,\n                         \"ds\",\n                         id,\n                         directory);\n    if (rc != SSH_OK) {\n        ssh_set_error_oom(sftp->session);\n        SSH_BUFFER_FREE(buffer);\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        return -1;\n    }\n\n    rc = buffer_add_attributes(buffer, &attr);\n    if (rc < 0) {\n        ssh_set_error_oom(sftp->session);\n        SSH_BUFFER_FREE(buffer);\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        return -1;\n    }\n\n    rc = sftp_packet_write(sftp, SSH_FXP_MKDIR, buffer);\n    SSH_BUFFER_FREE(buffer);\n    if (rc < 0) {\n        return -1;\n    }\n\n    while (msg == NULL) {\n        if (sftp_read_and_dispatch(sftp) < 0) {\n            return -1;\n        }\n        msg = sftp_dequeue(sftp, id);\n    }\n\n    /* By specification, this command only returns SSH_FXP_STATUS */\n    if (msg->packet_type == SSH_FXP_STATUS) {\n        status = parse_status_msg(msg);\n        sftp_message_free(msg);\n        if (status == NULL) {\n            return -1;\n        }\n        sftp_set_error(sftp, status->status);\n        switch (status->status) {\n            case SSH_FX_FAILURE:\n                /*\n                 * mkdir always returns a failure, even if the path already exists.\n                 * To be POSIX conform and to be able to map it to EEXIST a stat\n                 * call is needed here.\n                 */\n                errno_attr = sftp_lstat(sftp, directory);\n                if (errno_attr != NULL) {\n                    SAFE_FREE(errno_attr);\n                    sftp_set_error(sftp, SSH_FX_FILE_ALREADY_EXISTS);\n                }\n                break;\n            case SSH_FX_OK:\n                status_msg_free(status);\n                return 0;\n            default:\n                break;\n        }\n        /*\n         * The status should be SSH_FX_OK if the command was successful, if it\n         * didn't, then there was an error\n         */\n        ssh_set_error(sftp->session, SSH_REQUEST_DENIED,\n                \"SFTP server: %s\", status->errormsg);\n        status_msg_free(status);\n        return -1;\n    } else {\n        ssh_set_error(sftp->session, SSH_FATAL,\n                \"Received message %d when attempting to make directory\",\n                msg->packet_type);\n        sftp_message_free(msg);\n        sftp_set_error(sftp, SSH_FX_BAD_MESSAGE);\n    }\n\n    return -1;\n}\n\n/* code written by nick */\nint sftp_rename(sftp_session sftp, const char *original, const char *newname) {\n  sftp_status_message status = NULL;\n  sftp_message msg = NULL;\n  ssh_buffer buffer;\n  uint32_t id;\n  int rc;\n\n  buffer = ssh_buffer_new();\n  if (buffer == NULL) {\n    ssh_set_error_oom(sftp->session);\n    sftp_set_error(sftp, SSH_FX_FAILURE);\n    return -1;\n  }\n\n  id = sftp_get_new_id(sftp);\n\n  rc = ssh_buffer_pack(buffer,\n                       \"dss\",\n                       id,\n                       original,\n                       newname);\n  if (rc != SSH_OK) {\n    ssh_set_error_oom(sftp->session);\n    SSH_BUFFER_FREE(buffer);\n    sftp_set_error(sftp, SSH_FX_FAILURE);\n    return -1;\n  }\n\n  if (sftp->version >= 4){\n      /* POSIX rename atomically replaces newpath, we should do the same\n       * only available on >=v4 */\n      ssh_buffer_add_u32(buffer, SSH_FXF_RENAME_OVERWRITE);\n  }\n\n  if (sftp_packet_write(sftp, SSH_FXP_RENAME, buffer) < 0) {\n    SSH_BUFFER_FREE(buffer);\n    return -1;\n  }\n  SSH_BUFFER_FREE(buffer);\n\n  while (msg == NULL) {\n    if (sftp_read_and_dispatch(sftp) < 0) {\n      return -1;\n    }\n    msg = sftp_dequeue(sftp, id);\n  }\n\n  /* By specification, this command only returns SSH_FXP_STATUS */\n  if (msg->packet_type == SSH_FXP_STATUS) {\n    status = parse_status_msg(msg);\n    sftp_message_free(msg);\n    if (status == NULL) {\n      return -1;\n    }\n    sftp_set_error(sftp, status->status);\n    switch (status->status) {\n      case SSH_FX_OK:\n        status_msg_free(status);\n        return 0;\n      default:\n        break;\n    }\n    /*\n     * Status should be SSH_FX_OK if the command was successful, if it didn't,\n     * then there was an error\n     */\n    ssh_set_error(sftp->session, SSH_REQUEST_DENIED,\n        \"SFTP server: %s\", status->errormsg);\n    status_msg_free(status);\n    return -1;\n  } else {\n    ssh_set_error(sftp->session, SSH_FATAL,\n        \"Received message %d when attempting to rename\",\n        msg->packet_type);\n    sftp_message_free(msg);\n    sftp_set_error(sftp, SSH_FX_BAD_MESSAGE);\n  }\n\n  return -1;\n}\n\n/* Code written by Nick */\n/* Set file attributes on a file, directory or symbolic link. */\nint sftp_setstat(sftp_session sftp, const char *file, sftp_attributes attr)\n{\n    uint32_t id;\n    ssh_buffer buffer;\n    sftp_message msg = NULL;\n    sftp_status_message status = NULL;\n    int rc;\n\n    buffer = ssh_buffer_new();\n    if (buffer == NULL) {\n        ssh_set_error_oom(sftp->session);\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        return -1;\n    }\n\n    id = sftp_get_new_id(sftp);\n\n    rc = ssh_buffer_pack(buffer,\n                         \"ds\",\n                         id,\n                         file);\n    if (rc != SSH_OK) {\n        ssh_set_error_oom(sftp->session);\n        SSH_BUFFER_FREE(buffer);\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        return -1;\n    }\n\n    rc = buffer_add_attributes(buffer, attr);\n    if (rc != 0) {\n        ssh_set_error_oom(sftp->session);\n        SSH_BUFFER_FREE(buffer);\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        return -1;\n    }\n\n    rc = sftp_packet_write(sftp, SSH_FXP_SETSTAT, buffer);\n    SSH_BUFFER_FREE(buffer);\n    if (rc < 0) {\n        return -1;\n    }\n\n    while (msg == NULL) {\n        if (sftp_read_and_dispatch(sftp) < 0) {\n            return -1;\n        }\n        msg = sftp_dequeue(sftp, id);\n    }\n\n    /* By specification, this command only returns SSH_FXP_STATUS */\n    if (msg->packet_type == SSH_FXP_STATUS) {\n        status = parse_status_msg(msg);\n        sftp_message_free(msg);\n        if (status == NULL) {\n            return -1;\n        }\n        sftp_set_error(sftp, status->status);\n        switch (status->status) {\n            case SSH_FX_OK:\n                status_msg_free(status);\n                return 0;\n            default:\n                break;\n        }\n        /*\n         * The status should be SSH_FX_OK if the command was successful, if it\n         * didn't, then there was an error\n         */\n        ssh_set_error(sftp->session, SSH_REQUEST_DENIED,\n                \"SFTP server: %s\", status->errormsg);\n        status_msg_free(status);\n        return -1;\n    } else {\n        ssh_set_error(sftp->session, SSH_FATAL,\n                \"Received message %d when attempting to set stats\", msg->packet_type);\n        sftp_message_free(msg);\n        sftp_set_error(sftp, SSH_FX_BAD_MESSAGE);\n    }\n\n    return -1;\n}\n\n/* Change the file owner and group */\nint sftp_chown(sftp_session sftp, const char *file, uid_t owner, gid_t group) {\n\tstruct sftp_attributes_struct attr;\n  ZERO_STRUCT(attr);\n\n  attr.uid = owner;\n  attr.gid = group;\n\n  attr.flags = SSH_FILEXFER_ATTR_UIDGID;\n\n  return sftp_setstat(sftp, file, &attr);\n}\n\n/* Change permissions of a file */\nint sftp_chmod(sftp_session sftp, const char *file, mode_t mode) {\n\tstruct sftp_attributes_struct attr;\n  ZERO_STRUCT(attr);\n  attr.permissions = mode;\n  attr.flags = SSH_FILEXFER_ATTR_PERMISSIONS;\n\n  return sftp_setstat(sftp, file, &attr);\n}\n\n/* Change the last modification and access time of a file. */\nint sftp_utimes(sftp_session sftp, const char *file,\n    const struct timeval *times) {\n\tstruct sftp_attributes_struct attr;\n  ZERO_STRUCT(attr);\n\n  attr.atime = times[0].tv_sec;\n  attr.atime_nseconds = times[0].tv_usec;\n\n  attr.mtime = times[1].tv_sec;\n  attr.mtime_nseconds = times[1].tv_usec;\n\n  attr.flags |= SSH_FILEXFER_ATTR_ACCESSTIME | SSH_FILEXFER_ATTR_MODIFYTIME |\n    SSH_FILEXFER_ATTR_SUBSECOND_TIMES;\n\n  return sftp_setstat(sftp, file, &attr);\n}\n\nint sftp_symlink(sftp_session sftp, const char *target, const char *dest) {\n  sftp_status_message status = NULL;\n  sftp_message msg = NULL;\n  ssh_buffer buffer;\n  uint32_t id;\n  int rc;\n\n  if (sftp == NULL)\n    return -1;\n  if (target == NULL || dest == NULL) {\n    ssh_set_error_invalid(sftp->session);\n    sftp_set_error(sftp, SSH_FX_FAILURE);\n    return -1;\n  }\n\n  buffer = ssh_buffer_new();\n  if (buffer == NULL) {\n    ssh_set_error_oom(sftp->session);\n    sftp_set_error(sftp, SSH_FX_FAILURE);\n    return -1;\n  }\n\n  id = sftp_get_new_id(sftp);\n\n  /* TODO check for version number if they ever fix it. */\n  if (ssh_get_openssh_version(sftp->session)) {\n      rc = ssh_buffer_pack(buffer,\n                           \"dss\",\n                           id,\n                           target,\n                           dest);\n  } else {\n      rc = ssh_buffer_pack(buffer,\n                           \"dss\",\n                           id,\n                           dest,\n                           target);\n  }\n  if (rc != SSH_OK){\n      ssh_set_error_oom(sftp->session);\n      SSH_BUFFER_FREE(buffer);\n      sftp_set_error(sftp, SSH_FX_FAILURE);\n      return -1;\n  }\n\n  if (sftp_packet_write(sftp, SSH_FXP_SYMLINK, buffer) < 0) {\n    SSH_BUFFER_FREE(buffer);\n    return -1;\n  }\n  SSH_BUFFER_FREE(buffer);\n\n  while (msg == NULL) {\n    if (sftp_read_and_dispatch(sftp) < 0) {\n      return -1;\n    }\n    msg = sftp_dequeue(sftp, id);\n  }\n\n  /* By specification, this command only returns SSH_FXP_STATUS */\n  if (msg->packet_type == SSH_FXP_STATUS) {\n    status = parse_status_msg(msg);\n    sftp_message_free(msg);\n    if (status == NULL) {\n      return -1;\n    }\n    sftp_set_error(sftp, status->status);\n    switch (status->status) {\n      case SSH_FX_OK:\n        status_msg_free(status);\n        return 0;\n      default:\n        break;\n    }\n    /*\n     * The status should be SSH_FX_OK if the command was successful, if it\n     * didn't, then there was an error\n     */\n    ssh_set_error(sftp->session, SSH_REQUEST_DENIED,\n        \"SFTP server: %s\", status->errormsg);\n    status_msg_free(status);\n    return -1;\n  } else {\n    ssh_set_error(sftp->session, SSH_FATAL,\n        \"Received message %d when attempting to set stats\", msg->packet_type);\n    sftp_message_free(msg);\n    sftp_set_error(sftp, SSH_FX_BAD_MESSAGE);\n  }\n\n  return -1;\n}\n\nchar *sftp_readlink(sftp_session sftp, const char *path)\n{\n    sftp_status_message status = NULL;\n    sftp_message msg = NULL;\n    ssh_buffer buffer;\n    uint32_t id;\n    int rc;\n\n    if (sftp == NULL) {\n        return NULL;\n    }\n\n    if (path == NULL) {\n        ssh_set_error_invalid(sftp);\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        return NULL;\n    }\n    if (sftp->version < 3){\n        ssh_set_error(sftp,SSH_REQUEST_DENIED,\"sftp version %d does not support sftp_readlink\",sftp->version);\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        return NULL;\n    }\n    buffer = ssh_buffer_new();\n    if (buffer == NULL) {\n        ssh_set_error_oom(sftp->session);\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        return NULL;\n    }\n\n    id = sftp_get_new_id(sftp);\n\n    rc = ssh_buffer_pack(buffer,\n                         \"ds\",\n                         id,\n                         path);\n    if (rc < 0) {\n        ssh_set_error_oom(sftp->session);\n        SSH_BUFFER_FREE(buffer);\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        return NULL;\n    }\n\n    rc = sftp_packet_write(sftp, SSH_FXP_READLINK, buffer);\n    SSH_BUFFER_FREE(buffer);\n    if (rc < 0) {\n        return NULL;\n    }\n\n    while (msg == NULL) {\n        if (sftp_read_and_dispatch(sftp) < 0) {\n            return NULL;\n        }\n        msg = sftp_dequeue(sftp, id);\n    }\n\n    if (msg->packet_type == SSH_FXP_NAME) {\n        uint32_t ignored = 0;\n        char *lnk = NULL;\n\n        rc = ssh_buffer_unpack(msg->payload,\n                               \"ds\",\n                               &ignored,\n                               &lnk);\n        sftp_message_free(msg);\n        if (rc != SSH_OK) {\n            ssh_set_error(sftp->session,\n                          SSH_ERROR,\n                          \"Failed to retrieve link\");\n            sftp_set_error(sftp, SSH_FX_FAILURE);\n            return NULL;\n        }\n\n        return lnk;\n    } else if (msg->packet_type == SSH_FXP_STATUS) { /* bad response (error) */\n        status = parse_status_msg(msg);\n        sftp_message_free(msg);\n        if (status == NULL) {\n            return NULL;\n        }\n        sftp_set_error(sftp, status->status);\n        ssh_set_error(sftp->session, SSH_REQUEST_DENIED,\n                \"SFTP server: %s\", status->errormsg);\n        status_msg_free(status);\n    } else { /* this shouldn't happen */\n        ssh_set_error(sftp->session, SSH_FATAL,\n                \"Received message %d when attempting to set stats\", msg->packet_type);\n        sftp_message_free(msg);\n        sftp_set_error(sftp, SSH_FX_BAD_MESSAGE);\n    }\n\n    return NULL;\n}\n\nstatic sftp_statvfs_t sftp_parse_statvfs(sftp_session sftp, ssh_buffer buf) {\n  sftp_statvfs_t  statvfs;\n  int rc;\n\n  statvfs = calloc(1, sizeof(struct sftp_statvfs_struct));\n  if (statvfs == NULL) {\n    ssh_set_error_oom(sftp->session);\n    sftp_set_error(sftp, SSH_FX_FAILURE);\n    return NULL;\n  }\n\n  rc = ssh_buffer_unpack(buf, \"qqqqqqqqqqq\",\n          &statvfs->f_bsize,  /* file system block size */\n          &statvfs->f_frsize, /* fundamental fs block size */\n          &statvfs->f_blocks, /* number of blocks (unit f_frsize) */\n          &statvfs->f_bfree,  /* free blocks in file system */\n          &statvfs->f_bavail, /* free blocks for non-root */\n          &statvfs->f_files,  /* total file inodes */\n          &statvfs->f_ffree,  /* free file inodes */\n          &statvfs->f_favail, /* free file inodes for to non-root */\n          &statvfs->f_fsid,   /* file system id */\n          &statvfs->f_flag,   /* bit mask of f_flag values */\n          &statvfs->f_namemax/* maximum filename length */\n          );\n  if (rc != SSH_OK) {\n    SAFE_FREE(statvfs);\n    ssh_set_error(sftp->session, SSH_FATAL, \"Invalid statvfs structure\");\n    sftp_set_error(sftp, SSH_FX_FAILURE);\n    return NULL;\n  }\n\n  return statvfs;\n}\n\nsftp_statvfs_t sftp_statvfs(sftp_session sftp, const char *path)\n{\n    sftp_status_message status = NULL;\n    sftp_message msg = NULL;\n    ssh_buffer buffer;\n    uint32_t id;\n    int rc;\n\n    if (sftp == NULL)\n        return NULL;\n    if (path == NULL) {\n        ssh_set_error_invalid(sftp->session);\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        return NULL;\n    }\n    if (sftp->version < 3){\n        ssh_set_error(sftp,SSH_REQUEST_DENIED,\"sftp version %d does not support sftp_statvfs\",sftp->version);\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        return NULL;\n    }\n\n    buffer = ssh_buffer_new();\n    if (buffer == NULL) {\n        ssh_set_error_oom(sftp->session);\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        return NULL;\n    }\n\n    id = sftp_get_new_id(sftp);\n\n    rc = ssh_buffer_pack(buffer,\n                         \"dss\",\n                         id,\n                         \"statvfs@openssh.com\",\n                         path);\n    if (rc != SSH_OK) {\n        ssh_set_error_oom(sftp->session);\n        SSH_BUFFER_FREE(buffer);\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        return NULL;\n    }\n\n    rc = sftp_packet_write(sftp, SSH_FXP_EXTENDED, buffer);\n    SSH_BUFFER_FREE(buffer);\n    if (rc < 0) {\n        return NULL;\n    }\n\n    while (msg == NULL) {\n        if (sftp_read_and_dispatch(sftp) < 0) {\n            return NULL;\n        }\n        msg = sftp_dequeue(sftp, id);\n    }\n\n    if (msg->packet_type == SSH_FXP_EXTENDED_REPLY) {\n        sftp_statvfs_t  buf = sftp_parse_statvfs(sftp, msg->payload);\n        sftp_message_free(msg);\n        if (buf == NULL) {\n            return NULL;\n        }\n\n        return buf;\n    } else if (msg->packet_type == SSH_FXP_STATUS) { /* bad response (error) */\n        status = parse_status_msg(msg);\n        sftp_message_free(msg);\n        if (status == NULL) {\n            return NULL;\n        }\n        sftp_set_error(sftp, status->status);\n        ssh_set_error(sftp->session, SSH_REQUEST_DENIED,\n                \"SFTP server: %s\", status->errormsg);\n        status_msg_free(status);\n    } else { /* this shouldn't happen */\n        ssh_set_error(sftp->session, SSH_FATAL,\n                \"Received message %d when attempting to get statvfs\", msg->packet_type);\n        sftp_message_free(msg);\n        sftp_set_error(sftp, SSH_FX_BAD_MESSAGE);\n    }\n\n    return NULL;\n}\n\nint sftp_fsync(sftp_file file)\n{\n    sftp_session sftp;\n    sftp_message msg = NULL;\n    ssh_buffer buffer;\n    uint32_t id;\n    int rc;\n\n    if (file == NULL) {\n        return -1;\n    }\n    sftp = file->sftp;\n\n    buffer = ssh_buffer_new();\n    if (buffer == NULL) {\n        ssh_set_error_oom(sftp->session);\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        return -1;\n    }\n\n    id = sftp_get_new_id(sftp);\n\n    rc = ssh_buffer_pack(buffer,\n                         \"dsS\",\n                         id,\n                         \"fsync@openssh.com\",\n                         file->handle);\n    if (rc < 0) {\n        ssh_set_error_oom(sftp->session);\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        goto done;\n    }\n\n    rc = sftp_packet_write(sftp, SSH_FXP_EXTENDED, buffer);\n    if (rc < 0) {\n        ssh_set_error_oom(sftp->session);\n        goto done;\n    }\n\n    do {\n        rc = sftp_read_and_dispatch(sftp);\n        if (rc < 0) {\n            ssh_set_error_oom(sftp->session);\n            rc = -1;\n            goto done;\n        }\n        msg = sftp_dequeue(sftp, id);\n    } while (msg == NULL);\n\n    /* By specification, this command only returns SSH_FXP_STATUS */\n    if (msg->packet_type == SSH_FXP_STATUS) {\n        sftp_status_message status;\n\n        status = parse_status_msg(msg);\n        sftp_message_free(msg);\n        if (status == NULL) {\n            rc = -1;\n            goto done;\n        }\n\n        sftp_set_error(sftp, status->status);\n        switch (status->status) {\n            case SSH_FX_OK:\n                /* SUCCESS, LEAVE */\n                status_msg_free(status);\n                rc = 0;\n                goto done;\n            default:\n                break;\n        }\n\n        /*\n         * The status should be SSH_FX_OK if the command was successful, if it\n         * didn't, then there was an error\n         */\n        ssh_set_error(sftp->session,\n                      SSH_REQUEST_DENIED,\n                      \"SFTP server: %s\",\n                      status->errormsg);\n        status_msg_free(status);\n\n        rc = -1;\n        goto done;\n    } else {\n        ssh_set_error(sftp->session,\n                      SSH_FATAL,\n                      \"Received message %d when attempting to set stats\",\n                      msg->packet_type);\n        sftp_message_free(msg);\n        sftp_set_error(sftp, SSH_FX_BAD_MESSAGE);\n    }\n\n    rc = -1;\ndone:\n    SSH_BUFFER_FREE(buffer);\n\n    return rc;\n}\n\nsftp_statvfs_t sftp_fstatvfs(sftp_file file)\n{\n    sftp_status_message status = NULL;\n    sftp_message msg = NULL;\n    sftp_session sftp;\n    ssh_buffer buffer;\n    uint32_t id;\n    int rc;\n\n    if (file == NULL) {\n        return NULL;\n    }\n    sftp = file->sftp;\n\n    buffer = ssh_buffer_new();\n    if (buffer == NULL) {\n        ssh_set_error_oom(sftp->session);\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        return NULL;\n    }\n\n    id = sftp_get_new_id(sftp);\n\n    rc = ssh_buffer_pack(buffer,\n                         \"dsS\",\n                         id,\n                         \"fstatvfs@openssh.com\",\n                         file->handle);\n    if (rc < 0) {\n        ssh_set_error_oom(sftp->session);\n        SSH_BUFFER_FREE(buffer);\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        return NULL;\n    }\n\n    rc = sftp_packet_write(sftp, SSH_FXP_EXTENDED, buffer);\n    SSH_BUFFER_FREE(buffer);\n    if (rc < 0) {\n        return NULL;\n    }\n\n    while (msg == NULL) {\n        if (sftp_read_and_dispatch(sftp) < 0) {\n            return NULL;\n        }\n        msg = sftp_dequeue(sftp, id);\n    }\n\n    if (msg->packet_type == SSH_FXP_EXTENDED_REPLY) {\n        sftp_statvfs_t buf = sftp_parse_statvfs(sftp, msg->payload);\n        sftp_message_free(msg);\n        if (buf == NULL) {\n            return NULL;\n        }\n\n        return buf;\n    } else if (msg->packet_type == SSH_FXP_STATUS) { /* bad response (error) */\n        status = parse_status_msg(msg);\n        sftp_message_free(msg);\n        if (status == NULL) {\n            return NULL;\n        }\n        sftp_set_error(sftp, status->status);\n        ssh_set_error(sftp->session, SSH_REQUEST_DENIED,\n                \"SFTP server: %s\", status->errormsg);\n        status_msg_free(status);\n    } else { /* this shouldn't happen */\n        ssh_set_error(sftp->session, SSH_FATAL,\n                \"Received message %d when attempting to set stats\", msg->packet_type);\n        sftp_message_free(msg);\n        sftp_set_error(sftp, SSH_FX_BAD_MESSAGE);\n    }\n\n    return NULL;\n}\n\nvoid sftp_statvfs_free(sftp_statvfs_t statvfs) {\n    if (statvfs == NULL) {\n        return;\n    }\n\n    SAFE_FREE(statvfs);\n}\n\n/* another code written by Nick */\nchar *sftp_canonicalize_path(sftp_session sftp, const char *path)\n{\n    sftp_status_message status = NULL;\n    sftp_message msg = NULL;\n    ssh_buffer buffer;\n    uint32_t id;\n    int rc;\n\n    if (sftp == NULL)\n        return NULL;\n    if (path == NULL) {\n        ssh_set_error_invalid(sftp->session);\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        return NULL;\n    }\n\n    buffer = ssh_buffer_new();\n    if (buffer == NULL) {\n        ssh_set_error_oom(sftp->session);\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        return NULL;\n    }\n\n    id = sftp_get_new_id(sftp);\n\n    rc = ssh_buffer_pack(buffer,\n                         \"ds\",\n                         id,\n                         path);\n    if (rc < 0) {\n        ssh_set_error_oom(sftp->session);\n        SSH_BUFFER_FREE(buffer);\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        return NULL;\n    }\n\n    rc = sftp_packet_write(sftp, SSH_FXP_REALPATH, buffer);\n    SSH_BUFFER_FREE(buffer);\n    if (rc < 0) {\n        return NULL;\n    }\n\n    while (msg == NULL) {\n        if (sftp_read_and_dispatch(sftp) < 0) {\n            return NULL;\n        }\n        msg = sftp_dequeue(sftp, id);\n    }\n\n    if (msg->packet_type == SSH_FXP_NAME) {\n        uint32_t ignored = 0;\n        char *cname = NULL;\n\n        rc = ssh_buffer_unpack(msg->payload,\n                               \"ds\",\n                               &ignored,\n                               &cname);\n        sftp_message_free(msg);\n        if (rc != SSH_OK) {\n            ssh_set_error(sftp->session,\n                          SSH_ERROR,\n                          \"Failed to parse canonicalized path\");\n            sftp_set_error(sftp, SSH_FX_FAILURE);\n            return NULL;\n        }\n\n        return cname;\n    } else if (msg->packet_type == SSH_FXP_STATUS) { /* bad response (error) */\n        status = parse_status_msg(msg);\n        sftp_message_free(msg);\n        if (status == NULL) {\n            return NULL;\n        }\n        sftp_set_error(sftp, status->status);\n        ssh_set_error(sftp->session, SSH_REQUEST_DENIED,\n                \"SFTP server: %s\", status->errormsg);\n        status_msg_free(status);\n    } else { /* this shouldn't happen */\n        ssh_set_error(sftp->session, SSH_FATAL,\n                \"Received message %d when attempting to set stats\", msg->packet_type);\n        sftp_message_free(msg);\n        sftp_set_error(sftp, SSH_FX_BAD_MESSAGE);\n    }\n\n    return NULL;\n}\n\nstatic sftp_attributes sftp_xstat(sftp_session sftp,\n                                  const char *path,\n                                  int param)\n{\n    sftp_status_message status = NULL;\n    sftp_message msg = NULL;\n    ssh_buffer buffer;\n    uint32_t id;\n    int rc;\n\n    if (sftp == NULL) {\n        return NULL;\n    }\n\n    if (path == NULL) {\n        ssh_set_error_invalid(sftp->session);\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        return NULL;\n    }\n\n    buffer = ssh_buffer_new();\n    if (buffer == NULL) {\n        ssh_set_error_oom(sftp->session);\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        return NULL;\n    }\n\n    id = sftp_get_new_id(sftp);\n\n    rc = ssh_buffer_pack(buffer,\n                         \"ds\",\n                         id,\n                         path);\n    if (rc != SSH_OK) {\n        ssh_set_error_oom(sftp->session);\n        SSH_BUFFER_FREE(buffer);\n        sftp_set_error(sftp, SSH_FX_FAILURE);\n        return NULL;\n    }\n\n    rc = sftp_packet_write(sftp, param, buffer);\n    SSH_BUFFER_FREE(buffer);\n    if (rc < 0) {\n        return NULL;\n    }\n\n    while (msg == NULL) {\n        if (sftp_read_and_dispatch(sftp) < 0) {\n            return NULL;\n        }\n        msg = sftp_dequeue(sftp, id);\n    }\n\n    if (msg->packet_type == SSH_FXP_ATTRS) {\n        sftp_attributes attr = sftp_parse_attr(sftp, msg->payload, 0);\n        sftp_message_free(msg);\n\n        return attr;\n    } else if (msg->packet_type == SSH_FXP_STATUS) {\n        status = parse_status_msg(msg);\n        sftp_message_free(msg);\n        if (status == NULL) {\n            return NULL;\n        }\n        sftp_set_error(sftp, status->status);\n        ssh_set_error(sftp->session, SSH_REQUEST_DENIED,\n                \"SFTP server: %s\", status->errormsg);\n        status_msg_free(status);\n        return NULL;\n    }\n    ssh_set_error(sftp->session, SSH_FATAL,\n            \"Received mesg %d during stat()\", msg->packet_type);\n    sftp_message_free(msg);\n    sftp_set_error(sftp, SSH_FX_BAD_MESSAGE);\n\n    return NULL;\n}\n\nsftp_attributes sftp_stat(sftp_session session, const char *path) {\n  return sftp_xstat(session, path, SSH_FXP_STAT);\n}\n\nsftp_attributes sftp_lstat(sftp_session session, const char *path) {\n  return sftp_xstat(session, path, SSH_FXP_LSTAT);\n}\n\nsftp_attributes sftp_fstat(sftp_file file)\n{\n    sftp_status_message status = NULL;\n    sftp_message msg = NULL;\n    ssh_buffer buffer;\n    uint32_t id;\n    int rc;\n\n    if (file == NULL) {\n        return NULL;\n    }\n\n    buffer = ssh_buffer_new();\n    if (buffer == NULL) {\n        ssh_set_error_oom(file->sftp->session);\n        sftp_set_error(file->sftp, SSH_FX_FAILURE);\n        return NULL;\n    }\n\n    id = sftp_get_new_id(file->sftp);\n\n    rc = ssh_buffer_pack(buffer,\n                         \"dS\",\n                         id,\n                         file->handle);\n    if (rc != SSH_OK) {\n        ssh_set_error_oom(file->sftp->session);\n        SSH_BUFFER_FREE(buffer);\n        sftp_set_error(file->sftp, SSH_FX_FAILURE);\n        return NULL;\n    }\n\n    rc = sftp_packet_write(file->sftp, SSH_FXP_FSTAT, buffer);\n    SSH_BUFFER_FREE(buffer);\n    if (rc < 0) {\n        return NULL;\n    }\n\n    while (msg == NULL) {\n        if (sftp_read_and_dispatch(file->sftp) < 0) {\n            return NULL;\n        }\n        msg = sftp_dequeue(file->sftp, id);\n    }\n\n    if (msg->packet_type == SSH_FXP_ATTRS){\n        sftp_attributes attr = sftp_parse_attr(file->sftp, msg->payload, 0);\n        sftp_message_free(msg);\n\n        return attr;\n    } else if (msg->packet_type == SSH_FXP_STATUS) {\n        status = parse_status_msg(msg);\n        sftp_message_free(msg);\n        if (status == NULL) {\n            return NULL;\n        }\n        sftp_set_error(file->sftp, status->status);\n        ssh_set_error(file->sftp->session, SSH_REQUEST_DENIED,\n                \"SFTP server: %s\", status->errormsg);\n        status_msg_free(status);\n\n        return NULL;\n    }\n    ssh_set_error(file->sftp->session, SSH_FATAL,\n            \"Received msg %d during fstat()\", msg->packet_type);\n    sftp_message_free(msg);\n    sftp_set_error(file->sftp, SSH_FX_BAD_MESSAGE);\n\n    return NULL;\n}\n\n#endif /* WITH_SFTP */\n"
  },
  {
    "path": "src/libssh/src/sftpserver.c",
    "content": "/*\n * sftpserver.c - server based function for the sftp protocol\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2005      by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <stdio.h>\n\n#ifndef _WIN32\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#endif\n\n#include \"libssh/libssh.h\"\n#include \"libssh/sftp.h\"\n#include \"libssh/sftp_priv.h\"\n#include \"libssh/ssh2.h\"\n#include \"libssh/priv.h\"\n#include \"libssh/buffer.h\"\n#include \"libssh/misc.h\"\n\n#define SFTP_HANDLES 256\n\nsftp_client_message sftp_get_client_message(sftp_session sftp) {\n  ssh_session session = sftp->session;\n  sftp_packet packet;\n  sftp_client_message msg;\n  ssh_buffer payload;\n  int rc;\n\n  msg = malloc(sizeof (struct sftp_client_message_struct));\n  if (msg == NULL) {\n    ssh_set_error_oom(session);\n    return NULL;\n  }\n  ZERO_STRUCTP(msg);\n\n  packet = sftp_packet_read(sftp);\n  if (packet == NULL) {\n    ssh_set_error_oom(session);\n    sftp_client_message_free(msg);\n    return NULL;\n  }\n\n  payload = packet->payload;\n  msg->type = packet->type;\n  msg->sftp = sftp;\n\n  /* take a copy of the whole packet */\n  msg->complete_message = ssh_buffer_new();\n  if (msg->complete_message == NULL) {\n      ssh_set_error_oom(session);\n      sftp_client_message_free(msg);\n      return NULL;\n  }\n\n  rc = ssh_buffer_add_data(msg->complete_message,\n                           ssh_buffer_get(payload),\n                           ssh_buffer_get_len(payload));\n  if (rc < 0) {\n      ssh_set_error_oom(session);\n      sftp_client_message_free(msg);\n      return NULL;\n  }\n\n  ssh_buffer_get_u32(payload, &msg->id);\n\n  switch(msg->type) {\n    case SSH_FXP_CLOSE:\n    case SSH_FXP_READDIR:\n      msg->handle = ssh_buffer_get_ssh_string(payload);\n      if (msg->handle == NULL) {\n        ssh_set_error_oom(session);\n        sftp_client_message_free(msg);\n        return NULL;\n      }\n      break;\n    case SSH_FXP_READ:\n      rc = ssh_buffer_unpack(payload,\n                             \"Sqd\",\n                             &msg->handle,\n                             &msg->offset,\n                             &msg->len);\n      if (rc != SSH_OK) {\n        ssh_set_error_oom(session);\n        sftp_client_message_free(msg);\n        return NULL;\n      }\n      break;\n    case SSH_FXP_WRITE:\n      rc = ssh_buffer_unpack(payload,\n                             \"SqS\",\n                             &msg->handle,\n                             &msg->offset,\n                             &msg->data);\n      if (rc != SSH_OK) {\n        ssh_set_error_oom(session);\n        sftp_client_message_free(msg);\n        return NULL;\n      }\n      break;\n    case SSH_FXP_REMOVE:\n    case SSH_FXP_RMDIR:\n    case SSH_FXP_OPENDIR:\n    case SSH_FXP_READLINK:\n    case SSH_FXP_REALPATH:\n      rc = ssh_buffer_unpack(payload,\n                             \"s\",\n                             &msg->filename);\n      if (rc != SSH_OK) {\n        ssh_set_error_oom(session);\n        sftp_client_message_free(msg);\n        return NULL;\n      }\n      break;\n    case SSH_FXP_RENAME:\n    case SSH_FXP_SYMLINK:\n      rc = ssh_buffer_unpack(payload,\n                             \"sS\",\n                             &msg->filename,\n                             &msg->data);\n      if (rc != SSH_OK) {\n        ssh_set_error_oom(session);\n        sftp_client_message_free(msg);\n        return NULL;\n      }\n      break;\n    case SSH_FXP_MKDIR:\n    case SSH_FXP_SETSTAT:\n      rc = ssh_buffer_unpack(payload,\n                             \"s\",\n                             &msg->filename);\n      if (rc != SSH_OK) {\n        ssh_set_error_oom(session);\n        sftp_client_message_free(msg);\n        return NULL;\n      }\n      msg->attr = sftp_parse_attr(sftp, payload, 0);\n      if (msg->attr == NULL) {\n        ssh_set_error_oom(session);\n        sftp_client_message_free(msg);\n        return NULL;\n      }\n      break;\n    case SSH_FXP_FSETSTAT:\n      msg->handle = ssh_buffer_get_ssh_string(payload);\n      if (msg->handle == NULL) {\n        ssh_set_error_oom(session);\n        sftp_client_message_free(msg);\n        return NULL;\n      }\n      msg->attr = sftp_parse_attr(sftp, payload, 0);\n      if (msg->attr == NULL) {\n        ssh_set_error_oom(session);\n        sftp_client_message_free(msg);\n        return NULL;\n      }\n      break;\n    case SSH_FXP_LSTAT:\n    case SSH_FXP_STAT:\n      rc = ssh_buffer_unpack(payload,\n                             \"s\",\n                             &msg->filename);\n      if (rc != SSH_OK) {\n        ssh_set_error_oom(session);\n        sftp_client_message_free(msg);\n        return NULL;\n      }\n      if(sftp->version > 3) {\n        ssh_buffer_unpack(payload, \"d\", &msg->flags);\n      }\n      break;\n    case SSH_FXP_OPEN:\n      rc = ssh_buffer_unpack(payload,\n                             \"sd\",\n                             &msg->filename,\n                             &msg->flags);\n      if (rc != SSH_OK) {\n        ssh_set_error_oom(session);\n        sftp_client_message_free(msg);\n        return NULL;\n      }\n      msg->attr = sftp_parse_attr(sftp, payload, 0);\n      if (msg->attr == NULL) {\n        ssh_set_error_oom(session);\n        sftp_client_message_free(msg);\n        return NULL;\n      }\n      break;\n    case SSH_FXP_FSTAT:\n      rc = ssh_buffer_unpack(payload,\n                             \"S\",\n                             &msg->handle);\n      if (rc != SSH_OK) {\n        ssh_set_error_oom(session);\n        sftp_client_message_free(msg);\n        return NULL;\n      }\n      break;\n    case SSH_FXP_EXTENDED:\n      rc = ssh_buffer_unpack(payload,\n                             \"s\",\n                             &msg->submessage);\n      if (rc != SSH_OK) {\n        ssh_set_error_oom(session);\n        sftp_client_message_free(msg);\n        return NULL;\n      }\n\n      if (strcmp(msg->submessage, \"hardlink@openssh.com\") == 0 ||\n          strcmp(msg->submessage, \"posix-rename@openssh.com\") == 0) {\n        rc = ssh_buffer_unpack(payload,\n                               \"sS\",\n                               &msg->filename,\n                               &msg->data);\n        if (rc != SSH_OK) {\n          ssh_set_error_oom(session);\n          sftp_client_message_free(msg);\n          return NULL;\n        }\n      }\n      break;\n    default:\n      ssh_set_error(sftp->session, SSH_FATAL,\n                    \"Received unhandled sftp message %d\", msg->type);\n      sftp_client_message_free(msg);\n      return NULL;\n  }\n\n  return msg;\n}\n\n/* Send an sftp client message. Can be used in cas of proxying */\nint sftp_send_client_message(sftp_session sftp, sftp_client_message msg){\n\treturn sftp_packet_write(sftp, msg->type, msg->complete_message);\n}\n\nuint8_t sftp_client_message_get_type(sftp_client_message msg){\n\treturn msg->type;\n}\n\nconst char *sftp_client_message_get_filename(sftp_client_message msg){\n\treturn msg->filename;\n}\n\nvoid sftp_client_message_set_filename(sftp_client_message msg, const char *newname){\n\tfree(msg->filename);\n\tmsg->filename = strdup(newname);\n}\n\nconst char *sftp_client_message_get_data(sftp_client_message msg){\n\tif (msg->str_data == NULL)\n\t\tmsg->str_data = ssh_string_to_char(msg->data);\n\treturn msg->str_data;\n}\n\nuint32_t sftp_client_message_get_flags(sftp_client_message msg){\n\treturn msg->flags;\n}\n\nconst char *sftp_client_message_get_submessage(sftp_client_message msg){\n        return msg->submessage;\n}\n\nvoid sftp_client_message_free(sftp_client_message msg) {\n  if (msg == NULL) {\n    return;\n  }\n\n  SAFE_FREE(msg->filename);\n  SAFE_FREE(msg->submessage);\n  SSH_STRING_FREE(msg->data);\n  SSH_STRING_FREE(msg->handle);\n  sftp_attributes_free(msg->attr);\n  SSH_BUFFER_FREE(msg->complete_message);\n  SAFE_FREE(msg->str_data);\n  ZERO_STRUCTP(msg);\n  SAFE_FREE(msg);\n}\n\nint sftp_reply_name(sftp_client_message msg, const char *name,\n    sftp_attributes attr) {\n  ssh_buffer out;\n  ssh_string file;\n\n  out = ssh_buffer_new();\n  if (out == NULL) {\n    return -1;\n  }\n\n  file = ssh_string_from_char(name);\n  if (file == NULL) {\n    SSH_BUFFER_FREE(out);\n    return -1;\n  }\n\n  if (ssh_buffer_add_u32(out, msg->id) < 0 ||\n      ssh_buffer_add_u32(out, htonl(1)) < 0 ||\n      ssh_buffer_add_ssh_string(out, file) < 0 ||\n      ssh_buffer_add_ssh_string(out, file) < 0 || /* The protocol is broken here between 3 & 4 */\n      buffer_add_attributes(out, attr) < 0 ||\n      sftp_packet_write(msg->sftp, SSH_FXP_NAME, out) < 0) {\n    SSH_BUFFER_FREE(out);\n    SSH_STRING_FREE(file);\n    return -1;\n  }\n  SSH_BUFFER_FREE(out);\n  SSH_STRING_FREE(file);\n\n  return 0;\n}\n\nint sftp_reply_handle(sftp_client_message msg, ssh_string handle){\n  ssh_buffer out;\n\n  out = ssh_buffer_new();\n  if (out == NULL) {\n    return -1;\n  }\n\n  if (ssh_buffer_add_u32(out, msg->id) < 0 ||\n      ssh_buffer_add_ssh_string(out, handle) < 0 ||\n      sftp_packet_write(msg->sftp, SSH_FXP_HANDLE, out) < 0) {\n    SSH_BUFFER_FREE(out);\n    return -1;\n  }\n  SSH_BUFFER_FREE(out);\n\n  return 0;\n}\n\nint sftp_reply_attr(sftp_client_message msg, sftp_attributes attr) {\n  ssh_buffer out;\n\n  out = ssh_buffer_new();\n  if (out == NULL) {\n    return -1;\n  }\n\n  if (ssh_buffer_add_u32(out, msg->id) < 0 ||\n      buffer_add_attributes(out, attr) < 0 ||\n      sftp_packet_write(msg->sftp, SSH_FXP_ATTRS, out) < 0) {\n    SSH_BUFFER_FREE(out);\n    return -1;\n  }\n  SSH_BUFFER_FREE(out);\n\n  return 0;\n}\n\nint sftp_reply_names_add(sftp_client_message msg, const char *file,\n    const char *longname, sftp_attributes attr) {\n  ssh_string name;\n\n  name = ssh_string_from_char(file);\n  if (name == NULL) {\n    return -1;\n  }\n\n  if (msg->attrbuf == NULL) {\n    msg->attrbuf = ssh_buffer_new();\n    if (msg->attrbuf == NULL) {\n      SSH_STRING_FREE(name);\n      return -1;\n    }\n  }\n\n  if (ssh_buffer_add_ssh_string(msg->attrbuf, name) < 0) {\n    SSH_STRING_FREE(name);\n    return -1;\n  }\n\n  SSH_STRING_FREE(name);\n  name = ssh_string_from_char(longname);\n  if (name == NULL) {\n    return -1;\n  }\n  if (ssh_buffer_add_ssh_string(msg->attrbuf,name) < 0 ||\n      buffer_add_attributes(msg->attrbuf,attr) < 0) {\n    SSH_STRING_FREE(name);\n    return -1;\n  }\n  SSH_STRING_FREE(name);\n  msg->attr_num++;\n\n  return 0;\n}\n\nint sftp_reply_names(sftp_client_message msg) {\n  ssh_buffer out;\n\n  out = ssh_buffer_new();\n  if (out == NULL) {\n    SSH_BUFFER_FREE(msg->attrbuf);\n    return -1;\n  }\n\n  if (ssh_buffer_add_u32(out, msg->id) < 0 ||\n      ssh_buffer_add_u32(out, htonl(msg->attr_num)) < 0 ||\n      ssh_buffer_add_data(out, ssh_buffer_get(msg->attrbuf),\n        ssh_buffer_get_len(msg->attrbuf)) < 0 ||\n      sftp_packet_write(msg->sftp, SSH_FXP_NAME, out) < 0) {\n    SSH_BUFFER_FREE(out);\n    SSH_BUFFER_FREE(msg->attrbuf);\n    return -1;\n  }\n\n  SSH_BUFFER_FREE(out);\n  SSH_BUFFER_FREE(msg->attrbuf);\n\n  msg->attr_num = 0;\n  msg->attrbuf = NULL;\n\n  return 0;\n}\n\nint sftp_reply_status(sftp_client_message msg, uint32_t status,\n    const char *message) {\n  ssh_buffer out;\n  ssh_string s;\n\n  out = ssh_buffer_new();\n  if (out == NULL) {\n    return -1;\n  }\n\n  s = ssh_string_from_char(message ? message : \"\");\n  if (s == NULL) {\n    SSH_BUFFER_FREE(out);\n    return -1;\n  }\n\n  if (ssh_buffer_add_u32(out, msg->id) < 0 ||\n      ssh_buffer_add_u32(out, htonl(status)) < 0 ||\n      ssh_buffer_add_ssh_string(out, s) < 0 ||\n      ssh_buffer_add_u32(out, 0) < 0 || /* language string */\n      sftp_packet_write(msg->sftp, SSH_FXP_STATUS, out) < 0) {\n    SSH_BUFFER_FREE(out);\n    SSH_STRING_FREE(s);\n    return -1;\n  }\n\n  SSH_BUFFER_FREE(out);\n  SSH_STRING_FREE(s);\n\n  return 0;\n}\n\nint sftp_reply_data(sftp_client_message msg, const void *data, int len) {\n  ssh_buffer out;\n\n  out = ssh_buffer_new();\n  if (out == NULL) {\n    return -1;\n  }\n\n  if (ssh_buffer_add_u32(out, msg->id) < 0 ||\n      ssh_buffer_add_u32(out, ntohl(len)) < 0 ||\n      ssh_buffer_add_data(out, data, len) < 0 ||\n      sftp_packet_write(msg->sftp, SSH_FXP_DATA, out) < 0) {\n    SSH_BUFFER_FREE(out);\n    return -1;\n  }\n  SSH_BUFFER_FREE(out);\n\n  return 0;\n}\n\n/*\n * This function will return you a new handle to give the client.\n * the function accepts an info that can be retrieved later with\n * the handle. Care is given that a corrupted handle won't give a\n * valid info (or worse).\n */\nssh_string sftp_handle_alloc(sftp_session sftp, void *info) {\n  ssh_string ret;\n  uint32_t val;\n  uint32_t i;\n\n  if (sftp->handles == NULL) {\n    sftp->handles = calloc(SFTP_HANDLES, sizeof(void *));\n    if (sftp->handles == NULL) {\n      return NULL;\n    }\n  }\n\n  for (i = 0; i < SFTP_HANDLES; i++) {\n    if (sftp->handles[i] == NULL) {\n      break;\n    }\n  }\n\n  if (i == SFTP_HANDLES) {\n    return NULL; /* no handle available */\n  }\n\n  val = i;\n  ret = ssh_string_new(4);\n  if (ret == NULL) {\n    return NULL;\n  }\n\n  memcpy(ssh_string_data(ret), &val, sizeof(uint32_t));\n  sftp->handles[i] = info;\n\n  return ret;\n}\n\nvoid *sftp_handle(sftp_session sftp, ssh_string handle){\n  uint32_t val;\n\n  if (sftp->handles == NULL) {\n    return NULL;\n  }\n\n  if (ssh_string_len(handle) != sizeof(uint32_t)) {\n    return NULL;\n  }\n\n  memcpy(&val, ssh_string_data(handle), sizeof(uint32_t));\n\n  if (val > SFTP_HANDLES) {\n    return NULL;\n  }\n\n  return sftp->handles[val];\n}\n\nvoid sftp_handle_remove(sftp_session sftp, void *handle) {\n  int i;\n\n  for (i = 0; i < SFTP_HANDLES; i++) {\n    if (sftp->handles[i] == handle) {\n      sftp->handles[i] = NULL;\n      break;\n    }\n  }\n}\n"
  },
  {
    "path": "src/libssh/src/socket.c",
    "content": "/*\n * socket.c - socket functions for the library\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2008-2010      by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <errno.h>\n#include <stdio.h>\n#ifdef _WIN32\n#include <winsock2.h>\n#include <ws2tcpip.h>\n#if _MSC_VER >= 1400\n#include <io.h>\n#undef open\n#define open _open\n#undef close\n#define close _close\n#undef read\n#define read _read\n#undef write\n#define write _write\n#endif /* _MSC_VER */\n#else /* _WIN32 */\n#include <fcntl.h>\n#include <sys/types.h>\n#include <sys/wait.h>\n#include <sys/socket.h>\n#include <sys/un.h>\n#include <signal.h>\n#endif /* _WIN32 */\n\n#include \"libssh/priv.h\"\n#include \"libssh/callbacks.h\"\n#include \"libssh/socket.h\"\n#include \"libssh/buffer.h\"\n#include \"libssh/poll.h\"\n#include \"libssh/session.h\"\n\n/**\n * @internal\n *\n * @defgroup libssh_socket The SSH socket functions.\n * @ingroup libssh\n *\n * Functions for handling sockets.\n *\n * @{\n */\n\nenum ssh_socket_states_e {\n\tSSH_SOCKET_NONE,\n\tSSH_SOCKET_CONNECTING,\n\tSSH_SOCKET_CONNECTED,\n\tSSH_SOCKET_EOF,\n\tSSH_SOCKET_ERROR,\n\tSSH_SOCKET_CLOSED\n};\n\nstruct ssh_socket_struct {\n  socket_t fd;\n  int fd_is_socket;\n  int last_errno;\n  int read_wontblock; /* reading now on socket will\n                       not block */\n  int write_wontblock;\n  int data_except;\n  enum ssh_socket_states_e state;\n  ssh_buffer out_buffer;\n  ssh_buffer in_buffer;\n  ssh_session session;\n  ssh_socket_callbacks callbacks;\n  ssh_socket_external_callbacks external_callbacks;\n  ssh_poll_handle poll_handle;\n#ifndef _WIN32\n  pid_t proxy_pid;\n#endif\n};\n\nstatic int sockets_initialized = 0;\n\nstatic ssize_t ssh_socket_unbuffered_read(ssh_socket s,\n                                          void *buffer,\n                                          uint32_t len);\nstatic ssize_t ssh_socket_unbuffered_write(ssh_socket s,\n                                           const void *buffer,\n                                           uint32_t len);\n\n/**\n * \\internal\n * \\brief inits the socket system (windows specific)\n */\nint ssh_socket_init(void)\n{\n    if (sockets_initialized == 0) {\n#ifdef _WIN32\n        struct WSAData wsaData;\n\n        /* Initiates use of the Winsock DLL by a process. */\n        if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0) {\n            return -1;\n        }\n#endif\n        ssh_poll_init();\n\n        sockets_initialized = 1;\n    }\n\n    return 0;\n}\n\n/**\n * @brief Cleanup the socket system.\n */\nvoid ssh_socket_cleanup(void)\n{\n    if (sockets_initialized == 1) {\n        ssh_poll_cleanup();\n#ifdef _WIN32\n        WSACleanup();\n#endif\n        sockets_initialized = 0;\n    }\n}\n\n\n/**\n * \\internal\n * \\brief creates a new Socket object\n */\nssh_socket ssh_socket_new(ssh_session session)\n{\n    ssh_socket s;\n\n    s = calloc(1, sizeof(struct ssh_socket_struct));\n    if (s == NULL) {\n        ssh_set_error_oom(session);\n        return NULL;\n    }\n    s->fd = SSH_INVALID_SOCKET;\n    s->last_errno = -1;\n    s->fd_is_socket = 1;\n    s->session = session;\n    s->in_buffer = ssh_buffer_new();\n    if (s->in_buffer == NULL) {\n        ssh_set_error_oom(session);\n        SAFE_FREE(s);\n        return NULL;\n    }\n    s->out_buffer=ssh_buffer_new();\n    if (s->out_buffer == NULL) {\n        ssh_set_error_oom(session);\n        SSH_BUFFER_FREE(s->in_buffer);\n        SAFE_FREE(s);\n        return NULL;\n    }\n    s->read_wontblock = 0;\n    s->write_wontblock = 0;\n    s->data_except = 0;\n    s->poll_handle = NULL;\n    s->state=SSH_SOCKET_NONE;\n    return s;\n}\n\n/**\n * @internal\n * @brief Reset the state of a socket so it looks brand-new\n * @param[in] s socket to rest\n */\nvoid ssh_socket_reset(ssh_socket s)\n{\n    s->fd = SSH_INVALID_SOCKET;\n    s->last_errno = -1;\n    s->fd_is_socket = 1;\n    ssh_buffer_reinit(s->in_buffer);\n    ssh_buffer_reinit(s->out_buffer);\n    s->read_wontblock = 0;\n    s->write_wontblock = 0;\n    s->data_except = 0;\n    s->poll_handle = NULL;\n    s->state=SSH_SOCKET_NONE;\n#ifndef _WIN32\n    s->proxy_pid = 0;\n#endif\n}\n\n/**\n * @internal\n * @brief the socket callbacks, i.e. callbacks to be called\n * upon a socket event.\n * @param s socket to set callbacks on.\n * @param callbacks a ssh_socket_callback object reference.\n */\n\nvoid ssh_socket_set_callbacks(ssh_socket s, ssh_socket_callbacks callbacks)\n{\n    s->callbacks = callbacks;\n}\n\nvoid ssh_socket_set_external_callbacks(ssh_socket s, ssh_socket_external_callbacks external_callbacks)\n{\n    s->external_callbacks = external_callbacks;\n}\n\n/**\n * @brief               SSH poll callback. This callback will be used when an event\n *                      caught on the socket.\n *\n * @param p             Poll object this callback belongs to.\n * @param fd            The raw socket.\n * @param revents       The current poll events on the socket.\n * @param userdata      Userdata to be passed to the callback function,\n *                      in this case the socket object.\n *\n * @return              0 on success, < 0 when the poll object has been removed\n *                      from its poll context.\n */\nint ssh_socket_pollcallback(struct ssh_poll_handle_struct *p,\n                            socket_t fd,\n                            int revents,\n                            void *v_s)\n{\n    ssh_socket s = (ssh_socket)v_s;\n    char buffer[MAX_BUF_SIZE];\n    ssize_t nread;\n    int rc;\n    int err = 0;\n    socklen_t errlen = sizeof(err);\n\n    /* Do not do anything if this socket was already closed */\n    if (!ssh_socket_is_open(s)) {\n        return -1;\n    }\n    SSH_LOG(SSH_LOG_TRACE, \"Poll callback on socket %d (%s%s%s), out buffer %d\",fd,\n            (revents & POLLIN) ? \"POLLIN \":\"\",\n            (revents & POLLOUT) ? \"POLLOUT \":\"\",\n            (revents & POLLERR) ? \"POLLERR\":\"\",\n            ssh_buffer_get_len(s->out_buffer));\n    if ((revents & POLLERR) || (revents & POLLHUP)) {\n        /* Check if we are in a connecting state */\n        if (s->state == SSH_SOCKET_CONNECTING) {\n            s->state = SSH_SOCKET_ERROR;\n            rc = getsockopt(fd, SOL_SOCKET, SO_ERROR, (char *)&err, &errlen);\n            if (rc < 0) {\n                err = errno;\n            }\n            ssh_socket_close(s);\n            /* Overwrite ssh_socket_close() error with the real socket error */\n            s->last_errno = err;\n            errno = err;\n\n            if (s->callbacks != NULL && s->callbacks->connected != NULL) {\n                s->callbacks->connected(SSH_SOCKET_CONNECTED_ERROR,\n                                        err,\n                                        s->callbacks->userdata);\n            }\n\n            return -1;\n        }\n        /* Then we are in a more standard kind of error */\n        /* force a read to get an explanation */\n        revents |= POLLIN;\n    }\n    if ((revents & POLLIN) && s->state == SSH_SOCKET_CONNECTED) {\n        s->read_wontblock = 1;\n        nread = ssh_socket_unbuffered_read(s, buffer, sizeof(buffer));\n        if (nread < 0) {\n            if (p != NULL) {\n                ssh_poll_remove_events(p, POLLIN);\n            }\n\n            if (s->callbacks != NULL && s->callbacks->exception != NULL) {\n                s->callbacks->exception(SSH_SOCKET_EXCEPTION_ERROR,\n                                        s->last_errno,\n                                        s->callbacks->userdata);\n            }\n            return -2;\n        }\n        if (nread == 0) {\n            if (p != NULL) {\n                ssh_poll_remove_events(p, POLLIN);\n            }\n            if (s->callbacks != NULL && s->callbacks->exception != NULL) {\n                s->callbacks->exception(SSH_SOCKET_EXCEPTION_EOF,\n                                        0,\n                                        s->callbacks->userdata);\n            }\n            return -2;\n        }\n\n        if (s->session->socket_counter != NULL) {\n            s->session->socket_counter->in_bytes += nread;\n        }\n\n        /* Bufferize the data and then call the callback */\n        rc = ssh_buffer_add_data(s->in_buffer, buffer, nread);\n        if (rc < 0) {\n            return -1;\n        }\n        if (s->callbacks != NULL && s->callbacks->data != NULL) {\n            do {\n                nread = s->callbacks->data(ssh_buffer_get(s->in_buffer),\n                                       ssh_buffer_get_len(s->in_buffer),\n                                       s->callbacks->userdata);\n                ssh_buffer_pass_bytes(s->in_buffer, nread);\n            } while ((nread > 0) && (s->state == SSH_SOCKET_CONNECTED));\n\n            /* p may have been freed, so don't use it\n             * anymore in this function */\n            p = NULL;\n        }\n    }\n#ifdef _WIN32\n    if (revents & POLLOUT || revents & POLLWRNORM) {\n#else\n    if (revents & POLLOUT) {\n#endif\n        uint32_t len;\n\n        /* First, POLLOUT is a sign we may be connected */\n        if (s->state == SSH_SOCKET_CONNECTING) {\n            SSH_LOG(SSH_LOG_PACKET, \"Received POLLOUT in connecting state\");\n            s->state = SSH_SOCKET_CONNECTED;\n            if (p != NULL) {\n                ssh_poll_set_events(p, POLLOUT | POLLIN);\n            }\n\n            rc = ssh_socket_set_blocking(ssh_socket_get_fd(s));\n            if (rc < 0) {\n                return -1;\n            }\n\n            if (s->callbacks != NULL && s->callbacks->connected != NULL) {\n                s->callbacks->connected(SSH_SOCKET_CONNECTED_OK,\n                                        0,\n                                        s->callbacks->userdata);\n            }\n\n            return 0;\n        }\n\n        /* So, we can write data */\n        s->write_wontblock = 1;\n        if (p != NULL) {\n            ssh_poll_remove_events(p, POLLOUT);\n        }\n\n        /* If buffered data is pending, write it */\n        len = ssh_buffer_get_len(s->out_buffer);\n        if (len > 0) {\n            ssh_socket_nonblocking_flush(s);\n        } else if (s->callbacks != NULL && s->callbacks->controlflow != NULL) {\n            /* Otherwise advertise the upper level that write can be done */\n            SSH_LOG(SSH_LOG_TRACE,\"sending control flow event\");\n            s->callbacks->controlflow(SSH_SOCKET_FLOW_WRITEWONTBLOCK,\n                                      s->callbacks->userdata);\n        }\n        /* TODO: Find a way to put back POLLOUT when buffering occurs */\n    }\n\n    /* Return -1 if the poll handler disappeared */\n    if (s->poll_handle == NULL) {\n        return -1;\n    }\n\n    return 0;\n}\n\n/** @internal\n * @brief returns the poll handle corresponding to the socket,\n * creates it if it does not exist.\n * @returns allocated and initialized ssh_poll_handle object\n */\nssh_poll_handle ssh_socket_get_poll_handle(ssh_socket s)\n{\n    if (s->poll_handle) {\n        return s->poll_handle;\n    }\n    s->poll_handle = ssh_poll_new(s->fd,0,ssh_socket_pollcallback,s);\n    return s->poll_handle;\n}\n\n/** \\internal\n * \\brief Deletes a socket object\n */\nvoid ssh_socket_free(ssh_socket s)\n{\n    if (s == NULL) {\n        return;\n    }\n    ssh_socket_close(s);\n    SSH_BUFFER_FREE(s->in_buffer);\n    SSH_BUFFER_FREE(s->out_buffer);\n    SAFE_FREE(s);\n}\n\n#ifndef _WIN32\nint ssh_socket_unix(ssh_socket s, const char *path)\n{\n    struct sockaddr_un sunaddr;\n    socket_t fd;\n    sunaddr.sun_family = AF_UNIX;\n    snprintf(sunaddr.sun_path, sizeof(sunaddr.sun_path), \"%s\", path);\n\n    fd = socket(AF_UNIX, SOCK_STREAM, 0);\n    if (fd == SSH_INVALID_SOCKET) {\n        ssh_set_error(s->session, SSH_FATAL,\n                      \"Error from socket(AF_UNIX, SOCK_STREAM, 0): %s\",\n                      strerror(errno));\n        return -1;\n    }\n\n    if (fcntl(fd, F_SETFD, 1) == -1) {\n        ssh_set_error(s->session, SSH_FATAL,\n                      \"Error from fcntl(fd, F_SETFD, 1): %s\",\n                      strerror(errno));\n        close(fd);\n        return -1;\n    }\n\n    if (connect(fd, (struct sockaddr *) &sunaddr, sizeof(sunaddr)) < 0) {\n        ssh_set_error(s->session, SSH_FATAL, \"Error from connect(): %s\",\n                      strerror(errno));\n        close(fd);\n        return -1;\n    }\n    ssh_socket_set_fd(s,fd);\n    return 0;\n}\n#endif\n\n/** \\internal\n * \\brief closes a socket\n */\nvoid ssh_socket_close(ssh_socket s)\n{\n    if (ssh_socket_is_open(s)) {\n#ifdef _WIN32\n        CLOSE_SOCKET(s->fd);\n        s->last_errno = WSAGetLastError();\n#else\n        CLOSE_SOCKET(s->fd);\n        s->last_errno = errno;\n#endif\n    }\n\n    if (s->poll_handle != NULL) {\n        ssh_poll_free(s->poll_handle);\n        s->poll_handle = NULL;\n    }\n\n    s->state = SSH_SOCKET_CLOSED;\n\n#ifndef _WIN32\n    /* If the proxy command still runs try to kill it */\n    if (s->proxy_pid != 0) {\n        int status;\n        pid_t pid = s->proxy_pid;\n\n        s->proxy_pid = 0;\n        kill(pid, SIGTERM);\n        while (waitpid(pid, &status, 0) == -1) {\n            if (errno != EINTR) {\n                SSH_LOG(SSH_LOG_WARN, \"waitpid failed: %s\", strerror(errno));\n                return;\n            }\n        }\n        if (!WIFEXITED(status)) {\n            SSH_LOG(SSH_LOG_WARN, \"Proxy command exitted abnormally\");\n            return;\n        }\n        SSH_LOG(SSH_LOG_TRACE, \"Proxy command returned %d\", WEXITSTATUS(status));\n    }\n#endif\n}\n\n/**\n * @internal\n * @brief sets the file descriptor of the socket.\n * @param[out] s ssh_socket to update\n * @param[in] fd file descriptor to set\n * @warning this function updates boths the input and output\n * file descriptors\n */\nvoid ssh_socket_set_fd(ssh_socket s, socket_t fd)\n{\n    s->fd = fd;\n\n    if (s->poll_handle) {\n        ssh_poll_set_fd(s->poll_handle,fd);\n    } else {\n        s->state = SSH_SOCKET_CONNECTING;\n\n        /* POLLOUT is the event to wait for in a nonblocking connect */\n        ssh_poll_set_events(ssh_socket_get_poll_handle(s), POLLOUT);\n#ifdef _WIN32\n        ssh_poll_add_events(ssh_socket_get_poll_handle(s), POLLWRNORM);\n#endif\n    }\n}\n\n/** \\internal\n * \\brief returns the input file descriptor of the socket\n */\nsocket_t ssh_socket_get_fd(ssh_socket s)\n{\n    return s->fd;\n}\n\n/** \\internal\n * \\brief returns nonzero if the socket is open\n */\nint ssh_socket_is_open(ssh_socket s)\n{\n    return s->fd != SSH_INVALID_SOCKET;\n}\n\n/** \\internal\n * \\brief read len bytes from socket into buffer\n */\nstatic ssize_t ssh_socket_unbuffered_read(ssh_socket s,\n                                          void *buffer,\n                                          uint32_t len)\n{\n    ssize_t rc = -1;\n\n    if (s->data_except) {\n        return -1;\n    }\n    if (s->fd_is_socket) {\n        rc = recv(s->fd,buffer, len, 0);\n    } else {\n        rc = read(s->fd,buffer, len);\n    }\n#ifdef _WIN32\n    s->last_errno = WSAGetLastError();\n#else\n    s->last_errno = errno;\n#endif\n    s->read_wontblock = 0;\n\n    if (rc < 0) {\n        s->data_except = 1;\n    }\n\n    return rc;\n}\n\n/** \\internal\n * \\brief writes len bytes from buffer to socket\n */\nstatic ssize_t ssh_socket_unbuffered_write(ssh_socket s,\n                                           const void *buffer,\n                                           uint32_t len)\n{\n    ssize_t w = -1;\n    int flags = 0;\n\n#ifdef MSG_NOSIGNAL\n    flags |= MSG_NOSIGNAL;\n#endif\n\n    if (s->data_except) {\n        return -1;\n    }\n\n    if (s->fd_is_socket) {\n        if (s->external_callbacks->send != NULL) {\n            w = s->external_callbacks->send(buffer, len, s->external_callbacks->userdata);\n        } else {\n            w = send(s->fd, buffer, len, flags);\n        }\n    } else {\n        w = write(s->fd, buffer, len);\n    }\n#ifdef _WIN32\n    s->last_errno = WSAGetLastError();\n#else\n    s->last_errno = errno;\n#endif\n    s->write_wontblock = 0;\n    /* Reactive the POLLOUT detector in the poll multiplexer system */\n    if (s->poll_handle) {\n        SSH_LOG(SSH_LOG_PACKET, \"Enabling POLLOUT for socket\");\n        ssh_poll_set_events(s->poll_handle,ssh_poll_get_events(s->poll_handle) | POLLOUT);\n    }\n    if (w < 0) {\n        s->data_except = 1;\n    }\n\n    return w;\n}\n\n/** \\internal\n * \\brief returns nonzero if the current socket is in the fd_set\n */\nint ssh_socket_fd_isset(ssh_socket s, fd_set *set)\n{\n    if(s->fd == SSH_INVALID_SOCKET) {\n        return 0;\n    }\n    return FD_ISSET(s->fd,set);\n}\n\n/** \\internal\n * \\brief sets the current fd in a fd_set and updates the max_fd\n */\n\nvoid ssh_socket_fd_set(ssh_socket s, fd_set *set, socket_t *max_fd)\n{\n    if (s->fd == SSH_INVALID_SOCKET) {\n        return;\n    }\n\n    FD_SET(s->fd,set);\n\n    if (s->fd >= 0 &&\n        s->fd >= *max_fd &&\n        s->fd != SSH_INVALID_SOCKET) {\n        *max_fd = s->fd + 1;\n    }\n}\n\n/** \\internal\n * \\brief buffered write of data\n * \\returns SSH_OK, or SSH_ERROR\n * \\warning has no effect on socket before a flush\n */\nint ssh_socket_write(ssh_socket s, const void *buffer, int len)\n{\n    if (len > 0) {\n        if (ssh_buffer_add_data(s->out_buffer, buffer, len) < 0) {\n            ssh_set_error_oom(s->session);\n            return SSH_ERROR;\n        }\n        ssh_socket_nonblocking_flush(s);\n    }\n\n    return SSH_OK;\n}\n\n\n/** \\internal\n * \\brief starts a nonblocking flush of the output buffer\n *\n */\nint ssh_socket_nonblocking_flush(ssh_socket s)\n{\n    ssh_session session = s->session;\n    uint32_t len;\n\n    if (!ssh_socket_is_open(s)) {\n        session->alive = 0;\n        if (s->callbacks && s->callbacks->exception) {\n            s->callbacks->exception(SSH_SOCKET_EXCEPTION_ERROR,\n                                    s->last_errno,\n                                    s->callbacks->userdata);\n        } else {\n            ssh_set_error(session,\n                          SSH_FATAL,\n                          \"Writing packet: error on socket (or connection \"\n                          \"closed): %s\",\n                          strerror(s->last_errno));\n        }\n\n        return SSH_ERROR;\n    }\n\n    len = ssh_buffer_get_len(s->out_buffer);\n    if (!s->write_wontblock && s->poll_handle && len > 0) {\n        /* force the poll system to catch pollout events */\n        ssh_poll_add_events(s->poll_handle, POLLOUT);\n\n        return SSH_AGAIN;\n    }\n\n    if (s->write_wontblock && len > 0) {\n        ssize_t bwritten;\n\n        bwritten = ssh_socket_unbuffered_write(s,\n                                               ssh_buffer_get(s->out_buffer),\n                                               len);\n        if (bwritten < 0) {\n            session->alive = 0;\n            ssh_socket_close(s);\n\n            if (s->callbacks && s->callbacks->exception) {\n                s->callbacks->exception(SSH_SOCKET_EXCEPTION_ERROR,\n                                        s->last_errno,\n                                        s->callbacks->userdata);\n            } else {\n                ssh_set_error(session,\n                              SSH_FATAL,\n                              \"Writing packet: error on socket (or connection \"\n                              \"closed): %s\",\n                              strerror(s->last_errno));\n            }\n\n            return SSH_ERROR;\n        }\n\n        ssh_buffer_pass_bytes(s->out_buffer, bwritten);\n        if (s->session->socket_counter != NULL) {\n            s->session->socket_counter->out_bytes += bwritten;\n        }\n    }\n\n    /* Is there some data pending? */\n    len = ssh_buffer_get_len(s->out_buffer);\n    if (s->poll_handle && len > 0) {\n        /* force the poll system to catch pollout events */\n        ssh_poll_add_events(s->poll_handle, POLLOUT);\n\n        return SSH_AGAIN;\n    }\n\n    /* all data written */\n    return SSH_OK;\n}\n\nvoid ssh_socket_set_write_wontblock(ssh_socket s)\n{\n    s->write_wontblock = 1;\n}\n\nvoid ssh_socket_set_read_wontblock(ssh_socket s)\n{\n    s->read_wontblock = 1;\n}\n\nvoid ssh_socket_set_except(ssh_socket s)\n{\n    s->data_except = 1;\n}\n\nint ssh_socket_data_available(ssh_socket s)\n{\n    return s->read_wontblock;\n}\n\nint ssh_socket_data_writable(ssh_socket s)\n{\n    return s->write_wontblock;\n}\n\n/** @internal\n * @brief returns the number of outgoing bytes currently buffered\n * @param s the socket\n * @returns numbers of bytes buffered, or 0 if the socket isn't connected\n */\nint ssh_socket_buffered_write_bytes(ssh_socket s)\n{\n    if (s==NULL || s->out_buffer == NULL) {\n        return 0;\n    }\n\n    return ssh_buffer_get_len(s->out_buffer);\n}\n\n\nint ssh_socket_get_status(ssh_socket s)\n{\n    int r = 0;\n\n    if (ssh_buffer_get_len(s->in_buffer) > 0) {\n        r |= SSH_READ_PENDING;\n    }\n\n    if (ssh_buffer_get_len(s->out_buffer) > 0) {\n        r |= SSH_WRITE_PENDING;\n    }\n\n    if (s->data_except) {\n        r |= SSH_CLOSED_ERROR;\n    }\n\n    return r;\n}\n\nint ssh_socket_get_poll_flags(ssh_socket s)\n{\n    int r = 0;\n    if (s->poll_handle != NULL && (ssh_poll_get_events (s->poll_handle) & POLLIN) > 0) {\n        r |= SSH_READ_PENDING;\n    }\n    if (s->poll_handle != NULL && (ssh_poll_get_events (s->poll_handle) & POLLOUT) > 0) {\n        r |= SSH_WRITE_PENDING;\n    }\n    return r;\n}\n\n#ifdef _WIN32\nint ssh_socket_set_nonblocking(socket_t fd)\n{\n    u_long nonblocking = 1;\n    return ioctlsocket(fd, FIONBIO, &nonblocking);\n}\n\nint ssh_socket_set_blocking(socket_t fd)\n{\n    u_long nonblocking = 0;\n    return ioctlsocket(fd, FIONBIO, &nonblocking);\n}\n\n#else /* _WIN32 */\nint ssh_socket_set_nonblocking(socket_t fd)\n{\n    return fcntl(fd, F_SETFL, O_NONBLOCK);\n}\n\nint ssh_socket_set_blocking(socket_t fd)\n{\n    return fcntl(fd, F_SETFL, 0);\n}\n#endif /* _WIN32 */\n\n/**\n * @internal\n * @brief Launches a socket connection\n * If a the socket connected callback has been defined and\n * a poll object exists, this call will be non blocking.\n * @param s    socket to connect.\n * @param host hostname or ip address to connect to.\n * @param port port number to connect to.\n * @param bind_addr address to bind to, or NULL for default.\n * @returns SSH_OK socket is being connected.\n * @returns SSH_ERROR error while connecting to remote host.\n * @bug It only tries connecting to one of the available AI's\n * which is problematic for hosts having DNS fail-over.\n */\nint ssh_socket_connect(ssh_socket s,\n                       const char *host,\n                       uint16_t port,\n                       const char *bind_addr)\n{\n    socket_t fd;\n    \n    if (s->state != SSH_SOCKET_NONE) {\n        ssh_set_error(s->session, SSH_FATAL,\n                      \"ssh_socket_connect called on socket not unconnected\");\n        return SSH_ERROR;\n    }\n    fd = ssh_connect_host_nonblocking(s->session, host, bind_addr, port);\n    SSH_LOG(SSH_LOG_PROTOCOL, \"Nonblocking connection socket: %d\", fd);\n    if (fd == SSH_INVALID_SOCKET) {\n        return SSH_ERROR;\n    }\n    ssh_socket_set_fd(s,fd);\n    \n    return SSH_OK;\n}\n\n#ifndef _WIN32\n/**\n * @internal\n * @brief executes a command and redirect input and outputs\n * @param command command to execute\n * @param in input file descriptor\n * @param out output file descriptor\n */\nvoid\nssh_execute_command(const char *command, socket_t in, socket_t out)\n{\n    const char *args[] = {\"/bin/sh\", \"-c\", command, NULL};\n    /* Prepare /dev/null socket for the stderr redirection */\n    int devnull = open(\"/dev/null\", O_WRONLY);\n    if (devnull == -1) {\n        SSH_LOG(SSH_LOG_WARNING, \"Failed to open /dev/null\");\n        exit(1);\n    }\n\n    /* redirect in and out to stdin, stdout */\n    dup2(in, 0);\n    dup2(out, 1);\n    /* Ignore anything on the stderr */\n    dup2(devnull, STDERR_FILENO);\n    close(in);\n    close(out);\n    execv(args[0], (char * const *)args);\n    exit(1);\n}\n\n/**\n * @internal\n * @brief Open a socket on a ProxyCommand\n * This call will always be nonblocking.\n * @param s    socket to connect.\n * @param command Command to execute.\n * @returns SSH_OK socket is being connected.\n * @returns SSH_ERROR error while executing the command.\n */\n\nint\nssh_socket_connect_proxycommand(ssh_socket s, const char *command)\n{\n    socket_t pair[2];\n    int pid;\n    int rc;\n\n    if (s->state != SSH_SOCKET_NONE) {\n        return SSH_ERROR;\n    }\n\n    rc = socketpair(PF_UNIX, SOCK_STREAM, 0, pair);\n    if (rc < 0) {\n        return SSH_ERROR;\n    }\n\n    SSH_LOG(SSH_LOG_PROTOCOL, \"Executing proxycommand '%s'\", command);\n    pid = fork();\n    if (pid == 0) {\n        ssh_execute_command(command, pair[0], pair[0]);\n        /* Does not return */\n    }\n    s->proxy_pid = pid;\n    close(pair[0]);\n    SSH_LOG(SSH_LOG_PROTOCOL, \"ProxyCommand connection pipe: [%d,%d]\",pair[0],pair[1]);\n    ssh_socket_set_fd(s, pair[1]);\n    s->state=SSH_SOCKET_CONNECTED;\n    s->fd_is_socket=0;\n    /* POLLOUT is the event to wait for in a nonblocking connect */\n    ssh_poll_set_events(ssh_socket_get_poll_handle(s), POLLIN | POLLOUT);\n    if (s->callbacks && s->callbacks->connected) {\n        s->callbacks->connected(SSH_SOCKET_CONNECTED_OK, 0, s->callbacks->userdata);\n    }\n\n    return SSH_OK;\n}\n\n#endif /* _WIN32 */\n/** @} */\n"
  },
  {
    "path": "src/libssh/src/string.c",
    "content": "/*\n * string.c - ssh string functions\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2003-2008 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <errno.h>\n#include <limits.h>\n\n#ifndef _WIN32\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#endif\n\n#include \"libssh/priv.h\"\n#include \"libssh/string.h\"\n\n/* String maximum size is 256M */\n#define STRING_SIZE_MAX 0x10000000\n\n/**\n * @defgroup libssh_string The SSH string functions\n * @ingroup libssh\n *\n * @brief String manipulations used in libssh.\n *\n * @{\n */\n\n/**\n * @brief Create a new SSH String object.\n *\n * @param[in] size       The size of the string.\n *\n * @return               The newly allocated string, NULL on error.\n */\nstruct ssh_string_struct *ssh_string_new(size_t size)\n{\n    struct ssh_string_struct *str = NULL;\n\n    if (size > STRING_SIZE_MAX) {\n        errno = EINVAL;\n        return NULL;\n    }\n\n    str = malloc(sizeof(struct ssh_string_struct) + size);\n    if (str == NULL) {\n        return NULL;\n    }\n\n    str->size = htonl(size);\n    str->data[0] = 0;\n\n    return str;\n}\n\n/**\n * @brief Fill a string with given data. The string should be big enough.\n *\n * @param s        An allocated string to fill with data.\n *\n * @param data     The data to fill the string with.\n *\n * @param len      Size of data.\n *\n * @return         0 on success, < 0 on error.\n */\nint ssh_string_fill(struct ssh_string_struct *s, const void *data, size_t len) {\n  if ((s == NULL) || (data == NULL) ||\n      (len == 0) || (len > ssh_string_len(s))) {\n    return -1;\n  }\n\n  memcpy(s->data, data, len);\n\n  return 0;\n}\n\n/**\n * @brief Create a ssh string using a C string\n *\n * @param[in] what      The source 0-terminated C string.\n *\n * @return              The newly allocated string, NULL on error with errno\n *                      set.\n *\n * @note The nul byte is not copied nor counted in the ouput string.\n */\nstruct ssh_string_struct *ssh_string_from_char(const char *what) {\n  struct ssh_string_struct *ptr;\n  size_t len;\n\n  if(what == NULL) {\n      errno = EINVAL;\n      return NULL;\n  }\n\n  len = strlen(what);\n\n  ptr = ssh_string_new(len);\n  if (ptr == NULL) {\n    return NULL;\n  }\n\n  memcpy(ptr->data, what, len);\n\n  return ptr;\n}\n\n/**\n * @brief Return the size of a SSH string.\n *\n * @param[in] s         The the input SSH string.\n *\n * @return The size of the content of the string, 0 on error.\n */\nsize_t ssh_string_len(struct ssh_string_struct *s) {\n    size_t size;\n\n    if (s == NULL) {\n        return 0;\n    }\n\n    size = ntohl(s->size);\n    if (size > 0 && size <= STRING_SIZE_MAX) {\n        return size;\n    }\n\n    return 0;\n}\n\n/**\n * @brief Get the the string as a C nul-terminated string.\n *\n * This is only available as long as the SSH string exists.\n *\n * @param[in] s         The SSH string to get the C string from.\n *\n * @return              The char pointer, NULL on error.\n */\nconst char *ssh_string_get_char(struct ssh_string_struct *s)\n{\n    if (s == NULL) {\n        return NULL;\n    }\n    s->data[ssh_string_len(s)] = '\\0';\n\n    return (const char *) s->data;\n}\n\n/**\n * @brief Convert a SSH string to a C nul-terminated string.\n *\n * @param[in] s         The SSH input string.\n *\n * @return              An allocated string pointer, NULL on error with errno\n *                      set.\n *\n * @note If the input SSH string contains zeroes, some parts of the output\n * string may not be readable with regular libc functions.\n */\nchar *ssh_string_to_char(struct ssh_string_struct *s) {\n  size_t len;\n  char *new;\n\n  if (s == NULL) {\n      return NULL;\n  }\n\n  len = ssh_string_len(s);\n  if (len + 1 < len) {\n    return NULL;\n  }\n\n  new = malloc(len + 1);\n  if (new == NULL) {\n    return NULL;\n  }\n  memcpy(new, s->data, len);\n  new[len] = '\\0';\n\n  return new;\n}\n\n/**\n * @brief Deallocate a char string object.\n *\n * @param[in] s         The string to delete.\n */\nvoid ssh_string_free_char(char *s) {\n    SAFE_FREE(s);\n}\n\n/**\n * @brief Copy a string, return a newly allocated string. The caller has to\n *        free the string.\n *\n * @param[in] s         String to copy.\n *\n * @return              Newly allocated copy of the string, NULL on error.\n */\nstruct ssh_string_struct *ssh_string_copy(struct ssh_string_struct *s) {\n  struct ssh_string_struct *new;\n  size_t len;\n\n  if (s == NULL) {\n      return NULL;\n  }\n\n  len = ssh_string_len(s);\n  if (len == 0) {\n      return NULL;\n  }\n\n  new = ssh_string_new(len);\n  if (new == NULL) {\n    return NULL;\n  }\n\n  memcpy(new->data, s->data, len);\n\n  return new;\n}\n\n/**\n * @brief Destroy the data in a string so it couldn't appear in a core dump.\n *\n * @param[in] s         The string to burn.\n */\nvoid ssh_string_burn(struct ssh_string_struct *s) {\n    if (s == NULL || s->size == 0) {\n        return;\n    }\n\n    explicit_bzero(s->data, ssh_string_len(s));\n}\n\n/**\n * @brief Get the payload of the string.\n *\n * @param s             The string to get the data from.\n *\n * @return              Return the data of the string or NULL on error.\n */\nvoid *ssh_string_data(struct ssh_string_struct *s) {\n  if (s == NULL) {\n    return NULL;\n  }\n\n  return s->data;\n}\n\n/**\n * @brief Deallocate a SSH string object.\n *\n * \\param[in] s         The SSH string to delete.\n */\nvoid ssh_string_free(struct ssh_string_struct *s) {\n  SAFE_FREE(s);\n}\n\n/** @} */\n"
  },
  {
    "path": "src/libssh/src/threads/libcrypto.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2018 by Anderson Toshiyuki Sasaki\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n#include \"libssh/crypto.h\"\n#include \"libssh/threads.h\"\n#include <libssh/callbacks.h>\n\n#if (OPENSSL_VERSION_NUMBER >= 0x10100000)\n\nint crypto_thread_init(struct ssh_threads_callbacks_struct *cb)\n{\n    (void) cb;\n    return SSH_OK;\n}\n\nvoid crypto_thread_finalize(void)\n{\n    return;\n}\n\n#else\n\nstatic struct ssh_threads_callbacks_struct *user_callbacks = NULL;\n\nstatic void **libcrypto_mutexes;\n\nvoid libcrypto_lock_callback(int mode, int i, const char *file, int line);\n\nvoid libcrypto_lock_callback(int mode, int i, const char *file, int line)\n{\n    (void)file;\n    (void)line;\n\n    if (mode & CRYPTO_LOCK) {\n        user_callbacks->mutex_lock(&libcrypto_mutexes[i]);\n    } else {\n        user_callbacks->mutex_unlock(&libcrypto_mutexes[i]);\n    }\n}\n\n#ifdef HAVE_OPENSSL_CRYPTO_THREADID_SET_CALLBACK\nstatic void libcrypto_THREADID_callback(CRYPTO_THREADID *id)\n{\n    unsigned long thread_id = (*user_callbacks->thread_id)();\n\n    CRYPTO_THREADID_set_numeric(id, thread_id);\n}\n#endif /* HAVE_OPENSSL_CRYPTO_THREADID_SET_CALLBACK */\n\nint crypto_thread_init(struct ssh_threads_callbacks_struct *cb)\n{\n    int n = CRYPTO_num_locks();\n    int cmp;\n    int i;\n\n    if (cb == NULL) {\n        return SSH_OK;\n    }\n\n    if (user_callbacks != NULL) {\n        crypto_thread_finalize();\n    }\n\n    user_callbacks = cb;\n\n    cmp = strcmp(user_callbacks->type, \"threads_noop\");\n    if (cmp == 0) {\n        return SSH_OK;\n    }\n\n    libcrypto_mutexes = calloc(n, sizeof(void *));\n    if (libcrypto_mutexes == NULL) {\n        return SSH_ERROR;\n    }\n\n    for (i = 0; i < n; ++i){\n        user_callbacks->mutex_init(&libcrypto_mutexes[i]);\n    }\n\n#ifdef HAVE_OPENSSL_CRYPTO_THREADID_SET_CALLBACK\n    CRYPTO_THREADID_set_callback(libcrypto_THREADID_callback);\n#else\n    CRYPTO_set_id_callback(user_callbacks->thread_id);\n#endif\n\n    CRYPTO_set_locking_callback(libcrypto_lock_callback);\n\n    return SSH_OK;\n}\n\nvoid crypto_thread_finalize(void)\n{\n    int n = CRYPTO_num_locks();\n    int i;\n\n    if (libcrypto_mutexes == NULL) {\n        return;\n    }\n\n#ifdef HAVE_OPENSSL_CRYPTO_THREADID_SET_CALLBACK\n    CRYPTO_THREADID_set_callback(NULL);\n#else\n    CRYPTO_set_id_callback(NULL);\n#endif\n\n    CRYPTO_set_locking_callback(NULL);\n\n    for (i = 0; i < n; ++i) {\n            user_callbacks->mutex_destroy(&libcrypto_mutexes[i]);\n    }\n    SAFE_FREE(libcrypto_mutexes);\n}\n\n#endif\n"
  },
  {
    "path": "src/libssh/src/threads/libgcrypt.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2018 by Anderson Toshiyuki Sasaki\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n#include \"libssh/crypto.h\"\n#include \"libssh/threads.h\"\n#include <libssh/callbacks.h>\n\n#if (GCRYPT_VERSION_NUMBER >= 0x010600)\n/* libgcrypt >= 1.6 does not support custom callbacks */\nGCRY_THREAD_OPTION_PTHREAD_IMPL;\n\nint crypto_thread_init(struct ssh_threads_callbacks_struct *user_callbacks)\n{\n    (void) user_callbacks;\n\n    return SSH_OK;\n}\n\n#else\n/* Libgcrypt < 1.6 specific way of handling thread callbacks */\n\nstatic struct gcry_thread_cbs gcrypt_threads_callbacks;\n\nint crypto_thread_init(struct ssh_threads_callbacks_struct *user_callbacks)\n{\n    int cmp;\n\n    if (user_callbacks == NULL) {\n        return SSH_OK;\n    }\n\n    cmp = strcmp(user_callbacks->type, \"threads_noop\");\n    if (cmp == 0) {\n        gcrypt_threads_callbacks.option= GCRY_THREAD_OPTION_VERSION << 8 ||\n        GCRY_THREAD_OPTION_DEFAULT;\n    } else {\n        gcrypt_threads_callbacks.option= GCRY_THREAD_OPTION_VERSION << 8 ||\n        GCRY_THREAD_OPTION_USER;\n    }\n\n    gcrypt_threads_callbacks.mutex_init = user_callbacks->mutex_init;\n    gcrypt_threads_callbacks.mutex_destroy = user_callbacks->mutex_destroy;\n    gcrypt_threads_callbacks.mutex_lock = user_callbacks->mutex_lock;\n    gcrypt_threads_callbacks.mutex_unlock = user_callbacks->mutex_unlock;\n    gcry_control(GCRYCTL_SET_THREAD_CBS, &gcrypt_threads_callbacks);\n\n    return SSH_OK;\n}\n\n#endif /* GCRYPT_VERSION_NUMBER */\n\nvoid crypto_thread_finalize(void)\n{\n    return;\n}\n"
  },
  {
    "path": "src/libssh/src/threads/mbedtls.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2018 by Anderson Toshiyuki Sasaki\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n#include \"libssh/crypto.h\"\n#include \"libssh/threads.h\"\n#include <libssh/callbacks.h>\n\n#include <mbedtls/threading.h>\n\nint crypto_thread_init(struct ssh_threads_callbacks_struct *user_callbacks)\n{\n    int cmp;\n\n    if (user_callbacks == NULL) {\n        return SSH_OK;\n    }\n\n    cmp = strcmp(user_callbacks->type, \"threads_noop\");\n    if (cmp == 0) {\n        return SSH_OK;\n    }\n#ifdef MBEDTLS_THREADING_ALT\n    else {\n        if (user_callbacks != NULL) {\n            crypto_thread_finalize();\n        }\n\n        mbedtls_threading_set_alt(user_callbacks->mutex_init,\n                                  user_callbacks->mutex_destroy,\n                                  user_callbacks->mutex_lock,\n                                  user_callbacks->mutex_unlock);\n    }\n#elif defined MBEDTLS_THREADING_PTHREAD\n    return SSH_OK;\n#else\n    return SSH_ERROR;\n#endif\n}\n\nvoid crypto_thread_finalize(void)\n{\n#ifdef MBEDTLS_THREADING_ALT\n    mbedtls_threading_free_alt();\n#endif\n    return;\n}\n"
  },
  {
    "path": "src/libssh/src/threads/noop.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2018 by Anderson Toshiyuki Sasaki\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n#include \"libssh/threads.h\"\n#include <libssh/callbacks.h>\n\nstatic int threads_noop(void **lock)\n{\n    (void)lock;\n\n    return 0;\n}\n\nstatic unsigned long threads_id_noop (void)\n{\n    return 1;\n}\n\nstatic struct ssh_threads_callbacks_struct ssh_threads_noop =\n{\n    .type = \"threads_noop\",\n    .mutex_init = threads_noop,\n    .mutex_destroy = threads_noop,\n    .mutex_lock = threads_noop,\n    .mutex_unlock = threads_noop,\n    .thread_id = threads_id_noop\n};\n\n/* Threads interface implementation */\n\n#if !(HAVE_PTHREAD) && !(defined _WIN32 || defined _WIN64)\nvoid ssh_mutex_lock(SSH_MUTEX *mutex)\n{\n    (void) mutex;\n\n    return;\n}\n\nvoid ssh_mutex_unlock(SSH_MUTEX *mutex)\n{\n    (void) mutex;\n\n    return;\n}\n\nstruct ssh_threads_callbacks_struct *ssh_threads_get_default(void)\n{\n    return &ssh_threads_noop;\n}\n#endif\n\nstruct ssh_threads_callbacks_struct *ssh_threads_get_noop(void)\n{\n    return &ssh_threads_noop;\n}\n"
  },
  {
    "path": "src/libssh/src/threads/pthread.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2010 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n#include \"libssh/threads.h\"\n#include <libssh/callbacks.h>\n\n#include <errno.h>\n#include <stdlib.h>\n#include <pthread.h>\n\nstatic int ssh_pthread_mutex_init (void **mutex)\n{\n    int rc = 0;\n\n    if (mutex == NULL) {\n        return EINVAL;\n    }\n\n    *mutex = malloc(sizeof(pthread_mutex_t));\n    if (*mutex == NULL) {\n        return ENOMEM;\n    }\n\n    rc = pthread_mutex_init ((pthread_mutex_t *)*mutex, NULL);\n    if (rc){\n        free (*mutex);\n        *mutex = NULL;\n    }\n\n    return rc;\n}\n\nstatic int ssh_pthread_mutex_destroy (void **mutex)\n{\n\n    int rc = 0;\n\n    if (mutex == NULL) {\n        return EINVAL;\n    }\n\n    rc = pthread_mutex_destroy ((pthread_mutex_t *)*mutex);\n\n    free (*mutex);\n    *mutex = NULL;\n\n    return rc;\n}\n\nstatic int ssh_pthread_mutex_lock (void **mutex)\n{\n    return pthread_mutex_lock((pthread_mutex_t *)*mutex);\n}\n\nstatic int ssh_pthread_mutex_unlock (void **mutex)\n{\n    return pthread_mutex_unlock((pthread_mutex_t *)*mutex);\n}\n\nstatic unsigned long ssh_pthread_thread_id (void)\n{\n#if defined(_WIN32) && !defined(__WINPTHREADS_VERSION)\n    return (unsigned long) pthread_self().p;\n#else\n    return (unsigned long) pthread_self();\n#endif\n}\n\nstatic struct ssh_threads_callbacks_struct ssh_threads_pthread =\n{\n    .type = \"threads_pthread\",\n    .mutex_init = ssh_pthread_mutex_init,\n    .mutex_destroy = ssh_pthread_mutex_destroy,\n    .mutex_lock = ssh_pthread_mutex_lock,\n    .mutex_unlock = ssh_pthread_mutex_unlock,\n    .thread_id = ssh_pthread_thread_id\n};\n\n/* Threads interface implementation */\n\n#if (HAVE_PTHREAD)\nvoid ssh_mutex_lock(SSH_MUTEX *mutex)\n{\n    int rc;\n\n    if (mutex == NULL) {\n        exit(EINVAL);\n    }\n\n    rc = pthread_mutex_lock(mutex);\n\n    if (rc) {\n        exit(rc);\n    }\n}\n\nvoid ssh_mutex_unlock(SSH_MUTEX *mutex)\n{\n    int rc;\n\n    if (mutex == NULL) {\n        exit(EINVAL);\n    }\n\n    rc = pthread_mutex_unlock(mutex);\n\n    if (rc) {\n        exit(rc);\n    }\n}\n\nstruct ssh_threads_callbacks_struct *ssh_threads_get_default(void)\n{\n    return &ssh_threads_pthread;\n}\n#endif\n\nstruct ssh_threads_callbacks_struct *ssh_threads_get_pthread(void)\n{\n    return &ssh_threads_pthread;\n}\n"
  },
  {
    "path": "src/libssh/src/threads/winlocks.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2018 by Anderson Toshiyuki Sasaki\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n#include \"libssh/threads.h\"\n#include <libssh/callbacks.h>\n\n#include <windows.h>\n#include <winbase.h>\n#include <errno.h>\n\nstatic int ssh_winlock_mutex_init (void **priv)\n{\n    CRITICAL_SECTION *lock = malloc(sizeof(CRITICAL_SECTION));\n\n    if (lock == NULL) {\n        return ENOMEM;\n    }\n\n    InitializeCriticalSection(lock);\n\n    *priv = lock;\n\n    return 0;\n}\n\nstatic int ssh_winlock_mutex_destroy (void **lock)\n{\n    DeleteCriticalSection((CRITICAL_SECTION *) *lock);\n    free(*lock);\n\n    return 0;\n}\n\nstatic int ssh_winlock_mutex_lock (void **lock)\n{\n    EnterCriticalSection((CRITICAL_SECTION *) *lock);\n    return 0;\n}\n\nstatic int ssh_winlock_mutex_unlock (void **lock)\n{\n    LeaveCriticalSection((CRITICAL_SECTION *) *lock);\n    return 0;\n}\n\nstatic unsigned long ssh_winlock_thread_id (void)\n{\n    return GetCurrentThreadId();\n}\n\nstatic struct ssh_threads_callbacks_struct ssh_threads_winlock =\n{\n    .type = \"threads_winlock\",\n    .mutex_init = ssh_winlock_mutex_init,\n    .mutex_destroy = ssh_winlock_mutex_destroy,\n    .mutex_lock = ssh_winlock_mutex_lock,\n    .mutex_unlock = ssh_winlock_mutex_unlock,\n    .thread_id = ssh_winlock_thread_id\n};\n\n/* Threads interface implementation */\n\nvoid ssh_mutex_lock(SSH_MUTEX *mutex)\n{\n    void *rc;\n\n    CRITICAL_SECTION *mutex_tmp = NULL;\n\n    if (*mutex == NULL) {\n        mutex_tmp = malloc(sizeof(CRITICAL_SECTION));\n\n        if (mutex_tmp == NULL) {\n            exit(ENOMEM);\n        }\n\n        InitializeCriticalSection(mutex_tmp);\n\n        rc = InterlockedCompareExchangePointer((PVOID*)mutex,\n                                               (PVOID)mutex_tmp,\n                                               NULL);\n        if (rc != NULL) {\n            DeleteCriticalSection(mutex_tmp);\n            free(mutex_tmp);\n            exit(ENOMEM);\n        }\n    }\n\n    EnterCriticalSection(*mutex);\n}\n\nvoid ssh_mutex_unlock(SSH_MUTEX *mutex)\n{\n    LeaveCriticalSection(*mutex);\n}\n\nstruct ssh_threads_callbacks_struct *ssh_threads_get_winlock(void)\n{\n    return &ssh_threads_winlock;\n}\n\nstruct ssh_threads_callbacks_struct *ssh_threads_get_default(void)\n{\n    return &ssh_threads_winlock;\n}\n"
  },
  {
    "path": "src/libssh/src/threads.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2010 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n/**\n * @defgroup libssh_threads The SSH threading functions.\n * @ingroup libssh\n *\n * Threading with libssh\n * @{\n */\n\n#include \"config.h\"\n\n#include \"libssh/priv.h\"\n#include \"libssh/crypto.h\"\n#include \"libssh/threads.h\"\n\nstatic struct ssh_threads_callbacks_struct *user_callbacks = NULL;\n\n/** @internal\n * @brief inits the threading with the backend cryptographic libraries\n */\n\nint ssh_threads_init(void)\n{\n    static int threads_initialized = 0;\n    int rc;\n\n    if (threads_initialized) {\n        return SSH_OK;\n    }\n\n    /* first initialize the user_callbacks with our default handlers if not\n     * already the case\n     */\n    if (user_callbacks == NULL){\n        user_callbacks = ssh_threads_get_default();\n    }\n\n    /* Then initialize the crypto libraries threading callbacks */\n    rc = crypto_thread_init(user_callbacks);\n    if (rc == SSH_OK) {\n        threads_initialized = 1;\n    }\n    return rc;\n}\n\nvoid ssh_threads_finalize(void)\n{\n    crypto_thread_finalize();\n}\n\nint ssh_threads_set_callbacks(struct ssh_threads_callbacks_struct *cb)\n{\n\n    int rc;\n\n    if (user_callbacks != NULL) {\n        crypto_thread_finalize();\n    }\n\n    user_callbacks = cb;\n\n    rc = crypto_thread_init(user_callbacks);\n\n    return rc;\n}\n\nconst char *ssh_threads_get_type(void)\n{\n    if (user_callbacks != NULL) {\n        return user_callbacks->type;\n    }\n    return NULL;\n}\n\n/**\n * @}\n */\n"
  },
  {
    "path": "src/libssh/src/token.c",
    "content": "/*\n * token.c - Token list handling functions\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2003-2008 by Aris Adamantiadis\n * Copyright (c) 2019 by Anderson Toshiyuki Sasaki - Red Hat, Inc.\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <stdio.h>\n#include <string.h>\n#include <stdbool.h>\n\n#include \"libssh/priv.h\"\n#include \"libssh/token.h\"\n\n/**\n * @internal\n *\n * @brief Free the given tokens list structure. The used buffer is overwritten\n * with zeroes before freed.\n *\n * @param[in] tokens    The pointer to a structure to be freed;\n */\nvoid ssh_tokens_free(struct ssh_tokens_st *tokens)\n{\n    int i;\n    if (tokens == NULL) {\n        return;\n    }\n\n    if (tokens->tokens != NULL) {\n        for (i = 0; tokens->tokens[i] != NULL; i++) {\n            explicit_bzero(tokens->tokens[i], strlen(tokens->tokens[i]));\n        }\n    }\n\n    SAFE_FREE(tokens->buffer);\n    SAFE_FREE(tokens->tokens);\n    SAFE_FREE(tokens);\n}\n\n/**\n * @internal\n *\n * @brief Split a given string on the given separator character. The returned\n * structure holds an array of pointers (tokens) pointing to the obtained\n * parts and a buffer where all the content of the list is stored. The last\n * element of the array will always be set as NULL.\n *\n * @param[in] chain         The string to split\n * @param[in] separator     The character used to separate the tokens.\n *\n * @return  A newly allocated tokens list structure; NULL in case of error.\n */\nstruct ssh_tokens_st *ssh_tokenize(const char *chain, char separator)\n{\n\n    struct ssh_tokens_st *tokens = NULL;\n    size_t num_tokens = 1, i = 1;\n\n    char *found, *c;\n\n    if (chain == NULL) {\n        return NULL;\n    }\n\n    tokens = calloc(1, sizeof(struct ssh_tokens_st));\n    if (tokens == NULL) {\n        return NULL;\n    }\n\n    tokens->buffer= strdup(chain);\n    if (tokens->buffer == NULL) {\n        goto error;\n    }\n\n    c = tokens->buffer;\n    do {\n        found = strchr(c, separator);\n        if (found != NULL) {\n            c = found + 1;\n            num_tokens++;\n        }\n    } while(found != NULL);\n\n    /* Allocate tokens list */\n    tokens->tokens = calloc(num_tokens + 1, sizeof(char *));\n    if (tokens->tokens == NULL) {\n        goto error;\n    }\n\n    /* First token starts in the beginning of the chain */\n    tokens->tokens[0] = tokens->buffer;\n    c = tokens->buffer;\n\n    for (i = 1; i < num_tokens; i++) {\n        /* Find next separator */\n        found = strchr(c, separator);\n        if (found == NULL) {\n            break;\n        }\n\n        /* Replace it with a string terminator */\n        *found = '\\0';\n\n        /* The next token starts in the next byte */\n        c = found + 1;\n\n        /* If we did not reach the end of the chain yet, set the next token */\n        if (*c != '\\0') {\n            tokens->tokens[i] = c;\n        } else {\n            break;\n        }\n    }\n\n    return tokens;\n\nerror:\n    ssh_tokens_free(tokens);\n    return NULL;\n}\n\n/**\n * @internal\n *\n * @brief Given two strings, the first containing a list of available tokens and\n * the second containing a list of tokens to be searched ordered by preference,\n * returns a copy of the first preferred token present in the available list.\n *\n * @param[in] available_list    The list of available tokens\n * @param[in] preferred_list    The list of tokens to search, ordered by\n * preference\n *\n * @return  A newly allocated copy of the token if found; NULL otherwise\n */\nchar *ssh_find_matching(const char *available_list,\n                        const char *preferred_list)\n{\n    struct ssh_tokens_st *a_tok = NULL, *p_tok = NULL;\n\n    int i, j;\n    char *ret = NULL;\n\n    if ((available_list == NULL) || (preferred_list == NULL)) {\n        return NULL;\n    }\n\n    a_tok = ssh_tokenize(available_list, ',');\n    if (a_tok == NULL) {\n        return NULL;\n    }\n\n    p_tok = ssh_tokenize(preferred_list, ',');\n    if (p_tok == NULL) {\n        goto out;\n    }\n\n    for (i = 0; p_tok->tokens[i]; i++) {\n        for (j = 0; a_tok->tokens[j]; j++) {\n            if (strcmp(a_tok->tokens[j], p_tok->tokens[i]) == 0) {\n                ret = strdup(a_tok->tokens[j]);\n                goto out;\n            }\n        }\n    }\n\nout:\n    ssh_tokens_free(a_tok);\n    ssh_tokens_free(p_tok);\n    return ret;\n}\n\n/**\n * @internal\n *\n * @brief Given two strings, the first containing a list of available tokens and\n * the second containing a list of tokens to be searched ordered by preference,\n * returns a list of all matching tokens ordered by preference.\n *\n * @param[in] available_list    The list of available tokens\n * @param[in] preferred_list    The list of tokens to search, ordered by\n * preference\n *\n * @return  A newly allocated string containing the list of all matching tokens;\n * NULL otherwise\n */\nchar *ssh_find_all_matching(const char *available_list,\n                            const char *preferred_list)\n{\n    struct ssh_tokens_st *a_tok = NULL, *p_tok = NULL;\n    int i, j;\n    char *ret = NULL;\n    size_t max, len, pos = 0;\n    int match;\n\n    if ((available_list == NULL) || (preferred_list == NULL)) {\n        return NULL;\n    }\n\n    max = MAX(strlen(available_list), strlen(preferred_list));\n\n    ret = calloc(1, max + 1);\n    if (ret == NULL) {\n        return NULL;\n    }\n\n    a_tok = ssh_tokenize(available_list, ',');\n    if (a_tok == NULL) {\n        SAFE_FREE(ret);\n        goto out;\n    }\n\n    p_tok = ssh_tokenize(preferred_list, ',');\n    if (p_tok == NULL) {\n        SAFE_FREE(ret);\n        goto out;\n    }\n\n    for (i = 0; p_tok->tokens[i] ; i++) {\n        for (j = 0; a_tok->tokens[j]; j++) {\n            match = !strcmp(a_tok->tokens[j], p_tok->tokens[i]);\n            if (match) {\n                if (pos != 0) {\n                    ret[pos] = ',';\n                    pos++;\n                }\n\n                len = strlen(a_tok->tokens[j]);\n                memcpy(&ret[pos], a_tok->tokens[j], len);\n                pos += len;\n                ret[pos] = '\\0';\n            }\n        }\n    }\n\n    if (ret[0] == '\\0') {\n        SAFE_FREE(ret);\n    }\n\nout:\n    ssh_tokens_free(a_tok);\n    ssh_tokens_free(p_tok);\n    return ret;\n}\n\n/**\n * @internal\n *\n * @brief Given a string containing a list of elements, remove all duplicates\n * and return in a newly allocated string.\n *\n * @param[in] list  The list to be freed of duplicates\n *\n * @return  A newly allocated copy of the string free of duplicates; NULL in\n * case of error.\n */\nchar *ssh_remove_duplicates(const char *list)\n{\n    struct ssh_tokens_st *tok = NULL;\n\n    size_t i, j, num_tokens, max_len;\n    char *ret = NULL;\n    bool *should_copy = NULL, need_comma = false;\n\n    if (list == NULL) {\n        return NULL;\n    }\n\n    /* The maximum number of tokens is the size of the list */\n    max_len = strlen(list);\n    if (max_len == 0) {\n        return NULL;\n    }\n\n    /* Add space for ending '\\0' */\n    max_len++;\n\n    tok = ssh_tokenize(list, ',');\n    if ((tok == NULL) || (tok->tokens == NULL) || (tok->tokens[0] == NULL)) {\n        goto out;\n    }\n\n    should_copy = calloc(1, max_len);\n    if (should_copy == NULL) {\n        goto out;\n    }\n\n    if (strlen(tok->tokens[0]) > 0) {\n        should_copy[0] = true;\n    }\n\n    for (i = 1; tok->tokens[i]; i++) {\n        for (j = 0; j < i; j++) {\n            if (strcmp(tok->tokens[i], tok->tokens[j]) == 0) {\n                /* Found a duplicate; do not copy */\n                should_copy[i] = false;\n                break;\n            }\n        }\n\n        /* No matching token before */\n        if (j == i) {\n            /* Only copy if it is not an empty string */\n            if (strlen(tok->tokens[i]) > 0) {\n                should_copy[i] = true;\n            } else {\n                should_copy[i] = false;\n            }\n        }\n    }\n\n    num_tokens = i;\n\n    ret = calloc(1, max_len);\n    if (ret == NULL) {\n        goto out;\n    }\n\n    for (i = 0; i < num_tokens; i++) {\n        if (should_copy[i]) {\n            if (need_comma) {\n                strncat(ret, \",\", (max_len - strlen(ret) - 1));\n            }\n            strncat(ret, tok->tokens[i], (max_len - strlen(ret) - 1));\n            need_comma = true;\n        }\n    }\n\n    /* If no comma is needed, nothing was copied */\n    if (!need_comma) {\n        SAFE_FREE(ret);\n    }\n\nout:\n    SAFE_FREE(should_copy);\n    ssh_tokens_free(tok);\n    return ret;\n}\n\n/**\n * @internal\n *\n * @brief Given two strings containing lists of tokens, return a newly\n * allocated string containing all the elements of the first list appended with\n * all the elements of the second list, without duplicates. The order of the\n * elements will be preserved.\n *\n * @param[in] list             The first list\n * @param[in] appended_list    The list to be appended\n *\n * @return  A newly allocated copy list containing all the elements of the\n * kept_list appended with the elements of the appended_list without duplicates;\n * NULL in case of error.\n */\nchar *ssh_append_without_duplicates(const char *list,\n                                    const char *appended_list)\n{\n    size_t concat_len = 0;\n    char *ret = NULL, *concat = NULL;\n\n    if (list != NULL) {\n        concat_len = strlen(list);\n    }\n\n    if (appended_list != NULL) {\n        concat_len += strlen(appended_list);\n    }\n\n    if (concat_len == 0) {\n        return NULL;\n    }\n\n    /* Add room for ending '\\0' and for middle ',' */\n    concat_len += 2;\n    concat = calloc(1, concat_len);\n    if (concat == NULL) {\n        return NULL;\n    }\n\n    if (list != NULL) {\n        strcpy(concat, list);\n        strncat(concat, \",\", concat_len - strlen(concat) - 1);\n    }\n    if (appended_list != NULL) {\n        strncat(concat, appended_list, concat_len - strlen(concat) - 1);\n    }\n\n    ret = ssh_remove_duplicates(concat);\n\n    SAFE_FREE(concat);\n\n    return ret;\n}\n"
  },
  {
    "path": "src/libssh/src/wrapper.c",
    "content": "/*\n * wrapper.c - wrapper for crytpo functions\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2003-2013   by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n/*\n * Why a wrapper?\n *\n * Let's say you want to port libssh from libcrypto of openssl to libfoo\n * you are going to spend hours to remove every references to SHA1_Update()\n * to libfoo_sha1_update after the work is finished, you're going to have\n * only this file to modify it's not needed to say that your modifications\n * are welcome.\n */\n\n#include \"config.h\"\n\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#ifdef WITH_ZLIB\n#include <zlib.h>\n#endif\n\n#include \"libssh/priv.h\"\n#include \"libssh/session.h\"\n#include \"libssh/crypto.h\"\n#include \"libssh/wrapper.h\"\n#include \"libssh/pki.h\"\n#include \"libssh/poly1305.h\"\n#include \"libssh/dh.h\"\n#ifdef WITH_GEX\n#include \"libssh/dh-gex.h\"\n#endif /* WITH_GEX */\n#include \"libssh/ecdh.h\"\n#include \"libssh/curve25519.h\"\n\n#define SHA_96_DIGEST_LEN 12\n#define MD5_96_DIGEST_LEN 12\n\nstatic struct ssh_hmac_struct ssh_hmac_tab[] = {\n  { \"hmac-sha1\",                     SSH_HMAC_SHA1,          false },\n  { \"hmac-sha1-96\",                  SSH_HMAC_SHA1_96,       false },\n  { \"hmac-sha2-256\",                 SSH_HMAC_SHA256,        false },\n  { \"hmac-sha2-512\",                 SSH_HMAC_SHA512,        false },\n  { \"hmac-md5\",                      SSH_HMAC_MD5,           false },\n  { \"hmac-md5-96\",                   SSH_HMAC_MD5_96,        false },\n  { \"aead-poly1305\",                 SSH_HMAC_AEAD_POLY1305, false },\n  { \"aead-gcm\",                      SSH_HMAC_AEAD_GCM,      false },\n  { \"hmac-sha1-etm@openssh.com\",     SSH_HMAC_SHA1,          true  },\n  { \"hmac-sha1-96-etm@openssh.com\",  SSH_HMAC_SHA1_96,       true  },\n  { \"hmac-sha2-256-etm@openssh.com\", SSH_HMAC_SHA256,        true  },\n  { \"hmac-sha2-512-etm@openssh.com\", SSH_HMAC_SHA512,        true  },\n  { \"hmac-md5-etm@openssh.com\",      SSH_HMAC_MD5,           true  },\n  { \"hmac-md5-96-etm@openssh.com\",   SSH_HMAC_MD5_96,        true  },\n  { NULL,                            0,                      false }\n};\n\nstruct ssh_hmac_struct *ssh_get_hmactab(void) {\n  return ssh_hmac_tab;\n}\n\nsize_t hmac_digest_len(enum ssh_hmac_e type) {\n  switch(type) {\n    case SSH_HMAC_SHA1:\n      return SHA_DIGEST_LEN;\n    case SSH_HMAC_SHA1_96:\n      return SHA_96_DIGEST_LEN;\n    case SSH_HMAC_SHA256:\n      return SHA256_DIGEST_LEN;\n    case SSH_HMAC_SHA512:\n      return SHA512_DIGEST_LEN;\n    case SSH_HMAC_MD5:\n      return MD5_DIGEST_LEN;\n    case SSH_HMAC_MD5_96:\n      return MD5_96_DIGEST_LEN;\n    case SSH_HMAC_AEAD_POLY1305:\n      return POLY1305_TAGLEN;\n    case SSH_HMAC_AEAD_GCM:\n      return AES_GCM_TAGLEN;\n    default:\n      return 0;\n  }\n}\n\nsize_t hmac_key_len(enum ssh_hmac_e type) {\n    switch (type) {\n    case SSH_HMAC_SHA1:\n    case SSH_HMAC_SHA1_96:\n      return SHA_DIGEST_LEN;\n    case SSH_HMAC_SHA256:\n      return SHA256_DIGEST_LEN;\n    case SSH_HMAC_SHA512:\n      return SHA512_DIGEST_LEN;\n    case SSH_HMAC_MD5:\n    case SSH_HMAC_MD5_96:\n      return MD5_DIGEST_LEN;\n    case SSH_HMAC_AEAD_POLY1305:\n      return POLY1305_TAGLEN;\n    case SSH_HMAC_AEAD_GCM:\n      return AES_GCM_TAGLEN;\n    default:\n      return 0;\n  }\n}\n\nconst char *ssh_hmac_type_to_string(enum ssh_hmac_e hmac_type, bool etm)\n{\n  int i = 0;\n  struct ssh_hmac_struct *ssh_hmactab = ssh_get_hmactab();\n  while (ssh_hmactab[i].name &&\n         ((ssh_hmactab[i].hmac_type != hmac_type) ||\n          (ssh_hmactab[i].etm != etm))) {\n    i++;\n  }\n  return ssh_hmactab[i].name;\n}\n\n/* it allocates a new cipher structure based on its offset into the global table */\nstatic struct ssh_cipher_struct *cipher_new(int offset) {\n  struct ssh_cipher_struct *cipher = NULL;\n\n  cipher = malloc(sizeof(struct ssh_cipher_struct));\n  if (cipher == NULL) {\n    return NULL;\n  }\n\n  /* note the memcpy will copy the pointers : so, you shouldn't free them */\n  memcpy(cipher, &ssh_get_ciphertab()[offset], sizeof(*cipher));\n\n  return cipher;\n}\n\nvoid ssh_cipher_clear(struct ssh_cipher_struct *cipher){\n#ifdef HAVE_LIBGCRYPT\n    unsigned int i;\n#endif\n\n    if (cipher == NULL) {\n        return;\n    }\n\n#ifdef HAVE_LIBGCRYPT\n    if (cipher->key) {\n        for (i = 0; i < (cipher->keylen / sizeof(gcry_cipher_hd_t)); i++) {\n            gcry_cipher_close(cipher->key[i]);\n        }\n        SAFE_FREE(cipher->key);\n    }\n#endif\n\n    if (cipher->cleanup != NULL) {\n        cipher->cleanup(cipher);\n    }\n}\n\nstatic void cipher_free(struct ssh_cipher_struct *cipher) {\n  ssh_cipher_clear(cipher);\n  SAFE_FREE(cipher);\n}\n\nstruct ssh_crypto_struct *crypto_new(void) {\n   struct ssh_crypto_struct *crypto;\n\n  crypto = malloc(sizeof(struct ssh_crypto_struct));\n  if (crypto == NULL) {\n    return NULL;\n  }\n  ZERO_STRUCTP(crypto);\n  return crypto;\n}\n\nvoid crypto_free(struct ssh_crypto_struct *crypto)\n{\n    size_t i;\n\n    if (crypto == NULL) {\n        return;\n    }\n\n    ssh_key_free(crypto->server_pubkey);\n\n    ssh_dh_cleanup(crypto);\n    bignum_safe_free(crypto->shared_secret);\n#ifdef HAVE_ECDH\n    SAFE_FREE(crypto->ecdh_client_pubkey);\n    SAFE_FREE(crypto->ecdh_server_pubkey);\n    if(crypto->ecdh_privkey != NULL){\n#ifdef HAVE_OPENSSL_ECC\n        EC_KEY_free(crypto->ecdh_privkey);\n#elif defined HAVE_GCRYPT_ECC\n        gcry_sexp_release(crypto->ecdh_privkey);\n#endif\n        crypto->ecdh_privkey = NULL;\n    }\n#endif\n    if (crypto->session_id != NULL) {\n        explicit_bzero(crypto->session_id, crypto->digest_len);\n        SAFE_FREE(crypto->session_id);\n    }\n    if (crypto->secret_hash != NULL) {\n        explicit_bzero(crypto->secret_hash, crypto->digest_len);\n        SAFE_FREE(crypto->secret_hash);\n    }\n#ifdef WITH_ZLIB\n    if (crypto->compress_out_ctx &&\n        (deflateEnd(crypto->compress_out_ctx) != 0)) {\n        inflateEnd(crypto->compress_out_ctx);\n    }\n    SAFE_FREE(crypto->compress_out_ctx);\n\n    if (crypto->compress_in_ctx &&\n        (deflateEnd(crypto->compress_in_ctx) != 0)) {\n        inflateEnd(crypto->compress_in_ctx);\n    }\n    SAFE_FREE(crypto->compress_in_ctx);\n#endif /* WITH_ZLIB */\n    SAFE_FREE(crypto->encryptIV);\n    SAFE_FREE(crypto->decryptIV);\n    SAFE_FREE(crypto->encryptMAC);\n    SAFE_FREE(crypto->decryptMAC);\n    if (crypto->encryptkey != NULL) {\n        explicit_bzero(crypto->encryptkey, crypto->out_cipher->keysize / 8);\n        SAFE_FREE(crypto->encryptkey);\n    }\n    if (crypto->decryptkey != NULL) {\n        explicit_bzero(crypto->decryptkey, crypto->in_cipher->keysize / 8);\n        SAFE_FREE(crypto->decryptkey);\n    }\n\n    cipher_free(crypto->in_cipher);\n    cipher_free(crypto->out_cipher);\n\n    for (i = 0; i < SSH_KEX_METHODS; i++) {\n        SAFE_FREE(crypto->client_kex.methods[i]);\n        SAFE_FREE(crypto->server_kex.methods[i]);\n        SAFE_FREE(crypto->kex_methods[i]);\n    }\n\n    explicit_bzero(crypto, sizeof(struct ssh_crypto_struct));\n\n    SAFE_FREE(crypto);\n}\n\nstatic int crypt_set_algorithms2(ssh_session session)\n{\n    const char *wanted = NULL;\n    struct ssh_cipher_struct *ssh_ciphertab=ssh_get_ciphertab();\n    struct ssh_hmac_struct *ssh_hmactab=ssh_get_hmactab();\n    size_t i = 0;\n    int cmp;\n\n    /*\n     * We must scan the kex entries to find crypto algorithms and set their\n     * appropriate structure.\n     */\n\n    /* out */\n    wanted = session->next_crypto->kex_methods[SSH_CRYPT_C_S];\n    for (i = 0; i < 64 && ssh_ciphertab[i].name != NULL; ++i) {\n        cmp = strcmp(wanted, ssh_ciphertab[i].name);\n        if (cmp == 0) {\n            break;\n        }\n    }\n\n    if (ssh_ciphertab[i].name == NULL) {\n        ssh_set_error(session, SSH_FATAL,\n                \"crypt_set_algorithms2: no crypto algorithm function found for %s\",\n                wanted);\n        return SSH_ERROR;\n    }\n    SSH_LOG(SSH_LOG_PACKET, \"Set output algorithm to %s\", wanted);\n\n    session->next_crypto->out_cipher = cipher_new(i);\n    if (session->next_crypto->out_cipher == NULL) {\n        ssh_set_error_oom(session);\n        return SSH_ERROR;\n    }\n\n    if (session->next_crypto->out_cipher->aead_encrypt != NULL) {\n        /* this cipher has integrated MAC */\n        if (session->next_crypto->out_cipher->ciphertype == SSH_AEAD_CHACHA20_POLY1305) {\n            wanted = \"aead-poly1305\";\n        } else {\n            wanted = \"aead-gcm\";\n        }\n    } else {\n        /*\n         * We must scan the kex entries to find hmac algorithms and set their\n         * appropriate structure.\n         */\n\n        /* out */\n        wanted = session->next_crypto->kex_methods[SSH_MAC_C_S];\n    }\n\n    for (i = 0; ssh_hmactab[i].name != NULL; i++) {\n        cmp = strcmp(wanted, ssh_hmactab[i].name);\n        if (cmp == 0) {\n            break;\n        }\n    }\n\n    if (ssh_hmactab[i].name == NULL) {\n        ssh_set_error(session, SSH_FATAL,\n                \"crypt_set_algorithms2: no hmac algorithm function found for %s\",\n                wanted);\n        return SSH_ERROR;\n    }\n    SSH_LOG(SSH_LOG_PACKET, \"Set HMAC output algorithm to %s\", wanted);\n\n    session->next_crypto->out_hmac = ssh_hmactab[i].hmac_type;\n    session->next_crypto->out_hmac_etm = ssh_hmactab[i].etm;\n\n    /* in */\n    wanted = session->next_crypto->kex_methods[SSH_CRYPT_S_C];\n\n    for (i = 0; ssh_ciphertab[i].name != NULL; i++) {\n        cmp = strcmp(wanted, ssh_ciphertab[i].name);\n        if (cmp == 0) {\n            break;\n        }\n    }\n\n    if (ssh_ciphertab[i].name == NULL) {\n        ssh_set_error(session, SSH_FATAL,\n                \"Crypt_set_algorithms: no crypto algorithm function found for %s\",\n                wanted);\n        return SSH_ERROR;\n    }\n    SSH_LOG(SSH_LOG_PACKET, \"Set input algorithm to %s\", wanted);\n\n    session->next_crypto->in_cipher = cipher_new(i);\n    if (session->next_crypto->in_cipher == NULL) {\n        ssh_set_error_oom(session);\n        return SSH_ERROR;\n    }\n\n    if (session->next_crypto->in_cipher->aead_encrypt != NULL){\n        /* this cipher has integrated MAC */\n        if (session->next_crypto->in_cipher->ciphertype == SSH_AEAD_CHACHA20_POLY1305) {\n            wanted = \"aead-poly1305\";\n        } else {\n            wanted = \"aead-gcm\";\n        }\n    } else {\n        /* we must scan the kex entries to find hmac algorithms and set their appropriate structure */\n        wanted = session->next_crypto->kex_methods[SSH_MAC_S_C];\n    }\n\n    for (i = 0; ssh_hmactab[i].name != NULL; i++) {\n        cmp = strcmp(wanted, ssh_hmactab[i].name);\n        if (cmp == 0) {\n            break;\n        }\n    }\n\n    if (ssh_hmactab[i].name == NULL) {\n        ssh_set_error(session, SSH_FATAL,\n                \"crypt_set_algorithms2: no hmac algorithm function found for %s\",\n                wanted);\n        return SSH_ERROR;\n    }\n    SSH_LOG(SSH_LOG_PACKET, \"Set HMAC input algorithm to %s\", wanted);\n\n    session->next_crypto->in_hmac = ssh_hmactab[i].hmac_type;\n    session->next_crypto->in_hmac_etm = ssh_hmactab[i].etm;\n\n    /* compression */\n    cmp = strcmp(session->next_crypto->kex_methods[SSH_COMP_C_S], \"zlib\");\n    if (cmp == 0) {\n        session->next_crypto->do_compress_out = 1;\n    }\n    cmp = strcmp(session->next_crypto->kex_methods[SSH_COMP_S_C], \"zlib\");\n    if (cmp == 0) {\n        session->next_crypto->do_compress_in = 1;\n    }\n    cmp = strcmp(session->next_crypto->kex_methods[SSH_COMP_C_S], \"zlib@openssh.com\");\n    if (cmp == 0) {\n        session->next_crypto->delayed_compress_out = 1;\n    }\n    cmp = strcmp(session->next_crypto->kex_methods[SSH_COMP_S_C], \"zlib@openssh.com\");\n    if (cmp == 0) {\n        session->next_crypto->delayed_compress_in = 1;\n    }\n\n    return SSH_OK;\n}\n\nint crypt_set_algorithms_client(ssh_session session)\n{\n    return crypt_set_algorithms2(session);\n}\n\n#ifdef WITH_SERVER\nint crypt_set_algorithms_server(ssh_session session){\n    const char *method = NULL;\n    size_t i = 0;\n    struct ssh_cipher_struct *ssh_ciphertab=ssh_get_ciphertab();\n    struct ssh_hmac_struct   *ssh_hmactab=ssh_get_hmactab();\n    int cmp;\n\n\n    if (session == NULL) {\n        return SSH_ERROR;\n    }\n\n    /*\n     * We must scan the kex entries to find crypto algorithms and set their\n     * appropriate structure\n     */\n    /* out */\n    method = session->next_crypto->kex_methods[SSH_CRYPT_S_C];\n\n    for (i = 0; ssh_ciphertab[i].name != NULL; i++) {\n        cmp = strcmp(method, ssh_ciphertab[i].name);\n        if (cmp == 0) {\n          break;\n        }\n    }\n\n    if (ssh_ciphertab[i].name == NULL) {\n        ssh_set_error(session,SSH_FATAL,\"crypt_set_algorithms_server : \"\n                \"no crypto algorithm function found for %s\",method);\n        return SSH_ERROR;\n    }\n    SSH_LOG(SSH_LOG_PACKET,\"Set output algorithm %s\",method);\n\n    session->next_crypto->out_cipher = cipher_new(i);\n    if (session->next_crypto->out_cipher == NULL) {\n        ssh_set_error_oom(session);\n        return SSH_ERROR;\n    }\n\n    if (session->next_crypto->out_cipher->aead_encrypt != NULL){\n        /* this cipher has integrated MAC */\n        if (session->next_crypto->out_cipher->ciphertype == SSH_AEAD_CHACHA20_POLY1305) {\n            method = \"aead-poly1305\";\n        } else {\n            method = \"aead-gcm\";\n        }\n    } else {\n        /* we must scan the kex entries to find hmac algorithms and set their appropriate structure */\n        /* out */\n        method = session->next_crypto->kex_methods[SSH_MAC_S_C];\n    }\n    /* HMAC algorithm selection */\n\n    for (i = 0; ssh_hmactab[i].name != NULL; i++) {\n        cmp = strcmp(method, ssh_hmactab[i].name);\n        if (cmp == 0) {\n            break;\n        }\n    }\n\n    if (ssh_hmactab[i].name == NULL) {\n      ssh_set_error(session, SSH_FATAL,\n          \"crypt_set_algorithms_server: no hmac algorithm function found for %s\",\n          method);\n        return SSH_ERROR;\n    }\n    SSH_LOG(SSH_LOG_PACKET, \"Set HMAC output algorithm to %s\", method);\n\n    session->next_crypto->out_hmac = ssh_hmactab[i].hmac_type;\n    session->next_crypto->out_hmac_etm = ssh_hmactab[i].etm;\n\n    /* in */\n    method = session->next_crypto->kex_methods[SSH_CRYPT_C_S];\n\n    for (i = 0; ssh_ciphertab[i].name; i++) {\n        cmp = strcmp(method, ssh_ciphertab[i].name);\n        if (cmp == 0) {\n            break;\n        }\n    }\n\n    if (ssh_ciphertab[i].name == NULL) {\n        ssh_set_error(session,SSH_FATAL,\"Crypt_set_algorithms_server :\"\n                \"no crypto algorithm function found for %s\",method);\n        return SSH_ERROR;\n    }\n    SSH_LOG(SSH_LOG_PACKET,\"Set input algorithm %s\",method);\n\n    session->next_crypto->in_cipher = cipher_new(i);\n    if (session->next_crypto->in_cipher == NULL) {\n        ssh_set_error_oom(session);\n        return SSH_ERROR;\n    }\n\n    if (session->next_crypto->in_cipher->aead_encrypt != NULL){\n        /* this cipher has integrated MAC */\n        if (session->next_crypto->in_cipher->ciphertype == SSH_AEAD_CHACHA20_POLY1305) {\n            method = \"aead-poly1305\";\n        } else {\n            method = \"aead-gcm\";\n        }\n    } else {\n        /* we must scan the kex entries to find hmac algorithms and set their appropriate structure */\n        method = session->next_crypto->kex_methods[SSH_MAC_C_S];\n    }\n\n    for (i = 0; ssh_hmactab[i].name != NULL; i++) {\n        cmp = strcmp(method, ssh_hmactab[i].name);\n        if (cmp == 0) {\n            break;\n        }\n    }\n\n    if (ssh_hmactab[i].name == NULL) {\n      ssh_set_error(session, SSH_FATAL,\n          \"crypt_set_algorithms_server: no hmac algorithm function found for %s\",\n          method);\n        return SSH_ERROR;\n    }\n    SSH_LOG(SSH_LOG_PACKET, \"Set HMAC input algorithm to %s\", method);\n\n    session->next_crypto->in_hmac = ssh_hmactab[i].hmac_type;\n    session->next_crypto->in_hmac_etm = ssh_hmactab[i].etm;\n\n    /* compression */\n    method = session->next_crypto->kex_methods[SSH_COMP_C_S];\n    if(strcmp(method,\"zlib\") == 0){\n        SSH_LOG(SSH_LOG_PACKET,\"enabling C->S compression\");\n        session->next_crypto->do_compress_in=1;\n    }\n    if(strcmp(method,\"zlib@openssh.com\") == 0){\n        SSH_LOG(SSH_LOG_PACKET,\"enabling C->S delayed compression\");\n\n        if (session->flags & SSH_SESSION_FLAG_AUTHENTICATED) {\n            session->next_crypto->do_compress_in = 1;\n        } else {\n            session->next_crypto->delayed_compress_in = 1;\n        }\n    }\n\n    method = session->next_crypto->kex_methods[SSH_COMP_S_C];\n    if(strcmp(method,\"zlib\") == 0){\n        SSH_LOG(SSH_LOG_PACKET, \"enabling S->C compression\");\n        session->next_crypto->do_compress_out=1;\n    }\n    if(strcmp(method,\"zlib@openssh.com\") == 0){\n        SSH_LOG(SSH_LOG_PACKET,\"enabling S->C delayed compression\");\n\n        if (session->flags & SSH_SESSION_FLAG_AUTHENTICATED) {\n            session->next_crypto->do_compress_out = 1;\n        } else {\n            session->next_crypto->delayed_compress_out = 1;\n        }\n    }\n\n    method = session->next_crypto->kex_methods[SSH_HOSTKEYS];\n    session->srv.hostkey = ssh_key_type_from_signature_name(method);\n    session->srv.hostkey_digest = ssh_key_hash_from_name(method);\n\n    /* setup DH key exchange type */\n    switch (session->next_crypto->kex_type) {\n    case SSH_KEX_DH_GROUP1_SHA1:\n    case SSH_KEX_DH_GROUP14_SHA1:\n    case SSH_KEX_DH_GROUP14_SHA256:\n    case SSH_KEX_DH_GROUP16_SHA512:\n    case SSH_KEX_DH_GROUP18_SHA512:\n      ssh_server_dh_init(session);\n      break;\n#ifdef WITH_GEX\n    case SSH_KEX_DH_GEX_SHA1:\n    case SSH_KEX_DH_GEX_SHA256:\n      ssh_server_dhgex_init(session);\n      break;\n#endif /* WITH_GEX */\n#ifdef HAVE_ECDH\n    case SSH_KEX_ECDH_SHA2_NISTP256:\n    case SSH_KEX_ECDH_SHA2_NISTP384:\n    case SSH_KEX_ECDH_SHA2_NISTP521:\n      ssh_server_ecdh_init(session);\n      break;\n#endif\n#ifdef HAVE_CURVE25519\n    case SSH_KEX_CURVE25519_SHA256:\n    case SSH_KEX_CURVE25519_SHA256_LIBSSH_ORG:\n        ssh_server_curve25519_init(session);\n        break;\n#endif\n    default:\n        ssh_set_error(session,\n                      SSH_FATAL,\n                      \"crypt_set_algorithms_server: could not find init \"\n                      \"handler for kex type %d\",\n                      session->next_crypto->kex_type);\n        return SSH_ERROR;\n    }\n    return SSH_OK;\n}\n\n#endif /* WITH_SERVER */\n"
  },
  {
    "path": "src/libssh/tests/CMakeLists.txt",
    "content": "project(libssh-tests C)\n\nif (BSD OR SOLARIS OR OSX)\n    find_package(Argp)\nendif (BSD OR SOLARIS OR OSX)\n\nset(TORTURE_LIBRARY torture)\n\ninclude_directories(${OPENSSL_INCLUDE_DIR}\n                    ${CMOCKA_INCLUDE_DIR}\n                    ${ZLIB_INCLUDE_DIR}\n                    ${libssh_BINARY_DIR}/include\n                    ${libssh_BINARY_DIR}\n                    ${libssh_SOURCE_DIR}/src\n                    ${CMAKE_CURRENT_SOURCE_DIR}\n                    ${CMAKE_BINARY_DIR}/tests)\n\nset(TORTURE_LINK_LIBRARIES\n    ${CMOCKA_LIBRARY}\n    ssh::static)\n\n# create test library\nadd_library(${TORTURE_LIBRARY}\n            STATIC\n                cmdline.c\n                torture.c\n                torture_key.c\n                torture_pki.c\n                torture_cmocka.c)\ntarget_link_libraries(${TORTURE_LIBRARY} ${TORTURE_LINK_LIBRARIES})\ntarget_compile_options(${TORTURE_LIBRARY} PRIVATE\n                       -DSSH_PING_EXECUTABLE=\"${CMAKE_CURRENT_BINARY_DIR}/ssh_ping\"\n)\n\nif (ARGP_LIBRARY)\n    target_link_libraries(${TORTURE_LIBRARY}\n        ${ARGP_LIBRARY}\n    )\nendif()\n\nset(TEST_TARGET_LIBRARIES\n    ${TORTURE_LIBRARY}\n    ${TORTURE_LINK_LIBRARIES}\n)\n\nadd_subdirectory(unittests)\n\n# OpenSSH Capabilities are required for all unit tests\nfind_program(SSH_EXECUTABLE NAMES ssh)\nif (SSH_EXECUTABLE)\n    execute_process(COMMAND ${SSH_EXECUTABLE} -V ERROR_VARIABLE OPENSSH_VERSION_STR)\n    string(REGEX REPLACE \"^.*OpenSSH_([0-9]).[0-9].*$\" \"\\\\1\" OPENSSH_VERSION_MAJOR \"${OPENSSH_VERSION_STR}\")\n    string(REGEX REPLACE \"^.*OpenSSH_[0-9].([0-9]).*$\" \"\\\\1\" OPENSSH_VERSION_MINOR \"${OPENSSH_VERSION_STR}\")\n    set(OPENSSH_VERSION \"${OPENSSH_VERSION_MAJOR}.${OPENSSH_VERSION_MINOR}\")\n    if(\"${OPENSSH_VERSION}\" VERSION_LESS \"6.3\")\n        # ssh - Q was introduced in 6.3\n        message(\"Version less than 6.3, hardcoding cipher list\")\n        set(OPENSSH_CIPHERS \"aes128-ctr\\naes192-ctr\\naes256-ctr\\narcfour256\\narcfour128\\naes128-gcm@openssh.com\\naes256-gcm@openssh.com\\naes128-cbc\\n3des-cbc\\nblowfish-cbc\\ncast128-cbc\\naes192-cbc\\naes256-cbc\\narcfour\\nrijndael-cbc@lysator.liu.se\\n\")\n        set(OPENSSH_MACS \"hmac-md5-etm@openssh.com\\nhmac-sha1-etm@openssh.com\\numac-64-etm@openssh.com\\numac-128-etm@openssh.com\\nhmac-sha2-256-etm@openssh.com\\nhmac-sha2-512-etm@openssh.com\\nhmac-ripemd160-etm@openssh.com\\nhmac-sha1-96-etm@openssh.com\\nhmac-md5-96-etm@openssh.com\\nhmac-md5\\nhmac-sha1\\numac-64@openssh.com\\numac-128@openssh.com\\nhmac-sha2-256\\nhmac-sha2-512\\nhmac-ripemd160\\nhmac-ripemd160@openssh.com\\nhmac-sha1-96\\nhmac-md5-96\\n\")\n        set(OPENSSH_KEX \"ecdh-sha2-nistp256\\necdh-sha2-nistp384\\necdh-sha2-nistp521\\ndiffie-hellman-group-exchange-sha256\\ndiffie-hellman-group-exchange-sha1\\ndiffie-hellman-group14-sha1\\ndiffie-hellman-group1-sha1\\n\")\n        set(OPENSSH_KEYS \"ssh-rsa\\nssh-dss\\necdsa-sha2-nistp256\\n\")\n    else()\n        execute_process(COMMAND ${SSH_EXECUTABLE} -Q cipher OUTPUT_VARIABLE OPENSSH_CIPHERS)\n        execute_process(COMMAND ${SSH_EXECUTABLE} -Q mac OUTPUT_VARIABLE OPENSSH_MACS)\n        execute_process(COMMAND ${SSH_EXECUTABLE} -Q kex OUTPUT_VARIABLE OPENSSH_KEX)\n        execute_process(COMMAND ${SSH_EXECUTABLE} -Q key OUTPUT_VARIABLE OPENSSH_KEYS)\n        execute_process(COMMAND ${SSH_EXECUTABLE} -Q sig OUTPUT_VARIABLE OPENSSH_SIGS ERROR_QUIET)\n\n        # We need both of them, but lets get rid of duplicate items presented in both lists\n        # to avoid processing too long arguments in pkd\n        set(OPENSSH_KEYS \"${OPENSSH_KEYS}${OPENSSH_SIGS}\")\n        string(REPLACE \"\\n\" \";\" OPENSSH_KEYS \"${OPENSSH_KEYS}\")\n        list(REMOVE_DUPLICATES OPENSSH_KEYS)\n        string(REPLACE \";\" \"\\n\" OPENSSH_KEYS \"${OPENSSH_KEYS}\")\n    endif()\n\n    set(SSH_ALGORITHMS\n        3des-cbc aes128-cbc aes192-cbc aes256-cbc rijndael-cbc@lysator.liu.se aes128-ctr aes192-ctr\n        aes256-ctr aes128-gcm@openssh.com aes256-gcm@openssh.com chacha20-poly1305@openssh.com\n        hmac-sha1 hmac-sha1-96 hmac-sha2-256 hmac-sha2-512 hmac-md5 hmac-md5-96 umac-64@openssh.com\n        umac-128@openssh.com hmac-sha1-etm@openssh.com hmac-sha1-96-etm@openssh.com\n        hmac-sha2-256-etm@openssh.com hmac-sha2-512-etm@openssh.com hmac-md5-etm@openssh.com\n        hmac-md5-96-etm@openssh.com umac-64-etm@openssh.com umac-128-etm@openssh.com\n        diffie-hellman-group1-sha1 diffie-hellman-group14-sha1 diffie-hellman-group14-sha256\n        diffie-hellman-group16-sha512 diffie-hellman-group18-sha512 diffie-hellman-group-exchange-sha1\n        diffie-hellman-group-exchange-sha256 ecdh-sha2-nistp256 ecdh-sha2-nistp384 ecdh-sha2-nistp521\n        curve25519-sha256 curve25519-sha256@libssh.org\n        ssh-ed25519 ssh-ed25519-cert-v01@openssh.com ssh-rsa ssh-dss\n        ecdsa-sha2-nistp256 ecdsa-sha2-nistp384 ecdsa-sha2-nistp521\n        ssh-rsa-cert-v01@openssh.com ssh-dss-cert-v01@openssh.com\n        ecdsa-sha2-nistp256-cert-v01@openssh.com ecdsa-sha2-nistp384-cert-v01@openssh.com\n        ecdsa-sha2-nistp521-cert-v01@openssh.com\n        )\n    foreach(ALGORITHM ${SSH_ALGORITHMS})\n        string(TOUPPER ${ALGORITHM} VARNAME)\n        string(REGEX REPLACE \"[-@.]\" \"_\" VARNAME \"OPENSSH_${VARNAME}\")\n\n        # Match the current algorithm into the complete list of OpenSSH supported algorithms.\n        # If matching, create an OPENSSH_CIPHER_NAME variable.\n        string(REGEX MATCH \".*${ALGORITHM}\\n\" \"${VARNAME}\" \"${OPENSSH_CIPHERS}${OPENSSH_MACS}${OPENSSH_KEX}${OPENSSH_KEYS}\")\n    endforeach(ALGORITHM)\n\n    string(STRIP \"${OPENSSH_CIPHERS}\" OPENSSH_CIPHERS)\n    string(STRIP \"${OPENSSH_MACS}\" OPENSSH_MACS)\n    string(STRIP \"${OPENSSH_KEX}\" OPENSSH_KEX)\n    string(STRIP \"${OPENSSH_KEYS}\" OPENSSH_KEYS)\n    string(REPLACE \"\\n\" \",\" OPENSSH_CIPHERS \"${OPENSSH_CIPHERS}\")\n    string(REPLACE \"\\n\" \",\" OPENSSH_MACS \"${OPENSSH_MACS}\")\n    string(REPLACE \"\\n\" \",\" OPENSSH_KEX \"${OPENSSH_KEX}\")\n    string(REPLACE \"\\n\" \",\" OPENSSH_KEYS \"${OPENSSH_KEYS}\")\n\nendif()\n\nfind_program(SSHD_EXECUTABLE\n             NAME\n                sshd\n             PATHS\n                /sbin\n                /usr/sbin\n                /usr/local/sbin)\n\nif (CLIENT_TESTING OR SERVER_TESTING)\n    find_package(socket_wrapper 1.1.5 REQUIRED)\n    find_package(nss_wrapper 1.1.2 REQUIRED)\n    find_package(uid_wrapper 1.2.0 REQUIRED)\n    find_package(pam_wrapper 1.0.1 REQUIRED)\n\n    if (NOT SSHD_EXECUTABLE)\n        message(SEND_ERROR \"Could not find sshd which is required for client testing\")\n    endif()\n    find_program(NC_EXECUTABLE\n                 NAME\n                    nc\n                 PATHS\n                    /bin\n                    /usr/bin\n                    /usr/local/bin)\n\n    find_program(SSH_EXECUTABLE NAMES ssh)\n    if (SSH_EXECUTABLE)\n        execute_process(COMMAND ${SSH_EXECUTABLE} -V ERROR_VARIABLE OPENSSH_VERSION_STR)\n        string(REGEX REPLACE \"^.*OpenSSH_([0-9]).[0-9].*$\" \"\\\\1\" OPENSSH_VERSION_MAJOR \"${OPENSSH_VERSION_STR}\")\n        string(REGEX REPLACE \"^.*OpenSSH_[0-9].([0-9]).*$\" \"\\\\1\" OPENSSH_VERSION_MINOR \"${OPENSSH_VERSION_STR}\")\n        add_definitions(-DOPENSSH_VERSION_MAJOR=${OPENSSH_VERSION_MAJOR} -DOPENSSH_VERSION_MINOR=${OPENSSH_VERSION_MINOR})\n    endif()\n\n    set(LOCAL_USER \"nobody\")\n    set(LOCAL_UID \"65533\")\n    find_program(ID_EXECUTABLE NAMES id)\n    find_program(WHO_EXECUTABLE NAMES whoami)\n    if (ID_EXECUTABLE AND WHO_EXECUTABLE)\n        execute_process(COMMAND ${WHO_EXECUTABLE} OUTPUT_VARIABLE LOCAL_USER OUTPUT_STRIP_TRAILING_WHITESPACE)\n        execute_process(COMMAND ${ID_EXECUTABLE} -u OUTPUT_VARIABLE LOCAL_UID OUTPUT_STRIP_TRAILING_WHITESPACE)\n    endif()\n\n    # chroot_wrapper\n    add_library(chroot_wrapper SHARED chroot_wrapper.c)\n    set(CHROOT_WRAPPER_LIBRARY ${libssh_BINARY_DIR}/lib/${CMAKE_SHARED_LIBRARY_PREFIX}chroot_wrapper${CMAKE_SHARED_LIBRARY_SUFFIX})\n    set(TEST_TARGET_LIBRARIES\n        ${TEST_TARGET_LIBRARIES}\n        chroot_wrapper\n    )\n\n    # ssh_ping\n    add_executable(ssh_ping ssh_ping.c)\n    target_compile_options(ssh_ping PRIVATE ${DEFAULT_C_COMPILE_FLAGS})\n    target_link_libraries(ssh_ping ssh::ssh)\n\n    # homedir will be used in passwd\n    set(HOMEDIR ${CMAKE_CURRENT_BINARY_DIR}/home)\n\n    ### Setup nss_wrapper\n    configure_file(etc/passwd.in ${CMAKE_CURRENT_BINARY_DIR}/etc/passwd @ONLY)\n    configure_file(etc/shadow.in ${CMAKE_CURRENT_BINARY_DIR}/etc/shadow @ONLY)\n    configure_file(etc/group.in ${CMAKE_CURRENT_BINARY_DIR}/etc/group @ONLY)\n    configure_file(etc/hosts.in ${CMAKE_CURRENT_BINARY_DIR}/etc/hosts @ONLY)\n\n    ### Setup pam_wrapper\n    configure_file(etc/pam_matrix_passdb.in ${CMAKE_CURRENT_BINARY_DIR}/etc/pam_matrix_passdb @ONLY)\n    configure_file(etc/pam.d/sshd.in ${CMAKE_CURRENT_BINARY_DIR}/etc/pam.d/sshd @ONLY)\n\n\n    set(TORTURE_ENVIRONMENT \"LD_PRELOAD=${SOCKET_WRAPPER_LIBRARY}:${NSS_WRAPPER_LIBRARY}:${UID_WRAPPER_LIBRARY}:${PAM_WRAPPER_LIBRARY}:${CHROOT_WRAPPER_LIBRARY}\")\n    list(APPEND TORTURE_ENVIRONMENT UID_WRAPPER=1 UID_WRAPPER_ROOT=1)\n    list(APPEND TORTURE_ENVIRONMENT NSS_WRAPPER_PASSWD=${CMAKE_CURRENT_BINARY_DIR}/etc/passwd)\n    list(APPEND TORTURE_ENVIRONMENT NSS_WRAPPER_SHADOW=${CMAKE_CURRENT_BINARY_DIR}/etc/shadow)\n    list(APPEND TORTURE_ENVIRONMENT NSS_WRAPPER_GROUP=${CMAKE_CURRENT_BINARY_DIR}/etc/group)\n    list(APPEND TORTURE_ENVIRONMENT PAM_WRAPPER_SERVICE_DIR=${CMAKE_CURRENT_BINARY_DIR}/etc/pam.d)\n\n    # Give bob some keys\n    file(COPY keys/id_rsa DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/home/bob/.ssh/ FILE_PERMISSIONS OWNER_READ OWNER_WRITE)\n    file(COPY keys/id_rsa.pub DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/home/bob/.ssh/ FILE_PERMISSIONS OWNER_READ OWNER_WRITE)\n    file(COPY keys/id_ecdsa DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/home/bob/.ssh/ FILE_PERMISSIONS OWNER_READ OWNER_WRITE)\n    file(COPY keys/id_ecdsa.pub DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/home/bob/.ssh/ FILE_PERMISSIONS OWNER_READ OWNER_WRITE)\n    file(COPY keys/id_ed25519 DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/home/bob/.ssh/ FILE_PERMISSIONS OWNER_READ OWNER_WRITE)\n    file(COPY keys/id_ed25519.pub DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/home/bob/.ssh/ FILE_PERMISSIONS OWNER_READ OWNER_WRITE)\n\n    # Allow to auth with bob's public keys on alice account\n    configure_file(keys/id_rsa.pub ${CMAKE_CURRENT_BINARY_DIR}/home/alice/.ssh/authorized_keys @ONLY)\n    # append ECDSA public key\n    file(READ keys/id_ecdsa.pub CONTENTS)\n    file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/home/alice/.ssh/authorized_keys \"${CONTENTS}\")\n\n    # append ed25519 public key\n    file(READ keys/id_ed25519.pub CONTENTS)\n    file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/home/alice/.ssh/authorized_keys \"${CONTENTS}\")\n\n    # Copy the signed key to an alternative directory in bob's homedir.\n    file(COPY keys/certauth/id_rsa DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/home/bob/.ssh_cert/ FILE_PERMISSIONS OWNER_READ OWNER_WRITE)\n    file(COPY keys/certauth/id_rsa.pub DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/home/bob/.ssh_cert/ FILE_PERMISSIONS OWNER_READ OWNER_WRITE)\n    file(COPY keys/certauth/id_rsa-cert.pub DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/home/bob/.ssh_cert/ FILE_PERMISSIONS OWNER_READ OWNER_WRITE)\n\n    message(STATUS \"TORTURE_ENVIRONMENT=${TORTURE_ENVIRONMENT}\")\nendif ()\n\nconfigure_file(tests_config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/tests_config.h)\n\nif (WITH_BENCHMARKS)\n    add_subdirectory(benchmarks)\nendif ()\n\nif (CLIENT_TESTING)\n    add_subdirectory(client)\nendif ()\n\nif (WITH_SERVER AND SERVER_TESTING)\n    add_subdirectory(pkd)\n    add_subdirectory(server)\nendif ()\n\nif (FUZZ_TESTING)\n    add_subdirectory(fuzz)\nendif()\n"
  },
  {
    "path": "src/libssh/tests/authentication.c",
    "content": "/*\nThis file is distributed in public domain. You can do whatever you want\nwith its content.\n*/\n\n\n#include <stdio.h>\n#include <unistd.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include <libssh/libssh.h>\n\n#include \"tests.h\"\nstatic int auth_kbdint(SSH_SESSION *session){\n    int err=ssh_userauth_kbdint(session,NULL,NULL);\n    char *name,*instruction,*prompt,*ptr;\n    char buffer[128];\n    int i,n;\n    char echo;\n    while (err==SSH_AUTH_INFO){\n        name=ssh_userauth_kbdint_getname(session);\n        instruction=ssh_userauth_kbdint_getinstruction(session);\n        n=ssh_userauth_kbdint_getnprompts(session);\n        if(strlen(name)>0)\n            printf(\"%s\\n\",name);\n        if(strlen(instruction)>0)\n            printf(\"%s\\n\",instruction);\n        for(i=0;i<n;++i){\n            prompt=ssh_userauth_kbdint_getprompt(session,i,&echo);\n            if(echo){\n                printf(\"%s\",prompt);\n                fgets(buffer,sizeof(buffer),stdin);\n                buffer[sizeof(buffer)-1]=0;\n                if((ptr=strchr(buffer,'\\n')))\n                    *ptr=0;\n                ssh_userauth_kbdint_setanswer(session,i,buffer);\n                memset(buffer,0,strlen(buffer));\n            } else {\n                ptr=getpass(prompt);\n                ssh_userauth_kbdint_setanswer(session,i,ptr);\n            }\n        }\n        err=ssh_userauth_kbdint(session,NULL,NULL);\n    }\n    return err;\n}\n\nint authenticate (SSH_SESSION *session){\n    int auth=ssh_userauth_autopubkey(session, NULL);\n    char *password;\n    if(auth==SSH_AUTH_ERROR){\n        fprintf(stderr,\"Authenticating with pubkey: %s\\n\",ssh_get_error(session));\n\t    return auth;\n    }\n    if(auth!=SSH_AUTH_SUCCESS){\n        auth=auth_kbdint(session);\n        if(auth==SSH_AUTH_ERROR){\n            fprintf(stderr,\"authenticating with keyb-interactive: %s\\n\",\n                    ssh_get_error(session));\n            return auth;\n        }\n    }\n    if(auth!=SSH_AUTH_SUCCESS){\n        password=getpass(\"Password : \");\n        auth = ssh_userauth_password(session,NULL,password);\n        memset(password,0,strlen(password));\n        if (auth==SSH_AUTH_ERROR){\n            fprintf(stderr,\"Authentication with password failed: %s\\n\",ssh_get_error(session));\n            return auth;\n        }\n    }\n    return auth;\n}\n"
  },
  {
    "path": "src/libssh/tests/benchmarks/CMakeLists.txt",
    "content": "project(libssh-benchmarks C)\n\nset(benchmarks_SRCS\n  bench_scp.c bench_sftp bench_raw.c benchmarks.c latency.c\n)\n\ninclude_directories(${libssh_BINARY_DIR})\n\nadd_executable(benchmarks ${benchmarks_SRCS})\n\ntarget_link_libraries(benchmarks ssh::ssh)\n"
  },
  {
    "path": "src/libssh/tests/benchmarks/bench1.sh",
    "content": "export CIPHER=aes128-cbc\nexport DEST=localhost\n\necho \"Upload raw SSH statistics\"\necho \"local machine: `uname -a`\"\necho \"Cipher : $CIPHER ; Destination : $DEST (`ssh $DEST uname -a`)\"\necho \"Local ssh version: `ssh -V 2>&1`\"\necho \"Ping latency to $DEST\":\nping -q -c 1 -n $DEST\necho \"Destination $DEST SSHD vesion : `echo | nc $DEST 22 | head -n1`\"\necho \"ssh login latency :`(time -f user:%U ssh $DEST 'id > /dev/null') 2>&1`\"\n./generate.py | dd bs=4096 count=100000 | time ssh -c $CIPHER $DEST \"dd bs=4096 of=/dev/null\" 2>&1\n\n"
  },
  {
    "path": "src/libssh/tests/benchmarks/bench2.sh",
    "content": "export CIPHER=aes128-cbc\nexport DEST=localhost\n\necho \"Upload raw SSH statistics\"\necho \"local machine: `uname -a`\"\necho \"Cipher : $CIPHER ; Destination : $DEST (`ssh $DEST uname -a`)\"\necho \"Local ssh version: `samplessh -V 2>&1`\"\necho \"Ping latency to $DEST\":\nping -q -c 1 -n $DEST\necho \"Destination $DEST SSHD vesion : `echo | nc $DEST 22 | head -n1`\"\necho \"ssh login latency :`(time -f user:%U samplessh $DEST 'id > /dev/null') 2>&1`\"\n./generate.py | dd bs=4096 count=100000 | strace  samplessh -c $CIPHER $DEST \"dd bs=4096 of=/dev/null\" 2>&1\n\n"
  },
  {
    "path": "src/libssh/tests/benchmarks/bench_raw.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2010 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"benchmarks.h\"\n#include <string.h>\n#include <stdlib.h>\n#include <stdio.h>\n\n#define PYTHON_PATH \"/usr/bin/python\"\n\nconst char python_eater[]=\n\"#!/usr/bin/python\\n\"\n\"import sys\\n\"\n\"print 'go'\\n\"\n\"sys.stdout.flush()\\n\"\n\"toread=XXXXXXXXXX\\n\"\n\"read=0\\n\"\n\"while(read < toread):\\n\"\n\"    buffersize=toread-read\\n\"\n\"    if(buffersize > 4096):\\n\"\n\"        buffersize=4096\\n\"\n\"    r=len(sys.stdin.read(buffersize))\\n\"\n\"    read+=r\\n\"\n\"    if(r<=0):\\n\"\n\"        print 'error'\\n\"\n\"        exit()\\n\"\n\"print 'done'\\n\";\n\nstatic char *get_python_eater(unsigned long bytes){\n  char *eater=malloc(sizeof(python_eater));\n  char *ptr;\n  char buf[12];\n\n  memcpy(eater,python_eater,sizeof(python_eater));\n  ptr=strstr(eater,\"XXXXXXXXXX\");\n  if(!ptr){\n    free(eater);\n    return NULL;\n  }\n  sprintf(buf,\"0x%.8lx\",bytes);\n  memcpy(ptr,buf,10);\n  return eater;\n}\n\n/** @internal\n * @brief uploads a script (python or other) at a specific path on the\n * remote host\n * @param[in] session an active SSH session\n * @param[in] path to copy the file\n * @param[in] content of the file to copy\n * @return 0 on success, -1 on error\n */\nstatic int upload_script(ssh_session session, const char *path,\n    const char *script){\n  ssh_channel channel;\n  char cmd[128];\n  int err;\n\n  channel=ssh_channel_new(session);\n  if(!channel)\n    goto error;\n  if(ssh_channel_open_session(channel) == SSH_ERROR)\n    goto error;\n  snprintf(cmd,sizeof(cmd),\"cat > %s\",path);\n  if(ssh_channel_request_exec(channel,cmd) == SSH_ERROR)\n    goto error;\n  err=ssh_channel_write(channel,script,strlen(script));\n  if(err == SSH_ERROR)\n    goto error;\n  if(ssh_channel_send_eof(channel) == SSH_ERROR)\n    goto error;\n  if(ssh_channel_close(channel) == SSH_ERROR)\n    goto error;\n  ssh_channel_free(channel);\n  return 0;\nerror:\n  fprintf(stderr,\"Error while copying script : %s\\n\",ssh_get_error(session));\n  return -1;\n}\n\n/** @internal\n * @brief benchmarks a raw upload (simple upload in a SSH channel) using an\n * existing SSH session.\n * @param[in] session Open SSH session\n * @param[in] args Parsed command line arguments\n * @param[out] bps The calculated bytes per second obtained via benchmark.\n * @return 0 on success, -1 on error.\n */\nint benchmarks_raw_up (ssh_session session, struct argument_s *args,\n    float *bps){\n  unsigned long bytes;\n  char *script;\n  char cmd[128];\n  int err;\n  ssh_channel channel;\n  struct timestamp_struct ts;\n  float ms=0.0;\n  unsigned long total=0;\n\n  bytes = args->datasize * 1024 * 1024;\n  script =get_python_eater(bytes);\n  err=upload_script(session,\"/tmp/eater.py\",script);\n  free(script);\n  if(err<0)\n    return err;\n  channel=ssh_channel_new(session);\n  if(channel == NULL)\n    goto error;\n  if(ssh_channel_open_session(channel)==SSH_ERROR)\n    goto error;\n  snprintf(cmd,sizeof(cmd),\"%s /tmp/eater.py\", PYTHON_PATH);\n  if(ssh_channel_request_exec(channel,cmd)==SSH_ERROR)\n    goto error;\n  if((err=ssh_channel_read(channel,buffer,sizeof(buffer)-1,0))==SSH_ERROR)\n    goto error;\n  buffer[err]=0;\n  if(!strstr(buffer,\"go\")){\n    fprintf(stderr,\"parse error : %s\\n\",buffer);\n    ssh_channel_close(channel);\n    ssh_channel_free(channel);\n    return -1;\n  }\n  if(args->verbose>0)\n    fprintf(stdout,\"Starting upload of %lu bytes now\\n\",bytes);\n  timestamp_init(&ts);\n  while(total < bytes){\n    unsigned long towrite = bytes - total;\n    int w;\n    if(towrite > args->chunksize)\n      towrite = args->chunksize;\n    w=ssh_channel_write(channel,buffer,towrite);\n    if(w == SSH_ERROR)\n      goto error;\n    total += w;\n  }\n\n  if(args->verbose>0)\n    fprintf(stdout,\"Finished upload, now waiting the ack\\n\");\n\n  if((err=ssh_channel_read(channel,buffer,5,0))==SSH_ERROR)\n      goto error;\n  buffer[err]=0;\n  if(!strstr(buffer,\"done\")){\n    fprintf(stderr,\"parse error : %s\\n\",buffer);\n    ssh_channel_close(channel);\n    ssh_channel_free(channel);\n    return -1;\n  }\n  ms=elapsed_time(&ts);\n  *bps=8000 * (float)bytes / ms;\n  if(args->verbose > 0)\n    fprintf(stdout,\"Upload took %f ms for %lu bytes, at %f bps\\n\",ms,\n        bytes,*bps);\n  ssh_channel_close(channel);\n  ssh_channel_free(channel);\n  return 0;\nerror:\n  fprintf(stderr,\"Error during raw upload : %s\\n\",ssh_get_error(session));\n  if(channel){\n    ssh_channel_close(channel);\n    ssh_channel_free(channel);\n  }\n  return -1;\n}\n\nconst char python_giver[] =\n\"#!/usr/bin/python\\n\"\n\"import sys\\n\"\n\"r=sys.stdin.read(2)\\n\"\n\"towrite=XXXXXXXXXX\\n\"\n\"wrote=0\\n\"\n\"mtu = 32786\\n\"\n\"buf = 'A'*mtu\\n\"\n\"while(wrote < towrite):\\n\"\n\"    buffersize=towrite-wrote\\n\"\n\"    if(buffersize > mtu):\\n\"\n\"        buffersize=mtu\\n\"\n\"    if(buffersize == mtu):\\n\"\n\"        sys.stdout.write(buf)\\n\"\n\"    else:\\n\"\n\"        sys.stdout.write('A'*buffersize)\\n\"\n\"    wrote+=buffersize\\n\"\n\"sys.stdout.flush()\\n\";\n\nstatic char *get_python_giver(unsigned long bytes){\n  char *giver=malloc(sizeof(python_giver));\n  char *ptr;\n  char buf[12];\n\n  memcpy(giver,python_giver,sizeof(python_giver));\n  ptr=strstr(giver,\"XXXXXXXXXX\");\n  if(!ptr){\n    free(giver);\n    return NULL;\n  }\n  sprintf(buf,\"0x%.8lx\",bytes);\n  memcpy(ptr,buf,10);\n  return giver;\n}\n\n/** @internal\n * @brief benchmarks a raw download (simple upload in a SSH channel) using an\n * existing SSH session.\n * @param[in] session Open SSH session\n * @param[in] args Parsed command line arguments\n * @param[out] bps The calculated bytes per second obtained via benchmark.\n * @return 0 on success, -1 on error.\n */\nint benchmarks_raw_down (ssh_session session, struct argument_s *args,\n    float *bps){\n  unsigned long bytes;\n  char *script;\n  char cmd[128];\n  int err;\n  ssh_channel channel;\n  struct timestamp_struct ts;\n  float ms=0.0;\n  unsigned long total=0;\n\n  bytes = args->datasize * 1024 * 1024;\n  script =get_python_giver(bytes);\n  err=upload_script(session,\"/tmp/giver.py\",script);\n  free(script);\n  if(err<0)\n    return err;\n  channel=ssh_channel_new(session);\n  if(channel == NULL)\n    goto error;\n  if(ssh_channel_open_session(channel)==SSH_ERROR)\n    goto error;\n  snprintf(cmd,sizeof(cmd),\"%s /tmp/giver.py\", PYTHON_PATH);\n  if(ssh_channel_request_exec(channel,cmd)==SSH_ERROR)\n    goto error;\n  if((err=ssh_channel_write(channel,\"go\",2))==SSH_ERROR)\n    goto error;\n  if(args->verbose>0)\n    fprintf(stdout,\"Starting download of %lu bytes now\\n\",bytes);\n  timestamp_init(&ts);\n  while(total < bytes){\n    unsigned long toread = bytes - total;\n    int r;\n    if(toread > args->chunksize)\n      toread = args->chunksize;\n    r=ssh_channel_read(channel,buffer,toread,0);\n    if(r == SSH_ERROR)\n      goto error;\n    total += r;\n  }\n\n  if(args->verbose>0)\n    fprintf(stdout,\"Finished download\\n\");\n  ms=elapsed_time(&ts);\n  *bps=8000 * (float)bytes / ms;\n  if(args->verbose > 0)\n    fprintf(stdout,\"Download took %f ms for %lu bytes, at %f bps\\n\",ms,\n        bytes,*bps);\n  ssh_channel_close(channel);\n  ssh_channel_free(channel);\n  return 0;\nerror:\n  fprintf(stderr,\"Error during raw upload : %s\\n\",ssh_get_error(session));\n  if(channel){\n    ssh_channel_close(channel);\n    ssh_channel_free(channel);\n  }\n  return -1;\n}\n"
  },
  {
    "path": "src/libssh/tests/benchmarks/bench_scp.c",
    "content": "/* bench_scp.c\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2011 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"benchmarks.h\"\n#include <libssh/libssh.h>\n#include <stdio.h>\n\n#define SCPDIR \"/tmp/\"\n#define SCPFILE \"scpbenchmark\"\n\n/** @internal\n * @brief benchmarks a scp upload using an\n * existing SSH session.\n * @param[in] session Open SSH session\n * @param[in] args Parsed command line arguments\n * @param[out] bps The calculated bytes per second obtained via benchmark.\n * @return 0 on success, -1 on error.\n */\nint benchmarks_scp_up (ssh_session session, struct argument_s *args,\n    float *bps){\n  unsigned long bytes;\n  struct timestamp_struct ts;\n  float ms=0.0;\n  unsigned long total=0;\n  ssh_scp scp;\n\n  bytes = args->datasize * 1024 * 1024;\n  scp = ssh_scp_new(session,SSH_SCP_WRITE,SCPDIR);\n  if(scp == NULL)\n    goto error;\n  if(ssh_scp_init(scp)==SSH_ERROR)\n    goto error;\n  if(ssh_scp_push_file(scp,SCPFILE,bytes,0777) != SSH_OK)\n    goto error;\n  if(args->verbose>0)\n    fprintf(stdout,\"Starting upload of %lu bytes now\\n\",bytes);\n  timestamp_init(&ts);\n  while(total < bytes){\n    unsigned long towrite = bytes - total;\n    int w;\n    if(towrite > args->chunksize)\n      towrite = args->chunksize;\n    w=ssh_scp_write(scp,buffer,towrite);\n    if(w == SSH_ERROR)\n      goto error;\n    total += towrite;\n  }\n  ms=elapsed_time(&ts);\n  *bps=8000 * (float)bytes / ms;\n  if(args->verbose > 0)\n    fprintf(stdout,\"Upload took %f ms for %lu bytes, at %f bps\\n\",ms,\n        bytes,*bps);\n  ssh_scp_close(scp);\n  ssh_scp_free(scp);\n  return 0;\nerror:\n  fprintf(stderr,\"Error during scp upload : %s\\n\",ssh_get_error(session));\n  if(scp){\n    ssh_scp_close(scp);\n    ssh_scp_free(scp);\n  }\n  return -1;\n}\n\n/** @internal\n * @brief benchmarks a scp download using an\n * existing SSH session.\n * @param[in] session Open SSH session\n * @param[in] args Parsed command line arguments\n * @param[out] bps The calculated bytes per second obtained via benchmark.\n * @return 0 on success, -1 on error.\n */\nint benchmarks_scp_down (ssh_session session, struct argument_s *args,\n    float *bps){\n  unsigned long bytes;\n  struct timestamp_struct ts;\n  float ms=0.0;\n  unsigned long total=0;\n  ssh_scp scp;\n  int r;\n  size_t size;\n\n  bytes = args->datasize * 1024 * 1024;\n  scp = ssh_scp_new(session,SSH_SCP_READ,SCPDIR SCPFILE);\n  if(scp == NULL)\n    goto error;\n  if(ssh_scp_init(scp)==SSH_ERROR)\n    goto error;\n  r=ssh_scp_pull_request(scp);\n  if(r == SSH_SCP_REQUEST_NEWFILE){\n    size=ssh_scp_request_get_size(scp);\n    if(bytes > size){\n      printf(\"Only %zd bytes available (on %lu requested).\\n\",size,bytes);\n      bytes = size;\n    }\n    if(size > bytes){\n      printf(\"File is %zd bytes (on %lu requested). Will cut the end\\n\",size,bytes);\n    }\n    if(args->verbose>0)\n      fprintf(stdout,\"Starting download of %lu bytes now\\n\",bytes);\n    timestamp_init(&ts);\n    ssh_scp_accept_request(scp);\n    while(total < bytes){\n      unsigned long toread = bytes - total;\n      if(toread > args->chunksize)\n        toread = args->chunksize;\n      r=ssh_scp_read(scp,buffer,toread);\n      if(r == SSH_ERROR || r == 0)\n        goto error;\n      total += r;\n    }\n    ms=elapsed_time(&ts);\n    *bps=8000 * (float)bytes / ms;\n    if(args->verbose > 0)\n      fprintf(stdout,\"download took %f ms for %lu bytes, at %f bps\\n\",ms,\n          bytes,*bps);\n  } else {\n    fprintf(stderr,\"Expected SSH_SCP_REQUEST_NEWFILE, got %d\\n\",r);\n    goto error;\n  }\n  ssh_scp_close(scp);\n  ssh_scp_free(scp);\n  return 0;\nerror:\n  fprintf(stderr,\"Error during scp download : %s\\n\",ssh_get_error(session));\n  if(scp){\n    ssh_scp_close(scp);\n    ssh_scp_free(scp);\n  }\n  return -1;\n}\n"
  },
  {
    "path": "src/libssh/tests/benchmarks/bench_sftp.c",
    "content": "/* bench_sftp.c\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2011 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"benchmarks.h\"\n#include <libssh/libssh.h>\n#include <libssh/sftp.h>\n#include <stdio.h>\n#include <fcntl.h>\n#include <stdlib.h>\n\n#define SFTPDIR \"/tmp/\"\n#define SFTPFILE \"scpbenchmark\"\n\n/** @internal\n * @brief benchmarks a synchronous sftp upload using an\n * existing SSH session.\n * @param[in] session Open SSH session\n * @param[in] args Parsed command line arguments\n * @param[out] bps The calculated bytes per second obtained via benchmark.\n * @return 0 on success, -1 on error.\n */\nint benchmarks_sync_sftp_up (ssh_session session, struct argument_s *args,\n    float *bps){\n  unsigned long bytes;\n  struct timestamp_struct ts;\n  float ms=0.0;\n  unsigned long total=0;\n  sftp_session sftp;\n  sftp_file file = NULL;\n\n  bytes = args->datasize * 1024 * 1024;\n  sftp = sftp_new(session);\n  if(sftp == NULL)\n    goto error;\n  if(sftp_init(sftp)==SSH_ERROR)\n    goto error;\n  file = sftp_open(sftp,SFTPDIR SFTPFILE,O_RDWR | O_CREAT | O_TRUNC, 0777);\n  if(!file)\n    goto error;\n  if(args->verbose>0)\n    fprintf(stdout,\"Starting upload of %lu bytes now\\n\",bytes);\n  timestamp_init(&ts);\n  while(total < bytes){\n    unsigned long towrite = bytes - total;\n    int w;\n    if(towrite > args->chunksize)\n      towrite = args->chunksize;\n    w=sftp_write(file,buffer,towrite);\n    if(w == SSH_ERROR)\n      goto error;\n    total += w;\n  }\n  sftp_close(file);\n  ms=elapsed_time(&ts);\n  *bps=8000 * (float)bytes / ms;\n  if(args->verbose > 0)\n    fprintf(stdout,\"Upload took %f ms for %lu bytes, at %f bps\\n\",ms,\n        bytes,*bps);\n  sftp_free(sftp);\n  return 0;\nerror:\n  fprintf(stderr,\"Error during scp upload : %s\\n\",ssh_get_error(session));\n  if(file)\n    sftp_close(file);\n  if(sftp)\n    sftp_free(sftp);\n  return -1;\n}\n\n/** @internal\n * @brief benchmarks a synchronous sftp download using an\n * existing SSH session.\n * @param[in] session Open SSH session\n * @param[in] args Parsed command line arguments\n * @param[out] bps The calculated bytes per second obtained via benchmark.\n * @return 0 on success, -1 on error.\n */\nint benchmarks_sync_sftp_down (ssh_session session, struct argument_s *args,\n    float *bps){\n  unsigned long bytes;\n  struct timestamp_struct ts;\n  float ms=0.0;\n  unsigned long total=0;\n  sftp_session sftp;\n  sftp_file file = NULL;\n  int r;\n\n  bytes = args->datasize * 1024 * 1024;\n  sftp = sftp_new(session);\n  if(sftp == NULL)\n    goto error;\n  if(sftp_init(sftp)==SSH_ERROR)\n    goto error;\n  file = sftp_open(sftp,SFTPDIR SFTPFILE,O_RDONLY,0);\n  if(!file)\n    goto error;\n  if(args->verbose>0)\n    fprintf(stdout,\"Starting download of %lu bytes now\\n\",bytes);\n  timestamp_init(&ts);\n  while(total < bytes){\n    unsigned long toread = bytes - total;\n    if(toread > args->chunksize)\n      toread = args->chunksize;\n    r=sftp_read(file,buffer,toread);\n    if(r == SSH_ERROR)\n      goto error;\n    total += r;\n    /* we had a smaller file */\n    if(r==0){\n      fprintf(stdout,\"File smaller than expected : %lu (expected %lu).\\n\",total,bytes);\n      bytes = total;\n      break;\n    }\n  }\n  sftp_close(file);\n  ms=elapsed_time(&ts);\n  *bps=8000 * (float)bytes / ms;\n  if(args->verbose > 0)\n    fprintf(stdout,\"download took %f ms for %lu bytes, at %f bps\\n\",ms,\n        bytes,*bps);\n  sftp_free(sftp);\n  return 0;\nerror:\n  fprintf(stderr,\"Error during sftp download : %s\\n\",ssh_get_error(session));\n  if(file)\n    sftp_close(file);\n  if(sftp)\n    sftp_free(sftp);\n  return -1;\n}\n\n/** @internal\n * @brief benchmarks an asynchronous sftp download using an\n * existing SSH session.\n * @param[in] session Open SSH session\n * @param[in] args Parsed command line arguments\n * @param[out] bps The calculated bytes per second obtained via benchmark.\n * @return 0 on success, -1 on error.\n */\nint benchmarks_async_sftp_down (ssh_session session, struct argument_s *args,\n    float *bps){\n  unsigned long bytes;\n  struct timestamp_struct ts;\n  float ms=0.0;\n  unsigned long total=0;\n  sftp_session sftp;\n  sftp_file file = NULL;\n  int r,i;\n  int warned = 0;\n  unsigned long toread;\n  int *ids=NULL;\n  int concurrent_downloads = args->concurrent_requests;\n\n  bytes = args->datasize * 1024 * 1024;\n  sftp = sftp_new(session);\n  if(sftp == NULL)\n    goto error;\n  if(sftp_init(sftp)==SSH_ERROR)\n    goto error;\n  file = sftp_open(sftp,SFTPDIR SFTPFILE,O_RDONLY,0);\n  if(!file)\n    goto error;\n  ids = malloc(concurrent_downloads * sizeof(int));\n  if(args->verbose>0)\n    fprintf(stdout,\"Starting download of %lu bytes now, using %d concurrent downloads\\n\",bytes,\n        concurrent_downloads);\n  timestamp_init(&ts);\n  for (i=0;i<concurrent_downloads;++i){\n    ids[i]=sftp_async_read_begin(file, args->chunksize);\n    if(ids[i]==SSH_ERROR)\n        goto error;\n  }\n  i=0;\n  while(total < bytes){\n    r = sftp_async_read(file, buffer, args->chunksize, ids[i]);\n    if(r == SSH_ERROR)\n      goto error;\n    total += r;\n    if(r != (int)args->chunksize && total != bytes && !warned){\n      fprintf(stderr,\"async_sftp_download : receiving short reads (%d, requested %d) \"\n          \"the received file will be corrupted and shorted. Adapt chunksize to %d\\n\",\n          r, args->chunksize,r);\n      warned = 1;\n    }\n    /* we had a smaller file */\n    if(r==0){\n      fprintf(stdout,\"File smaller than expected : %lu (expected %lu).\\n\",total,bytes);\n      bytes = total;\n      break;\n    }\n    toread = bytes - total;\n    if(toread < args->chunksize * concurrent_downloads){\n      /* we've got enough launched downloads */\n      ids[i]=-1;\n    }\n    if(toread > args->chunksize)\n      toread = args->chunksize;\n    ids[i]=sftp_async_read_begin(file,toread);\n    if(ids[i] == SSH_ERROR)\n      goto error;\n    i = (i+1) % concurrent_downloads;\n  }\n  sftp_close(file);\n  ms=elapsed_time(&ts);\n  *bps=8000 * (float)bytes / ms;\n  if(args->verbose > 0)\n    fprintf(stdout,\"download took %f ms for %lu bytes, at %f bps\\n\",ms,\n        bytes,*bps);\n  sftp_free(sftp);\n  free(ids);\n  return 0;\nerror:\n  fprintf(stderr,\"Error during sftp download : %s\\n\",ssh_get_error(session));\n  if(file)\n    sftp_close(file);\n  if(sftp)\n    sftp_free(sftp);\n  free(ids);\n  return -1;\n}\n"
  },
  {
    "path": "src/libssh/tests/benchmarks/benchmarks.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2010 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n#include \"benchmarks.h\"\n#include <libssh/libssh.h>\n\n#include <string.h>\n#include <stdlib.h>\n#include <stdio.h>\n\nstruct benchmark benchmarks[]= {\n    {\n        .name=\"benchmark_raw_upload\",\n        .fct=benchmarks_raw_up,\n        .enabled=0\n    },\n    {\n        .name=\"benchmark_raw_download\",\n        .fct=benchmarks_raw_down,\n        .enabled=0\n    },\n    {\n        .name=\"benchmark_scp_upload\",\n        .fct=benchmarks_scp_up,\n        .enabled=0\n    },\n    {\n        .name=\"benchmark_scp_download\",\n        .fct=benchmarks_scp_down,\n        .enabled=0\n    },\n    {\n        .name=\"benchmark_sync_sftp_upload\",\n        .fct=benchmarks_sync_sftp_up,\n        .enabled=0\n    },\n    {\n        .name=\"benchmark_sync_sftp_download\",\n        .fct=benchmarks_sync_sftp_down,\n        .enabled=0\n    },\n    {\n        .name=\"benchmark_async_sftp_download\",\n        .fct=benchmarks_async_sftp_down,\n        .enabled=0\n    }\n};\n\n#ifdef HAVE_ARGP_H\n#include <argp.h>\n\nconst char *argp_program_version = \"libssh benchmarks 2011-08-28\";\nconst char *argp_program_bug_address = \"Aris Adamantiadis <aris@0xbadc0de.be>\";\n\nstatic char **cmdline;\n\n/* Program documentation. */\nstatic char doc[] = \"libssh benchmarks\";\n\n\n/* The options we understand. */\nstatic struct argp_option options[] = {\n  {\n    .name  = \"verbose\",\n    .key   = 'v',\n    .arg   = NULL,\n    .flags = 0,\n    .doc   = \"Make libssh benchmark more verbose\",\n    .group = 0\n  },\n  {\n    .name  = \"raw-upload\",\n    .key   = '1',\n    .arg   = NULL,\n    .flags = 0,\n    .doc   = \"Upload raw data using channel\",\n    .group = 0\n  },\n  {\n    .name  = \"raw-download\",\n    .key   = '2',\n    .arg   = NULL,\n    .flags = 0,\n    .doc   = \"Download raw data using channel\",\n    .group = 0\n  },\n  {\n    .name  = \"scp-upload\",\n    .key   = '3',\n    .arg   = NULL,\n    .flags = 0,\n    .doc   = \"Upload data using SCP\",\n    .group = 0\n  },\n  {\n    .name  = \"scp-download\",\n    .key   = '4',\n    .arg   = NULL,\n    .flags = 0,\n    .doc   = \"Download data using SCP\",\n    .group = 0\n  },\n  {\n    .name  = \"sync-sftp-upload\",\n    .key   = '5',\n    .arg   = NULL,\n    .flags = 0,\n    .doc   = \"Upload data using synchronous SFTP\",\n    .group = 0\n\n  },\n  {\n    .name  = \"sync-sftp-download\",\n    .key   = '6',\n    .arg   = NULL,\n    .flags = 0,\n    .doc   = \"Download data using synchronous SFTP (slow)\",\n    .group = 0\n\n  },\n  {\n    .name  = \"async-sftp-download\",\n    .key   = '7',\n    .arg   = NULL,\n    .flags = 0,\n    .doc   = \"Download data using asynchronous SFTP (fast)\",\n    .group = 0\n\n  },\n  {\n    .name  = \"host\",\n    .key   = 'h',\n    .arg   = \"HOST\",\n    .flags = 0,\n    .doc   = \"Add a host to connect for benchmark (format user@hostname)\",\n    .group = 0\n  },\n  {\n    .name  = \"size\",\n    .key   = 's',\n    .arg   = \"MBYTES\",\n    .flags = 0,\n    .doc   = \"MBytes of data to send/receive per test\",\n    .group = 0\n  },\n  {\n    .name  = \"chunk\",\n    .key   = 'c',\n    .arg   = \"bytes\",\n    .flags = 0,\n    .doc   = \"size of data chunks to send/receive\",\n    .group = 0\n  },\n  {\n    .name  = \"prequests\",\n    .key   = 'p',\n    .arg   = \"number [20]\",\n    .flags = 0,\n    .doc   = \"[async SFTP] number of concurrent requests\",\n    .group = 0\n  },\n  {\n    .name  = \"cipher\",\n    .key   = 'C',\n    .arg   = \"cipher\",\n    .flags = 0,\n    .doc   = \"Cryptographic cipher to be used\",\n    .group = 0\n  },\n\n  {NULL, 0, NULL, 0, NULL, 0}\n};\n\n/* Parse a single option. */\nstatic error_t parse_opt (int key, char *arg, struct argp_state *state) {\n  /* Get the input argument from argp_parse, which we\n   * know is a pointer to our arguments structure.\n   */\n  struct argument_s *arguments = state->input;\n\n  /* arg is currently not used */\n  (void) arg;\n\n  switch (key) {\n    case '1':\n    case '2':\n    case '3':\n    case '4':\n    case '5':\n    case '6':\n    case '7':\n      benchmarks[key - '1'].enabled = 1;\n      arguments->ntests ++;\n      break;\n    case 'v':\n      arguments->verbose++;\n      break;\n    case 's':\n      arguments->datasize = atoi(arg);\n      break;\n    case 'p':\n      arguments->concurrent_requests = atoi(arg);\n      break;\n    case 'c':\n      arguments->chunksize = atoi(arg);\n      break;\n    case 'C':\n      arguments->cipher = arg;\n      break;\n    case 'h':\n      if(arguments->nhosts >= MAX_HOSTS_CONNECT){\n        fprintf(stderr, \"Too much hosts\\n\");\n        return ARGP_ERR_UNKNOWN;\n      }\n      arguments->hosts[arguments->nhosts]=arg;\n      arguments->nhosts++;\n      break;\n    case ARGP_KEY_ARG:\n      /* End processing here. */\n      cmdline = &state->argv [state->next - 1];\n      state->next = state->argc;\n      break;\n    default:\n      return ARGP_ERR_UNKNOWN;\n  }\n\n  return 0;\n}\n\n/* Our argp parser. */\nstatic struct argp argp = {options, parse_opt, NULL, doc, NULL, NULL, NULL};\n\n#endif /* HAVE_ARGP_H */\n\nstatic void cmdline_parse(int argc, char **argv, struct argument_s *arguments) {\n  /*\n   * Parse our arguments; every option seen by parse_opt will\n   * be reflected in arguments.\n   */\n#ifdef HAVE_ARGP_H\n  argp_parse(&argp, argc, argv, 0, 0, arguments);\n#else /* HAVE_ARGP_H */\n  (void) argc;\n  (void) argv;\n  arguments->hosts[0]=\"localhost\";\n  arguments->nhosts=1;\n#endif /* HAVE_ARGP_H */\n}\n\nstatic void arguments_init(struct argument_s *arguments){\n  memset(arguments,0,sizeof(*arguments));\n  arguments->chunksize=32758;\n  arguments->concurrent_requests=20;\n  arguments->datasize = 10;\n}\n\nstatic ssh_session connect_host(const char *host, int verbose, char *cipher){\n  ssh_session session=ssh_new();\n  if(session==NULL)\n    goto error;\n  if(ssh_options_set(session,SSH_OPTIONS_HOST, host)<0)\n    goto error;\n  ssh_options_set(session, SSH_OPTIONS_LOG_VERBOSITY, &verbose);\n  if(cipher != NULL){\n    if (ssh_options_set(session, SSH_OPTIONS_CIPHERS_C_S, cipher) ||\n        ssh_options_set(session, SSH_OPTIONS_CIPHERS_S_C, cipher)){\n      goto error;\n    }\n  }\n  ssh_options_parse_config(session, NULL);\n  if(ssh_connect(session)==SSH_ERROR)\n    goto error;\n  if(ssh_userauth_autopubkey(session,NULL) != SSH_AUTH_SUCCESS)\n    goto error;\n  return session;\nerror:\n  fprintf(stderr,\"Error connecting to \\\"%s\\\": %s\\n\",host,ssh_get_error(session));\n  ssh_free(session);\n  return NULL;\n}\n\nstatic char *network_speed(float bps){\n  static char buf[128];\n  if(bps > 1000*1000*1000){\n    /* Gbps */\n    snprintf(buf,sizeof(buf),\"%f Gbps\",bps/(1000*1000*1000));\n  } else if(bps > 1000*1000){\n    /* Mbps */\n    snprintf(buf,sizeof(buf),\"%f Mbps\",bps/(1000*1000));\n  } else if(bps > 1000){\n    snprintf(buf,sizeof(buf),\"%f Kbps\",bps/1000);\n  } else {\n    snprintf(buf,sizeof(buf),\"%f bps\",bps);\n  }\n  return buf;\n}\n\nstatic void do_benchmarks(ssh_session session, struct argument_s *arguments,\n    const char *hostname){\n  float ping_rtt=0.0;\n  float ssh_rtt=0.0;\n  float bps=0.0;\n  int i;\n  int err;\n  struct benchmark *b;\n\n  if(arguments->verbose>0)\n    fprintf(stdout,\"Testing ICMP RTT\\n\");\n  err=benchmarks_ping_latency(hostname, &ping_rtt);\n  if(err == 0){\n    fprintf(stdout,\"ping RTT : %f ms\\n\",ping_rtt);\n  }\n  err=benchmarks_ssh_latency(session, &ssh_rtt);\n  if(err==0){\n    fprintf(stdout, \"SSH RTT : %f ms. Theoretical max BW (win=128K) : %s\\n\",ssh_rtt,network_speed(128000.0/(ssh_rtt / 1000.0)));\n  }\n  for (i=0 ; i<BENCHMARK_NUMBER ; ++i){\n    b = &benchmarks[i];\n    if(b->enabled){\n      err=b->fct(session,arguments,&bps);\n      if(err==0){\n        fprintf(stdout, \"%s : %s : %s\\n\",hostname, b->name, network_speed(bps));\n      }\n    }\n  }\n}\n\nchar *buffer;\n\nint main(int argc, char **argv){\n  struct argument_s arguments;\n  ssh_session session;\n  int i;\n\n  arguments_init(&arguments);\n  cmdline_parse(argc, argv, &arguments);\n  if (arguments.nhosts==0){\n    fprintf(stderr,\"At least one host (-h) must be specified\\n\");\n    return EXIT_FAILURE;\n  }\n  if (arguments.ntests==0){\n    for(i=0; i < BENCHMARK_NUMBER ; ++i){\n      benchmarks[i].enabled=1;\n    }\n    arguments.ntests=BENCHMARK_NUMBER;\n  }\n  buffer=malloc(arguments.chunksize > 1024 ? arguments.chunksize : 1024);\n  if(buffer == NULL){\n    fprintf(stderr,\"Allocation of chunk buffer failed\\n\");\n    return EXIT_FAILURE;\n  }\n  if (arguments.verbose > 0){\n    fprintf(stdout, \"Will try hosts \");\n    for(i=0;i<arguments.nhosts;++i){\n      fprintf(stdout,\"\\\"%s\\\" \", arguments.hosts[i]);\n    }\n    fprintf(stdout,\"with benchmarks \");\n    for(i=0;i<BENCHMARK_NUMBER;++i){\n      if(benchmarks[i].enabled)\n        fprintf(stdout,\"\\\"%s\\\" \",benchmarks[i].name);\n    }\n    fprintf(stdout,\"\\n\");\n  }\n\n  for(i=0; i<arguments.nhosts;++i){\n    if(arguments.verbose > 0)\n      fprintf(stdout,\"Connecting to \\\"%s\\\"...\\n\",arguments.hosts[i]);\n    session=connect_host(arguments.hosts[i], arguments.verbose, arguments.cipher);\n    if(session != NULL && arguments.verbose > 0)\n      fprintf(stdout,\"Success\\n\");\n    if(session == NULL){\n      fprintf(stderr,\"Errors occurred, stopping\\n\");\n      return EXIT_FAILURE;\n    }\n    do_benchmarks(session, &arguments, arguments.hosts[i]);\n    ssh_disconnect(session);\n    ssh_free(session);\n  }\n  return EXIT_SUCCESS;\n}\n\n"
  },
  {
    "path": "src/libssh/tests/benchmarks/benchmarks.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2010 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#ifndef BENCHMARKS_H_\n#define BENCHMARKS_H_\n\n#include <libssh/libssh.h>\n\n/* benchmarks.c */\n\n/* maximum number of parallel hosts that may be checked */\n#define MAX_HOSTS_CONNECT 20\n\nenum libssh_benchmarks {\n    BENCHMARK_RAW_UPLOAD=0,\n    BENCHMARK_RAW_DOWNLOAD,\n    BENCHMARK_SCP_UPLOAD,\n    BENCHMARK_SCP_DOWNLOAD,\n    BENCHMARK_SYNC_SFTP_UPLOAD,\n    BENCHMARK_SYNC_SFTP_DOWNLOAD,\n    BENCHMARK_ASYNC_SFTP_DOWNLOAD,\n    BENCHMARK_NUMBER\n};\n\nstruct argument_s {\n  const char *hosts[MAX_HOSTS_CONNECT];\n  int verbose;\n  int nhosts;\n  int ntests;\n  unsigned int datasize;\n  unsigned int chunksize;\n  int concurrent_requests;\n  char *cipher;\n};\n\nextern char *buffer;\n\ntypedef int (*bench_fct)(ssh_session session, struct argument_s *args,\n    float *bps);\n\nstruct benchmark {\n  const char *name;\n  bench_fct fct;\n  int enabled;\n};\n\n/* latency.c */\n\nstruct timestamp_struct {\n  struct timeval timestamp;\n};\n\nint benchmarks_ping_latency (const char *host, float *average);\nint benchmarks_ssh_latency (ssh_session session, float *average);\n\nvoid timestamp_init(struct timestamp_struct *ts);\nfloat elapsed_time(struct timestamp_struct *ts);\n\n/* bench_raw.c */\n\nint benchmarks_raw_up (ssh_session session, struct argument_s *args,\n    float *bps);\nint benchmarks_raw_down (ssh_session session, struct argument_s *args,\n    float *bps);\n\n/* bench_scp.c */\n\nint benchmarks_scp_up (ssh_session session, struct argument_s *args,\n    float *bps);\nint benchmarks_scp_down (ssh_session session, struct argument_s *args,\n    float *bps);\n\n/* bench_sftp.c */\n\nint benchmarks_sync_sftp_up (ssh_session session, struct argument_s *args,\n    float *bps);\nint benchmarks_sync_sftp_down (ssh_session session, struct argument_s *args,\n    float *bps);\nint benchmarks_async_sftp_down (ssh_session session, struct argument_s *args,\n    float *bps);\n#endif /* BENCHMARKS_H_ */\n"
  },
  {
    "path": "src/libssh/tests/benchmarks/latency.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2010 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"benchmarks.h\"\n#include <libssh/libssh.h>\n\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n#include <errno.h>\n#include <sys/time.h>\n\n#define PING_PROGRAM \"/bin/ping\"\n\n/** @internal\n * @brief Calculates the RTT of the host with ICMP ping, and returns the\n * average of the calculated RTT.\n * @param[in] host hostname to ping.\n * @param[out] average average RTT in milliseconds.\n * @returns 0 on success, -1 if there is an error.\n * @warning relies on an external ping program which may not exist on\n * certain OS.\n */\nint benchmarks_ping_latency (const char *host, float *average){\n  const char *ptr;\n  char cmd[256];\n  char line[1024];\n  FILE *fd;\n  int found=0;\n\n  /* strip out the hostname */\n  ptr=strchr(host,'@');\n  if(ptr)\n    ptr++;\n  else\n    ptr=host;\n\n  snprintf(cmd,sizeof(cmd),\"%s -n -q -c3 %s\",PING_PROGRAM, ptr);\n  fd=popen(cmd,\"r\");\n  if(fd==NULL){\n    fprintf(stderr,\"Error executing command : %s\\n\", strerror(errno));\n    return -1;\n  }\n\n  while(!found && fgets(line,sizeof(line),fd)!=NULL){\n    if(strstr(line,\"rtt\")){\n      ptr=strchr(line,'=');\n      if(ptr==NULL)\n        goto parseerror;\n      ptr=strchr(ptr,'/');\n      if(ptr==NULL)\n        goto parseerror;\n      *average=strtof(ptr+1,NULL);\n      found=1;\n      break;\n    }\n  }\n  if(!found)\n    goto parseerror;\n  pclose(fd);\n  return 0;\n\nparseerror:\n  fprintf(stderr,\"Parse error : couldn't locate average in %s\",line);\n  pclose(fd);\n  return -1;\n}\n\n/** @internal\n * @brief initialize a timestamp to the current time.\n * @param[out] ts A timestamp_struct pointer.\n */\nvoid timestamp_init(struct timestamp_struct *ts){\n  gettimeofday(&ts->timestamp,NULL);\n}\n\n/** @internal\n * @brief return the elapsed time since now and the moment ts was initialized.\n * @param[in] ts An initialized timestamp_struct pointer.\n * @return Elapsed time in milliseconds.\n */\nfloat elapsed_time(struct timestamp_struct *ts){\n  struct timeval now;\n  time_t secdiff;\n  long usecdiff; /* may be negative */\n\n  gettimeofday(&now,NULL);\n  secdiff=now.tv_sec - ts->timestamp.tv_sec;\n  usecdiff=now.tv_usec - ts->timestamp.tv_usec;\n  //printf(\"%d sec diff, %d usec diff\\n\",secdiff, usecdiff);\n  return (float) (secdiff*1000) + ((float)usecdiff)/1000;\n}\n\n/** @internal\n * @brief Calculates the RTT of the host with SSH channel operations, and\n * returns the average of the calculated RTT.\n * @param[in] session active SSH session to test.\n * @param[out] average average RTT in milliseconds.\n * @returns 0 on success, -1 if there is an error.\n */\nint benchmarks_ssh_latency(ssh_session session, float *average){\n  float times[3];\n  struct timestamp_struct ts;\n  int i;\n  ssh_channel channel;\n  channel=ssh_channel_new(session);\n  if(channel==NULL)\n    goto error;\n  if(ssh_channel_open_session(channel)==SSH_ERROR)\n    goto error;\n\n  for(i=0;i<3;++i){\n    timestamp_init(&ts);\n    if(ssh_channel_request_env(channel,\"TEST\",\"test\")==SSH_ERROR &&\n        ssh_get_error_code(session)==SSH_FATAL)\n      goto error;\n    times[i]=elapsed_time(&ts);\n  }\n  ssh_channel_close(channel);\n  ssh_channel_free(channel);\n  channel=NULL;\n  printf(\"SSH request times : %f ms ; %f ms ; %f ms\\n\", times[0], times[1], times[2]);\n  *average=(times[0]+times[1]+times[2])/3;\n  return 0;\nerror:\n  fprintf(stderr,\"Error calculating SSH latency : %s\\n\",ssh_get_error(session));\n  if(channel)\n    ssh_channel_free(channel);\n  return -1;\n}\n"
  },
  {
    "path": "src/libssh/tests/chmodtest.c",
    "content": "#include <stdio.h>\n\n#include <libssh/libssh.h>\n#include \"examples_common.h\"\n#include <libssh/sftp.h>\n\nint main(void) {\n  ssh_session session;\n  sftp_session sftp;\n  char buffer[1024*1024];\n  int rc;\n\n  session = connect_ssh(\"localhost\", NULL, 0);\n  if (session == NULL) {\n    return 1;\n  }\n\n  sftp=sftp_new(session);\n  sftp_init(sftp);\n  rc=sftp_rename(sftp,\"/tmp/test\",\"/tmp/test\");\n  rc=sftp_rename(sftp,\"/tmp/test\",\"/tmp/test\");\n  rc=sftp_chmod(sftp,\"/tmp/test\",0644);\n  if (rc < 0) {\n    printf(\"error : %s\\n\",ssh_get_error(sftp));\n\n    ssh_disconnect(session);\n    return 1;\n  }\n\n  ssh_disconnect(session);\n\n  return 0;\n}\n"
  },
  {
    "path": "src/libssh/tests/chroot_wrapper.c",
    "content": "/* silent gcc */\nint chroot(const char *);\n\nint chroot(const char *path)\n{\n    (void)path;\n    return 0;\n}\n"
  },
  {
    "path": "src/libssh/tests/client/CMakeLists.txt",
    "content": "project(clienttests C)\n\nfind_package(socket_wrapper)\n\nset(LIBSSH_CLIENT_TESTS\n    torture_algorithms\n    torture_client_config\n    torture_connect\n    torture_hostkey\n    torture_auth\n    torture_rekey\n    torture_forward\n    torture_knownhosts\n    torture_knownhosts_verify\n    torture_proxycommand\n    torture_session\n    torture_request_env\n    torture_client_global_requests)\n\nfind_program(SCP_EXECUTABLE NAMES scp)\nif (SCP_EXECUTABLE)\n    set(LIBSSH_CLIENT_TESTS\n        ${LIBSSH_CLIENT_TESTS}\n        torture_scp)\nendif()\n\nif (DEFAULT_C_NO_DEPRECATION_FLAGS)\n    set_source_files_properties(torture_knownhosts.c\n                                PROPERTIES\n                                    COMPILE_FLAGS ${DEFAULT_C_NO_DEPRECATION_FLAGS})\nendif()\n\nif (WITH_SFTP)\n    if (WITH_BENCHMARKS)\n        set(SFTP_BENCHMARK_TESTS\n            torture_sftp_benchmark)\n    endif()\n    set(LIBSSH_CLIENT_TESTS\n        ${LIBSSH_CLIENT_TESTS}\n        torture_sftp_ext\n        torture_sftp_canonicalize_path\n        torture_sftp_dir\n        torture_sftp_read\n        torture_sftp_fsync\n        ${SFTP_BENCHMARK_TESTS})\nendif (WITH_SFTP)\n\nforeach(_CLI_TEST ${LIBSSH_CLIENT_TESTS})\n    add_cmocka_test(${_CLI_TEST}\n                    SOURCES ${_CLI_TEST}.c\n                    COMPILE_OPTIONS ${DEFAULT_C_COMPILE_FLAGS}\n                    LINK_LIBRARIES ${TORTURE_LIBRARY}\n    )\n\n    if (OSX)\n        set_property(\n            TEST\n                ${_CLI_TEST}\n            PROPERTY\n            ENVIRONMENT DYLD_FORCE_FLAT_NAMESPACE=1;DYLD_INSERT_LIBRARIES=${SOCKET_WRAPPER_LIBRARY})\n    else ()\n        set_property(\n            TEST\n                ${_CLI_TEST}\n            PROPERTY\n                ENVIRONMENT ${TORTURE_ENVIRONMENT})\n    endif()\nendforeach()\n"
  },
  {
    "path": "src/libssh/tests/client/torture_algorithms.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2010 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include \"torture.h\"\n#include \"libssh/libssh.h\"\n#include \"libssh/priv.h\"\n#include \"libssh/session.h\"\n\n#include <errno.h>\n#include <sys/types.h>\n#include <pwd.h>\n\nstatic int sshd_setup(void **state)\n{\n    torture_setup_sshd_server(state, false);\n\n    return 0;\n}\n\nstatic int sshd_teardown(void **state) {\n    torture_teardown_sshd_server(state);\n\n    return 0;\n}\n\nstatic int session_setup(void **state) {\n    struct torture_state *s = *state;\n    int verbosity = torture_libssh_verbosity();\n    struct passwd *pwd;\n    bool false_v = false;\n    int rc;\n\n    pwd = getpwnam(\"bob\");\n    assert_non_null(pwd);\n\n    rc = setuid(pwd->pw_uid);\n    assert_return_code(rc, errno);\n\n    s->ssh.session = ssh_new();\n    assert_non_null(s->ssh.session);\n\n    ssh_options_set(s->ssh.session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity);\n    ssh_options_set(s->ssh.session, SSH_OPTIONS_HOST, TORTURE_SSH_SERVER);\n    /* Prevent parsing configuration files that can introduce different\n     * algorithms then we want to test */\n    ssh_options_set(s->ssh.session, SSH_OPTIONS_PROCESS_CONFIG, &false_v);\n\n    return 0;\n}\n\nstatic int session_teardown(void **state)\n{\n    struct torture_state *s = *state;\n\n    ssh_disconnect(s->ssh.session);\n    ssh_free(s->ssh.session);\n\n    return 0;\n}\n\nstatic void test_algorithm(ssh_session session,\n                           const char *kex,\n                           const char *cipher,\n                           const char *hmac) {\n    int rc;\n    char data[256];\n    size_t len_to_test[] = {\n        1, 2, 3, 4, 5, 6, 7, 8, 10,\n        12, 15, 16, 20,\n        31, 32, 33,\n        63, 64, 65,\n        100, 127, 128\n    };\n    unsigned int i;\n\n    if (kex != NULL) {\n        rc = ssh_options_set(session, SSH_OPTIONS_KEY_EXCHANGE, kex);\n        assert_ssh_return_code(session, rc);\n    }\n\n    if (cipher != NULL) {\n        rc = ssh_options_set(session, SSH_OPTIONS_CIPHERS_C_S, cipher);\n        assert_ssh_return_code(session, rc);\n        rc = ssh_options_set(session, SSH_OPTIONS_CIPHERS_S_C, cipher);\n        assert_ssh_return_code(session, rc);\n    }\n\n    if (hmac != NULL) {\n        rc = ssh_options_set(session, SSH_OPTIONS_HMAC_C_S, hmac);\n        assert_ssh_return_code(session, rc);\n        rc = ssh_options_set(session, SSH_OPTIONS_HMAC_S_C, hmac);\n        assert_ssh_return_code(session, rc);\n    }\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n\n    /* send ignore packets of all sizes */\n    memset(data, 0, sizeof(data));\n    for (i = 0; i < (sizeof(len_to_test) / sizeof(size_t)); i++) {\n        memset(data, 'A', len_to_test[i]);\n        ssh_send_ignore(session, data);\n        ssh_handle_packets(session, 50);\n    }\n\n    rc = ssh_userauth_none(session, NULL);\n    if (rc != SSH_OK) {\n        rc = ssh_get_error_code(session);\n        assert_int_equal(rc, SSH_REQUEST_DENIED);\n    }\n\n    ssh_disconnect(session);\n}\n\nstatic void torture_algorithms_aes128_cbc_hmac_sha1(void **state) {\n    struct torture_state *s = *state;\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes128-cbc\", \"hmac-sha1\");\n}\n\nstatic void torture_algorithms_aes128_cbc_hmac_sha2_256(void **state) {\n    struct torture_state *s = *state;\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes128-cbc\", \"hmac-sha2-256\");\n}\n\nstatic void torture_algorithms_aes128_cbc_hmac_sha2_512(void **state) {\n    struct torture_state *s = *state;\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes128-cbc\", \"hmac-sha2-512\");\n}\n\nstatic void torture_algorithms_aes128_cbc_hmac_sha1_etm(void **state) {\n    struct torture_state *s = *state;\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes128-cbc\", \"hmac-sha1-etm@openssh.com\");\n}\n\nstatic void torture_algorithms_aes128_cbc_hmac_sha2_256_etm(void **state) {\n    struct torture_state *s = *state;\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes128-cbc\", \"hmac-sha2-256-etm@openssh.com\");\n}\n\nstatic void torture_algorithms_aes128_cbc_hmac_sha2_512_etm(void **state) {\n    struct torture_state *s = *state;\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes128-cbc\", \"hmac-sha2-512-etm@openssh.com\");\n}\n\nstatic void torture_algorithms_aes192_cbc_hmac_sha1(void **state) {\n    struct torture_state *s = *state;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes192-cbc\", \"hmac-sha1\");\n}\n\nstatic void torture_algorithms_aes192_cbc_hmac_sha2_256(void **state) {\n    struct torture_state *s = *state;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes192-cbc\", \"hmac-sha2-256\");\n}\n\nstatic void torture_algorithms_aes192_cbc_hmac_sha2_512(void **state) {\n    struct torture_state *s = *state;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes192-cbc\", \"hmac-sha2-512\");\n}\n\nstatic void torture_algorithms_aes192_cbc_hmac_sha1_etm(void **state) {\n    struct torture_state *s = *state;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes192-cbc\", \"hmac-sha1-etm@openssh.com\");\n}\n\nstatic void torture_algorithms_aes192_cbc_hmac_sha2_256_etm(void **state) {\n    struct torture_state *s = *state;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes192-cbc\", \"hmac-sha2-256-etm@openssh.com\");\n}\n\nstatic void torture_algorithms_aes192_cbc_hmac_sha2_512_etm(void **state) {\n    struct torture_state *s = *state;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes192-cbc\", \"hmac-sha2-512-etm@openssh.com\");\n}\n\nstatic void torture_algorithms_aes256_cbc_hmac_sha1(void **state) {\n    struct torture_state *s = *state;\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes256-cbc\", \"hmac-sha1\");\n}\n\nstatic void torture_algorithms_aes256_cbc_hmac_sha2_256(void **state) {\n    struct torture_state *s = *state;\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes256-cbc\", \"hmac-sha2-256\");\n}\n\nstatic void torture_algorithms_aes256_cbc_hmac_sha2_512(void **state) {\n    struct torture_state *s = *state;\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes256-cbc\", \"hmac-sha2-512\");\n}\n\nstatic void torture_algorithms_aes256_cbc_hmac_sha1_etm(void **state) {\n    struct torture_state *s = *state;\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes256-cbc\", \"hmac-sha1-etm@openssh.com\");\n}\n\nstatic void torture_algorithms_aes256_cbc_hmac_sha2_256_etm(void **state) {\n    struct torture_state *s = *state;\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes256-cbc\", \"hmac-sha2-256-etm@openssh.com\");\n}\n\nstatic void torture_algorithms_aes256_cbc_hmac_sha2_512_etm(void **state) {\n    struct torture_state *s = *state;\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes256-cbc\", \"hmac-sha2-512-etm@openssh.com\");\n}\n\nstatic void torture_algorithms_aes128_ctr_hmac_sha1(void **state) {\n    struct torture_state *s = *state;\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes128-ctr\", \"hmac-sha1\");\n}\n\nstatic void torture_algorithms_aes128_ctr_hmac_sha2_256(void **state) {\n    struct torture_state *s = *state;\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes128-ctr\", \"hmac-sha2-256\");\n}\n\nstatic void torture_algorithms_aes128_ctr_hmac_sha2_512(void **state) {\n    struct torture_state *s = *state;\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes128-ctr\", \"hmac-sha2-512\");\n}\n\nstatic void torture_algorithms_aes128_ctr_hmac_sha1_etm(void **state) {\n    struct torture_state *s = *state;\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes128-ctr\", \"hmac-sha1-etm@openssh.com\");\n}\n\nstatic void torture_algorithms_aes128_ctr_hmac_sha2_256_etm(void **state) {\n    struct torture_state *s = *state;\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes128-ctr\", \"hmac-sha2-256-etm@openssh.com\");\n}\n\nstatic void torture_algorithms_aes128_ctr_hmac_sha2_512_etm(void **state) {\n    struct torture_state *s = *state;\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes128-ctr\", \"hmac-sha2-512-etm@openssh.com\");\n}\n\nstatic void torture_algorithms_aes192_ctr_hmac_sha1(void **state) {\n    struct torture_state *s = *state;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes192-ctr\", \"hmac-sha1\");\n}\n\nstatic void torture_algorithms_aes192_ctr_hmac_sha2_256(void **state) {\n    struct torture_state *s = *state;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes192-ctr\", \"hmac-sha2-256\");\n}\n\nstatic void torture_algorithms_aes192_ctr_hmac_sha2_512(void **state) {\n    struct torture_state *s = *state;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes192-ctr\", \"hmac-sha2-512\");\n}\n\nstatic void torture_algorithms_aes192_ctr_hmac_sha1_etm(void **state) {\n    struct torture_state *s = *state;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes192-ctr\", \"hmac-sha1-etm@openssh.com\");\n}\n\nstatic void torture_algorithms_aes192_ctr_hmac_sha2_256_etm(void **state) {\n    struct torture_state *s = *state;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes192-ctr\", \"hmac-sha2-256-etm@openssh.com\");\n}\n\nstatic void torture_algorithms_aes192_ctr_hmac_sha2_512_etm(void **state) {\n    struct torture_state *s = *state;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes192-ctr\", \"hmac-sha2-512-etm@openssh.com\");\n}\n\nstatic void torture_algorithms_aes256_ctr_hmac_sha1(void **state) {\n    struct torture_state *s = *state;\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes256-ctr\", \"hmac-sha1\");\n}\n\nstatic void torture_algorithms_aes256_ctr_hmac_sha2_256(void **state) {\n    struct torture_state *s = *state;\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes256-ctr\", \"hmac-sha2-256\");\n}\n\nstatic void torture_algorithms_aes256_ctr_hmac_sha2_512(void **state) {\n    struct torture_state *s = *state;\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes256-ctr\", \"hmac-sha2-512\");\n}\n\nstatic void torture_algorithms_aes256_ctr_hmac_sha1_etm(void **state) {\n    struct torture_state *s = *state;\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes256-ctr\", \"hmac-sha1-etm@openssh.com\");\n}\n\nstatic void torture_algorithms_aes256_ctr_hmac_sha2_256_etm(void **state) {\n    struct torture_state *s = *state;\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes256-ctr\", \"hmac-sha2-256-etm@openssh.com\");\n}\n\nstatic void torture_algorithms_aes256_ctr_hmac_sha2_512_etm(void **state) {\n    struct torture_state *s = *state;\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes256-ctr\", \"hmac-sha2-512-etm@openssh.com\");\n}\n\nstatic void torture_algorithms_aes128_gcm(void **state)\n{\n    struct torture_state *s = *state;\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes128-gcm@openssh.com\", NULL);\n}\n\nstatic void torture_algorithms_aes256_gcm(void **state)\n{\n    struct torture_state *s = *state;\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"aes256-gcm@openssh.com\", NULL);\n}\n\nstatic void torture_algorithms_3des_cbc_hmac_sha1(void **state) {\n    struct torture_state *s = *state;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"3des-cbc\", \"hmac-sha1\");\n}\n\nstatic void torture_algorithms_3des_cbc_hmac_sha2_256(void **state) {\n    struct torture_state *s = *state;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"3des-cbc\", \"hmac-sha2-256\");\n}\n\nstatic void torture_algorithms_3des_cbc_hmac_sha2_512(void **state) {\n    struct torture_state *s = *state;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"3des-cbc\", \"hmac-sha2-512\");\n}\n\nstatic void torture_algorithms_3des_cbc_hmac_sha1_etm(void **state) {\n    struct torture_state *s = *state;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"3des-cbc\", \"hmac-sha1-etm@openssh.com\");\n}\n\nstatic void torture_algorithms_3des_cbc_hmac_sha2_256_etm(void **state) {\n    struct torture_state *s = *state;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"3des-cbc\", \"hmac-sha2-256-etm@openssh.com\");\n}\n\nstatic void torture_algorithms_3des_cbc_hmac_sha2_512_etm(void **state) {\n    struct torture_state *s = *state;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"3des-cbc\", \"hmac-sha2-512-etm@openssh.com\");\n}\n\n#if defined(WITH_BLOWFISH_CIPHER) && defined(OPENSSH_BLOWFISH_CBC)\nstatic void torture_algorithms_blowfish_cbc_hmac_sha1(void **state) {\n    struct torture_state *s = *state;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"blowfish-cbc\", \"hmac-sha1\");\n}\n\nstatic void torture_algorithms_blowfish_cbc_hmac_sha2_256(void **state) {\n    struct torture_state *s = *state;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"blowfish-cbc\", \"hmac-sha2-256\");\n}\n\nstatic void torture_algorithms_blowfish_cbc_hmac_sha2_512(void **state) {\n    struct torture_state *s = *state;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"blowfish-cbc\", \"hmac-sha2-512\");\n}\n\nstatic void torture_algorithms_blowfish_cbc_hmac_sha1_etm(void **state) {\n    struct torture_state *s = *state;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"blowfish-cbc\", \"hmac-sha1-etm@openssh.com\");\n}\n\nstatic void torture_algorithms_blowfish_cbc_hmac_sha2_256_etm(void **state) {\n    struct torture_state *s = *state;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"blowfish-cbc\", \"hmac-sha2-256-etm@openssh.com\");\n}\n\nstatic void torture_algorithms_blowfish_cbc_hmac_sha2_512_etm(void **state) {\n    struct torture_state *s = *state;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    test_algorithm(s->ssh.session, NULL/*kex*/, \"blowfish-cbc\", \"hmac-sha2-512-etm@openssh.com\");\n}\n#endif /* WITH_BLOWFISH_CIPHER */\n\n#ifdef OPENSSH_CHACHA20_POLY1305_OPENSSH_COM\nstatic void torture_algorithms_chacha20_poly1305(void **state)\n{\n    struct torture_state *s = *state;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    test_algorithm(s->ssh.session,\n                   NULL, /*kex*/\n                   \"chacha20-poly1305@openssh.com\",\n                   NULL);\n}\n#endif /* OPENSSH_CHACHA20_POLY1305_OPENSSH_COM */\n\nstatic void torture_algorithms_zlib(void **state) {\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    int rc;\n\n    rc = ssh_options_set(session, SSH_OPTIONS_COMPRESSION_C_S, \"zlib\");\n#ifdef WITH_ZLIB\n    assert_int_equal(rc, SSH_OK);\n#else\n    assert_int_equal(rc, SSH_ERROR);\n#endif\n\n    rc = ssh_options_set(session, SSH_OPTIONS_COMPRESSION_S_C, \"zlib\");\n#ifdef WITH_ZLIB\n    assert_int_equal(rc, SSH_OK);\n#else\n    assert_int_equal(rc, SSH_ERROR);\n#endif\n\n    rc = ssh_connect(session);\n#ifdef WITH_ZLIB\n    if (ssh_get_openssh_version(session)) {\n        assert_false(rc == SSH_OK);\n        ssh_disconnect(session);\n        return;\n    }\n#endif\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_userauth_none(session, NULL);\n    if (rc != SSH_OK) {\n        rc = ssh_get_error_code(session);\n        assert_int_equal(rc, SSH_REQUEST_DENIED);\n    }\n\n    ssh_disconnect(session);\n}\n\nstatic void torture_algorithms_zlib_openssh(void **state) {\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    int rc;\n\n    rc = ssh_options_set(session, SSH_OPTIONS_COMPRESSION_C_S, \"zlib@openssh.com\");\n#ifdef WITH_ZLIB\n    assert_int_equal(rc, SSH_OK);\n#else\n    assert_int_equal(rc, SSH_ERROR);\n#endif\n\n    rc = ssh_options_set(session, SSH_OPTIONS_COMPRESSION_S_C, \"zlib@openssh.com\");\n#ifdef WITH_ZLIB\n    assert_int_equal(rc, SSH_OK);\n#else\n    assert_int_equal(rc, SSH_ERROR);\n#endif\n\n    rc = ssh_connect(session);\n#ifdef WITH_ZLIB\n    if (ssh_get_openssh_version(session)) {\n        assert_true(rc==SSH_OK);\n        rc = ssh_userauth_none(session, NULL);\n        if (rc != SSH_OK) {\n            rc = ssh_get_error_code(session);\n            assert_int_equal(rc, SSH_REQUEST_DENIED);\n        }\n        ssh_disconnect(session);\n        return;\n    }\n    assert_false(rc == SSH_OK);\n#else\n    assert_int_equal(rc, SSH_OK);\n#endif\n\n    ssh_disconnect(session);\n}\n\n#if defined(HAVE_ECC)\nstatic void torture_algorithms_ecdh_sha2_nistp256(void **state) {\n    struct torture_state *s = *state;\n\n    test_algorithm(s->ssh.session, \"ecdh-sha2-nistp256\", NULL/*cipher*/, NULL/*hmac*/);\n}\n\nstatic void torture_algorithms_ecdh_sha2_nistp384(void **state) {\n    struct torture_state *s = *state;\n\n    test_algorithm(s->ssh.session, \"ecdh-sha2-nistp384\", NULL/*cipher*/, NULL/*hmac*/);\n}\n\nstatic void torture_algorithms_ecdh_sha2_nistp521(void **state) {\n    struct torture_state *s = *state;\n\n    test_algorithm(s->ssh.session, \"ecdh-sha2-nistp521\", NULL/*cipher*/, NULL/*hmac*/);\n}\n#endif\n\n#ifdef OPENSSH_CURVE25519_SHA256\nstatic void torture_algorithms_ecdh_curve25519_sha256(void **state) {\n    struct torture_state *s = *state;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    test_algorithm(s->ssh.session, \"curve25519-sha256\", NULL/*cipher*/, NULL/*hmac*/);\n}\n#endif /* OPENSSH_CURVE25519_SHA256 */\n\n#ifdef OPENSSH_CURVE25519_SHA256_LIBSSH_ORG\nstatic void torture_algorithms_ecdh_curve25519_sha256_libssh_org(void **state) {\n    struct torture_state *s = *state;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    test_algorithm(s->ssh.session, \"curve25519-sha256@libssh.org\", NULL/*cipher*/, NULL/*hmac*/);\n}\n#endif /* OPENSSH_CURVE25519_SHA256_LIBSSH_ORG */\n\nstatic void torture_algorithms_dh_group1(void **state) {\n    struct torture_state *s = *state;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    test_algorithm(s->ssh.session, \"diffie-hellman-group1-sha1\", NULL/*cipher*/, NULL/*hmac*/);\n}\n\nstatic void torture_algorithms_dh_group14(void **state) {\n    struct torture_state *s = *state;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    test_algorithm(s->ssh.session, \"diffie-hellman-group14-sha1\", NULL/*cipher*/, NULL/*hmac*/);\n}\n\nstatic void torture_algorithms_dh_group14_sha256(void **state) {\n    struct torture_state *s = *state;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    test_algorithm(s->ssh.session, \"diffie-hellman-group14-sha256\", NULL/*cipher*/, NULL/*hmac*/);\n}\n\nstatic void torture_algorithms_dh_group16(void **state) {\n    struct torture_state *s = *state;\n\n    test_algorithm(s->ssh.session, \"diffie-hellman-group16-sha512\", NULL/*cipher*/, NULL/*hmac*/);\n}\n\nstatic void torture_algorithms_dh_group18(void **state) {\n    struct torture_state *s = *state;\n\n    test_algorithm(s->ssh.session, \"diffie-hellman-group18-sha512\", NULL/*cipher*/, NULL/*hmac*/);\n}\n\n#ifdef WITH_GEX\nstatic void torture_algorithms_dh_gex_sha1(void **state)\n{\n    struct torture_state *s = *state;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    test_algorithm(s->ssh.session,\n                   \"diffie-hellman-group-exchange-sha1\",\n                   NULL,  /* cipher */\n                   NULL); /* hmac */\n}\n\nstatic void torture_algorithms_dh_gex_sha256(void **state)\n{\n    struct torture_state *s = *state;\n\n    test_algorithm(s->ssh.session,\n                   \"diffie-hellman-group-exchange-sha256\",\n                   NULL, /* cipher */\n                   NULL); /* hmac */\n}\n#endif /* WITH_GEX */\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes128_cbc_hmac_sha1,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes128_cbc_hmac_sha2_256,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes128_cbc_hmac_sha2_512,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes128_cbc_hmac_sha1_etm,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes128_cbc_hmac_sha2_256_etm,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes128_cbc_hmac_sha2_512_etm,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes192_cbc_hmac_sha1,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes192_cbc_hmac_sha2_256,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes192_cbc_hmac_sha2_512,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes192_cbc_hmac_sha1_etm,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes192_cbc_hmac_sha2_256_etm,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes192_cbc_hmac_sha2_512_etm,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes256_cbc_hmac_sha1,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes256_cbc_hmac_sha2_256,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes256_cbc_hmac_sha2_512,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes256_cbc_hmac_sha1_etm,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes256_cbc_hmac_sha2_256_etm,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes256_cbc_hmac_sha2_512_etm,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes128_ctr_hmac_sha1,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes128_ctr_hmac_sha2_256,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes128_ctr_hmac_sha2_512,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes128_ctr_hmac_sha1_etm,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes128_ctr_hmac_sha2_256_etm,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes128_ctr_hmac_sha2_512_etm,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes192_ctr_hmac_sha1,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes192_ctr_hmac_sha2_256,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes192_ctr_hmac_sha2_512,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes192_ctr_hmac_sha1_etm,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes192_ctr_hmac_sha2_256_etm,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes192_ctr_hmac_sha2_512_etm,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes256_ctr_hmac_sha1,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes256_ctr_hmac_sha2_256,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes256_ctr_hmac_sha2_512,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes256_ctr_hmac_sha1_etm,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes256_ctr_hmac_sha2_256_etm,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes256_ctr_hmac_sha2_512_etm,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes128_gcm,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_aes256_gcm,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_3des_cbc_hmac_sha1,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_3des_cbc_hmac_sha2_256,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_3des_cbc_hmac_sha2_512,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_3des_cbc_hmac_sha1_etm,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_3des_cbc_hmac_sha2_256_etm,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_3des_cbc_hmac_sha2_512_etm,\n                                        session_setup,\n                                        session_teardown),\n#if defined(WITH_BLOWFISH_CIPHER) && defined(OPENSSH_BLOWFISH_CBC)\n        cmocka_unit_test_setup_teardown(torture_algorithms_blowfish_cbc_hmac_sha1,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_blowfish_cbc_hmac_sha2_256,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_blowfish_cbc_hmac_sha2_512,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_blowfish_cbc_hmac_sha1_etm,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_blowfish_cbc_hmac_sha2_256_etm,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_blowfish_cbc_hmac_sha2_512_etm,\n                                        session_setup,\n                                        session_teardown),\n#endif /* WITH_BLOWFISH_CIPHER */\n#ifdef OPENSSH_CHACHA20_POLY1305_OPENSSH_COM\n        cmocka_unit_test_setup_teardown(torture_algorithms_chacha20_poly1305,\n                                        session_setup,\n                                        session_teardown),\n#endif /* OPENSSH_CHACHA20_POLY1305_OPENSSH_COM */\n        cmocka_unit_test_setup_teardown(torture_algorithms_zlib,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_zlib_openssh,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_dh_group1,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_dh_group14,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_dh_group14_sha256,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_dh_group16,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_dh_group18,\n                                        session_setup,\n                                        session_teardown),\n#ifdef WITH_GEX\n        cmocka_unit_test_setup_teardown(torture_algorithms_dh_gex_sha1,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_dh_gex_sha256,\n                                        session_setup,\n                                        session_teardown),\n#endif /* WITH_GEX */\n#ifdef OPENSSH_CURVE25519_SHA256\n        cmocka_unit_test_setup_teardown(torture_algorithms_ecdh_curve25519_sha256,\n                                        session_setup,\n                                        session_teardown),\n#endif /* OPENSSH_CURVE25519_SHA256 */\n#ifdef OPENSSH_CURVE25519_SHA256_LIBSSH_ORG\n        cmocka_unit_test_setup_teardown(torture_algorithms_ecdh_curve25519_sha256_libssh_org,\n                                        session_setup,\n                                        session_teardown),\n#endif /* OPENSSH_CURVE25519_SHA256_LIBSSH_ORG */\n#if defined(HAVE_ECC)\n        cmocka_unit_test_setup_teardown(torture_algorithms_ecdh_sha2_nistp256,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_ecdh_sha2_nistp384,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_algorithms_ecdh_sha2_nistp521,\n                                        session_setup,\n                                        session_teardown),\n#endif\n    };\n\n    ssh_init();\n\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, sshd_setup, sshd_teardown);\n\n    ssh_finalize();\n\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/client/torture_auth.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2010 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include \"torture.h\"\n#include \"libssh/libssh.h\"\n#include \"libssh/priv.h\"\n#include \"libssh/session.h\"\n\n#include <errno.h>\n#include <sys/types.h>\n#include <pwd.h>\n\n/* agent_is_running */\n#include \"agent.c\"\n\nstatic int sshd_setup(void **state)\n{\n    torture_setup_sshd_server(state, true);\n\n    return 0;\n}\n\nstatic int sshd_teardown(void **state) {\n    torture_teardown_sshd_server(state);\n\n    return 0;\n}\n\nstatic int session_setup(void **state)\n{\n    struct torture_state *s = *state;\n    int verbosity = torture_libssh_verbosity();\n    const char *all_keytypes = NULL;\n    struct passwd *pwd;\n    bool b = false;\n    int rc;\n\n    pwd = getpwnam(\"bob\");\n    assert_non_null(pwd);\n\n    rc = setuid(pwd->pw_uid);\n    assert_return_code(rc, errno);\n\n    s->ssh.session = ssh_new();\n    assert_non_null(s->ssh.session);\n\n    ssh_options_set(s->ssh.session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity);\n    ssh_options_set(s->ssh.session, SSH_OPTIONS_HOST, TORTURE_SSH_SERVER);\n    /* Make sure no other configuration options from system will get used */\n    rc = ssh_options_set(s->ssh.session, SSH_OPTIONS_PROCESS_CONFIG, &b);\n    assert_ssh_return_code(s->ssh.session, rc);\n\n    /* Enable all hostkeys */\n    all_keytypes = ssh_kex_get_supported_method(SSH_HOSTKEYS);\n    rc = ssh_options_set(s->ssh.session, SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES, all_keytypes);\n    assert_ssh_return_code(s->ssh.session, rc);\n\n    return 0;\n}\n\nstatic int session_teardown(void **state)\n{\n    struct torture_state *s = *state;\n\n    ssh_disconnect(s->ssh.session);\n    ssh_free(s->ssh.session);\n\n    return 0;\n}\n\nstatic int pubkey_setup(void **state)\n{\n    int rc;\n\n    rc = session_setup(state);\n    if (rc != 0) {\n        return rc;\n    }\n\n    /* Make sure we do not interfere with another ssh-agent */\n    unsetenv(\"SSH_AUTH_SOCK\");\n    unsetenv(\"SSH_AGENT_PID\");\n\n    return 0;\n}\n\nstatic int agent_setup(void **state)\n{\n    struct torture_state *s = *state;\n    char ssh_agent_cmd[4096];\n    char ssh_agent_sock[1024];\n    char ssh_agent_pidfile[1024];\n    char bob_ssh_key[1024];\n    struct passwd *pwd;\n    int rc;\n\n    rc = pubkey_setup(state);\n    if (rc != 0) {\n        return rc;\n    }\n\n    pwd = getpwnam(\"bob\");\n    assert_non_null(pwd);\n\n    snprintf(ssh_agent_sock,\n             sizeof(ssh_agent_sock),\n             \"%s/agent.sock\",\n             s->socket_dir);\n\n    snprintf(ssh_agent_pidfile,\n             sizeof(ssh_agent_pidfile),\n             \"%s/agent.pid\",\n             s->socket_dir);\n\n    /* Production ready code!!! */\n    snprintf(ssh_agent_cmd,\n             sizeof(ssh_agent_cmd),\n             \"eval `ssh-agent -a %s`; echo $SSH_AGENT_PID > %s\",\n             ssh_agent_sock, ssh_agent_pidfile);\n\n    /* run ssh-agent and ssh-add as the normal user */\n    unsetenv(\"UID_WRAPPER_ROOT\");\n\n    rc = system(ssh_agent_cmd);\n    assert_return_code(rc, errno);\n\n    setenv(\"SSH_AUTH_SOCK\", ssh_agent_sock, 1);\n    setenv(\"TORTURE_SSH_AGENT_PIDFILE\", ssh_agent_pidfile, 1);\n\n    snprintf(bob_ssh_key,\n             sizeof(bob_ssh_key),\n             \"ssh-add %s/.ssh/id_rsa\",\n             pwd->pw_dir);\n\n    rc = system(bob_ssh_key);\n    assert_return_code(rc, errno);\n\n    return 0;\n}\n\nstatic int agent_cert_setup(void **state)\n{\n    char bob_alt_ssh_key[1024];\n    struct passwd *pwd;\n    int rc;\n\n    rc = agent_setup(state);\n    if (rc != 0) {\n        return rc;\n    }\n\n    pwd = getpwnam(\"bob\");\n    assert_non_null(pwd);\n\n    /* remove all keys, load alternative key + cert */\n    snprintf(bob_alt_ssh_key,\n             sizeof(bob_alt_ssh_key),\n             \"ssh-add -D && ssh-add %s/.ssh_cert/id_rsa\",\n             pwd->pw_dir);\n\n    rc = system(bob_alt_ssh_key);\n    assert_return_code(rc, errno);\n\n    return 0;\n}\n\nstatic int agent_teardown(void **state)\n{\n    const char *ssh_agent_pidfile;\n    int rc;\n\n    rc = session_teardown(state);\n    if (rc != 0) {\n        return rc;\n    }\n\n    ssh_agent_pidfile = getenv(\"TORTURE_SSH_AGENT_PIDFILE\");\n    assert_non_null(ssh_agent_pidfile);\n\n    /* kill agent pid */\n    torture_terminate_process(ssh_agent_pidfile);\n\n    unlink(ssh_agent_pidfile);\n\n    unsetenv(\"TORTURE_SSH_AGENT_PIDFILE\");\n    unsetenv(\"SSH_AUTH_SOCK\");\n\n    return 0;\n}\n\nstatic void torture_auth_none(void **state) {\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    int rc;\n\n    rc = ssh_options_set(session, SSH_OPTIONS_USER, TORTURE_SSH_USER_BOB);\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_connect(session);\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_userauth_none(session,NULL);\n    assert_int_equal(rc, SSH_AUTH_DENIED);\n\n    /* This request should return a SSH_REQUEST_DENIED error */\n    if (rc == SSH_ERROR) {\n        assert_int_equal(ssh_get_error_code(session), SSH_REQUEST_DENIED);\n    }\n}\n\nstatic void torture_auth_none_nonblocking(void **state) {\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    int rc;\n\n    rc = ssh_options_set(session, SSH_OPTIONS_USER, TORTURE_SSH_USER_ALICE);\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_connect(session);\n    assert_int_equal(rc, SSH_OK);\n\n    /* This request should return a SSH_REQUEST_DENIED error */\n    if (rc == SSH_ERROR) {\n        assert_int_equal(ssh_get_error_code(session), SSH_REQUEST_DENIED);\n    }\n\n    ssh_set_blocking(session,0);\n\n    do {\n        rc = ssh_userauth_none(session,NULL);\n    } while (rc == SSH_AUTH_AGAIN);\n    assert_int_equal(rc, SSH_AUTH_DENIED);\n    assert_int_equal(ssh_get_error_code(session), SSH_REQUEST_DENIED);\n\n}\n\nstatic void torture_auth_autopubkey(void **state) {\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    int rc;\n\n    /* Authenticate as alice with bob his pubkey */\n    rc = ssh_options_set(session, SSH_OPTIONS_USER, TORTURE_SSH_USER_ALICE);\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_connect(session);\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_userauth_none(session,NULL);\n    /* This request should return a SSH_REQUEST_DENIED error */\n    if (rc == SSH_ERROR) {\n        assert_int_equal(ssh_get_error_code(session), SSH_REQUEST_DENIED);\n    }\n    rc = ssh_userauth_list(session, NULL);\n    assert_true(rc & SSH_AUTH_METHOD_PUBLICKEY);\n\n    rc = ssh_userauth_publickey_auto(session, NULL, NULL);\n    assert_int_equal(rc, SSH_AUTH_SUCCESS);\n}\n\nstatic void torture_auth_autopubkey_nonblocking(void **state) {\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    int rc;\n\n    rc = ssh_options_set(session, SSH_OPTIONS_USER, TORTURE_SSH_USER_ALICE);\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_connect(session);\n    assert_int_equal(rc, SSH_OK);\n\n    ssh_set_blocking(session,0);\n    do {\n      rc = ssh_userauth_none(session, NULL);\n    } while (rc == SSH_AUTH_AGAIN);\n\n    /* This request should return a SSH_REQUEST_DENIED error */\n    if (rc == SSH_ERROR) {\n        assert_int_equal(ssh_get_error_code(session), SSH_REQUEST_DENIED);\n    }\n\n    rc = ssh_userauth_list(session, NULL);\n    assert_true(rc & SSH_AUTH_METHOD_PUBLICKEY);\n\n    do {\n        rc = ssh_userauth_publickey_auto(session, NULL, NULL);\n    } while (rc == SSH_AUTH_AGAIN);\n    assert_int_equal(rc, SSH_AUTH_SUCCESS);\n}\n\nstatic void torture_auth_kbdint(void **state) {\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    int rc;\n\n    rc = ssh_options_set(session, SSH_OPTIONS_USER, TORTURE_SSH_USER_BOB);\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_connect(session);\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_userauth_none(session,NULL);\n    /* This request should return a SSH_REQUEST_DENIED error */\n    if (rc == SSH_ERROR) {\n        assert_int_equal(ssh_get_error_code(session), SSH_REQUEST_DENIED);\n    }\n    rc = ssh_userauth_list(session, NULL);\n    assert_true(rc & SSH_AUTH_METHOD_INTERACTIVE);\n\n    rc = ssh_userauth_kbdint(session, NULL, NULL);\n    assert_int_equal(rc, SSH_AUTH_INFO);\n    assert_int_equal(ssh_userauth_kbdint_getnprompts(session), 1);\n\n    rc = ssh_userauth_kbdint_setanswer(session, 0, TORTURE_SSH_USER_BOB_PASSWORD);\n    assert_false(rc < 0);\n\n    rc = ssh_userauth_kbdint(session, NULL, NULL);\n    /* Sometimes, SSH server send an empty query at the end of exchange */\n    if(rc == SSH_AUTH_INFO) {\n        assert_int_equal(ssh_userauth_kbdint_getnprompts(session), 0);\n        rc = ssh_userauth_kbdint(session, NULL, NULL);\n    }\n    assert_int_equal(rc, SSH_AUTH_SUCCESS);\n}\n\nstatic void torture_auth_kbdint_nonblocking(void **state) {\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    int rc;\n\n    rc = ssh_options_set(session, SSH_OPTIONS_USER, TORTURE_SSH_USER_BOB);\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_connect(session);\n    assert_int_equal(rc, SSH_OK);\n\n    ssh_set_blocking(session,0);\n    do {\n      rc = ssh_userauth_none(session, NULL);\n    } while (rc == SSH_AUTH_AGAIN);\n\n    /* This request should return a SSH_REQUEST_DENIED error */\n    if (rc == SSH_ERROR) {\n        assert_int_equal(ssh_get_error_code(session), SSH_REQUEST_DENIED);\n    }\n    rc = ssh_userauth_list(session, NULL);\n    assert_true(rc & SSH_AUTH_METHOD_INTERACTIVE);\n\n    do {\n        rc = ssh_userauth_kbdint(session, NULL, NULL);\n    } while (rc == SSH_AUTH_AGAIN);\n    assert_int_equal(rc, SSH_AUTH_INFO);\n    assert_int_equal(ssh_userauth_kbdint_getnprompts(session), 1);\n    rc = ssh_userauth_kbdint_setanswer(session, 0, TORTURE_SSH_USER_BOB_PASSWORD);\n    assert_false(rc < 0);\n\n    do {\n        rc = ssh_userauth_kbdint(session, NULL, NULL);\n    } while (rc == SSH_AUTH_AGAIN);\n    /* Sometimes, SSH server send an empty query at the end of exchange */\n    if(rc == SSH_AUTH_INFO) {\n        assert_int_equal(ssh_userauth_kbdint_getnprompts(session), 0);\n        do {\n            rc = ssh_userauth_kbdint(session, NULL, NULL);\n        } while (rc == SSH_AUTH_AGAIN);\n    }\n    assert_int_equal(rc, SSH_AUTH_SUCCESS);\n}\n\nstatic void torture_auth_password(void **state) {\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    int rc;\n\n    rc = ssh_options_set(session, SSH_OPTIONS_USER, TORTURE_SSH_USER_BOB);\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_connect(session);\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_userauth_none(session, NULL);\n    /* This request should return a SSH_REQUEST_DENIED error */\n    if (rc == SSH_AUTH_ERROR) {\n        assert_int_equal(ssh_get_error_code(session), SSH_REQUEST_DENIED);\n    }\n    rc = ssh_userauth_list(session, NULL);\n    assert_true(rc & SSH_AUTH_METHOD_PASSWORD);\n\n    rc = ssh_userauth_password(session, NULL, TORTURE_SSH_USER_BOB_PASSWORD);\n    assert_int_equal(rc, SSH_AUTH_SUCCESS);\n}\n\nstatic void torture_auth_password_nonblocking(void **state) {\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    int rc;\n\n    rc = ssh_options_set(session, SSH_OPTIONS_USER, TORTURE_SSH_USER_BOB);\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_connect(session);\n    assert_int_equal(rc, SSH_OK);\n\n    ssh_set_blocking(session,0);\n    do {\n      rc = ssh_userauth_none(session, NULL);\n    } while (rc == SSH_AUTH_AGAIN);\n\n    /* This request should return a SSH_REQUEST_DENIED error */\n    if (rc == SSH_AUTH_ERROR) {\n        assert_int_equal(ssh_get_error_code(session), SSH_REQUEST_DENIED);\n    }\n\n    rc = ssh_userauth_list(session, NULL);\n    assert_true(rc & SSH_AUTH_METHOD_PASSWORD);\n\n    do {\n      rc = ssh_userauth_password(session, NULL, TORTURE_SSH_USER_BOB_PASSWORD);\n    } while(rc==SSH_AUTH_AGAIN);\n\n    assert_int_equal(rc, SSH_AUTH_SUCCESS);\n}\n\nstatic void torture_auth_agent(void **state) {\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    int rc;\n\n    if (!ssh_agent_is_running(session)){\n        print_message(\"*** Agent not running. Test ignored\\n\");\n        return;\n    }\n    rc = ssh_options_set(session, SSH_OPTIONS_USER, TORTURE_SSH_USER_ALICE);\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_connect(session);\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_userauth_none(session,NULL);\n    /* This request should return a SSH_REQUEST_DENIED error */\n    if (rc == SSH_ERROR) {\n        assert_int_equal(ssh_get_error_code(session), SSH_REQUEST_DENIED);\n    }\n    rc = ssh_userauth_list(session, NULL);\n    assert_true(rc & SSH_AUTH_METHOD_PUBLICKEY);\n\n    rc = ssh_userauth_agent(session, NULL);\n    assert_int_equal(rc, SSH_AUTH_SUCCESS);\n}\n\nstatic void torture_auth_agent_nonblocking(void **state) {\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    int rc;\n\n    if (!ssh_agent_is_running(session)){\n        print_message(\"*** Agent not running. Test ignored\\n\");\n        return;\n    }\n    rc = ssh_options_set(session, SSH_OPTIONS_USER, TORTURE_SSH_USER_ALICE);\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_connect(session);\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_userauth_none(session,NULL);\n    /* This request should return a SSH_REQUEST_DENIED error */\n    if (rc == SSH_ERROR) {\n        assert_int_equal(ssh_get_error_code(session), SSH_REQUEST_DENIED);\n    }\n    rc = ssh_userauth_list(session, NULL);\n    assert_true(rc & SSH_AUTH_METHOD_PUBLICKEY);\n\n    ssh_set_blocking(session,0);\n\n    do {\n      rc = ssh_userauth_agent(session, NULL);\n    } while (rc == SSH_AUTH_AGAIN);\n    assert_int_equal(rc, SSH_AUTH_SUCCESS);\n}\n\nstatic void torture_auth_cert(void **state) {\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    ssh_key privkey = NULL;\n    ssh_key cert = NULL;\n    char bob_ssh_key[1024];\n    char bob_ssh_cert[2048];\n    struct passwd *pwd;\n    int rc;\n\n    pwd = getpwnam(\"bob\");\n    assert_non_null(pwd);\n\n    snprintf(bob_ssh_key,\n             sizeof(bob_ssh_key),\n             \"%s/.ssh_cert/id_rsa\",\n             pwd->pw_dir);\n    snprintf(bob_ssh_cert,\n             sizeof(bob_ssh_cert),\n             \"%s-cert.pub\",\n             bob_ssh_key);\n\n    /* cert has been signed for login as alice */\n    rc = ssh_options_set(session, SSH_OPTIONS_USER, TORTURE_SSH_USER_ALICE);\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_connect(session);\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_pki_import_privkey_file(bob_ssh_key, NULL, NULL, NULL, &privkey);\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_pki_import_cert_file(bob_ssh_cert, &cert);\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_pki_copy_cert_to_privkey(cert, privkey);\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_userauth_try_publickey(session, NULL, cert);\n    assert_int_equal(rc, SSH_AUTH_SUCCESS);\n\n    rc = ssh_userauth_publickey(session, NULL, privkey);\n    assert_int_equal(rc, SSH_AUTH_SUCCESS);\n\n    SSH_KEY_FREE(privkey);\n    SSH_KEY_FREE(cert);\n}\n\nstatic void torture_auth_agent_cert(void **state)\n{\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    int rc;\n\n    /* Skip this test if in FIPS mode.\n     *\n     * OpenSSH agent has a bug which makes it to not use SHA2 in signatures when\n     * using certificates. It always uses SHA1.\n     *\n     * This should be removed as soon as OpenSSH agent bug is fixed.\n     * (see https://gitlab.com/libssh/libssh-mirror/merge_requests/34) */\n    if (ssh_fips_mode()) {\n        skip();\n    } else {\n        /* After the bug is solved, this also should be removed */\n        rc = ssh_options_set(session, SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES,\n                             \"ssh-rsa-cert-v01@openssh.com\");\n        assert_int_equal(rc, SSH_OK);\n    }\n\n    /* Setup loads a different key, tests are exactly the same. */\n    torture_auth_agent(state);\n}\n\nstatic void torture_auth_agent_cert_nonblocking(void **state)\n{\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    int rc;\n\n    /* Skip this test if in FIPS mode.\n     *\n     * OpenSSH agent has a bug which makes it to not use SHA2 in signatures when\n     * using certificates. It always uses SHA1.\n     *\n     * This should be removed as soon as OpenSSH agent bug is fixed.\n     * (see https://gitlab.com/libssh/libssh-mirror/merge_requests/34) */\n    if (ssh_fips_mode()) {\n        skip();\n    } else {\n        /* After the bug is solved, this also should be removed */\n        rc = ssh_options_set(session, SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES,\n                             \"ssh-rsa-cert-v01@openssh.com\");\n        assert_int_equal(rc, SSH_OK);\n    }\n\n    torture_auth_agent_nonblocking(state);\n}\n\nstatic void torture_auth_pubkey_types(void **state)\n{\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    int rc;\n\n    rc = ssh_options_set(session, SSH_OPTIONS_USER, TORTURE_SSH_USER_ALICE);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_userauth_none(session, NULL);\n    /* This request should return a SSH_REQUEST_DENIED error */\n    if (rc == SSH_ERROR) {\n        assert_int_equal(ssh_get_error_code(session), SSH_REQUEST_DENIED);\n    }\n    rc = ssh_userauth_list(session, NULL);\n    assert_true(rc & SSH_AUTH_METHOD_PUBLICKEY);\n\n    /* Disable RSA key types for authentication */\n    rc = ssh_options_set(session, SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES,\n                         \"ecdsa-sha2-nistp384\");\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_userauth_publickey_auto(session, NULL, NULL);\n    assert_int_equal(rc, SSH_AUTH_DENIED);\n\n    /* Now enable it and retry */\n    rc = ssh_options_set(session, SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES,\n                         \"rsa-sha2-512,ssh-rsa\");\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_userauth_publickey_auto(session, NULL, NULL);\n    assert_int_equal(rc, SSH_AUTH_SUCCESS);\n}\n\nstatic void torture_auth_pubkey_types_ecdsa(void **state)\n{\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    int rc;\n\n    rc = ssh_options_set(session, SSH_OPTIONS_USER, TORTURE_SSH_USER_ALICE);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_userauth_none(session, NULL);\n    /* This request should return a SSH_REQUEST_DENIED error */\n    if (rc == SSH_ERROR) {\n        assert_int_equal(ssh_get_error_code(session), SSH_REQUEST_DENIED);\n    }\n    rc = ssh_userauth_list(session, NULL);\n    assert_true(rc & SSH_AUTH_METHOD_PUBLICKEY);\n\n    /* We have only the 256b key -- whitelisting only larger should fail */\n    rc = ssh_options_set(session, SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES,\n                         \"ecdsa-sha2-nistp384\");\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_userauth_publickey_auto(session, NULL, NULL);\n    assert_int_equal(rc, SSH_AUTH_DENIED);\n\n    /* Verify we can use also ECDSA keys with their various names */\n    rc = ssh_options_set(session, SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES,\n                         \"ecdsa-sha2-nistp256\");\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_userauth_publickey_auto(session, NULL, NULL);\n    assert_int_equal(rc, SSH_AUTH_SUCCESS);\n\n}\n\nstatic void torture_auth_pubkey_types_ed25519(void **state)\n{\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    char bob_ssh_key[1024];\n    ssh_key privkey = NULL;\n    struct passwd *pwd;\n    int rc;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    pwd = getpwnam(\"bob\");\n    assert_non_null(pwd);\n\n    snprintf(bob_ssh_key,\n             sizeof(bob_ssh_key),\n             \"%s/.ssh/id_ed25519\",\n             pwd->pw_dir);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_USER, TORTURE_SSH_USER_ALICE);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_userauth_none(session, NULL);\n    /* This request should return a SSH_REQUEST_DENIED error */\n    if (rc == SSH_ERROR) {\n        assert_int_equal(ssh_get_error_code(session), SSH_REQUEST_DENIED);\n    }\n    rc = ssh_userauth_list(session, NULL);\n    assert_true(rc & SSH_AUTH_METHOD_PUBLICKEY);\n\n    /* Import the ED25519 private key */\n    rc = ssh_pki_import_privkey_file(bob_ssh_key, NULL, NULL, NULL, &privkey);\n    assert_int_equal(rc, SSH_OK);\n\n    /* Enable only RSA keys -- authentication should fail */\n    rc = ssh_options_set(session, SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES,\n                         \"ssh-rsa\");\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_userauth_publickey(session, NULL, privkey);\n    assert_int_equal(rc, SSH_AUTH_DENIED);\n\n    /* Verify we can use also ed25519 keys */\n    rc = ssh_options_set(session, SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES,\n                         \"ssh-ed25519\");\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_userauth_publickey(session, NULL, privkey);\n    assert_int_equal(rc, SSH_AUTH_SUCCESS);\n\n    SSH_KEY_FREE(privkey);\n}\n\nstatic void torture_auth_pubkey_types_nonblocking(void **state)\n{\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    int rc;\n\n    rc = ssh_options_set(session, SSH_OPTIONS_USER, TORTURE_SSH_USER_ALICE);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n\n    ssh_set_blocking(session, 0);\n    do {\n      rc = ssh_userauth_none(session, NULL);\n    } while (rc == SSH_AUTH_AGAIN);\n\n    /* This request should return a SSH_REQUEST_DENIED error */\n    if (rc == SSH_ERROR) {\n        assert_int_equal(ssh_get_error_code(session), SSH_REQUEST_DENIED);\n    }\n\n    rc = ssh_userauth_list(session, NULL);\n    assert_true(rc & SSH_AUTH_METHOD_PUBLICKEY);\n\n    /* Disable RSA key types for authentication */\n    rc = ssh_options_set(session, SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES,\n                         \"ecdsa-sha2-nistp521\");\n    assert_ssh_return_code(session, rc);\n\n    do {\n        rc = ssh_userauth_publickey_auto(session, NULL, NULL);\n    } while (rc == SSH_AUTH_AGAIN);\n    assert_int_equal(rc, SSH_AUTH_DENIED);\n\n    /* Now enable it and retry */\n    rc = ssh_options_set(session, SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES,\n                         \"rsa-sha2-512,ssh-rsa\");\n    assert_ssh_return_code(session, rc);\n\n    do {\n        rc = ssh_userauth_publickey_auto(session, NULL, NULL);\n    } while (rc == SSH_AUTH_AGAIN);\n    assert_int_equal(rc, SSH_AUTH_SUCCESS);\n\n}\n\nstatic void torture_auth_pubkey_types_ecdsa_nonblocking(void **state)\n{\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    int rc;\n\n    rc = ssh_options_set(session, SSH_OPTIONS_USER, TORTURE_SSH_USER_ALICE);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n\n    ssh_set_blocking(session, 0);\n    do {\n      rc = ssh_userauth_none(session, NULL);\n    } while (rc == SSH_AUTH_AGAIN);\n\n    /* This request should return a SSH_REQUEST_DENIED error */\n    if (rc == SSH_ERROR) {\n        assert_int_equal(ssh_get_error_code(session), SSH_REQUEST_DENIED);\n    }\n\n    rc = ssh_userauth_list(session, NULL);\n    assert_true(rc & SSH_AUTH_METHOD_PUBLICKEY);\n\n    /* We have only the 256b key -- whitelisting only larger should fail */\n    rc = ssh_options_set(session, SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES,\n                         \"ecdsa-sha2-nistp384\");\n    assert_ssh_return_code(session, rc);\n\n    do {\n        rc = ssh_userauth_publickey_auto(session, NULL, NULL);\n    } while (rc == SSH_AUTH_AGAIN);\n    assert_int_equal(rc, SSH_AUTH_DENIED);\n\n    /* Verify we can use also ECDSA key to authenticate */\n    rc = ssh_options_set(session, SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES,\n                         \"ecdsa-sha2-nistp256\");\n    assert_ssh_return_code(session, rc);\n\n    do {\n        rc = ssh_userauth_publickey_auto(session, NULL, NULL);\n    } while (rc == SSH_AUTH_AGAIN);\n    assert_int_equal(rc, SSH_AUTH_SUCCESS);\n\n}\n\nstatic void torture_auth_pubkey_types_ed25519_nonblocking(void **state)\n{\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    char bob_ssh_key[1024];\n    ssh_key privkey = NULL;\n    struct passwd *pwd;\n    int rc;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    pwd = getpwnam(\"bob\");\n    assert_non_null(pwd);\n\n    snprintf(bob_ssh_key,\n             sizeof(bob_ssh_key),\n             \"%s/.ssh/id_ed25519\",\n             pwd->pw_dir);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_USER, TORTURE_SSH_USER_ALICE);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n\n    ssh_set_blocking(session, 0);\n    do {\n      rc = ssh_userauth_none(session, NULL);\n    } while (rc == SSH_AUTH_AGAIN);\n\n    /* This request should return a SSH_REQUEST_DENIED error */\n    if (rc == SSH_ERROR) {\n        assert_int_equal(ssh_get_error_code(session), SSH_REQUEST_DENIED);\n    }\n\n    rc = ssh_userauth_list(session, NULL);\n    assert_true(rc & SSH_AUTH_METHOD_PUBLICKEY);\n\n    /* Import the ED25519 private key */\n    rc = ssh_pki_import_privkey_file(bob_ssh_key, NULL, NULL, NULL, &privkey);\n    assert_int_equal(rc, SSH_OK);\n\n    /* Enable only RSA keys -- authentication should fail */\n    rc = ssh_options_set(session, SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES,\n                         \"ssh-rsa\");\n    assert_ssh_return_code(session, rc);\n\n    do {\n        rc = ssh_userauth_publickey(session, NULL, privkey);\n    } while (rc == SSH_AUTH_AGAIN);\n    assert_int_equal(rc, SSH_AUTH_DENIED);\n\n    /* Verify we can use also ED25519 key to authenticate */\n    rc = ssh_options_set(session, SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES,\n                         \"ssh-ed25519\");\n    assert_ssh_return_code(session, rc);\n\n    do {\n        rc = ssh_userauth_publickey(session, NULL, privkey);\n    } while (rc == SSH_AUTH_AGAIN);\n    assert_int_equal(rc, SSH_AUTH_SUCCESS);\n\n}\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_auth_none,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_auth_none_nonblocking,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_auth_password,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_auth_password_nonblocking,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_auth_kbdint,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_auth_kbdint_nonblocking,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_auth_autopubkey,\n                                        pubkey_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_auth_autopubkey_nonblocking,\n                                        pubkey_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_auth_agent,\n                                        agent_setup,\n                                        agent_teardown),\n        cmocka_unit_test_setup_teardown(torture_auth_agent_nonblocking,\n                                        agent_setup,\n                                        agent_teardown),\n        cmocka_unit_test_setup_teardown(torture_auth_cert,\n                                        pubkey_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_auth_agent_cert,\n                                        agent_cert_setup,\n                                        agent_teardown),\n        cmocka_unit_test_setup_teardown(torture_auth_agent_cert_nonblocking,\n                                        agent_cert_setup,\n                                        agent_teardown),\n        cmocka_unit_test_setup_teardown(torture_auth_pubkey_types,\n                                        pubkey_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_auth_pubkey_types_nonblocking,\n                                        pubkey_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_auth_pubkey_types_ecdsa,\n                                        pubkey_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_auth_pubkey_types_ecdsa_nonblocking,\n                                        pubkey_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_auth_pubkey_types_ed25519,\n                                        pubkey_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_auth_pubkey_types_ed25519_nonblocking,\n                                        pubkey_setup,\n                                        session_teardown),\n    };\n\n    ssh_init();\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, sshd_setup, sshd_teardown);\n    ssh_finalize();\n\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/client/torture_client_config.c",
    "content": "#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include <pwd.h>\n#include <errno.h>\n#include \"torture.h\"\n#include \"libssh/session.h\"\n#include \"libssh/misc.h\"\n\n#define LIBSSH_SSH_CONFIG \"libssh_config\"\n\n#define TORTURE_CONFIG_USER \"test-user\"\n\n#define CIPHERS \"aes256-gcm@openssh.com,chacha20-poly1305@openssh.com\"\n#define CIPHERS2 \"aes256-cbc,aes128-ctr\"\n\nstatic int sshd_setup(void **state)\n{\n    torture_setup_sshd_server(state, false);\n\n    return 0;\n}\n\nstatic int sshd_teardown(void **state) {\n    torture_teardown_sshd_server(state);\n\n    return 0;\n}\n\nstatic int setup_config_files(void **state)\n{\n    struct torture_state *s = *state;\n    int verbosity;\n    struct passwd *pwd;\n    char *filename = NULL;\n    int rc;\n\n    /* Work under the bob's UID to be able to load his configuration file */\n    pwd = getpwnam(\"bob\");\n    assert_non_null(pwd);\n\n    rc = setuid(pwd->pw_uid);\n    assert_return_code(rc, errno);\n\n    s->ssh.session = ssh_new();\n    assert_non_null(s->ssh.session);\n\n    filename = ssh_path_expand_tilde(\"~/.ssh/config\");\n    torture_write_file(filename, \"Ciphers \"CIPHERS\"\\nTestBogus1\\nUser \"TORTURE_CONFIG_USER);\n    free(filename);\n\n    torture_write_file(LIBSSH_SSH_CONFIG, \"Ciphers \"CIPHERS2\"\\nTestBogus2\\n\");\n\n    verbosity = torture_libssh_verbosity();\n    ssh_options_set(s->ssh.session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity);\n    ssh_options_set(s->ssh.session, SSH_OPTIONS_HOST, TORTURE_SSH_SERVER);\n\n    return 0;\n}\n\nstatic int teardown(void **state)\n{\n    struct torture_state *s = *state;\n    char *filename;\n\n    filename = ssh_path_expand_tilde(\"~/.ssh/config\");\n    if (filename != NULL) {\n        if (strlen(filename) > 0) {\n            unlink(filename);\n        }\n        SAFE_FREE(filename);\n    }\n\n    unlink(LIBSSH_SSH_CONFIG);\n\n    ssh_disconnect(s->ssh.session);\n    ssh_free(s->ssh.session);\n\n    return 0;\n}\n\n/* This tests makes sure that parsing both system-wide and per-user\n * configuration files retains OpenSSH semantics (the per-user overrides\n * the system-wide values).\n * This function ssh_options_parse_config() has hardcoded path to the\n * system-wide configuration file so this might not test anything at all\n * if this system-wide file does not overwrite this option.\n */\nstatic void torture_client_config_system(void **state)\n{\n    struct torture_state *s = *state;\n    int ret = 0;\n\n    char *fips_ciphers = NULL;\n\n    if (ssh_fips_mode()) {\n        fips_ciphers = ssh_keep_fips_algos(SSH_CRYPT_C_S, CIPHERS);\n        assert_non_null(fips_ciphers);\n    }\n\n    /* The first tests assumes there is system-wide configuration file\n     * setting Ciphers to some non-default value. We do not have any control\n     * of that in this test case.\n     */\n    ret = ssh_options_parse_config(s->ssh.session, NULL);\n    assert_ssh_return_code(s->ssh.session, ret);\n\n    assert_non_null(s->ssh.session->opts.wanted_methods[SSH_CRYPT_C_S]);\n    assert_non_null(s->ssh.session->opts.wanted_methods[SSH_CRYPT_S_C]);\n    if (ssh_fips_mode()) {\n        assert_string_equal(s->ssh.session->opts.wanted_methods[SSH_CRYPT_C_S],\n                            fips_ciphers);\n        assert_string_equal(s->ssh.session->opts.wanted_methods[SSH_CRYPT_S_C],\n                            fips_ciphers);\n    } else {\n        assert_string_equal(s->ssh.session->opts.wanted_methods[SSH_CRYPT_C_S],\n                            CIPHERS);\n        assert_string_equal(s->ssh.session->opts.wanted_methods[SSH_CRYPT_S_C],\n                            CIPHERS);\n    }\n\n    /* Make sure the configuration was processed and user modified */\n    assert_string_equal(s->ssh.session->opts.username, TORTURE_CONFIG_USER);\n\n    SAFE_FREE(fips_ciphers);\n}\n\n/* This tests makes sure that parsing both system-wide and per-user\n * configuration files retains OpenSSH semantics (the per-user overrides\n * the system-wide values).\n * The function ssh_options_parse_config() has hardcoded path to the\n * system-wide configuraion file so we try to emmulate the behavior by parsing\n * the files separately in the same order.\n */\nstatic void torture_client_config_emulate(void **state)\n{\n    struct torture_state *s = *state;\n    char *filename = NULL;\n    int ret = 0;\n\n    char *fips_ciphers = NULL;\n\n    if (ssh_fips_mode()) {\n        fips_ciphers = ssh_keep_fips_algos(SSH_CRYPT_C_S, CIPHERS);\n        assert_non_null(fips_ciphers);\n    }\n\n    /* The first tests assumes there is system-wide configuration file\n     * setting Ciphers to some non-default value. We do not have any control\n     * of that in this test case\n     */\n    filename = ssh_path_expand_tilde(\"~/.ssh/config\");\n    ret = ssh_options_parse_config(s->ssh.session, filename);\n    free(filename);\n    assert_ssh_return_code(s->ssh.session, ret);\n\n    ret = ssh_options_parse_config(s->ssh.session, LIBSSH_SSH_CONFIG);\n    assert_ssh_return_code(s->ssh.session, ret);\n\n    assert_non_null(s->ssh.session->opts.wanted_methods[SSH_CRYPT_C_S]);\n    assert_non_null(s->ssh.session->opts.wanted_methods[SSH_CRYPT_S_C]);\n    if (ssh_fips_mode()) {\n        assert_string_equal(s->ssh.session->opts.wanted_methods[SSH_CRYPT_C_S],\n                            fips_ciphers);\n        assert_string_equal(s->ssh.session->opts.wanted_methods[SSH_CRYPT_S_C],\n                            fips_ciphers);\n    } else {\n        assert_string_equal(s->ssh.session->opts.wanted_methods[SSH_CRYPT_C_S],\n                            CIPHERS);\n        assert_string_equal(s->ssh.session->opts.wanted_methods[SSH_CRYPT_S_C],\n                            CIPHERS);\n    }\n    /* Make sure the configuration was processed and user modified */\n    assert_string_equal(s->ssh.session->opts.username, TORTURE_CONFIG_USER);\n\n    SAFE_FREE(fips_ciphers);\n}\n\n/* This verifies that configuration files are parsed by default.\n */\nstatic void torture_client_config_autoparse(void **state)\n{\n    struct torture_state *s = *state;\n    int ret = 0;\n\n    ret = ssh_connect(s->ssh.session);\n    assert_ssh_return_code(s->ssh.session, ret);\n\n    /* Make sure the configuration was processed and user modified */\n    assert_string_equal(s->ssh.session->opts.username, TORTURE_CONFIG_USER);\n}\n\n/* This verifies that we are able to suppress parsing of the configuration files\n * on connect using an option.\n */\nstatic void torture_client_config_suppress(void **state)\n{\n    struct torture_state *s = *state;\n    bool b = false;\n    int ret = 0;\n\n    ret = ssh_options_set(s->ssh.session, SSH_OPTIONS_PROCESS_CONFIG, &b);\n    assert_ssh_return_code(s->ssh.session, ret);\n\n    ret = ssh_connect(s->ssh.session);\n    assert_ssh_return_code(s->ssh.session, ret);\n\n    /* Make sure the configuration was not processed and user modified */\n    assert_string_equal(s->ssh.session->opts.username, \"bob\");\n}\n\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_client_config_system,\n                                        setup_config_files,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_client_config_emulate,\n                                        setup_config_files,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_client_config_autoparse,\n                                        setup_config_files,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_client_config_suppress,\n                                        setup_config_files,\n                                        teardown),\n    };\n\n\n    ssh_init();\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, sshd_setup, sshd_teardown);\n    ssh_finalize();\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/client/torture_client_global_requests.c",
    "content": "/*\n * torture_client_global_requests.c - Tests for client global requests\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2019 by Red Hat, Inc.\n *\n * Author: Anderson Toshiyuki Sasaki <ansasaki@redhat.com>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include \"torture.h\"\n#include \"libssh/libssh.h\"\n#include \"libssh/priv.h\"\n#include \"libssh/session.h\"\n#include \"libssh/channels.h\"\n\n#include <errno.h>\n#include <sys/types.h>\n#include <pwd.h>\n\nstatic int sshd_setup(void **state)\n{\n    torture_setup_sshd_server(state, true);\n\n    return 0;\n}\n\nstatic int sshd_teardown(void **state)\n{\n    torture_teardown_sshd_server(state);\n\n    return 0;\n}\n\nstatic int session_setup(void **state)\n{\n    struct torture_state *s = *state;\n    int verbosity = torture_libssh_verbosity();\n    struct passwd *pwd;\n    bool b = false;\n    int rc;\n\n    pwd = getpwnam(\"bob\");\n    assert_non_null(pwd);\n\n    rc = setuid(pwd->pw_uid);\n    assert_return_code(rc, errno);\n\n    s->ssh.session = ssh_new();\n    assert_non_null(s->ssh.session);\n\n    ssh_options_set(s->ssh.session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity);\n    ssh_options_set(s->ssh.session, SSH_OPTIONS_HOST, TORTURE_SSH_SERVER);\n\n    /* Make sure no other configuration options from system will get used */\n    rc = ssh_options_set(s->ssh.session, SSH_OPTIONS_PROCESS_CONFIG, &b);\n    assert_ssh_return_code(s->ssh.session, rc);\n\n    return 0;\n}\n\nstatic int session_teardown(void **state)\n{\n    struct torture_state *s = *state;\n\n    ssh_disconnect(s->ssh.session);\n    ssh_free(s->ssh.session);\n\n    return 0;\n}\n\nstatic int authenticate(void **state)\n{\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    int rc;\n\n    rc = ssh_options_set(session, SSH_OPTIONS_USER, TORTURE_SSH_USER_BOB);\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_connect(session);\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_userauth_password(session, NULL, TORTURE_SSH_USER_BOB_PASSWORD);\n    assert_int_equal(rc, SSH_AUTH_SUCCESS);\n\n    return rc;\n}\n\nstatic void torture_unknown_request(void **state)\n{\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    ssh_channel channel;\n    int rc;\n\n    rc = authenticate(state);\n    assert_ssh_return_code(session, rc);\n\n    /* Request asking for reply */\n    rc = ssh_global_request(session, \"unknown-request-00@test.com\", NULL, 1);\n    assert_ssh_return_code_equal(session, rc, SSH_ERROR);\n\n    /* Request and don't ask for reply */\n    rc = ssh_global_request(session, \"another-bad-req-00@test.com\", NULL, 0);\n    assert_ssh_return_code(session, rc);\n\n    /* Open channel to make sure the session is still working */\n    channel = ssh_channel_new(session);\n    assert_non_null(channel);\n\n    rc = ssh_channel_open_session(channel);\n    assert_ssh_return_code(session, rc);\n\n    ssh_channel_close(channel);\n}\n\nint torture_run_tests(void)\n{\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_unknown_request,\n                                        session_setup,\n                                        session_teardown),\n    };\n\n    ssh_init();\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, sshd_setup, sshd_teardown);\n    ssh_finalize();\n\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/client/torture_connect.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2010 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include \"torture.h\"\n#include <libssh/libssh.h>\n#ifdef HAVE_SYS_TIME_H\n#include <sys/time.h>\n#endif /* HAVE_SYS_TIME_H */\n#include <arpa/inet.h>\n#include <netinet/in.h>\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <errno.h>\n#include <pwd.h>\n\n/* Should work until Apnic decides to assign it :) */\n#define BLACKHOLE \"1.1.1.1\"\n\nstatic int sshd_setup(void **state)\n{\n    torture_setup_sshd_server(state, false);\n\n    return 0;\n}\n\nstatic int sshd_teardown(void **state) {\n    torture_teardown_sshd_server(state);\n\n    return 0;\n}\n\nstatic int session_setup(void **state)\n{\n    struct torture_state *s = *state;\n    int verbosity = torture_libssh_verbosity();\n    struct passwd *pwd;\n    int rc;\n\n    pwd = getpwnam(\"bob\");\n    assert_non_null(pwd);\n\n    rc = setuid(pwd->pw_uid);\n    assert_return_code(rc, errno);\n\n    s->ssh.session = ssh_new();\n    assert_non_null(s->ssh.session);\n\n    ssh_options_set(s->ssh.session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity);\n    ssh_options_set(s->ssh.session, SSH_OPTIONS_HOST, BLACKHOLE);\n\n    return 0;\n}\n\nstatic int session_teardown(void **state)\n{\n    struct torture_state *s = *state;\n\n    ssh_disconnect(s->ssh.session);\n    ssh_free(s->ssh.session);\n\n    return 0;\n}\n\nstatic void torture_connect_nonblocking(void **state) {\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    int rc;\n\n    rc = ssh_options_set(session, SSH_OPTIONS_HOST, TORTURE_SSH_SERVER);\n    assert_ssh_return_code(session, rc);\n    ssh_set_blocking(session,0);\n\n    do {\n        rc = ssh_connect(session);\n        assert_ssh_return_code_not_equal(session, rc, SSH_ERROR);\n    } while(rc == SSH_AGAIN);\n\n    assert_ssh_return_code(session, rc);\n}\n\n#if 0 /* This does not work with socket_wrapper */\nstatic void torture_connect_timeout(void **state) {\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    struct timeval before, after;\n    int rc;\n    long timeout = 2;\n    time_t sec;\n    suseconds_t usec;\n\n    rc = ssh_options_set(session, SSH_OPTIONS_HOST, BLACKHOLE);\n    assert_true(rc == SSH_OK);\n    rc = ssh_options_set(session, SSH_OPTIONS_TIMEOUT, &timeout);\n    assert_true(rc == SSH_OK);\n\n    rc = gettimeofday(&before, NULL);\n    assert_true(rc == 0);\n    rc = ssh_connect(session);\n    assert_true(rc == SSH_ERROR);\n    rc = gettimeofday(&after, NULL);\n    assert_true(rc == 0);\n    sec = after.tv_sec - before.tv_sec;\n    usec = after.tv_usec - before.tv_usec;\n    /* Borrow a second for the missing usecs, but don't bother calculating */\n    if (usec < 0)\n      sec--;\n    assert_in_range(sec, 1, 3);\n}\n#endif\n\nstatic void torture_connect_double(void **state) {\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n\n    int rc;\n\n    rc = ssh_options_set(session, SSH_OPTIONS_HOST, TORTURE_SSH_SERVER);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n    ssh_disconnect(session);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n}\n\nstatic void torture_connect_failure(void **state) {\n    /*\n     * The intent of this test is to check that a fresh\n     * ssh_new/ssh_disconnect/ssh_free sequence doesn't crash/leak\n     * and the behavior of a double ssh_disconnect\n     */\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n\n    ssh_disconnect(session);\n}\n\nstatic void torture_connect_socket(void **state) {\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n\n    int rc;\n    int sock_fd = 0;\n    struct sockaddr_in server_addr = {\n        .sin_family = AF_INET,\n        .sin_port = htons(22),\n        .sin_addr.s_addr = inet_addr(TORTURE_SSH_SERVER),\n    };\n\n    sock_fd = socket(AF_INET, SOCK_STREAM, 0);\n    assert_true(sock_fd > 2);\n\n    rc = connect(sock_fd, (struct sockaddr *)&server_addr, sizeof(server_addr));\n    assert_return_code(rc, errno);\n\n    ssh_options_set(session, SSH_OPTIONS_FD, &sock_fd);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n}\n\nstatic void torture_connect_uninitialized(UNUSED_PARAM(void **state))\n{\n    int rc;\n    ssh_session session;\n    struct passwd *pwd;\n\n    /* Make sure the library is unitialized */\n    while (is_ssh_initialized()) {\n        rc = ssh_finalize();\n        assert_return_code(rc, errno);\n    }\n\n    pwd = getpwnam(\"bob\");\n    assert_non_null(pwd);\n\n    rc = setuid(pwd->pw_uid);\n    assert_return_code(rc, errno);\n\n    session = ssh_new();\n    assert_non_null(session);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_HOST, TORTURE_SSH_SERVER);\n    assert_ssh_return_code(session, rc);\n\n    /* Expect error from ssh_connect */\n    rc = ssh_connect(session);\n    assert_false(rc == SSH_OK);\n    assert_string_equal(ssh_get_error(session), \"Library not initialized.\");\n\n    ssh_free(session);\n}\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_connect_nonblocking, session_setup, session_teardown),\n        cmocka_unit_test_setup_teardown(torture_connect_double, session_setup, session_teardown),\n        cmocka_unit_test_setup_teardown(torture_connect_failure, session_setup, session_teardown),\n#if 0\n        cmocka_unit_test_setup_teardown(torture_connect_timeout, session_setup, session_teardown),\n#endif\n        cmocka_unit_test_setup_teardown(torture_connect_socket, session_setup, session_teardown),\n        cmocka_unit_test(torture_connect_uninitialized),\n    };\n\n    ssh_init();\n\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, sshd_setup, sshd_teardown);\n\n    ssh_finalize();\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/client/torture_forward.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2013 by Andreas Schneider <asn@cryptomilk.org>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include \"torture.h\"\n#include <libssh/libssh.h>\n\n#include <errno.h>\n#include <sys/types.h>\n#include <pwd.h>\n\nstatic int sshd_setup(void **state)\n{\n    torture_setup_sshd_server(state, false);\n\n    return 0;\n}\n\nstatic int sshd_teardown(void **state) {\n    torture_teardown_sshd_server(state);\n\n    return 0;\n}\n\nstatic int session_setup(void **state)\n{\n    struct torture_state *s = *state;\n    struct passwd *pwd;\n    int rc;\n\n    pwd = getpwnam(\"bob\");\n    assert_non_null(pwd);\n\n    rc = setuid(pwd->pw_uid);\n    assert_return_code(rc, errno);\n\n    s->ssh.session = torture_ssh_session(s,\n                                         TORTURE_SSH_SERVER,\n                                         NULL,\n                                         TORTURE_SSH_USER_ALICE,\n                                         NULL);\n    assert_non_null(s->ssh.session);\n\n    return 0;\n}\n\nstatic int session_teardown(void **state)\n{\n    struct torture_state *s = *state;\n\n    ssh_disconnect(s->ssh.session);\n    ssh_free(s->ssh.session);\n\n    return 0;\n}\n\nstatic void torture_ssh_forward(void **state)\n{\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    ssh_channel c;\n    int dport;\n    int bound_port;\n    int rc;\n    int verbosity = SSH_LOG_TRACE;\n\n    ssh_options_set(session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity);\n\n    rc = ssh_channel_listen_forward(session, \"127.0.0.21\", 8080, &bound_port);\n    assert_ssh_return_code(session, rc);\n\n    c = ssh_channel_accept_forward(session, 10, &dport);\n    /* We do not get a listener and run into the timeout here */\n    assert_null(c);\n\n    ssh_channel_send_eof(c);\n    ssh_channel_close(c);\n}\n\nint torture_run_tests(void) {\n    int rc;\n\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_ssh_forward,\n                                        session_setup,\n                                        session_teardown),\n    };\n\n    ssh_init();\n\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, sshd_setup, sshd_teardown);\n\n    ssh_finalize();\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/client/torture_hostkey.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2018 by Red Hat, Inc.\n *\n * Author: Jakub Jelen <jjelen@redhat.com>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include \"torture.h\"\n#include <libssh/libssh.h>\n#ifdef HAVE_SYS_TIME_H\n#include <sys/time.h>\n#endif /* HAVE_SYS_TIME_H */\n#include <errno.h>\n#include <pwd.h>\n\nstatic int sshd_setup(void **state)\n{\n    torture_setup_sshd_server(state, false);\n\n    return 0;\n}\n\nstatic int sshd_teardown(void **state) {\n    torture_teardown_sshd_server(state);\n\n    return 0;\n}\n\nstatic int session_setup(void **state)\n{\n    struct torture_state *s = *state;\n    int verbosity = torture_libssh_verbosity();\n    struct passwd *pwd;\n    int rc;\n\n    pwd = getpwnam(\"bob\");\n    assert_non_null(pwd);\n\n    rc = setuid(pwd->pw_uid);\n    assert_return_code(rc, errno);\n\n    s->ssh.session = ssh_new();\n    assert_non_null(s->ssh.session);\n\n    rc = ssh_options_set(s->ssh.session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity);\n    assert_ssh_return_code(s->ssh.session, rc);\n\n    rc = ssh_options_set(s->ssh.session, SSH_OPTIONS_HOST, TORTURE_SSH_SERVER);\n    assert_ssh_return_code(s->ssh.session, rc);\n\n    return 0;\n}\n\nstatic int session_teardown(void **state)\n{\n    struct torture_state *s = *state;\n\n    ssh_disconnect(s->ssh.session);\n    ssh_free(s->ssh.session);\n\n    return 0;\n}\n\nstatic void torture_hostkey_rsa(void **state) {\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    char rsa[] = \"ssh-rsa\";\n\n    int rc;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    rc = ssh_options_set(session, SSH_OPTIONS_HOSTKEYS, &rsa);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n\n    ssh_disconnect(session);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n}\n\nstatic void torture_hostkey_ed25519(void **state) {\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    char ed[] = \"ssh-ed25519\";\n\n    int rc;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    rc = ssh_options_set(session, SSH_OPTIONS_HOSTKEYS, &ed);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n\n    ssh_disconnect(session);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n}\n\n#ifdef HAVE_DSA\nstatic void torture_hostkey_dss(void **state) {\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    char rsa[] = \"ssh-dss\";\n\n    int rc;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    rc = ssh_options_set(session, SSH_OPTIONS_HOSTKEYS, &rsa);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n    ssh_disconnect(session);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n}\n#endif /* HAVE_DSA */\n\n#ifdef HAVE_ECC\nstatic void torture_hostkey_ecdsa(void **state) {\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    char ecdsa[] = \"ecdsa-sha2-nistp521\";\n\n    int rc;\n\n    rc = ssh_options_set(session, SSH_OPTIONS_HOSTKEYS, &ecdsa);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n\n    ssh_disconnect(session);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n}\n#endif\n\nstatic void torture_hostkey_rsa_sha256(void **state) {\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    char rsa[] = \"rsa-sha2-256\";\n\n    int rc;\n\n    rc = ssh_options_set(session, SSH_OPTIONS_HOSTKEYS, &rsa);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n\n    ssh_disconnect(session);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n}\n\nstatic void torture_hostkey_rsa_sha512(void **state) {\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    char rsa[] = \"rsa-sha2-512\";\n\n    int rc;\n\n    rc = ssh_options_set(session, SSH_OPTIONS_HOSTKEYS, &rsa);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n\n    ssh_disconnect(session);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n}\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_hostkey_rsa, session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_hostkey_ed25519, session_setup,\n                                        session_teardown),\n#ifdef HAVE_ECC\n        cmocka_unit_test_setup_teardown(torture_hostkey_ecdsa, session_setup,\n                                        session_teardown),\n#endif\n#ifdef HAVE_DSA\n        cmocka_unit_test_setup_teardown(torture_hostkey_dss, session_setup,\n                                        session_teardown),\n#endif\n        /* the client is able to handle SHA2 extension (if negotiated) */\n        cmocka_unit_test_setup_teardown(torture_hostkey_rsa_sha256,\n                                        session_setup, session_teardown),\n        cmocka_unit_test_setup_teardown(torture_hostkey_rsa_sha512,\n                                        session_setup, session_teardown),\n    };\n\n    ssh_init();\n\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, sshd_setup, sshd_teardown);\n\n    ssh_finalize();\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/client/torture_knownhosts.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2010 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include \"torture.h\"\n#include \"torture_key.h\"\n\n#include <sys/types.h>\n#include <pwd.h>\n#include <errno.h>\n\n#include \"session.c\"\n#include \"known_hosts.c\"\n\n#define TMP_FILE_TEMPLATE \"known_hosts_XXXXXX\"\n\n#define BADRSA \"AAAAB3NzaC1yc2EAAAADAQABAAABAQChm5\" \\\n               \"a6Av65O8cKtx5YXOnui3wJnYE6A6J/I4kZSAibbn14Jcl+34VJQwv96f25AxNmo\" \\\n               \"NwoiZV93IzdypQmiuieh6s6wB9WhYjU9K/6CkIpNhpCxswA90b3ePjS7LnR9B9J\" \\\n               \"slPSbG1H0KC1c5lb7G3utXteXtM+4YvCvpN5VdC4CpghT+p0cwN2Na8Md5vRItz\" \\\n               \"YgIytryNn7LLiwYfoSxvWigFrTTZsrVtCOYyNgklmffpGdzuC43wdANvTewfI9G\" \\\n               \"o71r8EXmEc228CrYPmb8Scv3mpXFK/BosohSGkPlEHu9lf3YjnknBicDaVtJOYp\" \\\n               \"wnXJPjZo2EhG79HxDRpjJHH\"\n#define BADED25519 \"AAAAC3NzaC1lZDI1NTE5AAAAIE74wHmKKkrxpW/dZ69pKPlMoWG9VvWfrNnUkWRQqaDa\"\n\nstatic int sshd_setup(void **state)\n{\n    torture_setup_sshd_server(state, false);\n\n    return 0;\n}\n\nstatic int sshd_teardown(void **state) {\n    torture_teardown_sshd_server(state);\n\n    return 0;\n}\n\nstatic int session_setup(void **state)\n{\n    struct torture_state *s = *state;\n    int verbosity = torture_libssh_verbosity();\n    struct passwd *pwd;\n    bool process_config = false;\n    int rc;\n\n    pwd = getpwnam(\"bob\");\n    assert_non_null(pwd);\n\n    rc = setuid(pwd->pw_uid);\n    assert_return_code(rc, errno);\n\n    s->ssh.session = ssh_new();\n    assert_non_null(s->ssh.session);\n\n    ssh_options_set(s->ssh.session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity);\n    ssh_options_set(s->ssh.session, SSH_OPTIONS_PROCESS_CONFIG,\n                    &process_config);\n    ssh_options_set(s->ssh.session, SSH_OPTIONS_HOST, TORTURE_SSH_SERVER);\n    ssh_options_set(s->ssh.session, SSH_OPTIONS_USER, TORTURE_SSH_USER_ALICE);\n\n    return 0;\n}\n\nstatic int session_teardown(void **state)\n{\n    struct torture_state *s = *state;\n\n    ssh_disconnect(s->ssh.session);\n    ssh_free(s->ssh.session);\n\n    return 0;\n}\n\n\nstatic void torture_knownhosts_port(void **state) {\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    char tmp_file[1024] = {0};\n    char *known_hosts_file = NULL;\n    char buffer[200];\n    char *p;\n    FILE *file;\n    int rc;\n    bool process_config = false;\n\n    snprintf(tmp_file,\n             sizeof(tmp_file),\n             \"%s/%s\",\n             s->socket_dir,\n             TMP_FILE_TEMPLATE);\n\n    known_hosts_file = torture_create_temp_file(tmp_file);\n    assert_non_null(known_hosts_file);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_KNOWNHOSTS, known_hosts_file);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n\n    session->opts.port = 1234;\n    rc = ssh_write_knownhost(session);\n    assert_ssh_return_code(session, rc);\n\n    file = fopen(known_hosts_file, \"r\");\n    assert_non_null(file);\n    p = fgets(buffer, sizeof(buffer), file);\n    assert_non_null(p);\n    fclose(file);\n    buffer[sizeof(buffer) - 1] = '\\0';\n    assert_non_null(strstr(buffer,\"[127.0.0.10]:1234 \"));\n\n    ssh_disconnect(session);\n    ssh_free(session);\n\n    /* Now, connect back to the ssh server and verify the known host line */\n    s->ssh.session = session = ssh_new();\n\n    ssh_options_set(session, SSH_OPTIONS_PROCESS_CONFIG, &process_config);\n    ssh_options_set(session, SSH_OPTIONS_HOST, TORTURE_SSH_SERVER);\n    ssh_options_set(session, SSH_OPTIONS_KNOWNHOSTS, known_hosts_file);\n    free(known_hosts_file);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n\n    session->opts.port = 1234;\n    rc = ssh_is_server_known(session);\n    assert_int_equal(rc, SSH_SERVER_KNOWN_OK);\n}\n\nstatic void torture_knownhosts_wildcard(void **state)\n{\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    char tmp_file[1024] = {0};\n    char *known_hosts_file = NULL;\n    const char *key = NULL;\n    FILE *file;\n    int rc;\n\n    snprintf(tmp_file,\n             sizeof(tmp_file),\n             \"%s/%s\",\n             s->socket_dir,\n             TMP_FILE_TEMPLATE);\n\n    known_hosts_file = torture_create_temp_file(tmp_file);\n    assert_non_null(known_hosts_file);\n\n    file = fopen(known_hosts_file, \"w\");\n    assert_non_null(file);\n    key = torture_get_testkey_pub(SSH_KEYTYPE_RSA);\n    fprintf(file, \"[127.0.0.10]:* %s\\n\", key);\n    fclose(file);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_HOST, TORTURE_SSH_SERVER);\n    assert_ssh_return_code(session, rc);\n    rc = ssh_options_set(session, SSH_OPTIONS_KNOWNHOSTS, known_hosts_file);\n    assert_ssh_return_code(session, rc);\n    free(known_hosts_file);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_is_server_known(session);\n    assert_int_equal(rc, SSH_SERVER_KNOWN_OK);\n}\n\nstatic void torture_knownhosts_standard_port(void **state)\n{\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    char tmp_file[1024] = {0};\n    char *known_hosts_file = NULL;\n    const char *key = NULL;\n    FILE *file;\n    int rc;\n\n    snprintf(tmp_file,\n             sizeof(tmp_file),\n             \"%s/%s\",\n             s->socket_dir,\n             TMP_FILE_TEMPLATE);\n\n    known_hosts_file = torture_create_temp_file(tmp_file);\n    assert_non_null(known_hosts_file);\n\n    file = fopen(known_hosts_file, \"w\");\n    assert_non_null(file);\n    key = torture_get_testkey_pub(SSH_KEYTYPE_RSA);\n    fprintf(file, \"[127.0.0.10]:22 %s\\n\", key);\n    fclose(file);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_HOST, TORTURE_SSH_SERVER);\n    assert_ssh_return_code(session, rc);\n    rc = ssh_options_set(session, SSH_OPTIONS_KNOWNHOSTS, known_hosts_file);\n    assert_ssh_return_code(session, rc);\n    free(known_hosts_file);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_is_server_known(session);\n    assert_int_equal(rc, SSH_SERVER_KNOWN_OK);\n}\n\nstatic void torture_knownhosts_fail(void **state) {\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    char tmp_file[1024] = {0};\n    char *known_hosts_file = NULL;\n    FILE *file;\n    int rc;\n\n    snprintf(tmp_file,\n             sizeof(tmp_file),\n             \"%s/%s\",\n             s->socket_dir,\n             TMP_FILE_TEMPLATE);\n\n    known_hosts_file = torture_create_temp_file(tmp_file);\n    assert_non_null(known_hosts_file);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_KNOWNHOSTS, known_hosts_file);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_HOSTKEYS, \"rsa-sha2-256\");\n    assert_ssh_return_code(session, rc);\n\n    file = fopen(known_hosts_file, \"w\");\n    assert_non_null(file);\n    free(known_hosts_file);\n\n    fprintf(file, \"127.0.0.10 ssh-rsa %s\\n\", BADRSA);\n    fclose(file);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_is_server_known(session);\n    assert_int_equal(rc, SSH_SERVER_KNOWN_CHANGED);\n}\n\nstatic void torture_knownhosts_other(void **state) {\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    char tmp_file[1024] = {0};\n    char *known_hosts_file = NULL;\n    FILE *file;\n    int rc;\n\n    snprintf(tmp_file,\n             sizeof(tmp_file),\n             \"%s/%s\",\n             s->socket_dir,\n             TMP_FILE_TEMPLATE);\n\n    known_hosts_file = torture_create_temp_file(tmp_file);\n    assert_non_null(known_hosts_file);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_KNOWNHOSTS, known_hosts_file);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_HOSTKEYS, \"ecdsa-sha2-nistp521\");\n    assert_ssh_return_code(session, rc);\n\n    file = fopen(known_hosts_file, \"w\");\n    assert_non_null(file);\n    free(known_hosts_file);\n\n    fprintf(file, \"127.0.0.10 ssh-rsa %s\\n\", BADRSA);\n    fclose(file);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_is_server_known(session);\n    assert_int_equal(rc, SSH_SERVER_FOUND_OTHER);\n}\n\nstatic void torture_knownhosts_other_auto(void **state) {\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    char tmp_file[1024] = {0};\n    char *known_hosts_file = NULL;\n    int rc;\n    bool process_config = false;\n\n    snprintf(tmp_file,\n             sizeof(tmp_file),\n             \"%s/%s\",\n             s->socket_dir,\n             TMP_FILE_TEMPLATE);\n\n    known_hosts_file = torture_create_temp_file(tmp_file);\n    assert_non_null(known_hosts_file);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_HOST, TORTURE_SSH_SERVER);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_KNOWNHOSTS, known_hosts_file);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_HOSTKEYS, \"ecdsa-sha2-nistp521\");\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_is_server_known(session);\n    assert_int_equal(rc, SSH_SERVER_NOT_KNOWN);\n\n    rc = ssh_write_knownhost(session);\n    assert_ssh_return_code(session, rc);\n\n    ssh_disconnect(session);\n    ssh_free(session);\n\n    /* connect again and check host key */\n    session = ssh_new();\n    assert_non_null(session);\n\n    s->ssh.session = session;\n\n    rc = ssh_options_set(session, SSH_OPTIONS_PROCESS_CONFIG, &process_config);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_HOST, TORTURE_SSH_SERVER);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_KNOWNHOSTS, known_hosts_file);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n\n    /* ssh-rsa is the default but libssh should try ssh-ed25519 instead */\n    rc = ssh_is_server_known(session);\n    assert_int_equal(rc, SSH_SERVER_KNOWN_OK);\n\n    /* session will be freed by session_teardown() */\n    free(known_hosts_file);\n}\n\nstatic void torture_knownhosts_conflict(void **state) {\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    char tmp_file[1024] = {0};\n    char *known_hosts_file = NULL;\n    FILE *file;\n    int rc;\n    bool process_config = false;\n\n    snprintf(tmp_file,\n             sizeof(tmp_file),\n             \"%s/%s\",\n             s->socket_dir,\n             TMP_FILE_TEMPLATE);\n\n    known_hosts_file = torture_create_temp_file(tmp_file);\n    assert_non_null(known_hosts_file);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_HOST, TORTURE_SSH_SERVER);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_KNOWNHOSTS, known_hosts_file);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_HOSTKEYS, \"rsa-sha2-256\");\n    assert_ssh_return_code(session, rc);\n\n    file = fopen(known_hosts_file, \"w\");\n    assert_non_null(file);\n    fprintf(file, \"127.0.0.10 ssh-rsa %s\\n\", BADRSA);\n    fprintf(file, \"127.0.0.10 ssh-ed25519 %s\\n\", BADED25519);\n    fclose(file);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_is_server_known(session);\n    assert_int_equal(rc, SSH_SERVER_KNOWN_CHANGED);\n\n    rc = ssh_write_knownhost(session);\n    assert_ssh_return_code(session, rc);\n\n    ssh_disconnect(session);\n    ssh_free(session);\n\n    /* connect again and check host key */\n    session = ssh_new();\n    assert_non_null(session);\n\n    s->ssh.session = session;\n\n    rc = ssh_options_set(session, SSH_OPTIONS_PROCESS_CONFIG, &process_config);\n    assert_ssh_return_code(session, rc);\n\n    ssh_options_set(session, SSH_OPTIONS_HOST, TORTURE_SSH_SERVER);\n    ssh_options_set(session, SSH_OPTIONS_KNOWNHOSTS, known_hosts_file);\n    rc = ssh_options_set(session, SSH_OPTIONS_HOSTKEYS, \"rsa-sha2-256\");\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_is_server_known(session);\n    assert_int_equal(rc, SSH_SERVER_KNOWN_OK);\n\n    /* session will be freed by session_teardown() */\n    free(known_hosts_file);\n}\n\nstatic void torture_knownhosts_no_hostkeychecking(void **state)\n{\n\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    char tmp_file[1024] = {0};\n    char *known_hosts_file = NULL;\n    enum ssh_known_hosts_e found;\n    int strict_host_key_checking = 0;\n    int rc;\n\n    snprintf(tmp_file,\n             sizeof(tmp_file),\n             \"%s/%s\",\n             s->socket_dir,\n             TMP_FILE_TEMPLATE);\n\n    known_hosts_file = torture_create_temp_file(tmp_file);\n    assert_non_null(known_hosts_file);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_KNOWNHOSTS, known_hosts_file);\n    assert_ssh_return_code(session, rc);\n    free(known_hosts_file);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_HOSTKEYS, \"ecdsa-sha2-nistp521\");\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n\n    found = ssh_session_is_known_server(session);\n    assert_int_equal(found, SSH_KNOWN_HOSTS_UNKNOWN);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_STRICTHOSTKEYCHECK, &strict_host_key_checking);\n    assert_ssh_return_code(session, rc);\n\n    found = ssh_session_is_known_server(session);\n    assert_int_equal(found, SSH_KNOWN_HOSTS_OK);\n}\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_knownhosts_wildcard,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_knownhosts_standard_port,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_knownhosts_port,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_knownhosts_fail,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_knownhosts_other,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_knownhosts_other_auto,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_knownhosts_conflict,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_knownhosts_no_hostkeychecking,\n                                        session_setup,\n                                        session_teardown),\n    };\n\n    ssh_init();\n\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, sshd_setup, sshd_teardown);\n\n    ssh_finalize();\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/client/torture_knownhosts_verify.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2018 by Andreas Schneider\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include \"torture.h\"\n#include \"torture_key.h\"\n\n#include <sys/types.h>\n#include <pwd.h>\n\n#include \"knownhosts.c\"\n\n#define TMP_FILE_TEMPLATE \"known_hosts_XXXXXX\"\n\n#define BAD_RSA \"AAAAB3NzaC1yc2EAAAADAQABAAABAQDXvXuawzaArEwkLIXTz/EWywLOC\" \\\n                \"tqQL3P9yKkrhz6AplXP2PhOh5pyxa1VfGKe453jNeYBJ0ROto3BshXgZX\" \\\n                \"bo86oLXTkbe0gO5xi3r5WjXxjOFvRRTLot5fPLNDOv9+TnsPmkNn0iIey\" \\\n                \"PnfrcPIyjWt5zSWUfkNC8oNHxsiSshjpbJvTXSDipukpUy41d7jg4uWGu\" \\\n                \"onMTF7yu7HfuHqq7lhb0WlwSpfbqAbfYARBddcdcARyhix4RMWZZqVY20\" \\\n                \"H3Vsjq8bjKC+NJXFce1PRg+qcOWQdlXEei4dkzAvHvfQRx1TjzkrBZ6B6\" \\\n                \"thmZtyeb9IsiB0tg2g0JN2VTAGkxqp\"\n\nconst char template[] = \"temp_dir_XXXXXX\";\n\nstatic int sshd_group_setup(void **state)\n{\n    torture_setup_sshd_server(state, false);\n\n    return 0;\n}\n\nstatic int sshd_group_teardown(void **state) {\n    torture_teardown_sshd_server(state);\n\n    return 0;\n}\n\nstatic int session_setup(void **state)\n{\n    struct torture_state *s = *state;\n    int verbosity = torture_libssh_verbosity();\n    struct passwd *pwd;\n    int rc;\n\n    bool process_config = false;\n\n    pwd = getpwnam(\"bob\");\n    assert_non_null(pwd);\n\n    rc = setuid(pwd->pw_uid);\n    assert_return_code(rc, errno);\n\n    s->ssh.session = ssh_new();\n    assert_non_null(s->ssh.session);\n\n    rc = ssh_options_set(s->ssh.session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity);\n    assert_ssh_return_code(s->ssh.session, rc);\n\n    rc = ssh_options_set(s->ssh.session, SSH_OPTIONS_PROCESS_CONFIG,\n                         &process_config);\n    assert_ssh_return_code(s->ssh.session, rc);\n\n    rc = ssh_options_set(s->ssh.session, SSH_OPTIONS_HOST, TORTURE_SSH_SERVER);\n    assert_ssh_return_code(s->ssh.session, rc);\n\n    rc = ssh_options_set(s->ssh.session,\n                         SSH_OPTIONS_USER,\n                         TORTURE_SSH_USER_ALICE);\n    assert_ssh_return_code(s->ssh.session, rc);\n\n    return 0;\n}\n\nstatic int session_teardown(void **state)\n{\n    struct torture_state *s = *state;\n    ssh_disconnect(s->ssh.session);\n    ssh_free(s->ssh.session);\n\n    return 0;\n}\n\n#define KNOWN_HOST_ENTRY_ECDSA \"127.0.0.10 ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBAHOg+9vHW2kJB50j7c7WkcCcOtwgZdeXMpAeEl17sFnTTrT8wYo1FCzE07wV262vIC+AE3fXUJ7sJ/CkFIdk/8/gQEY1jyoXB3Bsee16VwhJGsMzGGh1FJ0XXhRJjUbG18qbH9JiSgE1N4fIM0zJG68fAyUxRxCI1wUobOOB7EmFZd18g==\\n\"\n#define KNOWN_HOST_ENTRY_ED25519 \"127.0.0.10 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBWWnxuCYiOyvMYLtkgoEyEKlLV+klM+BU6Nh3PmAiqX\\n\"\nstatic void torture_knownhosts_export(void **state)\n{\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    char *entry = NULL;\n    char *p = NULL;\n    int rc;\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_session_export_known_hosts_entry(session, &entry);\n    assert_ssh_return_code(session, rc);\n\n    p = strstr(entry, \"ssh-ed25519\");\n    if (p != NULL) {\n        assert_string_equal(entry, KNOWN_HOST_ENTRY_ED25519);\n    } else {\n        assert_string_equal(entry, KNOWN_HOST_ENTRY_ECDSA);\n    }\n    SAFE_FREE(entry);\n}\n\nstatic void torture_knownhosts_write_and_verify(void **state)\n{\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    enum ssh_known_hosts_e found;\n    int rc;\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_session_update_known_hosts(session);\n    assert_ssh_return_code(session, rc);\n\n    found = ssh_session_is_known_server(session);\n    assert_int_equal(found, SSH_KNOWN_HOSTS_OK);\n}\n\nstatic void torture_knownhosts_precheck(void **state)\n{\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    struct ssh_list *algo_list = NULL;\n    struct ssh_iterator *it = NULL;\n    size_t algo_count;\n    const char *algo = NULL;\n    char tmp_file[1024] = {0};\n    char *known_hosts_file = NULL;\n    FILE *file;\n    int rc;\n\n    snprintf(tmp_file,\n             sizeof(tmp_file),\n             \"%s/%s\",\n             s->socket_dir,\n             TMP_FILE_TEMPLATE);\n\n    known_hosts_file = torture_create_temp_file(tmp_file);\n    assert_non_null(known_hosts_file);\n\n    file = fopen(known_hosts_file, \"w\");\n    assert_non_null(file);\n    fprintf(file,\n            \"127.0.0.10 %s\\n\",\n            torture_get_testkey_pub(SSH_KEYTYPE_RSA));\n\n    fprintf(file,\n            \"127.0.0.10 %s\\n\",\n            torture_get_testkey_pub(SSH_KEYTYPE_ED25519));\n\n    fprintf(file,\n            \"127.0.0.10 %s\\n\",\n            torture_get_testkey_pub(SSH_KEYTYPE_ECDSA_P521));\n\n    fclose(file);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_KNOWNHOSTS, known_hosts_file);\n    assert_ssh_return_code(session, rc);\n    free(known_hosts_file);\n\n    algo_list = ssh_known_hosts_get_algorithms(session);\n    assert_non_null(algo_list);\n\n    algo_count = ssh_list_count(algo_list);\n    assert_int_equal(algo_count, 3);\n\n    it = ssh_list_get_iterator(algo_list);\n    assert_non_null(it);\n    algo = ssh_iterator_value(const char *, it);\n    assert_string_equal(algo, \"ssh-rsa\");\n\n    ssh_list_remove(algo_list, it);\n\n    it = ssh_list_get_iterator(algo_list);\n    assert_non_null(it);\n    algo = ssh_iterator_value(const char *, it);\n    assert_string_equal(algo, \"ssh-ed25519\");\n\n    ssh_list_remove(algo_list, it);\n\n    it = ssh_list_get_iterator(algo_list);\n    assert_non_null(it);\n    algo = ssh_iterator_value(const char *, it);\n    assert_string_equal(algo, \"ecdsa-sha2-nistp521\");\n\n    ssh_list_free(algo_list);\n}\n\nstatic void torture_knownhosts_duplicate(void **state)\n{\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    struct ssh_list *algo_list = NULL;\n    struct ssh_iterator *it = NULL;\n    size_t algo_count;\n    const char *algo = NULL;\n    char tmp_file[1024] = {0};\n    char *known_hosts_file = NULL;\n    FILE *file;\n    int rc;\n\n    snprintf(tmp_file,\n             sizeof(tmp_file),\n             \"%s/%s\",\n             s->socket_dir,\n             TMP_FILE_TEMPLATE);\n\n    known_hosts_file = torture_create_temp_file(tmp_file);\n    assert_non_null(known_hosts_file);\n\n    file = fopen(known_hosts_file, \"w\");\n    assert_non_null(file);\n    fprintf(file,\n            \"127.0.0.10 %s\\n\",\n            torture_get_testkey_pub(SSH_KEYTYPE_RSA));\n\n    fprintf(file,\n            \"127.0.0.10 %s\\n\",\n            torture_get_testkey_pub(SSH_KEYTYPE_RSA));\n\n    fprintf(file,\n            \"127.0.0.10 %s\\n\",\n            torture_get_testkey_pub(SSH_KEYTYPE_RSA));\n\n    fclose(file);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_KNOWNHOSTS, known_hosts_file);\n    assert_ssh_return_code(session, rc);\n    free(known_hosts_file);\n\n    algo_list = ssh_known_hosts_get_algorithms(session);\n    assert_non_null(algo_list);\n\n    algo_count = ssh_list_count(algo_list);\n    assert_int_equal(algo_count, 1);\n\n    it = ssh_list_get_iterator(algo_list);\n    assert_non_null(it);\n    algo = ssh_iterator_value(const char *, it);\n    assert_string_equal(algo, \"ssh-rsa\");\n\n    ssh_list_free(algo_list);\n}\n\nstatic void torture_knownhosts_other(void **state)\n{\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    char tmp_file[1024] = {0};\n    char *known_hosts_file = NULL;\n    enum ssh_known_hosts_e found;\n    FILE *file = NULL;\n    int rc;\n\n    snprintf(tmp_file,\n             sizeof(tmp_file),\n             \"%s/%s\",\n             s->socket_dir,\n             TMP_FILE_TEMPLATE);\n\n    known_hosts_file = torture_create_temp_file(tmp_file);\n    assert_non_null(known_hosts_file);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_KNOWNHOSTS, known_hosts_file);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_HOSTKEYS, \"ecdsa-sha2-nistp521\");\n    assert_ssh_return_code(session, rc);\n\n    file = fopen(known_hosts_file, \"w\");\n    assert_non_null(file);\n    fprintf(file,\n            \"127.0.0.10 %s\\n\",\n            torture_get_testkey_pub(SSH_KEYTYPE_RSA));\n    fclose(file);\n    free(known_hosts_file);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n\n    found = ssh_session_is_known_server(session);\n    assert_int_equal(found, SSH_KNOWN_HOSTS_OTHER);\n}\n\nstatic void torture_knownhosts_unknown(void **state)\n{\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    char tmp_file[1024] = {0};\n    char *known_hosts_file = NULL;\n    enum ssh_known_hosts_e found;\n    int rc;\n\n    snprintf(tmp_file,\n             sizeof(tmp_file),\n             \"%s/%s\",\n             s->socket_dir,\n             TMP_FILE_TEMPLATE);\n\n    known_hosts_file = torture_create_temp_file(tmp_file);\n    assert_non_null(known_hosts_file);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_KNOWNHOSTS, known_hosts_file);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_HOSTKEYS, \"ecdsa-sha2-nistp521\");\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n\n    found = ssh_session_is_known_server(session);\n    assert_int_equal(found, SSH_KNOWN_HOSTS_UNKNOWN);\n\n    rc = ssh_session_update_known_hosts(session);\n    assert_ssh_return_code(session, rc);\n\n    ssh_disconnect(session);\n    ssh_free(session);\n\n    /* connect again and check host key */\n    session = ssh_new();\n    assert_non_null(session);\n\n    s->ssh.session = session;\n\n    rc = ssh_options_set(s->ssh.session, SSH_OPTIONS_HOST, TORTURE_SSH_SERVER);\n    assert_ssh_return_code(s->ssh.session, rc);\n\n    rc = ssh_options_set(s->ssh.session,\n                         SSH_OPTIONS_USER,\n                         TORTURE_SSH_USER_ALICE);\n    assert_ssh_return_code(s->ssh.session, rc);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_KNOWNHOSTS, known_hosts_file);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n\n    /* ssh-rsa is the default but libssh should try ssh-ed25519 instead */\n    found = ssh_session_is_known_server(session);\n    assert_int_equal(found, SSH_KNOWN_HOSTS_OK);\n\n    /* session will be freed by session_teardown() */\n    free(known_hosts_file);\n}\n\nstatic void torture_knownhosts_conflict(void **state)\n{\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    char tmp_file[1024] = {0};\n    char *known_hosts_file = NULL;\n    enum ssh_known_hosts_e found;\n    FILE *file = NULL;\n    int rc;\n\n    snprintf(tmp_file,\n             sizeof(tmp_file),\n             \"%s/%s\",\n             s->socket_dir,\n             TMP_FILE_TEMPLATE);\n\n    known_hosts_file = torture_create_temp_file(tmp_file);\n    assert_non_null(known_hosts_file);\n\n    file = fopen(known_hosts_file, \"w\");\n    assert_non_null(file);\n    fprintf(file,\n            \"127.0.0.10 %s %s\\n\",\n            \"ssh-rsa\",\n            BAD_RSA);\n    fclose(file);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_KNOWNHOSTS, known_hosts_file);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_HOSTKEYS, \"rsa-sha2-256\");\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n\n    found = ssh_session_is_known_server(session);\n    assert_int_equal(found, SSH_KNOWN_HOSTS_CHANGED);\n\n    rc = ssh_session_update_known_hosts(session);\n    assert_ssh_return_code(session, rc);\n\n    ssh_disconnect(session);\n    ssh_free(session);\n\n    /* connect again and check host key */\n    session = ssh_new();\n    assert_non_null(session);\n\n    s->ssh.session = session;\n\n    rc = ssh_options_set(session, SSH_OPTIONS_HOST, TORTURE_SSH_SERVER);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_KNOWNHOSTS, known_hosts_file);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_HOSTKEYS, \"rsa-sha2-256\");\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n\n    found = ssh_session_is_known_server(session);\n    assert_int_equal(found, SSH_KNOWN_HOSTS_OK);\n\n    /* session will be freed by session_teardown() */\n    free(known_hosts_file);\n}\n\nstatic void torture_knownhosts_new_file(void **state)\n{\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    enum ssh_known_hosts_e found;\n    int rc;\n\n    char new_known_hosts[256];\n    char *tmp_dir = NULL;\n    ssize_t count = 0;\n\n    /* Create a disposable directory */\n    tmp_dir = torture_make_temp_dir(template);\n    assert_non_null(tmp_dir);\n\n    count = snprintf(new_known_hosts, sizeof(new_known_hosts),\n                     \"%s/a/b/c/d/known_hosts\", tmp_dir);\n    assert_return_code(count, errno);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_KNOWNHOSTS, new_known_hosts);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_session_update_known_hosts(session);\n    assert_ssh_return_code(session, rc);\n\n    found = ssh_session_is_known_server(session);\n    assert_int_equal(found, SSH_KNOWN_HOSTS_OK);\n\n    /* Cleanup */\n    torture_rmdirs(tmp_dir);\n\n    SAFE_FREE(tmp_dir);\n}\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_knownhosts_export,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_knownhosts_write_and_verify,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_knownhosts_precheck,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_knownhosts_other,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_knownhosts_unknown,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_knownhosts_conflict,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_knownhosts_duplicate,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_knownhosts_new_file,\n                                        session_setup,\n                                        session_teardown),\n    };\n\n    ssh_init();\n\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, sshd_group_setup, sshd_group_teardown);\n\n    ssh_finalize();\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/client/torture_proxycommand.c",
    "content": "#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include \"torture.h\"\n#include <libssh/libssh.h>\n#include \"libssh/priv.h\"\n\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <pwd.h>\n#include <errno.h>\n#include <fcntl.h>\n\nstatic int sshd_setup(void **state)\n{\n    torture_setup_sshd_server(state, false);\n\n    return 0;\n}\n\nstatic int sshd_teardown(void **state) {\n    torture_teardown_sshd_server(state);\n\n    return 0;\n}\n\nstatic int session_setup(void **state)\n{\n    struct torture_state *s = *state;\n    int verbosity = torture_libssh_verbosity();\n    struct passwd *pwd;\n    int rc;\n\n    pwd = getpwnam(\"bob\");\n    assert_non_null(pwd);\n\n    rc = setuid(pwd->pw_uid);\n    assert_return_code(rc, errno);\n\n    s->ssh.session = ssh_new();\n    assert_non_null(s->ssh.session);\n\n    ssh_options_set(s->ssh.session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity);\n    ssh_options_set(s->ssh.session, SSH_OPTIONS_HOST, TORTURE_SSH_SERVER);\n\n    ssh_options_set(s->ssh.session, SSH_OPTIONS_USER, TORTURE_SSH_USER_ALICE);\n\n    return 0;\n}\n\nstatic int session_teardown(void **state)\n{\n    struct torture_state *s = *state;\n\n    ssh_disconnect(s->ssh.session);\n    ssh_free(s->ssh.session);\n\n    return 0;\n}\n\n#ifdef NC_EXECUTABLE\nstatic void torture_options_set_proxycommand(void **state)\n{\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    const char *address = torture_server_address(AF_INET);\n    int port = torture_server_port();\n    char command[255] = {0};\n    struct stat sb;\n    int rc;\n    socket_t fd;\n\n    rc = stat(NC_EXECUTABLE, &sb);\n    if (rc != 0 || (sb.st_mode & S_IXOTH) == 0) {\n        SSH_LOG(SSH_LOG_WARNING, \"Could not find \" NC_EXECUTABLE \": Skipping the test\");\n        skip();\n    }\n\n    rc = snprintf(command, sizeof(command), NC_EXECUTABLE \" %s %d\", address, port);\n    assert_true((size_t)rc < sizeof(command));\n\n    rc = ssh_options_set(session, SSH_OPTIONS_PROXYCOMMAND, command);\n    assert_int_equal(rc, 0);\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n    fd = ssh_get_fd(session);\n    assert_true(fd != SSH_INVALID_SOCKET);\n    rc = fcntl(fd, F_GETFL);\n    assert_int_equal(rc & O_RDWR, O_RDWR);\n}\n\n#else /* NC_EXECUTABLE */\n\nstatic void torture_options_set_proxycommand(void **state)\n{\n    (void) state;\n    skip();\n}\n\n#endif /* NC_EXECUTABLE */\n\nstatic void torture_options_set_proxycommand_notexist(void **state) {\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    int rc;\n\n    rc = ssh_options_set(session, SSH_OPTIONS_PROXYCOMMAND, \"this_command_does_not_exist\");\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code_equal(session, rc, SSH_ERROR);\n}\n\nstatic void torture_options_set_proxycommand_ssh(void **state)\n{\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    const char *address = torture_server_address(AF_INET);\n    char command[255] = {0};\n    int rc;\n    socket_t fd;\n\n    rc = snprintf(command, sizeof(command),\n                  \"ssh -oStrictHostKeyChecking=no -W [%%h]:%%p alice@%s\",\n                  address);\n    assert_true((size_t)rc < sizeof(command));\n\n    rc = ssh_options_set(session, SSH_OPTIONS_PROXYCOMMAND, command);\n    assert_int_equal(rc, 0);\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n    fd = ssh_get_fd(session);\n    assert_true(fd != SSH_INVALID_SOCKET);\n    rc = fcntl(fd, F_GETFL);\n    assert_int_equal(rc & O_RDWR, O_RDWR);\n}\n\nstatic void torture_options_set_proxycommand_ssh_stderr(void **state)\n{\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    const char *address = torture_server_address(AF_INET);\n    char command[255] = {0};\n    int rc;\n    socket_t fd;\n\n    /* The -vvv switches produce the desired output on the standard error */\n    rc = snprintf(command, sizeof(command),\n                  \"ssh -vvv -oStrictHostKeyChecking=no -W [%%h]:%%p alice@%s\",\n                  address);\n    assert_true((size_t)rc < sizeof(command));\n\n    rc = ssh_options_set(session, SSH_OPTIONS_PROXYCOMMAND, command);\n    assert_int_equal(rc, 0);\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n    fd = ssh_get_fd(session);\n    assert_true(fd != SSH_INVALID_SOCKET);\n    rc = fcntl(fd, F_GETFL);\n    assert_int_equal(rc & O_RDWR, O_RDWR);\n}\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_options_set_proxycommand,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_options_set_proxycommand_notexist,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_options_set_proxycommand_ssh,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_options_set_proxycommand_ssh_stderr,\n                                        session_setup,\n                                        session_teardown),\n    };\n\n\n    ssh_init();\n\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, sshd_setup, sshd_teardown);\n    ssh_finalize();\n\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/client/torture_rekey.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2018 by Red Hat, Inc.\n *\n * Authors: Jakub Jelen <jjelen@redhat.com>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include \"torture.h\"\n#include \"libssh/sftp.h\"\n#include \"libssh/libssh.h\"\n#include \"libssh/priv.h\"\n#include \"libssh/session.h\"\n#include \"libssh/crypto.h\"\n\n#include <errno.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <fcntl.h>\n#include <pwd.h>\n\nstatic int sshd_setup(void **state)\n{\n    torture_setup_sshd_server(state, false);\n\n    return 0;\n}\n\nstatic int sshd_teardown(void **state)\n{\n    torture_teardown_sshd_server(state);\n\n    return 0;\n}\n\nstatic int session_setup(void **state)\n{\n    struct torture_state *s = *state;\n    int verbosity = torture_libssh_verbosity();\n    struct passwd *pwd;\n    bool b = false;\n    int rc;\n\n    pwd = getpwnam(\"bob\");\n    assert_non_null(pwd);\n\n    rc = setuid(pwd->pw_uid);\n    assert_return_code(rc, errno);\n\n    s->ssh.session = ssh_new();\n    assert_non_null(s->ssh.session);\n\n    ssh_options_set(s->ssh.session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity);\n    ssh_options_set(s->ssh.session, SSH_OPTIONS_HOST, TORTURE_SSH_SERVER);\n\n    /* Authenticate as alice with bob's pubkey */\n    rc = ssh_options_set(s->ssh.session, SSH_OPTIONS_USER, TORTURE_SSH_USER_ALICE);\n    assert_int_equal(rc, SSH_OK);\n\n    /* Make sure no other configuration options from system will get used */\n    rc = ssh_options_set(s->ssh.session, SSH_OPTIONS_PROCESS_CONFIG, &b);\n    assert_ssh_return_code(s->ssh.session, rc);\n\n    /* Make sure we do not interfere with another ssh-agent */\n    unsetenv(\"SSH_AUTH_SOCK\");\n    unsetenv(\"SSH_AGENT_PID\");\n\n    return 0;\n}\n\nstatic int session_teardown(void **state)\n{\n    struct torture_state *s = *state;\n\n    ssh_free(s->ssh.session);\n\n    return 0;\n}\n\n/* Check that the default limits for rekeying are enforced.\n * the limits are too high for testsuite to verify so\n * we should be fine with checking the values in internal\n * structures\n */\nstatic void torture_rekey_default(void **state)\n{\n    struct torture_state *s = *state;\n    int rc;\n    struct ssh_crypto_struct *c = NULL;\n\n    /* Define preferred ciphers: */\n    if (ssh_fips_mode()) {\n        /* We do not have any FIPS allowed cipher with different block size */\n        rc = ssh_options_set(s->ssh.session, SSH_OPTIONS_CIPHERS_C_S,\n                             \"aes128-gcm@openssh.com\");\n    } else {\n        /* (out) C->S has 8B block */\n        rc = ssh_options_set(s->ssh.session, SSH_OPTIONS_CIPHERS_C_S,\n                             \"chacha20-poly1305@openssh.com\");\n    }\n    assert_ssh_return_code(s->ssh.session, rc);\n    /* (in) S->C has 16B block */\n    rc = ssh_options_set(s->ssh.session, SSH_OPTIONS_CIPHERS_S_C,\n                         \"aes128-cbc\");\n    assert_ssh_return_code(s->ssh.session, rc);\n\n    rc = ssh_connect(s->ssh.session);\n    assert_ssh_return_code(s->ssh.session, rc);\n\n    c = s->ssh.session->current_crypto;\n    /* The blocks limit is set correctly */\n    /* For S->C (in) we have 16B block => 2**(L/4) blocks */\n    assert_int_equal(c->in_cipher->max_blocks,\n                     (uint64_t)1 << (2 * c->in_cipher->blocksize));\n    if (ssh_fips_mode()) {\n        /* We do not have any FIPS allowed cipher with different block size */\n        assert_int_equal(c->in_cipher->max_blocks,\n                         (uint64_t)1 << (2 * c->in_cipher->blocksize));\n    } else {\n        /* The C->S (out) we have 8B block => 1 GB limit */\n        assert_int_equal(c->out_cipher->max_blocks,\n                         ((uint64_t)1 << 30) / c->out_cipher->blocksize);\n    }\n\n    ssh_disconnect(s->ssh.session);\n}\n\n/* We lower the rekey limits manually and check that the rekey\n * really happens when sending data\n */\nstatic void torture_rekey_send(void **state)\n{\n    struct torture_state *s = *state;\n    int rc;\n    char data[256];\n    unsigned int i;\n    uint64_t bytes = 2048; /* 2KB (more than the authentication phase) */\n    struct ssh_crypto_struct *c = NULL;\n    unsigned char *secret_hash = NULL;\n\n    rc = ssh_options_set(s->ssh.session, SSH_OPTIONS_REKEY_DATA, &bytes);\n    assert_ssh_return_code(s->ssh.session, rc);\n\n    rc = ssh_connect(s->ssh.session);\n    assert_ssh_return_code(s->ssh.session, rc);\n\n    /* The blocks limit is set correctly */\n    c = s->ssh.session->current_crypto;\n    assert_int_equal(c->in_cipher->max_blocks,\n                     bytes / c->in_cipher->blocksize);\n    assert_int_equal(c->out_cipher->max_blocks,\n                     bytes / c->out_cipher->blocksize);\n    /* We should have less encrypted packets than transfered (first are not encrypted) */\n    assert_true(c->out_cipher->packets < s->ssh.session->send_seq);\n    assert_true(c->in_cipher->packets < s->ssh.session->recv_seq);\n    /* Copy the initial secret hash = session_id so we know we changed keys later */\n    secret_hash = malloc(c->digest_len);\n    assert_non_null(secret_hash);\n    memcpy(secret_hash, c->secret_hash, c->digest_len);\n\n    /* OpenSSH can not rekey before authentication so authenticate here */\n    rc = ssh_userauth_none(s->ssh.session, NULL);\n    /* This request should return a SSH_REQUEST_DENIED error */\n    if (rc == SSH_ERROR) {\n        assert_int_equal(ssh_get_error_code(s->ssh.session), SSH_REQUEST_DENIED);\n    }\n    rc = ssh_userauth_list(s->ssh.session, NULL);\n    assert_true(rc & SSH_AUTH_METHOD_PUBLICKEY);\n\n    rc = ssh_userauth_publickey_auto(s->ssh.session, NULL, NULL);\n    assert_int_equal(rc, SSH_AUTH_SUCCESS);\n\n    /* send ignore packets of up to 1KB to trigger rekey */\n    memset(data, 0, sizeof(data));\n    memset(data, 'A', 128);\n    for (i = 0; i < 16; i++) {\n        ssh_send_ignore(s->ssh.session, data);\n        ssh_handle_packets(s->ssh.session, 50);\n    }\n\n    /* The rekey limit was restored in the new crypto to the same value */\n    c = s->ssh.session->current_crypto;\n    assert_int_equal(c->in_cipher->max_blocks, bytes / c->in_cipher->blocksize);\n    assert_int_equal(c->out_cipher->max_blocks, bytes / c->out_cipher->blocksize);\n    /* Check that the secret hash is different than initially */\n    assert_memory_not_equal(secret_hash, c->secret_hash, c->digest_len);\n    free(secret_hash);\n\n    ssh_disconnect(s->ssh.session);\n}\n\n#ifdef WITH_SFTP\nstatic void session_setup_sftp(void **state)\n{\n    struct torture_state *s = *state;\n    int rc;\n\n    rc = ssh_connect(s->ssh.session);\n    assert_ssh_return_code(s->ssh.session, rc);\n\n    /* OpenSSH can not rekey before authentication so authenticate here */\n    rc = ssh_userauth_none(s->ssh.session, NULL);\n    /* This request should return a SSH_REQUEST_DENIED error */\n    if (rc == SSH_ERROR) {\n        assert_int_equal(ssh_get_error_code(s->ssh.session), SSH_REQUEST_DENIED);\n    }\n    rc = ssh_userauth_list(s->ssh.session, NULL);\n    assert_true(rc & SSH_AUTH_METHOD_PUBLICKEY);\n\n    rc = ssh_userauth_publickey_auto(s->ssh.session, NULL, NULL);\n    assert_int_equal(rc, SSH_AUTH_SUCCESS);\n\n    /* Initialize SFTP session */\n    s->ssh.tsftp = torture_sftp_session(s->ssh.session);\n    assert_non_null(s->ssh.tsftp);\n}\n\nuint64_t bytes = 2048; /* 2KB */\n\nstatic int session_setup_sftp_client(void **state)\n{\n    struct torture_state *s = *state;\n    int rc;\n\n    session_setup(state);\n\n    rc = ssh_options_set(s->ssh.session, SSH_OPTIONS_REKEY_DATA, &bytes);\n    assert_ssh_return_code(s->ssh.session, rc);\n\n    session_setup_sftp(state);\n\n    return 0;\n}\n\n#define MAX_XFER_BUF_SIZE 16384\n\n/* To trigger rekey by receiving data, the easiest thing is probably to\n * use sftp\n */\nstatic void torture_rekey_recv(void **state)\n{\n    struct torture_state *s = *state;\n    struct ssh_crypto_struct *c = NULL;\n    unsigned char *secret_hash = NULL;\n\n    char libssh_tmp_file[] = \"/tmp/libssh_sftp_test_XXXXXX\";\n    char buf[MAX_XFER_BUF_SIZE];\n    ssize_t bytesread;\n    ssize_t byteswritten;\n    int fd;\n    sftp_file file;\n    mode_t mask;\n\n    /* The blocks limit is set correctly */\n    c = s->ssh.session->current_crypto;\n    assert_int_equal(c->in_cipher->max_blocks, bytes / c->in_cipher->blocksize);\n    assert_int_equal(c->out_cipher->max_blocks, bytes / c->out_cipher->blocksize);\n    /* We should have less encrypted packets than transfered (first are not encrypted) */\n    assert_true(c->out_cipher->packets < s->ssh.session->send_seq);\n    assert_true(c->in_cipher->packets < s->ssh.session->recv_seq);\n    /* Copy the initial secret hash = session_id so we know we changed keys later */\n    secret_hash = malloc(c->digest_len);\n    assert_non_null(secret_hash);\n    memcpy(secret_hash, c->secret_hash, c->digest_len);\n\n    /* Download a file */\n    file = sftp_open(s->ssh.tsftp->sftp, SSH_EXECUTABLE, O_RDONLY, 0);\n    assert_non_null(file);\n\n    mask = umask(S_IRWXO | S_IRWXG);\n    fd = mkstemp(libssh_tmp_file);\n    umask(mask);\n    unlink(libssh_tmp_file);\n\n    for (;;) {\n        bytesread = sftp_read(file, buf, MAX_XFER_BUF_SIZE);\n        if (bytesread == 0) {\n                break; /* EOF */\n        }\n        assert_false(bytesread < 0);\n\n        byteswritten = write(fd, buf, bytesread);\n        assert_int_equal(byteswritten, bytesread);\n    }\n\n    close(fd);\n\n    /* The rekey limit was restored in the new crypto to the same value */\n    c = s->ssh.session->current_crypto;\n    assert_int_equal(c->in_cipher->max_blocks, bytes / c->in_cipher->blocksize);\n    assert_int_equal(c->out_cipher->max_blocks, bytes / c->out_cipher->blocksize);\n    /* Check that the secret hash is different than initially */\n    assert_memory_not_equal(secret_hash, c->secret_hash, c->digest_len);\n    free(secret_hash);\n\n    torture_sftp_close(s->ssh.tsftp);\n    ssh_disconnect(s->ssh.session);\n}\n#endif /* WITH_SFTP */\n\n/* Rekey time requires rekey after specified time and is off by default.\n * Setting the time to small enough value and waiting, we should trigger\n * rekey on the first sent packet afterward.\n */\nstatic void torture_rekey_time(void **state)\n{\n    struct torture_state *s = *state;\n    int rc;\n    char data[256];\n    unsigned int i;\n    uint32_t time = 3; /* 3 seconds */\n    struct ssh_crypto_struct *c = NULL;\n    unsigned char *secret_hash = NULL;\n\n    rc = ssh_options_set(s->ssh.session, SSH_OPTIONS_REKEY_TIME, &time);\n    assert_ssh_return_code(s->ssh.session, rc);\n    /* The time is internally stored in microseconds */\n    assert_int_equal(time * 1000, s->ssh.session->opts.rekey_time);\n\n    rc = ssh_connect(s->ssh.session);\n    assert_ssh_return_code(s->ssh.session, rc);\n\n    /* Copy the initial secret hash = session_id so we know we changed keys later */\n    c = s->ssh.session->current_crypto;\n    secret_hash = malloc(c->digest_len);\n    assert_non_null(secret_hash);\n    memcpy(secret_hash, c->secret_hash, c->digest_len);\n\n    /* OpenSSH can not rekey before authentication so authenticate here */\n    rc = ssh_userauth_none(s->ssh.session, NULL);\n    /* This request should return a SSH_REQUEST_DENIED error */\n    if (rc == SSH_ERROR) {\n        assert_int_equal(ssh_get_error_code(s->ssh.session), SSH_REQUEST_DENIED);\n    }\n    rc = ssh_userauth_list(s->ssh.session, NULL);\n    assert_true(rc & SSH_AUTH_METHOD_PUBLICKEY);\n\n    rc = ssh_userauth_publickey_auto(s->ssh.session, NULL, NULL);\n    assert_int_equal(rc, SSH_AUTH_SUCCESS);\n\n    /* Send some data. This should not trigger rekey yet */\n    memset(data, 0, sizeof(data));\n    memset(data, 'A', 8);\n    for (i = 0; i < 3; i++) {\n        ssh_send_ignore(s->ssh.session, data);\n        ssh_handle_packets(s->ssh.session, 50);\n    }\n\n    /* Check that the secret hash is the same */\n    c = s->ssh.session->current_crypto;\n    assert_memory_equal(secret_hash, c->secret_hash, c->digest_len);\n\n    /* Wait some more time */\n    sleep(3);\n\n    /* send some more data to trigger rekey and handle the\n     * key exchange \"in background\" */\n    for (i = 0; i < 8; i++) {\n        ssh_send_ignore(s->ssh.session, data);\n        ssh_handle_packets(s->ssh.session, 50);\n    }\n\n    /* Check that the secret hash is different than initially */\n    c = s->ssh.session->current_crypto;\n    assert_memory_not_equal(secret_hash, c->secret_hash, c->digest_len);\n    free(secret_hash);\n\n    ssh_disconnect(s->ssh.session);\n}\n\n/* We lower the rekey limits manually and check that the rekey\n * really happens when sending data\n */\nstatic void torture_rekey_server_send(void **state)\n{\n    struct torture_state *s = *state;\n    int rc;\n    char data[256];\n    unsigned int i;\n    struct ssh_crypto_struct *c = NULL;\n    unsigned char *secret_hash = NULL;\n    const char *sshd_config = \"RekeyLimit 2K none\";\n\n    torture_update_sshd_config(state, sshd_config);\n\n    rc = ssh_connect(s->ssh.session);\n    assert_ssh_return_code(s->ssh.session, rc);\n\n    /* Copy the initial secret hash = session_id so we know we changed keys later */\n    c = s->ssh.session->current_crypto;\n    secret_hash = malloc(c->digest_len);\n    assert_non_null(secret_hash);\n    memcpy(secret_hash, c->secret_hash, c->digest_len);\n\n    /* OpenSSH can not rekey before authentication so authenticate here */\n    rc = ssh_userauth_none(s->ssh.session, NULL);\n    /* This request should return a SSH_REQUEST_DENIED error */\n    if (rc == SSH_ERROR) {\n        assert_int_equal(ssh_get_error_code(s->ssh.session), SSH_REQUEST_DENIED);\n    }\n    rc = ssh_userauth_list(s->ssh.session, NULL);\n    assert_true(rc & SSH_AUTH_METHOD_PUBLICKEY);\n\n    rc = ssh_userauth_publickey_auto(s->ssh.session, NULL, NULL);\n    assert_int_equal(rc, SSH_AUTH_SUCCESS);\n\n    /* send ignore packets of up to 1KB to trigger rekey */\n    memset(data, 0, sizeof(data));\n    memset(data, 'A', 128);\n    for (i = 0; i < 20; i++) {\n        ssh_send_ignore(s->ssh.session, data);\n        ssh_handle_packets(s->ssh.session, 50);\n    }\n\n    /* Check that the secret hash is different than initially */\n    c = s->ssh.session->current_crypto;\n    assert_memory_not_equal(secret_hash, c->secret_hash, c->digest_len);\n    free(secret_hash);\n\n    ssh_disconnect(s->ssh.session);\n}\n\n#ifdef WITH_SFTP\nstatic int session_setup_sftp_server(void **state)\n{\n    const char *sshd_config = \"RekeyLimit 2K none\";\n\n    session_setup(state);\n\n    torture_update_sshd_config(state, sshd_config);\n\n    session_setup_sftp(state);\n\n    return 0;\n}\n\nstatic void torture_rekey_server_recv(void **state)\n{\n    struct torture_state *s = *state;\n    struct ssh_crypto_struct *c = NULL;\n    unsigned char *secret_hash = NULL;\n    char libssh_tmp_file[] = \"/tmp/libssh_sftp_test_XXXXXX\";\n    char buf[MAX_XFER_BUF_SIZE];\n    ssize_t bytesread;\n    ssize_t byteswritten;\n    int fd;\n    sftp_file file;\n    mode_t mask;\n\n    /* Copy the initial secret hash = session_id so we know we changed keys later */\n    c = s->ssh.session->current_crypto;\n    secret_hash = malloc(c->digest_len);\n    assert_non_null(secret_hash);\n    memcpy(secret_hash, c->secret_hash, c->digest_len);\n\n    /* Download a file */\n    file = sftp_open(s->ssh.tsftp->sftp, SSH_EXECUTABLE, O_RDONLY, 0);\n    assert_non_null(file);\n\n    mask = umask(S_IRWXO | S_IRWXG);\n    fd = mkstemp(libssh_tmp_file);\n    umask(mask);\n    unlink(libssh_tmp_file);\n\n    for (;;) {\n        bytesread = sftp_read(file, buf, MAX_XFER_BUF_SIZE);\n        if (bytesread == 0) {\n                break; /* EOF */\n        }\n        assert_false(bytesread < 0);\n\n        byteswritten = write(fd, buf, bytesread);\n        assert_int_equal(byteswritten, bytesread);\n    }\n\n    close(fd);\n\n    /* Check that the secret hash is different than initially */\n    c = s->ssh.session->current_crypto;\n    assert_memory_not_equal(secret_hash, c->secret_hash, c->digest_len);\n    free(secret_hash);\n\n    torture_sftp_close(s->ssh.tsftp);\n    ssh_disconnect(s->ssh.session);\n}\n#endif /* WITH_SFTP */\n\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_rekey_default,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_rekey_time,\n                                        session_setup,\n                                        session_teardown),\n#ifdef WITH_SFTP\n        cmocka_unit_test_setup_teardown(torture_rekey_recv,\n                                        session_setup_sftp_client,\n                                        session_teardown),\n#endif /* WITH_SFTP */\n        cmocka_unit_test_setup_teardown(torture_rekey_send,\n                                        session_setup,\n                                        session_teardown),\n        /* Note, that this modifies the sshd_config */\n        cmocka_unit_test_setup_teardown(torture_rekey_server_send,\n                                        session_setup,\n                                        session_teardown),\n#ifdef WITH_SFTP\n        cmocka_unit_test_setup_teardown(torture_rekey_server_recv,\n                                        session_setup_sftp_server,\n                                        session_teardown),\n#endif /* WITH_SFTP */\n        /* TODO verify the two rekey are possible and the states are not broken after rekey */\n    };\n\n    ssh_init();\n\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, sshd_setup, sshd_teardown);\n\n    ssh_finalize();\n\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/client/torture_request_env.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2013 by Andreas Schneider <asn@cryptomilk.org>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include \"torture.h\"\n#include <libssh/libssh.h>\n\n#include <sys/types.h>\n#include <pwd.h>\n#include <errno.h>\n\nstatic int sshd_setup(void **state)\n{\n    torture_setup_sshd_server(state, false);\n\n    return 0;\n}\n\nstatic int sshd_teardown(void **state) {\n    torture_teardown_sshd_server(state);\n\n    return 0;\n}\n\nstatic int session_setup(void **state)\n{\n    struct torture_state *s = *state;\n    struct passwd *pwd;\n    int rc;\n\n    pwd = getpwnam(\"bob\");\n    assert_non_null(pwd);\n\n    rc = setuid(pwd->pw_uid);\n    assert_return_code(rc, errno);\n\n    s->ssh.session = torture_ssh_session(s,\n                                         TORTURE_SSH_SERVER,\n                                         NULL,\n                                         TORTURE_SSH_USER_ALICE,\n                                         NULL);\n    assert_non_null(s->ssh.session);\n\n    return 0;\n}\n\nstatic int session_teardown(void **state)\n{\n    struct torture_state *s = *state;\n\n    ssh_disconnect(s->ssh.session);\n    ssh_free(s->ssh.session);\n\n    return 0;\n}\n\nstatic void torture_request_env(void **state)\n{\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    ssh_channel c;\n    char buffer[4096] = {0};\n    int nbytes;\n    int rc;\n    int lang_found = 0;\n\n    c = ssh_channel_new(session);\n    assert_non_null(c);\n\n    rc = ssh_channel_open_session(c);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_channel_request_env(c, \"LC_LIBSSH\", \"LIBSSH_EXPORTED_VARIABLE\");\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_channel_request_exec(c, \"echo $LC_LIBSSH\");\n    assert_ssh_return_code(session, rc);\n\n    nbytes = ssh_channel_read(c, buffer, sizeof(buffer) - 1, 0);\n    printf(\"nbytes=%d\\n\", nbytes);\n    while (nbytes > 0) {\n#if 1\n        rc = fwrite(buffer, 1, nbytes, stdout);\n        assert_int_equal(rc, nbytes);\n#endif\n        buffer[nbytes]='\\0';\n        if (strstr(buffer, \"LIBSSH_EXPORTED_VARIABLE\")) {\n            lang_found = 1;\n            break;\n        }\n\n        nbytes = ssh_channel_read(c, buffer, sizeof(buffer), 0);\n    }\n    assert_int_equal(lang_found, 1);\n\n    ssh_channel_close(c);\n}\n\nint torture_run_tests(void) {\n    int rc;\n\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_request_env,\n                                        session_setup,\n                                        session_teardown),\n    };\n\n    ssh_init();\n\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, sshd_setup, sshd_teardown);\n\n    ssh_finalize();\n    return rc;\n}\n\n"
  },
  {
    "path": "src/libssh/tests/client/torture_scp.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2019 by Red Hat, Inc.\n *\n * Author: Anderson Toshiyuki Sasaki <ansasaki@redhat.com>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#define LIBSSH_STATIC\n\n#include \"config.h\"\n\n#include \"torture.h\"\n#include \"libssh/scp.h\"\n\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <fcntl.h>\n#include <pwd.h>\n#include <errno.h>\n\n#define BUF_SIZE 1024\n\n#define TEMPLATE BINARYDIR \"/tests/home/alice/temp_dir_XXXXXX\"\n#define ALICE_HOME BINARYDIR \"/tests/home/alice\"\n\nstruct scp_st {\n    struct torture_state *s;\n    char *tmp_dir;\n    char *tmp_dir_basename;\n};\n\nstatic int sshd_setup(void **state)\n{\n    struct scp_st *ts = NULL;\n    struct torture_state *s = NULL;\n\n    ts = (struct scp_st *)calloc(1, sizeof(struct scp_st));\n    assert_non_null(ts);\n\n    torture_setup_sshd_server((void **)&s, false);\n    assert_non_null(s);\n\n    ts->s = s;\n\n    *state = ts;\n\n    return 0;\n}\n\nstatic int sshd_teardown(void **state)\n{\n    struct scp_st *ts = NULL;\n\n    ts = *((struct scp_st **)state);\n    assert_non_null(ts);\n    assert_non_null(ts->s);\n\n    torture_teardown_sshd_server((void **)&(ts->s));\n\n    SAFE_FREE(ts);\n\n    return 0;\n}\n\nstatic int session_setup(void **state)\n{\n    struct scp_st *ts = NULL;\n    struct torture_state *s = NULL;\n\n    char *tmp_dir = NULL;\n    char *tmp_dir_basename = NULL;\n\n    struct passwd *pwd;\n\n    int rc;\n\n    assert_non_null(state);\n\n    ts = *state;\n\n    assert_non_null(ts);\n    assert_non_null(ts->s);\n\n    s = ts->s;\n\n    /* Create temporary directory for alice */\n    tmp_dir = torture_make_temp_dir(TEMPLATE);\n    assert_non_null(tmp_dir);\n    ts->tmp_dir = tmp_dir;\n\n    tmp_dir_basename = ssh_basename(tmp_dir);\n    assert_non_null(tmp_dir_basename);\n    ts->tmp_dir_basename = tmp_dir_basename;\n\n    pwd = getpwnam(\"bob\");\n    assert_non_null(pwd);\n\n    rc = setuid(pwd->pw_uid);\n    assert_return_code(rc, errno);\n\n    s->ssh.session = torture_ssh_session(s,\n                                         TORTURE_SSH_SERVER,\n                                         NULL,\n                                         TORTURE_SSH_USER_ALICE,\n                                         NULL);\n    assert_non_null(s->ssh.session);\n\n    return 0;\n}\n\nstatic int session_teardown(void **state)\n{\n    struct scp_st *ts = NULL;\n    struct torture_state *s = NULL;\n\n    assert_non_null(state);\n    ts = *((struct scp_st **)state);\n\n    assert_non_null(ts->s);\n    s = ts->s;\n\n    ssh_disconnect(s->ssh.session);\n    ssh_free(s->ssh.session);\n\n    assert_non_null(ts->tmp_dir);\n    torture_rmdirs(ts->tmp_dir);\n\n    SAFE_FREE(ts->tmp_dir);\n    SAFE_FREE(ts->tmp_dir_basename);\n\n    return 0;\n}\n\nstatic void torture_scp_upload(void **state)\n{\n    struct scp_st *ts = NULL;\n    struct torture_state *s = NULL;\n\n    ssh_session session = NULL;\n    ssh_scp scp = NULL;\n\n    char expected_a[BUF_SIZE];\n    char buf[BUF_SIZE];\n    FILE *file = NULL;\n    size_t len = 0;\n    int rc;\n\n    assert_non_null(state);\n    ts = *state;\n\n    assert_non_null(ts->s);\n    s = ts->s;\n\n    session = s->ssh.session;\n    assert_non_null(session);\n\n    assert_non_null(ts->tmp_dir_basename);\n    assert_non_null(ts->tmp_dir);\n\n    /* Upload file \"a\" to alice's temp dir */\n\n    /* When writing the file_name must be the directory name */\n    scp = ssh_scp_new(session, SSH_SCP_WRITE, ts->tmp_dir_basename);\n    assert_non_null(scp);\n\n    rc = ssh_scp_init(scp);\n    assert_ssh_return_code(session, rc);\n\n    /* Init buffer content to be written */\n    memset(expected_a, 'A', BUF_SIZE);\n\n    /* For ssh_scp_push_file(), the file_name is the name of the file without\n     * path */\n    rc = ssh_scp_push_file(scp, \"a\", BUF_SIZE, 0644);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_scp_write(scp, expected_a, BUF_SIZE);\n    assert_ssh_return_code(session, rc);\n\n    /* Cleanup */\n    ssh_scp_close(scp);\n    ssh_scp_free(scp);\n\n    /* Open file and check content */\n    snprintf(buf, BUF_SIZE, \"%s/a\", ts->tmp_dir);\n\n    file = fopen(buf, \"r\");\n    assert_non_null(file);\n\n    len = fread(buf, BUF_SIZE, 1, file);\n    assert_int_equal(len, 1);\n    assert_memory_equal(buf, expected_a, BUF_SIZE);\n\n    fclose(file);\n}\n\nstatic void torture_scp_upload_recursive(void **state)\n{\n    struct scp_st *ts = NULL;\n    struct torture_state *s = NULL;\n\n    ssh_session session = NULL;\n    ssh_scp scp = NULL;\n\n    char expected_b[BUF_SIZE];\n    char buf[BUF_SIZE];\n    FILE *file = NULL;\n    size_t len = 0;\n\n    int rc;\n\n    assert_non_null(state);\n    ts = *state;\n\n    assert_non_null(ts->s);\n    s = ts->s;\n\n    session = s->ssh.session;\n    assert_non_null(session);\n\n    assert_non_null(ts->tmp_dir_basename);\n    assert_non_null(ts->tmp_dir);\n\n    /* Upload directory \"test_dir\" containing file \"b\" to alice's temp dir */\n\n    /* When writing the file_name must be the directory name */\n    scp = ssh_scp_new(session, SSH_SCP_WRITE | SSH_SCP_RECURSIVE,\n                      ts->tmp_dir_basename);\n    assert_non_null(scp);\n\n    rc = ssh_scp_init(scp);\n    assert_ssh_return_code(session, rc);\n\n    /* Push directory where the new file will be copied */\n    rc = ssh_scp_push_directory(scp, \"test_dir\", 0755);\n    assert_ssh_return_code(session, rc);\n\n    memset(expected_b, 'B', BUF_SIZE);\n\n    /* For ssh_scp_push_file(), the file_name is the name of the file without\n     * path */\n    rc = ssh_scp_push_file(scp, \"b\", BUF_SIZE, 0644);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_scp_write(scp, expected_b, BUF_SIZE);\n    assert_ssh_return_code(session, rc);\n\n    /* Leave the directory */\n    rc = ssh_scp_leave_directory(scp);\n    assert_ssh_return_code(session, rc);\n\n    /* Cleanup */\n    ssh_scp_close(scp);\n    ssh_scp_free(scp);\n\n    /* Open file and check content */\n    snprintf(buf, BUF_SIZE, \"%s/test_dir/b\", ts->tmp_dir);\n\n    file = fopen(buf, \"r\");\n    assert_non_null(file);\n\n    len = fread(buf, BUF_SIZE, 1, file);\n    assert_int_equal(len, 1);\n    assert_memory_equal(buf, expected_b, BUF_SIZE);\n\n    fclose(file);\n}\n\nstatic void torture_scp_download(void **state)\n{\n    struct scp_st *ts = NULL;\n    struct torture_state *s = NULL;\n\n    ssh_session session = NULL;\n    ssh_scp scp = NULL;\n\n    char expected_a[BUF_SIZE];\n    char buf[BUF_SIZE];\n    const char *remote_file = NULL;\n\n    FILE *file = NULL;\n    int fd = 0;\n\n    size_t size;\n\n    int mode;\n    int rc;\n\n    assert_non_null(state);\n\n    ts = *state;\n\n    assert_non_null(ts);\n    assert_non_null(ts->s);\n\n    s = ts->s;\n\n    session = s->ssh.session;\n    assert_non_null(session);\n\n    assert_non_null(ts->tmp_dir_basename);\n    assert_non_null(ts->tmp_dir);\n\n    /* Create file \"a\" for alice */\n    memset(expected_a, 'A', BUF_SIZE);\n\n    snprintf(buf, BUF_SIZE, \"%s/a\", ts->tmp_dir);\n\n    fd = open(buf, O_WRONLY | O_CREAT, 0644);\n    assert_true(fd > 0);\n\n    file = fdopen(fd, \"w\");\n    assert_non_null(file);\n\n    size = fwrite(expected_a, 1, BUF_SIZE, file);\n    assert_int_equal(size, BUF_SIZE);\n    fclose(file);\n\n    /* Construct the file path */\n    snprintf(buf, BUF_SIZE, \"%s/a\", ts->tmp_dir_basename);\n\n    /* When reading, the location is the file path */\n    scp = ssh_scp_new(session, SSH_SCP_READ, buf);\n    assert_non_null(scp);\n\n    rc = ssh_scp_init(scp);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_scp_pull_request(scp);\n    assert_int_equal(rc, SSH_SCP_REQUEST_NEWFILE);\n\n    size = ssh_scp_request_get_size(scp);\n    assert_int_equal(size, BUF_SIZE);\n\n    mode = ssh_scp_request_get_permissions(scp);\n    assert_int_equal(mode, 0644);\n\n    remote_file = ssh_scp_request_get_filename(scp);\n    assert_non_null(remote_file);\n    assert_string_equal(remote_file, \"a\");\n\n    rc = ssh_scp_accept_request(scp);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_scp_read(scp, buf, BUF_SIZE);\n    assert_int_equal(rc, size);\n\n    assert_memory_equal(expected_a, buf, BUF_SIZE);\n\n    /* Cleanup */\n    ssh_scp_close(scp);\n    ssh_scp_free(scp);\n}\n\nstatic void torture_scp_download_recursive(void **state)\n{\n    struct scp_st *ts = NULL;\n    struct torture_state *s = NULL;\n\n    ssh_session session = NULL;\n    ssh_scp scp = NULL;\n\n    char expected_b[BUF_SIZE];\n    char buf[BUF_SIZE];\n    const char *remote_file = NULL;\n    FILE *file = NULL;\n    int fd = 0;\n\n    size_t size;\n\n    int mode;\n    int rc;\n\n    assert_non_null(state);\n    ts = *state;\n\n    assert_non_null(ts->s);\n    s = ts->s;\n\n    session = s->ssh.session;\n    assert_non_null(session);\n\n    assert_non_null(ts->tmp_dir_basename);\n    assert_non_null(ts->tmp_dir);\n\n    /* Create file \"b\" for alice */\n    memset(expected_b, 'B', BUF_SIZE);\n\n    snprintf(buf, BUF_SIZE, \"%s/b\", ts->tmp_dir);\n\n    fd = open(buf, O_WRONLY | O_CREAT, 0644);\n    assert_true(fd > 0);\n\n    file = fdopen(fd, \"w\");\n    assert_non_null(file);\n\n    size = fwrite(expected_b, 1, BUF_SIZE, file);\n    assert_int_equal(size, BUF_SIZE);\n    fclose(file);\n\n    /* Copy the directory containing the file \"b\" */\n    scp = ssh_scp_new(session, SSH_SCP_READ | SSH_SCP_RECURSIVE,\n                      ts->tmp_dir_basename);\n    assert_non_null(scp);\n\n    rc = ssh_scp_init(scp);\n    assert_ssh_return_code(session, rc);\n\n    /* Receive the directory */\n    rc = ssh_scp_pull_request(scp);\n    assert_int_equal(rc, SSH_SCP_REQUEST_NEWDIR);\n\n    mode = ssh_scp_request_get_permissions(scp);\n    assert_int_equal(mode, 0700);\n\n    remote_file = ssh_scp_request_get_filename(scp);\n    assert_non_null(remote_file);\n    assert_string_equal(remote_file, ts->tmp_dir_basename);\n\n    rc = ssh_scp_accept_request(scp);\n    assert_ssh_return_code(session, rc);\n\n    /* Receive the file \"b\" */\n    rc = ssh_scp_pull_request(scp);\n    assert_int_equal(rc, SSH_SCP_REQUEST_NEWFILE);\n\n    size = ssh_scp_request_get_size(scp);\n    assert_int_equal(size, BUF_SIZE);\n\n    mode = ssh_scp_request_get_permissions(scp);\n    assert_int_equal(mode, 0644);\n\n    remote_file = ssh_scp_request_get_filename(scp);\n    assert_non_null(remote_file);\n    assert_string_equal(remote_file, \"b\");\n\n    rc = ssh_scp_accept_request(scp);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_scp_read(scp, buf, BUF_SIZE);\n    assert_int_equal(rc, size);\n\n    /* Check if the content was the expected */\n    assert_memory_equal(expected_b, buf, BUF_SIZE);\n\n    /* Receive end of directory */\n    rc = ssh_scp_pull_request(scp);\n    assert_int_equal(rc, SSH_SCP_REQUEST_ENDDIR);\n\n    /* Receive end of communication */\n    rc = ssh_scp_pull_request(scp);\n    assert_int_equal(rc, SSH_SCP_REQUEST_EOF);\n\n    /* Cleanup */\n    ssh_scp_close(scp);\n    ssh_scp_free(scp);\n}\n\nstatic void torture_scp_upload_newline(void **state)\n{\n    struct scp_st *ts = NULL;\n    struct torture_state *s = NULL;\n\n    ssh_session session = NULL;\n    ssh_scp scp = NULL;\n\n    FILE *file = NULL;\n\n    char buf[1024];\n    char *rs = NULL;\n    int rc;\n\n    assert_non_null(state);\n    ts = *state;\n\n    assert_non_null(ts->s);\n    s = ts->s;\n\n    session = s->ssh.session;\n    assert_non_null(session);\n\n    assert_non_null(ts->tmp_dir_basename);\n    assert_non_null(ts->tmp_dir);\n\n    /* Upload recursively trying to inject protocol messages */\n\n    /* When writing the file_name must be the directory name */\n    scp = ssh_scp_new(session, SSH_SCP_WRITE | SSH_SCP_RECURSIVE,\n                      ts->tmp_dir_basename);\n    assert_non_null(scp);\n\n    rc = ssh_scp_init(scp);\n    assert_ssh_return_code(session, rc);\n\n    /* Push directory where the new file will be copied */\n    rc = ssh_scp_push_directory(scp, \"test_inject\", 0755);\n    assert_ssh_return_code(session, rc);\n\n    /* Try to push file with injected protocol messages */\n    rc = ssh_scp_push_file(scp, \"original\\nreplacedC0777 8 injected\", 8, 0644);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_scp_write(scp, \"original\", 8);\n    assert_ssh_return_code(session, rc);\n\n    /* Leave the directory */\n    rc = ssh_scp_leave_directory(scp);\n    assert_ssh_return_code(session, rc);\n\n    /* Cleanup */\n    ssh_scp_close(scp);\n    ssh_scp_free(scp);\n\n    /* Open the file and check content */\n    snprintf(buf, BUF_SIZE, \"%s/test_inject/\"\n             \"original\\\\nreplacedC0777 8 injected\",\n             ts->tmp_dir);\n    file = fopen(buf, \"r\");\n    assert_non_null(file);\n\n    rs = fgets(buf, 1024, file);\n    assert_non_null(rs);\n    assert_string_equal(buf, \"original\");\n\n    fclose(file);\n}\n\nstatic void torture_scp_upload_appended_command(void **state)\n{\n    struct scp_st *ts = NULL;\n    struct torture_state *s = NULL;\n\n    ssh_session session = NULL;\n    ssh_scp scp = NULL;\n\n    FILE *file = NULL;\n\n    char buf[1024];\n    char *rs = NULL;\n    int rc;\n\n    assert_non_null(state);\n    ts = *state;\n\n    assert_non_null(ts->s);\n    s = ts->s;\n\n    session = s->ssh.session;\n    assert_non_null(session);\n\n    assert_non_null(ts->tmp_dir_basename);\n    assert_non_null(ts->tmp_dir);\n\n    /* Upload a file path with a command appended */\n\n    /* Append a command to the file path */\n    snprintf(buf, BUF_SIZE, \"%s\"\n             \"/;touch hack\",\n             ts->tmp_dir);\n\n    /* When writing the file_name must be the directory name */\n    scp = ssh_scp_new(session, SSH_SCP_WRITE | SSH_SCP_RECURSIVE,\n                      buf);\n    assert_non_null(scp);\n\n    rc = ssh_scp_init(scp);\n    assert_ssh_return_code(session, rc);\n\n    /* Push directory where the new file will be copied */\n    rc = ssh_scp_push_directory(scp, \";touch hack\", 0755);\n    assert_ssh_return_code(session, rc);\n\n    /* Try to push file */\n    rc = ssh_scp_push_file(scp, \"original\", 8, 0644);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_scp_write(scp, \"original\", 8);\n    assert_ssh_return_code(session, rc);\n\n    /* Leave the directory */\n    rc = ssh_scp_leave_directory(scp);\n    assert_ssh_return_code(session, rc);\n\n    /* Cleanup */\n    ssh_scp_close(scp);\n    ssh_scp_free(scp);\n\n    /* Make sure the command was not executed */\n    snprintf(buf, BUF_SIZE, ALICE_HOME \"/hack\");\n    file = fopen(buf, \"r\");\n    assert_null(file);\n\n    /* Open the file and check content */\n    snprintf(buf, BUF_SIZE, \"%s\"\n             \"/;touch hack/original\",\n             ts->tmp_dir);\n\n    file = fopen(buf, \"r\");\n    assert_non_null(file);\n\n    rs = fgets(buf, 1024, file);\n    assert_non_null(rs);\n    assert_string_equal(buf, \"original\");\n\n    fclose(file);\n}\n\nint torture_run_tests(void)\n{\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_scp_upload,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_scp_upload_recursive,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_scp_download,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_scp_download_recursive,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_scp_upload_newline,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_scp_upload_appended_command,\n                                        session_setup,\n                                        session_teardown),\n    };\n\n    ssh_init();\n\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, sshd_setup, sshd_teardown);\n    ssh_finalize();\n\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/client/torture_session.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2012 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include \"torture.h\"\n#include \"libssh/libssh.h\"\n#include \"libssh/priv.h\"\n#include \"libssh/session.h\"\n\n#include <sys/types.h>\n#include <pwd.h>\n#include <errno.h>\n\n#define BUFLEN 4096\nstatic char buffer[BUFLEN];\n\nstatic int sshd_setup(void **state)\n{\n    torture_setup_sshd_server(state, false);\n\n    return 0;\n}\n\nstatic int sshd_teardown(void **state) {\n    torture_teardown_sshd_server(state);\n\n    return 0;\n}\n\nstatic int session_setup(void **state)\n{\n    struct torture_state *s = *state;\n    struct passwd *pwd;\n    int rc;\n\n    pwd = getpwnam(\"bob\");\n    assert_non_null(pwd);\n\n    rc = setuid(pwd->pw_uid);\n    assert_return_code(rc, errno);\n\n    s->ssh.session = torture_ssh_session(s,\n                                         TORTURE_SSH_SERVER,\n                                         NULL,\n                                         TORTURE_SSH_USER_ALICE,\n                                         NULL);\n    assert_non_null(s->ssh.session);\n\n    return 0;\n}\n\nstatic int session_teardown(void **state)\n{\n    struct torture_state *s = *state;\n\n    ssh_disconnect(s->ssh.session);\n    ssh_free(s->ssh.session);\n\n    return 0;\n}\n\nstatic void torture_channel_read_error(void **state) {\n    struct torture_state *s = *state;\n    ssh_session session = s->ssh.session;\n    ssh_channel channel;\n    int rc;\n    int fd;\n    int i;\n\n    channel = ssh_channel_new(session);\n    assert_non_null(channel);\n\n    rc = ssh_channel_open_session(channel);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_channel_request_exec(channel, \"hexdump -C /dev/urandom\");\n    assert_ssh_return_code(session, rc);\n\n    /* send crap and for server to send us a disconnect */\n    fd = ssh_get_fd(session);\n    assert_true(fd > 2);\n    rc = write(fd, \"AAAA\", 4);\n    assert_int_equal(rc, 4);\n\n    for (i=0;i<20;++i){\n        rc = ssh_channel_read(channel,buffer,sizeof(buffer),0);\n        if (rc == SSH_ERROR)\n            break;\n    }\n#if OPENSSH_VERSION_MAJOR == 6 && OPENSSH_VERSION_MINOR >= 7\n    /* With openssh 6.7 this doesn't produce and error anymore */\n    assert_ssh_return_code(session, rc);\n#else\n    assert_ssh_return_code_equal(session, rc, SSH_ERROR);\n#endif\n\n    ssh_channel_free(channel);\n}\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_channel_read_error,\n                                        session_setup,\n                                        session_teardown),\n    };\n\n    ssh_init();\n\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, sshd_setup, sshd_teardown);\n    ssh_finalize();\n\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/client/torture_sftp_benchmark.c",
    "content": "#define LIBSSH_STATIC\n\n#include \"config.h\"\n\n#include \"torture.h\"\n#include \"sftp.c\"\n\n#include <sys/types.h>\n#include <pwd.h>\n#include <errno.h>\n\n#define MAX_XFER_BUF_SIZE 16384\n\nstatic int sshd_setup(void **state)\n{\n    torture_setup_sshd_server(state, false);\n\n    return 0;\n}\n\nstatic int sshd_teardown(void **state) {\n    torture_teardown_sshd_server(state);\n\n    return 0;\n}\n\nstatic int session_setup(void **state)\n{\n    struct torture_state *s = *state;\n    struct passwd *pwd;\n    int rc;\n\n    pwd = getpwnam(\"bob\");\n    assert_non_null(pwd);\n\n    rc = setuid(pwd->pw_uid);\n    assert_return_code(rc, errno);\n\n    s->ssh.session = torture_ssh_session(s,\n                                         TORTURE_SSH_SERVER,\n                                         NULL,\n                                         TORTURE_SSH_USER_ALICE,\n                                         NULL);\n    assert_non_null(s->ssh.session);\n\n    s->ssh.tsftp = torture_sftp_session(s->ssh.session);\n    assert_non_null(s->ssh.tsftp);\n\n    return 0;\n}\n\nstatic int session_teardown(void **state)\n{\n    struct torture_state *s = *state;\n\n    torture_rmdirs(s->ssh.tsftp->testdir);\n    torture_sftp_close(s->ssh.tsftp);\n    ssh_disconnect(s->ssh.session);\n    ssh_free(s->ssh.session);\n\n    return 0;\n}\n\nstatic void torture_sftp_benchmark_write_read(void **state)\n{\n    struct torture_state *s = *state;\n    struct torture_sftp *t = s->ssh.tsftp;\n    sftp_session sftp = t->sftp;\n    ssh_session session = s->ssh.session;\n    sftp_file file = NULL;\n    struct stat sb = {\n        .st_size = 0,\n    };\n    uint8_t buf_16k[MAX_XFER_BUF_SIZE];\n    char local_path[1024] = {0};\n    ssize_t bwritten, nread;\n    size_t i;\n    int rc;\n\n    memset(buf_16k, 'X', sizeof(buf_16k));\n\n    snprintf(local_path, sizeof(local_path), \"%s/128M.dat\", t->testdir);\n\n    file = sftp_open(sftp, local_path, O_CREAT|O_WRONLY|O_TRUNC, 0644);\n    assert_non_null(file);\n\n    /* Write 128M */\n    for (i = 0; i < 0x2000; i++) {\n        bwritten = sftp_write(file, buf_16k, sizeof(buf_16k));\n        assert_int_equal(bwritten, sizeof(buf_16k));\n    }\n\n    rc = sftp_close(file);\n    assert_ssh_return_code(session, rc);\n\n    /* Check that 128M has been written */\n    rc = stat(local_path, &sb);\n    assert_int_equal(sb.st_size, 0x8000000);\n\n    file = sftp_open(sftp, local_path, O_RDONLY, 0);\n    assert_non_null(file);\n\n    for (;;) {\n        nread = sftp_read(file, buf_16k, sizeof(buf_16k));\n        if (nread == 0) {\n            break; /* EOF */\n        }\n        assert_int_equal(nread, sizeof(buf_16k));\n    }\n\n    rc = sftp_close(file);\n    assert_ssh_return_code(session, rc);\n\n    unlink(local_path);\n}\n\nint torture_run_tests(void)\n{\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_sftp_benchmark_write_read,\n                                        session_setup,\n                                        session_teardown)\n    };\n\n    ssh_init();\n\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, sshd_setup, sshd_teardown);\n    ssh_finalize();\n\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/client/torture_sftp_canonicalize_path.c",
    "content": "#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include \"torture.h\"\n#include \"sftp.c\"\n\n#include <sys/types.h>\n#include <pwd.h>\n#include <errno.h>\n\nstatic int sshd_setup(void **state)\n{\n    torture_setup_sshd_server(state, false);\n\n    return 0;\n}\n\nstatic int sshd_teardown(void **state) {\n    torture_teardown_sshd_server(state);\n\n    return 0;\n}\n\nstatic int session_setup(void **state)\n{\n    struct torture_state *s = *state;\n    struct passwd *pwd;\n    int rc;\n\n    pwd = getpwnam(\"bob\");\n    assert_non_null(pwd);\n\n    rc = setuid(pwd->pw_uid);\n    assert_return_code(rc, errno);\n\n    s->ssh.session = torture_ssh_session(s,\n                                         TORTURE_SSH_SERVER,\n                                         NULL,\n                                         TORTURE_SSH_USER_ALICE,\n                                         NULL);\n    assert_non_null(s->ssh.session);\n\n    s->ssh.tsftp = torture_sftp_session(s->ssh.session);\n    assert_non_null(s->ssh.tsftp);\n\n    return 0;\n}\n\nstatic int session_teardown(void **state)\n{\n    struct torture_state *s = *state;\n\n    torture_rmdirs(s->ssh.tsftp->testdir);\n    torture_sftp_close(s->ssh.tsftp);\n    ssh_disconnect(s->ssh.session);\n    ssh_free(s->ssh.session);\n\n    return 0;\n}\n\nstatic void torture_sftp_canonicalize_path(void **state)\n{\n    struct torture_state *s = *state;\n    struct torture_sftp *t = s->ssh.tsftp;\n    struct passwd *pwd = NULL;\n    char *canonicalized_path = NULL;\n\n    pwd = getpwnam(TORTURE_SSH_USER_ALICE);\n    assert_non_null(pwd);\n\n    canonicalized_path = sftp_canonicalize_path(t->sftp, \".\");\n    assert_non_null(canonicalized_path);\n\n    assert_string_equal(canonicalized_path, pwd->pw_dir);\n\n    SSH_STRING_FREE_CHAR(canonicalized_path);\n}\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_sftp_canonicalize_path,\n                                        session_setup,\n                                        session_teardown)\n    };\n\n    ssh_init();\n\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, sshd_setup, sshd_teardown);\n\n    ssh_finalize();\n\n    return rc;\n}\n\n"
  },
  {
    "path": "src/libssh/tests/client/torture_sftp_dir.c",
    "content": "#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include \"torture.h\"\n#include \"sftp.c\"\n\n#include <sys/types.h>\n#include <pwd.h>\n#include <errno.h>\n\nstatic int sshd_setup(void **state)\n{\n    torture_setup_sshd_server(state, false);\n\n    return 0;\n}\n\nstatic int sshd_teardown(void **state) {\n    torture_teardown_sshd_server(state);\n\n    return 0;\n}\n\nstatic int session_setup(void **state)\n{\n    struct torture_state *s = *state;\n    struct passwd *pwd;\n    int rc;\n\n    pwd = getpwnam(\"bob\");\n    assert_non_null(pwd);\n\n    rc = setuid(pwd->pw_uid);\n    assert_return_code(rc, errno);\n\n    s->ssh.session = torture_ssh_session(s,\n                                         TORTURE_SSH_SERVER,\n                                         NULL,\n                                         TORTURE_SSH_USER_ALICE,\n                                         NULL);\n    assert_non_null(s->ssh.session);\n\n    s->ssh.tsftp = torture_sftp_session(s->ssh.session);\n    assert_non_null(s->ssh.tsftp);\n\n    return 0;\n}\n\nstatic int session_teardown(void **state)\n{\n    struct torture_state *s = *state;\n\n    torture_rmdirs(s->ssh.tsftp->testdir);\n    torture_sftp_close(s->ssh.tsftp);\n    ssh_disconnect(s->ssh.session);\n    ssh_free(s->ssh.session);\n\n    return 0;\n}\n\nstatic void torture_sftp_mkdir(void **state) {\n    struct torture_state *s = *state;\n\n    struct torture_sftp *t = s->ssh.tsftp;\n    char tmpdir[128] = {0};\n    int rc;\n\n    assert_non_null(t);\n\n    snprintf(tmpdir, sizeof(tmpdir) - 1, \"%s/mkdir_test\", t->testdir);\n\n    rc = sftp_mkdir(t->sftp, tmpdir, 0755);\n    if(rc != SSH_OK)\n        fprintf(stderr,\"error:%s\\n\",ssh_get_error(t->sftp->session));\n    assert_true(rc == 0);\n\n    /* check if it really has been created */\n    assert_true(torture_isdir(tmpdir));\n\n    rc = sftp_rmdir(t->sftp, tmpdir);\n    assert_true(rc == 0);\n\n    /* check if it has been deleted */\n    assert_false(torture_isdir(tmpdir));\n}\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_sftp_mkdir,\n                                        session_setup,\n                                        session_teardown)\n    };\n\n    ssh_init();\n\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, sshd_setup, sshd_teardown);\n\n    ssh_finalize();\n\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/client/torture_sftp_ext.c",
    "content": "#define LIBSSH_STATIC\n\n#include \"config.h\"\n\n#include \"torture.h\"\n#include \"sftp.c\"\n\nstatic void torture_sftp_ext_new(void **state) {\n    sftp_ext x;\n\n    (void) state;\n\n    x = sftp_ext_new();\n    assert_non_null(x);\n    assert_int_equal(x->count, 0);\n    assert_null(x->name);\n    assert_null(x->data);\n\n    sftp_ext_free(x);\n}\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test(torture_sftp_ext_new),\n    };\n\n    ssh_init();\n\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, NULL, NULL);\n    ssh_finalize();\n\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/client/torture_sftp_fsync.c",
    "content": "#define LIBSSH_STATIC\n\n#include \"config.h\"\n\n#include \"torture.h\"\n#include \"sftp.c\"\n\n#include <sys/types.h>\n#include <pwd.h>\n#include <errno.h>\n\n#define MAX_XFER_BUF_SIZE 16384\n\nstatic int sshd_setup(void **state)\n{\n    torture_setup_sshd_server(state, false);\n\n    return 0;\n}\n\nstatic int sshd_teardown(void **state) {\n    torture_teardown_sshd_server(state);\n\n    return 0;\n}\n\nstatic int session_setup(void **state)\n{\n    struct torture_state *s = *state;\n    struct passwd *pwd;\n    int rc;\n\n    pwd = getpwnam(\"bob\");\n    assert_non_null(pwd);\n\n    rc = setuid(pwd->pw_uid);\n    assert_return_code(rc, errno);\n\n    s->ssh.session = torture_ssh_session(s,\n                                         TORTURE_SSH_SERVER,\n                                         NULL,\n                                         TORTURE_SSH_USER_ALICE,\n                                         NULL);\n    assert_non_null(s->ssh.session);\n\n    s->ssh.tsftp = torture_sftp_session(s->ssh.session);\n    assert_non_null(s->ssh.tsftp);\n\n    return 0;\n}\n\nstatic int session_teardown(void **state)\n{\n    struct torture_state *s = *state;\n\n    torture_rmdirs(s->ssh.tsftp->testdir);\n    torture_sftp_close(s->ssh.tsftp);\n    ssh_disconnect(s->ssh.session);\n    ssh_free(s->ssh.session);\n\n    return 0;\n}\n\nstatic void torture_sftp_fsync(void **state) {\n    struct torture_state *s = *state;\n    struct torture_sftp *t = s->ssh.tsftp;\n\n    char libssh_tmp_file[] = \"/tmp/libssh_sftp_test_XXXXXX\";\n    char buf[MAX_XFER_BUF_SIZE] = {0};\n    char buf_verify[MAX_XFER_BUF_SIZE] = {0};\n    size_t count;\n    size_t bytesread;\n    ssize_t byteswritten;\n    int fd;\n    sftp_file file;\n    mode_t mask;\n    int rc;\n    FILE *fp;\n    struct stat sb;\n\n    mask = umask(S_IRWXO | S_IRWXG);\n    fd = mkstemp(libssh_tmp_file);\n    umask(mask);\n    assert_return_code(fd, errno);\n    close(fd);\n    unlink(libssh_tmp_file);\n\n    file = sftp_open(t->sftp, libssh_tmp_file, O_WRONLY | O_CREAT, 0600);\n    assert_non_null(file);\n\n    rc = lstat(libssh_tmp_file, &sb);\n    assert_return_code(rc, errno);\n\n    snprintf(buf, sizeof(buf), \"libssh fsync test\\n\");\n    count = strlen(buf) + 1;\n\n    byteswritten = sftp_write(file, buf, count);\n    assert_int_equal(byteswritten, count);\n\n    rc = sftp_fsync(file);\n    assert_return_code(rc, errno);\n\n    fp = fopen(libssh_tmp_file, \"r\");\n    assert_non_null(fp);\n\n    rc = fstat(fileno(fp), &sb);\n    assert_return_code(rc, errno);\n\n    bytesread = fread(buf_verify, sizeof(buf_verify), 1, fp);\n    if (bytesread == 0) {\n        if (!feof(fp)) {\n            assert_int_equal(bytesread, count);\n        }\n    }\n    assert_string_equal(buf, buf_verify);\n\n    sftp_close(file);\n    fclose(fp);\n    unlink(libssh_tmp_file);\n}\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_sftp_fsync,\n                                        session_setup,\n                                        session_teardown)\n    };\n\n    ssh_init();\n\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, sshd_setup, sshd_teardown);\n    ssh_finalize();\n\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/client/torture_sftp_read.c",
    "content": "#define LIBSSH_STATIC\n\n#include \"config.h\"\n\n#include \"torture.h\"\n#include \"sftp.c\"\n\n#include <sys/types.h>\n#include <pwd.h>\n#include <errno.h>\n\n#define MAX_XFER_BUF_SIZE 16384\n\nstatic int sshd_setup(void **state)\n{\n    torture_setup_sshd_server(state, false);\n\n    return 0;\n}\n\nstatic int sshd_teardown(void **state) {\n    torture_teardown_sshd_server(state);\n\n    return 0;\n}\n\nstatic int session_setup(void **state)\n{\n    struct torture_state *s = *state;\n    struct passwd *pwd;\n    int rc;\n\n    pwd = getpwnam(\"bob\");\n    assert_non_null(pwd);\n\n    rc = setuid(pwd->pw_uid);\n    assert_return_code(rc, errno);\n\n    s->ssh.session = torture_ssh_session(s,\n                                         TORTURE_SSH_SERVER,\n                                         NULL,\n                                         TORTURE_SSH_USER_ALICE,\n                                         NULL);\n    assert_non_null(s->ssh.session);\n\n    s->ssh.tsftp = torture_sftp_session(s->ssh.session);\n    assert_non_null(s->ssh.tsftp);\n\n    return 0;\n}\n\nstatic int session_teardown(void **state)\n{\n    struct torture_state *s = *state;\n\n    torture_rmdirs(s->ssh.tsftp->testdir);\n    torture_sftp_close(s->ssh.tsftp);\n    ssh_disconnect(s->ssh.session);\n    ssh_free(s->ssh.session);\n\n    return 0;\n}\n\nstatic void torture_sftp_read_blocking(void **state) {\n    struct torture_state *s = *state;\n    struct torture_sftp *t = s->ssh.tsftp;\n\n    char libssh_tmp_file[] = \"/tmp/libssh_sftp_test_XXXXXX\";\n    char buf[MAX_XFER_BUF_SIZE];\n    ssize_t bytesread;\n    ssize_t byteswritten;\n    int fd;\n    sftp_file file;\n    mode_t mask;\n\n    file = sftp_open(t->sftp, SSH_EXECUTABLE, O_RDONLY, 0);\n    assert_non_null(file);\n\n    mask = umask(S_IRWXO | S_IRWXG);\n    fd = mkstemp(libssh_tmp_file);\n    umask(mask);\n    unlink(libssh_tmp_file);\n\n    for (;;) {\n        bytesread = sftp_read(file, buf, MAX_XFER_BUF_SIZE);\n        if (bytesread == 0) {\n                break; /* EOF */\n        }\n        assert_false(bytesread < 0);\n\n        byteswritten = write(fd, buf, bytesread);\n        assert_int_equal(byteswritten, bytesread);\n    }\n\n    close(fd);\n    sftp_close(file);\n}\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        /* This test is intentionally running twice to trigger a bug in OpenSSH\n         * or in pam_wrapper, causing the second invocation to fail.\n         * See: https://bugs.libssh.org/T122\n         */\n        cmocka_unit_test_setup_teardown(torture_sftp_read_blocking,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_sftp_read_blocking,\n                                        session_setup,\n                                        session_teardown)\n    };\n\n    ssh_init();\n\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, sshd_setup, sshd_teardown);\n    ssh_finalize();\n\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/cmdline.c",
    "content": "#include \"config.h\"\n#include \"torture.h\"\n\n#ifdef HAVE_ARGP_H\n#include <argp.h>\n\nconst char *argp_program_version = \"libssh test 0.2\";\nconst char *argp_program_bug_address = \"<csync-devel@csync.org>\";\n\nstatic char **cmdline;\n\n/* Program documentation. */\nstatic char doc[] = \"libssh test test\";\n\n/* The options we understand. */\nstatic struct argp_option options[] = {\n  {\n    .name  = \"verbose\",\n    .key   = 'v',\n    .arg   = NULL,\n    .flags = 0,\n    .doc   = \"Make libssh test more verbose\",\n    .group = 0\n  },\n  {NULL, 0, NULL, 0, NULL, 0}\n};\n\n/* Parse a single option. */\nstatic error_t parse_opt (int key, char *arg, struct argp_state *state) {\n  /* Get the input argument from argp_parse, which we\n   * know is a pointer to our arguments structure.\n   */\n  struct argument_s *arguments = state->input;\n\n  /* arg is currently not used */\n  (void) arg;\n\n  switch (key) {\n    case 'v':\n      arguments->verbose++;\n      break;\n    case ARGP_KEY_ARG:\n      /* End processing here. */\n      arguments->pattern = state->argv[state->next - 1];\n      cmdline = &state->argv [state->next - 1];\n      state->next = state->argc;\n      break;\n    default:\n      return ARGP_ERR_UNKNOWN;\n  }\n\n  return 0;\n}\n\n/* Our argp parser. */\n/* static struct argp argp = {options, parse_opt, args_doc, doc, NULL, NULL, NULL}; */\nstatic struct argp argp = {options, parse_opt, NULL, doc, NULL, NULL, NULL};\n#endif /* HAVE_ARGP_H */\n\nvoid torture_cmdline_parse(int argc, char **argv, struct argument_s *arguments) {\n  /*\n   * Parse our arguments; every option seen by parse_opt will\n   * be reflected in arguments.\n   */\n#ifdef HAVE_ARGP_H\n  argp_parse(&argp, argc, argv, 0, 0, arguments);\n#else\n  (void) argc;\n  (void) argv;\n  (void) arguments;\n#endif /* HAVE_ARGP_H */\n}\n"
  },
  {
    "path": "src/libssh/tests/connection.c",
    "content": "/*\nThis file is distributed in public domain. You can do whatever you want\nwith its content.\n*/\n\n#include <libssh/libssh.h>\n#include <stdio.h>\n#include \"tests.h\"\nSSH_OPTIONS *set_opts(int argc, char **argv){\n\tSSH_OPTIONS *options=ssh_options_new();\n\tchar *host=NULL;\n\tif(ssh_options_getopt(options,&argc, argv)){\n\t    fprintf(stderr,\"error parsing command line :%s\\n\",ssh_get_error(options));\n\t    return NULL;\n\t}\n    int i;\n    while((i=getopt(argc,argv,\"\"))!=-1){\n        switch(i){\n            default:\n                fprintf(stderr,\"unknown option %c\\n\",optopt);\n        }\n    }\n    if(optind < argc)\n        host=argv[optind++];\n    if(host==NULL){\n    \tfprintf(stderr,\"must provide an host name\\n\");\n    \treturn NULL;\n    }\n    ssh_options_set_host(options,host);\n    return options;\n}\n"
  },
  {
    "path": "src/libssh/tests/ctest-default.cmake",
    "content": "## The directory to run ctest in.\nset(CTEST_DIRECTORY \"$ENV{HOME}/workspace/tmp/dashboards/libssh\")\n\n## The hostname of the machine\nset(CTEST_SITE \"host.libssh.org\")\n## The buildname\nset(CTEST_BUILD_NAME \"Linux_2.6-GCC_4.5-x86_64-default\")\n\n## The Makefile generator to use\nset(CTEST_CMAKE_GENERATOR \"Unix Makefiles\")\n\n## The Build configuration to use.\nset(CTEST_BUILD_CONFIGURATION \"Debug\")\n\n## The build options for the project\nset(CTEST_BUILD_OPTIONS \"-DUNIT_TESTING=ON -WITH_SFTP=ON -DWITH_SERVER=ON -DWITH_ZLIB=ON -DWITH_PCAP=ON -DDEBUG_CRYPTO=ON -DWITH_GCRYPT=OFF\")\n\n#set(CTEST_CUSTOM_MEMCHECK_IGNORE torture_rand)\n\n## The Model to set: Nightly, Continous, Experimental\nset(CTEST_MODEL \"Experimental\")\n\n## The branch\n#set(CTEST_GIT_BRANCH \"--branch v0-5\")\n\n## Wether to enable memory checking.\nset(WITH_MEMCHECK FALSE)\n\n## Wether to enable code coverage.\nset(WITH_COVERAGE FALSE)\n\n#######################################################################\n\nif (WITH_COVERAGE AND NOT WIN32)\n    set(CTEST_BUILD_CONFIGURATION \"Profiling\")\nendif (WITH_COVERAGE AND NOT WIN32)\n\nset(CTEST_SOURCE_DIRECTORY \"${CTEST_DIRECTORY}/${CTEST_BUILD_NAME}/source\")\nset(CTEST_BINARY_DIRECTORY \"${CTEST_DIRECTORY}/${CTEST_BUILD_NAME}/build\")\n\nset(CTEST_MEMORYCHECK_SUPPRESSIONS_FILE ${CMAKE_SOURCE_DIR}/tests/valgrind.supp)\nset(CTEST_MEMORYCHECK_COMMAND_OPTIONS \" --trace-children-skip=${SSHD_EXECUTABLE}\")\n\nfind_program(CTEST_GIT_COMMAND NAMES git)\nfind_program(CTEST_COVERAGE_COMMAND NAMES gcov)\nfind_program(CTEST_MEMORYCHECK_COMMAND NAMES valgrind)\n\nif(NOT EXISTS \"${CTEST_SOURCE_DIRECTORY}\")\n    set(CTEST_CHECKOUT_COMMAND \"${CTEST_GIT_COMMAND} clone ${CTEST_GIT_BRANCH} git://git.libssh.org/projects/libssh.git ${CTEST_SOURCE_DIRECTORY}\")\nendif()\n\nset(CTEST_UPDATE_COMMAND \"${CTEST_GIT_COMMAND}\")\n\nset(CTEST_CONFIGURE_COMMAND \"${CMAKE_COMMAND} -DCMAKE_BUILD_TYPE:STRING=${CTEST_BUILD_CONFIGURATION}\")\nset(CTEST_CONFIGURE_COMMAND \"${CTEST_CONFIGURE_COMMAND} -DUNIT_TESTING:BOOL=ON ${CTEST_BUILD_OPTIONS}\")\nset(CTEST_CONFIGURE_COMMAND \"${CTEST_CONFIGURE_COMMAND} \\\"-G${CTEST_CMAKE_GENERATOR}\\\"\")\nset(CTEST_CONFIGURE_COMMAND \"${CTEST_CONFIGURE_COMMAND} \\\"${CTEST_SOURCE_DIRECTORY}\\\"\")\n\nctest_empty_binary_directory(${CTEST_BINARY_DIRECTORY})\n\nctest_start(${CTEST_MODEL} TRACK ${CTEST_MODEL})\nctest_update(SOURCE ${CTEST_SOURCE_DIRECTORY})\nctest_configure(BUILD ${CTEST_BINARY_DIRECTORY})\nctest_build(BUILD ${CTEST_BINARY_DIRECTORY})\nctest_test(BUILD ${CTEST_BINARY_DIRECTORY})\nif (WITH_COVERAGE)\n  ctest_coverage(BUILD ${CTEST_BINARY_DIRECTORY})\nendif ()\nif (WITH_MEMCHECK)\n  ctest_memcheck(BUILD ${CTEST_BINARY_DIRECTORY})\nendif ()\nctest_submit()\n"
  },
  {
    "path": "src/libssh/tests/etc/group.in",
    "content": "users:x:9000:\nsshd:x:65531:\nnobody:x:65533:\nnogroup:x:65534:nobody\nroot:x:65532:\n"
  },
  {
    "path": "src/libssh/tests/etc/hosts.in",
    "content": "127.0.0.10  server.libssh.site\n127.0.0.21  client.libssh.site\n"
  },
  {
    "path": "src/libssh/tests/etc/pam.d/sshd.in",
    "content": "auth        required    @PAM_WRAPPER_MODULE_DIR@/pam_matrix.so passdb=@CMAKE_CURRENT_BINARY_DIR@/etc/pam_matrix_passdb\naccount     required    @PAM_WRAPPER_MODULE_DIR@/pam_matrix.so passdb=@CMAKE_CURRENT_BINARY_DIR@/etc/pam_matrix_passdb\npassword    required    @PAM_WRAPPER_MODULE_DIR@/pam_matrix.so passdb=@CMAKE_CURRENT_BINARY_DIR@/etc/pam_matrix_passdb\nsession     required    @PAM_WRAPPER_MODULE_DIR@/pam_matrix.so passdb=@CMAKE_CURRENT_BINARY_DIR@/etc/pam_matrix_passdb\n"
  },
  {
    "path": "src/libssh/tests/etc/pam_matrix_passdb.in",
    "content": "bob:secret:sshd\nalice:secret:sshd\n"
  },
  {
    "path": "src/libssh/tests/etc/passwd.in",
    "content": "bob:x:5000:9000:bob gecos:@HOMEDIR@/bob:/bin/sh\nalice:x:5001:9000:alice gecos:@HOMEDIR@/alice:/bin/sh\nsshd:x:65530:65531:sshd:@HOMEDIR@:/sbin/nologin\nnobody:x:65533:65534:nobody gecos:@HOMEDIR@:/bin/false\nroot:x:65534:65532:root gecos:@HOMEDIR@:/bin/false\n@LOCAL_USER@:x:@LOCAL_UID@:9000:local user:@HOMEDIR@:/bin/false\n"
  },
  {
    "path": "src/libssh/tests/etc/shadow.in",
    "content": "alice:$6$0jWkA8VP$MvBUvtGy38jWCZ5KtqnZEKQWXvvImDkDhDQII1kTqtAp3/xH31b71c.AjGkBFle.2QwCJQH7OzB/NXiMprusr/::0:::::\nbob:$6$0jWkA8VP$MvBUvtGy38jWCZ5KtqnZEKQWXvvImDkDhDQII1kTqtAp3/xH31b71c.AjGkBFle.2QwCJQH7OzB/NXiMprusr/::0:::::\n"
  },
  {
    "path": "src/libssh/tests/fuzz/CMakeLists.txt",
    "content": "project(fuzzing CXX)\n\nif (CMAKE_CXX_COMPILER_ID STREQUAL \"Clang\")\n    add_executable(ssh_server_fuzzer ssh_server_fuzzer.cpp)\n    set_target_properties(ssh_server_fuzzer\n        PROPERTIES\n            COMPILE_FLAGS \"-fsanitize=fuzzer\"\n            LINK_FLAGS \"-fsanitize=fuzzer\")\nendif()\n"
  },
  {
    "path": "src/libssh/tests/fuzz/ssh_server_fuzzer.cpp",
    "content": "/*\n# Copyright 2016 Google Inc.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n################################################################################\n*/\n\n#include <assert.h>\n#include <fcntl.h>\n#include <stdint.h>\n#include <string.h>\n#include <sys/socket.h>\n#include <unistd.h>\n\n#define LIBSSH_STATIC 1\n#include <libssh/libssh.h>\n#include <libssh/server.h>\n\nstatic const char kRSAPrivateKeyPEM[] =\n    \"-----BEGIN RSA PRIVATE KEY-----\\n\"\n    \"MIIEowIBAAKCAQEArAOREUWlBXJAKZ5hABYyxnRayDZP1bJeLbPVK+npxemrhHyZ\\n\"\n    \"gjdbY3ADot+JRyWjvll2w2GI+3blt0j+x/ZWwjMKu/QYcycYp5HL01goxOxuusZb\\n\"\n    \"i+KiHRGB6z0EMdXM7U82U7lA/j//HyZppyDjUDniWabXQJge8ksGXGTiFeAJ/687\\n\"\n    \"uV+JJcjGPxAGFQxzyjitf/FrL9S0WGKZbyqeGDzyeBZ1NLIuaiOORyLGSW4duHLD\\n\"\n    \"N78EmsJnwqg2gJQmRSaD4BNZMjtbfiFcSL9Uw4XQFTsWugUDEY1AU4c5g11nhzHz\\n\"\n    \"Bi9qMOt5DzrZQpD4j0gA2LOHpHhoOdg1ZuHrGQIDAQABAoIBAFJTaqy/jllq8vZ4\\n\"\n    \"TKiD900wBvrns5HtSlHJTe80hqQoT+Sa1cWSxPR0eekL32Hjy9igbMzZ83uWzh7I\\n\"\n    \"mtgNODy9vRdznfgO8CfTCaBfAzQsjFpr8QikMT6EUI/LpiRL1UaGsNOlSEvnSS0Z\\n\"\n    \"b1uDzAdrjL+nsEHEDJud+K9jwSkCRifVMy7fLfaum+YKpdeEz7K2Mgm5pJ/Vg+9s\\n\"\n    \"vI2V1q7HAOI4eUVTgJNHXy5ediRJlajQHf/lNUzHKqn7iH+JRl01gt62X8roG62b\\n\"\n    \"TbFylbheqMm9awuSF2ucOcx+guuwhkPir8BEMb08j3hiK+TfwPdY0F6QH4OhiKK7\\n\"\n    \"MTqTVgECgYEA0vmmu5GOBtwRmq6gVNCHhdLDQWaxAZqQRmRbzxVhFpbv0GjbQEF7\\n\"\n    \"tttq3fjDrzDf6CE9RtZWw2BUSXVq+IXB/bXb1kgWU2xWywm+OFDk9OXQs8ui+MY7\\n\"\n    \"FiP3yuq3YJob2g5CCsVQWl2CHvWGmTLhE1ODll39t7Y1uwdcDobJN+ECgYEA0LlR\\n\"\n    \"hfMjydWmwqooU9TDjXNBmwufyYlNFTH351amYgFUDpNf35SMCP4hDosUw/zCTDpc\\n\"\n    \"+1w04BJJfkH1SNvXSOilpdaYRTYuryDvGmWC66K2KX1nLErhlhs17CwzV997nYgD\\n\"\n    \"H3OOU4HfqIKmdGbjvWlkmY+mLHyG10bbpOTbujkCgYAc68xHejSWDCT9p2KjPdLW\\n\"\n    \"LYZGuOUa6y1L+QX85Vlh118Ymsczj8Z90qZbt3Zb1b9b+vKDe255agMj7syzNOLa\\n\"\n    \"/MseHNOyq+9Z9gP1hGFekQKDIy88GzCOYG/fiT2KKJYY1kuHXnUdbiQgSlghODBS\\n\"\n    \"jehD/K6DOJ80/FVKSH/dAQKBgQDJ+apTzpZhJ2f5k6L2jDq3VEK2ACedZEm9Kt9T\\n\"\n    \"c1wKFnL6r83kkuB3i0L9ycRMavixvwBfFDjuY4POs5Dh8ip/mPFCa0hqISZHvbzi\\n\"\n    \"dDyePJO9zmXaTJPDJ42kfpkofVAnfohXFQEy+cguTk848J+MmMIKfyE0h0QMabr9\\n\"\n    \"86BUsQKBgEVgoi4RXwmtGovtMew01ORPV9MOX3v+VnsCgD4/56URKOAngiS70xEP\\n\"\n    \"ONwNbTCWuuv43HGzJoVFiAMGnQP1BAJ7gkHkjSegOGKkiw12EPUWhFcMg+GkgPhc\\n\"\n    \"pOqNt/VMBPjJ/ysHJqmLfQK9A35JV6Cmdphe+OIl28bcKhAOz8Dw\\n\"\n    \"-----END RSA PRIVATE KEY-----\\n\";\n\n\nextern \"C\" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {\n    int socket_fds[2];\n    int res = socketpair(AF_UNIX, SOCK_STREAM, 0, socket_fds);\n    assert(res >= 0);\n    ssize_t send_res = send(socket_fds[1], data, size, 0);\n    assert(send_res == size);\n    res = shutdown(socket_fds[1], SHUT_WR);\n    assert(res == 0);\n\n    int fd = open(\"/tmp/libssh_fuzzer_private_key\", O_WRONLY | O_CREAT, S_IRWXU);\n    assert(fd >= 0);\n    ssize_t write_res = write(fd, kRSAPrivateKeyPEM, strlen(kRSAPrivateKeyPEM));\n    assert(write_res == strlen(kRSAPrivateKeyPEM));\n    close(fd);\n\n    ssh_bind sshbind = ssh_bind_new();\n    ssh_session session = ssh_new();\n\n    ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_RSAKEY, \"/tmp/libssh_fuzzer_private_key\");\n\n    res = ssh_bind_accept_fd(sshbind, session, socket_fds[0]);\n    assert(res == SSH_OK);\n\n    if (ssh_handle_key_exchange(session) == SSH_OK) {\n        while (true) {\n            ssh_message message = ssh_message_get(session);\n            if (!message) {\n                break;\n            }\n            ssh_message_free(message);\n        }\n    }\n\n    close(socket_fds[0]);\n    close(socket_fds[1]);\n\n    ssh_disconnect(session);\n    ssh_free(session);\n    ssh_bind_free(sshbind);\n\n    return 0;\n}\n"
  },
  {
    "path": "src/libssh/tests/generate.py",
    "content": "#!/usr/bin/python\nimport os\na=\"\"\nfor i in xrange(4096):\n\ta+=chr(i % 256);\nwhile True:\n\ttry:\n\t\tos.write(1,a)\n\texcept:\n\t\texit(0)\n"
  },
  {
    "path": "src/libssh/tests/keys/certauth/id_rsa",
    "content": "-----BEGIN RSA PRIVATE KEY-----\nMIIEiwIBAAKB/QMTSsCQqarOIauonYgjAt8E+lgSWBU/43ITyDDzLM4IS4wCcqXB\n1Fagz386FU1B2AcUqlPZ1+7RlaXkqgKr4nGHv00U/GG+YAUgUAw1G12kI4cvrnWr\nFIXwcq+VTJNej5pHxEqcRLw7ZBorpqm2UsY5KLr5R3uMNap7koj1Hbt9lKsvfDn6\nHjM4qY0ygx8hxf/4wCzIh5V4k9/UAMkqI2CM9c3yEE2aWh/4MDOnAFj+0T2sMAo8\njyOZ6v+W7hmEtsUc9mEv+5B+hhVeYO/RwxketJAQRPYDSPSi1mjtv9fnzGk15q/l\nHb2V/HP/pyIpao19A4daR0a4ia9Hk4UCAwEAAQKB/QKEaPxjrKzlWoQSWRdUaQY5\nIdyy7yw9hiMa9BK1COh/u66XVlY86Fwb9puR5Fu/WF67WIuX1PpizJXkLBBRtuDs\nlvY2BjrPQ/MONtc3JPYp4vbFXYxtAzh6zrTPhMVfcjV7Jr1XWZ+lEVOmhR2G4gvk\nP2WDozIKWub3jMLTt4afgHCGaKfKEUpKjFkiAalz8oLVv8qV1FVPPDT2PWeKMuE3\nXfoN7YUaP6+aPlNnjIv/3BDsrPsiKZ+AKXcERdPvVQa/LypzW08cqC6sIJKWVmQI\n3KgoYs9VvbDXfQ8jKfcsTApZkSDaLX6tf3Ei+76R0lbV4L1rpypa25qj9YECfwHP\nN+v/6yObJFL5/1rEuT7CFbfP8g5J8qUVufcPRKv//ChluLuWNxgLJmIv2ZffWwhe\nGKHlT98QPgFvsMSOyLeut4beZYKDSeVNvEt9eCBjOax2jOBGo3hv8j/Fs8yAfZOV\nArdv2qUszubM+DVwjJzb3vaZyEesRucJISqkJeUCfwGzGdMp0LXrZ7aaQGgHj/P2\nDKGq0E2gnj/EBapatjxKm4hMRn/vkTWjCDCryTnvJqkW/00tr4GqWXoeilBFD270\nRcvbOe9LQmGlHIYzgwc5nfLDBQyeNnHRmkeD9LQRUfdTdHj4jf+35pHlsVUT0Rnl\nIMNoRA6V07bySFdI3SECfiF+1rbrxuhaCRIA0Ax3pL0eGuuTgksAm8VlbCMTgSiC\nkF1CrXXgSAHOZb02C9Bf4cwEFfjh/KxM/4eXDa+Rfg7JQJxmVLivqEAlxIOvIxBp\nxDnSWAljmrrllozyQnBsJDbbOm6BLf5+e5wIuryHvnP7vHNEU0J24g/78PxrrQJ/\nAVD4OzYzUfESzbUBFJBmyIZSmhJ0aOpwJOpniNvgLymI8zI/l22uhF/TQ/6HRbsV\nsfcBmoA7YKzRx2ZHsIsLvN6p/4u1fsJGkuERCk5yt/HDhfPLwU321IeEeMaVia+w\nT1/u4JF/SADhLTU69az3UJrHmQ7zRmh7I0DZDeB8gQJ+XqIqutPeerNtbqMjXGW8\nTdpqZAzAQAv6dPgaH0W0OzJe2hP9uy0D84H5f8Im/irJh/AXo/QL3obXqopyeLf0\nHfcUUnEZEBPlqsirZFtPClD+HL6Orf1je0oVV/aQssPkQl6/aXBNd+kS27U3NBML\nLmRhC4+Q+/M5MlRggLtn\n-----END RSA PRIVATE KEY-----\n"
  },
  {
    "path": "src/libssh/tests/keys/certauth/id_rsa-cert.pub",
    "content": "ssh-rsa-cert-v01@openssh.com AAAAHHNzaC1yc2EtY2VydC12MDFAb3BlbnNzaC5jb20AAAAgHZLan4ufbTFWr8Hl/8JvZTLYa0eNNm2qov9zPlK7qfwAAAADAQABAAAA/QMTSsCQqarOIauonYgjAt8E+lgSWBU/43ITyDDzLM4IS4wCcqXB1Fagz386FU1B2AcUqlPZ1+7RlaXkqgKr4nGHv00U/GG+YAUgUAw1G12kI4cvrnWrFIXwcq+VTJNej5pHxEqcRLw7ZBorpqm2UsY5KLr5R3uMNap7koj1Hbt9lKsvfDn6HjM4qY0ygx8hxf/4wCzIh5V4k9/UAMkqI2CM9c3yEE2aWh/4MDOnAFj+0T2sMAo8jyOZ6v+W7hmEtsUc9mEv+5B+hhVeYO/RwxketJAQRPYDSPSi1mjtv9fnzGk15q/lHb2V/HP/pyIpao19A4daR0a4ia9Hk4UAAAAAAAAAAAAAAAEAAAATdG9ydHVyZV9hdXRoX2NhcmxvcwAAAAkAAAAFYWxpY2UAAAAAAAAAAP//////////AAAAAAAAAIIAAAAVcGVybWl0LVgxMS1mb3J3YXJkaW5nAAAAAAAAABdwZXJtaXQtYWdlbnQtZm9yd2FyZGluZwAAAAAAAAAWcGVybWl0LXBvcnQtZm9yd2FyZGluZwAAAAAAAAAKcGVybWl0LXB0eQAAAAAAAAAOcGVybWl0LXVzZXItcmMAAAAAAAAAAAAAARcAAAAHc3NoLXJzYQAAAAMBAAEAAAEBAKcDafm8fNluz8a9GQaWgk1XUJcchLleeubTke6xQlJbI+rcjWIIwd1gDuh7Mdr0YIVhsh6dpg/L4bpRJBGNhDPxK8BmjTpIU14lKxrWQAirHN09P2QGtGtgrf09lA+xhV9E+pkF2Zz6PCt/P3sgUQnJcwjjsWhMaSASrt67fPanH+10hnfgjkevkMMHGJxmLiOW7JFQkd9I+gHHKEXs6Q9fhtiStzr3WN4hAPG5uXrnRZgseAV9p3TFPMEgUTpdRvnkOnkCBF169KiyjU97QgoXHExWk/rrgsJtgrTou/qRyi18WWm9S1HXLHyNOgZxKirmxLNPC9dIcJBD1kDWG8UAAAEPAAAAB3NzaC1yc2EAAAEAhNLOXT0jyz/Web0HUyrtPCvUZsLkDyBWCNoNTfsxGVoYsE4WCpNwqQO1A4NT5AtIE+R7rn9wfjvXM7sYh6hJyq3HVEWhts1SkQVU7sQBrImTIrj2cWKR3gmQ+ehsgNFGhcFZTK77ugw1fMfzZRvKVTkRWhe6v92wQOtkoINtf3f1fK6xY+vLwAA/E4VdaRJmhwAaNpy3PfMAJytkCLjcjUSWHYDha4hs98/EBPduGNNNiZdyG7lcpSvvq9HBDxzOiHBa/We9m38/Dk4TNVkZ/wrtBFQxH75if6SgGa/feGJrKQHBru7sPh8dO4R1AmZaoLmRzMnzZOtB0oEXmBqHmw==  libssh_torture_auth\n"
  },
  {
    "path": "src/libssh/tests/keys/certauth/id_rsa.pub",
    "content": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAA/QMTSsCQqarOIauonYgjAt8E+lgSWBU/43ITyDDzLM4IS4wCcqXB1Fagz386FU1B2AcUqlPZ1+7RlaXkqgKr4nGHv00U/GG+YAUgUAw1G12kI4cvrnWrFIXwcq+VTJNej5pHxEqcRLw7ZBorpqm2UsY5KLr5R3uMNap7koj1Hbt9lKsvfDn6HjM4qY0ygx8hxf/4wCzIh5V4k9/UAMkqI2CM9c3yEE2aWh/4MDOnAFj+0T2sMAo8jyOZ6v+W7hmEtsUc9mEv+5B+hhVeYO/RwxketJAQRPYDSPSi1mjtv9fnzGk15q/lHb2V/HP/pyIpao19A4daR0a4ia9Hk4U= libssh_torture_auth\n"
  },
  {
    "path": "src/libssh/tests/keys/id_ecdsa",
    "content": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIHbL0nzpzLS3ImIlhEffbDzPlIw/tn5QcfB64PbSiBl6oAoGCCqGSM49\nAwEHoUQDQgAERzA8X8OP7C3W/e1UNLh+21xIZVBiQ7i4Qb4xoOebRWuwzitEZon/\n8Dz+VpE29krJgCagqSt5RLllOx8eS2i8fw==\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "src/libssh/tests/keys/id_ecdsa.pub",
    "content": "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEcwPF/Dj+wt1v3tVDS4fttcSGVQYkO4uEG+MaDnm0VrsM4rRGaJ//A8/laRNvZKyYAmoKkreUS5ZTsfHktovH8= comment\n"
  },
  {
    "path": "src/libssh/tests/keys/id_ed25519",
    "content": "-----BEGIN OPENSSH PRIVATE KEY-----\nb3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW\nQyNTUxOQAAACCLo6vx1lX6ZZoe05lWTkuwrJUZN0T8hEer5UF9KPhOVgAAAKg+IRNSPiET\nUgAAAAtzc2gtZWQyNTUxOQAAACCLo6vx1lX6ZZoe05lWTkuwrJUZN0T8hEer5UF9KPhOVg\nAAAED2zFg52qYItoZaSUnir4VKubTxJveL9D2oWK7Prg/O24ujq/HWVfplmh7TmVZOS7Cs\nlRk3RPyER6vlQX0o+E5WAAAAHmpqZWxlbkB0NDcwcy5qamVsZW4ucmVkaGF0LmNvbQECAw\nQFBgc=\n-----END OPENSSH PRIVATE KEY-----\n"
  },
  {
    "path": "src/libssh/tests/keys/id_ed25519.pub",
    "content": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIujq/HWVfplmh7TmVZOS7CslRk3RPyER6vlQX0o+E5W jjelen@t470s.jjelen.redhat.com\n"
  },
  {
    "path": "src/libssh/tests/keys/id_rsa",
    "content": "-----BEGIN RSA PRIVATE KEY-----\nMIIEogIBAAKCAQEAs/fIz+Gy89XjUhXebNq2rs1K0RJEZXDbfcofb13ESDJ9fSbd\n+RlCUM6i+foEVV23xWdands2Bkn72tGinJadIgOWU+koxp+gRmtJLE/ONiAKJQqR\nK3eOJNBH6At96NMqJ4Gwv56G4W68uPgDwUVQwVIc6Ec6Rypiz7DE+S++gSvBQIVU\nQt7XkPcXOyN5zuj5qDhZM4l6V7Og9LWj4/2IF5acvKjfIMpeqmnp9z6BTYZQtuQU\n6b1VuEYhXyvM6LkMwndsVGh46kDKMmRQhyA8A6qvLAliMMq88k5gR4AeJeTnqDR/\nQ120I6PMqYNl6TLTk8/KonOOPDR/XXGb3iF67wIDAQABAoIBAAVoL2dXf5nl1jOU\nJp+cnpp33oSTiOyHTIDl/rXI2mnU4oJNFaQzRxPIcYsTIOgzrZ7HsShG+sOLm36C\nh+EugUARXYXd3nTBPP6AoK0tJKPpqIReYegtal7exxpIphrFpWGUeuv25lSFkDP6\nd5pp67gzMF0mLrEOq/NTe0eFULLuwa6+IKXU7deiU90pzi4jrjcIWNoGHSw1YYAZ\nTC8KAxA/tYH9myya5krRCjA9B345DJ9Wd71wX+RZNgbSkIri/6dDTtvsYvqcQKo0\nOZ3MUDJnKmkfPLP84qZPRoEwUI1gts1WUdoNK6LK7yOJmPL5FMyTwZx3XtDw3gAv\nTVhI7ikCgYEA5Ay0TCySPQAaC14WtjgIAmTa19mAtOFpbRxToi40WjXk3R6mMqyp\nbiAcNecdZRC6zzgAUp8g1O3Yc1d9fG/3FpM5eUbIer7mMLTRuQQysoJY2Ayw9OEA\nqPHS/K6LPOD09aZo14fRUqVO8rwMbHtq2yhH8p3FM8WZRe5ms8zpyLUCgYEAygZ3\nRTMWbgcGdNoaPa5Ms9KRqAxKJLin2fE99KowZeJfvZN24sXExawQdy4BKVYT0H6e\nMNEIPiEBVA4a1GDk/tyOrEt684IsidROngJaGbqb+SYm6feQAioYu0wkG/I2hS12\n/Z/aK6wFz5hWzBv/YvJqC7xD1YwZm1QXDyAiL5MCgYAXz8fHqGPAoNEXXMSsVB9p\n+JPtM9W/jUXP0cRdy8tFnBkAiaG66tJqIEoxyqcEFYIb/vHxrpHkCc2vBXSh2KMJ\nJWg75IssXeB1N3wqgGi2wOt7659SgmfqPA3WunbpbWfGepC56IGPypj6uW3mqeBX\nb9ZLW/PqWviNF757iarjfQKBgGxKBPqRxM8bcumF0xUG7dRh5XN3ivKeDFL1Tels\npF6odftPJSWvLqdqcLUBctvuaNaUWEUAdvOei3C70sPOYFEAdnWCTBhkyWzj4XQu\n/I7YCS0Gt0soSQfv+qvCx4Q3U+QVF7ghTDemkMLS/IuR4lXubMt3kcDQxRUOgQG5\njrmDAoGALauF7ZyzEnQgsgMVzfm9znl5I2aIsLgdsAv3lINVrvtTKhddp7cdd+2j\ndwZlaMnLET/3MY/Cvf13vEsS+bdNXjsdQidqBL8pe5PXY/pafBhtduQuvGzlHJA5\nCEBnwB0SdtsXbzSpOAPZqea4Nz9MkQ8LMsINdPpxCuFhjeYa9Ow=\n-----END RSA PRIVATE KEY-----\n"
  },
  {
    "path": "src/libssh/tests/keys/id_rsa.pub",
    "content": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCz98jP4bLz1eNSFd5s2rauzUrREkRlcNt9yh9vXcRIMn19Jt35GUJQzqL5+gRVXbfFZ1qd2zYGSfva0aKclp0iA5ZT6SjGn6BGa0ksT842IAolCpErd44k0EfoC33o0yongbC/nobhbry4+APBRVDBUhzoRzpHKmLPsMT5L76BK8FAhVRC3teQ9xc7I3nO6PmoOFkziXpXs6D0taPj/YgXlpy8qN8gyl6qaen3PoFNhlC25BTpvVW4RiFfK8zouQzCd2xUaHjqQMoyZFCHIDwDqq8sCWIwyrzyTmBHgB4l5OeoNH9DXbQjo8ypg2XpMtOTz8qic448NH9dcZveIXrv asn@krikkit.cryptomilk.site\n"
  },
  {
    "path": "src/libssh/tests/keys/ssh_host_dsa_key",
    "content": "-----BEGIN DSA PRIVATE KEY-----\nMIIBuwIBAAKBgQD7vBS+d/eJP6wK2VQw+8AIfgCw9IR50utLRkkrWbfDdiM7V+fp\ntJYKCyqZT9j9ANhqicB2tuqAI6WJBZMaGekxWfI30JxPkHZrrwbdFzlRbjav07lg\nIKqWgcz81iVPmfn5savEoobiSFjJNMmYcizjKZgGmyNUzlJjzF7u5qD08wIVAPFp\n6VKuv8VxNjENciUZCdEDRW/lAoGBAN/BFSBRSP9frsHID6e2NeKHqs8JDUWhCTE9\n/WQKqUUbxO2UU98CfHuf1mNlaSsrOxaBdvTeURcZZc1svhyGr1VG+NbNTDDlzTgA\nUlrzNML61TYcFXQVxgifUy+Tmh8FRGCa6Ko/EsX4ZWLTto5w1u5cPpgzSbLMco9T\nAeeNLgYNAoGAJRuawWN3+NezI7+bBe42Kjg4gVUlpS+8TTlYFbwrM1Esab7gvxHB\n/b2apbk9xIAkkqsnb+EPrXTLUdE2Y7XkEuGLLSTus2UlZKobBGBX/Ioysg5W9Fk/\n2MhI4YssRb2alar8d+gmAHPaT+D+NDd90PBfY3HqcXFEK+eDTWo1JNICFBLdsuoO\n6pObeFSOYbr38kJzZ0xG\n-----END DSA PRIVATE KEY-----\n"
  },
  {
    "path": "src/libssh/tests/keys/ssh_host_dsa_key.pub",
    "content": "ssh-dss AAAAB3NzaC1kc3MAAACBAPu8FL5394k/rArZVDD7wAh+ALD0hHnS60tGSStZt8N2IztX5+m0lgoLKplP2P0A2GqJwHa26oAjpYkFkxoZ6TFZ8jfQnE+QdmuvBt0XOVFuNq/TuWAgqpaBzPzWJU+Z+fmxq8SihuJIWMk0yZhyLOMpmAabI1TOUmPMXu7moPTzAAAAFQDxaelSrr/FcTYxDXIlGQnRA0Vv5QAAAIEA38EVIFFI/1+uwcgPp7Y14oeqzwkNRaEJMT39ZAqpRRvE7ZRT3wJ8e5/WY2VpKys7FoF29N5RFxllzWy+HIavVUb41s1MMOXNOABSWvM0wvrVNhwVdBXGCJ9TL5OaHwVEYJroqj8SxfhlYtO2jnDW7lw+mDNJssxyj1MB540uBg0AAACAJRuawWN3+NezI7+bBe42Kjg4gVUlpS+8TTlYFbwrM1Esab7gvxHB/b2apbk9xIAkkqsnb+EPrXTLUdE2Y7XkEuGLLSTus2UlZKobBGBX/Ioysg5W9Fk/2MhI4YssRb2alar8d+gmAHPaT+D+NDd90PBfY3HqcXFEK+eDTWo1JNI= asn@magrathea\n"
  },
  {
    "path": "src/libssh/tests/keys/ssh_host_ecdsa_key",
    "content": "-----BEGIN EC PRIVATE KEY-----\nMHcCAQEEIB9v2n1oaXvBECf0gDPxTibeUPvvkI1anNWDAIkNjs5JoAoGCCqGSM49\nAwEHoUQDQgAEqkTqNu7gRegPJRy0WiseJz9NAdBimzyNSzNwI5eAkEqv9D6Y95KL\n7DBEnDQ2p08iOLw+vN1PKHsCM7b/ONbYVg==\n-----END EC PRIVATE KEY-----\n"
  },
  {
    "path": "src/libssh/tests/keys/ssh_host_ecdsa_key.pub",
    "content": "ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBKpE6jbu4EXoDyUctForHic/TQHQYps8jUszcCOXgJBKr/Q+mPeSi+wwRJw0NqdPIji8PrzdTyh7AjO2/zjW2FY= asn@magrathea\n"
  },
  {
    "path": "src/libssh/tests/keys/ssh_host_key.pub",
    "content": "2048 65537 25221975523736997039149017470335977198642717886559395625730372192276493838727011206749822289920387480933533054627057418868711378045090730895752530916661328094497437687453813456961487210492465678475508526337829331199296553120728607984859224949182503917312492825658971738208505685553964707412720244524969161284321098487507924676797222812771309962906894332072854924265623785469343453142982185436565166155021228521252914913227554455102103918367844210755391318078654400527927267478149210805219779896806429660492177158822689909493046725157917529664436252598971135251689616517266344945600782273453037452082373553352939812279 asn@magrathea\n"
  },
  {
    "path": "src/libssh/tests/keys/ssh_host_rsa_key",
    "content": "-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEAqzabeU0oKbHDwdlqindABvtzgWCvXdHJ+d2Ew6te2LXjkwju\ny7u6B7y63NZRy57ccrE4YSeWItVoZn+DWN+guU354Ss/tzQ9/thUmLrvtKNvJwuF\nF5Ch7Q4BsrXGsb2GSv+7W5tpx3yAqH1TvKQj/MmQVX+/9KtXEnh7/vpiCqoOXQAR\nzvIIQxoo1aUQBHAkRW7Yw0Ds7AjC9uV1ns4xdBXPQmDk23pWvCq7E+7rOEbKRrjj\nlApS4lJYy0oEXsFdqUPd+PtT1gG0nIElHFQtsTgUvwYQmJEzrBxv41odwRvxbMjg\nTHPr4SLRRRSuPwICWyvxqPpa7EsfMBnbPEIUzQIDAQABAoIBAEUO15MLvgFjRDQy\nP7jt9JNcZPBwUQukjLUN1nkd7Dm407wAxGDErXplc3GTuJZK01wngzgcwX/3WA7P\nq+jy+l8DxqA904tPtRnPo/+elwTjTvgOu3YPzmBRX/n3O9eBPGOP1sBSZU4jN7m+\nI0JZanKR0nfJ+WD0o0A9/LWRxG3MFIntBamtT6pgee8sAu44IvW0o7tHJabMq02J\nZ/ndrJmox34wq6SMFANax+N1x9sZa60bL7gEoDWQJNKOaMrbtOaIoTGFIc4hFqoA\nSzjNqcGsHPWs44cw0mNkUGq37jEvaCwzAp+U80ma1skBhXuJL9sQOxl1v5qW91c/\nCnm5WYECgYEA4DPvqbLt+VdyTtmCQ370yiCk4OPPMPzbM65IVKgQL/rN6HdNShTO\nuLF6P8XC8vNP2OSydJeFt+kMKd7E/4o5LfvEqUGXZJDkB7fLjrOjyZU3bxtIx95x\nqYGWRcWbd3sHzlBJGuFVSE7GREE+lqhkSu4ry4l/GAKxSymAXgGd/9ECgYEAw37L\nppZIavcLE2rZgXHoqMiJzeGzsidJbkHss4k7ubLe8vyBMiv0HC2anxPa2+yNWuF2\n+pEr84bllh149VKeild24UEBAR2w/P41ggWqiUP7PKllh+huWzG4+KNFbfUP4dd0\n4LkVgfsCz32qD8qxXNCxJCZ8H2fmjKsYw/oCID0CgYAiuSh3GdUtdtOnTpyUI4d5\n/pBKnD2skpzIZkehhN3s8GUPidqYjJxvkl0in1hQFErbhp/02rrE/vz5Rx0vjpLI\ngmO06wmtc5s9bsPB+CR3xfpt5MXi3pqv6/gAGli3qoBM/bY0yY1Rw5GFZK1y2+Wc\njUKPJV5fs5sNzwGojYuQ4QKBgQCNNgqOo2Fd+mLCvNyt1wTy3iBEWfL+DcjJ3s7G\nhKtioKTQqbn87qjercZRf/sH/t/ANLpHlhNETj2KaHGV6v7f+PvDC7xY/QR6SnmG\nGOetTTCuCcJwIGGOd+UfnHgrS+gT/xjKtoalpBXMoP31eDkTTR+XeEESQm/TTkeO\nUAm3FQKBgD8Y7CLHpyZZ+eOnxRSPU4m4AWAEp7JOwHDRWWQeUornrXDYgD87d2M9\niIAEuOzNggA56Nm3AzBOPRj4HkBh57ToVKPswHwB0oWvrtSjpLkkU6q8xRG3XuJD\n2AskDaZONzIDoJGfZ3+W7YbKELK7DPtFXL15sOfBmpoEkI9RA5vM\n-----END RSA PRIVATE KEY-----\n"
  },
  {
    "path": "src/libssh/tests/keys/ssh_host_rsa_key.pub",
    "content": "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCrNpt5TSgpscPB2WqKd0AG+3OBYK9d0cn53YTDq17YteOTCO7Lu7oHvLrc1lHLntxysThhJ5Yi1Whmf4NY36C5TfnhKz+3ND3+2FSYuu+0o28nC4UXkKHtDgGytcaxvYZK/7tbm2nHfICofVO8pCP8yZBVf7/0q1cSeHv++mIKqg5dABHO8ghDGijVpRAEcCRFbtjDQOzsCML25XWezjF0Fc9CYOTbela8KrsT7us4RspGuOOUClLiUljLSgRewV2pQ934+1PWAbScgSUcVC2xOBS/BhCYkTOsHG/jWh3BG/FsyOBMc+vhItFFFK4/AgJbK/Go+lrsSx8wGds8QhTN asn@magrathea\n"
  },
  {
    "path": "src/libssh/tests/keys/user_ca",
    "content": "-----BEGIN RSA PRIVATE KEY-----\nMIIEowIBAAKCAQEApwNp+bx82W7Pxr0ZBpaCTVdQlxyEuV565tOR7rFCUlsj6tyN\nYgjB3WAO6Hsx2vRghWGyHp2mD8vhulEkEY2EM/ErwGaNOkhTXiUrGtZACKsc3T0/\nZAa0a2Ct/T2UD7GFX0T6mQXZnPo8K38/eyBRCclzCOOxaExpIBKu3rt89qcf7XSG\nd+COR6+QwwcYnGYuI5bskVCR30j6AccoRezpD1+G2JK3OvdY3iEA8bm5eudFmCx4\nBX2ndMU8wSBROl1G+eQ6eQIEXXr0qLKNT3tCChccTFaT+uuCwm2CtOi7+pHKLXxZ\nab1LUdcsfI06BnEqKubEs08L10hwkEPWQNYbxQIDAQABAoIBACW2AaHgS5iVCtln\nLVVterKX+pyEVfu9N6cTMqpg4AbUiYGol0wBijTAUd1wo8s6zuiPLLb5BdwfPzLg\ny3IjMCzCUgy5mz4Dwr9JSThgFElgyb2y7LNbSDXOuLqrwtjgTqs6WhNfXMmzPw7b\nRqw4mdPJ5u2k7BQO3NXfIhks4ISYzpzNAwj1a2NMphvkZyvfRnWiQ0pvEXQCxwuR\n74iGpPFeyFjjku/O4TiHZllPmDdD3ERalkf8RIudQ5gcbL4fRoONTzfZHtmARWoP\nJury4Zfr5b3VGSnkUDaGlzilXvBusAZOCaaU7chvOPVjXMbSAUEpFBmnRHk5dfrH\nfCXECcECgYEA0KMtV3IzwMToVdvzcMQc1ovDvKZAQPneLTxFgNpOeycOhzulzY9p\n3fRi5QUOA/Ff+LcCL86APqwoEYe4bgam6mwGFFhv1usf4ulbLNk8ZeR51CG6emPt\ntLpg6PThxhMnNpu+StrBAOxeo9pZGd+Plt6d4vfoalOHVkPlSv7OC9kCgYEAzO1I\nHuZAQkVdKLGuZlf8E4VEaiMBKdl5+H+8w9peOOax6nqAIrwp2d0aZ52LDjwg7d3C\neSmxu0U1jsbzexVVePr/NmdJOu3+gB0GvlzRjS1xT+MCZIye5a7Nxc7lBp5rFmgV\ndJTA6XXRoykinZIxz068SHqtNhNOzO4hUmPDN80CgYAlxOR4aBwmUX8dy+uOBnKS\nBEsy44XOPW2TEs4iPWLnuHJQ2ONzCvtHSu58NyYKYK/W/opOzTs6HUBDrCYfBOVC\nmrufA0N7zKTBFy2COPFOIMZNOK3haiWmCfdxNKOKj/0RTbBtLJyz5hZb4zMuE+KS\nlUpPxEE2vlhJrZDcurPiQQKBgQCIEqMKCX/vwVlLlTglsxSp7ZrxEw9Jt6O68y7n\nqc9Y3y6ScQc2iVUM2jkXRlA4goqnB9KDW8EthZY7mTXBq/fWXmwqtsi0faW5cgyx\nSLbIlL0h+63yEEHOZ5UxXOFM1NJszW45vDCglOBABCd9E79JVZHGWtc7CfUQNKsh\npybQnQKBgHbPnITR7esVQYLq3PHSsdOdkFiiVf3D7wHiNZcXWjJvUqMF4tH5XAzY\nQafKqKk0FzO92ZOhQeB5xauFY5wzsa+Xl8cQkyvtWngFIKbWydEehZWVgXcedxEC\nxjbZWKmsYDqBYi3bw9Dxb0AvT+kDtq0Azi8QTDAvRwylvtkYj/V8\n-----END RSA PRIVATE KEY-----\n"
  },
  {
    "path": "src/libssh/tests/pkd/CMakeLists.txt",
    "content": "project(pkd C)\n\nif (WITH_SERVER AND UNIX AND NOT WIN32)\n\n    include_directories(${libssh_SOURCE_DIR}/include\n                        ${libssh_BINARY_DIR}/include\n                        ${CMOCKA_INCLUDE_DIR}\n                        ${ZLIB_INCLUDE_DIR}\n                        ${CMAKE_BINARY_DIR}\n                        ${libssh_SOURCE_DIR}/src\n                        ${CMAKE_CURRENT_SOURCE_DIR})\n\nset(pkd_hello_src\n  pkd_daemon.c\n  pkd_hello.c\n  pkd_keyutil.c\n  pkd_util.c\n)\n\nset(pkd_libs\n    ${CMOCKA_LIBRARY}\n    ssh::static\n    ${ARGP_LIBRARIES}\n    pthread\n)\n\nadd_executable(pkd_hello ${pkd_hello_src})\ntarget_compile_options(pkd_hello PRIVATE ${DEFAULT_C_COMPILE_FLAGS})\ntarget_link_libraries(pkd_hello ${pkd_libs})\n\n#\n# pkd_hello_i1 runs only one iteration per algorithm combination for\n# sake of speeding up overall test run time.  More iterations can be\n# specified with `-i` and may be helpful for chasing down bugs that\n# are not 100% reproducible.\n#\nadd_test(pkd_hello_i1 ${CMAKE_CURRENT_BINARY_DIR}/pkd_hello -e -o -i1 -w /tmp/pkd_socket_wrapper_XXXXXX)\n\n#\n# pkd_hello_rekey is used to test server-side implementation of rekeying.\n#\nadd_test(pkd_hello_rekey ${CMAKE_CURRENT_BINARY_DIR}/pkd_hello -t torture_pkd_openssh_rsa_rsa_default -i1 --rekey=16 -v -v -v -w /tmp/pkd_socket_wrapper_XXXXXX)\n\n#\n# Configure environment for cwrap socket wrapper.\n#\nfind_package(socket_wrapper 1.1.5 REQUIRED)\nif (OSX)\n    set(PKD_ENVIRONMENT \"DYLD_FORCE_FLAT_NAMESPACE=1;DYLD_INSERT_LIBRARIES=${SOCKET_WRAPPER_LIBRARY}\")\nelse ()\n    set(PKD_ENVIRONMENT \"LD_PRELOAD=${SOCKET_WRAPPER_LIBRARY}\")\nendif ()\nmessage(STATUS \"PKD_ENVIRONMENT=${PKD_ENVIRONMENT}\")\nset_property(TEST pkd_hello_i1 PROPERTY ENVIRONMENT ${PKD_ENVIRONMENT})\n\nendif (WITH_SERVER AND UNIX AND NOT WIN32)\n"
  },
  {
    "path": "src/libssh/tests/pkd/pkd_client.h",
    "content": "/*\n * pkd_client.h -- macros for generating client-specific command\n *                 invocations for use with pkd testing\n *\n * (c) 2014, 2018 Jon Simons <jon@jonsimons.org>\n */\n\n#ifndef __PKD_CLIENT_H__\n#define __PKD_CLIENT_H__\n\n#include \"config.h\"\n#include \"tests_config.h\"\n\n/* OpenSSH */\n\n#define OPENSSH_BINARY SSH_EXECUTABLE\n#define OPENSSH_KEYGEN \"ssh-keygen\"\n\n#define OPENSSH_HOSTKEY_ALGOS \\\n  \"-o HostKeyAlgorithms=\"        \\\n  OPENSSH_KEYS\n\n#define OPENSSH_PKACCEPTED_TYPES \\\n  \"-o PubkeyAcceptedKeyTypes=\"  \\\n  OPENSSH_KEYS\n\n#define OPENSSH_CMD_START(hostkey_algos) \\\n    OPENSSH_BINARY \" \"                  \\\n    \"-o UserKnownHostsFile=/dev/null \"  \\\n    \"-o StrictHostKeyChecking=no \"      \\\n    \"-F /dev/null \"                     \\\n    hostkey_algos \" \"                   \\\n    OPENSSH_PKACCEPTED_TYPES \" \"        \\\n    \"-i \" CLIENT_ID_FILE \" \"            \\\n    \"1> %s.out \"                        \\\n    \"2> %s.err \"                        \\\n    \"-vvv \"\n\n#define OPENSSH_CMD_END \"-p 1234 localhost ls\"\n\n#define OPENSSH_CMD \\\n    OPENSSH_CMD_START(OPENSSH_HOSTKEY_ALGOS) OPENSSH_CMD_END\n\n#define OPENSSH_KEX_CMD(kexalgo) \\\n    OPENSSH_CMD_START(OPENSSH_HOSTKEY_ALGOS) \"-o KexAlgorithms=\" kexalgo \" \" OPENSSH_CMD_END\n\n#define OPENSSH_CIPHER_CMD(ciphers) \\\n    OPENSSH_CMD_START(OPENSSH_HOSTKEY_ALGOS) \"-c \" ciphers \" \" OPENSSH_CMD_END\n\n#define OPENSSH_MAC_CMD(macs) \\\n    OPENSSH_CMD_START(OPENSSH_HOSTKEY_ALGOS) \"-c aes128-ctr,aes192-ctr,aes256-ctr,aes256-cbc,aes192-cbc,aes128-cbc -o MACs=\" macs \" \" OPENSSH_CMD_END\n\n#define OPENSSH_HOSTKEY_CMD(hostkeyalgo) \\\n    OPENSSH_CMD_START(\"-o HostKeyAlgorithms=\" hostkeyalgo \" \") OPENSSH_CMD_END\n\n#define OPENSSH_CERT_CMD \\\n    OPENSSH_CMD_START(OPENSSH_HOSTKEY_ALGOS) \"-o CertificateFile=\" CLIENT_ID_FILE \"-cert.pub \" OPENSSH_CMD_END\n\n#define OPENSSH_SHA256_CERT_CMD \\\n    OPENSSH_CMD_START(OPENSSH_HOSTKEY_ALGOS) \"-o CertificateFile=\" CLIENT_ID_FILE \"-sha256-cert.pub \" OPENSSH_CMD_END\n\n/* Dropbear */\n\n#define DROPBEAR_BINARY \"dbclient\"\n#define DROPBEAR_KEYGEN \"dropbearkey\"\n\n#define DROPBEAR_CMD_START \\\n    DROPBEAR_BINARY \" \"      \\\n    \"-y -y \"                 \\\n    \"-i \" CLIENT_ID_FILE \" \" \\\n    \"1> %s.out \"             \\\n    \"2> %s.err \"\n\n#define DROPBEAR_CMD_END \"-p 1234 localhost ls\"\n\n#define DROPBEAR_CMD \\\n    DROPBEAR_CMD_START DROPBEAR_CMD_END\n\n#if 0 /* dbclient does not expose control over kex algo */\n#define DROPBEAR_KEX_CMD(kexalgo) \\\n    DROPBEAR_CMD\n#endif\n\n#define DROPBEAR_CIPHER_CMD(ciphers) \\\n    DROPBEAR_CMD_START \"-c \" ciphers \" \" DROPBEAR_CMD_END\n\n#define DROPBEAR_MAC_CMD(macs) \\\n    DROPBEAR_CMD_START \"-m \" macs \" \" DROPBEAR_CMD_END\n\n#endif /* __PKD_CLIENT_H__ */\n"
  },
  {
    "path": "src/libssh/tests/pkd/pkd_daemon.c",
    "content": "/*\n * pkd_daemon.c -- a sample public-key testing daemon using libssh\n *\n * Uses public key authentication to establish an exec channel and\n * echo back payloads to the user.\n *\n * (c) 2014 Jon Simons\n */\n\n#include \"config.h\"\n\n#include <errno.h>\n#include <netinet/in.h>\n#include <pthread.h>\n#include <signal.h>\n#include <stdarg.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <sys/types.h>\n#include <sys/socket.h>\n\n#include <libssh/callbacks.h>\n#include <libssh/libssh.h>\n#include <libssh/server.h>\n#include <libssh/kex.h>\n\n#include \"torture.h\" // for ssh_fips_mode()\n#include \"pkd_daemon.h\"\n\n#include <setjmp.h> // for cmocka\n#include <cmocka.h>\n\nstatic int pkdout_enabled;\nstatic int pkderr_enabled;\n\nstatic void pkdout(const char *fmt, ...) PRINTF_ATTRIBUTE(1, 2);\nstatic void pkderr(const char *fmt, ...) PRINTF_ATTRIBUTE(1, 2);\n\nstatic void pkdout(const char *fmt, ...) {\n    va_list vargs;\n    if (pkdout_enabled) {\n        va_start(vargs, fmt);\n        vfprintf(stdout, fmt, vargs);\n        va_end(vargs);\n    }\n}\n\nstatic void pkderr(const char *fmt, ...) {\n    va_list vargs;\n    if (pkderr_enabled) {\n        va_start(vargs, fmt);\n        vfprintf(stderr, fmt, vargs);\n        va_end(vargs);\n    }\n}\n\n/*\n * pkd state: only one thread can run pkd at a time ---------------------\n */\n\nstatic struct {\n    int rc;\n    pthread_t tid;\n    int keep_going;\n    volatile int pkd_ready;\n} ctx;\n\nstatic struct {\n    int server_fd;\n    int req_exec_received;\n    int close_received;\n    int eof_received;\n} pkd_state;\n\nstatic void pkd_sighandler(int signum) {\n    (void) signum;\n}\n\nstatic int pkd_init_libssh(void)\n{\n    int rc = ssh_threads_set_callbacks(ssh_threads_get_pthread());\n    return (rc == SSH_OK) ? 0 : 1;\n}\n\nstatic int pkd_init_server_fd(short port) {\n    int rc = 0;\n    int yes = 1;\n    struct sockaddr_in addr;\n\n    int server_fd = socket(PF_INET, SOCK_STREAM, 0);\n    if (server_fd < 0) {\n        rc = -1;\n        goto out;\n    }\n\n    rc = setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int));\n    if (rc != 0) {\n        goto outclose;\n    }\n\n    memset(&addr, 0x0, sizeof(addr));\n    addr.sin_family = AF_INET;\n    addr.sin_port = htons(port);\n    addr.sin_addr.s_addr = INADDR_ANY;\n    rc = bind(server_fd, (struct sockaddr *)&addr, sizeof(addr));\n    if (rc != 0) {\n        goto outclose;\n    }\n\n    rc = listen(server_fd, 128);\n    if (rc == 0) {\n        goto out;\n    }\n\noutclose:\n    close(server_fd);\n    server_fd = -1;\nout:\n    pkd_state.server_fd = server_fd;\n    return rc;\n}\n\nstatic int pkd_accept_fd(void)\n{\n    int fd = -1;\n    struct sockaddr_in addr;\n    socklen_t len = sizeof(addr);\n\n    do {\n        fd = accept(pkd_state.server_fd, (struct sockaddr *) &addr, &len);\n    } while ((ctx.keep_going != 0) && (fd < 0) && (errno == EINTR));\n\n    return fd;\n}\n\nstatic void pkd_eof(ssh_session session,\n                    ssh_channel channel,\n                    void *userdata) {\n    (void) session;\n    (void) channel;\n    (void) userdata;\n    pkdout(\"pkd_eof\\n\");\n    pkd_state.eof_received = 1;\n}\n\nstatic void pkd_chan_close(ssh_session session,\n                           ssh_channel channel,\n                           void *userdata) {\n    (void) session;\n    (void) channel;\n    (void) userdata;\n    pkdout(\"pkd_chan_close\\n\");\n    pkd_state.close_received = 1;\n}\n\nstatic int pkd_req_exec(ssh_session s,\n                        ssh_channel c,\n                        const char *cmd,\n                        void *userdata) {\n    (void) s;\n    (void) c;\n    (void) cmd;\n    (void) userdata;\n    /* assumes pubkey authentication has already succeeded */\n    pkdout(\"pkd_req_exec\\n\");\n    pkd_state.req_exec_received = 1;\n    return 0;\n}\n\n/* assumes there is only ever a single channel */\nstatic struct ssh_channel_callbacks_struct pkd_channel_cb = {\n    .channel_eof_function = pkd_eof,\n    .channel_close_function = pkd_chan_close,\n    .channel_exec_request_function = pkd_req_exec,\n};\n\nstatic int pkd_auth_pubkey_cb(ssh_session s,\n                              const char *user,\n                              ssh_key key,\n                              char state,\n                              void *userdata) {\n    (void) s;\n    (void) user;\n    (void) key;\n    (void) state;\n    (void) userdata;\n    pkdout(\"pkd_auth_pubkey_cb keytype %s, state: %d\\n\",\n           ssh_key_type_to_char(ssh_key_type(key)), state);\n    if ((state == SSH_PUBLICKEY_STATE_NONE) ||\n        (state == SSH_PUBLICKEY_STATE_VALID)) {\n        return SSH_AUTH_SUCCESS;\n    }\n    return SSH_AUTH_DENIED;\n}\n\nstatic int pkd_service_request_cb(ssh_session session,\n                                  const char *service,\n                                  void *userdata) {\n    (void) session;\n    (void) userdata;\n    pkdout(\"pkd_service_request_cb: %s\\n\", service);\n    return (0 == (strcmp(service, \"ssh-userauth\"))) ? 0 : -1;\n}\n\nstatic ssh_channel pkd_channel_openreq_cb(ssh_session s,\n                                          void *userdata) {\n    ssh_channel c = NULL;\n    ssh_channel *out = (ssh_channel *) userdata;\n\n    /* assumes pubkey authentication has already succeeded */\n    pkdout(\"pkd_channel_openreq_cb\\n\");\n\n    c = ssh_channel_new(s);\n    if (c == NULL) {\n        pkderr(\"ssh_channel_new: %s\\n\", ssh_get_error(s));\n        return NULL;\n    }\n\n    ssh_callbacks_init(&pkd_channel_cb);\n    pkd_channel_cb.userdata = userdata;\n    if (ssh_set_channel_callbacks(c, &pkd_channel_cb) != SSH_OK) {\n        pkderr(\"ssh_set_channel_callbacks: %s\\n\", ssh_get_error(s));\n        ssh_channel_free(c);\n        c = NULL;\n    }\n\n    *out = c;\n\n    return c;\n}\n\nstatic struct ssh_server_callbacks_struct pkd_server_cb = {\n    .auth_pubkey_function = pkd_auth_pubkey_cb,\n    .service_request_function = pkd_service_request_cb,\n    .channel_open_request_session_function = pkd_channel_openreq_cb,\n};\n\nstatic int pkd_exec_hello(int fd, struct pkd_daemon_args *args)\n{\n    int rc = -1;\n    ssh_bind b = NULL;\n    ssh_session s = NULL;\n    ssh_event e = NULL;\n    ssh_channel c = NULL;\n    enum ssh_bind_options_e opts = -1;\n\n    int level = args->opts.libssh_log_level;\n    enum pkd_hostkey_type_e type = args->type;\n    const char *hostkeypath = args->hostkeypath;\n    const char *default_kex = NULL;\n    char *all_kex = NULL;\n    size_t kex_len = 0;\n    const char *all_ciphers = NULL;\n    const uint64_t rekey_data_limit = args->rekey_data_limit;\n    bool process_config = false;\n\n    pkd_state.eof_received = 0;\n    pkd_state.close_received  = 0;\n    pkd_state.req_exec_received = 0;\n\n    b = ssh_bind_new();\n    if (b == NULL) {\n        pkderr(\"ssh_bind_new\\n\");\n        goto outclose;\n    }\n\n    if (type == PKD_RSA) {\n        opts = SSH_BIND_OPTIONS_RSAKEY;\n    } else if (type == PKD_ED25519) {\n        opts = SSH_BIND_OPTIONS_HOSTKEY;\n#ifdef HAVE_DSA\n    } else if (type == PKD_DSA) {\n        opts = SSH_BIND_OPTIONS_DSAKEY;\n#endif\n    } else if (type == PKD_ECDSA) {\n        opts = SSH_BIND_OPTIONS_ECDSAKEY;\n    } else {\n        pkderr(\"unknown hostkey type: %d\\n\", type);\n        rc = -1;\n        goto outclose;\n    }\n\n    rc = ssh_bind_options_set(b, opts, hostkeypath);\n    if (rc != 0) {\n        pkderr(\"ssh_bind_options_set: %s\\n\", ssh_get_error(b));\n        goto outclose;\n    }\n\n    rc = ssh_bind_options_set(b, SSH_BIND_OPTIONS_LOG_VERBOSITY, &level);\n    if (rc != 0) {\n        pkderr(\"ssh_bind_options_set log verbosity: %s\\n\", ssh_get_error(b));\n        goto outclose;\n    }\n\n    rc = ssh_bind_options_set(b, SSH_BIND_OPTIONS_PROCESS_CONFIG,\n                              &process_config);\n    if (rc != 0) {\n        pkderr(\"ssh_bind_options_set process config: %s\\n\", ssh_get_error(b));\n        goto outclose;\n    }\n\n    if (!ssh_fips_mode()) {\n        /* Add methods not enabled by default */\n#define GEX_SHA1 \"diffie-hellman-group-exchange-sha1\"\n        default_kex = ssh_kex_get_default_methods(SSH_KEX);\n        kex_len = strlen(default_kex) + strlen(GEX_SHA1) + 2;\n        all_kex = malloc(kex_len);\n        if (all_kex == NULL) {\n            pkderr(\"Failed to alloc more memory.\\n\");\n            goto outclose;\n        }\n        snprintf(all_kex, kex_len, \"%s,\" GEX_SHA1, default_kex);\n        rc = ssh_bind_options_set(b, SSH_BIND_OPTIONS_KEY_EXCHANGE, all_kex);\n        free(all_kex);\n        if (rc != 0) {\n            pkderr(\"ssh_bind_options_set kex methods: %s\\n\", ssh_get_error(b));\n            goto outclose;\n        }\n\n        /* Enable all supported ciphers */\n        all_ciphers = ssh_kex_get_supported_method(SSH_CRYPT_C_S);\n        rc = ssh_bind_options_set(b, SSH_BIND_OPTIONS_CIPHERS_C_S, all_ciphers);\n        if (rc != 0) {\n            pkderr(\"ssh_bind_options_set Ciphers C-S: %s\\n\", ssh_get_error(b));\n            goto outclose;\n        }\n\n        all_ciphers = ssh_kex_get_supported_method(SSH_CRYPT_S_C);\n        rc = ssh_bind_options_set(b, SSH_BIND_OPTIONS_CIPHERS_S_C, all_ciphers);\n        if (rc != 0) {\n            pkderr(\"ssh_bind_options_set Ciphers S-C: %s\\n\", ssh_get_error(b));\n            goto outclose;\n        }\n    }\n\n    s = ssh_new();\n    if (s == NULL) {\n        pkderr(\"ssh_new\\n\");\n        goto outclose;\n    }\n\n    rc = ssh_options_set(s, SSH_OPTIONS_REKEY_DATA, &rekey_data_limit);\n    if (rc != 0) {\n        pkderr(\"ssh_options_set rekey data: %s\\n\", ssh_get_error(s));\n        goto outclose;\n    }\n\n    /*\n     * ssh_bind_accept loads host key as side-effect.  If this\n     * succeeds, the given 'fd' will be closed upon 'ssh_free(s)'.\n     */\n    rc = ssh_bind_accept_fd(b, s, fd);\n    if (rc != SSH_OK) {\n        pkderr(\"ssh_bind_accept_fd: %s\\n\", ssh_get_error(b));\n        goto outclose;\n    }\n\n    /* accept only publickey-based auth */\n    ssh_set_auth_methods(s, SSH_AUTH_METHOD_PUBLICKEY);\n\n    /* initialize callbacks */\n    ssh_callbacks_init(&pkd_server_cb);\n    pkd_server_cb.userdata = &c;\n    rc = ssh_set_server_callbacks(s, &pkd_server_cb);\n    if (rc != SSH_OK) {\n        pkderr(\"ssh_set_server_callbacks: %s\\n\", ssh_get_error(s));\n        goto out;\n    }\n\n    /* first do key exchange */\n    rc = ssh_handle_key_exchange(s);\n    if (rc != SSH_OK) {\n        pkderr(\"ssh_handle_key_exchange: %s\\n\", ssh_get_error(s));\n        goto out;\n    }\n\n    /* setup and pump event to carry out exec channel */\n    e = ssh_event_new();\n    if (e == NULL) {\n        pkderr(\"ssh_event_new\\n\");\n        goto out;\n    }\n\n    rc = ssh_event_add_session(e, s);\n    if (rc != SSH_OK) {\n        pkderr(\"ssh_event_add_session\\n\");\n        goto out;\n    }\n\n    /* poll until exec channel established */\n    while ((ctx.keep_going != 0) &&\n           (rc != SSH_ERROR) && (pkd_state.req_exec_received == 0)) {\n        rc = ssh_event_dopoll(e, -1 /* infinite timeout */);\n    }\n\n    if (rc == SSH_ERROR) {\n        pkderr(\"ssh_event_dopoll\\n\");\n        goto out;\n    } else if (c == NULL) {\n        pkderr(\"poll loop exited but exec channel not ready\\n\");\n        rc = -1;\n        goto out;\n    }\n\n    rc = ssh_channel_write(c, args->payload.buf, args->payload.len);\n    if (rc != (int)args->payload.len) {\n        pkderr(\"ssh_channel_write partial (%d != %zd)\\n\", rc, args->payload.len);\n    }\n\n    rc = ssh_channel_request_send_exit_status(c, 0);\n    if (rc != SSH_OK) {\n        pkderr(\"ssh_channel_request_send_exit_status: %s\\n\",\n                        ssh_get_error(s));\n        goto out;\n    }\n\n    rc = ssh_channel_send_eof(c);\n    if (rc != SSH_OK) {\n        pkderr(\"ssh_channel_send_eof: %s\\n\", ssh_get_error(s));\n        goto out;\n    }\n\n    rc = ssh_channel_close(c);\n    if (rc != SSH_OK) {\n        pkderr(\"ssh_channel_close: %s\\n\", ssh_get_error(s));\n        goto out;\n    }\n\n    while ((ctx.keep_going != 0) &&\n           (pkd_state.eof_received == 0) &&\n           (pkd_state.close_received == 0)) {\n        rc = ssh_event_dopoll(e, 1000 /* milliseconds */);\n        if (rc == SSH_ERROR) {\n            /* log, but don't consider this fatal */\n            pkdout(\"ssh_event_dopoll for eof + close: %s\\n\", ssh_get_error(s));\n            rc = 0;\n            break;\n        } else {\n            rc = 0;\n        }\n    }\n\n    while ((ctx.keep_going != 0) &&\n           (ssh_is_connected(s))) {\n        rc = ssh_event_dopoll(e, 1000 /* milliseconds */);\n        if (rc == SSH_ERROR) {\n            /* log, but don't consider this fatal */\n            pkdout(\"ssh_event_dopoll for session connection: %s\\n\", ssh_get_error(s));\n            rc = 0;\n            break;\n        } else {\n            rc = 0;\n        }\n    }\n    goto out;\n\noutclose:\n    close(fd);\nout:\n    if (c != NULL) {\n        ssh_channel_free(c);\n    }\n    if (e != NULL) {\n        ssh_event_remove_session(e, s);\n        ssh_event_free(e);\n    }\n    if (s != NULL) {\n        ssh_disconnect(s);\n        ssh_free(s);\n    }\n    if (b != NULL) {\n        ssh_bind_free(b);\n    }\n    return rc;\n}\n\n/*\n * main loop ------------------------------------------------------------\n */\n\nstatic void *pkd_main(void *args) {\n    int rc = -1;\n    struct pkd_daemon_args *a = (struct pkd_daemon_args *) args;\n\n    struct sigaction act = { .sa_handler = pkd_sighandler, };\n\n    pkd_state.server_fd = -1;\n    pkd_state.req_exec_received = 0;\n    pkd_state.close_received = 0;\n    pkd_state.eof_received = 0;\n\n    /* SIGUSR1 is used to interrupt 'pkd_accept_fd'. */\n    rc = sigaction(SIGUSR1, &act, NULL);\n    if (rc != 0) {\n        pkderr(\"sigaction: %d\\n\", rc);\n        goto out;\n    }\n\n    /* Ignore SIGPIPE */\n    signal(SIGPIPE, SIG_IGN);\n\n    rc = pkd_init_libssh();\n    if (rc != 0) {\n        pkderr(\"pkd_init_libssh: %d\\n\", rc);\n        goto out;\n    }\n\n    rc = pkd_init_server_fd(1234);\n    if (rc != 0) {\n        pkderr(\"pkd_init_server_fd: %d\\n\", rc);\n        goto out;\n    }\n\n    ctx.pkd_ready = 1;\n\n    while (ctx.keep_going != 0) {\n        int fd = pkd_accept_fd();\n        if (fd < 0) {\n            if (ctx.keep_going != 0) {\n                pkderr(\"pkd_accept_fd\");\n                rc = -1;\n            } else {\n                rc = 0;\n            }\n            break;\n        }\n\n        rc = pkd_exec_hello(fd, a);\n        if (rc != 0) {\n            pkderr(\"pkd_exec_hello: %d\\n\", rc);\n            break;\n        }\n    }\n\n    if (pkd_state.server_fd != -1) {\n        close(pkd_state.server_fd);\n    }\n    pkd_state.server_fd = -1;\nout:\n    ctx.rc = rc;\n\n    return NULL;\n}\n\n/*\n * pkd start and stop used by setup/teardown test scaffolding -----------\n */\n\nint pkd_start(struct pkd_daemon_args *args) {\n    int rc = 0;\n\n    pkdout_enabled = args->opts.log_stdout;\n    pkderr_enabled = args->opts.log_stderr;\n\n    /* Initialize the pkd context. */\n    ctx.rc = -1;\n    ctx.keep_going = 1;\n    ctx.pkd_ready = 0;\n    rc = pthread_create(&ctx.tid, NULL, &pkd_main, args);\n    assert_int_equal(rc, 0);\n\n    /* Busy-spin until pkd thread is ready. */\n    while (ctx.pkd_ready == 0);\n\n    return rc;\n}\n\nvoid pkd_stop(struct pkd_result *out) {\n    int rc = 0;\n\n    ctx.keep_going = 0;\n    close(pkd_state.server_fd);\n\n    rc = pthread_kill(ctx.tid, SIGUSR1);\n    assert_int_equal(rc, 0);\n\n    rc = pthread_join(ctx.tid, NULL);\n    assert_int_equal(rc, 0);\n\n    assert_non_null(out);\n    out->ok = (ctx.rc == 0);\n\n    return;\n}\n"
  },
  {
    "path": "src/libssh/tests/pkd/pkd_daemon.h",
    "content": "/*\n * pkd_daemon.h -- tests use this interface to start, stop pkd\n *                 instances and get results\n *\n * (c) 2014 Jon Simons\n */\n\n#ifndef __PKD_DAEMON_H__\n#define __PKD_DAEMON_H__\n\n#include \"config.h\"\n\nenum pkd_hostkey_type_e {\n    PKD_RSA,\n#ifdef HAVE_DSA\n    PKD_DSA,\n#endif\n    PKD_ED25519,\n    PKD_ECDSA\n};\n\nstruct pkd_daemon_args {\n    enum pkd_hostkey_type_e type;\n    const char *hostkeypath;\n\n    struct {\n        const uint8_t *buf;\n        size_t len;\n    } payload;\n\n    uint64_t rekey_data_limit;\n\n    struct {\n        int list;\n\n        int log_stdout;\n        int log_stderr;\n        int libssh_log_level;\n\n        const char *testname;\n        const char *testmatch;\n        unsigned int iterations;\n\n        struct {\n            char *mkdtemp_str;\n        } socket_wrapper;\n    } opts;\n};\n\nstruct pkd_result {\n    int ok;\n};\n\nint pkd_start(struct pkd_daemon_args *args);\nvoid pkd_stop(struct pkd_result *out);\n\n#endif /* __PKD_DAEMON_H__ */\n"
  },
  {
    "path": "src/libssh/tests/pkd/pkd_hello.c",
    "content": "/*\n * pkd_hello.c --\n *\n * (c) 2014, 2017-2018 Jon Simons <jon@jonsimons.org>\n */\n#include \"config.h\"\n\n#include <setjmp.h> // for cmocka\n#include <stdarg.h> // for cmocka\n#include <stdio.h>\n#include <stdlib.h>\n#include <unistd.h> // for cmocka\n#include <cmocka.h>\n\n#include \"libssh/priv.h\"\n#include \"torture.h\" // for ssh_fips_mode()\n\n#include \"pkd_client.h\"\n#include \"pkd_daemon.h\"\n#include \"pkd_keyutil.h\"\n#include \"pkd_util.h\"\n\n#define DEFAULT_ITERATIONS 10\nstatic struct pkd_daemon_args pkd_dargs;\n\nstatic uint8_t default_payload_buf[] = {\n    'h', 'e', 'l', 'l', 'o', '\\n',\n};\n\nstatic size_t default_payload_len = sizeof(default_payload_buf);\n\n#ifdef HAVE_ARGP_H\n#include <argp.h>\n#define PROGNAME \"pkd_hello\"\n#define ARGP_PROGNAME \"libssh \" PROGNAME\nconst char *argp_program_version = ARGP_PROGNAME \" 2017-07-12\";\nconst char *argp_program_bug_address = \"Jon Simons <jon@jonsimons.org>\";\n\nstatic char doc[] = \\\n    \"\\nExample usage:\\n\\n\"\n    \"    \" PROGNAME \"\\n\"\n    \"        Run all tests with default number of iterations.\\n\"\n    \"    \" PROGNAME \" --list\\n\"\n    \"        List available individual test names.\\n\"\n    \"    \" PROGNAME \" -i 1000 -t torture_pkd_rsa_ecdh_sha2_nistp256\\n\"\n    \"        Run only the torture_pkd_rsa_ecdh_sha2_nistp256 testcase 1000 times.\\n\"\n    \"    \" PROGNAME \" -i 1000 -m curve25519\\n\"\n    \"        Run all tests with the string 'curve25519' 1000 times.\\n\"\n    \"    \" PROGNAME \" -v -v -v -v -e -o\\n\"\n    \"        Run all tests with maximum libssh and pkd logging.\\n\"\n;\n\nstatic struct argp_option options[] = {\n    { \"buffer\", 'b', \"string\", 0,\n      \"Use the given string for test buffer payload contents\", 0 },\n    { \"stderr\", 'e', NULL, 0,\n      \"Emit pkd stderr messages\", 0 },\n    { \"list\", 'l', NULL, 0,\n      \"List available individual test names\", 0 },\n    { \"iterations\", 'i', \"number\", 0,\n      \"Run each test for the given number of iterations (default is 10)\", 0 },\n    { \"match\", 'm', \"testmatch\", 0,\n      \"Run all tests with the given string\", 0 },\n    { \"socket-wrapper-dir\", 'w', \"<mkdtemp-template>\", 0,\n      \"Run in socket-wrapper mode using the given mkdtemp directory template\", 0 },\n    { \"stdout\", 'o', NULL, 0,\n      \"Emit pkd stdout messages\", 0 },\n    { \"rekey\", 'r', \"limit\", 0,\n      \"Set the given rekey data limit, in bytes, using SSH_OPTIONS_REKEY_DATA\", 0 },\n    { \"test\", 't', \"testname\", 0,\n      \"Run tests matching the given testname\", 0 },\n    { \"verbose\", 'v', NULL, 0,\n      \"Increase libssh verbosity (can be used multiple times)\", 0 },\n    { NULL, 0, NULL, 0,\n      NULL, 0 },\n};\n\nstatic error_t parse_opt(int key, char *arg, struct argp_state *state) {\n    (void) arg;\n    (void) state;\n\n    switch(key) {\n    case 'b':\n        pkd_dargs.payload.buf = (uint8_t *) arg;\n        pkd_dargs.payload.len = strlen(arg);\n        break;\n    case 'e':\n        pkd_dargs.opts.log_stderr = 1;\n        break;\n    case 'l':\n        pkd_dargs.opts.list = 1;\n        break;\n    case 'i':\n        pkd_dargs.opts.iterations = atoi(arg);\n        break;\n    case 'm':\n        pkd_dargs.opts.testmatch = arg;\n        break;\n    case 'o':\n        pkd_dargs.opts.log_stdout = 1;\n        break;\n    case 'r':\n        pkd_dargs.rekey_data_limit = atoi(arg);\n        break;\n    case 't':\n        pkd_dargs.opts.testname = arg;\n        break;\n    case 'v':\n        pkd_dargs.opts.libssh_log_level += 1;\n        break;\n    case 'w':\n        pkd_dargs.opts.socket_wrapper.mkdtemp_str = arg;\n        break;\n    default:\n        return ARGP_ERR_UNKNOWN;\n    }\n\n    return 0;\n}\n\nstatic struct argp parser = {\n    options,\n    parse_opt,\n    NULL,\n    doc,\n    NULL,\n    NULL,\n    NULL\n};\n#endif /* HAVE_ARGP_H */\n\nstatic struct pkd_state *torture_pkd_setup(enum pkd_hostkey_type_e type,\n                                           const char *hostkeypath) {\n    int rc = 0;\n\n    pkd_dargs.type = type;\n    pkd_dargs.hostkeypath = hostkeypath;\n\n    rc = pkd_start(&pkd_dargs);\n    assert_int_equal(rc, 0);\n\n    return NULL;\n}\n\nstatic int torture_pkd_teardown(void **state) {\n    struct pkd_result result = { .ok = 0 };\n\n    (void) state;\n\n    pkd_stop(&result);\n    assert_int_equal(result.ok, 1);\n\n    return 0;\n}\n\n/*\n * one setup for each server keytype ------------------------------------\n */\n\nstatic int torture_pkd_setup_noop(void **state) {\n    *state = (void *) torture_pkd_setup(PKD_RSA, NULL /*path*/);\n\n    return 0;\n}\n\nstatic int torture_pkd_setup_rsa(void **state) {\n    setup_rsa_key();\n    *state = (void *) torture_pkd_setup(PKD_RSA, LIBSSH_RSA_TESTKEY);\n\n    return 0;\n}\n\nstatic int torture_pkd_setup_ed25519(void **state) {\n    setup_ed25519_key();\n    *state = (void *) torture_pkd_setup(PKD_ED25519, LIBSSH_ED25519_TESTKEY);\n\n    return 0;\n}\n\n#ifdef HAVE_DSA\nstatic int torture_pkd_setup_dsa(void **state) {\n    setup_dsa_key();\n    *state = (void *) torture_pkd_setup(PKD_DSA, LIBSSH_DSA_TESTKEY);\n\n    return 0;\n}\n#endif\n\nstatic int torture_pkd_setup_ecdsa_256(void **state) {\n    setup_ecdsa_keys();\n    *state = (void *) torture_pkd_setup(PKD_ECDSA, LIBSSH_ECDSA_256_TESTKEY);\n\n    return 0;\n}\n\nstatic int torture_pkd_setup_ecdsa_384(void **state) {\n    setup_ecdsa_keys();\n    *state = (void *) torture_pkd_setup(PKD_ECDSA, LIBSSH_ECDSA_384_TESTKEY);\n\n    return 0;\n}\n\nstatic int torture_pkd_setup_ecdsa_521(void **state) {\n    setup_ecdsa_keys();\n    *state = (void *) torture_pkd_setup(PKD_ECDSA, LIBSSH_ECDSA_521_TESTKEY);\n\n    return 0;\n}\n\n/*\n * Test matrices: f(clientname, testname, ssh-command, setup-function, teardown-function).\n */\n\n#define PKDTESTS_DEFAULT_FIPS(f, client, cmd) \\\n    f(client, rsa_default,        cmd,  setup_rsa,        teardown) \\\n    f(client, ecdsa_256_default,  cmd,  setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_384_default,  cmd,  setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_521_default,  cmd,  setup_ecdsa_521,  teardown)\n\n#ifdef HAVE_DSA\n#define PKDTESTS_DEFAULT(f, client, cmd) \\\n    /* Default passes by server key type. */ \\\n    PKDTESTS_DEFAULT_FIPS(f, client, cmd) \\\n    f(client, dsa_default,        cmd,  setup_dsa,        teardown)\n#else\n#define PKDTESTS_DEFAULT(f, client, cmd) \\\n    /* Default passes by server key type. */ \\\n    PKDTESTS_DEFAULT_FIPS(f, client, cmd)\n#endif\n\n#define PKDTESTS_DEFAULT_OPENSSHONLY(f, client, cmd) \\\n    /* Default passes by server key type. */ \\\n    f(client, ed25519_default,    cmd,  setup_ed25519,    teardown)\n\n#define GEX_SHA256 \"diffie-hellman-group-exchange-sha256\"\n#define GEX_SHA1   \"diffie-hellman-group-exchange-sha1\"\n\n#if defined(WITH_GEX)\n#define PKDTESTS_KEX_FIPS(f, client, kexcmd) \\\n    f(client, rsa_ecdh_sha2_nistp256,                 kexcmd(\"ecdh-sha2-nistp256\"),            setup_rsa,        teardown) \\\n    f(client, rsa_ecdh_sha2_nistp384,                 kexcmd(\"ecdh-sha2-nistp384\"),            setup_rsa,        teardown) \\\n    f(client, rsa_ecdh_sha2_nistp521,                 kexcmd(\"ecdh-sha2-nistp521\"),            setup_rsa,        teardown) \\\n    f(client, rsa_diffie_hellman_group16_sha512,      kexcmd(\"diffie-hellman-group16-sha512\"), setup_rsa,        teardown) \\\n    f(client, rsa_diffie_hellman_group18_sha512,      kexcmd(\"diffie-hellman-group18-sha512\"), setup_rsa,        teardown) \\\n    f(client, ecdsa_256_ecdh_sha2_nistp256,           kexcmd(\"ecdh-sha2-nistp256\"),            setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_256_ecdh_sha2_nistp384,           kexcmd(\"ecdh-sha2-nistp384\"),            setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_256_ecdh_sha2_nistp521,           kexcmd(\"ecdh-sha2-nistp521\"),            setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_256_diffie_hellman_group16_sha512,kexcmd(\"diffie-hellman-group16-sha512\"), setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_256_diffie_hellman_group18_sha512,kexcmd(\"diffie-hellman-group18-sha512\"), setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_384_ecdh_sha2_nistp256,           kexcmd(\"ecdh-sha2-nistp256\"),            setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_384_ecdh_sha2_nistp384,           kexcmd(\"ecdh-sha2-nistp384\"),            setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_384_ecdh_sha2_nistp521,           kexcmd(\"ecdh-sha2-nistp521\"),            setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_384_diffie_hellman_group16_sha512,kexcmd(\"diffie-hellman-group16-sha512\"), setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_384_diffie_hellman_group18_sha512,kexcmd(\"diffie-hellman-group18-sha512\"), setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_521_ecdh_sha2_nistp256,           kexcmd(\"ecdh-sha2-nistp256\"),            setup_ecdsa_521,  teardown) \\\n    f(client, ecdsa_521_ecdh_sha2_nistp384,           kexcmd(\"ecdh-sha2-nistp384\"),            setup_ecdsa_521,  teardown) \\\n    f(client, ecdsa_521_ecdh_sha2_nistp521,           kexcmd(\"ecdh-sha2-nistp521\"),            setup_ecdsa_521,  teardown) \\\n    f(client, ecdsa_521_diffie_hellman_group16_sha512,kexcmd(\"diffie-hellman-group16-sha512\"), setup_ecdsa_521,  teardown) \\\n    f(client, ecdsa_521_diffie_hellman_group18_sha512,kexcmd(\"diffie-hellman-group18-sha512\"), setup_ecdsa_521,  teardown) \\\n    f(client, rsa_diffie_hellman_group_exchange_sha256,       kexcmd(GEX_SHA256),              setup_rsa,        teardown) \\\n    f(client, ecdsa_256_diffie_hellman_group_exchange_sha256, kexcmd(GEX_SHA256),              setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_384_diffie_hellman_group_exchange_sha256, kexcmd(GEX_SHA256),              setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_521_diffie_hellman_group_exchange_sha256, kexcmd(GEX_SHA256),              setup_ecdsa_521,  teardown)\n#else /* !defined(WITH_GEX) */\n#define PKDTESTS_KEX_FIPS(f, client, kexcmd) \\\n    f(client, rsa_ecdh_sha2_nistp256,                 kexcmd(\"ecdh-sha2-nistp256\"),            setup_rsa,        teardown) \\\n    f(client, rsa_ecdh_sha2_nistp384,                 kexcmd(\"ecdh-sha2-nistp384\"),            setup_rsa,        teardown) \\\n    f(client, rsa_ecdh_sha2_nistp521,                 kexcmd(\"ecdh-sha2-nistp521\"),            setup_rsa,        teardown) \\\n    f(client, rsa_diffie_hellman_group14_sha256,      kexcmd(\"diffie-hellman-group14-sha256\"), setup_rsa,        teardown) \\\n    f(client, rsa_diffie_hellman_group16_sha512,      kexcmd(\"diffie-hellman-group16-sha512\"), setup_rsa,        teardown) \\\n    f(client, rsa_diffie_hellman_group18_sha512,      kexcmd(\"diffie-hellman-group18-sha512\"), setup_rsa,        teardown) \\\n    f(client, ecdsa_256_ecdh_sha2_nistp256,           kexcmd(\"ecdh-sha2-nistp256\"),            setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_256_ecdh_sha2_nistp384,           kexcmd(\"ecdh-sha2-nistp384\"),            setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_256_ecdh_sha2_nistp521,           kexcmd(\"ecdh-sha2-nistp521\"),            setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_256_diffie_hellman_group14_sha256,kexcmd(\"diffie-hellman-group14-sha256\"), setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_256_diffie_hellman_group16_sha512,kexcmd(\"diffie-hellman-group16-sha512\"), setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_256_diffie_hellman_group18_sha512,kexcmd(\"diffie-hellman-group18-sha512\"), setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_384_ecdh_sha2_nistp256,           kexcmd(\"ecdh-sha2-nistp256\"),            setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_384_ecdh_sha2_nistp384,           kexcmd(\"ecdh-sha2-nistp384\"),            setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_384_ecdh_sha2_nistp521,           kexcmd(\"ecdh-sha2-nistp521\"),            setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_384_diffie_hellman_group14_sha256,kexcmd(\"diffie-hellman-group14-sha256\"), setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_384_diffie_hellman_group16_sha512,kexcmd(\"diffie-hellman-group16-sha512\"), setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_384_diffie_hellman_group18_sha512,kexcmd(\"diffie-hellman-group18-sha512\"), setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_521_ecdh_sha2_nistp256,           kexcmd(\"ecdh-sha2-nistp256\"),            setup_ecdsa_521,  teardown) \\\n    f(client, ecdsa_521_ecdh_sha2_nistp384,           kexcmd(\"ecdh-sha2-nistp384\"),            setup_ecdsa_521,  teardown) \\\n    f(client, ecdsa_521_ecdh_sha2_nistp521,           kexcmd(\"ecdh-sha2-nistp521\"),            setup_ecdsa_521,  teardown) \\\n    f(client, ecdsa_521_diffie_hellman_group14_sha256,kexcmd(\"diffie-hellman-group14-sha256\"), setup_ecdsa_521,  teardown) \\\n    f(client, ecdsa_521_diffie_hellman_group16_sha512,kexcmd(\"diffie-hellman-group16-sha512\"), setup_ecdsa_521,  teardown) \\\n    f(client, ecdsa_521_diffie_hellman_group18_sha512,kexcmd(\"diffie-hellman-group18-sha512\"), setup_ecdsa_521,  teardown)\n#endif\n\n#define PKDTESTS_KEX_COMMON(f, client, kexcmd) \\\n    PKDTESTS_KEX_FIPS(f, client, kexcmd) \\\n    f(client, rsa_curve25519_sha256,                  kexcmd(\"curve25519-sha256\"),             setup_rsa,        teardown) \\\n    f(client, rsa_curve25519_sha256_libssh_org,       kexcmd(\"curve25519-sha256@libssh.org\"),  setup_rsa,        teardown) \\\n    f(client, rsa_diffie_hellman_group14_sha1,        kexcmd(\"diffie-hellman-group14-sha1\"),   setup_rsa,        teardown) \\\n    f(client, rsa_diffie_hellman_group1_sha1,         kexcmd(\"diffie-hellman-group1-sha1\"),    setup_rsa,        teardown) \\\n    f(client, ecdsa_256_curve25519_sha256,            kexcmd(\"curve25519-sha256\"),             setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_256_curve25519_sha256_libssh_org, kexcmd(\"curve25519-sha256@libssh.org\"),  setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_256_diffie_hellman_group14_sha1,  kexcmd(\"diffie-hellman-group14-sha1\"),   setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_256_diffie_hellman_group1_sha1,   kexcmd(\"diffie-hellman-group1-sha1\"),    setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_384_curve25519_sha256,            kexcmd(\"curve25519-sha256\"),             setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_384_curve25519_sha256_libssh_org, kexcmd(\"curve25519-sha256@libssh.org\"),  setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_384_diffie_hellman_group14_sha1,  kexcmd(\"diffie-hellman-group14-sha1\"),   setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_384_diffie_hellman_group1_sha1,   kexcmd(\"diffie-hellman-group1-sha1\"),    setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_521_curve25519_sha256,            kexcmd(\"curve25519-sha256\"),             setup_ecdsa_521,  teardown) \\\n    f(client, ecdsa_521_curve25519_sha256_libssh_org, kexcmd(\"curve25519-sha256@libssh.org\"),  setup_ecdsa_521,  teardown) \\\n    f(client, ecdsa_521_diffie_hellman_group14_sha1,  kexcmd(\"diffie-hellman-group14-sha1\"),   setup_ecdsa_521,  teardown) \\\n    f(client, ecdsa_521_diffie_hellman_group1_sha1,   kexcmd(\"diffie-hellman-group1-sha1\"),    setup_ecdsa_521,  teardown)\n\n#if defined(HAVE_DSA) && defined(WITH_GEX)\n    /* GEX_SHA256 with RSA and ECDSA is included in PKDTESTS_KEX_FIPS if available */\n#define PKDTESTS_KEX(f, client, kexcmd) \\\n    /* Kex algorithms. */ \\\n    PKDTESTS_KEX_COMMON(f, client, kexcmd) \\\n    f(client, rsa_diffie_hellman_group_exchange_sha1, kexcmd(GEX_SHA1),                        setup_rsa,        teardown) \\\n    f(client, dsa_curve25519_sha256,                  kexcmd(\"curve25519-sha256\"),             setup_dsa,        teardown) \\\n    f(client, dsa_curve25519_sha256_libssh_org,       kexcmd(\"curve25519-sha256@libssh.org\"),  setup_dsa,        teardown) \\\n    f(client, dsa_ecdh_sha2_nistp256,                 kexcmd(\"ecdh-sha2-nistp256 \"),           setup_dsa,        teardown) \\\n    f(client, dsa_ecdh_sha2_nistp384,                 kexcmd(\"ecdh-sha2-nistp384 \"),           setup_dsa,        teardown) \\\n    f(client, dsa_ecdh_sha2_nistp521,                 kexcmd(\"ecdh-sha2-nistp521 \"),           setup_dsa,        teardown) \\\n    f(client, dsa_diffie_hellman_group16_sha512,      kexcmd(\"diffie-hellman-group16-sha512\"), setup_dsa,        teardown) \\\n    f(client, dsa_diffie_hellman_group18_sha512,      kexcmd(\"diffie-hellman-group18-sha512\"), setup_dsa,        teardown) \\\n    f(client, dsa_diffie_hellman_group14_sha1,        kexcmd(\"diffie-hellman-group14-sha1\"),   setup_dsa,        teardown) \\\n    f(client, dsa_diffie_hellman_group14_sha256,      kexcmd(\"diffie-hellman-group14-sha256\"), setup_dsa,        teardown) \\\n    f(client, dsa_diffie_hellman_group1_sha1,         kexcmd(\"diffie-hellman-group1-sha1\"),    setup_dsa,        teardown) \\\n    f(client, dsa_diffie_hellman_group_exchange_sha256, kexcmd(GEX_SHA256),                    setup_dsa,        teardown) \\\n    f(client, dsa_diffie_hellman_group_exchange_sha1, kexcmd(GEX_SHA1),                        setup_dsa,        teardown) \\\n    f(client, ecdsa_256_diffie_hellman_group_exchange_sha1, kexcmd(GEX_SHA1),                  setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_384_diffie_hellman_group_exchange_sha1, kexcmd(GEX_SHA1),                  setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_521_diffie_hellman_group_exchange_sha1, kexcmd(GEX_SHA1),                  setup_ecdsa_521,  teardown)\n\n#elif defined(HAVE_DSA) /* && !defined(WITH_GEX) */\n#define PKDTESTS_KEX(f, client, kexcmd) \\\n    /* Kex algorithms. */ \\\n    PKDTESTS_KEX_COMMON(f, client, kexcmd) \\\n    f(client, dsa_curve25519_sha256,                  kexcmd(\"curve25519-sha256\"),             setup_dsa,        teardown) \\\n    f(client, dsa_curve25519_sha256_libssh_org,       kexcmd(\"curve25519-sha256@libssh.org\"),  setup_dsa,        teardown) \\\n    f(client, dsa_ecdh_sha2_nistp256,                 kexcmd(\"ecdh-sha2-nistp256 \"),           setup_dsa,        teardown) \\\n    f(client, dsa_ecdh_sha2_nistp384,                 kexcmd(\"ecdh-sha2-nistp384 \"),           setup_dsa,        teardown) \\\n    f(client, dsa_ecdh_sha2_nistp521,                 kexcmd(\"ecdh-sha2-nistp521 \"),           setup_dsa,        teardown) \\\n    f(client, dsa_diffie_hellman_group16_sha512,      kexcmd(\"diffie-hellman-group16-sha512\"), setup_dsa,        teardown) \\\n    f(client, dsa_diffie_hellman_group18_sha512,      kexcmd(\"diffie-hellman-group18-sha512\"), setup_dsa,        teardown) \\\n    f(client, dsa_diffie_hellman_group14_sha1,        kexcmd(\"diffie-hellman-group14-sha1\"),   setup_dsa,        teardown) \\\n    f(client, dsa_diffie_hellman_group14_sha256,      kexcmd(\"diffie-hellman-group14-sha256\"), setup_dsa,        teardown) \\\n    f(client, dsa_diffie_hellman_group1_sha1,         kexcmd(\"diffie-hellman-group1-sha1\"),    setup_dsa,        teardown)\n\n#elif defined(WITH_GEX) /* && !defined(HAVE_DSA) */\n    /* GEX_SHA256 is included in PKDTESTS_KEX_FIPS if available */\n#define PKDTESTS_KEX(f, client, kexcmd) \\\n    /* Kex algorithms. */ \\\n    PKDTESTS_KEX_COMMON(f, client, kexcmd) \\\n    f(client, rsa_diffie_hellman_group_exchange_sha1,         kexcmd(GEX_SHA1),                setup_rsa,        teardown) \\\n    f(client, ecdsa_256_diffie_hellman_group_exchange_sha1,   kexcmd(GEX_SHA1),                setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_384_diffie_hellman_group_exchange_sha1,   kexcmd(GEX_SHA1),                setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_521_diffie_hellman_group_exchange_sha1,   kexcmd(GEX_SHA1),                setup_ecdsa_521,  teardown)\n#else\n#define PKDTESTS_KEX(f, client, kexcmd) \\\n    /* Kex algorithms. */ \\\n    PKDTESTS_KEX_COMMON(f, client, kexcmd)\n#endif\n\n#ifdef HAVE_DSA\n#define PKDTESTS_KEX_OPENSSHONLY(f, client, kexcmd) \\\n    /* Kex algorithms. */ \\\n    f(client, ed25519_curve25519_sha256,              kexcmd(\"curve25519-sha256\"),             setup_ed25519,    teardown) \\\n    f(client, ed25519_curve25519_sha256_libssh_org,   kexcmd(\"curve25519-sha256@libssh.org\"),  setup_ed25519,    teardown) \\\n    f(client, ed25519_ecdh_sha2_nistp256,             kexcmd(\"ecdh-sha2-nistp256\"),            setup_ed25519,    teardown) \\\n    f(client, ed25519_ecdh_sha2_nistp384,             kexcmd(\"ecdh-sha2-nistp384\"),            setup_ed25519,    teardown) \\\n    f(client, ed25519_ecdh_sha2_nistp521,             kexcmd(\"ecdh-sha2-nistp521\"),            setup_ed25519,    teardown) \\\n    f(client, ed25519_diffie_hellman_group14_sha256,  kexcmd(\"diffie-hellman-group14-sha256\"), setup_ed25519,    teardown) \\\n    f(client, ed25519_diffie_hellman_group16_sha512,  kexcmd(\"diffie-hellman-group16-sha512\"), setup_ed25519,    teardown) \\\n    f(client, ed25519_diffie_hellman_group18_sha512,  kexcmd(\"diffie-hellman-group18-sha512\"), setup_ed25519,    teardown) \\\n    f(client, ed25519_diffie_hellman_group14_sha1,    kexcmd(\"diffie-hellman-group14-sha1\"),   setup_ed25519,    teardown) \\\n    f(client, ed25519_diffie_hellman_group1_sha1,     kexcmd(\"diffie-hellman-group1-sha1\"),    setup_ed25519,    teardown) \\\n    f(client, ed25519_diffie_hellman_group_exchange_sha256, kexcmd(GEX_SHA256),                setup_ed25519,    teardown) \\\n    f(client, ed25519_diffie_hellman_group_exchange_sha1, kexcmd(GEX_SHA1),                    setup_ed25519,    teardown)\n#else\n#define PKDTESTS_KEX_OPENSSHONLY(f, client, kexcmd) \\\n    /* Kex algorithms. */ \\\n    f(client, ed25519_curve25519_sha256,              kexcmd(\"curve25519-sha256\"),             setup_ed25519,    teardown) \\\n    f(client, ed25519_curve25519_sha256_libssh_org,   kexcmd(\"curve25519-sha256@libssh.org\"),  setup_ed25519,    teardown) \\\n    f(client, ed25519_ecdh_sha2_nistp256,             kexcmd(\"ecdh-sha2-nistp256\"),            setup_ed25519,    teardown) \\\n    f(client, ed25519_ecdh_sha2_nistp384,             kexcmd(\"ecdh-sha2-nistp384\"),            setup_ed25519,    teardown) \\\n    f(client, ed25519_ecdh_sha2_nistp521,             kexcmd(\"ecdh-sha2-nistp521\"),            setup_ed25519,    teardown) \\\n    f(client, ed25519_diffie_hellman_group14_sha256,  kexcmd(\"diffie-hellman-group14-sha256\"), setup_ed25519,    teardown) \\\n    f(client, ed25519_diffie_hellman_group16_sha512,  kexcmd(\"diffie-hellman-group16-sha512\"), setup_ed25519,    teardown) \\\n    f(client, ed25519_diffie_hellman_group18_sha512,  kexcmd(\"diffie-hellman-group18-sha512\"), setup_ed25519,    teardown) \\\n    f(client, ed25519_diffie_hellman_group1_sha1,     kexcmd(\"diffie-hellman-group1-sha1\"),    setup_ed25519,    teardown) \\\n    f(client, ed25519_diffie_hellman_group_exchange_sha256, kexcmd(GEX_SHA256),                setup_ed25519,    teardown) \\\n    f(client, ed25519_diffie_hellman_group_exchange_sha1, kexcmd(GEX_SHA1),                    setup_ed25519,    teardown)\n#endif\n\n\n#define PKDTESTS_CIPHER_FIPS(f, client, ciphercmd) \\\n    f(client, rsa_aes128_cbc,          ciphercmd(\"aes128-cbc\"),    setup_rsa,        teardown) \\\n    f(client, rsa_aes128_ctr,          ciphercmd(\"aes128-ctr\"),    setup_rsa,        teardown) \\\n    f(client, rsa_aes256_cbc,          ciphercmd(\"aes256-cbc\"),    setup_rsa,        teardown) \\\n    f(client, rsa_aes256_ctr,          ciphercmd(\"aes256-ctr\"),    setup_rsa,        teardown) \\\n    f(client, ecdsa_256_aes128_cbc,    ciphercmd(\"aes128-cbc\"),    setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_256_aes128_ctr,    ciphercmd(\"aes128-ctr\"),    setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_256_aes256_cbc,    ciphercmd(\"aes256-cbc\"),    setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_256_aes256_ctr,    ciphercmd(\"aes256-ctr\"),    setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_384_aes128_cbc,    ciphercmd(\"aes128-cbc\"),    setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_384_aes128_ctr,    ciphercmd(\"aes128-ctr\"),    setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_384_aes256_cbc,    ciphercmd(\"aes256-cbc\"),    setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_384_aes256_ctr,    ciphercmd(\"aes256-ctr\"),    setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_521_aes128_cbc,    ciphercmd(\"aes128-cbc\"),    setup_ecdsa_521,  teardown) \\\n    f(client, ecdsa_521_aes128_ctr,    ciphercmd(\"aes128-ctr\"),    setup_ecdsa_521,  teardown) \\\n    f(client, ecdsa_521_aes256_cbc,    ciphercmd(\"aes256-cbc\"),    setup_ecdsa_521,  teardown) \\\n    f(client, ecdsa_521_aes256_ctr,    ciphercmd(\"aes256-ctr\"),    setup_ecdsa_521,  teardown)\n\n#ifdef HAVE_DSA\n#define PKDTESTS_CIPHER(f, client, ciphercmd) \\\n    /* Ciphers. */ \\\n    PKDTESTS_CIPHER_FIPS(f, client, ciphercmd) \\\n    f(client, rsa_3des_cbc,            ciphercmd(\"3des-cbc\"),      setup_rsa,        teardown) \\\n    f(client, dsa_3des_cbc,            ciphercmd(\"3des-cbc\"),      setup_dsa,        teardown) \\\n    f(client, dsa_aes128_cbc,          ciphercmd(\"aes128-cbc\"),    setup_dsa,        teardown) \\\n    f(client, dsa_aes128_ctr,          ciphercmd(\"aes128-ctr\"),    setup_dsa,        teardown) \\\n    f(client, dsa_aes256_cbc,          ciphercmd(\"aes256-cbc\"),    setup_dsa,        teardown) \\\n    f(client, dsa_aes256_ctr,          ciphercmd(\"aes256-ctr\"),    setup_dsa,        teardown) \\\n    f(client, ecdsa_256_3des_cbc,      ciphercmd(\"3des-cbc\"),      setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_384_3des_cbc,      ciphercmd(\"3des-cbc\"),      setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_521_3des_cbc,      ciphercmd(\"3des-cbc\"),      setup_ecdsa_521,  teardown)\n#else\n#define PKDTESTS_CIPHER(f, client, ciphercmd) \\\n    /* Ciphers. */ \\\n    PKDTESTS_CIPHER_FIPS(f, client, ciphercmd) \\\n    f(client, rsa_3des_cbc,            ciphercmd(\"3des-cbc\"),      setup_rsa,        teardown) \\\n    f(client, ecdsa_256_3des_cbc,      ciphercmd(\"3des-cbc\"),      setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_384_3des_cbc,      ciphercmd(\"3des-cbc\"),      setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_521_3des_cbc,      ciphercmd(\"3des-cbc\"),      setup_ecdsa_521,  teardown)\n#endif\n\n#define CHACHA20 \"chacha20-poly1305@openssh.com\"\n#define AES128_GCM \"aes128-gcm@openssh.com\"\n#define AES256_GCM \"aes256-gcm@openssh.com\"\n\n#define PKDTESTS_CIPHER_OPENSSHONLY_FIPS(f, client, ciphercmd) \\\n    f(client, rsa_aes128_gcm,          ciphercmd(AES128_GCM),      setup_rsa,        teardown) \\\n    f(client, rsa_aes256_gcm,          ciphercmd(AES256_GCM),      setup_rsa,        teardown) \\\n    f(client, ecdsa_256_aes128_gcm,    ciphercmd(AES128_GCM),      setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_256_aes256_gcm,    ciphercmd(AES256_GCM),      setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_384_aes128_gcm,    ciphercmd(AES128_GCM),      setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_384_aes256_gcm,    ciphercmd(AES256_GCM),      setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_521_aes128_gcm,    ciphercmd(AES128_GCM),      setup_ecdsa_521,  teardown) \\\n    f(client, ecdsa_521_aes256_gcm,    ciphercmd(AES256_GCM),      setup_ecdsa_521,  teardown)\n\n#ifdef HAVE_DSA\n#define PKDTESTS_CIPHER_OPENSSHONLY(f, client, ciphercmd) \\\n    /* Ciphers. */ \\\n    PKDTESTS_CIPHER_OPENSSHONLY_FIPS(f, client, ciphercmd) \\\n    f(client, rsa_aes192_cbc,          ciphercmd(\"aes192-cbc\"),    setup_rsa,        teardown) \\\n    f(client, rsa_aes192_ctr,          ciphercmd(\"aes192-ctr\"),    setup_rsa,        teardown) \\\n    f(client, rsa_chacha20,            ciphercmd(CHACHA20),        setup_rsa,        teardown) \\\n    f(client, dsa_aes192_cbc,          ciphercmd(\"aes192-cbc\"),    setup_dsa,        teardown) \\\n    f(client, dsa_aes192_ctr,          ciphercmd(\"aes192-ctr\"),    setup_dsa,        teardown) \\\n    f(client, dsa_chacha20,            ciphercmd(CHACHA20),        setup_dsa,        teardown) \\\n    f(client, dsa_aes128_gcm,          ciphercmd(AES128_GCM),      setup_dsa,        teardown) \\\n    f(client, dsa_aes256_gcm,          ciphercmd(AES256_GCM),      setup_dsa,        teardown) \\\n    f(client, ed25519_3des_cbc,        ciphercmd(\"3des-cbc\"),      setup_ed25519,    teardown) \\\n    f(client, ed25519_aes128_cbc,      ciphercmd(\"aes128-cbc\"),    setup_ed25519,    teardown) \\\n    f(client, ed25519_aes128_ctr,      ciphercmd(\"aes128-ctr\"),    setup_ed25519,    teardown) \\\n    f(client, ed25519_aes256_cbc,      ciphercmd(\"aes256-cbc\"),    setup_ed25519,    teardown) \\\n    f(client, ed25519_aes256_ctr,      ciphercmd(\"aes256-ctr\"),    setup_ed25519,    teardown) \\\n    f(client, ed25519_aes192_cbc,      ciphercmd(\"aes192-cbc\"),    setup_ed25519,    teardown) \\\n    f(client, ed25519_aes192_ctr,      ciphercmd(\"aes192-ctr\"),    setup_ed25519,    teardown) \\\n    f(client, ed25519_chacha20,        ciphercmd(CHACHA20),        setup_ed25519,    teardown) \\\n    f(client, ed25519_aes128_gcm,      ciphercmd(AES128_GCM),      setup_ed25519,    teardown) \\\n    f(client, ed25519_aes256_gcm,      ciphercmd(AES256_GCM),      setup_ed25519,    teardown) \\\n    f(client, ecdsa_256_aes192_cbc,    ciphercmd(\"aes192-cbc\"),    setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_256_aes192_ctr,    ciphercmd(\"aes192-ctr\"),    setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_256_chacha20,      ciphercmd(CHACHA20),        setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_384_aes192_cbc,    ciphercmd(\"aes192-cbc\"),    setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_384_aes192_ctr,    ciphercmd(\"aes192-ctr\"),    setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_384_chacha20,      ciphercmd(CHACHA20),        setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_521_aes192_cbc,    ciphercmd(\"aes192-cbc\"),    setup_ecdsa_521,  teardown) \\\n    f(client, ecdsa_521_aes192_ctr,    ciphercmd(\"aes192-ctr\"),    setup_ecdsa_521,  teardown) \\\n    f(client, ecdsa_521_chacha20,      ciphercmd(CHACHA20),        setup_ecdsa_521,  teardown)\n#else\n#define PKDTESTS_CIPHER_OPENSSHONLY(f, client, ciphercmd) \\\n    /* Ciphers. */ \\\n    PKDTESTS_CIPHER_OPENSSHONLY_FIPS(f, client, ciphercmd) \\\n    f(client, rsa_aes192_cbc,          ciphercmd(\"aes192-cbc\"),    setup_rsa,        teardown) \\\n    f(client, rsa_aes192_ctr,          ciphercmd(\"aes192-ctr\"),    setup_rsa,        teardown) \\\n    f(client, rsa_chacha20,            ciphercmd(CHACHA20),        setup_rsa,        teardown) \\\n    f(client, ed25519_3des_cbc,        ciphercmd(\"3des-cbc\"),      setup_ed25519,    teardown) \\\n    f(client, ed25519_aes128_cbc,      ciphercmd(\"aes128-cbc\"),    setup_ed25519,    teardown) \\\n    f(client, ed25519_aes128_ctr,      ciphercmd(\"aes128-ctr\"),    setup_ed25519,    teardown) \\\n    f(client, ed25519_aes256_cbc,      ciphercmd(\"aes256-cbc\"),    setup_ed25519,    teardown) \\\n    f(client, ed25519_aes256_ctr,      ciphercmd(\"aes256-ctr\"),    setup_ed25519,    teardown) \\\n    f(client, ed25519_aes192_cbc,      ciphercmd(\"aes192-cbc\"),    setup_ed25519,    teardown) \\\n    f(client, ed25519_aes192_ctr,      ciphercmd(\"aes192-ctr\"),    setup_ed25519,    teardown) \\\n    f(client, ed25519_chacha20,        ciphercmd(CHACHA20),        setup_ed25519,    teardown) \\\n    f(client, ecdsa_256_aes192_cbc,    ciphercmd(\"aes192-cbc\"),    setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_256_aes192_ctr,    ciphercmd(\"aes192-ctr\"),    setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_256_chacha20,      ciphercmd(CHACHA20),        setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_384_aes192_cbc,    ciphercmd(\"aes192-cbc\"),    setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_384_aes192_ctr,    ciphercmd(\"aes192-ctr\"),    setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_384_chacha20,      ciphercmd(CHACHA20),        setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_521_aes192_cbc,    ciphercmd(\"aes192-cbc\"),    setup_ecdsa_521,  teardown) \\\n    f(client, ecdsa_521_aes192_ctr,    ciphercmd(\"aes192-ctr\"),    setup_ecdsa_521,  teardown) \\\n    f(client, ecdsa_521_chacha20,      ciphercmd(CHACHA20),        setup_ecdsa_521,  teardown)\n#endif\n\n\n#define PKDTESTS_MAC_FIPS(f, client, maccmd) \\\n    f(client, ecdsa_256_hmac_sha1,          maccmd(\"hmac-sha1\"),                      setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_256_hmac_sha2_256,      maccmd(\"hmac-sha2-256\"),                  setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_384_hmac_sha1,          maccmd(\"hmac-sha1\"),                      setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_384_hmac_sha2_256,      maccmd(\"hmac-sha2-256\"),                  setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_521_hmac_sha1,          maccmd(\"hmac-sha1\"),                      setup_ecdsa_521,  teardown) \\\n    f(client, ecdsa_521_hmac_sha2_256,      maccmd(\"hmac-sha2-256\"),                  setup_ecdsa_521,  teardown) \\\n    f(client, rsa_hmac_sha1,                maccmd(\"hmac-sha1\"),                      setup_rsa,        teardown) \\\n    f(client, rsa_hmac_sha2_256,            maccmd(\"hmac-sha2-256\"),                  setup_rsa,        teardown)\n\n#define PKDTESTS_MAC_OPENSSHONLY_FIPS(f, client, maccmd) \\\n    f(client, ecdsa_256_hmac_sha1_etm,      maccmd(\"hmac-sha1-etm@openssh.com\"),      setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_256_hmac_sha2_256_etm,  maccmd(\"hmac-sha2-256-etm@openssh.com\"),  setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_256_hmac_sha2_512,      maccmd(\"hmac-sha2-512\"),                  setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_256_hmac_sha2_512_etm,  maccmd(\"hmac-sha2-512-etm@openssh.com\"),  setup_ecdsa_256,  teardown) \\\n    f(client, ecdsa_384_hmac_sha1_etm,      maccmd(\"hmac-sha1-etm@openssh.com\"),      setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_384_hmac_sha2_256_etm,  maccmd(\"hmac-sha2-256-etm@openssh.com\"),  setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_384_hmac_sha2_512,      maccmd(\"hmac-sha2-512\"),                  setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_384_hmac_sha2_512_etm,  maccmd(\"hmac-sha2-512-etm@openssh.com\"),  setup_ecdsa_384,  teardown) \\\n    f(client, ecdsa_521_hmac_sha1_etm,      maccmd(\"hmac-sha1-etm@openssh.com\"),      setup_ecdsa_521,  teardown) \\\n    f(client, ecdsa_521_hmac_sha2_256_etm,  maccmd(\"hmac-sha2-256-etm@openssh.com\"),  setup_ecdsa_521,  teardown) \\\n    f(client, ecdsa_521_hmac_sha2_512,      maccmd(\"hmac-sha2-512\"),                  setup_ecdsa_521,  teardown) \\\n    f(client, ecdsa_521_hmac_sha2_512_etm,  maccmd(\"hmac-sha2-512-etm@openssh.com\"),  setup_ecdsa_521,  teardown) \\\n    f(client, rsa_hmac_sha1_etm,            maccmd(\"hmac-sha1-etm@openssh.com\"),      setup_rsa,        teardown) \\\n    f(client, rsa_hmac_sha2_256_etm,        maccmd(\"hmac-sha2-256-etm@openssh.com\"),  setup_rsa,        teardown) \\\n    f(client, rsa_hmac_sha2_512,            maccmd(\"hmac-sha2-512\"),                  setup_rsa,        teardown) \\\n    f(client, rsa_hmac_sha2_512_etm,        maccmd(\"hmac-sha2-512-etm@openssh.com\"),  setup_rsa,        teardown)\n\n#ifdef HAVE_DSA\n#define PKDTESTS_MAC(f, client, maccmd) \\\n    /* MACs. */ \\\n    PKDTESTS_MAC_FIPS(f, client, maccmd) \\\n    f(client, dsa_hmac_sha1,                maccmd(\"hmac-sha1\"),                      setup_dsa,        teardown) \\\n    f(client, dsa_hmac_sha2_256,            maccmd(\"hmac-sha2-256\"),                  setup_dsa,        teardown)\n#define PKDTESTS_MAC_OPENSSHONLY(f, client, maccmd) \\\n    PKDTESTS_MAC_OPENSSHONLY_FIPS(f, client, maccmd) \\\n    f(client, dsa_hmac_sha1_etm,            maccmd(\"hmac-sha1-etm@openssh.com\"),      setup_dsa,        teardown) \\\n    f(client, dsa_hmac_sha2_256_etm,        maccmd(\"hmac-sha2-256-etm@openssh.com\"),  setup_dsa,        teardown) \\\n    f(client, dsa_hmac_sha2_512,            maccmd(\"hmac-sha2-512\"),                  setup_dsa,        teardown) \\\n    f(client, dsa_hmac_sha2_512_etm,        maccmd(\"hmac-sha2-512-etm@openssh.com\"),  setup_dsa,        teardown) \\\n    f(client, ed25519_hmac_sha1,            maccmd(\"hmac-sha1\"),                      setup_ed25519,    teardown) \\\n    f(client, ed25519_hmac_sha1_etm,        maccmd(\"hmac-sha1-etm@openssh.com\"),      setup_ed25519,    teardown) \\\n    f(client, ed25519_hmac_sha2_256,        maccmd(\"hmac-sha2-256\"),                  setup_ed25519,    teardown) \\\n    f(client, ed25519_hmac_sha2_256_etm,    maccmd(\"hmac-sha2-256-etm@openssh.com\"),  setup_ed25519,    teardown) \\\n    f(client, ed25519_hmac_sha2_512,        maccmd(\"hmac-sha2-512\"),                  setup_ed25519,    teardown) \\\n    f(client, ed25519_hmac_sha2_512_etm,    maccmd(\"hmac-sha2-512-etm@openssh.com\"),  setup_ed25519,    teardown)\n#else\n#define PKDTESTS_MAC(f, client, maccmd) \\\n    /* MACs. */ \\\n    PKDTESTS_MAC_FIPS(f, client, maccmd)\n#define PKDTESTS_MAC_OPENSSHONLY(f, client, maccmd) \\\n    PKDTESTS_MAC_OPENSSHONLY_FIPS(f, client, maccmd) \\\n    f(client, ed25519_hmac_sha1,            maccmd(\"hmac-sha1\"),                      setup_ed25519,    teardown) \\\n    f(client, ed25519_hmac_sha1_etm,        maccmd(\"hmac-sha1-etm@openssh.com\"),      setup_ed25519,    teardown) \\\n    f(client, ed25519_hmac_sha2_256,        maccmd(\"hmac-sha2-256\"),                  setup_ed25519,    teardown) \\\n    f(client, ed25519_hmac_sha2_256_etm,    maccmd(\"hmac-sha2-256-etm@openssh.com\"),  setup_ed25519,    teardown) \\\n    f(client, ed25519_hmac_sha2_512,        maccmd(\"hmac-sha2-512\"),                  setup_ed25519,    teardown) \\\n    f(client, ed25519_hmac_sha2_512_etm,    maccmd(\"hmac-sha2-512-etm@openssh.com\"),  setup_ed25519,    teardown)\n#endif\n\n\n#define PKDTESTS_HOSTKEY_OPENSSHONLY_FIPS(f, client, hkcmd) \\\n    f(client, rsa_sha2_256,     hkcmd(\"rsa-sha2-256\"),               setup_rsa,    teardown) \\\n    f(client, rsa_sha2_512,     hkcmd(\"rsa-sha2-512\"),               setup_rsa,    teardown) \\\n    f(client, rsa_sha2_256_512, hkcmd(\"rsa-sha2-256,rsa-sha2-512\"),  setup_rsa,    teardown) \\\n    f(client, rsa_sha2_512_256, hkcmd(\"rsa-sha2-512,rsa-sha2-256\"),  setup_rsa,    teardown)\n\n#define PKDTESTS_HOSTKEY_OPENSSHONLY(f, client, hkcmd) \\\n    PKDTESTS_HOSTKEY_OPENSSHONLY_FIPS(f, client, hkcmd)\n\nstatic void torture_pkd_client_noop(void **state) {\n    struct pkd_state *pstate = (struct pkd_state *) (*state);\n    (void) pstate;\n    return;\n}\n\nstatic void torture_pkd_runtest(const char *testname,\n                                const char *testcmd)\n{\n    int i, rc;\n    char logfile[1024] = { 0 };\n    int iterations =\n        (pkd_dargs.opts.iterations != 0) ? pkd_dargs.opts.iterations\n                                         : DEFAULT_ITERATIONS;\n\n    for (i = 0; i < iterations; i++) {\n        rc = system_checked(testcmd);\n        assert_int_equal(rc, 0);\n    }\n\n    /* Asserts did not trip: cleanup logs. */\n    snprintf(&logfile[0], sizeof(logfile), \"%s.out\", testname);\n    unlink(logfile);\n    snprintf(&logfile[0], sizeof(logfile), \"%s.err\", testname);\n    unlink(logfile);\n}\n\n/*\n * Though each keytest function body is the same, separate functions are\n * defined here to result in distinct output when running the tests.\n */\n\n#define emit_keytest(client, testname, sshcmd, setup, teardown) \\\n    static void torture_pkd_## client ## _ ## testname(void **state) { \\\n        const char *tname = \"torture_pkd_\" #client \"_\" #testname;      \\\n        char testcmd[2048] = { 0 };                                    \\\n        (void) state;                                                  \\\n        snprintf(&testcmd[0], sizeof(testcmd), sshcmd, tname, tname);  \\\n        torture_pkd_runtest(tname, testcmd);                           \\\n    }\n\n/*\n * Actual test functions are emitted here.\n */\n\n#ifdef HAVE_DSA\n#define CLIENT_ID_FILE OPENSSH_DSA_TESTKEY\nPKDTESTS_DEFAULT(emit_keytest, openssh_dsa, OPENSSH_CMD)\nPKDTESTS_DEFAULT(emit_keytest, openssh_cert_dsa, OPENSSH_CERT_CMD)\nPKDTESTS_DEFAULT_OPENSSHONLY(emit_keytest, openssh_dsa, OPENSSH_CMD)\nPKDTESTS_KEX(emit_keytest, openssh_dsa, OPENSSH_KEX_CMD)\nPKDTESTS_KEX_OPENSSHONLY(emit_keytest, openssh_dsa, OPENSSH_KEX_CMD)\nPKDTESTS_CIPHER(emit_keytest, openssh_dsa, OPENSSH_CIPHER_CMD)\nPKDTESTS_CIPHER_OPENSSHONLY(emit_keytest, openssh_dsa, OPENSSH_CIPHER_CMD)\nPKDTESTS_MAC(emit_keytest, openssh_dsa, OPENSSH_MAC_CMD)\nPKDTESTS_MAC_OPENSSHONLY(emit_keytest, openssh_dsa, OPENSSH_MAC_CMD)\n#undef CLIENT_ID_FILE\n#endif\n\n#define CLIENT_ID_FILE OPENSSH_RSA_TESTKEY\nPKDTESTS_DEFAULT(emit_keytest, openssh_rsa, OPENSSH_CMD)\nPKDTESTS_DEFAULT(emit_keytest, openssh_cert_rsa, OPENSSH_CERT_CMD)\nPKDTESTS_DEFAULT(emit_keytest, openssh_sha256_cert_rsa, OPENSSH_SHA256_CERT_CMD)\nPKDTESTS_DEFAULT_OPENSSHONLY(emit_keytest, openssh_rsa, OPENSSH_CMD)\nPKDTESTS_KEX(emit_keytest, openssh_rsa, OPENSSH_KEX_CMD)\nPKDTESTS_KEX_OPENSSHONLY(emit_keytest, openssh_rsa, OPENSSH_KEX_CMD)\nPKDTESTS_CIPHER(emit_keytest, openssh_rsa, OPENSSH_CIPHER_CMD)\nPKDTESTS_CIPHER_OPENSSHONLY(emit_keytest, openssh_rsa, OPENSSH_CIPHER_CMD)\nPKDTESTS_MAC(emit_keytest, openssh_rsa, OPENSSH_MAC_CMD)\nPKDTESTS_MAC_OPENSSHONLY(emit_keytest, openssh_rsa, OPENSSH_MAC_CMD)\nPKDTESTS_HOSTKEY_OPENSSHONLY(emit_keytest, openssh_rsa, OPENSSH_HOSTKEY_CMD)\n#undef CLIENT_ID_FILE\n\n#define CLIENT_ID_FILE OPENSSH_ECDSA256_TESTKEY\nPKDTESTS_DEFAULT(emit_keytest, openssh_e256, OPENSSH_CMD)\nPKDTESTS_DEFAULT(emit_keytest, openssh_cert_e256, OPENSSH_CERT_CMD)\nPKDTESTS_DEFAULT_OPENSSHONLY(emit_keytest, openssh_e256, OPENSSH_CMD)\nPKDTESTS_KEX(emit_keytest, openssh_e256, OPENSSH_KEX_CMD)\nPKDTESTS_KEX_OPENSSHONLY(emit_keytest, openssh_e256, OPENSSH_KEX_CMD)\nPKDTESTS_CIPHER(emit_keytest, openssh_e256, OPENSSH_CIPHER_CMD)\nPKDTESTS_CIPHER_OPENSSHONLY(emit_keytest, openssh_e256, OPENSSH_CIPHER_CMD)\nPKDTESTS_MAC(emit_keytest, openssh_e256, OPENSSH_MAC_CMD)\nPKDTESTS_MAC_OPENSSHONLY(emit_keytest, openssh_e256, OPENSSH_MAC_CMD)\n#undef CLIENT_ID_FILE\n\n/* Could add these passes, too: */\n//#define CLIENT_ID_FILE OPENSSH_ECDSA384_TESTKEY\n//#define CLIENT_ID_FILE OPENSSH_ECDSA521_TESTKEY\n\n#define CLIENT_ID_FILE OPENSSH_ED25519_TESTKEY\nPKDTESTS_DEFAULT(emit_keytest, openssh_ed, OPENSSH_CMD)\nPKDTESTS_DEFAULT(emit_keytest, openssh_cert_ed, OPENSSH_CERT_CMD)\nPKDTESTS_DEFAULT_OPENSSHONLY(emit_keytest, openssh_ed, OPENSSH_CMD)\nPKDTESTS_KEX(emit_keytest, openssh_ed, OPENSSH_KEX_CMD)\nPKDTESTS_KEX_OPENSSHONLY(emit_keytest, openssh_ed, OPENSSH_KEX_CMD)\nPKDTESTS_CIPHER(emit_keytest, openssh_ed, OPENSSH_CIPHER_CMD)\nPKDTESTS_CIPHER_OPENSSHONLY(emit_keytest, openssh_ed, OPENSSH_CIPHER_CMD)\nPKDTESTS_MAC(emit_keytest, openssh_ed, OPENSSH_MAC_CMD)\nPKDTESTS_MAC_OPENSSHONLY(emit_keytest, openssh_ed, OPENSSH_MAC_CMD)\n#undef CLIENT_ID_FILE\n\n#define CLIENT_ID_FILE DROPBEAR_RSA_TESTKEY\nPKDTESTS_DEFAULT(emit_keytest, dropbear, DROPBEAR_CMD)\nPKDTESTS_CIPHER(emit_keytest, dropbear, DROPBEAR_CIPHER_CMD)\nPKDTESTS_MAC(emit_keytest, dropbear, DROPBEAR_MAC_CMD)\n#undef CLIENT_ID_FILE\n\n/*\n * Define an array of testname strings mapped to their associated\n * test function.  Enables running tests individually by name from\n * the command line.\n */\n\n#define emit_testmap(client, testname, sshcmd, setup, teardown) \\\n    { \"torture_pkd_\" #client \"_\" #testname,                     \\\n      emit_unit_test(client, testname, sshcmd, setup, teardown) },\n\n#define emit_unit_test(client, testname, sshcmd, setup, teardown) \\\n    cmocka_unit_test_setup_teardown(torture_pkd_ ## client ## _ ## testname, \\\n                                    torture_pkd_ ## setup, \\\n                                    torture_pkd_ ## teardown)\n\n#define emit_unit_test_comma(client, testname, sshcmd, setup, teardown) \\\n    emit_unit_test(client, testname, sshcmd, setup, teardown),\n\nstruct {\n    const char *testname;\n    const struct CMUnitTest test;\n} testmap[] = {\n    /* OpenSSH */\n#ifdef HAVE_DSA\n    PKDTESTS_DEFAULT(emit_testmap, openssh_dsa, OPENSSH_CMD)\n    PKDTESTS_DEFAULT(emit_testmap, openssh_cert_dsa, OPENSSH_CERT_CMD)\n    PKDTESTS_DEFAULT_OPENSSHONLY(emit_testmap, openssh_dsa, OPENSSH_CMD)\n    PKDTESTS_KEX(emit_testmap, openssh_dsa, OPENSSH_KEX_CMD)\n    PKDTESTS_KEX_OPENSSHONLY(emit_testmap, openssh_dsa, OPENSSH_KEX_CMD)\n    PKDTESTS_CIPHER(emit_testmap, openssh_dsa, OPENSSH_CIPHER_CMD)\n    PKDTESTS_CIPHER_OPENSSHONLY(emit_testmap, openssh_dsa, OPENSSH_CIPHER_CMD)\n    PKDTESTS_MAC(emit_testmap, openssh_dsa, OPENSSH_MAC_CMD)\n    PKDTESTS_MAC_OPENSSHONLY(emit_testmap, openssh_dsa, OPENSSH_MAC_CMD)\n#endif\n\n    PKDTESTS_DEFAULT(emit_testmap, openssh_rsa, OPENSSH_CMD)\n    PKDTESTS_DEFAULT(emit_testmap, openssh_cert_rsa, OPENSSH_CERT_CMD)\n    PKDTESTS_DEFAULT(emit_testmap, openssh_sha256_cert_rsa, OPENSSH_SHA256_CERT_CMD)\n    PKDTESTS_DEFAULT_OPENSSHONLY(emit_testmap, openssh_rsa, OPENSSH_CMD)\n    PKDTESTS_KEX(emit_testmap, openssh_rsa, OPENSSH_KEX_CMD)\n    PKDTESTS_KEX_OPENSSHONLY(emit_testmap, openssh_rsa, OPENSSH_KEX_CMD)\n    PKDTESTS_CIPHER(emit_testmap, openssh_rsa, OPENSSH_CIPHER_CMD)\n    PKDTESTS_CIPHER_OPENSSHONLY(emit_testmap, openssh_rsa, OPENSSH_CIPHER_CMD)\n    PKDTESTS_MAC(emit_testmap, openssh_rsa, OPENSSH_MAC_CMD)\n    PKDTESTS_MAC_OPENSSHONLY(emit_testmap, openssh_rsa, OPENSSH_MAC_CMD)\n    PKDTESTS_HOSTKEY_OPENSSHONLY(emit_testmap, openssh_rsa, OPENSSH_HOSTKEY_CMD)\n\n    PKDTESTS_DEFAULT(emit_testmap, openssh_e256, OPENSSH_CMD)\n    PKDTESTS_DEFAULT(emit_testmap, openssh_cert_e256, OPENSSH_CERT_CMD)\n    PKDTESTS_DEFAULT_OPENSSHONLY(emit_testmap, openssh_e256, OPENSSH_CMD)\n    PKDTESTS_KEX(emit_testmap, openssh_e256, OPENSSH_KEX_CMD)\n    PKDTESTS_KEX_OPENSSHONLY(emit_testmap, openssh_e256, OPENSSH_KEX_CMD)\n    PKDTESTS_CIPHER(emit_testmap, openssh_e256, OPENSSH_CIPHER_CMD)\n    PKDTESTS_CIPHER_OPENSSHONLY(emit_testmap, openssh_e256, OPENSSH_CIPHER_CMD)\n    PKDTESTS_MAC(emit_testmap, openssh_e256, OPENSSH_MAC_CMD)\n    PKDTESTS_MAC_OPENSSHONLY(emit_testmap, openssh_e256, OPENSSH_MAC_CMD)\n\n    PKDTESTS_DEFAULT(emit_testmap, openssh_ed, OPENSSH_CMD)\n    PKDTESTS_DEFAULT(emit_testmap, openssh_cert_ed, OPENSSH_CERT_CMD)\n    PKDTESTS_DEFAULT_OPENSSHONLY(emit_testmap, openssh_ed, OPENSSH_CMD)\n    PKDTESTS_KEX(emit_testmap, openssh_ed, OPENSSH_KEX_CMD)\n    PKDTESTS_KEX_OPENSSHONLY(emit_testmap, openssh_ed, OPENSSH_KEX_CMD)\n    PKDTESTS_CIPHER(emit_testmap, openssh_ed, OPENSSH_CIPHER_CMD)\n    PKDTESTS_CIPHER_OPENSSHONLY(emit_testmap, openssh_ed, OPENSSH_CIPHER_CMD)\n    PKDTESTS_MAC(emit_testmap, openssh_ed, OPENSSH_MAC_CMD)\n    PKDTESTS_MAC_OPENSSHONLY(emit_testmap, openssh_ed, OPENSSH_MAC_CMD)\n\n    /* Dropbear */\n    PKDTESTS_DEFAULT(emit_testmap, dropbear, DROPBEAR_CMD)\n    PKDTESTS_CIPHER(emit_testmap, dropbear, DROPBEAR_CIPHER_CMD)\n    PKDTESTS_MAC(emit_testmap, dropbear, DROPBEAR_MAC_CMD)\n\n    /* Noop */\n    emit_testmap(client, noop, \"\", setup_noop, teardown)\n\n    /* NULL tail entry */\n    { .testname = NULL,\n      .test = { .name = NULL,\n                .test_func = NULL,\n                .setup_func = NULL,\n                .teardown_func = NULL } }\n};\n\nstatic int pkd_run_tests(void) {\n    int rc = -1;\n    int tindex = 0;\n\n    const struct CMUnitTest openssh_tests[] = {\n#ifdef HAVE_DSA\n        PKDTESTS_DEFAULT(emit_unit_test_comma, openssh_dsa, OPENSSH_CMD)\n        PKDTESTS_DEFAULT(emit_unit_test_comma, openssh_cert_dsa, OPENSSH_CERT_CMD)\n        PKDTESTS_DEFAULT_OPENSSHONLY(emit_unit_test_comma, openssh_dsa, OPENSSH_CMD)\n        PKDTESTS_KEX(emit_unit_test_comma, openssh_dsa, OPENSSH_KEX_CMD)\n        PKDTESTS_CIPHER(emit_unit_test_comma, openssh_dsa, OPENSSH_CIPHER_CMD)\n        PKDTESTS_CIPHER_OPENSSHONLY(emit_unit_test_comma, openssh_dsa, OPENSSH_CIPHER_CMD)\n        PKDTESTS_MAC(emit_unit_test_comma, openssh_dsa, OPENSSH_MAC_CMD)\n        PKDTESTS_MAC_OPENSSHONLY(emit_unit_test_comma, openssh_dsa, OPENSSH_MAC_CMD)\n#endif\n\n        PKDTESTS_DEFAULT(emit_unit_test_comma, openssh_rsa, OPENSSH_CMD)\n        PKDTESTS_DEFAULT(emit_unit_test_comma, openssh_cert_rsa, OPENSSH_CERT_CMD)\n        PKDTESTS_DEFAULT_FIPS(emit_unit_test_comma, openssh_sha256_cert_rsa,\n                              OPENSSH_SHA256_CERT_CMD)\n        PKDTESTS_DEFAULT_OPENSSHONLY(emit_unit_test_comma, openssh_rsa, OPENSSH_CMD)\n        PKDTESTS_KEX(emit_unit_test_comma, openssh_rsa, OPENSSH_KEX_CMD)\n        PKDTESTS_CIPHER(emit_unit_test_comma, openssh_rsa, OPENSSH_CIPHER_CMD)\n        PKDTESTS_CIPHER_OPENSSHONLY(emit_unit_test_comma, openssh_rsa, OPENSSH_CIPHER_CMD)\n        PKDTESTS_MAC(emit_unit_test_comma, openssh_rsa, OPENSSH_MAC_CMD)\n        PKDTESTS_MAC_OPENSSHONLY(emit_unit_test_comma, openssh_rsa, OPENSSH_MAC_CMD)\n\n        PKDTESTS_DEFAULT(emit_unit_test_comma, openssh_e256, OPENSSH_CMD)\n        PKDTESTS_DEFAULT(emit_unit_test_comma, openssh_cert_e256, OPENSSH_CERT_CMD)\n        PKDTESTS_DEFAULT_OPENSSHONLY(emit_unit_test_comma, openssh_e256, OPENSSH_CMD)\n        PKDTESTS_KEX(emit_unit_test_comma, openssh_e256, OPENSSH_KEX_CMD)\n        PKDTESTS_CIPHER(emit_unit_test_comma, openssh_e256, OPENSSH_CIPHER_CMD)\n        PKDTESTS_CIPHER_OPENSSHONLY(emit_unit_test_comma, openssh_e256, OPENSSH_CIPHER_CMD)\n        PKDTESTS_MAC(emit_unit_test_comma, openssh_e256, OPENSSH_MAC_CMD)\n        PKDTESTS_MAC_OPENSSHONLY(emit_unit_test_comma, openssh_e256, OPENSSH_MAC_CMD)\n\n        PKDTESTS_DEFAULT(emit_unit_test_comma, openssh_ed, OPENSSH_CMD)\n        PKDTESTS_DEFAULT(emit_unit_test_comma, openssh_cert_ed, OPENSSH_CERT_CMD)\n        PKDTESTS_DEFAULT_OPENSSHONLY(emit_unit_test_comma, openssh_ed, OPENSSH_CMD)\n        PKDTESTS_KEX(emit_unit_test_comma, openssh_ed, OPENSSH_KEX_CMD)\n        PKDTESTS_CIPHER(emit_unit_test_comma, openssh_ed, OPENSSH_CIPHER_CMD)\n        PKDTESTS_CIPHER_OPENSSHONLY(emit_unit_test_comma, openssh_ed, OPENSSH_CIPHER_CMD)\n        PKDTESTS_MAC(emit_unit_test_comma, openssh_ed, OPENSSH_MAC_CMD)\n        PKDTESTS_MAC_OPENSSHONLY(emit_unit_test_comma, openssh_ed, OPENSSH_MAC_CMD)\n    };\n\n    const struct CMUnitTest dropbear_tests[] = {\n        PKDTESTS_DEFAULT(emit_unit_test_comma, dropbear, DROPBEAR_CMD)\n        PKDTESTS_CIPHER(emit_unit_test_comma, dropbear, DROPBEAR_CIPHER_CMD)\n        PKDTESTS_MAC(emit_unit_test_comma, dropbear, DROPBEAR_MAC_CMD)\n    };\n\n    const struct CMUnitTest openssh_fips_tests[] = {\n        PKDTESTS_DEFAULT_FIPS(emit_unit_test_comma, openssh_rsa, OPENSSH_CMD)\n        PKDTESTS_DEFAULT_FIPS(emit_unit_test_comma, openssh_sha256_cert_rsa,\n                              OPENSSH_SHA256_CERT_CMD)\n        PKDTESTS_KEX_FIPS(emit_unit_test_comma, openssh_rsa, OPENSSH_KEX_CMD)\n        PKDTESTS_CIPHER_FIPS(emit_unit_test_comma, openssh_rsa, OPENSSH_CIPHER_CMD)\n        PKDTESTS_CIPHER_OPENSSHONLY_FIPS(emit_unit_test_comma, openssh_rsa, OPENSSH_CIPHER_CMD)\n        PKDTESTS_MAC_FIPS(emit_unit_test_comma, openssh_rsa, OPENSSH_MAC_CMD)\n        PKDTESTS_MAC_OPENSSHONLY_FIPS(emit_unit_test_comma, openssh_rsa, OPENSSH_MAC_CMD)\n\n        PKDTESTS_DEFAULT_FIPS(emit_unit_test_comma, openssh_e256, OPENSSH_CMD)\n        PKDTESTS_DEFAULT_FIPS(emit_unit_test_comma, openssh_cert_e256, OPENSSH_CERT_CMD)\n        PKDTESTS_KEX_FIPS(emit_unit_test_comma, openssh_e256, OPENSSH_KEX_CMD)\n        PKDTESTS_CIPHER_FIPS(emit_unit_test_comma, openssh_e256, OPENSSH_CIPHER_CMD)\n        PKDTESTS_CIPHER_OPENSSHONLY_FIPS(emit_unit_test_comma, openssh_e256, OPENSSH_CIPHER_CMD)\n        PKDTESTS_MAC_FIPS(emit_unit_test_comma, openssh_e256, OPENSSH_MAC_CMD)\n        PKDTESTS_MAC_OPENSSHONLY_FIPS(emit_unit_test_comma, openssh_e256, OPENSSH_MAC_CMD)\n    };\n\n    const struct CMUnitTest noop_tests[] = {\n        emit_unit_test(client, noop, \"\", setup_noop, teardown)\n    };\n\n    /* Test list is populated depending on which clients are enabled. */\n    struct CMUnitTest all_tests[(sizeof(openssh_tests) / sizeof(openssh_tests[0])) +\n                                (sizeof(dropbear_tests) / sizeof(dropbear_tests[0])) +\n                                (sizeof(noop_tests) / sizeof(noop_tests[0]))];\n    memset(&all_tests[0], 0x0, sizeof(all_tests));\n\n    /* Generate client keys and populate test list for each enabled client. */\n    if (is_openssh_client_enabled()) {\n        setup_openssh_client_keys();\n        if (ssh_fips_mode()) {\n            memcpy(&all_tests[tindex], &openssh_fips_tests[0], sizeof(openssh_fips_tests));\n            tindex += (sizeof(openssh_fips_tests) / sizeof(openssh_fips_tests[0]));\n        } else {\n            memcpy(&all_tests[tindex], &openssh_tests[0], sizeof(openssh_tests));\n            tindex += (sizeof(openssh_tests) / sizeof(openssh_tests[0]));\n        }\n    }\n\n    if (is_dropbear_client_enabled()) {\n        setup_dropbear_client_rsa_key();\n        if (!ssh_fips_mode()) {\n            memcpy(&all_tests[tindex], &dropbear_tests[0], sizeof(dropbear_tests));\n            tindex += (sizeof(dropbear_tests) / sizeof(dropbear_tests[0]));\n        }\n    }\n\n    memcpy(&all_tests[tindex], &noop_tests[0], sizeof(noop_tests));\n    tindex += (sizeof(noop_tests) / sizeof(noop_tests[0]));\n\n    if ((pkd_dargs.opts.testname == NULL) &&\n        (pkd_dargs.opts.testmatch == NULL)) {\n        rc = _cmocka_run_group_tests(\"all tests\", all_tests, tindex, NULL, NULL);\n    } else {\n        size_t i = 0;\n        size_t num_found = 0;\n        const char *testname = pkd_dargs.opts.testname;\n        const char *testmatch = pkd_dargs.opts.testmatch;\n\n        struct CMUnitTest matching_tests[sizeof(all_tests)];\n        memset(&matching_tests[0], 0x0, sizeof(matching_tests));\n\n        while (testmap[i].testname != NULL) {\n            if ((testname != NULL) &&\n                (strcmp(testmap[i].testname, testname) == 0)) {\n                memcpy(&matching_tests[0],\n                       &testmap[i].test,\n                       sizeof(struct CMUnitTest));\n                num_found += 1;\n                break;\n            }\n\n            if ((testmatch != NULL) &&\n                (strstr(testmap[i].testname, testmatch) != NULL)) {\n                memcpy(&matching_tests[num_found],\n                       &testmap[i].test,\n                       sizeof(struct CMUnitTest));\n                num_found += 1;\n            }\n\n            i += 1;\n        }\n\n        if (num_found > 0) {\n            rc = _cmocka_run_group_tests(\"found\", matching_tests, num_found, NULL, NULL);\n        } else {\n            fprintf(stderr, \"Did not find test '%s'\\n\", testname);\n        }\n    }\n\n    /* Clean up client keys for each enabled client. */\n    if (is_dropbear_client_enabled()) {\n        cleanup_dropbear_client_rsa_key();\n    }\n\n    if (is_openssh_client_enabled()) {\n        cleanup_openssh_client_keys();\n    }\n\n    /* Clean up any server keys that were generated. */\n    cleanup_rsa_key();\n    cleanup_ecdsa_keys();\n    if (!ssh_fips_mode()) {\n        cleanup_ed25519_key();\n#ifdef HAVE_DSA\n        cleanup_dsa_key();\n#endif\n    }\n\n    return rc;\n}\n\nstatic int pkd_init_socket_wrapper(void) {\n    int rc = 0;\n    char *mkdtemp_str = NULL;\n\n    if (pkd_dargs.opts.socket_wrapper.mkdtemp_str == NULL) {\n        goto out;\n    }\n\n    mkdtemp_str = strdup(pkd_dargs.opts.socket_wrapper.mkdtemp_str);\n    if (mkdtemp_str == NULL) {\n        fprintf(stderr, \"pkd_init_socket_wrapper strdup failed\\n\");\n        goto errstrdup;\n    }\n    pkd_dargs.opts.socket_wrapper.mkdtemp_str = mkdtemp_str;\n\n    if (mkdtemp(mkdtemp_str) == NULL) {\n        fprintf(stderr, \"pkd_init_socket_wrapper mkdtemp '%s' failed\\n\", mkdtemp_str);\n        goto errmkdtemp;\n    }\n\n    if (setenv(\"SOCKET_WRAPPER_DIR\", mkdtemp_str, 1) != 0) {\n        fprintf(stderr, \"pkd_init_socket_wrapper setenv failed\\n\");\n        goto errsetenv;\n    }\n\n    goto out;\nerrsetenv:\nerrmkdtemp:\n    free(mkdtemp_str);\nerrstrdup:\n    rc = -1;\nout:\n    return rc;\n}\n\nstatic int pkd_rmfiles(const char *path) {\n    char bin[1024] = { 0 };\n    snprintf(&bin[0], sizeof(bin), \"rm -f %s/*\", path);\n    return system_checked(bin);\n}\n\nstatic int pkd_cleanup_socket_wrapper(void) {\n    int rc = 0;\n\n    if (pkd_dargs.opts.socket_wrapper.mkdtemp_str == NULL) {\n        goto out;\n    }\n\n    /* clean up socket-wrapper unix domain sockets */\n    if (pkd_rmfiles(pkd_dargs.opts.socket_wrapper.mkdtemp_str) != 0) {\n        fprintf(stderr, \"pkd_cleanup_socket_wrapper pkd_rmfiles '%s' failed\\n\",\n                        pkd_dargs.opts.socket_wrapper.mkdtemp_str);\n        goto errrmfiles;\n    }\n\n    if (rmdir(pkd_dargs.opts.socket_wrapper.mkdtemp_str) != 0) {\n        fprintf(stderr, \"pkd_cleanup_socket_wrapper rmdir '%s' failed\\n\",\n                        pkd_dargs.opts.socket_wrapper.mkdtemp_str);\n        goto errrmdir;\n    }\n\n    free(pkd_dargs.opts.socket_wrapper.mkdtemp_str);\n\n    goto out;\nerrrmdir:\nerrrmfiles:\n    rc = -1;\nout:\n    return rc;\n}\n\nint main(int argc, char **argv) {\n    int i = 0;\n    int rc = 0;\n    int exit_code = -1;\n\n    unsetenv(\"SSH_AUTH_SOCK\");\n\n    pkd_dargs.payload.buf = default_payload_buf;\n    pkd_dargs.payload.len = default_payload_len;\n\n    rc = ssh_init();\n    if (rc != 0) {\n        goto out;\n    }\n\n#ifdef HAVE_ARGP_H\n    argp_parse(&parser, argc, argv, 0, 0, NULL);\n#else /* HAVE_ARGP_H */\n    (void) argc;  (void) argv;\n#endif /* HAVE_ARGP_H */\n\n    rc = pkd_init_socket_wrapper();\n    if (rc != 0) {\n        fprintf(stderr, \"pkd_init_socket_wrapper failed: %d\\n\", rc);\n        goto out_finalize;\n    }\n\n    if (pkd_dargs.opts.list != 0) {\n        while (testmap[i].testname != NULL) {\n            printf(\"%s\\n\", testmap[i++].testname);\n        }\n    } else {\n        exit_code = pkd_run_tests();\n        if (exit_code != 0) {\n            fprintf(stderr, \"pkd_run_tests failed: %d\\n\", exit_code);\n        }\n    }\n\n    rc = pkd_cleanup_socket_wrapper();\n    if (rc != 0) {\n        fprintf(stderr, \"pkd_cleanup_socket_wrapper failed: %d\\n\", rc);\n    }\n\nout_finalize:\n    rc = ssh_finalize();\n    if (rc != 0) {\n        fprintf(stderr, \"ssh_finalize: %d\\n\", rc);\n    }\nout:\n    return exit_code;\n}\n"
  },
  {
    "path": "src/libssh/tests/pkd/pkd_keyutil.c",
    "content": "/*\n * pkd_keyutil.c -- pkd test key utilities\n *\n * (c) 2014 Jon Simons\n */\n\n#include \"config.h\"\n\n#include <setjmp.h> // for cmocka\n#include <stdarg.h> // for cmocka\n#include <unistd.h> // for cmocka\n#include <cmocka.h>\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <unistd.h>\n\n#include \"torture.h\" // for ssh_fips_mode()\n\n#include \"pkd_client.h\"\n#include \"pkd_keyutil.h\"\n#include \"pkd_util.h\"\n\nvoid setup_rsa_key() {\n    int rc = 0;\n    if (access(LIBSSH_RSA_TESTKEY, F_OK) != 0) {\n        rc = system_checked(OPENSSH_KEYGEN \" -t rsa -q -N \\\"\\\" -f \"\n                            LIBSSH_RSA_TESTKEY);\n    }\n    assert_int_equal(rc, 0);\n}\n\nvoid setup_ed25519_key() {\n    int rc = 0;\n    if (access(LIBSSH_ED25519_TESTKEY, F_OK) != 0) {\n        rc = system_checked(OPENSSH_KEYGEN \" -t ed25519 -q -N \\\"\\\" -f \"\n                            LIBSSH_ED25519_TESTKEY);\n    }\n    assert_int_equal(rc, 0);\n}\n\n#ifdef HAVE_DSA\nvoid setup_dsa_key() {\n    int rc = 0;\n    if (access(LIBSSH_DSA_TESTKEY, F_OK) != 0) {\n        rc = system_checked(OPENSSH_KEYGEN \" -t dsa -q -N \\\"\\\" -f \"\n                            LIBSSH_DSA_TESTKEY);\n    }\n    assert_int_equal(rc, 0);\n}\n#endif\n\nvoid setup_ecdsa_keys() {\n    int rc = 0;\n\n    if (access(LIBSSH_ECDSA_256_TESTKEY, F_OK) != 0) {\n        rc = system_checked(OPENSSH_KEYGEN \" -t ecdsa -b 256 -q -N \\\"\\\" -f \"\n                            LIBSSH_ECDSA_256_TESTKEY);\n        assert_int_equal(rc, 0);\n    }\n    if (access(LIBSSH_ECDSA_384_TESTKEY, F_OK) != 0) {\n        rc = system_checked(OPENSSH_KEYGEN \" -t ecdsa -b 384 -q -N \\\"\\\" -f \"\n                            LIBSSH_ECDSA_384_TESTKEY);\n        assert_int_equal(rc, 0);\n    }\n    if (access(LIBSSH_ECDSA_521_TESTKEY, F_OK) != 0) {\n        rc = system_checked(OPENSSH_KEYGEN \" -t ecdsa -b 521 -q -N \\\"\\\" -f \"\n                            LIBSSH_ECDSA_521_TESTKEY);\n        assert_int_equal(rc, 0);\n    }\n}\n\nvoid cleanup_rsa_key() {\n    cleanup_key(LIBSSH_RSA_TESTKEY);\n}\n\nvoid cleanup_ed25519_key() {\n    cleanup_key(LIBSSH_ED25519_TESTKEY);\n}\n\n#ifdef HAVE_DSA\nvoid cleanup_dsa_key() {\n    cleanup_key(LIBSSH_DSA_TESTKEY);\n}\n#endif\n\nvoid cleanup_ecdsa_keys() {\n    cleanup_key(LIBSSH_ECDSA_256_TESTKEY);\n    cleanup_key(LIBSSH_ECDSA_384_TESTKEY);\n    cleanup_key(LIBSSH_ECDSA_521_TESTKEY);\n}\n\nvoid setup_openssh_client_keys() {\n    int rc = 0;\n\n    if (access(OPENSSH_CA_TESTKEY, F_OK) != 0) {\n        rc = system_checked(OPENSSH_KEYGEN \" -t rsa -q -N \\\"\\\" -f \"\n                            OPENSSH_CA_TESTKEY);\n    }\n    assert_int_equal(rc, 0);\n\n    if (access(OPENSSH_RSA_TESTKEY, F_OK) != 0) {\n        rc = system_checked(OPENSSH_KEYGEN \" -t rsa -q -N \\\"\\\" -f \"\n                            OPENSSH_RSA_TESTKEY);\n    }\n    assert_int_equal(rc, 0);\n\n    if (access(OPENSSH_RSA_TESTKEY \"-cert.pub\", F_OK) != 0) {\n        rc = system_checked(OPENSSH_KEYGEN \" -I ident -s \" OPENSSH_CA_TESTKEY \" \"\n                            OPENSSH_RSA_TESTKEY \".pub 2>/dev/null\");\n    }\n    assert_int_equal(rc, 0);\n\n    if (access(OPENSSH_RSA_TESTKEY \"-sha256-cert.pub\", F_OK) != 0) {\n        rc = system_checked(OPENSSH_KEYGEN \" -I ident -t rsa-sha2-256 \"\n                            \"-s \" OPENSSH_CA_TESTKEY \" \"\n                            OPENSSH_RSA_TESTKEY \".pub 2>/dev/null\");\n    }\n    assert_int_equal(rc, 0);\n\n    if (access(OPENSSH_ECDSA256_TESTKEY, F_OK) != 0) {\n        rc = system_checked(OPENSSH_KEYGEN \" -t ecdsa -b 256 -q -N \\\"\\\" -f \"\n                            OPENSSH_ECDSA256_TESTKEY);\n    }\n    assert_int_equal(rc, 0);\n\n    if (access(OPENSSH_ECDSA256_TESTKEY \"-cert.pub\", F_OK) != 0) {\n        rc = system_checked(OPENSSH_KEYGEN \" -I ident -s \" OPENSSH_CA_TESTKEY \" \"\n                            OPENSSH_ECDSA256_TESTKEY \".pub 2>/dev/null\");\n    }\n    assert_int_equal(rc, 0);\n\n    if (access(OPENSSH_ECDSA384_TESTKEY, F_OK) != 0) {\n        rc = system_checked(OPENSSH_KEYGEN \" -t ecdsa -b 384 -q -N \\\"\\\" -f \"\n                            OPENSSH_ECDSA384_TESTKEY);\n    }\n    assert_int_equal(rc, 0);\n\n    if (access(OPENSSH_ECDSA384_TESTKEY \"-cert.pub\", F_OK) != 0) {\n        rc = system_checked(OPENSSH_KEYGEN \" -I ident -s \" OPENSSH_CA_TESTKEY \" \"\n                            OPENSSH_ECDSA384_TESTKEY \".pub 2>/dev/null\");\n    }\n    assert_int_equal(rc, 0);\n\n    if (access(OPENSSH_ECDSA521_TESTKEY, F_OK) != 0) {\n        rc = system_checked(OPENSSH_KEYGEN \" -t ecdsa -b 521 -q -N \\\"\\\" -f \"\n                            OPENSSH_ECDSA521_TESTKEY);\n    }\n    assert_int_equal(rc, 0);\n\n    if (access(OPENSSH_ECDSA521_TESTKEY \"-cert.pub\", F_OK) != 0) {\n        rc = system_checked(OPENSSH_KEYGEN \" -I ident -s \" OPENSSH_CA_TESTKEY \" \"\n                            OPENSSH_ECDSA521_TESTKEY \".pub 2>/dev/null\");\n    }\n    assert_int_equal(rc, 0);\n\n    if (!ssh_fips_mode()) {\n#ifdef HAVE_DSA\n        if (access(OPENSSH_DSA_TESTKEY, F_OK) != 0) {\n            rc = system_checked(OPENSSH_KEYGEN \" -t dsa -q -N \\\"\\\" -f \"\n                    OPENSSH_DSA_TESTKEY);\n        }\n        assert_int_equal(rc, 0);\n\n        if (access(OPENSSH_DSA_TESTKEY \"-cert.pub\", F_OK) != 0) {\n            rc = system_checked(OPENSSH_KEYGEN \" -I ident -s \" OPENSSH_CA_TESTKEY\n                    \" \" OPENSSH_DSA_TESTKEY \".pub 2>/dev/null\");\n        }\n        assert_int_equal(rc, 0);\n#endif\n\n        if (access(OPENSSH_ED25519_TESTKEY, F_OK) != 0) {\n            rc = system_checked(OPENSSH_KEYGEN \" -t ed25519 -q -N \\\"\\\" -f \"\n                    OPENSSH_ED25519_TESTKEY);\n        }\n        assert_int_equal(rc, 0);\n\n        if (access(OPENSSH_ED25519_TESTKEY \"-cert.pub\", F_OK) != 0) {\n            rc = system_checked(OPENSSH_KEYGEN \" -I ident -s \" OPENSSH_CA_TESTKEY \" \"\n                    OPENSSH_ED25519_TESTKEY \".pub 2>/dev/null\");\n        }\n        assert_int_equal(rc, 0);\n    }\n}\n\nvoid cleanup_openssh_client_keys() {\n    cleanup_key(OPENSSH_CA_TESTKEY);\n    cleanup_key(OPENSSH_RSA_TESTKEY);\n    cleanup_file(OPENSSH_RSA_TESTKEY \"-sha256-cert.pub\");\n    cleanup_key(OPENSSH_ECDSA256_TESTKEY);\n    cleanup_key(OPENSSH_ECDSA384_TESTKEY);\n    cleanup_key(OPENSSH_ECDSA521_TESTKEY);\n    if (!ssh_fips_mode()) {\n        cleanup_key(OPENSSH_ED25519_TESTKEY);\n#ifdef HAVE_DSA\n        cleanup_key(OPENSSH_DSA_TESTKEY);\n#endif\n    }\n}\n\nvoid setup_dropbear_client_rsa_key() {\n    int rc = 0;\n    if (access(DROPBEAR_RSA_TESTKEY, F_OK) != 0) {\n        rc = system_checked(DROPBEAR_KEYGEN \" -t rsa -f \"\n                            DROPBEAR_RSA_TESTKEY \" 1>/dev/null 2>/dev/null\");\n    }\n    assert_int_equal(rc, 0);\n}\n\nvoid cleanup_dropbear_client_rsa_key() {\n    unlink(DROPBEAR_RSA_TESTKEY);\n}\n"
  },
  {
    "path": "src/libssh/tests/pkd/pkd_keyutil.h",
    "content": "/*\n * pkd_keyutil.h --\n *\n * (c) 2014 Jon Simons\n */\n\n#ifndef __PKD_KEYUTIL_H__\n#define __PKD_KEYUTIL_H__\n\n#include \"config.h\"\n\n/* Server keys. */\n#ifdef HAVE_DSA\n#define LIBSSH_DSA_TESTKEY        \"libssh_testkey.id_dsa\"\n#endif\n#define LIBSSH_RSA_TESTKEY        \"libssh_testkey.id_rsa\"\n#define LIBSSH_ED25519_TESTKEY    \"libssh_testkey.id_ed25519\"\n#define LIBSSH_ECDSA_256_TESTKEY  \"libssh_testkey.id_ecdsa256\"\n#define LIBSSH_ECDSA_384_TESTKEY  \"libssh_testkey.id_ecdsa384\"\n#define LIBSSH_ECDSA_521_TESTKEY  \"libssh_testkey.id_ecdsa521\"\n\n#ifdef HAVE_DSA\nvoid setup_dsa_key(void);\n#endif\nvoid setup_rsa_key(void);\nvoid setup_ed25519_key(void);\nvoid setup_ecdsa_keys(void);\n#ifdef HAVE_DSA\nvoid cleanup_dsa_key(void);\n#endif\nvoid cleanup_rsa_key(void);\nvoid cleanup_ed25519_key(void);\nvoid cleanup_ecdsa_keys(void);\n\n/* Client keys. */\n#ifdef HAVE_DSA\n#define OPENSSH_DSA_TESTKEY       \"openssh_testkey.id_dsa\"\n#endif\n#define OPENSSH_RSA_TESTKEY       \"openssh_testkey.id_rsa\"\n#define OPENSSH_ECDSA256_TESTKEY  \"openssh_testkey.id_ecdsa256\"\n#define OPENSSH_ECDSA384_TESTKEY  \"openssh_testkey.id_ecdsa384\"\n#define OPENSSH_ECDSA521_TESTKEY  \"openssh_testkey.id_ecdsa521\"\n#define OPENSSH_ED25519_TESTKEY   \"openssh_testkey.id_ed25519\"\n#define OPENSSH_CA_TESTKEY        \"libssh_testkey.ca\"\n\n#define DROPBEAR_RSA_TESTKEY      \"dropbear_testkey.id_rsa\"\n\nvoid setup_openssh_client_keys(void);\nvoid cleanup_openssh_client_keys(void);\n\nvoid setup_dropbear_client_rsa_key(void);\nvoid cleanup_dropbear_client_rsa_key(void);\n\n#define cleanup_file(name) do {\\\n    if (access((name), F_OK) != -1) {\\\n        unlink((name));\\\n    }} while (0)\n\n#define cleanup_key(name) do {\\\n        cleanup_file((name));\\\n        cleanup_file((name \".pub\"));\\\n        cleanup_file((name \"-cert.pub\"));\\\n    } while (0)\n\n#endif /* __PKD_KEYUTIL_H__ */\n"
  },
  {
    "path": "src/libssh/tests/pkd/pkd_util.c",
    "content": "/*\n * pkd_util.c -- pkd utilities\n *\n * (c) 2014, 2018 Jon Simons <jon@jonsimons.org>\n */\n\n#include <errno.h>\n#include <limits.h>\n#include <signal.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/wait.h>\n\n#include \"pkd_client.h\"\n#include \"pkd_util.h\"\n\n/**\n * @brief runs system(3); exits if that is interrupted with SIGINT/QUIT\n * @returns 0 upon success, non-zero otherwise\n */\nint system_checked(const char *cmd) {\n    int rc = system(cmd);\n\n    if (WIFSIGNALED(rc) &&\n        ((WTERMSIG(rc) == SIGINT) || (WTERMSIG(rc) == SIGQUIT))) {\n        exit(1);\n    }\n\n    if (rc == -1) {\n        return -1;\n    }\n\n    return WEXITSTATUS(rc);\n}\n\nstatic int bin_exists(const char *binary) {\n    char bin[1024] = { 0 };\n    snprintf(&bin[0], sizeof(bin), \"type %s 1>/dev/null 2>/dev/null\", binary);\n    return (system_checked(bin) == 0);\n}\n\nstatic int is_openssh_client_new_enough(void) {\n    int rc = -1;\n    FILE *fp = NULL;\n    char version_buff[1024] = { 0 };\n    char *version;\n\n    static int version_ok = 0;\n    unsigned long int major = 0;\n    char *tmp = NULL;\n\n    if (version_ok) {\n        return version_ok;\n    }\n\n    fp = popen(\"ssh -V 2>&1\", \"r\");\n    if (fp == NULL) {\n        fprintf(stderr, \"failed to get OpenSSH client version\\n\");\n        goto done;\n    }\n\n    do {\n        if (fgets(&version_buff[0], sizeof(version_buff), fp) == NULL) {\n            fprintf(stderr, \"failed to get OpenSSH client version string\\n\");\n            goto errfgets;\n        }\n        version = strstr(version_buff, \"OpenSSH\");\n    } while(version == NULL);\n\n    /* \"OpenSSH_<major>.<minor><SP>...\" */\n    if (strlen(version) < 11) {\n        goto errversion;\n    }\n\n    /* Extract major. */\n    major = strtoul(version + 8, &tmp, 10);\n    if ((tmp == (version + 8)) ||\n        ((errno == ERANGE) && (major == ULONG_MAX)) ||\n        ((errno != 0) && (major == 0)) ||\n        ((major < 1) || (major > 100))) {\n        fprintf(stderr, \"failed to parse OpenSSH client version, \"\n                        \"errno %d\\n\", errno);\n        goto errversion;\n    }\n\n    if (major < 7) {\n        fprintf(stderr, \"error: minimum OpenSSH client version \"\n                        \"required is 7, found: %ld\\n\", major);\n        goto errversion;\n    }\n\n    version_ok = 1;\n\nerrversion:\nerrfgets:\n    rc = pclose(fp);\n    if (rc != 0) {\n        fprintf(stderr, \"failed to get OpenSSH client version: %d\\n\", rc);\n    }\ndone:\n    return version_ok;\n}\n\nint is_openssh_client_enabled(void) {\n    return (bin_exists(OPENSSH_BINARY) &&\n            bin_exists(OPENSSH_KEYGEN) &&\n            is_openssh_client_new_enough());\n}\n\nint is_dropbear_client_enabled(void) {\n    return (bin_exists(DROPBEAR_BINARY) && bin_exists(DROPBEAR_KEYGEN));\n}\n"
  },
  {
    "path": "src/libssh/tests/pkd/pkd_util.h",
    "content": "/*\n * pkd_keyutil.h --\n *\n * (c) 2014 Jon Simons\n */\n\n#ifndef __PKD_UTIL_H__\n#define __PKD_UTIL_H__\n\nint system_checked(const char *cmd);\n\n/* Is client 'X' enabled? */\nint is_openssh_client_enabled(void);\nint is_dropbear_client_enabled(void);\n\n#endif /* __PKD_UTIL_H__ */\n"
  },
  {
    "path": "src/libssh/tests/server/CMakeLists.txt",
    "content": "project(servertests C)\n\nif (WITH_SERVER AND UNIX AND NOT WIN32)\n\nfind_package(socket_wrapper)\n\nadd_subdirectory(test_server)\n\nset(LIBSSH_SERVER_TESTS\n    torture_server\n    torture_server_auth_kbdint\n    torture_server_config\n)\n\ninclude_directories(${libssh_SOURCE_DIR}/include\n                    ${libssh_BINARY_DIR}/include\n                    ${libssh_BINARY_DIR}\n                    test_server)\n\nif (ARGP_INCLUDE_DIR)\n    include_directories(${ARGP_INCLUDE_DIR})\nendif ()\n\nforeach(_SRV_TEST ${LIBSSH_SERVER_TESTS})\n    add_cmocka_test(${_SRV_TEST}\n                    SOURCES ${_SRV_TEST}.c\n                    COMPILE_OPTIONS ${DEFAULT_C_COMPILE_FLAGS}\n                    LINK_LIBRARIES ${TORTURE_LIBRARY} testserver util\n    )\n\n    if (OSX)\n        set_property(\n            TEST\n                ${_SRV_TEST}\n            PROPERTY\n            ENVIRONMENT DYLD_FORCE_FLAT_NAMESPACE=1;DYLD_INSERT_LIBRARIES=${SOCKET_WRAPPER_LIBRARY})\n    else ()\n        set_property(\n            TEST\n                ${_SRV_TEST}\n            PROPERTY\n                ENVIRONMENT ${TORTURE_ENVIRONMENT})\n    endif()\nendforeach()\n\nendif (WITH_SERVER AND UNIX AND NOT WIN32)\n"
  },
  {
    "path": "src/libssh/tests/server/test_server/CMakeLists.txt",
    "content": "project(test_server C)\n\nif (WITH_SERVER AND UNIX AND NOT WIN32)\n\nfind_package(socket_wrapper)\n\nset(server_SRCS\n    main.c\n)\n\nadd_library(testserver STATIC\n            test_server.c\n            default_cb.c)\n\nset(LIBSSH_SERVER_TESTS\n#    torture_server_kbdint\n)\n\ninclude_directories(${libssh_SOURCE_DIR}/include\n                    ${libssh_BINARY_DIR}/include\n                    ${libssh_BINARY_DIR})\n\nif (ARGP_INCLUDE_DIR)\n    include_directories(${ARGP_INCLUDE_DIR})\nendif ()\n\nif (UNIX AND NOT WIN32)\n    add_executable(test_server ${server_SRCS})\n    target_compile_options(test_server PRIVATE ${DEFAULT_C_COMPILE_FLAGS})\n    target_link_libraries(test_server\n                          testserver\n                          ssh::ssh\n                          ${ARGP_LIBRARY}\n                          util)\nendif ()\n\nendif (WITH_SERVER AND UNIX AND NOT WIN32)\n"
  },
  {
    "path": "src/libssh/tests/server/test_server/default_cb.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2018 by Red Hat, Inc.\n *\n * Author: Anderson Toshiyuki Sasaki <ansasaki@redhat.com>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n#include \"test_server.h\"\n#include \"default_cb.h\"\n\n#include <libssh/callbacks.h>\n#include <libssh/server.h>\n#include <libssh/priv.h>\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdbool.h>\n#include <poll.h>\n#include <signal.h>\n#include <sys/wait.h>\n#include <sys/ioctl.h>\n\n#ifdef HAVE_LIBUTIL_H\n#include <libutil.h>\n#endif\n#ifdef HAVE_PTY_H\n#include <pty.h>\n#endif\n#ifdef HAVE_UTMP_H\n#include <utmp.h>\n#endif\n#ifdef HAVE_UTIL_H\n#include <util.h>\n#endif\n\nint auth_pubkey_cb(UNUSED_PARAM(ssh_session session),\n                   const char *user,\n                   UNUSED_PARAM(struct ssh_key_struct *pubkey),\n                   char signature_state,\n                   void *userdata)\n{\n    struct session_data_st *sdata;\n\n    sdata = (struct session_data_st *)userdata;\n    if (sdata == NULL) {\n        fprintf(stderr, \"Error: NULL userdata\\n\");\n        goto null_userdata;\n    }\n\n    printf(\"Public key authentication of user %s\\n\", user);\n\n    switch(signature_state) {\n    case SSH_PUBLICKEY_STATE_NONE:\n    case SSH_PUBLICKEY_STATE_VALID:\n        break;\n    default:\n        goto denied;\n    }\n\n    /* TODO */\n    /* Check wheter the user and public key are in authorized keys list */\n\n    /* Authenticated */\n    printf(\"Authenticated\\n\");\n    sdata->authenticated = 1;\n    sdata->auth_attempts = 0;\n    return SSH_AUTH_SUCCESS;\n\ndenied:\n    sdata->auth_attempts++;\nnull_userdata:\n    return SSH_AUTH_DENIED;\n}\n\n/* TODO implement proper pam authentication cb */\nint auth_password_cb(UNUSED_PARAM(ssh_session session),\n                     const char *user,\n                     const char *password,\n                     void *userdata)\n{\n    bool known_user = false;\n    bool valid_password = false;\n\n    struct session_data_st *sdata;\n\n    sdata = (struct session_data_st *)userdata;\n\n    if (sdata == NULL) {\n        fprintf(stderr, \"Error: NULL userdata\\n\");\n        goto null_userdata;\n    }\n\n    if (sdata->username == NULL) {\n        fprintf(stderr, \"Error: expected username not set\\n\");\n        goto denied;\n    }\n\n    if (sdata->password == NULL) {\n        fprintf(stderr, \"Error: expected password not set\\n\");\n        goto denied;\n    }\n\n    printf(\"Password authentication of user %s\\n\", user);\n\n    known_user = !(strcmp(user, sdata->username));\n    valid_password = !(strcmp(password, sdata->password));\n\n    if (known_user && valid_password) {\n        sdata->authenticated = 1;\n        sdata->auth_attempts = 0;\n        printf(\"Authenticated\\n\");\n        return SSH_AUTH_SUCCESS;\n    }\n\ndenied:\n    sdata->auth_attempts++;\nnull_userdata:\n    return SSH_AUTH_DENIED;\n}\n\n#if WITH_GSSAPI\nint auth_gssapi_mic_cb(ssh_session session,\n                       UNUSED_PARAM(const char *user),\n                       UNUSED_PARAM(const char *principal),\n                       void *userdata)\n{\n    ssh_gssapi_creds creds;\n    struct session_data_st *sdata;\n\n    sdata = (struct session_data_st *)userdata;\n\n    if (sdata == NULL) {\n        fprintf(stderr, \"Error: NULL userdata\\n\");\n        goto null_userdata;\n    }\n\n    printf(\"GSSAPI authentication\\n\");\n\n    creds = ssh_gssapi_get_creds(session);\n    if (creds != NULL) {\n        printf(\"Received some gssapi credentials\\n\");\n    } else {\n        printf(\"Not received any forwardable creds\\n\");\n        goto denied;\n    }\n\n    printf(\"Authenticated\\n\");\n\n    sdata->authenticated = 1;\n    sdata->auth_attempts = 0;\n\n    return SSH_AUTH_SUCCESS;\n\ndenied:\n    sdata->auth_attempts++;\nnull_userdata:\n    return SSH_AUTH_DENIED;\n}\n#endif\n\nint channel_data_cb(UNUSED_PARAM(ssh_session session),\n                    UNUSED_PARAM(ssh_channel channel),\n                    void *data,\n                    uint32_t len,\n                    UNUSED_PARAM(int is_stderr),\n                    void *userdata)\n{\n    struct channel_data_st *cdata;\n    int rc;\n\n    cdata = (struct channel_data_st *)userdata;\n\n    if (cdata == NULL) {\n        fprintf(stderr, \"NULL userdata\\n\");\n        rc = SSH_ERROR;\n        goto end;\n    }\n\n    if (len == 0 || cdata->pid < 1 || kill(cdata->pid, 0) < 0) {\n        rc = SSH_OK;\n        goto end;\n    }\n\n    rc = write(cdata->child_stdin, (char *) data, len);\n\nend:\n    return rc;\n}\n\nvoid channel_eof_cb(UNUSED_PARAM(ssh_session session),\n                    UNUSED_PARAM(ssh_channel channel),\n                    void *userdata)\n{\n    struct channel_data_st *cdata;\n\n    cdata = (struct channel_data_st *)userdata;\n\n    if (cdata == NULL) {\n        fprintf(stderr, \"NULL userdata\\n\");\n        goto end;\n    }\n\nend:\n    return;\n}\n\nvoid channel_close_cb(UNUSED_PARAM(ssh_session session),\n                      UNUSED_PARAM(ssh_channel channel),\n                      void *userdata)\n{\n    struct channel_data_st *cdata;\n\n    cdata = (struct channel_data_st *)userdata;\n\n    if (cdata == NULL) {\n        fprintf(stderr, \"NULL userdata\\n\");\n        goto end;\n    }\n\nend:\n    return;\n}\n\nvoid channel_signal_cb(UNUSED_PARAM(ssh_session session),\n                       UNUSED_PARAM(ssh_channel channel),\n                       UNUSED_PARAM(const char *signal),\n                       void *userdata)\n{\n    struct channel_data_st *cdata;\n\n    cdata = (struct channel_data_st *)userdata;\n\n    if (cdata == NULL) {\n        fprintf(stderr, \"NULL userdata\\n\");\n        goto end;\n    }\n\nend:\n    return;\n}\n\nvoid channel_exit_status_cb(UNUSED_PARAM(ssh_session session),\n                            UNUSED_PARAM(ssh_channel channel),\n                            UNUSED_PARAM(int exit_status),\n                            void *userdata)\n{\n    struct channel_data_st *cdata;\n\n    cdata = (struct channel_data_st *)userdata;\n\n    if (cdata == NULL) {\n        fprintf(stderr, \"NULL userdata\\n\");\n        goto end;\n    }\n\nend:\n    return;\n}\n\nvoid channel_exit_signal_cb(UNUSED_PARAM(ssh_session session),\n                            UNUSED_PARAM(ssh_channel channel),\n                            UNUSED_PARAM(const char *signal),\n                            UNUSED_PARAM(int core),\n                            UNUSED_PARAM(const char *errmsg),\n                            UNUSED_PARAM(const char *lang),\n                            void *userdata)\n{\n    struct channel_data_st *cdata;\n\n    cdata = (struct channel_data_st *)userdata;\n\n    if (cdata == NULL) {\n        fprintf(stderr, \"NULL userdata\\n\");\n        goto end;\n    }\n\nend:\n    return;\n}\n\nint channel_pty_request_cb(UNUSED_PARAM(ssh_session session),\n                           UNUSED_PARAM(ssh_channel channel),\n                           UNUSED_PARAM(const char *term),\n                           int cols,\n                           int rows,\n                           int py,\n                           int px,\n                           void *userdata)\n{\n    struct channel_data_st *cdata;\n    int rc;\n\n    cdata = (struct channel_data_st *)userdata;\n\n    if (cdata == NULL) {\n        fprintf(stderr, \"NULL userdata\\n\");\n        rc = SSH_ERROR;\n        goto end;\n    }\n\n    cdata->winsize->ws_row = rows;\n    cdata->winsize->ws_col = cols;\n    cdata->winsize->ws_xpixel = px;\n    cdata->winsize->ws_ypixel = py;\n\n    rc = openpty(&cdata->pty_master,\n                 &cdata->pty_slave,\n                 NULL,\n                 NULL,\n                 cdata->winsize);\n    if (rc != 0) {\n        fprintf(stderr, \"Failed to open pty\\n\");\n        rc = SSH_ERROR;\n        goto end;\n    }\n\n    rc = SSH_OK;\n\nend:\n    return rc;\n}\n\nint channel_pty_resize_cb(ssh_session session,\n                          ssh_channel channel,\n                          int cols,\n                          int rows,\n                          int py,\n                          int px,\n                          void *userdata)\n{\n    struct channel_data_st *cdata;\n    int rc;\n\n    (void) session;\n    (void) channel;\n\n    cdata = (struct channel_data_st *)userdata;\n\n    if (cdata == NULL) {\n        fprintf(stderr, \"NULL userdata\\n\");\n        rc = SSH_ERROR;\n        goto end;\n    }\n\n    cdata->winsize->ws_row = rows;\n    cdata->winsize->ws_col = cols;\n    cdata->winsize->ws_xpixel = px;\n    cdata->winsize->ws_ypixel = py;\n\n    if (cdata->pty_master != -1) {\n        rc = ioctl(cdata->pty_master, TIOCSWINSZ, cdata->winsize);\n        goto end;\n    }\n\n    rc = SSH_ERROR;\n\nend:\n    return rc;\n}\n\nvoid channel_auth_agent_req_callback(UNUSED_PARAM(ssh_session session),\n                                     UNUSED_PARAM(ssh_channel channel),\n                                     UNUSED_PARAM(void *userdata))\n{\n    /* TODO */\n}\n\nvoid channel_x11_req_callback(UNUSED_PARAM(ssh_session session),\n                              UNUSED_PARAM(ssh_channel channel),\n                              UNUSED_PARAM(int single_connection),\n                              UNUSED_PARAM(const char *auth_protocol),\n                              UNUSED_PARAM(const char *auth_cookie),\n                              UNUSED_PARAM(uint32_t screen_number),\n                              UNUSED_PARAM(void *userdata))\n{\n    /* TODO */\n}\n\nstatic int exec_pty(const char *mode,\n                    const char *command,\n                    struct channel_data_st *cdata)\n{\n    int rc;\n\n    if (cdata == NULL) {\n        fprintf(stderr, \"NULL userdata\\n\");\n        rc = SSH_ERROR;\n        goto end;\n    }\n\n    cdata->pid = fork();\n    switch(cdata->pid) {\n    case -1:\n        close(cdata->pty_master);\n        close(cdata->pty_slave);\n        fprintf(stderr, \"Failed to fork\\n\");\n        rc = SSH_ERROR;\n        goto end;\n    case 0:\n        close(cdata->pty_master);\n        if (login_tty(cdata->pty_slave) != 0) {\n            exit(1);\n        }\n        execl(\"/bin/sh\", \"sh\", mode, command, NULL);\n        exit(0);\n    default:\n        close(cdata->pty_slave);\n        /* pty fd is bi-directional */\n        cdata->child_stdout = cdata->child_stdin = cdata->pty_master;\n    }\n\n    rc = SSH_OK;\n\nend:\n    return rc;\n}\n\nstatic int exec_nopty(const char *command, struct channel_data_st *cdata)\n{\n    int in[2], out[2], err[2];\n\n    if (cdata == NULL) {\n        fprintf(stderr, \"NULL userdata\\n\");\n        goto stdin_failed;\n    }\n\n    /* Do the plumbing to be able to talk with the child process. */\n    if (pipe(in) != 0) {\n        goto stdin_failed;\n    }\n    if (pipe(out) != 0) {\n        goto stdout_failed;\n    }\n    if (pipe(err) != 0) {\n        goto stderr_failed;\n    }\n\n    switch(cdata->pid = fork()) {\n        case -1:\n            goto fork_failed;\n        case 0:\n            /* Finish the plumbing in the child process. */\n            close(in[1]);\n            close(out[0]);\n            close(err[0]);\n            dup2(in[0], STDIN_FILENO);\n            dup2(out[1], STDOUT_FILENO);\n            dup2(err[1], STDERR_FILENO);\n            close(in[0]);\n            close(out[1]);\n            close(err[1]);\n            /* exec the requested command. */\n            execl(\"/bin/sh\", \"sh\", \"-c\", command, NULL);\n            exit(0);\n    }\n\n    close(in[0]);\n    close(out[1]);\n    close(err[1]);\n\n    cdata->child_stdin = in[1];\n    cdata->child_stdout = out[0];\n    cdata->child_stderr = err[0];\n\n    return SSH_OK;\n\nfork_failed:\n    close(err[0]);\n    close(err[1]);\nstderr_failed:\n    close(out[0]);\n    close(out[1]);\nstdout_failed:\n    close(in[0]);\n    close(in[1]);\nstdin_failed:\n    return SSH_ERROR;\n}\n\nint channel_shell_request_cb(UNUSED_PARAM(ssh_session session),\n                             UNUSED_PARAM(ssh_channel channel),\n                             void *userdata)\n{\n    struct channel_data_st *cdata;\n    int rc;\n\n    cdata = (struct channel_data_st *)userdata;\n\n    if (cdata == NULL) {\n        fprintf(stderr, \"NULL userdata\\n\");\n        rc = SSH_ERROR;\n        goto end;\n    }\n\n    if(cdata->pid > 0) {\n        rc = SSH_ERROR;\n        goto end;\n    }\n\n    if (cdata->pty_master != -1 && cdata->pty_slave != -1) {\n        rc = exec_pty(\"-l\", NULL, cdata);\n        goto end;\n    }\n\n    /* Client requested a shell without a pty, let's pretend we allow that */\n    rc = SSH_OK;\n\nend:\n    return rc;\n}\n\nint channel_exec_request_cb(UNUSED_PARAM(ssh_session session),\n                            UNUSED_PARAM(ssh_channel channel),\n                            const char *command,\n                            void *userdata)\n{\n    struct channel_data_st *cdata;\n    int rc;\n\n    cdata = (struct channel_data_st *)userdata;\n\n    if (cdata == NULL) {\n        fprintf(stderr, \"NULL userdata\\n\");\n        rc = SSH_ERROR;\n        goto end;\n    }\n\n    if(cdata->pid > 0) {\n        rc = SSH_ERROR;\n        goto end;\n    }\n\n    if (cdata->pty_master != -1 && cdata->pty_slave != -1) {\n        rc = exec_pty(\"-c\", command, cdata);\n        goto end;\n    }\n\n    rc = exec_nopty(command, cdata);\n\nend:\n    return rc;\n}\n\nint channel_env_request_cb(UNUSED_PARAM(ssh_session session),\n                           UNUSED_PARAM(ssh_channel channel),\n                           UNUSED_PARAM(const char *env_name),\n                           UNUSED_PARAM(const char *env_value),\n                           void *userdata)\n{\n    struct channel_data_st *cdata;\n    int rc;\n\n    cdata = (struct channel_data_st *)userdata;\n\n    if (cdata == NULL) {\n        fprintf(stderr, \"NULL userdata\\n\");\n        rc = SSH_ERROR;\n        goto end;\n    }\n\n    rc = SSH_OK;\n\nend:\n    return rc;\n}\n\nint channel_subsystem_request_cb(ssh_session session,\n                                 ssh_channel channel,\n                                 const char *subsystem,\n                                 void *userdata)\n{\n    struct channel_data_st *cdata;\n    int rc;\n\n    cdata = (struct channel_data_st *)userdata;\n\n    if (cdata == NULL) {\n        fprintf(stderr, \"NULL userdata\\n\");\n        rc = SSH_ERROR;\n        goto end;\n    }\n\n    rc = strcmp(subsystem, \"sftp\");\n    if (rc == 0) {\n        rc = channel_exec_request_cb(session,\n                                     channel,\n                                     SFTP_SERVER_PATH,\n                                     userdata);\n        goto end;\n    }\n\n    /* TODO add other subsystems */\n\n    rc = SSH_ERROR;\n\nend:\n    return rc;\n}\n\nint channel_write_wontblock_cb(UNUSED_PARAM(ssh_session session),\n                               UNUSED_PARAM(ssh_channel channel),\n                               UNUSED_PARAM(size_t bytes),\n                               UNUSED_PARAM(void *userdata))\n{\n    /* TODO */\n\n    return 0;\n}\n\nssh_channel channel_new_session_cb(ssh_session session, void *userdata)\n{\n    struct session_data_st *sdata = NULL;\n    ssh_channel chan = NULL;\n\n    sdata = (struct session_data_st *)userdata;\n\n    if (sdata == NULL) {\n        fprintf(stderr, \"NULL userdata\");\n        goto end;\n    }\n\n    chan = ssh_channel_new(session);\n    if (chan == NULL) {\n        fprintf(stderr, \"Error creating channel: %s\\n\",\n                ssh_get_error(session));\n        goto end;\n    }\n\n    sdata->channel = chan;\n\nend:\n    return chan;\n}\n\n#ifdef WITH_PCAP\nstatic void set_pcap(struct session_data_st *sdata,\n                     ssh_session session,\n                     char *pcap_file)\n{\n    int rc = 0;\n\n    if (sdata == NULL) {\n        return;\n    }\n\n    if (pcap_file == NULL) {\n        return;\n    }\n\n    sdata->pcap = ssh_pcap_file_new();\n    if (sdata->pcap == NULL) {\n        return;\n    }\n\n    rc = ssh_pcap_file_open(sdata->pcap, pcap_file);\n    if (rc == SSH_ERROR) {\n        fprintf(stderr, \"Error opening pcap file\\n\");\n        ssh_pcap_file_free(sdata->pcap);\n        sdata->pcap = NULL;\n        return;\n    }\n    ssh_set_pcap_file(session, sdata->pcap);\n}\n\nstatic void cleanup_pcap(struct session_data_st *sdata)\n{\n    if (sdata == NULL) {\n        return;\n    }\n\n    if (sdata->pcap == NULL) {\n        return;\n    }\n\n    ssh_pcap_file_free(sdata->pcap);\n    sdata->pcap = NULL;\n}\n#endif\n\nstatic int process_stdout(socket_t fd, int revents, void *userdata)\n{\n    char buf[BUF_SIZE];\n    int n = -1;\n    ssh_channel channel = (ssh_channel) userdata;\n\n    if (channel != NULL && (revents & POLLIN) != 0) {\n        n = read(fd, buf, BUF_SIZE);\n        if (n > 0) {\n            ssh_channel_write(channel, buf, n);\n        }\n    }\n\n    return n;\n}\n\nstatic int process_stderr(socket_t fd, int revents, void *userdata)\n{\n    char buf[BUF_SIZE];\n    int n = -1;\n    ssh_channel channel = (ssh_channel) userdata;\n\n    if (channel != NULL && (revents & POLLIN) != 0) {\n        n = read(fd, buf, BUF_SIZE);\n        if (n > 0) {\n            ssh_channel_write_stderr(channel, buf, n);\n        }\n    }\n\n    return n;\n}\n\n/* The caller is responsible to set the userdata to be provided to the callback\n * The caller is responsible to free the allocated structure\n * */\nstruct ssh_server_callbacks_struct *get_default_server_cb(void)\n{\n\n    struct ssh_server_callbacks_struct *cb;\n\n    cb = (struct ssh_server_callbacks_struct *)calloc(1,\n            sizeof(struct ssh_server_callbacks_struct));\n\n    if (cb == NULL) {\n        fprintf(stderr, \"Out of memory\\n\");\n        goto end;\n    }\n\n    cb->auth_password_function = auth_password_cb;\n    cb->auth_pubkey_function = auth_pubkey_cb;\n    cb->channel_open_request_session_function = channel_new_session_cb;\n#if WITH_GSSAPI\n    cb->auth_gssapi_mic_function = auth_gssapi_mic_cb;\n#endif\n\nend:\n    return cb;\n}\n\n/* The caller is responsible to set the userdata to be provided to the callback\n * The caller is responsible to free the allocated structure\n * */\nstruct ssh_channel_callbacks_struct *get_default_channel_cb(void)\n{\n    struct ssh_channel_callbacks_struct *cb;\n\n    cb = (struct ssh_channel_callbacks_struct *)calloc(1,\n            sizeof(struct ssh_channel_callbacks_struct));\n    if (cb == NULL) {\n        fprintf(stderr, \"Out of memory\\n\");\n        goto end;\n    }\n\n    cb->channel_pty_request_function = channel_pty_request_cb;\n    cb->channel_pty_window_change_function = channel_pty_resize_cb;\n    cb->channel_shell_request_function = channel_shell_request_cb;\n    cb->channel_env_request_function = channel_env_request_cb;\n    cb->channel_subsystem_request_function = channel_subsystem_request_cb;\n    cb->channel_exec_request_function = channel_exec_request_cb;\n    cb->channel_data_function = channel_data_cb;\n\nend:\n    return cb;\n};\n\nvoid default_handle_session_cb(ssh_event event,\n                               ssh_session session,\n                               struct server_state_st *state)\n{\n    int n;\n    int rc = 0;\n\n    /* Structure for storing the pty size. */\n    struct winsize wsize = {\n        .ws_row = 0,\n        .ws_col = 0,\n        .ws_xpixel = 0,\n        .ws_ypixel = 0\n    };\n\n    /* Our struct holding information about the channel. */\n    struct channel_data_st cdata = {\n        .pid = 0,\n        .pty_master = -1,\n        .pty_slave = -1,\n        .child_stdin = -1,\n        .child_stdout = -1,\n        .child_stderr = -1,\n        .event = NULL,\n        .winsize = &wsize\n    };\n\n    /* Our struct holding information about the session. */\n    struct session_data_st sdata = {\n        .channel = NULL,\n        .auth_attempts = 0,\n        .authenticated = 0,\n        .username = SSHD_DEFAULT_USER,\n        .password = SSHD_DEFAULT_PASSWORD\n    };\n\n    struct ssh_channel_callbacks_struct *channel_cb = NULL;\n    struct ssh_server_callbacks_struct *server_cb = NULL;\n\n    if (state == NULL) {\n        fprintf(stderr, \"NULL server state provided\\n\");\n        goto end;\n    }\n\n    /* If callbacks were provided use them. Otherwise, use default callbacks */\n    if (state->server_cb != NULL) {\n        /* This is a macro, it does not return a value */\n        ssh_callbacks_init(state->server_cb);\n\n        rc = ssh_set_server_callbacks(session, state->server_cb);\n        if (rc) {\n            goto end;\n        }\n    } else {\n        server_cb = get_default_server_cb();\n        if (server_cb == NULL) {\n            goto end;\n        }\n\n        server_cb->userdata = &sdata;\n\n        /* This is a macro, it does not return a value */\n        ssh_callbacks_init(server_cb);\n\n        rc = ssh_set_server_callbacks(session, server_cb);\n        if (rc) {\n            goto end;\n        }\n    }\n\n    sdata.server_state = (void *)state;\n    cdata.server_state = (void *)state;\n\n#ifdef WITH_PCAP\n    set_pcap(&sdata, session, state->pcap_file);\n#endif\n\n    if (state->expected_username != NULL) {\n        sdata.username = state->expected_username;\n    }\n\n    if (state->expected_password != NULL) {\n        sdata.password = state->expected_password;\n    }\n\n    if (ssh_handle_key_exchange(session) != SSH_OK) {\n        fprintf(stderr, \"%s\\n\", ssh_get_error(session));\n        return;\n    }\n\n    /* Set the supported authentication methods */\n    if (state->auth_methods) {\n        ssh_set_auth_methods(session, state->auth_methods);\n    } else {\n        ssh_set_auth_methods(session,\n                SSH_AUTH_METHOD_PASSWORD |\n                SSH_AUTH_METHOD_PUBLICKEY);\n    }\n\n    ssh_event_add_session(event, session);\n\n    n = 0;\n    while (sdata.authenticated == 0 || sdata.channel == NULL) {\n        /* If the user has used up all attempts, or if he hasn't been able to\n         * authenticate in 10 seconds (n * 100ms), disconnect. */\n        if (sdata.auth_attempts >= state->max_tries || n >= 100) {\n            return;\n        }\n\n        if (ssh_event_dopoll(event, 100) == SSH_ERROR) {\n            fprintf(stderr, \"do_poll error: %s\\n\", ssh_get_error(session));\n            return;\n        }\n        n++;\n    }\n\n    /* TODO check return values */\n    if (state->channel_cb != NULL) {\n        ssh_callbacks_init(state->channel_cb);\n\n        rc = ssh_set_channel_callbacks(sdata.channel, state->channel_cb);\n        if (rc) {\n            goto end;\n        }\n    } else {\n        channel_cb = get_default_channel_cb();\n        if (channel_cb == NULL) {\n            goto end;\n        }\n\n        channel_cb->userdata = &cdata;\n\n        ssh_callbacks_init(channel_cb);\n        rc = ssh_set_channel_callbacks(sdata.channel, channel_cb);\n        if (rc) {\n            goto end;\n        }\n    }\n\n    do {\n        /* Poll the main event which takes care of the session, the channel and\n         * even our child process's stdout/stderr (once it's started). */\n        if (ssh_event_dopoll(event, -1) == SSH_ERROR) {\n          ssh_channel_close(sdata.channel);\n        }\n\n        /* If child process's stdout/stderr has been registered with the event,\n         * or the child process hasn't started yet, continue. */\n        if (cdata.event != NULL || cdata.pid == 0) {\n            continue;\n        }\n        /* Executed only once, once the child process starts. */\n        cdata.event = event;\n        /* If stdout valid, add stdout to be monitored by the poll event. */\n        if (cdata.child_stdout != -1) {\n            if (ssh_event_add_fd(event, cdata.child_stdout, POLLIN, process_stdout,\n                                 sdata.channel) != SSH_OK) {\n                fprintf(stderr, \"Failed to register stdout to poll context\\n\");\n                ssh_channel_close(sdata.channel);\n            }\n        }\n\n        /* If stderr valid, add stderr to be monitored by the poll event. */\n        if (cdata.child_stderr != -1){\n            if (ssh_event_add_fd(event, cdata.child_stderr, POLLIN, process_stderr,\n                                 sdata.channel) != SSH_OK) {\n                fprintf(stderr, \"Failed to register stderr to poll context\\n\");\n                ssh_channel_close(sdata.channel);\n            }\n        }\n    } while(ssh_channel_is_open(sdata.channel) &&\n            (cdata.pid == 0 || waitpid(cdata.pid, &rc, WNOHANG) == 0));\n\n    close(cdata.pty_master);\n    close(cdata.child_stdin);\n    close(cdata.child_stdout);\n    close(cdata.child_stderr);\n\n    /* Remove the descriptors from the polling context, since they are now\n     * closed, they will always trigger during the poll calls. */\n    ssh_event_remove_fd(event, cdata.child_stdout);\n    ssh_event_remove_fd(event, cdata.child_stderr);\n\n    /* If the child process exited. */\n    if (kill(cdata.pid, 0) < 0 && WIFEXITED(rc)) {\n        rc = WEXITSTATUS(rc);\n        ssh_channel_request_send_exit_status(sdata.channel, rc);\n    /* If client terminated the channel or the process did not exit nicely,\n     * but only if something has been forked. */\n    } else if (cdata.pid > 0) {\n        kill(cdata.pid, SIGKILL);\n    }\n\n    ssh_channel_send_eof(sdata.channel);\n    ssh_channel_close(sdata.channel);\n\n    /* Wait up to 5 seconds for the client to terminate the session. */\n    for (n = 0; n < 50 && (ssh_get_status(session) & SESSION_END) == 0; n++) {\n        ssh_event_dopoll(event, 100);\n    }\n\nend:\n#ifdef WITH_PCAP\n    cleanup_pcap(&sdata);\n#endif\n    if (channel_cb != NULL) {\n        free(channel_cb);\n    }\n    if (server_cb != NULL) {\n        free(server_cb);\n    }\n    return;\n}\n"
  },
  {
    "path": "src/libssh/tests/server/test_server/default_cb.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2018 by Red Hat, Inc.\n *\n * Author: Anderson Toshiyuki Sasaki <ansasaki@redhat.com>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <libssh/libssh.h>\n#include <libssh/callbacks.h>\n\n#define SSHD_DEFAULT_USER \"libssh\"\n#define SSHD_DEFAULT_PASSWORD \"libssh\"\n#define SSHD_DEFAULT_PORT 2222\n#define SSHD_DEFAULT_ADDRESS \"127.0.0.1\"\n#define SSHD_DEFAULT_PCAP_FILE \"debug.server.pcap\"\n\n#ifndef KEYS_FOLDER\n#ifdef _WIN32\n#define KEYS_FOLDER\n#else\n#define KEYS_FOLDER \"/etc/ssh/\"\n#endif\n#endif\n\n#define BUF_SIZE 1048576\n#define SESSION_END (SSH_CLOSED | SSH_CLOSED_ERROR)\n#define SFTP_SERVER_PATH \"/usr/lib/sftp-server\"\n\n#ifdef HAVE_PTY_H\n#include <pty.h>\n#endif\n\n/* A userdata struct for channel. */\nstruct channel_data_st {\n    /* pid of the child process the channel will spawn. */\n    pid_t pid;\n    /* For PTY allocation */\n    socket_t pty_master;\n    socket_t pty_slave;\n    /* For communication with the child process. */\n    socket_t child_stdin;\n    socket_t child_stdout;\n    /* Only used for subsystem and exec requests. */\n    socket_t child_stderr;\n    /* Event which is used to poll the above descriptors. */\n    ssh_event event;\n    /* Terminal size struct. */\n    struct winsize *winsize;\n    /* This pointer will hold the server state for default callbacks */\n    void *server_state;\n    /* This pointer is useful to set data for custom callbacks */\n    void *extra_data;\n};\n\n/* A userdata struct for session. */\nstruct session_data_st {\n    /* Pointer to the channel the session will allocate. */\n    ssh_channel channel;\n    int auth_attempts;\n    int authenticated;\n    const char *username;\n    const char *password;\n#ifdef WITH_PCAP\n    ssh_pcap_file pcap;\n#endif\n    /* This pointer will hold the server state for default callbacks */\n    void *server_state;\n    /* This pointer is useful to set data for custom callbacks */\n    void *extra_data;\n};\n\nint auth_password_cb(ssh_session session, const char *user,\n        const char *password, void *userdata);\n\n#if WITH_GSSAPI\nint auth_gssapi_mic_cb(ssh_session session, const char *user,\n        const char *principal, void *userdata);\n#endif\n\nint channel_data_cb(ssh_session session, ssh_channel channel,\n        void *data, uint32_t len, int is_stderr, void *userdata);\n\nvoid channel_eof_cb(ssh_session session, ssh_channel channel,\n        void *userdata);\n\nvoid channel_close_cb(ssh_session session, ssh_channel channel,\n        void *userdata);\n\nvoid channel_signal_cb (ssh_session session,\n        ssh_channel channel,\n        const char *signal,\n        void *userdata);\n\nvoid channel_exit_status_cb (ssh_session session,\n        ssh_channel channel,\n        int exit_status,\n        void *userdata);\n\nvoid channel_exit_signal_cb(ssh_session session,\n        ssh_channel channel,\n        const char *signal,\n        int core,\n        const char *errmsg,\n        const char *lang,\n        void *userdata);\n\nint channel_pty_request_cb(ssh_session session, ssh_channel channel,\n        const char *term, int cols, int rows, int py, int px, void *userdata);\n\nint channel_pty_resize_cb(ssh_session session, ssh_channel channel,\n        int cols, int rows, int py, int px, void *userdata);\n\nint channel_shell_request_cb(ssh_session session, ssh_channel channel,\n        void *userdata);\n\nvoid channel_auth_agent_req_callback(ssh_session session,\n        ssh_channel channel, void *userdata);\n\nvoid channel_x11_req_callback(ssh_session session,\n        ssh_channel channel,\n        int single_connection,\n        const char *auth_protocol,\n        const char *auth_cookie,\n        uint32_t screen_number,\n        void *userdata);\n\nint channel_exec_request_cb(ssh_session session,\n        ssh_channel channel,\n        const char *command,\n        void *userdata);\n\nint channel_env_request_cb(ssh_session session,\n        ssh_channel channel, const char *env_name, const char *env_value,\n        void *userdata);\n\nint channel_subsystem_request_cb(ssh_session session,\n        ssh_channel channel, const char *subsystem,\n        void *userdata);\n\nint channel_write_wontblock_cb(ssh_session session,\n        ssh_channel channel,\n        size_t bytes,\n        void *userdata);\n\nssh_channel channel_new_session_cb(ssh_session session, void *userdata);\n\n/* The caller is responsible to set the userdata to be provided to the callback\n * The caller is responsible to free the allocated structure\n * */\nstruct ssh_server_callbacks_struct *get_default_server_cb(void);\n\n/* The caller is responsible to set the userdata to be provided to the callback\n * The caller is responsible to free the allocated structure\n * */\nstruct ssh_channel_callbacks_struct *get_default_channel_cb(void);\n\nvoid default_handle_session_cb(ssh_event event, ssh_session session,\n        struct server_state_st *state);\n"
  },
  {
    "path": "src/libssh/tests/server/test_server/main.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2018 by Red Hat, Inc.\n *\n * Author: Anderson Toshiyuki Sasaki <ansasaki@redhat.com>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n#include \"test_server.h\"\n#include \"default_cb.h\"\n\n#include <libssh/priv.h>\n\n#include <libssh/libssh.h>\n#include <libssh/server.h>\n#include <libssh/callbacks.h>\n\n#ifdef HAVE_ARGP_H\n#include <argp.h>\n#endif\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <stdbool.h>\n\nstruct arguments_st {\n    char *address;\n    char *port;\n\n    char *ecdsa_key;\n    char *dsa_key;\n    char *ed25519_key;\n    char *rsa_key;\n    char *host_key;\n\n    char *verbosity;\n    char *auth_methods;\n    bool with_pcap;\n\n    char *pcap_file;\n\n    char *username;\n    char *password;\n\n    char *config_file;\n    bool with_global_config;\n};\n\nstatic void free_arguments(struct arguments_st *arguments)\n{\n    if (arguments == NULL) {\n        goto end;\n    }\n\n    SAFE_FREE(arguments->address);\n    SAFE_FREE(arguments->port);\n\n    SAFE_FREE(arguments->ecdsa_key);\n    SAFE_FREE(arguments->dsa_key);\n    SAFE_FREE(arguments->ed25519_key);\n    SAFE_FREE(arguments->rsa_key);\n    SAFE_FREE(arguments->host_key);\n\n    SAFE_FREE(arguments->verbosity);\n    SAFE_FREE(arguments->auth_methods);\n    SAFE_FREE(arguments->pcap_file);\n\n    SAFE_FREE(arguments->username);\n    SAFE_FREE(arguments->password);\n    SAFE_FREE(arguments->config_file);\n\nend:\n    return;\n}\n\n#ifdef HAVE_ARGP_H\n\nstatic void print_auth_methods(int auth_methods)\n{\n    printf(\"auth_methods = \\n\");\n    if (auth_methods & SSH_AUTH_METHOD_NONE) {\n        printf(\"\\tSSH_AUTH_METHOD_NONE\\n\");\n    }\n    if (auth_methods & SSH_AUTH_METHOD_PASSWORD) {\n        printf(\"\\tSSH_AUTH_METHOD_PASSWORD\\n\");\n    }\n    if (auth_methods & SSH_AUTH_METHOD_PUBLICKEY) {\n        printf(\"\\tSSH_AUTH_METHOD_PUBLICKEY\\n\");\n    }\n    if (auth_methods & SSH_AUTH_METHOD_HOSTBASED) {\n        printf(\"\\tSSH_AUTH_METHOD_HOSTBASED\\n\");\n    }\n    if (auth_methods & SSH_AUTH_METHOD_INTERACTIVE) {\n        printf(\"\\tSSH_AUTH_METHOD_INTERACTIVE\\n\");\n    }\n    if (auth_methods & SSH_AUTH_METHOD_GSSAPI_MIC) {\n        printf(\"\\tSSH_AUTH_METHOD_GSSAPI_MIC\\n\");\n    }\n}\n\nstatic void print_verbosity(int verbosity)\n{\n    printf(\"verbosity = \");\n    switch(verbosity) {\n    case SSH_LOG_NOLOG:\n        printf(\"NO LOG\\n\");\n        break;\n    case SSH_LOG_WARNING:\n        printf(\"WARNING\\n\");\n        break;\n    case SSH_LOG_PROTOCOL:\n        printf(\"PROTOCOL\\n\");\n        break;\n    case SSH_LOG_PACKET:\n        printf(\"PACKET\\n\");\n        break;\n    case SSH_LOG_FUNCTIONS:\n        printf(\"FUNCTIONS\\n\");\n        break;\n    default:\n        printf(\"UNKNOWN\\n\");;\n        break;\n    }\n}\n\nstatic void print_server_state(struct server_state_st *state)\n{\n    if (state) {\n        printf(\"===================| STATE |=====================\\n\");\n        printf(\"address = %s\\n\",\n                state->address? state->address: \"NULL\");\n        printf(\"port = %d\\n\",\n                state->port? state->port: 0);\n        printf(\"=================================================\\n\");\n        printf(\"ecdsa_key = %s\\n\",\n                state->ecdsa_key? state->ecdsa_key: \"NULL\");\n        printf(\"dsa_key = %s\\n\",\n                state->dsa_key? state->dsa_key: \"NULL\");\n        printf(\"ed25519_key = %s\\n\",\n                state->ed25519_key? state->ed25519_key: \"NULL\");\n        printf(\"rsa_key = %s\\n\",\n                state->rsa_key? state->rsa_key: \"NULL\");\n        printf(\"host_key = %s\\n\",\n                state->host_key? state->host_key: \"NULL\");\n        printf(\"=================================================\\n\");\n        print_auth_methods(state->auth_methods);\n        print_verbosity(state->verbosity);\n        printf(\"with_pcap = %s\\n\",\n                state->with_pcap? \"TRUE\": \"FALSE\");\n        printf(\"pcap_file = %s\\n\",\n                state->pcap_file? state->pcap_file: \"NULL\");\n        printf(\"=================================================\\n\");\n        printf(\"username = %s\\n\",\n                state->expected_username? state->expected_username: \"NULL\");\n        printf(\"password = %s\\n\",\n                state->expected_password? state->expected_password: \"NULL\");\n        printf(\"=================================================\\n\");\n        printf(\"with_global_config = %s\\n\",\n                state->parse_global_config? \"TRUE\": \"FALSE\");\n        printf(\"config_file = %s\\n\",\n                state->config_file? state->config_file: \"NULL\");\n        printf(\"=================================================\\n\");\n    }\n}\n\nstatic int init_server_state(struct server_state_st *state,\n                             struct arguments_st *arguments)\n{\n    int rc = 0;\n\n    if (state == NULL) {\n        rc = SSH_ERROR;\n        goto end;\n    }\n\n    /* Initialize server state. The \"arguments structure\" */\n    if (arguments->address) {\n        state->address = arguments->address;\n        arguments->address = NULL;\n    } else {\n        state->address = strdup(SSHD_DEFAULT_ADDRESS);\n        if (state->address == NULL) {\n            fprintf(stderr, \"Out of memory\\n\");\n            rc = SSH_ERROR;\n            goto end;\n        }\n    }\n\n    if (arguments->port) {\n        state->port = atoi(arguments->port);\n    } else {\n        state->port = SSHD_DEFAULT_PORT;\n    }\n\n    if (arguments->ecdsa_key) {\n        state->ecdsa_key = arguments->ecdsa_key;\n        arguments->ecdsa_key = NULL;\n    } else {\n        state->ecdsa_key = NULL;\n    }\n\n    if (arguments->dsa_key) {\n        state->dsa_key = arguments->dsa_key;\n        arguments->dsa_key = NULL;\n    } else {\n        state->dsa_key = NULL;\n    }\n\n    if (arguments->ed25519_key) {\n        state->ed25519_key = arguments->ed25519_key;\n        arguments->ed25519_key = NULL;\n    } else {\n        state->ed25519_key = NULL;\n    }\n\n    if (arguments->rsa_key) {\n        state->rsa_key = arguments->rsa_key;\n        arguments->rsa_key = NULL;\n    } else {\n        state->rsa_key = NULL;\n    }\n\n    if (arguments->host_key) {\n        state->host_key = arguments->host_key;\n        arguments->host_key = NULL;\n    } else {\n        state->host_key = NULL;\n    }\n\n    if (arguments->username) {\n        state->expected_username = arguments->username;\n        arguments->username = NULL;\n    } else {\n        state->expected_username = strdup(SSHD_DEFAULT_USER);\n        if (state->expected_username == NULL) {\n            fprintf(stderr, \"Out of memory\\n\");\n            rc = SSH_ERROR;\n            goto end;\n        }\n    }\n\n    if (arguments->password) {\n        state->expected_password = arguments->password;\n        arguments->password = NULL;\n    } else {\n        state->expected_password = strdup(SSHD_DEFAULT_PASSWORD);\n        if (state->expected_password == NULL) {\n            fprintf(stderr, \"Out of memory\\n\");\n            rc = SSH_ERROR;\n            goto end;\n        }\n    }\n\n    if (arguments->verbosity) {\n        state->verbosity = atoi(arguments->verbosity);\n    } else {\n        state->verbosity = 0;\n    }\n\n    if (arguments->auth_methods) {\n        state->auth_methods = atoi(arguments->auth_methods);\n    } else {\n        state->auth_methods = SSH_AUTH_METHOD_PASSWORD |\n                              SSH_AUTH_METHOD_PUBLICKEY;\n    }\n\n    state->with_pcap = arguments->with_pcap;\n\n    if (arguments->pcap_file) {\n        state->pcap_file = arguments->pcap_file;\n        arguments->pcap_file = NULL;\n    } else {\n        if (arguments->with_pcap) {\n            state->pcap_file = strdup(SSHD_DEFAULT_PCAP_FILE);\n            if (state->pcap_file == NULL) {\n                fprintf(stderr, \"Out of memory\\n\");\n                rc = SSH_ERROR;\n                goto end;\n            }\n        } else {\n            state->pcap_file = NULL;\n        }\n    }\n\n    state->parse_global_config = arguments->with_global_config;\n\n    if (arguments->config_file) {\n        state->config_file = arguments->config_file;\n        arguments->config_file = NULL;\n    }\n\n    /* TODO make configurable */\n    state->max_tries = 3;\n    state->error = 0;\n\n\n    if (state) {\n        print_server_state(state);\n    }\n\n    /* TODO make callbacks configurable through command line ? */\n    /* Set callbacks to be used */\n    state->handle_session = default_handle_session_cb;\n\n    /* Check required parameters */\n    if (state->address == NULL) {\n        rc = SSH_ERROR;\n        goto end;\n    }\n\nend:\n    if (rc != 0) {\n        free_server_state(state);\n    }\n\n    return rc;\n}\n\nconst char *argp_program_version = \"libssh test server \"\nSSH_STRINGIFY(LIBSSH_VERSION);\nconst char *argp_program_bug_address = \"<libssh@libssh.org>\";\n\n/* Program documentation. */\nstatic char doc[] = \"libssh -- a Secure Shell protocol implementation\";\n\n/* A description of the arguments we accept. */\nstatic char args_doc[] = \"BINDADDR\";\n\n/* The options we understand. */\nstatic struct argp_option options[] = {\n    {\n        .name  = \"port\",\n        .key   = 'p',\n        .arg   = \"PORT\",\n        .flags = 0,\n        .doc   = \"Set the port to bind.\",\n        .group = 0\n    },\n    {\n        .name  = \"ecdsakey\",\n        .key   = 'c',\n        .arg   = \"FILE\",\n        .flags = 0,\n        .doc   = \"Set the ECDSA key.\",\n        .group = 0\n    },\n    {\n        .name  = \"dsakey\",\n        .key   = 'd',\n        .arg   = \"FILE\",\n        .flags = 0,\n        .doc   = \"Set the DSA key.\",\n        .group = 0\n    },\n    {\n        .name  = \"ed25519key\",\n        .key   = 'e',\n        .arg   = \"FILE\",\n        .flags = 0,\n        .doc   = \"Set the ed25519 key.\",\n        .group = 0\n    },\n    {\n        .name  = \"rsakey\",\n        .key   = 'r',\n        .arg   = \"FILE\",\n        .flags = 0,\n        .doc   = \"Set the RSA key.\",\n        .group = 0\n    },\n    {\n        .name  = \"hostkey\",\n        .key   = 'k',\n        .arg   = \"FILE\",\n        .flags = 0,\n        .doc   = \"Set the host key.\",\n        .group = 0\n    },\n    {\n        .name  = \"pcapfile\",\n        .key   = 'f',\n        .arg   = \"FILE\",\n        .flags = 0,\n        .doc   = \"Set the pcap output file.\",\n        .group = 0\n    },\n    {\n        .name  = \"auth-methods\",\n        .key   = 'a',\n        .arg   = \"METHODS\",\n        .flags = 0,\n        .doc   = \"Set supported authentication methods.\",\n        .group = 0\n    },\n    {\n        .name  = \"user\",\n        .key   = 'u',\n        .arg   = \"USERNAME\",\n        .flags = 0,\n        .doc   = \"Set expected username.\",\n        .group = 0\n    },\n    {\n        .name  = \"verbosity\",\n        .key   = 'v',\n        .arg   = \"VERBOSITY\",\n        .flags = 0,\n        .doc   = \"Set output verbosity [0-4].\",\n        .group = 0\n    },\n    {\n        .name  = \"with-pcap\",\n        .key   = 'w',\n        .arg   = NULL,\n        .flags = 0,\n        .doc   = \"Use PCAP.\",\n        .group = 0\n    },\n    {\n        .name  = \"without-global-config\",\n        .key   = 'g',\n        .arg   = NULL,\n        .flags = 0,\n        .doc   = \"Do not use system-wide configuration file.\",\n        .group = 0\n    },\n    {\n        .name  = \"config\",\n        .key   = 'C',\n        .arg   = \"CONFIG_FILE\",\n        .flags = 0,\n        .doc   = \"Use this server configuration file.\",\n        .group = 0\n    },\n    { .name = NULL }\n};\n\n/* Parse a single option. */\nstatic error_t parse_opt (int key, char *arg, struct argp_state *state)\n{\n    /* Get the input argument from argp_parse, which we\n     * know is a pointer to our arguments structure.\n     */\n    struct arguments_st *arguments = state->input;\n    error_t rc = 0;\n\n    if (arguments == NULL) {\n        fprintf(stderr, \"NULL pointer to arguments structure provided\\n\");\n        rc = EINVAL;\n        goto end;\n    }\n\n    switch (key) {\n    case 'c':\n        arguments->ecdsa_key = strdup(arg);\n        if (arguments->ecdsa_key == NULL) {\n            fprintf(stderr, \"Out of memory\\n\");\n            rc = ENOMEM;\n            goto end;\n        }\n        break;\n    case 'd':\n        arguments->dsa_key = strdup(arg);\n        if (arguments->dsa_key == NULL) {\n            fprintf(stderr, \"Out of memory\\n\");\n            rc = ENOMEM;\n            goto end;\n        }\n        break;\n    case 'e':\n        arguments->ed25519_key = strdup(arg);\n        if (arguments->ed25519_key == NULL) {\n            fprintf(stderr, \"Out of memory\\n\");\n            rc = ENOMEM;\n            goto end;\n        }\n        break;\n    case 'f':\n        arguments->pcap_file = strdup(arg);\n        if (arguments->pcap_file == NULL) {\n            fprintf(stderr, \"Out of memory\\n\");\n            rc = ENOMEM;\n            goto end;\n        }\n        break;\n    case 'k':\n        arguments->host_key = strdup(arg);\n        if (arguments->host_key == NULL) {\n            fprintf(stderr, \"Out of memory\\n\");\n            rc = ENOMEM;\n            goto end;\n        }\n        break;\n    case 'a':\n        arguments->auth_methods = strdup(arg);\n        if (arguments->auth_methods == NULL) {\n            fprintf(stderr, \"Out of memory\\n\");\n            rc = ENOMEM;\n            goto end;\n        }\n        break;\n    case 'p':\n        arguments->port = strdup(arg);\n        if (arguments->port == NULL) {\n            fprintf(stderr, \"Out of memory\\n\");\n            rc = ENOMEM;\n            goto end;\n        }\n        break;\n    case 'r':\n        arguments->rsa_key = strdup(arg);\n        if (arguments->rsa_key == NULL) {\n            fprintf(stderr, \"Out of memory\\n\");\n            rc = ENOMEM;\n            goto end;\n        }\n        break;\n    case 'u':\n        arguments->username = strdup(arg);\n        if (arguments->username == NULL) {\n            fprintf(stderr, \"Out of memory\\n\");\n            rc = ENOMEM;\n            goto end;\n        }\n        break;\n    case 'v':\n        arguments->verbosity = strdup(arg);\n        if (arguments->verbosity == NULL) {\n            fprintf(stderr, \"Out of memory\\n\");\n            rc = ENOMEM;\n            goto end;\n        }\n        break;\n    case 'w':\n        arguments->with_pcap = true;\n        break;\n    case 'g':\n        arguments->with_global_config = false;\n        break;\n    case 'C':\n        arguments->config_file = strdup(arg);\n        if (arguments->config_file == NULL) {\n            fprintf(stderr, \"Out of memory\\n\");\n            rc = ENOMEM;\n            goto end;\n        }\n        break;\n    case ARGP_KEY_ARG:\n        if (state->arg_num >= 1) {\n            /* Too many arguments. */\n            printf(\"Too many arguments\\n\");\n            argp_usage(state);\n        }\n        arguments->address = strdup(arg);\n        if (arguments->address == NULL) {\n            fprintf(stderr, \"Out of memory\\n\");\n            rc = ENOMEM;\n            goto end;\n        }\n        break;\n    case ARGP_KEY_END:\n        if (state->arg_num < 1) {\n            printf(\"Too few arguments\\n\");\n            /* Not enough arguments. */\n            argp_usage(state);\n        }\n        break;\n    default:\n        return ARGP_ERR_UNKNOWN;\n    }\n\nend:\n    return rc;\n}\n\n/* Our argp parser. */\nstatic struct argp argp = {options, parse_opt, args_doc, doc, NULL, NULL, NULL};\n\n#endif /* HAVE_ARGP_H */\n\nint main(UNUSED_PARAM(int argc), UNUSED_PARAM(char **argv))\n{\n    int rc;\n\n    struct arguments_st arguments = {\n        .address = NULL,\n        .with_global_config = true,\n    };\n    struct server_state_st state = {\n        .address = NULL,\n    };\n\n#ifdef HAVE_ARGP_H\n    argp_parse (&argp, argc, argv, 0, 0, &arguments);\n#endif\n\n    /* Initialize the state using default or given parameters */\n    rc = init_server_state(&state, &arguments);\n    if (rc != 0) {\n        goto free_arguments;\n    }\n\n    /* Free the arguments used to initialize the state before fork */\n    free_arguments(&arguments);\n\n    /* Run the server */\n    rc = run_server(&state);\n    if (rc != 0) {\n        goto free_state;\n    }\n\nfree_state:\n    free_server_state(&state);\nfree_arguments:\n    free_arguments(&arguments);\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/server/test_server/test_server.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2018 by Red Hat, Inc.\n *\n * Author: Anderson Toshiyuki Sasaki <ansasaki@redhat.com>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"test_server.h\"\n\n#include <libssh/priv.h>\n#include <libssh/libssh.h>\n#include <libssh/server.h>\n#include <libssh/callbacks.h>\n\n#include <signal.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <stdbool.h>\n#include <errno.h>\n\n#include <sys/wait.h>\n\nvoid free_server_state(struct server_state_st *state)\n{\n    if (state == NULL) {\n        goto end;\n    }\n\n    SAFE_FREE(state->address);\n\n    SAFE_FREE(state->ecdsa_key);\n    SAFE_FREE(state->dsa_key);\n    SAFE_FREE(state->ed25519_key);\n    SAFE_FREE(state->rsa_key);\n    SAFE_FREE(state->host_key);\n\n    SAFE_FREE(state->pcap_file);\n\n    SAFE_FREE(state->expected_username);\n    SAFE_FREE(state->expected_password);\n    SAFE_FREE(state->config_file);\n\nend:\n    return;\n}\n\n/* SIGCHLD handler for cleaning up dead children. */\nstatic void sigchld_handler(int signo) {\n    (void) signo;\n    while (waitpid(-1, NULL, WNOHANG) > 0);\n}\n\nint run_server(struct server_state_st *state)\n{\n    ssh_session session = NULL;\n    ssh_bind sshbind = NULL;\n    ssh_event event = NULL;\n\n    struct sigaction sa = {\n        .sa_flags = 0\n    };\n\n    int rc;\n\n    /* Check provided state */\n    if (state == NULL) {\n        fprintf(stderr, \"Invalid state\\n\");\n        return SSH_ERROR;\n    }\n\n    /* Set up SIGCHLD handler. */\n    sa.sa_handler = sigchld_handler;\n    sigemptyset(&sa.sa_mask);\n    sa.sa_flags = SA_RESTART | SA_NOCLDSTOP;\n\n    if (sigaction(SIGCHLD, &sa, NULL) != 0) {\n        fprintf(stderr, \"Failed to register SIGCHLD handler\\n\");\n        return SSH_ERROR;\n    }\n\n    if (state->address == NULL) {\n        fprintf(stderr, \"Missing bind address\\n\");\n        return SSH_ERROR;\n    }\n\n    if (state->address == NULL) {\n        fprintf(stderr, \"Missing bind address\\n\");\n        return SSH_ERROR;\n    }\n\n    sshbind = ssh_bind_new();\n    if (sshbind == NULL) {\n        fprintf(stderr, \"Out of memory\\n\");\n        return SSH_ERROR;\n    }\n\n    if (state->verbosity) {\n        rc = ssh_bind_options_set(sshbind,\n                                  SSH_BIND_OPTIONS_LOG_VERBOSITY,\n                                  &state->verbosity);\n        if (rc != 0) {\n            fprintf(stderr,\n                    \"Error setting verbosity level: %s\\n\",\n                    ssh_get_error(sshbind));\n            goto free_sshbind;\n        }\n    }\n\n    if (!state->parse_global_config) {\n        rc = ssh_bind_options_set(sshbind,\n                                  SSH_BIND_OPTIONS_PROCESS_CONFIG,\n                                  &(state->parse_global_config));\n        if (rc != 0) {\n            goto free_sshbind;\n        }\n    }\n\n    if (state->config_file) {\n        rc = ssh_bind_options_parse_config(sshbind, state->config_file);\n        if (rc != 0) {\n            goto free_sshbind;\n        }\n    }\n\n    rc = ssh_bind_options_set(sshbind,\n                              SSH_BIND_OPTIONS_BINDADDR,\n                              state->address);\n    if (rc != 0) {\n        fprintf(stderr,\n                \"Error setting bind address: %s\\n\",\n                ssh_get_error(sshbind));\n        goto free_sshbind;\n    }\n\n    rc = ssh_bind_options_set(sshbind,\n                              SSH_BIND_OPTIONS_BINDPORT,\n                              &(state->port));\n    if (rc != 0) {\n        fprintf(stderr,\n                \"Error setting bind port: %s\\n\",\n                ssh_get_error(sshbind));\n        goto free_sshbind;\n    }\n\n    if (state->dsa_key != NULL) {\n        rc = ssh_bind_options_set(sshbind,\n                                  SSH_BIND_OPTIONS_DSAKEY,\n                                  state->dsa_key);\n        if (rc != 0) {\n            fprintf(stderr,\n                    \"Error setting DSA key: %s\\n\",\n                    ssh_get_error(sshbind));\n            goto free_sshbind;\n        }\n    }\n\n    if (state->rsa_key != NULL) {\n        rc = ssh_bind_options_set(sshbind,\n                                  SSH_BIND_OPTIONS_RSAKEY,\n                                  state->rsa_key);\n        if (rc != 0) {\n            fprintf(stderr,\n                    \"Error setting RSA key: %s\\n\",\n                    ssh_get_error(sshbind));\n            goto free_sshbind;\n        }\n    }\n\n    if (state->ecdsa_key != NULL) {\n        rc = ssh_bind_options_set(sshbind,\n                                  SSH_BIND_OPTIONS_ECDSAKEY,\n                                  state->ecdsa_key);\n        if (rc != 0) {\n            fprintf(stderr,\n                    \"Error setting ECDSA key: %s\\n\",\n                    ssh_get_error(sshbind));\n            goto free_sshbind;\n        }\n    }\n\n    if (state->host_key) {\n        rc = ssh_bind_options_set(sshbind,\n                                  SSH_BIND_OPTIONS_HOSTKEY,\n                                  state->host_key);\n        if (rc) {\n            fprintf(stderr,\n                    \"Error setting hostkey: %s\\n\",\n                    ssh_get_error(sshbind));\n            goto free_sshbind;\n        }\n    }\n\n    rc = ssh_bind_listen(sshbind);\n    if (rc != 0) {\n        fprintf(stderr,\n                \"Error listening to socket: %s\\n\",\n                ssh_get_error(sshbind));\n        goto free_sshbind;\n    }\n\n    printf(\"Started libssh test server on port %d\\n\", state->port);\n\n    for (;;) {\n        session = ssh_new();\n        if (session == NULL) {\n            fprintf(stderr, \"Out of memory\\n\");\n            rc = SSH_ERROR;\n            goto free_sshbind;\n        }\n\n        /* Blocks until there is a new incoming connection. */\n        rc = ssh_bind_accept(sshbind, session);\n        if (rc != SSH_ERROR) {\n            pid_t pid = fork();\n\n            switch(pid) {\n            case 0:\n                /* Remove the SIGCHLD handler inherited from parent. */\n                sa.sa_handler = SIG_DFL;\n                sigaction(SIGCHLD, &sa, NULL);\n                /* Remove socket binding, which allows us to restart the\n                 * parent process, without terminating existing sessions. */\n                ssh_bind_free(sshbind);\n\n                event = ssh_event_new();\n                if (event != NULL) {\n                    /* Blocks until the SSH session ends by either\n                     * child process exiting, or client disconnecting. */\n                    state->handle_session(event, session, state);\n                    ssh_event_free(event);\n                } else {\n                    fprintf(stderr, \"Could not create polling context\\n\");\n                }\n                ssh_disconnect(session);\n                ssh_free(session);\n\n                free_server_state(state);\n\n                exit(0);\n            case -1:\n                fprintf(stderr, \"Failed to fork\\n\");\n            }\n        } else {\n            fprintf(stderr,\n                    \"Error accepting a connection: %s\\n\",\n                    ssh_get_error(sshbind));\n        }\n\n        /* Since the session has been passed to a child fork, do some cleaning\n         * up at the parent process. */\n        ssh_disconnect(session);\n        ssh_free(session);\n    }\n\n    rc = 0;\n\nfree_sshbind:\n    ssh_bind_free(sshbind);\n    return rc;\n}\n\npid_t fork_run_server(struct server_state_st *state)\n{\n    pid_t pid;\n    int rc;\n\n    char err_str[1024] = {0};\n\n    struct sigaction sa;\n\n    /* Check provided state */\n    if (state == NULL) {\n        fprintf(stderr, \"Invalid state\\n\");\n        return -1;\n    }\n\n    /* Set up SIGCHLD handler. */\n    sa.sa_handler = sigchld_handler;\n    sigemptyset(&sa.sa_mask);\n    sa.sa_flags = SA_RESTART | SA_NOCLDSTOP;\n\n    if (sigaction(SIGCHLD, &sa, NULL) != 0) {\n        strerror_r(errno, err_str, 1024);\n        fprintf(stderr, \"Failed to register SIGCHLD handler: %s\\n\",\n                err_str);\n        return -1;\n    }\n\n    pid = fork();\n    switch(pid) {\n    case 0:\n        /* Remove the SIGCHLD handler inherited from parent. */\n        sa.sa_handler = SIG_DFL;\n        sigaction(SIGCHLD, &sa, NULL);\n\n        /* The child process starts a server which will listen for connections */\n        rc = run_server(state);\n        if (rc != 0) {\n            exit(rc);\n        }\n\n        exit(0);\n    case -1:\n        strerror_r(errno, err_str, 1024);\n        fprintf(stderr, \"Failed to fork: %s\\n\",\n                err_str);\n        return -1;\n    default:\n        /* Return the child pid  */\n        return pid;\n    }\n}\n"
  },
  {
    "path": "src/libssh/tests/server/test_server/test_server.h",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2018 by Red Hat, Inc.\n *\n * Author: Anderson Toshiyuki Sasaki <ansasaki@redhat.com>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <stdbool.h>\n#include <fcntl.h>\n\n#include <libssh/libssh.h>\n#include <libssh/server.h>\n#include <libssh/callbacks.h>\n\nstruct server_state_st {\n    /* Arguments */\n    char *address;\n    int  port;\n\n    char *ecdsa_key;\n    char *dsa_key;\n    char *ed25519_key;\n    char *rsa_key;\n    char *host_key;\n\n    int  verbosity;\n    int  auth_methods;\n    bool with_pcap;\n\n    char *pcap_file;\n\n    char *expected_username;\n    char *expected_password;\n\n    char *config_file;\n    bool parse_global_config;\n\n    /* State */\n    int  max_tries;\n    int  error;\n\n    struct ssh_server_callbacks_struct *server_cb;\n    struct ssh_channel_callbacks_struct *channel_cb;\n\n    /* Callback to handle the session, should block until disconnected */\n    void (*handle_session)(ssh_event event,\n                           ssh_session session,\n                           struct server_state_st *state);\n};\n\n/*TODO: Add documentation */\nvoid free_server_state(struct server_state_st *state);\n\n/*TODO: Add documentation */\nint run_server(struct server_state_st *state);\n\n/*TODO: Add documentation */\npid_t fork_run_server(struct server_state_st *state);\n"
  },
  {
    "path": "src/libssh/tests/server/torture_server.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2018 by Red Hat, Inc.\n *\n * Author: Anderson Toshiyuki Sasaki <ansasaki@redhat.com>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <errno.h>\n#include <pwd.h>\n\n#include \"torture.h\"\n#include \"torture_key.h\"\n#include \"libssh/libssh.h\"\n#include \"libssh/priv.h\"\n#include \"libssh/session.h\"\n\n#include \"test_server.h\"\n#include \"default_cb.h\"\n\n#define TORTURE_KNOWN_HOSTS_FILE \"libssh_torture_knownhosts\"\n\nconst char template[] = \"temp_dir_XXXXXX\";\n\nstruct test_server_st {\n    struct torture_state *state;\n    struct server_state_st *ss;\n    char *cwd;\n    char *temp_dir;\n};\n\nstatic int setup_default_server(void **state)\n{\n    struct torture_state *s;\n    struct server_state_st *ss;\n    struct test_server_st *tss;\n#ifdef HAVE_DSA\n    char dsa_hostkey[1024];\n#endif /* HAVE_DSA */\n\n    char ed25519_hostkey[1024] = {0};\n    char rsa_hostkey[1024];\n    char ecdsa_hostkey[1024];\n    //char trusted_ca_pubkey[1024];\n\n    char sshd_path[1024];\n    struct stat sb;\n\n    const char *sftp_server_locations[] = {\n        \"/usr/lib/ssh/sftp-server\",\n        \"/usr/libexec/sftp-server\",\n        \"/usr/libexec/openssh/sftp-server\",\n        \"/usr/lib/openssh/sftp-server\",     /* Debian */\n    };\n\n    size_t sftp_sl_size = ARRAY_SIZE(sftp_server_locations);\n    const char *sftp_server;\n\n    size_t i;\n    int rc;\n\n    char pid_str[1024];\n\n    pid_t pid;\n\n    assert_non_null(state);\n\n    tss = (struct test_server_st*)calloc(1, sizeof(struct test_server_st));\n    assert_non_null(tss);\n\n    torture_setup_socket_dir((void **)&s);\n    assert_non_null(s->socket_dir);\n\n    /* Set the default interface for the server */\n    setenv(\"SOCKET_WRAPPER_DEFAULT_IFACE\", \"10\", 1);\n    setenv(\"PAM_WRAPPER\", \"1\", 1);\n\n    snprintf(sshd_path,\n             sizeof(sshd_path),\n             \"%s/sshd\",\n             s->socket_dir);\n\n    rc = mkdir(sshd_path, 0755);\n    assert_return_code(rc, errno);\n\n    snprintf(ed25519_hostkey,\n             sizeof(ed25519_hostkey),\n             \"%s/sshd/ssh_host_ed25519_key\",\n             s->socket_dir);\n    torture_write_file(ed25519_hostkey,\n                       torture_get_openssh_testkey(SSH_KEYTYPE_ED25519, 0));\n\n#ifdef HAVE_DSA\n    snprintf(dsa_hostkey,\n             sizeof(dsa_hostkey),\n             \"%s/sshd/ssh_host_dsa_key\",\n             s->socket_dir);\n    torture_write_file(dsa_hostkey, torture_get_testkey(SSH_KEYTYPE_DSS, 0));\n#endif /* HAVE_DSA */\n\n    snprintf(rsa_hostkey,\n             sizeof(rsa_hostkey),\n             \"%s/sshd/ssh_host_rsa_key\",\n             s->socket_dir);\n    torture_write_file(rsa_hostkey, torture_get_testkey(SSH_KEYTYPE_RSA, 0));\n\n    snprintf(ecdsa_hostkey,\n             sizeof(ecdsa_hostkey),\n             \"%s/sshd/ssh_host_ecdsa_key\",\n             s->socket_dir);\n    torture_write_file(ecdsa_hostkey,\n                       torture_get_testkey(SSH_KEYTYPE_ECDSA_P521, 0));\n\n    sftp_server = getenv(\"TORTURE_SFTP_SERVER\");\n    if (sftp_server == NULL) {\n        for (i = 0; i < sftp_sl_size; i++) {\n            sftp_server = sftp_server_locations[i];\n            rc = lstat(sftp_server, &sb);\n            if (rc == 0) {\n                break;\n            }\n        }\n    }\n    assert_non_null(sftp_server);\n\n    /* Create default server state */\n    ss = (struct server_state_st *)calloc(1, sizeof(struct server_state_st));\n    assert_non_null(ss);\n\n    ss->address = strdup(\"127.0.0.10\");\n    assert_non_null(ss->address);\n\n    ss->port = 22;\n\n    ss->ecdsa_key = strdup(ecdsa_hostkey);\n    assert_non_null(ss->ecdsa_key);\n\n#ifdef HAVE_DSA\n    ss->dsa_key = strdup(dsa_hostkey);\n    assert_non_null(ss->dsa_key);\n#endif /* HAVE_DSA */\n\n    ss->ed25519_key = strdup(ed25519_hostkey);\n    assert_non_null(ed25519_hostkey);\n\n    ss->rsa_key = strdup(rsa_hostkey);\n    assert_non_null(ss->rsa_key);\n\n    ss->host_key = NULL;\n\n    /* Use default username and password (set in default_handle_session_cb) */\n    ss->expected_username = NULL;\n    ss->expected_password = NULL;\n\n    ss->verbosity = torture_libssh_verbosity();\n\n    ss->auth_methods = SSH_AUTH_METHOD_PASSWORD | SSH_AUTH_METHOD_PUBLICKEY;\n\n#ifdef WITH_PCAP\n    ss->with_pcap = 1;\n    ss->pcap_file = strdup(s->pcap_file);\n    assert_non_null(ss->pcap_file);\n#endif\n\n    /* TODO make configurable */\n    ss->max_tries = 3;\n    ss->error = 0;\n\n    /* Use the default session handling function */\n    ss->handle_session = default_handle_session_cb;\n    assert_non_null(ss->handle_session);\n\n    /* Do not use global configuration */\n    ss->parse_global_config = false;\n\n    /* Start the server using the default values */\n    pid = fork_run_server(ss);\n    if (pid < 0) {\n        fail();\n    }\n\n    snprintf(pid_str, sizeof(pid_str), \"%d\", pid);\n\n    torture_write_file(s->srv_pidfile, (const char *)pid_str);\n\n    setenv(\"SOCKET_WRAPPER_DEFAULT_IFACE\", \"21\", 1);\n    unsetenv(\"PAM_WRAPPER\");\n\n    /* Wait until the sshd is ready to accept connections */\n    //rc = torture_wait_for_daemon(5);\n    //assert_int_equal(rc, 0);\n\n    /* TODO properly wait for the server (use ping approach) */\n    /* Wait 200ms */\n    usleep(200 * 1000);\n\n    tss->state = s;\n    tss->ss = ss;\n\n    *state = tss;\n\n    return 0;\n}\n\nstatic int teardown_default_server(void **state)\n{\n    struct torture_state *s;\n    struct server_state_st *ss;\n    struct test_server_st *tss;\n\n    tss = *state;\n    assert_non_null(tss);\n\n    s = tss->state;\n    assert_non_null(s);\n\n    ss = tss->ss;\n    assert_non_null(ss);\n\n    /* This function can be reused */\n    torture_teardown_sshd_server((void **)&s);\n\n    free_server_state(tss->ss);\n    SAFE_FREE(tss->ss);\n    SAFE_FREE(tss);\n\n    return 0;\n}\n\nstatic int session_setup(void **state)\n{\n    struct test_server_st *tss = *state;\n    struct torture_state *s;\n    int verbosity = torture_libssh_verbosity();\n    struct passwd *pwd;\n    char *cwd = NULL;\n    char *tmp_dir = NULL;\n    bool b = false;\n    int rc;\n\n    assert_non_null(tss);\n\n    /* Make sure we do not test the agent */\n    unsetenv(\"SSH_AUTH_SOCK\");\n\n    cwd = torture_get_current_working_dir();\n    assert_non_null(cwd);\n\n    tmp_dir = torture_make_temp_dir(template);\n    assert_non_null(tmp_dir);\n\n    tss->cwd = cwd;\n    tss->temp_dir = tmp_dir;\n\n    s = tss->state;\n    assert_non_null(s);\n\n    pwd = getpwnam(\"bob\");\n    assert_non_null(pwd);\n\n    rc = setuid(pwd->pw_uid);\n    assert_return_code(rc, errno);\n\n    s->ssh.session = ssh_new();\n    assert_non_null(s->ssh.session);\n\n    rc = ssh_options_set(s->ssh.session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity);\n    assert_ssh_return_code(s->ssh.session, rc);\n    rc = ssh_options_set(s->ssh.session, SSH_OPTIONS_HOST, TORTURE_SSH_SERVER);\n    assert_ssh_return_code(s->ssh.session, rc);\n    /* Make sure no other configuration options from system will get used */\n    rc = ssh_options_set(s->ssh.session, SSH_OPTIONS_PROCESS_CONFIG, &b);\n    assert_ssh_return_code(s->ssh.session, rc);\n\n    return 0;\n}\n\nstatic int session_teardown(void **state)\n{\n    struct test_server_st *tss = *state;\n    struct torture_state *s;\n    int rc = 0;\n\n    assert_non_null(tss);\n\n    s = tss->state;\n    assert_non_null(s);\n\n    ssh_disconnect(s->ssh.session);\n    ssh_free(s->ssh.session);\n\n    rc = torture_change_dir(tss->cwd);\n    assert_int_equal(rc, 0);\n\n    rc = torture_rmdirs(tss->temp_dir);\n    assert_int_equal(rc, 0);\n\n    SAFE_FREE(tss->temp_dir);\n    SAFE_FREE(tss->cwd);\n\n    return 0;\n}\n\nstatic void torture_server_auth_none(void **state)\n{\n    struct test_server_st *tss = *state;\n    struct torture_state *s = NULL;\n    ssh_session session = NULL;\n    int rc;\n\n    assert_non_null(tss);\n\n    s = tss->state;\n    assert_non_null(s);\n\n    session = s->ssh.session;\n    assert_non_null(session);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_USER, TORTURE_SSH_USER_BOB);\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_connect(session);\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_userauth_none(session, NULL);\n    assert_int_equal(rc, SSH_AUTH_DENIED);\n\n    /* This request should return a SSH_REQUEST_DENIED error */\n    if (rc == SSH_ERROR) {\n        assert_int_equal(ssh_get_error_code(session), SSH_REQUEST_DENIED);\n    }\n}\n\nstatic void torture_server_auth_password(void **state)\n{\n    struct test_server_st *tss = *state;\n    struct torture_state *s;\n    ssh_session session;\n    int rc;\n\n    assert_non_null(tss);\n\n    s = tss->state;\n    assert_non_null(s);\n\n    session = s->ssh.session;\n    assert_non_null(session);\n\n    /* TODO: implement proper pam authentication in callback */\n    /* Using the default user for the server */\n    rc = ssh_options_set(session, SSH_OPTIONS_USER, SSHD_DEFAULT_USER);\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_connect(session);\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_userauth_none(session, NULL);\n    /* This request should return a SSH_REQUEST_DENIED error */\n    if (rc == SSH_AUTH_ERROR) {\n        assert_int_equal(ssh_get_error_code(session), SSH_REQUEST_DENIED);\n    }\n    rc = ssh_userauth_list(session, NULL);\n    assert_true(rc & SSH_AUTH_METHOD_PASSWORD);\n\n    /* TODO: implement proper pam authentication in callback */\n    /* Using the default password for the server */\n    rc = ssh_userauth_password(session, NULL, SSHD_DEFAULT_PASSWORD);\n    assert_int_equal(rc, SSH_AUTH_SUCCESS);\n}\n\nstatic void torture_server_auth_pubkey(void **state)\n{\n    struct test_server_st *tss = *state;\n    struct torture_state *s;\n    ssh_session session;\n    int rc;\n\n    assert_non_null(tss);\n\n    s = tss->state;\n    assert_non_null(s);\n\n    session = s->ssh.session;\n    assert_non_null(session);\n\n    /* Authenticate as alice with bob's pubkey */\n    rc = ssh_options_set(session, SSH_OPTIONS_USER, TORTURE_SSH_USER_ALICE);\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_connect(session);\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_userauth_none(session,NULL);\n    /* This request should return a SSH_REQUEST_DENIED error */\n    if (rc == SSH_ERROR) {\n        assert_int_equal(ssh_get_error_code(session), SSH_REQUEST_DENIED);\n    }\n    rc = ssh_userauth_list(session, NULL);\n    assert_true(rc & SSH_AUTH_METHOD_PUBLICKEY);\n\n    rc = ssh_userauth_publickey_auto(session, NULL, NULL);\n    assert_int_equal(rc, SSH_AUTH_SUCCESS);\n}\n\nstatic void torture_server_hostkey_mismatch(void **state)\n{\n    struct test_server_st *tss = *state;\n    struct torture_state *s = NULL;\n    ssh_session session = NULL;\n    char known_hosts_file[1024] = {0};\n    FILE *file = NULL;\n    enum ssh_known_hosts_e found;\n    int rc;\n\n    assert_non_null(tss);\n\n    s = tss->state;\n    assert_non_null(s);\n\n    session = s->ssh.session;\n    assert_non_null(session);\n\n    /* Store the testkey in the knownhosts file */\n    snprintf(known_hosts_file,\n             sizeof(known_hosts_file),\n             \"%s/%s\",\n             s->socket_dir,\n             TORTURE_KNOWN_HOSTS_FILE);\n\n    file = fopen(known_hosts_file, \"w\");\n    assert_non_null(file);\n    fprintf(file,\n            \"127.0.0.10 %s\\n\",\n            torture_get_testkey_pub(SSH_KEYTYPE_RSA));\n    fclose(file);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_KNOWNHOSTS, known_hosts_file);\n    assert_ssh_return_code(session, rc);\n    /* Using the default user for the server */\n    rc = ssh_options_set(session, SSH_OPTIONS_USER, SSHD_DEFAULT_USER);\n    assert_ssh_return_code(session, rc);\n\n    /* Configure the client to offer only rsa-sha2-256 hostkey algorithm */\n    rc = ssh_options_set(session, SSH_OPTIONS_HOSTKEYS, \"rsa-sha2-256\");\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n\n    /* Make sure we can verify the signature */\n    found = ssh_session_is_known_server(session);\n    assert_int_equal(found, SSH_KNOWN_HOSTS_OK);\n}\n\nstatic void torture_server_unknown_global_request(void **state)\n{\n    struct test_server_st *tss = *state;\n    struct torture_state *s = NULL;\n    ssh_session session = NULL;\n    ssh_channel channel;\n    int rc;\n\n    assert_non_null(tss);\n\n    s = tss->state;\n    assert_non_null(s);\n\n    session = s->ssh.session;\n    assert_non_null(session);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_USER, SSHD_DEFAULT_USER);\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_connect(session);\n    assert_int_equal(rc, SSH_OK);\n\n    /* Using the default password for the server */\n    rc = ssh_userauth_password(session, NULL, SSHD_DEFAULT_PASSWORD);\n    assert_int_equal(rc, SSH_AUTH_SUCCESS);\n\n    /* Request asking for reply */\n    rc = ssh_global_request(session, \"unknown-request-00@test.com\", NULL, 1);\n    assert_ssh_return_code_equal(session, rc, SSH_ERROR);\n\n    /* Request and don't ask for reply */\n    rc = ssh_global_request(session, \"another-bad-req-00@test.com\", NULL, 0);\n    assert_ssh_return_code(session, rc);\n\n    /* Open channel to make sure the session is still working */\n    channel = ssh_channel_new(session);\n    assert_non_null(channel);\n\n    rc = ssh_channel_open_session(channel);\n    assert_ssh_return_code(session, rc);\n\n    ssh_channel_close(channel);\n}\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_server_auth_none,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_server_auth_password,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_server_auth_pubkey,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_server_hostkey_mismatch,\n                                        session_setup,\n                                        session_teardown),\n        cmocka_unit_test_setup_teardown(torture_server_unknown_global_request,\n                                        session_setup,\n                                        session_teardown),\n    };\n\n    ssh_init();\n\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests,\n            setup_default_server,\n            teardown_default_server);\n\n    ssh_finalize();\n\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/server/torture_server_auth_kbdint.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2019 by Red Hat, Inc.\n *\n * Author: Anderson Toshiyuki Sasaki <ansasaki@redhat.com>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <errno.h>\n#include <pwd.h>\n\n#include \"torture.h\"\n#include \"torture_key.h\"\n#include \"libssh/libssh.h\"\n#include \"libssh/priv.h\"\n#include \"libssh/session.h\"\n\n#include <signal.h>\n#include <sys/wait.h>\n#include <sys/ioctl.h>\n\n#include \"test_server.h\"\n#include \"default_cb.h\"\n\n#define TORTURE_KNOWN_HOSTS_FILE \"libssh_torture_knownhosts\"\n\nenum {\n    SUCCESS,\n    MORE,\n    FAILED\n};\n\nstruct test_server_st {\n    struct torture_state *state;\n    struct server_state_st *ss;\n};\n\n#ifdef WITH_PCAP\nstatic void set_pcap(struct session_data_st *sdata,\n                     ssh_session session,\n                     char *pcap_file)\n{\n    int rc = 0;\n\n    if (sdata == NULL) {\n        return;\n    }\n\n    if (pcap_file == NULL) {\n        return;\n    }\n\n    sdata->pcap = ssh_pcap_file_new();\n    if (sdata->pcap == NULL) {\n        return;\n    }\n\n    rc = ssh_pcap_file_open(sdata->pcap, pcap_file);\n    if (rc == SSH_ERROR) {\n        fprintf(stderr, \"Error opening pcap file\\n\");\n        ssh_pcap_file_free(sdata->pcap);\n        sdata->pcap = NULL;\n        return;\n    }\n    ssh_set_pcap_file(session, sdata->pcap);\n}\n\nstatic void cleanup_pcap(struct session_data_st *sdata)\n{\n    if (sdata == NULL) {\n        return;\n    }\n\n    if (sdata->pcap == NULL) {\n        return;\n    }\n\n    /* Do not free the pcap data context here since its ownership was\n     * transfered to the session object, which will take care of its cleanup.\n     * Morover it is still in use so we can very simply crash by freeing\n     * it here.\n     */\n    sdata->pcap = NULL;\n}\n#endif\n\nstatic int process_stdout(socket_t fd, int revents, void *userdata)\n{\n    char buf[BUF_SIZE];\n    int n = -1;\n    ssh_channel channel = (ssh_channel) userdata;\n\n    if (channel != NULL && (revents & POLLIN) != 0) {\n        n = read(fd, buf, BUF_SIZE);\n        if (n > 0) {\n            ssh_channel_write(channel, buf, n);\n        }\n    }\n\n    return n;\n}\n\nstatic int process_stderr(socket_t fd, int revents, void *userdata)\n{\n    char buf[BUF_SIZE];\n    int n = -1;\n    ssh_channel channel = (ssh_channel) userdata;\n\n    if (channel != NULL && (revents & POLLIN) != 0) {\n        n = read(fd, buf, BUF_SIZE);\n        if (n > 0) {\n            ssh_channel_write_stderr(channel, buf, n);\n        }\n    }\n\n    return n;\n}\n\nstatic int authenticate_kbdint(ssh_session session,\n                               ssh_message message,\n                               void *userdata)\n{\n    int rc = 0;\n    int count;\n    int *step = NULL;\n    size_t expected_len;\n\n    const char instruction[] = \"Type the requested data\";\n    const char name[] = \"Keyboard-Interactive Authentication\\n\";\n    char initial_echo[] = {1, 0};\n    char retype_echo[] = {0};\n    const char *initial_prompt[2];\n    const char *retype_prompt[1];\n    int cmp;\n\n    const char *answer;\n\n    struct session_data_st *sdata = (struct session_data_st *)userdata;\n\n    initial_prompt[0] = \"username: \";\n    initial_prompt[1] = \"password: \";\n\n    /* Prompt for aditional prompts */\n    retype_prompt[0] = \"retype password: \";\n\n    if ((session == NULL) || (message == NULL) || (sdata == NULL)) {\n        fprintf(stderr, \"Null argument provided\\n\");\n        goto failed;\n    }\n\n    if (sdata->extra_data == NULL) {\n        goto failed;\n    }\n\n    step = (int *)sdata->extra_data;\n\n    switch (*step) {\n    case 0:\n        ssh_message_auth_interactive_request(message, name, instruction, 2,\n                initial_prompt, initial_echo);\n        rc = MORE;\n        goto end;\n    case 1:\n        count = ssh_userauth_kbdint_getnanswers(session);\n        if (count != 2) {\n            goto failed;\n        }\n\n        if ((sdata->username == NULL) || (sdata->password == NULL)) {\n            goto failed;\n        }\n\n        /* Get and compare username */\n        expected_len = strlen(sdata->username);\n        if (expected_len <= 0) {\n            goto failed;\n        }\n\n        answer = ssh_userauth_kbdint_getanswer(session, 0);\n        if (answer == NULL) {\n            goto failed;\n        }\n\n        cmp = strncmp(answer, sdata->username, expected_len);\n        if (cmp != 0) {\n            goto failed;\n        }\n\n        /* Get and compare password */\n        expected_len = strlen(sdata->password);\n        if (expected_len <= 0) {\n            goto failed;\n        }\n\n        answer = ssh_userauth_kbdint_getanswer(session, 1);\n        if (answer == NULL) {\n            goto failed;\n        }\n\n        cmp = strncmp(answer, sdata->password, expected_len);\n        if (cmp != 0) {\n            goto failed;\n        }\n\n        /* Username and password matched. Ask for a retype. */\n        ssh_message_auth_interactive_request(message,\n                                             name,\n                                             instruction,\n                                             1,\n                                             retype_prompt,\n                                             retype_echo);\n\n        rc = MORE;\n        goto end;\n    case 2:\n        /* Get and compare password */\n        expected_len = strlen(sdata->password);\n        if (expected_len <= 0) {\n            goto failed;\n        }\n\n        answer = ssh_userauth_kbdint_getanswer(session, 0);\n        if (answer == NULL) {\n            goto failed;\n        }\n\n        cmp = strncmp(answer, sdata->password, expected_len);\n        if (cmp != 0) {\n            goto failed;\n        }\n\n        /* Password was correct, authenticated */\n        rc = SUCCESS;\n        goto end;\n    default:\n        goto failed;\n    }\n\nfailed:\n    if (step != NULL) {\n        *step = 0;\n    }\n    return FAILED;\n\nend:\n    if (step != NULL) {\n        (*step)++;\n    }\n    return rc;\n}\n\nstatic int authenticate_callback(ssh_session session,\n                                 ssh_message message,\n                                 void *userdata)\n{\n    struct session_data_st *sdata = (struct session_data_st *)userdata;\n    int rc;\n\n    if (sdata == NULL) {\n        fprintf(stderr, \"Null userdata\\n\");\n        goto denied;\n    }\n\n    if (sdata->extra_data == NULL) {\n        sdata->extra_data = (void *)calloc(1, sizeof(int));\n    }\n\n    switch (ssh_message_type(message)) {\n    case SSH_REQUEST_AUTH:\n        switch (ssh_message_subtype(message)) {\n        case SSH_AUTH_METHOD_INTERACTIVE:\n            rc = authenticate_kbdint(session, message, (void *)sdata);\n            if (rc == SUCCESS) {\n                goto accept;\n            }\n            else if (rc == MORE) {\n                goto more;\n            }\n            ssh_message_auth_set_methods(message, SSH_AUTH_METHOD_INTERACTIVE);\n            goto denied;\n        default:\n            ssh_message_auth_set_methods(message, SSH_AUTH_METHOD_INTERACTIVE);\n            goto denied;\n        }\n    default:\n        ssh_message_auth_set_methods(message, SSH_AUTH_METHOD_INTERACTIVE);\n        goto denied;\n    }\n\n    ssh_message_free(message);\n\naccept:\n    if (sdata) {\n        if (sdata->extra_data) {\n            free(sdata->extra_data);\n            sdata->extra_data = NULL;\n        }\n    }\n    ssh_message_auth_reply_success (message, 0);\nmore:\n    return 0;\ndenied:\n    if (sdata) {\n        if (sdata->extra_data) {\n            free(sdata->extra_data);\n            sdata->extra_data = NULL;\n        }\n    }\n    return 1;\n}\n\nstatic void handle_kbdint_session_cb(ssh_event event,\n                                     ssh_session session,\n                                     struct server_state_st *state)\n{\n    int n;\n    int rc = 0;\n\n    /* Structure for storing the pty size. */\n    struct winsize wsize = {\n        .ws_row = 0,\n        .ws_col = 0,\n        .ws_xpixel = 0,\n        .ws_ypixel = 0\n    };\n\n    /* Our struct holding information about the channel. */\n    struct channel_data_st cdata = {\n        .pid = 0,\n        .pty_master = -1,\n        .pty_slave = -1,\n        .child_stdin = -1,\n        .child_stdout = -1,\n        .child_stderr = -1,\n        .event = NULL,\n        .winsize = &wsize\n    };\n\n    /* Our struct holding information about the session. */\n    struct session_data_st sdata = {\n        .channel = NULL,\n        .auth_attempts = 0,\n        .authenticated = 0,\n        .username = TORTURE_SSH_USER_BOB,\n        .password = TORTURE_SSH_USER_BOB_PASSWORD\n    };\n\n    struct ssh_channel_callbacks_struct *channel_cb = NULL;\n    struct ssh_server_callbacks_struct *server_cb = NULL;\n\n    if (state == NULL) {\n        fprintf(stderr, \"NULL server state provided\\n\");\n        goto end;\n    }\n\n    server_cb = get_default_server_cb();\n    if (server_cb == NULL) {\n        goto end;\n    }\n\n    server_cb->userdata = &sdata;\n\n    /* This is a macro, it does not return a value */\n    ssh_callbacks_init(server_cb);\n\n    rc = ssh_set_server_callbacks(session, server_cb);\n    if (rc) {\n        goto end;\n    }\n\n#ifdef WITH_PCAP\n    set_pcap(&sdata, session, state->pcap_file);\n#endif\n\n    rc = ssh_handle_key_exchange(session);\n    if (rc != SSH_OK) {\n        fprintf(stderr, \"%s\\n\", ssh_get_error(session));\n        goto end;\n    }\n\n    /* Set the supported authentication methods */\n    ssh_set_auth_methods(session, SSH_AUTH_METHOD_INTERACTIVE);\n\n    ssh_set_message_callback(session, authenticate_callback, &sdata);\n\n    rc = ssh_event_add_session(event, session);\n    if (rc != 0) {\n        fprintf(stderr, \"Error adding session to event\\n\");\n        goto end;\n    }\n\n    n = 0;\n    while (sdata.authenticated == 0 || sdata.channel == NULL) {\n        /* If the user has used up all attempts, or if he hasn't been able to\n         * authenticate in 10 seconds (n * 100ms), disconnect. */\n        if (sdata.auth_attempts >= state->max_tries || n >= 100) {\n            goto end;\n        }\n\n        if (ssh_event_dopoll(event, 100) == SSH_ERROR) {\n            fprintf(stderr, \"do_poll error: %s\\n\", ssh_get_error(session));\n            goto end;\n        }\n        n++;\n    }\n\n    channel_cb = get_default_channel_cb();\n    if (channel_cb == NULL) {\n        goto end;\n    }\n\n    channel_cb->userdata = &cdata;\n\n    ssh_callbacks_init(channel_cb);\n    rc = ssh_set_channel_callbacks(sdata.channel, channel_cb);\n    if (rc != 0) {\n        goto end;\n    }\n\n    do {\n        /* Poll the main event which takes care of the session, the channel and\n         * even our child process's stdout/stderr (once it's started). */\n        rc = ssh_event_dopoll(event, -1);\n        if (rc == SSH_ERROR) {\n          ssh_channel_close(sdata.channel);\n        }\n\n        /* If child process's stdout/stderr has been registered with the event,\n         * or the child process hasn't started yet, continue. */\n        if (cdata.event != NULL || cdata.pid == 0) {\n            continue;\n        }\n        /* Executed only once, once the child process starts. */\n        cdata.event = event;\n        /* If stdout valid, add stdout to be monitored by the poll event. */\n        if (cdata.child_stdout != -1) {\n            if (ssh_event_add_fd(event, cdata.child_stdout, POLLIN, process_stdout,\n                                 sdata.channel) != SSH_OK) {\n                fprintf(stderr, \"Failed to register stdout to poll context\\n\");\n                ssh_channel_close(sdata.channel);\n            }\n        }\n\n        /* If stderr valid, add stderr to be monitored by the poll event. */\n        if (cdata.child_stderr != -1){\n            if (ssh_event_add_fd(event, cdata.child_stderr, POLLIN, process_stderr,\n                                 sdata.channel) != SSH_OK) {\n                fprintf(stderr, \"Failed to register stderr to poll context\\n\");\n                ssh_channel_close(sdata.channel);\n            }\n        }\n    } while(ssh_channel_is_open(sdata.channel) &&\n            (cdata.pid == 0 || waitpid(cdata.pid, &rc, WNOHANG) == 0));\n\n    close(cdata.pty_master);\n    close(cdata.child_stdin);\n    close(cdata.child_stdout);\n    close(cdata.child_stderr);\n\n    /* Remove the descriptors from the polling context, since they are now\n     * closed, they will always trigger during the poll calls. */\n    ssh_event_remove_fd(event, cdata.child_stdout);\n    ssh_event_remove_fd(event, cdata.child_stderr);\n\n    /* If the child process exited. */\n    if (kill(cdata.pid, 0) < 0 && WIFEXITED(rc)) {\n        rc = WEXITSTATUS(rc);\n        ssh_channel_request_send_exit_status(sdata.channel, rc);\n    /* If client terminated the channel or the process did not exit nicely,\n     * but only if something has been forked. */\n    } else if (cdata.pid > 0) {\n        kill(cdata.pid, SIGKILL);\n    }\n\n    ssh_channel_send_eof(sdata.channel);\n    ssh_channel_close(sdata.channel);\n\n    /* Wait up to 5 seconds for the client to terminate the session. */\n    for (n = 0; n < 50 && (ssh_get_status(session) & SESSION_END) == 0; n++) {\n        ssh_event_dopoll(event, 100);\n    }\n\nend:\n#ifdef WITH_PCAP\n    cleanup_pcap(&sdata);\n#endif\n    if (channel_cb != NULL) {\n        free(channel_cb);\n    }\n    if (server_cb != NULL) {\n        free(server_cb);\n    }\n    return;\n}\n\nstatic int setup_kbdint_server(void **state)\n{\n    struct torture_state *s;\n    struct server_state_st *ss;\n    struct test_server_st *tss;\n\n    char rsa_hostkey[1024] = {0};\n\n    char sshd_path[1024];\n\n    int rc;\n\n    char pid_str[1024];\n\n    pid_t pid;\n\n    assert_non_null(state);\n\n    tss = (struct test_server_st*)calloc(1, sizeof(struct test_server_st));\n    assert_non_null(tss);\n\n    torture_setup_socket_dir((void **)&s);\n    assert_non_null(s->socket_dir);\n\n    /* Set the default interface for the server */\n    setenv(\"SOCKET_WRAPPER_DEFAULT_IFACE\", \"10\", 1);\n    setenv(\"PAM_WRAPPER\", \"1\", 1);\n\n    snprintf(sshd_path,\n             sizeof(sshd_path),\n             \"%s/sshd\",\n             s->socket_dir);\n\n    rc = mkdir(sshd_path, 0755);\n    assert_return_code(rc, errno);\n\n    snprintf(rsa_hostkey,\n             sizeof(rsa_hostkey),\n             \"%s/sshd/ssh_host_rsa_key\",\n             s->socket_dir);\n    torture_write_file(rsa_hostkey,\n                       torture_get_openssh_testkey(SSH_KEYTYPE_RSA, 0));\n\n    /* Create the server state */\n    ss = (struct server_state_st *)calloc(1, sizeof(struct server_state_st));\n    assert_non_null(ss);\n\n    ss->address = strdup(\"127.0.0.10\");\n    assert_non_null(ss->address);\n\n    ss->port = 22;\n\n    ss->host_key = strdup(rsa_hostkey);\n    assert_non_null(rsa_hostkey);\n\n    ss->verbosity = torture_libssh_verbosity();\n\n#ifdef WITH_PCAP\n    ss->with_pcap = 1;\n    ss->pcap_file = strdup(s->pcap_file);\n    assert_non_null(ss->pcap_file);\n#endif\n\n    ss->max_tries = 3;\n    ss->error = 0;\n\n    /* Set the session handling function */\n    ss->handle_session = handle_kbdint_session_cb;\n    assert_non_null(ss->handle_session);\n\n    /* Start the server */\n    pid = fork_run_server(ss);\n    if (pid < 0) {\n        fail();\n    }\n\n    snprintf(pid_str, sizeof(pid_str), \"%d\", pid);\n\n    torture_write_file(s->srv_pidfile, (const char *)pid_str);\n\n    setenv(\"SOCKET_WRAPPER_DEFAULT_IFACE\", \"21\", 1);\n    unsetenv(\"PAM_WRAPPER\");\n\n    /* Wait 200ms */\n    usleep(200 * 1000);\n\n    tss->state = s;\n    tss->ss = ss;\n\n    *state = tss;\n\n    return 0;\n}\n\nstatic int teardown_kbdint_server(void **state)\n{\n    struct torture_state *s;\n    struct server_state_st *ss;\n    struct test_server_st *tss;\n\n    tss = *state;\n    assert_non_null(tss);\n\n    s = tss->state;\n    assert_non_null(s);\n\n    ss = tss->ss;\n    assert_non_null(ss);\n\n    /* This function can be reused */\n    torture_teardown_sshd_server((void **)&s);\n\n    free_server_state(tss->ss);\n    SAFE_FREE(tss->ss);\n    SAFE_FREE(tss);\n\n    return 0;\n}\n\nstatic int session_setup(void **state)\n{\n    struct test_server_st *tss = *state;\n    struct torture_state *s;\n    int verbosity = torture_libssh_verbosity();\n    struct passwd *pwd;\n    bool b = false;\n    int rc;\n\n    assert_non_null(tss);\n\n    s = tss->state;\n    assert_non_null(s);\n\n    pwd = getpwnam(\"bob\");\n    assert_non_null(pwd);\n\n    rc = setuid(pwd->pw_uid);\n    assert_return_code(rc, errno);\n\n    s->ssh.session = ssh_new();\n    assert_non_null(s->ssh.session);\n\n    rc = ssh_options_set(s->ssh.session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity);\n    assert_ssh_return_code(s->ssh.session, rc);\n    rc = ssh_options_set(s->ssh.session, SSH_OPTIONS_HOST, TORTURE_SSH_SERVER);\n    assert_ssh_return_code(s->ssh.session, rc);\n    /* Make sure no other configuration options from system will get used */\n    rc = ssh_options_set(s->ssh.session, SSH_OPTIONS_PROCESS_CONFIG, &b);\n    assert_ssh_return_code(s->ssh.session, rc);\n\n    return 0;\n}\n\nstatic int session_teardown(void **state)\n{\n    struct test_server_st *tss = *state;\n    struct torture_state *s;\n\n    assert_non_null(tss);\n\n    s = tss->state;\n    assert_non_null(s);\n\n    ssh_disconnect(s->ssh.session);\n    ssh_free(s->ssh.session);\n\n    return 0;\n}\n\nstatic void torture_server_auth_kbdint(void **state)\n{\n    struct test_server_st *tss = *state;\n    struct torture_state *s;\n    ssh_session session;\n    int rc;\n\n    assert_non_null(tss);\n\n    s = tss->state;\n    assert_non_null(s);\n\n    session = s->ssh.session;\n    assert_non_null(session);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_USER, TORTURE_SSH_USER_BOB);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_userauth_none(session,NULL);\n    /* This request should return a SSH_REQUEST_DENIED error */\n    if (rc == SSH_ERROR) {\n        assert_int_equal(ssh_get_error_code(session), SSH_REQUEST_DENIED);\n    }\n    rc = ssh_userauth_list(session, NULL);\n    assert_true(rc & SSH_AUTH_METHOD_INTERACTIVE);\n\n    rc = ssh_userauth_kbdint(session, NULL, NULL);\n    assert_int_equal(rc, SSH_AUTH_INFO);\n    assert_int_equal(ssh_userauth_kbdint_getnprompts(session), 2);\n\n    /* Reply the first 2 prompts using the username and password */\n    rc = ssh_userauth_kbdint_setanswer(session, 0,\n            TORTURE_SSH_USER_BOB);\n    assert_false(rc < 0);\n\n    rc = ssh_userauth_kbdint_setanswer(session, 1,\n            TORTURE_SSH_USER_BOB_PASSWORD);\n    assert_false(rc < 0);\n\n    /* Resend the password */\n    rc = ssh_userauth_kbdint(session, NULL, NULL);\n    assert_int_equal(rc, SSH_AUTH_INFO);\n    assert_int_equal(ssh_userauth_kbdint_getnprompts(session), 1);\n\n    rc = ssh_userauth_kbdint_setanswer(session, 0,\n            TORTURE_SSH_USER_BOB_PASSWORD);\n    assert_false(rc < 0);\n\n    rc = ssh_userauth_kbdint(session, NULL, NULL);\n\n    /* Sometimes, SSH server send an empty query at the end of exchange */\n    if(rc == SSH_AUTH_INFO) {\n        assert_int_equal(ssh_userauth_kbdint_getnprompts(session), 0);\n        rc = ssh_userauth_kbdint(session, NULL, NULL);\n    }\n\n    assert_int_equal(rc, SSH_AUTH_SUCCESS);\n}\n\nint torture_run_tests(void)\n{\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_server_auth_kbdint,\n                                        session_setup,\n                                        session_teardown),\n    };\n\n    ssh_init();\n\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests,\n            setup_kbdint_server,\n            teardown_kbdint_server);\n\n    ssh_finalize();\n\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/server/torture_server_config.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2019 by Red Hat, Inc.\n *\n * Author: Anderson Toshiyuki Sasaki <ansasaki@redhat.com>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <errno.h>\n#include <pwd.h>\n\n#include \"torture.h\"\n#include \"torture_key.h\"\n#include \"libssh/libssh.h\"\n#include \"libssh/priv.h\"\n#include \"libssh/session.h\"\n#include \"libssh/token.h\"\n\n#include \"test_server.h\"\n#include \"default_cb.h\"\n\nconst char template[] = \"temp_dir_XXXXXX\";\n\nstruct test_server_st {\n    struct torture_state *state;\n    struct server_state_st *ss;\n    char *cwd;\n    char *temp_dir;\n    char ed25519_hostkey[1024];\n    char rsa_hostkey[1024];\n    char ecdsa_521_hostkey[1024];\n    char ecdsa_384_hostkey[1024];\n    char ecdsa_256_hostkey[1024];\n#ifdef HAVE_DSA\n    char dsa_hostkey[1024];\n#endif /* HAVE_DSA */\n};\n\nstatic int setup_files(void **state)\n{\n    struct test_server_st *tss;\n    struct torture_state *s;\n    char sshd_path[1024];\n\n    int rc;\n\n    tss = (struct test_server_st*)calloc(1, sizeof(struct test_server_st));\n    assert_non_null(tss);\n\n    torture_setup_socket_dir((void **)&s);\n    assert_non_null(s->socket_dir);\n\n    /* Set the default interface for the server */\n    setenv(\"SOCKET_WRAPPER_DEFAULT_IFACE\", \"10\", 1);\n    setenv(\"PAM_WRAPPER\", \"1\", 1);\n\n    snprintf(sshd_path,\n             sizeof(sshd_path),\n             \"%s/sshd\",\n             s->socket_dir);\n\n    rc = mkdir(sshd_path, 0755);\n    assert_return_code(rc, errno);\n\n    snprintf(tss->rsa_hostkey,\n             sizeof(tss->rsa_hostkey),\n             \"%s/sshd/ssh_host_rsa_key\",\n             s->socket_dir);\n    torture_write_file(tss->rsa_hostkey, torture_get_testkey(SSH_KEYTYPE_RSA, 0));\n\n    snprintf(tss->ecdsa_521_hostkey,\n             sizeof(tss->ecdsa_521_hostkey),\n             \"%s/sshd/ssh_host_ecdsa_521_key\",\n             s->socket_dir);\n    torture_write_file(tss->ecdsa_521_hostkey,\n                       torture_get_testkey(SSH_KEYTYPE_ECDSA_P521, 0));\n\n    snprintf(tss->ecdsa_384_hostkey,\n             sizeof(tss->ecdsa_384_hostkey),\n             \"%s/sshd/ssh_host_ecdsa_384_key\",\n             s->socket_dir);\n    torture_write_file(tss->ecdsa_384_hostkey,\n                       torture_get_testkey(SSH_KEYTYPE_ECDSA_P384, 0));\n\n    snprintf(tss->ecdsa_256_hostkey,\n             sizeof(tss->ecdsa_256_hostkey),\n             \"%s/sshd/ssh_host_ecdsa_256_key\",\n             s->socket_dir);\n    torture_write_file(tss->ecdsa_256_hostkey,\n                       torture_get_testkey(SSH_KEYTYPE_ECDSA_P256, 0));\n\n    if (!ssh_fips_mode()) {\n        snprintf(tss->ed25519_hostkey,\n                 sizeof(tss->ed25519_hostkey),\n                 \"%s/sshd/ssh_host_ed25519_key\",\n                 s->socket_dir);\n        torture_write_file(tss->ed25519_hostkey,\n                           torture_get_openssh_testkey(SSH_KEYTYPE_ED25519, 0));\n\n#ifdef HAVE_DSA\n        snprintf(tss->dsa_hostkey,\n                 sizeof(tss->dsa_hostkey),\n                 \"%s/sshd/ssh_host_dsa_key\",\n                 s->socket_dir);\n        torture_write_file(tss->dsa_hostkey,\n                           torture_get_testkey(SSH_KEYTYPE_DSS, 0));\n#endif /* HAVE_DSA */\n    }\n\n    tss->state = s;\n    *state = tss;\n\n    return 0;\n}\n\nstatic int teardown_files(void **state)\n{\n    struct torture_state *s;\n    struct test_server_st *tss;\n\n    tss = *state;\n    assert_non_null(tss);\n\n    s = tss->state;\n    assert_non_null(s);\n\n    torture_teardown_socket_dir((void **)&s);\n    SAFE_FREE(tss);\n\n    return 0;\n}\n\nstatic int setup_temp_dir(void **state)\n{\n    struct test_server_st *tss = *state;\n    struct torture_state *s;\n\n    char *cwd = NULL;\n    char *tmp_dir = NULL;\n\n    assert_non_null(tss);\n\n    s = tss->state;\n    assert_non_null(s);\n\n    cwd = torture_get_current_working_dir();\n    assert_non_null(cwd);\n\n    tmp_dir = torture_make_temp_dir(template);\n    assert_non_null(tmp_dir);\n\n    tss->cwd = cwd;\n    tss->temp_dir = tmp_dir;\n\n    return 0;\n}\n\nstatic int teardown_temp_dir(void **state)\n{\n    struct test_server_st *tss = *state;\n    int rc;\n\n    assert_non_null(tss);\n\n    rc = torture_change_dir(tss->cwd);\n    assert_int_equal(rc, 0);\n\n    rc = torture_rmdirs(tss->temp_dir);\n    assert_int_equal(rc, 0);\n\n    SAFE_FREE(tss->temp_dir);\n    SAFE_FREE(tss->cwd);\n\n    return 0;\n}\n\nstatic struct server_state_st *setup_server_state(char *config_file,\n                                                  bool parse_global)\n{\n    struct server_state_st *ss = NULL;\n\n    assert_non_null(config_file);\n\n    /* Create default server state */\n    ss = (struct server_state_st *)calloc(1, sizeof(struct server_state_st));\n    assert_non_null(ss);\n\n    ss->address = strdup(\"127.0.0.10\");\n    assert_non_null(ss->address);\n\n    ss->port = 22;\n    ss->host_key = NULL;\n\n    /* Use default username and password (set in default_handle_session_cb) */\n    ss->expected_username = NULL;\n    ss->expected_password = NULL;\n\n    ss->verbosity = torture_libssh_verbosity();\n    ss->auth_methods = SSH_AUTH_METHOD_PASSWORD | SSH_AUTH_METHOD_PUBLICKEY;\n\n    /* TODO make configurable */\n    ss->max_tries = 3;\n    ss->error = 0;\n\n    /* Use the default session handling function */\n    ss->handle_session = default_handle_session_cb;\n    assert_non_null(ss->handle_session);\n\n    /* Set if should parse global configuration before */\n    ss->parse_global_config = parse_global;\n\n    /* Set the config file to be used */\n    ss->config_file = strdup(config_file);\n    assert_non_null(ss->config_file);\n\n    return ss;\n}\n\nstatic int start_server(void **state)\n{\n    struct test_server_st *tss = *state;\n    struct torture_state *s;\n    struct server_state_st *ss;\n\n    char pid_str[1024];\n    pid_t pid;\n\n    assert_non_null(tss);\n\n    s = tss->state;\n    assert_non_null(s);\n\n    ss = tss->ss;\n    assert_non_null(ss);\n\n    /* Start the server using the default values */\n    pid = fork_run_server(ss);\n    if (pid < 0) {\n        fail();\n    }\n\n    snprintf(pid_str, sizeof(pid_str), \"%d\", pid);\n\n    torture_write_file(s->srv_pidfile, (const char *)pid_str);\n\n    /* TODO properly wait for the server (use ping approach) */\n    /* Wait 200ms */\n    usleep(200 * 1000);\n\n    return 0;\n}\n\nstatic int stop_server(void **state)\n{\n    struct torture_state *s;\n    struct test_server_st *tss;\n\n    int rc;\n\n    tss = *state;\n    assert_non_null(tss);\n\n    s = tss->state;\n    assert_non_null(s);\n\n    rc = torture_terminate_process(s->srv_pidfile);\n    if (rc != 0) {\n        fprintf(stderr, \"XXXXXX Failed to terminate sshd\\n\");\n    }\n\n    unlink(s->srv_pidfile);\n\n    return 0;\n}\n\nstatic int session_setup(void **state)\n{\n    struct test_server_st *tss = *state;\n    struct torture_state *s;\n    int verbosity = torture_libssh_verbosity();\n    struct passwd *pwd;\n    bool b = false;\n    int rc;\n\n    assert_non_null(tss);\n\n    /* Make sure we do not test the agent */\n    unsetenv(\"SSH_AUTH_SOCK\");\n\n    s = tss->state;\n    assert_non_null(s);\n\n    pwd = getpwnam(\"bob\");\n    assert_non_null(pwd);\n\n    rc = setuid(pwd->pw_uid);\n    assert_return_code(rc, errno);\n\n    s->ssh.session = ssh_new();\n    assert_non_null(s->ssh.session);\n\n    rc = ssh_options_set(s->ssh.session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity);\n    assert_ssh_return_code(s->ssh.session, rc);\n    rc = ssh_options_set(s->ssh.session, SSH_OPTIONS_HOST, TORTURE_SSH_SERVER);\n    assert_ssh_return_code(s->ssh.session, rc);\n    /* Make sure no other configuration options from system will get used */\n    rc = ssh_options_set(s->ssh.session, SSH_OPTIONS_PROCESS_CONFIG, &b);\n    assert_ssh_return_code(s->ssh.session, rc);\n\n    return 0;\n}\n\nstatic int session_teardown(void **state)\n{\n    struct test_server_st *tss = *state;\n    struct torture_state *s;\n\n    assert_non_null(tss);\n\n    s = tss->state;\n    assert_non_null(s);\n\n    ssh_disconnect(s->ssh.session);\n    ssh_free(s->ssh.session);\n\n    return 0;\n}\n\nstatic int try_config_content(void **state, const char *config_content,\n                              bool parse_global)\n{\n    struct test_server_st *tss = *state;\n    struct server_state_st *ss;\n    struct torture_state *s;\n    char config_file[1024];\n    int rc;\n\n    ssh_session session;\n\n    assert_non_null(tss);\n\n    s = tss->state;\n    assert_non_null(s);\n\n    /* Prepare the config file to test */\n    snprintf(config_file,\n             sizeof(config_file),\n             \"%s/config_file\",\n             tss->temp_dir);\n\n    if (parse_global) {\n        fprintf(stderr, \"Using system-wide configuration\\n\");\n    }\n    fprintf(stderr, \"Trying content: \\n\\n%s\\n\", config_content);\n\n    torture_write_file(config_file, config_content);\n\n    ss = setup_server_state(config_file, parse_global);\n    assert_non_null(ss);\n\n    tss->ss = ss;\n\n    rc = start_server(state);\n    assert_int_equal(rc, 0);\n\n    rc = session_setup(state);\n    assert_int_equal(rc, 0);\n\n    session = s->ssh.session;\n    assert_non_null(session);\n\n    /* Authenticate as alice with bob */\n    rc = ssh_options_set(session, SSH_OPTIONS_USER, TORTURE_SSH_USER_ALICE);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_connect(session);\n    assert_ssh_return_code(session, rc);\n\n    rc = ssh_userauth_none(session,NULL);\n    /* This request should return a SSH_REQUEST_DENIED error */\n    if (rc == SSH_ERROR) {\n        assert_int_equal(ssh_get_error_code(session), SSH_REQUEST_DENIED);\n    }\n    rc = ssh_userauth_list(session, NULL);\n    assert_true(rc & SSH_AUTH_METHOD_PUBLICKEY);\n\n    rc = ssh_userauth_publickey_auto(session, NULL, NULL);\n    assert_int_equal(rc, SSH_AUTH_SUCCESS);\n\n    rc = session_teardown(state);\n    assert_int_equal(rc, 0);\n\n    rc = stop_server(state);\n    assert_int_equal(rc, 0);\n\n    free_server_state(tss->ss);\n    SAFE_FREE(tss->ss);\n\n    unlink(config_file);\n\n    return 0;\n}\n\nstatic char *hostkey_files[6] = {0};\n\nstatic size_t setup_hostkey_files(struct test_server_st *tss)\n{\n    size_t num_hostkey_files = 1;\n\n    hostkey_files[0] = tss->rsa_hostkey;\n\n#ifdef TEST_ALL_CRYPTO_COMBINATIONS\n    hostkey_files[1] = tss->ecdsa_256_hostkey;\n    hostkey_files[2] = tss->ecdsa_384_hostkey;\n    hostkey_files[3] = tss->ecdsa_521_hostkey;\n\n    num_hostkey_files = 4;\n\n    if (!ssh_fips_mode()) {\n        hostkey_files[4] = tss->ed25519_hostkey;\n        num_hostkey_files++;\n#ifdef HAVE_DSA\n        hostkey_files[5] = tss->dsa_hostkey;\n        num_hostkey_files++;\n#endif\n    }\n#endif /* TEST_ALL_CRYPTO_COMBINATIONS */\n\n    return num_hostkey_files;\n}\n\nstatic void torture_server_config_hostkey(void **state)\n{\n    struct test_server_st *tss = *state;\n    size_t i, num_hostkey_files;\n    char config_content[4096];\n\n    int rc;\n\n    assert_non_null(tss);\n\n    num_hostkey_files = setup_hostkey_files(tss);\n\n    for (i = 0; i < num_hostkey_files; i++) {\n        snprintf(config_content,\n                sizeof(config_content),\n                \"HostKey %s\\n\",\n                hostkey_files[i]);\n\n        rc = try_config_content(state, config_content, false);\n        assert_int_equal(rc, 0);\n    }\n}\n\nstatic void torture_server_config_ciphers(void **state)\n{\n    struct test_server_st *tss = *state;\n    size_t i, j, num_hostkey_files = 1;\n    char config_content[4096];\n\n    const char *ciphers;\n\n    struct ssh_tokens_st *tokens;\n\n    int rc;\n\n    assert_non_null(tss);\n\n    num_hostkey_files = setup_hostkey_files(tss);\n\n    if (ssh_fips_mode()) {\n        ciphers = ssh_kex_get_fips_methods(SSH_CRYPT_S_C);\n        assert_non_null(ciphers);\n    } else {\n        ciphers = ssh_kex_get_default_methods(SSH_CRYPT_S_C);\n        assert_non_null(ciphers);\n    }\n\n    tokens = ssh_tokenize(ciphers, ',');\n    assert_non_null(tokens);\n\n    for (i = 0; i < num_hostkey_files; i++) {\n        /* Try setting all default algorithms */\n        snprintf(config_content,\n                 sizeof(config_content),\n                 \"HostKey %s\\nCiphers %s\\n\",\n                 hostkey_files[i], ciphers);\n\n        rc = try_config_content(state, config_content, false);\n        assert_int_equal(rc, 0);\n\n        /* Try each algorithm individually */\n        j = 0;\n        while(tokens->tokens[j] != NULL) {\n            snprintf(config_content,\n                    sizeof(config_content),\n                    \"HostKey %s\\nCiphers %s\\n\",\n                    hostkey_files[i], tokens->tokens[j]);\n\n            rc = try_config_content(state, config_content, false);\n            assert_int_equal(rc, 0);\n\n            j++;\n        }\n    }\n\n    ssh_tokens_free(tokens);\n}\n\nstatic void torture_server_config_macs(void **state)\n{\n    struct test_server_st *tss = *state;\n    size_t i, j, num_hostkey_files = 1;\n    char config_content[4096];\n\n    const char *macs;\n\n    struct ssh_tokens_st *tokens;\n\n    int rc;\n\n    assert_non_null(tss);\n\n    num_hostkey_files = setup_hostkey_files(tss);\n\n    if (ssh_fips_mode()) {\n        macs = ssh_kex_get_fips_methods(SSH_MAC_S_C);\n        assert_non_null(macs);\n    } else {\n        macs = ssh_kex_get_default_methods(SSH_MAC_S_C);\n        assert_non_null(macs);\n    }\n\n    tokens = ssh_tokenize(macs, ',');\n    assert_non_null(tokens);\n\n    for (i = 0; i < num_hostkey_files; i++) {\n        /* Try setting all default algorithms */\n        snprintf(config_content,\n                 sizeof(config_content),\n                 \"HostKey %s\\nMACs %s\\n\",\n                 hostkey_files[i], macs);\n\n        rc = try_config_content(state, config_content, false);\n        assert_int_equal(rc, 0);\n\n        /* Try each algorithm individually */\n        j = 0;\n        while(tokens->tokens[j] != NULL) {\n            snprintf(config_content,\n                    sizeof(config_content),\n                    \"HostKey %s\\nMACs %s\\n\",\n                    hostkey_files[i], tokens->tokens[j]);\n\n            rc = try_config_content(state, config_content, false);\n            assert_int_equal(rc, 0);\n\n            j++;\n        }\n    }\n\n    ssh_tokens_free(tokens);\n}\n\nstatic void torture_server_config_kex(void **state)\n{\n    struct test_server_st *tss = *state;\n    size_t i, j, num_hostkey_files = 1;\n    char config_content[4096];\n\n    const char *kex;\n\n    struct ssh_tokens_st *tokens;\n\n    int rc;\n\n    assert_non_null(tss);\n\n    num_hostkey_files = setup_hostkey_files(tss);\n\n    if (ssh_fips_mode()) {\n        kex = ssh_kex_get_fips_methods(SSH_KEX);\n        assert_non_null(kex);\n    } else {\n        kex = ssh_kex_get_default_methods(SSH_KEX);\n        assert_non_null(kex);\n    }\n\n    tokens = ssh_tokenize(kex, ',');\n    assert_non_null(tokens);\n\n    for (i = 0; i < num_hostkey_files; i++) {\n        /* Try setting all default algorithms */\n        snprintf(config_content,\n                 sizeof(config_content),\n                 \"HostKey %s\\nKexAlgorithms %s\\n\",\n                 hostkey_files[i], kex);\n\n        rc = try_config_content(state, config_content, false);\n        assert_int_equal(rc, 0);\n\n        /* Try each algorithm individually */\n        j = 0;\n        while(tokens->tokens[j] != NULL) {\n            snprintf(config_content,\n                    sizeof(config_content),\n                    \"HostKey %s\\nKexAlgorithms %s\\n\",\n                    hostkey_files[i], tokens->tokens[j]);\n\n            rc = try_config_content(state, config_content, false);\n            assert_int_equal(rc, 0);\n\n            j++;\n        }\n    }\n\n    ssh_tokens_free(tokens);\n}\n\nstatic void torture_server_config_hostkey_algorithms(void **state)\n{\n    struct test_server_st *tss = *state;\n    size_t i, num_hostkey_files = 5;\n    char config_content[4096];\n\n    const char *allowed;\n\n    int rc;\n\n    assert_non_null(tss);\n\n    num_hostkey_files = setup_hostkey_files(tss);\n\n    if (ssh_fips_mode()) {\n        allowed = ssh_kex_get_fips_methods(SSH_HOSTKEYS);\n        assert_non_null(allowed);\n    } else {\n        allowed = ssh_kex_get_default_methods(SSH_HOSTKEYS);\n        assert_non_null(allowed);\n    }\n\n    for (i = 0; i < num_hostkey_files; i++) {\n        /* Should work with all allowed */\n        snprintf(config_content,\n                 sizeof(config_content),\n                 \"HostKey %s\\nHostKeyAlgorithms %s\\n\",\n                 hostkey_files[i], allowed);\n\n        rc = try_config_content(state, config_content, false);\n        assert_int_equal(rc, 0);\n    }\n\n    /* Should work with matching hostkey and allowed algorithm */\n\n    if (!ssh_fips_mode()) {\n        /* ed25519 */\n        snprintf(config_content,\n                sizeof(config_content),\n                \"HostKey %s\\nHostkeyAlgorithms %s\\n\",\n                tss->ed25519_hostkey, \"ssh-ed25519\");\n\n        rc = try_config_content(state, config_content, false);\n        assert_int_equal(rc, 0);\n\n        /* ssh-rsa */\n        snprintf(config_content,\n                sizeof(config_content),\n                \"HostKey %s\\nHostkeyAlgorithms %s\\n\",\n                tss->rsa_hostkey, \"ssh-rsa\");\n\n        rc = try_config_content(state, config_content, false);\n        assert_int_equal(rc, 0);\n    }\n\n    /* rsa-sha2-256 */\n    snprintf(config_content,\n            sizeof(config_content),\n            \"HostKey %s\\nHostkeyAlgorithms %s\\n\",\n            tss->rsa_hostkey, \"rsa-sha2-256\");\n\n    rc = try_config_content(state, config_content, false);\n    assert_int_equal(rc, 0);\n\n    /* ssh-sha2-512 */\n    snprintf(config_content,\n            sizeof(config_content),\n            \"HostKey %s\\nHostkeyAlgorithms %s\\n\",\n            tss->rsa_hostkey, \"rsa-sha2-512\");\n\n    rc = try_config_content(state, config_content, false);\n    assert_int_equal(rc, 0);\n\n    /* ecdsa-sha2-nistp256 */\n    snprintf(config_content,\n            sizeof(config_content),\n            \"HostKey %s\\nHostkeyAlgorithms %s\\n\",\n            tss->ecdsa_256_hostkey, \"ecdsa-sha2-nistp256\");\n\n    rc = try_config_content(state, config_content, false);\n    assert_int_equal(rc, 0);\n\n    /* ecdsa-sha2-nistp384 */\n    snprintf(config_content,\n            sizeof(config_content),\n            \"HostKey %s\\nHostkeyAlgorithms %s\\n\",\n            tss->ecdsa_384_hostkey, \"ecdsa-sha2-nistp384\");\n\n    rc = try_config_content(state, config_content, false);\n    assert_int_equal(rc, 0);\n\n    /* ecdsa-sha2-nistp521 */\n    snprintf(config_content,\n            sizeof(config_content),\n            \"HostKey %s\\nHostkeyAlgorithms %s\\n\",\n            tss->ecdsa_521_hostkey, \"ecdsa-sha2-nistp521\");\n\n    rc = try_config_content(state, config_content, false);\n    assert_int_equal(rc, 0);\n\n#ifdef HAVE_DSA\n    if (!ssh_fips_mode()) {\n        /* ssh-dss */\n        snprintf(config_content,\n                sizeof(config_content),\n                \"HostKey %s\\nHostkeyAlgorithms %s\\n\",\n                tss->dsa_hostkey, \"ssh-dss\");\n\n        rc = try_config_content(state, config_content, false);\n        assert_int_equal(rc, 0);\n    }\n#endif\n}\n\nstatic void torture_server_config_unknown(void **state)\n{\n    struct test_server_st *tss = *state;\n    char config_content[4096];\n\n    int rc;\n\n    assert_non_null(tss);\n    assert_non_null(tss->rsa_hostkey);\n\n    snprintf(config_content,\n            sizeof(config_content),\n            \"HostKey %s\\nUnknownOption unknown-value1,unknown-value2\\n\",\n            tss->rsa_hostkey);\n\n    rc = try_config_content(state, config_content, false);\n    assert_int_equal(rc, 0);\n}\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_server_config_hostkey,\n                                        setup_temp_dir, teardown_temp_dir),\n        cmocka_unit_test_setup_teardown(torture_server_config_ciphers,\n                                        setup_temp_dir, teardown_temp_dir),\n        cmocka_unit_test_setup_teardown(torture_server_config_macs,\n                                        setup_temp_dir, teardown_temp_dir),\n        cmocka_unit_test_setup_teardown(torture_server_config_kex,\n                                        setup_temp_dir, teardown_temp_dir),\n        cmocka_unit_test_setup_teardown(torture_server_config_hostkey_algorithms,\n                                        setup_temp_dir, teardown_temp_dir),\n        cmocka_unit_test_setup_teardown(torture_server_config_unknown,\n                                        setup_temp_dir, teardown_temp_dir),\n    };\n\n    ssh_init();\n\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests,\n            setup_files,\n            teardown_files);\n\n    ssh_finalize();\n\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/sftp_stress/main.c",
    "content": "/*\n * main.c\n *\n *  Created on: 22 juin 2009\n *      Author: aris\n */\n#include <stdio.h>\n#include <libssh/libssh.h>\n#include <libssh/sftp.h>\n#include <time.h>\n#include <stdlib.h>\n#include <fcntl.h>\n#include <signal.h>\n#include <pthread.h>\n#define TEST_READ 1\n#define TEST_WRITE 2\n#define NTHREADS 3\n#define FILESIZE 100000\nunsigned char samplefile[FILESIZE];\nvolatile int stop=0;\n\nconst char* hosts[]={\"localhost\",\"barebone\"};\nvoid signal_stop(){\n  stop=1;\n  printf(\"Stopping...\\n\");\n}\n\nSSH_SESSION *connect_host(const char *hostname);\nint sftp_test(SSH_SESSION *session, int test);\n\nint docycle(const char *host, int test){\n  SSH_SESSION *session=connect_host(host);\n  int ret=SSH_ERROR;\n  if(!session){\n    printf(\"connect failed\\n\");\n  } else {\n    printf(\"Connected\\n\");\n    ret=sftp_test(session,test);\n    if(ret != SSH_OK){\n      printf(\"Error in sftp\\n\");\n    }\n    ssh_disconnect(session);\n  }\n  return ret;\n}\n\nint thread(){\n  while(docycle(hosts[rand()%2],TEST_WRITE) == SSH_OK)\n    if(stop)\n      break;\n  return 0;\n}\n\nint main(int argc, char **argv){\n  int i;\n  pthread_t threads[NTHREADS];\n  ssh_init();\n  srand(time(NULL));\n  for(i=0;i<FILESIZE;++i)\n    samplefile[i]=rand() & 0xff;\n  signal(SIGTERM,signal_stop);\n  signal(SIGINT,signal_stop);\n\n  for(i=0;i<NTHREADS;++i){\n    srand(i);\n    pthread_create(&threads[i],NULL,(void *) thread, NULL);\n  }\n  for(i=0;i<NTHREADS;++i){\n    pthread_join(threads[i],NULL);\n  }\n  ssh_finalize();\n  printf(\"Ended\\n\");\n  return 0;\n}\n\nSSH_SESSION *connect_host(const char *hostname){\n  SSH_SESSION *session;\n  SSH_OPTIONS *options;\n  int auth=0;\n  int state;\n\n  options=ssh_options_new();\n  ssh_options_set_host(options,hostname);\n  session=ssh_new();\n  ssh_set_options(session,options);\n  if(ssh_connect(session)){\n    fprintf(stderr,\"Connection failed : %s\\n\",ssh_get_error(session));\n    ssh_disconnect(session);\n    return NULL;\n  }\n\n  state = ssh_session_is_known_server(session);\n  switch(state){\n    case SSH_SERVER_KNOWN_OK:\n      break; /* ok */\n    case SSH_SERVER_KNOWN_CHANGED:\n      fprintf(stderr,\"Host key for server changed : server's one is now :\\n\");\n      fprintf(stderr,\"For security reason, connection will be stopped\\n\");\n      ssh_disconnect(session);\n      ssh_finalize();\n      return NULL;\n    case SSH_SERVER_FOUND_OTHER:\n      fprintf(stderr,\"The host key for this server was not found but an other type of key exists.\\n\");\n      fprintf(stderr,\"An attacker might change the default server key to confuse your client\"\n          \"into thinking the key does not exist\\n\"\n          \"We advise you to rerun the client with -d or -r for more safety.\\n\");\n      ssh_disconnect(session);\n      ssh_finalize();\n      return NULL;\n    case SSH_SERVER_NOT_KNOWN:\n      fprintf(stderr,\"The server is unknown. Leaving now\");\n      ssh_disconnect(session);\n      return NULL;\n    case SSH_SERVER_ERROR:\n      fprintf(stderr,\"%s\",ssh_get_error(session));\n      ssh_disconnect(session);\n      return NULL;\n  }\n\n  ssh_userauth_none(session, NULL);\n\n  auth=ssh_userauth_autopubkey(session, NULL);\n  if(auth==SSH_AUTH_ERROR){\n    fprintf(stderr,\"Authenticating with pubkey: %s\\n\",ssh_get_error(session));\n    ssh_disconnect(session);\n    return NULL;\n  }\n  if(auth!=SSH_AUTH_SUCCESS){\n    fprintf(stderr,\"Authentication failed: %s\\n\",ssh_get_error(session));\n    ssh_disconnect(session);\n    return NULL;\n  }\n  ssh_log(session, SSH_LOG_FUNCTIONS, \"Authentication success\");\n  return session;\n}\n\nint sftp_test(SSH_SESSION *session, int test){\n  SFTP_SESSION *sftp=sftp_new(session);\n  SFTP_FILE *file;\n  int wrote=0;\n  char name[128];\n  if(sftp == NULL)\n    return SSH_ERROR;\n  if(sftp_init(sftp)<0){\n    printf(\"problem initializing sftp : %s\\n\",ssh_get_error(session));\n    return SSH_ERROR;\n  }\n  if(test==TEST_WRITE){\n    snprintf(name,sizeof(name),\"/tmp/libsshstress%d\",rand());\n    file=sftp_open(sftp,name,O_RDWR|O_CREAT,0777);\n    if(!file){\n      printf(\"Failed to open file : %s\\n\",ssh_get_error(session));\n      sftp_free(sftp);\n      return SSH_ERROR;\n    }\n    while(wrote<FILESIZE){\n      int max=FILESIZE-wrote;\n      int towrite=rand()%max + 1;\n      int ret=sftp_write(file,&samplefile[wrote],towrite);\n      if(ret<=0){\n        printf(\"Problem while writing : %s\\n\",ssh_get_error(session));\n        sftp_free(sftp);\n        return SSH_ERROR;\n      }\n      if(ret != towrite){\n        printf(\"Asked to write %d, wrote %d\\n\",towrite,ret);\n      }\n      wrote += ret;\n    }\n    sftp_close(file);\n  }\n  sftp_free(sftp);\n  return SSH_OK;\n}\n"
  },
  {
    "path": "src/libssh/tests/ssh_ping.c",
    "content": "/* ssh_ping.c */\n/*\nCopyright 2018 Red Hat, Inc\n\nAuthor: Jakub Jelen <jjelen@redhat.com>\n\nThis file is part of the SSH Library\n\nYou are free to copy this file, modify it in any way, consider it being public\ndomain. This does not apply to the rest of the library though, but it is\nallowed to cut-and-paste working code from this file to any license of\nprogram.\nThe goal is to show the API in action. It's not a reference on how terminal\nclients must be made or how a client should react.\n*/\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <libssh/libssh.h>\n\nint main(int argc, char **argv)\n{\n    const char *banner = NULL;\n    ssh_session session = NULL;\n    int rc = 1;\n\n    if (argc < 1 || argv[1] == NULL) {\n        fprintf(stderr, \"Error: Need an argument (hostname)\\n\");\n        goto out;\n    }\n\n    session = ssh_new();\n    if (session == NULL) {\n        goto out;\n    }\n\n    rc = ssh_options_set(session, SSH_OPTIONS_HOST, argv[1]);\n    if (rc < 0) {\n        goto out;\n    }\n\n    /* The automatic username is not available under uid wrapper */\n    rc = ssh_options_set(session, SSH_OPTIONS_USER, \"ping\");\n    if (rc < 0) {\n        goto out;\n    }\n\n    rc = ssh_connect(session);\n    if (rc != SSH_OK) {\n        fprintf(stderr, \"Connection failed : %s\\n\", ssh_get_error(session));\n        goto out;\n    }\n\n    banner = ssh_get_serverbanner(session);\n    if (banner == NULL) {\n        fprintf(stderr, \"Did not receive SSH banner\\n\");\n        goto out;\n    }\n\n    printf(\"OK: %s\\n\", banner);\n    rc = 0;\n\nout:\n    ssh_free(session);\n    return rc;\n}\n\n"
  },
  {
    "path": "src/libssh/tests/test_exec.c",
    "content": "/*\nThis file is distributed in public domain. You can do whatever you want\nwith its content.\n*/\n#include <libssh/libssh.h>\n#include <stdio.h>\n#include <string.h>\n#include \"tests.h\"\n\nvoid do_connect(SSH_SESSION *session) {\n  char buf[4096] = {0};\n  CHANNEL *channel;\n\n  int error = ssh_connect(session);\n  if (error != SSH_OK) {\n    fprintf(stderr,\"Error at connection: %s\\n\", ssh_get_error(session));\n    return;\n  }\n  printf(\"Connected\\n\");\n\n  ssh_session_is_known_server(session);\n\n  error = authenticate(session);\n  if(error != SSH_AUTH_SUCCESS) {\n    fprintf(stderr,\"Error at authentication: %s\\n\", ssh_get_error(session));\n    return;\n  }\n  printf(\"Authenticated\\n\");\n  channel = ssh_channel_new(session);\n  ssh_channel_open_session(channel);\n  printf(\"Execute 'ls' on the channel\\n\");\n  error = ssh_channel_request_exec(channel, \"ls\");\n  if(error != SSH_OK){\n    fprintf(stderr, \"Error executing command: %s\\n\", ssh_get_error(session));\n    return;\n  }\n  printf(\"--------------------output----------------------\\n\");\n  while (ssh_channel_read(channel, buf, sizeof(buf), 0)) {\n    printf(\"%s\", buf);\n  }\n  printf(\"\\n\");\n  printf(\"---------------------end------------------------\\n\");\n  ssh_channel_send_eof(channel);\n  fprintf(stderr, \"Exit status: %d\\n\", ssh_channel_get_exit_status(channel));\n\n  printf(\"\\nChannel test finished\\n\");\n  ssh_channel_close(channel);\n  ssh_channel_free(channel);\n}\n\nint main(int argc, char **argv){\n\tSSH_OPTIONS *options=set_opts(argc, argv);\n\tSSH_SESSION *session=ssh_new();\n\tif(options==NULL){\n\t\treturn 1;\n\t}\n\tssh_set_options(session,options);\n\tdo_connect(session);\n\tssh_disconnect(session);\n\tssh_finalize();\n\treturn 0;\n}\n"
  },
  {
    "path": "src/libssh/tests/test_pcap.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2009 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n/* Simple test for the pcap functions */\n\n#include <libssh/libssh.h>\n#include <libssh/pcap.h>\n#include <libssh/buffer.h>\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\nint main(int argc, char **argv){\n\tssh_pcap_file pcap;\n\tssh_pcap_context ctx;\n\tssh_buffer buffer=ssh_buffer_new();\n\tchar *str=\"Hello, this is a test string to test the capabilities of the\"\n\t\t\t\"pcap file writer.\";\n\tprintf(\"Simple pcap tester\\n\");\n\tpcap=ssh_pcap_file_new();\n\tif(ssh_pcap_file_open(pcap,\"test.cap\") != SSH_OK){\n\t\tprintf(\"error happened\\n\");\n\t\treturn EXIT_FAILURE;\n\t}\n\tbuffer_add_data(buffer,str,strlen(str));\n\tctx=ssh_pcap_context_new(NULL);\n\tssh_pcap_context_set_file(ctx,pcap);\n\tssh_pcap_context_write(ctx,SSH_PCAP_DIR_OUT,str,strlen(str),strlen(str));\n\n\treturn EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "src/libssh/tests/test_socket.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2009 by Aris Adamantiadis\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n/* Simple test for the socket callbacks */\n\n#include <unistd.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <libssh/libssh.h>\n\n#include <libssh/callbacks.h>\n#include <libssh/socket.h>\n#include <libssh/poll.h>\n\nint stop=0;\nssh_socket s;\n\nstatic int data_rcv(const void *data, size_t len, void *user){\n\tprintf(\"Received data: '\");\n\tfwrite(data,1,len,stdout);\n\tprintf(\"'\\n\");\n\tssh_socket_write(s,\"Hello you !\\n\",12);\n\tssh_socket_nonblocking_flush(s);\n\treturn len;\n}\n\nstatic void controlflow(int code,void *user){\n\tprintf(\"Control flow: %x\\n\",code);\n}\n\nstatic void exception(int code, int errno_code,void *user){\n\tprintf(\"Exception: %d (%d)\\n\",code,errno_code);\n\tstop=1;\n}\n\nstatic void connected(int code, int errno_code,void *user){\n\tif(code == SSH_SOCKET_CONNECTED_OK)\n\t\tprintf(\"Connected: %d (%d)\\n\",code, errno_code);\n\telse {\n\t\tprintf(\"Error while connecting:(%d, %d:%s)\\n\",code,errno_code,strerror(errno_code));\n\t\tstop=1;\n\t}\n}\n\nstruct ssh_socket_callbacks_struct callbacks={\n\t\tdata_rcv,\n\t\tcontrolflow,\n\t\texception,\n\t\tconnected,\n\t\tNULL\n};\nint main(int argc, char **argv){\n\tssh_session session;\n\tssh_poll_ctx ctx;\n\tint verbosity=SSH_LOG_FUNCTIONS;\n\tif(argc < 3){\n\t\tprintf(\"Usage : %s host port\\n\", argv[0]);\n\t\treturn EXIT_FAILURE;\n\t}\n\tsession=ssh_new();\n\tssh_options_set(session,SSH_OPTIONS_LOG_VERBOSITY,&verbosity);\n\tssh_init();\n\ts=ssh_socket_new(session);\n\tctx=ssh_poll_ctx_new(2);\n\tssh_socket_set_callbacks(s, &callbacks);\n\tssh_poll_ctx_add_socket(ctx,s);\n\tif(ssh_socket_connect(s,argv[1],atoi(argv[2]),NULL) != SSH_OK){\n\t\tprintf(\"ssh_socket_connect: %s\\n\",ssh_get_error(session));\n\t\treturn EXIT_FAILURE;\n\t}\n\twhile(!stop)\n\t\t\tssh_poll_ctx_dopoll(ctx,-1);\n\tprintf(\"finished\\n\");\n\treturn EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "src/libssh/tests/test_ssh_bind_accept_fd.c",
    "content": "/* Test the ability to use ssh_bind_accept_fd.\n *\n * Expected behavior: Prints \"SUCCESS!\"\n *\n * Faulty behavior observed before change: Connection timeout\n */\n\n#include <arpa/inet.h>\n#include <err.h>\n#include <libssh/libssh.h>\n#include <libssh/server.h>\n#include <netinet/in.h>\n#include <pthread.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <unistd.h>\n\nstruct options {\n  const char *server_keyfile;\n} options;\n\nconst char HOST[] = \"127.0.0.1\";\nconst int PORT = 3333;\n\nint get_connection() {\n  int rc, server_socket, client_conn = -1;\n  struct sockaddr_in server_socket_addr;\n  struct sockaddr_storage client_conn_addr;\n  socklen_t client_conn_addr_size = sizeof(client_conn_addr);\n\n  server_socket = socket(PF_INET, SOCK_STREAM, 0);\n  if (server_socket < 0) {\n    goto out;\n  }\n\n  server_socket_addr.sin_family = AF_INET;\n  server_socket_addr.sin_port = htons(PORT);\n  if (inet_pton(AF_INET, HOST, &server_socket_addr.sin_addr) != 1) {\n    goto out;\n  }\n\n  rc = bind(server_socket, (struct sockaddr *)&server_socket_addr,\n            sizeof(server_socket_addr));\n  if (rc < 0) {\n    goto out;\n  }\n\n  if (listen(server_socket, 0) < 0) {\n    goto out;\n  }\n\n  client_conn = accept(server_socket,\n                       (struct sockaddr *)&client_conn_addr,\n                       &client_conn_addr_size);\n\n out:\n  return client_conn;\n}\n\nvoid ssh_server() {\n  ssh_bind bind;\n  ssh_session session;\n\n  int client_conn = get_connection();\n  if (client_conn < 0) {\n    err(1, \"get_connection\");\n  }\n\n  bind = ssh_bind_new();\n  if (!bind) {\n    errx(1, \"ssh_bind_new\");\n  }\n\n#ifdef HAVE_DSA\n  /*TODO mbedtls this is probably required */\n  if (ssh_bind_options_set(bind, SSH_BIND_OPTIONS_DSAKEY,\n                           options.server_keyfile) != SSH_OK) {\n    errx(1, \"ssh_bind_options_set(SSH_BIND_OPTIONS_DSAKEY\");\n  }\n#else\n  if (ssh_bind_options_set(bind, SSH_BIND_OPTIONS_RSAKEY,\n                           options.server_keyfile) != SSH_OK) {\n    errx(1, \"ssh_bind_options_set(SSH_BIND_OPTIONS_RSAKEY\");\n  }\n#endif\n\n  session = ssh_new();\n  if (!session) {\n    errx(1, \"ssh_new\");\n  }\n\n  if (ssh_bind_accept_fd(bind, session, client_conn) != SSH_OK) {\n    errx(1, \"ssh_bind_accept: %s\", ssh_get_error(bind));\n  }\n\n  if (ssh_handle_key_exchange(session) != SSH_OK) {\n    errx(1, \"ssh_handle_key_exchange: %s\", ssh_get_error(session));\n  }\n\n  printf(\"SUCCESS!\\n\");\n}\n\nvoid ssh_client() {\n  ssh_session session;\n\n  session = ssh_new();\n  if (!session) {\n    errx(1, \"ssh_new\");\n  }\n\n  if (ssh_options_set(session, SSH_OPTIONS_HOST, HOST) < 0) {\n    errx(1, \"ssh_options_set(SSH_OPTIONS_HOST)\");\n  }\n  if (ssh_options_set(session, SSH_OPTIONS_PORT, &PORT) < 0) {\n    errx(1, \"ssh_options_set(SSH_OPTIONS_PORT)\");\n  }\n\n  if (ssh_connect(session) != SSH_OK) {\n    errx(1, \"ssh_connect: %s\", ssh_get_error(session));\n  }\n}\n\nint main(int argc, const char *argv[]) {\n  if (argc != 2) {\n    printf(\"Usage: %s <private key file>\\n\", argv[0]);\n    exit(1);\n  }\n\n  options.server_keyfile = argv[1];\n\n  pid_t pid = fork();\n  if (pid < 0) {\n    errx(1, \"fork\");\n  }\n  if (pid == 0) {\n    /* Allow the server to get set up */\n    sleep(3);\n\n    ssh_client();\n  } else {\n    ssh_server();\n  }\n\n  return 0;\n}\n"
  },
  {
    "path": "src/libssh/tests/test_tunnel.c",
    "content": "/*\nThis file is distributed in public domain. You can do whatever you want\nwith its content.\n*/\n#include <libssh/libssh.h>\n#include <stdio.h>\n#include <string.h>\n#include \"tests.h\"\n#define ECHO_PORT 7\nvoid do_connect(SSH_SESSION *session){\n\tint error=ssh_connect(session);\n\tif(error != SSH_OK){\n\t\tfprintf(stderr,\"Error at connection :%s\\n\",ssh_get_error(session));\n\t\treturn;\n\t}\n\tprintf(\"Connected\\n\");\n\tssh_session_is_known_server(session);\n\t// we don't care what happens here\n\terror=authenticate(session);\n\tif(error != SSH_AUTH_SUCCESS){\n\t\tfprintf(stderr,\"Error at authentication :%s\\n\",ssh_get_error(session));\n\t\treturn;\n\t}\n\tprintf(\"Authenticated\\n\");\n\tCHANNEL *channel=ssh_channel_new(session);\n\terror=ssh_channel_open_forward(channel,\"localhost\",ECHO_PORT,\"localhost\",42);\n\tif(error!=SSH_OK){\n\t\tfprintf(stderr,\"Error when opening forward:%s\\n\",ssh_get_error(session));\n\t\treturn;\n\t}\n\tprintf(\"Forward opened\\n\");\n\tint i=0;\n\tchar string[20];\n\tchar buffer[20];\n\tfor(i=0;i<2000;++i){\n\t\tsprintf(string,\"%d\\n\",i);\n\t\tssh_channel_write(channel,string,strlen(string));\n\t\tdo {\n\t\t\terror=ssh_channel_poll(channel,0);\n\t\t\t//if(error < strlen(string))\n\t\t\t\t//usleep(10);\n\t\t} while(error < strlen(string) && error >= 0);\n\t\tif(error>0){\n\t\t\terror=ssh_channel_read_nonblocking(channel,buffer,strlen(string),0);\n\t\t\tif(error>=0){\n\t\t\t\tif(memcmp(buffer,string,strlen(string))!=0){\n\t\t\t\t\tfprintf(stderr,\"Problem with answer: wanted %s got %s\\n\",string,buffer);\n\t\t\t\t} else {\n\t\t\t\t\tprintf(\".\");\n\t\t\t\t\tfflush(stdout);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\t\n\t\t}\n\t\tif(error==-1){\n\t\t\tfprintf(stderr,\"Channel reading error : %s\\n\",ssh_get_error(session));\n\t\t\tbreak;\n\t\t}\n\t}\n\tprintf(\"\\nChannel test finished\\n\");\n\tssh_channel_close(channel);\n\tssh_channel_free(channel);\n}\n\nint main(int argc, char **argv){\n\tSSH_OPTIONS *options=set_opts(argc, argv);\n\tSSH_SESSION *session=ssh_new();\n\tif(options==NULL){\n\t\treturn 1;\n\t}\n\tssh_set_options(session,options);\n\tdo_connect(session);\n\tssh_disconnect(session);\n\tssh_finalize();\n\treturn 0;\n}\n"
  },
  {
    "path": "src/libssh/tests/tests.h",
    "content": "/*\nThis file is distributed in public domain. You can do whatever you want\nwith its content.\n*/\n#include <libssh/libssh.h>\nint authenticate (SSH_SESSION *session);\nSSH_OPTIONS *set_opts(int argc, char **argv);\n\n"
  },
  {
    "path": "src/libssh/tests/tests_config.h.cmake",
    "content": "/* OpenSSH capabilities */\n\n#cmakedefine OPENSSH_VERSION_MAJOR ${OPENSSH_VERSION_MAJOR}\n#cmakedefine OPENSSH_VERSION_MINOR ${OPENSSH_VERSION_MINOR}\n\n#cmakedefine OPENSSH_CIPHERS \"${OPENSSH_CIPHERS}\"\n#cmakedefine OPENSSH_MACS \"${OPENSSH_MACS}\"\n#cmakedefine OPENSSH_KEX \"${OPENSSH_KEX}\"\n#cmakedefine OPENSSH_KEYS \"${OPENSSH_KEYS}\"\n\n\n#cmakedefine OPENSSH_3DES_CBC 1\n#cmakedefine OPENSSH_AES128_CBC 1\n#cmakedefine OPENSSH_AES192_CBC 1\n#cmakedefine OPENSSH_AES256_CBC 1\n#cmakedefine OPENSSH_RIJNDAEL_CBC_LYSATOR_LIU_SE 1\n#cmakedefine OPENSSH_AES128_CTR 1\n#cmakedefine OPENSSH_AES192_CTR 1\n#cmakedefine OPENSSH_AES256_CTR 1\n#cmakedefine OPENSSH_AES128_GCM_OPENSSH_COM 1\n#cmakedefine OPENSSH_AES256_GCM_OPENSSH_COM 1\n#cmakedefine OPENSSH_CHACHA20_POLY1305_OPENSSH_COM 1\n#cmakedefine OPENSSH_BLOWFISH_CBC 1\n#cmakedefine OPENSSH_HMAC_SHA1 1\n#cmakedefine OPENSSH_HMAC_SHA1_96 1\n#cmakedefine OPENSSH_HMAC_SHA2_256 1\n#cmakedefine OPENSSH_HMAC_SHA2_512 1\n#cmakedefine OPENSSH_HMAC_MD5 1\n#cmakedefine OPENSSH_HMAC_MD5_96 1\n#cmakedefine OPENSSH_UMAC_64_OPENSSH_COM 1\n#cmakedefine OPENSSH_UMAC_128_OPENSSH_COM 1\n#cmakedefine OPENSSH_HMAC_SHA1_ETM_OPENSSH_COM 1\n#cmakedefine OPENSSH_HMAC_SHA1_96_ETM_OPENSSH_COM 1\n#cmakedefine OPENSSH_HMAC_SHA2_256_ETM_OPENSSH_COM 1\n#cmakedefine OPENSSH_HMAC_SHA2_512_ETM_OPENSSH_COM 1\n#cmakedefine OPENSSH_HMAC_MD5_ETM_OPENSSH_COM 1\n#cmakedefine OPENSSH_HMAC_MD5_96_ETM_OPENSSH_COM 1\n#cmakedefine OPENSSH_UMAC_64_ETM_OPENSSH_COM 1\n#cmakedefine OPENSSH_UMAC_128_ETM_OPENSSH_COM 1\n#cmakedefine OPENSSH_DIFFIE_HELLMAN_GROUP1_SHA1 1\n#cmakedefine OPENSSH_DIFFIE_HELLMAN_GROUP14_SHA1 1\n#cmakedefine OPENSSH_DIFFIE_HELLMAN_GROUP14_SHA256 1\n#cmakedefine OPENSSH_DIFFIE_HELLMAN_GROUP16_SHA512 1\n#cmakedefine OPENSSH_DIFFIE_HELLMAN_GROUP18_SHA512 1\n#cmakedefine OPENSSH_DIFFIE_HELLMAN_GROUP_EXCHANGE_SHA1 1\n#cmakedefine OPENSSH_DIFFIE_HELLMAN_GROUP_EXCHANGE_SHA256 1\n#cmakedefine OPENSSH_ECDH_SHA2_NISTP256 1\n#cmakedefine OPENSSH_ECDH_SHA2_NISTP384 1\n#cmakedefine OPENSSH_ECDH_SHA2_NISTP521 1\n#cmakedefine OPENSSH_CURVE25519_SHA256 1\n#cmakedefine OPENSSH_CURVE25519_SHA256_LIBSSH_ORG 1\n#cmakedefine OPENSSH_SSH_ED25519 1\n#cmakedefine OPENSSH_SSH_ED25519_CERT_V01_OPENSSH_COM 1\n#cmakedefine OPENSSH_SSH_RSA 1\n#cmakedefine OPENSSH_SSH_DSS 1\n#cmakedefine OPENSSH_ECDSA_SHA2_NISTP256 1\n#cmakedefine OPENSSH_ECDSA_SHA2_NISTP384 1\n#cmakedefine OPENSSH_ECDSA_SHA2_NISTP521 1\n#cmakedefine OPENSSH_SSH_RSA_CERT_V01_OPENSSH_COM 1\n#cmakedefine OPENSSH_SSH_DSS_CERT_V01_OPENSSH_COM 1\n#cmakedefine OPENSSH_ECDSA_SHA2_NISTP256_CERT_V01_OPENSSH_COM 1\n#cmakedefine OPENSSH_ECDSA_SHA2_NISTP384_CERT_V01_OPENSSH_COM 1\n#cmakedefine OPENSSH_ECDSA_SHA2_NISTP521_CERT_V01_OPENSSH_COM 1\n\n/* Available programs */\n\n#cmakedefine NC_EXECUTABLE \"${NC_EXECUTABLE}\"\n#cmakedefine SSHD_EXECUTABLE \"${SSHD_EXECUTABLE}\"\n#cmakedefine SSH_EXECUTABLE \"${SSH_EXECUTABLE}\""
  },
  {
    "path": "src/libssh/tests/torture.c",
    "content": "/*\n * torture.c - torture library for testing libssh\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2008-2009 by Andreas Schneider <asn@cryptomilk.org>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n#include \"tests_config.h\"\n#include <stdio.h>\n#include <stdlib.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <fcntl.h>\n#include <signal.h>\n\n#ifndef _WIN32\n# include <dirent.h>\n# include <errno.h>\n# include <sys/socket.h>\n#endif\n\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#elif (defined _WIN32) || (defined _WIN64)\n#include <direct.h>\n#include <io.h>\n#define read _read\n#define open _open\n#define write _write\n#define close _close\n#define chdir _chdir\n#endif\n\n#include \"torture.h\"\n#include \"torture_key.h\"\n#include \"libssh/misc.h\"\n\n#define TORTURE_SSHD_SRV_IPV4 \"127.0.0.10\"\n/* socket wrapper IPv6 prefix  fd00::5357:5fxx */\n#define TORTURE_SSHD_SRV_IPV6 \"fd00::5357:5f0a\"\n#define TORTURE_SSHD_SRV_PORT 22\n\n#define TORTURE_SOCKET_DIR \"/tmp/test_socket_wrapper_XXXXXX\"\n#define TORTURE_SSHD_PIDFILE \"sshd/sshd.pid\"\n#define TORTURE_SSHD_CONFIG \"sshd/sshd_config\"\n#define TORTURE_PCAP_FILE \"socket_trace.pcap\"\n\n#ifndef PATH_MAX\n# define PATH_MAX 4096\n#endif\n\nstatic const char torture_rsa_certauth_pub[]=\n        \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCnA2n5vHzZbs/GvRkGloJNV1CXHI\"\n        \"S5Xnrm05HusUJSWyPq3I1iCMHdYA7oezHa9GCFYbIenaYPy+G6USQRjYQz8SvAZo06\"\n        \"SFNeJSsa1kAIqxzdPT9kBrRrYK39PZQPsYVfRPqZBdmc+jwrfz97IFEJyXMI47FoTG\"\n        \"kgEq7eu3z2px/tdIZ34I5Hr5DDBxicZi4jluyRUJHfSPoBxyhF7OkPX4bYkrc691je\"\n        \"IQDxubl650WYLHgFfad0xTzBIFE6XUb55Dp5AgRdevSoso1Pe0IKFxxMVpP664LCbY\"\n        \"K06Lv6kcotfFlpvUtR1yx8jToGcSoq5sSzTwvXSHCQQ9ZA1hvF \"\n        \"torture_certauth_key\";\n\nstatic int verbosity = 0;\nstatic const char *pattern = NULL;\n\n#ifndef _WIN32\n\nstatic int _torture_auth_kbdint(ssh_session session,\n                               const char *password) {\n    const char *prompt;\n    char echo;\n    int err;\n\n    if (session == NULL || password == NULL) {\n        return SSH_AUTH_ERROR;\n    }\n\n    err = ssh_userauth_kbdint(session, NULL, NULL);\n    if (err == SSH_AUTH_ERROR) {\n        return err;\n    }\n\n    if (ssh_userauth_kbdint_getnprompts(session) != 1) {\n        return SSH_AUTH_ERROR;\n    }\n\n    prompt = ssh_userauth_kbdint_getprompt(session, 0, &echo);\n    if (prompt == NULL) {\n        return SSH_AUTH_ERROR;\n    }\n\n    if (ssh_userauth_kbdint_setanswer(session, 0, password) < 0) {\n        return SSH_AUTH_ERROR;\n    }\n    err = ssh_userauth_kbdint(session, NULL, NULL);\n    if (err == SSH_AUTH_INFO) {\n        if (ssh_userauth_kbdint_getnprompts(session) != 0) {\n            return SSH_AUTH_ERROR;\n        }\n        err = ssh_userauth_kbdint(session, NULL, NULL);\n    }\n\n    return err;\n}\n\nint torture_rmdirs(const char *path) {\n    DIR *d;\n    struct dirent *dp;\n    struct stat sb;\n    char *fname;\n\n    if ((d = opendir(path)) != NULL) {\n        while(stat(path, &sb) == 0) {\n            /* if we can remove the directory we're done */\n            if (rmdir(path) == 0) {\n                break;\n            }\n            switch (errno) {\n                case ENOTEMPTY:\n                case EEXIST:\n                case EBADF:\n                    break; /* continue */\n                default:\n                    closedir(d);\n                    return 0;\n            }\n\n            while ((dp = readdir(d)) != NULL) {\n                size_t len;\n                /* skip '.' and '..' */\n                if (dp->d_name[0] == '.' &&\n                        (dp->d_name[1] == '\\0' ||\n                         (dp->d_name[1] == '.' && dp->d_name[2] == '\\0'))) {\n                    continue;\n                }\n\n                len = strlen(path) + strlen(dp->d_name) + 2;\n                fname = malloc(len);\n                if (fname == NULL) {\n                    closedir(d);\n                    return -1;\n                }\n                snprintf(fname, len, \"%s/%s\", path, dp->d_name);\n\n                /* stat the file */\n                if (lstat(fname, &sb) != -1) {\n                    if (S_ISDIR(sb.st_mode) && !S_ISLNK(sb.st_mode)) {\n                        if (rmdir(fname) < 0) { /* can't be deleted */\n                            if (errno == EACCES) {\n                                closedir(d);\n                                SAFE_FREE(fname);\n                                return -1;\n                            }\n                            torture_rmdirs(fname);\n                        }\n                    } else {\n                        unlink(fname);\n                    }\n                } /* lstat */\n                SAFE_FREE(fname);\n            } /* readdir */\n\n            rewinddir(d);\n        }\n    } else {\n        return -1;\n    }\n\n    closedir(d);\n    return 0;\n}\n\nint torture_isdir(const char *path) {\n    struct stat sb;\n\n    if (lstat (path, &sb) == 0 && S_ISDIR(sb.st_mode)) {\n        return 1;\n    }\n\n    return 0;\n}\n\nstatic pid_t\ntorture_read_pidfile(const char *pidfile)\n{\n    char buf[8] = {0};\n    long int tmp;\n    pid_t ret;\n    ssize_t rc;\n    int fd;\n\n    fd = open(pidfile, O_RDONLY);\n    if (fd < 0) {\n        return -1;\n    }\n\n    rc = read(fd, buf, sizeof(buf));\n    close(fd);\n    if (rc <= 0) {\n        return -1;\n    }\n\n    buf[sizeof(buf) - 1] = '\\0';\n\n    tmp = strtol(buf, NULL, 10);\n    if (tmp == 0 || errno == ERANGE) {\n        return -1;\n    }\n    ret = (pid_t)tmp;\n    /* Check if we are out of pid_t range on this system */\n    if ((long)ret != tmp) {\n        return -1;\n    }\n\n    return ret;\n}\n\nint torture_terminate_process(const char *pidfile)\n{\n    ssize_t rc;\n    pid_t pid;\n    int is_running = 1;\n    int count;\n\n    /* read the pidfile */\n    pid = torture_read_pidfile(pidfile);\n    assert_int_not_equal(pid, -1);\n\n    for (count = 0; count < 10; count++) {\n        /* Make sure the daemon goes away! */\n        kill(pid, SIGTERM);\n\n        /* 10 ms */\n        usleep(10 * 1000);\n\n        rc = kill(pid, 0);\n        if (rc != 0) {\n            is_running = 0;\n            break;\n        }\n    }\n\n    if (is_running) {\n        fprintf(stderr,\n                \"WARNING: The process with pid %u is still running!\\n\", pid);\n    }\n\n    return 0;\n}\n\nssh_session torture_ssh_session(struct torture_state *s,\n                                const char *host,\n                                const unsigned int *port,\n                                const char *user,\n                                const char *password) {\n    ssh_session session;\n    int method;\n    int rc;\n\n    bool process_config = false;\n\n    if (host == NULL) {\n        return NULL;\n    }\n\n    session = ssh_new();\n    if (session == NULL) {\n        return NULL;\n    }\n\n#ifdef WITH_PCAP\n    if (s != NULL && s->plain_pcap != NULL) {\n        ssh_set_pcap_file(session, s->plain_pcap);\n    }\n#endif /* WITH_PCAP */\n\n    if (ssh_options_set(session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity) < 0) {\n        goto failed;\n    }\n\n    if (ssh_options_set(session, SSH_OPTIONS_HOST, host) < 0) {\n        goto failed;\n    }\n\n    if (port != NULL) {\n      if (ssh_options_set(session, SSH_OPTIONS_PORT, port) < 0) {\n        goto failed;\n      }\n    }\n\n    if (user != NULL) {\n        if (ssh_options_set(session, SSH_OPTIONS_USER, user) < 0) {\n            goto failed;\n        }\n    }\n\n    if (ssh_options_set(session, SSH_OPTIONS_PROCESS_CONFIG,\n                        &process_config) < 0) {\n        goto failed;\n    }\n\n    if (ssh_connect(session)) {\n        goto failed;\n    }\n\n    /* We are in testing mode, so consinder the hostkey as verified ;) */\n\n    /* This request should return a SSH_REQUEST_DENIED error */\n    rc = ssh_userauth_none(session, NULL);\n    if (rc == SSH_ERROR) {\n        goto failed;\n    }\n    method = ssh_userauth_list(session, NULL);\n    if (method == 0) {\n        goto failed;\n    }\n\n    if (password != NULL) {\n        if (method & SSH_AUTH_METHOD_PASSWORD) {\n            rc = ssh_userauth_password(session, NULL, password);\n        } else if (method & SSH_AUTH_METHOD_INTERACTIVE) {\n            rc = _torture_auth_kbdint(session, password);\n        }\n    } else {\n        rc = ssh_userauth_publickey_auto(session, NULL, NULL);\n        if (rc == SSH_AUTH_ERROR) {\n            goto failed;\n        }\n    }\n    if (rc != SSH_AUTH_SUCCESS) {\n        goto failed;\n    }\n\n    return session;\nfailed:\n    if (ssh_is_connected(session)) {\n        ssh_disconnect(session);\n    }\n    ssh_free(session);\n\n    return NULL;\n}\n\n#ifdef WITH_SERVER\n\nssh_bind torture_ssh_bind(const char *addr,\n                          const unsigned int port,\n                          enum ssh_keytypes_e key_type,\n                          const char *private_key_file) {\n    int rc;\n    ssh_bind sshbind = NULL;\n    enum ssh_bind_options_e opts = -1;\n\n    sshbind = ssh_bind_new();\n    if (sshbind == NULL) {\n        goto out;\n    }\n\n    rc = ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_BINDADDR, addr);\n    if (rc != 0) {\n        goto out_free;\n    }\n\n    rc = ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_BINDPORT, &port);\n    if (rc != 0) {\n        goto out_free;\n    }\n\n    switch (key_type) {\n#ifdef HAVE_DSA\n        case SSH_KEYTYPE_DSS:\n            opts = SSH_BIND_OPTIONS_DSAKEY;\n            break;\n#endif /* HAVE_DSA */\n        case SSH_KEYTYPE_RSA:\n            opts = SSH_BIND_OPTIONS_RSAKEY;\n            break;\n        case SSH_KEYTYPE_ECDSA_P256:\n        case SSH_KEYTYPE_ECDSA_P384:\n        case SSH_KEYTYPE_ECDSA_P521:\n            opts = SSH_BIND_OPTIONS_ECDSAKEY;\n            break;\n        default:\n            goto out_free;\n    }\n\n    rc = ssh_bind_options_set(sshbind, opts, private_key_file);\n    if (rc != 0) {\n        goto out_free;\n    }\n\n    rc = ssh_bind_listen(sshbind);\n    if (rc != SSH_OK) {\n        goto out_free;\n    }\n\n    goto out;\n out_free:\n    ssh_bind_free(sshbind);\n    sshbind = NULL;\n out:\n    return sshbind;\n}\n\n#endif /* WITH_SERVER */\n\n#ifdef WITH_SFTP\n\nstruct torture_sftp *torture_sftp_session(ssh_session session) {\n    struct torture_sftp *t;\n    char template[] = \"/tmp/ssh_torture_XXXXXX\";\n    char *p;\n    int rc;\n\n    if (session == NULL) {\n        return NULL;\n    }\n\n    t = malloc(sizeof(struct torture_sftp));\n    if (t == NULL) {\n        return NULL;\n    }\n\n    t->ssh = session;\n    t->sftp = sftp_new(session);\n    if (t->sftp == NULL) {\n        goto failed;\n    }\n\n    rc = sftp_init(t->sftp);\n    if (rc < 0) {\n        goto failed;\n    }\n\n    p = mkdtemp(template);\n    if (p == NULL) {\n        goto failed;\n    }\n    /* useful if TESTUSER is not the local user */\n    chmod(template,0777);\n    t->testdir = strdup(p);\n    if (t->testdir == NULL) {\n        goto failed;\n    }\n\n    return t;\nfailed:\n    if (t->sftp != NULL) {\n        sftp_free(t->sftp);\n    }\n    ssh_disconnect(t->ssh);\n    ssh_free(t->ssh);\n    free(t);\n\n    return NULL;\n}\n\nvoid torture_sftp_close(struct torture_sftp *t) {\n    if (t == NULL) {\n        return;\n    }\n\n    if (t->sftp != NULL) {\n        sftp_free(t->sftp);\n    }\n\n    free(t->testdir);\n    free(t);\n}\n#endif /* WITH_SFTP */\n\nint torture_server_port(void)\n{\n    char *env = getenv(\"TORTURE_SERVER_PORT\");\n\n    if (env != NULL && env[0] != '\\0' && strlen(env) < 6) {\n        int port = atoi(env);\n\n        if (port > 0 && port < 65536) {\n            return port;\n        }\n    }\n\n    return TORTURE_SSHD_SRV_PORT;\n}\n\nconst char *torture_server_address(int family)\n{\n    switch (family) {\n    case AF_INET: {\n        const char *ip4 = getenv(\"TORTURE_SERVER_ADDRESS_IPV4\");\n\n        if (ip4 != NULL && ip4[0] != '\\0') {\n            return ip4;\n        }\n\n        return TORTURE_SSHD_SRV_IPV4;\n    }\n    case AF_INET6: {\n        const char *ip6 = getenv(\"TORTURE_SERVER_ADDRESS_IPV6\");\n\n        if (ip6 != NULL && ip6[0] != '\\0') {\n            return ip6;\n        }\n\n        return TORTURE_SSHD_SRV_IPV6;\n    }\n    default:\n        return NULL;\n    }\n\n    return NULL;\n}\n\nvoid torture_setup_socket_dir(void **state)\n{\n    struct torture_state *s;\n    const char *p;\n    size_t len;\n    char *env = NULL;\n    int rc;\n\n    s = calloc(1, sizeof(struct torture_state));\n    assert_non_null(s);\n\n#ifdef WITH_PCAP\n    env = getenv(\"TORTURE_PLAIN_PCAP_FILE\");\n    if (env != NULL && env[0] != '\\0') {\n        s->plain_pcap = ssh_pcap_file_new();\n        assert_non_null(s->plain_pcap);\n\n        rc = ssh_pcap_file_open(s->plain_pcap, env);\n        assert_int_equal(rc, SSH_OK);\n    }\n#endif /* WITH_PCAP */\n\n    s->socket_dir = torture_make_temp_dir(TORTURE_SOCKET_DIR);\n    assert_non_null(s->socket_dir);\n\n    p = s->socket_dir;\n\n    /* pcap file */\n    len = strlen(p) + 1 + strlen(TORTURE_PCAP_FILE) + 1;\n\n    s->pcap_file = malloc(len);\n    assert_non_null(s->pcap_file);\n\n    snprintf(s->pcap_file, len, \"%s/%s\", p, TORTURE_PCAP_FILE);\n\n    /* pid file */\n    len = strlen(p) + 1 + strlen(TORTURE_SSHD_PIDFILE) + 1;\n\n    s->srv_pidfile = malloc(len);\n    assert_non_null(s->srv_pidfile);\n\n    snprintf(s->srv_pidfile, len, \"%s/%s\", p, TORTURE_SSHD_PIDFILE);\n\n    /* config file */\n    len = strlen(p) + 1 + strlen(TORTURE_SSHD_CONFIG) + 1;\n\n    s->srv_config = malloc(len);\n    assert_non_null(s->srv_config);\n\n    snprintf(s->srv_config, len, \"%s/%s\", p, TORTURE_SSHD_CONFIG);\n\n    setenv(\"SOCKET_WRAPPER_DIR\", p, 1);\n    setenv(\"SOCKET_WRAPPER_DEFAULT_IFACE\", \"170\", 1);\n    env = getenv(\"TORTURE_GENERATE_PCAP\");\n    if (env != NULL && env[0] == '1') {\n        setenv(\"SOCKET_WRAPPER_PCAP_FILE\", s->pcap_file, 1);\n    }\n\n    *state = s;\n}\n\nstatic void torture_setup_create_sshd_config(void **state, bool pam)\n{\n    struct torture_state *s = *state;\n    char ed25519_hostkey[1024] = {0};\n#ifdef HAVE_DSA\n    char dsa_hostkey[1024];\n#endif /* HAVE_DSA */\n    char rsa_hostkey[1024];\n    char ecdsa_hostkey[1024];\n    char trusted_ca_pubkey[1024];\n    char sshd_config[4096];\n    char sshd_path[1024];\n    const char *additional_config = NULL;\n    struct stat sb;\n    const char *sftp_server_locations[] = {\n        \"/usr/lib/ssh/sftp-server\",\n        \"/usr/libexec/ssh/sftp-server\", /* Tumbleweed 20200829 */\n        \"/usr/libexec/sftp-server\",\n        \"/usr/libexec/openssh/sftp-server\",\n        \"/usr/lib/openssh/sftp-server\",     /* Debian */\n    };\n    const char config_string[]=\n             \"Port 22\\n\"\n             \"ListenAddress 127.0.0.10\\n\"\n             \"%s %s\\n\" /* ed25519 HostKey */\n#ifdef HAVE_DSA\n             \"%s %s\\n\" /* DSA HostKey */\n#endif /* HAVE_DSA */\n             \"%s %s\\n\" /* RSA HostKey */\n             \"%s %s\\n\" /* ECDSA HostKey */\n             \"\\n\"\n             \"TrustedUserCAKeys %s\\n\"\n             \"\\n\"\n             \"LogLevel DEBUG3\\n\"\n             \"Subsystem sftp %s -l DEBUG2\\n\"\n             \"\\n\"\n             \"PasswordAuthentication yes\\n\"\n             \"PubkeyAuthentication yes\\n\"\n             \"\\n\"\n             \"StrictModes no\\n\"\n             \"\\n\"\n             \"%s\" /* Here comes UsePam */\n             \"\\n\"\n             /* add all supported algorithms */\n             \"HostKeyAlgorithms \" OPENSSH_KEYS \"\\n\"\n#if OPENSSH_VERSION_MAJOR == 8 && OPENSSH_VERSION_MINOR >= 2\n             \"CASignatureAlgorithms \" OPENSSH_KEYS \"\\n\"\n#endif\n             \"Ciphers \" OPENSSH_CIPHERS \"\\n\"\n             \"KexAlgorithms \" OPENSSH_KEX \"\\n\"\n             \"MACs \" OPENSSH_MACS \"\\n\"\n             \"\\n\"\n             \"AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES\\n\"\n             \"AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT\\n\"\n             \"AcceptEnv LC_IDENTIFICATION LC_ALL LC_LIBSSH\\n\"\n             \"\\n\"\n             \"PidFile %s\\n\"\n             \"%s\\n\"; /* The space for test-specific options */\n    /* FIPS config */\n    const char fips_config_string[]=\n             \"Port 22\\n\"\n             \"ListenAddress 127.0.0.10\\n\"\n             \"%s %s\\n\" /* RSA HostKey */\n             \"%s %s\\n\" /* ECDSA HostKey */\n             \"\\n\"\n             \"TrustedUserCAKeys %s\\n\" /* Trusted CA */\n             \"\\n\"\n             \"LogLevel DEBUG3\\n\"\n             \"Subsystem sftp %s -l DEBUG2\\n\" /* SFTP server */\n             \"\\n\"\n             \"PasswordAuthentication yes\\n\"\n             \"PubkeyAuthentication yes\\n\"\n             \"\\n\"\n             \"StrictModes no\\n\"\n             \"\\n\"\n             \"%s\" /* UsePam */\n             \"\\n\"\n             \"Ciphers \"\n                \"aes256-gcm@openssh.com,aes256-ctr,aes256-cbc,\"\n                \"aes128-gcm@openssh.com,aes128-ctr,aes128-cbc\"\n             \"\\n\"\n             \"MACs \"\n                \"hmac-sha2-256-etm@openssh.com,hmac-sha1-etm@openssh.com,\"\n                \"hmac-sha2-512-etm@openssh.com,hmac-sha2-256,\"\n                \"hmac-sha1,hmac-sha2-512\"\n             \"\\n\"\n             \"GSSAPIKeyExchange no\\n\"\n             \"KexAlgorithms \"\n                \"ecdh-sha2-nistp256,ecdh-sha2-nistp384,\"\n                \"ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,\"\n                \"diffie-hellman-group14-sha256,diffie-hellman-group16-sha512,\"\n                \"diffie-hellman-group18-sha512\"\n             \"\\n\"\n             \"PubkeyAcceptedKeyTypes \"\n                \"rsa-sha2-256,rsa-sha2-256-cert-v01@openssh.com,\"\n                \"ecdsa-sha2-nistp256,ecdsa-sha2-nistp256-cert-v01@openssh.com,\"\n                \"ecdsa-sha2-nistp384,ecdsa-sha2-nistp384-cert-v01@openssh.com,\"\n                \"rsa-sha2-512,rsa-sha2-512-cert-v01@openssh.com,\"\n                \"ecdsa-sha2-nistp521,ecdsa-sha2-nistp521-cert-v01@openssh.com\"\n             \"\\n\"\n             \"AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES\\n\"\n             \"AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT\\n\"\n             \"AcceptEnv LC_IDENTIFICATION LC_ALL LC_LIBSSH\\n\"\n             \"\\n\"\n             \"PidFile %s\\n\" /* PID file */\n             \"%s\\n\"; /* The space for test-specific options */\n    const char usepam_yes[] =\n             \"UsePAM yes\\n\"\n             \"KbdInteractiveAuthentication yes\\n\";\n    const char usepam_no[] =\n             \"UsePAM no\\n\"\n             \"KbdInteractiveAuthentication no\\n\";\n    size_t sftp_sl_size = ARRAY_SIZE(sftp_server_locations);\n    const char *sftp_server, *usepam;\n    size_t i;\n    bool written = false;\n    int rc;\n\n    s->srv_pam = pam;\n    if (pam) {\n        usepam = usepam_yes;\n    } else {\n        usepam = usepam_no;\n    }\n\n    assert_non_null(s->socket_dir);\n\n    snprintf(sshd_path,\n             sizeof(sshd_path),\n             \"%s/sshd\",\n             s->socket_dir);\n\n    rc = lstat(sshd_path, &sb);\n    if (rc == 0 ) { /* The directory is already in place */\n        written = true;\n    }\n\n    if (!written) {\n        rc = mkdir(sshd_path, 0755);\n        assert_return_code(rc, errno);\n    }\n\n    snprintf(ed25519_hostkey,\n             sizeof(ed25519_hostkey),\n             \"%s/sshd/ssh_host_ed25519_key\",\n             s->socket_dir);\n\n#ifdef HAVE_DSA\n    snprintf(dsa_hostkey,\n             sizeof(dsa_hostkey),\n             \"%s/sshd/ssh_host_dsa_key\",\n             s->socket_dir);\n#endif /* HAVE_DSA */\n\n    snprintf(rsa_hostkey,\n             sizeof(rsa_hostkey),\n             \"%s/sshd/ssh_host_rsa_key\",\n             s->socket_dir);\n\n    snprintf(ecdsa_hostkey,\n             sizeof(ecdsa_hostkey),\n             \"%s/sshd/ssh_host_ecdsa_key\",\n             s->socket_dir);\n\n    snprintf(trusted_ca_pubkey,\n             sizeof(trusted_ca_pubkey),\n             \"%s/sshd/user_ca.pub\",\n             s->socket_dir);\n\n    if (!written) {\n        torture_write_file(ed25519_hostkey,\n                           torture_get_openssh_testkey(SSH_KEYTYPE_ED25519, 0));\n#ifdef HAVE_DSA\n        torture_write_file(dsa_hostkey,\n                           torture_get_testkey(SSH_KEYTYPE_DSS, 0));\n#endif /* HAVE_DSA */\n        torture_write_file(rsa_hostkey,\n                           torture_get_testkey(SSH_KEYTYPE_RSA, 0));\n        torture_write_file(ecdsa_hostkey,\n                           torture_get_testkey(SSH_KEYTYPE_ECDSA_P521, 0));\n        torture_write_file(trusted_ca_pubkey, torture_rsa_certauth_pub);\n    }\n\n    sftp_server = getenv(\"TORTURE_SFTP_SERVER\");\n    if (sftp_server == NULL) {\n        for (i = 0; i < sftp_sl_size; i++) {\n            sftp_server = sftp_server_locations[i];\n            rc = lstat(sftp_server, &sb);\n            if (rc == 0) {\n                break;\n            }\n        }\n    }\n    assert_non_null(sftp_server);\n\n    additional_config = (s->srv_additional_config != NULL ?\n                         s->srv_additional_config : \"\");\n\n    if (ssh_fips_mode()) {\n        snprintf(sshd_config, sizeof(sshd_config),\n                fips_config_string,\n                \"HostKey\", rsa_hostkey,\n                \"HostKey\", ecdsa_hostkey,\n                trusted_ca_pubkey,\n                sftp_server,\n                usepam,\n                s->srv_pidfile,\n                additional_config);\n    } else {\n        snprintf(sshd_config, sizeof(sshd_config),\n                config_string,\n                \"HostKey\", ed25519_hostkey,\n#ifdef HAVE_DSA\n                \"HostKey\", dsa_hostkey,\n#endif /* HAVE_DSA */\n                \"HostKey\", rsa_hostkey,\n                \"HostKey\", ecdsa_hostkey,\n                trusted_ca_pubkey,\n                sftp_server,\n                usepam,\n                s->srv_pidfile,\n                additional_config);\n    }\n\n    torture_write_file(s->srv_config, sshd_config);\n}\n\nstatic int torture_wait_for_daemon(unsigned int seconds)\n{\n    struct ssh_timestamp start;\n    int rc;\n\n    ssh_timestamp_init(&start);\n\n    while (!ssh_timeout_elapsed(&start, seconds * 1000)) {\n        rc = system(SSH_PING_EXECUTABLE \" \" TORTURE_SSH_SERVER);\n        if (rc == 0) {\n            return 0;\n        }\n        /* Wait 200 ms before retrying */\n        usleep(200 * 1000);\n    }\n    return 1;\n}\n\nvoid torture_setup_sshd_server(void **state, bool pam)\n{\n    struct torture_state *s;\n    char sshd_start_cmd[1024];\n    int rc;\n\n    torture_setup_socket_dir(state);\n    torture_setup_create_sshd_config(state, pam);\n\n    /* Set the default interface for the server */\n    setenv(\"SOCKET_WRAPPER_DEFAULT_IFACE\", \"10\", 1);\n    setenv(\"PAM_WRAPPER\", \"1\", 1);\n\n    s = *state;\n\n    snprintf(sshd_start_cmd, sizeof(sshd_start_cmd),\n             SSHD_EXECUTABLE \" -r -f %s -E %s/sshd/daemon.log 2> %s/sshd/cwrap.log\",\n             s->srv_config, s->socket_dir, s->socket_dir);\n\n    rc = system(sshd_start_cmd);\n    assert_return_code(rc, errno);\n\n    setenv(\"SOCKET_WRAPPER_DEFAULT_IFACE\", \"21\", 1);\n    unsetenv(\"PAM_WRAPPER\");\n\n    /* Wait until the sshd is ready to accept connections */\n    rc = torture_wait_for_daemon(5);\n    assert_int_equal(rc, 0);\n}\n\nvoid torture_teardown_socket_dir(void **state)\n{\n    struct torture_state *s = *state;\n    char *env = getenv(\"TORTURE_SKIP_CLEANUP\");\n    int rc;\n\n    if (env != NULL && env[0] == '1') {\n        fprintf(stderr, \"[ TORTURE  ] >>> Skipping cleanup of %s\\n\", s->socket_dir);\n    } else {\n        rc = torture_rmdirs(s->socket_dir);\n        if (rc < 0) {\n            fprintf(stderr,\n                    \"torture_rmdirs(%s) failed: %s\",\n                    s->socket_dir,\n                    strerror(errno));\n        }\n    }\n#ifdef WITH_PCAP\n    if (s->plain_pcap != NULL) {\n        ssh_pcap_file_free(s->plain_pcap);\n    }\n    s->plain_pcap = NULL;\n#endif /* WITH_PCAP */\n\n    free(s->srv_config);\n    free(s->socket_dir);\n    free(s->pcap_file);\n    free(s->srv_pidfile);\n    free(s->srv_additional_config);\n    free(s);\n}\n\nstatic int\ntorture_reload_sshd_server(void **state)\n{\n    struct torture_state *s = *state;\n    pid_t pid;\n    int rc;\n\n    /* read the pidfile */\n    pid = torture_read_pidfile(s->srv_pidfile);\n    assert_int_not_equal(pid, -1);\n\n    kill(pid, SIGHUP);\n\n    /* 10 ms */\n    usleep(10 * 1000);\n\n    rc = kill(pid, 0);\n    if (rc != 0) {\n        fprintf(stderr,\n                \"ERROR: SSHD process %u died during reload!\\n\", pid);\n        return SSH_ERROR;\n    }\n\n    /* Wait until the sshd is ready to accept connections */\n    rc = torture_wait_for_daemon(5);\n    assert_int_equal(rc, 0);\n    return SSH_OK;\n}\n\n/* @brief: Updates SSHD server configuration with more options and\n *         reloads the server to apply them.\n * Note, that this still uses the default configuration options specified\n * in this file and overwrites options previously specified by this function.\n */\nint\ntorture_update_sshd_config(void **state, const char *config)\n{\n    struct torture_state *s = *state;\n    int rc;\n\n    /* Store the configuration in internal structure */\n    SAFE_FREE(s->srv_additional_config);\n    s->srv_additional_config = strdup(config);\n    assert_non_null(s->srv_additional_config);\n\n    /* Rewrite the configuration file */\n    torture_setup_create_sshd_config(state, s->srv_pam);\n\n    /* Reload the server */\n    rc = torture_reload_sshd_server(state);\n    assert_int_equal(rc, SSH_OK);\n\n    return SSH_OK;\n}\n\n\nvoid torture_teardown_sshd_server(void **state)\n{\n    struct torture_state *s = *state;\n    int rc;\n\n    rc = torture_terminate_process(s->srv_pidfile);\n    if (rc != 0) {\n        fprintf(stderr, \"XXXXXX Failed to terminate sshd\\n\");\n    }\n\n    torture_teardown_socket_dir(state);\n}\n\nchar *torture_make_temp_dir(const char *template)\n{\n    char *new_dir = NULL;\n    char *template_copy = NULL;\n\n    if (template == NULL) {\n        goto end;\n    }\n\n    template_copy = strdup(template);\n    if (template_copy == NULL) {\n        goto end;\n    }\n\n    new_dir = mkdtemp(template_copy);\n    if (new_dir == NULL) {\n        SAFE_FREE(template_copy);\n    }\n\nend:\n    return template_copy;\n}\n\nchar *torture_create_temp_file(const char *template)\n{\n    char *new_file = NULL;\n    FILE *fp = NULL;\n    mode_t mask;\n    int fd;\n\n    new_file = strdup(template);\n    if (new_file == NULL) {\n        goto end;\n    }\n\n    mask = umask(S_IRWXO | S_IRWXG);\n    fd = mkstemp(new_file);\n    umask(mask);\n    if (fd == -1) {\n        goto end;\n    }\n\n    fp = fdopen(fd, \"w\");\n    if (fp == NULL) {\n        SAFE_FREE(new_file);\n        close(fd);\n        goto end;\n    }\n\n    fclose(fp);\n\nend:\n    return new_file;\n}\n\nchar *torture_get_current_working_dir(void)\n{\n\n    char *cwd = NULL;\n    char *result = NULL;\n\n    cwd = (char *)malloc(PATH_MAX + 1);\n    if (cwd == NULL) {\n        goto end;\n    }\n\n    result = getcwd(cwd, PATH_MAX);\n\n    if (result == NULL) {\n        SAFE_FREE(cwd);\n        goto end;\n    }\n\nend:\n    return cwd;\n}\n\n#else /* _WIN32 */\n\nchar *torture_make_temp_dir(const char *template)\n{\n    DWORD rc = 0;\n    char tmp_dir_path[MAX_PATH];\n    char tmp_file_name[MAX_PATH];\n    char *prefix = NULL;\n    char *path = NULL;\n    char *prefix_end = NULL;\n    char *slash = NULL;\n\n    BOOL created;\n\n    if (template == NULL) {\n        goto end;\n    }\n\n    prefix = strdup(template);\n    if (prefix == NULL) {\n        goto end;\n    }\n\n    /* Replace slashes with backslashes */\n    slash = strchr(prefix, '/');\n    for (; slash != NULL; slash = strchr(prefix, '/')) {\n        *slash = '\\\\';\n    }\n\n    prefix_end = strstr(prefix, \"XXXXXX\");\n    if (prefix_end != NULL) {\n        *prefix_end = '\\0';\n    }\n\n    rc = GetTempPathA(MAX_PATH, tmp_dir_path);\n    if ((rc > MAX_PATH) || (rc == 0)) {\n        goto free_prefix;\n    }\n\n    rc = GetTempFileNameA(tmp_dir_path, TEXT(prefix), 0, tmp_file_name);\n    if (rc == 0) {\n        goto free_prefix;\n    }\n\n    path = strdup(tmp_file_name);\n    if (path == NULL) {\n        goto free_prefix;\n    }\n\n    /* GetTempFileNameA() creates a temporary file; we need to remove it */\n    rc = DeleteFileA(path);\n    if (rc == 0) {\n        rc = -1;\n        SAFE_FREE(path);\n        goto free_prefix;\n    }\n\n    created = CreateDirectoryA(path, NULL);\n    if (!created) {\n        SAFE_FREE(path);\n    }\n\nfree_prefix:\n    SAFE_FREE(prefix);\nend:\n    return path;\n}\n\nstatic int recursive_rm_dir_content(const char *path)\n{\n    WIN32_FIND_DATA file_data;\n    HANDLE file_handle;\n    DWORD attributes;\n\n    DWORD last_error = 0;\n\n    char file_path[MAX_PATH];\n\n    int rc = 0;\n    BOOL removed;\n\n    strcpy(file_path, path);\n    strcat(file_path, \"\\\\*\");\n\n    file_handle = FindFirstFile(file_path, &file_data);\n\n    if (file_handle == INVALID_HANDLE_VALUE) {\n        last_error = GetLastError();\n\n        /* Empty directory */\n        if (last_error == ERROR_FILE_NOT_FOUND) {\n            rc = 0;\n        }\n        else {\n            /*TODO print error message?*/\n            rc = last_error;\n        }\n        goto end;\n    }\n    else {\n        do {\n            rc = strcmp(file_data.cFileName, \".\");\n            if (rc == 0) {\n                continue;\n            }\n\n            rc = strcmp(file_data.cFileName, \"..\");\n            if (rc == 0) {\n                continue;\n            }\n\n            /* Create full file path */\n            strcpy(file_path, path);\n            strcat(file_path, \"\\\\\");\n            strcat(file_path, file_data.cFileName);\n\n            attributes = GetFileAttributes(file_path);\n            if (attributes & FILE_ATTRIBUTE_DIRECTORY) {\n                rc = recursive_rm_dir_content((const char *)file_path);\n                if (rc != 0) {\n                    goto end;\n                }\n\n                removed = RemoveDirectoryA(file_path);\n\n                if (!removed) {\n                    last_error = GetLastError();\n\n                    /*TODO print error message?*/\n\n                    rc = last_error;\n                    goto end;\n                }\n            }\n            else {\n                rc = remove(file_path);\n                if (rc) {\n                    goto end;\n                }\n            }\n\n        } while(FindNextFile(file_handle, &file_data));\n\n        FindClose(file_handle);\n    }\n\nend:\n    return rc;\n}\n\nint torture_rmdirs(const char *path)\n{\n    int rc = 0;\n    BOOL removed;\n\n    rc = recursive_rm_dir_content(path);\n    if (rc) {\n        return rc;\n    }\n\n    removed = RemoveDirectoryA(path);\n    if (!removed) {\n        rc = -1;\n    }\n\n    return rc;\n}\n\nint torture_isdir(const char *path)\n{\n\n    DWORD attributes = 0;\n\n    attributes = GetFileAttributes(path);\n    if (attributes & FILE_ATTRIBUTE_DIRECTORY) {\n        return 1;\n    }\n\n    return 0;\n}\n\nchar *torture_create_temp_file(const char *template)\n{\n    DWORD rc = 0;\n    char tmp_dir_path[MAX_PATH];\n    char tmp_file_name[MAX_PATH];\n    char *prefix = NULL;\n    char *path = NULL;\n    char *prefix_end = NULL;\n    char *slash = NULL;\n\n    if (template == NULL) {\n        goto end;\n    }\n\n    prefix = strdup(template);\n    if (prefix == NULL) {\n        goto end;\n    }\n\n    /* Replace slashes with backslashes */\n    slash = strchr(prefix, '/');\n    for (; slash != NULL; slash = strchr(prefix, '/')) {\n        *slash = '\\\\';\n    }\n\n    prefix_end = strstr(prefix, \"XXXXXX\");\n    if (prefix_end != NULL) {\n        *prefix_end = '\\0';\n    }\n\n    rc = GetTempPathA(MAX_PATH, tmp_dir_path);\n    if ((rc > MAX_PATH) || (rc == 0)) {\n        goto free_prefix;\n    }\n\n    /* Remark: this function creates the file */\n    rc = GetTempFileNameA(tmp_dir_path, TEXT(prefix), 0, tmp_file_name);\n    if (rc == 0) {\n        goto free_prefix;\n    }\n\n    path = strdup(tmp_file_name);\n\nfree_prefix:\n    SAFE_FREE(prefix);\nend:\n    return path;\n}\n\nchar *torture_get_current_working_dir(void)\n{\n    char *cwd = NULL;\n    char *result = NULL;\n\n    cwd = (char *)malloc(_MAX_PATH + 1);\n    if (cwd == NULL) {\n        goto end;\n    }\n\n    result = _getcwd(cwd, _MAX_PATH);\n\n    if (result == NULL) {\n        SAFE_FREE(cwd);\n        goto end;\n    }\n\nend:\n    return cwd;\n}\n\n#endif /* _WIN32 */\n\nint torture_change_dir(char *path)\n{\n    int rc = 0;\n\n    if (path == NULL) {\n        rc = -1;\n        goto end;\n    }\n\n    rc = chdir(path);\n\nend:\n    return rc;\n}\n\nint torture_libssh_verbosity(void){\n  return verbosity;\n}\n\nvoid _torture_filter_tests(struct CMUnitTest *tests, size_t ntests)\n{\n    (void) tests;\n    (void) ntests;\n\n    return;\n}\n\nvoid torture_write_file(const char *filename, const char *data){\n    int fd;\n    int rc;\n\n    assert_non_null(filename);\n    assert_true(filename[0] != '\\0');\n    assert_non_null(data);\n\n    fd = open(filename, O_WRONLY | O_TRUNC | O_CREAT, 0600);\n    assert_true(fd >= 0);\n\n    rc = write(fd, data, strlen(data));\n    assert_int_equal(rc, strlen(data));\n\n    close(fd);\n}\n\nvoid torture_reset_config(ssh_session session)\n{\n    memset(session->opts.options_seen, 0, sizeof(session->opts.options_seen));\n}\n\nint main(int argc, char **argv) {\n    struct argument_s arguments;\n    char *env = getenv(\"LIBSSH_VERBOSITY\");\n\n    arguments.verbose=0;\n    arguments.pattern=NULL;\n    torture_cmdline_parse(argc, argv, &arguments);\n    verbosity=arguments.verbose;\n    pattern=arguments.pattern;\n\n    if (verbosity == 0 && env != NULL && env[0] != '\\0') {\n        if (env[0] > '0' && env[0] < '9') {\n            verbosity = atoi(env);\n        }\n    }\n\n#if defined HAVE_CMOCKA_SET_TEST_FILTER\n    cmocka_set_test_filter(pattern);\n#endif\n\n    return torture_run_tests();\n}\n"
  },
  {
    "path": "src/libssh/tests/torture.h",
    "content": "/*\n * torture.c - torture library for testing libssh\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2008-2009 by Andreas Schneider <asn@cryptomilk.org>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#ifndef _TORTURE_H\n#define _TORTURE_H\n\n#ifndef _GNU_SOURCE\n#define _GNU_SOURCE\n#endif\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <stdarg.h>\n#include <stddef.h>\n#include <setjmp.h>\n\n#include \"libssh/priv.h\"\n#include \"libssh/server.h\"\n#include \"libssh/sftp.h\"\n\n#include <cmocka.h>\n\n#include \"torture_cmocka.h\"\n#include \"tests_config.h\"\n\n#ifndef assert_return_code\n/* hack for older versions of cmocka */\n#define assert_return_code(code, errno) \\\n    assert_true(code >= 0)\n#endif /* assert_return_code */\n\n#define TORTURE_SSH_SERVER \"127.0.0.10\"\n#define TORTURE_SSH_USER_BOB \"bob\"\n#define TORTURE_SSH_USER_BOB_PASSWORD \"secret\"\n\n#define TORTURE_SSH_USER_ALICE \"alice\"\n\n/* Used by main to communicate with parse_opt. */\nstruct argument_s {\n  const char *pattern;\n  int verbose;\n};\n\nstruct torture_sftp {\n    ssh_session ssh;\n    sftp_session sftp;\n    char *testdir;\n};\n\nstruct torture_state {\n    char *socket_dir;\n    char *pcap_file;\n    char *srv_pidfile;\n    char *srv_config;\n    bool srv_pam;\n    char *srv_additional_config;\n    struct {\n        ssh_session session;\n        struct torture_sftp *tsftp;\n    } ssh;\n#ifdef WITH_PCAP\n    ssh_pcap_file plain_pcap;\n#endif\n};\n\n#ifndef ZERO_STRUCT\n#define ZERO_STRUCT(x) memset((char *)&(x), 0, sizeof(x))\n#endif\n\nvoid torture_cmdline_parse(int argc, char **argv, struct argument_s *arguments);\n\nint torture_rmdirs(const char *path);\nint torture_isdir(const char *path);\n\nint torture_terminate_process(const char *pidfile);\n\n/*\n * Returns the verbosity level asked by user\n */\nint torture_libssh_verbosity(void);\n\nssh_session torture_ssh_session(struct torture_state *s,\n                                const char *host,\n                                const unsigned int *port,\n                                const char *user,\n                                const char *password);\n\nssh_bind torture_ssh_bind(const char *addr,\n                          const unsigned int port,\n                          enum ssh_keytypes_e key_type,\n                          const char *private_key_file);\n\nstruct torture_sftp *torture_sftp_session(ssh_session session);\nvoid torture_sftp_close(struct torture_sftp *t);\n\nvoid torture_write_file(const char *filename, const char *data);\n\n#define torture_filter_tests(tests) _torture_filter_tests(tests, sizeof(tests) / sizeof(tests)[0])\nvoid _torture_filter_tests(struct CMUnitTest *tests, size_t ntests);\n\nconst char *torture_server_address(int domain);\nint torture_server_port(void);\n\nvoid torture_setup_socket_dir(void **state);\nvoid torture_setup_sshd_server(void **state, bool pam);\n\nvoid torture_teardown_socket_dir(void **state);\nvoid torture_teardown_sshd_server(void **state);\n\nint torture_update_sshd_config(void **state, const char *config);\n\nvoid torture_reset_config(ssh_session session);\n\n/*\n * This function must be defined in every unit test file.\n */\nint torture_run_tests(void);\n\nchar *torture_make_temp_dir(const char *template);\nchar *torture_create_temp_file(const char *template);\n\nchar *torture_get_current_working_dir(void);\nint torture_change_dir(char *path);\n\n#endif /* _TORTURE_H */\n"
  },
  {
    "path": "src/libssh/tests/torture_cmocka.c",
    "content": "/*\n * torture.c - torture library for testing libssh\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2018      by Andreas Schneider <asn@cryptomilk.org>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include \"torture.h\"\n\nvoid _assert_ssh_return_code(ssh_session session,\n                             int rc,\n                             const char * const file,\n                             const int line)\n{\n    char ssh_error[1024] = {0};\n\n    if (session != NULL) {\n        snprintf(ssh_error,\n                 sizeof(ssh_error),\n                 \"ERROR: Invalid return code - %s\",\n                 ssh_get_error(session));\n    } else {\n        snprintf(ssh_error,\n                 sizeof(ssh_error),\n                 \"ERROR: Invalid return code\");\n    }\n\n    _assert_true(rc == SSH_OK,\n                 ssh_error,\n                 file,\n                 line);\n}\n\nvoid _assert_ssh_return_code_equal(ssh_session session,\n                                   int rc,\n                                   int expected_rc,\n                                   const char * const file,\n                                   const int line)\n{\n    char ssh_error[1024] = {0};\n\n    if (session != NULL) {\n        snprintf(ssh_error,\n                 sizeof(ssh_error),\n                 \"ERROR: Invalid return code - %s\",\n                 ssh_get_error(session));\n    } else {\n        snprintf(ssh_error,\n                 sizeof(ssh_error),\n                 \"ERROR: Invalid return code\");\n    }\n\n    _assert_true((rc == expected_rc),\n                 ssh_error,\n                 file,\n                 line);\n}\n\nvoid _assert_ssh_return_code_not_equal(ssh_session session,\n                                       int rc,\n                                       int unexpected_rc,\n                                       const char * const file,\n                                       const int line)\n{\n    char ssh_error[1024] = {0};\n\n    if (session != NULL) {\n        snprintf(ssh_error,\n                 sizeof(ssh_error),\n                 \"ERROR: Invalid return code - %s\",\n                 ssh_get_error(session));\n    } else {\n        snprintf(ssh_error,\n                 sizeof(ssh_error),\n                 \"ERROR: Invalid return code\");\n    }\n\n    _assert_true((rc != unexpected_rc),\n                 ssh_error,\n                 file,\n                 line);\n}\n"
  },
  {
    "path": "src/libssh/tests/torture_cmocka.h",
    "content": "/*\n * torture.c - torture library for testing libssh\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2018      by Andreas Schneider <asn@cryptomilk.org>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#ifndef _TORTURE_CMOCKA_H\n#define _TORTURE_CMOCKA_H\n\n#include \"libssh/session.h\"\n\nvoid _assert_ssh_return_code(ssh_session session,\n                             int rc,\n                             const char * const file,\n                             const int line);\n\n#define assert_ssh_return_code(session, rc) \\\n    _assert_ssh_return_code((session), (rc), __FILE__, __LINE__)\n\nvoid _assert_ssh_return_code_equal(ssh_session session,\n                                   int rc,\n                                   int expected_rc,\n                                   const char * const file,\n                                   const int line);\n\n#define assert_ssh_return_code_equal(session, rc, expected_rc) \\\n    _assert_ssh_return_code_equal((session), (rc), (expected_rc), __FILE__, __LINE__)\n\nvoid _assert_ssh_return_code_not_equal(ssh_session session,\n                                       int rc,\n                                       int expected_rc,\n                                       const char * const file,\n                                       const int line);\n\n#define assert_ssh_return_code_not_equal(session, rc, unexpected_rc) \\\n    _assert_ssh_return_code_not_equal((session), (rc), (unexpected_rc), __FILE__, __LINE__)\n\n#endif /* _TORTURE_CMOCKA_H */\n"
  },
  {
    "path": "src/libssh/tests/torture_key.c",
    "content": "/*\n * torture_key.c - torture library for testing libssh\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2008-2009 by Andreas Schneider <asn@cryptomilk.org>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#include <libssh/priv.h>\n\n#include \"torture.h\"\n#include \"torture_key.h\"\n\n/****************************************************************************\n * DSA KEYS\n ****************************************************************************/\nstatic const char torture_rsa_private_testkey[] =\n        \"-----BEGIN RSA PRIVATE KEY-----\\n\"\n        \"MIIEowIBAAKCAQEArAOREUWlBXJAKZ5hABYyxnRayDZP1bJeLbPVK+npxemrhHyZ\\n\"\n        \"gjdbY3ADot+JRyWjvll2w2GI+3blt0j+x/ZWwjMKu/QYcycYp5HL01goxOxuusZb\\n\"\n        \"i+KiHRGB6z0EMdXM7U82U7lA/j//HyZppyDjUDniWabXQJge8ksGXGTiFeAJ/687\\n\"\n        \"uV+JJcjGPxAGFQxzyjitf/FrL9S0WGKZbyqeGDzyeBZ1NLIuaiOORyLGSW4duHLD\\n\"\n        \"N78EmsJnwqg2gJQmRSaD4BNZMjtbfiFcSL9Uw4XQFTsWugUDEY1AU4c5g11nhzHz\\n\"\n        \"Bi9qMOt5DzrZQpD4j0gA2LOHpHhoOdg1ZuHrGQIDAQABAoIBAFJTaqy/jllq8vZ4\\n\"\n        \"TKiD900wBvrns5HtSlHJTe80hqQoT+Sa1cWSxPR0eekL32Hjy9igbMzZ83uWzh7I\\n\"\n        \"mtgNODy9vRdznfgO8CfTCaBfAzQsjFpr8QikMT6EUI/LpiRL1UaGsNOlSEvnSS0Z\\n\"\n        \"b1uDzAdrjL+nsEHEDJud+K9jwSkCRifVMy7fLfaum+YKpdeEz7K2Mgm5pJ/Vg+9s\\n\"\n        \"vI2V1q7HAOI4eUVTgJNHXy5ediRJlajQHf/lNUzHKqn7iH+JRl01gt62X8roG62b\\n\"\n        \"TbFylbheqMm9awuSF2ucOcx+guuwhkPir8BEMb08j3hiK+TfwPdY0F6QH4OhiKK7\\n\"\n        \"MTqTVgECgYEA0vmmu5GOBtwRmq6gVNCHhdLDQWaxAZqQRmRbzxVhFpbv0GjbQEF7\\n\"\n        \"tttq3fjDrzDf6CE9RtZWw2BUSXVq+IXB/bXb1kgWU2xWywm+OFDk9OXQs8ui+MY7\\n\"\n        \"FiP3yuq3YJob2g5CCsVQWl2CHvWGmTLhE1ODll39t7Y1uwdcDobJN+ECgYEA0LlR\\n\"\n        \"hfMjydWmwqooU9TDjXNBmwufyYlNFTH351amYgFUDpNf35SMCP4hDosUw/zCTDpc\\n\"\n        \"+1w04BJJfkH1SNvXSOilpdaYRTYuryDvGmWC66K2KX1nLErhlhs17CwzV997nYgD\\n\"\n        \"H3OOU4HfqIKmdGbjvWlkmY+mLHyG10bbpOTbujkCgYAc68xHejSWDCT9p2KjPdLW\\n\"\n        \"LYZGuOUa6y1L+QX85Vlh118Ymsczj8Z90qZbt3Zb1b9b+vKDe255agMj7syzNOLa\\n\"\n        \"/MseHNOyq+9Z9gP1hGFekQKDIy88GzCOYG/fiT2KKJYY1kuHXnUdbiQgSlghODBS\\n\"\n        \"jehD/K6DOJ80/FVKSH/dAQKBgQDJ+apTzpZhJ2f5k6L2jDq3VEK2ACedZEm9Kt9T\\n\"\n        \"c1wKFnL6r83kkuB3i0L9ycRMavixvwBfFDjuY4POs5Dh8ip/mPFCa0hqISZHvbzi\\n\"\n        \"dDyePJO9zmXaTJPDJ42kfpkofVAnfohXFQEy+cguTk848J+MmMIKfyE0h0QMabr9\\n\"\n        \"86BUsQKBgEVgoi4RXwmtGovtMew01ORPV9MOX3v+VnsCgD4/56URKOAngiS70xEP\\n\"\n        \"ONwNbTCWuuv43HGzJoVFiAMGnQP1BAJ7gkHkjSegOGKkiw12EPUWhFcMg+GkgPhc\\n\"\n        \"pOqNt/VMBPjJ/ysHJqmLfQK9A35JV6Cmdphe+OIl28bcKhAOz8Dw\\n\"\n        \"-----END RSA PRIVATE KEY-----\\n\";\n\nstatic const char torture_rsa_private_testkey_passphrase[] =\n        \"-----BEGIN RSA PRIVATE KEY-----\\n\"\n        \"Proc-Type: 4,ENCRYPTED\\n\"\n        \"DEK-Info: AES-128-CBC,5375534F40903DD66B3851A0DA03F6FA\\n\"\n        \"\\n\"\n        \"m5YYTNOMd1xCKfifwCX4R1iLJoAc4cn1aFiL7f2kBbfE2jF1LTQBJV1h1CqYZfAB\\n\"\n        \"WtM/7FkQPnKXqsMndP+v+1Xc+PYigE3AezJj/0g7xn/zIBwGjkLAp435AdL5i6Fg\\n\"\n        \"OhOL8LyolRrcGn17jE4S4iGbzw8PVyfzNzdj0Emwql5F6M7pgLbInRNKM/TF4z2h\\n\"\n        \"b6Pi9Bw43dwaJ7wiiy/vo/v4MyXsJBoeKbc4VCmxiYFvAYCvVFlDkyIw/QnR3MKQ\\n\"\n        \"g/Zsk7Pw3aOioxk6LJpZ5x0tO23nXDG1aOZHWykI0BpJV+LIpD2oSYOHJyVO83XT\\n\"\n        \"RQUMSTXc2K2+ejs0XQoLt/GxDDHe+8W8fWQK3C7Lyvl9oKjmb5sTWi3mdSv0C+zR\\n\"\n        \"n5KSVbUKNXrjix7qPKkv5rWqb84CKVnCMb7tWaPLR19nQqKVYBIs6v0OTTvS6Le7\\n\"\n        \"lz4lxBkcUy6vi0tWH9MvLuT+ugdHLJZ4UXBthCgV58pM1o+L+WMIl+SZXckiCAO3\\n\"\n        \"7ercA57695IA6iHskmr3eazJsYFEVFdR/cm+IDy2FPkKmJMjXeIWuh3yASBk7LBR\\n\"\n        \"EQq3CC7AioO+Vj8m/fEIiNZJSQ6p0NmgnPoO3rTYT/IobmE99/Ht6oNLmFX4Pr7e\\n\"\n        \"F4CGWKzwxWpCnw2vVolCFByASmZycbJvrIonZBKY1toU28lRm4tCM6eCNISVLMeE\\n\"\n        \"VtQ+1PH9/2KZspZl+SX/kjV3egggy0TFKRU8EcYPJFC3Vpy+shEai35KBVo44Z18\\n\"\n        \"apza7exm3igNEqOqe07hLs3Bjhvk1oS+WhMbAG9ARTOKuyBOJh/ZV9tFMNZ6v+q5\\n\"\n        \"TofgNcIhNYNascymU1io18xTW9c3RRcmRKqIWnj4EH8o7Aojv/l+zvdV7/GVlR4W\\n\"\n        \"pR9cuJEiyiEjS46axoc6dSOtdnvag+BpFQb+lGY97F9nNGyBdtLD5ASVh5OVG4fu\\n\"\n        \"Pf0O7Bdj1kIuBhV8axE/slf6UHANiodeqkR9B24+0Cy+miPiHazzUkbdSJ4r03g5\\n\"\n        \"J1Y5S8qbl9++sqhQMLMUkeK4pDWh1aocA9bDA2RcBNuXGiZeRFUiqxcBS+iO418n\\n\"\n        \"DFyWz4UfI/m1IRSjoo/PEpgu5GmosUzs3Dl4nAcf/REBEX6M/kKKxHTLjE8DxDsz\\n\"\n        \"fn/vfsXV3s0tbN7YyJdP8aU+ApZntw1OF2TS2qS8CPWHTcCGGTab5WEGC3xFXKp0\\n\"\n        \"uyonCxV7vNLOiIiHdQX+1bLu7ps7GBH92xGkPg7FrNNcMc07soP7jjjB578n9Gpl\\n\"\n        \"cIDBdgovTRFHiWu3yRspVt0zPfMJB/hqn+IAp98wfvjl8OZM1ZZkejnwXnQil5ZU\\n\"\n        \"wjEBEtx+nX56vdxipzKoHh5yDXmPbNajBYkg3rXJrLFh3Tsf0CzHcLdHNz/qJ9LO\\n\"\n        \"wH16grjR1Q0CzCW3FAv0Q0euqkXac+TfuIg3HiTPrBPnJQW1uivrx1F5tpO/uboG\\n\"\n        \"h28LwqJLYh+1T0V//uiy3SMATpYKvzg2byGct9VUib8QVop8LvVF/n42RaxtTCfw\\n\"\n        \"JSvUyxoaZUjQkT7iF94HsF+FVVJdI55UjgnMiZ0d5vKffWyTHYcYHkFYaSloAMWN\\n\"\n        \"-----END RSA PRIVATE KEY-----\\n\";\n\nstatic const char torture_rsa_private_pkcs8_testkey_passphrase[] =\n        \"-----BEGIN ENCRYPTED PRIVATE KEY-----\\n\"\n        \"MIIFLTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQI0RSm1ZXOBD8CAggA\\n\"\n        \"MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAECBBBS+59quuIVuxN/H9Wltk8TBIIE\\n\"\n        \"0J7OhRw35ANRyTU2qhlhS8NATcguoD1J4IMXpXpv38iCBWd2bjxvuWnEu4aBX7iU\\n\"\n        \"desfz9n6AoTVqURaOMLsv6EFV0tycf+mZsmdUmrD2270Wyj6TtQD8LO/7ibifCeL\\n\"\n        \"XCCKjxciueSggHp5lnfogZwn8wjSEDP7OqNVRTwm8QKNrE7J5m5giFrjXoyqKM7r\\n\"\n        \"DBa35UIZAXXY8z9CkI+GsyRtaZik3VD+xHShwUriOYg4x4VGZQLj24tjoUnqU4ml\\n\"\n        \"iRMhGyYpxN7CnfaIwHJr3T0dmbT/BIXOQ2B6sWakioZeUuA6OTBHbFTUN9TUHaF0\\n\"\n        \"rDMVmjL6BQcEiWwjvtw/3NLdkcKFjMiLTWA2GL71KPGCecpMmAMjo+ijnxeVhqpQ\\n\"\n        \"dnhowG92DhCSf/XZI0vaaYflrV54U9PgcSPDFWmTOVe5151Mi8eR9qrCanfyHmX1\\n\"\n        \"MLXs8Mw6xWedNj8AWLV3JGiWEeAEATuTAQfTqmBZbzaFKfSKp5PZjWxa5bZIomzS\\n\"\n        \"Q0AsONTeYmKK+Pv95RYlgR2kKqhwy3OmcOuepwnzSeAGh1BdBzd2raoipkq1fpY5\\n\"\n        \"8e75dJnTGvWfqfh0VXz/Wud+hMz/98Mh6Bnp9l+Ddxpp4RioWB2aH0HM8ZGTlbhf\\n\"\n        \"r5qFmDY7k+RfDDp7K7UYMA+2hHCxY1aFSHVYGRQKdYdKIugLtKx6YKLeGVCR7Gbm\\n\"\n        \"l/88qiGshF/qhdFbPb4K0Tz2Ug5uklveOQSkKX6RSZ30IW+N3E4nH/wvyOwbCPk7\\n\"\n        \"u+iHB2zzk2Hws4O52a0Gqj+RbeGzzhl1D9jH35GMHUsfhDSA3/mmrVC7hiN/Aplt\\n\"\n        \"2OmKFAkobZh/1UJAHBY9feIhLmQUy9dwy0E8G/0LEyyZYEizDC76jsvbh2cPg3jM\\n\"\n        \"JsI31qUaGggwh3wB034BvsYIf/ZqLCt8hAXF9U5U7T5y3r6FNNBla8zlj25ILog6\\n\"\n        \"t/bhOwFKYXamAVYMhhvUiA3YIYuBxT7MrgL7gDtKh3N/DleS/pLjmOFfMI3dfCd0\\n\"\n        \"KSQX46uw7aFbV0Has9uUuGle9Foq52QFvYnDHWJuIyOvJ5st1Hd3Mjjsl9t3JFVM\\n\"\n        \"I1aDZ17Z4LoThdezNQKGaAe5z7gGFMKKsm55CMT/7FxvConALeQKGAV6jA5xZzl4\\n\"\n        \"+QB14YlxlZTxYnXd/69KGV56wP8sb6uMVDC/f5Vd3oHsamJKpPgts8WCn11f9wFn\\n\"\n        \"Mx8YY/vBVVLQMw1aB+82Vk+Ix8YDYIPj5bJk2BkyCCUnMYkKswUOVzsdUq0xssEp\\n\"\n        \"PASw0YvQ9mY2aQ9exme99JuAj5t4qIXoYTSrX5iv6NXtzDHgTR1pl9gQQVQ0zAUO\\n\"\n        \"ZHKZXYAv5rLZKRcyeCLw0LkuthY2QtN3PsBlaRtfwZTaqUbBGbvEkcx5fxdEsasS\\n\"\n        \"yQkZKBBvIi42LUN9ZzywYNGbOanCZ04p/+QscmmnVGuDMZJyaDRaapW6f0nJQ+lQ\\n\"\n        \"CaVPRzLKGnHV5hWQDjTaPIh2s9rJSZJ3HyE8qshETHW/vQoYIcVB9TX5TnOY02Ak\\n\"\n        \"IINKfSZGgz/NBeJItjk30UuTcISk65ekoXZIHHgdxD9iHy9D0w6FXcPNLLsWQn7n\\n\"\n        \"jS4Bvt0VZ9zVAiyyVO4yAaMgP+saitYpjMgI8g67geD3\\n\"\n        \"-----END ENCRYPTED PRIVATE KEY-----\\n\";\n\nstatic const char torture_rsa_private_openssh_testkey_passphrase[] =\n        \"-----BEGIN OPENSSH PRIVATE KEY-----\\n\"\n        \"b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jdHIAAAAGYmNyeXB0AAAAGAAAABDX\\n\"\n        \"ClCBeHgYyOEqmWpAanz9AAAAEAAAAAEAAAEXAAAAB3NzaC1yc2EAAAADAQABAAAB\\n\"\n        \"AQDXvXuawzaArEwkLIXTz/EWywLOCtqQL3P9yKkrhz6AplXP2PhOh5pyxa1VfGKe\\n\"\n        \"453jNeYBJ0ROto3BshXgZXbo86oLXTkbe0gO5xi3r5WjXxjOFvRRTLot5fPLNDOv\\n\"\n        \"9+TnsPmkNn0iIeyPnfrcPIyjWt5zSWUfkNC8oNHxsiSshjpbJvTXSDipukpUy41d\\n\"\n        \"7jg4uWGuonMTF7yu7HfuHqq7lhb0WlwSpfbqAbfYARBddcdcARyhix4RMWZZqVY2\\n\"\n        \"0H3Vsjq8bjKC+NJXFce1PRg+qcOWQdlXEei4dkzAvHvfQRx1TjzkrBZ6B6thmZty\\n\"\n        \"eb9IsiB0tg2g0JN2VTAGkxqpAAADwG8gm8jZpx+GIKdhV+igcvYvIhzA+fz6UdXf\\n\"\n        \"d/8wnYzMXtg+Ys7XsKUsxtMD8HGPiuwYsTrd/YGiol7SpkJV0STqtW+UZrcKamJ5\\n\"\n        \"reFaDoIU8hhWTXCe/ogplTxH/zNNK7Xx5OAGnNWE3zsR1vbZaCv+Vwwa27eUCbpv\\n\"\n        \"V1+92nBwkah3FCKCbwYDvTVRn1TZHQwnuNxDCRrlwaMjf8eX2ssqLLX7jqrb3j1u\\n\"\n        \"c28GR3fNJ8ENaWshZ77tqexUQCnCx14/qtT434CMvENXnCP5BP/cRmbOlCFQ6Id7\\n\"\n        \"nLMW0uDIy/q3xBsAcdMyV0LJW7sJNXIjTnS4lyXd0XescXrqTAKxTkqd1E0VIBpc\\n\"\n        \"37+7vqv9A9Xxq74jy//L9L4Yrbijc9Vt+oNWFgOuakZGBLIQvm36Oqb0z0oWJcUt\\n\"\n        \"VdZcvkCNMeixBqCnrQ8egO3x0pnZwo6cwH586Me8FgFacOnzWjzuQT6vYJ4EK5ch\\n\"\n        \"YNRQpjtz5+T3rZK7eIF1ZUobM4S6di7A6lW9tycQVhjo5XlhalMfCfajhazgcIrY\\n\"\n        \"Qdaq8+AguP8H+3bvXPZmitL8/mv5uVjqxy1lYh2xLzViTmFnvfdbZ92BWI9C6JBI\\n\"\n        \"+mRWzXeEY71MjfeEaPStwBm5OYBMFwYrXPL7E3JjAXRxbB+LKUksj/lRk3K7aQp4\\n\"\n        \"IDKCzAACgkOixfP39BgKQkrLjAoi6mEDqu5Ajc3GoljXsJEkcbu0j+0tVth+41nV\\n\"\n        \"8yCkP5SVUQTCSKzoduE+0pk6oYO6vrwKLM62cQRPXLl/XNoUqETIe8dklIKojYo6\\n\"\n        \"3ho1RaHgYr9/NAS0029CFt/rGmONWF9ihKON6wMavJRcofZ25FeylKiP2rrqdDIb\\n\"\n        \"EiWULZi3MUJfKBwSeZMwaYYmSpaOZF1U/MgvEfeRkE1UmDp3FmBLSNHBYhAxNazH\\n\"\n        \"R393BTr1zk7h+8s7QK986ZtcKkyUNXEK1NkLLuKlqMwFnjiOdeAIGwz9NEn+Tj60\\n\"\n        \"jE5IcCE06B6ze/MOZcsPp1SoZv4kKmgWY5Gdqv/9O9SyFQ0Yh4MvBSD8l4x0epId\\n\"\n        \"8Xm54ISVWP1SZ1x3Oe8yvtwOGqDkZeOVjnP7EQ7R0+1PZzW5P/x47skACqadGChN\\n\"\n        \"ahbngIl+EhPOqhx+wIfDbtzTmGABgNhcI/d02b8py5MXFnA+uzeSucDREYRdm2TO\\n\"\n        \"TQQ2CtxB6lcatIYG4AhyouQbujLd/AwpZJ05S1i/Qt6NenTgK3YyTWdXLQnjZSMx\\n\"\n        \"FBRkf+Jj9eVXieT4PJKtWuvxNNrJVA==\\n\"\n        \"-----END OPENSSH PRIVATE KEY-----\\n\";\n\nstatic const char torture_rsa_private_openssh_testkey[] =\n        \"-----BEGIN OPENSSH PRIVATE KEY-----\\n\"\n        \"b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABFwAAAAdz\\n\"\n        \"c2gtcnNhAAAAAwEAAQAAAQEA1717msM2gKxMJCyF08/xFssCzgrakC9z/cipK4c+\\n\"\n        \"gKZVz9j4ToeacsWtVXxinuOd4zXmASdETraNwbIV4GV26POqC105G3tIDucYt6+V\\n\"\n        \"o18Yzhb0UUy6LeXzyzQzr/fk57D5pDZ9IiHsj5363DyMo1rec0llH5DQvKDR8bIk\\n\"\n        \"rIY6Wyb010g4qbpKVMuNXe44OLlhrqJzExe8rux37h6qu5YW9FpcEqX26gG32AEQ\\n\"\n        \"XXXHXAEcoYseETFmWalWNtB91bI6vG4ygvjSVxXHtT0YPqnDlkHZVxHouHZMwLx7\\n\"\n        \"30EcdU485KwWegerYZmbcnm/SLIgdLYNoNCTdlUwBpMaqQAAA7iQHqVWkB6lVgAA\\n\"\n        \"AAdzc2gtcnNhAAABAQDXvXuawzaArEwkLIXTz/EWywLOCtqQL3P9yKkrhz6AplXP\\n\"\n        \"2PhOh5pyxa1VfGKe453jNeYBJ0ROto3BshXgZXbo86oLXTkbe0gO5xi3r5WjXxjO\\n\"\n        \"FvRRTLot5fPLNDOv9+TnsPmkNn0iIeyPnfrcPIyjWt5zSWUfkNC8oNHxsiSshjpb\\n\"\n        \"JvTXSDipukpUy41d7jg4uWGuonMTF7yu7HfuHqq7lhb0WlwSpfbqAbfYARBddcdc\\n\"\n        \"ARyhix4RMWZZqVY20H3Vsjq8bjKC+NJXFce1PRg+qcOWQdlXEei4dkzAvHvfQRx1\\n\"\n        \"TjzkrBZ6B6thmZtyeb9IsiB0tg2g0JN2VTAGkxqpAAAAAwEAAQAAAQAdjR3uQAkq\\n\"\n        \"LO+tENAwCE680YgL0x7HG0jnHWJWzQq5so8UjmLM1vRH/l3U1Nnpa8JHyi08QTWx\\n\"\n        \"Fn5qZstqVluoYyAKuHVHF2bya6NOHeYAX9lU+X3z2O+zs8jmL7tYwjr/pZU8ch5H\\n\"\n        \"25+8uGYRXtXg1mScJBSO81Y0UE8RrVYqr2Os583yB657kYiVYYYSZlRGd9wmfXnJ\\n\"\n        \"w0t8LaYcTn+i/lOvrJGa0Q0iV6+4rYmjwYd/D/vyNzF31hUEFrn3vDSgTnJdShgH\\n\"\n        \"VqW0OwNuEDe/4p8KkKR1EVVj6xv4zicwouY7aQI+zT3MwAzvNdvYwytsIj6bhT9x\\n\"\n        \"oyeAAIW0vaKVAAAAgQD6pPfu6tb7DiTlaH3/IPdGh3PTIf0zXHZ/ygxORXBZdoLY\\n\"\n        \"Fq2h/YnBd2Hs8vARAjGJYs78gTPP0FVXPV8ut38xct4DQ2hbPMrjWv5gdhDazq8Q\\n\"\n        \"qaFEa0+DeYONej8ItKwpsV2Rskkv5Pfm7M6EffVty1uzOpIcT8RYDAYUlc5D/wAA\\n\"\n        \"AIEA+44ykLho3BDWnUzshVEm6iNoqlZqcDVcNSpCuYDnCy5UrTDk0zj+OUG9M0Zx\\n\"\n        \"4c7kAmu/poXSimgAgMh9GNCzy3+a70WvH+fBqvG5tXLaSOQCswSdQjltANAnlt5L\\n\"\n        \"YDHzGGJBsS4pYxoz22MKhFbpYUCQJvotXnZJpTQU6hdFRX8AAACBANuNSlFq/vG8\\n\"\n        \"Vf9c2YsPiITmOrYxpUDMiMLvUGQOdyIIc45EAggOFHNF3AdPZEhinpD92EK+LiJc\\n\"\n        \"WYJ26muVcicZoddgmpcHRt2gByC+ckWOM4sLpih6EyQLFZfqTx2X+KOI0ZTt7zEi\\n\"\n        \"zfm1MJUNDFOr3DM0VBIf34Bn1hU/isPXAAAAAAEC\\n\"\n        \"-----END OPENSSH PRIVATE KEY-----\\n\";\n\n\nstatic const char torture_rsa_public_testkey[] =\n        \"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCsA5ERRaUFckApnmEAFjLGdFrIN\"\n        \"k/Vsl4ts9Ur6enF6auEfJmCN1tjcAOi34lHJaO+WXbDYYj7duW3SP7H9lbCMwq79B\"\n        \"hzJxinkcvTWCjE7G66xluL4qIdEYHrPQQx1cztTzZTuUD+P/8fJmmnIONQOeJZptd\"\n        \"AmB7ySwZcZOIV4An/rzu5X4klyMY/EAYVDHPKOK1/8Wsv1LRYYplvKp4YPPJ4FnU0\"\n        \"si5qI45HIsZJbh24csM3vwSawmfCqDaAlCZFJoPgE1kyO1t+IVxIv1TDhdAVOxa6B\"\n        \"QMRjUBThzmDXWeHMfMGL2ow63kPOtlCkPiPSADYs4ekeGg52DVm4esZ \"\n        \"aris@aris-air\\n\";\n\nstatic const char torture_rsa_testkey_cert[] =\n        \"ssh-rsa-cert-v01@openssh.com AAAAHHNzaC1yc2EtY2VydC12MDFAb3BlbnNz\"\n        \"aC5jb20AAAAgL77S/SgY969FbEtNBsbLvvtGFgnEHaPb+V7ajwuf+R0AAAADAQABA\"\n        \"AABAQCsA5ERRaUFckApnmEAFjLGdFrINk/Vsl4ts9Ur6enF6auEfJmCN1tjcAOi34\"\n        \"lHJaO+WXbDYYj7duW3SP7H9lbCMwq79BhzJxinkcvTWCjE7G66xluL4qIdEYHrPQQ\"\n        \"x1cztTzZTuUD+P/8fJmmnIONQOeJZptdAmB7ySwZcZOIV4An/rzu5X4klyMY/EAYV\"\n        \"DHPKOK1/8Wsv1LRYYplvKp4YPPJ4FnU0si5qI45HIsZJbh24csM3vwSawmfCqDaAl\"\n        \"CZFJoPgE1kyO1t+IVxIv1TDhdAVOxa6BQMRjUBThzmDXWeHMfMGL2ow63kPOtlCkP\"\n        \"iPSADYs4ekeGg52DVm4esZAAAAAAAAAAAAAAABAAAADmxpYnNzaF90b3J0dXJlAAA\"\n        \"AAAAAAAAAAAAA//////////8AAAAAAAAAggAAABVwZXJtaXQtWDExLWZvcndhcmRp\"\n        \"bmcAAAAAAAAAF3Blcm1pdC1hZ2VudC1mb3J3YXJkaW5nAAAAAAAAABZwZXJtaXQtc\"\n        \"G9ydC1mb3J3YXJkaW5nAAAAAAAAAApwZXJtaXQtcHR5AAAAAAAAAA5wZXJtaXQtdX\"\n        \"Nlci1yYwAAAAAAAAAAAAABFwAAAAdzc2gtcnNhAAAAAwEAAQAAAQEAoowcv2Gn8tO\"\n        \"eDyw/lgdMpoBsLtHTTdVVOOo5HwMFvj/lFkbZlb6J2n9GIE64HNPE45vSnIdJZwz4\"\n        \"UYfTvtnNKNHp1MgMrjK1Z6EjyZsGqDZ+BhmvcKA6IckkhBJnDV7U9dMrovAWha61Z\"\n        \"9GpDqB1naRfbwqJQwSRHF1p71Cnf0fZKxOhAVx0ophmYGz3x3qq4PeOZv3Yl0AHTV\"\n        \"dRmqmeELDUxeuXN2bgSyb881zEgdaKHH5oWySykP4uwjn6T7ETuL2MsDdG3HZHDhn\"\n        \"LzLmfzOZ/cNadMCrgauMluQKc5dYF2TSeDaUxwun/NPMQBVZdETHLAMBgkGmhRUku\"\n        \"flVDIQAAAQ8AAAAHc3NoLXJzYQAAAQADSp4b/Zta8zs6v47iwmxV2Gbucvt1kDrvT\"\n        \"vKAKSbGN0+zoMyXiNfMHM/OvZObDS/WWGs4GMRqbJavwO3ja/dQY17oJss23lZ+Rc\"\n        \"Lw4Rqsi3/ZEPCnX6ficiRS/yRN/LAkoXvx9vBx9QHfxlzF6JXq07wTt21zxW0tntd\"\n        \"8dL+JI9ZZ9YylnxF3gHqfRFe2ahJpiywmxm0yOZgDmimOhep59i6BH5zHiPALvpge\"\n        \"Mbk075oA5K9XKsHTflCcsQRQH+pXqaNQGL37z2CFz9oezxQYvIqqKF0w/eeRIARoA\"\n        \"neB6OdgTpKFsmgPZVtqrvhjw+b5T8a4W4iWSl+6wg6gowAm \"\n        \"rsa_privkey.pub\\n\";\n\n/****************************************************************************\n * DSA KEYS\n ****************************************************************************/\n\nstatic const char torture_dsa_private_testkey[] =\n        \"-----BEGIN DSA PRIVATE KEY-----\\n\"\n        \"MIIBuwIBAAKBgQCUyvVPEkn3UnZDjzCzSzSHpTltzr0Ec+1mz/JACjHMBJ9C/W/P\\n\"\n        \"wvH3yjkfoFhhREvoY7IPnwAu5bcxw8TkISq7YROQ409PqwwPvy0N3GUp/+kKS268\\n\"\n        \"BIJ+VKN513XRf7eL1e4aHUJ+al9x1JxTmc6T0GBq1lyu+CTUUyh25aNDFwIVAK84\\n\"\n        \"j20GmU+zewjQwsIXuVb6C/PHAoGAXhuIVsJxUQJ5nWQRLf7o3XEGQ+EcVmHOzMB1\\n\"\n        \"xCsHjYnpEhhco+r/HDZSD31kzDeAZUycz31WqGL8yXr+OZRLqEsGC7dwEAzPiXDu\\n\"\n        \"l0zHcl0yiKPrRrLgNJHeKcT6JflBngK7jQRIVUg3F3104fbVa2rwaniLl4GSBZPX\\n\"\n        \"MpUdng8CgYB4roDQBfgf8AoSAJAb7y8OVvxt5cT7iqaRMQX2XgtW09Nu9RbUIVS7\\n\"\n        \"n2mw3iqZG0xnG3iv1oL9gwNXMLlf+gLmsqU3788jaEZ9IhZ8VdgHAoHm6UWM7b2u\\n\"\n        \"ADmhirI6dRZUVO+/iMGUvDxa66OI4hDV055pbwQhtxupUatThyDzIgIVAI1Hd8/i\\n\"\n        \"Pzsg7bTzoNvjQL+Noyiy\\n\"\n        \"-----END DSA PRIVATE KEY-----\\n\";\n\nstatic const char torture_dsa_private_testkey_passphrase[] =\n        \"-----BEGIN DSA PRIVATE KEY-----\\n\"\n        \"Proc-Type: 4,ENCRYPTED\\n\"\n        \"DEK-Info: AES-128-CBC,266023B64B1B814BCD0D0E477257F06D\\n\"\n        \"\\n\"\n        \"QJQErZrvYsfeMNMnU+6yVHH5Zze/zUFdPip7Bon4T1wCGlVasn4x/GQcMm1+mgmb\\n\"\n        \"PCK/qJ5qw9nCepLYJq2xh8gohbwF/XKxeaNGcRA2+ancTooDUjeRTlk1WRtS1+bq\\n\"\n        \"LBkwhxLXW26lIuQUHzfi93rRqQI2LC4McngY7L7WVJer7sH7hk5//4Gf6zHtPEl+\\n\"\n        \"Tr2ub1zNrVbh6e1Bitw7DaGZNX6XEWpyTTsAd42sQWh6o23MC6GyfS1YFsPGHzGe\\n\"\n        \"WYQbWn2AZ1mK32z2mLZfVg41qu9RKG20iCyaczZ2YmuYyOkoLHijOAHC8vZbHwYC\\n\"\n        \"+lN9Yc8/BoMuMMwDTMDaJD0TsBX02hi9YI7Gu88PMCJO+SRe5400MonUMXTwCa91\\n\"\n        \"Tt3RhYpBzx2XGOq5199+oLdTJAaXHJcuB6viKNdSLBuhx6RAEJXZnVexchaHs4Q6\\n\"\n        \"HweIv6Et8MjVoqwkaQDmcIGA73qZ0lbUJFZAu2YDJ6TpHc1lHZes763HoMYfuvkX\\n\"\n        \"HTSuHZ7edjoWqwnl/vkc3+nG//IEj8LqAacx0i4krDcQpGuQ6BnPfwPFco2NQQpw\\n\"\n        \"wHBOL6HrOnD+gGs6DUFwzA==\\n\"\n        \"-----END DSA PRIVATE KEY-----\\n\";\n\nstatic const char torture_dsa_private_pkcs8_testkey_passphrase[] =\n        \"-----BEGIN ENCRYPTED PRIVATE KEY-----\\n\"\n        \"MIIBrTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQI8001emUNAOECAggA\\n\"\n        \"MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAECBBDgXXvQsVxY6zaAQVwzUwvDBIIB\\n\"\n        \"UOBQqqJs4rYK6R0rXFitkdUodOK3CdFAKodyCkSC5cgoW2+ht2ndRCepxuKB2X14\\n\"\n        \"Lvt1CIxPvu1k7bGnd25kePmNF85cJxG9wf0/+6vpptO3fTUdsUKyLcRKDqvxxOMB\\n\"\n        \"OSqQK1MLgvUxB5uBSGCsKqFkVUPYs46uihfozjqHH2IghHSQr+VczhFDoWtzgcgp\\n\"\n        \"nRNZiyXN5Thob5WOrL849TSlcaMyI3ssErEVP1G2t3ax5bLQ4AqDddumoRBed/XY\\n\"\n        \"lad5QGAS2XlwMFj8tR/Spi1fEWfamIsvh23ba5ksb35TT3SUJd2gf2NC7QEz3dUK\\n\"\n        \"YDSSeRSF24c4nXBsJ94TkVuUujo4X3QSaWQ2anYYBBwfQtrddVNVu95QS2sQGLov\\n\"\n        \"UWIhq1xXbnL/SGC6E5T1VGnAx3qwfDEZX5tTNzkwqeTZfkrb6vRk+O+Lxt67iP+n\\n\"\n        \"nw==\\n\"\n        \"-----END ENCRYPTED PRIVATE KEY-----\\n\";\n\nstatic const char torture_dsa_private_openssh_testkey_passphrase[] =\n        \"-----BEGIN OPENSSH PRIVATE KEY-----\\n\"\n        \"b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jdHIAAAAGYmNyeXB0AAAAGAAAABBC\\n\"\n        \"UZK61oXs3uKMs4l7G0cpAAAAEAAAAAEAAAGxAAAAB3NzaC1kc3MAAACBAJTK9U8S\\n\"\n        \"SfdSdkOPMLNLNIelOW3OvQRz7WbP8kAKMcwEn0L9b8/C8ffKOR+gWGFES+hjsg+f\\n\"\n        \"AC7ltzHDxOQhKrthE5DjT0+rDA+/LQ3cZSn/6QpLbrwEgn5Uo3nXddF/t4vV7hod\\n\"\n        \"Qn5qX3HUnFOZzpPQYGrWXK74JNRTKHblo0MXAAAAFQCvOI9tBplPs3sI0MLCF7lW\\n\"\n        \"+gvzxwAAAIBeG4hWwnFRAnmdZBEt/ujdcQZD4RxWYc7MwHXEKweNiekSGFyj6v8c\\n\"\n        \"NlIPfWTMN4BlTJzPfVaoYvzJev45lEuoSwYLt3AQDM+JcO6XTMdyXTKIo+tGsuA0\\n\"\n        \"kd4pxPol+UGeAruNBEhVSDcXfXTh9tVravBqeIuXgZIFk9cylR2eDwAAAIB4roDQ\\n\"\n        \"Bfgf8AoSAJAb7y8OVvxt5cT7iqaRMQX2XgtW09Nu9RbUIVS7n2mw3iqZG0xnG3iv\\n\"\n        \"1oL9gwNXMLlf+gLmsqU3788jaEZ9IhZ8VdgHAoHm6UWM7b2uADmhirI6dRZUVO+/\\n\"\n        \"iMGUvDxa66OI4hDV055pbwQhtxupUatThyDzIgAAAeAtGFEW6JZTeSumizZJI4T2\\n\"\n        \"Kha05Ze3juTeW+BMjqTcf77yAL2jvsljogCtu4+5CWWO4g+cr80vyVytji6IYTNM\\n\"\n        \"MPn1qe6dHXnfmgtiegHXxrjr5v5/i1cvD32Bxffy+yjR9kbV9GJYF+K5pfYVpQBa\\n\"\n        \"XVmq6AJUPd/yxKw6jRGZJi8GTcrKbCZAL+VYSPwc0veCrmGPjeeMCgYcEXPvhSui\\n\"\n        \"P0JnG1Ap12FeK+61rIbZBAr7qbTGJi5Z5HlDlgon2tmMZOkIuL1Oytgut4MpmYjP\\n\"\n        \"ph+qrzgwfSwOsjVIuHlb1L0phWRlgbT8lmysEE7McGKWiCOabxgl3NF9lClhDBb9\\n\"\n        \"nzupkK1cg/4p17USYMOdeNhTmJ0DkQT+8UenfBOmzV7kamLlEYXJdDZBN//dZ8UR\\n\"\n        \"KEzAzpaAVIyJQ+wvCUIh/VO8sJP+3q4XQUkv0QcIRlc0+r9qbW2Tqv3vajFcFtK6\\n\"\n        \"nrTmIJVL0pG+z/93Ncpy5susD+JvhJ4yfl7Jet3jy4fWwm3qkLl0WsobJ7Om+GyH\\n\"\n        \"DzHH9RgDk3XuUHS/fz+kTwmtyIH/Rq1jIt+s+T8iA9CzKSX6sBu2yfMo1w2/LbCx\\n\"\n        \"Xy1rHS42TePw28m1cQuUfjqdOC3IBgQ1m3x2f1on7hk=\\n\"\n        \"-----END OPENSSH PRIVATE KEY-----\\n\";\n\nstatic const char torture_dsa_private_openssh_testkey[] =\n        \"-----BEGIN OPENSSH PRIVATE KEY-----\\n\"\n        \"b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAABsQAAAAdz\\n\"\n        \"c2gtZHNzAAAAgQCUyvVPEkn3UnZDjzCzSzSHpTltzr0Ec+1mz/JACjHMBJ9C/W/P\\n\"\n        \"wvH3yjkfoFhhREvoY7IPnwAu5bcxw8TkISq7YROQ409PqwwPvy0N3GUp/+kKS268\\n\"\n        \"BIJ+VKN513XRf7eL1e4aHUJ+al9x1JxTmc6T0GBq1lyu+CTUUyh25aNDFwAAABUA\\n\"\n        \"rziPbQaZT7N7CNDCwhe5VvoL88cAAACAXhuIVsJxUQJ5nWQRLf7o3XEGQ+EcVmHO\\n\"\n        \"zMB1xCsHjYnpEhhco+r/HDZSD31kzDeAZUycz31WqGL8yXr+OZRLqEsGC7dwEAzP\\n\"\n        \"iXDul0zHcl0yiKPrRrLgNJHeKcT6JflBngK7jQRIVUg3F3104fbVa2rwaniLl4GS\\n\"\n        \"BZPXMpUdng8AAACAeK6A0AX4H/AKEgCQG+8vDlb8beXE+4qmkTEF9l4LVtPTbvUW\\n\"\n        \"1CFUu59psN4qmRtMZxt4r9aC/YMDVzC5X/oC5rKlN+/PI2hGfSIWfFXYBwKB5ulF\\n\"\n        \"jO29rgA5oYqyOnUWVFTvv4jBlLw8WuujiOIQ1dOeaW8EIbcbqVGrU4cg8yIAAAHY\\n\"\n        \"tbI937WyPd8AAAAHc3NoLWRzcwAAAIEAlMr1TxJJ91J2Q48ws0s0h6U5bc69BHPt\\n\"\n        \"Zs/yQAoxzASfQv1vz8Lx98o5H6BYYURL6GOyD58ALuW3McPE5CEqu2ETkONPT6sM\\n\"\n        \"D78tDdxlKf/pCktuvASCflSjedd10X+3i9XuGh1CfmpfcdScU5nOk9BgatZcrvgk\\n\"\n        \"1FModuWjQxcAAAAVAK84j20GmU+zewjQwsIXuVb6C/PHAAAAgF4biFbCcVECeZ1k\\n\"\n        \"ES3+6N1xBkPhHFZhzszAdcQrB42J6RIYXKPq/xw2Ug99ZMw3gGVMnM99Vqhi/Ml6\\n\"\n        \"/jmUS6hLBgu3cBAMz4lw7pdMx3JdMoij60ay4DSR3inE+iX5QZ4Cu40ESFVINxd9\\n\"\n        \"dOH21Wtq8Gp4i5eBkgWT1zKVHZ4PAAAAgHiugNAF+B/wChIAkBvvLw5W/G3lxPuK\\n\"\n        \"ppExBfZeC1bT0271FtQhVLufabDeKpkbTGcbeK/Wgv2DA1cwuV/6AuaypTfvzyNo\\n\"\n        \"Rn0iFnxV2AcCgebpRYztva4AOaGKsjp1FlRU77+IwZS8PFrro4jiENXTnmlvBCG3\\n\"\n        \"G6lRq1OHIPMiAAAAFQCNR3fP4j87IO2086Db40C/jaMosgAAAAABAg==\\n\"\n        \"-----END OPENSSH PRIVATE KEY-----\\n\";\n\nstatic const char torture_dsa_public_testkey[] =\n        \"ssh-dss AAAAB3NzaC1kc3MAAACBAJTK9U8SSfdSdkOPMLNLNIelOW3OvQRz7WbP8k\"\n        \"AKMcwEn0L9b8/C8ffKOR+gWGFES+hjsg+fAC7ltzHDxOQhKrthE5DjT0+rDA+/LQ3c\"\n        \"ZSn/6QpLbrwEgn5Uo3nXddF/t4vV7hodQn5qX3HUnFOZzpPQYGrWXK74JNRTKHblo0\"\n        \"MXAAAAFQCvOI9tBplPs3sI0MLCF7lW+gvzxwAAAIBeG4hWwnFRAnmdZBEt/ujdcQZD\"\n        \"4RxWYc7MwHXEKweNiekSGFyj6v8cNlIPfWTMN4BlTJzPfVaoYvzJev45lEuoSwYLt3\"\n        \"AQDM+JcO6XTMdyXTKIo+tGsuA0kd4pxPol+UGeAruNBEhVSDcXfXTh9tVravBqeIuX\"\n        \"gZIFk9cylR2eDwAAAIB4roDQBfgf8AoSAJAb7y8OVvxt5cT7iqaRMQX2XgtW09Nu9R\"\n        \"bUIVS7n2mw3iqZG0xnG3iv1oL9gwNXMLlf+gLmsqU3788jaEZ9IhZ8VdgHAoHm6UWM\"\n        \"7b2uADmhirI6dRZUVO+/iMGUvDxa66OI4hDV055pbwQhtxupUatThyDzIg==\\n\";\n\nstatic const char torture_dsa_testkey_cert[] =\n        \"ssh-dss-cert-v01@openssh.com AAAAHHNzaC1kc3MtY2VydC12MDFAb3BlbnNza\"\n        \"C5jb20AAAAgKAd9MpIBrzctQyJvCYYJ2WUD5fyWlXMSv1G/3VihbCAAAACBAJTK9U8\"\n        \"SSfdSdkOPMLNLNIelOW3OvQRz7WbP8kAKMcwEn0L9b8/C8ffKOR+gWGFES+hjsg+fA\"\n        \"C7ltzHDxOQhKrthE5DjT0+rDA+/LQ3cZSn/6QpLbrwEgn5Uo3nXddF/t4vV7hodQn5\"\n        \"qX3HUnFOZzpPQYGrWXK74JNRTKHblo0MXAAAAFQCvOI9tBplPs3sI0MLCF7lW+gvzx\"\n        \"wAAAIBeG4hWwnFRAnmdZBEt/ujdcQZD4RxWYc7MwHXEKweNiekSGFyj6v8cNlIPfWT\"\n        \"MN4BlTJzPfVaoYvzJev45lEuoSwYLt3AQDM+JcO6XTMdyXTKIo+tGsuA0kd4pxPol+\"\n        \"UGeAruNBEhVSDcXfXTh9tVravBqeIuXgZIFk9cylR2eDwAAAIB4roDQBfgf8AoSAJA\"\n        \"b7y8OVvxt5cT7iqaRMQX2XgtW09Nu9RbUIVS7n2mw3iqZG0xnG3iv1oL9gwNXMLlf+\"\n        \"gLmsqU3788jaEZ9IhZ8VdgHAoHm6UWM7b2uADmhirI6dRZUVO+/iMGUvDxa66OI4hD\"\n        \"V055pbwQhtxupUatThyDzIgAAAAAAAAAAAAAAAQAAAA5saWJzc2hfdG9ydHVyZQAAA\"\n        \"AAAAAAAAAAAAP//////////AAAAAAAAAIIAAAAVcGVybWl0LVgxMS1mb3J3YXJkaW5\"\n        \"nAAAAAAAAABdwZXJtaXQtYWdlbnQtZm9yd2FyZGluZwAAAAAAAAAWcGVybWl0LXBvc\"\n        \"nQtZm9yd2FyZGluZwAAAAAAAAAKcGVybWl0LXB0eQAAAAAAAAAOcGVybWl0LXVzZXI\"\n        \"tcmMAAAAAAAAAAAAAARcAAAAHc3NoLXJzYQAAAAMBAAEAAAEBAKKMHL9hp/LTng8sP\"\n        \"5YHTKaAbC7R003VVTjqOR8DBb4/5RZG2ZW+idp/RiBOuBzTxOOb0pyHSWcM+FGH077\"\n        \"ZzSjR6dTIDK4ytWehI8mbBqg2fgYZr3CgOiHJJIQSZw1e1PXTK6LwFoWutWfRqQ6gd\"\n        \"Z2kX28KiUMEkRxdae9Qp39H2SsToQFcdKKYZmBs98d6quD3jmb92JdAB01XUZqpnhC\"\n        \"w1MXrlzdm4Esm/PNcxIHWihx+aFskspD+LsI5+k+xE7i9jLA3Rtx2Rw4Zy8y5n8zmf\"\n        \"3DWnTAq4GrjJbkCnOXWBdk0ng2lMcLp/zTzEAVWXRExywDAYJBpoUVJLn5VQyEAAAE\"\n        \"PAAAAB3NzaC1yc2EAAAEAAt4V9aGqeahOfUvhG7M8/Mn26aLB/HXbICYFJF7dY6urm\"\n        \"SIoS2KBqISCFGXTituiwGlZeAJ+pVgCMYo07Nxtd6oqIjsgKfJqDNx7e4pGw/YJnkm\"\n        \"BqMO/k/ygu2mLmQF0lnpmG2KyjKEljMibHaKlFkcVNbwfOb4p8N3OHm66g5mbCUTRZ\"\n        \"DHqMSJb3YtnObLexD13RydwxkG5AfCnOWxy5O4agXGEYwr/48AQBHYg9obGtpD1qyF\"\n        \"4mMXgzaLViFtcwah6wHGlW0UPQMvrq/RqigAkyUszSccfibkIXJ+wGAgsRYhVAMwME\"\n        \"JqPZ6GHOEIjLBKUegsclHb7Pk0YO8Auaw== \"\n        \"aris@aris-air\\n\";\n\n/****************************************************************************\n * ECDSA KEYS\n ****************************************************************************/\n\nstatic const char torture_ecdsa256_private_testkey[] =\n        \"-----BEGIN EC PRIVATE KEY-----\\n\"\n        \"MHcCAQEEIBCDeeYYAtX3EnsP0ratwVpNTaA/4K1N6VvHMiUZlVdhoAoGCCqGSM49\\n\"\n        \"AwEHoUQDQgAEx+9ud88Q5GWtLd+yMtYaapC85g+2ZLp7VtFHA0EbNHqBUQxoh+Ik\\n\"\n        \"89Mlr7AUxcFPd+kCo+NE6yq/mNQcL7E6iQ==\\n\"\n        \"-----END EC PRIVATE KEY-----\\n\";\n\nstatic const char torture_ecdsa256_private_testkey_passphrase[] =\n        \"-----BEGIN EC PRIVATE KEY-----\\n\"\n        \"Proc-Type: 4,ENCRYPTED\\n\"\n        \"DEK-Info: AES-128-CBC,5C825E6FE821D0DE99D8403F4B4020CB\\n\"\n        \"\\n\"\n        \"TaUq8Qenb52dKAYcQGIYfdT7Z2DroySk38w51kw/gd8o79ZHaAQv60GtaNoy0203\\n\"\n        \"2X1o29E6c0WsY9DKhSHKm/zzvZmL+ChZYqqh3sd1gp55aJsHNN4axiIu2YCbCavh\\n\"\n        \"8VZn2VJDaitLy8ARqA/lMGQfqHSa3EOqti9FzWG/P6s=\\n\"\n        \"-----END EC PRIVATE KEY-----\\n\";\n\nstatic const char torture_ecdsa256_private_pkcs8_testkey_passphrase[] =\n        \"-----BEGIN ENCRYPTED PRIVATE KEY-----\\n\"\n        \"MIHsMFcGCSqGSIb3DQEFDTBKMCkGCSqGSIb3DQEFDDAcBAhvndbkbElTnAICCAAw\\n\"\n        \"DAYIKoZIhvcNAgkFADAdBglghkgBZQMEAQIEEOu4ierPcQpcA9RJNHUbTCoEgZBe\\n\"\n        \"iusOkUYp4JZJEIpi98VlqnROzDXHpTTpEGiUDC/k+cuKvoPop5+Jx0qXp+A1NJxu\\n\"\n        \"kx3j+U0ISGY7J6b2Pqt1msC/FzqpeFM7ybuHDRz+c5ZBONTp8wrs52d5NdjrYguz\\n\"\n        \"UO6n9+yydSsO0FqbwPaqNZ6goBN0TfhYnToG4ZPJxlHa7gf7Su4KSMYKZdOtfx4=\\n\"\n        \"-----END ENCRYPTED PRIVATE KEY-----\\n\";\n\nstatic const char torture_ecdsa256_private_openssh_testkey[] =\n        \"-----BEGIN OPENSSH PRIVATE KEY-----\\n\"\n        \"b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAaAAAABNl\\n\"\n        \"Y2RzYS1zaGEyLW5pc3RwMjU2AAAACG5pc3RwMjU2AAAAQQTH7253zxDkZa0t37Iy\\n\"\n        \"1hpqkLzmD7ZkuntW0UcDQRs0eoFRDGiH4iTz0yWvsBTFwU936QKj40TrKr+Y1Bwv\\n\"\n        \"sTqJAAAAmOuDchHrg3IRAAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAy\\n\"\n        \"NTYAAABBBMfvbnfPEORlrS3fsjLWGmqQvOYPtmS6e1bRRwNBGzR6gVEMaIfiJPPT\\n\"\n        \"Ja+wFMXBT3fpAqPjROsqv5jUHC+xOokAAAAgEIN55hgC1fcSew/Stq3BWk1NoD/g\\n\"\n        \"rU3pW8cyJRmVV2EAAAAA\\n\"\n        \"-----END OPENSSH PRIVATE KEY-----\\n\";\n\nstatic const char torture_ecdsa256_private_openssh_testkey_pasphrase[] =\n        \"-----BEGIN OPENSSH PRIVATE KEY-----\\n\"\n        \"b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jdHIAAAAGYmNyeXB0AAAAGAAAABA+\\n\"\n        \"O0w3yPZF2q0FjVBhQjn2AAAAEAAAAAEAAABoAAAAE2VjZHNhLXNoYTItbmlzdHAy\\n\"\n        \"NTYAAAAIbmlzdHAyNTYAAABBBMfvbnfPEORlrS3fsjLWGmqQvOYPtmS6e1bRRwNB\\n\"\n        \"GzR6gVEMaIfiJPPTJa+wFMXBT3fpAqPjROsqv5jUHC+xOokAAACghvb4EX8M06UB\\n\"\n        \"zigxOn9bg5cZkZ2yWY8jzxtOWH4YJXsuhON/jePDJuI2ro5u4iKFD1u2JLfcshdh\\n\"\n        \"vKZyjixU9KdewykQQt/wFkrCfNUyCH8jFiQsAqhBfopRFyDJV9pmcUBL/3fJqwut\\n\"\n        \"ZeBSfA7tXORp3xrwFI1tXiiUCM+/nhxiCsFaCJXeiM3tN+kFtwQ8kamINqwaC8Vj\\n\"\n        \"lFLKHDfwJQ==\\n\"\n        \"-----END OPENSSH PRIVATE KEY-----\\n\";\n\nstatic const char torture_ecdsa256_public_testkey[] =\n        \"ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNT\"\n        \"YAAABBBMfvbnfPEORlrS3fsjLWGmqQvOYPtmS6e1bRRwNBGzR6gVEMaIfiJPPTJa+w\"\n        \"FMXBT3fpAqPjROsqv5jUHC+xOok= aris@kalix86\\n\";\n\nstatic const char torture_ecdsa256_testkey_cert[] =\n        \"ecdsa-sha2-nistp256-cert-v01@openssh.com AAAAKGVjZHNhLXNoYTItbmlzd\"\n        \"HAyNTYtY2VydC12MDFAb3BlbnNzaC5jb20AAAAgHvXWcdSrQeZL2/Z68V8ntbL7rDo\"\n        \"Qwrsc+ps6HbMGZrkAAAAIbmlzdHAyNTYAAABBBMfvbnfPEORlrS3fsjLWGmqQvOYPt\"\n        \"mS6e1bRRwNBGzR6gVEMaIfiJPPTJa+wFMXBT3fpAqPjROsqv5jUHC+xOokAAAAAAAA\"\n        \"AAAAAAAEAAAAHbXlpZGVudAAAAAAAAAAAAAAAAP//////////AAAAAAAAAIIAAAAVc\"\n        \"GVybWl0LVgxMS1mb3J3YXJkaW5nAAAAAAAAABdwZXJtaXQtYWdlbnQtZm9yd2FyZGl\"\n        \"uZwAAAAAAAAAWcGVybWl0LXBvcnQtZm9yd2FyZGluZwAAAAAAAAAKcGVybWl0LXB0e\"\n        \"QAAAAAAAAAOcGVybWl0LXVzZXItcmMAAAAAAAAAAAAAAGgAAAATZWNkc2Etc2hhMi1\"\n        \"uaXN0cDI1NgAAAAhuaXN0cDI1NgAAAEEEx+9ud88Q5GWtLd+yMtYaapC85g+2ZLp7V\"\n        \"tFHA0EbNHqBUQxoh+Ik89Mlr7AUxcFPd+kCo+NE6yq/mNQcL7E6iQAAAGQAAAATZWN\"\n        \"kc2Etc2hhMi1uaXN0cDI1NgAAAEkAAAAhALDSBnmFF59tgTKDQ4meTJEI7/BP2Zgf1\"\n        \"AKg1H3kIijQAAAAIFYrqSg6GI03ohXqUVsZ3lCB/XIism2aV5Vz2bg1d9zo \"\n        \"./ec256.pub\";\n\nstatic const char torture_ecdsa384_private_testkey[] =\n        \"-----BEGIN EC PRIVATE KEY-----\\n\"\n        \"MIGkAgEBBDBY8jEa5DtRy4AVeTWhPJ/TK257behiC3uafEi6YA2oHORibqX55EDN\\n\"\n        \"wz29MT40mQSgBwYFK4EEACKhZANiAARXc4BN6BrVo1QMi3+i/B85Lu7SMuzBi+1P\\n\"\n        \"bJti8xz+Szgq64gaBGOK9o+WOdLAd/w7p7DJLdztJ0bYoyT4V3B3ZqR9RyGq6mYC\\n\"\n        \"jkXlc5YbYHjueBbp0oeNXqsXHNAWQZo=\\n\"\n        \"-----END EC PRIVATE KEY-----\\n\";\n\nstatic const char torture_ecdsa384_private_testkey_passphrase[] =\n        \"-----BEGIN EC PRIVATE KEY-----\\n\"\n        \"Proc-Type: 4,ENCRYPTED\\n\"\n        \"DEK-Info: AES-128-CBC,5C825E6FE821D0DE99D8403F4B4020CB\\n\"\n        \"\\n\"\n        \"TaUq8Qenb52dKAYcQGIYfdT7Z2DroySk38w51kw/gd8o79ZHaAQv60GtaNoy0203\\n\"\n        \"2X1o29E6c0WsY9DKhSHKm/zzvZmL+ChZYqqh3sd1gp55aJsHNN4axiIu2YCbCavh\\n\"\n        \"8VZn2VJDaitLy8ARqA/lMGQfqHSa3EOqti9FzWG/P6s=\\n\"\n        \"-----END EC PRIVATE KEY-----\\n\";\n\nstatic const char torture_ecdsa384_private_pkcs8_testkey_passphrase[] =\n        \"-----BEGIN ENCRYPTED PRIVATE KEY-----\\n\"\n        \"MIIBHDBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIEuMnFkuHkDkCAggA\\n\"\n        \"MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAECBBA/fjhqXxV/Dk7cg8XgPxzuBIHA\\n\"\n        \"TbiloDCPfKKlkm9ZguahtfJOxcVBbMtrFAK2vA/jMXGnbB9Qe13uLl8fTd6QB4tE\\n\"\n        \"Zbyucq4OA0L2HyhuEsJiLvf0ICX8APrBajNv3B8F7ZStrXx7hcJUg8qTlsbdovYq\\n\"\n        \"nCjOKoq/F6ax/r1F9Rr5PlXQDoSKDJ3mQkZc4n8VNKFfXOPQ7C4rEYzglSyzGwyQ\\n\"\n        \"2EwRwnkkJqcYotRyH4JWtXCRak7znLVDeGbavhpP6paSVsK8OpycAoJstfQb0L4q\\n\"\n        \"-----END ENCRYPTED PRIVATE KEY-----\\n\";\n\nstatic const char torture_ecdsa384_private_openssh_testkey[] =\n        \"-----BEGIN OPENSSH PRIVATE KEY-----\\n\"\n        \"b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAiAAAABNl\\n\"\n        \"Y2RzYS1zaGEyLW5pc3RwMzg0AAAACG5pc3RwMzg0AAAAYQRXc4BN6BrVo1QMi3+i\\n\"\n        \"/B85Lu7SMuzBi+1PbJti8xz+Szgq64gaBGOK9o+WOdLAd/w7p7DJLdztJ0bYoyT4\\n\"\n        \"V3B3ZqR9RyGq6mYCjkXlc5YbYHjueBbp0oeNXqsXHNAWQZoAAADIITfDfiE3w34A\\n\"\n        \"AAATZWNkc2Etc2hhMi1uaXN0cDM4NAAAAAhuaXN0cDM4NAAAAGEEV3OATega1aNU\\n\"\n        \"DIt/ovwfOS7u0jLswYvtT2ybYvMc/ks4KuuIGgRjivaPljnSwHf8O6ewyS3c7SdG\\n\"\n        \"2KMk+Fdwd2akfUchqupmAo5F5XOWG2B47ngW6dKHjV6rFxzQFkGaAAAAMFjyMRrk\\n\"\n        \"O1HLgBV5NaE8n9Mrbntt6GILe5p8SLpgDagc5GJupfnkQM3DPb0xPjSZBAAAAAA=\\n\"\n        \"-----END OPENSSH PRIVATE KEY-----\\n\";\n\nstatic const char torture_ecdsa384_private_openssh_testkey_passphrase[] =\n        \"-----BEGIN OPENSSH PRIVATE KEY-----\\n\"\n        \"b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jdHIAAAAGYmNyeXB0AAAAGAAAABB4N\\n\"\n        \"dKGEoxFeg6dqiR2vTl6AAAAEAAAAAEAAACIAAAAE2VjZHNhLXNoYTItbmlzdHAzOD\\n\"\n        \"QAAAAIbmlzdHAzODQAAABhBFdzgE3oGtWjVAyLf6L8Hzku7tIy7MGL7U9sm2LzHP5\\n\"\n        \"LOCrriBoEY4r2j5Y50sB3/DunsMkt3O0nRtijJPhXcHdmpH1HIarqZgKOReVzlhtg\\n\"\n        \"eO54FunSh41eqxcc0BZBmgAAANDOL7sWcylFf8SsjGVFvr36mpyUBpAJ/e7o4RbQg\\n\"\n        \"H8FDu1IxscOfbLDoB3CV7UEIgG58nVsDamfL6rXV/tzWnPxYxi6jUHcKT1BugO/Jt\\n\"\n        \"/ncelMeoAS6MAZhElaGKzU1cJMlMTV9ofmuKuAwllQULG7L8lwHs9whBK4JmWPaGL\\n\"\n        \"pU3i9ZoT33/g6pcvA83vicCNqj7ggl6Vb9MeO/zGW1+oV2HC3WiLTqBsYxEJu4YCM\\n\"\n        \"ewfx9pWeWaCllNy/F1rCBu3cxqzcge9hqIlNtpT7Dq3k\\n\"\n        \"-----END OPENSSH PRIVATE KEY-----\\n\";\n\nstatic const char torture_ecdsa384_public_testkey[] =\n        \"ecdsa-sha2-nistp384 AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzOD\"\n        \"QAAABhBFdzgE3oGtWjVAyLf6L8Hzku7tIy7MGL7U9sm2LzHP5LOCrriBoEY4r2j5Y5\"\n        \"0sB3/DunsMkt3O0nRtijJPhXcHdmpH1HIarqZgKOReVzlhtgeO54FunSh41eqxcc0B\"\n        \"ZBmg== aris@kalix86\";\n\nstatic const char torture_ecdsa384_testkey_cert[] =\n        \"ecdsa-sha2-nistp384-cert-v01@openssh.com AAAAKGVjZHNhLXNoYTItbmlzd\"\n        \"HAzODQtY2VydC12MDFAb3BlbnNzaC5jb20AAAAgvggfi3v98HjOiqVi1O5aPy7JvMd\"\n        \"rTZe68GZ0qCaAN5MAAAAIbmlzdHAzODQAAABhBFdzgE3oGtWjVAyLf6L8Hzku7tIy7\"\n        \"MGL7U9sm2LzHP5LOCrriBoEY4r2j5Y50sB3/DunsMkt3O0nRtijJPhXcHdmpH1HIar\"\n        \"qZgKOReVzlhtgeO54FunSh41eqxcc0BZBmgAAAAAAAAAAAAAAAQAAAAdteWlkZW50A\"\n        \"AAAAAAAAAAAAAAA//////////8AAAAAAAAAggAAABVwZXJtaXQtWDExLWZvcndhcmR\"\n        \"pbmcAAAAAAAAAF3Blcm1pdC1hZ2VudC1mb3J3YXJkaW5nAAAAAAAAABZwZXJtaXQtc\"\n        \"G9ydC1mb3J3YXJkaW5nAAAAAAAAAApwZXJtaXQtcHR5AAAAAAAAAA5wZXJtaXQtdXN\"\n        \"lci1yYwAAAAAAAAAAAAAAiAAAABNlY2RzYS1zaGEyLW5pc3RwMzg0AAAACG5pc3RwM\"\n        \"zg0AAAAYQRXc4BN6BrVo1QMi3+i/B85Lu7SMuzBi+1PbJti8xz+Szgq64gaBGOK9o+\"\n        \"WOdLAd/w7p7DJLdztJ0bYoyT4V3B3ZqR9RyGq6mYCjkXlc5YbYHjueBbp0oeNXqsXH\"\n        \"NAWQZoAAACEAAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAABpAAAAMQD5f0pF6U6eeBO\"\n        \"PrOV7Y3w5NuTzvuyDAq0kTv6VYNMp83TYpIJw16+tMAplOSzPTvwAAAAwWD9StvMEP\"\n        \"b+SDH2G5qqkMk+F5IaHI9fev8zcFzzdOlilLc/+CFM0NKMAFtOrrhv0 \"\n        \"./ec384.pub\";\n\nstatic const char torture_ecdsa521_private_testkey[] =\n        \"-----BEGIN EC PRIVATE KEY-----\\n\"\n        \"MIHbAgEBBEG83nSJ2SLoiBvEku1JteQKWx/Xt6THksgC7rrIaTUmNzk+60f0sCCm\\n\"\n        \"Gll0dgrZLmeIw+TtnG1E20VZflCKq+IdkaAHBgUrgQQAI6GBiQOBhgAEAc6D728d\\n\"\n        \"baQkHnSPtztaRwJw63CBl15cykB4SXXuwWdNOtPzBijUULMTTvBXbra8gL4ATd9d\\n\"\n        \"Qnuwn8KQUh2T/z+BARjWPKhcHcGx57XpXCEkawzMYaHUUnRdeFEmNRsbXypsf0mJ\\n\"\n        \"KATU3h8gzTMkbrx8DJTFHEIjXBShs44HsSYVl3Xy\\n\"\n        \"-----END EC PRIVATE KEY-----\\n\";\n\nstatic const char torture_ecdsa521_private_testkey_passphrase[] =\n        \"-----BEGIN EC PRIVATE KEY-----\\n\"\n        \"Proc-Type: 4,ENCRYPTED\\n\"\n        \"DEK-Info: AES-128-CBC,24C4F383915BC07D9C63209BF6AD3DEE\\n\"\n        \"\\n\"\n        \"M+JGfpGfoH3Wn6XWSoHrGGevaS6p2vJGQdkFEIgUfh16s+U/LcRhAhRnhX/MV6Ds\\n\"\n        \"OZTpusrjInlZXNUR97fJbmjr/600qUlh4y3U9ikiX3IXE+RI80TPNdishOOjKRF7\\n\"\n        \"aWDW8UxTlFfU2Zc1Ew0pTvMXXcuTpozW1NNVY+6S9uWfHwq1/EcR35dbnEmG0gId\\n\"\n        \"qsiEdVKh7p+9Qto8jcVWzMh7ANMcIwmxQ4zbvnqypwgAgpMbamWqBZ9q4egsVZKd\\n\"\n        \"uRzL95L05ctOBGYNYqpPNIX3UdQU07kzwNC+yaHOb2s=\\n\"\n        \"-----END EC PRIVATE KEY-----\\n\";\n\nstatic const char torture_ecdsa521_private_pkcs8_testkey_passphrase[] =\n        \"-----BEGIN ENCRYPTED PRIVATE KEY-----\\n\"\n        \"MIIBXTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIY6X14D05Q7gCAggA\\n\"\n        \"MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAECBBCmngDUX2/kg+45m4qoCBLiBIIB\\n\"\n        \"ANHV+GC6Hnend9cVScT5oNtOS2a/TD82N1h+9cYmxn953IRNk2rF7LFYFFeZzcZi\\n\"\n        \"e840YFYFRiTScm1GbKgwyFLYzYguvpUpS3qz3yZMygoX3xlvFw0l8FWsfeUmOzG1\\n\"\n        \"uQQPGeoFCus43D3k1iQCOafEe0DPbyfcF/IxajZ+P0N8A5ikgPsOfpTLAdWiYgFt\\n\"\n        \"wkafVfXx5ZH1u8S34+kmoKRhf5zBFQI1BHD6bCQDANPBkbP4KEjH5mHRO99nHK9r\\n\"\n        \"EhdLDBEXRo9xb1BhgPLdQA0AdPPqZ6Wugy3KyxkEiH/GB/oBoIpg0oALnowL129g\\n\"\n        \"BV6jZHwXHuO4/CLJ9rN2tdE=\\n\"\n        \"-----END ENCRYPTED PRIVATE KEY-----\\n\";\n\nstatic const char torture_ecdsa521_private_openssh_testkey[] =\n        \"-----BEGIN OPENSSH PRIVATE KEY-----\\n\"\n        \"b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAArAAAABNl\\n\"\n        \"Y2RzYS1zaGEyLW5pc3RwNTIxAAAACG5pc3RwNTIxAAAAhQQBzoPvbx1tpCQedI+3\\n\"\n        \"O1pHAnDrcIGXXlzKQHhJde7BZ0060/MGKNRQsxNO8FdutryAvgBN311Ce7CfwpBS\\n\"\n        \"HZP/P4EBGNY8qFwdwbHntelcISRrDMxhodRSdF14USY1GxtfKmx/SYkoBNTeHyDN\\n\"\n        \"MyRuvHwMlMUcQiNcFKGzjgexJhWXdfIAAAEAt6sYz7erGM8AAAATZWNkc2Etc2hh\\n\"\n        \"Mi1uaXN0cDUyMQAAAAhuaXN0cDUyMQAAAIUEAc6D728dbaQkHnSPtztaRwJw63CB\\n\"\n        \"l15cykB4SXXuwWdNOtPzBijUULMTTvBXbra8gL4ATd9dQnuwn8KQUh2T/z+BARjW\\n\"\n        \"PKhcHcGx57XpXCEkawzMYaHUUnRdeFEmNRsbXypsf0mJKATU3h8gzTMkbrx8DJTF\\n\"\n        \"HEIjXBShs44HsSYVl3XyAAAAQgC83nSJ2SLoiBvEku1JteQKWx/Xt6THksgC7rrI\\n\"\n        \"aTUmNzk+60f0sCCmGll0dgrZLmeIw+TtnG1E20VZflCKq+IdkQAAAAABAg==\\n\"\n        \"-----END OPENSSH PRIVATE KEY-----\\n\";\n\nstatic const char torture_ecdsa521_private_openssh_testkey_passphrase[] =\n        \"-----BEGIN OPENSSH PRIVATE KEY-----\\n\"\n        \"b3BlbnNzaC1rZXktdjEAAAAACmFlczI1Ni1jdHIAAAAGYmNyeXB0AAAAGAAAABAj\\n\"\n        \"9WBFa/piJcPFEE4CGZTKAAAAEAAAAAEAAACsAAAAE2VjZHNhLXNoYTItbmlzdHA1\\n\"\n        \"MjEAAAAIbmlzdHA1MjEAAACFBAHOg+9vHW2kJB50j7c7WkcCcOtwgZdeXMpAeEl1\\n\"\n        \"7sFnTTrT8wYo1FCzE07wV262vIC+AE3fXUJ7sJ/CkFIdk/8/gQEY1jyoXB3Bsee1\\n\"\n        \"6VwhJGsMzGGh1FJ0XXhRJjUbG18qbH9JiSgE1N4fIM0zJG68fAyUxRxCI1wUobOO\\n\"\n        \"B7EmFZd18gAAAQDLjaKp+DLEHFb98f5WnVFg6LgDN847sfeuPZVfVjeSAiIv016O\\n\"\n        \"ld7DXb137B2xYVsuce6sHbypr10dJOvgMTLdzTl+crYNJL+8UufJP0rOIFaDenzQ\\n\"\n        \"RW8wydwiQxwt1ZqtD8ASqFmadxngufJKZzPLGfjCbCz3uATKa2sXN66nRXRZJbVA\\n\"\n        \"IlNYDY8ivAStNhfItUMqyM6PkYlKJECtJw7w7TYKpvts7t72JmtgqVjS45JI/YZ+\\n\"\n        \"kitIG0YmG8rzL9d1vBB5m+MH/fnFz2uJqbQYCH9Ctc8HZodAVoTNDzXHU2mYF9PE\\n\"\n        \"Z6+gi3jd+kOyUk3NifHcre9K6ie7LL33JayM\\n\"\n        \"-----END OPENSSH PRIVATE KEY-----\\n\";\n\n\nstatic const char torture_ecdsa521_public_testkey[] =\n        \"ecdsa-sha2-nistp521 AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1Mj\"\n        \"EAAACFBAHOg+9vHW2kJB50j7c7WkcCcOtwgZdeXMpAeEl17sFnTTrT8wYo1FCzE07w\"\n        \"V262vIC+AE3fXUJ7sJ/CkFIdk/8/gQEY1jyoXB3Bsee16VwhJGsMzGGh1FJ0XXhRJj\"\n        \"UbG18qbH9JiSgE1N4fIM0zJG68fAyUxRxCI1wUobOOB7EmFZd18g== aris@kalix86\";\n\nstatic const char torture_ecdsa521_testkey_cert[] =\n        \"ecdsa-sha2-nistp521-cert-v01@openssh.com AAAAKGVjZHNhLXNoYTItbmlzd\"\n        \"HA1MjEtY2VydC12MDFAb3BlbnNzaC5jb20AAAAggFIwlsx63C++kmCBDF4O14fvu5j\"\n        \"Icsm8uMbMp0smOVwAAAAIbmlzdHA1MjEAAACFBAHOg+9vHW2kJB50j7c7WkcCcOtwg\"\n        \"ZdeXMpAeEl17sFnTTrT8wYo1FCzE07wV262vIC+AE3fXUJ7sJ/CkFIdk/8/gQEY1jy\"\n        \"oXB3Bsee16VwhJGsMzGGh1FJ0XXhRJjUbG18qbH9JiSgE1N4fIM0zJG68fAyUxRxCI\"\n        \"1wUobOOB7EmFZd18gAAAAAAAAAAAAAAAQAAAAdteWlkZW50AAAAAAAAAAAAAAAA///\"\n        \"///////8AAAAAAAAAggAAABVwZXJtaXQtWDExLWZvcndhcmRpbmcAAAAAAAAAF3Blc\"\n        \"m1pdC1hZ2VudC1mb3J3YXJkaW5nAAAAAAAAABZwZXJtaXQtcG9ydC1mb3J3YXJkaW5\"\n        \"nAAAAAAAAAApwZXJtaXQtcHR5AAAAAAAAAA5wZXJtaXQtdXNlci1yYwAAAAAAAAAAA\"\n        \"AAArAAAABNlY2RzYS1zaGEyLW5pc3RwNTIxAAAACG5pc3RwNTIxAAAAhQQBzoPvbx1\"\n        \"tpCQedI+3O1pHAnDrcIGXXlzKQHhJde7BZ0060/MGKNRQsxNO8FdutryAvgBN311Ce\"\n        \"7CfwpBSHZP/P4EBGNY8qFwdwbHntelcISRrDMxhodRSdF14USY1GxtfKmx/SYkoBNT\"\n        \"eHyDNMyRuvHwMlMUcQiNcFKGzjgexJhWXdfIAAACnAAAAE2VjZHNhLXNoYTItbmlzd\"\n        \"HA1MjEAAACMAAAAQgCJzTxw/hz2qE8Qkd4XW9Qn7fPxML6Ebtttg9C18AguyGyE6Nk\"\n        \"YH1NcToYxwQxrgzDXowXYm9eCbq9JEvaXDEtIfAAAAEIBk06LmKAYR2HDwwt4f5wVI\"\n        \"PKJ0pHVLZEx3FMZI3SfwS9mVm+oojLkZ2hr8X0xn28zbN045d8daB7BB1mHMGNT+YA\"\n        \"= ./ec521.pub\";\n\n/****************************************************************************\n * ED25519 KEYS\n ****************************************************************************/\n\nstatic const char torture_ed25519_private_pkcs8_testkey[] =\n        \"-----BEGIN PRIVATE KEY-----\\n\"\n        \"MC4CAQAwBQYDK2VwBCIEIGBhcqLe61tkqVjIHKEzwB3oINasSHWGbIWXQWcLPmGN\\n\"\n        \"-----END PRIVATE KEY-----\\n\";\n\nstatic const char torture_ed25519_private_openssh_testkey[] =\n        \"-----BEGIN OPENSSH PRIVATE KEY-----\\n\"\n        \"b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW\\n\"\n        \"QyNTUxOQAAACAVlp8bgmIjsrzGC7ZIKBMhCpS1fpJTPgVOjYdz5gIqlwAAAJBzsDN1c7Az\\n\"\n        \"dQAAAAtzc2gtZWQyNTUxOQAAACAVlp8bgmIjsrzGC7ZIKBMhCpS1fpJTPgVOjYdz5gIqlw\\n\"\n        \"AAAEBgYXKi3utbZKlYyByhM8Ad6CDWrEh1hmyFl0FnCz5hjRWWnxuCYiOyvMYLtkgoEyEK\\n\"\n        \"lLV+klM+BU6Nh3PmAiqXAAAADGFyaXNAa2FsaXg4NgE=\\n\"\n        \"-----END OPENSSH PRIVATE KEY-----\\n\";\n\nstatic const char torture_ed25519_private_openssh_testkey_passphrase[] =\n        \"-----BEGIN OPENSSH PRIVATE KEY-----\\n\"\n        \"b3BlbnNzaC1rZXktdjEAAAAACmFlczEyOC1jYmMAAAAGYmNyeXB0AAAAGAAAABDYuz+a8i\\n\"\n        \"nb/BgGjQjQtvkUAAAAEAAAAAEAAAAzAAAAC3NzaC1lZDI1NTE5AAAAIBWWnxuCYiOyvMYL\\n\"\n        \"tkgoEyEKlLV+klM+BU6Nh3PmAiqXAAAAkOBxqvzvPSns3TbhjkCayvANI66100OELnpDOm\\n\"\n        \"JBGgXr5q846NkAovH3pmJ4O7qzPLTQ/cm0+959VUODRhM1i96qBg5MTNtV33lf5Y57Klzu\\n\"\n        \"JegbiexcqkHIzriH42K0XSOEpfW8f/rTH7ffjbE/7l8HRNwf7AmcnxLx/d8J8FTBr+8aU7\\n\"\n        \"qMU3xAJ4ixnwhYFg==\\n\"\n        \"-----END OPENSSH PRIVATE KEY-----\\n\";\n\nstatic const char torture_ed25519_private_pkcs8_testkey_passphrase[] =\n        \"-----BEGIN ENCRYPTED PRIVATE KEY-----\\n\"\n        \"MIGbMFcGCSqGSIb3DQEFDTBKMCkGCSqGSIb3DQEFDDAcBAie1RBk/ub+EwICCAAw\\n\"\n        \"DAYIKoZIhvcNAgkFADAdBglghkgBZQMEAQIEECRLkPChQx/sZPYLdNJhxMUEQFLj\\n\"\n        \"7nelAdOx3WXIBbCOfOqg3aAn8C5cXPtIQ+fiui1V8wlXXV8RBiuDCC97ScLs91D5\\n\"\n        \"qQhQtw0vgfnq1um/izg=\\n\"\n        \"-----END ENCRYPTED PRIVATE KEY-----\\n\";\n\nstatic const char torture_ed25519_public_testkey[] =\n        \"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBWWnxuCYiOyvMYLtkgoEyEKlLV+klM+\"\n        \"BU6Nh3PmAiqX aris@kalix86\";\n\nstatic const char torture_ed25519_testkey_cert[] =\n        \"ssh-ed25519-cert-v01@openssh.com AAAAIHNzaC1lZDI1NTE5LWNlcnQtdjAxQ\"\n        \"G9wZW5zc2guY29tAAAAILrR4sPB+b6BRId/OkQha9nWwoACXqUTILz1TrmG4R9CAAA\"\n        \"AIBWWnxuCYiOyvMYLtkgoEyEKlLV+klM+BU6Nh3PmAiqXAAAAAAAAAAAAAAABAAAAB\"\n        \"215aWRlbnQAAAAAAAAAAAAAAAD//////////wAAAAAAAACCAAAAFXBlcm1pdC1YMTE\"\n        \"tZm9yd2FyZGluZwAAAAAAAAAXcGVybWl0LWFnZW50LWZvcndhcmRpbmcAAAAAAAAAF\"\n        \"nBlcm1pdC1wb3J0LWZvcndhcmRpbmcAAAAAAAAACnBlcm1pdC1wdHkAAAAAAAAADnB\"\n        \"lcm1pdC11c2VyLXJjAAAAAAAAAAAAAAAzAAAAC3NzaC1lZDI1NTE5AAAAIBWWnxuCY\"\n        \"iOyvMYLtkgoEyEKlLV+klM+BU6Nh3PmAiqXAAAAUwAAAAtzc2gtZWQyNTUxOQAAAEB\"\n        \"d8AogGWM6njfejbazFVyfnjNiWqatx6IV3Nnqc3LjCiPY19fqIPe2YJSzytHwLTD5X\"\n        \"IjD2bJpq2ZfjQwXpO0J ./ed.pub\";\n\nstatic const char *torture_get_testkey_internal(enum ssh_keytypes_e type,\n                                                bool with_passphrase,\n                                                int pubkey,\n                                                int format)\n{\n    switch (type) {\n        case SSH_KEYTYPE_DSS:\n            if (pubkey) {\n                return torture_dsa_public_testkey;\n            } else if (with_passphrase) {\n                if (format == 1) {\n                    return torture_dsa_private_openssh_testkey_passphrase;\n                }\n                if (format == 2) {\n                    return torture_dsa_private_pkcs8_testkey_passphrase;\n                } else {\n                    return torture_dsa_private_testkey_passphrase;\n                }\n            }\n            if (format == 1) {\n                return torture_dsa_private_openssh_testkey;\n            }\n            return torture_dsa_private_testkey;\n        case SSH_KEYTYPE_RSA:\n            if (pubkey) {\n                return torture_rsa_public_testkey;\n            } else if (with_passphrase) {\n                if (format == 1) {\n                    return torture_rsa_private_openssh_testkey_passphrase;\n                }\n                if (format == 2) {\n                    return torture_rsa_private_pkcs8_testkey_passphrase;\n                } else {\n                    return torture_rsa_private_testkey_passphrase;\n                }\n            }\n            if (format == 1) {\n                return torture_rsa_private_openssh_testkey;\n            }\n            return torture_rsa_private_testkey;\n        case SSH_KEYTYPE_ECDSA_P521:\n            if (pubkey) {\n                return torture_ecdsa521_public_testkey;\n            } else if (with_passphrase) {\n                if (format == 1) {\n                    return torture_ecdsa521_private_openssh_testkey_passphrase;\n                }\n                if (format == 2) {\n                    return torture_ecdsa521_private_pkcs8_testkey_passphrase;\n                } else {\n                    return torture_ecdsa521_private_testkey_passphrase;\n                }\n            }\n            if (format == 1) {\n                return torture_ecdsa521_private_openssh_testkey;\n            }\n            return torture_ecdsa521_private_testkey;\n        case SSH_KEYTYPE_ECDSA_P384:\n            if (pubkey) {\n                return torture_ecdsa384_public_testkey;\n            } else if (with_passphrase){\n                if (format == 1) {\n                    return torture_ecdsa384_private_openssh_testkey_passphrase;\n                }\n                if (format == 2) {\n                    return torture_ecdsa384_private_pkcs8_testkey_passphrase;\n                } else {\n                    return torture_ecdsa384_private_testkey_passphrase;\n                }\n            }\n            if (format == 1) {\n                return torture_ecdsa384_private_openssh_testkey;\n            }\n            return torture_ecdsa384_private_testkey;\n        case SSH_KEYTYPE_ECDSA_P256:\n            if (pubkey) {\n                return torture_ecdsa256_public_testkey;\n            } else if (with_passphrase){\n                if (format == 1) {\n                    return torture_ecdsa256_private_openssh_testkey_pasphrase;\n                }\n                if (format == 2) {\n                    return torture_ecdsa256_private_pkcs8_testkey_passphrase;\n                } else {\n                    return torture_ecdsa256_private_testkey_passphrase;\n                }\n            }\n            if (format == 1) {\n                return torture_ecdsa256_private_openssh_testkey;\n            }\n            return torture_ecdsa256_private_testkey;\n        case SSH_KEYTYPE_ED25519:\n            if (pubkey) {\n                return torture_ed25519_public_testkey;\n            } else if (with_passphrase) {\n                if (format == 1) {\n                    return torture_ed25519_private_openssh_testkey_passphrase;\n                }\n                if (format == 2) {\n                    return torture_ed25519_private_pkcs8_testkey_passphrase;\n                }\n                /* ed25519 keys are not available in legacy PEM format */\n                return NULL;\n            }\n            if (format == 1) {\n                return torture_ed25519_private_openssh_testkey;\n            }\n            /* ed25519 keys are not available in legacy PEM format */\n            return torture_ed25519_private_pkcs8_testkey;\n        case SSH_KEYTYPE_DSS_CERT01:\n            return torture_dsa_testkey_cert;\n        case SSH_KEYTYPE_RSA_CERT01:\n            return torture_rsa_testkey_cert;\n        case SSH_KEYTYPE_ECDSA_P256_CERT01:\n            return torture_ecdsa256_testkey_cert;\n        case SSH_KEYTYPE_ECDSA_P384_CERT01:\n            return torture_ecdsa384_testkey_cert;\n        case SSH_KEYTYPE_ECDSA_P521_CERT01:\n            return torture_ecdsa521_testkey_cert;\n        case SSH_KEYTYPE_ED25519_CERT01:\n            return torture_ed25519_testkey_cert;\n        case SSH_KEYTYPE_RSA1:\n        case SSH_KEYTYPE_ECDSA:\n        case SSH_KEYTYPE_UNKNOWN:\n            return NULL;\n    }\n\n    return NULL;\n}\n\n/* Return the encrypted private key in a new OpenSSH format */\nconst char *torture_get_openssh_testkey(enum ssh_keytypes_e type,\n                                        bool with_passphrase)\n{\n    return torture_get_testkey_internal(type, with_passphrase, 0, 1);\n}\n\n/* Return the private key in PEM format */\nconst char *torture_get_testkey(enum ssh_keytypes_e type,\n                                bool with_passphrase)\n{\n#if defined(HAVE_LIBCRYPTO)\n        return torture_get_testkey_internal(type, with_passphrase, 0, 2);\n#else\n        return torture_get_testkey_internal(type, with_passphrase, 0, 0);\n#endif\n}\n\nconst char *torture_get_testkey_pub(enum ssh_keytypes_e type)\n{\n    return torture_get_testkey_internal(type, 0, 1, 0);\n}\n\nconst char *torture_get_testkey_passphrase(void)\n{\n    return TORTURE_TESTKEY_PASSWORD;\n}\n"
  },
  {
    "path": "src/libssh/tests/torture_key.h",
    "content": "/*\n * torture_key.h - torture library for testing libssh\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2008-2009 by Andreas Schneider <asn@cryptomilk.org>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#ifndef _TORTURE_KEY_H\n#define _TORTURE_KEY_H\n\n#include <stdbool.h>\n\n#define TORTURE_TESTKEY_PASSWORD \"libssh-rocks\"\n\n/* Return the encrypted private key in a new OpenSSH format */\nconst char *torture_get_openssh_testkey(enum ssh_keytypes_e type,\n                                        bool with_passphrase);\n\n/* Return the private key in the legacy PEM format */\nconst char *torture_get_testkey(enum ssh_keytypes_e type,\n                                bool with_passphrase);\nconst char *torture_get_testkey_passphrase(void);\n\nconst char *torture_get_testkey_pub(enum ssh_keytypes_e type);\n\n#endif /* _TORTURE_KEY_H */\n"
  },
  {
    "path": "src/libssh/tests/torture_pki.c",
    "content": "#include \"config.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <fcntl.h>\n\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#elif (defined _WIN32) || (defined _WIN64)\n#include <io.h>\n#define read _read\n#define open _open\n#define write _write\n#define close _close\n#endif\n\n#include \"torture_pki.h\"\n\nchar *torture_pki_read_file(const char *filename)\n{\n    char *key;\n    int fd;\n    int size;\n    int rc;\n    struct stat sb;\n\n    if (filename == NULL || filename[0] == '\\0') {\n        return NULL;\n    }\n\n    fd = open(filename, O_RDONLY);\n    if (fd < 0) {\n        return NULL;\n    }\n\n    rc = fstat(fd, &sb);\n    if (rc != 0) {\n        close(fd);\n        return NULL;\n    }\n\n    key = malloc(sb.st_size + 1);\n    if (key == NULL) {\n        close(fd);\n        return NULL;\n    }\n\n    size = read(fd, key, sb.st_size);\n    close(fd);\n    if (size != sb.st_size) {\n        free(key);\n        return NULL;\n    }\n\n    key[size] = '\\0';\n    return key;\n}\n\nint torture_read_one_line(const char *filename, char *buffer, size_t len)\n{\n    FILE *fp;\n    size_t nmemb;\n\n    fp = fopen(filename, \"r\");\n    if (fp == NULL) {\n        return -1;\n    }\n\n    nmemb = fread(buffer, len - 2, 1, fp);\n    if (nmemb != 0 || ferror(fp)) {\n        fclose(fp);\n        return -1;\n    }\n    buffer[len - 1] = '\\0';\n\n    fclose(fp);\n\n    return 0;\n}\n\n/**\n * @internal\n *\n * Returns the character len of a public key string, omitting the comment part\n */\nsize_t torture_pubkey_len(const char *pubkey)\n{\n    const char *ptr;\n\n    ptr = strchr(pubkey, ' ');\n    if (ptr != NULL) {\n        ptr = strchr(ptr + 1, ' ');\n        if (ptr != NULL) {\n            return ptr - pubkey;\n        }\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "src/libssh/tests/torture_pki.h",
    "content": "char *torture_pki_read_file(const char *filename);\nint torture_read_one_line(const char *filename, char *buffer, size_t len);\nsize_t torture_pubkey_len(const char *pubkey);\n"
  },
  {
    "path": "src/libssh/tests/unittests/CMakeLists.txt",
    "content": "project(unittests C)\n\ninclude_directories(${OPENSSL_INCLUDE_DIR})\n\nset(LIBSSH_UNIT_TESTS\n    torture_buffer\n    torture_bytearray\n    torture_callbacks\n    torture_crypto\n    torture_init\n    torture_list\n    torture_misc\n    torture_config\n    torture_options\n    torture_isipaddr\n    torture_knownhosts_parsing\n    torture_hashes\n    torture_packet_filter\n    torture_temp_dir\n    torture_temp_file\n    torture_push_pop_dir\n    torture_session_keys\n    torture_tokens\n)\n\nset(LIBSSH_THREAD_UNIT_TESTS\n    torture_rand\n    torture_threads_init\n    torture_threads_buffer\n    torture_threads_crypto\n)\n\nif (UNIX AND NOT WIN32)\n    set(LIBSSH_UNIT_TESTS\n        ${LIBSSH_UNIT_TESTS}\n        # this uses a socketpair\n        torture_packet\n        # requires ssh-keygen\n        torture_keyfiles\n        torture_pki\n        torture_pki_rsa\n        torture_pki_ed25519\n        # requires /dev/null\n        torture_channel\n    )\n\n    if (WITH_SERVER)\n        set(LIBSSH_UNIT_TESTS\n            ${LIBSSH_UNIT_TESTS}\n            torture_bind_config)\n\n        if (WITH_GEX)\n            set(LIBSSH_UNIT_TESTS\n                ${LIBSSH_UNIT_TESTS}\n                torture_moduli)\n        endif()\n    endif()\n\n\n    if (HAVE_DSA)\n        set(LIBSSH_UNIT_TESTS\n            ${LIBSSH_UNIT_TESTS}\n            torture_pki_dsa\n        )\n    endif()\n\n    if (HAVE_ECC)\n        set(LIBSSH_UNIT_TESTS\n            ${LIBSSH_UNIT_TESTS}\n            torture_pki_ecdsa\n        )\n    endif()\n\n    set(LIBSSH_THREAD_UNIT_TESTS\n        ${LIBSSH_THREAD_UNIT_TESTS}\n        # requires pthread\n        torture_threads_pki_rsa\n    )\n    # Not working correctly\n    #if (WITH_SERVER)\n    #    add_cmocka_test(torture_server_x11 torture_server_x11.c ${TEST_TARGET_LIBRARIES})\n    #endif (WITH_SERVER)\nendif (UNIX AND NOT WIN32)\n\nforeach(_UNIT_TEST ${LIBSSH_UNIT_TESTS})\n    add_cmocka_test(${_UNIT_TEST}\n                    SOURCES ${_UNIT_TEST}.c\n                    COMPILE_OPTIONS ${DEFAULT_C_COMPILE_FLAGS}\n                    LINK_LIBRARIES ${TEST_TARGET_LIBRARIES}\n    )\nendforeach()\n\nif (CMAKE_USE_PTHREADS_INIT)\n    foreach(_UNIT_TEST ${LIBSSH_THREAD_UNIT_TESTS})\n        add_cmocka_test(${_UNIT_TEST}\n                        SOURCES ${_UNIT_TEST}.c\n                        COMPILE_OPTIONS ${DEFAULT_C_COMPILE_FLAGS}\n                        LINK_LIBRARIES ${TEST_TARGET_LIBRARIES} Threads::Threads\n        )\n    endforeach()\nendif ()\n\n"
  },
  {
    "path": "src/libssh/tests/unittests/torture_bind_config.c",
    "content": "/*\n * torture_bind_config.c - Tests for server side configuration\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2019 by Red Hat, Inc.\n *\n * Author: Anderson Toshiyuki Sasaki <ansasaki@redhat.com>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include \"torture.h\"\n#include \"torture_key.h\"\n\n#include <libssh/bind_config.h>\n#include <libssh/bind.h>\n\nextern LIBSSH_THREAD int ssh_log_level;\n\n#define LOGLEVEL \"verbose\"\n#define LOGLEVEL2 \"fatal\"\n#define LOGLEVEL3 \"DEBUG1\"\n#define LOGLEVEL4 \"DEBUG2\"\n#define LISTEN_ADDRESS \"::1\"\n#define LISTEN_ADDRESS2 \"::2\"\n#define KEXALGORITHMS \"ecdh-sha2-nistp521,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group14-sha1\"\n#define KEXALGORITHMS2 \"ecdh-sha2-nistp521\"\n#define CIPHERS \"aes128-ctr,aes192-ctr,aes256-ctr\"\n#define CIPHERS2 \"aes256-ctr\"\n#define HOSTKEYALGORITHMS \"ssh-ed25519,ecdsa-sha2-nistp521,ssh-rsa\"\n#define HOSTKEYALGORITHMS_UNKNOWN \"ssh-ed25519,ecdsa-sha2-nistp521,unknown,ssh-rsa\"\n#define HOSTKEYALGORITHMS2 \"rsa-sha2-256\"\n#define PUBKEYACCEPTEDTYPES \"rsa-sha2-512,ssh-rsa,ecdsa-sha2-nistp521\"\n#define PUBKEYACCEPTEDTYPES_UNKNOWN \"rsa-sha2-512,ssh-rsa,unknown,ecdsa-sha2-nistp521\"\n#define PUBKEYACCEPTEDTYPES2 \"rsa-sha2-256,ssh-rsa\"\n#define MACS \"hmac-sha1,hmac-sha2-256,hmac-sha2-512,hmac-sha1-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com\"\n#define MACS2 \"hmac-sha1\"\n\n#ifdef HAVE_DSA\n#define LIBSSH_DSA_TESTKEY        \"libssh_testkey.id_dsa\"\n#endif\n#define LIBSSH_RSA_TESTKEY        \"libssh_testkey.id_rsa\"\n#define LIBSSH_ED25519_TESTKEY    \"libssh_testkey.id_ed25519\"\n#ifdef HAVE_ECC\n#define LIBSSH_ECDSA_521_TESTKEY  \"libssh_testkey.id_ecdsa521\"\n#endif\n\n#define LIBSSH_TEST_BIND_CONFIG_LISTENADDRESS \"libssh_test_bind_config_listenaddress\"\n#define LIBSSH_TEST_BIND_CONFIG_LISTENADDRESS2 \"libssh_test_bind_config_listenaddress2\"\n#define LIBSSH_TEST_BIND_CONFIG_LISTENADDRESS_TWICE \"libssh_test_bind_config_listenaddress_twice\"\n#define LIBSSH_TEST_BIND_CONFIG_LISTENADDRESS_TWICE_REC \"libssh_test_bind_config_listenaddress_twice_rec\"\n#define LIBSSH_TEST_BIND_CONFIG_PORT \"libssh_test_bind_config_port\"\n#define LIBSSH_TEST_BIND_CONFIG_PORT2 \"libssh_test_bind_config_port2\"\n#define LIBSSH_TEST_BIND_CONFIG_PORT_TWICE \"libssh_test_bind_config_port_twice\"\n#define LIBSSH_TEST_BIND_CONFIG_PORT_TWICE_REC \"libssh_test_bind_config_port_twice_rec\"\n#define LIBSSH_TEST_BIND_CONFIG_HOSTKEY \"libssh_test_bind_config_hostkey\"\n#define LIBSSH_TEST_BIND_CONFIG_HOSTKEY2 \"libssh_test_bind_config_hostkey2\"\n#define LIBSSH_TEST_BIND_CONFIG_HOSTKEY_TWICE \"libssh_test_bind_config_hostkey_twice\"\n#define LIBSSH_TEST_BIND_CONFIG_HOSTKEY_TWICE_REC \"libssh_test_bind_config_hostkey_twice_rec\"\n#define LIBSSH_TEST_BIND_CONFIG_LOGLEVEL \"libssh_test_bind_config_loglevel\"\n#define LIBSSH_TEST_BIND_CONFIG_LOGLEVEL2 \"libssh_test_bind_config_loglevel2\"\n#define LIBSSH_TEST_BIND_CONFIG_LOGLEVEL_TWICE \"libssh_test_bind_config_loglevel_twice\"\n#define LIBSSH_TEST_BIND_CONFIG_LOGLEVEL_TWICE_REC \"libssh_test_bind_config_loglevel_twice_rec\"\n#define LIBSSH_TEST_BIND_CONFIG_CIPHERS \"libssh_test_bind_config_ciphers\"\n#define LIBSSH_TEST_BIND_CONFIG_CIPHERS2 \"libssh_test_bind_config_ciphers2\"\n#define LIBSSH_TEST_BIND_CONFIG_CIPHERS_TWICE \"libssh_test_bind_config_ciphers_twice\"\n#define LIBSSH_TEST_BIND_CONFIG_CIPHERS_TWICE_REC \"libssh_test_bind_config_ciphers_twice_rec\"\n#define LIBSSH_TEST_BIND_CONFIG_MACS \"libssh_test_bind_config_macs\"\n#define LIBSSH_TEST_BIND_CONFIG_MACS2 \"libssh_test_bind_config_macs2\"\n#define LIBSSH_TEST_BIND_CONFIG_MACS_TWICE \"libssh_test_bind_config_macs_twice\"\n#define LIBSSH_TEST_BIND_CONFIG_MACS_TWICE_REC \"libssh_test_bind_config_macs_twice_rec\"\n#define LIBSSH_TEST_BIND_CONFIG_KEXALGORITHMS \"libssh_test_bind_config_kexalgorithms\"\n#define LIBSSH_TEST_BIND_CONFIG_KEXALGORITHMS2 \"libssh_test_bind_config_kexalgorithms2\"\n#define LIBSSH_TEST_BIND_CONFIG_KEXALGORITHMS_TWICE \"libssh_test_bind_config_kexalgorithms_twice\"\n#define LIBSSH_TEST_BIND_CONFIG_KEXALGORITHMS_TWICE_REC \"libssh_test_bind_config_kexalgorithms_twice_rec\"\n\n#define LIBSSH_TEST_BIND_CONFIG_FULL \"libssh_test_bind_config_full\"\n#define LIBSSH_TEST_BIND_CONFIG_INCLUDE \"libssh_test_bind_config_include\"\n#define LIBSSH_TEST_BIND_CONFIG_INCLUDE_RECURSIVE \"libssh_test_bind_config_include_recursive\"\n#define LIBSSH_TEST_BIND_CONFIG_CORNER_CASES \"libssh_test_bind_config_corner_cases\"\n\n#define LIBSSH_TEST_BIND_CONFIG_MATCH_ALL \"libssh_test_bind_config_match_all\"\n#define LIBSSH_TEST_BIND_CONFIG_MATCH_TWICE \"libssh_test_bind_config_match_twice\"\n#define LIBSSH_TEST_BIND_CONFIG_MATCH_UNSUPPORTED \"libssh_test_bind_config_match_unsupported\"\n#define LIBSSH_TEST_BIND_CONFIG_MATCH_NOT_ALLOWED \"libssh_test_bind_config_match_not_allowed\"\n#define LIBSSH_TEST_BIND_CONFIG_MATCH_CORNER_CASES \"libssh_test_bind_config_match_corner_cases\"\n#define LIBSSH_TEST_BIND_CONFIG_MATCH_INVALID \"libssh_test_bind_config_match_invalid\"\n#define LIBSSH_TEST_BIND_CONFIG_MATCH_INVALID2 \"libssh_test_bind_config_match_invalid2\"\n\n#define LIBSSH_TEST_BIND_CONFIG_PUBKEY_ACCEPTED \"libssh_test_bind_config_pubkey\"\n#define LIBSSH_TEST_BIND_CONFIG_PUBKEY_ACCEPTED2 \"libssh_test_bind_config_pubkey2\"\n#define LIBSSH_TEST_BIND_CONFIG_PUBKEY_ACCEPTED_TWICE \"libssh_test_bind_config_pubkey_twice\"\n#define LIBSSH_TEST_BIND_CONFIG_PUBKEY_ACCEPTED_TWICE_REC \"libssh_test_bind_config_pubkey_twice_rec\"\n#define LIBSSH_TEST_BIND_CONFIG_PUBKEY_ACCEPTED_UNKNOWN \"libssh_test_bind_config_pubkey_unknown\"\n\n#define LIBSSH_TEST_BIND_CONFIG_HOSTKEY_ALGORITHMS \"libssh_test_bind_config_hostkey_alg\"\n#define LIBSSH_TEST_BIND_CONFIG_HOSTKEY_ALGORITHMS2 \"libssh_test_bind_config_hostkey_alg2\"\n#define LIBSSH_TEST_BIND_CONFIG_HOSTKEY_ALGORITHMS_TWICE \"libssh_test_bind_config_hostkey_alg_twice\"\n#define LIBSSH_TEST_BIND_CONFIG_HOSTKEY_ALGORITHMS_TWICE_REC \"libssh_test_bind_config_hostkey_alg_twice_rec\"\n#define LIBSSH_TEST_BIND_CONFIG_HOSTKEY_ALGORITHMS_UNKNOWN \"libssh_test_bind_config_hostkey_alg_unknown\"\n\nconst char template[] = \"temp_dir_XXXXXX\";\n\nstruct bind_st {\n    char *cwd;\n    char *temp_dir;\n    ssh_bind bind;\n};\n\nstatic int setup_config_files(void **state)\n{\n    struct bind_st *test_state = NULL;\n    char *cwd = NULL;\n    char *tmp_dir = NULL;\n    int rc = 0;\n\n    test_state = (struct bind_st *)malloc(sizeof(struct bind_st));\n    assert_non_null(test_state);\n\n    cwd = torture_get_current_working_dir();\n    assert_non_null(cwd);\n\n    tmp_dir = torture_make_temp_dir(template);\n    assert_non_null(tmp_dir);\n\n    test_state->cwd = cwd;\n    test_state->temp_dir = tmp_dir;\n\n    *state = test_state;\n\n    rc = torture_change_dir(tmp_dir);\n    assert_int_equal(rc, 0);\n\n    printf(\"Changed directory to: %s\\n\", tmp_dir);\n\n    /* For ed25519 the test keys are not available in legacy PEM format. Using\n     * the new OpenSSH format for all algorithms */\n    torture_write_file(LIBSSH_RSA_TESTKEY,\n                       torture_get_openssh_testkey(SSH_KEYTYPE_RSA, 0));\n\n    torture_write_file(LIBSSH_ED25519_TESTKEY,\n                       torture_get_openssh_testkey(SSH_KEYTYPE_ED25519, 0));\n#ifdef HAVE_ECC\n    torture_write_file(LIBSSH_ECDSA_521_TESTKEY,\n                       torture_get_openssh_testkey(SSH_KEYTYPE_ECDSA_P521, 0));\n#endif\n#ifdef HAVE_DSA\n    torture_write_file(LIBSSH_DSA_TESTKEY,\n                       torture_get_openssh_testkey(SSH_KEYTYPE_DSS, 0));\n#endif\n\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_LISTENADDRESS,\n                       \"ListenAddress \"LISTEN_ADDRESS\"\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_LISTENADDRESS2,\n                       \"ListenAddress \"LISTEN_ADDRESS2\"\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_LISTENADDRESS_TWICE,\n                       \"ListenAddress \"LISTEN_ADDRESS\"\\n\"\n                       \"ListenAddress \"LISTEN_ADDRESS2\"\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_LISTENADDRESS_TWICE_REC,\n                       \"ListenAddress \"LISTEN_ADDRESS\"\\n\"\n                       \"Include \"LIBSSH_TEST_BIND_CONFIG_LISTENADDRESS2\"\\n\");\n\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_PORT,\n                       \"Port 123\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_PORT2,\n                       \"Port 456\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_PORT_TWICE,\n                       \"Port 123\\n\"\n                       \"Port 456\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_PORT_TWICE_REC,\n                       \"Port 123\\n\"\n                       \"Include \"LIBSSH_TEST_BIND_CONFIG_PORT2\"\\n\");\n\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_HOSTKEY,\n                       \"HostKey \"LIBSSH_ECDSA_521_TESTKEY\"\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_HOSTKEY2,\n                       \"HostKey \"LIBSSH_RSA_TESTKEY\"\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_HOSTKEY_TWICE,\n                       \"HostKey \"LIBSSH_ECDSA_521_TESTKEY\"\\n\"\n                       \"HostKey \"LIBSSH_RSA_TESTKEY\"\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_HOSTKEY_TWICE_REC,\n                       \"HostKey \"LIBSSH_ECDSA_521_TESTKEY\"\\n\"\n                       \"Include \"LIBSSH_TEST_BIND_CONFIG_HOSTKEY2\"\\n\");\n\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_LOGLEVEL,\n                       \"LogLevel \"LOGLEVEL\"\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_LOGLEVEL2,\n                       \"LogLevel \"LOGLEVEL2\"\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_LOGLEVEL_TWICE,\n                       \"LogLevel \"LOGLEVEL\"\\n\"\n                       \"LogLevel \"LOGLEVEL2\"\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_LOGLEVEL_TWICE_REC,\n                       \"LogLevel \"LOGLEVEL\"\\n\"\n                       \"Include \"LIBSSH_TEST_BIND_CONFIG_LOGLEVEL2\"\\n\");\n\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_CIPHERS,\n                       \"Ciphers \"CIPHERS\"\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_CIPHERS2,\n                       \"Ciphers \"CIPHERS2\"\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_CIPHERS_TWICE,\n                       \"Ciphers \"CIPHERS\"\\n\"\n                       \"Ciphers \"CIPHERS2\"\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_CIPHERS_TWICE_REC,\n                       \"Ciphers \"CIPHERS\"\\n\"\n                       \"Include \"LIBSSH_TEST_BIND_CONFIG_CIPHERS2\"\\n\");\n\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_MACS,\n                       \"MACs \"MACS\"\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_MACS2,\n                       \"MACs \"MACS2\"\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_MACS_TWICE,\n                       \"MACs \"MACS\"\\n\"\n                       \"MACs \"MACS2\"\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_MACS_TWICE_REC,\n                       \"MACs \"MACS\"\\n\"\n                       \"Include \"LIBSSH_TEST_BIND_CONFIG_MACS2\"\\n\");\n\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_KEXALGORITHMS,\n                       \"KexAlgorithms \"KEXALGORITHMS\"\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_KEXALGORITHMS2,\n                       \"KexAlgorithms \"KEXALGORITHMS2\"\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_KEXALGORITHMS_TWICE,\n                       \"KexAlgorithms \"KEXALGORITHMS\"\\n\"\n                       \"KexAlgorithms \"KEXALGORITHMS2\"\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_KEXALGORITHMS_TWICE_REC,\n                       \"KexAlgorithms \"KEXALGORITHMS\"\\n\"\n                       \"Include \"LIBSSH_TEST_BIND_CONFIG_KEXALGORITHMS2\"\\n\");\n\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_FULL,\n                       \"ListenAddress \"LISTEN_ADDRESS\"\\n\"\n                       \"Port 123\\n\"\n                       \"HostKey \"LIBSSH_ECDSA_521_TESTKEY\"\\n\"\n                       \"LogLevel \"LOGLEVEL\"\\n\"\n                       \"Ciphers \"CIPHERS\"\\n\"\n                       \"MACs \"MACS\"\\n\"\n                       \"KexAlgorithms \"KEXALGORITHMS\"\\n\");\n\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_INCLUDE,\n                       \"Include \"LIBSSH_TEST_BIND_CONFIG_LISTENADDRESS\"\\n\"\n                       \"Include \"LIBSSH_TEST_BIND_CONFIG_PORT\"\\n\"\n                       \"Include \"LIBSSH_TEST_BIND_CONFIG_HOSTKEY\"\\n\"\n                       \"Include \"LIBSSH_TEST_BIND_CONFIG_LOGLEVEL\"\\n\"\n                       \"Include \"LIBSSH_TEST_BIND_CONFIG_CIPHERS\"\\n\"\n                       \"Include \"LIBSSH_TEST_BIND_CONFIG_MACS\"\\n\"\n                       \"Include \"LIBSSH_TEST_BIND_CONFIG_KEXALGORITHMS\"\\n\");\n\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_INCLUDE_RECURSIVE,\n                       \"Include \"LIBSSH_TEST_BIND_CONFIG_INCLUDE\"\\n\");\n\n    /* Unsupported options and corner cases */\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_CORNER_CASES,\n                       \"\\n\" /* empty line */\n                       \"# comment line\\n\"\n                       \"  # comment line not starting with hash\\n\"\n                       \"UnknownConfigurationOption yes\\n\"\n                       \"Ciphers \"CIPHERS2\"\\n\");\n\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_MATCH_ALL,\n                       \"Include \"LIBSSH_TEST_BIND_CONFIG_FULL\"\\n\"\n                       \"Match All\\n\"\n                       \"\\tLogLevel \"LOGLEVEL2\"\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_MATCH_TWICE,\n                       \"Include \"LIBSSH_TEST_BIND_CONFIG_FULL\"\\n\"\n                       \"Match All\\n\"\n                       \"\\tLogLevel \"LOGLEVEL2\"\\n\"\n                       \"Match All\\n\"\n                       \"\\tLogLevel \"LOGLEVEL3\"\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_MATCH_UNSUPPORTED,\n                       \"Include \"LIBSSH_TEST_BIND_CONFIG_FULL\"\\n\"\n                       \"Match User alice\\n\"\n                       \"\\tLogLevel \"LOGLEVEL2\"\\n\"\n                       \"Match Group sftp_users\\n\"\n                       \"\\tLogLevel \"LOGLEVEL2\"\\n\"\n                       \"Match Host 192.168.0.*\\n\"\n                       \"\\tLogLevel \"LOGLEVEL2\"\\n\"\n                       \"Match LocalAddress 172.30.1.5\\n\"\n                       \"\\tLogLevel \"LOGLEVEL2\"\\n\"\n                       \"Match LocalPort 42\\n\"\n                       \"\\tLogLevel \"LOGLEVEL2\"\\n\"\n                       \"Match Rdomain 4\\n\"\n                       \"\\tLogLevel \"LOGLEVEL2\"\\n\"\n                       \"Match Address 10.0.0.10\\n\"\n                       \"\\tLogLevel \"LOGLEVEL2\"\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_MATCH_NOT_ALLOWED,\n                       \"Include \"LIBSSH_TEST_BIND_CONFIG_FULL\"\\n\"\n                       \"Match All\\n\"\n                       \"\\tListenAddress \"LISTEN_ADDRESS2\"\\n\"\n                       \"\\tPort 456\\n\"\n                       \"\\tHostKey \"LIBSSH_RSA_TESTKEY\"\\n\"\n                       \"\\tCiphers \"CIPHERS2\"\\n\"\n                       \"\\tMACs \"MACS2\"\\n\"\n                       \"\\tKexAlgorithms \"KEXALGORITHMS2\"\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_MATCH_CORNER_CASES,\n                       \"Include \"LIBSSH_TEST_BIND_CONFIG_FULL\"\\n\"\n                       \"Match User alice\\n\"\n                       \"\\tLogLevel \"LOGLEVEL2\"\\n\"\n                       \"Match All\\n\"\n                       \"\\tLogLevel \"LOGLEVEL3\"\\n\"\n                       \"Match All\\n\"\n                       \"\\tLogLevel \"LOGLEVEL\"\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_MATCH_INVALID,\n                       \"Include \"LIBSSH_TEST_BIND_CONFIG_FULL\"\\n\"\n                       \"Match User alice All\\n\"\n                       \"\\tLogLevel \"LOGLEVEL2\"\\n\"\n                       \"Match All\\n\"\n                       \"\\tLogLevel \"LOGLEVEL3\"\\n\"\n                       \"Match All\\n\"\n                       \"\\tLogLevel \"LOGLEVEL4\"\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_MATCH_INVALID2,\n                       \"Include \"LIBSSH_TEST_BIND_CONFIG_FULL\"\\n\"\n                       \"Match All User alice\\n\"\n                       \"\\tLogLevel \"LOGLEVEL2\"\\n\"\n                       \"Match All\\n\"\n                       \"\\tLogLevel \"LOGLEVEL3\"\\n\"\n                       \"Match All\\n\"\n                       \"\\tLogLevel \"LOGLEVEL4\"\\n\");\n\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_PUBKEY_ACCEPTED,\n                       \"PubkeyAcceptedKeyTypes \"PUBKEYACCEPTEDTYPES\"\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_PUBKEY_ACCEPTED2,\n                       \"PubkeyAcceptedKeyTypes \"PUBKEYACCEPTEDTYPES2\"\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_PUBKEY_ACCEPTED_TWICE,\n                       \"PubkeyAcceptedKeyTypes \"PUBKEYACCEPTEDTYPES\"\\n\"\n                       \"PubkeyAcceptedKeyTypes \"PUBKEYACCEPTEDTYPES2\"\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_PUBKEY_ACCEPTED_TWICE_REC,\n                       \"PubkeyAcceptedKeyTypes \"PUBKEYACCEPTEDTYPES2\"\\n\"\n                       \"Include \"LIBSSH_TEST_BIND_CONFIG_KEXALGORITHMS\"\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_PUBKEY_ACCEPTED_UNKNOWN,\n                       \"PubkeyAcceptedKeyTypes \"PUBKEYACCEPTEDTYPES_UNKNOWN\"\\n\");\n\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_HOSTKEY_ALGORITHMS,\n                       \"HostKeyAlgorithms \"HOSTKEYALGORITHMS\"\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_HOSTKEY_ALGORITHMS2,\n                       \"HostKeyAlgorithms \"HOSTKEYALGORITHMS2\"\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_HOSTKEY_ALGORITHMS_TWICE,\n                       \"HostKeyAlgorithms \"HOSTKEYALGORITHMS\"\\n\"\n                       \"HostKeyAlgorithms \"HOSTKEYALGORITHMS2\"\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_HOSTKEY_ALGORITHMS_TWICE_REC,\n                       \"HostKeyAlgorithms \"HOSTKEYALGORITHMS2\"\\n\"\n                       \"Include \"LIBSSH_TEST_BIND_CONFIG_KEXALGORITHMS\"\\n\");\n    torture_write_file(LIBSSH_TEST_BIND_CONFIG_HOSTKEY_ALGORITHMS_UNKNOWN,\n                       \"HostKeyAlgorithms \"HOSTKEYALGORITHMS_UNKNOWN\"\\n\");\n    return 0;\n}\n\nstatic int sshbind_setup(void **state)\n{\n    int rc;\n    struct bind_st *test_state = NULL;\n\n    rc = setup_config_files((void **)&test_state);\n    assert_int_equal(rc, 0);\n    assert_non_null(test_state);\n\n    test_state->bind = ssh_bind_new();\n    assert_non_null(test_state->bind);\n\n    *state = test_state;\n\n    return 0;\n}\n\nstatic int sshbind_teardown(void **state)\n{\n    struct bind_st *test_state = NULL;\n    int rc;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n\n    assert_non_null(test_state);\n    assert_non_null(test_state->cwd);\n    assert_non_null(test_state->temp_dir);\n    assert_non_null(test_state->bind);\n\n    rc = torture_change_dir(test_state->cwd);\n    assert_int_equal(rc, 0);\n\n    rc = torture_rmdirs(test_state->temp_dir);\n    assert_int_equal(rc, 0);\n\n    SAFE_FREE(test_state->temp_dir);\n    SAFE_FREE(test_state->cwd);\n    ssh_bind_free(test_state->bind);\n    SAFE_FREE(test_state);\n\n    return 0;\n}\n\nstatic void torture_bind_config_listen_address(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int rc;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_LISTENADDRESS);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->bindaddr);\n    assert_string_equal(bind->bindaddr, LISTEN_ADDRESS);\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_LISTENADDRESS_TWICE);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->bindaddr);\n    assert_string_equal(bind->bindaddr, LISTEN_ADDRESS);\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_LISTENADDRESS_TWICE_REC);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->bindaddr);\n    assert_string_equal(bind->bindaddr, LISTEN_ADDRESS);\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_LISTENADDRESS2);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->bindaddr);\n    assert_string_equal(bind->bindaddr, LISTEN_ADDRESS2);\n\n}\n\nstatic void torture_bind_config_port(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int rc;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    rc = ssh_bind_config_parse_file(bind, LIBSSH_TEST_BIND_CONFIG_PORT);\n    assert_int_equal(rc, 0);\n    assert_int_equal(bind->bindport, 123);\n\n    rc = ssh_bind_config_parse_file(bind, LIBSSH_TEST_BIND_CONFIG_PORT_TWICE);\n    assert_int_equal(rc, 0);\n    assert_int_equal(bind->bindport, 123);\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_PORT_TWICE_REC);\n    assert_int_equal(rc, 0);\n    assert_int_equal(bind->bindport, 123);\n\n    rc = ssh_bind_config_parse_file(bind, LIBSSH_TEST_BIND_CONFIG_PORT2);\n    assert_int_equal(rc, 0);\n    assert_int_equal(bind->bindport, 456);\n}\n\nstatic void torture_bind_config_hostkey(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int rc;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    rc = ssh_bind_config_parse_file(bind, LIBSSH_TEST_BIND_CONFIG_HOSTKEY);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->ecdsakey);\n    assert_string_equal(bind->ecdsakey, LIBSSH_ECDSA_521_TESTKEY);\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_HOSTKEY_TWICE);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->ecdsakey);\n    assert_string_equal(bind->ecdsakey, LIBSSH_ECDSA_521_TESTKEY);\n    assert_non_null(bind->rsakey);\n    assert_string_equal(bind->rsakey, LIBSSH_RSA_TESTKEY);\n}\n\nstatic void torture_bind_config_hostkey_twice_rec(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int rc;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_HOSTKEY_TWICE_REC);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->ecdsakey);\n    assert_string_equal(bind->ecdsakey, LIBSSH_ECDSA_521_TESTKEY);\n    assert_non_null(bind->rsakey);\n    assert_string_equal(bind->rsakey, LIBSSH_RSA_TESTKEY);\n}\n\nstatic void torture_bind_config_hostkey_separately(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int rc;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    rc = ssh_bind_config_parse_file(bind, LIBSSH_TEST_BIND_CONFIG_HOSTKEY);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->ecdsakey);\n    assert_string_equal(bind->ecdsakey, LIBSSH_ECDSA_521_TESTKEY);\n\n    rc = ssh_bind_config_parse_file(bind, LIBSSH_TEST_BIND_CONFIG_HOSTKEY2);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->rsakey);\n    assert_string_equal(bind->rsakey, LIBSSH_RSA_TESTKEY);\n    assert_non_null(bind->ecdsakey);\n    assert_string_equal(bind->ecdsakey, LIBSSH_ECDSA_521_TESTKEY);\n}\n\nstatic void torture_bind_config_loglevel(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int rc;\n    int previous_level, new_level;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    previous_level = ssh_get_log_level();\n\n    rc = ssh_bind_config_parse_file(bind, LIBSSH_TEST_BIND_CONFIG_LOGLEVEL);\n    assert_int_equal(rc, 0);\n\n    new_level = ssh_get_log_level();\n    assert_int_equal(new_level, 2);\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_LOGLEVEL_TWICE);\n    assert_int_equal(rc, 0);\n\n    new_level = ssh_get_log_level();\n    assert_int_equal(new_level, 2);\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_LOGLEVEL_TWICE_REC);\n    assert_int_equal(rc, 0);\n\n    new_level = ssh_get_log_level();\n    assert_int_equal(new_level, 2);\n\n    rc = ssh_bind_config_parse_file(bind, LIBSSH_TEST_BIND_CONFIG_LOGLEVEL2);\n    assert_int_equal(rc, 0);\n\n    new_level = ssh_get_log_level();\n    assert_int_equal(new_level, 1);\n\n    rc = ssh_set_log_level(previous_level);\n    assert_int_equal(rc, SSH_OK);\n}\n\nstatic void torture_bind_config_ciphers(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int rc;\n    char *fips_ciphers = NULL;\n    char *fips_ciphers2 = NULL;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    if (ssh_fips_mode()) {\n        fips_ciphers = ssh_keep_fips_algos(SSH_CRYPT_C_S, CIPHERS);\n        assert_non_null(fips_ciphers);\n        fips_ciphers2 = ssh_keep_fips_algos(SSH_CRYPT_C_S, CIPHERS2);\n        assert_non_null(fips_ciphers2);\n    }\n\n    rc = ssh_bind_config_parse_file(bind, LIBSSH_TEST_BIND_CONFIG_CIPHERS);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->wanted_methods[SSH_CRYPT_C_S]);\n    assert_non_null(bind->wanted_methods[SSH_CRYPT_S_C]);\n    if (ssh_fips_mode()) {\n        assert_string_equal(bind->wanted_methods[SSH_CRYPT_C_S], fips_ciphers);\n        assert_string_equal(bind->wanted_methods[SSH_CRYPT_S_C], fips_ciphers);\n    } else {\n        assert_string_equal(bind->wanted_methods[SSH_CRYPT_C_S], CIPHERS);\n        assert_string_equal(bind->wanted_methods[SSH_CRYPT_S_C], CIPHERS);\n    }\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_CIPHERS_TWICE);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->wanted_methods[SSH_CRYPT_C_S]);\n    assert_non_null(bind->wanted_methods[SSH_CRYPT_S_C]);\n    if (ssh_fips_mode()) {\n        assert_string_equal(bind->wanted_methods[SSH_CRYPT_C_S], fips_ciphers);\n        assert_string_equal(bind->wanted_methods[SSH_CRYPT_S_C], fips_ciphers);\n    } else {\n        assert_string_equal(bind->wanted_methods[SSH_CRYPT_C_S], CIPHERS);\n        assert_string_equal(bind->wanted_methods[SSH_CRYPT_S_C], CIPHERS);\n    }\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_CIPHERS_TWICE_REC);\n    assert_int_equal(rc, 0);\n\n    assert_non_null(bind->wanted_methods[SSH_CRYPT_C_S]);\n    assert_non_null(bind->wanted_methods[SSH_CRYPT_S_C]);\n    if (ssh_fips_mode()) {\n        assert_string_equal(bind->wanted_methods[SSH_CRYPT_C_S], fips_ciphers);\n        assert_string_equal(bind->wanted_methods[SSH_CRYPT_S_C], fips_ciphers);\n    } else {\n        assert_string_equal(bind->wanted_methods[SSH_CRYPT_C_S], CIPHERS);\n        assert_string_equal(bind->wanted_methods[SSH_CRYPT_S_C], CIPHERS);\n    }\n\n    rc = ssh_bind_config_parse_file(bind, LIBSSH_TEST_BIND_CONFIG_CIPHERS2);\n    assert_int_equal(rc, 0);\n\n    assert_non_null(bind->wanted_methods[SSH_CRYPT_C_S]);\n    assert_non_null(bind->wanted_methods[SSH_CRYPT_S_C]);\n    if (ssh_fips_mode()) {\n        assert_string_equal(bind->wanted_methods[SSH_CRYPT_C_S], fips_ciphers2);\n        assert_string_equal(bind->wanted_methods[SSH_CRYPT_S_C], fips_ciphers2);\n    } else {\n        assert_string_equal(bind->wanted_methods[SSH_CRYPT_C_S], CIPHERS2);\n        assert_string_equal(bind->wanted_methods[SSH_CRYPT_S_C], CIPHERS2);\n    }\n\n    SAFE_FREE(fips_ciphers);\n    SAFE_FREE(fips_ciphers2);\n}\n\nstatic void torture_bind_config_macs(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int rc;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    rc = ssh_bind_config_parse_file(bind, LIBSSH_TEST_BIND_CONFIG_MACS);\n    assert_int_equal(rc, 0);\n\n    assert_non_null(bind->wanted_methods[SSH_MAC_S_C]);\n    assert_string_equal(bind->wanted_methods[SSH_MAC_S_C], MACS);\n\n    assert_non_null(bind->wanted_methods[SSH_MAC_C_S]);\n    assert_string_equal(bind->wanted_methods[SSH_MAC_C_S], MACS);\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_MACS_TWICE);\n    assert_int_equal(rc, 0);\n\n    assert_non_null(bind->wanted_methods[SSH_MAC_S_C]);\n    assert_string_equal(bind->wanted_methods[SSH_MAC_S_C], MACS);\n\n    assert_non_null(bind->wanted_methods[SSH_MAC_C_S]);\n    assert_string_equal(bind->wanted_methods[SSH_MAC_C_S], MACS);\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_MACS_TWICE_REC);\n    assert_int_equal(rc, 0);\n\n    assert_non_null(bind->wanted_methods[SSH_MAC_S_C]);\n    assert_string_equal(bind->wanted_methods[SSH_MAC_S_C], MACS);\n\n    assert_non_null(bind->wanted_methods[SSH_MAC_C_S]);\n    assert_string_equal(bind->wanted_methods[SSH_MAC_C_S], MACS);\n\n    rc = ssh_bind_config_parse_file(bind, LIBSSH_TEST_BIND_CONFIG_MACS2);\n    assert_int_equal(rc, 0);\n\n    assert_non_null(bind->wanted_methods[SSH_MAC_S_C]);\n    assert_string_equal(bind->wanted_methods[SSH_MAC_S_C], MACS2);\n\n    assert_non_null(bind->wanted_methods[SSH_MAC_C_S]);\n    assert_string_equal(bind->wanted_methods[SSH_MAC_C_S], MACS2);\n}\n\nstatic void torture_bind_config_kexalgorithms(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    char *fips_kex = NULL;\n    char *fips_kex2 = NULL;\n    int rc;\n\n    if (ssh_fips_mode()) {\n        fips_kex = ssh_keep_fips_algos(SSH_KEX, KEXALGORITHMS);\n        assert_non_null(fips_kex);\n        fips_kex2 = ssh_keep_fips_algos(SSH_KEX, KEXALGORITHMS2);\n        assert_non_null(fips_kex2);\n    }\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_KEXALGORITHMS);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->wanted_methods[SSH_KEX]);\n    if (ssh_fips_mode()) {\n        assert_string_equal(bind->wanted_methods[SSH_KEX], fips_kex);\n    } else {\n        assert_string_equal(bind->wanted_methods[SSH_KEX], KEXALGORITHMS);\n    }\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_KEXALGORITHMS_TWICE);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->wanted_methods[SSH_KEX]);\n    if (ssh_fips_mode()) {\n        assert_string_equal(bind->wanted_methods[SSH_KEX], fips_kex);\n    } else {\n        assert_string_equal(bind->wanted_methods[SSH_KEX], KEXALGORITHMS);\n    }\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_KEXALGORITHMS_TWICE_REC);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->wanted_methods[SSH_KEX]);\n    if (ssh_fips_mode()) {\n        assert_string_equal(bind->wanted_methods[SSH_KEX], fips_kex);\n    } else {\n        assert_string_equal(bind->wanted_methods[SSH_KEX], KEXALGORITHMS);\n    }\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_KEXALGORITHMS2);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->wanted_methods[SSH_KEX]);\n    if (ssh_fips_mode()) {\n        assert_string_equal(bind->wanted_methods[SSH_KEX], fips_kex2);\n    } else {\n        assert_string_equal(bind->wanted_methods[SSH_KEX], KEXALGORITHMS2);\n    }\n\n    SAFE_FREE(fips_kex);\n    SAFE_FREE(fips_kex2);\n}\n\nstatic void torture_bind_config_pubkey_accepted(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int rc;\n    char *fips_pubkeys = NULL;\n    char *fips_pubkeys2 = NULL;\n\n    if (ssh_fips_mode()) {\n        fips_pubkeys = ssh_keep_fips_algos(SSH_HOSTKEYS, PUBKEYACCEPTEDTYPES);\n        assert_non_null(fips_pubkeys);\n        fips_pubkeys2 = ssh_keep_fips_algos(SSH_HOSTKEYS, PUBKEYACCEPTEDTYPES2);\n        assert_non_null(fips_pubkeys2);\n    }\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_PUBKEY_ACCEPTED);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->pubkey_accepted_key_types);\n    if (ssh_fips_mode()) {\n        assert_string_equal(bind->pubkey_accepted_key_types, fips_pubkeys);\n    } else {\n        assert_string_equal(bind->pubkey_accepted_key_types, PUBKEYACCEPTEDTYPES);\n    }\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_PUBKEY_ACCEPTED2);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->pubkey_accepted_key_types);\n    if (ssh_fips_mode()) {\n        assert_string_equal(bind->pubkey_accepted_key_types, fips_pubkeys2);\n    } else {\n        assert_string_equal(bind->pubkey_accepted_key_types, PUBKEYACCEPTEDTYPES2);\n    }\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_PUBKEY_ACCEPTED_TWICE);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->pubkey_accepted_key_types);\n    if (ssh_fips_mode()) {\n        assert_string_equal(bind->pubkey_accepted_key_types, fips_pubkeys);\n    } else {\n        assert_string_equal(bind->pubkey_accepted_key_types, PUBKEYACCEPTEDTYPES);\n    }\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_PUBKEY_ACCEPTED_TWICE_REC);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->pubkey_accepted_key_types);\n    if (ssh_fips_mode()) {\n        assert_string_equal(bind->pubkey_accepted_key_types, fips_pubkeys2);\n    } else {\n        assert_string_equal(bind->pubkey_accepted_key_types, PUBKEYACCEPTEDTYPES2);\n    }\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_PUBKEY_ACCEPTED_UNKNOWN);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->pubkey_accepted_key_types);\n    if (ssh_fips_mode()) {\n        assert_string_equal(bind->pubkey_accepted_key_types, fips_pubkeys);\n    } else {\n        assert_string_equal(bind->pubkey_accepted_key_types, PUBKEYACCEPTEDTYPES);\n    }\n\n    SAFE_FREE(fips_pubkeys);\n    SAFE_FREE(fips_pubkeys2);\n}\n\nstatic void torture_bind_config_hostkey_algorithms(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int rc;\n\n    char *fips_hostkeys = NULL;\n    char *fips_hostkeys2 = NULL;\n\n    if (ssh_fips_mode()) {\n        fips_hostkeys = ssh_keep_fips_algos(SSH_HOSTKEYS, HOSTKEYALGORITHMS);\n        assert_non_null(fips_hostkeys);\n        fips_hostkeys2 = ssh_keep_fips_algos(SSH_HOSTKEYS, HOSTKEYALGORITHMS2);\n        assert_non_null(fips_hostkeys2);\n    }\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_HOSTKEY_ALGORITHMS);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->wanted_methods[SSH_HOSTKEYS]);\n    if (ssh_fips_mode()) {\n        assert_string_equal(bind->wanted_methods[SSH_HOSTKEYS], fips_hostkeys);\n    } else {\n        assert_string_equal(bind->wanted_methods[SSH_HOSTKEYS], HOSTKEYALGORITHMS);\n    }\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_HOSTKEY_ALGORITHMS2);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->wanted_methods[SSH_HOSTKEYS]);\n    if (ssh_fips_mode()) {\n        assert_string_equal(bind->wanted_methods[SSH_HOSTKEYS], fips_hostkeys2);\n    } else {\n        assert_string_equal(bind->wanted_methods[SSH_HOSTKEYS], HOSTKEYALGORITHMS2);\n    }\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_HOSTKEY_ALGORITHMS_TWICE);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->wanted_methods[SSH_HOSTKEYS]);\n    if (ssh_fips_mode()) {\n        assert_string_equal(bind->wanted_methods[SSH_HOSTKEYS], fips_hostkeys);\n    } else {\n        assert_string_equal(bind->wanted_methods[SSH_HOSTKEYS], HOSTKEYALGORITHMS);\n    }\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_HOSTKEY_ALGORITHMS_TWICE_REC);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->wanted_methods[SSH_HOSTKEYS]);\n    if (ssh_fips_mode()) {\n        assert_string_equal(bind->wanted_methods[SSH_HOSTKEYS], fips_hostkeys2);\n    } else {\n        assert_string_equal(bind->wanted_methods[SSH_HOSTKEYS], HOSTKEYALGORITHMS2);\n    }\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_HOSTKEY_ALGORITHMS_UNKNOWN);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->wanted_methods[SSH_HOSTKEYS]);\n    if (ssh_fips_mode()) {\n        assert_string_equal(bind->wanted_methods[SSH_HOSTKEYS], fips_hostkeys);\n    } else {\n        assert_string_equal(bind->wanted_methods[SSH_HOSTKEYS], HOSTKEYALGORITHMS);\n    }\n\n    SAFE_FREE(fips_hostkeys);\n    SAFE_FREE(fips_hostkeys2);\n}\n\nstatic int assert_full_bind_config(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int new_level;\n\n    char *fips_ciphers = NULL;\n    char *fips_kex = NULL;\n\n    if (ssh_fips_mode()) {\n        fips_ciphers = ssh_keep_fips_algos(SSH_CRYPT_C_S, CIPHERS);\n        assert_non_null(fips_ciphers);\n        fips_kex = ssh_keep_fips_algos(SSH_KEX, KEXALGORITHMS);\n        assert_non_null(fips_kex);\n    }\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    new_level = ssh_get_log_level();\n    assert_int_equal(new_level, 2);\n\n    assert_non_null(bind->bindaddr);\n    assert_string_equal(bind->bindaddr, LISTEN_ADDRESS);\n\n    assert_int_equal(bind->bindport, 123);\n\n    assert_non_null(bind->ecdsakey);\n    assert_string_equal(bind->ecdsakey, LIBSSH_ECDSA_521_TESTKEY);\n\n    assert_non_null(bind->wanted_methods[SSH_CRYPT_C_S]);\n    if (ssh_fips_mode()) {\n        assert_string_equal(bind->wanted_methods[SSH_CRYPT_C_S], fips_ciphers);\n    } else {\n        assert_string_equal(bind->wanted_methods[SSH_CRYPT_C_S], CIPHERS);\n    }\n\n    assert_non_null(bind->wanted_methods[SSH_CRYPT_S_C]);\n    if (ssh_fips_mode()) {\n        assert_string_equal(bind->wanted_methods[SSH_CRYPT_S_C], fips_ciphers);\n    } else {\n        assert_string_equal(bind->wanted_methods[SSH_CRYPT_S_C], CIPHERS);\n    }\n\n    assert_non_null(bind->wanted_methods[SSH_MAC_S_C]);\n    assert_string_equal(bind->wanted_methods[SSH_MAC_S_C], MACS);\n\n    assert_non_null(bind->wanted_methods[SSH_MAC_C_S]);\n    assert_string_equal(bind->wanted_methods[SSH_MAC_C_S], MACS);\n\n    assert_non_null(bind->wanted_methods[SSH_KEX]);\n    if (ssh_fips_mode()) {\n        assert_string_equal(bind->wanted_methods[SSH_KEX], fips_kex);\n    } else {\n        assert_string_equal(bind->wanted_methods[SSH_KEX], KEXALGORITHMS);\n    }\n\n    SAFE_FREE(fips_ciphers);\n    SAFE_FREE(fips_kex);\n\n    return 0;\n}\n\nstatic void torture_bind_config_full(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int rc;\n    int previous_level;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    previous_level = ssh_get_log_level();\n\n    rc = ssh_bind_config_parse_file(bind, LIBSSH_TEST_BIND_CONFIG_FULL);\n    assert_int_equal(rc, 0);\n\n    rc = assert_full_bind_config(state);\n    assert_int_equal(rc, 0);\n\n    rc = ssh_set_log_level(previous_level);\n    assert_int_equal(rc, SSH_OK);\n}\n\nstatic void torture_bind_config_include(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int rc;\n    int previous_level;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    previous_level = ssh_get_log_level();\n\n    rc = ssh_bind_config_parse_file(bind, LIBSSH_TEST_BIND_CONFIG_INCLUDE);\n    assert_int_equal(rc, 0);\n\n    rc = assert_full_bind_config(state);\n    assert_int_equal(rc, 0);\n\n    rc = ssh_set_log_level(previous_level);\n    assert_int_equal(rc, SSH_OK);\n}\n\nstatic void torture_bind_config_include_recursive(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int rc;\n    int previous_level;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    previous_level = ssh_get_log_level();\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_INCLUDE_RECURSIVE);\n    assert_int_equal(rc, 0);\n\n    rc = assert_full_bind_config(state);\n    assert_int_equal(rc, 0);\n\n    rc = ssh_set_log_level(previous_level);\n    assert_int_equal(rc, SSH_OK);\n}\n\n/**\n * @brief Verify the configuration parser does not choke on unknown\n * or unsupported configuration options\n */\nstatic void torture_bind_config_corner_cases(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int rc;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    rc = ssh_bind_config_parse_file(bind, LIBSSH_TEST_BIND_CONFIG_CORNER_CASES);\n    assert_int_equal(rc, 0);\n\n    assert_non_null(bind->wanted_methods[SSH_CRYPT_C_S]);\n    assert_string_equal(bind->wanted_methods[SSH_CRYPT_C_S], CIPHERS2);\n\n    assert_non_null(bind->wanted_methods[SSH_CRYPT_S_C]);\n    assert_string_equal(bind->wanted_methods[SSH_CRYPT_S_C], CIPHERS2);\n}\n\nstatic void torture_bind_config_match_all(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int rc;\n    int previous_level, new_level;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    previous_level = ssh_get_log_level();\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_MATCH_ALL);\n    assert_int_equal(rc, 0);\n\n    new_level = ssh_get_log_level();\n    assert_int_equal(new_level, 1);\n\n    rc = ssh_set_log_level(previous_level);\n    assert_int_equal(rc, SSH_OK);\n}\n\nstatic void torture_bind_config_match_twice(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int rc;\n    int previous_level, new_level;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    previous_level = ssh_get_log_level();\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_MATCH_TWICE);\n    assert_int_equal(rc, 0);\n\n    new_level = ssh_get_log_level();\n    assert_int_equal(new_level, 1);\n\n    rc = ssh_set_log_level(previous_level);\n    assert_int_equal(rc, SSH_OK);\n}\n\nstatic void torture_bind_config_match_unsupported(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int rc;\n    int previous_level;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    previous_level = ssh_get_log_level();\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_MATCH_UNSUPPORTED);\n    assert_int_equal(rc, 0);\n\n    rc = assert_full_bind_config(state);\n    assert_int_equal(rc, 0);\n\n    rc = ssh_set_log_level(previous_level);\n    assert_int_equal(rc, SSH_OK);\n}\n\nstatic void torture_bind_config_match_not_allowed(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int rc;\n    int previous_level;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    previous_level = ssh_get_log_level();\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_MATCH_NOT_ALLOWED);\n    assert_int_equal(rc, 0);\n\n    rc = assert_full_bind_config(state);\n    assert_int_equal(rc, 0);\n\n    rc = ssh_set_log_level(previous_level);\n    assert_int_equal(rc, SSH_OK);\n}\n\nstatic void torture_bind_config_match_corner_cases(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int rc;\n    int previous_level, new_level;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    previous_level = ssh_get_log_level();\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_MATCH_CORNER_CASES);\n    assert_int_equal(rc, 0);\n\n    new_level = ssh_get_log_level();\n    assert_int_equal(new_level, 3);\n\n    rc = ssh_set_log_level(previous_level);\n    assert_int_equal(rc, SSH_OK);\n}\n\nstatic void torture_bind_config_match_invalid(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int rc;\n    int previous_level;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    previous_level = ssh_get_log_level();\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_MATCH_INVALID);\n    assert_int_equal(rc, -1);\n\n    rc = ssh_bind_config_parse_file(bind,\n            LIBSSH_TEST_BIND_CONFIG_MATCH_INVALID2);\n    assert_int_equal(rc, -1);\n\n    rc = ssh_set_log_level(previous_level);\n    assert_int_equal(rc, SSH_OK);\n}\n\nint torture_run_tests(void)\n{\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_bind_config_listen_address,\n                sshbind_setup, sshbind_teardown),\n        cmocka_unit_test_setup_teardown(torture_bind_config_port,\n                sshbind_setup, sshbind_teardown),\n        cmocka_unit_test_setup_teardown(torture_bind_config_hostkey,\n                sshbind_setup, sshbind_teardown),\n        cmocka_unit_test_setup_teardown(torture_bind_config_hostkey_twice_rec,\n                sshbind_setup, sshbind_teardown),\n        cmocka_unit_test_setup_teardown(torture_bind_config_hostkey_separately,\n                sshbind_setup, sshbind_teardown),\n        cmocka_unit_test_setup_teardown(torture_bind_config_loglevel,\n                sshbind_setup, sshbind_teardown),\n        cmocka_unit_test_setup_teardown(torture_bind_config_ciphers,\n                sshbind_setup, sshbind_teardown),\n        cmocka_unit_test_setup_teardown(torture_bind_config_macs,\n                sshbind_setup, sshbind_teardown),\n        cmocka_unit_test_setup_teardown(torture_bind_config_kexalgorithms,\n                sshbind_setup, sshbind_teardown),\n        cmocka_unit_test_setup_teardown(torture_bind_config_full,\n                sshbind_setup, sshbind_teardown),\n        cmocka_unit_test_setup_teardown(torture_bind_config_include,\n                sshbind_setup, sshbind_teardown),\n        cmocka_unit_test_setup_teardown(torture_bind_config_include_recursive,\n                sshbind_setup, sshbind_teardown),\n        cmocka_unit_test_setup_teardown(torture_bind_config_corner_cases,\n                sshbind_setup, sshbind_teardown),\n        cmocka_unit_test_setup_teardown(torture_bind_config_match_all,\n                sshbind_setup, sshbind_teardown),\n        cmocka_unit_test_setup_teardown(torture_bind_config_match_twice,\n                sshbind_setup, sshbind_teardown),\n        cmocka_unit_test_setup_teardown(torture_bind_config_match_unsupported,\n                sshbind_setup, sshbind_teardown),\n        cmocka_unit_test_setup_teardown(torture_bind_config_match_not_allowed,\n                sshbind_setup, sshbind_teardown),\n        cmocka_unit_test_setup_teardown(torture_bind_config_match_corner_cases,\n                sshbind_setup, sshbind_teardown),\n        cmocka_unit_test_setup_teardown(torture_bind_config_match_invalid,\n                sshbind_setup, sshbind_teardown),\n        cmocka_unit_test_setup_teardown(torture_bind_config_pubkey_accepted,\n                sshbind_setup, sshbind_teardown),\n        cmocka_unit_test_setup_teardown(torture_bind_config_hostkey_algorithms,\n                sshbind_setup, sshbind_teardown),\n    };\n\n    ssh_init();\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, NULL, NULL);\n    ssh_finalize();\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/unittests/torture_buffer.c",
    "content": "#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include \"torture.h\"\n#define DEBUG_BUFFER\n#include \"buffer.c\"\n\n#define LIMIT (8*1024*1024)\n\nstatic int setup(void **state) {\n    ssh_buffer buffer;\n\n    buffer = ssh_buffer_new();\n    if (buffer == NULL) {\n        return -1;\n    }\n    ssh_buffer_set_secure(buffer);\n    *state = (void *) buffer;\n\n    return 0;\n}\n\nstatic int teardown(void **state) {\n    SSH_BUFFER_FREE(*state);\n\n    return 0;\n}\n\n/*\n * Test if the continuously growing buffer size never exceeds 2 time its\n * real capacity\n */\nstatic void torture_growing_buffer(void **state) {\n  ssh_buffer buffer = *state;\n  int i;\n\n  for(i=0;i<LIMIT;++i){\n    ssh_buffer_add_data(buffer,\"A\",1);\n    if(buffer->used >= 128){\n      if(ssh_buffer_get_len(buffer) * 2 < buffer->allocated){\n        assert_true(ssh_buffer_get_len(buffer) * 2 >= buffer->allocated);\n      }\n    }\n  }\n}\n\n/*\n * Test if the continuously growing buffer size never exceeds 2 time its\n * real capacity, when we remove 1 byte after each call (sliding window)\n */\nstatic void torture_growing_buffer_shifting(void **state) {\n  ssh_buffer buffer = *state;\n  int i;\n  unsigned char c;\n  for(i=0; i<1024;++i){\n    ssh_buffer_add_data(buffer,\"S\",1);\n  }\n  for(i=0;i<LIMIT;++i){\n    ssh_buffer_get_u8(buffer,&c);\n    ssh_buffer_add_data(buffer,\"A\",1);\n    if(buffer->used >= 128){\n      if(ssh_buffer_get_len(buffer) * 4 < buffer->allocated){\n        assert_true(ssh_buffer_get_len(buffer) * 4 >= buffer->allocated);\n        return;\n      }\n    }\n  }\n}\n\n/*\n * Test the behavior of ssh_buffer_prepend_data\n */\nstatic void torture_buffer_prepend(void **state) {\n  ssh_buffer buffer = *state;\n  uint32_t v;\n  ssh_buffer_add_data(buffer,\"abcdef\",6);\n  ssh_buffer_prepend_data(buffer,\"xyz\",3);\n  assert_int_equal(ssh_buffer_get_len(buffer),9);\n  assert_memory_equal(ssh_buffer_get(buffer),  \"xyzabcdef\", 9);\n\n  /* Now remove 4 bytes and see if we can replace them */\n  ssh_buffer_get_u32(buffer,&v);\n  assert_int_equal(ssh_buffer_get_len(buffer),5);\n  assert_memory_equal(ssh_buffer_get(buffer), \"bcdef\", 5);\n\n  ssh_buffer_prepend_data(buffer,\"aris\",4);\n  assert_int_equal(ssh_buffer_get_len(buffer),9);\n  assert_memory_equal(ssh_buffer_get(buffer), \"arisbcdef\", 9);\n\n  /* same thing but we add 5 bytes now */\n  ssh_buffer_get_u32(buffer,&v);\n  assert_int_equal(ssh_buffer_get_len(buffer),5);\n  assert_memory_equal(ssh_buffer_get(buffer), \"bcdef\", 5);\n\n  ssh_buffer_prepend_data(buffer,\"12345\",5);\n  assert_int_equal(ssh_buffer_get_len(buffer),10);\n  assert_memory_equal(ssh_buffer_get(buffer), \"12345bcdef\", 10);\n}\n\n/*\n * Test the behavior of ssh_buffer_get_ssh_string with invalid data\n */\nstatic void torture_ssh_buffer_get_ssh_string(void **state) {\n  ssh_buffer buffer;\n  int i,j,k,l, rc;\n  /* some values that can go wrong */\n  uint32_t values[] = {0xffffffff, 0xfffffffe, 0xfffffffc, 0xffffff00,\n      0x80000000, 0x80000004, 0x7fffffff};\n  char data[128];\n  (void)state;\n  memset(data,'X',sizeof(data));\n  for(i=0; i < (int)(sizeof(values)/sizeof(values[0]));++i){\n    for(j=0; j< (int)sizeof(data);++j){\n      for(k=1;k<5;++k){\n        buffer = ssh_buffer_new();\n        assert_non_null(buffer);\n\n        for(l=0;l<k;++l){\n          rc = ssh_buffer_add_u32(buffer,htonl(values[i]));\n          assert_int_equal(rc, 0);\n        }\n        rc = ssh_buffer_add_data(buffer,data,j);\n        assert_int_equal(rc, 0);\n        for(l=0;l<k;++l){\n          ssh_string str = ssh_buffer_get_ssh_string(buffer);\n          assert_null(str);\n          SSH_STRING_FREE(str);\n        }\n        SSH_BUFFER_FREE(buffer);\n      }\n    }\n  }\n}\n\nstatic void torture_ssh_buffer_add_format(void **state) {\n    ssh_buffer buffer=*state;\n    uint8_t b;\n    uint16_t w;\n    uint32_t d;\n    uint64_t q;\n    ssh_string s;\n    int rc;\n    size_t len;\n    uint8_t verif[]=\"\\x42\\x13\\x37\\x0b\\xad\\xc0\\xde\\x13\\x24\\x35\\x46\"\n            \"\\xac\\xbd\\xce\\xdf\"\n            \"\\x00\\x00\\x00\\x06\" \"libssh\"\n            \"\\x00\\x00\\x00\\x05\" \"rocks\"\n            \"So much\"\n            \"Fun!\";\n\n    b=0x42;\n    w=0x1337;\n    d=0xbadc0de;\n    q=0x13243546acbdcedf;\n    s=ssh_string_from_char(\"libssh\");\n    rc=ssh_buffer_pack(buffer, \"bwdqSsPt\",b,w,d,q,s,\"rocks\",7,\"So much\",\"Fun!\");\n    assert_int_equal(rc, SSH_OK);\n\n    len = ssh_buffer_get_len(buffer);\n    assert_int_equal(len, sizeof(verif) - 1);\n    assert_memory_equal(ssh_buffer_get(buffer), verif, sizeof(verif) -1);\n\n    SSH_STRING_FREE(s);\n}\n\nstatic void torture_ssh_buffer_get_format(void **state) {\n    ssh_buffer buffer=*state;\n    uint8_t b=0;\n    uint16_t w=0;\n    uint32_t d=0;\n    uint64_t q=0;\n    ssh_string s=NULL;\n    char *s1=NULL, *s2=NULL;\n    int rc;\n    size_t len;\n    uint8_t verif[]=\"\\x42\\x13\\x37\\x0b\\xad\\xc0\\xde\\x13\\x24\\x35\\x46\"\n            \"\\xac\\xbd\\xce\\xdf\"\n            \"\\x00\\x00\\x00\\x06\" \"libssh\"\n            \"\\x00\\x00\\x00\\x05\" \"rocks\"\n            \"So much\";\n\n    rc = ssh_buffer_add_data(buffer, verif, sizeof(verif) - 1);\n    assert_int_equal(rc, SSH_OK);\n    rc = ssh_buffer_unpack(buffer, \"bwdqSsP\",&b,&w,&d,&q,&s,&s1,(size_t)7,&s2);\n    assert_int_equal(rc, SSH_OK);\n\n    assert_int_equal(b, 0x42);\n    assert_int_equal(w, 0x1337);\n\n    assert_true(d == 0xbadc0de);\n    assert_true(q == 0x13243546acbdcedf);\n\n    assert_non_null(s);\n    assert_int_equal(ssh_string_len(s), 6);\n    assert_memory_equal(ssh_string_data(s), \"libssh\", 6);\n\n    assert_non_null(s1);\n    assert_string_equal(s1, \"rocks\");\n\n    assert_non_null(s2);\n    assert_memory_equal(s2, \"So much\", 7);\n\n    len = ssh_buffer_get_len(buffer);\n    assert_int_equal(len, 0);\n    SAFE_FREE(s);\n    SAFE_FREE(s1);\n    SAFE_FREE(s2);\n}\n\nstatic void torture_ssh_buffer_get_format_error(void **state) {\n    ssh_buffer buffer=*state;\n    uint8_t b=0;\n    uint16_t w=0;\n    uint32_t d=0;\n    uint64_t q=0;\n    ssh_string s=NULL;\n    char *s1=NULL, *s2=NULL;\n    int rc;\n    uint8_t verif[]=\"\\x42\\x13\\x37\\x0b\\xad\\xc0\\xde\\x13\\x24\\x35\\x46\"\n            \"\\xac\\xbd\\xce\\xdf\"\n            \"\\x00\\x00\\x00\\x06\" \"libssh\"\n            \"\\x00\\x00\\x00\\x05\" \"rocks\"\n            \"So much\";\n\n    rc = ssh_buffer_add_data(buffer, verif, sizeof(verif) - 1);\n    assert_int_equal(rc, SSH_OK);\n    rc = ssh_buffer_unpack(buffer, \"bwdqSsPb\",&b,&w,&d,&q,&s,&s1,(size_t)7,&s2,&b);\n    assert_int_equal(rc, SSH_ERROR);\n\n    assert_null(s);\n    assert_null(s1);\n    assert_null(s2);\n}\n\nstatic void torture_buffer_pack_badformat(void **state){\n    ssh_buffer buffer = *state;\n    uint8_t b = 42;\n    int rc;\n\n    /* first with missing format */\n    rc = ssh_buffer_pack(buffer, \"b\", b, b);\n    assert_int_equal(rc, SSH_ERROR);\n    ssh_buffer_reinit(buffer);\n\n    /* with additional format */\n    rc = ssh_buffer_pack(buffer, \"bb\", b);\n    /* check that we detect the missing parameter */\n    assert_int_equal(rc, SSH_ERROR);\n\n    /* unpack with missing format */\n    ssh_buffer_reinit(buffer);\n    rc = ssh_buffer_pack(buffer, \"bb\", 42, 43);\n    assert_int_equal(rc, SSH_OK);\n    rc = ssh_buffer_unpack(buffer, \"b\", &b, &b);\n    assert_int_equal(rc, SSH_ERROR);\n\n    /* not doing the test with additional format as\n     * it could crash the process */\n}\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_growing_buffer, setup, teardown),\n        cmocka_unit_test_setup_teardown(torture_growing_buffer_shifting, setup, teardown),\n        cmocka_unit_test_setup_teardown(torture_buffer_prepend, setup, teardown),\n        cmocka_unit_test(torture_ssh_buffer_get_ssh_string),\n        cmocka_unit_test_setup_teardown(torture_ssh_buffer_add_format, setup, teardown),\n        cmocka_unit_test_setup_teardown(torture_ssh_buffer_get_format, setup, teardown),\n        cmocka_unit_test_setup_teardown(torture_ssh_buffer_get_format_error, setup, teardown),\n        cmocka_unit_test_setup_teardown(torture_buffer_pack_badformat, setup, teardown)\n    };\n\n    ssh_init();\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, NULL, NULL);\n    ssh_finalize();\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/unittests/torture_bytearray.c",
    "content": "#include \"config.h\"\n\n#include <stdint.h>\n\n#include \"torture.h\"\n#include \"libssh/bytearray.h\"\n\nstatic void torture_pull_le_u8(void **state)\n{\n    uint8_t data[2] = {0};\n    uint8_t result;\n\n    (void)state;\n\n    result = PULL_LE_U8(data, 0);\n    assert_int_equal(result, 0);\n\n    data[0] = 0x2a;\n    result = PULL_LE_U8(data, 0);\n    assert_int_equal(result, 42);\n\n\n    data[0] = 0xf;\n    result = PULL_LE_U8(data, 0);\n    assert_int_equal(result, 0xf);\n\n    data[0] = 0xff;\n    result = PULL_LE_U8(data, 0);\n    assert_int_equal(result, 0xff);\n\n    data[1] = 0x2a;\n    result = PULL_LE_U8(data, 1);\n    assert_int_equal(result, 42);\n}\n\nstatic void torture_pull_le_u16(void **state)\n{\n    uint8_t data[2] = {0, 0};\n    uint16_t result;\n\n    (void)state;\n\n    result = PULL_LE_U16(data, 0);\n    assert_int_equal(result, 0);\n\n    data[0] = 0x2a;\n    data[1] = 0x00;\n    result = PULL_LE_U16(data, 0);\n    assert_int_equal(result, 42);\n\n    data[0] = 0xff;\n    data[1] = 0x00;\n    result = PULL_LE_U16(data, 0);\n    assert_int_equal(result, 0x00ff);\n\n    data[0] = 0x00;\n    data[1] = 0xff;\n    result = PULL_LE_U16(data, 0);\n    assert_int_equal(result, 0xff00);\n\n    data[0] = 0xff;\n    data[1] = 0xff;\n    result = PULL_LE_U16(data, 0);\n    assert_int_equal(result, 0xffff);\n}\n\nstatic void torture_pull_le_u32(void **state)\n{\n    uint8_t data[4] = {0, 0, 0, 0};\n    uint32_t result;\n\n    (void)state;\n\n    result = PULL_LE_U32(data, 0);\n    assert_int_equal(result, 0);\n\n    data[0] = 0x2a;\n    data[1] = 0x00;\n    data[2] = 0x00;\n    data[3] = 0x00;\n    result = PULL_LE_U32(data, 0);\n    assert_int_equal(result, 42);\n\n    data[0] = 0xff;\n    data[1] = 0x00;\n    data[2] = 0x00;\n    data[3] = 0x00;\n    result = PULL_LE_U32(data, 0);\n    assert_int_equal(result, 0x00ff);\n\n    data[0] = 0x00;\n    data[1] = 0xff;\n    data[2] = 0x00;\n    data[3] = 0x00;\n    result = PULL_LE_U32(data, 0);\n    assert_int_equal(result, 0xff00);\n\n    data[0] = 0x00;\n    data[1] = 0x00;\n    data[2] = 0xff;\n    data[3] = 0x00;\n    result = PULL_LE_U32(data, 0);\n    assert_int_equal(result, 0xff0000);\n\n    data[0] = 0x00;\n    data[1] = 0x00;\n    data[2] = 0x00;\n    data[3] = 0xff;\n    result = PULL_LE_U32(data, 0);\n    assert_int_equal(result, 0xff000000);\n\n    data[0] = 0xff;\n    data[1] = 0xff;\n    data[2] = 0xff;\n    data[3] = 0xff;\n    result = PULL_LE_U32(data, 0);\n    assert_int_equal(result, 0xffffffff);\n}\n\nstatic void torture_push_le_u8(void **state)\n{\n    uint8_t data[4] = {0, 0, 0, 0};\n    uint8_t data2[4] = {42, 42, 42, 42};\n\n    (void)state;\n\n    PUSH_LE_U8(data, 0, 42);\n    PUSH_LE_U8(data, 1, 42);\n    PUSH_LE_U8(data, 2, 42);\n    PUSH_LE_U8(data, 3, 42);\n    assert_memory_equal(data, data2, sizeof(data));\n}\n\nstatic void torture_push_le_u16(void **state)\n{\n    uint8_t data[4] = {0, 0, 0, 0};\n    uint8_t data2[4] = {0xa6, 0x7f, 0x2a, 0x00};\n    uint16_t result;\n\n    (void)state;\n\n    PUSH_LE_U16(data, 0, 32678);\n    PUSH_LE_U16(data, 2, 42);\n    assert_memory_equal(data, data2, sizeof(data));\n\n    result = PULL_LE_U16(data, 2);\n    assert_int_equal(result, 42);\n\n    result = PULL_LE_U16(data, 0);\n    assert_int_equal(result, 32678);\n}\n\nstatic void torture_push_le_u32(void **state)\n{\n    uint8_t data[8] = {0};\n    uint8_t data2[8] = {0xa6, 0x7f, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00};\n    uint32_t result;\n\n    (void)state;\n\n    PUSH_LE_U32(data, 0, 32678);\n    PUSH_LE_U32(data, 4, 42);\n    assert_memory_equal(data, data2, sizeof(data));\n\n    result = PULL_LE_U32(data, 4);\n    assert_int_equal(result, 42);\n\n    result = PULL_LE_U32(data, 0);\n    assert_int_equal(result, 32678);\n\n    PUSH_LE_U32(data, 0, 0xfffefffe);\n    result = PULL_LE_U32(data, 0);\n    assert_int_equal(result, 0xfffefffe);\n}\n\nstatic void torture_push_le_u64(void **state)\n{\n    uint8_t data[16] = {0};\n    uint64_t result;\n\n    (void)state;\n\n    PUSH_LE_U64(data, 0, 32678);\n\n    result = PULL_LE_U64(data, 0);\n    assert_int_equal(result, 32678);\n\n    PUSH_LE_U64(data, 0, 0xfffefffefffefffeUL);\n\n    result = PULL_LE_U64(data, 0);\n    assert_int_equal(result, 0xfffefffefffefffeUL);\n}\n\n/****************** BIG ENDIAN ********************/\n\nstatic void torture_pull_be_u8(void **state)\n{\n    uint8_t data[2] = {0};\n    uint8_t result;\n\n    (void)state;\n\n    result = PULL_BE_U8(data, 0);\n    assert_int_equal(result, 0);\n\n    data[0] = 0x2a;\n    result = PULL_BE_U8(data, 0);\n    assert_int_equal(result, 42);\n\n\n    data[0] = 0xf;\n    result = PULL_BE_U8(data, 0);\n    assert_int_equal(result, 0xf);\n\n    data[0] = 0xff;\n    result = PULL_BE_U8(data, 0);\n    assert_int_equal(result, 0xff);\n\n    data[1] = 0x2a;\n    result = PULL_BE_U8(data, 1);\n    assert_int_equal(result, 42);\n}\n\nstatic void torture_pull_be_u16(void **state)\n{\n    uint8_t data[2] = {0, 0};\n    uint16_t result;\n\n    (void)state;\n\n    result = PULL_BE_U16(data, 0);\n    assert_int_equal(result, 0);\n\n    data[0] = 0x00;\n    data[1] = 0x2a;\n    result = PULL_BE_U16(data, 0);\n    assert_int_equal(result, 42);\n\n    data[0] = 0x00;\n    data[1] = 0xff;\n    result = PULL_BE_U16(data, 0);\n    assert_int_equal(result, 0x00ff);\n\n    data[0] = 0xff;\n    data[1] = 0x00;\n    result = PULL_BE_U16(data, 0);\n    assert_int_equal(result, 0xff00);\n\n    data[0] = 0xff;\n    data[1] = 0xff;\n    result = PULL_BE_U16(data, 0);\n    assert_int_equal(result, 0xffff);\n}\n\nstatic void torture_pull_be_u32(void **state)\n{\n    uint8_t data[4] = {0, 0, 0, 0};\n    uint32_t result;\n\n    (void)state;\n\n    result = PULL_BE_U32(data, 0);\n    assert_int_equal(result, 0);\n\n    data[0] = 0x00;\n    data[1] = 0x00;\n    data[2] = 0x00;\n    data[3] = 0x2a;\n    result = PULL_BE_U32(data, 0);\n    assert_int_equal(result, 42);\n\n    data[0] = 0x00;\n    data[1] = 0x00;\n    data[2] = 0x00;\n    data[3] = 0xff;\n    result = PULL_BE_U32(data, 0);\n    assert_int_equal(result, 0x00ff);\n\n    data[0] = 0x00;\n    data[1] = 0x00;\n    data[2] = 0xff;\n    data[3] = 0x00;\n    result = PULL_BE_U32(data, 0);\n    assert_int_equal(result, 0xff00);\n\n    data[0] = 0x00;\n    data[1] = 0xff;\n    data[2] = 0x00;\n    data[3] = 0x00;\n    result = PULL_BE_U32(data, 0);\n    assert_int_equal(result, 0xff0000);\n\n    data[0] = 0xff;\n    data[1] = 0x00;\n    data[2] = 0x00;\n    data[3] = 0x00;\n    result = PULL_BE_U32(data, 0);\n    assert_int_equal(result, 0xff000000);\n\n    data[0] = 0xff;\n    data[1] = 0xff;\n    data[2] = 0xff;\n    data[3] = 0xff;\n    result = PULL_BE_U32(data, 0);\n    assert_int_equal(result, 0xffffffff);\n}\n\nstatic void torture_push_be_u8(void **state)\n{\n    uint8_t data[4] = {0, 0, 0, 0};\n    uint8_t data2[4] = {42, 42, 42, 42};\n\n    (void)state;\n\n    PUSH_BE_U8(data, 0, 42);\n    PUSH_BE_U8(data, 1, 42);\n    PUSH_BE_U8(data, 2, 42);\n    PUSH_BE_U8(data, 3, 42);\n    assert_memory_equal(data, data2, sizeof(data));\n}\n\nstatic void torture_push_be_u16(void **state)\n{\n    uint8_t data[4] = {0, 0, 0, 0};\n    uint8_t data2[4] = {0x7f, 0xa6, 0x00, 0x2a};\n    uint16_t result;\n\n    (void)state;\n\n    PUSH_BE_U16(data, 0, 32678);\n    PUSH_BE_U16(data, 2, 42);\n    assert_memory_equal(data, data2, sizeof(data));\n\n    result = PULL_BE_U16(data, 2);\n    assert_int_equal(result, 42);\n\n    result = PULL_BE_U16(data, 0);\n    assert_int_equal(result, 32678);\n}\n\nstatic void torture_push_be_u32(void **state)\n{\n    uint8_t data[8] = {0};\n    uint8_t data2[8] = {0x00, 0x00, 0x7f, 0xa6, 0x00, 0x00, 0x00, 0x2a};\n    uint32_t result;\n\n    (void)state;\n\n    PUSH_BE_U32(data, 0, 32678);\n    PUSH_BE_U32(data, 4, 42);\n    assert_memory_equal(data, data2, sizeof(data));\n\n    result = PULL_BE_U32(data, 4);\n    assert_int_equal(result, 42);\n\n    result = PULL_BE_U32(data, 0);\n    assert_int_equal(result, 32678);\n\n    PUSH_BE_U32(data, 0, 0xfffefffe);\n    result = PULL_BE_U32(data, 0);\n    assert_int_equal(result, 0xfffefffe);\n}\n\nstatic void torture_push_be_u64(void **state)\n{\n    uint8_t data[16] = {0};\n    uint64_t result;\n\n    (void)state;\n\n    PUSH_BE_U64(data, 0, 32678);\n\n    result = PULL_BE_U64(data, 0);\n    assert_int_equal(result, 32678);\n\n    PUSH_LE_U64(data, 8, 0xfffefffe);\n\n    result = PULL_LE_U64(data, 8);\n    assert_int_equal(result, 0xfffefffe);\n}\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test(torture_pull_le_u8),\n        cmocka_unit_test(torture_pull_le_u16),\n        cmocka_unit_test(torture_pull_le_u32),\n\n        cmocka_unit_test(torture_push_le_u8),\n        cmocka_unit_test(torture_push_le_u16),\n        cmocka_unit_test(torture_push_le_u32),\n        cmocka_unit_test(torture_push_le_u64),\n\n        /* BIG ENDIAN */\n        cmocka_unit_test(torture_pull_be_u8),\n        cmocka_unit_test(torture_pull_be_u16),\n        cmocka_unit_test(torture_pull_be_u32),\n\n        cmocka_unit_test(torture_push_be_u8),\n        cmocka_unit_test(torture_push_be_u16),\n        cmocka_unit_test(torture_push_be_u32),\n        cmocka_unit_test(torture_push_be_u64),\n    };\n\n    torture_filter_tests(tests);\n\n    rc = cmocka_run_group_tests(tests, NULL, NULL);\n\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/unittests/torture_callbacks.c",
    "content": "#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include \"torture.h\"\n#include <libssh/priv.h>\n#include <libssh/callbacks.h>\n#include <libssh/misc.h>\n\nstatic int myauthcallback (const char *prompt, char *buf, size_t len,\n    int echo, int verify, void *userdata) {\n    (void) prompt;\n    (void) buf;\n    (void) len;\n    (void) echo;\n    (void) verify;\n    (void) userdata;\n    return 0;\n}\n\nstatic int setup(void **state)\n{\n    struct ssh_callbacks_struct *cb;\n\n    cb = malloc(sizeof(struct ssh_callbacks_struct));\n    assert_non_null(cb);\n    ZERO_STRUCTP(cb);\n\n    cb->userdata = (void *) 0x0badc0de;\n    cb->auth_function = myauthcallback;\n\n    ssh_callbacks_init(cb);\n    *state = cb;\n\n    return 0;\n}\n\nstatic int teardown(void **state)\n{\n    free(*state);\n\n    return 0;\n}\n\nstatic void torture_callbacks_size(void **state) {\n    struct ssh_callbacks_struct *cb = *state;;\n\n    assert_int_not_equal(cb->size, 0);\n}\n\nstatic void torture_callbacks_exists(void **state) {\n    struct ssh_callbacks_struct *cb = *state;\n\n    assert_int_not_equal(ssh_callbacks_exists(cb, auth_function), 0);\n    assert_int_equal(ssh_callbacks_exists(cb, log_function), 0);\n\n    /*\n     * We redefine size so auth_function is outside the range of\n     * callbacks->size.\n     */\n    cb->size = (unsigned char *) &cb->auth_function - (unsigned char *) cb;\n    assert_int_equal(ssh_callbacks_exists(cb, auth_function), 0);\n\n    /* Now make it one pointer bigger so we spill over the auth_function slot */\n    cb->size += sizeof(void *);\n    assert_int_not_equal(ssh_callbacks_exists(cb, auth_function), 0);\n}\n\nstruct test_mock_state {\n    int executed;\n};\n\nstatic void test_mock_ssh_logging_callback(int priority,\n                                           const char *function,\n                                           const char *buffer,\n                                           void *userdata)\n{\n    struct test_mock_state *t = (struct test_mock_state *)userdata;\n\n    check_expected(priority);\n    check_expected(function);\n    check_expected(buffer);\n\n    t->executed++;\n}\n\nstatic void torture_log_callback(void **state)\n{\n    struct test_mock_state t = {\n        .executed = 0,\n    };\n\n    (void)state; /* unused */\n\n    ssh_set_log_callback(test_mock_ssh_logging_callback);\n    ssh_set_log_userdata(&t);\n    ssh_set_log_level(1);\n\n    expect_value(test_mock_ssh_logging_callback, priority, 1);\n    expect_string(test_mock_ssh_logging_callback, function, \"torture_log_callback\");\n    expect_string(test_mock_ssh_logging_callback, buffer, \"torture_log_callback: test\");\n\n    SSH_LOG(SSH_LOG_WARN, \"test\");\n\n    assert_int_equal(t.executed, 1);\n}\n\nstatic void cb1(ssh_session session, ssh_channel channel, void *userdata){\n    int *v = userdata;\n    (void) session;\n    (void) channel;\n    *v += 1;\n}\n\nstatic void cb2(ssh_session session, ssh_channel channel, int status, void *userdata){\n    int *v = userdata;\n    (void) session;\n    (void) channel;\n    (void) status;\n    *v += 10;\n}\n\nstatic void torture_callbacks_execute_list(void **state){\n    struct ssh_list *list = ssh_list_new();\n    int v = 0, w = 0;\n    struct ssh_channel_callbacks_struct c1 = {\n            .channel_eof_function = cb1,\n            .userdata = &v\n    };\n    struct ssh_channel_callbacks_struct c2 = {\n            .channel_exit_status_function = cb2,\n            .userdata = &v\n    };\n    struct ssh_channel_callbacks_struct c3 = {\n            .channel_eof_function = cb1,\n            .channel_exit_status_function = cb2,\n            .userdata = &w\n    };\n\n    (void)state;\n    ssh_callbacks_init(&c1);\n    ssh_callbacks_init(&c2);\n    ssh_callbacks_init(&c3);\n\n    ssh_list_append(list, &c1);\n    ssh_callbacks_execute_list(list,\n                               ssh_channel_callbacks,\n                               channel_eof_function,\n                               NULL,\n                               NULL);\n    assert_int_equal(v, 1);\n\n    v = 0;\n    ssh_list_append(list, &c2);\n    ssh_callbacks_execute_list(list,\n                               ssh_channel_callbacks,\n                               channel_eof_function,\n                               NULL,\n                               NULL);\n    assert_int_equal(v, 1);\n    ssh_callbacks_execute_list(list,\n                               ssh_channel_callbacks,\n                               channel_exit_status_function,\n                               NULL,\n                               NULL,\n                               0);\n    assert_int_equal(v, 11);\n\n    v = 0;\n    w = 0;\n    ssh_list_append(list, &c3);\n    ssh_callbacks_execute_list(list,\n                               ssh_channel_callbacks,\n                               channel_eof_function,\n                               NULL,\n                               NULL);\n    assert_int_equal(v, 1);\n    assert_int_equal(w, 1);\n    ssh_callbacks_execute_list(list,\n                               ssh_channel_callbacks,\n                               channel_exit_status_function,\n                               NULL,\n                               NULL,\n                               0);\n    assert_int_equal(v, 11);\n    assert_int_equal(w, 11);\n\n    ssh_list_free(list);\n\n}\n\nstatic int cb3(ssh_session session, ssh_channel channel, void *userdata){\n    int *v = userdata;\n    (void)session;\n    (void)channel;\n    *v = 1;\n    return 10;\n}\n\nstatic void torture_callbacks_iterate(void **state){\n    struct ssh_list *list = ssh_list_new();\n    int v = 0, w = 0;\n    struct ssh_channel_callbacks_struct c1 = {\n            .channel_eof_function = cb1,\n            .channel_shell_request_function = cb3,\n            .userdata = &v\n    };\n    struct ssh_channel_callbacks_struct c2 = {\n            .channel_eof_function = cb1,\n            .channel_shell_request_function = cb3,\n            .userdata = &v\n    };\n\n    (void)state; /* unused */\n\n    ssh_callbacks_init(&c1);\n    ssh_callbacks_init(&c2);\n\n    ssh_list_append(list, &c1);\n    ssh_list_append(list, &c2);\n\n    ssh_callbacks_iterate(list, ssh_channel_callbacks, channel_eof_function){\n        ssh_callbacks_iterate_exec(channel_eof_function, NULL, NULL);\n    }\n    ssh_callbacks_iterate_end();\n\n    assert_int_equal(v, 2);\n\n    v = 0;\n    ssh_callbacks_iterate(list, ssh_channel_callbacks, channel_shell_request_function){\n        w = ssh_callbacks_iterate_exec(channel_shell_request_function, NULL, NULL);\n        if (w) {\n            break;\n        }\n    }\n    ssh_callbacks_iterate_end();\n\n    assert_int_equal(w, 10);\n    assert_int_equal(v, 1);\n\n    ssh_list_free(list);\n}\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_callbacks_size, setup, teardown),\n        cmocka_unit_test_setup_teardown(torture_callbacks_exists, setup, teardown),\n        cmocka_unit_test(torture_log_callback),\n        cmocka_unit_test(torture_callbacks_execute_list),\n        cmocka_unit_test(torture_callbacks_iterate)\n    };\n\n    ssh_init();\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, NULL, NULL);\n    ssh_finalize();\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/unittests/torture_channel.c",
    "content": "#include \"config.h\"\n\n#define LIBSSH_STATIC\n#include <libssh/priv.h>\n\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <fcntl.h>\n\n#include \"torture.h\"\n#include \"channels.c\"\n\nstatic void torture_channel_select(void **state)\n{\n    fd_set readfds;\n    int fd;\n    int rc;\n    int i;\n\n    (void)state; /* unused */\n\n    ZERO_STRUCT(readfds);\n\n    fd = open(\"/dev/null\", 0);\n    assert_true(fd > 2);\n\n    FD_ZERO(&readfds);\n    FD_SET(fd, &readfds);\n\n    for (i = 0; i < 10; i++) {\n        ssh_channel cin[1] = { NULL, };\n        ssh_channel cout[1] = { NULL, };\n        struct timeval tv = { .tv_sec = 0, .tv_usec = 1000 };\n\n        rc = ssh_select(cin, cout, fd + 1, &readfds, &tv);\n        assert_int_equal(rc, SSH_OK);\n    }\n\n    close(fd);\n}\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test(torture_channel_select),\n    };\n\n    ssh_init();\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, NULL, NULL);\n    ssh_finalize();\n\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/unittests/torture_config.c",
    "content": "#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include \"torture.h\"\n#include \"libssh/options.h\"\n#include \"libssh/session.h\"\n#include \"libssh/config_parser.h\"\n#include \"match.c\"\n\nextern LIBSSH_THREAD int ssh_log_level;\n\n#define LIBSSH_TESTCONFIG1 \"libssh_testconfig1.tmp\"\n#define LIBSSH_TESTCONFIG2 \"libssh_testconfig2.tmp\"\n#define LIBSSH_TESTCONFIG3 \"libssh_testconfig3.tmp\"\n#define LIBSSH_TESTCONFIG4 \"libssh_testconfig4.tmp\"\n#define LIBSSH_TESTCONFIG5 \"libssh_testconfig5.tmp\"\n#define LIBSSH_TESTCONFIG6 \"libssh_testconfig6.tmp\"\n#define LIBSSH_TESTCONFIG7 \"libssh_testconfig7.tmp\"\n#define LIBSSH_TESTCONFIG8 \"libssh_testconfig8.tmp\"\n#define LIBSSH_TESTCONFIG9 \"libssh_testconfig9.tmp\"\n#define LIBSSH_TESTCONFIG10 \"libssh_testconfig10.tmp\"\n#define LIBSSH_TESTCONFIG11 \"libssh_testconfig11.tmp\"\n#define LIBSSH_TESTCONFIG12 \"libssh_testconfig12.tmp\"\n#define LIBSSH_TESTCONFIGGLOB \"libssh_testc*[36].tmp\"\n#define LIBSSH_TEST_PUBKEYACCEPTEDKEYTYPES \"libssh_test_PubkeyAcceptedKeyTypes.tmp\"\n\n#define USERNAME \"testuser\"\n#define PROXYCMD \"ssh -q -W %h:%p gateway.example.com\"\n#define ID_FILE \"/etc/xxx\"\n#define KEXALGORITHMS \"ecdh-sha2-nistp521,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group14-sha1\"\n#define HOSTKEYALGORITHMS \"ssh-ed25519,ecdsa-sha2-nistp521,ssh-rsa\"\n#define PUBKEYACCEPTEDTYPES \"rsa-sha2-512,ssh-rsa,ecdsa-sha2-nistp521\"\n#define MACS \"hmac-sha1,hmac-sha2-256,hmac-sha2-512,hmac-sha1-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha2-512-etm@openssh.com\"\n#define USER_KNOWN_HOSTS \"%d/my_known_hosts\"\n#define GLOBAL_KNOWN_HOSTS \"/etc/ssh/my_ssh_known_hosts\"\n#define BIND_ADDRESS \"::1\"\n\n\n\nstatic int setup_config_files(void **state)\n{\n    ssh_session session;\n    int verbosity;\n\n    unlink(LIBSSH_TESTCONFIG1);\n    unlink(LIBSSH_TESTCONFIG2);\n    unlink(LIBSSH_TESTCONFIG3);\n    unlink(LIBSSH_TESTCONFIG4);\n    unlink(LIBSSH_TESTCONFIG5);\n    unlink(LIBSSH_TESTCONFIG6);\n    unlink(LIBSSH_TESTCONFIG7);\n    unlink(LIBSSH_TESTCONFIG8);\n    unlink(LIBSSH_TESTCONFIG9);\n    unlink(LIBSSH_TESTCONFIG10);\n    unlink(LIBSSH_TESTCONFIG11);\n    unlink(LIBSSH_TESTCONFIG12);\n    unlink(LIBSSH_TEST_PUBKEYACCEPTEDKEYTYPES);\n\n    torture_write_file(LIBSSH_TESTCONFIG1,\n                       \"User \"USERNAME\"\\nInclude \"LIBSSH_TESTCONFIG2\"\\n\\n\");\n    torture_write_file(LIBSSH_TESTCONFIG2,\n                       \"Include \"LIBSSH_TESTCONFIG3\"\\n\"\n                       \"ProxyCommand \"PROXYCMD\"\\n\\n\");\n    torture_write_file(LIBSSH_TESTCONFIG3,\n                       \"\\n\\nIdentityFile \"ID_FILE\"\\n\"\n                       \"\\n\\nKexAlgorithms \"KEXALGORITHMS\"\\n\"\n                       \"\\n\\nHostKeyAlgorithms \"HOSTKEYALGORITHMS\"\\n\"\n                       \"\\n\\nPubkeyAcceptedTypes \"PUBKEYACCEPTEDTYPES\"\\n\"\n                       \"\\n\\nMACs \"MACS\"\\n\");\n\n    /* Multiple Port settings -> parsing returns early. */\n    torture_write_file(LIBSSH_TESTCONFIG4,\n                       \"Port 123\\nPort 456\\n\");\n\n    /* Testing glob include */\n    torture_write_file(LIBSSH_TESTCONFIG5,\n                        \"User \"USERNAME\"\\nInclude \"LIBSSH_TESTCONFIGGLOB\"\\n\\n\");\n\n    torture_write_file(LIBSSH_TESTCONFIG6,\n                        \"ProxyCommand \"PROXYCMD\"\\n\\n\");\n\n    /* new options */\n    torture_write_file(LIBSSH_TESTCONFIG7,\n                        \"\\tBindAddress \"BIND_ADDRESS\"\\n\"\n                        \"\\tConnectTimeout 30\\n\"\n                        \"\\tLogLevel DEBUG3\\n\"\n                        \"\\tGlobalKnownHostsFile \"GLOBAL_KNOWN_HOSTS\"\\n\"\n                        \"\\tCompression yes\\n\"\n                        \"\\tStrictHostkeyChecking no\\n\"\n                        \"\\tGSSAPIDelegateCredentials yes\\n\"\n                        \"\\tGSSAPIServerIdentity example.com\\n\"\n                        \"\\tGSSAPIClientIdentity home.sweet\\n\"\n                        \"\\tUserKnownHostsFile \"USER_KNOWN_HOSTS\"\\n\");\n\n    /* authentication methods */\n    torture_write_file(LIBSSH_TESTCONFIG8,\n                        \"Host gss\\n\"\n                        \"\\tGSSAPIAuthentication yes\\n\"\n                        \"Host kbd\\n\"\n                        \"\\tKbdInteractiveAuthentication yes\\n\"\n                        \"Host pass\\n\"\n                        \"\\tPasswordAuthentication yes\\n\"\n                        \"Host pubkey\\n\"\n                        \"\\tPubkeyAuthentication yes\\n\"\n                        \"Host nogss\\n\"\n                        \"\\tGSSAPIAuthentication no\\n\"\n                        \"Host nokbd\\n\"\n                        \"\\tKbdInteractiveAuthentication no\\n\"\n                        \"Host nopass\\n\"\n                        \"\\tPasswordAuthentication no\\n\"\n                        \"Host nopubkey\\n\"\n                        \"\\tPubkeyAuthentication no\\n\");\n\n    /* unsupported options and corner cases */\n    torture_write_file(LIBSSH_TESTCONFIG9,\n                        \"\\n\" /* empty line */\n                        \"# comment line\\n\"\n                        \"  # comment line not starting with hash\\n\"\n                        \"UnknownConfigurationOption yes\\n\"\n                        \"GSSAPIKexAlgorithms yes\\n\"\n                        \"ControlMaster auto\\n\" /* SOC_NA */\n                        \"VisualHostkey yes\\n\" /* SOC_UNSUPPORTED */\n                        \"\");\n\n    /* Match keyword */\n    torture_write_file(LIBSSH_TESTCONFIG10,\n                       \"Match host example\\n\"\n                       \"\\tHostName example.com\\n\"\n                       \"Match host example1,example2\\n\"\n                       \"\\tHostName exampleN\\n\"\n                       \"Match user guest\\n\"\n                       \"\\tHostName guest.com\\n\"\n                       \"Match user tester host testhost\\n\"\n                       \"\\tHostName testhost.com\\n\"\n                       \"Match !user tester host testhost\\n\"\n                       \"\\tHostName nonuser-testhost.com\\n\"\n                       \"Match all\\n\"\n                       \"\\tHostName all-matched.com\\n\"\n                       /* Unsupported options */\n                       \"Match originalhost example\\n\"\n                       \"\\tHostName original-example.com\\n\"\n                       \"Match localuser guest\\n\"\n                       \"\\tHostName local-guest.com\\n\"\n                       \"\");\n\n    /* ProxyJump */\n    torture_write_file(LIBSSH_TESTCONFIG11,\n                       \"Host simple\\n\"\n                       \"\\tProxyJump jumpbox\\n\"\n                       \"Host user\\n\"\n                       \"\\tProxyJump user@jumpbox\\n\"\n                       \"Host port\\n\"\n                       \"\\tProxyJump jumpbox:2222\\n\"\n                       \"Host two-step\\n\"\n                       \"\\tProxyJump u1@first:222,u2@second:33\\n\"\n                       \"Host none\\n\"\n                       \"\\tProxyJump none\\n\"\n                       \"Host only-command\\n\"\n                       \"\\tProxyCommand \"PROXYCMD\"\\n\"\n                       \"\\tProxyJump jumpbox\\n\"\n                       \"Host only-jump\\n\"\n                       \"\\tProxyJump jumpbox\\n\"\n                       \"\\tProxyCommand \"PROXYCMD\"\\n\"\n                       \"Host ipv6\\n\"\n                       \"\\tProxyJump [2620:52:0::fed]\\n\"\n                       \"\");\n\n    /* RekeyLimit combinations */\n    torture_write_file(LIBSSH_TESTCONFIG12,\n                       \"Host default\\n\"\n                       \"\\tRekeyLimit default none\\n\"\n                       \"Host data1\\n\"\n                       \"\\tRekeyLimit 42G\\n\"\n                       \"Host data2\\n\"\n                       \"\\tRekeyLimit 31M\\n\"\n                       \"Host data3\\n\"\n                       \"\\tRekeyLimit 521K\\n\"\n                       \"Host time1\\n\"\n                       \"\\tRekeyLimit default 3D\\n\"\n                       \"Host time2\\n\"\n                       \"\\tRekeyLimit default 2h\\n\"\n                       \"Host time3\\n\"\n                       \"\\tRekeyLimit default 160m\\n\"\n                       \"Host time4\\n\"\n                       \"\\tRekeyLimit default 9600\\n\"\n                       \"\");\n\n    torture_write_file(LIBSSH_TEST_PUBKEYACCEPTEDKEYTYPES,\n                       \"PubkeyAcceptedKeyTypes \"PUBKEYACCEPTEDTYPES\"\\n\");\n\n    session = ssh_new();\n\n    verbosity = torture_libssh_verbosity();\n    ssh_options_set(session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity);\n\n    *state = session;\n\n    return 0;\n}\n\nstatic int teardown(void **state)\n{\n    unlink(LIBSSH_TESTCONFIG1);\n    unlink(LIBSSH_TESTCONFIG2);\n    unlink(LIBSSH_TESTCONFIG3);\n    unlink(LIBSSH_TESTCONFIG4);\n    unlink(LIBSSH_TESTCONFIG5);\n    unlink(LIBSSH_TESTCONFIG6);\n    unlink(LIBSSH_TESTCONFIG7);\n    unlink(LIBSSH_TESTCONFIG8);\n    unlink(LIBSSH_TESTCONFIG9);\n    unlink(LIBSSH_TESTCONFIG10);\n    unlink(LIBSSH_TESTCONFIG11);\n    unlink(LIBSSH_TESTCONFIG12);\n    unlink(LIBSSH_TEST_PUBKEYACCEPTEDKEYTYPES);\n\n    ssh_free(*state);\n\n    return 0;\n}\n\n/**\n * @brief tests ssh_config_parse_file with Include directives\n */\nstatic void torture_config_from_file(void **state) {\n    ssh_session session = *state;\n    int ret;\n    char *v = NULL;\n    char *fips_algos = NULL;\n\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG1);\n    assert_true(ret == 0);\n\n    /* Test the variable presence */\n\n    ret = ssh_options_get(session, SSH_OPTIONS_PROXYCOMMAND, &v);\n    assert_true(ret == 0);\n    assert_non_null(v);\n\n    assert_string_equal(v, PROXYCMD);\n    SSH_STRING_FREE_CHAR(v);\n\n    ret = ssh_options_get(session, SSH_OPTIONS_IDENTITY, &v);\n    assert_true(ret == 0);\n    assert_non_null(v);\n\n    assert_string_equal(v, ID_FILE);\n    SSH_STRING_FREE_CHAR(v);\n\n    ret = ssh_options_get(session, SSH_OPTIONS_USER, &v);\n    assert_true(ret == 0);\n    assert_non_null(v);\n\n    assert_string_equal(v, USERNAME);\n    SSH_STRING_FREE_CHAR(v);\n\n    if (ssh_fips_mode()) {\n        fips_algos = ssh_keep_fips_algos(SSH_KEX, KEXALGORITHMS);\n        assert_non_null(fips_algos);\n        assert_string_equal(session->opts.wanted_methods[SSH_KEX], fips_algos);\n        SAFE_FREE(fips_algos);\n        fips_algos = ssh_keep_fips_algos(SSH_HOSTKEYS, HOSTKEYALGORITHMS);\n        assert_non_null(fips_algos);\n        assert_string_equal(session->opts.wanted_methods[SSH_HOSTKEYS], fips_algos);\n        SAFE_FREE(fips_algos);\n        fips_algos = ssh_keep_fips_algos(SSH_HOSTKEYS, PUBKEYACCEPTEDTYPES);\n        assert_non_null(fips_algos);\n        assert_string_equal(session->opts.pubkey_accepted_types, fips_algos);\n        SAFE_FREE(fips_algos);\n        fips_algos = ssh_keep_fips_algos(SSH_MAC_C_S, MACS);\n        assert_non_null(fips_algos);\n        assert_string_equal(session->opts.wanted_methods[SSH_MAC_C_S], fips_algos);\n        SAFE_FREE(fips_algos);\n        fips_algos = ssh_keep_fips_algos(SSH_MAC_S_C, MACS);\n        assert_non_null(fips_algos);\n        assert_string_equal(session->opts.wanted_methods[SSH_MAC_S_C], fips_algos);\n        SAFE_FREE(fips_algos);\n    } else {\n        assert_non_null(session->opts.wanted_methods[SSH_KEX]);\n        assert_string_equal(session->opts.wanted_methods[SSH_KEX], KEXALGORITHMS);\n        assert_non_null(session->opts.wanted_methods[SSH_HOSTKEYS]);\n        assert_string_equal(session->opts.wanted_methods[SSH_HOSTKEYS], HOSTKEYALGORITHMS);\n        assert_non_null(session->opts.pubkey_accepted_types);\n        assert_string_equal(session->opts.pubkey_accepted_types, PUBKEYACCEPTEDTYPES);\n        assert_non_null(session->opts.wanted_methods[SSH_MAC_S_C]);\n        assert_string_equal(session->opts.wanted_methods[SSH_MAC_C_S], MACS);\n        assert_non_null(session->opts.wanted_methods[SSH_MAC_S_C]);\n        assert_string_equal(session->opts.wanted_methods[SSH_MAC_S_C], MACS);\n    }\n}\n\n/**\n * @brief tests ssh_config_parse_file with multiple Port settings.\n */\nstatic void torture_config_double_ports(void **state) {\n    ssh_session session = *state;\n    int ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG4);\n    assert_true(ret == 0);\n}\n\nstatic void torture_config_glob(void **state) {\n    ssh_session session = *state;\n    int ret;\n#if defined(HAVE_GLOB) && defined(HAVE_GLOB_GL_FLAGS_MEMBER)\n    char *v;\n#endif /* HAVE_GLOB && HAVE_GLOB_GL_FLAGS_MEMBER */\n\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG5);\n    assert_true(ret == 0); /* non-existing files should not error */\n\n    /* Test the variable presence */\n\n#if defined(HAVE_GLOB) && defined(HAVE_GLOB_GL_FLAGS_MEMBER)\n    ret = ssh_options_get(session, SSH_OPTIONS_PROXYCOMMAND, &v);\n    assert_true(ret == 0);\n    assert_non_null(v);\n\n    assert_string_equal(v, PROXYCMD);\n    SSH_STRING_FREE_CHAR(v);\n\n    ret = ssh_options_get(session, SSH_OPTIONS_IDENTITY, &v);\n    assert_true(ret == 0);\n    assert_non_null(v);\n\n    assert_string_equal(v, ID_FILE);\n    SSH_STRING_FREE_CHAR(v);\n#endif /* HAVE_GLOB && HAVE_GLOB_GL_FLAGS_MEMBER */\n}\n\n/**\n * @brief Verify the new options are passed from configuration\n */\nstatic void torture_config_new(void **state)\n{\n    ssh_session session = *state;\n    int ret = 0;\n\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG7);\n    assert_true(ret == 0);\n\n    assert_string_equal(session->opts.knownhosts, USER_KNOWN_HOSTS);\n    assert_string_equal(session->opts.global_knownhosts, GLOBAL_KNOWN_HOSTS);\n    assert_int_equal(session->opts.timeout, 30);\n    assert_string_equal(session->opts.bindaddr, BIND_ADDRESS);\n#ifdef WITH_ZLIB\n    assert_string_equal(session->opts.wanted_methods[SSH_COMP_C_S],\n                        \"zlib@openssh.com,zlib\");\n    assert_string_equal(session->opts.wanted_methods[SSH_COMP_S_C],\n                        \"zlib@openssh.com,zlib\");\n#else\n    assert_null(session->opts.wanted_methods[SSH_COMP_C_S]);\n    assert_null(session->opts.wanted_methods[SSH_COMP_S_C]);\n#endif /* WITH_ZLIB */\n    assert_int_equal(session->opts.StrictHostKeyChecking, 0);\n    assert_int_equal(session->opts.gss_delegate_creds, 1);\n    assert_string_equal(session->opts.gss_server_identity, \"example.com\");\n    assert_string_equal(session->opts.gss_client_identity, \"home.sweet\");\n\n    assert_int_equal(ssh_get_log_level(), SSH_LOG_TRACE);\n    assert_int_equal(session->common.log_verbosity, SSH_LOG_TRACE);\n}\n\n/**\n * @brief Verify the authentication methods from configuration are effective\n */\nstatic void torture_config_auth_methods(void **state) {\n    ssh_session session = *state;\n    int ret = 0;\n\n    /* gradually disable all the methods based on different hosts */\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"nogss\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG8);\n    assert_true(ret == 0);\n    assert_false(session->opts.flags & SSH_OPT_FLAG_GSSAPI_AUTH);\n    assert_true(session->opts.flags & SSH_OPT_FLAG_KBDINT_AUTH);\n\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"nokbd\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG8);\n    assert_true(ret == 0);\n    assert_false(session->opts.flags & SSH_OPT_FLAG_KBDINT_AUTH);\n\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"nopass\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG8);\n    assert_true(ret == 0);\n    assert_false(session->opts.flags & SSH_OPT_FLAG_PASSWORD_AUTH);\n\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"nopubkey\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG8);\n    assert_true(ret == 0);\n    assert_false(session->opts.flags & SSH_OPT_FLAG_PUBKEY_AUTH);\n\n    /* no method should be left enabled */\n    assert_int_equal(session->opts.flags, 0);\n\n    /* gradually enable them again */\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"gss\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG8);\n    assert_true(ret == 0);\n    assert_true(session->opts.flags & SSH_OPT_FLAG_GSSAPI_AUTH);\n    assert_false(session->opts.flags & SSH_OPT_FLAG_KBDINT_AUTH);\n\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"kbd\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG8);\n    assert_true(ret == 0);\n    assert_true(session->opts.flags & SSH_OPT_FLAG_KBDINT_AUTH);\n\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"pass\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG8);\n    assert_true(ret == 0);\n    assert_true(session->opts.flags & SSH_OPT_FLAG_PASSWORD_AUTH);\n\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"pubkey\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG8);\n    assert_true(ret == 0);\n    assert_true(session->opts.flags & SSH_OPT_FLAG_PUBKEY_AUTH);\n}\n\n/**\n * @brief Verify the configuration parser does not choke on unknown\n * or unsupported configuration options\n */\nstatic void torture_config_unknown(void **state) {\n    ssh_session session = *state;\n    int ret = 0;\n\n    /* test corner cases */\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG9);\n    assert_true(ret == 0);\n    ret = ssh_config_parse_file(session, \"/etc/ssh/ssh_config\");\n    assert_true(ret == 0);\n    ret = ssh_config_parse_file(session, GLOBAL_CLIENT_CONFIG);\n    assert_true(ret == 0);\n}\n\n\n/**\n * @brief Verify the configuration parser accepts Match keyword with\n * full OpenSSH syntax.\n */\nstatic void torture_config_match(void **state)\n{\n    ssh_session session = *state;\n    char *localuser = NULL;\n    char config[1024];\n    int ret = 0;\n\n    /* Without any settings we should get all-matched.com hostname */\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"unmatched\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG10);\n    assert_ssh_return_code(session, ret);\n    assert_string_equal(session->opts.host, \"all-matched.com\");\n\n    /* Hostname example does simple hostname matching */\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"example\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG10);\n    assert_ssh_return_code(session, ret);\n    assert_string_equal(session->opts.host, \"example.com\");\n\n    /* We can match also both hosts from a comma separated list */\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"example1\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG10);\n    assert_ssh_return_code(session, ret);\n    assert_string_equal(session->opts.host, \"exampleN\");\n\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"example2\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG10);\n    assert_ssh_return_code(session, ret);\n    assert_string_equal(session->opts.host, \"exampleN\");\n\n    /* We can match by user */\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_USER, \"guest\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG10);\n    assert_ssh_return_code(session, ret);\n    assert_string_equal(session->opts.host, \"guest.com\");\n\n    /* We can combine two options on a single line to match both of them */\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_USER, \"tester\");\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"testhost\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG10);\n    assert_ssh_return_code(session, ret);\n    assert_string_equal(session->opts.host, \"testhost.com\");\n\n    /* We can also negate conditions */\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_USER, \"not-tester\");\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"testhost\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG10);\n    assert_ssh_return_code(session, ret);\n    assert_string_equal(session->opts.host, \"nonuser-testhost.com\");\n\n    /* Match final is not completely supported, but should do quite much the\n     * same as \"match all\". The trailing \"all\" is not mandatory. */\n    torture_write_file(LIBSSH_TESTCONFIG10,\n                       \"Match final all\\n\"\n                       \"\\tHostName final-all.com\\n\"\n                       \"\");\n    torture_reset_config(session);\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG10);\n    assert_ssh_return_code(session, ret);\n    assert_string_equal(session->opts.host, \"final-all.com\");\n\n    torture_write_file(LIBSSH_TESTCONFIG10,\n                       \"Match final\\n\"\n                       \"\\tHostName final.com\\n\"\n                       \"\");\n    torture_reset_config(session);\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG10);\n    assert_ssh_return_code(session, ret);\n    assert_string_equal(session->opts.host, \"final.com\");\n\n    /* Match canonical is not completely supported, but should do quite much the\n     * same as \"match all\". The trailing \"all\" is not mandatory. */\n    torture_write_file(LIBSSH_TESTCONFIG10,\n                       \"Match canonical all\\n\"\n                       \"\\tHostName canonical-all.com\\n\"\n                       \"\");\n    torture_reset_config(session);\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG10);\n    assert_ssh_return_code(session, ret);\n    assert_string_equal(session->opts.host, \"canonical-all.com\");\n\n    torture_write_file(LIBSSH_TESTCONFIG10,\n                       \"Match canonical all\\n\"\n                       \"\\tHostName canonical.com\\n\"\n                       \"\");\n    torture_reset_config(session);\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG10);\n    assert_ssh_return_code(session, ret);\n    assert_string_equal(session->opts.host, \"canonical.com\");\n\n    localuser = ssh_get_local_username();\n    assert_non_null(localuser);\n    snprintf(config, sizeof(config),\n             \"Match localuser %s\\n\"\n             \"\\tHostName otherhost\\n\"\n             \"\", localuser);\n    free(localuser);\n    torture_write_file(LIBSSH_TESTCONFIG10, config);\n    torture_reset_config(session);\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG10);\n    assert_ssh_return_code(session, ret);\n    assert_string_equal(session->opts.host, \"otherhost\");\n\n    /* Try to create some invalid configurations */\n    /* Missing argument to Match*/\n    torture_write_file(LIBSSH_TESTCONFIG10,\n                       \"Match\\n\"\n                       \"\\tHost missing.com\\n\"\n                       \"\");\n    torture_reset_config(session);\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG10);\n    assert_ssh_return_code_equal(session, ret, SSH_ERROR);\n\n    /* Missing argument to unsupported option originalhost */\n    torture_write_file(LIBSSH_TESTCONFIG10,\n                       \"Match originalhost\\n\"\n                       \"\\tHost originalhost.com\\n\"\n                       \"\");\n    torture_reset_config(session);\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG10);\n    assert_ssh_return_code_equal(session, ret, SSH_ERROR);\n\n    /* Missing argument to option localuser */\n    torture_write_file(LIBSSH_TESTCONFIG10,\n                       \"Match localuser\\n\"\n                       \"\\tUser localuser2\\n\"\n                       \"\");\n    torture_reset_config(session);\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG10);\n    assert_ssh_return_code_equal(session, ret, SSH_ERROR);\n\n    /* Missing argument to option user */\n    torture_write_file(LIBSSH_TESTCONFIG10,\n                       \"Match user\\n\"\n                       \"\\tUser user2\\n\"\n                       \"\");\n    torture_reset_config(session);\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG10);\n    assert_ssh_return_code_equal(session, ret, SSH_ERROR);\n\n    /* Missing argument to option host */\n    torture_write_file(LIBSSH_TESTCONFIG10,\n                       \"Match host\\n\"\n                       \"\\tUser host2\\n\"\n                       \"\");\n    torture_reset_config(session);\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG10);\n    assert_ssh_return_code_equal(session, ret, SSH_ERROR);\n\n    /* Missing argument to unsupported option exec */\n    torture_write_file(LIBSSH_TESTCONFIG10,\n                       \"Match exec\\n\"\n                       \"\\tUser exec\\n\"\n                       \"\");\n    torture_reset_config(session);\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG10);\n    assert_ssh_return_code_equal(session, ret, SSH_ERROR);\n}\n\n/**\n * @brief Verify we can parse ProxyJump configuration option\n */\nstatic void torture_config_proxyjump(void **state) {\n    ssh_session session = *state;\n    int ret = 0;\n\n    /* Simplest version with just a hostname */\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"simple\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG11);\n    assert_ssh_return_code(session, ret);\n    assert_string_equal(session->opts.ProxyCommand, \"ssh -W [%h]:%p jumpbox\");\n\n    /* With username */\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"user\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG11);\n    assert_ssh_return_code(session, ret);\n    assert_string_equal(session->opts.ProxyCommand,\n                        \"ssh -l user -W [%h]:%p jumpbox\");\n\n    /* With port */\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"port\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG11);\n    assert_ssh_return_code(session, ret);\n    assert_string_equal(session->opts.ProxyCommand,\n                        \"ssh -p 2222 -W [%h]:%p jumpbox\");\n\n    /* Two step jump */\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"two-step\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG11);\n    assert_ssh_return_code(session, ret);\n    assert_string_equal(session->opts.ProxyCommand,\n                        \"ssh -l u1 -p 222 -J u2@second:33 -W [%h]:%p first\");\n\n    /* none */\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"none\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG11);\n    assert_ssh_return_code(session, ret);\n    assert_true(session->opts.ProxyCommand == NULL);\n\n    /* If also ProxyCommand is specifed, the first is applied */\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"only-command\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG11);\n    assert_ssh_return_code(session, ret);\n    assert_string_equal(session->opts.ProxyCommand, PROXYCMD);\n\n    /* If also ProxyCommand is specifed, the first is applied */\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"only-jump\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG11);\n    assert_ssh_return_code(session, ret);\n    assert_string_equal(session->opts.ProxyCommand,\n                        \"ssh -W [%h]:%p jumpbox\");\n\n    /* IPv6 address */\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"ipv6\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG11);\n    assert_ssh_return_code(session, ret);\n    assert_string_equal(session->opts.ProxyCommand,\n                        \"ssh -W [%h]:%p 2620:52:0::fed\");\n\n    /* Try to create some invalid configurations */\n    /* Non-numeric port */\n    torture_write_file(LIBSSH_TESTCONFIG11,\n                       \"Host bad-port\\n\"\n                       \"\\tProxyJump jumpbox:22bad22\\n\"\n                       \"\");\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"bad-port\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG11);\n    assert_ssh_return_code_equal(session, ret, SSH_ERROR);\n\n    /* Too many @ */\n    torture_write_file(LIBSSH_TESTCONFIG11,\n                       \"Host bad-hostname\\n\"\n                       \"\\tProxyJump user@principal.com@jumpbox:22\\n\"\n                       \"\");\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"bad-hostname\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG11);\n    assert_ssh_return_code_equal(session, ret, SSH_ERROR);\n\n    /* Braces mismatch in hostname */\n    torture_write_file(LIBSSH_TESTCONFIG11,\n                       \"Host mismatch\\n\"\n                       \"\\tProxyJump [::1\\n\"\n                       \"\");\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"mismatch\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG11);\n    assert_ssh_return_code_equal(session, ret, SSH_ERROR);\n\n    /* Bad host-port separator */\n    torture_write_file(LIBSSH_TESTCONFIG11,\n                       \"Host beef\\n\"\n                       \"\\tProxyJump [dead::beef]::22\\n\"\n                       \"\");\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"beef\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG11);\n    assert_ssh_return_code_equal(session, ret, SSH_ERROR);\n\n    /* Missing hostname */\n    torture_write_file(LIBSSH_TESTCONFIG11,\n                       \"Host no-host\\n\"\n                       \"\\tProxyJump user@:22\\n\"\n                       \"\");\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"no-host\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG11);\n    assert_ssh_return_code_equal(session, ret, SSH_ERROR);\n\n    /* Missing user */\n    torture_write_file(LIBSSH_TESTCONFIG11,\n                       \"Host no-user\\n\"\n                       \"\\tProxyJump @host:22\\n\"\n                       \"\");\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"no-user\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG11);\n    assert_ssh_return_code_equal(session, ret, SSH_ERROR);\n\n    /* Missing port */\n    torture_write_file(LIBSSH_TESTCONFIG11,\n                       \"Host no-port\\n\"\n                       \"\\tProxyJump host:\\n\"\n                       \"\");\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"no-port\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG11);\n    assert_ssh_return_code_equal(session, ret, SSH_ERROR);\n\n    /* Non-numeric port in second jump */\n    torture_write_file(LIBSSH_TESTCONFIG11,\n                       \"Host bad-port-2\\n\"\n                       \"\\tProxyJump localhost,jumpbox:22bad22\\n\"\n                       \"\");\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"bad-port-2\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG11);\n    assert_ssh_return_code_equal(session, ret, SSH_ERROR);\n\n    /* Too many @ in second jump */\n    torture_write_file(LIBSSH_TESTCONFIG11,\n                       \"Host bad-hostname\\n\"\n                       \"\\tProxyJump localhost,user@principal.com@jumpbox:22\\n\"\n                       \"\");\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"bad-hostname\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG11);\n    assert_ssh_return_code_equal(session, ret, SSH_ERROR);\n\n    /* Braces mismatch in second jump */\n    torture_write_file(LIBSSH_TESTCONFIG11,\n                       \"Host mismatch\\n\"\n                       \"\\tProxyJump localhost,[::1:20\\n\"\n                       \"\");\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"mismatch\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG11);\n    assert_ssh_return_code_equal(session, ret, SSH_ERROR);\n\n    /* Bad host-port separator in second jump */\n    torture_write_file(LIBSSH_TESTCONFIG11,\n                       \"Host beef\\n\"\n                       \"\\tProxyJump localhost,[dead::beef]::22\\n\"\n                       \"\");\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"beef\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG11);\n    assert_ssh_return_code_equal(session, ret, SSH_ERROR);\n\n    /* Missing hostname in second jump */\n    torture_write_file(LIBSSH_TESTCONFIG11,\n                       \"Host no-host\\n\"\n                       \"\\tProxyJump localhost,user@:22\\n\"\n                       \"\");\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"no-host\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG11);\n    assert_ssh_return_code_equal(session, ret, SSH_ERROR);\n\n    /* Missing user in second jump */\n    torture_write_file(LIBSSH_TESTCONFIG11,\n                       \"Host no-user\\n\"\n                       \"\\tProxyJump localhost,@host:22\\n\"\n                       \"\");\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"no-user\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG11);\n    assert_ssh_return_code_equal(session, ret, SSH_ERROR);\n\n    /* Missing port in second jump */\n    torture_write_file(LIBSSH_TESTCONFIG11,\n                       \"Host no-port\\n\"\n                       \"\\tProxyJump localhost,host:\\n\"\n                       \"\");\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"no-port\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG11);\n    assert_ssh_return_code_equal(session, ret, SSH_ERROR);\n}\n\n/**\n * @brief Verify the configuration parser handles all the possible\n * versions of RekeyLimit configuration option.\n */\nstatic void torture_config_rekey(void **state)\n{\n    ssh_session session = *state;\n    int ret = 0;\n\n    /* Default values */\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"default\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG12);\n    assert_ssh_return_code(session, ret);\n    assert_int_equal(session->opts.rekey_data, 0);\n    assert_int_equal(session->opts.rekey_time, 0);\n\n    /* 42 GB */\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"data1\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG12);\n    assert_ssh_return_code(session, ret);\n    assert_int_equal(session->opts.rekey_data, (uint64_t) 42 * 1024 * 1024 * 1024);\n    assert_int_equal(session->opts.rekey_time, 0);\n\n    /* 41 MB */\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"data2\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG12);\n    assert_ssh_return_code(session, ret);\n    assert_int_equal(session->opts.rekey_data, 31 * 1024 * 1024);\n    assert_int_equal(session->opts.rekey_time, 0);\n\n    /* 521 KB */\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"data3\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG12);\n    assert_ssh_return_code(session, ret);\n    assert_int_equal(session->opts.rekey_data, 521 * 1024);\n    assert_int_equal(session->opts.rekey_time, 0);\n\n    /* default 3D */\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"time1\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG12);\n    assert_ssh_return_code(session, ret);\n    assert_int_equal(session->opts.rekey_data, 0);\n    assert_int_equal(session->opts.rekey_time, 3 * 24 * 60 * 60 * 1000);\n\n    /* default 2h */\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"time2\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG12);\n    assert_ssh_return_code(session, ret);\n    assert_int_equal(session->opts.rekey_data, 0);\n    assert_int_equal(session->opts.rekey_time, 2 * 60 * 60 * 1000);\n\n    /* default 160m */\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"time3\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG12);\n    assert_ssh_return_code(session, ret);\n    assert_int_equal(session->opts.rekey_data, 0);\n    assert_int_equal(session->opts.rekey_time, 160 * 60 * 1000);\n\n    /* default 9600 [s] */\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"time4\");\n    ret = ssh_config_parse_file(session, LIBSSH_TESTCONFIG12);\n    assert_ssh_return_code(session, ret);\n    assert_int_equal(session->opts.rekey_data, 0);\n    assert_int_equal(session->opts.rekey_time, 9600 * 1000);\n\n}\n\n/**\n * @brief test ssh_config_parse_file with PubkeyAcceptedKeyTypes\n */\nstatic void torture_config_pubkeyacceptedkeytypes(void **state)\n{\n    ssh_session session = *state;\n    int rc;\n    char *fips_algos;\n\n    rc = ssh_config_parse_file(session, LIBSSH_TEST_PUBKEYACCEPTEDKEYTYPES);\n    assert_int_equal(rc, SSH_OK);\n\n    if (ssh_fips_mode()) {\n        fips_algos = ssh_keep_fips_algos(SSH_HOSTKEYS, PUBKEYACCEPTEDTYPES);\n        assert_non_null(fips_algos);\n        assert_string_equal(session->opts.pubkey_accepted_types, fips_algos);\n        SAFE_FREE(fips_algos);\n    } else {\n        assert_string_equal(session->opts.pubkey_accepted_types, PUBKEYACCEPTEDTYPES);\n    }\n}\n\n/* match_pattern() sanity tests\n */\nstatic void torture_config_match_pattern(void **state)\n{\n    int rv = 0;\n\n    (void) state;\n\n    /* Simple test \"a\" matches \"a\" */\n    rv = match_pattern(\"a\", \"a\", MAX_MATCH_RECURSION);\n    assert_int_equal(rv, 1);\n\n    /* Simple test \"a\" does not match \"b\" */\n    rv = match_pattern(\"a\", \"b\", MAX_MATCH_RECURSION);\n    assert_int_equal(rv, 0);\n\n    /* NULL arguments are correctly handled */\n    rv = match_pattern(\"a\", NULL, MAX_MATCH_RECURSION);\n    assert_int_equal(rv, 0);\n    rv = match_pattern(NULL, \"a\", MAX_MATCH_RECURSION);\n    assert_int_equal(rv, 0);\n\n    /* Simple wildcard ? is handled in pattern */\n    rv = match_pattern(\"a\", \"?\", MAX_MATCH_RECURSION);\n    assert_int_equal(rv, 1);\n    rv = match_pattern(\"aa\", \"?\", MAX_MATCH_RECURSION);\n    assert_int_equal(rv, 0);\n    rv = match_pattern(\"?\", \"a\", MAX_MATCH_RECURSION); /* Wildcard in search string */\n    assert_int_equal(rv, 0);\n    rv = match_pattern(\"?\", \"?\", MAX_MATCH_RECURSION);\n    assert_int_equal(rv, 1);\n\n    /* Simple wildcard * is handled in pattern */\n    rv = match_pattern(\"a\", \"*\", MAX_MATCH_RECURSION);\n    assert_int_equal(rv, 1);\n    rv = match_pattern(\"aa\", \"*\", MAX_MATCH_RECURSION);\n    assert_int_equal(rv, 1);\n    rv = match_pattern(\"*\", \"a\", MAX_MATCH_RECURSION); /* Wildcard in search string */\n    assert_int_equal(rv, 0);\n    rv = match_pattern(\"*\", \"*\", MAX_MATCH_RECURSION);\n    assert_int_equal(rv, 1);\n\n    /* More complicated patterns */\n    rv = match_pattern(\"a\", \"*a\", MAX_MATCH_RECURSION);\n    assert_int_equal(rv, 1);\n    rv = match_pattern(\"a\", \"a*\", MAX_MATCH_RECURSION);\n    assert_int_equal(rv, 1);\n    rv = match_pattern(\"abababc\", \"*abc\", MAX_MATCH_RECURSION);\n    assert_int_equal(rv, 1);\n    rv = match_pattern(\"ababababca\", \"*abc\", MAX_MATCH_RECURSION);\n    assert_int_equal(rv, 0);\n    rv = match_pattern(\"ababababca\", \"*abc*\", MAX_MATCH_RECURSION);\n    assert_int_equal(rv, 1);\n\n    /* Multiple wildcards in row */\n    rv = match_pattern(\"aa\", \"??\", MAX_MATCH_RECURSION);\n    assert_int_equal(rv, 1);\n    rv = match_pattern(\"bba\", \"??a\", MAX_MATCH_RECURSION);\n    assert_int_equal(rv, 1);\n    rv = match_pattern(\"aaa\", \"**a\", MAX_MATCH_RECURSION);\n    assert_int_equal(rv, 1);\n    rv = match_pattern(\"bbb\", \"**a\", MAX_MATCH_RECURSION);\n    assert_int_equal(rv, 0);\n\n    /* Consecutive asterisks do not make sense and do not need to recurse */\n    rv = match_pattern(\"hostname\", \"**********pattern\", 5);\n    assert_int_equal(rv, 0);\n    rv = match_pattern(\"hostname\", \"pattern**********\", 5);\n    assert_int_equal(rv, 0);\n    rv = match_pattern(\"pattern\", \"***********pattern\", 5);\n    assert_int_equal(rv, 1);\n    rv = match_pattern(\"pattern\", \"pattern***********\", 5);\n    assert_int_equal(rv, 1);\n\n    /* Limit the maximum recursion */\n    rv = match_pattern(\"hostname\", \"*p*a*t*t*e*r*n*\", 5);\n    assert_int_equal(rv, 0);\n    rv = match_pattern(\"pattern\", \"*p*a*t*t*e*r*n*\", 5); /* Too much recursion */\n    assert_int_equal(rv, 0);\n\n}\n\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test(torture_config_from_file),\n        cmocka_unit_test(torture_config_double_ports),\n        cmocka_unit_test(torture_config_glob),\n        cmocka_unit_test(torture_config_new),\n        cmocka_unit_test(torture_config_auth_methods),\n        cmocka_unit_test(torture_config_unknown),\n        cmocka_unit_test(torture_config_match),\n        cmocka_unit_test(torture_config_proxyjump),\n        cmocka_unit_test(torture_config_rekey),\n        cmocka_unit_test(torture_config_pubkeyacceptedkeytypes),\n        cmocka_unit_test(torture_config_match_pattern),\n    };\n\n\n    ssh_init();\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, setup_config_files, teardown);\n    ssh_finalize();\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/unittests/torture_crypto.c",
    "content": "#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include \"torture.h\"\n#include \"libssh/crypto.h\"\n\nuint8_t key[32] =\n    \"\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\x09\\x0a\\x0b\\x0c\\x0d\\x0e\"\n    \"\\x0f\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\"\n    \"\\x1e\\x1f\";\n\nuint8_t IV[16] =\n    \"\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\"\n    \"\\x1f\";\n\nuint8_t cleartext[144] =\n    \"\\xb4\\xfc\\x5d\\xc2\\x49\\x8d\\x2c\\x29\\x4a\\xc9\\x9a\\xb0\\x1b\\xf8\\x29\"\n    \"\\xee\\x85\\x6d\\x8c\\x04\\x34\\x7c\\x65\\xf4\\x89\\x97\\xc5\\x71\\x70\\x41\"\n    \"\\x91\\x40\\x19\\x60\\xe1\\xf1\\x8f\\x4d\\x8c\\x17\\x51\\xd6\\xbc\\x69\\x6e\"\n    \"\\xf2\\x21\\x87\\x18\\x6c\\xef\\xc4\\xf4\\xd9\\xe6\\x1b\\x94\\xf7\\xd8\\xb2\"\n    \"\\xe9\\x24\\xb9\\xe7\\xe6\\x19\\xf5\\xec\\x55\\x80\\x9a\\xc8\\x7d\\x70\\xa3\"\n    \"\\x50\\xf8\\x03\\x10\\x35\\x49\\x9b\\x53\\x58\\xd7\\x4c\\xfc\\x5f\\x02\\xd6\"\n    \"\\x28\\xea\\xcc\\x43\\xee\\x5e\\x2b\\x8a\\x7a\\x66\\xf7\\x00\\xee\\x09\\x18\"\n    \"\\x30\\x1b\\x47\\xa2\\x16\\x69\\xc4\\x6e\\x44\\x3f\\xbd\\xec\\x52\\xce\\xe5\"\n    \"\\x41\\xf2\\xe0\\x04\\x4f\\x5a\\x55\\x58\\x37\\xba\\x45\\x8d\\x15\\x53\\xf6\"\n    \"\\x31\\x91\\x13\\x8c\\x51\\xed\\x08\\x07\\xdb\";\n\nuint8_t aes256_cbc_encrypted[144] =\n    \"\\x7f\\x1b\\x92\\xac\\xc5\\x16\\x05\\x55\\x74\\xac\\xb4\\xe0\\x91\\x8c\\xf8\"\n    \"\\x0d\\xa9\\x72\\xa5\\x09\\xb8\\x44\\xee\\x55\\x02\\x13\\xb7\\x52\\x0a\\xf0\"\n    \"\\xac\\xd0\\x21\\x0e\\x58\\x7b\\x34\\xfe\\xdb\\x36\\x01\\x60\\x7d\\x18\\x3a\"\n    \"\\xa9\\x15\\x18\\x5b\\x13\\xca\\xdd\\x77\\x7d\\xdf\\x64\\xc6\\xd5\\x75\\x4b\"\n    \"\\x02\\x02\\x37\\xb1\\xf4\\x33\\xff\\x93\\xe6\\x32\\x08\\xda\\xcb\\x5d\\xa2\"\n    \"\\x8f\\x17\\x1f\\x99\\x92\\x60\\x22\\x9d\\x6b\\xe6\\xb2\\x5e\\xb0\\x5d\\x26\"\n    \"\\x3f\\xde\\xb8\\xc1\\xb0\\x70\\x80\\x1c\\x00\\xd0\\x93\\x2b\\xeb\\x0f\\xd7\"\n    \"\\x70\\x7a\\x9a\\x7a\\xa6\\x21\\x23\\x2c\\x02\\xb7\\xcd\\x88\\x10\\x9c\\x2d\"\n    \"\\x0c\\xd3\\xfa\\xc1\\x33\\x5b\\xe1\\xa1\\xd4\\x3d\\x8f\\xb8\\x50\\xc5\\xb5\"\n    \"\\x72\\xdd\\x6d\\x32\\x1f\\x58\\x00\\x48\\xbe\";\n\nstatic int get_cipher(struct ssh_cipher_struct *cipher, const char *ciphername)\n{\n    struct ssh_cipher_struct *ciphers = ssh_get_ciphertab();\n    size_t i;\n    int cmp;\n\n    assert_non_null(cipher);\n\n    for (i = 0; ciphers[i].name != NULL; i++) {\n        cmp = strcmp(ciphername, ciphers[i].name);\n        if (cmp == 0){\n            memcpy(cipher, &ciphers[i], sizeof(*cipher));\n            return SSH_OK;\n        }\n    }\n\n    return SSH_ERROR;\n}\n\nstatic void torture_crypto_aes256_cbc(void **state)\n{\n    uint8_t output[sizeof(cleartext)] = {0};\n    uint8_t iv[16] = {0};\n    struct ssh_cipher_struct cipher = {0};\n    int rc;\n    (void)state;\n\n    rc = get_cipher(&cipher, \"aes256-cbc\");\n    assert_int_equal(rc, SSH_OK);\n\n    assert_non_null(cipher.set_encrypt_key);\n    assert_non_null(cipher.encrypt);\n\n    memcpy(iv, IV, sizeof(IV));\n    cipher.set_encrypt_key(&cipher,\n            key,\n            iv\n    );\n\n    cipher.encrypt(&cipher,\n            cleartext,\n            output,\n            sizeof(cleartext)\n            );\n\n    assert_memory_equal(output, aes256_cbc_encrypted, sizeof(aes256_cbc_encrypted));\n    ssh_cipher_clear(&cipher);\n\n    rc = get_cipher(&cipher, \"aes256-cbc\");\n    assert_int_equal(rc, SSH_OK);\n\n    assert_non_null(cipher.set_decrypt_key);\n    assert_non_null(cipher.decrypt);\n\n    memcpy(iv, IV, sizeof(IV));\n    cipher.set_decrypt_key(&cipher,\n            key,\n            iv\n    );\n\n    memset(output, '\\0', sizeof(output));\n    cipher.decrypt(&cipher,\n            aes256_cbc_encrypted,\n            output,\n            sizeof(aes256_cbc_encrypted)\n            );\n\n    assert_memory_equal(output, cleartext, sizeof(cleartext));\n\n    ssh_cipher_clear(&cipher);\n}\n\nint torture_run_tests(void) {\n    int rc;\n    const struct CMUnitTest tests[] = {\n        cmocka_unit_test(torture_crypto_aes256_cbc),\n    };\n\n    ssh_init();\n    rc = cmocka_run_group_tests(tests, NULL, NULL);\n    ssh_finalize();\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/unittests/torture_hashes.c",
    "content": "#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include \"torture.h\"\n#include \"torture_key.h\"\n#include \"legacy.c\"\n#include \"dh.c\"\n\nstatic int setup_rsa_key(void **state)\n{\n    int rc=0;\n    enum ssh_keytypes_e type;\n    char *b64_key, *p;\n    ssh_key key;\n\n    const char *q;\n\n    b64_key = strdup(torture_get_testkey_pub(SSH_KEYTYPE_RSA));\n    assert_non_null(b64_key);\n\n    q = p = b64_key;\n    while (p != NULL && *p != '\\0' && *p != ' ') p++;\n    if (p != NULL) {\n        *p = '\\0';\n    }\n\n    type = ssh_key_type_from_name(q);\n    assert_true(type == SSH_KEYTYPE_RSA);\n\n    q = ++p;\n    while (p != NULL && *p != '\\0' && *p != ' ') p++;\n    if (p != NULL) {\n        *p = '\\0';\n    }\n\n    rc = ssh_pki_import_pubkey_base64(q, type, &key);\n    assert_true(rc == 0);\n\n    free(b64_key);\n    *state = key;\n\n    return 0;\n}\n\nstatic int teardown(void **state)\n{\n    SSH_KEY_FREE(*state);\n    return 0;\n}\n\nstatic void torture_md5_hash(void **state)\n{\n    ssh_key pubkey = *state;\n    char *hash = NULL;\n    char *hexa = NULL;\n    size_t hlen;\n    int rc = 0;\n\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    rc = ssh_get_publickey_hash(pubkey, SSH_PUBLICKEY_HASH_MD5,\n                                (unsigned char **)&hash, &hlen);\n    if (ssh_fips_mode()) {\n        /* When in FIPS mode, expect the call to fail */\n        assert_int_equal(rc, SSH_ERROR);\n    } else {\n        assert_int_equal(rc, SSH_OK);\n\n        hexa = ssh_get_hexa((unsigned char *)hash, hlen);\n        SSH_STRING_FREE_CHAR(hash);\n        assert_string_equal(hexa,\n                            \"50:15:a0:9b:92:bf:33:1c:01:c5:8c:fe:18:fa:ce:78\");\n\n        SSH_STRING_FREE_CHAR(hexa);\n    }\n}\n\nstatic void torture_sha1_hash(void **state)\n{\n    ssh_key pubkey = *state;\n    char *hash = NULL;\n    char *sha1 = NULL;\n    int rc = 0;\n    size_t hlen;\n\n    rc = ssh_get_publickey_hash(pubkey, SSH_PUBLICKEY_HASH_SHA1,\n                                (unsigned char **)&hash, &hlen);\n    assert_true(rc == 0);\n\n    sha1 = ssh_get_b64_unpadded((unsigned char *)hash, hlen);\n    SSH_STRING_FREE_CHAR(hash);\n    assert_string_equal(sha1, \"6wP+houujQmxLBiFugTcoeoODCM\");\n\n    SSH_STRING_FREE_CHAR(sha1);\n}\n\nstatic void torture_sha256_hash(void **state)\n{\n    ssh_key pubkey = *state;\n    char *hash = NULL;\n    char *sha256 = NULL;\n    int rc = 0;\n    size_t hlen;\n\n    rc = ssh_get_publickey_hash(pubkey, SSH_PUBLICKEY_HASH_SHA256,\n                                (unsigned char **)&hash, &hlen);\n    assert_true(rc == 0);\n\n    sha256 = ssh_get_b64_unpadded((unsigned char *)hash, hlen);\n    SSH_STRING_FREE_CHAR(hash);\n    assert_string_equal(sha256, \"jXstVLLe84fSDo1kEYGn6iumnPCSorhaiWxnJz8VTII\");\n\n    SSH_STRING_FREE_CHAR(sha256);\n\n}\n\nstatic void torture_sha256_fingerprint(void **state)\n{\n    ssh_key pubkey = *state;\n    char *hash = NULL;\n    char *sha256 = NULL;\n    int rc = 0;\n    size_t hlen;\n\n    rc = ssh_get_publickey_hash(pubkey,\n                                SSH_PUBLICKEY_HASH_SHA256,\n                                (unsigned char **)&hash,\n                                &hlen);\n    assert_true(rc == 0);\n\n    sha256 = ssh_get_fingerprint_hash(SSH_PUBLICKEY_HASH_SHA256,\n                                      (unsigned char *)hash,\n                                      hlen);\n    SSH_STRING_FREE_CHAR(hash);\n    assert_string_equal(sha256,\n                        \"SHA256:jXstVLLe84fSDo1kEYGn6iumnPCSorhaiWxnJz8VTII\");\n\n    SSH_STRING_FREE_CHAR(sha256);\n}\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_md5_hash,\n                                        setup_rsa_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_sha1_hash,\n                                        setup_rsa_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_sha256_hash,\n                                        setup_rsa_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_sha256_fingerprint,\n                                        setup_rsa_key,\n                                        teardown),\n    };\n\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, NULL, NULL);\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/unittests/torture_init.c",
    "content": "#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include <errno.h>\n#include \"torture.h\"\n#include \"libssh/libssh.h\"\n\nstatic void torture_ssh_init(void **state) {\n    int rc;\n\n    (void) state;\n\n    rc = ssh_init();\n    assert_int_equal(rc, SSH_OK);\n    rc = ssh_finalize();\n    assert_int_equal(rc, SSH_OK);\n}\n\nstatic void torture_ssh_init_after_finalize(void **state) {\n\n    int rc;\n\n    (void) state;\n\n    rc = ssh_init();\n    assert_int_equal(rc, SSH_OK);\n    rc = ssh_finalize();\n    assert_int_equal(rc, SSH_OK);\n    rc = ssh_init();\n    assert_int_equal(rc, SSH_OK);\n    rc = ssh_finalize();\n    assert_int_equal(rc, SSH_OK);\n}\n\nstatic void torture_is_ssh_initialized(UNUSED_PARAM(void **state)) {\n\n    int rc;\n    bool initialized = false;\n\n    /* Make sure the library is not initialized */\n    while (is_ssh_initialized()) {\n        rc = ssh_finalize();\n        assert_return_code(rc, errno);\n    }\n\n    rc = ssh_init();\n    assert_return_code(rc, errno);\n    initialized = is_ssh_initialized();\n    assert_true(initialized);\n    rc = ssh_finalize();\n    assert_return_code(rc, errno);\n    initialized = is_ssh_initialized();\n    assert_false(initialized);\n}\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test(torture_ssh_init),\n        cmocka_unit_test(torture_ssh_init_after_finalize),\n        cmocka_unit_test(torture_is_ssh_initialized),\n    };\n\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, NULL, NULL);\n\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/unittests/torture_isipaddr.c",
    "content": "#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include \"torture.h\"\n\n#include \"misc.c\"\n#include \"error.c\"\n\n/*\n * Test the behavior of ssh_is_ipaddr()\n */\nstatic void torture_ssh_is_ipaddr(void **state)\n{\n    (void)state;\n\n    assert_int_equal(ssh_is_ipaddr(\"127.0.0.1\"),1);\n    assert_int_equal(ssh_is_ipaddr(\"0.0.0.0\"),1);\n    assert_int_equal(ssh_is_ipaddr(\"1.1.1.1\"),1);\n    assert_int_equal(ssh_is_ipaddr(\"255.255.255.255\"),1);\n    assert_int_equal(ssh_is_ipaddr(\"128.128.128.128\"),1);\n    assert_int_equal(ssh_is_ipaddr(\"1.10.100.1\"),1);\n    assert_int_equal(ssh_is_ipaddr(\"0.1.10.100\"),1);\n\n    assert_int_equal(ssh_is_ipaddr(\"2001:0db8:85a3:0000:0000:8a2e:0370:7334\"),1);\n    assert_int_equal(ssh_is_ipaddr(\"fe80:0000:0000:0000:0202:b3ff:fe1e:8329\"),1);\n    assert_int_equal(ssh_is_ipaddr(\"fe80:0:0:0:202:b3ff:fe1e:8329\"),1);\n    assert_int_equal(ssh_is_ipaddr(\"fe80::202:b3ff:fe1e:8329\"),1);\n    assert_int_equal(ssh_is_ipaddr(\"::1\"),1);\n\n    assert_int_equal(ssh_is_ipaddr(\"::ffff:192.0.2.128\"),1);\n\n    assert_int_equal(ssh_is_ipaddr(\"0.0.0.0.0\"),0);\n    assert_int_equal(ssh_is_ipaddr(\"0.0.0.0.a\"),0);\n    assert_int_equal(ssh_is_ipaddr(\"a.0.0.0\"),0);\n    assert_int_equal(ssh_is_ipaddr(\"0a.0.0.0.0\"),0);\n    assert_int_equal(ssh_is_ipaddr(\"\"),0);\n    assert_int_equal(ssh_is_ipaddr(\"0.0.0.\"),0);\n    assert_int_equal(ssh_is_ipaddr(\"0.0\"),0);\n    assert_int_equal(ssh_is_ipaddr(\"0\"),0);\n\n    /*\n     * FIXME: Temporary workaround for Wine bug\n     */\n#ifndef _WIN32\n    assert_int_equal(ssh_is_ipaddr(\"255.255.255\"),0);\n#endif\n\n    assert_int_equal(ssh_is_ipaddr(\"2001:0db8:85a3:0000:0000:8a2e:0370:7334:1002\"), 0);\n    assert_int_equal(ssh_is_ipaddr(\"fe80:x:202:b3ff:fe1e:8329\"), 0);\n    assert_int_equal(ssh_is_ipaddr(\"fe80:x:202:b3ff:fe1e:8329\"), 0);\n    assert_int_equal(ssh_is_ipaddr(\":1\"), 0);\n}\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test(torture_ssh_is_ipaddr)\n    };\n\n    ssh_init();\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, NULL, NULL);\n    ssh_finalize();\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/unittests/torture_keyfiles.c",
    "content": "#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include \"torture.h\"\n#include \"torture_key.h\"\n#include \"legacy.c\"\n\n#define LIBSSH_RSA_TESTKEY \"libssh_testkey.id_rsa\"\n#ifdef HAVE_DSA\n#define LIBSSH_DSA_TESTKEY \"libssh_testkey.id_dsa\"\n#endif\n\nstatic int setup_rsa_key(void **state)\n{\n    ssh_session session;\n\n    unlink(LIBSSH_RSA_TESTKEY);\n    unlink(LIBSSH_RSA_TESTKEY \".pub\");\n\n    torture_write_file(LIBSSH_RSA_TESTKEY,\n                       torture_get_testkey(SSH_KEYTYPE_RSA, 0));\n    torture_write_file(LIBSSH_RSA_TESTKEY \".pub\",\n                       torture_get_testkey_pub(SSH_KEYTYPE_RSA));\n\n    session = ssh_new();\n    *state = session;\n\n    return 0;\n}\n\n#ifdef HAVE_DSA\nstatic int setup_dsa_key(void **state)\n{\n    ssh_session session;\n\n    unlink(LIBSSH_DSA_TESTKEY);\n    unlink(LIBSSH_DSA_TESTKEY \".pub\");\n\n    torture_write_file(LIBSSH_DSA_TESTKEY,\n                       torture_get_testkey(SSH_KEYTYPE_DSS, 0));\n    torture_write_file(LIBSSH_DSA_TESTKEY \".pub\",\n                       torture_get_testkey_pub(SSH_KEYTYPE_DSS));\n\n    session = ssh_new();\n    *state = session;\n\n    return 0;\n}\n#endif\n\nstatic int setup_both_keys(void **state) {\n    int rc;\n\n    rc = setup_rsa_key(state);\n    if (rc != 0) {\n        return rc;\n    }\n#ifdef HAVE_DSA\n    ssh_free(*state);\n\n    rc = setup_dsa_key(state);\n#endif\n\n    return rc;\n}\n\nstatic int setup_both_keys_passphrase(void **state)\n{\n    ssh_session session;\n\n    torture_write_file(LIBSSH_RSA_TESTKEY,\n                       torture_get_testkey(SSH_KEYTYPE_RSA, 1));\n    torture_write_file(LIBSSH_RSA_TESTKEY \".pub\",\n                       torture_get_testkey_pub(SSH_KEYTYPE_RSA));\n\n#ifdef HAVE_DSA\n    torture_write_file(LIBSSH_DSA_TESTKEY,\n                       torture_get_testkey(SSH_KEYTYPE_DSS, 1));\n    torture_write_file(LIBSSH_DSA_TESTKEY \".pub\",\n                       torture_get_testkey_pub(SSH_KEYTYPE_DSS));\n#endif\n\n    session = ssh_new();\n    *state = session;\n\n    return 0;\n}\n\nstatic int teardown(void **state)\n{\n#ifdef HAVE_DSA\n    unlink(LIBSSH_DSA_TESTKEY);\n    unlink(LIBSSH_DSA_TESTKEY \".pub\");\n#endif\n\n    unlink(LIBSSH_RSA_TESTKEY);\n    unlink(LIBSSH_RSA_TESTKEY \".pub\");\n\n    ssh_free(*state);\n\n    return 0;\n}\n\nstatic void torture_pubkey_from_file(void **state) {\n    ssh_session session = *state;\n    ssh_string pubkey = NULL;\n    int type, rc;\n\n    rc = ssh_try_publickey_from_file(session, LIBSSH_RSA_TESTKEY, &pubkey, &type);\n\n    assert_true(rc == 0);\n\n    SSH_STRING_FREE(pubkey);\n\n    /* test if it returns 1 if pubkey doesn't exist */\n    unlink(LIBSSH_RSA_TESTKEY \".pub\");\n\n    rc = ssh_try_publickey_from_file(session, LIBSSH_RSA_TESTKEY, &pubkey, &type);\n    assert_true(rc == 1);\n\n    /* This free is unnecessary, but the static analyser does not know */\n    SSH_STRING_FREE(pubkey);\n\n    /* test if it returns -1 if privkey doesn't exist */\n    unlink(LIBSSH_RSA_TESTKEY);\n\n    rc = ssh_try_publickey_from_file(session, LIBSSH_RSA_TESTKEY, &pubkey, &type);\n    assert_true(rc == -1);\n\n    /* This free is unnecessary, but the static analyser does not know */\n    SSH_STRING_FREE(pubkey);\n}\n\nstatic int torture_read_one_line(const char *filename, char *buffer, size_t len)\n{\n    FILE *fp;\n    size_t nmemb;\n\n    fp = fopen(filename, \"r\");\n    if (fp == NULL) {\n        return -1;\n    }\n\n    nmemb = fread(buffer, len - 2, 1, fp);\n    if (nmemb != 0 || ferror(fp)) {\n        fclose(fp);\n        return -1;\n    }\n    buffer[len - 1] = '\\0';\n\n    fclose(fp);\n\n    return 0;\n}\n\nstatic void torture_pubkey_generate_from_privkey(void **state) {\n    ssh_session session = *state;\n    ssh_private_key privkey = NULL;\n    ssh_public_key pubkey = NULL;\n    ssh_string pubkey_orig = NULL;\n    ssh_string pubkey_new = NULL;\n    char pubkey_line_orig[512] = {0};\n    char pubkey_line_new[512] = {0};\n    char *p;\n    int type_orig = 0;\n    int type_new = 0;\n    int rc;\n\n    /* read the publickey */\n    rc = ssh_try_publickey_from_file(session, LIBSSH_RSA_TESTKEY, &pubkey_orig,\n        &type_orig);\n    assert_true(rc == 0);\n    assert_non_null(pubkey_orig);\n\n    rc = torture_read_one_line(LIBSSH_RSA_TESTKEY \".pub\", pubkey_line_orig,\n        sizeof(pubkey_line_orig));\n    assert_true(rc == 0);\n\n    /* remove the public key, generate it from the private key and write it. */\n    unlink(LIBSSH_RSA_TESTKEY \".pub\");\n\n    privkey = privatekey_from_file(session, LIBSSH_RSA_TESTKEY, 0, NULL);\n    assert_non_null(privkey);\n\n    pubkey = publickey_from_privatekey(privkey);\n    assert_non_null(pubkey);\n    type_new = privkey->type;\n    privatekey_free(privkey);\n\n    pubkey_new = publickey_to_string(pubkey);\n    publickey_free(pubkey);\n\n    assert_non_null(pubkey_new);\n\n    assert_true(ssh_string_len(pubkey_orig) == ssh_string_len(pubkey_new));\n    assert_memory_equal(ssh_string_data(pubkey_orig),\n                        ssh_string_data(pubkey_new),\n                        ssh_string_len(pubkey_orig));\n\n    rc = ssh_publickey_to_file(session, LIBSSH_RSA_TESTKEY \".pub\", pubkey_new, type_new);\n    assert_true(rc == 0);\n\n    rc = torture_read_one_line(LIBSSH_RSA_TESTKEY \".pub\", pubkey_line_new,\n        sizeof(pubkey_line_new));\n    assert_true(rc == 0);\n\n    /* do not compare hostname */\n    p = strrchr(pubkey_line_orig, ' ');\n    if (p != NULL) {\n        *p = '\\0';\n    }\n    p = strrchr(pubkey_line_new, ' ');\n    if (p != NULL) {\n        *p = '\\0';\n    }\n\n    assert_string_equal(pubkey_line_orig, pubkey_line_new);\n\n    SSH_STRING_FREE(pubkey_orig);\n    SSH_STRING_FREE(pubkey_new);\n}\n\n/**\n * @brief tests the privatekey_from_file function without passphrase\n */\nstatic void torture_privatekey_from_file(void **state) {\n    ssh_session session = *state;\n    ssh_private_key key = NULL;\n\n    key = privatekey_from_file(session, LIBSSH_RSA_TESTKEY, SSH_KEYTYPE_RSA, NULL);\n    assert_non_null(key);\n    if (key != NULL) {\n        privatekey_free(key);\n        key = NULL;\n    }\n\n#ifdef HAVE_DSA\n    key = privatekey_from_file(session, LIBSSH_DSA_TESTKEY, SSH_KEYTYPE_DSS, NULL);\n    assert_non_null(key);\n    if (key != NULL) {\n        privatekey_free(key);\n        key = NULL;\n    }\n#endif\n\n    /* Test the automatic type discovery */\n    key = privatekey_from_file(session, LIBSSH_RSA_TESTKEY, 0, NULL);\n    assert_non_null(key);\n    if (key != NULL) {\n        privatekey_free(key);\n        key = NULL;\n    }\n\n#ifdef HAVE_DSA\n    key = privatekey_from_file(session, LIBSSH_DSA_TESTKEY, 0, NULL);\n    assert_non_null(key);\n    if (key != NULL) {\n        privatekey_free(key);\n        key = NULL;\n    }\n#endif\n}\n\n/**\n * @brief tests the privatekey_from_file function with passphrase\n */\nstatic void torture_privatekey_from_file_passphrase(void **state) {\n    ssh_session session = *state;\n    ssh_private_key key = NULL;\n\n    key = privatekey_from_file(session, LIBSSH_RSA_TESTKEY, SSH_KEYTYPE_RSA, TORTURE_TESTKEY_PASSWORD);\n    assert_non_null(key);\n    if (key != NULL) {\n        privatekey_free(key);\n        key = NULL;\n    }\n\n#ifdef HAVE_DSA\n    key = privatekey_from_file(session, LIBSSH_DSA_TESTKEY, SSH_KEYTYPE_DSS, TORTURE_TESTKEY_PASSWORD);\n    assert_non_null(key);\n    if (key != NULL) {\n        privatekey_free(key);\n        key = NULL;\n    }\n#endif\n\n    /* Test the automatic type discovery */\n    key = privatekey_from_file(session, LIBSSH_RSA_TESTKEY, 0, TORTURE_TESTKEY_PASSWORD);\n    assert_non_null(key);\n    if (key != NULL) {\n        privatekey_free(key);\n        key = NULL;\n    }\n\n#ifdef HAVE_DSA\n    key = privatekey_from_file(session, LIBSSH_DSA_TESTKEY, 0, TORTURE_TESTKEY_PASSWORD);\n    assert_non_null(key);\n    if (key != NULL) {\n        privatekey_free(key);\n        key = NULL;\n    }\n#endif\n}\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_pubkey_from_file,\n                                        setup_rsa_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pubkey_generate_from_privkey,\n                                        setup_rsa_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_privatekey_from_file,\n                                        setup_both_keys,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_privatekey_from_file_passphrase,\n                                        setup_both_keys_passphrase,\n                                        teardown),\n    };\n\n\n    ssh_init();\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, NULL, NULL);\n    ssh_finalize();\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/unittests/torture_knownhosts_parsing.c",
    "content": "#include \"config.h\"\n\n#include <sys/stat.h>\n\n#define LIBSSH_STATIC\n#include <libssh/priv.h>\n#include \"torture.h\"\n\n#include \"knownhosts.c\"\n\n#if (defined _WIN32) || (defined _WIN64)\n#ifndef S_IRWXO\n#define S_IRWXO 0\n#endif\n#ifndef S_IRWXG\n#define S_IRWXG 0\n#endif\n#endif\n\n#define LOCALHOST_RSA_LINE \"localhost,127.0.0.1 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDD7g+vV5cvxxGN0Ldmda4WZCPgRaxV1tV+1KRZoGUNUI61h0X4bmmGaAPRQBCz4G1d9bawqDqEqnpFWazrxBU5cQtISSjzuDJKovLGliky/ShTszee1Thszg3qVNk9gGOWj7jn/HDaOxRlp003Bp47MOdnMnK/oftllFDfY2fF5IRpE6sSIGtg2ZDtF95TV5/9W2oMOIAy8u/83tuibYlNPa1X/von5LgdaPLn6Bk16bQKIhAhlMtFZH8MBYEWe4ZtOGaSWKOsK9MM/RTMlwPi6PkfoHNl4MCMupjx+CdLXwbQEt9Ww+bBIaCui2VWBEiruVbIgJh0W2Tal0e2BzYZ What a Wurst!\"\n#define LOCALHOST_ECDSA_SHA1_NISTP256_LINE \"localhost ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBFWmI0n0Tn5+zR7pPGcKYszRbJ/T0T3QfzRBSMMiyebGKRY8tjkU5h2l/UMugzOrOyWqMGQDgQn+a0aMunhKMg0=\"\n#define LOCALHOST_DEFAULT_ED25519 \"localhost ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIA7M22fXD7OiS7kGMXP+OoIjCa+J+5sq8SgAZfIOmDgM\"\n#define LOCALHOST_PORT_ED25519 \"[localhost]:2222 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIA7M22fXD7OiS7kGMXP+OoIjCa+J+5sq8SgAZfIOmDgM\"\n#define LOCALHOST_PATTERN_ED25519 \"local* ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIA7M22fXD7OiS7kGMXP+OoIjCa+J+5sq8SgAZfIOmDgM\"\n#define LOCALHOST_HASHED_ED25519 \"|1|ayWjmTf9mYgj7PuQNVOa7Lqkj5s=|hkbEh8FN6IkLo6t6GQGuBwamgsM= ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIA7M22fXD7OiS7kGMXP+OoIjCa+J+5sq8SgAZfIOmDgM\"\n#define LOCALHOST_PORT_WILDCARD \"[localhost]:* ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIA7M22fXD7OiS7kGMXP+OoIjCa+J+5sq8SgAZfIOmDgM\"\n#define LOCALHOST_STANDARD_PORT \"[localhost]:22 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIA7M22fXD7OiS7kGMXP+OoIjCa+J+5sq8SgAZfIOmDgM\"\n\n#define TMP_FILE_NAME \"/tmp/known_hosts_XXXXXX\"\n\nconst char template[] = \"temp_dir_XXXXXX\";\n\nstatic int setup_knownhosts_file(void **state)\n{\n    char *tmp_file = NULL;\n    size_t nwritten;\n    FILE *fp = NULL;\n    int rc = 0;\n\n    tmp_file = torture_create_temp_file(TMP_FILE_NAME);\n    assert_non_null(tmp_file);\n\n    *state = tmp_file;\n\n    fp = fopen(tmp_file, \"w\");\n    assert_non_null(fp);\n\n    nwritten = fwrite(LOCALHOST_PATTERN_ED25519,\n                      sizeof(char),\n                      strlen(LOCALHOST_PATTERN_ED25519),\n                      fp);\n    if (nwritten != strlen(LOCALHOST_PATTERN_ED25519)) {\n        rc = -1;\n        goto close_fp;\n    }\n\n    nwritten = fwrite(\"\\n\", sizeof(char), 1, fp);\n    if (nwritten != 1) {\n        rc = -1;\n        goto close_fp;\n    }\n\n    nwritten = fwrite(LOCALHOST_RSA_LINE,\n                      sizeof(char),\n                      strlen(LOCALHOST_RSA_LINE),\n                      fp);\n    if (nwritten != strlen(LOCALHOST_RSA_LINE)) {\n        rc = -1;\n        goto close_fp;\n    }\n\nclose_fp:\n    fclose(fp);\n\n    return rc;\n}\n\nstatic int setup_knownhosts_file_duplicate(void **state)\n{\n    char *tmp_file = NULL;\n    size_t nwritten;\n    FILE *fp = NULL;\n    int rc = 0;\n\n    tmp_file = torture_create_temp_file(TMP_FILE_NAME);\n    assert_non_null(tmp_file);\n\n    *state = tmp_file;\n\n    fp = fopen(tmp_file, \"w\");\n    assert_non_null(fp);\n\n    /* ed25519 key */\n    nwritten = fwrite(LOCALHOST_PATTERN_ED25519,\n                      sizeof(char),\n                      strlen(LOCALHOST_PATTERN_ED25519),\n                      fp);\n    if (nwritten != strlen(LOCALHOST_PATTERN_ED25519)) {\n        rc = -1;\n        goto close_fp;\n    }\n\n    nwritten = fwrite(\"\\n\", sizeof(char), 1, fp);\n    if (nwritten != 1) {\n        rc = -1;\n        goto close_fp;\n    }\n\n    /* RSA key */\n    nwritten = fwrite(LOCALHOST_RSA_LINE,\n                      sizeof(char),\n                      strlen(LOCALHOST_RSA_LINE),\n                      fp);\n    if (nwritten != strlen(LOCALHOST_RSA_LINE)) {\n        rc = -1;\n        goto close_fp;\n    }\n\n    nwritten = fwrite(\"\\n\", sizeof(char), 1, fp);\n    if (nwritten != 1) {\n        rc = -1;\n        goto close_fp;\n    }\n\n    /* ed25519 key again */\n    nwritten = fwrite(LOCALHOST_PATTERN_ED25519,\n                      sizeof(char),\n                      strlen(LOCALHOST_PATTERN_ED25519),\n                      fp);\n    if (nwritten != strlen(LOCALHOST_PATTERN_ED25519)) {\n        rc = -1;\n        goto close_fp;\n    }\n\n    nwritten = fwrite(\"\\n\", sizeof(char), 1, fp);\n    if (nwritten != 1) {\n        rc = -1;\n        goto close_fp;\n    }\n\nclose_fp:\n    fclose(fp);\n\n    return rc;\n}\n\nstatic int teardown_knownhosts_file(void **state)\n{\n    char *tmp_file = *state;\n\n    if (tmp_file == NULL) {\n        return -1;\n    }\n\n    unlink(tmp_file);\n    SAFE_FREE(tmp_file);\n\n    return 0;\n}\n\nstatic void torture_knownhosts_parse_line_rsa(void **state) {\n    struct ssh_knownhosts_entry *entry = NULL;\n    int rc;\n\n    (void) state;\n\n    rc = ssh_known_hosts_parse_line(\"localhost\",\n                                    LOCALHOST_RSA_LINE,\n                                    &entry);\n    assert_int_equal(rc, SSH_OK);\n\n    assert_string_equal(entry->hostname, \"localhost\");\n    assert_non_null(entry->unparsed);\n    assert_non_null(entry->publickey);\n    assert_int_equal(ssh_key_type(entry->publickey), SSH_KEYTYPE_RSA);\n    assert_string_equal(entry->comment, \"What a Wurst!\");\n\n    SSH_KNOWNHOSTS_ENTRY_FREE(entry);\n\n    rc = ssh_known_hosts_parse_line(\"127.0.0.1\",\n                                    LOCALHOST_RSA_LINE,\n                                    &entry);\n    assert_int_equal(rc, SSH_OK);\n\n    assert_string_equal(entry->hostname, \"127.0.0.1\");\n    assert_non_null(entry->unparsed);\n    assert_non_null(entry->publickey);\n    assert_int_equal(ssh_key_type(entry->publickey), SSH_KEYTYPE_RSA);\n    assert_string_equal(entry->comment, \"What a Wurst!\");\n\n    SSH_KNOWNHOSTS_ENTRY_FREE(entry);\n}\n\nstatic void torture_knownhosts_parse_line_ecdsa(void **state) {\n    struct ssh_knownhosts_entry *entry = NULL;\n    int rc;\n\n    (void) state;\n\n    rc = ssh_known_hosts_parse_line(\"localhost\",\n                                    LOCALHOST_ECDSA_SHA1_NISTP256_LINE,\n                                    &entry);\n    assert_int_equal(rc, SSH_OK);\n\n    assert_string_equal(entry->hostname, \"localhost\");\n    assert_non_null(entry->unparsed);\n    assert_non_null(entry->publickey);\n    assert_int_equal(ssh_key_type(entry->publickey), SSH_KEYTYPE_ECDSA_P256);\n\n    SSH_KNOWNHOSTS_ENTRY_FREE(entry);\n}\n\nstatic void torture_knownhosts_parse_line_default_ed25519(void **state) {\n    struct ssh_knownhosts_entry *entry = NULL;\n    int rc;\n\n    (void) state;\n\n    rc = ssh_known_hosts_parse_line(\"localhost\",\n                                    LOCALHOST_DEFAULT_ED25519,\n                                    &entry);\n    assert_int_equal(rc, SSH_OK);\n\n    assert_string_equal(entry->hostname, \"localhost\");\n    assert_non_null(entry->unparsed);\n    assert_non_null(entry->publickey);\n    assert_int_equal(ssh_key_type(entry->publickey), SSH_KEYTYPE_ED25519);\n\n    SSH_KNOWNHOSTS_ENTRY_FREE(entry);\n}\n\nstatic void torture_knownhosts_parse_line_port_ed25519(void **state) {\n    struct ssh_knownhosts_entry *entry = NULL;\n    int rc;\n\n    (void) state;\n\n    rc = ssh_known_hosts_parse_line(\"[localhost]:2222\",\n                                    LOCALHOST_PORT_ED25519,\n                                    &entry);\n    assert_int_equal(rc, SSH_OK);\n\n    assert_string_equal(entry->hostname, \"[localhost]:2222\");\n    assert_non_null(entry->unparsed);\n    assert_non_null(entry->publickey);\n    assert_int_equal(ssh_key_type(entry->publickey), SSH_KEYTYPE_ED25519);\n\n    SSH_KNOWNHOSTS_ENTRY_FREE(entry);\n}\n\nstatic void torture_knownhosts_parse_line_port_wildcard(void **state)\n{\n    struct ssh_knownhosts_entry *entry = NULL;\n    int rc;\n\n    (void) state;\n\n    rc = ssh_known_hosts_parse_line(\"localhost\",\n                                    LOCALHOST_PORT_WILDCARD,\n                                    &entry);\n    assert_int_equal(rc, SSH_OK);\n\n    assert_string_equal(entry->hostname, \"localhost\");\n    assert_non_null(entry->unparsed);\n    assert_non_null(entry->publickey);\n    assert_int_equal(ssh_key_type(entry->publickey), SSH_KEYTYPE_ED25519);\n\n    SSH_KNOWNHOSTS_ENTRY_FREE(entry);\n}\n\nstatic void torture_knownhosts_parse_line_standard_port(void **state)\n{\n    struct ssh_knownhosts_entry *entry = NULL;\n    int rc;\n\n    (void) state;\n\n    rc = ssh_known_hosts_parse_line(\"localhost\",\n                                    LOCALHOST_STANDARD_PORT,\n                                    &entry);\n    assert_int_equal(rc, SSH_OK);\n\n    assert_string_equal(entry->hostname, \"localhost\");\n    assert_non_null(entry->unparsed);\n    assert_non_null(entry->publickey);\n    assert_int_equal(ssh_key_type(entry->publickey), SSH_KEYTYPE_ED25519);\n\n    SSH_KNOWNHOSTS_ENTRY_FREE(entry);\n}\n\nstatic void torture_knownhosts_parse_line_pattern_ed25519(void **state) {\n    struct ssh_knownhosts_entry *entry = NULL;\n    int rc;\n\n    (void) state;\n\n    rc = ssh_known_hosts_parse_line(\"localhost\",\n                                    LOCALHOST_PATTERN_ED25519,\n                                    &entry);\n    assert_int_equal(rc, SSH_OK);\n\n    assert_string_equal(entry->hostname, \"localhost\");\n    assert_non_null(entry->unparsed);\n    assert_non_null(entry->publickey);\n    assert_int_equal(ssh_key_type(entry->publickey), SSH_KEYTYPE_ED25519);\n\n    SSH_KNOWNHOSTS_ENTRY_FREE(entry);\n}\n\nstatic void torture_knownhosts_parse_line_hashed_ed25519(void **state) {\n    struct ssh_knownhosts_entry *entry = NULL;\n    int rc;\n\n    (void) state;\n\n    rc = ssh_known_hosts_parse_line(\"localhost\",\n                                    LOCALHOST_HASHED_ED25519,\n                                    &entry);\n    assert_int_equal(rc, SSH_OK);\n\n    assert_string_equal(entry->hostname, \"localhost\");\n    assert_non_null(entry->unparsed);\n    assert_non_null(entry->publickey);\n    assert_int_equal(ssh_key_type(entry->publickey), SSH_KEYTYPE_ED25519);\n\n    SSH_KNOWNHOSTS_ENTRY_FREE(entry);\n}\n\nstatic void torture_knownhosts_read_file(void **state)\n{\n    const char *knownhosts_file = *state;\n    struct ssh_list *entry_list = NULL;\n    struct ssh_iterator *it = NULL;\n    struct ssh_knownhosts_entry *entry = NULL;\n    enum ssh_keytypes_e type;\n    int rc;\n\n    rc = ssh_known_hosts_read_entries(\"localhost\",\n                                      knownhosts_file,\n                                      &entry_list);\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(entry_list);\n    it = ssh_list_get_iterator(entry_list);\n    assert_non_null(it);\n\n    /* First key in known hosts file is ED25519 */\n    entry = ssh_iterator_value(struct ssh_knownhosts_entry *, it);\n    assert_non_null(entry);\n\n    assert_string_equal(entry->hostname, \"localhost\");\n    type = ssh_key_type(entry->publickey);\n    assert_int_equal(type, SSH_KEYTYPE_ED25519);\n    assert_non_null(it->next);\n\n    it = it->next;\n\n    /* Second key in known hosts file is RSA */\n    entry = ssh_iterator_value(struct ssh_knownhosts_entry *, it);\n    assert_non_null(entry);\n\n    assert_string_equal(entry->hostname, \"localhost\");\n    type = ssh_key_type(entry->publickey);\n    assert_int_equal(type, SSH_KEYTYPE_RSA);\n    assert_null(it->next);\n\n    it = ssh_list_get_iterator(entry_list);\n    for (;it != NULL; it = it->next) {\n        entry = ssh_iterator_value(struct ssh_knownhosts_entry *, it);\n        SSH_KNOWNHOSTS_ENTRY_FREE(entry);\n    }\n    ssh_list_free(entry_list);\n}\n\nstatic void torture_knownhosts_get_algorithms_names(void **state)\n{\n    const char *knownhosts_file = *state;\n    ssh_session session;\n    const char *expect = \"ssh-ed25519,rsa-sha2-512,rsa-sha2-256,ssh-rsa\";\n    char *names = NULL;\n    bool process_config = false;\n\n    session = ssh_new();\n    assert_non_null(session);\n\n    /* This makes sure the global configuration file is not processed */\n    ssh_options_set(session, SSH_OPTIONS_PROCESS_CONFIG, &process_config);\n\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"localhost\");\n    ssh_options_set(session, SSH_OPTIONS_KNOWNHOSTS, knownhosts_file);\n\n    names = ssh_known_hosts_get_algorithms_names(session);\n    assert_non_null(names);\n    assert_string_equal(names, expect);\n\n    SAFE_FREE(names);\n    ssh_free(session);\n}\n\nstatic void torture_knownhosts_algorithms_wanted(void **state)\n{\n    const char *knownhosts_file = *state;\n    char *algo_list = NULL;\n    ssh_session session;\n    bool process_config = false;\n    const char *wanted = \"ecdsa-sha2-nistp384,ecdsa-sha2-nistp256,\"\n                         \"rsa-sha2-256,ecdsa-sha2-nistp521\";\n    const char *expect = \"rsa-sha2-256,ecdsa-sha2-nistp384,\"\n                         \"ecdsa-sha2-nistp256,ecdsa-sha2-nistp521\";\n    int verbose = 4;\n\n    session = ssh_new();\n    assert_non_null(session);\n\n    ssh_options_set(session, SSH_OPTIONS_LOG_VERBOSITY, &verbose);\n\n    /* This makes sure the global configuration file is not processed */\n    ssh_options_set(session, SSH_OPTIONS_PROCESS_CONFIG, &process_config);\n\n    /* Set the wanted list of hostkeys, ordered by preference */\n    ssh_options_set(session, SSH_OPTIONS_HOSTKEYS, wanted);\n\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"localhost\");\n    ssh_options_set(session, SSH_OPTIONS_KNOWNHOSTS, knownhosts_file);\n\n    algo_list = ssh_client_select_hostkeys(session);\n    assert_non_null(algo_list);\n    assert_string_equal(algo_list, expect);\n    free(algo_list);\n\n    ssh_free(session);\n}\n\nstatic void torture_knownhosts_algorithms_negative(UNUSED_PARAM(void **state))\n{\n    const char *wanted = NULL;\n    const char *expect = NULL;\n\n    char *algo_list = NULL;\n\n    char *cwd = NULL;\n    char *tmp_dir = NULL;\n\n    bool process_config = false;\n    int verbose = 4;\n    int rc = 0;\n\n    ssh_session session;\n    /* Create temporary directory */\n    cwd = torture_get_current_working_dir();\n    assert_non_null(cwd);\n\n    tmp_dir = torture_make_temp_dir(template);\n    assert_non_null(tmp_dir);\n\n    rc = torture_change_dir(tmp_dir);\n    assert_int_equal(rc, 0);\n\n    session = ssh_new();\n    assert_non_null(session);\n\n    ssh_options_set(session, SSH_OPTIONS_LOG_VERBOSITY, &verbose);\n    ssh_options_set(session, SSH_OPTIONS_PROCESS_CONFIG, &process_config);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"localhost\");\n\n    /* Test with unknown key type in known_hosts */\n    wanted = \"rsa-sha2-256\";\n    ssh_options_set(session, SSH_OPTIONS_HOSTKEYS, wanted);\n    torture_write_file(\"unknown_key_type\", \"localhost unknown AAAABBBBCCCC\");\n    ssh_options_set(session, SSH_OPTIONS_KNOWNHOSTS, \"unknown_key_type\");\n    algo_list = ssh_client_select_hostkeys(session);\n    assert_non_null(algo_list);\n    assert_string_equal(algo_list, wanted);\n    SAFE_FREE(algo_list);\n\n    /* Test with unsupported, but existing types */\n    wanted = \"rsa-sha2-256-cert-v01@openssh.com,\"\n             \"rsa-sha2-512-cert-v01@openssh.com\";\n    ssh_options_set(session, SSH_OPTIONS_HOSTKEYS, wanted);\n    algo_list = ssh_client_select_hostkeys(session);\n    assert_null(algo_list);\n\n    /* In FIPS mode, test filtering keys not allowed */\n    if (ssh_fips_mode()) {\n        wanted = \"ssh-ed25519,rsa-sha2-256,ssh-rsa\";\n        expect = \"rsa-sha2-256\";\n        ssh_options_set(session, SSH_OPTIONS_HOSTKEYS, wanted);\n        torture_write_file(\"no_fips\", LOCALHOST_DEFAULT_ED25519);\n        ssh_options_set(session, SSH_OPTIONS_KNOWNHOSTS, \"no_fips\");\n        algo_list = ssh_client_select_hostkeys(session);\n        assert_non_null(algo_list);\n        assert_string_equal(algo_list, expect);\n        SAFE_FREE(algo_list);\n    }\n\n    ssh_free(session);\n\n    /* Teardown */\n    rc = torture_change_dir(cwd);\n    assert_int_equal(rc, 0);\n\n    rc = torture_rmdirs(tmp_dir);\n    assert_int_equal(rc, 0);\n\n    SAFE_FREE(tmp_dir);\n    SAFE_FREE(cwd);\n}\n\n#ifndef _WIN32 /* There is no /dev/null on Windows */\nstatic void torture_knownhosts_host_exists(void **state)\n{\n    const char *knownhosts_file = *state;\n    enum ssh_known_hosts_e found;\n    ssh_session session;\n\n    session = ssh_new();\n    assert_non_null(session);\n\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"localhost\");\n    ssh_options_set(session, SSH_OPTIONS_KNOWNHOSTS, knownhosts_file);\n\n    /* This makes sure the system's known_hosts are not used */\n    ssh_options_set(session, SSH_OPTIONS_GLOBAL_KNOWNHOSTS, \"/dev/null\");\n    found = ssh_session_has_known_hosts_entry(session);\n    assert_int_equal(found, SSH_KNOWN_HOSTS_OK);\n\n    /* This makes sure the check will not fail when the system's known_hosts is\n     * not accessible*/\n    ssh_options_set(session, SSH_OPTIONS_GLOBAL_KNOWNHOSTS, \"./unaccessible\");\n    found = ssh_session_has_known_hosts_entry(session);\n    assert_int_equal(found, SSH_KNOWN_HOSTS_OK);\n\n    /* This makes sure the check will fail for an unknown host */\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"wurstbrot\");\n    found = ssh_session_has_known_hosts_entry(session);\n    assert_int_equal(found, SSH_KNOWN_HOSTS_UNKNOWN);\n\n    ssh_free(session);\n}\n\nstatic void torture_knownhosts_host_exists_global(void **state)\n{\n    const char *knownhosts_file = *state;\n    enum ssh_known_hosts_e found;\n    ssh_session session;\n\n    session = ssh_new();\n    assert_non_null(session);\n\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"localhost\");\n    ssh_options_set(session, SSH_OPTIONS_GLOBAL_KNOWNHOSTS, knownhosts_file);\n\n    /* This makes sure the user's known_hosts are not used */\n    ssh_options_set(session, SSH_OPTIONS_KNOWNHOSTS, \"/dev/null\");\n    found = ssh_session_has_known_hosts_entry(session);\n    assert_int_equal(found, SSH_KNOWN_HOSTS_OK);\n\n    /* This makes sure the check will not fail when the user's known_hosts is\n     * not accessible*/\n    ssh_options_set(session, SSH_OPTIONS_KNOWNHOSTS, \"./unaccessible\");\n    found = ssh_session_has_known_hosts_entry(session);\n    assert_int_equal(found, SSH_KNOWN_HOSTS_OK);\n\n    /* This makes sure the check will fail for an unknown host */\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"wurstbrot\");\n    found = ssh_session_has_known_hosts_entry(session);\n    assert_int_equal(found, SSH_KNOWN_HOSTS_UNKNOWN);\n\n    ssh_free(session);\n}\n\nstatic void torture_knownhosts_algorithms(void **state)\n{\n    const char *knownhosts_file = *state;\n    char *algo_list = NULL;\n    ssh_session session;\n    bool process_config = false;\n    const char *expect = \"ssh-ed25519,rsa-sha2-512,rsa-sha2-256,ssh-rsa,\"\n                         \"ecdsa-sha2-nistp521,ecdsa-sha2-nistp384,\"\n                         \"ecdsa-sha2-nistp256\"\n#ifdef HAVE_DSA\n                         \",ssh-dss\"\n#endif\n    ;\n    const char *expect_fips = \"rsa-sha2-512,rsa-sha2-256,ecdsa-sha2-nistp521,\"\n                              \"ecdsa-sha2-nistp384,ecdsa-sha2-nistp256\";\n\n    session = ssh_new();\n    assert_non_null(session);\n\n    /* This makes sure the global configuration file is not processed */\n    ssh_options_set(session, SSH_OPTIONS_PROCESS_CONFIG, &process_config);\n\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"localhost\");\n    ssh_options_set(session, SSH_OPTIONS_KNOWNHOSTS, knownhosts_file);\n    /* This makes sure the system's known_hosts are not used */\n    ssh_options_set(session, SSH_OPTIONS_GLOBAL_KNOWNHOSTS, \"/dev/null\");\n\n    algo_list = ssh_client_select_hostkeys(session);\n    assert_non_null(algo_list);\n    if (ssh_fips_mode()) {\n        assert_string_equal(algo_list, expect_fips);\n    } else {\n        assert_string_equal(algo_list, expect);\n    }\n    free(algo_list);\n\n    ssh_free(session);\n}\n\nstatic void torture_knownhosts_algorithms_global(void **state)\n{\n    const char *knownhosts_file = *state;\n    char *algo_list = NULL;\n    ssh_session session;\n    bool process_config = false;\n    const char *expect = \"ssh-ed25519,rsa-sha2-512,rsa-sha2-256,ssh-rsa,\"\n                         \"ecdsa-sha2-nistp521,ecdsa-sha2-nistp384,\"\n                         \"ecdsa-sha2-nistp256\"\n#ifdef HAVE_DSA\n                         \",ssh-dss\"\n#endif\n    ;\n    const char *expect_fips = \"rsa-sha2-512,rsa-sha2-256,ecdsa-sha2-nistp521,\"\n                              \"ecdsa-sha2-nistp384,ecdsa-sha2-nistp256\";\n\n    session = ssh_new();\n    assert_non_null(session);\n\n    /* This makes sure the global configuration file is not processed */\n    ssh_options_set(session, SSH_OPTIONS_PROCESS_CONFIG, &process_config);\n\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"localhost\");\n    /* This makes sure the current-user's known hosts are not used */\n    ssh_options_set(session, SSH_OPTIONS_KNOWNHOSTS, \"/dev/null\");\n    ssh_options_set(session, SSH_OPTIONS_GLOBAL_KNOWNHOSTS, knownhosts_file);\n\n    algo_list = ssh_client_select_hostkeys(session);\n    assert_non_null(algo_list);\n    if (ssh_fips_mode()) {\n        assert_string_equal(algo_list, expect_fips);\n    } else {\n        assert_string_equal(algo_list, expect);\n    }\n    free(algo_list);\n\n    ssh_free(session);\n}\n\n#endif /* _WIN32 There is no /dev/null on Windows */\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test(torture_knownhosts_parse_line_rsa),\n        cmocka_unit_test(torture_knownhosts_parse_line_ecdsa),\n        cmocka_unit_test(torture_knownhosts_parse_line_default_ed25519),\n        cmocka_unit_test(torture_knownhosts_parse_line_port_ed25519),\n        cmocka_unit_test(torture_knownhosts_parse_line_port_wildcard),\n        cmocka_unit_test(torture_knownhosts_parse_line_standard_port),\n        cmocka_unit_test(torture_knownhosts_parse_line_pattern_ed25519),\n        cmocka_unit_test(torture_knownhosts_parse_line_hashed_ed25519),\n        cmocka_unit_test_setup_teardown(torture_knownhosts_read_file,\n                                        setup_knownhosts_file,\n                                        teardown_knownhosts_file),\n        cmocka_unit_test_setup_teardown(torture_knownhosts_read_file,\n                                        setup_knownhosts_file_duplicate,\n                                        teardown_knownhosts_file),\n        cmocka_unit_test_setup_teardown(torture_knownhosts_get_algorithms_names,\n                                        setup_knownhosts_file,\n                                        teardown_knownhosts_file),\n        cmocka_unit_test_setup_teardown(torture_knownhosts_algorithms_wanted,\n                                        setup_knownhosts_file,\n                                        teardown_knownhosts_file),\n        cmocka_unit_test(torture_knownhosts_algorithms_negative),\n#ifndef _WIN32\n        cmocka_unit_test_setup_teardown(torture_knownhosts_host_exists,\n                                        setup_knownhosts_file,\n                                        teardown_knownhosts_file),\n        cmocka_unit_test_setup_teardown(torture_knownhosts_host_exists_global,\n                                        setup_knownhosts_file,\n                                        teardown_knownhosts_file),\n        cmocka_unit_test_setup_teardown(torture_knownhosts_algorithms,\n                                        setup_knownhosts_file,\n                                        teardown_knownhosts_file),\n        cmocka_unit_test_setup_teardown(torture_knownhosts_algorithms_global,\n                                        setup_knownhosts_file,\n                                        teardown_knownhosts_file),\n#endif\n    };\n\n    ssh_init();\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, NULL, NULL);\n    ssh_finalize();\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/unittests/torture_list.c",
    "content": "#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include \"torture.h\"\n#include \"error.c\"\n#include \"misc.c\"\n\nstatic void torture_ssh_list_new(void **state) {\n    struct ssh_list *xlist;\n\n    (void) state;\n\n    xlist = ssh_list_new();\n\n    assert_non_null(xlist);\n    assert_null(xlist->root);\n    assert_null(xlist->end);\n\n    assert_int_equal(ssh_list_count(xlist), 0);\n\n    ssh_list_free(xlist);\n}\n\nstatic void torture_ssh_list_append(void **state) {\n    struct ssh_list *xlist;\n    int rc;\n\n    (void) state;\n\n    xlist = ssh_list_new();\n    assert_non_null(xlist);\n\n    rc = ssh_list_append(xlist, \"item1\");\n    assert_true(rc == 0);\n    assert_non_null(xlist->root);\n    assert_non_null(xlist->root->data);\n    assert_non_null(xlist->end);\n    assert_non_null(xlist->end->data);\n    assert_string_equal((const char *) xlist->root->data, \"item1\");\n    assert_string_equal((const char *) xlist->end->data, \"item1\");\n\n    rc = ssh_list_append(xlist, \"item2\");\n    assert_true(rc == 0);\n    assert_non_null(xlist->root);\n    assert_non_null(xlist->root->data);\n    assert_non_null(xlist->end);\n    assert_non_null(xlist->end->data);\n    assert_string_equal((const char *) xlist->root->data, \"item1\");\n    assert_string_equal((const char *) xlist->end->data, \"item2\");\n\n    rc = ssh_list_append(xlist, \"item3\");\n    assert_true(rc == 0);\n    assert_non_null(xlist->root);\n    assert_non_null(xlist->root->data);\n    assert_non_null(xlist->root->next);\n    assert_non_null(xlist->root->next->data);\n    assert_non_null(xlist->root->next->next);\n    assert_non_null(xlist->root->next->next->data);\n    assert_non_null(xlist->end);\n    assert_non_null(xlist->end->data);\n    assert_string_equal((const char *) xlist->root->data, \"item1\");\n    assert_string_equal((const char *) xlist->root->next->data, \"item2\");\n    assert_string_equal((const char *) xlist->root->next->next->data, \"item3\");\n    assert_string_equal((const char *) xlist->end->data, \"item3\");\n\n    assert_int_equal(ssh_list_count(xlist), 3);\n\n    ssh_list_free(xlist);\n}\n\nstatic void torture_ssh_list_prepend(void **state) {\n    struct ssh_list *xlist;\n    int rc;\n\n    (void) state;\n\n    xlist = ssh_list_new();\n    assert_non_null(xlist);\n\n    rc = ssh_list_prepend(xlist, \"item1\");\n    assert_true(rc == 0);\n    assert_non_null(xlist->root);\n    assert_non_null(xlist->root->data);\n    assert_non_null(xlist->end);\n    assert_non_null(xlist->end->data);\n    assert_string_equal((const char *) xlist->root->data, \"item1\");\n    assert_string_equal((const char *) xlist->end->data, \"item1\");\n\n    rc = ssh_list_append(xlist, \"item2\");\n    assert_true(rc == 0);\n    assert_non_null(xlist->root);\n    assert_non_null(xlist->root->data);\n    assert_non_null(xlist->end);\n    assert_non_null(xlist->end->data);\n    assert_string_equal((const char *) xlist->root->data, \"item1\");\n    assert_string_equal((const char *) xlist->end->data, \"item2\");\n\n    rc = ssh_list_prepend(xlist, \"item3\");\n    assert_true(rc == 0);\n    assert_non_null(xlist->root);\n    assert_non_null(xlist->root->data);\n    assert_non_null(xlist->root->next);\n    assert_non_null(xlist->root->next->data);\n    assert_non_null(xlist->root->next->next);\n    assert_non_null(xlist->end);\n    assert_non_null(xlist->end->data);\n    assert_string_equal((const char *) xlist->root->data, \"item3\");\n    assert_string_equal((const char *) xlist->root->next->data, \"item1\");\n    assert_string_equal((const char *) xlist->root->next->next->data, \"item2\");\n    assert_string_equal((const char *) xlist->end->data, \"item2\");\n\n    assert_int_equal(ssh_list_count(xlist), 3);\n\n    ssh_list_free(xlist);\n}\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test(torture_ssh_list_new),\n        cmocka_unit_test(torture_ssh_list_append),\n        cmocka_unit_test(torture_ssh_list_prepend),\n    };\n\n    ssh_init();\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, NULL, NULL);\n    ssh_finalize();\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/unittests/torture_misc.c",
    "content": "#include \"config.h\"\n\n#ifdef HAVE_UNISTD_H\n#include <unistd.h>\n#endif\n#include <sys/types.h>\n#ifndef _WIN32\n\n#define _POSIX_PTHREAD_SEMANTICS\n#include <pwd.h>\n#endif\n\n#define LIBSSH_STATIC\n#include <libssh/priv.h>\n\n#include \"torture.h\"\n#include \"misc.c\"\n#include \"error.c\"\n\n#define TORTURE_TEST_DIR \"/usr/local/bin/truc/much/..\"\n\nconst char template[] = \"temp_dir_XXXXXX\";\n\nstatic int setup(void **state)\n{\n    ssh_session session = ssh_new();\n    *state = session;\n\n    return 0;\n}\n\nstatic int teardown(void **state)\n{\n    ssh_free(*state);\n\n    return 0;\n}\n\nstatic void torture_get_user_home_dir(void **state) {\n#ifndef _WIN32\n    struct passwd *pwd = getpwuid(getuid());\n#endif /* _WIN32 */\n    char *user;\n\n    (void) state;\n\n    user = ssh_get_user_home_dir();\n    assert_non_null(user);\n#ifndef _WIN32\n    assert_string_equal(user, pwd->pw_dir);\n#endif /* _WIN32 */\n\n    SAFE_FREE(user);\n}\n\nstatic void torture_basename(void **state) {\n    char *path;\n\n    (void) state;\n\n    path=ssh_basename(TORTURE_TEST_DIR \"/test\");\n    assert_non_null(path);\n    assert_string_equal(path, \"test\");\n    SAFE_FREE(path);\n    path=ssh_basename(TORTURE_TEST_DIR \"/test/\");\n    assert_non_null(path);\n    assert_string_equal(path, \"test\");\n    SAFE_FREE(path);\n}\n\nstatic void torture_dirname(void **state) {\n    char *path;\n\n    (void) state;\n\n    path=ssh_dirname(TORTURE_TEST_DIR \"/test\");\n    assert_non_null(path);\n    assert_string_equal(path, TORTURE_TEST_DIR );\n    SAFE_FREE(path);\n    path=ssh_dirname(TORTURE_TEST_DIR \"/test/\");\n    assert_non_null(path);\n    assert_string_equal(path, TORTURE_TEST_DIR);\n    SAFE_FREE(path);\n}\n\nstatic void torture_ntohll(void **state) {\n    uint64_t value = 0x0123456789abcdef;\n    uint32_t sample = 1;\n    unsigned char *ptr = (unsigned char *) &sample;\n    uint64_t check;\n\n    (void) state;\n\n    if (ptr[0] == 1){\n        /* we're in little endian */\n        check = 0xefcdab8967452301;\n    } else {\n        /* big endian */\n        check = value;\n    }\n    value = ntohll(value);\n    assert_true(value == check);\n}\n\n#ifdef _WIN32\n\nstatic void torture_path_expand_tilde_win(void **state) {\n    char *d;\n\n    (void) state;\n\n    d = ssh_path_expand_tilde(\"~\\\\.ssh\");\n    assert_non_null(d);\n    print_message(\"Expanded path: %s\\n\", d);\n    free(d);\n\n    d = ssh_path_expand_tilde(\"/guru/meditation\");\n    assert_string_equal(d, \"/guru/meditation\");\n    free(d);\n}\n\n#else /* _WIN32 */\n\nstatic void torture_path_expand_tilde_unix(void **state) {\n    char h[256];\n    char *d;\n    char *user;\n    char *home;\n\n    (void) state;\n\n    user = getenv(\"USER\");\n    if (user == NULL){\n        user = getenv(\"LOGNAME\");\n    }\n    /* in certain CIs there no such variables */\n    if (!user){\n        struct passwd *pw = getpwuid(getuid());\n        if (pw){\n            user = pw->pw_name;\n        }\n    }\n\n    home = getenv(\"HOME\");\n    assert_non_null(home);\n    snprintf(h, 256 - 1, \"%s/.ssh\", home);\n\n    d = ssh_path_expand_tilde(\"~/.ssh\");\n    assert_non_null(d);\n    assert_string_equal(d, h);\n    free(d);\n\n    d = ssh_path_expand_tilde(\"/guru/meditation\");\n    assert_non_null(d);\n    assert_string_equal(d, \"/guru/meditation\");\n    free(d);\n\n    snprintf(h, 256 - 1, \"~%s/.ssh\", user);\n    d = ssh_path_expand_tilde(h);\n    assert_non_null(d);\n\n    snprintf(h, 256 - 1, \"%s/.ssh\", home);\n    assert_string_equal(d, h);\n    free(d);\n}\n\n#endif /* _WIN32 */\n\nstatic void torture_path_expand_escape(void **state) {\n    ssh_session session = *state;\n    const char *s = \"%d/%h/by/%r\";\n    char *e;\n\n    session->opts.sshdir = strdup(\"guru\");\n    session->opts.host = strdup(\"meditation\");\n    session->opts.username = strdup(\"root\");\n\n    e = ssh_path_expand_escape(session, s);\n    assert_non_null(e);\n    assert_string_equal(e, \"guru/meditation/by/root\");\n    free(e);\n}\n\nstatic void torture_path_expand_known_hosts(void **state) {\n    ssh_session session = *state;\n    char *tmp;\n\n    session->opts.sshdir = strdup(\"/home/guru/.ssh\");\n\n    tmp = ssh_path_expand_escape(session, \"%d/known_hosts\");\n    assert_non_null(tmp);\n    assert_string_equal(tmp, \"/home/guru/.ssh/known_hosts\");\n    free(tmp);\n}\n\nstatic void torture_path_expand_percent(void **state) {\n    ssh_session session = *state;\n    char *tmp;\n\n    session->opts.sshdir = strdup(\"/home/guru/.ssh\");\n\n    tmp = ssh_path_expand_escape(session, \"%d/config%%1\");\n    assert_non_null(tmp);\n    assert_string_equal(tmp, \"/home/guru/.ssh/config%1\");\n    free(tmp);\n}\n\nstatic void torture_timeout_elapsed(void **state){\n    struct ssh_timestamp ts;\n    (void) state;\n    ssh_timestamp_init(&ts);\n    usleep(50000);\n    assert_true(ssh_timeout_elapsed(&ts,25));\n    assert_false(ssh_timeout_elapsed(&ts,30000));\n    assert_false(ssh_timeout_elapsed(&ts,75));\n    assert_true(ssh_timeout_elapsed(&ts,0));\n    assert_false(ssh_timeout_elapsed(&ts,-1));\n}\n\nstatic void torture_timeout_update(void **state){\n    struct ssh_timestamp ts;\n    (void) state;\n    ssh_timestamp_init(&ts);\n    usleep(50000);\n    assert_int_equal(ssh_timeout_update(&ts,25), 0);\n    assert_in_range(ssh_timeout_update(&ts,30000),29000,29960);\n    assert_in_range(ssh_timeout_update(&ts,75),1,40);\n    assert_int_equal(ssh_timeout_update(&ts,0),0);\n    assert_int_equal(ssh_timeout_update(&ts,-1),-1);\n}\n\nstatic void torture_ssh_analyze_banner(void **state) {\n    int rc = 0;\n    ssh_session session = NULL;\n    (void) state;\n\n#define reset_banner_test() \\\n    do {                           \\\n        rc = 0;                    \\\n        ssh_free(session);         \\\n        session = ssh_new();       \\\n        assert_non_null(session);  \\\n    } while (0)\n\n#define assert_banner_rejected(is_server) \\\n    do {                                                            \\\n        rc = ssh_analyze_banner(session, is_server);  \\\n        assert_int_not_equal(0, rc);                                \\\n    } while (0);\n\n#define assert_client_banner_rejected(banner) \\\n    do {                                         \\\n        reset_banner_test();                     \\\n        session->clientbanner = strdup(banner);  \\\n        assert_non_null(session->clientbanner);  \\\n        assert_banner_rejected(1 /*server*/);    \\\n        SAFE_FREE(session->clientbanner);        \\\n    } while (0)\n\n#define assert_server_banner_rejected(banner) \\\n    do {                                         \\\n        reset_banner_test();                     \\\n        session->serverbanner = strdup(banner);  \\\n        assert_non_null(session->serverbanner);  \\\n        assert_banner_rejected(0 /*client*/);    \\\n        SAFE_FREE(session->serverbanner);        \\\n    } while (0)\n\n#define assert_banner_accepted(is_server) \\\n    do {                                                            \\\n        rc = ssh_analyze_banner(session, is_server);  \\\n        assert_int_equal(0, rc);                                    \\\n    } while (0)\n\n#define assert_client_banner_accepted(banner)          \\\n    do {                                               \\\n        reset_banner_test();                           \\\n        session->clientbanner = strdup(banner);        \\\n        assert_non_null(session->clientbanner);        \\\n        assert_banner_accepted(1 /*server*/);          \\\n        SAFE_FREE(session->clientbanner);              \\\n    } while (0)\n\n#define assert_server_banner_accepted(banner)          \\\n    do {                                               \\\n        reset_banner_test();                           \\\n        session->serverbanner = strdup(banner);        \\\n        assert_non_null(session->serverbanner);        \\\n        assert_banner_accepted(0 /*client*/);          \\\n        SAFE_FREE(session->serverbanner);              \\\n    } while (0)\n\n    /* no banner is set */\n    reset_banner_test();\n    assert_banner_rejected(0 /*client*/);\n    reset_banner_test();\n    assert_banner_rejected(1 /*server*/);\n\n    /* banner is too short */\n    assert_client_banner_rejected(\"abc\");\n    assert_server_banner_rejected(\"abc\");\n\n    /* banner doesn't start \"SSH-\" */\n    assert_client_banner_rejected(\"abc-2.0\");\n    assert_server_banner_rejected(\"abc-2.0\");\n\n    /* SSH v1 */\n    assert_client_banner_rejected(\"SSH-1.0\");\n    assert_server_banner_rejected(\"SSH-1.0\");\n\n    /* SSH v1.9 gets counted as both v1 and v2 */\n    assert_client_banner_accepted(\"SSH-1.9\");\n    assert_server_banner_accepted(\"SSH-1.9\");\n\n    /* SSH v2 */\n    assert_client_banner_accepted(\"SSH-2.0\");\n    assert_server_banner_accepted(\"SSH-2.0\");\n\n    /* OpenSSH banners: too short to extract major and minor versions */\n    assert_client_banner_accepted(\"SSH-2.0-OpenSSH\");\n    assert_int_equal(0, session->openssh);\n    assert_server_banner_accepted(\"SSH-2.0-OpenSSH\");\n    assert_int_equal(0, session->openssh);\n\n    /* OpenSSH banners: big enough to extract major and minor versions */\n    assert_client_banner_accepted(\"SSH-2.0-OpenSSH_5.9p1\");\n    assert_int_equal(SSH_VERSION_INT(5, 9, 0), session->openssh);\n    assert_server_banner_accepted(\"SSH-2.0-OpenSSH_5.9p1\");\n    assert_int_equal(SSH_VERSION_INT(5, 9, 0), session->openssh);\n\n    assert_client_banner_accepted(\"SSH-2.0-OpenSSH_1.99\");\n    assert_int_equal(SSH_VERSION_INT(1, 99, 0), session->openssh);\n    assert_server_banner_accepted(\"SSH-2.0-OpenSSH_1.99\");\n    assert_int_equal(SSH_VERSION_INT(1, 99, 0), session->openssh);\n\n    /* OpenSSH banners: major, minor version limits result in zero */\n    assert_client_banner_accepted(\"SSH-2.0-OpenSSH_0.99p1\");\n    assert_int_equal(0, session->openssh);\n    assert_server_banner_accepted(\"SSH-2.0-OpenSSH_0.99p1\");\n    assert_int_equal(0, session->openssh);\n    assert_client_banner_accepted(\"SSH-2.0-OpenSSH_1.101p1\");\n    assert_int_equal(0, session->openssh);\n    assert_server_banner_accepted(\"SSH-2.0-OpenSSH_1.101p1\");\n    assert_int_equal(0, session->openssh);\n\n    /* OpenSSH banners: bogus major results in zero */\n    assert_client_banner_accepted(\"SSH-2.0-OpenSSH_X.9p1\");\n    assert_int_equal(0, session->openssh);\n    assert_server_banner_accepted(\"SSH-2.0-OpenSSH_X.9p1\");\n    assert_int_equal(0, session->openssh);\n\n    /* OpenSSH banners: bogus minor results in zero */\n    assert_server_banner_accepted(\"SSH-2.0-OpenSSH_5.Yp1\");\n    assert_int_equal(0, session->openssh);\n    assert_client_banner_accepted(\"SSH-2.0-OpenSSH_5.Yp1\");\n    assert_int_equal(0, session->openssh);\n\n    /* OpenSSH banners: ssh-keyscan(1) */\n    assert_client_banner_accepted(\"SSH-2.0-OpenSSH-keyscan\");\n    assert_int_equal(0, session->openssh);\n    assert_server_banner_accepted(\"SSH-2.0-OpenSSH-keyscan\");\n    assert_int_equal(0, session->openssh);\n\n    ssh_free(session);\n}\n\nstatic void torture_ssh_dir_writeable(UNUSED_PARAM(void **state))\n{\n    char *tmp_dir = NULL;\n    int rc = 0;\n    FILE *file = NULL;\n    char buffer[256];\n\n    tmp_dir = torture_make_temp_dir(template);\n    assert_non_null(tmp_dir);\n\n    rc = ssh_dir_writeable(tmp_dir);\n    assert_int_equal(rc, 1);\n\n    /* Create a file */\n    snprintf(buffer, sizeof(buffer), \"%s/a\", tmp_dir);\n\n    file = fopen(buffer, \"w\");\n    assert_non_null(file);\n\n    fprintf(file, \"Hello world!\\n\");\n    fclose(file);\n\n    /* Negative test for checking a normal file */\n    rc = ssh_dir_writeable(buffer);\n    assert_int_equal(rc, 0);\n\n    /* Negative test for non existent file */\n    snprintf(buffer, sizeof(buffer), \"%s/b\", tmp_dir);\n    rc = ssh_dir_writeable(buffer);\n    assert_int_equal(rc, 0);\n\n#ifndef _WIN32\n    /* Negative test for directory without write permission */\n    rc = ssh_mkdir(buffer, 0400);\n    assert_return_code(rc, errno);\n\n    rc = ssh_dir_writeable(buffer);\n    assert_int_equal(rc, 0);\n#endif\n\n    torture_rmdirs(tmp_dir);\n\n    SAFE_FREE(tmp_dir);\n}\n\nstatic void torture_ssh_mkdirs(UNUSED_PARAM(void **state))\n{\n    char *tmp_dir = NULL;\n    char *cwd = NULL;\n    char buffer[256];\n\n    ssize_t count = 0;\n\n    int rc;\n\n    /* Get current working directory */\n    cwd = torture_get_current_working_dir();\n    assert_non_null(cwd);\n\n    /* Create a base disposable directory */\n    tmp_dir = torture_make_temp_dir(template);\n    assert_non_null(tmp_dir);\n\n    /* Create a single directory */\n    count = snprintf(buffer, sizeof(buffer), \"%s/a\", tmp_dir);\n    assert_return_code(count, errno);\n\n    rc = ssh_mkdirs(buffer, 0700);\n    assert_return_code(rc, errno);\n\n    rc = ssh_dir_writeable(buffer);\n    assert_int_equal(rc, 1);\n\n    /* Create directories recursively */\n    count = snprintf(buffer, sizeof(buffer), \"%s/b/c/d\", tmp_dir);\n    assert_return_code(count, errno);\n\n    rc = ssh_mkdirs(buffer, 0700);\n    assert_return_code(rc, errno);\n\n    rc = ssh_dir_writeable(buffer);\n    assert_int_equal(rc, 1);\n\n    /* Change directory */\n    rc = torture_change_dir(tmp_dir);\n    assert_return_code(rc, errno);\n\n    /* Create single local directory */\n    rc = ssh_mkdirs(\"e\", 0700);\n    assert_return_code(rc, errno);\n\n    rc = ssh_dir_writeable(\"e\");\n    assert_int_equal(rc, 1);\n\n    /* Create local directories recursively */\n    rc = ssh_mkdirs(\"f/g/h\", 0700);\n    assert_return_code(rc, errno);\n\n    rc = ssh_dir_writeable(\"f/g/h\");\n    assert_int_equal(rc, 1);\n\n    /* Negative test for creating \".\" directory */\n    rc = ssh_mkdirs(\".\", 0700);\n    assert_int_equal(rc, -1);\n    assert_int_equal(errno, EINVAL);\n\n    /* Negative test for creating \"/\" directory */\n    rc = ssh_mkdirs(\"/\", 0700);\n    assert_int_equal(rc, -1);\n    assert_int_equal(errno, EINVAL);\n\n    /* Negative test for creating \"\" directory */\n    rc = ssh_mkdirs(\"\", 0700);\n    assert_int_equal(rc, -1);\n    assert_int_equal(errno, EINVAL);\n\n    /* Negative test for creating NULL directory */\n    rc = ssh_mkdirs(NULL, 0700);\n    assert_int_equal(rc, -1);\n    assert_int_equal(errno, EINVAL);\n\n    /* Negative test for creating existing directory */\n    rc = ssh_mkdirs(\"a\", 0700);\n    assert_int_equal(rc, -1);\n    assert_int_equal(errno, EEXIST);\n\n    /* Return to original directory */\n    rc = torture_change_dir(cwd);\n    assert_return_code(rc, errno);\n\n    /* Cleanup */\n    torture_rmdirs(tmp_dir);\n\n    SAFE_FREE(tmp_dir);\n    SAFE_FREE(cwd);\n}\n\nstatic void torture_ssh_quote_file_name(UNUSED_PARAM(void **state))\n{\n    char buffer[2048];\n    int rc;\n\n    /* Only ordinary chars */\n    rc = ssh_quote_file_name(\"a b\", buffer, 2048);\n    assert_int_equal(rc, 5);\n    assert_string_equal(buffer, \"'a b'\");\n\n    /* Single quote in file name */\n    rc = ssh_quote_file_name(\"a'b\", buffer, 2048);\n    assert_int_equal(rc, 9);\n    assert_string_equal(buffer, \"'a'\\\"'\\\"'b'\");\n\n    /* Exclamation in file name */\n    rc = ssh_quote_file_name(\"a!b\", buffer, 2048);\n    assert_int_equal(rc, 8);\n    assert_string_equal(buffer, \"'a'\\\\!'b'\");\n\n    /* All together */\n    rc = ssh_quote_file_name(\"'a!b'\", buffer, 2048);\n    assert_int_equal(rc, 14);\n    assert_string_equal(buffer, \"\\\"'\\\"'a'\\\\!'b'\\\"'\\\"\");\n\n    rc = ssh_quote_file_name(\"a'!b\", buffer, 2048);\n    assert_int_equal(rc, 11);\n    assert_string_equal(buffer, \"'a'\\\"'\\\"\\\\!'b'\");\n\n    rc = ssh_quote_file_name(\"a'$b\", buffer, 2048);\n    assert_int_equal(rc, 10);\n    assert_string_equal(buffer, \"'a'\\\"'\\\"'$b'\");\n\n    rc = ssh_quote_file_name(\"a'`b\", buffer, 2048);\n    assert_int_equal(rc, 10);\n    assert_string_equal(buffer, \"'a'\\\"'\\\"'`b'\");\n\n\n    rc = ssh_quote_file_name(\" \", buffer, 2048);\n    assert_int_equal(rc, 3);\n    assert_string_equal(buffer, \"' '\");\n\n    rc = ssh_quote_file_name(\"  \", buffer, 2048);\n    assert_int_equal(rc, 4);\n    assert_string_equal(buffer, \"'  '\");\n\n\n    rc = ssh_quote_file_name(\"\\r\", buffer, 2048);\n    assert_int_equal(rc, 3);\n    assert_string_equal(buffer, \"'\\r'\");\n\n    rc = ssh_quote_file_name(\"\\n\", buffer, 2048);\n    assert_int_equal(rc, 3);\n    assert_string_equal(buffer, \"'\\n'\");\n\n    rc = ssh_quote_file_name(\"\\r\\n\", buffer, 2048);\n    assert_int_equal(rc, 4);\n    assert_string_equal(buffer, \"'\\r\\n'\");\n\n\n    rc = ssh_quote_file_name(\"\\\\r\", buffer, 2048);\n    assert_int_equal(rc, 4);\n    assert_string_equal(buffer, \"'\\\\r'\");\n\n    rc = ssh_quote_file_name(\"\\\\n\", buffer, 2048);\n    assert_int_equal(rc, 4);\n    assert_string_equal(buffer, \"'\\\\n'\");\n\n    rc = ssh_quote_file_name(\"\\\\r\\\\n\", buffer, 2048);\n    assert_int_equal(rc, 6);\n    assert_string_equal(buffer, \"'\\\\r\\\\n'\");\n\n\n    rc = ssh_quote_file_name(\"\\t\", buffer, 2048);\n    assert_int_equal(rc, 3);\n    assert_string_equal(buffer, \"'\\t'\");\n\n    rc = ssh_quote_file_name(\"\\v\", buffer, 2048);\n    assert_int_equal(rc, 3);\n    assert_string_equal(buffer, \"'\\v'\");\n\n    rc = ssh_quote_file_name(\"\\t\\v\", buffer, 2048);\n    assert_int_equal(rc, 4);\n    assert_string_equal(buffer, \"'\\t\\v'\");\n\n\n    rc = ssh_quote_file_name(\"'\", buffer, 2048);\n    assert_int_equal(rc, 3);\n    assert_string_equal(buffer, \"\\\"'\\\"\");\n\n    rc = ssh_quote_file_name(\"''\", buffer, 2048);\n    assert_int_equal(rc, 4);\n    assert_string_equal(buffer, \"\\\"''\\\"\");\n\n\n    rc = ssh_quote_file_name(\"\\\"\", buffer, 2048);\n    assert_int_equal(rc, 3);\n    assert_string_equal(buffer, \"'\\\"'\");\n\n    rc = ssh_quote_file_name(\"\\\"\\\"\", buffer, 2048);\n    assert_int_equal(rc, 4);\n    assert_string_equal(buffer, \"'\\\"\\\"'\");\n\n    rc = ssh_quote_file_name(\"'\\\"\", buffer, 2048);\n    assert_int_equal(rc, 6);\n    assert_string_equal(buffer, \"\\\"'\\\"'\\\"'\");\n\n    rc = ssh_quote_file_name(\"\\\"'\", buffer, 2048);\n    assert_int_equal(rc, 6);\n    assert_string_equal(buffer, \"'\\\"'\\\"'\\\"\");\n\n\n    /* Worst case */\n    rc = ssh_quote_file_name(\"a'b'\", buffer, 3 * 4 + 1);\n    assert_int_equal(rc, 12);\n    assert_string_equal(buffer, \"'a'\\\"'\\\"'b'\\\"'\\\"\");\n\n    /* Negative tests */\n\n    /* NULL params */\n    rc = ssh_quote_file_name(NULL, buffer, 3 * 4 + 1);\n    assert_int_equal(rc, SSH_ERROR);\n\n    /* NULL params */\n    rc = ssh_quote_file_name(\"a b\", NULL, 3 * 4 + 1);\n    assert_int_equal(rc, SSH_ERROR);\n\n    /* Small buffer size */\n    rc = ssh_quote_file_name(\"a b\", buffer, 0);\n    assert_int_equal(rc, SSH_ERROR);\n\n    /* Worst case and small buffer size */\n    rc = ssh_quote_file_name(\"a'b'\", buffer, 3 * 4);\n    assert_int_equal(rc, SSH_ERROR);\n}\n\nstatic void torture_ssh_newline_vis(UNUSED_PARAM(void **state))\n{\n    int rc;\n    char buffer[1024];\n\n    rc = ssh_newline_vis(\"\\n\", buffer, 1024);\n    assert_int_equal(rc, 2);\n    assert_string_equal(buffer, \"\\\\n\");\n\n    rc = ssh_newline_vis(\"\\n\\n\\n\\n\", buffer, 1024);\n    assert_int_equal(rc, 8);\n    assert_string_equal(buffer, \"\\\\n\\\\n\\\\n\\\\n\");\n\n    rc = ssh_newline_vis(\"a\\nb\\n\", buffer, 1024);\n    assert_int_equal(rc, 6);\n    assert_string_equal(buffer, \"a\\\\nb\\\\n\");\n}\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test(torture_get_user_home_dir),\n        cmocka_unit_test(torture_basename),\n        cmocka_unit_test(torture_dirname),\n        cmocka_unit_test(torture_ntohll),\n#ifdef _WIN32\n        cmocka_unit_test(torture_path_expand_tilde_win),\n#else\n        cmocka_unit_test(torture_path_expand_tilde_unix),\n#endif\n        cmocka_unit_test_setup_teardown(torture_path_expand_escape, setup, teardown),\n        cmocka_unit_test_setup_teardown(torture_path_expand_known_hosts, setup, teardown),\n        cmocka_unit_test_setup_teardown(torture_path_expand_percent, setup, teardown),\n        cmocka_unit_test(torture_timeout_elapsed),\n        cmocka_unit_test(torture_timeout_update),\n        cmocka_unit_test(torture_ssh_analyze_banner),\n        cmocka_unit_test(torture_ssh_dir_writeable),\n        cmocka_unit_test(torture_ssh_newline_vis),\n        cmocka_unit_test(torture_ssh_mkdirs),\n        cmocka_unit_test(torture_ssh_quote_file_name),\n    };\n\n    ssh_init();\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, NULL, NULL);\n    ssh_finalize();\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/unittests/torture_moduli.c",
    "content": "#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include \"torture.h\"\n#include \"dh-gex.c\"\n\nstatic const char moduli_content[] =\n    \"# Time Type Tests Tries Size Generator Modulus\\n\"\n    \"20120821044040 2 6 100 1023 5 D9277DAA27DB131C03B108D41A76B4DA8ACEECCCAE73\"\n    \"D2E48CEDAAA70B09EF9F04FB020DCF36C51B8E485B26FABE0337E24232BE4F4E6935483102\"\n    \"44937433FB1A5758195DC73B84ADEF8237472C46747D79DC0A2CF8A57CE8DBD8F466A20F85\"\n    \"51E7B1B824B2E4987A8816D9BC0741C2798F3EBAD3ADEBCC78FCE6A770E2EC9F\\n\"\n    \"20120821044502 2 6 100 1535 5 D1391174233D315398FE2830AC6B2B66BCCD01B0A634\"\n    \"899F339B7879F1DB85712E9DC4E4B1C6C8355570C1D2DCB53493DF18175A9C53D1128B592B\"\n    \"4C72D97136F5542FEB981CBFE8012FDD30361F288A42BD5EBB08BAB0A5640E1AC48763B2AB\"\n    \"D1945FEE36B2D55E1D50A1C86CED9DD141C4E7BE2D32D9B562A0F8E2E927020E91F58B57EB\"\n    \"9ACDDA106A59302D7E92AD5F6E851A45FA1CFE86029A0F727F65A8F475F33572E2FDAB6073\"\n    \"F0C21B8B54C3823DB2EF068927E5D747498F96361507\\n\"\n    \"20120821050636 2 6 100 2047 2 DD2047CBDBB6F8E919BC63DE885B34D0FD6E3DB2887D\"\n    \"8B46FE249886ACED6B46DFCD5553168185FD376122171CD8927E60120FA8D01F01D03E5828\"\n    \"1FEA9A1ABE97631C828E41815F34FDCDF787419FE13A3137649AA93D2584230DF5F24B5C00\"\n    \"C88B7D7DE4367693428C730376F218A53E853B0851BAB7C53C15DA7839CBE1285DB63F6FA4\"\n    \"5C1BB59FE1C5BB918F0F8459D7EF60ACFF5C0FA0F3FCAD1C5F4CE4416D4F4B36B05CDCEBE4\"\n    \"FB879E95847EFBC6449CD190248843BC7EDB145FBFC4EDBB1A3C959298F08F3BA2CFBE231B\"\n    \"BE204BE6F906209D28BD4820AB3E7BE96C26AE8A809ADD8D1A5A0B008E9570FA4C4697E116\"\n    \"B8119892C604293683DF582B\\n\"\n    \"20120821053137 2 6 100 3071 5 DFAA35D35531E0F524F0099877A482D2AC8D589F3743\"\n    \"94A262A8E81A8A4FB2F65FADBAB395E05D147B29D486DFAA41F41597A256DA82A8B6F76401\"\n    \"AED53D0253F956CEC610D417E42E3B287F7938FC24D8821B40BFA218A956EB7401BED6C96C\"\n    \"68C7FD64F8170A8A76B953DD2F05420118F6B144D8FE48060A2BCB85056B478EDEF96DBC70\"\n    \"427053ECD2958C074169E9550DD877779A3CF17C5AC850598C7586BEEA9DCFE9DD2A5FB62D\"\n    \"F5F33EA7BC00CDA31B9D2DD721F979EA85B6E63F0C4E30BDDCD3A335522F9004C4ED50B15D\"\n    \"C537F55324DD4FA119FB3F101467C6D7E1699DE4B3E3C478A8679B8EB3FA5C9B826B44530F\"\n    \"D3BE9AD3063B240B0C853EBDDBD68DD940332D98F148D5D9E1DC977D60A0D23D0CA1198637\"\n    \"FEAE4E7FAAC173AF2B84313A666CFB4EE6972811921D0AD867CE57F3BBC8D6CB057E3B6675\"\n    \"7BB46C9F72662624D44E14528327E3A7100E81A12C43C4E236118318CD90C8AA185BBB0C76\"\n    \"4826DAEAEE8DD245C5B451B4944E6122CC522D1C335C2EEF942284EA9F\\n\";\n\nconst char modulus_2048[] =\n    \"DD2047CBDBB6F8E919BC63DE885B34D0FD6E3DB2887D\"\n    \"8B46FE249886ACED6B46DFCD5553168185FD376122171CD8927E60120FA8D01F01D03E5828\"\n    \"1FEA9A1ABE97631C828E41815F34FDCDF787419FE13A3137649AA93D2584230DF5F24B5C00\"\n    \"C88B7D7DE4367693428C730376F218A53E853B0851BAB7C53C15DA7839CBE1285DB63F6FA4\"\n    \"5C1BB59FE1C5BB918F0F8459D7EF60ACFF5C0FA0F3FCAD1C5F4CE4416D4F4B36B05CDCEBE4\"\n    \"FB879E95847EFBC6449CD190248843BC7EDB145FBFC4EDBB1A3C959298F08F3BA2CFBE231B\"\n    \"BE204BE6F906209D28BD4820AB3E7BE96C26AE8A809ADD8D1A5A0B008E9570FA4C4697E116\"\n    \"B8119892C604293683DF582B\";\n\n/* test if the best dhgroup size is chosen out of lists */\nstatic void torture_dhgroup_better_size(UNUSED_PARAM(void **state))\n{\n    /* series of group sizes, as they are read in the file, along with expected\n     * value at every moment. */\n    size_t groups[][5][2] = {\n        {{1024,1024}, {2048, 1024}, {1500, 1024}, {1023,1024}, {512, 1024}},\n        {{512, 512}, {1023, 1023}, {1025, 1025}, {1500, 1025}, {2000, 1025}},\n        {{512, 512}, {2049, 512}, {768, 768}, {4096, 768}, {1024, 1024}}\n    };\n    size_t i, j, best;\n\n    for (i = 0; i < 3; ++i) {\n        best = 0;\n        for (j = 0; j < 5; ++j) {\n            bool ok;\n\n            ok = dhgroup_better_size(512, 1024, 2048, best, groups[i][j][0]);\n            if (ok) {\n                best = groups[i][j][0];\n                assert_int_equal(best, groups[i][j][1]);\n            }\n            assert_int_equal(best, groups[i][j][1]);\n        }\n    }\n}\n\nstatic void torture_retrieve_dhgroup_file(UNUSED_PARAM(void **state))\n{\n    FILE *moduli = tmpfile();\n    size_t size = 0;\n    char *generator = NULL, *modulus = NULL;\n    int rc;\n\n    fwrite(moduli_content, 1, sizeof(moduli_content), moduli);\n    rewind(moduli);\n    rc = ssh_retrieve_dhgroup_file(moduli,\n                                   1024,\n                                   2048,\n                                   4096,\n                                   &size,\n                                   &generator,\n                                   &modulus);\n    assert_int_equal(rc, SSH_OK);\n    assert_int_equal(size, 2048);\n    assert_string_equal(modulus, modulus_2048);\n\n    SAFE_FREE(generator);\n    SAFE_FREE(modulus);\n    fclose(moduli);\n}\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test(torture_dhgroup_better_size),\n        cmocka_unit_test(torture_retrieve_dhgroup_file)\n    };\n\n    ssh_init();\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, NULL, NULL);\n    ssh_finalize();\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/unittests/torture_options.c",
    "content": "#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#ifndef _WIN32\n#define _POSIX_PTHREAD_SEMANTICS\n# include <pwd.h>\n#endif\n\n#include \"torture.h\"\n#include \"torture_key.h\"\n#include <libssh/session.h>\n#include <libssh/misc.h>\n#include <libssh/pki_priv.h>\n#include <libssh/options.h>\n#ifdef WITH_SERVER\n#include <libssh/bind.h>\n#define LIBSSH_CUSTOM_BIND_CONFIG_FILE \"my_bind_config\"\n#endif\n#ifdef HAVE_DSA\n#define LIBSSH_DSA_TESTKEY        \"libssh_testkey.id_dsa\"\n#endif\n#define LIBSSH_RSA_TESTKEY        \"libssh_testkey.id_rsa\"\n#define LIBSSH_ED25519_TESTKEY    \"libssh_testkey.id_ed25519\"\n#ifdef HAVE_ECC\n#define LIBSSH_ECDSA_521_TESTKEY  \"libssh_testkey.id_ecdsa521\"\n#endif\n\nstatic int setup(void **state)\n{\n    ssh_session session;\n    int verbosity;\n\n    session = ssh_new();\n\n    verbosity = torture_libssh_verbosity();\n    ssh_options_set(session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity);\n\n    session->client = 1;\n\n    *state = session;\n\n    return 0;\n}\n\nstatic int teardown(void **state)\n{\n    ssh_free(*state);\n\n    return 0;\n}\n\nstatic void torture_options_set_host(void **state) {\n    ssh_session session = *state;\n    int rc;\n\n    rc = ssh_options_set(session, SSH_OPTIONS_HOST, \"localhost\");\n    assert_true(rc == 0);\n    assert_non_null(session->opts.host);\n    assert_string_equal(session->opts.host, \"localhost\");\n\n    rc = ssh_options_set(session, SSH_OPTIONS_HOST, \"guru@meditation\");\n    assert_true(rc == 0);\n    assert_non_null(session->opts.host);\n    assert_string_equal(session->opts.host, \"meditation\");\n    assert_non_null(session->opts.username);\n    assert_string_equal(session->opts.username, \"guru\");\n}\n\nstatic void torture_options_set_ciphers(void **state) {\n    ssh_session session = *state;\n    int rc;\n\n    /* Test known ciphers */\n    rc = ssh_options_set(session, SSH_OPTIONS_CIPHERS_C_S,\n                         \"aes128-ctr,aes192-ctr,aes256-ctr\");\n    assert_true(rc == 0);\n    assert_non_null(session->opts.wanted_methods[SSH_CRYPT_C_S]);\n    if (ssh_fips_mode()) {\n        assert_string_equal(session->opts.wanted_methods[SSH_CRYPT_C_S],\n                            \"aes128-ctr,aes256-ctr\");\n    } else {\n        assert_string_equal(session->opts.wanted_methods[SSH_CRYPT_C_S],\n                            \"aes128-ctr,aes192-ctr,aes256-ctr\");\n    }\n\n    /* Test one unknown cipher */\n    rc = ssh_options_set(session, SSH_OPTIONS_CIPHERS_C_S,\n                         \"aes128-ctr,unknown-crap@example.com,aes256-ctr\");\n    assert_true(rc == 0);\n    assert_non_null(session->opts.wanted_methods[SSH_CRYPT_C_S]);\n    assert_string_equal(session->opts.wanted_methods[SSH_CRYPT_C_S],\n                        \"aes128-ctr,aes256-ctr\");\n\n    /* Test all unknown ciphers */\n    rc = ssh_options_set(session, SSH_OPTIONS_CIPHERS_C_S,\n                         \"unknown-crap@example.com,more-crap@example.com\");\n    assert_false(rc == 0);\n}\n\nstatic void torture_options_set_key_exchange(void **state)\n{\n    ssh_session session = *state;\n    int rc;\n\n    /* Test known kexes */\n    rc = ssh_options_set(session,\n                         SSH_OPTIONS_KEY_EXCHANGE,\n                         \"curve25519-sha256,curve25519-sha256@libssh.org,\"\n                         \"ecdh-sha2-nistp256,diffie-hellman-group16-sha512,\"\n                         \"diffie-hellman-group18-sha512,\"\n                         \"diffie-hellman-group14-sha256,\"\n                         \"diffie-hellman-group14-sha1\");\n    assert_true(rc == 0);\n    assert_non_null(session->opts.wanted_methods[SSH_KEX]);\n    if (ssh_fips_mode()) {\n        assert_string_equal(session->opts.wanted_methods[SSH_KEX],\n                            \"ecdh-sha2-nistp256,diffie-hellman-group16-sha512,\"\n                            \"diffie-hellman-group18-sha512,\"\n                            \"diffie-hellman-group14-sha256\");\n    } else {\n        assert_string_equal(session->opts.wanted_methods[SSH_KEX],\n                            \"curve25519-sha256,curve25519-sha256@libssh.org,\"\n                            \"ecdh-sha2-nistp256,diffie-hellman-group16-sha512,\"\n                            \"diffie-hellman-group18-sha512,\"\n                            \"diffie-hellman-group14-sha256,\"\n                            \"diffie-hellman-group14-sha1\");\n    }\n\n    /* Test one unknown kex */\n    rc = ssh_options_set(session,\n                         SSH_OPTIONS_KEY_EXCHANGE,\n                         \"diffie-hellman-group16-sha512,\"\n                         \"unknown-crap@example.com,\"\n                         \"diffie-hellman-group18-sha512\");\n    assert_true(rc == 0);\n    assert_non_null(session->opts.wanted_methods[SSH_KEX]);\n    assert_string_equal(session->opts.wanted_methods[SSH_KEX],\n                        \"diffie-hellman-group16-sha512,\"\n                        \"diffie-hellman-group18-sha512\");\n\n    /* Test all unknown kexes */\n    rc = ssh_options_set(session,\n                         SSH_OPTIONS_KEY_EXCHANGE,\n                         \"unknown-crap@example.com,more-crap@example.com\");\n    assert_false(rc == 0);\n}\n\nstatic void torture_options_set_hostkey(void **state) {\n    ssh_session session = *state;\n    int rc;\n\n    /* Test known host keys */\n    rc = ssh_options_set(session,\n                         SSH_OPTIONS_HOSTKEYS,\n                         \"ssh-ed25519,ecdsa-sha2-nistp384,ssh-rsa\");\n    assert_true(rc == 0);\n    assert_non_null(session->opts.wanted_methods[SSH_HOSTKEYS]);\n    if (ssh_fips_mode()) {\n        assert_string_equal(session->opts.wanted_methods[SSH_HOSTKEYS],\n                \"ecdsa-sha2-nistp384\");\n    } else {\n        assert_string_equal(session->opts.wanted_methods[SSH_HOSTKEYS],\n                \"ssh-ed25519,ecdsa-sha2-nistp384,ssh-rsa\");\n    }\n\n    /* Test one unknown host key */\n    rc = ssh_options_set(session,\n                         SSH_OPTIONS_HOSTKEYS,\n                         \"ecdsa-sha2-nistp521,\"\n                         \"unknown-crap@example.com,\"\n                         \"rsa-sha2-256\");\n    assert_true(rc == 0);\n    assert_non_null(session->opts.wanted_methods[SSH_HOSTKEYS]);\n    assert_string_equal(session->opts.wanted_methods[SSH_HOSTKEYS],\n                        \"ecdsa-sha2-nistp521,\"\n                        \"rsa-sha2-256\");\n\n    /* Test all unknown host keys */\n    rc = ssh_options_set(session,\n                         SSH_OPTIONS_HOSTKEYS,\n                         \"unknown-crap@example.com,more-crap@example.com\");\n    assert_false(rc == 0);\n}\n\nstatic void torture_options_set_pubkey_accepted_types(void **state) {\n    ssh_session session = *state;\n    int rc;\n    enum ssh_digest_e type;\n\n    /* Test known public key algorithms */\n    rc = ssh_options_set(session,\n                         SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES,\n                         \"ssh-ed25519,ecdsa-sha2-nistp384,ssh-rsa\");\n    assert_true(rc == 0);\n    assert_non_null(session->opts.pubkey_accepted_types);\n    if (ssh_fips_mode()) {\n        assert_string_equal(session->opts.pubkey_accepted_types,\n                            \"ecdsa-sha2-nistp384\");\n    } else {\n        assert_string_equal(session->opts.pubkey_accepted_types,\n                            \"ssh-ed25519,ecdsa-sha2-nistp384,ssh-rsa\");\n    }\n\n    if (!ssh_fips_mode()) {\n        /* Test one unknown public key algorithms */\n        rc = ssh_options_set(session,\n                             SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES,\n                             \"ssh-ed25519,unknown-crap@example.com,ssh-rsa\");\n        assert_true(rc == 0);\n        assert_non_null(session->opts.pubkey_accepted_types);\n        assert_string_equal(session->opts.pubkey_accepted_types,\n                            \"ssh-ed25519,ssh-rsa\");\n\n        /* Test all unknown public key algorithms */\n        rc = ssh_options_set(session,\n                             SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES,\n                             \"unknown-crap@example.com,more-crap@example.com\");\n        assert_false(rc == 0);\n\n        /* Test that the option affects the algorithm selection for RSA keys */\n        /* simulate the SHA2 extension was negotiated */\n        session->extensions = SSH_EXT_SIG_RSA_SHA256;\n\n        /* previous configuration did not list the SHA2 extension algoritms, so\n         * it should not be used */\n        type = ssh_key_type_to_hash(session, SSH_KEYTYPE_RSA);\n        assert_int_equal(type, SSH_DIGEST_SHA1);\n    }\n\n    /* now, lets allow the signature from SHA2 extension and expect\n     * it to be used */\n    rc = ssh_options_set(session,\n                         SSH_OPTIONS_PUBLICKEY_ACCEPTED_TYPES,\n                         \"rsa-sha2-256,ssh-rsa\");\n    assert_true(rc == 0);\n    assert_non_null(session->opts.pubkey_accepted_types);\n    if (ssh_fips_mode()) {\n        assert_string_equal(session->opts.pubkey_accepted_types,\n                \"rsa-sha2-256\");\n    } else {\n        assert_string_equal(session->opts.pubkey_accepted_types,\n                \"rsa-sha2-256,ssh-rsa\");\n    }\n\n    /* Test that the option affects the algorithm selection for RSA keys */\n    /* simulate the SHA2 extension was negotiated */\n    session->extensions = SSH_EXT_SIG_RSA_SHA256;\n\n    type = ssh_key_type_to_hash(session, SSH_KEYTYPE_RSA);\n    assert_int_equal(type, SSH_DIGEST_SHA256);\n}\n\nstatic void torture_options_set_macs(void **state) {\n    ssh_session session = *state;\n    int rc;\n\n    /* Test known MACs */\n    rc = ssh_options_set(session, SSH_OPTIONS_HMAC_S_C, \"hmac-sha1\");\n    assert_true(rc == 0);\n    assert_non_null(session->opts.wanted_methods[SSH_MAC_S_C]);\n    assert_string_equal(session->opts.wanted_methods[SSH_MAC_S_C], \"hmac-sha1\");\n\n    /* Test multiple known MACs */\n    rc = ssh_options_set(session,\n                         SSH_OPTIONS_HMAC_S_C,\n                         \"hmac-sha1-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha1,hmac-sha2-256\");\n    assert_true(rc == 0);\n    assert_non_null(session->opts.wanted_methods[SSH_MAC_S_C]);\n    assert_string_equal(session->opts.wanted_methods[SSH_MAC_S_C],\n                        \"hmac-sha1-etm@openssh.com,hmac-sha2-256-etm@openssh.com,hmac-sha1,hmac-sha2-256\");\n\n    /* Test unknown MACs */\n    rc = ssh_options_set(session, SSH_OPTIONS_HMAC_S_C, \"unknown-crap@example.com,hmac-sha1-etm@openssh.com,unknown@example.com\");\n    assert_true(rc == 0);\n    assert_non_null(session->opts.wanted_methods[SSH_MAC_S_C]);\n    assert_string_equal(session->opts.wanted_methods[SSH_MAC_S_C], \"hmac-sha1-etm@openssh.com\");\n\n    /* Test all unknown MACs */\n    rc = ssh_options_set(session, SSH_OPTIONS_HMAC_S_C, \"unknown-crap@example.com\");\n    assert_false(rc == 0);\n}\n\nstatic void torture_options_get_host(void **state) {\n    ssh_session session = *state;\n    int rc;\n    char* host = NULL;\n\n    rc = ssh_options_set(session, SSH_OPTIONS_HOST, \"localhost\");\n    assert_true(rc == 0);\n    assert_string_equal(session->opts.host, \"localhost\");\n\n    assert_false(ssh_options_get(session, SSH_OPTIONS_HOST, &host));\n\n    assert_string_equal(host, \"localhost\");\n    free(host);\n}\n\nstatic void torture_options_set_port(void **state) {\n    ssh_session session = *state;\n    int rc;\n    unsigned int port = 42;\n\n    rc = ssh_options_set(session, SSH_OPTIONS_PORT, &port);\n    assert_true(rc == 0);\n    assert_true(session->opts.port == port);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_PORT_STR, \"23\");\n    assert_true(rc == 0);\n    assert_true(session->opts.port == 23);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_PORT_STR, \"five\");\n    assert_true(rc == -1);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_PORT, NULL);\n    assert_true(rc == -1);\n}\n\nstatic void torture_options_get_port(void **state) {\n  ssh_session session = *state;\n  unsigned int given_port = 1234;\n  unsigned int port_container;\n  int rc;\n  rc = ssh_options_set(session, SSH_OPTIONS_PORT, &given_port);\n  assert_true(rc == 0);\n  rc = ssh_options_get_port(session, &port_container);\n  assert_true(rc == 0);\n  assert_int_equal(port_container, 1234);\n}\n\nstatic void torture_options_get_user(void **state) {\n  ssh_session session = *state;\n  char* user = NULL;\n  int rc;\n  rc = ssh_options_set(session, SSH_OPTIONS_USER, \"magicaltrevor\");\n  assert_int_equal(rc, SSH_OK);\n  rc = ssh_options_get(session, SSH_OPTIONS_USER, &user);\n  assert_int_equal(rc, SSH_OK);\n  assert_non_null(user);\n  assert_string_equal(user, \"magicaltrevor\");\n  free(user);\n}\n\nstatic void torture_options_set_fd(void **state) {\n    ssh_session session = *state;\n    socket_t fd = 42;\n    int rc;\n\n    rc = ssh_options_set(session, SSH_OPTIONS_FD, &fd);\n    assert_true(rc == 0);\n    assert_true(session->opts.fd == fd);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_FD, NULL);\n    assert_true(rc == SSH_ERROR);\n    assert_true(session->opts.fd == SSH_INVALID_SOCKET);\n}\n\nstatic void torture_options_set_user(void **state) {\n    ssh_session session = *state;\n    int rc;\n#ifndef _WIN32\n# ifndef NSS_BUFLEN_PASSWD\n#  define NSS_BUFLEN_PASSWD 4096\n# endif /* NSS_BUFLEN_PASSWD */\n    struct passwd pwd;\n    struct passwd *pwdbuf;\n    char buf[NSS_BUFLEN_PASSWD];\n\n    /* get local username */\n    rc = getpwuid_r(getuid(), &pwd, buf, NSS_BUFLEN_PASSWD, &pwdbuf);\n    assert_true(rc == 0);\n#endif /* _WIN32 */\n\n    rc = ssh_options_set(session, SSH_OPTIONS_USER, \"guru\");\n    assert_true(rc == 0);\n    assert_string_equal(session->opts.username, \"guru\");\n\n\n    rc = ssh_options_set(session, SSH_OPTIONS_USER, NULL);\n    assert_true(rc == 0);\n\n#ifndef _WIN32\n    assert_string_equal(session->opts.username, pwd.pw_name);\n#endif\n}\n\n/* TODO */\n#if 0\nstatic voidtorture_options_set_sshdir)\n{\n}\nEND_TEST\n#endif\n\nstatic void torture_options_set_identity(void **state) {\n    ssh_session session = *state;\n    int rc;\n\n    rc = ssh_options_set(session, SSH_OPTIONS_ADD_IDENTITY, \"identity1\");\n    assert_true(rc == 0);\n    assert_string_equal(session->opts.identity->root->data, \"identity1\");\n\n    rc = ssh_options_set(session, SSH_OPTIONS_IDENTITY, \"identity2\");\n    assert_true(rc == 0);\n    assert_string_equal(session->opts.identity->root->data, \"identity2\");\n    assert_string_equal(session->opts.identity->root->next->data, \"identity1\");\n}\n\nstatic void torture_options_get_identity(void **state) {\n    ssh_session session = *state;\n    char *identity = NULL;\n    int rc;\n\n    rc = ssh_options_set(session, SSH_OPTIONS_ADD_IDENTITY, \"identity1\");\n    assert_true(rc == 0);\n    rc = ssh_options_get(session, SSH_OPTIONS_IDENTITY, &identity);\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(identity);\n    assert_string_equal(identity, \"identity1\");\n    SAFE_FREE(identity);\n\n    rc = ssh_options_set(session, SSH_OPTIONS_IDENTITY, \"identity2\");\n    assert_int_equal(rc, SSH_OK);\n    assert_string_equal(session->opts.identity->root->data, \"identity2\");\n    rc = ssh_options_get(session, SSH_OPTIONS_IDENTITY, &identity);\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(identity);\n    assert_string_equal(identity, \"identity2\");\n    free(identity);\n}\n\nstatic void torture_options_set_global_knownhosts(void **state)\n{\n    ssh_session session = *state;\n    int rc;\n\n    rc = ssh_options_set(session,\n                         SSH_OPTIONS_GLOBAL_KNOWNHOSTS,\n                         \"/etc/libssh/known_hosts\");\n    assert_ssh_return_code(session, rc);\n    assert_string_equal(session->opts.global_knownhosts,\n                        \"/etc/libssh/known_hosts\");\n}\n\nstatic void torture_options_get_global_knownhosts(void **state)\n{\n    ssh_session session = *state;\n    char *str = NULL;\n    int rc;\n\n    rc = ssh_options_set(session,\n                         SSH_OPTIONS_GLOBAL_KNOWNHOSTS,\n                         \"/etc/libssh/known_hosts\");\n    assert_ssh_return_code(session, rc);\n    assert_string_equal(session->opts.global_knownhosts,\n                        \"/etc/libssh/known_hosts\");\n\n\n    rc = ssh_options_get(session, SSH_OPTIONS_GLOBAL_KNOWNHOSTS, &str);\n    assert_ssh_return_code(session, rc);\n    assert_string_equal(session->opts.global_knownhosts,\n                        \"/etc/libssh/known_hosts\");\n\n    SSH_STRING_FREE_CHAR(str);\n}\n\nstatic void torture_options_set_knownhosts(void **state)\n{\n    ssh_session session = *state;\n    int rc;\n\n    rc = ssh_options_set(session,\n                         SSH_OPTIONS_KNOWNHOSTS,\n                         \"/home/libssh/.ssh/known_hosts\");\n    assert_ssh_return_code(session, rc);\n    assert_string_equal(session->opts.knownhosts,\n                        \"/home/libssh/.ssh/known_hosts\");\n\n    /* The NULL value should not crash the libssh */\n    rc = ssh_options_set(session, SSH_OPTIONS_KNOWNHOSTS, NULL);\n    assert_ssh_return_code(session, rc);\n    assert_null(session->opts.knownhosts);\n\n    /* ssh_options_apply() should set the path to correct value */\n    rc = ssh_options_apply(session);\n    assert_ssh_return_code(session, rc);\n    assert_non_null(session->opts.knownhosts);\n}\n\nstatic void torture_options_get_knownhosts(void **state)\n{\n    ssh_session session = *state;\n    char *str = NULL;\n    int rc;\n\n    rc = ssh_options_set(session,\n                         SSH_OPTIONS_KNOWNHOSTS,\n                         \"/home/libssh/.ssh/known_hosts\");\n    assert_ssh_return_code(session, rc);\n    assert_string_equal(session->opts.knownhosts,\n                        \"/home/libssh/.ssh/known_hosts\");\n\n\n    rc = ssh_options_get(session, SSH_OPTIONS_KNOWNHOSTS, &str);\n    assert_ssh_return_code(session, rc);\n    assert_string_equal(session->opts.knownhosts,\n                        \"/home/libssh/.ssh/known_hosts\");\n\n    SSH_STRING_FREE_CHAR(str);\n}\n\nstatic void torture_options_proxycommand(void **state) {\n    ssh_session session = *state;\n    int rc;\n\n    /* Enable ProxyCommand */\n    rc = ssh_options_set(session, SSH_OPTIONS_PROXYCOMMAND, \"ssh -q -A -X -W %h:%p JUMPHOST\");\n    assert_int_equal(rc, 0);\n\n    assert_string_equal(session->opts.ProxyCommand, \"ssh -q -A -X -W %h:%p JUMPHOST\");\n\n    /* Disable ProxyCommand */\n    rc = ssh_options_set(session, SSH_OPTIONS_PROXYCOMMAND, \"none\");\n    assert_int_equal(rc, 0);\n\n    assert_null(session->opts.ProxyCommand);\n}\n\nstatic void torture_options_config_host(void **state) {\n    ssh_session session = *state;\n    FILE *config = NULL;\n\n    /* create a new config file */\n    config = fopen(\"test_config\", \"w\");\n    assert_non_null(config);\n    fputs(\"Host testhost1\\nPort 42\\n\"\n          \"Host testhost2,testhost3\\nPort 43\\n\"\n          \"Host testhost4 testhost5\\nPort 44\\n\",\n          config);\n    fclose(config);\n\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"testhost1\");\n    ssh_options_parse_config(session, \"test_config\");\n\n    assert_int_equal(session->opts.port, 42);\n\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"testhost2\");\n    ssh_options_parse_config(session, \"test_config\");\n    assert_int_equal(session->opts.port, 43);\n\n    session->opts.port = 0;\n\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"testhost3\");\n    ssh_options_parse_config(session, \"test_config\");\n    assert_int_equal(session->opts.port, 43);\n\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"testhost4\");\n    ssh_options_parse_config(session, \"test_config\");\n    assert_int_equal(session->opts.port, 44);\n\n    session->opts.port = 0;\n\n    torture_reset_config(session);\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"testhost5\");\n    ssh_options_parse_config(session, \"test_config\");\n    assert_int_equal(session->opts.port, 44);\n\n    unlink(\"test_config\");\n}\n\nstatic void torture_options_config_match(void **state)\n{\n    ssh_session session = *state;\n    char *localuser = NULL;\n    FILE *config = NULL;\n    int rv;\n\n    /* Required for options_parse_config() */\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"testhost1\");\n\n    /* The Match keyword requires argument */\n    config = fopen(\"test_config\", \"w\");\n    assert_non_null(config);\n    fputs(\"Match\\n\",\n          config);\n    fclose(config);\n\n    rv = ssh_options_parse_config(session, \"test_config\");\n    assert_ssh_return_code_equal(session, rv, SSH_ERROR);\n\n    /* The Match all keyword needs to be the only one (start) */\n    torture_reset_config(session);\n    config = fopen(\"test_config\", \"w\");\n    assert_non_null(config);\n    fputs(\"Match all host local\\n\",\n          config);\n    fclose(config);\n\n    rv = ssh_options_parse_config(session, \"test_config\");\n    assert_ssh_return_code_equal(session, rv, SSH_ERROR);\n\n    /* The Match all keyword needs to be the only one (end) */\n    torture_reset_config(session);\n    config = fopen(\"test_config\", \"w\");\n    assert_non_null(config);\n    fputs(\"Match host local all\\n\",\n          config);\n    fclose(config);\n\n    rv = ssh_options_parse_config(session, \"test_config\");\n    assert_ssh_return_code_equal(session, rv, SSH_ERROR);\n\n    /* The Match host keyword requires an argument */\n    torture_reset_config(session);\n    config = fopen(\"test_config\", \"w\");\n    assert_non_null(config);\n    fputs(\"Match host\\n\",\n          config);\n    fclose(config);\n\n    rv = ssh_options_parse_config(session, \"test_config\");\n    assert_ssh_return_code_equal(session, rv, SSH_ERROR);\n\n    /* The Match user keyword requires an argument */\n    torture_reset_config(session);\n    config = fopen(\"test_config\", \"w\");\n    assert_non_null(config);\n    fputs(\"Match user\\n\",\n          config);\n    fclose(config);\n\n    rv = ssh_options_parse_config(session, \"test_config\");\n    assert_ssh_return_code_equal(session, rv, SSH_ERROR);\n\n    /* The Match canonical keyword is the same as match all */\n    torture_reset_config(session);\n    config = fopen(\"test_config\", \"w\");\n    assert_non_null(config);\n    fputs(\"Match canonical\\n\"\n          \"\\tPort 33\\n\"\n          \"Match all\\n\"\n          \"\\tPort 34\\n\",\n          config);\n    fclose(config);\n\n    rv = ssh_options_parse_config(session, \"test_config\");\n    assert_ssh_return_code_equal(session, rv, SSH_OK);\n    assert_int_equal(session->opts.port, 33);\n\n    session->opts.port = 0;\n\n    /* The Match originalhost keyword is ignored */\n    torture_reset_config(session);\n    config = fopen(\"test_config\", \"w\");\n    assert_non_null(config);\n    fputs(\"Match originalhost origin\\n\"\n          \"\\tPort 33\\n\"\n          \"Match all\\n\"\n          \"\\tPort 34\\n\",\n          config);\n    fclose(config);\n\n    rv = ssh_options_parse_config(session, \"test_config\");\n    assert_ssh_return_code(session, rv);\n    assert_int_equal(session->opts.port, 34);\n\n    session->opts.port = 0;\n\n    /* The Match localuser keyword */\n    torture_reset_config(session);\n    config = fopen(\"test_config\", \"w\");\n    assert_non_null(config);\n    fputs(\"Match localuser \", config);\n    localuser = ssh_get_local_username();\n    assert_non_null(localuser);\n    fputs(localuser, config);\n    free(localuser);\n    fputs(\"\\n\"\n          \"\\tPort 33\\n\"\n          \"Match all\\n\"\n          \"\\tPort 34\\n\",\n          config);\n    fclose(config);\n\n    rv = ssh_options_parse_config(session, \"test_config\");\n    assert_ssh_return_code(session, rv);\n    assert_int_equal(session->opts.port, 33);\n\n    session->opts.port = 0;\n\n    /* The Match exec keyword is ignored */\n    torture_reset_config(session);\n    config = fopen(\"test_config\", \"w\");\n    assert_non_null(config);\n    fputs(\"Match exec /bin/true\\n\"\n          \"\\tPort 33\\n\"\n          \"Match all\\n\"\n          \"\\tPort 34\\n\",\n          config);\n    fclose(config);\n\n    rv = ssh_options_parse_config(session, \"test_config\");\n    assert_ssh_return_code(session, rv);\n    assert_int_equal(session->opts.port, 34);\n\n    session->opts.port = 0;\n\n    /* The Match exec keyword can accept more arguments */\n    torture_reset_config(session);\n    config = fopen(\"test_config\", \"w\");\n    assert_non_null(config);\n    fputs(\"Match exec /bin/true 1 \\n\"\n          \"\\tPort 33\\n\"\n          \"Match all\\n\"\n          \"\\tPort 34\\n\",\n          config);\n    fclose(config);\n\n    rv = ssh_options_parse_config(session, \"test_config\");\n    assert_ssh_return_code(session, rv);\n    assert_int_equal(session->opts.port, 34);\n\n    session->opts.port = 0;\n\n    /* Commands containing whitespace characters must be quoted. */\n    torture_reset_config(session);\n    config = fopen(\"test_config\", \"w\");\n    assert_non_null(config);\n    fputs(\"Match exec \\\"/bin/true 1\\\"\\n\"\n          \"\\tPort 33\\n\"\n          \"Match all\\n\"\n          \"\\tPort 34\\n\",\n          config);\n    fclose(config);\n\n    rv = ssh_options_parse_config(session, \"test_config\");\n    assert_ssh_return_code(session, rv);\n    assert_int_equal(session->opts.port, 34);\n\n    session->opts.port = 0;\n\n    unlink(\"test_config\");\n}\n\nstatic void torture_options_copy(void **state)\n{\n    ssh_session session = *state, new = NULL;\n    struct ssh_iterator *it = NULL, *it2 = NULL;\n    FILE *config = NULL;\n    int i, level = 9;\n    int rv;\n\n    /* Required for options_parse_config() */\n    ssh_options_set(session, SSH_OPTIONS_HOST, \"example\");\n\n    /* Impossible to set through the configuration */\n    rv = ssh_options_set(session, SSH_OPTIONS_COMPRESSION_LEVEL, &level);\n    assert_ssh_return_code(session, rv);\n    level = 1;\n    rv = ssh_options_set(session, SSH_OPTIONS_NODELAY, &level);\n    assert_ssh_return_code(session, rv);\n\n    /* The Match keyword requires argument */\n    config = fopen(\"test_config\", \"w\");\n    assert_non_null(config);\n    fputs(\"IdentityFile ~/.ssh/id_ecdsa\\n\"\n          \"User tester\\n\"\n          \"Hostname example.com\\n\"\n          \"BindAddress 127.0.0.2\\n\"\n          \"GlobalKnownHostsFile /etc/ssh/known_hosts2\\n\"\n          \"UserKnownHostsFile ~/.ssh/known_hosts2\\n\"\n          \"KexAlgorithms curve25519-sha256,ecdh-sha2-nistp521\\n\"\n          \"Ciphers aes256-ctr\\n\"\n          \"MACs hmac-sha2-256\\n\"\n          \"HostKeyAlgorithms ssh-ed25519,ecdsa-sha2-nistp521\\n\"\n          \"Compression yes\\n\"\n          \"PubkeyAcceptedTypes ssh-ed25519,ecdsa-sha2-nistp521\\n\"\n          \"ProxyCommand nc 127.0.0.10 22\\n\"\n          /* ops.custombanner */\n          \"ConnectTimeout 42\\n\"\n          \"Port 222\\n\"\n          \"StrictHostKeyChecking no\\n\"\n          \"GSSAPIServerIdentity my.example.com\\n\"\n          \"GSSAPIClientIdentity home.sweet\\n\"\n          \"GSSAPIDelegateCredentials yes\\n\"\n          \"PubkeyAuthentication yes\\n\" /* sets flags */\n          \"GSSAPIAuthentication no\\n\" /* sets flags */\n          \"\",\n          config);\n    fclose(config);\n\n    rv = ssh_options_parse_config(session, \"test_config\");\n    assert_ssh_return_code(session, rv);\n\n    rv = ssh_options_copy(session, &new);\n    assert_ssh_return_code(session, rv);\n    assert_non_null(new);\n\n    /* Check the identities match */\n    it = ssh_list_get_iterator(session->opts.identity);\n    assert_non_null(it);\n    it2 = ssh_list_get_iterator(new->opts.identity);\n    assert_non_null(it2);\n    while (it != NULL && it2 != NULL) {\n        assert_string_equal(it->data, it2->data);\n        it = it->next;\n        it2 = it2->next;\n    }\n    assert_null(it);\n    assert_null(it2);\n\n    assert_string_equal(session->opts.username, new->opts.username);\n    assert_string_equal(session->opts.host, new->opts.host);\n    assert_string_equal(session->opts.bindaddr, new->opts.bindaddr);\n    assert_string_equal(session->opts.sshdir, new->opts.sshdir);\n    assert_string_equal(session->opts.knownhosts, new->opts.knownhosts);\n    assert_string_equal(session->opts.global_knownhosts,\n                        new->opts.global_knownhosts);\n    for (i = 0; i < SSH_KEX_METHODS; i++) {\n        if (session->opts.wanted_methods[i] == NULL) {\n            assert_null(new->opts.wanted_methods[i]);\n        } else {\n            assert_string_equal(session->opts.wanted_methods[i],\n                                new->opts.wanted_methods[i]);\n        }\n    }\n    assert_string_equal(session->opts.pubkey_accepted_types,\n                        new->opts.pubkey_accepted_types);\n    assert_string_equal(session->opts.ProxyCommand, new->opts.ProxyCommand);\n    /* TODO custombanner */\n    assert_int_equal(session->opts.timeout, new->opts.timeout);\n    assert_int_equal(session->opts.timeout_usec, new->opts.timeout_usec);\n    assert_int_equal(session->opts.port, new->opts.port);\n    assert_int_equal(session->opts.StrictHostKeyChecking,\n                     new->opts.StrictHostKeyChecking);\n    assert_int_equal(session->opts.compressionlevel,\n                     new->opts.compressionlevel);\n    assert_string_equal(session->opts.gss_server_identity,\n                        new->opts.gss_server_identity);\n    assert_string_equal(session->opts.gss_client_identity,\n                        new->opts.gss_client_identity);\n    assert_int_equal(session->opts.gss_delegate_creds,\n                     new->opts.gss_delegate_creds);\n    assert_int_equal(session->opts.flags, new->opts.flags);\n    assert_int_equal(session->opts.nodelay, new->opts.nodelay);\n    assert_true(session->opts.config_processed == new->opts.config_processed);\n    assert_memory_equal(session->opts.options_seen, new->opts.options_seen,\n                        sizeof(session->opts.options_seen));\n\n    ssh_free(new);\n}\n\n#ifdef WITH_SERVER\nconst char template[] = \"temp_dir_XXXXXX\";\n\nstruct bind_st {\n    char *cwd;\n    char *temp_dir;\n    ssh_bind bind;\n};\n\nstatic int ssh_bind_setup_files(void **state)\n{\n    struct bind_st *test_state = NULL;\n    char *cwd = NULL;\n    char *tmp_dir = NULL;\n    int rc = 0;\n\n    test_state = (struct bind_st *)malloc(sizeof(struct bind_st));\n    assert_non_null(test_state);\n\n    cwd = torture_get_current_working_dir();\n    assert_non_null(cwd);\n\n    tmp_dir = torture_make_temp_dir(template);\n    assert_non_null(tmp_dir);\n\n    test_state->cwd = cwd;\n    test_state->temp_dir = tmp_dir;\n\n    *state = test_state;\n\n    rc = torture_change_dir(tmp_dir);\n    assert_int_equal(rc, 0);\n\n    printf(\"Changed directory to: %s\\n\", tmp_dir);\n\n    /* For ed25519 the test keys are not available in legacy PEM format. Using\n     * the new OpenSSH format for all algorithms */\n    torture_write_file(LIBSSH_RSA_TESTKEY,\n                       torture_get_openssh_testkey(SSH_KEYTYPE_RSA, 0));\n\n    torture_write_file(LIBSSH_ED25519_TESTKEY,\n                       torture_get_openssh_testkey(SSH_KEYTYPE_ED25519, 0));\n#ifdef HAVE_ECC\n    torture_write_file(LIBSSH_ECDSA_521_TESTKEY,\n                       torture_get_openssh_testkey(SSH_KEYTYPE_ECDSA_P521, 0));\n#endif\n#ifdef HAVE_DSA\n    torture_write_file(LIBSSH_DSA_TESTKEY,\n                       torture_get_openssh_testkey(SSH_KEYTYPE_DSS, 0));\n#endif\n    torture_write_file(LIBSSH_CUSTOM_BIND_CONFIG_FILE,\n                       \"Port 42\\n\");\n    return 0;\n}\n\n\n/* sshbind options */\nstatic int sshbind_setup(void **state)\n{\n    int rc;\n    struct bind_st *test_state = NULL;\n\n    rc = ssh_bind_setup_files((void **)&test_state);\n    assert_int_equal(rc, 0);\n    assert_non_null(test_state);\n\n    test_state->bind = ssh_bind_new();\n    assert_non_null(test_state->bind);\n\n    *state = test_state;\n\n    return 0;\n}\n\nstatic int sshbind_teardown(void **state)\n{\n    struct bind_st *test_state = NULL;\n    int rc;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n\n    assert_non_null(test_state);\n    assert_non_null(test_state->cwd);\n    assert_non_null(test_state->temp_dir);\n    assert_non_null(test_state->bind);\n\n    rc = torture_change_dir(test_state->cwd);\n    assert_int_equal(rc, 0);\n\n    rc = torture_rmdirs(test_state->temp_dir);\n    assert_int_equal(rc, 0);\n\n    SAFE_FREE(test_state->temp_dir);\n    SAFE_FREE(test_state->cwd);\n    ssh_bind_free(test_state->bind);\n    SAFE_FREE(test_state);\n\n    return 0;\n}\n\nstatic void torture_bind_options_import_key(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int rc;\n    const char *base64_key;\n    ssh_key key = ssh_key_new();\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    /* set null */\n    rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_IMPORT_KEY, NULL);\n    assert_int_equal(rc, -1);\n    /* set invalid key */\n    rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_IMPORT_KEY, key);\n    assert_int_equal(rc, -1);\n    SSH_KEY_FREE(key);\n\n    /* set rsa key */\n    base64_key = torture_get_testkey(SSH_KEYTYPE_RSA, 0);\n    rc = ssh_pki_import_privkey_base64(base64_key, NULL, NULL, NULL, &key);\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(key);\n\n    rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_IMPORT_KEY, key);\n    assert_int_equal(rc, 0);\n#ifdef HAVE_DSA\n    /* set dsa key */\n    base64_key = torture_get_testkey(SSH_KEYTYPE_DSS, 0);\n    rc = ssh_pki_import_privkey_base64(base64_key, NULL, NULL, NULL, &key);\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(key);\n\n    rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_IMPORT_KEY, key);\n    assert_int_equal(rc, 0);\n#endif\n#ifdef HAVE_ECC\n    /* set ecdsa key */\n    base64_key = torture_get_testkey(SSH_KEYTYPE_ECDSA_P521, 0);\n    rc = ssh_pki_import_privkey_base64(base64_key, NULL, NULL, NULL, &key);\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(key);\n\n    rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_IMPORT_KEY, key);\n    assert_int_equal(rc, 0);\n#endif\n}\n\nstatic void torture_bind_options_hostkey(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int rc;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    /* Test RSA key */\n    rc = ssh_bind_options_set(bind,\n                              SSH_BIND_OPTIONS_HOSTKEY,\n                              LIBSSH_RSA_TESTKEY);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->rsakey);\n    assert_string_equal(bind->rsakey, LIBSSH_RSA_TESTKEY);\n\n    /* Test ED25519 key */\n    rc = ssh_bind_options_set(bind,\n                              SSH_BIND_OPTIONS_HOSTKEY,\n                              LIBSSH_ED25519_TESTKEY);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->ed25519key);\n    assert_string_equal(bind->ed25519key, LIBSSH_ED25519_TESTKEY);\n\n#ifdef HAVE_ECC\n    /* Test ECDSA key */\n    rc = ssh_bind_options_set(bind,\n                              SSH_BIND_OPTIONS_HOSTKEY,\n                              LIBSSH_ECDSA_521_TESTKEY);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->ecdsakey);\n    assert_string_equal(bind->ecdsakey, LIBSSH_ECDSA_521_TESTKEY);\n#endif\n#ifdef HAVE_DSA\n    /* Test DSA key */\n    rc = ssh_bind_options_set(bind,\n                              SSH_BIND_OPTIONS_HOSTKEY,\n                              LIBSSH_DSA_TESTKEY);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->dsakey);\n    assert_string_equal(bind->dsakey, LIBSSH_DSA_TESTKEY);\n#endif\n}\n\nstatic void torture_bind_options_bindaddr(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int rc;\n\n    const char *address = \"127.0.0.1\";\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_BINDADDR, address);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->bindaddr);\n    assert_string_equal(bind->bindaddr, address);\n}\n\nstatic void torture_bind_options_bindport(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    unsigned int given_port = 1234;\n    int rc;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_BINDPORT, &given_port);\n    assert_int_equal(rc, 0);\n    assert_int_equal(bind->bindport, 1234);\n}\n\nstatic void torture_bind_options_bindport_str(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int rc;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_BINDPORT_STR, \"23\");\n    assert_int_equal(rc, 0);\n    assert_int_equal(bind->bindport, 23);\n}\n\nstatic void torture_bind_options_log_verbosity(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int verbosity = SSH_LOG_PACKET;\n    int previous_level, new_level;\n    int rc;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    previous_level = ssh_get_log_level();\n\n    rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_LOG_VERBOSITY, &verbosity);\n    assert_int_equal(rc, 0);\n\n    new_level = ssh_get_log_level();\n    assert_int_equal(new_level, verbosity);\n\n    rc = ssh_set_log_level(previous_level);\n    assert_int_equal(rc, SSH_OK);\n}\n\nstatic void torture_bind_options_log_verbosity_str(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int rc;\n    int previous_level, new_level;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    previous_level = ssh_get_log_level();\n\n    rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_LOG_VERBOSITY_STR, \"3\");\n    assert_int_equal(rc, 0);\n\n    new_level = ssh_get_log_level();\n    assert_int_equal(new_level, SSH_LOG_PACKET);\n\n    rc = ssh_set_log_level(previous_level);\n    assert_int_equal(rc, SSH_OK);\n}\n\n#ifdef HAVE_DSA\nstatic void torture_bind_options_dsakey(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int rc;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    rc = ssh_bind_options_set(bind,\n                              SSH_BIND_OPTIONS_DSAKEY,\n                              LIBSSH_DSA_TESTKEY);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->dsakey);\n    assert_string_equal(bind->dsakey, LIBSSH_DSA_TESTKEY);\n}\n#endif\n\nstatic void torture_bind_options_rsakey(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int rc;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    rc = ssh_bind_options_set(bind,\n                              SSH_BIND_OPTIONS_RSAKEY,\n                              LIBSSH_RSA_TESTKEY);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->rsakey);\n    assert_string_equal(bind->rsakey, LIBSSH_RSA_TESTKEY);\n}\n\n#ifdef HAVE_ECC\nstatic void torture_bind_options_ecdsakey(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int rc;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    rc = ssh_bind_options_set(bind,\n                              SSH_BIND_OPTIONS_ECDSAKEY,\n                              LIBSSH_ECDSA_521_TESTKEY);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->ecdsakey);\n    assert_string_equal(bind->ecdsakey, LIBSSH_ECDSA_521_TESTKEY);\n}\n#endif\n\nstatic void torture_bind_options_banner(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    const char *banner = \"This is the new banner\";\n    int rc;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    rc = ssh_bind_options_set(bind,\n                              SSH_BIND_OPTIONS_BANNER,\n                              banner);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->banner);\n    assert_string_equal(bind->banner, banner);\n}\n\nstatic void torture_bind_options_set_ciphers(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int rc;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n    assert_non_null(bind->wanted_methods);\n\n    /* Test known ciphers */\n    rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_CIPHERS_C_S,\n                              \"aes128-ctr,aes192-ctr,aes256-ctr\");\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->wanted_methods[SSH_CRYPT_C_S]);\n    if (ssh_fips_mode()) {\n        assert_string_equal(bind->wanted_methods[SSH_CRYPT_C_S],\n                            \"aes128-ctr,aes256-ctr\");\n    } else {\n        assert_string_equal(bind->wanted_methods[SSH_CRYPT_C_S],\n                            \"aes128-ctr,aes192-ctr,aes256-ctr\");\n    }\n\n    /* Test one unknown cipher */\n    rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_CIPHERS_C_S,\n                         \"aes128-ctr,unknown-crap@example.com,aes256-ctr\");\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->wanted_methods[SSH_CRYPT_C_S]);\n    assert_string_equal(bind->wanted_methods[SSH_CRYPT_C_S],\n                        \"aes128-ctr,aes256-ctr\");\n\n    /* Test all unknown ciphers */\n    rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_CIPHERS_C_S,\n                         \"unknown-crap@example.com,more-crap@example.com\");\n    assert_int_not_equal(rc, 0);\n\n    /* Test known ciphers */\n    rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_CIPHERS_S_C,\n                              \"aes128-ctr,aes192-ctr,aes256-ctr\");\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->wanted_methods[SSH_CRYPT_S_C]);\n    if (ssh_fips_mode()) {\n        assert_string_equal(bind->wanted_methods[SSH_CRYPT_S_C],\n                            \"aes128-ctr,aes256-ctr\");\n    } else {\n        assert_string_equal(bind->wanted_methods[SSH_CRYPT_S_C],\n                            \"aes128-ctr,aes192-ctr,aes256-ctr\");\n    }\n\n    /* Test one unknown cipher */\n    rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_CIPHERS_S_C,\n                         \"aes128-ctr,unknown-crap@example.com,aes256-ctr\");\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->wanted_methods[SSH_CRYPT_S_C]);\n    assert_string_equal(bind->wanted_methods[SSH_CRYPT_S_C],\n                        \"aes128-ctr,aes256-ctr\");\n\n    /* Test all unknown ciphers */\n    rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_CIPHERS_S_C,\n                         \"unknown-crap@example.com,more-crap@example.com\");\n    assert_int_not_equal(rc, 0);\n}\n\nstatic void torture_bind_options_set_key_exchange(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int rc;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n    assert_non_null(bind->wanted_methods);\n\n    /* Test known kexes */\n    rc = ssh_bind_options_set(bind,\n                              SSH_BIND_OPTIONS_KEY_EXCHANGE,\n                              \"curve25519-sha256,curve25519-sha256@libssh.org,\"\n                              \"ecdh-sha2-nistp256,diffie-hellman-group16-sha512,\"\n                              \"diffie-hellman-group18-sha512,\"\n                              \"diffie-hellman-group14-sha256,\"\n                              \"diffie-hellman-group14-sha1\");\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->wanted_methods[SSH_KEX]);\n    if (ssh_fips_mode()) {\n        assert_string_equal(bind->wanted_methods[SSH_KEX],\n                            \"ecdh-sha2-nistp256,diffie-hellman-group16-sha512,\"\n                            \"diffie-hellman-group18-sha512,\"\n                            \"diffie-hellman-group14-sha256\");\n    } else {\n        assert_string_equal(bind->wanted_methods[SSH_KEX],\n                            \"curve25519-sha256,curve25519-sha256@libssh.org,\"\n                            \"ecdh-sha2-nistp256,diffie-hellman-group16-sha512,\"\n                            \"diffie-hellman-group18-sha512,\"\n                            \"diffie-hellman-group14-sha256,\"\n                            \"diffie-hellman-group14-sha1\");\n    }\n\n    /* Test one unknown kex */\n    rc = ssh_bind_options_set(bind,\n                              SSH_BIND_OPTIONS_KEY_EXCHANGE,\n                         \"diffie-hellman-group16-sha512,\"\n                         \"unknown-crap@example.com,\"\n                         \"diffie-hellman-group18-sha512\");\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->wanted_methods[SSH_KEX]);\n    assert_string_equal(bind->wanted_methods[SSH_KEX],\n                        \"diffie-hellman-group16-sha512,\"\n                        \"diffie-hellman-group18-sha512\");\n\n    /* Test all unknown kexes */\n    rc = ssh_bind_options_set(bind,\n                              SSH_BIND_OPTIONS_KEY_EXCHANGE,\n                              \"unknown-crap@example.com,more-crap@example.com\");\n    assert_int_not_equal(rc, 0);\n}\n\nstatic void torture_bind_options_set_macs(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int rc;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n    assert_non_null(bind->wanted_methods);\n\n    /* Test known MACs */\n    rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_HMAC_S_C, \"hmac-sha1\");\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->wanted_methods[SSH_MAC_S_C]);\n    assert_string_equal(bind->wanted_methods[SSH_MAC_S_C], \"hmac-sha1\");\n\n    /* Test multiple known MACs */\n    rc = ssh_bind_options_set(bind,\n                              SSH_BIND_OPTIONS_HMAC_S_C,\n                              \"hmac-sha1,hmac-sha2-256\");\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->wanted_methods[SSH_MAC_S_C]);\n    assert_string_equal(bind->wanted_methods[SSH_MAC_S_C],\n                        \"hmac-sha1,hmac-sha2-256\");\n\n    /* Test unknown MACs */\n    rc = ssh_bind_options_set(bind,\n                              SSH_BIND_OPTIONS_HMAC_S_C,\n                              \"unknown-crap@example.com,hmac-sha1,unknown@example.com\");\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->wanted_methods[SSH_MAC_S_C]);\n    assert_string_equal(bind->wanted_methods[SSH_MAC_S_C], \"hmac-sha1\");\n\n    /* Test all unknown MACs */\n    rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_HMAC_S_C, \"unknown-crap@example.com\");\n    assert_int_not_equal(rc, 0);\n\n    /* Test known MACs */\n    rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_HMAC_C_S, \"hmac-sha1\");\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->wanted_methods[SSH_MAC_C_S]);\n    assert_string_equal(bind->wanted_methods[SSH_MAC_C_S], \"hmac-sha1\");\n\n    /* Test multiple known MACs */\n    rc = ssh_bind_options_set(bind,\n                              SSH_BIND_OPTIONS_HMAC_C_S,\n                              \"hmac-sha1,hmac-sha2-256\");\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->wanted_methods[SSH_MAC_C_S]);\n    assert_string_equal(bind->wanted_methods[SSH_MAC_C_S],\n                        \"hmac-sha1,hmac-sha2-256\");\n\n    /* Test unknown MACs */\n    rc = ssh_bind_options_set(bind,\n                              SSH_BIND_OPTIONS_HMAC_C_S,\n                              \"unknown-crap@example.com,hmac-sha1,unknown@example.com\");\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->wanted_methods[SSH_MAC_C_S]);\n    assert_string_equal(bind->wanted_methods[SSH_MAC_C_S], \"hmac-sha1\");\n\n    /* Test all unknown MACs */\n    rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_HMAC_C_S, \"unknown-crap@example.com\");\n    assert_int_not_equal(rc, 0);\n}\n\nstatic void torture_bind_options_parse_config(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    char *cwd = NULL;\n    int rc;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    cwd = torture_get_current_working_dir();\n    assert_non_null(cwd);\n\n    rc = ssh_bind_options_set(bind,\n                              SSH_BIND_OPTIONS_CONFIG_DIR,\n                              (const char *)cwd);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->config_dir);\n    assert_string_equal(bind->config_dir, cwd);\n\n    rc = ssh_bind_options_parse_config(bind, \"%d/\"LIBSSH_CUSTOM_BIND_CONFIG_FILE);\n    assert_int_equal(rc, 0);\n    assert_int_equal(bind->bindport, 42);\n\n    SAFE_FREE(cwd);\n}\n\nstatic void torture_bind_options_config_dir(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    const char *new_dir = \"/new/dir/\";\n    const char *replacement_dir = \"/replacement/dir/\";\n    int rc;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    rc = ssh_bind_options_set(bind,\n                              SSH_BIND_OPTIONS_CONFIG_DIR,\n                              new_dir);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->config_dir);\n    assert_string_equal(bind->config_dir, new_dir);\n\n    rc = ssh_bind_options_set(bind,\n                              SSH_BIND_OPTIONS_CONFIG_DIR,\n                              replacement_dir);\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->config_dir);\n    assert_string_equal(bind->config_dir, replacement_dir);\n}\n\nstatic void torture_bind_options_set_pubkey_accepted_key_types(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int rc;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    /* Test known Pubkey Types */\n    rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_PUBKEY_ACCEPTED_KEY_TYPES,\n        \"ssh-ed25519,ecdsa-sha2-nistp384,ssh-rsa\");\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->pubkey_accepted_key_types);\n    if (ssh_fips_mode()) {\n        assert_string_equal(bind->pubkey_accepted_key_types,\n                            \"ecdsa-sha2-nistp384\");\n    } else {\n        assert_string_equal(bind->pubkey_accepted_key_types,\n                            \"ssh-ed25519,ecdsa-sha2-nistp384,ssh-rsa\");\n    }\n\n    SAFE_FREE(bind->pubkey_accepted_key_types);\n\n    /* Test with some unknown type */\n    rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_PUBKEY_ACCEPTED_KEY_TYPES,\n        \"ecdsa-sha2-nistp384,unknown-type,rsa-sha2-256\");\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->pubkey_accepted_key_types);\n    assert_string_equal(bind->pubkey_accepted_key_types,\n        \"ecdsa-sha2-nistp384,rsa-sha2-256\");\n\n    SAFE_FREE(bind->pubkey_accepted_key_types);\n\n    /* Test with only unknown type */\n    rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_PUBKEY_ACCEPTED_KEY_TYPES,\n        \"unknown-type\");\n    assert_int_equal(rc, -1);\n    assert_null(bind->pubkey_accepted_key_types);\n\n    /* Test with something set and then try unknown type */\n    rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_PUBKEY_ACCEPTED_KEY_TYPES,\n        \"ecdsa-sha2-nistp384\");\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->pubkey_accepted_key_types);\n    assert_string_equal(bind->pubkey_accepted_key_types,\n        \"ecdsa-sha2-nistp384\");\n    rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_PUBKEY_ACCEPTED_KEY_TYPES,\n        \"unknown-type\");\n    assert_int_equal(rc, -1);\n\n    /* Check that nothing changed */\n    assert_non_null(bind->pubkey_accepted_key_types);\n    assert_string_equal(bind->pubkey_accepted_key_types,\n        \"ecdsa-sha2-nistp384\");\n}\n\nstatic void torture_bind_options_set_hostkey_algorithms(void **state)\n{\n    struct bind_st *test_state;\n    ssh_bind bind;\n    int rc;\n\n    assert_non_null(state);\n    test_state = *((struct bind_st **)state);\n    assert_non_null(test_state);\n    assert_non_null(test_state->bind);\n    bind = test_state->bind;\n\n    /* Test known Pubkey Types */\n    rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_HOSTKEY_ALGORITHMS,\n                              \"ssh-ed25519,ecdsa-sha2-nistp384,ssh-rsa\");\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->wanted_methods[SSH_HOSTKEYS]);\n    if (ssh_fips_mode()) {\n        assert_string_equal(bind->wanted_methods[SSH_HOSTKEYS],\n                \"ecdsa-sha2-nistp384\");\n    } else {\n        assert_string_equal(bind->wanted_methods[SSH_HOSTKEYS],\n                \"ssh-ed25519,ecdsa-sha2-nistp384,ssh-rsa\");\n    }\n\n    SAFE_FREE(bind->wanted_methods[SSH_HOSTKEYS]);\n\n    /* Test with some unknown type */\n    rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_HOSTKEY_ALGORITHMS,\n        \"ecdsa-sha2-nistp384,unknown-type\");\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->wanted_methods[SSH_HOSTKEYS]);\n    assert_string_equal(bind->wanted_methods[SSH_HOSTKEYS],\n        \"ecdsa-sha2-nistp384\");\n\n    SAFE_FREE(bind->wanted_methods[SSH_HOSTKEYS]);\n\n    /* Test with only unknown type */\n    rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_HOSTKEY_ALGORITHMS,\n        \"unknown-type\");\n    assert_int_equal(rc, -1);\n    assert_null(bind->wanted_methods[SSH_HOSTKEYS]);\n\n    /* Test with something set and then try unknown type */\n    rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_HOSTKEY_ALGORITHMS,\n        \"ecdsa-sha2-nistp384\");\n    assert_int_equal(rc, 0);\n    assert_non_null(bind->wanted_methods[SSH_HOSTKEYS]);\n    assert_string_equal(bind->wanted_methods[SSH_HOSTKEYS],\n        \"ecdsa-sha2-nistp384\");\n    rc = ssh_bind_options_set(bind, SSH_BIND_OPTIONS_HOSTKEY_ALGORITHMS,\n        \"unknown-type\");\n    assert_int_equal(rc, -1);\n\n    /* Check that nothing changed */\n    assert_non_null(bind->wanted_methods[SSH_HOSTKEYS]);\n    assert_string_equal(bind->wanted_methods[SSH_HOSTKEYS],\n        \"ecdsa-sha2-nistp384\");\n}\n\n#endif /* WITH_SERVER */\n\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_options_set_host, setup, teardown),\n        cmocka_unit_test_setup_teardown(torture_options_get_host, setup, teardown),\n        cmocka_unit_test_setup_teardown(torture_options_set_port, setup, teardown),\n        cmocka_unit_test_setup_teardown(torture_options_get_port, setup, teardown),\n        cmocka_unit_test_setup_teardown(torture_options_set_fd, setup, teardown),\n        cmocka_unit_test_setup_teardown(torture_options_set_user, setup, teardown),\n        cmocka_unit_test_setup_teardown(torture_options_get_user, setup, teardown),\n        cmocka_unit_test_setup_teardown(torture_options_set_identity, setup, teardown),\n        cmocka_unit_test_setup_teardown(torture_options_get_identity, setup, teardown),\n        cmocka_unit_test_setup_teardown(torture_options_set_global_knownhosts, setup, teardown),\n        cmocka_unit_test_setup_teardown(torture_options_get_global_knownhosts, setup, teardown),\n        cmocka_unit_test_setup_teardown(torture_options_set_knownhosts, setup, teardown),\n        cmocka_unit_test_setup_teardown(torture_options_get_knownhosts, setup, teardown),\n        cmocka_unit_test_setup_teardown(torture_options_proxycommand, setup, teardown),\n        cmocka_unit_test_setup_teardown(torture_options_set_ciphers, setup, teardown),\n        cmocka_unit_test_setup_teardown(torture_options_set_key_exchange, setup, teardown),\n        cmocka_unit_test_setup_teardown(torture_options_set_hostkey, setup, teardown),\n        cmocka_unit_test_setup_teardown(torture_options_set_pubkey_accepted_types, setup, teardown),\n        cmocka_unit_test_setup_teardown(torture_options_set_macs, setup, teardown),\n        cmocka_unit_test_setup_teardown(torture_options_copy, setup, teardown),\n        cmocka_unit_test_setup_teardown(torture_options_config_host, setup, teardown),\n        cmocka_unit_test_setup_teardown(torture_options_config_match,\n                                        setup, teardown),\n    };\n\n#ifdef WITH_SERVER\n    struct CMUnitTest sshbind_tests[] = {\n        cmocka_unit_test_setup_teardown(torture_bind_options_import_key,\n                sshbind_setup, sshbind_teardown),\n        cmocka_unit_test_setup_teardown(torture_bind_options_hostkey,\n                sshbind_setup, sshbind_teardown),\n        cmocka_unit_test_setup_teardown(torture_bind_options_bindaddr,\n                sshbind_setup, sshbind_teardown),\n        cmocka_unit_test_setup_teardown(torture_bind_options_bindport,\n                sshbind_setup, sshbind_teardown),\n        cmocka_unit_test_setup_teardown(torture_bind_options_bindport_str,\n                sshbind_setup, sshbind_teardown),\n        cmocka_unit_test_setup_teardown(torture_bind_options_log_verbosity,\n                sshbind_setup, sshbind_teardown),\n        cmocka_unit_test_setup_teardown(torture_bind_options_log_verbosity_str,\n                sshbind_setup, sshbind_teardown),\n#ifdef HAVE_DSA\n        cmocka_unit_test_setup_teardown(torture_bind_options_dsakey,\n                sshbind_setup, sshbind_teardown),\n#endif\n        cmocka_unit_test_setup_teardown(torture_bind_options_rsakey,\n                sshbind_setup, sshbind_teardown),\n#ifdef HAVE_ECC\n        cmocka_unit_test_setup_teardown(torture_bind_options_ecdsakey,\n                sshbind_setup, sshbind_teardown),\n#endif\n        cmocka_unit_test_setup_teardown(torture_bind_options_banner,\n                sshbind_setup, sshbind_teardown),\n        cmocka_unit_test_setup_teardown(torture_bind_options_set_ciphers,\n                sshbind_setup, sshbind_teardown),\n        cmocka_unit_test_setup_teardown(torture_bind_options_set_key_exchange,\n                sshbind_setup, sshbind_teardown),\n        cmocka_unit_test_setup_teardown(torture_bind_options_set_macs,\n                sshbind_setup, sshbind_teardown),\n        cmocka_unit_test_setup_teardown(torture_bind_options_parse_config,\n                sshbind_setup, sshbind_teardown),\n        cmocka_unit_test_setup_teardown(torture_bind_options_config_dir,\n                sshbind_setup, sshbind_teardown),\n        cmocka_unit_test_setup_teardown(torture_bind_options_set_pubkey_accepted_key_types,\n                                        sshbind_setup, sshbind_teardown),\n        cmocka_unit_test_setup_teardown(torture_bind_options_set_hostkey_algorithms,\n                                        sshbind_setup, sshbind_teardown),\n    };\n#endif /* WITH_SERVER */\n\n    ssh_init();\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, NULL, NULL);\n#ifdef WITH_SERVER\n    rc += cmocka_run_group_tests(sshbind_tests, NULL, NULL);\n#endif /* WITH_SERVER */\n    ssh_finalize();\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/unittests/torture_packet.c",
    "content": "#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include \"torture.h\"\n#include \"libssh/libssh.h\"\n#include \"libssh/session.h\"\n#include \"libssh/crypto.h\"\n#include \"libssh/buffer.h\"\n#include \"libssh/socket.h\"\n#include \"libssh/callbacks.h\"\n\n#include \"socket.c\"\n\nuint8_t test_data[]=\"AThis is test data. Use it to check the validity of packet functions\"\n                    \"AThis is test data. Use it to check the validity of packet functions\"\n                    \"AThis is test data. Use it to check the validity of packet functions\"\n                    \"AThis is test data. Use it to check the validity of packet functions\";\nuint8_t key[]=\"iekaeshoa7ooCie2shai8shahngee3ONsee3xoishooj0ojei6aeChieth1iraPh\";\nuint8_t iv[]=\"eixaxughoomah4ui7Aew3ohxuolaifuu\";\nuint8_t mac[]=\"thook2Jai0ahmahyae7ChuuruoPhee8Y\";\n\nstatic uint8_t *copy_data(uint8_t *data, size_t len){\n    uint8_t *ret = malloc(len);\n    assert_non_null(ret);\n    memcpy(ret, data, len);\n    return ret;\n}\n\nstatic SSH_PACKET_CALLBACK(copy_packet_data){\n    uint8_t *response = user;\n    size_t len = ssh_buffer_get_len(packet);\n    (void)type;\n    (void)session;\n\n    if(len > 1024){\n        len = 1024;\n    }\n    ssh_buffer_get_data(packet, response, len);\n\n    return 0;\n}\n\nstatic void\ntorture_packet(const char *cipher, const char *mac_type,\n               const char *comp_type, size_t payload_len)\n{\n    ssh_session session = ssh_new();\n    int verbosity = torture_libssh_verbosity();\n    struct ssh_crypto_struct *crypto;\n    struct ssh_cipher_struct *in_cipher;\n    struct ssh_cipher_struct *out_cipher;\n    int rc;\n    int sockets[2];\n    uint8_t buffer[1024];\n    uint8_t response[1024];\n    size_t encrypted_packet_len;\n    ssh_packet_callback callbacks[]={copy_packet_data};\n    struct ssh_packet_callbacks_struct cb = {\n            .start='A',\n            .n_callbacks=1,\n            .callbacks=callbacks,\n            .user=response\n    };\n    int cmp;\n\n    assert_non_null(session);\n    ssh_options_set(session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity);\n    crypto = session->next_crypto;\n\n    rc = socketpair(AF_UNIX, SOCK_STREAM, 0, sockets);\n    assert_int_equal(rc, 0);\n\n    crypto->kex_methods[SSH_KEX] = strdup(\"curve25519-sha256@libssh.org\");\n    crypto->kex_methods[SSH_HOSTKEYS] = strdup(\"ssh-rsa\");\n    crypto->kex_methods[SSH_CRYPT_C_S] = strdup(cipher);\n    crypto->kex_methods[SSH_CRYPT_S_C] = strdup(cipher);\n    crypto->kex_methods[SSH_MAC_C_S] = strdup(mac_type);\n    crypto->kex_methods[SSH_MAC_S_C] = strdup(mac_type);\n    crypto->kex_methods[SSH_COMP_C_S] = strdup(comp_type);\n    crypto->kex_methods[SSH_COMP_S_C] = strdup(comp_type);\n    crypto->kex_methods[SSH_LANG_C_S] = strdup(\"none\");\n    crypto->kex_methods[SSH_LANG_S_C] = strdup(\"none\");\n    rc = crypt_set_algorithms_client(session);\n    assert_int_equal(rc, SSH_OK);\n    session->current_crypto = session->next_crypto;\n    session->next_crypto = crypto_new();\n    crypto->encryptkey = copy_data(key, sizeof(key));\n    crypto->decryptkey = copy_data(key, sizeof(key));\n    crypto->encryptIV = copy_data(iv, sizeof(iv));\n    crypto->decryptIV = copy_data(iv, sizeof(iv));\n    crypto->encryptMAC = copy_data(mac, sizeof(mac));\n    crypto->decryptMAC = copy_data(mac, sizeof(mac));\n\n    in_cipher = session->current_crypto->in_cipher;\n    rc = in_cipher->set_decrypt_key(in_cipher,\n                                    session->current_crypto->decryptkey,\n                                    session->current_crypto->decryptIV);\n    assert_int_equal(rc, SSH_OK);\n\n    out_cipher = session->current_crypto->out_cipher;\n    rc = out_cipher->set_encrypt_key(out_cipher,\n                                     session->current_crypto->encryptkey,\n                                     session->current_crypto->encryptIV);\n    session->current_crypto->used = SSH_DIRECTION_BOTH;\n    assert_int_equal(rc, SSH_OK);\n\n    assert_non_null(session->out_buffer);\n    ssh_buffer_add_data(session->out_buffer, test_data, payload_len);\n    session->socket->fd = sockets[0];\n    session->socket->write_wontblock = 1;\n    rc = ssh_packet_send(session);\n    assert_int_equal(rc, SSH_OK);\n\n    rc = recv(sockets[1], buffer, sizeof(buffer), 0);\n    assert_true(rc > 0);\n    encrypted_packet_len = rc;\n    cmp = strcmp(comp_type, \"none\");\n    if (cmp == 0) {\n        assert_in_range(encrypted_packet_len,\n                        payload_len + 4,\n                        payload_len + (32 * 3));\n    }\n    rc = send(sockets[0], buffer, encrypted_packet_len, 0);\n    assert_int_equal(rc, encrypted_packet_len);\n\n    ssh_packet_set_callbacks(session, &cb);\n    explicit_bzero(response, sizeof(response));\n    rc = ssh_packet_socket_callback(buffer, encrypted_packet_len, session);\n    assert_int_not_equal(rc, SSH_ERROR);\n    if(payload_len > 0){\n        assert_memory_equal(response, test_data+1, payload_len-1);\n    }\n    close(sockets[0]);\n    close(sockets[1]);\n    session->socket->fd = SSH_INVALID_SOCKET;\n    ssh_free(session);\n}\n\nstatic void torture_packet_aes128_ctr_etm(UNUSED_PARAM(void **state))\n{\n    int i;\n    for (i = 1; i < 256; ++i) {\n        torture_packet(\"aes128-ctr\", \"hmac-sha1-etm@openssh.com\", \"none\", i);\n    }\n}\n\nstatic void torture_packet_aes192_ctr_etm(UNUSED_PARAM(void **state))\n{\n    int i;\n    for (i = 1; i < 256; ++i) {\n        torture_packet(\"aes192-ctr\", \"hmac-sha1-etm@openssh.com\", \"none\", i);\n    }\n}\n\nstatic void torture_packet_aes256_ctr_etm(UNUSED_PARAM(void **state))\n{\n    int i;\n    for (i = 1; i < 256; ++i) {\n        torture_packet(\"aes256-ctr\", \"hmac-sha1-etm@openssh.com\", \"none\", i);\n    }\n}\n\nstatic void torture_packet_aes128_ctr(void **state)\n{\n    int i;\n    (void)state; /* unused */\n    for (i=1;i<256;++i){\n        torture_packet(\"aes128-ctr\", \"hmac-sha1\", \"none\", i);\n    }\n}\n\nstatic void torture_packet_aes192_ctr(void **state)\n{\n    int i;\n    (void)state; /* unused */\n    for (i=1;i<256;++i){\n        torture_packet(\"aes192-ctr\", \"hmac-sha1\", \"none\", i);\n    }\n}\n\nstatic void torture_packet_aes256_ctr(void **state)\n{\n    int i;\n    (void)state; /* unused */\n    for (i=1;i<256;++i){\n        torture_packet(\"aes256-ctr\", \"hmac-sha1\", \"none\", i);\n    }\n}\n\nstatic void torture_packet_aes128_cbc(void **state)\n{\n    int i;\n    (void)state; /* unused */\n    for (i=1;i<256;++i){\n        torture_packet(\"aes128-cbc\", \"hmac-sha1\", \"none\", i);\n    }\n}\n\nstatic void torture_packet_aes192_cbc(void **state)\n{\n    int i;\n    (void)state; /* unused */\n    for (i=1;i<256;++i){\n        torture_packet(\"aes192-cbc\", \"hmac-sha1\", \"none\", i);\n    }\n}\n\nstatic void torture_packet_aes256_cbc(void **state)\n{\n    int i;\n    (void)state; /* unused */\n    for (i=1;i<256;++i){\n        torture_packet(\"aes256-cbc\", \"hmac-sha1\", \"none\", i);\n    }\n}\n\nstatic void torture_packet_aes128_cbc_etm(UNUSED_PARAM(void **state))\n{\n    int i;\n    for (i = 1; i < 256; ++i) {\n        torture_packet(\"aes128-cbc\", \"hmac-sha1-etm@openssh.com\", \"none\", i);\n    }\n}\n\nstatic void torture_packet_aes192_cbc_etm(UNUSED_PARAM(void **state))\n{\n    int i;\n    for (i = 1; i < 256; ++i) {\n        torture_packet(\"aes192-cbc\", \"hmac-sha1-etm@openssh.com\", \"none\", i);\n    }\n}\n\nstatic void torture_packet_aes256_cbc_etm(UNUSED_PARAM(void **state))\n{\n    int i;\n    for (i = 1; i < 256; ++i) {\n        torture_packet(\"aes256-cbc\", \"hmac-sha1-etm@openssh.com\", \"none\", i);\n    }\n}\n\nstatic void torture_packet_3des_cbc(void **state)\n{\n    int i;\n    (void)state; /* unused */\n    for (i=1;i<256;++i){\n        torture_packet(\"3des-cbc\", \"hmac-sha1\", \"none\", i);\n    }\n}\n\nstatic void torture_packet_3des_cbc_etm(UNUSED_PARAM(void **state))\n{\n    int i;\n    for (i = 1; i < 256; ++i) {\n        torture_packet(\"3des-cbc\", \"hmac-sha1-etm@openssh.com\", \"none\", i);\n    }\n}\n\nstatic void torture_packet_chacha20(void **state)\n{\n    int i;\n    (void)state; /* unused */\n    for (i=1;i<256;++i){\n        torture_packet(\"chacha20-poly1305@openssh.com\", \"none\", \"none\", i);\n    }\n}\n\nstatic void torture_packet_aes128_gcm(void **state)\n{\n    int i;\n    (void)state; /* unused */\n    for (i=1;i<256;++i){\n        torture_packet(\"aes128-gcm@openssh.com\", \"none\", \"none\", i);\n    }\n}\n\nstatic void torture_packet_aes256_gcm(void **state)\n{\n    int i;\n    (void)state; /* unused */\n    for (i=1;i<256;++i){\n        torture_packet(\"aes256-gcm@openssh.com\", \"none\", \"none\", i);\n    }\n}\n\nstatic void torture_packet_compress_zlib(void **state)\n{\n    int i;\n    (void)state; /* unused */\n    for (i=1;i<256;++i){\n        torture_packet(\"aes256-ctr\", \"hmac-sha1\", \"zlib\", i);\n    }\n}\n\nstatic void torture_packet_compress_zlib_openssh(void **state)\n{\n    int i;\n    (void)state; /* unused */\n    for (i=1;i<256;++i){\n        torture_packet(\"aes256-ctr\", \"hmac-sha1\", \"zlib@openssh.com\", i);\n    }\n}\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test(torture_packet_aes128_ctr),\n        cmocka_unit_test(torture_packet_aes192_ctr),\n        cmocka_unit_test(torture_packet_aes256_ctr),\n        cmocka_unit_test(torture_packet_aes128_ctr_etm),\n        cmocka_unit_test(torture_packet_aes192_ctr_etm),\n        cmocka_unit_test(torture_packet_aes256_ctr_etm),\n        cmocka_unit_test(torture_packet_aes128_cbc),\n        cmocka_unit_test(torture_packet_aes192_cbc),\n        cmocka_unit_test(torture_packet_aes256_cbc),\n        cmocka_unit_test(torture_packet_aes128_cbc_etm),\n        cmocka_unit_test(torture_packet_aes192_cbc_etm),\n        cmocka_unit_test(torture_packet_aes256_cbc_etm),\n        cmocka_unit_test(torture_packet_3des_cbc),\n        cmocka_unit_test(torture_packet_3des_cbc_etm),\n        cmocka_unit_test(torture_packet_chacha20),\n        cmocka_unit_test(torture_packet_aes128_gcm),\n        cmocka_unit_test(torture_packet_aes256_gcm),\n        cmocka_unit_test(torture_packet_compress_zlib),\n        cmocka_unit_test(torture_packet_compress_zlib_openssh),\n    };\n\n    ssh_init();\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, NULL, NULL);\n    ssh_finalize();\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/unittests/torture_packet_filter.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2018 by Anderson Toshiyuki Sasaki <ansasaki@redhat.com>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n/*\n * This test checks if the messages accepted by the packet filter were intented\n * to be accepted.\n *\n * The process consists in 2 steps:\n *   - Try the filter with a message type in an arbitrary state\n *   - If the message is accepted by the filter, check if the message is in the\n *     set of accepted states.\n *\n * Only the values selected by the flag (COMPARE_*) are considered.\n * */\n\n#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include \"torture.h\"\n#include \"libssh/priv.h\"\n#include \"libssh/libssh.h\"\n#include \"libssh/session.h\"\n#include \"libssh/auth.h\"\n#include \"libssh/ssh2.h\"\n#include \"libssh/packet.h\"\n\n#include \"packet.c\"\n\n#define COMPARE_SESSION_STATE       1\n#define COMPARE_ROLE                (1 << 1)\n#define COMPARE_DH_STATE            (1 << 2)\n#define COMPARE_AUTH_STATE          (1 << 3)\n#define COMPARE_GLOBAL_REQ_STATE    (1 << 4)\n#define COMPARE_CURRENT_METHOD      (1 << 5)\n\n#define SESSION_STATE_COUNT 11\n#define DH_STATE_COUNT 4\n#define AUTH_STATE_COUNT 15\n#define GLOBAL_REQ_STATE_COUNT 5\n#define MESSAGE_COUNT 100 // from 1 to 100\n\n#define ROLE_CLIENT 0\n#define ROLE_SERVER 1\n\n/*\n * This is the list of currently unfiltered message types.\n * Only unrecognized types should be in this list.\n * */\nstatic uint8_t unfiltered[] = {\n    8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,\n    22, 23, 24, 25, 26, 27, 28, 29,\n    35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,\n    54, 55, 56, 57, 58, 59,\n    62,\n    67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,\n    83, 84, 85, 86, 87, 88, 89,\n};\n\ntypedef struct global_state_st {\n    /* If the bit in this flag is zero, the corresponding state is not\n     * considered, working as a wildcard (meaning any value is accepted) */\n    uint32_t flags;\n    uint8_t role;\n    enum ssh_session_state_e session;\n    enum ssh_dh_state_e dh;\n    enum ssh_auth_state_e auth;\n    enum ssh_channel_request_state_e global_req;\n} global_state;\n\nstatic int cmp_state(const void *e1, const void *e2)\n{\n    global_state *s1 = (global_state *) e1;\n    global_state *s2 = (global_state *) e2;\n\n    /* Compare role (client == 0 or server == 1)*/\n    if (s1->role < s2->role) {\n        return -1;\n    }\n    else if (s1->role > s2->role) {\n        return 1;\n    }\n\n    /* Compare session state */\n    if (s1->session < s2->session) {\n        return -1;\n    }\n    else if (s1->session > s2->session) {\n        return 1;\n    }\n\n    /* Compare DH state */\n    if (s1->dh < s2->dh) {\n        return -1;\n    }\n    else if (s1->dh > s2->dh) {\n        return 1;\n    }\n\n    /* Compare auth */\n    if (s1->auth < s2->auth) {\n        return -1;\n    }\n    else if (s1->auth > s2->auth) {\n        return 1;\n    }\n\n    /* Compare global_req */\n    if (s1->global_req < s2->global_req) {\n        return -1;\n    }\n    else if (s1->global_req > s2->global_req) {\n        return 1;\n    }\n\n    /* If all equal, they are equal */\n    return 0;\n}\n\nstatic int cmp_state_search(const void *key, const void *array_element)\n{\n    global_state *s1 = (global_state *) key;\n    global_state *s2 = (global_state *) array_element;\n\n    int result = 0;\n\n    if (s2->flags & COMPARE_ROLE) {\n        /* Compare role (client == 0 or server == 1)*/\n        if (s1->role < s2->role) {\n            return -1;\n        }\n        else if (s1->role > s2->role) {\n            return 1;\n        }\n    }\n\n    if (s2->flags & COMPARE_SESSION_STATE) {\n        /* Compare session state */\n        if (s1->session < s2->session) {\n            result = -1;\n            goto end;\n        }\n        else if (s1->session > s2->session) {\n            result = 1;\n            goto end;\n        }\n    }\n\n    if (s2->flags & COMPARE_DH_STATE) {\n        /* Compare DH state */\n        if (s1->dh < s2->dh) {\n            result = -1;\n            goto end;\n        }\n        else if (s1->dh > s2->dh) {\n            result = 1;\n            goto end;\n        }\n    }\n\n    if (s2->flags & COMPARE_AUTH_STATE) {\n        /* Compare auth */\n        if (s1->auth < s2->auth) {\n            result = -1;\n            goto end;\n        }\n        else if (s1->auth > s2->auth) {\n            result = 1;\n            goto end;\n        }\n    }\n\n    if (s2->flags & COMPARE_GLOBAL_REQ_STATE) {\n        /* Compare global_req */\n        if (s1->global_req < s2->global_req) {\n            result = -1;\n            goto end;\n        }\n        else if (s1->global_req > s2->global_req) {\n            result = 1;\n            goto end;\n        }\n    }\n\nend:\n    return result;\n}\n\nstatic int is_state_accepted(global_state *tested, global_state *accepted,\n                             int accepted_len)\n{\n    global_state *found = NULL;\n\n    found = bsearch(tested, accepted, accepted_len, sizeof(global_state),\n                    cmp_state_search);\n\n    if (found != NULL) {\n        return 1;\n    }\n\n    return 0;\n}\n\nstatic int cmp_uint8(const void *i, const void *j)\n{\n    uint8_t e1 = *((uint8_t *)i);\n    uint8_t e2 = *((uint8_t *)j);\n\n    if (e1 < e2) {\n        return -1;\n    }\n    else if (e1 > e2) {\n        return 1;\n    }\n\n    return 0;\n}\n\nstatic int check_unfiltered(uint8_t msg_type)\n{\n    uint8_t *found;\n\n    found = bsearch(&msg_type, unfiltered, sizeof(unfiltered)/sizeof(uint8_t),\n                    sizeof(uint8_t), cmp_uint8);\n\n    if (found != NULL) {\n        return 1;\n    }\n\n    return 0;\n}\n\nstatic void torture_packet_filter_check_unfiltered(void **state)\n{\n    ssh_session session;\n\n    int role_c;\n    int auth_c;\n    int session_c;\n    int dh_c;\n    int global_req_c;\n\n    uint8_t msg_type;\n\n    enum ssh_packet_filter_result_e rc;\n    int in_unfiltered;\n\n    (void)state;\n\n    session = ssh_new();\n\n    for (msg_type = 1; msg_type <= MESSAGE_COUNT; msg_type++) {\n        session->in_packet.type = msg_type;\n        for (role_c = 0; role_c < 2; role_c++) {\n            session->server = role_c;\n            for (session_c = 0; session_c < SESSION_STATE_COUNT; session_c++) {\n                session->session_state = session_c;\n                for (dh_c = 0; dh_c < DH_STATE_COUNT; dh_c++) {\n                    session->dh_handshake_state = dh_c;\n                    for (auth_c = 0; auth_c < AUTH_STATE_COUNT; auth_c++) {\n                        session->auth.state = auth_c;\n                        for (global_req_c = 0;\n                                global_req_c < GLOBAL_REQ_STATE_COUNT;\n                                global_req_c++)\n                        {\n                            session->global_req_state = global_req_c;\n\n                            rc = ssh_packet_incoming_filter(session);\n\n                            if (rc == SSH_PACKET_UNKNOWN) {\n                                in_unfiltered = check_unfiltered(msg_type);\n\n                                if (!in_unfiltered) {\n                                    fprintf(stderr, \"Message type %d UNFILTERED \"\n                                            \"in state: role %d, session %d, dh %d, auth %d\\n\",\n                                            msg_type, role_c, session_c, dh_c, auth_c);\n                                }\n                                assert_int_equal(in_unfiltered, 1);\n                            }\n                            else {\n                                in_unfiltered = check_unfiltered(msg_type);\n\n                                if (in_unfiltered) {\n                                    fprintf(stderr, \"Message type %d NOT UNFILTERED \"\n                                            \"in state: role %d, session %d, dh %d, auth %d\\n\",\n                                            msg_type, role_c, session_c, dh_c, auth_c);\n                                }\n                                assert_int_equal(in_unfiltered, 0);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n    ssh_free(session);\n}\n\nstatic int check_message_in_all_states(global_state accepted[],\n                                       int accepted_count, uint8_t msg_type)\n{\n    ssh_session session;\n\n    int role_c;\n    int auth_c;\n    int session_c;\n    int dh_c;\n    int global_req_c;\n\n    enum ssh_packet_filter_result_e rc;\n    int in_accepted;\n\n    global_state key;\n\n    session = ssh_new();\n\n    /* Sort the accepted array so that the elements can be searched using\n     * bsearch */\n    qsort(accepted, accepted_count, sizeof(global_state), cmp_state);\n\n    session->in_packet.type = msg_type;\n\n    for (role_c = 0; role_c < 2; role_c++) {\n        session->server = role_c;\n        key.role = role_c;\n        for (session_c = 0; session_c < SESSION_STATE_COUNT; session_c++) {\n            session->session_state = session_c;\n            key.session = session_c;\n            for (dh_c = 0; dh_c < DH_STATE_COUNT; dh_c++) {\n                session->dh_handshake_state = dh_c;\n                key.dh = dh_c;\n                for (auth_c = 0; auth_c < AUTH_STATE_COUNT; auth_c++) {\n                    session->auth.state = auth_c;\n                    key.auth = auth_c;\n                    for (global_req_c = 0;\n                         global_req_c < GLOBAL_REQ_STATE_COUNT;\n                         global_req_c++)\n                    {\n                        session->global_req_state = global_req_c;\n                        key.global_req = global_req_c;\n\n                        rc = ssh_packet_incoming_filter(session);\n\n                        if (rc == SSH_PACKET_ALLOWED) {\n                            in_accepted = is_state_accepted(&key, accepted,\n                                                         accepted_count);\n\n                            if (!in_accepted) {\n                                fprintf(stderr, \"Message type %d ALLOWED \"\n                                        \"in state: role %d, session %d, dh %d, auth %d\\n\",\n                                        msg_type, role_c, session_c, dh_c, auth_c);\n                            }\n                            assert_int_equal(in_accepted, 1);\n                        }\n                        else if (rc == SSH_PACKET_DENIED) {\n                            in_accepted = is_state_accepted(&key, accepted, accepted_count);\n\n                            if (in_accepted) {\n                                fprintf(stderr, \"Message type %d DENIED \"\n                                        \"in state: role %d, session %d, dh %d, auth %d\\n\",\n                                        msg_type, role_c, session_c, dh_c, auth_c);\n                            }\n                            assert_int_equal(in_accepted, 0);\n                        }\n                        else {\n                            fprintf(stderr, \"Message type %d UNFILTERED \"\n                                    \"in state: role %d, session %d, dh %d, auth %d\\n\",\n                                    msg_type, role_c, session_c, dh_c, auth_c);\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    ssh_free(session);\n    return 0;\n}\n\nstatic void torture_packet_filter_check_auth_success(void **state)\n{\n    int rc;\n\n    global_state accepted[] = {\n        {\n            .flags = (COMPARE_SESSION_STATE |\n                    COMPARE_ROLE |\n                    COMPARE_AUTH_STATE |\n                    COMPARE_DH_STATE),\n            .role = ROLE_CLIENT,\n            .session = SSH_SESSION_STATE_AUTHENTICATING,\n            .dh = DH_STATE_FINISHED,\n            .auth = SSH_AUTH_STATE_PUBKEY_AUTH_SENT,\n        },\n        {\n            .flags = (COMPARE_SESSION_STATE |\n                    COMPARE_ROLE |\n                    COMPARE_AUTH_STATE |\n                    COMPARE_DH_STATE),\n            .role = ROLE_CLIENT,\n            .session = SSH_SESSION_STATE_AUTHENTICATING,\n            .dh = DH_STATE_FINISHED,\n            .auth = SSH_AUTH_STATE_PASSWORD_AUTH_SENT,\n        },\n        {\n            .flags = (COMPARE_SESSION_STATE |\n                    COMPARE_ROLE |\n                    COMPARE_AUTH_STATE |\n                    COMPARE_DH_STATE),\n            .role = ROLE_CLIENT,\n            .session = SSH_SESSION_STATE_AUTHENTICATING,\n            .dh = DH_STATE_FINISHED,\n            .auth = SSH_AUTH_STATE_GSSAPI_MIC_SENT,\n        },\n        {\n            .flags = (COMPARE_SESSION_STATE |\n                    COMPARE_ROLE |\n                    COMPARE_AUTH_STATE |\n                    COMPARE_DH_STATE),\n            .role = ROLE_CLIENT,\n            .session = SSH_SESSION_STATE_AUTHENTICATING,\n            .dh = DH_STATE_FINISHED,\n            .auth = SSH_AUTH_STATE_KBDINT_SENT,\n        },\n        {\n            .flags = (COMPARE_SESSION_STATE |\n                    COMPARE_ROLE |\n                    COMPARE_AUTH_STATE |\n                    COMPARE_DH_STATE |\n                    COMPARE_CURRENT_METHOD),\n            .role = ROLE_CLIENT,\n            .session = SSH_SESSION_STATE_AUTHENTICATING,\n            .dh = DH_STATE_FINISHED,\n            .auth = SSH_AUTH_STATE_AUTH_NONE_SENT,\n        }\n    };\n\n    int accepted_count = 5;\n\n    /* Unused */\n    (void) state;\n\n    rc = check_message_in_all_states(accepted, accepted_count,\n            SSH2_MSG_USERAUTH_SUCCESS);\n\n    assert_int_equal(rc, 0);\n}\n\nstatic void torture_packet_filter_check_msg_ext_info(void **state)\n{\n    int rc;\n\n    global_state accepted[] = {\n        {\n            .flags = (COMPARE_SESSION_STATE |\n                    COMPARE_DH_STATE),\n            .session = SSH_SESSION_STATE_AUTHENTICATING,\n            .dh = DH_STATE_FINISHED,\n        },\n        {\n            .flags = (COMPARE_SESSION_STATE |\n                    COMPARE_DH_STATE),\n            .session = SSH_SESSION_STATE_AUTHENTICATED,\n            .dh = DH_STATE_FINISHED,\n        },\n    };\n\n    int accepted_count = 2;\n\n    /* Unused */\n    (void) state;\n\n    rc = check_message_in_all_states(accepted, accepted_count,\n            SSH2_MSG_EXT_INFO);\n\n    assert_int_equal(rc, 0);\n}\n\nstatic void torture_packet_filter_check_channel_open(void **state)\n{\n    int rc;\n\n    /* The only condition to accept a CHANNEL_OPEN is to be authenticated */\n    global_state accepted[] = {\n        {\n            .flags = COMPARE_SESSION_STATE,\n            .session = SSH_SESSION_STATE_AUTHENTICATED,\n        }\n    };\n\n    int accepted_count = 1;\n\n    /* Unused */\n    (void) state;\n\n    rc = check_message_in_all_states(accepted, accepted_count,\n            SSH2_MSG_CHANNEL_OPEN);\n\n    assert_int_equal(rc, 0);\n}\n\nint torture_run_tests(void)\n{\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test(torture_packet_filter_check_auth_success),\n        cmocka_unit_test(torture_packet_filter_check_channel_open),\n        cmocka_unit_test(torture_packet_filter_check_unfiltered),\n        cmocka_unit_test(torture_packet_filter_check_msg_ext_info)\n    };\n\n    ssh_init();\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, NULL, NULL);\n    ssh_finalize();\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/unittests/torture_pki.c",
    "content": "#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include <sys/stat.h>\n#include <fcntl.h>\n\n#include \"torture.h\"\n#include \"torture_pki.h\"\n#include \"torture_key.h\"\n#include \"pki.c\"\n\nconst unsigned char INPUT[] = \"1234567890123456789012345678901234567890\"\n                              \"123456789012345678901234\";\n\nconst char template[] = \"temp_dir_XXXXXX\";\n\nstruct pki_st {\n    char *cwd;\n    char *temp_dir;\n};\n\nstatic int setup_cert_dir(void **state)\n{\n    struct pki_st *test_state = NULL;\n    char *cwd = NULL;\n    char *tmp_dir = NULL;\n    int rc = 0;\n\n    test_state = (struct pki_st *)malloc(sizeof(struct pki_st));\n    assert_non_null(test_state);\n\n    cwd = torture_get_current_working_dir();\n    assert_non_null(cwd);\n\n    tmp_dir = torture_make_temp_dir(template);\n    assert_non_null(tmp_dir);\n\n    test_state->cwd = cwd;\n    test_state->temp_dir = tmp_dir;\n\n    *state = test_state;\n\n    rc = torture_change_dir(tmp_dir);\n    assert_int_equal(rc, 0);\n\n    printf(\"Changed directory to: %s\\n\", tmp_dir);\n\n    return 0;\n}\n\nstatic int teardown_cert_dir(void **state) {\n\n    struct pki_st *test_state = NULL;\n    int rc = 0;\n\n    test_state = *((struct pki_st **)state);\n\n    assert_non_null(test_state);\n    assert_non_null(test_state->cwd);\n    assert_non_null(test_state->temp_dir);\n\n    rc = torture_change_dir(test_state->cwd);\n    assert_int_equal(rc, 0);\n\n    rc = torture_rmdirs(test_state->temp_dir);\n    assert_int_equal(rc, 0);\n\n    SAFE_FREE(test_state->temp_dir);\n    SAFE_FREE(test_state->cwd);\n    SAFE_FREE(test_state);\n\n    return 0;\n}\n\nstatic void torture_pki_keytype(void **state) {\n    enum ssh_keytypes_e type;\n    const char *type_c;\n\n    (void) state; /* unused */\n\n    type = ssh_key_type(NULL);\n    assert_true(type == SSH_KEYTYPE_UNKNOWN);\n\n    type = ssh_key_type_from_name(NULL);\n    assert_true(type == SSH_KEYTYPE_UNKNOWN);\n\n    type = ssh_key_type_from_name(\"42\");\n    assert_true(type == SSH_KEYTYPE_UNKNOWN);\n\n    type_c = ssh_key_type_to_char(SSH_KEYTYPE_UNKNOWN);\n    assert_null(type_c);\n\n    type_c = ssh_key_type_to_char(42);\n    assert_null(type_c);\n}\n\nstatic void torture_pki_signature(void **state)\n{\n    ssh_signature sig;\n\n    (void) state; /* unused */\n\n    sig = ssh_signature_new();\n    assert_non_null(sig);\n\n    ssh_signature_free(sig);\n}\n\nstruct key_attrs {\n    int sign;\n    int verify;\n    const char *type_c;\n    int size_arg;\n    int sig_length;\n    const char *sig_type_c;\n    int expect_success;\n};\n\nstruct key_attrs key_attrs_list[][5] = {\n    {\n        {0, 0, \"\", 0, 0, \"\", 0}, /* UNKNOWN, AUTO */\n        {0, 0, \"\", 0, 0, \"\", 0}, /* UNKNOWN, SHA1 */\n        {0, 0, \"\", 0, 0, \"\", 0}, /* UNKNOWN, SHA256 */\n        {0, 0, \"\", 0, 0, \"\", 0}, /* UNKNOWN, SHA384 */\n        {0, 0, \"\", 0, 0, \"\", 0}, /* UNKNOWN, SHA512 */\n    },\n#ifdef HAVE_DSA\n    {\n        {1, 1, \"ssh-dss\", 1024, 0, \"\", 0},         /* DSS, AUTO */\n        {1, 1, \"ssh-dss\", 1024, 20, \"ssh-dss\", 1}, /* DSS, SHA1 */\n        {1, 1, \"ssh-dss\", 1024, 0, \"\", 0},         /* DSS, SHA256 */\n        {1, 1, \"ssh-dss\", 1024, 0, \"\", 0},         /* DSS, SHA384 */\n        {1, 1, \"ssh-dss\", 1024, 0, \"\", 0},         /* DSS, SHA512 */\n    },\n#else\n    {\n        {0, 0, \"\", 0, 0, \"\", 0}, /* DSS, AUTO */\n        {0, 0, \"\", 0, 0, \"\", 0}, /* DSS, SHA1 */\n        {0, 0, \"\", 0, 0, \"\", 0}, /* DSS, SHA256 */\n        {0, 0, \"\", 0, 0, \"\", 0}, /* DSS, SHA384 */\n        {0, 0, \"\", 0, 0, \"\", 0}, /* DSS, SHA512 */\n    },\n#endif /* HAVE_DSA */\n    {\n        {1, 1, \"ssh-rsa\", 2048, 0, \"\", 0},              /* RSA, AUTO */\n        {1, 1, \"ssh-rsa\", 2048, 20, \"ssh-rsa\", 1},      /* RSA, SHA1 */\n        {1, 1, \"ssh-rsa\", 2048, 32, \"rsa-sha2-256\", 1}, /* RSA, SHA256 */\n        {1, 1, \"ssh-rsa\", 2048, 0, \"\", 0},              /* RSA, SHA384 */\n        {1, 1, \"ssh-rsa\", 2048, 64, \"rsa-sha2-512\", 1}, /* RSA, SHA512 */\n    },\n    {\n        {0, 0, \"\", 0, 0, \"\", 0}, /* RSA1, AUTO */\n        {0, 0, \"\", 0, 0, \"\", 0}, /* RSA1, SHA1 */\n        {0, 0, \"\", 0, 0, \"\", 0}, /* RSA1, SHA256 */\n        {0, 0, \"\", 0, 0, \"\", 0}, /* RSA1, SHA384 */\n        {0, 0, \"\", 0, 0, \"\", 0}, /* RSA1, SHA512 */\n    },\n    {\n        {0, 1, \"\", 256, 0, \"\", 0}, /* ECDSA, AUTO */\n        {0, 1, \"\", 256, 0, \"\", 0}, /* ECDSA, SHA1 */\n        {0, 1, \"\", 256, 0, \"\", 0}, /* ECDSA, SHA256 */\n        {0, 1, \"\", 384, 0, \"\", 0}, /* ECDSA, SHA384 */\n        {0, 1, \"\", 521, 0, \"\", 0}, /* ECDSA, SHA512 */\n    },\n    {\n        {1, 1, \"ssh-ed25519\", 0, 33, \"ssh-ed25519\", 1}, /* ED25519, AUTO */\n        {1, 1, \"ssh-ed25519\", 0, 0, \"\", 0},             /* ED25519, SHA1 */\n        {1, 1, \"ssh-ed25519\", 0, 0, \"\", 0},             /* ED25519, SHA256 */\n        {1, 1, \"ssh-ed25519\", 0, 0, \"\", 0},             /* ED25519, SHA384 */\n        {1, 1, \"ssh-ed25519\", 0, 0, \"\", 0},             /* ED25519, SHA512 */\n    },\n#ifdef HAVE_DSA\n    {\n        {0, 1, \"\", 0, 0, \"\", 0}, /* DSS CERT, AUTO */\n        {0, 1, \"\", 0, 0, \"\", 0}, /* DSS CERT, SHA1 */\n        {0, 1, \"\", 0, 0, \"\", 0}, /* DSS CERT, SHA256 */\n        {0, 1, \"\", 0, 0, \"\", 0}, /* DSS CERT, SHA384 */\n        {0, 1, \"\", 0, 0, \"\", 0}, /* DSS CERT, SHA512 */\n    },\n#else\n    {\n        {0, 0, \"\", 0, 0, \"\", 0}, /* DSS CERT, AUTO */\n        {0, 0, \"\", 0, 0, \"\", 0}, /* DSS CERT, SHA1 */\n        {0, 0, \"\", 0, 0, \"\", 0}, /* DSS CERT, SHA256 */\n        {0, 0, \"\", 0, 0, \"\", 0}, /* DSS CERT, SHA384 */\n        {0, 0, \"\", 0, 0, \"\", 0}, /* DSS CERT, SHA512 */\n    },\n#endif /* HAVE_DSA */\n    {\n        {0, 1, \"\", 0, 0, \"\", 0}, /* RSA CERT, AUTO */\n        {0, 1, \"\", 0, 0, \"\", 0}, /* RSA CERT, SHA1 */\n        {0, 1, \"\", 0, 0, \"\", 0}, /* RSA CERT, SHA256 */\n        {0, 1, \"\", 0, 0, \"\", 0}, /* RSA CERT, SHA384 */\n        {0, 1, \"\", 0, 0, \"\", 0}, /* RSA CERT, SHA512 */\n    },\n#ifdef HAVE_ECC\n    {\n        {1, 1, \"ecdsa-sha2-nistp256\", 256, 0, \"\", 0},                     /* ECDSA P256, AUTO */\n        {1, 1, \"ecdsa-sha2-nistp256\", 256, 0, \"\", 0},                     /* ECDSA P256, SHA1 */\n        {1, 1, \"ecdsa-sha2-nistp256\", 256, 32, \"ecdsa-sha2-nistp256\", 1}, /* ECDSA P256, SHA256 */\n        {1, 1, \"ecdsa-sha2-nistp256\", 256, 0, \"\", 0},                     /* ECDSA P256, SHA384 */\n        {1, 1, \"ecdsa-sha2-nistp256\", 256, 0, \"\", 0},                     /* ECDSA P256, SHA512 */\n    },\n    {\n        {1, 1, \"ecdsa-sha2-nistp384\", 384, 0, \"\", 0},                     /* ECDSA P384, AUTO */\n        {1, 1, \"ecdsa-sha2-nistp384\", 384, 0, \"\", 0},                     /* ECDSA P384, SHA1 */\n        {1, 1, \"ecdsa-sha2-nistp384\", 384, 0, \"\", 0},                     /* ECDSA P384, SHA256 */\n        {1, 1, \"ecdsa-sha2-nistp384\", 384, 48, \"ecdsa-sha2-nistp384\", 1}, /* ECDSA P384, SHA384 */\n        {1, 1, \"ecdsa-sha2-nistp384\", 384, 0, \"\", 0},                     /* ECDSA P384, SHA512 */\n    },\n    {\n        {1, 1, \"ecdsa-sha2-nistp521\", 521, 0, \"\", 0},                     /* ECDSA P521, AUTO */\n        {1, 1, \"ecdsa-sha2-nistp521\", 521, 0, \"\", 0},                     /* ECDSA P521, SHA1 */\n        {1, 1, \"ecdsa-sha2-nistp521\", 521, 0, \"\", 0},                     /* ECDSA P521, SHA256 */\n        {1, 1, \"ecdsa-sha2-nistp521\", 521, 0, \"\", 0},                     /* ECDSA P521, SHA384 */\n        {1, 1, \"ecdsa-sha2-nistp521\", 521, 64, \"ecdsa-sha2-nistp521\", 1}, /* ECDSA P521, SHA512 */\n    },\n    {\n        {0, 1, \"\", 0, 0, \"\", 0}, /* ECDSA P256 CERT, AUTO */\n        {0, 1, \"\", 0, 0, \"\", 0}, /* ECDSA P256 CERT, SHA1 */\n        {0, 1, \"\", 0, 0, \"\", 0}, /* ECDSA P256 CERT, SHA256 */\n        {0, 1, \"\", 0, 0, \"\", 0}, /* ECDSA P256 CERT, SHA384 */\n        {0, 1, \"\", 0, 0, \"\", 0}, /* ECDSA P256 CERT, SHA512 */\n    },\n    {\n        {0, 1, \"\", 0, 0, \"\", 0}, /* ECDSA P384 CERT, AUTO */\n        {0, 1, \"\", 0, 0, \"\", 0}, /* ECDSA P384 CERT, SHA1 */\n        {0, 1, \"\", 0, 0, \"\", 0}, /* ECDSA P384 CERT, SHA256 */\n        {0, 1, \"\", 0, 0, \"\", 0}, /* ECDSA P384 CERT, SHA384 */\n        {0, 1, \"\", 0, 0, \"\", 0}, /* ECDSA P384 CERT, SHA512 */\n    },\n    {\n        {0, 1, \"\", 0, 0, \"\", 0}, /* ECDSA P521 CERT, AUTO */\n        {0, 1, \"\", 0, 0, \"\", 0}, /* ECDSA P521 CERT, SHA1 */\n        {0, 1, \"\", 0, 0, \"\", 0}, /* ECDSA P521 CERT, SHA256 */\n        {0, 1, \"\", 0, 0, \"\", 0}, /* ECDSA P521 CERT, SHA384 */\n        {0, 1, \"\", 0, 0, \"\", 0}, /* ECDSA P521 CERT, SHA512 */\n    },\n#endif /* HAVE_ECC */\n    {\n        {0, 1, \"\", 0, 0, \"\", 0}, /* ED25519 CERT, AUTO */\n        {0, 1, \"\", 0, 0, \"\", 0}, /* ED25519 CERT, SHA1 */\n        {0, 1, \"\", 0, 0, \"\", 0}, /* ED25519 CERT, SHA256 */\n        {0, 1, \"\", 0, 0, \"\", 0}, /* ED25519 CERT, SHA384 */\n        {0, 1, \"\", 0, 0, \"\", 0}, /* ED25519 CERT, SHA512 */\n    },\n};\n\n/* This tests all the base types and their signatures against each other */\nstatic void torture_pki_verify_mismatch(void **state)\n{\n    int rc;\n    int verbosity = torture_libssh_verbosity();\n    ssh_key key = NULL, verify_key = NULL, pubkey = NULL, verify_pubkey = NULL;\n    ssh_signature sign = NULL, import_sig = NULL, new_sig = NULL;\n    ssh_string blob;\n    ssh_session session = ssh_new();\n    enum ssh_keytypes_e key_type, sig_type;\n    enum ssh_digest_e hash;\n    size_t input_length = sizeof(INPUT);\n    struct key_attrs skey_attrs, vkey_attrs;\n\n    (void) state;\n\n    ssh_options_set(session, SSH_OPTIONS_LOG_VERBOSITY, &verbosity);\n\n    for (sig_type = SSH_KEYTYPE_DSS;\n         sig_type <= SSH_KEYTYPE_ED25519_CERT01;\n         sig_type++)\n    {\n        for (hash = SSH_DIGEST_AUTO;\n             hash <= SSH_DIGEST_SHA512;\n             hash++)\n        {\n            if (ssh_fips_mode()) {\n                if (sig_type == SSH_KEYTYPE_DSS ||\n                    sig_type == SSH_KEYTYPE_ED25519 ||\n                    hash == SSH_DIGEST_SHA1)\n                {\n                    /* In FIPS mode, skip unsupported algorithms */\n                    continue;\n                }\n            }\n\n            skey_attrs = key_attrs_list[sig_type][hash];\n\n            if (!skey_attrs.sign) {\n                continue;\n            }\n\n            rc = ssh_pki_generate(sig_type, skey_attrs.size_arg, &key);\n            assert_true(rc == SSH_OK);\n            assert_non_null(key);\n            assert_int_equal(key->type, sig_type);\n            assert_string_equal(key->type_c, skey_attrs.type_c);\n\n            SSH_LOG(SSH_LOG_TRACE, \"Creating signature %d with hash %d\",\n                    sig_type, hash);\n\n            if (skey_attrs.expect_success == 0) {\n                /* Expect error */\n                sign = pki_do_sign(key, INPUT, input_length, hash);\n                assert_null(sign);\n\n                SSH_KEY_FREE(key);\n                continue;\n            }\n\n            rc = ssh_pki_export_privkey_to_pubkey(key, &pubkey);\n            assert_int_equal(rc, SSH_OK);\n            assert_non_null(pubkey);\n\n            /* Create a valid signature using this key */\n            sign = pki_do_sign(key, INPUT, input_length, hash);\n            assert_non_null(sign);\n            assert_int_equal(sign->type, key->type);\n            assert_string_equal(sign->type_c, skey_attrs.sig_type_c);\n\n            /* Create a signature blob that can be imported and verified */\n            blob = pki_signature_to_blob(sign);\n            assert_non_null(blob);\n\n            /* Import and verify with current key\n             * (this is not tested anywhere else yet) */\n            import_sig = pki_signature_from_blob(key,\n                                                 blob,\n                                                 sig_type,\n                                                 hash);\n            assert_non_null(import_sig);\n            assert_int_equal(import_sig->type, key->type);\n            assert_string_equal(import_sig->type_c, skey_attrs.sig_type_c);\n\n            rc = ssh_pki_signature_verify(session,\n                                      import_sig,\n                                      pubkey,\n                                      INPUT,\n                                      input_length);\n            assert_true(rc == SSH_OK);\n\n            for (key_type = SSH_KEYTYPE_DSS;\n                 key_type <= SSH_KEYTYPE_ED25519_CERT01;\n                 key_type++)\n            {\n                if (ssh_fips_mode()) {\n                    if (key_type == SSH_KEYTYPE_DSS ||\n                        key_type == SSH_KEYTYPE_ED25519)\n                    {\n                        /* In FIPS mode, skip unsupported algorithms */\n                        continue;\n                    }\n                }\n\n                vkey_attrs = key_attrs_list[key_type][hash];\n                if (!vkey_attrs.verify) {\n                    continue;\n                }\n\n                SSH_LOG(SSH_LOG_TRACE, \"Trying key %d with signature %d\",\n                        key_type, sig_type);\n\n                if (is_cert_type(key_type)) {\n                    torture_write_file(\"libssh_testkey-cert.pub\",\n                       torture_get_testkey_pub(key_type));\n                    rc = ssh_pki_import_cert_file(\"libssh_testkey-cert.pub\", &verify_pubkey);\n                    verify_key = NULL;\n                } else {\n                    rc = ssh_pki_generate(key_type, vkey_attrs.size_arg, &verify_key);\n                    assert_int_equal(rc, SSH_OK);\n                    assert_non_null(verify_key);\n                    rc = ssh_pki_export_privkey_to_pubkey(verify_key, &verify_pubkey);\n                }\n                assert_int_equal(rc, SSH_OK);\n                assert_non_null(verify_pubkey);\n\n                /* Should gracefully fail, but not crash */\n                rc = ssh_pki_signature_verify(session,\n                                          sign,\n                                          verify_pubkey,\n                                          INPUT,\n                                          input_length);\n                assert_true(rc != SSH_OK);\n\n                /* Try the same with the imported signature */\n                rc = ssh_pki_signature_verify(session,\n                                          import_sig,\n                                          verify_pubkey,\n                                          INPUT,\n                                          input_length);\n                assert_true(rc != SSH_OK);\n\n                /* Try to import the signature blob with different key */\n                new_sig = pki_signature_from_blob(verify_pubkey,\n                                                  blob,\n                                                  sig_type,\n                                                  import_sig->hash_type);\n                if (ssh_key_type_plain(verify_pubkey->type) == sig_type) {\n                    /* Importing with the same key type should work */\n                    assert_non_null(new_sig);\n                    assert_int_equal(new_sig->type, key->type);\n                    assert_string_equal(new_sig->type_c, skey_attrs.sig_type_c);\n\n                    /* The verification should not work */\n                    rc = ssh_pki_signature_verify(session,\n                                              new_sig,\n                                              verify_pubkey,\n                                              INPUT,\n                                              input_length);\n                    assert_true(rc != SSH_OK);\n\n                    ssh_signature_free(new_sig);\n                } else {\n                    assert_null(new_sig);\n                }\n                SSH_KEY_FREE(verify_key);\n                SSH_KEY_FREE(verify_pubkey);\n            }\n\n            ssh_string_free(blob);\n            ssh_signature_free(sign);\n            ssh_signature_free(import_sig);\n\n            SSH_KEY_FREE(key);\n            SSH_KEY_FREE(pubkey);\n            key = NULL;\n        }\n    }\n\n    ssh_free(session);\n}\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test(torture_pki_keytype),\n        cmocka_unit_test(torture_pki_signature),\n        cmocka_unit_test_setup_teardown(torture_pki_verify_mismatch,\n                                        setup_cert_dir,\n                                        teardown_cert_dir),\n    };\n\n    ssh_init();\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, NULL, NULL);\n    ssh_finalize();\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/unittests/torture_pki_dsa.c",
    "content": "#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include <string.h>\n#include <sys/stat.h>\n#include <fcntl.h>\n\n#include \"torture.h\"\n#include \"torture_key.h\"\n#include \"torture_pki.h\"\n#include \"pki.c\"\n\n#define LIBSSH_DSA_TESTKEY \"libssh_testkey.id_dsa\"\n#define LIBSSH_DSA_TESTKEY_PASSPHRASE \"libssh_testkey_passphrase.id_dsa\"\n\nconst char template[] = \"temp_dir_XXXXXX\";\nconst unsigned char INPUT[] = \"12345678901234567890\";\n\nstruct pki_st {\n    char *cwd;\n    char *temp_dir;\n};\n\nstatic int setup_dsa_key(void **state)\n{\n    struct pki_st *test_state = NULL;\n    char *cwd = NULL;\n    char *tmp_dir = NULL;\n    int rc = 0;\n\n    test_state = (struct pki_st *)malloc(sizeof(struct pki_st));\n    assert_non_null(test_state);\n\n    cwd = torture_get_current_working_dir();\n    assert_non_null(cwd);\n\n    tmp_dir = torture_make_temp_dir(template);\n    assert_non_null(tmp_dir);\n\n    test_state->cwd = cwd;\n    test_state->temp_dir = tmp_dir;\n\n    *state = test_state;\n\n    rc = torture_change_dir(tmp_dir);\n    assert_int_equal(rc, 0);\n\n    printf(\"Changed directory to: %s\\n\", tmp_dir);\n\n    torture_write_file(LIBSSH_DSA_TESTKEY,\n                       torture_get_testkey(SSH_KEYTYPE_DSS, 0));\n    torture_write_file(LIBSSH_DSA_TESTKEY_PASSPHRASE,\n                       torture_get_testkey(SSH_KEYTYPE_DSS, 1));\n    torture_write_file(LIBSSH_DSA_TESTKEY \".pub\",\n                       torture_get_testkey_pub(SSH_KEYTYPE_DSS));\n    torture_write_file(LIBSSH_DSA_TESTKEY \"-cert.pub\",\n                       torture_get_testkey_pub(SSH_KEYTYPE_DSS_CERT01));\n\n    return 0;\n}\n\nstatic int setup_openssh_dsa_key(void **state)\n{\n    struct pki_st *test_state = NULL;\n    char *cwd = NULL;\n    char *tmp_dir = NULL;\n    int rc = 0;\n\n    test_state = (struct pki_st *)malloc(sizeof(struct pki_st));\n    assert_non_null(test_state);\n\n    cwd = torture_get_current_working_dir();\n    assert_non_null(cwd);\n\n    tmp_dir = torture_make_temp_dir(template);\n    assert_non_null(tmp_dir);\n\n    test_state->cwd = cwd;\n    test_state->temp_dir = tmp_dir;\n\n    *state = test_state;\n\n    rc = torture_change_dir(tmp_dir);\n    assert_int_equal(rc, 0);\n\n    torture_write_file(LIBSSH_DSA_TESTKEY,\n                       torture_get_openssh_testkey(SSH_KEYTYPE_DSS, 0));\n    torture_write_file(LIBSSH_DSA_TESTKEY_PASSPHRASE,\n                       torture_get_openssh_testkey(SSH_KEYTYPE_DSS, 1));\n    torture_write_file(LIBSSH_DSA_TESTKEY \".pub\",\n                       torture_get_testkey_pub(SSH_KEYTYPE_DSS));\n    torture_write_file(LIBSSH_DSA_TESTKEY \"-cert.pub\",\n                       torture_get_testkey_pub(SSH_KEYTYPE_DSS_CERT01));\n\n    return 0;\n}\n\nstatic int teardown(void **state) {\n\n    struct pki_st *test_state = NULL;\n    int rc = 0;\n\n    test_state = *((struct pki_st **)state);\n\n    assert_non_null(test_state);\n    assert_non_null(test_state->cwd);\n    assert_non_null(test_state->temp_dir);\n\n    rc = torture_change_dir(test_state->cwd);\n    assert_int_equal(rc, 0);\n\n    rc = torture_rmdirs(test_state->temp_dir);\n    assert_int_equal(rc, 0);\n\n    SAFE_FREE(test_state->temp_dir);\n    SAFE_FREE(test_state->cwd);\n    SAFE_FREE(test_state);\n\n    return 0;\n}\n\nstatic void torture_pki_dsa_import_pubkey_file(void **state)\n{\n    ssh_key pubkey = NULL;\n    int rc;\n\n    (void)state;\n\n    /* The key doesn't have the hostname as comment after the key */\n    rc = ssh_pki_import_pubkey_file(LIBSSH_DSA_TESTKEY \".pub\", &pubkey);\n    assert_return_code(rc, errno);\n    assert_non_null(pubkey);\n\n    SSH_KEY_FREE(pubkey);\n}\n\nstatic void torture_pki_dsa_import_pubkey_from_openssh_privkey(void **state)\n{\n    ssh_key pubkey = NULL;\n    int rc;\n\n    (void)state;\n\n    /* The key doesn't have the hostname as comment after the key */\n    rc = ssh_pki_import_pubkey_file(LIBSSH_DSA_TESTKEY_PASSPHRASE, &pubkey);\n    assert_return_code(rc, errno);\n    assert_non_null(pubkey);\n\n    SSH_KEY_FREE(pubkey);\n}\n\nstatic void torture_pki_dsa_import_privkey_base64(void **state)\n{\n    int rc;\n    ssh_key key = NULL;\n    const char *passphrase = torture_get_testkey_passphrase();\n\n    (void) state; /* unused */\n\n    rc = ssh_pki_import_privkey_base64(torture_get_testkey(SSH_KEYTYPE_DSS, 0),\n                                       passphrase,\n                                       NULL,\n                                       NULL,\n                                       &key);\n    assert_true(rc == 0);\n\n    SSH_KEY_FREE(key);\n}\n\nstatic void torture_pki_dsa_import_privkey_base64_comment(void **state)\n{\n    int rc, file_str_len;\n    ssh_key key = NULL;\n    const char *passphrase = torture_get_testkey_passphrase();\n    const char *comment_str = \"#this is line-comment\\n#this is another\\n\";\n    const char *key_str = NULL;\n    char *file_str = NULL;\n\n    (void) state; /* unused */\n\n    key_str = torture_get_testkey(SSH_KEYTYPE_DSS, 0);\n    assert_non_null(key_str);\n\n    file_str_len = strlen(comment_str) + strlen(key_str) + 1;\n    file_str = malloc(file_str_len);\n    assert_non_null(file_str);\n    rc = snprintf(file_str, file_str_len, \"%s%s\", comment_str, key_str);\n    assert_int_equal(rc, file_str_len - 1);\n\n    rc = ssh_pki_import_privkey_base64(file_str,\n                                       passphrase,\n                                       NULL,\n                                       NULL,\n                                       &key);\n    assert_true(rc == 0);\n\n    free(file_str);\n    SSH_KEY_FREE(key);\n}\n\nstatic void torture_pki_dsa_import_privkey_base64_whitespace(void **state)\n{\n    int rc, file_str_len;\n    ssh_key key = NULL;\n    const char *passphrase = torture_get_testkey_passphrase();\n    const char *whitespace_str = \"      \\n\\t\\t\\t\\t\\t\\n\\n\\n\\n\\n\";\n    const char *key_str = NULL;\n    char *file_str = NULL;\n\n    (void) state; /* unused */\n\n    key_str = torture_get_testkey(SSH_KEYTYPE_DSS, 0);\n    assert_non_null(key_str);\n\n    file_str_len = strlen(whitespace_str) + strlen(key_str) + 1;\n    file_str = malloc(file_str_len);\n    assert_non_null(file_str);\n    rc = snprintf(file_str, file_str_len, \"%s%s\", whitespace_str, key_str);\n    assert_int_equal(rc, file_str_len - 1);\n\n    rc = ssh_pki_import_privkey_base64(file_str,\n                                       passphrase,\n                                       NULL,\n                                       NULL,\n                                       &key);\n    assert_true(rc == 0);\n\n    free(file_str);\n    SSH_KEY_FREE(key);\n}\n\nstatic int test_sign_verify_data(ssh_key key,\n                                 enum ssh_digest_e hash_type,\n                                 const unsigned char *input,\n                                 size_t input_len)\n{\n    ssh_signature sig;\n    ssh_key pubkey = NULL;\n    int rc;\n\n    /* Get the public key to verify signature */\n    rc = ssh_pki_export_privkey_to_pubkey(key, &pubkey);\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(pubkey);\n\n    /* Sign the buffer */\n    sig = pki_sign_data(key, hash_type, input, input_len);\n    assert_non_null(sig);\n\n    /* Verify signature */\n    rc = pki_verify_data_signature(sig, pubkey, input, input_len);\n    assert_int_equal(rc, SSH_OK);\n\n    ssh_signature_free(sig);\n    SSH_KEY_FREE(pubkey);\n\n    return rc;\n}\n\nstatic void torture_pki_sign_data_dsa(void **state)\n{\n    int rc;\n    ssh_key key = NULL;\n\n    (void) state;\n\n    /* Setup */\n    rc = ssh_pki_generate(SSH_KEYTYPE_DSS, 2048, &key);\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(key);\n\n    /* Test using SHA1 */\n    rc = test_sign_verify_data(key, SSH_DIGEST_SHA1, INPUT, sizeof(INPUT));\n    assert_int_equal(rc, SSH_OK);\n\n    /* Cleanup */\n    SSH_KEY_FREE(key);\n}\n\nstatic void torture_pki_fail_sign_with_incompatible_hash(void **state)\n{\n    int rc;\n    ssh_key key = NULL;\n    ssh_key pubkey = NULL;\n    ssh_signature sig, bad_sig;\n\n    (void) state;\n\n    /* Setup */\n    rc = ssh_pki_generate(SSH_KEYTYPE_DSS, 2048, &key);\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(key);\n\n    /* Get the public key to verify signature */\n    rc = ssh_pki_export_privkey_to_pubkey(key, &pubkey);\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(pubkey);\n\n    /* Sign the buffer */\n    sig = pki_sign_data(key, SSH_DIGEST_SHA1, INPUT, sizeof(INPUT));\n    assert_non_null(sig);\n\n    /* Verify signature */\n    rc = pki_verify_data_signature(sig, pubkey, INPUT, sizeof(INPUT));\n    assert_int_equal(rc, SSH_OK);\n\n    /* Test if signature fails with SSH_DIGEST_AUTO */\n    bad_sig = pki_sign_data(key, SSH_DIGEST_AUTO, INPUT, sizeof(INPUT));\n    assert_null(bad_sig);\n\n    /* Test if verification fails with SSH_DIGEST_AUTO */\n    sig->hash_type = SSH_DIGEST_AUTO;\n    rc = pki_verify_data_signature(sig, pubkey, INPUT, sizeof(INPUT));\n    assert_int_not_equal(rc, SSH_OK);\n\n    /* Test if signature fails with SSH_DIGEST_SHA256 */\n    bad_sig = pki_sign_data(key, SSH_DIGEST_SHA256, INPUT, sizeof(INPUT));\n    assert_null(bad_sig);\n\n    /* Test if verification fails with SSH_DIGEST_SHA256 */\n    sig->hash_type = SSH_DIGEST_SHA256;\n    rc = pki_verify_data_signature(sig, pubkey, INPUT, sizeof(INPUT));\n    assert_int_not_equal(rc, SSH_OK);\n\n    /* Test if signature fails with SSH_DIGEST_SHA384 */\n    bad_sig = pki_sign_data(key, SSH_DIGEST_SHA384, INPUT, sizeof(INPUT));\n    assert_null(bad_sig);\n\n    /* Test if verification fails with SSH_DIGEST_SHA384 */\n    sig->hash_type = SSH_DIGEST_SHA384;\n    rc = pki_verify_data_signature(sig, pubkey, INPUT, sizeof(INPUT));\n    assert_int_not_equal(rc, SSH_OK);\n\n    /* Test if signature fails with SSH_DIGEST_SHA512 */\n    bad_sig = pki_sign_data(key, SSH_DIGEST_SHA512, INPUT, sizeof(INPUT));\n    assert_null(bad_sig);\n\n    /* Test if verification fails with SSH_DIGEST_SHA512 */\n    sig->hash_type = SSH_DIGEST_SHA512;\n    rc = pki_verify_data_signature(sig, pubkey, INPUT, sizeof(INPUT));\n    assert_int_not_equal(rc, SSH_OK);\n\n    /* Cleanup */\n    ssh_signature_free(sig);\n    SSH_KEY_FREE(pubkey);\n    SSH_KEY_FREE(key);\n}\n\n#ifdef HAVE_LIBCRYPTO\nstatic void torture_pki_dsa_write_privkey(void **state)\n{\n    ssh_key origkey = NULL;\n    ssh_key privkey = NULL;\n    int rc;\n\n    (void) state; /* unused */\n\n    rc = ssh_pki_import_privkey_file(LIBSSH_DSA_TESTKEY,\n                                     NULL,\n                                     NULL,\n                                     NULL,\n                                     &origkey);\n    assert_true(rc == 0);\n    assert_non_null(origkey);\n\n    unlink(LIBSSH_DSA_TESTKEY);\n\n    rc = ssh_pki_export_privkey_file(origkey,\n                                     NULL,\n                                     NULL,\n                                     NULL,\n                                     LIBSSH_DSA_TESTKEY);\n    assert_true(rc == 0);\n\n    rc = ssh_pki_import_privkey_file(LIBSSH_DSA_TESTKEY,\n                                     NULL,\n                                     NULL,\n                                     NULL,\n                                     &privkey);\n    assert_true(rc == 0);\n    assert_non_null(privkey);\n\n    rc = ssh_key_cmp(origkey, privkey, SSH_KEY_CMP_PRIVATE);\n    assert_true(rc == 0);\n\n    SSH_KEY_FREE(origkey);\n    SSH_KEY_FREE(privkey);\n\n    /* Test with passphrase */\n    rc = ssh_pki_import_privkey_file(LIBSSH_DSA_TESTKEY_PASSPHRASE,\n                                     torture_get_testkey_passphrase(),\n                                     NULL,\n                                     NULL,\n                                     &origkey);\n    assert_true(rc == 0);\n    assert_non_null(origkey);\n\n    unlink(LIBSSH_DSA_TESTKEY_PASSPHRASE);\n    rc = ssh_pki_export_privkey_file(origkey,\n                                     torture_get_testkey_passphrase(),\n                                     NULL,\n                                     NULL,\n                                     LIBSSH_DSA_TESTKEY_PASSPHRASE);\n    assert_true(rc == 0);\n\n    /* Test with invalid passphrase */\n    rc = ssh_pki_import_privkey_file(LIBSSH_DSA_TESTKEY_PASSPHRASE,\n                                     \"invalid secret\",\n                                     NULL,\n                                     NULL,\n                                     &privkey);\n    assert_true(rc == SSH_ERROR);\n    assert_null(privkey);\n\n    rc = ssh_pki_import_privkey_file(LIBSSH_DSA_TESTKEY_PASSPHRASE,\n                                     torture_get_testkey_passphrase(),\n                                     NULL,\n                                     NULL,\n                                     &privkey);\n    assert_true(rc == 0);\n    assert_non_null(privkey);\n\n    rc = ssh_key_cmp(origkey, privkey, SSH_KEY_CMP_PRIVATE);\n    assert_true(rc == 0);\n\n    SSH_KEY_FREE(origkey);\n    SSH_KEY_FREE(privkey);\n}\n#endif\n\nstatic void torture_pki_dsa_import_privkey_base64_passphrase(void **state)\n{\n    int rc;\n    ssh_key key = NULL;\n    const char *passphrase = torture_get_testkey_passphrase();\n\n    (void) state; /* unused */\n\n    rc = ssh_pki_import_privkey_base64(torture_get_testkey(SSH_KEYTYPE_DSS, 1),\n                                       passphrase,\n                                       NULL,\n                                       NULL,\n                                       &key);\n    assert_return_code(rc, errno);\n    assert_non_null(key);\n\n    rc = ssh_key_is_private(key);\n    assert_true(rc == 1);\n\n    SSH_KEY_FREE(key);\n\n    /* test if it returns -1 if passphrase is wrong */\n    rc = ssh_pki_import_privkey_base64(torture_get_testkey(SSH_KEYTYPE_DSS, 1),\n                                       \"wrong passphrase !!\",\n                                       NULL,\n                                       NULL,\n                                       &key);\n    assert_true(rc == -1);\n    assert_null(key);\n\n    /* test if it returns -1 if passphrase is NULL */\n    /* libcrypto asks for a passphrase, so skip this test */\n#ifndef HAVE_LIBCRYPTO\n    rc = ssh_pki_import_privkey_base64(torture_get_testkey(SSH_KEYTYPE_DSS, 1),\n                                       NULL,\n                                       NULL,\n                                       NULL,\n                                       &key);\n    assert_true(rc == -1);\n    assert_null(key);\n#endif\n\n    rc = ssh_pki_import_privkey_base64(torture_get_testkey(SSH_KEYTYPE_DSS, 1),\n                                       passphrase,\n                                       NULL,\n                                       NULL,\n                                       &key);\n    assert_return_code(rc, errno);\n    assert_non_null(key);\n\n    rc = ssh_key_is_private(key);\n    assert_true(rc == 1);\n\n    SSH_KEY_FREE(key);\n\n    /* test if it returns -1 if passphrase is wrong */\n    rc = ssh_pki_import_privkey_base64(torture_get_testkey(SSH_KEYTYPE_DSS, 1),\n                                       \"wrong passphrase !!\",\n                                       NULL,\n                                       NULL,\n                                       &key);\n    assert_true(rc == -1);\n    assert_null(key);\n\n    /* This free in unnecessary, but the static analyser does not know */\n    SSH_KEY_FREE(key);\n\n#ifndef HAVE_LIBCRYPTO\n    /* test if it returns -1 if passphrase is NULL */\n    /* libcrypto asks for a passphrase, so skip this test */\n    rc = ssh_pki_import_privkey_base64(torture_get_testkey(SSH_KEYTYPE_DSS, 1),\n                                       NULL,\n                                       NULL,\n                                       NULL,\n                                       &key);\n    assert_true(rc == -1);\n    assert_null(key);\n\n    /* This free in unnecessary, but the static analyser does not know */\n    SSH_KEY_FREE(key);\n#endif /* HAVE_LIBCRYPTO */\n}\n\nstatic void\ntorture_pki_dsa_import_openssh_privkey_base64_passphrase(void **state)\n{\n    int rc;\n    ssh_key key = NULL;\n    const char *passphrase = torture_get_testkey_passphrase();\n    const char *keystring = NULL;\n\n    (void) state; /* unused */\n\n    keystring = torture_get_openssh_testkey(SSH_KEYTYPE_DSS, 1);\n    assert_non_null(keystring);\n\n    rc = ssh_pki_import_privkey_base64(keystring,\n                                       passphrase,\n                                       NULL,\n                                       NULL,\n                                       &key);\n    assert_return_code(rc, errno);\n    assert_non_null(key);\n\n    rc = ssh_key_is_private(key);\n    assert_true(rc == 1);\n\n    SSH_KEY_FREE(key);\n\n    /* test if it returns -1 if passphrase is wrong */\n    rc = ssh_pki_import_privkey_base64(keystring,\n                                       \"wrong passphrase !!\",\n                                       NULL,\n                                       NULL,\n                                       &key);\n    assert_true(rc == -1);\n    assert_null(key);\n\n    /* test if it returns -1 if passphrase is NULL */\n    rc = ssh_pki_import_privkey_base64(keystring,\n                                       NULL,\n                                       NULL,\n                                       NULL,\n                                       &key);\n    assert_true(rc == -1);\n\n    rc = ssh_pki_import_privkey_base64(keystring,\n                                       passphrase,\n                                       NULL,\n                                       NULL,\n                                       &key);\n    assert_return_code(rc, errno);\n    assert_non_null(key);\n\n    rc = ssh_key_is_private(key);\n    assert_true(rc == 1);\n\n    SSH_KEY_FREE(key);\n\n    /* test if it returns -1 if passphrase is wrong */\n    rc = ssh_pki_import_privkey_base64(keystring,\n                                       \"wrong passphrase !!\",\n                                       NULL,\n                                       NULL,\n                                       &key);\n    assert_true(rc == -1);\n    assert_null(key);\n\n    /* This free is unnecessary, but the static analyser does not know */\n    SSH_KEY_FREE(key);\n\n    /* test if it returns -1 if passphrase is NULL */\n    rc = ssh_pki_import_privkey_base64(keystring,\n                                       NULL,\n                                       NULL,\n                                       NULL,\n                                       &key);\n    assert_true(rc == -1);\n    assert_null(key);\n\n    /* This free is unnecessary, but the static analyser does not know */\n    SSH_KEY_FREE(key);\n}\n\n\nstatic void torture_pki_dsa_publickey_from_privatekey(void **state)\n{\n    int rc;\n    ssh_key key = NULL;\n    ssh_key pubkey = NULL;\n    const char *passphrase = NULL;\n\n    (void) state; /* unused */\n\n    rc = ssh_pki_import_privkey_base64(torture_get_testkey(SSH_KEYTYPE_DSS, 0),\n                                       passphrase,\n                                       NULL,\n                                       NULL,\n                                       &key);\n    assert_true(rc == 0);\n    assert_non_null(key);\n\n    rc = ssh_key_is_private(key);\n    assert_true(rc == 1);\n\n    rc = ssh_pki_export_privkey_to_pubkey(key, &pubkey);\n    assert_true(rc == SSH_OK);\n    assert_non_null(pubkey);\n\n    SSH_KEY_FREE(key);\n    SSH_KEY_FREE(pubkey);\n}\n\nstatic void torture_pki_dsa_import_cert_file(void **state)\n{\n    int rc;\n    ssh_key cert = NULL;\n    enum ssh_keytypes_e type;\n\n    (void) state; /* unused */\n\n    rc = ssh_pki_import_cert_file(LIBSSH_DSA_TESTKEY \"-cert.pub\", &cert);\n    assert_true(rc == 0);\n    assert_non_null(cert);\n\n    type = ssh_key_type(cert);\n    assert_true(type == SSH_KEYTYPE_DSS_CERT01);\n\n    rc = ssh_key_is_public(cert);\n    assert_true(rc == 1);\n\n    SSH_KEY_FREE(cert);\n}\n\nstatic void torture_pki_dsa_publickey_base64(void **state)\n{\n    enum ssh_keytypes_e type;\n    char *b64_key = NULL, *key_buf = NULL, *p = NULL;\n    const char *str = NULL;\n    ssh_key key = NULL;\n    size_t keylen;\n    size_t i;\n    int rc;\n\n    (void) state; /* unused */\n\n    key_buf = strdup(torture_get_testkey_pub(SSH_KEYTYPE_DSS));\n    assert_non_null(key_buf);\n\n    keylen = strlen(key_buf);\n\n    str = p = key_buf;\n    for (i = 0; i < keylen; i++) {\n        if (isspace((int)p[i])) {\n            p[i] = '\\0';\n            break;\n        }\n\n    }\n\n    type = ssh_key_type_from_name(str);\n    assert_true(type == SSH_KEYTYPE_DSS);\n\n    str = &p[i + 1];\n\n    for (; i < keylen; i++) {\n        if (isspace((int)p[i])) {\n            p[i] = '\\0';\n            break;\n        }\n    }\n\n    rc = ssh_pki_import_pubkey_base64(str, type, &key);\n    assert_true(rc == 0);\n    assert_non_null(key);\n\n    rc = ssh_pki_export_pubkey_base64(key, &b64_key);\n    assert_true(rc == 0);\n    assert_non_null(b64_key);\n\n    assert_string_equal(str, b64_key);\n\n    free(b64_key);\n    free(key_buf);\n    SSH_KEY_FREE(key);\n}\n\nstatic void torture_pki_dsa_generate_pubkey_from_privkey(void **state)\n{\n    char pubkey_generated[4096] = {0};\n    ssh_key privkey = NULL;\n    ssh_key pubkey = NULL;\n    int len;\n    int rc;\n\n    (void) state; /* unused */\n\n    /* remove the public key, generate it from the private key and write it. */\n    unlink(LIBSSH_DSA_TESTKEY \".pub\");\n\n    rc = ssh_pki_import_privkey_file(LIBSSH_DSA_TESTKEY,\n                                     NULL,\n                                     NULL,\n                                     NULL,\n                                     &privkey);\n    assert_true(rc == 0);\n    assert_non_null(privkey);\n\n    rc = ssh_pki_export_privkey_to_pubkey(privkey, &pubkey);\n    assert_true(rc == SSH_OK);\n    assert_non_null(pubkey);\n\n    rc = ssh_pki_export_pubkey_file(pubkey, LIBSSH_DSA_TESTKEY \".pub\");\n    assert_true(rc == 0);\n\n    rc = torture_read_one_line(LIBSSH_DSA_TESTKEY \".pub\",\n                               pubkey_generated,\n                               sizeof(pubkey_generated));\n    assert_true(rc == 0);\n\n    len = torture_pubkey_len(torture_get_testkey_pub(SSH_KEYTYPE_DSS));\n    assert_memory_equal(torture_get_testkey_pub(SSH_KEYTYPE_DSS),\n                        pubkey_generated,\n                        len);\n\n    SSH_KEY_FREE(privkey);\n    SSH_KEY_FREE(pubkey);\n}\n\nstatic void torture_pki_dsa_duplicate_key(void **state)\n{\n    int rc;\n    char *b64_key = NULL;\n    char *b64_key_gen = NULL;\n    ssh_key pubkey = NULL;\n    ssh_key pubkey_dup = NULL;\n    ssh_key privkey = NULL;\n    ssh_key privkey_dup = NULL;\n\n    (void) state;\n\n    rc = ssh_pki_import_pubkey_file(LIBSSH_DSA_TESTKEY \".pub\", &pubkey);\n    assert_true(rc == 0);\n    assert_non_null(pubkey);\n\n    rc = ssh_pki_export_pubkey_base64(pubkey, &b64_key);\n    assert_true(rc == 0);\n    assert_non_null(b64_key);\n    rc = ssh_pki_import_privkey_file(LIBSSH_DSA_TESTKEY,\n                                     NULL,\n                                     NULL,\n                                     NULL,\n                                     &privkey);\n    assert_true(rc == 0);\n    assert_non_null(privkey);\n\n    privkey_dup = ssh_key_dup(privkey);\n    assert_non_null(privkey_dup);\n\n    rc = ssh_pki_export_privkey_to_pubkey(privkey, &pubkey_dup);\n    assert_true(rc == SSH_OK);\n    assert_non_null(pubkey_dup);\n\n    rc = ssh_pki_export_pubkey_base64(pubkey_dup, &b64_key_gen);\n    assert_true(rc == 0);\n    assert_non_null(b64_key_gen);\n\n    assert_string_equal(b64_key, b64_key_gen);\n\n    rc = ssh_key_cmp(privkey, privkey_dup, SSH_KEY_CMP_PRIVATE);\n    assert_true(rc == 0);\n\n    rc = ssh_key_cmp(pubkey, pubkey_dup, SSH_KEY_CMP_PUBLIC);\n    assert_true(rc == 0);\n\n    SSH_KEY_FREE(pubkey);\n    SSH_KEY_FREE(pubkey_dup);\n\n    SSH_KEY_FREE(privkey);\n    SSH_KEY_FREE(privkey_dup);\n    SSH_STRING_FREE_CHAR(b64_key);\n    SSH_STRING_FREE_CHAR(b64_key_gen);\n}\n\nstatic void torture_pki_dsa_generate_key(void **state)\n{\n    int rc;\n    ssh_key key = NULL, pubkey = NULL;\n    ssh_signature sign = NULL;\n    ssh_session session=ssh_new();\n    (void) state;\n\n    rc = ssh_pki_generate(SSH_KEYTYPE_DSS, 1024, &key);\n    assert_true(rc == SSH_OK);\n    assert_non_null(key);\n    rc = ssh_pki_export_privkey_to_pubkey(key, &pubkey);\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(pubkey);\n    sign = pki_do_sign(key, INPUT, sizeof(INPUT), SSH_DIGEST_SHA1);\n    assert_non_null(sign);\n    rc = ssh_pki_signature_verify(session, sign, pubkey, INPUT, sizeof(INPUT));\n    assert_true(rc == SSH_OK);\n    ssh_signature_free(sign);\n    SSH_KEY_FREE(key);\n    SSH_KEY_FREE(pubkey);\n\n    rc = ssh_pki_generate(SSH_KEYTYPE_DSS, 2048, &key);\n    assert_true(rc == SSH_OK);\n    assert_non_null(key);\n    rc = ssh_pki_export_privkey_to_pubkey(key, &pubkey);\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(pubkey);\n    sign = pki_do_sign(key, INPUT, sizeof(INPUT), SSH_DIGEST_SHA1);\n    assert_non_null(sign);\n    rc = ssh_pki_signature_verify(session, sign, pubkey, INPUT, sizeof(INPUT));\n    assert_true(rc == SSH_OK);\n    ssh_signature_free(sign);\n    SSH_KEY_FREE(key);\n    SSH_KEY_FREE(pubkey);\n\n    rc = ssh_pki_generate(SSH_KEYTYPE_DSS, 3072, &key);\n    assert_true(rc == SSH_OK);\n    assert_non_null(key);\n    rc = ssh_pki_export_privkey_to_pubkey(key, &pubkey);\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(pubkey);\n    sign = pki_do_sign(key, INPUT, sizeof(INPUT), SSH_DIGEST_SHA1);\n    assert_non_null(sign);\n    rc = ssh_pki_signature_verify(session, sign, pubkey, INPUT, sizeof(INPUT));\n    assert_true(rc == SSH_OK);\n    ssh_signature_free(sign);\n    SSH_KEY_FREE(key);\n    SSH_KEY_FREE(pubkey);\n\n    ssh_free(session);\n}\n\nstatic void torture_pki_dsa_cert_verify(void **state)\n{\n    int rc;\n    ssh_key privkey = NULL, cert = NULL;\n    ssh_signature sign = NULL;\n    ssh_session session=ssh_new();\n    (void) state;\n\n    rc = ssh_pki_import_privkey_file(LIBSSH_DSA_TESTKEY,\n                                     NULL,\n                                     NULL,\n                                     NULL,\n                                     &privkey);\n    assert_true(rc == 0);\n    assert_non_null(privkey);\n\n    rc = ssh_pki_import_cert_file(LIBSSH_DSA_TESTKEY \"-cert.pub\", &cert);\n    assert_true(rc == 0);\n    assert_non_null(cert);\n\n    sign = pki_do_sign(privkey, INPUT, sizeof(INPUT), SSH_DIGEST_SHA1);\n    assert_non_null(sign);\n    rc = ssh_pki_signature_verify(session, sign, cert, INPUT, sizeof(INPUT));\n    assert_true(rc == SSH_OK);\n    ssh_signature_free(sign);\n    SSH_KEY_FREE(privkey);\n    SSH_KEY_FREE(cert);\n\n    ssh_free(session);\n}\n\nstatic void torture_pki_dsa_skip(UNUSED_PARAM(void **state))\n{\n    skip();\n}\n\nint torture_run_tests(void)\n{\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_pki_dsa_import_pubkey_file,\n                                 setup_dsa_key,\n                                 teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_dsa_import_pubkey_from_openssh_privkey,\n                                 setup_openssh_dsa_key,\n                                 teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_dsa_import_privkey_base64,\n                                 setup_dsa_key,\n                                 teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_dsa_import_privkey_base64_comment,\n                                 setup_dsa_key,\n                                 teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_dsa_import_privkey_base64_whitespace,\n                                 setup_dsa_key,\n                                 teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_dsa_import_privkey_base64,\n                                 setup_openssh_dsa_key,\n                                 teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_dsa_publickey_from_privatekey,\n                                 setup_dsa_key,\n                                 teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_dsa_import_cert_file,\n                                        setup_dsa_key,\n                                        teardown),\n#ifdef HAVE_LIBCRYPTO\n        cmocka_unit_test_setup_teardown(torture_pki_dsa_write_privkey,\n                                 setup_dsa_key,\n                                 teardown),\n#endif\n        cmocka_unit_test(torture_pki_sign_data_dsa),\n        cmocka_unit_test(torture_pki_fail_sign_with_incompatible_hash),\n        cmocka_unit_test(torture_pki_dsa_import_privkey_base64_passphrase),\n        cmocka_unit_test(torture_pki_dsa_import_openssh_privkey_base64_passphrase),\n\n        /* public key */\n        cmocka_unit_test_setup_teardown(torture_pki_dsa_publickey_base64,\n                                 setup_dsa_key,\n                                 teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_dsa_generate_pubkey_from_privkey,\n                                 setup_dsa_key,\n                                 teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_dsa_duplicate_key,\n                                 setup_dsa_key,\n                                 teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_dsa_duplicate_key,\n                                 setup_dsa_key,\n                                 teardown),\n        cmocka_unit_test(torture_pki_dsa_generate_key),\n        cmocka_unit_test_setup_teardown(torture_pki_dsa_cert_verify,\n                                 setup_dsa_key,\n                                 teardown),\n    };\n    struct CMUnitTest skip_tests[] = {\n        cmocka_unit_test(torture_pki_dsa_skip)\n    };\n\n    ssh_init();\n    if (ssh_fips_mode()) {\n        rc = cmocka_run_group_tests(skip_tests, NULL, NULL);\n    } else {\n        torture_filter_tests(tests);\n        rc = cmocka_run_group_tests(tests, NULL, NULL);\n    }\n    ssh_finalize();\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/unittests/torture_pki_ecdsa.c",
    "content": "#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include <sys/stat.h>\n#include <fcntl.h>\n\n#include \"torture.h\"\n#include \"torture_key.h\"\n#include \"torture_pki.h\"\n#include \"pki.c\"\n\n#define LIBSSH_ECDSA_TESTKEY \"libssh_testkey.id_ecdsa\"\n#define LIBSSH_ECDSA_TESTKEY_PASSPHRASE \"libssh_testkey_passphrase.id_ecdsa\"\n\nconst char template[] = \"temp_dir_XXXXXX\";\nconst unsigned char INPUT[] = \"12345678901234567890\";\n\nstruct pki_st {\n    char *cwd;\n    char *temp_dir;\n    enum ssh_keytypes_e type;\n};\n\nstatic int setup_ecdsa_key(void **state, int ecdsa_bits)\n{\n    struct pki_st *test_state = NULL;\n    char *cwd = NULL;\n    char *tmp_dir = NULL;\n    int rc = 0;\n\n    test_state = (struct pki_st *)malloc(sizeof(struct pki_st));\n    assert_non_null(test_state);\n\n    cwd = torture_get_current_working_dir();\n    assert_non_null(cwd);\n\n    tmp_dir = torture_make_temp_dir(template);\n    assert_non_null(tmp_dir);\n\n    test_state->cwd = cwd;\n    test_state->temp_dir = tmp_dir;\n\n    *state = test_state;\n\n    rc = torture_change_dir(tmp_dir);\n    assert_int_equal(rc, 0);\n\n    printf(\"Changed directory to: %s\\n\", tmp_dir);\n\n    switch (ecdsa_bits) {\n        case 521:\n            test_state->type = SSH_KEYTYPE_ECDSA_P521;\n            break;\n        case 384:\n            test_state->type = SSH_KEYTYPE_ECDSA_P384;\n            break;\n        default:\n            test_state->type = SSH_KEYTYPE_ECDSA_P256;\n            break;\n    }\n\n    torture_write_file(LIBSSH_ECDSA_TESTKEY,\n                       torture_get_testkey(test_state->type, 0));\n    torture_write_file(LIBSSH_ECDSA_TESTKEY_PASSPHRASE,\n                       torture_get_testkey(test_state->type, 1));\n    torture_write_file(LIBSSH_ECDSA_TESTKEY \".pub\",\n                       torture_get_testkey_pub(test_state->type));\n    torture_write_file(LIBSSH_ECDSA_TESTKEY \"-cert.pub\",\n                       torture_get_testkey_pub(test_state->type+3));\n    return 0;\n}\n\nstatic int setup_openssh_ecdsa_key(void **state, int ecdsa_bits)\n{\n    struct pki_st *test_state = NULL;\n    char *cwd = NULL;\n    char *tmp_dir = NULL;\n    const char *keystring = NULL;\n    int rc = 0;\n\n    test_state = (struct pki_st *)malloc(sizeof(struct pki_st));\n    assert_non_null(test_state);\n\n    cwd = torture_get_current_working_dir();\n    assert_non_null(cwd);\n\n    tmp_dir = torture_make_temp_dir(template);\n    assert_non_null(tmp_dir);\n\n    test_state->cwd = cwd;\n    test_state->temp_dir = tmp_dir;\n\n    *state = test_state;\n\n    rc = torture_change_dir(tmp_dir);\n    assert_int_equal(rc, 0);\n\n    printf(\"Changed directory to: %s\\n\", tmp_dir);\n\n    switch (ecdsa_bits) {\n        case 521:\n            test_state->type = SSH_KEYTYPE_ECDSA_P521;\n            break;\n        case 384:\n            test_state->type = SSH_KEYTYPE_ECDSA_P384;\n            break;\n        default:\n            test_state->type = SSH_KEYTYPE_ECDSA_P256;\n            break;\n    }\n\n    keystring = torture_get_openssh_testkey(test_state->type, 0);\n    torture_write_file(LIBSSH_ECDSA_TESTKEY, keystring);\n\n    keystring = torture_get_openssh_testkey(test_state->type, 1);\n    torture_write_file(LIBSSH_ECDSA_TESTKEY_PASSPHRASE, keystring);\n    torture_write_file(LIBSSH_ECDSA_TESTKEY \".pub\",\n                       torture_get_testkey_pub(test_state->type));\n    torture_write_file(LIBSSH_ECDSA_TESTKEY \"-cert.pub\",\n                       torture_get_testkey_pub(test_state->type+3));\n    return 0;\n}\n\nstatic int setup_ecdsa_key_521(void **state)\n{\n    setup_ecdsa_key(state, 521);\n\n    return 0;\n}\n\nstatic int setup_ecdsa_key_384(void **state)\n{\n    setup_ecdsa_key(state, 384);\n\n    return 0;\n}\n\nstatic int setup_ecdsa_key_256(void **state)\n{\n    setup_ecdsa_key(state, 256);\n\n    return 0;\n}\n\nstatic int setup_openssh_ecdsa_key_521(void **state)\n{\n    setup_openssh_ecdsa_key(state, 521);\n\n    return 0;\n}\n\nstatic int setup_openssh_ecdsa_key_384(void **state)\n{\n    setup_openssh_ecdsa_key(state, 384);\n\n    return 0;\n}\n\nstatic int setup_openssh_ecdsa_key_256(void **state)\n{\n    setup_openssh_ecdsa_key(state, 256);\n\n    return 0;\n}\n\nstatic int teardown(void **state) {\n\n    struct pki_st *test_state = NULL;\n    int rc = 0;\n\n    test_state = *((struct pki_st **)state);\n\n    assert_non_null(test_state);\n    assert_non_null(test_state->cwd);\n    assert_non_null(test_state->temp_dir);\n\n    rc = torture_change_dir(test_state->cwd);\n    assert_int_equal(rc, 0);\n\n    rc = torture_rmdirs(test_state->temp_dir);\n    assert_int_equal(rc, 0);\n\n    SAFE_FREE(test_state->temp_dir);\n    SAFE_FREE(test_state->cwd);\n    SAFE_FREE(test_state);\n\n    return 0;\n}\n\nstatic void torture_pki_ecdsa_import_pubkey_file(void **state)\n{\n    ssh_key pubkey = NULL;\n    int rc;\n\n    (void)state;\n\n    /* The key doesn't have the hostname as comment after the key */\n    rc = ssh_pki_import_pubkey_file(LIBSSH_ECDSA_TESTKEY \".pub\", &pubkey);\n    assert_return_code(rc, errno);\n    assert_non_null(pubkey);\n\n    SSH_KEY_FREE(pubkey);\n}\n\nstatic void torture_pki_ecdsa_import_pubkey_from_openssh_privkey(void **state)\n{\n    ssh_key pubkey = NULL;\n    int rc;\n\n    (void)state;\n\n    /* The key doesn't have the hostname as comment after the key */\n    rc = ssh_pki_import_pubkey_file(LIBSSH_ECDSA_TESTKEY_PASSPHRASE, &pubkey);\n    assert_return_code(rc, errno);\n    assert_non_null(pubkey);\n\n    SSH_KEY_FREE(pubkey);\n}\n\nstatic void torture_pki_ecdsa_import_privkey_base64(void **state)\n{\n    int rc;\n    char *key_str = NULL;\n    ssh_key key = NULL;\n    const char *passphrase = torture_get_testkey_passphrase();\n\n    (void) state; /* unused */\n\n    key_str = torture_pki_read_file(LIBSSH_ECDSA_TESTKEY);\n    assert_non_null(key_str);\n\n    rc = ssh_pki_import_privkey_base64(key_str, passphrase, NULL, NULL, &key);\n    assert_true(rc == 0);\n    assert_non_null(key);\n\n    rc = ssh_key_is_private(key);\n    assert_true(rc == 1);\n\n    free(key_str);\n    SSH_KEY_FREE(key);\n}\n\nstatic void torture_pki_ecdsa_import_privkey_base64_comment(void **state)\n{\n    int rc, file_str_len;\n    const char *comment_str = \"#this is line-comment\\n#this is another\\n\";\n    char *key_str = NULL, *file_str = NULL;\n    ssh_key key = NULL;\n    const char *passphrase = torture_get_testkey_passphrase();\n\n    (void) state; /* unused */\n\n    key_str = torture_pki_read_file(LIBSSH_ECDSA_TESTKEY);\n    assert_non_null(key_str);\n\n    file_str_len = strlen(comment_str) + strlen(key_str) + 1;\n    file_str = malloc(file_str_len);\n    assert_non_null(file_str);\n    rc = snprintf(file_str, file_str_len, \"%s%s\", comment_str, key_str);\n    assert_int_equal(rc, file_str_len - 1);\n\n    rc = ssh_pki_import_privkey_base64(file_str, passphrase, NULL, NULL, &key);\n    assert_true(rc == 0);\n    assert_non_null(key);\n\n    rc = ssh_key_is_private(key);\n    assert_true(rc == 1);\n\n    free(key_str);\n    free(file_str);\n    SSH_KEY_FREE(key);\n}\n\nstatic void torture_pki_ecdsa_import_privkey_base64_whitespace(void **state)\n{\n    int rc, file_str_len;\n    const char *whitespace_str = \"      \\n\\t\\t\\t\\t\\t\\n\\n\\n\\n\\n\";\n    char *key_str = NULL, *file_str = NULL;\n    ssh_key key = NULL;\n    const char *passphrase = torture_get_testkey_passphrase();\n\n    (void) state; /* unused */\n\n    key_str = torture_pki_read_file(LIBSSH_ECDSA_TESTKEY);\n    assert_non_null(key_str);\n\n    file_str_len = strlen(whitespace_str) + strlen(key_str) + 1;\n    file_str = malloc(file_str_len);\n    assert_non_null(file_str);\n    rc = snprintf(file_str, file_str_len, \"%s%s\", whitespace_str, key_str);\n    assert_int_equal(rc, file_str_len - 1);\n\n    rc = ssh_pki_import_privkey_base64(file_str, passphrase, NULL, NULL, &key);\n    assert_true(rc == 0);\n    assert_non_null(key);\n\n    rc = ssh_key_is_private(key);\n    assert_true(rc == 1);\n\n    free(key_str);\n    free(file_str);\n    SSH_KEY_FREE(key);\n}\n\n\nstatic void torture_pki_ecdsa_publickey_from_privatekey(void **state)\n{\n    int rc;\n    char *key_str = NULL;\n    ssh_key key = NULL;\n    ssh_key pubkey = NULL;\n    const char *passphrase = NULL;\n\n    (void) state; /* unused */\n\n    key_str = torture_pki_read_file(LIBSSH_ECDSA_TESTKEY);\n    assert_non_null(key_str);\n\n    rc = ssh_pki_import_privkey_base64(key_str, passphrase, NULL, NULL, &key);\n    assert_true(rc == 0);\n    assert_non_null(key);\n\n    rc = ssh_pki_export_privkey_to_pubkey(key, &pubkey);\n    assert_true(rc == SSH_OK);\n    assert_non_null(pubkey);\n\n    free(key_str);\n    SSH_KEY_FREE(key);\n    SSH_KEY_FREE(pubkey);\n}\n\nstatic void torture_pki_ecdsa_import_cert_file(void **state)\n{\n    int rc;\n    ssh_key cert = NULL;\n    enum ssh_keytypes_e type;\n    struct pki_st *test_state = *((struct pki_st **)state);\n\n    rc = ssh_pki_import_cert_file(LIBSSH_ECDSA_TESTKEY \"-cert.pub\", &cert);\n    assert_true(rc == 0);\n    assert_non_null(cert);\n\n    type = ssh_key_type(cert);\n    assert_true(type == test_state->type+3);\n\n    rc = ssh_key_is_public(cert);\n    assert_true(rc == 1);\n\n    SSH_KEY_FREE(cert);\n}\n\nstatic void torture_pki_ecdsa_publickey_base64(void **state)\n{\n    enum ssh_keytypes_e type;\n    char *b64_key = NULL, *key_buf = NULL, *p = NULL;\n    const char *q = NULL;\n    ssh_key key = NULL;\n    int rc;\n    struct pki_st *test_state = *((struct pki_st **)state);\n\n    key_buf = torture_pki_read_file(LIBSSH_ECDSA_TESTKEY \".pub\");\n    assert_non_null(key_buf);\n\n    q = p = key_buf;\n    while (p != NULL && *p != '\\0' && *p != ' ') p++;\n    if (p != NULL) {\n        *p = '\\0';\n    }\n\n    type = ssh_key_type_from_name(q);\n    assert_true(type == test_state->type);\n\n    q = ++p;\n    while (p != NULL && *p != '\\0' && *p != ' ') p++;\n    if (p != NULL) {\n        *p = '\\0';\n    }\n\n    rc = ssh_pki_import_pubkey_base64(q, type, &key);\n    assert_true(rc == 0);\n    assert_non_null(key);\n\n    rc = ssh_pki_export_pubkey_base64(key, &b64_key);\n    assert_true(rc == 0);\n    assert_non_null(b64_key);\n\n    assert_string_equal(q, b64_key);\n\n    free(b64_key);\n    free(key_buf);\n    SSH_KEY_FREE(key);\n}\n\nstatic void torture_pki_ecdsa_generate_pubkey_from_privkey(void **state)\n{\n    char pubkey_original[4096] = {0};\n    char pubkey_generated[4096] = {0};\n    ssh_key privkey = NULL;\n    ssh_key pubkey = NULL;\n    int rc;\n    int len;\n\n    (void) state; /* unused */\n\n    rc = torture_read_one_line(LIBSSH_ECDSA_TESTKEY \".pub\",\n                               pubkey_original,\n                               sizeof(pubkey_original));\n    assert_true(rc == 0);\n\n    /* remove the public key, generate it from the private key and write it. */\n    unlink(LIBSSH_ECDSA_TESTKEY \".pub\");\n\n    rc = ssh_pki_import_privkey_file(LIBSSH_ECDSA_TESTKEY,\n                                     NULL,\n                                     NULL,\n                                     NULL,\n                                     &privkey);\n    assert_true(rc == 0);\n    assert_non_null(privkey);\n\n    rc = ssh_pki_export_privkey_to_pubkey(privkey, &pubkey);\n    assert_true(rc == SSH_OK);\n    assert_non_null(pubkey);\n\n    rc = ssh_pki_export_pubkey_file(pubkey, LIBSSH_ECDSA_TESTKEY \".pub\");\n    assert_true(rc == 0);\n\n    rc = torture_read_one_line(LIBSSH_ECDSA_TESTKEY \".pub\",\n                               pubkey_generated,\n                               sizeof(pubkey_generated));\n    assert_true(rc == 0);\n    len = torture_pubkey_len(pubkey_original);\n    assert_int_equal(strncmp(pubkey_original, pubkey_generated, len), 0);\n\n    SSH_KEY_FREE(privkey);\n    SSH_KEY_FREE(pubkey);\n}\n\nstatic void torture_pki_ecdsa_duplicate_key(void **state)\n{\n    int rc;\n    char *b64_key = NULL;\n    char *b64_key_gen = NULL;\n    ssh_key pubkey = NULL;\n    ssh_key pubkey_dup = NULL;\n    ssh_key privkey = NULL;\n    ssh_key privkey_dup = NULL;\n\n    (void) state;\n\n    rc = ssh_pki_import_pubkey_file(LIBSSH_ECDSA_TESTKEY \".pub\", &pubkey);\n    assert_true(rc == 0);\n    assert_non_null(pubkey);\n\n    rc = ssh_pki_export_pubkey_base64(pubkey, &b64_key);\n    assert_true(rc == 0);\n    assert_non_null(b64_key);\n\n    rc = ssh_pki_import_privkey_file(LIBSSH_ECDSA_TESTKEY,\n                                     NULL,\n                                     NULL,\n                                     NULL,\n                                     &privkey);\n    assert_true(rc == 0);\n    assert_non_null(privkey);\n\n    privkey_dup = ssh_key_dup(privkey);\n    assert_non_null(privkey_dup);\n\n    rc = ssh_pki_export_privkey_to_pubkey(privkey, &pubkey_dup);\n    assert_true(rc == SSH_OK);\n    assert_non_null(pubkey_dup);\n\n    rc = ssh_pki_export_pubkey_base64(pubkey_dup, &b64_key_gen);\n    assert_true(rc == 0);\n    assert_non_null(b64_key_gen);\n\n    assert_string_equal(b64_key, b64_key_gen);\n\n    rc = ssh_key_cmp(privkey, privkey_dup, SSH_KEY_CMP_PRIVATE);\n    assert_true(rc == 0);\n\n    rc = ssh_key_cmp(pubkey, pubkey_dup, SSH_KEY_CMP_PUBLIC);\n    assert_true(rc == 0);\n\n    SSH_KEY_FREE(pubkey);\n    SSH_KEY_FREE(pubkey_dup);\n    SSH_KEY_FREE(privkey);\n    SSH_KEY_FREE(privkey_dup);\n    SSH_STRING_FREE_CHAR(b64_key);\n    SSH_STRING_FREE_CHAR(b64_key_gen);\n}\n\n/* Test case for bug #147: Private ECDSA key duplication did not carry\n * over parts of the key that then caused subsequent key demotion to\n * fail.\n */\nstatic void torture_pki_ecdsa_duplicate_then_demote(void **state)\n{\n    ssh_key pubkey = NULL;\n    ssh_key privkey = NULL;\n    ssh_key privkey_dup = NULL;\n    int rc;\n\n    (void) state;\n\n    rc = ssh_pki_import_privkey_file(LIBSSH_ECDSA_TESTKEY,\n                                     NULL,\n                                     NULL,\n                                     NULL,\n                                     &privkey);\n    assert_int_equal(rc, 0);\n    assert_non_null(privkey);\n\n    privkey_dup = ssh_key_dup(privkey);\n    assert_non_null(privkey_dup);\n    assert_int_equal(privkey->ecdsa_nid, privkey_dup->ecdsa_nid);\n\n    rc = ssh_pki_export_privkey_to_pubkey(privkey_dup, &pubkey);\n    assert_int_equal(rc, 0);\n    assert_non_null(pubkey);\n    assert_int_equal(pubkey->ecdsa_nid, privkey->ecdsa_nid);\n\n    SSH_KEY_FREE(pubkey);\n    SSH_KEY_FREE(privkey);\n    SSH_KEY_FREE(privkey_dup);\n}\n\nstatic void torture_pki_generate_key_ecdsa(void **state)\n{\n    int rc;\n    ssh_key key = NULL, pubkey = NULL;\n    ssh_signature sign = NULL;\n    enum ssh_keytypes_e type = SSH_KEYTYPE_UNKNOWN;\n    const char *type_char = NULL;\n    const char *etype_char = NULL;\n    ssh_session session=ssh_new();\n    (void) state;\n\n    rc = ssh_pki_generate(SSH_KEYTYPE_ECDSA_P256, 0, &key);\n    assert_true(rc == SSH_OK);\n    assert_non_null(key);\n    rc = ssh_pki_export_privkey_to_pubkey(key, &pubkey);\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(pubkey);\n    sign = pki_do_sign(key, INPUT, sizeof(INPUT), SSH_DIGEST_SHA256);\n    assert_non_null(sign);\n    rc = ssh_pki_signature_verify(session, sign, pubkey, INPUT, sizeof(INPUT));\n    assert_true(rc == SSH_OK);\n    type = ssh_key_type(key);\n    assert_true(type == SSH_KEYTYPE_ECDSA_P256);\n    type_char = ssh_key_type_to_char(type);\n    assert_true(strcmp(type_char, \"ecdsa-sha2-nistp256\") == 0);\n    etype_char = ssh_pki_key_ecdsa_name(key);\n    assert_true(strcmp(etype_char, \"ecdsa-sha2-nistp256\") == 0);\n\n    ssh_signature_free(sign);\n    SSH_KEY_FREE(key);\n    SSH_KEY_FREE(pubkey);\n\n    /* deprecated */\n    rc = ssh_pki_generate(SSH_KEYTYPE_ECDSA, 256, &key);\n    assert_true(rc == SSH_OK);\n    assert_non_null(key);\n    rc = ssh_pki_export_privkey_to_pubkey(key, &pubkey);\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(pubkey);\n    sign = pki_do_sign(key, INPUT, sizeof(INPUT), SSH_DIGEST_SHA256);\n    assert_non_null(sign);\n    rc = ssh_pki_signature_verify(session, sign, pubkey, INPUT, sizeof(INPUT));\n    assert_true(rc == SSH_OK);\n    type = ssh_key_type(key);\n    assert_true(type == SSH_KEYTYPE_ECDSA_P256);\n    type_char = ssh_key_type_to_char(type);\n    assert_true(strcmp(type_char, \"ecdsa-sha2-nistp256\") == 0);\n    etype_char = ssh_pki_key_ecdsa_name(key);\n    assert_true(strcmp(etype_char, \"ecdsa-sha2-nistp256\") == 0);\n\n    ssh_signature_free(sign);\n    SSH_KEY_FREE(key);\n    SSH_KEY_FREE(pubkey);\n\n    rc = ssh_pki_generate(SSH_KEYTYPE_ECDSA_P384, 0, &key);\n    assert_true(rc == SSH_OK);\n    assert_non_null(key);\n    rc = ssh_pki_export_privkey_to_pubkey(key, &pubkey);\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(pubkey);\n    sign = pki_do_sign(key, INPUT, sizeof(INPUT), SSH_DIGEST_SHA384);\n    assert_non_null(sign);\n    rc = ssh_pki_signature_verify(session, sign, pubkey, INPUT, sizeof(INPUT));\n    assert_true(rc == SSH_OK);\n    type = ssh_key_type(key);\n    assert_true(type == SSH_KEYTYPE_ECDSA_P384);\n    type_char = ssh_key_type_to_char(type);\n    assert_true(strcmp(type_char, \"ecdsa-sha2-nistp384\") == 0);\n    etype_char =ssh_pki_key_ecdsa_name(key);\n    assert_true(strcmp(etype_char, \"ecdsa-sha2-nistp384\") == 0);\n\n    ssh_signature_free(sign);\n    SSH_KEY_FREE(key);\n    SSH_KEY_FREE(pubkey);\n\n    /* deprecated */\n    rc = ssh_pki_generate(SSH_KEYTYPE_ECDSA, 384, &key);\n    assert_true(rc == SSH_OK);\n    assert_non_null(key);\n    rc = ssh_pki_export_privkey_to_pubkey(key, &pubkey);\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(pubkey);\n    sign = pki_do_sign(key, INPUT, sizeof(INPUT), SSH_DIGEST_SHA384);\n    assert_non_null(sign);\n    rc = ssh_pki_signature_verify(session, sign, pubkey, INPUT, sizeof(INPUT));\n    assert_true(rc == SSH_OK);\n    type = ssh_key_type(key);\n    assert_true(type == SSH_KEYTYPE_ECDSA_P384);\n    type_char = ssh_key_type_to_char(type);\n    assert_true(strcmp(type_char, \"ecdsa-sha2-nistp384\") == 0);\n    etype_char =ssh_pki_key_ecdsa_name(key);\n    assert_true(strcmp(etype_char, \"ecdsa-sha2-nistp384\") == 0);\n\n    ssh_signature_free(sign);\n    SSH_KEY_FREE(key);\n    SSH_KEY_FREE(pubkey);\n\n    rc = ssh_pki_generate(SSH_KEYTYPE_ECDSA_P521, 0, &key);\n    assert_true(rc == SSH_OK);\n    assert_non_null(key);\n    rc = ssh_pki_export_privkey_to_pubkey(key, &pubkey);\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(pubkey);\n    sign = pki_do_sign(key, INPUT, sizeof(INPUT), SSH_DIGEST_SHA512);\n    assert_non_null(sign);\n    rc = ssh_pki_signature_verify(session, sign, pubkey, INPUT, sizeof(INPUT));\n    assert_true(rc == SSH_OK);\n    type = ssh_key_type(key);\n    assert_true(type == SSH_KEYTYPE_ECDSA_P521);\n    type_char = ssh_key_type_to_char(type);\n    assert_true(strcmp(type_char, \"ecdsa-sha2-nistp521\") == 0);\n    etype_char =ssh_pki_key_ecdsa_name(key);\n    assert_true(strcmp(etype_char, \"ecdsa-sha2-nistp521\") == 0);\n\n    ssh_signature_free(sign);\n    SSH_KEY_FREE(key);\n    SSH_KEY_FREE(pubkey);\n\n    /* deprecated */\n    rc = ssh_pki_generate(SSH_KEYTYPE_ECDSA, 521, &key);\n    assert_true(rc == SSH_OK);\n    assert_non_null(key);\n    rc = ssh_pki_export_privkey_to_pubkey(key, &pubkey);\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(pubkey);\n    sign = pki_do_sign(key, INPUT, sizeof(INPUT), SSH_DIGEST_SHA512);\n    assert_non_null(sign);\n    rc = ssh_pki_signature_verify(session, sign, pubkey, INPUT, sizeof(INPUT));\n    assert_true(rc == SSH_OK);\n    type = ssh_key_type(key);\n    assert_true(type == SSH_KEYTYPE_ECDSA_P521);\n    type_char = ssh_key_type_to_char(type);\n    assert_true(strcmp(type_char, \"ecdsa-sha2-nistp521\") == 0);\n    etype_char =ssh_pki_key_ecdsa_name(key);\n    assert_true(strcmp(etype_char, \"ecdsa-sha2-nistp521\") == 0);\n\n    ssh_signature_free(sign);\n    SSH_KEY_FREE(key);\n    SSH_KEY_FREE(pubkey);\n\n    ssh_free(session);\n}\n\nstatic void torture_pki_ecdsa_cert_verify(void **state)\n{\n    int rc;\n    ssh_key privkey = NULL, cert = NULL;\n    ssh_signature sign = NULL;\n    ssh_session session=ssh_new();\n    enum ssh_digest_e hash_type;\n    (void) state;\n\n    rc = ssh_pki_import_privkey_file(LIBSSH_ECDSA_TESTKEY,\n                                     NULL,\n                                     NULL,\n                                     NULL,\n                                     &privkey);\n    assert_true(rc == 0);\n    assert_non_null(privkey);\n\n    rc = ssh_pki_import_cert_file(LIBSSH_ECDSA_TESTKEY \"-cert.pub\", &cert);\n    assert_true(rc == 0);\n    assert_non_null(cert);\n\n    /* Get the hash type to be used in the signature based on the key type */\n    hash_type = ssh_key_type_to_hash(session, privkey->type);\n\n    sign = pki_do_sign(privkey, INPUT, sizeof(INPUT), hash_type);\n    assert_non_null(sign);\n    rc = ssh_pki_signature_verify(session, sign, cert, INPUT, sizeof(INPUT));\n    assert_true(rc == SSH_OK);\n    ssh_signature_free(sign);\n    SSH_KEY_FREE(privkey);\n    SSH_KEY_FREE(cert);\n\n    ssh_free(session);\n}\n\nstatic int test_sign_verify_data(ssh_key key,\n                                 enum ssh_digest_e hash_type,\n                                 const unsigned char *input,\n                                 size_t input_len)\n{\n    ssh_signature sig;\n    ssh_key pubkey = NULL;\n    int rc;\n\n    /* Get the public key to verify signature */\n    rc = ssh_pki_export_privkey_to_pubkey(key, &pubkey);\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(pubkey);\n\n    /* Sign the buffer */\n    sig = pki_sign_data(key, hash_type, input, input_len);\n    assert_non_null(sig);\n\n    /* Verify signature */\n    rc = pki_verify_data_signature(sig, pubkey, input, input_len);\n    assert_int_equal(rc, SSH_OK);\n\n    ssh_signature_free(sig);\n    SSH_KEY_FREE(pubkey);\n\n    return rc;\n}\n\nstatic void torture_pki_sign_data_ecdsa(void **state)\n{\n    int rc;\n    ssh_key key = NULL;\n\n    (void) state;\n\n    /* Setup */\n    rc = ssh_pki_generate(SSH_KEYTYPE_ECDSA, 256, &key);\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(key);\n\n    /* Test using SHA256 */\n    rc = test_sign_verify_data(key, SSH_DIGEST_SHA256, INPUT, sizeof(INPUT));\n    assert_int_equal(rc, SSH_OK);\n\n    /* Cleanup */\n    SSH_KEY_FREE(key);\n}\n\nstatic void torture_pki_fail_sign_with_incompatible_hash(void **state)\n{\n    int rc;\n    ssh_key key = NULL;\n    ssh_key pubkey = NULL;\n    ssh_signature sig, bad_sig;\n\n    (void) state;\n\n    /* Setup */\n    rc = ssh_pki_generate(SSH_KEYTYPE_ECDSA_P256, 256, &key);\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(key);\n\n    /* Get the public key to verify signature */\n    rc = ssh_pki_export_privkey_to_pubkey(key, &pubkey);\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(pubkey);\n\n    /* Sign the buffer */\n    sig = pki_sign_data(key, SSH_DIGEST_SHA256, INPUT, sizeof(INPUT));\n    assert_non_null(sig);\n\n    /* Verify signature */\n    rc = pki_verify_data_signature(sig, pubkey, INPUT, sizeof(INPUT));\n    assert_int_equal(rc, SSH_OK);\n\n    /* Test if signature fails with SSH_DIGEST_AUTO */\n    bad_sig = pki_sign_data(key, SSH_DIGEST_AUTO, INPUT, sizeof(INPUT));\n    assert_null(bad_sig);\n\n    /* Test if verification fails with SSH_DIGEST_AUTO */\n    sig->hash_type = SSH_DIGEST_AUTO;\n    rc = pki_verify_data_signature(sig, pubkey, INPUT, sizeof(INPUT));\n    assert_int_not_equal(rc, SSH_OK);\n\n    /* Test if signature fails with SSH_DIGEST_SHA1 */\n    bad_sig = pki_sign_data(key, SSH_DIGEST_SHA1, INPUT, sizeof(INPUT));\n    assert_null(bad_sig);\n\n    /* Test if verification fails with SSH_DIGEST_SHA1 */\n    sig->hash_type = SSH_DIGEST_SHA1;\n    rc = pki_verify_data_signature(sig, pubkey, INPUT, sizeof(INPUT));\n    assert_int_not_equal(rc, SSH_OK);\n\n    /* Test if signature fails with SSH_DIGEST_SHA384 */\n    bad_sig = pki_sign_data(key, SSH_DIGEST_SHA384, INPUT, sizeof(INPUT));\n    assert_null(bad_sig);\n\n    /* Test if verification fails with SSH_DIGEST_SHA384 */\n    sig->hash_type = SSH_DIGEST_SHA384;\n    rc = pki_verify_data_signature(sig, pubkey, INPUT, sizeof(INPUT));\n    assert_int_not_equal(rc, SSH_OK);\n\n    /* Test if signature fails with SSH_DIGEST_SHA512 */\n    bad_sig = pki_sign_data(key, SSH_DIGEST_SHA512, INPUT, sizeof(INPUT));\n    assert_null(bad_sig);\n\n    /* Test if verification fails with SSH_DIGEST_SHA512 */\n    sig->hash_type = SSH_DIGEST_SHA512;\n    rc = pki_verify_data_signature(sig, pubkey, INPUT, sizeof(INPUT));\n    assert_int_not_equal(rc, SSH_OK);\n\n    /* Cleanup */\n    ssh_signature_free(sig);\n    SSH_KEY_FREE(pubkey);\n    SSH_KEY_FREE(key);\n}\n\n#ifdef HAVE_LIBCRYPTO\nstatic void torture_pki_ecdsa_write_privkey(void **state)\n{\n    ssh_key origkey = NULL;\n    ssh_key privkey = NULL;\n    int rc;\n\n    (void) state; /* unused */\n\n    rc = ssh_pki_import_privkey_file(LIBSSH_ECDSA_TESTKEY,\n                                     NULL,\n                                     NULL,\n                                     NULL,\n                                     &origkey);\n    assert_true(rc == 0);\n    assert_non_null(origkey);\n\n    unlink(LIBSSH_ECDSA_TESTKEY);\n\n    rc = ssh_pki_export_privkey_file(origkey,\n                                     NULL,\n                                     NULL,\n                                     NULL,\n                                     LIBSSH_ECDSA_TESTKEY);\n    assert_true(rc == 0);\n\n    rc = ssh_pki_import_privkey_file(LIBSSH_ECDSA_TESTKEY,\n                                     NULL,\n                                     NULL,\n                                     NULL,\n                                     &privkey);\n    assert_true(rc == 0);\n    assert_non_null(privkey);\n\n    rc = ssh_key_cmp(origkey, privkey, SSH_KEY_CMP_PRIVATE);\n    assert_true(rc == 0);\n\n    SSH_KEY_FREE(origkey);\n    SSH_KEY_FREE(privkey);\n\n    /* Test with passphrase */\n    rc = ssh_pki_import_privkey_file(LIBSSH_ECDSA_TESTKEY_PASSPHRASE,\n                                     torture_get_testkey_passphrase(),\n                                     NULL,\n                                     NULL,\n                                     &origkey);\n    assert_true(rc == 0);\n    assert_non_null(origkey);\n\n    unlink(LIBSSH_ECDSA_TESTKEY_PASSPHRASE);\n    rc = ssh_pki_export_privkey_file(origkey,\n                                     torture_get_testkey_passphrase(),\n                                     NULL,\n                                     NULL,\n                                     LIBSSH_ECDSA_TESTKEY_PASSPHRASE);\n    assert_true(rc == 0);\n\n    /* Test with invalid passphrase */\n    rc = ssh_pki_import_privkey_file(LIBSSH_ECDSA_TESTKEY_PASSPHRASE,\n                                     \"invalid secret\",\n                                     NULL,\n                                     NULL,\n                                     &privkey);\n    assert_true(rc == SSH_ERROR);\n    assert_null(privkey);\n\n    rc = ssh_pki_import_privkey_file(LIBSSH_ECDSA_TESTKEY_PASSPHRASE,\n                                     torture_get_testkey_passphrase(),\n                                     NULL,\n                                     NULL,\n                                     &privkey);\n    assert_true(rc == 0);\n    assert_non_null(privkey);\n\n    rc = ssh_key_cmp(origkey, privkey, SSH_KEY_CMP_PRIVATE);\n    assert_true(rc == 0);\n\n    SSH_KEY_FREE(origkey);\n    SSH_KEY_FREE(privkey);\n}\n#endif /* HAVE_LIBCRYPTO */\n\nstatic void torture_pki_ecdsa_name(void **state, const char *expected_name)\n{\n    int rc;\n    ssh_key key = NULL;\n    const char *etype_char = NULL;\n\n    (void) state; /* unused */\n\n    rc = ssh_pki_import_privkey_file(LIBSSH_ECDSA_TESTKEY, NULL, NULL, NULL, &key);\n    assert_true(rc == 0);\n    assert_non_null(key);\n\n    etype_char =ssh_pki_key_ecdsa_name(key);\n    assert_true(strcmp(etype_char, expected_name) == 0);\n\n    SSH_KEY_FREE(key);\n}\n\nstatic void torture_pki_ecdsa_name256(void **state)\n{\n    torture_pki_ecdsa_name(state, \"ecdsa-sha2-nistp256\");\n}\n\nstatic void torture_pki_ecdsa_name384(void **state)\n{\n    torture_pki_ecdsa_name(state, \"ecdsa-sha2-nistp384\");\n}\n\nstatic void torture_pki_ecdsa_name521(void **state)\n{\n    torture_pki_ecdsa_name(state, \"ecdsa-sha2-nistp521\");\n}\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_import_pubkey_file,\n                                        setup_ecdsa_key_256,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_import_pubkey_file,\n                                        setup_ecdsa_key_384,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_import_pubkey_file,\n                                        setup_ecdsa_key_521,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_import_pubkey_from_openssh_privkey,\n                                        setup_openssh_ecdsa_key_256,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_import_pubkey_from_openssh_privkey,\n                                        setup_openssh_ecdsa_key_384,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_import_pubkey_file,\n                                        setup_openssh_ecdsa_key_521,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_import_privkey_base64,\n                                        setup_ecdsa_key_256,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_import_privkey_base64,\n                                        setup_ecdsa_key_384,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_import_privkey_base64,\n                                        setup_ecdsa_key_521,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_import_privkey_base64_comment,\n                                        setup_ecdsa_key_256,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_import_privkey_base64_comment,\n                                        setup_ecdsa_key_384,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_import_privkey_base64_comment,\n                                        setup_ecdsa_key_521,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_import_privkey_base64_whitespace,\n                                        setup_ecdsa_key_521,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_import_privkey_base64_whitespace,\n                                        setup_ecdsa_key_521,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_import_privkey_base64_whitespace,\n                                        setup_ecdsa_key_521,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_import_privkey_base64,\n                                        setup_openssh_ecdsa_key_256,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_import_privkey_base64,\n                                        setup_openssh_ecdsa_key_384,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_import_privkey_base64,\n                                        setup_openssh_ecdsa_key_521,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_publickey_from_privatekey,\n                                        setup_ecdsa_key_256,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_publickey_from_privatekey,\n                                        setup_ecdsa_key_384,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_publickey_from_privatekey,\n                                        setup_ecdsa_key_521,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_import_cert_file,\n                                        setup_ecdsa_key_256,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_import_cert_file,\n                                        setup_ecdsa_key_384,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_import_cert_file,\n                                        setup_ecdsa_key_521,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_duplicate_then_demote,\n                                        setup_ecdsa_key_256,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_duplicate_then_demote,\n                                        setup_ecdsa_key_384,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_duplicate_then_demote,\n                                        setup_ecdsa_key_521,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_publickey_base64,\n                                        setup_ecdsa_key_256,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_publickey_base64,\n                                        setup_ecdsa_key_384,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_publickey_base64,\n                                        setup_ecdsa_key_521,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_generate_pubkey_from_privkey,\n                                        setup_ecdsa_key_256,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_generate_pubkey_from_privkey,\n                                        setup_ecdsa_key_384,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_generate_pubkey_from_privkey,\n                                        setup_ecdsa_key_521,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_duplicate_key,\n                                        setup_ecdsa_key_256,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_duplicate_key,\n                                        setup_ecdsa_key_384,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_duplicate_key,\n                                        setup_ecdsa_key_521,\n                                        teardown),\n        cmocka_unit_test(torture_pki_generate_key_ecdsa),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_cert_verify,\n                                        setup_ecdsa_key_256,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_cert_verify,\n                                        setup_ecdsa_key_384,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_cert_verify,\n                                        setup_ecdsa_key_521,\n                                        teardown),\n#ifdef HAVE_LIBCRYPTO\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_write_privkey,\n                                        setup_ecdsa_key_256,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_write_privkey,\n                                        setup_ecdsa_key_384,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_write_privkey,\n                                        setup_ecdsa_key_521,\n                                        teardown),\n#endif /* HAVE_LIBCRYPTO */\n        cmocka_unit_test(torture_pki_sign_data_ecdsa),\n        cmocka_unit_test(torture_pki_fail_sign_with_incompatible_hash),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_name256,\n                                        setup_ecdsa_key_256,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_name384,\n                                        setup_ecdsa_key_384,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ecdsa_name521,\n                                        setup_ecdsa_key_521,\n                                        teardown),\n    };\n\n    ssh_init();\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, NULL, NULL);\n    ssh_finalize();\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/unittests/torture_pki_ed25519.c",
    "content": "#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include \"torture.h\"\n#include \"torture_key.h\"\n#include \"torture_pki.h\"\n#include \"pki.c\"\n#include <sys/stat.h>\n#include <fcntl.h>\n\n#define LIBSSH_ED25519_TESTKEY \"libssh_testkey.id_ed25519\"\n#define LIBSSH_ED25519_TESTKEY_PASSPHRASE \"libssh_testkey_passphrase.id_ed25519\"\n\nconst char template[] = \"temp_dir_XXXXXX\";\nconst unsigned char HASH[] = \"12345678901234567890\";\nconst uint8_t ref_signature[ED25519_SIG_LEN]=\n    \"\\xbb\\x8d\\x55\\x9f\\x06\\x14\\x39\\x24\\xb4\\xe1\\x5a\\x57\\x3d\\x9d\\xbe\\x22\"\n    \"\\x1b\\xc1\\x32\\xd5\\x55\\x16\\x00\\x64\\xce\\xb4\\xc3\\xd2\\xe3\\x6f\\x5e\\x8d\"\n    \"\\x10\\xa3\\x18\\x93\\xdf\\xa4\\x96\\x81\\x11\\x8e\\x1e\\x26\\x14\\x8a\\x08\\x1b\"\n    \"\\x01\\x6a\\x60\\x59\\x9c\\x4a\\x55\\xa3\\x16\\x56\\xf6\\xc4\\x50\\x42\\x7f\\x03\";\n\nstruct pki_st {\n    char *cwd;\n    char *temp_dir;\n};\n\nstatic int setup_ed25519_key(void **state)\n{\n    const char *keystring = NULL;\n    struct pki_st *test_state = NULL;\n    char *cwd = NULL;\n    char *tmp_dir = NULL;\n    int rc = 0;\n\n    test_state = (struct pki_st *)malloc(sizeof(struct pki_st));\n    assert_non_null(test_state);\n\n    cwd = torture_get_current_working_dir();\n    assert_non_null(cwd);\n\n    tmp_dir = torture_make_temp_dir(template);\n    assert_non_null(tmp_dir);\n\n    test_state->cwd = cwd;\n    test_state->temp_dir = tmp_dir;\n\n    *state = test_state;\n\n    rc = torture_change_dir(tmp_dir);\n    assert_int_equal(rc, 0);\n\n    printf(\"Changed directory to: %s\\n\", tmp_dir);\n\n    keystring = torture_get_openssh_testkey(SSH_KEYTYPE_ED25519, 0);\n    torture_write_file(LIBSSH_ED25519_TESTKEY, keystring);\n    keystring = torture_get_openssh_testkey(SSH_KEYTYPE_ED25519, 1);\n    torture_write_file(LIBSSH_ED25519_TESTKEY_PASSPHRASE, keystring);\n\n    torture_write_file(LIBSSH_ED25519_TESTKEY \".pub\",\n                       torture_get_testkey_pub(SSH_KEYTYPE_ED25519));\n    torture_write_file(LIBSSH_ED25519_TESTKEY \"-cert.pub\",\n                       torture_get_testkey_pub(SSH_KEYTYPE_ED25519_CERT01));\n\n    return 0;\n}\n\nstatic int teardown(void **state) {\n    struct pki_st *test_state = NULL;\n    int rc = 0;\n\n    test_state = *((struct pki_st **)state);\n\n    assert_non_null(test_state);\n    assert_non_null(test_state->cwd);\n    assert_non_null(test_state->temp_dir);\n\n    rc = torture_change_dir(test_state->cwd);\n    assert_int_equal(rc, 0);\n\n    rc = torture_rmdirs(test_state->temp_dir);\n    assert_int_equal(rc, 0);\n\n    SAFE_FREE(test_state->temp_dir);\n    SAFE_FREE(test_state->cwd);\n    SAFE_FREE(test_state);\n\n    return 0;\n}\n\nstatic void torture_pki_ed25519_import_pubkey_file(void **state)\n{\n    ssh_key pubkey = NULL;\n    int rc;\n\n    (void)state;\n\n    /* The key doesn't have the hostname as comment after the key */\n    rc = ssh_pki_import_pubkey_file(LIBSSH_ED25519_TESTKEY \".pub\", &pubkey);\n    assert_return_code(rc, errno);\n    assert_non_null(pubkey);\n\n    SSH_KEY_FREE(pubkey);\n}\n\nstatic void torture_pki_ed25519_import_pubkey_from_openssh_privkey(void **state)\n{\n    ssh_key pubkey = NULL;\n    int rc;\n\n    (void)state;\n\n    /* The key doesn't have the hostname as comment after the key */\n    rc = ssh_pki_import_pubkey_file(LIBSSH_ED25519_TESTKEY_PASSPHRASE, &pubkey);\n    assert_return_code(rc, errno);\n    assert_non_null(pubkey);\n\n    SSH_KEY_FREE(pubkey);\n}\n\nstatic void torture_pki_ed25519_import_privkey_base64(void **state)\n{\n    int rc;\n    char *key_str = NULL;\n    ssh_key key = NULL;\n    const char *passphrase = torture_get_testkey_passphrase();\n    enum ssh_keytypes_e type;\n\n    (void) state; /* unused */\n\n    key_str = torture_pki_read_file(LIBSSH_ED25519_TESTKEY);\n    assert_non_null(key_str);\n\n    rc = ssh_pki_import_privkey_base64(key_str, passphrase, NULL, NULL, &key);\n    assert_true(rc == 0);\n    assert_non_null(key);\n\n    type = ssh_key_type(key);\n    assert_true(type == SSH_KEYTYPE_ED25519);\n\n    rc = ssh_key_is_private(key);\n    assert_true(rc == 1);\n\n    rc = ssh_key_is_public(key);\n    assert_true(rc == 1);\n\n    free(key_str);\n    SSH_KEY_FREE(key);\n\n}\n\nstatic void torture_pki_ed25519_import_privkey_base64_comment(void **state)\n{\n    int rc, file_str_len;\n    const char *comment_str = \"#this is line-comment\\n#this is another\\n\";\n    char *key_str = NULL, *file_str = NULL;\n    ssh_key key = NULL;\n    const char *passphrase = torture_get_testkey_passphrase();\n    enum ssh_keytypes_e type;\n\n    (void) state; /* unused */\n\n    key_str = torture_pki_read_file(LIBSSH_ED25519_TESTKEY);\n    assert_non_null(key_str);\n\n    file_str_len = strlen(comment_str) + strlen(key_str) + 1;\n    file_str = malloc(file_str_len);\n    assert_non_null(file_str);\n    rc = snprintf(file_str, file_str_len, \"%s%s\", comment_str, key_str);\n    assert_int_equal(rc, file_str_len - 1);\n\n    rc = ssh_pki_import_privkey_base64(file_str, passphrase, NULL, NULL, &key);\n    assert_true(rc == 0);\n    assert_non_null(key);\n\n    type = ssh_key_type(key);\n    assert_true(type == SSH_KEYTYPE_ED25519);\n\n    rc = ssh_key_is_private(key);\n    assert_true(rc == 1);\n\n    rc = ssh_key_is_public(key);\n    assert_true(rc == 1);\n\n    free(key_str);\n    free(file_str);\n    SSH_KEY_FREE(key);\n\n}\n\nstatic void torture_pki_ed25519_import_privkey_base64_whitespace(void **state)\n{\n    int rc, file_str_len;\n    const char *whitespace_str = \"      \\n\\t\\t\\t\\t\\t\\n\\n\\n\\n\\n\";\n    char *key_str = NULL, *file_str = NULL;\n    ssh_key key = NULL;\n    const char *passphrase = torture_get_testkey_passphrase();\n    enum ssh_keytypes_e type;\n\n    (void) state; /* unused */\n\n    key_str = torture_pki_read_file(LIBSSH_ED25519_TESTKEY);\n    assert_non_null(key_str);\n\n    file_str_len = strlen(whitespace_str) + strlen(key_str) + 1;\n    file_str = malloc(file_str_len);\n    assert_non_null(file_str);\n    rc = snprintf(file_str, file_str_len, \"%s%s\", whitespace_str, key_str);\n    assert_int_equal(rc, file_str_len - 1);\n\n    rc = ssh_pki_import_privkey_base64(file_str, passphrase, NULL, NULL, &key);\n    assert_true(rc == 0);\n    assert_non_null(key);\n\n    type = ssh_key_type(key);\n    assert_true(type == SSH_KEYTYPE_ED25519);\n\n    rc = ssh_key_is_private(key);\n    assert_true(rc == 1);\n\n    rc = ssh_key_is_public(key);\n    assert_true(rc == 1);\n\n    free(key_str);\n    free(file_str);\n    SSH_KEY_FREE(key);\n\n}\n\nstatic void torture_pki_ed25519_import_export_privkey_base64(void **state)\n{\n    char *b64_key = NULL;\n    ssh_key key = NULL;\n    const char *passphrase = torture_get_testkey_passphrase();\n    enum ssh_keytypes_e type;\n    int rc;\n\n    (void) state; /* unused */\n\n    rc = ssh_pki_import_privkey_base64(torture_get_openssh_testkey(SSH_KEYTYPE_ED25519,\n                                                                   false),\n                                       passphrase,\n                                       NULL,\n                                       NULL,\n                                       &key);\n    assert_return_code(rc, errno);\n    assert_non_null(key);\n\n    type = ssh_key_type(key);\n    assert_true(type == SSH_KEYTYPE_ED25519);\n\n    rc = ssh_key_is_private(key);\n    assert_true(rc == 1);\n\n    rc = ssh_pki_export_privkey_base64(key,\n                                       passphrase,\n                                       NULL,\n                                       NULL,\n                                       &b64_key);\n    assert_return_code(rc, errno);\n    assert_non_null(b64_key);\n    SSH_KEY_FREE(key);\n\n    rc = ssh_pki_import_privkey_base64(b64_key,\n                                       passphrase,\n                                       NULL,\n                                       NULL,\n                                       &key);\n    assert_return_code(rc, errno);\n    assert_non_null(key);\n\n    type = ssh_key_type(key);\n    assert_true(type == SSH_KEYTYPE_ED25519);\n\n    rc = ssh_key_is_private(key);\n    assert_true(rc == 1);\n\n    SSH_STRING_FREE_CHAR(b64_key);\n    SSH_KEY_FREE(key);\n}\n\nstatic void torture_pki_ed25519_publickey_from_privatekey(void **state)\n{\n    int rc;\n    ssh_key key = NULL;\n    ssh_key pubkey = NULL;\n    const char *passphrase = NULL;\n    const char *keystring = NULL;\n\n    (void) state; /* unused */\n\n    keystring = torture_get_openssh_testkey(SSH_KEYTYPE_ED25519, 0);\n    rc = ssh_pki_import_privkey_base64(keystring,\n                                       passphrase,\n                                       NULL,\n                                       NULL,\n                                       &key);\n    assert_true(rc == 0);\n    assert_non_null(key);\n\n    rc = ssh_key_is_private(key);\n    assert_true(rc == 1);\n\n    rc = ssh_pki_export_privkey_to_pubkey(key, &pubkey);\n    assert_true(rc == SSH_OK);\n    assert_non_null(pubkey);\n\n    SSH_KEY_FREE(key);\n    SSH_KEY_FREE(pubkey);\n}\n\nstatic void torture_pki_ed25519_import_cert_file(void **state)\n{\n    int rc;\n    ssh_key cert = NULL;\n    enum ssh_keytypes_e type;\n\n    (void) state; /* unused */\n\n    rc = ssh_pki_import_cert_file(LIBSSH_ED25519_TESTKEY \"-cert.pub\", &cert);\n    assert_true(rc == 0);\n    assert_non_null(cert);\n\n    type = ssh_key_type(cert);\n    assert_true(type == SSH_KEYTYPE_ED25519_CERT01);\n\n    rc = ssh_key_is_public(cert);\n    assert_true(rc == 1);\n\n    SSH_KEY_FREE(cert);\n}\n\nstatic void torture_pki_ed25519_publickey_base64(void **state)\n{\n    enum ssh_keytypes_e type;\n    char *b64_key = NULL, *key_buf = NULL, *p = NULL;\n    const char *q = NULL;\n    ssh_key key = NULL;\n    int rc;\n\n    (void) state; /* unused */\n\n    key_buf = strdup(torture_get_testkey_pub(SSH_KEYTYPE_ED25519));\n    assert_non_null(key_buf);\n\n    q = p = key_buf;\n    while (p != NULL && *p != '\\0' && *p != ' ') p++;\n    if (p != NULL) {\n        *p = '\\0';\n    }\n\n    type = ssh_key_type_from_name(q);\n    assert_true(type == SSH_KEYTYPE_ED25519);\n\n    q = ++p;\n    while (p != NULL && *p != '\\0' && *p != ' ') p++;\n    if (p != NULL) {\n        *p = '\\0';\n    }\n\n    rc = ssh_pki_import_pubkey_base64(q, type, &key);\n    assert_true(rc == 0);\n    assert_non_null(key);\n\n    rc = ssh_pki_export_pubkey_base64(key, &b64_key);\n    assert_true(rc == 0);\n    assert_non_null(b64_key);\n\n    assert_string_equal(q, b64_key);\n\n    free(b64_key);\n    free(key_buf);\n    SSH_KEY_FREE(key);\n}\n\nstatic void torture_pki_ed25519_generate_pubkey_from_privkey(void **state)\n{\n    char pubkey_generated[4096] = {0};\n    ssh_key privkey = NULL;\n    ssh_key pubkey = NULL;\n    int rc;\n    int len;\n\n    (void) state; /* unused */\n\n    /* remove the public key, generate it from the private key and write it. */\n    unlink(LIBSSH_ED25519_TESTKEY \".pub\");\n\n    rc = ssh_pki_import_privkey_file(LIBSSH_ED25519_TESTKEY,\n                                     NULL,\n                                     NULL,\n                                     NULL,\n                                     &privkey);\n    assert_true(rc == 0);\n\n    rc = ssh_pki_export_privkey_to_pubkey(privkey, &pubkey);\n    assert_true(rc == SSH_OK);\n    assert_non_null(pubkey);\n\n    rc = ssh_pki_export_pubkey_file(pubkey, LIBSSH_ED25519_TESTKEY \".pub\");\n    assert_true(rc == 0);\n\n    rc = torture_read_one_line(LIBSSH_ED25519_TESTKEY \".pub\",\n                               pubkey_generated,\n                               sizeof(pubkey_generated));\n    assert_true(rc == 0);\n\n    len = torture_pubkey_len(torture_get_testkey_pub(SSH_KEYTYPE_ED25519));\n    assert_memory_equal(torture_get_testkey_pub(SSH_KEYTYPE_ED25519),\n                        pubkey_generated,\n                        len);\n\n    SSH_KEY_FREE(privkey);\n    SSH_KEY_FREE(pubkey);\n}\n\nstatic void torture_pki_ed25519_generate_key(void **state)\n{\n    int rc;\n    ssh_key key = NULL, pubkey = NULL;\n    ssh_signature sign = NULL;\n    enum ssh_keytypes_e type = SSH_KEYTYPE_UNKNOWN;\n    const char *type_char = NULL;\n    ssh_session session=ssh_new();\n    uint8_t *raw_sig_data = NULL;\n    (void) state;\n\n    /* Skip test if in FIPS mode */\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    assert_non_null(session);\n\n    rc = ssh_pki_generate(SSH_KEYTYPE_ED25519, 256, &key);\n    assert_true(rc == SSH_OK);\n    assert_non_null(key);\n    rc = ssh_pki_export_privkey_to_pubkey(key, &pubkey);\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(pubkey);\n    sign = pki_do_sign(key, HASH, 20, SSH_DIGEST_AUTO);\n    assert_non_null(sign);\n    rc = ssh_pki_signature_verify(session, sign, pubkey, HASH, 20);\n    assert_true(rc == SSH_OK);\n    type = ssh_key_type(key);\n    assert_true(type == SSH_KEYTYPE_ED25519);\n    type_char = ssh_key_type_to_char(type);\n    assert_true(strcmp(type_char, \"ssh-ed25519\") == 0);\n\n    /* try an invalid signature */\n#ifdef HAVE_OPENSSL_ED25519\n    raw_sig_data = ssh_string_data(sign->raw_sig);\n#else\n    raw_sig_data = (uint8_t *)sign->ed25519_sig;\n#endif\n    assert_non_null(raw_sig_data);\n    (raw_sig_data)[3]^= 0xff;\n    rc = ssh_pki_signature_verify(session, sign, pubkey, HASH, 20);\n    assert_true(rc == SSH_ERROR);\n\n    ssh_signature_free(sign);\n    SSH_KEY_FREE(key);\n    SSH_KEY_FREE(pubkey);\n\n    ssh_free(session);\n}\n\nstatic void torture_pki_ed25519_cert_verify(void **state)\n{\n    int rc;\n    ssh_key privkey = NULL, cert = NULL;\n    ssh_signature sign = NULL;\n    ssh_session session=ssh_new();\n    (void) state;\n\n    /* Skip test if in FIPS mode */\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    assert_non_null(session);\n\n    rc = ssh_pki_import_privkey_file(LIBSSH_ED25519_TESTKEY,\n                                     NULL,\n                                     NULL,\n                                     NULL,\n                                     &privkey);\n    assert_true(rc == 0);\n    assert_non_null(privkey);\n\n    rc = ssh_pki_import_cert_file(LIBSSH_ED25519_TESTKEY \"-cert.pub\", &cert);\n    assert_true(rc == 0);\n    assert_non_null(cert);\n\n    sign = pki_do_sign(privkey, HASH, 20, SSH_DIGEST_AUTO);\n    assert_non_null(sign);\n    rc = ssh_pki_signature_verify(session, sign, cert, HASH, 20);\n    assert_true(rc == SSH_OK);\n    ssh_signature_free(sign);\n    SSH_KEY_FREE(privkey);\n    SSH_KEY_FREE(cert);\n\n    ssh_free(session);\n}\n\nstatic void torture_pki_ed25519_write_privkey(void **state)\n{\n    ssh_key origkey = NULL;\n    ssh_key privkey = NULL;\n    int rc;\n\n    (void) state; /* unused */\n\n    rc = ssh_pki_import_privkey_file(LIBSSH_ED25519_TESTKEY,\n            NULL,\n            NULL,\n            NULL,\n            &origkey);\n    assert_true(rc == 0);\n    assert_non_null(origkey);\n\n    unlink(LIBSSH_ED25519_TESTKEY);\n\n    rc = ssh_pki_export_privkey_file(origkey,\n            NULL,\n            NULL,\n            NULL,\n            LIBSSH_ED25519_TESTKEY);\n    assert_true(rc == 0);\n\n    rc = ssh_pki_import_privkey_file(LIBSSH_ED25519_TESTKEY,\n            NULL,\n            NULL,\n            NULL,\n            &privkey);\n    assert_true(rc == 0);\n    assert_non_null(privkey);\n\n    rc = ssh_key_cmp(origkey, privkey, SSH_KEY_CMP_PRIVATE);\n    assert_true(rc == 0);\n\n    unlink(LIBSSH_ED25519_TESTKEY);\n    SSH_KEY_FREE(privkey);\n    /* do the same with passphrase */\n    rc = ssh_pki_export_privkey_file(origkey,\n            torture_get_testkey_passphrase(),\n            NULL,\n            NULL,\n            LIBSSH_ED25519_TESTKEY);\n    assert_true(rc == 0);\n\n    rc = ssh_pki_import_privkey_file(LIBSSH_ED25519_TESTKEY,\n            NULL,\n            NULL,\n            NULL,\n            &privkey);\n    /* opening without passphrase should fail */\n    assert_true(rc == SSH_ERROR);\n\n    rc = ssh_pki_import_privkey_file(LIBSSH_ED25519_TESTKEY,\n            torture_get_testkey_passphrase(),\n            NULL,\n            NULL,\n            &privkey);\n    assert_true(rc == 0);\n    assert_non_null(privkey);\n\n    rc = ssh_key_cmp(origkey, privkey, SSH_KEY_CMP_PRIVATE);\n    assert_true(rc == 0);\n    unlink(LIBSSH_ED25519_TESTKEY);\n\n    SSH_KEY_FREE(origkey);\n    SSH_KEY_FREE(privkey);\n\n    /* Test with passphrase */\n    rc = ssh_pki_import_privkey_file(LIBSSH_ED25519_TESTKEY_PASSPHRASE,\n                                     torture_get_testkey_passphrase(),\n                                     NULL,\n                                     NULL,\n                                     &origkey);\n    assert_true(rc == 0);\n    assert_non_null(origkey);\n\n    unlink(LIBSSH_ED25519_TESTKEY_PASSPHRASE);\n    rc = ssh_pki_export_privkey_file(origkey,\n                                     torture_get_testkey_passphrase(),\n                                     NULL,\n                                     NULL,\n                                     LIBSSH_ED25519_TESTKEY_PASSPHRASE);\n    assert_true(rc == 0);\n\n    /* Test with invalid passphrase */\n    rc = ssh_pki_import_privkey_file(LIBSSH_ED25519_TESTKEY_PASSPHRASE,\n                                     \"invalid secret\",\n                                     NULL,\n                                     NULL,\n                                     &privkey);\n    assert_true(rc == SSH_ERROR);\n\n    rc = ssh_pki_import_privkey_file(LIBSSH_ED25519_TESTKEY_PASSPHRASE,\n                                     torture_get_testkey_passphrase(),\n                                     NULL,\n                                     NULL,\n                                     &privkey);\n    assert_true(rc == 0);\n    assert_non_null(privkey);\n\n    rc = ssh_key_cmp(origkey, privkey, SSH_KEY_CMP_PRIVATE);\n    assert_true(rc == 0);\n\n    SSH_KEY_FREE(origkey);\n    SSH_KEY_FREE(privkey);\n}\n\nstatic void torture_pki_ed25519_sign(void **state)\n{\n    ssh_key privkey = NULL;\n    ssh_signature sig = NULL;\n    ssh_string blob = NULL;\n    const char *keystring = NULL;\n    int rc;\n\n    /* Skip test if in FIPS mode */\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    (void)state;\n\n    keystring = torture_get_openssh_testkey(SSH_KEYTYPE_ED25519, 0);\n    rc = ssh_pki_import_privkey_base64(keystring,\n                                       NULL,\n                                       NULL,\n                                       NULL,\n                                       &privkey);\n    assert_true(rc == SSH_OK);\n    assert_non_null(privkey);\n\n    sig = pki_do_sign(privkey, HASH, sizeof(HASH), SSH_DIGEST_AUTO);\n    assert_non_null(sig);\n\n    blob = pki_signature_to_blob(sig);\n    assert_non_null(blob);\n\n    assert_int_equal(ssh_string_len(blob), sizeof(ref_signature));\n    assert_memory_equal(ssh_string_data(blob), ref_signature,\n                        sizeof(ref_signature));\n\n    ssh_signature_free(sig);\n    SSH_KEY_FREE(privkey);\n    SSH_STRING_FREE(blob);\n\n}\n\nstatic void torture_pki_ed25519_sign_openssh_privkey_passphrase(void **state)\n{\n    ssh_key privkey = NULL;\n    ssh_signature sig = NULL;\n    ssh_string blob = NULL;\n    const char *keystring = NULL;\n    int rc;\n\n    /* Skip test if in FIPS mode */\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    (void)state;\n\n    keystring = torture_get_openssh_testkey(SSH_KEYTYPE_ED25519, 1);\n    rc = ssh_pki_import_privkey_base64(keystring,\n                                       torture_get_testkey_passphrase(),\n                                       NULL,\n                                       NULL,\n                                       &privkey);\n    assert_true(rc == SSH_OK);\n    assert_non_null(privkey);\n\n    sig = pki_do_sign(privkey, HASH, sizeof(HASH), SSH_DIGEST_AUTO);\n    assert_non_null(sig);\n\n    blob = pki_signature_to_blob(sig);\n    assert_non_null(blob);\n    assert_int_equal(ssh_string_len(blob), sizeof(ref_signature));\n    assert_memory_equal(ssh_string_data(blob), ref_signature,\n                        sizeof(ref_signature));\n\n    ssh_signature_free(sig);\n    SSH_KEY_FREE(privkey);\n    SSH_STRING_FREE(blob);\n}\n\n#ifdef HAVE_OPENSSL_ED25519\nstatic void torture_pki_ed25519_sign_pkcs8_privkey(void **state)\n{\n    ssh_key privkey = NULL;\n    ssh_signature sig = NULL;\n    ssh_string blob = NULL;\n    const char *keystring = NULL;\n    int rc;\n\n    /* Skip test if in FIPS mode */\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    (void)state;\n\n    keystring = torture_get_testkey(SSH_KEYTYPE_ED25519, 0);\n    rc = ssh_pki_import_privkey_base64(keystring,\n                                       NULL,\n                                       NULL,\n                                       NULL,\n                                       &privkey);\n    assert_true(rc == SSH_OK);\n    assert_non_null(privkey);\n\n    sig = pki_do_sign(privkey, HASH, sizeof(HASH), SSH_DIGEST_AUTO);\n    assert_non_null(sig);\n\n    blob = pki_signature_to_blob(sig);\n    assert_non_null(blob);\n    assert_int_equal(ssh_string_len(blob), sizeof(ref_signature));\n    assert_memory_equal(ssh_string_data(blob), ref_signature,\n                        sizeof(ref_signature));\n\n    ssh_signature_free(sig);\n    SSH_KEY_FREE(privkey);\n    SSH_STRING_FREE(blob);\n}\n\nstatic void torture_pki_ed25519_sign_pkcs8_privkey_passphrase(void **state)\n{\n    ssh_key privkey = NULL;\n    ssh_signature sig = NULL;\n    ssh_string blob = NULL;\n    const char *keystring = NULL;\n    int rc;\n\n    /* Skip test if in FIPS mode */\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    (void)state;\n\n    keystring = torture_get_testkey(SSH_KEYTYPE_ED25519, 1);\n    rc = ssh_pki_import_privkey_base64(keystring,\n                                       torture_get_testkey_passphrase(),\n                                       NULL,\n                                       NULL,\n                                       &privkey);\n    assert_true(rc == SSH_OK);\n    assert_non_null(privkey);\n\n    sig = pki_do_sign(privkey, HASH, sizeof(HASH), SSH_DIGEST_AUTO);\n    assert_non_null(sig);\n\n    blob = pki_signature_to_blob(sig);\n    assert_non_null(blob);\n    assert_int_equal(ssh_string_len(blob), sizeof(ref_signature));\n    assert_memory_equal(ssh_string_data(blob), ref_signature,\n                        sizeof(ref_signature));\n\n    ssh_signature_free(sig);\n    SSH_KEY_FREE(privkey);\n    SSH_STRING_FREE(blob);\n}\n#endif /* HAVE_OPENSSL_ED25519 */\n\nstatic void torture_pki_ed25519_verify(void **state){\n    ssh_key pubkey = NULL;\n    ssh_signature sig = NULL;\n    ssh_session session = NULL;\n    ssh_string blob = ssh_string_new(ED25519_SIG_LEN);\n    char *pkey_ptr = strdup(strchr(torture_get_testkey_pub(SSH_KEYTYPE_ED25519), ' ') + 1);\n    char *ptr = NULL;\n    uint8_t *raw_sig_data = NULL;\n    int rc;\n    (void) state;\n\n    /* Skip test if in FIPS mode */\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    session = ssh_new();\n    assert_non_null(session);\n\n    /* remove trailing comment */\n    ptr = strchr(pkey_ptr, ' ');\n    if(ptr != NULL){\n        *ptr = '\\0';\n    }\n    rc = ssh_pki_import_pubkey_base64(pkey_ptr, SSH_KEYTYPE_ED25519, &pubkey);\n    assert_true(rc == SSH_OK);\n    assert_non_null(pubkey);\n\n    ssh_string_fill(blob, ref_signature, ED25519_SIG_LEN);\n    sig = pki_signature_from_blob(pubkey, blob, SSH_KEYTYPE_ED25519, SSH_DIGEST_AUTO);\n    assert_non_null(sig);\n\n    rc = ssh_pki_signature_verify(session, sig, pubkey, HASH, sizeof(HASH));\n    assert_true(rc == SSH_OK);\n\n    /* Alter signature and expect verification error */\n#if defined(HAVE_OPENSSL_ED25519)\n    raw_sig_data = ssh_string_data(sig->raw_sig);\n#else\n    raw_sig_data = (uint8_t *)sig->ed25519_sig;\n#endif\n    assert_non_null(raw_sig_data);\n    (raw_sig_data)[3]^= 0xff;\n    rc = ssh_pki_signature_verify(session, sig, pubkey, HASH, sizeof(HASH));\n    assert_true(rc == SSH_ERROR);\n\n    ssh_signature_free(sig);\n\n    SSH_KEY_FREE(pubkey);\n    SSH_STRING_FREE(blob);\n    free(pkey_ptr);\n    ssh_free(session);\n}\n\nstatic void torture_pki_ed25519_verify_bad(void **state){\n    ssh_key pubkey = NULL;\n    ssh_signature sig = NULL;\n    ssh_session session = NULL;\n    ssh_string blob = ssh_string_new(ED25519_SIG_LEN);\n    char *pkey_ptr = strdup(strchr(torture_get_testkey_pub(SSH_KEYTYPE_ED25519), ' ') + 1);\n    char *ptr = NULL;\n    int rc;\n    int i;\n    (void) state;\n\n    /* Skip test if in FIPS mode */\n    if (ssh_fips_mode()) {\n        skip();\n    }\n\n    session = ssh_new();\n    assert_non_null(session);\n\n    /* remove trailing comment */\n    ptr = strchr(pkey_ptr, ' ');\n    if(ptr != NULL){\n        *ptr = '\\0';\n    }\n    rc = ssh_pki_import_pubkey_base64(pkey_ptr, SSH_KEYTYPE_ED25519, &pubkey);\n    assert_true(rc == SSH_OK);\n    assert_non_null(pubkey);\n\n    /* alter signature and expect false result */\n\n    for (i=0; i < ED25519_SIG_LEN; ++i){\n        ssh_string_fill(blob, ref_signature, ED25519_SIG_LEN);\n        ((uint8_t *)ssh_string_data(blob))[i] ^= 0xff;\n        sig = pki_signature_from_blob(pubkey, blob, SSH_KEYTYPE_ED25519, SSH_DIGEST_AUTO);\n        assert_non_null(sig);\n\n        rc = ssh_pki_signature_verify(session, sig, pubkey, HASH, sizeof(HASH));\n        assert_true(rc == SSH_ERROR);\n        ssh_signature_free(sig);\n\n    }\n    SSH_KEY_FREE(pubkey);\n    SSH_STRING_FREE(blob);\n    free(pkey_ptr);\n    ssh_free(session);\n}\n\nstatic void torture_pki_ed25519_import_privkey_base64_passphrase(void **state)\n{\n    int rc;\n    ssh_key key = NULL;\n    const char *passphrase = torture_get_testkey_passphrase();\n    const char *testkey = NULL;\n\n    (void) state; /* unused */\n\n    /* same for ED25519 */\n    testkey = torture_get_openssh_testkey(SSH_KEYTYPE_ED25519, 1);\n    rc = ssh_pki_import_privkey_base64(testkey,\n                                       passphrase,\n                                       NULL,\n                                       NULL,\n                                       &key);\n    assert_true(rc == 0);\n    assert_non_null(key);\n\n    rc = ssh_key_is_private(key);\n    assert_true(rc == 1);\n\n    SSH_KEY_FREE(key);\n\n    /* test if it returns -1 if passphrase is wrong */\n    rc = ssh_pki_import_privkey_base64(testkey,\n                                       \"wrong passphrase !!\",\n                                       NULL,\n                                       NULL,\n                                       &key);\n    assert_true(rc == -1);\n    SSH_KEY_FREE(key);\n}\n\nstatic void torture_pki_ed25519_privkey_dup(void **state)\n{\n    const char *passphrase = torture_get_testkey_passphrase();\n    ssh_key key = NULL;\n    ssh_key dup = NULL;\n    const char *testkey = NULL;\n    int rc;\n\n    (void) state; /* unused */\n\n    testkey = torture_get_openssh_testkey(SSH_KEYTYPE_ED25519, 1);\n    rc = ssh_pki_import_privkey_base64(testkey,\n                                       passphrase,\n                                       NULL,\n                                       NULL,\n                                       &key);\n    assert_true(rc == 0);\n    assert_non_null(key);\n\n    rc = ssh_key_is_private(key);\n    assert_true(rc == 1);\n\n    dup = ssh_key_dup(key);\n    assert_non_null(dup);\n\n    SSH_KEY_FREE(key);\n    SSH_KEY_FREE(dup);\n}\n\nstatic void torture_pki_ed25519_pubkey_dup(void **state)\n{\n    ssh_key pubkey = NULL;\n    ssh_key dup = NULL;\n    const char *p = strchr(torture_get_testkey_pub(SSH_KEYTYPE_ED25519), ' ');\n    char *pub_str = NULL;\n    char *q = NULL;\n    int rc;\n\n    (void) state; /* unused */\n\n    pub_str = strdup(p + 1);\n    assert_non_null(pub_str);\n\n    q = strchr(pub_str, ' ');\n    assert_non_null(q);\n    *q = '\\0';\n\n    rc = ssh_pki_import_pubkey_base64(pub_str,\n                                      SSH_KEYTYPE_ED25519,\n                                      &pubkey);\n    assert_true(rc == 0);\n    assert_non_null(pubkey);\n\n    rc = ssh_key_is_public(pubkey);\n    assert_true(rc == 1);\n\n    dup = ssh_key_dup(pubkey);\n    assert_non_null(dup);\n\n    rc = ssh_key_is_public(dup);\n    assert_true(rc == 1);\n\n    SAFE_FREE(pub_str);\n    SSH_KEY_FREE(pubkey);\n    SSH_KEY_FREE(dup);\n}\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_pki_ed25519_import_pubkey_file,\n                                        setup_ed25519_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ed25519_import_pubkey_from_openssh_privkey,\n                                        setup_ed25519_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ed25519_import_privkey_base64,\n                                        setup_ed25519_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ed25519_import_privkey_base64_comment,\n                                        setup_ed25519_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ed25519_import_privkey_base64_whitespace,\n                                        setup_ed25519_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ed25519_import_export_privkey_base64,\n                                        setup_ed25519_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ed25519_publickey_from_privatekey,\n                                        setup_ed25519_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ed25519_import_cert_file,\n                                        setup_ed25519_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ed25519_publickey_base64,\n                                        setup_ed25519_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ed25519_generate_pubkey_from_privkey,\n                                        setup_ed25519_key,\n                                        teardown),\n        cmocka_unit_test(torture_pki_ed25519_generate_key),\n        cmocka_unit_test_setup_teardown(torture_pki_ed25519_cert_verify,\n                                        setup_ed25519_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_ed25519_write_privkey,\n                                        setup_ed25519_key,\n                                        teardown),\n        cmocka_unit_test(torture_pki_ed25519_import_privkey_base64_passphrase),\n        cmocka_unit_test(torture_pki_ed25519_sign),\n        cmocka_unit_test(torture_pki_ed25519_sign_openssh_privkey_passphrase),\n#ifdef HAVE_OPENSSL_ED25519\n        cmocka_unit_test(torture_pki_ed25519_sign_pkcs8_privkey),\n        cmocka_unit_test(torture_pki_ed25519_sign_pkcs8_privkey_passphrase),\n#endif\n        cmocka_unit_test(torture_pki_ed25519_verify),\n        cmocka_unit_test(torture_pki_ed25519_verify_bad),\n        cmocka_unit_test(torture_pki_ed25519_privkey_dup),\n        cmocka_unit_test(torture_pki_ed25519_pubkey_dup),\n    };\n\n    ssh_init();\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, NULL, NULL);\n    ssh_finalize();\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/unittests/torture_pki_rsa.c",
    "content": "\n#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include <sys/stat.h>\n#include <fcntl.h>\n\n#include \"torture.h\"\n#include \"torture_pki.h\"\n#include \"torture_key.h\"\n#include \"pki.c\"\n\n#define LIBSSH_RSA_TESTKEY \"libssh_testkey.id_rsa\"\n#define LIBSSH_RSA_TESTKEY_PASSPHRASE \"libssh_testkey_passphrase.id_rsa\"\n\nconst char template[] = \"temp_dir_XXXXXX\";\nconst unsigned char INPUT[] = \"1234567890123456789012345678901234567890\"\n                              \"123456789012345678901234\";\n\nstruct pki_st {\n    char *cwd;\n    char *temp_dir;\n};\n\nstatic int setup_rsa_key(void **state)\n{\n    struct pki_st *test_state = NULL;\n    char *cwd = NULL;\n    char *tmp_dir = NULL;\n    int rc = 0;\n\n    test_state = (struct pki_st *)malloc(sizeof(struct pki_st));\n    assert_non_null(test_state);\n\n    cwd = torture_get_current_working_dir();\n    assert_non_null(cwd);\n\n    tmp_dir = torture_make_temp_dir(template);\n    assert_non_null(tmp_dir);\n\n    test_state->cwd = cwd;\n    test_state->temp_dir = tmp_dir;\n\n    *state = test_state;\n\n    rc = torture_change_dir(tmp_dir);\n    assert_int_equal(rc, 0);\n\n    printf(\"Changed directory to: %s\\n\", tmp_dir);\n\n    torture_write_file(LIBSSH_RSA_TESTKEY,\n                       torture_get_testkey(SSH_KEYTYPE_RSA, 0));\n    torture_write_file(LIBSSH_RSA_TESTKEY_PASSPHRASE,\n                       torture_get_testkey(SSH_KEYTYPE_RSA, 1));\n    torture_write_file(LIBSSH_RSA_TESTKEY \".pub\",\n                       torture_get_testkey_pub(SSH_KEYTYPE_RSA));\n    torture_write_file(LIBSSH_RSA_TESTKEY \"-cert.pub\",\n                       torture_get_testkey_pub(SSH_KEYTYPE_RSA_CERT01));\n\n    return 0;\n}\n\nstatic int setup_openssh_rsa_key(void **state)\n{\n    struct pki_st *test_state = NULL;\n    char *cwd = NULL;\n    char *tmp_dir = NULL;\n    int rc = 0;\n\n    test_state = (struct pki_st *)malloc(sizeof(struct pki_st));\n    assert_non_null(test_state);\n\n    cwd = torture_get_current_working_dir();\n    assert_non_null(cwd);\n\n    tmp_dir = torture_make_temp_dir(template);\n    assert_non_null(tmp_dir);\n\n    test_state->cwd = cwd;\n    test_state->temp_dir = tmp_dir;\n\n    *state = test_state;\n\n    rc = torture_change_dir(tmp_dir);\n    assert_int_equal(rc, 0);\n\n    torture_write_file(LIBSSH_RSA_TESTKEY,\n                       torture_get_openssh_testkey(SSH_KEYTYPE_RSA, 0));\n    torture_write_file(LIBSSH_RSA_TESTKEY_PASSPHRASE,\n                       torture_get_openssh_testkey(SSH_KEYTYPE_RSA, 1));\n    torture_write_file(LIBSSH_RSA_TESTKEY \".pub\",\n                       torture_get_testkey_pub(SSH_KEYTYPE_RSA));\n    torture_write_file(LIBSSH_RSA_TESTKEY \"-cert.pub\",\n                       torture_get_testkey_pub(SSH_KEYTYPE_RSA_CERT01));\n\n    return 0;\n}\n\nstatic int teardown(void **state) {\n\n    struct pki_st *test_state = NULL;\n    int rc = 0;\n\n    test_state = *((struct pki_st **)state);\n\n    assert_non_null(test_state);\n    assert_non_null(test_state->cwd);\n    assert_non_null(test_state->temp_dir);\n\n    rc = torture_change_dir(test_state->cwd);\n    assert_int_equal(rc, 0);\n\n    rc = torture_rmdirs(test_state->temp_dir);\n    assert_int_equal(rc, 0);\n\n    SAFE_FREE(test_state->temp_dir);\n    SAFE_FREE(test_state->cwd);\n    SAFE_FREE(test_state);\n\n    return 0;\n}\n\nstatic void torture_pki_rsa_import_pubkey_file(void **state)\n{\n    ssh_key pubkey = NULL;\n    int rc;\n\n    (void)state;\n\n    /* The key doesn't have the hostname as comment after the key */\n    rc = ssh_pki_import_pubkey_file(LIBSSH_RSA_TESTKEY \".pub\", &pubkey);\n    assert_return_code(rc, errno);\n    assert_non_null(pubkey);\n\n    SSH_KEY_FREE(pubkey);\n}\n\nstatic void torture_pki_rsa_import_pubkey_from_openssh_privkey(void **state)\n{\n    ssh_key pubkey = NULL;\n    int rc;\n\n    (void)state;\n\n    /* The key doesn't have the hostname as comment after the key */\n    rc = ssh_pki_import_pubkey_file(LIBSSH_RSA_TESTKEY_PASSPHRASE, &pubkey);\n    assert_return_code(rc, errno);\n    assert_non_null(pubkey);\n\n    SSH_KEY_FREE(pubkey);\n}\n\nstatic void torture_pki_rsa_import_privkey_base64_NULL_key(void **state)\n{\n    int rc;\n    const char *passphrase = torture_get_testkey_passphrase();\n\n    (void) state; /* unused */\n\n    /* test if it returns -1 if key is NULL */\n    rc = ssh_pki_import_privkey_base64(torture_get_testkey(SSH_KEYTYPE_RSA, 0),\n                                       passphrase,\n                                       NULL,\n                                       NULL,\n                                       NULL);\n    assert_true(rc == -1);\n\n}\n\nstatic void torture_pki_rsa_import_privkey_base64_NULL_str(void **state)\n{\n    int rc;\n    ssh_key key = NULL;\n    const char *passphrase = torture_get_testkey_passphrase();\n\n    (void) state; /* unused */\n\n    /* test if it returns -1 if key_str is NULL */\n    rc = ssh_pki_import_privkey_base64(NULL, passphrase, NULL, NULL, &key);\n    assert_true(rc == -1);\n\n    SSH_KEY_FREE(key);\n}\n\nstatic void torture_pki_rsa_import_privkey_base64(void **state)\n{\n    int rc;\n    char *key_str = NULL;\n    ssh_key key = NULL;\n    const char *passphrase = torture_get_testkey_passphrase();\n    enum ssh_keytypes_e type;\n\n    (void) state; /* unused */\n\n    key_str = torture_pki_read_file(LIBSSH_RSA_TESTKEY);\n    assert_non_null(key_str);\n\n    rc = ssh_pki_import_privkey_base64(key_str, passphrase, NULL, NULL, &key);\n    assert_true(rc == 0);\n    assert_non_null(key);\n\n    type = ssh_key_type(key);\n    assert_true(type == SSH_KEYTYPE_RSA);\n\n    rc = ssh_key_is_private(key);\n    assert_true(rc == 1);\n\n    rc = ssh_key_is_public(key);\n    assert_true(rc == 1);\n\n    free(key_str);\n    SSH_KEY_FREE(key);\n}\n\nstatic void torture_pki_rsa_import_privkey_base64_comment(void **state)\n{\n    int rc, file_str_len;\n    const char *comment_str = \"#this is line-comment\\n#this is another\\n\";\n    char *key_str = NULL, *file_str = NULL;\n    ssh_key key = NULL;\n    const char *passphrase = torture_get_testkey_passphrase();\n    enum ssh_keytypes_e type;\n\n    (void) state; /* unused */\n\n    key_str = torture_pki_read_file(LIBSSH_RSA_TESTKEY);\n    assert_non_null(key_str);\n\n    file_str_len = strlen(comment_str) + strlen(key_str) + 1;\n    file_str = malloc(file_str_len);\n    assert_non_null(file_str);\n    rc = snprintf(file_str, file_str_len, \"%s%s\", comment_str, key_str);\n    assert_int_equal(rc, file_str_len - 1);\n\n    rc = ssh_pki_import_privkey_base64(file_str, passphrase, NULL, NULL, &key);\n    assert_true(rc == 0);\n    assert_non_null(key);\n\n    type = ssh_key_type(key);\n    assert_true(type == SSH_KEYTYPE_RSA);\n\n    rc = ssh_key_is_private(key);\n    assert_true(rc == 1);\n\n    rc = ssh_key_is_public(key);\n    assert_true(rc == 1);\n\n    free(key_str);\n    free(file_str);\n    SSH_KEY_FREE(key);\n}\n\nstatic void torture_pki_rsa_import_privkey_base64_whitespace(void **state)\n{\n    int rc, file_str_len;\n    const char *whitespace_str = \"      \\n\\t\\t\\t\\t\\t\\n\\n\\n\\n\\n\";\n    char *key_str = NULL, *file_str = NULL;\n    ssh_key key = NULL;\n    const char *passphrase = torture_get_testkey_passphrase();\n    enum ssh_keytypes_e type;\n\n    (void) state; /* unused */\n\n    key_str = torture_pki_read_file(LIBSSH_RSA_TESTKEY);\n    assert_non_null(key_str);\n\n    file_str_len = strlen(whitespace_str) + strlen(key_str) + 1;\n    file_str = malloc(file_str_len);\n    assert_non_null(file_str);\n    rc = snprintf(file_str, file_str_len, \"%s%s\", whitespace_str, key_str);\n    assert_int_equal(rc, file_str_len - 1);\n\n    rc = ssh_pki_import_privkey_base64(file_str, passphrase, NULL, NULL, &key);\n    assert_true(rc == 0);\n    assert_non_null(key);\n\n    type = ssh_key_type(key);\n    assert_true(type == SSH_KEYTYPE_RSA);\n\n    rc = ssh_key_is_private(key);\n    assert_true(rc == 1);\n\n    rc = ssh_key_is_public(key);\n    assert_true(rc == 1);\n\n    free(key_str);\n    free(file_str);\n    SSH_KEY_FREE(key);\n}\n\nstatic void torture_pki_rsa_publickey_from_privatekey(void **state)\n{\n    int rc;\n    ssh_key key = NULL;\n    ssh_key pubkey = NULL;\n    const char *passphrase = NULL;\n\n    (void) state; /* unused */\n\n    rc = ssh_pki_import_privkey_base64(torture_get_testkey(SSH_KEYTYPE_RSA, 0),\n                                       passphrase,\n                                       NULL,\n                                       NULL,\n                                       &key);\n    assert_true(rc == 0);\n    assert_non_null(key);\n\n    rc = ssh_key_is_private(key);\n    assert_true(rc == 1);\n\n    rc = ssh_pki_export_privkey_to_pubkey(key, &pubkey);\n    assert_true(rc == SSH_OK);\n    assert_non_null(pubkey);\n\n    SSH_KEY_FREE(key);\n    SSH_KEY_FREE(pubkey);\n}\n\nstatic void torture_pki_rsa_copy_cert_to_privkey(void **state)\n{\n    /*\n     * Tests copying a cert loaded into a public key to a private key.\n     * The function is encryption type agnostic, no need to run this against\n     * all supported key types.\n     */\n    int rc;\n    const char *passphrase = torture_get_testkey_passphrase();\n    ssh_key pubkey = NULL;\n    ssh_key privkey = NULL;\n    ssh_key cert = NULL;\n\n    (void) state; /* unused */\n\n    rc = ssh_pki_import_cert_file(LIBSSH_RSA_TESTKEY \"-cert.pub\", &cert);\n    assert_true(rc == SSH_OK);\n    assert_non_null(cert);\n\n    rc = ssh_pki_import_pubkey_file(LIBSSH_RSA_TESTKEY \".pub\", &pubkey);\n    assert_true(rc == SSH_OK);\n    assert_non_null(pubkey);\n\n    rc = ssh_pki_import_privkey_base64(torture_get_testkey(SSH_KEYTYPE_RSA, 0),\n                                       passphrase,\n                                       NULL,\n                                       NULL,\n                                       &privkey);\n    assert_true(rc == SSH_OK);\n    assert_non_null(privkey);\n\n    /* Basic sanity. */\n    rc = ssh_pki_copy_cert_to_privkey(NULL, privkey);\n    assert_true(rc == SSH_ERROR);\n\n    rc = ssh_pki_copy_cert_to_privkey(pubkey, NULL);\n    assert_true(rc == SSH_ERROR);\n\n    /* A public key doesn't have a cert, copy should fail. */\n    assert_null(pubkey->cert);\n    rc = ssh_pki_copy_cert_to_privkey(pubkey, privkey);\n    assert_true(rc == SSH_ERROR);\n\n    /* Copying the cert to non-cert keys should work fine. */\n    rc = ssh_pki_copy_cert_to_privkey(cert, pubkey);\n    assert_true(rc == SSH_OK);\n    assert_non_null(pubkey->cert);\n    rc = ssh_pki_copy_cert_to_privkey(cert, privkey);\n    assert_true(rc == SSH_OK);\n    assert_non_null(privkey->cert);\n\n    /* The private key's cert is already set, another copy should fail. */\n    rc = ssh_pki_copy_cert_to_privkey(cert, privkey);\n    assert_true(rc == SSH_ERROR);\n\n    SSH_KEY_FREE(cert);\n    SSH_KEY_FREE(privkey);\n    SSH_KEY_FREE(pubkey);\n}\n\nstatic void torture_pki_rsa_import_cert_file(void **state) {\n    int rc;\n    ssh_key cert = NULL;\n    enum ssh_keytypes_e type;\n\n    (void) state; /* unused */\n\n    rc = ssh_pki_import_cert_file(LIBSSH_RSA_TESTKEY \"-cert.pub\", &cert);\n    assert_true(rc == 0);\n    assert_non_null(cert);\n\n    type = ssh_key_type(cert);\n    assert_true(type == SSH_KEYTYPE_RSA_CERT01);\n\n    rc = ssh_key_is_public(cert);\n    assert_true(rc == 1);\n\n    SSH_KEY_FREE(cert);\n}\n\nstatic void torture_pki_rsa_publickey_base64(void **state)\n{\n    enum ssh_keytypes_e type;\n    char *b64_key = NULL, *key_buf = NULL, *p = NULL;\n    const char *q = NULL;\n    ssh_key key = NULL;\n    int rc;\n\n    (void) state; /* unused */\n\n    key_buf = strdup(torture_get_testkey_pub(SSH_KEYTYPE_RSA));\n    assert_non_null(key_buf);\n\n    q = p = key_buf;\n    while (p != NULL && *p != '\\0' && *p != ' ') p++;\n    if (p != NULL) {\n        *p = '\\0';\n    }\n\n    type = ssh_key_type_from_name(q);\n    assert_true(type == SSH_KEYTYPE_RSA);\n\n    q = ++p;\n    while (p != NULL && *p != '\\0' && *p != ' ') p++;\n    if (p != NULL) {\n        *p = '\\0';\n    }\n\n    rc = ssh_pki_import_pubkey_base64(q, type, &key);\n    assert_true(rc == 0);\n    assert_non_null(key);\n\n    rc = ssh_pki_export_pubkey_base64(key, &b64_key);\n    assert_true(rc == 0);\n    assert_non_null(b64_key);\n\n    assert_string_equal(q, b64_key);\n\n    free(b64_key);\n    free(key_buf);\n    SSH_KEY_FREE(key);\n}\n\nstatic void torture_pki_rsa_generate_pubkey_from_privkey(void **state) {\n    char pubkey_generated[4096] = {0};\n    ssh_key privkey = NULL;\n    ssh_key pubkey = NULL;\n    int rc;\n    int len;\n\n    (void) state; /* unused */\n\n    /* remove the public key, generate it from the private key and write it. */\n    unlink(LIBSSH_RSA_TESTKEY \".pub\");\n\n    rc = ssh_pki_import_privkey_file(LIBSSH_RSA_TESTKEY,\n                                     NULL,\n                                     NULL,\n                                     NULL,\n                                     &privkey);\n    assert_true(rc == 0);\n    assert_non_null(privkey);\n\n    rc = ssh_pki_export_privkey_to_pubkey(privkey, &pubkey);\n    assert_true(rc == SSH_OK);\n    assert_non_null(pubkey);\n\n    rc = ssh_pki_export_pubkey_file(pubkey, LIBSSH_RSA_TESTKEY \".pub\");\n    assert_true(rc == 0);\n\n    rc = torture_read_one_line(LIBSSH_RSA_TESTKEY \".pub\",\n                               pubkey_generated,\n                               sizeof(pubkey_generated));\n    assert_true(rc == 0);\n\n    len = torture_pubkey_len(torture_get_testkey_pub(SSH_KEYTYPE_RSA));\n    assert_memory_equal(torture_get_testkey_pub(SSH_KEYTYPE_RSA),\n                        pubkey_generated,\n                        len);\n\n    SSH_KEY_FREE(privkey);\n    SSH_KEY_FREE(pubkey);\n}\n\nstatic void torture_pki_rsa_duplicate_key(void **state)\n{\n    int rc;\n    char *b64_key = NULL;\n    char *b64_key_gen = NULL;\n    ssh_key pubkey = NULL;\n    ssh_key pubkey_dup = NULL;\n    ssh_key privkey = NULL;\n    ssh_key privkey_dup = NULL;\n\n    (void) state;\n\n    rc = ssh_pki_import_pubkey_file(LIBSSH_RSA_TESTKEY \".pub\", &pubkey);\n    assert_true(rc == 0);\n    assert_non_null(pubkey);\n\n    rc = ssh_pki_export_pubkey_base64(pubkey, &b64_key);\n    assert_true(rc == 0);\n    assert_non_null(b64_key);\n\n    rc = ssh_pki_import_privkey_file(LIBSSH_RSA_TESTKEY,\n                                     NULL,\n                                     NULL,\n                                     NULL,\n                                     &privkey);\n    assert_true(rc == 0);\n    assert_non_null(privkey);\n\n    privkey_dup = ssh_key_dup(privkey);\n    assert_non_null(privkey_dup);\n\n    rc = ssh_pki_export_privkey_to_pubkey(privkey, &pubkey_dup);\n    assert_true(rc == SSH_OK);\n    assert_non_null(pubkey_dup);\n\n    rc = ssh_pki_export_pubkey_base64(pubkey_dup, &b64_key_gen);\n    assert_true(rc == 0);\n    assert_non_null(b64_key_gen);\n\n    assert_string_equal(b64_key, b64_key_gen);\n\n    rc = ssh_key_cmp(privkey, privkey_dup, SSH_KEY_CMP_PRIVATE);\n    assert_true(rc == 0);\n\n    rc = ssh_key_cmp(pubkey, pubkey_dup, SSH_KEY_CMP_PUBLIC);\n    assert_true(rc == 0);\n\n    SSH_KEY_FREE(pubkey);\n    SSH_KEY_FREE(pubkey_dup);\n    SSH_KEY_FREE(privkey);\n    SSH_KEY_FREE(privkey_dup);\n    SSH_STRING_FREE_CHAR(b64_key);\n    SSH_STRING_FREE_CHAR(b64_key_gen);\n}\n\nstatic void torture_pki_rsa_generate_key(void **state)\n{\n    int rc;\n    ssh_key key = NULL, pubkey = NULL;\n    ssh_signature sign = NULL;\n    ssh_session session=ssh_new();\n    (void) state;\n\n    if (!ssh_fips_mode()) {\n        rc = ssh_pki_generate(SSH_KEYTYPE_RSA, 1024, &key);\n        assert_true(rc == SSH_OK);\n        assert_non_null(key);\n        rc = ssh_pki_export_privkey_to_pubkey(key, &pubkey);\n        assert_int_equal(rc, SSH_OK);\n        assert_non_null(pubkey);\n        sign = pki_do_sign(key, INPUT, sizeof(INPUT), SSH_DIGEST_SHA256);\n        assert_non_null(sign);\n        rc = ssh_pki_signature_verify(session, sign, pubkey, INPUT, sizeof(INPUT));\n        assert_true(rc == SSH_OK);\n        ssh_signature_free(sign);\n        SSH_KEY_FREE(key);\n        SSH_KEY_FREE(pubkey);\n        key = NULL;\n        pubkey = NULL;\n    }\n\n    rc = ssh_pki_generate(SSH_KEYTYPE_RSA, 2048, &key);\n    assert_true(rc == SSH_OK);\n    assert_non_null(key);\n    rc = ssh_pki_export_privkey_to_pubkey(key, &pubkey);\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(pubkey);\n    sign = pki_do_sign(key, INPUT, sizeof(INPUT), SSH_DIGEST_SHA256);\n    assert_non_null(sign);\n    rc = ssh_pki_signature_verify(session, sign, pubkey, INPUT, sizeof(INPUT));\n    assert_true(rc == SSH_OK);\n    ssh_signature_free(sign);\n    SSH_KEY_FREE(key);\n    SSH_KEY_FREE(pubkey);\n    key = NULL;\n    pubkey = NULL;\n\n    rc = ssh_pki_generate(SSH_KEYTYPE_RSA, 4096, &key);\n    assert_true(rc == SSH_OK);\n    assert_non_null(key);\n    rc = ssh_pki_export_privkey_to_pubkey(key, &pubkey);\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(pubkey);\n    sign = pki_do_sign(key, INPUT, sizeof(INPUT), SSH_DIGEST_SHA256);\n    assert_non_null(sign);\n    rc = ssh_pki_signature_verify(session, sign, pubkey, INPUT, sizeof(INPUT));\n    assert_true(rc == SSH_OK);\n    ssh_signature_free(sign);\n    SSH_KEY_FREE(key);\n    SSH_KEY_FREE(pubkey);\n    key = NULL;\n    pubkey = NULL;\n\n    ssh_free(session);\n}\n\nstatic void torture_pki_rsa_sha2(void **state)\n{\n    int rc;\n    ssh_key key = NULL, cert = NULL, pubkey = NULL;\n    ssh_signature sign;\n    ssh_session session=ssh_new();\n    (void) state;\n\n    assert_non_null(session);\n\n    /* Setup */\n    rc  = ssh_pki_import_privkey_file(LIBSSH_RSA_TESTKEY, NULL, NULL, NULL, &key);\n    assert_true(rc == SSH_OK);\n    assert_non_null(key);\n\n    rc  = ssh_pki_import_cert_file(LIBSSH_RSA_TESTKEY \"-cert.pub\", &cert);\n    assert_true(rc == SSH_OK);\n    assert_non_null(cert);\n\n    /* Get the public key to verify signature */\n    rc = ssh_pki_export_privkey_to_pubkey(key, &pubkey);\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(pubkey);\n\n    if (!ssh_fips_mode()) {\n        /* Sign using old SHA1 digest */\n        sign = pki_do_sign(key, INPUT, sizeof(INPUT), SSH_DIGEST_SHA1);\n        assert_non_null(sign);\n        rc = ssh_pki_signature_verify(session, sign, pubkey, INPUT, sizeof(INPUT));\n        assert_ssh_return_code(session, rc);\n        rc = ssh_pki_signature_verify(session, sign, cert, INPUT, sizeof(INPUT));\n        assert_ssh_return_code(session, rc);\n        ssh_signature_free(sign);\n    }\n\n    /* Sign using new SHA256 digest */\n    sign = pki_do_sign(key, INPUT, sizeof(INPUT), SSH_DIGEST_SHA256);\n    assert_non_null(sign);\n    rc = ssh_pki_signature_verify(session, sign, pubkey, INPUT, sizeof(INPUT));\n    assert_ssh_return_code(session, rc);\n    rc = ssh_pki_signature_verify(session, sign, cert, INPUT, sizeof(INPUT));\n    assert_ssh_return_code(session, rc);\n    ssh_signature_free(sign);\n\n    /* Sign using rsa-sha2-512 algorithm */\n    sign = pki_do_sign(key, INPUT, sizeof(INPUT), SSH_DIGEST_SHA512);\n    assert_non_null(sign);\n    rc = ssh_pki_signature_verify(session, sign, pubkey, INPUT, sizeof(INPUT));\n    assert_ssh_return_code(session, rc);\n    rc = ssh_pki_signature_verify(session, sign, cert, INPUT, sizeof(INPUT));\n    assert_ssh_return_code(session, rc);\n    ssh_signature_free(sign);\n\n    /* Test that it fails when using DIGEST_AUTO */\n    sign = pki_do_sign(key, INPUT, sizeof(INPUT), SSH_DIGEST_AUTO);\n    assert_null(sign);\n\n    /* Test that it fails when using SHA384 */\n    sign = pki_do_sign(key, INPUT, sizeof(INPUT), SSH_DIGEST_SHA384);\n    assert_null(sign);\n\n    /* Cleanup */\n    SSH_KEY_FREE(key);\n    SSH_KEY_FREE(pubkey);\n    SSH_KEY_FREE(cert);\n    ssh_free(session);\n}\n\nstatic int test_sign_verify_data(ssh_key key,\n                                 enum ssh_digest_e hash_type,\n                                 const unsigned char *input,\n                                 size_t input_len)\n{\n    ssh_signature sig;\n    ssh_key pubkey = NULL;\n    int rc;\n\n    /* Get the public key to verify signature */\n    rc = ssh_pki_export_privkey_to_pubkey(key, &pubkey);\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(pubkey);\n\n    /* Sign the buffer */\n    sig = pki_sign_data(key, hash_type, input, input_len);\n    assert_non_null(sig);\n\n    /* Verify signature */\n    rc = pki_verify_data_signature(sig, pubkey, input, input_len);\n    assert_int_equal(rc, SSH_OK);\n\n    ssh_signature_free(sig);\n    SSH_KEY_FREE(pubkey);\n\n    return rc;\n}\n\nstatic void torture_pki_sign_data_rsa(void **state)\n{\n    int rc;\n    ssh_key key = NULL;\n\n    (void) state;\n\n    /* Setup */\n    rc = ssh_pki_generate(SSH_KEYTYPE_RSA, 2048, &key);\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(key);\n\n    if (!ssh_fips_mode()) {\n        /* Test using SHA1 */\n        rc = test_sign_verify_data(key, SSH_DIGEST_SHA1, INPUT, sizeof(INPUT));\n        assert_int_equal(rc, SSH_OK);\n    }\n\n    /* Test using SHA256 */\n    rc = test_sign_verify_data(key, SSH_DIGEST_SHA256, INPUT, sizeof(INPUT));\n    assert_int_equal(rc, SSH_OK);\n\n    /* Test using SHA512 */\n    rc = test_sign_verify_data(key, SSH_DIGEST_SHA512, INPUT, sizeof(INPUT));\n    assert_int_equal(rc, SSH_OK);\n\n    /* Cleanup */\n    SSH_KEY_FREE(key);\n}\n\nstatic void torture_pki_fail_sign_with_incompatible_hash(void **state)\n{\n    int rc;\n    ssh_key key = NULL;\n    ssh_key pubkey = NULL;\n    ssh_signature sig, bad_sig;\n\n    (void) state;\n\n    /* Setup */\n    rc = ssh_pki_generate(SSH_KEYTYPE_RSA, 2048, &key);\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(key);\n\n    /* Get the public key to verify signature */\n    rc = ssh_pki_export_privkey_to_pubkey(key, &pubkey);\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(pubkey);\n\n    /* Sign the buffer */\n    sig = pki_sign_data(key, SSH_DIGEST_SHA256, INPUT, sizeof(INPUT));\n    assert_non_null(sig);\n\n    /* Verify signature */\n    rc = pki_verify_data_signature(sig, pubkey, INPUT, sizeof(INPUT));\n    assert_int_equal(rc, SSH_OK);\n\n    /* Test if signature fails with SSH_DIGEST_AUTO */\n    bad_sig = pki_sign_data(key, SSH_DIGEST_AUTO, INPUT, sizeof(INPUT));\n    assert_null(bad_sig);\n\n    /* Test if verification fails with SSH_DIGEST_AUTO */\n    sig->hash_type = SSH_DIGEST_AUTO;\n    rc = pki_verify_data_signature(sig, pubkey, INPUT, sizeof(INPUT));\n    assert_int_not_equal(rc, SSH_OK);\n\n    /* Cleanup */\n    ssh_signature_free(sig);\n    SSH_KEY_FREE(pubkey);\n    SSH_KEY_FREE(key);\n}\n\n#ifdef HAVE_LIBCRYPTO\nstatic void torture_pki_rsa_write_privkey(void **state)\n{\n    ssh_key origkey = NULL;\n    ssh_key privkey = NULL;\n    int rc;\n\n    (void) state; /* unused */\n\n    rc = ssh_pki_import_privkey_file(LIBSSH_RSA_TESTKEY,\n                                     NULL,\n                                     NULL,\n                                     NULL,\n                                     &origkey);\n    assert_true(rc == 0);\n    assert_non_null(origkey);\n\n    unlink(LIBSSH_RSA_TESTKEY);\n\n    rc = ssh_pki_export_privkey_file(origkey,\n                                     NULL,\n                                     NULL,\n                                     NULL,\n                                     LIBSSH_RSA_TESTKEY);\n    assert_true(rc == 0);\n\n    rc = ssh_pki_import_privkey_file(LIBSSH_RSA_TESTKEY,\n                                     NULL,\n                                     NULL,\n                                     NULL,\n                                     &privkey);\n    assert_true(rc == 0);\n    assert_non_null(privkey);\n\n    rc = ssh_key_cmp(origkey, privkey, SSH_KEY_CMP_PRIVATE);\n    assert_true(rc == 0);\n\n    SSH_KEY_FREE(origkey);\n    SSH_KEY_FREE(privkey);\n\n    /* Test with passphrase */\n    rc = ssh_pki_import_privkey_file(LIBSSH_RSA_TESTKEY_PASSPHRASE,\n                                     torture_get_testkey_passphrase(),\n                                     NULL,\n                                     NULL,\n                                     &origkey);\n    assert_true(rc == 0);\n    assert_non_null(origkey);\n\n    unlink(LIBSSH_RSA_TESTKEY_PASSPHRASE);\n    rc = ssh_pki_export_privkey_file(origkey,\n                                     torture_get_testkey_passphrase(),\n                                     NULL,\n                                     NULL,\n                                     LIBSSH_RSA_TESTKEY_PASSPHRASE);\n    assert_true(rc == 0);\n\n    /* Test with invalid passphrase */\n    rc = ssh_pki_import_privkey_file(LIBSSH_RSA_TESTKEY_PASSPHRASE,\n                                     \"invalid secret\",\n                                     NULL,\n                                     NULL,\n                                     &privkey);\n    assert_true(rc == SSH_ERROR);\n    assert_null(privkey);\n\n    rc = ssh_pki_import_privkey_file(LIBSSH_RSA_TESTKEY_PASSPHRASE,\n                                     torture_get_testkey_passphrase(),\n                                     NULL,\n                                     NULL,\n                                     &privkey);\n    assert_true(rc == 0);\n    assert_non_null(privkey);\n\n    rc = ssh_key_cmp(origkey, privkey, SSH_KEY_CMP_PRIVATE);\n    assert_true(rc == 0);\n\n    SSH_KEY_FREE(origkey);\n    SSH_KEY_FREE(privkey);\n}\n#endif /* HAVE_LIBCRYPTO */\n\nstatic void torture_pki_rsa_import_privkey_base64_passphrase(void **state)\n{\n    int rc;\n    ssh_key key = NULL;\n    const char *passphrase = torture_get_testkey_passphrase();\n\n    (void) state; /* unused */\n\n\n    rc = ssh_pki_import_privkey_base64(torture_get_testkey(SSH_KEYTYPE_RSA, 1),\n                                       passphrase,\n                                       NULL,\n                                       NULL,\n                                       &key);\n    assert_return_code(rc, errno);\n    assert_non_null(key);\n\n    rc = ssh_key_is_private(key);\n    assert_true(rc == 1);\n\n    SSH_KEY_FREE(key);\n\n    /* test if it returns -1 if passphrase is wrong */\n    rc = ssh_pki_import_privkey_base64(torture_get_testkey(SSH_KEYTYPE_RSA, 1),\n                                       \"wrong passphrase !!\",\n                                       NULL,\n                                       NULL,\n                                       &key);\n    assert_true(rc == -1);\n    SSH_KEY_FREE(key);\n\n#ifndef HAVE_LIBCRYPTO\n    /* test if it returns -1 if passphrase is NULL */\n    /* libcrypto asks for a passphrase, so skip this test */\n    rc = ssh_pki_import_privkey_base64(torture_get_testkey(SSH_KEYTYPE_RSA, 1),\n                                       NULL,\n                                       NULL,\n                                       NULL,\n                                       &key);\n    assert_true(rc == -1);\n    SSH_KEY_FREE(key);\n#endif\n}\n\nstatic void\ntorture_pki_rsa_import_openssh_privkey_base64_passphrase(void **state)\n{\n    int rc;\n    ssh_key key = NULL;\n    const char *passphrase = torture_get_testkey_passphrase();\n    const char *keystring = NULL;\n\n    (void) state; /* unused */\n\n    keystring = torture_get_openssh_testkey(SSH_KEYTYPE_RSA, 1);\n    assert_non_null(keystring);\n\n    rc = ssh_pki_import_privkey_base64(keystring,\n                                       passphrase,\n                                       NULL,\n                                       NULL,\n                                       &key);\n    assert_return_code(rc, errno);\n    assert_non_null(key);\n\n    rc = ssh_key_is_private(key);\n    assert_true(rc == 1);\n\n    SSH_KEY_FREE(key);\n\n    /* test if it returns -1 if passphrase is wrong */\n    rc = ssh_pki_import_privkey_base64(keystring,\n                                       \"wrong passphrase !!\",\n                                       NULL,\n                                       NULL,\n                                       &key);\n    assert_true(rc == -1);\n    SSH_KEY_FREE(key);\n\n    /* test if it returns -1 if passphrase is NULL */\n    /* libcrypto asks for a passphrase, so skip this test */\n    rc = ssh_pki_import_privkey_base64(keystring,\n                                       NULL,\n                                       NULL,\n                                       NULL,\n                                       &key);\n    assert_true(rc == -1);\n    SSH_KEY_FREE(key);\n}\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_pki_rsa_import_pubkey_file,\n                                        setup_rsa_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_rsa_import_pubkey_from_openssh_privkey,\n                                        setup_openssh_rsa_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_rsa_import_privkey_base64_NULL_key,\n                                        setup_rsa_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_rsa_import_privkey_base64_NULL_str,\n                                        setup_rsa_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_rsa_import_privkey_base64,\n                                        setup_rsa_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_rsa_import_privkey_base64_comment,\n                                        setup_rsa_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_rsa_import_privkey_base64_whitespace,\n                                        setup_rsa_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_rsa_import_privkey_base64,\n                                        setup_openssh_rsa_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_rsa_publickey_from_privatekey,\n                                        setup_rsa_key,\n                                        teardown),\n        cmocka_unit_test(torture_pki_rsa_import_privkey_base64_passphrase),\n        cmocka_unit_test(torture_pki_rsa_import_openssh_privkey_base64_passphrase),\n        cmocka_unit_test_setup_teardown(torture_pki_rsa_copy_cert_to_privkey,\n                                        setup_rsa_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_rsa_import_cert_file,\n                                        setup_rsa_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_rsa_publickey_base64,\n                                        setup_rsa_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_rsa_generate_pubkey_from_privkey,\n                                        setup_rsa_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_rsa_duplicate_key,\n                                        setup_rsa_key,\n                                        teardown),\n        cmocka_unit_test(torture_pki_rsa_generate_key),\n#if defined(HAVE_LIBCRYPTO)\n        cmocka_unit_test_setup_teardown(torture_pki_rsa_write_privkey,\n                                        setup_rsa_key,\n                                        teardown),\n#endif /* HAVE_LIBCRYPTO */\n        cmocka_unit_test(torture_pki_sign_data_rsa),\n        cmocka_unit_test(torture_pki_fail_sign_with_incompatible_hash),\n        cmocka_unit_test_setup_teardown(torture_pki_rsa_sha2,\n                                        setup_rsa_key,\n                                        teardown),\n    };\n\n    ssh_init();\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, NULL, NULL);\n    ssh_finalize();\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/unittests/torture_push_pop_dir.c",
    "content": "#include \"config.h\"\n\n#include \"torture.h\"\n#define LIBSSH_STATIC\n\nconst char template[] = \"temp_dir_XXXXXX\";\n\nstatic int setup(void **state)\n{\n    char *temp_dir = NULL;\n\n    temp_dir = torture_make_temp_dir(template);\n    assert_non_null(temp_dir);\n\n    *state = (void *)temp_dir;\n\n    return 0;\n}\n\nstatic int teardown(void **state)\n{\n    char *temp_dir = *((char **)state);\n\n    torture_rmdirs((const char *)temp_dir);\n\n    free(temp_dir);\n\n    return 0;\n}\n\nstatic void torture_back_and_forth(void **state)\n{\n    char *temp_dir = *((char **)state);\n    char *cwd = NULL;\n    char *after_change = NULL;\n    char *after_changing_back = NULL;\n    int rc = 0;\n\n    cwd = torture_get_current_working_dir();\n    assert_non_null(cwd);\n\n    printf(\"Current dir: %s\\n\", cwd);\n\n    rc = torture_change_dir(temp_dir);\n    assert_int_equal(rc, 0);\n\n    after_change = torture_get_current_working_dir();\n    assert_non_null(after_change);\n\n    printf(\"Current dir after change: %s\\n\", after_change);\n\n    rc = torture_change_dir(cwd);\n    assert_int_equal(rc, 0);\n\n    after_changing_back = torture_get_current_working_dir();\n    assert_non_null(after_changing_back);\n\n    printf(\"Back to dir: %s\\n\", after_changing_back);\n\n    SAFE_FREE(cwd);\n    SAFE_FREE(after_change);\n    SAFE_FREE(after_changing_back);\n}\n\nint torture_run_tests(void)\n{\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_back_and_forth,\n                                        setup, teardown),\n    };\n\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, NULL, NULL);\n\n    return rc;\n}\n\n"
  },
  {
    "path": "src/libssh/tests/unittests/torture_rand.c",
    "content": "#include \"config.h\"\n\n#define LIBSSH_STATIC\n#include <libssh/priv.h>\n#include <libssh/callbacks.h>\n#include <pthread.h>\n#include <errno.h>\n#include \"torture.h\"\n\n#ifdef HAVE_LIBGCRYPT\n#define NUM_LOOPS 1000\n#else\n/* openssl is much faster */\n#define NUM_LOOPS 20000\n#endif\n#define NUM_THREADS 100\n\nstatic int setup(void **state) {\n    int rc;\n\n    (void) state;\n\n    ssh_threads_set_callbacks(ssh_threads_get_pthread());\n    rc = ssh_init();\n    if (rc != SSH_OK) {\n        return -1;\n    }\n\n    return 0;\n}\n\nstatic int teardown(void **state) {\n    (void) state;\n\n    ssh_finalize();\n\n    return 0;\n}\n\nstatic void *torture_rand_thread(void *threadid) {\n    char buffer[12];\n    int i;\n    int ok;\n\n    (void) threadid;\n\n    buffer[0] = buffer[1] = buffer[10] = buffer[11] = 'X';\n    for(i = 0; i < NUM_LOOPS; ++i) {\n        ok = ssh_get_random(&buffer[2], i % 8 + 1, 0);\n        assert_true(ok);\n    }\n\n    pthread_exit(NULL);\n}\n\nstatic void torture_rand_threading(void **state) {\n    pthread_t threads[NUM_THREADS];\n    int i;\n    int err;\n\n    (void) state;\n\n    for(i = 0; i < NUM_THREADS; ++i) {\n        err = pthread_create(&threads[i], NULL, torture_rand_thread, NULL);\n        assert_int_equal(err, 0);\n    }\n    for(i = 0; i < NUM_THREADS; ++i) {\n        err=pthread_join(threads[i], NULL);\n        assert_int_equal(err, 0);\n    }\n}\n\nint torture_run_tests(void) {\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_rand_threading, setup, teardown),\n    };\n\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, NULL, NULL);\n\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/unittests/torture_server_x11.c",
    "content": "#define LIBSSH_STATIC\n\n#include <errno.h>\n#include <pthread.h>\n#include <stdlib.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n\n#include <libssh/libssh.h>\n#include \"torture.h\"\n\n#define TEST_SERVER_PORT 2222\n\nstruct hostkey_state {\n    const char *hostkey;\n    char *hostkey_path;\n    enum ssh_keytypes_e key_type;\n    int fd;\n};\n\nstatic int setup(void **state) {\n    struct hostkey_state *h;\n    mode_t mask;\n    int rc;\n\n    ssh_threads_set_callbacks(ssh_threads_get_pthread());\n    rc = ssh_init();\n    if (rc != SSH_OK) {\n        return -1;\n    }\n\n    h = malloc(sizeof(struct hostkey_state));\n    assert_non_null(h);\n\n    h->hostkey_path = strdup(\"/tmp/libssh_hostkey_XXXXXX\");\n\n    mask = umask(S_IRWXO | S_IRWXG);\n    h->fd = mkstemp(h->hostkey_path);\n    umask(mask);\n    assert_return_code(h->fd, errno);\n    close(h->fd);\n\n    h->key_type = SSH_KEYTYPE_ECDSA_P256;\n    h->hostkey = torture_get_testkey(h->key_type, 0);\n\n    torture_write_file(h->hostkey_path, h->hostkey);\n\n    *state = h;\n\n    return 0;\n}\n\nstatic int teardown(void **state) {\n    struct hostkey_state *h = (struct hostkey_state *)*state;\n\n    unlink(h->hostkey);\n    free(h->hostkey_path);\n    free(h);\n\n    ssh_finalize();\n\n    return 0;\n}\n\n/* For x11_screen_number, need something that is not equal to htonl\n   itself */\nstatic const uint32_t x11_screen_number = 1;\n\nstatic void *client_thread(void *arg) {\n    unsigned int test_port = TEST_SERVER_PORT;\n    int rc;\n    ssh_session session;\n    ssh_channel channel;\n\n    /* unused */\n    (void)arg;\n\n    usleep(200);\n    session = torture_ssh_session(NULL, \"localhost\",\n                                  &test_port,\n                                  \"foo\", \"bar\");\n    assert_non_null(session);\n\n    channel = ssh_channel_new(session);\n    assert_non_null(channel);\n\n    rc = ssh_channel_open_session(channel);\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_channel_request_x11(channel, 0, NULL, NULL,\n                                 (uint32_t)x11_screen_number);\n    assert_int_equal(rc, SSH_OK);\n\n    ssh_free(session);\n    return NULL;\n}\n\nstatic int auth_password_accept(ssh_session session,\n                                const char *user,\n                                const char *password,\n                                void *userdata) {\n    /* unused */\n    (void)session;\n    (void)user;\n    (void)password;\n    (void)userdata;\n\n    return SSH_AUTH_SUCCESS;\n}\n\nstruct channel_data {\n    int req_seen;\n    uint32_t screen_number;\n};\n\nstatic void ssh_channel_x11_req(ssh_session session,\n                                ssh_channel channel,\n                                int single_connection,\n                                const char *auth_protocol,\n                                const char *auth_cookie,\n                                uint32_t screen_number,\n                                void *userdata) {\n    struct channel_data *channel_data = userdata;\n\n    /* unused */\n    (void)session;\n    (void)channel;\n    (void)single_connection;\n    (void)auth_protocol;\n    (void)auth_cookie;\n\n    /* We've seen an x11 request.  Record the screen number */\n    channel_data->req_seen = 1;\n    channel_data->screen_number = screen_number;\n}\n\nstatic ssh_channel channel_open(ssh_session session, void *userdata) {\n    ssh_channel channel = NULL;\n    ssh_channel_callbacks channel_cb = userdata;\n\n    /* unused */\n    (void)userdata;\n\n    channel = ssh_channel_new(session);\n    if (channel == NULL) {\n        goto out;\n    }\n    ssh_set_channel_callbacks(channel, channel_cb);\n\n out:\n    return channel;\n}\n\nstatic void test_ssh_channel_request_x11(void **state) {\n    struct hostkey_state *h = (struct hostkey_state *)*state;\n    int rc, event_rc;\n    pthread_t client_pthread;\n    ssh_bind sshbind;\n    ssh_session server;\n    ssh_event event;\n\n    struct channel_data channel_data;\n    struct ssh_channel_callbacks_struct channel_cb = {\n        .userdata = &channel_data,\n        .channel_x11_req_function = ssh_channel_x11_req\n    };\n    struct ssh_server_callbacks_struct server_cb = {\n        .userdata = &channel_cb,\n        .auth_password_function = auth_password_accept,\n        .channel_open_request_session_function = channel_open\n    };\n\n    memset(&channel_data, 0, sizeof(channel_data));\n    ssh_callbacks_init(&channel_cb);\n    ssh_callbacks_init(&server_cb);\n\n    /* Create server */\n    sshbind = torture_ssh_bind(\"localhost\",\n                               TEST_SERVER_PORT,\n                               h->key_type,\n                               h->hostkey_path);\n    assert_non_null(sshbind);\n\n    /* Get client to connect */\n    rc = pthread_create(&client_pthread, NULL, client_thread, NULL);\n    assert_return_code(rc, errno);\n\n    server = ssh_new();\n    assert_non_null(server);\n\n    rc = ssh_bind_accept(sshbind, server);\n    assert_int_equal(rc, SSH_OK);\n\n    /* Handle client connection */\n    ssh_set_server_callbacks(server, &server_cb);\n\n    rc = ssh_handle_key_exchange(server);\n    assert_int_equal(rc, SSH_OK);\n\n    event = ssh_event_new();\n    assert_non_null(event);\n\n    ssh_event_add_session(event, server);\n\n    event_rc = SSH_OK;\n    while (!channel_data.req_seen && event_rc == SSH_OK) {\n        event_rc = ssh_event_dopoll(event, -1);\n    }\n\n    /* Cleanup */\n    ssh_event_free(event);\n    ssh_free(server);\n    ssh_bind_free(sshbind);\n\n    rc = pthread_join(client_pthread, NULL);\n    assert_int_equal(rc, 0);\n\n    assert_true(channel_data.req_seen);\n    assert_int_equal(channel_data.screen_number,\n                     x11_screen_number);\n}\n\nint torture_run_tests(void) {\n    int rc;\n    const struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(test_ssh_channel_request_x11,\n                                        setup,\n                                        teardown)\n    };\n\n    rc = cmocka_run_group_tests(tests, NULL, NULL);\n    return rc;\n}\n\n"
  },
  {
    "path": "src/libssh/tests/unittests/torture_session_keys.c",
    "content": "#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include \"torture.h\"\n#include \"libssh/bignum.h\"\n#include \"libssh/crypto.h\"\n#include \"libssh/dh.h\"\n\nuint8_t key[32] =\n    \"\\xf7\\xa0\\xe6\\xdf\\x1f\\x87\\x7d\\x22\\x68\\xd2\\xc4\\xb0\\xc5\\x93\\xa4\"\n    \"\\x8e\\x30\\x17\\xc6\\xab\\xca\\xf3\\x9a\\xa4\\x9f\\x7b\\xed\\x51\\xb1\\xe8\"\n    \"\\x8a\\x42\";\nuint8_t secret[32] =\n    \"\\x33\\x64\\x8e\\x7f\\xea\\xd9\\xd7\\xee\\x89\\x4f\\xd8\\xd0\\xe5\\x83\\x00\"\n    \"\\x3d\\x53\\x17\\xbc\\xa8\\x8b\\x6b\\x2a\\x31\\x50\\xcc\\x08\\xe9\\xea\\x87\"\n    \"\\xb4\\x23\";\n\nuint8_t eIV[32] =\n    \"\\x9a\\x2b\\x40\\x9d\\x29\\x8e\\x22\\x70\\x86\\xdf\\x0e\\x72\\x9b\\x91\\x31\"\n    \"\\x90\\x5d\\x69\\xc5\\x87\\x79\\x83\\x72\\x63\\x4e\\x67\\xf5\\x9e\\x00\\x77\"\n    \"\\x8c\\x7f\";\nuint8_t dIV[32] =\n    \"\\x10\\xdd\\x7f\\x31\\x6d\\xe3\\x49\\x28\\xbf\\x99\\x80\\x08\\x16\\xb3\\x99\"\n    \"\\xff\\x8c\\x61\\x9b\\xb9\\xc2\\xdd\\x40\\xfb\\x36\\xf9\\x97\\xd8\\x8c\\x55\"\n    \"\\xbf\\xa0\";\nuint8_t eK[24] =\n    \"\\xe1\\x99\\x36\\xb8\\xe6\\x1f\\x3d\\x54\\xc3\\xa2\\xdd\\x79\\xf0\\xfe\\x78\"\n    \"\\x9e\\x87\\xd5\\x05\\x54\\x26\\x34\\x21\\xd0\";\nuint8_t dK[24] =\n    \"\\xf8\\xdd\\xc3\\xea\\x5a\\x59\\x98\\xb9\\x86\\xaa\\x77\\x29\\x67\\x51\\x46\"\n    \"\\x21\\x73\\xc2\\x6a\\x6b\\xed\\xf2\\x49\\x98\";\nuint8_t eMAC[32] =\n    \"\\x0f\\xbd\\x1f\\xe9\\x2a\\xaa\\x84\\xdc\\xb5\\xfc\\xfb\\x68\\x2c\\xa5\\xe0\"\n    \"\\xba\\xf2\\x6f\\xe5\\x80\\xee\\x8f\\x5c\\x5b\\x30\\x55\\x25\\xb3\\x7b\\x21\"\n    \"\\xdc\\xe5\";\nuint8_t dMAC[32] =\n    \"\\xa3\\x52\\x6e\\x72\\xa8\\x8b\\xde\\xc5\\x68\\x66\\x89\\xae\\x0a\\xd2\\x83\"\n    \"\\x23\\x21\\x4b\\x3f\\x04\\x2e\\x7f\\x86\\x04\\x0f\\xa8\\x04\\x3c\\x62\\xad\"\n    \"\\x74\\x91\";\n\nstruct ssh_cipher_struct fake_in_cipher = {\n    .keysize = 192\n};\n\nstruct ssh_cipher_struct fake_out_cipher = {\n    .keysize = 192\n};\n\nstruct ssh_crypto_struct test_crypto = {\n    .digest_len = 32,\n    .session_id = secret,\n    .secret_hash = secret,\n    .in_cipher = &fake_in_cipher,\n    .out_cipher = &fake_out_cipher,\n    .in_hmac = SSH_HMAC_SHA256,\n    .out_hmac = SSH_HMAC_SHA256,\n    .digest_type = SSH_KDF_SHA256,\n};\n\nstruct ssh_session_struct session = {\n    .next_crypto = &test_crypto\n};\n\nstatic void torture_session_keys(UNUSED_PARAM(void **state))\n{\n    ssh_string k_string;\n    int rc;\n\n    k_string = ssh_string_new(32);\n    ssh_string_fill(k_string, key, 32);\n    test_crypto.shared_secret = ssh_make_string_bn(k_string);\n\n    rc = ssh_generate_session_keys(&session);\n    assert_int_equal(rc, 0);\n\n    assert_memory_equal(test_crypto.encryptIV, eIV, 32);\n    assert_memory_equal(test_crypto.decryptIV, dIV, 32);\n    assert_memory_equal(test_crypto.encryptkey, eK, 24);\n    assert_memory_equal(test_crypto.decryptkey, dK, 24);\n    assert_memory_equal(test_crypto.encryptMAC, eMAC, 32);\n    assert_memory_equal(test_crypto.decryptMAC, dMAC, 32);\n\n    SSH_STRING_FREE(k_string);\n}\n\nint torture_run_tests(void) {\n    int rc;\n    const struct CMUnitTest tests[] = {\n        cmocka_unit_test(torture_session_keys),\n    };\n\n    ssh_init();\n    rc = cmocka_run_group_tests(tests, NULL, NULL);\n    ssh_finalize();\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/unittests/torture_temp_dir.c",
    "content": "#include \"config.h\"\n\n#include \"torture.h\"\n#define LIBSSH_STATIC\n\nconst char template[] = \"temp_dir_XXXXXX\";\n\nstatic int setup(void **state)\n{\n    char *temp_dir = NULL;\n\n    temp_dir = torture_make_temp_dir(template);\n    assert_non_null(temp_dir);\n\n    *state = (void *)temp_dir;\n\n    return 0;\n}\n\nstatic int teardown(void **state)\n{\n    char *temp_dir = *((char **)state);\n\n    torture_rmdirs((const char *)temp_dir);\n\n    free(temp_dir);\n\n    return 0;\n}\n\n\nstatic void torture_create_temp_dir(void **state)\n{\n    char *temp_dir = *((char **)state);\n\n    printf(\"Created temp dir: %s\\n\", temp_dir);\n}\n\nint torture_run_tests(void)\n{\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_create_temp_dir, setup, teardown),\n    };\n\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, NULL, NULL);\n\n    return rc;\n}\n\n"
  },
  {
    "path": "src/libssh/tests/unittests/torture_temp_file.c",
    "content": "#include \"config.h\"\n\n#include \"torture.h\"\n#define LIBSSH_STATIC\n\nconst char template[] = \"temp_file_XXXXXX\";\n\nstatic int setup(void **state)\n{\n    char *file_name = NULL;\n\n    file_name  = torture_create_temp_file(template);\n    assert_non_null(file_name);\n\n    *state = (void *)file_name;\n\n    return 0;\n}\n\nstatic int teardown(void **state)\n{\n    int rc;\n    char *file_name = *((char **)state);\n\n    assert_non_null(file_name);\n\n    rc = unlink(file_name);\n    assert_int_equal(rc, 0);\n\n    SAFE_FREE(file_name);\n\n    return 0;\n}\n\n\nstatic void torture_temp_file(void **state)\n{\n    char *file_name = *((char **)state);\n    FILE *fp = NULL;\n\n    assert_non_null(file_name);\n\n    fp = fopen(file_name, \"r\");\n    assert_non_null(fp);\n\n    fclose(fp);\n\n    printf(\"Created temp file: %s\\n\", file_name);\n}\n\nint torture_run_tests(void)\n{\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_temp_file, setup, teardown),\n    };\n\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, NULL, NULL);\n\n    return rc;\n}\n\n"
  },
  {
    "path": "src/libssh/tests/unittests/torture_threads_buffer.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2018 by Anderson Toshiyuki Sasaki <ansasaki@redhat.com>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include \"torture.h\"\n#define DEBUG_BUFFER\n#include \"buffer.c\"\n\n#include <pthread.h>\n\n#define NUM_THREADS 20\n\n#define BUFFER_LIMIT (8 * 1024 * 1024)\n\nstatic int run_on_threads(void *(*func)(void *))\n{\n    pthread_t threads[NUM_THREADS];\n    int rc;\n    int i;\n\n    for (i = 0; i < NUM_THREADS; ++i) {\n        rc = pthread_create(&threads[i], NULL, func, NULL);\n        assert_int_equal(rc, 0);\n    }\n\n    for (i = 0; i < NUM_THREADS; ++i) {\n        void *p = NULL;\n        uint64_t *result = NULL;\n\n        rc = pthread_join(threads[i], &p);\n        assert_int_equal(rc, 0);\n\n        result = (uint64_t *)p;\n        assert_null(result);\n    }\n\n    return rc;\n}\n\n/*\n * Test if the continuously growing buffer size never exceeds 2 time its\n * real capacity\n */\nstatic void *thread_growing_buffer(void *threadid)\n{\n    ssh_buffer buffer = NULL;\n    int i;\n\n    /* Unused */\n    (void) threadid;\n\n    /* Setup */\n    buffer = ssh_buffer_new();\n    if (buffer == NULL) {\n        pthread_exit((void *)-1);\n    }\n    ssh_buffer_set_secure(buffer);\n\n    for (i = 0; i < BUFFER_LIMIT; ++i) {\n        ssh_buffer_add_data(buffer,\"A\",1);\n        if (buffer->used >= 128) {\n            if (ssh_buffer_get_len(buffer) * 2 < buffer->allocated) {\n                assert_true(ssh_buffer_get_len(buffer) * 2 >= buffer->allocated);\n            }\n        }\n    }\n\n    /* Teardown */\n    SSH_BUFFER_FREE(buffer);\n    pthread_exit(NULL);\n}\n\nstatic void torture_growing_buffer(void **state)\n{\n    int rc;\n\n    /* Unused */\n    (void) state;\n\n    rc = run_on_threads(thread_growing_buffer);\n    assert_int_equal(rc, 0);\n}\n\n/*\n * Test if the continuously growing buffer size never exceeds 2 time its\n * real capacity, when we remove 1 byte after each call (sliding window)\n */\nstatic void *thread_growing_buffer_shifting(void *threadid)\n{\n    ssh_buffer buffer;\n    int i;\n    unsigned char c;\n\n    /* Unused */\n    (void) threadid;\n\n    /* Setup */\n    buffer = ssh_buffer_new();\n    if (buffer == NULL) {\n        pthread_exit((void *)-1);\n    }\n    ssh_buffer_set_secure(buffer);\n\n\n    for (i = 0; i < 1024; ++i) {\n        ssh_buffer_add_data(buffer,\"S\",1);\n    }\n\n    for (i = 0; i < BUFFER_LIMIT; ++i) {\n        ssh_buffer_get_u8(buffer,&c);\n        ssh_buffer_add_data(buffer,\"A\",1);\n        if (buffer->used >= 128) {\n            if (ssh_buffer_get_len(buffer) * 4 < buffer->allocated) {\n                assert_true(ssh_buffer_get_len(buffer) * 4 >= buffer->allocated);\n                /* Teardown */\n                SSH_BUFFER_FREE(buffer);\n                pthread_exit(NULL);\n            }\n        }\n    }\n\n    /* Teardown */\n    SSH_BUFFER_FREE(buffer);\n    pthread_exit(NULL);\n}\n\nstatic void torture_growing_buffer_shifting(void **state)\n{\n    int rc;\n\n    /* Unused */\n    (void) state;\n\n    rc = run_on_threads(thread_growing_buffer_shifting);\n    assert_int_equal(rc, 0);\n}\n\n/*\n * Test the behavior of ssh_buffer_prepend_data\n */\nstatic void *thread_buffer_prepend(void *threadid)\n{\n    ssh_buffer buffer = NULL;\n    uint32_t v;\n\n    /* Unused */\n    (void) threadid;\n\n    /* Setup */\n    buffer = ssh_buffer_new();\n    if (buffer == NULL) {\n        pthread_exit((void *)-1);\n    }\n    ssh_buffer_set_secure(buffer);\n\n    ssh_buffer_add_data(buffer, \"abcdef\", 6);\n    ssh_buffer_prepend_data(buffer, \"xyz\", 3);\n    assert_int_equal(ssh_buffer_get_len(buffer), 9);\n    assert_memory_equal(ssh_buffer_get(buffer),  \"xyzabcdef\", 9);\n\n    /* Now remove 4 bytes and see if we can replace them */\n    ssh_buffer_get_u32(buffer, &v);\n    assert_int_equal(ssh_buffer_get_len(buffer), 5);\n    assert_memory_equal(ssh_buffer_get(buffer), \"bcdef\", 5);\n\n    ssh_buffer_prepend_data(buffer, \"aris\", 4);\n    assert_int_equal(ssh_buffer_get_len(buffer), 9);\n    assert_memory_equal(ssh_buffer_get(buffer), \"arisbcdef\", 9);\n\n    /* same thing but we add 5 bytes now */\n    ssh_buffer_get_u32(buffer, &v);\n    assert_int_equal(ssh_buffer_get_len(buffer), 5);\n    assert_memory_equal(ssh_buffer_get(buffer), \"bcdef\", 5);\n\n    ssh_buffer_prepend_data(buffer, \"12345\", 5);\n    assert_int_equal(ssh_buffer_get_len(buffer), 10);\n    assert_memory_equal(ssh_buffer_get(buffer), \"12345bcdef\", 10);\n\n    /* Teardown */\n    SSH_BUFFER_FREE(buffer);\n    pthread_exit(NULL);\n}\n\nstatic void torture_buffer_prepend(void **state)\n{\n    int rc;\n\n    /* Unused */\n    (void) state;\n\n    rc = run_on_threads(thread_buffer_prepend);\n    assert_int_equal(rc, 0);\n}\n\n/*\n * Test the behavior of ssh_buffer_get_ssh_string with invalid data\n */\nstatic void *thread_ssh_buffer_get_ssh_string(void *threadid)\n{\n    ssh_buffer buffer = NULL;\n    size_t i, j, k, l;\n    int rc;\n    /* some values that can go wrong */\n    uint32_t values[] = {\n        0xffffffff, 0xfffffffe, 0xfffffffc, 0xffffff00,\n        0x80000000, 0x80000004, 0x7fffffff};\n    char data[128] = {0};\n\n    /* Unused */\n    (void)threadid;\n\n    memset(data, 'X', sizeof(data));\n\n    for (i = 0; i < ARRAY_SIZE(values); ++i) {\n        for (j = 0; j < (int)sizeof(data); ++j) {\n            for (k = 1; k < 5; ++k) {\n                buffer = ssh_buffer_new();\n                assert_non_null(buffer);\n\n                for (l = 0; l < k; ++l) {\n                    rc = ssh_buffer_add_u32(buffer, htonl(values[i]));\n                    assert_int_equal(rc, 0);\n                }\n                rc = ssh_buffer_add_data(buffer,data,j);\n                assert_int_equal(rc, 0);\n                for (l = 0; l < k; ++l) {\n                    ssh_string str = ssh_buffer_get_ssh_string(buffer);\n                    assert_null(str);\n                    SSH_STRING_FREE(str);\n                }\n                SSH_BUFFER_FREE(buffer);\n            }\n        }\n    }\n\n    pthread_exit(NULL);\n}\n\nstatic void torture_ssh_buffer_get_ssh_string(void **state){\n    int rc;\n\n    /* Unused */\n    (void) state;\n\n    rc = run_on_threads(thread_ssh_buffer_get_ssh_string);\n    assert_int_equal(rc, 0);\n}\n\nstatic void *thread_ssh_buffer_add_format(void *threadid)\n{\n    ssh_buffer buffer = NULL;\n    uint8_t b;\n    uint16_t w;\n    uint32_t d;\n    uint64_t q;\n    ssh_string s = NULL;\n    int rc;\n    size_t len;\n    uint8_t verif[] = \"\\x42\\x13\\x37\\x0b\\xad\\xc0\\xde\\x13\\x24\\x35\\x46\"\n        \"\\xac\\xbd\\xce\\xdf\"\n        \"\\x00\\x00\\x00\\x06\" \"libssh\"\n        \"\\x00\\x00\\x00\\x05\" \"rocks\"\n        \"So much\"\n        \"Fun!\";\n\n    /* Unused */\n    (void) threadid;\n\n    /* Setup */\n    buffer = ssh_buffer_new();\n    if (buffer == NULL) {\n        pthread_exit((void *)-1);\n    }\n    ssh_buffer_set_secure(buffer);\n\n    b = 0x42;\n    w = 0x1337;\n    d = 0xbadc0de;\n    q = 0x13243546acbdcedf;\n    s = ssh_string_from_char(\"libssh\");\n    rc = ssh_buffer_pack(buffer,\n                         \"bwdqSsPt\",\n                         b,\n                         w,\n                         d,\n                         q,\n                         s,\n                         \"rocks\",\n                         7,\n                         \"So much\",\n                         \"Fun!\");\n    assert_int_equal(rc, SSH_OK);\n\n    len = ssh_buffer_get_len(buffer);\n    assert_int_equal(len, sizeof(verif) - 1);\n    assert_memory_equal(ssh_buffer_get(buffer), verif, sizeof(verif) -1);\n\n    SSH_STRING_FREE(s);\n\n    /* Teardown */\n    SSH_BUFFER_FREE(buffer);\n    pthread_exit(NULL);\n}\n\nstatic void torture_ssh_buffer_add_format(void **state){\n    int rc;\n\n    /* Unused */\n    (void) state;\n\n    rc = run_on_threads(thread_ssh_buffer_add_format);\n    assert_int_equal(rc, 0);\n}\n\nstatic void *thread_ssh_buffer_get_format(void *threadid) {\n    ssh_buffer buffer;\n    uint8_t b = 0;\n    uint16_t w = 0;\n    uint32_t d = 0;\n    uint64_t q = 0;\n    ssh_string s = NULL;\n    char *s1 = NULL, *s2 = NULL;\n    int rc;\n    size_t len;\n    uint8_t verif[] = \"\\x42\\x13\\x37\\x0b\\xad\\xc0\\xde\\x13\\x24\\x35\\x46\"\n        \"\\xac\\xbd\\xce\\xdf\"\n        \"\\x00\\x00\\x00\\x06\" \"libssh\"\n        \"\\x00\\x00\\x00\\x05\" \"rocks\"\n        \"So much\";\n\n    /* Unused */\n    (void) threadid;\n\n    /* Setup */\n    buffer = ssh_buffer_new();\n    if (buffer == NULL) {\n        pthread_exit((void *)-1);\n    }\n    ssh_buffer_set_secure(buffer);\n\n    rc = ssh_buffer_add_data(buffer, verif, sizeof(verif) - 1);\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_buffer_unpack(buffer,\n                           \"bwdqSsP\",\n                           &b,\n                           &w,\n                           &d,\n                           &q,\n                           &s,\n                           &s1,\n                           (size_t)7,\n                           &s2);\n    assert_int_equal(rc, SSH_OK);\n\n    assert_int_equal(b, 0x42);\n    assert_int_equal(w, 0x1337);\n\n    assert_true(d == 0xbadc0de);\n    assert_true(q == 0x13243546acbdcedf);\n\n    assert_non_null(s);\n    assert_int_equal(ssh_string_len(s), 6);\n    assert_memory_equal(ssh_string_data(s), \"libssh\", 6);\n\n    assert_non_null(s1);\n    assert_string_equal(s1, \"rocks\");\n\n    assert_non_null(s2);\n    assert_memory_equal(s2, \"So much\", 7);\n\n    len = ssh_buffer_get_len(buffer);\n    assert_int_equal(len, 0);\n    SAFE_FREE(s);\n    SAFE_FREE(s1);\n    SAFE_FREE(s2);\n\n    /* Teardown */\n    SSH_BUFFER_FREE(buffer);\n    pthread_exit(NULL);\n}\n\nstatic void torture_ssh_buffer_get_format(void **state)\n{\n    int rc;\n\n    /* Unused */\n    (void) state;\n\n    rc = run_on_threads(thread_ssh_buffer_get_format);\n    assert_int_equal(rc, 0);\n}\n\nstatic void *thread_ssh_buffer_get_format_error(void *threadid)\n{\n    ssh_buffer buffer = NULL;\n    uint8_t b = 0;\n    uint16_t w = 0;\n    uint32_t d = 0;\n    uint64_t q = 0;\n    ssh_string s = NULL;\n    char *s1 = NULL, *s2 = NULL;\n    int rc;\n    uint8_t verif[] = \"\\x42\\x13\\x37\\x0b\\xad\\xc0\\xde\\x13\\x24\\x35\\x46\"\n        \"\\xac\\xbd\\xce\\xdf\"\n        \"\\x00\\x00\\x00\\x06\" \"libssh\"\n        \"\\x00\\x00\\x00\\x05\" \"rocks\"\n        \"So much\";\n\n    /* Unused */\n    (void) threadid;\n\n    /* Setup */\n    buffer = ssh_buffer_new();\n    if (buffer == NULL) {\n        pthread_exit((void *)-1);\n    }\n    ssh_buffer_set_secure(buffer);\n\n    rc = ssh_buffer_add_data(buffer, verif, sizeof(verif) - 1);\n    assert_int_equal(rc, SSH_OK);\n    rc = ssh_buffer_unpack(buffer,\n                           \"bwdqSsPb\",\n                           &b,\n                           &w,\n                           &d,\n                           &q,\n                           &s,\n                           &s1,\n                           (size_t)7,\n                           &s2,\n                           &b);\n    assert_int_equal(rc, SSH_ERROR);\n\n    assert_null(s);\n    assert_null(s1);\n    assert_null(s2);\n\n    /* Teardown */\n    SSH_BUFFER_FREE(buffer);\n    pthread_exit(NULL);\n}\n\nstatic void torture_ssh_buffer_get_format_error(void **state)\n{\n    int rc;\n\n    /* Unused */\n    (void) state;\n\n    rc = run_on_threads(thread_ssh_buffer_get_format_error);\n    assert_int_equal(rc, 0);\n}\n\nstatic void *thread_buffer_pack_badformat(void *threadid)\n{\n    ssh_buffer buffer = NULL;\n    uint8_t b = 42;\n    int rc;\n\n    /* Unused */\n    (void) threadid;\n\n    /* Setup */\n    buffer = ssh_buffer_new();\n    if (buffer == NULL) {\n        pthread_exit((void *)-1);\n    }\n    ssh_buffer_set_secure(buffer);\n\n    /* first with missing format */\n    rc = ssh_buffer_pack(buffer, \"b\", b, b);\n    assert_int_equal(rc, SSH_ERROR);\n    ssh_buffer_reinit(buffer);\n\n    /* with additional format */\n    rc = ssh_buffer_pack(buffer, \"bb\", b);\n    /* check that we detect the missing parameter */\n    assert_int_equal(rc, SSH_ERROR);\n\n    /* unpack with missing format */\n    ssh_buffer_reinit(buffer);\n\n    rc = ssh_buffer_pack(buffer, \"bb\", 42, 43);\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_buffer_unpack(buffer, \"b\", &b, &b);\n    assert_int_equal(rc, SSH_ERROR);\n\n    /* not doing the test with additional format as\n     * it could crash the process */\n\n    /* Teardown */\n    SSH_BUFFER_FREE(buffer);\n    pthread_exit(NULL);\n}\n\nstatic void torture_buffer_pack_badformat(void **state)\n{\n    int rc;\n\n    /* Unused */\n    (void) state;\n\n    rc = run_on_threads(thread_buffer_pack_badformat);\n    assert_int_equal(rc, 0);\n}\n\n#define NUM_TESTS 8\n\nstatic void torture_mixed(void **state)\n{\n    pthread_t threads[NUM_TESTS][NUM_THREADS];\n    int i;\n    int f;\n    int rc;\n\n    /* Array of functions to run on threads */\n    static void *(*funcs[NUM_TESTS])(void *) = {\n        thread_growing_buffer,\n        thread_growing_buffer_shifting,\n        thread_buffer_prepend,\n        thread_ssh_buffer_get_ssh_string,\n        thread_ssh_buffer_add_format,\n        thread_ssh_buffer_get_format,\n        thread_ssh_buffer_get_format_error,\n        thread_buffer_pack_badformat\n    };\n\n    (void) state;\n\n    /* Call tests in a round-robin fashion */\n    for (i = 0; i < NUM_THREADS; ++i) {\n        for (f = 0; f < NUM_TESTS; f++) {\n            rc = pthread_create(&threads[f][i], NULL, funcs[f], NULL);\n            assert_int_equal(rc, 0);\n        }\n    }\n\n    for (f = 0; f < NUM_TESTS; f++) {\n        for (i = 0; i < NUM_THREADS; ++i) {\n            void *p = NULL;\n            uint64_t *result = NULL;\n\n            rc = pthread_join(threads[f][i], &p);\n            assert_int_equal(rc, 0);\n\n            result = (uint64_t *)p;\n            assert_null(result);\n        }\n    }\n}\n\nint torture_run_tests(void)\n{\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test(torture_growing_buffer),\n        cmocka_unit_test(torture_growing_buffer_shifting),\n        cmocka_unit_test(torture_buffer_prepend),\n        cmocka_unit_test(torture_ssh_buffer_get_ssh_string),\n        cmocka_unit_test(torture_ssh_buffer_add_format),\n        cmocka_unit_test(torture_ssh_buffer_get_format),\n        cmocka_unit_test(torture_ssh_buffer_get_format_error),\n        cmocka_unit_test(torture_buffer_pack_badformat),\n        cmocka_unit_test(torture_mixed),\n    };\n\n    /*\n     * If the library is statically linked, ssh_init() is not called\n     * automatically\n     */\n    ssh_init();\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, NULL, NULL);\n    ssh_finalize();\n\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/unittests/torture_threads_crypto.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2018 by Anderson Toshiyuki Sasaki <ansasaki@redhat.com>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include \"torture.h\"\n#include \"libssh/crypto.h\"\n\n#include <pthread.h>\n\n#define NUM_THREADS 100\n\nstatic int8_t key[32] =\n    \"\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\x09\\x0a\\x0b\\x0c\\x0d\\x0e\"\n    \"\\x0f\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\"\n    \"\\x1e\\x1f\";\n\nstatic uint8_t IV[16] =\n    \"\\x10\\x11\\x12\\x13\\x14\\x15\\x16\\x17\\x18\\x19\\x1a\\x1b\\x1c\\x1d\\x1e\"\n    \"\\x1f\";\n\nstatic uint8_t cleartext[144] =\n    \"\\xb4\\xfc\\x5d\\xc2\\x49\\x8d\\x2c\\x29\\x4a\\xc9\\x9a\\xb0\\x1b\\xf8\\x29\"\n    \"\\xee\\x85\\x6d\\x8c\\x04\\x34\\x7c\\x65\\xf4\\x89\\x97\\xc5\\x71\\x70\\x41\"\n    \"\\x91\\x40\\x19\\x60\\xe1\\xf1\\x8f\\x4d\\x8c\\x17\\x51\\xd6\\xbc\\x69\\x6e\"\n    \"\\xf2\\x21\\x87\\x18\\x6c\\xef\\xc4\\xf4\\xd9\\xe6\\x1b\\x94\\xf7\\xd8\\xb2\"\n    \"\\xe9\\x24\\xb9\\xe7\\xe6\\x19\\xf5\\xec\\x55\\x80\\x9a\\xc8\\x7d\\x70\\xa3\"\n    \"\\x50\\xf8\\x03\\x10\\x35\\x49\\x9b\\x53\\x58\\xd7\\x4c\\xfc\\x5f\\x02\\xd6\"\n    \"\\x28\\xea\\xcc\\x43\\xee\\x5e\\x2b\\x8a\\x7a\\x66\\xf7\\x00\\xee\\x09\\x18\"\n    \"\\x30\\x1b\\x47\\xa2\\x16\\x69\\xc4\\x6e\\x44\\x3f\\xbd\\xec\\x52\\xce\\xe5\"\n    \"\\x41\\xf2\\xe0\\x04\\x4f\\x5a\\x55\\x58\\x37\\xba\\x45\\x8d\\x15\\x53\\xf6\"\n    \"\\x31\\x91\\x13\\x8c\\x51\\xed\\x08\\x07\\xdb\";\n\nstatic uint8_t aes256_cbc_encrypted[144] =\n    \"\\x7f\\x1b\\x92\\xac\\xc5\\x16\\x05\\x55\\x74\\xac\\xb4\\xe0\\x91\\x8c\\xf8\"\n    \"\\x0d\\xa9\\x72\\xa5\\x09\\xb8\\x44\\xee\\x55\\x02\\x13\\xb7\\x52\\x0a\\xf0\"\n    \"\\xac\\xd0\\x21\\x0e\\x58\\x7b\\x34\\xfe\\xdb\\x36\\x01\\x60\\x7d\\x18\\x3a\"\n    \"\\xa9\\x15\\x18\\x5b\\x13\\xca\\xdd\\x77\\x7d\\xdf\\x64\\xc6\\xd5\\x75\\x4b\"\n    \"\\x02\\x02\\x37\\xb1\\xf4\\x33\\xff\\x93\\xe6\\x32\\x08\\xda\\xcb\\x5d\\xa2\"\n    \"\\x8f\\x17\\x1f\\x99\\x92\\x60\\x22\\x9d\\x6b\\xe6\\xb2\\x5e\\xb0\\x5d\\x26\"\n    \"\\x3f\\xde\\xb8\\xc1\\xb0\\x70\\x80\\x1c\\x00\\xd0\\x93\\x2b\\xeb\\x0f\\xd7\"\n    \"\\x70\\x7a\\x9a\\x7a\\xa6\\x21\\x23\\x2c\\x02\\xb7\\xcd\\x88\\x10\\x9c\\x2d\"\n    \"\\x0c\\xd3\\xfa\\xc1\\x33\\x5b\\xe1\\xa1\\xd4\\x3d\\x8f\\xb8\\x50\\xc5\\xb5\"\n    \"\\x72\\xdd\\x6d\\x32\\x1f\\x58\\x00\\x48\\xbe\";\n\nstatic int run_on_threads(void *(*func)(void *))\n{\n    pthread_t threads[NUM_THREADS];\n    int rc;\n    int i;\n\n    for (i = 0; i < NUM_THREADS; ++i) {\n        rc = pthread_create(&threads[i], NULL, func, NULL);\n        assert_int_equal(rc, 0);\n    }\n\n    for (i = 0; i < NUM_THREADS; ++i) {\n        void *p = NULL;\n        uint64_t *result;\n\n        rc = pthread_join(threads[i], &p);\n        assert_int_equal(rc, 0);\n\n        result = (uint64_t *)p;\n        assert_null(result);\n    }\n\n    return rc;\n}\n\nstatic int get_cipher(struct ssh_cipher_struct *cipher, const char *ciphername)\n{\n    struct ssh_cipher_struct *ciphers = ssh_get_ciphertab();\n    int i, cmp;\n\n    for (i = 0; ciphers[i].name != NULL; i++) {\n        cmp = strcmp(ciphername, ciphers[i].name);\n        if (cmp == 0) {\n            memcpy(cipher, &ciphers[i], sizeof(*cipher));\n            return SSH_OK;\n        }\n    }\n\n    return SSH_ERROR;\n}\n\nstatic void *thread_crypto_aes256_cbc(void *threadid)\n{\n    uint8_t output[sizeof(cleartext)] = {0};\n    uint8_t iv[16] = {0};\n    struct ssh_cipher_struct cipher = {\n        .name = NULL,\n    };\n    int rc;\n\n    /* Unused */\n    (void) threadid;\n\n    rc = get_cipher(&cipher, \"aes256-cbc\");\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(cipher.set_encrypt_key);\n    assert_non_null(cipher.encrypt);\n\n    /* This is for dump static analizyer without modelling support */\n    if (cipher.set_encrypt_key == NULL ||\n        cipher.encrypt == NULL) {\n        return NULL;\n    }\n\n    memcpy(iv, IV, sizeof(IV));\n    cipher.set_encrypt_key(&cipher,\n            key,\n            iv\n    );\n\n    cipher.encrypt(&cipher,\n            cleartext,\n            output,\n            sizeof(cleartext)\n            );\n\n    assert_memory_equal(output,\n                        aes256_cbc_encrypted,\n                        sizeof(aes256_cbc_encrypted));\n    ssh_cipher_clear(&cipher);\n\n    rc = get_cipher(&cipher, \"aes256-cbc\");\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(cipher.set_encrypt_key);\n    assert_non_null(cipher.encrypt);\n\n    /* This is for dump static analizyer without modelling support */\n    if (cipher.set_encrypt_key == NULL ||\n        cipher.encrypt == NULL) {\n        return NULL;\n    }\n\n    memcpy(iv, IV, sizeof(IV));\n    cipher.set_decrypt_key(&cipher,\n            key,\n            iv\n    );\n\n    memset(output, '\\0', sizeof(output));\n    cipher.decrypt(&cipher,\n            aes256_cbc_encrypted,\n            output,\n            sizeof(aes256_cbc_encrypted)\n            );\n\n    assert_memory_equal(output, cleartext, sizeof(cleartext));\n\n    ssh_cipher_clear(&cipher);\n\n    pthread_exit(NULL);\n}\n\nstatic void torture_crypto_aes256_cbc(void **state)\n{\n    int rc;\n\n    /* Unused */\n    (void) state;\n\n    rc = run_on_threads(thread_crypto_aes256_cbc);\n    assert_int_equal(rc, 0);\n}\n\nint torture_run_tests(void)\n{\n    int rc;\n    const struct CMUnitTest tests[] = {\n        cmocka_unit_test(torture_crypto_aes256_cbc),\n    };\n\n    /*\n     * If the library is statically linked, ssh_init() is not called\n     * automatically\n     */\n    ssh_init();\n    rc = cmocka_run_group_tests(tests, NULL, NULL);\n    ssh_finalize();\n\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/unittests/torture_threads_init.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2018 by Anderson Toshiyuki Sasaki <ansasaki@redhat.com>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include \"torture.h\"\n#include \"libssh/libssh.h\"\n\n#include <pthread.h>\n\n#define NUM_THREADS 20\n\nstatic int run_on_threads(void *(*func)(void *))\n{\n    pthread_t threads[NUM_THREADS];\n    int rc;\n    int i;\n\n    for (i = 0; i < NUM_THREADS; ++i) {\n        rc = pthread_create(&threads[i], NULL, func, NULL);\n        assert_int_equal(rc, 0);\n    }\n\n    for (i = 0; i < NUM_THREADS; ++i) {\n        void *p = NULL;\n        uint64_t *result;\n\n        rc = pthread_join(threads[i], &p);\n        assert_int_equal(rc, 0);\n\n        result = (uint64_t *)p;\n        assert_null(result);\n    }\n\n    return rc;\n}\n\nstatic void *thread_ssh_init(UNUSED_PARAM(void *threadid))\n{\n    int rc;\n\n    (void) threadid;\n\n    rc = ssh_init();\n    assert_int_equal(rc, SSH_OK);\n\n    rc = ssh_finalize();\n    assert_int_equal(rc, SSH_OK);\n\n    pthread_exit(NULL);\n}\n\nstatic void torture_ssh_init(UNUSED_PARAM(void **state))\n{\n    int rc;\n\n    rc = run_on_threads(thread_ssh_init);\n    assert_int_equal(rc, 0);\n}\n\nint torture_run_tests(void)\n{\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test(torture_ssh_init),\n    };\n\n    /*\n     * If the library is statically linked, ssh_init() is not called\n     * automatically\n     */\n    ssh_init();\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, NULL, NULL);\n    ssh_finalize();\n\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/unittests/torture_threads_pki_rsa.c",
    "content": "/*\n * This file is part of the SSH Library\n *\n * Copyright (c) 2018 by Anderson Toshiyuki Sasaki <ansasaki@redhat.com>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include <sys/stat.h>\n#include <fcntl.h>\n\n#include \"torture.h\"\n#include \"torture_pki.h\"\n#include \"torture_key.h\"\n#include \"pki.c\"\n\n#include <pthread.h>\n\n#define LIBSSH_RSA_TESTKEY \"libssh_testkey.id_rsa\"\n#define LIBSSH_RSA_TESTKEY_PASSPHRASE \"libssh_testkey_passphrase.id_rsa\"\n\n#define NUM_THREADS 10\n\nconst char template[] = \"temp_dir_XXXXXX\";\nconst unsigned char RSA_HASH[] = \"12345678901234567890\";\n\nstruct pki_st {\n    char *cwd;\n    char *temp_dir;\n};\n\nstatic int run_on_threads(void *(*func)(void *))\n{\n    pthread_t threads[NUM_THREADS];\n    int rc;\n    int i;\n\n    for (i = 0; i < NUM_THREADS; ++i) {\n        rc = pthread_create(&threads[i], NULL, func, NULL);\n        assert_int_equal(rc, 0);\n    }\n\n    for (i = 0; i < NUM_THREADS; ++i) {\n        void *p = NULL;\n        uint64_t *result;\n\n        rc = pthread_join(threads[i], &p);\n        assert_int_equal(rc, 0);\n\n        result = (uint64_t *)p;\n        assert_null(result);\n    }\n\n    return rc;\n}\n\nstatic int setup_rsa_key(void **state)\n{\n    struct pki_st *test_state = NULL;\n    char *cwd = NULL;\n    char *tmp_dir = NULL;\n    int rc = 0;\n\n    test_state = (struct pki_st *)malloc(sizeof(struct pki_st));\n    assert_non_null(test_state);\n\n    cwd = torture_get_current_working_dir();\n    assert_non_null(cwd);\n\n    tmp_dir = torture_make_temp_dir(template);\n    assert_non_null(tmp_dir);\n\n    test_state->cwd = cwd;\n    test_state->temp_dir = tmp_dir;\n\n    *state = test_state;\n\n    rc = torture_change_dir(tmp_dir);\n    assert_int_equal(rc, 0);\n\n    printf(\"Changed directory to: %s\\n\", tmp_dir);\n\n    torture_write_file(LIBSSH_RSA_TESTKEY,\n                       torture_get_testkey(SSH_KEYTYPE_RSA, 0));\n    torture_write_file(LIBSSH_RSA_TESTKEY_PASSPHRASE,\n                       torture_get_testkey(SSH_KEYTYPE_RSA, 1));\n    torture_write_file(LIBSSH_RSA_TESTKEY \".pub\",\n                       torture_get_testkey_pub(SSH_KEYTYPE_RSA));\n    torture_write_file(LIBSSH_RSA_TESTKEY \"-cert.pub\",\n                       torture_get_testkey_pub(SSH_KEYTYPE_RSA_CERT01));\n\n    return 0;\n}\n\nstatic int teardown(void **state) {\n\n    struct pki_st *test_state = NULL;\n    int rc = 0;\n\n    test_state = *((struct pki_st **)state);\n\n    assert_non_null(test_state);\n    assert_non_null(test_state->cwd);\n    assert_non_null(test_state->temp_dir);\n\n    rc = torture_change_dir(test_state->cwd);\n    assert_int_equal(rc, 0);\n\n    rc = torture_rmdirs(test_state->temp_dir);\n    assert_int_equal(rc, 0);\n\n    SAFE_FREE(test_state->temp_dir);\n    SAFE_FREE(test_state->cwd);\n    SAFE_FREE(test_state);\n\n    return 0;\n}\n\nstatic int disable_secmem(void **state)\n{\n    (void) state; /*unused*/\n\n#if defined(HAVE_LIBGCRYPT)\n    /* gcrypt currently is configured to use only 4kB of locked secmem\n     * (see ssh_crypto_init() in src/libcrypt.c)\n     *\n     * This is insufficient to run the RSA key generation in many threads.\n     * To avoid the expected warning, disable the secure memory.\n     * */\n\n    gcry_control (GCRYCTL_SUSPEND_SECMEM_WARN);\n    gcry_control(GCRYCTL_DISABLE_SECMEM);\n#endif\n\n    return 0;\n}\n\nstatic int enable_secmem(void **state)\n{\n    (void) state; /*unused*/\n\n#if defined(HAVE_LIBGCRYPT)\n    /* Re-enable secmem */\n    gcry_control(GCRYCTL_INIT_SECMEM, 4096);\n    gcry_control(GCRYCTL_RESUME_SECMEM_WARN);\n#endif\n    return 0;\n}\n\nstatic void *thread_pki_rsa_import_pubkey_file(void *threadid)\n{\n    ssh_key pubkey = NULL;\n    int rc;\n\n    (void) threadid;\n\n    /* The key doesn't have the hostname as comment after the key */\n    rc = ssh_pki_import_pubkey_file(LIBSSH_RSA_TESTKEY \".pub\", &pubkey);\n    assert_return_code(rc, errno);\n    assert_non_null(pubkey);\n\n    SSH_KEY_FREE(pubkey);\n\n    pthread_exit(NULL);\n}\n\nstatic void torture_pki_rsa_import_pubkey_file(void **state)\n{\n    int rc;\n\n    /* Unused */\n    (void) state;\n\n    rc = run_on_threads(thread_pki_rsa_import_pubkey_file);\n    assert_int_equal(rc, 0);\n}\n\n\nstatic void *thread_pki_rsa_import_privkey_base64_NULL_key(void *threadid)\n{\n    int rc;\n    const char *passphrase = torture_get_testkey_passphrase();\n    const char *testkey;\n\n    (void) threadid; /* unused */\n\n    testkey = torture_get_testkey(SSH_KEYTYPE_RSA, 0);\n    assert_non_null(testkey);\n\n    /* test if it returns -1 if key is NULL */\n    rc = ssh_pki_import_privkey_base64(testkey,\n                                       passphrase,\n                                       NULL,\n                                       NULL,\n                                       NULL);\n    assert_true(rc == -1);\n\n    pthread_exit(NULL);\n}\n\nstatic void torture_pki_rsa_import_privkey_base64_NULL_key(void **state){\n    int rc;\n\n    /* Unused */\n    (void) state;\n\n    rc = run_on_threads(thread_pki_rsa_import_privkey_base64_NULL_key);\n    assert_int_equal(rc, 0);\n}\n\n\nstatic void *thread_pki_rsa_import_privkey_base64_NULL_str(void *threadid)\n{\n    int rc;\n    ssh_key key = NULL;\n    const char *passphrase = torture_get_testkey_passphrase();\n\n    (void) threadid; /* unused */\n\n    /* test if it returns -1 if key_str is NULL */\n    rc = ssh_pki_import_privkey_base64(NULL, passphrase, NULL, NULL, &key);\n    assert_true(rc == -1);\n\n    SSH_KEY_FREE(key);\n    pthread_exit(NULL);\n}\n\nstatic void torture_pki_rsa_import_privkey_base64_NULL_str(void **state){\n    int rc;\n\n    /* Unused */\n    (void) state;\n\n    rc = run_on_threads(thread_pki_rsa_import_privkey_base64_NULL_str);\n    assert_int_equal(rc, 0);\n}\n\nstatic void *thread_pki_rsa_import_privkey_base64(void *threadid)\n{\n    const char *passphrase = torture_get_testkey_passphrase();\n    char *key_str = NULL;\n    ssh_key key = NULL;\n    enum ssh_keytypes_e type;\n    int ok;\n    int rc;\n\n    (void) threadid; /* unused */\n\n    key_str = torture_pki_read_file(LIBSSH_RSA_TESTKEY);\n    assert_non_null(key_str);\n\n    rc = ssh_pki_import_privkey_base64(key_str, passphrase, NULL, NULL, &key);\n    assert_true(rc == 0);\n\n    type = ssh_key_type(key);\n    assert_true(type == SSH_KEYTYPE_RSA);\n\n    ok = ssh_key_is_private(key);\n    assert_true(ok);\n\n    ok = ssh_key_is_public(key);\n    assert_true(ok);\n\n    free(key_str);\n    SSH_KEY_FREE(key);\n\n    pthread_exit(NULL);\n}\n\nstatic void torture_pki_rsa_import_privkey_base64(void **state)\n{\n    int rc;\n\n    /* Unused */\n    (void) state;\n\n    rc = run_on_threads(thread_pki_rsa_import_privkey_base64);\n    assert_int_equal(rc, 0);\n}\n\nstatic void *thread_pki_rsa_publickey_from_privatekey(void *threadid)\n{\n    const char *passphrase = NULL;\n    const char *testkey;\n    ssh_key pubkey = NULL;\n    ssh_key key = NULL;\n    int rc;\n    int ok;\n\n    (void) threadid; /* unused */\n\n    testkey = torture_get_testkey(SSH_KEYTYPE_RSA, 0);\n    rc = ssh_pki_import_privkey_base64(testkey,\n                                       passphrase,\n                                       NULL,\n                                       NULL,\n                                       &key);\n    assert_true(rc == 0);\n    assert_non_null(key);\n\n    ok = ssh_key_is_private(key);\n    assert_true(ok);\n\n    rc = ssh_pki_export_privkey_to_pubkey(key, &pubkey);\n    assert_true(rc == SSH_OK);\n    assert_non_null(pubkey);\n\n    SSH_KEY_FREE(key);\n    SSH_KEY_FREE(pubkey);\n    pthread_exit(NULL);\n}\n\nstatic void torture_pki_rsa_publickey_from_privatekey(void **state)\n{\n    int rc;\n\n    /* Unused */\n    (void) state;\n\n    rc = run_on_threads(thread_pki_rsa_publickey_from_privatekey);\n    assert_int_equal(rc, 0);\n}\n\nstatic void *thread_pki_rsa_copy_cert_to_privkey(void *threadid)\n{\n    /*\n     * Tests copying a cert loaded into a public key to a private key.\n     * The function is encryption type agnostic, no need to run this against\n     * all supported key types.\n     */\n    const char *passphrase = torture_get_testkey_passphrase();\n    const char *testkey = NULL;\n    ssh_key pubkey = NULL;\n    ssh_key privkey = NULL;\n    ssh_key cert = NULL;\n    int rc;\n\n    (void) threadid; /* unused */\n\n    rc = ssh_pki_import_cert_file(LIBSSH_RSA_TESTKEY \"-cert.pub\", &cert);\n    assert_true(rc == SSH_OK);\n    assert_non_null(cert);\n\n    rc = ssh_pki_import_pubkey_file(LIBSSH_RSA_TESTKEY \".pub\", &pubkey);\n    assert_true(rc == SSH_OK);\n    assert_non_null(pubkey);\n\n    testkey = torture_get_testkey(SSH_KEYTYPE_RSA, 0);\n    assert_non_null(testkey);\n\n    rc = ssh_pki_import_privkey_base64(testkey,\n                                       passphrase,\n                                       NULL,\n                                       NULL,\n                                       &privkey);\n    assert_true(rc == SSH_OK);\n    assert_non_null(privkey);\n\n    /* Basic sanity. */\n    rc = ssh_pki_copy_cert_to_privkey(NULL, privkey);\n    assert_true(rc == SSH_ERROR);\n\n    rc = ssh_pki_copy_cert_to_privkey(pubkey, NULL);\n    assert_true(rc == SSH_ERROR);\n\n    /* A public key doesn't have a cert, copy should fail. */\n    rc = ssh_pki_copy_cert_to_privkey(pubkey, privkey);\n    assert_true(rc == SSH_ERROR);\n\n    /* Copying the cert to non-cert keys should work fine. */\n    rc = ssh_pki_copy_cert_to_privkey(cert, pubkey);\n    assert_true(rc == SSH_OK);\n    rc = ssh_pki_copy_cert_to_privkey(cert, privkey);\n    assert_true(rc == SSH_OK);\n\n    /* The private key's cert is already set, another copy should fail. */\n    rc = ssh_pki_copy_cert_to_privkey(cert, privkey);\n    assert_true(rc == SSH_ERROR);\n\n    SSH_KEY_FREE(cert);\n    SSH_KEY_FREE(privkey);\n    SSH_KEY_FREE(pubkey);\n    pthread_exit(NULL);\n}\n\nstatic void torture_pki_rsa_copy_cert_to_privkey(void **state)\n{\n    int rc;\n\n    /* Unused */\n    (void) state;\n\n    rc = run_on_threads(thread_pki_rsa_copy_cert_to_privkey);\n    assert_int_equal(rc, 0);\n}\n\nstatic void *thread_pki_rsa_import_cert_file(void *threadid)\n{\n    int rc;\n    ssh_key cert = NULL;\n    enum ssh_keytypes_e type;\n\n    (void) threadid; /* unused */\n\n    rc = ssh_pki_import_cert_file(LIBSSH_RSA_TESTKEY \"-cert.pub\", &cert);\n    assert_true(rc == 0);\n    assert_non_null(cert);\n\n    type = ssh_key_type(cert);\n    assert_true(type == SSH_KEYTYPE_RSA_CERT01);\n\n    rc = ssh_key_is_public(cert);\n    assert_true(rc == 1);\n\n    SSH_KEY_FREE(cert);\n    pthread_exit(NULL);\n}\n\nstatic void torture_pki_rsa_import_cert_file(void **state)\n{\n    int rc;\n\n    /* Unused */\n    (void) state;\n\n    rc = run_on_threads(thread_pki_rsa_import_cert_file);\n    assert_int_equal(rc, 0);\n}\n\nstatic void *thread_pki_rsa_publickey_base64(void *threadid)\n{\n    enum ssh_keytypes_e type;\n    char *b64_key = NULL, *key_buf = NULL, *p = NULL;\n    const char *q = NULL;\n    ssh_key key;\n    int rc;\n\n    (void) threadid; /* unused */\n\n    key_buf = strdup(torture_get_testkey_pub(SSH_KEYTYPE_RSA));\n    assert_non_null(key_buf);\n\n    q = p = key_buf;\n    while (*p != ' ') p++;\n    *p = '\\0';\n\n    type = ssh_key_type_from_name(q);\n    assert_true(type == SSH_KEYTYPE_RSA);\n\n    q = ++p;\n    while (*p != ' ') p++;\n    *p = '\\0';\n\n    rc = ssh_pki_import_pubkey_base64(q, type, &key);\n    assert_true(rc == 0);\n    assert_non_null(key);\n\n    rc = ssh_pki_export_pubkey_base64(key, &b64_key);\n    assert_true(rc == 0);\n    assert_non_null(b64_key);\n\n    assert_string_equal(q, b64_key);\n\n    free(b64_key);\n    free(key_buf);\n    SSH_KEY_FREE(key);\n    pthread_exit(NULL);\n}\n\nstatic void torture_pki_rsa_publickey_base64(void **state)\n{\n    int rc;\n\n    /* Unused */\n    (void) state;\n\n    rc = run_on_threads(thread_pki_rsa_publickey_base64);\n    assert_int_equal(rc, 0);\n}\n\nstatic void *thread_pki_rsa_duplicate_key(void *threadid)\n{\n    char *b64_key = NULL;\n    char *b64_key_gen = NULL;\n    ssh_key pubkey = NULL;\n    ssh_key privkey = NULL;\n    ssh_key privkey_dup = NULL;\n    int cmp;\n    int rc;\n\n    (void) threadid;\n\n    rc = ssh_pki_import_pubkey_file(LIBSSH_RSA_TESTKEY \".pub\", &pubkey);\n    assert_true(rc == 0);\n    assert_non_null(pubkey);\n\n    rc = ssh_pki_export_pubkey_base64(pubkey, &b64_key);\n    assert_true(rc == 0);\n    SSH_KEY_FREE(pubkey);\n    assert_non_null(b64_key);\n\n    rc = ssh_pki_import_privkey_file(LIBSSH_RSA_TESTKEY,\n                                     NULL,\n                                     NULL,\n                                     NULL,\n                                     &privkey);\n    assert_true(rc == 0);\n    assert_non_null(privkey);\n\n    privkey_dup = ssh_key_dup(privkey);\n    assert_non_null(privkey_dup);\n\n    rc = ssh_pki_export_privkey_to_pubkey(privkey, &pubkey);\n    assert_true(rc == SSH_OK);\n    assert_non_null(pubkey);\n\n    rc = ssh_pki_export_pubkey_base64(pubkey, &b64_key_gen);\n    assert_true(rc == 0);\n    assert_non_null(b64_key_gen);\n\n    assert_string_equal(b64_key, b64_key_gen);\n\n    cmp = ssh_key_cmp(privkey, privkey_dup, SSH_KEY_CMP_PRIVATE);\n    assert_true(cmp == 0);\n\n    SSH_KEY_FREE(pubkey);\n    SSH_KEY_FREE(privkey);\n    SSH_KEY_FREE(privkey_dup);\n    SSH_STRING_FREE_CHAR(b64_key);\n    SSH_STRING_FREE_CHAR(b64_key_gen);\n    pthread_exit(NULL);\n}\n\nstatic void torture_pki_rsa_duplicate_key(void **state)\n{\n    int rc;\n\n    /* Unused */\n    (void) state;\n\n    rc = run_on_threads(thread_pki_rsa_duplicate_key);\n    assert_int_equal(rc, 0);\n}\n\nstatic void *thread_pki_rsa_generate_key(void *threadid)\n{\n    int rc;\n    ssh_key key = NULL, pubkey = NULL;\n    ssh_signature sign = NULL;\n    ssh_session session = NULL;\n\n    (void) threadid;\n\n    session = ssh_new();\n    assert_non_null(session);\n\n    if (!ssh_fips_mode()) {\n        rc = ssh_pki_generate(SSH_KEYTYPE_RSA, 1024, &key);\n        assert_ssh_return_code(session, rc);\n        assert_non_null(key);\n\n        rc = ssh_pki_export_privkey_to_pubkey(key, &pubkey);\n        assert_int_equal(rc, SSH_OK);\n        assert_non_null(pubkey);\n\n        sign = pki_do_sign(key, RSA_HASH, 20, SSH_DIGEST_SHA256);\n        assert_non_null(sign);\n\n        rc = ssh_pki_signature_verify(session, sign, pubkey, RSA_HASH, 20);\n        assert_ssh_return_code(session, rc);\n\n        ssh_signature_free(sign);\n        SSH_KEY_FREE(key);\n        SSH_KEY_FREE(pubkey);\n    }\n\n    rc = ssh_pki_generate(SSH_KEYTYPE_RSA, 2048, &key);\n    assert_ssh_return_code(session, rc);\n    assert_non_null(key);\n\n    rc = ssh_pki_export_privkey_to_pubkey(key, &pubkey);\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(pubkey);\n\n    sign = pki_do_sign(key, RSA_HASH, 20, SSH_DIGEST_SHA256);\n    assert_non_null(sign);\n\n    rc = ssh_pki_signature_verify(session, sign, pubkey, RSA_HASH, 20);\n    assert_ssh_return_code(session, rc);\n\n    ssh_signature_free(sign);\n    SSH_KEY_FREE(key);\n    SSH_KEY_FREE(pubkey);\n\n    rc = ssh_pki_generate(SSH_KEYTYPE_RSA, 4096, &key);\n    assert_true(rc == SSH_OK);\n    assert_non_null(key);\n\n    rc = ssh_pki_export_privkey_to_pubkey(key, &pubkey);\n    assert_int_equal(rc, SSH_OK);\n    assert_non_null(pubkey);\n\n    sign = pki_do_sign(key, RSA_HASH, 20, SSH_DIGEST_SHA256);\n    assert_non_null(sign);\n\n    rc = ssh_pki_signature_verify(session, sign, pubkey, RSA_HASH, 20);\n    assert_true(rc == SSH_OK);\n\n    ssh_signature_free(sign);\n    SSH_KEY_FREE(key);\n    SSH_KEY_FREE(pubkey);\n\n    ssh_free(session);\n    pthread_exit(NULL);\n}\n\nstatic void torture_pki_rsa_generate_key(void **state)\n{\n    int rc;\n\n    /* Unused */\n    (void) state;\n\n    rc = run_on_threads(thread_pki_rsa_generate_key);\n    assert_int_equal(rc, 0);\n}\n\nstatic void *thread_pki_rsa_import_privkey_base64_passphrase(void *threadid)\n{\n    int rc;\n    ssh_key key = NULL;\n    const char *passphrase = torture_get_testkey_passphrase();\n    const char *testkey;\n\n    (void) threadid; /* unused */\n\n    testkey = torture_get_testkey(SSH_KEYTYPE_RSA, 1);\n    assert_non_null(testkey);\n\n    rc = ssh_pki_import_privkey_base64(testkey,\n                                       passphrase,\n                                       NULL,\n                                       NULL,\n                                       &key);\n    assert_return_code(rc, errno);\n\n    rc = ssh_key_is_private(key);\n    assert_true(rc == 1);\n\n    SSH_KEY_FREE(key);\n\n    /* test if it returns -1 if passphrase is wrong */\n    rc = ssh_pki_import_privkey_base64(testkey,\n                                       \"wrong passphrase !!\",\n                                       NULL,\n                                       NULL,\n                                       &key);\n    assert_true(rc == -1);\n    SSH_KEY_FREE(key);\n\n#ifndef HAVE_LIBCRYPTO\n    /* test if it returns -1 if passphrase is NULL */\n    /* libcrypto asks for a passphrase, so skip this test */\n    rc = ssh_pki_import_privkey_base64(testkey,\n                                       NULL,\n                                       NULL,\n                                       NULL,\n                                       &key);\n    assert_true(rc == -1);\n    SSH_KEY_FREE(key);\n#endif\n    pthread_exit(NULL);\n}\n\nstatic void torture_pki_rsa_import_privkey_base64_passphrase(void **state)\n{\n    int rc;\n\n    /* Unused */\n    (void) state;\n\n    rc = run_on_threads(thread_pki_rsa_import_privkey_base64_passphrase);\n    assert_int_equal(rc, 0);\n}\n\n#define NUM_TESTS 11\n\nstatic void torture_mixed(void **state)\n{\n    pthread_t threads[NUM_TESTS][NUM_THREADS];\n\n    int i;\n    int f;\n    int rc;\n\n    /* Array of functions to run on threads */\n    static void *(*funcs[NUM_TESTS])(void *) = {\n        thread_pki_rsa_import_pubkey_file,\n        thread_pki_rsa_import_privkey_base64_NULL_key,\n        thread_pki_rsa_import_privkey_base64_NULL_str,\n        thread_pki_rsa_import_privkey_base64,\n        thread_pki_rsa_publickey_from_privatekey,\n        thread_pki_rsa_import_privkey_base64_passphrase,\n        thread_pki_rsa_copy_cert_to_privkey,\n        thread_pki_rsa_import_cert_file,\n        thread_pki_rsa_publickey_base64,\n        thread_pki_rsa_duplicate_key,\n        thread_pki_rsa_generate_key,\n    };\n\n    (void) state;\n\n    /* Call tests in a round-robin fashion */\n    for (i = 0; i < NUM_THREADS; ++i) {\n        for (f = 0; f < NUM_TESTS; f++) {\n            rc = pthread_create(&threads[f][i], NULL, funcs[f], NULL);\n            assert_int_equal(rc, 0);\n        }\n    }\n\n    for (f = 0; f < NUM_TESTS; f++) {\n        for (i = 0; i < NUM_THREADS; ++i) {\n            void *p = NULL;\n            uint64_t *result = NULL;\n\n            rc = pthread_join(threads[f][i], &p);\n            assert_int_equal(rc, 0);\n\n            result = (uint64_t *)p;\n            assert_null(result);\n        }\n    }\n}\n\nint torture_run_tests(void)\n{\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test_setup_teardown(torture_pki_rsa_import_pubkey_file,\n                                        setup_rsa_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_rsa_import_privkey_base64_NULL_key,\n                                        setup_rsa_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_rsa_import_privkey_base64_NULL_str,\n                                        setup_rsa_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_rsa_import_privkey_base64,\n                                        setup_rsa_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_rsa_publickey_from_privatekey,\n                                        setup_rsa_key,\n                                        teardown),\n        cmocka_unit_test(torture_pki_rsa_import_privkey_base64_passphrase),\n        cmocka_unit_test_setup_teardown(torture_pki_rsa_copy_cert_to_privkey,\n                                        setup_rsa_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_rsa_import_cert_file,\n                                        setup_rsa_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_rsa_publickey_base64,\n                                        setup_rsa_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_rsa_duplicate_key,\n                                        setup_rsa_key,\n                                        teardown),\n        cmocka_unit_test_setup_teardown(torture_pki_rsa_generate_key,\n                                        disable_secmem,\n                                        enable_secmem),\n        cmocka_unit_test_setup_teardown(torture_mixed,\n                                        setup_rsa_key,\n                                        teardown),\n    };\n\n    /*\n     * Not testing:\n     *  - pki_rsa_generate_pubkey_from_privkey\n     *  - pki_rsa_write_privkey\n     *\n     * The original tests in torture_pki_rsa.c require files to be erased\n     */\n\n    /*\n     * If the library is statically linked, ssh_init() is not called\n     * automatically\n     */\n    ssh_init();\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, NULL, NULL);\n    ssh_finalize();\n\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/unittests/torture_tokens.c",
    "content": "/*\n * torture_tokens.c - Tests for tokens list handling\n *\n * This file is part of the SSH Library\n *\n * Copyright (c) 2019 by Red Hat, Inc.\n *\n * Author: Anderson Toshiyuki Sasaki <ansasaki@redhat.com>\n *\n * The SSH Library is free software; you can redistribute it and/or modify\n * it under the terms of the GNU Lesser General Public License as published by\n * the Free Software Foundation; either version 2.1 of the License, or (at your\n * option) any later version.\n *\n * The SSH Library is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public\n * License for more details.\n *\n * You should have received a copy of the GNU Lesser General Public License\n * along with the SSH Library; see the file COPYING.  If not, write to\n * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,\n * MA 02111-1307, USA.\n */\n\n#include \"config.h\"\n\n#define LIBSSH_STATIC\n\n#include \"torture.h\"\n#include \"libssh/token.h\"\n#include \"libssh/priv.h\"\n\nstatic void torture_find_matching(UNUSED_PARAM(void **state))\n{\n    char *matching;\n\n    /* Match with single token */\n    matching = ssh_find_matching(\"a,b,c\", \"b\");\n    assert_non_null(matching);\n    assert_string_equal(matching, \"b\");\n    SAFE_FREE(matching);\n\n    /* Match sequence, get first preferred */\n    matching = ssh_find_matching(\"a,b,c\", \"b,c\");\n    assert_non_null(matching);\n    assert_string_equal(matching, \"b\");\n    SAFE_FREE(matching);\n\n    /* Only one token allowed */\n    matching = ssh_find_matching(\"c\", \"a,b,c\");\n    assert_non_null(matching);\n    assert_string_equal(matching, \"c\");\n    SAFE_FREE(matching);\n\n    /* Different order in allowed and preferred; gets preferred */\n    matching = ssh_find_matching(\"c,b,a\", \"a,b,c\");\n    assert_non_null(matching);\n    assert_string_equal(matching, \"a\");\n    SAFE_FREE(matching);\n\n    /* No matching returns NULL */\n    matching = ssh_find_matching(\"c,b,a\", \"d,e,f\");\n    assert_null(matching);\n}\n\nstatic void torture_find_all_matching(UNUSED_PARAM(void **state))\n{\n    char *matching;\n\n    /* Match with single token */\n    matching = ssh_find_all_matching(\"a,b,c\", \"b\");\n    assert_non_null(matching);\n    assert_string_equal(matching, \"b\");\n    SAFE_FREE(matching);\n\n    /* Match sequence, get first preferred */\n    matching = ssh_find_all_matching(\"a,b,c\", \"b,c\");\n    assert_non_null(matching);\n    assert_string_equal(matching, \"b,c\");\n    SAFE_FREE(matching);\n\n    /* Only one token allowed */\n    matching = ssh_find_all_matching(\"c\", \"a,b,c\");\n    assert_non_null(matching);\n    assert_string_equal(matching, \"c\");\n    SAFE_FREE(matching);\n\n    /* Different order in allowed and preferred; gets preferred */\n    matching = ssh_find_all_matching(\"c,b,a\", \"a,c,b\");\n    assert_non_null(matching);\n    assert_string_equal(matching, \"a,c,b\");\n    SAFE_FREE(matching);\n\n    /* No matching returns NULL */\n    matching = ssh_find_all_matching(\"c,b,a\", \"d,e,f\");\n    assert_null(matching);\n}\n\nstatic void tokenize_compare_expected(const char *chain, const char **expected,\n                                     size_t num_expected)\n{\n    struct ssh_tokens_st *tokens;\n    size_t i;\n\n    tokens = ssh_tokenize(chain, ',');\n    assert_non_null(tokens);\n\n    if (expected != NULL) {\n        assert_non_null(tokens->tokens);\n        for (i = 0; i < num_expected; i++) {\n            assert_non_null(tokens->tokens[i]);\n            assert_non_null(expected[i]);\n            assert_string_equal(tokens->tokens[i], expected[i]);\n        }\n\n        assert_null(tokens->tokens[i]);\n\n        i = 0;\n        printf(\"Tokenizing \\\"%s\\\" resulted in: \", chain);\n        while (tokens->tokens[i]) {\n            printf(\"\\\"%s\\\" \", tokens->tokens[i++]);\n        }\n        printf(\"\\n\");\n    }\n\n    ssh_tokens_free(tokens);\n}\n\nstatic void torture_tokens_sanity(UNUSED_PARAM(void **state))\n{\n    const char *simple[] = {\"a\", \"b\", \"c\"};\n    const char *colon_first[] = {\"\", \"a\", \"b\", \"c\"};\n    const char *colon_end[] = {\"a\", \"b\", \"c\"};\n    const char *colon_both[] = {\"\", \"a\", \"b\", \"c\"};\n    const char *single[] = {\"abc\"};\n    const char *empty[] = {\"\"};\n    const char *single_colon[] = {\"\"};\n\n    tokenize_compare_expected(\"a,b,c\", simple, 3);\n    tokenize_compare_expected(\",a,b,c\", colon_first, 4);\n    tokenize_compare_expected(\"a,b,c,\", colon_end, 3);\n    tokenize_compare_expected(\",a,b,c,\", colon_both, 4);\n    tokenize_compare_expected(\"abc\", single, 1);\n    tokenize_compare_expected(\"\", empty, 1);\n    tokenize_compare_expected(\",\", single_colon, 1);\n}\n\nstatic void torture_remove_duplicate(UNUSED_PARAM(void **state))\n{\n\n    const char *simple[] = {\"a,a,b,b,c,c\",\n                            \"a,b,c,a,b,c\",\n                            \"a,b,c,c,b,a\",\n                            \"a,a,,b,b,,c,c\",\n                            \",a,a,b,b,c,c\",\n                            \"a,a,b,b,c,c,\"};\n    const char *empty[] = {\"\",\n                           \",,,,,,,,,\",\n                           NULL};\n    char *ret = NULL;\n    int i;\n\n    for (i = 0; i < 6; i++) {\n        ret = ssh_remove_duplicates(simple[i]);\n        assert_non_null(ret);\n        assert_string_equal(\"a,b,c\", ret);\n        printf(\"simple[%d] resulted in '%s'\\n\", i, ret);\n        SAFE_FREE(ret);\n    }\n\n    for (i = 0; i < 3; i++) {\n        ret = ssh_remove_duplicates(empty[i]);\n        if (ret != NULL) {\n            printf(\"empty[%d] resulted in '%s'\\n\", i, ret);\n        }\n        assert_null(ret);\n    }\n\n    ret = ssh_remove_duplicates(\"a\");\n    assert_non_null(ret);\n    assert_string_equal(\"a\", ret);\n    SAFE_FREE(ret);\n}\n\nstatic void torture_append_without_duplicate(UNUSED_PARAM(void **state))\n{\n    const char *s1[] = {\"a,a,b,b,c,c\",\n                        \"a,b,c,a,b,c\",\n                        \"a,b,c,c,b,a\",\n                        \"a,a,,b,b,,c,c\",\n                        \",a,a,b,b,c,c\",\n                        \"a,a,b,b,c,c,\"};\n    const char *s2[] = {\"a,a,b,b,c,c,d,d\",\n                        \"a,b,c,d,a,b,c,d\",\n                        \"a,b,c,d,d,c,b,a\",\n                        \"a,a,,b,b,,c,c,,d,d\",\n                        \",a,a,b,b,c,c,d,d\",\n                        \"a,a,b,b,c,c,d,d,\",\n                        \"d\"};\n    const char *empty[] = {\"\",\n                           \",,,,,,,,,\",\n                           NULL,\n                           NULL};\n    char *ret = NULL;\n    int i, j;\n\n    ret = ssh_append_without_duplicates(\"a\", \"a\");\n    assert_non_null(ret);\n    assert_string_equal(\"a\", ret);\n    SAFE_FREE(ret);\n\n    ret = ssh_append_without_duplicates(\"a\", \"b\");\n    assert_non_null(ret);\n    assert_string_equal(\"a,b\", ret);\n    SAFE_FREE(ret);\n\n    ret = ssh_append_without_duplicates(\"a\", NULL);\n    assert_non_null(ret);\n    assert_string_equal(\"a\", ret);\n    SAFE_FREE(ret);\n\n    ret = ssh_append_without_duplicates(NULL, \"b\");\n    assert_non_null(ret);\n    assert_string_equal(\"b\", ret);\n    SAFE_FREE(ret);\n\n    for (i = 0; i < 6; i++) {\n        for (j = 0; j < 7; j++) {\n            ret = ssh_append_without_duplicates(s1[i], s2[j]);\n            assert_non_null(ret);\n            printf(\"s1[%d] + s2[%d] resulted in '%s'\\n\", i, j, ret);\n            assert_string_equal(\"a,b,c,d\", ret);\n            SAFE_FREE(ret);\n        }\n    }\n\n    for (i = 0; i < 6; i++) {\n        for (j = 0; j < 3; j++) {\n            ret = ssh_append_without_duplicates(s1[i], empty[j]);\n            assert_non_null(ret);\n            printf(\"s1[%d] + empty[%d] resulted in '%s'\\n\", i, j, ret);\n            assert_string_equal(\"a,b,c\", ret);\n            SAFE_FREE(ret);\n        }\n    }\n\n    for (i = 0; i < 3; i++) {\n        for (j = 0; j < 6; j++) {\n            ret = ssh_append_without_duplicates(empty[i], s1[j]);\n            assert_non_null(ret);\n            printf(\"empty[%d] + s1[%d] resulted in '%s'\\n\", i, j, ret);\n            assert_string_equal(\"a,b,c\", ret);\n            SAFE_FREE(ret);\n        }\n    }\n    for (i = 0; i < 4; i++) {\n        for (j = 0; j < 4; j++) {\n            ret = ssh_append_without_duplicates(empty[i], empty[j]);\n            if (ret != NULL) {\n                printf(\"empty[%d] + empty[%d] resulted in '%s'\\n\", i, j, ret);\n            }\n            assert_null(ret);\n        }\n    }\n}\n\n\nint torture_run_tests(void)\n{\n    int rc;\n    struct CMUnitTest tests[] = {\n        cmocka_unit_test(torture_tokens_sanity),\n        cmocka_unit_test(torture_find_matching),\n        cmocka_unit_test(torture_find_all_matching),\n        cmocka_unit_test(torture_remove_duplicate),\n        cmocka_unit_test(torture_append_without_duplicate),\n    };\n\n    ssh_init();\n    torture_filter_tests(tests);\n    rc = cmocka_run_group_tests(tests, NULL, NULL);\n    ssh_finalize();\n    return rc;\n}\n"
  },
  {
    "path": "src/libssh/tests/valgrind.supp",
    "content": "### GLIBC\n{\n   glibc_regcomp\n   Memcheck:Leak\n   fun:*alloc\n   ...\n   fun:regcomp\n}\n{\n   glibc_getaddrinfo_leak\n   Memcheck:Leak\n   fun:malloc\n   fun:make_request\n   fun:__check_pf\n   fun:getaddrinfo\n   fun:getai\n   fun:ssh_connect_host_nonblocking\n}\n\n{\n   glibc_dlopen_getdelim_selinux\n   Memcheck:Leak\n   fun:malloc\n   fun:getdelim\n   obj:/lib64/libselinux.so.1\n   fun:call_init\n   fun:_dl_init\n   obj:/lib64/ld-2.15.so\n}\n\n{\n   glibc_dlopen_alloc\n   Memcheck:Leak\n   fun:calloc\n   fun:_dlerror_run\n   fun:dlopen@@GLIBC_2.2.5\n}\n\n### VALGRIND\n{\n    valgrind_exit_free_bug\n    Memcheck:Free\n    fun:free\n    fun:__libc_freeres\n    fun:_vgnU_freeres\n    fun:__run_exit_handlers\n    fun:exit\n}\n\n\n### OPENSSL\n{\n   openssl_crypto_value8\n   Memcheck:Value8\n   fun:*\n   obj:/lib*/libcrypto.so*\n}\n\n{\n   openssl_crypto_value4\n   Memcheck:Value4\n   fun:*\n   obj:/lib*/libcrypto.so*\n}\n\n{\n   openssl_crypto_cond\n   Memcheck:Cond\n   fun:*\n   obj:/lib*/libcrypto.so*\n}\n\n{\n   openssl_BN_cond\n   Memcheck:Cond\n   fun:BN_*\n}\n\n{\n   openssl_bn_value8\n   Memcheck:Value8\n   fun:bn_*\n}\n\n{\n   openssl_bn_value4\n   Memcheck:Value4\n   fun:bn_*\n}\n\n{\n   openssl_AES_cond\n   Memcheck:Cond\n   fun:AES_*\n}\n\n{\n   openssl_DES_cond\n   Memcheck:Cond\n   fun:DES_*\n}\n\n{\n   openssl_DES_value8\n   Memcheck:Value8\n   fun:DES_*\n}\n\n{\n   openssl_DES_value4\n   Memcheck:Value4\n   fun:DES_*\n}\n\n{\n   openssl_BF_cond\n   Memcheck:Cond\n   fun:BF_*\n}\n\n{\n   openssl_SHA1_cond\n   Memcheck:Cond\n   fun:SHA1_*\n}\n\n{\n   openssl_CRYPTO_leak\n   Memcheck:Leak\n   fun:*alloc\n   fun:CRYPTO_*\n}\n{\n   openssl_CRYPTO_leak\n   Memcheck:Cond\n   fun:OPENSSL_cleanse\n}\n{\n   openssl_FIPS_dlopen_leak\n   Memcheck:Leak\n   match-leak-kinds: reachable\n   fun:calloc\n   fun:_dlerror_run\n   fun:dlopen*\n   obj:/lib64/libcrypto.so*\n   fun:FIPS_module_mode_set\n   fun:FIPS_mode_set\n   fun:OPENSSL_init_library\n}\n"
  }
]